LyoKICogQ29weXJpZ2h0IDE5OTkgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAyLTIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwojZGVmaW5lIENPTV9OT19XSU5ET1dTX0gKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5kb3dzeC5oIgoKI2luY2x1ZGUgIm9sZTIuaCIKI2luY2x1ZGUgInNoZWxsYXBpLmgiCiNpbmNsdWRlICJzaGxvYmouaCIKI2luY2x1ZGUgInZmdy5oIgojaW5jbHVkZSAibXNhY20uaCIKCiNpbmNsdWRlICJhdmlmaWxlX3ByaXZhdGUuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGF2aWZpbGUpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBmb3IgQVZJQnVpbGRGaWx0ZXJXIC0tIHVzZXMgZml4ZWQgc2l6ZSB0YWJsZQogKi8KI2RlZmluZSBNQVhfRklMVEVSUyAzMCAvKiAzMCA9PiA3a0IgKi8KCnR5cGVkZWYgc3RydWN0IF9BVklGaWx0ZXIgewogIFdDSEFSIHN6Q2xzaWRbNDBdOwogIFdDSEFSIHN6RXh0ZW5zaW9uc1tNQVhfRklMVEVSUyAqIDddOwp9IEFWSUZpbHRlcjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBmb3IgQVZJU2F2ZU9wdGlvbnMKICovCnN0YXRpYyBzdHJ1Y3QgewogIFVJTlQgICAgICAgICAgICAgICAgICB1RmxhZ3M7CiAgSU5UICAgICAgICAgICAgICAgICAgIG5TdHJlYW1zOwogIFBBVklTVFJFQU0gICAgICAgICAgICpwcGF2aXM7CiAgTFBBVklDT01QUkVTU09QVElPTlMgKnBwT3B0aW9uczsKICBJTlQgICAgICAgICAgICAgICAgICAgbkN1cnJlbnQ7Cn0gU2F2ZU9wdHM7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogY29waWVkIGZyb20gZGxscy9vbGUzMi9jb21wb2JqLmMKICovCnN0YXRpYyBIUkVTVUxUIEFWSUZJTEVfQ0xTSURGcm9tU3RyaW5nKExQQ1NUUiBpZHN0ciwgTFBDTFNJRCBpZCkKewogIEJZVEUgY29uc3QgKnMgPSAoQllURSBjb25zdCopaWRzdHI7CiAgQllURSAqcDsKICBJTlQgICBpOwogIEJZVEUgdGFibGVbMjU2XTsKCiAgaWYgKCFzKSB7CiAgICBtZW1zZXQoaWQsIDAsIHNpemVvZihDTFNJRCkpOwogICAgcmV0dXJuIFNfT0s7CiAgfSBlbHNlIHsgIC8qIHZhbGlkYXRlIHRoZSBDTFNJRCBzdHJpbmcgKi8KICAgIGlmIChsc3RybGVuQShzKSAhPSAzOCkKICAgICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CgogICAgaWYgKChzWzBdIT0neycpIHx8IChzWzldIT0nLScpIHx8IChzWzE0XSE9Jy0nKSB8fCAoc1sxOV0hPSctJykgfHwKCShzWzI0XSE9Jy0nKSB8fCAoc1szN10hPSd9JykpCiAgICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoKICAgIGZvciAoaSA9IDE7IGkgPCAzNzsgaSsrKSB7CiAgICAgIGlmICgoaSA9PSA5KSB8fCAoaSA9PSAxNCkgfHwgKGkgPT0gMTkpIHx8IChpID09IDI0KSkKCWNvbnRpbnVlOwogICAgICBpZiAoISgoKHNbaV0gPj0gJzAnKSAmJiAoc1tpXSA8PSAnOScpKSAgfHwKCSAgICAoKHNbaV0gPj0gJ2EnKSAmJiAoc1tpXSA8PSAnZicpKSAgfHwKCSAgICAoKHNbaV0gPj0gJ0EnKSAmJiAoc1tpXSA8PSAnRicpKSkKCSAgKQoJcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CiAgICB9CiAgfQoKICBUUkFDRSgiJXMgLT4gJXBcbiIsIHMsIGlkKTsKCiAgLyogcXVpY2sgbG9va3VwIHRhYmxlICovCiAgbWVtc2V0KHRhYmxlLCAwLCAyNTYpOwoKICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKICAgIHRhYmxlWycwJyArIGldID0gaTsKCiAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogICAgdGFibGVbJ0EnICsgaV0gPSBpKzEwOwogICAgdGFibGVbJ2EnICsgaV0gPSBpKzEwOwogIH0KCiAgLyogaW4gZm9ybSB7WFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYfSAqLwogIHAgPSAoQllURSAqKSBpZDsKCiAgcysrOwkvKiBza2lwIGxlYWRpbmcgYnJhY2UgICovCiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgcFszIC0gaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KICBwICs9IDQ7CiAgcysrOwkvKiBza2lwIC0gKi8KCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgcFsxLWldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKICAgIHMgKz0gMjsKICB9CiAgcCArPSAyOwogIHMrKzsJLyogc2tpcCAtICovCgogIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgIHBbMS1pXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHAgKz0gMjsKICBzKys7CS8qIHNraXAgLSAqLwoKICAvKiB0aGVzZSBhcmUganVzdCBzZXF1ZW50aWFsIGJ5dGVzICovCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgKnArKyA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHMrKzsJLyogc2tpcCAtICovCgogIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICpwKysgPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KCiAgcmV0dXJuIFNfT0s7Cn0KCnN0YXRpYyBCT09MIEFWSUZJTEVfR2V0RmlsZUhhbmRsZXJCeUV4dGVuc2lvbihMUENXU1RSIHN6RmlsZSwgTFBDTFNJRCBscGNsc2lkKQp7CiAgQ0hBUiAgIHN6UmVnS2V5WzI1XTsKICBDSEFSICAgc3pWYWx1ZVsxMDBdOwogIExQV1NUUiBzekV4dCA9IHN0cnJjaHJXKHN6RmlsZSwgJy4nKTsKICBMT05HICAgbGVuID0gc2l6ZW9mKHN6VmFsdWUpIC8gc2l6ZW9mKHN6VmFsdWVbMF0pOwoKICBpZiAoc3pFeHQgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgc3pFeHQrKzsKCiAgd3NwcmludGZBKHN6UmVnS2V5LCAiQVZJRmlsZVxcRXh0ZW5zaW9uc1xcJS4zbHMiLCBzekV4dCk7CiAgaWYgKFJlZ1F1ZXJ5VmFsdWVBKEhLRVlfQ0xBU1NFU19ST09ULCBzelJlZ0tleSwgc3pWYWx1ZSwgJmxlbikgIT0gRVJST1JfU1VDQ0VTUykKICAgIHJldHVybiBGQUxTRTsKCiAgcmV0dXJuIChBVklGSUxFX0NMU0lERnJvbVN0cmluZyhzelZhbHVlLCBscGNsc2lkKSA9PSBTX09LKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlSW5pdAkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlSW5pdAkJKEFWSUZJTEUuMTAwKQogKi8Kdm9pZCBXSU5BUEkgQVZJRmlsZUluaXQodm9pZCkgewogIC8qIG5lZWQgdG8gbG9hZCBvbGUzMi5kbGwgaWYgbm90IGFscmVhZHkgZG9uZSBhbmQgZ2V0IHNvbWUgZnVuY3Rpb25zICovCiAgRklYTUUoIigpOiBzdHViIVxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUV4aXQJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUV4aXQJCShBVklGSUxFLjEwMSkKICovCnZvaWQgV0lOQVBJIEFWSUZpbGVFeGl0KHZvaWQpIHsKICAvKiBuZWVkIHRvIGZyZWUgb2xlMzIuZGxsIGlmIHdlIGFyZSB0aGUgbGFzdCBleGl0IGNhbGwgKi8KICBGSVhNRSgiKCk6IHN0dWIhXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlT3BlbgkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlT3BlbkEJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZU9wZW4JCShBVklGSUxFLjEwMikKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVPcGVuQShQQVZJRklMRSAqcHBmaWxlLCBMUENTVFIgc3pGaWxlLCBVSU5UIHVNb2RlLAoJCQkgICAgTFBDTFNJRCBscEhhbmRsZXIpCnsKICBMUFdTVFIgIHdzekZpbGUgPSBOVUxMOwogIEhSRVNVTFQgaHI7CiAgaW50ICAgICBsZW47CgogIFRSQUNFKCIoJXAsJXMsMHglMDhYLCVzKVxuIiwgcHBmaWxlLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHVNb2RlLAoJZGVidWdzdHJfZ3VpZChscEhhbmRsZXIpKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChwcGZpbGUgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIC8qIGNvbnZlcnQgQVNDSUkgc3RyaW5nIHRvIFVuaWNvZGUgYW5kIGNhbGwgdW5pY29kZSBmdW5jdGlvbiAqLwogIGxlbiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzekZpbGUsIC0xLCBOVUxMLCAwKTsKICBpZiAobGVuIDw9IDApCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICB3c3pGaWxlID0gKExQV1NUUilMb2NhbEFsbG9jKExQVFIsIGxlbiAqIHNpemVvZihXQ0hBUikpOwogIGlmICh3c3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHN6RmlsZSwgLTEsIHdzekZpbGUsIGxlbik7CgogIGhyID0gQVZJRmlsZU9wZW5XKHBwZmlsZSwgd3N6RmlsZSwgdU1vZGUsIGxwSGFuZGxlcik7CgogIExvY2FsRnJlZSgoSExPQ0FMKXdzekZpbGUpOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZU9wZW5XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVPcGVuVyhQQVZJRklMRSAqcHBmaWxlLCBMUENXU1RSIHN6RmlsZSwgVUlOVCB1TW9kZSwKCQkJICAgIExQQ0xTSUQgbHBIYW5kbGVyKQp7CiAgSVBlcnNpc3RGaWxlICpwcGVyc2lzdCA9IE5VTEw7CiAgQ0xTSUQgICAgICAgICBjbHNpZEhhbmRsZXI7CiAgSFJFU1VMVCAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcywweCVYLCVzKVxuIiwgcHBmaWxlLCBkZWJ1Z3N0cl93KHN6RmlsZSksIHVNb2RlLAoJZGVidWdzdHJfZ3VpZChscEhhbmRsZXIpKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChwcGZpbGUgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGZpbGUgPSBOVUxMOwoKICAvKiBpZiBubyBoYW5kbGVyIHRoZW4gdHJ5IGd1ZXNzaW5nIGl0IGJ5IGV4dGVuc2lvbiAqLwogIGlmIChscEhhbmRsZXIgPT0gTlVMTCkgewogICAgaWYgKCEgQVZJRklMRV9HZXRGaWxlSGFuZGxlckJ5RXh0ZW5zaW9uKHN6RmlsZSwgJmNsc2lkSGFuZGxlcikpCiAgICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CiAgfSBlbHNlCiAgICBtZW1jcHkoJmNsc2lkSGFuZGxlciwgbHBIYW5kbGVyLCBzaXplb2YoY2xzaWRIYW5kbGVyKSk7CgogIC8qIGNyZWF0ZSBpbnN0YW5jZSBvZiBoYW5kbGVyICovCiAgaHIgPSBTSENvQ3JlYXRlSW5zdGFuY2UoTlVMTCwgJmNsc2lkSGFuZGxlciwgTlVMTCwKCQkJICAmSUlEX0lBVklGaWxlLCAoTFBWT0lEKilwcGZpbGUpOwogIGlmIChGQUlMRUQoaHIpIHx8ICpwcGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBocjsKCiAgLyogYXNrIGZvciBJUGVyc2lzdEZpbGUgaW50ZXJmYWNlIGZvciBsb2FkaW5nL2NyZWF0aW5nIHRoZSBmaWxlICovCiAgaHIgPSBJQVZJRmlsZV9RdWVyeUludGVyZmFjZSgqcHBmaWxlLCAmSUlEX0lQZXJzaXN0RmlsZSwgKExQVk9JRCopJnBwZXJzaXN0KTsKICBpZiAoRkFJTEVEKGhyKSB8fCBwcGVyc2lzdCA9PSBOVUxMKSB7CiAgICBJQVZJRmlsZV9SZWxlYXNlKCpwcGZpbGUpOwogICAgKnBwZmlsZSA9IE5VTEw7CiAgICByZXR1cm4gaHI7CiAgfQoKICBociA9IElQZXJzaXN0RmlsZV9Mb2FkKHBwZXJzaXN0LCBzekZpbGUsIHVNb2RlKTsKICBJUGVyc2lzdEZpbGVfUmVsZWFzZShwcGVyc2lzdCk7CiAgaWYgKEZBSUxFRChocikpIHsKICAgIElBVklGaWxlX1JlbGVhc2UoKnBwZmlsZSk7CiAgICAqcHBmaWxlID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlQWRkUmVmCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVBZGRSZWYJCShBVklGSUxFLjE0MCkKICovClVMT05HIFdJTkFQSSBBVklGaWxlQWRkUmVmKFBBVklGSUxFIHBmaWxlKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSUZpbGVfQWRkUmVmKHBmaWxlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlUmVsZWFzZQkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlUmVsZWFzZQkJKEFWSUZJTEUuMTQxKQogKi8KVUxPTkcgV0lOQVBJIEFWSUZpbGVSZWxlYXNlKFBBVklGSUxFIHBmaWxlKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSUZpbGVfUmVsZWFzZShwZmlsZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUluZm8JCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUluZm9BCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVJbmZvCQkoQVZJRklMRS4xNDIpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlSW5mb0EoUEFWSUZJTEUgcGZpbGUsIExQQVZJRklMRUlORk9BIGFmaSwgTE9ORyBzaXplKQp7CiAgQVZJRklMRUlORk9XIGFmaXc7CiAgSFJFU1VMVCAgICAgIGhyZXM7CgogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcGZpbGUsIGFmaSwgc2l6ZSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKChEV09SRClzaXplIDwgc2l6ZW9mKEFWSUZJTEVJTkZPQSkpCiAgICByZXR1cm4gQVZJRVJSX0JBRFNJWkU7CgogIGhyZXMgPSBJQVZJRmlsZV9JbmZvKHBmaWxlLCAmYWZpdywgc2l6ZW9mKGFmaXcpKTsKCiAgbWVtY3B5KGFmaSwgJmFmaXcsIHNpemVvZigqYWZpKSAtIHNpemVvZihhZmktPnN6RmlsZVR5cGUpKTsKICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgYWZpdy5zekZpbGVUeXBlLCAtMSwgYWZpLT5zekZpbGVUeXBlLAoJCSAgICAgIHNpemVvZihhZmktPnN6RmlsZVR5cGUpLCBOVUxMLCBOVUxMKTsKICBhZmktPnN6RmlsZVR5cGVbc2l6ZW9mKGFmaS0+c3pGaWxlVHlwZSkgLSAxXSA9IDA7CgogIHJldHVybiBocmVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVJbmZvVwkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlSW5mb1coUEFWSUZJTEUgcGZpbGUsIExQQVZJRklMRUlORk9XIGFmaXcsIExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcGZpbGUsIGFmaXcsIHNpemUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfSW5mbyhwZmlsZSwgYWZpdywgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUdldFN0cmVhbQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVHZXRTdHJlYW0JKEFWSUZJTEUuMTQzKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZUdldFN0cmVhbShQQVZJRklMRSBwZmlsZSwgUEFWSVNUUkVBTSAqYXZpcywKCQkJCURXT1JEIGZjY1R5cGUsIExPTkcgbFBhcmFtKQp7CiAgVFJBQ0UoIiglcCwlcCwnJTQuNHMnLCVsZClcbiIsIHBmaWxlLCBhdmlzLCAoY2hhciopJmZjY1R5cGUsIGxQYXJhbSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJRmlsZV9HZXRTdHJlYW0ocGZpbGUsIGF2aXMsIGZjY1R5cGUsIGxQYXJhbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUNyZWF0ZVN0cmVhbQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVDcmVhdGVTdHJlYW1BCShBVklGSUwzMi5AKQogKiAgICAgICAgICAgICAgQVZJRmlsZUNyZWF0ZVN0cmVhbQkoQVZJRklMRS4xNDQpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlQ3JlYXRlU3RyZWFtQShQQVZJRklMRSBwZmlsZSwgUEFWSVNUUkVBTSAqcHBhdmksCgkJCQkgICAgTFBBVklTVFJFQU1JTkZPQSBwc2kpCnsKICBBVklTVFJFQU1JTkZPVwlwc2l3OwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcGZpbGUsIHBwYXZpLCBwc2kpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICAvKiBPbmx5IHRoZSBzek5hbWUgYXQgdGhlIGVuZCBpcyBkaWZmZXJlbnQgKi8KICBtZW1jcHkoJnBzaXcsIHBzaSwgc2l6ZW9mKCpwc2kpIC0gc2l6ZW9mKHBzaS0+c3pOYW1lKSk7CiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHBzaS0+c3pOYW1lLCAtMSwgcHNpdy5zek5hbWUsCgkJICAgICAgc2l6ZW9mKHBzaXcuc3pOYW1lKSAvIHNpemVvZihwc2l3LnN6TmFtZVswXSkpOwoKICByZXR1cm4gSUFWSUZpbGVfQ3JlYXRlU3RyZWFtKHBmaWxlLCBwcGF2aSwgJnBzaXcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVDcmVhdGVTdHJlYW1XCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZUNyZWF0ZVN0cmVhbVcoUEFWSUZJTEUgcGZpbGUsIFBBVklTVFJFQU0gKmF2aXMsCgkJCQkgICAgTFBBVklTVFJFQU1JTkZPVyBhc2kpCnsKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcGZpbGUsIGF2aXMsIGFzaSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJRmlsZV9DcmVhdGVTdHJlYW0ocGZpbGUsIGF2aXMsIGFzaSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZVdyaXRlRGF0YQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVXcml0ZURhdGEJKEFWSUZJTEUuMTQ2KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZVdyaXRlRGF0YShQQVZJRklMRSBwZmlsZSxEV09SRCBmY2MsTFBWT0lEIGxwLExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlbGQpXG4iLCBwZmlsZSwgKGNoYXIqKSZmY2MsIGxwLCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX1dyaXRlRGF0YShwZmlsZSwgZmNjLCBscCwgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZVJlYWREYXRhCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVSZWFkRGF0YQkJKEFWSUZJTEUuMTQ3KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZVJlYWREYXRhKFBBVklGSUxFIHBmaWxlLERXT1JEIGZjYyxMUFZPSUQgbHAsTFBMT05HIHNpemUpCnsKICBUUkFDRSgiKCVwLCclNC40cycsJXAsJXApXG4iLCBwZmlsZSwgKGNoYXIqKSZmY2MsIGxwLCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX1JlYWREYXRhKHBmaWxlLCBmY2MsIGxwLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlRW5kUmVjb3JkCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUVuZFJlY29yZAkoQVZJRklMRS4xNDgpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlRW5kUmVjb3JkKFBBVklGSUxFIHBmaWxlKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX0VuZFJlY29yZChwZmlsZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtQWRkUmVmCQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUFkZFJlZgkJKEFWSUZJTEUuMTYwKQogKi8KVUxPTkcgV0lOQVBJIEFWSVN0cmVhbUFkZFJlZihQQVZJU1RSRUFNIHBzdHJlYW0pCnsKICBUUkFDRSgiKCVwKVxuIiwgcHN0cmVhbSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSVN0cmVhbV9BZGRSZWYocHN0cmVhbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVsZWFzZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVJlbGVhc2UJKEFWSUZJTEUuMTYxKQogKi8KVUxPTkcgV0lOQVBJIEFWSVN0cmVhbVJlbGVhc2UoUEFWSVNUUkVBTSBwc3RyZWFtKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBzdHJlYW0pOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKSB7CiAgICBFUlIoIjogYmFkIGhhbmRsZSBwYXNzZWQhXG4iKTsKICAgIHJldHVybiAwOwogIH0KCiAgcmV0dXJuIElBVklTdHJlYW1fUmVsZWFzZShwc3RyZWFtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1DcmVhdGUJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtQ3JlYXRlCQkoQVZJRklMRS4xMDQpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1DcmVhdGUoUEFWSVNUUkVBTSAqcHBhdmksIExPTkcgbFBhcmFtMSwgTE9ORyBsUGFyYW0yLAoJCQkgICAgICAgTFBDTFNJRCBwY2xzaWRIYW5kbGVyKQp7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwweCUwOGxYLDB4JTA4bFgsJXMpXG4iLCBwcGF2aSwgbFBhcmFtMSwgbFBhcmFtMiwKCWRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBhdmkgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGF2aSA9IE5VTEw7CiAgaWYgKHBjbHNpZEhhbmRsZXIgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CgogIGhyID0gU0hDb0NyZWF0ZUluc3RhbmNlKE5VTEwsIHBjbHNpZEhhbmRsZXIsIE5VTEwsCgkJCSAgJklJRF9JQVZJU3RyZWFtLCAoTFBWT0lEKilwcGF2aSk7CiAgaWYgKEZBSUxFRChocikgfHwgKnBwYXZpID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSVN0cmVhbV9DcmVhdGUoKnBwYXZpLCBsUGFyYW0xLCBsUGFyYW0yKTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgSUFWSVN0cmVhbV9SZWxlYXNlKCpwcGF2aSk7CiAgICAqcHBhdmkgPSBOVUxMOwogIH0KCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUluZm8JCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtSW5mb0EJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtSW5mbwkJKEFWSUZJTEUuMTYyKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtSW5mb0EoUEFWSVNUUkVBTSBwc3RyZWFtLCBMUEFWSVNUUkVBTUlORk9BIGFzaSwKCQkJICAgICAgTE9ORyBzaXplKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBIUkVTVUxUCSBocmVzOwoKICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIHBzdHJlYW0sIGFzaSwgc2l6ZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoKERXT1JEKXNpemUgPCBzaXplb2YoQVZJU1RSRUFNSU5GT0EpKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBocmVzID0gSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpOwoKICBtZW1jcHkoYXNpLCAmYXNpdywgc2l6ZW9mKGFzaXcpIC0gc2l6ZW9mKGFzaXcuc3pOYW1lKSk7CiAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIGFzaXcuc3pOYW1lLCAtMSwgYXNpLT5zek5hbWUsCgkJICAgICAgc2l6ZW9mKGFzaS0+c3pOYW1lKSwgTlVMTCwgTlVMTCk7CiAgYXNpLT5zek5hbWVbc2l6ZW9mKGFzaS0+c3pOYW1lKSAtIDFdID0gMDsKCiAgcmV0dXJuIGhyZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtSW5mb1cJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtSW5mb1coUEFWSVNUUkVBTSBwc3RyZWFtLCBMUEFWSVNUUkVBTUlORk9XIGFzaSwKCQkJICAgICAgTE9ORyBzaXplKQp7CiAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX0luZm8ocHN0cmVhbSwgYXNpLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1GaW5kU2FtcGxlCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtRmluZFNhbXBsZQkoQVZJRklMRS4xNjMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1GaW5kU2FtcGxlKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBwb3MsIERXT1JEIGZsYWdzKQp7CiAgVFJBQ0UoIiglcCwlbGQsMHglbFgpXG4iLCBwc3RyZWFtLCBwb3MsIGZsYWdzKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiAtMTsKCiAgcmV0dXJuIElBVklTdHJlYW1fRmluZFNhbXBsZShwc3RyZWFtLCBwb3MsIGZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1SZWFkRm9ybWF0CShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVhZEZvcm1hdAkoQVZJRklMRS4xNjQpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1SZWFkRm9ybWF0KFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBwb3MsCgkJCQkgICBMUFZPSUQgZm9ybWF0LCBMUExPTkcgZm9ybWF0c2l6ZSkKewogIFRSQUNFKCIoJXAsJWxkLCVwLCVwKVxuIiwgcHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1JlYWRGb3JtYXQocHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVNldEZvcm1hdAkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVNldEZvcm1hdAkoQVZJRklMRS4xNjkpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1TZXRGb3JtYXQoUEFWSVNUUkVBTSBwc3RyZWFtLCBMT05HIHBvcywKCQkJCSAgTFBWT0lEIGZvcm1hdCwgTE9ORyBmb3JtYXRzaXplKQp7CiAgVFJBQ0UoIiglcCwlbGQsJXAsJWxkKVxuIiwgcHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1NldEZvcm1hdChwc3RyZWFtLCBwb3MsIGZvcm1hdCwgZm9ybWF0c2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVhZAkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1SZWFkCQkoQVZJRklMRS4xNjcpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1SZWFkKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBzdGFydCwgTE9ORyBzYW1wbGVzLAoJCQkgICAgIExQVk9JRCBidWZmZXIsIExPTkcgYnVmZmVyc2l6ZSwKCQkJICAgICBMUExPTkcgYnl0ZXNyZWFkLCBMUExPTkcgc2FtcGxlc3JlYWQpCnsKICBUUkFDRSgiKCVwLCVsZCwlbGQsJXAsJWxkLCVwLCVwKVxuIiwgcHN0cmVhbSwgc3RhcnQsIHNhbXBsZXMsIGJ1ZmZlciwKCWJ1ZmZlcnNpemUsIGJ5dGVzcmVhZCwgc2FtcGxlc3JlYWQpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1JlYWQocHN0cmVhbSwgc3RhcnQsIHNhbXBsZXMsIGJ1ZmZlciwgYnVmZmVyc2l6ZSwKCQkJIGJ5dGVzcmVhZCwgc2FtcGxlc3JlYWQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVdyaXRlCQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVdyaXRlCQkoQVZJRklMRS4xNjgpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1Xcml0ZShQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgc3RhcnQsIExPTkcgc2FtcGxlcywKCQkJICAgICAgTFBWT0lEIGJ1ZmZlciwgTE9ORyBidWZmZXJzaXplLCBEV09SRCBmbGFncywKCQkJICAgICAgTFBMT05HIHNhbXB3cml0dGVuLCBMUExPTkcgYnl0ZXN3cml0dGVuKQp7CiAgVFJBQ0UoIiglcCwlbGQsJWxkLCVwLCVsZCwweCVsWCwlcCwlcClcbiIsIHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsCglidWZmZXJzaXplLCBmbGFncywgc2FtcHdyaXR0ZW4sIGJ5dGVzd3JpdHRlbik7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklTdHJlYW1fV3JpdGUocHN0cmVhbSwgc3RhcnQsIHNhbXBsZXMsIGJ1ZmZlciwgYnVmZmVyc2l6ZSwKCQkJICBmbGFncywgc2FtcHdyaXR0ZW4sIGJ5dGVzd3JpdHRlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVhZERhdGEJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1SZWFkRGF0YQkoQVZJRklMRS4xNjUpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1SZWFkRGF0YShQQVZJU1RSRUFNIHBzdHJlYW0sIERXT1JEIGZjYywgTFBWT0lEIGxwLAoJCQkJIExQTE9ORyBscHJlYWQpCnsKICBUUkFDRSgiKCVwLCclNC40cycsJXAsJXApXG4iLCBwc3RyZWFtLCAoY2hhciopJmZjYywgbHAsIGxwcmVhZCk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklTdHJlYW1fUmVhZERhdGEocHN0cmVhbSwgZmNjLCBscCwgbHByZWFkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1Xcml0ZURhdGEJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1Xcml0ZURhdGEJKEFWSUZJTEUuMTY2KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtV3JpdGVEYXRhKFBBVklTVFJFQU0gcHN0cmVhbSwgRFdPUkQgZmNjLCBMUFZPSUQgbHAsCgkJCQkgIExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlbGQpXG4iLCBwc3RyZWFtLCAoY2hhciopJmZjYywgbHAsIHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1dyaXRlRGF0YShwc3RyZWFtLCBmY2MsIGxwLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1HZXRGcmFtZU9wZW4JKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1HZXRGcmFtZU9wZW4JKEFWSUZJTEUuMTEyKQogKi8KUEdFVEZSQU1FIFdJTkFQSSBBVklTdHJlYW1HZXRGcmFtZU9wZW4oUEFWSVNUUkVBTSBwc3RyZWFtLAoJCQkJICAgICAgIExQQklUTUFQSU5GT0hFQURFUiBscGJpV2FudGVkKQp7CiAgUEdFVEZSQU1FIHBnID0gTlVMTDsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIHBzdHJlYW0sIGxwYmlXYW50ZWQpOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocHN0cmVhbSwgJklJRF9JR2V0RnJhbWUsIChMUFZPSUQqKSZwZykpIHx8CiAgICAgIHBnID09IE5VTEwpIHsKICAgIHBnID0gQVZJRklMRV9DcmVhdGVHZXRGcmFtZShwc3RyZWFtKTsKICAgIGlmIChwZyA9PSBOVUxMKQogICAgICByZXR1cm4gTlVMTDsKICB9CgogIGlmIChGQUlMRUQoSUdldEZyYW1lX1NldEZvcm1hdChwZywgbHBiaVdhbnRlZCwgTlVMTCwgMCwgMCwgLTEsIC0xKSkpIHsKICAgIElHZXRGcmFtZV9SZWxlYXNlKHBnKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgcmV0dXJuIHBnOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUdldEZyYW1lCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtR2V0RnJhbWUJKEFWSUZJTEUuMTEwKQogKi8KTFBWT0lEIFdJTkFQSSBBVklTdHJlYW1HZXRGcmFtZShQR0VURlJBTUUgcGcsIExPTkcgcG9zKQp7CiAgVFJBQ0UoIiglcCwlbGQpXG4iLCBwZywgcG9zKTsKCiAgaWYgKHBnID09IE5VTEwpCiAgICByZXR1cm4gTlVMTDsKCiAgcmV0dXJuIElHZXRGcmFtZV9HZXRGcmFtZShwZywgcG9zKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1HZXRGcmFtZUNsb3NlCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtR2V0RnJhbWVDbG9zZQkoQVZJRklMRS4xMTEpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1HZXRGcmFtZUNsb3NlKFBHRVRGUkFNRSBwZykKewogIFRSQUNFKCIoJXApXG4iLCBwZyk7CgogIGlmIChwZyAhPSBOVUxMKQogICAgcmV0dXJuIElHZXRGcmFtZV9SZWxlYXNlKHBnKTsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklNYWtlQ29tcHJlc3NlZFN0cmVhbQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSU1ha2VDb21wcmVzc2VkU3RyZWFtKFBBVklTVFJFQU0gKnBwc0NvbXByZXNzZWQsCgkJCQkgICAgICAgUEFWSVNUUkVBTSBwc1NvdXJjZSwKCQkJCSAgICAgICBMUEFWSUNPTVBSRVNTT1BUSU9OUyBhY28sCgkJCQkgICAgICAgTFBDTFNJRCBwY2xzaWRIYW5kbGVyKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBDSEFSICAgICAgICAgICBzelJlZ0tleVsyNV07CiAgQ0hBUiAgICAgICAgICAgc3pWYWx1ZVsxMDBdOwogIENMU0lEICAgICAgICAgIGNsc2lkSGFuZGxlcjsKICBIUkVTVUxUICAgICAgICBocjsKICBMT05HICAgICAgICAgICBzaXplID0gc2l6ZW9mKHN6VmFsdWUpOwoKICBUUkFDRSgiKCVwLCVwLCVwLCVzKVxuIiwgcHBzQ29tcHJlc3NlZCwgcHNTb3VyY2UsIGFjbywKCWRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBzQ29tcHJlc3NlZCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKICBpZiAocHNTb3VyY2UgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICAqcHBzQ29tcHJlc3NlZCA9IE5VTEw7CgogIC8qIGlmIG5vIGhhbmRsZXIgZ2l2ZW4gZ2V0IGRlZmF1bHQgb25lcyBiYXNlZCBvbiBzdHJlYW10eXBlICovCiAgaWYgKHBjbHNpZEhhbmRsZXIgPT0gTlVMTCkgewogICAgaHIgPSBJQVZJU3RyZWFtX0luZm8ocHNTb3VyY2UsICZhc2l3LCBzaXplb2YoYXNpdykpOwogICAgaWYgKEZBSUxFRChocikpCiAgICAgIHJldHVybiBocjsKCiAgICB3c3ByaW50ZkEoc3pSZWdLZXksICJBVklGaWxlXFxDb21wcmVzc29yc1xcJTQuNHMiLCAoY2hhciopJmFzaXcuZmNjVHlwZSk7CiAgICBpZiAoUmVnUXVlcnlWYWx1ZUEoSEtFWV9DTEFTU0VTX1JPT1QsIHN6UmVnS2V5LCBzelZhbHVlLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKICAgIGlmIChBVklGSUxFX0NMU0lERnJvbVN0cmluZyhzelZhbHVlLCAmY2xzaWRIYW5kbGVyKSAhPSBTX09LKQogICAgICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwogIH0gZWxzZQogICAgbWVtY3B5KCZjbHNpZEhhbmRsZXIsIHBjbHNpZEhhbmRsZXIsIHNpemVvZihjbHNpZEhhbmRsZXIpKTsKCiAgaHIgPSBTSENvQ3JlYXRlSW5zdGFuY2UoTlVMTCwgJmNsc2lkSGFuZGxlciwgTlVMTCwKCQkJICAmSUlEX0lBVklTdHJlYW0sIChMUFZPSUQqKXBwc0NvbXByZXNzZWQpOwogIGlmIChGQUlMRUQoaHIpIHx8ICpwcHNDb21wcmVzc2VkID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSVN0cmVhbV9DcmVhdGUoKnBwc0NvbXByZXNzZWQsIChMUEFSQU0pcHNTb3VyY2UsIChMUEFSQU0pYWNvKTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgSUFWSVN0cmVhbV9SZWxlYXNlKCpwcHNDb21wcmVzc2VkKTsKICAgICpwcHNDb21wcmVzc2VkID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklNYWtlRmlsZUZyb21TdHJlYW1zCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJTWFrZUZpbGVGcm9tU3RyZWFtcyhQQVZJRklMRSAqcHBmaWxlLCBpbnQgblN0cmVhbXMsCgkJCQkgICAgICBQQVZJU1RSRUFNICpwcFN0cmVhbXMpCnsKICBUUkFDRSgiKCVwLCVkLCVwKVxuIiwgcHBmaWxlLCBuU3RyZWFtcywgcHBTdHJlYW1zKTsKCiAgaWYgKG5TdHJlYW1zIDwgMCB8fCBwcGZpbGUgPT0gTlVMTCB8fCBwcFN0cmVhbXMgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGZpbGUgPSBBVklGSUxFX0NyZWF0ZUFWSVRlbXBGaWxlKG5TdHJlYW1zLCBwcFN0cmVhbXMpOwogIGlmICgqcHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgcmV0dXJuIEFWSUVSUl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGUJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGVBCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtT3BlbkZyb21GaWxlICAgKEFWSUZJTEUuMTAzKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtT3BlbkZyb21GaWxlQShQQVZJU1RSRUFNICpwcGF2aSwgTFBDU1RSIHN6RmlsZSwKCQkJCSAgICAgIERXT1JEIGZjY1R5cGUsIExPTkcgbFBhcmFtLAoJCQkJICAgICAgVUlOVCBtb2RlLCBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBQQVZJRklMRSBwZmlsZSA9IE5VTEw7CiAgSFJFU1VMVCAgaHI7CgogIFRSQUNFKCIoJXAsJXMsJyU0LjRzJywlbGQsMHglWCwlcylcbiIsIHBwYXZpLCBkZWJ1Z3N0cl9hKHN6RmlsZSksCgkoY2hhciopJmZjY1R5cGUsIGxQYXJhbSwgbW9kZSwgZGVidWdzdHJfZ3VpZChwY2xzaWRIYW5kbGVyKSk7CgogIGlmIChwcGF2aSA9PSBOVUxMIHx8IHN6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwYXZpID0gTlVMTDsKCiAgaHIgPSBBVklGaWxlT3BlbkEoJnBmaWxlLCBzekZpbGUsIG1vZGUsIHBjbHNpZEhhbmRsZXIpOwogIGlmIChGQUlMRUQoaHIpIHx8IHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSUZpbGVfR2V0U3RyZWFtKHBmaWxlLCBwcGF2aSwgZmNjVHlwZSwgbFBhcmFtKTsKICBJQVZJRmlsZV9SZWxlYXNlKHBmaWxlKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbU9wZW5Gcm9tRmlsZVcJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1PcGVuRnJvbUZpbGVXKFBBVklTVFJFQU0gKnBwYXZpLCBMUENXU1RSIHN6RmlsZSwKCQkJCSAgICAgIERXT1JEIGZjY1R5cGUsIExPTkcgbFBhcmFtLAoJCQkJICAgICAgVUlOVCBtb2RlLCBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBQQVZJRklMRSBwZmlsZSA9IE5VTEw7CiAgSFJFU1VMVCAgaHI7CgogIFRSQUNFKCIoJXAsJXMsJyU0LjRzJywlbGQsMHglWCwlcylcbiIsIHBwYXZpLCBkZWJ1Z3N0cl93KHN6RmlsZSksCgkoY2hhciopJmZjY1R5cGUsIGxQYXJhbSwgbW9kZSwgZGVidWdzdHJfZ3VpZChwY2xzaWRIYW5kbGVyKSk7CgogIGlmIChwcGF2aSA9PSBOVUxMIHx8IHN6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwYXZpID0gTlVMTDsKCiAgaHIgPSBBVklGaWxlT3BlblcoJnBmaWxlLCBzekZpbGUsIG1vZGUsIHBjbHNpZEhhbmRsZXIpOwogIGlmIChGQUlMRUQoaHIpIHx8IHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSUZpbGVfR2V0U3RyZWFtKHBmaWxlLCBwcGF2aSwgZmNjVHlwZSwgbFBhcmFtKTsKICBJQVZJRmlsZV9SZWxlYXNlKHBmaWxlKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUJlZ2luU3RyZWFtaW5nCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtQmVnaW5TdHJlYW1pbmcoUEFWSVNUUkVBTSBwYXZpLCBMT05HIGxTdGFydCwgTE9ORyBsRW5kLCBMT05HIGxSYXRlKQp7CiAgSUFWSVN0cmVhbWluZyogcHN0cmVhbSA9IE5VTEw7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlbGQsJWxkLCVsZClcbiIsIHBhdmksIGxTdGFydCwgbEVuZCwgbFJhdGUpOwoKICBpZiAocGF2aSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwYXZpLCAmSUlEX0lBVklTdHJlYW1pbmcsIChMUFZPSUQqKSZwc3RyZWFtKTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwc3RyZWFtICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSVN0cmVhbWluZ19CZWdpbihwc3RyZWFtLCBsU3RhcnQsIGxFbmQsIGxSYXRlKTsKICAgIElBVklTdHJlYW1pbmdfUmVsZWFzZShwc3RyZWFtKTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX09LOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtRW5kU3RyZWFtaW5nCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtRW5kU3RyZWFtaW5nKFBBVklTVFJFQU0gcGF2aSkKewogIElBVklTdHJlYW1pbmcqIHBzdHJlYW0gPSBOVUxMOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXApXG4iLCBwYXZpKTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBhdmksICZJSURfSUFWSVN0cmVhbWluZywgKExQVk9JRCopJnBzdHJlYW0pOwogIGlmIChTVUNDRUVERUQoaHIpICYmIHBzdHJlYW0gIT0gTlVMTCkgewogICAgSUFWSVN0cmVhbWluZ19FbmQocHN0cmVhbSk7CiAgICBJQVZJU3RyZWFtaW5nX1JlbGVhc2UocHN0cmVhbSk7CiAgfQoKIHJldHVybiBBVklFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtU3RhcnQJCShBVklGSUxFLjEzMCkKICoJCUFWSVN0cmVhbVN0YXJ0CQkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbVN0YXJ0KFBBVklTVFJFQU0gcHN0cmVhbSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CgogIFRSQUNFKCIoJXApXG4iLCBwc3RyZWFtKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiAwOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKSkpCiAgICByZXR1cm4gMDsKCiAgcmV0dXJuIGFzaXcuZHdTdGFydDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1MZW5ndGgJCShBVklGSUxFLjEzMSkKICoJCUFWSVN0cmVhbUxlbmd0aAkJKEFWSUZJTDMyLkApCiAqLwpMT05HIFdJTkFQSSBBVklTdHJlYW1MZW5ndGgoUEFWSVNUUkVBTSBwc3RyZWFtKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKCiAgVFJBQ0UoIiglcClcbiIsIHBzdHJlYW0pOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIDA7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAwOwoKICByZXR1cm4gYXNpdy5kd0xlbmd0aDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1TYW1wbGVUb1RpbWUJKEFWSUZJTEUuMTMzKQogKgkJQVZJU3RyZWFtU2FtcGxlVG9UaW1lCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtU2FtcGxlVG9UaW1lKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBsU2FtcGxlKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBMT05HIHRpbWU7CgogIFRSQUNFKCIoJXAsJWxkKVxuIiwgcHN0cmVhbSwgbFNhbXBsZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAtMTsKICBpZiAoYXNpdy5kd1JhdGUgPT0gMCkKICAgIHJldHVybiAtMTsKCiAgLyogbGltaXQgdG8gc3RyZWFtIGJvdW5kcyAqLwogIGlmIChsU2FtcGxlIDwgYXNpdy5kd1N0YXJ0KQogICAgbFNhbXBsZSA9IGFzaXcuZHdTdGFydDsKICBpZiAobFNhbXBsZSA+IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGgpCiAgICBsU2FtcGxlID0gYXNpdy5kd1N0YXJ0ICsgYXNpdy5kd0xlbmd0aDsKCiAgaWYgKGFzaXcuZHdSYXRlIC8gYXNpdy5kd1NjYWxlIDwgMTAwMCkKICAgIHRpbWUgPSAoTE9ORykoKChmbG9hdClsU2FtcGxlICogYXNpdy5kd1NjYWxlICogMTAwMCkgLyBhc2l3LmR3UmF0ZSk7CiAgZWxzZQogICAgdGltZSA9IChMT05HKSgoKGZsb2F0KWxTYW1wbGUgKiBhc2l3LmR3U2NhbGUgKiAxMDAwICsgKGFzaXcuZHdSYXRlIC0gMSkpIC8gYXNpdy5kd1JhdGUpOwoKICBUUkFDRSgiIC0+ICVsZFxuIix0aW1lKTsKICByZXR1cm4gdGltZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1UaW1lVG9TYW1wbGUJKEFWSUZJTEUuMTMyKQogKgkJQVZJU3RyZWFtVGltZVRvU2FtcGxlCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtVGltZVRvU2FtcGxlKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBsVGltZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgVUxPTkcgc2FtcGxlOwoKICBUUkFDRSgiKCVwLCVsZClcbiIsIHBzdHJlYW0sIGxUaW1lKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCB8fCBsVGltZSA8IDApCiAgICByZXR1cm4gLTE7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAtMTsKICBpZiAoYXNpdy5kd1NjYWxlID09IDApCiAgICByZXR1cm4gLTE7CgogIGlmIChhc2l3LmR3UmF0ZSAvIGFzaXcuZHdTY2FsZSA8IDEwMDApCiAgICBzYW1wbGUgPSAoTE9ORykoKCgoZmxvYXQpYXNpdy5kd1JhdGUgKiBsVGltZSkgLyAoYXNpdy5kd1NjYWxlICogMTAwMCkpKTsKICBlbHNlCiAgICBzYW1wbGUgPSAoTE9ORykoKChmbG9hdClhc2l3LmR3UmF0ZSAqIGxUaW1lICsgKGFzaXcuZHdTY2FsZSAqIDEwMDAgLSAxKSkgLyAoYXNpdy5kd1NjYWxlICogMTAwMCkpOwoKICAvKiBsaW1pdCB0byBzdHJlYW0gYm91bmRzICovCiAgaWYgKHNhbXBsZSA8IGFzaXcuZHdTdGFydCkKICAgIHNhbXBsZSA9IGFzaXcuZHdTdGFydDsKICBpZiAoc2FtcGxlID4gYXNpdy5kd1N0YXJ0ICsgYXNpdy5kd0xlbmd0aCkKICAgIHNhbXBsZSA9IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGg7CgogIFRSQUNFKCIgLT4gJWxkXG4iLCBzYW1wbGUpOwogIHJldHVybiBzYW1wbGU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQnVpbGRGaWx0ZXIJCShBVklGSUwzMi5AKQogKgkJQVZJQnVpbGRGaWx0ZXJBCQkoQVZJRklMMzIuQCkKICoJCUFWSUJ1aWxkRmlsdGVyCQkoQVZJRklMRS4xMjMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklCdWlsZEZpbHRlckEoTFBTVFIgc3pGaWx0ZXIsIExPTkcgY2JGaWx0ZXIsIEJPT0wgZlNhdmluZykKewogIExQV1NUUiAgd3N6RmlsdGVyOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJWxkLCVkKVxuIiwgc3pGaWx0ZXIsIGNiRmlsdGVyLCBmU2F2aW5nKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChzekZpbHRlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKICBpZiAoY2JGaWx0ZXIgPCAyKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBzekZpbHRlclswXSA9IDA7CiAgc3pGaWx0ZXJbMV0gPSAwOwoKICB3c3pGaWx0ZXIgPSAoTFBXU1RSKUdsb2JhbEFsbG9jUHRyKEdITkQsIGNiRmlsdGVyICogc2l6ZW9mKFdDSEFSKSk7CiAgaWYgKHdzekZpbHRlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIGhyID0gQVZJQnVpbGRGaWx0ZXJXKHdzekZpbHRlciwgY2JGaWx0ZXIsIGZTYXZpbmcpOwogIGlmIChTVUNDRUVERUQoaHIpKSB7CiAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgd3N6RmlsdGVyLCBjYkZpbHRlciwKCQkJc3pGaWx0ZXIsIGNiRmlsdGVyLCBOVUxMLCBOVUxMKTsKICB9CgogIEdsb2JhbEZyZWVQdHIod3N6RmlsdGVyKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUJ1aWxkRmlsdGVyVwkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklCdWlsZEZpbHRlclcoTFBXU1RSIHN6RmlsdGVyLCBMT05HIGNiRmlsdGVyLCBCT09MIGZTYXZpbmcpCnsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pDbHNpZFtdID0geydDJywnTCcsJ1MnLCdJJywnRCcsMH07CiAgc3RhdGljIGNvbnN0IFdDSEFSIHN6RXh0ZW5zaW9uRm10W10gPSB7JzsnLCcqJywnLicsJyUnLCdzJywwfTsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pBVklGaWxlRXh0ZW5zaW9uc1tdID0KICAgIHsnQScsJ1YnLCdJJywnRicsJ2knLCdsJywnZScsJ1xcJywnRScsJ3gnLCd0JywnZScsJ24nLCdzJywnaScsJ28nLCduJywncycsMH07CgogIEFWSUZpbHRlciAqbHA7CiAgV0NIQVIgICAgICBzekFsbEZpbGVzWzQwXTsKICBXQ0hBUiAgICAgIHN6RmlsZUV4dFsxMF07CiAgV0NIQVIgICAgICBzelZhbHVlWzEyOF07CiAgSEtFWSAgICAgICBoS2V5OwogIERXT1JEICAgICAgbiwgaTsKICBMT05HICAgICAgIHNpemU7CiAgRFdPUkQgICAgICBjb3VudCA9IDA7CgogIFRSQUNFKCIoJXAsJWxkLCVkKVxuIiwgc3pGaWx0ZXIsIGNiRmlsdGVyLCBmU2F2aW5nKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChzekZpbHRlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKICBpZiAoY2JGaWx0ZXIgPCAyKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBscCA9IChBVklGaWx0ZXIqKUdsb2JhbEFsbG9jUHRyKEdITkQsIE1BWF9GSUxURVJTICogc2l6ZW9mKEFWSUZpbHRlcikpOwogIGlmIChscCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIC8qCiAgICogMS4gaXRlcmF0ZSBvdmVyIEhLRVlfQ0xBU1NFU19ST09UXFxBVklGaWxlXFxFeHRlbnNpb25zIGFuZCBjb2xsZWN0CiAgICogICAgZXh0ZW5zaW9ucyBhbmQgQ0xTSUQncwogICAqIDIuIGl0ZXJhdGUgb3ZlciBjb2xsZWN0ZWQgQ0xTSUQncyBhbmQgY29weSBpdHMgZGVzY3JpcHRpb24gYW5kIGl0cwogICAqICAgIGV4dGVuc2lvbnMgdG8gc3pGaWx0ZXIgaWYgaXQgZml0cwogICAqCiAgICogRmlyc3QgZmlsdGVyIGlzIG5hbWVkICJBbGwgbXVsdGltZWRpYSBmaWxlcyIgYW5kIGl0cyBmaWx0ZXIgaXMgYQogICAqIGNvbGxlY3Rpb24gb2YgYWxsIHBvc3NpYmxlIGV4dGVuc2lvbnMgZXhjZXB0ICIqLioiLgogICAqLwogIGlmIChSZWdPcGVuS2V5VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pBVklGaWxlRXh0ZW5zaW9ucywgJmhLZXkpICE9IFNfT0spIHsKICAgIEdsb2JhbEZyZWVQdHIobHApOwogICAgcmV0dXJuIEFWSUVSUl9FUlJPUjsKICB9CiAgZm9yIChuID0gMDtSZWdFbnVtS2V5VyhoS2V5LCBuLCBzekZpbGVFeHQsIHNpemVvZihzekZpbGVFeHQpKSA9PSBTX09LO24rKykgewogICAgLyogZ2V0IENMU0lEIHRvIGV4dGVuc2lvbiAqLwogICAgc2l6ZSA9IHNpemVvZihzelZhbHVlKS9zaXplb2Yoc3pWYWx1ZVswXSk7CiAgICBpZiAoUmVnUXVlcnlWYWx1ZVcoaEtleSwgc3pGaWxlRXh0LCBzelZhbHVlLCAmc2l6ZSkgIT0gU19PSykKICAgICAgYnJlYWs7CgogICAgLyogc2VhcmNoIGlmIHRoZSBDTFNJRCBpcyBhbHJlYWR5IGtub3duICovCiAgICBmb3IgKGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKICAgICAgaWYgKGxzdHJjbXBXKGxwW2ldLnN6Q2xzaWQsIHN6VmFsdWUpID09IDApCglicmVhazsgLyogYSBuZXcgb25lICovCiAgICB9CgogICAgaWYgKGNvdW50IC0gaSA9PSAtMVUpIHsKICAgICAgLyogaXQncyBhIG5ldyBDTFNJRCAqLwoKICAgICAgLyogRklYTUU6IEhvdyBkbyB3ZSBnZXQgaW5mbydzIGFib3V0IHJlYWQvd3JpdGUgY2FwYWJpbGl0aWVzPyAqLwoKICAgICAgaWYgKGNvdW50ID49IE1BWF9GSUxURVJTKSB7CgkvKiB0cnkgdG8gaW5mb3JtIHVzZXIgb2Ygb3VyIGZ1bGwgZml4ZWQgc2l6ZSB0YWJsZSAqLwoJRVJSKCI6IE1vcmUgdGhhbiAlZCBmaWx0ZXJzIGZvdW5kISBBZGp1c3QgTUFYX0ZJTFRFUlMgaW4gZGxscy9hdmlmaWwzMi9hcGkuY1xuIiwgTUFYX0ZJTFRFUlMpOwoJYnJlYWs7CiAgICAgIH0KCiAgICAgIGxzdHJjcHlXKGxwW2ldLnN6Q2xzaWQsIHN6VmFsdWUpOwoKICAgICAgY291bnQrKzsKICAgIH0KCiAgICAvKiBhcHBlbmQgZXh0ZW5zaW9uIHRvIHRoZSBmaWx0ZXIgKi8KICAgIHdzcHJpbnRmVyhzelZhbHVlLCBzekV4dGVuc2lvbkZtdCwgc3pGaWxlRXh0KTsKICAgIGlmIChscFtpXS5zekV4dGVuc2lvbnNbMF0gPT0gMCkKICAgICAgbHN0cmNhdFcobHBbaV0uc3pFeHRlbnNpb25zLCBzelZhbHVlICsgMSk7CiAgICBlbHNlCiAgICAgIGxzdHJjYXRXKGxwW2ldLnN6RXh0ZW5zaW9ucywgc3pWYWx1ZSk7CgogICAgLyogYWxzbyBhcHBlbmQgdG8gdGhlICJhbGwgbXVsdGltZWRpYSItZmlsdGVyICovCiAgICBpZiAobHBbMF0uc3pFeHRlbnNpb25zWzBdID09IDApCiAgICAgIGxzdHJjYXRXKGxwWzBdLnN6RXh0ZW5zaW9ucywgc3pWYWx1ZSArIDEpOwogICAgZWxzZQogICAgICBsc3RyY2F0VyhscFswXS5zekV4dGVuc2lvbnMsIHN6VmFsdWUpOwogIH0KICBSZWdDbG9zZUtleShoS2V5KTsKCiAgLyogMi4gZ2V0IGRlc2NyaXB0aW9ucyBmb3IgdGhlIENMU0lEcyBhbmQgZmlsbCBvdXQgc3pGaWx0ZXIgKi8KICBpZiAoUmVnT3BlbktleVcoSEtFWV9DTEFTU0VTX1JPT1QsIHN6Q2xzaWQsICZoS2V5KSAhPSBTX09LKSB7CiAgICBHbG9iYWxGcmVlUHRyKGxwKTsKICAgIHJldHVybiBBVklFUlJfRVJST1I7CiAgfQogIGZvciAobiA9IDA7IG4gPD0gY291bnQ7IG4rKykgewogICAgLyogZmlyc3QgdGhlIGRlc2NyaXB0aW9uICovCiAgICBpZiAobiAhPSAwKSB7CiAgICAgIHNpemUgPSBzaXplb2Yoc3pWYWx1ZSkvc2l6ZW9mKHN6VmFsdWVbMF0pOwogICAgICBpZiAoUmVnUXVlcnlWYWx1ZVcoaEtleSwgbHBbbl0uc3pDbHNpZCwgc3pWYWx1ZSwgJnNpemUpID09IFNfT0spIHsKCXNpemUgPSBsc3RybGVuVyhzelZhbHVlKTsKCWxzdHJjcHluVyhzekZpbHRlciwgc3pWYWx1ZSwgY2JGaWx0ZXIpOwogICAgICB9CiAgICB9IGVsc2UKICAgICAgc2l6ZSA9IExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSxJRFNfQUxMTVVMVElNRURJQSxzekZpbHRlcixjYkZpbHRlcik7CgogICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLwogICAgc2l6ZSsrOwogICAgaWYgKGNiRmlsdGVyIDwgc2l6ZSArIGxzdHJsZW5XKGxwW25dLnN6RXh0ZW5zaW9ucykgKyAyKSB7CiAgICAgIHN6RmlsdGVyWzBdID0gMDsKICAgICAgc3pGaWx0ZXJbMV0gPSAwOwogICAgICBHbG9iYWxGcmVlUHRyKGxwKTsKICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CiAgICAgIHJldHVybiBBVklFUlJfQlVGRkVSVE9PU01BTEw7CiAgICB9CiAgICBjYkZpbHRlciAtPSBzaXplOwogICAgc3pGaWx0ZXIgKz0gc2l6ZTsKCiAgICAvKiBhbmQgdGhlbiB0aGUgZmlsdGVyICovCiAgICBsc3RyY3B5blcoc3pGaWx0ZXIsIGxwW25dLnN6RXh0ZW5zaW9ucywgY2JGaWx0ZXIpOwogICAgc2l6ZSA9IGxzdHJsZW5XKGxwW25dLnN6RXh0ZW5zaW9ucykgKyAxOwogICAgY2JGaWx0ZXIgLT0gc2l6ZTsKICAgIHN6RmlsdGVyICs9IHNpemU7CiAgfQoKICBSZWdDbG9zZUtleShoS2V5KTsKICBHbG9iYWxGcmVlUHRyKGxwKTsKCiAgLyogYWRkICJBbGwgZmlsZXMiICIqLioiIGZpbHRlciBpZiBlbm91Z2ggc3BhY2UgbGVmdCAqLwogIHNpemUgPSBMb2FkU3RyaW5nVyhBVklGSUxFX2hNb2R1bGUsIElEU19BTExGSUxFUywKCQkgICAgIHN6QWxsRmlsZXMsIHNpemVvZihzekFsbEZpbGVzKSkgKyAxOwogIGlmIChjYkZpbHRlciA+IHNpemUpIHsKICAgIGludCBpOwoKICAgIC8qIHJlcGxhY2UgJ0AnIHdpdGggXDAwMCB0byBzZXBhcmF0ZSBkZXNjcmlwdGlvbiBvZiBmaWx0ZXIgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBzaXplICYmIHN6QWxsRmlsZXNbaV0gIT0gMDsgaSsrKSB7CiAgICAgIGlmIChzekFsbEZpbGVzW2ldID09ICdAJykgewoJc3pBbGxGaWxlc1tpXSA9IDA7CglicmVhazsKICAgICAgfQogICAgfQogICAgICAKICAgIG1lbWNweShzekZpbHRlciwgc3pBbGxGaWxlcywgc2l6ZSAqIHNpemVvZihzekFsbEZpbGVzWzBdKSk7CiAgICBzekZpbHRlciArPSBzaXplOwogICAgc3pGaWx0ZXJbMF0gPSAwOwoKICAgIHJldHVybiBBVklFUlJfT0s7CiAgfSBlbHNlIHsKICAgIHN6RmlsdGVyWzBdID0gMDsKICAgIHJldHVybiBBVklFUlJfQlVGRkVSVE9PU01BTEw7CiAgfQp9CgpzdGF0aWMgQk9PTCBBVklTYXZlT3B0aW9uc0ZtdENob29zZShIV05EIGhXbmQpCnsKICBMUEFWSUNPTVBSRVNTT1BUSU9OUyBwT3B0aW9ucyA9IFNhdmVPcHRzLnBwT3B0aW9uc1tTYXZlT3B0cy5uQ3VycmVudF07CiAgQVZJU1RSRUFNSU5GT1cgICAgICAgc0luZm87CgogIFRSQUNFKCIoJXApXG4iLCBoV25kKTsKCiAgaWYgKHBPcHRpb25zID09IE5VTEwgfHwgU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSA9PSBOVUxMKSB7CiAgICBFUlIoIjogYmFkIHN0YXRlIVxuIik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoRkFJTEVEKEFWSVN0cmVhbUluZm9XKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sCgkJCSAgICAmc0luZm8sIHNpemVvZihzSW5mbykpKSkgewogICAgRVJSKCI6IEFWSVN0cmVhbUluZm9XIGZhaWxlZCFcbiIpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSB7CiAgICBDT01QVkFSUyBjdjsKICAgIEJPT0wgICAgIHJldDsKCiAgICBtZW1zZXQoJmN2LCAwLCBzaXplb2YoY3YpKTsKCiAgICBpZiAoKHBPcHRpb25zLT5kd0ZsYWdzICYgQVZJQ09NUFJFU1NGX1ZBTElEKSA9PSAwKSB7CiAgICAgIG1lbXNldChwT3B0aW9ucywgMCwgc2l6ZW9mKEFWSUNPTVBSRVNTT1BUSU9OUykpOwogICAgICBwT3B0aW9ucy0+ZmNjVHlwZSAgICA9IHN0cmVhbXR5cGVWSURFTzsKICAgICAgcE9wdGlvbnMtPmZjY0hhbmRsZXIgPSBjb21wdHlwZURJQjsKICAgICAgcE9wdGlvbnMtPmR3UXVhbGl0eSAgPSAoRFdPUkQpSUNRVUFMSVRZX0RFRkFVTFQ7CiAgICB9CgogICAgY3YuY2JTaXplICAgICA9IHNpemVvZihjdik7CiAgICBjdi5kd0ZsYWdzICAgID0gSUNNRl9DT01QVkFSU19WQUxJRDsKICAgIC8qY3YuZmNjVHlwZSAgICA9IHBPcHRpb25zLT5mY2NUeXBlOyAqLwogICAgY3YuZmNjSGFuZGxlciA9IHBPcHRpb25zLT5mY2NIYW5kbGVyOwogICAgY3YubFEgICAgICAgICA9IHBPcHRpb25zLT5kd1F1YWxpdHk7CiAgICBjdi5scFN0YXRlICAgID0gcE9wdGlvbnMtPmxwUGFybXM7CiAgICBjdi5jYlN0YXRlICAgID0gcE9wdGlvbnMtPmNiUGFybXM7CiAgICBpZiAocE9wdGlvbnMtPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfS0VZRlJBTUVTKQogICAgICBjdi5sS2V5ID0gcE9wdGlvbnMtPmR3S2V5RnJhbWVFdmVyeTsKICAgIGVsc2UKICAgICAgY3YubEtleSA9IDA7CiAgICBpZiAocE9wdGlvbnMtPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfREFUQVJBVEUpCiAgICAgIGN2LmxEYXRhUmF0ZSA9IHBPcHRpb25zLT5kd0J5dGVzUGVyU2Vjb25kIC8gMTAyNDsgLyogbmVlZCBrQnl0ZXMgKi8KICAgIGVsc2UKICAgICAgY3YubERhdGFSYXRlID0gMDsKCiAgICByZXQgPSBJQ0NvbXByZXNzb3JDaG9vc2UoaFduZCwgU2F2ZU9wdHMudUZsYWdzLCBOVUxMLAoJCQkgICAgIFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sICZjdiwgTlVMTCk7CgogICAgaWYgKHJldCkgewogICAgICBwT3B0aW9ucy0+ZmNjSGFuZGxlciA9IGN2LmZjY0hhbmRsZXI7CiAgICAgIHBPcHRpb25zLT5scFBhcm1zICAgPSBjdi5scFN0YXRlOwogICAgICBwT3B0aW9ucy0+Y2JQYXJtcyAgID0gY3YuY2JTdGF0ZTsKICAgICAgcE9wdGlvbnMtPmR3UXVhbGl0eSA9IGN2LmxROwogICAgICBpZiAoY3YubEtleSAhPSAwKSB7CglwT3B0aW9ucy0+ZHdLZXlGcmFtZUV2ZXJ5ID0gY3YubEtleTsKCXBPcHRpb25zLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9LRVlGUkFNRVM7CiAgICAgIH0gZWxzZQoJcE9wdGlvbnMtPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9LRVlGUkFNRVM7CiAgICAgIGlmIChjdi5sRGF0YVJhdGUgIT0gMCkgewoJcE9wdGlvbnMtPmR3Qnl0ZXNQZXJTZWNvbmQgPSBjdi5sRGF0YVJhdGUgKiAxMDI0OyAvKiBuZWVkIGJ5dGVzICovCglwT3B0aW9ucy0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfREFUQVJBVEU7CiAgICAgIH0gZWxzZQoJcE9wdGlvbnMtPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9EQVRBUkFURTsKICAgICAgcE9wdGlvbnMtPmR3RmxhZ3MgIHw9IEFWSUNPTVBSRVNTRl9WQUxJRDsKICAgIH0KICAgIElDQ29tcHJlc3NvckZyZWUoJmN2KTsKCiAgICByZXR1cm4gcmV0OwogIH0gZWxzZSBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlQVVESU8pIHsKICAgIEFDTUZPUk1BVENIT09TRVcgYWZtdGM7CiAgICBNTVJFU1VMVCAgICAgICAgIHJldDsKICAgIExPTkcgICAgICAgICAgICAgc2l6ZTsKCiAgICAvKiBGSVhNRTogY2hlY2sgQUNNIHZlcnNpb24gLS0gV2hpY2ggdmVyc2lvbiBpcyBuZWVkZWQ/ICovCgogICAgbWVtc2V0KCZhZm10YywgMCwgc2l6ZW9mKGFmbXRjKSk7CiAgICBhZm10Yy5jYlN0cnVjdCAgPSBzaXplb2YoYWZtdGMpOwogICAgYWZtdGMuZmR3U3R5bGUgID0gMDsKICAgIGFmbXRjLmh3bmRPd25lciA9IGhXbmQ7CgogICAgYWNtTWV0cmljcyhOVUxMLCBBQ01fTUVUUklDX01BWF9TSVpFX0ZPUk1BVCwgJnNpemUpOwogICAgaWYgKChwT3B0aW9ucy0+Y2JGb3JtYXQgPT0gMCB8fCBwT3B0aW9ucy0+bHBGb3JtYXQgPT0gTlVMTCkgJiYgc2l6ZSAhPSAwKSB7CiAgICAgIHBPcHRpb25zLT5scEZvcm1hdCA9IEdsb2JhbEFsbG9jUHRyKEdNRU1fTU9WRUFCTEUsIHNpemUpOwogICAgICBwT3B0aW9ucy0+Y2JGb3JtYXQgPSBzaXplOwogICAgfSBlbHNlIGlmIChwT3B0aW9ucy0+Y2JGb3JtYXQgPCAoRFdPUkQpc2l6ZSkgewogICAgICBwT3B0aW9ucy0+bHBGb3JtYXQgPSBHbG9iYWxSZUFsbG9jUHRyKHBPcHRpb25zLT5scEZvcm1hdCwgc2l6ZSwgR01FTV9NT1ZFQUJMRSk7CiAgICAgIHBPcHRpb25zLT5jYkZvcm1hdCA9IHNpemU7CiAgICB9CiAgICBpZiAocE9wdGlvbnMtPmxwRm9ybWF0ID09IE5VTEwpCiAgICAgIHJldHVybiBGQUxTRTsKICAgIGFmbXRjLnB3ZnggID0gcE9wdGlvbnMtPmxwRm9ybWF0OwogICAgYWZtdGMuY2J3ZnggPSBwT3B0aW9ucy0+Y2JGb3JtYXQ7CgogICAgc2l6ZSA9IDA7CiAgICBBVklTdHJlYW1Gb3JtYXRTaXplKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sCgkJCXNJbmZvLmR3U3RhcnQsICZzaXplKTsKICAgIGlmIChzaXplIDwgKExPTkcpc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKQogICAgICBzaXplID0gc2l6ZW9mKFBDTVdBVkVGT1JNQVQpOwogICAgYWZtdGMucHdmeEVudW0gPSBHbG9iYWxBbGxvY1B0cihHSE5ELCBzaXplKTsKICAgIGlmIChhZm10Yy5wd2Z4RW51bSAhPSBOVUxMKSB7CiAgICAgIEFWSVN0cmVhbVJlYWRGb3JtYXQoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwKCQkJICBzSW5mby5kd1N0YXJ0LCBhZm10Yy5wd2Z4RW51bSwgJnNpemUpOwogICAgICBhZm10Yy5mZHdFbnVtID0gQUNNX0ZPUk1BVEVOVU1GX0NPTlZFUlQ7CiAgICB9CgogICAgcmV0ID0gYWNtRm9ybWF0Q2hvb3NlVygmYWZtdGMpOwogICAgaWYgKHJldCA9PSBTX09LKQogICAgICBwT3B0aW9ucy0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfVkFMSUQ7CgogICAgaWYgKGFmbXRjLnB3ZnhFbnVtICE9IE5VTEwpCiAgICAgIEdsb2JhbEZyZWVQdHIoYWZtdGMucHdmeEVudW0pOwoKICAgIHJldHVybiAocmV0ID09IFNfT0sgPyBUUlVFIDogRkFMU0UpOwogIH0gZWxzZSB7CiAgICBFUlIoIjogdW5rbm93biBzdHJlYW10eXBlIDB4JTA4bFhcbiIsIHNJbmZvLmZjY1R5cGUpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KfQoKc3RhdGljIHZvaWQgQVZJU2F2ZU9wdGlvbnNVcGRhdGUoSFdORCBoV25kKQp7CiAgc3RhdGljIGNvbnN0IFdDSEFSIHN6VmlkZW9GbXRbXT17JyUnLCdsJywnZCcsJ3gnLCclJywnbCcsJ2QnLCd4JywnJScsJ2QnLDB9OwogIHN0YXRpYyBjb25zdCBXQ0hBUiBzekF1ZGlvRm10W109eyclJywncycsJyAnLCclJywncycsMH07CgogIFdDSEFSICAgICAgICAgIHN6Rm9ybWF0WzEyOF07CiAgQVZJU1RSRUFNSU5GT1cgc0luZm87CiAgTFBWT0lEICAgICAgICAgbHBGb3JtYXQ7CiAgTE9ORyAgICAgICAgICAgc2l6ZTsKCiAgVFJBQ0UoIiglcClcbiIsIGhXbmQpOwoKICBTYXZlT3B0cy5uQ3VycmVudCA9IFNlbmREbGdJdGVtTWVzc2FnZVcoaFduZCxJRENfU1RSRUFNLENCX0dFVENVUlNFTCwwLDApOwogIGlmIChTYXZlT3B0cy5uQ3VycmVudCA8IDApCiAgICByZXR1cm47CgogIGlmIChGQUlMRUQoQVZJU3RyZWFtSW5mb1coU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKSkpCiAgICByZXR1cm47CgogIEFWSVN0cmVhbUZvcm1hdFNpemUoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSxzSW5mby5kd1N0YXJ0LCZzaXplKTsKICBpZiAoc2l6ZSA+IDApIHsKICAgIHN6Rm9ybWF0WzBdID0gMDsKCiAgICAvKiByZWFkIGZvcm1hdCB0byBidWlsZCBmb3JtYXQgZGVzY3JpcHRpb24gc3RyaW5nICovCiAgICBscEZvcm1hdCA9IEdsb2JhbEFsbG9jUHRyKEdITkQsIHNpemUpOwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpIHsKICAgICAgaWYgKFNVQ0NFRURFRChBVklTdHJlYW1SZWFkRm9ybWF0KFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sc0luZm8uZHdTdGFydCxscEZvcm1hdCwgJnNpemUpKSkgewoJaWYgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSB7CgkgIExQQklUTUFQSU5GT0hFQURFUiBscGJpID0gbHBGb3JtYXQ7CgkgIElDSU5GTyBpY2luZm87CgoJICB3c3ByaW50Zlcoc3pGb3JtYXQsIHN6VmlkZW9GbXQsIGxwYmktPmJpV2lkdGgsCgkJICAgIGxwYmktPmJpSGVpZ2h0LCBscGJpLT5iaUJpdENvdW50KTsKCgkgIGlmIChscGJpLT5iaUNvbXByZXNzaW9uICE9IEJJX1JHQikgewoJICAgIEhJQyAgICBoaWM7CgoJICAgIGhpYyA9IElDTG9jYXRlKElDVFlQRV9WSURFTywgc0luZm8uZmNjSGFuZGxlciwgbHBGb3JtYXQsCgkJCSAgIE5VTEwsIElDTU9ERV9ERUNPTVBSRVNTKTsKCSAgICBpZiAoaGljICE9IE5VTEwpIHsKCSAgICAgIGlmIChJQ0dldEluZm8oaGljLCAmaWNpbmZvLCBzaXplb2YoaWNpbmZvKSkgPT0gU19PSykKCQlsc3RyY2F0VyhzekZvcm1hdCwgaWNpbmZvLnN6RGVzY3JpcHRpb24pOwoJICAgICAgSUNDbG9zZShoaWMpOwoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBMb2FkU3RyaW5nVyhBVklGSUxFX2hNb2R1bGUsIElEU19VTkNPTVBSRVNTRUQsCgkJCWljaW5mby5zekRlc2NyaXB0aW9uLCBzaXplb2YoaWNpbmZvLnN6RGVzY3JpcHRpb24pKTsKCSAgICBsc3RyY2F0VyhzekZvcm1hdCwgaWNpbmZvLnN6RGVzY3JpcHRpb24pOwoJICB9Cgl9IGVsc2UgaWYgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZUFVRElPKSB7CgkgIEFDTUZPUk1BVFRBR0RFVEFJTFNXIGFmdGQ7CgkgIEFDTUZPUk1BVERFVEFJTFNXICAgIGFmZDsKCgkgIG1lbXNldCgmYWZ0ZCwgMCwgc2l6ZW9mKGFmdGQpKTsKCSAgbWVtc2V0KCZhZmQsIDAsIHNpemVvZihhZmQpKTsKCgkgIGFmdGQuY2JTdHJ1Y3QgICAgID0gc2l6ZW9mKGFmdGQpOwoJICBhZnRkLmR3Rm9ybWF0VGFnICA9IGFmZC5kd0Zvcm1hdFRhZyA9CgkgICAgKChQV0FWRUZPUk1BVEVYKWxwRm9ybWF0KS0+d0Zvcm1hdFRhZzsKCSAgYWZ0ZC5jYkZvcm1hdFNpemUgPSBhZmQuY2J3ZnggPSBzaXplOwoKCSAgYWZkLmNiU3RydWN0ICAgICAgPSBzaXplb2YoYWZkKTsKCSAgYWZkLnB3ZnggICAgICAgICAgPSBscEZvcm1hdDsKCgkgIGlmIChhY21Gb3JtYXRUYWdEZXRhaWxzVyhOVUxMLCAmYWZ0ZCwKCQkJCSAgIEFDTV9GT1JNQVRUQUdERVRBSUxTRl9GT1JNQVRUQUcpID09IFNfT0spIHsKCSAgICBpZiAoYWNtRm9ybWF0RGV0YWlsc1coTlVMTCwmYWZkLEFDTV9GT1JNQVRERVRBSUxTRl9GT1JNQVQpID09IFNfT0spCgkgICAgICB3c3ByaW50Zlcoc3pGb3JtYXQsIHN6QXVkaW9GbXQsIGFmZC5zekZvcm1hdCwgYWZ0ZC5zekZvcm1hdFRhZyk7CgkgIH0KCX0KICAgICAgfQogICAgICBHbG9iYWxGcmVlUHRyKGxwRm9ybWF0KTsKICAgIH0KCiAgICAvKiBzZXQgdGV4dCBmb3IgZm9ybWF0IGRlc2NyaXB0aW9uICovCiAgICBTZXREbGdJdGVtVGV4dFcoaFduZCwgSURDX0ZPUk1BVFRFWFQsIHN6Rm9ybWF0KTsKCiAgICAvKiBEaXNhYmxlIG9wdGlvbiBidXR0b24gZm9yIHVuc3VwcG9ydGVkIHN0cmVhbXR5cGVzICovCiAgICBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8gfHwKCXNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZUFVRElPKQogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfT1BUSU9OUyksIFRSVUUpOwogICAgZWxzZQogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfT1BUSU9OUyksIEZBTFNFKTsKICB9Cgp9CgpzdGF0aWMgSU5UX1BUUiBDQUxMQkFDSyBBVklTYXZlT3B0aW9uc0RsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHVNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiAgRFdPUkQgZHdJbnRlcmxlYXZlOwogIEJPT0wgIGJJc0ludGVybGVhdmVkOwogIElOVCAgIG47CgogIC8qVFJBQ0UoIiglcCwldSwweCUwNFgsMHglMDhsWClcbiIsIGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsqLwoKICBzd2l0Y2ggKHVNc2cpIHsKICBjYXNlIFdNX0lOSVRESUFMT0c6CiAgICBTYXZlT3B0cy5uQ3VycmVudCA9IDA7CiAgICBpZiAoU2F2ZU9wdHMublN0cmVhbXMgPT0gMSkgewogICAgICBFbmREaWFsb2coaFduZCwgQVZJU2F2ZU9wdGlvbnNGbXRDaG9vc2UoaFduZCkpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICAvKiBhZGQgc3RyZWFtcyAqLwogICAgZm9yIChuID0gMDsgbiA8IFNhdmVPcHRzLm5TdHJlYW1zOyBuKyspIHsKICAgICAgQVZJU1RSRUFNSU5GT1cgc0luZm87CgogICAgICBBVklTdHJlYW1JbmZvVyhTYXZlT3B0cy5wcGF2aXNbbl0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgICAgIFNlbmREbGdJdGVtTWVzc2FnZVcoaFduZCwgSURDX1NUUkVBTSwgQ0JfQUREU1RSSU5HLAoJCQkgIDBMLCAoTFBBUkFNKXNJbmZvLnN6TmFtZSk7CiAgICB9CgogICAgLyogc2VsZWN0IGZpcnN0IHN0cmVhbSAqLwogICAgU2VuZERsZ0l0ZW1NZXNzYWdlVyhoV25kLCBJRENfU1RSRUFNLCBDQl9TRVRDVVJTRUwsIDAsIDApOwogICAgU2VuZE1lc3NhZ2VXKGhXbmQsIFdNX0NPTU1BTkQsCgkJIEdFVF9XTV9DT01NQU5EX01QUyhJRENfU1RSRUFNLCBoV25kLCBDQk5fU0VMQ0hBTkdFKSk7CgogICAgLyogaW5pdGlhbGl6ZSBpbnRlcmxlYXZlICovCiAgICBpZiAoU2F2ZU9wdHMucHBPcHRpb25zWzBdICE9IE5VTEwgJiYKCShTYXZlT3B0cy5wcE9wdGlvbnNbMF0tPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfVkFMSUQpKSB7CiAgICAgIGJJc0ludGVybGVhdmVkID0gKFNhdmVPcHRzLnBwT3B0aW9uc1swXS0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9JTlRFUkxFQVZFKTsKICAgICAgZHdJbnRlcmxlYXZlID0gU2F2ZU9wdHMucHBPcHRpb25zWzBdLT5kd0ludGVybGVhdmVFdmVyeTsKICAgIH0gZWxzZSB7CiAgICAgIGJJc0ludGVybGVhdmVkID0gVFJVRTsKICAgICAgZHdJbnRlcmxlYXZlICAgPSAwOwogICAgfQogICAgQ2hlY2tEbGdCdXR0b24oaFduZCwgSURDX0lOVEVSTEVBVkUsIGJJc0ludGVybGVhdmVkKTsKICAgIFNldERsZ0l0ZW1JbnQoaFduZCwgSURDX0lOVEVSTEVBVkVFVkVSWSwgZHdJbnRlcmxlYXZlLCBGQUxTRSk7CiAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfSU5URVJMRUFWRUVWRVJZKSwgYklzSW50ZXJsZWF2ZWQpOwogICAgYnJlYWs7CiAgY2FzZSBXTV9DT01NQU5EOgogICAgc3dpdGNoIChHRVRfV01fQ09NTUFORF9JRCh3UGFyYW0sIGxQYXJhbSkpIHsKICAgIGNhc2UgSURPSzoKICAgICAgLyogZ2V0IGRhdGEgZnJvbSBjb250cm9scyBhbmQgc2F2ZSB0aGVtICovCiAgICAgIGR3SW50ZXJsZWF2ZSAgID0gR2V0RGxnSXRlbUludChoV25kLCBJRENfSU5URVJMRUFWRUVWRVJZLCBOVUxMLCAwKTsKICAgICAgYklzSW50ZXJsZWF2ZWQgPSBJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgSURDX0lOVEVSTEVBVkUpOwogICAgICBmb3IgKG4gPSAwOyBuIDwgU2F2ZU9wdHMublN0cmVhbXM7IG4rKykgewoJaWYgKFNhdmVPcHRzLnBwT3B0aW9uc1tuXSAhPSBOVUxMKSB7CgkgIGlmIChiSXNJbnRlcmxlYXZlZCkgewoJICAgIFNhdmVPcHRzLnBwT3B0aW9uc1tuXS0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfSU5URVJMRUFWRTsKCSAgICBTYXZlT3B0cy5wcE9wdGlvbnNbbl0tPmR3SW50ZXJsZWF2ZUV2ZXJ5ID0gZHdJbnRlcmxlYXZlOwoJICB9IGVsc2UKCSAgICBTYXZlT3B0cy5wcE9wdGlvbnNbbl0tPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9JTlRFUkxFQVZFOwoJfQogICAgICB9CiAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgY2FzZSBJRENBTkNFTDoKICAgICAgRW5kRGlhbG9nKGhXbmQsIEdFVF9XTV9DT01NQU5EX0lEKHdQYXJhbSwgbFBhcmFtKSA9PSBJRE9LKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIElEQ19JTlRFUkxFQVZFOgogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfSU5URVJMRUFWRUVWRVJZKSwKCQkgICBJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgSURDX0lOVEVSTEVBVkUpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIElEQ19TVFJFQU06CiAgICAgIGlmIChHRVRfV01fQ09NTUFORF9DTUQod1BhcmFtLCBsUGFyYW0pID09IENCTl9TRUxDSEFOR0UpIHsKCS8qIHVwZGF0ZSBjb250cm9sIGVsZW1lbnRzICovCglBVklTYXZlT3B0aW9uc1VwZGF0ZShoV25kKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgSURDX09QVElPTlM6CiAgICAgIEFWSVNhdmVPcHRpb25zRm10Q2hvb3NlKGhXbmQpOwogICAgICBicmVhazsKICAgIH07CiAgICByZXR1cm4gVFJVRTsKICB9OwoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnMJCShBVklGSUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgQVZJU2F2ZU9wdGlvbnMoSFdORCBoV25kLCBVSU5UIHVGbGFncywgSU5UIG5TdHJlYW1zLAoJCQkgICBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBwT3B0aW9ucykKewogIExQQVZJQ09NUFJFU1NPUFRJT05TIHBTYXZlZE9wdGlvbnMgPSBOVUxMOwogIElOVCByZXQsIG47CgogIFRSQUNFKCIoJXAsMHglWCwlZCwlcCwlcClcbiIsIGhXbmQsIHVGbGFncywgblN0cmVhbXMsCglwcGF2aSwgcHBPcHRpb25zKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChuU3RyZWFtcyA8PSAwIHx8IHBwYXZpID09IE5VTEwgfHwgcHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAvKiBzYXZlIG9wdGlvbnMgaW4gY2FzZSB0aGUgdXNlciBwcmVzc2VzIGNhbmNlbCAqLwogIGlmIChwcE9wdGlvbnMgIT0gTlVMTCAmJiBuU3RyZWFtcyA+IDEpIHsKICAgIHBTYXZlZE9wdGlvbnMgPSBHbG9iYWxBbGxvY1B0cihHSE5ELG5TdHJlYW1zICogc2l6ZW9mKEFWSUNPTVBSRVNTT1BUSU9OUykpOwogICAgaWYgKHBTYXZlZE9wdGlvbnMgPT0gTlVMTCkKICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGZvciAobiA9IDA7IG4gPCBuU3RyZWFtczsgbisrKSB7CiAgICAgIGlmIChwcE9wdGlvbnNbbl0gIT0gTlVMTCkKCW1lbWNweShwU2F2ZWRPcHRpb25zICsgbiwgcHBPcHRpb25zW25dLCBzaXplb2YoQVZJQ09NUFJFU1NPUFRJT05TKSk7CiAgICB9CiAgfQoKICBTYXZlT3B0cy51RmxhZ3MgICAgPSB1RmxhZ3M7CiAgU2F2ZU9wdHMublN0cmVhbXMgID0gblN0cmVhbXM7CiAgU2F2ZU9wdHMucHBhdmlzICAgID0gcHBhdmk7CiAgU2F2ZU9wdHMucHBPcHRpb25zID0gcHBPcHRpb25zOwoKICByZXQgPSBEaWFsb2dCb3hXKEFWSUZJTEVfaE1vZHVsZSwgTUFLRUlOVFJFU09VUkNFVyhJRERfU0FWRU9QVElPTlMpLAoJCSAgIGhXbmQsIEFWSVNhdmVPcHRpb25zRGxnUHJvYyk7CgogIGlmIChyZXQgPT0gLTEpCiAgICByZXQgPSBGQUxTRTsKCiAgLyogcmVzdG9yZSBvcHRpb25zIHdoZW4gdXNlciBwcmVzc2VkIGNhbmNlbCAqLwogIGlmIChwU2F2ZWRPcHRpb25zICE9IE5VTEwpIHsKICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKICAgICAgZm9yIChuID0gMDsgbiA8IG5TdHJlYW1zOyBuKyspIHsKCWlmIChwcE9wdGlvbnNbbl0gIT0gTlVMTCkKCSAgbWVtY3B5KHBwT3B0aW9uc1tuXSwgcFNhdmVkT3B0aW9ucyArIG4sIHNpemVvZihBVklDT01QUkVTU09QVElPTlMpKTsKICAgICAgfQogICAgfQogICAgR2xvYmFsRnJlZVB0cihwU2F2ZWRPcHRpb25zKTsKICB9CgogIHJldHVybiAoQk9PTClyZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUwzMi5AKQogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUxFLjEyNCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVPcHRpb25zRnJlZShJTlQgblN0cmVhbXMsTFBBVklDT01QUkVTU09QVElPTlMqcHBPcHRpb25zKQp7CiAgVFJBQ0UoIiglZCwlcClcbiIsIG5TdHJlYW1zLCBwcE9wdGlvbnMpOwoKICBpZiAoblN0cmVhbXMgPCAwIHx8IHBwT3B0aW9ucyA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgZm9yICg7IG5TdHJlYW1zID4gMDsgblN0cmVhbXMtLSkgewogICAgaWYgKHBwT3B0aW9uc1tuU3RyZWFtc10gIT0gTlVMTCkgewogICAgICBwcE9wdGlvbnNbblN0cmVhbXNdLT5kd0ZsYWdzICY9IH5BVklDT01QUkVTU0ZfVkFMSUQ7CgogICAgICBpZiAocHBPcHRpb25zW25TdHJlYW1zXS0+bHBQYXJtcyAhPSBOVUxMKSB7CglHbG9iYWxGcmVlUHRyKHBwT3B0aW9uc1tuU3RyZWFtc10tPmxwUGFybXMpOwoJcHBPcHRpb25zW25TdHJlYW1zXS0+bHBQYXJtcyA9IE5VTEw7CglwcE9wdGlvbnNbblN0cmVhbXNdLT5jYlBhcm1zID0gMDsKICAgICAgfQogICAgICBpZiAocHBPcHRpb25zW25TdHJlYW1zXS0+bHBGb3JtYXQgIT0gTlVMTCkgewoJR2xvYmFsRnJlZVB0cihwcE9wdGlvbnNbblN0cmVhbXNdLT5scEZvcm1hdCk7CglwcE9wdGlvbnNbblN0cmVhbXNdLT5scEZvcm1hdCA9IE5VTEw7CglwcE9wdGlvbnNbblN0cmVhbXNdLT5jYkZvcm1hdCA9IDA7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBBVklFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZVZBCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVWQShMUENTVFIgc3pGaWxlLCBDTFNJRCAqcGNsc2lkSGFuZGxlciwKCQkJIEFWSVNBVkVDQUxMQkFDSyBscGZuQ2FsbGJhY2ssIGludCBuU3RyZWFtLAoJCQkgUEFWSVNUUkVBTSAqcHBhdmksIExQQVZJQ09NUFJFU1NPUFRJT05TICpwbHBPcHRpb25zKQp7CiAgTFBXU1RSICB3c3pGaWxlID0gTlVMTDsKICBIUkVTVUxUIGhyOwogIGludCAgICAgbGVuOwoKICBUUkFDRSgiJXMsJXAsJXAsJWQsJXAsJXApXG4iLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHBjbHNpZEhhbmRsZXIsCglscGZuQ2FsbGJhY2ssIG5TdHJlYW0sIHBwYXZpLCBwbHBPcHRpb25zKTsKCiAgaWYgKHN6RmlsZSA9PSBOVUxMIHx8IHBwYXZpID09IE5VTEwgfHwgcGxwT3B0aW9ucyA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgLyogY29udmVydCBBU0NJSSBzdHJpbmcgdG8gVW5pY29kZSBhbmQgY2FsbCBVbmljb2RlIGZ1bmN0aW9uICovCiAgbGVuID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHN6RmlsZSwgLTEsIE5VTEwsIDApOwogIGlmIChsZW4gPD0gMCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIHdzekZpbGUgPSBMb2NhbEFsbG9jKExQVFIsIGxlbiAqIHNpemVvZihXQ0hBUikpOwogIGlmICh3c3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHN6RmlsZSwgLTEsIHdzekZpbGUsIGxlbik7CgogIGhyID0gQVZJU2F2ZVZXKHdzekZpbGUsIHBjbHNpZEhhbmRsZXIsIGxwZm5DYWxsYmFjaywKCQkgblN0cmVhbSwgcHBhdmksIHBscE9wdGlvbnMpOwoKICBMb2NhbEZyZWUoKEhMT0NBTCl3c3pGaWxlKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZJTEVfQVZJU2F2ZURlZmF1bHRDYWxsYmFjawkoaW50ZXJuYWwpCiAqLwpzdGF0aWMgQk9PTCBXSU5BUEkgQVZJRklMRV9BVklTYXZlRGVmYXVsdENhbGxiYWNrKElOVCBwcm9ncmVzcykKewogIFRSQUNFKCIoJWQpXG4iLCBwcm9ncmVzcyk7CgogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTYXZlVlcJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU2F2ZVZXKExQQ1dTVFIgc3pGaWxlLCBDTFNJRCAqcGNsc2lkSGFuZGxlciwKCQkJIEFWSVNBVkVDQUxMQkFDSyBscGZuQ2FsbGJhY2ssIGludCBuU3RyZWFtcywKCQkJIFBBVklTVFJFQU0gKnBwYXZpLCBMUEFWSUNPTVBSRVNTT1BUSU9OUyAqcGxwT3B0aW9ucykKewogIExPTkcgICAgICAgICAgIGxTdGFydFtNQVhfQVZJU1RSRUFNU107CiAgUEFWSVNUUkVBTSAgICAgcE91dFN0cmVhbXNbTUFYX0FWSVNUUkVBTVNdOwogIFBBVklTVFJFQU0gICAgIHBJblN0cmVhbXNbTUFYX0FWSVNUUkVBTVNdOwogIEFWSUZJTEVJTkZPVyAgIGZJbmZvOwogIEFWSVNUUkVBTUlORk9XIHNJbmZvOwoKICBQQVZJRklMRSAgICAgICBwZmlsZSA9IE5VTEw7IC8qIHRoZSBvdXRwdXQgQVZJIGZpbGUgKi8KICBMT05HICAgICAgICAgICBsRmlyc3RWaWRlbyA9IC0xOwogIGludCAgICAgICAgICAgIGN1clN0cmVhbTsKCiAgLyogZm9yIGludGVybGVhdmluZyAuLi4gKi8KICBEV09SRCAgICAgICAgICBkd0ludGVybGVhdmUgPSAwOyAvKiBpbnRlcmxlYXZlIHJhdGUgKi8KICBEV09SRCAgICAgICAgICBkd0ZpbGVJbml0aWFsRnJhbWVzOwogIExPTkcgICAgICAgICAgIGxGaWxlTGVuZ3RoOwogIExPTkcgICAgICAgICAgIGxTYW1wbGVJbmM7CgogIC8qIGZvciByZWFkaW5nL3dyaXRpbmcgdGhlIGRhdGEgLi4uICovCiAgTFBWT0lEICAgICAgICAgbHBCdWZmZXIgPSBOVUxMOwogIExPTkcgICAgICAgICAgIGNiQnVmZmVyOyAgICAgICAgLyogcmVhbCBzaXplIG9mIGxwQnVmZmVyICovCiAgTE9ORyAgICAgICAgICAgbEJ1ZmZlclNpemU7ICAgICAvKiBuZWVkZWQgYnl0ZXMgZm9yIGZvcm1hdChzKSwgZXRjLiAqLwogIExPTkcgICAgICAgICAgIGxSZWFkQnl0ZXM7CiAgTE9ORyAgICAgICAgICAgbFJlYWRTYW1wbGVzOwogIEhSRVNVTFQgICAgICAgIGhyZXM7CgogIFRSQUNFKCIoJXMsJXAsJXAsJWQsJXAsJXApXG4iLCBkZWJ1Z3N0cl93KHN6RmlsZSksIHBjbHNpZEhhbmRsZXIsCglscGZuQ2FsbGJhY2ssIG5TdHJlYW1zLCBwcGF2aSwgcGxwT3B0aW9ucyk7CgogIGlmIChzekZpbGUgPT0gTlVMTCB8fCBwcGF2aSA9PSBOVUxMIHx8IHBscE9wdGlvbnMgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CiAgaWYgKG5TdHJlYW1zID49IE1BWF9BVklTVFJFQU1TKSB7CiAgICBXQVJOKCJDYW4ndCB3cml0ZSBBVkkgd2l0aCAlZCBzdHJlYW1zIG9ubHkgc3VwcG9ydHMgJWQgLS0gY2hhbmdlIE1BWF9BVklTVFJFQU1TIVxuIiwgblN0cmVhbXMsIE1BWF9BVklTVFJFQU1TKTsKICAgIHJldHVybiBBVklFUlJfSU5URVJOQUw7CiAgfQoKICBpZiAobHBmbkNhbGxiYWNrID09IE5VTEwpCiAgICBscGZuQ2FsbGJhY2sgPSBBVklGSUxFX0FWSVNhdmVEZWZhdWx0Q2FsbGJhY2s7CgogIC8qIGNsZWFyIGxvY2FsIHZhcmlhYmxlKHMpICovCiAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgIHBJblN0cmVhbXNbY3VyU3RyZWFtXSAgPSBOVUxMOwogICAgcE91dFN0cmVhbXNbY3VyU3RyZWFtXSA9IE5VTEw7CiAgfQoKICAvKiBvcGVuIG91dHB1dCBBVkkgZmlsZSAoY3JlYXRlIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QpICovCiAgaHJlcyA9IEFWSUZpbGVPcGVuVygmcGZpbGUsIHN6RmlsZSwgT0ZfQ1JFQVRFfE9GX1NIQVJFX0VYQ0xVU0lWRXxPRl9XUklURSwKCQkgICAgICBwY2xzaWRIYW5kbGVyKTsKICBpZiAoRkFJTEVEKGhyZXMpKQogICAgcmV0dXJuIGhyZXM7CiAgQVZJRmlsZUluZm9XKHBmaWxlLCAmZkluZm8sIHNpemVvZihmSW5mbykpOyAvKiBmb3IgZHdDYXBzICovCgogIC8qIGluaXRpYWxpemUgb3VyIGRhdGEgc3RydWN0dXJlcyBwYXJ0IDEgKi8KICBmb3IgKGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IG5TdHJlYW1zOyBjdXJTdHJlYW0rKykgewogICAgUEFWSVNUUkVBTSBwQ3VyU3RyZWFtID0gcHBhdmlbY3VyU3RyZWFtXTsKCiAgICBocmVzID0gQVZJU3RyZWFtSW5mb1cocEN1clN0cmVhbSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKICAgIGlmIChGQUlMRUQoaHJlcykpCiAgICAgIGdvdG8gZXJyb3I7CgogICAgLyogc2VhcmNoIGZpcnN0IHZpZGVvIHN0cmVhbSBhbmQgY2hlY2sgZm9yIGludGVybGVhdmluZyAqLwogICAgaWYgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSB7CiAgICAgIC8qIHJlbWVtYmVyIGZpcnN0IHZpZGVvIHN0cmVhbSAtLSBuZWVkZWQgZm9yIGludGVybGVhdmluZyAqLwogICAgICBpZiAobEZpcnN0VmlkZW8gPCAwKQoJbEZpcnN0VmlkZW8gPSBjdXJTdHJlYW07CiAgICB9IGVsc2UgaWYgKCFkd0ludGVybGVhdmUgJiYgcGxwT3B0aW9ucyAhPSBOVUxMKSB7CiAgICAgIC8qIGNoZWNrIGlmIGFueSBub24tdmlkZW8gc3RyZWFtIHdhbnRzIHRvIGJlIGludGVybGVhdmVkICovCiAgICAgIFdBUk4oIm9wdGlvbnMuZmxhZ3M9MHglbFggb3B0aW9ucy5kd0ludGVybGVhdmU9JWx1XG4iLHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdGbGFncyxwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3SW50ZXJsZWF2ZUV2ZXJ5KTsKICAgICAgaWYgKHBscE9wdGlvbnNbY3VyU3RyZWFtXSAhPSBOVUxMICYmCgkgIHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9JTlRFUkxFQVZFKQoJZHdJbnRlcmxlYXZlID0gcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0ludGVybGVhdmVFdmVyeTsKICAgIH0KCiAgICAvKiBjcmVhdGUgZGUtL2NvbXByZXNzZWQgc3RyZWFtIGludGVyZmFjZSBpZiBuZWVkZWQgKi8KICAgIHBJblN0cmVhbXNbY3VyU3RyZWFtXSA9IE5VTEw7CiAgICBpZiAocGxwT3B0aW9ucyAhPSBOVUxMICYmIHBscE9wdGlvbnNbY3VyU3RyZWFtXSAhPSBOVUxMKSB7CiAgICAgIGlmIChwbHBPcHRpb25zW2N1clN0cmVhbV0tPmZjY0hhbmRsZXIgfHwKCSAgcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5scEZvcm1hdCAhPSBOVUxMKSB7CglEV09SRCBkd0tleVNhdmUgPSBwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3S2V5RnJhbWVFdmVyeTsKCglpZiAoZkluZm8uZHdDYXBzICYgQVZJRklMRUNBUFNfQUxMS0VZRlJBTUVTKQoJICBwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3S2V5RnJhbWVFdmVyeSA9IDE7CgoJaHJlcyA9IEFWSU1ha2VDb21wcmVzc2VkU3RyZWFtKCZwSW5TdHJlYW1zW2N1clN0cmVhbV0sIHBDdXJTdHJlYW0sCgkJCQkgICAgICAgcGxwT3B0aW9uc1tjdXJTdHJlYW1dLCBOVUxMKTsKCXBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdLZXlGcmFtZUV2ZXJ5ID0gZHdLZXlTYXZlOwoJaWYgKEZBSUxFRChocmVzKSB8fCBwSW5TdHJlYW1zW2N1clN0cmVhbV0gPT0gTlVMTCkgewoJICBwSW5TdHJlYW1zW2N1clN0cmVhbV0gPSBOVUxMOwoJICBnb3RvIGVycm9yOwoJfQoKCS8qIHRlc3Qgc3RyZWFtIGludGVyZmFjZSBhbmQgdXBkYXRlIHN0cmVhbS1pbmZvICovCglocmVzID0gQVZJU3RyZWFtSW5mb1cocEluU3RyZWFtc1tjdXJTdHJlYW1dLCAmc0luZm8sIHNpemVvZihzSW5mbykpOwoJaWYgKEZBSUxFRChocmVzKSkKCSAgZ290byBlcnJvcjsKICAgICAgfQogICAgfQoKICAgIC8qIG5vdyBoYW5kbGUgc3RyZWFtcyB3aGljaCB3aWxsIG9ubHkgYmUgY29waWVkICovCiAgICBpZiAocEluU3RyZWFtc1tjdXJTdHJlYW1dID09IE5VTEwpIHsKICAgICAgcEN1clN0cmVhbSA9IHBJblN0cmVhbXNbY3VyU3RyZWFtXSA9IHBwYXZpW2N1clN0cmVhbV07CiAgICAgIEFWSVN0cmVhbUFkZFJlZihwQ3VyU3RyZWFtKTsKICAgIH0gZWxzZQogICAgICBwQ3VyU3RyZWFtID0gcEluU3RyZWFtc1tjdXJTdHJlYW1dOwoKICAgIGxTdGFydFtjdXJTdHJlYW1dID0gc0luZm8uZHdTdGFydDsKICB9IC8qIGZvciBhbGwgc3RyZWFtcyAqLwoKICAvKiBjaGVjayB0aGF0IGZpcnN0IHZpZGVvIHN0cmVhbSBpcyB0aGUgZmlyc3Qgc3RyZWFtICovCiAgaWYgKGxGaXJzdFZpZGVvID4gMCkgewogICAgUEFWSVNUUkVBTSBwVG1wID0gcEluU3RyZWFtc1tsRmlyc3RWaWRlb107CiAgICBMT05HIGxUbXAgPSBsU3RhcnRbbEZpcnN0VmlkZW9dOwoKICAgIHBJblN0cmVhbXNbbEZpcnN0VmlkZW9dID0gcEluU3RyZWFtc1swXTsKICAgIHBJblN0cmVhbXNbMF0gPSBwVG1wOwogICAgbFN0YXJ0W2xGaXJzdFZpZGVvXSA9IGxTdGFydFswXTsKICAgIGxTdGFydFswXSA9IGxUbXA7CiAgICBsRmlyc3RWaWRlbyA9IDA7CiAgfQoKICAvKiBhbGxvY2F0ZSBidWZmZXIgZm9yIGZvcm1hdHMsIGRhdGEsIGV0Yy4gb2YgYW4gaW5pdGlhbCBzaXplIG9mIDY0IGtCeXRlcyovCiAgbHBCdWZmZXIgPSBHbG9iYWxBbGxvY1B0cihHUFRSLCBjYkJ1ZmZlciA9IDB4MDAwMTAwMDApOwogIGlmIChscEJ1ZmZlciA9PSBOVUxMKSB7CiAgICBocmVzID0gQVZJRVJSX01FTU9SWTsKICAgIGdvdG8gZXJyb3I7CiAgfQoKICBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zWzBdLCAmc0luZm8sIHNpemVvZihzSW5mbykpOwogIGxGaWxlTGVuZ3RoID0gc0luZm8uZHdMZW5ndGg7CiAgZHdGaWxlSW5pdGlhbEZyYW1lcyA9IDA7CiAgaWYgKGxGaXJzdFZpZGVvID49IDApIHsKICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGZvcm1hdAogICAgICogIC0tIG5lZWQgYXQgbGVhc3QgQklUTUFQSU5GT0hFQURFUiBvciBuZXdlcgogICAgICovCiAgICBsU2FtcGxlSW5jID0gMTsKICAgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CiAgICBocmVzID0gQVZJU3RyZWFtUmVhZEZvcm1hdChwSW5TdHJlYW1zW2xGaXJzdFZpZGVvXSwgQVZJU3RyZWFtU3RhcnQocEluU3RyZWFtc1tsRmlyc3RWaWRlb10pLCBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKICAgIGlmIChsQnVmZmVyU2l6ZSA8IChMT05HKXNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKICAgICAgaHJlcyA9IEFWSUVSUl9JTlRFUk5BTDsKICAgIGlmIChGQUlMRUQoaHJlcykpCiAgICAgIGdvdG8gZXJyb3I7CiAgfSBlbHNlIC8qIHVzZSBvbmUgc2Vjb25kIGJsb2NrcyBmb3IgaW50ZXJsZWF2aW5nIGlmIG5vIHZpZGVvIHByZXNlbnQgKi8KICAgIGxTYW1wbGVJbmMgPSBBVklTdHJlYW1UaW1lVG9TYW1wbGUocEluU3RyZWFtc1swXSwgMTAwMDAwMCk7CgogIC8qIGNyZWF0ZSBvdXRwdXQgc3RyZWFtcyAqLwogIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CgogICAgc0luZm8uZHdJbml0aWFsRnJhbWVzID0gMDsKICAgIGlmIChkd0ludGVybGVhdmUgIT0gMCAmJiBjdXJTdHJlYW0gPiAwICYmIHNJbmZvLmZjY1R5cGUgIT0gc3RyZWFtdHlwZVZJREVPKSB7CiAgICAgIC8qIDc1MCBtcyBpbml0aWFsIGZyYW1lcyBmb3Igbm9uLXZpZGVvIHN0cmVhbXMgKi8KICAgICAgc0luZm8uZHdJbml0aWFsRnJhbWVzID0gQVZJU3RyZWFtVGltZVRvU2FtcGxlKHBJblN0cmVhbXNbMF0sIDc1MCk7CiAgICB9CgogICAgaHJlcyA9IEFWSUZpbGVDcmVhdGVTdHJlYW1XKHBmaWxlLCAmcE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvKTsKICAgIGlmIChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dICE9IE5VTEwgJiYgU1VDQ0VFREVEKGhyZXMpKSB7CiAgICAgIC8qIGNvcHkgaW5pdGlhbCBmb3JtYXQgZm9yIHRoaXMgc3RyZWFtICovCiAgICAgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CiAgICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJCSBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKICAgICAgaWYgKEZBSUxFRChocmVzKSkKCWdvdG8gZXJyb3I7CiAgICAgIGhyZXMgPSBBVklTdHJlYW1TZXRGb3JtYXQocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgMCwgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKICAgICAgaWYgKEZBSUxFRChocmVzKSkKCWdvdG8gZXJyb3I7CgogICAgICAvKiB0cnkgdG8gY29weSBzdHJlYW0gaGFuZGxlciBkYXRhICovCiAgICAgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CiAgICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkRGF0YShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIGNraWRTVFJFQU1IQU5ETEVSREFUQSwKCQkJICAgICAgIGxwQnVmZmVyLCAmbEJ1ZmZlclNpemUpOwogICAgICBpZiAoU1VDQ0VFREVEKGhyZXMpICYmIGxCdWZmZXJTaXplID4gMCkgewoJaHJlcyA9IEFWSVN0cmVhbVdyaXRlRGF0YShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLGNraWRTVFJFQU1IQU5ETEVSREFUQSwKCQkJCSAgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKCWlmIChGQUlMRUQoaHJlcykpCgkgIGdvdG8gZXJyb3I7CiAgICAgIH0KCiAgICAgIGlmIChkd0ZpbGVJbml0aWFsRnJhbWVzIDwgc0luZm8uZHdJbml0aWFsRnJhbWVzKQoJZHdGaWxlSW5pdGlhbEZyYW1lcyA9IHNJbmZvLmR3SW5pdGlhbEZyYW1lczsKICAgICAgbFJlYWRCeXRlcyA9CglBVklTdHJlYW1TYW1wbGVUb1NhbXBsZShwT3V0U3RyZWFtc1swXSwgcEluU3RyZWFtc1tjdXJTdHJlYW1dLAoJCQkJc0luZm8uZHdMZW5ndGgpOwogICAgICBpZiAobEZpbGVMZW5ndGggPCBsUmVhZEJ5dGVzKQoJbEZpbGVMZW5ndGggPSBsUmVhZEJ5dGVzOwogICAgfSBlbHNlIHsKICAgICAgLyogY3JlYXRpb24gb2YgZGUtL2NvbXByZXNzaW9uIHN0cmVhbSBpbnRlcmZhY2UgZmFpbGVkICovCiAgICAgIFdBUk4oImNyZWF0aW9uIG9mIChkZS0pY29tcHJlc3Npb24gc3RyZWFtIGZhaWxlZCBmb3Igc3RyZWFtICVkXG4iLGN1clN0cmVhbSk7CiAgICAgIEFWSVN0cmVhbVJlbGVhc2UocEluU3RyZWFtc1tjdXJTdHJlYW1dKTsKICAgICAgaWYgKGN1clN0cmVhbSArIDEgPj0gblN0cmVhbXMpIHsKCS8qIG1vdmUgdGhlIG90aGVycyBvbmUgdXAgKi8KCVBBVklTVFJFQU0gKnBwYXMgPSAmcEluU3RyZWFtc1tjdXJTdHJlYW1dOwoJaW50ICAgICAgICAgICAgbiA9IG5TdHJlYW1zIC0gKGN1clN0cmVhbSArIDEpOwoKCWRvIHsKCSAgKnBwYXMgPSBwSW5TdHJlYW1zW2N1clN0cmVhbSArIDFdOwoJfSB3aGlsZSAoLS1uKTsKICAgICAgfQogICAgICBuU3RyZWFtcy0tOwogICAgICBjdXJTdHJlYW0tLTsKICAgIH0KICB9IC8qIGNyZWF0ZSBvdXRwdXQgc3RyZWFtcyBmb3IgYWxsIGlucHV0IHN0cmVhbXMgKi8KCiAgLyogaGF2ZSB3ZSBzdGlsbCBzb21ldGhpbmcgdG8gd3JpdGUsIG9yIGxvc3QgZXZlcnl0aGluZz8gKi8KICBpZiAoblN0cmVhbXMgPD0gMCkKICAgIGdvdG8gZXJyb3I7CgogIGlmIChkd0ludGVybGVhdmUpIHsKICAgIExPTkcgbEN1ckZyYW1lID0gLWR3RmlsZUluaXRpYWxGcmFtZXM7CgogICAgLyogaW50ZXJsZWF2ZWQgZmlsZSAqLwogICAgaWYgKGR3SW50ZXJsZWF2ZSA9PSAxKQogICAgICBBVklGaWxlRW5kUmVjb3JkKHBmaWxlKTsKCiAgICBmb3IgKDsgbEN1ckZyYW1lIDwgbEZpbGVMZW5ndGg7IGxDdXJGcmFtZSArPSBsU2FtcGxlSW5jKSB7CiAgICAgIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CglMT05HIGxMYXN0U2FtcGxlOwoKCWhyZXMgPSBBVklTdHJlYW1JbmZvVyhwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAmc0luZm8sIHNpemVvZihzSW5mbykpOwoJaWYgKEZBSUxFRChocmVzKSkKCSAgZ290byBlcnJvcjsKCgkvKiBpbml0aWFsIGZyYW1lcyBwaGFzZSBhdCB0aGUgZW5kIGZvciB0aGlzIHN0cmVhbT8gKi8KCWlmICgtKExPTkcpc0luZm8uZHdJbml0aWFsRnJhbWVzID4gbEN1ckZyYW1lKQoJICBjb250aW51ZTsKCglpZiAoKGxGaWxlTGVuZ3RoIC0gbFNhbXBsZUluYykgPD0gbEN1ckZyYW1lKSB7CgkgIGxMYXN0U2FtcGxlID0gQVZJU3RyZWFtTGVuZ3RoKHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7CgkgIGxGaXJzdFZpZGVvID0gbExhc3RTYW1wbGUgKyBBVklTdHJlYW1TdGFydChwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwoJfSBlbHNlIHsKCSAgaWYgKGN1clN0cmVhbSAhPSAwKSB7CgkgICAgbEZpcnN0VmlkZW8gPQoJICAgICAgQVZJU3RyZWFtU2FtcGxlVG9TYW1wbGUocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBwSW5TdHJlYW1zWzBdLAoJCQkJICAgICAgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPID8gCgkJCQkgICAgICAgKExPTkcpZHdJbnRlcmxlYXZlIDogbFNhbXBsZUluYykgKwoJCQkJICAgICAgc0luZm8uZHdJbml0aWFsRnJhbWVzICsgbEN1ckZyYW1lKTsKCSAgfSBlbHNlCgkgICAgbEZpcnN0VmlkZW8gPSBsU2FtcGxlSW5jICsgKHNJbmZvLmR3SW5pdGlhbEZyYW1lcyArIGxDdXJGcmFtZSk7CgoJICBsTGFzdFNhbXBsZSA9IEFWSVN0cmVhbUVuZChwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwoJICBpZiAobExhc3RTYW1wbGUgPD0gbEZpcnN0VmlkZW8pCgkgICAgbEZpcnN0VmlkZW8gPSBsTGFzdFNhbXBsZTsKCX0KCgkvKiBjb3B5IG5lZWRlZCBzYW1wbGVzIG5vdyAqLwoJV0FSTigiY29weSBmcm9tIHN0cmVhbSAlZCBzYW1wbGVzICVsZCB0byAlbGQuLi5cbiIsY3VyU3RyZWFtLAoJICAgICAgbFN0YXJ0W2N1clN0cmVhbV0sbEZpcnN0VmlkZW8pOwoJd2hpbGUgKGxGaXJzdFZpZGVvID4gbFN0YXJ0W2N1clN0cmVhbV0pIHsKCSAgRFdPUkQgZmxhZ3MgPSAwOwoKCSAgLyogY29weSBmb3JtYXQgaW4gY2FzZSBpdCBjYW4gY2hhbmdlICovCgkgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CgkgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgbFN0YXJ0W2N1clN0cmVhbV0sCgkJCQkgICAgIGxwQnVmZmVyLCAmbEJ1ZmZlclNpemUpOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgkgIEFWSVN0cmVhbVNldEZvcm1hdChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCBsU3RhcnRbY3VyU3RyZWFtXSwKCQkJICAgICBscEJ1ZmZlciwgbEJ1ZmZlclNpemUpOwoKCSAgLyogdHJ5IHRvIHJlYWQgZGF0YSB1bnRpbCB3ZSBnb3QgaXQsIG9yIGVycm9yICovCgkgIGRvIHsKCSAgICBocmVzID0gQVZJU3RyZWFtUmVhZChwSW5TdHJlYW1zW2N1clN0cmVhbV0sIGxTdGFydFtjdXJTdHJlYW1dLAoJCQkJIGxGaXJzdFZpZGVvIC0gbFN0YXJ0W2N1clN0cmVhbV0sIGxwQnVmZmVyLAoJCQkJIGNiQnVmZmVyLCAmbFJlYWRCeXRlcywgJmxSZWFkU2FtcGxlcyk7CgkgIH0gd2hpbGUgKChocmVzID09IEFWSUVSUl9CVUZGRVJUT09TTUFMTCkgJiYKCQkgICAobHBCdWZmZXIgPSBHbG9iYWxSZUFsbG9jUHRyKGxwQnVmZmVyLCBjYkJ1ZmZlciAqPSAyLCBHUFRSKSkgIT0gTlVMTCk7CgkgIGlmIChscEJ1ZmZlciA9PSBOVUxMKQoJICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgoJICBpZiAoQVZJU3RyZWFtSXNLZXlGcmFtZShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIChMT05HKXNJbmZvLmR3U3RhcnQpKQoJICAgIGZsYWdzID0gQVZJSUZfS0VZRlJBTUU7CgkgIGhyZXMgPSBBVklTdHJlYW1Xcml0ZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAtMSwgbFJlYWRTYW1wbGVzLAoJCQkJbHBCdWZmZXIsIGxSZWFkQnl0ZXMsIGZsYWdzLCBOVUxMLCBOVUxMKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoKCSAgbFN0YXJ0W2N1clN0cmVhbV0gKz0gbFJlYWRTYW1wbGVzOwoJfQoJbFN0YXJ0W2N1clN0cmVhbV0gPSBsRmlyc3RWaWRlbzsKICAgICAgfSAvKiBzdHJlYW0gYnkgc3RyZWFtICovCgogICAgICAvKiBuZWVkIHRvIGNsb3NlIHRoaXMgYmxvY2s/ICovCiAgICAgIGlmIChkd0ludGVybGVhdmUgPT0gMSkgewoJaHJlcyA9IEFWSUZpbGVFbmRSZWNvcmQocGZpbGUpOwoJaWYgKEZBSUxFRChocmVzKSkKCSAgYnJlYWs7CiAgICAgIH0KCiAgICAgIC8qIHNob3cgcHJvZ3Jlc3MgKi8KICAgICAgaWYgKGxwZm5DYWxsYmFjayhNdWxEaXYoZHdGaWxlSW5pdGlhbEZyYW1lcyArIGxDdXJGcmFtZSwgMTAwLAoJCQkgICAgICBkd0ZpbGVJbml0aWFsRnJhbWVzICsgbEZpbGVMZW5ndGgpKSkgewoJaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7CglicmVhazsKICAgICAgfQogICAgfSAvKiBjb3B5IGZyYW1lIGJ5IGZyYW1lICovCiAgfSBlbHNlIHsKICAgIC8qIG5vbi1pbnRlcmxlYXZlZCBmaWxlICovCgogICAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgICAgLyogc2hvdyBwcm9ncmVzcyAqLwogICAgICBpZiAobHBmbkNhbGxiYWNrKE11bERpdihjdXJTdHJlYW0sIDEwMCwgblN0cmVhbXMpKSkgewoJaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7Cglnb3RvIGVycm9yOwogICAgICB9CgogICAgICBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CgogICAgICBpZiAoc0luZm8uZHdTYW1wbGVTaXplICE9IDApIHsKCS8qIHNhbXBsZS1iYXNlZCBkYXRhIGxpa2UgYXVkaW8gKi8KCXdoaWxlIChzSW5mby5kd1N0YXJ0IDwgc0luZm8uZHdMZW5ndGgpIHsKCSAgTE9ORyBsU2FtcGxlcyA9IGNiQnVmZmVyIC8gc0luZm8uZHdTYW1wbGVTaXplOwoKCSAgLyogY29weSBmb3JtYXQgaW4gY2FzZSBpdCBjYW4gY2hhbmdlICovCgkgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CgkgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJCSAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgcmV0dXJuIGhyZXM7CgkgIEFWSVN0cmVhbVNldEZvcm1hdChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkgICAgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CgoJICAvKiBsaW1pdCB0byBzdHJlYW0gYm91bmRhcmllcyAqLwoJICBpZiAobFNhbXBsZXMgIT0gKExPTkcpKHNJbmZvLmR3TGVuZ3RoIC0gc0luZm8uZHdTdGFydCkpCgkgICAgbFNhbXBsZXMgPSBzSW5mby5kd0xlbmd0aCAtIHNJbmZvLmR3U3RhcnQ7CgoJICAvKiBub3cgdHJ5IHRvIHJlYWQgdW50aWwgd2UgZ2V0IGl0LCBvciBhbiBlcnJvciBvY2N1cnMgKi8KCSAgZG8gewoJICAgIGxSZWFkQnl0ZXMgICA9IGNiQnVmZmVyOwoJICAgIGxSZWFkU2FtcGxlcyA9IDA7CgkgICAgaHJlcyA9IEFWSVN0cmVhbVJlYWQocEluU3RyZWFtc1tjdXJTdHJlYW1dLHNJbmZvLmR3U3RhcnQsbFNhbXBsZXMsCgkJCQkgbHBCdWZmZXIsY2JCdWZmZXIsJmxSZWFkQnl0ZXMsJmxSZWFkU2FtcGxlcyk7CgkgIH0gd2hpbGUgKChocmVzID09IEFWSUVSUl9CVUZGRVJUT09TTUFMTCkgJiYKCQkgICAobHBCdWZmZXIgPSBHbG9iYWxSZUFsbG9jUHRyKGxwQnVmZmVyLCBjYkJ1ZmZlciAqPSAyLCBHUFRSKSkgIT0gTlVMTCk7CgkgIGlmIChscEJ1ZmZlciA9PSBOVUxMKQoJICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgkgIGlmIChsUmVhZFNhbXBsZXMgIT0gMCkgewoJICAgIHNJbmZvLmR3U3RhcnQgKz0gbFJlYWRTYW1wbGVzOwoJICAgIGhyZXMgPSBBVklTdHJlYW1Xcml0ZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAtMSwgbFJlYWRTYW1wbGVzLAoJCQkJICBscEJ1ZmZlciwgbFJlYWRCeXRlcywgMCwgTlVMTCAsIE5VTEwpOwoJICAgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgICBnb3RvIGVycm9yOwoKCSAgICAvKiBzaG93IHByb2dyZXNzICovCgkgICAgaWYgKGxwZm5DYWxsYmFjayhNdWxEaXYoc0luZm8uZHdTdGFydCwxMDAsblN0cmVhbXMqc0luZm8uZHdMZW5ndGgpKwoJCQkgICAgIE11bERpdihjdXJTdHJlYW0sIDEwMCwgblN0cmVhbXMpKSkgewoJICAgICAgaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7CgkgICAgICBnb3RvIGVycm9yOwoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBpZiAoKHNJbmZvLmR3TGVuZ3RoIC0gc0luZm8uZHdTdGFydCkgIT0gMSkgewoJICAgICAgaHJlcyA9IEFWSUVSUl9GSUxFUkVBRDsKCSAgICAgIGdvdG8gZXJyb3I7CgkgICAgfQoJICB9Cgl9CiAgICAgIH0gZWxzZSB7CgkvKiBibG9jay1iYXNlZCBkYXRhIGxpa2UgdmlkZW8gKi8KCWZvciAoOyBzSW5mby5kd1N0YXJ0IDwgc0luZm8uZHdMZW5ndGg7IHNJbmZvLmR3U3RhcnQrKykgewoJICBEV09SRCBmbGFncyA9IDA7CgoJICAvKiBjb3B5IGZvcm1hdCBpbiBjYXNlIGl0IGNhbiBjaGFuZ2UgKi8KCSAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKCSAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkJICAgICBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoJICBBVklTdHJlYW1TZXRGb3JtYXQocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJICAgICBscEJ1ZmZlciwgbEJ1ZmZlclNpemUpOwoKCSAgLyogdHJ5IHRvIHJlYWQgYmxvY2sgYW5kIHJlc2l6ZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCgkgIGRvIHsKCSAgICBsUmVhZFNhbXBsZXMgPSAwOwoJICAgIGxSZWFkQnl0ZXMgICA9IGNiQnVmZmVyOwoJICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwgMSwKCQkJCSBscEJ1ZmZlciwgY2JCdWZmZXIsJmxSZWFkQnl0ZXMsJmxSZWFkU2FtcGxlcyk7CgkgIH0gd2hpbGUgKChocmVzID09IEFWSUVSUl9CVUZGRVJUT09TTUFMTCkgJiYKCQkgICAobHBCdWZmZXIgPSBHbG9iYWxSZUFsbG9jUHRyKGxwQnVmZmVyLCBjYkJ1ZmZlciAqPSAyLCBHUFRSKSkgIT0gTlVMTCk7CgkgIGlmIChscEJ1ZmZlciA9PSBOVUxMKQoJICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgkgIGlmIChsUmVhZFNhbXBsZXMgIT0gMSkgewoJICAgIGhyZXMgPSBBVklFUlJfRklMRVJFQUQ7CgkgICAgZ290byBlcnJvcjsKCSAgfQoKCSAgaWYgKEFWSVN0cmVhbUlzS2V5RnJhbWUocEluU3RyZWFtc1tjdXJTdHJlYW1dLCAoTE9ORylzSW5mby5kd1N0YXJ0KSkKCSAgICBmbGFncyA9IEFWSUlGX0tFWUZSQU1FOwoJICBocmVzID0gQVZJU3RyZWFtV3JpdGUocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgLTEsIGxSZWFkU2FtcGxlcywKCQkJCWxwQnVmZmVyLCBsUmVhZEJ5dGVzLCBmbGFncywgTlVMTCwgTlVMTCk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCgkgIC8qIHNob3cgcHJvZ3Jlc3MgKi8KCSAgaWYgKGxwZm5DYWxsYmFjayhNdWxEaXYoc0luZm8uZHdTdGFydCwxMDAsblN0cmVhbXMqc0luZm8uZHdMZW5ndGgpKwoJCQkgICBNdWxEaXYoY3VyU3RyZWFtLCAxMDAsIG5TdHJlYW1zKSkpIHsKCSAgICBocmVzID0gQVZJRVJSX1VTRVJBQk9SVDsKCSAgICBnb3RvIGVycm9yOwoJICB9Cgl9IC8qIGNvcHkgYWxsIGJsb2NrcyAqLwogICAgICB9CiAgICB9IC8qIGNvcHkgZGF0YSBzdHJlYW0gYnkgc3RyZWFtICovCiAgfQoKIGVycm9yOgogIGlmIChscEJ1ZmZlciAhPSBOVUxMKQogICAgR2xvYmFsRnJlZVB0cihscEJ1ZmZlcik7CiAgaWYgKHBmaWxlICE9IE5VTEwpIHsKICAgIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICAgIGlmIChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dICE9IE5VTEwpCglBVklTdHJlYW1SZWxlYXNlKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0pOwogICAgICBpZiAocEluU3RyZWFtc1tjdXJTdHJlYW1dICE9IE5VTEwpCglBVklTdHJlYW1SZWxlYXNlKHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7CiAgICB9CgogICAgQVZJRmlsZVJlbGVhc2UocGZpbGUpOwogIH0KCiAgcmV0dXJuIGhyZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ3JlYXRlRWRpdGFibGVTdHJlYW0JKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVFZGl0YWJsZVN0cmVhbShQQVZJU1RSRUFNICpwcEVkaXRhYmxlLCBQQVZJU1RSRUFNIHBTb3VyY2UpCnsKICBJQVZJRWRpdFN0cmVhbSAqcEVkaXQgPSBOVUxMOwogIEhSRVNVTFQJICBocjsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIHBwRWRpdGFibGUsIHBTb3VyY2UpOwoKICBpZiAocHBFZGl0YWJsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwRWRpdGFibGUgPSBOVUxMOwoKICBpZiAocFNvdXJjZSAhPSBOVUxMKSB7CiAgICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocFNvdXJjZSwgJklJRF9JQVZJRWRpdFN0cmVhbSwKCQkJCSAgIChMUFZPSUQqKSZwRWRpdCk7CiAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICAgIGhyID0gSUFWSUVkaXRTdHJlYW1fQ2xvbmUocEVkaXQsIHBwRWRpdGFibGUpOwogICAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKCiAgICAgIHJldHVybiBocjsKICAgIH0KICB9CgogIC8qIG5lZWQgb3duIGltcGxlbWVudGF0aW9uIG9mIElBVklFZGl0U3RyZWFtICovCiAgcEVkaXQgPSBBVklGSUxFX0NyZWF0ZUVkaXRTdHJlYW0ocFNvdXJjZSk7CiAgaWYgKHBFZGl0ID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgaHIgPSBJQVZJRWRpdFN0cmVhbV9RdWVyeUludGVyZmFjZShwRWRpdCwgJklJRF9JQVZJU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopcHBFZGl0YWJsZSk7CiAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtQ2xvbmUJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbUNsb25lKFBBVklTVFJFQU0gcFN0cmVhbSwgUEFWSVNUUkVBTSAqcHBSZXN1bHQpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwU3RyZWFtLCBwcFJlc3VsdCk7CgogIGlmIChwU3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAocHBSZXN1bHQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcFJlc3VsdCA9IE5VTEw7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwU3RyZWFtLCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9DbG9uZShwRWRpdCwgcHBSZXN1bHQpOwoKICAgIElBVklFZGl0U3RyZWFtX1JlbGVhc2UocEVkaXQpOwogIH0gZWxzZQogICAgaHIgPSBBVklFUlJfVU5TVVBQT1JURUQ7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtQ29weQkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtQ29weShQQVZJU1RSRUFNIHBTdHJlYW0sIExPTkcgKnBsU3RhcnQsCgkJCSAgICAgIExPTkcgKnBsTGVuZ3RoLCBQQVZJU1RSRUFNICpwcFJlc3VsdCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIHBTdHJlYW0sIHBsU3RhcnQsIHBsTGVuZ3RoLCBwcFJlc3VsdCk7CgogIGlmIChwU3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAocGxTdGFydCA9PSBOVUxMIHx8IHBsTGVuZ3RoID09IE5VTEwgfHwgcHBSZXN1bHQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcFJlc3VsdCA9IE5VTEw7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwU3RyZWFtLCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9Db3B5KHBFZGl0LCBwbFN0YXJ0LCBwbExlbmd0aCwgcHBSZXN1bHQpOwoKICAgIElBVklFZGl0U3RyZWFtX1JlbGVhc2UocEVkaXQpOwogIH0gZWxzZQogICAgaHIgPSBBVklFUlJfVU5TVVBQT1JURUQ7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtQ3V0CQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1DdXQoUEFWSVNUUkVBTSBwU3RyZWFtLCBMT05HICpwbFN0YXJ0LAoJCQkgICAgIExPTkcgKnBsTGVuZ3RoLCBQQVZJU1RSRUFNICpwcFJlc3VsdCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIHBTdHJlYW0sIHBsU3RhcnQsIHBsTGVuZ3RoLCBwcFJlc3VsdCk7CgogIGlmIChwcFJlc3VsdCAhPSBOVUxMKQogICAgKnBwUmVzdWx0ID0gTlVMTDsKICBpZiAocFN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHBsU3RhcnQgPT0gTlVMTCB8fCBwbExlbmd0aCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBTdHJlYW0sICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX0N1dChwRWRpdCwgcGxTdGFydCwgcGxMZW5ndGgsIHBwUmVzdWx0KTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVBhc3RlCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1QYXN0ZShQQVZJU1RSRUFNIHBEZXN0LCBMT05HICpwbFN0YXJ0LCBMT05HICpwbExlbmd0aCwKCQkJICAgICAgIFBBVklTVFJFQU0gcFNvdXJjZSwgTE9ORyBsU3RhcnQsIExPTkcgbEVuZCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcCwlbGQsJWxkKVxuIiwgcERlc3QsIHBsU3RhcnQsIHBsTGVuZ3RoLAoJcFNvdXJjZSwgbFN0YXJ0LCBsRW5kKTsKCiAgaWYgKHBEZXN0ID09IE5VTEwgfHwgcFNvdXJjZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHBsU3RhcnQgPT0gTlVMTCB8fCBwbExlbmd0aCA9PSBOVUxMIHx8IGxTdGFydCA8IDApCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocERlc3QsICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX1Bhc3RlKHBFZGl0LCBwbFN0YXJ0LCBwbExlbmd0aCwgcFNvdXJjZSwgbFN0YXJ0LCBsRW5kKTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVNldEluZm9BCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbVNldEluZm9BKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPQSBhc2ksCgkJCQkgIExPTkcgc2l6ZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CgogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcHN0cmVhbSwgYXNpLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmICgoRFdPUkQpc2l6ZSA8IHNpemVvZihBVklTVFJFQU1JTkZPQSkpCiAgICByZXR1cm4gQVZJRVJSX0JBRFNJWkU7CgogIG1lbWNweSgmYXNpdywgYXNpLCBzaXplb2YoYXNpdykgLSBzaXplb2YoYXNpdy5zek5hbWUpKTsKICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYXNpLT5zek5hbWUsIC0xLAoJCSAgICAgIGFzaXcuc3pOYW1lLCBzaXplb2YoYXNpdy5zek5hbWUpKTsKCiAgcmV0dXJuIEVkaXRTdHJlYW1TZXRJbmZvVyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtU2V0SW5mb1cJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtU2V0SW5mb1coUEFWSVNUUkVBTSBwc3RyZWFtLCBMUEFWSVNUUkVBTUlORk9XIGFzaSwKCQkJCSAgTE9ORyBzaXplKQp7CiAgUEFWSUVESVRTVFJFQU0gcEVkaXQgPSBOVUxMOwogIEhSRVNVTFQgICAgICAgIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIHBzdHJlYW0sIGFzaSwgc2l6ZSk7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwc3RyZWFtLCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9TZXRJbmZvKHBFZGl0LCBhc2ksIHNpemUpOwoKICAgIElBVklFZGl0U3RyZWFtX1JlbGVhc2UocEVkaXQpOwogIH0gZWxzZQogICAgaHIgPSBBVklFUlJfVU5TVVBQT1JURUQ7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtU2V0TmFtZUEJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtU2V0TmFtZUEoUEFWSVNUUkVBTSBwc3RyZWFtLCBMUENTVFIgc3pOYW1lKQp7CiAgQVZJU1RSRUFNSU5GT0EgYXNpYTsKICBIUkVTVUxUICAgICAgICBocmVzOwoKICBUUkFDRSgiKCVwLCVzKVxuIiwgcHN0cmVhbSwgZGVidWdzdHJfYShzek5hbWUpKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChzek5hbWUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIGhyZXMgPSBBVklTdHJlYW1JbmZvQShwc3RyZWFtLCAmYXNpYSwgc2l6ZW9mKGFzaWEpKTsKICBpZiAoRkFJTEVEKGhyZXMpKQogICAgcmV0dXJuIGhyZXM7CgogIG1lbXNldChhc2lhLnN6TmFtZSwgMCwgc2l6ZW9mKGFzaWEuc3pOYW1lKSk7CiAgbHN0cmNweW5BKGFzaWEuc3pOYW1lLCBzek5hbWUsIHNpemVvZihhc2lhLnN6TmFtZSkvc2l6ZW9mKGFzaWEuc3pOYW1lWzBdKSk7CgogIHJldHVybiBFZGl0U3RyZWFtU2V0SW5mb0EocHN0cmVhbSwgJmFzaWEsIHNpemVvZihhc2lhKSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVNldE5hbWVXCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbVNldE5hbWVXKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBDV1NUUiBzek5hbWUpCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwogIEhSRVNVTFQgICAgICAgIGhyZXM7CgogIFRSQUNFKCIoJXAsJXMpXG4iLCBwc3RyZWFtLCBkZWJ1Z3N0cl93KHN6TmFtZSkpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHN6TmFtZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgaHJlcyA9IElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKICBpZiAoRkFJTEVEKGhyZXMpKQogICAgcmV0dXJuIGhyZXM7CgogIG1lbXNldChhc2l3LnN6TmFtZSwgMCwgc2l6ZW9mKGFzaXcuc3pOYW1lKSk7CiAgbHN0cmNweW5XKGFzaXcuc3pOYW1lLCBzek5hbWUsIHNpemVvZihhc2l3LnN6TmFtZSkvc2l6ZW9mKGFzaXcuc3pOYW1lWzBdKSk7CgogIHJldHVybiBFZGl0U3RyZWFtU2V0SW5mb1cocHN0cmVhbSwgJmFzaXcsIHNpemVvZihhc2l3KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQ2xlYXJDbGlwYm9hcmQJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklDbGVhckNsaXBib2FyZCh2b2lkKQp7CiAgVFJBQ0UoIigpXG4iKTsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsgLyogT2xlU2V0Q2xpcGJvYXJkKE5VTEwpOyAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUdldEZyb21DbGlwYm9hcmQJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklHZXRGcm9tQ2xpcGJvYXJkKFBBVklGSUxFICpwcGZpbGUpCnsKICBGSVhNRSgiKCVwKSwgc3R1YiFcbiIsIHBwZmlsZSk7CgogICpwcGZpbGUgPSBOVUxMOwoKICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBBVklNYWtlU3RyZWFtRnJvbUNsaXBib2FyZCAoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSU1ha2VTdHJlYW1Gcm9tQ2xpcGJvYXJkKFVJTlQgY2ZGb3JtYXQsIEhBTkRMRSBoR2xvYmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVZJU1RSRUFNICogcHBzdHJlYW0pCnsKICBGSVhNRSgiKDB4JTA4eCwlcCwlcCksIHN0dWIhXG4iLCBjZkZvcm1hdCwgaEdsb2JhbCwgcHBzdHJlYW0pOwoKICBpZiAocHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVB1dEZpbGVPbkNsaXBib2FyZAkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVB1dEZpbGVPbkNsaXBib2FyZChQQVZJRklMRSBwZmlsZSkKewogIEZJWE1FKCIoJXApLCBzdHViIVxuIiwgcGZpbGUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwp9CgpIUkVTVUxUIENERUNMIEFWSVNhdmVBKExQQ1NUUiBzekZpbGUsIENMU0lEICogcGNsc2lkSGFuZGxlciwgQVZJU0FWRUNBTExCQUNLIGxwZm5DYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJlYW1zLCBQQVZJU1RSRUFNIHBhdmksIExQQVZJQ09NUFJFU1NPUFRJT05TIGxwT3B0aW9ucywgLi4uKQp7CiAgICBGSVhNRSgiKCVzLCVwLCVwLDB4JTA4eCwlcCwlcCksIHN0dWIhXG4iLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHBjbHNpZEhhbmRsZXIsIGxwZm5DYWxsYmFjaywKICAgICAgICAgIG5TdHJlYW1zLCBwYXZpLCBscE9wdGlvbnMpOwoKICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7Cn0KCkhSRVNVTFQgQ0RFQ0wgQVZJU2F2ZVcoTFBDV1NUUiBzekZpbGUsIENMU0lEICogcGNsc2lkSGFuZGxlciwgQVZJU0FWRUNBTExCQUNLIGxwZm5DYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJlYW1zLCBQQVZJU1RSRUFNIHBhdmksIExQQVZJQ09NUFJFU1NPUFRJT05TIGxwT3B0aW9ucywgLi4uKQp7CiAgICBGSVhNRSgiKCVzLCVwLCVwLDB4JTA4eCwlcCwlcCksIHN0dWIhXG4iLCBkZWJ1Z3N0cl93KHN6RmlsZSksIHBjbHNpZEhhbmRsZXIsIGxwZm5DYWxsYmFjaywKICAgICAgICAgIG5TdHJlYW1zLCBwYXZpLCBscE9wdGlvbnMpOwoKICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7Cn0K