LyoKICogU0hMV0FQSSBvcmRpbmFsIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICogICAgICAgICAgIDE5OTggSvxyZ2VuIFNjaG1pZWQKICogICAgICAgICAgIDIwMDEgSm9uIEdyaWZmaXRocwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJkZGVtbC5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJzaGVsbGFwaS5oIgojaW5jbHVkZSAiY29tbWRsZy5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL29ial9iYXNlLmgiCiNpbmNsdWRlICJ3aW5lL29ial9pbnBsYWNlLmgiCiNpbmNsdWRlICJ3aW5lL29ial9zZXJ2aWNlcHJvdmlkZXIuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJvcmRpbmFsLmgiCiNpbmNsdWRlICJzaGx3YXBpLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChzaGVsbCk7CgpleHRlcm4gSElOU1RBTkNFIHNobHdhcGlfaEluc3RhbmNlOwpleHRlcm4gSE1PRFVMRSBTSExXQVBJX2hzaGVsbDMyOwpleHRlcm4gSE1PRFVMRSBTSExXQVBJX2h3aW5tbTsKZXh0ZXJuIEhNT0RVTEUgU0hMV0FQSV9oY29tZGxnMzI7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaG1wcjsKZXh0ZXJuIEhNT0RVTEUgU0hMV0FQSV9obWxhbmc7CmV4dGVybiBITU9EVUxFIFNITFdBUElfaHZlcnNpb247CgpleHRlcm4gRFdPUkQgU0hMV0FQSV9UaHJlYWRSZWZfaW5kZXg7Cgp0eXBlZGVmIEhBTkRMRSBIU0hBUkVEOyAvKiBTaGFyZWQgbWVtb3J5ICovCgovKiBmb2xsb3dpbmcgaXMgR1VJRCBmb3IgSU9iamVjdFdpdGhTaXRlOjpTZXRTaXRlICAtLSBzZWUgXzE3NCAgICAgICAgICAgKi8Kc3RhdGljIERXT1JEIGlkMVs0XSA9IHsweGZjNDgwMWEzLCAweDExY2YyYmE5LCAweGFhMDAyOWEyLCAweDUyNzMzZDAwfTsKLyogZm9sbG93aW5nIGlzIEdVSUQgZm9yIElQZXJzaXN0TW9uaWtlcjo6R2V0Q2xhc3NJRCAgLS0gc2VlIF8xNzQgICAgICAgICovCnN0YXRpYyBEV09SRCBpZDJbNF0gPSB7MHg3OWVhYzllZSwgMHgxMWNlYmFmOSwgMHhhYTAwODI4YywgMHgwYmE5NGIwMH07CgovKiBUaGUgZm9sbG93aW5nIHNjaGVtZXMgd2VyZSBpZGVudGlmaWVkIGluIHRoZSBuYXRpdmUgdmVyc2lvbiBvZgogKiBTSExXQVBJLkRMTCB2ZXJzaW9uIDUuNTAKICovCnR5cGVkZWYgZW51bSB7CiAgICBVUkxfU0NIRU1FX0lOVkFMSUQgICAgID0gLTEsCiAgICBVUkxfU0NIRU1FX1VOS05PV04gICAgID0gIDAsCiAgICBVUkxfU0NIRU1FX0ZUUCwKICAgIFVSTF9TQ0hFTUVfSFRUUCwKICAgIFVSTF9TQ0hFTUVfR09QSEVSLAogICAgVVJMX1NDSEVNRV9NQUlMVE8sCiAgICBVUkxfU0NIRU1FX05FV1MsCiAgICBVUkxfU0NIRU1FX05OVFAsCiAgICBVUkxfU0NIRU1FX1RFTE5FVCwKICAgIFVSTF9TQ0hFTUVfV0FJUywKICAgIFVSTF9TQ0hFTUVfRklMRSwKICAgIFVSTF9TQ0hFTUVfTUssCiAgICBVUkxfU0NIRU1FX0hUVFBTLAogICAgVVJMX1NDSEVNRV9TSEVMTCwKICAgIFVSTF9TQ0hFTUVfU05FV1MsCiAgICBVUkxfU0NIRU1FX0xPQ0FMLAogICAgVVJMX1NDSEVNRV9KQVZBU0NSSVBULAogICAgVVJMX1NDSEVNRV9WQlNDUklQVCwKICAgIFVSTF9TQ0hFTUVfQUJPVVQsCiAgICBVUkxfU0NIRU1FX1JFUywKICAgIFVSTF9TQ0hFTUVfTUFYVkFMVUUKfSBVUkxfU0NIRU1FOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgVVJMX1NDSEVNRSAgc2NoZW1lX251bWJlcjsKICAgIExQQ1NUUiBzY2hlbWVfbmFtZTsKfSBTSExfMl9pbmV0X3NjaGVtZTsKCnN0YXRpYyBjb25zdCBTSExfMl9pbmV0X3NjaGVtZSBzaGx3YXBpX3NjaGVtZXNbXSA9IHsKICB7VVJMX1NDSEVNRV9GVFAsICAgICAgICAiZnRwIn0sCiAge1VSTF9TQ0hFTUVfSFRUUCwgICAgICAgImh0dHAifSwKICB7VVJMX1NDSEVNRV9HT1BIRVIsICAgICAiZ29waGVyIn0sCiAge1VSTF9TQ0hFTUVfTUFJTFRPLCAgICAgIm1haWx0byJ9LAogIHtVUkxfU0NIRU1FX05FV1MsICAgICAgICJuZXdzIn0sCiAge1VSTF9TQ0hFTUVfTk5UUCwgICAgICAgIm5udHAifSwKICB7VVJMX1NDSEVNRV9URUxORVQsICAgICAidGVsbmV0In0sCiAge1VSTF9TQ0hFTUVfV0FJUywgICAgICAgIndhaXMifSwKICB7VVJMX1NDSEVNRV9GSUxFLCAgICAgICAiZmlsZSJ9LAogIHtVUkxfU0NIRU1FX01LLCAgICAgICAgICJtayJ9LAogIHtVUkxfU0NIRU1FX0hUVFBTLCAgICAgICJodHRwcyJ9LAogIHtVUkxfU0NIRU1FX1NIRUxMLCAgICAgICJzaGVsbCJ9LAogIHtVUkxfU0NIRU1FX1NORVdTLCAgICAgICJzbmV3cyJ9LAogIHtVUkxfU0NIRU1FX0xPQ0FMLCAgICAgICJsb2NhbCJ9LAogIHtVUkxfU0NIRU1FX0pBVkFTQ1JJUFQsICJqYXZhc2NyaXB0In0sCiAge1VSTF9TQ0hFTUVfVkJTQ1JJUFQsICAgInZic2NyaXB0In0sCiAge1VSTF9TQ0hFTUVfQUJPVVQsICAgICAgImFib3V0In0sCiAge1VSTF9TQ0hFTUVfUkVTLCAgICAgICAgInJlcyJ9LAogIHswLCAwfQp9OwoKLyogZnVuY3Rpb24gcG9pbnRlcnMgZm9yIEdFVF9GVU5DIG1hY3JvOyB0aGVzZSBuZWVkIHRvIGJlIGdsb2JhbCBiZWNhdXNlIG9mIGdjYyBidWcgKi8Kc3RhdGljIExQSVRFTUlETElTVCAoV0lOQVBJICpwU0hCcm93c2VGb3JGb2xkZXJXKShMUEJST1dTRUlORk9XKTsKc3RhdGljIEhSRVNVTFQgKFdJTkFQSSAqcENvbnZlcnRJTmV0VW5pY29kZVRvTXVsdGlCeXRlKShMUERXT1JELERXT1JELExQQ1dTVFIsTFBJTlQsTFBTVFIsTFBJTlQpOwpzdGF0aWMgQk9PTCAgICAoV0lOQVBJICpwUGxheVNvdW5kVykoTFBDV1NUUiwgSE1PRFVMRSwgRFdPUkQpOwpzdGF0aWMgRFdPUkQgICAoV0lOQVBJICpwU0hHZXRGaWxlSW5mb1cpKExQQ1dTVFIsRFdPUkQsU0hGSUxFSU5GT1cqLFVJTlQsVUlOVCk7CnN0YXRpYyBVSU5UICAgIChXSU5BUEkgKnBEcmFnUXVlcnlGaWxlVykoSERST1AsIFVJTlQsIExQV1NUUiwgVUlOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBTSEdldFBhdGhGcm9tSURMaXN0VykoTFBDSVRFTUlETElTVCwgTFBXU1RSKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcFNoZWxsRXhlY3V0ZUV4VykoTFBTSEVMTEVYRUNVVEVJTkZPVyk7CnN0YXRpYyBISUNPTiAgIChXSU5BUEkgKnBTSEZpbGVPcGVyYXRpb25XKShMUFNIRklMRU9QU1RSVUNUVyk7CnN0YXRpYyBISUNPTiAgIChXSU5BUEkgKnBFeHRyYWN0SWNvbkV4VykoTFBDV1NUUiwgSU5ULEhJQ09OICosSElDT04gKiwgVUlOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBTSEdldE5ld0xpbmtJbmZvVykoTFBDV1NUUiwgTFBDV1NUUiwgTFBDV1NUUiwgQk9PTCosIFVJTlQpOwpzdGF0aWMgRFdPUkQgICAoV0lOQVBJICpwU0hEZWZFeHRyYWN0SWNvblcpKExQVk9JRCwgTFBWT0lELCBMUFZPSUQsIExQVk9JRCwgTFBWT0lELCBMUFZPSUQpOyAvKiBGSVhNRTogQ29ycmVjdCBhcmdzICovCnN0YXRpYyBISUNPTiAgIChXSU5BUEkgKnBFeHRyYWN0SWNvblcpKEhJTlNUQU5DRSwgTFBDV1NUUiwgVUlOVCk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBHZXRTYXZlRmlsZU5hbWVXKShMUE9QRU5GSUxFTkFNRVcpOwpzdGF0aWMgRFdPUkQgICAoV0lOQVBJICpwV05ldFJlc3RvcmVDb25uZWN0aW9uVykoTFBWT0lELCBMUFZPSUQpOyAvKiBGSVhNRTogQ29ycmVjdCBhcmdzICovCnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBXTmV0R2V0TGFzdEVycm9yVykoTFBWT0lELCBMUFZPSUQsIExQVk9JRCwgTFBWT0lELCBMUFZPSUQpOyAvKiBGSVhNRTogQ29ycmVjdCBhcmdzICovCnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBQYWdlU2V0dXBEbGdXKShMUFBBR0VTRVRVUERMR1cpOwpzdGF0aWMgQk9PTCAgICAoV0lOQVBJICpwUHJpbnREbGdXKShMUFBSSU5URExHVyk7CnN0YXRpYyBCT09MICAgIChXSU5BUEkgKnBHZXRPcGVuRmlsZU5hbWVXKShMUE9QRU5GSUxFTkFNRVcpOwpzdGF0aWMgSFJFU1VMVCAoV0lOQVBJICpwU0hHZXRJbnN0YW5jZUV4cGxvcmVyKShMUFVOS05PV04gKik7CnN0YXRpYyBEV09SRCAgIChXSU5BUEkgKnBHZXRGaWxlVmVyc2lvbkluZm9TaXplVykoTFBDV1NUUixMUERXT1JEKTsKc3RhdGljIEJPT0wgICAgKFdJTkFQSSAqcEdldEZpbGVWZXJzaW9uSW5mb1cpKExQQ1dTVFIsRFdPUkQsRFdPUkQsTFBWT0lEKTsKc3RhdGljIFdPUkQgICAgKFdJTkFQSSAqcFZlclF1ZXJ5VmFsdWVXKShMUFZPSUQsTFBDV1NUUixMUFZPSUQqLFVJTlQqKTsKCi8qCiBOT1RFUzogTW9zdCBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgb3JkaW5hbCBzZWVtIHRvIGJlIHN1cGVyZmxvdXMuCiBUaGUgcmVhc29uIGZvciB0aGVzZSBmdW5jdGlvbnMgdG8gYmUgdGhlcmUgaXMgdG8gcHJvdmlkZSBhIHdyYXBlcgogZm9yIHVuaWNvZGUgZnVuY3Rpb25zIHRvIHByb3ZpZGUgdGhlc2UgZnVuY3Rpb25zIG9uIHN5c3RlbXMgd2l0aG91dAogdW5pY29kZSBmdW5jdGlvbnMgZWcuIHdpbjk1L3dpbjk4LiBTaW5jZSB3ZSBoYXZlIHN1Y2ggZnVuY3Rpb25zIHdlIGp1c3QKIGNhbGwgdGhlc2UuIElmIHJ1bm5pbmcgV2luZSB3aXRoIG5hdGl2ZSBETEwncywgc29tZSBsYXRlIGJvdW5kIGNhbGxzIG1heQogZmFpbC4gSG93ZXZlciwgaXRzIGJldHRlciB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9yd2FyZCBETEwKIGFuZCByZWNvbW1lbmQgdGhlIGJ1aWx0aW4gcmF0aGVyIHRoYW4gcmVpbXBsZW1lbnRpbmcgdGhlIGNhbGxzIGhlcmUhCiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMV0KICoKICogSWRlbnRpZmllcyB0aGUgSW50ZXJuZXQgInNjaGVtZSIgaW4gdGhlIHBhc3NlZCBzdHJpbmcuIEFTQ0lJIGJhc2VkLgogKiBBbHNvIGRldGVybWluZXMgc3RhcnQgYW5kIGxlbmd0aCBvZiBpdGVtIGFmdGVyIHRoZSAnOicKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzEgKExQQ1NUUiB4LCBVTktOT1dOX1NITFdBUElfMSAqeSkKewogICAgRFdPUkQgY250OwogICAgY29uc3QgU0hMXzJfaW5ldF9zY2hlbWUgKmluZXRfcHJvOwoKICAgIGlmICh5LT5zaXplICE9IDB4MTgpIHJldHVybiBFX0lOVkFMSURBUkc7CiAgICAvKiBGSVhNRTogbGVhZGluZyB3aGl0ZSBzcGFjZSBnZW5lcmF0ZXMgZXJyb3Igb2YgMHg4MDA0MTAwMSB3aGljaCAKICAgICAqICAgICAgICBpcyB1bmRlZmluZWQKICAgICAqLwogICAgaWYgKCp4IDw9ICcgJykgcmV0dXJuIDB4ODAwNDEwMDE7CiAgICBjbnQgPSAwOwogICAgeS0+c2l6ZXAxID0gMDsKICAgIHktPmFwMSA9IHg7CiAgICB3aGlsZSAoKngpIHsKCWlmICgqeCA9PSAnOicpIHsKCSAgICB5LT5zaXplcDEgPSBjbnQ7CgkgICAgY250ID0gLTE7CgkgICAgeS0+YXAyID0geCsxOwoJICAgIGJyZWFrOwoJfQoJeCsrOwoJY250Kys7CiAgICB9CgogICAgLyogY2hlY2sgZm9yIG5vIHNjaGVtZSBpbiBzdHJpbmcgc3RhcnQgKi8KICAgIC8qIChhcHBhcmVudGx5IHNjaGVtZXMgKm11c3QqIGJlIGxhcmdlciB0aGFuIGEgc2luZ2xlIGNoYXJhY3RlcikgICovCiAgICBpZiAoKCp4ID09ICdcMCcpIHx8ICh5LT5zaXplcDEgPD0gMSkpIHsKCXktPmFwMSA9IDA7CglyZXR1cm4gMHg4MDA0MTAwMTsKICAgIH0KCiAgICAvKiBmb3VuZCBzY2hlbWUsIHNldCBsZW5ndGggb2YgcmVtYWluZGVyICovCiAgICB5LT5zaXplcDIgPSBsc3RybGVuQSh5LT5hcDIpOwoKICAgIC8qIHNlZSBpZiBrbm93biBzY2hlbWUgYW5kIHJldHVybiBpbmRpY2F0b3IgbnVtYmVyICovCiAgICB5LT5mY25jZGUgPSBVUkxfU0NIRU1FX1VOS05PV047CiAgICBpbmV0X3BybyA9IHNobHdhcGlfc2NoZW1lczsKICAgIHdoaWxlIChpbmV0X3Byby0+c2NoZW1lX25hbWUpIHsKCWlmICghc3RybmNhc2VjbXAoaW5ldF9wcm8tPnNjaGVtZV9uYW1lLCB5LT5hcDEsCgkJICAgIG1pbih5LT5zaXplcDEsIGxzdHJsZW5BKGluZXRfcHJvLT5zY2hlbWVfbmFtZSkpKSkgewoJICAgIHktPmZjbmNkZSA9IGluZXRfcHJvLT5zY2hlbWVfbnVtYmVyOwoJICAgIGJyZWFrOwoJfQoJaW5ldF9wcm8rKzsKICAgIH0KICAgIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMl0KICoKICogSWRlbnRpZmllcyB0aGUgSW50ZXJuZXQgInNjaGVtZSIgaW4gdGhlIHBhc3NlZCBzdHJpbmcuIFVOSUNPREUgYmFzZWQuCiAqIEFsc28gZGV0ZXJtaW5lcyBzdGFydCBhbmQgbGVuZ3RoIG9mIGl0ZW0gYWZ0ZXIgdGhlICc6JwogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMiAoTFBDV1NUUiB4LCBVTktOT1dOX1NITFdBUElfMiAqeSkKewogICAgRFdPUkQgY250OwogICAgY29uc3QgU0hMXzJfaW5ldF9zY2hlbWUgKmluZXRfcHJvOwogICAgTFBTVFIgY21wc3RyOwogICAgSU5UIGxlbjsKCiAgICBpZiAoeS0+c2l6ZSAhPSAweDE4KSByZXR1cm4gRV9JTlZBTElEQVJHOwogICAgLyogRklYTUU6IGxlYWRpbmcgd2hpdGUgc3BhY2UgZ2VuZXJhdGVzIGVycm9yIG9mIDB4ODAwNDEwMDEgd2hpY2gKICAgICAqICAgICAgICBpcyB1bmRlZmluZWQKICAgICAqLwogICAgaWYgKCp4IDw9IEwnICcpIHJldHVybiAweDgwMDQxMDAxOwogICAgY250ID0gMDsKICAgIHktPnNpemVwMSA9IDA7CiAgICB5LT5hcDEgPSB4OwogICAgd2hpbGUgKCp4KSB7CglpZiAoKnggPT0gTCc6JykgewoJICAgIHktPnNpemVwMSA9IGNudDsKCSAgICBjbnQgPSAtMTsKCSAgICB5LT5hcDIgPSB4KzE7CgkgICAgYnJlYWs7Cgl9Cgl4Kys7CgljbnQrKzsKICAgIH0KCiAgICAvKiBjaGVjayBmb3Igbm8gc2NoZW1lIGluIHN0cmluZyBzdGFydCAqLwogICAgLyogKGFwcGFyZW50bHkgc2NoZW1lcyAqbXVzdCogYmUgbGFyZ2VyIHRoYW4gYSBzaW5nbGUgY2hhcmFjdGVyKSAgKi8KICAgIGlmICgoKnggPT0gTCdcMCcpIHx8ICh5LT5zaXplcDEgPD0gMSkpIHsKCXktPmFwMSA9IDA7CglyZXR1cm4gMHg4MDA0MTAwMTsKICAgIH0KCiAgICAvKiBmb3VuZCBzY2hlbWUsIHNldCBsZW5ndGggb2YgcmVtYWluZGVyICovCiAgICB5LT5zaXplcDIgPSBsc3RybGVuVyh5LT5hcDIpOwoKICAgIC8qIHNlZSBpZiBrbm93biBzY2hlbWUgYW5kIHJldHVybiBpbmRpY2F0b3IgbnVtYmVyICovCiAgICBsZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKDAsIDAsIHktPmFwMSwgeS0+c2l6ZXAxLCAwLCAwLCAwLCAwKTsKICAgIGNtcHN0ciA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbGVuKzEpOwogICAgV2lkZUNoYXJUb011bHRpQnl0ZSgwLCAwLCB5LT5hcDEsIHktPnNpemVwMSwgY21wc3RyLCBsZW4rMSwgMCwgMCk7CiAgICB5LT5mY25jZGUgPSBVUkxfU0NIRU1FX1VOS05PV047CiAgICBpbmV0X3BybyA9IHNobHdhcGlfc2NoZW1lczsKICAgIHdoaWxlIChpbmV0X3Byby0+c2NoZW1lX25hbWUpIHsKCWlmICghc3RybmNhc2VjbXAoaW5ldF9wcm8tPnNjaGVtZV9uYW1lLCBjbXBzdHIsCgkJICAgIG1pbihsZW4sIGxzdHJsZW5BKGluZXRfcHJvLT5zY2hlbWVfbmFtZSkpKSkgewoJICAgIHktPmZjbmNkZSA9IGluZXRfcHJvLT5zY2hlbWVfbnVtYmVyOwoJICAgIGJyZWFrOwoJfQoJaW5ldF9wcm8rKzsKICAgIH0KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNtcHN0cik7CiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS4zXQogKgogKiBEZXRlcm1pbmUgaWYgYSBmaWxlIGV4aXN0cyBsb2NhbGx5IGFuZCBpcyBvZiBhbiBleGVjdXRhYmxlIHR5cGUuCiAqCiAqIFBBUkFNUwogKiAgbHBzekZpbGUgICAgICAgW09dIEZpbGUgdG8gc2VhcmNoIGZvcgogKiAgZHdXaGljaCAgICAgICAgW0ldIFR5cGUgb2YgZXhlY3V0YWJsZSB0byBzZWFyY2ggZm9yCiAqCiAqIFJFVFVSTlMKICogIFRSVUUgIElmIHRoZSBmaWxlIHdhcyBmb3VuZC4gbHBzekZpbGUgY29udGFpbnMgdGhlIGZpbGUgbmFtZS4KICogIEZBTFNFIE90aGVyd2lzZS4KICoKICogTk9URVMKICogIGxwc3pQYXRoIGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCBtdXN0IGJlIGF0IGxlYXN0IE1BWF9QQVRIIGluIGxlbmd0aC4KICogIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIEZBTFNFLCB0aGUgcGF0aCBpcyBtb2RpZmllZCB0byBpdHMgb3JnaW5hbCBzdGF0ZS4KICogIElmIHRoZSBnaXZlbiBwYXRoIGNvbnRhaW5zIGFuIGV4dGVuc2lvbiBvciBkd1doaWNoIGlzIDAsIGV4ZWN1dGFibGUKICogIGV4dGVuc2lvbnMgYXJlIG5vdCBjaGVja2VkLgogKgogKiAgT3JkaW5hbHMgMy02IGFyZSBhIGNsYXNzaWMgY2FzZSBvZiBNUyBleHBvc2luZyBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkgdG8KICogIHVzZXJzIChoZXJlIHRocm91Z2ggUGF0aEZpbmRPblBhdGgpIGFuZCBrZWVwaW5nIGFkdmFuY2VkIGZ1bmN0aW9uYWxpdHkgZm9yCiAqICB0aGVpciBvd24gZGV2ZWxvcGVycyBleGNsdXNpdmUgdXNlLiBNb25vcG9seSwgYW55b25lPwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zKExQU1RSIGxwc3pGaWxlLERXT1JEIGR3V2hpY2gpCnsKICByZXR1cm4gU0hMV0FQSV9QYXRoRmluZExvY2FsRXhlQShscHN6RmlsZSxkd1doaWNoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS40XQogKgogKiBVbmljb2RlIHZlcnNpb24gb2YgU0hMV0FQSV8zLgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV80KExQV1NUUiBscHN6RmlsZSxEV09SRCBkd1doaWNoKQp7CiAgcmV0dXJuIFNITFdBUElfUGF0aEZpbmRMb2NhbEV4ZVcobHBzekZpbGUsZHdXaGljaCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAJW1NITFdBUEkuNV0KICoKICogU2VhcmNoIGEgcmFuZ2Ugb2YgcGF0aHMgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiBleGVjdXRhYmxlLgogKgogKiBQQVJBTVMKICogIGxwc3pGaWxlICAgICAgIFtPXSBGaWxlIHRvIHNlYXJjaCBmb3IKICogIGxwcHN6T3RoZXJEaXJzIFtJXSBPdGhlciBkaXJlY3RvcmllcyB0byBsb29rIGluCiAqICBkd1doaWNoICAgICAgICBbSV0gVHlwZSBvZiBleGVjdXRhYmxlIHRvIHNlYXJjaCBmb3IKICoKICogUkVUVVJOUwogKiAgU3VjY2VzczogVFJVRS4gVGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgaXMgc3RvcmVkIGluIHNGaWxlLgogKiAgRmFpbHVyZTogRkFMU0UuIFRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIGlzIHVuY2hhbmdlZC4KICovCkJPT0wgV0lOQVBJIFNITFdBUElfNShMUFNUUiBscHN6RmlsZSxMUENTVFIgKmxwcHN6T3RoZXJEaXJzLERXT1JEIGR3V2hpY2gpCnsKICByZXR1cm4gU0hMV0FQSV9QYXRoRmluZE9uUGF0aEV4QShscHN6RmlsZSxscHBzek90aGVyRGlycyxkd1doaWNoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQAlbU0hMV0FQSS42XQogKgogKiBVbmljb2RlIHZlcnNpb24gb2YgU0hMV0FQSV81LgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV82KExQV1NUUiBscHN6RmlsZSxMUENXU1RSICpscHBzek90aGVyRGlycyxEV09SRCBkd1doaWNoKQp7CiAgcmV0dXJuIFNITFdBUElfUGF0aEZpbmRPblBhdGhFeFcobHBzekZpbGUsbHBwc3pPdGhlckRpcnMsZHdXaGljaCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFNITFdBUElfRHVwU2hhcmVkSGFuZGxlCiAqCiAqIEludGVybmFsIGltcGxlbWV0YXRpb24gb2YgU0hMV0FQSV8xMS4KICovCnN0YXRpYwpIU0hBUkVEIFdJTkFQSSBTSExXQVBJX0R1cFNoYXJlZEhhbmRsZShIU0hBUkVEIGhTaGFyZWQsIERXT1JEIGR3RHN0UHJvY0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1NyY1Byb2NJZCwgRFdPUkQgZHdBY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3B0aW9ucykKewogIEhBTkRMRSBoRHN0LCBoU3JjOwogIERXT1JEIGR3TXlQcm9jSWQgPSBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7CiAgSFNIQVJFRCBoUmV0ID0gKEhTSEFSRUQpTlVMTDsKCiAgVFJBQ0UoIiglcCwlbGQsJWxkLCUwOGx4LCUwOGx4KVxuIiwgKFBWT0lEKWhTaGFyZWQsIGR3RHN0UHJvY0lkLCBkd1NyY1Byb2NJZCwKICAgICAgICBkd0FjY2VzcywgZHdPcHRpb25zKTsKCiAgLyogR2V0IGRlc3QgcHJvY2VzcyBoYW5kbGUgKi8KICBpZiAoZHdEc3RQcm9jSWQgPT0gZHdNeVByb2NJZCkKICAgIGhEc3QgPSBHZXRDdXJyZW50UHJvY2VzcygpOwogIGVsc2UKICAgIGhEc3QgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX0RVUF9IQU5ETEUsIDAsIGR3RHN0UHJvY0lkKTsKCiAgaWYgKGhEc3QpCiAgewogICAgLyogR2V0IHNyYyBwcm9jZXNzIGhhbmRsZSAqLwogICAgaWYgKGR3U3JjUHJvY0lkID09IGR3TXlQcm9jSWQpCiAgICAgIGhTcmMgPSBHZXRDdXJyZW50UHJvY2VzcygpOwogICAgZWxzZQogICAgICBoU3JjID0gT3BlblByb2Nlc3MoUFJPQ0VTU19EVVBfSEFORExFLCAwLCBkd1NyY1Byb2NJZCk7CgogICAgaWYgKGhTcmMpCiAgICB7CiAgICAgIC8qIE1ha2UgaGFuZGxlIGF2YWlsYWJsZSB0byBkZXN0IHByb2Nlc3MgKi8KICAgICAgaWYgKCFEdXBsaWNhdGVIYW5kbGUoaERzdCwgKEhBTkRMRSloU2hhcmVkLCBoU3JjLCAmaFJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdBY2Nlc3MsIDAsIGR3T3B0aW9ucyB8IERVUExJQ0FURV9TQU1FX0FDQ0VTUykpCiAgICAgICAgaFJldCA9IChIU0hBUkVEKU5VTEw7CgogICAgICBpZiAoZHdTcmNQcm9jSWQgIT0gZHdNeVByb2NJZCkKICAgICAgICBDbG9zZUhhbmRsZShoU3JjKTsKICAgIH0KCiAgICBpZiAoZHdEc3RQcm9jSWQgIT0gZHdNeVByb2NJZCkKICAgICAgQ2xvc2VIYW5kbGUoaERzdCk7CiAgfQoKICBUUkFDRSgiUmV0dXJuaW5nIGhhbmRsZSAlcFxuIiwgKFBWT0lEKWhSZXQpOwogIHJldHVybiBoUmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAICBbU0hMV0FQSS43XQogKgogKiBDcmVhdGUgYSBibG9jayBvZiBzaGFyYWJsZSBtZW1vcnkgYW5kIGluaXRpYWxpc2UgaXQgd2l0aCBkYXRhLgogKgogKiBQQVJBTVMKICogZHdQcm9jSWQgW0ldIElEIG9mIHByb2Nlc3Mgb3duaW5nIGRhdGEKICogbHB2RGF0YSAgW0ldIFBvaW50ZXIgdG8gZGF0YSB0byB3cml0ZQogKiBkd1NpemUgICBbSV0gU2l6ZSBvZiBkYXRhCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogQSBzaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBGYWlsdXJlOiBOVUxMCiAqCiAqIE5PVEVTCiAqIE9yZGluYWxzIDctMTEgcHJvdmlkZSBhIHNldCBvZiBjYWxscyB0byBjcmVhdGUgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIGEKICogZ3JvdXAgb2YgcHJvY2Vzc2VzLiBUaGUgc2hhcmVkIG1lbW9yeSBpcyB0cmVhdGVkIG9wYXF1ZWx5IGluIHRoYXQgaXRzIHNpemUKICogaXMgbm90IGV4cG9zZWQgdG8gY2xpZW50cyB3aG8gbWFwIGl0LiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nCiAqIHRoZSBzaXplIG9mIHRoZSBtYXAgYXMgdGhlIGZpcnN0IERXT1JEIG9mIG1hcHBlZCBkYXRhLCBhbmQgdGhlbiBvZmZzZXR0aW5nCiAqIHRoZSB2aWV3IHBvaW50ZXIgcmV0dXJuZWQgYnkgdGhpcyBzaXplLgogKgogKiBTSExXQVBJXzcvU0hMV0FQSV8xMCAtIENyZWF0ZS9EZXN0cm95IHRoZSBzaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBTSExXQVBJXzgvU0hMV0FQSV85ICAtIEdldC9SZWxlYXNlIGEgcG9pbnRlciB0byB0aGUgc2hhcmVkIGRhdGEKICogU0hMV0FQSV8xMSAgICAgICAgICAgLSBIZWxwZXIgZnVuY3Rpb247IER1cGxpY2F0ZSBjcm9zcy1wcm9jZXNzIGhhbmRsZXMKICAgKi8KSFNIQVJFRCBXSU5BUEkgU0hMV0FQSV83IChEV09SRCBkd1Byb2NJZCwgRFdPUkQgZHdTaXplLCBMUENWT0lEIGxwdkRhdGEpCnsKICBIQU5ETEUgaE1hcDsKICBMUFZPSUQgcE1hcHBlZDsKICBIU0hBUkVEIGhSZXQgPSAoSFNIQVJFRClOVUxMOwoKICBUUkFDRSgiKCVsZCwlcCwlbGQpXG4iLCBkd1Byb2NJZCwgbHB2RGF0YSwgZHdTaXplKTsKCiAgLyogQ3JlYXRlIGZpbGUgbWFwcGluZyBvZiB0aGUgY29ycmVjdCBsZW5ndGggKi8KICBoTWFwID0gQ3JlYXRlRmlsZU1hcHBpbmdBKElOVkFMSURfSEFORExFX1ZBTFVFLCBOVUxMLCBGSUxFX01BUF9SRUFELCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTaXplICsgc2l6ZW9mKGR3U2l6ZSksIE5VTEwpOwogIGlmICghaE1hcCkKICAgIHJldHVybiBoUmV0OwoKICAvKiBHZXQgYSB2aWV3IGluIG91ciBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UgKi8KICBwTWFwcGVkID0gTWFwVmlld09mRmlsZShoTWFwLCBGSUxFX01BUF9SRUFEIHwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOwoKICBpZiAocE1hcHBlZCkKICB7CiAgICAvKiBXcml0ZSBzaXplIG9mIGRhdGEsIGZvbGxvd2VkIGJ5IHRoZSBkYXRhLCB0byB0aGUgdmlldyAqLwogICAgKigoRFdPUkQqKXBNYXBwZWQpID0gZHdTaXplOwogICAgaWYgKGR3U2l6ZSkKICAgICAgbWVtY3B5KChjaGFyICopIHBNYXBwZWQgKyBzaXplb2YoZHdTaXplKSwgbHB2RGF0YSwgZHdTaXplKTsKCiAgICAvKiBSZWxlYXNlIHZpZXcuIEFsbCBmdXJ0aGVyIHZpZXdzIG1hcHBlZCB3aWxsIGJlIG9wYXF1ZSAqLwogICAgVW5tYXBWaWV3T2ZGaWxlKHBNYXBwZWQpOwogICAgaFJldCA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKChIU0hBUkVEKWhNYXAsIGR3UHJvY0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzSWQoKSwgRklMRV9NQVBfQUxMX0FDQ0VTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpOwogIH0KCiAgQ2xvc2VIYW5kbGUoaE1hcCk7CiAgcmV0dXJuIGhSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAgW1NITFdBUEkuOF0KICoKICogR2V0IGEgcG9pbnRlciB0byBhIGJsb2NrIG9mIHNoYXJlZCBtZW1vcnkgZnJvbSBhIHNoYXJlZCBtZW1vcnkgaGFuZGxlLgogKgogKiBQQVJBTVMKICogaFNoYXJlZCAgW0ldIFNoYXJlZCBtZW1vcnkgaGFuZGxlCiAqIGR3UHJvY0lkIFtJXSBJRCBvZiBwcm9jZXNzIG93bmluZyBoU2hhcmVkCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogQSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5CiAqIEZhaWx1cmU6IE5VTEwKICoKICogTk9URVMKICogU2VlIFNITFdBUElfNy4KICAgKi8KUFZPSUQgV0lOQVBJIFNITFdBUElfOCAoSFNIQVJFRCBoU2hhcmVkLCBEV09SRCBkd1Byb2NJZCkKICB7CiAgSFNIQVJFRCBoRHVwOwogIExQVk9JRCBwTWFwcGVkOwoKICBUUkFDRSgiKCVwICVsZClcbiIsIChQVk9JRCloU2hhcmVkLCBkd1Byb2NJZCk7CgogIC8qIEdldCBoYW5kbGUgdG8gc2hhcmVkIG1lbW9yeSBmb3IgY3VycmVudCBwcm9jZXNzICovCiAgaER1cCA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKGhTaGFyZWQsIGR3UHJvY0lkLCBHZXRDdXJyZW50UHJvY2Vzc0lkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfTUFQX0FMTF9BQ0NFU1MsIDApOwogIC8qIEdldCBWaWV3ICovCiAgcE1hcHBlZCA9IE1hcFZpZXdPZkZpbGUoKEhBTkRMRSloRHVwLCBGSUxFX01BUF9SRUFEIHwgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOwogIENsb3NlSGFuZGxlKGhEdXApOwoKICBpZiAocE1hcHBlZCkKICAgIHJldHVybiAoY2hhciAqKSBwTWFwcGVkICsgc2l6ZW9mKERXT1JEKTsgLyogSGlkZSBzaXplICovCiAgcmV0dXJuIE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEAgW1NITFdBUEkuOV0KICoKICogUmVsZWFzZSBhIHBvaW50ZXIgdG8gYSBibG9jayBvZiBzaGFyZWQgbWVtb3J5LgogKgogKiBQQVJBTVMKICogbHBWaWV3IFtJXSBTaGFyZWQgbWVtb3J5IHBvaW50ZXIKICoKICogUkVUVVJOUwogKiBTdWNjZXNzOiBUUlVFCiAqIEZhaWx1cmU6IEZBTFNFCiAqCiAqIE5PVEVTCiAqIFNlZSBTSExXQVBJXzcuCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzkgKExQVk9JRCBscFZpZXcpCnsKICBUUkFDRSgiKCVwKVxuIiwgbHBWaWV3KTsKICByZXR1cm4gVW5tYXBWaWV3T2ZGaWxlKChjaGFyICopIGxwVmlldyAtIHNpemVvZihEV09SRCkpOyAvKiBJbmNsdWRlIHNpemUgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQCBbU0hMV0FQSS4xMF0KICoKICogRGVzdHJveSBhIGJsb2NrIG9mIHNoYXJhYmxlIG1lbW9yeS4KICoKICogUEFSQU1TCiAqIGhTaGFyZWQgIFtJXSBTaGFyZWQgbWVtb3J5IGhhbmRsZQogKiBkd1Byb2NJZCBbSV0gSUQgb2YgcHJvY2VzcyBvd25pbmcgaFNoYXJlZAogKgogKiBSRVRVUk5TCiAqIFN1Y2Nlc3M6IFRSVUUKICogRmFpbHVyZTogRkFMU0UKICoKICogTk9URVMKICogU2VlIFNITFdBUElfNy4KICovCkJPT0wgV0lOQVBJIFNITFdBUElfMTAgKEhTSEFSRUQgaFNoYXJlZCwgRFdPUkQgZHdQcm9jSWQpCnsKICBIU0hBUkVEIGhDbG9zZTsKCiAgVFJBQ0UoIiglcCAlbGQpXG4iLCAoUFZPSUQpaFNoYXJlZCwgZHdQcm9jSWQpOwoKICAvKiBHZXQgYSBjb3B5IG9mIHRoZSBoYW5kbGUgZm9yIG91ciBwcm9jZXNzLCBjbG9zaW5nIHRoZSBzb3VyY2UgaGFuZGxlICovCiAgaENsb3NlID0gU0hMV0FQSV9EdXBTaGFyZWRIYW5kbGUoaFNoYXJlZCwgZHdQcm9jSWQsIEdldEN1cnJlbnRQcm9jZXNzSWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTLERVUExJQ0FURV9DTE9TRV9TT1VSQ0UpOwogIC8qIENsb3NlIGxvY2FsIGNvcHkgKi8KICByZXR1cm4gQ2xvc2VIYW5kbGUoKEhBTkRMRSloQ2xvc2UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBAICAgW1NITFdBUEkuMTFdCiAqCiAqIENvcHkgYSBzaGFyYWJsZSBtZW1vcnkgaGFuZGxlIGZyb20gb25lIHByb2Nlc3MgdG8gYW5vdGhlci4KICoKICogUEFSQU1TCiAqIGhTaGFyZWQgICAgIFtJXSBTaGFyZWQgbWVtb3J5IGhhbmRsZSB0byBkdXBsaWNhdGUKICogZHdEc3RQcm9jSWQgW0ldIElEIG9mIHRoZSBwcm9jZXNzIHdhbnRpbmcgdGhlIGR1cGxpY2F0ZWQgaGFuZGxlCiAqIGR3U3JjUHJvY0lkIFtJXSBJRCBvZiB0aGUgcHJvY2VzcyBvd25pbmcgaFNoYXJlZAogKiBkd0FjY2VzcyAgICBbSV0gRGVzaXJlZCBEdXBsaWNhdGVIYW5kbGUgYWNjZXNzCiAqIGR3T3B0aW9ucyAgIFtJXSBEZXNpcmVkIER1cGxpY2F0ZUhhbmRsZSBvcHRpb25zCiAqCiAqIFJFVFVSTlMKICogU3VjY2VzczogQSBoYW5kbGUgc3VpdGFibGUgZm9yIHVzZSBieSB0aGUgZHdEc3RQcm9jSWQgcHJvY2Vzcy4KICogRmFpbHVyZTogQSBOVUxMIGhhbmRsZS4KICoKICogTk9URVMKICogU2VlIFNITFdBUElfNy4KICovCkhTSEFSRUQgV0lOQVBJIFNITFdBUElfMTEoSFNIQVJFRCBoU2hhcmVkLCBEV09SRCBkd0RzdFByb2NJZCwgRFdPUkQgZHdTcmNQcm9jSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdBY2Nlc3MsIERXT1JEIGR3T3B0aW9ucykKewogIEhTSEFSRUQgaFJldDsKCiAgaFJldCA9IFNITFdBUElfRHVwU2hhcmVkSGFuZGxlKGhTaGFyZWQsIGR3RHN0UHJvY0lkLCBkd1NyY1Byb2NJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdBY2Nlc3MsIGR3T3B0aW9ucyk7CiAgcmV0dXJuIGhSZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xM10KICogKFVzZWQgYnkgSUU0IGR1cmluZyBzdGFydHVwKQogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xMyAoCglMUFZPSUQgdywKCUxQVk9JRCB4KQp7CglGSVhNRSgiKCVwICVwKXN0dWJcbiIsdyx4KTsKCXJldHVybiAxOwojaWYgMAoJLyogcHNldWRvIGNvZGUgZXh0cmFjdGVkIGZyb20gcmVsYXkgdHJhY2UgKi8KCVJlZ09wZW5LZXlBKEhLTE0sICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcSW50ZXJuZXQgU2V0dGluZ3NcXEFjZWVwdGVkIERvY3VtZW50cyIsICZuZXdrZXkpOwoJcmV0ID0gMDsKCWkgPSAwOwoJc2l6ZSA9IDA7Cgl3aGlsZSghcmV0KSB7CgkgICAgcmV0ID0gUmVnRW51bVZhbHVlQShuZXdrZXksIGksIGExLCBhMiwgMCwgYTMsIDAsIDApOwoJICAgIHNpemUgKz0gPz8/OwoJICAgIGkrKzsKCX0KCWIxID0gTG9jYWxBbGxvYygweDQwLCBzaXplKTsKCXJldCA9IDA7CglpID0gMDsKCXdoaWxlKCFyZXQpIHsKCSAgICByZXQgPSBSZWdFbnVtVmFsdWVBKG5ld2tleSwgaSwgYTEsIGEyLCAwLCBhMywgYTQsIGE1KTsKCSAgICBSZWdpc3RlckNsaXBCb2FyZEZvcm1hdEEoYTQpOwoJICAgIGkrKzsKCX0KCWh3bmQxID0gR2V0TW9kdWxlSGFuZGxlQSgiVVJMTU9OLkRMTCIpOwoJcHJvYyA9IEdldFByb2NBZGRyZXNzKGh3bmQxLCAiQ3JlYXRlRm9ybWF0RW51bWVyYXRvciIpOwoJSGVhcEFsbG9jKD8/LCAwLCAweDE0KTsKCUhlYXBBbGxvYyg/PywgMCwgMHg1MCk7CglMb2NhbEFsbG9jKDB4NDAsIDB4NzgpOwoJLyogRklYTUU6IGJhZCBzdHJpbmcgYmVsb3cgKi8KCWxzdHJsZW5XKEwie0QwRkNBNDIwLUQzRjUtMTFDRi1CMjExLTAwQUEwMDRBRTgzN30iKTsKCVN0ckNweVcoYTYsICBMIntEMEZDQTQyMC1EM0Y1LTExQ0YtQjIxMS0wMEFBMDA0QUU4Mzd9Iik7CgoJR2V0VGlja0NvdW50KCk7CglJc0JhZFJlYWRQdHIoYzEgPSAweDQwM2ZkMjEwLDQpOwoJSW50ZXJsb2NrZWRJbmNyZW1lbnQoYzErNCk7CglMb2NhbEZyZWUoYjEpOwoJUmVnQ2xvc2VLZXkobmV3a2V5KTsKCUlzQmFkUmVhZFB0cihjMSA9IDB4NDAzZmQyMTAsNCk7CglJbnRlcmxvY2tlZEluY3JlbWVudChjMSs0KTsKCglIZWFwQWxsb2MoNDAzNTAwMDAsMDAwMDAwMDAsMDAwMDAwMTQpIHJldHZhbD00MDNmZDBhODsKCUhlYXBBbGxvYyg0MDM1MDAwMCwwMDAwMDAwMCwwMDAwMDA1MCkgcmV0dmFsPTQwM2ZlYjQ0OwoJaHduZDEgPSBHZXRNb2R1bGVIYW5kbGVBKCJVUkxNT04uRExMIik7Cglwcm9jID0gR2V0UHJvY0FkZHJlc3MoaHduZDEsICJSZWdpc3RlckZvcm1hdEVudW1lcmF0b3IiKTsKCS8qIDB4MWE0MGM4OGMgaXMgaW4gVVJMTU9OLkRMTCBqdXN0IGJlZm9yZSBhYm92ZSBwcm9jCgkgKiBjb250ZW50IGlzIEwiX0VudW1GT1JNQVRFVENfIgoJICogbGFiZWwgaXMgZDEKCSAqLwogICAgICAgIElzQmFkUmVhZFB0cihkMSA9IDB4MWE0MGM4OGMsMDAwMDAwMDIpOwoJbHN0cmxlblcoZDEpOwoJbHN0cmxlblcoZDEpOwoJSGVhcEFsbG9jKDQwMzUwMDAwLDAwMDAwMDAwLDAwMDAwMDFlKSByZXR2YWw9NDAzZmVkNDQ7CglJc0JhZFJlYWRQdHIoZDIgPSAweDQwM2ZkMGE4LDAwMDAwMDA0KTsKCUludGVybG9ja2VkSW5jcmVtZW50KGQyKzQpOwoJSXNCYWRSZWFkUHRyKGQyID0gMHg0MDNmZDBhOCwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChkMis0KTsKCUlzQmFkUmVhZFB0cihjMSwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChjMSs0KTsKCUlzQmFkUmVhZFB0cihjMSwwMDAwMDAwNCk7CglJbnRlcmxvY2tlZERlY3JlbWVudChjMSs0KTsKCiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTRdCiAqCiAqIEZ1bmN0aW9uOgogKiAgICBSZXRyaWV2ZXMgSUUgIkFjY2VwdExhbmd1YWdlIiB2YWx1ZSBmcm9tIHJlZ2lzdHJ5LiBBU0NJSSBtb2RlLgogKiAgCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzE0ICgKCUxQU1RSIGxhbmdidWYsCglMUERXT1JEIGJ1ZmxlbikKewoJQ0hBUiAqbXlzdHI7CglEV09SRCBteXN0cmxlbiwgbXl0eXBlOwoJSEtFWSBteWtleTsKCUxDSUQgbXlsY2lkOwoKCW15c3RybGVuID0gKCpidWZsZW4gPiA2KSA/ICpidWZsZW4gOiA2OwoJbXlzdHIgPSAoQ0hBUiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIAoJCQkJIEhFQVBfWkVST19NRU1PUlksIG15c3RybGVuKTsKCVJlZ09wZW5LZXlBKEhLRVlfQ1VSUkVOVF9VU0VSLCAKCQkgICAgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXEludGVybmV0IEV4cGxvcmVyXFxJbnRlcm5hdGlvbmFsIiwgCgkJICAgICZteWtleSk7CglpZiAoUmVnUXVlcnlWYWx1ZUV4QShteWtleSwgIkFjY2VwdExhbmd1YWdlIiwgCgkJCSAgICAgIDAsICZteXR5cGUsIG15c3RyLCAmbXlzdHJsZW4pKSB7CgkgICAgLyogRGlkIG5vdCBmaW5kIHZhbHVlICovCgkgICAgbXlsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICAgLyogc29tZWhvdyB0aGUgbXlsY2lkIHRyYW5zbGF0ZXMgaW50byAiZW4tdXMiCgkgICAgICogIHRoaXMgaXMgc2ltaWxhciB0byAiTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSIKCSAgICAgKiAgd2hpY2ggY291bGQgYmUgZ290dGVuIHZpYSBHZXRMb2NhbGVJbmZvLgoJICAgICAqICBUaGUgb25seSBwcm9ibGVtIGlzIExPQ0FMRV9TQUJCUkVWTEFOR1VBR0UiIGlzCgkgICAgICogIGEgMyBjaGFyIHN0cmluZyAoZmlyc3QgMiBhcmUgY291bnRyeSBjb2RlIGFuZCB0aGlyZCBpcwoJICAgICAqICBsZXR0ZXIgZm9yICJzdWJsYW5ndWFnZSIsIHdoaWNoIGRvZXMgbm90IGNvbWUgY2xvc2UgdG8KCSAgICAgKiAgImVuLXVzIgoJICAgICAqLwoJICAgIGxzdHJjcHlBKG15c3RyLCAiZW4tdXMiKTsKCSAgICBteXN0cmxlbiA9IGxzdHJsZW5BKG15c3RyKTsKCX0KCWVsc2UgewoJICAgIC8qIGhhbmRsZSByZXR1cm5lZCBzdHJpbmcgKi8KCSAgICBGSVhNRSgibWlzc2luZyBjb2RlXG4iKTsKCX0KCWlmIChteXN0cmxlbiA+ICpidWZsZW4pIAoJICAgIGxzdHJjcHluQShsYW5nYnVmLCBteXN0ciwgKmJ1Zmxlbik7CgllbHNlIHsKCSAgICBsc3RyY3B5QShsYW5nYnVmLCBteXN0cik7CgkgICAgKmJ1ZmxlbiA9IGxzdHJsZW5BKGxhbmdidWYpOwoJfSAgICAgICAgCglSZWdDbG9zZUtleShteWtleSk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBteXN0cik7CglUUkFDRSgibGFuZ3VhZ2UgaXMgJXNcbiIsIGRlYnVnc3RyX2EobGFuZ2J1ZikpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNV0KICoKICogRnVuY3Rpb246CiAqICAgIFJldHJpZXZlcyBJRSAiQWNjZXB0TGFuZ3VhZ2UiIHZhbHVlIGZyb20gcmVnaXN0cnkuIFVOSUNPREUgbW9kZS4KICogIAogKi8KSFJFU1VMVCBXSU5BUEkgU0hMV0FQSV8xNSAoCglMUFdTVFIgbGFuZ2J1ZiwKCUxQRFdPUkQgYnVmbGVuKQp7CglDSEFSICpteXN0cjsKCURXT1JEIG15c3RybGVuLCBteXR5cGU7CglIS0VZIG15a2V5OwoJTENJRCBteWxjaWQ7CgoJbXlzdHJsZW4gPSAoKmJ1ZmxlbiA+IDYpID8gKmJ1ZmxlbiA6IDY7CglteXN0ciA9IChDSEFSKilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgCgkJCQkgSEVBUF9aRVJPX01FTU9SWSwgbXlzdHJsZW4pOwoJUmVnT3BlbktleUEoSEtFWV9DVVJSRU5UX1VTRVIsIAoJCSAgICAiU29mdHdhcmVcXE1pY3Jvc29mdFxcSW50ZXJuZXQgRXhwbG9yZXJcXEludGVybmF0aW9uYWwiLCAKCQkgICAgJm15a2V5KTsKCWlmIChSZWdRdWVyeVZhbHVlRXhBKG15a2V5LCAiQWNjZXB0TGFuZ3VhZ2UiLCAKCQkJICAgICAgMCwgJm15dHlwZSwgbXlzdHIsICZteXN0cmxlbikpIHsKCSAgICAvKiBEaWQgbm90IGZpbmQgdmFsdWUgKi8KCSAgICBteWxjaWQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgICAvKiBzb21laG93IHRoZSBteWxjaWQgdHJhbnNsYXRlcyBpbnRvICJlbi11cyIKCSAgICAgKiAgdGhpcyBpcyBzaW1pbGFyIHRvICJMT0NBTEVfU0FCQlJFVkxBTkdOQU1FIgoJICAgICAqICB3aGljaCBjb3VsZCBiZSBnb3R0ZW4gdmlhIEdldExvY2FsZUluZm8uCgkgICAgICogIFRoZSBvbmx5IHByb2JsZW0gaXMgTE9DQUxFX1NBQkJSRVZMQU5HVUFHRSIgaXMKCSAgICAgKiAgYSAzIGNoYXIgc3RyaW5nIChmaXJzdCAyIGFyZSBjb3VudHJ5IGNvZGUgYW5kIHRoaXJkIGlzCgkgICAgICogIGxldHRlciBmb3IgInN1Ymxhbmd1YWdlIiwgd2hpY2ggZG9lcyBub3QgY29tZSBjbG9zZSB0bwoJICAgICAqICAiZW4tdXMiCgkgICAgICovCgkgICAgbHN0cmNweUEobXlzdHIsICJlbi11cyIpOwoJICAgIG15c3RybGVuID0gbHN0cmxlbkEobXlzdHIpOwoJfQoJZWxzZSB7CgkgICAgLyogaGFuZGxlIHJldHVybmVkIHN0cmluZyAqLwoJICAgIEZJWE1FKCJtaXNzaW5nIGNvZGVcbiIpOwoJfQoJUmVnQ2xvc2VLZXkobXlrZXkpOwoJKmJ1ZmxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoMCwgMCwgbXlzdHIsIC0xLCBsYW5nYnVmLCAoKmJ1ZmxlbiktMSk7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBteXN0cik7CglUUkFDRSgibGFuZ3VhZ2UgaXMgJXNcbiIsIGRlYnVnc3RyX3cobGFuZ2J1ZikpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNl0KICovCkhSRVNVTFQgV0lOQVBJIFNITFdBUElfMTYgKAoJTFBWT0lEIHcsCglMUFZPSUQgeCwKCUxQVk9JRCB5LAoJTFBXU1RSIHopCnsKCUZJWE1FKCIoJXAgJXAgJXAgJXApc3R1YlxuIix3LHgseSx6KTsKCXJldHVybiAweGFiYmExMjUyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMThdCiAqCiAqICB3IGlzIHBvaW50ZXIgdG8gYWRkcmVzcyBvZiBjYWxsYmFjayByb3V0aW5lCiAqICB4IGlzIHBvaW50ZXIgdG8gTFBWT0lEIHRvIHJlY2VpdmUgYWRkcmVzcyBvZiBsb2NhbGx5IGFsbG9jYXRlZAogKiAgICAgICAgIHNwYWNlIHNpemUgMHgxNAogKiAgcmV0dXJuIGlzIDAgKHVubGVzcyBvdXQgb2YgbWVtb3J5Pz8/KQogKgogKiByZWxhdGVkIHRvIF8xOSwgXzIxIGFuZCBfMjIgYmVsb3cKICogIG9ubHkgc2VlbiBpbnZva2VkIGJ5IFNIRE9DVlcKICovCkxPTkcgV0lOQVBJIFNITFdBUElfMTggKAoJTFBWT0lEICp3LAoJTFBWT0lEIHgpCnsKCUZJWE1FKCIoJXAgJXApc3R1YlxuIix3LHgpOwoJKigoTFBEV09SRCl4KSA9IDA7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE5XQogKgogKiAgdyBpcyBhZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBfMjEKICogIHJldHVybiBpcyAwICh1bmxlc3Mgb3V0IG9mIG1lbW9yeT8/PykKICoKICogcmVsYXRlZCB0byBfMTgsIF8yMSBhbmQgXzIyIGJlbG93CiAqICBvbmx5IHNlZW4gaW52b2tlZCBieSBTSERPQ1ZXCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzE5ICgKCUxQVk9JRCB3KQp7CglGSVhNRSgiKCVwKSBzdHViXG4iLHcpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMV0KICoKICogIHcgcG9pbnRzIHRvIHNwYWNlIGFsbG9jYXRlZCB2aWEgLjE4IGFib3ZlCiAqICAgICAgTG9jYWxTaXplIGlzIGRvbmUgb24gaXQgKHJldHJpZXZlcyAxOCkKICogICAgICBMb2NhbFJlQWxsb2MgaXMgZG9uZSBvbiBpdCB0byBzaXplIDggd2l0aCBMTUVNX01PVkVBQkxFICYgTE1FTV9aRVJPSU5JVAogKiAgeCB2YWx1ZXMgc2VlbiAweGEwMDAwMDA1CiAqICByZXR1cm5zIDEKICoKICogIHJlbGF0ZXMgdG8gXzE4LCBfMTkgYW5kIF8yMiBhYm92ZSBhbmQgYmVsb3cKICogICBvbmx5IHNlZW4gaW52b2tlZCBieSBTSERPQ1ZXCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzIxICgKCUxQVk9JRCB3LAoJRFdPUkQgIHgpCnsKCUZJWE1FKCIoJXAgJWx4KXN0dWJcbiIsdyx4KTsKCXJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjJdCiAqCiAqICByZXR1cm4gaXMgJ3cnIHZhbHVlIHNlZW4gaW4geCBpcyAweGEwMDAwMDA1CiAqCiAqICByZWxhdGVzIHRvIF8xOCwgXzE5IGFuZCBfMjEgYWJvdmUKICogICBvbmx5IHNlZW4gaW52b2tlZCBieSBTSERPQ1ZXCiAqLwpMUFZPSUQgV0lOQVBJIFNITFdBUElfMjIgKAoJTFBWT0lEIHcsCglEV09SRCAgeCkKewoJRklYTUUoIiglcCAlbHgpc3R1YlxuIix3LHgpOwoJcmV0dXJuIHc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yM10KICoKICogTk9URVMKICoJY29udmVydHMgYSBndWlkIHRvIGEgc3RyaW5nCiAqCXJldHVybnMgc3RybGVuKHN0cikKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIzICgKCVJFRkdVSUQgZ3VpZCwJLyogW2luXSAgY2xzaWQgKi8KCUxQU1RSIHN0ciwJLyogW291dF0gYnVmZmVyICovCglJTlQgY21heCkJLyogW2luXSAgc2l6ZSBvZiBidWZmZXIgKi8KewoJY2hhciB4Z3VpZFs0MF07CgogICAgICAgIHNwcmludGYoIHhndWlkLCAieyUwOGx4LSUwNHgtJTA0eC0lMDJ4JTAyeC0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhMSwgZ3VpZC0+RGF0YTIsIGd1aWQtPkRhdGEzLAogICAgICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzBdLCBndWlkLT5EYXRhNFsxXSwgZ3VpZC0+RGF0YTRbMl0sIGd1aWQtPkRhdGE0WzNdLAogICAgICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzRdLCBndWlkLT5EYXRhNFs1XSwgZ3VpZC0+RGF0YTRbNl0sIGd1aWQtPkRhdGE0WzddICk7CglUUkFDRSgiKCVzICVwIDB4JTA4eClzdHViXG4iLCB4Z3VpZCwgc3RyLCBjbWF4KTsKCWlmIChzdHJsZW4oeGd1aWQpPj1jbWF4KSByZXR1cm4gMDsKCXN0cmNweShzdHIseGd1aWQpOwoJcmV0dXJuIHN0cmxlbih4Z3VpZCkgKyAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjRdCiAqCiAqIE5PVEVTCiAqCWNvbnZlcnRzIGEgZ3VpZCB0byBhIHN0cmluZwogKglyZXR1cm5zIHN0cmxlbihzdHIpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yNCAoCglSRUZHVUlEIGd1aWQsCS8qIFtpbl0gIGNsc2lkICovCglMUFdTVFIgc3RyLAkvKiBbb3V0XSBidWZmZXIgKi8KCUlOVCBjbWF4KQkvKiBbaW5dICBzaXplIG9mIGJ1ZmZlciAqLwp7CiAgICBjaGFyIHhndWlkWzQwXTsKCiAgICBzcHJpbnRmKCB4Z3VpZCwgInslMDhseC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSIsCiAgICAgICAgICAgICBndWlkLT5EYXRhMSwgZ3VpZC0+RGF0YTIsIGd1aWQtPkRhdGEzLAogICAgICAgICAgICAgZ3VpZC0+RGF0YTRbMF0sIGd1aWQtPkRhdGE0WzFdLCBndWlkLT5EYXRhNFsyXSwgZ3VpZC0+RGF0YTRbM10sCiAgICAgICAgICAgICBndWlkLT5EYXRhNFs0XSwgZ3VpZC0+RGF0YTRbNV0sIGd1aWQtPkRhdGE0WzZdLCBndWlkLT5EYXRhNFs3XSApOwogICAgcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgeGd1aWQsIC0xLCBzdHIsIGNtYXggKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI1XQogKgogKiBTZWVtcyB0byBiZSBpc3dhbHBoYQogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yNShXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9BTFBIQSkgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI2XQogKgogKiBTZWVtcyB0byBiZSBpc3d1cHBlcgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yNihXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9VUFBFUikgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI3XQogKgogKiBTZWVtcyB0byBiZSBpc3dsb3dlcgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yNyhXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9MT1dFUikgIT0gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI4XQogKgogKiBTZWVtcyB0byBiZSBpc3dhbG51bQogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yOChXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiAoQzFfQUxQSEF8QzFfRElHSVQpKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjldCiAqCiAqIFNlZW1zIHRvIGJlIGlzd3NwYWNlCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzI5KFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX1NQQUNFKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzBdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd2JsYW5rCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMwKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX0JMQU5LKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzFdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd3B1bmN0CiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMxKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX1BVTkNUKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzJdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd2NudHJsCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMyKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX0NOVFJMKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzNdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd2RpZ2l0CiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMzKFdDSEFSIHdjKQp7CiAgICByZXR1cm4gKGdldF9jaGFyX3R5cGVXKHdjKSAmIEMxX0RJR0lUKSAhPSAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzRdCiAqCiAqIFNlZW1zIHRvIGJlIGlzd3hkaWdpdAogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zNChXQ0hBUiB3YykKewogICAgcmV0dXJuIChnZXRfY2hhcl90eXBlVyh3YykgJiBDMV9YRElHSVQpICE9IDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNV0KICoKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzUoTFBWT0lEIHAxLCBEV09SRCBkdzIsIExQVk9JRCBwMykKewogICAgRklYTUUoIiglcCwgMHglMDhseCwgJXApOiBzdHViXG4iLCBwMSwgZHcyLCBwMyk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM2XQogKgogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8zNihITUVOVSBoMSwgVUlOVCB1aTIsIFVJTlQgaDMsIExQQ1dTVFIgcDQpCnsKICAgIFRSQUNFKCIoMHglMDh4LCAweCUwOHgsIDB4JTA4eCwgJXMpOiBzdHViXG4iLCAKCSAgaDEsIHVpMiwgaDMsIGRlYnVnc3RyX3cocDQpKTsKICAgIHJldHVybiBBcHBlbmRNZW51VyhoMSwgdWkyLCBoMywgcDQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNzRdCiAqCiAqIEdldCB0aGUgdGV4dCBmcm9tIGEgZ2l2ZW4gZGlhbG9nIGl0ZW0uCiAqLwpJTlQgV0lOQVBJIFNITFdBUElfNzQoSFdORCBoV25kLCBJTlQgbkl0ZW0sIExQV1NUUiBscHNEZXN0LElOVCBuRGVzdExlbikKewogIEhXTkQgaEl0ZW0gPSBHZXREbGdJdGVtKGhXbmQsIG5JdGVtKTsKCiAgaWYgKGhJdGVtKQogICAgcmV0dXJuIEdldFdpbmRvd1RleHRXKGhJdGVtLCBscHNEZXN0LCBuRGVzdExlbik7CiAgaWYgKG5EZXN0TGVuKQogICAgKmxwc0Rlc3QgPSAoV0NIQVIpJ1wwJzsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1MV0KICogRnVuY3Rpb246ICBDb21wYXJlIHR3byBBU0NJSSBzdHJpbmdzIGZvciAibGVuIiBieXRlcy4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2Ugc2Vuc2l0aXZlKQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTUxKExQU1RSIHN0cjEsIExQU1RSIHN0cjIsIElOVCBsZW4pCnsKICAgIHJldHVybiBzdHJuY21wKCBzdHIxLCBzdHIyLCBsZW4gKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1Ml0KICoKICogRnVuY3Rpb246ICBDb21wYXJlIHR3byBXSURFIHN0cmluZ3MgZm9yICJsZW4iIGJ5dGVzLgogKiBSZXR1cm5zOiAgICpzdHIxLSpzdHIyICAoY2FzZSBzZW5zaXRpdmUpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTIoTFBXU1RSIHN0cjEsIExQV1NUUiBzdHIyLCBJTlQgbGVuKQp7CiAgICByZXR1cm4gc3RybmNtcFcoIHN0cjEsIHN0cjIsIGxlbiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTUzXQogKiBGdW5jdGlvbjogIENvbXBhcmUgdHdvIEFTQ0lJIHN0cmluZ3MgZm9yICJsZW4iIGJ5dGVzIHZpYSBjYXNlbGVzcyBjb21wYXJlLgogKiBSZXR1cm5zOiAgICpzdHIxLSpzdHIyICAoY2FzZSBpbnNlbnNpdGl2ZSkKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1MyhMUFNUUiBzdHIxLCBMUFNUUiBzdHIyLCBEV09SRCBsZW4pCnsKICAgIHJldHVybiBzdHJuY2FzZWNtcCggc3RyMSwgc3RyMiwgbGVuICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNTRdCiAqCiAqIEZ1bmN0aW9uOiAgQ29tcGFyZSB0d28gV0lERSBzdHJpbmdzIGZvciAibGVuIiBieXRlcyB2aWEgY2FzZWxlc3MgY29tcGFyZS4KICogUmV0dXJuczogICAqc3RyMS0qc3RyMiAgKGNhc2UgaW5zZW5zaXRpdmUpCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTQoTFBXU1RSIHN0cjEsIExQV1NUUiBzdHIyLCBEV09SRCBsZW4pCnsKICAgIHJldHVybiBzdHJuY21waVcoIHN0cjEsIHN0cjIsIGxlbiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTU1XQogKgogKglDYXNlIHNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZSAoQVNDSUkpLiBEb2VzIG5vdCBTZXRMYXN0RXJyb3IoKS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1NSAoIExQU1RSIHN0cjEsIExQU1RSIHN0cjIpCnsKICAgIHJldHVybiBzdHJjbXAoc3RyMSwgc3RyMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNTZdCiAqCiAqCUNhc2Ugc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJlLiBEb2VzIG5vdCBTZXRMYXN0RXJyb3IoKS4KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzE1NiAoIExQV1NUUiBzdHIxLCBMUFdTVFIgc3RyMikKewogICAgcmV0dXJuIHN0cmNtcFcoIHN0cjEsIHN0cjIgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE1OF0KICoKICoJQ2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZS4gRG9lcyBub3QgU2V0TGFzdEVycm9yKCkuID8/CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNTggKCBMUFdTVFIgc3RyMSwgTFBXU1RSIHN0cjIpCnsKICAgIHJldHVybiBzdHJjbXBpVyggc3RyMSwgc3RyMiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTYyXQogKgogKiBFbnN1cmUgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyIHN0cmluZyBkb2Vzbid0IGVuZCBpbiBhIGhhbmdpbmcgbGVhZCBieXRlLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTYyKExQU1RSIGxwU3RyLCBEV09SRCBzaXplKQp7CiAgaWYgKGxwU3RyICYmIHNpemUpCiAgewogICAgTFBTVFIgbGFzdEJ5dGUgPSBscFN0ciArIHNpemUgLSAxOwoKICAgIHdoaWxlKGxwU3RyIDwgbGFzdEJ5dGUpCiAgICAgIGxwU3RyICs9IElzREJDU0xlYWRCeXRlKCpscFN0cikgPyAyIDogMTsKCiAgICBpZihscFN0ciA9PSBsYXN0Qnl0ZSAmJiBJc0RCQ1NMZWFkQnl0ZSgqbHBTdHIpKQogICAgewogICAgICAqbHBTdHIgPSAnXDAnOwogICAgICBzaXplLS07CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKICB9CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNjRdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNjQgKAoJTFBWT0lEIHUsCglMUFZPSUQgdiwKCUxQVk9JRCB3LAoJTFBWT0lEIHgsCglMUFZPSUQgeSwKCUxQVk9JRCB6KQp7CiAgICAgICAgVFJBQ0UoIiglcCAlcCAlcCAlcCAlcCAlcCkgc3R1YlxuIix1LHYsdyx4LHkseik7CglyZXR1cm4gMHg4MDAwNDAwMjsgICAgLyogRV9OT0lOVEVSRkFDRSAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTY1XQogKgogKiBTZXRXaW5kb3dMb25nQSB3aXRoIG1hc2suCiAqLwpMT05HIFdJTkFQSSBTSExXQVBJXzE2NShIV05EIGh3bmQsIElOVCBvZmZzZXQsIFVJTlQgd0ZsYWdzLCBVSU5UIHdNYXNrKQp7CiAgTE9ORyByZXQgPSBHZXRXaW5kb3dMb25nQShod25kLCBvZmZzZXQpOwogIFVJTlQgbmV3RmxhZ3MgPSAod0ZsYWdzICYgd01hc2spIHwgKHJldCAmIH53RmxhZ3MpOwoKICBpZiAobmV3RmxhZ3MgIT0gcmV0KQogICAgcmV0ID0gU2V0V2luZG93TG9uZ0EoaHduZCwgb2Zmc2V0LCBuZXdGbGFncyk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE2OV0KICoKICogIERvIElVbmtub3duOjpSZWxlYXNlIG9uIHBhc3NlZCBvYmplY3QuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNjkgKElVbmtub3duICoqIGxwVW5rbm93bikKewogICAgICAgIElVbmtub3duICp0ZW1wOwoKCVRSQUNFKCIoJXApXG4iLGxwVW5rbm93bik7CglpZighbHBVbmtub3duIHx8ICEqKChMUERXT1JEKWxwVW5rbm93bikpIHJldHVybiAwOwoJdGVtcCA9ICpscFVua25vd247CgkqbHBVbmtub3duID0gTlVMTDsKCVRSQUNFKCJkb2luZyBSZWxlYXNlXG4iKTsKCXJldHVybiBJVW5rbm93bl9SZWxlYXNlKHRlbXApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTcwXQogKgogKiBTa2lwIFVSTCAnLy8nIHNlcXVlbmNlLgogKi8KTFBDU1RSIFdJTkFQSSBTSExXQVBJXzE3MChMUENTVFIgbHBzelNyYykKewogIGlmIChscHN6U3JjICYmIGxwc3pTcmNbMF0gPT0gJy8nICYmIGxwc3pTcmNbMV0gPT0gJy8nKQogICAgbHBzelNyYyArPSAyOwogIHJldHVybiBscHN6U3JjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMTcyXQogKiBHZXQgd2luZG93IGhhbmRsZSBvZiBPTEUgb2JqZWN0CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNzIgKAoJSVVua25vd24gKnksICAgICAgIC8qIFtpbl0gICBPTEUgb2JqZWN0IGludGVyZmFjZSAqLwoJTFBIV05EIHopICAgICAgICAgIC8qIFtvdXRdICBsb2NhdGlvbiB0byBwdXQgd2luZG93IGhhbmRsZSAqLwp7CiAgICAgICAgRFdPUkQgcmV0OwoJSVVua25vd24gKnB2OwoKICAgICAgICBUUkFDRSgiKCVwICVwKVxuIix5LHopOwoJaWYgKCF5KSByZXR1cm4gRV9GQUlMOwoKCWlmICgocmV0ID0gSVVua25vd25fUXVlcnlJbnRlcmZhY2UoeSwgJklJRF9JT2xlV2luZG93LChMUFZPSUQgKikmcHYpKSA8IDApIHsKCSAgICAvKiBlcnJvciAqLwoJICAgIHJldHVybiByZXQ7Cgl9CglyZXQgPSBJT2xlV2luZG93X0dldFdpbmRvdygoSU9sZVdpbmRvdyAqKXB2LCB6KTsKCUlVbmtub3duX1JlbGVhc2UocHYpOwoJVFJBQ0UoInJlc3VsdCBod25kPSUwOHhcbiIsICp6KTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNzRdCiAqCiAqIFNlZW1zIHRvIGRvIGNhbGwgZWl0aGVyIElPYmplY3RXaXRoU2l0ZTo6U2V0U2l0ZSBvciAKICogICBJUGVyc2lzdE1vbmlrZXI6OkdldENsYXNzSUQuICBCdXQgc2luY2Ugd2UgZG8gbm90IGltcGxlbWVudCBlaXRoZXIKICogICBvZiB0aG9zZSBjbGFzc2VzIGluIG91ciBoZWFkZXJzLCB3ZSB3aWxsIGZha2UgaXQgb3V0LgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTc0KAoJSVVua25vd24gKnAxLCAgICAgLyogW2luXSAgIE9MRSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgTFBWT0lEICpwMikgICAgICAgLyogW291dF0gIHB0ciB0byByZXN1bHQgb2YgZWl0aGVyIEdldENsYXNzSUQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFNldFNpdGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICovCnsKICAgIERXT1JEIHJldCwgYWE7CgogICAgaWYgKCFwMSkgcmV0dXJuIEVfRkFJTDsKCiAgICAvKiBzZWUgaWYgU2V0U2l0ZSBpbnRlcmZhY2UgZXhpc3RzIGZvciBJT2JqZWN0V2l0aFNpdGUgb2JqZWN0ICovCiAgICByZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZSgoSVVua25vd24gKilwMSwgKFJFRklJRClpZDEsIChMUFZPSUQgKikmcDEpOwogICAgVFJBQ0UoImZpcnN0IElVX1FJIHJldD0lMDhseCwgcDE9JXBcbiIsIHJldCwgcDEpOwogICAgaWYgKHJldCkgeyAKCgkvKiBzZWUgaWYgR2V0Q2xhc3NJZCBpbnRlcmZhY2UgZXhpc3RzIGZvciBJUGVyc2lzdE1vbmlrZXIgb2JqZWN0ICovCglyZXQgPSBJVW5rbm93bl9RdWVyeUludGVyZmFjZSgoSVVua25vd24gKilwMSwgKFJFRklJRClpZDIsIChMUFZPSUQgKikmYWEpOwoJVFJBQ0UoInNlY29uZCBJVV9RSSByZXQ9JTA4bHgsIGFhPSUwOGx4XG4iLCByZXQsIGFhKTsKCWlmIChyZXQpIHJldHVybiByZXQ7CgoJLyogZmFrZSBhIEdldENsYXNzSWQgY2FsbCAqLwoJcmV0ID0gSU9sZVdpbmRvd19HZXRXaW5kb3coKElPbGVXaW5kb3cgKilhYSwgKEhXTkQqKXAyKTsKCVRSQUNFKCJzZWNvbmQgSVVfUUkgZG9pbmcgMHgwYyByZXQ9JTA4bHgsICpwMj0lMDhseFxuIiwgcmV0LCAKCSAgICAgICooTFBEV09SRClwMik7CglJVW5rbm93bl9SZWxlYXNlKChJVW5rbm93biAqKWFhKTsKICAgIH0KICAgIGVsc2UgewoJLyogZmFrZSBhIFNldFNpdGUgY2FsbCAqLwoJcmV0ID0gSU9sZVdpbmRvd19HZXRXaW5kb3coKElPbGVXaW5kb3cgKilwMSwgKEhXTkQqKXAyKTsKCVRSQUNFKCJmaXJzdCBJVV9RSSBkb2luZyAweDBjIHJldD0lMDhseCwgKnAyPSUwOGx4XG4iLCByZXQsIAoJICAgICAgKihMUERXT1JEKXAyKTsKCUlVbmtub3duX1JlbGVhc2UoKElVbmtub3duICopcDEpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE3NV0KICoKICoJTk9URToKICoJICBQYXJhbTEgY2FuIGJlIGFuIElTaGVsbEZvbGRlciBPYmplY3QKICovCkhSRVNVTFQgV0lOQVBJIFNITFdBUElfMTc1IChMUFZPSUQgeCwgTFBWT0lEIHkpCnsKCUZJWE1FKCIoJXAgJXApIHN0dWJcbiIsIHgseSk7CglyZXR1cm4gRV9GQUlMOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xNzZdCiAqCiAqIEZ1bmN0aW9uIGFwcGVhcnMgdG8gYmUgaW50ZXJmYWNlIHRvIElTZXJ2aWNlUHJvdmlkZXI6OlF1ZXJ5U2VydmljZQogKgogKiBOT1RFOgogKiAgIHJldHVybnMgRV9OT0lOVEVSRkFDRQogKiAgICAgICAgICAgRV9GQUlMICBpZiB3ID09IDAKICogICAgICAgICAgIFNfT0sgICAgaWYgXzIxOSBjYWxsZWQgc3VjY2Vzc2Z1bGx5CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xNzYgKAoJSVVua25vd24qIHVuaywgICAgLyogW2luXSAgICBvYmplY3QgdG8gZ2l2ZSBTZXJ2aWNlIFByb3ZpZGVyICovCglSRUZHVUlEICAgc2lkLCAgICAvKiBbaW5dICAgIFNlcnZpY2UgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICBSRUZJSUQgICAgcmlpZCwgICAvKiBbaW5dICAgIEZ1bmN0aW9uIHJlcXVlc3RlZCAgICAgICAgICAgICAgKi8KCUxQVk9JRCAgICAqeikgICAgIC8qIFtvdXRdICAgcGxhY2UgdG8gc2F2ZSBpbnRlcmZhY2UgcG9pbnRlciAqLwp7CiAgICBEV09SRCByZXQ7CiAgICBMUFZPSUQgYWE7CiAgICAqeiA9IDA7CiAgICBpZiAoIXVuaykgcmV0dXJuIEVfRkFJTDsKICAgIHJldCA9IElVbmtub3duX1F1ZXJ5SW50ZXJmYWNlKHVuaywgJklJRF9JU2VydmljZVByb3ZpZGVyLCAmYWEpOwogICAgVFJBQ0UoImRpZCBJVV9RSSByZXR2YWw9JTA4bHgsIGFhPSVwXG4iLCByZXQsIGFhKTsgCiAgICBpZiAocmV0KSByZXR1cm4gcmV0OwogICAgcmV0ID0gSVNlcnZpY2VQcm92aWRlcl9RdWVyeVNlcnZpY2UoKElTZXJ2aWNlUHJvdmlkZXIgKilhYSwgc2lkLCByaWlkLCAKCQkJCQkodm9pZCAqKil6KTsKICAgIFRSQUNFKCJkaWQgSVNQX1FTIHJldHZhbD0lMDhseCwgKno9JXBcbiIsIHJldCwgKExQVk9JRCkqeik7IAogICAgSVVua25vd25fUmVsZWFzZSgoSVVua25vd24qKWFhKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xODFdCiAqCiAqCUVuYWJsZSBvciBkaXNhYmxlIGEgbWVudSBpdGVtLgogKi8KVUlOVCBXSU5BUEkgU0hMV0FQSV8xODEoSE1FTlUgaE1lbnUsIFVJTlQgd0l0ZW1JRCwgQk9PTCBiRW5hYmxlKQp7CiAgcmV0dXJuIEVuYWJsZU1lbnVJdGVtKGhNZW51LCB3SXRlbUlELCBiRW5hYmxlID8gTUZfRU5BQkxFRCA6IE1GX0dSQVlFRCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xODNdCiAqCiAqIFJlZ2lzdGVyIGEgd2luZG93IGNsYXNzIGlmIGl0IGlzbid0IGFscmVhZHkuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xODMoV05EQ0xBU1NBICp3bmRjbGFzcykKewogIFdORENMQVNTQSB3Y2E7CiAgaWYgKEdldENsYXNzSW5mb0Eod25kY2xhc3MtPmhJbnN0YW5jZSwgd25kY2xhc3MtPmxwc3pDbGFzc05hbWUsICZ3Y2EpKQogICAgcmV0dXJuIFRSVUU7CiAgcmV0dXJuIChEV09SRClSZWdpc3RlckNsYXNzQSh3bmRjbGFzcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4xOTNdCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8xOTMgKCkKewoJSERDIGhkYzsKCURXT1JEIHJldDsKCglUUkFDRSgiKClcbiIpOwoKCWhkYyA9IEdldERDKDApOwoJcmV0ID0gR2V0RGV2aWNlQ2FwcyhoZGMsIEJJVFNQSVhFTCkgKiBHZXREZXZpY2VDYXBzKGhkYywgUExBTkVTKTsKCVJlbGVhc2VEQygwLCBoZGMpOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjE5OV0KICoKICogQ29weSBpbnRlcmZhY2UgcG9pbnRlcgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMTk5ICgKCUlVbmtub3duICoqZGVzdCwgICAvKiBbb3V0XSBwb2ludGVyIHRvIGNvcHkgb2YgaW50ZXJmYWNlIHB0ciAqLwoJSVVua25vd24gKnNyYykgICAgIC8qIFtpbl0gIGludGVyZmFjZSBwb2ludGVyICovCnsKICAgICAgICBUUkFDRSgiKCVwICVwKVxuIixkZXN0LHNyYyk7CglpZiAoKmRlc3QgIT0gc3JjKSB7CgkgICAgaWYgKCpkZXN0KQoJCUlVbmtub3duX1JlbGVhc2UoKmRlc3QpOwoJICAgIGlmIChzcmMpIHsKCQlJVW5rbm93bl9BZGRSZWYoc3JjKTsKCQkqZGVzdCA9IHNyYzsKCSAgICB9Cgl9CglyZXR1cm4gNDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIwOF0KICoKICogU29tZSBzb3J0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IHByb2Nlc3MgLSBhc3NvY2lhdGVkIHdpdGggXzIxMAogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjA4ICgKCURXT1JEICAgIGEsCglEV09SRCAgICBiLAoJTFBWT0lEICAgYywKCUxQVk9JRCAgIGQsCglEV09SRCAgICBlKQp7CiAgICBGSVhNRSgiKDB4JTA4bHggMHglMDhseCAlcCAlcCAweCUwOGx4KSBzdHViXG4iLAoJICBhLCBiLCBjLCBkLCBlKTsKICAgIHJldHVybiAxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjA5XQogKgogKiBTb21lIHNvcnQgb2YgbWVtb3J5IG1hbmFnZW1lbnQgcHJvY2VzcyAtIGFzc29jaWF0ZWQgd2l0aCBfMjA4CiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMDkgKAoJTFBWT0lEICAgYSkKewogICAgRklYTUUoIiglcCkgc3R1YlxuIiwKCSAgYSk7CiAgICByZXR1cm4gMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxMF0KICoKICogU29tZSBzb3J0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IHByb2Nlc3MgLSBhc3NvY2lhdGVkIHdpdGggXzIwOAogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjEwICgKCUxQVk9JRCAgIGEsCglEV09SRCAgICBiLAoJTFBWT0lEICAgYykKewogICAgRklYTUUoIiglcCAweCUwOGx4ICVwKSBzdHViXG4iLAoJICBhLCBiLCBjKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjExXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjExICgKCUxQVk9JRCAgIGEsCglEV09SRCAgICBiKQp7CiAgICBGSVhNRSgiKCVwIDB4JTA4bHgpIHN0dWJcbiIsCgkgIGEsIGIpOwogICAgcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMTVdCiAqCiAqIE5PVEVTCiAqICBjaGVjayBtZSEKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzIxNSAoCglMUENTVFIgbHBTdHJTcmMsCglMUFdTVFIgbHB3U3RyRGVzdCwKCWludCBsZW4pCnsKCUlOVCBsZW5fYSwgcmV0OwoKCWxlbl9hID0gbHN0cmxlbkEobHBTdHJTcmMpOwoJcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcigwLCAwLCBscFN0clNyYywgbGVuX2EsIGxwd1N0ckRlc3QsIGxlbik7CglUUkFDRSgiJXMgJXMgJWQsIHJldD0lZFxuIiwgCgkgICAgICBkZWJ1Z3N0cl9hKGxwU3RyU3JjKSwgZGVidWdzdHJfdyhscHdTdHJEZXN0KSwgbGVuLCByZXQpOwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIxOF0KICoKICogV2lkZUNoYXJUb011bHRpQnl0ZSB3aXRoIG11bHRpIGxhbmd1YWdlIHN1cHBvcnQuCiAqLwpJTlQgV0lOQVBJIFNITFdBUElfMjE4KFVJTlQgQ29kZVBhZ2UsIExQQ1dTVFIgbHBTcmNTdHIsIExQU1RSIGxwRHN0U3RyLAogICAgICAgICAgICAgICAgICAgICAgIExQSU5UIGxwbk11bHRpQ2hhckNvdW50KQp7CiAgV0NIQVIgZW1wdHlXW10gPSB7ICdcMCcgfTsKICBpbnQgbGVuICwgcmVxTGVuOwogIExQU1RSIG1lbTsKCiAgaWYgKCFscERzdFN0ciB8fCAhbHBuTXVsdGlDaGFyQ291bnQpCiAgICByZXR1cm4gMDsKCiAgaWYgKCFscFNyY1N0cikKICAgIGxwU3JjU3RyID0gZW1wdHlXOwoKICAqbHBEc3RTdHIgPSAnXDAnOwoKICBsZW4gPSBzdHJsZW5XKGxwU3JjU3RyKSArIDE7CgogIHN3aXRjaCAoQ29kZVBhZ2UpCiAgewogIGNhc2UgQ1BfV0lOVU5JQ09ERToKICAgIENvZGVQYWdlID0gQ1BfVVRGODsgLyogRmFsbCB0aHJvdWdoLi4uICovCiAgY2FzZSAweDAwMDBDMzUwOiAvKiBGSVhNRTogQ1BfICNkZWZpbmUgKi8KICBjYXNlIENQX1VURjc6CiAgY2FzZSBDUF9VVEY4OgogICAgewogICAgICBEV09SRCBkd01vZGUgPSAwOwogICAgICBJTlQgbldpZGVDaGFyQ291bnQgPSBsZW4gLSAxOwoKICAgICAgR0VUX0ZVTkMocENvbnZlcnRJTmV0VW5pY29kZVRvTXVsdGlCeXRlLCBtbGFuZywgIkNvbnZlcnRJTmV0VW5pY29kZVRvTXVsdGlCeXRlIiwgMCk7CiAgICAgIGlmICghcENvbnZlcnRJTmV0VW5pY29kZVRvTXVsdGlCeXRlKCZkd01vZGUsIENvZGVQYWdlLCBscFNyY1N0ciwgJm5XaWRlQ2hhckNvdW50LCBscERzdFN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBuTXVsdGlDaGFyQ291bnQpKQogICAgICAgIHJldHVybiAwOwoKICAgICAgaWYgKG5XaWRlQ2hhckNvdW50IDwgbGVuIC0gMSkKICAgICAgewogICAgICAgIG1lbSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKmxwbk11bHRpQ2hhckNvdW50KTsKICAgICAgICBpZiAoIW1lbSkKICAgICAgICAgIHJldHVybiAwOwoKICAgICAgICAqbHBuTXVsdGlDaGFyQ291bnQgPSAwOwoKICAgICAgICBpZiAocENvbnZlcnRJTmV0VW5pY29kZVRvTXVsdGlCeXRlKCZkd01vZGUsIENvZGVQYWdlLCBscFNyY1N0ciwgJmxlbiwgbWVtLCBscG5NdWx0aUNoYXJDb3VudCkpCiAgICAgICAgewogICAgICAgICAgU0hMV0FQSV8xNjIgKG1lbSwgKmxwbk11bHRpQ2hhckNvdW50KTsKICAgICAgICAgIGxzdHJjcHluQShscERzdFN0ciwgbWVtLCAqbHBuTXVsdGlDaGFyQ291bnQgKyAxKTsKICAgICAgICAgIHJldHVybiAqbHBuTXVsdGlDaGFyQ291bnQgKyAxOwogICAgICAgIH0KICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW0pOwogICAgICAgIHJldHVybiAqbHBuTXVsdGlDaGFyQ291bnQ7CiAgICAgIH0KICAgICAgbHBEc3RTdHJbKmxwbk11bHRpQ2hhckNvdW50XSA9ICdcMCc7CiAgICAgIHJldHVybiAqbHBuTXVsdGlDaGFyQ291bnQ7CiAgICB9CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgYnJlYWs7CiAgfQoKICByZXFMZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBscFNyY1N0ciwgbGVuLCBscERzdFN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpscG5NdWx0aUNoYXJDb3VudCwgTlVMTCwgTlVMTCk7CgogIGlmICghcmVxTGVuICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpCiAgewogICAgcmVxTGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDb2RlUGFnZSwgMCwgbHBTcmNTdHIsIGxlbiwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CiAgICBpZiAocmVxTGVuKQogICAgewogICAgICBtZW0gPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHJlcUxlbik7CiAgICAgIGlmIChtZW0pCiAgICAgIHsKICAgICAgICByZXFMZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENvZGVQYWdlLCAwLCBscFNyY1N0ciwgbGVuLCBtZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFMZW4sIE5VTEwsIE5VTEwpOwoKICAgICAgICByZXFMZW4gPSBTSExXQVBJXzE2MihtZW0sICpscG5NdWx0aUNoYXJDb3VudCk7CiAgICAgICAgcmVxTGVuKys7CgogICAgICAgIGxzdHJjcHluQShscERzdFN0ciwgbWVtLCAqbHBuTXVsdGlDaGFyQ291bnQpOwoKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBtZW0pOwogICAgICB9CiAgICB9CiAgfQogIHJldHVybiByZXFMZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMTddCiAqCiAqIEhtbSwgc29tZSBwcm9ncmFtIHVzZWQgbHBuTXVsdGlDaGFyQ291bnQgPT0gMHgzIChhbmQgbHBTcmNTdHIgd2FzICJDIikKICogLS0+IENyYXNoLiBTb21ldGhpbmcgd3JvbmcgaGVyZS4KICoKICogSXQgc2VlbXMgZnJvbSBPRSB2NSB0aGF0IHRoZSB0aGlyZCBwYXJhbSBpcyB0aGUgY291bnQuIChHQSAxMS8yMDAxKQogKi8KSU5UIFdJTkFQSSBTSExXQVBJXzIxNyhMUENXU1RSIGxwU3JjU3RyLCBMUFNUUiBscERzdFN0ciwgSU5UIE11bHRpQ2hhckNvdW50KQp7CiAgICBJTlQgbXlpbnQgPSBNdWx0aUNoYXJDb3VudDsKCiAgICByZXR1cm4gU0hMV0FQSV8yMTgoQ1BfQUNQLCBscFNyY1N0ciwgbHBEc3RTdHIsICZteWludCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMTldCiAqCiAqIFNlZW1zIHRvIGJlICJzdXBlciIgUXVlcnlJbnRlcmZhY2UuIFN1cHBsaWVkIHdpdGggYXQgdGFibGUgb2YgaW50ZXJmYWNlcwogKiBhbmQgYW4gYXJyYXkgb2YgSUlEcyBhbmQgb2Zmc2V0cyBpbnRvIHRoZSB0YWJsZS4KICoKICogTk9URVMKICogIGVycm9yIGNvZGVzOiBFX1BPSU5URVIsIEVfTk9JTlRFUkZBQ0UKICovCnR5cGVkZWYgc3RydWN0IHsKICAgIFJFRklJRCAgIHJlZmlkOwogICAgRFdPUkQgICAgaW5keDsKfSBJRkFDRV9JTkRFWF9UQkw7CgpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzIxOSAoCglMUFZPSUQgdywgICAgICAgICAgIC8qIFtpbl0gICB0YWJsZSBvZiBpbnRlcmZhY2VzICAgICAgICAgICAgICAgICAgICovCglJRkFDRV9JTkRFWF9UQkwgKngsIC8qIFtpbl0gICBhcnJheSBvZiBSRUZJSURzIGFuZCBpbmRleGVzIHRvIGFib3ZlICovCglSRUZJSUQgcmlpZCwgICAgICAgIC8qIFtpbl0gICBSRUZJSUQgdG8gZ2V0IGludGVyZmFjZSBmb3IgICAgICAgICAgICovCglMUFZPSUQgKnopICAgICAgICAgIC8qIFtvdXRdICBsb2NhdGlvbiB0byBnZXQgaW50ZXJmYWNlIHBvaW50ZXIgICAgICovCnsKCUhSRVNVTFQgcmV0OwoJSVVua25vd24gKmFfdnRibDsKCUlGQUNFX0lOREVYX1RCTCAqeG1vdmU7CgoJVFJBQ0UoIiglcCAlcCAlcyAlcClcbiIsCgkgICAgICB3LHgsZGVidWdzdHJfZ3VpZChyaWlkKSx6KTsKCWlmICh6KSB7CgkgICAgeG1vdmUgPSB4OwoJICAgIHdoaWxlICh4bW92ZS0+cmVmaWQpIHsKCQlUUkFDRSgidHJ5aW5nIChpbmR4ICVsZCkgJXNcbiIsIHhtb3ZlLT5pbmR4LCAKCQkgICAgICBkZWJ1Z3N0cl9ndWlkKHhtb3ZlLT5yZWZpZCkpOwoJCWlmIChJc0VxdWFsSUlEKHJpaWQsIHhtb3ZlLT5yZWZpZCkpIHsKCQkgICAgYV92dGJsID0gKElVbmtub3duKikoeG1vdmUtPmluZHggKyAoTFBCWVRFKXcpOwoJCSAgICBUUkFDRSgibWF0Y2hlZCwgcmV0dXJuaW5nICglcClcbiIsIGFfdnRibCk7CgkJICAgICp6ID0gKExQVk9JRClhX3Z0Ymw7CgkJICAgIElVbmtub3duX0FkZFJlZihhX3Z0YmwpOwoJCSAgICByZXR1cm4gU19PSzsKCQl9CgkJeG1vdmUrKzsKCSAgICB9CgoJICAgIGlmIChJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSB7CgkJYV92dGJsID0gKElVbmtub3duKikoeC0+aW5keCArIChMUEJZVEUpdyk7CgkJVFJBQ0UoInJldHVybmluZyBmaXJzdCBmb3IgSVVua25vd24gKCVwKVxuIiwgYV92dGJsKTsKCQkqeiA9IChMUFZPSUQpYV92dGJsOwoJCUlVbmtub3duX0FkZFJlZihhX3Z0YmwpOwoJCXJldHVybiBTX09LOwoJICAgIH0KCSAgICAqeiA9IDA7CgkgICAgcmV0ID0gRV9OT0lOVEVSRkFDRTsKCX0gZWxzZQoJICAgIHJldCA9IEVfUE9JTlRFUjsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMjJdCiAqCiAqIE5PVEVTCiAqICBzZWN1cml0eWF0dHJpYnV0ZXMgbWlzc2luZwogKi8KSEFORExFIFdJTkFQSSBTSExXQVBJXzIyMiAoTFBDTFNJRCBndWlkKQp7CgljaGFyIGxwc3RyTmFtZVs4MF07CgogICAgICAgIHNwcmludGYoIGxwc3RyTmFtZSwgInNoZWxsLnslMDhseC0lMDR4LSUwNHgtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4fSIsCiAgICAgICAgICAgICAgICAgZ3VpZC0+RGF0YTEsIGd1aWQtPkRhdGEyLCBndWlkLT5EYXRhMywKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhNFswXSwgZ3VpZC0+RGF0YTRbMV0sIGd1aWQtPkRhdGE0WzJdLCBndWlkLT5EYXRhNFszXSwKICAgICAgICAgICAgICAgICBndWlkLT5EYXRhNFs0XSwgZ3VpZC0+RGF0YTRbNV0sIGd1aWQtPkRhdGE0WzZdLCBndWlkLT5EYXRhNFs3XSApOwoJRklYTUUoIiglcykgc3R1YlxuIiwgbHBzdHJOYW1lKTsKCXJldHVybiBDcmVhdGVTZW1hcGhvcmVBKE5VTEwsMCwgMHg3ZmZmZmZmZiwgbHBzdHJOYW1lKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIyM10KICoKICogTk9URVMKICogIGdldCB0aGUgY291bnQgb2YgdGhlIHNlbWFwaG9yZQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjIzIChIQU5ETEUgaGFuZGxlKQp7CglEV09SRCBvbGRDb3VudDsKCglGSVhNRSgiKDB4JTA4eCkgc3R1YlxuIixoYW5kbGUpOwoKCVJlbGVhc2VTZW1hcGhvcmUoIGhhbmRsZSwgMSwgJm9sZENvdW50KTsJLyogKzEgKi8KCVdhaXRGb3JTaW5nbGVPYmplY3QoIGhhbmRsZSwgMCApOwkJLyogLTEgKi8KCXJldHVybiBvbGRDb3VudDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjIzNl0KICovCkhNT0RVTEUgV0lOQVBJIFNITFdBUElfMjM2IChSRUZJSUQgbHBVbmtub3duKQp7CiAgICBIS0VZIG5ld2tleTsKICAgIERXT1JEIHR5cGUsIGNvdW50OwogICAgQ0hBUiB2YWx1ZVtNQVhfUEFUSF0sIHN0cmluZ1tNQVhfUEFUSF07CgogICAgc3RyY3B5KHN0cmluZywgIkNMU0lEXFwiKTsKICAgIHN0cmNhdChzdHJpbmcsIGRlYnVnc3RyX2d1aWQobHBVbmtub3duKSk7CiAgICBzdHJjYXQoc3RyaW5nLCAiXFxJblByb2NTZXJ2ZXIzMiIpOwoKICAgIGNvdW50ID0gTUFYX1BBVEg7CiAgICBSZWdPcGVuS2V5RXhBKEhLRVlfQ0xBU1NFU19ST09ULCBzdHJpbmcsIDAsIDEsICZuZXdrZXkpOwogICAgUmVnUXVlcnlWYWx1ZUV4QShuZXdrZXksIDAsIDAsICZ0eXBlLCB2YWx1ZSwgJmNvdW50KTsKICAgIFJlZ0Nsb3NlS2V5KG5ld2tleSk7CiAgICByZXR1cm4gTG9hZExpYnJhcnlFeEEodmFsdWUsIDAsIDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjM3XQogKgogKiBVbmljb2RlIHZlcnNpb24gb2YgU0hMV0FQSV8xODMuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMzcgKFdORENMQVNTVyAqIGxwV25kQ2xhc3MpCnsKCVdORENMQVNTVyBXbmRDbGFzczsKCglUUkFDRSgiKDB4JTA4eCAlcylcbiIsbHBXbmRDbGFzcy0+aEluc3RhbmNlLCBkZWJ1Z3N0cl93KGxwV25kQ2xhc3MtPmxwc3pDbGFzc05hbWUpKTsKCglpZiAoR2V0Q2xhc3NJbmZvVyhscFduZENsYXNzLT5oSW5zdGFuY2UsIGxwV25kQ2xhc3MtPmxwc3pDbGFzc05hbWUsICZXbmRDbGFzcykpCgkJcmV0dXJuIFRSVUU7CglyZXR1cm4gUmVnaXN0ZXJDbGFzc1cobHBXbmRDbGFzcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yMzldCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8yMzkoSElOU1RBTkNFIGhJbnN0YW5jZSwgTFBWT0lEIHAyLCBEV09SRCBkdzMpCnsKICAgIEZJWE1FKCIoMHglMDh4ICVwIDB4JTA4bHgpIHN0dWJcbiIsCgkgIGhJbnN0YW5jZSwgcDIsIGR3Myk7CiAgICByZXR1cm4gMDsKI2lmIDAKICAgIC8qIHBzZXVkbyBjb2RlIGZyb20gcmVsYXkgdHJhY2UgKi8KICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoMCwgMCwgTCJTaGVsbCBEb2NPYmplY3QgVmlldyIsIC0xLCAmYWEsIDB4MDIwNywgMCwgMCk7CiAgICBHZXRDbGFzc0luZm9BKDcwZmUwMDAwLDQwNTg2OGVjICJTaGVsbCBEb2NPYmplY3QgVmlldyIsNDA1ODZiMTQpOwogICAgLyogYWJvdmUgcGFpciByZXBlYXRlZCBmb3I6CiAgICAgICAgICAgVHJpZGVudFRoaWNrZXRVcmxEbENsYXNzCgkgICBTaGVsbCBFbWJlZGRpbmcKCSAgIENJRVNwbGFzaFNjcmVlbgoJICAgSW5ldCBOb3RpZnlfSGlkZGVuCgkgICBPQ0hvc3QKICAgICovCiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjQwXQogKgogKglDYWxscyBBU0NJSSBvciBVbmljb2RlIFdpbmRvd1Byb2MgZm9yIHRoZSBnaXZlbiB3aW5kb3cuCiAqLwpMUkVTVUxUIENBTExCQUNLIFNITFdBUElfMjQwKEhXTkQgaFduZCwgVUlOVCB1TWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKewoJaWYgKElzV2luZG93VW5pY29kZShoV25kKSkKCQlyZXR1cm4gRGVmV2luZG93UHJvY1coaFduZCwgdU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKCXJldHVybiBEZWZXaW5kb3dQcm9jQShoV25kLCB1TWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjQxXQogKgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjQxICgpCnsKCUZJWE1FKCIoKXN0dWJcbiIpOwoJcmV0dXJuIC8qIDB4YWJiYTEyNDMgKi8gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI2Nl0KICoKICogbmF0aXZlIGRvZXMgYXQgbGVhc3QgYXBwcm94aW1hdGVseToKICogICAgIHN0cmNweVcobmV3c3RyLCB4KTsKICogICAgIHN0cmNhdFcobmV3c3RyLCAiXFxSZXN0cmljdGlvbnMiKTsKICogICAgIGlmIChSZWdPcGVuS2V5RXhBKDgwMDAwMDAxLCBuZXdzdHIsIDAwMDAwMDAwLDAwMDAwMDAxLDQwNTIwYjc4KSkKICogICAgICAgIHJldHVybiAwOwogKiAgICAqdW5rbm93bioKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzI2NiAoCglMUFZPSUQgdywKCUxQVk9JRCB4LCAgIC8qIFtpbl0gcGFydGlhbCByZWdpc3RyeSBrZXkgKi8KCUxQVk9JRCB5LAoJTFBWT0lEIHopCnsKCUZJWE1FKCIoJXAgJXAgJXAgJXApc3R1YlxuIix3LHgseSx6KTsKCXJldHVybiAvKiAweGFiYmExMjQ4ICovIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNjddCiAqLwpIUkVTVUxUIFdJTkFQSSBTSExXQVBJXzI2NyAoCglMUFZPSUQgdywgCglMUFZPSUQgeCwgCglMUFZPSUQgeSwgLyogWz8/P10gTk9URTogc2FtZSBhcyAzcmQgcGFyYW1ldGVyIG9mIFNITFdBUElfMjE5ICovCglMUFZPSUQgeikgLyogWz8/P10gTk9URTogc2FtZSBhcyA0dGggcGFyYW1ldGVyIG9mIFNITFdBUElfMjE5ICovCnsKCUZJWE1FKCIoJXAgJXAgJXAgJXApc3R1YlxuIix3LHgseSx6KTsKCgkvKiBuYXRpdmUgc2VlbXMgdG8gZG86CgkgKiAgU0hMV0FQSV8yMTkgKChMUFZPSUQpKCgoTFBTVFIpeCktNCksID8/PywgKFJFRklJRCkgeSwgKExQVk9JRCopIHopOwoJICovCgoJKigoTFBEV09SRCl6KSA9IDB4YWJiYTEyMDA7CglyZXR1cm4gLyogMHhhYmJhMTI1NCAqLyAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjY4XQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMjY4ICgKCUxQVk9JRCB3LAoJTFBWT0lEIHgpCnsKCUZJWE1FKCIoJXAgJXApXG4iLHcseCk7CglyZXR1cm4gMHhhYmJhMTI1MTsgLyogMCA9IGZhaWx1cmUgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjI3Nl0KICoKICogb24gZmlyc3QgY2FsbCBwcm9jZXNzIGRvZXMgZm9sbG93aW5nOiAgb3RoZXIgY2FsbHMganVzdCByZXR1cm5zIDIKICogIGluc3RhbmNlID0gTG9hZExpYnJhcnlBKCJTSEVMTDMyLkRMTCIpOwogKiAgZnVuYyA9IEdldFByb2NBZGRyZXNzKGluc3RhbmNlLCAiRGxsR2V0VmVyc2lvbiIpOwogKiAgcmV0ID0gUmVnT3BlbktleUV4QSg4MDAwMDAwMiwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXEludGVybmV0IEV4cGxvcmVyIiwwMDAwMDAwMCwwMDAyMDAxZiwgbmV3a2V5KTsKICogIHJldCA9IFJlZ1F1ZXJ5VmFsdWVFeEEobmV3a2V5LCAiSW50ZWdyYXRlZEJyb3dzZXIiLDAwMDAwMDAwLDAwMDAwMDAwLDQwNTI1ODhjLDQwNTI1ODkwKTsKICogIFJlZ0Nsb3NlS2V5KG5ld2tleSk7CiAqICBGcmVlTGlicmFyeShpbnN0YW5jZSk7CiAqICByZXR1cm4gMjsKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzI3NiAoKQp7CglGSVhNRSgiKClzdHViXG4iKTsKCXJldHVybiAvKiAweGFiYmExMjQ0ICovIDI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yNzhdCiAqCiAqLwpIV05EIFdJTkFQSSBTSExXQVBJXzI3OCAoCglMT05HIHduZFByb2MsCglIV05EIGhXbmRQYXJlbnQsCglEV09SRCBkd0V4U3R5bGUsCglEV09SRCBkd1N0eWxlLAoJSE1FTlUgaE1lbnUsCglMT05HIHopCnsKCVdORENMQVNTQSB3bmRjbGFzczsKCUhXTkQgaHduZDsKCUhDVVJTT1IgaEN1cnNvcjsKCWNoYXIgKiBjbHNuYW1lID0gIldvcmtlckEiOwoKCUZJWE1FKCIoMHglMDhseCAweCUwOHggMHglMDhseCAweCUwOGx4IDB4JTA4eCAweCUwOGx4KSBwYXJ0aWFsIHN0dWJcbiIsCgkgIHduZFByb2MsaFduZFBhcmVudCxkd0V4U3R5bGUsZHdTdHlsZSxoTWVudSx6KTsKCgloQ3Vyc29yID0gTG9hZEN1cnNvckEoMHgwMDAwMDAwMCxJRENfQVJST1dBKTsKCglpZighR2V0Q2xhc3NJbmZvQShzaGx3YXBpX2hJbnN0YW5jZSwgY2xzbmFtZSwgJnduZGNsYXNzKSkKCXsKCSAgUnRsWmVyb01lbW9yeSgmd25kY2xhc3MsIHNpemVvZihXTkRDTEFTU0EpKTsKCSAgd25kY2xhc3MubHBmblduZFByb2MgPSBEZWZXaW5kb3dQcm9jVzsKCSAgd25kY2xhc3MuY2JXbmRFeHRyYSA9IDQ7CgkgIHduZGNsYXNzLmhJbnN0YW5jZSA9IHNobHdhcGlfaEluc3RhbmNlOwoJICB3bmRjbGFzcy5oQ3Vyc29yID0gaEN1cnNvcjsKCSAgd25kY2xhc3MuaGJyQmFja2dyb3VuZCA9IENPTE9SX0JUTlNIQURPVzsKCSAgd25kY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKCSAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IGNsc25hbWU7CgkgIFJlZ2lzdGVyQ2xhc3NBICgmd25kY2xhc3MpOwoJfQoJaHduZCA9IENyZWF0ZVdpbmRvd0V4QShkd0V4U3R5bGUsIGNsc25hbWUsIDAsZHdTdHlsZSwwLDAsMCwwLGhXbmRQYXJlbnQsCgkJaE1lbnUsc2hsd2FwaV9oSW5zdGFuY2UsMCk7CglTZXRXaW5kb3dMb25nQShod25kLCAwLCB6KTsKCVNldFdpbmRvd0xvbmdBKGh3bmQsIEdXTF9XTkRQUk9DLCB3bmRQcm9jKTsKCXJldHVybiBod25kOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMjg5XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gd2lubW0uUGxheVNvdW5kVwogKi8KQk9PTCBXSU5BUEkgU0hMV0FQSV8yODkoTFBDV1NUUiBwc3pTb3VuZCwgSE1PRFVMRSBobW9kLCBEV09SRCBmZHdTb3VuZCkKewogIEdFVF9GVU5DKHBQbGF5U291bmRXLCB3aW5tbSwgIlBsYXlTb3VuZFciLCBGQUxTRSk7CiAgcmV0dXJuIHBQbGF5U291bmRXKHBzelNvdW5kLCBobW9kLCBmZHdTb3VuZCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4yOTRdCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzI5NChMUFNUUiBzdHIxLCBMUFNUUiBzdHIyLCBMUFNUUiBwU3RyLCBEV09SRCBzb21lX2xlbiwgIExQQ1NUUiBscFN0cjIpCnsKICAgIC8qCiAgICAgKiBzdHIxOgkJIkkiCSJJIglwdXNobCBlc3ArMHgyMAogICAgICogc3RyMjoJCSJVIgkiSSIJcHVzaGwgMHg3N2M5MzgxMAogICAgICogKGlzICJJIiBhbmQgIlUiICJpbnRlZ2VyIiBhbmQgInVuc2lnbmVkIiA/PykKICAgICAqCiAgICAgKiBwU3RyOgkJIiIJIiIJcHVzaGwgZWF4CiAgICAgKiBzb21lX2xlbjoJMHg4MjQJMHgxMDQJcHVzaGwgMHg4MjQKICAgICAqIGxwU3RyMjoJCSIlbCIJIiVsIglwdXNobCBlc3ArMHhjCiAgICAgKgogICAgICogc2hsd2FwaS4gU3RyQ3B5TlcobHBTdHIyLCBpcnJlbGV2YW50X3ZhciwgMHgxMDQpOwogICAgICogTG9jYWxBbGxvYygweDAwLCBzb21lX2xlbikgLT4gaXJyZWxldmFudF92YXIKICAgICAqIExvY2FsQWxsb2MoMHg0MCwgaXJyZWxldmFudF9sZW4pIC0+IHBTdHIKICAgICAqIHNobHdhcGkuMjk0KHN0cjEsIHN0cjIsIHBTdHIsIHNvbWVfbGVuLCBscFN0cjIpOwogICAgICogc2hsd2FwaS5QYXRoUmVtb3ZlQmxhbmtzVyhwU3RyKTsKICAgICAqLwogICAgRVJSKCIoJyVzJywgJyVzJywgJyVzJywgJTA4bHgsICclcycpOiBzdHViIVxuIiwgc3RyMSwgc3RyMiwgcFN0ciwgc29tZV9sZW4sIGxwU3RyMik7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMxM10KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU0hHZXRGaWxlSW5mb1cKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzMxMyhMUENXU1RSIHBhdGgsIERXT1JEIGR3RmlsZUF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBTSEZJTEVJTkZPVyAqcHNmaSwgVUlOVCBzaXplb2Zwc2ZpLCBVSU5UIGZsYWdzKQp7CiAgR0VUX0ZVTkMocFNIR2V0RmlsZUluZm9XLCBzaGVsbDMyLCAiU0hHZXRGaWxlSW5mb1ciLCAwKTsKICByZXR1cm4gcFNIR2V0RmlsZUluZm9XKHBhdGgsIGR3RmlsZUF0dHJpYnV0ZXMsIHBzZmksIHNpemVvZnBzZmksIGZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMxOF0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuRHJhZ1F1ZXJ5RmlsZVcKICovClVJTlQgV0lOQVBJIFNITFdBUElfMzE4KEhEUk9QIGhEcm9wLCBVSU5UIGxGaWxlLCBMUFdTVFIgbHBzekZpbGUsIFVJTlQgbExlbmd0aCkKewogIEdFVF9GVU5DKHBEcmFnUXVlcnlGaWxlVywgc2hlbGwzMiwgIkRyYWdRdWVyeUZpbGVXIiwgMCk7CiAgcmV0dXJuIHBEcmFnUXVlcnlGaWxlVyhoRHJvcCwgbEZpbGUsIGxwc3pGaWxlLCBsTGVuZ3RoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMzM10KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU0hCcm93c2VGb3JGb2xkZXJXCiAqLwpMUElURU1JRExJU1QgV0lOQVBJIFNITFdBUElfMzMzKExQQlJPV1NFSU5GT1cgbHBCaSkKewogIEdFVF9GVU5DKHBTSEJyb3dzZUZvckZvbGRlclcsIHNoZWxsMzIsICJTSEJyb3dzZUZvckZvbGRlclciLCBOVUxMKTsKICByZXR1cm4gcFNIQnJvd3NlRm9yRm9sZGVyVyhscEJpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMzNF0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU0hHZXRQYXRoRnJvbUlETGlzdFcKICovCkJPT0wgV0lOQVBJIFNITFdBUElfMzM0KExQQ0lURU1JRExJU1QgcGlkbCxMUFdTVFIgcHN6UGF0aCkKewogIEdFVF9GVU5DKHBTSEdldFBhdGhGcm9tSURMaXN0Vywgc2hlbGwzMiwgIlNIR2V0UGF0aEZyb21JRExpc3RXIiwgMCk7CiAgcmV0dXJuIHBTSEdldFBhdGhGcm9tSURMaXN0VyhwaWRsLCBwc3pQYXRoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMzNV0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU2hlbGxFeGVjdXRlRXhXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzMzNShMUFNIRUxMRVhFQ1VURUlORk9XIGxwRXhlY0luZm8pCnsKICBHRVRfRlVOQyhwU2hlbGxFeGVjdXRlRXhXLCBzaGVsbDMyLCAiU2hlbGxFeGVjdXRlRXhXIiwgRkFMU0UpOwogIHJldHVybiBwU2hlbGxFeGVjdXRlRXhXKGxwRXhlY0luZm8pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzM2XQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gc2hlbGwzMi5TSEZpbGVPcGVyYXRpb25XLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzM2KExQU0hGSUxFT1BTVFJVQ1RXIGxwRmlsZU9wKQp7CiAgR0VUX0ZVTkMocFNIRmlsZU9wZXJhdGlvblcsIHNoZWxsMzIsICJTSEZpbGVPcGVyYXRpb25XIiwgMCk7CiAgcmV0dXJuIHBTSEZpbGVPcGVyYXRpb25XKGxwRmlsZU9wKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjMzN10KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuRXh0cmFjdEljb25FeFcuCiAqLwpISUNPTiBXSU5BUEkgU0hMV0FQSV8zMzcoTFBDV1NUUiBscHN6RmlsZSwgSU5UIG5JY29uSW5kZXgsIEhJQ09OICpwaGljb25MYXJnZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEhJQ09OICpwaGljb25TbWFsbCwgVUlOVCBuSWNvbnMpCnsKICBHRVRfRlVOQyhwRXh0cmFjdEljb25FeFcsIHNoZWxsMzIsICJFeHRyYWN0SWNvbkV4VyIsIChISUNPTikwKTsKICByZXR1cm4gcEV4dHJhY3RJY29uRXhXKGxwc3pGaWxlLCBuSWNvbkluZGV4LCBwaGljb25MYXJnZSwgcGhpY29uU21hbGwsIG5JY29ucyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNDJdCiAqCiAqLwpMT05HIFdJTkFQSSBTSEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCBQTE9ORyBkZXN0LCBMT05HIHhjaGcsIExPTkcgY29tcGFyZSkKewogICAgICAgIHJldHVybiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZShkZXN0LCB4Y2hnLCBjb21wYXJlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM0Nl0KICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM0NiAoCglMUENXU1RSIHNyYywKCUxQV1NUUiBkZXN0LAoJaW50IGxlbikKewoJRklYTUUoIiglcyAlcCAweCUwOHgpc3R1YlxuIixkZWJ1Z3N0cl93KHNyYyksZGVzdCxsZW4pOwoJbHN0cmNweW5XKGRlc3QsIHNyYywgbGVuKTsKCXJldHVybiBsc3RybGVuVyhkZXN0KSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzUwXQogKgogKiBzZWVtcyB0byBiZSBsYXRlIGJvdW5kIGNhbGwgdG8gR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVcKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM1MCAoCglMUFdTVFIgeCwKCUxQVk9JRCB5KQp7CiAgICAgICAgRFdPUkQgcmV0OwoKCUdFVF9GVU5DKHBHZXRGaWxlVmVyc2lvbkluZm9TaXplVywgdmVyc2lvbiwgIkdldEZpbGVWZXJzaW9uSW5mb1NpemVXIiwgMCk7CglyZXQgPSBwR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVcoeCwgeSk7CglyZXR1cm4gMHgyMDggKyByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNTFdCiAqCiAqIHNlZW1zIHRvIGJlIGxhdGUgYm91bmQgY2FsbCB0byBHZXRGaWxlVmVyc2lvbkluZm9XCiAqLwpCT09MICBXSU5BUEkgU0hMV0FQSV8zNTEgKAoJTFBXU1RSIHcsICAgLyogW2luXSBwYXRoIHRvIGRsbCAqLwoJRFdPUkQgIHgsICAgLyogW2luXSBwYXJtIDIgdG8gR2V0RmlsZVZlcnNpb25JbmZvQSAqLwoJRFdPUkQgIHksICAgLyogW2luXSByZXR1cm4gdmFsdWUgZnJvbSAuMzUwIC0gYXNzdW1lIGxlbmd0aCAqLwoJTFBWT0lEIHopICAgLyogW2luL291dF0gYnVmZmVyICgrMHgyMDggc2VudCB0byBHZXRGaWxlVmVyc2lvbkluZm9BKSAqLwp7CiAgICBHRVRfRlVOQyhwR2V0RmlsZVZlcnNpb25JbmZvVywgdmVyc2lvbiwgIkdldEZpbGVWZXJzaW9uSW5mb1ciLCAwKTsKICAgIHJldHVybiBwR2V0RmlsZVZlcnNpb25JbmZvVyh3LCB4LCB5LTB4MjA4LCB6KzB4MjA4KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM1Ml0KICoKICogc2VlbXMgdG8gYmUgbGF0ZSBib3VuZCBjYWxsIHRvIFZlclF1ZXJ5VmFsdWVXCiAqLwpXT1JEIFdJTkFQSSBTSExXQVBJXzM1MiAoCglMUFZPSUQgdywgICAvKiBbaW5dIGJ1ZmZlciBmcm9tIF8zNTEgKi8KCUxQV1NUUiB4LCAgIC8qIFtpbl0gICB2YWx1ZSB0byByZXRyaWV2ZSAtIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgYW5kIHBhc3NlZCB0byBWZXJRdWVyeVZhbHVlQSBhcyAjMiAqLwoJTFBWT0lEIHksICAgLyogW291dF0gIHZlciBidWZmZXIgLSBwYXNzZWQgdG8gVmVyUXVlcnlWYWx1ZUEgYXMgIzMgKi8KCVVJTlQqICB6KSAgIC8qIFtpbl0gICB2ZXIgbGVuZ3RoIC0gcGFzc2VkIHRvIFZlclF1ZXJ5VmFsdWVBIGFzICM0ICovCnsKICAgIEdFVF9GVU5DKHBWZXJRdWVyeVZhbHVlVywgdmVyc2lvbiwgIlZlclF1ZXJ5VmFsdWVXIiwgMCk7CiAgICByZXR1cm4gcFZlclF1ZXJ5VmFsdWVXKHcrMHgyMDgsIHgsIHksIHopOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBAICAgICAgIFtTSExXQVBJLjM1Nl0KICoKICogICAgICBtYmMgLSB0aGlzIGZ1bmN0aW9uIGlzIHVuZG9jdW1lbnRlZCwgVGhlIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QgYW5kIAogKiAgICAgICAgICAgIHRoZSBjYWxscyB0byBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yIGFuZCAKICogICAgICAgICAgICBTZXRTZWN1cml0eURlc2NyaXB0b3JEYWNsIGFyZSBjb3JyZWN0LCBidXQgYXBwYXJlbnRseSBzb21lIAogKiAgICAgICAgICAgIGFwcHMgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYWxsIHplcm8gcGFyYW1ldGVycy4gCiAqLwoKRFdPUkQgV0lOQVBJIFNITFdBUElfMzU2KFBBQ0wgcERhY2wsIFBTRUNVUklUWV9ERVNDUklQVE9SIHBTRCwgTFBDU1RSICpzdHIpCnsKICBpZihzdHIgIT0gMCl7CiAgICAqc3RyID0gMDsKICB9CgogIGlmKCFwRGFjbCl7CiAgICByZXR1cm4gMDsKICB9CgogIGlmICghSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvcihwU0QsIDEpKSByZXR1cm4gMDsKICByZXR1cm4gU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbChwU0QsIDEsIHBEYWNsLCAwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNTddCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLlNIR2V0TmV3TGlua0luZm9XCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzM1NyhMUENXU1RSIHBzekxpbmtUbywgTFBDV1NUUiBwc3pEaXIsIExQV1NUUiBwc3pOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBCT09MICpwZk11c3RDb3B5LCBVSU5UIHVGbGFncykKewogIEdFVF9GVU5DKHBTSEdldE5ld0xpbmtJbmZvVywgc2hlbGwzMiwgIlNIR2V0TmV3TGlua0luZm9XIiwgRkFMU0UpOwogIHJldHVybiBwU0hHZXROZXdMaW5rSW5mb1cocHN6TGlua1RvLCBwc3pEaXIsIHBzek5hbWUsIHBmTXVzdENvcHksIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNThdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLlNIRGVmRXh0cmFjdEljb25XCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNTgoTFBWT0lEIGFyZzEsIExQVk9JRCBhcmcyLCBMUFZPSUQgYXJnMywgTFBWT0lEIGFyZzQsCiAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgYXJnNSwgTFBWT0lEIGFyZzYpCnsKICBHRVRfRlVOQyhwU0hEZWZFeHRyYWN0SWNvblcsIHNoZWxsMzIsICJTSERlZkV4dHJhY3RJY29uVyIsIDApOwogIHJldHVybiBwU0hEZWZFeHRyYWN0SWNvblcoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNjRdCiAqCiAqIFdyYXBwZXIgZm9yIGxzdHJjcHluQSB3aXRoIHNyYyBhbmQgZHN0IHN3YXBwZWQuCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zNjQoTFBDU1RSIHNyYywgTFBTVFIgZHN0LCBJTlQgbikKewogIGxzdHJjcHluQShkc3QsIHNyYywgbik7CiAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNzBdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBzaGVsbDMyLkV4dHJhY3RJY29uVwogKi8KSElDT04gV0lOQVBJIFNITFdBUElfMzcwKEhJTlNUQU5DRSBoSW5zdGFuY2UsIExQQ1dTVFIgbHBzekV4ZUZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBuSWNvbkluZGV4KQp7CiAgR0VUX0ZVTkMocEV4dHJhY3RJY29uVywgc2hlbGwzMiwgIkV4dHJhY3RJY29uVyIsIChISUNPTikwKTsKICByZXR1cm4gcEV4dHJhY3RJY29uVyhoSW5zdGFuY2UsIGxwc3pFeGVGaWxlTmFtZSwgbkljb25JbmRleCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zNzZdCiAqLwpMQU5HSUQgV0lOQVBJIFNITFdBUElfMzc2ICgpCnsKICAgIEZJWE1FKCIoKSBzdHViXG4iKTsKICAgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIGZvcndhcmQgaW4gdGhlIC5zcGVjIGZpbGUgdG8gdGhlIHdpbjJrIGZ1bmN0aW9uCiAgICAgKiBrZXJuZWwzMi5HZXRVc2VyRGVmYXVsdFVJTGFuZ3VhZ2UsIGhvd2V2ZXIgdGhhdCBmdW5jdGlvbiBpc24ndCB0aGVyZSB5ZXQuCiAgICAgKi8KICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExhbmdJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuMzc3XQogKgogKiBGSVhNRTogTmF0aXZlIGFwcGVhcnMgdG8gZG8gRFBBX0NyZWF0ZSBhbmQgYSBEUEFfSW5zZXJ0UHRyIGZvciAKICogICAgICAgIGVhY2ggY2FsbCBoZXJlLgogKiBGSVhNRTogTmF0aXZlIHNob3dzIGNhbGxzIHRvOgogKiAgU0hSZWdHZXRVU1ZhbHVlIGZvciAiU29mdHdhcmVcTWljcm9zb2Z0XEludGVybmV0IEV4cGxvcmVyXEludGVybmF0aW9uYWwiCiAqICAgICAgICAgICAgICAgICAgICAgIENoZWNrVmVyc2lvbgogKiAgUmVnT3BlbktleUV4QSBmb3IgIkhLTE1cU29mdHdhcmVcTWljcm9zb2Z0XEludGVybmV0IEV4cGxvcmVyIgogKiAgUmVnUXVlcnlWYWx1ZUV4QSBmb3IgIkxQS0luc3RhbGxlZCIKICogIFJlZ0Nsb3NlS2V5CiAqICBSZWdPcGVuS2V5RXhBIGZvciAiSEtDVVxTb2Z0d2FyZVxNaWNyb3NvZnRcSW50ZXJuZXQgRXhwbG9yZXJcSW50ZXJuYXRpb25hbCIKICogIFJlZ1F1ZXJ5VmFsdWVFeEEgZm9yICJSZXNvdXJjZUxvY2FsZSIKICogIFJlZ0Nsb3NlS2V5CiAqICBSZWdPcGVuS2V5RXhBIGZvciAiSEtMTVxTb2Z0d2FyZVxNaWNyb3NvZnRcQWN0aXZlIFNldHVwXEluc3RhbGxlZCBDb21wb25lbnRzXHtndWlkfSIKICogIFJlZ1F1ZXJ5VmFsdWVFeEEgZm9yICJMb2NhbGUiCiAqICBSZWdDbG9zZUtleQogKiAgYW5kIHRoZW4gdGVzdHMgdGhlIExvY2FsZSAoImVuIiBmb3IgbWUpLgogKiAgICAgY29kZSBiZWxvdwogKiAgYWZ0ZXIgdGhlIGNvZGUgdGhlbiBhIERQQV9DcmVhdGUgKGZpcnN0IHRpbWUpIGFuZCBEUEFfSW5zZXJ0UHRyIGFyZSBkb25lLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfMzc3IChMUENTVFIgbmV3X21vZCwgSE1PRFVMRSBpbnN0X2h3bmQsIExQVk9JRCB6KQp7CiAgICBDSEFSIG1vZF9wYXRoWzIqTUFYX1BBVEhdOwogICAgTFBTVFIgcHRyOwoKICAgIEdldE1vZHVsZUZpbGVOYW1lQShpbnN0X2h3bmQsIG1vZF9wYXRoLCAyKk1BWF9QQVRIKTsKICAgIHB0ciA9IHN0cnJjaHIobW9kX3BhdGgsICdcXCcpOwogICAgaWYgKHB0cikgewoJc3RyY3B5KHB0cisxLCBuZXdfbW9kKTsKCVRSQUNFKCJsb2FkaW5nICVzXG4iLCBkZWJ1Z3N0cl9hKG1vZF9wYXRoKSk7CglyZXR1cm4gKERXT1JEKUxvYWRMaWJyYXJ5QShtb2RfcGF0aCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM3OF0KICoKICogIFRoaXMgaXMgVW5pY29kZSB2ZXJzaW9uIG9mIC4zNzcKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM3OCAoCglMUENXU1RSICAgbmV3X21vZCwgICAgICAgICAgLyogW2luXSBuZXcgbW9kdWxlIG5hbWUgICAgICAgICovCglITU9EVUxFICAgaW5zdF9od25kLCAgICAgICAgLyogW2luXSBjYWxsaW5nIG1vZHVsZSBoYW5kbGUgICovCglMUFZPSUQgeikgICAgICAgICAgICAgICAgICAgLyogWz8/P10gNCAqLwp7CiAgICBXQ0hBUiBtb2RfcGF0aFsyKk1BWF9QQVRIXTsKICAgIExQV1NUUiBwdHI7CgogICAgR2V0TW9kdWxlRmlsZU5hbWVXKGluc3RfaHduZCwgbW9kX3BhdGgsIDIqTUFYX1BBVEgpOwogICAgcHRyID0gc3RycmNoclcobW9kX3BhdGgsICdcXCcpOwogICAgaWYgKHB0cikgewoJc3RyY3B5VyhwdHIrMSwgbmV3X21vZCk7CglUUkFDRSgibG9hZGluZyAlc1xuIiwgZGVidWdzdHJfdyhtb2RfcGF0aCkpOwoJcmV0dXJuIChEV09SRClMb2FkTGlicmFyeVcobW9kX3BhdGgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zODldCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBjb21kbGczMi5HZXRTYXZlRmlsZU5hbWVXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzM4OShMUE9QRU5GSUxFTkFNRVcgb2ZuKQp7CiAgR0VUX0ZVTkMocEdldFNhdmVGaWxlTmFtZVcsIGNvbWRsZzMyLCAiR2V0U2F2ZUZpbGVOYW1lVyIsIEZBTFNFKTsKICByZXR1cm4gcEdldFNhdmVGaWxlTmFtZVcob2ZuKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjM5MF0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIG1wci5XTmV0UmVzdG9yZUNvbm5lY3Rpb25XCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV8zOTAoTFBWT0lEIGFyZzEsIExQVk9JRCBhcmcyKQp7CiAgR0VUX0ZVTkMocFdOZXRSZXN0b3JlQ29ubmVjdGlvblcsIG1wciwgIldOZXRSZXN0b3JlQ29ubmVjdGlvblciLCAwKTsKICByZXR1cm4gcFdOZXRSZXN0b3JlQ29ubmVjdGlvblcoYXJnMSwgYXJnMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS4zOTFdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBtcHIuV05ldEdldExhc3RFcnJvclcKICovCkRXT1JEIFdJTkFQSSBTSExXQVBJXzM5MShMUFZPSUQgYXJnMSwgTFBWT0lEIGFyZzIsIExQVk9JRCBhcmczLCBMUFZPSUQgYXJnNCwKICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBhcmc1KQp7CiAgR0VUX0ZVTkMocFdOZXRHZXRMYXN0RXJyb3JXLCBtcHIsICJXTmV0R2V0TGFzdEVycm9yVyIsIDApOwogIHJldHVybiBwV05ldEdldExhc3RFcnJvclcoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQAlbU0hMV0FQSS40MDFdCiAqCiAqIExhdGUgYm91bmQgY2FsbCB0byBjb21kbGczMi5QYWdlU2V0dXBEbGdXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzQwMShMUFBBR0VTRVRVUERMR1cgcGFnZWRsZykKewogIEdFVF9GVU5DKHBQYWdlU2V0dXBEbGdXLCBjb21kbGczMiwgIlBhZ2VTZXR1cERsZ1ciLCBGQUxTRSk7CiAgcmV0dXJuIHBQYWdlU2V0dXBEbGdXKHBhZ2VkbGcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDAyXQogKgogKiBMYXRlIGJvdW5kIGNhbGwgdG8gY29tZGxnMzIuUHJpbnREbGdXCiAqLwpCT09MIFdJTkFQSSBTSExXQVBJXzQwMihMUFBSSU5URExHVyBwcmludGRsZykKewogIEdFVF9GVU5DKHBQcmludERsZ1csIGNvbWRsZzMyLCAiUHJpbnREbGdXIiwgRkFMU0UpOwogIHJldHVybiBwUHJpbnREbGdXKHByaW50ZGxnKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQwM10KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIGNvbWRsZzMyLkdldE9wZW5GaWxlTmFtZVcKICovCkJPT0wgV0lOQVBJIFNITFdBUElfNDAzKExQT1BFTkZJTEVOQU1FVyBvZm4pCnsKICBHRVRfRlVOQyhwR2V0T3BlbkZpbGVOYW1lVywgY29tZGxnMzIsICJHZXRPcGVuRmlsZU5hbWVXIiwgRkFMU0UpOwogIHJldHVybiBwR2V0T3BlbkZpbGVOYW1lVyhvZm4pOwp9CgovKiBJTlRFUk5BTDogTWFwIGZyb20gSExTIGNvbG9yIHNwYWNlIHRvIFJHQiAqLwpzdGF0aWMgV09SRCBDb252ZXJ0SHVlKGludCB3SHVlLCBXT1JEIHdNaWQxLCBXT1JEIHdNaWQyKQp7CiAgd0h1ZSA9IHdIdWUgPiAyNDAgPyB3SHVlIC0gMjQwIDogd0h1ZSA8IDAgPyB3SHVlICsgMjQwIDogd0h1ZTsKCiAgaWYgKHdIdWUgPiAxNjApCiAgICByZXR1cm4gd01pZDE7CiAgZWxzZSBpZiAod0h1ZSA+IDEyMCkKICAgIHdIdWUgPSAxNjAgLSB3SHVlOwogIGVsc2UgaWYgKHdIdWUgPiA0MCkKICAgIHJldHVybiB3TWlkMjsKCiAgcmV0dXJuICgod0h1ZSAqICh3TWlkMiAtIHdNaWQxKSArIDIwKSAvIDQwKSArIHdNaWQxOwp9CgovKiBDb252ZXJ0IHRvIFJHQiBhbmQgc2NhbGUgaW50byBSR0IgcmFuZ2UgKDAuLjI1NSkgKi8KI2RlZmluZSBHRVRfUkdCKGgpIChDb252ZXJ0SHVlKGgsIHdNaWQxLCB3TWlkMikgKiAyNTUgKyAxMjApIC8gMjQwCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIENvbG9ySExTVG9SR0IJW1NITFdBUEkuNDA0XQogKgogKiBDb252ZXJ0IGZyb20gSExTIGNvbG9yIHNwYWNlIGludG8gYW4gUkdCIENPTE9SUkVGLgogKgogKiBOT1RFUwogKiBJbnB1dCBITFMgdmFsdWVzIGFyZSBjb25zdHJhaW5lZCB0byB0aGUgcmFuZ2UgKDAuLjI0MCkuCiAqLwpDT0xPUlJFRiBXSU5BUEkgQ29sb3JITFNUb1JHQihXT1JEIHdIdWUsIFdPUkQgd0x1bWlub3NpdHksIFdPUkQgd1NhdHVyYXRpb24pCnsKICBXT1JEIHdSZWQ7CgogIGlmICh3U2F0dXJhdGlvbikKICB7CiAgICBXT1JEIHdHcmVlbiwgd0JsdWUsIHdNaWQxLCB3TWlkMjsKCiAgICBpZiAod0x1bWlub3NpdHkgPiAxMjApCiAgICAgIHdNaWQyID0gd1NhdHVyYXRpb24gKyB3THVtaW5vc2l0eSAtICh3U2F0dXJhdGlvbiAqIHdMdW1pbm9zaXR5ICsgMTIwKSAvIDI0MDsKICAgIGVsc2UKICAgICAgd01pZDIgPSAoKHdTYXR1cmF0aW9uICsgMjQwKSAqIHdMdW1pbm9zaXR5ICsgMTIwKSAvIDI0MDsKCiAgICB3TWlkMSA9IHdMdW1pbm9zaXR5ICogMiAtIHdNaWQyOwoKICAgIHdSZWQgICA9IEdFVF9SR0Iod0h1ZSArIDgwKTsKICAgIHdHcmVlbiA9IEdFVF9SR0Iod0h1ZSk7CiAgICB3Qmx1ZSAgPSBHRVRfUkdCKHdIdWUgLSA4MCk7CgogICAgcmV0dXJuIFJHQih3UmVkLCB3R3JlZW4sIHdCbHVlKTsKICB9CgogIHdSZWQgPSB3THVtaW5vc2l0eSAqIDI1NSAvIDI0MDsKICByZXR1cm4gUkdCKHdSZWQsIHdSZWQsIHdSZWQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDEzXQogKgogKiBGdW5jdGlvbiB1bmtub3duIHNlZW1zIHRvIGFsd2F5cyB0byByZXR1cm4gMAogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfNDEzIChEV09SRCB4KQp7CglGSVhNRSgiKDB4JTA4bHgpc3R1YlxuIiwgeCk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQxOF0KICoKICogRnVuY3Rpb24gc2VlbXMgdG8gZG8gRnJlZUxpYnJhcnkgcGx1cyBvdGhlciB0aGluZ3MuCiAqCiAqIEZJWE1FIG5hdGl2ZSBzaG93cyB0aGUgZm9sbG93aW5nIGNhbGxzOgogKiAgIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uCiAqICAgTG9jYWxGcmVlCiAqICAgR2V0UHJvY0FkZHJlc3MoQ29tY3RsMzI/PywgMTUwTCkKICogICBEUEFfRGVsZXRlUHRyCiAqICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24KICogIGZvbGxvd2VkIGJ5IHRoZSBGcmVlTGlicmFyeS4KICogIFRoZSBhYm92ZSBjb2RlIG1heSBiZSByZWxhdGVkIHRvIC4zNzcgYWJvdmUuCiAqLwpCT09MICBXSU5BUEkgU0hMV0FQSV80MTggKEhNT0RVTEUgeCkKewoJRklYTUUoIigweCUwOGx4KSBwYXJ0aWFsIHN0dWJcbiIsIChMT05HKXgpOwoJcmV0dXJuIEZyZWVMaWJyYXJ5KHgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIEAJW1NITFdBUEkuNDMxXQogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfNDMxIChEV09SRCB4KQp7CglGSVhNRSgiKDB4JTA4bHgpc3R1YlxuIiwgeCk7CglyZXR1cm4gMHhhYmJhMTI0NzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQzNl0KICoKICogIFRoaXMgaXMgcmVhbGx5IENMU0lERnJvbVN0cmluZyB3aGljaCBpcyBleHBvcnRlZCBieSBvbGUzMi5kbGwsCiAqICBob3dldmVyIHRoZSBuYXRpdmUgc2hsd2FwaS5kbGwgZG9lcyAqbm90KiBpbXBvcnQgb2xlMzIuIE5vciBkb2VzCiAqICBvbGUzMi5kbGwgaW1wb3J0IHRoaXMgb3JkaW5hbCBmcm9tIHNobHdhcGkuIFRoZXJlZm9yZSB3ZSBtdXN0IGNvbmNsdWRlCiAqICB0aGF0IE1TIGR1cGxpY2F0ZWQgdGhlIGNvZGUgZm9yIENMU0lERnJvbVN0cmluZy4KICoKICogIFRoaXMgaXMgYSBkdXBsaWNhdGUgKHdpdGggY2hhbmdlcyBmb3IgVU5JQ09ERSkgb2YgQ0xTSURGcm9tU3RyaW5nMTYKICogIGluIGRsbHMvb2xlMzIvY29tcG9iai5jCiAqLwpEV09SRCBXSU5BUEkgU0hMV0FQSV80MzYgKExQV1NUUiBpZHN0ciwgQ0xTSUQgKmlkKQp7CiAgICBMUFdTVFIgcyA9IGlkc3RyOwogICAgQllURSAqcDsKICAgIElOVCBpOwogICAgV0NIQVIgdGFibGVbMjU2XTsKCiAgICBpZiAoIXMpIHsKCW1lbXNldChzLCAwLCBzaXplb2YoQ0xTSUQpKTsKCXJldHVybiBTX09LOwogICAgfQogICAgZWxzZSB7ICAvKiB2YWxpZGF0ZSB0aGUgQ0xTSUQgc3RyaW5nICovCgoJaWYgKHN0cmxlblcocykgIT0gMzgpCgkgICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CgoJaWYgKChzWzBdIT1MJ3snKSB8fCAoc1s5XSE9TCctJykgfHwgKHNbMTRdIT1MJy0nKSB8fCAoc1sxOV0hPUwnLScpIHx8IChzWzI0XSE9TCctJykgfHwgKHNbMzddIT1MJ30nKSkKCSAgICByZXR1cm4gQ09fRV9DTEFTU1NUUklORzsKCglmb3IgKGk9MTsgaTwzNzsgaSsrKQoJICAgIHsKCQlpZiAoKGkgPT0gOSl8fChpID09IDE0KXx8KGkgPT0gMTkpfHwoaSA9PSAyNCkpIGNvbnRpbnVlOwoJCWlmICghKCgoc1tpXSA+PSBMJzAnKSAmJiAoc1tpXSA8PSBMJzknKSkgIHx8CgkJICAgICAgKChzW2ldID49IEwnYScpICYmIChzW2ldIDw9IEwnZicpKSAgfHwKCQkgICAgICAoKHNbaV0gPj0gTCdBJykgJiYgKHNbaV0gPD0gTCdGJykpKQoJCSAgICApCgkJICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoJICAgIH0KICAgIH0KCiAgICBUUkFDRSgiJXMgLT4gJXBcbiIsIGRlYnVnc3RyX3cocyksIGlkKTsKCiAgLyogcXVpY2sgbG9va3VwIHRhYmxlICovCiAgICBtZW1zZXQodGFibGUsIDAsIDI1NipzaXplb2YoV0NIQVIpKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJdGFibGVbJzAnICsgaV0gPSBpOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewoJdGFibGVbJ0EnICsgaV0gPSBpKzEwOwoJdGFibGVbJ2EnICsgaV0gPSBpKzEwOwogICAgfQoKICAgIC8qIGluIGZvcm0ge1hYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWH0gKi8KCiAgICBwID0gKEJZVEUgKikgaWQ7CgogICAgcysrOwkvKiBza2lwIGxlYWRpbmcgYnJhY2UgICovCiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CglwWzMgLSBpXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CglzICs9IDI7CiAgICB9CiAgICBwICs9IDQ7CiAgICBzKys7CS8qIHNraXAgLSAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKCXBbMS1pXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CglzICs9IDI7CiAgICB9CiAgICBwICs9IDI7CiAgICBzKys7CS8qIHNraXAgLSAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKCXBbMS1pXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CglzICs9IDI7CiAgICB9CiAgICBwICs9IDI7CiAgICBzKys7CS8qIHNraXAgLSAqLwoKICAgIC8qIHRoZXNlIGFyZSBqdXN0IHNlcXVlbnRpYWwgYnl0ZXMgKi8KICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKCSpwKysgPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwoJcyArPSAyOwogICAgfQogICAgcysrOwkvKiBza2lwIC0gKi8KCiAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CgkqcCsrID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKCXMgKz0gMjsKICAgIH0KCiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBACVtTSExXQVBJLjQzN10KICoKICogTk9URVMKICogIEluIHRoZSByZWFsIHNobHdhcGksIE9uZSB0aW1lIGluaXRpYWxpc2F0aW9uIGNhbGxzIEdldFZlcnNpb25FeCBhbmQgcmVhZHMKICogIHRoZSByZWdpc3RyeSB0byBkZXRlcm1pbmUgd2hhdCBPL1MgJiBTZXJ2aWNlIFBhY2sgbGV2ZWwgaXMgcnVubmluZywgYW5kCiAqICB0aGVyZWZvcmUgd2hpY2ggZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUuIEN1cnJlbnRseSB3ZSBhbHdheXMgcnVuIGFzIE5ULAogKiAgc2luY2UgdGhpcyBtZWFucyB0aGF0IHdlIGRvbid0IG5lZWQgZXh0cmEgY29kZSB0byBlbXVsYXRlIFVuaWNvZGUgY2FsbHMsCiAqICB0aGV5IGFyZSBmb3J3YXJkZWQgZGlyZWN0bHkgdG8gdGhlIGFwcHJvcHJpYXRlIEFQSSBjYWxsIGluc3RlYWQuCiAqICBTaW5jZSB0aGUgZmxhZ3MgZm9yIHdoZXRoZXIgdG8gY2FsbCBvciBlbXVsYXRlIFVuaWNvZGUgYXJlIGludGVybmFsIHRvCiAqICB0aGUgZGxsLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQgYSBmdWxsIGltcGxlbWVudGF0aW9uLgogKi8KRFdPUkQgV0lOQVBJIFNITFdBUElfNDM3IChEV09SRCBmdW5jdGlvblRvQ2FsbCkKewoJRklYTUUoIigweCUwOGx4KXN0dWJcbiIsIGZ1bmN0aW9uVG9DYWxsKTsKCXJldHVybiAvKiAweGFiYmExMjQ3ICovIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQ29sb3JSR0JUb0hMUwlbU0hMV0FQSS40NDVdCiAqCiAqIENvbnZlcnQgZnJvbSBSR0IgQ09MT1JSRUYgaW50byB0aGUgSExTIGNvbG9yIHNwYWNlLgogKgogKiBOT1RFUwogKiBJbnB1dCBITFMgdmFsdWVzIGFyZSBjb25zdHJhaW5lZCB0byB0aGUgcmFuZ2UgKDAuLjI0MCkuCiAqLwpWT0lEIFdJTkFQSSBDb2xvclJHQlRvSExTKENPTE9SUkVGIGRyUkdCLCBMUFdPUkQgcHdIdWUsIAoJCQkgIExQV09SRCB3THVtaW5hbmNlLCBMUFdPUkQgcHdTYXR1cmF0aW9uKQp7CiAgICBGSVhNRSgic3R1YlxuIik7CiAgICByZXR1cm47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hDcmVhdGVTaGVsbFBhbGV0dGUJW1NITFdBUEkuQF0KICovCkhQQUxFVFRFIFdJTkFQSSBTSENyZWF0ZVNoZWxsUGFsZXR0ZShIREMgaGRjKQp7CglGSVhNRSgic3R1YlxuIik7CglyZXR1cm4gQ3JlYXRlSGFsZnRvbmVQYWxldHRlKGhkYyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCVNIR2V0SW52ZXJzZUNNQVAgKFNITFdBUEkuQCkKICovCkRXT1JEIFdJTkFQSSBTSEdldEludmVyc2VDTUFQIChMUERXT1JEKiB4LCBEV09SRCB3aHkpCnsKICAgIGlmICh3aHkgPT0gNCkgewoJRklYTUUoIiAtIHJldHVybmluZyBib2d1cyBhZGRyZXNzIGZvciBTSEdldEludmVyc2VDTUFQXG4iKTsKCSp4ID0gKExQRFdPUkQpMHhhYmJhMTI0OTsKCXJldHVybiAwOwogICAgfQogICAgRklYTUUoIiglcCwgJSNseClzdHViXG4iLCB4LCB3aHkpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgU0hJc0xvd01lbW9yeU1hY2hpbmUJW1NITFdBUEkuQF0KICovCkRXT1JEIFdJTkFQSSBTSElzTG93TWVtb3J5TWFjaGluZSAoRFdPUkQgeCkKewoJRklYTUUoIjB4JTA4bHhcbiIsIHgpOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgR2V0TWVudVBvc0Zyb21JRAlbU0hMV0FQSS5AXQogKi8KSU5UIFdJTkFQSSBHZXRNZW51UG9zRnJvbUlEKEhNRU5VIGhNZW51LCBVSU5UIHdJRCkKewogTUVOVUlURU1JTkZPQSBtaTsKIElOVCBuQ291bnQgPSBHZXRNZW51SXRlbUNvdW50KGhNZW51KSwgbkl0ZXIgPSAwOwoKIHdoaWxlIChuSXRlciA8IG5Db3VudCkKIHsKICAgbWkud0lEID0gMDsKICAgaWYgKCFHZXRNZW51SXRlbUluZm9BKGhNZW51LCBuSXRlciwgVFJVRSwgJm1pKSAmJiBtaS53SUQgPT0gd0lEKQogICAgIHJldHVybiBuSXRlcjsKICAgbkl0ZXIrKzsKIH0KIHJldHVybiAtMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBfU0hHZXRJbnN0YW5jZUV4cGxvcmVyQDQJW1NITFdBUEkuQF0KICoKICogTGF0ZSBib3VuZCBjYWxsIHRvIHNoZWxsMzIuU0hHZXRJbnN0YW5jZUV4cGxvcmVyLgogKi8KSFJFU1VMVCBXSU5BUEkgX1NIR2V0SW5zdGFuY2VFeHBsb3JlciAoTFBVTktOT1dOICpscFVua25vd24pCnsKICBHRVRfRlVOQyhwU0hHZXRJbnN0YW5jZUV4cGxvcmVyLCBzaGVsbDMyLCAiU0hHZXRJbnN0YW5jZUV4cGxvcmVyIiwgRV9GQUlMKTsKICByZXR1cm4gcFNIR2V0SW5zdGFuY2VFeHBsb3JlcihscFVua25vd24pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFNIR2V0VGhyZWFkUmVmCVtTSExXQVBJLkBdCiAqCiAqIFJldHJpZXZlcyB0aGUgcGVyLXRocmVhZCBvYmplY3QgcmVmZXJlbmNlIHNldCBieSBTSFNldFRocmVhZFJlZgogKiAicHVuayIgLSBBZGRyZXNzIG9mIGEgcG9pbnRlciB0byB0aGUgSVVua25vd24gaW50ZXJmYWNlLiBSZXR1cm5zIFNfT0sgaWYKICogICAgICAgICAgc3VjY2Vzc2Z1bCBvciBFX05PSU5URVJGQUNFIG90aGVyd2lzZS4KICovCkhSRVNVTFQgV0lOQVBJIFNIR2V0VGhyZWFkUmVmIChJVW5rbm93biAqKiBwcHVuaykKewogICAgaWYgKFNITFdBUElfVGhyZWFkUmVmX2luZGV4IDwgMCkgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiAgICAqcHB1bmsgPSAoSVVua25vd24gKilUbHNHZXRWYWx1ZShTSExXQVBJX1RocmVhZFJlZl9pbmRleCk7CiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBTSFNldFRocmVhZFJlZglbU0hMV0FQSS5AXQogKgogKiBTdG9yZXMgYSBwZXItdGhyZWFkIHJlZmVyZW5jZSB0byBhIENPTSBvYmplY3QKICogInB1bmsiIC0gUG9pbnRlciB0byB0aGUgSVVua25vd24gaW50ZXJmYWNlIG9mIHRoZSBvYmplY3QgdG8KICogICAgICAgICAgd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgYSByZWZlcmVuY2UuIFJldHVybnMgU19PSyBpZiBzdWNjZXNzZnVsCiAqICAgICAgICAgIG9yIGFuIE9MRSBlcnJvciB2YWx1ZS4KICovCkhSRVNVTFQgV0lOQVBJIFNIU2V0VGhyZWFkUmVmIChJVW5rbm93biAqIHB1bmspCnsKICAgIGlmIChTSExXQVBJX1RocmVhZFJlZl9pbmRleCA8IDApIHJldHVybiBFX05PSU5URVJGQUNFOwogICAgVGxzU2V0VmFsdWUoU0hMV0FQSV9UaHJlYWRSZWZfaW5kZXgsIChMUFZPSUQpIHB1bmspOwogICAgcmV0dXJuIFNfT0s7Cn0K