LyoKICogQ29weXJpZ2h0IDE5OTkgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAyLTIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojZGVmaW5lIENPTV9OT19XSU5ET1dTX0gKI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZG93c3guaCIKCiNpbmNsdWRlICJvbGUyLmgiCiNpbmNsdWRlICJzaGVsbGFwaS5oIgojaW5jbHVkZSAidmZ3LmgiCiNpbmNsdWRlICJtc2FjbS5oIgoKI2luY2x1ZGUgImF2aWZpbGVfcHJpdmF0ZS5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKI2luY2x1ZGUgIndpbmUvdW5pY29kZS5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoYXZpZmlsZSk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogY29waWVkIGZyb20gZGxscy9zaGVsbDMyL3VuZG9jc2hlbGwuaAogKi8KSFJFU1VMVCBXSU5BUEkgU0hDb0NyZWF0ZUluc3RhbmNlKExQQ1NUUiBscHN6Q2xzaWQsUkVGQ0xTSUQgckNsc2lkLAoJCQkJICBMUFVOS05PV04gcFVua091dGVyLFJFRklJRCByaWlkLExQVk9JRCAqcHB2KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBmb3IgQVZJQnVpbGRGaWx0ZXJXIC0tIHVzZXMgZml4ZWQgc2l6ZSB0YWJsZQogKi8KI2RlZmluZSBNQVhfRklMVEVSUyAzMCAvKiAzMCA9PiA3a0IgKi8KCnR5cGVkZWYgc3RydWN0IF9BVklGaWx0ZXIgewogIFdDSEFSIHN6Q2xzaWRbNDBdOwogIFdDSEFSIHN6RXh0ZW5zaW9uc1tNQVhfRklMVEVSUyAqIDddOwp9IEFWSUZpbHRlcjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBmb3IgQVZJU2F2ZU9wdGlvbnMKICovCnN0YXRpYyBzdHJ1Y3QgewogIFVJTlQgICAgICAgICAgICAgICAgICB1RmxhZ3M7CiAgSU5UICAgICAgICAgICAgICAgICAgIG5TdHJlYW1zOwogIFBBVklTVFJFQU0gICAgICAgICAgICpwcGF2aXM7CiAgTFBBVklDT01QUkVTU09QVElPTlMgKnBwT3B0aW9uczsKICBJTlQgICAgICAgICAgICAgICAgICAgbkN1cnJlbnQ7Cn0gU2F2ZU9wdHM7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogY29waWVkIGZyb20gZGxscy9vbGUzMi9jb21wb2JqLmMKICovCnN0YXRpYyBIUkVTVUxUIEFWSUZJTEVfQ0xTSURGcm9tU3RyaW5nKExQQ1NUUiBpZHN0ciwgTFBDTFNJRCBpZCkKewogIEJZVEUgY29uc3QgKnMgPSAoQllURSBjb25zdCopaWRzdHI7CiAgQllURSAqcDsKICBJTlQgICBpOwogIEJZVEUgdGFibGVbMjU2XTsKCiAgaWYgKCFzKSB7CiAgICBtZW1zZXQoaWQsIDAsIHNpemVvZihDTFNJRCkpOwogICAgcmV0dXJuIFNfT0s7CiAgfSBlbHNlIHsgIC8qIHZhbGlkYXRlIHRoZSBDTFNJRCBzdHJpbmcgKi8KICAgIGlmIChsc3RybGVuQShzKSAhPSAzOCkKICAgICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CgogICAgaWYgKChzWzBdIT0neycpIHx8IChzWzldIT0nLScpIHx8IChzWzE0XSE9Jy0nKSB8fCAoc1sxOV0hPSctJykgfHwKCShzWzI0XSE9Jy0nKSB8fCAoc1szN10hPSd9JykpCiAgICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoKICAgIGZvciAoaSA9IDE7IGkgPCAzNzsgaSsrKSB7CiAgICAgIGlmICgoaSA9PSA5KSB8fCAoaSA9PSAxNCkgfHwgKGkgPT0gMTkpIHx8IChpID09IDI0KSkKCWNvbnRpbnVlOwogICAgICBpZiAoISgoKHNbaV0gPj0gJzAnKSAmJiAoc1tpXSA8PSAnOScpKSAgfHwKCSAgICAoKHNbaV0gPj0gJ2EnKSAmJiAoc1tpXSA8PSAnZicpKSAgfHwKCSAgICAoKHNbaV0gPj0gJ0EnKSAmJiAoc1tpXSA8PSAnRicpKSkKCSAgKQoJcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CiAgICB9CiAgfQoKICBUUkFDRSgiJXMgLT4gJXBcbiIsIHMsIGlkKTsKCiAgLyogcXVpY2sgbG9va3VwIHRhYmxlICovCiAgbWVtc2V0KHRhYmxlLCAwLCAyNTYpOwoKICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKICAgIHRhYmxlWycwJyArIGldID0gaTsKCiAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogICAgdGFibGVbJ0EnICsgaV0gPSBpKzEwOwogICAgdGFibGVbJ2EnICsgaV0gPSBpKzEwOwogIH0KCiAgLyogaW4gZm9ybSB7WFhYWFhYWFgtWFhYWC1YWFhYLVhYWFgtWFhYWFhYWFhYWFhYfSAqLwogIHAgPSAoQllURSAqKSBpZDsKCiAgcysrOwkvKiBza2lwIGxlYWRpbmcgYnJhY2UgICovCiAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgcFszIC0gaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KICBwICs9IDQ7CiAgcysrOwkvKiBza2lwIC0gKi8KCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgcFsxLWldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKICAgIHMgKz0gMjsKICB9CiAgcCArPSAyOwogIHMrKzsJLyogc2tpcCAtICovCgogIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgIHBbMS1pXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHAgKz0gMjsKICBzKys7CS8qIHNraXAgLSAqLwoKICAvKiB0aGVzZSBhcmUganVzdCBzZXF1ZW50aWFsIGJ5dGVzICovCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgKnArKyA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHMrKzsJLyogc2tpcCAtICovCgogIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICpwKysgPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KCiAgcmV0dXJuIFNfT0s7Cn0KCnN0YXRpYyBCT09MIEFWSUZJTEVfR2V0RmlsZUhhbmRsZXJCeUV4dGVuc2lvbihMUENXU1RSIHN6RmlsZSwgTFBDTFNJRCBscGNsc2lkKQp7CiAgQ0hBUiAgIHN6UmVnS2V5WzI1XTsKICBDSEFSICAgc3pWYWx1ZVsxMDBdOwogIExQV1NUUiBzekV4dCA9IHN0cnJjaHJXKHN6RmlsZSwgJy4nKTsKICBMT05HICAgbGVuID0gc2l6ZW9mKHN6VmFsdWUpIC8gc2l6ZW9mKHN6VmFsdWVbMF0pOwoKICBpZiAoc3pFeHQgPT0gTlVMTCkKICAgIHJldHVybiBGQUxTRTsKCiAgc3pFeHQrKzsKCiAgd3NwcmludGZBKHN6UmVnS2V5LCAiQVZJRmlsZVxcRXh0ZW5zaW9uc1xcJS4zbHMiLCBzekV4dCk7CiAgaWYgKFJlZ1F1ZXJ5VmFsdWVBKEhLRVlfQ0xBU1NFU19ST09ULCBzelJlZ0tleSwgc3pWYWx1ZSwgJmxlbikgIT0gRVJST1JfU1VDQ0VTUykKICAgIHJldHVybiBGQUxTRTsKCiAgcmV0dXJuIChBVklGSUxFX0NMU0lERnJvbVN0cmluZyhzelZhbHVlLCBscGNsc2lkKSA9PSBTX09LKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlSW5pdAkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlSW5pdAkJKEFWSUZJTEUuMTAwKQogKi8Kdm9pZCBXSU5BUEkgQVZJRmlsZUluaXQodm9pZCkgewogIC8qIG5lZWQgdG8gbG9hZCBvbGUzMi5kbGwgaWYgbm90IGFscmVhZHkgZG9uZSBhbmQgZ2V0IHNvbWUgZnVuY3Rpb25zICovCiAgRklYTUUoIigpOiBzdHViIVxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUV4aXQJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUV4aXQJCShBVklGSUxFLjEwMSkKICovCnZvaWQgV0lOQVBJIEFWSUZpbGVFeGl0KHZvaWQpIHsKICAvKiBuZWVkIHRvIGZyZWUgb2xlMzIuZGxsIGlmIHdlIGFyZSB0aGUgbGFzdCBleGl0IGNhbGwgKi8KICBGSVhNRSgiKCk6IHN0dWIhXG4iKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlT3BlbkEJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZU9wZW4JCShBVklGSUxFLjEwMikKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVPcGVuQShQQVZJRklMRSAqcHBmaWxlLCBMUENTVFIgc3pGaWxlLCBVSU5UIHVNb2RlLAoJCQkgICAgTFBDTFNJRCBscEhhbmRsZXIpCnsKICBMUFdTVFIgIHdzekZpbGUgPSBOVUxMOwogIEhSRVNVTFQgaHI7CiAgaW50ICAgICBsZW47CgogIFRSQUNFKCIoJXAsJXMsMHglMDhYLCVzKVxuIiwgcHBmaWxlLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHVNb2RlLAoJZGVidWdzdHJfZ3VpZChscEhhbmRsZXIpKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChwcGZpbGUgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIC8qIGNvbnZlcnQgQVNDSUkgc3RyaW5nIHRvIFVuaWNvZGUgYW5kIGNhbGwgdW5pY29kZSBmdW5jdGlvbiAqLwogIGxlbiA9IGxzdHJsZW5BKHN6RmlsZSk7CiAgaWYgKGxlbiA8PSAwKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgd3N6RmlsZSA9IChMUFdTVFIpTG9jYWxBbGxvYyhMUFRSLCAobGVuICsgMSkgKiBzaXplb2YoV0NIQVIpKTsKICBpZiAod3N6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzekZpbGUsIC0xLCB3c3pGaWxlLCBsZW4gKyAxKTsKICB3c3pGaWxlW2xlbiArIDFdID0gMDsKCiAgaHIgPSBBVklGaWxlT3BlblcocHBmaWxlLCB3c3pGaWxlLCB1TW9kZSwgbHBIYW5kbGVyKTsKCiAgTG9jYWxGcmVlKChITE9DQUwpd3N6RmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlT3BlblcJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZU9wZW5XKFBBVklGSUxFICpwcGZpbGUsIExQQ1dTVFIgc3pGaWxlLCBVSU5UIHVNb2RlLAoJCQkgICAgTFBDTFNJRCBscEhhbmRsZXIpCnsKICBJUGVyc2lzdEZpbGUgKnBwZXJzaXN0ID0gTlVMTDsKICBDTFNJRCAgICAgICAgIGNsc2lkSGFuZGxlcjsKICBIUkVTVUxUICAgICAgIGhyOwoKICBUUkFDRSgiKCVwLCVzLDB4JVgsJXMpXG4iLCBwcGZpbGUsIGRlYnVnc3RyX3coc3pGaWxlKSwgdU1vZGUsCglkZWJ1Z3N0cl9ndWlkKGxwSGFuZGxlcikpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCiAgaWYgKHBwZmlsZSA9PSBOVUxMIHx8IHN6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwZmlsZSA9IE5VTEw7CgogIC8qIGlmIG5vIGhhbmRsZXIgdGhlbiB0cnkgZ3Vlc3NpbmcgaXQgYnkgZXh0ZW5zaW9uICovCiAgaWYgKGxwSGFuZGxlciA9PSBOVUxMKSB7CiAgICBpZiAoISBBVklGSUxFX0dldEZpbGVIYW5kbGVyQnlFeHRlbnNpb24oc3pGaWxlLCAmY2xzaWRIYW5kbGVyKSkKICAgICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKICB9IGVsc2UKICAgIG1lbWNweSgmY2xzaWRIYW5kbGVyLCBscEhhbmRsZXIsIHNpemVvZihjbHNpZEhhbmRsZXIpKTsKCiAgLyogY3JldGUgaW5zdGFuY2Ugb2YgaGFuZGxlciAqLwogIGhyID0gU0hDb0NyZWF0ZUluc3RhbmNlKE5VTEwsICZjbHNpZEhhbmRsZXIsIE5VTEwsCgkJCSAgJklJRF9JQVZJRmlsZSwgKExQVk9JRCopcHBmaWxlKTsKICBpZiAoRkFJTEVEKGhyKSB8fCAqcHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIC8qIGFzayBmb3IgSVBlcnNpc3RGaWxlIGludGVyZmFjZSBmb3IgbG9hZGluZy9jcmVhdGluZyB0aGUgZmlsZSAqLwogIGhyID0gSUFWSUZpbGVfUXVlcnlJbnRlcmZhY2UoKnBwZmlsZSwgJklJRF9JUGVyc2lzdEZpbGUsIChMUFZPSUQqKSZwcGVyc2lzdCk7CiAgaWYgKEZBSUxFRChocikgfHwgcHBlcnNpc3QgPT0gTlVMTCkgewogICAgSUFWSUZpbGVfUmVsZWFzZSgqcHBmaWxlKTsKICAgICpwcGZpbGUgPSBOVUxMOwogICAgcmV0dXJuIGhyOwogIH0KCiAgaHIgPSBJUGVyc2lzdEZpbGVfTG9hZChwcGVyc2lzdCwgc3pGaWxlLCB1TW9kZSk7CiAgSVBlcnNpc3RGaWxlX1JlbGVhc2UocHBlcnNpc3QpOwogIGlmIChGQUlMRUQoaHIpKSB7CiAgICBJQVZJRmlsZV9SZWxlYXNlKCpwcGZpbGUpOwogICAgKnBwZmlsZSA9IE5VTEw7CiAgfQoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUFkZFJlZgkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlQWRkUmVmCQkoQVZJRklMRS4xNDApCiAqLwpVTE9ORyBXSU5BUEkgQVZJRmlsZUFkZFJlZihQQVZJRklMRSBwZmlsZSkKewogIFRSQUNFKCIoJXApXG4iLCBwZmlsZSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKSB7CiAgICBFUlIoIjogYmFkIGhhbmRsZSBwYXNzZWQhXG4iKTsKICAgIHJldHVybiAwOwogIH0KCiAgcmV0dXJuIElBVklGaWxlX0FkZFJlZihwZmlsZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZVJlbGVhc2UJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZVJlbGVhc2UJCShBVklGSUxFLjE0MSkKICovClVMT05HIFdJTkFQSSBBVklGaWxlUmVsZWFzZShQQVZJRklMRSBwZmlsZSkKewogIFRSQUNFKCIoJXApXG4iLCBwZmlsZSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKSB7CiAgICBFUlIoIjogYmFkIGhhbmRsZSBwYXNzZWQhXG4iKTsKICAgIHJldHVybiAwOwogIH0KCiAgcmV0dXJuIElBVklGaWxlX1JlbGVhc2UocGZpbGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVJbmZvCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVJbmZvQQkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlSW5mbwkJKEFWSUZJTEUuMTQyKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZUluZm9BKFBBVklGSUxFIHBmaWxlLCBMUEFWSUZJTEVJTkZPQSBhZmksIExPTkcgc2l6ZSkKewogIEFWSUZJTEVJTkZPVyBhZml3OwogIEhSRVNVTFQgICAgICBocmVzOwoKICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIHBmaWxlLCBhZmksIHNpemUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmICgoRFdPUkQpc2l6ZSA8IHNpemVvZihBVklGSUxFSU5GT0EpKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBocmVzID0gSUFWSUZpbGVfSW5mbyhwZmlsZSwgJmFmaXcsIHNpemVvZihhZml3KSk7CgogIG1lbWNweShhZmksICZhZml3LCBzaXplb2YoKmFmaSkgLSBzaXplb2YoYWZpLT5zekZpbGVUeXBlKSk7CiAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIGFmaXcuc3pGaWxlVHlwZSwgLTEsIGFmaS0+c3pGaWxlVHlwZSwKCQkgICAgICBzaXplb2YoYWZpLT5zekZpbGVUeXBlKSwgTlVMTCwgTlVMTCk7CiAgYWZpLT5zekZpbGVUeXBlW3NpemVvZihhZmktPnN6RmlsZVR5cGUpIC0gMV0gPSAwOwoKICByZXR1cm4gaHJlczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlSW5mb1cJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZUluZm9XKFBBVklGSUxFIHBmaWxlLCBMUEFWSUZJTEVJTkZPVyBhZml3LCBMT05HIHNpemUpCnsKICBUUkFDRSgiKCVwLCVwLCVsZClcbiIsIHBmaWxlLCBhZml3LCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX0luZm8ocGZpbGUsIGFmaXcsIHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVHZXRTdHJlYW0JKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlR2V0U3RyZWFtCShBVklGSUxFLjE0MykKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVHZXRTdHJlYW0oUEFWSUZJTEUgcGZpbGUsIFBBVklTVFJFQU0gKmF2aXMsCgkJCQlEV09SRCBmY2NUeXBlLCBMT05HIGxQYXJhbSkKewogIFRSQUNFKCIoJXAsJXAsJyU0LjRzJywlbGQpXG4iLCBwZmlsZSwgYXZpcywgKGNoYXIqKSZmY2NUeXBlLCBsUGFyYW0pOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfR2V0U3RyZWFtKHBmaWxlLCBhdmlzLCBmY2NUeXBlLCBsUGFyYW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVDcmVhdGVTdHJlYW1BCShBVklGSUwzMi5AKQogKiAgICAgICAgICAgICAgQVZJRmlsZUNyZWF0ZVN0cmVhbQkoQVZJRklMRS4xNDQpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlQ3JlYXRlU3RyZWFtQShQQVZJRklMRSBwZmlsZSwgUEFWSVNUUkVBTSAqcHBhdmksCgkJCQkgICAgTFBBVklTVFJFQU1JTkZPQSBwc2kpCnsKICBBVklTVFJFQU1JTkZPVwlwc2l3OwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcGZpbGUsIHBwYXZpLCBwc2kpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICAvKiBPbmx5IHRoZSBzek5hbWUgYXQgdGhlIGVuZCBpcyBkaWZmZXJlbnQgKi8KICBtZW1jcHkoJnBzaXcsIHBzaSwgc2l6ZW9mKCpwc2kpIC0gc2l6ZW9mKHBzaS0+c3pOYW1lKSk7CiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHBzaS0+c3pOYW1lLCAtMSwgcHNpdy5zek5hbWUsCgkJICAgICAgc2l6ZW9mKHBzaXcuc3pOYW1lKSAvIHNpemVvZihwc2l3LnN6TmFtZVswXSkpOwoKICByZXR1cm4gSUFWSUZpbGVfQ3JlYXRlU3RyZWFtKHBmaWxlLCBwcGF2aSwgJnBzaXcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVDcmVhdGVTdHJlYW1XCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZUNyZWF0ZVN0cmVhbVcoUEFWSUZJTEUgcGZpbGUsIFBBVklTVFJFQU0gKmF2aXMsCgkJCQkgICAgTFBBVklTVFJFQU1JTkZPVyBhc2kpCnsKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcGZpbGUsIGF2aXMsIGFzaSk7CgogIHJldHVybiBJQVZJRmlsZV9DcmVhdGVTdHJlYW0ocGZpbGUsIGF2aXMsIGFzaSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZVdyaXRlRGF0YQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVXcml0ZURhdGEJKEFWSUZJTEUuMTQ2KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZVdyaXRlRGF0YShQQVZJRklMRSBwZmlsZSxEV09SRCBmY2MsTFBWT0lEIGxwLExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlbGQpXG4iLCBwZmlsZSwgKGNoYXIqKSZmY2MsIGxwLCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX1dyaXRlRGF0YShwZmlsZSwgZmNjLCBscCwgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZVJlYWREYXRhCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVSZWFkRGF0YQkJKEFWSUZJTEUuMTQ3KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZVJlYWREYXRhKFBBVklGSUxFIHBmaWxlLERXT1JEIGZjYyxMUFZPSUQgbHAsTFBMT05HIHNpemUpCnsKICBUUkFDRSgiKCVwLCclNC40cycsJXAsJXApXG4iLCBwZmlsZSwgKGNoYXIqKSZmY2MsIGxwLCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX1JlYWREYXRhKHBmaWxlLCBmY2MsIGxwLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlRW5kUmVjb3JkCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUVuZFJlY29yZAkoQVZJRklMRS4xNDgpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlRW5kUmVjb3JkKFBBVklGSUxFIHBmaWxlKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX0VuZFJlY29yZChwZmlsZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtQWRkUmVmCQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUFkZFJlZgkJKEFWSUZJTEUuMTYwKQogKi8KVUxPTkcgV0lOQVBJIEFWSVN0cmVhbUFkZFJlZihQQVZJU1RSRUFNIHBzdHJlYW0pCnsKICBUUkFDRSgiKCVwKVxuIiwgcHN0cmVhbSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSVN0cmVhbV9BZGRSZWYocHN0cmVhbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVsZWFzZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVJlbGVhc2UJKEFWSUZJTEUuMTYxKQogKi8KVUxPTkcgV0lOQVBJIEFWSVN0cmVhbVJlbGVhc2UoUEFWSVNUUkVBTSBwc3RyZWFtKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBzdHJlYW0pOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKSB7CiAgICBFUlIoIjogYmFkIGhhbmRsZSBwYXNzZWQhXG4iKTsKICAgIHJldHVybiAwOwogIH0KCiAgcmV0dXJuIElBVklTdHJlYW1fUmVsZWFzZShwc3RyZWFtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1DcmVhdGUJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtQ3JlYXRlCQkoQVZJRklMRS4xMDQpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1DcmVhdGUoUEFWSVNUUkVBTSAqcHBhdmksIExPTkcgbFBhcmFtMSwgTE9ORyBsUGFyYW0yLAoJCQkgICAgICAgTFBDTFNJRCBwY2xzaWRIYW5kbGVyKQp7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwweCUwOGxYLDB4JTA4bFgsJXMpXG4iLCBwcGF2aSwgbFBhcmFtMSwgbFBhcmFtMiwKCWRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBhdmkgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGF2aSA9IE5VTEw7CiAgaWYgKHBjbHNpZEhhbmRsZXIgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CgogIGhyID0gU0hDb0NyZWF0ZUluc3RhbmNlKE5VTEwsIHBjbHNpZEhhbmRsZXIsIE5VTEwsCgkJCSAgJklJRF9JQVZJU3RyZWFtLCAoTFBWT0lEKilwcGF2aSk7CiAgaWYgKEZBSUxFRChocikgfHwgKnBwYXZpID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSVN0cmVhbV9DcmVhdGUoKnBwYXZpLCBsUGFyYW0xLCBsUGFyYW0yKTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgSUFWSVN0cmVhbV9SZWxlYXNlKCpwcGF2aSk7CiAgICAqcHBhdmkgPSBOVUxMOwogIH0KCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUluZm9BCQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUluZm8JCShBVklGSUxFLjE2MikKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUluZm9BKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPQSBhc2ksCgkJCSAgICAgIExPTkcgc2l6ZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgSFJFU1VMVAkgaHJlczsKCiAgVFJBQ0UoIiglcCwlcCwlbGQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKChEV09SRClzaXplIDwgc2l6ZW9mKEFWSVNUUkVBTUlORk9BKSkKICAgIHJldHVybiBBVklFUlJfQkFEU0laRTsKCiAgaHJlcyA9IElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKCiAgbWVtY3B5KGFzaSwgJmFzaXcsIHNpemVvZihhc2l3KSAtIHNpemVvZihhc2l3LnN6TmFtZSkpOwogIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBhc2l3LnN6TmFtZSwgLTEsIGFzaS0+c3pOYW1lLAoJCSAgICAgIHNpemVvZihhc2ktPnN6TmFtZSksIE5VTEwsIE5VTEwpOwogIGFzaS0+c3pOYW1lW3NpemVvZihhc2ktPnN6TmFtZSkgLSAxXSA9IDA7CgogIHJldHVybiBocmVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUluZm9XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUluZm9XKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPVyBhc2ksCgkJCSAgICAgIExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcHN0cmVhbSwgYXNpLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sIGFzaSwgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtRmluZFNhbXBsZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUZpbmRTYW1wbGUJKEFWSUZJTEUuMTYzKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtRmluZFNhbXBsZShQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgcG9zLCBEV09SRCBmbGFncykKewogIFRSQUNFKCIoJXAsJWxkLDB4JWxYKVxuIiwgcHN0cmVhbSwgcG9zLCBmbGFncyk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgogIHJldHVybiBJQVZJU3RyZWFtX0ZpbmRTYW1wbGUocHN0cmVhbSwgcG9zLCBmbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVhZEZvcm1hdAkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVJlYWRGb3JtYXQJKEFWSUZJTEUuMTY0KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZEZvcm1hdChQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgcG9zLAoJCQkJICAgTFBWT0lEIGZvcm1hdCwgTFBMT05HIGZvcm1hdHNpemUpCnsKICBUUkFDRSgiKCVwLCVsZCwlcCwlcClcbiIsIHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWFkRm9ybWF0KHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1TZXRGb3JtYXQJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1TZXRGb3JtYXQJKEFWSUZJTEUuMTY5KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtU2V0Rm9ybWF0KFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBwb3MsCgkJCQkgIExQVk9JRCBmb3JtYXQsIExPTkcgZm9ybWF0c2l6ZSkKewogIFRSQUNFKCIoJXAsJWxkLCVwLCVsZClcbiIsIHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9TZXRGb3JtYXQocHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVJlYWQJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVhZAkJKEFWSUZJTEUuMTY3KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZChQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgc3RhcnQsIExPTkcgc2FtcGxlcywKCQkJICAgICBMUFZPSUQgYnVmZmVyLCBMT05HIGJ1ZmZlcnNpemUsCgkJCSAgICAgTFBMT05HIGJ5dGVzcmVhZCwgTFBMT05HIHNhbXBsZXNyZWFkKQp7CiAgVFJBQ0UoIiglcCwlbGQsJWxkLCVwLCVsZCwlcCwlcClcbiIsIHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsCglidWZmZXJzaXplLCBieXRlc3JlYWQsIHNhbXBsZXNyZWFkKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWFkKHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsIGJ1ZmZlcnNpemUsCgkJCSBieXRlc3JlYWQsIHNhbXBsZXNyZWFkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1Xcml0ZQkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1Xcml0ZQkJKEFWSUZJTEUuMTY4KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtV3JpdGUoUEFWSVNUUkVBTSBwc3RyZWFtLCBMT05HIHN0YXJ0LCBMT05HIHNhbXBsZXMsCgkJCSAgICAgIExQVk9JRCBidWZmZXIsIExPTkcgYnVmZmVyc2l6ZSwgRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQTE9ORyBzYW1wd3JpdHRlbiwgTFBMT05HIGJ5dGVzd3JpdHRlbikKewogIFRSQUNFKCIoJXAsJWxkLCVsZCwlcCwlbGQsMHglbFgsJXAsJXApXG4iLCBwc3RyZWFtLCBzdGFydCwgc2FtcGxlcywgYnVmZmVyLAoJYnVmZmVyc2l6ZSwgZmxhZ3MsIHNhbXB3cml0dGVuLCBieXRlc3dyaXR0ZW4pOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1dyaXRlKHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsIGJ1ZmZlcnNpemUsCgkJCSAgZmxhZ3MsIHNhbXB3cml0dGVuLCBieXRlc3dyaXR0ZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVJlYWREYXRhCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVhZERhdGEJKEFWSUZJTEUuMTY1KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZERhdGEoUEFWSVNUUkVBTSBwc3RyZWFtLCBEV09SRCBmY2MsIExQVk9JRCBscCwKCQkJCSBMUExPTkcgbHByZWFkKQp7CiAgVFJBQ0UoIiglcCwnJTQuNHMnLCVwLCVwKVxuIiwgcHN0cmVhbSwgKGNoYXIqKSZmY2MsIGxwLCBscHJlYWQpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1JlYWREYXRhKHBzdHJlYW0sIGZjYywgbHAsIGxwcmVhZCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtV3JpdGVEYXRhCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtV3JpdGVEYXRhCShBVklGSUxFLjE2NikKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbVdyaXRlRGF0YShQQVZJU1RSRUFNIHBzdHJlYW0sIERXT1JEIGZjYywgTFBWT0lEIGxwLAoJCQkJICBMT05HIHNpemUpCnsKICBUUkFDRSgiKCVwLCclNC40cycsJXAsJWxkKVxuIiwgcHN0cmVhbSwgKGNoYXIqKSZmY2MsIGxwLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9Xcml0ZURhdGEocHN0cmVhbSwgZmNjLCBscCwgc2l6ZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtR2V0RnJhbWVPcGVuCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtR2V0RnJhbWVPcGVuCShBVklGSUxFLjExMikKICovClBHRVRGUkFNRSBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWVPcGVuKFBBVklTVFJFQU0gcHN0cmVhbSwKCQkJCSAgICAgICBMUEJJVE1BUElORk9IRUFERVIgbHBiaVdhbnRlZCkKewogIFBHRVRGUkFNRSBwZyA9IE5VTEw7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwc3RyZWFtLCBscGJpV2FudGVkKTsKCiAgaWYgKEZBSUxFRChJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBzdHJlYW0sICZJSURfSUdldEZyYW1lLCAoTFBWT0lEKikmcGcpKSB8fAogICAgICBwZyA9PSBOVUxMKSB7CiAgICBwZyA9IEFWSUZJTEVfQ3JlYXRlR2V0RnJhbWUocHN0cmVhbSk7CiAgICBpZiAocGcgPT0gTlVMTCkKICAgICAgcmV0dXJuIE5VTEw7CiAgfQoKICBpZiAoRkFJTEVEKElHZXRGcmFtZV9TZXRGb3JtYXQocGcsIGxwYmlXYW50ZWQsIE5VTEwsIDAsIDAsIC0xLCAtMSkpKSB7CiAgICBJR2V0RnJhbWVfUmVsZWFzZShwZyk7CiAgICByZXR1cm4gTlVMTDsKICB9CgogIHJldHVybiBwZzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1HZXRGcmFtZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUdldEZyYW1lCShBVklGSUxFLjExMCkKICovCkxQVk9JRCBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWUoUEdFVEZSQU1FIHBnLCBMT05HIHBvcykKewogIFRSQUNFKCIoJXAsJWxkKVxuIiwgcGcsIHBvcyk7CgogIGlmIChwZyA9PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CgogIHJldHVybiBJR2V0RnJhbWVfR2V0RnJhbWUocGcsIHBvcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtR2V0RnJhbWVDbG9zZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUdldEZyYW1lQ2xvc2UJKEFWSUZJTEUuMTExKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWVDbG9zZShQR0VURlJBTUUgcGcpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGcpOwoKICBpZiAocGcgIT0gTlVMTCkKICAgIHJldHVybiBJR2V0RnJhbWVfUmVsZWFzZShwZyk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJTWFrZUNvbXByZXNzZWRTdHJlYW0JKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklNYWtlQ29tcHJlc3NlZFN0cmVhbShQQVZJU1RSRUFNICpwcHNDb21wcmVzc2VkLAoJCQkJICAgICAgIFBBVklTVFJFQU0gcHNTb3VyY2UsCgkJCQkgICAgICAgTFBBVklDT01QUkVTU09QVElPTlMgYWNvLAoJCQkJICAgICAgIExQQ0xTSUQgcGNsc2lkSGFuZGxlcikKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgQ0hBUiAgICAgICAgICAgc3pSZWdLZXlbMjVdOwogIENIQVIgICAgICAgICAgIHN6VmFsdWVbMTAwXTsKICBDTFNJRCAgICAgICAgICBjbHNpZEhhbmRsZXI7CiAgSFJFU1VMVCAgICAgICAgaHI7CiAgTE9ORyAgICAgICAgICAgc2l6ZSA9IHNpemVvZihzelZhbHVlKTsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcylcbiIsIHBwc0NvbXByZXNzZWQsIHBzU291cmNlLCBhY28sCglkZWJ1Z3N0cl9ndWlkKHBjbHNpZEhhbmRsZXIpKTsKCiAgaWYgKHBwc0NvbXByZXNzZWQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CiAgaWYgKHBzU291cmNlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgKnBwc0NvbXByZXNzZWQgPSBOVUxMOwoKICAvKiBpZiBubyBoYW5kbGVyIGdpdmVuIGdldCBkZWZhdWx0IG9uZXMgYmFzZWQgb24gc3RyZWFtdHlwZSAqLwogIGlmIChwY2xzaWRIYW5kbGVyID09IE5VTEwpIHsKICAgIGhyID0gSUFWSVN0cmVhbV9JbmZvKHBzU291cmNlLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKICAgIGlmIChGQUlMRUQoaHIpKQogICAgICByZXR1cm4gaHI7CgogICAgd3NwcmludGZBKHN6UmVnS2V5LCAiQVZJRmlsZVxcQ29tcHJlc3NvcnNcXCU0LjRzIiwgKGNoYXIqKSZhc2l3LmZjY1R5cGUpOwogICAgaWYgKFJlZ1F1ZXJ5VmFsdWVBKEhLRVlfQ0xBU1NFU19ST09ULCBzelJlZ0tleSwgc3pWYWx1ZSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CiAgICBpZiAoQVZJRklMRV9DTFNJREZyb21TdHJpbmcoc3pWYWx1ZSwgJmNsc2lkSGFuZGxlcikgIT0gU19PSykKICAgICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKICB9IGVsc2UKICAgIG1lbWNweSgmY2xzaWRIYW5kbGVyLCBwY2xzaWRIYW5kbGVyLCBzaXplb2YoY2xzaWRIYW5kbGVyKSk7CgogIGhyID0gU0hDb0NyZWF0ZUluc3RhbmNlKE5VTEwsICZjbHNpZEhhbmRsZXIsIE5VTEwsCgkJCSAgJklJRF9JQVZJU3RyZWFtLCAoTFBWT0lEKilwcHNDb21wcmVzc2VkKTsKICBpZiAoRkFJTEVEKGhyKSB8fCAqcHBzQ29tcHJlc3NlZCA9PSBOVUxMKQogICAgcmV0dXJuIGhyOwoKICBociA9IElBVklTdHJlYW1fQ3JlYXRlKCpwcHNDb21wcmVzc2VkLCAoTFBBUkFNKXBzU291cmNlLCAoTFBBUkFNKWFjbyk7CiAgaWYgKEZBSUxFRChocikpIHsKICAgIElBVklTdHJlYW1fUmVsZWFzZSgqcHBzQ29tcHJlc3NlZCk7CiAgICAqcHBzQ29tcHJlc3NlZCA9IE5VTEw7CiAgfQoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJTWFrZUZpbGVGcm9tU3RyZWFtcwkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSU1ha2VGaWxlRnJvbVN0cmVhbXMoUEFWSUZJTEUgKnBwZmlsZSwgaW50IG5TdHJlYW1zLAoJCQkJICAgICAgUEFWSVNUUkVBTSAqcHBTdHJlYW1zKQp7CiAgVFJBQ0UoIiglcCwlZCwlcClcbiIsIHBwZmlsZSwgblN0cmVhbXMsIHBwU3RyZWFtcyk7CgogIGlmIChuU3RyZWFtcyA8IDAgfHwgcHBmaWxlID09IE5VTEwgfHwgcHBTdHJlYW1zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAqcHBmaWxlID0gQVZJRklMRV9DcmVhdGVBVklUZW1wRmlsZShuU3RyZWFtcywgcHBTdHJlYW1zKTsKICBpZiAoKnBwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIHJldHVybiBBVklFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtT3BlbkZyb21GaWxlICAgKEFWSUZJTEUuMTAzKQogKgkJQVZJU3RyZWFtT3BlbkZyb21GaWxlQQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbU9wZW5Gcm9tRmlsZUEoUEFWSVNUUkVBTSAqcHBhdmksIExQQ1NUUiBzekZpbGUsCgkJCQkgICAgICBEV09SRCBmY2NUeXBlLCBMT05HIGxQYXJhbSwKCQkJCSAgICAgIFVJTlQgbW9kZSwgTFBDTFNJRCBwY2xzaWRIYW5kbGVyKQp7CiAgUEFWSUZJTEUgcGZpbGUgPSBOVUxMOwogIEhSRVNVTFQgIGhyOwoKICBUUkFDRSgiKCVwLCVzLCclNC40cycsJWxkLDB4JVgsJXMpXG4iLCBwcGF2aSwgZGVidWdzdHJfYShzekZpbGUpLAoJKGNoYXIqKSZmY2NUeXBlLCBsUGFyYW0sIG1vZGUsIGRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBhdmkgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGF2aSA9IE5VTEw7CgogIGhyID0gQVZJRmlsZU9wZW5BKCZwZmlsZSwgc3pGaWxlLCBtb2RlLCBwY2xzaWRIYW5kbGVyKTsKICBpZiAoRkFJTEVEKGhyKSB8fCBwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIGhyOwoKICBociA9IElBVklGaWxlX0dldFN0cmVhbShwZmlsZSwgcHBhdmksIGZjY1R5cGUsIGxQYXJhbSk7CiAgSUFWSUZpbGVfUmVsZWFzZShwZmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGVXCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtT3BlbkZyb21GaWxlVyhQQVZJU1RSRUFNICpwcGF2aSwgTFBDV1NUUiBzekZpbGUsCgkJCQkgICAgICBEV09SRCBmY2NUeXBlLCBMT05HIGxQYXJhbSwKCQkJCSAgICAgIFVJTlQgbW9kZSwgTFBDTFNJRCBwY2xzaWRIYW5kbGVyKQp7CiAgUEFWSUZJTEUgcGZpbGUgPSBOVUxMOwogIEhSRVNVTFQgIGhyOwoKICBUUkFDRSgiKCVwLCVzLCclNC40cycsJWxkLDB4JVgsJXMpXG4iLCBwcGF2aSwgZGVidWdzdHJfdyhzekZpbGUpLAoJKGNoYXIqKSZmY2NUeXBlLCBsUGFyYW0sIG1vZGUsIGRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBhdmkgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGF2aSA9IE5VTEw7CgogIGhyID0gQVZJRmlsZU9wZW5XKCZwZmlsZSwgc3pGaWxlLCBtb2RlLCBwY2xzaWRIYW5kbGVyKTsKICBpZiAoRkFJTEVEKGhyKSB8fCBwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIGhyOwoKICBociA9IElBVklGaWxlX0dldFN0cmVhbShwZmlsZSwgcHBhdmksIGZjY1R5cGUsIGxQYXJhbSk7CiAgSUFWSUZpbGVfUmVsZWFzZShwZmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1CZWdpblN0cmVhbWluZwkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbUJlZ2luU3RyZWFtaW5nKFBBVklTVFJFQU0gcGF2aSwgTE9ORyBsU3RhcnQsIExPTkcgbEVuZCwgTE9ORyBsUmF0ZSkKewogIEZJWE1FKCIoJXApLT4oJWxkLCVsZCwlbGQpXG4iLCBwYXZpLCBsU3RhcnQsIGxFbmQsIGxSYXRlKTsKCiAgcmV0dXJuIEFWSUVSUl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1FbmRTdHJlYW1pbmcJKEFWSUZJTDMyLkApCiAqLwpMT05HIFdJTkFQSSBBVklTdHJlYW1FbmRTdHJlYW1pbmcoUEFWSVNUUkVBTSBwYXZpKQp7CiAgRklYTUUoIiglcClcbiIsIHBhdmkpOwoKICByZXR1cm4gQVZJRVJSX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVN0YXJ0CQkoQVZJRklMRS4xMzApCiAqCQlBVklTdHJlYW1TdGFydAkJKEFWSUZJTDMyLkApCiAqLwpMT05HIFdJTkFQSSBBVklTdHJlYW1TdGFydChQQVZJU1RSRUFNIHBzdHJlYW0pCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwoKICBUUkFDRSgiKCVwKVxuIiwgcHN0cmVhbSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gMDsKCiAgaWYgKEZBSUxFRChJQVZJU3RyZWFtX0luZm8ocHN0cmVhbSwgJmFzaXcsIHNpemVvZihhc2l3KSkpKQogICAgcmV0dXJuIDA7CgogIHJldHVybiBhc2l3LmR3U3RhcnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtTGVuZ3RoCQkoQVZJRklMRS4xMzEpCiAqCQlBVklTdHJlYW1MZW5ndGgJCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtTGVuZ3RoKFBBVklTVFJFQU0gcHN0cmVhbSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CgogIFRSQUNFKCIoJXApXG4iLCBwc3RyZWFtKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiAwOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKSkpCiAgICByZXR1cm4gMDsKCiAgcmV0dXJuIGFzaXcuZHdMZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtU2FtcGxlVG9UaW1lCShBVklGSUxFLjEzMykKICoJCUFWSVN0cmVhbVNhbXBsZVRvVGltZQkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbVNhbXBsZVRvVGltZShQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgbFNhbXBsZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgTE9ORyB0aW1lOwoKICBUUkFDRSgiKCVwLCVsZClcbiIsIHBzdHJlYW0sIGxTYW1wbGUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIC0xOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKSkpCiAgICByZXR1cm4gLTE7CiAgaWYgKGFzaXcuZHdSYXRlID09IDApCiAgICByZXR1cm4gLTE7CgogIC8qIGxpbWl0IHRvIHN0cmVhbSBib3VuZHMgKi8KICBpZiAobFNhbXBsZSA8IGFzaXcuZHdTdGFydCkKICAgIGxTYW1wbGUgPSBhc2l3LmR3U3RhcnQ7CiAgaWYgKGxTYW1wbGUgPiBhc2l3LmR3U3RhcnQgKyBhc2l3LmR3TGVuZ3RoKQogICAgbFNhbXBsZSA9IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGg7CgogIGlmIChhc2l3LmR3UmF0ZSAvIGFzaXcuZHdTY2FsZSA8IDEwMDApCiAgICB0aW1lID0gKExPTkcpKCgoZmxvYXQpbFNhbXBsZSAqIGFzaXcuZHdTY2FsZSAqIDEwMDApIC8gYXNpdy5kd1JhdGUpOwogIGVsc2UKICAgIHRpbWUgPSAoTE9ORykoKChmbG9hdClsU2FtcGxlICogYXNpdy5kd1NjYWxlICogMTAwMCArIChhc2l3LmR3UmF0ZSAtIDEpKSAvIGFzaXcuZHdSYXRlKTsKCiAgVFJBQ0UoIiAtPiAlbGRcbiIsdGltZSk7CiAgcmV0dXJuIHRpbWU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtVGltZVRvU2FtcGxlCShBVklGSUxFLjEzMikKICoJCUFWSVN0cmVhbVRpbWVUb1NhbXBsZQkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbVRpbWVUb1NhbXBsZShQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgbFRpbWUpCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwogIExPTkcgc2FtcGxlOwoKICBUUkFDRSgiKCVwLCVsZClcbiIsIHBzdHJlYW0sIGxUaW1lKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCB8fCBsVGltZSA8IDApCiAgICByZXR1cm4gLTE7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAtMTsKICBpZiAoYXNpdy5kd1NjYWxlID09IDApCiAgICByZXR1cm4gLTE7CgogIGlmIChhc2l3LmR3UmF0ZSAvIGFzaXcuZHdTY2FsZSA8IDEwMDApCiAgICBzYW1wbGUgPSAoTE9ORykoKCgoZmxvYXQpYXNpdy5kd1JhdGUgKiBsVGltZSkgLyAoYXNpdy5kd1NjYWxlICogMTAwMCkpKTsKICBlbHNlCiAgICBzYW1wbGUgPSAoTE9ORykoKChmbG9hdClhc2l3LmR3UmF0ZSAqIGxUaW1lICsgKGFzaXcuZHdTY2FsZSAqIDEwMDAgLSAxKSkgLyAoYXNpdy5kd1NjYWxlICogMTAwMCkpOwoKICAvKiBsaW1pdCB0byBzdHJlYW0gYm91bmRzICovCiAgaWYgKHNhbXBsZSA8IGFzaXcuZHdTdGFydCkKICAgIHNhbXBsZSA9IGFzaXcuZHdTdGFydDsKICBpZiAoc2FtcGxlID4gYXNpdy5kd1N0YXJ0ICsgYXNpdy5kd0xlbmd0aCkKICAgIHNhbXBsZSA9IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGg7CgogIFRSQUNFKCIgLT4gJWxkXG4iLCBzYW1wbGUpOwogIHJldHVybiBzYW1wbGU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQnVpbGRGaWx0ZXJBCQkoQVZJRklMMzIuQCkKICoJCUFWSUJ1aWxkRmlsdGVyCQkoQVZJRklMRS4xMjMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklCdWlsZEZpbHRlckEoTFBTVFIgc3pGaWx0ZXIsIExPTkcgY2JGaWx0ZXIsIEJPT0wgZlNhdmluZykKewogIExQV1NUUiAgd3N6RmlsdGVyOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJWxkLCVkKVxuIiwgc3pGaWx0ZXIsIGNiRmlsdGVyLCBmU2F2aW5nKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChzekZpbHRlciA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKICBpZiAoY2JGaWx0ZXIgPCAyKQogICAgcmV0dXJuIEFWSUVSUl9CQURTSVpFOwoKICBzekZpbHRlclswXSA9IDA7CiAgc3pGaWx0ZXJbMV0gPSAwOwoKICB3c3pGaWx0ZXIgPSAoTFBXU1RSKUdsb2JhbEFsbG9jUHRyKEdITkQsIGNiRmlsdGVyKTsKICBpZiAod3N6RmlsdGVyID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgaHIgPSBBVklCdWlsZEZpbHRlclcod3N6RmlsdGVyLCBjYkZpbHRlciwgZlNhdmluZyk7CiAgaWYgKFNVQ0NFRURFRChocikpIHsKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3c3pGaWx0ZXIsIGNiRmlsdGVyLAoJCQlzekZpbHRlciwgY2JGaWx0ZXIsIE5VTEwsIE5VTEwpOwogIH0KCiAgR2xvYmFsRnJlZVB0cih3c3pGaWx0ZXIpOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQnVpbGRGaWx0ZXJXCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUJ1aWxkRmlsdGVyVyhMUFdTVFIgc3pGaWx0ZXIsIExPTkcgY2JGaWx0ZXIsIEJPT0wgZlNhdmluZykKewogIHN0YXRpYyBjb25zdCBXQ0hBUiBzekNsc2lkW10gPSB7J0MnLCdMJywnUycsJ0knLCdEJywwfTsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pFeHRlbnNpb25GbXRbXSA9IHsnOycsJyonLCcuJywnJScsJ3MnLDB9OwogIHN0YXRpYyBjb25zdCBXQ0hBUiBzekFWSUZpbGVFeHRlbnNpb25zW10gPQogICAgeydBJywnVicsJ0knLCdGJywnaScsJ2wnLCdlJywnXFwnLCdFJywneCcsJ3QnLCdlJywnbicsJ3MnLCdpJywnbycsJ24nLCdzJywwfTsKCiAgQVZJRmlsdGVyICpscDsKICBXQ0hBUiAgICAgIHN6QWxsRmlsZXNbNDBdOwogIFdDSEFSICAgICAgc3pGaWxlRXh0WzEwXTsKICBXQ0hBUiAgICAgIHN6VmFsdWVbMTI4XTsKICBIS0VZICAgICAgIGhLZXk7CiAgRFdPUkQgICAgICBuLCBpOwogIExPTkcgICAgICAgc2l6ZTsKICBEV09SRCAgICAgIGNvdW50ID0gMDsKCiAgVFJBQ0UoIiglcCwlbGQsJWQpXG4iLCBzekZpbHRlciwgY2JGaWx0ZXIsIGZTYXZpbmcpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCiAgaWYgKHN6RmlsdGVyID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwogIGlmIChjYkZpbHRlciA8IDIpCiAgICByZXR1cm4gQVZJRVJSX0JBRFNJWkU7CgogIGxwID0gKEFWSUZpbHRlciopR2xvYmFsQWxsb2NQdHIoR0hORCwgTUFYX0ZJTFRFUlMgKiBzaXplb2YoQVZJRmlsdGVyKSk7CiAgaWYgKGxwID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgLyoKICAgKiAxLiBpdGVyYXRlIG92ZXIgSEtFWV9DTEFTU0VTX1JPT1RcXEFWSUZpbGVcXEV4dGVuc2lvbnMgYW5kIGNvbGxlY3QKICAgKiAgICBleHRlbnNpb25zIGFuZCBDTFNJRCdzCiAgICogMi4gaXRlcmF0ZSBvdmVyIGNvbGxlY3RlZCBDTFNJRCdzIGFuZCBjb3B5IGl0J3MgZGVzY3JpcHRpb24gYW5kIGl0J3MKICAgKiAgICBleHRlbnNpb25zIHRvIHN6RmlsdGVyIGlmIGl0IGZpdHMKICAgKgogICAqIEZpcnN0IGZpbHRlciBpcyBuYW1lZCAiQWxsIG11bHRpbWVkaWEgZmlsZXMiIGFuZCBpdCdzIGZpbHRlciBpcyBhCiAgICogY29sbGVjdGlvbiBvZiBhbGwgcG9zc2libGUgZXh0ZW5zaW9ucyBleGNlcHQgIiouKiIuCiAgICovCiAgaWYgKFJlZ09wZW5LZXlXKEhLRVlfQ0xBU1NFU19ST09ULCBzekFWSUZpbGVFeHRlbnNpb25zLCAmaEtleSkgIT0gU19PSykgewogICAgR2xvYmFsRnJlZVB0cihscCk7CiAgICByZXR1cm4gQVZJRVJSX0VSUk9SOwogIH0KICBmb3IgKG4gPSAwO1JlZ0VudW1LZXlXKGhLZXksIG4sIHN6RmlsZUV4dCwgc2l6ZW9mKHN6RmlsZUV4dCkpID09IFNfT0s7bisrKSB7CiAgICAvKiBnZXQgQ0xTSUQgdG8gZXh0ZW5zaW9uICovCiAgICBzaXplID0gc2l6ZW9mKHN6VmFsdWUpL3NpemVvZihzelZhbHVlWzBdKTsKICAgIGlmIChSZWdRdWVyeVZhbHVlVyhoS2V5LCBzekZpbGVFeHQsIHN6VmFsdWUsICZzaXplKSAhPSBTX09LKQogICAgICBicmVhazsKCiAgICAvKiBzZWFyY2ggaWYgdGhlIENMU0lEIGlzIGFscmVhZHkga25vd24gKi8KICAgIGZvciAoaSA9IDE7IGkgPD0gY291bnQ7IGkrKykgewogICAgICBpZiAobHN0cmNtcFcobHBbaV0uc3pDbHNpZCwgc3pWYWx1ZSkgPT0gMCkKCWJyZWFrOyAvKiBhIG5ldyBvbmUgKi8KICAgIH0KCiAgICBpZiAoY291bnQgLSBpID09IC0xVSkgewogICAgICAvKiBpdCdzIGEgbmV3IENMU0lEICovCgogICAgICAvKiBGSVhNRTogSG93IGRvIHdlIGdldCBpbmZvJ3MgYWJvdXQgcmVhZC93cml0ZSBjYXBhYmlsaXRpZXM/ICovCgogICAgICBpZiAoY291bnQgPj0gTUFYX0ZJTFRFUlMpIHsKCS8qIHRyeSB0byBpbmZvcm0gdXNlciBvZiBvdXIgZnVsbCBmaXhlZCBzaXplIHRhYmxlICovCglFUlIoIjogTW9yZSB0aGFuICVkIGZpbHRlcnMgZm91bmQhIEFkanVzdCBNQVhfRklMVEVSUyBpbiBkbGxzL2F2aWZpbDMyL2FwaS5jXG4iLCBNQVhfRklMVEVSUyk7CglicmVhazsKICAgICAgfQoKICAgICAgbHN0cmNweVcobHBbaV0uc3pDbHNpZCwgc3pWYWx1ZSk7CgogICAgICBjb3VudCsrOwogICAgfQoKICAgIC8qIGFwcGVuZCBleHRlbnNpb24gdG8gdGhlIGZpbHRlciAqLwogICAgd3NwcmludGZXKHN6VmFsdWUsIHN6RXh0ZW5zaW9uRm10LCBzekZpbGVFeHQpOwogICAgaWYgKGxwW2ldLnN6RXh0ZW5zaW9uc1swXSA9PSAwKQogICAgICBsc3RyY2F0VyhscFtpXS5zekV4dGVuc2lvbnMsIHN6VmFsdWUgKyAxKTsKICAgIGVsc2UKICAgICAgbHN0cmNhdFcobHBbaV0uc3pFeHRlbnNpb25zLCBzelZhbHVlKTsKCiAgICAvKiBhbHNvIGFwcGVuZCB0byB0aGUgImFsbCBtdWx0aW1lZGlhIi1maWx0ZXIgKi8KICAgIGlmIChscFswXS5zekV4dGVuc2lvbnNbMF0gPT0gMCkKICAgICAgbHN0cmNhdFcobHBbMF0uc3pFeHRlbnNpb25zLCBzelZhbHVlICsgMSk7CiAgICBlbHNlCiAgICAgIGxzdHJjYXRXKGxwWzBdLnN6RXh0ZW5zaW9ucywgc3pWYWx1ZSk7CiAgfQogIFJlZ0Nsb3NlS2V5KGhLZXkpOwoKICAvKiAyLiBnZXQgZGVzY3JpcHRpb25zIGZvciB0aGUgQ0xTSURzIGFuZCBmaWxsIG91dCBzekZpbHRlciAqLwogIGlmIChSZWdPcGVuS2V5VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pDbHNpZCwgJmhLZXkpICE9IFNfT0spIHsKICAgIEdsb2JhbEZyZWVQdHIobHApOwogICAgcmV0dXJuIEFWSUVSUl9FUlJPUjsKICB9CiAgZm9yIChuID0gMDsgbiA8PSBjb3VudDsgbisrKSB7CiAgICAvKiBmaXJzdCB0aGUgZGVzY3JpcHRpb24gKi8KICAgIGlmIChuICE9IDApIHsKICAgICAgc2l6ZSA9IHNpemVvZihzelZhbHVlKS9zaXplb2Yoc3pWYWx1ZVswXSk7CiAgICAgIGlmIChSZWdRdWVyeVZhbHVlVyhoS2V5LCBscFtuXS5zekNsc2lkLCBzelZhbHVlLCAmc2l6ZSkgPT0gU19PSykgewoJc2l6ZSA9IGxzdHJsZW5XKHN6VmFsdWUpOwoJbHN0cmNweW5XKHN6RmlsdGVyLCBzelZhbHVlLCBjYkZpbHRlcik7CiAgICAgIH0KICAgIH0gZWxzZQogICAgICBzaXplID0gTG9hZFN0cmluZ1coQVZJRklMRV9oTW9kdWxlLElEU19BTExNVUxUSU1FRElBLHN6RmlsdGVyLGNiRmlsdGVyKTsKCiAgICAvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlICovCiAgICBzaXplKys7CiAgICBpZiAoY2JGaWx0ZXIgPCBzaXplICsgbHN0cmxlblcobHBbbl0uc3pFeHRlbnNpb25zKSArIDIpIHsKICAgICAgc3pGaWx0ZXJbMF0gPSAwOwogICAgICBzekZpbHRlclsxXSA9IDA7CiAgICAgIEdsb2JhbEZyZWVQdHIobHApOwogICAgICBSZWdDbG9zZUtleShoS2V5KTsKICAgICAgcmV0dXJuIEFWSUVSUl9CVUZGRVJUT09TTUFMTDsKICAgIH0KICAgIGNiRmlsdGVyIC09IHNpemU7CiAgICBzekZpbHRlciArPSBzaXplOwoKICAgIC8qIGFuZCB0aGVuIHRoZSBmaWx0ZXIgKi8KICAgIGxzdHJjcHluVyhzekZpbHRlciwgbHBbbl0uc3pFeHRlbnNpb25zLCBjYkZpbHRlcik7CiAgICBzaXplID0gbHN0cmxlblcobHBbbl0uc3pFeHRlbnNpb25zKSArIDE7CiAgICBjYkZpbHRlciAtPSBzaXplOwogICAgc3pGaWx0ZXIgKz0gc2l6ZTsKICB9CgogIFJlZ0Nsb3NlS2V5KGhLZXkpOwogIEdsb2JhbEZyZWVQdHIobHApOwoKICAvKiBhZGQgIkFsbCBmaWxlcyIgIiouKiIgZmlsdGVyIGlmIGVub3VnaCBzcGFjZSBsZWZ0ICovCiAgc2l6ZSA9IExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSwgSURTX0FMTEZJTEVTLAoJCSAgICAgc3pBbGxGaWxlcywgc2l6ZW9mKHN6QWxsRmlsZXMpKSArIDE7CiAgaWYgKGNiRmlsdGVyID4gc2l6ZSkgewogICAgaW50IGk7CgogICAgLyogcmVwbGFjZSAnQCcgd2l0aCBcMDAwIHRvIHNlcGFyYXRlIGRlc2NyaXB0aW9uIG9mIGZpbHRlciAqLwogICAgZm9yIChpID0gMDsgaSA8IHNpemUgJiYgc3pBbGxGaWxlc1tpXSAhPSAwOyBpKyspIHsKICAgICAgaWYgKHN6QWxsRmlsZXNbaV0gPT0gJ0AnKSB7CglzekFsbEZpbGVzW2ldID0gMDsKCWJyZWFrOwogICAgICB9CiAgICB9CiAgICAgIAogICAgbWVtY3B5KHN6RmlsdGVyLCBzekFsbEZpbGVzLCBzaXplICogc2l6ZW9mKHN6QWxsRmlsZXNbMF0pKTsKICAgIHN6RmlsdGVyICs9IHNpemU7CiAgICBzekZpbHRlclswXSA9IDA7CgogICAgcmV0dXJuIEFWSUVSUl9PSzsKICB9IGVsc2UgewogICAgc3pGaWx0ZXJbMF0gPSAwOwogICAgcmV0dXJuIEFWSUVSUl9CVUZGRVJUT09TTUFMTDsKICB9Cn0KCnN0YXRpYyBCT09MIEFWSVNhdmVPcHRpb25zRm10Q2hvb3NlKEhXTkQgaFduZCkKewogIExQQVZJQ09NUFJFU1NPUFRJT05TIHBPcHRpb25zID0gU2F2ZU9wdHMucHBPcHRpb25zW1NhdmVPcHRzLm5DdXJyZW50XTsKICBBVklTVFJFQU1JTkZPVyAgICAgICBzSW5mbzsKCiAgVFJBQ0UoIiglcClcbiIsIGhXbmQpOwoKICBpZiAocE9wdGlvbnMgPT0gTlVMTCB8fCBTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgc3RhdGUhXG4iKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIGlmIChGQUlMRUQoQVZJU3RyZWFtSW5mb1coU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwKCQkJICAgICZzSW5mbywgc2l6ZW9mKHNJbmZvKSkpKSB7CiAgICBFUlIoIjogQVZJU3RyZWFtSW5mb1cgZmFpbGVkIVxuIik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8pIHsKICAgIENPTVBWQVJTIGN2OwogICAgQk9PTCAgICAgcmV0OwoKICAgIG1lbXNldCgmY3YsIDAsIHNpemVvZihjdikpOwoKICAgIGlmICgocE9wdGlvbnMtPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfVkFMSUQpID09IDApIHsKICAgICAgbWVtc2V0KHBPcHRpb25zLCAwLCBzaXplb2YoQVZJQ09NUFJFU1NPUFRJT05TKSk7CiAgICAgIHBPcHRpb25zLT5mY2NUeXBlICAgID0gc3RyZWFtdHlwZVZJREVPOwogICAgICBwT3B0aW9ucy0+ZmNjSGFuZGxlciA9IGNvbXB0eXBlRElCOwogICAgICBwT3B0aW9ucy0+ZHdRdWFsaXR5ICA9IChEV09SRClJQ1FVQUxJVFlfREVGQVVMVDsKICAgIH0KCiAgICBjdi5jYlNpemUgICAgID0gc2l6ZW9mKGN2KTsKICAgIGN2LmR3RmxhZ3MgICAgPSBJQ01GX0NPTVBWQVJTX1ZBTElEOwogICAgLypjdi5mY2NUeXBlICAgID0gcE9wdGlvbnMtPmZjY1R5cGU7ICovCiAgICBjdi5mY2NIYW5kbGVyID0gcE9wdGlvbnMtPmZjY0hhbmRsZXI7CiAgICBjdi5sUSAgICAgICAgID0gcE9wdGlvbnMtPmR3UXVhbGl0eTsKICAgIGN2LmxwU3RhdGUgICAgPSBwT3B0aW9ucy0+bHBQYXJtczsKICAgIGN2LmNiU3RhdGUgICAgPSBwT3B0aW9ucy0+Y2JQYXJtczsKICAgIGlmIChwT3B0aW9ucy0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9LRVlGUkFNRVMpCiAgICAgIGN2LmxLZXkgPSBwT3B0aW9ucy0+ZHdLZXlGcmFtZUV2ZXJ5OwogICAgZWxzZQogICAgICBjdi5sS2V5ID0gMDsKICAgIGlmIChwT3B0aW9ucy0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9EQVRBUkFURSkKICAgICAgY3YubERhdGFSYXRlID0gcE9wdGlvbnMtPmR3Qnl0ZXNQZXJTZWNvbmQgLyAxMDI0OyAvKiBuZWVkIGtCeXRlcyAqLwogICAgZWxzZQogICAgICBjdi5sRGF0YVJhdGUgPSAwOwoKICAgIHJldCA9IElDQ29tcHJlc3NvckNob29zZShoV25kLCBTYXZlT3B0cy51RmxhZ3MsIE5VTEwsCgkJCSAgICAgU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwgJmN2LCBOVUxMKTsKCiAgICBpZiAocmV0KSB7CiAgICAgIHBPcHRpb25zLT5mY2NIYW5kbGVyID0gY3YuZmNjSGFuZGxlcjsKICAgICAgcE9wdGlvbnMtPmxwUGFybXMgICA9IGN2LmxwU3RhdGU7CiAgICAgIHBPcHRpb25zLT5jYlBhcm1zICAgPSBjdi5jYlN0YXRlOwogICAgICBwT3B0aW9ucy0+ZHdRdWFsaXR5ID0gY3YubFE7CiAgICAgIGlmIChjdi5sS2V5ICE9IDApIHsKCXBPcHRpb25zLT5kd0tleUZyYW1lRXZlcnkgPSBjdi5sS2V5OwoJcE9wdGlvbnMtPmR3RmxhZ3MgfD0gQVZJQ09NUFJFU1NGX0tFWUZSQU1FUzsKICAgICAgfSBlbHNlCglwT3B0aW9ucy0+ZHdGbGFncyAmPSB+QVZJQ09NUFJFU1NGX0tFWUZSQU1FUzsKICAgICAgaWYgKGN2LmxEYXRhUmF0ZSAhPSAwKSB7CglwT3B0aW9ucy0+ZHdCeXRlc1BlclNlY29uZCA9IGN2LmxEYXRhUmF0ZSAqIDEwMjQ7IC8qIG5lZWQgYnl0ZXMgKi8KCXBPcHRpb25zLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9EQVRBUkFURTsKICAgICAgfSBlbHNlCglwT3B0aW9ucy0+ZHdGbGFncyAmPSB+QVZJQ09NUFJFU1NGX0RBVEFSQVRFOwogICAgICBwT3B0aW9ucy0+ZHdGbGFncyAgfD0gQVZJQ09NUFJFU1NGX1ZBTElEOwogICAgfQogICAgSUNDb21wcmVzc29yRnJlZSgmY3YpOwoKICAgIHJldHVybiByZXQ7CiAgfSBlbHNlIGlmIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVBVURJTykgewogICAgQUNNRk9STUFUQ0hPT1NFVyBhZm10YzsKICAgIE1NUkVTVUxUICAgICAgICAgcmV0OwogICAgTE9ORyAgICAgICAgICAgICBzaXplOwoKICAgIC8qIEZJWE1FOiBjaGVjayBBQ00gdmVyc2lvbiAtLSBXaGljaCB2ZXJzaW9uIGlzIG5lZWRlZD8gKi8KCiAgICBtZW1zZXQoJmFmbXRjLCAwLCBzaXplb2YoYWZtdGMpKTsKICAgIGFmbXRjLmNiU3RydWN0ICA9IHNpemVvZihhZm10Yyk7CiAgICBhZm10Yy5mZHdTdHlsZSAgPSAwOwogICAgYWZtdGMuaHduZE93bmVyID0gaFduZDsKCiAgICBhY21NZXRyaWNzKE5VTEwsIEFDTV9NRVRSSUNfTUFYX1NJWkVfRk9STUFULCAmc2l6ZSk7CiAgICBpZiAoKHBPcHRpb25zLT5jYkZvcm1hdCA9PSAwIHx8IHBPcHRpb25zLT5scEZvcm1hdCA9PSBOVUxMKSAmJiBzaXplICE9IDApIHsKICAgICAgcE9wdGlvbnMtPmxwRm9ybWF0ID0gR2xvYmFsQWxsb2NQdHIoR01FTV9NT1ZFQUJMRSwgc2l6ZSk7CiAgICAgIHBPcHRpb25zLT5jYkZvcm1hdCA9IHNpemU7CiAgICB9IGVsc2UgaWYgKHBPcHRpb25zLT5jYkZvcm1hdCA8IChEV09SRClzaXplKSB7CiAgICAgIHBPcHRpb25zLT5scEZvcm1hdCA9IEdsb2JhbFJlQWxsb2NQdHIocE9wdGlvbnMtPmxwRm9ybWF0LCBzaXplLCBHTUVNX01PVkVBQkxFKTsKICAgICAgcE9wdGlvbnMtPmNiRm9ybWF0ID0gc2l6ZTsKICAgIH0KICAgIGlmIChwT3B0aW9ucy0+bHBGb3JtYXQgPT0gTlVMTCkKICAgICAgcmV0dXJuIEZBTFNFOwogICAgYWZtdGMucHdmeCAgPSBwT3B0aW9ucy0+bHBGb3JtYXQ7CiAgICBhZm10Yy5jYndmeCA9IHBPcHRpb25zLT5jYkZvcm1hdDsKCiAgICBzaXplID0gMDsKICAgIEFWSVN0cmVhbUZvcm1hdFNpemUoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwKCQkJc0luZm8uZHdTdGFydCwgJnNpemUpOwogICAgaWYgKHNpemUgPCAoTE9ORylzaXplb2YoUENNV0FWRUZPUk1BVCkpCiAgICAgIHNpemUgPSBzaXplb2YoUENNV0FWRUZPUk1BVCk7CiAgICBhZm10Yy5wd2Z4RW51bSA9IEdsb2JhbEFsbG9jUHRyKEdITkQsIHNpemUpOwogICAgaWYgKGFmbXRjLnB3ZnhFbnVtICE9IE5VTEwpIHsKICAgICAgQVZJU3RyZWFtUmVhZEZvcm1hdChTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdLAoJCQkgIHNJbmZvLmR3U3RhcnQsIGFmbXRjLnB3ZnhFbnVtLCAmc2l6ZSk7CiAgICAgIGFmbXRjLmZkd0VudW0gPSBBQ01fRk9STUFURU5VTUZfQ09OVkVSVDsKICAgIH0KCiAgICByZXQgPSBhY21Gb3JtYXRDaG9vc2VXKCZhZm10Yyk7CiAgICBpZiAocmV0ID09IFNfT0spCiAgICAgIHBPcHRpb25zLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9WQUxJRDsKCiAgICBpZiAoYWZtdGMucHdmeEVudW0gIT0gTlVMTCkKICAgICAgR2xvYmFsRnJlZVB0cihhZm10Yy5wd2Z4RW51bSk7CgogICAgcmV0dXJuIChyZXQgPT0gU19PSyA/IFRSVUUgOiBGQUxTRSk7CiAgfSBlbHNlIHsKICAgIEVSUigiOiB1bmtub3duIHN0cmVhbXR5cGUgMHglMDhsWFxuIiwgc0luZm8uZmNjVHlwZSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQp9CgpzdGF0aWMgdm9pZCBBVklTYXZlT3B0aW9uc1VwZGF0ZShIV05EIGhXbmQpCnsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pWaWRlb0ZtdFtdPXsnJScsJ2wnLCdkJywneCcsJyUnLCdsJywnZCcsJ3gnLCclJywnZCcsMH07CiAgc3RhdGljIGNvbnN0IFdDSEFSIHN6QXVkaW9GbXRbXT17JyUnLCdzJywnICcsJyUnLCdzJywwfTsKCiAgV0NIQVIgICAgICAgICAgc3pGb3JtYXRbMTI4XTsKICBBVklTVFJFQU1JTkZPVyBzSW5mbzsKICBMUFZPSUQgICAgICAgICBscEZvcm1hdDsKICBMT05HICAgICAgICAgICBzaXplOwoKICBUUkFDRSgiKCVwKVxuIiwgaFduZCk7CgogIFNhdmVPcHRzLm5DdXJyZW50ID0gU2VuZERsZ0l0ZW1NZXNzYWdlVyhoV25kLElEQ19TVFJFQU0sQ0JfR0VUQ1VSU0VMLDAsMCk7CiAgaWYgKFNhdmVPcHRzLm5DdXJyZW50IDwgMCkKICAgIHJldHVybjsKCiAgaWYgKEZBSUxFRChBVklTdHJlYW1JbmZvVyhTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdLCAmc0luZm8sIHNpemVvZihzSW5mbykpKSkKICAgIHJldHVybjsKCiAgQVZJU3RyZWFtRm9ybWF0U2l6ZShTYXZlT3B0cy5wcGF2aXNbU2F2ZU9wdHMubkN1cnJlbnRdLHNJbmZvLmR3U3RhcnQsJnNpemUpOwogIGlmIChzaXplID4gMCkgewogICAgc3pGb3JtYXRbMF0gPSAwOwoKICAgIC8qIHJlYWQgZm9ybWF0IHRvIGJ1aWxkIGZvcm1hdCBkZXNjcmlvdGlvbiBzdHJpbmcgKi8KICAgIGxwRm9ybWF0ID0gR2xvYmFsQWxsb2NQdHIoR0hORCwgc2l6ZSk7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkgewogICAgICBpZiAoU1VDQ0VFREVEKEFWSVN0cmVhbVJlYWRGb3JtYXQoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSxzSW5mby5kd1N0YXJ0LGxwRm9ybWF0LCAmc2l6ZSkpKSB7CglpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8pIHsKCSAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmkgPSBscEZvcm1hdDsKCSAgSUNJTkZPIGljaW5mbzsKCgkgIHdzcHJpbnRmVyhzekZvcm1hdCwgc3pWaWRlb0ZtdCwgbHBiaS0+YmlXaWR0aCwKCQkgICAgbHBiaS0+YmlIZWlnaHQsIGxwYmktPmJpQml0Q291bnQpOwoKCSAgaWYgKGxwYmktPmJpQ29tcHJlc3Npb24gIT0gQklfUkdCKSB7CgkgICAgSElDICAgIGhpYzsKCgkgICAgaGljID0gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBzSW5mby5mY2NIYW5kbGVyLCBscEZvcm1hdCwKCQkJICAgTlVMTCwgSUNNT0RFX0RFQ09NUFJFU1MpOwoJICAgIGlmIChoaWMgIT0gTlVMTCkgewoJICAgICAgaWYgKElDR2V0SW5mbyhoaWMsICZpY2luZm8sIHNpemVvZihpY2luZm8pKSA9PSBTX09LKQoJCWxzdHJjYXRXKHN6Rm9ybWF0LCBpY2luZm8uc3pEZXNjcmlwdGlvbik7CgkgICAgICBJQ0Nsb3NlKGhpYyk7CgkgICAgfQoJICB9IGVsc2UgewoJICAgIExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSwgSURTX1VOQ09NUFJFU1NFRCwKCQkJaWNpbmZvLnN6RGVzY3JpcHRpb24sIHNpemVvZihpY2luZm8uc3pEZXNjcmlwdGlvbikpOwoJICAgIGxzdHJjYXRXKHN6Rm9ybWF0LCBpY2luZm8uc3pEZXNjcmlwdGlvbik7CgkgIH0KCX0gZWxzZSBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlQVVESU8pIHsKCSAgQUNNRk9STUFUVEFHREVUQUlMU1cgYWZ0ZDsKCSAgQUNNRk9STUFUREVUQUlMU1cgICAgYWZkOwoKCSAgbWVtc2V0KCZhZnRkLCAwLCBzaXplb2YoYWZ0ZCkpOwoJICBtZW1zZXQoJmFmZCwgMCwgc2l6ZW9mKGFmZCkpOwoKCSAgYWZ0ZC5jYlN0cnVjdCAgICAgPSBzaXplb2YoYWZ0ZCk7CgkgIGFmdGQuZHdGb3JtYXRUYWcgID0gYWZkLmR3Rm9ybWF0VGFnID0KCSAgICAoKFBXQVZFRk9STUFURVgpbHBGb3JtYXQpLT53Rm9ybWF0VGFnOwoJICBhZnRkLmNiRm9ybWF0U2l6ZSA9IGFmZC5jYndmeCA9IHNpemU7CgoJICBhZmQuY2JTdHJ1Y3QgICAgICA9IHNpemVvZihhZmQpOwoJICBhZmQucHdmeCAgICAgICAgICA9IGxwRm9ybWF0OwoKCSAgaWYgKGFjbUZvcm1hdFRhZ0RldGFpbHNXKE5VTEwsICZhZnRkLAoJCQkJICAgQUNNX0ZPUk1BVFRBR0RFVEFJTFNGX0ZPUk1BVFRBRykgPT0gU19PSykgewoJICAgIGlmIChhY21Gb3JtYXREZXRhaWxzVyhOVUxMLCZhZmQsQUNNX0ZPUk1BVERFVEFJTFNGX0ZPUk1BVCkgPT0gU19PSykKCSAgICAgIHdzcHJpbnRmVyhzekZvcm1hdCwgc3pBdWRpb0ZtdCwgYWZkLnN6Rm9ybWF0LCBhZnRkLnN6Rm9ybWF0VGFnKTsKCSAgfQoJfQogICAgICB9CiAgICAgIEdsb2JhbEZyZWVQdHIobHBGb3JtYXQpOwogICAgfQoKICAgIC8qIHNldCB0ZXh0IGZvciBmb3JtYXQgZGVzY3JpcHRpb24gKi8KICAgIFNldERsZ0l0ZW1UZXh0VyhoV25kLCBJRENfRk9STUFUVEVYVCwgc3pGb3JtYXQpOwoKICAgIC8qIERpc2FibGUgb3B0aW9uIGJ1dHRvbiBmb3IgdW5zdXBwb3J0ZWQgc3RyZWFtdHlwZXMgKi8KICAgIGlmIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTyB8fAoJc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlQVVESU8pCiAgICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIElEQ19PUFRJT05TKSwgVFJVRSk7CiAgICBlbHNlCiAgICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIElEQ19PUFRJT05TKSwgRkFMU0UpOwogIH0KCn0KCklOVF9QVFIgQ0FMTEJBQ0sgQVZJU2F2ZU9wdGlvbnNEbGdQcm9jKEhXTkQgaFduZCwgVUlOVCB1TXNnLAoJCQkJICAgIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCnsKICBEV09SRCBkd0ludGVybGVhdmU7CiAgQk9PTCAgYklzSW50ZXJsZWF2ZWQ7CiAgSU5UICAgbjsKCiAgLypUUkFDRSgiKCVwLCV1LDB4JTA0WCwweCUwOGxYKVxuIiwgaFduZCwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOyovCgogIHN3aXRjaCAodU1zZykgewogIGNhc2UgV01fSU5JVERJQUxPRzoKICAgIFNhdmVPcHRzLm5DdXJyZW50ID0gMDsKICAgIGlmIChTYXZlT3B0cy5uU3RyZWFtcyA9PSAxKSB7CiAgICAgIEVuZERpYWxvZyhoV25kLCBBVklTYXZlT3B0aW9uc0ZtdENob29zZShoV25kKSk7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICAgIC8qIGFkZCBzdHJlYW1zICovCiAgICBmb3IgKG4gPSAwOyBuIDwgU2F2ZU9wdHMublN0cmVhbXM7IG4rKykgewogICAgICBBVklTVFJFQU1JTkZPVyBzSW5mbzsKCiAgICAgIEFWSVN0cmVhbUluZm9XKFNhdmVPcHRzLnBwYXZpc1tuXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlVyhoV25kLCBJRENfU1RSRUFNLCBDQl9BRERTVFJJTkcsCgkJCSAgMEwsIChMUEFSQU0pc0luZm8uc3pOYW1lKTsKICAgIH0KCiAgICAvKiBzZWxlY3QgZmlyc3Qgc3RyZWFtICovCiAgICBTZW5kRGxnSXRlbU1lc3NhZ2VXKGhXbmQsIElEQ19TVFJFQU0sIENCX1NFVENVUlNFTCwgMCwgMCk7CiAgICBTZW5kTWVzc2FnZVcoaFduZCwgV01fQ09NTUFORCwKCQkgR0VUX1dNX0NPTU1BTkRfTVBTKElEQ19TVFJFQU0sIGhXbmQsIENCTl9TRUxDSEFOR0UpKTsKCiAgICAvKiBpbml0aWFsaXplIGludGVybGVhdmUgKi8KICAgIGlmIChTYXZlT3B0cy5wcE9wdGlvbnNbMF0gIT0gTlVMTCAmJgoJKFNhdmVPcHRzLnBwT3B0aW9uc1swXS0+ZHdGbGFncyAmIEFWSUNPTVBSRVNTRl9WQUxJRCkpIHsKICAgICAgYklzSW50ZXJsZWF2ZWQgPSAoU2F2ZU9wdHMucHBPcHRpb25zWzBdLT5kd0ZsYWdzICYgQVZJQ09NUFJFU1NGX0lOVEVSTEVBVkUpOwogICAgICBkd0ludGVybGVhdmUgPSBTYXZlT3B0cy5wcE9wdGlvbnNbMF0tPmR3SW50ZXJsZWF2ZUV2ZXJ5OwogICAgfSBlbHNlIHsKICAgICAgYklzSW50ZXJsZWF2ZWQgPSBUUlVFOwogICAgICBkd0ludGVybGVhdmUgICA9IDA7CiAgICB9CiAgICBDaGVja0RsZ0J1dHRvbihoV25kLCBJRENfSU5URVJMRUFWRSwgYklzSW50ZXJsZWF2ZWQpOwogICAgU2V0RGxnSXRlbUludChoV25kLCBJRENfSU5URVJMRUFWRUVWRVJZLCBkd0ludGVybGVhdmUsIEZBTFNFKTsKICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlkpLCBiSXNJbnRlcmxlYXZlZCk7CiAgICBicmVhazsKICBjYXNlIFdNX0NPTU1BTkQ6CiAgICBzd2l0Y2ggKEdFVF9XTV9DT01NQU5EX0lEKHdQYXJhbSwgbFBhcmFtKSkgewogICAgY2FzZSBJRE9LOgogICAgICAvKiBnZXQgZGF0YSBmcm9tIGNvbnRyb2xzIGFuZCBzYXZlIHRoZW0gKi8KICAgICAgZHdJbnRlcmxlYXZlICAgPSBHZXREbGdJdGVtSW50KGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlksIE5VTEwsIDApOwogICAgICBiSXNJbnRlcmxlYXZlZCA9IElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBJRENfSU5URVJMRUFWRSk7CiAgICAgIGZvciAobiA9IDA7IG4gPCBTYXZlT3B0cy5uU3RyZWFtczsgbisrKSB7CglpZiAoU2F2ZU9wdHMucHBPcHRpb25zW25dICE9IE5VTEwpIHsKCSAgaWYgKGJJc0ludGVybGVhdmVkKSB7CgkgICAgU2F2ZU9wdHMucHBPcHRpb25zW25dLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9JTlRFUkxFQVZFOwoJICAgIFNhdmVPcHRzLnBwT3B0aW9uc1tuXS0+ZHdJbnRlcmxlYXZlRXZlcnkgPSBkd0ludGVybGVhdmU7CgkgIH0gZWxzZQoJICAgIFNhdmVPcHRzLnBwT3B0aW9uc1tuXS0+ZHdGbGFncyAmPSB+QVZJQ09NUFJFU1NGX0lOVEVSTEVBVkU7Cgl9CiAgICAgIH0KICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICBjYXNlIElEQ0FOQ0VMOgogICAgICBFbmREaWFsb2coaFduZCwgR0VUX1dNX0NPTU1BTkRfSUQod1BhcmFtLCBsUGFyYW0pID09IElET0spOwogICAgICBicmVhazsKICAgIGNhc2UgSURDX0lOVEVSTEVBVkU6CiAgICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlkpLAoJCSAgIElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBJRENfSU5URVJMRUFWRSkpOwogICAgICBicmVhazsKICAgIGNhc2UgSURDX1NUUkVBTToKICAgICAgaWYgKEdFVF9XTV9DT01NQU5EX0NNRCh3UGFyYW0sIGxQYXJhbSkgPT0gQ0JOX1NFTENIQU5HRSkgewoJLyogdXBkYXRlIGNvbnRyb2wgZWxlbWVudHMgKi8KCUFWSVNhdmVPcHRpb25zVXBkYXRlKGhXbmQpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBJRENfT1BUSU9OUzoKICAgICAgQVZJU2F2ZU9wdGlvbnNGbXRDaG9vc2UoaFduZCk7CiAgICAgIGJyZWFrOwogICAgfTsKICAgIHJldHVybiBUUlVFOwogIH07CgogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTYXZlT3B0aW9ucwkJKEFWSUZJTDMyLkApCiAqLwpCT09MIFdJTkFQSSBBVklTYXZlT3B0aW9ucyhIV05EIGhXbmQsIFVJTlQgdUZsYWdzLCBJTlQgblN0cmVhbXMsCgkJCSAgIFBBVklTVFJFQU0gKnBwYXZpLCBMUEFWSUNPTVBSRVNTT1BUSU9OUyAqcHBPcHRpb25zKQp7CiAgTFBBVklDT01QUkVTU09QVElPTlMgcFNhdmVkT3B0aW9ucyA9IE5VTEw7CiAgSU5UIHJldCwgbjsKCiAgVFJBQ0UoIiglcCwweCVYLCVkLCVwLCVwKVxuIiwgaFduZCwgdUZsYWdzLCBuU3RyZWFtcywKCXBwYXZpLCBwcE9wdGlvbnMpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCiAgaWYgKG5TdHJlYW1zIDw9IDAgfHwgcHBhdmkgPT0gTlVMTCB8fCBwcE9wdGlvbnMgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIC8qIHNhdmUgb3B0aW9ucyBmb3IgY2FzZSB1c2VyIHByZXNzIGNhbmNlbCAqLwogIGlmIChwcE9wdGlvbnMgIT0gTlVMTCAmJiBuU3RyZWFtcyA+IDEpIHsKICAgIHBTYXZlZE9wdGlvbnMgPSBHbG9iYWxBbGxvY1B0cihHSE5ELG5TdHJlYW1zICogc2l6ZW9mKEFWSUNPTVBSRVNTT1BUSU9OUykpOwogICAgaWYgKHBTYXZlZE9wdGlvbnMgPT0gTlVMTCkKICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGZvciAobiA9IDA7IG4gPCBuU3RyZWFtczsgbisrKSB7CiAgICAgIGlmIChwcE9wdGlvbnNbbl0gIT0gTlVMTCkKCW1lbWNweShwU2F2ZWRPcHRpb25zICsgbiwgcHBPcHRpb25zW25dLCBzaXplb2YoQVZJQ09NUFJFU1NPUFRJT05TKSk7CiAgICB9CiAgfQoKICBTYXZlT3B0cy51RmxhZ3MgICAgPSB1RmxhZ3M7CiAgU2F2ZU9wdHMublN0cmVhbXMgID0gblN0cmVhbXM7CiAgU2F2ZU9wdHMucHBhdmlzICAgID0gcHBhdmk7CiAgU2F2ZU9wdHMucHBPcHRpb25zID0gcHBPcHRpb25zOwoKICByZXQgPSBEaWFsb2dCb3hXKEFWSUZJTEVfaE1vZHVsZSwgTUFLRUlOVFJFU09VUkNFVyhJRERfU0FWRU9QVElPTlMpLAoJCSAgIGhXbmQsIEFWSVNhdmVPcHRpb25zRGxnUHJvYyk7CgogIGlmIChyZXQgPT0gLTEpCiAgICByZXQgPSBGQUxTRTsKCiAgLyogcmVzdG9yZSBvcHRpb25zIHdoZW4gdXNlciBwcmVzc2VkIGNhbmNlbCAqLwogIGlmIChwU2F2ZWRPcHRpb25zICE9IE5VTEwpIHsKICAgIGlmIChyZXQgPT0gRkFMU0UpIHsKICAgICAgZm9yIChuID0gMDsgbiA8IG5TdHJlYW1zOyBuKyspIHsKCWlmIChwcE9wdGlvbnNbbl0gIT0gTlVMTCkKCSAgbWVtY3B5KHBwT3B0aW9uc1tuXSwgcFNhdmVkT3B0aW9ucyArIG4sIHNpemVvZihBVklDT01QUkVTU09QVElPTlMpKTsKICAgICAgfQogICAgfQogICAgR2xvYmFsRnJlZVB0cihwU2F2ZWRPcHRpb25zKTsKICB9CgogIHJldHVybiAoQk9PTClyZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUwzMi5AKQogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUxFLjEyNCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVPcHRpb25zRnJlZShJTlQgblN0cmVhbXMsTFBBVklDT01QUkVTU09QVElPTlMqcHBPcHRpb25zKQp7CiAgVFJBQ0UoIiglZCwlcClcbiIsIG5TdHJlYW1zLCBwcE9wdGlvbnMpOwoKICBpZiAoblN0cmVhbXMgPCAwIHx8IHBwT3B0aW9ucyA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgZm9yICg7IG5TdHJlYW1zID4gMDsgblN0cmVhbXMtLSkgewogICAgaWYgKHBwT3B0aW9uc1tuU3RyZWFtc10gIT0gTlVMTCkgewogICAgICBwcE9wdGlvbnNbblN0cmVhbXNdLT5kd0ZsYWdzICY9IH5BVklDT01QUkVTU0ZfVkFMSUQ7CgogICAgICBpZiAocHBPcHRpb25zW25TdHJlYW1zXS0+bHBQYXJtcyAhPSBOVUxMKSB7CglHbG9iYWxGcmVlUHRyKHBwT3B0aW9uc1tuU3RyZWFtc10tPmxwUGFybXMpOwoJcHBPcHRpb25zW25TdHJlYW1zXS0+bHBQYXJtcyA9IE5VTEw7CglwcE9wdGlvbnNbblN0cmVhbXNdLT5jYlBhcm1zID0gMDsKICAgICAgfQogICAgICBpZiAocHBPcHRpb25zW25TdHJlYW1zXS0+bHBGb3JtYXQgIT0gTlVMTCkgewoJR2xvYmFsRnJlZVB0cihwcE9wdGlvbnNbblN0cmVhbXNdLT5scEZvcm1hdCk7CglwcE9wdGlvbnNbblN0cmVhbXNdLT5scEZvcm1hdCA9IE5VTEw7CglwcE9wdGlvbnNbblN0cmVhbXNdLT5jYkZvcm1hdCA9IDA7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBBVklFUlJfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZVZBCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVWQShMUENTVFIgc3pGaWxlLCBDTFNJRCAqcGNsc2lkSGFuZGxlciwKCQkJIEFWSVNBVkVDQUxMQkFDSyBscGZuQ2FsbGJhY2ssIGludCBuU3RyZWFtLAoJCQkgUEFWSVNUUkVBTSAqcHBhdmksIExQQVZJQ09NUFJFU1NPUFRJT05TICpwbHBPcHRpb25zKQp7CiAgTFBXU1RSICB3c3pGaWxlID0gTlVMTDsKICBIUkVTVUxUIGhyOwogIGludCAgICAgbGVuOwoKICBUUkFDRSgiJXMsJXAsJXAsJWQsJXAsJXApXG4iLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHBjbHNpZEhhbmRsZXIsCglscGZuQ2FsbGJhY2ssIG5TdHJlYW0sIHBwYXZpLCBwbHBPcHRpb25zKTsKCiAgaWYgKHN6RmlsZSA9PSBOVUxMIHx8IHBwYXZpID09IE5VTEwgfHwgcGxwT3B0aW9ucyA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgLyogY29udmVydCBBU0NJSSBzdHJpbmcgdG8gVW5pY29kZSBhbmQgY2FsbCBVbmljb2RlIGZ1bmN0aW9uICovCiAgbGVuID0gbHN0cmxlbkEoc3pGaWxlKTsKICBpZiAobGVuIDw9IDApCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICB3c3pGaWxlID0gKExQV1NUUilMb2NhbEFsbG9jKExQVFIsIChsZW4gKyAxKSAqIHNpemVvZihXQ0hBUikpOwogIGlmICh3c3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHN6RmlsZSwgLTEsIHdzekZpbGUsIGxlbiArIDEpOwogIHdzekZpbGVbbGVuICsgMV0gPSAwOwoKICBociA9IEFWSVNhdmVWVyh3c3pGaWxlLCBwY2xzaWRIYW5kbGVyLCBscGZuQ2FsbGJhY2ssCgkJIG5TdHJlYW0sIHBwYXZpLCBwbHBPcHRpb25zKTsKCiAgTG9jYWxGcmVlKChITE9DQUwpd3N6RmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGSUxFX0FWSVNhdmVEZWZhdWx0Q2FsbGJhY2sJKGludGVybmFsKQogKi8Kc3RhdGljIEJPT0wgV0lOQVBJIEFWSUZJTEVfQVZJU2F2ZURlZmF1bHRDYWxsYmFjayhJTlQgcHJvZ3Jlc3MpCnsKICBUUkFDRSgiKCVkKVxuIiwgcHJvZ3Jlc3MpOwoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZVZXCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVWVyhMUENXU1RSIHN6RmlsZSwgQ0xTSUQgKnBjbHNpZEhhbmRsZXIsCgkJCSBBVklTQVZFQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrLCBpbnQgblN0cmVhbXMsCgkJCSBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBscE9wdGlvbnMpCnsKICBMT05HICAgICAgICAgICBsU3RhcnRbTUFYX0FWSVNUUkVBTVNdOwogIFBBVklTVFJFQU0gICAgIHBPdXRTdHJlYW1zW01BWF9BVklTVFJFQU1TXTsKICBQQVZJU1RSRUFNICAgICBwSW5TdHJlYW1zW01BWF9BVklTVFJFQU1TXTsKICBBVklGSUxFSU5GT1cgICBmSW5mbzsKICBBVklTVFJFQU1JTkZPVyBzSW5mbzsKCiAgUEFWSUZJTEUgICAgICAgcGZpbGUgPSBOVUxMOyAvKiB0aGUgb3V0cHV0IEFWSSBmaWxlICovCiAgTE9ORyAgICAgICAgICAgbEZpcnN0VmlkZW8gPSAtMTsKICBpbnQgICAgICAgICAgICBjdXJTdHJlYW07CgogIC8qIGZvciBpbnRlcmxlYXZpbmcgLi4uICovCiAgRFdPUkQgICAgICAgICAgZHdJbnRlcmxlYXZlID0gMDsgLyogaW50ZXJsZWF2ZSByYXRlICovCiAgRFdPUkQgICAgICAgICAgZHdGaWxlSW5pdGlhbEZyYW1lczsKICBMT05HICAgICAgICAgICBsRmlsZUxlbmd0aDsKICBMT05HICAgICAgICAgICBsU2FtcGxlSW5jOwoKICAvKiBmb3IgcmVhZGluZy93cml0aW5nIHRoZSBkYXRhIC4uLiAqLwogIExQVk9JRCAgICAgICAgIGxwQnVmZmVyID0gTlVMTDsKICBMT05HICAgICAgICAgICBjYkJ1ZmZlcjsgICAgICAgIC8qIHJlYWwgc2l6ZSBvZiBscEJ1ZmZlciAqLwogIExPTkcgICAgICAgICAgIGxCdWZmZXJTaXplOyAgICAgLyogbmVlZGVkIGJ5dGVzIGZvciBmb3JtYXQocyksIGV0Yy4gKi8KICBMT05HICAgICAgICAgICBsUmVhZEJ5dGVzOwogIExPTkcgICAgICAgICAgIGxSZWFkU2FtcGxlczsKICBIUkVTVUxUICAgICAgICBocmVzOwoKICBUUkFDRSgiKCVzLCVwLCVwLCVkLCVwLCVwKVxuIiwgZGVidWdzdHJfdyhzekZpbGUpLCBwY2xzaWRIYW5kbGVyLAoJbHBmbkNhbGxiYWNrLCBuU3RyZWFtcywgcHBhdmksIHBscE9wdGlvbnMpOwoKICBpZiAoc3pGaWxlID09IE5VTEwgfHwgcHBhdmkgPT0gTlVMTCB8fCBwbHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwogIGlmIChuU3RyZWFtcyA+PSBNQVhfQVZJU1RSRUFNUykgewogICAgV0FSTigiQ2FuJ3Qgd3JpdGUgQVZJIHdpdGggJWQgc3RyZWFtcyBvbmx5IHN1cHBvcnRzICVkIC0tIGNoYW5nZSBNQVhfQVZJU1RSRUFNUyFcbiIsIG5TdHJlYW1zLCBNQVhfQVZJU1RSRUFNUyk7CiAgICByZXR1cm4gQVZJRVJSX0lOVEVSTkFMOwogIH0KCiAgaWYgKGxwZm5DYWxsYmFjayA9PSBOVUxMKQogICAgbHBmbkNhbGxiYWNrID0gQVZJRklMRV9BVklTYXZlRGVmYXVsdENhbGxiYWNrOwoKICAvKiBjbGVhciBsb2NhbCB2YXJpYWJsZShzKSAqLwogIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICBwSW5TdHJlYW1zW2N1clN0cmVhbV0gID0gTlVMTDsKICAgIHBPdXRTdHJlYW1zW2N1clN0cmVhbV0gPSBOVUxMOwogIH0KCiAgLyogb3BlbiBvdXRwdXQgQVZJIGZpbGUgKGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0KSAqLwogIGhyZXMgPSBBVklGaWxlT3BlblcoJnBmaWxlLCBzekZpbGUsIE9GX0NSRUFURXxPRl9TSEFSRV9FWENMVVNJVkV8T0ZfV1JJVEUsCgkJICAgICAgcGNsc2lkSGFuZGxlcik7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwogIEFWSUZpbGVJbmZvVyhwZmlsZSwgJmZJbmZvLCBzaXplb2YoZkluZm8pKTsgLyogZm9yIGR3Q2FwcyAqLwoKICAvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgcGFydCAxICovCiAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgIFBBVklTVFJFQU0gcEN1clN0cmVhbSA9IHBwYXZpW2N1clN0cmVhbV07CgogICAgaHJlcyA9IEFWSVN0cmVhbUluZm9XKHBDdXJTdHJlYW0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgICBpZiAoRkFJTEVEKGhyZXMpKQogICAgICBnb3RvIGVycm9yOwoKICAgIC8qIHNlYXJjaCBmaXJzdCB2aWRlbyBzdHJlYW0gYW5kIGNoZWNrIGZvciBpbnRlcmxlYXZpbmcgKi8KICAgIGlmIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTykgewogICAgICAvKiByZW1lbWJlciBmaXJzdCB2aWRlbyBzdHJlYW0gLS0gbmVlZGVkIGZvciBpbnRlcmxlYXZpbmcgKi8KICAgICAgaWYgKGxGaXJzdFZpZGVvIDwgMCkKCWxGaXJzdFZpZGVvID0gY3VyU3RyZWFtOwogICAgfSBlbHNlIGlmICghZHdJbnRlcmxlYXZlICYmIHBscE9wdGlvbnMgIT0gTlVMTCkgewogICAgICAvKiBjaGVjayBpZiBhbnkgbm9uLXZpZGVvIHN0cmVhbSB3YW50cyB0byBiZSBpbnRlcmxlYXZlZCAqLwogICAgICBXQVJOKCJvcHRpb25zLmZsYWdzPTB4JWxYIG9wdGlvbnMuZHdJbnRlcmxlYXZlPSVsdVxuIixwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3RmxhZ3MscGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0ludGVybGVhdmVFdmVyeSk7CiAgICAgIGlmIChwbHBPcHRpb25zW2N1clN0cmVhbV0gIT0gTlVMTCAmJgoJICBwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfSU5URVJMRUFWRSkKCWR3SW50ZXJsZWF2ZSA9IHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdJbnRlcmxlYXZlRXZlcnk7CiAgICB9CgogICAgLyogY3JlYXRlIGRlLS9jb21wcmVzc2VkIHN0cmVhbSBpbnRlcmZhY2UgaWYgbmVlZGVkICovCiAgICBwSW5TdHJlYW1zW2N1clN0cmVhbV0gPSBOVUxMOwogICAgaWYgKHBscE9wdGlvbnMgIT0gTlVMTCAmJiBwbHBPcHRpb25zW2N1clN0cmVhbV0gIT0gTlVMTCkgewogICAgICBpZiAocGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5mY2NIYW5kbGVyIHx8CgkgIHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+bHBGb3JtYXQgIT0gTlVMTCkgewoJRFdPUkQgZHdLZXlTYXZlID0gcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0tleUZyYW1lRXZlcnk7CgoJaWYgKGZJbmZvLmR3Q2FwcyAmIEFWSUZJTEVDQVBTX0FMTEtFWUZSQU1FUykKCSAgcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0tleUZyYW1lRXZlcnkgPSAxOwoKCWhyZXMgPSBBVklNYWtlQ29tcHJlc3NlZFN0cmVhbSgmcEluU3RyZWFtc1tjdXJTdHJlYW1dLCBwQ3VyU3RyZWFtLAoJCQkJICAgICAgIHBscE9wdGlvbnNbY3VyU3RyZWFtXSwgTlVMTCk7CglwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3S2V5RnJhbWVFdmVyeSA9IGR3S2V5U2F2ZTsKCWlmIChGQUlMRUQoaHJlcykgfHwgcEluU3RyZWFtc1tjdXJTdHJlYW1dID09IE5VTEwpIHsKCSAgcEluU3RyZWFtc1tjdXJTdHJlYW1dID0gTlVMTDsKCSAgZ290byBlcnJvcjsKCX0KCgkvKiB0ZXN0IHN0cmVhbSBpbnRlcmZhY2UgYW5kIHVwZGF0ZSBzdHJlYW0taW5mbyAqLwoJaHJlcyA9IEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKCWlmIChGQUlMRUQoaHJlcykpCgkgIGdvdG8gZXJyb3I7CiAgICAgIH0KICAgIH0KCiAgICAvKiBub3cgaGFuZGxlIHN0cmVhbXMgd2hpY2ggd2lsbCBvbmx5IGJlIGNvcGllZCAqLwogICAgaWYgKHBJblN0cmVhbXNbY3VyU3RyZWFtXSA9PSBOVUxMKSB7CiAgICAgIHBDdXJTdHJlYW0gPSBwSW5TdHJlYW1zW2N1clN0cmVhbV0gPSBwcGF2aVtjdXJTdHJlYW1dOwogICAgICBBVklTdHJlYW1BZGRSZWYocEN1clN0cmVhbSk7CiAgICB9IGVsc2UKICAgICAgcEN1clN0cmVhbSA9IHBJblN0cmVhbXNbY3VyU3RyZWFtXTsKCiAgICBsU3RhcnRbY3VyU3RyZWFtXSA9IHNJbmZvLmR3U3RhcnQ7CiAgfSAvKiBmb3IgYWxsIHN0cmVhbXMgKi8KCiAgLyogY2hlY2sgdGhhdCBmaXJzdCB2aWRlbyBzdHJlYW0gaXMgdGhlIGZpcnN0IHN0cmVhbSAqLwogIGlmIChsRmlyc3RWaWRlbyA+IDApIHsKICAgIFBBVklTVFJFQU0gcFRtcCA9IHBJblN0cmVhbXNbbEZpcnN0VmlkZW9dOwogICAgTE9ORyBsVG1wID0gbFN0YXJ0W2xGaXJzdFZpZGVvXTsKCiAgICBwSW5TdHJlYW1zW2xGaXJzdFZpZGVvXSA9IHBJblN0cmVhbXNbMF07CiAgICBwSW5TdHJlYW1zWzBdID0gcFRtcDsKICAgIGxTdGFydFtsRmlyc3RWaWRlb10gPSBsU3RhcnRbMF07CiAgICBsU3RhcnRbMF0gPSBsVG1wOwogICAgbEZpcnN0VmlkZW8gPSAwOwogIH0KCiAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciBmb3JtYXRzLCBkYXRhLCBldGMuIG9mIGFuIGluaXRpYWxlIHNpemUgb2YgNjQga0J5dGUgKi8KICBscEJ1ZmZlciA9IEdsb2JhbEFsbG9jUHRyKEdQVFIsIGNiQnVmZmVyID0gMHgwMDAxMDAwMCk7CiAgaWYgKGxwQnVmZmVyID09IE5VTEwpIHsKICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwogICAgZ290byBlcnJvcjsKICB9CgogIEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbMF0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgbEZpbGVMZW5ndGggPSBzSW5mby5kd0xlbmd0aDsKICBkd0ZpbGVJbml0aWFsRnJhbWVzID0gMDsKICBpZiAobEZpcnN0VmlkZW8gPj0gMCkgewogICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgZm9ybWF0CiAgICAgKiAgLS0gbmVlZCBhdGxlYXN0IEJJVE1BUElORk9IRUFERVIgb3IgbmV3ZXIKICAgICAqLwogICAgbFNhbXBsZUluYyA9IDE7CiAgICBsQnVmZmVyU2l6ZSA9IGNiQnVmZmVyOwogICAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tsRmlyc3RWaWRlb10sIEFWSVN0cmVhbVN0YXJ0KHBJblN0cmVhbXNbbEZpcnN0VmlkZW9dKSwgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CiAgICBpZiAobEJ1ZmZlclNpemUgPCAoTE9ORylzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCiAgICAgIGhyZXMgPSBBVklFUlJfSU5URVJOQUw7CiAgICBpZiAoRkFJTEVEKGhyZXMpKQogICAgICBnb3RvIGVycm9yOwogIH0gZWxzZSAvKiB1c2Ugb25lIHNlY29uZCBibG9ja3MgZm9yIGludGVybGVhdmluZyBpZiBubyB2aWRlbyBwcmVzZW50ICovCiAgICBsU2FtcGxlSW5jID0gQVZJU3RyZWFtVGltZVRvU2FtcGxlKHBJblN0cmVhbXNbMF0sIDEwMDAwMDApOwoKICAvKiBjcmVhdGUgb3V0cHV0IHN0cmVhbXMgKi8KICBmb3IgKGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IG5TdHJlYW1zOyBjdXJTdHJlYW0rKykgewogICAgQVZJU3RyZWFtSW5mb1cocEluU3RyZWFtc1tjdXJTdHJlYW1dLCAmc0luZm8sIHNpemVvZihzSW5mbykpOwoKICAgIHNJbmZvLmR3SW5pdGlhbEZyYW1lcyA9IDA7CiAgICBpZiAoZHdJbnRlcmxlYXZlICE9IDAgJiYgY3VyU3RyZWFtID4gMCAmJiBzSW5mby5mY2NUeXBlICE9IHN0cmVhbXR5cGVWSURFTykgewogICAgICAvKiA3NTAgbXMgaW5pdGlhbCBmcmFtZXMgZm9yIG5vbi12aWRlbyBzdHJlYW1zICovCiAgICAgIHNJbmZvLmR3SW5pdGlhbEZyYW1lcyA9IEFWSVN0cmVhbVRpbWVUb1NhbXBsZShwSW5TdHJlYW1zWzBdLCA3NTApOwogICAgfQoKICAgIGhyZXMgPSBBVklGaWxlQ3JlYXRlU3RyZWFtVyhwZmlsZSwgJnBPdXRTdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbyk7CiAgICBpZiAocE91dFN0cmVhbXNbY3VyU3RyZWFtXSAhPSBOVUxMICYmIFNVQ0NFRURFRChocmVzKSkgewogICAgICAvKiBjb3B5IGluaXRpYWwgZm9ybWF0IGZvciB0aGlzIHN0cmVhbSAqLwogICAgICBsQnVmZmVyU2l6ZSA9IGNiQnVmZmVyOwogICAgICBocmVzID0gQVZJU3RyZWFtUmVhZEZvcm1hdChwSW5TdHJlYW1zW2N1clN0cmVhbV0sIHNJbmZvLmR3U3RhcnQsCgkJCQkgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CiAgICAgIGlmIChGQUlMRUQoaHJlcykpCglnb3RvIGVycm9yOwogICAgICBocmVzID0gQVZJU3RyZWFtU2V0Rm9ybWF0KHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIDAsIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CiAgICAgIGlmIChGQUlMRUQoaHJlcykpCglnb3RvIGVycm9yOwoKICAgICAgLyogdHJ5IHRvIGNvcHkgc3RyZWFtIGhhbmRsZXIgZGF0YSAqLwogICAgICBsQnVmZmVyU2l6ZSA9IGNiQnVmZmVyOwogICAgICBocmVzID0gQVZJU3RyZWFtUmVhZERhdGEocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBja2lkU1RSRUFNSEFORExFUkRBVEEsCgkJCSAgICAgICBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKICAgICAgaWYgKFNVQ0NFRURFRChocmVzKSAmJiBsQnVmZmVyU2l6ZSA+IDApIHsKCWhyZXMgPSBBVklTdHJlYW1Xcml0ZURhdGEocE91dFN0cmVhbXNbY3VyU3RyZWFtXSxja2lkU1RSRUFNSEFORExFUkRBVEEsCgkJCQkgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CglpZiAoRkFJTEVEKGhyZXMpKQoJICBnb3RvIGVycm9yOwogICAgICB9CgogICAgICBpZiAoZHdGaWxlSW5pdGlhbEZyYW1lcyA8IHNJbmZvLmR3SW5pdGlhbEZyYW1lcykKCWR3RmlsZUluaXRpYWxGcmFtZXMgPSBzSW5mby5kd0luaXRpYWxGcmFtZXM7CiAgICAgIGxSZWFkQnl0ZXMgPQoJQVZJU3RyZWFtU2FtcGxlVG9TYW1wbGUocE91dFN0cmVhbXNbMF0sIHBJblN0cmVhbXNbY3VyU3RyZWFtXSwKCQkJCXNJbmZvLmR3TGVuZ3RoKTsKICAgICAgaWYgKGxGaWxlTGVuZ3RoIDwgbFJlYWRCeXRlcykKCWxGaWxlTGVuZ3RoID0gbFJlYWRCeXRlczsKICAgIH0gZWxzZSB7CiAgICAgIC8qIGNyZWF0aW9uIG9mIGRlLS9jb21wcmVzc2lvbiBzdHJlYW0gaW50ZXJmYWNlIGZhaWxlZCAqLwogICAgICBXQVJOKCJjcmVhdGlvbiBvZiAoZGUtKWNvbXByZXNzaW9uIHN0cmVhbSBmYWlsZWQgZm9yIHN0cmVhbSAlZFxuIixjdXJTdHJlYW0pOwogICAgICBBVklTdHJlYW1SZWxlYXNlKHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7CiAgICAgIGlmIChjdXJTdHJlYW0gKyAxID49IG5TdHJlYW1zKSB7CgkvKiBtb3ZlIHRoZSBvdGhlcnMgb25lIHVwICovCglQQVZJU1RSRUFNICpwcGFzID0gJnBJblN0cmVhbXNbY3VyU3RyZWFtXTsKCWludCAgICAgICAgICAgIG4gPSBuU3RyZWFtcyAtIChjdXJTdHJlYW0gKyAxKTsKCglkbyB7CgkgICpwcGFzID0gcEluU3RyZWFtc1tjdXJTdHJlYW0gKyAxXTsKCX0gd2hpbGUgKC0tbik7CiAgICAgIH0KICAgICAgblN0cmVhbXMtLTsKICAgICAgY3VyU3RyZWFtLS07CiAgICB9CiAgfSAvKiBjcmVhdGUgb3V0cHV0IHN0cmVhbXMgZm9yIGFsbCBpbnB1dCBzdHJlYW1zICovCgogIC8qIGhhdmUgd2Ugc3RpbGwgc29tZXRoaW5nIHRvIHdyaXRlLCBvciBsb3N0IGV2ZXJ5dGhpbmc/ICovCiAgaWYgKG5TdHJlYW1zIDw9IDApCiAgICBnb3RvIGVycm9yOwoKICBpZiAoZHdJbnRlcmxlYXZlKSB7CiAgICBMT05HIGxDdXJGcmFtZSA9IC1kd0ZpbGVJbml0aWFsRnJhbWVzOwoKICAgIC8qIGludGVybGVhdmVkIGZpbGUgKi8KICAgIGlmIChkd0ludGVybGVhdmUgPT0gMSkKICAgICAgQVZJRmlsZUVuZFJlY29yZChwZmlsZSk7CgogICAgZm9yICg7IGxDdXJGcmFtZSA8IGxGaWxlTGVuZ3RoOyBsQ3VyRnJhbWUgKz0gbFNhbXBsZUluYykgewogICAgICBmb3IgKGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IG5TdHJlYW1zOyBjdXJTdHJlYW0rKykgewoJTE9ORyBsTGFzdFNhbXBsZTsKCglocmVzID0gQVZJU3RyZWFtSW5mb1cocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKCWlmIChGQUlMRUQoaHJlcykpCgkgIGdvdG8gZXJyb3I7CgoJLyogaW5pdGlhbCBmcmFtZXMgcGhhc2UgYXQgdGhlIGVuZCBmb3IgdGhpcyBzdHJlYW0/ICovCglpZiAoLShMT05HKXNJbmZvLmR3SW5pdGlhbEZyYW1lcyA+IGxDdXJGcmFtZSkKCSAgY29udGludWU7CgoJaWYgKChsRmlsZUxlbmd0aCAtIGxTYW1wbGVJbmMpIDw9IGxDdXJGcmFtZSkgewoJICBsTGFzdFNhbXBsZSA9IEFWSVN0cmVhbUxlbmd0aChwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwoJICBsRmlyc3RWaWRlbyA9IGxMYXN0U2FtcGxlICsgQVZJU3RyZWFtU3RhcnQocEluU3RyZWFtc1tjdXJTdHJlYW1dKTsKCX0gZWxzZSB7CgkgIGlmIChjdXJTdHJlYW0gIT0gMCkgewoJICAgIGxGaXJzdFZpZGVvID0KCSAgICAgIEFWSVN0cmVhbVNhbXBsZVRvU2FtcGxlKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgcEluU3RyZWFtc1swXSwKCQkJCSAgICAgIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTyA/IAoJCQkJICAgICAgIChMT05HKWR3SW50ZXJsZWF2ZSA6IGxTYW1wbGVJbmMpICsKCQkJCSAgICAgIHNJbmZvLmR3SW5pdGlhbEZyYW1lcyArIGxDdXJGcmFtZSk7CgkgIH0gZWxzZQoJICAgIGxGaXJzdFZpZGVvID0gbFNhbXBsZUluYyArIChzSW5mby5kd0luaXRpYWxGcmFtZXMgKyBsQ3VyRnJhbWUpOwoKCSAgbExhc3RTYW1wbGUgPSBBVklTdHJlYW1FbmQocEluU3RyZWFtc1tjdXJTdHJlYW1dKTsKCSAgaWYgKGxMYXN0U2FtcGxlIDw9IGxGaXJzdFZpZGVvKQoJICAgIGxGaXJzdFZpZGVvID0gbExhc3RTYW1wbGU7Cgl9CgoJLyogY29weSBuZWVkZWQgc2FtcGxlcyBub3cgKi8KCVdBUk4oImNvcHkgZnJvbSBzdHJlYW0gJWQgc2FtcGxlcyAlbGQgdG8gJWxkLi4uXG4iLGN1clN0cmVhbSwKCSAgICAgIGxTdGFydFtjdXJTdHJlYW1dLGxGaXJzdFZpZGVvKTsKCXdoaWxlIChsRmlyc3RWaWRlbyA+IGxTdGFydFtjdXJTdHJlYW1dKSB7CgkgIERXT1JEIGZsYWdzID0gMDsKCgkgIC8qIGNvcHkgZm9ybWF0IGZvciBjYXNlIGl0IGNhbiBjaGFuZ2UgKi8KCSAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKCSAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBsU3RhcnRbY3VyU3RyZWFtXSwKCQkJCSAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCSAgQVZJU3RyZWFtU2V0Rm9ybWF0KHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIGxTdGFydFtjdXJTdHJlYW1dLAoJCQkgICAgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CgoJICAvKiB0cnkgdG8gcmVhZCBkYXRhIHVudGlsIHdlIGdvdCBpdCwgb3IgZXJyb3IgKi8KCSAgZG8gewoJICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgbFN0YXJ0W2N1clN0cmVhbV0sCgkJCQkgbEZpcnN0VmlkZW8gLSBsU3RhcnRbY3VyU3RyZWFtXSwgbHBCdWZmZXIsCgkJCQkgY2JCdWZmZXIsICZsUmVhZEJ5dGVzLCAmbFJlYWRTYW1wbGVzKTsKCSAgfSB3aGlsZSAoKGhyZXMgPT0gQVZJRVJSX0JVRkZFUlRPT1NNQUxMKSAmJgoJCSAgIChscEJ1ZmZlciA9IEdsb2JhbFJlQWxsb2NQdHIobHBCdWZmZXIsIGNiQnVmZmVyICo9IDIsIEdQVFIpKSAhPSBOVUxMKTsKCSAgaWYgKGxwQnVmZmVyID09IE5VTEwpCgkgICAgaHJlcyA9IEFWSUVSUl9NRU1PUlk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCgkgIGlmIChBVklTdHJlYW1Jc0tleUZyYW1lKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgKExPTkcpc0luZm8uZHdTdGFydCkpCgkgICAgZmxhZ3MgPSBBVklJRl9LRVlGUkFNRTsKCSAgaHJlcyA9IEFWSVN0cmVhbVdyaXRlKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIC0xLCBsUmVhZFNhbXBsZXMsCgkJCQlscEJ1ZmZlciwgbFJlYWRCeXRlcywgZmxhZ3MsIE5VTEwsIE5VTEwpOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgoJICBsU3RhcnRbY3VyU3RyZWFtXSArPSBsUmVhZFNhbXBsZXM7Cgl9CglsU3RhcnRbY3VyU3RyZWFtXSA9IGxGaXJzdFZpZGVvOwogICAgICB9IC8qIHN0cmVhbSBieSBzdHJlYW0gKi8KCiAgICAgIC8qIG5lZWQgdG8gY2xvc2UgdGhpcyBibG9jaz8gKi8KICAgICAgaWYgKGR3SW50ZXJsZWF2ZSA9PSAxKSB7CglocmVzID0gQVZJRmlsZUVuZFJlY29yZChwZmlsZSk7CglpZiAoRkFJTEVEKGhyZXMpKQoJICBicmVhazsKICAgICAgfQoKICAgICAgLyogc2hvdyBwcm9ncmVzcyAqLwogICAgICBpZiAobHBmbkNhbGxiYWNrKE11bERpdihkd0ZpbGVJbml0aWFsRnJhbWVzICsgbEN1ckZyYW1lLCAxMDAsCgkJCSAgICAgIGR3RmlsZUluaXRpYWxGcmFtZXMgKyBsRmlsZUxlbmd0aCkpKSB7CglocmVzID0gQVZJRVJSX1VTRVJBQk9SVDsKCWJyZWFrOwogICAgICB9CiAgICB9IC8qIGNvcHkgZnJhbWUgYnkgZnJhbWUgKi8KICB9IGVsc2UgewogICAgLyogbm9uLWludGVybGVhdmVkIGZpbGUgKi8KCiAgICBmb3IgKGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IG5TdHJlYW1zOyBjdXJTdHJlYW0rKykgewogICAgICAvKiBzaG93IHByb2dyZXNzICovCiAgICAgIGlmIChscGZuQ2FsbGJhY2soTXVsRGl2KGN1clN0cmVhbSwgMTAwLCBuU3RyZWFtcykpKSB7CglocmVzID0gQVZJRVJSX1VTRVJBQk9SVDsKCWdvdG8gZXJyb3I7CiAgICAgIH0KCiAgICAgIEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKCiAgICAgIGlmIChzSW5mby5kd1NhbXBsZVNpemUgIT0gMCkgewoJLyogc2FtcGxlLWJhc2VkIGRhdGEgbGlrZSBhdWRpbyAqLwoJd2hpbGUgKHNJbmZvLmR3U3RhcnQgPCBzSW5mby5kd0xlbmd0aCkgewoJICBMT05HIGxTYW1wbGVzID0gY2JCdWZmZXIgLyBzSW5mby5kd1NhbXBsZVNpemU7CgoJICAvKiBjb3B5IGZvcm1hdCBmb3IgY2FzZSBpdCBjYW4gY2hhbmdlICovCgkgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CgkgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJCSAgICAgbHBCdWZmZXIsICZsQnVmZmVyU2l6ZSk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgcmV0dXJuIGhyZXM7CgkgIEFWSVN0cmVhbVNldEZvcm1hdChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkgICAgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CgoJICAvKiBsaW1pdCB0byBzdHJlYW0gYm91bmRhcmllcyAqLwoJICBpZiAobFNhbXBsZXMgIT0gKExPTkcpKHNJbmZvLmR3TGVuZ3RoIC0gc0luZm8uZHdTdGFydCkpCgkgICAgbFNhbXBsZXMgPSBzSW5mby5kd0xlbmd0aCAtIHNJbmZvLmR3U3RhcnQ7CgoJICAvKiBub3cgdHJ5IHRvIHJlYWQgdW50aWwgd2UgZ290IGl0LCBvciBlcnJvciBvY2N1cmVzICovCgkgIGRvIHsKCSAgICBsUmVhZEJ5dGVzICAgPSBjYkJ1ZmZlcjsKCSAgICBsUmVhZFNhbXBsZXMgPSAwOwoJICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkKHBJblN0cmVhbXNbY3VyU3RyZWFtXSxzSW5mby5kd1N0YXJ0LGxTYW1wbGVzLAoJCQkJIGxwQnVmZmVyLGNiQnVmZmVyLCZsUmVhZEJ5dGVzLCZsUmVhZFNhbXBsZXMpOwoJICB9IHdoaWxlICgoaHJlcyA9PSBBVklFUlJfQlVGRkVSVE9PU01BTEwpICYmCgkJICAgKGxwQnVmZmVyID0gR2xvYmFsUmVBbGxvY1B0cihscEJ1ZmZlciwgY2JCdWZmZXIgKj0gMiwgR1BUUikpICE9IE5VTEwpOwoJICBpZiAobHBCdWZmZXIgPT0gTlVMTCkKCSAgICBocmVzID0gQVZJRVJSX01FTU9SWTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoJICBpZiAobFJlYWRTYW1wbGVzICE9IDApIHsKCSAgICBzSW5mby5kd1N0YXJ0ICs9IGxSZWFkU2FtcGxlczsKCSAgICBocmVzID0gQVZJU3RyZWFtV3JpdGUocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgLTEsIGxSZWFkU2FtcGxlcywKCQkJCSAgbHBCdWZmZXIsIGxSZWFkQnl0ZXMsIDAsIE5VTEwgLCBOVUxMKTsKCSAgICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgICAgZ290byBlcnJvcjsKCgkgICAgLyogc2hvdyBwcm9ncmVzcyAqLwoJICAgIGlmIChscGZuQ2FsbGJhY2soTXVsRGl2KHNJbmZvLmR3U3RhcnQsMTAwLG5TdHJlYW1zKnNJbmZvLmR3TGVuZ3RoKSsKCQkJICAgICBNdWxEaXYoY3VyU3RyZWFtLCAxMDAsIG5TdHJlYW1zKSkpIHsKCSAgICAgIGhyZXMgPSBBVklFUlJfVVNFUkFCT1JUOwoJICAgICAgZ290byBlcnJvcjsKCSAgICB9CgkgIH0gZWxzZSB7CgkgICAgaWYgKChzSW5mby5kd0xlbmd0aCAtIHNJbmZvLmR3U3RhcnQpICE9IDEpIHsKCSAgICAgIGhyZXMgPSBBVklFUlJfRklMRVJFQUQ7CgkgICAgICBnb3RvIGVycm9yOwoJICAgIH0KCSAgfQoJfQogICAgICB9IGVsc2UgewoJLyogYmxvY2stYmFzZWQgZGF0YSBsaWtlIHZpZGVvICovCglmb3IgKDsgc0luZm8uZHdTdGFydCA8IHNJbmZvLmR3TGVuZ3RoOyBzSW5mby5kd1N0YXJ0KyspIHsKCSAgRFdPUkQgZmxhZ3MgPSAwOwoKCSAgLyogY29weSBmb3JtYXQgZm9yIGNhc2UgaXQgY2FuIGNoYW5nZSAqLwoJICBsQnVmZmVyU2l6ZSA9IGNiQnVmZmVyOwoJICBocmVzID0gQVZJU3RyZWFtUmVhZEZvcm1hdChwSW5TdHJlYW1zW2N1clN0cmVhbV0sIHNJbmZvLmR3U3RhcnQsCgkJCQkgICAgIGxwQnVmZmVyLCAmbEJ1ZmZlclNpemUpOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgkgIEFWSVN0cmVhbVNldEZvcm1hdChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkgICAgIGxwQnVmZmVyLCBsQnVmZmVyU2l6ZSk7CgoJICAvKiB0cnkgdG8gcmVhZCBibG9jayBhbmQgcmVzaXplIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KCSAgZG8gewoJICAgIGxSZWFkU2FtcGxlcyA9IDA7CgkgICAgbFJlYWRCeXRlcyAgID0gY2JCdWZmZXI7CgkgICAgaHJlcyA9IEFWSVN0cmVhbVJlYWQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LCAxLAoJCQkJIGxwQnVmZmVyLCBjYkJ1ZmZlciwmbFJlYWRCeXRlcywmbFJlYWRTYW1wbGVzKTsKCSAgfSB3aGlsZSAoKGhyZXMgPT0gQVZJRVJSX0JVRkZFUlRPT1NNQUxMKSAmJgoJCSAgIChscEJ1ZmZlciA9IEdsb2JhbFJlQWxsb2NQdHIobHBCdWZmZXIsIGNiQnVmZmVyICo9IDIsIEdQVFIpKSAhPSBOVUxMKTsKCSAgaWYgKGxwQnVmZmVyID09IE5VTEwpCgkgICAgaHJlcyA9IEFWSUVSUl9NRU1PUlk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCSAgaWYgKGxSZWFkU2FtcGxlcyAhPSAxKSB7CgkgICAgaHJlcyA9IEFWSUVSUl9GSUxFUkVBRDsKCSAgICBnb3RvIGVycm9yOwoJICB9CgoJICBpZiAoQVZJU3RyZWFtSXNLZXlGcmFtZShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIChMT05HKXNJbmZvLmR3U3RhcnQpKQoJICAgIGZsYWdzID0gQVZJSUZfS0VZRlJBTUU7CgkgIGhyZXMgPSBBVklTdHJlYW1Xcml0ZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAtMSwgbFJlYWRTYW1wbGVzLAoJCQkJbHBCdWZmZXIsIGxSZWFkQnl0ZXMsIGZsYWdzLCBOVUxMLCBOVUxMKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoKCSAgLyogc2hvdyBwcm9ncmVzcyAqLwoJICBpZiAobHBmbkNhbGxiYWNrKE11bERpdihzSW5mby5kd1N0YXJ0LDEwMCxuU3RyZWFtcypzSW5mby5kd0xlbmd0aCkrCgkJCSAgIE11bERpdihjdXJTdHJlYW0sIDEwMCwgblN0cmVhbXMpKSkgewoJICAgIGhyZXMgPSBBVklFUlJfVVNFUkFCT1JUOwoJICAgIGdvdG8gZXJyb3I7CgkgIH0KCX0gLyogY29weSBhbGwgYmxvY2tzICovCiAgICAgIH0KICAgIH0gLyogY29weSBkYXRhIHN0cmVhbSBieSBzdHJlYW0gKi8KICB9CgogZXJyb3I6CiAgaWYgKGxwQnVmZmVyICE9IE5VTEwpCiAgICBHbG9iYWxGcmVlUHRyKGxwQnVmZmVyKTsKICBpZiAocGZpbGUgIT0gTlVMTCkgewogICAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgICAgaWYgKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0gIT0gTlVMTCkKCUFWSVN0cmVhbVJlbGVhc2UocE91dFN0cmVhbXNbY3VyU3RyZWFtXSk7CiAgICAgIGlmIChwSW5TdHJlYW1zW2N1clN0cmVhbV0gIT0gTlVMTCkKCUFWSVN0cmVhbVJlbGVhc2UocEluU3RyZWFtc1tjdXJTdHJlYW1dKTsKICAgIH0KCiAgICBBVklGaWxlUmVsZWFzZShwZmlsZSk7CiAgfQoKICByZXR1cm4gaHJlczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDcmVhdGVFZGl0YWJsZVN0cmVhbQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIENyZWF0ZUVkaXRhYmxlU3RyZWFtKFBBVklTVFJFQU0gKnBwRWRpdGFibGUsIFBBVklTVFJFQU0gcFNvdXJjZSkKewogIElBVklFZGl0U3RyZWFtICpwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVAkgIGhyOwoKICBGSVhNRSgiKCVwLCVwKSwgc2VtaSBzdHViIVxuIiwgcHBFZGl0YWJsZSwgcFNvdXJjZSk7CgogIGlmIChwcEVkaXRhYmxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAqcHBFZGl0YWJsZSA9IE5VTEw7CgogIGlmIChwU291cmNlICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwU291cmNlLCAmSUlEX0lBVklFZGl0U3RyZWFtLAoJCQkJICAgKExQVk9JRCopJnBFZGl0KTsKICAgIGlmIChGQUlMRUQoaHIpIHx8IHBFZGl0ID09IE5VTEwpIHsKICAgICAgLyogbmVlZCBvd24gaW1wbGVtZW50YXRpb24gb2YgSUFWSUVkaXRTdHJlYW0gKi8KCiAgICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CiAgICB9CiAgfQoKICBociA9IElBVklFZGl0U3RyZWFtX0Nsb25lKHBFZGl0LCBwcEVkaXRhYmxlKTsKICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1DbG9uZQkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtQ2xvbmUoUEFWSVNUUkVBTSBwU3RyZWFtLCBQQVZJU1RSRUFNICpwcFJlc3VsdCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIHBTdHJlYW0sIHBwUmVzdWx0KTsKCiAgaWYgKHBTdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChwcFJlc3VsdCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwUmVzdWx0ID0gTlVMTDsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBTdHJlYW0sICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX0Nsb25lKHBFZGl0LCBwcFJlc3VsdCk7CgogICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1Db3B5CQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1Db3B5KFBBVklTVFJFQU0gcFN0cmVhbSwgTE9ORyAqcGxTdGFydCwKCQkJICAgICAgTE9ORyAqcGxMZW5ndGgsIFBBVklTVFJFQU0gKnBwUmVzdWx0KQp7CiAgUEFWSUVESVRTVFJFQU0gcEVkaXQgPSBOVUxMOwogIEhSRVNVTFQgICAgICAgIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwLCVwKVxuIiwgcFN0cmVhbSwgcGxTdGFydCwgcGxMZW5ndGgsIHBwUmVzdWx0KTsKCiAgaWYgKHBTdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChwbFN0YXJ0ID09IE5VTEwgfHwgcGxMZW5ndGggPT0gTlVMTCB8fCBwcFJlc3VsdCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwUmVzdWx0ID0gTlVMTDsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBTdHJlYW0sICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX0NvcHkocEVkaXQsIHBsU3RhcnQsIHBsTGVuZ3RoLCBwcFJlc3VsdCk7CgogICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1DdXQJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbUN1dChQQVZJU1RSRUFNIHBTdHJlYW0sIExPTkcgKnBsU3RhcnQsCgkJCSAgICAgTE9ORyAqcGxMZW5ndGgsIFBBVklTVFJFQU0gKnBwUmVzdWx0KQp7CiAgUEFWSUVESVRTVFJFQU0gcEVkaXQgPSBOVUxMOwogIEhSRVNVTFQgICAgICAgIGhyOwoKICBUUkFDRSgiKCVwLCVwLCVwLCVwKVxuIiwgcFN0cmVhbSwgcGxTdGFydCwgcGxMZW5ndGgsIHBwUmVzdWx0KTsKCiAgaWYgKHBTdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChwbFN0YXJ0ID09IE5VTEwgfHwgcGxMZW5ndGggPT0gTlVMTCB8fCBwcFJlc3VsdCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwUmVzdWx0ID0gTlVMTDsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBTdHJlYW0sICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX0N1dChwRWRpdCwgcGxTdGFydCwgcGxMZW5ndGgsIHBwUmVzdWx0KTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVBhc3RlCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1QYXN0ZShQQVZJU1RSRUFNIHBEZXN0LCBMT05HICpwbFN0YXJ0LCBMT05HICpwbExlbmd0aCwKCQkJICAgICAgIFBBVklTVFJFQU0gcFNvdXJjZSwgTE9ORyBsU3RhcnQsIExPTkcgbEVuZCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcCwlbGQsJWxkKVxuIiwgcERlc3QsIHBsU3RhcnQsIHBsTGVuZ3RoLAoJcFNvdXJjZSwgbFN0YXJ0LCBsRW5kKTsKCiAgaWYgKHBEZXN0ID09IE5VTEwgfHwgcFNvdXJjZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHBsU3RhcnQgPT0gTlVMTCB8fCBwbExlbmd0aCA9PSBOVUxMIHx8IGxTdGFydCA8IDApCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocERlc3QsICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX1Bhc3RlKHBFZGl0LCBwbFN0YXJ0LCBwbExlbmd0aCwgcFNvdXJjZSwgbFN0YXJ0LCBsRW5kKTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVNldEluZm9BCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbVNldEluZm9BKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPQSBhc2ksCgkJCQkgIExPTkcgc2l6ZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CgogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcHN0cmVhbSwgYXNpLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmICgoRFdPUkQpc2l6ZSA8IHNpemVvZihBVklTVFJFQU1JTkZPQSkpCiAgICByZXR1cm4gQVZJRVJSX0JBRFNJWkU7CgogIG1lbWNweSgmYXNpdywgYXNpLCBzaXplb2YoYXNpKSAtIHNpemVvZihhc2ktPnN6TmFtZSkpOwogIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBhc2ktPnN6TmFtZSwgLTEsCgkJICAgICAgYXNpdy5zek5hbWUsIHNpemVvZihhc2l3LnN6TmFtZSkpOwoKICByZXR1cm4gRWRpdFN0cmVhbVNldEluZm9XKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXRJbmZvVwkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXRJbmZvVyhQQVZJU1RSRUFNIHBzdHJlYW0sIExQQVZJU1RSRUFNSU5GT1cgYXNpLAoJCQkJICBMT05HIHNpemUpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXAsJWxkKVxuIiwgcHN0cmVhbSwgYXNpLCBzaXplKTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBzdHJlYW0sICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX1NldEluZm8ocEVkaXQsIGFzaSwgc2l6ZSk7CgogICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXROYW1lQQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXROYW1lQShQQVZJU1RSRUFNIHBzdHJlYW0sIExQQ1NUUiBzek5hbWUpCnsKICBBVklTVFJFQU1JTkZPQSBhc2lhOwogIEhSRVNVTFQgICAgICAgIGhyZXM7CgogIFRSQUNFKCIoJXAsJXMpXG4iLCBwc3RyZWFtLCBkZWJ1Z3N0cl9hKHN6TmFtZSkpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHN6TmFtZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgaHJlcyA9IEFWSVN0cmVhbUluZm9BKHBzdHJlYW0sICZhc2lhLCBzaXplb2YoYXNpYSkpOwogIGlmIChGQUlMRUQoaHJlcykpCiAgICByZXR1cm4gaHJlczsKCiAgbWVtc2V0KGFzaWEuc3pOYW1lLCAwLCBzaXplb2YoYXNpYS5zek5hbWUpKTsKICBsc3RyY3B5bkEoYXNpYS5zek5hbWUsIHN6TmFtZSwgc2l6ZW9mKGFzaWEuc3pOYW1lKS9zaXplb2YoYXNpYS5zek5hbWVbMF0pKTsKCiAgcmV0dXJuIEVkaXRTdHJlYW1TZXRJbmZvQShwc3RyZWFtLCAmYXNpYSwgc2l6ZW9mKGFzaWEpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtU2V0TmFtZVcJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtU2V0TmFtZVcoUEFWSVNUUkVBTSBwc3RyZWFtLCBMUENXU1RSIHN6TmFtZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgSFJFU1VMVCAgICAgICAgaHJlczsKCiAgVFJBQ0UoIiglcCwlcylcbiIsIHBzdHJlYW0sIGRlYnVnc3RyX3coc3pOYW1lKSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoc3pOYW1lID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICBocmVzID0gSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpOwogIGlmIChGQUlMRUQoaHJlcykpCiAgICByZXR1cm4gaHJlczsKCiAgbWVtc2V0KGFzaXcuc3pOYW1lLCAwLCBzaXplb2YoYXNpdy5zek5hbWUpKTsKICBsc3RyY3B5blcoYXNpdy5zek5hbWUsIHN6TmFtZSwgc2l6ZW9mKGFzaXcuc3pOYW1lKS9zaXplb2YoYXNpdy5zek5hbWVbMF0pKTsKCiAgcmV0dXJuIEVkaXRTdHJlYW1TZXRJbmZvVyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklDbGVhckNsaXBib2FyZAkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUNsZWFyQ2xpcGJvYXJkKHZvaWQpCnsKICBUUkFDRSgiKClcbiIpOwoKICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOyAvKiBPbGVTZXRDbGlwYm9hcmQoTlVMTCk7ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJR2V0RnJvbUNsaXBib2FyZAkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUdldEZyb21DbGlwYm9hcmQoUEFWSUZJTEUgKnBwZmlsZSkKewogIEZJWE1FKCIoJXApLCBzdHViIVxuIiwgcHBmaWxlKTsKCiAgKnBwZmlsZSA9IE5VTEw7CgogIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJUHV0RmlsZU9uQ2xpcGJvYXJkCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJUHV0RmlsZU9uQ2xpcGJvYXJkKFBBVklGSUxFIHBmaWxlKQp7CiAgRklYTUUoIiglcCksIHN0dWIhXG4iLCBwZmlsZSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7Cn0K