LyoKICogU05NUHYzIFZpZXctYmFzZWQgQWNjZXNzIENvbnRyb2wgTW9kZWwKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfTUFMTE9DX0gKI2luY2x1ZGUgPG1hbGxvYy5oPgojZW5kaWYKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfTkVUREJfSAojaW5jbHVkZSA8bmV0ZGIuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfY2FsbGJhY2tzLmg+CiNpbmNsdWRlICJ2YWNtX2NvbmYuaCIKCiNpbmNsdWRlICJzbm1wZC5oIgoKLyoqCiAqIFJlZ2lzdGVycyB0aGUgVkFDTSB0b2tlbiBoYW5kbGVycyBmb3IgaW5zZXJ0aW5nIHJvd3MgaW50byB0aGUgdmFjbSB0YWJsZXMuCiAqIFRoZXNlIHRva2VucyB3aWxsIGJlIHJlY29nbmlzZWQgYnkgYm90aCAnc25tcGQnIGFuZCAnc25tcHRyYXBkJy4KICovCnZvaWQKaW5pdF92YWNtX2NvbmZpZ190b2tlbnModm9pZCkgewogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoImdyb3VwIiwgdmFjbV9wYXJzZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhY21fZnJlZV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIHYxfHYyY3x1c218Li4uIHNlY3VyaXR5Iik7CiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigiYWNjZXNzIiwgdmFjbV9wYXJzZV9hY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWNtX2ZyZWVfYWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUgY29udGV4dCBtb2RlbCBsZXZlbCBwcmVmaXggcmVhZCB3cml0ZSBub3RpZnkiKTsKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJzZXRhY2Nlc3MiLCB2YWNtX3BhcnNlX3NldGFjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhY21fZnJlZV9hY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSBjb250ZXh0IG1vZGVsIGxldmVsIHByZWZpeCB2aWV3bmFtZSB2aWV3dmFsIik7CiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigidmlldyIsIHZhY21fcGFyc2VfdmlldywgdmFjbV9mcmVlX3ZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSB0eXBlIHN1YnRyZWUgW21hc2tdIik7CiAgICBzbm1wZF9yZWdpc3Rlcl9jb25zdF9jb25maWdfaGFuZGxlcigidmFjbVZpZXciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFjbV9wYXJzZV9jb25maWdfdmlldywgTlVMTCwgTlVMTCk7CiAgICBzbm1wZF9yZWdpc3Rlcl9jb25zdF9jb25maWdfaGFuZGxlcigidmFjbUdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhY21fcGFyc2VfY29uZmlnX2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICBzbm1wZF9yZWdpc3Rlcl9jb25zdF9jb25maWdfaGFuZGxlcigidmFjbUFjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWNtX3BhcnNlX2NvbmZpZ19hY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKICAgIHNubXBkX3JlZ2lzdGVyX2NvbnN0X2NvbmZpZ19oYW5kbGVyKCJ2YWNtQXV0aEFjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWNtX3BhcnNlX2NvbmZpZ19hdXRoX2FjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwoKICAgIC8qIGVhc3kgY29tbXVuaXR5IGF1dGggaGFuZGxlciAqLwogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoImF1dGhjb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFjbV9wYXJzZV9hdXRoY29tbXVuaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgImF1dGh0eXBlMSxhdXRodHlwZTIgY29tbXVuaXR5IFtkZWZhdWx0fGhvc3RuYW1lfG5ldHdvcmsvYml0cyBbb2lkfC1WIHZpZXcgW2NvbnRleHRdXV0iKTsKCiAgICAvKiBlYXN5IHVzZXIgYXV0aCBoYW5kbGVyICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigiYXV0aHVzZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFjbV9wYXJzZV9hdXRodXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICJhdXRodHlwZTEsYXV0aHR5cGUyIFstcyBzZWNtb2RlbF0gdXNlciBbbm9hdXRofGF1dGh8cHJpdiBbb2lkfC1WIHZpZXcgW2NvbnRleHRdXV0iKTsKICAgIC8qIGVhc3kgZ3JvdXAgYXV0aCBoYW5kbGVyICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigiYXV0aGdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhY21fcGFyc2VfYXV0aHVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAiYXV0aHR5cGUxLGF1dGh0eXBlMiBbLXMgc2VjbW9kZWxdIGdyb3VwIFtub2F1dGh8YXV0aHxwcml2IFtvaWR8LVYgdmlldyBbY29udGV4dF1dXSIpOwoKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJhdXRoYWNjZXNzIiwgdmFjbV9wYXJzZV9hdXRoYWNjZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFjbV9mcmVlX2FjY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIGF1dGh0eXBlMSxhdXRodHlwZTIgWy1zIHNlY21vZGVsXSBncm91cCB2aWV3IFtub2F1dGh8YXV0aHxwcml2IFtjb250ZXh0fGNvbnRleHQqXV0iKTsKCiAgICAvKgogICAgICogRGVmaW5lIHN0YW5kYXJkIHZpZXdzICJfYWxsXyIgYW5kICJfbm9uZV8iCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTTk1QX0NBTExCQUNLX1BSRV9SRUFEX0NPTkZJRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFjbV9zdGFuZGFyZF92aWV3cywgTlVMTCk7CiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9DQUxMQkFDS19QT1NUX1JFQURfQ09ORklHLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWNtX3dhcm5faWZfbm90X2NvbmZpZ3VyZWQsIE5VTEwpOwp9CgovKioKICogUmVnaXN0ZXJzIHRoZSBlYXNpZXItdG8tdXNlIFZBQ00gdG9rZW4gaGFuZGxlcnMgZm9yIHF1aWNrIGFjY2VzcyBydWxlcy4KICogVGhlc2UgdG9rZW5zIHdpbGwgb25seSBiZSByZWNvZ25pc2VkIGJ5ICdzbm1wZCcuCiAqLwp2b2lkCmluaXRfdmFjbV9zbm1wZF9lYXN5X3Rva2Vucyh2b2lkKSB7CiNpZiAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYxKSB8fCAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYyQykKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJyd2NvbW11bml0eSIsIHZhY21fcGFyc2Vfcndjb21tdW5pdHksIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXR5IFtkZWZhdWx0fGhvc3RuYW1lfG5ldHdvcmsvYml0cyBbb2lkfC1WIHZpZXcgW2NvbnRleHRdXV0iKTsKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJyb2NvbW11bml0eSIsIHZhY21fcGFyc2Vfcm9jb21tdW5pdHksIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXR5IFtkZWZhdWx0fGhvc3RuYW1lfG5ldHdvcmsvYml0cyBbb2lkfC1WIHZpZXcgW2NvbnRleHRdXV0iKTsKI2lmZGVmIE5FVFNOTVBfVFJBTlNQT1JUX1VEUElQVjZfRE9NQUlOCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigicndjb21tdW5pdHk2IiwgdmFjbV9wYXJzZV9yd2NvbW11bml0eTYsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXR5IFtkZWZhdWx0fGhvc3RuYW1lfG5ldHdvcmsvYml0cyBbb2lkfC1WIHZpZXcgW2NvbnRleHRdXV0iKTsKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJyb2NvbW11bml0eTYiLCB2YWNtX3BhcnNlX3JvY29tbXVuaXR5NiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pdHkgW2RlZmF1bHR8aG9zdG5hbWV8bmV0d29yay9iaXRzIFtvaWR8LVYgdmlldyBbY29udGV4dF1dXSIpOwojZW5kaWYKI2VuZGlmIC8qIHN1cHBvcnQgZm9yIGNvbW11bml0eSBiYXNlZCBTTk1QICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigicnd1c2VyIiwgdmFjbV9wYXJzZV9yd3VzZXIsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlciBbbm9hdXRofGF1dGh8cHJpdiBbb2lkfC1WIHZpZXcgW2NvbnRleHRdXV0iKTsKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJyb3VzZXIiLCB2YWNtX3BhcnNlX3JvdXNlciwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyIFtub2F1dGh8YXV0aHxwcml2IFtvaWR8LVYgdmlldyBbY29udGV4dF1dXSIpOwp9Cgp2b2lkCmluaXRfdmFjbV9jb25mKHZvaWQpCnsKICAgIGluaXRfdmFjbV9jb25maWdfdG9rZW5zKCk7CiAgICBpbml0X3ZhY21fc25tcGRfZWFzeV90b2tlbnMoKTsKICAgIC8qCiAgICAgKiByZWdpc3RlciBvdXJzZWx2ZXMgdG8gaGFuZGxlIGFjY2VzcyBjb250cm9sICAoJ3NubXBkJyBvbmx5KQogICAgICovCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDSywgdmFjbV9pbl92aWV3X2NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19BUFBMSUNBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUERfQ0FMTEJBQ0tfQUNNX0NIRUNLX0lOSVRJQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhY21faW5fdmlld19jYWxsYmFjaywgTlVMTCk7CiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfQVBQTElDQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBEX0NBTExCQUNLX0FDTV9DSEVDS19TVUJUUkVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWNtX2luX3ZpZXdfY2FsbGJhY2ssIE5VTEwpOwp9CgoKCnZvaWQKdmFjbV9wYXJzZV9ncm91cChjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqcGFyYW0pCnsKICAgIGNoYXIgICAgICAgICAgICBncm91cFtWQUNNU1RSSU5HTEVOXSwgbW9kZWxbVkFDTVNUUklOR0xFTl0sIHNlY3VyaXR5W1ZBQ01TVFJJTkdMRU5dOwogICAgaW50ICAgICAgICAgICAgIGltb2RlbDsKICAgIHN0cnVjdCB2YWNtX2dyb3VwRW50cnkgKmdwID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpzdDsKCiAgICBzdCA9IGNvcHlfbndvcmQocGFyYW0sIGdyb3VwLCBzaXplb2YoZ3JvdXApLTEpOwogICAgc3QgPSBjb3B5X253b3JkKHN0LCBtb2RlbCwgc2l6ZW9mKG1vZGVsKS0xKTsKICAgIHN0ID0gY29weV9ud29yZChzdCwgc2VjdXJpdHksIHNpemVvZihzZWN1cml0eSktMSk7CgogICAgaWYgKGdyb3VwWzBdID09IDApIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIEdST1VQIHBhcmFtZXRlciIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChtb2RlbFswXSA9PSAwKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyBNT0RFTCBwYXJhbWV0ZXIiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoc2VjdXJpdHlbMF0gPT0gMCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgU0VDVVJJVFkgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHN0cmNhc2VjbXAobW9kZWwsICJ2MSIpID09IDApCiAgICAgICAgaW1vZGVsID0gU05NUF9TRUNfTU9ERUxfU05NUHYxOwogICAgZWxzZSBpZiAoc3RyY2FzZWNtcChtb2RlbCwgInYyYyIpID09IDApCiAgICAgICAgaW1vZGVsID0gU05NUF9TRUNfTU9ERUxfU05NUHYyYzsKICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAobW9kZWwsICJhbnkiKSA9PSAwKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImJhZCBzZWN1cml0eSBtb2RlbCBcImFueVwiIHNob3VsZCBiZTogdjEsIHYyYywgdXNtIG9yIGEgcmVnaXN0ZXJlZCBzZWN1cml0eSBwbHVnaW4gbmFtZSAtIGluc3RhbGxpbmcgYW55d2F5Iik7CiAgICAgICAgaW1vZGVsID0gU05NUF9TRUNfTU9ERUxfQU5ZOwogICAgfSBlbHNlIHsKICAgICAgICBpZiAoKGltb2RlbCA9IHNlX2ZpbmRfdmFsdWVfaW5fc2xpc3QoInNubXBfc2VjbW9kcyIsIG1vZGVsKSkgPT0KICAgICAgICAgICAgU0VfRE5FKSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IKICAgICAgICAgICAgICAgICgiYmFkIHNlY3VyaXR5IG1vZGVsLCBzaG91bGQgYmU6IHYxLCB2MmMgb3IgdXNtIG9yIGEgcmVnaXN0ZXJlZCBzZWN1cml0eSBwbHVnaW4gbmFtZSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHN0cmxlbihzZWN1cml0eSkgKyAxID4gc2l6ZW9mKGdwLT5ncm91cE5hbWUpKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigic2VjdXJpdHkgbmFtZSB0b28gbG9uZyIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGdwID0gdmFjbV9jcmVhdGVHcm91cEVudHJ5KGltb2RlbCwgc2VjdXJpdHkpOwogICAgaWYgKCFncCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgZ3JvdXAgZW50cnkiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBzdHJsY3B5KGdwLT5ncm91cE5hbWUsIGdyb3VwLCBzaXplb2YoZ3AtPmdyb3VwTmFtZSkpOwogICAgZ3AtPnN0b3JhZ2VUeXBlID0gU05NUF9TVE9SQUdFX1BFUk1BTkVOVDsKICAgIGdwLT5zdGF0dXMgPSBTTk1QX1JPV19BQ1RJVkU7CiAgICBmcmVlKGdwLT5yZXNlcnZlZCk7CiAgICBncC0+cmVzZXJ2ZWQgPSBOVUxMOwp9Cgp2b2lkCnZhY21fZnJlZV9ncm91cCh2b2lkKQp7CiAgICB2YWNtX2Rlc3Ryb3lBbGxHcm91cEVudHJpZXMoKTsKfQoKI2RlZmluZSBQQVJTRV9DT05UIDAKI2RlZmluZSBQQVJTRV9GQUlMIDEKCmludApfdmFjbV9wYXJzZV9hY2Nlc3NfY29tbW9uKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpwYXJhbSwgY2hhciAqKnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipuYW1lLCBjaGFyICoqY29udGV4dCwgaW50ICppbW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbGV2ZWwsIGludCAqaXByZWZpeCkKewogICAgY2hhciAqbW9kZWwsICpsZXZlbCwgKnByZWZpeDsKCiAgICAqbmFtZSA9IHN0cnRva19yKHBhcmFtLCAiIFx0XG4iLCBzdCk7CiAgICBpZiAoISpuYW1lKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyBOQU1FIHBhcmFtZXRlciIpOwogICAgICAgIHJldHVybiBQQVJTRV9GQUlMOwogICAgfQogICAgKmNvbnRleHQgPSBzdHJ0b2tfcihOVUxMLCAiIFx0XG4iLCBzdCk7CiAgICBpZiAoISpjb250ZXh0KSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyBDT05URVhUIHBhcmFtZXRlciIpOwogICAgICAgIHJldHVybiBQQVJTRV9GQUlMOwogICAgfQoKICAgIG1vZGVsID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgc3QpOwogICAgaWYgKCFtb2RlbCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgTU9ERUwgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuIFBBUlNFX0ZBSUw7CiAgICB9CiAgICBsZXZlbCA9IHN0cnRva19yKE5VTEwsICIgXHRcbiIsIHN0KTsKICAgIGlmICghbGV2ZWwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIExFVkVMIHBhcmFtZXRlciIpOwogICAgICAgIHJldHVybiBQQVJTRV9GQUlMOwogICAgfQogICAgcHJlZml4ID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgc3QpOwogICAgaWYgKCFwcmVmaXgpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIFBSRUZJWCBwYXJhbWV0ZXIiKTsKICAgICAgICByZXR1cm4gUEFSU0VfRkFJTDsKICAgIH0KCiAgICBpZiAoc3RyY21wKCpjb250ZXh0LCAiXCJcIiIpID09IDApCiAgICAgICAgKipjb250ZXh0ID0gMDsKICAgIGlmIChzdHJjYXNlY21wKG1vZGVsLCAiYW55IikgPT0gMCkKICAgICAgICAqaW1vZGVsID0gU05NUF9TRUNfTU9ERUxfQU5ZOwogICAgZWxzZSBpZiAoc3RyY2FzZWNtcChtb2RlbCwgInYxIikgPT0gMCkKICAgICAgICAqaW1vZGVsID0gU05NUF9TRUNfTU9ERUxfU05NUHYxOwogICAgZWxzZSBpZiAoc3RyY2FzZWNtcChtb2RlbCwgInYyYyIpID09IDApCiAgICAgICAgKmltb2RlbCA9IFNOTVBfU0VDX01PREVMX1NOTVB2MmM7CiAgICBlbHNlIHsKICAgICAgICBpZiAoKCppbW9kZWwgPSBzZV9maW5kX3ZhbHVlX2luX3NsaXN0KCJzbm1wX3NlY21vZHMiLCBtb2RlbCkpCiAgICAgICAgICAgID09IFNFX0RORSkgewogICAgICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICAgICAoImJhZCBzZWN1cml0eSBtb2RlbCwgc2hvdWxkIGJlOiB2MSwgdjJjIG9yIHVzbSBvciBhIHJlZ2lzdGVyZWQgc2VjdXJpdHkgcGx1Z2luIG5hbWUiKTsKICAgICAgICAgICAgcmV0dXJuIFBBUlNFX0ZBSUw7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAoc3RyY2FzZWNtcChsZXZlbCwgIm5vYXV0aCIpID09IDApCiAgICAgICAgKmlsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX05PQVVUSDsKICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAobGV2ZWwsICJub2F1dGhub3ByaXYiKSA9PSAwKQogICAgICAgICppbGV2ZWwgPSBTTk1QX1NFQ19MRVZFTF9OT0FVVEg7CiAgICBlbHNlIGlmIChzdHJjYXNlY21wKGxldmVsLCAiYXV0aCIpID09IDApCiAgICAgICAgKmlsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVY7CiAgICBlbHNlIGlmIChzdHJjYXNlY21wKGxldmVsLCAiYXV0aG5vcHJpdiIpID09IDApCiAgICAgICAgKmlsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVY7CiAgICBlbHNlIGlmIChzdHJjYXNlY21wKGxldmVsLCAicHJpdiIpID09IDApCiAgICAgICAgKmlsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX0FVVEhQUklWOwogICAgZWxzZSBpZiAoc3RyY2FzZWNtcChsZXZlbCwgImF1dGhwcml2IikgPT0gMCkKICAgICAgICAqaWxldmVsID0gU05NUF9TRUNfTEVWRUxfQVVUSFBSSVY7CiAgICBlbHNlIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiYmFkIHNlY3VyaXR5IGxldmVsIChub2F1dGhub3ByaXYsIGF1dGhub3ByaXYsIGF1dGhwcml2KSIpOwogICAgICAgIHJldHVybiBQQVJTRV9GQUlMOwogICAgfQoKICAgIGlmIChzdHJjbXAocHJlZml4LCAiZXhhY3QiKSA9PSAwKQogICAgICAgICppcHJlZml4ID0gMTsKICAgIGVsc2UgaWYgKHN0cmNtcChwcmVmaXgsICJwcmVmaXgiKSA9PSAwKQogICAgICAgICppcHJlZml4ID0gMjsKICAgIGVsc2UgaWYgKHN0cmNtcChwcmVmaXgsICIwIikgPT0gMCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IKICAgICAgICAgICAgKCJiYWQgcHJlZml4IG1hdGNoIHBhcmFtZXRlciBcIjBcIiwgc2hvdWxkIGJlOiBleGFjdCBvciBwcmVmaXggLSBpbnN0YWxsaW5nIGFueXdheSIpOwogICAgICAgICppcHJlZml4ID0gMTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImJhZCBwcmVmaXggbWF0Y2ggcGFyYW1ldGVyLCBzaG91bGQgYmU6IGV4YWN0IG9yIHByZWZpeCIpOwogICAgICAgIHJldHVybiBQQVJTRV9GQUlMOwogICAgfQoKICAgIHJldHVybiBQQVJTRV9DT05UOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogYXV0aG9yaXphdGlvbiBwYXJzaW5nIHRva2VuIGhhbmRsZXJzICovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50CnZhY21fcGFyc2VfYXV0aHRva2Vucyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqKmNvbmZsaW5lKQp7CiAgICBjaGFyIGF1dGhzcGVjW1NOTVBfTUFYQlVGX01FRElVTV07CiAgICBjaGFyICpzdHJ0b2tfc3RhdGU7CiAgICBjaGFyICp0eXBlOwogICAgaW50IHZpZXd0eXBlLCB2aWV3dHlwZXMgPSAwOwoKICAgICpjb25mbGluZSA9IGNvcHlfbndvcmQoKmNvbmZsaW5lLCBhdXRoc3BlYywgc2l6ZW9mKGF1dGhzcGVjKSk7CiAgICAKICAgIERFQlVHTVNHVEwoKCJ2YWNtX3BhcnNlX2F1dGh0b2tlbnMiLCJwYXJzaW5nICVzIixhdXRoc3BlYykpOwogICAgaWYgKCEqY29uZmxpbmUpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJJbGxlZ2FsIGNvbmZpZ3VyYXRpb24gbGluZTogbWlzc2luZyBmaWVsZHMiKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgdHlwZSA9IHN0cnRva19yKGF1dGhzcGVjLCAiLHw6IiwgJnN0cnRva19zdGF0ZSk7CiAgICB3aGlsZSh0eXBlICYmICp0eXBlICE9ICdcMCcpIHsKICAgICAgICB2aWV3dHlwZSA9IHNlX2ZpbmRfdmFsdWVfaW5fc2xpc3QoVkFDTV9WSUVXX0VOVU1fTkFNRSwgdHlwZSk7CiAgICAgICAgaWYgKHZpZXd0eXBlIDwgMCB8fCB2aWV3dHlwZSA+PSBWQUNNX01BWF9WSUVXUykgewogICAgICAgICAgICBjb25maWdfcGVycm9yKCJJbGxlZ2FsIHZpZXcgbmFtZSIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZpZXd0eXBlcyB8PSAoMSA8PCB2aWV3dHlwZSk7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBzdHJ0b2tfcihOVUxMLCAiLHw6IiwgJnN0cnRva19zdGF0ZSk7CiAgICB9CiAgICBERUJVR01TRygoInZhY21fcGFyc2VfYXV0aHRva2VucyIsIiAgLi4gcmVzdWx0ID0gMHgleFxuIix2aWV3dHlwZXMpKTsKICAgIHJldHVybiB2aWV3dHlwZXM7Cn0KCnZvaWQKdmFjbV9wYXJzZV9hdXRodXNlcihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY29uZmxpbmUpCnsKICAgIGludCB2aWV3dHlwZXMgPSB2YWNtX3BhcnNlX2F1dGh0b2tlbnModG9rZW4sICZjb25mbGluZSk7CiAgICBpZiAodmlld3R5cGVzICE9IC0xKQogICAgICAgIHZhY21fY3JlYXRlX3NpbXBsZSh0b2tlbiwgY29uZmxpbmUsIFZBQ01fQ1JFQVRFX1NJTVBMRV9WMywgdmlld3R5cGVzKTsKfQoKdm9pZAp2YWNtX3BhcnNlX2F1dGhjb21tdW5pdHkoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmNvbmZsaW5lKQp7CiAgICBpbnQgdmlld3R5cGVzID0gdmFjbV9wYXJzZV9hdXRodG9rZW5zKHRva2VuLCAmY29uZmxpbmUpOwogICAgaWYgKHZpZXd0eXBlcyAhPSAtMSkKICAgICAgICB2YWNtX2NyZWF0ZV9zaW1wbGUodG9rZW4sIGNvbmZsaW5lLCBWQUNNX0NSRUFURV9TSU1QTEVfQ09NLCB2aWV3dHlwZXMpOwp9Cgp2b2lkCnZhY21fcGFyc2VfYXV0aGFjY2Vzcyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY29uZmxpbmUpCnsKICAgIGNoYXIgKmdyb3VwLCAqdmlldywgKnRtcDsKICAgIGNvbnN0IGNoYXIgKmNvbnRleHQ7CiAgICBpbnQgIG1vZGVsID0gU05NUF9TRUNfTU9ERUxfQU5ZOwogICAgaW50ICBsZXZlbCwgcHJlZml4OwogICAgaW50ICBpOwogICAgY2hhciAgICpzdDsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcDsKICAgIGludCAgdmlld3R5cGVzID0gdmFjbV9wYXJzZV9hdXRodG9rZW5zKHRva2VuLCAmY29uZmxpbmUpOwoKICAgIGlmICh2aWV3dHlwZXMgPT0gLTEpCiAgICAgICAgcmV0dXJuOwoKICAgIGdyb3VwID0gc3RydG9rX3IoY29uZmxpbmUsICIgXHRcbiIsICZzdCk7CiAgICBpZiAoIWdyb3VwKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyBHUk9VUCBwYXJhbWV0ZXIiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB2aWV3ID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICghdmlldykgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgVklFVyBwYXJhbWV0ZXIiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLyoKICAgICAqIENoZWNrIGZvciBzZWN1cml0eSBtb2RlbCBvcHRpb24KICAgICAqLwogICAgaWYgKCBzdHJjYXNlY21wKHZpZXcsICItcyIpID09IDAgKSB7CiAgICAgICAgdG1wID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgJnN0KTsKICAgICAgICBpZiAodG1wKSB7CiAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKHRtcCwgImFueSIpID09IDApCiAgICAgICAgICAgICAgICBtb2RlbCA9IFNOTVBfU0VDX01PREVMX0FOWTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh0bXAsICJ2MSIpID09IDApCiAgICAgICAgICAgICAgICBtb2RlbCA9IFNOTVBfU0VDX01PREVMX1NOTVB2MTsKICAgICAgICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh0bXAsICJ2MmMiKSA9PSAwKQogICAgICAgICAgICAgICAgbW9kZWwgPSBTTk1QX1NFQ19NT0RFTF9TTk1QdjJjOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG1vZGVsID0gc2VfZmluZF92YWx1ZV9pbl9zbGlzdCgic25tcF9zZWNtb2RzIiwgdG1wKTsKICAgICAgICAgICAgICAgIGlmIChtb2RlbCA9PSBTRV9ETkUpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICgiYmFkIHNlY3VyaXR5IG1vZGVsLCBzaG91bGQgYmU6IHYxLCB2MmMgb3IgdXNtIG9yIGEgcmVnaXN0ZXJlZCBzZWN1cml0eSBwbHVnaW4gbmFtZSIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgU0VDTU9ERUwgcGFyYW1ldGVyIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmlldyA9IHN0cnRva19yKE5VTEwsICIgXHRcbiIsICZzdCk7CiAgICAgICAgaWYgKCF2aWV3KSB7CiAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgVklFVyBwYXJhbWV0ZXIiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChzdHJsZW4odmlldykgPj0gVkFDTVNUUklOR0xFTiApIHsKICAgICAgICBjb25maWdfcGVycm9yKCJWaWV3IHZhbHVlIHRvbyBsb25nIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qCiAgICAgKiBOb3cgcGFyc2Ugb3B0aW9uYWwgZmllbGRzLCBvciBwcm92aWRlIGRlZmF1bHQgdmFsdWVzCiAgICAgKi8KICAgIAogICAgdG1wID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICh0bXApIHsKICAgICAgICBpZiAoc3RyY2FzZWNtcCh0bXAsICJub2F1dGgiKSA9PSAwKQogICAgICAgICAgICBsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX05PQVVUSDsKICAgICAgICBlbHNlIGlmIChzdHJjYXNlY21wKHRtcCwgIm5vYXV0aG5vcHJpdiIpID09IDApCiAgICAgICAgICAgIGxldmVsID0gU05NUF9TRUNfTEVWRUxfTk9BVVRIOwogICAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodG1wLCAiYXV0aCIpID09IDApCiAgICAgICAgICAgIGxldmVsID0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVjsKICAgICAgICBlbHNlIGlmIChzdHJjYXNlY21wKHRtcCwgImF1dGhub3ByaXYiKSA9PSAwKQogICAgICAgICAgICBsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX0FVVEhOT1BSSVY7CiAgICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh0bXAsICJwcml2IikgPT0gMCkKICAgICAgICAgICAgbGV2ZWwgPSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVjsKICAgICAgICBlbHNlIGlmIChzdHJjYXNlY21wKHRtcCwgImF1dGhwcml2IikgPT0gMCkKICAgICAgICAgICAgbGV2ZWwgPSBTTk1QX1NFQ19MRVZFTF9BVVRIUFJJVjsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAgICAgKCJiYWQgc2VjdXJpdHkgbGV2ZWwgKG5vYXV0aG5vcHJpdiwgYXV0aG5vcHJpdiwgYXV0aHByaXYpIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiAgV2hhdCBhYm91dCAgU05NUF9TRUNfTU9ERUxfQU5ZID8/ICovCiAgICAgICAgaWYgKCBtb2RlbCA9PSBTTk1QX1NFQ19NT0RFTF9TTk1QdjEgfHwKICAgICAgICAgICAgIG1vZGVsID09IFNOTVBfU0VDX01PREVMX1NOTVB2MmMgKQogICAgICAgICAgICBsZXZlbCA9IFNOTVBfU0VDX0xFVkVMX05PQVVUSDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxldmVsID0gU05NUF9TRUNfTEVWRUxfQVVUSE5PUFJJVjsKICAgIH0KICAgIAoKICAgIGNvbnRleHQgPSB0bXAgPSBzdHJ0b2tfcihOVUxMLCAiIFx0XG4iLCAmc3QpOwogICAgaWYgKHRtcCkgewogICAgICAgIHRtcCA9ICh0bXAgKyBzdHJsZW4odG1wKS0xKTsKICAgICAgICBpZiAodG1wICYmICp0bXAgPT0gJyonKSB7CiAgICAgICAgICAgICp0bXAgPSAnXDAnOwogICAgICAgICAgICBwcmVmaXggPSAyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZWZpeCA9IDE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBjb250ZXh0ID0gIiI7CiAgICAgICAgcHJlZml4ICA9IDE7ICAgLyogT3IgcHJlZml4KDIpID8/ICovCiAgICB9CgogICAgLyoKICAgICAqIE5vdyB3ZSBjYW4gY3JlYXRlIHRoZSBhY2Nlc3MgZW50cnkKICAgICAqLwogICAgYXAgPSB2YWNtX2dldEFjY2Vzc0VudHJ5KGdyb3VwLCBjb250ZXh0LCBtb2RlbCwgbGV2ZWwpOwogICAgaWYgKCFhcCkgewogICAgICAgIGFwID0gdmFjbV9jcmVhdGVBY2Nlc3NFbnRyeShncm91cCwgY29udGV4dCwgbW9kZWwsIGxldmVsKTsKICAgICAgICBERUJVR01TR1RMKCgidmFjbTpjb25mOmF1dGhhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICJubyBleGlzdGluZyBhY2Nlc3MgZm91bmQ7IGNyZWF0aW5nIGEgbmV3IG9uZVxuIikpOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgidmFjbTpjb25mOmF1dGhhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICJleGlzdGluZyBhY2Nlc3MgZm91bmQsIHVzaW5nIGl0XG4iKSk7CiAgICB9CiAgICBpZiAoIWFwKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBhY2Nlc3MgZW50cnkiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8PSBWQUNNX01BWF9WSUVXUzsgaSsrKSB7CiAgICAgICAgaWYgKHZpZXd0eXBlcyAmICgxIDw8IGkpKSB7CiAgICAgICAgICAgIHN0cmNweShhcC0+dmlld3NbaV0sIHZpZXcpOwogICAgICAgIH0KICAgIH0KICAgIGFwLT5jb250ZXh0TWF0Y2ggPSBwcmVmaXg7CiAgICBhcC0+c3RvcmFnZVR5cGUgID0gU05NUF9TVE9SQUdFX1BFUk1BTkVOVDsKICAgIGFwLT5zdGF0dXMgICAgICAgPSBTTk1QX1JPV19BQ1RJVkU7CiAgICBpZiAoYXAtPnJlc2VydmVkKQogICAgICAgIGZyZWUoYXAtPnJlc2VydmVkKTsKICAgIGFwLT5yZXNlcnZlZCA9IE5VTEw7Cn0KIAp2b2lkCnZhY21fcGFyc2Vfc2V0YWNjZXNzKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpwYXJhbSkKewogICAgY2hhciAqbmFtZSwgKmNvbnRleHQsICp2aWV3bmFtZSwgKnZpZXd2YWw7CiAgICBpbnQgIGltb2RlbCwgaWxldmVsLCBpcHJlZml4OwogICAgaW50ICB2aWV3bnVtOwogICAgY2hhciAgICpzdDsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcDsKIAogICAgaWYgKF92YWNtX3BhcnNlX2FjY2Vzc19jb21tb24odG9rZW4sIHBhcmFtLCAmc3QsICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsICZpbW9kZWwsICZpbGV2ZWwsICZpcHJlZml4KQogICAgICAgID09IFBBUlNFX0ZBSUwpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdmlld25hbWUgPSBzdHJ0b2tfcihOVUxMLCAiIFx0XG4iLCAmc3QpOwogICAgaWYgKCF2aWV3bmFtZSkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3Npbmcgdmlld25hbWUgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdmlld3ZhbCA9IHN0cnRva19yKE5VTEwsICIgXHRcbiIsICZzdCk7CiAgICBpZiAoIXZpZXd2YWwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIHZpZXd2YWwgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChzdHJsZW4odmlld3ZhbCkgKyAxID4gc2l6ZW9mKGFwLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXSkpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJWaWV3IHZhbHVlIHRvbyBsb25nIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZpZXdudW0gPSBzZV9maW5kX3ZhbHVlX2luX3NsaXN0KFZBQ01fVklFV19FTlVNX05BTUUsIHZpZXduYW1lKTsKICAgIGlmICh2aWV3bnVtIDwgMCB8fCB2aWV3bnVtID49IFZBQ01fTUFYX1ZJRVdTKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiSWxsZWdhbCB2aWV3IG5hbWUiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAgICAgCiAgICBhcCA9IHZhY21fZ2V0QWNjZXNzRW50cnkobmFtZSwgY29udGV4dCwgaW1vZGVsLCBpbGV2ZWwpOwogICAgaWYgKCFhcCkgewogICAgICAgIGFwID0gdmFjbV9jcmVhdGVBY2Nlc3NFbnRyeShuYW1lLCBjb250ZXh0LCBpbW9kZWwsIGlsZXZlbCk7CiAgICAgICAgREVCVUdNU0dUTCgoInZhY206Y29uZjpzZXRhY2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICJubyBleGlzdGluZyBhY2Nlc3MgZm91bmQ7IGNyZWF0aW5nIGEgbmV3IG9uZVxuIikpOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgidmFjbTpjb25mOnNldGFjY2VzcyIsCiAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGFjY2VzcyBmb3VuZCwgdXNpbmcgaXRcbiIpKTsKICAgIH0KICAgIGlmICghYXApIHsKICAgICAgICBjb25maWdfcGVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIGFjY2VzcyBlbnRyeSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBzdHJjcHkoYXAtPnZpZXdzW3ZpZXdudW1dLCB2aWV3dmFsKTsKICAgIGFwLT5jb250ZXh0TWF0Y2ggPSBpcHJlZml4OwogICAgYXAtPnN0b3JhZ2VUeXBlID0gU05NUF9TVE9SQUdFX1BFUk1BTkVOVDsKICAgIGFwLT5zdGF0dXMgPSBTTk1QX1JPV19BQ1RJVkU7CiAgICBmcmVlKGFwLT5yZXNlcnZlZCk7CiAgICBhcC0+cmVzZXJ2ZWQgPSBOVUxMOwp9Cgp2b2lkCnZhY21fcGFyc2VfYWNjZXNzKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpwYXJhbSkKewogICAgY2hhciAgICAgICAgICAgKm5hbWUsICpjb250ZXh0LCAqcmVhZFZpZXcsICp3cml0ZVZpZXcsICpub3RpZnk7CiAgICBpbnQgICAgICAgICAgICAgaW1vZGVsLCBpbGV2ZWwsIGlwcmVmaXg7CiAgICBzdHJ1Y3QgdmFjbV9hY2Nlc3NFbnRyeSAqYXA7CiAgICBjaGFyICAgKnN0OwoKIAogICAgaWYgKF92YWNtX3BhcnNlX2FjY2Vzc19jb21tb24odG9rZW4sIHBhcmFtLCAmc3QsICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsICZpbW9kZWwsICZpbGV2ZWwsICZpcHJlZml4KQogICAgICAgID09IFBBUlNFX0ZBSUwpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmVhZFZpZXcgPSBzdHJ0b2tfcihOVUxMLCAiIFx0XG4iLCAmc3QpOwogICAgaWYgKCFyZWFkVmlldykgewogICAgICAgIGNvbmZpZ19wZXJyb3IoIm1pc3NpbmcgcmVhZFZpZXcgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgd3JpdGVWaWV3ID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICghd3JpdGVWaWV3KSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyB3cml0ZVZpZXcgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbm90aWZ5ID0gc3RydG9rX3IoTlVMTCwgIiBcdFxuIiwgJnN0KTsKICAgIGlmICghbm90aWZ5KSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWlzc2luZyBub3RpZnlWaWV3IHBhcmFtZXRlciIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoc3RybGVuKHJlYWRWaWV3KSArIDEgPiBzaXplb2YoYXAtPnZpZXdzW1ZBQ01fVklFV19SRUFEXSkpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJyZWFkVmlldyB0b28gbG9uZyIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChzdHJsZW4od3JpdGVWaWV3KSArIDEgPiBzaXplb2YoYXAtPnZpZXdzW1ZBQ01fVklFV19XUklURV0pKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigid3JpdGVWaWV3IHRvbyBsb25nIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKHN0cmxlbihub3RpZnkpICsgMSA+IHNpemVvZihhcC0+dmlld3NbVkFDTV9WSUVXX05PVElGWV0pKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibm90aWZ5VmlldyB0b28gbG9uZyIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGFwID0gdmFjbV9jcmVhdGVBY2Nlc3NFbnRyeShuYW1lLCBjb250ZXh0LCBpbW9kZWwsIGlsZXZlbCk7CiAgICBpZiAoIWFwKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBhY2Nlc3MgZW50cnkiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBzdHJjcHkoYXAtPnZpZXdzW1ZBQ01fVklFV19SRUFEXSwgcmVhZFZpZXcpOwogICAgc3RyY3B5KGFwLT52aWV3c1tWQUNNX1ZJRVdfV1JJVEVdLCB3cml0ZVZpZXcpOwogICAgc3RyY3B5KGFwLT52aWV3c1tWQUNNX1ZJRVdfTk9USUZZXSwgbm90aWZ5KTsKICAgIGFwLT5jb250ZXh0TWF0Y2ggPSBpcHJlZml4OwogICAgYXAtPnN0b3JhZ2VUeXBlID0gU05NUF9TVE9SQUdFX1BFUk1BTkVOVDsKICAgIGFwLT5zdGF0dXMgPSBTTk1QX1JPV19BQ1RJVkU7CiAgICBmcmVlKGFwLT5yZXNlcnZlZCk7CiAgICBhcC0+cmVzZXJ2ZWQgPSBOVUxMOwp9Cgp2b2lkCnZhY21fZnJlZV9hY2Nlc3Modm9pZCkKewogICAgdmFjbV9kZXN0cm95QWxsQWNjZXNzRW50cmllcygpOwp9Cgp2b2lkCnZhY21fcGFyc2Vfdmlldyhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqcGFyYW0pCnsKICAgIGNoYXIgICAgICAgICAgICpuYW1lLCAqdHlwZSwgKnN1YnRyZWUsICptYXNrOwogICAgaW50ICAgICAgICAgICAgIGluY2xleGNsOwogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cDsKICAgIG9pZCAgICAgICAgICAgICBzdWJvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIHN1Ym9pZF9sZW4gPSAwOwogICAgc2l6ZV90ICAgICAgICAgIG1hc2tfbGVuID0gMDsKICAgIHVfY2hhciAgICAgICAgICB2aWV3TWFza1tWQUNNU1RSSU5HTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBpOwogICAgY2hhciAgICAgICAgICAgICpzdDsKCiAgICBuYW1lID0gc3RydG9rX3IocGFyYW0sICIgXHRcbiIsICZzdCk7CiAgICBpZiAoIW5hbWUpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIE5BTUUgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdHlwZSA9IHN0cnRva19yKE5VTEwsICIgXG5cdCIsICZzdCk7CiAgICBpZiAoIXR5cGUpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIFRZUEUgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgc3VidHJlZSA9IHN0cnRva19yKE5VTEwsICIgXHRcbiIsICZzdCk7CiAgICBpZiAoIXN1YnRyZWUpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtaXNzaW5nIFNVQlRSRUUgcGFyYW1ldGVyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbWFzayA9IHN0cnRva19yKE5VTEwsICJcMCIsICZzdCk7CgogICAgaWYgKHN0cmNtcCh0eXBlLCAiaW5jbHVkZWQiKSA9PSAwKQogICAgICAgIGluY2xleGNsID0gU05NUF9WSUVXX0lOQ0xVREVEOwogICAgZWxzZSBpZiAoc3RyY21wKHR5cGUsICJleGNsdWRlZCIpID09IDApCiAgICAgICAgaW5jbGV4Y2wgPSBTTk1QX1ZJRVdfRVhDTFVERUQ7CiAgICBlbHNlIHsKICAgICAgICBjb25maWdfcGVycm9yKCJUWVBFIG11c3QgYmUgaW5jbHVkZWQvZXhjbHVkZWQ/Iik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgc3Vib2lkX2xlbiA9IHN0cmxlbihzdWJ0cmVlKS0xOwogICAgaWYgKHN1YnRyZWVbc3Vib2lkX2xlbl0gPT0gJy4nKQogICAgICAgIHN1YnRyZWVbc3Vib2lkX2xlbl0gPSAnXDAnOyAgIC8qIHN0YW1wIG9uIGEgdHJhaWxpbmcgLiAqLwogICAgc3Vib2lkX2xlbiA9IE1BWF9PSURfTEVOOwogICAgaWYgKCFzbm1wX3BhcnNlX29pZChzdWJ0cmVlLCBzdWJvaWQsICZzdWJvaWRfbGVuKSkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImJhZCBTVUJUUkVFIG9iamVjdCBpZCIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChtYXNrKSB7CiAgICAgICAgdW5zaWduZWQgaW50IHZhbDsKICAgICAgICBpID0gMDsKICAgICAgICBmb3IgKG1hc2sgPSBzdHJ0b2tfcihtYXNrLCAiIC46IiwgJnN0KTsgbWFzazsgbWFzayA9IHN0cnRva19yKE5VTEwsICIgLjoiLCAmc3QpKSB7CiAgICAgICAgICAgIGlmIChpID49IHNpemVvZih2aWV3TWFzaykpIHsKICAgICAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoIk1BU0sgdG9vIGxvbmciKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3NjYW5mKG1hc2ssICIleCIsICZ2YWwpID09IDApIHsKICAgICAgICAgICAgICAgIGNvbmZpZ19wZXJyb3IoImludmFsaWQgTUFTSyIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpZXdNYXNrW2ldID0gdmFsOwogICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgICAgIG1hc2tfbGVuID0gaTsKICAgIH0gZWxzZSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih2aWV3TWFzayk7IGkrKykKICAgICAgICAgICAgdmlld01hc2tbaV0gPSAweGZmOwogICAgfQogICAgdnAgPSB2YWNtX2NyZWF0ZVZpZXdFbnRyeShuYW1lLCBzdWJvaWQsIHN1Ym9pZF9sZW4pOwogICAgaWYgKCF2cCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgdmlldyBlbnRyeSIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIG1lbWNweSh2cC0+dmlld01hc2ssIHZpZXdNYXNrLCBzaXplb2Yodmlld01hc2spKTsKICAgIHZwLT52aWV3TWFza0xlbiA9IG1hc2tfbGVuOwogICAgdnAtPnZpZXdUeXBlID0gaW5jbGV4Y2w7CiAgICB2cC0+dmlld1N0b3JhZ2VUeXBlID0gU05NUF9TVE9SQUdFX1BFUk1BTkVOVDsKICAgIHZwLT52aWV3U3RhdHVzID0gU05NUF9ST1dfQUNUSVZFOwogICAgZnJlZSh2cC0+cmVzZXJ2ZWQpOwogICAgdnAtPnJlc2VydmVkID0gTlVMTDsKfQoKdm9pZAp2YWNtX2ZyZWVfdmlldyh2b2lkKQp7CiAgICB2YWNtX2Rlc3Ryb3lBbGxWaWV3RW50cmllcygpOwp9Cgp2b2lkCnZhY21fZ2VuX2NvbTJzZWMoaW50IGNvbW1jb3VudCwgY29uc3QgY2hhciAqY29tbXVuaXR5LCBjb25zdCBjaGFyICphZGRyZXNzbmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwdWJsaXNodG9rZW4sCiAgICAgICAgICAgICAgICAgdm9pZCAoKnBhcnNlcikoY29uc3QgY2hhciAqLCBjaGFyICopLAogICAgICAgICAgICAgICAgIGNoYXIgKnNlY25hbWUsIHNpemVfdCBzZWNuYW1lX2xlbiwKICAgICAgICAgICAgICAgICBjaGFyICp2aWV3bmFtZSwgc2l6ZV90IHZpZXduYW1lX2xlbiwgaW50IHZlcnNpb24sCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCkKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbU1BSSU5UX01BWF9MRU5dOwoKICAgIC8qCiAgICAgKiBjb20yc2VjNnxjb21zZWMgWy1DbiBDT05URVhUXSBhbm9ueW1vdXNTZWNOYW1lTlVNICAgIEFERFJFU1MgIENPTU1VTklUWSAKICAgICAqLwogICAgc25wcmludGYoc2VjbmFtZSwgc2VjbmFtZV9sZW4tMSwgImNvbW0lZCIsIGNvbW1jb3VudCk7CiAgICBzZWNuYW1lW3NlY25hbWVfbGVuLTFdID0gJ1wwJzsKICAgIGlmICh2aWV3bmFtZSkgewogICAgICAgIHNucHJpbnRmKHZpZXduYW1lLCB2aWV3bmFtZV9sZW4tMSwgInZpZXdDb21tJWQiLCBjb21tY291bnQpOwogICAgICAgIHZpZXduYW1lW3ZpZXduYW1lX2xlbi0xXSA9ICdcMCc7CiAgICB9CiAgICBpZiAoIGNvbnRleHQgJiYgKmNvbnRleHQgKQogICAgICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLCAiLUNuICVzICVzICVzICclcyciLAogICAgICAgICAgICAgY29udGV4dCwgc2VjbmFtZSwgYWRkcmVzc25hbWUsIGNvbW11bml0eSk7CiAgICBlbHNlCiAgICAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksICIlcyAlcyAnJXMnIiwKICAgICAgICAgICAgIHNlY25hbWUsIGFkZHJlc3NuYW1lLCBjb21tdW5pdHkpOwogICAgbGluZVsgc2l6ZW9mKGxpbmUpLTEgXSA9IDA7CiAgICBERUJVR01TR1RMKChwdWJsaXNodG9rZW4sICJwYXNzaW5nOiAlcyAlc1xuIiwgcHVibGlzaHRva2VuLCBsaW5lKSk7CiAgICAoKnBhcnNlcikocHVibGlzaHRva2VuLCBsaW5lKTsKCiAgICAvKgogICAgICogc2VjLT5ncm91cCBtYXBwaW5nIAogICAgICovCiAgICAvKgogICAgICogZ3JvdXAgICBhbm9ueW1vdXNHcm91cE5hbWVOVU0gIGFueSAgICAgIGFub255bW91c1NlY05hbWVOVU0gCiAgICAgKi8KICAgIGlmICggdmVyc2lvbiAmIFNOTVBfU0VDX01PREVMX1NOTVB2MSApIHsKICAgICAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksCiAgICAgICAgICAgICAiZ3JwJS4yOHMgdjEgJXMiLCBzZWNuYW1lLCBzZWNuYW1lKTsKICAgICAgICBsaW5lWyBzaXplb2YobGluZSktMSBdID0gMDsKICAgICAgICBERUJVR01TR1RMKChwdWJsaXNodG9rZW4sICJwYXNzaW5nOiAlcyAlc1xuIiwgImdyb3VwIiwgbGluZSkpOwogICAgICAgIHZhY21fcGFyc2VfZ3JvdXAoImdyb3VwIiwgbGluZSk7CiAgICB9CgogICAgaWYgKCB2ZXJzaW9uICYgU05NUF9TRUNfTU9ERUxfU05NUHYyYyApIHsKICAgICAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksCiAgICAgICAgICAgICAiZ3JwJS4yOHMgdjJjICVzIiwgc2VjbmFtZSwgc2VjbmFtZSk7CiAgICAgICAgbGluZVsgc2l6ZW9mKGxpbmUpLTEgXSA9IDA7CiAgICAgICAgREVCVUdNU0dUTCgocHVibGlzaHRva2VuLCAicGFzc2luZzogJXMgJXNcbiIsICJncm91cCIsIGxpbmUpKTsKICAgICAgICB2YWNtX3BhcnNlX2dyb3VwKCJncm91cCIsIGxpbmUpOwogICAgfQp9Cgp2b2lkCnZhY21fcGFyc2Vfcnd1c2VyKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpjb25mbGluZSkKewogICAgdmFjbV9jcmVhdGVfc2ltcGxlKHRva2VuLCBjb25mbGluZSwgVkFDTV9DUkVBVEVfU0lNUExFX1YzLAogICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19SRUFEX0JJVCB8IFZBQ01fVklFV19XUklURV9CSVQpOwp9Cgp2b2lkCnZhY21fcGFyc2Vfcm91c2VyKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpjb25mbGluZSkKewogICAgdmFjbV9jcmVhdGVfc2ltcGxlKHRva2VuLCBjb25mbGluZSwgVkFDTV9DUkVBVEVfU0lNUExFX1YzLAogICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19SRUFEX0JJVCk7Cn0KCnZvaWQKdmFjbV9wYXJzZV9yb2NvbW11bml0eShjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY29uZmxpbmUpCnsKICAgIHZhY21fY3JlYXRlX3NpbXBsZSh0b2tlbiwgY29uZmxpbmUsIFZBQ01fQ1JFQVRFX1NJTVBMRV9DT01JUFY0LAogICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19SRUFEX0JJVCk7Cn0KCnZvaWQKdmFjbV9wYXJzZV9yd2NvbW11bml0eShjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY29uZmxpbmUpCnsKICAgIHZhY21fY3JlYXRlX3NpbXBsZSh0b2tlbiwgY29uZmxpbmUsIFZBQ01fQ1JFQVRFX1NJTVBMRV9DT01JUFY0LAogICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19SRUFEX0JJVCB8IFZBQ01fVklFV19XUklURV9CSVQpOwp9Cgp2b2lkCnZhY21fcGFyc2Vfcm9jb21tdW5pdHk2KGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpjb25mbGluZSkKewogICAgdmFjbV9jcmVhdGVfc2ltcGxlKHRva2VuLCBjb25mbGluZSwgVkFDTV9DUkVBVEVfU0lNUExFX0NPTUlQVjYsCiAgICAgICAgICAgICAgICAgICAgICAgVkFDTV9WSUVXX1JFQURfQklUKTsKfQoKdm9pZAp2YWNtX3BhcnNlX3J3Y29tbXVuaXR5Nihjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqY29uZmxpbmUpCnsKICAgIHZhY21fY3JlYXRlX3NpbXBsZSh0b2tlbiwgY29uZmxpbmUsIFZBQ01fQ1JFQVRFX1NJTVBMRV9DT01JUFY2LAogICAgICAgICAgICAgICAgICAgICAgIFZBQ01fVklFV19SRUFEX0JJVCB8IFZBQ01fVklFV19XUklURV9CSVQpOwp9CgoKdm9pZAp2YWNtX2NyZWF0ZV9zaW1wbGUoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmNvbmZsaW5lLAogICAgICAgICAgICAgICAgICAgaW50IHBhcnNldHlwZSwgaW50IHZpZXd0eXBlcykKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbU1BSSU5UX01BWF9MRU5dOwogICAgY2hhciAgICAgICAgICAgIGNvbW11bml0eVtDT01NVU5JVFlfTUFYX0xFTl07CiAgICBjaGFyICAgICAgICAgICAgdGhlb2lkW1NQUklOVF9NQVhfTEVOXTsKICAgIGNoYXIgICAgICAgICAgICB2aWV3bmFtZVtTUFJJTlRfTUFYX0xFTl07CiAgICBjaGFyICAgICAgICAgICAqdmlld19wdHIgPSB2aWV3bmFtZTsKI2lmICFkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjEpIHx8ICFkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDKQogICAgY2hhciAgICAgICAgICAgIGFkZHJlc3NuYW1lW1NQUklOVF9NQVhfTEVOXTsKI2VuZGlmCiAgICBjb25zdCBjaGFyICAgICAqcncgPSAibm9uZSI7CiAgICBjaGFyICAgICAgICAgICAgbW9kZWxbU1BSSU5UX01BWF9MRU5dOwogICAgY2hhciAgICAgICAgICAgKmNwLCAqdG1wOwogICAgY2hhciAgICAgICAgICAgIHNlY25hbWVbU1BSSU5UX01BWF9MRU5dOwogICAgY2hhciAgICAgICAgICAgIGdycG5hbWVbU1BSSU5UX01BWF9MRU5dOwogICAgY2hhciAgICAgICAgICAgIGF1dGhsZXZlbFtTUFJJTlRfTUFYX0xFTl07CiAgICBjaGFyICAgICAgICAgICAgY29udGV4dFtTUFJJTlRfTUFYX0xFTl07CiAgICBpbnQgICAgICAgICAgICAgY3R4cHJlZml4ID0gMTsgIC8qIERlZmF1bHQgdG8gbWF0Y2hpbmcgYWxsIGNvbnRleHRzICovCiAgICBzdGF0aWMgaW50ICAgICAgY29tbWNvdW50ID0gMDsKICAgIC8qIENvbnZlbmllbnRseSwgdGhlIGNvbW11bml0eS1iYXNlZCBzZWN1cml0eQogICAgICAgbW9kZWwgdmFsdWVzIGNhbiBhbHNvIGJlIHVzZWQgYXMgYml0IGZsYWdzICovCiAgICBpbnQgICAgICAgICAgICAgY29tbXZlcnNpb24gPSBTTk1QX1NFQ19NT0RFTF9TTk1QdjEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9TRUNfTU9ERUxfU05NUHYyYzsKCiAgICAvKgogICAgICogaW5pdCAKICAgICAqLwogICAgc3RyY3B5KG1vZGVsLCAiYW55Iik7CiAgICBtZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mKGNvbnRleHQpKTsKICAgIG1lbXNldChzZWNuYW1lLCAwLCBzaXplb2Yoc2VjbmFtZSkpOwogICAgbWVtc2V0KGdycG5hbWUsIDAsIHNpemVvZihncnBuYW1lKSk7CgogICAgLyoKICAgICAqIGNvbW11bml0eSBuYW1lIG9yIHVzZXIgbmFtZSAKICAgICAqLwogICAgY3AgPSBjb3B5X253b3JkKGNvbmZsaW5lLCBjb21tdW5pdHksIHNpemVvZihjb21tdW5pdHkpKTsKCiAgICBpZiAocGFyc2V0eXBlID09IFZBQ01fQ1JFQVRFX1NJTVBMRV9WMykgewogICAgICAgIC8qCiAgICAgICAgICogbWF5YmUgc2VjdXJpdHkgbW9kZWwgdHlwZSAKICAgICAgICAgKi8KICAgICAgICBpZiAoc3RyY21wKGNvbW11bml0eSwgIi1zIikgPT0gMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAtcyBtb2RlbCAuLi4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgICAgICBjcCA9IGNvcHlfbndvcmQoY3AsIG1vZGVsLCBzaXplb2YobW9kZWwpKTsKICAgICAgICAgICAgaWYgKCFjcCkgewogICAgICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiaWxsZWdhbCBsaW5lIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAgICAgY3AgPSBjb3B5X253b3JkKGNwLCBjb21tdW5pdHksIHNpemVvZihjb21tdW5pdHkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJjcHkobW9kZWwsICJ1c20iKTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBhdXRoZW50aWNhdGlvbiBsZXZlbCAKICAgICAgICAgKi8KICAgICAgICBpZiAoY3AgJiYgKmNwKQogICAgICAgICAgICBjcCA9IGNvcHlfbndvcmQoY3AsIGF1dGhsZXZlbCwgc2l6ZW9mKGF1dGhsZXZlbCkpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RyY3B5KGF1dGhsZXZlbCwgImF1dGgiKTsKICAgICAgICBERUJVR01TR1RMKCh0b2tlbiwgInNldHRpbmcgYXV0aCBsZXZlbDogXCIlc1wiXG4iLCBhdXRobGV2ZWwpKTsKI2lmICFkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjEpIHx8ICFkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDKQogICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3RyY21wKGNvbW11bml0eSwgIi12IikgPT0gMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAtdiB2ZXJzaW9uIC4uLiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChjcCkKICAgICAgICAgICAgICAgIGNwID0gY29weV9ud29yZChjcCwgbW9kZWwsIHNpemVvZihtb2RlbCkpOwogICAgICAgICAgICBpZiAoIWNwKSB7CiAgICAgICAgICAgICAgICBjb25maWdfcGVycm9yKCJpbGxlZ2FsIGxpbmUiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIHN0cmNhc2VjbXAoIG1vZGVsLCAgIjEiICkgPT0gMCApCiAgICAgICAgICAgICAgICBzdHJjcHkobW9kZWwsICJ2MSIpOwogICAgICAgICAgICBpZiAoIHN0cmNhc2VjbXAoIG1vZGVsLCAidjEiICkgPT0gMCApCiAgICAgICAgICAgICAgICBjb21tdmVyc2lvbiA9IFNOTVBfU0VDX01PREVMX1NOTVB2MTsKICAgICAgICAgICAgaWYgKCBzdHJjYXNlY21wKCBtb2RlbCwgICIyYyIgKSA9PSAwICkKICAgICAgICAgICAgICAgIHN0cmNweShtb2RlbCwgInYyYyIpOwogICAgICAgICAgICBpZiAoIHN0cmNhc2VjbXAoIG1vZGVsLCAidjJjIiApID09IDAgKQogICAgICAgICAgICAgICAgY29tbXZlcnNpb24gPSBTTk1QX1NFQ19NT0RFTF9TTk1QdjJjOwogICAgICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgICAgICBjcCA9IGNvcHlfbndvcmQoY3AsIGNvbW11bml0eSwgc2l6ZW9mKGNvbW11bml0eSkpOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIHNvdXJjZSBhZGRyZXNzIAogICAgICAgICAqLwogICAgICAgIGlmIChjcCAmJiAqY3ApIHsKICAgICAgICAgICAgY3AgPSBjb3B5X253b3JkKGNwLCBhZGRyZXNzbmFtZSwgc2l6ZW9mKGFkZHJlc3NuYW1lKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyY3B5KGFkZHJlc3NuYW1lLCAiZGVmYXVsdCIpOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIGF1dGhsZXZlbCBoYXMgdG8gYmUgbm9hdXRoIAogICAgICAgICAqLwogICAgICAgIHN0cmNweShhdXRobGV2ZWwsICJub2F1dGgiKTsKI2VuZGlmIC8qIHN1cHBvcnQgZm9yIGNvbW11bml0eSBiYXNlZCBTTk1QICovCiAgICB9CgogICAgLyoKICAgICAqIG9pZCB0aGV5IGNhbiB0b3VjaCAKICAgICAqLwogICAgaWYgKGNwICYmICpjcCkgewogICAgICAgIGlmIChzdHJuY21wKGNwLCAiLVYgIiwgMykgPT0gMCkgewogICAgICAgICAgICAgY3AgPSBza2lwX3Rva2VuKGNwKTsKICAgICAgICAgICAgIGNwID0gY29weV9ud29yZChjcCwgdmlld25hbWUsIHNpemVvZih2aWV3bmFtZSkpOwogICAgICAgICAgICAgdmlld19wdHIgPSBOVUxMOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjcCA9IGNvcHlfbndvcmQoY3AsIHRoZW9pZCwgc2l6ZW9mKHRoZW9pZCkpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgc3RyY3B5KHRoZW9pZCwgIi4xIik7CiAgICAgICAgc3RyY3B5KHZpZXduYW1lLCAiX2FsbF8iKTsKICAgICAgICB2aWV3X3B0ciA9IE5VTEw7CiAgICB9CiAgICAvKgogICAgICogb3B0aW9uYWwsIG5vbi1kZWZhdWx0IGNvbnRleHQKICAgICAqLwogICAgaWYgKGNwICYmICpjcCkgewogICAgICAgIGNwID0gY29weV9ud29yZChjcCwgY29udGV4dCwgc2l6ZW9mKGNvbnRleHQpKTsKICAgICAgICB0bXAgPSAoY29udGV4dCArIHN0cmxlbihjb250ZXh0KS0xKTsKICAgICAgICBpZiAodG1wICYmICp0bXAgPT0gJyonKSB7CiAgICAgICAgICAgICp0bXAgPSAnXDAnOwogICAgICAgICAgICBjdHhwcmVmaXggPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIG5vIGNvbnRleHQgZmllbGQgaXMgZ2l2ZW4sIHRoZW4gd2UgZGVmYXVsdCB0byBtYXRjaGluZwogICAgICAgICAgICAgKiAgIGFsbCBjb250ZXh0cyAoZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBwcmV2aW91cyByZWxlYXNlcykuCiAgICAgICAgICAgICAqIEJ1dCBpZiBhIGZpZWxkIGNvbnRleHQgaXMgc3BlY2lmaWVkIChub3QgZW5kaW5nIHdpdGggJyonKQogICAgICAgICAgICAgKiAgIHRoZW4gdGhpcyBzaG91bGQgYmUgdGFrZW4gYXMgYW4gZXhhY3QgbWF0Y2guCiAgICAgICAgICAgICAqIFNwZWNpZnlpbmcgYSBjb250ZXh0IGZpZWxkIG9mICIiIHdpbGwgbWF0Y2ggdGhlIGRlZmF1bHQKICAgICAgICAgICAgICogICBjb250ZXh0IChhbmQgKm9ubHkqIHRoZSBkZWZhdWx0IGNvbnRleHQpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3R4cHJlZml4ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHZpZXd0eXBlcyAmIFZBQ01fVklFV19XUklURV9CSVQpCiAgICAgICAgcncgPSB2aWV3bmFtZTsKCiAgICBjb21tY291bnQrKzsKCiNpZiAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYxKSB8fCAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYyQykKI2lmZGVmIE5FVFNOTVBfVFJBTlNQT1JUX1VEUF9ET01BSU4KICAgIGlmIChwYXJzZXR5cGUgPT0gVkFDTV9DUkVBVEVfU0lNUExFX0NPTUlQVjQgfHwKICAgICAgICBwYXJzZXR5cGUgPT0gVkFDTV9DUkVBVEVfU0lNUExFX0NPTSkgewogICAgICAgIHZhY21fZ2VuX2NvbTJzZWMoY29tbWNvdW50LCBjb21tdW5pdHksIGFkZHJlc3NuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgImNvbTJzZWMiLCAmbmV0c25tcF91ZHBfcGFyc2Vfc2VjdXJpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWNuYW1lLCBzaXplb2Yoc2VjbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3X3B0ciwgc2l6ZW9mKHZpZXduYW1lKSwgY29tbXZlcnNpb24sIGNvbnRleHQpOwogICAgfQojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VTklYX0RPTUFJTgogICAgaWYgKHBhcnNldHlwZSA9PSBWQUNNX0NSRUFURV9TSU1QTEVfQ09NVU5JWCB8fAogICAgICAgIHBhcnNldHlwZSA9PSBWQUNNX0NSRUFURV9TSU1QTEVfQ09NKSB7CiAgICAgICAgaWYgKCAqY29udGV4dCApCiAgICAgICAgICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLCAiLUNuICVzICVzICVzICclcyciLAogICAgICAgICAgICAgY29udGV4dCwgc2VjbmFtZSwgYWRkcmVzc25hbWUsIGNvbW11bml0eSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksICIlcyAlcyAnJXMnIiwKICAgICAgICAgICAgICAgICBzZWNuYW1lLCBhZGRyZXNzbmFtZSwgY29tbXVuaXR5KTsKICAgICAgICBsaW5lWyBzaXplb2YobGluZSktMSBdID0gMDsKICAgICAgICBERUJVR01TR1RMKCh0b2tlbiwgInBhc3Npbmc6ICVzICVzXG4iLCAiY29tMnNlY3VuaXgiLCBsaW5lKSk7CiAgICAgICAgbmV0c25tcF91bml4X3BhcnNlX3NlY3VyaXR5KCJjb20yc2VjdW5peCIsIGxpbmUpOwogICAgfQojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VRFBJUFY2X0RPTUFJTgogICAgaWYgKHBhcnNldHlwZSA9PSBWQUNNX0NSRUFURV9TSU1QTEVfQ09NSVBWNiB8fAogICAgICAgIHBhcnNldHlwZSA9PSBWQUNNX0NSRUFURV9TSU1QTEVfQ09NKSB7CiAgICAgICAgdmFjbV9nZW5fY29tMnNlYyhjb21tY291bnQsIGNvbW11bml0eSwgYWRkcmVzc25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiY29tMnNlYzYiLCAmbmV0c25tcF91ZHA2X3BhcnNlX3NlY3VyaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgc2VjbmFtZSwgc2l6ZW9mKHNlY25hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlld19wdHIsIHNpemVvZih2aWV3bmFtZSksIGNvbW12ZXJzaW9uLCBjb250ZXh0KTsKICAgIH0KI2VuZGlmCiNlbmRpZiAvKiBzdXBwb3J0IGZvciBjb21tdW5pdHkgYmFzZWQgU05NUCAqLwoKICAgIGlmIChwYXJzZXR5cGUgPT0gVkFDTV9DUkVBVEVfU0lNUExFX1YzKSB7CiAgICAgICAgLyogc3VwcG9ydCBmb3IgU05NUHYzIHVzZXIgbmFtZXMgKi8KICAgICAgICBpZiAodmlld19wdHIpIHsKICAgICAgICAgICAgc3ByaW50Zih2aWV3bmFtZSwidmlld1VTTSVkIixjb21tY291bnQpOwogICAgICAgIH0KICAgICAgICBpZiAoIHN0cmNtcCggdG9rZW4sICJhdXRoZ3JvdXAiICkgPT0gMCApIHsKICAgICAgICAgICAgc3RybGNweShncnBuYW1lLCBjb21tdW5pdHksIHNpemVvZihncnBuYW1lKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RybGNweShzZWNuYW1lLCBjb21tdW5pdHksIHNpemVvZihzZWNuYW1lKSk7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBzZWMtPmdyb3VwIG1hcHBpbmcgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBncm91cCAgIGFub255bW91c0dyb3VwTmFtZU5VTSAgYW55ICAgICAgYW5vbnltb3VzU2VjTmFtZU5VTSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNucHJpbnRmKGdycG5hbWUsIHNpemVvZihncnBuYW1lKSwgImdycCUuMjhzIiwgc2VjbmFtZSk7CiAgICAgICAgICAgIGZvciAodG1wPWdycG5hbWU7ICp0bXA7IHRtcCsrKQogICAgICAgICAgICAgICAgaWYgKCFpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKSgqdG1wKSkpCiAgICAgICAgICAgICAgICAgICAgKnRtcCA9ICdfJzsKICAgICAgICAgICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAiJXMgJXMgXCIlc1wiIiwgZ3JwbmFtZSwgbW9kZWwsIHNlY25hbWUpOwogICAgICAgICAgICBsaW5lWyBzaXplb2YobGluZSktMSBdID0gMDsKICAgICAgICAgICAgREVCVUdNU0dUTCgodG9rZW4sICJwYXNzaW5nOiAlcyAlc1xuIiwgImdyb3VwIiwgbGluZSkpOwogICAgICAgICAgICB2YWNtX3BhcnNlX2dyb3VwKCJncm91cCIsIGxpbmUpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgc25wcmludGYoZ3JwbmFtZSwgc2l6ZW9mKGdycG5hbWUpLCAiZ3JwJS4yOHMiLCBzZWNuYW1lKTsKICAgICAgICBmb3IgKHRtcD1ncnBuYW1lOyAqdG1wOyB0bXArKykKICAgICAgICAgICAgaWYgKCFpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKSgqdG1wKSkpCiAgICAgICAgICAgICAgICAqdG1wID0gJ18nOwogICAgfQoKICAgIC8qCiAgICAgKiB2aWV3IGRlZmluaXRpb24gCiAgICAgKi8KICAgIC8qCiAgICAgKiB2aWV3ICAgIGFub255bW91c1ZpZXdOVU0gICAgICAgaW5jbHVkZWQgT0lEIAogICAgICovCiAgICBpZiAodmlld19wdHIpIHsKICAgICAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksICIlcyBpbmNsdWRlZCAlcyIsIHZpZXduYW1lLCB0aGVvaWQpOwogICAgICAgIGxpbmVbIHNpemVvZihsaW5lKS0xIF0gPSAwOwogICAgICAgIERFQlVHTVNHVEwoKHRva2VuLCAicGFzc2luZzogJXMgJXNcbiIsICJ2aWV3IiwgbGluZSkpOwogICAgICAgIHZhY21fcGFyc2VfdmlldygidmlldyIsIGxpbmUpOwogICAgfQoKICAgIC8qCiAgICAgKiBtYXAgZXZlcnl0aGluZyB0b2dldGhlciAKICAgICAqLwogICAgaWYgKCh2aWV3dHlwZXMgPT0gVkFDTV9WSUVXX1JFQURfQklUKSB8fAogICAgICAgICh2aWV3dHlwZXMgPT0gKFZBQ01fVklFV19SRUFEX0JJVCB8IFZBQ01fVklFV19XUklURV9CSVQpKSkgewogICAgICAgIC8qIFVzZSB0aGUgc2ltcGxlIGxpbmUgYWNjZXNzIGNvbW1hbmQgKi8KICAgICAgICAvKgogICAgICAgICAqIGFjY2VzcyAgYW5vbnltb3VzR3JvdXBOYW1lTlVNICAiIiBNT0RFTCBBVVRIVFlQRSBwcmVmaXggYW5vbnltb3VzVmlld05VTSBbbm9uZS9hbm9ueW1vdXNWaWV3TlVNXSBbbm9uZS9hbm9ueW1vdXNWaWV3TlVNXSAKICAgICAgICAgKi8KICAgICAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksCiAgICAgICAgICAgICAgICAgIiVzICVzICVzICVzICVzICVzICVzICVzIiwKICAgICAgICAgICAgICAgICBncnBuYW1lLCBjb250ZXh0WzBdID8gY29udGV4dCA6ICJcIlwiIiwKICAgICAgICAgICAgICAgICBtb2RlbCwgYXV0aGxldmVsLAogICAgICAgICAgICAgICAgKGN0eHByZWZpeCA/ICJwcmVmaXgiIDogImV4YWN0IiksCiAgICAgICAgICAgICAgICAgdmlld25hbWUsIHJ3LCBydyk7CiAgICAgICAgbGluZVsgc2l6ZW9mKGxpbmUpLTEgXSA9IDA7CiAgICAgICAgREVCVUdNU0dUTCgodG9rZW4sICJwYXNzaW5nOiAlcyAlc1xuIiwgImFjY2VzcyIsIGxpbmUpKTsKICAgICAgICB2YWNtX3BhcnNlX2FjY2VzcygiYWNjZXNzIiwgbGluZSk7CiAgICB9IGVsc2UgewogICAgICAgIC8qIFVzZSBvbmUgc2V0YWNjZXNzIGxpbmUgcGVyIGFjY2VzcyB0eXBlICovCiAgICAgICAgLyoKICAgICAgICAgKiBzZXRhY2Nlc3MgIGFub255bW91c0dyb3VwTmFtZU5VTSAgIiIgTU9ERUwgQVVUSFRZUEUgcHJlZml4IHZpZXduYW1lIHZpZXd2YWwKICAgICAgICAgKi8KICAgICAgICBpbnQgaTsKICAgICAgICBERUJVR01TR1RMKCh0b2tlbiwgIiBjaGVja2luZyB2aWV3IGxldmVscyBmb3IgJXhcbiIsIHZpZXd0eXBlcykpOwogICAgICAgIGZvcihpID0gMDsgaSA8PSBWQUNNX01BWF9WSUVXUzsgaSsrKSB7CiAgICAgICAgICAgIGlmICh2aWV3dHlwZXMgJiAoMSA8PCBpKSkgewogICAgICAgICAgICAgICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzICVzICVzICVzICVzICVzICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGdycG5hbWUsIGNvbnRleHRbMF0gPyBjb250ZXh0IDogIlwiXCIiLAogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsIGF1dGhsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgKGN0eHByZWZpeCA/ICJwcmVmaXgiIDogImV4YWN0IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzZV9maW5kX2xhYmVsX2luX3NsaXN0KFZBQ01fVklFV19FTlVNX05BTUUsIGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgdmlld25hbWUpOwogICAgICAgICAgICAgICAgbGluZVsgc2l6ZW9mKGxpbmUpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCh0b2tlbiwgInBhc3Npbmc6ICVzICVzXG4iLCAic2V0YWNjZXNzIiwgbGluZSkpOwogICAgICAgICAgICAgICAgdmFjbV9wYXJzZV9zZXRhY2Nlc3MoInNldGFjY2VzcyIsIGxpbmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgppbnQKdmFjbV9zdGFuZGFyZF92aWV3cyhpbnQgbWFqb3JJRCwgaW50IG1pbm9ySUQsIHZvaWQgKnNlcnZlcmFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsaWVudGFyZykKewogICAgY2hhciAgICAgICAgICAgIGxpbmVbU1BSSU5UX01BWF9MRU5dOwoKICAgIG1lbXNldChsaW5lLCAwLCBzaXplb2YobGluZSkpOwoKICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIl9hbGxfIGluY2x1ZGVkIC4wIik7CiAgICB2YWNtX3BhcnNlX3ZpZXcoInZpZXciLCBsaW5lKTsKICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIl9hbGxfIGluY2x1ZGVkIC4xIik7CiAgICB2YWNtX3BhcnNlX3ZpZXcoInZpZXciLCBsaW5lKTsKICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIl9hbGxfIGluY2x1ZGVkIC4yIik7CiAgICB2YWNtX3BhcnNlX3ZpZXcoInZpZXciLCBsaW5lKTsKCiAgICBzbnByaW50ZihsaW5lLCBzaXplb2YobGluZSksICJfbm9uZV8gZXhjbHVkZWQgLjAiKTsKICAgIHZhY21fcGFyc2VfdmlldygidmlldyIsIGxpbmUpOwogICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLCAiX25vbmVfIGV4Y2x1ZGVkIC4xIik7CiAgICB2YWNtX3BhcnNlX3ZpZXcoInZpZXciLCBsaW5lKTsKICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIl9ub25lXyBleGNsdWRlZCAuMiIpOwogICAgdmFjbV9wYXJzZV92aWV3KCJ2aWV3IiwgbGluZSk7CgogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp2YWNtX3dhcm5faWZfbm90X2NvbmZpZ3VyZWQoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbGllbnRhcmcpCnsKICAgIGNvbnN0IGNoYXIgKiBuYW1lID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBUWVBFKTsKICAgIGNvbnN0IGludCBhZ2VudF9tb2RlID0gIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSk7CiAgICBpZiAoTlVMTD09bmFtZSkKICAgICAgICBuYW1lID0gInNubXBkIjsKICAgIAogICAgaWYgKCF2YWNtX2lzX2NvbmZpZ3VyZWQoKSkgewogICAgICAgIC8qCiAgICAgICAgICogIEFuIEFnZW50WCBzdWJhZ2VudCByZWxpZXMgb24gdGhlIG1hc3RlciBhZ2VudCB0byBhcHBseSBzdWl0YWJsZQogICAgICAgICAqICAgIGFjY2VzcyBjb250cm9sIGNoZWNrcywgc28gZG9lc24ndCBuZWVkIGxvY2FsIFZBQ00gY29uZmlndXJhdGlvbi4KICAgICAgICAgKiAgVGhlIHRyYXAgZGFlbW9uIGhhcyBhIHNlcGFyYXRlIGNoZWNrIChzZWUgYmVsb3cpLgogICAgICAgICAqCiAgICAgICAgICogIE90aGVyd2lzZSwgYW4gQWdlbnRYIG1hc3RlciBvciBTTk1QIHN0YW5kYWxvbmUgYWdlbnQgcmVxdWlyZXMgc29tZQogICAgICAgICAqICAgIGZvcm0gb2YgVkFDTSBjb25maWd1cmF0aW9uLiAgTm8gY29uZmlnIG1lYW5zIHRoYXQgbm8gaW5jb21pbmcKICAgICAgICAgKiAgICByZXF1ZXN0cyB3aWxsIGJlIGFjY2VwdGVkLCBzbyB3YXJuIHRoZSB1c2VyIGFjY29yZGluZ2x5LgogICAgICAgICAqLwogICAgICAgIGlmICgoTUFTVEVSX0FHRU5UID09IGFnZW50X21vZGUpICYmIChzdHJjbXAobmFtZSwgInNubXB0cmFwZCIpICE9IDApKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICJXYXJuaW5nOiBubyBhY2Nlc3MgY29udHJvbCBpbmZvcm1hdGlvbiBjb25maWd1cmVkLlxuIgogICAgICAgICAgICAgICAgICIgIChDb25maWcgc2VhcmNoIHBhdGg6ICVzKVxuIgogICAgICAgICAgICAgICAgICIgIEl0J3MgdW5saWtlbHkgdGhpcyBhZ2VudCBjYW4gc2VydmUgYW55IHVzZWZ1bCBwdXJwb3NlIGluIHRoaXMgc3RhdGUuXG4iCiAgICAgICAgICAgICAgICAgIiAgUnVuIFwic25tcGNvbmYgLWcgYmFzaWNfc2V0dXBcIiB0byBoZWxwIHlvdSAiCiAgICAgICAgICAgICAgICAgImNvbmZpZ3VyZSB0aGUgJXMuY29uZiBmaWxlIGZvciB0aGlzIGFnZW50LlxuIiwKICAgICAgICAgICAgICAgICBnZXRfY29uZmlndXJhdGlvbl9kaXJlY3RvcnkoKSwgbmFtZSk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqICBUaGUgdHJhcCBkYWVtb24gaW1wbGVtZW50cyBWQUNNLXN0eWxlIGFjY2VzcyBjb250cm9sIGZvciBpbmNvbWluZwogICAgICAgICAqICAgIG5vdGlmaWNhdGlvbnMsIGJ1dCBvZmZlcnMgYSB3YXkgb2YgdHVybmluZyB0aGlzIG9mZiAoZm9yIGJhY2t3YXJkcwogICAgICAgICAqICAgIGNvbXBhdGFiaWxpdHkpLiAgQ2hlY2sgZm9yIHRoaXMgZXhwbGljaXRseSwgYW5kIHdhcm4gaWYgbmVjZXNzYXJ5LgogICAgICAgICAqCiAgICAgICAgICogIE5COiAgVGhlIE5FVFNOTVBfRFNfQVBQX05PX0FVVEhPUklaQVRJT04gZGVmaW5pdGlvbiBpcyBhIGR1cGxpY2F0ZQogICAgICAgICAqICAgICAgIG9mIGFuIGlkZW50aWNhbCBzZXR0aW5nIGluICJhcHBzL3NubXB0cmFwZF9kcy5oIi4KICAgICAgICAgKiAgICAgICBUaGVzZSB0d28gbmVlZCB0byBiZSBrZXB0IGluIHN5bmNoLgogICAgICAgICAqLwojaWZuZGVmIE5FVFNOTVBfRFNfQVBQX05PX0FVVEhPUklaQVRJT04KI2RlZmluZSBORVRTTk1QX0RTX0FQUF9OT19BVVRIT1JJWkFUSU9OIDE3CiNlbmRpZgogICAgICAgIGlmICghc3RyY21wKG5hbWUsICJzbm1wdHJhcGQiKSAmJgogICAgICAgICAgICAhbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BUFBfTk9fQVVUSE9SSVpBVElPTikpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgIldhcm5pbmc6IG5vIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uIGNvbmZpZ3VyZWQuXG4iCiAgICAgICAgICAgICAgICAgIiAgKENvbmZpZyBzZWFyY2ggcGF0aDogJXMpXG4iCiAgICAgICAgICAgICAgICAgIlRoaXMgcmVjZWl2ZXIgd2lsbCAqTk9UKiBhY2NlcHQgYW55IGluY29taW5nIG5vdGlmaWNhdGlvbnMuXG4iLAogICAgICAgICAgICAgICAgIGdldF9jb25maWd1cmF0aW9uX2RpcmVjdG9yeSgpKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CnZhY21faW5fdmlld19jYWxsYmFjayhpbnQgbWFqb3JJRCwgaW50IG1pbm9ySUQsIHZvaWQgKnNlcnZlcmFyZywKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsaWVudGFyZykKewogICAgc3RydWN0IHZpZXdfcGFyYW1ldGVycyAqdmlld19wYXJtcyA9CiAgICAgICAgKHN0cnVjdCB2aWV3X3BhcmFtZXRlcnMgKikgc2VydmVyYXJnOwogICAgaW50ICAgICAgICAgICAgIHJldHZhbDsKCiAgICBpZiAodmlld19wYXJtcyA9PSBOVUxMKQogICAgICAgIHJldHVybiAxOwogICAgcmV0dmFsID0gdmFjbV9pbl92aWV3KHZpZXdfcGFybXMtPnBkdSwgdmlld19wYXJtcy0+bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3X3Bhcm1zLT5uYW1lbGVuLCB2aWV3X3Bhcm1zLT5jaGVja19zdWJ0cmVlKTsKICAgIGlmIChyZXR2YWwgIT0gMCkKICAgICAgICB2aWV3X3Bhcm1zLT5lcnJvcmNvZGUgPSByZXR2YWw7CiAgICByZXR1cm4gcmV0dmFsOwp9CgoKLyoqCiAqIHZhY21faW5fdmlldzogZGVjaWRlcyBpZiBhIGdpdmVuIFBEVSBjYW4gYmUgYWN0ZWQgdXBvbgogKgogKiBQYXJhbWV0ZXJzOgogKgkqcGR1CiAqCSpuYW1lCiAqCSBuYW1lbGVuCiAqICAgICAgIGNoZWNrX3N1YnRyZWUKICogICAgICAKICogUmV0dXJuczoKICogVkFDTV9TVUNDRVNTKDApCSAgIE9uIHN1Y2Nlc3MuCiAqIFZBQ01fTk9TRUNOQU1FKDEpCSAgIE1pc3Npbmcgc2VjdXJpdHkgbmFtZS4KICogVkFDTV9OT0dST1VQKDIpCSAgIE1pc3NpbmcgZ3JvdXAKICogVkFDTV9OT0FDQ0VTUygzKQkgICBNaXNzaW5nIGFjY2VzcwogKiBWQUNNX05PVklFVyg0KQkgICBNaXNzaW5nIHZpZXcKICogVkFDTV9OT1RJTlZJRVcoNSkJICAgTm90IGluIHZpZXcKICogVkFDTV9OT1NVQ0hDT05URVhUKDYpICAgTm8gU3VjaCBDb250ZXh0CiAqIFZBQ01fU1VCVFJFRV9VTktOT1dOKDcpIFdoZW4gdGVzdGluZyBhbiBlbnRpcmUgc3VidHJlZSwgVU5LTk9XTiAoaWUsIHRoZSBlbnRpcmUKICogICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZSBoYXMgYm90aCBhbGxvd2VkIGFuZCBkaXNhbGxvd2VkIHBvcnRpb25zKQogKgogKiBEZWJ1ZyBvdXRwdXQgbGlzdGVkIGFzIGZvbGxvd3M6CiAqCVw8c2VjdXJpdHlOYW1lXD4gXDxncm91cE5hbWVcPiBcPHZpZXdOYW1lXD4gXDx2aWV3VHlwZVw+CiAqLwppbnQKdmFjbV9pbl92aWV3KG5ldHNubXBfcGR1ICpwZHUsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lbGVuLAogICAgICAgICAgICAgaW50IGNoZWNrX3N1YnRyZWUpCnsKICAgIGludCB2aWV3dHlwZTsKCiAgICBzd2l0Y2ggKHBkdS0+Y29tbWFuZCkgewogICAgY2FzZSBTTk1QX01TR19HRVQ6CiAgICBjYXNlIFNOTVBfTVNHX0dFVE5FWFQ6CiAgICBjYXNlIFNOTVBfTVNHX0dFVEJVTEs6CiAgICAgICAgdmlld3R5cGUgPSBWQUNNX1ZJRVdfUkVBRDsKICAgICAgICBicmVhazsKICAgIGNhc2UgU05NUF9NU0dfU0VUOgogICAgICAgIHZpZXd0eXBlID0gVkFDTV9WSUVXX1dSSVRFOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBTTk1QX01TR19UUkFQOgogICAgY2FzZSBTTk1QX01TR19UUkFQMjoKICAgIGNhc2UgU05NUF9NU0dfSU5GT1JNOgogICAgICAgIHZpZXd0eXBlID0gVkFDTV9WSUVXX05PVElGWTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImJhZCBtc2cgdHlwZSBpbiB2YWNtX2luX3ZpZXc6ICVkXG4iLAogICAgICAgICAgICAgICAgIHBkdS0+Y29tbWFuZCk7CiAgICAgICAgdmlld3R5cGUgPSBWQUNNX1ZJRVdfUkVBRDsKICAgIH0KICAgIHJldHVybiB2YWNtX2NoZWNrX3ZpZXcocGR1LCBuYW1lLCBuYW1lbGVuLCBjaGVja19zdWJ0cmVlLCB2aWV3dHlwZSk7Cn0KCi8qKgogKiB2YWNtX2NoZWNrX3ZpZXc6IGRlY2lkZXMgaWYgYSBnaXZlbiBQRFUgY2FuIGJlIHRha2VuIGJhc2VkIG9uIGEgdmlldyB0eXBlCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSpwZHUKICoJKm5hbWUKICoJIG5hbWVsZW4KICogICAgICAgY2hlY2tfc3VidHJlZQogKiAgICAgICB2aWV3dHlwZQogKiAgICAgIAogKiBSZXR1cm5zOgogKiBWQUNNX1NVQ0NFU1MoMCkJICAgT24gc3VjY2Vzcy4KICogVkFDTV9OT1NFQ05BTUUoMSkJICAgTWlzc2luZyBzZWN1cml0eSBuYW1lLgogKiBWQUNNX05PR1JPVVAoMikJICAgTWlzc2luZyBncm91cAogKiBWQUNNX05PQUNDRVNTKDMpCSAgIE1pc3NpbmcgYWNjZXNzCiAqIFZBQ01fTk9WSUVXKDQpCSAgIE1pc3NpbmcgdmlldwogKiBWQUNNX05PVElOVklFVyg1KQkgICBOb3QgaW4gdmlldwogKiBWQUNNX05PU1VDSENPTlRFWFQoNikgICBObyBTdWNoIENvbnRleHQKICogVkFDTV9TVUJUUkVFX1VOS05PV04oNykgV2hlbiB0ZXN0aW5nIGFuIGVudGlyZSBzdWJ0cmVlLCBVTktOT1dOIChpZSwgdGhlIGVudGlyZQogKiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlIGhhcyBib3RoIGFsbG93ZWQgYW5kIGRpc2FsbG93ZWQgcG9ydGlvbnMpCiAqCiAqIERlYnVnIG91dHB1dCBsaXN0ZWQgYXMgZm9sbG93czoKICoJXDxzZWN1cml0eU5hbWVcPiBcPGdyb3VwTmFtZVw+IFw8dmlld05hbWVcPiBcPHZpZXdUeXBlXD4KICovCmludAp2YWNtX2NoZWNrX3ZpZXcobmV0c25tcF9wZHUgKnBkdSwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVsZW4sCiAgICAgICAgICAgICAgICBpbnQgY2hlY2tfc3VidHJlZSwgaW50IHZpZXd0eXBlKQp7CiAgICByZXR1cm4gdmFjbV9jaGVja192aWV3X2NvbnRlbnRzKHBkdSwgbmFtZSwgbmFtZWxlbiwgY2hlY2tfc3VidHJlZSwgdmlld3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQ01fQ0hFQ0tfVklFV19DT05URU5UU19OT19GTEFHUyk7Cn0KCmludAp2YWNtX2NoZWNrX3ZpZXdfY29udGVudHMobmV0c25tcF9wZHUgKnBkdSwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hlY2tfc3VidHJlZSwgaW50IHZpZXd0eXBlLCBpbnQgZmxhZ3MpCnsKICAgIHN0cnVjdCB2YWNtX2FjY2Vzc0VudHJ5ICphcDsKICAgIHN0cnVjdCB2YWNtX2dyb3VwRW50cnkgKmdwOwogICAgc3RydWN0IHZhY21fdmlld0VudHJ5ICp2cDsKICAgIGNoYXIgICAgICAgICAgICB2YWNtX2RlZmF1bHRfY29udGV4dFsxXSA9ICIiOwogICAgY29uc3QgY2hhciAgICAgKmNvbnRleHROYW1lID0gdmFjbV9kZWZhdWx0X2NvbnRleHQ7CiAgICBjb25zdCBjaGFyICAgICAqc24gPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKnZuOwogICAgY29uc3QgY2hhciAgICAgKnBkdV9jb21tdW5pdHk7CgogICAgLyoKICAgICAqIGxlbiBkZWZpbmVkIGJ5IHRoZSB2YWNtQ29udGV4dE5hbWUgb2JqZWN0IAogICAgICovCiNkZWZpbmUgQ09OVEVYVE5BTUVJTkRFWExFTiAzMgogICAgY2hhciAgICAgICAgICAgIGNvbnRleHROYW1lSW5kZXhbQ09OVEVYVE5BTUVJTkRFWExFTiArIDFdOwoKI2lmICFkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjEpIHx8ICFkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDKQojaWYgZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYxKQogICAgaWYgKHBkdS0+dmVyc2lvbiA9PSBTTk1QX1ZFUlNJT05fMmMpCiNlbHNlCiNpZiBkZWZpbmVkKE5FVFNOTVBfRElTQUJMRV9TTk1QVjJDKQogICAgaWYgKHBkdS0+dmVyc2lvbiA9PSBTTk1QX1ZFUlNJT05fMSkKI2Vsc2UKICAgIGlmIChwZHUtPnZlcnNpb24gPT0gU05NUF9WRVJTSU9OXzEgfHwgcGR1LT52ZXJzaW9uID09IFNOTVBfVkVSU0lPTl8yYykKI2VuZGlmCiNlbmRpZgogICAgewogICAgICAgIHBkdV9jb21tdW5pdHkgPSAoY29uc3QgY2hhciAqKSBwZHUtPmNvbW11bml0eTsKICAgICAgICBpZiAoIXBkdV9jb21tdW5pdHkpCiAgICAgICAgICAgIHBkdV9jb21tdW5pdHkgPSAiIjsKICAgICAgICBpZiAoc25tcF9nZXRfZG9fZGVidWdnaW5nKCkpIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmJ1ZjsKICAgICAgICAgICAgaWYgKHBkdS0+Y29tbXVuaXR5KSB7CiAgICAgICAgICAgICAgICBidWYgPSAoY2hhciAqKSBtYWxsb2MoMSArIHBkdS0+Y29tbXVuaXR5X2xlbik7CiAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCBwZHUtPmNvbW11bml0eSwgcGR1LT5jb21tdW5pdHlfbGVuKTsKICAgICAgICAgICAgICAgIGJ1ZltwZHUtPmNvbW11bml0eV9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLCAiTlVMTCBjb21tdW5pdHkiKSk7CiAgICAgICAgICAgICAgICBidWYgPSBzdHJkdXAoIk5VTEwiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ2YWNtX2luX3ZpZXc6IHZlcj0lbGQsIGNvbW11bml0eT0lc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT52ZXJzaW9uLCBidWYpKTsKICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBPa2F5LCBpZiB0aGlzIFBEVSB3YXMgcmVjZWl2ZWQgZnJvbSBhIFVEUCBvciBhIFRDUCB0cmFuc3BvcnQgdGhlbgogICAgICAgICAqIGFzayB0aGUgdHJhbnNwb3J0IGFic3RyYWN0aW9uIGxheWVyIHRvIG1hcCBpdHMgc291cmNlIGFkZHJlc3MgYW5kCiAgICAgICAgICogY29tbXVuaXR5IHN0cmluZyB0byBhIHNlY3VyaXR5IG5hbWUgZm9yIHVzLiAgCiAgICAgICAgICovCgogICAgICAgIGlmICgwKSB7CiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VRFBfRE9NQUlOCiAgICAgICAgfSBlbHNlIGlmIChwZHUtPnREb21haW4gPT0gbmV0c25tcFVEUERvbWFpbgojaWZkZWYgTkVUU05NUF9UUkFOU1BPUlRfVENQX0RPTUFJTgogICAgICAgICAgICB8fCBwZHUtPnREb21haW4gPT0gbmV0c25tcF9zbm1wVENQRG9tYWluCiNlbmRpZgogICAgICAgICAgICApIHsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX3VkcF9nZXRTZWNOYW1lKHBkdS0+dHJhbnNwb3J0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnRyYW5zcG9ydF9kYXRhX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdV9jb21tdW5pdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPmNvbW11bml0eV9sZW4sICZzbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0TmFtZSkpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGVyZSBhcmUgbm8gY29tMnNlYyBlbnRyaWVzLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHNuID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBmb3JjZSB0aGUgY29tbXVuaXR5IC0+IGNvbnRleHQgbmFtZSBtYXBwaW5nIGhlcmUgKi8KICAgICAgICAgICAgU05NUF9GUkVFKHBkdS0+Y29udGV4dE5hbWUpOwogICAgICAgICAgICBwZHUtPmNvbnRleHROYW1lID0gc3RyZHVwKGNvbnRleHROYW1lKTsKICAgICAgICAgICAgcGR1LT5jb250ZXh0TmFtZUxlbiA9IHN0cmxlbihjb250ZXh0TmFtZSk7CiNlbmRpZgojaWZkZWYgTkVUU05NUF9UUkFOU1BPUlRfVURQSVBWNl9ET01BSU4KICAgICAgICB9IGVsc2UgaWYgKHBkdS0+dERvbWFpbiA9PSBuZXRzbm1wX1VEUElQdjZEb21haW4KI2lmZGVmIE5FVFNOTVBfVFJBTlNQT1JUX1RDUElQVjZfRE9NQUlOCiAgICAgICAgICAgICAgICAgICB8fCBwZHUtPnREb21haW4gPT0gbmV0c25tcF9UQ1BJUHY2RG9tYWluCiNlbmRpZgogICAgICAgICAgICApIHsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX3VkcDZfZ2V0U2VjTmFtZShwZHUtPnRyYW5zcG9ydF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+dHJhbnNwb3J0X2RhdGFfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdV9jb21tdW5pdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5jb21tdW5pdHlfbGVuLCAmc24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHROYW1lKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZXJlIGFyZSBubyBjb20yc2VjIGVudHJpZXMuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgc24gPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIGZvcmNlIHRoZSBjb21tdW5pdHkgLT4gY29udGV4dCBuYW1lIG1hcHBpbmcgaGVyZSAqLwogICAgICAgICAgICBTTk1QX0ZSRUUocGR1LT5jb250ZXh0TmFtZSk7CiAgICAgICAgICAgIHBkdS0+Y29udGV4dE5hbWUgPSBzdHJkdXAoY29udGV4dE5hbWUpOwogICAgICAgICAgICBwZHUtPmNvbnRleHROYW1lTGVuID0gc3RybGVuKGNvbnRleHROYW1lKTsKI2VuZGlmCiNpZmRlZiBORVRTTk1QX1RSQU5TUE9SVF9VTklYX0RPTUFJTgogICAgICAgIH0gZWxzZSBpZiAocGR1LT50RG9tYWluID09IG5ldHNubXBfVW5peERvbWFpbil7CiAgICAgICAgICAgIGlmICghbmV0c25tcF91bml4X2dldFNlY05hbWUocGR1LT50cmFuc3BvcnRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHUtPnRyYW5zcG9ydF9kYXRhX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZHVfY29tbXVuaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkdS0+Y29tbXVuaXR5X2xlbiwgJnNuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0TmFtZSkpIHsKCQkJCQlzbiA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogZm9yY2UgdGhlIGNvbW11bml0eSAtPiBjb250ZXh0IG5hbWUgbWFwcGluZyBoZXJlICovCiAgICAgICAgICAgIFNOTVBfRlJFRShwZHUtPmNvbnRleHROYW1lKTsKICAgICAgICAgICAgcGR1LT5jb250ZXh0TmFtZSA9IHN0cmR1cChjb250ZXh0TmFtZSk7CiAgICAgICAgICAgIHBkdS0+Y29udGV4dE5hbWVMZW4gPSBzdHJsZW4oY29udGV4dE5hbWUpOwojZW5kaWYJCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTWFwIG90aGVyIDxjb21tdW5pdHksIHRyYW5zcG9ydC1hZGRyZXNzPiBwYWlycyB0byBzZWN1cml0eSBuYW1lcwogICAgICAgICAgICAgKiBoZXJlLiAgRm9yIG5vdyBqdXN0IGxldCBub24tSVB2NCB0cmFuc3BvcnQgYWx3YXlzIHN1Y2NlZWQuCiAgICAgICAgICAgICAqIAogICAgICAgICAgICAgKiBXSEFBQUFUVFRULiAgTm8sIHdlIGRvbid0IGxldCBub24tSVB2NCB0cmFuc3BvcnRzCiAgICAgICAgICAgICAqIHN1Y2NlZWQhICBZb3UgbXVzdCBmaXggdGhpcyB0byBtYWtlIGl0IHVzYWJsZSwgc29ycnkuCiAgICAgICAgICAgICAqIEZyb20gYSBzZWN1cml0eSBzdGFuZHBvaW50IHRoaXMgaXMgaW5zYW5lLiAtLSBXZXMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIC8qKiBAdG9kbyBhbHRlcm5hdGUgY29tMnNlYyBtYXBwaW5ncyBmb3Igbm9uIHY0IHRyYW5zcG9ydHMuCiAgICAgICAgICAgICAgICBTaG91bGQgYmUgaW1wbGVtZW50ZWQgdmlhIHJlZ2lzdHJhdGlvbiAqLwogICAgICAgICAgICBzbiA9IE5VTEw7CiAgICAgICAgfQoKICAgIH0gZWxzZQojZW5kaWYgLyogc3VwcG9ydCBmb3IgY29tbXVuaXR5IGJhc2VkIFNOTVAgKi8KICAgICAgaWYgKGZpbmRfc2VjX21vZChwZHUtPnNlY3VyaXR5TW9kZWwpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBhbnkgbGVnYWwgZGVmaW5lZCB2MyBzZWN1cml0eSBtb2RlbCAKICAgICAgICAgKi8KICAgICAgICBERUJVR01TRygoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICJ2YWNtX2luX3ZpZXc6IHZlcj0lbGQsIG1vZGVsPSVkLCBzZWNOYW1lPSVzXG4iLAogICAgICAgICAgICAgICAgICBwZHUtPnZlcnNpb24sIHBkdS0+c2VjdXJpdHlNb2RlbCwgcGR1LT5zZWN1cml0eU5hbWUpKTsKICAgICAgICBzbiA9IHBkdS0+c2VjdXJpdHlOYW1lOwogICAgICAgIGNvbnRleHROYW1lID0gcGR1LT5jb250ZXh0TmFtZTsKICAgIH0gZWxzZSB7CiAgICAgICAgc24gPSBOVUxMOwogICAgfQoKICAgIGlmIChzbiA9PSBOVUxMKSB7CiNpZiAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYxKSB8fCAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYyQykKICAgICAgICBzbm1wX2luY3JlbWVudF9zdGF0aXN0aWMoU1RBVF9TTk1QSU5CQURDT01NVU5JVFlOQU1FUyk7CiNlbmRpZgogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS92YWNtX3ZhcnMiLAogICAgICAgICAgICAgICAgICAgICJ2YWNtX2luX3ZpZXc6IE5vIHNlY3VyaXR5IG5hbWUgZm91bmRcbiIpKTsKICAgICAgICByZXR1cm4gVkFDTV9OT1NFQ05BTUU7CiAgICB9CgogICAgaWYgKHBkdS0+Y29udGV4dE5hbWVMZW4gPiBDT05URVhUTkFNRUlOREVYTEVOKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsCiAgICAgICAgICAgICAgICAgICAgInZhY21faW5fdmlldzogYmFkIGN0eHQgbGVuZ3RoICVkXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpcGR1LT5jb250ZXh0TmFtZUxlbikpOwogICAgICAgIHJldHVybiBWQUNNX05PU1VDSENPTlRFWFQ7CiAgICB9CiAgICAvKgogICAgICogTlVMTCB0ZXJtaW5hdGlvbiBvZiB0aGUgcGR1IGZpZWxkIGlzIHVnbHkgaGVyZS4gIERvIGluIFBEVSBwYXJzaW5nPyAKICAgICAqLwogICAgaWYgKHBkdS0+Y29udGV4dE5hbWUpCiAgICAgICAgbWVtY3B5KGNvbnRleHROYW1lSW5kZXgsIHBkdS0+Y29udGV4dE5hbWUsIHBkdS0+Y29udGV4dE5hbWVMZW4pOwogICAgZWxzZQogICAgICAgIGNvbnRleHROYW1lSW5kZXhbMF0gPSAnXDAnOwoKICAgIGNvbnRleHROYW1lSW5kZXhbcGR1LT5jb250ZXh0TmFtZUxlbl0gPSAnXDAnOwogICAgaWYgKCEoZmxhZ3MgJiBWQUNNX0NIRUNLX1ZJRVdfQ09OVEVOVFNfRE5FX0NPTlRFWFRfT0spICYmCiAgICAgICAgIW5ldHNubXBfc3VidHJlZV9maW5kX2ZpcnN0KGNvbnRleHROYW1lSW5kZXgpKSB7CiAgICAgICAgLyoKICAgICAgICAgKiByZmMgMzQxNSBzZWN0aW9uIDMuMiwgc3RlcCAxCiAgICAgICAgICogbm8gc3VjaCBjb250ZXh0IGhlcmU7IHJldHVybiBubyBzdWNoIGNvbnRleHQgZXJyb3IgCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsICJ2YWNtX2luX3ZpZXc6IG5vIHN1Y2ggY3R4dCBcIiVzXCJcbiIsCiAgICAgICAgICAgICAgICAgICAgY29udGV4dE5hbWVJbmRleCkpOwogICAgICAgIHJldHVybiBWQUNNX05PU1VDSENPTlRFWFQ7CiAgICB9CgogICAgREVCVUdNU0dUTCgoIm1pYklJL3ZhY21fdmFycyIsICJ2YWNtX2luX3ZpZXc6IHNuPSVzIiwgc24pKTsKCiAgICBncCA9IHZhY21fZ2V0R3JvdXBFbnRyeShwZHUtPnNlY3VyaXR5TW9kZWwsIHNuKTsKICAgIGlmIChncCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0coKCJtaWJJSS92YWNtX3ZhcnMiLCAiXG4iKSk7CiAgICAgICAgcmV0dXJuIFZBQ01fTk9HUk9VUDsKICAgIH0KICAgIERFQlVHTVNHKCgibWliSUkvdmFjbV92YXJzIiwgIiwgZ249JXMiLCBncC0+Z3JvdXBOYW1lKSk7CgogICAgYXAgPSB2YWNtX2dldEFjY2Vzc0VudHJ5KGdwLT5ncm91cE5hbWUsIGNvbnRleHROYW1lSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGR1LT5zZWN1cml0eU1vZGVsLCBwZHUtPnNlY3VyaXR5TGV2ZWwpOwogICAgaWYgKGFwID09IE5VTEwpIHsKICAgICAgICBERUJVR01TRygoIm1pYklJL3ZhY21fdmFycyIsICJcbiIpKTsKICAgICAgICByZXR1cm4gVkFDTV9OT0FDQ0VTUzsKICAgIH0KCiAgICBpZiAobmFtZSA9PSBOVUxMKSB7IC8qIG9ubHkgY2hlY2sgdGhlIHNldHVwIG9mIHRoZSB2YWNtIGZvciB0aGUgcmVxdWVzdCAqLwogICAgICAgIERFQlVHTVNHKCgibWliSUkvdmFjbV92YXJzIiwgIiwgRG9uZSBjaGVja2luZyBzZXR1cFxuIikpOwogICAgICAgIHJldHVybiBWQUNNX1NVQ0NFU1M7CiAgICB9CgogICAgaWYgKHZpZXd0eXBlIDwgMCB8fCB2aWV3dHlwZSA+PSBWQUNNX01BWF9WSUVXUykgewogICAgICAgIERFQlVHTVNHKCgibWliSUkvdmFjbV92YXJzIiwgIiBpbGxlZ2FsIHZpZXcgdHlwZVxuIikpOwogICAgICAgIHJldHVybiBWQUNNX05PQUNDRVNTOwogICAgfQogICAgdm4gPSBhcC0+dmlld3Nbdmlld3R5cGVdOwogICAgREVCVUdNU0coKCJtaWJJSS92YWNtX3ZhcnMiLCAiLCB2bj0lcyIsIHZuKSk7CgogICAgaWYgKGNoZWNrX3N1YnRyZWUpIHsKICAgICAgICBERUJVR01TRygoIm1pYklJL3ZhY21fdmFycyIsICJcbiIpKTsKICAgICAgICByZXR1cm4gdmFjbV9jaGVja1N1YnRyZWUodm4sIG5hbWUsIG5hbWVsZW4pOwogICAgfQoKICAgIHZwID0gdmFjbV9nZXRWaWV3RW50cnkodm4sIG5hbWUsIG5hbWVsZW4sIFZBQ01fTU9ERV9GSU5EKTsKCiAgICBpZiAodnAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHKCgibWliSUkvdmFjbV92YXJzIiwgIlxuIikpOwogICAgICAgIHJldHVybiBWQUNNX05PVklFVzsKICAgIH0KICAgIERFQlVHTVNHKCgibWliSUkvdmFjbV92YXJzIiwgIiwgdnQ9JWRcbiIsIHZwLT52aWV3VHlwZSkpOwoKICAgIGlmICh2cC0+dmlld1R5cGUgPT0gU05NUF9WSUVXX0VYQ0xVREVEKSB7CiNpZiAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYxKSB8fCAhZGVmaW5lZChORVRTTk1QX0RJU0FCTEVfU05NUFYyQykKI2lmIGRlZmluZWQoTkVUU05NUF9ESVNBQkxFX1NOTVBWMSkKICAgICAgICBpZiAocGR1LT52ZXJzaW9uID09IFNOTVBfVkVSU0lPTl8yYykKI2Vsc2UKI2lmIGRlZmluZWQoTkVUU05NUF9ESVNBQkxFX1NOTVBWMkMpCiAgICAgICAgaWYgKHBkdS0+dmVyc2lvbiA9PSBTTk1QX1ZFUlNJT05fMSkKI2Vsc2UKICAgICAgICBpZiAocGR1LT52ZXJzaW9uID09IFNOTVBfVkVSU0lPTl8xIHx8IHBkdS0+dmVyc2lvbiA9PSBTTk1QX1ZFUlNJT05fMmMpCiNlbmRpZgojZW5kaWYKICAgICAgICB7CiAgICAgICAgICAgIHNubXBfaW5jcmVtZW50X3N0YXRpc3RpYyhTVEFUX1NOTVBJTkJBRENPTU1VTklUWVVTRVMpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgcmV0dXJuIFZBQ01fTk9USU5WSUVXOwogICAgfQoKICAgIHJldHVybiBWQUNNX1NVQ0NFU1M7Cgp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCB2YWNtX2luX3ZpZXcoKSAqLwoKCg==