LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIHJwbmcyIC0gcHJvZ3Jlc3NpdmUtbW9kZWwgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgIHJwbmcyLXguYwoKICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBmaWxlcyBwcm9ncmVzc2l2ZWx5LCBhcyBpZiBpdCB3ZXJlCiAgIGEgd2ViIGJyb3dzZXIgKHRob3VnaCB0aGUgZnJvbnQgZW5kIGlzIG9ubHkgc2V0IHVwIHRvIHJlYWQgZnJvbSBmaWxlcykuCiAgIEl0IHN1cHBvcnRzIGdhbW1hIGNvcnJlY3Rpb24sIHVzZXItc3BlY2lmaWVkIGJhY2tncm91bmQgY29sb3JzLCBhbmQgdXNlci0KICAgc3BlY2lmaWVkIGJhY2tncm91bmQgcGF0dGVybnMgKGZvciB0cmFuc3BhcmVudCBpbWFnZXMpLiAgVGhpcyB2ZXJzaW9uIGlzCiAgIGZvciB0aGUgWCBXaW5kb3cgU3lzdGVtICh0ZXN0ZWQgYnkgdGhlIGF1dGhvciB1bmRlciBVbml4IGFuZCBieSBNYXJ0aW4KICAgWmluc2VyIHVuZGVyIE9wZW5WTVM7IG1heSB3b3JrIHVuZGVyIE9TLzIgd2l0aCBhIGxpdHRsZSB0d2Vha2luZykuCgogICBUaGFua3MgdG8gQWRhbSBDb3N0ZWxsbyBhbmQgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIGZvciB0aGUgImRpYW1vbmQiCiAgIGFuZCAicmFkaWFsIHdhdmVzIiBwYXR0ZXJucywgcmVzcGVjdGl2ZWx5LgoKICAgdG8gZG8gKHNvbWVkYXksIG1heWJlKToKICAgIC0gZml4IGV4cG9zZS9yZWRyYXcgY29kZTogIGRvbid0IGRyYXcgZW50aXJlIHJvdyBpZiBvbmx5IHBhcnQgZXhwb3NlZAogICAgLSA4LWJpdCAoY29sb3JtYXBwZWQpIFggc3VwcG9ydAogICAgLSBmaW5pc2ggcmVzaXphYmxlIGNoZWNrZXJib2FyZC1ncmFkaWVudCAoc2l6ZXMgNC0xMjg/KQogICAgLSB1c2UgJS4xMDIzcyB0byBzaW1wbGlmeSB0cnVuY2F0aW9uIG9mIHRpdGxlLWJhciBzdHJpbmc/CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgQ2hhbmdlbG9nOgogICAgLSAxLjAxOiAgaW5pdGlhbCBwdWJsaWMgcmVsZWFzZQogICAgLSAxLjAyOiAgbW9kaWZpZWQgdG8gYWxsb3cgYWJicmV2aWF0ZWQgb3B0aW9uczsgZml4ZWQgY2hhci91Y2hhciBtaXNtYXRjaAogICAgLSAxLjEwOiAgYWRkZWQgc3VwcG9ydCBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsczsgZml4ZWQgWCBwaXhlbC1jb252ZXJzaW9uCiAgICAtIDEuMTE6ICBhZGRlZCAtdXNsZWVwIG9wdGlvbiBmb3IgZGVtb3M7IGZpeGVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGJ1ZwogICAgLSAxLjEyOiAgYWRkZWQgLXBhdXNlIG9wdGlvbiBmb3IgZGVtb3MgYW5kIHRlc3RpbmcKICAgIC0gMS4yMDogIGFkZGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgbmV3IC1tbXgqIG9wdGlvbnMKICAgIC0gMS4yMTogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCiAgICAtIDEuMjI6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCiAgICAtIDEuMjM6ICBhZGRlZCAtYmdwYXQgMCBtb2RlIChzdGQgd2hpdGUvZ3JheSBjaGVja2VyYm9hcmQsIDh4OCBzcXVhcmVzKQogICAgLSAxLjMwOiAgYWRkZWQgLWxvb3Agb3B0aW9uIGZvciAtYmdwYXQgKGlmZGVmIEZFQVRVUkVfTE9PUCk7IGZpeGVkIGJwcCA9CiAgICAgICAgICAgICAgMjQ7IGFkZGVkIHN1cHBvcnQgZm9yIFggcmVzb3VyY2VzICh0aGFua3MgdG8gR2VyaGFyZCBOaWtsYXNjaCkKICAgIC0gMS4zMTogIGFkZGVkIGNvZGUgdG8gc2tpcCB1bnVzZWQgY2h1bmtzICh0aGFua3MgdG8gR2xlbm4gUmFuZGVycy1QZWhyc29uKQogICAgLSAxLjMyOiAgYWRkZWQgQU1ENjQvRU02NFQgc3VwcG9ydCAoX194ODZfNjRfXyk7IGFkZGVkIGJhc2ljIGV4cG9zZS9yZWRyYXcKICAgICAgICAgICAgICBoYW5kbGluZwogICAgLSAyLjAwOiAgZHVhbC1saWNlbnNlZCAoYWRkZWQgR05VIEdQTCkKICAgIC0gMi4wMTogIGZpeGVkIDY0LWJpdCB0eXBvIGluIHJlYWRwbmcyLmM7IGZpeGVkIC1wYXVzZSB1c2FnZSBkZXNjcmlwdGlvbgogICAgLSAyLjAyOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpOyBmaXhlZAogICAgICAgICAgICAgIHVuZXhwZWN0ZWQtRU9GIGFuZCBmaWxlLXJlYWQtZXJyb3IgY2FzZXM7IGZpeGVkIFRyYWNlKCkgY3V0LWFuZC0KICAgICAgICAgICAgICBwYXN0ZSBidWdzCiAgICAtIDIuMDM6ICBkZWxldGVkIHJ1bnRpbWUgTU1YLWVuYWJsaW5nL2Rpc2FibGluZyBhbmQgb2Jzb2xldGUgLW1teCogb3B0aW9ucwogICAgLSAyLjA0OiAgQWRkZWQgInZvaWQoZm9vKTsiIHN0YXRlbWVudHMgdG8gcXVpZXQgcGVkYW50aWMgY29tcGlsZXIgd2FybmluZ3MKICAgICAgICAgICAgIGFib3V0IHVudXNlZCB2YXJpYWJsZXMgKEdSLVApCiAgICAtIDIuMDU6ICBVc2UgbmFub3NsZWVwKCkgaW5zdGVhZCBvZiB1c2xlZXAoKSwgd2hpY2ggaXMgZGVwcmVjYXRlZCAoR1ItUCkuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCwgMjAxNC0yMDE1IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCiAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCiAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCiAgICAgIHRoaXMgc29mdHdhcmUuCgogICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCiAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQogICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CgoKICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKCiAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCiAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQogICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CgogICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwogICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgogICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCgoKICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKCiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBQUk9HTkFNRSAgInJwbmcyLXgiCiNkZWZpbmUgTE9OR05BTUUgICJQcm9ncmVzc2l2ZSBQTkcgVmlld2VyIGZvciBYIgojZGVmaW5lIFZFUlNJT04gICAiMi4wNCBvZiAxNSBKdW5lIDIwMTQiCiNkZWZpbmUgUkVTTkFNRSAgICJycG5nMiIgICAgICAgLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLwojZGVmaW5lIFJFU0NMQVNTICAiUnBuZyIgICAgICAgLyogb3VyIFggcmVzb3VyY2UgY2xhc3MgbmFtZSAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHNldGptcC5oPiAgICAgICAvKiBmb3Igam1wYnVmIGRlY2xhcmF0aW9uIGluIHJlYWRwbmcyLmggKi8KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAvKiBvbmx5IGZvciBQdmRNIGJhY2tncm91bmQgY29kZSAqLwojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaW5jbHVkZSA8WDExL1hvcy5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPiAgIC8qIGRlZmluZXMgWEtfKiBtYWNyb3MgKi8KCiNpZiBfUE9TSVhfQ19TT1VSQ0UgPj0gMTk5MzA5TCAvKiBoYXZlIG5hbm9zbGVlcCgpICovCiMgdW5kZWYgdXNsZWVwCiMgZGVmaW5lIHVzbGVlcCh1c2VjKSB7ICAgICAgICBcCiAgIHN0cnVjdCB0aW1lc3BlYyB0czsgICAgICAgICBcCiAgIHRzLnR2X3NlYyA9IDA7ICAgICAgICAgICAgICBcCiAgIHRzLnR2X25zZWMgPSAodXNlYykgKiAxMDAwOyBcCiAgIG5hbm9zbGVlcCgmdHMsIE5VTEwpOyB9CiMgIGVuZGlmCgojaWZuZGVmIHVzbGVlcCAvKiBoYXZlIG5laXRoZXIgbmFub3NsZWVwKCkgbm9yIHVzbGVlcCgpICovCiMgIGRlZmluZSB1c2xlZXAoeCkgc2xlZXAoKCh4KSs0OTk5OTkpLzEwMDAwMDApCiNlbmRpZgoKI2lmZGVmIFZNUwojICBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCgovKiBhbGwgZm9yIFB2ZE0gYmFja2dyb3VuZCBjb2RlOiAqLwojaWZuZGVmIFBJCiMgIGRlZmluZSBQSSAgICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzOAojZW5kaWYKI2RlZmluZSBQSV8yICAgICAgICAgICAgIChQSSowLjUpCiNkZWZpbmUgSU5WX1BJXzM2MCAgICAgICAoMzYwLjAgLyBQSSkKI2RlZmluZSBNQVgoYSxiKSAgICAgICAgIChhPmI/YTpiKQojZGVmaW5lIE1JTihhLGIpICAgICAgICAgKGE8Yj9hOmIpCiNkZWZpbmUgQ0xJUChhLG1pbixtYXgpICBNQVgobWluLE1JTigoYSksbWF4KSkKI2RlZmluZSBBQlMoYSkgICAgICAgICAgICgoYSk8MD8tKGEpOihhKSkKI2RlZmluZSBDTElQOFAoYykgICAgICAgIE1BWCgwLChNSU4oKGMpLDI1NSkpKSAgIC8qIDgtYml0IHBvcy4gaW50ZWdlciAodWNoKSAqLwojZGVmaW5lIFJPVU5ERihmKSAgICAgICAgKChpbnQpKGYgKyAwLjUpKQoKI2RlZmluZSBRVUlUKGUsaykgKChlLnR5cGUgPT0gQnV0dG9uUHJlc3MgJiYgZS54YnV0dG9uLmJ1dHRvbiA9PSBCdXR0b24xKSB8fCAgXAogICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzICYmICAgLyogIHYtLS0gb3IgMSBmb3Igc2hpZnRlZCBrZXlzICovICBcCiAgICAgICAgICAgICAgICAgICgoayA9IFhMb29rdXBLZXlzeW0oJmUueGtleSwgMCkpID09IFhLX3EgfHwgayA9PSBYS19Fc2NhcGUpKSkKCiNkZWZpbmUgTk9fMjRCSVRfTUFTS1MgLyogdW5kZWYgY2FzZSBub3QgZnVsbHkgd3JpdHRlbi0tb25seSBmb3IgcmVkaXNwbGF5KCkgKi8KCiNkZWZpbmUgcmdiMV9tYXggICBiZ19mcmVxCiNkZWZpbmUgcmdiMV9taW4gICBiZ19ncmF5CiNkZWZpbmUgcmdiMl9tYXggICBiZ19ic2F0CiNkZWZpbmUgcmdiMl9taW4gICBiZ19icm90CgovKiAjZGVmaW5lIERFQlVHICovICAgICAvKiB0aGlzIGVuYWJsZXMgdGhlIFRyYWNlKCkgbWFjcm9zICovCgojaW5jbHVkZSAicmVhZHBuZzIuaCIgICAvKiB0eXBlZGVmcywgY29tbW9uIG1hY3JvcywgcmVhZHBuZzIgcHJvdG90eXBlcyAqLwoKCi8qIGNvdWxkIGp1c3QgaW5jbHVkZSBwbmcuaCwgYnV0IHRoaXMgbWFjcm8gaXMgdGhlIG9ubHkgdGhpbmcgd2UgbmVlZAogKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAogKiAidXNoIGFjb3B5ID0gKGFscGhhKTsiKSAqLwoKI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAogICAgdXNoIHRlbXAgPSAoKHVzaCkoZmcpKih1c2gpKGFscGhhKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAp9CgoKI2RlZmluZSBJTkJVRlNJWkUgNDA5NiAgIC8qIHdpdGggcHNldWRvLXRpbWluZyBvbiAoMSBzZWMgZGVsYXkvYmxvY2spLCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgYmxvY2sgc2l6ZSBjb3JyZXNwb25kcyByb3VnaGx5IHRvIGEgZG93bmxvYWQKICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzcGVlZCAxMCUgZmFzdGVyIHRoYW4gdGhlb3JldGljYWwgMzMuNksgbWF4aW11bQogICAgICAgICAgICAgICAgICAgICAgICAgICogIChhc3N1bWluZyA4IGRhdGEgYml0cywgMSBzdG9wIGJpdCBhbmQgbm8gb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAqICBvdmVyaGVhZCkgKi8KCi8qIGxvY2FsIHByb3RvdHlwZXMgKi8Kc3RhdGljIHZvaWQgcnBuZzJfeF9pbml0ICh2b2lkKTsKc3RhdGljIGludCAgcnBuZzJfeF9jcmVhdGVfd2luZG93ICh2b2lkKTsKc3RhdGljIGludCAgcnBuZzJfeF9sb2FkX2JnX2ltYWdlICh2b2lkKTsKc3RhdGljIHZvaWQgcnBuZzJfeF9kaXNwbGF5X3JvdyAodWxnIHJvdyk7CnN0YXRpYyB2b2lkIHJwbmcyX3hfZmluaXNoX2Rpc3BsYXkgKHZvaWQpOwpzdGF0aWMgdm9pZCBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAodWxnIHN0YXJ0Y29sLCB1bGcgc3RhcnRyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpOwojaWZkZWYgRkVBVFVSRV9MT09QCnN0YXRpYyB2b2lkIHJwbmcyX3hfcmVsb2FkX2JnX2ltYWdlICh2b2lkKTsKc3RhdGljIGludCAgaXNfbnVtYmVyIChjaGFyICpwKTsKI2VuZGlmCnN0YXRpYyB2b2lkIHJwbmcyX3hfY2xlYW51cCAodm9pZCk7CnN0YXRpYyBpbnQgIHJwbmcyX3hfbXNiICh1bGcgdTMydmFsKTsKCgpzdGF0aWMgY2hhciB0aXRsZWJhclsxMDI0XSwgKndpbmRvd19uYW1lID0gdGl0bGViYXI7CnN0YXRpYyBjaGFyICphcHBuYW1lID0gTE9OR05BTUU7CnN0YXRpYyBjaGFyICppY29uX25hbWUgPSBQUk9HTkFNRTsKc3RhdGljIGNoYXIgKnJlc19uYW1lID0gUkVTTkFNRTsKc3RhdGljIGNoYXIgKnJlc19jbGFzcyA9IFJFU0NMQVNTOwpzdGF0aWMgY2hhciAqZmlsZW5hbWU7CnN0YXRpYyBGSUxFICppbmZpbGU7CgpzdGF0aWMgbWFpbnByb2dfaW5mbyBycG5nMl9pbmZvOwoKc3RhdGljIHVjaCBpbmJ1ZltJTkJVRlNJWkVdOwpzdGF0aWMgaW50IGluY291bnQ7CgpzdGF0aWMgaW50IHBhdCA9IDY7ICAgICAgICAvKiBtdXN0IGJlIGxlc3MgdGhhbiBudW1fYmdwYXQgKi8Kc3RhdGljIGludCBiZ19pbWFnZSA9IDA7CnN0YXRpYyBpbnQgYmdzY2FsZSwgYmdzY2FsZV9kZWZhdWx0ID0gMTY7CnN0YXRpYyB1bGcgYmdfcm93Ynl0ZXM7CnN0YXRpYyB1Y2ggKmJnX2RhdGE7CgppbnQgcGF1c2VfYWZ0ZXJfcGFzcyA9IEZBTFNFOwppbnQgZGVtb190aW1pbmcgPSBGQUxTRTsKdWxnIHVzbGVlcF9kdXJhdGlvbiA9IDBMOwoKc3RhdGljIHN0cnVjdCByZ2JfY29sb3IgewogICAgdWNoIHIsIGcsIGI7Cn0gcmdiW10gPSB7CiAgICB7ICAwLCAgIDAsICAgMH0sICAgIC8qICAwOiAgYmxhY2sgKi8KICAgIHsyNTUsIDI1NSwgMjU1fSwgICAgLyogIDE6ICB3aGl0ZSAqLwogICAgezE3MywgMTMyLCAgNTd9LCAgICAvKiAgMjogIHRhbiAqLwogICAgeyA2NCwgMTMyLCAgIDB9LCAgICAvKiAgMzogIG1lZGl1bSBncmVlbiAqLwogICAgezE4OSwgMTE3LCAgIDF9LCAgICAvKiAgNDogIGdvbGQgKi8KICAgIHsyNTMsIDI0OSwgICAxfSwgICAgLyogIDU6ICB5ZWxsb3cgKi8KICAgIHsgIDAsICAgMCwgMjU1fSwgICAgLyogIDY6ICBibHVlICovCiAgICB7ICAwLCAgIDAsIDEyMH0sICAgIC8qICA3OiAgbWVkaXVtIGJsdWUgKi8KICAgIHsyNTUsICAgMCwgMjU1fSwgICAgLyogIDg6ICBtYWdlbnRhICovCiAgICB7IDY0LCAgIDAsICA2NH0sICAgIC8qICA5OiAgZGFyayBtYWdlbnRhICovCiAgICB7MjU1LCAgIDAsICAgMH0sICAgIC8qIDEwOiAgcmVkICovCiAgICB7IDY0LCAgIDAsICAgMH0sICAgIC8qIDExOiAgZGFyayByZWQgKi8KICAgIHsyNTUsIDEyNywgICAwfSwgICAgLyogMTI6ICBvcmFuZ2UgKi8KICAgIHsxOTIsICA5NiwgICAwfSwgICAgLyogMTM6ICBkYXJrZXIgb3JhbmdlICovCiAgICB7IDI0LCAgNjAsICAgMH0sICAgIC8qIDE0OiAgZGFyayBncmVlbi15ZWxsb3cgKi8KICAgIHsgODUsIDEyNSwgMjAwfSwgICAgLyogMTU6ICBpY2UgYmx1ZSAqLwogICAgezE5MiwgMTkyLCAxOTJ9ICAgICAvKiAxNjogIE5ldHNjYXBlL01vc2FpYyBncmF5ICovCn07Ci8qIG5vdCB1c2VkIGZvciBub3csIGJ1dCBzaG91bGQgYmUgZm9yIGVycm9yLWNoZWNraW5nOgpzdGF0aWMgaW50IG51bV9yZ2IgPSBzaXplb2YocmdiKSAvIHNpemVvZihzdHJ1Y3QgcmdiX2NvbG9yKTsKICovCgovKgogICAgVGhpcyB3aG9sZSBzdHJ1Y3QgaXMgYSBmYWlybHkgY2hlZXN5IHdheSB0byBrZWVwIHRoZSBudW1iZXIgb2YKICAgIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgbWluaW11bS4gIFRoZSByYWRpYWwtd2F2ZXMgYmFja2dyb3VuZAogICAgdHlwZSBpcyBhIHBhcnRpY3VsYXJseSBwb29yIGZpdCB0byB0aGUgaW50ZWdlciBlbGVtZW50cyBvZiB0aGUKICAgIHN0cnVjdC4uLmJ1dCBhIGZldyBtYWNyb3MgYW5kIGEgbGl0dGxlIGZpeGVkLXBvaW50IG1hdGggd2lsbCBkbwogICAgd29uZGVycyBmb3IgeWEuCgogICAgdHlwZSBiaXRzOgogICAgICAgRiBFIEQgQyBCIEEgOSA4IDcgNiA1IDQgMyAyIDEgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8IHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCArLSstKy0tIDAgPSBzaGFycC1lZGdlZCBjaGVja2VyYm9hcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgICAxID0gc29mdCBkaWFtb25kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgIDIgPSByYWRpYWwgd2F2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgMy03ID0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCArLS0gZ3JhZGllbnQgIzIgaW52ZXJ0ZWQ/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tIGFsdGVybmF0aW5nIGNvbHVtbnMgaW52ZXJ0ZWQ/CiAqLwpzdGF0aWMgc3RydWN0IGJhY2tncm91bmRfcGF0dGVybiB7CiAgICB1c2ggdHlwZTsKICAgIGludCByZ2IxX21heCwgcmdiMV9taW47ICAgICAvKiBvciBiZ19mcmVxLCBiZ19ncmF5ICovCiAgICBpbnQgcmdiMl9tYXgsIHJnYjJfbWluOyAgICAgLyogb3IgYmdfYnNhdCwgYmdfYnJvdCAoYm90aCBzY2FsZWQgYnkgMTApKi8KfSBiZ1tdID0gewogICAgezAsICAgICAxLDEsIDE2LDE2fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIHdoaXRlIHZzLiBsaWdodCBncmF5IChiYXNpYykgKi8KICAgIHswKzgsICAgMiwwLCAgMSwxNX0sICAgICAgICAvKiBjaGVja2VyZWQ6ICB0YW4vYmxhY2sgdnMuIHdoaXRlL2ljZSBibHVlICovCiAgICB7MCsyNCwgIDIsMCwgIDEsMH0sICAgICAgICAgLyogY2hlY2tlcmVkOiAgdGFuL2JsYWNrIHZzLiB3aGl0ZS9ibGFjayAqLwogICAgezArOCwgICA0LDUsICAwLDJ9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGdvbGQveWVsbG93IHZzLiBibGFjay90YW4gKi8KICAgIHswKzgsICAgNCw1LCAgMCw2fSwgICAgICAgICAvKiBjaGVja2VyZWQ6ICBnb2xkL3llbGxvdyB2cy4gYmxhY2svYmx1ZSAqLwogICAgezAsICAgICA3LDAsICA4LDl9LCAgICAgICAgIC8qIGNoZWNrZXJlZDogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwogICAgezArOCwgIDEzLDAsICA1LDE0fSwgICAgICAgIC8qIGNoZWNrZXJlZDogIG9yYW5nZS9ibGFjayB2cy4geWVsbG93ICovCiAgICB7MCs4LCAgMTIsMCwgMTAsMTF9LCAgICAgICAgLyogY2hlY2tlcmVkOiAgb3JhbmdlL2JsYWNrIHZzLiByZWQgKi8KICAgIHsxLCAgICAgNywwLCAgOCwwfSwgICAgICAgICAvKiBkaWFtb25kczogIGRlZXAgYmx1ZS9ibGFjayB2cy4gbWFnZW50YSAqLwogICAgezEsICAgIDEyLDAsIDExLDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgb3JhbmdlIHZzLiBkYXJrIHJlZCAqLwogICAgezEsICAgIDEwLDAsICA3LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgcmVkIHZzLiBtZWRpdW0gYmx1ZSAqLwogICAgezEsICAgICA0LDAsICA1LDB9LCAgICAgICAgIC8qIGRpYW1vbmRzOiAgZ29sZCB2cy4geWVsbG93ICovCiAgICB7MSwgICAgIDMsMCwgIDAsMH0sICAgICAgICAgLyogZGlhbW9uZHM6ICBtZWRpdW0gZ3JlZW4gdnMuIGJsYWNrICovCiAgICB7MiwgICAgMTYsIDEwMCwgIDIwLCAgIDB9LCAgLyogcmFkaWFsOiAgfmhhcmQgcmFkaWFsIGNvbG9yLWJlYW1zICovCiAgICB7MiwgICAgMTgsIDEwMCwgIDEwLCAgIDJ9LCAgLyogcmFkaWFsOiAgc29mdCwgY3VydmVkIHJhZGlhbCBjb2xvci1iZWFtcyAqLwogICAgezIsICAgIDE2LCAyNTYsIDEwMCwgMjUwfSwgIC8qIHJhZGlhbDogIHZlcnkgdGlnaHQgc3BpcmFsICovCiAgICB7MiwgMTAwMDAsIDI1NiwgIDExLCAgIDB9ICAgLyogcmFkaWFsOiAgZGlwb2xlLW1vaXJlJyAoYWxtb3N0IGZyYWN0YWwpICovCn07CnN0YXRpYyBpbnQgbnVtX2JncGF0ID0gc2l6ZW9mKGJnKSAvIHNpemVvZihzdHJ1Y3QgYmFja2dyb3VuZF9wYXR0ZXJuKTsKCgovKiBYLXNwZWNpZmljIHZhcmlhYmxlcyAqLwpzdGF0aWMgY2hhciAqZGlzcGxheW5hbWU7CnN0YXRpYyBYSW1hZ2UgKnhpbWFnZTsKc3RhdGljIERpc3BsYXkgKmRpc3BsYXk7CnN0YXRpYyBpbnQgZGVwdGg7CnN0YXRpYyBWaXN1YWwgKnZpc3VhbDsKc3RhdGljIFhWaXN1YWxJbmZvICp2aXN1YWxfbGlzdDsKc3RhdGljIGludCBSU2hpZnQsIEdTaGlmdCwgQlNoaWZ0OwpzdGF0aWMgdWxnIFJNYXNrLCBHTWFzaywgQk1hc2s7CnN0YXRpYyBXaW5kb3cgd2luZG93OwpzdGF0aWMgR0MgZ2M7CnN0YXRpYyBDb2xvcm1hcCBjb2xvcm1hcDsKCnN0YXRpYyBpbnQgaGF2ZV9ub25kZWZhdWx0X3Zpc3VhbCA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfY29sb3JtYXAgPSBGQUxTRTsKc3RhdGljIGludCBoYXZlX3dpbmRvdyA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfZ2MgPSBGQUxTRTsKCgoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewojaWZkZWYgc2dpCiAgICBjaGFyIHRtcGxpbmVbODBdOwojZW5kaWYKICAgIGNoYXIgKnAsICpiZ3N0ciA9IE5VTEw7CiAgICBpbnQgcmMsIGFsZW4sIGZsZW47CiAgICBpbnQgZXJyb3IgPSAwOwogICAgaW50IHRpbWluZyA9IEZBTFNFOwogICAgaW50IGhhdmVfYmcgPSBGQUxTRTsKI2lmZGVmIEZFQVRVUkVfTE9PUAogICAgaW50IGxvb3AgPSBGQUxTRTsKICAgIGxvbmcgbG9vcF9pbnRlcnZhbCA9IC0xOyAgICAgICAgICAgIC8qIHNlY29uZHMgKDEwMCwwMDAgbWF4KSAqLwojZW5kaWYKICAgIGRvdWJsZSBMVVRfZXhwb25lbnQ7ICAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwogICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAgLyoganVzdCB0aGUgbW9uaXRvciAqLwogICAgZG91YmxlIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsgICAgLyogd2hvbGUgZGlzcGxheSBzeXN0ZW0gKi8KICAgIFhFdmVudCBlOwogICAgS2V5U3ltIGs7CgoKICAgIC8qIEZpcnN0IGluaXRpYWxpemUgYSBmZXcgdGhpbmdzLCBqdXN0IHRvIGJlIHN1cmUtLW1lbXNldCB0YWtlcyBjYXJlIG9mCiAgICAgKiBkZWZhdWx0IGJhY2tncm91bmQgY29sb3IgKGJsYWNrKSwgYm9vbGVhbnMgKEZBTFNFKSwgcG9pbnRlcnMgKE5VTEwpLAogICAgICogZXRjLiAqLwoKICAgIGRpc3BsYXluYW1lID0gKGNoYXIgKilOVUxMOwogICAgZmlsZW5hbWUgPSAoY2hhciAqKU5VTEw7CiAgICBtZW1zZXQoJnJwbmcyX2luZm8sIDAsIHNpemVvZihtYWlucHJvZ19pbmZvKSk7CgoKICAgIC8qIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igb3VyIGRpc3BsYXktc3lzdGVtIGV4cG9uZW50LCBpLmUuLCB0aGUKICAgICAqIHByb2R1Y3Qgb2YgdGhlIENSVCBleHBvbmVudCBhbmQgdGhlIGV4cG9uZW50IGNvcnJlc3BvbmRpbmcgdG8KICAgICAqIHRoZSBmcmFtZS1idWZmZXIncyBsb29rdXAgdGFibGUgKExVVCksIGlmIGFueS4gIFRoaXMgaXMgbm90IGFuCiAgICAgKiBleGhhdXN0aXZlIGxpc3Qgb2YgTFVUIHZhbHVlcyAoZS5nLiwgT3BlblN0ZXAgaGFzIGEgbG90IG9mIHdlaXJkCiAgICAgKiBvbmVzKSwgYnV0IGl0IHNob3VsZCBjb3ZlciA5OSUgb2YgdGhlIGN1cnJlbnQgcG9zc2liaWxpdGllcy4gKi8KCiNpZiBkZWZpbmVkKE5lWFQpCiAgICAvKiB0aGlyZC1wYXJ0eSB1dGlsaXRpZXMgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdCBMVVQgZXhwb25lbnQgKi8KICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDIuMjsKICAgIC8qCiAgICBpZiAoc29tZV9uZXh0X2Z1bmN0aW9uX3RoYXRfcmV0dXJuc19nYW1tYSgmbmV4dF9nYW1tYSkpCiAgICAgICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gbmV4dF9nYW1tYTsKICAgICAqLwojZWxpZiBkZWZpbmVkKHNnaSkKICAgIExVVF9leHBvbmVudCA9IDEuMCAvIDEuNzsKICAgIC8qIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhbnkgZG9jdW1lbnRlZCBmdW5jdGlvbiB0bwogICAgICogZ2V0IHRoZSAiZ2FtbWEiIHZhbHVlLCBzbyB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KICAgIGluZmlsZSA9IGZvcGVuKCIvZXRjL2NvbmZpZy9zeXN0ZW0uZ2xHYW1tYVZhbCIsICJyIik7CiAgICBpZiAoaW5maWxlKSB7CiAgICAgICAgZG91YmxlIHNnaV9nYW1tYTsKCiAgICAgICAgZmdldHModG1wbGluZSwgODAsIGluZmlsZSk7CiAgICAgICAgZmNsb3NlKGluZmlsZSk7CiAgICAgICAgc2dpX2dhbW1hID0gYXRvZih0bXBsaW5lKTsKICAgICAgICBpZiAoc2dpX2dhbW1hID4gMC4wKQogICAgICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBzZ2lfZ2FtbWE7CiAgICB9CiNlbGlmIGRlZmluZWQoTWFjaW50b3NoKQogICAgTFVUX2V4cG9uZW50ID0gMS44IC8gMi42MTsKICAgIC8qCiAgICBpZiAoc29tZV9tYWNfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZtYWNfZ2FtbWEpKQogICAgICAgIExVVF9leHBvbmVudCA9IG1hY19nYW1tYSAvIDIuNjE7CiAgICAgKi8KI2Vsc2UKICAgIExVVF9leHBvbmVudCA9IDEuMDsgICAvKiBhc3N1bWUgbm8gTFVUOiAgbW9zdCBQQ3MgKi8KI2VuZGlmCgogICAgLyogdGhlIGRlZmF1bHRzIGFib3ZlIGdpdmUgMS4wLCAxLjMsIDEuNSBhbmQgMi4yLCByZXNwZWN0aXZlbHk6ICovCiAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQgPSBMVVRfZXhwb25lbnQgKiBDUlRfZXhwb25lbnQ7CgoKICAgIC8qIElmIHRoZSB1c2VyIGhhcyBzZXQgdGhlIFNDUkVFTl9HQU1NQSBlbnZpcm9ubWVudCB2YXJpYWJsZSBhcyBzdWdnZXN0ZWQKICAgICAqIChzb21ld2hhdCBpbXByZWNpc2VseSkgaW4gdGhlIGxpYnBuZyBkb2N1bWVudGF0aW9uLCB1c2UgdGhhdDsgb3RoZXJ3aXNlCiAgICAgKiB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgd2UganVzdCBjYWxjdWxhdGVkLiAgRWl0aGVyIHdheSwgdGhlIHVzZXIgbWF5CiAgICAgKiBvdmVycmlkZSB0aGlzIHZpYSBhIGNvbW1hbmQtbGluZSBvcHRpb24uICovCgogICAgaWYgKChwID0gZ2V0ZW52KCJTQ1JFRU5fR0FNTUEiKSkgIT0gTlVMTCkKICAgICAgICBycG5nMl9pbmZvLmRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwogICAgZWxzZQogICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGRlZmF1bHRfZGlzcGxheV9leHBvbmVudDsKCgogICAgLyogTm93IHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnMgYW5kIHRoZSBQTkcgZmlsZW5hbWUuICovCgogICAgd2hpbGUgKCorK2FyZ3YgJiYgIWVycm9yKSB7CiAgICAgICAgaWYgKCFzdHJuY21wKCphcmd2LCAiLWRpc3BsYXkiLCAyKSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9ICphcmd2OwogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItZ2FtbWEiLCAyKSkgewogICAgICAgICAgICBpZiAoISorK2FyZ3YpCiAgICAgICAgICAgICAgICArK2Vycm9yOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA9IGF0b2YoKmFyZ3YpOwogICAgICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uZGlzcGxheV9leHBvbmVudCA8PSAwLjApCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDQpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYmdzdHIpICE9IDcgfHwgYmdzdHJbMF0gIT0gJyMnKQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBoYXZlX2JnID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBiZ19pbWFnZSA9IEZBTFNFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcCgqYXJndiwgIi1iZ3BhdCIsIDQpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcGF0ID0gYXRvaSgqYXJndik7CiAgICAgICAgICAgICAgICBpZiAocGF0ID49IDAgJiYgcGF0IDwgbnVtX2JncGF0KSB7CiAgICAgICAgICAgICAgICAgICAgYmdfaW1hZ2UgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIGhhdmVfYmcgPSBGQUxTRTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXVzbGVlcCIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdXNsZWVwX2R1cmF0aW9uID0gKHVsZylhdG9sKCphcmd2KTsKICAgICAgICAgICAgICAgIGRlbW9fdGltaW5nID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItcGF1c2UiLCAyKSkgewogICAgICAgICAgICBwYXVzZV9hZnRlcl9wYXNzID0gVFJVRTsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLXRpbWluZyIsIDIpKSB7CiAgICAgICAgICAgIHRpbWluZyA9IFRSVUU7CiNpZmRlZiBGRUFUVVJFX0xPT1AKICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWxvb3AiLCAyKSkgewogICAgICAgICAgICBsb29wID0gVFJVRTsKICAgICAgICAgICAgaWYgKCFhcmd2WzFdIHx8ICFpc19udW1iZXIoYXJndlsxXSkpCiAgICAgICAgICAgICAgICBsb29wX2ludGVydmFsID0gMjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICArK2FyZ3Y7CiAgICAgICAgICAgICAgICBsb29wX2ludGVydmFsID0gYXRvbCgqYXJndik7CiAgICAgICAgICAgICAgICBpZiAobG9vcF9pbnRlcnZhbCA8IDApCiAgICAgICAgICAgICAgICAgICAgbG9vcF9pbnRlcnZhbCA9IDI7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsb29wX2ludGVydmFsID4gMTAwMDAwKSAgIC8qIGJpdCBtb3JlIHRoYW4gb25lIGRheSAqLwogICAgICAgICAgICAgICAgICAgIGxvb3BfaW50ZXJ2YWwgPSAxMDAwMDA7CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCoqYXJndiAhPSAnLScpIHsKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gKmFyZ3Y7CiAgICAgICAgICAgICAgICBpZiAoYXJndlsxXSkgICAvKiBzaG91bGRuJ3QgYmUgYW55IG1vcmUgYXJncyBhZnRlciBmaWxlbmFtZSAqLwogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgKytlcnJvcjsgICAvKiBub3QgZXhwZWN0aW5nIGFueSBvdGhlciBvcHRpb25zICovCiAgICAgICAgfQogICAgfQoKICAgIGlmICghZmlsZW5hbWUpCiAgICAgICAgKytlcnJvcjsKCgogICAgLyogcHJpbnQgdXNhZ2Ugc2NyZWVuIGlmIGFueSBlcnJvcnMgdXAgdG8gdGhpcyBwb2ludCAqLwoKICAgIGlmIChlcnJvcikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4lcyAlczogICVzXG5cbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKICAgICAgICByZWFkcG5nMl92ZXJzaW9uX2luZm8oKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgogICAgICAgICAgIlVzYWdlOiAgICIpOwogICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgIiVzIFstZGlzcGxheSB4ZHB5XSBbLWdhbW1hIGV4cF0gWy1iZ2NvbG9yIGJnIHwgLWJncGF0IHBhdF1cbiIKICAgICAgICAgICIgICAgICAgICUqcyBbLXVzbGVlcCBkdXIgfCAtdGltaW5nXSBbLXBhdXNlXVxuIiwKICAgICAgICAgIFBST0dOQU1FLCAoaW50KXN0cmxlbihQUk9HTkFNRSksICIgIik7CiAgICAgICAgZnByaW50ZihzdGRlcnIsCiNpZmRlZiBGRUFUVVJFX0xPT1AKICAgICAgICAgICIgICAgICAgIFstbG9vcCBbc2VjXV0iCiNlbmRpZgogICAgICAgICAgIiBmaWxlLnBuZ1xuXG4iKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICIgICAgeGRweVx0bmFtZSBvZiB0aGUgdGFyZ2V0IFggZGlzcGxheSAoZS5nLiwgYGBob3N0bmFtZTowJycpXG4iCiAgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBkaXNwbGF5XG4iCiAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIgogICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIsCiAgICAgICAgICBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQpOwogICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgIlx0XHQgIGFuZCB0aGUgQ1JUIGV4cG9uZW50ICh1c3VhbGx5IDIuMik7IG11c3QgYmUgcG9zaXRpdmVcbiIKICAgICAgICAgICIgICAgYmcgIFx0ZGVzaXJlZCBiYWNrZ3JvdW5kIGNvbG9yIGluIDctY2hhcmFjdGVyIGhleCBSR0IgZm9ybWF0XG4iCiAgICAgICAgICAiXHRcdCAgKGUuZy4sIGBgI2ZmNzcwMCcnIGZvciBvcmFuZ2U6ICBzYW1lIGFzIEhUTUwgY29sb3JzKTtcbiIKICAgICAgICAgICJcdFx0ICB1c2VkIHdpdGggdHJhbnNwYXJlbnQgaW1hZ2VzOyBvdmVycmlkZXMgLWJncGF0XG4iCiAgICAgICAgICAiICAgIHBhdCBcdGRlc2lyZWQgYmFja2dyb3VuZCBwYXR0ZXJuIG51bWJlciAoMC0lZCk7IHVzZWQgd2l0aFxuIgogICAgICAgICAgIlx0XHQgIHRyYW5zcGFyZW50IGltYWdlczsgb3ZlcnJpZGVzIC1iZ2NvbG9yXG4iLAogICAgICAgICAgbnVtX2JncGF0LTEpOwojaWZkZWYgRkVBVFVSRV9MT09QCiAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAiICAgIC1sb29wXHRsb29wcyB0aHJvdWdoIGJhY2tncm91bmQgaW1hZ2VzIGFmdGVyIGluaXRpYWwgZGlzcGxheVxuIgogICAgICAgICAgIlx0XHQgIGlzIGNvbXBsZXRlIChkZXBlbmRzIG9uIC1iZ3BhdClcbiIKICAgICAgICAgICIgICAgc2VjIFx0c2Vjb25kcyB0byBkaXNwbGF5IGVhY2ggYmFja2dyb3VuZCBpbWFnZSAoZGVmYXVsdCA9IDIpXG4iKTsKI2VuZGlmCiAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAiICAgIGR1ciBcdGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcyB0byB3YWl0IGFmdGVyIGRpc3BsYXlpbmcgZWFjaFxuIgogICAgICAgICAgIlx0XHQgIHJvdyAoZm9yIGRlbW8gcHVycG9zZXMpXG4iCiAgICAgICAgICAiICAgIC10aW1pbmdcdGVuYWJsZXMgZGVsYXkgZm9yIGV2ZXJ5IGJsb2NrIHJlYWQsIHRvIHNpbXVsYXRlIG1vZGVtXG4iCiAgICAgICAgICAiXHRcdCAgZG93bmxvYWQgb2YgaW1hZ2UgKH4zNiBLYnBzKVxuIgogICAgICAgICAgIiAgICAtcGF1c2VcdHBhdXNlcyBhZnRlciBkaXNwbGF5aW5nIGVhY2ggcGFzcyB1bnRpbCBtb3VzZSBjbGlja2VkXG4iCiAgICAgICAgICAiXG5QcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3csIGFmdGVyIGltYWdlXG4iCiAgICAgICAgICAiaXMgZGlzcGxheWVkKSB0byBxdWl0LlxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBpZiAoIShpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFBORyBmaWxlIFslc11cbiIsIGZpbGVuYW1lKTsKICAgICAgICArK2Vycm9yOwogICAgfSBlbHNlIHsKICAgICAgICBpbmNvdW50ID0gZnJlYWQoaW5idWYsIDEsIElOQlVGU0laRSwgaW5maWxlKTsKICAgICAgICBpZiAoaW5jb3VudCA8IDggfHwgIXJlYWRwbmcyX2NoZWNrX3NpZyhpbmJ1ZiwgOCkpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgIjogIFslc10gaXMgbm90IGEgUE5HIGZpbGU6IGluY29ycmVjdCBzaWduYXR1cmVcbiIsCiAgICAgICAgICAgICAgZmlsZW5hbWUpOwogICAgICAgICAgICArK2Vycm9yOwogICAgICAgIH0gZWxzZSBpZiAoKHJjID0gcmVhZHBuZzJfaW5pdCgmcnBuZzJfaW5mbykpICE9IDApIHsKICAgICAgICAgICAgc3dpdGNoIChyYykgewogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHJlYWRwbmcyX2luaXQoKSBlcnJvclxuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCBYT3BlbkRpc3BsYXkoKVxuIikpCiAgICAgICAgICAgIGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheW5hbWUpOwogICAgICAgICAgICBpZiAoIWRpc3BsYXkpIHsKICAgICAgICAgICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBjYW4ndCBvcGVuIFggZGlzcGxheSBbJXNdXG4iLAogICAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZT8gZGlzcGxheW5hbWUgOiAiZGVmYXVsdCIpOwogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZXJyb3IpCiAgICAgICAgICAgIGZjbG9zZShpbmZpbGUpOwogICAgfQoKCiAgICBpZiAoZXJyb3IpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGFib3J0aW5nLlxuIik7CiAgICAgICAgZXhpdCgyKTsKICAgIH0KCgogICAgLyogc2V0IHRoZSB0aXRsZS1iYXIgc3RyaW5nLCBidXQgbWFrZSBzdXJlIGJ1ZmZlciBkb2Vzbid0IG92ZXJmbG93ICovCgogICAgYWxlbiA9IHN0cmxlbihhcHBuYW1lKTsKICAgIGZsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwogICAgaWYgKGFsZW4gKyBmbGVuICsgMyA+IDEwMjMpCiAgICAgICAgc3ByaW50Zih0aXRsZWJhciwgIiVzOiAgLi4uJXMiLCBhcHBuYW1lLCBmaWxlbmFtZSsoYWxlbitmbGVuKzYtMTAyMykpOwogICAgZWxzZQogICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogICVzIiwgYXBwbmFtZSwgZmlsZW5hbWUpOwoKCiAgICAvKiBzZXQgc29tZSBmaW5hbCBycG5nMl9pbmZvIHZhcmlhYmxlcyBiZWZvcmUgZW50ZXJpbmcgbWFpbiBkYXRhIGxvb3AgKi8KCiAgICBpZiAoaGF2ZV9iZykgewogICAgICAgIHVuc2lnbmVkIHIsIGcsIGI7ICAgLyogdGhpcyBhcHByb2FjaCBxdWlldHMgY29tcGlsZXIgd2FybmluZ3MgKi8KCiAgICAgICAgc3NjYW5mKGJnc3RyKzEsICIlMnglMnglMngiLCAmciwgJmcsICZiKTsKICAgICAgICBycG5nMl9pbmZvLmJnX3JlZCAgID0gKHVjaClyOwogICAgICAgIHJwbmcyX2luZm8uYmdfZ3JlZW4gPSAodWNoKWc7CiAgICAgICAgcnBuZzJfaW5mby5iZ19ibHVlICA9ICh1Y2gpYjsKICAgIH0gZWxzZQogICAgICAgIHJwbmcyX2luZm8ubmVlZF9iZ2NvbG9yID0gVFJVRTsKCiAgICBycG5nMl9pbmZvLnN0YXRlID0ga1ByZUluaXQ7CiAgICBycG5nMl9pbmZvLm1haW5wcm9nX2luaXQgPSBycG5nMl94X2luaXQ7CiAgICBycG5nMl9pbmZvLm1haW5wcm9nX2Rpc3BsYXlfcm93ID0gcnBuZzJfeF9kaXNwbGF5X3JvdzsKICAgIHJwbmcyX2luZm8ubWFpbnByb2dfZmluaXNoX2Rpc3BsYXkgPSBycG5nMl94X2ZpbmlzaF9kaXNwbGF5OwoKCiAgICAvKiBPSywgdGhpcyBpcyB0aGUgZnVuIHBhcnQ6ICBjYWxsIHJlYWRwbmcyX2RlY29kZV9kYXRhKCkgYXQgdGhlIHN0YXJ0IG9mCiAgICAgKiB0aGUgbG9vcCB0byBkZWFsIHdpdGggb3VyIGZpcnN0IGJ1ZmZlciBvZiBkYXRhIChyZWFkIGluIGFib3ZlIHRvIHZlcmlmeQogICAgICogdGhhdCB0aGUgZmlsZSBpcyBhIFBORyBpbWFnZSksIHRoZW4gbG9vcCB0aHJvdWdoIHRoZSBmaWxlIGFuZCBjb250aW51ZQogICAgICogY2FsbGluZyB0aGUgc2FtZSByb3V0aW5lIHRvIGhhbmRsZSBlYWNoIGNodW5rIG9mIGRhdGEuICBJdCBpbiB0dXJuCiAgICAgKiBwYXNzZXMgdGhlIGRhdGEgdG8gbGlicG5nLCB3aGljaCB3aWxsIGludm9rZSBvbmUgb3IgbW9yZSBvZiBvdXIgY2FsbC0KICAgICAqIGJhY2tzIGFzIGRlY29kZWQgZGF0YSBiZWNvbWUgYXZhaWxhYmxlLiAgV2Ugb3B0aW9uYWxseSBjYWxsIHNsZWVwKCkgZm9yCiAgICAgKiBvbmUgc2Vjb25kIHBlciBpdGVyYXRpb24gdG8gc2ltdWxhdGUgZG93bmxvYWRpbmcgdGhlIGltYWdlIHZpYSBhbiBhbmFsb2cKICAgICAqIG1vZGVtLiAqLwoKICAgIGZvciAoOzspIHsKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiYWJvdXQgdG8gY2FsbCByZWFkcG5nMl9kZWNvZGVfZGF0YSgpXG4iKSkKICAgICAgICBpZiAocmVhZHBuZzJfZGVjb2RlX2RhdGEoJnJwbmcyX2luZm8sIGluYnVmLCBpbmNvdW50KSkKICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSB3aXRoIHJlYWRwbmcyX2RlY29kZV9kYXRhKClcbiIpKQoKICAgICAgICBpZiAoZXJyb3IgfHwgaW5jb3VudCAhPSBJTkJVRlNJWkUgfHwgcnBuZzJfaW5mby5zdGF0ZSA9PSBrRG9uZSkgewogICAgICAgICAgICBpZiAocnBuZzJfaW5mby5zdGF0ZSA9PSBrRG9uZSkgewogICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgZGVjb2RpbmcgUE5HIGltYWdlXG4iKSkKICAgICAgICAgICAgfSBlbHNlIGlmIChmZXJyb3IoaW5maWxlKSkgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FCiAgICAgICAgICAgICAgICAgICI6ICBlcnJvciB3aGlsZSByZWFkaW5nIFBORyBpbWFnZSBmaWxlXG4iKTsKICAgICAgICAgICAgICAgIGV4aXQoMyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmVvZihpbmZpbGUpKSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGVuZCBvZiBmaWxlIHJlYWNoZWQgIgogICAgICAgICAgICAgICAgICAiKHVuZXhwZWN0ZWRseSkgd2hpbGUgcmVhZGluZyBQTkcgaW1hZ2UgZmlsZVxuIik7CiAgICAgICAgICAgICAgICBleGl0KDMpOwogICAgICAgICAgICB9IGVsc2UgLyogaWYgKGVycm9yKSAqLyB7CiAgICAgICAgICAgICAgICAvKiB3aWxsIHByaW50IGVycm9yIG1lc3NhZ2UgYmVsb3cgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICh0aW1pbmcpCiAgICAgICAgICAgIHNsZWVwKDEpOwoKICAgICAgICBpbmNvdW50ID0gZnJlYWQoaW5idWYsIDEsIElOQlVGU0laRSwgaW5maWxlKTsKICAgIH0KCgogICAgLyogY2xlYW4gdXAgUE5HIHN0dWZmIGFuZCByZXBvcnQgYW55IGRlY29kaW5nIGVycm9ycyAqLwoKICAgIGZjbG9zZShpbmZpbGUpOwogICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcmVhZHBuZzJfY2xlYW51cCgpXG4iKSkKICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwoKICAgIGlmIChlcnJvcikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgbGlicG5nIGVycm9yIHdoaWxlIGRlY29kaW5nIFBORyBpbWFnZVxuIik7CiAgICAgICAgZXhpdCgzKTsKICAgIH0KCgojaWZkZWYgRkVBVFVSRV9MT09QCgogICAgaWYgKGxvb3AgJiYgYmdfaW1hZ2UpIHsKICAgICAgICBUcmFjZSgoc3RkZXJyLCAiZW50ZXJpbmcgLWxvb3AgbG9vcCAoRkVBVFVSRV9MT09QKVxuIikpCiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBpbnQgaSwgdXNlX3NsZWVwOwogICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCBub3csIHRoZW47CgogICAgICAgICAgICAvKiBnZXQgY3VycmVudCB0aW1lIGFuZCBhZGQgbG9vcF9pbnRlcnZhbCB0byBnZXQgdGFyZ2V0IHRpbWUgKi8KICAgICAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmdGhlbiwgTlVMTCkgPT0gMCkgewogICAgICAgICAgICAgICAgdGhlbi50dl9zZWMgKz0gbG9vcF9pbnRlcnZhbDsKICAgICAgICAgICAgICAgIHVzZV9zbGVlcCA9IEZBTFNFOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHVzZV9zbGVlcCA9IFRSVUU7CgogICAgICAgICAgICAvKiBkbyBxdWljayBjaGVjayBmb3IgYSBxdWl0IGV2ZW50IGJ1dCBkb24ndCB3YWl0IGZvciBpdCAqLwogICAgICAgICAgICAvKiBHUlIgQlVHOiAgc2hvdWxkIGFsc28gY2hlY2sgZm9yIEV4cG9zZSBldmVudHMgYW5kIHJlZHJhdy4uLiAqLwogICAgICAgICAgICBpZiAoWENoZWNrTWFza0V2ZW50KGRpc3BsYXksIEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzaywgJmUpKQogICAgICAgICAgICAgICAgaWYgKFFVSVQoZSxrKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIC8qIGdlbmVyYXRlIG5leHQgYmFja2dyb3VuZCBpbWFnZSAqLwogICAgICAgICAgICBpZiAoKytwYXQgPj0gbnVtX2JncGF0KQogICAgICAgICAgICAgICAgcGF0ID0gMDsKICAgICAgICAgICAgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2UoKTsKCiAgICAgICAgICAgIC8qIHdhaXQgZm9yIHRpbWVvdXQsIHVzaW5nIHdoYXRldmVyIG1lYW5zIGFyZSBhdmFpbGFibGUgKi8KICAgICAgICAgICAgaWYgKHVzZV9zbGVlcCB8fCBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgIT0gMCkgewogICAgICAgICAgICAgICAgZm9yIChpID0gbG9vcF9pbnRlcnZhbDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSk7CiAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRzogIGFsc28gbmVlZCB0byBjaGVjayBmb3IgRXhwb3NlIChhbmQgcmVkcmF3ISkgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoWENoZWNrTWFza0V2ZW50KGRpc3BsYXksIEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgJmUpICYmIFFVSVQoZSxrKSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBZMjAzOCBCVUchICovCiAgICAgICAgICAgICAgICBpZiAobm93LnR2X3NlYyA8IHRoZW4udHZfc2VjIHx8CiAgICAgICAgICAgICAgICAgICAgKG5vdy50dl9zZWMgPT0gdGhlbi50dl9zZWMgJiYgbm93LnR2X3VzZWMgPCB0aGVuLnR2X3VzZWMpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGludCBxdWl0ID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWNvbmRzX3RvX2dvID0gdGhlbi50dl9zZWMgLSBub3cudHZfc2VjOwogICAgICAgICAgICAgICAgICAgIGxvbmcgdXNsZWVwX3VzZWM7CgogICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljYWxseSBjaGV3IHVwIG1vc3Qgb2YgcmVtYWluaW5nIGxvb3AtaW50ZXJ2YWwgd2l0aAogICAgICAgICAgICAgICAgICAgICAqICBjYWxscyB0byBzbGVlcCgxKSBpbnRlcmxlYXZlZCB3aXRoIGNoZWNrcyBmb3IgcXVpdAogICAgICAgICAgICAgICAgICAgICAqICBldmVudHMsIGJ1dCBhbHNvIHJlY2FsYyB0aW1lLXRvLWdvIHBlcmlvZGljYWxseTsgd2hlbgogICAgICAgICAgICAgICAgICAgICAqICBkb25lLCBjbGVhbiB1cCBhbnkgcmVtYWluaW5nIHRpbWUgd2l0aCB1c2xlZXAoKSBjYWxsCiAgICAgICAgICAgICAgICAgICAgICogIChjb3VsZCBhbHNvIHVzZSBTSUdBTFJNLCBidXQgc2lnbmFscyBhcmUgYSBwYWluLi4uKSAqLwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChzZWNvbmRzX3RvX2dvLS0gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNvbmRzX2RvbmUgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc2Vjb25kc190b19nbzsgIGkgPiAwICYmICFxdWl0OyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc6ICBuZWVkIHRvIGNoZWNrIGZvciBFeHBvc2UgYW5kIHJlZHJhdyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFhDaGVja01hc2tFdmVudChkaXNwbGF5LCBLZXlQcmVzc01hc2sgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvblByZXNzTWFzaywgJmUpICYmIFFVSVQoZSxrKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWl0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3NlY29uZHNfZG9uZSA+IDEwMDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgLyogdGltZSB0byByZWRvIHNlY29uZHNfdG9fZ28gbWVhcy4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVpdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyogT0ssIG1vcmUgdGhhbiAxMDAwIHNlY29uZHMgc2luY2UgbGFzdCBjaGVjazoKICAgICAgICAgICAgICAgICAgICAgICAgICogIGNvcnJlY3QgdGhlIHRpbWUtdG8tZ28gbWVhc3VyZW1lbnQgZm9yIGRyaWZ0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vdy50dl9zZWMgPj0gdGhlbi50dl9zZWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzX3RvX2dvID0gdGhlbi50dl9zZWMgLSBub3cudHZfc2VjOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrc2Vjb25kc190b19nbzsgIC8qIHJlc3RvcmUgd2hhdCB3ZSBzdWJ0cmFjdGVkICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChxdWl0KQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAvKiBicmVha3Mgb3V0ZXIgZG8tbG9vcCwgc2tpcHMgcmVkaXNwbGF5ICovCgogICAgICAgICAgICAgICAgICAgIC8qIHNpbmNlIGRpZmZlcmVuY2UgYmV0d2VlbiAibm93IiBhbmQgInRoZW4iIGlzIGFscmVhZHkKICAgICAgICAgICAgICAgICAgICAgKiAgZWF0ZW4gdXAgdG8gd2l0aGluIGEgY291cGxlIG9mIHNlY29uZHMsIGRvbid0IG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgKiAgd29ycnkgYWJvdXQgb3ZlcmZsb3ctLWJ1dCBtaWdodCBoYXZlIG92ZXJzaG90IChuZWcuKSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICB1c2xlZXBfdXNlYyA9IDEwMDAwMDBMKih0aGVuLnR2X3NlYyAtIG5vdy50dl9zZWMpICsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuLnR2X3VzZWMgLSBub3cudHZfdXNlYzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzbGVlcF91c2VjID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcCgodWxnKXVzbGVlcF91c2VjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGNvbXBvc2l0ZSBpbWFnZSBhZ2FpbnN0IG5ldyBiYWNrZ3JvdW5kIGFuZCBkaXNwbGF5IChub3RlIHRoYXQKICAgICAgICAgICAgICogIHdlIGRvIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUgdGltZSBzcGVudCBkb2luZyB0aGlzLi4uKSAqLwogICAgICAgICAgICBycG5nMl94X3JlZGlzcGxheV9pbWFnZSAoMCwgMCwgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQpOwogICAgICAgIH0KCiAgICB9IGVsc2UgLyogRkFMTCBUSFJPVUdIIGFuZCBkbyB0aGUgbm9ybWFsIHRoaW5nICovCgojZW5kaWYgLyogRkVBVFVSRV9MT09QICovCgogICAgLyogd2FpdCBmb3IgdGhlIHVzZXIgdG8gdGVsbCB1cyB3aGVuIHRvIHF1aXQgKi8KCiAgICBpZiAocnBuZzJfaW5mby5zdGF0ZSA+PSBrV2luZG93SW5pdCkgewogICAgICAgIFRyYWNlKChzdGRlcnIsICJlbnRlcmluZyBmaW5hbCB3YWl0LWZvci1xdWl0LWV2ZW50IGxvb3BcbiIpKQogICAgICAgIGRvIHsKICAgICAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CiAgICAgICAgICAgIGlmIChlLnR5cGUgPT0gRXhwb3NlKSB7CiAgICAgICAgICAgICAgICBYRXhwb3NlRXZlbnQgKmV4ID0gKFhFeHBvc2VFdmVudCAqKSZlOwogICAgICAgICAgICAgICAgcnBuZzJfeF9yZWRpc3BsYXlfaW1hZ2UgKGV4LT54LCBleC0+eSwgZXgtPndpZHRoLCBleC0+aGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKCFRVUlUKGUsaykpOwogICAgfSBlbHNlIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluaXQgY2FsbGJhY2sgbmV2ZXIgY2FsbGVkOiAgcHJvYmFibGUgIgogICAgICAgICAgImxpYnBuZyBlcnJvciB3aGlsZSBkZWNvZGluZyBQTkcgbWV0YWRhdGFcbiIpOwogICAgICAgIGV4aXQoNCk7CiAgICB9CgoKICAgIC8qIHdlJ3JlIGRvbmU6ICBjbGVhbiB1cCBhbGwgaW1hZ2UgYW5kIFggcmVzb3VyY2VzIGFuZCBnbyBhd2F5ICovCgogICAgVHJhY2UoKHN0ZGVyciwgImFib3V0IHRvIGNhbGwgcnBuZzJfeF9jbGVhbnVwKClcbiIpKQogICAgcnBuZzJfeF9jbGVhbnVwKCk7CgogICAgKHZvaWQpYXJnYzsgLyogVW51c2VkICovCgogICAgcmV0dXJuIDA7Cn0KCgoKCgovKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSByZWFkcG5nMl9pbmZvX2NhbGxiYWNrKCkgaW4gcmVhZHBuZzIuYywgd2hpY2gKICogaW4gdHVybiBpcyBjYWxsZWQgYnkgbGlicG5nIGFmdGVyIGFsbCBvZiB0aGUgcHJlLUlEQVQgY2h1bmtzIGhhdmUgYmVlbgogKiByZWFkIGFuZCBwcm9jZXNzZWQtLWkuZS4sIHdlIG5vdyBoYXZlIGVub3VnaCBpbmZvIHRvIGZpbmlzaCBpbml0aWFsaXppbmcgKi8KCnN0YXRpYyB2b2lkIHJwbmcyX3hfaW5pdCh2b2lkKQp7CiAgICB1bGcgaTsKICAgIHVsZyByb3dieXRlcyA9IHJwbmcyX2luZm8ucm93Ynl0ZXM7CgogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2luaXQoKVxuIikpCiAgICBUcmFjZSgoc3RkZXJyLCAiICByb3dieXRlcyA9ICVkXG4iLCBycG5nMl9pbmZvLnJvd2J5dGVzKSkKICAgIFRyYWNlKChzdGRlcnIsICIgIHdpZHRoICA9ICVsZFxuIiwgcnBuZzJfaW5mby53aWR0aCkpCiAgICBUcmFjZSgoc3RkZXJyLCAiICBoZWlnaHQgPSAlbGRcbiIsIHJwbmcyX2luZm8uaGVpZ2h0KSkKCiAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSAodWNoICopbWFsbG9jKHJvd2J5dGVzICogcnBuZzJfaW5mby5oZWlnaHQpOwogICAgaWYgKCFycG5nMl9pbmZvLmltYWdlX2RhdGEpIHsKICAgICAgICByZWFkcG5nMl9jbGVhbnVwKCZycG5nMl9pbmZvKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSAodWNoICoqKW1hbGxvYyhycG5nMl9pbmZvLmhlaWdodCAqIHNpemVvZih1Y2ggKikpOwogICAgaWYgKCFycG5nMl9pbmZvLnJvd19wb2ludGVycykgewogICAgICAgIGZyZWUocnBuZzJfaW5mby5pbWFnZV9kYXRhKTsKICAgICAgICBycG5nMl9pbmZvLmltYWdlX2RhdGEgPSBOVUxMOwogICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytpKQogICAgICAgIHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW2ldID0gcnBuZzJfaW5mby5pbWFnZV9kYXRhICsgaSpyb3dieXRlczsKCgogICAgLyogZG8gdGhlIGJhc2ljIFggaW5pdGlhbGl6YXRpb24gc3R1ZmYsIG1ha2UgdGhlIHdpbmRvdywgYW5kIGZpbGwgaXQgd2l0aAogICAgICogdGhlIHVzZXItc3BlY2lmaWVkLCBmaWxlLXNwZWNpZmllZCBvciBkZWZhdWx0IGJhY2tncm91bmQgY29sb3Igb3IKICAgICAqIHBhdHRlcm4gKi8KCiAgICBpZiAocnBuZzJfeF9jcmVhdGVfd2luZG93KCkpIHsKCiAgICAgICAgLyogR1JSIFRFTVBPUkFSWSBIQUNLOiAgdGhpcyBpcyBmdW5kYW1lbnRhbGx5IG5vIGRpZmZlcmVudCBmcm9tIGNhc2VzCiAgICAgICAgICogYWJvdmU7IGxpYnBuZyBzaG91bGQgY2FsbCBvdXIgZXJyb3IgaGFuZGxlciB0byBsb25nam1wKCkgYmFjayB0byB1cwogICAgICAgICAqIHdoZW4gcG5nX3B0ciBnb2VzIGF3YXkuICBJZiB3ZS9pdCBzZWdmYXVsdCBpbnN0ZWFkLCBzZWVtcyBsaWtlIGEKICAgICAgICAgKiBsaWJwbmcgYnVnLi4uICovCgogICAgICAgIC8qIHdlJ3JlIGhlcmUgdmlhIGxpYnBuZyBjYWxsYmFjaywgc28gaWYgd2luZG93IGZhaWxzLCBjbGVhbiBhbmQgYmFpbCAqLwogICAgICAgIHJlYWRwbmcyX2NsZWFudXAoJnJwbmcyX2luZm8pOwogICAgICAgIHJwbmcyX3hfY2xlYW51cCgpOwogICAgICAgIGV4aXQoMik7CiAgICB9CgogICAgcnBuZzJfaW5mby5zdGF0ZSA9IGtXaW5kb3dJbml0Owp9CgoKCgoKc3RhdGljIGludCBycG5nMl94X2NyZWF0ZV93aW5kb3codm9pZCkKewogICAgdWxnIGJnX3JlZCAgID0gcnBuZzJfaW5mby5iZ19yZWQ7CiAgICB1bGcgYmdfZ3JlZW4gPSBycG5nMl9pbmZvLmJnX2dyZWVuOwogICAgdWxnIGJnX2JsdWUgID0gcnBuZzJfaW5mby5iZ19ibHVlOwogICAgdWxnIGJnX3BpeGVsID0gMEw7CiAgICB1bGcgYXR0cm1hc2s7CiAgICBpbnQgbmVlZF9jb2xvcm1hcCA9IEZBTFNFOwogICAgaW50IHNjcmVlbiwgcGFkOwogICAgdWNoICp4ZGF0YTsKICAgIFdpbmRvdyByb290OwogICAgWEV2ZW50IGU7CiAgICBYR0NWYWx1ZXMgZ2N2YWx1ZXM7CiAgICBYU2V0V2luZG93QXR0cmlidXRlcyBhdHRyOwogICAgWFRleHRQcm9wZXJ0eSB3aW5kb3dOYW1lLCAqcFdpbmRvd05hbWUgPSAmd2luZG93TmFtZTsKICAgIFhUZXh0UHJvcGVydHkgaWNvbk5hbWUsICpwSWNvbk5hbWUgPSAmaWNvbk5hbWU7CiAgICBYVmlzdWFsSW5mbyB2aXN1YWxfaW5mbzsKICAgIFhTaXplSGludHMgKnNpemVfaGludHM7CiAgICBYV01IaW50cyAqd21faGludHM7CiAgICBYQ2xhc3NIaW50ICpjbGFzc19oaW50czsKCgogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBycG5nMl94X2NyZWF0ZV93aW5kb3coKVxuIikpCgogICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkaXNwbGF5KTsKICAgIGRlcHRoID0gRGlzcGxheVBsYW5lcyhkaXNwbGF5LCBzY3JlZW4pOwogICAgcm9vdCA9IFJvb3RXaW5kb3coZGlzcGxheSwgc2NyZWVuKTsKCiNpZmRlZiBERUJVRwogICAgWFN5bmNocm9uaXplKGRpc3BsYXksIFRydWUpOwojZW5kaWYKCiAgICBpZiAoZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKICAgICAgICBpbnQgdmlzdWFsc19tYXRjaGVkID0gMDsKCiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRlZmF1bHQgZGVwdGggaXMgJWQ6ICBjaGVja2luZyBvdGhlciB2aXN1YWxzXG4iLAogICAgICAgICAgZGVwdGgpKQoKICAgICAgICAvKiAyNC1iaXQgZmlyc3QgKi8KICAgICAgICB2aXN1YWxfaW5mby5zY3JlZW4gPSBzY3JlZW47CiAgICAgICAgdmlzdWFsX2luZm8uZGVwdGggPSAyNDsKICAgICAgICB2aXN1YWxfbGlzdCA9IFhHZXRWaXN1YWxJbmZvKGRpc3BsYXksCiAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrIHwgVmlzdWFsRGVwdGhNYXNrLCAmdmlzdWFsX2luZm8sICZ2aXN1YWxzX21hdGNoZWQpOwogICAgICAgIGlmICh2aXN1YWxzX21hdGNoZWQgPT0gMCkgewovKiBHUlI6ICBhZGQgMTUtLCAxNi0gYW5kIDMyLWJpdCBUcnVlQ29sb3IgdmlzdWFscyAoYWxzbyBEaXJlY3RDb2xvcj8pICovCiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCwgYW5kIG5vIgogICAgICAgICAgICAgICIgMjQtYml0IHZpc3VhbHMgZm91bmRcbiIsIGRlcHRoKTsKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQogICAgICAgIFRyYWNlKChzdGRlcnIsICJYR2V0VmlzdWFsSW5mbygpIHJldHVybmVkICVkIDI0LWJpdCB2aXN1YWxzXG4iLAogICAgICAgICAgdmlzdWFsc19tYXRjaGVkKSkKICAgICAgICB2aXN1YWwgPSB2aXN1YWxfbGlzdFswXS52aXN1YWw7CiAgICAgICAgZGVwdGggPSB2aXN1YWxfbGlzdFswXS5kZXB0aDsKLyoKICAgICAgICBjb2xvcm1hcF9zaXplID0gdmlzdWFsX2xpc3RbMF0uY29sb3JtYXBfc2l6ZTsKICAgICAgICB2aXN1YWxfY2xhc3MgPSB2aXN1YWwtPmNsYXNzOwogICAgICAgIHZpc3VhbElEID0gWFZpc3VhbElERnJvbVZpc3VhbCh2aXN1YWwpOwogKi8KICAgICAgICBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gVFJVRTsKICAgICAgICBuZWVkX2NvbG9ybWFwID0gVFJVRTsKICAgIH0gZWxzZSB7CiAgICAgICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLCBUcnVlQ29sb3IsICZ2aXN1YWxfaW5mbyk7CiAgICAgICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwogICAgfQoKICAgIFJNYXNrID0gdmlzdWFsLT5yZWRfbWFzazsKICAgIEdNYXNrID0gdmlzdWFsLT5ncmVlbl9tYXNrOwogICAgQk1hc2sgPSB2aXN1YWwtPmJsdWVfbWFzazsKCi8qIEdSUjogIGFkZC9jaGVjayA4LWJpdCBzdXBwb3J0ICovCiAgICBpZiAoZGVwdGggPT0gOCB8fCBuZWVkX2NvbG9ybWFwKSB7CiAgICAgICAgY29sb3JtYXAgPSBYQ3JlYXRlQ29sb3JtYXAoZGlzcGxheSwgcm9vdCwgdmlzdWFsLCBBbGxvY05vbmUpOwogICAgICAgIGlmICghY29sb3JtYXApIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlQ29sb3JtYXAoKSBmYWlsZWRcbiIpOwogICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICB9CiAgICAgICAgaGF2ZV9jb2xvcm1hcCA9IFRSVUU7CiAgICAgICAgaWYgKGRlcHRoID09IDgpCiAgICAgICAgICAgIGJnX2ltYWdlID0gRkFMU0U7ICAgLyogZ3JhZGllbnQganVzdCB3YXN0ZXMgcGFsZXR0ZSBlbnRyaWVzICovCiAgICB9CiAgICBpZiAoZGVwdGggPT0gMTUgfHwgZGVwdGggPT0gMTYpIHsKICAgICAgICBSU2hpZnQgPSAxNSAtIHJwbmcyX3hfbXNiKFJNYXNrKTsgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cyAqLwogICAgICAgIEdTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoR01hc2spOwogICAgICAgIEJTaGlmdCA9IDE1IC0gcnBuZzJfeF9tc2IoQk1hc2spOwogICAgfSBlbHNlIGlmIChkZXB0aCA+IDE2KSB7CiAgICAgICAgUlNoaWZ0ID0gcnBuZzJfeF9tc2IoUk1hc2spIC0gNzsgICAgIC8qIHRoZXNlIGFyZSBsZWZ0LXNoaWZ0cyAqLwogICAgICAgIEdTaGlmdCA9IHJwbmcyX3hfbXNiKEdNYXNrKSAtIDc7CiAgICAgICAgQlNoaWZ0ID0gcnBuZzJfeF9tc2IoQk1hc2spIC0gNzsKICAgIH0KICAgIGlmIChkZXB0aCA+PSAxNSAmJiAoUlNoaWZ0IDwgMCB8fCBHU2hpZnQgPCAwIHx8IEJTaGlmdCA8IDApKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJycG5nMiBpbnRlcm5hbCBsb2dpYyBlcnJvcjogIG5lZ2F0aXZlIFggc2hpZnQocykhXG4iKTsKICAgICAgICByZXR1cm4gMjsKICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGF0dHIuYmFja2luZ19zdG9yZSA9IEFsd2F5czsKICAgIGF0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzazsKICAgIGF0dHJtYXNrID0gQ1dCYWNraW5nU3RvcmUgfCBDV0V2ZW50TWFzazsKICAgIGlmIChoYXZlX25vbmRlZmF1bHRfdmlzdWFsKSB7CiAgICAgICAgYXR0ci5jb2xvcm1hcCA9IGNvbG9ybWFwOwogICAgICAgIGF0dHIuYmFja2dyb3VuZF9waXhlbCA9IDA7CiAgICAgICAgYXR0ci5ib3JkZXJfcGl4ZWwgPSAxOwogICAgICAgIGF0dHJtYXNrIHw9IENXQ29sb3JtYXAgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWw7CiAgICB9CgogICAgd2luZG93ID0gWENyZWF0ZVdpbmRvdyhkaXNwbGF5LCByb290LCAwLCAwLCBycG5nMl9pbmZvLndpZHRoLAogICAgICBycG5nMl9pbmZvLmhlaWdodCwgMCwgZGVwdGgsIElucHV0T3V0cHV0LCB2aXN1YWwsIGF0dHJtYXNrLCAmYXR0cik7CgogICAgaWYgKHdpbmRvdyA9PSBOb25lKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJYQ3JlYXRlV2luZG93KCkgZmFpbGVkXG4iKTsKICAgICAgICByZXR1cm4gMjsKICAgIH0gZWxzZQogICAgICAgIGhhdmVfd2luZG93ID0gVFJVRTsKCiAgICBpZiAoZGVwdGggPT0gOCkKICAgICAgICBYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSwgd2luZG93LCBjb2xvcm1hcCk7CgogICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZ3aW5kb3dfbmFtZSwgMSwgcFdpbmRvd05hbWUpKQogICAgICAgIHBXaW5kb3dOYW1lID0gTlVMTDsKICAgIGlmICghWFN0cmluZ0xpc3RUb1RleHRQcm9wZXJ0eSgmaWNvbl9uYW1lLCAxLCBwSWNvbk5hbWUpKQogICAgICAgIHBJY29uTmFtZSA9IE5VTEw7CgogICAgLyogT0sgaWYgZWl0aGVyIGhpbnRzIGFsbG9jYXRpb24gZmFpbHM7IFhTZXRXTVByb3BlcnRpZXMoKSBhbGxvd3MgTlVMTHMgKi8KCiAgICBpZiAoKHNpemVfaGludHMgPSBYQWxsb2NTaXplSGludHMoKSkgIT0gTlVMTCkgewogICAgICAgIC8qIHdpbmRvdyB3aWxsIG5vdCBiZSByZXNpemFibGUgKi8KICAgICAgICBzaXplX2hpbnRzLT5mbGFncyA9IFBNaW5TaXplIHwgUE1heFNpemU7CiAgICAgICAgc2l6ZV9oaW50cy0+bWluX3dpZHRoID0gc2l6ZV9oaW50cy0+bWF4X3dpZHRoID0gKGludClycG5nMl9pbmZvLndpZHRoOwogICAgICAgIHNpemVfaGludHMtPm1pbl9oZWlnaHQgPSBzaXplX2hpbnRzLT5tYXhfaGVpZ2h0ID0KICAgICAgICAgIChpbnQpcnBuZzJfaW5mby5oZWlnaHQ7CiAgICB9CgogICAgaWYgKCh3bV9oaW50cyA9IFhBbGxvY1dNSGludHMoKSkgIT0gTlVMTCkgewogICAgICAgIHdtX2hpbnRzLT5pbml0aWFsX3N0YXRlID0gTm9ybWFsU3RhdGU7CiAgICAgICAgd21faGludHMtPmlucHV0ID0gVHJ1ZTsKICAgICAvKiB3bV9oaW50cy0+aWNvbl9waXhtYXAgPSBpY29uX3BpeG1hcDsgKi8KICAgICAgICB3bV9oaW50cy0+ZmxhZ3MgPSBTdGF0ZUhpbnQgfCBJbnB1dEhpbnQgIC8qIHwgSWNvblBpeG1hcEhpbnQgKi8gOwogICAgfQoKICAgIGlmICgoY2xhc3NfaGludHMgPSBYQWxsb2NDbGFzc0hpbnQoKSkgIT0gTlVMTCkgewogICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfbmFtZSA9IHJlc19uYW1lOwogICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfY2xhc3MgPSByZXNfY2xhc3M7CiAgICB9CgogICAgWFNldFdNUHJvcGVydGllcyhkaXNwbGF5LCB3aW5kb3csIHBXaW5kb3dOYW1lLCBwSWNvbk5hbWUsIE5VTEwsIDAsCiAgICAgIHNpemVfaGludHMsIHdtX2hpbnRzLCBjbGFzc19oaW50cyk7CgogICAgLyogdmFyaW91cyBwcm9wZXJ0aWVzIGFuZCBoaW50cyBubyBsb25nZXIgbmVlZGVkOyBmcmVlIG1lbW9yeSAqLwogICAgaWYgKHBXaW5kb3dOYW1lKQogICAgICAgWEZyZWUocFdpbmRvd05hbWUtPnZhbHVlKTsKICAgIGlmIChwSWNvbk5hbWUpCiAgICAgICBYRnJlZShwSWNvbk5hbWUtPnZhbHVlKTsKICAgIGlmIChzaXplX2hpbnRzKQogICAgICAgIFhGcmVlKHNpemVfaGludHMpOwogICAgaWYgKHdtX2hpbnRzKQogICAgICAgWEZyZWUod21faGludHMpOwogICAgaWYgKGNsYXNzX2hpbnRzKQogICAgICAgWEZyZWUoY2xhc3NfaGludHMpOwoKICAgIFhNYXBXaW5kb3coZGlzcGxheSwgd2luZG93KTsKCiAgICBnYyA9IFhDcmVhdGVHQyhkaXNwbGF5LCB3aW5kb3csIDAsICZnY3ZhbHVlcyk7CiAgICBoYXZlX2djID0gVFJVRTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBYLSBhbmQgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYyg0KnJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOwogICAgICAgIHBhZCA9IDMyOwogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYygyKnJwbmcyX2luZm8ud2lkdGgqcnBuZzJfaW5mby5oZWlnaHQpOwogICAgICAgIHBhZCA9IDE2OwogICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewogICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYyhycG5nMl9pbmZvLndpZHRoKnJwbmcyX2luZm8uaGVpZ2h0KTsKICAgICAgICBwYWQgPSA4OwogICAgfQoKICAgIGlmICgheGRhdGEpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnlcbiIpOwogICAgICAgIHJldHVybiA0OwogICAgfQoKICAgIHhpbWFnZSA9IFhDcmVhdGVJbWFnZShkaXNwbGF5LCB2aXN1YWwsIGRlcHRoLCBaUGl4bWFwLCAwLAogICAgICAoY2hhciAqKXhkYXRhLCBycG5nMl9pbmZvLndpZHRoLCBycG5nMl9pbmZvLmhlaWdodCwgcGFkLCAwKTsKCiAgICBpZiAoIXhpbWFnZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgWENyZWF0ZUltYWdlKCkgZmFpbGVkXG4iKTsKICAgICAgICBmcmVlKHhkYXRhKTsKICAgICAgICByZXR1cm4gMzsKICAgIH0KCiAgICAvKiB0byBhdm9pZCB0ZXN0aW5nIHRoZSBieXRlIG9yZGVyIGV2ZXJ5IHBpeGVsIChvciBkb3VibGluZyB0aGUgc2l6ZSBvZgogICAgICogdGhlIGRyYXdpbmcgcm91dGluZSB3aXRoIGEgZ2lhbnQgaWYtdGVzdCksIHdlIGFyYml0cmFyaWx5IHNldCB0aGUgYnl0ZQogICAgICogb3JkZXIgdG8gTVNCRmlyc3QgYW5kIGxldCBYbGliIHdvcnJ5IGFib3V0IGludmVydGluZyB0aGluZ3Mgb24gbGl0dGxlLQogICAgICogZW5kaWFuIG1hY2hpbmVzIChlLmcuLCBMaW51eC94ODYsIG9sZCBWQVhlbiwgZXRjLiktLXRoaXMgaXMgbm90IHRoZQogICAgICogbW9zdCBlZmZpY2llbnQgYXBwcm9hY2ggKHRoZSBnaWFudCBpZi10ZXN0IHdvdWxkIGJlIGJldHRlciksIGJ1dCBpbgogICAgICogdGhlIGludGVyZXN0IG9mIGNsYXJpdHksIHdlJ2xsIHRha2UgdGhlIGVhc3kgd2F5IG91dC4uLiAqLwoKICAgIHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0OwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEZpbGwgd2luZG93IHdpdGggdGhlIHNwZWNpZmllZCBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0IGlzIGJsYWNrKSBvcgogICAgZmFrZWQgImJhY2tncm91bmQgaW1hZ2UiIChidXQgbGF0dGVyIGlzIGRpc2FibGVkIGlmIDgtYml0OyBncmFkaWVudHMKICAgIGp1c3Qgd2FzdGUgcGFsZXR0ZSBlbnRyaWVzKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChiZ19pbWFnZSkKICAgICAgICBycG5nMl94X2xvYWRfYmdfaW1hZ2UoKTsgICAgLyogcmVzZXRzIGJnX2ltYWdlIGlmIGZhaWxzICovCgogICAgaWYgKCFiZ19pbWFnZSkgewogICAgICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgICAgICBiZ19waXhlbCA9IChiZ19yZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAoYmdfZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgKGJnX2JsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgICAgICBiZ19waXhlbCA9ICgoKGJnX3JlZCAgIDw8IDgpID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICgoKGJnX2dyZWVuIDw8IDgpID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICgoKGJnX2JsdWUgIDw8IDgpID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewoKICAgICAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KCiAgICAgICAgfQogICAgICAgIFhTZXRGb3JlZ3JvdW5kKGRpc3BsYXksIGdjLCBiZ19waXhlbCk7CiAgICAgICAgWEZpbGxSZWN0YW5nbGUoZGlzcGxheSwgd2luZG93LCBnYywgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKICAgICAgICAgIHJwbmcyX2luZm8uaGVpZ2h0KTsKICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBXYWl0IGZvciBmaXJzdCBFeHBvc2UgZXZlbnQgdG8gZG8gYW55IGRyYXdpbmcsIHRoZW4gZmx1c2ggYW5kIHJldHVybi4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGRvCiAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CiAgICB3aGlsZSAoZS50eXBlICE9IEV4cG9zZSB8fCBlLnhleHBvc2UuY291bnQpOwoKICAgIFhGbHVzaChkaXNwbGF5KTsKCiAgICByZXR1cm4gMDsKCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmcyX3hfY3JlYXRlX3dpbmRvdygpICovCgoKCgoKc3RhdGljIGludCBycG5nMl94X2xvYWRfYmdfaW1hZ2Uodm9pZCkKewogICAgdWNoICpzcmM7CiAgICBjaGFyICpkZXN0OwogICAgdWNoIHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7CiAgICB1Y2ggcjFfaW52LCByMl9pbnYsIGcxX2ludiwgZzJfaW52LCBiMV9pbnYsIGIyX2ludjsKICAgIGludCBrLCBobWF4LCBtYXg7CiAgICBpbnQgeGlkeCwgeWlkeCwgeWlkeF9tYXg7CiAgICBpbnQgZXZlbl9vZGRfdmVydCwgZXZlbl9vZGRfaG9yaXosIGV2ZW5fb2RkOwogICAgaW50IGludmVydF9ncmFkaWVudDIgPSAoYmdbcGF0XS50eXBlICYgMHgwOCk7CiAgICBpbnQgaW52ZXJ0X2NvbHVtbjsKICAgIGludCB4aW1hZ2Vfcm93Ynl0ZXMgPSB4aW1hZ2UtPmJ5dGVzX3Blcl9saW5lOwogICAgdWxnIGksIHJvdzsKICAgIHVsZyBwaXhlbDsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBbGxvY2F0ZSBidWZmZXIgZm9yIGZha2UgYmFja2dyb3VuZCBpbWFnZSB0byBiZSB1c2VkIHdpdGggdHJhbnNwYXJlbnQKICAgIGltYWdlczsgaWYgdGhpcyBmYWlscywgcmV2ZXJ0IHRvIHBsYWluIGJhY2tncm91bmQgY29sb3IuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBiZ19yb3dieXRlcyA9IDMgKiBycG5nMl9pbmZvLndpZHRoOwogICAgYmdfZGF0YSA9ICh1Y2ggKiltYWxsb2MoYmdfcm93Ynl0ZXMgKiBycG5nMl9pbmZvLmhlaWdodCk7CiAgICBpZiAoIWJnX2RhdGEpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICI6ICB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiYWNrZ3JvdW5kIGltYWdlXG4iKTsKICAgICAgICBiZ19pbWFnZSA9IDA7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgYmdzY2FsZSA9IChwYXQgPT0gMCk/IDggOiBiZ3NjYWxlX2RlZmF1bHQ7CiAgICB5aWR4X21heCA9IGJnc2NhbGUgLSAxOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFZlcnRpY2FsIGdyYWRpZW50cyAocmFtcHMpIGluIE54TiBzcXVhcmVzLCBhbHRlcm5hdGluZyBkaXJlY3Rpb24gYW5kCiAgICBjb2xvcnMgKE4gPT0gYmdzY2FsZSkuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDApIHsKICAgICAgICB1Y2ggcjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5yOwogICAgICAgIHVjaCBnMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLmc7CiAgICAgICAgdWNoIGIxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uYjsKICAgICAgICB1Y2ggcjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5yOwogICAgICAgIHVjaCBnMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLmc7CiAgICAgICAgdWNoIGIyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uYjsKICAgICAgICBpbnQgcjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yIC0gcjFfbWluOwogICAgICAgIGludCBnMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmcgLSBnMV9taW47CiAgICAgICAgaW50IGIxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYiAtIGIxX21pbjsKICAgICAgICBpbnQgcjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yIC0gcjJfbWluOwogICAgICAgIGludCBnMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmcgLSBnMl9taW47CiAgICAgICAgaW50IGIyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYiAtIGIyX21pbjsKCiAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICB5aWR4ID0gKGludCkocm93ICUgYmdzY2FsZSk7CiAgICAgICAgICAgIGV2ZW5fb2RkX3ZlcnQgPSAoaW50KSgocm93IC8gYmdzY2FsZSkgJiAxKTsKCiAgICAgICAgICAgIHIxID0gcjFfbWluICsgKHIxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMSA9IGcxX21pbiArIChnMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjEgPSBiMV9taW4gKyAoYjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIHIxX2ludiA9IHIxX21pbiArIChyMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMV9pbnYgPSBnMV9taW4gKyAoZzFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjFfaW52ID0gYjFfbWluICsgKGIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CgogICAgICAgICAgICByMiA9IHIyX21pbiArIChyMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzIgPSBnMl9taW4gKyAoZzJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIyID0gYjJfbWluICsgKGIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICByMl9pbnYgPSByMl9taW4gKyAocjJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgZzJfaW52ID0gZzJfbWluICsgKGcyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGIyX2ludiA9IGIyX21pbiArIChiMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwoKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICBldmVuX29kZF9ob3JpeiA9IChpbnQpKChpIC8gYmdzY2FsZSkgJiAxKTsKICAgICAgICAgICAgICAgIGV2ZW5fb2RkID0gZXZlbl9vZGRfdmVydCBeIGV2ZW5fb2RkX2hvcml6OwogICAgICAgICAgICAgICAgaW52ZXJ0X2NvbHVtbiA9CiAgICAgICAgICAgICAgICAgIChldmVuX29kZF9ob3JpeiAmJiAoYmdbcGF0XS50eXBlICYgMHgxMCkpOwogICAgICAgICAgICAgICAgaWYgKGV2ZW5fb2RkID09IDApIHsgICAgICAgIC8qIGdyYWRpZW50ICMxICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGludmVydF9jb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIxX2ludjsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxX2ludjsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxX2ludjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjE7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBncmFkaWVudCAjMiAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoaW52ZXJ0X2NvbHVtbiAmJiBpbnZlcnRfZ3JhZGllbnQyKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAoIWludmVydF9jb2x1bW4gJiYgIWludmVydF9ncmFkaWVudDIpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IHIyOyAgICAgICAvKiBub3QgaW52ZXJ0ZWQgb3IgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcyOyAgICAgICAvKiAgZG91Ymx5IGludmVydGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjJfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzJfaW52OyAgIC8qIHNpbmdseSBpbnZlcnRlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjJfaW52OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBTb2Z0IGdyYWRpZW50LWRpYW1vbmRzIHdpdGggc2NhbGUgPSBiZ3NjYWxlLiAgQ29kZSBjb250cmlidXRlZCBieSBBZGFtCiAgICBNLiBDb3N0ZWxsby4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDEpIHsKCiAgICAgICAgaG1heCA9IChiZ3NjYWxlLTEpLzI7ICAgLyogaGFsZiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCiAgICAgICAgbWF4ID0gMipobWF4OyAgICAgICAgICAgLyogdGhlIG1heCB3ZWlnaHQgb2YgYSBjb2xvciAqLwoKICAgICAgICByMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5yOwogICAgICAgIGcxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLmc7CiAgICAgICAgYjEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uYjsKICAgICAgICByMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5yOwogICAgICAgIGcyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLmc7CiAgICAgICAgYjIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uYjsKCiAgICAgICAgZm9yIChyb3cgPSAwOyAgcm93IDwgcnBuZzJfaW5mby5oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICB5aWR4ID0gKGludCkocm93ICUgYmdzY2FsZSk7CiAgICAgICAgICAgIGlmICh5aWR4ID4gaG1heCkKICAgICAgICAgICAgICAgIHlpZHggPSBiZ3NjYWxlLTEgLSB5aWR4OwogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIHhpZHggPSAoaW50KShpICUgYmdzY2FsZSk7CiAgICAgICAgICAgICAgICBpZiAoeGlkeCA+IGhtYXgpCiAgICAgICAgICAgICAgICAgICAgeGlkeCA9IGJnc2NhbGUtMSAtIHhpZHg7CiAgICAgICAgICAgICAgICBrID0geGlkeCArIHlpZHg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqcjEgKyAobWF4LWspKnIyKSAvIG1heDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypnMSArIChtYXgtaykqZzIpIC8gbWF4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmIxICsgKG1heC1rKSpiMikgLyBtYXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUmFkaWFsICJzdGFyYnVyc3QiIHdpdGggYXppbXV0aGFsIHNpbnVzb2lkczsgW2V2ZW50dWFsbHkgbnVtYmVyIG9mIHNpbnUtCiAgICBzb2lkcyB3aWxsIGVxdWFsIGJnc2NhbGU/XS4gIFRoaXMgb25lIGlzIHNsb3cgYnV0IHZlcnkgY29vbC4gIENvZGUgY29uLQogICAgdHJpYnV0ZWQgYnkgUGlldGVyIFMuIHZhbiBkZXIgTWV1bGVuIChvcmlnaW5hbGx5IGluIFNtYWxsdGFsaykuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICB9IGVsc2UgaWYgKChiZ1twYXRdLnR5cGUgJiAweDA3KSA9PSAyKSB7CiAgICAgICAgdWNoIGNoOwogICAgICAgIGludCBpaSwgeCwgeSwgaHcsIGhoLCBncmF5c3BvdDsKICAgICAgICBkb3VibGUgZnJlcSwgcm90YXRlLCBzYXR1cmF0ZSwgZ3JheSwgaW50ZW5zaXR5OwogICAgICAgIGRvdWJsZSBhbmdsZT0wLjAsIGFvZmZzZXQ9MC4wLCBtYXhEaXN0LCBkaXN0OwogICAgICAgIGRvdWJsZSByZWQ9MC4wLCBncmVlbj0wLjAsIGJsdWU9MC4wLCBodWUsIHMsIHYsIGYsIHAsIHEsIHQ7CgogICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICBjb21wdXRpbmcgcmFkaWFsIGJhY2tncm91bmQuLi4iLAogICAgICAgICAgUFJPR05BTUUpOwogICAgICAgIGZmbHVzaChzdGRlcnIpOwoKICAgICAgICBoaCA9IChpbnQpKHJwbmcyX2luZm8uaGVpZ2h0IC8gMik7CiAgICAgICAgaHcgPSAoaW50KShycG5nMl9pbmZvLndpZHRoIC8gMik7CgogICAgICAgIC8qIHZhcmlhYmxlcyBmb3IgcmFkaWFsIHdhdmVzOgogICAgICAgICAqICAgYW9mZnNldDogIG51bWJlciBvZiBkZWdyZWVzIHRvIHJvdGF0ZSBodWUgW0NVUlJFTlRMWSBOT1QgVVNFRF0KICAgICAgICAgKiAgIGZyZXE6ICBudW1iZXIgb2YgY29sb3IgYmVhbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgY2VudGVyCiAgICAgICAgICogICBncmF5c3BvdDogIHNpemUgb2YgdGhlIGdyYXlpbmcgY2VudGVyIGFyZWEgKGFudGktYWxpYXMpCiAgICAgICAgICogICByb3RhdGU6ICByb3RhdGlvbiBvZiB0aGUgYmVhbXMgYXMgYSBmdW5jdGlvbiBvZiByYWRpdXMKICAgICAgICAgKiAgIHNhdHVyYXRlOiAgc2F0dXJhdGlvbiBvZiBiZWFtcycgc2hhcGUgYXppbXV0aGFsbHkKICAgICAgICAgKi8KICAgICAgICBhbmdsZSA9IENMSVAoYW5nbGUsIDAuMCwgMzYwLjApOwogICAgICAgIGdyYXlzcG90ID0gQ0xJUChiZ1twYXRdLmJnX2dyYXksIDEsIChoaCArIGh3KSk7CiAgICAgICAgZnJlcSA9IE1BWCgoZG91YmxlKWJnW3BhdF0uYmdfZnJlcSwgMC4wKTsKICAgICAgICBzYXR1cmF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19ic2F0ICogMC4xOwogICAgICAgIHJvdGF0ZSA9IChkb3VibGUpYmdbcGF0XS5iZ19icm90ICogMC4xOwogICAgICAgIGdyYXkgPSAwLjA7CiAgICAgICAgaW50ZW5zaXR5ID0gMC4wOwogICAgICAgIG1heERpc3QgPSAoZG91YmxlKSgoaHcqaHcpICsgKGhoKmhoKSk7CgogICAgICAgIGZvciAocm93ID0gMDsgIHJvdyA8IHJwbmcyX2luZm8uaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgeSA9IChpbnQpKHJvdyAtIGhoKTsKICAgICAgICAgICAgZGVzdCA9IChjaGFyICopYmdfZGF0YSArIHJvdypiZ19yb3dieXRlczsKICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBycG5nMl9pbmZvLndpZHRoOyAgKytpKSB7CiAgICAgICAgICAgICAgICB4ID0gKGludCkoaSAtIGh3KTsKICAgICAgICAgICAgICAgIGFuZ2xlID0gKHggPT0gMCk/IFBJXzIgOiBhdGFuKChkb3VibGUpeSAvIChkb3VibGUpeCk7CiAgICAgICAgICAgICAgICBncmF5ID0gKGRvdWJsZSlNQVgoQUJTKHkpLCBBQlMoeCkpIC8gZ3JheXNwb3Q7CiAgICAgICAgICAgICAgICBncmF5ID0gTUlOKDEuMCwgZ3JheSk7CiAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkoKHgqeCkgKyAoeSp5KSkgLyBtYXhEaXN0OwogICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gY29zKChhbmdsZSsocm90YXRlKmRpc3QqUEkpKSAqIGZyZXEpICoKICAgICAgICAgICAgICAgICAgZ3JheSAqIHNhdHVyYXRlOwogICAgICAgICAgICAgICAgaW50ZW5zaXR5ID0gKE1BWChNSU4oaW50ZW5zaXR5LDEuMCksLTEuMCkgKyAxLjApICogMC41OwogICAgICAgICAgICAgICAgaHVlID0gKGFuZ2xlICsgUEkpICogSU5WX1BJXzM2MCArIGFvZmZzZXQ7CiAgICAgICAgICAgICAgICBzID0gZ3JheSAqICgoZG91YmxlKShBQlMoeCkrQUJTKHkpKSAvIChkb3VibGUpKGh3ICsgaGgpKTsKICAgICAgICAgICAgICAgIHMgPSBNSU4oTUFYKHMsMC4wKSwgMS4wKTsKICAgICAgICAgICAgICAgIHYgPSBNSU4oTUFYKGludGVuc2l0eSwwLjApLCAxLjApOwoKICAgICAgICAgICAgICAgIGlmIChzID09IDAuMCkgewogICAgICAgICAgICAgICAgICAgIGNoID0gKHVjaCkodiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChodWUgPCAwLjApIHx8IChodWUgPj0gMzYwLjApKQogICAgICAgICAgICAgICAgICAgICAgICBodWUgLT0gKCgoaW50KShodWUgLyAzNjAuMCkpICogMzYwLjApOwogICAgICAgICAgICAgICAgICAgIGh1ZSAvPSA2MC4wOwogICAgICAgICAgICAgICAgICAgIGlpID0gKGludClodWU7CiAgICAgICAgICAgICAgICAgICAgZiA9IGh1ZSAtIChkb3VibGUpaWk7CiAgICAgICAgICAgICAgICAgICAgcCA9ICgxLjAgLSBzKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgcSA9ICgxLjAgLSAocyAqIGYpKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgdCA9ICgxLjAgLSAocyAqICgxLjAgLSBmKSkpICogdjsKICAgICAgICAgICAgICAgICAgICBpZiAgICAgIChpaSA9PSAwKSB7IHJlZCA9IHY7IGdyZWVuID0gdDsgYmx1ZSA9IHA7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAxKSB7IHJlZCA9IHE7IGdyZWVuID0gdjsgYmx1ZSA9IHA7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAyKSB7IHJlZCA9IHA7IGdyZWVuID0gdjsgYmx1ZSA9IHQ7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSAzKSB7IHJlZCA9IHA7IGdyZWVuID0gcTsgYmx1ZSA9IHY7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA0KSB7IHJlZCA9IHQ7IGdyZWVuID0gcDsgYmx1ZSA9IHY7IH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpaSA9PSA1KSB7IHJlZCA9IHY7IGdyZWVuID0gcDsgYmx1ZSA9IHE7IH0KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkocmVkICogMjU1LjApOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAodWNoKShncmVlbiAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoYmx1ZSAqIDI1NS4wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvbmUuXG4iKTsKICAgICAgICBmZmx1c2goc3RkZXJyKTsKICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBCbGFzdCBiYWNrZ3JvdW5kIGltYWdlIHRvIGRpc3BsYXkgYnVmZmVyIGJlZm9yZSBiZWdpbm5pbmcgUE5HIGRlY29kZS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHVsZyByZWQsIGdyZWVuLCBibHVlOwogICAgICAgIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7ICAgIC8qIHNsaWdodGx5IG9wdGltaXplZCB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgICA8PCBSU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHPyAgdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdCwgUk1hc2ssIGV0Yy4pICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHNyYyA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpKCpzcmMpIDw8IDgpOyAgKytzcmM7CiAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKSgqc3JjKSA8PCA4KTsgICsrc3JjOwogICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7ICArK3NyYzsKICAgICAgICAgICAgICAgIHBpeGVsID0gKChyZWQgICA+PiBSU2hpZnQpICYgUk1hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKCiAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KCiAgICB9CgogICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgMCwgMCwgMCwgcnBuZzJfaW5mby53aWR0aCwKICAgICAgcnBuZzJfaW5mby5oZWlnaHQpOwoKICAgIHJldHVybiAwOwoKfSAvKiBlbmQgZnVuY3Rpb24gcnBuZzJfeF9sb2FkX2JnX2ltYWdlKCkgKi8KCgoKCgpzdGF0aWMgdm9pZCBycG5nMl94X2Rpc3BsYXlfcm93KHVsZyByb3cpCnsKICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOwogICAgdWNoIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKICAgIHVjaCAqc3JjLCAqc3JjMj1OVUxMOwogICAgY2hhciAqZGVzdDsKICAgIHVjaCByLCBnLCBiLCBhOwogICAgaW50IHhpbWFnZV9yb3dieXRlcyA9IHhpbWFnZS0+Ynl0ZXNfcGVyX2xpbmU7CiAgICB1bGcgaSwgcGl4ZWw7CiAgICBzdGF0aWMgaW50IHJvd3M9MCwgcHJldnBhc3M9KC0xKTsKICAgIHN0YXRpYyB1bGcgZmlyc3Ryb3c7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgcm93cyBhbmQgZmlyc3Ryb3cgc2ltcGx5IHRyYWNrIGhvdyBtYW55IHJvd3MgKGFuZCB3aGljaCBvbmVzKSBoYXZlIG5vdAogICAgeWV0IGJlZW4gZGlzcGxheWVkOyBhbHRlcm5hdGl2ZWx5LCB3ZSBjb3VsZCBjYWxsIFhQdXRJbWFnZSgpIGZvciBldmVyeQogICAgcm93IGFuZCBub3QgYm90aGVyIHdpdGggdGhlIHJlY29yZHMta2VlcGluZy4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9kaXNwbGF5X3JvdygpXG4iKSkKCiAgICBpZiAocnBuZzJfaW5mby5wYXNzICE9IHByZXZwYXNzKSB7CiAgICAgICAgaWYgKHBhdXNlX2FmdGVyX3Bhc3MgJiYgcnBuZzJfaW5mby5wYXNzID4gMCkgewogICAgICAgICAgICBYRXZlbnQgZTsKICAgICAgICAgICAgS2V5U3ltIGs7CgogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAiJXM6ICBlbmQgb2YgcGFzcyAlZCBvZiA3OyBjbGljayBpbiBpbWFnZSB3aW5kb3cgdG8gY29udGludWVcbiIsCiAgICAgICAgICAgICAgUFJPR05BTUUsIHByZXZwYXNzICsgMSk7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICBYTmV4dEV2ZW50KGRpc3BsYXksICZlKTsKICAgICAgICAgICAgd2hpbGUgKCFRVUlUKGUsaykpOwogICAgICAgIH0KICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAgcGFzcyAlZCBvZiA3XHIiLCBQUk9HTkFNRSwgcnBuZzJfaW5mby5wYXNzICsgMSk7CiAgICAgICAgZmZsdXNoKHN0ZGVycik7CiAgICAgICAgcHJldnBhc3MgPSBycG5nMl9pbmZvLnBhc3M7CiAgICB9CgogICAgaWYgKHJvd3MgPT0gMCkKICAgICAgICBmaXJzdHJvdyA9IHJvdzsgICAvKiBmaXJzdCByb3cgdGhhdCBpcyBub3QgeWV0IGRpc3BsYXllZCAqLwoKICAgICsrcm93czsgICAvKiBjb3VudCBvZiByb3dzIHJlY2VpdmVkIGJ1dCBub3QgeWV0IGRpc3BsYXllZCAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEFzaWRlIGZyb20gdGhlIHVzZSBvZiB0aGUgcnBuZzJfaW5mbyBzdHJ1Y3QsIHRoZSBsYWNrIG9mIGFuIG91dGVyIGxvb3AKICAgIChvdmVyIHJvd3MpIGFuZCBtb3ZpbmcgdGhlIFhQdXRJbWFnZSgpIGNhbGwgb3V0c2lkZSB0aGUgImlmIChkZXB0aCkiCiAgICB0ZXN0cywgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCB0byBycG5nX3hfZGlzcGxheV9pbWFnZSgpIGluIHRoZSBub24tCiAgICBwcm9ncmVzc2l2ZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CiAgICAgICAgaW50IGJwcCA9IHhpbWFnZS0+Yml0c19wZXJfcGl4ZWw7CgogICAgICAgIHNyYyA9IHJwbmcyX2luZm8uaW1hZ2VfZGF0YSArIHJvdypycG5nMl9pbmZvLnJvd2J5dGVzOwogICAgICAgIGlmIChiZ19pbWFnZSkKICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewogICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgIHJlZCAgID0gKnNyYysrOwogICAgICAgICAgICAgICAgZ3JlZW4gPSAqc3JjKys7CiAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgIChibHVlICA8PCBCU2hpZnQpOwogICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUc/ICB0aGlzIGFzc3VtZXMgYnBwID09IDI0ICYgYml0cyBhcmUgcGFja2VkIGxvdyAqLwogICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAocHJvYmFibHkgbmVlZCB0byB1c2UgUlNoaWZ0LCBSTWFzaywgZXRjLikgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBiID0gKnNyYysrOwogICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewogICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSByOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gZzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gYmdfcmVkOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiZ19ibHVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgaW50byB0aGUKICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCAqLwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoZ3JlZW4sIGcsIGEsIGJnX2dyZWVuKTsKICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYmx1ZSwgIGIsIGEsIGJnX2JsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgIChncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgIGlmIChicHAgPT0gMzIpIHsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogR1JSIEJVRz8gIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDE2KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMTYpIHsKICAgICAgICB1c2ggcmVkLCBncmVlbiwgYmx1ZTsKCiAgICAgICAgc3JjID0gcnBuZzJfaW5mby5yb3dfcG9pbnRlcnNbcm93XTsKICAgICAgICBpZiAoYmdfaW1hZ2UpCiAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDMpIHsKICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKSgqc3JjKSA8PCA4KTsKICAgICAgICAgICAgICAgICsrc3JjOwogICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICArK3NyYzsKICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpKCpzcmMpIDw8IDgpOwogICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoZ3JlZW4gPj4gR1NoaWZ0KSAmIEdNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSAvKiBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSA0KSAqLyB7CiAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGcgPSAqc3JjKys7CiAgICAgICAgICAgICAgICBiID0gKnNyYysrOwogICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgIGlmIChiZ19pbWFnZSkgewogICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICBiZ19ncmVlbiA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgYmdfYmx1ZSAgPSAqc3JjMisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWIgPDwgOCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCliZ19ncmVlbiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWJnX2JsdWUgIDw8IDgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbnRvCiAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyLCByLCBhLCBiZ19yZWQpOwogICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShnLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOwogICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpciA8PCA4KTsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAoKGJsdWUgID4+IEJTaGlmdCkgJiBCTWFzayk7CiAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewoKICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgIH0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRGlzcGxheSBhZnRlciBldmVyeSAxNiByb3dzIG9yIHdoZW4gb24gb25lIG9mIGxhc3QgdHdvIHJvd3MuICAoUmVnaW9uCiAgICBtYXkgaW5jbHVkZSBwcmV2aW91c2x5IGRpc3BsYXllZCBsaW5lcyBkdWUgdG8gaW50ZXJsYWNpbmctLWkuZS4sIG5vdAogICAgY29udGlndW91cy4gIEFsc28sIHNlY29uZC10by1sYXN0IHJvdyBpcyBmaW5hbCBvbmUgaW4gaW50ZXJsYWNlZCBpbWFnZXMKICAgIHdpdGggb2RkIG51bWJlciBvZiByb3dzLikgIEZvciBkZW1vcywgZmx1c2ggKGFuZCBkZWxheSkgYWZ0ZXIgZXZlcnkgMTZ0aAogICAgcm93IHNvICJzcGFyc2UiIHBhc3NlcyBkb24ndCBnbyB0d2ljZSBhcyBmYXN0LgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYgKGRlbW9fdGltaW5nICYmIChyb3cgLSBmaXJzdHJvdyA+PSAxNiB8fCByb3cgPj0gcnBuZzJfaW5mby5oZWlnaHQtMikpIHsKICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWZpcnN0cm93LCAwLAogICAgICAgICAgKGludClmaXJzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgcm93IC0gZmlyc3Ryb3cgKyAxKTsKICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgcm93cyA9IDA7CiAgICAgICAgdXNsZWVwKHVzbGVlcF9kdXJhdGlvbik7CiAgICB9IGVsc2UKICAgIGlmICghZGVtb190aW1pbmcgJiYgKChyb3dzICYgMHhmKSA9PSAwIHx8IHJvdyA+PSBycG5nMl9pbmZvLmhlaWdodC0yKSkgewogICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpZmlyc3Ryb3csIDAsCiAgICAgICAgICAoaW50KWZpcnN0cm93LCBycG5nMl9pbmZvLndpZHRoLCByb3cgLSBmaXJzdHJvdyArIDEpOwogICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgICAgICByb3dzID0gMDsKICAgIH0KCn0KCgoKCgpzdGF0aWMgdm9pZCBycG5nMl94X2ZpbmlzaF9kaXNwbGF5KHZvaWQpCnsKICAgIFRyYWNlKChzdGRlcnIsICJiZWdpbm5pbmcgcnBuZzJfeF9maW5pc2hfZGlzcGxheSgpXG4iKSkKCiAgICAvKiBsYXN0IHJvdyBoYXMgYWxyZWFkeSBiZWVuIGRpc3BsYXllZCBieSBycG5nMl94X2Rpc3BsYXlfcm93KCksIHNvIHdlCiAgICAgKiBoYXZlIG5vdGhpbmcgdG8gZG8gaGVyZSBleGNlcHQgc2V0IGEgZmxhZyBhbmQgbGV0IHRoZSB1c2VyIGtub3cgdGhhdAogICAgICogdGhlIGltYWdlIGlzIGRvbmUgKi8KCiAgICBycG5nMl9pbmZvLnN0YXRlID0ga0RvbmU7CiAgICBwcmludGYoCiAgICAgICJEb25lLiAgUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93KSB0byBxdWl0LlxuIik7CiAgICBmZmx1c2goc3Rkb3V0KTsKfQoKCgoKCnN0YXRpYyB2b2lkIHJwbmcyX3hfcmVkaXNwbGF5X2ltYWdlKHVsZyBzdGFydGNvbCwgdWxnIHN0YXJ0cm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bGcgd2lkdGgsIHVsZyBoZWlnaHQpCnsKICAgIHVjaCBiZ19yZWQgICA9IHJwbmcyX2luZm8uYmdfcmVkOwogICAgdWNoIGJnX2dyZWVuID0gcnBuZzJfaW5mby5iZ19ncmVlbjsKICAgIHVjaCBiZ19ibHVlICA9IHJwbmcyX2luZm8uYmdfYmx1ZTsKICAgIHVjaCAqc3JjLCAqc3JjMj1OVUxMOwogICAgY2hhciAqZGVzdDsKICAgIHVjaCByLCBnLCBiLCBhOwogICAgdWxnIGksIHJvdywgbGFzdHJvdyA9IDA7CiAgICB1bGcgcGl4ZWw7CiAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKCgogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBkaXNwbGF5IGxvb3AgKGltYWdlX2NoYW5uZWxzID09ICVkKVxuIiwKICAgICAgcnBuZzJfaW5mby5jaGFubmVscykpCiAgICBUcmFjZSgoc3RkZXJyLCAiICAgKHdpZHRoID0gJWxkLCByb3dieXRlcyA9ICVkLCB4aW1hZ2Vfcm93Ynl0ZXMgPSAlZClcbiIsCiAgICAgIHJwbmcyX2luZm8ud2lkdGgsIHJwbmcyX2luZm8ucm93Ynl0ZXMsIHhpbWFnZV9yb3dieXRlcykpCiAgICBUcmFjZSgoc3RkZXJyLCAiICAgKGJwcCA9ICVkKVxuIiwgeGltYWdlLT5iaXRzX3Blcl9waXhlbCkpCiAgICBUcmFjZSgoc3RkZXJyLCAiICAgKGJ5dGVfb3JkZXIgPSAlcylcbiIsIHhpbWFnZS0+Ynl0ZV9vcmRlciA9PSBNU0JGaXJzdD8KICAgICAgIk1TQkZpcnN0IiA6ICh4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTFNCRmlyc3Q/ICJMU0JGaXJzdCIgOiAidW5rbm93biIpKSkKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBc2lkZSBmcm9tIHRoZSB1c2Ugb2YgdGhlIHJwbmcyX2luZm8gc3RydWN0IGFuZCBvZiBzcmMyIChmb3IgYmFja2dyb3VuZAogICAgaW1hZ2UpLCB0aGlzIHJvdXRpbmUgaXMgaWRlbnRpY2FsIHRvIHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkgaW4gdGhlIG5vbi0KICAgIHByb2dyZXNzaXZlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0tLWZvciB0aGUgc2ltcGxlIHJlYXNvbiB0aGF0IHJlZGlzcGxheQogICAgb2YgdGhlIGltYWdlIGFnYWluc3QgYSBuZXcgYmFja2dyb3VuZCBoYXBwZW5zIGFmdGVyIHRoZSBpbWFnZSBpcyBmdWxseQogICAgZGVjb2RlZCBhbmQgdGhlcmVmb3JlIGlzLCBieSBkZWZpbml0aW9uLCBub24tcHJvZ3Jlc3NpdmUuCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiAoZGVwdGggPT0gMjQgfHwgZGVwdGggPT0gMzIpIHsKICAgICAgICB1bGcgcmVkLCBncmVlbiwgYmx1ZTsKICAgICAgICBpbnQgYnBwID0geGltYWdlLT5iaXRzX3Blcl9waXhlbDsKCiAgICAgICAgZm9yIChsYXN0cm93ID0gcm93ID0gc3RhcnRyb3c7ICByb3cgPCBzdGFydHJvdytoZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICBzcmMgPSBycG5nMl9pbmZvLmltYWdlX2RhdGEgKyByb3cqcnBuZzJfaW5mby5yb3dieXRlczsKICAgICAgICAgICAgaWYgKGJnX2ltYWdlKQogICAgICAgICAgICAgICAgc3JjMiA9IGJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGRlc3QgPSB4aW1hZ2UtPmRhdGEgKyByb3cqeGltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBpZiAocnBuZzJfaW5mby5jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBycG5nMl9pbmZvLndpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKI2lmZGVmIE5PXzI0QklUX01BU0tTCiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0KI2Vsc2UKICAgICAgICAgICAgICAgICAgICByZWQgICA9IChSU2hpZnQgPCAwKT8gcmVkICAgPDwgKC1SU2hpZnQpIDogcmVkICAgPj4gUlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgJiBSTWFzaykgfCAoZ3JlZW4gJiBHTWFzaykgfCAoYmx1ZSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdC9STWFzay9ldGMuIGhlcmUsIHRvbykgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSBiOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gYmdfcmVkOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9IGJnX2dyZWVuOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGJnX2JsdWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBmaXJzdCBhcmd1bWVudCAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUocmVkLCAgIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShncmVlbiwgZywgYSwgYmdfZ3JlZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUoYmx1ZSwgIGIsIGEsIGJnX2JsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KI2lmZGVmIE5PXzI0QklUX01BU0tTCiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgYXNzdW1lcyBicHAgPT0gMjQgJiBiaXRzIGFyZSBwYWNrZWQgbG93ICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChwcm9iYWJseSBuZWVkIHRvIHVzZSBSU2hpZnQsIFJNYXNrLCBldGMuKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0KI2Vsc2UKICAgICAgICAgICAgICAgICAgICByZWQgICA9IChSU2hpZnQgPCAwKT8gcmVkICAgPDwgKC1SU2hpZnQpIDogcmVkICAgPj4gUlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgJiBSTWFzaykgfCAoZ3JlZW4gJiBHTWFzaykgfCAoYmx1ZSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDMyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+IDI0KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdSUiBCVUcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBhc3N1bWVzIGJwcCA9PSAyNCAmIGJpdHMgYXJlIHBhY2tlZCBsb3cgKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogKHByb2JhYmx5IG5lZWQgdG8gdXNlIFJTaGlmdC9STWFzay9ldGMuIGhlcmUsIHRvbykgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCiAgICAgICAgICAgICAgICAgIChpbnQpbGFzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgMTYpOwogICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwoKICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSBzdGFydHJvdzsgIHJvdyA8IHN0YXJ0cm93K2hlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHNyYyA9IHJwbmcyX2luZm8ucm93X3BvaW50ZXJzW3Jvd107CiAgICAgICAgICAgIGlmIChiZ19pbWFnZSkKICAgICAgICAgICAgICAgIHNyYzIgPSBiZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgaWYgKHJwbmcyX2luZm8uY2hhbm5lbHMgPT0gMykgewogICAgICAgICAgICAgICAgZm9yIChpID0gcnBuZzJfaW5mby53aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChycG5nMl9pbmZvLmNoYW5uZWxzID09IDQpICovIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHJwbmcyX2luZm8ud2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKGJnX2ltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJnX3JlZCAgID0gKnNyYzIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYmdfZ3JlZW4gPSAqc3JjMisrOwogICAgICAgICAgICAgICAgICAgICAgICBiZ19ibHVlICA9ICpzcmMyKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhID09IDI1NSkgewogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gKCh1c2gpYmdfcmVkICAgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpYmdfZ3JlZW4gPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYmdfYmx1ZSAgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBtYWNybyAoZnJvbSBwbmcuaCkgY29tcG9zaXRlcyB0aGUgZm9yZWdyb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYW5kIHB1dHMgdGhlIHJlc3VsdCBiYWNrIGludG8KICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IGFyZ3VtZW50ICg9PSBmZyBieXRlIGhlcmU6ICBzYWZlKSAqLwogICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9jb21wb3NpdGUociwgciwgYSwgYmdfcmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGcsIGcsIGEsIGJnX2dyZWVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGIsIGIsIGEsIGJnX2JsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKXIgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKCh1c2gpZyA8PCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCliIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwaXhlbCA9ICgocmVkICAgPj4gUlNoaWZ0KSAmIFJNYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdyZWVuID4+IEdTaGlmdCkgJiBHTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChibHVlICA+PiBCU2hpZnQpICYgQk1hc2spOwogICAgICAgICAgICAgICAgICAgIC8qIHJlY2FsbCB0aGF0IHdlIHNldCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdCBhYm92ZSAqLwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoKHBpeGVsID4+ICA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSAoY2hhcikoIHBpeGVsICAgICAgICAmIDB4ZmYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGRpc3BsYXkgYWZ0ZXIgZXZlcnkgMTYgbGluZXMgKi8KICAgICAgICAgICAgaWYgKCgocm93KzEpICYgMHhmKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBYUHV0SW1hZ2UoZGlzcGxheSwgd2luZG93LCBnYywgeGltYWdlLCAwLCAoaW50KWxhc3Ryb3csIDAsCiAgICAgICAgICAgICAgICAgIChpbnQpbGFzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgMTYpOwogICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIC8qIGRlcHRoID09IDggKi8gewoKICAgICAgICAvKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwoKICAgIH0KCiAgICBUcmFjZSgoc3RkZXJyLCAiY2FsbGluZyBmaW5hbCBYUHV0SW1hZ2UoKVxuIikpCiAgICBpZiAobGFzdHJvdyA8IHN0YXJ0cm93K2hlaWdodCkgewogICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgIChpbnQpbGFzdHJvdywgcnBuZzJfaW5mby53aWR0aCwgcnBuZzJfaW5mby5oZWlnaHQtbGFzdHJvdyk7CiAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgfQoKICAgICh2b2lkKXN0YXJ0Y29sOwogICAgKHZvaWQpd2lkdGg7Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlZGlzcGxheV9pbWFnZSgpICovCgoKCgoKI2lmZGVmIEZFQVRVUkVfTE9PUAoKc3RhdGljIHZvaWQgcnBuZzJfeF9yZWxvYWRfYmdfaW1hZ2Uodm9pZCkKewogICAgY2hhciAqZGVzdDsKICAgIHVjaCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOwogICAgdWNoIHIxX2ludiwgcjJfaW52LCBnMV9pbnYsIGcyX2ludiwgYjFfaW52LCBiMl9pbnY7CiAgICBpbnQgaywgaG1heCwgbWF4OwogICAgaW50IHhpZHgsIHlpZHgsIHlpZHhfbWF4OwogICAgaW50IGV2ZW5fb2RkX3ZlcnQsIGV2ZW5fb2RkX2hvcml6LCBldmVuX29kZDsKICAgIGludCBpbnZlcnRfZ3JhZGllbnQyID0gKGJnW3BhdF0udHlwZSAmIDB4MDgpOwogICAgaW50IGludmVydF9jb2x1bW47CiAgICB1bGcgaSwgcm93OwoKCiAgICBiZ3NjYWxlID0gKHBhdCA9PSAwKT8gOCA6IGJnc2NhbGVfZGVmYXVsdDsKICAgIHlpZHhfbWF4ID0gYmdzY2FsZSAtIDE7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgVmVydGljYWwgZ3JhZGllbnRzIChyYW1wcykgaW4gTnhOIHNxdWFyZXMsIGFsdGVybmF0aW5nIGRpcmVjdGlvbiBhbmQKICAgIGNvbG9ycyAoTiA9PSBiZ3NjYWxlKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMCkgewogICAgICAgIHVjaCByMV9taW4gID0gcmdiW2JnW3BhdF0ucmdiMV9taW5dLnI7CiAgICAgICAgdWNoIGcxX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IxX21pbl0uZzsKICAgICAgICB1Y2ggYjFfbWluICA9IHJnYltiZ1twYXRdLnJnYjFfbWluXS5iOwogICAgICAgIHVjaCByMl9taW4gID0gcmdiW2JnW3BhdF0ucmdiMl9taW5dLnI7CiAgICAgICAgdWNoIGcyX21pbiAgPSByZ2JbYmdbcGF0XS5yZ2IyX21pbl0uZzsKICAgICAgICB1Y2ggYjJfbWluICA9IHJnYltiZ1twYXRdLnJnYjJfbWluXS5iOwogICAgICAgIGludCByMV9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnIgLSByMV9taW47CiAgICAgICAgaW50IGcxX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZyAtIGcxX21pbjsKICAgICAgICBpbnQgYjFfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iIC0gYjFfbWluOwogICAgICAgIGludCByMl9kaWZmID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnIgLSByMl9taW47CiAgICAgICAgaW50IGcyX2RpZmYgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZyAtIGcyX21pbjsKICAgICAgICBpbnQgYjJfZGlmZiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iIC0gYjJfbWluOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgZXZlbl9vZGRfdmVydCA9IChpbnQpKChyb3cgLyBiZ3NjYWxlKSAmIDEpOwoKICAgICAgICAgICAgcjEgPSByMV9taW4gKyAocjFfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxID0gZzFfbWluICsgKGcxX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMSA9IGIxX21pbiArIChiMV9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgcjFfaW52ID0gcjFfbWluICsgKHIxX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIGcxX2ludiA9IGcxX21pbiArIChnMV9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBiMV9pbnYgPSBiMV9taW4gKyAoYjFfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKCiAgICAgICAgICAgIHIyID0gcjJfbWluICsgKHIyX2RpZmYgKiB5aWR4KSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMiA9IGcyX21pbiArIChnMl9kaWZmICogeWlkeCkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjIgPSBiMl9taW4gKyAoYjJfZGlmZiAqIHlpZHgpIC8geWlkeF9tYXg7CiAgICAgICAgICAgIHIyX2ludiA9IHIyX21pbiArIChyMl9kaWZmICogKHlpZHhfbWF4LXlpZHgpKSAvIHlpZHhfbWF4OwogICAgICAgICAgICBnMl9pbnYgPSBnMl9taW4gKyAoZzJfZGlmZiAqICh5aWR4X21heC15aWR4KSkgLyB5aWR4X21heDsKICAgICAgICAgICAgYjJfaW52ID0gYjJfbWluICsgKGIyX2RpZmYgKiAoeWlkeF9tYXgteWlkeCkpIC8geWlkeF9tYXg7CgogICAgICAgICAgICBkZXN0ID0gKGNoYXIgKiliZ19kYXRhICsgcm93KmJnX3Jvd2J5dGVzOwogICAgICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IHJwbmcyX2luZm8ud2lkdGg7ICArK2kpIHsKICAgICAgICAgICAgICAgIGV2ZW5fb2RkX2hvcml6ID0gKGludCkoKGkgLyBiZ3NjYWxlKSAmIDEpOwogICAgICAgICAgICAgICAgZXZlbl9vZGQgPSBldmVuX29kZF92ZXJ0IF4gZXZlbl9vZGRfaG9yaXo7CiAgICAgICAgICAgICAgICBpbnZlcnRfY29sdW1uID0KICAgICAgICAgICAgICAgICAgKGV2ZW5fb2RkX2hvcml6ICYmIChiZ1twYXRdLnR5cGUgJiAweDEwKSk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbl9vZGQgPT0gMCkgeyAgICAgICAgLyogZ3JhZGllbnQgIzEgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0X2NvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzFfaW52OwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjFfaW52OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMTsKICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGcxOwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gYjE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGdyYWRpZW50ICMyICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChpbnZlcnRfY29sdW1uICYmIGludmVydF9ncmFkaWVudDIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICghaW52ZXJ0X2NvbHVtbiAmJiAhaW52ZXJ0X2dyYWRpZW50MikpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gcjI7ICAgICAgIC8qIG5vdCBpbnZlcnRlZCBvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gZzI7ICAgICAgIC8qICBkb3VibHkgaW52ZXJ0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGIyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSByMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBnMl9pbnY7ICAgLyogc2luZ2x5IGludmVydGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBiMl9pbnY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNvZnQgZ3JhZGllbnQtZGlhbW9uZHMgd2l0aCBzY2FsZSA9IGJnc2NhbGUuICBDb2RlIGNvbnRyaWJ1dGVkIGJ5IEFkYW0KICAgIE0uIENvc3RlbGxvLgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgfSBlbHNlIGlmICgoYmdbcGF0XS50eXBlICYgMHgwNykgPT0gMSkgewoKICAgICAgICBobWF4ID0gKGJnc2NhbGUtMSkvMjsgICAvKiBoYWxmIHRoZSBtYXggd2VpZ2h0IG9mIGEgY29sb3IgKi8KICAgICAgICBtYXggPSAyKmhtYXg7ICAgICAgICAgICAvKiB0aGUgbWF4IHdlaWdodCBvZiBhIGNvbG9yICovCgogICAgICAgIHIxID0gcmdiW2JnW3BhdF0ucmdiMV9tYXhdLnI7CiAgICAgICAgZzEgPSByZ2JbYmdbcGF0XS5yZ2IxX21heF0uZzsKICAgICAgICBiMSA9IHJnYltiZ1twYXRdLnJnYjFfbWF4XS5iOwogICAgICAgIHIyID0gcmdiW2JnW3BhdF0ucmdiMl9tYXhdLnI7CiAgICAgICAgZzIgPSByZ2JbYmdbcGF0XS5yZ2IyX21heF0uZzsKICAgICAgICBiMiA9IHJnYltiZ1twYXRdLnJnYjJfbWF4XS5iOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHlpZHggPSAoaW50KShyb3cgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgaWYgKHlpZHggPiBobWF4KQogICAgICAgICAgICAgICAgeWlkeCA9IGJnc2NhbGUtMSAtIHlpZHg7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeGlkeCA9IChpbnQpKGkgJSBiZ3NjYWxlKTsKICAgICAgICAgICAgICAgIGlmICh4aWR4ID4gaG1heCkKICAgICAgICAgICAgICAgICAgICB4aWR4ID0gYmdzY2FsZS0xIC0geGlkeDsKICAgICAgICAgICAgICAgIGsgPSB4aWR4ICsgeWlkeDsKICAgICAgICAgICAgICAgICpkZXN0KysgPSAoaypyMSArIChtYXgtaykqcjIpIC8gbWF4OwogICAgICAgICAgICAgICAgKmRlc3QrKyA9IChrKmcxICsgKG1heC1rKSpnMikgLyBtYXg7CiAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGsqYjEgKyAobWF4LWspKmIyKSAvIG1heDsKICAgICAgICAgICAgfQogICAgICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBSYWRpYWwgInN0YXJidXJzdCIgd2l0aCBhemltdXRoYWwgc2ludXNvaWRzOyBbZXZlbnR1YWxseSBudW1iZXIgb2Ygc2ludS0KICAgIHNvaWRzIHdpbGwgZXF1YWwgYmdzY2FsZT9dLiAgVGhpcyBvbmUgaXMgc2xvdyBidXQgdmVyeSBjb29sLiAgQ29kZSBjb24tCiAgICB0cmlidXRlZCBieSBQaWV0ZXIgUy4gdmFuIGRlciBNZXVsZW4gKG9yaWdpbmFsbHkgaW4gU21hbGx0YWxrKS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIH0gZWxzZSBpZiAoKGJnW3BhdF0udHlwZSAmIDB4MDcpID09IDIpIHsKICAgICAgICB1Y2ggY2g7CiAgICAgICAgaW50IGlpLCB4LCB5LCBodywgaGgsIGdyYXlzcG90OwogICAgICAgIGRvdWJsZSBmcmVxLCByb3RhdGUsIHNhdHVyYXRlLCBncmF5LCBpbnRlbnNpdHk7CiAgICAgICAgZG91YmxlIGFuZ2xlPTAuMCwgYW9mZnNldD0wLjAsIG1heERpc3QsIGRpc3Q7CiAgICAgICAgZG91YmxlIHJlZD0wLjAsIGdyZWVuPTAuMCwgYmx1ZT0wLjAsIGh1ZSwgcywgdiwgZiwgcCwgcSwgdDsKCiAgICAgICAgaGggPSAoaW50KShycG5nMl9pbmZvLmhlaWdodCAvIDIpOwogICAgICAgIGh3ID0gKGludCkocnBuZzJfaW5mby53aWR0aCAvIDIpOwoKICAgICAgICAvKiB2YXJpYWJsZXMgZm9yIHJhZGlhbCB3YXZlczoKICAgICAgICAgKiAgIGFvZmZzZXQ6ICBudW1iZXIgb2YgZGVncmVlcyB0byByb3RhdGUgaHVlIFtDVVJSRU5UTFkgTk9UIFVTRURdCiAgICAgICAgICogICBmcmVxOiAgbnVtYmVyIG9mIGNvbG9yIGJlYW1zIG9yaWdpbmF0aW5nIGZyb20gdGhlIGNlbnRlcgogICAgICAgICAqICAgZ3JheXNwb3Q6ICBzaXplIG9mIHRoZSBncmF5aW5nIGNlbnRlciBhcmVhIChhbnRpLWFsaWFzKQogICAgICAgICAqICAgcm90YXRlOiAgcm90YXRpb24gb2YgdGhlIGJlYW1zIGFzIGEgZnVuY3Rpb24gb2YgcmFkaXVzCiAgICAgICAgICogICBzYXR1cmF0ZTogIHNhdHVyYXRpb24gb2YgYmVhbXMnIHNoYXBlIGF6aW11dGhhbGx5CiAgICAgICAgICovCiAgICAgICAgYW5nbGUgPSBDTElQKGFuZ2xlLCAwLjAsIDM2MC4wKTsKICAgICAgICBncmF5c3BvdCA9IENMSVAoYmdbcGF0XS5iZ19ncmF5LCAxLCAoaGggKyBodykpOwogICAgICAgIGZyZXEgPSBNQVgoKGRvdWJsZSliZ1twYXRdLmJnX2ZyZXEsIDAuMCk7CiAgICAgICAgc2F0dXJhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnNhdCAqIDAuMTsKICAgICAgICByb3RhdGUgPSAoZG91YmxlKWJnW3BhdF0uYmdfYnJvdCAqIDAuMTsKICAgICAgICBncmF5ID0gMC4wOwogICAgICAgIGludGVuc2l0eSA9IDAuMDsKICAgICAgICBtYXhEaXN0ID0gKGRvdWJsZSkoKGh3Kmh3KSArIChoaCpoaCkpOwoKICAgICAgICBmb3IgKHJvdyA9IDA7ICByb3cgPCBycG5nMl9pbmZvLmhlaWdodDsgICsrcm93KSB7CiAgICAgICAgICAgIHkgPSAoaW50KShyb3cgLSBoaCk7CiAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKWJnX2RhdGEgKyByb3cqYmdfcm93Ynl0ZXM7CiAgICAgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgcnBuZzJfaW5mby53aWR0aDsgICsraSkgewogICAgICAgICAgICAgICAgeCA9IChpbnQpKGkgLSBodyk7CiAgICAgICAgICAgICAgICBhbmdsZSA9ICh4ID09IDApPyBQSV8yIDogYXRhbigoZG91YmxlKXkgLyAoZG91YmxlKXgpOwogICAgICAgICAgICAgICAgZ3JheSA9IChkb3VibGUpTUFYKEFCUyh5KSwgQUJTKHgpKSAvIGdyYXlzcG90OwogICAgICAgICAgICAgICAgZ3JheSA9IE1JTigxLjAsIGdyYXkpOwogICAgICAgICAgICAgICAgZGlzdCA9IChkb3VibGUpKCh4KngpICsgKHkqeSkpIC8gbWF4RGlzdDsKICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IGNvcygoYW5nbGUrKHJvdGF0ZSpkaXN0KlBJKSkgKiBmcmVxKSAqCiAgICAgICAgICAgICAgICAgIGdyYXkgKiBzYXR1cmF0ZTsKICAgICAgICAgICAgICAgIGludGVuc2l0eSA9IChNQVgoTUlOKGludGVuc2l0eSwxLjApLC0xLjApICsgMS4wKSAqIDAuNTsKICAgICAgICAgICAgICAgIGh1ZSA9IChhbmdsZSArIFBJKSAqIElOVl9QSV8zNjAgKyBhb2Zmc2V0OwogICAgICAgICAgICAgICAgcyA9IGdyYXkgKiAoKGRvdWJsZSkoQUJTKHgpK0FCUyh5KSkgLyAoZG91YmxlKShodyArIGhoKSk7CiAgICAgICAgICAgICAgICBzID0gTUlOKE1BWChzLDAuMCksIDEuMCk7CiAgICAgICAgICAgICAgICB2ID0gTUlOKE1BWChpbnRlbnNpdHksMC4wKSwgMS4wKTsKCiAgICAgICAgICAgICAgICBpZiAocyA9PSAwLjApIHsKICAgICAgICAgICAgICAgICAgICBjaCA9ICh1Y2gpKHYgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IGNoOwogICAgICAgICAgICAgICAgICAgICpkZXN0KysgPSBjaDsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gY2g7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICgoaHVlIDwgMC4wKSB8fCAoaHVlID49IDM2MC4wKSkKICAgICAgICAgICAgICAgICAgICAgICAgaHVlIC09ICgoKGludCkoaHVlIC8gMzYwLjApKSAqIDM2MC4wKTsKICAgICAgICAgICAgICAgICAgICBodWUgLz0gNjAuMDsKICAgICAgICAgICAgICAgICAgICBpaSA9IChpbnQpaHVlOwogICAgICAgICAgICAgICAgICAgIGYgPSBodWUgLSAoZG91YmxlKWlpOwogICAgICAgICAgICAgICAgICAgIHAgPSAoMS4wIC0gcykgKiB2OwogICAgICAgICAgICAgICAgICAgIHEgPSAoMS4wIC0gKHMgKiBmKSkgKiB2OwogICAgICAgICAgICAgICAgICAgIHQgPSAoMS4wIC0gKHMgKiAoMS4wIC0gZikpKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgaWYgICAgICAoaWkgPT0gMCkgeyByZWQgPSB2OyBncmVlbiA9IHQ7IGJsdWUgPSBwOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMSkgeyByZWQgPSBxOyBncmVlbiA9IHY7IGJsdWUgPSBwOyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMikgeyByZWQgPSBwOyBncmVlbiA9IHY7IGJsdWUgPSB0OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gMykgeyByZWQgPSBwOyBncmVlbiA9IHE7IGJsdWUgPSB2OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNCkgeyByZWQgPSB0OyBncmVlbiA9IHA7IGJsdWUgPSB2OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWkgPT0gNSkgeyByZWQgPSB2OyBncmVlbiA9IHA7IGJsdWUgPSBxOyB9CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKHJlZCAqIDI1NS4wKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKHVjaCkoZ3JlZW4gKiAyNTUuMCk7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9ICh1Y2gpKGJsdWUgKiAyNTUuMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9IC8qIGVuZCBmdW5jdGlvbiBycG5nMl94X3JlbG9hZF9iZ19pbWFnZSgpICovCgoKCgoKc3RhdGljIGludCBpc19udW1iZXIoY2hhciAqcCkKewogICAgd2hpbGUgKCpwKSB7CiAgICAgICAgaWYgKCFpc2RpZ2l0KCpwKSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICsrcDsKICAgIH0KICAgIHJldHVybiBUUlVFOwp9CgojZW5kaWYgLyogRkVBVFVSRV9MT09QICovCgoKCgoKc3RhdGljIHZvaWQgcnBuZzJfeF9jbGVhbnVwKHZvaWQpCnsKICAgIGlmIChiZ19pbWFnZSAmJiBiZ19kYXRhKSB7CiAgICAgICAgZnJlZShiZ19kYXRhKTsKICAgICAgICBiZ19kYXRhID0gTlVMTDsKICAgIH0KCiAgICBpZiAocnBuZzJfaW5mby5pbWFnZV9kYXRhKSB7CiAgICAgICAgZnJlZShycG5nMl9pbmZvLmltYWdlX2RhdGEpOwogICAgICAgIHJwbmcyX2luZm8uaW1hZ2VfZGF0YSA9IE5VTEw7CiAgICB9CgogICAgaWYgKHJwbmcyX2luZm8ucm93X3BvaW50ZXJzKSB7CiAgICAgICAgZnJlZShycG5nMl9pbmZvLnJvd19wb2ludGVycyk7CiAgICAgICAgcnBuZzJfaW5mby5yb3dfcG9pbnRlcnMgPSBOVUxMOwogICAgfQoKICAgIGlmICh4aW1hZ2UpIHsKICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7CiAgICAgICAgICAgIGZyZWUoeGltYWdlLT5kYXRhKTsgICAgICAgICAgIC8qIHdlIGFsbG9jYXRlZCBpdCwgc28gd2UgZnJlZSBpdCAqLwogICAgICAgICAgICB4aW1hZ2UtPmRhdGEgPSAoY2hhciAqKU5VTEw7ICAvKiAgaW5zdGVhZCBvZiBYRGVzdHJveUltYWdlKCkgKi8KICAgICAgICB9CiAgICAgICAgWERlc3Ryb3lJbWFnZSh4aW1hZ2UpOwogICAgICAgIHhpbWFnZSA9IE5VTEw7CiAgICB9CgogICAgaWYgKGhhdmVfZ2MpCiAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7CgogICAgaWYgKGhhdmVfd2luZG93KQogICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7CgogICAgaWYgKGhhdmVfY29sb3JtYXApCiAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7CgogICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpCiAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwp9CgoKCgoKc3RhdGljIGludCBycG5nMl94X21zYih1bGcgdTMydmFsKQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKGkgPSAzMTsgIGkgPj0gMDsgIC0taSkgewogICAgICAgIGlmICh1MzJ2YWwgJiAweDgwMDAwMDAwTCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgdTMydmFsIDw8PSAxOwogICAgfQogICAgcmV0dXJuIGk7Cn0K