LyoKICogQ29weXJpZ2h0IDE5OTkgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAyLTIwMDMgTWljaGFlbCBH/G5uZXdpZwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKCiNpbmNsdWRlICJvbGUyLmgiCiNpbmNsdWRlICJzaGVsbGFwaS5oIgojaW5jbHVkZSAic2hsb2JqLmgiCiNpbmNsdWRlICJ2ZncuaCIKI2luY2x1ZGUgIm1zYWNtLmgiCgojaW5jbHVkZSAiYXZpZmlsZV9wcml2YXRlLmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChhdmlmaWxlKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZm9yIEFWSUJ1aWxkRmlsdGVyVyAtLSB1c2VzIGZpeGVkIHNpemUgdGFibGUKICovCiNkZWZpbmUgTUFYX0ZJTFRFUlMgMzAgLyogMzAgPT4gN2tCICovCgp0eXBlZGVmIHN0cnVjdCBfQVZJRmlsdGVyIHsKICBXQ0hBUiBzekNsc2lkWzQwXTsKICBXQ0hBUiBzekV4dGVuc2lvbnNbTUFYX0ZJTFRFUlMgKiA3XTsKfSBBVklGaWx0ZXI7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZm9yIEFWSVNhdmVPcHRpb25zCiAqLwpzdGF0aWMgc3RydWN0IHsKICBVSU5UICAgICAgICAgICAgICAgICAgdUZsYWdzOwogIElOVCAgICAgICAgICAgICAgICAgICBuU3RyZWFtczsKICBQQVZJU1RSRUFNICAgICAgICAgICAqcHBhdmlzOwogIExQQVZJQ09NUFJFU1NPUFRJT05TICpwcE9wdGlvbnM7CiAgSU5UICAgICAgICAgICAgICAgICAgIG5DdXJyZW50Owp9IFNhdmVPcHRzOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGNvcGllZCBmcm9tIGRsbHMvb2xlMzIvY29tcG9iai5jCiAqLwpzdGF0aWMgSFJFU1VMVCBBVklGSUxFX0NMU0lERnJvbVN0cmluZyhMUENTVFIgaWRzdHIsIExQQ0xTSUQgaWQpCnsKICBCWVRFIGNvbnN0ICpzOwogIEJZVEUgKnA7CiAgSU5UICAgaTsKICBCWVRFIHRhYmxlWzI1Nl07CgogIGlmICghaWRzdHIpIHsKICAgIG1lbXNldChpZCwgMCwgc2l6ZW9mKENMU0lEKSk7CiAgICByZXR1cm4gU19PSzsKICB9CgogIC8qIHZhbGlkYXRlIHRoZSBDTFNJRCBzdHJpbmcgKi8KICBpZiAobHN0cmxlbkEoaWRzdHIpICE9IDM4KQogICAgcmV0dXJuIENPX0VfQ0xBU1NTVFJJTkc7CgogIHMgPSAoQllURSBjb25zdCopaWRzdHI7CiAgaWYgKChzWzBdIT0neycpIHx8IChzWzldIT0nLScpIHx8IChzWzE0XSE9Jy0nKSB8fCAoc1sxOV0hPSctJykgfHwKICAgICAgKHNbMjRdIT0nLScpIHx8IChzWzM3XSE9J30nKSkKICAgIHJldHVybiBDT19FX0NMQVNTU1RSSU5HOwoKICBmb3IgKGkgPSAxOyBpIDwgMzc7IGkrKykgewogICAgaWYgKChpID09IDkpIHx8IChpID09IDE0KSB8fCAoaSA9PSAxOSkgfHwgKGkgPT0gMjQpKQogICAgICBjb250aW51ZTsKICAgIGlmICghKCgoc1tpXSA+PSAnMCcpICYmIChzW2ldIDw9ICc5JykpICB8fAogICAgICAgICgoc1tpXSA+PSAnYScpICYmIChzW2ldIDw9ICdmJykpICB8fAogICAgICAgICgoc1tpXSA+PSAnQScpICYmIChzW2ldIDw9ICdGJykpKQogICAgICAgKQogICAgICByZXR1cm4gQ09fRV9DTEFTU1NUUklORzsKICB9CgogIFRSQUNFKCIlcyAtPiAlcFxuIiwgcywgaWQpOwoKICAvKiBxdWljayBsb29rdXAgdGFibGUgKi8KICBtZW1zZXQodGFibGUsIDAsIDI1Nik7CgogIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQogICAgdGFibGVbJzAnICsgaV0gPSBpOwoKICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICB0YWJsZVsnQScgKyBpXSA9IGkrMTA7CiAgICB0YWJsZVsnYScgKyBpXSA9IGkrMTA7CiAgfQoKICAvKiBpbiBmb3JtIHtYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFh9ICovCiAgcCA9IChCWVRFICopIGlkOwoKICBzKys7CS8qIHNraXAgbGVhZGluZyBicmFjZSAgKi8KICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICBwWzMgLSBpXSA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQogIHAgKz0gNDsKICBzKys7CS8qIHNraXAgLSAqLwoKICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICBwWzEtaV0gPSB0YWJsZVsqc108PDQgfCB0YWJsZVsqKHMrMSldOwogICAgcyArPSAyOwogIH0KICBwICs9IDI7CiAgcysrOwkvKiBza2lwIC0gKi8KCiAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgcFsxLWldID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKICAgIHMgKz0gMjsKICB9CiAgcCArPSAyOwogIHMrKzsJLyogc2tpcCAtICovCgogIC8qIHRoZXNlIGFyZSBqdXN0IHNlcXVlbnRpYWwgYnl0ZXMgKi8KICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAqcCsrID0gdGFibGVbKnNdPDw0IHwgdGFibGVbKihzKzEpXTsKICAgIHMgKz0gMjsKICB9CiAgcysrOwkvKiBza2lwIC0gKi8KCiAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogICAgKnArKyA9IHRhYmxlWypzXTw8NCB8IHRhYmxlWyoocysxKV07CiAgICBzICs9IDI7CiAgfQoKICByZXR1cm4gU19PSzsKfQoKc3RhdGljIEJPT0wgQVZJRklMRV9HZXRGaWxlSGFuZGxlckJ5RXh0ZW5zaW9uKExQQ1dTVFIgc3pGaWxlLCBMUENMU0lEIGxwY2xzaWQpCnsKICBDSEFSICAgc3pSZWdLZXlbMjVdOwogIENIQVIgICBzelZhbHVlWzEwMF07CiAgTFBXU1RSIHN6RXh0ID0gc3RycmNoclcoc3pGaWxlLCAnLicpOwogIExPTkcgICBsZW4gPSBzaXplb2Yoc3pWYWx1ZSkgLyBzaXplb2Yoc3pWYWx1ZVswXSk7CgogIGlmIChzekV4dCA9PSBOVUxMKQogICAgcmV0dXJuIEZBTFNFOwoKICBzekV4dCsrOwoKICB3c3ByaW50ZkEoc3pSZWdLZXksICJBVklGaWxlXFxFeHRlbnNpb25zXFwlLjNscyIsIHN6RXh0KTsKICBpZiAoUmVnUXVlcnlWYWx1ZUEoSEtFWV9DTEFTU0VTX1JPT1QsIHN6UmVnS2V5LCBzelZhbHVlLCAmbGVuKSAhPSBFUlJPUl9TVUNDRVNTKQogICAgcmV0dXJuIEZBTFNFOwoKICByZXR1cm4gKEFWSUZJTEVfQ0xTSURGcm9tU3RyaW5nKHN6VmFsdWUsIGxwY2xzaWQpID09IFNfT0spOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVJbml0CQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVJbml0CQkoQVZJRklMRS4xMDApCiAqLwp2b2lkIFdJTkFQSSBBVklGaWxlSW5pdCh2b2lkKSB7CiAgT2xlSW5pdGlhbGl6ZShOVUxMKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlRXhpdAkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlRXhpdAkJKEFWSUZJTEUuMTAxKQogKi8Kdm9pZCBXSU5BUEkgQVZJRmlsZUV4aXQodm9pZCkgewogIC8qIG5lZWQgdG8gZnJlZSBvbGUzMi5kbGwgaWYgd2UgYXJlIHRoZSBsYXN0IGV4aXQgY2FsbCAqLwogIC8qIE9sZVVuaW5pdGlhbGl6ZSgpICovCiAgRklYTUUoIigpOiBzdHViIVxuIik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZU9wZW4JCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZU9wZW5BCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVPcGVuCQkoQVZJRklMRS4xMDIpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlT3BlbkEoUEFWSUZJTEUgKnBwZmlsZSwgTFBDU1RSIHN6RmlsZSwgVUlOVCB1TW9kZSwKCQkJICAgIExQQ0xTSUQgbHBIYW5kbGVyKQp7CiAgTFBXU1RSICB3c3pGaWxlID0gTlVMTDsKICBIUkVTVUxUIGhyOwogIGludCAgICAgbGVuOwoKICBUUkFDRSgiKCVwLCVzLDB4JTA4WCwlcylcbiIsIHBwZmlsZSwgZGVidWdzdHJfYShzekZpbGUpLCB1TW9kZSwKCWRlYnVnc3RyX2d1aWQobHBIYW5kbGVyKSk7CgogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBpZiAocHBmaWxlID09IE5VTEwgfHwgc3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAvKiBjb252ZXJ0IEFTQ0lJIHN0cmluZyB0byBVbmljb2RlIGFuZCBjYWxsIHVuaWNvZGUgZnVuY3Rpb24gKi8KICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgc3pGaWxlLCAtMSwgTlVMTCwgMCk7CiAgaWYgKGxlbiA8PSAwKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgd3N6RmlsZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpKTsKICBpZiAod3N6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzekZpbGUsIC0xLCB3c3pGaWxlLCBsZW4pOwoKICBociA9IEFWSUZpbGVPcGVuVyhwcGZpbGUsIHdzekZpbGUsIHVNb2RlLCBscEhhbmRsZXIpOwoKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3c3pGaWxlKTsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVPcGVuVwkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlT3BlblcoUEFWSUZJTEUgKnBwZmlsZSwgTFBDV1NUUiBzekZpbGUsIFVJTlQgdU1vZGUsCgkJCSAgICBMUENMU0lEIGxwSGFuZGxlcikKewogIElQZXJzaXN0RmlsZSAqcHBlcnNpc3QgPSBOVUxMOwogIENMU0lEICAgICAgICAgY2xzaWRIYW5kbGVyOwogIEhSRVNVTFQgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXMsMHglWCwlcylcbiIsIHBwZmlsZSwgZGVidWdzdHJfdyhzekZpbGUpLCB1TW9kZSwKCWRlYnVnc3RyX2d1aWQobHBIYW5kbGVyKSk7CgogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBpZiAocHBmaWxlID09IE5VTEwgfHwgc3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAqcHBmaWxlID0gTlVMTDsKCiAgLyogaWYgbm8gaGFuZGxlciB0aGVuIHRyeSBndWVzc2luZyBpdCBieSBleHRlbnNpb24gKi8KICBpZiAobHBIYW5kbGVyID09IE5VTEwpIHsKICAgIGlmICghIEFWSUZJTEVfR2V0RmlsZUhhbmRsZXJCeUV4dGVuc2lvbihzekZpbGUsICZjbHNpZEhhbmRsZXIpKQogICAgICByZXR1cm4gQVZJRVJSX1VOU1VQUE9SVEVEOwogIH0gZWxzZQogICAgbWVtY3B5KCZjbHNpZEhhbmRsZXIsIGxwSGFuZGxlciwgc2l6ZW9mKGNsc2lkSGFuZGxlcikpOwoKICAvKiBjcmVhdGUgaW5zdGFuY2Ugb2YgaGFuZGxlciAqLwogIGhyID0gQ29DcmVhdGVJbnN0YW5jZSgmY2xzaWRIYW5kbGVyLCBOVUxMLCBDTFNDVFhfSU5QUk9DLCAmSUlEX0lBVklGaWxlLCAoTFBWT0lEKilwcGZpbGUpOwogIGlmIChGQUlMRUQoaHIpIHx8ICpwcGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBocjsKCiAgLyogYXNrIGZvciBJUGVyc2lzdEZpbGUgaW50ZXJmYWNlIGZvciBsb2FkaW5nL2NyZWF0aW5nIHRoZSBmaWxlICovCiAgaHIgPSBJQVZJRmlsZV9RdWVyeUludGVyZmFjZSgqcHBmaWxlLCAmSUlEX0lQZXJzaXN0RmlsZSwgKExQVk9JRCopJnBwZXJzaXN0KTsKICBpZiAoRkFJTEVEKGhyKSB8fCBwcGVyc2lzdCA9PSBOVUxMKSB7CiAgICBJQVZJRmlsZV9SZWxlYXNlKCpwcGZpbGUpOwogICAgKnBwZmlsZSA9IE5VTEw7CiAgICByZXR1cm4gaHI7CiAgfQoKICBociA9IElQZXJzaXN0RmlsZV9Mb2FkKHBwZXJzaXN0LCBzekZpbGUsIHVNb2RlKTsKICBJUGVyc2lzdEZpbGVfUmVsZWFzZShwcGVyc2lzdCk7CiAgaWYgKEZBSUxFRChocikpIHsKICAgIElBVklGaWxlX1JlbGVhc2UoKnBwZmlsZSk7CiAgICAqcHBmaWxlID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlQWRkUmVmCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVBZGRSZWYJCShBVklGSUxFLjE0MCkKICovClVMT05HIFdJTkFQSSBBVklGaWxlQWRkUmVmKFBBVklGSUxFIHBmaWxlKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSUZpbGVfQWRkUmVmKHBmaWxlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlUmVsZWFzZQkJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlUmVsZWFzZQkJKEFWSUZJTEUuMTQxKQogKi8KVUxPTkcgV0lOQVBJIEFWSUZpbGVSZWxlYXNlKFBBVklGSUxFIHBmaWxlKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSUZpbGVfUmVsZWFzZShwZmlsZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUluZm8JCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZUluZm9BCQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVJbmZvCQkoQVZJRklMRS4xNDIpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlSW5mb0EoUEFWSUZJTEUgcGZpbGUsIExQQVZJRklMRUlORk9BIGFmaSwgTE9ORyBzaXplKQp7CiAgQVZJRklMRUlORk9XIGFmaXc7CiAgSFJFU1VMVCAgICAgIGhyZXM7CgogIFRSQUNFKCIoJXAsJXAsJWQpXG4iLCBwZmlsZSwgYWZpLCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoKERXT1JEKXNpemUgPCBzaXplb2YoQVZJRklMRUlORk9BKSkKICAgIHJldHVybiBBVklFUlJfQkFEU0laRTsKCiAgaHJlcyA9IElBVklGaWxlX0luZm8ocGZpbGUsICZhZml3LCBzaXplb2YoYWZpdykpOwoKICBtZW1jcHkoYWZpLCAmYWZpdywgc2l6ZW9mKCphZmkpIC0gc2l6ZW9mKGFmaS0+c3pGaWxlVHlwZSkpOwogIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBhZml3LnN6RmlsZVR5cGUsIC0xLCBhZmktPnN6RmlsZVR5cGUsCgkJICAgICAgc2l6ZW9mKGFmaS0+c3pGaWxlVHlwZSksIE5VTEwsIE5VTEwpOwogIGFmaS0+c3pGaWxlVHlwZVtzaXplb2YoYWZpLT5zekZpbGVUeXBlKSAtIDFdID0gMDsKCiAgcmV0dXJuIGhyZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUluZm9XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVJbmZvVyhQQVZJRklMRSBwZmlsZSwgTFBBVklGSUxFSU5GT1cgYWZpdywgTE9ORyBzaXplKQp7CiAgVFJBQ0UoIiglcCwlcCwlZClcbiIsIHBmaWxlLCBhZml3LCBzaXplKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklGaWxlX0luZm8ocGZpbGUsIGFmaXcsIHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVHZXRTdHJlYW0JKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlR2V0U3RyZWFtCShBVklGSUxFLjE0MykKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVHZXRTdHJlYW0oUEFWSUZJTEUgcGZpbGUsIFBBVklTVFJFQU0gKmF2aXMsCgkJCQlEV09SRCBmY2NUeXBlLCBMT05HIGxQYXJhbSkKewogIFRSQUNFKCIoJXAsJXAsJyU0LjRzJywlZClcbiIsIHBmaWxlLCBhdmlzLCAoY2hhciopJmZjY1R5cGUsIGxQYXJhbSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJRmlsZV9HZXRTdHJlYW0ocGZpbGUsIGF2aXMsIGZjY1R5cGUsIGxQYXJhbSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZUNyZWF0ZVN0cmVhbQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVDcmVhdGVTdHJlYW1BCShBVklGSUwzMi5AKQogKiAgICAgICAgICAgICAgQVZJRmlsZUNyZWF0ZVN0cmVhbQkoQVZJRklMRS4xNDQpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlQ3JlYXRlU3RyZWFtQShQQVZJRklMRSBwZmlsZSwgUEFWSVNUUkVBTSAqcHBhdmksCgkJCQkgICAgTFBBVklTVFJFQU1JTkZPQSBwc2kpCnsKICBBVklTVFJFQU1JTkZPVwlwc2l3OwoKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcGZpbGUsIHBwYXZpLCBwc2kpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICAvKiBPbmx5IHRoZSBzek5hbWUgYXQgdGhlIGVuZCBpcyBkaWZmZXJlbnQgKi8KICBtZW1jcHkoJnBzaXcsIHBzaSwgc2l6ZW9mKCpwc2kpIC0gc2l6ZW9mKHBzaS0+c3pOYW1lKSk7CiAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHBzaS0+c3pOYW1lLCAtMSwgcHNpdy5zek5hbWUsCgkJICAgICAgc2l6ZW9mKHBzaXcuc3pOYW1lKSAvIHNpemVvZihwc2l3LnN6TmFtZVswXSkpOwoKICByZXR1cm4gSUFWSUZpbGVfQ3JlYXRlU3RyZWFtKHBmaWxlLCBwcGF2aSwgJnBzaXcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVDcmVhdGVTdHJlYW1XCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZUNyZWF0ZVN0cmVhbVcoUEFWSUZJTEUgcGZpbGUsIFBBVklTVFJFQU0gKmF2aXMsCgkJCQkgICAgTFBBVklTVFJFQU1JTkZPVyBhc2kpCnsKICBUUkFDRSgiKCVwLCVwLCVwKVxuIiwgcGZpbGUsIGF2aXMsIGFzaSk7CgogIGlmIChwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJRmlsZV9DcmVhdGVTdHJlYW0ocGZpbGUsIGF2aXMsIGFzaSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJRmlsZVdyaXRlRGF0YQkoQVZJRklMMzIuQCkKICoJCUFWSUZpbGVXcml0ZURhdGEJKEFWSUZJTEUuMTQ2KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJRmlsZVdyaXRlRGF0YShQQVZJRklMRSBwZmlsZSxEV09SRCBmY2MsTFBWT0lEIGxwLExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlZClcbiIsIHBmaWxlLCAoY2hhciopJmZjYywgbHAsIHNpemUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfV3JpdGVEYXRhKHBmaWxlLCBmY2MsIGxwLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGaWxlUmVhZERhdGEJCShBVklGSUwzMi5AKQogKgkJQVZJRmlsZVJlYWREYXRhCQkoQVZJRklMRS4xNDcpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklGaWxlUmVhZERhdGEoUEFWSUZJTEUgcGZpbGUsRFdPUkQgZmNjLExQVk9JRCBscCxMUExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlcClcbiIsIHBmaWxlLCAoY2hhciopJmZjYywgbHAsIHNpemUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfUmVhZERhdGEocGZpbGUsIGZjYywgbHAsIHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUZpbGVFbmRSZWNvcmQJKEFWSUZJTDMyLkApCiAqCQlBVklGaWxlRW5kUmVjb3JkCShBVklGSUxFLjE0OCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUZpbGVFbmRSZWNvcmQoUEFWSUZJTEUgcGZpbGUpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGZpbGUpOwoKICBpZiAocGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSUZpbGVfRW5kUmVjb3JkKHBmaWxlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1BZGRSZWYJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtQWRkUmVmCQkoQVZJRklMRS4xNjApCiAqLwpVTE9ORyBXSU5BUEkgQVZJU3RyZWFtQWRkUmVmKFBBVklTVFJFQU0gcHN0cmVhbSkKewogIFRSQUNFKCIoJXApXG4iLCBwc3RyZWFtKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkgewogICAgRVJSKCI6IGJhZCBoYW5kbGUgcGFzc2VkIVxuIik7CiAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiBJQVZJU3RyZWFtX0FkZFJlZihwc3RyZWFtKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1SZWxlYXNlCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVsZWFzZQkoQVZJRklMRS4xNjEpCiAqLwpVTE9ORyBXSU5BUEkgQVZJU3RyZWFtUmVsZWFzZShQQVZJU1RSRUFNIHBzdHJlYW0pCnsKICBUUkFDRSgiKCVwKVxuIiwgcHN0cmVhbSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpIHsKICAgIEVSUigiOiBiYWQgaGFuZGxlIHBhc3NlZCFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWxlYXNlKHBzdHJlYW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUNyZWF0ZQkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1DcmVhdGUJCShBVklGSUxFLjEwNCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUNyZWF0ZShQQVZJU1RSRUFNICpwcGF2aSwgTE9ORyBsUGFyYW0xLCBMT05HIGxQYXJhbTIsCgkJCSAgICAgICBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwLDB4JTA4WCwweCUwOFgsJXMpXG4iLCBwcGF2aSwgbFBhcmFtMSwgbFBhcmFtMiwKCWRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBhdmkgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGF2aSA9IE5VTEw7CiAgaWYgKHBjbHNpZEhhbmRsZXIgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CgogIGhyID0gQ29DcmVhdGVJbnN0YW5jZShwY2xzaWRIYW5kbGVyLCBOVUxMLCBDTFNDVFhfSU5QUk9DLCAmSUlEX0lBVklTdHJlYW0sIChMUFZPSUQqKXBwYXZpKTsKICBpZiAoRkFJTEVEKGhyKSB8fCAqcHBhdmkgPT0gTlVMTCkKICAgIHJldHVybiBocjsKCiAgaHIgPSBJQVZJU3RyZWFtX0NyZWF0ZSgqcHBhdmksIGxQYXJhbTEsIGxQYXJhbTIpOwogIGlmIChGQUlMRUQoaHIpKSB7CiAgICBJQVZJU3RyZWFtX1JlbGVhc2UoKnBwYXZpKTsKICAgICpwcGF2aSA9IE5VTEw7CiAgfQoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtSW5mbwkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1JbmZvQQkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1JbmZvCQkoQVZJRklMRS4xNjIpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1JbmZvQShQQVZJU1RSRUFNIHBzdHJlYW0sIExQQVZJU1RSRUFNSU5GT0EgYXNpLAoJCQkgICAgICBMT05HIHNpemUpCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwogIEhSRVNVTFQJIGhyZXM7CgogIFRSQUNFKCIoJXAsJXAsJWQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKChEV09SRClzaXplIDwgc2l6ZW9mKEFWSVNUUkVBTUlORk9BKSkKICAgIHJldHVybiBBVklFUlJfQkFEU0laRTsKCiAgaHJlcyA9IElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKCiAgbWVtY3B5KGFzaSwgJmFzaXcsIHNpemVvZihhc2l3KSAtIHNpemVvZihhc2l3LnN6TmFtZSkpOwogIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBhc2l3LnN6TmFtZSwgLTEsIGFzaS0+c3pOYW1lLAoJCSAgICAgIHNpemVvZihhc2ktPnN6TmFtZSksIE5VTEwsIE5VTEwpOwogIGFzaS0+c3pOYW1lW3NpemVvZihhc2ktPnN6TmFtZSkgLSAxXSA9IDA7CgogIHJldHVybiBocmVzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUluZm9XCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbUluZm9XKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBBVklTVFJFQU1JTkZPVyBhc2ksCgkJCSAgICAgIExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJXAsJWQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX0luZm8ocHN0cmVhbSwgYXNpLCBzaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1GaW5kU2FtcGxlCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtRmluZFNhbXBsZQkoQVZJRklMRS4xNjMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1GaW5kU2FtcGxlKFBBVklTVFJFQU0gcHN0cmVhbSwgTE9ORyBwb3MsIERXT1JEIGZsYWdzKQp7CiAgVFJBQ0UoIiglcCwlZCwweCVYKVxuIiwgcHN0cmVhbSwgcG9zLCBmbGFncyk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgogIHJldHVybiBJQVZJU3RyZWFtX0ZpbmRTYW1wbGUocHN0cmVhbSwgcG9zLCBmbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVhZEZvcm1hdAkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVJlYWRGb3JtYXQJKEFWSUZJTEUuMTY0KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZEZvcm1hdChQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgcG9zLAoJCQkJICAgTFBWT0lEIGZvcm1hdCwgTFBMT05HIGZvcm1hdHNpemUpCnsKICBUUkFDRSgiKCVwLCVkLCVwLCVwKVxuIiwgcHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwoKICBpZiAocHN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CgogIHJldHVybiBJQVZJU3RyZWFtX1JlYWRGb3JtYXQocHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVNldEZvcm1hdAkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbVNldEZvcm1hdAkoQVZJRklMRS4xNjkpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1TZXRGb3JtYXQoUEFWSVNUUkVBTSBwc3RyZWFtLCBMT05HIHBvcywKCQkJCSAgTFBWT0lEIGZvcm1hdCwgTE9ORyBmb3JtYXRzaXplKQp7CiAgVFJBQ0UoIiglcCwlZCwlcCwlZClcbiIsIHBzdHJlYW0sIHBvcywgZm9ybWF0LCBmb3JtYXRzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9TZXRGb3JtYXQocHN0cmVhbSwgcG9zLCBmb3JtYXQsIGZvcm1hdHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVJlYWQJCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtUmVhZAkJKEFWSUZJTEUuMTY3KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtUmVhZChQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgc3RhcnQsIExPTkcgc2FtcGxlcywKCQkJICAgICBMUFZPSUQgYnVmZmVyLCBMT05HIGJ1ZmZlcnNpemUsCgkJCSAgICAgTFBMT05HIGJ5dGVzcmVhZCwgTFBMT05HIHNhbXBsZXNyZWFkKQp7CiAgVFJBQ0UoIiglcCwlZCwlZCwlcCwlZCwlcCwlcClcbiIsIHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsCglidWZmZXJzaXplLCBieXRlc3JlYWQsIHNhbXBsZXNyZWFkKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICByZXR1cm4gSUFWSVN0cmVhbV9SZWFkKHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsIGJ1ZmZlcnNpemUsCgkJCSBieXRlc3JlYWQsIHNhbXBsZXNyZWFkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1Xcml0ZQkJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1Xcml0ZQkJKEFWSUZJTEUuMTY4KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtV3JpdGUoUEFWSVNUUkVBTSBwc3RyZWFtLCBMT05HIHN0YXJ0LCBMT05HIHNhbXBsZXMsCgkJCSAgICAgIExQVk9JRCBidWZmZXIsIExPTkcgYnVmZmVyc2l6ZSwgRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQTE9ORyBzYW1wd3JpdHRlbiwgTFBMT05HIGJ5dGVzd3JpdHRlbikKewogIFRSQUNFKCIoJXAsJWQsJWQsJXAsJWQsMHglWCwlcCwlcClcbiIsIHBzdHJlYW0sIHN0YXJ0LCBzYW1wbGVzLCBidWZmZXIsCglidWZmZXJzaXplLCBmbGFncywgc2FtcHdyaXR0ZW4sIGJ5dGVzd3JpdHRlbik7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklTdHJlYW1fV3JpdGUocHN0cmVhbSwgc3RhcnQsIHNhbXBsZXMsIGJ1ZmZlciwgYnVmZmVyc2l6ZSwKCQkJICBmbGFncywgc2FtcHdyaXR0ZW4sIGJ5dGVzd3JpdHRlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtUmVhZERhdGEJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1SZWFkRGF0YQkoQVZJRklMRS4xNjUpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklTdHJlYW1SZWFkRGF0YShQQVZJU1RSRUFNIHBzdHJlYW0sIERXT1JEIGZjYywgTFBWT0lEIGxwLAoJCQkJIExQTE9ORyBscHJlYWQpCnsKICBUUkFDRSgiKCVwLCclNC40cycsJXAsJXApXG4iLCBwc3RyZWFtLCAoY2hhciopJmZjYywgbHAsIGxwcmVhZCk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklTdHJlYW1fUmVhZERhdGEocHN0cmVhbSwgZmNjLCBscCwgbHByZWFkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1Xcml0ZURhdGEJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1Xcml0ZURhdGEJKEFWSUZJTEUuMTY2KQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtV3JpdGVEYXRhKFBBVklTVFJFQU0gcHN0cmVhbSwgRFdPUkQgZmNjLCBMUFZPSUQgbHAsCgkJCQkgIExPTkcgc2l6ZSkKewogIFRSQUNFKCIoJXAsJyU0LjRzJywlcCwlZClcbiIsIHBzdHJlYW0sIChjaGFyKikmZmNjLCBscCwgc2l6ZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIElBVklTdHJlYW1fV3JpdGVEYXRhKHBzdHJlYW0sIGZjYywgbHAsIHNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUdldEZyYW1lT3BlbgkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUdldEZyYW1lT3BlbgkoQVZJRklMRS4xMTIpCiAqLwpQR0VURlJBTUUgV0lOQVBJIEFWSVN0cmVhbUdldEZyYW1lT3BlbihQQVZJU1RSRUFNIHBzdHJlYW0sCgkJCQkgICAgICAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmlXYW50ZWQpCnsKICBQR0VURlJBTUUgcGcgPSBOVUxMOwoKICBUUkFDRSgiKCVwLCVwKVxuIiwgcHN0cmVhbSwgbHBiaVdhbnRlZCk7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwc3RyZWFtLCAmSUlEX0lHZXRGcmFtZSwgKExQVk9JRCopJnBnKSkgfHwKICAgICAgcGcgPT0gTlVMTCkgewogICAgcGcgPSBBVklGSUxFX0NyZWF0ZUdldEZyYW1lKHBzdHJlYW0pOwogICAgaWYgKHBnID09IE5VTEwpCiAgICAgIHJldHVybiBOVUxMOwogIH0KCiAgaWYgKEZBSUxFRChJR2V0RnJhbWVfU2V0Rm9ybWF0KHBnLCBscGJpV2FudGVkLCBOVUxMLCAwLCAwLCAtMSwgLTEpKSkgewogICAgSUdldEZyYW1lX1JlbGVhc2UocGcpOwogICAgcmV0dXJuIE5VTEw7CiAgfQoKICByZXR1cm4gcGc7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtR2V0RnJhbWUJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1HZXRGcmFtZQkoQVZJRklMRS4xMTApCiAqLwpMUFZPSUQgV0lOQVBJIEFWSVN0cmVhbUdldEZyYW1lKFBHRVRGUkFNRSBwZywgTE9ORyBwb3MpCnsKICBUUkFDRSgiKCVwLCVkKVxuIiwgcGcsIHBvcyk7CgogIGlmIChwZyA9PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CgogIHJldHVybiBJR2V0RnJhbWVfR2V0RnJhbWUocGcsIHBvcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtR2V0RnJhbWVDbG9zZQkoQVZJRklMMzIuQCkKICoJCUFWSVN0cmVhbUdldEZyYW1lQ2xvc2UJKEFWSUZJTEUuMTExKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtR2V0RnJhbWVDbG9zZShQR0VURlJBTUUgcGcpCnsKICBUUkFDRSgiKCVwKVxuIiwgcGcpOwoKICBpZiAocGcgIT0gTlVMTCkKICAgIHJldHVybiBJR2V0RnJhbWVfUmVsZWFzZShwZyk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJTWFrZUNvbXByZXNzZWRTdHJlYW0JKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklNYWtlQ29tcHJlc3NlZFN0cmVhbShQQVZJU1RSRUFNICpwcHNDb21wcmVzc2VkLAoJCQkJICAgICAgIFBBVklTVFJFQU0gcHNTb3VyY2UsCgkJCQkgICAgICAgTFBBVklDT01QUkVTU09QVElPTlMgYWNvLAoJCQkJICAgICAgIExQQ0xTSUQgcGNsc2lkSGFuZGxlcikKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgQ0hBUiAgICAgICAgICAgc3pSZWdLZXlbMjVdOwogIENIQVIgICAgICAgICAgIHN6VmFsdWVbMTAwXTsKICBDTFNJRCAgICAgICAgICBjbHNpZEhhbmRsZXI7CiAgSFJFU1VMVCAgICAgICAgaHI7CiAgTE9ORyAgICAgICAgICAgc2l6ZSA9IHNpemVvZihzelZhbHVlKTsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcylcbiIsIHBwc0NvbXByZXNzZWQsIHBzU291cmNlLCBhY28sCglkZWJ1Z3N0cl9ndWlkKHBjbHNpZEhhbmRsZXIpKTsKCiAgaWYgKHBwc0NvbXByZXNzZWQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CiAgaWYgKHBzU291cmNlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgKnBwc0NvbXByZXNzZWQgPSBOVUxMOwoKICAvKiBpZiBubyBoYW5kbGVyIGdpdmVuIGdldCBkZWZhdWx0IG9uZXMgYmFzZWQgb24gc3RyZWFtdHlwZSAqLwogIGlmIChwY2xzaWRIYW5kbGVyID09IE5VTEwpIHsKICAgIGhyID0gSUFWSVN0cmVhbV9JbmZvKHBzU291cmNlLCAmYXNpdywgc2l6ZW9mKGFzaXcpKTsKICAgIGlmIChGQUlMRUQoaHIpKQogICAgICByZXR1cm4gaHI7CgogICAgd3NwcmludGZBKHN6UmVnS2V5LCAiQVZJRmlsZVxcQ29tcHJlc3NvcnNcXCU0LjRzIiwgKGNoYXIqKSZhc2l3LmZjY1R5cGUpOwogICAgaWYgKFJlZ1F1ZXJ5VmFsdWVBKEhLRVlfQ0xBU1NFU19ST09ULCBzelJlZ0tleSwgc3pWYWx1ZSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7CiAgICBpZiAoQVZJRklMRV9DTFNJREZyb21TdHJpbmcoc3pWYWx1ZSwgJmNsc2lkSGFuZGxlcikgIT0gU19PSykKICAgICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKICB9IGVsc2UKICAgIG1lbWNweSgmY2xzaWRIYW5kbGVyLCBwY2xzaWRIYW5kbGVyLCBzaXplb2YoY2xzaWRIYW5kbGVyKSk7CgogIGhyID0gQ29DcmVhdGVJbnN0YW5jZSgmY2xzaWRIYW5kbGVyLCBOVUxMLCBDTFNDVFhfSU5QUk9DLCAmSUlEX0lBVklTdHJlYW0sIChMUFZPSUQqKXBwc0NvbXByZXNzZWQpOwogIGlmIChGQUlMRUQoaHIpIHx8ICpwcHNDb21wcmVzc2VkID09IE5VTEwpCiAgICByZXR1cm4gaHI7CgogIGhyID0gSUFWSVN0cmVhbV9DcmVhdGUoKnBwc0NvbXByZXNzZWQsIChMUEFSQU0pcHNTb3VyY2UsIChMUEFSQU0pYWNvKTsKICBpZiAoRkFJTEVEKGhyKSkgewogICAgSUFWSVN0cmVhbV9SZWxlYXNlKCpwcHNDb21wcmVzc2VkKTsKICAgICpwcHNDb21wcmVzc2VkID0gTlVMTDsKICB9CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklNYWtlRmlsZUZyb21TdHJlYW1zCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJTWFrZUZpbGVGcm9tU3RyZWFtcyhQQVZJRklMRSAqcHBmaWxlLCBpbnQgblN0cmVhbXMsCgkJCQkgICAgICBQQVZJU1RSRUFNICpwcFN0cmVhbXMpCnsKICBUUkFDRSgiKCVwLCVkLCVwKVxuIiwgcHBmaWxlLCBuU3RyZWFtcywgcHBTdHJlYW1zKTsKCiAgaWYgKG5TdHJlYW1zIDwgMCB8fCBwcGZpbGUgPT0gTlVMTCB8fCBwcFN0cmVhbXMgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGZpbGUgPSBBVklGSUxFX0NyZWF0ZUFWSVRlbXBGaWxlKG5TdHJlYW1zLCBwcFN0cmVhbXMpOwogIGlmICgqcHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgcmV0dXJuIEFWSUVSUl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGUJKEFWSUZJTDMyLkApCiAqCQlBVklTdHJlYW1PcGVuRnJvbUZpbGVBCShBVklGSUwzMi5AKQogKgkJQVZJU3RyZWFtT3BlbkZyb21GaWxlICAgKEFWSUZJTEUuMTAzKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU3RyZWFtT3BlbkZyb21GaWxlQShQQVZJU1RSRUFNICpwcGF2aSwgTFBDU1RSIHN6RmlsZSwKCQkJCSAgICAgIERXT1JEIGZjY1R5cGUsIExPTkcgbFBhcmFtLAoJCQkJICAgICAgVUlOVCBtb2RlLCBMUENMU0lEIHBjbHNpZEhhbmRsZXIpCnsKICBQQVZJRklMRSBwZmlsZSA9IE5VTEw7CiAgSFJFU1VMVCAgaHI7CgogIFRSQUNFKCIoJXAsJXMsJyU0LjRzJywlZCwweCVYLCVzKVxuIiwgcHBhdmksIGRlYnVnc3RyX2Eoc3pGaWxlKSwKCShjaGFyKikmZmNjVHlwZSwgbFBhcmFtLCBtb2RlLCBkZWJ1Z3N0cl9ndWlkKHBjbHNpZEhhbmRsZXIpKTsKCiAgaWYgKHBwYXZpID09IE5VTEwgfHwgc3pGaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAqcHBhdmkgPSBOVUxMOwoKICBociA9IEFWSUZpbGVPcGVuQSgmcGZpbGUsIHN6RmlsZSwgbW9kZSwgcGNsc2lkSGFuZGxlcik7CiAgaWYgKEZBSUxFRChocikgfHwgcGZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBocjsKCiAgaHIgPSBJQVZJRmlsZV9HZXRTdHJlYW0ocGZpbGUsIHBwYXZpLCBmY2NUeXBlLCBsUGFyYW0pOwogIElBVklGaWxlX1JlbGVhc2UocGZpbGUpOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtT3BlbkZyb21GaWxlVwkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVN0cmVhbU9wZW5Gcm9tRmlsZVcoUEFWSVNUUkVBTSAqcHBhdmksIExQQ1dTVFIgc3pGaWxlLAoJCQkJICAgICAgRFdPUkQgZmNjVHlwZSwgTE9ORyBsUGFyYW0sCgkJCQkgICAgICBVSU5UIG1vZGUsIExQQ0xTSUQgcGNsc2lkSGFuZGxlcikKewogIFBBVklGSUxFIHBmaWxlID0gTlVMTDsKICBIUkVTVUxUICBocjsKCiAgVFJBQ0UoIiglcCwlcywnJTQuNHMnLCVkLDB4JVgsJXMpXG4iLCBwcGF2aSwgZGVidWdzdHJfdyhzekZpbGUpLAoJKGNoYXIqKSZmY2NUeXBlLCBsUGFyYW0sIG1vZGUsIGRlYnVnc3RyX2d1aWQocGNsc2lkSGFuZGxlcikpOwoKICBpZiAocHBhdmkgPT0gTlVMTCB8fCBzekZpbGUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcGF2aSA9IE5VTEw7CgogIGhyID0gQVZJRmlsZU9wZW5XKCZwZmlsZSwgc3pGaWxlLCBtb2RlLCBwY2xzaWRIYW5kbGVyKTsKICBpZiAoRkFJTEVEKGhyKSB8fCBwZmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIGhyOwoKICBociA9IElBVklGaWxlX0dldFN0cmVhbShwZmlsZSwgcHBhdmksIGZjY1R5cGUsIGxQYXJhbSk7CiAgSUFWSUZpbGVfUmVsZWFzZShwZmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTdHJlYW1CZWdpblN0cmVhbWluZwkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbUJlZ2luU3RyZWFtaW5nKFBBVklTVFJFQU0gcGF2aSwgTE9ORyBsU3RhcnQsIExPTkcgbEVuZCwgTE9ORyBsUmF0ZSkKewogIElBVklTdHJlYW1pbmcqIHBzdHJlYW0gPSBOVUxMOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJWQsJWQsJWQpXG4iLCBwYXZpLCBsU3RhcnQsIGxFbmQsIGxSYXRlKTsKCiAgaWYgKHBhdmkgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocGF2aSwgJklJRF9JQVZJU3RyZWFtaW5nLCAoTFBWT0lEKikmcHN0cmVhbSk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcHN0cmVhbSAhPSBOVUxMKSB7CiAgICBociA9IElBVklTdHJlYW1pbmdfQmVnaW4ocHN0cmVhbSwgbFN0YXJ0LCBsRW5kLCBsUmF0ZSk7CiAgICBJQVZJU3RyZWFtaW5nX1JlbGVhc2UocHN0cmVhbSk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9PSzsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbUVuZFN0cmVhbWluZwkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbUVuZFN0cmVhbWluZyhQQVZJU1RSRUFNIHBhdmkpCnsKICBJQVZJU3RyZWFtaW5nKiBwc3RyZWFtID0gTlVMTDsKICBIUkVTVUxUIGhyOwoKICBUUkFDRSgiKCVwKVxuIiwgcGF2aSk7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwYXZpLCAmSUlEX0lBVklTdHJlYW1pbmcsIChMUFZPSUQqKSZwc3RyZWFtKTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwc3RyZWFtICE9IE5VTEwpIHsKICAgIElBVklTdHJlYW1pbmdfRW5kKHBzdHJlYW0pOwogICAgSUFWSVN0cmVhbWluZ19SZWxlYXNlKHBzdHJlYW0pOwogIH0KCiByZXR1cm4gQVZJRVJSX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVN0YXJ0CQkoQVZJRklMRS4xMzApCiAqCQlBVklTdHJlYW1TdGFydAkJKEFWSUZJTDMyLkApCiAqLwpMT05HIFdJTkFQSSBBVklTdHJlYW1TdGFydChQQVZJU1RSRUFNIHBzdHJlYW0pCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwoKICBUUkFDRSgiKCVwKVxuIiwgcHN0cmVhbSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gMDsKCiAgaWYgKEZBSUxFRChJQVZJU3RyZWFtX0luZm8ocHN0cmVhbSwgJmFzaXcsIHNpemVvZihhc2l3KSkpKQogICAgcmV0dXJuIDA7CgogIHJldHVybiBhc2l3LmR3U3RhcnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtTGVuZ3RoCQkoQVZJRklMRS4xMzEpCiAqCQlBVklTdHJlYW1MZW5ndGgJCShBVklGSUwzMi5AKQogKi8KTE9ORyBXSU5BUEkgQVZJU3RyZWFtTGVuZ3RoKFBBVklTVFJFQU0gcHN0cmVhbSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CgogIFRSQUNFKCIoJXApXG4iLCBwc3RyZWFtKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiAwOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKSkpCiAgICByZXR1cm4gMDsKCiAgcmV0dXJuIGFzaXcuZHdMZW5ndGg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU3RyZWFtU2FtcGxlVG9UaW1lCShBVklGSUxFLjEzMykKICoJCUFWSVN0cmVhbVNhbXBsZVRvVGltZQkoQVZJRklMMzIuQCkKICovCkxPTkcgV0lOQVBJIEFWSVN0cmVhbVNhbXBsZVRvVGltZShQQVZJU1RSRUFNIHBzdHJlYW0sIExPTkcgbFNhbXBsZSkKewogIEFWSVNUUkVBTUlORk9XIGFzaXc7CiAgTE9ORyB0aW1lOwoKICBUUkFDRSgiKCVwLCVkKVxuIiwgcHN0cmVhbSwgbFNhbXBsZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgogIGlmIChGQUlMRUQoSUFWSVN0cmVhbV9JbmZvKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpKSkKICAgIHJldHVybiAtMTsKICBpZiAoYXNpdy5kd1JhdGUgPT0gMCkKICAgIHJldHVybiAtMTsKCiAgLyogbGltaXQgdG8gc3RyZWFtIGJvdW5kcyAqLwogIGlmIChsU2FtcGxlIDwgYXNpdy5kd1N0YXJ0KQogICAgbFNhbXBsZSA9IGFzaXcuZHdTdGFydDsKICBpZiAobFNhbXBsZSA+IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGgpCiAgICBsU2FtcGxlID0gYXNpdy5kd1N0YXJ0ICsgYXNpdy5kd0xlbmd0aDsKCiAgaWYgKGFzaXcuZHdSYXRlIC8gYXNpdy5kd1NjYWxlIDwgMTAwMCkKICAgIHRpbWUgPSAoTE9ORykoKChmbG9hdClsU2FtcGxlICogYXNpdy5kd1NjYWxlICogMTAwMCkgLyBhc2l3LmR3UmF0ZSk7CiAgZWxzZQogICAgdGltZSA9IChMT05HKSgoKGZsb2F0KWxTYW1wbGUgKiBhc2l3LmR3U2NhbGUgKiAxMDAwICsgKGFzaXcuZHdSYXRlIC0gMSkpIC8gYXNpdy5kd1JhdGUpOwoKICBUUkFDRSgiIC0+ICVkXG4iLHRpbWUpOwogIHJldHVybiB0aW1lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSVN0cmVhbVRpbWVUb1NhbXBsZQkoQVZJRklMRS4xMzIpCiAqCQlBVklTdHJlYW1UaW1lVG9TYW1wbGUJKEFWSUZJTDMyLkApCiAqLwpMT05HIFdJTkFQSSBBVklTdHJlYW1UaW1lVG9TYW1wbGUoUEFWSVNUUkVBTSBwc3RyZWFtLCBMT05HIGxUaW1lKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBVTE9ORyBzYW1wbGU7CgogIFRSQUNFKCIoJXAsJWQpXG4iLCBwc3RyZWFtLCBsVGltZSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwgfHwgbFRpbWUgPCAwKQogICAgcmV0dXJuIC0xOwoKICBpZiAoRkFJTEVEKElBVklTdHJlYW1fSW5mbyhwc3RyZWFtLCAmYXNpdywgc2l6ZW9mKGFzaXcpKSkpCiAgICByZXR1cm4gLTE7CiAgaWYgKGFzaXcuZHdTY2FsZSA9PSAwKQogICAgcmV0dXJuIC0xOwoKICBpZiAoYXNpdy5kd1JhdGUgLyBhc2l3LmR3U2NhbGUgPCAxMDAwKQogICAgc2FtcGxlID0gKExPTkcpKCgoKGZsb2F0KWFzaXcuZHdSYXRlICogbFRpbWUpIC8gKGFzaXcuZHdTY2FsZSAqIDEwMDApKSk7CiAgZWxzZQogICAgc2FtcGxlID0gKExPTkcpKCgoZmxvYXQpYXNpdy5kd1JhdGUgKiBsVGltZSArIChhc2l3LmR3U2NhbGUgKiAxMDAwIC0gMSkpIC8gKGFzaXcuZHdTY2FsZSAqIDEwMDApKTsKCiAgLyogbGltaXQgdG8gc3RyZWFtIGJvdW5kcyAqLwogIGlmIChzYW1wbGUgPCBhc2l3LmR3U3RhcnQpCiAgICBzYW1wbGUgPSBhc2l3LmR3U3RhcnQ7CiAgaWYgKHNhbXBsZSA+IGFzaXcuZHdTdGFydCArIGFzaXcuZHdMZW5ndGgpCiAgICBzYW1wbGUgPSBhc2l3LmR3U3RhcnQgKyBhc2l3LmR3TGVuZ3RoOwoKICBUUkFDRSgiIC0+ICVkXG4iLCBzYW1wbGUpOwogIHJldHVybiBzYW1wbGU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQnVpbGRGaWx0ZXIJCShBVklGSUwzMi5AKQogKgkJQVZJQnVpbGRGaWx0ZXJBCQkoQVZJRklMMzIuQCkKICoJCUFWSUJ1aWxkRmlsdGVyCQkoQVZJRklMRS4xMjMpCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklCdWlsZEZpbHRlckEoTFBTVFIgc3pGaWx0ZXIsIExPTkcgY2JGaWx0ZXIsIEJPT0wgZlNhdmluZykKewogIExQV1NUUiAgd3N6RmlsdGVyOwogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJWQsJWQpXG4iLCBzekZpbHRlciwgY2JGaWx0ZXIsIGZTYXZpbmcpOwoKICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCiAgaWYgKHN6RmlsdGVyID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwogIGlmIChjYkZpbHRlciA8IDIpCiAgICByZXR1cm4gQVZJRVJSX0JBRFNJWkU7CgogIHN6RmlsdGVyWzBdID0gMDsKICBzekZpbHRlclsxXSA9IDA7CgogIHdzekZpbHRlciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBjYkZpbHRlciAqIHNpemVvZihXQ0hBUikpOwogIGlmICh3c3pGaWx0ZXIgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfTUVNT1JZOwoKICBociA9IEFWSUJ1aWxkRmlsdGVyVyh3c3pGaWx0ZXIsIGNiRmlsdGVyLCBmU2F2aW5nKTsKICBpZiAoU1VDQ0VFREVEKGhyKSkgewogICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHdzekZpbHRlciwgY2JGaWx0ZXIsCgkJCXN6RmlsdGVyLCBjYkZpbHRlciwgTlVMTCwgTlVMTCk7CiAgfQoKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3c3pGaWx0ZXIpOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJQnVpbGRGaWx0ZXJXCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSUJ1aWxkRmlsdGVyVyhMUFdTVFIgc3pGaWx0ZXIsIExPTkcgY2JGaWx0ZXIsIEJPT0wgZlNhdmluZykKewogIHN0YXRpYyBjb25zdCBXQ0hBUiBzekNsc2lkW10gPSB7J0MnLCdMJywnUycsJ0knLCdEJywwfTsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pFeHRlbnNpb25GbXRbXSA9IHsnOycsJyonLCcuJywnJScsJ3MnLDB9OwogIHN0YXRpYyBjb25zdCBXQ0hBUiBzekFWSUZpbGVFeHRlbnNpb25zW10gPQogICAgeydBJywnVicsJ0knLCdGJywnaScsJ2wnLCdlJywnXFwnLCdFJywneCcsJ3QnLCdlJywnbicsJ3MnLCdpJywnbycsJ24nLCdzJywwfTsKCiAgQVZJRmlsdGVyICpscDsKICBXQ0hBUiAgICAgIHN6QWxsRmlsZXNbNDBdOwogIFdDSEFSICAgICAgc3pGaWxlRXh0WzEwXTsKICBXQ0hBUiAgICAgIHN6VmFsdWVbMTI4XTsKICBIS0VZICAgICAgIGhLZXk7CiAgRFdPUkQgICAgICBuLCBpOwogIExPTkcgICAgICAgc2l6ZTsKICBEV09SRCAgICAgIGNvdW50ID0gMDsKCiAgVFJBQ0UoIiglcCwlZCwlZClcbiIsIHN6RmlsdGVyLCBjYkZpbHRlciwgZlNhdmluZyk7CgogIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICBpZiAoc3pGaWx0ZXIgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CiAgaWYgKGNiRmlsdGVyIDwgMikKICAgIHJldHVybiBBVklFUlJfQkFEU0laRTsKCiAgbHAgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgTUFYX0ZJTFRFUlMgKiBzaXplb2YoQVZJRmlsdGVyKSk7CiAgaWYgKGxwID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgLyoKICAgKiAxLiBpdGVyYXRlIG92ZXIgSEtFWV9DTEFTU0VTX1JPT1RcXEFWSUZpbGVcXEV4dGVuc2lvbnMgYW5kIGNvbGxlY3QKICAgKiAgICBleHRlbnNpb25zIGFuZCBDTFNJRCdzCiAgICogMi4gaXRlcmF0ZSBvdmVyIGNvbGxlY3RlZCBDTFNJRCdzIGFuZCBjb3B5IGl0cyBkZXNjcmlwdGlvbiBhbmQgaXRzCiAgICogICAgZXh0ZW5zaW9ucyB0byBzekZpbHRlciBpZiBpdCBmaXRzCiAgICoKICAgKiBGaXJzdCBmaWx0ZXIgaXMgbmFtZWQgIkFsbCBtdWx0aW1lZGlhIGZpbGVzIiBhbmQgaXRzIGZpbHRlciBpcyBhCiAgICogY29sbGVjdGlvbiBvZiBhbGwgcG9zc2libGUgZXh0ZW5zaW9ucyBleGNlcHQgIiouKiIuCiAgICovCiAgaWYgKFJlZ09wZW5LZXlXKEhLRVlfQ0xBU1NFU19ST09ULCBzekFWSUZpbGVFeHRlbnNpb25zLCAmaEtleSkgIT0gU19PSykgewogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHApOwogICAgcmV0dXJuIEFWSUVSUl9FUlJPUjsKICB9CiAgZm9yIChuID0gMDtSZWdFbnVtS2V5VyhoS2V5LCBuLCBzekZpbGVFeHQsIHNpemVvZihzekZpbGVFeHQpKSA9PSBTX09LO24rKykgewogICAgLyogZ2V0IENMU0lEIHRvIGV4dGVuc2lvbiAqLwogICAgc2l6ZSA9IHNpemVvZihzelZhbHVlKS9zaXplb2Yoc3pWYWx1ZVswXSk7CiAgICBpZiAoUmVnUXVlcnlWYWx1ZVcoaEtleSwgc3pGaWxlRXh0LCBzelZhbHVlLCAmc2l6ZSkgIT0gU19PSykKICAgICAgYnJlYWs7CgogICAgLyogc2VhcmNoIGlmIHRoZSBDTFNJRCBpcyBhbHJlYWR5IGtub3duICovCiAgICBmb3IgKGkgPSAxOyBpIDw9IGNvdW50OyBpKyspIHsKICAgICAgaWYgKGxzdHJjbXBXKGxwW2ldLnN6Q2xzaWQsIHN6VmFsdWUpID09IDApCglicmVhazsgLyogYSBuZXcgb25lICovCiAgICB9CgogICAgaWYgKGNvdW50IC0gaSA9PSAtMVUpIHsKICAgICAgLyogaXQncyBhIG5ldyBDTFNJRCAqLwoKICAgICAgLyogRklYTUU6IEhvdyBkbyB3ZSBnZXQgaW5mbydzIGFib3V0IHJlYWQvd3JpdGUgY2FwYWJpbGl0aWVzPyAqLwoKICAgICAgaWYgKGNvdW50ID49IE1BWF9GSUxURVJTKSB7CgkvKiB0cnkgdG8gaW5mb3JtIHVzZXIgb2Ygb3VyIGZ1bGwgZml4ZWQgc2l6ZSB0YWJsZSAqLwoJRVJSKCI6IE1vcmUgdGhhbiAlZCBmaWx0ZXJzIGZvdW5kISBBZGp1c3QgTUFYX0ZJTFRFUlMgaW4gZGxscy9hdmlmaWwzMi9hcGkuY1xuIiwgTUFYX0ZJTFRFUlMpOwoJYnJlYWs7CiAgICAgIH0KCiAgICAgIGxzdHJjcHlXKGxwW2ldLnN6Q2xzaWQsIHN6VmFsdWUpOwoKICAgICAgY291bnQrKzsKICAgIH0KCiAgICAvKiBhcHBlbmQgZXh0ZW5zaW9uIHRvIHRoZSBmaWx0ZXIgKi8KICAgIHdzcHJpbnRmVyhzelZhbHVlLCBzekV4dGVuc2lvbkZtdCwgc3pGaWxlRXh0KTsKICAgIGlmIChscFtpXS5zekV4dGVuc2lvbnNbMF0gPT0gMCkKICAgICAgbHN0cmNhdFcobHBbaV0uc3pFeHRlbnNpb25zLCBzelZhbHVlICsgMSk7CiAgICBlbHNlCiAgICAgIGxzdHJjYXRXKGxwW2ldLnN6RXh0ZW5zaW9ucywgc3pWYWx1ZSk7CgogICAgLyogYWxzbyBhcHBlbmQgdG8gdGhlICJhbGwgbXVsdGltZWRpYSItZmlsdGVyICovCiAgICBpZiAobHBbMF0uc3pFeHRlbnNpb25zWzBdID09IDApCiAgICAgIGxzdHJjYXRXKGxwWzBdLnN6RXh0ZW5zaW9ucywgc3pWYWx1ZSArIDEpOwogICAgZWxzZQogICAgICBsc3RyY2F0VyhscFswXS5zekV4dGVuc2lvbnMsIHN6VmFsdWUpOwogIH0KICBSZWdDbG9zZUtleShoS2V5KTsKCiAgLyogMi4gZ2V0IGRlc2NyaXB0aW9ucyBmb3IgdGhlIENMU0lEcyBhbmQgZmlsbCBvdXQgc3pGaWx0ZXIgKi8KICBpZiAoUmVnT3BlbktleVcoSEtFWV9DTEFTU0VTX1JPT1QsIHN6Q2xzaWQsICZoS2V5KSAhPSBTX09LKSB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscCk7CiAgICByZXR1cm4gQVZJRVJSX0VSUk9SOwogIH0KICBmb3IgKG4gPSAwOyBuIDw9IGNvdW50OyBuKyspIHsKICAgIC8qIGZpcnN0IHRoZSBkZXNjcmlwdGlvbiAqLwogICAgaWYgKG4gIT0gMCkgewogICAgICBzaXplID0gc2l6ZW9mKHN6VmFsdWUpL3NpemVvZihzelZhbHVlWzBdKTsKICAgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVXKGhLZXksIGxwW25dLnN6Q2xzaWQsIHN6VmFsdWUsICZzaXplKSA9PSBTX09LKSB7CglzaXplID0gbHN0cmxlblcoc3pWYWx1ZSk7Cglsc3RyY3B5blcoc3pGaWx0ZXIsIHN6VmFsdWUsIGNiRmlsdGVyKTsKICAgICAgfQogICAgfSBlbHNlCiAgICAgIHNpemUgPSBMb2FkU3RyaW5nVyhBVklGSUxFX2hNb2R1bGUsSURTX0FMTE1VTFRJTUVESUEsc3pGaWx0ZXIsY2JGaWx0ZXIpOwoKICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi8KICAgIHNpemUrKzsKICAgIGlmIChjYkZpbHRlciA8IHNpemUgKyBsc3RybGVuVyhscFtuXS5zekV4dGVuc2lvbnMpICsgMikgewogICAgICBzekZpbHRlclswXSA9IDA7CiAgICAgIHN6RmlsdGVyWzFdID0gMDsKICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHApOwogICAgICBSZWdDbG9zZUtleShoS2V5KTsKICAgICAgcmV0dXJuIEFWSUVSUl9CVUZGRVJUT09TTUFMTDsKICAgIH0KICAgIGNiRmlsdGVyIC09IHNpemU7CiAgICBzekZpbHRlciArPSBzaXplOwoKICAgIC8qIGFuZCB0aGVuIHRoZSBmaWx0ZXIgKi8KICAgIGxzdHJjcHluVyhzekZpbHRlciwgbHBbbl0uc3pFeHRlbnNpb25zLCBjYkZpbHRlcik7CiAgICBzaXplID0gbHN0cmxlblcobHBbbl0uc3pFeHRlbnNpb25zKSArIDE7CiAgICBjYkZpbHRlciAtPSBzaXplOwogICAgc3pGaWx0ZXIgKz0gc2l6ZTsKICB9CgogIFJlZ0Nsb3NlS2V5KGhLZXkpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwKTsKCiAgLyogYWRkICJBbGwgZmlsZXMiICIqLioiIGZpbHRlciBpZiBlbm91Z2ggc3BhY2UgbGVmdCAqLwogIHNpemUgPSBMb2FkU3RyaW5nVyhBVklGSUxFX2hNb2R1bGUsIElEU19BTExGSUxFUywKCQkgICAgIHN6QWxsRmlsZXMsIHNpemVvZihzekFsbEZpbGVzKSkgKyAxOwogIGlmIChjYkZpbHRlciA+IHNpemUpIHsKICAgIGludCBpOwoKICAgIC8qIHJlcGxhY2UgJ0AnIHdpdGggXDAwMCB0byBzZXBhcmF0ZSBkZXNjcmlwdGlvbiBvZiBmaWx0ZXIgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBzaXplICYmIHN6QWxsRmlsZXNbaV0gIT0gMDsgaSsrKSB7CiAgICAgIGlmIChzekFsbEZpbGVzW2ldID09ICdAJykgewoJc3pBbGxGaWxlc1tpXSA9IDA7CglicmVhazsKICAgICAgfQogICAgfQogICAgICAKICAgIG1lbWNweShzekZpbHRlciwgc3pBbGxGaWxlcywgc2l6ZSAqIHNpemVvZihzekFsbEZpbGVzWzBdKSk7CiAgICBzekZpbHRlciArPSBzaXplOwogICAgc3pGaWx0ZXJbMF0gPSAwOwoKICAgIHJldHVybiBBVklFUlJfT0s7CiAgfSBlbHNlIHsKICAgIHN6RmlsdGVyWzBdID0gMDsKICAgIHJldHVybiBBVklFUlJfQlVGRkVSVE9PU01BTEw7CiAgfQp9CgpzdGF0aWMgQk9PTCBBVklTYXZlT3B0aW9uc0ZtdENob29zZShIV05EIGhXbmQpCnsKICBMUEFWSUNPTVBSRVNTT1BUSU9OUyBwT3B0aW9ucyA9IFNhdmVPcHRzLnBwT3B0aW9uc1tTYXZlT3B0cy5uQ3VycmVudF07CiAgQVZJU1RSRUFNSU5GT1cgICAgICAgc0luZm87CgogIFRSQUNFKCIoJXApXG4iLCBoV25kKTsKCiAgaWYgKHBPcHRpb25zID09IE5VTEwgfHwgU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSA9PSBOVUxMKSB7CiAgICBFUlIoIjogYmFkIHN0YXRlIVxuIik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoRkFJTEVEKEFWSVN0cmVhbUluZm9XKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sCgkJCSAgICAmc0luZm8sIHNpemVvZihzSW5mbykpKSkgewogICAgRVJSKCI6IEFWSVN0cmVhbUluZm9XIGZhaWxlZCFcbiIpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPKSB7CiAgICBDT01QVkFSUyBjdjsKICAgIEJPT0wgICAgIHJldDsKCiAgICBtZW1zZXQoJmN2LCAwLCBzaXplb2YoY3YpKTsKCiAgICBpZiAoKHBPcHRpb25zLT5kd0ZsYWdzICYgQVZJQ09NUFJFU1NGX1ZBTElEKSA9PSAwKSB7CiAgICAgIG1lbXNldChwT3B0aW9ucywgMCwgc2l6ZW9mKEFWSUNPTVBSRVNTT1BUSU9OUykpOwogICAgICBwT3B0aW9ucy0+ZmNjVHlwZSAgICA9IHN0cmVhbXR5cGVWSURFTzsKICAgICAgcE9wdGlvbnMtPmZjY0hhbmRsZXIgPSBjb21wdHlwZURJQjsKICAgICAgcE9wdGlvbnMtPmR3UXVhbGl0eSAgPSAoRFdPUkQpSUNRVUFMSVRZX0RFRkFVTFQ7CiAgICB9CgogICAgY3YuY2JTaXplICAgICA9IHNpemVvZihjdik7CiAgICBjdi5kd0ZsYWdzICAgID0gSUNNRl9DT01QVkFSU19WQUxJRDsKICAgIC8qY3YuZmNjVHlwZSAgICA9IHBPcHRpb25zLT5mY2NUeXBlOyAqLwogICAgY3YuZmNjSGFuZGxlciA9IHBPcHRpb25zLT5mY2NIYW5kbGVyOwogICAgY3YubFEgICAgICAgICA9IHBPcHRpb25zLT5kd1F1YWxpdHk7CiAgICBjdi5scFN0YXRlICAgID0gcE9wdGlvbnMtPmxwUGFybXM7CiAgICBjdi5jYlN0YXRlICAgID0gcE9wdGlvbnMtPmNiUGFybXM7CiAgICBpZiAocE9wdGlvbnMtPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfS0VZRlJBTUVTKQogICAgICBjdi5sS2V5ID0gcE9wdGlvbnMtPmR3S2V5RnJhbWVFdmVyeTsKICAgIGVsc2UKICAgICAgY3YubEtleSA9IDA7CiAgICBpZiAocE9wdGlvbnMtPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfREFUQVJBVEUpCiAgICAgIGN2LmxEYXRhUmF0ZSA9IHBPcHRpb25zLT5kd0J5dGVzUGVyU2Vjb25kIC8gMTAyNDsgLyogbmVlZCBrQnl0ZXMgKi8KICAgIGVsc2UKICAgICAgY3YubERhdGFSYXRlID0gMDsKCiAgICByZXQgPSBJQ0NvbXByZXNzb3JDaG9vc2UoaFduZCwgU2F2ZU9wdHMudUZsYWdzLCBOVUxMLAoJCQkgICAgIFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sICZjdiwgTlVMTCk7CgogICAgaWYgKHJldCkgewogICAgICBwT3B0aW9ucy0+ZmNjSGFuZGxlciA9IGN2LmZjY0hhbmRsZXI7CiAgICAgIHBPcHRpb25zLT5scFBhcm1zICAgPSBjdi5scFN0YXRlOwogICAgICBwT3B0aW9ucy0+Y2JQYXJtcyAgID0gY3YuY2JTdGF0ZTsKICAgICAgcE9wdGlvbnMtPmR3UXVhbGl0eSA9IGN2LmxROwogICAgICBpZiAoY3YubEtleSAhPSAwKSB7CglwT3B0aW9ucy0+ZHdLZXlGcmFtZUV2ZXJ5ID0gY3YubEtleTsKCXBPcHRpb25zLT5kd0ZsYWdzIHw9IEFWSUNPTVBSRVNTRl9LRVlGUkFNRVM7CiAgICAgIH0gZWxzZQoJcE9wdGlvbnMtPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9LRVlGUkFNRVM7CiAgICAgIGlmIChjdi5sRGF0YVJhdGUgIT0gMCkgewoJcE9wdGlvbnMtPmR3Qnl0ZXNQZXJTZWNvbmQgPSBjdi5sRGF0YVJhdGUgKiAxMDI0OyAvKiBuZWVkIGJ5dGVzICovCglwT3B0aW9ucy0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfREFUQVJBVEU7CiAgICAgIH0gZWxzZQoJcE9wdGlvbnMtPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9EQVRBUkFURTsKICAgICAgcE9wdGlvbnMtPmR3RmxhZ3MgIHw9IEFWSUNPTVBSRVNTRl9WQUxJRDsKICAgIH0KICAgIElDQ29tcHJlc3NvckZyZWUoJmN2KTsKCiAgICByZXR1cm4gcmV0OwogIH0gZWxzZSBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlQVVESU8pIHsKICAgIEFDTUZPUk1BVENIT09TRVcgYWZtdGM7CiAgICBNTVJFU1VMVCAgICAgICAgIHJldDsKICAgIExPTkcgICAgICAgICAgICAgc2l6ZTsKCiAgICAvKiBGSVhNRTogY2hlY2sgQUNNIHZlcnNpb24gLS0gV2hpY2ggdmVyc2lvbiBpcyBuZWVkZWQ/ICovCgogICAgbWVtc2V0KCZhZm10YywgMCwgc2l6ZW9mKGFmbXRjKSk7CiAgICBhZm10Yy5jYlN0cnVjdCAgPSBzaXplb2YoYWZtdGMpOwogICAgYWZtdGMuZmR3U3R5bGUgID0gMDsKICAgIGFmbXRjLmh3bmRPd25lciA9IGhXbmQ7CgogICAgYWNtTWV0cmljcyhOVUxMLCBBQ01fTUVUUklDX01BWF9TSVpFX0ZPUk1BVCwgJnNpemUpOwogICAgaWYgKChwT3B0aW9ucy0+Y2JGb3JtYXQgPT0gMCB8fCBwT3B0aW9ucy0+bHBGb3JtYXQgPT0gTlVMTCkgJiYgc2l6ZSAhPSAwKSB7CiAgICAgIHBPcHRpb25zLT5scEZvcm1hdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplKTsKICAgICAgcE9wdGlvbnMtPmNiRm9ybWF0ID0gc2l6ZTsKICAgIH0gZWxzZSBpZiAocE9wdGlvbnMtPmNiRm9ybWF0IDwgKERXT1JEKXNpemUpIHsKICAgICAgcE9wdGlvbnMtPmxwRm9ybWF0ID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcE9wdGlvbnMtPmxwRm9ybWF0LCBzaXplKTsKICAgICAgcE9wdGlvbnMtPmNiRm9ybWF0ID0gc2l6ZTsKICAgIH0KICAgIGlmIChwT3B0aW9ucy0+bHBGb3JtYXQgPT0gTlVMTCkKICAgICAgcmV0dXJuIEZBTFNFOwogICAgYWZtdGMucHdmeCAgPSBwT3B0aW9ucy0+bHBGb3JtYXQ7CiAgICBhZm10Yy5jYndmeCA9IHBPcHRpb25zLT5jYkZvcm1hdDsKCiAgICBzaXplID0gMDsKICAgIEFWSVN0cmVhbUZvcm1hdFNpemUoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwKCQkJc0luZm8uZHdTdGFydCwgJnNpemUpOwogICAgaWYgKHNpemUgPCAoTE9ORylzaXplb2YoUENNV0FWRUZPUk1BVCkpCiAgICAgIHNpemUgPSBzaXplb2YoUENNV0FWRUZPUk1BVCk7CiAgICBhZm10Yy5wd2Z4RW51bSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplKTsKICAgIGlmIChhZm10Yy5wd2Z4RW51bSAhPSBOVUxMKSB7CiAgICAgIEFWSVN0cmVhbVJlYWRGb3JtYXQoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSwKCQkJICBzSW5mby5kd1N0YXJ0LCBhZm10Yy5wd2Z4RW51bSwgJnNpemUpOwogICAgICBhZm10Yy5mZHdFbnVtID0gQUNNX0ZPUk1BVEVOVU1GX0NPTlZFUlQ7CiAgICB9CgogICAgcmV0ID0gYWNtRm9ybWF0Q2hvb3NlVygmYWZtdGMpOwogICAgaWYgKHJldCA9PSBTX09LKQogICAgICBwT3B0aW9ucy0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfVkFMSUQ7CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYWZtdGMucHdmeEVudW0pOwogICAgcmV0dXJuIChyZXQgPT0gU19PSyA/IFRSVUUgOiBGQUxTRSk7CiAgfSBlbHNlIHsKICAgIEVSUigiOiB1bmtub3duIHN0cmVhbXR5cGUgMHglMDhYXG4iLCBzSW5mby5mY2NUeXBlKTsKICAgIHJldHVybiBGQUxTRTsKICB9Cn0KCnN0YXRpYyB2b2lkIEFWSVNhdmVPcHRpb25zVXBkYXRlKEhXTkQgaFduZCkKewogIHN0YXRpYyBjb25zdCBXQ0hBUiBzelZpZGVvRm10W109eyclJywnbCcsJ2QnLCd4JywnJScsJ2wnLCdkJywneCcsJyUnLCdkJywwfTsKICBzdGF0aWMgY29uc3QgV0NIQVIgc3pBdWRpb0ZtdFtdPXsnJScsJ3MnLCcgJywnJScsJ3MnLDB9OwoKICBXQ0hBUiAgICAgICAgICBzekZvcm1hdFsxMjhdOwogIEFWSVNUUkVBTUlORk9XIHNJbmZvOwogIExQVk9JRCAgICAgICAgIGxwRm9ybWF0OwogIExPTkcgICAgICAgICAgIHNpemU7CgogIFRSQUNFKCIoJXApXG4iLCBoV25kKTsKCiAgU2F2ZU9wdHMubkN1cnJlbnQgPSBTZW5kRGxnSXRlbU1lc3NhZ2VXKGhXbmQsSURDX1NUUkVBTSxDQl9HRVRDVVJTRUwsMCwwKTsKICBpZiAoU2F2ZU9wdHMubkN1cnJlbnQgPCAwKQogICAgcmV0dXJuOwoKICBpZiAoRkFJTEVEKEFWSVN0cmVhbUluZm9XKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSkpKQogICAgcmV0dXJuOwoKICBBVklTdHJlYW1Gb3JtYXRTaXplKFNhdmVPcHRzLnBwYXZpc1tTYXZlT3B0cy5uQ3VycmVudF0sc0luZm8uZHdTdGFydCwmc2l6ZSk7CiAgaWYgKHNpemUgPiAwKSB7CiAgICBzekZvcm1hdFswXSA9IDA7CgogICAgLyogcmVhZCBmb3JtYXQgdG8gYnVpbGQgZm9ybWF0IGRlc2NyaXB0aW9uIHN0cmluZyAqLwogICAgbHBGb3JtYXQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSk7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkgewogICAgICBpZiAoU1VDQ0VFREVEKEFWSVN0cmVhbVJlYWRGb3JtYXQoU2F2ZU9wdHMucHBhdmlzW1NhdmVPcHRzLm5DdXJyZW50XSxzSW5mby5kd1N0YXJ0LGxwRm9ybWF0LCAmc2l6ZSkpKSB7CglpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8pIHsKCSAgTFBCSVRNQVBJTkZPSEVBREVSIGxwYmkgPSBscEZvcm1hdDsKCSAgSUNJTkZPIGljaW5mbzsKCgkgIHdzcHJpbnRmVyhzekZvcm1hdCwgc3pWaWRlb0ZtdCwgbHBiaS0+YmlXaWR0aCwKCQkgICAgbHBiaS0+YmlIZWlnaHQsIGxwYmktPmJpQml0Q291bnQpOwoKCSAgaWYgKGxwYmktPmJpQ29tcHJlc3Npb24gIT0gQklfUkdCKSB7CgkgICAgSElDICAgIGhpYzsKCgkgICAgaGljID0gSUNMb2NhdGUoSUNUWVBFX1ZJREVPLCBzSW5mby5mY2NIYW5kbGVyLCBscEZvcm1hdCwKCQkJICAgTlVMTCwgSUNNT0RFX0RFQ09NUFJFU1MpOwoJICAgIGlmIChoaWMgIT0gTlVMTCkgewoJICAgICAgaWYgKElDR2V0SW5mbyhoaWMsICZpY2luZm8sIHNpemVvZihpY2luZm8pKSA9PSBTX09LKQoJCWxzdHJjYXRXKHN6Rm9ybWF0LCBpY2luZm8uc3pEZXNjcmlwdGlvbik7CgkgICAgICBJQ0Nsb3NlKGhpYyk7CgkgICAgfQoJICB9IGVsc2UgewoJICAgIExvYWRTdHJpbmdXKEFWSUZJTEVfaE1vZHVsZSwgSURTX1VOQ09NUFJFU1NFRCwKCQkJaWNpbmZvLnN6RGVzY3JpcHRpb24sIHNpemVvZihpY2luZm8uc3pEZXNjcmlwdGlvbikpOwoJICAgIGxzdHJjYXRXKHN6Rm9ybWF0LCBpY2luZm8uc3pEZXNjcmlwdGlvbik7CgkgIH0KCX0gZWxzZSBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlQVVESU8pIHsKCSAgQUNNRk9STUFUVEFHREVUQUlMU1cgYWZ0ZDsKCSAgQUNNRk9STUFUREVUQUlMU1cgICAgYWZkOwoKCSAgbWVtc2V0KCZhZnRkLCAwLCBzaXplb2YoYWZ0ZCkpOwoJICBtZW1zZXQoJmFmZCwgMCwgc2l6ZW9mKGFmZCkpOwoKCSAgYWZ0ZC5jYlN0cnVjdCAgICAgPSBzaXplb2YoYWZ0ZCk7CgkgIGFmdGQuZHdGb3JtYXRUYWcgID0gYWZkLmR3Rm9ybWF0VGFnID0KCSAgICAoKFBXQVZFRk9STUFURVgpbHBGb3JtYXQpLT53Rm9ybWF0VGFnOwoJICBhZnRkLmNiRm9ybWF0U2l6ZSA9IGFmZC5jYndmeCA9IHNpemU7CgoJICBhZmQuY2JTdHJ1Y3QgICAgICA9IHNpemVvZihhZmQpOwoJICBhZmQucHdmeCAgICAgICAgICA9IGxwRm9ybWF0OwoKCSAgaWYgKGFjbUZvcm1hdFRhZ0RldGFpbHNXKE5VTEwsICZhZnRkLAoJCQkJICAgQUNNX0ZPUk1BVFRBR0RFVEFJTFNGX0ZPUk1BVFRBRykgPT0gU19PSykgewoJICAgIGlmIChhY21Gb3JtYXREZXRhaWxzVyhOVUxMLCZhZmQsQUNNX0ZPUk1BVERFVEFJTFNGX0ZPUk1BVCkgPT0gU19PSykKCSAgICAgIHdzcHJpbnRmVyhzekZvcm1hdCwgc3pBdWRpb0ZtdCwgYWZkLnN6Rm9ybWF0LCBhZnRkLnN6Rm9ybWF0VGFnKTsKCSAgfQoJfQogICAgICB9CiAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwRm9ybWF0KTsKICAgIH0KCiAgICAvKiBzZXQgdGV4dCBmb3IgZm9ybWF0IGRlc2NyaXB0aW9uICovCiAgICBTZXREbGdJdGVtVGV4dFcoaFduZCwgSURDX0ZPUk1BVFRFWFQsIHN6Rm9ybWF0KTsKCiAgICAvKiBEaXNhYmxlIG9wdGlvbiBidXR0b24gZm9yIHVuc3VwcG9ydGVkIHN0cmVhbXR5cGVzICovCiAgICBpZiAoc0luZm8uZmNjVHlwZSA9PSBzdHJlYW10eXBlVklERU8gfHwKCXNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZUFVRElPKQogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfT1BUSU9OUyksIFRSVUUpOwogICAgZWxzZQogICAgICBFbmFibGVXaW5kb3coR2V0RGxnSXRlbShoV25kLCBJRENfT1BUSU9OUyksIEZBTFNFKTsKICB9Cgp9CgpzdGF0aWMgSU5UX1BUUiBDQUxMQkFDSyBBVklTYXZlT3B0aW9uc0RsZ1Byb2MoSFdORCBoV25kLCBVSU5UIHVNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQp7CiAgRFdPUkQgZHdJbnRlcmxlYXZlOwogIEJPT0wgIGJJc0ludGVybGVhdmVkOwogIElOVCAgIG47CgogIC8qVFJBQ0UoIiglcCwldSwweCUwNFgsMHglMDhsWClcbiIsIGhXbmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsqLwoKICBzd2l0Y2ggKHVNc2cpIHsKICBjYXNlIFdNX0lOSVRESUFMT0c6CiAgICBTYXZlT3B0cy5uQ3VycmVudCA9IDA7CiAgICBpZiAoU2F2ZU9wdHMublN0cmVhbXMgPT0gMSkgewogICAgICBFbmREaWFsb2coaFduZCwgQVZJU2F2ZU9wdGlvbnNGbXRDaG9vc2UoaFduZCkpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICAvKiBhZGQgc3RyZWFtcyAqLwogICAgZm9yIChuID0gMDsgbiA8IFNhdmVPcHRzLm5TdHJlYW1zOyBuKyspIHsKICAgICAgQVZJU1RSRUFNSU5GT1cgc0luZm87CgogICAgICBBVklTdHJlYW1JbmZvVyhTYXZlT3B0cy5wcGF2aXNbbl0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgICAgIFNlbmREbGdJdGVtTWVzc2FnZVcoaFduZCwgSURDX1NUUkVBTSwgQ0JfQUREU1RSSU5HLAoJCQkgIDBMLCAoTFBBUkFNKXNJbmZvLnN6TmFtZSk7CiAgICB9CgogICAgLyogc2VsZWN0IGZpcnN0IHN0cmVhbSAqLwogICAgU2VuZERsZ0l0ZW1NZXNzYWdlVyhoV25kLCBJRENfU1RSRUFNLCBDQl9TRVRDVVJTRUwsIDAsIDApOwogICAgU2VuZE1lc3NhZ2VXKGhXbmQsIFdNX0NPTU1BTkQsIE1BS0VMT05HKElEQ19TVFJFQU0sIENCTl9TRUxDSEFOR0UpLCAoTFBBUkFNKWhXbmQpOwoKICAgIC8qIGluaXRpYWxpemUgaW50ZXJsZWF2ZSAqLwogICAgaWYgKFNhdmVPcHRzLnBwT3B0aW9uc1swXSAhPSBOVUxMICYmCgkoU2F2ZU9wdHMucHBPcHRpb25zWzBdLT5kd0ZsYWdzICYgQVZJQ09NUFJFU1NGX1ZBTElEKSkgewogICAgICBiSXNJbnRlcmxlYXZlZCA9IChTYXZlT3B0cy5wcE9wdGlvbnNbMF0tPmR3RmxhZ3MgJiBBVklDT01QUkVTU0ZfSU5URVJMRUFWRSk7CiAgICAgIGR3SW50ZXJsZWF2ZSA9IFNhdmVPcHRzLnBwT3B0aW9uc1swXS0+ZHdJbnRlcmxlYXZlRXZlcnk7CiAgICB9IGVsc2UgewogICAgICBiSXNJbnRlcmxlYXZlZCA9IFRSVUU7CiAgICAgIGR3SW50ZXJsZWF2ZSAgID0gMDsKICAgIH0KICAgIENoZWNrRGxnQnV0dG9uKGhXbmQsIElEQ19JTlRFUkxFQVZFLCBiSXNJbnRlcmxlYXZlZCk7CiAgICBTZXREbGdJdGVtSW50KGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlksIGR3SW50ZXJsZWF2ZSwgRkFMU0UpOwogICAgRW5hYmxlV2luZG93KEdldERsZ0l0ZW0oaFduZCwgSURDX0lOVEVSTEVBVkVFVkVSWSksIGJJc0ludGVybGVhdmVkKTsKICAgIGJyZWFrOwogIGNhc2UgV01fQ09NTUFORDoKICAgIHN3aXRjaCAoTE9XT1JEKHdQYXJhbSkpIHsKICAgIGNhc2UgSURPSzoKICAgICAgLyogZ2V0IGRhdGEgZnJvbSBjb250cm9scyBhbmQgc2F2ZSB0aGVtICovCiAgICAgIGR3SW50ZXJsZWF2ZSAgID0gR2V0RGxnSXRlbUludChoV25kLCBJRENfSU5URVJMRUFWRUVWRVJZLCBOVUxMLCAwKTsKICAgICAgYklzSW50ZXJsZWF2ZWQgPSBJc0RsZ0J1dHRvbkNoZWNrZWQoaFduZCwgSURDX0lOVEVSTEVBVkUpOwogICAgICBmb3IgKG4gPSAwOyBuIDwgU2F2ZU9wdHMublN0cmVhbXM7IG4rKykgewoJaWYgKFNhdmVPcHRzLnBwT3B0aW9uc1tuXSAhPSBOVUxMKSB7CgkgIGlmIChiSXNJbnRlcmxlYXZlZCkgewoJICAgIFNhdmVPcHRzLnBwT3B0aW9uc1tuXS0+ZHdGbGFncyB8PSBBVklDT01QUkVTU0ZfSU5URVJMRUFWRTsKCSAgICBTYXZlT3B0cy5wcE9wdGlvbnNbbl0tPmR3SW50ZXJsZWF2ZUV2ZXJ5ID0gZHdJbnRlcmxlYXZlOwoJICB9IGVsc2UKCSAgICBTYXZlT3B0cy5wcE9wdGlvbnNbbl0tPmR3RmxhZ3MgJj0gfkFWSUNPTVBSRVNTRl9JTlRFUkxFQVZFOwoJfQogICAgICB9CiAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgY2FzZSBJRENBTkNFTDoKICAgICAgRW5kRGlhbG9nKGhXbmQsIExPV09SRCh3UGFyYW0pID09IElET0spOwogICAgICBicmVhazsKICAgIGNhc2UgSURDX0lOVEVSTEVBVkU6CiAgICAgIEVuYWJsZVdpbmRvdyhHZXREbGdJdGVtKGhXbmQsIElEQ19JTlRFUkxFQVZFRVZFUlkpLAoJCSAgIElzRGxnQnV0dG9uQ2hlY2tlZChoV25kLCBJRENfSU5URVJMRUFWRSkpOwogICAgICBicmVhazsKICAgIGNhc2UgSURDX1NUUkVBTToKICAgICAgaWYgKEhJV09SRCh3UGFyYW0pID09IENCTl9TRUxDSEFOR0UpIHsKCS8qIHVwZGF0ZSBjb250cm9sIGVsZW1lbnRzICovCglBVklTYXZlT3B0aW9uc1VwZGF0ZShoV25kKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgSURDX09QVElPTlM6CiAgICAgIEFWSVNhdmVPcHRpb25zRm10Q2hvb3NlKGhXbmQpOwogICAgICBicmVhazsKICAgIH07CiAgICByZXR1cm4gVFJVRTsKICB9OwoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnMJCShBVklGSUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgQVZJU2F2ZU9wdGlvbnMoSFdORCBoV25kLCBVSU5UIHVGbGFncywgSU5UIG5TdHJlYW1zLAoJCQkgICBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBwT3B0aW9ucykKewogIExQQVZJQ09NUFJFU1NPUFRJT05TIHBTYXZlZE9wdGlvbnMgPSBOVUxMOwogIElOVCByZXQsIG47CgogIFRSQUNFKCIoJXAsMHglWCwlZCwlcCwlcClcbiIsIGhXbmQsIHVGbGFncywgblN0cmVhbXMsCglwcGF2aSwgcHBPcHRpb25zKTsKCiAgLyogY2hlY2sgcGFyYW1ldGVycyAqLwogIGlmIChuU3RyZWFtcyA8PSAwIHx8IHBwYXZpID09IE5VTEwgfHwgcHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAvKiBzYXZlIG9wdGlvbnMgaW4gY2FzZSB0aGUgdXNlciBwcmVzc2VzIGNhbmNlbCAqLwogIGlmIChwcE9wdGlvbnMgIT0gTlVMTCAmJiBuU3RyZWFtcyA+IDEpIHsKICAgIHBTYXZlZE9wdGlvbnMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgblN0cmVhbXMgKiBzaXplb2YoQVZJQ09NUFJFU1NPUFRJT05TKSk7CiAgICBpZiAocFNhdmVkT3B0aW9ucyA9PSBOVUxMKQogICAgICByZXR1cm4gRkFMU0U7CgogICAgZm9yIChuID0gMDsgbiA8IG5TdHJlYW1zOyBuKyspIHsKICAgICAgaWYgKHBwT3B0aW9uc1tuXSAhPSBOVUxMKQoJbWVtY3B5KHBTYXZlZE9wdGlvbnMgKyBuLCBwcE9wdGlvbnNbbl0sIHNpemVvZihBVklDT01QUkVTU09QVElPTlMpKTsKICAgIH0KICB9CgogIFNhdmVPcHRzLnVGbGFncyAgICA9IHVGbGFnczsKICBTYXZlT3B0cy5uU3RyZWFtcyAgPSBuU3RyZWFtczsKICBTYXZlT3B0cy5wcGF2aXMgICAgPSBwcGF2aTsKICBTYXZlT3B0cy5wcE9wdGlvbnMgPSBwcE9wdGlvbnM7CgogIHJldCA9IERpYWxvZ0JveFcoQVZJRklMRV9oTW9kdWxlLCBNQUtFSU5UUkVTT1VSQ0VXKElERF9TQVZFT1BUSU9OUyksCgkJICAgaFduZCwgQVZJU2F2ZU9wdGlvbnNEbGdQcm9jKTsKCiAgaWYgKHJldCA9PSAtMSkKICAgIHJldCA9IEZBTFNFOwoKICAvKiByZXN0b3JlIG9wdGlvbnMgd2hlbiB1c2VyIHByZXNzZWQgY2FuY2VsICovCiAgaWYgKHBTYXZlZE9wdGlvbnMgIT0gTlVMTCkgewogICAgaWYgKHJldCA9PSBGQUxTRSkgewogICAgICBmb3IgKG4gPSAwOyBuIDwgblN0cmVhbXM7IG4rKykgewoJaWYgKHBwT3B0aW9uc1tuXSAhPSBOVUxMKQoJICBtZW1jcHkocHBPcHRpb25zW25dLCBwU2F2ZWRPcHRpb25zICsgbiwgc2l6ZW9mKEFWSUNPTVBSRVNTT1BUSU9OUykpOwogICAgICB9CiAgICB9CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwU2F2ZWRPcHRpb25zKTsKICB9CgogIHJldHVybiAoQk9PTClyZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUwzMi5AKQogKgkJQVZJU2F2ZU9wdGlvbnNGcmVlCShBVklGSUxFLjEyNCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVPcHRpb25zRnJlZShJTlQgblN0cmVhbXMsTFBBVklDT01QUkVTU09QVElPTlMqcHBPcHRpb25zKQp7CiAgVFJBQ0UoIiglZCwlcClcbiIsIG5TdHJlYW1zLCBwcE9wdGlvbnMpOwoKICBpZiAoblN0cmVhbXMgPCAwIHx8IHBwT3B0aW9ucyA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgZm9yICg7IG5TdHJlYW1zID4gMDsgblN0cmVhbXMtLSkgewogICAgaWYgKHBwT3B0aW9uc1tuU3RyZWFtc10gIT0gTlVMTCkgewogICAgICBwcE9wdGlvbnNbblN0cmVhbXNdLT5kd0ZsYWdzICY9IH5BVklDT01QUkVTU0ZfVkFMSUQ7CgogICAgICBpZiAocHBPcHRpb25zW25TdHJlYW1zXS0+bHBQYXJtcyAhPSBOVUxMKSB7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBwcE9wdGlvbnNbblN0cmVhbXNdLT5scFBhcm1zKTsKCXBwT3B0aW9uc1tuU3RyZWFtc10tPmxwUGFybXMgPSBOVUxMOwoJcHBPcHRpb25zW25TdHJlYW1zXS0+Y2JQYXJtcyA9IDA7CiAgICAgIH0KICAgICAgaWYgKHBwT3B0aW9uc1tuU3RyZWFtc10tPmxwRm9ybWF0ICE9IE5VTEwpIHsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHBwT3B0aW9uc1tuU3RyZWFtc10tPmxwRm9ybWF0KTsKCXBwT3B0aW9uc1tuU3RyZWFtc10tPmxwRm9ybWF0ID0gTlVMTDsKCXBwT3B0aW9uc1tuU3RyZWFtc10tPmNiRm9ybWF0ID0gMDsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIEFWSUVSUl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklTYXZlVkEJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJU2F2ZVZBKExQQ1NUUiBzekZpbGUsIENMU0lEICpwY2xzaWRIYW5kbGVyLAoJCQkgQVZJU0FWRUNBTExCQUNLIGxwZm5DYWxsYmFjaywgaW50IG5TdHJlYW0sCgkJCSBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBscE9wdGlvbnMpCnsKICBMUFdTVFIgIHdzekZpbGUgPSBOVUxMOwogIEhSRVNVTFQgaHI7CiAgaW50ICAgICBsZW47CgogIFRSQUNFKCIlcywlcCwlcCwlZCwlcCwlcClcbiIsIGRlYnVnc3RyX2Eoc3pGaWxlKSwgcGNsc2lkSGFuZGxlciwKCWxwZm5DYWxsYmFjaywgblN0cmVhbSwgcHBhdmksIHBscE9wdGlvbnMpOwoKICBpZiAoc3pGaWxlID09IE5VTEwgfHwgcHBhdmkgPT0gTlVMTCB8fCBwbHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICAvKiBjb252ZXJ0IEFTQ0lJIHN0cmluZyB0byBVbmljb2RlIGFuZCBjYWxsIFVuaWNvZGUgZnVuY3Rpb24gKi8KICBsZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgc3pGaWxlLCAtMSwgTlVMTCwgMCk7CiAgaWYgKGxlbiA8PSAwKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgd3N6RmlsZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBsZW4gKiBzaXplb2YoV0NIQVIpKTsKICBpZiAod3N6RmlsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9NRU1PUlk7CgogIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzekZpbGUsIC0xLCB3c3pGaWxlLCBsZW4pOwoKICBociA9IEFWSVNhdmVWVyh3c3pGaWxlLCBwY2xzaWRIYW5kbGVyLCBscGZuQ2FsbGJhY2ssCgkJIG5TdHJlYW0sIHBwYXZpLCBwbHBPcHRpb25zKTsKCiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgd3N6RmlsZSk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklGSUxFX0FWSVNhdmVEZWZhdWx0Q2FsbGJhY2sJKGludGVybmFsKQogKi8Kc3RhdGljIEJPT0wgV0lOQVBJIEFWSUZJTEVfQVZJU2F2ZURlZmF1bHRDYWxsYmFjayhJTlQgcHJvZ3Jlc3MpCnsKICBUUkFDRSgiKCVkKVxuIiwgcHJvZ3Jlc3MpOwoKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQVZJU2F2ZVZXCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEFWSVNhdmVWVyhMUENXU1RSIHN6RmlsZSwgQ0xTSUQgKnBjbHNpZEhhbmRsZXIsCgkJCSBBVklTQVZFQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrLCBpbnQgblN0cmVhbXMsCgkJCSBQQVZJU1RSRUFNICpwcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgKnBscE9wdGlvbnMpCnsKICBMT05HICAgICAgICAgICBsU3RhcnRbTUFYX0FWSVNUUkVBTVNdOwogIFBBVklTVFJFQU0gICAgIHBPdXRTdHJlYW1zW01BWF9BVklTVFJFQU1TXTsKICBQQVZJU1RSRUFNICAgICBwSW5TdHJlYW1zW01BWF9BVklTVFJFQU1TXTsKICBBVklGSUxFSU5GT1cgICBmSW5mbzsKICBBVklTVFJFQU1JTkZPVyBzSW5mbzsKCiAgUEFWSUZJTEUgICAgICAgcGZpbGUgPSBOVUxMOyAvKiB0aGUgb3V0cHV0IEFWSSBmaWxlICovCiAgTE9ORyAgICAgICAgICAgbEZpcnN0VmlkZW8gPSAtMTsKICBpbnQgICAgICAgICAgICBjdXJTdHJlYW07CgogIC8qIGZvciBpbnRlcmxlYXZpbmcgLi4uICovCiAgRFdPUkQgICAgICAgICAgZHdJbnRlcmxlYXZlID0gMDsgLyogaW50ZXJsZWF2ZSByYXRlICovCiAgRFdPUkQgICAgICAgICAgZHdGaWxlSW5pdGlhbEZyYW1lczsKICBMT05HICAgICAgICAgICBsRmlsZUxlbmd0aDsKICBMT05HICAgICAgICAgICBsU2FtcGxlSW5jOwoKICAvKiBmb3IgcmVhZGluZy93cml0aW5nIHRoZSBkYXRhIC4uLiAqLwogIExQVk9JRCAgICAgICAgIGxwQnVmZmVyID0gTlVMTDsKICBMT05HICAgICAgICAgICBjYkJ1ZmZlcjsgICAgICAgIC8qIHJlYWwgc2l6ZSBvZiBscEJ1ZmZlciAqLwogIExPTkcgICAgICAgICAgIGxCdWZmZXJTaXplOyAgICAgLyogbmVlZGVkIGJ5dGVzIGZvciBmb3JtYXQocyksIGV0Yy4gKi8KICBMT05HICAgICAgICAgICBsUmVhZEJ5dGVzOwogIExPTkcgICAgICAgICAgIGxSZWFkU2FtcGxlczsKICBIUkVTVUxUICAgICAgICBocmVzOwoKICBUUkFDRSgiKCVzLCVwLCVwLCVkLCVwLCVwKVxuIiwgZGVidWdzdHJfdyhzekZpbGUpLCBwY2xzaWRIYW5kbGVyLAoJbHBmbkNhbGxiYWNrLCBuU3RyZWFtcywgcHBhdmksIHBscE9wdGlvbnMpOwoKICBpZiAoc3pGaWxlID09IE5VTEwgfHwgcHBhdmkgPT0gTlVMTCB8fCBwbHBPcHRpb25zID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwogIGlmIChuU3RyZWFtcyA+PSBNQVhfQVZJU1RSRUFNUykgewogICAgV0FSTigiQ2FuJ3Qgd3JpdGUgQVZJIHdpdGggJWQgc3RyZWFtcyBvbmx5IHN1cHBvcnRzICVkIC0tIGNoYW5nZSBNQVhfQVZJU1RSRUFNUyFcbiIsIG5TdHJlYW1zLCBNQVhfQVZJU1RSRUFNUyk7CiAgICByZXR1cm4gQVZJRVJSX0lOVEVSTkFMOwogIH0KCiAgaWYgKGxwZm5DYWxsYmFjayA9PSBOVUxMKQogICAgbHBmbkNhbGxiYWNrID0gQVZJRklMRV9BVklTYXZlRGVmYXVsdENhbGxiYWNrOwoKICAvKiBjbGVhciBsb2NhbCB2YXJpYWJsZShzKSAqLwogIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICBwSW5TdHJlYW1zW2N1clN0cmVhbV0gID0gTlVMTDsKICAgIHBPdXRTdHJlYW1zW2N1clN0cmVhbV0gPSBOVUxMOwogIH0KCiAgLyogb3BlbiBvdXRwdXQgQVZJIGZpbGUgKGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0KSAqLwogIGhyZXMgPSBBVklGaWxlT3BlblcoJnBmaWxlLCBzekZpbGUsIE9GX0NSRUFURXxPRl9TSEFSRV9FWENMVVNJVkV8T0ZfV1JJVEUsCgkJICAgICAgcGNsc2lkSGFuZGxlcik7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwogIEFWSUZpbGVJbmZvVyhwZmlsZSwgJmZJbmZvLCBzaXplb2YoZkluZm8pKTsgLyogZm9yIGR3Q2FwcyAqLwoKICAvKiBpbml0aWFsaXplIG91ciBkYXRhIHN0cnVjdHVyZXMgcGFydCAxICovCiAgZm9yIChjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBuU3RyZWFtczsgY3VyU3RyZWFtKyspIHsKICAgIFBBVklTVFJFQU0gcEN1clN0cmVhbSA9IHBwYXZpW2N1clN0cmVhbV07CgogICAgaHJlcyA9IEFWSVN0cmVhbUluZm9XKHBDdXJTdHJlYW0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CiAgICBpZiAoRkFJTEVEKGhyZXMpKQogICAgICBnb3RvIGVycm9yOwoKICAgIC8qIHNlYXJjaCBmaXJzdCB2aWRlbyBzdHJlYW0gYW5kIGNoZWNrIGZvciBpbnRlcmxlYXZpbmcgKi8KICAgIGlmIChzSW5mby5mY2NUeXBlID09IHN0cmVhbXR5cGVWSURFTykgewogICAgICAvKiByZW1lbWJlciBmaXJzdCB2aWRlbyBzdHJlYW0gLS0gbmVlZGVkIGZvciBpbnRlcmxlYXZpbmcgKi8KICAgICAgaWYgKGxGaXJzdFZpZGVvIDwgMCkKCWxGaXJzdFZpZGVvID0gY3VyU3RyZWFtOwogICAgfSBlbHNlIGlmICghZHdJbnRlcmxlYXZlICYmIHBscE9wdGlvbnMgIT0gTlVMTCkgewogICAgICAvKiBjaGVjayBpZiBhbnkgbm9uLXZpZGVvIHN0cmVhbSB3YW50cyB0byBiZSBpbnRlcmxlYXZlZCAqLwogICAgICBXQVJOKCJvcHRpb25zLmZsYWdzPTB4JVggb3B0aW9ucy5kd0ludGVybGVhdmU9JXVcbiIscGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0ZsYWdzLHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdJbnRlcmxlYXZlRXZlcnkpOwogICAgICBpZiAocGxwT3B0aW9uc1tjdXJTdHJlYW1dICE9IE5VTEwgJiYKCSAgcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0ZsYWdzICYgQVZJQ09NUFJFU1NGX0lOVEVSTEVBVkUpCglkd0ludGVybGVhdmUgPSBwbHBPcHRpb25zW2N1clN0cmVhbV0tPmR3SW50ZXJsZWF2ZUV2ZXJ5OwogICAgfQoKICAgIC8qIGNyZWF0ZSBkZS0vY29tcHJlc3NlZCBzdHJlYW0gaW50ZXJmYWNlIGlmIG5lZWRlZCAqLwogICAgcEluU3RyZWFtc1tjdXJTdHJlYW1dID0gTlVMTDsKICAgIGlmIChwbHBPcHRpb25zICE9IE5VTEwgJiYgcGxwT3B0aW9uc1tjdXJTdHJlYW1dICE9IE5VTEwpIHsKICAgICAgaWYgKHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZmNjSGFuZGxlciB8fAoJICBwbHBPcHRpb25zW2N1clN0cmVhbV0tPmxwRm9ybWF0ICE9IE5VTEwpIHsKCURXT1JEIGR3S2V5U2F2ZSA9IHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdLZXlGcmFtZUV2ZXJ5OwoKCWlmIChmSW5mby5kd0NhcHMgJiBBVklGSUxFQ0FQU19BTExLRVlGUkFNRVMpCgkgIHBscE9wdGlvbnNbY3VyU3RyZWFtXS0+ZHdLZXlGcmFtZUV2ZXJ5ID0gMTsKCglocmVzID0gQVZJTWFrZUNvbXByZXNzZWRTdHJlYW0oJnBJblN0cmVhbXNbY3VyU3RyZWFtXSwgcEN1clN0cmVhbSwKCQkJCSAgICAgICBwbHBPcHRpb25zW2N1clN0cmVhbV0sIE5VTEwpOwoJcGxwT3B0aW9uc1tjdXJTdHJlYW1dLT5kd0tleUZyYW1lRXZlcnkgPSBkd0tleVNhdmU7CglpZiAoRkFJTEVEKGhyZXMpIHx8IHBJblN0cmVhbXNbY3VyU3RyZWFtXSA9PSBOVUxMKSB7CgkgIHBJblN0cmVhbXNbY3VyU3RyZWFtXSA9IE5VTEw7CgkgIGdvdG8gZXJyb3I7Cgl9CgoJLyogdGVzdCBzdHJlYW0gaW50ZXJmYWNlIGFuZCB1cGRhdGUgc3RyZWFtLWluZm8gKi8KCWhyZXMgPSBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CglpZiAoRkFJTEVEKGhyZXMpKQoJICBnb3RvIGVycm9yOwogICAgICB9CiAgICB9CgogICAgLyogbm93IGhhbmRsZSBzdHJlYW1zIHdoaWNoIHdpbGwgb25seSBiZSBjb3BpZWQgKi8KICAgIGlmIChwSW5TdHJlYW1zW2N1clN0cmVhbV0gPT0gTlVMTCkgewogICAgICBwQ3VyU3RyZWFtID0gcEluU3RyZWFtc1tjdXJTdHJlYW1dID0gcHBhdmlbY3VyU3RyZWFtXTsKICAgICAgQVZJU3RyZWFtQWRkUmVmKHBDdXJTdHJlYW0pOwogICAgfSBlbHNlCiAgICAgIHBDdXJTdHJlYW0gPSBwSW5TdHJlYW1zW2N1clN0cmVhbV07CgogICAgbFN0YXJ0W2N1clN0cmVhbV0gPSBzSW5mby5kd1N0YXJ0OwogIH0gLyogZm9yIGFsbCBzdHJlYW1zICovCgogIC8qIGNoZWNrIHRoYXQgZmlyc3QgdmlkZW8gc3RyZWFtIGlzIHRoZSBmaXJzdCBzdHJlYW0gKi8KICBpZiAobEZpcnN0VmlkZW8gPiAwKSB7CiAgICBQQVZJU1RSRUFNIHBUbXAgPSBwSW5TdHJlYW1zW2xGaXJzdFZpZGVvXTsKICAgIExPTkcgbFRtcCA9IGxTdGFydFtsRmlyc3RWaWRlb107CgogICAgcEluU3RyZWFtc1tsRmlyc3RWaWRlb10gPSBwSW5TdHJlYW1zWzBdOwogICAgcEluU3RyZWFtc1swXSA9IHBUbXA7CiAgICBsU3RhcnRbbEZpcnN0VmlkZW9dID0gbFN0YXJ0WzBdOwogICAgbFN0YXJ0WzBdID0gbFRtcDsKICAgIGxGaXJzdFZpZGVvID0gMDsKICB9CgogIC8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgZm9ybWF0cywgZGF0YSwgZXRjLiBvZiBhbiBpbml0aWFsIHNpemUgb2YgNjQga0J5dGVzKi8KICBjYkJ1ZmZlciA9IDB4MDAwMTAwMDA7CiAgbHBCdWZmZXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY2JCdWZmZXIpOwogIGlmIChscEJ1ZmZlciA9PSBOVUxMKSB7CiAgICBocmVzID0gQVZJRVJSX01FTU9SWTsKICAgIGdvdG8gZXJyb3I7CiAgfQoKICBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zWzBdLCAmc0luZm8sIHNpemVvZihzSW5mbykpOwogIGxGaWxlTGVuZ3RoID0gc0luZm8uZHdMZW5ndGg7CiAgZHdGaWxlSW5pdGlhbEZyYW1lcyA9IDA7CiAgaWYgKGxGaXJzdFZpZGVvID49IDApIHsKICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IHZlcnNpb24gb2YgdGhlIGZvcm1hdAogICAgICogIC0tIG5lZWQgYXQgbGVhc3QgQklUTUFQSU5GT0hFQURFUiBvciBuZXdlcgogICAgICovCiAgICBsU2FtcGxlSW5jID0gMTsKICAgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CiAgICBocmVzID0gQVZJU3RyZWFtUmVhZEZvcm1hdChwSW5TdHJlYW1zW2xGaXJzdFZpZGVvXSwgQVZJU3RyZWFtU3RhcnQocEluU3RyZWFtc1tsRmlyc3RWaWRlb10pLCBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKICAgIGlmIChsQnVmZmVyU2l6ZSA8IChMT05HKXNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKICAgICAgaHJlcyA9IEFWSUVSUl9JTlRFUk5BTDsKICAgIGlmIChGQUlMRUQoaHJlcykpCiAgICAgIGdvdG8gZXJyb3I7CiAgfSBlbHNlIC8qIHVzZSBvbmUgc2Vjb25kIGJsb2NrcyBmb3IgaW50ZXJsZWF2aW5nIGlmIG5vIHZpZGVvIHByZXNlbnQgKi8KICAgIGxTYW1wbGVJbmMgPSBBVklTdHJlYW1UaW1lVG9TYW1wbGUocEluU3RyZWFtc1swXSwgMTAwMDAwMCk7CgogIC8qIGNyZWF0ZSBvdXRwdXQgc3RyZWFtcyAqLwogIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICBBVklTdHJlYW1JbmZvVyhwSW5TdHJlYW1zW2N1clN0cmVhbV0sICZzSW5mbywgc2l6ZW9mKHNJbmZvKSk7CgogICAgc0luZm8uZHdJbml0aWFsRnJhbWVzID0gMDsKICAgIGlmIChkd0ludGVybGVhdmUgIT0gMCAmJiBjdXJTdHJlYW0gPiAwICYmIHNJbmZvLmZjY1R5cGUgIT0gc3RyZWFtdHlwZVZJREVPKSB7CiAgICAgIC8qIDc1MCBtcyBpbml0aWFsIGZyYW1lcyBmb3Igbm9uLXZpZGVvIHN0cmVhbXMgKi8KICAgICAgc0luZm8uZHdJbml0aWFsRnJhbWVzID0gQVZJU3RyZWFtVGltZVRvU2FtcGxlKHBJblN0cmVhbXNbMF0sIDc1MCk7CiAgICB9CgogICAgaHJlcyA9IEFWSUZpbGVDcmVhdGVTdHJlYW1XKHBmaWxlLCAmcE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvKTsKICAgIGlmIChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dICE9IE5VTEwgJiYgU1VDQ0VFREVEKGhyZXMpKSB7CiAgICAgIC8qIGNvcHkgaW5pdGlhbCBmb3JtYXQgZm9yIHRoaXMgc3RyZWFtICovCiAgICAgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CiAgICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkRm9ybWF0KHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJCSBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKICAgICAgaWYgKEZBSUxFRChocmVzKSkKCWdvdG8gZXJyb3I7CiAgICAgIGhyZXMgPSBBVklTdHJlYW1TZXRGb3JtYXQocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgMCwgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKICAgICAgaWYgKEZBSUxFRChocmVzKSkKCWdvdG8gZXJyb3I7CgogICAgICAvKiB0cnkgdG8gY29weSBzdHJlYW0gaGFuZGxlciBkYXRhICovCiAgICAgIGxCdWZmZXJTaXplID0gY2JCdWZmZXI7CiAgICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkRGF0YShwSW5TdHJlYW1zW2N1clN0cmVhbV0sIGNraWRTVFJFQU1IQU5ETEVSREFUQSwKCQkJICAgICAgIGxwQnVmZmVyLCAmbEJ1ZmZlclNpemUpOwogICAgICBpZiAoU1VDQ0VFREVEKGhyZXMpICYmIGxCdWZmZXJTaXplID4gMCkgewoJaHJlcyA9IEFWSVN0cmVhbVdyaXRlRGF0YShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLGNraWRTVFJFQU1IQU5ETEVSREFUQSwKCQkJCSAgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKCWlmIChGQUlMRUQoaHJlcykpCgkgIGdvdG8gZXJyb3I7CiAgICAgIH0KCiAgICAgIGlmIChkd0ZpbGVJbml0aWFsRnJhbWVzIDwgc0luZm8uZHdJbml0aWFsRnJhbWVzKQoJZHdGaWxlSW5pdGlhbEZyYW1lcyA9IHNJbmZvLmR3SW5pdGlhbEZyYW1lczsKICAgICAgbFJlYWRCeXRlcyA9CglBVklTdHJlYW1TYW1wbGVUb1NhbXBsZShwT3V0U3RyZWFtc1swXSwgcEluU3RyZWFtc1tjdXJTdHJlYW1dLAoJCQkJc0luZm8uZHdMZW5ndGgpOwogICAgICBpZiAobEZpbGVMZW5ndGggPCBsUmVhZEJ5dGVzKQoJbEZpbGVMZW5ndGggPSBsUmVhZEJ5dGVzOwogICAgfSBlbHNlIHsKICAgICAgLyogY3JlYXRpb24gb2YgZGUtL2NvbXByZXNzaW9uIHN0cmVhbSBpbnRlcmZhY2UgZmFpbGVkICovCiAgICAgIFdBUk4oImNyZWF0aW9uIG9mIChkZS0pY29tcHJlc3Npb24gc3RyZWFtIGZhaWxlZCBmb3Igc3RyZWFtICVkXG4iLGN1clN0cmVhbSk7CiAgICAgIEFWSVN0cmVhbVJlbGVhc2UocEluU3RyZWFtc1tjdXJTdHJlYW1dKTsKICAgICAgaWYgKGN1clN0cmVhbSArIDEgPj0gblN0cmVhbXMpIHsKCS8qIG1vdmUgdGhlIG90aGVycyBvbmUgdXAgKi8KCVBBVklTVFJFQU0gKnBwYXMgPSAmcEluU3RyZWFtc1tjdXJTdHJlYW1dOwoJaW50ICAgICAgICAgICAgbiA9IG5TdHJlYW1zIC0gKGN1clN0cmVhbSArIDEpOwoKCWRvIHsKCSAgKnBwYXMgPSBwSW5TdHJlYW1zW2N1clN0cmVhbSArIDFdOwoJfSB3aGlsZSAoLS1uKTsKICAgICAgfQogICAgICBuU3RyZWFtcy0tOwogICAgICBjdXJTdHJlYW0tLTsKICAgIH0KICB9IC8qIGNyZWF0ZSBvdXRwdXQgc3RyZWFtcyBmb3IgYWxsIGlucHV0IHN0cmVhbXMgKi8KCiAgLyogaGF2ZSB3ZSBzdGlsbCBzb21ldGhpbmcgdG8gd3JpdGUsIG9yIGxvc3QgZXZlcnl0aGluZz8gKi8KICBpZiAoblN0cmVhbXMgPD0gMCkKICAgIGdvdG8gZXJyb3I7CgogIGlmIChkd0ludGVybGVhdmUpIHsKICAgIExPTkcgbEN1ckZyYW1lID0gLWR3RmlsZUluaXRpYWxGcmFtZXM7CgogICAgLyogaW50ZXJsZWF2ZWQgZmlsZSAqLwogICAgaWYgKGR3SW50ZXJsZWF2ZSA9PSAxKQogICAgICBBVklGaWxlRW5kUmVjb3JkKHBmaWxlKTsKCiAgICBmb3IgKDsgbEN1ckZyYW1lIDwgbEZpbGVMZW5ndGg7IGxDdXJGcmFtZSArPSBsU2FtcGxlSW5jKSB7CiAgICAgIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CglMT05HIGxMYXN0U2FtcGxlOwoKCWhyZXMgPSBBVklTdHJlYW1JbmZvVyhwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAmc0luZm8sIHNpemVvZihzSW5mbykpOwoJaWYgKEZBSUxFRChocmVzKSkKCSAgZ290byBlcnJvcjsKCgkvKiBpbml0aWFsIGZyYW1lcyBwaGFzZSBhdCB0aGUgZW5kIGZvciB0aGlzIHN0cmVhbT8gKi8KCWlmICgtKExPTkcpc0luZm8uZHdJbml0aWFsRnJhbWVzID4gbEN1ckZyYW1lKQoJICBjb250aW51ZTsKCglpZiAoKGxGaWxlTGVuZ3RoIC0gbFNhbXBsZUluYykgPD0gbEN1ckZyYW1lKSB7CgkgIGxMYXN0U2FtcGxlID0gQVZJU3RyZWFtTGVuZ3RoKHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7CgkgIGxGaXJzdFZpZGVvID0gbExhc3RTYW1wbGUgKyBBVklTdHJlYW1TdGFydChwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwoJfSBlbHNlIHsKCSAgaWYgKGN1clN0cmVhbSAhPSAwKSB7CgkgICAgbEZpcnN0VmlkZW8gPQoJICAgICAgQVZJU3RyZWFtU2FtcGxlVG9TYW1wbGUocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBwSW5TdHJlYW1zWzBdLAoJCQkJICAgICAgKHNJbmZvLmZjY1R5cGUgPT0gc3RyZWFtdHlwZVZJREVPID8gCgkJCQkgICAgICAgKExPTkcpZHdJbnRlcmxlYXZlIDogbFNhbXBsZUluYykgKwoJCQkJICAgICAgc0luZm8uZHdJbml0aWFsRnJhbWVzICsgbEN1ckZyYW1lKTsKCSAgfSBlbHNlCgkgICAgbEZpcnN0VmlkZW8gPSBsU2FtcGxlSW5jICsgKHNJbmZvLmR3SW5pdGlhbEZyYW1lcyArIGxDdXJGcmFtZSk7CgoJICBsTGFzdFNhbXBsZSA9IEFWSVN0cmVhbUVuZChwSW5TdHJlYW1zW2N1clN0cmVhbV0pOwoJICBpZiAobExhc3RTYW1wbGUgPD0gbEZpcnN0VmlkZW8pCgkgICAgbEZpcnN0VmlkZW8gPSBsTGFzdFNhbXBsZTsKCX0KCgkvKiBjb3B5IG5lZWRlZCBzYW1wbGVzIG5vdyAqLwoJV0FSTigiY29weSBmcm9tIHN0cmVhbSAlZCBzYW1wbGVzICVkIHRvICVkLi4uXG4iLGN1clN0cmVhbSwKCSAgICAgIGxTdGFydFtjdXJTdHJlYW1dLGxGaXJzdFZpZGVvKTsKCXdoaWxlIChsRmlyc3RWaWRlbyA+IGxTdGFydFtjdXJTdHJlYW1dKSB7CgkgIERXT1JEIGZsYWdzID0gMDsKCgkgIC8qIGNvcHkgZm9ybWF0IGluIGNhc2UgaXQgY2FuIGNoYW5nZSAqLwoJICBsQnVmZmVyU2l6ZSA9IGNiQnVmZmVyOwoJICBocmVzID0gQVZJU3RyZWFtUmVhZEZvcm1hdChwSW5TdHJlYW1zW2N1clN0cmVhbV0sIGxTdGFydFtjdXJTdHJlYW1dLAoJCQkJICAgICBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoJICBBVklTdHJlYW1TZXRGb3JtYXQocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgbFN0YXJ0W2N1clN0cmVhbV0sCgkJCSAgICAgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKCgkgIC8qIHRyeSB0byByZWFkIGRhdGEgdW50aWwgd2UgZ290IGl0LCBvciBlcnJvciAqLwoJICBkbyB7CgkgICAgaHJlcyA9IEFWSVN0cmVhbVJlYWQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBsU3RhcnRbY3VyU3RyZWFtXSwKCQkJCSBsRmlyc3RWaWRlbyAtIGxTdGFydFtjdXJTdHJlYW1dLCBscEJ1ZmZlciwKCQkJCSBjYkJ1ZmZlciwgJmxSZWFkQnl0ZXMsICZsUmVhZFNhbXBsZXMpOwoJICB9IHdoaWxlICgoaHJlcyA9PSBBVklFUlJfQlVGRkVSVE9PU01BTEwpICYmCgkJICAgKGxwQnVmZmVyID0gSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBCdWZmZXIsIGNiQnVmZmVyICo9IDIpKSAhPSBOVUxMKTsKCSAgaWYgKGxwQnVmZmVyID09IE5VTEwpCgkgICAgaHJlcyA9IEFWSUVSUl9NRU1PUlk7CgkgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgZ290byBlcnJvcjsKCgkgIGlmIChBVklTdHJlYW1Jc0tleUZyYW1lKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgKExPTkcpc0luZm8uZHdTdGFydCkpCgkgICAgZmxhZ3MgPSBBVklJRl9LRVlGUkFNRTsKCSAgaHJlcyA9IEFWSVN0cmVhbVdyaXRlKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIC0xLCBsUmVhZFNhbXBsZXMsCgkJCQlscEJ1ZmZlciwgbFJlYWRCeXRlcywgZmxhZ3MsIE5VTEwsIE5VTEwpOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgoJICBsU3RhcnRbY3VyU3RyZWFtXSArPSBsUmVhZFNhbXBsZXM7Cgl9CglsU3RhcnRbY3VyU3RyZWFtXSA9IGxGaXJzdFZpZGVvOwogICAgICB9IC8qIHN0cmVhbSBieSBzdHJlYW0gKi8KCiAgICAgIC8qIG5lZWQgdG8gY2xvc2UgdGhpcyBibG9jaz8gKi8KICAgICAgaWYgKGR3SW50ZXJsZWF2ZSA9PSAxKSB7CglocmVzID0gQVZJRmlsZUVuZFJlY29yZChwZmlsZSk7CglpZiAoRkFJTEVEKGhyZXMpKQoJICBicmVhazsKICAgICAgfQoKICAgICAgLyogc2hvdyBwcm9ncmVzcyAqLwogICAgICBpZiAobHBmbkNhbGxiYWNrKE11bERpdihkd0ZpbGVJbml0aWFsRnJhbWVzICsgbEN1ckZyYW1lLCAxMDAsCgkJCSAgICAgIGR3RmlsZUluaXRpYWxGcmFtZXMgKyBsRmlsZUxlbmd0aCkpKSB7CglocmVzID0gQVZJRVJSX1VTRVJBQk9SVDsKCWJyZWFrOwogICAgICB9CiAgICB9IC8qIGNvcHkgZnJhbWUgYnkgZnJhbWUgKi8KICB9IGVsc2UgewogICAgLyogbm9uLWludGVybGVhdmVkIGZpbGUgKi8KCiAgICBmb3IgKGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IG5TdHJlYW1zOyBjdXJTdHJlYW0rKykgewogICAgICAvKiBzaG93IHByb2dyZXNzICovCiAgICAgIGlmIChscGZuQ2FsbGJhY2soTXVsRGl2KGN1clN0cmVhbSwgMTAwLCBuU3RyZWFtcykpKSB7CglocmVzID0gQVZJRVJSX1VTRVJBQk9SVDsKCWdvdG8gZXJyb3I7CiAgICAgIH0KCiAgICAgIEFWSVN0cmVhbUluZm9XKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgJnNJbmZvLCBzaXplb2Yoc0luZm8pKTsKCiAgICAgIGlmIChzSW5mby5kd1NhbXBsZVNpemUgIT0gMCkgewoJLyogc2FtcGxlLWJhc2VkIGRhdGEgbGlrZSBhdWRpbyAqLwoJd2hpbGUgKHNJbmZvLmR3U3RhcnQgPCBzSW5mby5kd0xlbmd0aCkgewoJICBMT05HIGxTYW1wbGVzID0gY2JCdWZmZXIgLyBzSW5mby5kd1NhbXBsZVNpemU7CgoJICAvKiBjb3B5IGZvcm1hdCBpbiBjYXNlIGl0IGNhbiBjaGFuZ2UgKi8KCSAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKCSAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkJICAgICBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICByZXR1cm4gaHJlczsKCSAgQVZJU3RyZWFtU2V0Rm9ybWF0KHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIHNJbmZvLmR3U3RhcnQsCgkJCSAgICAgbHBCdWZmZXIsIGxCdWZmZXJTaXplKTsKCgkgIC8qIGxpbWl0IHRvIHN0cmVhbSBib3VuZGFyaWVzICovCgkgIGlmIChsU2FtcGxlcyAhPSAoTE9ORykoc0luZm8uZHdMZW5ndGggLSBzSW5mby5kd1N0YXJ0KSkKCSAgICBsU2FtcGxlcyA9IHNJbmZvLmR3TGVuZ3RoIC0gc0luZm8uZHdTdGFydDsKCgkgIC8qIG5vdyB0cnkgdG8gcmVhZCB1bnRpbCB3ZSBnZXQgaXQsIG9yIGFuIGVycm9yIG9jY3VycyAqLwoJICBkbyB7CgkgICAgbFJlYWRCeXRlcyAgID0gY2JCdWZmZXI7CgkgICAgbFJlYWRTYW1wbGVzID0gMDsKCSAgICBocmVzID0gQVZJU3RyZWFtUmVhZChwSW5TdHJlYW1zW2N1clN0cmVhbV0sc0luZm8uZHdTdGFydCxsU2FtcGxlcywKCQkJCSBscEJ1ZmZlcixjYkJ1ZmZlciwmbFJlYWRCeXRlcywmbFJlYWRTYW1wbGVzKTsKCSAgfSB3aGlsZSAoKGhyZXMgPT0gQVZJRVJSX0JVRkZFUlRPT1NNQUxMKSAmJgoJCSAgIChscEJ1ZmZlciA9IEhlYXBSZUFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQnVmZmVyLCBjYkJ1ZmZlciAqPSAyKSkgIT0gTlVMTCk7CgkgIGlmIChscEJ1ZmZlciA9PSBOVUxMKQoJICAgIGhyZXMgPSBBVklFUlJfTUVNT1JZOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgkgIGlmIChsUmVhZFNhbXBsZXMgIT0gMCkgewoJICAgIHNJbmZvLmR3U3RhcnQgKz0gbFJlYWRTYW1wbGVzOwoJICAgIGhyZXMgPSBBVklTdHJlYW1Xcml0ZShwT3V0U3RyZWFtc1tjdXJTdHJlYW1dLCAtMSwgbFJlYWRTYW1wbGVzLAoJCQkJICBscEJ1ZmZlciwgbFJlYWRCeXRlcywgMCwgTlVMTCAsIE5VTEwpOwoJICAgIGlmIChGQUlMRUQoaHJlcykpCgkgICAgICBnb3RvIGVycm9yOwoKCSAgICAvKiBzaG93IHByb2dyZXNzICovCgkgICAgaWYgKGxwZm5DYWxsYmFjayhNdWxEaXYoc0luZm8uZHdTdGFydCwxMDAsblN0cmVhbXMqc0luZm8uZHdMZW5ndGgpKwoJCQkgICAgIE11bERpdihjdXJTdHJlYW0sIDEwMCwgblN0cmVhbXMpKSkgewoJICAgICAgaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7CgkgICAgICBnb3RvIGVycm9yOwoJICAgIH0KCSAgfSBlbHNlIHsKCSAgICBpZiAoKHNJbmZvLmR3TGVuZ3RoIC0gc0luZm8uZHdTdGFydCkgIT0gMSkgewoJICAgICAgaHJlcyA9IEFWSUVSUl9GSUxFUkVBRDsKCSAgICAgIGdvdG8gZXJyb3I7CgkgICAgfQoJICB9Cgl9CiAgICAgIH0gZWxzZSB7CgkvKiBibG9jay1iYXNlZCBkYXRhIGxpa2UgdmlkZW8gKi8KCWZvciAoOyBzSW5mby5kd1N0YXJ0IDwgc0luZm8uZHdMZW5ndGg7IHNJbmZvLmR3U3RhcnQrKykgewoJICBEV09SRCBmbGFncyA9IDA7CgoJICAvKiBjb3B5IGZvcm1hdCBpbiBjYXNlIGl0IGNhbiBjaGFuZ2UgKi8KCSAgbEJ1ZmZlclNpemUgPSBjYkJ1ZmZlcjsKCSAgaHJlcyA9IEFWSVN0cmVhbVJlYWRGb3JtYXQocEluU3RyZWFtc1tjdXJTdHJlYW1dLCBzSW5mby5kd1N0YXJ0LAoJCQkJICAgICBscEJ1ZmZlciwgJmxCdWZmZXJTaXplKTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoJICBBVklTdHJlYW1TZXRGb3JtYXQocE91dFN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwKCQkJICAgICBscEJ1ZmZlciwgbEJ1ZmZlclNpemUpOwoKCSAgLyogdHJ5IHRvIHJlYWQgYmxvY2sgYW5kIHJlc2l6ZSBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCgkgIGRvIHsKCSAgICBsUmVhZFNhbXBsZXMgPSAwOwoJICAgIGxSZWFkQnl0ZXMgICA9IGNiQnVmZmVyOwoJICAgIGhyZXMgPSBBVklTdHJlYW1SZWFkKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgc0luZm8uZHdTdGFydCwgMSwKCQkJCSBscEJ1ZmZlciwgY2JCdWZmZXIsJmxSZWFkQnl0ZXMsJmxSZWFkU2FtcGxlcyk7CgkgIH0gd2hpbGUgKChocmVzID09IEFWSUVSUl9CVUZGRVJUT09TTUFMTCkgJiYKCQkgICAobHBCdWZmZXIgPSBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlciwgY2JCdWZmZXIgKj0gMikpICE9IE5VTEwpOwoJICBpZiAobHBCdWZmZXIgPT0gTlVMTCkKCSAgICBocmVzID0gQVZJRVJSX01FTU9SWTsKCSAgaWYgKEZBSUxFRChocmVzKSkKCSAgICBnb3RvIGVycm9yOwoJICBpZiAobFJlYWRTYW1wbGVzICE9IDEpIHsKCSAgICBocmVzID0gQVZJRVJSX0ZJTEVSRUFEOwoJICAgIGdvdG8gZXJyb3I7CgkgIH0KCgkgIGlmIChBVklTdHJlYW1Jc0tleUZyYW1lKHBJblN0cmVhbXNbY3VyU3RyZWFtXSwgKExPTkcpc0luZm8uZHdTdGFydCkpCgkgICAgZmxhZ3MgPSBBVklJRl9LRVlGUkFNRTsKCSAgaHJlcyA9IEFWSVN0cmVhbVdyaXRlKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0sIC0xLCBsUmVhZFNhbXBsZXMsCgkJCQlscEJ1ZmZlciwgbFJlYWRCeXRlcywgZmxhZ3MsIE5VTEwsIE5VTEwpOwoJICBpZiAoRkFJTEVEKGhyZXMpKQoJICAgIGdvdG8gZXJyb3I7CgoJICAvKiBzaG93IHByb2dyZXNzICovCgkgIGlmIChscGZuQ2FsbGJhY2soTXVsRGl2KHNJbmZvLmR3U3RhcnQsMTAwLG5TdHJlYW1zKnNJbmZvLmR3TGVuZ3RoKSsKCQkJICAgTXVsRGl2KGN1clN0cmVhbSwgMTAwLCBuU3RyZWFtcykpKSB7CgkgICAgaHJlcyA9IEFWSUVSUl9VU0VSQUJPUlQ7CgkgICAgZ290byBlcnJvcjsKCSAgfQoJfSAvKiBjb3B5IGFsbCBibG9ja3MgKi8KICAgICAgfQogICAgfSAvKiBjb3B5IGRhdGEgc3RyZWFtIGJ5IHN0cmVhbSAqLwogIH0KCiBlcnJvcjoKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlcik7CiAgaWYgKHBmaWxlICE9IE5VTEwpIHsKICAgIGZvciAoY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgblN0cmVhbXM7IGN1clN0cmVhbSsrKSB7CiAgICAgIGlmIChwT3V0U3RyZWFtc1tjdXJTdHJlYW1dICE9IE5VTEwpCglBVklTdHJlYW1SZWxlYXNlKHBPdXRTdHJlYW1zW2N1clN0cmVhbV0pOwogICAgICBpZiAocEluU3RyZWFtc1tjdXJTdHJlYW1dICE9IE5VTEwpCglBVklTdHJlYW1SZWxlYXNlKHBJblN0cmVhbXNbY3VyU3RyZWFtXSk7CiAgICB9CgogICAgQVZJRmlsZVJlbGVhc2UocGZpbGUpOwogIH0KCiAgcmV0dXJuIGhyZXM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ3JlYXRlRWRpdGFibGVTdHJlYW0JKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBDcmVhdGVFZGl0YWJsZVN0cmVhbShQQVZJU1RSRUFNICpwcEVkaXRhYmxlLCBQQVZJU1RSRUFNIHBTb3VyY2UpCnsKICBJQVZJRWRpdFN0cmVhbSAqcEVkaXQgPSBOVUxMOwogIEhSRVNVTFQJICBocjsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIHBwRWRpdGFibGUsIHBTb3VyY2UpOwoKICBpZiAocHBFZGl0YWJsZSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgKnBwRWRpdGFibGUgPSBOVUxMOwoKICBpZiAocFNvdXJjZSAhPSBOVUxMKSB7CiAgICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocFNvdXJjZSwgJklJRF9JQVZJRWRpdFN0cmVhbSwKCQkJCSAgIChMUFZPSUQqKSZwRWRpdCk7CiAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICAgIGhyID0gSUFWSUVkaXRTdHJlYW1fQ2xvbmUocEVkaXQsIHBwRWRpdGFibGUpOwogICAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKCiAgICAgIHJldHVybiBocjsKICAgIH0KICB9CgogIC8qIG5lZWQgb3duIGltcGxlbWVudGF0aW9uIG9mIElBVklFZGl0U3RyZWFtICovCiAgcEVkaXQgPSBBVklGSUxFX0NyZWF0ZUVkaXRTdHJlYW0ocFNvdXJjZSk7CiAgaWYgKHBFZGl0ID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX01FTU9SWTsKCiAgaHIgPSBJQVZJRWRpdFN0cmVhbV9RdWVyeUludGVyZmFjZShwRWRpdCwgJklJRF9JQVZJU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCopcHBFZGl0YWJsZSk7CiAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtQ2xvbmUJCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbUNsb25lKFBBVklTVFJFQU0gcFN0cmVhbSwgUEFWSVNUUkVBTSAqcHBSZXN1bHQpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwU3RyZWFtLCBwcFJlc3VsdCk7CgogIGlmIChwU3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAocHBSZXN1bHQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcFJlc3VsdCA9IE5VTEw7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwU3RyZWFtLCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9DbG9uZShwRWRpdCwgcHBSZXN1bHQpOwoKICAgIElBVklFZGl0U3RyZWFtX1JlbGVhc2UocEVkaXQpOwogIH0gZWxzZQogICAgaHIgPSBBVklFUlJfVU5TVVBQT1JURUQ7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtQ29weQkJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBFZGl0U3RyZWFtQ29weShQQVZJU1RSRUFNIHBTdHJlYW0sIExPTkcgKnBsU3RhcnQsCgkJCSAgICAgIExPTkcgKnBsTGVuZ3RoLCBQQVZJU1RSRUFNICpwcFJlc3VsdCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIHBTdHJlYW0sIHBsU3RhcnQsIHBsTGVuZ3RoLCBwcFJlc3VsdCk7CgogIGlmIChwU3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAocGxTdGFydCA9PSBOVUxMIHx8IHBsTGVuZ3RoID09IE5VTEwgfHwgcHBSZXN1bHQgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogICpwcFJlc3VsdCA9IE5VTEw7CgogIGhyID0gSUFWSVN0cmVhbV9RdWVyeUludGVyZmFjZShwU3RyZWFtLCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9Db3B5KHBFZGl0LCBwbFN0YXJ0LCBwbExlbmd0aCwgcHBSZXN1bHQpOwoKICAgIElBVklFZGl0U3RyZWFtX1JlbGVhc2UocEVkaXQpOwogIH0gZWxzZQogICAgaHIgPSBBVklFUlJfVU5TVVBQT1JURUQ7CgogIHJldHVybiBocjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFZGl0U3RyZWFtQ3V0CQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1DdXQoUEFWSVNUUkVBTSBwU3RyZWFtLCBMT05HICpwbFN0YXJ0LAoJCQkgICAgIExPTkcgKnBsTGVuZ3RoLCBQQVZJU1RSRUFNICpwcFJlc3VsdCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcClcbiIsIHBTdHJlYW0sIHBsU3RhcnQsIHBsTGVuZ3RoLCBwcFJlc3VsdCk7CgogIGlmIChwcFJlc3VsdCAhPSBOVUxMKQogICAgKnBwUmVzdWx0ID0gTlVMTDsKICBpZiAocFN0cmVhbSA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURIQU5ETEU7CiAgaWYgKHBsU3RhcnQgPT0gTlVMTCB8fCBwbExlbmd0aCA9PSBOVUxMKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBTdHJlYW0sICZJSURfSUFWSUVkaXRTdHJlYW0sKExQVk9JRCopJnBFZGl0KTsKICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBwRWRpdCAhPSBOVUxMKSB7CiAgICBociA9IElBVklFZGl0U3RyZWFtX0N1dChwRWRpdCwgcGxTdGFydCwgcGxMZW5ndGgsIHBwUmVzdWx0KTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVBhc3RlCQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1QYXN0ZShQQVZJU1RSRUFNIHBEZXN0LCBMT05HICpwbFN0YXJ0LCBMT05HICpwbExlbmd0aCwKCQkJICAgICAgIFBBVklTVFJFQU0gcFNvdXJjZSwgTE9ORyBsU3RhcnQsIExPTkcgbEVuZCkKewogIFBBVklFRElUU1RSRUFNIHBFZGl0ID0gTlVMTDsKICBIUkVTVUxUICAgICAgICBocjsKCiAgVFJBQ0UoIiglcCwlcCwlcCwlcCwlZCwlZClcbiIsIHBEZXN0LCBwbFN0YXJ0LCBwbExlbmd0aCwKCXBTb3VyY2UsIGxTdGFydCwgbEVuZCk7CgogIGlmIChwRGVzdCA9PSBOVUxMIHx8IHBTb3VyY2UgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChwbFN0YXJ0ID09IE5VTEwgfHwgcGxMZW5ndGggPT0gTlVMTCB8fCBsU3RhcnQgPCAwKQogICAgcmV0dXJuIEFWSUVSUl9CQURQQVJBTTsKCiAgaHIgPSBJQVZJU3RyZWFtX1F1ZXJ5SW50ZXJmYWNlKHBEZXN0LCAmSUlEX0lBVklFZGl0U3RyZWFtLChMUFZPSUQqKSZwRWRpdCk7CiAgaWYgKFNVQ0NFRURFRChocikgJiYgcEVkaXQgIT0gTlVMTCkgewogICAgaHIgPSBJQVZJRWRpdFN0cmVhbV9QYXN0ZShwRWRpdCwgcGxTdGFydCwgcGxMZW5ndGgsIHBTb3VyY2UsIGxTdGFydCwgbEVuZCk7CgogICAgSUFWSUVkaXRTdHJlYW1fUmVsZWFzZShwRWRpdCk7CiAgfSBlbHNlCiAgICBociA9IEFWSUVSUl9VTlNVUFBPUlRFRDsKCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXRJbmZvQQkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXRJbmZvQShQQVZJU1RSRUFNIHBzdHJlYW0sIExQQVZJU1RSRUFNSU5GT0EgYXNpLAoJCQkJICBMT05HIHNpemUpCnsKICBBVklTVFJFQU1JTkZPVyBhc2l3OwoKICBUUkFDRSgiKCVwLCVwLCVkKVxuIiwgcHN0cmVhbSwgYXNpLCBzaXplKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmICgoRFdPUkQpc2l6ZSA8IHNpemVvZihBVklTVFJFQU1JTkZPQSkpCiAgICByZXR1cm4gQVZJRVJSX0JBRFNJWkU7CgogIG1lbWNweSgmYXNpdywgYXNpLCBzaXplb2YoYXNpdykgLSBzaXplb2YoYXNpdy5zek5hbWUpKTsKICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYXNpLT5zek5hbWUsIC0xLAoJCSAgICAgIGFzaXcuc3pOYW1lLCBzaXplb2YoYXNpdy5zek5hbWUpL3NpemVvZihXQ0hBUikpOwoKICByZXR1cm4gRWRpdFN0cmVhbVNldEluZm9XKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXRJbmZvVwkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXRJbmZvVyhQQVZJU1RSRUFNIHBzdHJlYW0sIExQQVZJU1RSRUFNSU5GT1cgYXNpLAoJCQkJICBMT05HIHNpemUpCnsKICBQQVZJRURJVFNUUkVBTSBwRWRpdCA9IE5VTEw7CiAgSFJFU1VMVCAgICAgICAgaHI7CgogIFRSQUNFKCIoJXAsJXAsJWQpXG4iLCBwc3RyZWFtLCBhc2ksIHNpemUpOwoKICBociA9IElBVklTdHJlYW1fUXVlcnlJbnRlcmZhY2UocHN0cmVhbSwgJklJRF9JQVZJRWRpdFN0cmVhbSwoTFBWT0lEKikmcEVkaXQpOwogIGlmIChTVUNDRUVERUQoaHIpICYmIHBFZGl0ICE9IE5VTEwpIHsKICAgIGhyID0gSUFWSUVkaXRTdHJlYW1fU2V0SW5mbyhwRWRpdCwgYXNpLCBzaXplKTsKCiAgICBJQVZJRWRpdFN0cmVhbV9SZWxlYXNlKHBFZGl0KTsKICB9IGVsc2UKICAgIGhyID0gQVZJRVJSX1VOU1VQUE9SVEVEOwoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRWRpdFN0cmVhbVNldE5hbWVBCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgRWRpdFN0cmVhbVNldE5hbWVBKFBBVklTVFJFQU0gcHN0cmVhbSwgTFBDU1RSIHN6TmFtZSkKewogIEFWSVNUUkVBTUlORk9BIGFzaWE7CiAgSFJFU1VMVCAgICAgICAgaHJlczsKCiAgVFJBQ0UoIiglcCwlcylcbiIsIHBzdHJlYW0sIGRlYnVnc3RyX2Eoc3pOYW1lKSk7CgogIGlmIChwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKICBpZiAoc3pOYW1lID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBRFBBUkFNOwoKICBocmVzID0gQVZJU3RyZWFtSW5mb0EocHN0cmVhbSwgJmFzaWEsIHNpemVvZihhc2lhKSk7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwoKICBtZW1zZXQoYXNpYS5zek5hbWUsIDAsIHNpemVvZihhc2lhLnN6TmFtZSkpOwogIGxzdHJjcHluQShhc2lhLnN6TmFtZSwgc3pOYW1lLCBzaXplb2YoYXNpYS5zek5hbWUpL3NpemVvZihhc2lhLnN6TmFtZVswXSkpOwoKICByZXR1cm4gRWRpdFN0cmVhbVNldEluZm9BKHBzdHJlYW0sICZhc2lhLCBzaXplb2YoYXNpYSkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVkaXRTdHJlYW1TZXROYW1lVwkoQVZJRklMMzIuQCkKICovCkhSRVNVTFQgV0lOQVBJIEVkaXRTdHJlYW1TZXROYW1lVyhQQVZJU1RSRUFNIHBzdHJlYW0sIExQQ1dTVFIgc3pOYW1lKQp7CiAgQVZJU1RSRUFNSU5GT1cgYXNpdzsKICBIUkVTVUxUICAgICAgICBocmVzOwoKICBUUkFDRSgiKCVwLCVzKVxuIiwgcHN0cmVhbSwgZGVidWdzdHJfdyhzek5hbWUpKTsKCiAgaWYgKHBzdHJlYW0gPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFESEFORExFOwogIGlmIChzek5hbWUgPT0gTlVMTCkKICAgIHJldHVybiBBVklFUlJfQkFEUEFSQU07CgogIGhyZXMgPSBJQVZJU3RyZWFtX0luZm8ocHN0cmVhbSwgJmFzaXcsIHNpemVvZihhc2l3KSk7CiAgaWYgKEZBSUxFRChocmVzKSkKICAgIHJldHVybiBocmVzOwoKICBtZW1zZXQoYXNpdy5zek5hbWUsIDAsIHNpemVvZihhc2l3LnN6TmFtZSkpOwogIGxzdHJjcHluVyhhc2l3LnN6TmFtZSwgc3pOYW1lLCBzaXplb2YoYXNpdy5zek5hbWUpL3NpemVvZihhc2l3LnN6TmFtZVswXSkpOwoKICByZXR1cm4gRWRpdFN0cmVhbVNldEluZm9XKHBzdHJlYW0sICZhc2l3LCBzaXplb2YoYXNpdykpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFWSUNsZWFyQ2xpcGJvYXJkCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJQ2xlYXJDbGlwYm9hcmQodm9pZCkKewogIFRSQUNFKCIoKVxuIik7CgogIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7IC8qIE9sZVNldENsaXBib2FyZChOVUxMKTsgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklHZXRGcm9tQ2xpcGJvYXJkCShBVklGSUwzMi5AKQogKi8KSFJFU1VMVCBXSU5BUEkgQVZJR2V0RnJvbUNsaXBib2FyZChQQVZJRklMRSAqcHBmaWxlKQp7CiAgRklYTUUoIiglcCksIHN0dWIhXG4iLCBwcGZpbGUpOwoKICAqcHBmaWxlID0gTlVMTDsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgQVZJTWFrZVN0cmVhbUZyb21DbGlwYm9hcmQgKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklNYWtlU3RyZWFtRnJvbUNsaXBib2FyZChVSU5UIGNmRm9ybWF0LCBIQU5ETEUgaEdsb2JhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFWSVNUUkVBTSAqIHBwc3RyZWFtKQp7CiAgRklYTUUoIigweCUwOHgsJXAsJXApLCBzdHViIVxuIiwgY2ZGb3JtYXQsIGhHbG9iYWwsIHBwc3RyZWFtKTsKCiAgaWYgKHBwc3RyZWFtID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBVklQdXRGaWxlT25DbGlwYm9hcmQJKEFWSUZJTDMyLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBBVklQdXRGaWxlT25DbGlwYm9hcmQoUEFWSUZJTEUgcGZpbGUpCnsKICBGSVhNRSgiKCVwKSwgc3R1YiFcbiIsIHBmaWxlKTsKCiAgaWYgKHBmaWxlID09IE5VTEwpCiAgICByZXR1cm4gQVZJRVJSX0JBREhBTkRMRTsKCiAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQoKSFJFU1VMVCBXSU5BUElWIEFWSVNhdmVBKExQQ1NUUiBzekZpbGUsIENMU0lEICogcGNsc2lkSGFuZGxlciwgQVZJU0FWRUNBTExCQUNLIGxwZm5DYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJlYW1zLCBQQVZJU1RSRUFNIHBhdmksIExQQVZJQ09NUFJFU1NPUFRJT05TIGxwT3B0aW9ucywgLi4uKQp7CiAgICBGSVhNRSgiKCVzLCVwLCVwLDB4JTA4eCwlcCwlcCksIHN0dWIhXG4iLCBkZWJ1Z3N0cl9hKHN6RmlsZSksIHBjbHNpZEhhbmRsZXIsIGxwZm5DYWxsYmFjaywKICAgICAgICAgIG5TdHJlYW1zLCBwYXZpLCBscE9wdGlvbnMpOwoKICAgIHJldHVybiBBVklFUlJfVU5TVVBQT1JURUQ7Cn0KCkhSRVNVTFQgV0lOQVBJViBBVklTYXZlVyhMUENXU1RSIHN6RmlsZSwgQ0xTSUQgKiBwY2xzaWRIYW5kbGVyLCBBVklTQVZFQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0cmVhbXMsIFBBVklTVFJFQU0gcGF2aSwgTFBBVklDT01QUkVTU09QVElPTlMgbHBPcHRpb25zLCAuLi4pCnsKICAgIEZJWE1FKCIoJXMsJXAsJXAsMHglMDh4LCVwLCVwKSwgc3R1YiFcbiIsIGRlYnVnc3RyX3coc3pGaWxlKSwgcGNsc2lkSGFuZGxlciwgbHBmbkNhbGxiYWNrLAogICAgICAgICAgblN0cmVhbXMsIHBhdmksIGxwT3B0aW9ucyk7CgogICAgcmV0dXJuIEFWSUVSUl9VTlNVUFBPUlRFRDsKfQo=