Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBXaXJlbGVzcyBkZXZpY2UgZHJpdmVyIGZvciBMaW51eCAod2xhZ3M0OSkuCiAqCiAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCiAqCiAqIEluaXRpYWxseSBkZXZlbG9wZWQgYnkgVHJpcGxlUG9pbnQsIEluYy4KICogICBodHRwOi8vd3d3LnRyaXBsZXBvaW50LmNvbQogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiAgIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9ucyByZWxhdGVkIHRvIFdFUCBrZXkgY29kaW5nL2RlY29kaW5nLgogKgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBTT0ZUV0FSRSBMSUNFTlNFCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAogKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCiAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgogKgogKiBDb3B5cmlnaHQgqSAyMDAzIEFnZXJlIFN5c3RlbXMgSW5jLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCiAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAogKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIERpc2NsYWltZXIKICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCCTQVMgSVOUIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCiAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQogKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgogKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAogKiBEQU1BR0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDx3bF92ZXJzaW9uLmg+CgojaW5jbHVkZSA8ZGVidWcuaD4KI2luY2x1ZGUgPGhjZi5oPgoKI2luY2x1ZGUgPHdsX2VuYy5oPgoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGdsb2JhbCBkZWZpbml0aW9ucwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWYgREJHCgpleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKCiNlbmRpZiAgLyogREJHICovCgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZXBfY29kZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgYSBzZXQgb2Ygd2VwIGtleXMgZm9yIHByaXZhY3kKICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc3pDcnlwdCAtCiAqICAgICAgc3pEZXN0ICAtCiAqICAgICAgRGF0YSAgICAtCiAqICAgICAgbkxlbiAgICAtCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE9LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF93ZXBfY29kZSggY2hhciAqc3pDcnlwdCwgY2hhciAqc3pEZXN0LCB2b2lkICpEYXRhLCBpbnQgbkxlbiApCnsKICAgIGludCAgICAgaTsKICAgIGludCAgICAgdDsKICAgIGludCAgICAgayA7CiAgICBjaGFyICAgIGJpdHM7CiAgICBjaGFyICAgICpzekRhdGEgPSAoY2hhciAqKSBEYXRhOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICBmb3IoIGkgPSBiaXRzID0gMCA7IGkgPCBNQUNBRERSRVNTX1NUUl9MRU47IGkrKyApIHsKCSAgICBiaXRzIF49IHN6Q3J5cHRbaV07CgkgICAgYml0cyArPSBzekNyeXB0W2ldOwogICAgfQoKICAgIGZvciggaSA9IHQgPSAqc3pEZXN0ID0gMDsgaSA8IG5MZW47IGkrKywgdCsrICkgewoJICAgIGsgPSBzekRhdGFbaV0gXiAoIGJpdHMgKyBpICk7CgoKICAgICAgICBzd2l0Y2goIGkgJSAzICkgewoKICAgICAgICBjYXNlIDAgOgoKICAgICAgICAgICAgc3pEZXN0W3RdICAgPSAoKGsgJiAweEZDKSA+PiAyKSArIENIX1NUQVJUIDsKCQkJc3pEZXN0W3QrMV0gPSAoKGsgJiAweDAzKSA8PCA0KSArIENIX1NUQVJUIDsKCSAgICAgICAgc3pEZXN0W3QrMl0gPSAnXDAnOwoKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIDEgOgoKICAgICAgICAgICAgc3pEZXN0W3RdICArPSAoKCBrICYgMHhGMCApID4+IDQgKTsKCQkJc3pEZXN0W3QrMV0gPSAoKCBrICYgMHgwRiApIDw8IDIgKSArIENIX1NUQVJUIDsKCSAgICAgICAgc3pEZXN0W3QrMl0gPSAnXDAnOwoKICAgICAgICAgICAgYnJlYWs7CgoKICAgICAgICBjYXNlIDIgOgoKICAgICAgICAgICAgc3pEZXN0W3RdICArPSAoKCBrICYgMHhDMCApID4+IDYgKTsKCQkJc3pEZXN0W3QrMV0gPSAoIGsgJiAweDNGICkgKyBDSF9TVEFSVCA7CgkgICAgICAgIHN6RGVzdFt0KzJdID0gJ1wwJzsKCSAgICAgICAgdCsrOwoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiggc3RybGVuKCBzekRlc3QgKSkgOwoKfQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2VwX2RlY29kZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGlzIGZ1bmN0aW9uIGRlY29kZXMgYSBzZXQgb2YgV0VQIGtleXMgZm9yIHVzZSBieSB0aGUgY2FyZC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc3pDcnlwdCAtCiAqICAgICAgc3pEZXN0ICAtCiAqICAgICAgRGF0YSAgICAtCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE9LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF93ZXBfZGVjb2RlKCBjaGFyICpzekNyeXB0LCB2b2lkICpEZXN0LCBjaGFyICpzekRhdGEgKQp7CiAgICBpbnQgICAgIGk7CiAgICBpbnQgICAgIHQ7CiAgICBpbnQgICAgIG5MZW47CiAgICBjaGFyICAgIGJpdHM7CiAgICBjaGFyICAgICpzekRlc3QgPSBEZXN0OwogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogIGZvciggaSA9IGJpdHMgPSAwIDsgaSA8IDEyOyBpKysgKSB7CiAgICAgIGJpdHMgXj0gc3pDcnlwdFtpXSA7CiAgICAgIGJpdHMgKz0gc3pDcnlwdFtpXSA7CiAgfQoKICBuTGVuID0gKCBzdHJsZW4oIHN6RGF0YSApICogMykgLyA0IDsKCiAgZm9yKCBpID0gdCA9IDA7IGkgPCBuTGVuOyBpKyssIHQrKyApIHsKICAgICAgc3dpdGNoKCBpICUgMyApIHsKICAgICAgY2FzZSAwIDoKCiAgICAgICAgICBzekRlc3RbaV0gPSAoKCggc3pEYXRhW3RdLUNIX1NUQVJUICkgJiAweDNmICkgPDwgMiApICsKICAgICAgICAgICAgICAgICAgICAgICgoKCBzekRhdGFbdCsxXS1DSF9TVEFSVCApICYgMHgzMCApID4+IDQgKTsKCSAgICAgIGJyZWFrOwoKCiAgICAgIGNhc2UgMSA6CiAgICAgICAgICBzekRlc3RbaV0gPSAoKCggc3pEYXRhW3RdLUNIX1NUQVJUICkgJiAweDBmICkgPDwgNCApICsKICAgICAgICAgICAgICAgICAgICAgICgoKCBzekRhdGFbdCsxXS1DSF9TVEFSVCApICYgMHgzYyApID4+IDIgKTsKCSAgICAgIGJyZWFrOwoKCiAgICAgIGNhc2UgMiA6CiAgICAgICAgICBzekRlc3RbaV0gPSAoKCggc3pEYXRhW3RdLUNIX1NUQVJUICkgJiAweDAzICkgPDwgNiApICsKICAgICAgICAgICAgICAgICAgICAgICAoKCBzekRhdGFbdCsxXS1DSF9TVEFSVCApICYgMHgzZiApOwoJICAgICAgdCsrOwoJICAgICAgYnJlYWs7CiAgICAgIH0KCglzekRlc3RbaV0gXj0gKCBiaXRzICsgaSApIDsKCiAgfQoKICByZXR1cm4oIGkgKSA7Cgp9Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgo=