LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIHJwbmcgLSBzaW1wbGUgUE5HIGRpc3BsYXkgcHJvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycG5nLXguYwoKICAgVGhpcyBwcm9ncmFtIGRlY29kZXMgYW5kIGRpc3BsYXlzIFBORyBpbWFnZXMsIHdpdGggZ2FtbWEgY29ycmVjdGlvbiBhbmQKICAgb3B0aW9uYWxseSB3aXRoIGEgdXNlci1zcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvciAoaW4gY2FzZSB0aGUgaW1hZ2UgaGFzCiAgIHRyYW5zcGFyZW5jeSkuICBJdCBpcyB2ZXJ5IG5lYXJseSB0aGUgbW9zdCBiYXNpYyBQTkcgdmlld2VyIHBvc3NpYmxlLgogICBUaGlzIHZlcnNpb24gaXMgZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0gKHRlc3RlZCBieSBhdXRob3IgdW5kZXIgVW5peCBhbmQKICAgYnkgTWFydGluIFppbnNlciB1bmRlciBPcGVuVk1TOyBtYXkgd29yayB1bmRlciBPUy8yIHdpdGggc29tZSB0d2Vha2luZykuCgogICB0byBkbzoKICAgIC0gOC1iaXQgKGNvbG9ybWFwcGVkKSBYIHN1cHBvcnQKICAgIC0gdXNlICUuMTAyM3MgdG8gc2ltcGxpZnkgdHJ1bmNhdGlvbiBvZiB0aXRsZS1iYXIgc3RyaW5nPwoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIENoYW5nZWxvZzoKICAgIC0gMS4wMTogIGluaXRpYWwgcHVibGljIHJlbGVhc2UKICAgIC0gMS4wMjogIG1vZGlmaWVkIHRvIGFsbG93IGFiYnJldmlhdGVkIG9wdGlvbnM7IGZpeGVkIGxvbmcvdWxvbmcgbWlzLQogICAgICAgICAgICAgIG1hdGNoOyBzd2l0Y2hlZCB0byBwbmdfam1wYnVmKCkgbWFjcm8KICAgIC0gMS4xMDogIGFkZGVkIHN1cHBvcnQgZm9yIG5vbi1kZWZhdWx0IHZpc3VhbHM7IGZpeGVkIFggcGl4ZWwtY29udmVyc2lvbgogICAgLSAxLjExOiAgYWRkZWQgZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIHBuZ19qbXBidWYoKSBtYWNybzsgZml4ZWQKICAgICAgICAgICAgICBjb21tYW5kLWxpbmUgcGFyc2luZyBidWcKICAgIC0gMS4xMjogIGZpeGVkIHNvbWUgc21hbGwgWCBtZW1vcnkgbGVha3MgKHRoYW5rcyB0byBGcmFu529pcyBQZXRpdGplYW4pCiAgICAtIDEuMTM6ICBmaXhlZCBYRnJlZUdDKCkgY3Jhc2ggYnVnICh0aGFua3MgdG8gUGF0cmljayBXZWxjaGUpCiAgICAtIDEuMTQ6ICBhZGRlZCBzdXBwb3J0IGZvciBYIHJlc291cmNlcyAodGhhbmtzIHRvIEdlcmhhcmQgTmlrbGFzY2gpCiAgICAtIDIuMDA6ICBkdWFsLWxpY2Vuc2VkIChhZGRlZCBHTlUgR1BMKQogICAgLSAyLjAxOiAgZml4ZWQgaW1wcm9wZXIgZGlzcGxheSBvZiB1c2FnZSBzY3JlZW4gb24gUE5HIGVycm9yKHMpCiAgICAtIDIuMDI6ICBBZGRlZCAidm9pZChhcmdjKTsiIHN0YXRlbWVudCB0byBxdWlldCBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncwogICAgICAgICAgICAgYWJvdXQgdW51c2VkIHZhcmlhYmxlIChHUi1QKQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgIENvcHlyaWdodCAoYykgMTk5OC0yMDA4IEdyZWcgUm9lbG9mcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsCiAgICAgIGV4cHJlc3Mgb3IgaW1wbGllZC4gIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3Igb3IgY29udHJpYnV0b3JzCiAgICAgIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGluIGFueSB3YXkgZnJvbSB0aGUgdXNlIG9mCiAgICAgIHRoaXMgc29mdHdhcmUuCgogICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBEVUFMLUxJQ0VOU0VELiAgWW91IG1heSBtb2RpZnkgYW5kL29yCiAgICAgIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2Ygb25lIG9mIHRoZQogICAgICBmb2xsb3dpbmcgdHdvIGxpY2Vuc2VzIChhdCB5b3VyIG9wdGlvbik6CgoKICAgICAgTElDRU5TRSAxICgiQlNELWxpa2Ugd2l0aCBhZHZlcnRpc2luZyBjbGF1c2UiKToKCiAgICAgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAogICAgICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlCiAgICAgIGl0IGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgIG5vdGljZSwgZGlzY2xhaW1lciwgYW5kIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLgogICAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgICBub3RpY2UsIGRpc2NsYWltZXIsIGFuZCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBpbiB0aGUgZG9jdW1lbnRhLQogICAgICAgICB0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKICAgICAgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CgogICAgICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEdyZWcgUm9lbG9mcwogICAgICAgICAgICBhbmQgY29udHJpYnV0b3JzIGZvciB0aGUgYm9vaywgIlBORzogVGhlIERlZmluaXRpdmUgR3VpZGUsIgogICAgICAgICAgICBwdWJsaXNoZWQgYnkgTydSZWlsbHkgYW5kIEFzc29jaWF0ZXMuCgoKICAgICAgTElDRU5TRSAyIChHTlUgR1BMIHYyIG9yIGxhdGVyKToKCiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKICAgICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2RlZmluZSBQUk9HTkFNRSAgInJwbmcteCIKI2RlZmluZSBMT05HTkFNRSAgIlNpbXBsZSBQTkcgVmlld2VyIGZvciBYIgojZGVmaW5lIFZFUlNJT04gICAiMi4wMiBvZiAxNSBKdW5lIDIwMTQiCiNkZWZpbmUgUkVTTkFNRSAgICJycG5nIiAgICAgICAgLyogb3VyIFggcmVzb3VyY2UgYXBwbGljYXRpb24gbmFtZSAqLwojZGVmaW5lIFJFU0NMQVNTICAiUnBuZyIgICAgICAgIC8qIG91ciBYIHJlc291cmNlIGNsYXNzIG5hbWUgKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPFgxMS9YbGliLmg+CiNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KI2luY2x1ZGUgPFgxMS9Yb3MuaD4KI2luY2x1ZGUgPFgxMS9rZXlzeW0uaD4KCi8qICNkZWZpbmUgREVCVUcgIDogIHRoaXMgZW5hYmxlcyB0aGUgVHJhY2UoKSBtYWNyb3MgKi8KCiNpbmNsdWRlICJyZWFkcG5nLmgiICAgLyogdHlwZWRlZnMsIGNvbW1vbiBtYWNyb3MsIHJlYWRwbmcgcHJvdG90eXBlcyAqLwoKCi8qIGNvdWxkIGp1c3QgaW5jbHVkZSBwbmcuaCwgYnV0IHRoaXMgbWFjcm8gaXMgdGhlIG9ubHkgdGhpbmcgd2UgbmVlZAogKiAobmFtZSBhbmQgdHlwZWRlZnMgY2hhbmdlZCB0byBsb2NhbCB2ZXJzaW9ucyk7IG5vdGUgdGhhdCBzaWRlIGVmZmVjdHMKICogb25seSBoYXBwZW4gd2l0aCBhbHBoYSAod2hpY2ggY291bGQgZWFzaWx5IGJlIGF2b2lkZWQgd2l0aAogKiAidXNoIGFjb3B5ID0gKGFscGhhKTsiKSAqLwoKI2RlZmluZSBhbHBoYV9jb21wb3NpdGUoY29tcG9zaXRlLCBmZywgYWxwaGEsIGJnKSB7ICAgICAgICAgICAgICAgXAogICAgdXNoIHRlbXAgPSAoKHVzaCkoZmcpKih1c2gpKGFscGhhKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAodXNoKShiZykqKHVzaCkoMjU1IC0gKHVzaCkoYWxwaGEpKSArICh1c2gpMTI4KTsgIFwKICAgIChjb21wb3NpdGUpID0gKHVjaCkoKHRlbXAgKyAodGVtcCA+PiA4KSkgPj4gOCk7ICAgICAgICAgICAgICAgXAp9CgoKLyogbG9jYWwgcHJvdG90eXBlcyAqLwpzdGF0aWMgaW50ICBycG5nX3hfY3JlYXRlX3dpbmRvdyh2b2lkKTsKc3RhdGljIGludCAgcnBuZ194X2Rpc3BsYXlfaW1hZ2Uodm9pZCk7CnN0YXRpYyB2b2lkIHJwbmdfeF9jbGVhbnVwKHZvaWQpOwpzdGF0aWMgaW50ICBycG5nX3hfbXNiKHVsZyB1MzJ2YWwpOwoKCnN0YXRpYyBjaGFyIHRpdGxlYmFyWzEwMjRdLCAqd2luZG93X25hbWUgPSB0aXRsZWJhcjsKc3RhdGljIGNoYXIgKmFwcG5hbWUgPSBMT05HTkFNRTsKc3RhdGljIGNoYXIgKmljb25fbmFtZSA9IFBST0dOQU1FOwpzdGF0aWMgY2hhciAqcmVzX25hbWUgPSBSRVNOQU1FOwpzdGF0aWMgY2hhciAqcmVzX2NsYXNzID0gUkVTQ0xBU1M7CnN0YXRpYyBjaGFyICpmaWxlbmFtZTsKc3RhdGljIEZJTEUgKmluZmlsZTsKCnN0YXRpYyBjaGFyICpiZ3N0cjsKc3RhdGljIHVjaCBiZ19yZWQ9MCwgYmdfZ3JlZW49MCwgYmdfYmx1ZT0wOwoKc3RhdGljIGRvdWJsZSBkaXNwbGF5X2V4cG9uZW50OwoKc3RhdGljIHVsZyBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBpbWFnZV9yb3dieXRlczsKc3RhdGljIGludCBpbWFnZV9jaGFubmVsczsKc3RhdGljIHVjaCAqaW1hZ2VfZGF0YTsKCi8qIFgtc3BlY2lmaWMgdmFyaWFibGVzICovCnN0YXRpYyBjaGFyICpkaXNwbGF5bmFtZTsKc3RhdGljIFhJbWFnZSAqeGltYWdlOwpzdGF0aWMgRGlzcGxheSAqZGlzcGxheTsKc3RhdGljIGludCBkZXB0aDsKc3RhdGljIFZpc3VhbCAqdmlzdWFsOwpzdGF0aWMgWFZpc3VhbEluZm8gKnZpc3VhbF9saXN0OwpzdGF0aWMgaW50IFJTaGlmdCwgR1NoaWZ0LCBCU2hpZnQ7CnN0YXRpYyB1bGcgUk1hc2ssIEdNYXNrLCBCTWFzazsKc3RhdGljIFdpbmRvdyB3aW5kb3c7CnN0YXRpYyBHQyBnYzsKc3RhdGljIENvbG9ybWFwIGNvbG9ybWFwOwoKc3RhdGljIGludCBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gRkFMU0U7CnN0YXRpYyBpbnQgaGF2ZV9jb2xvcm1hcCA9IEZBTFNFOwpzdGF0aWMgaW50IGhhdmVfd2luZG93ID0gRkFMU0U7CnN0YXRpYyBpbnQgaGF2ZV9nYyA9IEZBTFNFOwovKgp1bGcgbnVtY29sb3JzPTAsIHBpeGVsc1syNTZdOwp1c2ggcmVkc1syNTZdLCBncmVlbnNbMjU2XSwgYmx1ZXNbMjU2XTsKICovCgoKCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKI2lmZGVmIHNnaQogICAgY2hhciB0bXBsaW5lWzgwXTsKI2VuZGlmCiAgICBjaGFyICpwOwogICAgaW50IHJjLCBhbGVuLCBmbGVuOwogICAgaW50IGVycm9yID0gMDsKICAgIGludCBoYXZlX2JnID0gRkFMU0U7CiAgICBkb3VibGUgTFVUX2V4cG9uZW50OyAgICAgICAgICAgICAgIC8qIGp1c3QgdGhlIGxvb2t1cCB0YWJsZSAqLwogICAgZG91YmxlIENSVF9leHBvbmVudCA9IDIuMjsgICAgICAgICAvKiBqdXN0IHRoZSBtb25pdG9yICovCiAgICBkb3VibGUgZGVmYXVsdF9kaXNwbGF5X2V4cG9uZW50OyAgIC8qIHdob2xlIGRpc3BsYXkgc3lzdGVtICovCiAgICBYRXZlbnQgZTsKICAgIEtleVN5bSBrOwoKCiAgICBkaXNwbGF5bmFtZSA9IChjaGFyICopTlVMTDsKICAgIGZpbGVuYW1lID0gKGNoYXIgKilOVUxMOwoKCiAgICAvKiBGaXJzdCBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIG91ciBkaXNwbGF5LXN5c3RlbSBleHBvbmVudCwgaS5lLiwKICAgICAqIHRoZSBwcm9kdWN0IG9mIHRoZSBDUlQgZXhwb25lbnQgYW5kIHRoZSBleHBvbmVudCBjb3JyZXNwb25kaW5nIHRvCiAgICAgKiB0aGUgZnJhbWUtYnVmZmVyJ3MgbG9va3VwIHRhYmxlIChMVVQpLCBpZiBhbnkuICBUaGlzIGlzIG5vdCBhbgogICAgICogZXhoYXVzdGl2ZSBsaXN0IG9mIExVVCB2YWx1ZXMgKGUuZy4sIE9wZW5TdGVwIGhhcyBhIGxvdCBvZiB3ZWlyZAogICAgICogb25lcyksIGJ1dCBpdCBzaG91bGQgY292ZXIgOTklIG9mIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRpZXMuICovCgojaWYgZGVmaW5lZChOZVhUKQogICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMi4yOwogICAgLyoKICAgIGlmIChzb21lX25leHRfZnVuY3Rpb25fdGhhdF9yZXR1cm5zX2dhbW1hKCZuZXh0X2dhbW1hKSkKICAgICAgICBMVVRfZXhwb25lbnQgPSAxLjAgLyBuZXh0X2dhbW1hOwogICAgICovCiNlbGlmIGRlZmluZWQoc2dpKQogICAgTFVUX2V4cG9uZW50ID0gMS4wIC8gMS43OwogICAgLyogdGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBkb2N1bWVudGVkIGZ1bmN0aW9uIHRvIGdldCB0aGUKICAgICAqICJnYW1tYSIgdmFsdWUsIHNvIHdlIGRvIGl0IHRoZSBoYXJkIHdheSAqLwogICAgaW5maWxlID0gZm9wZW4oIi9ldGMvY29uZmlnL3N5c3RlbS5nbEdhbW1hVmFsIiwgInIiKTsKICAgIGlmIChpbmZpbGUpIHsKICAgICAgICBkb3VibGUgc2dpX2dhbW1hOwoKICAgICAgICBmZ2V0cyh0bXBsaW5lLCA4MCwgaW5maWxlKTsKICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgICAgICBzZ2lfZ2FtbWEgPSBhdG9mKHRtcGxpbmUpOwogICAgICAgIGlmIChzZ2lfZ2FtbWEgPiAwLjApCiAgICAgICAgICAgIExVVF9leHBvbmVudCA9IDEuMCAvIHNnaV9nYW1tYTsKICAgIH0KI2VsaWYgZGVmaW5lZChNYWNpbnRvc2gpCiAgICBMVVRfZXhwb25lbnQgPSAxLjggLyAyLjYxOwogICAgLyoKICAgIGlmIChzb21lX21hY19mdW5jdGlvbl90aGF0X3JldHVybnNfZ2FtbWEoJm1hY19nYW1tYSkpCiAgICAgICAgTFVUX2V4cG9uZW50ID0gbWFjX2dhbW1hIC8gMi42MTsKICAgICAqLwojZWxzZQogICAgTFVUX2V4cG9uZW50ID0gMS4wOyAgIC8qIGFzc3VtZSBubyBMVVQ6ICBtb3N0IFBDcyAqLwojZW5kaWYKCiAgICAvKiB0aGUgZGVmYXVsdHMgYWJvdmUgZ2l2ZSAxLjAsIDEuMywgMS41IGFuZCAyLjIsIHJlc3BlY3RpdmVseTogKi8KICAgIGRlZmF1bHRfZGlzcGxheV9leHBvbmVudCA9IExVVF9leHBvbmVudCAqIENSVF9leHBvbmVudDsKCgogICAgLyogSWYgdGhlIHVzZXIgaGFzIHNldCB0aGUgU0NSRUVOX0dBTU1BIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHN1Z2dlc3RlZAogICAgICogKHNvbWV3aGF0IGltcHJlY2lzZWx5KSBpbiB0aGUgbGlicG5nIGRvY3VtZW50YXRpb24sIHVzZSB0aGF0OyBvdGhlcndpc2UKICAgICAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSB3ZSBqdXN0IGNhbGN1bGF0ZWQuICBFaXRoZXIgd2F5LCB0aGUgdXNlciBtYXkKICAgICAqIG92ZXJyaWRlIHRoaXMgdmlhIGEgY29tbWFuZC1saW5lIG9wdGlvbi4gKi8KCiAgICBpZiAoKHAgPSBnZXRlbnYoIlNDUkVFTl9HQU1NQSIpKSAhPSBOVUxMKQogICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBhdG9mKHApOwogICAgZWxzZQogICAgICAgIGRpc3BsYXlfZXhwb25lbnQgPSBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQ7CgoKICAgIC8qIE5vdyBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGZvciBvcHRpb25zIGFuZCB0aGUgUE5HIGZpbGVuYW1lLiAqLwoKICAgIHdoaWxlICgqKythcmd2ICYmICFlcnJvcikgewogICAgICAgIGlmICghc3RybmNtcCgqYXJndiwgIi1kaXNwbGF5IiwgMikpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSAqYXJndjsKICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKCphcmd2LCAiLWdhbW1hIiwgMikpIHsKICAgICAgICAgICAgaWYgKCEqKythcmd2KQogICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkaXNwbGF5X2V4cG9uZW50ID0gYXRvZigqYXJndik7CiAgICAgICAgICAgICAgICBpZiAoZGlzcGxheV9leHBvbmVudCA8PSAwLjApCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoKmFyZ3YsICItYmdjb2xvciIsIDIpKSB7CiAgICAgICAgICAgIGlmICghKisrYXJndikKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYmdzdHIgPSAqYXJndjsKICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oYmdzdHIpICE9IDcgfHwgYmdzdHJbMF0gIT0gJyMnKQogICAgICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgaGF2ZV9iZyA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKiphcmd2ICE9ICctJykgewogICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAqYXJndjsKICAgICAgICAgICAgICAgIGlmIChhcmd2WzFdKSAgIC8qIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBhcmdzIGFmdGVyIGZpbGVuYW1lICovCiAgICAgICAgICAgICAgICAgICAgKytlcnJvcjsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICArK2Vycm9yOyAgIC8qIG5vdCBleHBlY3RpbmcgYW55IG90aGVyIG9wdGlvbnMgKi8KICAgICAgICB9CiAgICB9CgogICAgaWYgKCFmaWxlbmFtZSkKICAgICAgICArK2Vycm9yOwoKCiAgICAvKiBwcmludCB1c2FnZSBzY3JlZW4gaWYgYW55IGVycm9ycyB1cCB0byB0aGlzIHBvaW50ICovCgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiVzICVzOiAgJXNcbiIsIFBST0dOQU1FLCBWRVJTSU9OLCBhcHBuYW1lKTsKICAgICAgICByZWFkcG5nX3ZlcnNpb25faW5mbygpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iCiAgICAgICAgICAiVXNhZ2U6ICAlcyBbLWRpc3BsYXkgeGRweV0gWy1nYW1tYSBleHBdIFstYmdjb2xvciBiZ10gZmlsZS5wbmdcbiIKICAgICAgICAgICIgICAgeGRweVx0bmFtZSBvZiB0aGUgdGFyZ2V0IFggZGlzcGxheSAoZS5nLiwgYGBob3N0bmFtZTowJycpXG4iCiAgICAgICAgICAiICAgIGV4cCBcdHRyYW5zZmVyLWZ1bmN0aW9uIGV4cG9uZW50IChgYGdhbW1hJycpIG9mIHRoZSBkaXNwbGF5XG4iCiAgICAgICAgICAiXHRcdCAgc3lzdGVtIGluIGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoZS5nLiwgYGAlLjFmJycpOyBlcXVhbFxuIiwKICAgICAgICAgIFBST0dOQU1FLCBkZWZhdWx0X2Rpc3BsYXlfZXhwb25lbnQpOwoKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgogICAgICAgICAgIlx0XHQgIHRvIHRoZSBwcm9kdWN0IG9mIHRoZSBsb29rdXAtdGFibGUgZXhwb25lbnQgKHZhcmllcylcbiIKICAgICAgICAgICJcdFx0ICBhbmQgdGhlIENSVCBleHBvbmVudCAodXN1YWxseSAyLjIpOyBtdXN0IGJlIHBvc2l0aXZlXG4iCiAgICAgICAgICAiICAgIGJnICBcdGRlc2lyZWQgYmFja2dyb3VuZCBjb2xvciBpbiA3LWNoYXJhY3RlciBoZXggUkdCIGZvcm1hdFxuIgogICAgICAgICAgIlx0XHQgIChlLmcuLCBgYCNmZjc3MDAnJyBmb3Igb3JhbmdlOiAgc2FtZSBhcyBIVE1MIGNvbG9ycyk7XG4iCiAgICAgICAgICAiXHRcdCAgdXNlZCB3aXRoIHRyYW5zcGFyZW50IGltYWdlc1xuIgogICAgICAgICAgIlxuUHJlc3MgUSwgRXNjIG9yIG1vdXNlIGJ1dHRvbiAxICh3aXRoaW4gaW1hZ2Ugd2luZG93LCBhZnRlciBpbWFnZVxuIgogICAgICAgICAgImlzIGRpc3BsYXllZCkgdG8gcXVpdC5cbiIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgoKICAgIGlmICghKGluZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKSkpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGNhbid0IG9wZW4gUE5HIGZpbGUgWyVzXVxuIiwgZmlsZW5hbWUpOwogICAgICAgICsrZXJyb3I7CiAgICB9IGVsc2UgewogICAgICAgIGlmICgocmMgPSByZWFkcG5nX2luaXQoaW5maWxlLCAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQpKSAhPSAwKSB7CiAgICAgICAgICAgIHN3aXRjaCAocmMpIHsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgICAgICI6ICBbJXNdIGlzIG5vdCBhIFBORyBmaWxlOiBpbmNvcnJlY3Qgc2lnbmF0dXJlXG4iLAogICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgICAgICAgICAgICAgIjogIFslc10gaGFzIGJhZCBJSERSIChsaWJwbmcgbG9uZ2ptcClcbiIsIGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIGluc3VmZmljaWVudCBtZW1vcnlcbiIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUKICAgICAgICAgICAgICAgICAgICAgICI6ICB1bmtub3duIHJlYWRwbmdfaW5pdCgpIGVycm9yXG4iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICArK2Vycm9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoZGlzcGxheW5hbWUpOwogICAgICAgICAgICBpZiAoIWRpc3BsYXkpIHsKICAgICAgICAgICAgICAgIHJlYWRwbmdfY2xlYW51cChUUlVFKTsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgY2FuJ3Qgb3BlbiBYIGRpc3BsYXkgWyVzXVxuIiwKICAgICAgICAgICAgICAgICAgZGlzcGxheW5hbWU/IGRpc3BsYXluYW1lIDogImRlZmF1bHQiKTsKICAgICAgICAgICAgICAgICsrZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgICBmY2xvc2UoaW5maWxlKTsKICAgIH0KCgogICAgaWYgKGVycm9yKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBhYm9ydGluZy5cbiIpOwogICAgICAgIGV4aXQoMik7CiAgICB9CgoKICAgIC8qIHNldCB0aGUgdGl0bGUtYmFyIHN0cmluZywgYnV0IG1ha2Ugc3VyZSBidWZmZXIgZG9lc24ndCBvdmVyZmxvdyAqLwoKICAgIGFsZW4gPSBzdHJsZW4oYXBwbmFtZSk7CiAgICBmbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKICAgIGlmIChhbGVuICsgZmxlbiArIDMgPiAxMDIzKQogICAgICAgIHNwcmludGYodGl0bGViYXIsICIlczogIC4uLiVzIiwgYXBwbmFtZSwgZmlsZW5hbWUrKGFsZW4rZmxlbis2LTEwMjMpKTsKICAgIGVsc2UKICAgICAgICBzcHJpbnRmKHRpdGxlYmFyLCAiJXM6ICAlcyIsIGFwcG5hbWUsIGZpbGVuYW1lKTsKCgogICAgLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBiYWNrZ3JvdW5kIGNvbG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsCiAgICAgKiBjaGVjayBmb3Igb25lIGluIHRoZSBQTkcgZmlsZS0taWYgbm90LCB0aGUgaW5pdGlhbGl6ZWQgdmFsdWVzIG9mIDAKICAgICAqIChibGFjaykgd2lsbCBiZSB1c2VkICovCgogICAgaWYgKGhhdmVfYmcpIHsKICAgICAgICB1bnNpZ25lZCByLCBnLCBiOyAgIC8qIHRoaXMgYXBwcm9hY2ggcXVpZXRzIGNvbXBpbGVyIHdhcm5pbmdzICovCgogICAgICAgIHNzY2FuZihiZ3N0cisxLCAiJTJ4JTJ4JTJ4IiwgJnIsICZnLCAmYik7CiAgICAgICAgYmdfcmVkICAgPSAodWNoKXI7CiAgICAgICAgYmdfZ3JlZW4gPSAodWNoKWc7CiAgICAgICAgYmdfYmx1ZSAgPSAodWNoKWI7CiAgICB9IGVsc2UgaWYgKHJlYWRwbmdfZ2V0X2JnY29sb3IoJmJnX3JlZCwgJmJnX2dyZWVuLCAmYmdfYmx1ZSkgPiAxKSB7CiAgICAgICAgcmVhZHBuZ19jbGVhbnVwKFRSVUUpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRQogICAgICAgICAgIjogIGxpYnBuZyBlcnJvciB3aGlsZSBjaGVja2luZyBmb3IgYmFja2dyb3VuZCBjb2xvclxuIik7CiAgICAgICAgZXhpdCgyKTsKICAgIH0KCgogICAgLyogZG8gdGhlIGJhc2ljIFggaW5pdGlhbGl6YXRpb24gc3R1ZmYsIG1ha2UgdGhlIHdpbmRvdyBhbmQgZmlsbCBpdAogICAgICogd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvciAqLwoKICAgIGlmIChycG5nX3hfY3JlYXRlX3dpbmRvdygpKQogICAgICAgIGV4aXQoMik7CgoKICAgIC8qIGRlY29kZSB0aGUgaW1hZ2UsIGFsbCBhdCBvbmNlICovCgogICAgVHJhY2UoKHN0ZGVyciwgImNhbGxpbmcgcmVhZHBuZ19nZXRfaW1hZ2UoKVxuIikpCiAgICBpbWFnZV9kYXRhID0gcmVhZHBuZ19nZXRfaW1hZ2UoZGlzcGxheV9leHBvbmVudCwgJmltYWdlX2NoYW5uZWxzLAogICAgICAmaW1hZ2Vfcm93Ynl0ZXMpOwogICAgVHJhY2UoKHN0ZGVyciwgImRvbmUgd2l0aCByZWFkcG5nX2dldF9pbWFnZSgpXG4iKSkKCgogICAgLyogZG9uZSB3aXRoIFBORyBmaWxlLCBzbyBjbGVhbiB1cCB0byBtaW5pbWl6ZSBtZW1vcnkgdXNhZ2UgKGJ1dCBkbyBOT1QKICAgICAqIG51a2UgaW1hZ2VfZGF0YSEpICovCgogICAgcmVhZHBuZ19jbGVhbnVwKEZBTFNFKTsKICAgIGZjbG9zZShpbmZpbGUpOwoKICAgIGlmICghaW1hZ2VfZGF0YSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCBQUk9HTkFNRSAiOiAgdW5hYmxlIHRvIGRlY29kZSBQTkcgaW1hZ2VcbiIpOwogICAgICAgIGV4aXQoMyk7CiAgICB9CgoKICAgIC8qIGRpc3BsYXkgaW1hZ2UgKGNvbXBvc2l0ZSB3aXRoIGJhY2tncm91bmQgaWYgcmVxdWVzdGVkKSAqLwoKICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIHJwbmdfeF9kaXNwbGF5X2ltYWdlKClcbiIpKQogICAgaWYgKHJwbmdfeF9kaXNwbGF5X2ltYWdlKCkpIHsKICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwogICAgICAgIGV4aXQoNCk7CiAgICB9CiAgICBUcmFjZSgoc3RkZXJyLCAiZG9uZSB3aXRoIHJwbmdfeF9kaXNwbGF5X2ltYWdlKClcbiIpKQoKCiAgICAvKiB3YWl0IGZvciB0aGUgdXNlciB0byB0ZWxsIHVzIHdoZW4gdG8gcXVpdCAqLwoKICAgIHByaW50ZigKICAgICAgIkRvbmUuICBQcmVzcyBRLCBFc2Mgb3IgbW91c2UgYnV0dG9uIDEgKHdpdGhpbiBpbWFnZSB3aW5kb3cpIHRvIHF1aXQuXG4iKTsKICAgIGZmbHVzaChzdGRvdXQpOwoKICAgIGRvCiAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CiAgICB3aGlsZSAoIShlLnR5cGUgPT0gQnV0dG9uUHJlc3MgJiYgZS54YnV0dG9uLmJ1dHRvbiA9PSBCdXR0b24xKSAmJgogICAgICAgICAgICEoZS50eXBlID09IEtleVByZXNzICYmICAgIC8qICB2LS0tIG9yIDEgZm9yIHNoaWZ0ZWQga2V5cyAqLwogICAgICAgICAgICAgKChrID0gWExvb2t1cEtleXN5bSgmZS54a2V5LCAwKSkgPT0gWEtfcSB8fCBrID09IFhLX0VzY2FwZSkgKSk7CgoKICAgIC8qIE9LLCB3ZSdyZSBkb25lOiAgY2xlYW4gdXAgYWxsIGltYWdlIGFuZCBYIHJlc291cmNlcyBhbmQgZ28gYXdheSAqLwoKICAgIHJwbmdfeF9jbGVhbnVwKCk7CgogICAgKHZvaWQpYXJnYzsgLyogVW51c2VkICovCgogICAgcmV0dXJuIDA7Cn0KCgoKCgpzdGF0aWMgaW50IHJwbmdfeF9jcmVhdGVfd2luZG93KHZvaWQpCnsKICAgIHVjaCAqeGRhdGE7CiAgICBpbnQgbmVlZF9jb2xvcm1hcCA9IEZBTFNFOwogICAgaW50IHNjcmVlbiwgcGFkOwogICAgdWxnIGJnX3BpeGVsID0gMEw7CiAgICB1bGcgYXR0cm1hc2s7CiAgICBXaW5kb3cgcm9vdDsKICAgIFhFdmVudCBlOwogICAgWEdDVmFsdWVzIGdjdmFsdWVzOwogICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgYXR0cjsKICAgIFhUZXh0UHJvcGVydHkgd2luZG93TmFtZSwgKnBXaW5kb3dOYW1lID0gJndpbmRvd05hbWU7CiAgICBYVGV4dFByb3BlcnR5IGljb25OYW1lLCAqcEljb25OYW1lID0gJmljb25OYW1lOwogICAgWFZpc3VhbEluZm8gdmlzdWFsX2luZm87CiAgICBYU2l6ZUhpbnRzICpzaXplX2hpbnRzOwogICAgWFdNSGludHMgKndtX2hpbnRzOwogICAgWENsYXNzSGludCAqY2xhc3NfaGludHM7CgoKICAgIHNjcmVlbiA9IERlZmF1bHRTY3JlZW4oZGlzcGxheSk7CiAgICBkZXB0aCA9IERpc3BsYXlQbGFuZXMoZGlzcGxheSwgc2NyZWVuKTsKICAgIHJvb3QgPSBSb290V2luZG93KGRpc3BsYXksIHNjcmVlbik7CgojaWZkZWYgREVCVUcKICAgIFhTeW5jaHJvbml6ZShkaXNwbGF5LCBUcnVlKTsKI2VuZGlmCgojaWYgMAovKiBHUlI6ICBhZGQgOC1iaXQgc3VwcG9ydCAqLwogICAgaWYgKC8qIGRlcHRoICE9IDggJiYgKi8gZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICJzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCAob25seSAxNi0sIDI0LSBvciAzMi1iaXQgVHJ1ZUNvbG9yKVxuIiwKICAgICAgICAgIGRlcHRoKTsKICAgICAgICByZXR1cm4gMjsKICAgIH0KCiAgICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIHNjcmVlbiwgZGVwdGgsCiAgICAgIChkZXB0aCA9PSA4KT8gUHNldWRvQ29sb3IgOiBUcnVlQ29sb3IsICZ2aXN1YWxfaW5mbyk7CiAgICB2aXN1YWwgPSB2aXN1YWxfaW5mby52aXN1YWw7CiNlbHNlCiAgICBpZiAoZGVwdGggIT0gMTYgJiYgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpIHsKICAgICAgICBpbnQgdmlzdWFsc19tYXRjaGVkID0gMDsKCiAgICAgICAgVHJhY2UoKHN0ZGVyciwgImRlZmF1bHQgZGVwdGggaXMgJWQ6ICBjaGVja2luZyBvdGhlciB2aXN1YWxzXG4iLAogICAgICAgICAgZGVwdGgpKQoKICAgICAgICAvKiAyNC1iaXQgZmlyc3QgKi8KICAgICAgICB2aXN1YWxfaW5mby5zY3JlZW4gPSBzY3JlZW47CiAgICAgICAgdmlzdWFsX2luZm8uZGVwdGggPSAyNDsKICAgICAgICB2aXN1YWxfbGlzdCA9IFhHZXRWaXN1YWxJbmZvKGRpc3BsYXksCiAgICAgICAgICBWaXN1YWxTY3JlZW5NYXNrIHwgVmlzdWFsRGVwdGhNYXNrLCAmdmlzdWFsX2luZm8sICZ2aXN1YWxzX21hdGNoZWQpOwogICAgICAgIGlmICh2aXN1YWxzX21hdGNoZWQgPT0gMCkgewovKiBHUlI6ICBhZGQgMTUtLCAxNi0gYW5kIDMyLWJpdCBUcnVlQ29sb3IgdmlzdWFscyAoYWxzbyBEaXJlY3RDb2xvcj8pICovCiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZGVmYXVsdCBzY3JlZW4gZGVwdGggJWQgbm90IHN1cHBvcnRlZCwgYW5kIG5vIgogICAgICAgICAgICAgICIgMjQtYml0IHZpc3VhbHMgZm91bmRcbiIsIGRlcHRoKTsKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQogICAgICAgIFRyYWNlKChzdGRlcnIsICJYR2V0VmlzdWFsSW5mbygpIHJldHVybmVkICVkIDI0LWJpdCB2aXN1YWxzXG4iLAogICAgICAgICAgdmlzdWFsc19tYXRjaGVkKSkKICAgICAgICB2aXN1YWwgPSB2aXN1YWxfbGlzdFswXS52aXN1YWw7CiAgICAgICAgZGVwdGggPSB2aXN1YWxfbGlzdFswXS5kZXB0aDsKLyoKICAgICAgICBjb2xvcm1hcF9zaXplID0gdmlzdWFsX2xpc3RbMF0uY29sb3JtYXBfc2l6ZTsKICAgICAgICB2aXN1YWxfY2xhc3MgPSB2aXN1YWwtPmNsYXNzOwogICAgICAgIHZpc3VhbElEID0gWFZpc3VhbElERnJvbVZpc3VhbCh2aXN1YWwpOwogKi8KICAgICAgICBoYXZlX25vbmRlZmF1bHRfdmlzdWFsID0gVFJVRTsKICAgICAgICBuZWVkX2NvbG9ybWFwID0gVFJVRTsKICAgIH0gZWxzZSB7CiAgICAgICAgWE1hdGNoVmlzdWFsSW5mbyhkaXNwbGF5LCBzY3JlZW4sIGRlcHRoLCBUcnVlQ29sb3IsICZ2aXN1YWxfaW5mbyk7CiAgICAgICAgdmlzdWFsID0gdmlzdWFsX2luZm8udmlzdWFsOwogICAgfQojZW5kaWYKCiAgICBSTWFzayA9IHZpc3VhbC0+cmVkX21hc2s7CiAgICBHTWFzayA9IHZpc3VhbC0+Z3JlZW5fbWFzazsKICAgIEJNYXNrID0gdmlzdWFsLT5ibHVlX21hc2s7CgovKiBHUlI6ICBhZGQvY2hlY2sgOC1iaXQgc3VwcG9ydCAqLwogICAgaWYgKGRlcHRoID09IDggfHwgbmVlZF9jb2xvcm1hcCkgewogICAgICAgIGNvbG9ybWFwID0gWENyZWF0ZUNvbG9ybWFwKGRpc3BsYXksIHJvb3QsIHZpc3VhbCwgQWxsb2NOb25lKTsKICAgICAgICBpZiAoIWNvbG9ybWFwKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWENyZWF0ZUNvbG9ybWFwKCkgZmFpbGVkXG4iKTsKICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgfQogICAgICAgIGhhdmVfY29sb3JtYXAgPSBUUlVFOwogICAgfQogICAgaWYgKGRlcHRoID09IDE1IHx8IGRlcHRoID09IDE2KSB7CiAgICAgICAgUlNoaWZ0ID0gMTUgLSBycG5nX3hfbXNiKFJNYXNrKTsgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cyAqLwogICAgICAgIEdTaGlmdCA9IDE1IC0gcnBuZ194X21zYihHTWFzayk7CiAgICAgICAgQlNoaWZ0ID0gMTUgLSBycG5nX3hfbXNiKEJNYXNrKTsKICAgIH0gZWxzZSBpZiAoZGVwdGggPiAxNikgewojZGVmaW5lIE5PXzI0QklUX01BU0tTCiNpZmRlZiBOT18yNEJJVF9NQVNLUwogICAgICAgIFJTaGlmdCA9IHJwbmdfeF9tc2IoUk1hc2spIC0gNzsgICAgIC8qIHRoZXNlIGFyZSBsZWZ0LXNoaWZ0cyAqLwogICAgICAgIEdTaGlmdCA9IHJwbmdfeF9tc2IoR01hc2spIC0gNzsKICAgICAgICBCU2hpZnQgPSBycG5nX3hfbXNiKEJNYXNrKSAtIDc7CiNlbHNlCiAgICAgICAgUlNoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoUk1hc2spOyAgICAgLyogdGhlc2UgYXJlIHJpZ2h0LXNoaWZ0cywgdG9vICovCiAgICAgICAgR1NoaWZ0ID0gNyAtIHJwbmdfeF9tc2IoR01hc2spOwogICAgICAgIEJTaGlmdCA9IDcgLSBycG5nX3hfbXNiKEJNYXNrKTsKI2VuZGlmCiAgICB9CiAgICBpZiAoZGVwdGggPj0gMTUgJiYgKFJTaGlmdCA8IDAgfHwgR1NoaWZ0IDwgMCB8fCBCU2hpZnQgPCAwKSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAicnBuZyBpbnRlcm5hbCBsb2dpYyBlcnJvcjogIG5lZ2F0aXZlIFggc2hpZnQocykhXG4iKTsKICAgICAgICByZXR1cm4gMjsKICAgIH0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGaW5hbGx5LCBjcmVhdGUgdGhlIHdpbmRvdy4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGF0dHIuYmFja2luZ19zdG9yZSA9IEFsd2F5czsKICAgIGF0dHIuZXZlbnRfbWFzayA9IEV4cG9zdXJlTWFzayB8IEtleVByZXNzTWFzayB8IEJ1dHRvblByZXNzTWFzazsKICAgIGF0dHJtYXNrID0gQ1dCYWNraW5nU3RvcmUgfCBDV0V2ZW50TWFzazsKICAgIGlmIChoYXZlX25vbmRlZmF1bHRfdmlzdWFsKSB7CiAgICAgICAgYXR0ci5jb2xvcm1hcCA9IGNvbG9ybWFwOwogICAgICAgIGF0dHIuYmFja2dyb3VuZF9waXhlbCA9IDA7CiAgICAgICAgYXR0ci5ib3JkZXJfcGl4ZWwgPSAxOwogICAgICAgIGF0dHJtYXNrIHw9IENXQ29sb3JtYXAgfCBDV0JhY2tQaXhlbCB8IENXQm9yZGVyUGl4ZWw7CiAgICB9CgogICAgd2luZG93ID0gWENyZWF0ZVdpbmRvdyhkaXNwbGF5LCByb290LCAwLCAwLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCAwLAogICAgICBkZXB0aCwgSW5wdXRPdXRwdXQsIHZpc3VhbCwgYXR0cm1hc2ssICZhdHRyKTsKCiAgICBpZiAod2luZG93ID09IE5vbmUpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlhDcmVhdGVXaW5kb3coKSBmYWlsZWRcbiIpOwogICAgICAgIHJldHVybiAyOwogICAgfSBlbHNlCiAgICAgICAgaGF2ZV93aW5kb3cgPSBUUlVFOwoKICAgIGlmIChkZXB0aCA9PSA4KQogICAgICAgIFhTZXRXaW5kb3dDb2xvcm1hcChkaXNwbGF5LCB3aW5kb3csIGNvbG9ybWFwKTsKCiAgICBpZiAoIVhTdHJpbmdMaXN0VG9UZXh0UHJvcGVydHkoJndpbmRvd19uYW1lLCAxLCBwV2luZG93TmFtZSkpCiAgICAgICAgcFdpbmRvd05hbWUgPSBOVUxMOwogICAgaWYgKCFYU3RyaW5nTGlzdFRvVGV4dFByb3BlcnR5KCZpY29uX25hbWUsIDEsIHBJY29uTmFtZSkpCiAgICAgICAgcEljb25OYW1lID0gTlVMTDsKCiAgICAvKiBPSyBpZiBhbnkgaGludHMgYWxsb2NhdGlvbiBmYWlsczsgWFNldFdNUHJvcGVydGllcygpIGFsbG93cyBOVUxMcyAqLwoKICAgIGlmICgoc2l6ZV9oaW50cyA9IFhBbGxvY1NpemVIaW50cygpKSAhPSBOVUxMKSB7CiAgICAgICAgLyogd2luZG93IHdpbGwgbm90IGJlIHJlc2l6YWJsZSAqLwogICAgICAgIHNpemVfaGludHMtPmZsYWdzID0gUE1pblNpemUgfCBQTWF4U2l6ZTsKICAgICAgICBzaXplX2hpbnRzLT5taW5fd2lkdGggPSBzaXplX2hpbnRzLT5tYXhfd2lkdGggPSAoaW50KWltYWdlX3dpZHRoOwogICAgICAgIHNpemVfaGludHMtPm1pbl9oZWlnaHQgPSBzaXplX2hpbnRzLT5tYXhfaGVpZ2h0ID0gKGludClpbWFnZV9oZWlnaHQ7CiAgICB9CgogICAgaWYgKCh3bV9oaW50cyA9IFhBbGxvY1dNSGludHMoKSkgIT0gTlVMTCkgewogICAgICAgIHdtX2hpbnRzLT5pbml0aWFsX3N0YXRlID0gTm9ybWFsU3RhdGU7CiAgICAgICAgd21faGludHMtPmlucHV0ID0gVHJ1ZTsKICAgICAvKiB3bV9oaW50cy0+aWNvbl9waXhtYXAgPSBpY29uX3BpeG1hcDsgKi8KICAgICAgICB3bV9oaW50cy0+ZmxhZ3MgPSBTdGF0ZUhpbnQgfCBJbnB1dEhpbnQgIC8qIHwgSWNvblBpeG1hcEhpbnQgKi8gOwogICAgfQoKICAgIGlmICgoY2xhc3NfaGludHMgPSBYQWxsb2NDbGFzc0hpbnQoKSkgIT0gTlVMTCkgewogICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfbmFtZSA9IHJlc19uYW1lOwogICAgICAgIGNsYXNzX2hpbnRzLT5yZXNfY2xhc3MgPSByZXNfY2xhc3M7CiAgICB9CgogICAgWFNldFdNUHJvcGVydGllcyhkaXNwbGF5LCB3aW5kb3csIHBXaW5kb3dOYW1lLCBwSWNvbk5hbWUsIE5VTEwsIDAsCiAgICAgIHNpemVfaGludHMsIHdtX2hpbnRzLCBjbGFzc19oaW50cyk7CgogICAgLyogdmFyaW91cyBwcm9wZXJ0aWVzIGFuZCBoaW50cyBubyBsb25nZXIgbmVlZGVkOyBmcmVlIG1lbW9yeSAqLwogICAgaWYgKHBXaW5kb3dOYW1lKQogICAgICAgWEZyZWUocFdpbmRvd05hbWUtPnZhbHVlKTsKICAgIGlmIChwSWNvbk5hbWUpCiAgICAgICBYRnJlZShwSWNvbk5hbWUtPnZhbHVlKTsKICAgIGlmIChzaXplX2hpbnRzKQogICAgICAgIFhGcmVlKHNpemVfaGludHMpOwogICAgaWYgKHdtX2hpbnRzKQogICAgICAgWEZyZWUod21faGludHMpOwogICAgaWYgKGNsYXNzX2hpbnRzKQogICAgICAgWEZyZWUoY2xhc3NfaGludHMpOwoKICAgIFhNYXBXaW5kb3coZGlzcGxheSwgd2luZG93KTsKCiAgICBnYyA9IFhDcmVhdGVHQyhkaXNwbGF5LCB3aW5kb3csIDAsICZnY3ZhbHVlcyk7CiAgICBoYXZlX2djID0gVFJVRTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGaWxsIHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2dyb3VuZCBjb2xvci4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIGJnX3BpeGVsID0gKCh1bGcpYmdfcmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAoKHVsZyliZ19ncmVlbiA8PCBHU2hpZnQpIHwKICAgICAgICAgICAgICAgICAgICgodWxnKWJnX2JsdWUgIDw8IEJTaGlmdCk7CiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgYmdfcGl4ZWwgPSAoKCgodWxnKWJnX3JlZCAgIDw8IDgpID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgKCgoKHVsZyliZ19ncmVlbiA8PCA4KSA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICgoKCh1bGcpYmdfYmx1ZSAgPDwgOCkgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKCiAgICAgICAgLyogR1JSOiAgYWRkIDgtYml0IHN1cHBvcnQgKi8KCiAgICB9CgogICAgWFNldEZvcmVncm91bmQoZGlzcGxheSwgZ2MsIGJnX3BpeGVsKTsKICAgIFhGaWxsUmVjdGFuZ2xlKGRpc3BsYXksIHdpbmRvdywgZ2MsIDAsIDAsIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFdhaXQgZm9yIGZpcnN0IEV4cG9zZSBldmVudCB0byBkbyBhbnkgZHJhd2luZywgdGhlbiBmbHVzaC4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGRvCiAgICAgICAgWE5leHRFdmVudChkaXNwbGF5LCAmZSk7CiAgICB3aGlsZSAoZS50eXBlICE9IEV4cG9zZSB8fCBlLnhleHBvc2UuY291bnQpOwoKICAgIFhGbHVzaChkaXNwbGF5KTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBYLSBhbmQgZGlzcGxheS1zcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBpbWFnZS4KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmIChkZXB0aCA9PSAyNCB8fCBkZXB0aCA9PSAzMikgewogICAgICAgIHhkYXRhID0gKHVjaCAqKW1hbGxvYyg0KmltYWdlX3dpZHRoKmltYWdlX2hlaWdodCk7CiAgICAgICAgcGFkID0gMzI7CiAgICB9IGVsc2UgaWYgKGRlcHRoID09IDE2KSB7CiAgICAgICAgeGRhdGEgPSAodWNoICopbWFsbG9jKDIqaW1hZ2Vfd2lkdGgqaW1hZ2VfaGVpZ2h0KTsKICAgICAgICBwYWQgPSAxNjsKICAgIH0gZWxzZSAvKiBkZXB0aCA9PSA4ICovIHsKICAgICAgICB4ZGF0YSA9ICh1Y2ggKiltYWxsb2MoaW1hZ2Vfd2lkdGgqaW1hZ2VfaGVpZ2h0KTsKICAgICAgICBwYWQgPSA4OwogICAgfQoKICAgIGlmICgheGRhdGEpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUFJPR05BTUUgIjogIHVuYWJsZSB0byBhbGxvY2F0ZSBpbWFnZSBtZW1vcnlcbiIpOwogICAgICAgIHJldHVybiA0OwogICAgfQoKICAgIHhpbWFnZSA9IFhDcmVhdGVJbWFnZShkaXNwbGF5LCB2aXN1YWwsIGRlcHRoLCBaUGl4bWFwLCAwLAogICAgICAoY2hhciAqKXhkYXRhLCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LCBwYWQsIDApOwoKICAgIGlmICgheGltYWdlKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsIFBST0dOQU1FICI6ICBYQ3JlYXRlSW1hZ2UoKSBmYWlsZWRcbiIpOwogICAgICAgIGZyZWUoeGRhdGEpOwogICAgICAgIHJldHVybiAzOwogICAgfQoKICAgIC8qIHRvIGF2b2lkIHRlc3RpbmcgdGhlIGJ5dGUgb3JkZXIgZXZlcnkgcGl4ZWwgKG9yIGRvdWJsaW5nIHRoZSBzaXplIG9mCiAgICAgKiB0aGUgZHJhd2luZyByb3V0aW5lIHdpdGggYSBnaWFudCBpZi10ZXN0KSwgd2UgYXJiaXRyYXJpbHkgc2V0IHRoZSBieXRlCiAgICAgKiBvcmRlciB0byBNU0JGaXJzdCBhbmQgbGV0IFhsaWIgd29ycnkgYWJvdXQgaW52ZXJ0aW5nIHRoaW5ncyBvbiBsaXR0bGUtCiAgICAgKiBlbmRpYW4gbWFjaGluZXMgKGxpa2UgTGludXgveDg2LCBvbGQgVkFYZW4sIGV0Yy4pLS10aGlzIGlzIG5vdCB0aGUgbW9zdAogICAgICogZWZmaWNpZW50IGFwcHJvYWNoICh0aGUgZ2lhbnQgaWYtdGVzdCB3b3VsZCBiZSBiZXR0ZXIpLCBidXQgaW4gdGhlCiAgICAgKiBpbnRlcmVzdCBvZiBjbGFyaXR5LCB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQuLi4gKi8KCiAgICB4aW1hZ2UtPmJ5dGVfb3JkZXIgPSBNU0JGaXJzdDsKCiAgICByZXR1cm4gMDsKCn0gLyogZW5kIGZ1bmN0aW9uIHJwbmdfeF9jcmVhdGVfd2luZG93KCkgKi8KCgoKCgpzdGF0aWMgaW50IHJwbmdfeF9kaXNwbGF5X2ltYWdlKHZvaWQpCnsKICAgIHVjaCAqc3JjOwogICAgY2hhciAqZGVzdDsKICAgIHVjaCByLCBnLCBiLCBhOwogICAgdWxnIGksIHJvdywgbGFzdHJvdyA9IDA7CiAgICB1bGcgcGl4ZWw7CiAgICBpbnQgeGltYWdlX3Jvd2J5dGVzID0geGltYWdlLT5ieXRlc19wZXJfbGluZTsKLyogIGludCBicHAgPSB4aW1hZ2UtPmJpdHNfcGVyX3BpeGVsOyAgKi8KCgogICAgVHJhY2UoKHN0ZGVyciwgImJlZ2lubmluZyBkaXNwbGF5IGxvb3AgKGltYWdlX2NoYW5uZWxzID09ICVkKVxuIiwKICAgICAgaW1hZ2VfY2hhbm5lbHMpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgICh3aWR0aCA9ICVsZCwgcm93Ynl0ZXMgPSAlbGQsIHhpbWFnZV9yb3dieXRlcyA9ICVkKVxuIiwKICAgICAgaW1hZ2Vfd2lkdGgsIGltYWdlX3Jvd2J5dGVzLCB4aW1hZ2Vfcm93Ynl0ZXMpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgIChicHAgPSAlZClcbiIsIHhpbWFnZS0+Yml0c19wZXJfcGl4ZWwpKQogICAgVHJhY2UoKHN0ZGVyciwgIiAgIChieXRlX29yZGVyID0gJXMpXG4iLCB4aW1hZ2UtPmJ5dGVfb3JkZXIgPT0gTVNCRmlyc3Q/CiAgICAgICJNU0JGaXJzdCIgOiAoeGltYWdlLT5ieXRlX29yZGVyID09IExTQkZpcnN0PyAiTFNCRmlyc3QiIDogInVua25vd24iKSkpCgogICAgaWYgKGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSB7CiAgICAgICAgdWxnIHJlZCwgZ3JlZW4sIGJsdWU7CgogICAgICAgIGZvciAobGFzdHJvdyA9IHJvdyA9IDA7ICByb3cgPCBpbWFnZV9oZWlnaHQ7ICArK3JvdykgewogICAgICAgICAgICBzcmMgPSBpbWFnZV9kYXRhICsgcm93KmltYWdlX3Jvd2J5dGVzOwogICAgICAgICAgICBkZXN0ID0geGltYWdlLT5kYXRhICsgcm93KnhpbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgaWYgKGltYWdlX2NoYW5uZWxzID09IDMpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IGltYWdlX3dpZHRoOyAgaSA+IDA7ICAtLWkpIHsKICAgICAgICAgICAgICAgICAgICByZWQgICA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBibHVlICA9ICpzcmMrKzsKI2lmZGVmIE5PXzI0QklUX01BU0tTCiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAocmVkICAgPDwgUlNoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlZW4gPDwgR1NoaWZ0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmx1ZSAgPDwgQlNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAvKiBHUlIgQlVHOiAgdGhpcyBhc3N1bWVzIGJwcCA9PSAzMiwgYnV0IG1heSBiZSAyNDogKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKI2Vsc2UKICAgICAgICAgICAgICAgICAgICByZWQgICA9IChSU2hpZnQgPCAwKT8gcmVkICAgPDwgKC1SU2hpZnQpIDogcmVkICAgPj4gUlNoaWZ0OwogICAgICAgICAgICAgICAgICAgIGdyZWVuID0gKEdTaGlmdCA8IDApPyBncmVlbiA8PCAoLUdTaGlmdCkgOiBncmVlbiA+PiBHU2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoQlNoaWZ0IDwgMCk/IGJsdWUgIDw8ICgtQlNoaWZ0KSA6IGJsdWUgID4+IEJTaGlmdDsKICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IChyZWQgJiBSTWFzaykgfCAoZ3JlZW4gJiBHTWFzaykgfCAoYmx1ZSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAyNCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAxNikgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoaW1hZ2VfY2hhbm5lbHMgPT0gNCkgKi8gewogICAgICAgICAgICAgICAgZm9yIChpID0gaW1hZ2Vfd2lkdGg7ICBpID4gMDsgIC0taSkgewogICAgICAgICAgICAgICAgICAgIHIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgZyA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBiID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGEgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZCAgID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSBnOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9IGI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSBiZ19yZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuID0gYmdfZ3JlZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gYmdfYmx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1hY3JvIChmcm9tIHBuZy5oKSBjb21wb3NpdGVzIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhbmQgcHV0cyB0aGUgcmVzdWx0IGludG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGFyZ3VtZW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShyZWQsICAgciwgYSwgYmdfcmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKGdyZWVuLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShibHVlLCAgYiwgYSwgYmdfYmx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBpeGVsID0gKHJlZCAgIDw8IFJTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyZWVuIDw8IEdTaGlmdCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdWUgIDw8IEJTaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgLyogcmVjYWxsIHRoYXQgd2Ugc2V0IHhpbWFnZS0+Ynl0ZV9vcmRlciA9IE1TQkZpcnN0IGFib3ZlICovCiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMjQpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gMTYpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSgocGl4ZWwgPj4gIDgpICYgMHhmZik7CiAgICAgICAgICAgICAgICAgICAgKmRlc3QrKyA9IChjaGFyKSggcGl4ZWwgICAgICAgICYgMHhmZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZGlzcGxheSBhZnRlciBldmVyeSAxNiBsaW5lcyAqLwogICAgICAgICAgICBpZiAoKChyb3crMSkgJiAweGYpID09IDApIHsKICAgICAgICAgICAgICAgIFhQdXRJbWFnZShkaXNwbGF5LCB3aW5kb3csIGdjLCB4aW1hZ2UsIDAsIChpbnQpbGFzdHJvdywgMCwKICAgICAgICAgICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgMTYpOwogICAgICAgICAgICAgICAgWEZsdXNoKGRpc3BsYXkpOwogICAgICAgICAgICAgICAgbGFzdHJvdyA9IHJvdyArIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNikgewogICAgICAgIHVzaCByZWQsIGdyZWVuLCBibHVlOwoKICAgICAgICBmb3IgKGxhc3Ryb3cgPSByb3cgPSAwOyAgcm93IDwgaW1hZ2VfaGVpZ2h0OyAgKytyb3cpIHsKICAgICAgICAgICAgc3JjID0gaW1hZ2VfZGF0YSArIHJvdyppbWFnZV9yb3dieXRlczsKICAgICAgICAgICAgZGVzdCA9IHhpbWFnZS0+ZGF0YSArIHJvdyp4aW1hZ2Vfcm93Ynl0ZXM7CiAgICAgICAgICAgIGlmIChpbWFnZV9jaGFubmVscyA9PSAzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICAgICAgZ3JlZW4gPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICAgICAgYmx1ZSAgPSAoKHVzaCkoKnNyYykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgKytzcmM7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChpbWFnZV9jaGFubmVscyA9PSA0KSAqLyB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbWFnZV93aWR0aDsgIGkgPiAwOyAgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgciA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBnID0gKnNyYysrOwogICAgICAgICAgICAgICAgICAgIGIgPSAqc3JjKys7CiAgICAgICAgICAgICAgICAgICAgYSA9ICpzcmMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoYSA9PSAyNTUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWQgICA9ICgodXNoKWJnX3JlZCAgIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWJnX2dyZWVuIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBibHVlICA9ICgodXNoKWJnX2JsdWUgIDw8IDgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbWFjcm8gKGZyb20gcG5nLmgpIGNvbXBvc2l0ZXMgdGhlIGZvcmVncm91bmQKICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGJhY2tncm91bmQgdmFsdWVzIGFuZCBwdXRzIHRoZSByZXN1bHQgYmFjayBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBmaXJzdCBhcmd1bWVudCAoPT0gZmcgYnl0ZSBoZXJlOiAgc2FmZSkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfY29tcG9zaXRlKHIsIHIsIGEsIGJnX3JlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShnLCBnLCBhLCBiZ19ncmVlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2NvbXBvc2l0ZShiLCBiLCBhLCBiZ19ibHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVkICAgPSAoKHVzaClyIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICAgICBncmVlbiA9ICgodXNoKWcgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUgID0gKCh1c2gpYiA8PCA4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSAoKHJlZCAgID4+IFJTaGlmdCkgJiBSTWFzaykgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChncmVlbiA+PiBHU2hpZnQpICYgR01hc2spIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmx1ZSAgPj4gQlNoaWZ0KSAmIEJNYXNrKTsKICAgICAgICAgICAgICAgICAgICAvKiByZWNhbGwgdGhhdCB3ZSBzZXQgeGltYWdlLT5ieXRlX29yZGVyID0gTVNCRmlyc3QgYWJvdmUgKi8KICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKChwaXhlbCA+PiAgOCkgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAqZGVzdCsrID0gKGNoYXIpKCBwaXhlbCAgICAgICAgJiAweGZmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBkaXNwbGF5IGFmdGVyIGV2ZXJ5IDE2IGxpbmVzICovCiAgICAgICAgICAgIGlmICgoKHJvdysxKSAmIDB4ZikgPT0gMCkgewogICAgICAgICAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAogICAgICAgICAgICAgICAgICAoaW50KWxhc3Ryb3csIGltYWdlX3dpZHRoLCAxNik7CiAgICAgICAgICAgICAgICBYRmx1c2goZGlzcGxheSk7CiAgICAgICAgICAgICAgICBsYXN0cm93ID0gcm93ICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9IGVsc2UgLyogZGVwdGggPT0gOCAqLyB7CgogICAgICAgIC8qIEdSUjogIGFkZCA4LWJpdCBzdXBwb3J0ICovCgogICAgfQoKICAgIFRyYWNlKChzdGRlcnIsICJjYWxsaW5nIGZpbmFsIFhQdXRJbWFnZSgpXG4iKSkKICAgIGlmIChsYXN0cm93IDwgaW1hZ2VfaGVpZ2h0KSB7CiAgICAgICAgWFB1dEltYWdlKGRpc3BsYXksIHdpbmRvdywgZ2MsIHhpbWFnZSwgMCwgKGludClsYXN0cm93LCAwLAogICAgICAgICAgKGludClsYXN0cm93LCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0LWxhc3Ryb3cpOwogICAgICAgIFhGbHVzaChkaXNwbGF5KTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKCgoKc3RhdGljIHZvaWQgcnBuZ194X2NsZWFudXAodm9pZCkKewogICAgaWYgKGltYWdlX2RhdGEpIHsKICAgICAgICBmcmVlKGltYWdlX2RhdGEpOwogICAgICAgIGltYWdlX2RhdGEgPSBOVUxMOwogICAgfQoKICAgIGlmICh4aW1hZ2UpIHsKICAgICAgICBpZiAoeGltYWdlLT5kYXRhKSB7CiAgICAgICAgICAgIGZyZWUoeGltYWdlLT5kYXRhKTsgICAgICAgICAgIC8qIHdlIGFsbG9jYXRlZCBpdCwgc28gd2UgZnJlZSBpdCAqLwogICAgICAgICAgICB4aW1hZ2UtPmRhdGEgPSAoY2hhciAqKU5VTEw7ICAvKiAgaW5zdGVhZCBvZiBYRGVzdHJveUltYWdlKCkgKi8KICAgICAgICB9CiAgICAgICAgWERlc3Ryb3lJbWFnZSh4aW1hZ2UpOwogICAgICAgIHhpbWFnZSA9IE5VTEw7CiAgICB9CgogICAgaWYgKGhhdmVfZ2MpCiAgICAgICAgWEZyZWVHQyhkaXNwbGF5LCBnYyk7CgogICAgaWYgKGhhdmVfd2luZG93KQogICAgICAgIFhEZXN0cm95V2luZG93KGRpc3BsYXksIHdpbmRvdyk7CgogICAgaWYgKGhhdmVfY29sb3JtYXApCiAgICAgICAgWEZyZWVDb2xvcm1hcChkaXNwbGF5LCBjb2xvcm1hcCk7CgogICAgaWYgKGhhdmVfbm9uZGVmYXVsdF92aXN1YWwpCiAgICAgICAgWEZyZWUodmlzdWFsX2xpc3QpOwp9CgoKCgoKc3RhdGljIGludCBycG5nX3hfbXNiKHVsZyB1MzJ2YWwpCnsKICAgIGludCBpOwoKICAgIGZvciAoaSA9IDMxOyAgaSA+PSAwOyAgLS1pKSB7CiAgICAgICAgaWYgKHUzMnZhbCAmIDB4ODAwMDAwMDBMKQogICAgICAgICAgICBicmVhazsKICAgICAgICB1MzJ2YWwgPDw9IDE7CiAgICB9CiAgICByZXR1cm4gaTsKfQo=