From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bio.cse.psu.edu ([130.203.12.17]) by hawkwind.utcs.toronto.edu with SMTP id <26700>; Fri, 26 May 2000 15:14:48 -0400 Received: (qmail 24795 invoked by uid 991); 25 May 2000 19:37:07 -0000 Message-ID: <20000525193707.24793.qmail@g.bio.cse.psu.edu> To: sam-fans@hawkwind.utcs.toronto.edu Subject: new sam for unix MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <24790.959283335.0@bio.cse.psu.edu> Date: Thu, 25 May 2000 15:37:07 -0400 From: Scott Schwartz ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <24790.959283335.1@bio.cse.psu.edu> Hi all, Rob Pike was kind enough to send me the source for the new sam, and I've gone through and made the changes necessary to get it to compile under unix. I found one bug in the process, so I hope everyone else will look things over carefully too. The changes: - replaced anonymous unions with ansi-std ones. - used a plan9-flavor print library instead of stdio (mostly). - the sam err file in tmp is now given a unique name, to avoid symlink races. mktemp used where necessary. - all plumbing is stubbed out. maybe we can revisit this after the next edition of plan 9 is published. This version appears to work with samterm, but it does exercise what I think is a problem with the X11 version of that. If I create a large file, all lines the same length, and make a global substitution, and then repeatedly undo and redo, samterm appears to miss some characters. ------- =_aaaaaaaaaa0 Content-Type: application/octet-stream Content-ID: <24790.959283335.2@bio.cse.psu.edu> Content-Description: sam.tar.gz Content-Transfer-Encoding: base64 c2FtMmsvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMTcz NwAwMDAwMTUxADAwMDAwMDAwMDAwADA3MTEyMDI3MTIxADAwMTI3NTQANQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAw MjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABz YW0yay9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAxNzM3 ADAwMDAxNTEAMDAwMDAwMDAyMDYAMDcxMTIwMjcyMDYAMDAxNDQxMwAwAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAwMDAy NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFs bDoKCWNkIGxpYjsgbWFrZSAKCWNkIHNhbTsgbWFrZQoKY2xlYW46CgljZCBsaWI7IG1ha2UgY2xl YW4KCWNkIHNhbTsgbWFrZSBjbGVhbgoKdGFyOiBjbGVhbgoJdGFyIC1jdmYgLi4vc2FtMmstdW5p eC50YXIgLUMgLi4gc2FtMmsKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2Ft MmsvaW5jbHVkZS8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMTczNwAw MDAwMTUxADAwMDAwMDAwMDAwADA3MTEyMDI3MTE0ADAwMTQ0MDEANQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzYW0y ay9pbmNsdWRlL2xpYmMuaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAxNzM3ADAw MDAxNTEAMDAwMDAwMDI2MDQAMDcxMTE2NDAwNDMAMDAxNTQ2MwAwAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAABnY3NlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAwMDAyNwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNpZm5k ZWYgTElCQzlfSAojZGVmaW5lIExJQkM5X0gKCi8qIENvcHlyaWdodCAoYykgMTk5MiBBVCZUIC0g QWxsIHJpZ2h0cyByZXNlcnZlZC4gKi8KLyogQ2hhbmdlcyBieSBTY290dCBTY2h3YXJ0eiwgMjAw MCAqLwoKCS8qIFBsYW4gOSBDIGxpYnJhcnkgaW50ZXJmYWNlICovCgojZGVmaW5lCWR1cChhLGIp CQkJZHVwMihhLGIpCiNkZWZpbmUJc2VlayhhLGIsYykJCQlsc2VlayhhLGIsYykKI2RlZmluZQll eGVjKGEsYikJCQlleGVjdihhLGIpCiNkZWZpbmUJZ2V0d2QoYSxiKQkJCWdldGN3ZChhLGIpCiNk ZWZpbmUJVVNFRChhKQojZGVmaW5lIFNFVChhKQoKZW51bQp7CglPUkVBRAk9CTAsCQkvKiBvcGVu IGZvciByZWFkICovCglPV1JJVEUJPQkxLAkJLyogb3BlbiBmb3Igd3JpdGUgKi8KCU9SRFdSCT0J MiwJCS8qIG9wZW4gZm9yIHJlYWQvd3JpdGUgKi8KCUVSUkxFTgk9CTY0CQkvKiBsZW5ndGggb2Yg ZXJyb3IgbWVzc2FnZSAqLwoJLE9DRVhFQwk9CTQKCSxPUkNMT1NFID0JOAoJLERJUkxFTiAgPSAg ICA4MTkyCn07CgplbnVtCnsKCVVURm1heAkJPSAzLAkJLyogbWF4aW11bSBieXRlcyBwZXIgcnVu ZSAqLwoJUnVuZXN5bmMJPSAweDgwLAkJLyogY2Fubm90IHJlcHJlc2VudCBwYXJ0IG9mIGEgdXRm IHNlcXVlbmNlICg8KSAqLwoJUnVuZXNlbGYJPSAweDgwLAkJLyogcnVuZSBhbmQgdXRmIHNlcXVl bmNlcyBhcmUgdGhlIHNhbWUgKDwpICovCglSdW5lZXJyb3IJPSAweDgwCQkvKiBkZWNvZGluZyBl cnJvciBpbiB1dGYgKi8KfTsKCi8qCiAqIG5ldyBydW5lIHJvdXRpbmVzCiAqLwpleHRlcm4JaW50 CXJ1bmV0b2NoYXIoY2hhciosIFJ1bmUqKTsKZXh0ZXJuCWludAljaGFydG9ydW5lKFJ1bmUqLCBj aGFyKik7CmV4dGVybglpbnQJcnVuZWxlbihsb25nKTsKZXh0ZXJuCWludAlmdWxscnVuZShjaGFy KiwgaW50KTsKCi8qCiAqIHJ1bmUgcm91dGluZXMgZnJvbSBjb252ZXJ0ZWQgc3RyIHJvdXRpbmVz CiAqLwpleHRlcm4JbG9uZwl1dGZsZW4oY2hhciopOwkJLyogd2FzIGNvdW50cnVuZSAqLwpleHRl cm4JY2hhcioJdXRmcnVuZShjaGFyKiwgbG9uZyk7CmV4dGVybgljaGFyKgl1dGZycnVuZShjaGFy KiwgbG9uZyk7CmV4dGVybgljaGFyKgl1dGZ1dGYoY2hhciosIGNoYXIqKTsKLyoKICoJTWlzY2Vs bGFuZW91cyBmdW5jdGlvbnMKICovCi8qZXh0ZXJuCXZvaWQJZnByaW50KGludCwgY2hhciAqLCAu Li4pOyovCmV4dGVybglpbnQJbm90aWZ5ICh2b2lkKCopKHZvaWQgKiwgY2hhciAqKSk7CmV4dGVy bglpbnQJZXJyc3RyKGNoYXIgKik7CmV4dGVybgljaGFyKglnZXR1c2VyKHZvaWQpOwpleHRlcm4J dm9pZAlleGl0cyhjaGFyKik7CmV4dGVybgl2b2lkCV9leGl0cyhjaGFyKik7CmV4dGVybiAgaW50 ICAgICBjcmVhdGUoY2hhciAqLCBpbnQsIGludCk7CgojZW5kaWYKAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL2lu Y2x1ZGUvdS5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1 MQAwMDAwMDAwNTUzNgAwNzExMTY0NjYyMgAwMDE1MDM2ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2lmbmRlZiBV OV9ICiNkZWZpbmUgVTlfSAovKiBDb3B5cmlnaHQgKGMpIDE5OTIgQVQmVCAtIEFsbCByaWdodHMg cmVzZXJ2ZWQuICovCi8qIENoYW5nZXMgMjAwMCBieSBTY290dCBTY2h3YXJ0eiAqLwoKLyogRGVm aW5pdGlvbnMgZnJvbSB0aGUgdW5kZXJseWluZyBzeXN0ZW0sIHRvIHN1cHBvcnQgdGhlCiAgIFBs YW4gOSBpbnRlcmZhY2VzIGRlc2NyaWJlZCBsaWJjLmggKi8KCiNpbmNsdWRlIDx1bmlzdGQuaD4K I2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5 cy9zdGF0Lmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVk ZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNs dWRlIDxzZXRqbXAuaD4KI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNs dWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGFzc2VydC5oPgogCiNp bmNsdWRlICJwcmludC5oIgoKCS8qIFN5c3RlbSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8K CiNkZWZpbmUgbmlsIDAKdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICAgICB1Y2hhcjsKdHlw ZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBSdW5lOwoKI2lmZGVmCVNZU1ZSMwojaW5jbHVk ZQk8bWFsbG9jLmg+CnR5cGVkZWYJdW5zaWduZWQgc2hvcnQJdXNob3J0Owp0eXBlZGVmIHVuc2ln bmVkIGxvbmcJdWxvbmc7CiNkZWZpbmUJcmVtb3ZlKHYpCQkJdW5saW5rKHYpCiNkZWZpbmUJV0VY SVRTVEFUVVMocykJCQkoKChzKT4+OCkmMHhGRikKZXh0ZXJuCWNoYXIgKmdldGVudihjaGFyKik7 CmV4dGVybgljaGFyICpnZXRsb2dpbih2b2lkKTsKZXh0ZXJuCWNoYXIgKnN0cmVycm9yKGludCk7 CmV4dGVybgl2b2lkICptZW1tb3ZlKHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKI2RlZmlu ZQlORUVETUVNTU9WRQojZGVmaW5lCU5FRURTVFJFUlJPUgojZGVmaW5lCU5FRURWQVJBUkcKI2Vu ZGlmCS8qIFNZU1ZSMyAqLwoKI2lmZGVmCUlSSVg1CnR5cGVkZWYJdW5zaWduZWQgc2hvcnQJdXNo b3J0Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcJdWxvbmc7CiNlbmRpZgkvKiBJUklYNSAqLwoKI2lm ZGVmCUlSSVgKZXh0ZXJuCXZvaWQgKm1lbW1vdmUodm9pZCosIGNvbnN0IHZvaWQqLCBzaXplX3Qp OwojZGVmaW5lCU5FRURNRU1NT1ZFCiNlbmRpZgkvKiBJUklYICovCgojaWZkZWYJVU1JUFMKdHlw ZWRlZiB1bnNpZ25lZCBsb25nCXVsb25nOwp0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXVzaG9ydDsK I2RlZmluZQljb25zdAkJCS8qIG1pcHMgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IGNvbnN0ICov CmV4dGVybgljaGFyICpzdHJlcnJvcihpbnQpOwpleHRlcm4Jdm9pZCAqbWVtbW92ZSh2b2lkKiwg Y29uc3Qgdm9pZCosIHNpemVfdCk7CiNkZWZpbmUJTkVFRE1FTU1PVkUKI2RlZmluZQlORUVEU1RS RVJST1IKI2RlZmluZQlORUVEVkFSQVJHCiNkZWZpbmUJTk9GSUZPCQkJLyogdHVybiBvZmYgZXhz dGFydCBpbiBzYW10ZXJtL3VuaXguYyAqLwojZW5kaWYJLyogVU1JUFMgKi8KCiNpZmRlZglTVU5P Uwp0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXVzaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nCXVs b25nOwpleHRlcm4JY2hhciAqc3RyZXJyb3IoaW50KTsKZXh0ZXJuCXZvaWQgKm1lbW1vdmUodm9p ZCosIGNvbnN0IHZvaWQqLCBzaXplX3QpOwpleHRlcm4Jdm9pZCAqbWVtY3B5KHZvaWQqLCBjb25z dCB2b2lkKiwgc2l6ZV90KTsKI2RlZmluZQlORUVETUVNTU9WRQojZGVmaW5lCU5FRURTVFJFUlJP UgojZW5kaWYJLyogU1VOT1MgKi8KCiNpZmRlZglTT0xBUklTCnR5cGVkZWYJdW5zaWduZWQgc2hv cnQJdXNob3J0Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcJdWxvbmc7CiNlbmRpZgoKI2lmZGVmCUFJ WAp0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXVzaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nCXVs b25nOwojZW5kaWYJLyogQUlYICovCgojaWZkZWYJT1NGMQp0eXBlZGVmCXVuc2lnbmVkIHNob3J0 CXVzaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nCXVsb25nOwpleHRlcm4Jdm9pZCAqbWVtbW92 ZSh2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CiNlbmRpZgkvKiBPU0YxICovCgojaWZkZWYg IEhQVVgKdHlwZWRlZgl1bnNpZ25lZCBzaG9ydAl1c2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQgbG9u Zwl1bG9uZzsKI2RlZmluZQlORUVEU1RSRVJST1IKI2VuZGlmICAvKiBIUFVYICovCgojaWZkZWYg IEFQT0xMTwp0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXVzaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBs b25nCXVsb25nOwojZW5kaWYgIC8qIEFQT0xMTyAqLwoKI2lmZGVmICBDT05WRVgKdHlwZWRlZiB1 bnNpZ25lZCBsb25nCXVsb25nOwojZW5kaWYgIC8qIENPTlZFWCAqLwoKI2lmZGVmICBEWU5JWAoj ZGVmaW5lCVNJR19FUlIJCUJBRFNJRwojZGVmaW5lCU5FRURNRU1NT1ZFCiNkZWZpbmUJcmVtb3Zl KHYpCQkJdW5saW5rKHYpCiNkZWZpbmUJV0VYSVRTVEFUVVMocykJCQkoKChzKT4+OCkmMHhGRikK I2RlZmluZQlORUVETUVNTU9WRQojZGVmaW5lCU5PRklGTwkJCS8qIHR1cm4gb2ZmIGV4c3RhcnQg aW4gc2FtdGVybS91bml4LmMgKi8KI2VuZGlmICAvKiBEWU5JWCAqLwoKI2lmZGVmCVBUWAp0eXBl ZGVmCXVuc2lnbmVkIHNob3J0CXVzaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nCXVsb25nOwoj ZW5kaWYJLyogUFRYICovCgojaWZkZWYJQlNEaQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICB1bG9u ZzsKI2VuZGlmCS8qIEJTRGkgKi8KCiNpZmRlZgl2MTAKdHlwZWRlZgl1bnNpZ25lZCBzaG9ydAl1 c2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQgbG9uZwl1bG9uZzsKI2VuZGlmCgojZW5kaWYKAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvaW5jbHVkZS9w bHVtYi5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAw MDAwNDY3ADA3MTExNjQ2NTI3ADAwMTU3MTMAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2Nz ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaWZuZGVmIFNBTV9QTFVN Ql9ICiNkZWZpbmUgU0FNX1BMVU1CX0gKCnR5cGVkZWYgc3RydWN0IFBsdW1ibXNnIFBsdW1ibXNn OwoKc3RydWN0IFBsdW1ibXNnIHsKCWNoYXIgKnNyYzsKCWNoYXIgKmRzdDsKCWNoYXIgKndkaXI7 CgljaGFyICp0eXBlOwoJY2hhciAqYXR0cjsKCWNoYXIgKmRhdGE7CglpbnQgbmRhdGE7Cn07Cgpj aGFyICpwbHVtYnVucGFja2F0dHIoY2hhciopOwpjaGFyICpwbHVtYnBhY2soUGx1bWJtc2cgKiwg aW50ICopOwppbnQgcGx1bWJmcmVlKFBsdW1ibXNnICopOwpjaGFyICpjbGVhbm5hbWUoY2hhciop OwoKI2VuZGlmCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL2luY2x1ZGUvcHJp bnQuaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNDQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAw NTE3MgAwNzExMTQyNzQzNgAwMDE1NzIwADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyogZnJvbSByYyAxLjQgLSBj b2RlIGJ5IEJ5cm9uIGFuZCBQYXVsIGFuZCBTY290dCAqLwojaWZuZGVmIF9fbmljZXJfcHJpbnRf aAojZGVmaW5lIF9fbmljZXJfcHJpbnRfaAoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2lmbmRlZiBT SVpFX1QKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBTSVpFX1Q7CiNlbmRpZgoKZW51bSB7CiAg LyogcmV0dXJuIHZhbHVlcyBvZiBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwogIEZNVF9mbGFnID0g MCwJCQkvKiB1aGwjLS5bMC05XSAqLwogIEZNVF92ZXJiID0gMSwJCQkvKiBzY2RveHIgKi8KICBG TVRfZXJyb3IgPSAyLCAgCQkvKiBlcnJvciBkdXJpbmcgZm9ybWF0dGluZyAqLwoKICAvKiBzaXpl cyBvZiB2YXJpb3VzIHRoaW5ncyAqLwogIEZNVF9NQVhDT05WID0gMjU2LAkgIAkvKiBudW1iZXIg b2YgY29udmVyc2lvbiBjaGFyYWN0ZXJzICovCiAgRk1UX1BSSU5UX0FMTE9DU0laRSA9IDY0LAkv KiBncm93IGJ5IHRoaXMgbWFueSBieXRlcyB3aGVuIG5lY2Vzc2FyeSAqLwogIEZNVF9TUFJJTlRf QlVGU0laID0gMTAyNAkvKiBieXRlcyAqLwp9OwoKdHlwZWRlZiBjaGFyKiAoKkFsbG9jKShjaGFy ICosIFNJWkVfVCk7Cgp0eXBlZGVmIHN0cnVjdCBGb3JtYXQgRm9ybWF0Owp0eXBlZGVmIGludCAo KkZtdGNvbnYpKEZvcm1hdCAqLCBpbnQpOwoKc3RydWN0IEZvcm1hdCB7CgkvKiBmb3IgdGhlIGZv cm1hdHRpbmcgcm91dGluZXMgKi8KCXZhX2xpc3QgYXJnczsKCWxvbmcgZmxhZ3MsIGYxLCBmMjsK CUZtdGNvbnYqIGZtdHRhYjsKCS8qIGZvciB0aGUgYnVmZmVyIG1haW50YWluZW5jZSByb3V0aW5l cyAqLwoJY2hhciAqYnVmLCAqYnVmYmVnaW4sICpidWZlbmQ7CglpbnQgZmx1c2hlZDsKCWludCAo Kmdyb3cpKEZvcm1hdCAqLCBTSVpFX1QpOwoJaW50IGVycm9yOwoJaW50IHJlcWxlbjsKCXVuaW9u IHsgaW50IG47IHZvaWQgKnA7IH0gdTsKCS8qIGZvciB0aGUgc2FrZSBvZiByZWVudHJhbmN5ICov Cgl2b2lkKiBjbGllbnRfZGF0YTsKfTsKCi8qIEZvcm1hdC0+ZmxhZ3MgdmFsdWVzICovCmVudW0g ewoJRk1UX2xvbmcJPSAoMTw8MCksCS8qICVsICovCglGTVRfc2hvcnQJPSAoMTw8MSksCS8qICVo ICovCglGTVRfdW5zaWduZWQJPSAoMTw8MiksCS8qICV1ICovCglGTVRfemVyb3BhZAk9ICgxPDwz KSwJLyogJTAgKi8KCUZNVF9sZWZ0c2lkZQk9ICgxPDw0KSwJLyogJS0gKi8KCUZNVF9hbHRmb3Jt CT0gKDE8PDUpLAkvKiAlIyAqLwoJRk1UX2Yxc2V0CT0gKDE8PDYpLAkvKiAlPG4+ICovCglGTVRf ZjJzZXQJPSAoMTw8NykJLyogJS48bj4gKi8KfTsKCmV4dGVybiBpbnQgZm10cHV0YyhGb3JtYXQg KmYsIGNvbnN0IGNoYXIgYyk7CmV4dGVybiBpbnQgZm10YXBwZW5kKEZvcm1hdCAqZm9ybWF0LCBj b25zdCBjaGFyICpzLCBTSVpFX1QgbGVuKTsKZXh0ZXJuIGludCBmbXRjYXQoRm9ybWF0ICpmb3Jt YXQsIGNvbnN0IGNoYXIgKnMpOwpleHRlcm4gRm10Y29udiBmbXRpbnN0YWxsKGludCBjLCBGbXRj b252IGYpOwpleHRlcm4gaW50IGZtdGVuZ2luZShGb3JtYXQgKmZvcm1hdCwgY29uc3QgY2hhciAq Zm10KTsKZXh0ZXJuIGludCBmbXRwcmludChGb3JtYXQgKmZvcm1hdCwgY29uc3QgY2hhciAqZm10 LC4uLik7CmV4dGVybiBpbnQgZm10X2ZwcmludF9mbHVzaCAoRm9ybWF0ICpmb3JtYXQsIFNJWkVf VCBtb3JlKTsKZXh0ZXJuIGludCB2ZnByaW50KGludCBmZCwgY29uc3QgY2hhciAqZm10LCB2YV9s aXN0IGFwKTsKZXh0ZXJuIGludCBmcHJpbnQoaW50IGZkLCBjb25zdCBjaGFyICpmbXQsLi4uKTsK ZXh0ZXJuIGludCBwcmludChjb25zdCBjaGFyICpmbXQsLi4uKTsKZXh0ZXJuIGludCBlcHJpbnQo Y29uc3QgY2hhciAqZm10LC4uLik7CmV4dGVybiBjaGFyICpmbXRfbWVtcHJpbnQgKEZvcm1hdCAq Zm9ybWF0LCBjb25zdCBjaGFyICpmbXQsIFNJWkVfVCogbGVuKTsKZXh0ZXJuIGludCBmbXRfbWVt cHJpbnRfZ3JvdyAoRm9ybWF0ICpmb3JtYXQsIFNJWkVfVCBtb3JlKTsKZXh0ZXJuIGNoYXIgKnZz bXByaW50IChBbGxvYyBhLCBTSVpFX1QqIGxlbiwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFw KTsKZXh0ZXJuIGNoYXIgKnNtcHJpbnQgKEFsbG9jIGFsbG9jLCBTSVpFX1QqIGxlbiwgY29uc3Qg Y2hhciogZm10LCAuLi4pOwpleHRlcm4gaW50IGZtdF9zbnByaW50X2dyb3cgKEZvcm1hdCAqZm9y bWF0LCBTSVpFX1QgbW9yZSk7CmV4dGVybiBjaGFyKiBwYWxsb2MgKGNoYXIqIHAsIFNJWkVfVCBz aXplKTsKZXh0ZXJuIGNoYXIgKm1wcmludChjb25zdCBjaGFyICpmbXQsLi4uKTsKZXh0ZXJuIGlu dCB2c25wcmludChjaGFyICpidWYsIGludCBidWZsZW4sIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlz dCBhcCk7CmV4dGVybiBpbnQgc25wcmludChjaGFyICpidWYsIGludCBidWZsZW4sIGNvbnN0IGNo YXIgKmZtdCwuLi4pOwpleHRlcm4gaW50IHNwcmludChjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZt dCwuLi4pOwoKZXh0ZXJuIGludCBwcmludF9pbmFkZHJfY29udiAoRm9ybWF0KiwgaW50KTsKZXh0 ZXJuIGludCBwcmludF9jcXVvdGVfY29udiAoRm9ybWF0KiwgaW50KTsKZXh0ZXJuIGludCBwcmlu dF9yY3F1b3RlX2NvbnYgKEZvcm1hdCosIGludCk7CgpleHRlcm4gdm9pZCBmbXRfaW5zdGFsbF9y dW5lY29udiAoKTsKCiNlbmRpZiAvKiBfX25pY2VyX3ByaW50X2ggKi8KAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvaW5jbHVkZS91bml4LmgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDAxMTIzADA3 MTEyMDMwNDYzADAwMTU1MzAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaWZuZGVmIFNBTV9VTklYX0gKI2RlZmlu ZSBTQU1fVU5JWF9ICgojaWZuZGVmIFJTQU1OQU1FCiNkZWZpbmUgUlNBTU5BTUUgInNhbSIKI2Vu ZGlmCiNpZm5kZWYgVEVSTU5BTUUKI2RlZmluZSBURVJNTkFNRSAiL3Vzci9sb2NhbC9iaW4vc2Ft dGVybSIKI2VuZGlmCiNpZm5kZWYgSE9NRURJUgojZGVmaW5lIEhPTUVESVIgICJIT01FIgojZW5k aWYKI2lmbmRlZiBUTVAKI2RlZmluZSBUTVAgICAgICAiL3RtcCIKI2VuZGlmCiNpZm5kZWYgU0hF TExOQU1FCiNkZWZpbmUgU0hFTExOQU1FICJzaCIKI2VuZGlmCiNpZm5kZWYgU0hFTExQQVRICiNk ZWZpbmUgU0hFTExQQVRIICIvYmluL3NoIgojZW5kaWYKI2lmbmRlZiBSWE5BTUUKI2RlZmluZSBS WE5BTUUgInNzaCIKI2VuZGlmCiNpZm5kZWYgUlhQQVRITkFNRQojZGVmaW5lIFJYUEFUSE5BTUUg Ii91c3IvbG9jYWwvYmluL3NzaCIKI2VuZGlmCiNpZm5kZWYgU0FNU0FWRURJUgojZGVmaW5lIFNB TVNBVkVESVIgIi91c3IvbG9jYWwvYmluIgojZW5kaWYKI2lmbmRlZiBTQU1TQVZFCiNkZWZpbmUg U0FNU0FWRSAiL2Jpbi9zaFxuIiBTQU1TQVZFRElSICIvc2Ftc2F2ZSIKI2VuZGlmCgojZW5kaWYK AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvbGliLwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAwNDA3NTUAMDAwMTczNwAwMDAwMTUxADAwMDAwMDAwMDAwADA3MTEy MTE3NzI2ADAwMTM1MzUANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzYW0yay9saWIvcnVuZS5jAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAxNzM3ADAwMDAxNTEAMDAwMDAwMDUyNzYAMDcxMTE2 MzcyNDcAMDAxNDY2NQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAwMDAyNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8qIENvcHlyaWdodCAoYykgMTk5MiBBVCZUIC0g QWxsIHJpZ2h0cyByZXNlcnZlZC4gKi8KI2luY2x1ZGUJPHUuaD4KI2luY2x1ZGUJPGxpYmMuaD4K CmVudW0KewoJQml0MQk9IDcsCglCaXR4CT0gNiwKCUJpdDIJPSA1LAoJQml0Mwk9IDQsCglCaXQ0 CT0gMywKCglUMQk9ICgoMTw8KEJpdDErMSkpLTEpIF4gMHhGRiwJLyogMDAwMCAwMDAwICovCglU eAk9ICgoMTw8KEJpdHgrMSkpLTEpIF4gMHhGRiwJLyogMTAwMCAwMDAwICovCglUMgk9ICgoMTw8 KEJpdDIrMSkpLTEpIF4gMHhGRiwJLyogMTEwMCAwMDAwICovCglUMwk9ICgoMTw8KEJpdDMrMSkp LTEpIF4gMHhGRiwJLyogMTExMCAwMDAwICovCglUNAk9ICgoMTw8KEJpdDQrMSkpLTEpIF4gMHhG RiwJLyogMTExMSAwMDAwICovCgoJUnVuZTEJPSAoMTw8KEJpdDErMCpCaXR4KSktMSwJCS8qIDAw MDAgMDAwMCAwMTExIDExMTEgKi8KCVJ1bmUyCT0gKDE8PChCaXQyKzEqQml0eCkpLTEsCQkvKiAw MDAwIDAxMTEgMTExMSAxMTExICovCglSdW5lMwk9ICgxPDwoQml0MysyKkJpdHgpKS0xLAkJLyog MTExMSAxMTExIDExMTEgMTExMSAqLwoKCU1hc2t4CT0gKDE8PEJpdHgpLTEsCQkJLyogMDAxMSAx MTExICovCglUZXN0eAk9IE1hc2t4IF4gMHhGRiwJCQkvKiAxMTAwIDAwMDAgKi8KCglCYWQJPSBS dW5lZXJyb3IKfTsKCmludApjaGFydG9ydW5lKFJ1bmUgKnJ1bmUsIGNoYXIgKnN0cikKewoJaW50 IGMsIGMxLCBjMjsKCWxvbmcgbDsKCgkvKgoJICogb25lIGNoYXJhY3RlciBzZXF1ZW5jZQoJICoJ MDAwMDAtMDAwN0YgPT4gVDEKCSAqLwoJYyA9ICoodWNoYXIqKXN0cjsKCWlmKGMgPCBUeCkgewoJ CSpydW5lID0gYzsKCQlyZXR1cm4gMTsKCX0KCgkvKgoJICogdHdvIGNoYXJhY3RlciBzZXF1ZW5j ZQoJICoJMDA4MC0wN0ZGID0+IFQyIFR4CgkgKi8KCWMxID0gKih1Y2hhciopKHN0cisxKSBeIFR4 OwoJaWYoYzEgJiBUZXN0eCkKCQlnb3RvIGJhZDsKCWlmKGMgPCBUMykgewoJCWlmKGMgPCBUMikK CQkJZ290byBiYWQ7CgkJbCA9ICgoYyA8PCBCaXR4KSB8IGMxKSAmIFJ1bmUyOwoJCWlmKGwgPD0g UnVuZTEpCgkJCWdvdG8gYmFkOwoJCSpydW5lID0gbDsKCQlyZXR1cm4gMjsKCX0KCgkvKgoJICog dGhyZWUgY2hhcmFjdGVyIHNlcXVlbmNlCgkgKgkwODAwLUZGRkYgPT4gVDMgVHggVHgKCSAqLwoJ YzIgPSAqKHVjaGFyKikoc3RyKzIpIF4gVHg7CglpZihjMiAmIFRlc3R4KQoJCWdvdG8gYmFkOwoJ aWYoYyA8IFQ0KSB7CgkJbCA9ICgoKChjIDw8IEJpdHgpIHwgYzEpIDw8IEJpdHgpIHwgYzIpICYg UnVuZTM7CgkJaWYobCA8PSBSdW5lMikKCQkJZ290byBiYWQ7CgkJKnJ1bmUgPSBsOwoJCXJldHVy biAzOwoJfQoKCS8qCgkgKiBiYWQgZGVjb2RpbmcKCSAqLwpiYWQ6CgkqcnVuZSA9IEJhZDsKCXJl dHVybiAxOwp9CgppbnQKcnVuZXRvY2hhcihjaGFyICpzdHIsIFJ1bmUgKnJ1bmUpCnsKCWxvbmcg YzsKCgkvKgoJICogb25lIGNoYXJhY3RlciBzZXF1ZW5jZQoJICoJMDAwMDAtMDAwN0YgPT4gMDAt N0YKCSAqLwoJYyA9ICpydW5lOwoJaWYoYyA8PSBSdW5lMSkgewoJCXN0clswXSA9IGM7CgkJcmV0 dXJuIDE7Cgl9CgoJLyoKCSAqIHR3byBjaGFyYWN0ZXIgc2VxdWVuY2UKCSAqCTAwODAtMDdGRiA9 PiBUMiBUeAoJICovCglpZihjIDw9IFJ1bmUyKSB7CgkJc3RyWzBdID0gVDIgfCAoYyA+PiAxKkJp dHgpOwoJCXN0clsxXSA9IFR4IHwgKGMgJiBNYXNreCk7CgkJcmV0dXJuIDI7Cgl9CgoJLyoKCSAq IHRocmVlIGNoYXJhY3RlciBzZXF1ZW5jZQoJICoJMDgwMC1GRkZGID0+IFQzIFR4IFR4CgkgKi8K CXN0clswXSA9IFQzIHwgIChjID4+IDIqQml0eCk7CglzdHJbMV0gPSBUeCB8ICgoYyA+PiAxKkJp dHgpICYgTWFza3gpOwoJc3RyWzJdID0gVHggfCAgKGMgJiBNYXNreCk7CglyZXR1cm4gMzsKfQoK aW50CnJ1bmVsZW4obG9uZyBjKQp7CglSdW5lIHJ1bmU7CgljaGFyIHN0clsxMF07CgoJcnVuZSA9 IGM7CglyZXR1cm4gcnVuZXRvY2hhcihzdHIsICZydW5lKTsKfQoKaW50CmZ1bGxydW5lKGNoYXIg KnN0ciwgaW50IG4pCnsKCWludCBjOwoKCWlmKG4gPiAwKSB7CgkJYyA9ICoodWNoYXIqKXN0cjsK CQlpZihjIDwgVHgpCgkJCXJldHVybiAxOwoJCWlmKG4gPiAxKQoJCQlpZihjIDwgVDMgfHwgbiA+ IDIpCgkJCQlyZXR1cm4gMTsKCX0KCXJldHVybiAwOwp9CgpjaGFyKgp1dGZydW5lKGNoYXIgKnMs IGxvbmcgYykKewoJbG9uZyBjMTsKCVJ1bmUgcjsKCWludCBuOwoKCWlmKGMgPCBSdW5lc3luYykJ CS8qIG5vdCBwYXJ0IG9mIHV0ZiBzZXF1ZW5jZSAqLwoJCXJldHVybiBzdHJjaHIocywgYyk7CgoJ Zm9yKDs7KSB7CgkJYzEgPSAqKHVjaGFyKilzOwoJCWlmKGMxIDwgUnVuZXNlbGYpIHsJLyogb25l IGJ5dGUgcnVuZSAqLwoJCQlpZihjMSA9PSAwKQoJCQkJcmV0dXJuIDA7CgkJCWlmKGMxID09IGMp CgkJCQlyZXR1cm4gczsKCQkJcysrOwoJCQljb250aW51ZTsKCQl9CgkJbiA9IGNoYXJ0b3J1bmUo JnIsIHMpOwoJCWlmKHIgPT0gYykKCQkJcmV0dXJuIHM7CgkJcyArPSBuOwoJfQoJcmV0dXJuIDA7 Cn0KCmxvbmcKdXRmbGVuKGNoYXIgKnMpCnsKCWludCBjOwoJbG9uZyBuOwoJUnVuZSBydW5lOwoK CW4gPSAwOwoJZm9yKDs7KSB7CgkJYyA9ICoodWNoYXIqKXM7CgkJaWYoYyA8IFJ1bmVzZWxmKSB7 CgkJCWlmKGMgPT0gMCkKCQkJCXJldHVybiBuOwoJCQlzKys7CgkJfSBlbHNlCgkJCXMgKz0gY2hh cnRvcnVuZSgmcnVuZSwgcyk7CgkJbisrOwoJfQoJcmV0dXJuIDA7Cn0KAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL2xpYi9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAwMDM0MwAwNzExMjExNjQzNwAw MDE1MTcwADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIA MDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAU1JDPXJ1bmUuYyBtaXNjLmMgcGx1bWIuYyBwcmludC5jIHJ1 bmVjb252LmMKT0JKPXJ1bmUubyBtaXNjLm8gcGx1bWIubyBwcmludC5vIHJ1bmVjb252Lm8KCkNG TEFHUz0tSS4gLUkuLi9pbmNsdWRlCkNDPWdjYyAtV2FsbCAtTzMJIyBHY2MKI0NDPWNjIC14Q0Mg LXYgLWZhc3QJIyBTb2xhcmlzCgoKbGliOiAkKE9CSikKCWFyIGNydiBsaWIuYSAkKE9CSikKCmNs ZWFuOgoJcm0gLWYgKi5vICouYQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABzYW0yay9saWIvcnVuZWNvbnYuYwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAMDEwMDY0NAAwMDAxNzM3ADAwMDAxNTEAMDAwMDAwMDM1MjYAMDcxMTIxMTY2NzQAMDAx NTU0NAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAw c2Nod2FydHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAADAwMDAwNDAAMDAwMDAyNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPSAKIkAoIykkSWQ6 IHJ1bmVjb252LmMsdiAxLjQgMTk5NS8wNy8wNCAxODoyNDo1MiBzY2h3YXJ0eiBFeHAgJCI7Cgov KiBDb250cmlidXRlZCBieSBFcmlrIFF1YW5zdHJvbSA8cXVhbnN0cm9Ac2FydHJlLm1pbmVydmEu YmFoLmNvbT4gKi8KCiNpbmNsdWRlICJwcmludC5oIgoKI2luY2x1ZGUgInUuaCIKI2luY2x1ZGUg ImxpYmMuaCIKCnN0YXRpYyB2b2lkIHBhZCAoRm9ybWF0ICpmb3JtYXQsIFNJWkVfVCBsZW4sIGlu dCBjKSB7CiAgICBkbzsgd2hpbGUgKGxlbi0tICE9IDAgJiYgZm10cHV0YyAoZm9ybWF0LCBjKSk7 Cn0KCnN0YXRpYyBTSVpFX1QgUnVuZWxlbiAoY29uc3QgUnVuZSAqcikgewoJY29uc3QgUnVuZSAq cyA9IHI7Cgl3aGlsZSAoKnIpIHIrKzsKCXJldHVybiByLXM7Cn0KCi8qIGRlbGV0ZSB0aGlzIHdo ZW4geW91IGdldCBhIGRlY2VudCBjb21waWxlciAqLwpzdGF0aWMgUnVuZSBzdHVwaWRbXSA9IHsg OTIzLCAwfTsKCnN0YXRpYyBpbnQgU2NvbnYgKEZvcm1hdCAqZm9ybWF0LCBpbnQgYykgewogICAg U0laRV9UIG1heHJ1bmVzLCBtaW53aWR0aCwgZXh0cmE7CiAgICBSdW5lICpSID0gdmFfYXJnIChm b3JtYXQtPmFyZ3MsIFJ1bmUqKTsKICAgIGNoYXIgc1tVVEZtYXhdOyAKICAgIGludCBpOwoKLyog ICAgaWYgKCFSKSBSID0gTCLOmyI7ICBzb21lIGNvbXBpbGVycyBjaG9rZSBvbiB0aGlzKi8KICAg IGlmICghUikgUiA9IHN0dXBpZDsKCiAgICBpZiAoZm9ybWF0LT5mbGFncyAmIEZNVF9hbHRmb3Jt KSB7CgltYXhydW5lcyA9IChmb3JtYXQtPmZsYWdzICYgRk1UX2Yyc2V0KSA/IGZvcm1hdC0+ZjIg OiBSdW5lbGVuIChSKTsKCS8qIG1heHJ1bmVzIG1heSBvdmVycnVuIFIsICBidXQgdGhpcyB3YXkg d2UgZG9uJ3QgaGF2ZSAKCSAgIHRvIGFzc3VtZSB0aGF0IFIgaXMgbnVsbCB0ZXJtaW5hdGVkIHdo ZW4gZjIgaXMgc2V0LiAqLwogICAgfSBlbHNlIHsKCS8qIGRvIGYyIGxpa2UgcHJpbnRmICovCglt YXhydW5lcyA9IFJ1bmVsZW4gKFIpOwoJaWYgKChmb3JtYXQtPmZsYWdzICYgRk1UX2Yyc2V0KSAm JiAoZm9ybWF0LT5mMiA8IG1heHJ1bmVzKSkKCSAgICBtYXhydW5lcyA9IGZvcm1hdC0+ZjI7CiAg ICB9CgogICAgbWlud2lkdGggPSAoZm9ybWF0LT5mbGFncyAmIEZNVF9mMXNldCkgPyBmb3JtYXQt PmYxIDogbWF4cnVuZXM7CiAgICBleHRyYSA9IChtaW53aWR0aCA+IG1heHJ1bmVzKSA/IG1pbndp ZHRoIC0gbWF4cnVuZXMgOiAwOwoKICAgIGlmIChmb3JtYXQtPmZsYWdzICYgRk1UX2xlZnRzaWRl KSB7Cgl3aGlsZSAobWF4cnVuZXMtLSkgewogICAgCQlpID0gcnVuZXRvY2hhciAocywgUisrKTsK ICAgIAkJZm10YXBwZW5kIChmb3JtYXQsIHMsIGkpOwoJfQoJcGFkIChmb3JtYXQsIGV4dHJhLCAn ICcpOwogICAgfSBlbHNlIHsKCXBhZCAoZm9ybWF0LCBleHRyYSwgJyAnKTsKCXdoaWxlIChtYXhy dW5lcy0tKSB7CiAgICAJCWkgPSBydW5ldG9jaGFyIChzLCBSKyspOwogICAgCQlmbXRhcHBlbmQg KGZvcm1hdCwgcywgaSk7Cgl9CiAgICB9CgkKICAgIHJldHVybiBGTVRfdmVyYjsKfQoKc3RhdGlj IGludCBDY29udiAoRm9ybWF0ICpmb3JtYXQsIGludCBjKSB7CiAgICBSdW5lIHIgPSAodW5zaWdu ZWQgc2hvcnQpIHZhX2FyZyAoZm9ybWF0LT5hcmdzLCBpbnQpOwogICAgY2hhciBzW1VURm1heF07 CiAgICBpbnQgaTsKCiAgICBpID0gcnVuZXRvY2hhciAocywgJnIpOwogICAgZm10YXBwZW5kIChm b3JtYXQsIHMsIGkpOwogICAgcmV0dXJuIEZNVF92ZXJiOwp9Cgp2b2lkIGZtdF9pbnN0YWxsX3J1 bmVjb252ICgpCnsKICAgIGZtdGluc3RhbGwgKCdDJywgQ2NvbnYpOwogICAgZm10aW5zdGFsbCAo J1MnLCBTY29udik7Cn0KCiBtYXhydW5lcyBtYXkgb3ZlcnJ1biBSLCAgYnV0IHRoaXMgd2F5IHdl IGRvbid0IGhhdmUgCgkgICB0byBhc3N1bWUgdGhhdCBSIGlzIG51bGwgdGVybWluYXRlZCB3aGVu IGYyIGlzIHNldC4gKi8KICAgIH0gZWxzZSB7CgkvKiBkbyBmMiBsaWtlIHByaW50ZiAqLwoJbWF4 cnVuZXMgPSBSdW5lbGVuc2FtMmsvbGliL21pc2MuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDAzMzU3ADA3MTExNjUwNjM3ADAwMTQ2NDMA MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdh cnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAvKiBDb3B5cmlnaHQgKGMpIDE5OTIgQVQmVCAtIEFsbCByaWdodHMgcmVz ZXJ2ZWQuICovCi8qIENoYW5nZXMgMjAwMCwgU2NvdHQgU2Nod2FydHogKi8KCiNpbmNsdWRlCTx1 Lmg+CiNpbmNsdWRlCTxsaWJjLmg+Cgp2b2lkCmV4aXRzKGNoYXIgKm1lc3NhZ2UpCnsKCiAgICAg ICAgZXhpdChtZXNzYWdlICE9IDApOwp9ICAgICAgIAogICAgICAgIAp2b2lkCl9leGl0cyhjaGFy ICptZXNzYWdlKQp7ICAgICAgIAogICAgICAgIF9leGl0KG1lc3NhZ2UgIT0gMCk7Cn0KCmludCBl cnJzdHIoY2hhciAqYnVmKQp7CglleHRlcm4gaW50IGVycm5vOwoKCXN0cm5jcHkoYnVmLCBzdHJl cnJvcihlcnJubyksIEVSUkxFTik7CglyZXR1cm4gMTsKfQoKaW50IGNyZWF0ZShjaGFyICpuYW1l LCBpbnQgb21vZGUsIGludCBwZXJtKQp7CiAgICAgICAgaW50IG1vZGU7IAogICAgICAgIGludCBm ZDsKCiAgICAgICAgaWYgKG9tb2RlICYgT1dSSVRFKSBtb2RlID0gT19XUk9OTFk7CiAgICAgICAg ZWxzZSBpZiAob21vZGUgJiBPUkVBRCkgbW9kZSA9IE9fUkRPTkxZOwogICAgICAgIGVsc2UgbW9k ZSA9IE9fUkRXUjsKCiAgICAgICAgaWYgKChmZCA9IG9wZW4obmFtZSwgbW9kZXxPX0NSRUFUfE9f VFJVTkMsIHBlcm0pKSA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4gZmQ7CgogICAgICAgIGlm IChvbW9kZSAmIE9DRVhFQykKICAgICAgICAgICAgICAgIGZjbnRsKGZkLCBGX1NFVEZELCBmY250 bChmZCxGX0dFVEZELDApIHwgRkRfQ0xPRVhFQyk7CiAgICAgICAgCiAgICAgICAgLyogWFhYIC0g bm90IGV4YWN0bHkgcmlnaHQsIGJ1dCBob3BlZnVsbHkgZ29vZCBlbm91Z2guICovCiAgICAgICAg aWYgKG9tb2RlICYgT1JDTE9TRSkKICAgICAgICAgICAgICAgIHJlbW92ZShuYW1lKTsKCiAgICAg ICAgcmV0dXJuIGZkOwp9CgpjaGFyKgpnZXR1c2VyKHZvaWQpCnsKCXN0cnVjdCBwYXNzd2QgKnA7 CgoJc3RhdGljIGNoYXIgKnVzZXIgPSAwOwoKCWlmICghdXNlcikgewoJCXAgPSBnZXRwd3VpZChn ZXR1aWQoKSk7CgkJaWYgKHAgJiYgcC0+cHdfbmFtZSkgewoJCQl1c2VyID0gbWFsbG9jKHN0cmxl bihwLT5wd19uYW1lKSsxKTsKCQkJaWYgKHVzZXIpCgkJCQlzdHJjcHkodXNlciwgcC0+cHdfbmFt ZSk7CgkJfQoJfQoJaWYoIXVzZXIpCgkJdXNlciA9ICJ1bmtub3duIjsKCXJldHVybiB1c2VyOwp9 CgojaWZkZWYgTkVFRFNUUkVSUk9SCmNoYXIgKgpzdHJlcnJvcihpbnQgbikKewoJZXh0ZXJuIGNo YXIgKnN5c19lcnJsaXN0W107CglyZXR1cm4gc3lzX2Vycmxpc3Rbbl07Cn0KI2VuZGlmIC8qIE5F RURTVFJFUlJPUiAqLwoKI2lmZGVmIE5FRURNRU1NT1ZFCi8qCiAqIG1lbWNweSBpcyBwcm9iYWJs eSBmYXN0LCBidXQgbWF5IG5vdCB3b3JrIHdpdGggb3ZlcmxhcAogKi8Kdm9pZCoKbWVtbW92ZSh2 b2lkICphMSwgY29uc3Qgdm9pZCAqYTIsIHNpemVfdCBuKQp7CgljaGFyICpzMTsKCWNvbnN0IGNo YXIgKnMyOwoKCXMxID0gYTE7CglzMiA9IGEyOwoJaWYoczEgPiBzMikKCQlnb3RvIGJhY2s7Cglp ZihzMSArIG4gPD0gczIpCgkJcmV0dXJuIG1lbWNweShhMSwgYTIsIG4pOwoJd2hpbGUobiA+IDAp IHsKCQkqczErKyA9ICpzMisrOwoJCW4tLTsKCX0KCXJldHVybiBhMTsKCmJhY2s6CglzMiArPSBu OwoJaWYoczIgPD0gczEpCgkJcmV0dXJuIG1lbWNweShhMSwgYTIsIG4pOwoJczEgKz0gbjsKCXdo aWxlKG4gPiAwKSB7CgkJKi0tczEgPSAqLS1zMjsKCQluLS07Cgl9CglyZXR1cm4gYTE7Cn0KI2Vu ZGlmIC8qIE5FRURNRU1NT1ZFICovCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHNhbTJrL2xpYi9wcmludC5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAw NDQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAzMTM2NgAwNzExMTQyNzQyNwAwMDE1MDQyADAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAw MDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAALyogcHJpbnQuYyAtLSBmb3JtYXR0ZWQgcHJpbnRpbmcgcm91dGluZXMgKi8KLyog dGhpcyBieSBTY290dCBTY2h3YXJ0eiwgZGVyaXZlZCBmcm9tIFBhdWwgSGFhaHIncyB2ZXJzaW9u IG9mIDEyLzkxICovCgpzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0gCiJAKCMpJElkOiBwcmlu dC5jLHYgMS4zNyAxOTk2LzAxLzE5IDA4OjI3OjE2IHNjaHdhcnR6IEV4cCAkIjsKCiNpbmNsdWRl IDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkYXJnLmg+Ci8qI2lu Y2x1ZGUgIi90bXAvZml4LWFyZ3MuaCIqLwojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxl cnJuby5oPgojaW5jbHVkZSAicHJpbnQuaCIKCiNpZmRlZiBfX0dOVUNfXwpleHRlcm4gdm9pZCAq IG1lbWNweSAodm9pZCAqLCBjb25zdCB2b2lkICosIGxvbmcgdW5zaWduZWQgaW50KTsKI2VuZGlm CgovKgogKiBmdW5jdGlvbnMgZm9yIGluc2VydGluZyBzdHJpbmdzIGluIHRoZSBmb3JtYXQgYnVm ZmVyCiAqLwoKI2lmICFkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgX19TVFJJQ1RfQU5TSV9f CiNkZWZpbmUgaW5saW5lIC8qICovCiNlbmRpZgoKZXh0ZXJuIGludCBmbXRhcHBlbmQgKEZvcm1h dCAqZm9ybWF0LCBjb25zdCBjaGFyICpzLCBTSVpFX1QgbGVuKSB7CiAgICBmb3JtYXQtPnJlcWxl biArPSBsZW47CiAgICBpZiAoZm9ybWF0LT5lcnJvcikKCXJldHVybiAwOwogICAgd2hpbGUgKGxl biA+IGZvcm1hdC0+YnVmZW5kIC0gZm9ybWF0LT5idWYpIHsKCWNvbnN0IFNJWkVfVCBzcGxpdCA9 IGZvcm1hdC0+YnVmZW5kIC0gZm9ybWF0LT5idWY7CgltZW1jcHkgKGZvcm1hdC0+YnVmLCBzLCBz cGxpdCk7Cglmb3JtYXQtPmJ1ZiArPSBzcGxpdDsKCXMgKz0gc3BsaXQ7CglsZW4gLT0gc3BsaXQ7 CglpZiAoKCpmb3JtYXQtPmdyb3cpKGZvcm1hdCwgbGVuKSkKCSAgICByZXR1cm4gMDsKICAgIH0K ICAgIG1lbWNweSAoZm9ybWF0LT5idWYsIHMsIGxlbik7CiAgICBmb3JtYXQtPmJ1ZiArPSBsZW47 CiAgICByZXR1cm4gMTsKfQoKaW5saW5lIGludCBmbXRwdXRjIChGb3JtYXQgKmYsIGNvbnN0IGNo YXIgYykgewogICAgcmV0dXJuIGZtdGFwcGVuZCAoZiwgJmMsIDEpOwp9CgppbmxpbmUgaW50IGZt dGNhdCAoRm9ybWF0ICpmb3JtYXQsIGNvbnN0IGNoYXIgKnMpIHsKICAgIHJldHVybiBmbXRhcHBl bmQgKGZvcm1hdCwgcywgc3RybGVuIChzKSk7Cn0KCi8qCiAqIGNvbnZlcnNpb24gZnVuY3Rpb25z CiAqCXRydWUgcmV0dXJuIC0+IGZsYWcgY2hhbmdlcyBvbmx5LCBub3QgYSBjb252ZXJzaW9uCiAq LwoKI2RlZmluZSBGbGFnKG5hbWUsIGZsYWcpIFwKc3RhdGljIGludCBuYW1lIChGb3JtYXQgKmZv cm1hdCwgaW50IGMpIHsgXAoJZm9ybWF0LT5mbGFncyB8PSBmbGFnOyBcCglyZXR1cm4gRk1UX2Zs YWc7IFwKfQoKRmxhZyAodWNvbnYsCUZNVF91bnNpZ25lZCkKRmxhZyAoaGNvbnYsCUZNVF9zaG9y dCkKRmxhZyAobGNvbnYsCUZNVF9sb25nKQpGbGFnIChhbHRjb252LAlGTVRfYWx0Zm9ybSkKRmxh ZyAobGVmdGNvbnYsCUZNVF9sZWZ0c2lkZSkKRmxhZyAoZG90Y29udiwJRk1UX2Yyc2V0KQoKc3Rh dGljIGludCBkaWdpdGNvbnYgKEZvcm1hdCAqZm9ybWF0LCBpbnQgYykgewogICAgaWYgKGZvcm1h dC0+ZmxhZ3MgJiBGTVRfZjJzZXQpCglmb3JtYXQtPmYyID0gMTAgKiBmb3JtYXQtPmYyICsgYyAt ICcwJzsKICAgIGVsc2UgewoJZm9ybWF0LT5mbGFncyB8PSBGTVRfZjFzZXQ7Cglmb3JtYXQtPmYx ID0gMTAgKiBmb3JtYXQtPmYxICsgYyAtICcwJzsKICAgIH0KICAgIHJldHVybiBGTVRfZmxhZzsK fQoKc3RhdGljIGludCB6ZXJvY29udiAoRm9ybWF0ICpmb3JtYXQsIGludCBjKSB7CiAgICBpZiAo Zm9ybWF0LT5mbGFncyAmIChGTVRfZjFzZXQgfCBGTVRfZjJzZXQpKQoJcmV0dXJuIGRpZ2l0Y29u diAoZm9ybWF0LCAnMCcpOwogICAgZm9ybWF0LT5mbGFncyB8PSBGTVRfemVyb3BhZDsKICAgIHJl dHVybiBGTVRfZmxhZzsKfQoKc3RhdGljIGludCBzdGFyY29udiAoRm9ybWF0ICpmb3JtYXQsIGlu dCBjKSB7CiAgICBpbnQgbiA9IHZhX2FyZyAoZm9ybWF0LT5hcmdzLCBpbnQpOwogICAgaWYgKGZv cm1hdC0+ZmxhZ3MgJiBGTVRfZjJzZXQpCglmb3JtYXQtPmYyID0gbjsKICAgIGVsc2UgewoJZm9y bWF0LT5mbGFncyB8PSBGTVRfZjFzZXQ7Cglmb3JtYXQtPmYxID0gbjsKICAgIH0KICAgIHJldHVy biBGTVRfZmxhZzsKfQoKc3RhdGljIHZvaWQgcGFkIChGb3JtYXQgKmZvcm1hdCwgU0laRV9UIGxl biwgaW50IGMpIHsKICAgIGRvOyB3aGlsZSAobGVuLS0gIT0gMCAmJiBmbXRwdXRjIChmb3JtYXQs IGMpKTsKfQoKc3RhdGljIGludCBzY29udiAoRm9ybWF0ICpmb3JtYXQsIGludCBjKSB7CiAgICBT SVpFX1QgbWF4Ynl0ZXMsIG1pbndpZHRoLCBleHRyYTsKICAgIGNoYXIgKnMgPSB2YV9hcmcgKGZv cm1hdC0+YXJncywgY2hhciAqKTsKCiAgICBpZiAoIXMpIHMgPSAiKG51bGwpIjsKCiAgICBpZiAo Zm9ybWF0LT5mbGFncyAmIEZNVF9hbHRmb3JtKSB7CgltYXhieXRlcyA9IChmb3JtYXQtPmZsYWdz ICYgRk1UX2Yyc2V0KSA/IGZvcm1hdC0+ZjIgOiBzdHJsZW4gKHMpOwoJLyogbWF4Ynl0ZXMgbWF5 IG92ZXJydW4gcywgIGJ1dCB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIAoJICAgdG8gYXNzdW1lIHRo YXQgcyBpcyBudWxsIHRlcm1pbmF0ZWQgd2hlbiBmMiBpcyBzZXQuIAoJICAgTWF5YmUgdXNlIGEg ZGlmZmVyZW50IGZvcm1hdCBjaGFyYWN0ZXIgZm9yIHRoaXM/ICovCiAgICB9IGVsc2UgewoJLyog ZG8gZjIgbGlrZSBwcmludGYgKi8KCW1heGJ5dGVzID0gc3RybGVuIChzKTsKCWlmICgoZm9ybWF0 LT5mbGFncyAmIEZNVF9mMnNldCkgJiYgKGZvcm1hdC0+ZjIgPCBtYXhieXRlcykpCgkgICAgbWF4 Ynl0ZXMgPSBmb3JtYXQtPmYyOwogICAgfQoKICAgIG1pbndpZHRoID0gKGZvcm1hdC0+ZmxhZ3Mg JiBGTVRfZjFzZXQpID8gZm9ybWF0LT5mMSA6IG1heGJ5dGVzOwogICAgZXh0cmEgPSAobWlud2lk dGggPiBtYXhieXRlcykgPyBtaW53aWR0aCAtIG1heGJ5dGVzIDogMDsKCiAgICBpZiAoZm9ybWF0 LT5mbGFncyAmIEZNVF9sZWZ0c2lkZSkgewoJZm10YXBwZW5kIChmb3JtYXQsIHMsIG1heGJ5dGVz KTsKCXBhZCAoZm9ybWF0LCBleHRyYSwgJyAnKTsKICAgIH0gZWxzZSB7CglwYWQgKGZvcm1hdCwg ZXh0cmEsICcgJyk7CglmbXRhcHBlbmQgKGZvcm1hdCwgcywgbWF4Ynl0ZXMpOwogICAgfQoJCiAg ICByZXR1cm4gRk1UX3ZlcmI7Cn0KCnN0YXRpYyBjaGFyICp1dG9hICh1bnNpZ25lZCBsb25nIHUs IAoJCSAgY2hhciAqdCwgdW5zaWduZWQgaW50IHJhZGl4LCBjb25zdCBjaGFyICpkaWdpdCkgewog ICAgaWYgKHUgPj0gcmFkaXgpIHsKCXQgPSB1dG9hICh1IC8gcmFkaXgsIHQsIHJhZGl4LCBkaWdp dCk7Cgl1ICU9IHJhZGl4OwogICAgfQogICAgKnQrKyA9IGRpZ2l0W3VdOwogICAgcmV0dXJuIHQ7 Cn0KCnN0YXRpYyB2b2lkIGludGNvbnYgKEZvcm1hdCAqZm9ybWF0LCAKCQkgICAgdW5zaWduZWQg aW50IHJhZGl4LCBpbnQgdXBwZXIsIGNvbnN0IGNoYXIgKmFsdGZvcm0pIHsKICAgIHN0YXRpYyBj b25zdCBjaGFyICogY29uc3QgdGFibGVbXSA9IHsKCSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5v cHFyc3R1dnd4eXoiLAoJIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsCiAg ICB9OwogICAgY2hhciBwYWRjaGFyOwogICAgU0laRV9UIGxlbiwgcHJlLCB6ZXJvZXMsIHBhZGRp bmcsIHdpZHRoOwogICAgbG9uZyBuLCBmbGFnczsKICAgIHVuc2lnbmVkIGxvbmcgdTsKICAgIGNo YXIgbnVtYmVyWzY0XSwgcHJlZml4WzIwXTsKCiAgICBpZiAocmFkaXggPiAzNikKCXJldHVybjsK CiAgICBmbGFncyA9IGZvcm1hdC0+ZmxhZ3M7CiAgICBpZiAoZmxhZ3MgJiBGTVRfdW5zaWduZWQp IHsKCWlmIChmbGFncyAmIEZNVF9sb25nKQoJICAgIG4gPSAodW5zaWduZWQgbG9uZykgdmFfYXJn IChmb3JtYXQtPmFyZ3MsIGxvbmcpOwoJZWxzZSBpZiAoZmxhZ3MgJiBGTVRfc2hvcnQpCgkgICAg biA9ICh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnIChmb3JtYXQtPmFyZ3Ms IGludCk7CgllbHNlCgkgICAgbiA9ICh1bnNpZ25lZCBsb25nKSh1bnNpZ25lZCBpbnQpIHZhX2Fy ZyAoZm9ybWF0LT5hcmdzLCBpbnQpOwogICAgfSBlbHNlIHsKCWlmIChmbGFncyAmIEZNVF9sb25n KQoJICAgIG4gPSAobG9uZykgdmFfYXJnIChmb3JtYXQtPmFyZ3MsIGxvbmcpOwoJZWxzZSBpZiAo ZmxhZ3MgJiBGTVRfc2hvcnQpCgkgICAgbiA9IChsb25nKShzaG9ydCkgdmFfYXJnIChmb3JtYXQt PmFyZ3MsIGludCk7CgllbHNlCgkgICAgbiA9IChsb25nKSB2YV9hcmcgKGZvcm1hdC0+YXJncywg aW50KTsKICAgIH0KCiAgICBwcmUgPSAwOwogICAgaWYgKChmbGFncyAmIEZNVF91bnNpZ25lZCkg fHwgbiA+PSAwKQoJdSA9IG47CiAgICBlbHNlIHsKCXByZWZpeFtwcmUrK10gPSAnLSc7Cgl1ID0g LW47CiAgICB9CgogICAgaWYgKGZsYWdzICYgRk1UX2FsdGZvcm0pCgl3aGlsZSAoKmFsdGZvcm0g IT0gJ1wwJykKCSAgICBwcmVmaXhbcHJlKytdID0gKmFsdGZvcm0rKzsKCiAgICBsZW4gPSB1dG9h ICh1LCBudW1iZXIsIHJhZGl4LCB0YWJsZVt1cHBlcl0pIC0gbnVtYmVyOwogICAgaWYgKChmbGFn cyAmIEZNVF9mMnNldCkgJiYgKFNJWkVfVCkgZm9ybWF0LT5mMiA+IGxlbikKCXplcm9lcyA9IGZv cm1hdC0+ZjIgLSBsZW47CiAgICBlbHNlCgl6ZXJvZXMgPSAwOwoKICAgIHdpZHRoID0gcHJlICsg emVyb2VzICsgbGVuOwogICAgaWYgKChmbGFncyAmIEZNVF9mMXNldCkgJiYgKFNJWkVfVCkgZm9y bWF0LT5mMSA+IHdpZHRoKSB7CglwYWRkaW5nID0gZm9ybWF0LT5mMSAtIHdpZHRoOwogICAgfSBl bHNlCglwYWRkaW5nID0gMDsKCiAgICBwYWRjaGFyID0gJyAnOwogICAgaWYgKHBhZGRpbmcgPiAw ICYmIGZsYWdzICYgRk1UX3plcm9wYWQpIHsKCXBhZGNoYXIgPSAnMCc7CglpZiAoKGZsYWdzICYg Rk1UX2xlZnRzaWRlKSA9PSAwKSB7CgkgICAgemVyb2VzICs9IHBhZGRpbmc7CgkgICAgcGFkZGlu ZyA9IDA7Cgl9CiAgICB9CgogICAgaWYgKChmbGFncyAmIEZNVF9sZWZ0c2lkZSkgPT0gMCkKCXBh ZCAoZm9ybWF0LCBwYWRkaW5nLCBwYWRjaGFyKTsKICAgIGZtdGFwcGVuZCAoZm9ybWF0LCBwcmVm aXgsIHByZSk7CiAgICBwYWQgKGZvcm1hdCwgemVyb2VzLCAnMCcpOwogICAgZm10YXBwZW5kIChm b3JtYXQsIG51bWJlciwgbGVuKTsKICAgIGlmIChmbGFncyAmIEZNVF9sZWZ0c2lkZSkKCXBhZCAo Zm9ybWF0LCBwYWRkaW5nLCBwYWRjaGFyKTsKfQoKc3RhdGljIGludCBjY29udiAoRm9ybWF0ICpm b3JtYXQsIGludCBjKSB7CiAgICBmbXRwdXRjIChmb3JtYXQsIHZhX2FyZyAoZm9ybWF0LT5hcmdz LCBpbnQpKTsKICAgIHJldHVybiBGTVRfdmVyYjsKfQoKc3RhdGljIGludCBkY29udiAoRm9ybWF0 ICpmb3JtYXQsIGludCBjKSB7CiAgICBpbnRjb252IChmb3JtYXQsIDEwLCAwLCAiIik7CiAgICBy ZXR1cm4gRk1UX3ZlcmI7Cn0KCnN0YXRpYyBpbnQgb2NvbnYgKEZvcm1hdCAqZm9ybWF0LCBpbnQg YykgewogICAgaW50Y29udiAoZm9ybWF0LCA4LCAwLCAiMCIpOwogICAgcmV0dXJuIEZNVF92ZXJi Owp9CgpzdGF0aWMgaW50IHhjb252IChGb3JtYXQgKmZvcm1hdCwgaW50IGMpIHsKICAgIGludGNv bnYgKGZvcm1hdCwgMTYsIDAsICIweCIpOwogICAgcmV0dXJuIEZNVF92ZXJiOwp9CgpzdGF0aWMg aW50IGxpdGNvbnYgKEZvcm1hdCAqZm9ybWF0LCBpbnQgYykgewogICAgZm10cHV0YyAoZm9ybWF0 LCBjKTsKICAgIHJldHVybiBGTVRfdmVyYjsKfQoKZXh0ZXJuIGludCBmbXRfYmFkY29udiAoRm9y bWF0ICpmb3JtYXQsIGludCBjKSB7CiAgICBlcHJpbnQgKCJsaWJwcmludDogYmFkIGNvbnZlcnNp b24gY2hhciAnJWMnXG4iLCBjKTsKICAgIGZvcm1hdC0+ZXJyb3IgPSAxOyAvKiBYWFggLSBzdG9w IG9yIG5vdD8gY29uc3VtZSBhbiBhcmd2PyAqLwogICAgcmV0dXJuIEZNVF92ZXJiOwp9CgpzdGF0 aWMgaW50IG5jb252IChGb3JtYXQqIGZvcm1hdCwgaW50IGMpCnsKICAgIC8qIHdyaXRlIHRoZSBj dXJyZW50IHdyaXRlIGxlbmd0aCBpbnRvIGFuIGludCogYXJndW1lbnQgKi8KICAgIGludCAqcCA9 IHZhX2FyZyAoZm9ybWF0LT5hcmdzLCBpbnQqKTsKICAgIGlmIChwKSAqcCA9IGZvcm1hdC0+YnVm IC0gZm9ybWF0LT5idWZiZWdpbiArIGZvcm1hdC0+Zmx1c2hlZDsKICAgIHJldHVybiBGTVRfdmVy YjsKfQoKc3RhdGljIGludCByY29udiAoRm9ybWF0ICpmb3JtYXQsIGludCBjKSB7CiAgICBpbnQg ZSA9IGVycm5vOwogICAgLyogZG8gd2UgaGF2ZSB0byBzdG9yZSBlcnJubyBpbiB0aGUgZm9ybWF0 IHN0cnVjdHVyZSBiZWNhdXNlCiAgICAgICB0aGUgZ3JvdyBwcm9jIGNvdWxkIG1ha2UgYSBzeXNj YWxsIHRoYXQgc2V0cyBlcnJubyBiZWZvcmUKICAgICAgIHdlIGdldCBoZXJlPyAqLwoKICAgIGlm IChmb3JtYXQtPmZsYWdzICYgRk1UX2FsdGZvcm0pIHsKCWZtdHByaW50IChmb3JtYXQsICIlZCIs IGUpOwogICAgfSBlbHNlIHsKCS8qIHN0cmVycm9yKCkgbWlnaHQgYmUgYmV0dGVyLCBidXQgdGhp cyB3YXkgd2UgY2FuIHJhbmdlIGNoZWNrICovCiAgICAgICAgZXh0ZXJuIGludCBzeXNfbmVycjsK ICAgICAgICBleHRlcm4gY2hhciogc3lzX2Vycmxpc3RbXTsKCWlmICgoMCA8PSBlKSAmJiAoZSA8 IHN5c19uZXJyKSkgCgkgICAgZm10Y2F0IChmb3JtYXQsIHN5c19lcnJsaXN0W2VdKTsKCWVsc2UK CSAgICBmbXRwcmludCAoZm9ybWF0LCAidW5rbm93biBlcnJvciAoJWQpIiwgZSk7CiAgICB9CiAg ICByZXR1cm4gRk1UX3ZlcmI7CQp9CgovKgogKiBjb252ZXJzaW9uIHRhYmxlIG1hbmFnZW1lbnQK ICovCgpzdGF0aWMgRm10Y29udiBkZmx0X2ZtdHRhYltGTVRfTUFYQ09OVl07CgpzdGF0aWMgRm10 Y29udiogZW5zdXJlX2luaXR0YWIgKEZtdGNvbnYgZm10dGFiW10pCnsKICAgIGludCBpOwoKICAg IGlmIChmbXR0YWJbMF0gIT0gMCkKCXJldHVybiBmbXR0YWI7CgogICAgZm9yIChpID0gMDsgaSA8 IEZNVF9NQVhDT05WOyBpKyspCglmbXR0YWJbaV0gPSBmbXRfYmFkY29udjsKCiAgICBmbXR0YWJb JyUnXSA9IGxpdGNvbnY7CgogICAgZm10dGFiWydzJ10gPSBzY29udjsKICAgIGZtdHRhYlsnYydd ID0gY2NvbnY7CiAgICBmbXR0YWJbJ2QnXSA9IGRjb252OwogICAgZm10dGFiWydpJ10gPSBkY29u djsKICAgIGZtdHRhYlsnbyddID0gb2NvbnY7CiAgICBmbXR0YWJbJ3gnXSA9IHhjb252OwogICAg Zm10dGFiWydyJ10gPSByY29udjsKICAgIGZtdHRhYlsnbSddID0gcmNvbnY7CiAgICBmbXR0YWJb J24nXSA9IG5jb252OwoKICAgIGZtdHRhYlsndSddID0gdWNvbnY7CiAgICBmbXR0YWJbJ2gnXSA9 IGhjb252OwogICAgZm10dGFiWydsJ10gPSBsY29udjsKICAgIGZtdHRhYlsnIyddID0gYWx0Y29u djsKICAgIGZtdHRhYlsnLSddID0gbGVmdGNvbnY7CiAgICBmbXR0YWJbJy4nXSA9IGRvdGNvbnY7 CiAgICBmbXR0YWJbJyonXSA9IHN0YXJjb252OwoKICAgIGZtdHRhYlsnMCddID0gemVyb2NvbnY7 CiAgICBmb3IgKGkgPSAnMSc7IGkgPD0gJzknOyBpKyspCglmbXR0YWJbaV0gPSBkaWdpdGNvbnY7 CgogICAgcmV0dXJuIGZtdHRhYjsKfQoKZXh0ZXJuIEZtdGNvbnYgZm10aW5zdGFsbCAoaW50IGMs IEZtdGNvbnYgZikKewogICAgRm10Y29udiBvbGRmOwoKICAgIGVuc3VyZV9pbml0dGFiIChkZmx0 X2ZtdHRhYik7CiAgICBjICY9IEZNVF9NQVhDT05WIC0gMTsKICAgIG9sZGYgPSBkZmx0X2ZtdHRh YltjXTsKICAgIGlmIChmICE9IDApCglkZmx0X2ZtdHRhYltjXSA9IGY7CiAgICByZXR1cm4gb2xk ZjsKfQoKLyogLS0tICovCgpzdGF0aWMgdm9pZCBmbXRpbml0YnVmIChGb3JtYXQgKmZvcm1hdCwg CgkJCWNoYXIgKmJ1ZiwgU0laRV9UIHNpemUsIGludCAoKmdyb3cpKEZvcm1hdCAqLCBTSVpFX1Qp KQp7CiAgICBmb3JtYXQtPmJ1ZiAgICAgID0gYnVmOwogICAgZm9ybWF0LT5idWZiZWdpbiA9IGJ1 ZjsKICAgIGZvcm1hdC0+YnVmZW5kICAgPSBidWYgKyBzaXplOwogICAgZm9ybWF0LT5ncm93ICAg ICA9IGdyb3c7CiAgICBmb3JtYXQtPmZsdXNoZWQgID0gMDsKICAgIGZvcm1hdC0+ZXJyb3IgICAg PSAwOwogICAgZm9ybWF0LT5yZXFsZW4gICA9IDA7Cn0KCnN0YXRpYyB2b2lkIGZtdGluaXRhcmcg KEZvcm1hdCAqZm9ybWF0LCAKCQkJdmFfbGlzdCBhcmdzLCBGbXRjb252KiBmbXR0YWIsIHZvaWQq IGNsaWVudF9kYXRhKQp7CiAgICBmb3JtYXQtPmFyZ3MgPSBhcmdzOwogICAgZm9ybWF0LT5mbXR0 YWIgPSAwOwogICAgZm9ybWF0LT5jbGllbnRfZGF0YSA9IDA7Cn0KCQkgICAgIAovKgogKiB0aGUg Zm9ybWF0dGluZyBlbmdpbmUKICovCgpleHRlcm4gaW50IGZtdGVuZ2luZSAoRm9ybWF0ICpmb3Jt YXQsIGNvbnN0IGNoYXIgKmZtdCkKewogICAgY29uc3QgdW5zaWduZWQgY2hhciAqcyA9IChjb25z dCB1bnNpZ25lZCBjaGFyICopIGZtdDsKICAgIEZtdGNvbnYqIGZtdHRhYjsKIAogICAgaWYgKChm bXR0YWIgPSBmb3JtYXQtPmZtdHRhYikgPT0gMCkKICAgICAgICBmbXR0YWIgPSBlbnN1cmVfaW5p dHRhYiAoZGZsdF9mbXR0YWIpOwoKICAgIGZvciAoOzspIHsKCWludCBjID0gKnMrKzsKCglzd2l0 Y2ggKGMpIHsKCWNhc2UgJyUnOgoJICAgIGZvcm1hdC0+ZmxhZ3MgPSBmb3JtYXQtPmYxID0gZm9y bWF0LT5mMiA9IDA7CgkgICAgZG8gYyA9ICpzKys7IHdoaWxlICgoKmZtdHRhYltjXSkoZm9ybWF0 LCBjKSA9PSBGTVRfZmxhZyk7CgkgICAgYnJlYWs7CgljYXNlICdcMCc6CgkgICAgcmV0dXJuIGZv cm1hdC0+YnVmIC0gZm9ybWF0LT5idWZiZWdpbiArIGZvcm1hdC0+Zmx1c2hlZDsKCWRlZmF1bHQ6 CgkgICAgZm10cHV0YyAoZm9ybWF0LCBjKTsKCSAgICBicmVhazsKCX0KICAgIH0KfQoKCi8qCiAq IHRoZSBwdWJsaWMgZW50cnkgcG9pbnRzCiAqLwoKZXh0ZXJuIGludCBmbXRwcmludCAoRm9ybWF0 ICpmb3JtYXQsIGNvbnN0IGNoYXIgKmZtdCwuLi4pIHsKICAgIGludCBuID0gLWZvcm1hdC0+Zmx1 c2hlZDsKICAgIHZhX2xpc3QgYXAsIHNhdmVhcmdzOwoKICAgIHZhX3N0YXJ0IChhcCwgZm10KTsK ICAgIHNhdmVhcmdzID0gZm9ybWF0LT5hcmdzOwogICAgZm9ybWF0LT5hcmdzID0gYXA7CiAgICBu ICs9IGZtdGVuZ2luZSAoZm9ybWF0LCBmbXQpOwogICAgdmFfZW5kIChmb3JtYXQtPmFyZ3MpOwog ICAgZm9ybWF0LT5hcmdzID0gc2F2ZWFyZ3M7CgogICAgcmV0dXJuIG4gKyBmb3JtYXQtPmZsdXNo ZWQ7Cn0KCi8qIC0tLSAqLwoKc3RhdGljIGludCB3cml0ZWFsbCAoaW50IGZkLCBjaGFyICpidWYs IFNJWkVfVCBuKSB7CiAgICBpbnQgaSwgcmVtYWluOwoKICAgIGZvciAoaSA9IDAsIHJlbWFpbiA9 IG47IHJlbWFpbiA+IDA7IGJ1ZiArPSBpLCByZW1haW4gLT0gaSkKCWlmICgoaSA9IHdyaXRlIChm ZCwgYnVmLCByZW1haW4pKSA8PSAwKQoJICAgIGlmICgoZXJybm8gPT0gRUFHQUlOKSB8fCAoZXJy bm8gPT0gRVdPVUxEQkxPQ0spKQoJCWNvbnRpbnVlOwoJICAgIGVsc2UKCQlicmVhazsKCiAgICBy ZXR1cm4gbiAtIHJlbWFpbjsgCn0KCi8qIC0tLSAqLwoKZXh0ZXJuIGludCBmbXRfZnByaW50X2Zs dXNoIChGb3JtYXQgKmZvcm1hdCwgU0laRV9UIG1vcmUpIHsKICAgIFNJWkVfVCBuID0gZm9ybWF0 LT5idWYgLSBmb3JtYXQtPmJ1ZmJlZ2luOwogICAgU0laRV9UIHI7CgogICAgciA9IHdyaXRlYWxs IChmb3JtYXQtPnUubiwgZm9ybWF0LT5idWZiZWdpbiwgbik7CiAgICBmb3JtYXQtPmZsdXNoZWQg Kz0gcjsKICAgIGZvcm1hdC0+YnVmIC09IHI7CiAgICBmb3JtYXQtPmVycm9yIHw9IChyICE9IG4p OwoKICAgIHJldHVybiBmb3JtYXQtPmVycm9yOwp9CgpleHRlcm4gaW50IHZmcHJpbnQgKGludCBm ZCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKSB7CiAgICBjaGFyIGJ1ZlsxMDI0XTsKICAg IEZvcm1hdCBmb3JtYXQ7CgogICAgZm10aW5pdGJ1ZiAoJmZvcm1hdCwgYnVmLCBzaXplb2YgYnVm LCBmbXRfZnByaW50X2ZsdXNoKTsKICAgIGZtdGluaXRhcmcgKCZmb3JtYXQsIGFwLCAwLCAwKTsK ICAgIGZvcm1hdC51Lm4gPSBmZDsKCiAgICBmbXRlbmdpbmUgKCZmb3JtYXQsIGZtdCk7CiAgICBm bXRfZnByaW50X2ZsdXNoICgmZm9ybWF0LCAwKTsKICAgIHJldHVybiBmb3JtYXQuZXJyb3IgPyAt MSA6IGZvcm1hdC5mbHVzaGVkOwp9CgpleHRlcm4gaW50IGZwcmludCAoaW50IGZkLCBjb25zdCBj aGFyICpmbXQsLi4uKSB7CiAgICBpbnQgbjsKICAgIHZhX2xpc3QgYXA7CgogICAgdmFfc3RhcnQg KGFwLCBmbXQpOwogICAgbiA9IHZmcHJpbnQgKGZkLCBmbXQsIGFwKTsKICAgIHZhX2VuZCAoYXAp OwogICAgcmV0dXJuIG47Cn0KCmV4dGVybiBpbnQgcHJpbnQgKGNvbnN0IGNoYXIgKmZtdCwuLi4p IHsKICAgIGludCBuOwogICAgdmFfbGlzdCBhcDsKCiAgICB2YV9zdGFydCAoYXAsIGZtdCk7CiAg ICBuID0gdmZwcmludCAoMSwgZm10LCBhcCk7CiAgICB2YV9lbmQgKGFwKTsKICAgIHJldHVybiBu Owp9CgpleHRlcm4gaW50IGVwcmludCAoY29uc3QgY2hhciAqZm10LC4uLikgewogICAgaW50IG47 CiAgICB2YV9saXN0IGFwOwoKICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKICAgIG4gPSB2ZnByaW50 ICgyLCBmbXQsIGFwKTsKICAgIHZhX2VuZCAoYXApOwogICAgcmV0dXJuIG47Cn0KCnZvaWQgZmF0 YWwgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQp7CiAgICB2YV9saXN0IGFwOwogICAgdmFfc3RhcnQg KGFwLCBmbXQpOwogICAgKHZvaWQpIHZmcHJpbnQgKDIsIGZtdCwgYXApOwogICAgdmFfZW5kIChh cCk7CiAgICBleGl0ICgxKTsKfQoKLyogLS0tICovCgpleHRlcm4gaW50IGZtdF9tZW1wcmludF9n cm93IChGb3JtYXQgKmZvcm1hdCwgU0laRV9UIG1vcmUpIHsKICAgIGNoYXIgKmJ1ZiA9IDA7CiAg ICBTSVpFX1QgcG9zID0gZm9ybWF0LT5idWYgLSBmb3JtYXQtPmJ1ZmJlZ2luOwogICAgU0laRV9U IGxlbiA9IGZvcm1hdC0+YnVmZW5kIC0gZm9ybWF0LT5idWZiZWdpbiArIDE7CiAgICBsZW4gPSAo bGVuID49IG1vcmUpCgk/IGxlbiAqIDIgCiAgICAgICAgOiAoKGxlbiArIG1vcmUpICsgRk1UX1BS SU5UX0FMTE9DU0laRSkgJn4gKEZNVF9QUklOVF9BTExPQ1NJWkUgLSAxKTsKCiAgICBidWYgPSAo KEFsbG9jKWZvcm1hdC0+dS5wKShmb3JtYXQtPmJ1ZmJlZ2luLCBsZW4pOwogICAgaWYgKGJ1Zikg ewoJZm9ybWF0LT5idWZiZWdpbiA9IGJ1ZjsKCWZvcm1hdC0+YnVmCSA9IGJ1ZiArIHBvczsKCWZv cm1hdC0+YnVmZW5kICAgPSBidWYgKyBsZW4gLSAxOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1 cm4gZm9ybWF0LT5lcnJvciA9IDE7Cn0KCmV4dGVybiBjaGFyICpmbXRfbWVtcHJpbnQgKEZvcm1h dCAqZm9ybWF0LCBjb25zdCBjaGFyICpmbXQsIFNJWkVfVCogbGVuKSB7CiAgICBjaGFyKiBidWY7 CiAgICBpbnQgbjsKCiAgICBidWYgPSAoKihBbGxvYylmb3JtYXQtPnUucCkgKDAsIEZNVF9QUklO VF9BTExPQ1NJWkUpOwogICAgaWYgKCFidWYpIHsKCWZvcm1hdC0+ZXJyb3IgPSAxOwoJcmV0dXJu IDA7CiAgICB9CgogICAgZm10aW5pdGJ1ZiAoZm9ybWF0LCBidWYsIEZNVF9QUklOVF9BTExPQ1NJ WkUgLSAxLCBmbXRfbWVtcHJpbnRfZ3Jvdyk7CiAgICBuID0gZm10ZW5naW5lIChmb3JtYXQsIGZt dCk7CiAgICAqZm9ybWF0LT5idWYgPSAnXDAnOwogICAgaWYgKGxlbikgKmxlbiA9IG47CgogICAg cmV0dXJuIGZvcm1hdC0+ZXJyb3IgPyAwIDogZm9ybWF0LT5idWZiZWdpbjsKfQoKZXh0ZXJuIGNo YXIgKnZzbXByaW50IChBbGxvYyBhLCBTSVpFX1QqIGxlbiwgY29uc3QgY2hhciogZm10LCB2YV9s aXN0IGFwKSB7CiAgICBGb3JtYXQgZm9ybWF0OwoKICAgIGZtdGluaXRhcmcgKCZmb3JtYXQsIGFw LCAwLCAwKTsKICAgIGZvcm1hdC51LnAgPSAodm9pZCopIGE7CgogICAgcmV0dXJuIGZtdF9tZW1w cmludCAoJmZvcm1hdCwgZm10LCBsZW4pOwp9CgpleHRlcm4gY2hhciAqc21wcmludCAoQWxsb2Mg YWxsb2MsIFNJWkVfVCogbGVuLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgewogICAgY2hhciogcmVz dWx0OwogICAgdmFfbGlzdCBhcDsKCiAgICB2YV9zdGFydCAoYXAsIGZtdCk7CiAgICByZXN1bHQg PSB2c21wcmludCAoYWxsb2MsIGxlbiwgZm10LCBhcCk7CiAgICB2YV9lbmQgKGFwKTsKICAgIHJl dHVybiByZXN1bHQ7Cn0KCi8qIG5vdGUgLS0gbW92ZWQgcGFsbG9jIGFuZCBtcHJpbnQgdG8gbXBy aW50LmMgKi8KCi8qIC0tLSAqLwoKZXh0ZXJuIGludCBmbXRfc25wcmludF9ncm93IChGb3JtYXQg KmZvcm1hdCwgU0laRV9UIG1vcmUpIHsKICAgIHJldHVybiBmb3JtYXQtPmVycm9yPTE7Cn0KCmV4 dGVybiBpbnQgdnNucHJpbnQgKGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciAqZm10 LCB2YV9saXN0IGFwKSB7CiAgICBGb3JtYXQgZm9ybWF0OwoKICAgIGZtdGluaXRidWYgKCZmb3Jt YXQsIGJ1ZiwgYnVmbGVuIC0gMSwgZm10X3NucHJpbnRfZ3Jvdyk7CiAgICBmbXRpbml0YXJnICgm Zm9ybWF0LCBhcCwgMCwgMCk7CiAgICBmb3JtYXQuYXJncyA9IGFwOwoKICAgICh2b2lkKSBmbXRl bmdpbmUgKCZmb3JtYXQsIGZtdCk7CiAgICAqZm9ybWF0LmJ1ZiA9ICdcMCc7CiAgICByZXR1cm4g Zm9ybWF0LnJlcWxlbjsKfQoKZXh0ZXJuIGludCBzbnByaW50IChjaGFyICpidWYsIGludCBidWZs ZW4sIGNvbnN0IGNoYXIgKmZtdCwuLi4pIHsKICAgIGludCBuOwogICAgdmFfbGlzdCBhcDsKCiAg ICB2YV9zdGFydCAoYXAsIGZtdCk7CiAgICBuID0gdnNucHJpbnQgKGJ1ZiwgYnVmbGVuLCBmbXQs IGFwKTsKICAgIHZhX2VuZCAoYXApOwogICAgcmV0dXJuIG47Cn0KCmV4dGVybiBpbnQgc3ByaW50 IChjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwuLi4pIHsKICAgIGludCBuOwogICAgdmFfbGlz dCBhcDsKCiAgICB2YV9zdGFydCAoYXAsIGZtdCk7CiAgICBuID0gdnNucHJpbnQgKGJ1ZiwgRk1U X1NQUklOVF9CVUZTSVosIGZtdCwgYXApOwogICAgdmFfZW5kIChhcCk7CiAgICByZXR1cm4gbjsK fQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL2xpYi9wbHVtYi5j AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAw MDQzNQAwNzExMTY0MjUzMgAwMDE1MDE0ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2luY2x1ZGUgPHUuaD4KI2lu Y2x1ZGUgInBsdW1iLmgiCgovKiBYWFggLSBDYW4gd2UgZG8gYmV0dGVyIHRoYW4gdGhpcz8gKi8K Y2hhciAqY2xlYW5uYW1lKGNoYXIgKnMpIHsgcmV0dXJuIHM7IH0gCmNoYXIgKnBsdW1idW5wYWNr YXR0cihjaGFyICpjYnVmKSB7IGFib3J0KCk7IHJldHVybiAwOyB9CmNoYXIgKnBsdW1icGFjayhQ bHVtYm1zZyAqcG0sIGludCAqaSkgeyBhYm9ydCgpOyByZXR1cm4gMDsgfQppbnQgcGx1bWJmcmVl KFBsdW1ibXNnICpwbSkgeyBhYm9ydCgpOyByZXR1cm4gMDsgfQoKAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzYW0yay9zYW0vAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA0MDc1NQAwMDAxNzM3ADAwMDAxNTEAMDAwMDAwMDAw MDAAMDcxMTIxMTc3MjYAMDAxMzU0NwA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnY3NlAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAwMDAyNwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL3NhbS91bml4LmMAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAwNzA1 NgAwNzExMjAyMjQ2MQAwMDE0NjcyADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyogQ29weXJpZ2h0IChjKSAxOTky IEFUJlQgLSBBbGwgcmlnaHRzIHJlc2VydmVkLiAqLwovKiBDaGFuZ2VzIDIwMDAsIFNjb3R0IFNj aHdhcnR6ICovCgojaW5jbHVkZSA8dS5oPgojaW5jbHVkZSA8bGliYy5oPgoKI2luY2x1ZGUgInNh bS5oIgojaW5jbHVkZSAidW5peC5oIgoKUnVuZQlzYW1uYW1lW10gPSB7ICd+JywgJ34nLCAncycs ICdhJywgJ20nLCAnficsICd+JywgMCB9OwoKc3RhdGljIFJ1bmUgbDFbXSA9IHsgJ3snLCAnWycs ICcoJywgJzwnLCAwMjUzLCAwfTsKc3RhdGljIFJ1bmUgbDJbXSA9IHsgJ1xuJywgMH07CnN0YXRp YyBSdW5lIGwzW10gPSB7ICdcJycsICciJywgJ2AnLCAwfTsKUnVuZSAqbGVmdFtdPSB7IGwxLCBs MiwgbDMsIDB9OwoKc3RhdGljIFJ1bmUgcjFbXSA9IHsnfScsICddJywgJyknLCAnPicsIDAyNzMs IDB9OwpzdGF0aWMgUnVuZSByMltdID0geydcbicsIDB9OwpzdGF0aWMgUnVuZSByM1tdID0geydc JycsICciJywgJ2AnLCAwfTsKUnVuZSAqcmlnaHRbXT0geyByMSwgcjIsIHIzLCAwfTsKCmNoYXIJ UlNBTVtdID0gUlNBTU5BTUU7CmNoYXIJU0FNVEVSTVtdID0gVEVSTU5BTUU7CmNoYXIJSE9NRVtd ID0gSE9NRURJUjsKY2hhcglUTVBESVJbXSA9IFRNUDsKY2hhcglTSFtdID0gU0hFTExOQU1FOwpj aGFyCVNIUEFUSFtdID0gU0hFTExQQVRIOwpjaGFyCVJYW10gPSBSWE5BTUU7CmNoYXIJUlhQQVRI W10gPSBSWFBBVEhOQU1FOwpjaGFyCVNBTVNBVkVDTURbXSA9IFNBTVNBVkU7Cgp2b2lkCnByaW50 X3NzKGNoYXIgKnMsIFN0cmluZyAqYSwgU3RyaW5nICpiKQp7CgljaGFyICphcCwgKmJwLCAqY3A7 CglSdW5lICpycDsKCglhcCA9IGVtYWxsb2MoYS0+bisxKTsKCWZvciAoY3AgPSBhcCwgcnAgPSBh LT5zOyAqcnA7IHJwKyspCgkJY3AgKz0gcnVuZXRvY2hhcihjcCwgcnApOwoJKmNwID0gMDsKCWJw ID0gZW1hbGxvYyhiLT5uKzEpOwoJZm9yIChjcCA9IGJwLCBycCA9IGItPnM7ICpycDsgcnArKykK CQljcCArPSBydW5ldG9jaGFyKGNwLCBycCk7CgkqY3AgPSAwOwoJZHByaW50KCI/d2FybmluZzog JXMgYCUuKnMnIGFuZCBgJS4qcydcbiIsIHMsIGEtPm4sIGFwLCBiLT5uLCBicCk7CglmcmVlKGFw KTsKCWZyZWUoYnApOwp9Cgp2b2lkCnByaW50X3MoY2hhciAqcywgU3RyaW5nICphKQp7CgljaGFy ICphcCwgKmNwOwoJUnVuZSAqcnA7CgoJYXAgPSBlbWFsbG9jKGEtPm4rMSk7Cglmb3IgKGNwID0g YXAsIHJwID0gYS0+czsgKnJwOyBycCsrKQoJCWNwICs9IHJ1bmV0b2NoYXIoY3AsIHJwKTsKCSpj cCA9IDA7CglkcHJpbnQoIj93YXJuaW5nOiAlcyBgJS4qcydcbiIsIHMsIGEtPm4sIGFwKTsKCWZy ZWUoYXApOwp9CgppbnQKc3RhdGZpbGUoY2hhciAqbmFtZSwgdWxvbmcgKmRldiwgdWxvbmcgKmlk LCBsb25nICp0aW1lLCBsb25nICpsZW5ndGgsIGxvbmcgKmFwcGVuZG9ubHkpCnsKCXN0cnVjdCBz dGF0IGRpcmI7CgoJaWYgKHN0YXQobmFtZSwgJmRpcmIpID09IC0xKQoJCXJldHVybiAtMTsKCWlm IChkZXYpCgkJKmRldiA9IGRpcmIuc3RfZGV2OwoJaWYgKGlkKQoJCSppZCA9IGRpcmIuc3RfaW5v OwoJaWYgKHRpbWUpCgkJKnRpbWUgPSBkaXJiLnN0X210aW1lOwoJaWYgKGxlbmd0aCkKCQkqbGVu Z3RoID0gZGlyYi5zdF9zaXplOwoJaWYoYXBwZW5kb25seSkKCQkqYXBwZW5kb25seSA9IDA7Cgly ZXR1cm4gMTsKfQoKaW50CnN0YXRmZChpbnQgZmQsIHVsb25nICpkZXYsIHVsb25nICppZCwgbG9u ZyAqdGltZSwgbG9uZyAqbGVuZ3RoLCBsb25nICphcHBlbmRvbmx5KQp7CglzdHJ1Y3Qgc3RhdCBk aXJiOwoKCWlmIChmc3RhdChmZCwgJmRpcmIpID09IC0xKQoJCXJldHVybiAtMTsKCWlmIChkZXYp CgkJKmRldiA9IGRpcmIuc3RfZGV2OwoJaWYgKGlkKQoJCSppZCA9IGRpcmIuc3RfaW5vOwoJaWYg KHRpbWUpCgkJKnRpbWUgPSBkaXJiLnN0X210aW1lOwoJaWYgKGxlbmd0aCkKCQkqbGVuZ3RoID0g ZGlyYi5zdF9zaXplOwoJaWYoYXBwZW5kb25seSkKCQkqYXBwZW5kb25seSA9IDA7CglyZXR1cm4g MTsKfQoKdm9pZApodXAoaW50IHNpZykKewoJcmVzY3VlKCk7CglleGl0KDEpOwp9CgppbnQKbm90 aWZ5ICh2b2lkKCpmKSh2b2lkICosIGNoYXIgKikpCnsKCXNpZ25hbChTSUdJTlQsIFNJR19JR04p OwoJc2lnbmFsKFNJR0hVUCwgaHVwKTsKCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKI2lmZGVm CXYxMAoJY2xvc2UoMyk7CQkvKiByZWRpcmVjdCB2MTAgL2Rldi90dHkgKi8KCW9wZW4oIi9kZXYv bnVsbCIsIDIpOwojZW5kaWYKCXJldHVybiAxOwp9Cgp2b2lkCm5vdGlmeWYodm9pZCAqYSwgY2hh ciAqYikJLyogbmV2ZXIgY2FsbGVkICovCnsKfQoKc3RhdGljIGludAp0ZW1wX2ZpbGUoY2hhciAq YnVmLCBpbnQgYnVmc2l6ZSkKewoJY2hhciAqdG1wOwoJaW50IG4sIGZkOwoKCXRtcCA9IGdldGVu digiVE1QRElSIik7CglpZiAoIXRtcCkKCQl0bXAgPSBUTVBESVI7CgoJbiA9IHNucHJpbnQoYnVm LCBidWZzaXplLCAiJXMvc2FtLiVkLlhYWFhYWFgiLCB0bXAsIGdldHVpZCgpKTsKCWlmIChidWZz aXplIDw9IG4pCgkJcmV0dXJuIC0xOwoJaWYgKChmZCA9IG1rc3RlbXAoYnVmKSkgPCAwKSAgLyog WFhYIC0gdXN1YWxseSBtb2RlIDA2MDAsIGJ1dCBzb21ldGltZXMgbW9yZS4gKi8KCQlyZXR1cm4g LTE7CiAJaWYgKGZjbnRsKGZkLCBGX1NFVEZELCBmY250bChmZCxGX0dFVEZELDApIHwgRkRfQ0xP RVhFQykgPCAwKQoJCXJldHVybiAtMTsKCXJldHVybiBmZDsKfQoKaW50CnRlbXBkaXNrKHZvaWQp CnsKCWNoYXIgYnVmWzQwOTZdOwoJaW50IGZkID0gdGVtcF9maWxlKGJ1Ziwgc2l6ZW9mIGJ1Zik7 CglpZiAoZmQgPj0gMCkKCQlyZW1vdmUoYnVmKTsKCXJldHVybiBmZDsKfQoKdm9pZApzYW1lcnIo Y2hhciAqYnVmKQp7CglpbnQgZmQ7CgoJaWYgKGJ1ZlswXSkKCQlyZXR1cm47CgoJaWYgKChmZCA9 IHRlbXBfZmlsZShidWYsIDY0KSkgPCAwKSAvKiBYWFggLSBmcm9tIHNoZWxsLmMgKi8KCQlzdHJj cHkoYnVmLCAiL2Rldi9udWxsIik7CgllbHNlCgkJY2xvc2UoZmQpOwp9CgppbnQKd2FpdGZvcihp bnQgcGlkKQp7CglpbnQgd207CglpbnQgcnBpZDsKCglkbzsgd2hpbGUoKHJwaWQgPSB3YWl0KCZ3 bSkpICE9IHBpZCAmJiBycGlkICE9IC0xKTsKCXJldHVybiAoV0VYSVRTVEFUVVMod20pKTsKfQoK dm9pZCoKZW1hbGxvYyh1bG9uZyBuKQp7Cgl2b2lkICpwOwoKCWlmIChuIDwgc2l6ZW9mKGludCkp CgkJbiA9IHNpemVvZihpbnQpOwoJcCA9IG1hbGxvYyhuKTsKCWlmKHAgPT0gMCkKCQlwYW5pYygi bWFsbG9jIGZhaWxzIik7CgltZW1zZXQocCwgMCwgbik7CglyZXR1cm4gcDsKfQoKdm9pZCoKZXJl YWxsb2Modm9pZCAqcCwgdWxvbmcgbikKewoJcCA9IHJlYWxsb2MocCwgbik7CglpZihwID09IDAp CgkJcGFuaWMoInJlYWxsb2MgZmFpbHMiKTsKCXJldHVybiBwOwp9Cgp2b2lkCmRwcmludChjaGFy ICp6LCAuLi4pCnsKICAgICAgICBjaGFyICpidWY7Cgl2YV9saXN0IGFyZ3M7Cgl2YV9zdGFydChh cmdzLCB6KTsKIAlpZiAoKGJ1ZiA9IHZzbXByaW50ICgoY2hhciooKikoY2hhciosdWxvbmcpKWVy ZWFsbG9jLCAwLCB6LCBhcmdzKSkpIHsKCQl0ZXJtd3JpdGUoYnVmKTsKCQlmcmVlKGJ1Zik7Cgl9 Cgl2YV9lbmQoYXJncyk7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL3NhbS9NYWtlZmlsZQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAwMTEwMgAwNzExMjAz MDAzMwAwMDE1MTU3ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1JDPWFkZHJlc3MuYyBidWZmLmMgY21kLmMgZGlz ay5jIGVycm9yLmMgZmlsZS5jIGlvLmMgbGlzdC5jIG1lc2cuYyBcCiAgICBtb3ZldG8uYyBtdWx0 aS5jIHJhc3AuYyByZWdleHAuYyBzYW0uYyBzaGVsbC5jIHN0cmluZy5jIHN5cy5jIHV0aWwuYyB4 ZWMuYyBcCiAgICB1bml4LmMKCk9CSj1hZGRyZXNzLm8gYnVmZi5vIGNtZC5vIGRpc2subyBlcnJv ci5vIGZpbGUubyBpby5vIGxpc3QubyBtZXNnLm8gXAogICAgbW92ZXRvLm8gbXVsdGkubyByYXNw Lm8gcmVnZXhwLm8gc2FtLm8gc2hlbGwubyBzdHJpbmcubyBzeXMubyB1dGlsLm8geGVjLm8gXAog ICAgdW5peC5vCgpIRFI9ZXJyb3JzLmggbWVzZy5oIHBhcnNlLmggc2FtLmgKCkNGTEFHUz0tSS4g LUkuLi9pbmNsdWRlCgpDQz1nY2MgLVdhbGwgLU8zIAkjIEdjYwojQ0M9Y2MgLXhDQyAtdiAtZmFz dAkjIFNvbGFyaXMgV29ya3Nob3AKClRBUkc9c2FtCmFsbDogJChUQVJHKQoKJChPQkopOiAkKEhE UikKCiQoVEFSRyk6ICQoT0JKKSAkKEhEUikKCSQoQ0MpICQoT0JKKSAuLi9saWIvbGliLmEgLW8g c2FtCmNsZWFuOgoJcm0gLWYgKi5vICQoVEFSRykgdGFncwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL3NhbS9hZGRyZXNzLmMAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAwNzY1MwAwNzExMTYzMTM1 MAAwMDE1MzQxADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0 YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2luY2x1ZGUgInNhbS5oIgojaW5jbHVkZSAicGFyc2Uu aCIKCkFkZHJlc3MJYWRkcjsKU3RyaW5nCWxhc3RwYXQ7CmludAlwYXRzZXQ7CkZpbGUJKm1lbnU7 CgpGaWxlCSptYXRjaGZpbGUoU3RyaW5nKik7CkFkZHJlc3MJY2hhcmFkZHIoUG9zbiwgQWRkcmVz cywgaW50KTsKCkFkZHJlc3MKYWRkcmVzcyhBZGRyICphcCwgQWRkcmVzcyBhLCBpbnQgc2lnbikK ewoJRmlsZSAqZiA9IGEuZjsKCUFkZHJlc3MgYTEsIGEyOwoKCWRvewoJCXN3aXRjaChhcC0+dHlw ZSl7CgkJY2FzZSAnbCc6CgkJY2FzZSAnIyc6CgkJCWEgPSAoKihhcC0+dHlwZT09JyMnP2NoYXJh ZGRyOmxpbmVhZGRyKSkoYXAtPm51bSwgYSwgc2lnbik7CgkJCWJyZWFrOwoKCQljYXNlICcuJzoK CQkJYSA9IGYtPmRvdDsKCQkJYnJlYWs7CgoJCWNhc2UgJyQnOgoJCQlhLnIucDEgPSBhLnIucDIg PSBmLT5VLm5jOwoJCQlicmVhazsKCgkJY2FzZSAnXCcnOgoJCQlhLnIgPSBmLT5tYXJrOwoJCQli cmVhazsKCgkJY2FzZSAnPyc6CgkJCXNpZ24gPSAtc2lnbjsKCQkJaWYoc2lnbiA9PSAwKQoJCQkJ c2lnbiA9IC0xOwoJCQkvKiBmYWxsIHRocm91Z2ggKi8KCQljYXNlICcvJzoKCQkJbmV4dG1hdGNo KGYsIGFwLT5hcmUsIHNpZ24+PTA/IGEuci5wMiA6IGEuci5wMSwgc2lnbik7CgkJCWEuciA9IHNl bC5wWzBdOwoJCQlicmVhazsKCgkJY2FzZSAnIic6CgkJCWEgPSBtYXRjaGZpbGUoYXAtPmFyZSkt PmRvdDsKCQkJZiA9IGEuZjsKCQkJaWYoZi0+dW5yZWFkKQoJCQkJbG9hZChmKTsKCQkJYnJlYWs7 CgoJCWNhc2UgJyonOgoJCQlhLnIucDEgPSAwLCBhLnIucDIgPSBmLT5VLm5jOwoJCQlyZXR1cm4g YTsKCgkJY2FzZSAnLCc6CgkJY2FzZSAnOyc6CgkJCWlmKGFwLT5sZWZ0KQoJCQkJYTEgPSBhZGRy ZXNzKGFwLT5sZWZ0LCBhLCAwKTsKCQkJZWxzZQoJCQkJYTEuZiA9IGEuZiwgYTEuci5wMSA9IGEx LnIucDIgPSAwOwoJCQlpZihhcC0+dHlwZSA9PSAnOycpewoJCQkJZiA9IGExLmY7CgkJCQlhID0g YTE7CgkJCQlmLT5kb3QgPSBhMTsKCQkJfQoJCQlpZihhcC0+bmV4dCkKCQkJCWEyID0gYWRkcmVz cyhhcC0+bmV4dCwgYSwgMCk7CgkJCWVsc2UKCQkJCWEyLmYgPSBhLmYsIGEyLnIucDEgPSBhMi5y LnAyID0gZi0+VS5uYzsKCQkJaWYoYTEuZiAhPSBhMi5mKQoJCQkJZXJyb3IoRW9yZGVyKTsKCQkJ YS5mID0gYTEuZiwgYS5yLnAxID0gYTEuci5wMSwgYS5yLnAyID0gYTIuci5wMjsKCQkJaWYoYS5y LnAyIDwgYS5yLnAxKQoJCQkJZXJyb3IoRW9yZGVyKTsKCQkJcmV0dXJuIGE7CgoJCWNhc2UgJysn OgoJCWNhc2UgJy0nOgoJCQlzaWduID0gMTsKCQkJaWYoYXAtPnR5cGUgPT0gJy0nKQoJCQkJc2ln biA9IC0xOwoJCQlpZihhcC0+bmV4dD09MCB8fCBhcC0+bmV4dC0+dHlwZT09JysnIHx8IGFwLT5u ZXh0LT50eXBlPT0nLScpCgkJCQlhID0gbGluZWFkZHIoMUwsIGEsIHNpZ24pOwoJCQlicmVhazsK CQlkZWZhdWx0OgoJCQlwYW5pYygiYWRkcmVzcyIpOwoJCQlyZXR1cm4gYTsKCQl9Cgl9d2hpbGUo YXAgPSBhcC0+bmV4dCk7CS8qIGFzc2lnbiA9ICovCglyZXR1cm4gYTsKfQoKdm9pZApuZXh0bWF0 Y2goRmlsZSAqZiwgU3RyaW5nICpyLCBQb3NuIHAsIGludCBzaWduKQp7Cgljb21waWxlKHIpOwoJ aWYoc2lnbiA+PSAwKXsKCQlpZighZXhlY3V0ZShmLCBwLCBJTkZJTklUWSkpCgkJCWVycm9yKEVz ZWFyY2gpOwoJCWlmKHNlbC5wWzBdLnAxPT1zZWwucFswXS5wMiAmJiBzZWwucFswXS5wMT09cCl7 CgkJCWlmKCsrcD5mLT5VLm5jKQoJCQkJcCA9IDA7CgkJCWlmKCFleGVjdXRlKGYsIHAsIElORklO SVRZKSkKCQkJCXBhbmljKCJhZGRyZXNzIik7CgkJfQoJfWVsc2V7CgkJaWYoIWJleGVjdXRlKGYs IHApKQoJCQllcnJvcihFc2VhcmNoKTsKCQlpZihzZWwucFswXS5wMT09c2VsLnBbMF0ucDIgJiYg c2VsLnBbMF0ucDI9PXApewoJCQlpZigtLXA8MCkKCQkJCXAgPSBmLT5VLm5jOwoJCQlpZighYmV4 ZWN1dGUoZiwgcCkpCgkJCQlwYW5pYygiYWRkcmVzcyIpOwoJCX0KCX0KfQoKRmlsZSAqCm1hdGNo ZmlsZShTdHJpbmcgKnIpCnsKCUZpbGUgKmY7CglGaWxlICptYXRjaCA9IDA7CglpbnQgaTsKCglm b3IoaSA9IDA7IGk8ZmlsZS5udXNlZDsgaSsrKXsKCQlmID0gZmlsZS5maWxlcHB0cltpXTsKCQlp ZihmID09IGNtZCkKCQkJY29udGludWU7CgkJaWYoZmlsZW1hdGNoKGYsIHIpKXsKCQkJaWYobWF0 Y2gpCgkJCQllcnJvcihFbWFueWZpbGVzKTsKCQkJbWF0Y2ggPSBmOwoJCX0KCX0KCWlmKCFtYXRj aCkKCQllcnJvcihFZnNlYXJjaCk7CglyZXR1cm4gbWF0Y2g7Cn0KCmludApmaWxlbWF0Y2goRmls ZSAqZiwgU3RyaW5nICpyKQp7CgljaGFyICpjLCBidWZbU1RSU0laRSsxMDBdOwoJU3RyaW5nICp0 OwoKCWMgPSBTdHJ0b2MoJmYtPm5hbWUpOwoJc3ByaW50KGJ1ZiwgIiVjJWMlYyAlc1xuIiwgIiAn IltmLT5tb2RdLAoJCSItKyJbZi0+cmFzcCE9MF0sICIgLiJbZj09Y3VyZmlsZV0sIGMpOwoJZnJl ZShjKTsKCXQgPSB0bXBjc3RyKGJ1Zik7CglTdHJkdXBsc3RyKCZnZW5zdHIsIHQpOwoJZnJlZXRt cHN0cih0KTsKCS8qIEEgbGl0dGxlIGRpcnR5Li4uICovCglpZihtZW51ID09IDApCgkJbWVudSA9 IGZpbGVvcGVuKCk7CglidWZyZXNldCgmbWVudS0+VSk7CglidWZpbnNlcnQoJm1lbnUtPlUsIDAs IGdlbnN0ci5zLCBnZW5zdHIubik7Cgljb21waWxlKHIpOwoJcmV0dXJuIGV4ZWN1dGUobWVudSwg MCwgbWVudS0+VS5uYyk7Cn0KCkFkZHJlc3MKY2hhcmFkZHIoUG9zbiBsLCBBZGRyZXNzIGFkZHIs IGludCBzaWduKQp7CglpZihzaWduID09IDApCgkJYWRkci5yLnAxID0gYWRkci5yLnAyID0gbDsK CWVsc2UgaWYoc2lnbiA8IDApCgkJYWRkci5yLnAyID0gYWRkci5yLnAxLT1sOwoJZWxzZSBpZihz aWduID4gMCkKCQlhZGRyLnIucDEgPSBhZGRyLnIucDIrPWw7CglpZihhZGRyLnIucDE8MCB8fCBh ZGRyLnIucDI+YWRkci5mLT5VLm5jKQoJCWVycm9yKEVyYW5nZSk7CglyZXR1cm4gYWRkcjsKfQoK QWRkcmVzcwpsaW5lYWRkcihQb3NuIGwsIEFkZHJlc3MgYWRkciwgaW50IHNpZ24pCnsKCWludCBu OwoJaW50IGM7CglGaWxlICpmID0gYWRkci5mOwoJQWRkcmVzcyBhOwoJUG9zbiBwOwoKCWEuZiA9 IGY7CglpZihzaWduID49IDApewoJCWlmKGwgPT0gMCl7CgkJCWlmKHNpZ249PTAgfHwgYWRkci5y LnAyPT0wKXsKCQkJCWEuci5wMSA9IGEuci5wMiA9IDA7CgkJCQlyZXR1cm4gYTsKCQkJfQoJCQlh LnIucDEgPSBhZGRyLnIucDI7CgkJCXAgPSBhZGRyLnIucDItMTsKCQl9ZWxzZXsKCQkJaWYoc2ln bj09MCB8fCBhZGRyLnIucDI9PTApewoJCQkJcCA9IChQb3NuKTA7CgkJCQluID0gMTsKCQkJfWVs c2V7CgkJCQlwID0gYWRkci5yLnAyLTE7CgkJCQluID0gZmlsZXJlYWRjKGYsIHArKyk9PSdcbic7 CgkJCX0KCQkJd2hpbGUobiA8IGwpewoJCQkJaWYocCA+PSBmLT5VLm5jKQoJCQkJCWVycm9yKEVy YW5nZSk7CgkJCQlpZihmaWxlcmVhZGMoZiwgcCsrKSA9PSAnXG4nKQoJCQkJCW4rKzsKCQkJfQoJ CQlhLnIucDEgPSBwOwoJCX0KCQl3aGlsZShwIDwgZi0+VS5uYyAmJiBmaWxlcmVhZGMoZiwgcCsr KSE9J1xuJykKCQkJOwoJCWEuci5wMiA9IHA7Cgl9ZWxzZXsKCQlwID0gYWRkci5yLnAxOwoJCWlm KGwgPT0gMCkKCQkJYS5yLnAyID0gYWRkci5yLnAxOwoJCWVsc2V7CgkJCWZvcihuID0gMDsgbjxs OyApewkvKiBhbHdheXMgcnVucyBvbmNlICovCgkJCQlpZihwID09IDApewoJCQkJCWlmKCsrbiAh PSBsKQoJCQkJCQllcnJvcihFcmFuZ2UpOwoJCQkJfWVsc2V7CgkJCQkJYyA9IGZpbGVyZWFkYyhm LCBwLTEpOwoJCQkJCWlmKGMgIT0gJ1xuJyB8fCArK24gIT0gbCkKCQkJCQkJcC0tOwoJCQkJfQoJ CQl9CgkJCWEuci5wMiA9IHA7CgkJCWlmKHAgPiAwKQoJCQkJcC0tOwoJCX0KCQl3aGlsZShwID4g MCAmJiBmaWxlcmVhZGMoZiwgcC0xKSE9J1xuJykJLyogbGluZXMgc3RhcnQgYWZ0ZXIgYSBuZXds aW5lICovCgkJCXAtLTsKCQlhLnIucDEgPSBwOwoJfQoJcmV0dXJuIGE7Cn0KAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAHNhbTJrL3NhbS9idWZmLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1MQAwMDAwMDAxMjA2MwAwNzExMjA0MzAwNQAwMDE0NjIw ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3 YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAI2luY2x1ZGUgInNhbS5oIgoKZW51bQp7CglTbG9wID0gMTAwIAkvKiBy b29tIHRvIGdyb3cgd2l0aCByZWFsbG9jYXRpb24gKi8KfTsKCnN0YXRpYwp2b2lkCnNpemVjYWNo ZShCdWZmZXIgKmIsIHVpbnQgbikKewoJaWYobiA8PSBiLT5jbWF4KQoJCXJldHVybjsKCWItPmNt YXggPSBuK1Nsb3A7CgliLT5jID0gcnVuZXJlYWxsb2MoYi0+YywgYi0+Y21heCk7Cn0KCnN0YXRp Ywp2b2lkCmFkZGJsb2NrKEJ1ZmZlciAqYiwgdWludCBpLCB1aW50IG4pCnsKCWlmKGkgPiBiLT5u YmwpCgkJcGFuaWMoImludGVybmFsIGVycm9yOiBhZGRibG9jayIpOwoKCWItPmJsID0gcmVhbGxv YyhiLT5ibCwgKGItPm5ibCsxKSpzaXplb2YgYi0+YmxbMF0pOwoJaWYoaSA8IGItPm5ibCkKCQlt ZW1tb3ZlKGItPmJsK2krMSwgYi0+YmwraSwgKGItPm5ibC1pKSpzaXplb2YoQmxvY2sqKSk7Cgli LT5ibFtpXSA9IGRpc2tuZXdibG9jayhkaXNrLCBuKTsKCWItPm5ibCsrOwp9CgpzdGF0aWMKdm9p ZApkZWxibG9jayhCdWZmZXIgKmIsIHVpbnQgaSkKewoJaWYoaSA+PSBiLT5uYmwpCgkJcGFuaWMo ImludGVybmFsIGVycm9yOiBkZWxibG9jayIpOwoKCWItPm5ibC0tOwoJZGlza3JlbGVhc2UoZGlz aywgYi0+YmxbaV0pOwoJaWYoaSA8IGItPm5ibCkKCQltZW1tb3ZlKGItPmJsK2ksIGItPmJsK2kr MSwgKGItPm5ibC1pKSpzaXplb2YoQmxvY2sqKSk7CgliLT5ibCA9IHJlYWxsb2MoYi0+YmwsIGIt Pm5ibCpzaXplb2YgYi0+YmxbMF0pOwp9CgovKgogKiBNb3ZlIGNhY2hlIHNvIGItPmNxIDw9IHEw IDwgYi0+Y3ErYi0+Y25jLgogKiBJZiBhdCB2ZXJ5IGVuZCwgcTAgd2lsbCBmYWxsIG9uIGVuZCBv ZiBjYWNoZSBibG9jay4KICovCgpzdGF0aWMKdm9pZApmbHVzaChCdWZmZXIgKmIpCnsKCWlmKGIt PmNkaXJ0eSB8fCBiLT5jbmM9PTApewoJCWlmKGItPmNuYyA9PSAwKQoJCQlkZWxibG9jayhiLCBi LT5jYmkpOwoJCWVsc2UKCQkJZGlza3dyaXRlKGRpc2ssICZiLT5ibFtiLT5jYmldLCBiLT5jLCBi LT5jbmMpOwoJCWItPmNkaXJ0eSA9IEZBTFNFOwoJfQp9CgpzdGF0aWMKdm9pZApzZXRjYWNoZShC dWZmZXIgKmIsIHVpbnQgcTApCnsKCUJsb2NrICoqYmxwLCAqYmw7Cgl1aW50IGksIHE7CgoJaWYo cTAgPiBiLT5uYykKCQlwYW5pYygiaW50ZXJuYWwgZXJyb3I6IHNldGNhY2hlIik7CgkvKgoJICog Zmx1c2ggYW5kIHJlbG9hZCBpZiBxMCBpcyBub3QgaW4gY2FjaGUuCgkgKi8KCWlmKGItPm5jID09 IDAgfHwgKGItPmNxPD1xMCAmJiBxMDxiLT5jcStiLT5jbmMpKQoJCXJldHVybjsKCS8qCgkgKiBp ZiBxMCBpcyBhdCBlbmQgb2YgZmlsZSBhbmQgZW5kIG9mIGNhY2hlLCBjb250aW51ZSB0byBncm93 IHRoaXMgYmxvY2sKCSAqLwoJaWYocTA9PWItPm5jICYmIHEwPT1iLT5jcStiLT5jbmMgJiYgYi0+ Y25jPD1NYXhibG9jaykKCQlyZXR1cm47CglmbHVzaChiKTsKCS8qIGZpbmQgYmxvY2sgKi8KCWlm KHEwIDwgYi0+Y3EpewoJCXEgPSAwOwoJCWkgPSAwOwoJfWVsc2V7CgkJcSA9IGItPmNxOwoJCWkg PSBiLT5jYmk7Cgl9CglibHAgPSAmYi0+YmxbaV07Cgl3aGlsZShxKygqYmxwKS0+VS5uIDw9IHEw ICYmIHErKCpibHApLT5VLm4gPCBiLT5uYyl7CgkJcSArPSAoKmJscCktPlUubjsKCQlpKys7CgkJ YmxwKys7CgkJaWYoaSA+PSBiLT5uYmwpCgkJCXBhbmljKCJibG9jayBub3QgZm91bmQiKTsKCX0K CWJsID0gKmJscDsKCS8qIHJlbWVtYmVyIHBvc2l0aW9uICovCgliLT5jYmkgPSBpOwoJYi0+Y3Eg PSBxOwoJc2l6ZWNhY2hlKGIsIGJsLT5VLm4pOwoJYi0+Y25jID0gYmwtPlUubjsKCS8qcmVhZCBi bG9jayovCglkaXNrcmVhZChkaXNrLCBibCwgYi0+YywgYi0+Y25jKTsKfQoKdm9pZApidWZpbnNl cnQoQnVmZmVyICpiLCB1aW50IHEwLCBSdW5lICpzLCB1aW50IG4pCnsKCXVpbnQgaSwgbSwgdCwg b2ZmOwoKCWlmKHEwID4gYi0+bmMpCgkJcGFuaWMoImludGVybmFsIGVycm9yOiBidWZpbnNlcnQi KTsKCgl3aGlsZShuID4gMCl7CgkJc2V0Y2FjaGUoYiwgcTApOwoJCW9mZiA9IHEwLWItPmNxOwoJ CWlmKGItPmNuYytuIDw9IE1heGJsb2NrKXsKCQkJLyogRXZlcnl0aGluZyBmaXRzIGluIG9uZSBi bG9jay4gKi8KCQkJdCA9IGItPmNuYytuOwoJCQltID0gbjsKCQkJaWYoYi0+YmwgPT0gbmlsKXsJ LyogYWxsb2NhdGUgKi8KCQkJCWlmKGItPmNuYyAhPSAwKQoJCQkJCXBhbmljKCJpbnRlcm5hbCBl cnJvcjogYnVmaW5zZXJ0MSBjbmMhPTAiKTsKCQkJCWFkZGJsb2NrKGIsIDAsIHQpOwoJCQkJYi0+ Y2JpID0gMDsKCQkJfQoJCQlzaXplY2FjaGUoYiwgdCk7CgkJCXJ1bmVtb3ZlKGItPmMrb2ZmK20s IGItPmMrb2ZmLCBiLT5jbmMtb2ZmKTsKCQkJcnVuZW1vdmUoYi0+YytvZmYsIHMsIG0pOwoJCQli LT5jbmMgPSB0OwoJCQlnb3RvIFRhaWw7CgkJfQoJCS8qCgkJICogV2UgbXVzdCBtYWtlIGEgbmV3 IGJsb2NrLiAgSWYgcTAgaXMgYXQKCQkgKiB0aGUgdmVyeSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRo aXMgYmxvY2ssCgkJICoganVzdCBtYWtlIGEgbmV3IGJsb2NrIGFuZCBmaWxsIGl0LgoJCSAqLwoJ CWlmKHEwPT1iLT5jcSB8fCBxMD09Yi0+Y3ErYi0+Y25jKXsKCQkJaWYoYi0+Y2RpcnR5KQoJCQkJ Zmx1c2goYik7CgkJCW0gPSBtaW4obiwgTWF4YmxvY2spOwoJCQlpZihiLT5ibCA9PSBuaWwpewkv KiBhbGxvY2F0ZSAqLwoJCQkJaWYoYi0+Y25jICE9IDApCgkJCQkJcGFuaWMoImludGVybmFsIGVy cm9yOiBidWZpbnNlcnQyIGNuYyE9MCIpOwoJCQkJaSA9IDA7CgkJCX1lbHNlewoJCQkJaSA9IGIt PmNiaTsKCQkJCWlmKHEwID4gYi0+Y3EpCgkJCQkJaSsrOwoJCQl9CgkJCWFkZGJsb2NrKGIsIGks IG0pOwoJCQlzaXplY2FjaGUoYiwgbSk7CgkJCXJ1bmVtb3ZlKGItPmMsIHMsIG0pOwoJCQliLT5j cSA9IHEwOwoJCQliLT5jYmkgPSBpOwoJCQliLT5jbmMgPSBtOwoJCQlnb3RvIFRhaWw7CgkJfQoJ CS8qCgkJICogU3BsaXQgdGhlIGJsb2NrOyBjdXQgb2ZmIHRoZSByaWdodCBzaWRlIGFuZAoJCSAq IGxldCBnbyBvZiBpdC4KCQkgKi8KCQltID0gYi0+Y25jLW9mZjsKCQlpZihtID4gMCl7CgkJCWkg PSBiLT5jYmkrMTsKCQkJYWRkYmxvY2soYiwgaSwgbSk7CgkJCWRpc2t3cml0ZShkaXNrLCAmYi0+ YmxbaV0sIGItPmMrb2ZmLCBtKTsKCQkJYi0+Y25jIC09IG07CgkJfQoJCS8qCgkJICogTm93IGF0 IGVuZCBvZiBibG9jay4gIFRha2UgYXMgbXVjaCBpbnB1dAoJCSAqIGFzIHBvc3NpYmxlIGFuZCB0 YWNrIGl0IG9uIGVuZCBvZiBibG9jay4KCQkgKi8KCQltID0gbWluKG4sIE1heGJsb2NrLWItPmNu Yyk7CgkJc2l6ZWNhY2hlKGIsIGItPmNuYyttKTsKCQlydW5lbW92ZShiLT5jK2ItPmNuYywgcywg bSk7CgkJYi0+Y25jICs9IG07CiAgVGFpbDoKCQliLT5uYyArPSBtOwoJCXEwICs9IG07CgkJcyAr PSBtOwoJCW4gLT0gbTsKCQliLT5jZGlydHkgPSBUUlVFOwoJfQp9Cgp2b2lkCmJ1ZmRlbGV0ZShC dWZmZXIgKmIsIHVpbnQgcTAsIHVpbnQgcTEpCnsKCXVpbnQgbSwgbiwgb2ZmOwoKCWlmKCEocTA8 PXExICYmIHEwPD1iLT5uYyAmJiBxMTw9Yi0+bmMpKQoJCXBhbmljKCJpbnRlcm5hbCBlcnJvcjog YnVmZGVsZXRlIik7Cgl3aGlsZShxMSA+IHEwKXsKCQlzZXRjYWNoZShiLCBxMCk7CgkJb2ZmID0g cTAtYi0+Y3E7CgkJaWYocTEgPiBiLT5jcStiLT5jbmMpCgkJCW4gPSBiLT5jbmMgLSBvZmY7CgkJ ZWxzZQoJCQluID0gcTEtcTA7CgkJbSA9IGItPmNuYyAtIChvZmYrbik7CgkJaWYobSA+IDApCgkJ CXJ1bmVtb3ZlKGItPmMrb2ZmLCBiLT5jK29mZituLCBtKTsKCQliLT5jbmMgLT0gbjsKCQliLT5j ZGlydHkgPSBUUlVFOwoJCXExIC09IG47CgkJYi0+bmMgLT0gbjsKCX0KfQoKdWludApidWZsb2Fk KEJ1ZmZlciAqYiwgdWludCBxMCwgaW50IGZkLCBpbnQgKm51bGxzKQp7CgljaGFyICpwOwoJUnVu ZSAqcjsKCWludCBsLCBtLCBuLCBuYiwgbnI7Cgl1aW50IHExOwoKCWlmKHEwID4gYi0+bmMpCgkJ cGFuaWMoImludGVybmFsIGVycm9yOiBidWZsb2FkIik7CglwID0gbWFsbG9jKChNYXhibG9jaytV VEZtYXgrMSkqc2l6ZW9mIHBbMF0pOwoJaWYocCA9PSBuaWwpCgkJcGFuaWMoImJ1ZmxvYWQ6IG1h bGxvYyBmYWlsZWQiKTsKCXIgPSBydW5lbWFsbG9jKE1heGJsb2NrKTsKCW0gPSAwOwoJbiA9IDE7 CglxMSA9IHEwOwoJLyoKCSAqIEF0IHRvcCBvZiBsb29wLCBtYXkgaGF2ZSBtIGJ5dGVzIGxlZnQg b3ZlciBmcm9tCgkgKiBsYXN0IHBhc3MsIHBvc3NpYmx5IHJlcHJlc2VudGluZyBhIHBhcnRpYWwg cnVuZS4KCSAqLwoJd2hpbGUobiA+IDApewoJCW4gPSByZWFkKGZkLCBwK20sIE1heGJsb2NrKTsK CQlpZihuIDwgMCl7CgkJCWVycm9yKEVidWZsb2FkKTsKCQkJYnJlYWs7CgkJfQoJCW0gKz0gbjsK CQlwW21dID0gMDsKCQlsID0gbTsKCQlpZihuID4gMCkKCQkJbCAtPSBVVEZtYXg7CgkJY3Z0dG9y dW5lcyhwLCBsLCByLCAmbmIsICZuciwgbnVsbHMpOwoJCXJ1bmVtb3ZlKHAsIHArbmIsIG0tbmIp OwoJCW0gLT0gbmI7CgkJYnVmaW5zZXJ0KGIsIHExLCByLCBucik7CgkJcTEgKz0gbnI7Cgl9Cglm cmVlKHApOwoJZnJlZShyKTsKCXJldHVybiBxMS1xMDsKfQoKdm9pZApidWZyZWFkKEJ1ZmZlciAq YiwgdWludCBxMCwgUnVuZSAqcywgdWludCBuKQp7Cgl1aW50IG07CgoJaWYoIShxMDw9Yi0+bmMg JiYgcTArbjw9Yi0+bmMpKQoJCXBhbmljKCJidWZyZWFkOiBpbnRlcm5hbCBlcnJvciIpOwoKCXdo aWxlKG4gPiAwKXsKCQlzZXRjYWNoZShiLCBxMCk7CgkJbSA9IG1pbihuLCBiLT5jbmMtKHEwLWIt PmNxKSk7CgkJcnVuZW1vdmUocywgYi0+YysocTAtYi0+Y3EpLCBtKTsKCQlxMCArPSBtOwoJCXMg Kz0gbTsKCQluIC09IG07Cgl9Cn0KCnZvaWQKYnVmcmVzZXQoQnVmZmVyICpiKQp7CglpbnQgaTsK CgliLT5uYyA9IDA7CgliLT5jbmMgPSAwOwoJYi0+Y3EgPSAwOwoJYi0+Y2RpcnR5ID0gMDsKCWIt PmNiaSA9IDA7CgkvKiBkZWxldGUgYmFja3dhcmRzIHRvIGF2b2lkIG7CsiBiZWhhdmlvciAqLwoJ Zm9yKGk9Yi0+bmJsLTE7IC0taT49MDsgKQoJCWRlbGJsb2NrKGIsIGkpOwp9Cgp2b2lkCmJ1ZmNs b3NlKEJ1ZmZlciAqYikKewoJYnVmcmVzZXQoYik7CglmcmVlKGItPmMpOwoJYi0+YyA9IG5pbDsK CWItPmNuYyA9IDA7CglmcmVlKGItPmJsKTsKCWItPmJsID0gbmlsOwoJYi0+bmJsID0gMDsKfQoA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHNhbTJrL3NhbS9jbWQuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAw MDE3MzcAMDAwMDE1MQAwMDAwMDAyNDM0MwAwNzExMTYyMjEwNQAwMDE0NDUwADAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAw MDAwMDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAI2luY2x1ZGUgInNhbS5oIgojaW5jbHVkZSAicGFyc2UuaCIKCnN0YXRpYyBjaGFyCWxpbmV4 W109IlxuIjsKc3RhdGljIGNoYXIJd29yZHhbXT0iIFx0XG4iOwpzdHJ1Y3QgY21kdGFiIGNtZHRh YltdPXsKLyoJY21kYwl0ZXh0CXJlZ2V4cAlhZGRyCWRlZmNtZAlkZWZhZGRyCWNvdW50CXRva2Vu CSBmbgkqLwoJJ1xuJywJMCwJMCwJMCwJMCwJYURvdCwJMCwJMCwJbmxfY21kLAoJJ2EnLAkxLAkw LAkwLAkwLAlhRG90LAkwLAkwLAlhX2NtZCwKCSdiJywJMCwJMCwJMCwJMCwJYU5vLAkwLAlsaW5l eCwJYl9jbWQsCgknQicsCTAsCTAsCTAsCTAsCWFObywJMCwJbGluZXgsCWJfY21kLAoJJ2MnLAkx LAkwLAkwLAkwLAlhRG90LAkwLAkwLAljX2NtZCwKCSdkJywJMCwJMCwJMCwJMCwJYURvdCwJMCwJ MCwJZF9jbWQsCgknRCcsCTAsCTAsCTAsCTAsCWFObywJMCwJbGluZXgsCURfY21kLAoJJ2UnLAkw LAkwLAkwLAkwLAlhTm8sCTAsCXdvcmR4LAllX2NtZCwKCSdmJywJMCwJMCwJMCwJMCwJYU5vLAkw LAl3b3JkeCwJZl9jbWQsCgknZycsCTAsCTEsCTAsCSdwJywJYURvdCwJMCwJMCwJZ19jbWQsCgkn aScsCTEsCTAsCTAsCTAsCWFEb3QsCTAsCTAsCWlfY21kLAoJJ2snLAkwLAkwLAkwLAkwLAlhRG90 LAkwLAkwLAlrX2NtZCwKCSdtJywJMCwJMCwJMSwJMCwJYURvdCwJMCwJMCwJbV9jbWQsCgknbics CTAsCTAsCTAsCTAsCWFObywJMCwJMCwJbl9jbWQsCgkncCcsCTAsCTAsCTAsCTAsCWFEb3QsCTAs CTAsCXBfY21kLAoJJ3EnLAkwLAkwLAkwLAkwLAlhTm8sCTAsCTAsCXFfY21kLAoJJ3InLAkwLAkw LAkwLAkwLAlhRG90LAkwLAl3b3JkeCwJZV9jbWQsCgkncycsCTAsCTEsCTAsCTAsCWFEb3QsCTEs CTAsCXNfY21kLAoJJ3QnLAkwLAkwLAkxLAkwLAlhRG90LAkwLAkwLAltX2NtZCwKCSd1JywJMCwJ MCwJMCwJMCwJYU5vLAkyLAkwLAl1X2NtZCwKCSd2JywJMCwJMSwJMCwJJ3AnLAlhRG90LAkwLAkw LAlnX2NtZCwKCSd3JywJMCwJMCwJMCwJMCwJYUFsbCwJMCwJd29yZHgsCXdfY21kLAoJJ3gnLAkw LAkxLAkwLAkncCcsCWFEb3QsCTAsCTAsCXhfY21kLAoJJ3knLAkwLAkxLAkwLAkncCcsCWFEb3Qs CTAsCTAsCXhfY21kLAoJJ1gnLAkwLAkxLAkwLAknZicsCWFObywJMCwJMCwJWF9jbWQsCgknWScs CTAsCTEsCTAsCSdmJywJYU5vLAkwLAkwLAlYX2NtZCwKCSchJywJMCwJMCwJMCwJMCwJYU5vLAkw LAlsaW5leCwJcGxhbjlfY21kLAoJJz4nLAkwLAkwLAkwLAkwLAlhRG90LAkwLAlsaW5leCwJcGxh bjlfY21kLAoJJzwnLAkwLAkwLAkwLAkwLAlhRG90LAkwLAlsaW5leCwJcGxhbjlfY21kLAoJJ3wn LAkwLAkwLAkwLAkwLAlhRG90LAkwLAlsaW5leCwJcGxhbjlfY21kLAoJJz0nLAkwLAkwLAkwLAkw LAlhRG90LAkwLAlsaW5leCwJZXFfY21kLAoJJ2MnfDB4MTAwLDAsCTAsCTAsCTAsCWFObywJMCwJ d29yZHgsCWNkX2NtZCwKCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCn07CkNtZAkqcGFyc2VjbWQo aW50KTsKQWRkcgkqY29tcG91bmRhZGRyKHZvaWQpOwpBZGRyCSpzaW1wbGVhZGRyKHZvaWQpOwp2 b2lkCWZyZWVjbWQodm9pZCk7CnZvaWQJb2tkZWxpbShpbnQpOwoKUnVuZQlsaW5lW0JMT0NLU0la RV07ClJ1bmUJdGVybWxpbmVbQkxPQ0tTSVpFXTsKUnVuZQkqbGluZXAgPSBsaW5lOwpSdW5lCSp0 ZXJtaW5wID0gdGVybWxpbmU7ClJ1bmUJKnRlcm1vdXRwID0gdGVybWxpbmU7Ckxpc3QJY21kbGlz dDsKTGlzdAlhZGRybGlzdDsKTGlzdAlyZWxpc3Q7Ckxpc3QJc3RyaW5nbGlzdDsKaW50CWVvZjsK CnZvaWQKcmVzZXRjbWQodm9pZCkKewoJbGluZXAgPSBsaW5lOwoJKmxpbmVwID0gMDsKCXRlcm1p bnAgPSB0ZXJtb3V0cCA9IHRlcm1saW5lOwoJZnJlZWNtZCgpOwp9CgppbnQKaW5wdXRjKHZvaWQp CnsKCWludCBuLCBuYnVmOwoJY2hhciBidWZbM107CglSdW5lIHI7CgogICAgQWdhaW46CgluYnVm ID0gMDsKCWlmKGRvd25sb2FkZWQpewoJCXdoaWxlKHRlcm1vdXRwID09IHRlcm1pbnApewoJCQlj bWR1cGRhdGUoKTsKCQkJaWYocGF0c2V0KQoJCQkJdGVsbHBhdCgpOwoJCQl3aGlsZSh0ZXJtbG9j a2VkID4gMCl7CgkJCQlvdXRUMChIdW5sb2NrKTsKCQkJCXRlcm1sb2NrZWQtLTsKCQkJfQoJCQlp ZihyY3YoKSA9PSAwKQoJCQkJcmV0dXJuIC0xOwoJCX0KCQlyID0gKnRlcm1vdXRwKys7CgkJaWYo dGVybW91dHAgPT0gdGVybWlucCkKCQkJdGVybWlucCA9IHRlcm1vdXRwID0gdGVybWxpbmU7Cgl9 ZWxzZXsKICAgCQlkb3sKCQkJbiA9IHJlYWQoMCwgYnVmK25idWYsIDEpOwoJCQlpZihuIDw9IDAp CgkJCQlyZXR1cm4gLTE7CgkJCW5idWYgKz0gbjsKCQl9d2hpbGUoIWZ1bGxydW5lKGJ1ZiwgbmJ1 ZikpOwoJCWNoYXJ0b3J1bmUoJnIsIGJ1Zik7Cgl9CglpZihyID09IDApewoJCXdhcm4oV251bGxz KTsKCQlnb3RvIEFnYWluOwoJfQoJcmV0dXJuIHI7Cn0KCmludAppbnB1dGxpbmUodm9pZCkKewoJ aW50IGksIGM7CgoJbGluZXAgPSBsaW5lOwoJaSA9IDA7Cglkb3sKCQlpZigoYyA9IGlucHV0Yygp KTw9MCkKCQkJcmV0dXJuIC0xOwoJCWlmKGkgPT0gKHNpemVvZiBsaW5lKS9SVU5FU0laRS0xKQoJ CQllcnJvcihFdG9vbG9uZyk7Cgl9d2hpbGUoKGxpbmVbaSsrXT1jKSAhPSAnXG4nKTsKCWxpbmVb aV0gPSAwOwoJcmV0dXJuIDE7Cn0KCmludApnZXRjaCh2b2lkKQp7CglpZihlb2YpCgkJcmV0dXJu IC0xOwoJaWYoKmxpbmVwPT0wICYmIGlucHV0bGluZSgpPDApewoJCWVvZiA9IFRSVUU7CgkJcmV0 dXJuIC0xOwoJfQoJcmV0dXJuICpsaW5lcCsrOwp9CgppbnQKbmV4dGModm9pZCkKewoJaWYoKmxp bmVwID09IDApCgkJcmV0dXJuIC0xOwoJcmV0dXJuICpsaW5lcDsKfQoKdm9pZAp1bmdldGNoKHZv aWQpCnsKCWlmKC0tbGluZXAgPCBsaW5lKQoJCXBhbmljKCJ1bmdldGNoIik7Cn0KClBvc24KZ2V0 bnVtKGludCBzaWdub2spCnsKCVBvc24gbj0wOwoJaW50IGMsIHNpZ247CgoJc2lnbiA9IDE7Cglp ZihzaWdub2s+MSAmJiBuZXh0YygpPT0nLScpewoJCXNpZ24gPSAtMTsKCQlnZXRjaCgpOwoJfQoJ aWYoKGM9bmV4dGMoKSk8JzAnIHx8ICc5JzxjKQkvKiBubyBudW1iZXIgZGVmYXVsdHMgdG8gMSAq LwoJCXJldHVybiBzaWduOwoJd2hpbGUoJzAnPD0oYz1nZXRjaCgpKSAmJiBjPD0nOScpCgkJbiA9 IG4qMTAgKyAoYy0nMCcpOwoJdW5nZXRjaCgpOwoJcmV0dXJuIHNpZ24qbjsKfQoKaW50CnNraXBi bCh2b2lkKQp7CglpbnQgYzsKCWRvCgkJYyA9IGdldGNoKCk7Cgl3aGlsZShjPT0nICcgfHwgYz09 J1x0Jyk7CglpZihjID49IDApCgkJdW5nZXRjaCgpOwoJcmV0dXJuIGM7Cn0KCnZvaWQKdGVybWNv bW1hbmQodm9pZCkKewoJUG9zbiBwOwoKCWZvcihwPWNtZHB0OyBwPGNtZC0+VS5uYzsgcCsrKXsK CQlpZih0ZXJtaW5wID49ICZ0ZXJtbGluZVtCTE9DS1NJWkVdKXsKCQkJY21kcHQgPSBjbWQtPlUu bmM7CgkJCWVycm9yKEV0b29sb25nKTsKCQl9CgkJKnRlcm1pbnArKyA9IGZpbGVyZWFkYyhjbWQs IHApOwoJfQoJY21kcHQgPSBjbWQtPlUubmM7Cn0KCnZvaWQKY21kbG9vcCh2b2lkKQp7CglDbWQg KmNtZHA7CglGaWxlICpvY3VyZmlsZTsKCWludCBsb2FkZWQ7CgoJZm9yKDs7KXsKCQlpZighZG93 bmxvYWRlZCAmJiBjdXJmaWxlICYmIGN1cmZpbGUtPnVucmVhZCkKCQkJbG9hZChjdXJmaWxlKTsK CQlpZigoY21kcCA9IHBhcnNlY21kKDApKT09MCl7CgkJCWlmKGRvd25sb2FkZWQpewoJCQkJcmVz Y3VlKCk7CgkJCQlleGl0cygiZW9mIik7CgkJCX0KCQkJYnJlYWs7CgkJfQoJCW9jdXJmaWxlID0g Y3VyZmlsZTsKCQlsb2FkZWQgPSBjdXJmaWxlICYmICFjdXJmaWxlLT51bnJlYWQ7CgkJaWYoY21k ZXhlYyhjdXJmaWxlLCBjbWRwKSA9PSAwKQoJCQlicmVhazsKCQlmcmVlY21kKCk7CgkJY21kdXBk YXRlKCk7CgkJdXBkYXRlKCk7CgkJaWYoZG93bmxvYWRlZCAmJiBjdXJmaWxlICYmCgkJICAgIChv Y3VyZmlsZSE9Y3VyZmlsZSB8fCAoIWxvYWRlZCAmJiAhY3VyZmlsZS0+dW5yZWFkKSkpCgkJCW91 dFRzKEhjdXJyZW50LCBjdXJmaWxlLT50YWcpOwoJCQkvKiBkb24ndCBhbGxvdyB0eXBlIGFoZWFk IG9uIGZpbGVzIHRoYXQgYXJlbid0IGJvdW5kICovCgkJaWYoZG93bmxvYWRlZCAmJiBjdXJmaWxl ICYmIGN1cmZpbGUtPnJhc3AgPT0gMCkKCQkJdGVybWlucCA9IHRlcm1vdXRwOwoJfQp9CgpDbWQg KgpuZXdjbWQodm9pZCl7CglDbWQgKnA7CgoJcCA9IGVtYWxsb2Moc2l6ZW9mKENtZCkpOwoJaW5z bGlzdCgmY21kbGlzdCwgY21kbGlzdC5udXNlZCwgKGxvbmcpcCk7CglyZXR1cm4gcDsKfQoKQWRk cioKbmV3YWRkcih2b2lkKQp7CglBZGRyICpwOwoKCXAgPSBlbWFsbG9jKHNpemVvZihBZGRyKSk7 CglpbnNsaXN0KCZhZGRybGlzdCwgYWRkcmxpc3QubnVzZWQsIChsb25nKXApOwoJcmV0dXJuIHA7 Cn0KClN0cmluZyoKbmV3cmUodm9pZCkKewoJU3RyaW5nICpwOwoKCXAgPSBlbWFsbG9jKHNpemVv ZihTdHJpbmcpKTsKCWluc2xpc3QoJnJlbGlzdCwgcmVsaXN0Lm51c2VkLCAobG9uZylwKTsKCVN0 cmluaXQocCk7CglyZXR1cm4gcDsKfQoKU3RyaW5nKgpuZXdzdHJpbmcodm9pZCkKewoJU3RyaW5n ICpwOwoKCXAgPSBlbWFsbG9jKHNpemVvZihTdHJpbmcpKTsKCWluc2xpc3QoJnN0cmluZ2xpc3Qs IHN0cmluZ2xpc3QubnVzZWQsIChsb25nKXApOwoJU3RyaW5pdChwKTsKCXJldHVybiBwOwp9Cgp2 b2lkCmZyZWVjbWQodm9pZCkKewoJaW50IGk7CgoJd2hpbGUoY21kbGlzdC5udXNlZCA+IDApCgkJ ZnJlZShjbWRsaXN0LnVjaGFycHB0clstLWNtZGxpc3QubnVzZWRdKTsKCXdoaWxlKGFkZHJsaXN0 Lm51c2VkID4gMCkKCQlmcmVlKGFkZHJsaXN0LnVjaGFycHB0clstLWFkZHJsaXN0Lm51c2VkXSk7 Cgl3aGlsZShyZWxpc3QubnVzZWQgPiAwKXsKCQlpID0gLS1yZWxpc3QubnVzZWQ7CgkJU3RyY2xv c2UocmVsaXN0LnN0cmluZ3BwdHJbaV0pOwoJCWZyZWUocmVsaXN0LnN0cmluZ3BwdHJbaV0pOwoJ fQoJd2hpbGUoc3RyaW5nbGlzdC5udXNlZD4wKXsKCQlpID0gLS1zdHJpbmdsaXN0Lm51c2VkOwoJ CVN0cmNsb3NlKHN0cmluZ2xpc3Quc3RyaW5ncHB0cltpXSk7CgkJZnJlZShzdHJpbmdsaXN0LnN0 cmluZ3BwdHJbaV0pOwoJfQp9CgppbnQKbG9va3VwKGludCBjKQp7CglpbnQgaTsKCglmb3IoaT0w OyBjbWR0YWJbaV0uY21kYzsgaSsrKQoJCWlmKGNtZHRhYltpXS5jbWRjID09IGMpCgkJCXJldHVy biBpOwoJcmV0dXJuIC0xOwp9Cgp2b2lkCm9rZGVsaW0oaW50IGMpCnsKCWlmKGM9PSdcXCcgfHwg KCdhJzw9YyAmJiBjPD0neicpCgl8fCAoJ0EnPD1jICYmIGM8PSdaJykgfHwgKCcwJzw9YyAmJiBj PD0nOScpKQoJCWVycm9yX2MoRWRlbGltLCBjKTsKfQoKdm9pZAphdG5sKHZvaWQpCnsKCXNraXBi bCgpOwoJaWYoZ2V0Y2goKSAhPSAnXG4nKQoJCWVycm9yKEVuZXdsaW5lKTsKfQoKdm9pZApnZXRy aHMoU3RyaW5nICpzLCBpbnQgZGVsaW0sIGludCBjbWQpCnsKCWludCBjOwoKCXdoaWxlKChjID0g Z2V0Y2goKSk+MCAmJiBjIT1kZWxpbSAmJiBjIT0nXG4nKXsKCQlpZihjID09ICdcXCcpewoJCQlp ZigoYz1nZXRjaCgpKSA8PSAwKQoJCQkJZXJyb3IoRWJhZHJocyk7CgkJCWlmKGMgPT0gJ1xuJyl7 CgkJCQl1bmdldGNoKCk7CgkJCQljPSdcXCc7CgkJCX1lbHNlIGlmKGMgPT0gJ24nKQoJCQkJYz0n XG4nOwoJCQllbHNlIGlmKGMhPWRlbGltICYmIChjbWQ9PSdzJyB8fCBjIT0nXFwnKSkJLyogcyBk b2VzIGl0cyBvd24gKi8KCQkJCVN0cmFkZGMocywgJ1xcJyk7CgkJfQoJCVN0cmFkZGMocywgYyk7 Cgl9Cgl1bmdldGNoKCk7CS8qIGxldCBjbGllbnQgcmVhZCB3aGV0aGVyIGRlbGltZXRlciwgJ1xu JyBvciB3aGF0ZXZlciAqLwp9CgpTdHJpbmcgKgpjb2xsZWN0dG9rZW4oY2hhciAqZW5kKQp7CglT dHJpbmcgKnMgPSBuZXdzdHJpbmcoKTsKCWludCBjOwoKCXdoaWxlKChjPW5leHRjKCkpPT0nICcg fHwgYz09J1x0JykKCQlTdHJhZGRjKHMsIGdldGNoKCkpOyAvKiBibGFua3Mgc2lnbmlmaWNhbnQg Zm9yIGdldG5hbWUoKSAqLwoJd2hpbGUoKGM9Z2V0Y2goKSk+MCAmJiB1dGZydW5lKGVuZCwgYyk9 PTApCgkJU3RyYWRkYyhzLCBjKTsKCVN0cmFkZGMocywgMCk7CglpZihjICE9ICdcbicpCgkJYXRu bCgpOwoJcmV0dXJuIHM7Cn0KClN0cmluZyAqCmNvbGxlY3R0ZXh0KHZvaWQpCnsKCVN0cmluZyAq cyA9IG5ld3N0cmluZygpOwoJaW50IGJlZ2xpbmUsIGksIGMsIGRlbGltOwoKCWlmKHNraXBibCgp PT0nXG4nKXsKCQlnZXRjaCgpOwoJCWkgPSAwOwoJCWRvewoJCQliZWdsaW5lID0gaTsKCQkJd2hp bGUoKGMgPSBnZXRjaCgpKT4wICYmIGMhPSdcbicpCgkJCQlpKyssIFN0cmFkZGMocywgYyk7CgkJ CWkrKywgU3RyYWRkYyhzLCAnXG4nKTsKCQkJaWYoYyA8IDApCgkJCQlnb3RvIFJldHVybjsKCQl9 d2hpbGUocy0+c1tiZWdsaW5lXSE9Jy4nIHx8IHMtPnNbYmVnbGluZSsxXSE9J1xuJyk7CgkJU3Ry ZGVsZXRlKHMsIHMtPm4tMiwgcy0+bik7Cgl9ZWxzZXsKCQlva2RlbGltKGRlbGltID0gZ2V0Y2go KSk7CgkJZ2V0cmhzKHMsIGRlbGltLCAnYScpOwoJCWlmKG5leHRjKCk9PWRlbGltKQoJCQlnZXRj aCgpOwoJCWF0bmwoKTsKCX0KICAgIFJldHVybjoKCVN0cmFkZGMocywgMCk7CQkvKiBKVVNUIEZP UiBDTURQUklOVCgpICovCglyZXR1cm4gczsKfQoKQ21kICoKcGFyc2VjbWQoaW50IG5lc3QpCnsK CWludCBpLCBjOwoJc3RydWN0IGNtZHRhYiAqY3Q7CglDbWQgKmNwLCAqbmNwOwoJQ21kIGNtZDsK CgljbWQubmV4dCA9IGNtZC5jY21kID0gMDsKCWNtZC5yZSA9IDA7CgljbWQuZmxhZyA9IGNtZC5u dW0gPSAwOwoJY21kLmFkZHIgPSBjb21wb3VuZGFkZHIoKTsKCWlmKHNraXBibCgpID09IC0xKQoJ CXJldHVybiAwOwoJaWYoKGM9Z2V0Y2goKSk9PS0xKQoJCXJldHVybiAwOwoJY21kLmNtZGMgPSBj OwoJaWYoY21kLmNtZGM9PSdjJyAmJiBuZXh0YygpPT0nZCcpewkvKiBzbGVhenkgdHdvLWNoYXJh Y3RlciBjYXNlICovCgkJZ2V0Y2goKTsJCS8qIHRoZSAnZCcgKi8KCQljbWQuY21kYz0nYyd8MHgx MDA7Cgl9CglpID0gbG9va3VwKGNtZC5jbWRjKTsKCWlmKGkgPj0gMCl7CgkJaWYoY21kLmNtZGMg PT0gJ1xuJykKCQkJZ290byBSZXR1cm47CS8qIGxldCBubF9jbWQgd29yayBpdCBhbGwgb3V0ICov CgkJY3QgPSAmY21kdGFiW2ldOwoJCWlmKGN0LT5kZWZhZGRyPT1hTm8gJiYgY21kLmFkZHIpCgkJ CWVycm9yKEVub2FkZHIpOwoJCWlmKGN0LT5jb3VudCkKCQkJY21kLm51bSA9IGdldG51bShjdC0+ Y291bnQpOwoJCWlmKGN0LT5yZWdleHApewoJCQkvKiB4IHdpdGhvdXQgcGF0dGVybiAtPiAuKlxu LCBpbmRpY2F0ZWQgYnkgY21kLnJlPT0wICovCgkJCS8qIFggd2l0aG91dCBwYXR0ZXJuIGlzIGFs bCBmaWxlcyAqLwoJCQlpZigoY3QtPmNtZGMhPSd4JyAmJiBjdC0+Y21kYyE9J1gnKSB8fAoJCQkg ICAoKGMgPSBuZXh0YygpKSE9JyAnICYmIGMhPSdcdCcgJiYgYyE9J1xuJykpewoJCQkJc2tpcGJs KCk7CgkJCQlpZigoYyA9IGdldGNoKCkpPT0nXG4nIHx8IGM8MCkKCQkJCQllcnJvcihFbm9wYXR0 ZXJuKTsKCQkJCW9rZGVsaW0oYyk7CgkJCQljbWQucmUgPSBnZXRyZWdleHAoYyk7CgkJCQlpZihj dC0+Y21kYyA9PSAncycpewoJCQkJCWNtZC5jdGV4dCA9IG5ld3N0cmluZygpOwoJCQkJCWdldHJo cyhjbWQuY3RleHQsIGMsICdzJyk7CgkJCQkJaWYobmV4dGMoKSA9PSBjKXsKCQkJCQkJZ2V0Y2go KTsKCQkJCQkJaWYobmV4dGMoKSA9PSAnZycpCgkJCQkJCQljbWQuZmxhZyA9IGdldGNoKCk7CgkJ CQkJfQoJCQkKCQkJCX0KCQkJfQoJCX0KCQlpZihjdC0+YWRkciAmJiAoY21kLmNhZGRyPXNpbXBs ZWFkZHIoKSk9PTApCgkJCWVycm9yKEVhZGRyZXNzKTsKCQlpZihjdC0+ZGVmY21kKXsKCQkJaWYo c2tpcGJsKCkgPT0gJ1xuJyl7CgkJCQlnZXRjaCgpOwoJCQkJY21kLmNjbWQgPSBuZXdjbWQoKTsK CQkJCWNtZC5jY21kLT5jbWRjID0gY3QtPmRlZmNtZDsKCQkJfWVsc2UgaWYoKGNtZC5jY21kID0g cGFyc2VjbWQobmVzdCkpPT0wKQoJCQkJcGFuaWMoImRlZmNtZCIpOwoJCX1lbHNlIGlmKGN0LT50 ZXh0KQoJCQljbWQuY3RleHQgPSBjb2xsZWN0dGV4dCgpOwoJCWVsc2UgaWYoY3QtPnRva2VuKQoJ CQljbWQuY3RleHQgPSBjb2xsZWN0dG9rZW4oY3QtPnRva2VuKTsKCQllbHNlCgkJCWF0bmwoKTsK CX1lbHNlCgkJc3dpdGNoKGNtZC5jbWRjKXsKCQljYXNlICd7JzoKCQkJY3AgPSAwOwoJCQlkb3sK CQkJCWlmKHNraXBibCgpPT0nXG4nKQoJCQkJCWdldGNoKCk7CgkJCQluY3AgPSBwYXJzZWNtZChu ZXN0KzEpOwoJCQkJaWYoY3ApCgkJCQkJY3AtPm5leHQgPSBuY3A7CgkJCQllbHNlCgkJCQkJY21k LmNjbWQgPSBuY3A7CgkJCX13aGlsZShjcCA9IG5jcCk7CgkJCWJyZWFrOwoJCWNhc2UgJ30nOgoJ CQlhdG5sKCk7CgkJCWlmKG5lc3Q9PTApCgkJCQllcnJvcihFbm9sYnJhY2UpOwoJCQlyZXR1cm4g MDsKCQlkZWZhdWx0OgoJCQllcnJvcl9jKEV1bmssIGNtZC5jbWRjKTsKCQl9CiAgICBSZXR1cm46 CgljcCA9IG5ld2NtZCgpOwoJKmNwID0gY21kOwoJcmV0dXJuIGNwOwp9CgpTdHJpbmcqCQkJCS8q IEJVR0dFUkVEICovCmdldHJlZ2V4cChpbnQgZGVsaW0pCnsKCVN0cmluZyAqciA9IG5ld3JlKCk7 CglpbnQgYzsKCglmb3IoU3RyemVybygmZ2Vuc3RyKTsgOyBTdHJhZGRjKCZnZW5zdHIsIGMpKQoJ CWlmKChjID0gZ2V0Y2goKSk9PSdcXCcpewoJCQlpZihuZXh0YygpPT1kZWxpbSkKCQkJCWMgPSBn ZXRjaCgpOwoJCQllbHNlIGlmKG5leHRjKCk9PSdcXCcpewoJCQkJU3RyYWRkYygmZ2Vuc3RyLCBj KTsKCQkJCWMgPSBnZXRjaCgpOwoJCQl9CgkJfWVsc2UgaWYoYz09ZGVsaW0gfHwgYz09J1xuJykK CQkJYnJlYWs7CglpZihjIT1kZWxpbSAmJiBjKQoJCXVuZ2V0Y2goKTsKCWlmKGdlbnN0ci5uID4g MCl7CgkJcGF0c2V0ID0gVFJVRTsKCQlTdHJkdXBsc3RyKCZsYXN0cGF0LCAmZ2Vuc3RyKTsKCQlT dHJhZGRjKCZsYXN0cGF0LCAnXDAnKTsKCX0KCWlmKGxhc3RwYXQubiA8PSAxKQoJCWVycm9yKEVw YXR0ZXJuKTsKCVN0cmR1cGxzdHIociwgJmxhc3RwYXQpOwoJcmV0dXJuIHI7Cn0KCkFkZHIgKgpz aW1wbGVhZGRyKHZvaWQpCnsKCUFkZHIgYWRkcjsKCUFkZHIgKmFwLCAqbmFwOwoKCWFkZHIubmV4 dCA9IDA7CglhZGRyLmxlZnQgPSAwOwoJc3dpdGNoKHNraXBibCgpKXsKCWNhc2UgJyMnOgoJCWFk ZHIudHlwZSA9IGdldGNoKCk7CgkJYWRkci5udW0gPSBnZXRudW0oMSk7CgkJYnJlYWs7CgljYXNl ICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CgljYXNlICc1Jzog Y2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6IAoJCWFkZHIubnVtID0gZ2V0 bnVtKDEpOwoJCWFkZHIudHlwZT0nbCc7CgkJYnJlYWs7CgljYXNlICcvJzogY2FzZSAnPyc6IGNh c2UgJyInOgoJCWFkZHIuYXJlID0gZ2V0cmVnZXhwKGFkZHIudHlwZSA9IGdldGNoKCkpOwoJCWJy ZWFrOwoJY2FzZSAnLic6CgljYXNlICckJzoKCWNhc2UgJysnOgoJY2FzZSAnLSc6CgljYXNlICdc Jyc6CgkJYWRkci50eXBlID0gZ2V0Y2goKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDA7 Cgl9CglpZihhZGRyLm5leHQgPSBzaW1wbGVhZGRyKCkpCgkJc3dpdGNoKGFkZHIubmV4dC0+dHlw ZSl7CgkJY2FzZSAnLic6CgkJY2FzZSAnJCc6CgkJY2FzZSAnXCcnOgoJCQlpZihhZGRyLnR5cGUh PSciJykKCQljYXNlICciJzoKCQkJCWVycm9yKEVhZGRyZXNzKTsKCQkJYnJlYWs7CgkJY2FzZSAn bCc6CgkJY2FzZSAnIyc6CgkJCWlmKGFkZHIudHlwZT09JyInKQoJCQkJYnJlYWs7CgkJCS8qIGZh bGwgdGhyb3VnaCAqLwoJCWNhc2UgJy8nOgoJCWNhc2UgJz8nOgoJCQlpZihhZGRyLnR5cGUhPScr JyAmJiBhZGRyLnR5cGUhPSctJyl7CgkJCQkvKiBpbnNlcnQgdGhlIG1pc3NpbmcgJysnICovCgkJ CQluYXAgPSBuZXdhZGRyKCk7CgkJCQluYXAtPnR5cGU9JysnOwoJCQkJbmFwLT5uZXh0ID0gYWRk ci5uZXh0OwoJCQkJYWRkci5uZXh0ID0gbmFwOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgJysnOgoJ CWNhc2UgJy0nOgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwYW5pYygic2ltcGxlYWRkciIpOwoJ CX0KCWFwID0gbmV3YWRkcigpOwoJKmFwID0gYWRkcjsKCXJldHVybiBhcDsKfQoKQWRkciAqCmNv bXBvdW5kYWRkcih2b2lkKQp7CglBZGRyIGFkZHI7CglBZGRyICphcCwgKm5leHQ7CgoJYWRkci5s ZWZ0ID0gc2ltcGxlYWRkcigpOwoJaWYoKGFkZHIudHlwZSA9IHNraXBibCgpKSE9JywnICYmIGFk ZHIudHlwZSE9JzsnKQoJCXJldHVybiBhZGRyLmxlZnQ7CglnZXRjaCgpOwoJbmV4dCA9IGFkZHIu bmV4dCA9IGNvbXBvdW5kYWRkcigpOwoJaWYobmV4dCAmJiAobmV4dC0+dHlwZT09JywnIHx8IG5l eHQtPnR5cGU9PSc7JykgJiYgbmV4dC0+bGVmdD09MCkKCQllcnJvcihFYWRkcmVzcyk7CglhcCA9 IG5ld2FkZHIoKTsKCSphcCA9IGFkZHI7CglyZXR1cm4gYXA7Cn0KAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL2Rpc2suYwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDA0 MTQzADA3MTEyMDI0NDYxADAwMTQ2MzUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAic2FtLmgiCgpz dGF0aWMJQmxvY2sJKmJsaXN0OwoKI2lmZGVmIG5vdGRlZgpzdGF0aWMgaW50CnRlbXBkaXNrKHZv aWQpCnsKCWNoYXIgZGlyW0RJUkxFTl07CgljaGFyIGJ1ZlsxMjhdOwoJaW50IGksIGZkOwoKCXNw cmludChidWYsICIvdG1wL1glZC4lLjRzc2FtIiwgZ2V0cGlkKCksIGdldHVzZXIoKSk7Cglmb3Io aT0nQSc7IGk8PSdaJzsgaSsrKXsKCQlidWZbNV0gPSBpOwoJCWlmKHN0YXQoYnVmLCBkaXIpID09 IDApCgkJCWNvbnRpbnVlOwoJCWZkID0gY3JlYXRlKGJ1ZiwgT1JEV1J8T1JDTE9TRXxPQ0VYRUMs IDA2MDApOwoJCWlmKGZkID49IDApCgkJCXJldHVybiBmZDsKCX0KCXJldHVybiAtMTsKfQojZWxz ZQpleHRlcm4gaW50IHRlbXBkaXNrKHZvaWQpOyAvKiB1bml4LmMgKi8KI2VuZGlmCgpEaXNrKgpk aXNraW5pdCgpCnsKCURpc2sgKmQ7CgoJZCA9IGVtYWxsb2Moc2l6ZW9mKERpc2spKTsKCWQtPmZk ID0gdGVtcGRpc2soKTsKCWlmKGQtPmZkIDwgMCl7CgkJZnByaW50KDIsICJzYW06IGNhbid0IGNy ZWF0ZSB0ZW1wIGZpbGU6ICVyXG4iKTsKCQlleGl0cygiZGlza2luaXQiKTsKCX0KCXJldHVybiBk Owp9CgpzdGF0aWMKdWludApudG9zaXplKHVpbnQgbiwgdWludCAqaXApCnsKCXVpbnQgc2l6ZTsK CglpZihuID4gTWF4YmxvY2spCgkJcGFuaWMoImludGVybmFsIGVycm9yOiBudG9zaXplIik7Cglz aXplID0gbjsKCWlmKHNpemUgJiAoQmxvY2tpbmNyLTEpKQoJCXNpemUgKz0gQmxvY2tpbmNyIC0g KHNpemUgJiAoQmxvY2tpbmNyLTEpKTsKCS8qIGxhc3QgYnVja2V0IGhvbGRzIGJsb2NrcyBvZiBl eGFjdGx5IE1heGJsb2NrICovCglpZihpcCkKCQkqaXAgPSBzaXplL0Jsb2NraW5jcjsKCXJldHVy biBzaXplICogc2l6ZW9mKFJ1bmUpOwp9CgpCbG9jayoKZGlza25ld2Jsb2NrKERpc2sgKmQsIHVp bnQgbikKewoJdWludCBpLCBqLCBzaXplOwoJQmxvY2sgKmI7CgoJc2l6ZSA9IG50b3NpemUobiwg JmkpOwoJYiA9IGQtPmZyZWVbaV07CglpZihiKQoJCWQtPmZyZWVbaV0gPSBiLT5VLm5leHQ7Cgll bHNlewoJCS8qIGFsbG9jYXRlIGluIGNodW5rcyB0byByZWR1Y2UgbWFsbG9jIG92ZXJoZWFkICov CgkJaWYoYmxpc3QgPT0gbmlsKXsKCQkJYmxpc3QgPSBlbWFsbG9jKDEwMCpzaXplb2YoQmxvY2sp KTsKCQkJZm9yKGo9MDsgajwxMDAtMTsgaisrKQoJCQkJYmxpc3Rbal0uVS5uZXh0ID0gJmJsaXN0 W2orMV07CgkJfQoJCWIgPSBibGlzdDsKCQlibGlzdCA9IGItPlUubmV4dDsKCQliLT5hZGRyID0g ZC0+YWRkcjsKCQlkLT5hZGRyICs9IHNpemU7Cgl9CgliLT5VLm4gPSBuOwoJcmV0dXJuIGI7Cn0K CnZvaWQKZGlza3JlbGVhc2UoRGlzayAqZCwgQmxvY2sgKmIpCnsKCXVpbnQgaTsKCgludG9zaXpl KGItPlUubiwgJmkpOwoJYi0+VS5uZXh0ID0gZC0+ZnJlZVtpXTsKCWQtPmZyZWVbaV0gPSBiOwp9 Cgp2b2lkCmRpc2t3cml0ZShEaXNrICpkLCBCbG9jayAqKmJwLCBSdW5lICpyLCB1aW50IG4pCnsK CWludCBzaXplLCBuc2l6ZTsKCUJsb2NrICpiOwoKCWIgPSAqYnA7CglzaXplID0gbnRvc2l6ZShi LT5VLm4sIG5pbCk7Cgluc2l6ZSA9IG50b3NpemUobiwgbmlsKTsKCWlmKHNpemUgIT0gbnNpemUp ewoJCWRpc2tyZWxlYXNlKGQsIGIpOwoJCWIgPSBkaXNrbmV3YmxvY2soZCwgbik7CgkJKmJwID0g YjsKCX0KCWlmKHNlZWsoZC0+ZmQsIGItPmFkZHIsIDApIDwgMCkKCQlwYW5pYygic2VlayBlcnJv ciBpbiB0ZW1wIGZpbGUiKTsKCWlmKHdyaXRlKGQtPmZkLCByLCBuKnNpemVvZihSdW5lKSkgIT0g bipzaXplb2YoUnVuZSkpCgkJcGFuaWMoIndyaXRlIGVycm9yIHRvIHRlbXAgZmlsZSIpOwoJYi0+ VS5uID0gbjsKfQoKdm9pZApkaXNrcmVhZChEaXNrICpkLCBCbG9jayAqYiwgUnVuZSAqciwgdWlu dCBuKQp7CglpZihuID4gYi0+VS5uKQoJCXBhbmljKCJpbnRlcm5hbCBlcnJvcjogZGlza3JlYWQi KTsKCgludG9zaXplKGItPlUubiwgbmlsKTsKCWlmKHNlZWsoZC0+ZmQsIGItPmFkZHIsIDApIDwg MCkKCQlwYW5pYygic2VlayBlcnJvciBpbiB0ZW1wIGZpbGUiKTsKCWlmKHJlYWQoZC0+ZmQsIHIs IG4qc2l6ZW9mKFJ1bmUpKSAhPSBuKnNpemVvZihSdW5lKSkKCQlwYW5pYygicmVhZCBlcnJvciBm cm9tIHRlbXAgZmlsZSIpOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL2Vycm9yLmMAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDA0MTA1ADA3 MTExNjIyMTA1ADAwMTUwMzAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAic2FtLmgiCgpzdGF0aWMg Y2hhciAqZW1zZ1tdPXsKCS8qIGVycm9yX3MgKi8KCSJjYW4ndCBvcGVuIiwKCSJjYW4ndCBjcmVh dGUiLAoJIm5vdCBpbiBtZW51OiIsCgkiY2hhbmdlcyB0byIsCgkiSS9PIGVycm9yOiIsCgkiY2Fu J3Qgd3JpdGUgd2hpbGUgY2hhbmdpbmc6IiwKCS8qIGVycm9yX2MgKi8KCSJ1bmtub3duIGNvbW1h bmQiLAoJIm5vIG9wZXJhbmQgZm9yIiwKCSJiYWQgZGVsaW1pdGVyIiwKCS8qIGVycm9yICovCgki Y2FuJ3QgZm9yayIsCgkiaW50ZXJydXB0IiwKCSJhZGRyZXNzIiwKCSJzZWFyY2giLAoJInBhdHRl cm4iLAoJIm5ld2xpbmUgZXhwZWN0ZWQiLAoJImJsYW5rIGV4cGVjdGVkIiwKCSJwYXR0ZXJuIGV4 cGVjdGVkIiwKCSJjYW4ndCBuZXN0IFggb3IgWSIsCgkidW5tYXRjaGVkIGB9JyIsCgkiY29tbWFu ZCB0YWtlcyBubyBhZGRyZXNzIiwKCSJhZGRyZXNzZXMgb3ZlcmxhcCIsCgkic3Vic3RpdHV0aW9u IiwKCSImIG1hdGNoIHRvbyBsb25nIiwKCSJiYWQgXFwgaW4gcmhzIiwKCSJhZGRyZXNzIHJhbmdl IiwKCSJjaGFuZ2VzIG5vdCBpbiBzZXF1ZW5jZSIsCgkiYWRkcmVzc2VzIG91dCBvZiBvcmRlciIs Cgkibm8gZmlsZSBuYW1lIiwKCSJ1bm1hdGNoZWQgYCgnIiwKCSJ1bm1hdGNoZWQgYCknIiwKCSJt YWxmb3JtZWQgYFtdJyIsCgkibWFsZm9ybWVkIHJlZ2V4cCIsCgkicmVnLiBleHAuIGxpc3Qgb3Zl cmZsb3ciLAoJInBsYW4gOSBjb21tYW5kIiwKCSJjYW4ndCBwaXBlIiwKCSJubyBjdXJyZW50IGZp bGUiLAoJInN0cmluZyB0b28gbG9uZyIsCgkiY2hhbmdlZCBmaWxlcyIsCgkiZW1wdHkgc3RyaW5n IiwKCSJmaWxlIHNlYXJjaCIsCgkibm9uLXVuaXF1ZSBtYXRjaCBmb3IgXCJcIiIsCgkidGFnIG1h dGNoIHRvbyBsb25nIiwKCSJ0b28gbWFueSBzdWJleHByZXNzaW9ucyIsCgkidGVtcG9yYXJ5IGZp bGUgdG9vIGxhcmdlIiwKCSJmaWxlIGlzIGFwcGVuZC1vbmx5IiwKCSJubyBkZXN0aW5hdGlvbiBm b3IgcGx1bWIgbWVzc2FnZSIsCgkiaW50ZXJuYWwgcmVhZCBlcnJvciBpbiBidWZmZXIgbG9hZCIs Cn07CnN0YXRpYyBjaGFyICp3bXNnW109ewoJLyogd2Fybl9zICovCgkiZHVwbGljYXRlIGZpbGUg bmFtZSIsCgkibm8gc3VjaCBmaWxlIiwKCSJ3cml0ZSBtaWdodCBjaGFuZ2UgZ29vZCB2ZXJzaW9u IG9mIiwKCS8qIHdhcm5fUyAqLwoJImZpbGVzIG1pZ2h0IGJlIGFsaWFzZWQiLAoJLyogd2FybiAq LwoJIm51bGwgY2hhcmFjdGVycyBlbGlkZWQiLAoJImNhbid0IHJ1biBwd2QiLAoJImxhc3QgY2hh ciBub3QgbmV3bGluZSIsCgkiZXhpdCBzdGF0dXMgbm90IDAiLAp9OwoKdm9pZAplcnJvcihFcnIg cykKewoJY2hhciBidWZbNTEyXTsKCglzcHJpbnQoYnVmLCAiPyVzIiwgZW1zZ1tzXSk7CgloaWNj b3VnaChidWYpOwp9Cgp2b2lkCmVycm9yX3MoRXJyIHMsIGNoYXIgKmEpCnsKCWNoYXIgYnVmWzUx Ml07CgoJc3ByaW50KGJ1ZiwgIj8lcyBcIiVzXCIiLCBlbXNnW3NdLCBhKTsKCWhpY2NvdWdoKGJ1 Zik7Cn0KCnZvaWQKZXJyb3JfYyhFcnIgcywgaW50IGMpCnsKCWNoYXIgYnVmWzUxMl07CgoJc3By aW50KGJ1ZiwgIj8lcyBgJUMnIiwgZW1zZ1tzXSwgYyk7CgloaWNjb3VnaChidWYpOwp9Cgp2b2lk Cndhcm4oV2FybiBzKQp7CglkcHJpbnQoIj93YXJuaW5nOiAlc1xuIiwgd21zZ1tzXSk7Cn0KCnZv aWQKd2Fybl9TKFdhcm4gcywgU3RyaW5nICphKQp7CglwcmludF9zKHdtc2dbc10sIGEpOwp9Cgp2 b2lkCndhcm5fU1MoV2FybiBzLCBTdHJpbmcgKmEsIFN0cmluZyAqYikKewoJcHJpbnRfc3Mod21z Z1tzXSwgYSwgYik7Cn0KCnZvaWQKd2Fybl9zKFdhcm4gcywgY2hhciAqYSkKewoJZHByaW50KCI/ d2FybmluZzogJXMgYCVzJ1xuIiwgd21zZ1tzXSwgYSk7Cn0KCnZvaWQKdGVybXdyaXRlKGNoYXIg KnMpCnsKCVN0cmluZyAqcDsKCglpZihkb3dubG9hZGVkKXsKCQlwID0gdG1wY3N0cihzKTsKCQlp ZihjbWQpCgkJCWxvZ2luc2VydChjbWQsIGNtZHB0LCBwLT5zLCBwLT5uKTsKCQllbHNlCgkJCVN0 cmluc2VydCgmY21kc3RyLCBwLCBjbWRzdHIubik7CgkJY21kcHRhZHYgKz0gcC0+bjsKCQlmcmVl KHApOwoJfWVsc2UKCQlXcml0ZSgyLCBzLCBzdHJsZW4ocykpOwp9CgAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL2Vycm9ycy5oAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDAxMjY3ADA3MTExNjM1 NjIwADAwMTUyMzQAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1 c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0eXBlZGVmIGVudW0gRXJyewoJLyogZXJyb3JfcyAq LwoJRW9wZW4sCglFY3JlYXRlLAoJRW1lbnUsCglFbW9kaWZpZWQsCglFaW8sCglFd3NlcSwKCS8q IGVycm9yX2MgKi8KCUV1bmssCglFbWlzc29wLAoJRWRlbGltLAoJLyogZXJyb3IgKi8KCUVmb3Jr LAoJRWludHIsCglFYWRkcmVzcywKCUVzZWFyY2gsCglFcGF0dGVybiwKCUVuZXdsaW5lLAoJRWJs YW5rLAoJRW5vcGF0dGVybiwKCUVuZXN0WFksCglFbm9sYnJhY2UsCglFbm9hZGRyLAoJRW92ZXJs YXAsCglFbm9zdWIsCglFbG9uZ3JocywKCUViYWRyaHMsCglFcmFuZ2UsCglFc2VxdWVuY2UsCglF b3JkZXIsCglFbm9uYW1lLAoJRWxlZnRwYXIsCglFcmlnaHRwYXIsCglFYmFkY2xhc3MsCglFYmFk cmVnZXhwLAoJRW92ZXJmbG93LAoJRW5vY21kLAoJRXBpcGUsCglFbm9maWxlLAoJRXRvb2xvbmcs CglFY2hhbmdlcywKCUVlbXB0eSwKCUVmc2VhcmNoLAoJRW1hbnlmaWxlcywKCUVsb25ndGFnLAoJ RXN1YmV4cCwKCUV0bXBvdmZsLAoJRWFwcGVuZCwKCUVjYW50cGx1bWIsCglFYnVmbG9hZCAKfUVy cjsKdHlwZWRlZiBlbnVtIFdhcm57CgkvKiB3YXJuX3MgKi8KCVdkdXBuYW1lLAoJV2ZpbGUsCglX ZGF0ZSwKCS8qIHdhcm5fc3MgKi8KCVdkdXBmaWxlLAoJLyogd2FybiAqLwoJV251bGxzLAoJV3B3 ZCwKCVdub3RuZXdsaW5lLAoJV2JhZHN0YXR1cyAKfVdhcm47CgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL2ZpbGUuYwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDI1NTAyADA3MTExNjM1NzQy ADAwMTQ2MzUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3Rh cgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAic2FtLmgiCgovKgogKiBTdHJ1Y3R1cmUg b2YgVW5kbyBsaXN0OgogKiAJVGhlIFVuZG8gc3RydWN0dXJlIGZvbGxvd3MgYW55IGFzc29jaWF0 ZWQgZGF0YSwgc28gdGhlIGxpc3QKICoJY2FuIGJlIHJlYWQgYmFja3dhcmRzOiByZWFkIHRoZSBz dHJ1Y3R1cmUsIHRoZW4gcmVhZCB3aGF0ZXZlcgogKglkYXRhIGlzIGFzc29jaWF0ZWQgKGluc2Vy dCBzdHJpbmcsIGZpbGUgbmFtZSkgYW5kIHByZWNlZGVzIGl0LgogKglUaGUgc3RydWN0dXJlIGlu Y2x1ZGVzIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgbW9kaWZ5IGJpdAogKglhbmQgYSBzZXF1 ZW5jZSBudW1iZXI7IHN1Y2Nlc3NpdmUgVW5kbyBzdHJ1Y3R1cmVzIHdpdGggdGhlCiAqCXNhbWUg c2VxdWVuY2UgbnVtYmVyIHJlcHJlc2VudCBzaW11bHRhbmVvdXMgY2hhbmdlcy4KICovCgp0eXBl ZGVmIHN0cnVjdCBVbmRvIFVuZG87CnR5cGVkZWYgc3RydWN0IE1lcmdlIE1lcmdlOwoKc3RydWN0 IFVuZG8KewoJc2hvcnQJdHlwZTsJCS8qIERlbGV0ZSwgSW5zZXJ0LCBGaWxlbmFtZSwgRG90LCBN YXJrICovCglzaG9ydAltb2Q7CQkvKiBtb2RpZnkgYml0ICovCgl1aW50CXNlcTsJCS8qIHNlcXVl bmNlIG51bWJlciAqLwoJdWludAlwMDsJCS8qIGxvY2F0aW9uIG9mIGNoYW5nZSAodW51c2VkIGlu IGYpICovCgl1aW50CW47CQkvKiAjIHJ1bmVzIGluIHN0cmluZyBvciBmaWxlIG5hbWUgKi8KfTsK CnN0cnVjdCBNZXJnZQp7CglGaWxlCSpmOwoJdWludAlzZXE7CQkvKiBvZiBsb2dnZWQgY2hhbmdl ICovCgl1aW50CXAwOwkJLyogbG9jYXRpb24gb2YgY2hhbmdlICh1bnVzZWQgaW4gZikgKi8KCXVp bnQJbjsJCS8qICMgcnVuZXMgdG8gZGVsZXRlICovCgl1aW50CW5idWY7CQkvKiAjIHJ1bmVzIHRv IGluc2VydCAqLwoJUnVuZQlidWZbUkJVRlNJWkVdOwp9OwoKZW51bQp7CglNYXhtZXJnZSA9IDUw LAoJVW5kb3NpemUgPSBzaXplb2YoVW5kbykvc2l6ZW9mKFJ1bmUpIAp9OwoKc3RhdGljIE1lcmdl CW1lcmdlOwoKRmlsZSoKZmlsZW9wZW4odm9pZCkKewoJRmlsZSAqZjsKCglmID0gZW1hbGxvYyhz aXplb2YoRmlsZSkpOwoJZi0+ZG90LmYgPSBmOwoJZi0+bmRvdC5mID0gZjsKCWYtPnNlcSA9IDA7 CglmLT5tb2QgPSBGQUxTRTsKCWYtPnVucmVhZCA9IFRSVUU7CglTdHJpbml0MCgmZi0+bmFtZSk7 CglyZXR1cm4gZjsKfQoKaW50CmZpbGVpc2RpcnR5KEZpbGUgKmYpCnsKCXJldHVybiBmLT5zZXEg IT0gZi0+Y2xlYW5zZXE7Cn0KCnN0YXRpYyB2b2lkCndyaW5zZXJ0KEJ1ZmZlciAqZGVsdGEsIGlu dCBzZXEsIGludCBtb2QsIHVpbnQgcDAsIFJ1bmUgKnMsIHVpbnQgbnMpCnsKCVVuZG8gdTsKCgl1 LnR5cGUgPSBJbnNlcnQ7Cgl1Lm1vZCA9IG1vZDsKCXUuc2VxID0gc2VxOwoJdS5wMCA9IHAwOwoJ dS5uID0gbnM7CglidWZpbnNlcnQoZGVsdGEsIGRlbHRhLT5uYywgcywgbnMpOwoJYnVmaW5zZXJ0 KGRlbHRhLCBkZWx0YS0+bmMsIChSdW5lKikmdSwgVW5kb3NpemUpOwp9CgpzdGF0aWMgdm9pZAp3 cmRlbGV0ZShCdWZmZXIgKmRlbHRhLCBpbnQgc2VxLCBpbnQgbW9kLCB1aW50IHAwLCB1aW50IHAx KQp7CglVbmRvIHU7CgoJdS50eXBlID0gRGVsZXRlOwoJdS5tb2QgPSBtb2Q7Cgl1LnNlcSA9IHNl cTsKCXUucDAgPSBwMDsKCXUubiA9IHAxIC0gcDA7CglidWZpbnNlcnQoZGVsdGEsIGRlbHRhLT5u YywgKFJ1bmUqKSZ1LCBVbmRvc2l6ZSk7Cn0KCnZvaWQKZmx1c2htZXJnZSh2b2lkKQp7CglGaWxl ICpmOwoKCWYgPSBtZXJnZS5mOwoJaWYoZiA9PSBuaWwpCgkJcmV0dXJuOwoJaWYobWVyZ2Uuc2Vx ICE9IGYtPnNlcSkKCQlwYW5pYygiZmx1c2htZXJnZSBzZXEgbWlzbWF0Y2giKTsKCWlmKG1lcmdl Lm4gIT0gMCkKCQl3cmRlbGV0ZSgmZi0+ZXBzaWxvbiwgZi0+c2VxLCBUUlVFLCBtZXJnZS5wMCwg bWVyZ2UucDArbWVyZ2Uubik7CglpZihtZXJnZS5uYnVmICE9IDApCgkJd3JpbnNlcnQoJmYtPmVw c2lsb24sIGYtPnNlcSwgVFJVRSwgbWVyZ2UucDArbWVyZ2UubiwgbWVyZ2UuYnVmLCBtZXJnZS5u YnVmKTsKCW1lcmdlLmYgPSBuaWw7CgltZXJnZS5uID0gMDsKCW1lcmdlLm5idWYgPSAwOwp9Cgp2 b2lkCm1lcmdlZXh0ZW5kKEZpbGUgKmYsIHVpbnQgcDApCnsKCXVpbnQgbXAwbjsKCgltcDBuID0g bWVyZ2UucDArbWVyZ2UubjsKCWlmKG1wMG4gIT0gcDApewoJCWJ1ZnJlYWQoJmYtPlUsIG1wMG4s IG1lcmdlLmJ1ZittZXJnZS5uYnVmLCBwMC1tcDBuKTsKCQltZXJnZS5uYnVmICs9IHAwLW1wMG47 CgkJbWVyZ2UubiA9IHAwLW1lcmdlLnAwOwoJfQp9CgovKgogKiBsaWtlIGZpbGV1bmRlbGV0ZSwg YnV0IGdldCB0aGUgZGF0YSBmcm9tIGFyZ3VtZW50cwogKi8Kdm9pZApsb2dpbnNlcnQoRmlsZSAq ZiwgdWludCBwMCwgUnVuZSAqcywgdWludCBucykKewoJaWYoZi0+cmVzY3VpbmcpCgkJcmV0dXJu OwoJaWYobnMgPT0gMCkKCQlyZXR1cm47CglpZihuczwwIHx8IG5zPlNUUlNJWkUpCgkJcGFuaWMo ImxvZ2luc2VydCIpOwoJaWYoZi0+c2VxIDwgc2VxKQoJCWZpbGVtYXJrKGYpOwoJaWYocDAgPCBm LT5oaXBvc24pCgkJZXJyb3IoRXNlcXVlbmNlKTsKCglpZihtZXJnZS5mICE9IGYKCXx8IHAwLSht ZXJnZS5wMCttZXJnZS5uKT5NYXhtZXJnZQkJCS8qIHRvbyBmYXIgKi8KCXx8IG1lcmdlLm5idWYr KChwMCtucyktKG1lcmdlLnAwK21lcmdlLm4pKT5SQlVGU0laRSkJLyogdG9vIGxvbmcgKi8KCQlm bHVzaG1lcmdlKCk7CgoJaWYobnM+PVJCVUZTSVpFKXsKCQlpZighKG1lcmdlLm4gPT0gMCAmJiBt ZXJnZS5uYnVmID09IDAgJiYgbWVyZ2UuZiA9PSBuaWwpKQoJCQlwYW5pYygibG9naW5zZXJ0IGJh ZCBtZXJnZSBzdGF0ZSIpOwoJCXdyaW5zZXJ0KCZmLT5lcHNpbG9uLCBmLT5zZXEsIFRSVUUsIHAw LCBzLCBucyk7Cgl9ZWxzZXsKCQlpZihtZXJnZS5mICE9IGYpewoJCQltZXJnZS5mID0gZjsKCQkJ bWVyZ2UucDAgPSBwMDsKCQkJbWVyZ2Uuc2VxID0gZi0+c2VxOwoJCX0KCQltZXJnZWV4dGVuZChm LCBwMCk7CgoJCS8qIGFwcGVuZCBzdHJpbmcgdG8gbWVyZ2UgKi8KCQlydW5lbW92ZShtZXJnZS5i dWYrbWVyZ2UubmJ1ZiwgcywgbnMpOwoJCW1lcmdlLm5idWYgKz0gbnM7Cgl9CgoJZi0+aGlwb3Nu ID0gcDA7CglpZighZi0+dW5yZWFkICYmICFmLT5tb2QpCgkJc3RhdGUoZiwgRGlydHkpOwp9Cgp2 b2lkCmxvZ2RlbGV0ZShGaWxlICpmLCB1aW50IHAwLCB1aW50IHAxKQp7CglpZihmLT5yZXNjdWlu ZykKCQlyZXR1cm47CglpZihwMCA9PSBwMSkKCQlyZXR1cm47CglpZihmLT5zZXEgPCBzZXEpCgkJ ZmlsZW1hcmsoZik7CglpZihwMSA8IGYtPmhpcG9zbikKCQllcnJvcihFc2VxdWVuY2UpOwoKCWlm KG1lcmdlLmYgIT0gZgoJfHwgcDAtKG1lcmdlLnAwK21lcmdlLm4pPk1heG1lcmdlCQkJLyogdG9v IGZhciAqLwoJfHwgbWVyZ2UubmJ1ZisocDAtKG1lcmdlLnAwK21lcmdlLm4pKT5SQlVGU0laRSl7 CS8qIHRvbyBsb25nICovCgkJZmx1c2htZXJnZSgpOwoJCW1lcmdlLmYgPSBmOwoJCW1lcmdlLnAw ID0gcDA7CgkJbWVyZ2Uuc2VxID0gZi0+c2VxOwoJfQoKCW1lcmdlZXh0ZW5kKGYsIHAwKTsKCgkv KiBhZGQgdG8gZGVsZXRpb24gKi8KCW1lcmdlLm4gPSBwMS1tZXJnZS5wMDsKCglmLT5oaXBvc24g PSBwMTsKCWlmKCFmLT51bnJlYWQgJiYgIWYtPm1vZCkKCQlzdGF0ZShmLCBEaXJ0eSk7Cn0KCi8q CiAqIGxpa2UgZmlsZXVuc2V0bmFtZSwgYnV0IGdldCB0aGUgZGF0YSBmcm9tIGFyZ3VtZW50cwog Ki8Kdm9pZApsb2dzZXRuYW1lKEZpbGUgKmYsIFN0cmluZyAqcykKewoJVW5kbyB1OwoJQnVmZmVy ICpkZWx0YTsKCglpZihmLT5yZXNjdWluZykKCQlyZXR1cm47CgoJaWYoZi0+dW5yZWFkKXsJLyog VGhpcyBpcyBzZXR0aW5nIGluaXRpYWwgZmlsZSBuYW1lICovCgkJZmlsZXNldG5hbWUoZiwgcyk7 CgkJcmV0dXJuOwoJfQoKCWlmKGYtPnNlcSA8IHNlcSkKCQlmaWxlbWFyayhmKTsKCgkvKiB1bmRv IGEgZmlsZSBuYW1lIGNoYW5nZSBieSByZXN0b3Jpbmcgb2xkIG5hbWUgKi8KCWRlbHRhID0gJmYt PmVwc2lsb247Cgl1LnR5cGUgPSBGaWxlbmFtZTsKCXUubW9kID0gVFJVRTsKCXUuc2VxID0gZi0+ c2VxOwoJdS5wMCA9IDA7CS8qIHVudXNlZCAqLwoJdS5uID0gcy0+bjsKCWlmKHMtPm4pCgkJYnVm aW5zZXJ0KGRlbHRhLCBkZWx0YS0+bmMsIHMtPnMsIHMtPm4pOwoJYnVmaW5zZXJ0KGRlbHRhLCBk ZWx0YS0+bmMsIChSdW5lKikmdSwgVW5kb3NpemUpOwoJaWYoIWYtPnVucmVhZCAmJiAhZi0+bW9k KQoJCXN0YXRlKGYsIERpcnR5KTsKfQoKI2lmZGVmIE5PVEVYVApGaWxlKgpmaWxlYWRkdGV4dChG aWxlICpmLCBUZXh0ICp0KQp7CglpZihmID09IG5pbCl7CgkJZiA9IGVtYWxsb2Moc2l6ZW9mKEZp bGUpKTsKCQlmLT51bnJlYWQgPSBUUlVFOwoJfQoJZi0+dGV4dCA9IHJlYWxsb2MoZi0+dGV4dCwg KGYtPm50ZXh0KzEpKnNpemVvZihUZXh0KikpOwoJZi0+dGV4dFtmLT5udGV4dCsrXSA9IHQ7Cglm LT5jdXJ0ZXh0ID0gdDsKCXJldHVybiBmOwp9Cgp2b2lkCmZpbGVkZWx0ZXh0KEZpbGUgKmYsIFRl eHQgKnQpCnsKCWludCBpOwoKCWZvcihpPTA7IGk8Zi0+bnRleHQ7IGkrKykKCQlpZihmLT50ZXh0 W2ldID09IHQpCgkJCWdvdG8gRm91bmQ7CglwYW5pYygiY2FuJ3QgZmluZCB0ZXh0IGluIGZpbGVk ZWx0ZXh0Iik7CgogICAgRm91bmQ6CglmLT5udGV4dC0tOwoJaWYoZi0+bnRleHQgPT0gMCl7CgkJ ZmlsZWNsb3NlKGYpOwoJCXJldHVybjsKCX0KCW1lbW1vdmUoZi0+dGV4dCtpLCBmLT50ZXh0K2kr MSwgKGYtPm50ZXh0LWkpKnNpemVvZihUZXh0KikpOwoJaWYoZi0+Y3VydGV4dCA9PSB0KQoJCWYt PmN1cnRleHQgPSBmLT50ZXh0WzBdOwp9CiNlbmRpZgoKdm9pZApmaWxlaW5zZXJ0KEZpbGUgKmYs IHVpbnQgcDAsIFJ1bmUgKnMsIHVpbnQgbnMpCnsKCWlmKHAwID4gZi0+VS5uYykKCQlwYW5pYygi aW50ZXJuYWwgZXJyb3I6IGZpbGVpbnNlcnQiKTsKCWlmKGYtPnNlcSA+IDApCgkJZmlsZXVuaW5z ZXJ0KGYsICZmLT5kZWx0YSwgcDAsIG5zKTsKCWJ1Zmluc2VydCgmZi0+VSwgcDAsIHMsIG5zKTsK CWlmKG5zKQoJCWYtPm1vZCA9IFRSVUU7Cn0KCnZvaWQKZmlsZXVuaW5zZXJ0KEZpbGUgKmYsIEJ1 ZmZlciAqZGVsdGEsIHVpbnQgcDAsIHVpbnQgbnMpCnsKCVVuZG8gdTsKCgkvKiB1bmRvIGFuIGlu c2VydGlvbiBieSBkZWxldGluZyAqLwoJdS50eXBlID0gRGVsZXRlOwoJdS5tb2QgPSBmLT5tb2Q7 Cgl1LnNlcSA9IGYtPnNlcTsKCXUucDAgPSBwMDsKCXUubiA9IG5zOwoJYnVmaW5zZXJ0KGRlbHRh LCBkZWx0YS0+bmMsIChSdW5lKikmdSwgVW5kb3NpemUpOwp9Cgp2b2lkCmZpbGVkZWxldGUoRmls ZSAqZiwgdWludCBwMCwgdWludCBwMSkKewoJaWYoIShwMDw9cDEgJiYgcDA8PWYtPlUubmMgJiYg cDE8PWYtPlUubmMpKQoJCXBhbmljKCJpbnRlcm5hbCBlcnJvcjogZmlsZWRlbGV0ZSIpOwoJaWYo Zi0+c2VxID4gMCkKCQlmaWxldW5kZWxldGUoZiwgJmYtPmRlbHRhLCBwMCwgcDEpOwoJYnVmZGVs ZXRlKCZmLT5VLCBwMCwgcDEpOwoJaWYocDEgPiBwMCkKCQlmLT5tb2QgPSBUUlVFOwp9Cgp2b2lk CmZpbGV1bmRlbGV0ZShGaWxlICpmLCBCdWZmZXIgKmRlbHRhLCB1aW50IHAwLCB1aW50IHAxKQp7 CglVbmRvIHU7CglSdW5lICpidWY7Cgl1aW50IGksIG47CgoJLyogdW5kbyBhIGRlbGV0aW9uIGJ5 IGluc2VydGluZyAqLwoJdS50eXBlID0gSW5zZXJ0OwoJdS5tb2QgPSBmLT5tb2Q7Cgl1LnNlcSA9 IGYtPnNlcTsKCXUucDAgPSBwMDsKCXUubiA9IHAxLXAwOwoJYnVmID0gZmJ1ZmFsbG9jKCk7Cglm b3IoaT1wMDsgaTxwMTsgaSs9bil7CgkJbiA9IHAxIC0gaTsKCQlpZihuID4gUkJVRlNJWkUpCgkJ CW4gPSBSQlVGU0laRTsKCQlidWZyZWFkKCZmLT5VLCBpLCBidWYsIG4pOwoJCWJ1Zmluc2VydChk ZWx0YSwgZGVsdGEtPm5jLCBidWYsIG4pOwoJfQoJZmJ1ZmZyZWUoYnVmKTsKCWJ1Zmluc2VydChk ZWx0YSwgZGVsdGEtPm5jLCAoUnVuZSopJnUsIFVuZG9zaXplKTsKCn0KCmludApmaWxlcmVhZGMo RmlsZSAqZiwgdWludCBxKQp7CglSdW5lIHI7CgoJaWYocSA+PSBmLT5VLm5jKQoJCXJldHVybiAt MTsKCWJ1ZnJlYWQoJmYtPlUsIHEsICZyLCAxKTsKCXJldHVybiByOwp9Cgp2b2lkCmZpbGVzZXRu YW1lKEZpbGUgKmYsIFN0cmluZyAqcykKewoJaWYoIWYtPnVucmVhZCkJLyogVGhpcyBpcyBzZXR0 aW5nIGluaXRpYWwgZmlsZSBuYW1lICovCgkJZmlsZXVuc2V0bmFtZShmLCAmZi0+ZGVsdGEpOwoJ U3RyZHVwbHN0cigmZi0+bmFtZSwgcyk7Cglzb3J0bmFtZShmKTsKCWYtPnVucmVhZCA9IFRSVUU7 Cn0KCnZvaWQKZmlsZXVuc2V0bmFtZShGaWxlICpmLCBCdWZmZXIgKmRlbHRhKQp7CglTdHJpbmcg czsKCVVuZG8gdTsKCgkvKiB1bmRvIGEgZmlsZSBuYW1lIGNoYW5nZSBieSByZXN0b3Jpbmcgb2xk IG5hbWUgKi8KCXUudHlwZSA9IEZpbGVuYW1lOwoJdS5tb2QgPSBmLT5tb2Q7Cgl1LnNlcSA9IGYt PnNlcTsKCXUucDAgPSAwOwkvKiB1bnVzZWQgKi8KCVN0cmluaXQoJnMpOwoJU3RyZHVwbHN0cigm cywgJmYtPm5hbWUpOwoJZnVsbG5hbWUoJnMpOwoJdS5uID0gcy5uOwoJaWYocy5uKQoJCWJ1Zmlu c2VydChkZWx0YSwgZGVsdGEtPm5jLCBzLnMsIHMubik7CglidWZpbnNlcnQoZGVsdGEsIGRlbHRh LT5uYywgKFJ1bmUqKSZ1LCBVbmRvc2l6ZSk7CglTdHJjbG9zZSgmcyk7Cn0KCnZvaWQKZmlsZXVu c2V0ZG90KEZpbGUgKmYsIEJ1ZmZlciAqZGVsdGEsIFJhbmdlIGRvdCkKewoJVW5kbyB1OwoKCXUu dHlwZSA9IERvdDsKCXUubW9kID0gZi0+bW9kOwoJdS5zZXEgPSBmLT5zZXE7Cgl1LnAwID0gZG90 LnAxOwoJdS5uID0gZG90LnAyIC0gZG90LnAxOwoJYnVmaW5zZXJ0KGRlbHRhLCBkZWx0YS0+bmMs IChSdW5lKikmdSwgVW5kb3NpemUpOwp9Cgp2b2lkCmZpbGV1bnNldG1hcmsoRmlsZSAqZiwgQnVm ZmVyICpkZWx0YSwgUmFuZ2UgbWFyaykKewoJVW5kbyB1OwoKCXUudHlwZSA9IE1hcms7Cgl1Lm1v ZCA9IGYtPm1vZDsKCXUuc2VxID0gZi0+c2VxOwoJdS5wMCA9IG1hcmsucDE7Cgl1Lm4gPSBtYXJr LnAyIC0gbWFyay5wMTsKCWJ1Zmluc2VydChkZWx0YSwgZGVsdGEtPm5jLCAoUnVuZSopJnUsIFVu ZG9zaXplKTsKfQoKdWludApmaWxlbG9hZChGaWxlICpmLCB1aW50IHAwLCBpbnQgZmQsIGludCAq bnVsbHMpCnsKCWlmKGYtPnNlcSA+IDApCgkJcGFuaWMoInVuZG8gaW4gZmlsZS5sb2FkIHVuaW1w bGVtZW50ZWQiKTsKCXJldHVybiBidWZsb2FkKCZmLT5VLCBwMCwgZmQsIG51bGxzKTsKfQoKaW50 CmZpbGV1cGRhdGUoRmlsZSAqZiwgaW50IG5vdHJhbnMsIGludCB0b3Rlcm0pCnsKCXVpbnQgcDEs IHAyOwoJaW50IG1vZDsKCglpZihmLT5yZXNjdWluZykKCQlyZXR1cm4gRkFMU0U7CgoJZmx1c2ht ZXJnZSgpOwoKCS8qCgkgKiBmaXggdGhlIG1vZGlmaWNhdGlvbiBiaXQKCSAqIHN1YnRsZSBwb2lu dDogZG9uJ3Qgc2F2ZSBpdCBhd2F5IGluIHRoZSBsb2cuCgkgKgoJICogaWYgYW5vdGhlciBjaGFu Z2UgaXMgbWFkZSwgdGhlIGNvcnJlY3QgZi0+bW9kCgkgKiBzdGF0ZSBpcyBzYXZlZCAgaW4gdGhl IHVuZG8gbG9nIGJ5IGZpbGVtYXJrCgkgKiB3aGVuIHNldHRpbmcgdGhlIGRvdCBhbmQgbWFyay4K CSAqCgkgKiBpZiB0aGUgY2hhbmdlIGlzIHVuZG9uZSwgdGhlIGNvcnJlY3Qgc3RhdGUgaXMKCSAq IHNhdmVkIGZyb20gZiBpbiB0aGUgZmlsZXVuLi4uIHJvdXRpbmVzLgoJICovCgltb2QgPSBmLT5t b2Q7CglmLT5tb2QgPSBmLT5wcmV2bW9kOwoJaWYoZiA9PSBjbWQpCgkJbm90cmFucyA9IFRSVUU7 CgllbHNlewoJCWZpbGV1bnNldGRvdChmLCAmZi0+ZGVsdGEsIGYtPnByZXZkb3QpOwoJCWZpbGV1 bnNldG1hcmsoZiwgJmYtPmRlbHRhLCBmLT5wcmV2bWFyayk7Cgl9CglmLT5kb3QgPSBmLT5uZG90 OwoJZmlsZXVuZG8oZiwgRkFMU0UsICFub3RyYW5zLCAmcDEsICZwMiwgdG90ZXJtKTsKCWYtPm1v ZCA9IG1vZDsKCglpZihmLT5kZWx0YS5uYyA9PSAwKQoJCWYtPnNlcSA9IDA7CgoJaWYoZiA9PSBj bWQpCgkJcmV0dXJuIEZBTFNFOwoKCWlmKGYtPm1vZCl7CgkJZi0+Y2xvc2VvayA9IDA7CgkJcXVp dG9rID0gMDsKCX1lbHNlCgkJZi0+Y2xvc2VvayA9IDE7CglyZXR1cm4gVFJVRTsKfQoKbG9uZwpw cmV2c2VxKEJ1ZmZlciAqYikKewoJVW5kbyB1OwoJdWludCB1cDsKCgl1cCA9IGItPm5jOwoJaWYo dXAgPT0gMCkKCQlyZXR1cm4gMDsKCXVwIC09IFVuZG9zaXplOwoJYnVmcmVhZChiLCB1cCwgKFJ1 bmUqKSZ1LCBVbmRvc2l6ZSk7CglyZXR1cm4gdS5zZXE7Cn0KCmxvbmcKdW5kb3NlcShGaWxlICpm LCBpbnQgaXN1bmRvKQp7CglpZihpc3VuZG8pCgkJcmV0dXJuIGYtPnNlcTsKCglyZXR1cm4gcHJl dnNlcSgmZi0+ZXBzaWxvbik7Cn0KCnZvaWQKZmlsZXVuZG8oRmlsZSAqZiwgaW50IGlzdW5kbywg aW50IGNhbnJlZG8sIHVpbnQgKnEwcCwgdWludCAqcTFwLCBpbnQgZmxhZykKewoJVW5kbyB1OwoJ UnVuZSAqYnVmOwoJdWludCBpLCBuLCB1cDsKCXVpbnQgc3RvcDsKCUJ1ZmZlciAqZGVsdGEsICpl cHNpbG9uOwoKCWlmKGlzdW5kbyl7CgkJLyogdW5kbzsgcmV2ZXJzZSBkZWx0YSBvbnRvIGVwc2ls b24sIHNlcSBkZWNyZWFzZXMgKi8KCQlkZWx0YSA9ICZmLT5kZWx0YTsKCQllcHNpbG9uID0gJmYt PmVwc2lsb247CgkJc3RvcCA9IGYtPnNlcTsKCX1lbHNlewoJCS8qIHJlZG87IHJldmVyc2UgZXBz aWxvbiBvbnRvIGRlbHRhLCBzZXEgaW5jcmVhc2VzICovCgkJZGVsdGEgPSAmZi0+ZXBzaWxvbjsK CQllcHNpbG9uID0gJmYtPmRlbHRhOwoJCXN0b3AgPSAwOwkvKiBkb24ndCBrbm93IHlldCAqLwoJ fQoKCXJhc3BzdGFydChmKTsKCXdoaWxlKGRlbHRhLT5uYyA+IDApewoJCXVwID0gZGVsdGEtPm5j LVVuZG9zaXplOwoJCWJ1ZnJlYWQoZGVsdGEsIHVwLCAoUnVuZSopJnUsIFVuZG9zaXplKTsKCQlp Zihpc3VuZG8pewoJCQlpZih1LnNlcSA8IHN0b3ApewoJCQkJZi0+c2VxID0gdS5zZXE7CgkJCQly YXNwZG9uZShmLCBmbGFnKTsKCQkJCXJldHVybjsKCQkJfQoJCX1lbHNlewoJCQlpZihzdG9wID09 IDApCgkJCQlzdG9wID0gdS5zZXE7CgkJCWlmKHUuc2VxID4gc3RvcCl7CgkJCQlyYXNwZG9uZShm LCBmbGFnKTsKCQkJCXJldHVybjsKCQkJfQoJCX0KCQlzd2l0Y2godS50eXBlKXsKCQlkZWZhdWx0 OgoJCQlwYW5pYygidW5kbyB1bmtub3duIHUudHlwZSIpOwoJCQlicmVhazsKCgkJY2FzZSBEZWxl dGU6CgkJCWYtPnNlcSA9IHUuc2VxOwoJCQlpZihjYW5yZWRvKQoJCQkJZmlsZXVuZGVsZXRlKGYs IGVwc2lsb24sIHUucDAsIHUucDArdS5uKTsKCQkJZi0+bW9kID0gdS5tb2Q7CgkJCWJ1ZmRlbGV0 ZSgmZi0+VSwgdS5wMCwgdS5wMCt1Lm4pOwoJCQlyYXNwZGVsZXRlKGYsIHUucDAsIHUucDArdS5u LCBmbGFnKTsKCQkJKnEwcCA9IHUucDA7CgkJCSpxMXAgPSB1LnAwOwoJCQlicmVhazsKCgkJY2Fz ZSBJbnNlcnQ6CgkJCWYtPnNlcSA9IHUuc2VxOwoJCQlpZihjYW5yZWRvKQoJCQkJZmlsZXVuaW5z ZXJ0KGYsIGVwc2lsb24sIHUucDAsIHUubik7CgkJCWYtPm1vZCA9IHUubW9kOwoJCQl1cCAtPSB1 Lm47CgkJCWJ1ZiA9IGZidWZhbGxvYygpOwoJCQlmb3IoaT0wOyBpPHUubjsgaSs9bil7CgkJCQlu ID0gdS5uIC0gaTsKCQkJCWlmKG4gPiBSQlVGU0laRSkKCQkJCQluID0gUkJVRlNJWkU7CgkJCQli dWZyZWFkKGRlbHRhLCB1cCtpLCBidWYsIG4pOwoJCQkJYnVmaW5zZXJ0KCZmLT5VLCB1LnAwK2ks IGJ1Ziwgbik7CgkJCQlyYXNwaW5zZXJ0KGYsIHUucDAraSwgYnVmLCBuLCBmbGFnKTsKCQkJfQoJ CQlmYnVmZnJlZShidWYpOwoJCQkqcTBwID0gdS5wMDsKCQkJKnExcCA9IHUucDArdS5uOwoJCQli cmVhazsKCgkJY2FzZSBGaWxlbmFtZToKCQkJZi0+c2VxID0gdS5zZXE7CgkJCWlmKGNhbnJlZG8p CgkJCQlmaWxldW5zZXRuYW1lKGYsIGVwc2lsb24pOwoJCQlmLT5tb2QgPSB1Lm1vZDsKCQkJdXAg LT0gdS5uOwoKCQkJU3RyaW5zdXJlKCZmLT5uYW1lLCB1Lm4rMSk7CgkJCWJ1ZnJlYWQoZGVsdGEs IHVwLCBmLT5uYW1lLnMsIHUubik7CgkJCWYtPm5hbWUuc1t1Lm5dID0gMDsKCQkJZi0+bmFtZS5u ID0gdS5uOwoJCQlmaXhuYW1lKCZmLT5uYW1lKTsKCQkJc29ydG5hbWUoZik7CgkJCWJyZWFrOwoJ CWNhc2UgRG90OgoJCQlmLT5zZXEgPSB1LnNlcTsKCQkJaWYoY2FucmVkbykKCQkJCWZpbGV1bnNl dGRvdChmLCBlcHNpbG9uLCBmLT5kb3Qucik7CgkJCWYtPm1vZCA9IHUubW9kOwoJCQlmLT5kb3Qu ci5wMSA9IHUucDA7CgkJCWYtPmRvdC5yLnAyID0gdS5wMCArIHUubjsKCQkJYnJlYWs7CgkJY2Fz ZSBNYXJrOgoJCQlmLT5zZXEgPSB1LnNlcTsKCQkJaWYoY2FucmVkbykKCQkJCWZpbGV1bnNldG1h cmsoZiwgZXBzaWxvbiwgZi0+bWFyayk7CgkJCWYtPm1vZCA9IHUubW9kOwoJCQlmLT5tYXJrLnAx ID0gdS5wMDsKCQkJZi0+bWFyay5wMiA9IHUucDAgKyB1Lm47CgkJCWJyZWFrOwoJCX0KCQlidWZk ZWxldGUoZGVsdGEsIHVwLCBkZWx0YS0+bmMpOwoJfQoJaWYoaXN1bmRvKQoJCWYtPnNlcSA9IDA7 CglyYXNwZG9uZShmLCBmbGFnKTsKfQoKdm9pZApmaWxlcmVzZXQoRmlsZSAqZikKewoJYnVmcmVz ZXQoJmYtPmRlbHRhKTsKCWJ1ZnJlc2V0KCZmLT5lcHNpbG9uKTsKCWYtPnNlcSA9IDA7Cn0KCnZv aWQKZmlsZWNsb3NlKEZpbGUgKmYpCnsKCVN0cmNsb3NlKCZmLT5uYW1lKTsKCWJ1ZmNsb3NlKCZm LT5VKTsKCWJ1ZmNsb3NlKCZmLT5kZWx0YSk7CglidWZjbG9zZSgmZi0+ZXBzaWxvbik7CglpZihm LT5yYXNwKQoJCWxpc3RmcmVlKGYtPnJhc3ApOwoJZnJlZShmKTsKfQoKdm9pZApmaWxlbWFyayhG aWxlICpmKQp7CgoJaWYoZi0+dW5yZWFkKQoJCXJldHVybjsKCWlmKGYtPmVwc2lsb24ubmMpCgkJ YnVmZGVsZXRlKCZmLT5lcHNpbG9uLCAwLCBmLT5lcHNpbG9uLm5jKTsKCglpZihmICE9IGNtZCl7 CgkJZi0+cHJldmRvdCA9IGYtPmRvdC5yOwoJCWYtPnByZXZtYXJrID0gZi0+bWFyazsKCQlmLT5w cmV2c2VxID0gZi0+c2VxOwoJCWYtPnByZXZtb2QgPSBmLT5tb2Q7Cgl9CgoJZi0+bmRvdCA9IGYt PmRvdDsKCWYtPnNlcSA9IHNlcTsKCWYtPmhpcG9zbiA9IDA7Cn0KYW5pYygiaW50ZXJuYWwgZXJy b3I6IGZpbGVpbnNlcnQiKTsKCWlmKGYtPnNlcSA+IDApCgkJZmlsZXVuaW5zZXJ0KGYsICZmLT5k ZWx0YSwgcDAsIG5zKTsKCWJ1Zmluc2VydCgmZi0+VSwgcDAsIHMsIG5zKTsKCWlmKG5zKQoJCWYt Pm1vZCA9IFRSVUU7Cn0KCnZvaWQKZmlsZXVuaW5zZXJ0KEZpbGUgKmYsIEJ1ZmZlciAqZGVsdGEs IHNhbTJrL3NhbS9pby5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3 MzcAMDAwMDE1MQAwMDAwMDAxMDU0MwAwNzExMTYzMTU2NQAwMDE0MzIzADAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAw MDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I2luY2x1ZGUgInNhbS5oIgoKI2RlZmluZQlOU1lTRklMRQkzCiNkZWZpbmUJTk9GSUxFCQkxMjgK CnZvaWQKY2hlY2txaWQoRmlsZSAqZikKewoJaW50IGksIHc7CglGaWxlICpnOwoKCXcgPSB3aGlj aG1lbnUoZik7Cglmb3IoaT0xOyBpPGZpbGUubnVzZWQ7IGkrKyl7CgkJZyA9IGZpbGUuZmlsZXBw dHJbaV07CgkJaWYodyA9PSBpKQoJCQljb250aW51ZTsKCQlpZihmLT5kZXY9PWctPmRldiAmJiBm LT5xaWRwYXRoPT1nLT5xaWRwYXRoKQoJCQl3YXJuX1NTKFdkdXBmaWxlLCAmZi0+bmFtZSwgJmct Pm5hbWUpOwoJfQp9Cgp2b2lkCndyaXRlZihGaWxlICpmKQp7CglQb3NuIG47CgljaGFyICpuYW1l OwoJaW50IGksIHNhbWVuYW1lLCBuZXdmaWxlOwoJdWxvbmcgZGV2LCBxaWQ7Cglsb25nIG10aW1l LCBhcHBlbmRvbmx5LCBsZW5ndGg7CgoJbmV3ZmlsZSA9IDA7CglzYW1lbmFtZSA9IFN0cmNtcCgm Z2Vuc3RyLCAmZi0+bmFtZSkgPT0gMDsKCW5hbWUgPSBTdHJ0b2MoJmYtPm5hbWUpOwoJaSA9IHN0 YXRmaWxlKG5hbWUsICZkZXYsICZxaWQsICZtdGltZSwgMCwgMCk7CglpZihpID09IC0xKQoJCW5l d2ZpbGUrKzsKCWVsc2UgaWYoc2FtZW5hbWUgJiYKCSAgICAgICAgKGYtPmRldiE9ZGV2IHx8IGYt PnFpZHBhdGghPXFpZCB8fCBmLT5tdGltZTxtdGltZSkpewoJCWYtPmRldiA9IGRldjsKCQlmLT5x aWRwYXRoID0gcWlkOwoJCWYtPm10aW1lID0gbXRpbWU7CgkJd2Fybl9TKFdkYXRlLCAmZ2Vuc3Ry KTsKCQlyZXR1cm47Cgl9CglpZihnZW5jKQoJCWZyZWUoZ2VuYyk7CglnZW5jID0gU3RydG9jKCZn ZW5zdHIpOwoJaWYoZi0+c2VxID09IHNlcSkKCQllcnJvcl9zKEV3c2VxLCBnZW5jKTsKCWlmKChp bz1jcmVhdGUoZ2VuYywgMSwgMDY2NkwpKSA8IDApCgkJZXJyb3JfcyhFY3JlYXRlLCBnZW5jKTsK CWRwcmludCgiJXM6ICIsIGdlbmMpOwoJaWYoc3RhdGZkKGlvLCAwLCAwLCAwLCAmbGVuZ3RoLCAm YXBwZW5kb25seSkgPiAwICYmIGFwcGVuZG9ubHkgJiYgbGVuZ3RoPjApCgkJZXJyb3IoRWFwcGVu ZCk7CgluID0gd3JpdGVpbyhmKTsKCWlmKGYtPm5hbWUuc1swXT09MCB8fCBzYW1lbmFtZSl7CgkJ aWYoYWRkci5yLnAxPT0wICYmIGFkZHIuci5wMj09Zi0+VS5uYykKCQkJZi0+Y2xlYW5zZXEgPSBm LT5zZXE7CgkJc3RhdGUoZiwgZi0+Y2xlYW5zZXE9PWYtPnNlcT8gQ2xlYW4gOiBEaXJ0eSk7Cgl9 CglpZihuZXdmaWxlKQoJCWRwcmludCgiKG5ldyBmaWxlKSAiKTsKCWlmKGFkZHIuci5wMj4wICYm IGZpbGVyZWFkYyhmLCBhZGRyLnIucDItMSkhPSdcbicpCgkJd2FybihXbm90bmV3bGluZSk7Cglj bG9zZWlvKG4pOwoJaWYoZi0+bmFtZS5zWzBdPT0wIHx8IHNhbWVuYW1lKXsKCQlpZihzdGF0Zmls ZShuYW1lLCAmZGV2LCAmcWlkLCAmbXRpbWUsIDAsIDApID4gMCl7CgkJCWYtPmRldiA9IGRldjsK CQkJZi0+cWlkcGF0aCA9IHFpZDsKCQkJZi0+bXRpbWUgPSBtdGltZTsKCQkJY2hlY2txaWQoZik7 CgkJfQoJfQp9CgpQb3NuCnJlYWRpbyhGaWxlICpmLCBpbnQgKm51bGxzLCBpbnQgc2V0ZGF0ZSwg aW50IHRvdGVybSkKewoJaW50IG4sIGIsIHc7CglSdW5lICpyOwoJUG9zbiBudDsKCVBvc24gcCA9 IGFkZHIuci5wMjsKCXVsb25nIGRldiwgcWlkOwoJbG9uZyBtdGltZTsKCWNoYXIgYnVmW0JMT0NL U0laRSsxXSwgKnM7CgoJKm51bGxzID0gRkFMU0U7CgliID0gMDsKCWlmKGYtPnVucmVhZCl7CgkJ bnQgPSBidWZsb2FkKCZmLT5VLCAwLCBpbywgbnVsbHMpOwoJCWlmKHRvdGVybSkKCQkJcmFzcGxv YWQoZik7Cgl9ZWxzZQoJCWZvcihudCA9IDA7IChuID0gcmVhZChpbywgYnVmK2IsIEJMT0NLU0la RS1iKSk+MDsgbnQrPShyLWdlbmJ1ZikpewoJCQluICs9IGI7CgkJCWIgPSAwOwoJCQlyID0gZ2Vu YnVmOwoJCQlzID0gYnVmOwoJCQl3aGlsZShuID4gMCl7CgkJCQlpZigoKnIgPSAqKHVjaGFyKilz KSA8IFJ1bmVzZWxmKXsKCQkJCQlpZigqcikKCQkJCQkJcisrOwoJCQkJCWVsc2UKCQkJCQkJKm51 bGxzID0gVFJVRTsKCQkJCQktLW47CgkJCQkJcysrOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJ aWYoZnVsbHJ1bmUocywgbikpewoJCQkJCXcgPSBjaGFydG9ydW5lKHIsIHMpOwoJCQkJCWlmKCpy KQoJCQkJCQlyKys7CgkJCQkJZWxzZQoJCQkJCQkqbnVsbHMgPSBUUlVFOwoJCQkJCW4gLT0gdzsK CQkJCQlzICs9IHc7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQliID0gbjsKCQkJCW1lbW1vdmUo YnVmLCBzLCBiKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWxvZ2luc2VydChmLCBwLCBnZW5idWYsIHIt Z2VuYnVmKTsKCQl9CglpZihiKQoJCSpudWxscyA9IFRSVUU7CglpZigqbnVsbHMpCgkJd2FybihX bnVsbHMpOwoJaWYoc2V0ZGF0ZSl7CgkJaWYoc3RhdGZkKGlvLCAmZGV2LCAmcWlkLCAmbXRpbWUs IDAsIDApID4gMCl7CgkJCWYtPmRldiA9IGRldjsKCQkJZi0+cWlkcGF0aCA9IHFpZDsKCQkJZi0+ bXRpbWUgPSBtdGltZTsKCQkJY2hlY2txaWQoZik7CgkJfQoJfQoJcmV0dXJuIG50Owp9CgpQb3Nu CndyaXRlaW8oRmlsZSAqZikKewoJaW50IG0sIG47CglQb3NuIHAgPSBhZGRyLnIucDE7CgljaGFy ICpjOwoKCXdoaWxlKHAgPCBhZGRyLnIucDIpewoJCWlmKGFkZHIuci5wMi1wPkJMT0NLU0laRSkK CQkJbiA9IEJMT0NLU0laRTsKCQllbHNlCgkJCW4gPSBhZGRyLnIucDItcDsKCQlidWZyZWFkKCZm LT5VLCBwLCBnZW5idWYsIG4pOwoJCWMgPSBTdHJ0b2ModG1wcnN0cihnZW5idWYsIG4pKTsKCQlt ID0gc3RybGVuKGMpOwoJCWlmKFdyaXRlKGlvLCBjLCBtKSAhPSBtKXsKCQkJZnJlZShjKTsKCQkJ aWYocCA+IDApCgkJCQlwICs9IG47CgkJCWJyZWFrOwoJCX0KCQlmcmVlKGMpOwoJCXAgKz0gbjsK CX0KCXJldHVybiBwLWFkZHIuci5wMTsKfQp2b2lkCmNsb3NlaW8oUG9zbiBwKQp7CgljbG9zZShp byk7CglpbyA9IDA7CglpZihwID49IDApCgkJZHByaW50KCIjJWx1ZFxuIiwgcCk7Cn0KCmludAly ZW1vdGVmZDAgPSAwOwppbnQJcmVtb3RlZmQxID0gMTsKCnZvaWQKYm9vdHRlcm0oY2hhciAqbWFj aGluZSwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbmQpCnsKCWludCBwaDJ0WzJdLCBwdDJoWzJdOwoK CWlmKG1hY2hpbmUpewoJCWR1cChyZW1vdGVmZDAsIDApOwoJCWR1cChyZW1vdGVmZDEsIDEpOwoJ CWNsb3NlKHJlbW90ZWZkMCk7CgkJY2xvc2UocmVtb3RlZmQxKTsKCQlhcmd2WzBdID0gInNhbXRl cm0iOwoJCSplbmQgPSAwOwoJCWV4ZWMoc2FtdGVybSwgYXJndik7CgkJZnByaW50KDIsICJjYW4n dCBleGVjOiAiKTsKCQlwZXJyb3Ioc2FtdGVybSk7CgkJX2V4aXRzKCJkYW1uIik7Cgl9CglpZihw aXBlKHBoMnQpPT0tMSB8fCBwaXBlKHB0MmgpPT0tMSkKCQlwYW5pYygicGlwZSIpOwoJc3dpdGNo KGZvcmsoKSl7CgljYXNlIDA6CgkJZHVwKHBoMnRbMF0sIDApOwoJCWR1cChwdDJoWzFdLCAxKTsK CQljbG9zZShwaDJ0WzBdKTsKCQljbG9zZShwaDJ0WzFdKTsKCQljbG9zZShwdDJoWzBdKTsKCQlj bG9zZShwdDJoWzFdKTsKCQlhcmd2WzBdID0gInNhbXRlcm0iOwoJCSplbmQgPSAwOwoJCWV4ZWMo c2FtdGVybSwgYXJndik7CgkJZnByaW50KDIsICJjYW4ndCBleGVjOiAiKTsKCQlwZXJyb3Ioc2Ft dGVybSk7CgkJX2V4aXRzKCJkYW1uIik7CgljYXNlIC0xOgoJCXBhbmljKCJjYW4ndCBmb3JrIHNh bXRlcm0iKTsKCX0KCWR1cChwdDJoWzBdLCAwKTsKCWR1cChwaDJ0WzFdLCAxKTsKCWNsb3NlKHBo MnRbMF0pOwoJY2xvc2UocGgydFsxXSk7CgljbG9zZShwdDJoWzBdKTsKCWNsb3NlKHB0MmhbMV0p Owp9Cgp2b2lkCmNvbm5lY3R0byhjaGFyICptYWNoaW5lKQp7CglpbnQgcDFbMl0sIHAyWzJdOwoK CWlmKHBpcGUocDEpPDAgfHwgcGlwZShwMik8MCl7CgkJZHByaW50KCJjYW4ndCBwaXBlXG4iKTsK CQlleGl0cygicGlwZSIpOwoJfQoJcmVtb3RlZmQwID0gcDFbMF07CglyZW1vdGVmZDEgPSBwMlsx XTsKCXN3aXRjaChmb3JrKCkpewoJY2FzZSAwOgoJCWR1cChwMlswXSwgMCk7CgkJZHVwKHAxWzFd LCAxKTsKCQljbG9zZShwMVswXSk7CgkJY2xvc2UocDFbMV0pOwoJCWNsb3NlKHAyWzBdKTsKCQlj bG9zZShwMlsxXSk7CgkJZXhlY2woUlhQQVRILCBSWCwgbWFjaGluZSwgcnNhbW5hbWUsICItUiIs IChjaGFyKikwKTsKCQlkcHJpbnQoImNhbid0IGV4ZWMgJXNcbiIsIFJYUEFUSCk7CgkJZXhpdHMo ImV4ZWMiKTsKCgljYXNlIC0xOgoJCWRwcmludCgiY2FuJ3QgZm9ya1xuIik7CgkJZXhpdHMoImZv cmsiKTsKCX0KCWNsb3NlKHAxWzFdKTsKCWNsb3NlKHAyWzBdKTsKfQoKdm9pZApzdGFydHVwKGNo YXIgKm1hY2hpbmUsIGludCBSZmxhZywgY2hhciAqKmFyZ3YsIGNoYXIgKiplbmQpCnsKCWlmKG1h Y2hpbmUpCgkJY29ubmVjdHRvKG1hY2hpbmUpOwoJaWYoIVJmbGFnKQoJCWJvb3R0ZXJtKG1hY2hp bmUsIGFyZ3YsIGVuZCk7Cglkb3dubG9hZGVkID0gMTsKCW91dFRzKEh2ZXJzaW9uLCBWRVJTSU9O KTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2Ft L2xpc3QuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUx ADAwMDAwMDAxNTMyADA3MTExNjIyMTA1ADAwMTQ2NTMAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAi c2FtLmgiCgovKgogKiBDaGVjayB0aGF0IGxpc3QgaGFzIHJvb20gZm9yIG9uZSBtb3JlIGVsZW1l bnQuCiAqLwp2b2lkCmdyb3dsaXN0KExpc3QgKmwpCnsKCWlmKGwtPmxpc3RwdHI9PTAgfHwgbC0+ bmFsbG9jPT0wKXsKCQlsLT5uYWxsb2MgPSBJTkNSOwoJCWwtPmxpc3RwdHIgPSBlbWFsbG9jKElO Q1Iqc2l6ZW9mKGxvbmcpKTsKCQlsLT5udXNlZCA9IDA7Cgl9ZWxzZSBpZihsLT5udXNlZCA9PSBs LT5uYWxsb2MpewoJCWwtPmxpc3RwdHIgPSBlcmVhbGxvYyhsLT5saXN0cHRyLCAobC0+bmFsbG9j K0lOQ1IpKnNpemVvZihsb25nKSk7CgkJbWVtc2V0KCh2b2lkKikobC0+bG9uZ3B0citsLT5uYWxs b2MpLCAwLCBJTkNSKnNpemVvZihsb25nKSk7CgkJbC0+bmFsbG9jICs9IElOQ1I7Cgl9Cn0KCi8q CiAqIFJlbW92ZSB0aGUgaXRoIGVsZW1lbnQgZnJvbSB0aGUgbGlzdAogKi8Kdm9pZApkZWxsaXN0 KExpc3QgKmwsIGludCBpKQp7CgltZW1tb3ZlKCZsLT5sb25ncHRyW2ldLCAmbC0+bG9uZ3B0cltp KzFdLCAobC0+bnVzZWQtKGkrMSkpKnNpemVvZihsb25nKSk7CglsLT5udXNlZC0tOwp9CgovKgog KiBBZGQgYSBuZXcgZWxlbWVudCwgd2hvc2UgcG9zaXRpb24gaXMgaSwgdG8gdGhlIGxpc3QKICov CnZvaWQKaW5zbGlzdChMaXN0ICpsLCBpbnQgaSwgbG9uZyB2YWwpCnsKCWdyb3dsaXN0KGwpOwoJ bWVtbW92ZSgmbC0+bG9uZ3B0cltpKzFdLCAmbC0+bG9uZ3B0cltpXSwgKGwtPm51c2VkLWkpKnNp emVvZihsb25nKSk7CglsLT5sb25ncHRyW2ldID0gdmFsOwoJbC0+bnVzZWQrKzsKfQoKdm9pZAps aXN0ZnJlZShMaXN0ICpsKQp7CglmcmVlKGwtPmxpc3RwdHIpOwoJZnJlZShsKTsKfQoAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL21l c2cuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAw MDAwMDMyNzIyADA3MTExNjQwMTE3ADAwMTQ2NDMAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Z2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAic2Ft LmgiCgpIZWFkZXIJaDsKdWNoYXIJaW5kYXRhW0RBVEFTSVpFXTsKdWNoYXIJb3V0ZGF0YVsyKkRB VEFTSVpFKzNdOwkvKiByb29tIGZvciBvdmVyZmxvdyBtZXNzYWdlICovCnVjaGFyCSppbnA7CnVj aGFyCSpvdXRwOwp1Y2hhcgkqb3V0bXNnID0gb3V0ZGF0YTsKUG9zbgljbWRwdDsKUG9zbgljbWRw dGFkdjsKQnVmZmVyCXNuYXJmYnVmOwppbnQJd2FpdGFjazsKaW50CW5vZmx1c2g7CmludAl0dmVy c2lvbjsKCmxvbmcJaW5sb25nKHZvaWQpOwpsb25nCWludmxvbmcodm9pZCk7CmludAlpbnNob3J0 KHZvaWQpOwppbnQJaW5tZXNnKFRtZXNnKTsKdm9pZAlzZXRnZW5zdHIoRmlsZSosIFBvc24sIFBv c24pOwoKI2lmZGVmIERFQlVHCmNoYXIgKmhuYW1lW10gPSB7CglbSHZlcnNpb25dCSJIdmVyc2lv biIsCglbSGJpbmRuYW1lXQkiSGJpbmRuYW1lIiwKCVtIY3VycmVudF0JIkhjdXJyZW50IiwKCVtI bmV3bmFtZV0JIkhuZXduYW1lIiwKCVtIbW92bmFtZV0JIkhtb3ZuYW1lIiwKCVtIZ3Jvd10JCSJI Z3JvdyIsCglbSGNoZWNrMF0JIkhjaGVjazAiLAoJW0hjaGVja10JIkhjaGVjayIsCglbSHVubG9j a10JIkh1bmxvY2siLAoJW0hkYXRhXQkJIkhkYXRhIiwKCVtIb3JpZ2luXQkiSG9yaWdpbiIsCglb SHVubG9ja2ZpbGVdCSJIdW5sb2NrZmlsZSIsCglbSHNldGRvdF0JIkhzZXRkb3QiLAoJW0hncm93 ZGF0YV0JIkhncm93ZGF0YSIsCglbSG1vdmV0b10JIkhtb3ZldG8iLAoJW0hjbGVhbl0JIkhjbGVh biIsCglbSGRpcnR5XQkiSGRpcnR5IiwKCVtIY3V0XQkJIkhjdXQiLAoJW0hzZXRwYXRdCSJIc2V0 cGF0IiwKCVtIZGVsbmFtZV0JIkhkZWxuYW1lIiwKCVtIY2xvc2VdCSJIY2xvc2UiLAoJW0hzZXRz bmFyZl0JIkhzZXRzbmFyZiIsCglbSHNuYXJmbGVuXQkiSHNuYXJmbGVuIiwKCVtIYWNrXQkJIkhh Y2siLAoJW0hleGl0XQkJIkhleGl0IiwKCVtIcGx1bWJdCQkiSHBsdW1iIiwKfTsKCmNoYXIgKnRu YW1lW10gPSB7CglbVHZlcnNpb25dCSJUdmVyc2lvbiIsCglbVHN0YXJ0Y21kZmlsZV0JIlRzdGFy dGNtZGZpbGUiLAoJW1RjaGVja10JIlRjaGVjayIsCglbVHJlcXVlc3RdCSJUcmVxdWVzdCIsCglb VG9yaWdpbl0JIlRvcmlnaW4iLAoJW1RzdGFydGZpbGVdCSJUc3RhcnRmaWxlIiwKCVtUd29ya2Zp bGVdCSJUd29ya2ZpbGUiLAoJW1R0eXBlXQkJIlR0eXBlIiwKCVtUY3V0XQkJIlRjdXQiLAoJW1Rw YXN0ZV0JIlRwYXN0ZSIsCglbVHNuYXJmXQkiVHNuYXJmIiwKCVtUc3RhcnRuZXdmaWxlXQkiVHN0 YXJ0bmV3ZmlsZSIsCglbVHdyaXRlXQkiVHdyaXRlIiwKCVtUY2xvc2VdCSJUY2xvc2UiLAoJW1Rs b29rXQkJIlRsb29rIiwKCVtUc2VhcmNoXQkiVHNlYXJjaCIsCglbVHNlbmRdCQkiVHNlbmQiLAoJ W1RkY2xpY2tdCSJUZGNsaWNrIiwKCVtUc3RhcnRzbmFyZl0JIlRzdGFydHNuYXJmIiwKCVtUc2V0 c25hcmZdCSJUc2V0c25hcmYiLAoJW1RhY2tdCQkiVGFjayIsCglbVGV4aXRdCQkiVGV4aXQiLAoJ W1RwbHVtYl0JCSJUcGx1bWIiLAp9OwoKdm9pZApqb3VybmFsKGludCBvdXQsIGNoYXIgKnMpCnsK CXN0YXRpYyBpbnQgZmQgPSAwOwoKCWlmKGZkIDw9IDApCgkJZmQgPSBjcmVhdGUoIi90bXAvc2Ft Lm91dCIsIDEsIDA2NjZMKTsKCWZwcmludChmZCwgIiVzJXNcbiIsIG91dD8gIm91dDogIiA6ICJp bjogICIsIHMpOwp9Cgp2b2lkCmpvdXJuYWxuKGludCBvdXQsIGxvbmcgbikKewoJY2hhciBidWZb MzJdOwoKCXNwcmludChidWYsICIlbGQiLCBuKTsKCWpvdXJuYWwob3V0LCBidWYpOwp9CiNlbHNl CiNkZWZpbmUJam91cm5hbChhLCBiKQojZGVmaW5lIGpvdXJuYWxuKGEsIGIpCiNlbmRpZgoKaW50 CnJjdmNoYXIodm9pZCl7CglzdGF0aWMgdWNoYXIgYnVmWzY0XTsKCXN0YXRpYyBpbnQgaSwgbmxl ZnQgPSAwOwoKCWlmKG5sZWZ0IDw9IDApewoJCW5sZWZ0ID0gcmVhZCgwLCAoY2hhciAqKWJ1Ziwg c2l6ZW9mIGJ1Zik7CgkJaWYobmxlZnQgPD0gMCkKCQkJcmV0dXJuIC0xOwoJCWkgPSAwOwoJfQoJ LS1ubGVmdDsKCXJldHVybiBidWZbaSsrXTsKfQoKaW50CnJjdih2b2lkKXsKCWludCBjOwoJc3Rh dGljIGludCBzdGF0ZSA9IDA7CglzdGF0aWMgaW50IGNvdW50ID0gMDsKCXN0YXRpYyBpbnQgaSA9 IDA7CgoJd2hpbGUoKGM9cmN2Y2hhcigpKSAhPSAtMSkKCQlzd2l0Y2goc3RhdGUpewoJCWNhc2Ug MDoKCQkJaC50eXBlID0gYzsKCQkJc3RhdGUrKzsKCQkJYnJlYWs7CgoJCWNhc2UgMToKCQkJaC5j b3VudDAgPSBjOwoJCQlzdGF0ZSsrOwoJCQlicmVhazsKCgkJY2FzZSAyOgoJCQloLmNvdW50MSA9 IGM7CgkJCWNvdW50ID0gaC5jb3VudDB8KGguY291bnQxPDw4KTsKCQkJaSA9IDA7CgkJCWlmKGNv dW50ID4gREFUQVNJWkUpCgkJCQlwYW5pYygiY291bnQ+REFUQVNJWkUiKTsKCQkJaWYoY291bnQg PT0gMCkKCQkJCWdvdG8gemVyb2NvdW50OwoJCQlzdGF0ZSsrOwoJCQlicmVhazsKCgkJY2FzZSAz OgoJCQlpbmRhdGFbaSsrXSA9IGM7CgkJCWlmKGkgPT0gY291bnQpewoJCXplcm9jb3VudDoKCQkJ CWluZGF0YVtpXSA9IDA7CgkJCQlzdGF0ZSA9IGNvdW50ID0gMDsKCQkJCXJldHVybiBpbm1lc2co aC50eXBlKTsKCQkJfQoJCQlicmVhazsKCQl9CglyZXR1cm4gMDsKfQoKRmlsZSAqCndoaWNoZmls ZShpbnQgdGFnKQp7CglpbnQgaTsKCglmb3IoaSA9IDA7IGk8ZmlsZS5udXNlZDsgaSsrKQoJCWlm KGZpbGUuZmlsZXBwdHJbaV0tPnRhZz09dGFnKQoJCQlyZXR1cm4gZmlsZS5maWxlcHB0cltpXTsK CWhpY2NvdWdoKChjaGFyICopMCk7CglyZXR1cm4gMDsKfQoKaW50CmlubWVzZyhUbWVzZyB0eXBl KQp7CglSdW5lIGJ1ZlsxMDI1XTsKCWNoYXIgY2J1Zls2NF07CglpbnQgaSwgbTsKCXNob3J0IHM7 Cglsb25nIGwsIGwxOwoJRmlsZSAqZjsKCVBvc24gcDAsIHAxLCBwOwoJUmFuZ2UgcjsKCVN0cmlu ZyAqc3RyOwoJY2hhciAqYzsKCVJ1bmUgKnJwOwoJUGx1bWJtc2cgKnBtOwoKCWlmKHR5cGUgPiBU TUFYKQoJCXBhbmljKCJpbm1lc2ciKTsKCglqb3VybmFsKDAsIHRuYW1lW3R5cGVdKTsKCglpbnAg PSBpbmRhdGE7Cglzd2l0Y2godHlwZSl7CgljYXNlIC0xOgoJCXBhbmljKCJyY3YgZXJyb3IiKTsK CglkZWZhdWx0OgoJCWZwcmludCgyLCAidW5rbm93biB0eXBlICVkXG4iLCB0eXBlKTsKCQlwYW5p YygicmN2IHVua25vd24iKTsKCgljYXNlIFR2ZXJzaW9uOgoJCXR2ZXJzaW9uID0gaW5zaG9ydCgp OwoJCWpvdXJuYWxuKDAsIHR2ZXJzaW9uKTsKCQlicmVhazsKCgljYXNlIFRzdGFydGNtZGZpbGU6 CgkJbCA9IGludmxvbmcoKTsJCS8qIGZvciA2NC1iaXQgcG9pbnRlcnMgKi8KCQlqb3VybmFsbigw LCBsKTsKCQlTdHJkdXBsKCZnZW5zdHIsIHNhbW5hbWUpOwoJCWNtZCA9IG5ld2ZpbGUoKTsKCQlj bWQtPnVucmVhZCA9IDA7CgkJb3V0VHN2KEhiaW5kbmFtZSwgY21kLT50YWcsIGwpOwoJCW91dFRz KEhjdXJyZW50LCBjbWQtPnRhZyk7CgkJbG9nc2V0bmFtZShjbWQsICZnZW5zdHIpOwoJCWNtZC0+ cmFzcCA9IGVtYWxsb2Moc2l6ZW9mKExpc3QpKTsKCQljbWQtPm1vZCA9IDA7CgkJaWYoY21kc3Ry Lm4pewoJCQlsb2dpbnNlcnQoY21kLCAwTCwgY21kc3RyLnMsIGNtZHN0ci5uKTsKCQkJU3RyZGVs ZXRlKCZjbWRzdHIsIDBMLCAoUG9zbiljbWRzdHIubik7CgkJfQoJCWZpbGV1cGRhdGUoY21kLCBG QUxTRSwgVFJVRSk7CgkJb3V0VDAoSHVubG9jayk7CgkJYnJlYWs7CgoJY2FzZSBUY2hlY2s6CgkJ LyogZ28gdGhyb3VnaCB3aGljaGZpbGUgdG8gY2hlY2sgdGhlIHRhZyAqLwoJCW91dFRzKEhjaGVj aywgd2hpY2hmaWxlKGluc2hvcnQoKSktPnRhZyk7CgkJYnJlYWs7CgoJY2FzZSBUcmVxdWVzdDoK CQlmID0gd2hpY2hmaWxlKGluc2hvcnQoKSk7CgkJcDAgPSBpbmxvbmcoKTsKCQlwMSA9IHAwK2lu c2hvcnQoKTsKCQlqb3VybmFsbigwLCBwMCk7CgkJam91cm5hbG4oMCwgcDEtcDApOwoJCWlmKGYt PnVucmVhZCkKCQkJcGFuaWMoIlRyZXF1ZXN0OiB1bnJlYWQiKTsKCQlpZihwMT5mLT5VLm5jKQoJ CQlwMSA9IGYtPlUubmM7CgkJaWYocDA+Zi0+VS5uYykgLyogY2FuIGhhcHBlbiBlLmcuIHNjcm9s bGluZyBkdXJpbmcgY29tbWFuZCAqLwoJCQlwMCA9IGYtPlUubmM7CgkJaWYocDAgPT0gcDEpewoJ CQlpID0gMDsKCQkJci5wMSA9IHIucDIgPSBwMDsKCQl9ZWxzZXsKCQkJciA9IHJkYXRhKGYtPnJh c3AsIHAwLCBwMS1wMCk7CgkJCWkgPSByLnAyLXIucDE7CgkJCWJ1ZnJlYWQoJmYtPlUsIHIucDEs IGJ1ZiwgaSk7CgkJfQoJCWJ1ZltpXT0wOwoJCW91dFRzbFMoSGRhdGEsIGYtPnRhZywgci5wMSwg dG1wcnN0cihidWYsIGkrMSkpOwoJCWJyZWFrOwoKCWNhc2UgVG9yaWdpbjoKCQlzID0gaW5zaG9y dCgpOwoJCWwgPSBpbmxvbmcoKTsKCQlsMSA9IGlubG9uZygpOwoJCWpvdXJuYWxuKDAsIGwxKTsK CQlsb29rb3JpZ2luKHdoaWNoZmlsZShzKSwgbCwgbDEpOwoJCWJyZWFrOwoKCWNhc2UgVHN0YXJ0 ZmlsZToKCQl0ZXJtbG9ja2VkKys7CgkJZiA9IHdoaWNoZmlsZShpbnNob3J0KCkpOwoJCWlmKCFm LT5yYXNwKQkvKiB0aGlzIG1pZ2h0IGJlIGEgZHVwbGljYXRlIG1lc3NhZ2UgKi8KCQkJZi0+cmFz cCA9IGVtYWxsb2Moc2l6ZW9mKExpc3QpKTsKCQljdXJyZW50KGYpOwoJCW91dFRzdihIYmluZG5h bWUsIGYtPnRhZywgaW52bG9uZygpKTsJLyogZm9yIDY0LWJpdCBwb2ludGVycyAqLwoJCW91dFRz KEhjdXJyZW50LCBmLT50YWcpOwoJCWpvdXJuYWxuKDAsIGYtPnRhZyk7CgkJaWYoZi0+dW5yZWFk KQoJCQlsb2FkKGYpOwoJCWVsc2V7CgkJCWlmKGYtPlUubmM+MCl7CgkJCQlyZ3JvdyhmLT5yYXNw LCAwTCwgZi0+VS5uYyk7CgkJCQlvdXRUc2xsKEhncm93LCBmLT50YWcsIDBMLCBmLT5VLm5jKTsK CQkJfQoJCQlvdXRUcyhIY2hlY2swLCBmLT50YWcpOwoJCQltb3ZldG8oZiwgZi0+ZG90LnIpOwoJ CX0KCQlicmVhazsKCgljYXNlIFR3b3JrZmlsZToKCQlpID0gaW5zaG9ydCgpOwoJCWYgPSB3aGlj aGZpbGUoaSk7CgkJY3VycmVudChmKTsKCQlmLT5kb3Quci5wMSA9IGlubG9uZygpOwoJCWYtPmRv dC5yLnAyID0gaW5sb25nKCk7CgkJZi0+dGRvdCA9IGYtPmRvdC5yOwoJCWpvdXJuYWxuKDAsIGkp OwoJCWpvdXJuYWxuKDAsIGYtPmRvdC5yLnAxKTsKCQlqb3VybmFsbigwLCBmLT5kb3Quci5wMik7 CgkJYnJlYWs7CgoJY2FzZSBUdHlwZToKCQlmID0gd2hpY2hmaWxlKGluc2hvcnQoKSk7CgkJcDAg PSBpbmxvbmcoKTsKCQlqb3VybmFsbigwLCBwMCk7CgkJam91cm5hbCgwLCAoY2hhciopaW5wKTsK CQlzdHIgPSB0bXBjc3RyKChjaGFyKilpbnApOwoJCWkgPSBzdHItPm47CgkJbG9naW5zZXJ0KGYs IHAwLCBzdHItPnMsIHN0ci0+bik7CgkJaWYoZmlsZXVwZGF0ZShmLCBGQUxTRSwgRkFMU0UpKQoJ CQlzZXErKzsKCQlpZihmPT1jbWQgJiYgcDA9PWYtPlUubmMtaSAmJiBpPjAgJiYgc3RyLT5zW2kt MV09PSdcbicpewoJCQlmcmVldG1wc3RyKHN0cik7CgkJCXRlcm1sb2NrZWQrKzsKCQkJdGVybWNv bW1hbmQoKTsKCQl9ZWxzZQoJCQlmcmVldG1wc3RyKHN0cik7CgkJZi0+ZG90LnIucDEgPSBmLT5k b3Quci5wMiA9IHAwK2k7IC8qIHRlcm1pbmFsIGtub3dzIHRoaXMgYWxyZWFkeSAqLwoJCWYtPnRk b3QgPSBmLT5kb3QucjsKCQlicmVhazsKCgljYXNlIFRjdXQ6CgkJZiA9IHdoaWNoZmlsZShpbnNo b3J0KCkpOwoJCXAwID0gaW5sb25nKCk7CgkJcDEgPSBpbmxvbmcoKTsKCQlqb3VybmFsbigwLCBw MCk7CgkJam91cm5hbG4oMCwgcDEpOwoJCWxvZ2RlbGV0ZShmLCBwMCwgcDEpOwoJCWlmKGZpbGV1 cGRhdGUoZiwgRkFMU0UsIEZBTFNFKSkKCQkJc2VxKys7CgkJZi0+ZG90LnIucDEgPSBmLT5kb3Qu ci5wMiA9IHAwOwoJCWYtPnRkb3QgPSBmLT5kb3QucjsgICAvKiB0ZXJtaW5hbCBrbm93cyB0aGUg dmFsdWUgb2YgZG90IGFscmVhZHkgKi8KCQlicmVhazsKCgljYXNlIFRwYXN0ZToKCQlmID0gd2hp Y2hmaWxlKGluc2hvcnQoKSk7CgkJcDAgPSBpbmxvbmcoKTsKCQlqb3VybmFsbigwLCBwMCk7CgkJ Zm9yKGw9MDsgbDxzbmFyZmJ1Zi5uYzsgbCs9bSl7CgkJCW0gPSBzbmFyZmJ1Zi5uYy1sOwoJCQlp ZihtPkJMT0NLU0laRSkKCQkJCW0gPSBCTE9DS1NJWkU7CgkJCWJ1ZnJlYWQoJnNuYXJmYnVmLCBs LCBnZW5idWYsIG0pOwoJCQlsb2dpbnNlcnQoZiwgcDAsIHRtcHJzdHIoZ2VuYnVmLCBtKS0+cywg bSk7CgkJfQoJCWlmKGZpbGV1cGRhdGUoZiwgRkFMU0UsIFRSVUUpKQoJCQlzZXErKzsKCQlmLT5k b3Quci5wMSA9IHAwOwoJCWYtPmRvdC5yLnAyID0gcDArc25hcmZidWYubmM7CgkJZi0+dGRvdC5w MSA9IC0xOyAvKiBmb3JjZSB0ZWxsZG90IHRvIHRlbGwgKGFyZ3VhYmx5IGEgQlVHKSAqLwoJCXRl bGxkb3QoZik7CgkJb3V0VHMoSHVubG9ja2ZpbGUsIGYtPnRhZyk7CgkJYnJlYWs7CgoJY2FzZSBU c25hcmY6CgkJaSA9IGluc2hvcnQoKTsKCQlwMCA9IGlubG9uZygpOwoJCXAxID0gaW5sb25nKCk7 CgkJc25hcmYod2hpY2hmaWxlKGkpLCBwMCwgcDEsICZzbmFyZmJ1ZiwgMCk7CgkJYnJlYWs7CgoJ Y2FzZSBUc3RhcnRuZXdmaWxlOgoJCWwgPSBpbnZsb25nKCk7CgkJU3RyZHVwbCgmZ2Vuc3RyLCBl bXB0eSk7CgkJZiA9IG5ld2ZpbGUoKTsKCQlmLT5yYXNwID0gZW1hbGxvYyhzaXplb2YoTGlzdCkp OwoJCW91dFRzdihIYmluZG5hbWUsIGYtPnRhZywgbCk7CgkJbG9nc2V0bmFtZShmLCAmZ2Vuc3Ry KTsKCQlvdXRUcyhIY3VycmVudCwgZi0+dGFnKTsKCQljdXJyZW50KGYpOwoJCWxvYWQoZik7CgkJ YnJlYWs7CgoJY2FzZSBUd3JpdGU6CgkJdGVybWxvY2tlZCsrOwoJCWkgPSBpbnNob3J0KCk7CgkJ am91cm5hbG4oMCwgaSk7CgkJZiA9IHdoaWNoZmlsZShpKTsKCQlhZGRyLnIucDEgPSAwOwoJCWFk ZHIuci5wMiA9IGYtPlUubmM7CgkJaWYoZi0+bmFtZS5zWzBdID09IDApCgkJCWVycm9yKEVub25h bWUpOwoJCVN0cmR1cGxzdHIoJmdlbnN0ciwgJmYtPm5hbWUpOwoJCXdyaXRlZihmKTsKCQlicmVh azsKCgljYXNlIFRjbG9zZToKCQl0ZXJtbG9ja2VkKys7CgkJaSA9IGluc2hvcnQoKTsKCQlqb3Vy bmFsbigwLCBpKTsKCQlmID0gd2hpY2hmaWxlKGkpOwoJCWN1cnJlbnQoZik7CgkJdHJ5dG9jbG9z ZShmKTsKCQkvKiBpZiB0cnl0b2Nsb3NlIGZhaWxzLCB3aWxsIGVycm9yIG91dCAqLwoJCWRlbGV0 ZShmKTsKCQlicmVhazsKCgljYXNlIFRsb29rOgoJCWYgPSB3aGljaGZpbGUoaW5zaG9ydCgpKTsK CQl0ZXJtbG9ja2VkKys7CgkJcDAgPSBpbmxvbmcoKTsKCQlwMSA9IGlubG9uZygpOwoJCWpvdXJu YWxuKDAsIHAwKTsKCQlqb3VybmFsbigwLCBwMSk7CgkJc2V0Z2Vuc3RyKGYsIHAwLCBwMSk7CgkJ Zm9yKGwgPSAwOyBsPGdlbnN0ci5uOyBsKyspewoJCQlpID0gZ2Vuc3RyLnNbbF07CgkJCWlmKHV0 ZnJ1bmUoIi4qKz8ofClcXFtdXiQiLCBpKSkKCQkJCVN0cmluc2VydCgmZ2Vuc3RyLCB0bXBjc3Ry KCJcXCIpLCBsKyspOwoJCX0KCQlTdHJhZGRjKCZnZW5zdHIsICdcMCcpOwoJCW5leHRtYXRjaChm LCAmZ2Vuc3RyLCBwMSwgMSk7CgkJbW92ZXRvKGYsIHNlbC5wWzBdKTsKCQlicmVhazsKCgljYXNl IFRzZWFyY2g6CgkJdGVybWxvY2tlZCsrOwoJCWlmKGN1cmZpbGUgPT0gMCkKCQkJZXJyb3IoRW5v ZmlsZSk7CgkJaWYobGFzdHBhdC5zWzBdID09IDApCgkJCXBhbmljKCJUc2VhcmNoIik7CgkJbmV4 dG1hdGNoKGN1cmZpbGUsICZsYXN0cGF0LCBjdXJmaWxlLT5kb3Quci5wMiwgMSk7CgkJbW92ZXRv KGN1cmZpbGUsIHNlbC5wWzBdKTsKCQlicmVhazsKCgljYXNlIFRzZW5kOgoJCXRlcm1sb2NrZWQr KzsKCQlpbnNob3J0KCk7CS8qIGlnbm9yZWQgKi8KCQlwMCA9IGlubG9uZygpOwoJCXAxID0gaW5s b25nKCk7CgkJc2V0Z2Vuc3RyKGNtZCwgcDAsIHAxKTsKCQlidWZyZXNldCgmc25hcmZidWYpOwoJ CWJ1Zmluc2VydCgmc25hcmZidWYsIChQb3NuKTAsIGdlbnN0ci5zLCBnZW5zdHIubik7CgkJb3V0 VGwoSHNuYXJmbGVuLCBnZW5zdHIubik7CgkJaWYoZ2Vuc3RyLnNbZ2Vuc3RyLm4tMV0gIT0gJ1xu JykKCQkJU3RyYWRkYygmZ2Vuc3RyLCAnXG4nKTsKCQlsb2dpbnNlcnQoY21kLCBjbWQtPlUubmMs IGdlbnN0ci5zLCBnZW5zdHIubik7CgkJZmlsZXVwZGF0ZShjbWQsIEZBTFNFLCBUUlVFKTsKCQlj bWQtPmRvdC5yLnAxID0gY21kLT5kb3Quci5wMiA9IGNtZC0+VS5uYzsKCQl0ZWxsZG90KGNtZCk7 CgkJdGVybWNvbW1hbmQoKTsKCQlicmVhazsKCgljYXNlIFRkY2xpY2s6CgkJZiA9IHdoaWNoZmls ZShpbnNob3J0KCkpOwoJCXAxID0gaW5sb25nKCk7CgkJZG91YmxlY2xpY2soZiwgcDEpOwoJCWYt PnRkb3QucDEgPSBmLT50ZG90LnAyID0gcDE7CgkJdGVsbGRvdChmKTsKCQlvdXRUcyhIdW5sb2Nr ZmlsZSwgZi0+dGFnKTsKCQlicmVhazsKCgljYXNlIFRzdGFydHNuYXJmOgoJCWlmIChzbmFyZmJ1 Zi5uYyA8PSAwKSB7CS8qIG5vdGhpbmcgdG8gZXhwb3J0ICovCgkJCW91dFRzKEhzZXRzbmFyZiwg MCk7CgkJCWJyZWFrOwoJCX0KCQljID0gMDsKCQlpID0gMDsKCQltID0gc25hcmZidWYubmM7CgkJ aWYobSA+IFNOQVJGU0laRSkgewoJCQltID0gU05BUkZTSVpFOwoJCQlkcHJpbnQoIj93YXJuaW5n OiBzbmFyZiBidWZmZXIgdHJ1bmNhdGVkXG4iKTsKCQl9CgkJcnAgPSBtYWxsb2MobSpzaXplb2Yo UnVuZSkpOwoJCWlmKHJwKXsKCQkJYnVmcmVhZCgmc25hcmZidWYsIDAsIHJwLCBtKTsKCQkJYyA9 IFN0cnRvYyh0bXByc3RyKHJwLCBtKSk7CgkJCWZyZWUocnApOwoJCQlpID0gc3RybGVuKGMpOwoJ CX0KCQlvdXRUcyhIc2V0c25hcmYsIGkpOwoJCWlmKGMpewoJCQlXcml0ZSgxLCBjLCBpKTsKCQkJ ZnJlZShjKTsKCQl9IGVsc2UKCQkJZHByaW50KCJzbmFyZiBidWZmZXIgdG9vIGxvbmdcbiIpOwoJ CWJyZWFrOwoKCWNhc2UgVHNldHNuYXJmOgoJCW0gPSBpbnNob3J0KCk7CgkJaWYobSA+IFNOQVJG U0laRSkKCQkJZXJyb3IoRXRvb2xvbmcpOwoJCWMgPSBtYWxsb2MobSsxKTsKCQlpZihjKXsKCQkJ Zm9yKGk9MDsgaTxtOyBpKyspCgkJCQljW2ldID0gcmN2Y2hhcigpOwoJCQljW21dID0gMDsKCQkJ c3RyID0gdG1wY3N0cihjKTsKCQkJZnJlZShjKTsKCQkJYnVmcmVzZXQoJnNuYXJmYnVmKTsKCQkJ YnVmaW5zZXJ0KCZzbmFyZmJ1ZiwgKFBvc24pMCwgc3RyLT5zLCBzdHItPm4pOwoJCQlmcmVldG1w c3RyKHN0cik7CgkJCW91dFQwKEh1bmxvY2spOwoJCX0KCQlicmVhazsKCgljYXNlIFRhY2s6CgkJ d2FpdGFjayA9IDA7CgkJYnJlYWs7CgoJY2FzZSBUcGx1bWI6CgkJZiA9IHdoaWNoZmlsZShpbnNo b3J0KCkpOwoJCXAwID0gaW5sb25nKCk7CgkJcDEgPSBpbmxvbmcoKTsKCQlwbSA9IGVtYWxsb2Mo c2l6ZW9mKFBsdW1ibXNnKSk7CgkJcG0tPnNyYyA9IHN0cmR1cCgic2FtIik7CgkJcG0tPmRzdCA9 IDA7CgkJcG0tPndkaXIgPSBlbWFsbG9jKDEwMjQpOwoJCWdldHdkKHBtLT53ZGlyLCAxMDI0KTsK CQlwbS0+dHlwZSA9IHN0cmR1cCgidGV4dCIpOwoJCWlmKHAxID4gcDApCgkJCXBtLT5hdHRyID0g bmlsOwoJCWVsc2V7CgkJCXAgPSBwMDsKCQkJd2hpbGUocDA+MCAmJiAoaT1maWxlcmVhZGMoZiwg cDAgLSAxKSkhPScgJyAmJiBpIT0nXHQnICYmIGkhPSdcbicpCgkJCQlwMC0tOwoJCQl3aGlsZShw MTxmLT5VLm5jICYmIChpPWZpbGVyZWFkYyhmLCBwMSkpIT0nICcgJiYgaSE9J1x0JyAmJiBpIT0n XG4nKQoJCQkJcDErKzsKCQkJc3ByaW50KGNidWYsICJjbGljaz0lbGQiLCBwLXAwKTsKCQkJcG0t PmF0dHIgPSBwbHVtYnVucGFja2F0dHIoY2J1Zik7CgkJfQoJCWlmKHAwPT1wMSB8fCBwMS1wMD49 QkxPQ0tTSVpFKXsKCQkJcGx1bWJmcmVlKHBtKTsKCQkJYnJlYWs7CgkJfQoJCXNldGdlbnN0cihm LCBwMCwgcDEpOwoJCXBtLT5kYXRhID0gU3RydG9jKCZnZW5zdHIpOwoJCXBtLT5uZGF0YSA9IHN0 cmxlbihwbS0+ZGF0YSk7CgkJYyA9IHBsdW1icGFjayhwbSwgJmkpOwoJCWlmKGMgIT0gMCl7CgkJ CW91dFRzKEhwbHVtYiwgaSk7CgkJCVdyaXRlKDEsIGMsIGkpOwoJCQlmcmVlKGMpOwoJCX0KCQlw bHVtYmZyZWUocG0pOwoJCWJyZWFrOwoKCWNhc2UgVGV4aXQ6CgkJZXhpdHMoMCk7Cgl9CglyZXR1 cm4gVFJVRTsKfQoKdm9pZApzbmFyZihGaWxlICpmLCBQb3NuIHAxLCBQb3NuIHAyLCBCdWZmZXIg KmJ1ZiwgaW50IGVtcHR5b2spCnsKCVBvc24gbDsKCWludCBpOwoKCWlmKCFlbXB0eW9rICYmIHAx PT1wMikKCQlyZXR1cm47CglidWZyZXNldChidWYpOwoJLyogU3RhZ2UgdGhyb3VnaCBnZW5idWYg dG8gYXZvaWQgY29tcGFjdGlvbiBwcm9ibGVtcyAodmVzdGlnaWFsKSAqLwoJaWYocDIgPiBmLT5V Lm5jKXsKCQlmcHJpbnQoMiwgImJhZCBzbmFyZiBhZGRyIHAxPSVsZCBwMj0lbGQgZi0+VS5uYz0l ZFxuIiwgcDEsIHAyLCBmLT5VLm5jKTsgLypaWlogc2hvdWxkIG5ldmVyIGhhcHBlbiwgY2FuIHJl bW92ZSAqLwoJCXAyID0gZi0+VS5uYzsKCX0KCWZvcihsPXAxOyBsPHAyOyBsKz1pKXsKCQlpID0g cDItbD5CTE9DS1NJWkU/IEJMT0NLU0laRSA6IHAyLWw7CgkJYnVmcmVhZCgmZi0+VSwgbCwgZ2Vu YnVmLCBpKTsKCQlidWZpbnNlcnQoYnVmLCBidWYtPm5jLCB0bXByc3RyKGdlbmJ1ZiwgaSktPnMs IGkpOwoJfQp9CgppbnQKaW5zaG9ydCh2b2lkKQp7Cgl1c2hvcnQgbjsKCgluID0gaW5wWzBdIHwg KGlucFsxXTw8OCk7CglpbnAgKz0gMjsKCXJldHVybiBuOwp9Cgpsb25nCmlubG9uZyh2b2lkKQp7 Cgl1bG9uZyBuOwoKCW4gPSBpbnBbMF0gfCAoaW5wWzFdPDw4KSB8IChpbnBbMl08PDE2KSB8IChp bnBbM108PDI0KTsKCWlucCArPSA0OwoJcmV0dXJuIG47Cn0KCmxvbmcKaW52bG9uZyh2b2lkKQp7 Cgl1bG9uZyBuOwoJCgluID0gKGlucFs3XTw8MjQpIHwgKGlucFs2XTw8MTYpIHwgKGlucFs1XTw8 OCkgfCBpbnBbNF07CgluID0gKG48PDE2KSB8IChpbnBbM108PDgpIHwgaW5wWzJdOwoJbiA9IChu PDwxNikgfCAoaW5wWzFdPDw4KSB8IGlucFswXTsKCWlucCArPSA4OwoJcmV0dXJuIG47Cn0KCnZv aWQKc2V0Z2Vuc3RyKEZpbGUgKmYsIFBvc24gcDAsIFBvc24gcDEpCnsKCWlmKHAwICE9IHAxKXsK CQlpZihwMS1wMCA+PSBUQkxPQ0tTSVpFKQoJCQllcnJvcihFdG9vbG9uZyk7CgkJU3RyaW5zdXJl KCZnZW5zdHIsIHAxLXAwKTsKCQlidWZyZWFkKCZmLT5VLCBwMCwgZ2VuYnVmLCBwMS1wMCk7CgkJ bWVtbW92ZShnZW5zdHIucywgZ2VuYnVmLCBSVU5FU0laRSoocDEtcDApKTsKCQlnZW5zdHIubiA9 IHAxLXAwOwoJfWVsc2V7CgkJaWYoc25hcmZidWYubmMgPT0gMCkKCQkJZXJyb3IoRWVtcHR5KTsK CQlpZihzbmFyZmJ1Zi5uYyA+IFRCTE9DS1NJWkUpCgkJCWVycm9yKEV0b29sb25nKTsKCQlidWZy ZWFkKCZzbmFyZmJ1ZiwgKFBvc24pMCwgZ2VuYnVmLCBzbmFyZmJ1Zi5uYyk7CgkJU3RyaW5zdXJl KCZnZW5zdHIsIHNuYXJmYnVmLm5jKTsKCQltZW1tb3ZlKGdlbnN0ci5zLCBnZW5idWYsIFJVTkVT SVpFKnNuYXJmYnVmLm5jKTsKCQlnZW5zdHIubiA9IHNuYXJmYnVmLm5jOwoJfQp9Cgp2b2lkCm91 dFQwKEhtZXNnIHR5cGUpCnsKCW91dHN0YXJ0KHR5cGUpOwoJb3V0c2VuZCgpOwp9Cgp2b2lkCm91 dFRsKEhtZXNnIHR5cGUsIGxvbmcgbCkKewoJb3V0c3RhcnQodHlwZSk7CglvdXRsb25nKGwpOwoJ b3V0c2VuZCgpOwp9Cgp2b2lkCm91dFRzKEhtZXNnIHR5cGUsIGludCBzKQp7CglvdXRzdGFydCh0 eXBlKTsKCWpvdXJuYWxuKDEsIHMpOwoJb3V0c2hvcnQocyk7CglvdXRzZW5kKCk7Cn0KCnZvaWQK b3V0UyhTdHJpbmcgKnMpCnsKCWNoYXIgKmM7CglpbnQgaTsKCgljID0gU3RydG9jKHMpOwoJaSA9 IHN0cmxlbihjKTsKCW91dGNvcHkoaSwgYyk7CglpZihpID4gOTkpCgkJY1s5OV0gPSAwOwoJam91 cm5hbG4oMSwgaSk7Cglqb3VybmFsKDEsIGMpOwoJZnJlZShjKTsKfQoKdm9pZApvdXRUc1MoSG1l c2cgdHlwZSwgaW50IHMxLCBTdHJpbmcgKnMpCnsKCW91dHN0YXJ0KHR5cGUpOwoJb3V0c2hvcnQo czEpOwoJb3V0UyhzKTsKCW91dHNlbmQoKTsKfQoKdm9pZApvdXRUc2xTKEhtZXNnIHR5cGUsIGlu dCBzMSwgUG9zbiBsMSwgU3RyaW5nICpzKQp7CglvdXRzdGFydCh0eXBlKTsKCW91dHNob3J0KHMx KTsKCWpvdXJuYWxuKDEsIHMxKTsKCW91dGxvbmcobDEpOwoJam91cm5hbG4oMSwgbDEpOwoJb3V0 UyhzKTsKCW91dHNlbmQoKTsKfQoKdm9pZApvdXRUUyhIbWVzZyB0eXBlLCBTdHJpbmcgKnMpCnsK CW91dHN0YXJ0KHR5cGUpOwoJb3V0UyhzKTsKCW91dHNlbmQoKTsKfQoKdm9pZApvdXRUc2xsUyhI bWVzZyB0eXBlLCBpbnQgczEsIFBvc24gbDEsIFBvc24gbDIsIFN0cmluZyAqcykKewoJb3V0c3Rh cnQodHlwZSk7CglvdXRzaG9ydChzMSk7CglvdXRsb25nKGwxKTsKCW91dGxvbmcobDIpOwoJam91 cm5hbG4oMSwgbDEpOwoJam91cm5hbG4oMSwgbDIpOwoJb3V0UyhzKTsKCW91dHNlbmQoKTsKfQoK dm9pZApvdXRUc2xsKEhtZXNnIHR5cGUsIGludCBzLCBQb3NuIGwxLCBQb3NuIGwyKQp7CglvdXRz dGFydCh0eXBlKTsKCW91dHNob3J0KHMpOwoJb3V0bG9uZyhsMSk7CglvdXRsb25nKGwyKTsKCWpv dXJuYWxuKDEsIGwxKTsKCWpvdXJuYWxuKDEsIGwyKTsKCW91dHNlbmQoKTsKfQoKdm9pZApvdXRU c2woSG1lc2cgdHlwZSwgaW50IHMsIFBvc24gbCkKewoJb3V0c3RhcnQodHlwZSk7CglvdXRzaG9y dChzKTsKCW91dGxvbmcobCk7Cglqb3VybmFsbigxLCBsKTsKCW91dHNlbmQoKTsKfQoKdm9pZApv dXRUc3YoSG1lc2cgdHlwZSwgaW50IHMsIFBvc24gbCkKewoJb3V0c3RhcnQodHlwZSk7CglvdXRz aG9ydChzKTsKCW91dHZsb25nKCh2b2lkKilsKTsKCWpvdXJuYWxuKDEsIGwpOwoJb3V0c2VuZCgp Owp9Cgp2b2lkCm91dHN0YXJ0KEhtZXNnIHR5cGUpCnsKCWpvdXJuYWwoMSwgaG5hbWVbdHlwZV0p OwoJb3V0bXNnWzBdID0gdHlwZTsKCW91dHAgPSBvdXRtc2crMzsKfQoKdm9pZApvdXRjb3B5KGlu dCBjb3VudCwgdm9pZCAqZGF0YSkKewoJbWVtbW92ZShvdXRwLCBkYXRhLCBjb3VudCk7CglvdXRw ICs9IGNvdW50Owp9Cgp2b2lkCm91dHNob3J0KGludCBzKQp7Cgkqb3V0cCsrID0gczsKCSpvdXRw KysgPSBzPj44OyAKfQoKdm9pZApvdXRsb25nKGxvbmcgbCkKewoJKm91dHArKyA9IGw7Cgkqb3V0 cCsrID0gbD4+ODsKCSpvdXRwKysgPSBsPj4xNjsKCSpvdXRwKysgPSBsPj4yNDsKfQoKdm9pZApv dXR2bG9uZyh2b2lkICp2KQp7CglpbnQgaTsKCXVsb25nIGw7CgoJbCA9ICh1bG9uZykgdjsKCWZv cihpID0gMDsgaSA8IDg7IGkrKywgbCA+Pj0gOCkKCQkqb3V0cCsrID0gbDsKfQoKdm9pZApvdXRz ZW5kKHZvaWQpCnsKCWludCBvdXRjb3VudDsKCglvdXRjb3VudCA9IG91dHAtb3V0bXNnOwoJb3V0 Y291bnQgLT0gMzsKCW91dG1zZ1sxXSA9IG91dGNvdW50OwoJb3V0bXNnWzJdID0gb3V0Y291bnQ+ Pjg7CglvdXRtc2cgPSBvdXRwOwoJaWYoIW5vZmx1c2gpewoJCW91dGNvdW50ID0gb3V0bXNnLW91 dGRhdGE7CgkJaWYgKHdyaXRlKDEsIChjaGFyKikgb3V0ZGF0YSwgb3V0Y291bnQpICE9IG91dGNv dW50KQoJCQlyZXNjdWUoKTsKCQlvdXRtc2cgPSBvdXRkYXRhOwoJCXJldHVybjsKCX0KCWlmKG91 dG1zZyA8IG91dGRhdGErREFUQVNJWkUpCgkJcmV0dXJuOwoJb3V0Zmx1c2goKTsKfQoKdm9pZApv dXRmbHVzaCh2b2lkKQp7CglpZihvdXRtc2cgPT0gb3V0ZGF0YSkKCQlyZXR1cm47Cglub2ZsdXNo ID0gMDsKCW91dFQwKEhhY2spOwoJd2FpdGFjayA9IDE7CglkbwoJCWlmKHJjdigpID09IDApewoJ CQlyZXNjdWUoKTsKCQkJZXhpdHMoImVvZiIpOwoJCX0KCXdoaWxlKHdhaXRhY2spOwoJb3V0bXNn ID0gb3V0ZGF0YTsKCW5vZmx1c2ggPSAxOwp9CmR5ICovCgkJZi0+dGRvdCA9IGYtPmRvdC5yOwoJ CWJyZWFrOwoKCWNhc2UgVGNzYW0yay9zYW0vbWVzZy5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAMDEwMDY0NAAwMDAxNzM3ADAwMDAxNTEAMDAwMDAwMDYyMDUAMDcxMTE2MzU2NjYAMDAxNDY2 MgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwc2No d2FydHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAADAwMDAwNDAAMDAwMDAyNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAC8qIFZFUlNJT04gMSBpbnRyb2R1Y2VzIHBsdW1iaW5nCgkyIGluY3Jl YXNlcyBTTkFSRlNJWkUgZnJvbSA0MDk2IHRvIDMyMDAwCiAqLwojZGVmaW5lCVZFUlNJT04JMgoK I2RlZmluZQlUQkxPQ0tTSVpFIDUxMgkJICAvKiBsYXJnZXN0IHBpZWNlIG9mIHRleHQgc2VudCB0 byB0ZXJtaW5hbCAqLwojZGVmaW5lCURBVEFTSVpFICAoVVRGbWF4KlRCTE9DS1NJWkUrMzApIC8q IC4uLiBpbmNsdWRpbmcgcHJvdG9jb2wgaGVhZGVyIHN0dWZmICovCiNkZWZpbmUJU05BUkZTSVpF IDMyMDAwCQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBleGNoYW5nZWQgc25hcmYgYnVmZmVyLCBtdXN0 IGZpdCBpbiAxNSBiaXRzICovCi8qCiAqIE1lc3NhZ2VzIG9yaWdpbmF0aW5nIGF0IHRoZSB0ZXJt aW5hbAogKi8KdHlwZWRlZiBlbnVtIFRtZXNnCnsKCVR2ZXJzaW9uLAkvKiB2ZXJzaW9uICovCglU c3RhcnRjbWRmaWxlLAkvKiB0ZXJtaW5hbCBqdXN0IG9wZW5lZCBjb21tYW5kIGZyYW1lICovCglU Y2hlY2ssCQkvKiBhc2sgaG9zdCB0byBwb2tlIHdpdGggSGNoZWNrICovCglUcmVxdWVzdCwJLyog cmVxdWVzdCBkYXRhIHRvIGZpbGwgYSBob2xlICovCglUb3JpZ2luLAkvKiBnaW1tZSBhbiBIb3Jp Z2luIG5lYXIgaGVyZSAqLwoJVHN0YXJ0ZmlsZSwJLyogdGVybWluYWwganVzdCBvcGVuZWQgYSBm aWxlJ3MgZnJhbWUgKi8KCVR3b3JrZmlsZSwJLyogc2V0IGZpbGUgdG8gd2hpY2ggY29tbWFuZHMg YXBwbHkgKi8KCVR0eXBlLAkJLyogYWRkIHNvbWUgY2hhcmFjdGVycywgYnV0IHRlcm1pbmFsIGFs cmVhZHkga25vd3MgKi8KCVRjdXQsCglUcGFzdGUsCglUc25hcmYsCglUc3RhcnRuZXdmaWxlLAkv KiB0ZXJtaW5hbCBqdXN0IG9wZW5lZCBhIG5ldyBmcmFtZSAqLwoJVHdyaXRlLAkJLyogd3JpdGUg ZmlsZSAqLwoJVGNsb3NlLAkJLyogdGVybWluYWwgcmVxdWVzdHMgZmlsZSBjbG9zZTsgY2hlY2sg bW9kLiBzdGF0dXMgKi8KCVRsb29rLAkJLyogc2VhcmNoIGZvciBsaXRlcmFsIGN1cnJlbnQgdGV4 dCAqLwoJVHNlYXJjaCwJLyogc2VhcmNoIGZvciBsYXN0IHJlZ3VsYXIgZXhwcmVzc2lvbiAqLwoJ VHNlbmQsCQkvKiBwcmV0ZW5kIGhlIHR5cGVkIHN0dWZmICovCglUZGNsaWNrLAkvKiBkb3VibGUg Y2xpY2sgKi8KCVRzdGFydHNuYXJmLAkvKiBpbml0aWF0ZSBzbmFyZiBidWZmZXIgZXhjaGFuZ2Ug Ki8KCVRzZXRzbmFyZiwJLyogcmVtZW1iZXIgc3RyaW5nIGluIHNuYXJmIGJ1ZmZlciAqLwoJVGFj aywJCS8qIGFja25vd2xlZGdlIEhhY2sgKi8KCVRleGl0LAkJLyogZXhpdCAqLwoJVHBsdW1iLAkJ Lyogc2VuZCBwbHVtYiBtZXNzYWdlICovCglUTUFYIAp9VG1lc2c7Ci8qCiAqIE1lc3NhZ2VzIG9y aWdpbmF0aW5nIGF0IHRoZSBob3N0CiAqLwp0eXBlZGVmIGVudW0gSG1lc2cKewoJSHZlcnNpb24s CS8qIHZlcnNpb24gKi8KCUhiaW5kbmFtZSwJLyogYXR0YWNoIG5hbWVbMF0gdG8gdGV4dCBpbiB0 ZXJtaW5hbCAqLwoJSGN1cnJlbnQsCS8qIG1ha2UgbmFtZWQgZmlsZSB0aGUgdHlwaW5nIGZpbGUg Ki8KCUhuZXduYW1lLAkvKiBjcmVhdGUgIiIgbmFtZSBpbiBtZW51ICovCglIbW92bmFtZSwJLyog bW92ZSBmaWxlIG5hbWUgaW4gbWVudSAqLwoJSGdyb3csCQkvKiBpbnNlcnQgc3BhY2UgaW4gcmFz cCAqLwoJSGNoZWNrMCwJLyogc2VlIGJlbG93ICovCglIY2hlY2ssCQkvKiBhc2sgdGVybWluYWwg dG8gY2hlY2sgd2hldGhlciBpdCBuZWVkcyBtb3JlIGRhdGEgKi8KCUh1bmxvY2ssCS8qIGNvbW1h bmQgaXMgZmluaXNoZWQ7IHVzZXIgY2FuIGRvIHRoaW5ncyAqLwoJSGRhdGEsCQkvKiBzdG9yZSB0 aGlzIGRhdGEgaW4gcHJldmlvdXNseSBhbGxvY2F0ZWQgc3BhY2UgKi8KCUhvcmlnaW4sCS8qIHNl dCBvcmlnaW4gb2YgZmlsZS9mcmFtZSBpbiB0ZXJtaW5hbCAqLwoJSHVubG9ja2ZpbGUsCS8qIHVu bG9jayBmaWxlIGluIHRlcm1pbmFsICovCglIc2V0ZG90LAkvKiBzZXQgZG90IGluIHRlcm1pbmFs ICovCglIZ3Jvd2RhdGEsCS8qIEhncm93ICsgSGRhdGEgZm9sZGVkIHRvZ2V0aGVyICovCglIbW92 ZXRvLAkvKiBzY3JvbGxpbmcsIGNvbnRleHQgc2VhcmNoLCBldGMuICovCglIY2xlYW4sCQkvKiBu YW1lZCBmaWxlIGlzIG5vdyAnY2xlYW4nICovCglIZGlydHksCQkvKiBuYW1lZCBmaWxlIGlzIG5v dyAnZGlydHknICovCglIY3V0LAkJLyogcmVtb3ZlIHNwYWNlIGZyb20gcmFzcCAqLwoJSHNldHBh dCwJLyogc2V0IHJlbWVtYmVyZWQgcmVndWxhciBleHByZXNzaW9uICovCglIZGVsbmFtZSwJLyog ZGVsZXRlIGZpbGUgbmFtZSBmcm9tIG1lbnUgKi8KCUhjbG9zZSwJCS8qIGNsb3NlIGZpbGUgYW5k IHJlbW92ZSBmcm9tIG1lbnUgKi8KCUhzZXRzbmFyZiwJLyogcmVtZW1iZXIgc3RyaW5nIGluIHNu YXJmIGJ1ZmZlciAqLwoJSHNuYXJmbGVuLAkvKiByZXBvcnQgbGVuZ3RoIG9mIGltcGxpY2l0IHNu YXJmICovCglIYWNrLAkJLyogcmVxdWVzdCBhY2tub3dsZWRnZW1lbnQgKi8KCUhleGl0LAoJSHBs dW1iLAkJLyogcmV0dXJuIHBsdW1iIG1lc3NhZ2UgdG8gdGVybWluYWwgKi8KCUhNQVggCn1IbWVz ZzsKdHlwZWRlZiBzdHJ1Y3QgSGVhZGVyewoJdWNoYXIJdHlwZTsJCS8qIG9uZSBvZiB0aGUgYWJv dmUgKi8KCXVjaGFyCWNvdW50MDsJCS8qIGxvdyBiaXRzIG9mIGRhdGEgc2l6ZSAqLwoJdWNoYXIJ Y291bnQxOwkJLyogaGlnaCBiaXRzIG9mIGRhdGEgc2l6ZSAqLwoJdWNoYXIJZGF0YVsxXTsJLyog dmFyaWFibGUgc2l6ZSAqLwp9SGVhZGVyOwovKgogKiBGaWxlIHRyYW5zZmVyIHByb3RvY29sIHNj aGVtYXRpYywgYSBsYSBIb2x6bWFubgogKgkKICoJcHJvYyBoCiAqCXsJcHZhciBuID0gMDsKICoJ CXF1ZXVlIGhbNF07CiAqCQogKgkJZG8KICoJCTo6IChuIDwgIE4pICAtPiBuKys7IHQhSGdyb3cK ICoJCTo6IChuID09IE4pICAtPiBuKys7IHQhSGNoZWNrMAogKgkJOjogaD9UcmVxdWVzdCAtPiB0 IUhkYXRhCiAqCQk6OiBoP1RjaGVjayAgLT4gdCFIY2hlY2sKICoJCW9kCiAqCX0KICoJcHJvYyB0 CiAqCXsJcXVldWUgdFs0XTsKICoJCWRvCiAqCQk6OiB0P0hncm93IC0+IGghVHJlcXVlc3QKICoJ CTo6IHQ/SGRhdGEgLT4gc2tpcAogKgkJOjogdD9IY2hlY2swIC0+IGghVGNoZWNrCiAqCQk6OiB0 P0hjaGVjayAtPgogKgkJCWlmCiAqCQkJOjogYnJlYWsKICoJCQk6OiBoIVRyZXF1ZXN0OyBoIVRj aGVjawogKgkJCWZpCiAqCQlvZAogKgl9CiAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAc2FtMmsvc2FtL21vdmV0by5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2 NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDA1MjMwADA3MTExNjIyMTA1ADAwMTUyMTAAMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAw MDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAjaW5jbHVkZSAic2FtLmgiCgp2b2lkCm1vdmV0byhGaWxlICpmLCBSYW5nZSByKQp7 CglQb3NuIHAxID0gci5wMSwgcDIgPSByLnAyOwoKCWYtPmRvdC5yLnAxID0gcDE7CglmLT5kb3Qu ci5wMiA9IHAyOwoJaWYoZi0+cmFzcCl7CgkJdGVsbGRvdChmKTsKCQlvdXRUc2woSG1vdmV0bywg Zi0+dGFnLCBmLT5kb3Quci5wMSk7Cgl9Cn0KCnZvaWQKdGVsbGRvdChGaWxlICpmKQp7CglpZihm LT5yYXNwID09IDApCgkJcGFuaWMoInRlbGxkb3QiKTsKCWlmKGYtPmRvdC5yLnAxPT1mLT50ZG90 LnAxICYmIGYtPmRvdC5yLnAyPT1mLT50ZG90LnAyKQoJCXJldHVybjsKCW91dFRzbGwoSHNldGRv dCwgZi0+dGFnLCBmLT5kb3Quci5wMSwgZi0+ZG90LnIucDIpOwoJZi0+dGRvdCA9IGYtPmRvdC5y Owp9Cgp2b2lkCnRlbGxwYXQodm9pZCkKewoJb3V0VFMoSHNldHBhdCwgJmxhc3RwYXQpOwoJcGF0 c2V0ID0gRkFMU0U7Cn0KCiNkZWZpbmUJQ0hBUlNISUZUCTEyOAoKdm9pZApsb29rb3JpZ2luKEZp bGUgKmYsIFBvc24gcDAsIFBvc24gbHMpCnsKCWludCBubCwgbmMsIGM7CglQb3NuIHAsIG9sZHAw OwoKCWlmKHAwID4gZi0+VS5uYykKCQlwMCA9IGYtPlUubmM7CglvbGRwMCA9IHAwOwoJcCA9IHAw OwoJZm9yKG5sPW5jPWM9MDsgYyE9LTEgJiYgbmw8bHMgJiYgbmM8bHMqQ0hBUlNISUZUOyBuYysr KQoJCWlmKChjPWZpbGVyZWFkYyhmLCAtLXApKSA9PSAnXG4nKXsKCQkJbmwrKzsKCQkJb2xkcDAg PSBwMC1uYzsKCQl9CglpZihjID09IC0xKQoJCXAwID0gMDsKCWVsc2UgaWYobmw9PTApewoJCWlm KHAwPj1DSEFSU0hJRlQvMikKCQkJcDAtPUNIQVJTSElGVC8yOwoJCWVsc2UKCQkJcDAgPSAwOwoJ fWVsc2UKCQlwMCA9IG9sZHAwOwoJb3V0VHNsKEhvcmlnaW4sIGYtPnRhZywgcDApOwp9CgppbnQK YWxudW0oaW50IGMpCnsKCS8qCgkgKiBIYXJkIHRvIGdldCBhYnNvbHV0ZWx5IHJpZ2h0LiAgVXNl IHdoYXQgd2Uga25vdyBhYm91dCBBU0NJSQoJICogYW5kIGFzc3VtZSBhbnl0aGluZyBhYm92ZSB0 aGUgTGF0aW4gY29udHJvbCBjaGFyYWN0ZXJzIGlzCgkgKiBwb3RlbnRpYWxseSBhbiBhbHBoYW51 bWVyaWMuCgkgKi8KCWlmKGM8PScgJykKCQlyZXR1cm4gMDsKCWlmKDB4N0Y8PWMgJiYgYzw9MHhB MCkKCQlyZXR1cm4gMDsKCWlmKHV0ZnJ1bmUoIiFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5g e3x9fiIsIGMpKQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCmludApjbGlja21hdGNoKEZpbGUg KmYsIGludCBjbCwgaW50IGNyLCBpbnQgZGlyLCBQb3NuICpwKQp7CglpbnQgYzsKCWludCBuZXN0 ID0gMTsKCglmb3IoOzspewoJCWlmKGRpciA+IDApewoJCQlpZigqcCA+PSBmLT5VLm5jKQoJCQkJ YnJlYWs7CgkJCWMgPSBmaWxlcmVhZGMoZiwgKCpwKSsrKTsKCQl9ZWxzZXsKCQkJaWYoKnAgPT0g MCkKCQkJCWJyZWFrOwoJCQljID0gZmlsZXJlYWRjKGYsIC0tKCpwKSk7CgkJfQoJCWlmKGMgPT0g Y3IpewoJCQlpZigtLW5lc3Q9PTApCgkJCQlyZXR1cm4gMTsKCQl9ZWxzZSBpZihjID09IGNsKQoJ CQluZXN0Kys7Cgl9CglyZXR1cm4gY2w9PSdcbicgJiYgbmVzdD09MTsKfQoKUnVuZSoKc3RycnVu ZShSdW5lICpzLCBSdW5lIGMpCnsKCVJ1bmUgYzE7CgoJaWYoYyA9PSAwKSB7CgkJd2hpbGUoKnMr KykKCQkJOwoJCXJldHVybiBzLTE7Cgl9CgoJd2hpbGUoYzEgPSAqcysrKQoJCWlmKGMxID09IGMp CgkJCXJldHVybiBzLTE7CglyZXR1cm4gMDsKfQoKdm9pZApkb3VibGVjbGljayhGaWxlICpmLCBQ b3NuIHAxKQp7CglpbnQgYywgaTsKCVJ1bmUgKnIsICpsOwoJUG9zbiBwOwoKCWlmKHAxID4gZi0+ VS5uYykKCQlyZXR1cm47CglmLT5kb3Quci5wMSA9IGYtPmRvdC5yLnAyID0gcDE7Cglmb3IoaT0w OyBsZWZ0W2ldOyBpKyspewoJCWwgPSBsZWZ0W2ldOwoJCXIgPSByaWdodFtpXTsKCQkvKiB0cnkg bGVmdCBtYXRjaCAqLwoJCXAgPSBwMTsKCQlpZihwMSA9PSAwKQoJCQljID0gJ1xuJzsKCQllbHNl CgkJCWMgPSBmaWxlcmVhZGMoZiwgcCAtIDEpOwoJCWlmKHN0cnJ1bmUobCwgYykpewoJCQlpZihj bGlja21hdGNoKGYsIGMsIHJbc3RycnVuZShsLCBjKS1sXSwgMSwgJnApKXsKCQkJCWYtPmRvdC5y LnAxID0gcDE7CgkJCQlmLT5kb3Quci5wMiA9IHAtKGMhPSdcbicpOwoJCQl9CgkJCXJldHVybjsK CQl9CgkJLyogdHJ5IHJpZ2h0IG1hdGNoICovCgkJcCA9IHAxOwoJCWlmKHAxID09IGYtPlUubmMp CgkJCWMgPSAnXG4nOwoJCWVsc2UKCQkJYyA9IGZpbGVyZWFkYyhmLCBwKTsKCQlpZihzdHJydW5l KHIsIGMpKXsKCQkJaWYoY2xpY2ttYXRjaChmLCBjLCBsW3N0cnJ1bmUociwgYyktcl0sIC0xLCAm cCkpewoJCQkJZi0+ZG90LnIucDEgPSBwOwoJCQkJaWYoYyE9J1xuJyB8fCBwIT0wIHx8IGZpbGVy ZWFkYyhmLCAwKT09J1xuJykKCQkJCQlmLT5kb3Quci5wMSsrOwoJCQkJZi0+ZG90LnIucDIgPSBw MSsocDE8Zi0+VS5uYyAmJiBjPT0nXG4nKTsKCQkJfQoJCQlyZXR1cm47CgkJfQoJfQoJLyogdHJ5 IGZpbGxpbmcgb3V0IHdvcmQgdG8gcmlnaHQgKi8KCXAgPSBwMTsKCXdoaWxlKHAgPCBmLT5VLm5j ICYmIGFsbnVtKGZpbGVyZWFkYyhmLCBwKyspKSkKCQlmLT5kb3Quci5wMisrOwoJLyogdHJ5IGZp bGxpbmcgb3V0IHdvcmQgdG8gbGVmdCAqLwoJcCA9IHAxOwoJd2hpbGUoLS1wID49IDAgJiYgYWxu dW0oZmlsZXJlYWRjKGYsIHApKSkKCQlmLT5kb3Quci5wMS0tOwp9CgoAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AABzYW0yay9zYW0vbXVsdGkuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAx NzM3ADAwMDAxNTEAMDAwMDAwMDM0NjYAMDcxMTE2MjIxMDUAMDAxNTA0MgAwAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAw MDAyNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ACNpbmNsdWRlICJzYW0uaCIKCkxpc3QJZmlsZTsKdXNob3J0CXRhZzsKCkZpbGUgKgpuZXdmaWxl KHZvaWQpCnsKCUZpbGUgKmY7CgoJZiA9IGZpbGVvcGVuKCk7CglpbnNsaXN0KCZmaWxlLCAwLCAo bG9uZylmKTsKCWYtPnRhZyA9IHRhZysrOwoJaWYoZG93bmxvYWRlZCkKCQlvdXRUcyhIbmV3bmFt ZSwgZi0+dGFnKTsKCS8qIGFscmVhZHkgc29ydGVkOyBmaWxlIG5hbWUgaXMgIiIgKi8KCXJldHVy biBmOwp9CgppbnQKd2hpY2htZW51KEZpbGUgKmYpCnsKCWludCBpOwoKCWZvcihpPTA7IGk8Zmls ZS5udXNlZDsgaSsrKQoJCWlmKGZpbGUuZmlsZXBwdHJbaV09PWYpCgkJCXJldHVybiBpOwoJcmV0 dXJuIC0xOwp9Cgp2b2lkCmRlbGZpbGUoRmlsZSAqZikKewoJaW50IHcgPSB3aGljaG1lbnUoZik7 CgoJaWYodyA8IDApCS8qIGUuZy4geC8uL0QgKi8KCQlyZXR1cm47CglpZihkb3dubG9hZGVkKQoJ CW91dFRzKEhkZWxuYW1lLCBmLT50YWcpOwoJZGVsbGlzdCgmZmlsZSwgdyk7CglmaWxlY2xvc2Uo Zik7Cn0KCnZvaWQKZnVsbG5hbWUoU3RyaW5nICpuYW1lKQp7CglpZihuYW1lLT5uID4gMCAmJiBu YW1lLT5zWzBdIT0nLycgJiYgbmFtZS0+c1swXSE9MCkKCQlTdHJpbnNlcnQobmFtZSwgJmN1cndk LCAoUG9zbikwKTsKfQoKdm9pZApmaXhuYW1lKFN0cmluZyAqbmFtZSkKewoJU3RyaW5nICp0OwoJ Y2hhciAqczsKCglmdWxsbmFtZShuYW1lKTsKCXMgPSBTdHJ0b2MobmFtZSk7CglpZihzdHJsZW4o cykgPiAwKQoJCXMgPSBjbGVhbm5hbWUocyk7Cgl0ID0gdG1wY3N0cihzKTsKCVN0cmR1cGxzdHIo bmFtZSwgdCk7CglmcmVlKHMpOwoJZnJlZXRtcHN0cih0KTsKCglpZihTdHJpc3ByZSgmY3Vyd2Qs IG5hbWUpKQoJCVN0cmRlbGV0ZShuYW1lLCAwLCBjdXJ3ZC5uKTsKfQoKdm9pZApzb3J0bmFtZShG aWxlICpmKQp7CglpbnQgaSwgY21wLCB3OwoJaW50IGR1cHdhcm5lZDsKCgl3ID0gd2hpY2htZW51 KGYpOwoJZHVwd2FybmVkID0gRkFMU0U7CglkZWxsaXN0KCZmaWxlLCB3KTsKCWlmKGYgPT0gY21k KQoJCWkgPSAwOwoJZWxzZXsKCQlmb3IoaT0wOyBpPGZpbGUubnVzZWQ7IGkrKyl7CgkJCWNtcCA9 IFN0cmNtcCgmZi0+bmFtZSwgJmZpbGUuZmlsZXBwdHJbaV0tPm5hbWUpOwoJCQlpZihjbXA9PTAg JiYgIWR1cHdhcm5lZCl7CgkJCQlkdXB3YXJuZWQgPSBUUlVFOwoJCQkJd2Fybl9TKFdkdXBuYW1l LCAmZi0+bmFtZSk7CgkJCX1lbHNlIGlmKGNtcDwwICYmIChpPjAgfHwgY21kPT0wKSkKCQkJCWJy ZWFrOwoJCX0KCX0KCWluc2xpc3QoJmZpbGUsIGksIChsb25nKWYpOwoJaWYoZG93bmxvYWRlZCkK CQlvdXRUc1MoSG1vdm5hbWUsIGYtPnRhZywgJmYtPm5hbWUpOwp9Cgp2b2lkCnN0YXRlKEZpbGUg KmYsIGludCBjbGVhbmRpcnR5KQp7CglpZihmID09IGNtZCkKCQlyZXR1cm47CglmLT51bnJlYWQg PSBGQUxTRTsKCWlmKGRvd25sb2FkZWQgJiYgd2hpY2htZW51KGYpPj0wKXsJLyogZWxzZSBmbGlz dCBvciBtZW51ICovCgkJaWYoZi0+bW9kICYmIGNsZWFuZGlydHkhPURpcnR5KQoJCQlvdXRUcyhI Y2xlYW4sIGYtPnRhZyk7CgkJZWxzZSBpZighZi0+bW9kICYmIGNsZWFuZGlydHk9PURpcnR5KQoJ CQlvdXRUcyhIZGlydHksIGYtPnRhZyk7Cgl9CglpZihjbGVhbmRpcnR5ID09IENsZWFuKQoJCWYt Pm1vZCA9IEZBTFNFOwoJZWxzZQoJCWYtPm1vZCA9IFRSVUU7Cn0KCkZpbGUgKgpsb29rZmlsZShT dHJpbmcgKnMpCnsKCWludCBpOwoKCWZvcihpPTA7IGk8ZmlsZS5udXNlZDsgaSsrKQoJCWlmKFN0 cmNtcCgmZmlsZS5maWxlcHB0cltpXS0+bmFtZSwgcykgPT0gMCkKCQkJcmV0dXJuIGZpbGUuZmls ZXBwdHJbaV07CglyZXR1cm4gMDsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2Ft Mmsvc2FtL3BhcnNlLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAw MDAwMTUxADAwMDAwMDAzNTY2ADA3MTExNjM1NzEwADAwMTUwMzYAMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0eXBl ZGVmIHN0cnVjdCBBZGRyIEFkZHI7CnR5cGVkZWYgc3RydWN0IENtZCBDbWQ7CnN0cnVjdCBBZGRy CnsKCWNoYXIJdHlwZTsJLyogIyAoY2hhciBhZGRyKSwgbCAobGluZSBhZGRyKSwgLyA/IC4gJCAr IC0gLCA7ICovCgl1bmlvbnsKCQlTdHJpbmcJKnJlOwoJCUFkZHIJKmFsZWZ0OwkJLyogbGVmdCBz aWRlIG9mICwgYW5kIDsgKi8KCX0gZzsKCVBvc24JbnVtOwoJQWRkcgkqbmV4dDsJCQkvKiBvciBy aWdodCBzaWRlIG9mICwgYW5kIDsgKi8KfTsKCiNkZWZpbmUJYXJlCWcucmUKI2RlZmluZQlsZWZ0 CWcuYWxlZnQKCnN0cnVjdCBDbWQKewoJQWRkcgkqYWRkcjsJCQkvKiBhZGRyZXNzIChyYW5nZSBv ZiB0ZXh0KSAqLwoJU3RyaW5nCSpyZTsJCQkvKiByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGUuZy4g J3gnICovCgl1bmlvbnsKCQlDbWQJKmNtZDsJCS8qIHRhcmdldCBvZiB4LCBnLCB7LCBldGMuICov CgkJU3RyaW5nCSp0ZXh0OwkJLyogdGV4dCBvZiBhLCBjLCBpOyByaHMgb2YgcyAqLwoJCUFkZHIJ KmFkZHI7CQkvKiBhZGRyZXNzIGZvciBtLCB0ICovCgl9IGc7CglDbWQJKm5leHQ7CQkJLyogcG9p bnRlciB0byBuZXh0IGVsZW1lbnQgaW4ge30gKi8KCXNob3J0CW51bTsKCXVzaG9ydAlmbGFnOwkJ CS8qIHdoYXRldmVyICovCgl1c2hvcnQJY21kYzsJCQkvKiBjb21tYW5kIGNoYXJhY3RlcjsgJ3gn IGV0Yy4gKi8KfTsKCiNkZWZpbmUJY2NtZAlnLmNtZAojZGVmaW5lCWN0ZXh0CWcudGV4dAojZGVm aW5lCWNhZGRyCWcuYWRkcgoKZXh0ZXJuIHN0cnVjdCBjbWR0YWJ7Cgl1c2hvcnQJY21kYzsJCS8q IGNvbW1hbmQgY2hhcmFjdGVyICovCgl1Y2hhcgl0ZXh0OwkJLyogdGFrZXMgYSB0ZXh0dWFsIGFy Z3VtZW50PyAqLwoJdWNoYXIJcmVnZXhwOwkJLyogdGFrZXMgYSByZWd1bGFyIGV4cHJlc3Npb24/ ICovCgl1Y2hhcglhZGRyOwkJLyogdGFrZXMgYW4gYWRkcmVzcyAobSBvciB0KT8gKi8KCXVjaGFy CWRlZmNtZDsJCS8qIGRlZmF1bHQgY29tbWFuZDsgMD09Pm5vbmUgKi8KCXVjaGFyCWRlZmFkZHI7 CS8qIGRlZmF1bHQgYWRkcmVzcyAqLwoJdWNoYXIJY291bnQ7CQkvKiB0YWtlcyBhIGNvdW50IGUu Zy4gczIvLy8gKi8KCWNoYXIJKnRva2VuOwkJLyogdGFrZXMgdGV4dCB0ZXJtaW5hdGVkIGJ5IG9u ZSBvZiB0aGVzZSAqLwoJaW50CSgqZm4pKEZpbGUqLCBDbWQqKTsJLyogZnVuY3Rpb24gdG8gY2Fs bCB3aXRoIHBhcnNlIHRyZWUgKi8KfWNtZHRhYltdOwoKZW51bSBEZWZhZGRyewkvKiBkZWZhdWx0 IGFkZHJlc3NlcyAqLwoJYU5vLAoJYURvdCwKCWFBbGwgCn07CgppbnQJbmxfY21kKEZpbGUqLCBD bWQqKSwgYV9jbWQoRmlsZSosIENtZCopLCBiX2NtZChGaWxlKiwgQ21kKik7CmludAljX2NtZChG aWxlKiwgQ21kKiksIGNkX2NtZChGaWxlKiwgQ21kKiksIGRfY21kKEZpbGUqLCBDbWQqKTsKaW50 CURfY21kKEZpbGUqLCBDbWQqKSwgZV9jbWQoRmlsZSosIENtZCopOwppbnQJZl9jbWQoRmlsZSos IENtZCopLCBnX2NtZChGaWxlKiwgQ21kKiksIGlfY21kKEZpbGUqLCBDbWQqKTsKaW50CWtfY21k KEZpbGUqLCBDbWQqKSwgbV9jbWQoRmlsZSosIENtZCopLCBuX2NtZChGaWxlKiwgQ21kKik7Cmlu dAlwX2NtZChGaWxlKiwgQ21kKiksIHFfY21kKEZpbGUqLCBDbWQqKTsKaW50CXNfY21kKEZpbGUq LCBDbWQqKSwgdV9jbWQoRmlsZSosIENtZCopLCB3X2NtZChGaWxlKiwgQ21kKik7CmludAl4X2Nt ZChGaWxlKiwgQ21kKiksIFhfY21kKEZpbGUqLCBDbWQqKSwgcGxhbjlfY21kKEZpbGUqLCBDbWQq KTsKaW50CWVxX2NtZChGaWxlKiwgQ21kKik7CgoKU3RyaW5nCSpnZXRyZWdleHAoaW50KTsKQWRk cgkqbmV3YWRkcih2b2lkKTsKQWRkcmVzcwlhZGRyZXNzKEFkZHIqLCBBZGRyZXNzLCBpbnQpOwpp bnQJY21kZXhlYyhGaWxlKiwgQ21kKik7CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNhbTJrL3Nh bS9wbGFuOS5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3MzcAMDAwMDE1 MQAwMDAwMDAwNTEzNwAwNzExMTYyMzI0MQAwMDE0NzMyADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAwMDI3AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI2luY2x1ZGUg InNhbS5oIgoKUnVuZQlzYW1uYW1lW10gPSBMIn5+c2Ftfn4iOwoKUnVuZSAqbGVmdFtdPSB7CglM IntbKDzCqyIsCglMIlxuIiwKCUwiJ1wiYCIsCgkwCn07ClJ1bmUgKnJpZ2h0W109IHsKCUwifV0p PsK7IiwKCUwiXG4iLAoJTCInXCJgIiwKCTAKfTsKCmNoYXIJUlNBTVtdID0gInNhbSI7CmNoYXIJ U0FNVEVSTVtdID0gIi9iaW4vYXV4L3NhbXRlcm0iOwpjaGFyCUhPTUVbXSA9ICJob21lIjsKY2hh cglUTVBESVJbXSA9ICIvdG1wIjsKY2hhcglTSFtdID0gInJjIjsKY2hhcglTSFBBVEhbXSA9ICIv YmluL3JjIjsKY2hhcglSWFtdID0gInJ4IjsKY2hhcglSWFBBVEhbXSA9ICIvYmluL3J4IjsKY2hh cglTQU1TQVZFQ01EW10gPSAiL2Jpbi9yY1xuL3N5cy9saWIvc2Ftc2F2ZSI7Cgp2b2lkCmRwcmlu dChjaGFyICp6LCAuLi4pCnsKCWNoYXIgYnVmW0JMT0NLU0laRV07Cgl2YV9saXN0IGFyZzsKCgl2 YV9zdGFydChhcmcsIHopOwoJZG9wcmludChidWYsICZidWZbQkxPQ0tTSVpFXSwgeiwgYXJnKTsK CXZhX2VuZChhcmcpOwoJdGVybXdyaXRlKGJ1Zik7Cn0KCnZvaWQKcHJpbnRfc3MoY2hhciAqcywg U3RyaW5nICphLCBTdHJpbmcgKmIpCnsKCWRwcmludCgiP3dhcm5pbmc6ICVzOiBgJS4qUycgYW5k IGAlLipTJ1xuIiwgcywgYS0+biwgYS0+cywgYi0+biwgYi0+cyk7Cn0KCnZvaWQKcHJpbnRfcyhj aGFyICpzLCBTdHJpbmcgKmEpCnsKCWRwcmludCgiP3dhcm5pbmc6ICVzIGAlLipTJ1xuIiwgcywg YS0+biwgYS0+cyk7Cn0KCmNoYXIqCmdldHVzZXIodm9pZCkKewoJc3RhdGljIGNoYXIgdXNlcltO QU1FTEVOXTsKCWludCBmZDsKCglpZih1c2VyWzBdID09IDApewoJCWZkID0gb3BlbigiL2Rldi91 c2VyIiwgMCk7CgkJaWYoZmQ8MCB8fCByZWFkKGZkLCB1c2VyLCBzaXplb2YgdXNlcik8PTApCgkJ CXN0cmNweSh1c2VyLCAibm9uZSIpOwoJCWNsb3NlKGZkKTsKCX0KCXJldHVybiB1c2VyOwp9Cgpp bnQKc3RhdGZpbGUoY2hhciAqbmFtZSwgdWxvbmcgKmRldiwgdWxvbmcgKmlkLCBsb25nICp0aW1l LCBsb25nICpsZW5ndGgsIGxvbmcgKmFwcGVuZG9ubHkpCnsKCURpciBkaXJiOwoKCWlmKGRpcnN0 YXQobmFtZSwgJmRpcmIpID09IC0xKQoJCXJldHVybiAtMTsKCWlmKGRldikKCQkqZGV2ID0gZGly Yi50eXBlfChkaXJiLmRldjw8MTYpOwoJaWYoaWQpCgkJKmlkID0gZGlyYi5xaWQucGF0aDsKCWlm KHRpbWUpCgkJKnRpbWUgPSBkaXJiLm10aW1lOwoJaWYobGVuZ3RoKQoJCSpsZW5ndGggPSBkaXJi Lmxlbmd0aDsKCWlmKGFwcGVuZG9ubHkpCgkJKmFwcGVuZG9ubHkgPSBkaXJiLm1vZGUgJiBDSEFQ UEVORDsKCXJldHVybiAxOwp9CgppbnQKc3RhdGZkKGludCBmZCwgdWxvbmcgKmRldiwgdWxvbmcg KmlkLCBsb25nICp0aW1lLCBsb25nICpsZW5ndGgsIGxvbmcgKmFwcGVuZG9ubHkpCnsKCURpciBk aXJiOwoKCWlmKGRpcmZzdGF0KGZkLCAmZGlyYikgPT0gLTEpCgkJcmV0dXJuIC0xOwoJaWYoZGV2 KQoJCSpkZXYgPSBkaXJiLnR5cGV8KGRpcmIuZGV2PDwxNik7CglpZihpZCkKCQkqaWQgPSBkaXJi LnFpZC5wYXRoOwoJaWYodGltZSkKCQkqdGltZSA9IGRpcmIubXRpbWU7CglpZihsZW5ndGgpCgkJ Kmxlbmd0aCA9IGRpcmIubGVuZ3RoOwoJaWYoYXBwZW5kb25seSkKCQkqYXBwZW5kb25seSA9IGRp cmIubW9kZSAmIENIQVBQRU5EOwoJcmV0dXJuIDE7Cn0KCnZvaWQKbm90aWZ5Zih2b2lkICphLCBj aGFyICpzKQp7CglVU0VEKGEpOwoJaWYoYnBpcGVvayAmJiBzdHJjbXAocywgInN5czogd3JpdGUg b24gY2xvc2VkIHBpcGUiKSA9PSAwKQoJCW5vdGVkKE5DT05UKTsKCWlmKHN0cmNtcChzLCAiaW50 ZXJydXB0IikgPT0gMCkKCQlub3RlZChOQ09OVCk7CglwYW5pY2tpbmcgPSAxOwoJcmVzY3VlKCk7 Cglub3RlZChOREZMVCk7Cn0KCmludApuZXd0bXAoaW50IG51bSkKewoJaW50IGksIGZkOwoJc3Rh dGljIGNoYXIJdGVtcG5hbVszMF07CgoJaSA9IGdldHBpZCgpOwoJZG8KCQlzcHJpbnQodGVtcG5h bSwgIiVzLyVkJS40cyVkc2FtIiwgVE1QRElSLCBudW0sIGdldHVzZXIoKSwgaSsrKTsKCXdoaWxl KGFjY2Vzcyh0ZW1wbmFtLCAwKSA9PSAwKTsKCWZkID0gY3JlYXRlKHRlbXBuYW0sIE9SRFdSfE9D RVhFQ3xPUkNMT1NFLCAwMDAwKTsKCWlmKGZkIDwgMCl7CgkJcmVtb3ZlKHRlbXBuYW0pOwoJCWZk ID0gY3JlYXRlKHRlbXBuYW0sIE9SRFdSfE9DRVhFQ3xPUkNMT1NFLCAwMDAwKTsKCX0KCXJldHVy biBmZDsKfQoKaW50CndhaXRmb3IoaW50IHBpZCkKewoJaW50IHJwaWQ7CglXYWl0bXNnIHdtOwoK CWRvOyB3aGlsZSgocnBpZCA9IHdhaXQoJndtKSkgIT0gcGlkICYmIHJwaWQgIT0gLTEpOwoJcmV0 dXJuIHdtLm1zZ1swXTsKfQoKdm9pZApzYW1lcnIoY2hhciAqYnVmKQp7CglzcHJpbnQoYnVmLCAi JXMvc2FtLmVyciIsIFRNUERJUik7Cn0KCnZvaWQqCmVtYWxsb2ModWxvbmcgbikKewoJdm9pZCAq cDsKCglwID0gbWFsbG9jKG4pOwoJaWYocCA9PSAwKQoJCXBhbmljKCJtYWxsb2MgZmFpbHMiKTsK CW1lbXNldChwLCAwLCBuKTsKCXJldHVybiBwOwp9Cgp2b2lkKgplcmVhbGxvYyh2b2lkICpwLCB1 bG9uZyBuKQp7CglwID0gcmVhbGxvYyhwLCBuKTsKCWlmKHAgPT0gMCkKCQlwYW5pYygicmVhbGxv YyBmYWlscyIpOwoJcmV0dXJuIHA7Cn0KdHVybiAtMTsKCWlmKGRldikKCQkqZGV2ID0gZGlyYi50 eXBlfChkaXJiLmRldjw8MTYpOwoJaWYoaWQpCgkJKmlkID0gZGlyYi5xaWQucGF0aDsKCWlmKHRp bWUpCgkJKnRpbWUgPSBkaXJiLm10aW1lOwoJaWYobGVuZ3RoKQoJCSpsZW5ndGggPSBkaXJiLmxl bmd0aDsKCWlmKGFwcGVuZG9ubHkpCgkJKmFwcGVuZG9ubHkgPSBkaXJiLm1vZGUgJiBDSEFQUEVO RDsKCXJldHVybiAxOwp9CgppbnQKc3RhdGZkKGludCBmZCwgdWxvbmcgKmRldiwgdWxvbmcgKmlk LCBsb25nICp0aW1lLCBsb25nICpsZW5ndGgsIGxvbmcgKmFwcGVuZG9ubHkpCnsKCURpciBkaXJi OwoKCWlmKGRpcmZzdGF0KGZkLCAmZGlyYikgPT0gLTEpCgkJcmV0dXJuIC0xOwoJaWYoZGV2KQoJ CSpkZXYgPSBkaXJiLnR5cGV8KGRpcmIuZGV2PDwxNik7CglpZihpZCkKc2FtMmsvc2FtL3Jhc3Au YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAw MDEzMDExADA3MTExNjM2MTI2ADAwMTQ2NTAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2Nz ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAic2FtLmgi Ci8qCiAqIEdST1dEQVRBU0laRSBtdXN0IGJlIGJpZyBlbm91Z2ggdGhhdCBhbGwgZXJyb3JzIGdv IG91dCBhcyBIZ3Jvd2RhdGEncywKICogc28gdGhleSB3aWxsIGJlIHNjcm9sbGVkIGludG8gdmlz aWJpbGl0eSBpbiB0aGUgfn5zYW1+fiB3aW5kb3cgKHl1Y2shKS4KICovCiNkZWZpbmUJR1JPV0RB VEFTSVpFCTUwCS8qIGlmIHNpemUgaXMgPiB0aGlzLCBzZW5kIGRhdGEgd2l0aCBncm93ICovCgp2 b2lkCXJjdXQoTGlzdCosIFBvc24sIFBvc24pOwppbnQJcnRlcm0oTGlzdCosIFBvc24pOwp2b2lk CXJncm93KExpc3QqLCBQb3NuLCBQb3NuKTsKCnN0YXRpYwlQb3NuCWdyb3dwb3M7CnN0YXRpYwlQ b3NuCWdyb3duOwpzdGF0aWMJUG9zbglzaHJpbmtwb3M7CnN0YXRpYwlQb3NuCXNocnVuazsKCi8q CiAqIHJhc3Agcm91dGluZXMgaW5mb3JtIHRoZSB0ZXJtaW5hbCBvZiBjaGFuZ2VzIHRvIHRoZSBm aWxlLgogKgogKiBhIHJhc3AgaXMgYSBsaXN0IG9mIHNwYW5zIHdpdGhpbiB0aGUgZmlsZSwgYW5k IGFuIGluZGljYXRpb24KICogb2Ygd2hldGhlciB0aGUgdGVybWluYWwga25vd3MgYWJvdXQgdGhl IHNwYW4uCiAqCiAqIG9wdGltaXplIGJ5IGNvYWxlc2NpbmcgbXVsdGlwbGUgdXBkYXRlcyB0byB0 aGUgc2FtZSBzcGFuCiAqIGlmIGl0IGlzIG5vdCBrbm93biBieSB0aGUgdGVybWluYWwuCiAqCiAq IG90aGVyIHBvc3NpYmxlIG9wdGltaXphdGlvbnM6IGZsdXNoIHRlcm1pbmFsJ3MgcmFzcCBieSBj dXQgZXZlcnl0aGluZywKICogaW5zZXJ0IGV2ZXJ5dGhpbmcgaWYgcmFzcCBnZXRzIHRvbyBsYXJn ZS4KICovCgovKgogKiBvbmx5IGNhbGxlZCBmb3IgaW5pdGlhbCBsb2FkIG9mIGZpbGUKICovCnZv aWQKcmFzcGxvYWQoRmlsZSAqZikKewoJaWYoZi0+cmFzcCA9PSBuaWwpCgkJcmV0dXJuOwoJZ3Jv d24gPSBmLT5VLm5jOwoJZ3Jvd3BvcyA9IDA7CglpZihmLT5VLm5jKQoJCXJncm93KGYtPnJhc3As IDAsIGYtPlUubmMpOwoJcmFzcGRvbmUoZiwgMSk7Cn0KCnZvaWQKcmFzcHN0YXJ0KEZpbGUgKmYp CnsKCWlmKGYtPnJhc3AgPT0gbmlsKQoJCXJldHVybjsKCWdyb3duID0gMDsKCXNocnVuayA9IDA7 Cglub2ZsdXNoID0gMTsKfQoKdm9pZApyYXNwZG9uZShGaWxlICpmLCBpbnQgdG90ZXJtKQp7Cglp ZihmLT5kb3Quci5wMSA+IGYtPlUubmMpCgkJZi0+ZG90LnIucDEgPSBmLT5VLm5jOwoJaWYoZi0+ ZG90LnIucDIgPiBmLT5VLm5jKQoJCWYtPmRvdC5yLnAyID0gZi0+VS5uYzsKCWlmKGYtPm1hcmsu cDEgPiBmLT5VLm5jKQoJCWYtPm1hcmsucDEgPSBmLT5VLm5jOwoJaWYoZi0+bWFyay5wMiA+IGYt PlUubmMpCgkJZi0+bWFyay5wMiA9IGYtPlUubmM7CglpZihmLT5yYXNwID09IG5pbCkKCQlyZXR1 cm47CglpZihncm93bikKCQlvdXRUc2xsKEhncm93LCBmLT50YWcsIGdyb3dwb3MsIGdyb3duKTsK CWVsc2UgaWYoc2hydW5rKQoJCW91dFRzbGwoSGN1dCwgZi0+dGFnLCBzaHJpbmtwb3MsIHNocnVu ayk7CglpZih0b3Rlcm0pCgkJb3V0VHMoSGNoZWNrMCwgZi0+dGFnKTsKCW91dGZsdXNoKCk7Cglu b2ZsdXNoID0gMDsKCWlmKGYgPT0gY21kKXsKCQljbWRwdCArPSBjbWRwdGFkdjsKCQljbWRwdGFk diA9IDA7Cgl9Cn0KCnZvaWQKcmFzcGRlbGV0ZShGaWxlICpmLCB1aW50IHAxLCB1aW50IHAyLCBp bnQgdG90ZXJtKQp7Cglsb25nIG47CgoJbiA9IHAyIC0gcDE7CglpZihuID09IDApCgkJcmV0dXJu OwoKCWlmKHAyIDw9IGYtPmRvdC5yLnAxKXsKCQlmLT5kb3Quci5wMSAtPSBuOwoJCWYtPmRvdC5y LnAyIC09IG47Cgl9CglpZihwMiA8PSBmLT5tYXJrLnAxKXsKCQlmLT5tYXJrLnAxIC09IG47CgkJ Zi0+bWFyay5wMiAtPSBuOwoJfQoKCWlmKGYtPnJhc3AgPT0gbmlsKQoJCXJldHVybjsKCglpZihm PT1jbWQgJiYgcDE8Y21kcHQpewoJCWlmKHAyIDw9IGNtZHB0KQoJCQljbWRwdCAtPSBuOwoJCWVs c2UKCQkJY21kcHQgPSBwMTsKCX0KCWlmKHRvdGVybSl7CgkJaWYoZ3Jvd24pewoJCQlvdXRUc2xs KEhncm93LCBmLT50YWcsIGdyb3dwb3MsIGdyb3duKTsKCQkJZ3Jvd24gPSAwOwoJCX1lbHNlIGlm KHNocnVuayAmJiBzaHJpbmtwb3MhPXAxICYmIHNocmlua3BvcyE9cDIpewoJCQlvdXRUc2xsKEhj dXQsIGYtPnRhZywgc2hyaW5rcG9zLCBzaHJ1bmspOwoJCQlzaHJ1bmsgPSAwOwoJCX0KCQlpZigh c2hydW5rIHx8IHNocmlua3Bvcz09cDIpCgkJCXNocmlua3BvcyA9IHAxOwoJCXNocnVuayArPSBu OwoJfQoJcmN1dChmLT5yYXNwLCBwMSwgcDIpOwp9Cgp2b2lkCnJhc3BpbnNlcnQoRmlsZSAqZiwg dWludCBwMSwgUnVuZSAqYnVmLCB1aW50IG4sIGludCB0b3Rlcm0pCnsKCVJhbmdlIHI7CgoJaWYo biA9PSAwKQoJCXJldHVybjsKCglpZihwMSA8IGYtPmRvdC5yLnAxKXsKCQlmLT5kb3Quci5wMSAr PSBuOwoJCWYtPmRvdC5yLnAyICs9IG47Cgl9CglpZihwMSA8IGYtPm1hcmsucDEpewoJCWYtPm1h cmsucDEgKz0gbjsKCQlmLT5tYXJrLnAyICs9IG47Cgl9CgoKCWlmKGYtPnJhc3AgPT0gbmlsKQoJ CXJldHVybjsKCWlmKGY9PWNtZCAmJiBwMTxjbWRwdCkKCQljbWRwdCArPSBuOwoJaWYodG90ZXJt KXsKCQlpZihzaHJ1bmspewoJCQlvdXRUc2xsKEhjdXQsIGYtPnRhZywgc2hyaW5rcG9zLCBzaHJ1 bmspOwoJCQlzaHJ1bmsgPSAwOwoJCX0KCQlpZihuPkdST1dEQVRBU0laRSB8fCAhcnRlcm0oZi0+ cmFzcCwgcDEpKXsKCQkJcmdyb3coZi0+cmFzcCwgcDEsIG4pOwoJCQlpZihncm93biAmJiBncm93 cG9zK2dyb3duIT1wMSAmJiBncm93cG9zIT1wMSl7CgkJCQlvdXRUc2xsKEhncm93LCBmLT50YWcs IGdyb3dwb3MsIGdyb3duKTsKCQkJCWdyb3duID0gMDsKCQkJfQoJCQlpZighZ3Jvd24pCgkJCQln cm93cG9zID0gcDE7CgkJCWdyb3duICs9IG47CgkJfWVsc2V7CgkJCWlmKGdyb3duKXsKCQkJCW91 dFRzbGwoSGdyb3csIGYtPnRhZywgZ3Jvd3BvcywgZ3Jvd24pOwoJCQkJZ3Jvd24gPSAwOwoJCQl9 CgkJCXJncm93KGYtPnJhc3AsIHAxLCBuKTsKCQkJciA9IHJkYXRhKGYtPnJhc3AsIHAxLCBuKTsK CQkJaWYoci5wMSE9cDEgfHwgci5wMiE9cDErbikKCQkJCXBhbmljKCJyZGF0YSBpbiB0b3Rlcm1p bmFsIik7CgkJCW91dFRzbGxTKEhncm93ZGF0YSwgZi0+dGFnLCBwMSwgbiwgdG1wcnN0cihidWYs IG4pKTsKCQl9Cgl9ZWxzZXsKCQlyZ3JvdyhmLT5yYXNwLCBwMSwgbik7CgkJciA9IHJkYXRhKGYt PnJhc3AsIHAxLCBuKTsKCQlpZihyLnAxIT1wMSB8fCByLnAyIT1wMStuKQoJCQlwYW5pYygicmRh dGEgaW4gdG90ZXJtaW5hbCIpOwoJfQp9CgojZGVmaW5lCU0JMHg4MDAwMDAwMFVMCiNkZWZpbmUJ UChpKQlyLT5sb25ncHRyW2ldCiNkZWZpbmUJVChpKQkoUChpKSZNKQkvKiBpbiB0ZXJtaW5hbCAq LwojZGVmaW5lCUwoaSkJKFAoaSkmfk0pCS8qIGxlbmd0aCBvZiB0aGlzIHBpZWNlICovCgp2b2lk CnJjdXQoTGlzdCAqciwgUG9zbiBwMSwgUG9zbiBwMikKewoJUG9zbiBwLCB4OwoJaW50IGk7CgoJ aWYocDEgPT0gcDIpCgkJcGFuaWMoInJjdXQgMCIpOwoJZm9yKHA9MCxpPTA7IGk8ci0+bnVzZWQg JiYgcCtMKGkpPD1wMTsgcCs9TChpKyspKQoJCTsKCWlmKGkgPT0gci0+bnVzZWQpCgkJcGFuaWMo InJjdXQgMSIpOwoJaWYocCA8IHAxKXsJLyogY2hvcCB0aGlzIHBpZWNlICovCgkJaWYocCtMKGkp IDwgcDIpewoJCQl4ID0gcDEtcDsKCQkJcCArPSBMKGkpOwoJCX1lbHNlewoJCQl4ID0gTChpKS0o cDItcDEpOwoJCQlwID0gcDI7CgkJfQoJCWlmKFQoaSkpCgkJCVAoaSkgPSB4fE07CgkJZWxzZQoJ CQlQKGkpID0geDsKCQlpKys7Cgl9Cgl3aGlsZShpPHItPm51c2VkICYmIHArTChpKTw9cDIpewoJ CXAgKz0gTChpKTsKCQlkZWxsaXN0KHIsIGkpOwoJfQoJaWYocCA8IHAyKXsKCQlpZihpID09IHIt Pm51c2VkKQoJCQlwYW5pYygicmN1dCAyIik7CgkJeCA9IEwoaSktKHAyLXApOwoJCWlmKFQoaSkp CgkJCVAoaSkgPSB4fE07CgkJZWxzZQoJCQlQKGkpID0geDsKCX0KCS8qIGNhbiB3ZSBtZXJnZSBp IGFuZCBpLTEgPyAqLwoJaWYoaT4wICYmIGk8ci0+bnVzZWQgJiYgVChpLTEpPT1UKGkpKXsKCQl4 ID0gTChpLTEpK0woaSk7CgkJZGVsbGlzdChyLCBpLS0pOwoJCWlmKFQoaSkpCgkJCVAoaSk9eHxN OwoJCWVsc2UKCQkJUChpKT14OwoJfQp9Cgp2b2lkCnJncm93KExpc3QgKnIsIFBvc24gcDEsIFBv c24gbikKewoJUG9zbiBwOwoJaW50IGk7CgoJaWYobiA9PSAwKQoJCXBhbmljKCJyZ3JvdyAwIik7 Cglmb3IocD0wLGk9MDsgaTxyLT5udXNlZCAmJiBwK0woaSk8PXAxOyBwKz1MKGkrKykpCgkJOwoJ aWYoaSA9PSByLT5udXNlZCl7CS8qIHN0aWNrIG9uIGVuZCBvZiBmaWxlICovCgkJaWYocCE9cDEp CgkJCXBhbmljKCJyZ3JvdyAxIik7CgkJaWYoaT4wICYmICFUKGktMSkpCgkJCVAoaS0xKSs9bjsK CQllbHNlCgkJCWluc2xpc3QociwgaSwgbik7Cgl9ZWxzZSBpZighVChpKSkJCS8qIGdvZXMgaW4g dGhpcyBlbXB0eSBwaWVjZSAqLwoJCVAoaSkrPW47CgllbHNlIGlmKHA9PXAxICYmIGk+MCAmJiAh VChpLTEpKQkvKiBzcGVjaWFsIGNhc2U7IHNpbXBsaWZpZXMgbGlmZSAqLwoJCVAoaS0xKSs9bjsK CWVsc2UgaWYocD09cDEpCgkJaW5zbGlzdChyLCBpLCBuKTsKCWVsc2V7CQkJLyogbXVzdCBicmVh ayBwaWVjZSBpbiB0ZXJtaW5hbCAqLwoJCWluc2xpc3QociwgaSsxLCAoTChpKS0ocDEtcCkpfE0p OwoJCWluc2xpc3QociwgaSsxLCBuKTsKCQlQKGkpID0gKHAxLXApfE07Cgl9Cn0KCmludApydGVy bShMaXN0ICpyLCBQb3NuIHAxKQp7CglQb3NuIHA7CglpbnQgaTsKCglmb3IocCA9IDAsaSA9IDA7 IGk8ci0+bnVzZWQgJiYgcCtMKGkpPD1wMTsgcCs9TChpKyspKQoJCTsKCWlmKGk9PXItPm51c2Vk ICYmIChpPT0wIHx8ICFUKGktMSkpKQoJCXJldHVybiAwOwoJcmV0dXJuIFQoaSk7Cn0KClJhbmdl CnJkYXRhKExpc3QgKnIsIFBvc24gcDEsIFBvc24gbikKewoJUG9zbiBwOwoJaW50IGk7CglSYW5n ZSByZzsKCglpZihuPT0wKQoJCXBhbmljKCJyZGF0YSAwIik7Cglmb3IocCA9IDAsaSA9IDA7IGk8 ci0+bnVzZWQgJiYgcCtMKGkpPD1wMTsgcCs9TChpKyspKQoJCTsKCWlmKGk9PXItPm51c2VkKQoJ CXBhbmljKCJyZGF0YSAxIik7CglpZihUKGkpKXsKCQluLT1MKGkpLShwMS1wKTsKCQlpZihuPD0w KXsKCQkJcmcucDEgPSByZy5wMiA9IHAxOwoJCQlyZXR1cm4gcmc7CgkJfQoJCXArPUwoaSsrKTsK CQlwMSA9IHA7Cgl9CglpZihUKGkpIHx8IGk9PXItPm51c2VkKQoJCXBhbmljKCJyZGF0YSAyIik7 CglpZihwK0woaSk8cDErbikKCQluID0gTChpKS0ocDEtcCk7CglyZy5wMSA9IHAxOwoJcmcucDIg PSBwMStuOwoJaWYocCE9cDEpewoJCWluc2xpc3QociwgaSsxLCBMKGkpLShwMS1wKSk7CgkJUChp KT1wMS1wOwoJCWkrKzsKCX0KCWlmKEwoaSkhPW4pewoJCWluc2xpc3QociwgaSsxLCBMKGkpLW4p OwoJCVAoaSk9bjsKCX0KCVAoaSl8PU07CgkvKiBub3cgaSBpcyBzZXQ7IGNhbiB3ZSBtZXJnZT8g Ki8KCWlmKGk8ci0+bnVzZWQtMSAmJiBUKGkrMSkpewoJCVAoaSk9KG4rPUwoaSsxKSl8TTsKCQlk ZWxsaXN0KHIsIGkrMSk7Cgl9CglpZihpPjAgJiYgVChpLTEpKXsKCQlQKGkpPShuK0woaS0xKSl8 TTsKCQlkZWxsaXN0KHIsIGktMSk7Cgl9CglyZXR1cm4gcmc7Cn0KAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzYW0yay9zYW0vcmVnZXhwLmMAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAxNzM3ADAwMDAxNTEAMDAwMDAwMzYwNDIAMDcxMTE2 MjIxMDUAMDAxNTE3NgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAwMDAyNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNpbmNsdWRlICJzYW0uaCIKClJhbmdlc2V0CXNl bDsKU3RyaW5nCQlsYXN0cmVnZXhwOwovKgogKiBNYWNoaW5lIEluZm9ybWF0aW9uCiAqLwp0eXBl ZGVmIHN0cnVjdCBJbnN0IEluc3Q7CgpzdHJ1Y3QgSW5zdAp7Cglsb25nCXR5cGU7CS8qIDwgMHgx MDAwMCA9PT4gbGl0ZXJhbCwgb3RoZXJ3aXNlIGFjdGlvbiAqLwoJdW5pb24gewoJCWludCByc2lk OwoJCWludCByc3ViaWQ7CgkJaW50IGNsYXNzOwoJCXN0cnVjdCBJbnN0ICpyb3RoZXI7CgkJc3Ry dWN0IEluc3QgKnJyaWdodDsKCX0gcjsKCXVuaW9uewoJCXN0cnVjdCBJbnN0ICpsbGVmdDsKCQlz dHJ1Y3QgSW5zdCAqbG5leHQ7Cgl9IGw7Cn07CiNkZWZpbmUJc2lkCXIucnNpZAojZGVmaW5lCXN1 YmlkCXIucnN1YmlkCiNkZWZpbmUJcmNsYXNzCXIuY2xhc3MKI2RlZmluZQlvdGhlcglyLnJvdGhl cgojZGVmaW5lCXJpZ2h0CXIucnJpZ2h0CiNkZWZpbmUJbGVmdAlsLmxsZWZ0CiNkZWZpbmUJbmV4 dAlsLmxuZXh0CgojZGVmaW5lCU5QUk9HCTEwMjQKSW5zdAlwcm9ncmFtW05QUk9HXTsKSW5zdAkq cHJvZ3A7Ckluc3QJKnN0YXJ0aW5zdDsJLyogRmlyc3QgaW5zdC4gb2YgcHJvZ3JhbTsgbWlnaHQg bm90IGJlIHByb2dyYW1bMF0gKi8KSW5zdAkqYnN0YXJ0aW5zdDsJLyogc2FtZSBmb3IgYmFja3dh cmRzIG1hY2hpbmUgKi8KCnR5cGVkZWYgc3RydWN0IElsaXN0IElsaXN0OwpzdHJ1Y3QgSWxpc3QK ewoJSW5zdAkqaW5zdDsJCS8qIEluc3RydWN0aW9uIG9mIHRoZSB0aHJlYWQgKi8KCVJhbmdlc2V0 IHNlOwoJUG9zbglzdGFydHA7CQkvKiBmaXJzdCBjaGFyIG9mIG1hdGNoICovCn07CgojZGVmaW5l CU5MSVNUCTEyOAoKSWxpc3QJKnRsLCAqbmw7CS8qIFRoaXMgbGlzdCwgbmV4dCBsaXN0ICovCkls aXN0CWxpc3RbMl1bTkxJU1RdOwpzdGF0aWMJUmFuZ2VzZXQgc2VtcHR5OwoKLyoKICogQWN0aW9u cyBhbmQgVG9rZW5zCiAqCiAqCTB4MTAweHggYXJlIG9wZXJhdG9ycywgdmFsdWUgPT0gcHJlY2Vk ZW5jZQogKgkweDIwMHh4IGFyZSB0b2tlbnMsIGkuZS4gb3BlcmFuZHMgZm9yIG9wZXJhdG9ycwog Ki8KI2RlZmluZQlPUEVSQVRPUgkweDEwMDAwCS8qIEJpdG1hc2sgb2YgYWxsIG9wZXJhdG9ycyAq LwojZGVmaW5lCVNUQVJUCQkweDEwMDAwCS8qIFN0YXJ0LCB1c2VkIGZvciBtYXJrZXIgb24gc3Rh Y2sgKi8KI2RlZmluZQlSQlJBCQkweDEwMDAxCS8qIFJpZ2h0IGJyYWNrZXQsICkgKi8KI2RlZmlu ZQlMQlJBCQkweDEwMDAyCS8qIExlZnQgYnJhY2tldCwgKCAqLwojZGVmaW5lCU9SCQkweDEwMDAz CS8qIEFsdGVybmF0aW9uLCB8ICovCiNkZWZpbmUJQ0FUCQkweDEwMDA0CS8qIENvbmNhdGVudGF0 aW9uLCBpbXBsaWNpdCBvcGVyYXRvciAqLwojZGVmaW5lCVNUQVIJCTB4MTAwMDUJLyogQ2xvc3Vy ZSwgKiAqLwojZGVmaW5lCVBMVVMJCTB4MTAwMDYJLyogYSsgPT0gYWEqICovCiNkZWZpbmUJUVVF U1QJCTB4MTAwMDcJLyogYT8gPT0gYXxub3RoaW5nLCBpLmUuIDAgb3IgMSBhJ3MgKi8KI2RlZmlu ZQlBTlkJCTB4MjAwMDAJLyogQW55IGNoYXJhY3RlciBidXQgbmV3bGluZSwgLiAqLwojZGVmaW5l CU5PUAkJMHgyMDAwMQkvKiBObyBvcGVyYXRpb24sIGludGVybmFsIHVzZSBvbmx5ICovCiNkZWZp bmUJQk9MCQkweDIwMDAyCS8qIEJlZ2lubmluZyBvZiBsaW5lLCBeICovCiNkZWZpbmUJRU9MCQkw eDIwMDAzCS8qIEVuZCBvZiBsaW5lLCAkICovCiNkZWZpbmUJQ0NMQVNTCQkweDIwMDA0CS8qIENo YXJhY3RlciBjbGFzcywgW10gKi8KI2RlZmluZQlOQ0NMQVNTCQkweDIwMDA1CS8qIE5lZ2F0ZWQg Y2hhcmFjdGVyIGNsYXNzLCBbXl0gKi8KI2RlZmluZQlFTkQJCTB4MjAwNzcJLyogVGVybWluYXRl OiBtYXRjaCBmb3VuZCAqLwoKI2RlZmluZQlJU0FUT1IJCTB4MTAwMDAKI2RlZmluZQlJU0FORAkJ MHgyMDAwMAoKLyoKICogUGFyc2VyIEluZm9ybWF0aW9uCiAqLwp0eXBlZGVmIHN0cnVjdCBOb2Rl IE5vZGU7CnN0cnVjdCBOb2RlCnsKCUluc3QJKmZpcnN0OwoJSW5zdAkqbGFzdDsKfTsKCiNkZWZp bmUJTlNUQUNLCTIwCk5vZGUJYW5kc3RhY2tbTlNUQUNLXTsKTm9kZQkqYW5kcDsKaW50CWF0b3Jz dGFja1tOU1RBQ0tdOwppbnQJKmF0b3JwOwppbnQJbGFzdHdhc2FuZDsJLyogTGFzdCB0b2tlbiB3 YXMgb3BlcmFuZCAqLwppbnQJY3Vyc3ViaWQ7CmludAlzdWJpZHN0YWNrW05TVEFDS107CmludAkq c3ViaWRwOwppbnQJYmFja3dhcmRzOwppbnQJbmJyYTsKUnVuZQkqZXhwcnA7CQkvKiBwb2ludGVy IHRvIG5leHQgY2hhcmFjdGVyIGluIHNvdXJjZSBleHByZXNzaW9uICovCiNkZWZpbmUJRENMQVNT CTEwCS8qIGFsbG9jYXRpb24gaW5jcmVtZW50ICovCmludAluY2xhc3M7CQkvKiBudW1iZXIgYWN0 aXZlICovCmludAlOY2xhc3M7CQkvKiBoaWdoIHdhdGVyIG1hcmsgKi8KUnVuZQkqKmNsYXNzOwpp bnQJbmVnYXRlY2xhc3M7Cgp2b2lkCWFkZGluc3QoSWxpc3QgKmwsIEluc3QgKmluc3QsIFJhbmdl c2V0ICpzZXApOwp2b2lkCW5ld21hdGNoKFJhbmdlc2V0Kik7CnZvaWQJYm5ld21hdGNoKFJhbmdl c2V0Kik7CnZvaWQJcHVzaGFuZChJbnN0KiwgSW5zdCopOwp2b2lkCXB1c2hhdG9yKGludCk7Ck5v ZGUJKnBvcGFuZChpbnQpOwppbnQJcG9wYXRvcih2b2lkKTsKdm9pZAlzdGFydGxleChSdW5lKik7 CmludAlsZXgodm9pZCk7CnZvaWQJb3BlcmF0b3IoaW50KTsKdm9pZAlvcGVyYW5kKGludCk7CnZv aWQJZXZhbHVudGlsKGludCk7CnZvaWQJb3B0aW1pemUoSW5zdCopOwp2b2lkCWJsZGNjbGFzcyh2 b2lkKTsKCnZvaWQKcmVnZXJyb3IoRXJyIGUpCnsKCVN0cnplcm8oJmxhc3RyZWdleHApOwoJZXJy b3IoZSk7Cn0KCnZvaWQKcmVnZXJyb3JfYyhFcnIgZSwgaW50IGMpCnsKCVN0cnplcm8oJmxhc3Ry ZWdleHApOwoJZXJyb3JfYyhlLCBjKTsKfQoKSW5zdCAqCm5ld2luc3QoaW50IHQpCnsKCWlmKHBy b2dwID49ICZwcm9ncmFtW05QUk9HXSkKCQlyZWdlcnJvcihFdG9vbG9uZyk7Cglwcm9ncC0+dHlw ZSA9IHQ7Cglwcm9ncC0+bGVmdCA9IDA7Cglwcm9ncC0+cmlnaHQgPSAwOwoJcmV0dXJuIHByb2dw Kys7Cn0KCkluc3QgKgpyZWFsY29tcGlsZShSdW5lICpzKQp7CglpbnQgdG9rZW47CgoJc3RhcnRs ZXgocyk7CglhdG9ycCA9IGF0b3JzdGFjazsKCWFuZHAgPSBhbmRzdGFjazsKCXN1YmlkcCA9IHN1 Ymlkc3RhY2s7CgljdXJzdWJpZCA9IDA7CglsYXN0d2FzYW5kID0gRkFMU0U7CgkvKiBTdGFydCB3 aXRoIGEgbG93IHByaW9yaXR5IG9wZXJhdG9yIHRvIHByaW1lIHBhcnNlciAqLwoJcHVzaGF0b3Io U1RBUlQtMSk7Cgl3aGlsZSgodG9rZW49bGV4KCkpICE9IEVORCl7CgkJaWYoKHRva2VuJklTQVRP UikgPT0gT1BFUkFUT1IpCgkJCW9wZXJhdG9yKHRva2VuKTsKCQllbHNlCgkJCW9wZXJhbmQodG9r ZW4pOwoJfQoJLyogQ2xvc2Ugd2l0aCBhIGxvdyBwcmlvcml0eSBvcGVyYXRvciAqLwoJZXZhbHVu dGlsKFNUQVJUKTsKCS8qIEZvcmNlIEVORCAqLwoJb3BlcmFuZChFTkQpOwoJZXZhbHVudGlsKFNU QVJUKTsKCWlmKG5icmEpCgkJcmVnZXJyb3IoRWxlZnRwYXIpOwoJLS1hbmRwOwkvKiBwb2ludHMg dG8gZmlyc3QgYW5kIG9ubHkgb3BlcmFuZCAqLwoJcmV0dXJuIGFuZHAtPmZpcnN0Owp9Cgp2b2lk CmNvbXBpbGUoU3RyaW5nICpzKQp7CglpbnQgaTsKCUluc3QgKm9wcm9ncDsKCglpZihTdHJjbXAo cywgJmxhc3RyZWdleHApPT0wKQoJCXJldHVybjsKCWZvcihpPTA7IGk8bmNsYXNzOyBpKyspCgkJ ZnJlZShjbGFzc1tpXSk7CgluY2xhc3MgPSAwOwoJcHJvZ3AgPSBwcm9ncmFtOwoJYmFja3dhcmRz ID0gRkFMU0U7CglzdGFydGluc3QgPSByZWFsY29tcGlsZShzLT5zKTsKCW9wdGltaXplKHByb2dy YW0pOwoJb3Byb2dwID0gcHJvZ3A7CgliYWNrd2FyZHMgPSBUUlVFOwoJYnN0YXJ0aW5zdCA9IHJl YWxjb21waWxlKHMtPnMpOwoJb3B0aW1pemUob3Byb2dwKTsKCVN0cmR1cGxzdHIoJmxhc3RyZWdl eHAsIHMpOwp9Cgp2b2lkCm9wZXJhbmQoaW50IHQpCnsKCUluc3QgKmk7CglpZihsYXN0d2FzYW5k KQoJCW9wZXJhdG9yKENBVCk7CS8qIGNhdGVuYXRlIGlzIGltcGxpY2l0ICovCglpID0gbmV3aW5z dCh0KTsKCWlmKHQgPT0gQ0NMQVNTKXsKCQlpZihuZWdhdGVjbGFzcykKCQkJaS0+dHlwZSA9IE5D Q0xBU1M7CS8qIFVHSCAqLwoJCWktPnJjbGFzcyA9IG5jbGFzcy0xOwkJLyogVUdIICovCgl9Cglw dXNoYW5kKGksIGkpOwoJbGFzdHdhc2FuZCA9IFRSVUU7Cn0KCnZvaWQKb3BlcmF0b3IoaW50IHQp CnsKCWlmKHQ9PVJCUkEgJiYgLS1uYnJhPDApCgkJcmVnZXJyb3IoRXJpZ2h0cGFyKTsKCWlmKHQ9 PUxCUkEpewovKgogKgkJaWYoKytjdXJzdWJpZCA+PSBOU1VCRVhQKQogKgkJCXJlZ2Vycm9yKEVz dWJleHApOwogKi8KCQljdXJzdWJpZCsrOwkvKiBzaWxlbnRseSBpZ25vcmVkICovCgkJbmJyYSsr OwoJCWlmKGxhc3R3YXNhbmQpCgkJCW9wZXJhdG9yKENBVCk7Cgl9ZWxzZQoJCWV2YWx1bnRpbCh0 KTsKCWlmKHQhPVJCUkEpCgkJcHVzaGF0b3IodCk7CglsYXN0d2FzYW5kID0gRkFMU0U7CglpZih0 PT1TVEFSIHx8IHQ9PVFVRVNUIHx8IHQ9PVBMVVMgfHwgdD09UkJSQSkKCQlsYXN0d2FzYW5kID0g VFJVRTsJLyogdGhlc2UgbG9vayBsaWtlIG9wZXJhbmRzICovCn0KCnZvaWQKY2FudChjaGFyICpz KQp7CgljaGFyIGJ1ZlsxMDBdOwoKCXNwcmludChidWYsICJyZWdleHA6IGNhbid0IGhhcHBlbjog JXMiLCBzKTsKCXBhbmljKGJ1Zik7Cn0KCnZvaWQKcHVzaGFuZChJbnN0ICpmLCBJbnN0ICpsKQp7 CglpZihhbmRwID49ICZhbmRzdGFja1tOU1RBQ0tdKQoJCWNhbnQoIm9wZXJhbmQgc3RhY2sgb3Zl cmZsb3ciKTsKCWFuZHAtPmZpcnN0ID0gZjsKCWFuZHAtPmxhc3QgPSBsOwoJYW5kcCsrOwp9Cgp2 b2lkCnB1c2hhdG9yKGludCB0KQp7CglpZihhdG9ycCA+PSAmYXRvcnN0YWNrW05TVEFDS10pCgkJ Y2FudCgib3BlcmF0b3Igc3RhY2sgb3ZlcmZsb3ciKTsKCSphdG9ycCsrPXQ7CglpZihjdXJzdWJp ZCA+PSBOU1VCRVhQKQoJCSpzdWJpZHArKz0gLTE7CgllbHNlCgkJKnN1YmlkcCsrPWN1cnN1Ymlk Owp9CgpOb2RlICoKcG9wYW5kKGludCBvcCkKewoJaWYoYW5kcCA8PSAmYW5kc3RhY2tbMF0pCgkJ aWYob3ApCgkJCXJlZ2Vycm9yX2MoRW1pc3NvcCwgb3ApOwoJCWVsc2UKCQkJcmVnZXJyb3IoRWJh ZHJlZ2V4cCk7CglyZXR1cm4gLS1hbmRwOwp9CgppbnQKcG9wYXRvcih2b2lkKQp7CglpZihhdG9y cCA8PSAmYXRvcnN0YWNrWzBdKQoJCWNhbnQoIm9wZXJhdG9yIHN0YWNrIHVuZGVyZmxvdyIpOwoJ LS1zdWJpZHA7CglyZXR1cm4gKi0tYXRvcnA7Cn0KCnZvaWQKZXZhbHVudGlsKGludCBwcmkpCnsK CU5vZGUgKm9wMSwgKm9wMiwgKnQ7CglJbnN0ICppbnN0MSwgKmluc3QyOwoKCXdoaWxlKHByaT09 UkJSQSB8fCBhdG9ycFstMV0+PXByaSl7CgkJc3dpdGNoKHBvcGF0b3IoKSl7CgkJY2FzZSBMQlJB OgoJCQlvcDEgPSBwb3BhbmQoJygnKTsKCQkJaW5zdDIgPSBuZXdpbnN0KFJCUkEpOwoJCQlpbnN0 Mi0+c3ViaWQgPSAqc3ViaWRwOwoJCQlvcDEtPmxhc3QtPm5leHQgPSBpbnN0MjsKCQkJaW5zdDEg PSBuZXdpbnN0KExCUkEpOwoJCQlpbnN0MS0+c3ViaWQgPSAqc3ViaWRwOwoJCQlpbnN0MS0+bmV4 dCA9IG9wMS0+Zmlyc3Q7CgkJCXB1c2hhbmQoaW5zdDEsIGluc3QyKTsKCQkJcmV0dXJuOwkJLyog bXVzdCBoYXZlIGJlZW4gUkJSQSAqLwoJCWRlZmF1bHQ6CgkJCXBhbmljKCJ1bmtub3duIHJlZ2V4 cCBvcGVyYXRvciIpOwoJCQlicmVhazsKCQljYXNlIE9SOgoJCQlvcDIgPSBwb3BhbmQoJ3wnKTsK CQkJb3AxID0gcG9wYW5kKCd8Jyk7CgkJCWluc3QyID0gbmV3aW5zdChOT1ApOwoJCQlvcDItPmxh c3QtPm5leHQgPSBpbnN0MjsKCQkJb3AxLT5sYXN0LT5uZXh0ID0gaW5zdDI7CgkJCWluc3QxID0g bmV3aW5zdChPUik7CgkJCWluc3QxLT5yaWdodCA9IG9wMS0+Zmlyc3Q7CgkJCWluc3QxLT5sZWZ0 ID0gb3AyLT5maXJzdDsKCQkJcHVzaGFuZChpbnN0MSwgaW5zdDIpOwoJCQlicmVhazsKCQljYXNl IENBVDoKCQkJb3AyID0gcG9wYW5kKDApOwoJCQlvcDEgPSBwb3BhbmQoMCk7CgkJCWlmKGJhY2t3 YXJkcyAmJiBvcDItPmZpcnN0LT50eXBlIT1FTkQpCgkJCQl0ID0gb3AxLCBvcDEgPSBvcDIsIG9w MiA9IHQ7CgkJCW9wMS0+bGFzdC0+bmV4dCA9IG9wMi0+Zmlyc3Q7CgkJCXB1c2hhbmQob3AxLT5m aXJzdCwgb3AyLT5sYXN0KTsKCQkJYnJlYWs7CgkJY2FzZSBTVEFSOgoJCQlvcDIgPSBwb3BhbmQo JyonKTsKCQkJaW5zdDEgPSBuZXdpbnN0KE9SKTsKCQkJb3AyLT5sYXN0LT5uZXh0ID0gaW5zdDE7 CgkJCWluc3QxLT5yaWdodCA9IG9wMi0+Zmlyc3Q7CgkJCXB1c2hhbmQoaW5zdDEsIGluc3QxKTsK CQkJYnJlYWs7CgkJY2FzZSBQTFVTOgoJCQlvcDIgPSBwb3BhbmQoJysnKTsKCQkJaW5zdDEgPSBu ZXdpbnN0KE9SKTsKCQkJb3AyLT5sYXN0LT5uZXh0ID0gaW5zdDE7CgkJCWluc3QxLT5yaWdodCA9 IG9wMi0+Zmlyc3Q7CgkJCXB1c2hhbmQob3AyLT5maXJzdCwgaW5zdDEpOwoJCQlicmVhazsKCQlj YXNlIFFVRVNUOgoJCQlvcDIgPSBwb3BhbmQoJz8nKTsKCQkJaW5zdDEgPSBuZXdpbnN0KE9SKTsK CQkJaW5zdDIgPSBuZXdpbnN0KE5PUCk7CgkJCWluc3QxLT5sZWZ0ID0gaW5zdDI7CgkJCWluc3Qx LT5yaWdodCA9IG9wMi0+Zmlyc3Q7CgkJCW9wMi0+bGFzdC0+bmV4dCA9IGluc3QyOwoJCQlwdXNo YW5kKGluc3QxLCBpbnN0Mik7CgkJCWJyZWFrOwoJCX0KCX0KfQoKCnZvaWQKb3B0aW1pemUoSW5z dCAqc3RhcnQpCnsKCUluc3QgKmluc3QsICp0YXJnZXQ7CgoJZm9yKGluc3Q9c3RhcnQ7IGluc3Qt PnR5cGUhPUVORDsgaW5zdCsrKXsKCQl0YXJnZXQgPSBpbnN0LT5uZXh0OwoJCXdoaWxlKHRhcmdl dC0+dHlwZSA9PSBOT1ApCgkJCXRhcmdldCA9IHRhcmdldC0+bmV4dDsKCQlpbnN0LT5uZXh0ID0g dGFyZ2V0OwoJfQp9CgojaWZkZWYJREVCVUcKdm9pZApkdW1wc3RhY2sodm9pZCl7CglOb2RlICpz dGs7CglpbnQgKmlwOwoKCWRwcmludCgib3BlcmF0b3JzXG4iKTsKCWZvcihpcCA9IGF0b3JzdGFj azsgaXA8YXRvcnA7IGlwKyspCgkJZHByaW50KCIwJW9cbiIsICppcCk7CglkcHJpbnQoIm9wZXJh bmRzXG4iKTsKCWZvcihzdGsgPSBhbmRzdGFjazsgc3RrPGFuZHA7IHN0aysrKQoJCWRwcmludCgi MCVvXHQwJW9cbiIsIHN0ay0+Zmlyc3QtPnR5cGUsIHN0ay0+bGFzdC0+dHlwZSk7Cn0Kdm9pZApk dW1wKHZvaWQpewoJSW5zdCAqbDsKCglsID0gcHJvZ3JhbTsKCWRvewoJCWRwcmludCgiJWQ6XHQw JW9cdCVkXHQlZFxuIiwgbC1wcm9ncmFtLCBsLT50eXBlLAoJCQlsLT5sZWZ0LXByb2dyYW0sIGwt PnJpZ2h0LXByb2dyYW0pOwoJfXdoaWxlKGwrKy0+dHlwZSk7Cn0KI2VuZGlmCgp2b2lkCnN0YXJ0 bGV4KFJ1bmUgKnMpCnsKCWV4cHJwID0gczsKCW5icmEgPSAwOwp9CgoKaW50CmxleCh2b2lkKXsK CWludCBjPSAqZXhwcnArKzsKCglzd2l0Y2goYyl7CgljYXNlICdcXCc6CgkJaWYoKmV4cHJwKQoJ CQlpZigoYz0gKmV4cHJwKyspPT0nbicpCgkJCQljPSdcbic7CgkJYnJlYWs7CgljYXNlIDA6CgkJ YyA9IEVORDsKCQktLWV4cHJwOwkvKiBJbiBjYXNlIHdlIGNvbWUgaGVyZSBhZ2FpbiAqLwoJCWJy ZWFrOwoJY2FzZSAnKic6CgkJYyA9IFNUQVI7CgkJYnJlYWs7CgljYXNlICc/JzoKCQljID0gUVVF U1Q7CgkJYnJlYWs7CgljYXNlICcrJzoKCQljID0gUExVUzsKCQlicmVhazsKCWNhc2UgJ3wnOgoJ CWMgPSBPUjsKCQlicmVhazsKCWNhc2UgJy4nOgoJCWMgPSBBTlk7CgkJYnJlYWs7CgljYXNlICco JzoKCQljID0gTEJSQTsKCQlicmVhazsKCWNhc2UgJyknOgoJCWMgPSBSQlJBOwoJCWJyZWFrOwoJ Y2FzZSAnXic6CgkJYyA9IEJPTDsKCQlicmVhazsKCWNhc2UgJyQnOgoJCWMgPSBFT0w7CgkJYnJl YWs7CgljYXNlICdbJzoKCQljID0gQ0NMQVNTOwoJCWJsZGNjbGFzcygpOwoJCWJyZWFrOwoJfQoJ cmV0dXJuIGM7Cn0KCmxvbmcKbmV4dHJlYyh2b2lkKXsKCWlmKGV4cHJwWzBdPT0wIHx8IChleHBy cFswXT09J1xcJyAmJiBleHBycFsxXT09MCkpCgkJcmVnZXJyb3IoRWJhZGNsYXNzKTsKCWlmKGV4 cHJwWzBdID09ICdcXCcpewoJCWV4cHJwKys7CgkJaWYoKmV4cHJwPT0nbicpewoJCQlleHBycCsr OwoJCQlyZXR1cm4gJ1xuJzsKCQl9CgkJcmV0dXJuICpleHBycCsrfDB4MTAwMDA7Cgl9CglyZXR1 cm4gKmV4cHJwKys7Cn0KCnZvaWQKYmxkY2NsYXNzKHZvaWQpCnsKCWxvbmcgYzEsIGMyLCBuLCBu YTsKCVJ1bmUgKmNsYXNzcDsKCgljbGFzc3AgPSBlbWFsbG9jKERDTEFTUypSVU5FU0laRSk7Cglu ID0gMDsKCW5hID0gRENMQVNTOwoJLyogd2UgaGF2ZSBhbHJlYWR5IHNlZW4gdGhlICdbJyAqLwoJ aWYoKmV4cHJwID09ICdeJyl7CgkJY2xhc3NwW24rK10gPSAnXG4nOwkvKiBkb24ndCBtYXRjaCBu ZXdsaW5lIGluIG5lZ2F0ZSBjYXNlICovCgkJbmVnYXRlY2xhc3MgPSBUUlVFOwoJCWV4cHJwKys7 Cgl9ZWxzZQoJCW5lZ2F0ZWNsYXNzID0gRkFMU0U7Cgl3aGlsZSgoYzEgPSBuZXh0cmVjKCkpICE9 ICddJyl7CgkJaWYoYzEgPT0gJy0nKXsKICAgIEVycm9yOgoJCQlmcmVlKGNsYXNzcCk7CgkJCXJl Z2Vycm9yKEViYWRjbGFzcyk7CgkJfQoJCWlmKG4rNCA+PSBuYSl7CQkvKiAzIHJ1bmVzIHBsdXMg TlVMICovCgkJCW5hICs9IERDTEFTUzsKCQkJY2xhc3NwID0gZXJlYWxsb2MoY2xhc3NwLCBuYSpS VU5FU0laRSk7CgkJfQoJCWlmKCpleHBycCA9PSAnLScpewoJCQlleHBycCsrOwkvKiBlYXQgJy0n ICovCgkJCWlmKChjMiA9IG5leHRyZWMoKSkgPT0gJ10nKQoJCQkJZ290byBFcnJvcjsKCQkJY2xh c3NwW24rMF0gPSAweEZGRkY7CgkJCWNsYXNzcFtuKzFdID0gYzE7CgkJCWNsYXNzcFtuKzJdID0g YzI7CgkJCW4gKz0gMzsKCQl9ZWxzZQoJCQljbGFzc3BbbisrXSA9IGMxOwoJfQoJY2xhc3NwW25d ID0gMDsKCWlmKG5jbGFzcyA9PSBOY2xhc3MpewoJCU5jbGFzcyArPSBEQ0xBU1M7CgkJY2xhc3Mg PSBlcmVhbGxvYyhjbGFzcywgTmNsYXNzKnNpemVvZihSdW5lKikpOwoJfQoJY2xhc3NbbmNsYXNz KytdID0gY2xhc3NwOwp9CgppbnQKY2xhc3NtYXRjaChpbnQgY2xhc3NubywgaW50IGMsIGludCBu ZWdhdGUpCnsKCVJ1bmUgKnA7CgoJcCA9IGNsYXNzW2NsYXNzbm9dOwoJd2hpbGUoKnApewoJCWlm KCpwID09IDB4RkZGRil7CgkJCWlmKHBbMV08PWMgJiYgYzw9cFsyXSkKCQkJCXJldHVybiAhbmVn YXRlOwoJCQlwICs9IDM7CgkJfWVsc2UgaWYoKnArKyA9PSBjKQoJCQlyZXR1cm4gIW5lZ2F0ZTsK CX0KCXJldHVybiBuZWdhdGU7Cn0KCi8qCiAqIE5vdGUgb3B0aW1pemF0aW9uIGluIGFkZGluc3Q6 CiAqIAkqbCBtdXN0IGJlIHBlbmRpbmcgd2hlbiBhZGRpbnN0IGNhbGxlZDsgaWYgKmwgaGFzIGJl ZW4gbG9va2VkCiAqCQlhdCBhbHJlYWR5LCB0aGUgb3B0aW1pemF0aW9uIGlzIGEgYnVnLgogKi8K dm9pZAphZGRpbnN0KElsaXN0ICpsLCBJbnN0ICppbnN0LCBSYW5nZXNldCAqc2VwKQp7CglJbGlz dCAqcDsKCglmb3IocCA9IGw7IHAtPmluc3Q7IHArKyl7CgkJaWYocC0+aW5zdD09aW5zdCl7CgkJ CWlmKChzZXApLT5wWzBdLnAxIDwgcC0+c2UucFswXS5wMSkKCQkJCXAtPnNlPSAqc2VwOwkvKiB0 aGlzIHdvdWxkIGJlIGJ1ZyAqLwoJCQlyZXR1cm47CS8qIEl0J3MgYWxyZWFkeSB0aGVyZSAqLwoJ CX0KCX0KCXAtPmluc3QgPSBpbnN0OwoJcC0+c2U9ICpzZXA7CgkocCsxKS0+aW5zdCA9IDA7Cn0K CmludApleGVjdXRlKEZpbGUgKmYsIFBvc24gc3RhcnRwLCBQb3NuIGVvZikKewoJaW50IGZsYWcg PSAwOwoJSW5zdCAqaW5zdDsKCUlsaXN0ICp0bHA7CglQb3NuIHAgPSBzdGFydHA7CglpbnQgbm5s ID0gMCwgbnRsOwoJaW50IGM7CglpbnQgd3JhcHBlZCA9IDA7CglpbnQgc3RhcnRjaGFyID0gc3Rh cnRpbnN0LT50eXBlPE9QRVJBVE9SPyBzdGFydGluc3QtPnR5cGUgOiAwOwoKCWxpc3RbMF1bMF0u aW5zdCA9IGxpc3RbMV1bMF0uaW5zdCA9IDA7CglzZWwucFswXS5wMSA9IC0xOwoJLyogRXhlY3V0 ZSBtYWNoaW5lIG9uY2UgZm9yIGVhY2ggY2hhcmFjdGVyICovCglmb3IoOztwKyspewoJZG9sb29w OgoJCWMgPSBmaWxlcmVhZGMoZiwgcCk7CgkJaWYocD49ZW9mIHx8IGM8MCl7CgkJCXN3aXRjaCh3 cmFwcGVkKyspewoJCQljYXNlIDA6CQkvKiBsZXQgbG9vcCBydW4gb25lIG1vcmUgY2xpY2sgKi8K CQkJY2FzZSAyOgoJCQkJYnJlYWs7CgkJCWNhc2UgMToJCS8qIGV4cGlyZWQ7IHdyYXAgdG8gYmVn aW5uaW5nICovCgkJCQlpZihzZWwucFswXS5wMT49MCB8fCBlb2YhPUlORklOSVRZKQoJCQkJCWdv dG8gUmV0dXJuOwoJCQkJbGlzdFswXVswXS5pbnN0ID0gbGlzdFsxXVswXS5pbnN0ID0gMDsKCQkJ CXAgPSAwOwoJCQkJZ290byBkb2xvb3A7CgkJCWRlZmF1bHQ6CgkJCQlnb3RvIFJldHVybjsKCQkJ fQoJCX1lbHNlIGlmKCgod3JhcHBlZCAmJiBwPj1zdGFydHApIHx8IHNlbC5wWzBdLnAxPjApICYm IG5ubD09MCkKCQkJYnJlYWs7CgkJLyogZmFzdCBjaGVjayBmb3IgZmlyc3QgY2hhciAqLwoJCWlm KHN0YXJ0Y2hhciAmJiBubmw9PTAgJiYgYyE9c3RhcnRjaGFyKQoJCQljb250aW51ZTsKCQl0bCA9 IGxpc3RbZmxhZ107CgkJbmwgPSBsaXN0W2ZsYWdePTFdOwoJCW5sLT5pbnN0ID0gMDsKCQludGwg PSBubmw7CgkJbm5sID0gMDsKCQlpZihzZWwucFswXS5wMTwwICYmICghd3JhcHBlZCB8fCBwPHN0 YXJ0cCB8fCBzdGFydHA9PWVvZikpewoJCQkvKiBBZGQgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gdGhp cyBsaXN0ICovCgkJCWlmKCsrbnRsID49IE5MSVNUKQoJT3ZlcmZsb3c6CgkJCQllcnJvcihFb3Zl cmZsb3cpOwoJCQlzZW1wdHkucFswXS5wMSA9IHA7CgkJCWFkZGluc3QodGwsIHN0YXJ0aW5zdCwg JnNlbXB0eSk7CgkJfQoJCS8qIEV4ZWN1dGUgbWFjaGluZSB1bnRpbCB0aGlzIGxpc3QgaXMgZW1w dHkgKi8KCQlmb3IodGxwID0gdGw7IGluc3QgPSB0bHAtPmluc3Q7IHRscCsrKXsJLyogYXNzaWdu bWVudCA9ICovCglTd2l0Y2hzdG10OgoJCQlzd2l0Y2goaW5zdC0+dHlwZSl7CgkJCWRlZmF1bHQ6 CS8qIHJlZ3VsYXIgY2hhcmFjdGVyICovCgkJCQlpZihpbnN0LT50eXBlPT1jKXsKCUFkZGluc3Q6 CgkJCQkJaWYoKytubmwgPj0gTkxJU1QpCgkJCQkJCWdvdG8gT3ZlcmZsb3c7CgkJCQkJYWRkaW5z dChubCwgaW5zdC0+bmV4dCwgJnRscC0+c2UpOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgTEJS QToKCQkJCWlmKGluc3QtPnN1YmlkPj0wKQoJCQkJCXRscC0+c2UucFtpbnN0LT5zdWJpZF0ucDEg PSBwOwoJCQkJaW5zdCA9IGluc3QtPm5leHQ7CgkJCQlnb3RvIFN3aXRjaHN0bXQ7CgkJCWNhc2Ug UkJSQToKCQkJCWlmKGluc3QtPnN1YmlkPj0wKQoJCQkJCXRscC0+c2UucFtpbnN0LT5zdWJpZF0u cDIgPSBwOwoJCQkJaW5zdCA9IGluc3QtPm5leHQ7CgkJCQlnb3RvIFN3aXRjaHN0bXQ7CgkJCWNh c2UgQU5ZOgoJCQkJaWYoYyE9J1xuJykKCQkJCQlnb3RvIEFkZGluc3Q7CgkJCQlicmVhazsKCQkJ Y2FzZSBCT0w6CgkJCQlpZihwPT0wIHx8IGZpbGVyZWFkYyhmLCBwIC0gMSk9PSdcbicpewoJU3Rl cDoKCQkJCQlpbnN0ID0gaW5zdC0+bmV4dDsKCQkJCQlnb3RvIFN3aXRjaHN0bXQ7CgkJCQl9CgkJ CQlicmVhazsKCQkJY2FzZSBFT0w6CgkJCQlpZihjID09ICdcbicpCgkJCQkJZ290byBTdGVwOwoJ CQkJYnJlYWs7CgkJCWNhc2UgQ0NMQVNTOgoJCQkJaWYoYz49MCAmJiBjbGFzc21hdGNoKGluc3Qt PnJjbGFzcywgYywgMCkpCgkJCQkJZ290byBBZGRpbnN0OwoJCQkJYnJlYWs7CgkJCWNhc2UgTkND TEFTUzoKCQkJCWlmKGM+PTAgJiYgY2xhc3NtYXRjaChpbnN0LT5yY2xhc3MsIGMsIDEpKQoJCQkJ CWdvdG8gQWRkaW5zdDsKCQkJCWJyZWFrOwoJCQljYXNlIE9SOgoJCQkJLyogZXZhbHVhdGUgcmln aHQgY2hvaWNlIGxhdGVyICovCgkJCQlpZigrK250bCA+PSBOTElTVCkKCQkJCQlnb3RvIE92ZXJm bG93OwoJCQkJYWRkaW5zdCh0bHAsIGluc3QtPnJpZ2h0LCAmdGxwLT5zZSk7CgkJCQkvKiBlZmZp Y2llbmN5OiBhZHZhbmNlIGFuZCByZS1ldmFsdWF0ZSAqLwoJCQkJaW5zdCA9IGluc3QtPmxlZnQ7 CgkJCQlnb3RvIFN3aXRjaHN0bXQ7CgkJCWNhc2UgRU5EOgkvKiBNYXRjaCEgKi8KCQkJCXRscC0+ c2UucFswXS5wMiA9IHA7CgkJCQluZXdtYXRjaCgmdGxwLT5zZSk7CgkJCQlicmVhazsKCQkJfQoJ CX0KCX0KICAgIFJldHVybjoKCXJldHVybiBzZWwucFswXS5wMT49MDsKfQoKdm9pZApuZXdtYXRj aChSYW5nZXNldCAqc3ApCnsKCWludCBpOwoKCWlmKHNlbC5wWzBdLnAxPDAgfHwgc3AtPnBbMF0u cDE8c2VsLnBbMF0ucDEgfHwKCSAgIChzcC0+cFswXS5wMT09c2VsLnBbMF0ucDEgJiYgc3AtPnBb MF0ucDI+c2VsLnBbMF0ucDIpKQoJCWZvcihpID0gMDsgaTxOU1VCRVhQOyBpKyspCgkJCXNlbC5w W2ldID0gc3AtPnBbaV07Cn0KCmludApiZXhlY3V0ZShGaWxlICpmLCBQb3NuIHN0YXJ0cCkKewoJ aW50IGZsYWcgPSAwOwoJSW5zdCAqaW5zdDsKCUlsaXN0ICp0bHA7CglQb3NuIHAgPSBzdGFydHA7 CglpbnQgbm5sID0gMCwgbnRsOwoJaW50IGM7CglpbnQgd3JhcHBlZCA9IDA7CglpbnQgc3RhcnRj aGFyID0gYnN0YXJ0aW5zdC0+dHlwZTxPUEVSQVRPUj8gYnN0YXJ0aW5zdC0+dHlwZSA6IDA7CgoJ bGlzdFswXVswXS5pbnN0ID0gbGlzdFsxXVswXS5pbnN0ID0gMDsKCXNlbC5wWzBdLnAxPSAtMTsK CS8qIEV4ZWN1dGUgbWFjaGluZSBvbmNlIGZvciBlYWNoIGNoYXJhY3RlciwgaW5jbHVkaW5nIHRl cm1pbmFsIE5VTCAqLwoJZm9yKDs7LS1wKXsKCWRvbG9vcDoKCQlpZigoYyA9IGZpbGVyZWFkYyhm LCBwIC0gMSkpPT0tMSl7CgkJCXN3aXRjaCh3cmFwcGVkKyspewoJCQljYXNlIDA6CQkvKiBsZXQg bG9vcCBydW4gb25lIG1vcmUgY2xpY2sgKi8KCQkJY2FzZSAyOgoJCQkJYnJlYWs7CgkJCWNhc2Ug MToJCS8qIGV4cGlyZWQ7IHdyYXAgdG8gZW5kICovCgkJCQlpZihzZWwucFswXS5wMT49MCkKCQkJ Y2FzZSAzOgoJCQkJCWdvdG8gUmV0dXJuOwoJCQkJbGlzdFswXVswXS5pbnN0ID0gbGlzdFsxXVsw XS5pbnN0ID0gMDsKCQkJCXAgPSBmLT5VLm5jOwoJCQkJZ290byBkb2xvb3A7CgkJCWRlZmF1bHQ6 CgkJCQlnb3RvIFJldHVybjsKCQkJfQoJCX1lbHNlIGlmKCgod3JhcHBlZCAmJiBwPD1zdGFydHAp IHx8IHNlbC5wWzBdLnAxPjApICYmIG5ubD09MCkKCQkJYnJlYWs7CgkJLyogZmFzdCBjaGVjayBm b3IgZmlyc3QgY2hhciAqLwoJCWlmKHN0YXJ0Y2hhciAmJiBubmw9PTAgJiYgYyE9c3RhcnRjaGFy KQoJCQljb250aW51ZTsKCQl0bCA9IGxpc3RbZmxhZ107CgkJbmwgPSBsaXN0W2ZsYWdePTFdOwoJ CW5sLT5pbnN0ID0gMDsKCQludGwgPSBubmw7CgkJbm5sID0gMDsKCQlpZihzZWwucFswXS5wMTww ICYmICghd3JhcHBlZCB8fCBwPnN0YXJ0cCkpewoJCQkvKiBBZGQgZmlyc3QgaW5zdHJ1Y3Rpb24g dG8gdGhpcyBsaXN0ICovCgkJCWlmKCsrbnRsID49IE5MSVNUKQoJT3ZlcmZsb3c6CgkJCQllcnJv cihFb3ZlcmZsb3cpOwoJCQkvKiB0aGUgbWludXMgaXMgc28gdGhlIG9wdGltaXphdGlvbnMgaW4g YWRkaW5zdCB3b3JrICovCgkJCXNlbXB0eS5wWzBdLnAxID0gLXA7CgkJCWFkZGluc3QodGwsIGJz dGFydGluc3QsICZzZW1wdHkpOwoJCX0KCQkvKiBFeGVjdXRlIG1hY2hpbmUgdW50aWwgdGhpcyBs aXN0IGlzIGVtcHR5ICovCgkJZm9yKHRscCA9IHRsOyBpbnN0ID0gdGxwLT5pbnN0OyB0bHArKyl7 CS8qIGFzc2lnbm1lbnQgPSAqLwoJU3dpdGNoc3RtdDoKCQkJc3dpdGNoKGluc3QtPnR5cGUpewoJ CQlkZWZhdWx0OgkvKiByZWd1bGFyIGNoYXJhY3RlciAqLwoJCQkJaWYoaW5zdC0+dHlwZSA9PSBj KXsKCUFkZGluc3Q6CgkJCQkJaWYoKytubmwgPj0gTkxJU1QpCgkJCQkJCWdvdG8gT3ZlcmZsb3c7 CgkJCQkJYWRkaW5zdChubCwgaW5zdC0+bmV4dCwgJnRscC0+c2UpOwoJCQkJfQoJCQkJYnJlYWs7 CgkJCWNhc2UgTEJSQToKCQkJCWlmKGluc3QtPnN1YmlkPj0wKQoJCQkJCXRscC0+c2UucFtpbnN0 LT5zdWJpZF0ucDEgPSBwOwoJCQkJaW5zdCA9IGluc3QtPm5leHQ7CgkJCQlnb3RvIFN3aXRjaHN0 bXQ7CgkJCWNhc2UgUkJSQToKCQkJCWlmKGluc3QtPnN1YmlkID49IDApCgkJCQkJdGxwLT5zZS5w W2luc3QtPnN1YmlkXS5wMiA9IHA7CgkJCQlpbnN0ID0gaW5zdC0+bmV4dDsKCQkJCWdvdG8gU3dp dGNoc3RtdDsKCQkJY2FzZSBBTlk6CgkJCQlpZihjICE9ICdcbicpCgkJCQkJZ290byBBZGRpbnN0 OwoJCQkJYnJlYWs7CgkJCWNhc2UgQk9MOgoJCQkJaWYoYz09J1xuJyB8fCBwPT0wKXsKCVN0ZXA6 CgkJCQkJaW5zdCA9IGluc3QtPm5leHQ7CgkJCQkJZ290byBTd2l0Y2hzdG10OwoJCQkJfQoJCQkJ YnJlYWs7CgkJCWNhc2UgRU9MOgoJCQkJaWYocD09Zi0+VS5uYyB8fCBmaWxlcmVhZGMoZiwgcCk9 PSdcbicpCgkJCQkJZ290byBTdGVwOwoJCQkJYnJlYWs7CgkJCWNhc2UgQ0NMQVNTOgoJCQkJaWYo Yz49MCAmJiBjbGFzc21hdGNoKGluc3QtPnJjbGFzcywgYywgMCkpCgkJCQkJZ290byBBZGRpbnN0 OwoJCQkJYnJlYWs7CgkJCWNhc2UgTkNDTEFTUzoKCQkJCWlmKGM+PTAgJiYgY2xhc3NtYXRjaChp bnN0LT5yY2xhc3MsIGMsIDEpKQoJCQkJCWdvdG8gQWRkaW5zdDsKCQkJCWJyZWFrOwoJCQljYXNl IE9SOgoJCQkJLyogZXZhbHVhdGUgcmlnaHQgY2hvaWNlIGxhdGVyICovCgkJCQlpZigrK250bCA+ PSBOTElTVCkKCQkJCQlnb3RvIE92ZXJmbG93OwoJCQkJYWRkaW5zdCh0bHAsIGluc3QtPnJpZ2h0 LCAmdGxwLT5zZSk7CgkJCQkvKiBlZmZpY2llbmN5OiBhZHZhbmNlIGFuZCByZS1ldmFsdWF0ZSAq LwoJCQkJaW5zdCA9IGluc3QtPmxlZnQ7CgkJCQlnb3RvIFN3aXRjaHN0bXQ7CgkJCWNhc2UgRU5E OgkvKiBNYXRjaCEgKi8KCQkJCXRscC0+c2UucFswXS5wMSA9IC10bHAtPnNlLnBbMF0ucDE7IC8q IG1pbnVzIHNpZ24gKi8KCQkJCXRscC0+c2UucFswXS5wMiA9IHA7CgkJCQlibmV3bWF0Y2goJnRs cC0+c2UpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CiAgICBSZXR1cm46CglyZXR1cm4gc2VsLnBb MF0ucDE+PTA7Cn0KCnZvaWQKYm5ld21hdGNoKFJhbmdlc2V0ICpzcCkKewogICAgICAgIGludCAg aTsKICAgICAgICBpZihzZWwucFswXS5wMTwwIHx8IHNwLT5wWzBdLnAxPnNlbC5wWzBdLnAyIHx8 IChzcC0+cFswXS5wMT09c2VsLnBbMF0ucDIgJiYgc3AtPnBbMF0ucDI8c2VsLnBbMF0ucDEpKQog ICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpPE5TVUJFWFA7IGkrKyl7ICAgICAgIC8qIG5vdGUg dGhlIHJldmVyc2FsOyBwMTw9cDIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgc2VsLnBbaV0u cDEgPSBzcC0+cFtpXS5wMjsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsLnBbaV0ucDIgPSBz cC0+cFtpXS5wMTsKICAgICAgICAgICAgICAgIH0KfQpyKEViYWRyZWdleHApOwoJcmV0dXJuIC0t YW5kcDsKfQoKaW50CnBvcGF0b3Iodm9pZCkKewoJaWYoYXRvcnAgPD0gJmF0b3JzdGFja1swXSkK CQljYW50KCJvcGVyYXRvciBzdGFjayB1bmRlcmZsb3ciKTsKCS0tc3ViaWRwOwoJcmV0dXJuICot LWF0b3JwOwp9Cgp2b2lkCmV2YWx1bnRpbChpbnQgcHJpKQp7CglOb2RlICpvcDEsICpvcDIsICp0 OwoJSW5zdCAqaW5zdDEsICppbnN0MjsKCgl3aGlsZShwcmk9PVJCUkEgfHwgYXRvcnBbLTFdPj1w cmkpewoJCXN3aXRjaChwb3BhdG9yKCkpewoJCWNhc2UgTEJSQToKCQkJb3AxID0gcG9wYW5kKCco Jyk7CgkJCWluc3QyID0gbmV3aW5zdChSQlJBKTsKCQkJaW5zdDItPnN1YmlkID0gKnN1YmlkcDsK CQkJb3AxLT5sYXN0LT5uZXh0ID0gaW5zdDI7CgkJCWluc3QxID0gbmV3aW5zdChMQlJBKTsKCQkJ aW5zdDEtPnN1YmlkID0gKnN1YmlkcDsKCQkJaW5zdDEtPm5leHQgPSBvcDEtPmZpcnN0OwoJc2Ft Mmsvc2FtL3NhbS5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAw MDAwMTUxADAwMDAwMDI3NzI3ADA3MTEyMTE2MzcwADAwMTQ1MDEAMAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5j bHVkZSAic2FtLmgiCgpSdW5lCWdlbmJ1ZltCTE9DS1NJWkVdOwppbnQJaW87CmludAlwYW5pY2tp bmc7CmludAlyZXNjdWluZzsKU3RyaW5nCWdlbnN0cjsKU3RyaW5nCXJoczsKU3RyaW5nCWN1cndk OwpTdHJpbmcJY21kc3RyOwpSdW5lCWVtcHR5W10gPSB7IDAgfTsKY2hhcgkqZ2VuYzsKRmlsZQkq Y3VyZmlsZTsKRmlsZQkqZmxpc3Q7CkZpbGUJKmNtZDsKam1wX2J1ZgltYWlubG9vcDsKTGlzdAl0 ZW1wZmlsZTsKaW50CXF1aXRvayA9IFRSVUU7CmludAlkb3dubG9hZGVkOwppbnQJZGZsYWc7Cmlu dAlSZmxhZzsKY2hhcgkqbWFjaGluZTsKY2hhcgkqaG9tZTsKaW50CWJwaXBlb2s7CmludAl0ZXJt bG9ja2VkOwpjaGFyCSpzYW10ZXJtID0gU0FNVEVSTTsKY2hhcgkqcnNhbW5hbWUgPSBSU0FNOwpG aWxlCSpsYXN0ZmlsZTsKRGlzawkqZGlzazsKbG9uZwlzZXE7CgpSdW5lCWJhZGRpcltdID0geyAn PCcsICdiJywgJ2EnLCAnZCcsICdkJywgJ2knLCAncicsICc+JywgJ1xuJ307Cgp2b2lkCXVzYWdl KHZvaWQpOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJaW50IGk7CglTdHJp bmcgKnQ7CgljaGFyICoqYXAsICoqYXJnOwoKCWZtdF9pbnN0YWxsX3J1bmVjb252KCk7CgoJYXJn ID0gYXJndisrOwoJYXAgPSBhcmd2OwoJd2hpbGUoYXJnYz4xICYmIGFyZ3ZbMF0gJiYgYXJndlsw XVswXT09Jy0nKXsKCQlzd2l0Y2goYXJndlswXVsxXSl7CgkJY2FzZSAnZCc6CgkJCWRmbGFnKys7 CgkJCWJyZWFrOwoKCQljYXNlICdyJzoKCQkJLS1hcmdjLCBhcmd2Kys7CgkJCWlmKGFyZ2MgPT0g MSkKCQkJCXVzYWdlKCk7CgkJCW1hY2hpbmUgPSAqYXJndjsKCQkJYnJlYWs7CgoJCWNhc2UgJ1In OgoJCQlSZmxhZysrOwoJCQlicmVhazsKCgkJY2FzZSAndCc6CgkJCS0tYXJnYywgYXJndisrOwoJ CQlpZihhcmdjID09IDEpCgkJCQl1c2FnZSgpOwoJCQlzYW10ZXJtID0gKmFyZ3Y7CgkJCWJyZWFr OwoKCQljYXNlICdzJzoKCQkJLS1hcmdjLCBhcmd2Kys7CgkJCWlmKGFyZ2MgPT0gMSkKCQkJCXVz YWdlKCk7CgkJCXJzYW1uYW1lID0gKmFyZ3Y7CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCQlkcHJp bnQoInNhbTogdW5rbm93biBmbGFnICVjXG4iLCBhcmd2WzBdWzFdKTsKCQkJZXhpdHMoInVzYWdl Iik7CgkJfQoJCS0tYXJnYywgYXJndisrOwoJfQoJU3RyaW5pdCgmY21kc3RyKTsKCVN0cmluaXQw KCZsYXN0cGF0KTsKCVN0cmluaXQwKCZsYXN0cmVnZXhwKTsKCVN0cmluaXQwKCZnZW5zdHIpOwoJ U3RyaW5pdDAoJnJocyk7CglTdHJpbml0MCgmY3Vyd2QpOwoJdGVtcGZpbGUubGlzdHB0ciA9IGVt YWxsb2MoMSk7CS8qIHNvIGl0IGNhbiBiZSBmcmVlZCBsYXRlciAqLwoJU3RyaW5pdDAoJnBsYW45 Y21kKTsKCWhvbWUgPSBnZXRlbnYoSE9NRSk7CglkaXNrID0gZGlza2luaXQoKTsKCWlmKGhvbWUg PT0gMCkKCQlob21lID0gIi8iOwoJaWYoIWRmbGFnKQoJCXN0YXJ0dXAobWFjaGluZSwgUmZsYWcs IGFyZywgYXApOwoJbm90aWZ5KG5vdGlmeWYpOwoJZ2V0Y3Vyd2QoKTsKCWlmKGFyZ2M+MSl7CgkJ Zm9yKGk9MDsgaTxhcmdjLTE7IGkrKyl7CgkJCWlmKCFzZXRqbXAobWFpbmxvb3ApKXsKCQkJCXQg PSB0bXBjc3RyKGFyZ3ZbaV0pOwoJCQkJU3RyYWRkYyh0LCAnXDAnKTsKCQkJCVN0cmR1cGxzdHIo JmdlbnN0ciwgdCk7CgkJCQlmcmVldG1wc3RyKHQpOwoJCQkJZml4bmFtZSgmZ2Vuc3RyKTsKCQkJ CWxvZ3NldG5hbWUobmV3ZmlsZSgpLCAmZ2Vuc3RyKTsKCQkJfQoJCX0KCX1lbHNlIGlmKCFkb3du bG9hZGVkKQoJCW5ld2ZpbGUoKTsKCXNlcSsrOwoJaWYoZmlsZS5udXNlZCkKCQljdXJyZW50KGZp bGUuZmlsZXBwdHJbMF0pOwoJc2V0am1wKG1haW5sb29wKTsKCWNtZGxvb3AoKTsKCXRyeXRvcXVp dCgpOwkvKiBpZiB3ZSBhbHJlYWR5IHEnZWQsIHF1aXRvayB3aWxsIGJlIFRSVUUgKi8KCWV4aXRz KDApOwp9Cgp2b2lkCnVzYWdlKHZvaWQpCnsKCWRwcmludCgidXNhZ2U6IHNhbSBbLWRdIFstdCBz YW10ZXJtXSBbLXMgc2FtIG5hbWVdIC1yIG1hY2hpbmVcbiIpOwoJZXhpdHMoInVzYWdlIik7Cn0K CnZvaWQKcmVzY3VlKHZvaWQpCnsKCWludCBpLCBuYmxhbmsgPSAwOwoJRmlsZSAqZjsKCWNoYXIg KmM7CgljaGFyIGJ1ZlsyNTZdOwoKCWlmKHJlc2N1aW5nKyspCgkJcmV0dXJuOwoJaW8gPSAtMTsK CWZvcihpPTA7IGk8ZmlsZS5udXNlZDsgaSsrKXsKCQlmID0gZmlsZS5maWxlcHB0cltpXTsKCQlp ZihmPT1jbWQgfHwgZi0+VS5uYz09MCB8fCAhZmlsZWlzZGlydHkoZikpCgkJCWNvbnRpbnVlOwoJ CWlmKGlvID09IC0xKXsKCQkJc3ByaW50KGJ1ZiwgIiVzL3NhbS5zYXZlIiwgaG9tZSk7CgkJCWlv ID0gY3JlYXRlKGJ1ZiwgMSwgMDc3Nyk7CgkJCWlmKGlvPDApCgkJCQlyZXR1cm47CgkJfQoJCWlm KGYtPm5hbWUuc1swXSl7CgkJCWMgPSBTdHJ0b2MoJmYtPm5hbWUpOwoJCQlzdHJuY3B5KGJ1Ziwg Yywgc2l6ZW9mIGJ1Zi0xKTsKCQkJYnVmW3NpemVvZiBidWYtMV0gPSAwOwoJCQlmcmVlKGMpOwoJ CX1lbHNlCgkJCXNwcmludChidWYsICJuYW1lbGVzcy4lZCIsIG5ibGFuaysrKTsKCQlmcHJpbnQo aW8sICIjISVzICclcycgJCogPDwnLS0tJXMnXG4iLCBTQU1TQVZFQ01ELCBidWYsIGJ1Zik7CgkJ YWRkci5yLnAxID0gMCwgYWRkci5yLnAyID0gZi0+VS5uYzsKCQl3cml0ZWlvKGYpOwoJCWZwcmlu dChpbywgIlxuLS0tJXNcbiIsIChjaGFyICopYnVmKTsKCX0KfQoKdm9pZApwYW5pYyhjaGFyICpz KQp7CglpbnQgd2FzZDsKCglpZighcGFuaWNraW5nKysgJiYgIXNldGptcChtYWlubG9vcCkpewoJ CXdhc2QgPSBkb3dubG9hZGVkOwoJCWRvd25sb2FkZWQgPSAwOwoJCWRwcmludCgic2FtOiBwYW5p YzogJXM6ICVyXG4iLCBzKTsKCQlpZih3YXNkKQoJCQlmcHJpbnQoMiwgInNhbTogcGFuaWM6ICVz OiAlclxuIiwgcyk7CgkJcmVzY3VlKCk7CgkJYWJvcnQoKTsKCX0KfQoKdm9pZApoaWNjb3VnaChj aGFyICpzKQp7CglGaWxlICpmOwoJaW50IGk7CgoJaWYocmVzY3VpbmcpCgkJZXhpdHMoInJlc2N1 ZSIpOwoJaWYocykKCQlkcHJpbnQoIiVzXG4iLCBzKTsKCXJlc2V0Y21kKCk7CglyZXNldHhlYygp OwoJcmVzZXRzeXMoKTsKCWlmKGlvID4gMCkKCQljbG9zZShpbyk7CgoJLyoKCSAqIGJhY2sgb3V0 IGFueSBsb2dnZWQgY2hhbmdlcyAmIHJlc3RvcmUgb2xkIHNlcXVlbmNlcwoJICovCglmb3IoaT0w OyBpPGZpbGUubnVzZWQ7IGkrKyl7CgkJZiA9IGZpbGUuZmlsZXBwdHJbaV07CgkJaWYoZj09Y21k KQoJCQljb250aW51ZTsKCQlpZihmLT5zZXE9PXNlcSl7CgkJCWJ1ZmRlbGV0ZSgmZi0+ZXBzaWxv biwgMCwgZi0+ZXBzaWxvbi5uYyk7CgkJCWYtPnNlcSA9IGYtPnByZXZzZXE7CgkJCWYtPmRvdC5y ID0gZi0+cHJldmRvdDsKCQkJZi0+bWFyayA9IGYtPnByZXZtYXJrOwoJCQlzdGF0ZShmLCBmLT5w cmV2bW9kID8gRGlydHk6IENsZWFuKTsKCQl9Cgl9CgoJdXBkYXRlKCk7CglpZiAoY3VyZmlsZSkg ewoJCWlmIChjdXJmaWxlLT51bnJlYWQpCgkJCWN1cmZpbGUtPnVucmVhZCA9IEZBTFNFOwoJCWVs c2UgaWYgKGRvd25sb2FkZWQpCgkJCW91dFRzKEhjdXJyZW50LCBjdXJmaWxlLT50YWcpOwoJfQoJ bG9uZ2ptcChtYWlubG9vcCwgMSk7Cn0KCnZvaWQKaW50cih2b2lkKQp7CgllcnJvcihFaW50cik7 Cn0KCnZvaWQKdHJ5dG9jbG9zZShGaWxlICpmKQp7CgljaGFyICp0OwoJY2hhciBidWZbMjU2XTsK CglpZihmID09IGNtZCkJLyogcG9zc2libGU/ICovCgkJcmV0dXJuOwoJaWYoZi0+ZGVsZXRlZCkK CQlyZXR1cm47CglpZihmaWxlaXNkaXJ0eShmKSAmJiAhZi0+Y2xvc2Vvayl7CgkJZi0+Y2xvc2Vv ayA9IFRSVUU7CgkJaWYoZi0+bmFtZS5zWzBdKXsKCQkJdCA9IFN0cnRvYygmZi0+bmFtZSk7CgkJ CXN0cm5jcHkoYnVmLCB0LCBzaXplb2YgYnVmLTEpOwoJCQlmcmVlKHQpOwoJCX1lbHNlCgkJCXN0 cmNweShidWYsICJuYW1lbGVzcyBmaWxlIik7CgkJZXJyb3JfcyhFbW9kaWZpZWQsIGJ1Zik7Cgl9 CglmLT5kZWxldGVkID0gVFJVRTsKfQoKdm9pZAp0cnl0b3F1aXQodm9pZCkKewoJaW50IGM7CglG aWxlICpmOwoKCWlmKCFxdWl0b2spewoJCWZvcihjID0gMDsgYzxmaWxlLm51c2VkOyBjKyspewoJ CQlmID0gZmlsZS5maWxlcHB0cltjXTsKCQkJaWYoZiE9Y21kICYmIGZpbGVpc2RpcnR5KGYpKXsK CQkJCXF1aXRvayA9IFRSVUU7CgkJCQllb2YgPSBGQUxTRTsKCQkJCWVycm9yKEVjaGFuZ2VzKTsK CQkJfQoJCX0KCX0KfQoKdm9pZApsb2FkKEZpbGUgKmYpCnsKCUFkZHJlc3Mgc2F2ZWFkZHI7CgoJ U3RyZHVwbHN0cigmZ2Vuc3RyLCAmZi0+bmFtZSk7CglmaWxlbmFtZShmKTsKCWlmKGYtPm5hbWUu c1swXSl7CgkJc2F2ZWFkZHIgPSBhZGRyOwoJCWVkaXQoZiwgJ0knKTsKCQlhZGRyID0gc2F2ZWFk ZHI7Cgl9ZWxzZXsKCQlmLT51bnJlYWQgPSAwOwoJCWYtPmNsZWFuc2VxID0gZi0+c2VxOwoJfQoK CWZpbGV1cGRhdGUoZiwgVFJVRSwgVFJVRSk7Cn0KCnZvaWQKY21kdXBkYXRlKHZvaWQpCnsKCWlm KGNtZCAmJiBjbWQtPnNlcSE9MCl7CgkJZmlsZXVwZGF0ZShjbWQsIEZBTFNFLCBkb3dubG9hZGVk KTsKCQljbWQtPmRvdC5yLnAxID0gY21kLT5kb3Quci5wMiA9IGNtZC0+VS5uYzsKCQl0ZWxsZG90 KGNtZCk7Cgl9Cn0KCnZvaWQKZGVsZXRlKEZpbGUgKmYpCnsKCWlmKGRvd25sb2FkZWQgJiYgZi0+ cmFzcCkKCQlvdXRUcyhIY2xvc2UsIGYtPnRhZyk7CglkZWxmaWxlKGYpOwoJaWYoZiA9PSBjdXJm aWxlKQoJCWN1cnJlbnQoMCk7Cn0KCnZvaWQKdXBkYXRlKHZvaWQpCnsKCWludCBpLCBhbnltb2Q7 CglGaWxlICpmOwoKCXNldHRlbXBmaWxlKCk7Cglmb3IoYW55bW9kID0gaT0wOyBpPHRlbXBmaWxl Lm51c2VkOyBpKyspewoJCWYgPSB0ZW1wZmlsZS5maWxlcHB0cltpXTsKCQlpZihmPT1jbWQpCS8q IGNtZCBnZXRzIGRvbmUgaW4gbWFpbigpICovCgkJCWNvbnRpbnVlOwoJCWlmKGYtPmRlbGV0ZWQp IHsKCQkJZGVsZXRlKGYpOwoJCQljb250aW51ZTsKCQl9CgkJaWYoZi0+c2VxPT1zZXEgJiYgZmls ZXVwZGF0ZShmLCBGQUxTRSwgZG93bmxvYWRlZCkpCgkJCWFueW1vZCsrOwoJCWlmKGYtPnJhc3Ap CgkJCXRlbGxkb3QoZik7Cgl9CglpZihhbnltb2QpCgkJc2VxKys7Cn0KCkZpbGUgKgpjdXJyZW50 KEZpbGUgKmYpCnsKCXJldHVybiBjdXJmaWxlID0gZjsKfQoKdm9pZAplZGl0KEZpbGUgKmYsIGlu dCBjbWQpCnsKCWludCBlbXB0eSA9IFRSVUU7CglQb3NuIHA7CglpbnQgbnVsbHM7CgoJaWYoY21k ID09ICdyJykKCQlsb2dkZWxldGUoZiwgYWRkci5yLnAxLCBhZGRyLnIucDIpOwoJaWYoY21kPT0n ZScgfHwgY21kPT0nSScpewoJCWxvZ2RlbGV0ZShmLCAoUG9zbikwLCBmLT5VLm5jKTsKCQlhZGRy LnIucDIgPSBmLT5VLm5jOwoJfWVsc2UgaWYoZi0+VS5uYyE9MCB8fCAoZi0+bmFtZS5zWzBdICYm IFN0cmNtcCgmZ2Vuc3RyLCAmZi0+bmFtZSkhPTApKQoJCWVtcHR5ID0gRkFMU0U7CglpZigoaW8g PSBvcGVuKGdlbmMsIE9SRUFEKSk8MCkgewoJCWlmIChjdXJmaWxlICYmIGN1cmZpbGUtPnVucmVh ZCkKCQkJY3VyZmlsZS0+dW5yZWFkID0gRkFMU0U7CgkJZXJyb3JfcyhFb3BlbiwgZ2VuYyk7Cgl9 CglwID0gcmVhZGlvKGYsICZudWxscywgZW1wdHksIFRSVUUpOwoJY2xvc2VpbygoY21kPT0nZScg fHwgY21kPT0nSScpPyAtMSA6IHApOwoJaWYoY21kID09ICdyJykKCQlmLT5uZG90LnIucDEgPSBh ZGRyLnIucDIsIGYtPm5kb3Quci5wMiA9IGFkZHIuci5wMitwOwoJZWxzZQoJCWYtPm5kb3Quci5w MSA9IGYtPm5kb3Quci5wMiA9IDA7CglmLT5jbG9zZW9rID0gZW1wdHk7CglpZiAocXVpdG9rKQoJ CXF1aXRvayA9IGVtcHR5OwoJZWxzZQoJCXF1aXRvayA9IEZBTFNFOwoJc3RhdGUoZiwgZW1wdHkg JiYgIW51bGxzPyBDbGVhbiA6IERpcnR5KTsKCWlmKGVtcHR5ICYmICFudWxscykKCQlmLT5jbGVh bnNlcSA9IGYtPnNlcTsKCWlmKGNtZCA9PSAnZScpCgkJZmlsZW5hbWUoZik7Cn0KCmludApnZXRu YW1lKEZpbGUgKmYsIFN0cmluZyAqcywgaW50IHNhdmUpCnsKCWludCBjLCBpOwoKCVN0cnplcm8o JmdlbnN0cik7CglpZihnZW5jKXsKCQlmcmVlKGdlbmMpOwoJCWdlbmMgPSAwOwoJfQoJaWYocz09 MCB8fCAoYyA9IHMtPnNbMF0pPT0wKXsJCS8qIG5vIG5hbWUgcHJvdmlkZWQgKi8KCQlpZihmKQoJ CQlTdHJkdXBsc3RyKCZnZW5zdHIsICZmLT5uYW1lKTsKCQlnb3RvIFJldHVybjsKCX0KCWlmKGMh PScgJyAmJiBjIT0nXHQnKQoJCWVycm9yKEVibGFuayk7Cglmb3IoaT0wOyAoYz1zLT5zW2ldKT09 JyAnIHx8IGM9PSdcdCc7IGkrKykKCQk7Cgl3aGlsZShzLT5zW2ldID4gJyAnKQoJCVN0cmFkZGMo JmdlbnN0ciwgcy0+c1tpKytdKTsKCWlmKHMtPnNbaV0pCgkJZXJyb3IoRW5ld2xpbmUpOwoJZml4 bmFtZSgmZ2Vuc3RyKTsKCWlmKGYgJiYgKHNhdmUgfHwgZi0+bmFtZS5zWzBdPT0wKSl7CgkJbG9n c2V0bmFtZShmLCAmZ2Vuc3RyKTsKCQlpZihTdHJjbXAoJmYtPm5hbWUsICZnZW5zdHIpKXsKCQkJ cXVpdG9rID0gZi0+Y2xvc2VvayA9IEZBTFNFOwoJCQlmLT5xaWRwYXRoID0gMDsKCQkJZi0+bXRp bWUgPSAwOwoJCQlzdGF0ZShmLCBEaXJ0eSk7IC8qIGlmIGl0J3MgJ2UnLCBmaXggbGF0ZXIgKi8K CQl9Cgl9CiAgICBSZXR1cm46CglnZW5jID0gU3RydG9jKCZnZW5zdHIpOwoJaSA9IGdlbnN0ci5u OwoJaWYoaSAmJiBnZW5zdHIuc1tpLTFdPT0wKQoJCWktLTsKCXJldHVybiBpOwkvKiBzdHJsZW4o bmFtZSkgKi8KfQoKdm9pZApmaWxlbmFtZShGaWxlICpmKQp7CglpZihnZW5jKQoJCWZyZWUoZ2Vu Yyk7CglnZW5jID0gU3RydG9jKCZnZW5zdHIpOwoJZHByaW50KCIlYyVjJWMgJXNcbiIsICIgJyJb Zi0+bW9kXSwKCQkiLSsiW2YtPnJhc3AhPTBdLCAiIC4iW2Y9PWN1cmZpbGVdLCBnZW5jKTsKfQoK dm9pZAp1bmRvc3RlcChGaWxlICpmLCBpbnQgaXN1bmRvKQp7Cgl1aW50IHAxLCBwMjsKCWludCBt b2Q7CgoJbW9kID0gZi0+bW9kOwoJZmlsZXVuZG8oZiwgaXN1bmRvLCAxLCAmcDEsICZwMiwgVFJV RSk7CglmLT5uZG90ID0gZi0+ZG90OwoJaWYoZi0+bW9kKXsKCQlmLT5jbG9zZW9rID0gMDsKCQlx dWl0b2sgPSAwOwoJfWVsc2UKCQlmLT5jbG9zZW9rID0gMTsKCglpZihmLT5tb2QgIT0gbW9kKXsK CQlmLT5tb2QgPSBtb2Q7CgkJaWYobW9kKQoJCQltb2QgPSBDbGVhbjsKCQllbHNlCgkJCW1vZCA9 IERpcnR5OwoJCXN0YXRlKGYsIG1vZCk7Cgl9Cn0KCmludAp1bmRvKGludCBpc3VuZG8pCnsKCUZp bGUgKmY7CglpbnQgaTsKCU1vZCBtYXg7CgoJbWF4ID0gdW5kb3NlcShjdXJmaWxlLCBpc3VuZG8p OwoJaWYobWF4ID09IDApCgkJcmV0dXJuIDA7CglzZXR0ZW1wZmlsZSgpOwoJZm9yKGkgPSAwOyBp PHRlbXBmaWxlLm51c2VkOyBpKyspewoJCWYgPSB0ZW1wZmlsZS5maWxlcHB0cltpXTsKCQlpZihm IT1jbWQgJiYgdW5kb3NlcShmLCBpc3VuZG8pPT1tYXgpCgkJCXVuZG9zdGVwKGYsIGlzdW5kbyk7 Cgl9CglyZXR1cm4gMTsKfQoKaW50CnJlYWRjbWQoU3RyaW5nICpzKQp7CglpbnQgcmV0Y29kZTsK CglpZihmbGlzdCAhPSAwKQoJCWZpbGVjbG9zZShmbGlzdCk7CglmbGlzdCA9IGZpbGVvcGVuKCk7 CgoJYWRkci5yLnAxID0gMCwgYWRkci5yLnAyID0gZmxpc3QtPlUubmM7CglyZXRjb2RlID0gcGxh bjkoZmxpc3QsICc8JywgcywgRkFMU0UpOwoJZmlsZXVwZGF0ZShmbGlzdCwgRkFMU0UsIEZBTFNF KTsKCWZsaXN0LT5zZXEgPSAwOwoJaWYgKGZsaXN0LT5VLm5jID4gQkxPQ0tTSVpFKQoJCWVycm9y KEV0b29sb25nKTsKCVN0cnplcm8oJmdlbnN0cik7CglTdHJpbnN1cmUoJmdlbnN0ciwgZmxpc3Qt PlUubmMpOwoJYnVmcmVhZCgmZmxpc3QtPlUsIChQb3NuKTAsIGdlbmJ1ZiwgZmxpc3QtPlUubmMp OwoJbWVtbW92ZShnZW5zdHIucywgZ2VuYnVmLCBmbGlzdC0+VS5uYypSVU5FU0laRSk7CglnZW5z dHIubiA9IGZsaXN0LT5VLm5jOwoJU3RyYWRkYygmZ2Vuc3RyLCAnXDAnKTsKCXJldHVybiByZXRj b2RlOwp9Cgp2b2lkCmdldGN1cndkKHZvaWQpCnsKCVN0cmluZyAqdDsKCWNoYXIgYnVmWzI1Nl07 CgoJYnVmWzBdID0gMDsKCWdldHdkKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJdCA9IHRtcGNzdHIoYnVm KTsKCVN0cmR1cGxzdHIoJmN1cndkLCB0KTsKCWZyZWV0bXBzdHIodCk7CglpZihjdXJ3ZC5uID09 IDApCgkJd2FybihXcHdkKTsKCWVsc2UgaWYoY3Vyd2Quc1tjdXJ3ZC5uLTFdICE9ICcvJykKCQlT dHJhZGRjKCZjdXJ3ZCwgJy8nKTsKfQoKdm9pZApjZChTdHJpbmcgKnN0cikKewoJaW50IGksIGZk OwoJY2hhciAqczsKCUZpbGUgKmY7CglTdHJpbmcgb3dkOwoKCWdldGN1cndkKCk7CglpZihnZXRu YW1lKChGaWxlICopMCwgc3RyLCBGQUxTRSkpCgkJcyA9IGdlbmM7CgllbHNlCgkJcyA9IGhvbWU7 CglpZihjaGRpcihzKSkKCQlzeXNlcnJvcigiY2hkaXIiKTsKCWZkID0gb3BlbigiL2Rldi93ZGly IiwgT1dSSVRFKTsKCWlmKGZkID4gMCkKCQl3cml0ZShmZCwgcywgc3RybGVuKHMpKTsKCWRwcmlu dCgiIVxuIik7CglTdHJpbml0KCZvd2QpOwoJU3RyZHVwbHN0cigmb3dkLCAmY3Vyd2QpOwoJZ2V0 Y3Vyd2QoKTsKCXNldHRlbXBmaWxlKCk7Cglmb3IoaT0wOyBpPHRlbXBmaWxlLm51c2VkOyBpKysp ewoJCWYgPSB0ZW1wZmlsZS5maWxlcHB0cltpXTsKCQlpZihmIT1jbWQgJiYgZi0+bmFtZS5zWzBd IT0nLycgJiYgZi0+bmFtZS5zWzBdIT0wKXsKCQkJU3RyaW5zZXJ0KCZmLT5uYW1lLCAmb3dkLCAo UG9zbikwKTsKCQkJZml4bmFtZSgmZi0+bmFtZSk7CgkJCXNvcnRuYW1lKGYpOwoJCX1lbHNlIGlm KGYgIT0gY21kICYmIFN0cmlzcHJlKCZjdXJ3ZCwgJmYtPm5hbWUpKXsKCQkJZml4bmFtZSgmZi0+ bmFtZSk7CgkJCXNvcnRuYW1lKGYpOwoJCX0KCX0KCVN0cmNsb3NlKCZvd2QpOwp9CgppbnQKbG9h ZGZsaXN0KFN0cmluZyAqcykKewoJaW50IGMsIGk7CgoJYyA9IHMtPnNbMF07Cglmb3IoaSA9IDA7 IHMtPnNbaV09PScgJyB8fCBzLT5zW2ldPT0nXHQnOyBpKyspCgkJOwoJaWYoKGM9PScgJyB8fCBj PT0nXHQnKSAmJiBzLT5zW2ldIT0nXG4nKXsKCQlpZihzLT5zW2ldPT0nPCcpewoJCQlTdHJkZWxl dGUocywgMEwsIChsb25nKWkrMSk7CgkJCXJlYWRjbWQocyk7CgkJfWVsc2V7CgkJCVN0cnplcm8o JmdlbnN0cik7CgkJCXdoaWxlKChjID0gcy0+c1tpKytdKSAmJiBjIT0nXG4nKQoJCQkJU3RyYWRk YygmZ2Vuc3RyLCBjKTsKCQkJU3RyYWRkYygmZ2Vuc3RyLCAnXDAnKTsKCQl9Cgl9ZWxzZXsKCQlp ZihjICE9ICdcbicpCgkJCWVycm9yKEVibGFuayk7CgkJU3RyZHVwbCgmZ2Vuc3RyLCBlbXB0eSk7 Cgl9CglpZihnZW5jKQoJCWZyZWUoZ2VuYyk7CglnZW5jID0gU3RydG9jKCZnZW5zdHIpOwoJcmV0 dXJuIGdlbnN0ci5zWzBdOwp9CgpGaWxlICoKcmVhZGZsaXN0KGludCByZWFkYWxsLCBpbnQgZGVs ZXRlKQp7CglQb3NuIGk7CglpbnQgYzsKCUZpbGUgKmY7CglTdHJpbmcgdDsKCglTdHJpbml0KCZ0 KTsKCWZvcihpPTAsZj0wOyBmPT0wIHx8IHJlYWRhbGwgfHwgZGVsZXRlOyBpKyspewkvKiArKyBz a2lwcyBibGFuayAqLwoJCVN0cmRlbGV0ZSgmZ2Vuc3RyLCAoUG9zbikwLCBpKTsKCQlmb3IoaT0w OyAoYyA9IGdlbnN0ci5zW2ldKT09JyAnIHx8IGM9PSdcdCcgfHwgYz09J1xuJzsgaSsrKQoJCQk7 CgkJaWYoaSA+PSBnZW5zdHIubikKCQkJYnJlYWs7CgkJU3RyZGVsZXRlKCZnZW5zdHIsIChQb3Nu KTAsIGkpOwoJCWZvcihpPTA7IChjPWdlbnN0ci5zW2ldKSAmJiBjIT0nICcgJiYgYyE9J1x0JyAm JiBjIT0nXG4nOyBpKyspCgkJCTsKCgkJaWYoaSA9PSAwKQoJCQlicmVhazsKCQlnZW5zdHIuc1tp XSA9IDA7CgkJU3RyZHVwbHN0cigmdCwgdG1wcnN0cihnZW5zdHIucywgaSsxKSk7CgkJZml4bmFt ZSgmdCk7CgkJZiA9IGxvb2tmaWxlKCZ0KTsKCQlpZihkZWxldGUpewoJCQlpZihmID09IDApCgkJ CQl3YXJuX1MoV2ZpbGUsICZ0KTsKCQkJZWxzZQoJCQkJdHJ5dG9jbG9zZShmKTsKCQl9ZWxzZSBp ZihmPT0wICYmIHJlYWRhbGwpCgkJCWxvZ3NldG5hbWUoZiA9IG5ld2ZpbGUoKSwgJnQpOwoJfQoJ U3RyY2xvc2UoJnQpOwoJcmV0dXJuIGY7Cn0KCkZpbGUgKgp0b2ZpbGUoU3RyaW5nICpzKQp7CglG aWxlICpmOwoKCWlmKHMtPnNbMF0gIT0gJyAnKQoJCWVycm9yKEVibGFuayk7CglpZihsb2FkZmxp c3QocykgPT0gMCl7CgkJZiA9IGxvb2tmaWxlKCZnZW5zdHIpOwkvKiBlbXB0eSBzdHJpbmcgPT0+ IG5hbWVsZXNzIGZpbGUgKi8KCQlpZihmID09IDApCgkJCWVycm9yX3MoRW1lbnUsIGdlbmMpOwoJ fWVsc2UgaWYoKGY9cmVhZGZsaXN0KEZBTFNFLCBGQUxTRSkpID09IDApCgkJZXJyb3JfcyhFbWVu dSwgZ2VuYyk7CglyZXR1cm4gY3VycmVudChmKTsKfQoKRmlsZSAqCmdldGZpbGUoU3RyaW5nICpz KQp7CglGaWxlICpmOwoKCWlmKGxvYWRmbGlzdChzKSA9PSAwKQoJCWxvZ3NldG5hbWUoZiA9IG5l d2ZpbGUoKSwgJmdlbnN0cik7CgllbHNlIGlmKChmPXJlYWRmbGlzdChUUlVFLCBGQUxTRSkpID09 IDApCgkJZXJyb3IoRWJsYW5rKTsKCXJldHVybiBjdXJyZW50KGYpOwp9Cgp2b2lkCmNsb3NlZmls ZXMoRmlsZSAqZiwgU3RyaW5nICpzKQp7CglpZihzLT5zWzBdID09IDApewoJCWlmKGYgPT0gMCkK CQkJZXJyb3IoRW5vZmlsZSk7CgkJdHJ5dG9jbG9zZShmKTsKCQlyZXR1cm47Cgl9CglpZihzLT5z WzBdICE9ICcgJykKCQllcnJvcihFYmxhbmspOwoJaWYobG9hZGZsaXN0KHMpID09IDApCgkJZXJy b3IoRW5ld2xpbmUpOwoJcmVhZGZsaXN0KEZBTFNFLCBUUlVFKTsKfQoKdm9pZApjb3B5KEZpbGUg KmYsIEFkZHJlc3MgYWRkcjIpCnsKCVBvc24gcDsKCWludCBuaTsKCWZvcihwPWFkZHIuci5wMTsg cDxhZGRyLnIucDI7IHArPW5pKXsKCQluaSA9IGFkZHIuci5wMi1wOwoJCWlmKG5pID4gQkxPQ0tT SVpFKQoJCQluaSA9IEJMT0NLU0laRTsKCQlidWZyZWFkKCZmLT5VLCBwLCBnZW5idWYsIG5pKTsK CQlsb2dpbnNlcnQoYWRkcjIuZiwgYWRkcjIuci5wMiwgdG1wcnN0cihnZW5idWYsIG5pKS0+cywg bmkpOwoJfQoJYWRkcjIuZi0+bmRvdC5yLnAyID0gYWRkcjIuci5wMisoZi0+ZG90LnIucDItZi0+ ZG90LnIucDEpOwoJYWRkcjIuZi0+bmRvdC5yLnAxID0gYWRkcjIuci5wMjsKfQoKdm9pZAptb3Zl KEZpbGUgKmYsIEFkZHJlc3MgYWRkcjIpCnsKCWlmKGFkZHIuci5wMiA8PSBhZGRyMi5yLnAyKXsK CQlsb2dkZWxldGUoZiwgYWRkci5yLnAxLCBhZGRyLnIucDIpOwoJCWNvcHkoZiwgYWRkcjIpOwoJ fWVsc2UgaWYoYWRkci5yLnAxID49IGFkZHIyLnIucDIpewoJCWNvcHkoZiwgYWRkcjIpOwoJCWxv Z2RlbGV0ZShmLCBhZGRyLnIucDEsIGFkZHIuci5wMik7Cgl9ZWxzZQoJCWVycm9yKEVvdmVybGFw KTsKfQoKUG9zbgpubGNvdW50KEZpbGUgKmYsIFBvc24gcDAsIFBvc24gcDEpCnsKCVBvc24gbmwg PSAwOwoKCXdoaWxlKHAwIDwgcDEpCgkJaWYoZmlsZXJlYWRjKGYsIHAwKyspPT0nXG4nKQoJCQlu bCsrOwoJcmV0dXJuIG5sOwp9Cgp2b2lkCnByaW50cG9zbihGaWxlICpmLCBpbnQgY2hhcnNvbmx5 KQp7CglQb3NuIGwxLCBsMjsKCglpZighY2hhcnNvbmx5KXsKCQlsMSA9IDErbmxjb3VudChmLCAo UG9zbikwLCBhZGRyLnIucDEpOwoJCWwyID0gbDErbmxjb3VudChmLCBhZGRyLnIucDEsIGFkZHIu ci5wMik7CgkJLyogY2hlY2sgaWYgYWRkciBlbmRzIHdpdGggJ1xuJyAqLwoJCWlmKGFkZHIuci5w Mj4wICYmIGFkZHIuci5wMj5hZGRyLnIucDEgJiYgZmlsZXJlYWRjKGYsIGFkZHIuci5wMi0xKT09 J1xuJykKCQkJLS1sMjsKCQlkcHJpbnQoIiVsdWQiLCBsMSk7CgkJaWYobDIgIT0gbDEpCgkJCWRw cmludCgiLCVsdWQiLCBsMik7CgkJZHByaW50KCI7ICIpOwoJfQoJZHByaW50KCIjJWx1ZCIsIGFk ZHIuci5wMSk7CglpZihhZGRyLnIucDIgIT0gYWRkci5yLnAxKQoJCWRwcmludCgiLCMlbHVkIiwg YWRkci5yLnAyKTsKCWRwcmludCgiXG4iKTsKfQoKdm9pZApzZXR0ZW1wZmlsZSh2b2lkKQp7Cglp Zih0ZW1wZmlsZS5uYWxsb2MgPCBmaWxlLm51c2VkKXsKCQlmcmVlKHRlbXBmaWxlLmxpc3RwdHIp OwoJCXRlbXBmaWxlLmxpc3RwdHIgPSBlbWFsbG9jKHNpemVvZigqdGVtcGZpbGUuZmlsZXBwdHIp KmZpbGUubnVzZWQpOwoJCXRlbXBmaWxlLm5hbGxvYyA9IGZpbGUubnVzZWQ7Cgl9Cgl0ZW1wZmls ZS5udXNlZCA9IGZpbGUubnVzZWQ7CgltZW1tb3ZlKCZ0ZW1wZmlsZS5maWxlcHB0clswXSwgJmZp bGUuZmlsZXBwdHJbMF0sIGZpbGUubnVzZWQqc2l6ZW9mKEZpbGUqKSk7Cn0KAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzYW0yay9zYW0vc2FtLmgAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDEwMDY0NAAwMDAxNzM3ADAwMDAxNTEAMDAwMDAwMjI1MjMAMDcxMTE2 MzU2NTAAMDAxNDUwMQAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyADAwc2Nod2FydHoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnY3NlAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAwMDAwNDAAMDAwMDAyNwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNpbmNsdWRlIDx1Lmg+CiNpbmNsdWRlIDxsaWJj Lmg+CiNpbmNsdWRlIDxwbHVtYi5oPgojaW5jbHVkZSAiZXJyb3JzLmgiCgovKgogKiBCTE9DS1NJ WkUgaXMgcmVsYXRpdmVseSBzbWFsbCB0byBrZWVwIG1lbW9yeSBjb25zdW1wdGlvbiBkb3duLgog Ki8KCiNkZWZpbmUJQkxPQ0tTSVpFCTIwNDgKI2RlZmluZQlSVU5FU0laRQlzaXplb2YoUnVuZSkK I2RlZmluZQlORElTQwkJNQojZGVmaW5lCU5CVUZGSUxFUwkzKzIqTkRJU0MJLyogcGxhbiA5K3Vu ZG8rc25hcmYrTkRJU0MqKHRyYW5zY3JpcHQrYnVmKSAqLwojZGVmaW5lIE5TVUJFWFAJMTAKCiNk ZWZpbmUJVFJVRQkJMQojZGVmaW5lCUZBTFNFCQkwCgojZGVmaW5lCUlORklOSVRZCTB4N0ZGRkZG RkZMCiNkZWZpbmUJSU5DUgkJMjUKI2RlZmluZQlTVFJTSVpFCQkoMipCTE9DS1NJWkUpCgp0eXBl ZGVmIGxvbmcJCVBvc247CQkvKiBmaWxlIHBvc2l0aW9uIG9yIGFkZHJlc3MgKi8KdHlwZWRlZgl1 c2hvcnQJCU1vZDsJCS8qIG1vZGlmaWNhdGlvbiBudW1iZXIgKi8KCnR5cGVkZWYgc3RydWN0IEFk ZHJlc3MJQWRkcmVzczsKdHlwZWRlZiBzdHJ1Y3QgQmxvY2sJQmxvY2s7CnR5cGVkZWYgc3RydWN0 IEJ1ZmZlcglCdWZmZXI7CnR5cGVkZWYgc3RydWN0IERpc2sJRGlzazsKdHlwZWRlZiBzdHJ1Y3Qg RGlzY2Rlc2MJRGlzY2Rlc2M7CnR5cGVkZWYgc3RydWN0IEZpbGUJRmlsZTsKdHlwZWRlZiBzdHJ1 Y3QgTGlzdAlMaXN0Owp0eXBlZGVmIHN0cnVjdCBSYW5nZQlSYW5nZTsKdHlwZWRlZiBzdHJ1Y3Qg UmFuZ2VzZXQJUmFuZ2VzZXQ7CnR5cGVkZWYgc3RydWN0IFN0cmluZwlTdHJpbmc7CgplbnVtIFN0 YXRlCnsKCUNsZWFuID0JCScgJywKCURpcnR5ID0JCSdcJycsCglVbnJlYWQgPQknLScgCn07Cgpz dHJ1Y3QgUmFuZ2UKewoJUG9zbglwMSwgcDI7Cn07CgpzdHJ1Y3QgUmFuZ2VzZXQKewoJUmFuZ2UJ cFtOU1VCRVhQXTsKfTsKCnN0cnVjdCBBZGRyZXNzCnsKCVJhbmdlCXI7CglGaWxlCSpmOwp9OwoK c3RydWN0IFN0cmluZwp7CglzaG9ydAluOwoJc2hvcnQJc2l6ZTsKCVJ1bmUJKnM7Cn07CgpzdHJ1 Y3QgTGlzdAkvKiBjb2RlIGRlcGVuZHMgb24gYSBsb25nIGJlaW5nIGFibGUgdG8gaG9sZCBhIHBv aW50ZXIgKi8KewoJaW50CW5hbGxvYzsKCWludAludXNlZDsKCXVuaW9uewoJCXZvaWQJKmxpc3Rw OwoJCUJsb2NrCSpibGtwOwoJCWxvbmcJKmxvbmdwOwoJCXVjaGFyKgkqdWNoYXJwOwoJCVN0cmlu ZyoJKnN0cmluZ3A7CgkJRmlsZSoJKmZpbGVwOwoJCWxvbmcJbGlzdHY7Cgl9ZzsKfTsKCiNkZWZp bmUJbGlzdHB0cgkJZy5saXN0cAojZGVmaW5lCWJsa3B0cgkJZy5ibGtwCiNkZWZpbmUJbG9uZ3B0 cgkJZy5sb25ncAojZGVmaW5lCXVjaGFycHB0cglnLnVjaGFycAojZGVmaW5lCXN0cmluZ3BwdHIJ Zy5zdHJpbmdwCiNkZWZpbmUJZmlsZXBwdHIJZy5maWxlcAojZGVmaW5lCWxpc3R2YWwJCWcubGlz dHYKCmVudW0KewoJQmxvY2tpbmNyID0JMjU2LAoJTWF4YmxvY2sgPSAJOCoxMDI0LAoKCUJVRlNJ WkUgPSBNYXhibG9jaywJLyogc2l6ZSBmcm9tIGZidWZhbGxvYygpICovCglSQlVGU0laRSA9IEJV RlNJWkUvc2l6ZW9mKFJ1bmUpIAp9OwoKCmVudW0KewoJTnVsbAkJPSAnLScsCglEZWxldGUJCT0g J2QnLAoJSW5zZXJ0CQk9ICdpJywKCUZpbGVuYW1lCT0gJ2YnLAoJRG90CQk9ICdEJywKCU1hcmsJ CT0gJ20nIAp9OwoKc3RydWN0IEJsb2NrCnsKCXVpbnQJCWFkZHI7CS8qIGRpc2sgYWRkcmVzcyBp biBieXRlcyAqLwoJdW5pb24KCXsKCQl1aW50CW47CS8qIG51bWJlciBvZiB1c2VkIHJ1bmVzIGlu IGJsb2NrICovCgkJQmxvY2sJKm5leHQ7CS8qIHBvaW50ZXIgdG8gbmV4dCBpbiBmcmVlIGxpc3Qg Ki8KCX0gVTsKfTsKCnN0cnVjdCBEaXNrCnsKCWludAkJZmQ7Cgl1aW50CQlhZGRyOwkvKiBsZW5n dGggb2YgdGVtcCBmaWxlICovCglCbG9jawkJKmZyZWVbTWF4YmxvY2svQmxvY2tpbmNyKzFdOwp9 OwoKRGlzayoJCWRpc2tpbml0KHZvaWQpOwpCbG9jayoJCWRpc2tuZXdibG9jayhEaXNrKiwgdWlu dCk7CnZvaWQJCWRpc2tyZWxlYXNlKERpc2sqLCBCbG9jayopOwp2b2lkCQlkaXNrcmVhZChEaXNr KiwgQmxvY2sqLCBSdW5lKiwgdWludCk7CnZvaWQJCWRpc2t3cml0ZShEaXNrKiwgQmxvY2sqKiwg UnVuZSosIHVpbnQpOwoKc3RydWN0IEJ1ZmZlcgp7Cgl1aW50CQluYzsKCVJ1bmUJCSpjOwkvKiBj YWNoZSAqLwoJdWludAkJY25jOwkvKiBieXRlcyBpbiBjYWNoZSAqLwoJdWludAkJY21heDsJLyog c2l6ZSBvZiBhbGxvY2F0ZWQgY2FjaGUgKi8KCXVpbnQJCWNxOwkvKiBwb3NpdGlvbiBvZiBjYWNo ZSAqLwoJaW50CQljZGlydHk7CS8qIGNhY2hlIG5lZWRzIHRvIGJlIHdyaXR0ZW4gKi8KCXVpbnQJ CWNiaTsJLyogaW5kZXggb2YgY2FjaGUgQmxvY2sgKi8KCUJsb2NrCQkqKmJsOwkvKiBhcnJheSBv ZiBibG9ja3MgKi8KCXVpbnQJCW5ibDsJLyogbnVtYmVyIG9mIGJsb2NrcyAqLwp9Owp2b2lkCQli dWZpbnNlcnQoQnVmZmVyKiwgdWludCwgUnVuZSosIHVpbnQpOwp2b2lkCQlidWZkZWxldGUoQnVm ZmVyKiwgdWludCwgdWludCk7CnVpbnQJCWJ1ZmxvYWQoQnVmZmVyKiwgdWludCwgaW50LCBpbnQq KTsKdm9pZAkJYnVmcmVhZChCdWZmZXIqLCB1aW50LCBSdW5lKiwgdWludCk7CnZvaWQJCWJ1ZmNs b3NlKEJ1ZmZlciopOwp2b2lkCQlidWZyZXNldChCdWZmZXIqKTsKCnN0cnVjdCBGaWxlCnsKCUJ1 ZmZlciBVOwkJCS8qIHRoZSBkYXRhICovCglCdWZmZXIJCWRlbHRhOwkJLyogdHJhbnNjcmlwdCBv ZiBjaGFuZ2VzICovCglCdWZmZXIJCWVwc2lsb247CS8qIGludmVyc2lvbiBvZiBkZWx0YSBmb3Ig cmVkbyAqLwoJU3RyaW5nCQluYW1lOwkJLyogbmFtZSBvZiBhc3NvY2lhdGVkIGZpbGUgKi8KCXVp bnQJCXFpZHBhdGg7CS8qIG9mIGZpbGUgd2hlbiByZWFkICovCgl1aW50CQltdGltZTsJCS8qIG9m IGZpbGUgd2hlbiByZWFkICovCglpbnQJCWRldjsJCS8qIG9mIGZpbGUgd2hlbiByZWFkICovCglp bnQJCXVucmVhZDsJCS8qIGZpbGUgaGFzIG5vdCBiZWVuIHJlYWQgZnJvbSBkaXNrICovCgoJbG9u ZwkJc2VxOwkJLyogaWYgc2VxPT0wLCBGaWxlIGFjdHMgbGlrZSBCdWZmZXIgKi8KCWxvbmcJCWNs ZWFuc2VxOwkvKiBmLT5zZXEgYXQgbGFzdCByZWFkL3dyaXRlIG9mIGZpbGUgKi8KCWludAkJbW9k OwkJLyogZmlsZSBhcHBlYXJzIG1vZGlmaWVkIGluIG1lbnUgKi8KCWNoYXIJCXJlc2N1aW5nOwkv KiBzYW0gZXhpdGluZzsgdGhpcyBmaWxlIHVudXNhYmxlICovCgovLwlUZXh0CQkqY3VydGV4dDsJ LyogbW9zdCByZWNlbnRseSB1c2VkIGFzc29jaWF0ZWQgdGV4dCAqLwovLwlUZXh0CQkqKnRleHQ7 CQkvKiBsaXN0IG9mIGFzc29jaWF0ZWQgdGV4dHMgKi8KLy8JaW50CQludGV4dDsKLy8JaW50CQlk dW1waWQ7CQkvKiB1c2VkIGluIGR1bXBpbmcgemVyb3hlZCB3aW5kb3dzICovCgoJUG9zbgkJaGlw b3NuOwkJLyogaGlnaGVzdCBhZGRyZXNzIHRvdWNoZWQgdGhpcyBNb2QgKi8KCUFkZHJlc3MJCWRv dDsJCS8qIGN1cnJlbnQgcG9zaXRpb24gKi8KCUFkZHJlc3MJCW5kb3Q7CQkvKiBuZXcgY3VycmVu dCBwb3NpdGlvbiBhZnRlciB1cGRhdGUgKi8KCVJhbmdlCQl0ZG90OwkJLyogd2hhdCB0ZXJtaW5h bCB0aGlua3MgaXMgY3VycmVudCByYW5nZSAqLwoJUmFuZ2UJCW1hcms7CQkvKiB0YWdnZWQgc3Bv dCBpbiB0ZXh0IChkb24ndCBjb25mdXNlIHdpdGggTWFyaykgKi8KCUxpc3QJCSpyYXNwOwkJLyog bWFwIG9mIHdoYXQgdGVybWluYWwncyBnb3QgKi8KCXNob3J0CQl0YWc7CQkvKiBmb3IgY29tbXVu aWNhdGluZyB3aXRoIHRlcm1pbmFsICovCgljaGFyCQljbG9zZW9rOwkvKiBvayB0byBjbG9zZSBm aWxlPyAqLwoJY2hhcgkJZGVsZXRlZDsJLyogZGVsZXRlIGF0IGNvbXBsZXRpb24gb2YgY29tbWFu ZCAqLwoJUmFuZ2UJCXByZXZkb3Q7CS8qIHN0YXRlIGJlZm9yZSBzdGFydCBvZiBjaGFuZ2UgKi8K CVJhbmdlCQlwcmV2bWFyazsKCWxvbmcJCXByZXZzZXE7CglpbnQJCXByZXZtb2Q7Cn07Ci8vRmls ZSoJCWZpbGVhZGR0ZXh0KEZpbGUqLCBUZXh0Kik7CnZvaWQJCWZpbGVjbG9zZShGaWxlKik7CnZv aWQJCWZpbGVkZWxldGUoRmlsZSosIHVpbnQsIHVpbnQpOwovL3ZvaWQJCWZpbGVkZWx0ZXh0KEZp bGUqLCBUZXh0Kik7CnZvaWQJCWZpbGVpbnNlcnQoRmlsZSosIHVpbnQsIFJ1bmUqLCB1aW50KTsK dWludAkJZmlsZWxvYWQoRmlsZSosIHVpbnQsIGludCwgaW50Kik7CnZvaWQJCWZpbGVtYXJrKEZp bGUqKTsKdm9pZAkJZmlsZXJlc2V0KEZpbGUqKTsKdm9pZAkJZmlsZXNldG5hbWUoRmlsZSosIFN0 cmluZyopOwp2b2lkCQlmaWxldW5kZWxldGUoRmlsZSosIEJ1ZmZlciosIHVpbnQsIHVpbnQpOwp2 b2lkCQlmaWxldW5pbnNlcnQoRmlsZSosIEJ1ZmZlciosIHVpbnQsIHVpbnQpOwp2b2lkCQlmaWxl dW5zZXRuYW1lKEZpbGUqLCBCdWZmZXIqKTsKdm9pZAkJZmlsZXVuZG8oRmlsZSosIGludCwgaW50 LCB1aW50KiwgdWludCosIGludCk7CmludAkJZmlsZXVwZGF0ZShGaWxlKiwgaW50LCBpbnQpOwoK aW50CQlmaWxlcmVhZGMoRmlsZSosIHVpbnQpOwpGaWxlCQkqZmlsZW9wZW4odm9pZCk7CnZvaWQJ CWxvZ2luc2VydChGaWxlKiwgdWludCwgUnVuZSosIHVpbnQpOwp2b2lkCQlsb2dkZWxldGUoRmls ZSosIHVpbnQsIHVpbnQpOwp2b2lkCQlsb2dzZXRuYW1lKEZpbGUqLCBTdHJpbmcqKTsKaW50CQlm aWxlaXNkaXJ0eShGaWxlKik7CmxvbmcJCXVuZG9zZXEoRmlsZSosIGludCk7CmxvbmcJCXByZXZz ZXEoQnVmZmVyKik7Cgp2b2lkCQlyYXNwbG9hZChGaWxlKik7CnZvaWQJCXJhc3BzdGFydChGaWxl Kik7CnZvaWQJCXJhc3BkZWxldGUoRmlsZSosIHVpbnQsIHVpbnQsIGludCk7CnZvaWQJCXJhc3Bp bnNlcnQoRmlsZSosIHVpbnQsIFJ1bmUqLCB1aW50LCBpbnQpOwp2b2lkCQlyYXNwZG9uZShGaWxl KiwgaW50KTsKCi8qCiAqIGFjbWUgZm5zCiAqLwp2b2lkKglmYnVmYWxsb2Modm9pZCk7CnZvaWQJ ZmJ1ZmZyZWUodm9pZCopOwp1aW50CW1pbih1aW50LCB1aW50KTsKdm9pZAljdnR0b3J1bmVzKGNo YXIqLCBpbnQsIFJ1bmUqLCBpbnQqLCBpbnQqLCBpbnQqKTsKCiNkZWZpbmUJcnVuZW1hbGxvYyhh KQkJKFJ1bmUqKWVtYWxsb2MoKGEpKnNpemVvZihSdW5lKSkKI2RlZmluZQlydW5lcmVhbGxvYyhh LCBiKQkoUnVuZSopcmVhbGxvYygoYSksIChiKSpzaXplb2YoUnVuZSkpCiNkZWZpbmUJcnVuZW1v dmUoYSwgYiwgYykJbWVtbW92ZSgoYSksIChiKSwgKGMpKnNpemVvZihSdW5lKSkKCmludAlhbG51 bShpbnQpOwppbnQJUmVhZChpbnQsIHZvaWQqLCBpbnQpOwp2b2lkCVNlZWsoaW50LCBsb25nLCBp bnQpOwppbnQJcGxhbjkoRmlsZSosIGludCwgU3RyaW5nKiwgaW50KTsKaW50CVdyaXRlKGludCwg dm9pZCosIGludCk7CmludAliZXhlY3V0ZShGaWxlKiwgUG9zbik7CnZvaWQJY2QoU3RyaW5nKik7 CnZvaWQJY2xvc2VmaWxlcyhGaWxlKiwgU3RyaW5nKik7CnZvaWQJY2xvc2VpbyhQb3NuKTsKdm9p ZAljbWRsb29wKHZvaWQpOwp2b2lkCWNtZHVwZGF0ZSh2b2lkKTsKdm9pZAljb21waWxlKFN0cmlu ZyopOwp2b2lkCWNvcHkoRmlsZSosIEFkZHJlc3MpOwpGaWxlCSpjdXJyZW50KEZpbGUqKTsKdm9p ZAlkZWxldGUoRmlsZSopOwp2b2lkCWRlbGZpbGUoRmlsZSopOwp2b2lkCWRlbGxpc3QoTGlzdCos IGludCk7CnZvaWQJZG91YmxlY2xpY2soRmlsZSosIFBvc24pOwp2b2lkCWRwcmludChjaGFyKiwg Li4uKTsKdm9pZAllZGl0KEZpbGUqLCBpbnQpOwp2b2lkCSplbWFsbG9jKHVsb25nKTsKdm9pZAkq ZXJlYWxsb2Modm9pZCosIHVsb25nKTsKdm9pZAllcnJvcihFcnIpOwp2b2lkCWVycm9yX2MoRXJy LCBpbnQpOwp2b2lkCWVycm9yX3MoRXJyLCBjaGFyKik7CmludAlleGVjdXRlKEZpbGUqLCBQb3Nu LCBQb3NuKTsKaW50CWZpbGVtYXRjaChGaWxlKiwgU3RyaW5nKik7CnZvaWQJZmlsZW5hbWUoRmls ZSopOwp2b2lkCWZpeG5hbWUoU3RyaW5nKik7CnZvaWQJZnVsbG5hbWUoU3RyaW5nKik7CnZvaWQJ Z2V0Y3Vyd2Qodm9pZCk7CkZpbGUJKmdldGZpbGUoU3RyaW5nKik7CmludAlnZXRuYW1lKEZpbGUq LCBTdHJpbmcqLCBpbnQpOwpsb25nCWdldG51bShpbnQpOwp2b2lkCWhpY2NvdWdoKGNoYXIqKTsK dm9pZAlpbnNsaXN0KExpc3QqLCBpbnQsIGxvbmcpOwpBZGRyZXNzCWxpbmVhZGRyKFBvc24sIEFk ZHJlc3MsIGludCk7CnZvaWQJbGlzdGZyZWUoTGlzdCopOwp2b2lkCWxvYWQoRmlsZSopOwpGaWxl CSpsb29rZmlsZShTdHJpbmcqKTsKdm9pZAlsb29rb3JpZ2luKEZpbGUqLCBQb3NuLCBQb3NuKTsK aW50CWxvb2t1cChpbnQpOwp2b2lkCW1vdmUoRmlsZSosIEFkZHJlc3MpOwp2b2lkCW1vdmV0byhG aWxlKiwgUmFuZ2UpOwpGaWxlCSpuZXdmaWxlKHZvaWQpOwp2b2lkCW5leHRtYXRjaChGaWxlKiwg U3RyaW5nKiwgUG9zbiwgaW50KTsKaW50CW5ld3RtcChpbnQpOwp2b2lkCW5vdGlmeWYodm9pZCos IGNoYXIqKTsKdm9pZAlwYW5pYyhjaGFyKik7CnZvaWQJcHJpbnRwb3NuKEZpbGUqLCBpbnQpOwp2 b2lkCXByaW50X3NzKGNoYXIqLCBTdHJpbmcqLCBTdHJpbmcqKTsKdm9pZAlwcmludF9zKGNoYXIq LCBTdHJpbmcqKTsKaW50CXJjdih2b2lkKTsKUmFuZ2UJcmRhdGEoTGlzdCosIFBvc24sIFBvc24p OwpQb3NuCXJlYWRpbyhGaWxlKiwgaW50KiwgaW50LCBpbnQpOwp2b2lkCXJlc2N1ZSh2b2lkKTsK dm9pZAlyZXNldGNtZCh2b2lkKTsKdm9pZAlyZXNldHN5cyh2b2lkKTsKdm9pZAlyZXNldHhlYyh2 b2lkKTsKdm9pZAlyZ3JvdyhMaXN0KiwgUG9zbiwgUG9zbik7CnZvaWQJc2FtZXJyKGNoYXIqKTsK dm9pZAlzZXR0ZW1wZmlsZSh2b2lkKTsKaW50CXNraXBibCh2b2lkKTsKdm9pZAlzbmFyZihGaWxl KiwgUG9zbiwgUG9zbiwgQnVmZmVyKiwgaW50KTsKdm9pZAlzb3J0bmFtZShGaWxlKik7CnZvaWQJ c3RhcnR1cChjaGFyKiwgaW50LCBjaGFyKiosIGNoYXIqKik7CnZvaWQJc3RhdGUoRmlsZSosIGlu dCk7CmludAlzdGF0ZmQoaW50LCB1bG9uZyosIHVsb25nKiwgbG9uZyosIGxvbmcqLCBsb25nKik7 CmludAlzdGF0ZmlsZShjaGFyKiwgdWxvbmcqLCB1bG9uZyosIGxvbmcqLCBsb25nKiwgbG9uZyop Owp2b2lkCVN0cmFkZGMoU3RyaW5nKiwgaW50KTsKdm9pZAlTdHJjbG9zZShTdHJpbmcqKTsKaW50 CVN0cmNtcChTdHJpbmcqLCBTdHJpbmcqKTsKdm9pZAlTdHJkZWxldGUoU3RyaW5nKiwgUG9zbiwg UG9zbik7CnZvaWQJU3RyZHVwbChTdHJpbmcqLCBSdW5lKik7CnZvaWQJU3RyZHVwbHN0cihTdHJp bmcqLCBTdHJpbmcqKTsKdm9pZAlTdHJpbml0KFN0cmluZyopOwp2b2lkCVN0cmluaXQwKFN0cmlu ZyopOwp2b2lkCVN0cmluc2VydChTdHJpbmcqLCBTdHJpbmcqLCBQb3NuKTsKdm9pZAlTdHJpbnN1 cmUoU3RyaW5nKiwgdWxvbmcpOwppbnQJU3RyaXNwcmUoU3RyaW5nKiwgU3RyaW5nKik7CnZvaWQJ U3RyemVybyhTdHJpbmcqKTsKaW50CVN0cmxlbihSdW5lKik7CmNoYXIJKlN0cnRvYyhTdHJpbmcq KTsKdm9pZAlzeXNlcnJvcihjaGFyKik7CnZvaWQJdGVsbGRvdChGaWxlKik7CnZvaWQJdGVsbHBh dCh2b2lkKTsKU3RyaW5nCSp0bXBjc3RyKGNoYXIqKTsKU3RyaW5nCSp0bXByc3RyKFJ1bmUqLCBp bnQpOwp2b2lkCWZyZWV0bXBzdHIoU3RyaW5nKik7CnZvaWQJdGVybWNvbW1hbmQodm9pZCk7CnZv aWQJdGVybXdyaXRlKGNoYXIqKTsKRmlsZQkqdG9maWxlKFN0cmluZyopOwp2b2lkCXRyeXRvY2xv c2UoRmlsZSopOwp2b2lkCXRyeXRvcXVpdCh2b2lkKTsKaW50CXVuZG8oaW50KTsKdm9pZAl1cGRh dGUodm9pZCk7CmludAl3YWl0Zm9yKGludCk7CnZvaWQJd2FybihXYXJuKTsKdm9pZAl3YXJuX3Mo V2FybiwgY2hhciopOwp2b2lkCXdhcm5fU1MoV2FybiwgU3RyaW5nKiwgU3RyaW5nKik7CnZvaWQJ d2Fybl9TKFdhcm4sIFN0cmluZyopOwppbnQJd2hpY2htZW51KEZpbGUqKTsKdm9pZAl3cml0ZWYo RmlsZSopOwpQb3NuCXdyaXRlaW8oRmlsZSopOwpEaXNjZGVzYyAqRHN0YXJ0KHZvaWQpOwoKZXh0 ZXJuIFJ1bmUJc2FtbmFtZVtdOwkvKiBjb21waWxlciBkZXBlbmRlbnQgKi8KZXh0ZXJuIFJ1bmUJ KmxlZnRbXTsKZXh0ZXJuIFJ1bmUJKnJpZ2h0W107CgpleHRlcm4gY2hhcglSU0FNW107CQkvKiBz eXN0ZW0gZGVwZW5kZW50ICovCmV4dGVybiBjaGFyCVNBTVRFUk1bXTsKZXh0ZXJuIGNoYXIJSE9N RVtdOwpleHRlcm4gY2hhcglUTVBESVJbXTsKZXh0ZXJuIGNoYXIJU0hbXTsKZXh0ZXJuIGNoYXIJ U0hQQVRIW107CmV4dGVybiBjaGFyCVJYW107CmV4dGVybiBjaGFyCVJYUEFUSFtdOwpleHRlcm4g Y2hhcglTQU1TQVZFQ01EW107CgovKgogKiBhY21lIGdsb2JhbHMKICovCmV4dGVybiBsb25nCQlz ZXE7CmV4dGVybiBEaXNrCQkqZGlzazsKCmV4dGVybiBjaGFyCSpyc2FtbmFtZTsJLyogZ2xvYmFs cyAqLwpleHRlcm4gY2hhcgkqc2FtdGVybTsKZXh0ZXJuIFJ1bmUJZ2VuYnVmW107CmV4dGVybiBj aGFyCSpnZW5jOwpleHRlcm4gaW50CWlvOwpleHRlcm4gaW50CXBhdHNldDsKZXh0ZXJuIGludAlx dWl0b2s7CmV4dGVybiBBZGRyZXNzCWFkZHI7CmV4dGVybiBCdWZmZXIJc25hcmZidWY7CmV4dGVy biBCdWZmZXIJcGxhbjlidWY7CmV4dGVybiBMaXN0CWZpbGU7CmV4dGVybiBMaXN0CXRlbXBmaWxl OwpleHRlcm4gRmlsZQkqY21kOwpleHRlcm4gRmlsZQkqY3VyZmlsZTsKZXh0ZXJuIEZpbGUJKmxh c3RmaWxlOwpleHRlcm4gTW9kCW1vZG51bTsKZXh0ZXJuIFBvc24JY21kcHQ7CmV4dGVybiBQb3Nu CWNtZHB0YWR2OwpleHRlcm4gUmFuZ2VzZXQJc2VsOwpleHRlcm4gU3RyaW5nCWN1cndkOwpleHRl cm4gU3RyaW5nCWNtZHN0cjsKZXh0ZXJuIFN0cmluZwlnZW5zdHI7CmV4dGVybiBTdHJpbmcJbGFz dHBhdDsKZXh0ZXJuIFN0cmluZwlsYXN0cmVnZXhwOwpleHRlcm4gU3RyaW5nCXBsYW45Y21kOwpl eHRlcm4gaW50CWRvd25sb2FkZWQ7CmV4dGVybiBpbnQJZW9mOwpleHRlcm4gaW50CWJwaXBlb2s7 CmV4dGVybiBpbnQJcGFuaWNraW5nOwpleHRlcm4gUnVuZQllbXB0eVtdOwpleHRlcm4gaW50CXRl cm1sb2NrZWQ7CmV4dGVybiBpbnQJbm9mbHVzaDsKCiNpbmNsdWRlICJtZXNnLmgiCgp2b2lkCW91 dFRzKEhtZXNnLCBpbnQpOwp2b2lkCW91dFQwKEhtZXNnKTsKdm9pZAlvdXRUbChIbWVzZywgbG9u Zyk7CnZvaWQJb3V0VHNsUyhIbWVzZywgaW50LCBsb25nLCBTdHJpbmcqKTsKdm9pZAlvdXRUUyhI bWVzZywgU3RyaW5nKik7CnZvaWQJb3V0VHNTKEhtZXNnLCBpbnQsIFN0cmluZyopOwp2b2lkCW91 dFRzbGxTKEhtZXNnLCBpbnQsIGxvbmcsIGxvbmcsIFN0cmluZyopOwp2b2lkCW91dFRzbGwoSG1l c2csIGludCwgbG9uZywgbG9uZyk7CnZvaWQJb3V0VHNsKEhtZXNnLCBpbnQsIGxvbmcpOwp2b2lk CW91dFRzdihIbWVzZywgaW50LCBsb25nKTsKdm9pZAlvdXRzdGFydChIbWVzZyk7CnZvaWQJb3V0 Y29weShpbnQsIHZvaWQqKTsKdm9pZAlvdXRzaG9ydChpbnQpOwp2b2lkCW91dGxvbmcobG9uZyk7 CnZvaWQJb3V0dmxvbmcodm9pZCopOwp2b2lkCW91dHNlbmQodm9pZCk7CnZvaWQJb3V0Zmx1c2go dm9pZCk7CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAc2FtMmsvc2FtL3NoZWxsLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2 NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDA2MTMxADA3MTExNjIyMTA1ADAwMTUwMDcAMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAw MDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAjaW5jbHVkZSAic2FtLmgiCiNpbmNsdWRlICJwYXJzZS5oIgoKZXh0ZXJuCWptcF9i dWYJbWFpbmxvb3A7CgpjaGFyCWVycmZpbGVbNjRdOwpTdHJpbmcJcGxhbjljbWQ7CS8qIG51bGwg dGVybWluYXRlZCAqLwpCdWZmZXIJcGxhbjlidWY7CnZvaWQJY2hlY2tlcnJzKHZvaWQpOwoKaW50 CnBsYW45KEZpbGUgKmYsIGludCB0eXBlLCBTdHJpbmcgKnMsIGludCBuZXN0KQp7Cglsb25nIGw7 CglpbnQgbTsKCWludCBwaWQsIGZkOwoJaW50IHJldGNvZGU7CglpbnQgcGlwZTFbMl0sIHBpcGUy WzJdOwoKCWlmKHMtPnNbMF09PTAgJiYgcGxhbjljbWQuc1swXT09MCkKCQllcnJvcihFbm9jbWQp OwoJZWxzZSBpZihzLT5zWzBdKQoJCVN0cmR1cGxzdHIoJnBsYW45Y21kLCBzKTsKCWlmKGRvd25s b2FkZWQpCgkJc2FtZXJyKGVycmZpbGUpOwoJZWxzZQoJCXN0cmNweShlcnJmaWxlLCAiL2Rldi90 dHkiKTsKCWlmKHR5cGUhPSchJyAmJiBwaXBlKHBpcGUxKT09LTEpCgkJZXJyb3IoRXBpcGUpOwoJ aWYodHlwZT09J3wnKQoJCXNuYXJmKGYsIGFkZHIuci5wMSwgYWRkci5yLnAyLCAmcGxhbjlidWYs IDEpOwoJaWYoZG93bmxvYWRlZCkKCQlyZW1vdmUoZXJyZmlsZSk7CglpZigocGlkPWZvcmsoKSkg PT0gMCl7CgkJaWYoZG93bmxvYWRlZCl7CS8qIGFsc28gcHV0IG5hc3R5IGZkJ3MgaW50byBlcnJm aWxlICovCgkJCWZkID0gY3JlYXRlKGVycmZpbGUsIDEsIDA2NjZMKTsKCQkJaWYoZmQgPCAwKQoJ CQkJZmQgPSBjcmVhdGUoIi9kZXYvbnVsbCIsIDEsIDA2NjZMKTsKCQkJZHVwKGZkLCAyKTsKCQkJ Y2xvc2UoZmQpOwoJCQkvKiAyIG5vdyBwb2ludHMgYXQgZXJyIGZpbGUgKi8KCQkJaWYodHlwZSA9 PSAnPicpCgkJCQlkdXAoMiwgMSk7CgkJCWVsc2UgaWYodHlwZT09JyEnKXsKCQkJCWR1cCgyLCAx KTsKCQkJCWZkID0gb3BlbigiL2Rldi9udWxsIiwgMCk7CgkJCQlkdXAoZmQsIDApOwoJCQkJY2xv c2UoZmQpOwoJCQl9CgkJfQoJCWlmKHR5cGUgIT0gJyEnKSB7CgkJCWlmKHR5cGU9PSc8JyB8fCB0 eXBlPT0nfCcpCgkJCQlkdXAocGlwZTFbMV0sIDEpOwoJCQllbHNlIGlmKHR5cGUgPT0gJz4nKQoJ CQkJZHVwKHBpcGUxWzBdLCAwKTsKCQkJY2xvc2UocGlwZTFbMF0pOwoJCQljbG9zZShwaXBlMVsx XSk7CgkJfQoJCWlmKHR5cGUgPT0gJ3wnKXsKCQkJaWYocGlwZShwaXBlMikgPT0gLTEpCgkJCQll eGl0cygicGlwZSIpOwoJCQlpZigocGlkID0gZm9yaygpKT09MCl7CgkJCQkvKgoJCQkJICogSXQn cyBvayBpZiB3ZSBnZXQgU0lHUElQRSBoZXJlCgkJCQkgKi8KCQkJCWNsb3NlKHBpcGUyWzBdKTsK CQkJCWlvID0gcGlwZTJbMV07CgkJCQlpZihyZXRjb2RlPSFzZXRqbXAobWFpbmxvb3ApKXsJLyog YXNzaWdubWVudCA9ICovCgkJCQkJY2hhciAqYzsKCQkJCQlmb3IobCA9IDA7IGw8cGxhbjlidWYu bmM7IGwrPW0pewoJCQkJCQltID0gcGxhbjlidWYubmMtbDsKCQkJCQkJaWYobT5CTE9DS1NJWkUt MSkKCQkJCQkJCW0gPSBCTE9DS1NJWkUtMTsKCQkJCQkJYnVmcmVhZCgmcGxhbjlidWYsIGwsIGdl bmJ1ZiwgbSk7CgkJCQkJCWdlbmJ1ZlttXSA9IDA7CgkJCQkJCWMgPSBTdHJ0b2ModG1wcnN0cihn ZW5idWYsIG0rMSkpOwoJCQkJCQlXcml0ZShwaXBlMlsxXSwgYywgc3RybGVuKGMpKTsKCQkJCQkJ ZnJlZShjKTsKCQkJCQl9CgkJCQl9CgkJCQlleGl0cyhyZXRjb2RlPyAiZXJyb3IiIDogMCk7CgkJ CX0KCQkJaWYocGlkPT0tMSl7CgkJCQlmcHJpbnQoMiwgIkNhbid0IGZvcms/IVxuIik7CgkJCQll eGl0cygiZm9yayIpOwoJCQl9CgkJCWR1cChwaXBlMlswXSwgMCk7CgkJCWNsb3NlKHBpcGUyWzBd KTsKCQkJY2xvc2UocGlwZTJbMV0pOwoJCX0KCQlpZih0eXBlPT0nPCcpewoJCQljbG9zZSgwKTsJ Lyogc28gaXQgd29uJ3QgcmVhZCBmcm9tIHRlcm1pbmFsICovCgkJCW9wZW4oIi9kZXYvbnVsbCIs IDApOwoJCX0KCQlleGVjbChTSFBBVEgsIFNILCAiLWMiLCBTdHJ0b2MoJnBsYW45Y21kKSwgKGNo YXIgKikwKTsKCQlleGl0cygiZXhlYyIpOwoJfQoJaWYocGlkID09IC0xKQoJCWVycm9yKEVmb3Jr KTsKCWlmKHR5cGU9PSc8JyB8fCB0eXBlPT0nfCcpewoJCWludCBudWxsczsKCQlpZihkb3dubG9h ZGVkICYmIGFkZHIuci5wMSAhPSBhZGRyLnIucDIpCgkJCW91dFRsKEhzbmFyZmxlbiwgYWRkci5y LnAyLWFkZHIuci5wMSk7CgkJc25hcmYoZiwgYWRkci5yLnAxLCBhZGRyLnIucDIsICZzbmFyZmJ1 ZiwgMCk7CgkJbG9nZGVsZXRlKGYsIGFkZHIuci5wMSwgYWRkci5yLnAyKTsKCQljbG9zZShwaXBl MVsxXSk7CgkJaW8gPSBwaXBlMVswXTsKCQlmLT50ZG90LnAxID0gLTE7CgkJZi0+bmRvdC5yLnAy ID0gYWRkci5yLnAyK3JlYWRpbyhmLCAmbnVsbHMsIDAsIEZBTFNFKTsKCQlmLT5uZG90LnIucDEg PSBhZGRyLnIucDI7CgkJY2xvc2VpbygoUG9zbiktMSk7Cgl9ZWxzZSBpZih0eXBlPT0nPicpewoJ CWNsb3NlKHBpcGUxWzBdKTsKCQlpbyA9IHBpcGUxWzFdOwoJCWJwaXBlb2sgPSAxOwoJCXdyaXRl aW8oZik7CgkJYnBpcGVvayA9IDA7CgkJY2xvc2VpbygoUG9zbiktMSk7Cgl9CglyZXRjb2RlID0g d2FpdGZvcihwaWQpOwoJaWYodHlwZT09J3wnIHx8IHR5cGU9PSc8JykKCQlpZihyZXRjb2RlIT0w KQoJCQl3YXJuKFdiYWRzdGF0dXMpOwoJaWYoZG93bmxvYWRlZCkKCQljaGVja2VycnMoKTsKCWlm KCFuZXN0KQoJCWRwcmludCgiIVxuIik7CglyZXR1cm4gcmV0Y29kZTsKfQoKdm9pZApjaGVja2Vy cnModm9pZCkKewoJY2hhciBidWZbMjU2XTsKCWludCBmLCBuLCBubDsKCWNoYXIgKnA7Cglsb25n IGw7CgoJaWYoc3RhdGZpbGUoZXJyZmlsZSwgMCwgMCwgMCwgJmwsIDApID4gMCAmJiBsICE9IDAp ewoJCWlmKChmPW9wZW4oKGNoYXIgKillcnJmaWxlLCAwKSkgIT0gLTEpewoJCQlpZigobj1yZWFk KGYsIGJ1Ziwgc2l6ZW9mIGJ1Zi0xKSkgPiAwKXsKCQkJCWZvcihubD0wLHA9YnVmOyBubDwzICYm IHA8JmJ1ZltuXTsgcCsrKQoJCQkJCWlmKCpwPT0nXG4nKQoJCQkJCQlubCsrOwoJCQkJKnAgPSAw OwoJCQkJZHByaW50KCIlcyIsIGJ1Zik7CgkJCQlpZihwLWJ1ZiA8IGwtMSkKCQkJCQlkcHJpbnQo IihzYW06IG1vcmUgaW4gJXMpXG4iLCBlcnJmaWxlKTsKCQkJfQoJCQljbG9zZShmKTsKCQl9Cgl9 ZWxzZQoJCXJlbW92ZSgoY2hhciAqKWVycmZpbGUpOwp9CmxhbjljbWQ7CS8qIG51bGwgdGVybWlu YXRlZCAqLwpCdWZmZXIJcGxhbjlidWY7CnZvaWQJY2hlY2tlcnJzKHZvaWQpOwoKaW50CnBsYW45 KEZpbGUgKmYsIGludCB0eXBlLCBTdHJpbmcgKnMsIGludCBuZXN0KQp7Cglsb25nIGw7CglpbnQg bTsKCWludCBwaWQsIGZkOwoJaW50IHJldGNvZGU7CglpbnQgcGlwZTFbMl0sIHBpcGUyWzJdOwoK CWlmKHMtPnNbMF09PTAgJiYgcGxhbjljbWQuc1swXT09MCkKCQllcnJvcihFbm9jbWQpOwoJZWxz ZSBpZihzLT5zWzBdKQoJCVN0cmR1cGxzdHIoJnBsYW45Y21kLCBzKTsKCWlmKGRvd25sb2FkZWQp CgkJc2FtZXJyKGVycmZpbGUpOwoJZWxzZQoJCXN0cmNweShlcnJmaWxlLCAiL2Rldi90dHkiKTsK CWlmKHR5cGUhPSchJyAmJiBwaXBlKHBpcGUxKT09LTEpCgkJZXJyb3IoRXBpcGUpOwoJaWYodHlw ZXNhbTJrL3NhbS9zdHJpbmcuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMTAwNjQ0ADAwMDE3 MzcAMDAwMDE1MQAwMDAwMDAwNTMxNgAwNzExMTYyMjEwNQAwMDE1MjEyADAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDBzY2h3YXJ0egAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGdjc2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDA0MAAwMDAw MDI3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I2luY2x1ZGUgInNhbS5oIgoKI2RlZmluZQlNSU5TSVpFCTE2CQkvKiBtaW5pbXVtIG51bWJlciBv ZiBjaGFycyBhbGxvY2F0ZWQgKi8KI2RlZmluZQlNQVhTSVpFCTI1NgkJLyogbWF4aW11bSBudW1i ZXIgb2YgY2hhcnMgZm9yIGFuIGVtcHR5IHN0cmluZyAqLwoKCnZvaWQKU3RyaW5pdChTdHJpbmcg KnApCnsKCXAtPnMgPSBlbWFsbG9jKE1JTlNJWkUqUlVORVNJWkUpOwoJcC0+biA9IDA7CglwLT5z aXplID0gTUlOU0laRTsKfQoKdm9pZApTdHJpbml0MChTdHJpbmcgKnApCnsKCXAtPnMgPSBlbWFs bG9jKE1JTlNJWkUqUlVORVNJWkUpOwoJcC0+c1swXSA9IDA7CglwLT5uID0gMTsKCXAtPnNpemUg PSBNSU5TSVpFOwp9Cgp2b2lkClN0cmNsb3NlKFN0cmluZyAqcCkKewoJZnJlZShwLT5zKTsKfQoK dm9pZApTdHJ6ZXJvKFN0cmluZyAqcCkKewoJaWYocC0+c2l6ZSA+IE1BWFNJWkUpewoJCXAtPnMg PSBlcmVhbGxvYyhwLT5zLCBSVU5FU0laRSpNQVhTSVpFKTsgLyogdGhyb3cgYXdheSB0aGUgZ2Fy YmFnZSAqLwoJCXAtPnNpemUgPSBNQVhTSVpFOwoJfQoJcC0+biA9IDA7Cn0KCmludApTdHJsZW4o UnVuZSAqcikKewoJUnVuZSAqczsKCglmb3Iocz1yOyAqczsgcysrKQoJCTsKCXJldHVybiBzLXI7 Cn0KCnZvaWQKU3RyZHVwbChTdHJpbmcgKnAsIFJ1bmUgKnMpCS8qIGNvcGllcyB0aGUgbnVsbCAq Lwp7CglwLT5uID0gU3RybGVuKHMpKzE7CglTdHJpbnN1cmUocCwgcC0+bik7CgltZW1tb3ZlKHAt PnMsIHMsIHAtPm4qUlVORVNJWkUpOwp9Cgp2b2lkClN0cmR1cGxzdHIoU3RyaW5nICpwLCBTdHJp bmcgKnEpCS8qIHdpbGwgY29weSB0aGUgbnVsbCBpZiB0aGVyZSdzIG9uZSB0aGVyZSAqLwp7CglT dHJpbnN1cmUocCwgcS0+bik7CglwLT5uID0gcS0+bjsKCW1lbW1vdmUocC0+cywgcS0+cywgcS0+ bipSVU5FU0laRSk7Cn0KCnZvaWQKU3RyYWRkYyhTdHJpbmcgKnAsIGludCBjKQp7CglTdHJpbnN1 cmUocCwgcC0+bisxKTsKCXAtPnNbcC0+bisrXSA9IGM7Cn0KCnZvaWQKU3RyaW5zdXJlKFN0cmlu ZyAqcCwgdWxvbmcgbikKewoJaWYobiA+IFNUUlNJWkUpCgkJZXJyb3IoRXRvb2xvbmcpOwoJaWYo cC0+c2l6ZSA8IG4pewkvKiBwIG5lZWRzIHRvIGdyb3cgKi8KCQluICs9IDEwMDsKCQlwLT5zID0g ZXJlYWxsb2MocC0+cywgbipSVU5FU0laRSk7CgkJcC0+c2l6ZSA9IG47Cgl9Cn0KCnZvaWQKU3Ry aW5zZXJ0KFN0cmluZyAqcCwgU3RyaW5nICpxLCBQb3NuIHAwKQp7CglTdHJpbnN1cmUocCwgcC0+ bitxLT5uKTsKCW1lbW1vdmUocC0+cytwMCtxLT5uLCBwLT5zK3AwLCAocC0+bi1wMCkqUlVORVNJ WkUpOwoJbWVtbW92ZShwLT5zK3AwLCBxLT5zLCBxLT5uKlJVTkVTSVpFKTsKCXAtPm4gKz0gcS0+ bjsKfQoKdm9pZApTdHJkZWxldGUoU3RyaW5nICpwLCBQb3NuIHAxLCBQb3NuIHAyKQp7CgltZW1t b3ZlKHAtPnMrcDEsIHAtPnMrcDIsIChwLT5uLXAyKSpSVU5FU0laRSk7CglwLT5uIC09IHAyLXAx Owp9CgppbnQKU3RyY21wKFN0cmluZyAqYSwgU3RyaW5nICpiKQp7CglpbnQgaSwgYzsKCglmb3Io aT0wOyBpPGEtPm4gJiYgaTxiLT5uOyBpKyspCgkJaWYoYyA9IChhLT5zW2ldIC0gYi0+c1tpXSkp CS8qIGFzc2lnbiA9ICovCgkJCXJldHVybiBjOwoJLyogZGFtbiBOVUxzIGNvbmZ1c2UgZXZlcnl0 aGluZyAqLwoJaSA9IGEtPm4gLSBiLT5uOwoJaWYoaSA9PSAxKXsKCQlpZihhLT5zW2EtPm4tMV0g PT0gMCkKCQkJcmV0dXJuIDA7Cgl9ZWxzZSBpZihpID09IC0xKXsKCQlpZihiLT5zW2ItPm4tMV0g PT0gMCkKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gaTsKfQoKaW50ClN0cmlzcHJlKFN0cmluZyAq YSwgU3RyaW5nICpiKQp7CglpbnQgaTsKCglmb3IoaT0wOyBpPGEtPm4gJiYgaTxiLT5uOyBpKysp ewoJCWlmKGEtPnNbaV0gLSBiLT5zW2ldKXsJLyogYXNzaWduID0gKi8KCQkJaWYoYS0+c1tpXSA9 PSAwKQoJCQkJcmV0dXJuIDE7CgkJCXJldHVybiAwOwoJCX0KCX0KCXJldHVybiBpID09IGEtPm47 Cn0KCmNoYXIqClN0cnRvYyhTdHJpbmcgKnMpCnsKCWludCBpOwoJY2hhciAqYywgKmQ7CglSdW5l ICpyOwoJYyA9IGVtYWxsb2Mocy0+bipVVEZtYXggKyAxKTsgIC8qIHdvcnN0IGNhc2UgVVRGbWF4 IGJ5dGVzIHBlciBydW5lLCBwbHVzIE5VTCAqLwoJZCA9IGM7CglyID0gcy0+czsKCWZvcihpPTA7 IGk8cy0+bjsgaSsrKQoJCWQgKz0gcnVuZXRvY2hhcihkLCByKyspOwoJaWYoZD09YyB8fCBkWy0x XSE9MCkKCQkqZCA9IDA7CglyZXR1cm4gYzsKCn0KCi8qCiAqIEJ1aWxkIHZlcnkgdGVtcG9yYXJ5 IFN0cmluZyBmcm9tIFJ1bmUqCiAqLwpTdHJpbmcqCnRtcHJzdHIoUnVuZSAqciwgaW50IG4pCnsK CXN0YXRpYyBTdHJpbmcgcDsKCglwLnMgPSByOwoJcC5uID0gbjsKCXAuc2l6ZSA9IG47CglyZXR1 cm4gJnA7Cn0KCi8qCiAqIENvbnZlcnQgbnVsbC10ZXJtaW5hdGVkIGNoYXIqIGludG8gU3RyaW5n CiAqLwpTdHJpbmcqCnRtcGNzdHIoY2hhciAqcykKewoJU3RyaW5nICpwOwoJUnVuZSAqcjsKCWlu dCBpLCBuOwoKCW4gPSB1dGZsZW4ocyk7CS8qIGRvbid0IGluY2x1ZGUgTlVMICovCglwID0gZW1h bGxvYyhzaXplb2YoU3RyaW5nKSk7CglyID0gZW1hbGxvYyhuKlJVTkVTSVpFKTsKCXAtPnMgPSBy OwoJZm9yKGk9MDsgaTxuOyBpKysscisrKQoJCXMgKz0gY2hhcnRvcnVuZShyLCBzKTsKCXAtPm4g PSBuOwoJcC0+c2l6ZSA9IG47CglyZXR1cm4gcDsKfQoKdm9pZApmcmVldG1wc3RyKFN0cmluZyAq cykKewoJZnJlZShzLT5zKTsKCWZyZWUocyk7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsv c2FtL3N5cy5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAw MTUxADAwMDAwMDAxMzIxADA3MTExNjIyMTA1ADAwMTQ1MTIAMAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVk ZSAic2FtLmgiCgpzdGF0aWMgaW50IGluZXJyb3I9RkFMU0U7CgovKgogKiBBIHJlYXNvbmFibGUg aW50ZXJmYWNlIHRvIHRoZSBzeXN0ZW0gY2FsbHMKICovCgp2b2lkCnJlc2V0c3lzKHZvaWQpCnsK CWluZXJyb3IgPSBGQUxTRTsKfQoKdm9pZApzeXNlcnJvcihjaGFyICphKQp7CgljaGFyIGJ1ZltF UlJMRU5dOwoKCWlmKCFpbmVycm9yKXsKCQlpbmVycm9yPVRSVUU7CgkJZXJyc3RyKGJ1Zik7CgkJ ZHByaW50KCIlczogIiwgYSk7CgkJZXJyb3JfcyhFaW8sIGJ1Zik7Cgl9Cn0KCmludApSZWFkKGlu dCBmLCB2b2lkICphLCBpbnQgbikKewoJY2hhciBidWZbRVJSTEVOXTsKCglpZihyZWFkKGYsIChj aGFyICopYSwgbikhPW4pIHsKCQlpZiAobGFzdGZpbGUpCgkJCWxhc3RmaWxlLT5yZXNjdWluZyA9 IDE7CgkJZXJyc3RyKGJ1Zik7CgkJaWYgKGRvd25sb2FkZWQpCgkJCWZwcmludCgyLCAicmVhZCBl cnJvcjogJXNcbiIsIGJ1Zik7CgkJcmVzY3VlKCk7CgkJZXhpdHMoInJlYWQiKTsKCX0KCXJldHVy biBuOwp9CgppbnQKV3JpdGUoaW50IGYsIHZvaWQgKmEsIGludCBuKQp7CglpbnQgbTsKCglpZigo bT13cml0ZShmLCAoY2hhciAqKWEsIG4pKSE9bikKCQlzeXNlcnJvcigid3JpdGUiKTsKCXJldHVy biBtOwp9Cgp2b2lkClNlZWsoaW50IGYsIGxvbmcgbiwgaW50IHcpCnsKCWlmKHNlZWsoZiwgbiwg dyk9PS0xKQoJCXN5c2Vycm9yKCJzZWVrIik7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2Ft L3V0aWwuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUx ADAwMDAwMDAxMzc2ADA3MTExNjIyMTA1ADAwMTQ2NjMAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAZ2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAi c2FtLmgiCgp2b2lkCmN2dHRvcnVuZXMoY2hhciAqcCwgaW50IG4sIFJ1bmUgKnIsIGludCAqbmIs IGludCAqbnIsIGludCAqbnVsbHMpCnsKCXVjaGFyICpxOwoJUnVuZSAqczsKCWludCBqLCB3OwoK CS8qCgkgKiBBbHdheXMgZ3VhcmFudGVlZCB0aGF0IG4gYnl0ZXMgbWF5IGJlIGludGVycHJldGVk CgkgKiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHBhcnRpYWwgcnVuZXMuICBUaGlzIG1heSBtZWFu CgkgKiByZWFkaW5nIHVwIHRvIFVURm1heC0xIG1vcmUgYnl0ZXMgdGhhbiBuOyB0aGUgY2FsbGVy CgkgKiBrbm93cyB0aGlzLiAgSWYgbiBpcyBhIGZpcm0gbGltaXQsIHRoZSBjYWxsZXIgc2hvdWxk CgkgKiBzZXQgcFtuXSA9IDAuCgkgKi8KCXEgPSAodWNoYXIqKXA7CglzID0gcjsKCWZvcihqPTA7 IGo8bjsgais9dyl7CgkJaWYoKnEgPCBSdW5lc2VsZil7CgkJCXcgPSAxOwoJCQkqcyA9ICpxKys7 CgkJfWVsc2V7CgkJCXcgPSBjaGFydG9ydW5lKHMsIChjaGFyKilxKTsKCQkJcSArPSB3OwoJCX0K CQlpZigqcykKCQkJcysrOwoJCWVsc2UgaWYobnVsbHMpCgkJCSpudWxscyA9IFRSVUU7Cgl9Cgkq bmIgPSAoY2hhciopcS1wOwoJKm5yID0gcy1yOwp9Cgp2b2lkKgpmYnVmYWxsb2Modm9pZCkKewoJ cmV0dXJuIGVtYWxsb2MoQlVGU0laRSk7Cn0KCnZvaWQKZmJ1ZmZyZWUodm9pZCAqZikKewoJZnJl ZShmKTsKfQoKdWludAptaW4odWludCBhLCB1aW50IGIpCnsKCWlmKGEgPCBiKQoJCXJldHVybiBh OwoJcmV0dXJuIGI7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL3hl Yy5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAw MDAwMDIwNDI2ADA3MTExNjQzMjYyADAwMTQ0NzEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Z2NzZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSAic2Ft LmgiCiNpbmNsdWRlICJwYXJzZS5oIgoKaW50CUdsb29waW5nOwppbnQJbmVzdDsKCmludAlhcHBl bmQoRmlsZSosIENtZCosIFBvc24pOwppbnQJZGlzcGxheShGaWxlKik7CnZvaWQJbG9vcGVyKEZp bGUqLCBDbWQqLCBpbnQpOwp2b2lkCWZpbGVsb29wZXIoQ21kKiwgaW50KTsKdm9pZAlsaW5lbG9v cGVyKEZpbGUqLCBDbWQqKTsKCnZvaWQKcmVzZXR4ZWModm9pZCkKewoJR2xvb3BpbmcgPSBuZXN0 ID0gMDsKfQoKaW50CmNtZGV4ZWMoRmlsZSAqZiwgQ21kICpjcCkKewoJaW50IGk7CglBZGRyICph cDsKCUFkZHJlc3MgYTsKCglpZihmICYmIGYtPnVucmVhZCkKCQlsb2FkKGYpOwoJaWYoZj09MCAm JiAoY3AtPmFkZHI9PTAgfHwgY3AtPmFkZHItPnR5cGUhPSciJykgJiYKCSAgICAhdXRmcnVuZSgi YkJucVVYWSEiLCBjcC0+Y21kYykgJiYKCSAgICBjcC0+Y21kYyE9KCdjJ3wweDEwMCkgJiYgIShj cC0+Y21kYz09J0QnICYmIGNwLT5jdGV4dCkpCgkJZXJyb3IoRW5vZmlsZSk7CglpID0gbG9va3Vw KGNwLT5jbWRjKTsKCWlmKGkgPj0gMCAmJiBjbWR0YWJbaV0uZGVmYWRkciAhPSBhTm8pewoJCWlm KChhcD1jcC0+YWRkcik9PTAgJiYgY3AtPmNtZGMhPSdcbicpewoJCQljcC0+YWRkciA9IGFwID0g bmV3YWRkcigpOwoJCQlhcC0+dHlwZSA9ICcuJzsKCQkJaWYoY21kdGFiW2ldLmRlZmFkZHIgPT0g YUFsbCkKCQkJCWFwLT50eXBlID0gJyonOwoJCX1lbHNlIGlmKGFwICYmIGFwLT50eXBlPT0nIicg JiYgYXAtPm5leHQ9PTAgJiYgY3AtPmNtZGMhPSdcbicpewoJCQlhcC0+bmV4dCA9IG5ld2FkZHIo KTsKCQkJYXAtPm5leHQtPnR5cGUgPSAnLic7CgkJCWlmKGNtZHRhYltpXS5kZWZhZGRyID09IGFB bGwpCgkJCQlhcC0+bmV4dC0+dHlwZSA9ICcqJzsKCQl9CgkJaWYoY3AtPmFkZHIpewkvKiBtYXkg YmUgZmFsc2UgZm9yICdcbicgKG9ubHkpICovCgkJCXN0YXRpYyBBZGRyZXNzIG5vbmUgPSB7ezAs MH0sMH07CgkJCWlmKGYpCgkJCQlhZGRyID0gYWRkcmVzcyhhcCwgZi0+ZG90LCAwKTsKCQkJZWxz ZQkvKiBhICIgKi8KCQkJCWFkZHIgPSBhZGRyZXNzKGFwLCBub25lLCAwKTsKCQkJZiA9IGFkZHIu ZjsKCQl9Cgl9CgljdXJyZW50KGYpOwoJc3dpdGNoKGNwLT5jbWRjKXsKCWNhc2UgJ3snOgoJCWEg PSBjcC0+YWRkcj8gYWRkcmVzcyhjcC0+YWRkciwgZi0+ZG90LCAwKTogZi0+ZG90OwoJCWZvcihj cCA9IGNwLT5jY21kOyBjcDsgY3AgPSBjcC0+bmV4dCl7CgkJCWEuZi0+ZG90ID0gYTsKCQkJY21k ZXhlYyhhLmYsIGNwKTsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCWk9KCpjbWR0YWJbaV0uZm4p KGYsIGNwKTsKCQlyZXR1cm4gaTsKCX0KCXJldHVybiAxOwp9CgoKaW50CmFfY21kKEZpbGUgKmYs IENtZCAqY3ApCnsKCXJldHVybiBhcHBlbmQoZiwgY3AsIGFkZHIuci5wMik7Cn0KCmludApiX2Nt ZChGaWxlICpmLCBDbWQgKmNwKQp7CglVU0VEKGYpOwoJZiA9IGNwLT5jbWRjPT0nYic/IHRvZmls ZShjcC0+Y3RleHQpIDogZ2V0ZmlsZShjcC0+Y3RleHQpOwoJaWYoZi0+dW5yZWFkKQoJCWxvYWQo Zik7CgllbHNlIGlmKG5lc3QgPT0gMCkKCQlmaWxlbmFtZShmKTsKCXJldHVybiBUUlVFOwp9Cgpp bnQKY19jbWQoRmlsZSAqZiwgQ21kICpjcCkKewoJbG9nZGVsZXRlKGYsIGFkZHIuci5wMSwgYWRk ci5yLnAyKTsKCWYtPm5kb3Quci5wMSA9IGYtPm5kb3Quci5wMiA9IGFkZHIuci5wMjsKCXJldHVy biBhcHBlbmQoZiwgY3AsIGFkZHIuci5wMik7Cn0KCmludApkX2NtZChGaWxlICpmLCBDbWQgKmNw KQp7CglVU0VEKGNwKTsKCWxvZ2RlbGV0ZShmLCBhZGRyLnIucDEsIGFkZHIuci5wMik7CglmLT5u ZG90LnIucDEgPSBmLT5uZG90LnIucDIgPSBhZGRyLnIucDE7CglyZXR1cm4gVFJVRTsKfQoKaW50 CkRfY21kKEZpbGUgKmYsIENtZCAqY3ApCnsKCWNsb3NlZmlsZXMoZiwgY3AtPmN0ZXh0KTsKCXJl dHVybiBUUlVFOwp9CgppbnQKZV9jbWQoRmlsZSAqZiwgQ21kICpjcCkKewoJaWYoZ2V0bmFtZShm LCBjcC0+Y3RleHQsIGNwLT5jbWRjPT0nZScpPT0wKQoJCWVycm9yKEVub25hbWUpOwoJZWRpdChm LCBjcC0+Y21kYyk7CglyZXR1cm4gVFJVRTsKfQoKaW50CmZfY21kKEZpbGUgKmYsIENtZCAqY3Ap CnsKCWdldG5hbWUoZiwgY3AtPmN0ZXh0LCBUUlVFKTsKCWZpbGVuYW1lKGYpOwoJcmV0dXJuIFRS VUU7Cn0KCmludApnX2NtZChGaWxlICpmLCBDbWQgKmNwKQp7CglpZihmIT1hZGRyLmYpcGFuaWMo ImdfY21kIGYhPWFkZHIuZiIpOwoJY29tcGlsZShjcC0+cmUpOwoJaWYoZXhlY3V0ZShmLCBhZGRy LnIucDEsIGFkZHIuci5wMikgXiBjcC0+Y21kYz09J3YnKXsKCQlmLT5kb3QgPSBhZGRyOwoJCXJl dHVybiBjbWRleGVjKGYsIGNwLT5jY21kKTsKCX0KCXJldHVybiBUUlVFOwp9CgppbnQKaV9jbWQo RmlsZSAqZiwgQ21kICpjcCkKewoJcmV0dXJuIGFwcGVuZChmLCBjcCwgYWRkci5yLnAxKTsKfQoK aW50CmtfY21kKEZpbGUgKmYsIENtZCAqY3ApCnsKCVVTRUQoY3ApOwoJZi0+bWFyayA9IGFkZHIu cjsKCXJldHVybiBUUlVFOwp9CgppbnQKbV9jbWQoRmlsZSAqZiwgQ21kICpjcCkKewoJQWRkcmVz cyBhZGRyMjsKCglhZGRyMiA9IGFkZHJlc3MoY3AtPmNhZGRyLCBmLT5kb3QsIDApOwoJaWYoY3At PmNtZGM9PSdtJykKCQltb3ZlKGYsIGFkZHIyKTsKCWVsc2UKCQljb3B5KGYsIGFkZHIyKTsKCXJl dHVybiBUUlVFOwp9CgppbnQKbl9jbWQoRmlsZSAqZiwgQ21kICpjcCkKewoJaW50IGk7CglVU0VE KGYpOwoJVVNFRChjcCk7Cglmb3IoaSA9IDA7IGk8ZmlsZS5udXNlZDsgaSsrKXsKCQlpZihmaWxl LmZpbGVwcHRyW2ldID09IGNtZCkKCQkJY29udGludWU7CgkJZiA9IGZpbGUuZmlsZXBwdHJbaV07 CgkJU3RyZHVwbHN0cigmZ2Vuc3RyLCAmZi0+bmFtZSk7CgkJZmlsZW5hbWUoZik7Cgl9CglyZXR1 cm4gVFJVRTsKfQoKaW50CnBfY21kKEZpbGUgKmYsIENtZCAqY3ApCnsKCVVTRUQoY3ApOwoJcmV0 dXJuIGRpc3BsYXkoZik7Cn0KCmludApxX2NtZChGaWxlICpmLCBDbWQgKmNwKQp7CglVU0VEKGNw KTsKCVVTRUQoZik7Cgl0cnl0b3F1aXQoKTsKCWlmKGRvd25sb2FkZWQpewoJCW91dFQwKEhleGl0 KTsKCQlyZXR1cm4gVFJVRTsKCX0KCXJldHVybiBGQUxTRTsKfQoKaW50CnNfY21kKEZpbGUgKmYs IENtZCAqY3ApCnsKCWludCBpLCBqLCBjLCBuOwoJUG9zbiBwMSwgb3AsIGRpZHN1YiA9IDAsIGRl bHRhID0gMDsKCgluID0gY3AtPm51bTsKCW9wPSAtMTsKCWNvbXBpbGUoY3AtPnJlKTsKCWZvcihw MSA9IGFkZHIuci5wMTsgcDE8PWFkZHIuci5wMiAmJiBleGVjdXRlKGYsIHAxLCBhZGRyLnIucDIp OyApewoJCWlmKHNlbC5wWzBdLnAxPT1zZWwucFswXS5wMil7CS8qIGVtcHR5IG1hdGNoPyAqLwoJ CQlpZihzZWwucFswXS5wMT09b3ApewoJCQkJcDErKzsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCXAx ID0gc2VsLnBbMF0ucDIrMTsKCQl9ZWxzZQoJCQlwMSA9IHNlbC5wWzBdLnAyOwoJCW9wID0gc2Vs LnBbMF0ucDI7CgkJaWYoLS1uPjApCgkJCWNvbnRpbnVlOwoJCVN0cnplcm8oJmdlbnN0cik7CgkJ Zm9yKGkgPSAwOyBpPGNwLT5jdGV4dC0+bjsgaSsrKQoJCQlpZigoYyA9IGNwLT5jdGV4dC0+c1tp XSk9PSdcXCcgJiYgaTxjcC0+Y3RleHQtPm4tMSl7CgkJCQljID0gY3AtPmN0ZXh0LT5zWysraV07 CgkJCQlpZignMSc8PWMgJiYgYzw9JzknKSB7CgkJCQkJaiA9IGMtJzAnOwoJCQkJCWlmKHNlbC5w W2pdLnAyLXNlbC5wW2pdLnAxPkJMT0NLU0laRSkKCQkJCQkJZXJyb3IoRWxvbmd0YWcpOwoJCQkJ CWJ1ZnJlYWQoJmYtPlUsIHNlbC5wW2pdLnAxLCBnZW5idWYsIHNlbC5wW2pdLnAyLXNlbC5wW2pd LnAxKTsKCQkJCQlTdHJpbnNlcnQoJmdlbnN0ciwgdG1wcnN0cihnZW5idWYsIChzZWwucFtqXS5w Mi1zZWwucFtqXS5wMSkpLCBnZW5zdHIubik7CgkJCQl9ZWxzZQoJCQkJIAlTdHJhZGRjKCZnZW5z dHIsIGMpOwoJCQl9ZWxzZSBpZihjIT0nJicpCgkJCQlTdHJhZGRjKCZnZW5zdHIsIGMpOwoJCQll bHNlewoJCQkJaWYoc2VsLnBbMF0ucDItc2VsLnBbMF0ucDE+QkxPQ0tTSVpFKQoJCQkJCWVycm9y KEVsb25ncmhzKTsKCQkJCWJ1ZnJlYWQoJmYtPlUsIHNlbC5wWzBdLnAxLCBnZW5idWYsIHNlbC5w WzBdLnAyLXNlbC5wWzBdLnAxKTsKCQkJCVN0cmluc2VydCgmZ2Vuc3RyLAoJCQkJCXRtcHJzdHIo Z2VuYnVmLCAoaW50KShzZWwucFswXS5wMi1zZWwucFswXS5wMSkpLAoJCQkJCWdlbnN0ci5uKTsK CQkJfQoJCWlmKHNlbC5wWzBdLnAxIT1zZWwucFswXS5wMil7CgkJCWxvZ2RlbGV0ZShmLCBzZWwu cFswXS5wMSwgc2VsLnBbMF0ucDIpOwoJCQlkZWx0YS09c2VsLnBbMF0ucDItc2VsLnBbMF0ucDE7 CgkJfQoJCWlmKGdlbnN0ci5uKXsKCQkJbG9naW5zZXJ0KGYsIHNlbC5wWzBdLnAyLCBnZW5zdHIu cywgZ2Vuc3RyLm4pOwoJCQlkZWx0YSs9Z2Vuc3RyLm47CgkJfQoJCWRpZHN1YiA9IDE7CgkJaWYo IWNwLT5mbGFnKQoJCQlicmVhazsKCX0KCWlmKCFkaWRzdWIgJiYgbmVzdD09MCkKCQllcnJvcihF bm9zdWIpOwoJZi0+bmRvdC5yLnAxID0gYWRkci5yLnAxLCBmLT5uZG90LnIucDIgPSBhZGRyLnIu cDIrZGVsdGE7CglyZXR1cm4gVFJVRTsKfQoKaW50CnVfY21kKEZpbGUgKmYsIENtZCAqY3ApCnsK CWludCBuOwoKCVVTRUQoZik7CglVU0VEKGNwKTsKCW4gPSBjcC0+bnVtOwoJaWYobiA+PSAwKQoJ CXdoaWxlKG4tLSAmJiB1bmRvKFRSVUUpKQoJCQk7CgllbHNlCgkJd2hpbGUobisrICYmIHVuZG8o RkFMU0UpKQoJCQk7CglyZXR1cm4gVFJVRTsKfQoKaW50CndfY21kKEZpbGUgKmYsIENtZCAqY3Ap CnsKCWlmKGdldG5hbWUoZiwgY3AtPmN0ZXh0LCBGQUxTRSk9PTApCgkJZXJyb3IoRW5vbmFtZSk7 Cgl3cml0ZWYoZik7CglyZXR1cm4gVFJVRTsKfQoKaW50CnhfY21kKEZpbGUgKmYsIENtZCAqY3Ap CnsKCWlmKGNwLT5yZSkKCQlsb29wZXIoZiwgY3AsIGNwLT5jbWRjPT0neCcpOwoJZWxzZQoJCWxp bmVsb29wZXIoZiwgY3ApOwoJcmV0dXJuIFRSVUU7Cn0KCmludApYX2NtZChGaWxlICpmLCBDbWQg KmNwKQp7CglVU0VEKGYpOwoJZmlsZWxvb3BlcihjcCwgY3AtPmNtZGM9PSdYJyk7CglyZXR1cm4g VFJVRTsKfQoKaW50CnBsYW45X2NtZChGaWxlICpmLCBDbWQgKmNwKQp7CglwbGFuOShmLCBjcC0+ Y21kYywgY3AtPmN0ZXh0LCBuZXN0KTsKCXJldHVybiBUUlVFOwp9CgppbnQKZXFfY21kKEZpbGUg KmYsIENtZCAqY3ApCnsKCWludCBjaGFyc29ubHkgPSBGQUxTRTsKCglzd2l0Y2goY3AtPmN0ZXh0 LT5uKXsKCWNhc2UgMToKCQljaGFyc29ubHkgPSBGQUxTRTsKCQlicmVhazsKCWNhc2UgMjoKCQlp ZihjcC0+Y3RleHQtPnNbMF09PScjJyl7CgkJCWNoYXJzb25seSA9IFRSVUU7CgkJCWJyZWFrOwoJ CX0KCWRlZmF1bHQ6CgkJU0VUKGNoYXJzb25seSk7CgkJZXJyb3IoRW5ld2xpbmUpOwoJfQoJcHJp bnRwb3NuKGYsIGNoYXJzb25seSk7CglyZXR1cm4gVFJVRTsKfQoKaW50Cm5sX2NtZChGaWxlICpm LCBDbWQgKmNwKQp7CglBZGRyZXNzIGE7CgoJaWYoY3AtPmFkZHIgPT0gMCl7CgkJLyogRmlyc3Qg cHV0IGl0IG9uIG5ld2xpbmUgYm91bmRhcmllcyAqLwoJCWFkZHIgPSBsaW5lYWRkcigoUG9zbikw LCBmLT5kb3QsIC0xKTsKCQlhID0gbGluZWFkZHIoKFBvc24pMCwgZi0+ZG90LCAxKTsKCQlhZGRy LnIucDIgPSBhLnIucDI7CgkJaWYoYWRkci5yLnAxPT1mLT5kb3Quci5wMSAmJiBhZGRyLnIucDI9 PWYtPmRvdC5yLnAyKQoJCQlhZGRyID0gbGluZWFkZHIoKFBvc24pMSwgZi0+ZG90LCAxKTsKCQlk aXNwbGF5KGYpOwoJfWVsc2UgaWYoZG93bmxvYWRlZCkKCQltb3ZldG8oZiwgYWRkci5yKTsKCWVs c2UKCQlkaXNwbGF5KGYpOwoJcmV0dXJuIFRSVUU7Cn0KCmludApjZF9jbWQoRmlsZSAqZiwgQ21k ICpjcCkKewoJVVNFRChmKTsKCWNkKGNwLT5jdGV4dCk7CglyZXR1cm4gVFJVRTsKfQoKaW50CmFw cGVuZChGaWxlICpmLCBDbWQgKmNwLCBQb3NuIHApCnsKCWlmKGNwLT5jdGV4dC0+bj4wICYmIGNw LT5jdGV4dC0+c1tjcC0+Y3RleHQtPm4tMV09PTApCgkJLS1jcC0+Y3RleHQtPm47CglpZihjcC0+ Y3RleHQtPm4+MCkKCQlsb2dpbnNlcnQoZiwgcCwgY3AtPmN0ZXh0LT5zLCBjcC0+Y3RleHQtPm4p OwoJZi0+bmRvdC5yLnAxID0gcDsKCWYtPm5kb3Quci5wMiA9IHArY3AtPmN0ZXh0LT5uOwoJcmV0 dXJuIFRSVUU7Cn0KCmludApkaXNwbGF5KEZpbGUgKmYpCnsKCVBvc24gcDEsIHAyOwoJaW50IG5w OwoJY2hhciAqYzsKCglwMSA9IGFkZHIuci5wMTsKCXAyID0gYWRkci5yLnAyOwoJaWYocDIgPiBm LT5VLm5jKXsKCQlmcHJpbnQoMiwgImJhZCBkaXNwbGF5IGFkZHIgcDE9JWxkIHAyPSVsZCBmLT5V Lm5jPSVkXG4iLCBwMSwgcDIsIGYtPlUubmMpOyAvKlpaWiBzaG91bGQgbmV2ZXIgaGFwcGVuLCBj YW4gcmVtb3ZlICovCgkJcDIgPSBmLT5VLm5jOwoJfQoJd2hpbGUocDEgPCBwMil7CgkJbnAgPSBw Mi1wMTsKCQlpZihucD5CTE9DS1NJWkUtMSkKCQkJbnAgPSBCTE9DS1NJWkUtMTsKCQlidWZyZWFk KCZmLT5VLCBwMSwgZ2VuYnVmLCBucCk7CgkJZ2VuYnVmW25wXSA9IDA7CgkJYyA9IFN0cnRvYyh0 bXByc3RyKGdlbmJ1ZiwgbnArMSkpOwoJCWlmKGRvd25sb2FkZWQpCgkJCXRlcm13cml0ZShjKTsK CQllbHNlCgkJCVdyaXRlKDEsIGMsIHN0cmxlbihjKSk7CgkJZnJlZShjKTsKCQlwMSArPSBucDsK CX0KCWYtPmRvdCA9IGFkZHI7CglyZXR1cm4gVFJVRTsKfQoKdm9pZApsb29wZXIoRmlsZSAqZiwg Q21kICpjcCwgaW50IHh5KQp7CglQb3NuIHAsIG9wOwoJUmFuZ2UgcjsKCglyID0gYWRkci5yOwoJ b3A9IHh5PyAtMSA6IHIucDE7CgluZXN0Kys7Cgljb21waWxlKGNwLT5yZSk7Cglmb3IocCA9IHIu cDE7IHA8PXIucDI7ICl7CgkJaWYoIWV4ZWN1dGUoZiwgcCwgci5wMikpeyAvKiBubyBtYXRjaCwg YnV0IHkgc2hvdWxkIHN0aWxsIHJ1biAqLwoJCQlpZih4eSB8fCBvcD5yLnAyKQoJCQkJYnJlYWs7 CgkJCWYtPmRvdC5yLnAxID0gb3AsIGYtPmRvdC5yLnAyID0gci5wMjsKCQkJcCA9IHIucDIrMTsJ LyogZXhpdCBuZXh0IGxvb3AgKi8KCQl9ZWxzZXsKCQkJaWYoc2VsLnBbMF0ucDE9PXNlbC5wWzBd LnAyKXsJLyogZW1wdHkgbWF0Y2g/ICovCgkJCQlpZihzZWwucFswXS5wMT09b3ApewoJCQkJCXAr KzsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCXAgPSBzZWwucFswXS5wMisxOwoJCQl9ZWxzZQoJ CQkJcCA9IHNlbC5wWzBdLnAyOwoJCQlpZih4eSkKCQkJCWYtPmRvdC5yID0gc2VsLnBbMF07CgkJ CWVsc2UKCQkJCWYtPmRvdC5yLnAxID0gb3AsIGYtPmRvdC5yLnAyID0gc2VsLnBbMF0ucDE7CgkJ fQoJCW9wID0gc2VsLnBbMF0ucDI7CgkJY21kZXhlYyhmLCBjcC0+Y2NtZCk7CgkJY29tcGlsZShj cC0+cmUpOwoJfQoJLS1uZXN0Owp9Cgp2b2lkCmxpbmVsb29wZXIoRmlsZSAqZiwgQ21kICpjcCkK ewoJUG9zbiBwOwoJUmFuZ2UgciwgbGluZXNlbDsKCUFkZHJlc3MgYSwgYTM7CgoJbmVzdCsrOwoJ ciA9IGFkZHIucjsKCWEzLmYgPSBmOwoJYTMuci5wMSA9IGEzLnIucDIgPSByLnAxOwoJZm9yKHAg PSByLnAxOyBwPHIucDI7IHAgPSBhMy5yLnAyKXsKCQlhMy5yLnAxID0gYTMuci5wMjsKLypwancJ CWlmKHAhPXIucDEgfHwgKGxpbmVzZWwgPSBsaW5lYWRkcigoUG9zbikwLCBhMywgMSkpLnIucDI9 PXApKi8KCQlpZihwIT1yLnAxIHx8IChhID0gbGluZWFkZHIoKFBvc24pMCwgYTMsIDEpLCBsaW5l c2VsID0gYS5yLCBsaW5lc2VsLnAyPT1wKSl7CgkJCWEgPSBsaW5lYWRkcigoUG9zbikxLCBhMywg MSk7CgkJCWxpbmVzZWwgPSBhLnI7CgkJfQoJCWlmKGxpbmVzZWwucDEgPj0gci5wMikKCQkJYnJl YWs7CgkJaWYobGluZXNlbC5wMiA+PSByLnAyKQoJCQlsaW5lc2VsLnAyID0gci5wMjsKCQlpZihs aW5lc2VsLnAyID4gbGluZXNlbC5wMSkKCQkJaWYobGluZXNlbC5wMT49YTMuci5wMiAmJiBsaW5l c2VsLnAyPmEzLnIucDIpewoJCQkJZi0+ZG90LnIgPSBsaW5lc2VsOwoJCQkJY21kZXhlYyhmLCBj cC0+Y2NtZCk7CgkJCQlhMy5yID0gbGluZXNlbDsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJYnJlYWs7 Cgl9CgktLW5lc3Q7Cn0KCnZvaWQKZmlsZWxvb3BlcihDbWQgKmNwLCBpbnQgWFkpCnsKCUZpbGUg KmYsICpjdXI7CglpbnQgaTsKCglpZihHbG9vcGluZysrKQoJCWVycm9yKEVuZXN0WFkpOwoJbmVz dCsrOwoJc2V0dGVtcGZpbGUoKTsKCWN1ciA9IGN1cmZpbGU7Cglmb3IoaSA9IDA7IGk8dGVtcGZp bGUubnVzZWQ7IGkrKyl7CgkJZiA9IHRlbXBmaWxlLmZpbGVwcHRyW2ldOwoJCWlmKGY9PWNtZCkK CQkJY29udGludWU7CgkJaWYoY3AtPnJlPT0wIHx8IGZpbGVtYXRjaChmLCBjcC0+cmUpPT1YWSkK CQkJY21kZXhlYyhmLCBjcC0+Y2NtZCk7Cgl9CglpZihjdXIgJiYgd2hpY2htZW51KGN1cik+PTAp CS8qIGNoZWNrIHRoYXQgY3VyIGlzIHN0aWxsIGEgZmlsZSAqLwoJCWN1cnJlbnQoY3VyKTsKCS0t R2xvb3Bpbmc7CgktLW5lc3Q7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc2FtMmsvc2FtL21rZmlsZQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAADAxMDA2NDQAMDAwMTczNwAwMDAwMTUxADAwMDAwMDAwNzYyADA3MTExNDA2 MjE2ADAwMTQ3MzUAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1 c3RhcgAwMHNjaHdhcnR6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NzZQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMDAwMDQwADAwMDAwMjcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8LyRvYmp0eXBlL21rZmlsZQoKVEFSRz1zYW0KT0ZJ TEVTPXNhbS4kT1wKCWFkZHJlc3MuJE9cCglidWZmLiRPXAoJY21kLiRPXAoJZGlzay4kT1wKCWVy cm9yLiRPXAoJZmlsZS4kT1wKCWlvLiRPXAoJbGlzdC4kT1wKCW1lc2cuJE9cCgltb3ZldG8uJE9c CgltdWx0aS4kT1wKCXBsYW45LiRPXAoJcmFzcC4kT1wKCXJlZ2V4cC4kT1wKCXNoZWxsLiRPXAoJ c3RyaW5nLiRPXAoJc3lzLiRPXAoJdXRpbC4kT1wKCXhlYy4kT1wKCkhGSUxFUz1zYW0uaFwKCWVy cm9ycy5oXAoJbWVzZy5oXAoKQklOPS8kb2JqdHlwZS9iaW4KPC9zeXMvc3JjL2NtZC9ta29uZQoK YWRkcmVzcy4kTyBjbWQuJE8gcGFyc2UuJE8geGVjLiRPIHVuaXguJE86CXBhcnNlLmgKCnNhZmVp bnN0YWxsOiAkTy5vdXQKCW12ICRCSU4vJFRBUkcgJEJJTi9vJFRBUkcKCWNwICRwcmVyZXEgJEJJ Ti8kVEFSRwoKc2FmZWluc3RhbGxhbGw6VjoKCWZvciAob2JqdHlwZSBpbiAkQ1BVUykKCQltayBz YWZlaW5zdGFsbAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= ------- =_aaaaaaaaaa0--