LyoKICogQXV0aG9yczoKICogQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkgUm9iZXJ0IE9sc3NvbiA8cm9iZXJ0Lm9sc3NvbkBpdHMudXUuc2U+CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcHBzYWxhIFVuaXZlcnNpdHkgYW5kCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2VkaXNoIFVuaXZlcnNpdHkgb2YgQWdyaWN1bHR1cmFsIFNjaWVuY2VzCiAqCiAqIEFsZXhleSBLdXpuZXRzb3YgIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KICogQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqIEplbnMgTOXlcyA8amVucy5sYWFzQGRhdGEuc2x1LnNlPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKgogKiBBIHRvb2wgZm9yIGxvYWRpbmcgdGhlIG5ldHdvcmsgd2l0aCBwcmVjb25maWd1cmF0ZWQgcGFja2V0cy4KICogVGhlIHRvb2wgaXMgaW1wbGVtZW50ZWQgYXMgYSBsaW51eCBtb2R1bGUuICBQYXJhbWV0ZXJzIGFyZSBvdXRwdXQgCiAqIGRldmljZSwgZGVsYXkgKHRvIGhhcmRfeG1pdCksIG51bWJlciBvZiBwYWNrZXRzLCBhbmQgd2hldGhlcgogKiB0byB1c2UgbXVsdGlwbGUgU0tCcyBvciBqdXN0IHRoZSBzYW1lIG9uZS4KICogcGt0Z2VuIHVzZXMgdGhlIGluc3RhbGxlZCBpbnRlcmZhY2UncyBvdXRwdXQgcm91dGluZS4KICoKICogQWRkaXRpb25hbCBoYWNraW5nIGJ5OgogKgogKiBKZW5zLkxhYXNAZGF0YS5zbHUuc2UKICogSW1wcm92ZWQgYnkgQU5LLiAwMTAxMjAuCiAqIEltcHJvdmVkIGJ5IEFOSyBldmVuIG1vcmUuIDAxMDIxMi4KICogTUFDIGFkZHJlc3MgdHlwbyBmaXhlZC4gMDEwNDE3IC0tcm8KICogSW50ZWdyYXRlZC4gIDAyMDMwMSAtLURhdmVNCiAqIEFkZGVkIG11bHRpc2tiIG9wdGlvbiAwMjAzMDEgLS1EYXZlTQogKiBTY2FsaW5nIG9mIHJlc3VsdHMuIDAyMDQxNy0tc2lndXJkdXJAbGlucHJvLm5vCiAqIFNpZ25pZmljYW50IHJlLXdvcmsgb2YgdGhlIG1vZHVsZToKICogICAqICBDb252ZXJ0IHRvIHRocmVhZGVkIG1vZGVsIHRvIG1vcmUgZWZmaWNpZW50bHkgYmUgYWJsZSB0byB0cmFuc21pdAogKiAgICAgICBhbmQgcmVjZWl2ZSBvbiBtdWx0aXBsZSBpbnRlcmZhY2VzIGF0IG9uY2UuCiAqICAgKiAgQ29udmVydGVkIG1hbnkgY291bnRlcnMgdG8gX191NjQgdG8gYWxsb3cgbG9uZ2VyIHJ1bnMuCiAqICAgKiAgQWxsb3cgY29uZmlndXJhdGlvbiBvZiByYW5nZXMsIGxpa2UgbWluL21heCBJUCBhZGRyZXNzLCBNQUNzLAogKiAgICAgICBhbmQgVURQLXBvcnRzLCBmb3IgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uLCBhbmQgY2FuCiAqICAgICAgIHNldCB0byB1c2UgYSByYW5kb20gZGlzdHJpYnV0aW9uIG9yIHNlcXVlbnRpYWxseSB3YWxrIHRoZSByYW5nZS4KICogICAqICBDYW4gbm93IGNoYW5nZSBtb3N0IHZhbHVlcyBhZnRlciBzdGFydGluZy4KICogICAqICBQbGFjZSAxMi1ieXRlIHBhY2tldCBpbiBVRFAgcGF5bG9hZCB3aXRoIG1hZ2ljIG51bWJlciwKICogICAgICAgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGltZXN0YW1wLgogKiAgICogIEFkZCByZWNlaXZlciBjb2RlIHRoYXQgZGV0ZWN0cyBkcm9wcGVkIHBrdHMsIHJlLW9yZGVyZWQgcGt0cywgYW5kCiAqICAgICAgIGxhdGVuY2llcyAod2l0aCBtaWNyby1zZWNvbmQpIHByZWNpc2lvbi4KICogICAqICBBZGQgSU9DVEwgaW50ZXJmYWNlIHRvIGVhc2lseSBnZXQgY291bnRlcnMgJiBjb25maWd1cmF0aW9uLgogKiAgIC0tQmVuIEdyZWVhciA8Z3JlZWFyYkBjYW5kZWxhdGVjaC5jb20+CiAqCiAqIFJlbmFtZWQgbXVsdGlza2IgdG8gY2xvbmVfc2tiIGFuZCBjbGVhbmVkIHVwIHNlbmRpbmcgY29yZSBmb3IgdHdvIGRpc3RpbmN0IAogKiBza2IgbW9kZXMuIEEgY2xvbmVfc2tiPTAgbW9kZSBmb3IgQmVuICJyYW5nZXMiIHdvcmsgYW5kIGEgY2xvbmVfc2tiICE9IDAgCiAqIGFzIGEgImZhc3RwYXRoIiB3aXRoIGEgY29uZmlndXJhYmxlIG51bWJlciBvZiBjbG9uZXMgYWZ0ZXIgYWxsb2Mncy4KICogY2xvbmVfc2tiPTAgbWVhbnMgYWxsIHBhY2tldHMgYXJlIGFsbG9jYXRlZCB0aGlzIGFsc28gbWVhbnMgcmFuZ2VzIHRpbWUgCiAqIHN0YW1wcyBldGMgY2FuIGJlIHVzZWQuIGNsb25lX3NrYj0xMDAgbWVhbnMgMSBtYWxsb2MgaXMgZm9sbG93ZWQgYnkgMTAwIAogKiBjbG9uZXMuCiAqCiAqIEFsc28gbW92ZWQgdG8gL3Byb2MvbmV0L3BrdGdlbi8gCiAqIC0tcm8KICoKICogU2VwdCAxMDogIEZpeGVkIHRocmVhZGluZy9sb2NraW5nLiAgTG90cyBvZiBib25lLWhlYWRlZCBhbmQgbW9yZSBjbGV2ZXIKICogICAgbWlzdGFrZXMuICBBbHNvIG1lcmdlZCBpbiBEYXZlTSdzIHBhdGNoIGluIHRoZSAtcHJlNiBwYXRjaC4KICogLS1CZW4gR3JlZWFyIDxncmVlYXJiQGNhbmRlbGF0ZWNoLmNvbT4KICoKICogSW50ZWdyYXRlZCB0byAyLjUueCAwMjEwMjkgLS1MdWNpbyBNYWNpZWwgKGx1Y2lvbWFjaWVsQHppcG1haWwuY29tLmJyKQogKgogKiAKICogMDIxMTI0IEZpbmlzaGVkIG1ham9yIHJlZGVzaWduIGFuZCByZXdyaXRlIGZvciBuZXcgZnVuY3Rpb25hbGl0eS4KICogU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0IGZvciBob3cgdG8gdXNlIHRoaXMuCiAqCiAqIFRoZSBuZXcgb3BlcmF0aW9uOgogKiBGb3IgZWFjaCBDUFUgb25lIHRocmVhZC9wcm9jZXNzIGlzIGNyZWF0ZWQgYXQgc3RhcnQuIFRoaXMgcHJvY2VzcyBjaGVja3MgCiAqIGZvciBydW5uaW5nIGRldmljZXMgaW4gdGhlIGlmX2xpc3QgYW5kIHNlbmRzIHBhY2tldHMgdW50aWwgY291bnQgaXMgMCBpdCAKICogYWxzbyB0aGUgdGhyZWFkIGNoZWNrcyB0aGUgdGhyZWFkLT5jb250cm9sIHdoaWNoIGlzIHVzZWQgZm9yIGludGVyLXByb2Nlc3MgCiAqIGNvbW11bmljYXRpb24uIGNvbnRyb2xsaW5nIHByb2Nlc3MgInBvc3RzIiBvcGVyYXRpb25zIHRvIHRoZSB0aHJlYWRzIHRoaXMgCiAqIHdheS4gVGhlIGlmX2xvY2sgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJlbW92ZSB3aGVuIGFkZC9yZW1fZGV2aWNlIGlzIG1lcmdlZAogKiBpbnRvIHRoaXMgdG9vLgogKgogKiBCeSBkZXNpZ24gdGhlcmUgc2hvdWxkIG9ubHkgYmUgKm9uZSogImNvbnRyb2xsaW5nIiBwcm9jZXNzLiBJbiBwcmFjdGljZSAKICogbXVsdGlwbGUgd3JpdGUgYWNjZXNzZXMgZ2l2ZXMgdW5wcmVkaWN0YWJsZSByZXN1bHQuIFVuZGVyc3Rvb2QgYnkgIndyaXRlIiAKICogdG8gL3Byb2MgZ2l2ZXMgcmVzdWx0IGNvZGUgdGhhdHMgc2hvdWxkIGJlIHJlYWQgYmUgdGhlICJ3cml0ZXIiLgogKiBGb3IgcHJhY3RpY2FsIHVzZSB0aGlzIHNob3VsZCBiZSBubyBwcm9ibGVtLgogKgogKiBOb3RlIHdoZW4gYWRkaW5nIGRldmljZXMgdG8gYSBzcGVjaWZpYyBDUFUgdGhlcmUgZ29vZCBpZGVhIHRvIGFsc28gYXNzaWduIAogKiAvcHJvYy9pcnEvWFgvc21wX2FmZmluaXR5IHNvIFRYLWludGVycnVwdHMgZ2V0cyBib3VuZCB0byB0aGUgc2FtZSBDUFUuIAogKiAtLXJvCiAqCiAqIEZpeCByZWZjb3VudCBvZmYgYnkgb25lIGlmIGZpcnN0IHBhY2tldCBmYWlscywgcG90ZW50aWFsIG51bGwgZGVyZWYsIAogKiBtZW1sZWFrIDAzMDcxMC0gS0pQCiAqCiAqIEZpcnN0ICJyYW5nZXMiIGZ1bmN0aW9uYWxpdHkgZm9yIGlwdjYgMDMwNzI2IC0tcm8KICoKICogSW5jbHVkZWQgZmxvdyBzdXBwb3J0LiAwMzA4MDIgQU5LLgogKgogKiBGaXhlZCB1bmFsaWduZWQgYWNjZXNzIG9uIElBLTY0IEdyYW50IEdydW5kbGVyIDxncnVuZGxlckBwYXJpc2MtbGludXgub3JnPgogKiAKICogUmVtb3ZlIGlmIGZpeCBmcm9tIGFkZGVkIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiAwNDA0MTkKICogaWE2NCBjb21waWxhdGlvbiBmaXggZnJvbSAgQXJvbiBHcmlmZmlzIDxhcm9uQGhwLmNvbT4gMDQwNjA0CiAqCiAqIE5ldyB4bWl0KCkgcmV0dXJuLCBkb19kaXYgYW5kIG1pc2MgY2xlYW4gdXAgYnkgU3RlcGhlbiBIZW1taW5nZXIgCiAqIDxzaGVtbWluZ2VyQG9zZGwub3JnPiAwNDA5MjMKICoKICogUmFuZHkgRHVubGFwIGZpeGVkIHU2NCBwcmludGsgY29tcGlsZXIgd2FyaW5nIAogKgogKiBSZW1vdmUgRkNTIGZyb20gQlcgY2FsY3VsYXRpb24uICBMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4KICogTmV3IHRpbWUgaGFuZGxpbmcuIExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAwNDEyMTMKICoKICogQ29ycmVjdGlvbnMgZnJvbSBOaWtvbGFpIE1hbHlraCAobm1hbHlraEBiaWxpbS5jb20pIAogKiBSZW1vdmVkIHVudXNlZCBmbGFncyBGX1NFVF9TUkNNQUMgJiBGX1NFVF9TUkNJUCAwNDEyMzAKICoKICogaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCkgcmVwbGFjZWQgTmlzaGFudGggQXJhdmFtdWRhbiA8bmFjY0B1cy5pYm0uY29tPiAKICogMDUwMTAzCiAqLwojaW5jbHVkZSA8bGludXgvc3lzLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW5ldC5oPgojaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KI2luY2x1ZGUgPGxpbnV4L2luLmg+CiNpbmNsdWRlIDxsaW51eC9pcC5oPgojaW5jbHVkZSA8bGludXgvaXB2Ni5oPgojaW5jbHVkZSA8bGludXgvdWRwLmg+CiNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiNpbmNsdWRlIDxuZXQvaXB2Ni5oPgojaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgojaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vZG1hLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL2RpdjY0Lmg+IC8qIGRvX2RpdiAqLwojaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CgoKI2RlZmluZSBWRVJTSU9OICAicGt0Z2VuIHYyLjYzOiBQYWNrZXQgR2VuZXJhdG9yIGZvciBwYWNrZXQgcGVyZm9ybWFuY2UgdGVzdGluZy5cbiIKCi8qICNkZWZpbmUgUEdfREVCVUcoYSkgYSAqLwojZGVmaW5lIFBHX0RFQlVHKGEpIAoKLyogVGhlIGJ1Y2tldHMgYXJlIGV4cG9uZW50aWFsIGluICd3aWR0aCcgKi8KI2RlZmluZSBMQVRfQlVDS0VUU19NQVggMzIKI2RlZmluZSBJUF9OQU1FX1NaIDMyCgovKiBEZXZpY2UgZmxhZyBiaXRzICovCiNkZWZpbmUgRl9JUFNSQ19STkQgICAoMTw8MCkgIC8qIElQLVNyYyBSYW5kb20gICovCiNkZWZpbmUgRl9JUERTVF9STkQgICAoMTw8MSkgIC8qIElQLURzdCBSYW5kb20gICovCiNkZWZpbmUgRl9VRFBTUkNfUk5EICAoMTw8MikgIC8qIFVEUC1TcmMgUmFuZG9tICovCiNkZWZpbmUgRl9VRFBEU1RfUk5EICAoMTw8MykgIC8qIFVEUC1Ec3QgUmFuZG9tICovCiNkZWZpbmUgRl9NQUNTUkNfUk5EICAoMTw8NCkgIC8qIE1BQy1TcmMgUmFuZG9tICovCiNkZWZpbmUgRl9NQUNEU1RfUk5EICAoMTw8NSkgIC8qIE1BQy1Ec3QgUmFuZG9tICovCiNkZWZpbmUgRl9UWFNJWkVfUk5EICAoMTw8NikgIC8qIFRyYW5zbWl0IHNpemUgaXMgcmFuZG9tICovCiNkZWZpbmUgRl9JUFY2ICAgICAgICAoMTw8NykgIC8qIEludGVyZmFjZSBpbiBJUFY2IE1vZGUgKi8KCi8qIFRocmVhZCBjb250cm9sIGZsYWcgYml0cyAqLwojZGVmaW5lIFRfVEVSTUlOQVRFICAgKDE8PDApICAKI2RlZmluZSBUX1NUT1AgICAgICAgICgxPDwxKSAgLyogU3RvcCBydW4gKi8KI2RlZmluZSBUX1JVTiAgICAgICAgICgxPDwyKSAgLyogU3RhcnQgcnVuICovCiNkZWZpbmUgVF9SRU1ERVYgICAgICAoMTw8MykgIC8qIFJlbW92ZSBhbGwgZGV2cyAqLwoKLyogTG9ja3MgKi8KI2RlZmluZSAgIHRocmVhZF9sb2NrKCkgICAgICAgIGRvd24oJnBrdGdlbl9zZW0pCiNkZWZpbmUgICB0aHJlYWRfdW5sb2NrKCkgICAgICB1cCgmcGt0Z2VuX3NlbSkKCi8qIElmIGxvY2sgLS0gY2FuIGJlIHJlbW92ZWQgYWZ0ZXIgc29tZSB3b3JrICovCiNkZWZpbmUgICBpZl9sb2NrKHQpICAgICAgICAgICBzcGluX2xvY2soJih0LT5pZl9sb2NrKSk7CiNkZWZpbmUgICBpZl91bmxvY2sodCkgICAgICAgICAgIHNwaW5fdW5sb2NrKCYodC0+aWZfbG9jaykpOwoKLyogVXNlZCB0byBoZWxwIHdpdGggZGV0ZXJtaW5pbmcgdGhlIHBrdHMgb24gcmVjZWl2ZSAqLwojZGVmaW5lIFBLVEdFTl9NQUdJQyAweGJlOWJlOTU1CiNkZWZpbmUgUEdfUFJPQ19ESVIgInBrdGdlbiIKI2RlZmluZSBQR0NUUkwJICAgICJwZ2N0cmwiCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBnX3Byb2NfZGlyID0gTlVMTDsKCiNkZWZpbmUgTUFYX0NGTE9XUyAgNjU1MzYKCnN0cnVjdCBmbG93X3N0YXRlCnsKCV9fdTMyCQljdXJfZGFkZHI7CglpbnQJCWNvdW50Owp9OwoKc3RydWN0IHBrdGdlbl9kZXYgewoKCS8qCgkgKiBUcnkgdG8ga2VlcCBmcmVxdWVudC9pbmZyZXF1ZW50IHVzZWQgdmFycy4gc2VwYXJhdGVkLgoJICovCgogICAgICAgIGNoYXIgaWZuYW1lW0lGTkFNU0laXTsKICAgICAgICBjaGFyIHJlc3VsdFs1MTJdOwoKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogcGdfdGhyZWFkOyAvKiB0aGUgb3duZXIgKi8KICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dDsgLyogVXNlZCBmb3IgY2hhaW5pbmcgaW4gdGhlIHRocmVhZCdzIHJ1bi1xdWV1ZSAqLwoKICAgICAgICBpbnQgcnVubmluZzsgIC8qIGlmIHRoaXMgY2hhbmdlcyB0byBmYWxzZSwgdGhlIHRlc3Qgd2lsbCBzdG9wICovCiAgICAgICAgCiAgICAgICAgLyogSWYgbWluICE9IG1heCwgdGhlbiB3ZSB3aWxsIGVpdGhlciBkbyBhIGxpbmVhciBpdGVyYXRpb24sIG9yCiAgICAgICAgICogd2Ugd2lsbCBkbyBhIHJhbmRvbSBzZWxlY3Rpb24gZnJvbSB3aXRoaW4gdGhlIHJhbmdlLgogICAgICAgICAqLwogICAgICAgIF9fdTMyIGZsYWdzOyAgICAgCgogICAgICAgIGludCBtaW5fcGt0X3NpemU7ICAgIC8qID0gRVRIX1pMRU47ICovCiAgICAgICAgaW50IG1heF9wa3Rfc2l6ZTsgICAgLyogPSBFVEhfWkxFTjsgKi8KICAgICAgICBpbnQgbmZyYWdzOwogICAgICAgIF9fdTMyIGRlbGF5X3VzOyAgICAvKiBEZWZhdWx0IGRlbGF5ICovCiAgICAgICAgX191MzIgZGVsYXlfbnM7CiAgICAgICAgX191NjQgY291bnQ7ICAvKiBEZWZhdWx0IE5vIHBhY2tldHMgdG8gc2VuZCAqLwogICAgICAgIF9fdTY0IHNvZmFyOyAgLyogSG93IG1hbnkgcGt0cyB3ZSd2ZSBzZW50IHNvIGZhciAqLwogICAgICAgIF9fdTY0IHR4X2J5dGVzOyAvKiBIb3cgbWFueSBieXRlcyB3ZSd2ZSB0cmFuc21pdHRlZCAqLwogICAgICAgIF9fdTY0IGVycm9yczsgICAgLyogRXJyb3JzIHdoZW4gdHJ5aW5nIHRvIHRyYW5zbWl0LCBwa3RzIHdpbGwgYmUgcmUtc2VudCAqLwoKICAgICAgICAvKiBydW50aW1lIGNvdW50ZXJzIHJlbGF0aW5nIHRvIGNsb25lX3NrYiAqLwogICAgICAgIF9fdTY0IG5leHRfdHhfdXM7ICAgICAgICAgIC8qIHRpbWVzdGFtcCBvZiB3aGVuIHRvIHR4IG5leHQgKi8KICAgICAgICBfX3UzMiBuZXh0X3R4X25zOwogICAgICAgIAogICAgICAgIF9fdTY0IGFsbG9jYXRlZF9za2JzOwogICAgICAgIF9fdTMyIGNsb25lX2NvdW50OwoJaW50IGxhc3Rfb2s7ICAgICAgICAgICAvKiBXYXMgbGFzdCBza2Igc2VudD8gCgkgICAgICAgICAgICAgICAgICAgICAgICAqIE9yIGEgZmFpbGVkIHRyYW5zbWl0IG9mIHNvbWUgc29ydD8gIFRoaXMgd2lsbCBrZWVwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXF1ZW5jZSBudW1iZXJzIGluIG9yZGVyLCBmb3IgZXhhbXBsZS4KCQkJCSovCiAgICAgICAgX191NjQgc3RhcnRlZF9hdDsgLyogbWljcm8tc2Vjb25kcyAqLwogICAgICAgIF9fdTY0IHN0b3BwZWRfYXQ7IC8qIG1pY3JvLXNlY29uZHMgKi8KICAgICAgICBfX3U2NCBpZGxlX2FjYzsgLyogbWljcm8tc2Vjb25kcyAqLwogICAgICAgIF9fdTMyIHNlcV9udW07CiAgICAgICAgCiAgICAgICAgaW50IGNsb25lX3NrYjsgLyogVXNlIG11bHRpcGxlIFNLQnMgZHVyaW5nIHBhY2tldCBnZW4uICBJZiB0aGlzIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhhdCBtYW55IGNvcGllcyBvZiB0aGUgc2FtZQogICAgICAgICAgICAgICAgICAgICAgICAgICogcGFja2V0IHdpbGwgYmUgc2VudCBiZWZvcmUgYSBuZXcgcGFja2V0IGlzIGFsbG9jYXRlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZvciBpbnN0YW5jZSwgaWYgeW91IHdhbnQgdG8gc2VuZCAxMDI0IGlkZW50aWNhbCBwYWNrZXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgcGFja2V0LCBzZXQgY2xvbmVfc2tiIHRvIDEwMjQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAKICAgICAgICBjaGFyIGRzdF9taW5bSVBfTkFNRV9TWl07IC8qIElQLCBpZSAxLjIuMy40ICovCiAgICAgICAgY2hhciBkc3RfbWF4W0lQX05BTUVfU1pdOyAvKiBJUCwgaWUgMS4yLjMuNCAqLwogICAgICAgIGNoYXIgc3JjX21pbltJUF9OQU1FX1NaXTsgLyogSVAsIGllIDEuMi4zLjQgKi8KICAgICAgICBjaGFyIHNyY19tYXhbSVBfTkFNRV9TWl07IC8qIElQLCBpZSAxLjIuMy40ICovCgoJc3RydWN0IGluNl9hZGRyICBpbjZfc2FkZHI7CglzdHJ1Y3QgaW42X2FkZHIgIGluNl9kYWRkcjsKCXN0cnVjdCBpbjZfYWRkciAgY3VyX2luNl9kYWRkcjsKCXN0cnVjdCBpbjZfYWRkciAgY3VyX2luNl9zYWRkcjsKCS8qIEZvciByYW5nZXMgKi8KCXN0cnVjdCBpbjZfYWRkciAgbWluX2luNl9kYWRkcjsKCXN0cnVjdCBpbjZfYWRkciAgbWF4X2luNl9kYWRkcjsKCXN0cnVjdCBpbjZfYWRkciAgbWluX2luNl9zYWRkcjsKCXN0cnVjdCBpbjZfYWRkciAgbWF4X2luNl9zYWRkcjsKCiAgICAgICAgLyogSWYgd2UncmUgZG9pbmcgcmFuZ2VzLCByYW5kb20gb3IgaW5jcmVtZW50YWwsIHRoZW4gdGhpcwogICAgICAgICAqIGRlZmluZXMgdGhlIG1pbi9tYXggZm9yIHRob3NlIHJhbmdlcy4KICAgICAgICAgKi8KICAgICAgICBfX3UzMiBzYWRkcl9taW47IC8qIGluY2x1c2l2ZSwgc291cmNlIElQIGFkZHJlc3MgKi8KICAgICAgICBfX3UzMiBzYWRkcl9tYXg7IC8qIGV4Y2x1c2l2ZSwgc291cmNlIElQIGFkZHJlc3MgKi8KICAgICAgICBfX3UzMiBkYWRkcl9taW47IC8qIGluY2x1c2l2ZSwgZGVzdCBJUCBhZGRyZXNzICovCiAgICAgICAgX191MzIgZGFkZHJfbWF4OyAvKiBleGNsdXNpdmUsIGRlc3QgSVAgYWRkcmVzcyAqLwoKICAgICAgICBfX3UxNiB1ZHBfc3JjX21pbjsgLyogaW5jbHVzaXZlLCBzb3VyY2UgVURQIHBvcnQgKi8KICAgICAgICBfX3UxNiB1ZHBfc3JjX21heDsgLyogZXhjbHVzaXZlLCBzb3VyY2UgVURQIHBvcnQgKi8KICAgICAgICBfX3UxNiB1ZHBfZHN0X21pbjsgLyogaW5jbHVzaXZlLCBkZXN0IFVEUCBwb3J0ICovCiAgICAgICAgX191MTYgdWRwX2RzdF9tYXg7IC8qIGV4Y2x1c2l2ZSwgZGVzdCBVRFAgcG9ydCAqLwoKICAgICAgICBfX3UzMiBzcmNfbWFjX2NvdW50OyAvKiBIb3cgbWFueSBNQUNzIHRvIGl0ZXJhdGUgdGhyb3VnaCAqLwogICAgICAgIF9fdTMyIGRzdF9tYWNfY291bnQ7IC8qIEhvdyBtYW55IE1BQ3MgdG8gaXRlcmF0ZSB0aHJvdWdoICovCiAgICAgICAgCiAgICAgICAgdW5zaWduZWQgY2hhciBkc3RfbWFjWzZdOwogICAgICAgIHVuc2lnbmVkIGNoYXIgc3JjX21hY1s2XTsKICAgICAgICAKICAgICAgICBfX3UzMiBjdXJfZHN0X21hY19vZmZzZXQ7CiAgICAgICAgX191MzIgY3VyX3NyY19tYWNfb2Zmc2V0OwogICAgICAgIF9fdTMyIGN1cl9zYWRkcjsKICAgICAgICBfX3UzMiBjdXJfZGFkZHI7CiAgICAgICAgX191MTYgY3VyX3VkcF9kc3Q7CiAgICAgICAgX191MTYgY3VyX3VkcF9zcmM7CiAgICAgICAgX191MzIgY3VyX3BrdF9zaXplOwogICAgICAgIAogICAgICAgIF9fdTggaGhbMTRdOwogICAgICAgIC8qID0geyAKICAgICAgICAgICAweDAwLCAweDgwLCAweEM4LCAweDc5LCAweEIzLCAweENCLCAKICAgICAgICAgICAKICAgICAgICAgICBXZSBmaWxsIGluIFNSQyBhZGRyZXNzIGxhdGVyCiAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgICAgICAgICAweDA4LCAweDAwCiAgICAgICAgICAgfTsKICAgICAgICAqLwogICAgICAgIF9fdTE2IHBhZDsgLyogcGFkIG91dCB0aGUgaGggc3RydWN0IHRvIGFuIGV2ZW4gMTYgYnl0ZXMgKi8KCiAgICAgICAgc3RydWN0IHNrX2J1ZmYqIHNrYjsgLyogc2tiIHdlIGFyZSB0byB0cmFuc21pdCBuZXh0LCBtYWlubHkgdXNlZCBmb3Igd2hlbiB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFyZSB0cmFuc21pdHRpbmcgdGhlIHNhbWUgb25lIG11bHRpcGxlIHRpbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UqIG9kZXY7IC8qIFRoZSBvdXQtZ29pbmcgZGV2aWNlLiAgTm90ZSB0aGF0IHRoZSBkZXZpY2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhdmUgaXQncyBwZ19pbmZvIHBvaW50ZXIgcG9pbnRpbmcgYmFjayB0byB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRldmljZS4gIFRoaXMgd2lsbCBiZSBzZXQgd2hlbiB0aGUgdXNlciBzcGVjaWZpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIG91dC1nb2luZyBkZXZpY2UgbmFtZSAobm90IHdoZW4gdGhlIGluamVjdCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGFydGVkIGFzIGl0IHVzZWQgdG8gZG8uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCXN0cnVjdCBmbG93X3N0YXRlICpmbG93czsKCXVuc2lnbmVkIGNmbG93czsgICAgICAgICAvKiBDb25jdXJyZW50IGZsb3dzIChjb25maWcpICovCgl1bnNpZ25lZCBsZmxvdzsgICAgICAgICAgLyogRmxvdyBsZW5ndGggIChjb25maWcpICovCgl1bnNpZ25lZCBuZmxvd3M7ICAgICAgICAgLyogYWNjdW11bGF0ZWQgZmxvd3MgKHN0YXRzKSAqLwp9OwoKc3RydWN0IHBrdGdlbl9oZHIgewogICAgICAgIF9fdTMyIHBnaF9tYWdpYzsKICAgICAgICBfX3UzMiBzZXFfbnVtOwoJX191MzIgdHZfc2VjOwoJX191MzIgdHZfdXNlYzsKfTsKCnN0cnVjdCBwa3RnZW5fdGhyZWFkIHsKICAgICAgICBzcGlubG9ja190IGlmX2xvY2s7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKmlmX2xpc3Q7ICAgICAgICAgICAvKiBBbGwgZGV2aWNlIGhlcmUgKi8KICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogbmV4dDsKICAgICAgICBjaGFyIG5hbWVbMzJdOwogICAgICAgIGNoYXIgcmVzdWx0WzUxMl07CiAgICAgICAgdTMyIG1heF9iZWZvcmVfc29mdGlycTsgLyogV2UnbGwgY2FsbCBkb19zb2Z0aXJxIHRvIHByZXZlbnQgc3RhcnZhdGlvbi4gKi8KICAgICAgICAKCS8qIEZpZWxkIGZvciB0aHJlYWQgdG8gcmVjZWl2ZSAicG9zdGVkIiBldmVudHMgdGVybWluYXRlLCBzdG9wIGlmcyBldGMuKi8KCiAgICAgICAgdTMyIGNvbnRyb2w7CglpbnQgcGlkOwoJaW50IGNwdTsKCiAgICAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7Cn07CgojZGVmaW5lIFJFTU9WRSAxCiNkZWZpbmUgRklORCAgIDAKCi8qICBUaGlzIGNvZGUgd29ya3MgYXJvdW5kIHRoZSBmYWN0IHRoYXQgZG9fZGl2IGNhbm5vdCBoYW5kbGUgdHdvIDY0LWJpdAogICAgbnVtYmVycywgYW5kIHJlZ3VsYXIgNjQtYml0IGRpdmlzaW9uIGRvZXNuJ3Qgd29yayBvbiB4ODYga2VybmVscy4KICAgIC0tQmVuCiovCgojZGVmaW5lIFBHX0RJViAwCgovKiBUaGlzIHdhcyBlbWFpbGVkIHRvIExNS0wgYnk6IENocmlzIENhcHV0byA8Y2NhcHV0b0BhbHQubmV0PgogKiBGdW5jdGlvbiBjb3BpZWQvYWRhcHRlZC9vcHRpbWl6ZWQgZnJvbToKICoKICogIG5lbWVzaXMuc291cmNlZm9yZ2UubmV0L2Jyb3dzZS9saWIvc3RhdGljL2ludG1hdGgvaXg4Ni9pbnRtYXRoLmMuaHRtbAogKgogKiBDb3B5cmlnaHQgMTk5NCwgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UgQ29tcHV0ZXIgTGFib3JhdG9yeQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKi8Kc3RhdGljIGlubGluZSBzNjQgZGl2cmVtZGkzKHM2NCB4LCBzNjQgeSwgaW50IHR5cGUpCnsKICAgICAgICB1NjQgYSA9ICh4IDwgMCkgPyAteCA6IHg7CiAgICAgICAgdTY0IGIgPSAoeSA8IDApID8gLXkgOiB5OwogICAgICAgIHU2NCByZXMgPSAwLCBkID0gMTsKCiAgICAgICAgaWYgKGIgPiAwKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoYiA8IGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA8PD0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA8PD0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKCBhID49IGIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgLT0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiID4+PSAxOwogICAgICAgICAgICAgICAgZCA+Pj0gMTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGQpOwoKICAgICAgICBpZiAoUEdfRElWID09IHR5cGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoKCh4IF4geSkgJiAoMWxsPDw2MykpID09IDApID8gcmVzIDogLShzNjQpcmVzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAoKHggJiAoMWxsPDw2MykpID09IDApID8gYSA6IC0oczY0KWE7CiAgICAgICAgfQp9CgovKiBFbmQgb2YgaGFja3MgdG8gZGVhbCB3aXRoIDY0LWJpdCBtYXRoIG9uIHg4NiAqLwoKLyoqIENvbnZlcnQgdG8gbWlsbGlzZWNvbmRzICovCnN0YXRpYyBpbmxpbmUgX191NjQgdHZfdG9fbXMoY29uc3Qgc3RydWN0IHRpbWV2YWwqIHR2KSAKewogICAgICAgIF9fdTY0IG1zID0gdHYtPnR2X3VzZWMgLyAxMDAwOwogICAgICAgIG1zICs9IChfX3U2NCl0di0+dHZfc2VjICogKF9fdTY0KTEwMDA7CiAgICAgICAgcmV0dXJuIG1zOwp9CgoKLyoqIENvbnZlcnQgdG8gbWljcm8tc2Vjb25kcyAqLwpzdGF0aWMgaW5saW5lIF9fdTY0IHR2X3RvX3VzKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiB0dikgCnsKICAgICAgICBfX3U2NCB1cyA9IHR2LT50dl91c2VjOwogICAgICAgIHVzICs9IChfX3U2NCl0di0+dHZfc2VjICogKF9fdTY0KTEwMDAwMDA7CiAgICAgICAgcmV0dXJuIHVzOwp9CgpzdGF0aWMgaW5saW5lIF9fdTY0IHBnX2RpdihfX3U2NCBuLCBfX3UzMiBiYXNlKSB7CiAgICAgICAgX191NjQgdG1wID0gbjsKICAgICAgICBkb19kaXYodG1wLCBiYXNlKTsKICAgICAgICAvKiBwcmludGsoInBrdGdlbjogcGdfZGl2LCBuOiAlbGx1ICBiYXNlOiAlZCAgcnY6ICVsbHVcbiIsCiAgICAgICAgICAgICAgICAgIG4sIGJhc2UsIHRtcCk7ICovCiAgICAgICAgcmV0dXJuIHRtcDsKfQoKc3RhdGljIGlubGluZSBfX3U2NCBwZ19kaXY2NChfX3U2NCBuLCBfX3U2NCBiYXNlKSAKewogICAgICAgIF9fdTY0IHRtcCA9IG47Ci8qCiAqIEhvdyBkbyB3ZSBrbm93IGlmIHRoZSBhcmNoaXRlY3R1cmUgd2UgYXJlIHJ1bm5pbmcgb24KICogc3VwcG9ydHMgZGl2aXNpb24gd2l0aCA2NCBiaXQgYmFzZT8KICogCiAqLwojaWYgZGVmaW5lZChfX3NwYXJjX3Y5X18pIHx8IGRlZmluZWQoX19wb3dlcnBjNjRfXykgfHwgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2lhNjRfXykgCgoJCWRvX2Rpdih0bXAsIGJhc2UpOwojZWxzZQoJCXRtcCA9IGRpdnJlbWRpMyhuLCBiYXNlLCBQR19ESVYpOwojZW5kaWYKICAgICAgICByZXR1cm4gdG1wOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBwa3RnZW5fcmFuZG9tKHZvaWQpCnsKI2lmIDAKCV9fdTMyIG47CglnZXRfcmFuZG9tX2J5dGVzKCZuLCA0KTsKCXJldHVybiBuOwojZWxzZQoJcmV0dXJuIG5ldF9yYW5kb20oKTsKI2VuZGlmCn0KCnN0YXRpYyBpbmxpbmUgX191NjQgZ2V0Q3VyTXModm9pZCkgCnsKICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICAgICBkb19nZXR0aW1lb2ZkYXkoJnR2KTsKICAgICAgICByZXR1cm4gdHZfdG9fbXMoJnR2KTsKfQoKc3RhdGljIGlubGluZSBfX3U2NCBnZXRDdXJVcyh2b2lkKSAKewogICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwogICAgICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOwogICAgICAgIHJldHVybiB0dl90b191cygmdHYpOwp9CgpzdGF0aWMgaW5saW5lIF9fdTY0IHR2X2RpZmYoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGEsIGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBiKSAKewogICAgICAgIHJldHVybiB0dl90b191cyhhKSAtIHR2X3RvX3VzKGIpOwp9CgoKLyogb2xkIGluY2x1ZGUgZW5kICovCgpzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9IFZFUlNJT047CgpzdGF0aWMgaW50IHBrdGdlbl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqaSk7CnN0YXRpYyBpbnQgcGt0Z2VuX2FkZF9kZXZpY2Uoc3RydWN0IHBrdGdlbl90aHJlYWQqIHQsIGNvbnN0IGNoYXIqIGlmbmFtZSk7CnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0Z2VuX2ZpbmRfZGV2KHN0cnVjdCBwa3RnZW5fdGhyZWFkKiB0LCBjb25zdCBjaGFyKiBpZm5hbWUpOwpzdGF0aWMgaW50IHBrdGdlbl9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CnN0YXRpYyB2b2lkIHBrdGdlbl9ydW5fYWxsX3RocmVhZHModm9pZCk7CnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcyh2b2lkKTsKc3RhdGljIGludCBwa3RnZW5fc3RvcF9kZXZpY2Uoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpOwpzdGF0aWMgdm9pZCBwa3RnZW5fc3RvcChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCogdCk7CnN0YXRpYyB2b2lkIHBrdGdlbl9jbGVhcl9jb3VudGVycyhzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2Rldik7CnN0YXRpYyBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0Z2VuX05OX3RocmVhZHMoY29uc3QgY2hhciogZGV2X25hbWUsIGludCByZW1vdmUpOwpzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5faXA2KGNvbnN0IGNoYXIgKnMsY2hhciBpcFsxNl0pOwpzdGF0aWMgdW5zaWduZWQgaW50IGZtdF9pcDYoY2hhciAqcyxjb25zdCBjaGFyIGlwWzE2XSk7CgovKiBNb2R1bGUgcGFyYW1ldGVycywgZGVmYXVsdHMuICovCnN0YXRpYyBpbnQgcGdfY291bnRfZCA9IDEwMDA7IC8qIDEwMDAgcGt0cyBieSBkZWZhdWx0ICovCnN0YXRpYyBpbnQgcGdfZGVsYXlfZDsKc3RhdGljIGludCBwZ19jbG9uZV9za2JfZDsKc3RhdGljIGludCBkZWJ1ZzsKCnN0YXRpYyBERUNMQVJFX01VVEVYKHBrdGdlbl9zZW0pOwpzdGF0aWMgc3RydWN0IHBrdGdlbl90aHJlYWQgKnBrdGdlbl90aHJlYWRzID0gTlVMTDsKCnN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGt0Z2VuX25vdGlmaWVyX2Jsb2NrID0gewoJLm5vdGlmaWVyX2NhbGwgPSBwa3RnZW5fZGV2aWNlX2V2ZW50LAp9OwoKLyoKICogL3Byb2MgaGFuZGxpbmcgZnVuY3Rpb25zIAogKgogKi8KCnN0YXRpYyBpbnQgcGdjdHJsX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsgCglzZXFfcHV0cyhzZXEsIFZFUlNJT04pOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzc2l6ZV90IHBnY3RybF93cml0ZShzdHJ1Y3QgZmlsZSogZmlsZSxjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQp7CglpbnQgZXJyID0gMDsKCWNoYXIgZGF0YVsxMjhdOwoKICAgICAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpewogICAgICAgICAgICAgICAgZXJyID0gLUVQRVJNOwoJCWdvdG8gb3V0OwogICAgICAgIH0KCglpZiAoY291bnQgPiBzaXplb2YoZGF0YSkpCgkJY291bnQgPSBzaXplb2YoZGF0YSk7CgoJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGJ1ZiwgY291bnQpKSB7CgkJZXJyID0gLUVGQVVMVDsKCQlnb3RvIG91dDsKCX0gIAoJZGF0YVtjb3VudC0xXSA9IDA7IC8qIE1ha2Ugc3RyaW5nICovCgoJaWYgKCFzdHJjbXAoZGF0YSwgInN0b3AiKSkgCgkJcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHNfaWZzKCk7CgogICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGF0YSwgInN0YXJ0IikpIAoJCXBrdGdlbl9ydW5fYWxsX3RocmVhZHMoKTsKCgllbHNlIAoJCXByaW50aygicGt0Z2VuOiBVbmtub3duIGNvbW1hbmQ6ICVzXG4iLCBkYXRhKTsKCgllcnIgPSBjb3VudDsKCiBvdXQ6CiAgICAgICAgcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBwZ2N0cmxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHBnY3RybF9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGt0Z2VuX2ZvcHMgPSB7Cgkub3duZXIJICA9IFRISVNfTU9EVUxFLAoJLm9wZW4JICA9IHBnY3RybF9vcGVuLAogICAgICAgIC5yZWFkICAgICA9IHNlcV9yZWFkLAoJLmxsc2VlawkgID0gc2VxX2xzZWVrLAogICAgICAgIC53cml0ZSAgICA9IHBnY3RybF93cml0ZSwKCS5yZWxlYXNlICA9IHNpbmdsZV9yZWxlYXNlLAp9OwoKc3RhdGljIGludCBwa3RnZW5faWZfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJaW50IGk7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBzZXEtPnByaXZhdGU7CiAgICAgICAgX191NjQgc2E7CiAgICAgICAgX191NjQgc3RvcHBlZDsKICAgICAgICBfX3U2NCBub3cgPSBnZXRDdXJVcygpOwogICAgICAgIAoJc2VxX3ByaW50ZihzZXEsICJQYXJhbXM6IGNvdW50ICVsbHUgIG1pbl9wa3Rfc2l6ZTogJXUgIG1heF9wa3Rfc2l6ZTogJXVcbiIsCgkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGt0X2Rldi0+Y291bnQsCgkJICAgcGt0X2Rldi0+bWluX3BrdF9zaXplLCBwa3RfZGV2LT5tYXhfcGt0X3NpemUpOwoKCXNlcV9wcmludGYoc2VxLCAiICAgICBmcmFnczogJWQgIGRlbGF5OiAldSAgY2xvbmVfc2tiOiAlZCAgaWZuYW1lOiAlc1xuIiwKCQkgICBwa3RfZGV2LT5uZnJhZ3MsIDEwMDAqcGt0X2Rldi0+ZGVsYXlfdXMrcGt0X2Rldi0+ZGVsYXlfbnMsIHBrdF9kZXYtPmNsb25lX3NrYiwgcGt0X2Rldi0+aWZuYW1lKTsKCglzZXFfcHJpbnRmKHNlcSwgIiAgICAgZmxvd3M6ICV1IGZsb3dsZW46ICV1XG4iLCBwa3RfZGV2LT5jZmxvd3MsIHBrdF9kZXYtPmxmbG93KTsKCgoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIHsKCQljaGFyIGIxWzEyOF0sIGIyWzEyOF0sIGIzWzEyOF07CgkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmluNl9zYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIyLCAgcGt0X2Rldi0+bWluX2luNl9zYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIzLCAgcGt0X2Rldi0+bWF4X2luNl9zYWRkci5zNl9hZGRyKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgc2FkZHI6ICVzICBtaW5fc2FkZHI6ICVzICBtYXhfc2FkZHI6ICVzXG4iLCBiMSwgYjIsIGIzKTsKCgkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmluNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIyLCAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGIzLCAgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyKTsKCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgZGFkZHI6ICVzICBtaW5fZGFkZHI6ICVzICBtYXhfZGFkZHI6ICVzXG4iLCBiMSwgYjIsIGIzKTsKCgl9IAoJZWxzZSAKCQlzZXFfcHJpbnRmKHNlcSwiICAgICBkc3RfbWluOiAlcyAgZHN0X21heDogJXNcbiAgICAgc3JjX21pbjogJXMgIHNyY19tYXg6ICVzXG4iLAoJCQkgICBwa3RfZGV2LT5kc3RfbWluLCBwa3RfZGV2LT5kc3RfbWF4LCBwa3RfZGV2LT5zcmNfbWluLCBwa3RfZGV2LT5zcmNfbWF4KTsKCglzZXFfcHV0cyhzZXEsICIgICAgIHNyY19tYWM6ICIpOwoKCWlmICgocGt0X2Rldi0+c3JjX21hY1swXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1syXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1szXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s1XSA9PSAwKSkgCgoJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIAoJCQlzZXFfcHJpbnRmKHNlcSwgICIlMDJYJXMiLCBwa3RfZGV2LT5vZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gIiAgIiA6ICI6Iik7CgoJZWxzZSAKCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSAKCQkJc2VxX3ByaW50ZihzZXEsICAiJTAyWCVzIiwgcGt0X2Rldi0+c3JjX21hY1tpXSwgaSA9PSA1ID8gIiAgIiA6ICI6Iik7CgogICAgICAgIHNlcV9wcmludGYoc2VxLCAgImRzdF9tYWM6ICIpOwoJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgCgkJc2VxX3ByaW50ZihzZXEsICAiJTAyWCVzIiwgcGt0X2Rldi0+ZHN0X21hY1tpXSwgaSA9PSA1ID8gIlxuIiA6ICI6Iik7CgogICAgICAgIHNlcV9wcmludGYoc2VxLCAgIiAgICAgdWRwX3NyY19taW46ICVkICB1ZHBfc3JjX21heDogJWQgIHVkcF9kc3RfbWluOiAlZCAgdWRwX2RzdF9tYXg6ICVkXG4iLAoJCSAgIHBrdF9kZXYtPnVkcF9zcmNfbWluLCBwa3RfZGV2LT51ZHBfc3JjX21heCwgcGt0X2Rldi0+dWRwX2RzdF9taW4sCgkJICAgcGt0X2Rldi0+dWRwX2RzdF9tYXgpOwoKICAgICAgICBzZXFfcHJpbnRmKHNlcSwgICIgICAgIHNyY19tYWNfY291bnQ6ICVkICBkc3RfbWFjX2NvdW50OiAlZCBcbiAgICAgRmxhZ3M6ICIsCgkJICAgcGt0X2Rldi0+c3JjX21hY19jb3VudCwgcGt0X2Rldi0+ZHN0X21hY19jb3VudCk7CgoKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiAgRl9JUFY2KSAKICAgICAgICAgICAgICAgIHNlcV9wcmludGYoc2VxLCAgIklQVjYgICIpOwoKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiAgRl9JUFNSQ19STkQpIAogICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzZXEsICAiSVBTUkNfUk5EICAiKTsKCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUERTVF9STkQpIAogICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzZXEsICAiSVBEU1RfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX1RYU0laRV9STkQpIAogICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzZXEsICAiVFhTSVpFX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBTUkNfUk5EKSAKICAgICAgICAgICAgICAgIHNlcV9wcmludGYoc2VxLCAgIlVEUFNSQ19STkQgICIpOwogICAgICAgIAogICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfVURQRFNUX1JORCkgCiAgICAgICAgICAgICAgICBzZXFfcHJpbnRmKHNlcSwgICJVRFBEU1RfUk5EICAiKTsKICAgICAgICAKICAgICAgICBpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX01BQ1NSQ19STkQpIAogICAgICAgICAgICAgICAgc2VxX3ByaW50ZihzZXEsICAiTUFDU1JDX1JORCAgIik7CiAgICAgICAgCiAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9NQUNEU1RfUk5EKSAKICAgICAgICAgICAgICAgIHNlcV9wcmludGYoc2VxLCAgIk1BQ0RTVF9STkQgICIpOwoKICAgICAgICAKICAgICAgICBzZXFfcHV0cyhzZXEsICAiXG4iKTsKICAgICAgICAKICAgICAgICBzYSA9IHBrdF9kZXYtPnN0YXJ0ZWRfYXQ7CiAgICAgICAgc3RvcHBlZCA9IHBrdF9kZXYtPnN0b3BwZWRfYXQ7CiAgICAgICAgaWYgKHBrdF9kZXYtPnJ1bm5pbmcpIAogICAgICAgICAgICAgICAgc3RvcHBlZCA9IG5vdzsgLyogbm90IHJlYWxseSBzdG9wcGVkLCBtb3JlIGxpa2UgbGFzdC1ydW5uaW5nLWF0ICovCiAgICAgICAgCiAgICAgICAgc2VxX3ByaW50ZihzZXEsICAiQ3VycmVudDpcbiAgICAgcGt0cy1zb2ZhcjogJWxsdSAgZXJyb3JzOiAlbGx1XG4gICAgIHN0YXJ0ZWQ6ICVsbHV1cyAgc3RvcHBlZDogJWxsdXVzIGlkbGU6ICVsbHV1c1xuIiwKCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5zb2ZhciwKCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5lcnJvcnMsCgkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2EsCgkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RvcHBlZCwKCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5pZGxlX2FjYyk7CgogICAgICAgIHNlcV9wcmludGYoc2VxLCAgIiAgICAgc2VxX251bTogJWQgIGN1cl9kc3RfbWFjX29mZnNldDogJWQgIGN1cl9zcmNfbWFjX29mZnNldDogJWRcbiIsCgkJICAgcGt0X2Rldi0+c2VxX251bSwgcGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0LAoJCSAgIHBrdF9kZXYtPmN1cl9zcmNfbWFjX29mZnNldCk7CgoJaWYocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQVjYpIHsKCQljaGFyIGIxWzEyOF0sIGIyWzEyOF07CgkJZm10X2lwNihiMSwgIHBrdF9kZXYtPmN1cl9pbjZfZGFkZHIuczZfYWRkcik7CgkJZm10X2lwNihiMiwgIHBrdF9kZXYtPmN1cl9pbjZfc2FkZHIuczZfYWRkcik7CgkJc2VxX3ByaW50ZihzZXEsICAiICAgICBjdXJfc2FkZHI6ICVzICBjdXJfZGFkZHI6ICVzXG4iLCBiMiwgYjEpOwoJfSAKCWVsc2UgCgkJc2VxX3ByaW50ZihzZXEsICAiICAgICBjdXJfc2FkZHI6IDB4JXggIGN1cl9kYWRkcjogMHgleFxuIiwKCQkJICAgcGt0X2Rldi0+Y3VyX3NhZGRyLCBwa3RfZGV2LT5jdXJfZGFkZHIpOwoKCglzZXFfcHJpbnRmKHNlcSwgICIgICAgIGN1cl91ZHBfZHN0OiAlZCAgY3VyX3VkcF9zcmM6ICVkXG4iLAoJCSAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0LCBwa3RfZGV2LT5jdXJfdWRwX3NyYyk7CgoJc2VxX3ByaW50ZihzZXEsICAiICAgICBmbG93czogJXVcbiIsIHBrdF9kZXYtPm5mbG93cyk7CgoJaWYgKHBrdF9kZXYtPnJlc3VsdFswXSkKCQlzZXFfcHJpbnRmKHNlcSwgICJSZXN1bHQ6ICVzXG4iLCBwa3RfZGV2LT5yZXN1bHQpOwoJZWxzZQoJCXNlcV9wcmludGYoc2VxLCAgIlJlc3VsdDogSWRsZVxuIik7CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IGNvdW50X3RyYWlsX2NoYXJzKGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgdW5zaWduZWQgaW50IG1heGxlbikKewoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IG1heGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjaGFyIGM7CiAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIoYywgJnVzZXJfYnVmZmVyW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKCQljYXNlICdcIic6CgkJY2FzZSAnXG4nOgoJCWNhc2UgJ1xyJzoKCQljYXNlICdcdCc6CgkJY2FzZSAnICc6CgkJY2FzZSAnPSc6CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWdvdG8gZG9uZTsKCQl9OwoJfQpkb25lOgoJcmV0dXJuIGk7Cn0KCnN0YXRpYyB1bnNpZ25lZCBsb25nIG51bV9hcmcoY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heGxlbiwgCgkJCSAgICAgdW5zaWduZWQgbG9uZyAqbnVtKQp7CglpbnQgaSA9IDA7CgkqbnVtID0gMDsKICAKCWZvcig7IGkgPCBtYXhsZW47IGkrKykgewogICAgICAgICAgICAgICAgY2hhciBjOwogICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGMsICZ1c2VyX2J1ZmZlcltpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgewoJCQkqbnVtICo9IDEwOwoJCQkqbnVtICs9IGMgLScwJzsKCQl9IGVsc2UKCQkJYnJlYWs7Cgl9CglyZXR1cm4gaTsKfQoKc3RhdGljIGludCBzdHJuX2xlbihjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWZmZXIsIHVuc2lnbmVkIGludCBtYXhsZW4pCnsKCWludCBpID0gMDsKCglmb3IoOyBpIDwgbWF4bGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGNoYXIgYzsKICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcihjLCAmdXNlcl9idWZmZXJbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewoJCWNhc2UgJ1wiJzoKCQljYXNlICdcbic6CgkJY2FzZSAnXHInOgoJCWNhc2UgJ1x0JzoKCQljYXNlICcgJzoKCQkJZ290byBkb25lX3N0cjsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfTsKCX0KZG9uZV9zdHI6CgoJcmV0dXJuIGk7Cn0KCnN0YXRpYyBzc2l6ZV90IHBrdGdlbl9pZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmZmVyLAoJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKewoJc3RydWN0IHNlcV9maWxlICpzZXEgPSAoc3RydWN0IHNlcV9maWxlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IHNlcS0+cHJpdmF0ZTsKCWludCBpID0gMCwgbWF4LCBsZW47CgljaGFyIG5hbWVbMTZdLCB2YWxzdHJbMzJdOwoJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDA7CiAgICAgICAgY2hhciogcGdfcmVzdWx0ID0gTlVMTDsKICAgICAgICBpbnQgdG1wID0gMDsKCWNoYXIgYnVmWzEyOF07CiAgICAgICAgCiAgICAgICAgcGdfcmVzdWx0ID0gJihwa3RfZGV2LT5yZXN1bHRbMF0pOwogICAgICAgIAoJaWYgKGNvdW50IDwgMSkgewoJCXByaW50aygicGt0Z2VuOiB3cm9uZyBjb21tYW5kIGZvcm1hdFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiAgCgltYXggPSBjb3VudCAtIGk7Cgl0bXAgPSBjb3VudF90cmFpbF9jaGFycygmdXNlcl9idWZmZXJbaV0sIG1heCk7CiAgICAgICAgaWYgKHRtcCA8IDApIHsgCgkJcHJpbnRrKCJwa3RnZW46IGlsbGVnYWwgZm9ybWF0XG4iKTsKCQlyZXR1cm4gdG1wOyAKCX0KICAgICAgICBpICs9IHRtcDsKICAgICAgICAKCS8qIFJlYWQgdmFyaWFibGUgbmFtZSAqLwoKCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKG5hbWUpIC0gMSk7CiAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CglpZiAoY29weV9mcm9tX3VzZXIobmFtZSwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pICkKCQlyZXR1cm4gLUVGQVVMVDsKCWkgKz0gbGVuOwogIAoJbWF4ID0gY291bnQgLWk7CglsZW4gPSBjb3VudF90cmFpbF9jaGFycygmdXNlcl9idWZmZXJbaV0sIG1heCk7CiAgICAgICAgaWYgKGxlbiA8IDApIAogICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKICAgICAgICAKCWkgKz0gbGVuOwoKCWlmIChkZWJ1ZykgewogICAgICAgICAgICAgICAgY2hhciB0Yltjb3VudCArIDFdOwogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKHRiLCB1c2VyX2J1ZmZlciwgY291bnQpKQoJCQlyZXR1cm4gLUVGQVVMVDsKICAgICAgICAgICAgICAgIHRiW2NvdW50XSA9IDA7CgkJcHJpbnRrKCJwa3RnZW46ICVzLCVsdSAgYnVmZmVyIC06JXM6LVxuIiwgbmFtZSwKCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvdW50LCB0Yik7CiAgICAgICAgfQoKCWlmICghc3RyY21wKG5hbWUsICJtaW5fcGt0X3NpemUiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAodmFsdWUgPCAxNCsyMCs4KQoJCQl2YWx1ZSA9IDE0KzIwKzg7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gcGt0X2Rldi0+bWluX3BrdF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBtaW5fcGt0X3NpemU9JXUiLCBwa3RfZGV2LT5taW5fcGt0X3NpemUpOwoJCXJldHVybiBjb3VudDsKCX0KCiAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgIm1heF9wa3Rfc2l6ZSIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCWlmICh2YWx1ZSA8IDE0KzIwKzgpCgkJCXZhbHVlID0gMTQrMjArODsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT5tYXhfcGt0X3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWF4X3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IG1heF9wa3Rfc2l6ZT0ldSIsIHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSk7CgkJcmV0dXJuIGNvdW50OwoJfQoKICAgICAgICAvKiBTaG9ydGN1dCBmb3IgbWluID0gbWF4ICovCgoJaWYgKCFzdHJjbXAobmFtZSwgInBrdF9zaXplIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHZhbHVlIDwgMTQrMjArOCkKCQkJdmFsdWUgPSAxNCsyMCs4OwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5taW5fcGt0X3NpemUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+bWF4X3BrdF9zaXplID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHBrdF9zaXplPSV1IiwgcGt0X2Rldi0+bWluX3BrdF9zaXplKTsKCQlyZXR1cm4gY291bnQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJkZWJ1ZyIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgZGVidWcgPSB2YWx1ZTsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkZWJ1Zz0ldSIsIGRlYnVnKTsKCQlyZXR1cm4gY291bnQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJmcmFncyIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwoJCXBrdF9kZXYtPm5mcmFncyA9IHZhbHVlOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGZyYWdzPSV1IiwgcGt0X2Rldi0+bmZyYWdzKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZGVsYXkiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAodmFsdWUgPT0gMHg3RkZGRkZGRikgewoJCQlwa3RfZGV2LT5kZWxheV91cyA9IDB4N0ZGRkZGRkY7CgkJCXBrdF9kZXYtPmRlbGF5X25zID0gMDsKCQl9IGVsc2UgewoJCQlwa3RfZGV2LT5kZWxheV91cyA9IHZhbHVlIC8gMTAwMDsKCQkJcGt0X2Rldi0+ZGVsYXlfbnMgPSB2YWx1ZSAlIDEwMDA7CgkJfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRlbGF5PSV1IiwgMTAwMCpwa3RfZGV2LT5kZWxheV91cytwa3RfZGV2LT5kZWxheV9ucyk7CgkJcmV0dXJuIGNvdW50OwoJfQogCWlmICghc3RyY21wKG5hbWUsICJ1ZHBfc3JjX21pbiIpKSB7CgkJbGVuID0gbnVtX2FyZygmdXNlcl9idWZmZXJbaV0sIDEwLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHBrdF9kZXYtPnVkcF9zcmNfbWluKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnVkcF9zcmNfbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfc3JjID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9ICAgICAgIAoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHVkcF9zcmNfbWluPSV1IiwgcGt0X2Rldi0+dWRwX3NyY19taW4pOwoJCXJldHVybiBjb3VudDsKCX0KIAlpZiAoIXN0cmNtcChuYW1lLCAidWRwX2RzdF9taW4iKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT51ZHBfZHN0X21pbikgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfZHN0X21pbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX2RzdCA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHVkcF9kc3RfbWluPSV1IiwgcGt0X2Rldi0+dWRwX2RzdF9taW4pOwoJCXJldHVybiBjb3VudDsKCX0KIAlpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyY19tYXgiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT51ZHBfc3JjX21heCkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfc3JjX21heCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHVkcF9zcmNfbWF4PSV1IiwgcGt0X2Rldi0+dWRwX3NyY19tYXgpOwoJCXJldHVybiBjb3VudDsKCX0KIAlpZiAoIXN0cmNtcChuYW1lLCAidWRwX2RzdF9tYXgiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBwa3RfZGV2LT51ZHBfZHN0X21heCkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT51ZHBfZHN0X21heCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX2RzdCA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHVkcF9kc3RfbWF4PSV1IiwgcGt0X2Rldi0+dWRwX2RzdF9tYXgpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJjbG9uZV9za2IiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmNsb25lX3NrYiA9IHZhbHVlOwoJCgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogY2xvbmVfc2tiPSVkIiwgcGt0X2Rldi0+Y2xvbmVfc2tiKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiY291bnQiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlwa3RfZGV2LT5jb3VudCA9IHZhbHVlOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGNvdW50PSVsbHUiLAoJCQkodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5jb3VudCk7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgInNyY19tYWNfY291bnQiKSkgewoJCWxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCQlpICs9IGxlbjsKCQlpZiAocGt0X2Rldi0+c3JjX21hY19jb3VudCAhPSB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5zcmNfbWFjX2NvdW50ID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9zcmNfbWFjX29mZnNldCA9IDA7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjX21hY19jb3VudD0lZCIsIHBrdF9kZXYtPnNyY19tYWNfY291bnQpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3RfbWFjX2NvdW50IikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHBrdF9kZXYtPmRzdF9tYWNfY291bnQgIT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZHN0X21hY19jb3VudCA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfZHN0X21hY19vZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgfQoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdF9tYWNfY291bnQ9JWQiLCBwa3RfZGV2LT5kc3RfbWFjX2NvdW50KTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZmxhZyIpKSB7CiAgICAgICAgICAgICAgICBjaGFyIGZbMzJdOwogICAgICAgICAgICAgICAgbWVtc2V0KGYsIDAsIDMyKTsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihmKSAtIDEpOwogICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsgcmV0dXJuIGxlbjsgfQoJCWlmIChjb3B5X2Zyb21fdXNlcihmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwoJCWkgKz0gbGVuOwogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChmLCAiSVBTUkNfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfSVBTUkNfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFJUFNSQ19STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfSVBTUkNfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIlRYU0laRV9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9UWFNJWkVfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFUWFNJWkVfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX1RYU0laRV9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiSVBEU1RfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfSVBEU1RfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFJUERTVF9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfSVBEU1RfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIlVEUFNSQ19STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9VRFBTUkNfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFVRFBTUkNfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX1VEUFNSQ19STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiVURQRFNUX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyB8PSBGX1VEUERTVF9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChmLCAiIVVEUERTVF9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgJj0gfkZfVURQRFNUX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICJNQUNTUkNfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzIHw9IEZfTUFDU1JDX1JORDsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGYsICIhTUFDU1JDX1JORCIpID09IDApIAogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5mbGFncyAmPSB+Rl9NQUNTUkNfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIk1BQ0RTVF9STkQiKSA9PSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+ZmxhZ3MgfD0gRl9NQUNEU1RfUk5EOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoZiwgIiFNQUNEU1RfUk5EIikgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmZsYWdzICY9IH5GX01BQ0RTVF9STkQ7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIkZsYWcgLTolczotIHVua25vd25cbkF2YWlsYWJsZSBmbGFncywgKHByZXBlbmQgISB0byB1bi1zZXQgZmxhZyk6XG4lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVBTUkNfUk5ELCBJUERTVF9STkQsIFRYU0laRV9STkQsIFVEUFNSQ19STkQsIFVEUERTVF9STkQsIE1BQ1NSQ19STkQsIE1BQ0RTVF9STkRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgICAgICAgICB9CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZmxhZ3M9MHgleCIsIHBrdF9kZXYtPmZsYWdzKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0X21pbiIpIHx8ICFzdHJjbXAobmFtZSwgImRzdCIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YocGt0X2Rldi0+ZHN0X21pbikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KCiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChidWYsIHBrdF9kZXYtPmRzdF9taW4pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYtPmRzdF9taW4sIDAsIHNpemVvZihwa3RfZGV2LT5kc3RfbWluKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocGt0X2Rldi0+ZHN0X21pbiwgYnVmLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5kYWRkcl9taW4gPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9taW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5kYWRkcl9taW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihkZWJ1ZykKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGRzdF9taW4gc2V0IHRvOiAlc1xuIiwgcGt0X2Rldi0+ZHN0X21pbik7CiAgICAgICAgICAgICAgICBpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3RfbWluPSVzIiwgcGt0X2Rldi0+ZHN0X21pbik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgImRzdF9tYXgiKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHBrdF9kZXYtPmRzdF9tYXgpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgogICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgJnVzZXJfYnVmZmVyW2ldLCBsZW4pKQoJCQlyZXR1cm4gLUVGQVVMVDsKCiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgcGt0X2Rldi0+ZHN0X21heCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGt0X2Rldi0+ZHN0X21heCwgMCwgc2l6ZW9mKHBrdF9kZXYtPmRzdF9tYXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5kc3RfbWF4LCBidWYsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmRhZGRyX21heCA9IGluX2F0b24ocGt0X2Rldi0+ZHN0X21heCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9kYWRkciA9IHBrdF9kZXYtPmRhZGRyX21heDsKICAgICAgICAgICAgICAgIH0KCQlpZihkZWJ1ZykKCQkJcHJpbnRrKCJwa3RnZW46IGRzdF9tYXggc2V0IHRvOiAlc1xuIiwgcGt0X2Rldi0+ZHN0X21heCk7CgkJaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogZHN0X21heD0lcyIsIHBrdF9kZXYtPmRzdF9tYXgpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3Q2IikpIHsKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihidWYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgcmV0dXJuIGxlbjsgCgoJCXBrdF9kZXYtPmZsYWdzIHw9IEZfSVBWNjsKCiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwoKCQlzY2FuX2lwNihidWYsIHBrdF9kZXYtPmluNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGJ1ZiwgIHBrdF9kZXYtPmluNl9kYWRkci5zNl9hZGRyKTsKCgkJaXB2Nl9hZGRyX2NvcHkoJnBrdF9kZXYtPmN1cl9pbjZfZGFkZHIsICZwa3RfZGV2LT5pbjZfZGFkZHIpOwoKICAgICAgICAgICAgICAgIGlmKGRlYnVnKSAKCQkJcHJpbnRrKCJwa3RnZW46IGRzdDYgc2V0IHRvOiAlc1xuIiwgYnVmKTsKCiAgICAgICAgICAgICAgICBpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3Q2PSVzIiwgYnVmKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0Nl9taW4iKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSByZXR1cm4gbGVuOyAKCgkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OwoKICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CgoJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGJ1ZiwgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcik7CgoJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X2RhZGRyLCAmcGt0X2Rldi0+bWluX2luNl9kYWRkcik7CiAgICAgICAgICAgICAgICBpZihkZWJ1ZykgCgkJCXByaW50aygicGt0Z2VuOiBkc3Q2X21pbiBzZXQgdG86ICVzXG4iLCBidWYpOwoKICAgICAgICAgICAgICAgIGkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdDZfbWluPSVzIiwgYnVmKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAiZHN0Nl9tYXgiKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSByZXR1cm4gbGVuOyAKCgkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OwoKICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CgoJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyKTsKCQlmbXRfaXA2KGJ1ZiwgIHBrdF9kZXYtPm1heF9pbjZfZGFkZHIuczZfYWRkcik7CgogICAgICAgICAgICAgICAgaWYoZGVidWcpIAoJCQlwcmludGsoInBrdGdlbjogZHN0Nl9tYXggc2V0IHRvOiAlc1xuIiwgYnVmKTsKCiAgICAgICAgICAgICAgICBpICs9IGxlbjsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBkc3Q2X21heD0lcyIsIGJ1Zik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgInNyYzYiKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGJ1ZikgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSByZXR1cm4gbGVuOyAKCgkJcGt0X2Rldi0+ZmxhZ3MgfD0gRl9JUFY2OwoKICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CgoJCXNjYW5faXA2KGJ1ZiwgcGt0X2Rldi0+aW42X3NhZGRyLnM2X2FkZHIpOwoJCWZtdF9pcDYoYnVmLCAgcGt0X2Rldi0+aW42X3NhZGRyLnM2X2FkZHIpOwoKCQlpcHY2X2FkZHJfY29weSgmcGt0X2Rldi0+Y3VyX2luNl9zYWRkciwgJnBrdF9kZXYtPmluNl9zYWRkcik7CgogICAgICAgICAgICAgICAgaWYoZGVidWcpIAoJCQlwcmludGsoInBrdGdlbjogc3JjNiBzZXQgdG86ICVzXG4iLCBidWYpOwoJCQogICAgICAgICAgICAgICAgaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjNj0lcyIsIGJ1Zik7CgkJcmV0dXJuIGNvdW50OwoJfQoJaWYgKCFzdHJjbXAobmFtZSwgInNyY19taW4iKSkgewoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKHBrdF9kZXYtPnNyY19taW4pIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CiAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikpCgkJCXJldHVybiAtRUZBVUxUOwogICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChidWYsIHBrdF9kZXYtPnNyY19taW4pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBrdF9kZXYtPnNyY19taW4sIDAsIHNpemVvZihwa3RfZGV2LT5zcmNfbWluKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocGt0X2Rldi0+c3JjX21pbiwgYnVmLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5zYWRkcl9taW4gPSBpbl9hdG9uKHBrdF9kZXYtPnNyY19taW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc2FkZHIgPSBwa3RfZGV2LT5zYWRkcl9taW47CiAgICAgICAgICAgICAgICB9CgkJaWYoZGVidWcpCgkJCXByaW50aygicGt0Z2VuOiBzcmNfbWluIHNldCB0bzogJXNcbiIsIHBrdF9kZXYtPnNyY19taW4pOwoJCWkgKz0gbGVuOwoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IHNyY19taW49JXMiLCBwa3RfZGV2LT5zcmNfbWluKTsKCQlyZXR1cm4gY291bnQ7Cgl9CglpZiAoIXN0cmNtcChuYW1lLCAic3JjX21heCIpKSB7CgkJbGVuID0gc3Rybl9sZW4oJnVzZXJfYnVmZmVyW2ldLCBzaXplb2YocGt0X2Rldi0+c3JjX21heCkgLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7IHJldHVybiBsZW47IH0KICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihidWYsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CiAgICAgICAgICAgICAgICBidWZbbGVuXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgcGt0X2Rldi0+c3JjX21heCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocGt0X2Rldi0+c3JjX21heCwgMCwgc2l6ZW9mKHBrdF9kZXYtPnNyY19tYXgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwa3RfZGV2LT5zcmNfbWF4LCBidWYsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPnNhZGRyX21heCA9IGluX2F0b24ocGt0X2Rldi0+c3JjX21heCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9zYWRkciA9IHBrdF9kZXYtPnNhZGRyX21heDsKICAgICAgICAgICAgICAgIH0KCQlpZihkZWJ1ZykKCQkJcHJpbnRrKCJwa3RnZW46IHNyY19tYXggc2V0IHRvOiAlc1xuIiwgcGt0X2Rldi0+c3JjX21heCk7CgkJaSArPSBsZW47CgkJc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjX21heD0lcyIsIHBrdF9kZXYtPnNyY19tYXgpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJkc3RfbWFjIikpIHsKCQljaGFyICp2ID0gdmFsc3RyOwogICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBvbGRfZG1hY1s2XTsKCQl1bnNpZ25lZCBjaGFyICptID0gcGt0X2Rldi0+ZHN0X21hYzsKICAgICAgICAgICAgICAgIG1lbWNweShvbGRfZG1hYywgcGt0X2Rldi0+ZHN0X21hYywgNik7CiAgICAgICAgICAgICAgICAKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZih2YWxzdHIpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJbWVtc2V0KHZhbHN0ciwgMCwgc2l6ZW9mKHZhbHN0cikpOwoJCWlmKCBjb3B5X2Zyb21fdXNlcih2YWxzdHIsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJaSArPSBsZW47CgoJCWZvcigqbSA9IDA7KnYgJiYgbSA8IHBrdF9kZXYtPmRzdF9tYWMgKyA2OyB2KyspIHsKCQkJaWYgKCp2ID49ICcwJyAmJiAqdiA8PSAnOScpIHsKCQkJCSptICo9IDE2OwoJCQkJKm0gKz0gKnYgLSAnMCc7CgkJCX0KCQkJaWYgKCp2ID49ICdBJyAmJiAqdiA8PSAnRicpIHsKCQkJCSptICo9IDE2OwoJCQkJKm0gKz0gKnYgLSAnQScgKyAxMDsKCQkJfQoJCQlpZiAoKnYgPj0gJ2EnICYmICp2IDw9ICdmJykgewoJCQkJKm0gKj0gMTY7CgkJCQkqbSArPSAqdiAtICdhJyArIDEwOwoJCQl9CgkJCWlmICgqdiA9PSAnOicpIHsKCQkJCW0rKzsKCQkJCSptID0gMDsKCQkJfQoJCX0KCgkJLyogU2V0IHVwIERlc3QgTUFDICovCiAgICAgICAgICAgICAgICBpZiAobWVtY21wKG9sZF9kbWFjLCBwa3RfZGV2LT5kc3RfbWFjLCA2KSAhPSAwKSAKICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCYocGt0X2Rldi0+aGhbMF0pLCBwa3RfZGV2LT5kc3RfbWFjLCA2KTsKICAgICAgICAgICAgICAgIAoJCXNwcmludGYocGdfcmVzdWx0LCAiT0s6IGRzdG1hYyIpOwoJCXJldHVybiBjb3VudDsKCX0KCWlmICghc3RyY21wKG5hbWUsICJzcmNfbWFjIikpIHsKCQljaGFyICp2ID0gdmFsc3RyOwoJCXVuc2lnbmVkIGNoYXIgKm0gPSBwa3RfZGV2LT5zcmNfbWFjOwoKCQlsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZih2YWxzdHIpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJbWVtc2V0KHZhbHN0ciwgMCwgc2l6ZW9mKHZhbHN0cikpOwoJCWlmKCBjb3B5X2Zyb21fdXNlcih2YWxzdHIsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkgCgkJCXJldHVybiAtRUZBVUxUOwoJCWkgKz0gbGVuOwoKCQlmb3IoKm0gPSAwOyp2ICYmIG0gPCBwa3RfZGV2LT5zcmNfbWFjICsgNjsgdisrKSB7CgkJCWlmICgqdiA+PSAnMCcgJiYgKnYgPD0gJzknKSB7CgkJCQkqbSAqPSAxNjsKCQkJCSptICs9ICp2IC0gJzAnOwoJCQl9CgkJCWlmICgqdiA+PSAnQScgJiYgKnYgPD0gJ0YnKSB7CgkJCQkqbSAqPSAxNjsKCQkJCSptICs9ICp2IC0gJ0EnICsgMTA7CgkJCX0KCQkJaWYgKCp2ID49ICdhJyAmJiAqdiA8PSAnZicpIHsKCQkJCSptICo9IDE2OwoJCQkJKm0gKz0gKnYgLSAnYScgKyAxMDsKCQkJfQoJCQlpZiAoKnYgPT0gJzonKSB7CgkJCQltKys7CgkJCQkqbSA9IDA7CgkJCX0KCQl9CSAgCgogICAgICAgICAgICAgICAgc3ByaW50ZihwZ19yZXN1bHQsICJPSzogc3JjbWFjIik7CgkJcmV0dXJuIGNvdW50OwoJfQoKICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAiY2xlYXJfY291bnRlcnMiKSkgewogICAgICAgICAgICAgICAgcGt0Z2VuX2NsZWFyX2NvdW50ZXJzKHBrdF9kZXYpOwogICAgICAgICAgICAgICAgc3ByaW50ZihwZ19yZXN1bHQsICJPSzogQ2xlYXJpbmcgY291bnRlcnMuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICB9CgoJaWYgKCFzdHJjbXAobmFtZSwgImZsb3dzIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJaWYgKHZhbHVlID4gTUFYX0NGTE9XUykKCQkJdmFsdWUgPSBNQVhfQ0ZMT1dTOwoKCQlwa3RfZGV2LT5jZmxvd3MgPSB2YWx1ZTsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBmbG93cz0ldSIsIHBrdF9kZXYtPmNmbG93cyk7CgkJcmV0dXJuIGNvdW50OwoJfQoKCWlmICghc3RyY21wKG5hbWUsICJmbG93bGVuIikpIHsKCQlsZW4gPSBudW1fYXJnKCZ1c2VyX2J1ZmZlcltpXSwgMTAsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyByZXR1cm4gbGVuOyB9CgkJaSArPSBsZW47CgkJcGt0X2Rldi0+bGZsb3cgPSB2YWx1ZTsKCQlzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBmbG93bGVuPSV1IiwgcGt0X2Rldi0+bGZsb3cpOwoJCXJldHVybiBjb3VudDsKCX0KICAgICAgICAKCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gc3VjaCBwYXJhbWV0ZXIgXCIlc1wiIiwgbmFtZSk7CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIGludCBwa3RnZW5faWZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHBrdGdlbl9pZl9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGt0Z2VuX2lmX2ZvcHMgPSB7Cgkub3duZXIJICA9IFRISVNfTU9EVUxFLAoJLm9wZW4JICA9IHBrdGdlbl9pZl9vcGVuLAogICAgICAgIC5yZWFkICAgICA9IHNlcV9yZWFkLAoJLmxsc2VlawkgID0gc2VxX2xzZWVrLAogICAgICAgIC53cml0ZSAgICA9IHBrdGdlbl9pZl93cml0ZSwKCS5yZWxlYXNlICA9IHNpbmdsZV9yZWxlYXNlLAp9OwoKc3RhdGljIGludCBwa3RnZW5fdGhyZWFkX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHNlcS0+cHJpdmF0ZTsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CgoJQlVHX09OKCF0KTsKCglzZXFfcHJpbnRmKHNlcSwgIk5hbWU6ICVzICBtYXhfYmVmb3JlX3NvZnRpcnE6ICVkXG4iLAogICAgICAgICAgICAgICAgICAgICB0LT5uYW1lLCB0LT5tYXhfYmVmb3JlX3NvZnRpcnEpOwoKICAgICAgICBzZXFfcHJpbnRmKHNlcSwgIlJ1bm5pbmc6ICIpOwogICAgICAgIAogICAgICAgIGlmX2xvY2sodCk7CiAgICAgICAgZm9yKHBrdF9kZXYgPSB0LT5pZl9saXN0O3BrdF9kZXY7IHBrdF9kZXYgPSBwa3RfZGV2LT5uZXh0KSAKCQlpZihwa3RfZGV2LT5ydW5uaW5nKQoJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHBrdF9kZXYtPmlmbmFtZSk7CiAgICAgICAgCiAgICAgICAgc2VxX3ByaW50ZihzZXEsICJcblN0b3BwZWQ6ICIpOwoKICAgICAgICBmb3IocGt0X2RldiA9IHQtPmlmX2xpc3Q7cGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQpIAoJCWlmKCFwa3RfZGV2LT5ydW5uaW5nKQoJCQlzZXFfcHJpbnRmKHNlcSwgIiVzICIsIHBrdF9kZXYtPmlmbmFtZSk7CgoJaWYgKHQtPnJlc3VsdFswXSkKCQlzZXFfcHJpbnRmKHNlcSwgIlxuUmVzdWx0OiAlc1xuIiwgdC0+cmVzdWx0KTsKCWVsc2UKCQlzZXFfcHJpbnRmKHNlcSwgIlxuUmVzdWx0OiBOQVxuIik7CgogICAgICAgIGlmX3VubG9jayh0KTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHNzaXplX3QgcGt0Z2VuX3RocmVhZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwKCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCnsKCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gKHN0cnVjdCBzZXFfZmlsZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBzZXEtPnByaXZhdGU7CglpbnQgaSA9IDAsIG1heCwgbGVuLCByZXQ7CgljaGFyIG5hbWVbNDBdOwogICAgICAgIGNoYXIgKnBnX3Jlc3VsdDsKICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKCglpZiAoY291bnQgPCAxKSB7CgkJLy8Jc3ByaW50ZihwZ19yZXN1bHQsICJXcm9uZyBjb21tYW5kIGZvcm1hdCIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCW1heCA9IGNvdW50IC0gaTsKICAgICAgICBsZW4gPSBjb3VudF90cmFpbF9jaGFycygmdXNlcl9idWZmZXJbaV0sIG1heCk7CiAgICAgICAgaWYgKGxlbiA8IDApCgkJcmV0dXJuIGxlbjsKCglpICs9IGxlbjsKCgkvKiBSZWFkIHZhcmlhYmxlIG5hbWUgKi8KCglsZW4gPSBzdHJuX2xlbigmdXNlcl9idWZmZXJbaV0sIHNpemVvZihuYW1lKSAtIDEpOwogICAgICAgIGlmIChsZW4gPCAwKQoJCXJldHVybiBsZW47CgkKCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOwoJaWYgKGNvcHlfZnJvbV91c2VyKG5hbWUsICZ1c2VyX2J1ZmZlcltpXSwgbGVuKSkKCQlyZXR1cm4gLUVGQVVMVDsKCWkgKz0gbGVuOwoKCW1heCA9IGNvdW50IC1pOwoJbGVuID0gY291bnRfdHJhaWxfY2hhcnMoJnVzZXJfYnVmZmVyW2ldLCBtYXgpOwogICAgICAgIGlmIChsZW4gPCAwKQoJCXJldHVybiBsZW47CgoJaSArPSBsZW47CgoJaWYgKGRlYnVnKQoJCXByaW50aygicGt0Z2VuOiB0PSVzLCBjb3VudD0lbHVcbiIsIG5hbWUsCgkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjb3VudCk7CgoJaWYoIXQpIHsKCQlwcmludGsoInBrdGdlbjogRVJST1I6IE5vIHRocmVhZFxuIik7CgkJcmV0ID0gLUVJTlZBTDsKCQlnb3RvIG91dDsKCX0KCglwZ19yZXN1bHQgPSAmKHQtPnJlc3VsdFswXSk7CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfZGV2aWNlIikpIHsKICAgICAgICAgICAgICAgIGNoYXIgZlszMl07CiAgICAgICAgICAgICAgICBtZW1zZXQoZiwgMCwgMzIpOwoJCWxlbiA9IHN0cm5fbGVuKCZ1c2VyX2J1ZmZlcltpXSwgc2l6ZW9mKGYpIC0gMSk7CiAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgeyAKCQkJcmV0ID0gbGVuOyAKCQkJZ290byBvdXQ7CgkJfQoJCWlmKCBjb3B5X2Zyb21fdXNlcihmLCAmdXNlcl9idWZmZXJbaV0sIGxlbikgKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlpICs9IGxlbjsKCQl0aHJlYWRfbG9jaygpOwogICAgICAgICAgICAgICAgcGt0Z2VuX2FkZF9kZXZpY2UodCwgZik7CgkJdGhyZWFkX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBhZGRfZGV2aWNlPSVzIiwgZik7CgkJZ290byBvdXQ7Cgl9CgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJyZW1fZGV2aWNlX2FsbCIpKSB7CgkJdGhyZWFkX2xvY2soKTsKCQl0LT5jb250cm9sIHw9IFRfUkVNREVWOwoJCXRocmVhZF91bmxvY2soKTsKCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMjUpKTsgIC8qIFByb3BhZ2F0ZSB0aHJlYWQtPmNvbnRyb2wgICovCgkJcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiByZW1fZGV2aWNlX2FsbCIpOwoJCWdvdG8gb3V0OwoJfQoKICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCAibWF4X2JlZm9yZV9zb2Z0aXJxIikpIHsKICAgICAgICAgICAgICAgIGxlbiA9IG51bV9hcmcoJnVzZXJfYnVmZmVyW2ldLCAxMCwgJnZhbHVlKTsKCQl0aHJlYWRfbG9jaygpOwogICAgICAgICAgICAgICAgdC0+bWF4X2JlZm9yZV9zb2Z0aXJxID0gdmFsdWU7CgkJdGhyZWFkX3VubG9jaygpOwogICAgICAgICAgICAgICAgcmV0ID0gY291bnQ7CiAgICAgICAgICAgICAgICBzcHJpbnRmKHBnX3Jlc3VsdCwgIk9LOiBtYXhfYmVmb3JlX3NvZnRpcnE9JWx1IiwgdmFsdWUpOwoJCWdvdG8gb3V0OwoJfQoKCXJldCA9IC1FSU5WQUw7CiBvdXQ6CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBwa3RnZW5fdGhyZWFkX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwa3RnZW5fdGhyZWFkX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwp9CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwa3RnZW5fdGhyZWFkX2ZvcHMgPSB7Cgkub3duZXIJICA9IFRISVNfTU9EVUxFLAoJLm9wZW4JICA9IHBrdGdlbl90aHJlYWRfb3BlbiwKICAgICAgICAucmVhZCAgICAgPSBzZXFfcmVhZCwKCS5sbHNlZWsJICA9IHNlcV9sc2VlaywKICAgICAgICAud3JpdGUgICAgPSBwa3RnZW5fdGhyZWFkX3dyaXRlLAoJLnJlbGVhc2UgID0gc2luZ2xlX3JlbGVhc2UsCn07CgovKiBUaGluayBmaW5kIG9yIHJlbW92ZSBmb3IgTk4gKi8Kc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpfX3BrdGdlbl9OTl90aHJlYWRzKGNvbnN0IGNoYXIqIGlmbmFtZSwgaW50IHJlbW92ZSkgCnsKCXN0cnVjdCBwa3RnZW5fdGhyZWFkICp0OwoJc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYgPSBOVUxMOwoKICAgICAgICB0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgICAgICAgICAKCXdoaWxlICh0KSB7CgkJcGt0X2RldiA9IHBrdGdlbl9maW5kX2Rldih0LCBpZm5hbWUpOwoJCWlmIChwa3RfZGV2KSB7CgkJICAgICAgICAgICAgICAgIGlmKHJlbW92ZSkgeyAKCQkJCSAgICAgICAgaWZfbG9jayh0KTsKCQkJCSAgICAgICAgcGt0Z2VuX3JlbW92ZV9kZXZpY2UodCwgcGt0X2Rldik7CgkJCQkgICAgICAgIGlmX3VubG9jayh0KTsKCQkJCX0KCQkJYnJlYWs7CgkJfQoJCXQgPSB0LT5uZXh0OwoJfQogICAgICAgIHJldHVybiBwa3RfZGV2Owp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKnBrdGdlbl9OTl90aHJlYWRzKGNvbnN0IGNoYXIqIGlmbmFtZSwgaW50IHJlbW92ZSkgCnsKCXN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2ID0gTlVMTDsKCXRocmVhZF9sb2NrKCk7Cglwa3RfZGV2ID0gX19wa3RnZW5fTk5fdGhyZWFkcyhpZm5hbWUsIHJlbW92ZSk7CiAgICAgICAgdGhyZWFkX3VubG9jaygpOwoJcmV0dXJuIHBrdF9kZXY7Cn0KCnN0YXRpYyBpbnQgcGt0Z2VuX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKSAKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKShwdHIpOwoKCS8qIEl0IGlzIE9LIHRoYXQgd2UgZG8gbm90IGhvbGQgdGhlIGdyb3VwIGxvY2sgcmlnaHQgbm93LAoJICogYXMgd2UgcnVuIHVuZGVyIHRoZSBSVE5MIGxvY2suCgkgKi8KCglzd2l0Y2ggKGV2ZW50KSB7CgljYXNlIE5FVERFVl9DSEFOR0VBRERSOgoJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKCWNhc2UgTkVUREVWX0RPV046CgljYXNlIE5FVERFVl9VUDoKCQkvKiBJZ25vcmUgZm9yIG5vdyAqLwoJCWJyZWFrOwoJCQoJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKICAgICAgICAgICAgICAgIHBrdGdlbl9OTl90aHJlYWRzKGRldi0+bmFtZSwgUkVNT1ZFKTsKCQlicmVhazsKCX07CgoJcmV0dXJuIE5PVElGWV9ET05FOwp9CgovKiBBc3NvY2lhdGUgcGt0Z2VuX2RldiB3aXRoIGEgZGV2aWNlLiAqLwoKc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlKiBwa3RnZW5fc2V0dXBfZGV2KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSB7CglzdHJ1Y3QgbmV0X2RldmljZSAqb2RldjsKCgkvKiBDbGVhbiBvbGQgc2V0dXBzICovCgoJaWYgKHBrdF9kZXYtPm9kZXYpIHsKCQlkZXZfcHV0KHBrdF9kZXYtPm9kZXYpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+b2RldiA9IE5VTEw7CiAgICAgICAgfQoKCW9kZXYgPSBkZXZfZ2V0X2J5X25hbWUocGt0X2Rldi0+aWZuYW1lKTsKCglpZiAoIW9kZXYpIHsKCQlwcmludGsoInBrdGdlbjogbm8gc3VjaCBuZXRkZXZpY2U6IFwiJXNcIlxuIiwgcGt0X2Rldi0+aWZuYW1lKTsKCQlnb3RvIG91dDsKCX0KCWlmIChvZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikgewoJCXByaW50aygicGt0Z2VuOiBub3QgYW4gZXRoZXJuZXQgZGV2aWNlOiBcIiVzXCJcbiIsIHBrdF9kZXYtPmlmbmFtZSk7CgkJZ290byBvdXRfcHV0OwoJfQoJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CgkJcHJpbnRrKCJwa3RnZW46IGRldmljZSBpcyBkb3duOiBcIiVzXCJcbiIsIHBrdF9kZXYtPmlmbmFtZSk7CgkJZ290byBvdXRfcHV0OwoJfQoJcGt0X2Rldi0+b2RldiA9IG9kZXY7CgkKICAgICAgICByZXR1cm4gcGt0X2Rldi0+b2RldjsKCm91dF9wdXQ6CglkZXZfcHV0KG9kZXYpOwpvdXQ6CiAJcmV0dXJuIE5VTEw7Cgp9CgovKiBSZWFkIHBrdF9kZXYgZnJvbSB0aGUgaW50ZXJmYWNlIGFuZCBzZXQgdXAgaW50ZXJuYWwgcGt0Z2VuX2RldgogKiBzdHJ1Y3R1cmUgdG8gaGF2ZSB0aGUgcmlnaHQgaW5mb3JtYXRpb24gdG8gY3JlYXRlL3NlbmQgcGFja2V0cwogKi8Kc3RhdGljIHZvaWQgcGt0Z2VuX3NldHVwX2luamVjdChzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKewoJLyogVHJ5IG9uY2UgbW9yZSwganVzdCBpbiBjYXNlIGl0IHdvcmtzIG5vdy4gKi8KICAgICAgICBpZiAoIXBrdF9kZXYtPm9kZXYpIAogICAgICAgICAgICAgICAgcGt0Z2VuX3NldHVwX2Rldihwa3RfZGV2KTsKICAgICAgICAKICAgICAgICBpZiAoIXBrdF9kZXYtPm9kZXYpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogcGt0X2Rldi0+b2RldiA9PSBOVUxMIGluIHNldHVwX2luamVjdC5cbiIpOwogICAgICAgICAgICAgICAgc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJFUlJPUjogcGt0X2Rldi0+b2RldiA9PSBOVUxMIGluIHNldHVwX2luamVjdC5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBpbnRlcmZhY2UncyBtYWMgaWYgbm90IGV4cGxpY2l0bHkgc2V0LiAqLwoKCWlmICgocGt0X2Rldi0+c3JjX21hY1swXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1sxXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1syXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1szXSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s0XSA9PSAwKSAmJiAKCSAgICAocGt0X2Rldi0+c3JjX21hY1s1XSA9PSAwKSkgewoKCSAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFs2XSksIHBrdF9kZXYtPm9kZXYtPmRldl9hZGRyLCA2KTsKICAgICAgIH0KICAgICAgICAvKiBTZXQgdXAgRGVzdCBNQUMgKi8KICAgICAgICBtZW1jcHkoJihwa3RfZGV2LT5oaFswXSksIHBrdF9kZXYtPmRzdF9tYWMsIDYpOwoKICAgICAgICAvKiBTZXQgdXAgcGt0IHNpemUgKi8KICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSBwa3RfZGV2LT5taW5fcGt0X3NpemU7CgkKCWlmKHBrdF9kZXYtPmZsYWdzICYgRl9JUFY2KSB7CgkJLyoKCQkgKiBTa2lwIHRoaXMgYXV0b21hdGljIGFkZHJlc3Mgc2V0dGluZyB1bnRpbCBsb2NrcyBvciBmdW5jdGlvbnMgCgkJICogZ2V0cyBleHBvcnRlZAoJCSAqLwoKI2lmZGVmIE5PVE5PVwoJCWludCBpLCBzZXQgPSAwLCBlcnI9MTsKCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwoKCQlmb3IoaT0wOyBpPCBJTjZfQUREUl9IU0laRTsgaSsrKQoJCQlpZihwa3RfZGV2LT5jdXJfaW42X3NhZGRyLnM2X2FkZHJbaV0pIHsKCQkJCXNldCA9IDE7CgkJCQlicmVhazsKCQkJfQoKCQlpZighc2V0KSB7CgkJCQoJCQkvKgoJCQkgKiBVc2UgbGlua2xldmVsIGFkZHJlc3MgaWYgdW5jb25maWd1cmVkLgoJCQkgKgoJCQkgKiB1c2UgaXB2Nl9nZXRfbGxhZGRyIGlmL3doZW4gaXQncyBnZXQgZXhwb3J0ZWQKCQkJICovCgoKCQkJcmVhZF9sb2NrKCZhZGRyY29uZl9sb2NrKTsKCQkJaWYgKChpZGV2ID0gX19pbjZfZGV2X2dldChwa3RfZGV2LT5vZGV2KSkgIT0gTlVMTCkgewoJCQkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOwoKCQkJCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CgkJCQlmb3IgKGlmcD1pZGV2LT5hZGRyX2xpc3Q7IGlmcDsgaWZwPWlmcC0+aWZfbmV4dCkgewoJCQkJCWlmIChpZnAtPnNjb3BlID09IElGQV9MSU5LICYmICEoaWZwLT5mbGFncyZJRkFfRl9URU5UQVRJVkUpKSB7CgkJCQkJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X3NhZGRyLCAmaWZwLT5hZGRyKTsKCQkJCQkJZXJyID0gMDsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQkJcmVhZF91bmxvY2tfYmgoJmlkZXYtPmxvY2spOwoJCQl9CgkJCXJlYWRfdW5sb2NrKCZhZGRyY29uZl9sb2NrKTsKCQkJaWYoZXJyKQlwcmludGsoInBrdGdlbjogRVJST1I6IElQdjYgbGluayBhZGRyZXNzIG5vdCBhdmFpbGJsZS5cbiIpOwoJCX0KI2VuZGlmCgl9IAoJZWxzZSB7CgkJcGt0X2Rldi0+c2FkZHJfbWluID0gMDsKCQlwa3RfZGV2LT5zYWRkcl9tYXggPSAwOwoJCWlmIChzdHJsZW4ocGt0X2Rldi0+c3JjX21pbikgPT0gMCkgewoJCQkKCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OyAKCgkJCXJjdV9yZWFkX2xvY2soKTsKCQkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShwa3RfZGV2LT5vZGV2KTsKCQkJaWYgKGluX2RldikgewoJCQkJaWYgKGluX2Rldi0+aWZhX2xpc3QpIHsKCQkJCQlwa3RfZGV2LT5zYWRkcl9taW4gPSBpbl9kZXYtPmlmYV9saXN0LT5pZmFfYWRkcmVzczsKCQkJCQlwa3RfZGV2LT5zYWRkcl9tYXggPSBwa3RfZGV2LT5zYWRkcl9taW47CgkJCQl9CgkJCX0KCQkJcmN1X3JlYWRfdW5sb2NrKCk7CgkJfQoJCWVsc2UgewoJCQlwa3RfZGV2LT5zYWRkcl9taW4gPSBpbl9hdG9uKHBrdF9kZXYtPnNyY19taW4pOwoJCQlwa3RfZGV2LT5zYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPnNyY19tYXgpOwoJCX0KCgkJcGt0X2Rldi0+ZGFkZHJfbWluID0gaW5fYXRvbihwa3RfZGV2LT5kc3RfbWluKTsKCQlwa3RfZGV2LT5kYWRkcl9tYXggPSBpbl9hdG9uKHBrdF9kZXYtPmRzdF9tYXgpOwoJfQogICAgICAgIC8qIEluaXRpYWxpemUgY3VycmVudCB2YWx1ZXMuICovCiAgICAgICAgcGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0ID0gMDsKICAgICAgICBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPSAwOwogICAgICAgIHBrdF9kZXYtPmN1cl9zYWRkciA9IHBrdF9kZXYtPnNhZGRyX21pbjsKICAgICAgICBwa3RfZGV2LT5jdXJfZGFkZHIgPSBwa3RfZGV2LT5kYWRkcl9taW47CiAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9kc3QgPSBwa3RfZGV2LT51ZHBfZHN0X21pbjsKICAgICAgICBwa3RfZGV2LT5jdXJfdWRwX3NyYyA9IHBrdF9kZXYtPnVkcF9zcmNfbWluOwoJcGt0X2Rldi0+bmZsb3dzID0gMDsKfQoKc3RhdGljIHZvaWQgc3BpbihzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiwgX191NjQgc3Bpbl91bnRpbF91cykKewoJX191NjQgc3RhcnQ7CglfX3U2NCBub3c7CgoJc3RhcnQgPSBub3cgPSBnZXRDdXJVcygpOwoJcHJpbnRrKEtFUk5fSU5GTyAic2xlZXBpbmcgZm9yICVkXG4iLCAoaW50KShzcGluX3VudGlsX3VzIC0gbm93KSk7Cgl3aGlsZSAobm93IDwgc3Bpbl91bnRpbF91cykgewoJCS8qIFRPRE86IG9wdGltaXplIHNsZWVwaW5nIGJlaGF2aW9yICovCgkJaWYgKHNwaW5fdW50aWxfdXMgLSBub3cgPiBqaWZmaWVzX3RvX3VzZWNzKDEpKzEpCgkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgxKTsKCQllbHNlIGlmIChzcGluX3VudGlsX3VzIC0gbm93ID4gMTAwKSB7CgkJCWRvX3NvZnRpcnEoKTsKCQkJaWYgKCFwa3RfZGV2LT5ydW5uaW5nKQoJCQkJcmV0dXJuOwoJCQlpZiAobmVlZF9yZXNjaGVkKCkpCgkJCQlzY2hlZHVsZSgpOwoJCX0KCgkJbm93ID0gZ2V0Q3VyVXMoKTsKCX0KCglwa3RfZGV2LT5pZGxlX2FjYyArPSBub3cgLSBzdGFydDsKfQoKCi8qIEluY3JlbWVudC9yYW5kb21pemUgaGVhZGVycyBhY2NvcmRpbmcgdG8gZmxhZ3MgYW5kIGN1cnJlbnQgdmFsdWVzCiAqIGZvciBJUCBzcmMvZGVzdCwgVURQIHNyYy9kc3QgcG9ydCwgTUFDLUFkZHIgc3JjL2RzdAogKi8Kc3RhdGljIHZvaWQgbW9kX2N1cl9oZWFkZXJzKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSB7ICAgICAgICAKICAgICAgICBfX3UzMiBpbW47CiAgICAgICAgX191MzIgaW14OwoJaW50ICBmbG93ID0gMDsKCglpZihwa3RfZGV2LT5jZmxvd3MpICB7CgkJZmxvdyA9IHBrdGdlbl9yYW5kb20oKSAlIHBrdF9kZXYtPmNmbG93czsKCQkKCQlpZiAocGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQgPiBwa3RfZGV2LT5sZmxvdykKCQkJcGt0X2Rldi0+Zmxvd3NbZmxvd10uY291bnQgPSAwOwoJfQkJCQkJCQoKCgkvKiAgRGVhbCB3aXRoIHNvdXJjZSBNQUMgKi8KICAgICAgICBpZiAocGt0X2Rldi0+c3JjX21hY19jb3VudCA+IDEpIHsKICAgICAgICAgICAgICAgIF9fdTMyIG1jOwogICAgICAgICAgICAgICAgX191MzIgdG1wOwoKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfTUFDU1JDX1JORCkgCiAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPnNyY19tYWNfY291bnQpOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0X2Rldi0+Y3VyX3NyY19tYWNfb2Zmc2V0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPiBwa3RfZGV2LT5zcmNfbWFjX2NvdW50KSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfc3JjX21hY19vZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRtcCA9IHBrdF9kZXYtPnNyY19tYWNbNV0gKyAobWMgJiAweEZGKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzExXSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzRdICsgKChtYyA+PiA4KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFsxMF0gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+c3JjX21hY1szXSArICgobWMgPj4gMTYpICYgMHhGRikgKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzldID0gdG1wOwogICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPnNyY19tYWNbMl0gKyAoKG1jID4+IDI0KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs4XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5zcmNfbWFjWzFdICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs3XSA9IHRtcDsgICAgICAgIAogICAgICAgIH0KCiAgICAgICAgLyogIERlYWwgd2l0aCBEZXN0aW5hdGlvbiBNQUMgKi8KICAgICAgICBpZiAocGt0X2Rldi0+ZHN0X21hY19jb3VudCA+IDEpIHsKICAgICAgICAgICAgICAgIF9fdTMyIG1jOwogICAgICAgICAgICAgICAgX191MzIgdG1wOwoKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfTUFDRFNUX1JORCkgCiAgICAgICAgICAgICAgICAgICAgICAgIG1jID0gcGt0Z2VuX3JhbmRvbSgpICUgKHBrdF9kZXYtPmRzdF9tYWNfY291bnQpOwoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBtYyA9IHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCsrOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGt0X2Rldi0+Y3VyX2RzdF9tYWNfb2Zmc2V0ID4gcGt0X2Rldi0+ZHN0X21hY19jb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl9kc3RfbWFjX29mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0bXAgPSBwa3RfZGV2LT5kc3RfbWFjWzVdICsgKG1jICYgMHhGRik7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs1XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5kc3RfbWFjWzRdICsgKChtYyA+PiA4KSAmIDB4RkYpICsgKHRtcCA+PiA4KSk7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5oaFs0XSA9IHRtcDsKICAgICAgICAgICAgICAgIHRtcCA9IChwa3RfZGV2LT5kc3RfbWFjWzNdICsgKChtYyA+PiAxNikgJiAweEZGKSArICh0bXAgPj4gOCkpOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+aGhbM10gPSB0bXA7CiAgICAgICAgICAgICAgICB0bXAgPSAocGt0X2Rldi0+ZHN0X21hY1syXSArICgobWMgPj4gMjQpICYgMHhGRikgKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzJdID0gdG1wOwogICAgICAgICAgICAgICAgdG1wID0gKHBrdF9kZXYtPmRzdF9tYWNbMV0gKyAodG1wID4+IDgpKTsKICAgICAgICAgICAgICAgIHBrdF9kZXYtPmhoWzFdID0gdG1wOyAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBpZiAocGt0X2Rldi0+dWRwX3NyY19taW4gPCBwa3RfZGV2LT51ZHBfc3JjX21heCkgewogICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBTUkNfUk5EKSAKICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2Rldi0+Y3VyX3VkcF9zcmMgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChwa3RfZGV2LT51ZHBfc3JjX21heCAtIHBrdF9kZXYtPnVkcF9zcmNfbWluKSkgKyBwa3RfZGV2LT51ZHBfc3JjX21pbik7CgogICAgICAgICAgICAgICAgZWxzZSB7CgkJCXBrdF9kZXYtPmN1cl91ZHBfc3JjKys7CgkJCWlmIChwa3RfZGV2LT5jdXJfdWRwX3NyYyA+PSBwa3RfZGV2LT51ZHBfc3JjX21heCkKCQkJCXBrdF9kZXYtPmN1cl91ZHBfc3JjID0gcGt0X2Rldi0+dWRwX3NyY19taW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocGt0X2Rldi0+dWRwX2RzdF9taW4gPCBwa3RfZGV2LT51ZHBfZHN0X21heCkgewogICAgICAgICAgICAgICAgaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9VRFBEU1RfUk5EKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBrdF9kZXYtPmN1cl91ZHBfZHN0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+dWRwX2RzdF9tYXggLSBwa3RfZGV2LT51ZHBfZHN0X21pbikpICsgcGt0X2Rldi0+dWRwX2RzdF9taW4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgkJCXBrdF9kZXYtPmN1cl91ZHBfZHN0Kys7CgkJCWlmIChwa3RfZGV2LT5jdXJfdWRwX2RzdCA+PSBwa3RfZGV2LT51ZHBfZHN0X21heCkgCgkJCQlwa3RfZGV2LT5jdXJfdWRwX2RzdCA9IHBrdF9kZXYtPnVkcF9kc3RfbWluOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCglpZiAoIShwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikpIHsKCgkJaWYgKChpbW4gPSBudG9obChwa3RfZGV2LT5zYWRkcl9taW4pKSA8IChpbXggPSBudG9obChwa3RfZGV2LT5zYWRkcl9tYXgpKSkgewoJCQlfX3UzMiB0OwoJCQlpZiAocGt0X2Rldi0+ZmxhZ3MgJiBGX0lQU1JDX1JORCkgCgkJCQl0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAoaW14IC0gaW1uKSkgKyBpbW4pOwoJCQllbHNlIHsKCQkJCXQgPSBudG9obChwa3RfZGV2LT5jdXJfc2FkZHIpOwoJCQkJdCsrOwoJCQkJaWYgKHQgPiBpbXgpIHsKCQkJCQl0ID0gaW1uOwoJCQkJfQoJCQl9CgkJCXBrdF9kZXYtPmN1cl9zYWRkciA9IGh0b25sKHQpOwoJCX0KCQkKCQlpZiAocGt0X2Rldi0+Y2Zsb3dzICYmIHBrdF9kZXYtPmZsb3dzW2Zsb3ddLmNvdW50ICE9IDApIHsKCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gcGt0X2Rldi0+Zmxvd3NbZmxvd10uY3VyX2RhZGRyOwoJCX0gZWxzZSB7CgoJCQlpZiAoKGltbiA9IG50b2hsKHBrdF9kZXYtPmRhZGRyX21pbikpIDwgKGlteCA9IG50b2hsKHBrdF9kZXYtPmRhZGRyX21heCkpKSB7CgkJCQlfX3UzMiB0OwoJCQkJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9JUERTVF9STkQpIHsKCgkJCQkJdCA9ICgocGt0Z2VuX3JhbmRvbSgpICUgKGlteCAtIGltbikpICsgaW1uKTsKCQkJCQl0ID0gaHRvbmwodCk7CgoJCQkJCXdoaWxlKCBMT09QQkFDSyh0KSB8fCBNVUxUSUNBU1QodCkgfHwgQkFEQ0xBU1ModCkgfHwgWkVST05FVCh0KSB8fCAgTE9DQUxfTUNBU1QodCkgKSB7CgkJCQkJCXQgPSAoKHBrdGdlbl9yYW5kb20oKSAlIChpbXggLSBpbW4pKSArIGltbik7CgkJCQkJCXQgPSBodG9ubCh0KTsKCQkJCQl9CgkJCQkJcGt0X2Rldi0+Y3VyX2RhZGRyID0gdDsKCQkJCX0KCQkJCQoJCQkJZWxzZSB7CgkJCQkJdCA9IG50b2hsKHBrdF9kZXYtPmN1cl9kYWRkcik7CgkJCQkJdCsrOwoJCQkJCWlmICh0ID4gaW14KSB7CgkJCQkJCXQgPSBpbW47CgkJCQkJfQoJCQkJCXBrdF9kZXYtPmN1cl9kYWRkciA9IGh0b25sKHQpOwoJCQkJfQoJCQl9CgkJCWlmKHBrdF9kZXYtPmNmbG93cykgewkKCQkJCXBrdF9kZXYtPmZsb3dzW2Zsb3ddLmN1cl9kYWRkciA9IHBrdF9kZXYtPmN1cl9kYWRkcjsKCQkJCXBrdF9kZXYtPm5mbG93cysrOwoJCQl9CgkJfQoJfQoJZWxzZSAvKiBJUFY2ICogKi8KCXsKCQlpZihwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMlswXSA9PSAwICYmCgkJICAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbMV0gPT0gMCAmJgoJCSAgIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcjMyWzJdID09IDAgJiYKCQkgICBwa3RfZGV2LT5taW5faW42X2RhZGRyLnM2X2FkZHIzMlszXSA9PSAwKTsKCQllbHNlIHsKCQkJaW50IGk7CgoJCQkvKiBPbmx5IHJhbmRvbSBkZXN0aW5hdGlvbnMgeWV0ICovCgoJCQlmb3IoaT0wOyBpIDwgNDsgaSsrKSB7CgkJCQlwa3RfZGV2LT5jdXJfaW42X2RhZGRyLnM2X2FkZHIzMltpXSA9CgkJCQkJKChwa3RnZW5fcmFuZG9tKCkgfAoJCQkJCSAgcGt0X2Rldi0+bWluX2luNl9kYWRkci5zNl9hZGRyMzJbaV0pICYKCQkJCQkgcGt0X2Rldi0+bWF4X2luNl9kYWRkci5zNl9hZGRyMzJbaV0pOwoJCQl9CiAJCX0KCX0KCiAgICAgICAgaWYgKHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSA8IHBrdF9kZXYtPm1heF9wa3Rfc2l6ZSkgewogICAgICAgICAgICAgICAgX191MzIgdDsKICAgICAgICAgICAgICAgIGlmIChwa3RfZGV2LT5mbGFncyAmIEZfVFhTSVpFX1JORCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gKChwa3RnZW5fcmFuZG9tKCkgJSAocGt0X2Rldi0+bWF4X3BrdF9zaXplIC0gcGt0X2Rldi0+bWluX3BrdF9zaXplKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBrdF9kZXYtPm1pbl9wa3Rfc2l6ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCQkJdCA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDE7CgkJCWlmICh0ID4gcGt0X2Rldi0+bWF4X3BrdF9zaXplKSAKCQkJCXQgPSBwa3RfZGV2LT5taW5fcGt0X3NpemU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5jdXJfcGt0X3NpemUgPSB0OwogICAgICAgIH0KCglwa3RfZGV2LT5mbG93c1tmbG93XS5jb3VudCsrOwp9CgoKc3RhdGljIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldF9pcHY0KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKCV9fdTggKmV0aDsKCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CglpbnQgZGF0YWxlbiwgaXBsZW47CglzdHJ1Y3QgaXBoZHIgKmlwaDsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2hkciAqcGdoID0gTlVMTDsKICAgICAgICAKCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCgkgKiBmaWVsZHMuCgkgKi8KCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKCglza2IgPSBhbGxvY19za2IocGt0X2Rldi0+Y3VyX3BrdF9zaXplICsgNjQgKyAxNiwgR0ZQX0FUT01JQyk7CglpZiAoIXNrYikgewoJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gbWVtb3J5Iik7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJc2tiX3Jlc2VydmUoc2tiLCAxNik7CgoJLyogIFJlc2VydmUgZm9yIGV0aGVybmV0IGFuZCBJUCBoZWFkZXIgICovCglldGggPSAoX191OCAqKSBza2JfcHVzaChza2IsIDE0KTsKCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOwoJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CgoJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKCSoodTE2KikmZXRoWzEyXSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOwoKCWRhdGFsZW4gPSBwa3RfZGV2LT5jdXJfcGt0X3NpemUgLSAxNCAtIDIwIC0gODsgLyogRXRoICsgSVBoICsgVURQaCAqLwoJaWYgKGRhdGFsZW4gPCBzaXplb2Yoc3RydWN0IHBrdGdlbl9oZHIpKSAKCQlkYXRhbGVuID0gc2l6ZW9mKHN0cnVjdCBwa3RnZW5faGRyKTsKICAgICAgICAKCXVkcGgtPnNvdXJjZSA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfc3JjKTsKCXVkcGgtPmRlc3QgPSBodG9ucyhwa3RfZGV2LT5jdXJfdWRwX2RzdCk7Cgl1ZHBoLT5sZW4gPSBodG9ucyhkYXRhbGVuICsgOCk7IC8qIERBVEEgKyB1ZHBoZHIgKi8KCXVkcGgtPmNoZWNrID0gMDsgIC8qIE5vIGNoZWNrc3VtICovCgoJaXBoLT5paGwgPSA1OwoJaXBoLT52ZXJzaW9uID0gNDsKCWlwaC0+dHRsID0gMzI7CglpcGgtPnRvcyA9IDA7CglpcGgtPnByb3RvY29sID0gSVBQUk9UT19VRFA7IC8qIFVEUCAqLwoJaXBoLT5zYWRkciA9IHBrdF9kZXYtPmN1cl9zYWRkcjsKCWlwaC0+ZGFkZHIgPSBwa3RfZGV2LT5jdXJfZGFkZHI7CglpcGgtPmZyYWdfb2ZmID0gMDsKCWlwbGVuID0gMjAgKyA4ICsgZGF0YWxlbjsKCWlwaC0+dG90X2xlbiA9IGh0b25zKGlwbGVuKTsKCWlwaC0+Y2hlY2sgPSAwOwoJaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodm9pZCAqKSBpcGgsIGlwaC0+aWhsKTsKCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKCXNrYi0+bWFjLnJhdyA9ICgodTggKilpcGgpIC0gMTQ7Cglza2ItPmRldiA9IG9kZXY7Cglza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CgoJaWYgKHBrdF9kZXYtPm5mcmFncyA8PSAwKSAKICAgICAgICAgICAgICAgIHBnaCA9IChzdHJ1Y3QgcGt0Z2VuX2hkciAqKXNrYl9wdXQoc2tiLCBkYXRhbGVuKTsKCWVsc2UgewoJCWludCBmcmFncyA9IHBrdF9kZXYtPm5mcmFnczsKCQlpbnQgaTsKCiAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIqKSgoKGNoYXIqKSh1ZHBoKSkgKyA4KTsKICAgICAgICAgICAgICAgIAoJCWlmIChmcmFncyA+IE1BWF9TS0JfRlJBR1MpCgkJCWZyYWdzID0gTUFYX1NLQl9GUkFHUzsKCQlpZiAoZGF0YWxlbiA+IGZyYWdzKlBBR0VfU0laRSkgewoJCQlza2JfcHV0KHNrYiwgZGF0YWxlbi1mcmFncypQQUdFX1NJWkUpOwoJCQlkYXRhbGVuID0gZnJhZ3MqUEFHRV9TSVpFOwoJCX0KCgkJaSA9IDA7CgkJd2hpbGUgKGRhdGFsZW4gPiAwKSB7CgkJCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHBhZ2U7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgPSAwOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPQoJCQkJKGRhdGFsZW4gPCBQQUdFX1NJWkUgPyBkYXRhbGVuIDogUEFHRV9TSVpFKTsKCQkJZGF0YWxlbiAtPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCXNrYi0+bGVuICs9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKCQkJc2tiLT5kYXRhX2xlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCWkrKzsKCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGk7CgkJfQoKCQl3aGlsZSAoaSA8IGZyYWdzKSB7CgkJCWludCByZW07CgoJCQlpZiAoaSA9PSAwKQoJCQkJYnJlYWs7CgoJCQlyZW0gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplIC8gMjsKCQkJaWYgKHJlbSA9PSAwKQoJCQkJYnJlYWs7CgoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplIC09IHJlbTsKCgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXTsKCQkJZ2V0X3BhZ2Uoc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlKTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0ucGFnZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXS5zaXplOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUgPSByZW07CgkJCWkrKzsKCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9IGk7CgkJfQoJfQoKICAgICAgICAvKiBTdGFtcCB0aGUgdGltZSwgYW5kIHNlcXVlbmNlIG51bWJlciwgY29udmVydCB0aGVtIHRvIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwoKICAgICAgICBpZiAocGdoKSB7CiAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwoJICAgICAgCgkgICAgICBwZ2gtPnBnaF9tYWdpYyA9IGh0b25sKFBLVEdFTl9NQUdJQyk7CgkgICAgICBwZ2gtPnNlcV9udW0gICA9IGh0b25sKHBrdF9kZXYtPnNlcV9udW0pOwoJICAgICAgCgkgICAgICBkb19nZXR0aW1lb2ZkYXkoJnRpbWVzdGFtcCk7CgkgICAgICBwZ2gtPnR2X3NlYyAgICA9IGh0b25sKHRpbWVzdGFtcC50dl9zZWMpOwoJICAgICAgcGdoLT50dl91c2VjICAgPSBodG9ubCh0aW1lc3RhbXAudHZfdXNlYyk7CiAgICAgICAgfQogICAgICAgIHBrdF9kZXYtPnNlcV9udW0rKzsKICAgICAgICAKCXJldHVybiBza2I7Cn0KCi8qCiAqIHNjYW5faXA2LCBmbXRfaXAgdGFrZW4gZnJvbSBkaWV0bGliYy0wLjIxIAogKiBBdXRob3IgRmVsaXggdm9uIExlaXRuZXIgPGZlbGl4LWRpZXRsaWJjQGZlZmUuZGU+CiAqCiAqIFNsaWdodGx5IG1vZGlmaWVkIGZvciBrZXJuZWwuIAogKiBTaG91bGQgYmUgY2FuZGlkYXRlIGZvciBuZXQvaXB2NC91dGlscy5jCiAqIC0tcm8KICovCgpzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5faXA2KGNvbnN0IGNoYXIgKnMsY2hhciBpcFsxNl0pCnsKCXVuc2lnbmVkIGludCBpOwoJdW5zaWduZWQgaW50IGxlbj0wOwoJdW5zaWduZWQgbG9uZyB1OwoJY2hhciBzdWZmaXhbMTZdOwoJdW5zaWduZWQgaW50IHByZWZpeGxlbj0wOwoJdW5zaWduZWQgaW50IHN1ZmZpeGxlbj0wOwoJX191MzIgdG1wOwoKCWZvciAoaT0wOyBpPDE2OyBpKyspIGlwW2ldPTA7CgoJZm9yICg7OykgewoJCWlmICgqcyA9PSAnOicpIHsKCQkJbGVuKys7CgkJCWlmIChzWzFdID09ICc6JykgeyAgICAgICAgLyogRm91bmQgIjo6Iiwgc2tpcCB0byBwYXJ0IDIgKi8KCQkJCXMrPTI7CgkJCQlsZW4rKzsKCQkJCWJyZWFrOwoJCQl9CgkJCXMrKzsKCQl9CgkJewoJCQljaGFyICp0bXA7CgkJCXU9c2ltcGxlX3N0cnRvdWwocywmdG1wLDE2KTsKCQkJaT10bXAtczsKCQl9CgoJCWlmICghaSkgcmV0dXJuIDA7CgkJaWYgKHByZWZpeGxlbj09MTIgJiYgc1tpXT09Jy4nKSB7CgoJCQkvKiB0aGUgbGFzdCA0IGJ5dGVzIG1heSBiZSB3cml0dGVuIGFzIElQdjQgYWRkcmVzcyAqLwoKCQkJdG1wID0gaW5fYXRvbihzKTsKCQkJbWVtY3B5KChzdHJ1Y3QgaW5fYWRkciopKGlwKzEyKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOwoJCQlyZXR1cm4gaStsZW47CgkJfQoJCWlwW3ByZWZpeGxlbisrXSA9ICh1ID4+IDgpOwoJCWlwW3ByZWZpeGxlbisrXSA9ICh1ICYgMjU1KTsKCQlzICs9IGk7IGxlbiArPSBpOwoJCWlmIChwcmVmaXhsZW49PTE2KQoJCQlyZXR1cm4gbGVuOwoJfQoKLyogcGFydCAyLCBhZnRlciAiOjoiICovCglmb3IgKDs7KSB7CgkJaWYgKCpzID09ICc6JykgewoJCQlpZiAoc3VmZml4bGVuPT0wKQoJCQkJYnJlYWs7CgkJCXMrKzsKCQkJbGVuKys7CgkJfSBlbHNlIGlmIChzdWZmaXhsZW4hPTApCgkJCWJyZWFrOwoJCXsKCQkJY2hhciAqdG1wOwoJCQl1PXNpbXBsZV9zdHJ0b2wocywmdG1wLDE2KTsKCQkJaT10bXAtczsKCQl9CgkJaWYgKCFpKSB7CgkJCWlmICgqcykgbGVuLS07CgkJCWJyZWFrOwoJCX0KCQlpZiAoc3VmZml4bGVuK3ByZWZpeGxlbjw9MTIgJiYgc1tpXT09Jy4nKSB7CgkJCXRtcCA9IGluX2F0b24ocyk7CgkJCW1lbWNweSgoc3RydWN0IGluX2FkZHIqKShzdWZmaXgrc3VmZml4bGVuKSwgJnRtcCwgc2l6ZW9mKHRtcCkpOwoJCQlzdWZmaXhsZW4rPTQ7CgkJCWxlbis9c3RybGVuKHMpOwoJCQlicmVhazsKCQl9CgkJc3VmZml4W3N1ZmZpeGxlbisrXSA9ICh1ID4+IDgpOwoJCXN1ZmZpeFtzdWZmaXhsZW4rK10gPSAodSAmIDI1NSk7CgkJcyArPSBpOyBsZW4gKz0gaTsKCQlpZiAocHJlZml4bGVuK3N1ZmZpeGxlbj09MTYpCgkJCWJyZWFrOwoJfQoJZm9yIChpPTA7IGk8c3VmZml4bGVuOyBpKyspCgkJaXBbMTYtc3VmZml4bGVuK2ldID0gc3VmZml4W2ldOwoJcmV0dXJuIGxlbjsKfQoKc3RhdGljIGNoYXIgdG9oZXgoY2hhciBoZXhkaWdpdCkgewoJcmV0dXJuIGhleGRpZ2l0Pjk/aGV4ZGlnaXQrJ2EnLTEwOmhleGRpZ2l0KycwJzsKfQoKc3RhdGljIGludCBmbXRfeGxvbmcoY2hhciogcyx1bnNpZ25lZCBpbnQgaSkgewoJY2hhciogYmFrPXM7Cgkqcz10b2hleCgoaT4+MTIpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOwoJKnM9dG9oZXgoKGk+PjgpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOwoJKnM9dG9oZXgoKGk+PjQpJjB4Zik7IGlmIChzIT1iYWsgfHwgKnMhPScwJykgKytzOwoJKnM9dG9oZXgoaSYweGYpOwoJcmV0dXJuIHMtYmFrKzE7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgZm10X2lwNihjaGFyICpzLGNvbnN0IGNoYXIgaXBbMTZdKSB7Cgl1bnNpZ25lZCBpbnQgbGVuOwoJdW5zaWduZWQgaW50IGk7Cgl1bnNpZ25lZCBpbnQgdGVtcDsKCXVuc2lnbmVkIGludCBjb21wcmVzc2luZzsKCWludCBqOwoKCWxlbiA9IDA7IGNvbXByZXNzaW5nID0gMDsKCWZvciAoaj0wOyBqPDE2OyBqKz0yKSB7CgojaWZkZWYgVjRNQVBQRURQUkVGSVgKCQlpZiAoaj09MTIgJiYgIW1lbWNtcChpcCxWNG1hcHBlZHByZWZpeCwxMikpIHsKCQkJaW5ldF9udG9hX3IoKihzdHJ1Y3QgaW5fYWRkciopKGlwKzEyKSxzKTsKCQkJdGVtcD1zdHJsZW4ocyk7CgkJCXJldHVybiBsZW4rdGVtcDsKCQl9CiNlbmRpZgoJCXRlbXAgPSAoKHVuc2lnbmVkIGxvbmcpICh1bnNpZ25lZCBjaGFyKSBpcFtqXSA8PCA4KSArCgkJCSh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgY2hhcikgaXBbaisxXTsKCQlpZiAodGVtcCA9PSAwKSB7CgkJCWlmICghY29tcHJlc3NpbmcpIHsKCQkJCWNvbXByZXNzaW5nPTE7CgkJCQlpZiAoaj09MCkgewoJCQkJCSpzKys9JzonOyArK2xlbjsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWlmIChjb21wcmVzc2luZykgewoJCQkJY29tcHJlc3Npbmc9MDsKCQkJCSpzKys9JzonOyArK2xlbjsKCQkJfQoJCQlpID0gZm10X3hsb25nKHMsdGVtcCk7IGxlbiArPSBpOyBzICs9IGk7CgkJCWlmIChqPDE0KSB7CgkJCQkqcysrID0gJzonOwoJCQkJKytsZW47CgkJCX0KCQl9Cgl9CglpZiAoY29tcHJlc3NpbmcpIHsKCQkqcysrPSc6JzsgKytsZW47Cgl9Cgkqcz0wOwoJcmV0dXJuIGxlbjsKfQoKc3RhdGljIHN0cnVjdCBza19idWZmICpmaWxsX3BhY2tldF9pcHY2KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKCV9fdTggKmV0aDsKCXN0cnVjdCB1ZHBoZHIgKnVkcGg7CglpbnQgZGF0YWxlbjsKCXN0cnVjdCBpcHY2aGRyICppcGg7CiAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7CgoJLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKCSAqIGZpZWxkcy4KCSAqLwoJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwoKCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKCWlmICghc2tiKSB7CgkJc3ByaW50Zihwa3RfZGV2LT5yZXN1bHQsICJObyBtZW1vcnkiKTsKCQlyZXR1cm4gTlVMTDsKCX0KCglza2JfcmVzZXJ2ZShza2IsIDE2KTsKCgkvKiAgUmVzZXJ2ZSBmb3IgZXRoZXJuZXQgYW5kIElQIGhlYWRlciAgKi8KCWV0aCA9IChfX3U4ICopIHNrYl9wdXNoKHNrYiwgMTQpOwoJaXBoID0gKHN0cnVjdCBpcHY2aGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwoJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CgoJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKCSoodTE2KikmZXRoWzEyXSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVBWNik7CgoJZGF0YWxlbiA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZS0xNC0gCgkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKS1zaXplb2Yoc3RydWN0IHVkcGhkcik7IC8qIEV0aCArIElQaCArIFVEUGggKi8KCglpZiAoZGF0YWxlbiA8IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcikpIHsgCgkJZGF0YWxlbiA9IHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2hkcik7CgkJaWYgKG5ldF9yYXRlbGltaXQoKSkKCQkJcHJpbnRrKEtFUk5fSU5GTyAicGt0Z2VuOiBpbmNyZWFzZWQgZGF0YWxlbiB0byAlZFxuIiwgZGF0YWxlbik7Cgl9CgoJdWRwaC0+c291cmNlID0gaHRvbnMocGt0X2Rldi0+Y3VyX3VkcF9zcmMpOwoJdWRwaC0+ZGVzdCA9IGh0b25zKHBrdF9kZXYtPmN1cl91ZHBfZHN0KTsKCXVkcGgtPmxlbiA9IGh0b25zKGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpOyAKCXVkcGgtPmNoZWNrID0gMDsgIC8qIE5vIGNoZWNrc3VtICovCgoJICoodTMyKilpcGggPSBfX2NvbnN0YW50X2h0b25sKDB4NjAwMDAwMDApOyAvKiBWZXJzaW9uICsgZmxvdyAqLwoKCWlwaC0+aG9wX2xpbWl0ID0gMzI7CgoJaXBoLT5wYXlsb2FkX2xlbiA9IGh0b25zKHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIGRhdGFsZW4pOwoJaXBoLT5uZXh0aGRyID0gSVBQUk9UT19VRFA7CgoJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZwa3RfZGV2LT5jdXJfaW42X2RhZGRyKTsKCWlwdjZfYWRkcl9jb3B5KCZpcGgtPnNhZGRyLCAmcGt0X2Rldi0+Y3VyX2luNl9zYWRkcik7CgoJc2tiLT5tYWMucmF3ID0gKCh1OCAqKWlwaCkgLSAxNDsKCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQVjYpOwoJc2tiLT5kZXYgPSBvZGV2OwoJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOwoKCWlmIChwa3RfZGV2LT5uZnJhZ3MgPD0gMCkgCiAgICAgICAgICAgICAgICBwZ2ggPSAoc3RydWN0IHBrdGdlbl9oZHIgKilza2JfcHV0KHNrYiwgZGF0YWxlbik7CgllbHNlIHsKCQlpbnQgZnJhZ3MgPSBwa3RfZGV2LT5uZnJhZ3M7CgkJaW50IGk7CgogICAgICAgICAgICAgICAgcGdoID0gKHN0cnVjdCBwa3RnZW5faGRyKikoKChjaGFyKikodWRwaCkpICsgOCk7CiAgICAgICAgICAgICAgICAKCQlpZiAoZnJhZ3MgPiBNQVhfU0tCX0ZSQUdTKQoJCQlmcmFncyA9IE1BWF9TS0JfRlJBR1M7CgkJaWYgKGRhdGFsZW4gPiBmcmFncypQQUdFX1NJWkUpIHsKCQkJc2tiX3B1dChza2IsIGRhdGFsZW4tZnJhZ3MqUEFHRV9TSVpFKTsKCQkJZGF0YWxlbiA9IGZyYWdzKlBBR0VfU0laRTsKCQl9CgoJCWkgPSAwOwoJCXdoaWxlIChkYXRhbGVuID4gMCkgewoJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIDApOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2UgPSBwYWdlOwoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnBhZ2Vfb2Zmc2V0ID0gMDsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0KCQkJCShkYXRhbGVuIDwgUEFHRV9TSVpFID8gZGF0YWxlbiA6IFBBR0VfU0laRSk7CgkJCWRhdGFsZW4gLT0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlza2ItPmxlbiArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CgkJCXNrYi0+ZGF0YV9sZW4gKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCgkJd2hpbGUgKGkgPCBmcmFncykgewoJCQlpbnQgcmVtOwoKCQkJaWYgKGkgPT0gMCkKCQkJCWJyZWFrOwoKCQkJcmVtID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAvIDI7CgkJCWlmIChyZW0gPT0gMCkKCQkJCWJyZWFrOwoKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZSAtPSByZW07CgoJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV07CgkJCWdldF9wYWdlKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSk7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZSA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaSAtIDFdLnBhZ2U7CgkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgKz0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpIC0gMV0uc2l6ZTsKCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplID0gcmVtOwoJCQlpKys7CgkJCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSBpOwoJCX0KCX0KCiAgICAgICAgLyogU3RhbXAgdGhlIHRpbWUsIGFuZCBzZXF1ZW5jZSBudW1iZXIsIGNvbnZlcnQgdGhlbSB0byBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KCS8qIHNob3VsZCB3ZSB1cGRhdGUgY2xvbmVkIHBhY2tldHMgdG9vID8gKi8KICAgICAgICBpZiAocGdoKSB7CiAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOwoJICAgICAgCgkgICAgICBwZ2gtPnBnaF9tYWdpYyA9IGh0b25sKFBLVEdFTl9NQUdJQyk7CgkgICAgICBwZ2gtPnNlcV9udW0gICA9IGh0b25sKHBrdF9kZXYtPnNlcV9udW0pOwoJICAgICAgCgkgICAgICBkb19nZXR0aW1lb2ZkYXkoJnRpbWVzdGFtcCk7CgkgICAgICBwZ2gtPnR2X3NlYyAgICA9IGh0b25sKHRpbWVzdGFtcC50dl9zZWMpOwoJICAgICAgcGdoLT50dl91c2VjICAgPSBodG9ubCh0aW1lc3RhbXAudHZfdXNlYyk7CiAgICAgICAgfQogICAgICAgIHBrdF9kZXYtPnNlcV9udW0rKzsKICAgICAgICAKCXJldHVybiBza2I7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmZpbGxfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpvZGV2LCAKCQkJCSAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglpZihwa3RfZGV2LT5mbGFncyAmIEZfSVBWNikgCgkJcmV0dXJuIGZpbGxfcGFja2V0X2lwdjYob2RldiwgcGt0X2Rldik7CgllbHNlCgkJcmV0dXJuIGZpbGxfcGFja2V0X2lwdjQob2RldiwgcGt0X2Rldik7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9jbGVhcl9jb3VudGVycyhzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKICAgICAgICBwa3RfZGV2LT5zZXFfbnVtID0gMTsKICAgICAgICBwa3RfZGV2LT5pZGxlX2FjYyA9IDA7Cglwa3RfZGV2LT5zb2ZhciA9IDA7CiAgICAgICAgcGt0X2Rldi0+dHhfYnl0ZXMgPSAwOwogICAgICAgIHBrdF9kZXYtPmVycm9ycyA9IDA7Cn0KCi8qIFNldCB1cCBzdHJ1Y3R1cmUgZm9yIHNlbmRpbmcgcGt0cywgY2xlYXIgY291bnRlcnMgKi8KCnN0YXRpYyB2b2lkIHBrdGdlbl9ydW4oc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CglpbnQgc3RhcnRlZCA9IDA7CgoJUEdfREVCVUcocHJpbnRrKCJwa3RnZW46IGVudGVyaW5nIHBrdGdlbl9ydW4uICVwXG4iLCB0KSk7CgoJaWZfbG9jayh0KTsKICAgICAgICBmb3IgKHBrdF9kZXYgPSB0LT5pZl9saXN0OyBwa3RfZGV2OyBwa3RfZGV2ID0gcGt0X2Rldi0+bmV4dCApIHsKCgkJLyoKCQkgKiBzZXR1cCBvZGV2IGFuZCBjcmVhdGUgaW5pdGlhbCBwYWNrZXQuCgkJICovCgkJcGt0Z2VuX3NldHVwX2luamVjdChwa3RfZGV2KTsKCgkJaWYocGt0X2Rldi0+b2RldikgeyAKCQkJcGt0Z2VuX2NsZWFyX2NvdW50ZXJzKHBrdF9kZXYpOwoJCQlwa3RfZGV2LT5ydW5uaW5nID0gMTsgLyogQ3JhbmtlIHllc2VsZiEgKi8KCQkJcGt0X2Rldi0+c2tiID0gTlVMTDsKCQkJcGt0X2Rldi0+c3RhcnRlZF9hdCA9IGdldEN1clVzKCk7CgkJCXBrdF9kZXYtPm5leHRfdHhfdXMgPSBnZXRDdXJVcygpOyAvKiBUcmFuc21pdCBpbW1lZGlhdGVseSAqLwoJCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKCQkJCgkJCXN0cmNweShwa3RfZGV2LT5yZXN1bHQsICJTdGFydGluZyIpOwoJCQlzdGFydGVkKys7CgkJfQoJCWVsc2UgCgkJCXN0cmNweShwa3RfZGV2LT5yZXN1bHQsICJFcnJvciBzdGFydGluZyIpOwoJfQoJaWZfdW5sb2NrKHQpOwoJaWYoc3RhcnRlZCkgdC0+Y29udHJvbCAmPSB+KFRfU1RPUCk7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wX2FsbF90aHJlYWRzX2lmcyh2b2lkKQp7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKCglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZW50ZXJpbmcgcGt0Z2VuX3N0b3BfYWxsX3RocmVhZHMuXG4iKSk7CgoJdGhyZWFkX2xvY2soKTsKCXdoaWxlKHQpIHsKCQlwa3RnZW5fc3RvcCh0KTsKCQl0ID0gdC0+bmV4dDsKCX0KCXRocmVhZF91bmxvY2soKTsKfQoKc3RhdGljIGludCB0aHJlYWRfaXNfcnVubmluZyhzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCApCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqbmV4dDsKICAgICAgICBpbnQgcmVzID0gMDsKCiAgICAgICAgZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dDsgbmV4dD1uZXh0LT5uZXh0KSB7IAoJCWlmKG5leHQtPnJ1bm5pbmcpIHsKCQkJcmVzID0gMTsKCQkJYnJlYWs7CgkJfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwp9CgpzdGF0aWMgaW50IHBrdGdlbl93YWl0X3RocmVhZF9ydW4oc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgKQp7CiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgd2hpbGUodGhyZWFkX2lzX3J1bm5pbmcodCkpIHsKCiAgICAgICAgICAgICAgICBpZl91bmxvY2sodCk7CgoJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7IAoKICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2lnbmFsOwogICAgICAgICAgICAgICAgaWZfbG9jayh0KTsKICAgICAgICB9CiAgICAgICAgaWZfdW5sb2NrKHQpOwogICAgICAgIHJldHVybiAxOwogc2lnbmFsOgogICAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHBrdGdlbl93YWl0X2FsbF90aHJlYWRzX3J1bih2b2lkKQp7CglzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHBrdGdlbl90aHJlYWRzOwoJaW50IHNpZyA9IDE7CgkKCXdoaWxlICh0KSB7CgkJc2lnID0gcGt0Z2VuX3dhaXRfdGhyZWFkX3J1bih0KTsKCQlpZiggc2lnID09IDAgKSBicmVhazsKCQl0aHJlYWRfbG9jaygpOwoJCXQ9dC0+bmV4dDsKCQl0aHJlYWRfdW5sb2NrKCk7Cgl9CglpZihzaWcgPT0gMCkgewoJCXRocmVhZF9sb2NrKCk7CgkJd2hpbGUgKHQpIHsKCQkJdC0+Y29udHJvbCB8PSAoVF9TVE9QKTsKCQkJdD10LT5uZXh0OwoJCX0KCQl0aHJlYWRfdW5sb2NrKCk7Cgl9CglyZXR1cm4gc2lnOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fcnVuX2FsbF90aHJlYWRzKHZvaWQpCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCA9IHBrdGdlbl90aHJlYWRzOwoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fcnVuX2FsbF90aHJlYWRzLlxuIikpOwoKCXRocmVhZF9sb2NrKCk7CgoJd2hpbGUodCkgewoJCXQtPmNvbnRyb2wgfD0gKFRfUlVOKTsKCQl0ID0gdC0+bmV4dDsKCX0KCXRocmVhZF91bmxvY2soKTsKCglzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxMjUpKTsgIC8qIFByb3BhZ2F0ZSB0aHJlYWQtPmNvbnRyb2wgICovCgkJCQoJcGt0Z2VuX3dhaXRfYWxsX3RocmVhZHNfcnVuKCk7Cn0KCgpzdGF0aWMgdm9pZCBzaG93X3Jlc3VsdHMoc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYsIGludCBucl9mcmFncykKewogICAgICAgX191NjQgdG90YWxfdXMsIGJwcywgbWJwcywgcHBzLCBpZGxlOwogICAgICAgY2hhciAqcCA9IHBrdF9kZXYtPnJlc3VsdDsKCiAgICAgICB0b3RhbF91cyA9IHBrdF9kZXYtPnN0b3BwZWRfYXQgLSBwa3RfZGV2LT5zdGFydGVkX2F0OwoKICAgICAgIGlkbGUgPSBwa3RfZGV2LT5pZGxlX2FjYzsKCiAgICAgICBwICs9IHNwcmludGYocCwgIk9LOiAlbGx1KGMlbGx1K2QlbGx1KSB1c2VjLCAlbGx1ICglZGJ5dGUsJWRmcmFncylcbiIsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG90YWxfdXMsIAoJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKSh0b3RhbF91cyAtIGlkbGUpLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgaWRsZSwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwa3RfZGV2LT5zb2ZhciwgCgkJICAgIHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSwgbnJfZnJhZ3MpOwoKICAgICAgIHBwcyA9IHBrdF9kZXYtPnNvZmFyICogVVNFQ19QRVJfU0VDOwoKICAgICAgIHdoaWxlICgodG90YWxfdXMgPj4gMzIpICE9IDApIHsKICAgICAgICAgICAgICAgcHBzID4+PSAxOwogICAgICAgICAgICAgICB0b3RhbF91cyA+Pj0gMTsKICAgICAgIH0KCiAgICAgICBkb19kaXYocHBzLCB0b3RhbF91cyk7CiAgICAgICAKICAgICAgIGJwcyA9IHBwcyAqIDggKiBwa3RfZGV2LT5jdXJfcGt0X3NpemU7CgogICAgICAgbWJwcyA9IGJwczsKICAgICAgIGRvX2RpdihtYnBzLCAxMDAwMDAwKTsKICAgICAgIHAgKz0gc3ByaW50ZihwLCAiICAlbGx1cHBzICVsbHVNYi9zZWMgKCVsbHVicHMpIGVycm9yczogJWxsdSIsCiAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcHBzLCAKCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWJwcywgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJwcywgCgkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBrdF9kZXYtPmVycm9ycyk7Cn0KIAoKLyogU2V0IHN0b3BwZWQtYXQgdGltZXIsIHJlbW92ZSBmcm9tIHJ1bm5pbmcgbGlzdCwgZG8gY291bnRlcnMgJiBzdGF0aXN0aWNzICovCgpzdGF0aWMgaW50IHBrdGdlbl9zdG9wX2RldmljZShzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKCQogICAgICAgIGlmICghcGt0X2Rldi0+cnVubmluZykgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IGludGVyZmFjZTogJXMgaXMgYWxyZWFkeSBzdG9wcGVkXG4iLCBwa3RfZGV2LT5pZm5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQoKICAgICAgICBwa3RfZGV2LT5zdG9wcGVkX2F0ID0gZ2V0Q3VyVXMoKTsKICAgICAgICBwa3RfZGV2LT5ydW5uaW5nID0gMDsKCglzaG93X3Jlc3VsdHMocGt0X2Rldiwgc2tiX3NoaW5mbyhwa3RfZGV2LT5za2IpLT5ucl9mcmFncyk7CgoJaWYgKHBrdF9kZXYtPnNrYikgCgkJa2ZyZWVfc2tiKHBrdF9kZXYtPnNrYik7CgoJcGt0X2Rldi0+c2tiID0gTlVMTDsKCQogICAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHBrdGdlbl9kZXYgKm5leHRfdG9fcnVuKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ICkKewoJc3RydWN0IHBrdGdlbl9kZXYgKm5leHQsICpiZXN0ID0gTlVMTDsKICAgICAgICAKCWlmX2xvY2sodCk7CgoJZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dCA7IG5leHQ9bmV4dC0+bmV4dCkgewoJCWlmKCFuZXh0LT5ydW5uaW5nKSBjb250aW51ZTsKCQlpZihiZXN0ID09IE5VTEwpIGJlc3Q9bmV4dDsKCQllbHNlIGlmICggbmV4dC0+bmV4dF90eF91cyA8IGJlc3QtPm5leHRfdHhfdXMpIAoJCQliZXN0ID0gIG5leHQ7Cgl9CglpZl91bmxvY2sodCk7CiAgICAgICAgcmV0dXJuIGJlc3Q7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9zdG9wKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0KSB7CiAgICAgICAgc3RydWN0IHBrdGdlbl9kZXYgKm5leHQgPSBOVUxMOwoKCVBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBlbnRlcmluZyBwa3RnZW5fc3RvcC5cbiIpKTsKCiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgZm9yKG5leHQ9dC0+aWZfbGlzdDsgbmV4dDsgbmV4dD1uZXh0LT5uZXh0KQogICAgICAgICAgICAgICAgcGt0Z2VuX3N0b3BfZGV2aWNlKG5leHQpOwoKICAgICAgICBpZl91bmxvY2sodCk7Cn0KCnN0YXRpYyB2b2lkIHBrdGdlbl9yZW1fYWxsX2lmcyhzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqY3VyLCAqbmV4dCA9IE5VTEw7CiAgICAgICAgCiAgICAgICAgLyogUmVtb3ZlIGFsbCBkZXZpY2VzLCBmcmVlIG1lbSAqLwogCiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgZm9yKGN1cj10LT5pZl9saXN0OyBjdXI7IGN1cj1uZXh0KSB7IAoJCW5leHQgPSBjdXItPm5leHQ7CgkJcGt0Z2VuX3JlbW92ZV9kZXZpY2UodCwgY3VyKTsKCX0KCiAgICAgICAgaWZfdW5sb2NrKHQpOwp9CgpzdGF0aWMgdm9pZCBwa3RnZW5fcmVtX3RocmVhZChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCkgCnsKICAgICAgICAvKiBSZW1vdmUgZnJvbSB0aGUgdGhyZWFkIGxpc3QgKi8KCglzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdG1wID0gcGt0Z2VuX3RocmVhZHM7CgoJcmVtb3ZlX3Byb2NfZW50cnkodC0+bmFtZSwgcGdfcHJvY19kaXIpOwoKCXRocmVhZF9sb2NrKCk7CgoJaWYgKHRtcCA9PSB0KQoJCXBrdGdlbl90aHJlYWRzID0gdG1wLT5uZXh0OwoJZWxzZSB7CgkJd2hpbGUgKHRtcCkgewoJCQlpZiAodG1wLT5uZXh0ID09IHQpIHsKCQkJCXRtcC0+bmV4dCA9IHQtPm5leHQ7CgkJCQl0LT5uZXh0ID0gTlVMTDsKCQkJCWJyZWFrOwoJCQl9CgkJCXRtcCA9IHRtcC0+bmV4dDsKCQl9Cgl9CiAgICAgICAgdGhyZWFkX3VubG9jaygpOwp9CgpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHBrdGdlbl94bWl0KHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqb2RldiA9IE5VTEw7CglfX3U2NCBpZGxlX3N0YXJ0ID0gMDsKCWludCByZXQ7CgoJb2RldiA9IHBrdF9kZXYtPm9kZXY7CgkKCWlmIChwa3RfZGV2LT5kZWxheV91cyB8fCBwa3RfZGV2LT5kZWxheV9ucykgewoJCXU2NCBub3c7CgoJCW5vdyA9IGdldEN1clVzKCk7CgkJaWYgKG5vdyA8IHBrdF9kZXYtPm5leHRfdHhfdXMpCgkJCXNwaW4ocGt0X2RldiwgcGt0X2Rldi0+bmV4dF90eF91cyk7CgoJCS8qIFRoaXMgaXMgbWF4IERFTEFZLCB0aGlzIGhhcyBzcGVjaWFsIG1lYW5pbmcgb2YKCQkgKiAibmV2ZXIgdHJhbnNtaXQiCgkJICovCgkJaWYgKHBrdF9kZXYtPmRlbGF5X3VzID09IDB4N0ZGRkZGRkYpIHsKCQkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCkgKyBwa3RfZGV2LT5kZWxheV91czsKCQkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IHBrdF9kZXYtPmRlbGF5X25zOwoJCQlnb3RvIG91dDsKCQl9Cgl9CgkKCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpIHx8IG5lZWRfcmVzY2hlZCgpKSB7CgkJaWRsZV9zdGFydCA9IGdldEN1clVzKCk7CgkJCgkJaWYgKCFuZXRpZl9ydW5uaW5nKG9kZXYpKSB7CgkJCXBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKCQkJZ290byBvdXQ7CgkJfQoJCWlmIChuZWVkX3Jlc2NoZWQoKSkgCgkJCXNjaGVkdWxlKCk7CgkJCgkJcGt0X2Rldi0+aWRsZV9hY2MgKz0gZ2V0Q3VyVXMoKSAtIGlkbGVfc3RhcnQ7CgkJCgkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQob2RldikpIHsKCQkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7IC8qIFRPRE8gKi8KCQkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CgkJCWdvdG8gb3V0OyAvKiBUcnkgdGhlIG5leHQgaW50ZXJmYWNlICovCgkJfQoJfQoJCglpZiAocGt0X2Rldi0+bGFzdF9vayB8fCAhcGt0X2Rldi0+c2tiKSB7CgkJaWYgKCgrK3BrdF9kZXYtPmNsb25lX2NvdW50ID49IHBrdF9kZXYtPmNsb25lX3NrYiApIHx8ICghcGt0X2Rldi0+c2tiKSkgewoJCQkvKiBidWlsZCBhIG5ldyBwa3QgKi8KCQkJaWYgKHBrdF9kZXYtPnNrYikgCgkJCQlrZnJlZV9za2IocGt0X2Rldi0+c2tiKTsKCQkJCgkJCXBrdF9kZXYtPnNrYiA9IGZpbGxfcGFja2V0KG9kZXYsIHBrdF9kZXYpOwoJCQlpZiAocGt0X2Rldi0+c2tiID09IE5VTEwpIHsKCQkJCXByaW50aygicGt0Z2VuOiBFUlJPUjogY291bGRuJ3QgYWxsb2NhdGUgc2tiIGluIGZpbGxfcGFja2V0LlxuIik7CgkJCQlzY2hlZHVsZSgpOwoJCQkJcGt0X2Rldi0+Y2xvbmVfY291bnQtLTsgLyogYmFjayBvdXQgaW5jcmVtZW50LCBPT00gKi8KCQkJCWdvdG8gb3V0OwoJCQl9CgkJCXBrdF9kZXYtPmFsbG9jYXRlZF9za2JzKys7CgkJCXBrdF9kZXYtPmNsb25lX2NvdW50ID0gMDsgLyogcmVzZXQgY291bnRlciAqLwoJCX0KCX0KCQoJc3Bpbl9sb2NrX2JoKCZvZGV2LT54bWl0X2xvY2spOwoJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKG9kZXYpKSB7CgoJCWF0b21pY19pbmMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7CnJldHJ5X25vdzoKCQlyZXQgPSBvZGV2LT5oYXJkX3N0YXJ0X3htaXQocGt0X2Rldi0+c2tiLCBvZGV2KTsKCQlpZiAobGlrZWx5KHJldCA9PSBORVRERVZfVFhfT0spKSB7CgkJCXBrdF9kZXYtPmxhc3Rfb2sgPSAxOyAgICAKCQkJcGt0X2Rldi0+c29mYXIrKzsKCQkJcGt0X2Rldi0+c2VxX251bSsrOwoJCQlwa3RfZGV2LT50eF9ieXRlcyArPSBwa3RfZGV2LT5jdXJfcGt0X3NpemU7CgkJCQoJCX0gZWxzZSBpZiAocmV0ID09IE5FVERFVl9UWF9MT0NLRUQgCgkJCSAgICYmIChvZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTExUWCkpIHsKCQkJY3B1X3JlbGF4KCk7CgkJCWdvdG8gcmV0cnlfbm93OwoJCX0gZWxzZSB7ICAvKiBSZXRyeSBpdCBuZXh0IHRpbWUgKi8KCQkJCgkJCWF0b21pY19kZWMoJihwa3RfZGV2LT5za2ItPnVzZXJzKSk7CgkJCQoJCQlpZiAoZGVidWcgJiYgbmV0X3JhdGVsaW1pdCgpKQoJCQkJcHJpbnRrKEtFUk5fSU5GTyAicGt0Z2VuOiBIYXJkIHhtaXQgZXJyb3JcbiIpOwoJCQkKCQkJcGt0X2Rldi0+ZXJyb3JzKys7CgkJCXBrdF9kZXYtPmxhc3Rfb2sgPSAwOwoJCX0KCgkJcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7CgkJcGt0X2Rldi0+bmV4dF90eF9ucyA9IDA7CgoJCXBrdF9kZXYtPm5leHRfdHhfdXMgKz0gcGt0X2Rldi0+ZGVsYXlfdXM7CgkJcGt0X2Rldi0+bmV4dF90eF9ucyArPSBwa3RfZGV2LT5kZWxheV9uczsKCgkJaWYgKHBrdF9kZXYtPm5leHRfdHhfbnMgPiAxMDAwKSB7CgkJCXBrdF9kZXYtPm5leHRfdHhfdXMrKzsKCQkJcGt0X2Rldi0+bmV4dF90eF9ucyAtPSAxMDAwOwoJCX0KCX0gCgoJZWxzZSB7ICAvKiBSZXRyeSBpdCBuZXh0IHRpbWUgKi8KICAgICAgICAgICAgICAgIHBrdF9kZXYtPmxhc3Rfb2sgPSAwOwogICAgICAgICAgICAgICAgcGt0X2Rldi0+bmV4dF90eF91cyA9IGdldEN1clVzKCk7IC8qIFRPRE8gKi8KCQlwa3RfZGV2LT5uZXh0X3R4X25zID0gMDsKICAgICAgICB9CgoJc3Bpbl91bmxvY2tfYmgoJm9kZXYtPnhtaXRfbG9jayk7CgkKCS8qIElmIHBrdF9kZXYtPmNvdW50IGlzIHplcm8sIHRoZW4gcnVuIGZvcmV2ZXIgKi8KCWlmICgocGt0X2Rldi0+Y291bnQgIT0gMCkgJiYgKHBrdF9kZXYtPnNvZmFyID49IHBrdF9kZXYtPmNvdW50KSkgewoJCWlmIChhdG9taWNfcmVhZCgmKHBrdF9kZXYtPnNrYi0+dXNlcnMpKSAhPSAxKSB7CgkJCWlkbGVfc3RhcnQgPSBnZXRDdXJVcygpOwoJCQl3aGlsZSAoYXRvbWljX3JlYWQoJihwa3RfZGV2LT5za2ItPnVzZXJzKSkgIT0gMSkgewoJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlzY2hlZHVsZSgpOwoJCQl9CgkJCXBrdF9kZXYtPmlkbGVfYWNjICs9IGdldEN1clVzKCkgLSBpZGxlX3N0YXJ0OwoJCX0KICAgICAgICAgICAgICAgIAoJCS8qIERvbmUgd2l0aCB0aGlzICovCgkJcGt0Z2VuX3N0b3BfZGV2aWNlKHBrdF9kZXYpOwoJfSAKIG91dDo7CiB9CgovKiAKICogTWFpbiBsb29wIG9mIHRoZSB0aHJlYWQgZ29lcyBoZXJlCiAqLwoKc3RhdGljIHZvaWQgcGt0Z2VuX3RocmVhZF93b3JrZXIoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQpIAp7CglERUZJTkVfV0FJVCh3YWl0KTsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CglpbnQgY3B1ID0gdC0+Y3B1OwoJc2lnc2V0X3QgdG1wc2lnOwoJdTMyIG1heF9iZWZvcmVfc29mdGlycTsKICAgICAgICB1MzIgdHhfc2luY2Vfc29mdGlycSA9IDA7CgoJZGFlbW9uaXplKCJwa3RnZW4vJWQiLCBjcHUpOwoKICAgICAgICAvKiBCbG9jayBhbGwgc2lnbmFscyBleGNlcHQgU0lHS0lMTCwgU0lHU1RPUCBhbmQgU0lHVEVSTSAqLwoKICAgICAgICBzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKICAgICAgICB0bXBzaWcgPSBjdXJyZW50LT5ibG9ja2VkOwogICAgICAgIHNpZ2luaXRzZXRpbnYoJmN1cnJlbnQtPmJsb2NrZWQsIAogICAgICAgICAgICAgICAgICAgICAgc2lnbWFzayhTSUdLSUxMKSB8IAogICAgICAgICAgICAgICAgICAgICAgc2lnbWFzayhTSUdTVE9QKXwgCiAgICAgICAgICAgICAgICAgICAgICBzaWdtYXNrKFNJR1RFUk0pKTsKCiAgICAgICAgcmVjYWxjX3NpZ3BlbmRpbmcoKTsKICAgICAgICBzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwoKCS8qIE1pZ3JhdGUgdG8gdGhlIHJpZ2h0IENQVSAqLwoJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShjcHUpKTsKICAgICAgICBpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGNwdSkKICAgICAgICAgICAgICAgIEJVRygpOwoKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnQtPnF1ZXVlKTsKCgl0LT5jb250cm9sICY9IH4oVF9URVJNSU5BVEUpOwoJdC0+Y29udHJvbCAmPSB+KFRfUlVOKTsKCXQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOwoJdC0+Y29udHJvbCAmPSB+KFRfUkVNREVWKTsKCiAgICAgICAgdC0+cGlkID0gY3VycmVudC0+cGlkOyAgICAgICAgCgogICAgICAgIFBHX0RFQlVHKHByaW50aygicGt0Z2VuOiBzdGFydGluZyBwa3RnZW4vJWQ6ICBwaWQ9JWRcbiIsIGNwdSwgY3VycmVudC0+cGlkKSk7CgoJbWF4X2JlZm9yZV9zb2Z0aXJxID0gdC0+bWF4X2JlZm9yZV9zb2Z0aXJxOwogICAgICAgIAogICAgICAgIF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKICAgICAgICBtYigpOwoKICAgICAgICB3aGlsZSAoMSkgewoJCQoJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCgkJLyoKCQkgKiBHZXQgbmV4dCBkZXYgdG8geG1pdCAtLSBpZiBhbnkuCgkJICovCgogICAgICAgICAgICAgICAgcGt0X2RldiA9IG5leHRfdG9fcnVuKHQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAocGt0X2RldikgewoKCQkJcGt0Z2VuX3htaXQocGt0X2Rldik7CgoJCQkvKgoJCQkgKiBXZSBsaWtlIHRvIHN0YXkgUlVOTklORyBidXQgbXVzdCBhbHNvIGdpdmUKCQkJICogb3RoZXJzIGZhaXIgc2hhcmUuCgkJCSAqLwoKCQkJdHhfc2luY2Vfc29mdGlycSArPSBwa3RfZGV2LT5sYXN0X29rOwoKCQkJaWYgKHR4X3NpbmNlX3NvZnRpcnEgPiBtYXhfYmVmb3JlX3NvZnRpcnEpIHsKCQkJCWlmIChsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKSkKCQkJCQlkb19zb2Z0aXJxKCk7CgkJCQl0eF9zaW5jZV9zb2Z0aXJxID0gMDsKCQkJfQoJCX0gZWxzZSB7CgkJCXByZXBhcmVfdG9fd2FpdCgmKHQtPnF1ZXVlKSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CgkJCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOwoJCQlmaW5pc2hfd2FpdCgmKHQtPnF1ZXVlKSwgJndhaXQpOwoJCX0KCiAgICAgICAgICAgICAgICAvKiAKCQkgKiBCYWNrIGZyb20gc2xlZXAsIGVpdGhlciBkdWUgdG8gdGhlIHRpbWVvdXQgb3Igc2lnbmFsLgoJCSAqIFdlIGNoZWNrIGlmIHdlIGhhdmUgYW55ICJwb3N0ZWQiIHdvcmsgZm9yIHVzLgoJCSAqLwoKICAgICAgICAgICAgICAgIGlmICh0LT5jb250cm9sICYgVF9URVJNSU5BVEUgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIAogICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSByZWNlaXZlZCBhIHJlcXVlc3QgdG8gdGVybWluYXRlIG91cnNlbGYgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgkJCgoJCWlmKHQtPmNvbnRyb2wgJiBUX1NUT1ApIHsKCQkJcGt0Z2VuX3N0b3AodCk7CgkJCXQtPmNvbnRyb2wgJj0gfihUX1NUT1ApOwoJCX0KCgkJaWYodC0+Y29udHJvbCAmIFRfUlVOKSB7CgkJCXBrdGdlbl9ydW4odCk7CgkJCXQtPmNvbnRyb2wgJj0gfihUX1JVTik7CgkJfQoKCQlpZih0LT5jb250cm9sICYgVF9SRU1ERVYpIHsKCQkJcGt0Z2VuX3JlbV9hbGxfaWZzKHQpOwoJCQl0LT5jb250cm9sICY9IH4oVF9SRU1ERVYpOwoJCX0KCgkJaWYgKG5lZWRfcmVzY2hlZCgpKSAKCQkJc2NoZWR1bGUoKTsKICAgICAgICB9IAoKICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgc3RvcHBpbmcgYWxsIGRldmljZVxuIiwgdC0+bmFtZSkpOwogICAgICAgIHBrdGdlbl9zdG9wKHQpOwoKICAgICAgICBQR19ERUJVRyhwcmludGsoInBrdGdlbjogJXMgcmVtb3ZpbmcgYWxsIGRldmljZVxuIiwgdC0+bmFtZSkpOwogICAgICAgIHBrdGdlbl9yZW1fYWxsX2lmcyh0KTsKCiAgICAgICAgUEdfREVCVUcocHJpbnRrKCJwa3RnZW46ICVzIHJlbW92aW5nIHRocmVhZC5cbiIsIHQtPm5hbWUpKTsKICAgICAgICBwa3RnZW5fcmVtX3RocmVhZCh0KTsKfQoKc3RhdGljIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RnZW5fZmluZF9kZXYoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIGNvbnN0IGNoYXIqIGlmbmFtZSkgCnsKICAgICAgICBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiA9IE5VTEw7CiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgZm9yKHBrdF9kZXY9dC0+aWZfbGlzdDsgcGt0X2RldjsgcGt0X2RldiA9IHBrdF9kZXYtPm5leHQgKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChwa3RfZGV2LT5pZm5hbWUsIGlmbmFtZSwgSUZOQU1TSVopID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZl91bmxvY2sodCk7CglQR19ERUJVRyhwcmludGsoInBrdGdlbjogZmluZF9kZXYoJXMpIHJldHVybmluZyAlcFxuIiwgaWZuYW1lLHBrdF9kZXYpKTsKICAgICAgICByZXR1cm4gcGt0X2RldjsKfQoKLyogCiAqIEFkZHMgYSBkZXYgYXQgZnJvbnQgb2YgaWZfbGlzdC4gCiAqLwoKc3RhdGljIGludCBhZGRfZGV2X3RvX3RocmVhZChzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgc3RydWN0IHBrdGdlbl9kZXYgKnBrdF9kZXYpIAp7CglpbnQgcnYgPSAwOwoJCiAgICAgICAgaWZfbG9jayh0KTsKCiAgICAgICAgaWYgKHBrdF9kZXYtPnBnX3RocmVhZCkgewogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46IEVSUk9SOiAgYWxyZWFkeSBhc3NpZ25lZCB0byBhIHRocmVhZC5cbiIpOwogICAgICAgICAgICAgICAgcnYgPSAtRUJVU1k7CiAgICAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICB9Cglwa3RfZGV2LT5uZXh0ID10LT5pZl9saXN0OyB0LT5pZl9saXN0PXBrdF9kZXY7CiAgICAgICAgcGt0X2Rldi0+cGdfdGhyZWFkID0gdDsKCXBrdF9kZXYtPnJ1bm5pbmcgPSAwOwoKIG91dDoKICAgICAgICBpZl91bmxvY2sodCk7ICAgICAgICAKICAgICAgICByZXR1cm4gcnY7Cn0KCi8qIENhbGxlZCB1bmRlciB0aHJlYWQgbG9jayAqLwoKc3RhdGljIGludCBwa3RnZW5fYWRkX2RldmljZShzdHJ1Y3QgcGt0Z2VuX3RocmVhZCAqdCwgY29uc3QgY2hhciogaWZuYW1lKSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2OwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZTsKCQoJLyogV2UgZG9uJ3QgYWxsb3cgYSBkZXZpY2UgdG8gYmUgb24gc2V2ZXJhbCB0aHJlYWRzICovCgoJcGt0X2RldiA9IF9fcGt0Z2VuX05OX3RocmVhZHMoaWZuYW1lLCBGSU5EKTsKCWlmIChwa3RfZGV2KSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IGludGVyZmFjZSBhbHJlYWR5IHVzZWQuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAgICAgICAgfQoKCXBrdF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGt0Z2VuX2RldiksIEdGUF9LRVJORUwpOwoJaWYgKCFwa3RfZGV2KQoJCXJldHVybiAtRU5PTUVNOwoKCXBrdF9kZXYtPmZsb3dzID0gdm1hbGxvYyhNQVhfQ0ZMT1dTKnNpemVvZihzdHJ1Y3QgZmxvd19zdGF0ZSkpOwoJaWYgKHBrdF9kZXYtPmZsb3dzID09IE5VTEwpIHsKCQlrZnJlZShwa3RfZGV2KTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCW1lbXNldChwa3RfZGV2LT5mbG93cywgMCwgTUFYX0NGTE9XUypzaXplb2Yoc3RydWN0IGZsb3dfc3RhdGUpKTsKCglwa3RfZGV2LT5taW5fcGt0X3NpemUgPSBFVEhfWkxFTjsKCXBrdF9kZXYtPm1heF9wa3Rfc2l6ZSA9IEVUSF9aTEVOOwoJcGt0X2Rldi0+bmZyYWdzID0gMDsKCXBrdF9kZXYtPmNsb25lX3NrYiA9IHBnX2Nsb25lX3NrYl9kOwoJcGt0X2Rldi0+ZGVsYXlfdXMgPSBwZ19kZWxheV9kIC8gMTAwMDsKCXBrdF9kZXYtPmRlbGF5X25zID0gcGdfZGVsYXlfZCAlIDEwMDA7Cglwa3RfZGV2LT5jb3VudCA9IHBnX2NvdW50X2Q7Cglwa3RfZGV2LT5zb2ZhciA9IDA7Cglwa3RfZGV2LT51ZHBfc3JjX21pbiA9IDk7IC8qIHNpbmsgcG9ydCAqLwoJcGt0X2Rldi0+dWRwX3NyY19tYXggPSA5OwoJcGt0X2Rldi0+dWRwX2RzdF9taW4gPSA5OwoJcGt0X2Rldi0+dWRwX2RzdF9tYXggPSA5OwoKCXN0cm5jcHkocGt0X2Rldi0+aWZuYW1lLCBpZm5hbWUsIElGTkFNU0laKTsKCglpZiAoISBwa3RnZW5fc2V0dXBfZGV2KHBrdF9kZXYpKSB7CgkJcHJpbnRrKCJwa3RnZW46IEVSUk9SOiBwa3RnZW5fc2V0dXBfZGV2IGZhaWxlZC5cbiIpOwoJCWlmIChwa3RfZGV2LT5mbG93cykKCQkJdmZyZWUocGt0X2Rldi0+Zmxvd3MpOwoJCWtmcmVlKHBrdF9kZXYpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXBlID0gY3JlYXRlX3Byb2NfZW50cnkoaWZuYW1lLCAwNjAwLCBwZ19wcm9jX2Rpcik7CglpZiAoIXBlKSB7CgkJcHJpbnRrKCJwa3RnZW46IGNhbm5vdCBjcmVhdGUgJXMvJXMgcHJvY2ZzIGVudHJ5LlxuIiwKCQkgICAgICAgUEdfUFJPQ19ESVIsIGlmbmFtZSk7CgkJaWYgKHBrdF9kZXYtPmZsb3dzKQoJCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CgkJa2ZyZWUocGt0X2Rldik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglwZS0+cHJvY19mb3BzID0gJnBrdGdlbl9pZl9mb3BzOwoJcGUtPmRhdGEgPSBwa3RfZGV2OwoKCXJldHVybiBhZGRfZGV2X3RvX3RocmVhZCh0LCBwa3RfZGV2KTsKfQoKc3RhdGljIHN0cnVjdCBwa3RnZW5fdGhyZWFkICogX19pbml0IHBrdGdlbl9maW5kX3RocmVhZChjb25zdCBjaGFyKiBuYW1lKSAKewogICAgICAgIHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0ID0gTlVMTDsKCgl0aHJlYWRfbG9jaygpOwoKICAgICAgICB0ID0gcGt0Z2VuX3RocmVhZHM7CiAgICAgICAgd2hpbGUgKHQpIHsKICAgICAgICAgICAgICAgIGlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIHQgPSB0LT5uZXh0OwogICAgICAgIH0KICAgICAgICB0aHJlYWRfdW5sb2NrKCk7CiAgICAgICAgcmV0dXJuIHQ7Cn0KCnN0YXRpYyBpbnQgX19pbml0IHBrdGdlbl9jcmVhdGVfdGhyZWFkKGNvbnN0IGNoYXIqIG5hbWUsIGludCBjcHUpIAp7CiAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBOVUxMOwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZTsKCiAgICAgICAgaWYgKHN0cmxlbihuYW1lKSA+IDMxKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6ICBUaHJlYWQgbmFtZSBjYW5ub3QgYmUgbW9yZSB0aGFuIDMxIGNoYXJhY3RlcnMuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAocGt0Z2VuX2ZpbmRfdGhyZWFkKG5hbWUpKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogRVJST1I6IHRocmVhZDogJXMgYWxyZWFkeSBleGlzdHNcbiIsIG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQoKICAgICAgICB0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBrdGdlbl90aHJlYWQpLCBHRlBfS0VSTkVMKTsKICAgICAgICBpZiAoIXQpIHsKICAgICAgICAgICAgICAgIHByaW50aygicGt0Z2VuOiBFUlJPUjogb3V0IG9mIG1lbW9yeSwgY2FuJ3QgY3JlYXRlIG5ldyB0aHJlYWQuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgIH0KCiAgICAgICAgc3RyY3B5KHQtPm5hbWUsIG5hbWUpOwogICAgICAgIHNwaW5fbG9ja19pbml0KCZ0LT5pZl9sb2NrKTsKCXQtPmNwdSA9IGNwdTsKICAgICAgICAKICAgICAgICBwZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KHQtPm5hbWUsIDA2MDAsIHBnX3Byb2NfZGlyKTsKICAgICAgICBpZiAoIXBlKSB7CiAgICAgICAgICAgICAgICBwcmludGsoInBrdGdlbjogY2Fubm90IGNyZWF0ZSAlcy8lcyBwcm9jZnMgZW50cnkuXG4iLAoJCSAgICAgICBQR19QUk9DX0RJUiwgdC0+bmFtZSk7CiAgICAgICAgICAgICAgICBrZnJlZSh0KTsKICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgIH0KCglwZS0+cHJvY19mb3BzID0gJnBrdGdlbl90aHJlYWRfZm9wczsKCXBlLT5kYXRhID0gdDsKCiAgICAgICAgdC0+bmV4dCA9IHBrdGdlbl90aHJlYWRzOwogICAgICAgIHBrdGdlbl90aHJlYWRzID0gdDsKCglpZiAoa2VybmVsX3RocmVhZCgodm9pZCAqKSBwa3RnZW5fdGhyZWFkX3dvcmtlciwgKHZvaWQgKikgdCwgCgkJCSAgQ0xPTkVfRlMgfCBDTE9ORV9GSUxFUyB8IENMT05FX1NJR0hBTkQpIDwgMCkKCQlwcmludGsoInBrdGdlbjoga2VybmVsX3RocmVhZCgpIGZhaWxlZCBmb3IgY3B1ICVkXG4iLCB0LT5jcHUpOwoKCXJldHVybiAwOwp9CgovKiAKICogUmVtb3ZlcyBhIGRldmljZSBmcm9tIHRoZSB0aHJlYWQgaWZfbGlzdC4gCiAqLwpzdGF0aWMgdm9pZCBfcmVtX2Rldl9mcm9tX2lmX2xpc3Qoc3RydWN0IHBrdGdlbl90aHJlYWQgKnQsIHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KSAKewoJc3RydWN0IHBrdGdlbl9kZXYgKmksICpwcmV2ID0gTlVMTDsKCglpID0gdC0+aWZfbGlzdDsKCgl3aGlsZShpKSB7CgkJaWYoaSA9PSBwa3RfZGV2KSB7CgkJCWlmKHByZXYpIHByZXYtPm5leHQgPSBpLT5uZXh0OwoJCQllbHNlIHQtPmlmX2xpc3QgPSBOVUxMOwoJCQlicmVhazsKCQl9CgkJcHJldiA9IGk7CgkJaT1pLT5uZXh0OwoJfQp9CgpzdGF0aWMgaW50IHBrdGdlbl9yZW1vdmVfZGV2aWNlKHN0cnVjdCBwa3RnZW5fdGhyZWFkICp0LCBzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikgCnsKCglQR19ERUJVRyhwcmludGsoInBrdGdlbjogcmVtb3ZlX2RldmljZSBwa3RfZGV2PSVwXG4iLCBwa3RfZGV2KSk7CgogICAgICAgIGlmIChwa3RfZGV2LT5ydW5uaW5nKSB7IAogICAgICAgICAgICAgICAgcHJpbnRrKCJwa3RnZW46V0FSTklORzogdHJ5aW5nIHRvIHJlbW92ZSBhIHJ1bm5pbmcgaW50ZXJmYWNlLCBzdG9wcGluZyBpdCBub3cuXG4iKTsKICAgICAgICAgICAgICAgIHBrdGdlbl9zdG9wX2RldmljZShwa3RfZGV2KTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLyogRGlzLWFzc29jaWF0ZSBmcm9tIHRoZSBpbnRlcmZhY2UgKi8KCglpZiAocGt0X2Rldi0+b2RldikgewoJCWRldl9wdXQocGt0X2Rldi0+b2Rldik7CiAgICAgICAgICAgICAgICBwa3RfZGV2LT5vZGV2ID0gTlVMTDsKICAgICAgICB9CiAgICAgICAgCgkvKiBBbmQgdXBkYXRlIHRoZSB0aHJlYWQgaWZfbGlzdCAqLwoKCV9yZW1fZGV2X2Zyb21faWZfbGlzdCh0LCBwa3RfZGV2KTsKCiAgICAgICAgLyogQ2xlYW4gdXAgcHJvYyBmaWxlIHN5c3RlbSAqLwoKCXJlbW92ZV9wcm9jX2VudHJ5KHBrdF9kZXYtPmlmbmFtZSwgcGdfcHJvY19kaXIpOwoKCWlmIChwa3RfZGV2LT5mbG93cykKCQl2ZnJlZShwa3RfZGV2LT5mbG93cyk7CglrZnJlZShwa3RfZGV2KTsKICAgICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCBfX2luaXQgcGdfaW5pdCh2b2lkKSAKewoJaW50IGNwdTsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CgoJcHJpbnRrKHZlcnNpb24pOwoKCXBnX3Byb2NfZGlyID0gcHJvY19ta2RpcihQR19QUk9DX0RJUiwgcHJvY19uZXQpOwoJaWYgKCFwZ19wcm9jX2RpcikKCQlyZXR1cm4gLUVOT0RFVjsKCXBnX3Byb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwoKCXBlID0gY3JlYXRlX3Byb2NfZW50cnkoUEdDVFJMLCAwNjAwLCBwZ19wcm9jX2Rpcik7CiAgICAgICAgaWYgKHBlID09IE5VTEwpIHsKCQlwcmludGsoInBrdGdlbjogRVJST1I6IGNhbm5vdCBjcmVhdGUgJXMgcHJvY2ZzIGVudHJ5LlxuIiwgUEdDVFJMKTsKCQlwcm9jX25ldF9yZW1vdmUoUEdfUFJPQ19ESVIpOwogICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgfQoKICAgICAgICBwZS0+cHJvY19mb3BzID0gJnBrdGdlbl9mb3BzOwogICAgICAgIHBlLT5kYXRhICAgICAgPSBOVUxMOwoKCS8qIFJlZ2lzdGVyIHVzIHRvIHJlY2VpdmUgbmV0ZGV2aWNlIGV2ZW50cyAqLwoJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwa3RnZW5fbm90aWZpZXJfYmxvY2spOwogICAgICAgIAoJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKCQljaGFyIGJ1ZlszMF07CgogICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJrcGt0Z2VuZF8laSIsIGNwdSk7CiAgICAgICAgICAgICAgICBwa3RnZW5fY3JlYXRlX3RocmVhZChidWYsIGNwdSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOyAgICAgICAgCn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBwZ19jbGVhbnVwKHZvaWQpCnsKCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmcXVldWUpOwoKICAgICAgICAvKiBTdG9wIGFsbCBpbnRlcmZhY2VzICYgdGhyZWFkcyAqLyAgICAgICAgCgogICAgICAgIHdoaWxlIChwa3RnZW5fdGhyZWFkcykgewogICAgICAgICAgICAgICAgc3RydWN0IHBrdGdlbl90aHJlYWQgKnQgPSBwa3RnZW5fdGhyZWFkczsKICAgICAgICAgICAgICAgIHBrdGdlbl90aHJlYWRzLT5jb250cm9sIHw9IChUX1RFUk1JTkFURSk7CgoJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHF1ZXVlLCAodCAhPSBwa3RnZW5fdGhyZWFkcyksIEhaKTsKICAgICAgICB9CgogICAgICAgIC8qIFVuLXJlZ2lzdGVyIHVzIGZyb20gcmVjZWl2aW5nIG5ldGRldmljZSBldmVudHMgKi8KCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwa3RnZW5fbm90aWZpZXJfYmxvY2spOwoKICAgICAgICAvKiBDbGVhbiB1cCBwcm9jIGZpbGUgc3lzdGVtICovCglyZW1vdmVfcHJvY19lbnRyeShQR0NUUkwsIHBnX3Byb2NfZGlyKTsKCXByb2NfbmV0X3JlbW92ZShQR19QUk9DX0RJUik7Cn0KCgptb2R1bGVfaW5pdChwZ19pbml0KTsKbW9kdWxlX2V4aXQocGdfY2xlYW51cCk7CgpNT0RVTEVfQVVUSE9SKCJSb2JlcnQgT2xzc29uIDxyb2JlcnQub2xzc29uQGl0cy51dS5zZSIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlBhY2tldCBHZW5lcmF0b3IgdG9vbCIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cm1vZHVsZV9wYXJhbShwZ19jb3VudF9kLCBpbnQsIDApOwptb2R1bGVfcGFyYW0ocGdfZGVsYXlfZCwgaW50LCAwKTsKbW9kdWxlX3BhcmFtKHBnX2Nsb25lX3NrYl9kLCBpbnQsIDApOwptb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Cg==