Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKICoKICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCiAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgogKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KICovCi8qCiAqCiAqIHRlcm0uYzogZnVuY3Rpb25zIGZvciBjb250cm9sbGluZyB0aGUgdGVybWluYWwKICoKICogcHJpbWl0aXZlIHRlcm1jYXAgc3VwcG9ydCBmb3IgQW1pZ2EsIE1TRE9TLCBhbmQgV2luMzIgaW5jbHVkZWQKICoKICogTk9URTogcGFkZGluZyBhbmQgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIG5vdCBwZXJmb3JtZWQsCiAqIHdoZW4gY29tcGlsaW5nIHdpdGhvdXQgSEFWRV9UR0VURU5ULCB3ZSB1c2UgdHB1dHMoKSBhbmQgdGdvdG8oKSBkdW1taWVzLgogKi8KCi8qCiAqIFNvbWUgc3lzdGVtcyBoYXZlIGEgcHJvdG90eXBlIGZvciB0Z2V0c3RyKCkgd2l0aCAoY2hhciAqKSBpbnN0ZWFkIG9mCiAqIChjaGFyICoqKS4gVGhpcyBkZWZpbmUgcmVtb3ZlcyB0aGF0IHByb3RvdHlwZS4gV2UgaW5jbHVkZSBvdXIgb3duIHByb3RvdHlwZQogKiBiZWxvdy4KICovCgojZGVmaW5lIHRnZXRzdHIgdGdldHN0cl9kZWZpbmVkX3dyb25nCiNpbmNsdWRlICJ2aW0uaCIKCiNpZmRlZiBIQVZFX1RHRVRFTlQKIyBpZmRlZiBIQVZFX1RFUk1JT1NfSAojICBpbmNsdWRlIDx0ZXJtaW9zLmg+CSAgICAvKiBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3Igc29tZSBMaW51eCAqLwojIGVuZGlmCiMgaWZkZWYgSEFWRV9URVJNQ0FQX0gKIyAgaW5jbHVkZSA8dGVybWNhcC5oPgojIGVuZGlmCgovKgogKiBBIGZldyBsaW51eCBzeXN0ZW1zIGRlZmluZSBvdXRmdW50eXBlIGluIHRlcm1jYXAuaCB0byBiZSB1c2VkIGFzIHRoZSB0aGlyZAogKiBhcmd1bWVudCBmb3IgdHB1dHMoKS4KICovCiMgaWZkZWYgVk1TCiMgIGRlZmluZSBUUFVUU0ZVTkNBU1QKIyBlbHNlCiMgIGlmZGVmIEhBVkVfT1VURlVOVFlQRQojICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAob3V0ZnVudHlwZSkKIyAgZWxzZQojICAgZGVmaW5lIFRQVVRTRlVOQ0FTVCAoaW50ICgqKSgpKQojICBlbmRpZgojIGVuZGlmCiNlbmRpZgoKI3VuZGVmIHRnZXRzdHIKCi8qCiAqIEhlcmUgYXJlIHRoZSBidWlsdGluIHRlcm1jYXAgZW50cmllcy4gIFRoZXkgYXJlIG5vdCBzdG9yZWQgYXMgY29tcGxldGUKICogVGNhcnIgc3RydWN0dXJlcywgYXMgc3VjaCBhIHN0cnVjdHVyZSBpcyB0b28gYmlnLgogKgogKiBUaGUgZW50cmllcyBhcmUgY29tcGFjdCwgdGhlcmVmb3JlIHRoZXkgbm9ybWFsbHkgYXJlIGluY2x1ZGVkIGV2ZW4gd2hlbgogKiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZC4gV2hlbiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCwgdGhlIGJ1aWx0aW4gZW50cmllcwogKiBjYW4gYmUgYWNjZXNzZWQgd2l0aCAiYnVpbHRpbl9hbWlnYSIsICJidWlsdGluX2Fuc2kiLCAiYnVpbHRpbl9kZWJ1ZyIsIGV0Yy4KICoKICogRWFjaCB0ZXJtY2FwIGlzIGEgbGlzdCBvZiBidWlsdGluX3Rlcm0gc3RydWN0dXJlcy4gSXQgYWx3YXlzIHN0YXJ0cyB3aXRoCiAqIEtTX05BTUUsIHdoaWNoIHNlcGFyYXRlcyB0aGUgZW50cmllcy4gIFNlZSBwYXJzZV9idWlsdGluX3RjYXAoKSBmb3IgYWxsCiAqIGRldGFpbHMuCiAqIGJ0X2VudHJ5IGlzIGVpdGhlciBhIEtTX3h4eCBjb2RlICg+PSAwKSwgb3IgYSBLX3h4eCBjb2RlLgogKgogKiBFbnRyaWVzIG1hcmtlZCB3aXRoICJndWVzc2VkIiBtYXkgYmUgd3JvbmcuCiAqLwpzdHJ1Y3QgYnVpbHRpbl90ZXJtCnsKICAgIGludAkJYnRfZW50cnk7CiAgICBjaGFyCSpidF9zdHJpbmc7Cn07CgovKiBzdGFydCBvZiBrZXlzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSB1c2VkIGJ5IFZpbSBidXQgY2FuIGJlIG1hcHBlZCAqLwojZGVmaW5lIEJUX0VYVFJBX0tFWVMJMHgxMDEKCnN0YXRpYyBzdHJ1Y3QgYnVpbHRpbl90ZXJtICpmaW5kX2J1aWx0aW5fdGVybSBfX0FSR1MoKGNoYXJfdSAqbmFtZSkpOwpzdGF0aWMgdm9pZCBwYXJzZV9idWlsdGluX3RjYXAgX19BUkdTKChjaGFyX3UgKnMpKTsKc3RhdGljIHZvaWQgdGVybV9jb2xvciBfX0FSR1MoKGNoYXJfdSAqcywgaW50IG4pKTsKc3RhdGljIHZvaWQgZ2F0aGVyX3Rlcm1sZWFkZXIgX19BUkdTKCh2b2lkKSk7CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQpzdGF0aWMgdm9pZCByZXFfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOwpzdGF0aWMgdm9pZCByZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0gX19BUkdTKCh2b2lkKSk7CnN0YXRpYyB2b2lkIGdvdF9jb2RlX2Zyb21fdGVybSBfX0FSR1MoKGNoYXJfdSAqY29kZSwgaW50IGxlbikpOwpzdGF0aWMgdm9pZCBjaGVja19mb3JfY29kZXNfZnJvbV90ZXJtIF9fQVJHUygodm9pZCkpOwojZW5kaWYKI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKICAgIHx8IChkZWZpbmVkKEZFQVRfTU9VU0UpICYmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pKSkKc3RhdGljIGludCBnZXRfYnl0ZXNfZnJvbV9idWYgX19BUkdTKChjaGFyX3UgKiwgY2hhcl91ICosIGludCkpOwojZW5kaWYKc3RhdGljIHZvaWQgZGVsX3Rlcm1jb2RlX2lkeCBfX0FSR1MoKGludCBpZHgpKTsKc3RhdGljIGludCB0ZXJtX2lzX2J1aWx0aW4gX19BUkdTKChjaGFyX3UgKm5hbWUpKTsKc3RhdGljIGludCB0ZXJtXzd0bzhiaXQgX19BUkdTKChjaGFyX3UgKnApKTsKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCnN0YXRpYyB2b2lkIHN3aXRjaF90b184Yml0IF9fQVJHUygodm9pZCkpOwojZW5kaWYKCiNpZmRlZiBIQVZFX1RHRVRFTlQKc3RhdGljIGNoYXJfdSAqdGdldGVudF9lcnJvciBfX0FSR1MoKGNoYXJfdSAqLCBjaGFyX3UgKikpOwoKLyoKICogSGVyZSBpcyBvdXIgb3duIHByb3RvdHlwZSBmb3IgdGdldHN0cigpLCBhbnkgcHJvdG90eXBlcyBmcm9tIHRoZSBpbmNsdWRlCiAqIGZpbGVzIGhhdmUgYmVlbiBkaXNhYmxlZCBieSB0aGUgZGVmaW5lIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZpbGUuCiAqLwpjaGFyCQkqdGdldHN0ciBfX0FSR1MoKGNoYXIgKiwgY2hhciAqKikpOwoKIyBpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQovKiBSZXF1ZXN0IFRlcm1pbmFsIFZlcnNpb24gc3RhdHVzOiAqLwojICBkZWZpbmUgQ1JWX0dFVAkxCS8qIHNlbmQgVF9DUlYgd2hlbiBzd2l0Y2hlZCB0byBSQVcgbW9kZSAqLwojICBkZWZpbmUgQ1JWX1NFTlQJMgkvKiBkaWQgc2VuZCBUX0NSViwgd2FpdGluZyBmb3IgYW5zd2VyICovCiMgIGRlZmluZSBDUlZfR09UCTMJLyogcmVjZWl2ZWQgVF9DUlYgcmVzcG9uc2UgKi8Kc3RhdGljIGludCBjcnZfc3RhdHVzID0gQ1JWX0dFVDsKIyBlbmRpZgoKLyoKICogRG9uJ3QgZGVjbGFyZSB0aGVzZSB2YXJpYWJsZXMgaWYgdGVybWNhcC5oIGNvbnRhaW5zIHRoZW0uCiAqIEF1dG9jb25mIGNoZWNrcyBpZiB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGV4dGVybiAobm90IGFsbAogKiBzeXN0ZW1zIGhhdmUgdGhlbSkuCiAqIFNvbWUgdmVyc2lvbnMgZGVmaW5lIG9zcGVlZCB0byBiZSBzcGVlZF90LCBidXQgdGhhdCBpcyBpbmNvbXBhdGlibGUgd2l0aAogKiBCU0QsIHdoZXJlIG9zcGVlZCBpcyBzaG9ydCBhbmQgc3BlZWRfdCBpcyBsb25nLgogKi8KIyBpZm5kZWYgSEFWRV9PU1BFRUQKIyAgaWZkZWYgT1NQRUVEX0VYVEVSTgpleHRlcm4gc2hvcnQgb3NwZWVkOwojICAgZWxzZQpzaG9ydCBvc3BlZWQ7CiMgICBlbmRpZgojIGVuZGlmCiMgaWZuZGVmIEhBVkVfVVBfQkNfUEMKIyAgaWZkZWYgVVBfQkNfUENfRVhURVJOCmV4dGVybiBjaGFyICpVUCwgKkJDLCBQQzsKIyAgZWxzZQpjaGFyICpVUCwgKkJDLCBQQzsKIyAgZW5kaWYKIyBlbmRpZgoKIyBkZWZpbmUgVEdFVFNUUihzLCBwKQl2aW1fdGdldHN0cigocyksIChwKSkKIyBkZWZpbmUgVEdFVEVOVChiLCB0KQl0Z2V0ZW50KChjaGFyICopKGIpLCAoY2hhciAqKSh0KSkKc3RhdGljIGNoYXJfdSAqdmltX3RnZXRzdHIgX19BUkdTKChjaGFyICpzLCBjaGFyX3UgKipwcCkpOwojZW5kaWYgLyogSEFWRV9UR0VURU5UICovCgpzdGF0aWMgaW50ICBkZXRlY3RlZF84Yml0ID0gRkFMU0U7CS8qIGRldGVjdGVkIDgtYml0IHRlcm1pbmFsICovCgpzdGF0aWMgc3RydWN0IGJ1aWx0aW5fdGVybSBidWlsdGluX3Rlcm1jYXBzW10gPQp7CgojaWYgZGVmaW5lZChGRUFUX0dVSSkKLyoKICogR1VJIHBzZXVkbyB0ZXJtLWNhcC4KICovCiAgICB7KGludClLU19OQU1FLAkiZ3VpIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzN8JCIsIEVTQ19TVFIgInwkIil9LAogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzfGkiLCBFU0NfU1RSICJ8aSIpfSwKIyBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM3wlcDElZEkiLCBFU0NfU1RSICJ8JXAxJWRJIil9LAojIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzN8JWRJIiwgRVNDX1NUUiAifCVkSSIpfSwKIyBlbmRpZgogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzfGQiLCBFU0NfU1RSICJ8ZCIpfSwKIyBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM3wlcDElZEQiLCBFU0NfU1RSICJ8JXAxJWREIil9LAogICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzfCVwMSVkOyVwMiVkUiIsIEVTQ19TVFIgInwlcDElZDslcDIlZFIiKX0sCiMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCUlGX0VCKCJcMDMzfCVwMSVkOyVwMiVkViIsIEVTQ19TVFIgInwlcDElZDslcDIlZFYiKX0sCiMgIGVuZGlmCiMgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM3wlZEQiLCBFU0NfU1RSICJ8JWREIil9LAogICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzfCVkOyVkUiIsIEVTQ19TVFIgInwlZDslZFIiKX0sCiMgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCUlGX0VCKCJcMDMzfCVkOyVkViIsIEVTQ19TVFIgInwlZDslZFYiKX0sCiMgIGVuZGlmCiMgZW5kaWYKICAgIHsoaW50KUtTX0NMLAlJRl9FQigiXDAzM3xDIiwgRVNDX1NUUiAifEMiKX0sCgkJCS8qIGF0dHJpYnV0ZXMgc3dpdGNoZWQgb24gd2l0aCAnaCcsIG9mZiB3aXRoICogJ0gnICovCiAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzN8MzFIIiwgRVNDX1NUUiAifDMxSCIpfSwgLyogSExfQUxMICovCiAgICB7KGludClLU19NUiwJSUZfRUIoIlwwMzN8MWgiLCBFU0NfU1RSICJ8MWgiKX0sICAgLyogSExfSU5WRVJTRSAqLwogICAgeyhpbnQpS1NfTUQsCUlGX0VCKCJcMDMzfDJoIiwgRVNDX1NUUiAifDJoIil9LCAgIC8qIEhMX0JPTEQgKi8KICAgIHsoaW50KUtTX1NFLAlJRl9FQigiXDAzM3wxNkgiLCBFU0NfU1RSICJ8MTZIIil9LCAvKiBITF9TVEFORE9VVCAqLwogICAgeyhpbnQpS1NfU08sCUlGX0VCKCJcMDMzfDE2aCIsIEVTQ19TVFIgInwxNmgiKX0sIC8qIEhMX1NUQU5ET1VUICovCiAgICB7KGludClLU19VRSwJSUZfRUIoIlwwMzN8OEgiLCBFU0NfU1RSICJ8OEgiKX0sICAgLyogSExfVU5ERVJMSU5FICovCiAgICB7KGludClLU19VUywJSUZfRUIoIlwwMzN8OGgiLCBFU0NfU1RSICJ8OGgiKX0sICAgLyogSExfVU5ERVJMSU5FICovCiAgICB7KGludClLU19VQ0UsCUlGX0VCKCJcMDMzfDhDIiwgRVNDX1NUUiAifDhDIil9LCAgIC8qIEhMX1VOREVSQ1VSTCAqLwogICAgeyhpbnQpS1NfVUNTLAlJRl9FQigiXDAzM3w4YyIsIEVTQ19TVFIgInw4YyIpfSwgICAvKiBITF9VTkRFUkNVUkwgKi8KICAgIHsoaW50KUtTX0NaUiwJSUZfRUIoIlwwMzN8NEgiLCBFU0NfU1RSICJ8NEgiKX0sICAgLyogSExfSVRBTElDICovCiAgICB7KGludClLU19DWkgsCUlGX0VCKCJcMDMzfDRoIiwgRVNDX1NUUiAifDRoIil9LCAgIC8qIEhMX0lUQUxJQyAqLwogICAgeyhpbnQpS1NfVkIsCUlGX0VCKCJcMDMzfGYiLCBFU0NfU1RSICJ8ZiIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCQkvKiBjdXJzb3ItbGVmdCA9IEJTICovCiAgICB7KGludClLU19ORCwJIlwwMTQifSwJLyogY3Vyc29yLXJpZ2h0ID0gQ1RSTC1MICovCiMgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlcDElZDslcDIlZE0iLCBFU0NfU1RSICJ8JXAxJWQ7JXAyJWRNIil9LAojIGVsc2UKICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM3wlZDslZE0iLCBFU0NfU1RSICJ8JWQ7JWRNIil9LAojIGVuZGlmCgkvKiB0aGVyZSBhcmUgbm8ga2V5IHNlcXVlbmNlcyBoZXJlLCB0aGUgR1VJIHNlcXVlbmNlcyBhcmUgcmVjb2duaXplZAoJICogaW4gY2hlY2tfdGVybWNvZGUoKSAqLwojZW5kaWYKCiNpZm5kZWYgTk9fQlVJTFRJTl9UQ0FQUwojIGlmIGRlZmluZWQoUklTQ09TKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBEZWZhdWx0IGZvciB0aGUgQWNvcm4uCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJInJpc2NvcyJ9LAogICAgeyhpbnQpS1NfQ0wsCSJcMDE0In0sCQkvKiBDbHMgYW5kIEhvbWUgQ3Vyc29yICovCiAgICB7KGludClLU19DTSwJIlwwMDElZFwwMDElZFwwMDIifSwJLyogUG9zaXRpb24gY3Vyc29yICovCgogICAgeyhpbnQpS1NfQ0NPLAkiMTYifSwJCQkvKiBBbGxvdyAxNiBjb2xvcnMgKi8KCiAgICB7KGludClLU19DQUYsCSJcMDAxJWRcMDIxIn0sCQkvKiBTZXQgZm9yZWdyb3VuZCBjb2xvdXIgKi8KICAgIHsoaW50KUtTX0NBQiwJIlwwMDElZFwwMjIifSwJCS8qIFNldCBiYWNrZ3JvdW5kIGNvbG91ciAqLwoKCiAgICB7KGludClLU19NRSwJIlwwMDQifSwJCS8qIE5vcm1hbCBtb2RlICovCiAgICB7KGludClLU19NUiwJIlwwMDUifSwJCS8qIFJldmVyc2UgKi8KCiAgICB7KGludClLU19WSSwJIlwwMTYifSwJCS8qIEN1cnNvciBpbnZpc2libGUgKi8KICAgIHsoaW50KUtTX1ZFLAkiXDAxNyJ9LAkJLyogQ3Vyc29yIHZpc2libGUgKi8KICAgIHsoaW50KUtTX1ZTLAkiXDAyMCJ9LAkJLyogQ3Vyc29yIHZlcnkgdmlzaWJsZSAqLwoKICAgIHsoaW50KUtTX0NTLAkiXDAwMSVkXDAwMSVkXDAwMyJ9LAkvKiBTZXQgc2Nyb2xsIHJlZ2lvbiAqLwogICAgeyhpbnQpS1NfU1IsCSJcMDIzIn0sCQkvKiBTY3JvbGwgdGV4dCBkb3duICovCiAgICB7S19VUCwJCSJcMjE3In0sCiAgICB7S19ET1dOLAkJIlwyMTYifSwKICAgIHtLX0xFRlQsCQkiXDIxNCJ9LAogICAge0tfUklHSFQsCQkiXDIxNSJ9LAogICAge0tfU19VUCwJCSJcMjM3In0sCiAgICB7S19TX0RPV04sCQkiXDIzNiJ9LAogICAge0tfU19MRUZULAkJIlwyMzQifSwKICAgIHtLX1NfUklHSFQsCQkiXDIzNSJ9LAoKICAgIHtLX0YxLAkJIlwyMDEifSwKICAgIHtLX0YyLAkJIlwyMDIifSwKICAgIHtLX0YzLAkJIlwyMDMifSwKICAgIHtLX0Y0LAkJIlwyMDQifSwKICAgIHtLX0Y1LAkJIlwyMDUifSwKICAgIHtLX0Y2LAkJIlwyMDYifSwKICAgIHtLX0Y3LAkJIlwyMDcifSwKICAgIHtLX0Y4LAkJIlwyMTAifSwKICAgIHtLX0Y5LAkJIlwyMTEifSwKICAgIHtLX0YxMCwJCSJcMzEyIn0sCiAgICB7S19GMTEsCQkiXDMxMyJ9LAogICAge0tfRjEyLAkJIlwzMTQifSwKICAgIHtLX1NfRjEsCQkiXDIyMSJ9LAogICAge0tfU19GMiwJCSJcMjIyIn0sCiAgICB7S19TX0YzLAkJIlwyMjMifSwKICAgIHtLX1NfRjQsCQkiXDIyNCJ9LAogICAge0tfU19GNSwJCSJcMjI1In0sCiAgICB7S19TX0Y2LAkJIlwyMjYifSwKICAgIHtLX1NfRjcsCQkiXDIyNyJ9LAogICAge0tfU19GOCwJCSJcMjMwIn0sCiAgICB7S19TX0Y5LAkJIlwyMzEifSwKICAgIHtLX1NfRjEwLAkJIlwzMzIifSwKICAgIHtLX1NfRjExLAkJIlwzMzMifSwKICAgIHtLX1NfRjEyLAkJIlwzMzQifSwKICAgIHtLX0JTLAkJIlwwMTAifSwKICAgIHtLX0lOUywJCSJcMzE1In0sCiAgICB7S19ERUwsCQkiXDE3NyJ9LAogICAge0tfSE9NRSwJCSJcMDM2In0sCiAgICB7S19FTkQsCQkiXDIxMyJ9LAogICAge0tfUEFHRVVQLAkJIlwyMzcifSwKICAgIHtLX1BBR0VET1dOLAkiXDIzNiJ9LAojIGVuZGlmCS8qIEFjb3JuIHRlcm1pbmFsICovCgoKIyBpZiBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBBbWlnYSBjb25zb2xlIHdpbmRvdywgZGVmYXVsdCBmb3IgQW1pZ2EKICovCiAgICB7KGludClLU19OQU1FLAkiYW1pZ2EifSwKICAgIHsoaW50KUtTX0NFLAkiXDAzM1tLIn0sCiAgICB7KGludClLU19DRCwJIlwwMzNbSiJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJXAxJWRMIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIlwwMzNbJWRMIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slcDElZE0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM1slZE0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAogICAgeyhpbnQpS1NfVkksCSJcMDMzWzAgcCJ9LAogICAgeyhpbnQpS1NfVkUsCSJcMDMzWzEgcCJ9LAogICAgeyhpbnQpS1NfTUUsCSJcMDMzWzBtIn0sCiAgICB7KGludClLU19NUiwJIlwwMzNbN20ifSwKICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAogICAgeyhpbnQpS1NfU0UsCSJcMDMzWzBtIn0sCiAgICB7KGludClLU19TTywJIlwwMzNbMzNtIn0sCiAgICB7KGludClLU19VUywJIlwwMzNbNG0ifSwKICAgIHsoaW50KUtTX1VFLAkiXDAzM1swbSJ9LAogICAgeyhpbnQpS1NfQ1pILAkiXDAzM1szbSJ9LAogICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1swbSJ9LAojaWYgZGVmaW5lZChfX01PUlBIT1NfXykgfHwgZGVmaW5lZChfX0FST1NfXykKICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX09QLAkiXDAzM1ttIn0sCS8qIHJlc2V0IGNvbG9ycyAqLwojZW5kaWYKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiNpZiBkZWZpbmVkKF9fTU9SUEhPU19fKQogICAgeyhpbnQpS1NfU1IsCSJcMDMzTSJ9LAojZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCiMgIGVuZGlmCiAgICB7S19VUCwJCSJcMjMzQSJ9LAogICAge0tfRE9XTiwJCSJcMjMzQiJ9LAogICAge0tfTEVGVCwJCSJcMjMzRCJ9LAogICAge0tfUklHSFQsCQkiXDIzM0MifSwKICAgIHtLX1NfVVAsCQkiXDIzM1QifSwKICAgIHtLX1NfRE9XTiwJCSJcMjMzUyJ9LAogICAge0tfU19MRUZULAkJIlwyMzMgQSJ9LAogICAge0tfU19SSUdIVCwJCSJcMjMzIEAifSwKICAgIHtLX1NfVEFCLAkJIlwyMzNaIn0sCiAgICB7S19GMSwJCSJcMjMzXDA2MH4ifSwvKiBzb21lIGNvbXBpbGVycyBkb24ndCBkaWcgIlwyMzMwIiAqLwogICAge0tfRjIsCQkiXDIzM1wwNjF+In0sCiAgICB7S19GMywJCSJcMjMzXDA2Mn4ifSwKICAgIHtLX0Y0LAkJIlwyMzNcMDYzfiJ9LAogICAge0tfRjUsCQkiXDIzM1wwNjR+In0sCiAgICB7S19GNiwJCSJcMjMzXDA2NX4ifSwKICAgIHtLX0Y3LAkJIlwyMzNcMDY2fiJ9LAogICAge0tfRjgsCQkiXDIzM1wwNjd+In0sCiAgICB7S19GOSwJCSJcMjMzXDA3MH4ifSwKICAgIHtLX0YxMCwJCSJcMjMzXDA3MX4ifSwKICAgIHtLX1NfRjEsCQkiXDIzM1wwNjFcMDYwfiJ9LAogICAge0tfU19GMiwJCSJcMjMzXDA2MVwwNjF+In0sCiAgICB7S19TX0YzLAkJIlwyMzNcMDYxXDA2Mn4ifSwKICAgIHtLX1NfRjQsCQkiXDIzM1wwNjFcMDYzfiJ9LAogICAge0tfU19GNSwJCSJcMjMzXDA2MVwwNjR+In0sCiAgICB7S19TX0Y2LAkJIlwyMzNcMDYxXDA2NX4ifSwKICAgIHtLX1NfRjcsCQkiXDIzM1wwNjFcMDY2fiJ9LAogICAge0tfU19GOCwJCSJcMjMzXDA2MVwwNjd+In0sCiAgICB7S19TX0Y5LAkJIlwyMzNcMDYxXDA3MH4ifSwKICAgIHtLX1NfRjEwLAkJIlwyMzNcMDYxXDA3MX4ifSwKICAgIHtLX0hFTFAsCQkiXDIzMz9+In0sCiAgICB7S19JTlMsCQkiXDIzM1wwNjRcMDYwfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCiAgICB7S19QQUdFVVAsCQkiXDIzM1wwNjRcMDYxfiJ9LAkvKiAxMDEga2V5IGtleWJvYXJkICovCiAgICB7S19QQUdFRE9XTiwJIlwyMzNcMDY0XDA2Mn4ifSwJLyogMTAxIGtleSBrZXlib2FyZCAqLwogICAge0tfSE9NRSwJCSJcMjMzXDA2NFwwNjR+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KICAgIHtLX0VORCwJCSJcMjMzXDA2NFwwNjV+In0sCS8qIDEwMSBrZXkga2V5Ym9hcmQgKi8KCiAgICB7QlRfRVhUUkFfS0VZUywJIiJ9LAogICAge1RFUk1DQVAyS0VZKCcjJywgJzInKSwgIlwyMzNcMDY1XDA2NH4ifSwJLyogc2hpZnRlZCBob21lIGtleSAqLwogICAge1RFUk1DQVAyS0VZKCcjJywgJzMnKSwgIlwyMzNcMDY1XDA2MH4ifSwJLyogc2hpZnRlZCBpbnNlcnQga2V5ICovCiAgICB7VEVSTUNBUDJLRVkoJyonLCAnNycpLCAiXDIzM1wwNjVcMDY1fiJ9LAkvKiBzaGlmdGVkIGVuZCBrZXkgKi8KIyBlbmRpZgoKIyBpZiBkZWZpbmVkKF9fQkVPU19fKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBhbG1vc3Qgc3RhbmRhcmQgQU5TSSB0ZXJtaW5hbCwgZGVmYXVsdCBmb3IgYmVib3gKICovCiAgICB7KGludClLU19OQU1FLAkiYmVvcy1hbnNpIn0sCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVkTCJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJWRNIn0sCiMgIGVuZGlmCiNpZmRlZiBCRU9TX1BSX09SX0JFVFRFUgojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJXAxJWQ7JXAyJWRyIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiXDAzM1slaSVkOyVkciJ9LAkvKiBzY3JvbGwgcmVnaW9uICovCiMgIGVuZGlmCiNlbmRpZgogICAgeyhpbnQpS1NfQ0wsCSJcMDMzW0hcMDMzWzJKIn0sCiNpZmRlZiBub3R5ZXQKICAgIHsoaW50KUtTX1ZJLAkiW1ZJXSJ9LCAvKiBjdXJzb3IgaW52aXNpYmxlLCBWVDMyMDogQ1NJID8gMjUgbCAqLwogICAgeyhpbnQpS1NfVkUsCSJbVkVdIn0sIC8qIGN1cnNvciB2aXNpYmxlLCBWVDMyMDogQ1NJID8gMjUgaCAqLwojZW5kaWYKICAgIHsoaW50KUtTX01FLAkiXDAzM1ttIn0sCS8qIG5vcm1hbCBtb2RlICovCiAgICB7KGludClLU19NUiwJIlwwMzNbN20ifSwJLyogcmV2ZXJzZSAqLwogICAgeyhpbnQpS1NfTUQsCSJcMDMzWzFtIn0sCS8qIGJvbGQgKi8KICAgIHsoaW50KUtTX1NPLAkiXDAzM1szMW0ifSwJLyogc3RhbmRvdXQgbW9kZTogcmVkICovCiAgICB7KGludClLU19TRSwJIlwwMzNbbSJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbMzVtIn0sCS8qIGl0YWxpYzogcHVycGxlICovCiAgICB7KGludClLU19DWlIsCSJcMDMzW20ifSwJLyogaXRhbGljIGVuZCAqLwogICAgeyhpbnQpS1NfVVMsCSJcMDMzWzRtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzW20ifSwJLyogdW5kZXJzY29yZSBlbmQgKi8KICAgIHsoaW50KUtTX0NDTywJIjgifSwJCS8qIGFsbG93IDggY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlcDElZG0ifSwvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JWRtIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlZG0ifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX09QLAkiXDAzM1ttIn0sCS8qIHJlc2V0IGNvbG9ycyAqLwogICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBzYWZlIHRvIG1vdmUgY3VyIGluIHJldmVyc2UgbW9kZSAqLwogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAojICBlbmRpZgojaWYgZGVmaW5lZChCRU9TX0RSOCkKICAgIHsoaW50KUtTX0RCLAkiIn0sCQkvKiBoYWNrISBzZWUgc2NyZWVuLmMgKi8KI2VuZGlmCgogICAge0tfVVAsCQkiXDAzM1tBIn0sCiAgICB7S19ET1dOLAkJIlwwMzNbQiJ9LAogICAge0tfTEVGVCwJCSJcMDMzW0QifSwKICAgIHtLX1JJR0hULAkJIlwwMzNbQyJ9LAojIGVuZGlmCgojIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChTT01FX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKLyoKICogc3RhbmRhcmQgQU5TSSB0ZXJtaW5hbCwgZGVmYXVsdCBmb3IgdW5peAogKi8KICAgIHsoaW50KUtTX05BTUUsCSJhbnNpIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNbSyIsIEVTQ19TVFIgIltLIil9LAogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJXAxJWRMIiwgRVNDX1NUUiAiWyVwMSVkTCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slZEwiLCBFU0NfU1RSICJbJWRMIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJXAxJWRNIiwgRVNDX1NUUiAiWyVwMSVkTSIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slZE0iLCBFU0NfU1RSICJbJWRNIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1swbSIsIEVTQ19TVFIgIlswbSIpfSwKICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLCBFU0NfU1RSICJbJWklcDElZDslcDIlZEgiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVkOyVkSCIsIEVTQ19TVFIgIlslaSVkOyVkSCIpfSwKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJXAxJWRDIiwgRVNDX1NUUiAiWyVwMSVkQyIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slZEMiLCBFU0NfU1RSICJbJWRDIil9LAojICBlbmRpZgojIGVuZGlmCgojIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoX19FTVhfXykKLyoKICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIHdoZW4gbmFuc2kuc3lzIG9yIGVxdWl2YWxlbnQgaGFzIGJlZW4gaW5zdGFsbGVkLgogKiBGdW5jdGlvbiBrZXlzIG9uIGEgUEMgYXJlIHByZWNlZGVkIHdpdGggYSBOVUwuIFRoZXNlIGFyZSBjb252ZXJ0ZWQgaW50bwogKiBLX05VTCAnXDMxNicgaW4gbWNoX2luY2hhcigpLCBiZWNhdXNlIHdlIGNhbm5vdCBoYW5kbGUgTlVMcyBpbiBrZXkgY29kZXMuCiAqIENUUkwtYXJyb3cgaXMgdXNlZCBpbnN0ZWFkIG9mIFNISUZULWFycm93LgogKi8KI2lmZGVmIF9fRU1YX18KICAgIHsoaW50KUtTX05BTUUsCSJvczJhbnNpIn0sCiNlbHNlCiAgICB7KGludClLU19OQU1FLAkicGNhbnNpIn0sCiAgICB7KGludClLU19ETCwJIlwwMzNbTSJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzW0wifSwKI2VuZGlmCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0wsCSJcMDMzWzJKIn0sCiAgICB7KGludClLU19NRSwJIlwwMzNbMG0ifSwKICAgIHsoaW50KUtTX01SLAkiXDAzM1s1bSJ9LAkvKiByZXZlcnNlOiBibGFjayBvbiBsaWdodGdyZXkgKi8KICAgIHsoaW50KUtTX01ELAkiXDAzM1sxbSJ9LAkvKiBib2xkOiB3aGl0ZSB0ZXh0ICovCiAgICB7KGludClLU19TRSwJIlwwMzNbMG0ifSwJLyogc3RhbmRvdXQgZW5kICovCiAgICB7KGludClLU19TTywJIlwwMzNbMzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCiAgICB7KGludClLU19DWkgsCSJcMDMzWzM0OzQzbSJ9LAkvKiBpdGFsaWMgbW9kZTogYmx1ZSB0ZXh0IG9uIHllbGxvdyAqLwogICAgeyhpbnQpS1NfQ1pSLAkiXDAzM1swbSJ9LAkvKiBpdGFsaWMgbW9kZSBlbmQgKi8KICAgIHsoaW50KUtTX1VTLAkiXDAzM1szNjs0MW0ifSwJLyogdW5kZXJzY29yZSBtb2RlOiBjeWFuIHRleHQgb24gcmVkICovCiAgICB7KGludClLU19VRSwJIlwwMzNbMG0ifSwJLyogdW5kZXJzY29yZSBtb2RlIGVuZCAqLwogICAgeyhpbnQpS1NfQ0NPLAkiOCJ9LAkJLyogYWxsb3cgOCBjb2xvcnMgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBQiwJIlwwMzNbNCVwMSVkbSJ9LC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzWzMlcDElZG0ifSwvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzNbMyVkbSJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbmRpZgogICAgeyhpbnQpS1NfT1AsCSJcMDMzWzBtIn0sCS8qIHJlc2V0IGNvbG9ycyAqLwogICAgeyhpbnQpS1NfTVMsCSJ5In0sCiAgICB7KGludClLU19VVCwJInkifSwJCS8qIGd1ZXNzZWQgKi8KICAgIHsoaW50KUtTX0xFLAkiXGIifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAkiXDAzM1slaSVwMSVkOyVwMiVkSCJ9LAojICBlbHNlCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklZDslZEgifSwKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJXAxJWRDIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIlwwMzNbJWRDIn0sCiMgIGVuZGlmCiAgICB7S19VUCwJCSJcMzE2SCJ9LAogICAge0tfRE9XTiwJCSJcMzE2UCJ9LAogICAge0tfTEVGVCwJCSJcMzE2SyJ9LAogICAge0tfUklHSFQsCQkiXDMxNk0ifSwKICAgIHtLX1NfTEVGVCwJCSJcMzE2cyJ9LAogICAge0tfU19SSUdIVCwJCSJcMzE2dCJ9LAogICAge0tfRjEsCQkiXDMxNjsifSwKICAgIHtLX0YyLAkJIlwzMTY8In0sCiAgICB7S19GMywJCSJcMzE2PSJ9LAogICAge0tfRjQsCQkiXDMxNj4ifSwKICAgIHtLX0Y1LAkJIlwzMTY/In0sCiAgICB7S19GNiwJCSJcMzE2QCJ9LAogICAge0tfRjcsCQkiXDMxNkEifSwKICAgIHtLX0Y4LAkJIlwzMTZCIn0sCiAgICB7S19GOSwJCSJcMzE2QyJ9LAogICAge0tfRjEwLAkJIlwzMTZEIn0sCiAgICB7S19GMTEsCQkiXDMxNlwyMDUifSwJLyogZ3Vlc3NlZCAqLwogICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCS8qIGd1ZXNzZWQgKi8KICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKICAgIHtLX1NfRjMsCQkiXDMxNlYifSwKICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKICAgIHtLX1NfRjYsCQkiXDMxNlkifSwKICAgIHtLX1NfRjcsCQkiXDMxNloifSwKICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKICAgIHtLX1NfRjksCQkiXDMxNlxcIn0sCiAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAogICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwJLyogZ3Vlc3NlZCAqLwogICAge0tfU19GMTIsCQkiXDMxNlwyMTAifSwJLyogZ3Vlc3NlZCAqLwogICAge0tfSU5TLAkJIlwzMTZSIn0sCiAgICB7S19ERUwsCQkiXDMxNlMifSwKICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKICAgIHtLX0VORCwJCSJcMzE2TyJ9LAogICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAogICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChNU0RPUykKLyoKICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIGZvciB0aGUgcGMgdmlkZW8uICBUaGUgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGggRVNDIHwKICogYXJlIHRyYW5zbGF0ZWQgaW50byBjb25pbyBjYWxscyBpbiBvc19tc2Rvcy5jLiBEZWZhdWx0IGZvciBNU0RPUy4KICovCiAgICB7KGludClLU19OQU1FLAkicGN0ZXJtIn0sCiAgICB7KGludClLU19DRSwJIlwwMzN8SyJ9LAogICAgeyhpbnQpS1NfQUwsCSJcMDMzfEwifSwKICAgIHsoaW50KUtTX0RMLAkiXDAzM3xNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwKIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCSJcMDMzfCVpJXAxJWQ7JXAyJWRWIn0sCiMgICBlbmRpZgojICBlbHNlCiAgICB7KGludClLU19DUywJIlwwMzN8JWklZDslZHIifSwKIyAgIGlmZGVmIEZFQVRfVkVSVFNQTElUCiAgICB7KGludClLU19DU1YsCSJcMDMzfCVpJWQ7JWRWIn0sCiMgICBlbmRpZgojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCSJcMDMzfEoifSwKICAgIHsoaW50KUtTX01FLAkiXDAzM3wwbSJ9LAkvKiBub3JtYWwgKi8KICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JleSAqLwogICAgeyhpbnQpS1NfTUQsCSJcMDMzfDE1bSJ9LAkvKiBib2xkOiB3aGl0ZSB0ZXh0ICovCiAgICB7KGludClLU19TRSwJIlwwMzN8MG0ifSwJLyogc3RhbmRvdXQgZW5kICovCiAgICB7KGludClLU19TTywJIlwwMzN8MzFtIn0sCS8qIHN0YW5kb3V0OiB3aGl0ZSBvbiBibHVlICovCiAgICB7KGludClLU19DWkgsCSJcMDMzfDIyNW0ifSwJLyogaXRhbGljIG1vZGU6IGJsdWUgdGV4dCBvbiB5ZWxsb3cgKi8KICAgIHsoaW50KUtTX0NaUiwJIlwwMzN8MG0ifSwJLyogaXRhbGljIG1vZGUgZW5kICovCiAgICB7KGludClLU19VUywJIlwwMzN8NjdtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZTogY3lhbiB0ZXh0IG9uIHJlZCAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzfDBtIn0sCS8qIHVuZGVyc2NvcmUgbW9kZSBlbmQgKi8KICAgIHsoaW50KUtTX0NDTywJIjE2In0sCQkvKiBhbGxvdyAxNiBjb2xvcnMgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBQiwJIlwwMzN8JXAxJWRiIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCiAgICB7KGludClLU19DQUYsCSJcMDMzfCVwMSVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJcMDMzfCVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzN8JWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzfCVpJWQ7JWRIIn0sCiMgIGVuZGlmCiNpZmRlZiBESkdQUAogICAgeyhpbnQpS1NfVkIsCSJcMDMzfEIifSwJLyogdmlzdWFsIGJlbGwgKi8KI2VuZGlmCiAgICB7S19VUCwJCSJcMzE2SCJ9LAogICAge0tfRE9XTiwJCSJcMzE2UCJ9LAogICAge0tfTEVGVCwJCSJcMzE2SyJ9LAogICAge0tfUklHSFQsCQkiXDMxNk0ifSwKICAgIHtLX1NfTEVGVCwJCSJcMzE2cyJ9LAogICAge0tfU19SSUdIVCwJCSJcMzE2dCJ9LAogICAge0tfU19UQUIsCQkiXDMxNlwwMTcifSwKICAgIHtLX0YxLAkJIlwzMTY7In0sCiAgICB7S19GMiwJCSJcMzE2PCJ9LAogICAge0tfRjMsCQkiXDMxNj0ifSwKICAgIHtLX0Y0LAkJIlwzMTY+In0sCiAgICB7S19GNSwJCSJcMzE2PyJ9LAogICAge0tfRjYsCQkiXDMxNkAifSwKICAgIHtLX0Y3LAkJIlwzMTZBIn0sCiAgICB7S19GOCwJCSJcMzE2QiJ9LAogICAge0tfRjksCQkiXDMxNkMifSwKICAgIHtLX0YxMCwJCSJcMzE2RCJ9LAogICAge0tfRjExLAkJIlwzMTZcMjA1In0sCiAgICB7S19GMTIsCQkiXDMxNlwyMDYifSwKICAgIHtLX1NfRjEsCQkiXDMxNlQifSwKICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKICAgIHtLX1NfRjMsCQkiXDMxNlYifSwKICAgIHtLX1NfRjQsCQkiXDMxNlcifSwKICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKICAgIHtLX1NfRjYsCQkiXDMxNlkifSwKICAgIHtLX1NfRjcsCQkiXDMxNloifSwKICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKICAgIHtLX1NfRjksCQkiXDMxNlxcIn0sCiAgICB7S19TX0YxMCwJCSJcMzE2XSJ9LAogICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwKICAgIHtLX1NfRjEyLAkJIlwzMTZcMjEwIn0sCiAgICB7S19JTlMsCQkiXDMxNlIifSwKICAgIHtLX0RFTCwJCSJcMzE2UyJ9LAogICAge0tfSE9NRSwJCSJcMzE2RyJ9LAogICAge0tfRU5ELAkJIlwzMTZPIn0sCiAgICB7S19QQUdFRE9XTiwJIlwzMTZRIn0sCiAgICB7S19QQUdFVVAsCQkiXDMxNkkifSwKICAgIHtLX0tQTFVTLAkJIlwzMTZOIn0sCiAgICB7S19LTUlOVVMsCQkiXDMxNkoifSwKICAgIHtLX0tNVUxUSVBMWSwJIlwzMTY3In0sCiAgICB7S19LMCwJCSJcMzE2XDMzMiJ9LAogICAge0tfSzEsCQkiXDMxNlwzMzYifSwKICAgIHtLX0syLAkJIlwzMTZcMzQyIn0sCiAgICB7S19LMywJCSJcMzE2XDM0NiJ9LAogICAge0tfSzQsCQkiXDMxNlwzNTIifSwKICAgIHtLX0s1LAkJIlwzMTZcMzU2In0sCiAgICB7S19LNiwJCSJcMzE2XDM2MiJ9LAogICAge0tfSzcsCQkiXDMxNlwzNjYifSwKICAgIHtLX0s4LAkJIlwzMTZcMzcyIn0sCiAgICB7S19LOSwJCSJcMzE2XDM3NiJ9LAojIGVuZGlmCgojIGlmIGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX0VNWF9fKQovKgogKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgZm9yIHRoZSBXaW4zMiBDb25zb2xlIC4gIFRoZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aAogKiBFU0MgfCBhcmUgdHJhbnNsYXRlZCBpbnRvIGNvbnNvbGUgY2FsbHMgaW4gb3Nfd2luMzIuYy4gIFRoZSBmdW5jdGlvbiBrZXlzCiAqIGFyZSBhbHNvIHRyYW5zbGF0ZWQgaW4gb3Nfd2luMzIuYy4KICovCiAgICB7KGludClLU19OQU1FLAkid2luMzIifSwKICAgIHsoaW50KUtTX0NFLAkiXDAzM3xLIn0sCS8qIGNsZWFyIHRvIGVuZCBvZiBsaW5lICovCiAgICB7KGludClLU19BTCwJIlwwMzN8TCJ9LAkvKiBhZGQgbmV3IGJsYW5rIGxpbmUgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJIlwwMzN8JXAxJWRMIn0sCS8qIGFkZCBudW1iZXIgb2YgbmV3IGJsYW5rIGxpbmVzICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIlwwMzN8JWRMIn0sCS8qIGFkZCBudW1iZXIgb2YgbmV3IGJsYW5rIGxpbmVzICovCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJIlwwMzN8TSJ9LAkvKiBkZWxldGUgbGluZSAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiXDAzM3wlcDElZE0ifSwJLyogZGVsZXRlIG51bWJlciBvZiBsaW5lcyAqLwojICBlbHNlCiAgICB7KGludClLU19DREwsCSJcMDMzfCVkTSJ9LAkvKiBkZWxldGUgbnVtYmVyIG9mIGxpbmVzICovCiMgIGVuZGlmCiAgICB7KGludClLU19DTCwJIlwwMzN8SiJ9LAkvKiBjbGVhciBzY3JlZW4gKi8KICAgIHsoaW50KUtTX0NELAkiXDAzM3xqIn0sCS8qIGNsZWFyIHRvIGVuZCBvZiBkaXNwbGF5ICovCiAgICB7KGludClLU19WSSwJIlwwMzN8diJ9LAkvKiBjdXJzb3IgaW52aXNpYmxlICovCiAgICB7KGludClLU19WRSwJIlwwMzN8ViJ9LAkvKiBjdXJzb3IgdmlzaWJsZSAqLwoKICAgIHsoaW50KUtTX01FLAkiXDAzM3wwbSJ9LAkvKiBub3JtYWwgKi8KICAgIHsoaW50KUtTX01SLAkiXDAzM3wxMTJtIn0sCS8qIHJldmVyc2U6IGJsYWNrIG9uIGxpZ2h0Z3JheSAqLwogICAgeyhpbnQpS1NfTUQsCSJcMDMzfDE1bSJ9LAkvKiBib2xkOiB3aGl0ZSBvbiBibGFjayAqLwojaWYgMQogICAgeyhpbnQpS1NfU08sCSJcMDMzfDMxbSJ9LAkvKiBzdGFuZG91dDogd2hpdGUgb24gYmx1ZSAqLwogICAgeyhpbnQpS1NfU0UsCSJcMDMzfDBtIn0sCS8qIHN0YW5kb3V0IGVuZCAqLwojZWxzZQogICAgeyhpbnQpS1NfU08sCSJcMDMzfEYifSwJLyogc3RhbmRvdXQ6IGhpZ2ggaW50ZW5zaXR5ICovCiAgICB7KGludClLU19TRSwJIlwwMzN8ZiJ9LAkvKiBzdGFuZG91dCBlbmQgKi8KI2VuZGlmCiAgICB7KGludClLU19DWkgsCSJcMDMzfDIyNW0ifSwJLyogaXRhbGljOiBibHVlIHRleHQgb24geWVsbG93ICovCiAgICB7KGludClLU19DWlIsCSJcMDMzfDBtIn0sCS8qIGl0YWxpYyBlbmQgKi8KICAgIHsoaW50KUtTX1VTLAkiXDAzM3w2N20ifSwJLyogdW5kZXJzY29yZTogY3lhbiB0ZXh0IG9uIHJlZCAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzfDBtIn0sCS8qIHVuZGVyc2NvcmUgZW5kICovCiAgICB7KGludClLU19DQ08sCSIxNiJ9LAkJLyogYWxsb3cgMTYgY29sb3JzICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUIsCSJcMDMzfCVwMSVkYiJ9LAkvKiBzZXQgYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlcDElZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NBRiwJIlwwMzN8JWRmIn0sCS8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCiMgIGVuZGlmCgogICAgeyhpbnQpS1NfTVMsCSJ5In0sCQkvKiBzYXZlIHRvIG1vdmUgY3VyIGluIHJldmVyc2UgbW9kZSAqLwogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzN8JWklcDElZDslcDIlZEgifSwvKiBjdXJzb3IgbW90aW9uICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NNLAkiXDAzM3wlaSVkOyVkSCJ9LC8qIGN1cnNvciBtb3Rpb24gKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX1ZCLAkiXDAzM3xCIn0sCS8qIHZpc3VhbCBiZWxsICovCiAgICB7KGludClLU19USSwJIlwwMzN8UyJ9LAkvKiBwdXQgdGVybWluYWwgaW4gdGVybWNhcCBtb2RlICovCiAgICB7KGludClLU19URSwJIlwwMzN8RSJ9LAkvKiBvdXQgb2YgdGVybWNhcCBtb2RlICovCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlwwMzN8JWklcDElZDslcDIlZHIifSwvKiBzY3JvbGwgcmVnaW9uICovCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiXDAzM3wlaSVkOyVkciJ9LC8qIHNjcm9sbCByZWdpb24gKi8KIyAgZW5kaWYKCiAgICB7S19VUCwJCSJcMzE2SCJ9LAogICAge0tfRE9XTiwJCSJcMzE2UCJ9LAogICAge0tfTEVGVCwJCSJcMzE2SyJ9LAogICAge0tfUklHSFQsCQkiXDMxNk0ifSwKICAgIHtLX1NfVVAsCQkiXDMxNlwzMDQifSwKICAgIHtLX1NfRE9XTiwJCSJcMzE2XDMxNyJ9LAogICAge0tfU19MRUZULAkJIlwzMTZcMzExIn0sCiAgICB7S19DX0xFRlQsCQkiXDMxNnMifSwKICAgIHtLX1NfUklHSFQsCQkiXDMxNlwzMTMifSwKICAgIHtLX0NfUklHSFQsCQkiXDMxNnQifSwKICAgIHtLX1NfVEFCLAkJIlwzMTZcMDE3In0sCiAgICB7S19GMSwJCSJcMzE2OyJ9LAogICAge0tfRjIsCQkiXDMxNjwifSwKICAgIHtLX0YzLAkJIlwzMTY9In0sCiAgICB7S19GNCwJCSJcMzE2PiJ9LAogICAge0tfRjUsCQkiXDMxNj8ifSwKICAgIHtLX0Y2LAkJIlwzMTZAIn0sCiAgICB7S19GNywJCSJcMzE2QSJ9LAogICAge0tfRjgsCQkiXDMxNkIifSwKICAgIHtLX0Y5LAkJIlwzMTZDIn0sCiAgICB7S19GMTAsCQkiXDMxNkQifSwKICAgIHtLX0YxMSwJCSJcMzE2XDIwNSJ9LAogICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCiAgICB7S19TX0YxLAkJIlwzMTZUIn0sCiAgICB7S19TX0YyLAkJIlwzMTZVIn0sCiAgICB7S19TX0YzLAkJIlwzMTZWIn0sCiAgICB7S19TX0Y0LAkJIlwzMTZXIn0sCiAgICB7S19TX0Y1LAkJIlwzMTZYIn0sCiAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCiAgICB7S19TX0Y3LAkJIlwzMTZaIn0sCiAgICB7S19TX0Y4LAkJIlwzMTZbIn0sCiAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAogICAge0tfU19GMTAsCQkiXDMxNl0ifSwKICAgIHtLX1NfRjExLAkJIlwzMTZcMjA3In0sCiAgICB7S19TX0YxMiwJCSJcMzE2XDIxMCJ9LAogICAge0tfSU5TLAkJIlwzMTZSIn0sCiAgICB7S19ERUwsCQkiXDMxNlMifSwKICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKICAgIHtLX1NfSE9NRSwJCSJcMzE2XDMwMiJ9LAogICAge0tfQ19IT01FLAkJIlwzMTZ3In0sCiAgICB7S19FTkQsCQkiXDMxNk8ifSwKICAgIHtLX1NfRU5ELAkJIlwzMTZcMzE1In0sCiAgICB7S19DX0VORCwJCSJcMzE2dSJ9LAogICAge0tfUEFHRURPV04sCSJcMzE2USJ9LAogICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCiAgICB7S19LUExVUywJCSJcMzE2TiJ9LAogICAge0tfS01JTlVTLAkJIlwzMTZKIn0sCiAgICB7S19LTVVMVElQTFksCSJcMzE2XDA2NyJ9LAogICAge0tfSzAsCQkiXDMxNlwzMzIifSwKICAgIHtLX0sxLAkJIlwzMTZcMzM2In0sCiAgICB7S19LMiwJCSJcMzE2XDM0MiJ9LAogICAge0tfSzMsCQkiXDMxNlwzNDYifSwKICAgIHtLX0s0LAkJIlwzMTZcMzUyIn0sCiAgICB7S19LNSwJCSJcMzE2XDM1NiJ9LAogICAge0tfSzYsCQkiXDMxNlwzNjIifSwKICAgIHtLX0s3LAkJIlwzMTZcMzY2In0sCiAgICB7S19LOCwJCSJcMzE2XDM3MiJ9LAogICAge0tfSzksCQkiXDMxNlwzNzYifSwKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykKLyoKICogVlQzMjAgaXMgd29ya2luZyBhcyBhbiBBTlNJIHRlcm1pbmFsIGNvbXBhdGlibGUgREVDIHRlcm1pbmFsLgogKiAoaXQgY292ZXJzIFZUMXgwLCBWVDJ4MCBhbmQgVlQzeDAgdXAgdG8gVlQzMjAgb24gVk1TIGFzIHdlbGwpCiAqIE5vdGU6IEtfRjEuLi5LX0Y1IGFyZSBmb3IgaW50ZXJuYWwgdXNlLCBzaG91bGQgbm90IGJlIGRlZmluZWQuCiAqIFRPRE86LSByZXdyaXRlIEVTQ1sgY29kZXMgdG8gQ1NJCiAqICAgICAgLSBrZXlib2FyZCBsYW5ndWFnZXMgKENTSSA/IDI2IG4pCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJInZ0MzIwIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNbSyIsIEVTQ19TVFIgIltLIil9LAogICAgeyhpbnQpS1NfQUwsCUlGX0VCKCJcMDMzW0wiLCBFU0NfU1RSICJbTCIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBTCwJSUZfRUIoIlwwMzNbJXAxJWRMIiwgRVNDX1NUUiAiWyVwMSVkTCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slZEwiLCBFU0NfU1RSICJbJWRMIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzW00iLCBFU0NfU1RSICJbTSIpfSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJSUZfRUIoIlwwMzNbJXAxJWRNIiwgRVNDX1NUUiAiWyVwMSVkTSIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slZE0iLCBFU0NfU1RSICJbJWRNIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKICAgIHsoaW50KUtTX0NELAlJRl9FQigiXDAzM1tKIiwgRVNDX1NUUiAiW0oiKX0sCiAgICB7KGludClLU19DQ08sCSI4In0sCQkJLyogYWxsb3cgOCBjb2xvcnMgKi8KICAgIHsoaW50KUtTX01FLAlJRl9FQigiXDAzM1swbSIsIEVTQ19TVFIgIlswbSIpfSwKICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1s3bSIsIEVTQ19TVFIgIls3bSIpfSwKICAgIHsoaW50KUtTX01ELAlJRl9FQigiXDAzM1sxbSIsIEVTQ19TVFIgIlsxbSIpfSwgIC8qIGJvbGQgbW9kZSAqLwogICAgeyhpbnQpS1NfU0UsCUlGX0VCKCJcMDMzWzIybSIsIEVTQ19TVFIgIlsyMm0iKX0sLyogbm9ybWFsIG1vZGUgKi8KICAgIHsoaW50KUtTX1VFLAlJRl9FQigiXDAzM1syNG0iLCBFU0NfU1RSICJbMjRtIil9LC8qIGV4aXQgdW5kZXJzY29yZSBtb2RlICovCiAgICB7KGludClLU19VUywJSUZfRUIoIlwwMzNbNG0iLCBFU0NfU1RSICJbNG0iKX0sICAvKiB1bmRlcnNjb3JlIG1vZGUgKi8KICAgIHsoaW50KUtTX0NaSCwJSUZfRUIoIlwwMzNbMzQ7NDNtIiwgRVNDX1NUUiAiWzM0OzQzbSIpfSwgIC8qIGl0YWxpYyBtb2RlOiBibHVlIHRleHQgb24geWVsbG93ICovCiAgICB7KGludClLU19DWlIsCUlGX0VCKCJcMDMzWzBtIiwgRVNDX1NUUiAiWzBtIil9LAkgICAgLyogaXRhbGljIG1vZGUgZW5kICovCiAgICB7KGludClLU19DQUIsCUlGX0VCKCJcMDMzWzQlZG0iLCBFU0NfU1RSICJbNCVkbSIpfSwJICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ0FGLAlJRl9FQigiXDAzM1szJWRtIiwgRVNDX1NUUiAiWzMlZG0iKX0sCSAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAoQU5TSSkgKi8KICAgIHsoaW50KUtTX0NTQiwJSUZfRUIoIlwwMzNbMTAyOyVkbSIsIEVTQ19TVFIgIlsxMDI7JWRtIil9LAkvKiBzZXQgc2NyZWVuIGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NTRiwJSUZfRUIoIlwwMzNbMTAxOyVkbSIsIEVTQ19TVFIgIlsxMDE7JWRtIil9LAkvKiBzZXQgc2NyZWVuIGZvcmVncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojICBlbmRpZgojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1JJLAlJRl9FQigiXDAzM1slcDElZEMiLCBFU0NfU1RSICJbJXAxJWRDIil9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVkQyIsIEVTQ19TVFIgIlslZEMiKX0sCiMgIGVuZGlmCiAgICB7S19VUCwJCUlGX0VCKCJcMDMzW0EiLCBFU0NfU1RSICJbQSIpfSwKICAgIHtLX0RPV04sCQlJRl9FQigiXDAzM1tCIiwgRVNDX1NUUiAiW0IiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzW0MiLCBFU0NfU1RSICJbQyIpfSwKICAgIHtLX0xFRlQsCQlJRl9FQigiXDAzM1tEIiwgRVNDX1NUUiAiW0QiKX0sCiAgICB7S19GMSwJCUlGX0VCKCJcMDMzWzExfiIsIEVTQ19TVFIgIlsxMX4iKX0sCiAgICB7S19GMiwJCUlGX0VCKCJcMDMzWzEyfiIsIEVTQ19TVFIgIlsxMn4iKX0sCiAgICB7S19GMywJCUlGX0VCKCJcMDMzWzEzfiIsIEVTQ19TVFIgIlsxM34iKX0sCiAgICB7S19GNCwJCUlGX0VCKCJcMDMzWzE0fiIsIEVTQ19TVFIgIlsxNH4iKX0sCiAgICB7S19GNSwJCUlGX0VCKCJcMDMzWzE1fiIsIEVTQ19TVFIgIlsxNX4iKX0sCiAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3fiIsIEVTQ19TVFIgIlsxN34iKX0sCiAgICB7S19GNywJCUlGX0VCKCJcMDMzWzE4fiIsIEVTQ19TVFIgIlsxOH4iKX0sCiAgICB7S19GOCwJCUlGX0VCKCJcMDMzWzE5fiIsIEVTQ19TVFIgIlsxOX4iKX0sCiAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwfiIsIEVTQ19TVFIgIlsyMH4iKX0sCiAgICB7S19GMTAsCQlJRl9FQigiXDAzM1syMX4iLCBFU0NfU1RSICJbMjF+Iil9LAogICAge0tfRjExLAkJSUZfRUIoIlwwMzNbMjN+IiwgRVNDX1NUUiAiWzIzfiIpfSwKICAgIHtLX0YxMiwJCUlGX0VCKCJcMDMzWzI0fiIsIEVTQ19TVFIgIlsyNH4iKX0sCiAgICB7S19GMTMsCQlJRl9FQigiXDAzM1syNX4iLCBFU0NfU1RSICJbMjV+Iil9LAogICAge0tfRjE0LAkJSUZfRUIoIlwwMzNbMjZ+IiwgRVNDX1NUUiAiWzI2fiIpfSwKICAgIHtLX0YxNSwJCUlGX0VCKCJcMDMzWzI4fiIsIEVTQ19TVFIgIlsyOH4iKX0sCS8qIEhlbHAgKi8KICAgIHtLX0YxNiwJCUlGX0VCKCJcMDMzWzI5fiIsIEVTQ19TVFIgIlsyOX4iKX0sCS8qIFNlbGVjdCAqLwogICAge0tfRjE3LAkJSUZfRUIoIlwwMzNbMzF+IiwgRVNDX1NUUiAiWzMxfiIpfSwKICAgIHtLX0YxOCwJCUlGX0VCKCJcMDMzWzMyfiIsIEVTQ19TVFIgIlszMn4iKX0sCiAgICB7S19GMTksCQlJRl9FQigiXDAzM1szM34iLCBFU0NfU1RSICJbMzN+Iil9LAogICAge0tfRjIwLAkJSUZfRUIoIlwwMzNbMzR+IiwgRVNDX1NUUiAiWzM0fiIpfSwKICAgIHtLX0lOUywJCUlGX0VCKCJcMDMzWzJ+IiwgRVNDX1NUUiAiWzJ+Iil9LAogICAge0tfREVMLAkJSUZfRUIoIlwwMzNbM34iLCBFU0NfU1RSICJbM34iKX0sCiAgICB7S19IT01FLAkJSUZfRUIoIlwwMzNbMX4iLCBFU0NfU1RSICJbMX4iKX0sCiAgICB7S19FTkQsCQlJRl9FQigiXDAzM1s0fiIsIEVTQ19TVFIgIls0fiIpfSwKICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzWzV+IiwgRVNDX1NUUiAiWzV+Iil9LAogICAge0tfUEFHRURPV04sCUlGX0VCKCJcMDMzWzZ+IiwgRVNDX1NUUiAiWzZ+Iil9LAogICAge0tfS1BMVVMsCQlJRl9FQigiXDAzM09rIiwgRVNDX1NUUiAiT2siKX0sCS8qIGtleXBhZCBwbHVzICovCiAgICB7S19LTUlOVVMsCQlJRl9FQigiXDAzM09tIiwgRVNDX1NUUiAiT20iKX0sCS8qIGtleXBhZCBtaW51cyAqLwogICAge0tfS0RJVklERSwJCUlGX0VCKCJcMDMzT28iLCBFU0NfU1RSICJPbyIpfSwJLyoga2V5cGFkIC8gKi8KICAgIHtLX0tNVUxUSVBMWSwJSUZfRUIoIlwwMzNPaiIsIEVTQ19TVFIgIk9qIil9LAkvKiBrZXlwYWQgKiAqLwogICAge0tfS0VOVEVSLAkJSUZfRUIoIlwwMzNPTSIsIEVTQ19TVFIgIk9NIil9LAkvKiBrZXlwYWQgRW50ZXIgKi8KICAgIHtLX0JTLAkJIlx4N2YifSwJLyogZm9yIHNvbWUgcmVhc29uIDAxNzcgZG9lc24ndCB3b3JrICovCiMgZW5kaWYKCiMgaWYgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX01JTlRfXykKLyoKICogT3JkaW5hcnkgdnQ1MgogKi8KICAgIHsoaW50KUtTX05BTUUsCSJ2dDUyIn0sCiAgICB7KGludClLU19DRSwJSUZfRUIoIlwwMzNLIiwgRVNDX1NUUiAiSyIpfSwKICAgIHsoaW50KUtTX0NELAlJRl9FQigiXDAzM0oiLCBFU0NfU1RSICJKIil9LAogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWSUrICUrICIsIEVTQ19TVFIgIlklKyAlKyAiKX0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIF9fTUlOVF9fCiAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNMIiwgRVNDX1NUUiAiTCIpfSwKICAgIHsoaW50KUtTX0RMLAlJRl9FQigiXDAzM00iLCBFU0NfU1RSICJNIil9LAogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzRSIsIEVTQ19TVFIgIkUiKX0sCiAgICB7KGludClLU19TUiwJSUZfRUIoIlwwMzNJIiwgRVNDX1NUUiAiSSIpfSwKICAgIHsoaW50KUtTX1ZFLAlJRl9FQigiXDAzM2UiLCBFU0NfU1RSICJlIil9LAogICAgeyhpbnQpS1NfVkksCUlGX0VCKCJcMDMzZiIsIEVTQ19TVFIgImYiKX0sCiAgICB7KGludClLU19TTywJSUZfRUIoIlwwMzNwIiwgRVNDX1NUUiAicCIpfSwKICAgIHsoaW50KUtTX1NFLAlJRl9FQigiXDAzM3EiLCBFU0NfU1RSICJxIil9LAogICAge0tfVVAsCQlJRl9FQigiXDAzM0EiLCBFU0NfU1RSICJBIil9LAogICAge0tfRE9XTiwJCUlGX0VCKCJcMDMzQiIsIEVTQ19TVFIgIkIiKX0sCiAgICB7S19MRUZULAkJSUZfRUIoIlwwMzNEIiwgRVNDX1NUUiAiRCIpfSwKICAgIHtLX1JJR0hULAkJSUZfRUIoIlwwMzNDIiwgRVNDX1NUUiAiQyIpfSwKICAgIHtLX1NfVVAsCQlJRl9FQigiXDAzM2EiLCBFU0NfU1RSICJhIil9LAogICAge0tfU19ET1dOLAkJSUZfRUIoIlwwMzNiIiwgRVNDX1NUUiAiYiIpfSwKICAgIHtLX1NfTEVGVCwJCUlGX0VCKCJcMDMzZCIsIEVTQ19TVFIgImQiKX0sCiAgICB7S19TX1JJR0hULAkJSUZfRUIoIlwwMzNjIiwgRVNDX1NUUiAiYyIpfSwKICAgIHtLX0YxLAkJSUZfRUIoIlwwMzNQIiwgRVNDX1NUUiAiUCIpfSwKICAgIHtLX0YyLAkJSUZfRUIoIlwwMzNRIiwgRVNDX1NUUiAiUSIpfSwKICAgIHtLX0YzLAkJSUZfRUIoIlwwMzNSIiwgRVNDX1NUUiAiUiIpfSwKICAgIHtLX0Y0LAkJSUZfRUIoIlwwMzNTIiwgRVNDX1NUUiAiUyIpfSwKICAgIHtLX0Y1LAkJSUZfRUIoIlwwMzNUIiwgRVNDX1NUUiAiVCIpfSwKICAgIHtLX0Y2LAkJSUZfRUIoIlwwMzNVIiwgRVNDX1NUUiAiVSIpfSwKICAgIHtLX0Y3LAkJSUZfRUIoIlwwMzNWIiwgRVNDX1NUUiAiViIpfSwKICAgIHtLX0Y4LAkJSUZfRUIoIlwwMzNXIiwgRVNDX1NUUiAiVyIpfSwKICAgIHtLX0Y5LAkJSUZfRUIoIlwwMzNYIiwgRVNDX1NUUiAiWCIpfSwKICAgIHtLX0YxMCwJCUlGX0VCKCJcMDMzWSIsIEVTQ19TVFIgIlkiKX0sCiAgICB7S19TX0YxLAkJSUZfRUIoIlwwMzNwIiwgRVNDX1NUUiAicCIpfSwKICAgIHtLX1NfRjIsCQlJRl9FQigiXDAzM3EiLCBFU0NfU1RSICJxIil9LAogICAge0tfU19GMywJCUlGX0VCKCJcMDMzciIsIEVTQ19TVFIgInIiKX0sCiAgICB7S19TX0Y0LAkJSUZfRUIoIlwwMzNzIiwgRVNDX1NUUiAicyIpfSwKICAgIHtLX1NfRjUsCQlJRl9FQigiXDAzM3QiLCBFU0NfU1RSICJ0Iil9LAogICAge0tfU19GNiwJCUlGX0VCKCJcMDMzdSIsIEVTQ19TVFIgInUiKX0sCiAgICB7S19TX0Y3LAkJSUZfRUIoIlwwMzN2IiwgRVNDX1NUUiAidiIpfSwKICAgIHtLX1NfRjgsCQlJRl9FQigiXDAzM3ciLCBFU0NfU1RSICJ3Iil9LAogICAge0tfU19GOSwJCUlGX0VCKCJcMDMzeCIsIEVTQ19TVFIgIngiKX0sCiAgICB7S19TX0YxMCwJCUlGX0VCKCJcMDMzeSIsIEVTQ19TVFIgInkiKX0sCiAgICB7S19JTlMsCQlJRl9FQigiXDAzM0kiLCBFU0NfU1RSICJJIil9LAogICAge0tfSE9NRSwJCUlGX0VCKCJcMDMzRSIsIEVTQ19TVFIgIkUiKX0sCiAgICB7S19QQUdFRE9XTiwJSUZfRUIoIlwwMzNiIiwgRVNDX1NUUiAiYiIpfSwKICAgIHtLX1BBR0VVUCwJCUlGX0VCKCJcMDMzYSIsIEVTQ19TVFIgImEiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0FMLAlJRl9FQigiXDAzM1QiLCBFU0NfU1RSICJUIil9LAogICAgeyhpbnQpS1NfREwsCUlGX0VCKCJcMDMzVSIsIEVTQ19TVFIgIlUiKX0sCiAgICB7KGludClLU19DTCwJSUZfRUIoIlwwMzNIXDAzM0oiLCBFU0NfU1RSICJIIiBFU0NfU1RSX25jICJKIil9LAogICAgeyhpbnQpS1NfTUUsCUlGX0VCKCJcMDMzU08iLCBFU0NfU1RSICJTTyIpfSwKICAgIHsoaW50KUtTX01SLAlJRl9FQigiXDAzM1MyIiwgRVNDX1NUUiAiUzIiKX0sCiAgICB7KGludClLU19NUywJInkifSwKIyAgZW5kaWYKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpIHx8IGRlZmluZWQoU09NRV9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCiAgICB7KGludClLU19OQU1FLAkieHRlcm0ifSwKICAgIHsoaW50KUtTX0NFLAlJRl9FQigiXDAzM1tLIiwgRVNDX1NUUiAiW0siKX0sCiAgICB7KGludClLU19BTCwJSUZfRUIoIlwwMzNbTCIsIEVTQ19TVFIgIltMIil9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FMLAlJRl9FQigiXDAzM1slcDElZEwiLCBFU0NfU1RSICJbJXAxJWRMIil9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCUlGX0VCKCJcMDMzWyVkTCIsIEVTQ19TVFIgIlslZEwiKX0sCiMgIGVuZGlmCiAgICB7KGludClLU19ETCwJSUZfRUIoIlwwMzNbTSIsIEVTQ19TVFIgIltNIil9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAlJRl9FQigiXDAzM1slcDElZE0iLCBFU0NfU1RSICJbJXAxJWRNIil9LAojICBlbHNlCiAgICB7KGludClLU19DREwsCUlGX0VCKCJcMDMzWyVkTSIsIEVTQ19TVFIgIlslZE0iKX0sCiMgIGVuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZHIiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkciIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1MsCUlGX0VCKCJcMDMzWyVpJWQ7JWRyIiwgRVNDX1NUUiAiWyVpJWQ7JWRyIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0wsCUlGX0VCKCJcMDMzW0hcMDMzWzJKIiwgRVNDX1NUUiAiW0giIEVTQ19TVFJfbmMgIlsySiIpfSwKICAgIHsoaW50KUtTX0NELAlJRl9FQigiXDAzM1tKIiwgRVNDX1NUUiAiW0oiKX0sCiAgICB7KGludClLU19NRSwJSUZfRUIoIlwwMzNbbSIsIEVTQ19TVFIgIlttIil9LAogICAgeyhpbnQpS1NfTVIsCUlGX0VCKCJcMDMzWzdtIiwgRVNDX1NUUiAiWzdtIil9LAogICAgeyhpbnQpS1NfTUQsCUlGX0VCKCJcMDMzWzFtIiwgRVNDX1NUUiAiWzFtIil9LAogICAgeyhpbnQpS1NfVUUsCUlGX0VCKCJcMDMzW20iLCBFU0NfU1RSICJbbSIpfSwKICAgIHsoaW50KUtTX1VTLAlJRl9FQigiXDAzM1s0bSIsIEVTQ19TVFIgIls0bSIpfSwKICAgIHsoaW50KUtTX01TLAkieSJ9LAogICAgeyhpbnQpS1NfVVQsCSJ5In0sCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJSUZfRUIoIlwwMzNbJWklcDElZDslcDIlZEgiLAoJCQkJCQkgIEVTQ19TVFIgIlslaSVwMSVkOyVwMiVkSCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojICBlbmRpZgogICAgeyhpbnQpS1NfU1IsCUlGX0VCKCJcMDMzTSIsIEVTQ19TVFIgIk0iKX0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCUlGX0VCKCJcMDMzWyVwMSVkQyIsIEVTQ19TVFIgIlslcDElZEMiKX0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJSUZfRUIoIlwwMzNbJWRDIiwgRVNDX1NUUiAiWyVkQyIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0tTLAlJRl9FQigiXDAzM1s/MWhcMDMzPSIsIEVTQ19TVFIgIls/MWgiIEVTQ19TVFJfbmMgIj0iKX0sCiAgICB7KGludClLU19LRSwJSUZfRUIoIlwwMzNbPzFsXDAzMz4iLCBFU0NfU1RSICJbPzFsIiBFU0NfU1RSX25jICI+Iil9LAojICBpZmRlZiBGRUFUX1hURVJNX1NBVkUKICAgIHsoaW50KUtTX1RJLAlJRl9FQigiXDAzMzdcMDMzWz80N2giLCBFU0NfU1RSICI3IiBFU0NfU1RSX25jICJbPzQ3aCIpfSwKICAgIHsoaW50KUtTX1RFLAlJRl9FQigiXDAzM1sySlwwMzNbPzQ3bFwwMzM4IiwKCQkJCSAgRVNDX1NUUiAiWzJKIiBFU0NfU1RSX25jICJbPzQ3bCIgRVNDX1NUUl9uYyAiOCIpfSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0NJUywJSUZfRUIoIlwwMzNdMTsiLCBFU0NfU1RSICJdMTsiKX0sCiAgICB7KGludClLU19DSUUsCSJcMDA3In0sCiAgICB7KGludClLU19UUywJSUZfRUIoIlwwMzNdMjsiLCBFU0NfU1RSICJdMjsiKX0sCiAgICB7KGludClLU19GUywJIlwwMDcifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NXUywJSUZfRUIoIlwwMzNbODslcDElZDslcDIlZHQiLAoJCQkJCQkgIEVTQ19TVFIgIls4OyVwMSVkOyVwMiVkdCIpfSwKICAgIHsoaW50KUtTX0NXUCwJSUZfRUIoIlwwMzNbMzslcDElZDslcDIlZHQiLAoJCQkJCQkgIEVTQ19TVFIgIlszOyVwMSVkOyVwMiVkdCIpfSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1dTLAlJRl9FQigiXDAzM1s4OyVkOyVkdCIsIEVTQ19TVFIgIls4OyVkOyVkdCIpfSwKICAgIHsoaW50KUtTX0NXUCwJSUZfRUIoIlwwMzNbMzslZDslZHQiLCBFU0NfU1RSICJbMzslZDslZHQiKX0sCiMgIGVuZGlmCiAgICB7KGludClLU19DUlYsCUlGX0VCKCJcMDMzWz5jIiwgRVNDX1NUUiAiWz5jIil9LAoKICAgIHtLX1VQLAkJSUZfRUIoIlwwMzNPKkEiLCBFU0NfU1RSICJPKkEiKX0sCiAgICB7S19ET1dOLAkJSUZfRUIoIlwwMzNPKkIiLCBFU0NfU1RSICJPKkIiKX0sCiAgICB7S19SSUdIVCwJCUlGX0VCKCJcMDMzTypDIiwgRVNDX1NUUiAiTypDIil9LAogICAge0tfTEVGVCwJCUlGX0VCKCJcMDMzTypEIiwgRVNDX1NUUiAiTypEIil9LAogICAgLyogQW4gZXh0cmEgc2V0IG9mIGN1cnNvciBrZXlzIGZvciB2dDEwMCBtb2RlICovCiAgICB7S19YVVAsCQlJRl9FQigiXDAzM1sxOypBIiwgRVNDX1NUUiAiWzE7KkEiKX0sCiAgICB7S19YRE9XTiwJCUlGX0VCKCJcMDMzWzE7KkIiLCBFU0NfU1RSICJbMTsqQiIpfSwKICAgIHtLX1hSSUdIVCwJCUlGX0VCKCJcMDMzWzE7KkMiLCBFU0NfU1RSICJbMTsqQyIpfSwKICAgIHtLX1hMRUZULAkJSUZfRUIoIlwwMzNbMTsqRCIsIEVTQ19TVFIgIlsxOypEIil9LAogICAgLyogQW4gZXh0cmEgc2V0IG9mIGZ1bmN0aW9uIGtleXMgZm9yIHZ0MTAwIG1vZGUgKi8KICAgIHtLX1hGMSwJCUlGX0VCKCJcMDMzTypQIiwgRVNDX1NUUiAiTypQIil9LAogICAge0tfWEYyLAkJSUZfRUIoIlwwMzNPKlEiLCBFU0NfU1RSICJPKlEiKX0sCiAgICB7S19YRjMsCQlJRl9FQigiXDAzM08qUiIsIEVTQ19TVFIgIk8qUiIpfSwKICAgIHtLX1hGNCwJCUlGX0VCKCJcMDMzTypTIiwgRVNDX1NUUiAiTypTIil9LAogICAge0tfRjEsCQlJRl9FQigiXDAzM1sxMTsqfiIsIEVTQ19TVFIgIlsxMTsqfiIpfSwKICAgIHtLX0YyLAkJSUZfRUIoIlwwMzNbMTI7Kn4iLCBFU0NfU1RSICJbMTI7Kn4iKX0sCiAgICB7S19GMywJCUlGX0VCKCJcMDMzWzEzOyp+IiwgRVNDX1NUUiAiWzEzOyp+Iil9LAogICAge0tfRjQsCQlJRl9FQigiXDAzM1sxNDsqfiIsIEVTQ19TVFIgIlsxNDsqfiIpfSwKICAgIHtLX0Y1LAkJSUZfRUIoIlwwMzNbMTU7Kn4iLCBFU0NfU1RSICJbMTU7Kn4iKX0sCiAgICB7S19GNiwJCUlGX0VCKCJcMDMzWzE3Oyp+IiwgRVNDX1NUUiAiWzE3Oyp+Iil9LAogICAge0tfRjcsCQlJRl9FQigiXDAzM1sxODsqfiIsIEVTQ19TVFIgIlsxODsqfiIpfSwKICAgIHtLX0Y4LAkJSUZfRUIoIlwwMzNbMTk7Kn4iLCBFU0NfU1RSICJbMTk7Kn4iKX0sCiAgICB7S19GOSwJCUlGX0VCKCJcMDMzWzIwOyp+IiwgRVNDX1NUUiAiWzIwOyp+Iil9LAogICAge0tfRjEwLAkJSUZfRUIoIlwwMzNbMjE7Kn4iLCBFU0NfU1RSICJbMjE7Kn4iKX0sCiAgICB7S19GMTEsCQlJRl9FQigiXDAzM1syMzsqfiIsIEVTQ19TVFIgIlsyMzsqfiIpfSwKICAgIHtLX0YxMiwJCUlGX0VCKCJcMDMzWzI0Oyp+IiwgRVNDX1NUUiAiWzI0Oyp+Iil9LAogICAge0tfU19UQUIsCQlJRl9FQigiXDAzM1taIiwgRVNDX1NUUiAiW1oiKX0sCiAgICB7S19IRUxQLAkJSUZfRUIoIlwwMzNbMjg7Kn4iLCBFU0NfU1RSICJbMjg7Kn4iKX0sCiAgICB7S19VTkRPLAkJSUZfRUIoIlwwMzNbMjY7Kn4iLCBFU0NfU1RSICJbMjY7Kn4iKX0sCiAgICB7S19JTlMsCQlJRl9FQigiXDAzM1syOyp+IiwgRVNDX1NUUiAiWzI7Kn4iKX0sCiAgICB7S19IT01FLAkJSUZfRUIoIlwwMzNbMTsqSCIsIEVTQ19TVFIgIlsxOypIIil9LAogICAgLyoge0tfU19IT01FLAkJSUZfRUIoIlwwMzNPMkgiLCBFU0NfU1RSICJPMkgiKX0sICovCiAgICAvKiB7S19DX0hPTUUsCQlJRl9FQigiXDAzM081SCIsIEVTQ19TVFIgIk81SCIpfSwgKi8KICAgIHtLX0tIT01FLAkJSUZfRUIoIlwwMzNbMTsqfiIsIEVTQ19TVFIgIlsxOyp+Iil9LAogICAge0tfWEhPTUUsCQlJRl9FQigiXDAzM08qSCIsIEVTQ19TVFIgIk8qSCIpfSwJLyogb3RoZXIgSG9tZSAqLwogICAge0tfWkhPTUUsCQlJRl9FQigiXDAzM1s3Oyp+IiwgRVNDX1NUUiAiWzc7Kn4iKX0sCS8qIG90aGVyIEhvbWUgKi8KICAgIHtLX0VORCwJCUlGX0VCKCJcMDMzWzE7KkYiLCBFU0NfU1RSICJbMTsqRiIpfSwKICAgIC8qIHtLX1NfRU5ELAkJSUZfRUIoIlwwMzNPMkYiLCBFU0NfU1RSICJPMkYiKX0sICovCiAgICAvKiB7S19DX0VORCwJCUlGX0VCKCJcMDMzTzVGIiwgRVNDX1NUUiAiTzVGIil9LCAqLwogICAge0tfS0VORCwJCUlGX0VCKCJcMDMzWzQ7Kn4iLCBFU0NfU1RSICJbNDsqfiIpfSwKICAgIHtLX1hFTkQsCQlJRl9FQigiXDAzM08qRiIsIEVTQ19TVFIgIk8qRiIpfSwJLyogb3RoZXIgRW5kICovCiAgICB7S19aRU5ELAkJSUZfRUIoIlwwMzNbODsqfiIsIEVTQ19TVFIgIls4Oyp+Iil9LAogICAge0tfUEFHRVVQLAkJSUZfRUIoIlwwMzNbNTsqfiIsIEVTQ19TVFIgIls1Oyp+Iil9LAogICAge0tfUEFHRURPV04sCUlGX0VCKCJcMDMzWzY7Kn4iLCBFU0NfU1RSICJbNjsqfiIpfSwKICAgIHtLX0tQTFVTLAkJSUZfRUIoIlwwMzNPKmsiLCBFU0NfU1RSICJPKmsiKX0sCS8qIGtleXBhZCBwbHVzICovCiAgICB7S19LTUlOVVMsCQlJRl9FQigiXDAzM08qbSIsIEVTQ19TVFIgIk8qbSIpfSwJLyoga2V5cGFkIG1pbnVzICovCiAgICB7S19LRElWSURFLAkJSUZfRUIoIlwwMzNPKm8iLCBFU0NfU1RSICJPKm8iKX0sCS8qIGtleXBhZCAvICovCiAgICB7S19LTVVMVElQTFksCUlGX0VCKCJcMDMzTypqIiwgRVNDX1NUUiAiTypqIil9LAkvKiBrZXlwYWQgKiAqLwogICAge0tfS0VOVEVSLAkJSUZfRUIoIlwwMzNPKk0iLCBFU0NfU1RSICJPKk0iKX0sCS8qIGtleXBhZCBFbnRlciAqLwogICAge0tfS1BPSU5ULAkJSUZfRUIoIlwwMzNPKm4iLCBFU0NfU1RSICJPKm4iKX0sCS8qIGtleXBhZCAuICovCiAgICB7S19LREVMLAkJSUZfRUIoIlwwMzNbMzsqfiIsIEVTQ19TVFIgIlszOyp+Iil9LAkvKiBrZXlwYWQgRGVsICovCgogICAge0JUX0VYVFJBX0tFWVMsICAgIiJ9LAogICAge1RFUk1DQVAyS0VZKCdrJywgJzAnKSwgSUZfRUIoIlwwMzNbMTA7Kn4iLCBFU0NfU1RSICJbMTA7Kn4iKX0sIC8qIEYwICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnMycpLCBJRl9FQigiXDAzM1syNTsqfiIsIEVTQ19TVFIgIlsyNTsqfiIpfSwgLyogRjEzICovCiAgICAvKiBGMTQgYW5kIEYxNSBhcmUgbWlzc2luZywgYmVjYXVzZSB0aGV5IHNlbmQgdGhlIHNhbWUgY29kZXMgYXMgdGhlIHVuZG8KICAgICAqIGFuZCBoZWxwIGtleSwgYWx0aG91Z2ggdGhleSBkb24ndCB3b3JrIG9uIGFsbCBrZXlib2FyZHMuICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNicpLCBJRl9FQigiXDAzM1syOTsqfiIsIEVTQ19TVFIgIlsyOTsqfiIpfSwgLyogRjE2ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnNycpLCBJRl9FQigiXDAzM1szMTsqfiIsIEVTQ19TVFIgIlszMTsqfiIpfSwgLyogRjE3ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOCcpLCBJRl9FQigiXDAzM1szMjsqfiIsIEVTQ19TVFIgIlszMjsqfiIpfSwgLyogRjE4ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnOScpLCBJRl9FQigiXDAzM1szMzsqfiIsIEVTQ19TVFIgIlszMzsqfiIpfSwgLyogRjE5ICovCiAgICB7VEVSTUNBUDJLRVkoJ0YnLCAnQScpLCBJRl9FQigiXDAzM1szNDsqfiIsIEVTQ19TVFIgIlszNDsqfiIpfSwgLyogRjIwICovCgogICAge1RFUk1DQVAyS0VZKCdGJywgJ0InKSwgSUZfRUIoIlwwMzNbNDI7Kn4iLCBFU0NfU1RSICJbNDI7Kn4iKX0sIC8qIEYyMSAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0MnKSwgSUZfRUIoIlwwMzNbNDM7Kn4iLCBFU0NfU1RSICJbNDM7Kn4iKX0sIC8qIEYyMiAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0QnKSwgSUZfRUIoIlwwMzNbNDQ7Kn4iLCBFU0NfU1RSICJbNDQ7Kn4iKX0sIC8qIEYyMyAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0UnKSwgSUZfRUIoIlwwMzNbNDU7Kn4iLCBFU0NfU1RSICJbNDU7Kn4iKX0sIC8qIEYyNCAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0YnKSwgSUZfRUIoIlwwMzNbNDY7Kn4iLCBFU0NfU1RSICJbNDY7Kn4iKX0sIC8qIEYyNSAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0cnKSwgSUZfRUIoIlwwMzNbNDc7Kn4iLCBFU0NfU1RSICJbNDc7Kn4iKX0sIC8qIEYyNiAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0gnKSwgSUZfRUIoIlwwMzNbNDg7Kn4iLCBFU0NfU1RSICJbNDg7Kn4iKX0sIC8qIEYyNyAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0knKSwgSUZfRUIoIlwwMzNbNDk7Kn4iLCBFU0NfU1RSICJbNDk7Kn4iKX0sIC8qIEYyOCAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0onKSwgSUZfRUIoIlwwMzNbNTA7Kn4iLCBFU0NfU1RSICJbNTA7Kn4iKX0sIC8qIEYyOSAqLwogICAge1RFUk1DQVAyS0VZKCdGJywgJ0snKSwgSUZfRUIoIlwwMzNbNTE7Kn4iLCBFU0NfU1RSICJbNTE7Kn4iKX0sIC8qIEYzMCAqLwoKICAgIHtURVJNQ0FQMktFWSgnRicsICdMJyksIElGX0VCKCJcMDMzWzUyOyp+IiwgRVNDX1NUUiAiWzUyOyp+Iil9LCAvKiBGMzEgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdNJyksIElGX0VCKCJcMDMzWzUzOyp+IiwgRVNDX1NUUiAiWzUzOyp+Iil9LCAvKiBGMzIgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdOJyksIElGX0VCKCJcMDMzWzU0Oyp+IiwgRVNDX1NUUiAiWzU0Oyp+Iil9LCAvKiBGMzMgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdPJyksIElGX0VCKCJcMDMzWzU1Oyp+IiwgRVNDX1NUUiAiWzU1Oyp+Iil9LCAvKiBGMzQgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdQJyksIElGX0VCKCJcMDMzWzU2Oyp+IiwgRVNDX1NUUiAiWzU2Oyp+Iil9LCAvKiBGMzUgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdRJyksIElGX0VCKCJcMDMzWzU3Oyp+IiwgRVNDX1NUUiAiWzU3Oyp+Iil9LCAvKiBGMzYgKi8KICAgIHtURVJNQ0FQMktFWSgnRicsICdSJyksIElGX0VCKCJcMDMzWzU4Oyp+IiwgRVNDX1NUUiAiWzU4Oyp+Iil9LCAvKiBGMzcgKi8KIyBlbmRpZgoKIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoQUxMX0JVSUxUSU5fVENBUFMpCi8qCiAqIGlyaXMtYW5zaSBmb3IgU2lsaWNvbiBHcmFwaGljcyBtYWNoaW5lcy4KICovCiAgICB7KGludClLU19OQU1FLAkiaXJpcy1hbnNpIn0sCiAgICB7KGludClLU19DRSwJIlwwMzNbSyJ9LAogICAgeyhpbnQpS1NfQ0QsCSJcMDMzW0oifSwKICAgIHsoaW50KUtTX0FMLAkiXDAzM1tMIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVwMSVkTCJ9LAojICBlbHNlCiAgICB7KGludClLU19DQUwsCSJcMDMzWyVkTCJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfREwsCSJcMDMzW00ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJXAxJWRNIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NETCwJIlwwMzNbJWRNIn0sCiMgIGVuZGlmCiNpZiAwCS8qIFRoZSBzY3JvbGwgcmVnaW9uIGlzIG5vdCB3b3JraW5nIGFzIFZpbSBleHBlY3RzLiAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ1MsCSJcMDMzWyVpJXAxJWQ7JXAyJWRyIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiXDAzM1slaSVkOyVkciJ9LAojICBlbmRpZgojZW5kaWYKICAgIHsoaW50KUtTX0NMLAkiXDAzM1tIXDAzM1sySiJ9LAogICAgeyhpbnQpS1NfVkUsCSJcMDMzWzkveVwwMzNbMTIveSJ9LAkvKiBUaGVzZSBhcmVuJ3QgZG9jdW1lbnRlZCAqLwogICAgeyhpbnQpS1NfVlMsCSJcMDMzWzEwL3lcMDMzWz0xaFwwMzNbPTJsIn0sIC8qIFRoZXNlIGFyZW4ndCBkb2N1bWVudGVkICovCiAgICB7KGludClLU19USSwJIlwwMzNbPTZoIn0sCiAgICB7KGludClLU19URSwJIlwwMzNbPTZsIn0sCiAgICB7KGludClLU19TRSwJIlwwMzNbMjE7MjdtIn0sCiAgICB7KGludClLU19TTywJIlwwMzNbMTs3bSJ9LAogICAgeyhpbnQpS1NfTUUsCSJcMDMzW20ifSwKICAgIHsoaW50KUtTX01SLAkiXDAzM1s3bSJ9LAogICAgeyhpbnQpS1NfTUQsCSJcMDMzWzFtIn0sCiAgICB7KGludClLU19DQ08sCSI4In0sCQkJLyogYWxsb3cgOCBjb2xvcnMgKi8KICAgIHsoaW50KUtTX0NaSCwJIlwwMzNbM20ifSwJCS8qIGl0YWxpYyBtb2RlIG9uICovCiAgICB7KGludClLU19DWlIsCSJcMDMzWzIzbSJ9LAkJLyogaXRhbGljIG1vZGUgb2ZmICovCiAgICB7KGludClLU19VUywJIlwwMzNbNG0ifSwJCS8qIHVuZGVybGluZSBvbiAqLwogICAgeyhpbnQpS1NfVUUsCSJcMDMzWzI0bSJ9LAkJLyogdW5kZXJsaW5lIG9mZiAqLwojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0FCLAkiXDAzM1s0JXAxJWRtIn0sICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJXAxJWRtIn0sICAgIC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ1NCLAkiXDAzM1sxMDI7JXAxJWRtIn0sIC8qIHNldCBzY3JlZW4gYmFja2dyb3VuZCBjb2xvciAqLwogICAgeyhpbnQpS1NfQ1NGLAkiXDAzM1sxMDE7JXAxJWRtIn0sIC8qIHNldCBzY3JlZW4gZm9yZWdyb3VuZCBjb2xvciAqLwojICBlbHNlCiAgICB7KGludClLU19DQUIsCSJcMDMzWzQlZG0ifSwJICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yIChBTlNJKSAqLwogICAgeyhpbnQpS1NfQ0FGLAkiXDAzM1szJWRtIn0sCSAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAoQU5TSSkgKi8KICAgIHsoaW50KUtTX0NTQiwJIlwwMzNbMTAyOyVkbSJ9LCAgICAvKiBzZXQgc2NyZWVuIGJhY2tncm91bmQgY29sb3IgKi8KICAgIHsoaW50KUtTX0NTRiwJIlwwMzNbMTAxOyVkbSJ9LCAgICAvKiBzZXQgc2NyZWVuIGZvcmVncm91bmQgY29sb3IgKi8KIyAgZW5kaWYKICAgIHsoaW50KUtTX01TLAkieSJ9LAkJLyogZ3Vlc3NlZCAqLwogICAgeyhpbnQpS1NfVVQsCSJ5In0sCQkvKiBndWVzc2VkICovCiAgICB7KGludClLU19MRSwJIlxiIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DTSwJIlwwMzNbJWklcDElZDslcDIlZEgifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJcMDMzWyVpJWQ7JWRIIn0sCiMgIGVuZGlmCiAgICB7KGludClLU19TUiwJIlwwMzNNIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJcMDMzWyVwMSVkQyJ9LAojICBlbHNlCiAgICB7KGludClLU19DUkksCSJcMDMzWyVkQyJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ0lTLAkiXDAzM1AzLnkifSwKICAgIHsoaW50KUtTX0NJRSwJIlwyMzQifSwgICAgLyogU1QgIlN0cmluZyBUZXJtaW5hdG9yIiAqLwogICAgeyhpbnQpS1NfVFMsCSJcMDMzUDEueSJ9LAogICAgeyhpbnQpS1NfRlMsCSJcMjM0In0sICAgIC8qIFNUICJTdHJpbmcgVGVybWluYXRvciIgKi8KIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NXUywJIlwwMzNbMjAzOyVwMSVkOyVwMiVkL3kifSwKICAgIHsoaW50KUtTX0NXUCwJIlwwMzNbMjA1OyVwMSVkOyVwMiVkL3kifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ1dTLAkiXDAzM1syMDM7JWQ7JWQveSJ9LAogICAgeyhpbnQpS1NfQ1dQLAkiXDAzM1syMDU7JWQ7JWQveSJ9LAojICBlbmRpZgogICAge0tfVVAsCQkiXDAzM1tBIn0sCiAgICB7S19ET1dOLAkJIlwwMzNbQiJ9LAogICAge0tfTEVGVCwJCSJcMDMzW0QifSwKICAgIHtLX1JJR0hULAkJIlwwMzNbQyJ9LAogICAge0tfU19VUCwJCSJcMDMzWzE2MXEifSwKICAgIHtLX1NfRE9XTiwJCSJcMDMzWzE2NHEifSwKICAgIHtLX1NfTEVGVCwJCSJcMDMzWzE1OHEifSwKICAgIHtLX1NfUklHSFQsCQkiXDAzM1sxNjdxIn0sCiAgICB7S19GMSwJCSJcMDMzWzAwMXEifSwKICAgIHtLX0YyLAkJIlwwMzNbMDAycSJ9LAogICAge0tfRjMsCQkiXDAzM1swMDNxIn0sCiAgICB7S19GNCwJCSJcMDMzWzAwNHEifSwKICAgIHtLX0Y1LAkJIlwwMzNbMDA1cSJ9LAogICAge0tfRjYsCQkiXDAzM1swMDZxIn0sCiAgICB7S19GNywJCSJcMDMzWzAwN3EifSwKICAgIHtLX0Y4LAkJIlwwMzNbMDA4cSJ9LAogICAge0tfRjksCQkiXDAzM1swMDlxIn0sCiAgICB7S19GMTAsCQkiXDAzM1swMTBxIn0sCiAgICB7S19GMTEsCQkiXDAzM1swMTFxIn0sCiAgICB7S19GMTIsCQkiXDAzM1swMTJxIn0sCiAgICB7S19TX0YxLAkJIlwwMzNbMDEzcSJ9LAogICAge0tfU19GMiwJCSJcMDMzWzAxNHEifSwKICAgIHtLX1NfRjMsCQkiXDAzM1swMTVxIn0sCiAgICB7S19TX0Y0LAkJIlwwMzNbMDE2cSJ9LAogICAge0tfU19GNSwJCSJcMDMzWzAxN3EifSwKICAgIHtLX1NfRjYsCQkiXDAzM1swMThxIn0sCiAgICB7S19TX0Y3LAkJIlwwMzNbMDE5cSJ9LAogICAge0tfU19GOCwJCSJcMDMzWzAyMHEifSwKICAgIHtLX1NfRjksCQkiXDAzM1swMjFxIn0sCiAgICB7S19TX0YxMCwJCSJcMDMzWzAyMnEifSwKICAgIHtLX1NfRjExLAkJIlwwMzNbMDIzcSJ9LAogICAge0tfU19GMTIsCQkiXDAzM1swMjRxIn0sCiAgICB7S19JTlMsCQkiXDAzM1sxMzlxIn0sCiAgICB7S19IT01FLAkJIlwwMzNbSCJ9LAogICAge0tfRU5ELAkJIlwwMzNbMTQ2cSJ9LAogICAge0tfUEFHRVVQLAkJIlwwMzNbMTUwcSJ9LAogICAge0tfUEFHRURPV04sCSJcMDMzWzE1NHEifSwKIyBlbmRpZgoKIyBpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKQovKgogKiBmb3IgZGVidWdnaW5nCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJImRlYnVnIn0sCiAgICB7KGludClLU19DRSwJIltDRV0ifSwKICAgIHsoaW50KUtTX0NELAkiW0NEXSJ9LAogICAgeyhpbnQpS1NfQUwsCSJbQUxdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DQUwsCSJbQ0FMJXAxJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NBTCwJIltDQUwlZF0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX0RMLAkiW0RMXSJ9LAojICBpZmRlZiBURVJNSU5GTwogICAgeyhpbnQpS1NfQ0RMLAkiW0NETCVwMSVkXSJ9LAojICBlbHNlCiAgICB7KGludClLU19DREwsCSJbQ0RMJWRdIn0sCiMgIGVuZGlmCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUywJIlslcDElZENTJXAyJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NTLAkiWyVkQ1MlZF0ifSwKIyAgZW5kaWYKIyAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKIyAgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DU1YsCSJbJXAxJWRDU1YlcDIlZF0ifSwKIyAgIGVsc2UKICAgIHsoaW50KUtTX0NTViwJIlslZENTViVkXSJ9LAojICAgZW5kaWYKIyAgZW5kaWYKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NBQiwJIltDQUIlcDElZF0ifSwKICAgIHsoaW50KUtTX0NBRiwJIltDQUYlcDElZF0ifSwKICAgIHsoaW50KUtTX0NTQiwJIltDU0IlcDElZF0ifSwKICAgIHsoaW50KUtTX0NTRiwJIltDU0YlcDElZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ0FCLAkiW0NBQiVkXSJ9LAogICAgeyhpbnQpS1NfQ0FGLAkiW0NBRiVkXSJ9LAogICAgeyhpbnQpS1NfQ1NCLAkiW0NTQiVkXSJ9LAogICAgeyhpbnQpS1NfQ1NGLAkiW0NTRiVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfT1AsCSJbT1BdIn0sCiAgICB7KGludClLU19MRSwJIltMRV0ifSwKICAgIHsoaW50KUtTX0NMLAkiW0NMXSJ9LAogICAgeyhpbnQpS1NfVkksCSJbVkldIn0sCiAgICB7KGludClLU19WRSwJIltWRV0ifSwKICAgIHsoaW50KUtTX1ZTLAkiW1ZTXSJ9LAogICAgeyhpbnQpS1NfTUUsCSJbTUVdIn0sCiAgICB7KGludClLU19NUiwJIltNUl0ifSwKICAgIHsoaW50KUtTX01CLAkiW01CXSJ9LAogICAgeyhpbnQpS1NfTUQsCSJbTURdIn0sCiAgICB7KGludClLU19TRSwJIltTRV0ifSwKICAgIHsoaW50KUtTX1NPLAkiW1NPXSJ9LAogICAgeyhpbnQpS1NfVUUsCSJbVUVdIn0sCiAgICB7KGludClLU19VUywJIltVU10ifSwKICAgIHsoaW50KUtTX1VDRSwJIltVQ0VdIn0sCiAgICB7KGludClLU19VQ1MsCSJbVUNTXSJ9LAogICAgeyhpbnQpS1NfTVMsCSJbTVNdIn0sCiAgICB7KGludClLU19VVCwJIltVVF0ifSwKIyAgaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAkiWyVwMSVkQ00lcDIlZF0ifSwKIyAgZWxzZQogICAgeyhpbnQpS1NfQ00sCSJbJWRDTSVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfU1IsCSJbU1JdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DUkksCSJbQ1JJJXAxJWRdIn0sCiMgIGVsc2UKICAgIHsoaW50KUtTX0NSSSwJIltDUkklZF0ifSwKIyAgZW5kaWYKICAgIHsoaW50KUtTX1ZCLAkiW1ZCXSJ9LAogICAgeyhpbnQpS1NfS1MsCSJbS1NdIn0sCiAgICB7KGludClLU19LRSwJIltLRV0ifSwKICAgIHsoaW50KUtTX1RJLAkiW1RJXSJ9LAogICAgeyhpbnQpS1NfVEUsCSJbVEVdIn0sCiAgICB7KGludClLU19DSVMsCSJbQ0lTXSJ9LAogICAgeyhpbnQpS1NfQ0lFLAkiW0NJRV0ifSwKICAgIHsoaW50KUtTX1RTLAkiW1RTXSJ9LAogICAgeyhpbnQpS1NfRlMsCSJbRlNdIn0sCiMgIGlmZGVmIFRFUk1JTkZPCiAgICB7KGludClLU19DV1MsCSJbJXAxJWRDV1MlcDIlZF0ifSwKICAgIHsoaW50KUtTX0NXUCwJIlslcDElZENXUCVwMiVkXSJ9LAojICBlbHNlCiAgICB7KGludClLU19DV1MsCSJbJWRDV1MlZF0ifSwKICAgIHsoaW50KUtTX0NXUCwJIlslZENXUCVkXSJ9LAojICBlbmRpZgogICAgeyhpbnQpS1NfQ1JWLAkiW0NSVl0ifSwKICAgIHtLX1VQLAkJIltLVV0ifSwKICAgIHtLX0RPV04sCQkiW0tEXSJ9LAogICAge0tfTEVGVCwJCSJbS0xdIn0sCiAgICB7S19SSUdIVCwJCSJbS1JdIn0sCiAgICB7S19YVVAsCQkiW3hLVV0ifSwKICAgIHtLX1hET1dOLAkJIlt4S0RdIn0sCiAgICB7S19YTEVGVCwJCSJbeEtMXSJ9LAogICAge0tfWFJJR0hULAkJIlt4S1JdIn0sCiAgICB7S19TX1VQLAkJIltTLUtVXSJ9LAogICAge0tfU19ET1dOLAkJIltTLUtEXSJ9LAogICAge0tfU19MRUZULAkJIltTLUtMXSJ9LAogICAge0tfQ19MRUZULAkJIltDLUtMXSJ9LAogICAge0tfU19SSUdIVCwJCSJbUy1LUl0ifSwKICAgIHtLX0NfUklHSFQsCQkiW0MtS1JdIn0sCiAgICB7S19GMSwJCSJbRjFdIn0sCiAgICB7S19YRjEsCQkiW3hGMV0ifSwKICAgIHtLX0YyLAkJIltGMl0ifSwKICAgIHtLX1hGMiwJCSJbeEYyXSJ9LAogICAge0tfRjMsCQkiW0YzXSJ9LAogICAge0tfWEYzLAkJIlt4RjNdIn0sCiAgICB7S19GNCwJCSJbRjRdIn0sCiAgICB7S19YRjQsCQkiW3hGNF0ifSwKICAgIHtLX0Y1LAkJIltGNV0ifSwKICAgIHtLX0Y2LAkJIltGNl0ifSwKICAgIHtLX0Y3LAkJIltGN10ifSwKICAgIHtLX0Y4LAkJIltGOF0ifSwKICAgIHtLX0Y5LAkJIltGOV0ifSwKICAgIHtLX0YxMCwJCSJbRjEwXSJ9LAogICAge0tfRjExLAkJIltGMTFdIn0sCiAgICB7S19GMTIsCQkiW0YxMl0ifSwKICAgIHtLX1NfRjEsCQkiW1MtRjFdIn0sCiAgICB7S19TX1hGMSwJCSJbUy14RjFdIn0sCiAgICB7S19TX0YyLAkJIltTLUYyXSJ9LAogICAge0tfU19YRjIsCQkiW1MteEYyXSJ9LAogICAge0tfU19GMywJCSJbUy1GM10ifSwKICAgIHtLX1NfWEYzLAkJIltTLXhGM10ifSwKICAgIHtLX1NfRjQsCQkiW1MtRjRdIn0sCiAgICB7S19TX1hGNCwJCSJbUy14RjRdIn0sCiAgICB7S19TX0Y1LAkJIltTLUY1XSJ9LAogICAge0tfU19GNiwJCSJbUy1GNl0ifSwKICAgIHtLX1NfRjcsCQkiW1MtRjddIn0sCiAgICB7S19TX0Y4LAkJIltTLUY4XSJ9LAogICAge0tfU19GOSwJCSJbUy1GOV0ifSwKICAgIHtLX1NfRjEwLAkJIltTLUYxMF0ifSwKICAgIHtLX1NfRjExLAkJIltTLUYxMV0ifSwKICAgIHtLX1NfRjEyLAkJIltTLUYxMl0ifSwKICAgIHtLX0hFTFAsCQkiW0hFTFBdIn0sCiAgICB7S19VTkRPLAkJIltVTkRPXSJ9LAogICAge0tfQlMsCQkiW0JTXSJ9LAogICAge0tfSU5TLAkJIltJTlNdIn0sCiAgICB7S19LSU5TLAkJIltLSU5TXSJ9LAogICAge0tfREVMLAkJIltERUxdIn0sCiAgICB7S19LREVMLAkJIltLREVMXSJ9LAogICAge0tfSE9NRSwJCSJbSE9NRV0ifSwKICAgIHtLX1NfSE9NRSwJCSJbQy1IT01FXSJ9LAogICAge0tfQ19IT01FLAkJIltDLUhPTUVdIn0sCiAgICB7S19LSE9NRSwJCSJbS0hPTUVdIn0sCiAgICB7S19YSE9NRSwJCSJbWEhPTUVdIn0sCiAgICB7S19aSE9NRSwJCSJbWkhPTUVdIn0sCiAgICB7S19FTkQsCQkiW0VORF0ifSwKICAgIHtLX1NfRU5ELAkJIltDLUVORF0ifSwKICAgIHtLX0NfRU5ELAkJIltDLUVORF0ifSwKICAgIHtLX0tFTkQsCQkiW0tFTkRdIn0sCiAgICB7S19YRU5ELAkJIltYRU5EXSJ9LAogICAge0tfWkVORCwJCSJbWkVORF0ifSwKICAgIHtLX1BBR0VVUCwJCSJbUEFHRVVQXSJ9LAogICAge0tfUEFHRURPV04sCSJbUEFHRURPV05dIn0sCiAgICB7S19LUEFHRVVQLAkJIltLUEFHRVVQXSJ9LAogICAge0tfS1BBR0VET1dOLAkiW0tQQUdFRE9XTl0ifSwKICAgIHtLX01PVVNFLAkJIltNT1VTRV0ifSwKICAgIHtLX0tQTFVTLAkJIltLUExVU10ifSwKICAgIHtLX0tNSU5VUywJCSJbS01JTlVTXSJ9LAogICAge0tfS0RJVklERSwJCSJbS0RJVklERV0ifSwKICAgIHtLX0tNVUxUSVBMWSwJIltLTVVMVElQTFldIn0sCiAgICB7S19LRU5URVIsCQkiW0tFTlRFUl0ifSwKICAgIHtLX0tQT0lOVCwJCSJbS1BPSU5UXSJ9LAogICAge0tfSzAsCQkiW0swXSJ9LAogICAge0tfSzEsCQkiW0sxXSJ9LAogICAge0tfSzIsCQkiW0syXSJ9LAogICAge0tfSzMsCQkiW0szXSJ9LAogICAge0tfSzQsCQkiW0s0XSJ9LAogICAge0tfSzUsCQkiW0s1XSJ9LAogICAge0tfSzYsCQkiW0s2XSJ9LAogICAge0tfSzcsCQkiW0s3XSJ9LAogICAge0tfSzgsCQkiW0s4XSJ9LAogICAge0tfSzksCQkiW0s5XSJ9LAojIGVuZGlmCgojZW5kaWYgLyogTk9fQlVJTFRJTl9UQ0FQUyAqLwoKLyoKICogVGhlIG1vc3QgbWluaW1hbCB0ZXJtaW5hbDogb25seSBjbGVhciBzY3JlZW4gYW5kIGN1cnNvciBwb3NpdGlvbmluZwogKiBBbHdheXMgaW5jbHVkZWQuCiAqLwogICAgeyhpbnQpS1NfTkFNRSwJImR1bWIifSwKICAgIHsoaW50KUtTX0NMLAkiXDAxNCJ9LAojaWZkZWYgVEVSTUlORk8KICAgIHsoaW50KUtTX0NNLAlJRl9FQigiXDAzM1slaSVwMSVkOyVwMiVkSCIsCgkJCQkJCSAgRVNDX1NUUiAiWyVpJXAxJWQ7JXAyJWRIIil9LAojZWxzZQogICAgeyhpbnQpS1NfQ00sCUlGX0VCKCJcMDMzWyVpJWQ7JWRIIiwgRVNDX1NUUiAiWyVpJWQ7JWRIIil9LAojZW5kaWYKCi8qCiAqIGVuZCBtYXJrZXIKICovCiAgICB7KGludClLU19OQU1FLAlOVUxMfQoKfTsJLyogZW5kIG9mIGJ1aWx0aW5fdGVybWNhcHMgKi8KCi8qCiAqIERFRkFVTFRfVEVSTSBpcyB1c2VkLCB3aGVuIG5vIHRlcm1pbmFsIGlzIHNwZWNpZmllZCB3aXRoIC1UIG9wdGlvbiBvciAkVEVSTS4KICovCiNpZmRlZiBSSVNDT1MKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikicmlzY29zIgojZW5kaWYKCiNpZmRlZiBBTUlHQQojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJhbWlnYSIKI2VuZGlmCgojaWZkZWYgTVNXSU4KIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikid2luMzIiCiNlbmRpZgoKI2lmZGVmIE1TRE9TCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopInBjdGVybSIKI2VuZGlmCgojaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChfX01JTlRfXykKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikiYW5zaSIKI2VuZGlmCgojaWZkZWYgX19NSU5UX18KIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikidnQ1MiIKI2VuZGlmCgojaWZkZWYgX19FTVhfXwojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJvczJhbnNpIgojZW5kaWYKCiNpZmRlZiBWTVMKIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikidnQzMjAiCiNlbmRpZgoKI2lmZGVmIF9fQkVPU19fCiMgdW5kZWYgREVGQVVMVF9URVJNCiMgZGVmaW5lIERFRkFVTFRfVEVSTQkoY2hhcl91ICopImJlb3MtYW5zaSIKI2VuZGlmCgojaWZuZGVmIERFRkFVTFRfVEVSTQojIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJkdW1iIgojZW5kaWYKCi8qCiAqIFRlcm1fc3RyaW5ncyBjb250YWlucyBjdXJyZW50bHkgdXNlZCB0ZXJtaW5hbCBvdXRwdXQgc3RyaW5ncy4KICogSXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgYnkgcGFyc2VfYnVpbHRpbl90Y2FwKCkuCiAqIFRoZSB2YWx1ZXMgY2FuIGJlIGNoYW5nZWQgYnkgc2V0dGluZyB0aGUgb3B0aW9uIHdpdGggdGhlIHNhbWUgbmFtZS4KICovCmNoYXJfdSAqKHRlcm1fc3RyaW5nc1soaW50KUtTX0xBU1QgKyAxXSk7CgpzdGF0aWMgaW50CW5lZWRfZ2F0aGVyID0gRkFMU0U7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCnN0YXRpYyBjaGFyX3UJdGVybWxlYWRlclsyNTYgKyAxXTsJCS8qIGZvciBjaGVja190ZXJtY29kZSgpICovCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQpzdGF0aWMgaW50CWNoZWNrX2Zvcl9jb2RlcyA9IEZBTFNFOwkvKiBjaGVjayBmb3Iga2V5IGNvZGUgcmVwb25zZSAqLwojZW5kaWYKCiAgICBzdGF0aWMgc3RydWN0IGJ1aWx0aW5fdGVybSAqCmZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pCiAgICBjaGFyX3UJKnRlcm07CnsKICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnA7CgogICAgcCA9IGJ1aWx0aW5fdGVybWNhcHM7CiAgICB3aGlsZSAocC0+YnRfc3RyaW5nICE9IE5VTEwpCiAgICB7CglpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19OQU1FKQoJewojaWZkZWYgVU5JWAoJICAgIGlmIChTVFJDTVAocC0+YnRfc3RyaW5nLCAiaXJpcy1hbnNpIikgPT0gMCAmJiB2aW1faXNfaXJpcyh0ZXJtKSkKCQlyZXR1cm4gcDsKCSAgICBlbHNlIGlmIChTVFJDTVAocC0+YnRfc3RyaW5nLCAieHRlcm0iKSA9PSAwICYmIHZpbV9pc194dGVybSh0ZXJtKSkKCQlyZXR1cm4gcDsKCSAgICBlbHNlCiNlbmRpZgojaWZkZWYgVk1TCgkJaWYgKFNUUkNNUChwLT5idF9zdHJpbmcsICJ2dDMyMCIpID09IDAgJiYgdmltX2lzX3Z0MzAwKHRlcm0pKQoJCSAgICByZXR1cm4gcDsKCQllbHNlCiNlbmRpZgoJCSAgaWYgKFNUUkNNUCh0ZXJtLCBwLT5idF9zdHJpbmcpID09IDApCgkJICAgIHJldHVybiBwOwoJfQoJKytwOwogICAgfQogICAgcmV0dXJuIHA7Cn0KCi8qCiAqIFBhcnNpbmcgb2YgdGhlIGJ1aWx0aW4gdGVybWNhcCBlbnRyaWVzLgogKiBDYWxsZXIgc2hvdWxkIGNoZWNrIGlmICduYW1lJyBpcyBhIHZhbGlkIGJ1aWx0aW4gdGVybS4KICogVGhlIHRlcm1pbmFsJ3MgbmFtZSBpcyBub3Qgc2V0LCBhcyB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiB0ZXJtY2FwaW5pdCgpLgogKi8KICAgIHN0YXRpYyB2b2lkCnBhcnNlX2J1aWx0aW5fdGNhcCh0ZXJtKQogICAgY2hhcl91ICAqdGVybTsKewogICAgc3RydWN0IGJ1aWx0aW5fdGVybQkgICAgKnA7CiAgICBjaGFyX3UJCSAgICBuYW1lWzJdOwogICAgaW50CQkJICAgIHRlcm1fOGJpdDsKCiAgICBwID0gZmluZF9idWlsdGluX3Rlcm0odGVybSk7CiAgICB0ZXJtXzhiaXQgPSB0ZXJtX2lzXzhiaXQodGVybSk7CgogICAgLyogRG8gbm90IHBhcnNlIGlmIGJ1aWx0aW4gdGVybSBub3QgZm91bmQgKi8KICAgIGlmIChwLT5idF9zdHJpbmcgPT0gTlVMTCkKCXJldHVybjsKCiAgICBmb3IgKCsrcDsgcC0+YnRfZW50cnkgIT0gKGludClLU19OQU1FICYmIHAtPmJ0X2VudHJ5ICE9IEJUX0VYVFJBX0tFWVM7ICsrcCkKICAgIHsKCWlmICgoaW50KXAtPmJ0X2VudHJ5ID49IDApCS8qIEtTX3h4IGVudHJ5ICovCgl7CgkgICAgLyogT25seSBzZXQgdGhlIHZhbHVlIGlmIGl0IHdhc24ndCBzZXQgeWV0LiAqLwoJICAgIGlmICh0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID09IE5VTEwKCQkJCSB8fCB0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID09IGVtcHR5X29wdGlvbikKCSAgICB7CgkJLyogOGJpdCB0ZXJtaW5hbDogdXNlIENTSSBpbnN0ZWFkIG9mIDxFc2M+WyAqLwoJCWlmICh0ZXJtXzhiaXQgJiYgdGVybV83dG84Yml0KChjaGFyX3UgKilwLT5idF9zdHJpbmcpICE9IDApCgkJewoJCSAgICBjaGFyX3UgICpzLCAqdDsKCgkJICAgIHMgPSB2aW1fc3Ryc2F2ZSgoY2hhcl91ICopcC0+YnRfc3RyaW5nKTsKCQkgICAgaWYgKHMgIT0gTlVMTCkKCQkgICAgewoJCQlmb3IgKHQgPSBzOyAqdDsgKyt0KQoJCQkgICAgaWYgKHRlcm1fN3RvOGJpdCh0KSkKCQkJICAgIHsKCQkJCSp0ID0gdGVybV83dG84Yml0KHQpOwoJCQkJU1RSQ1BZKHQgKyAxLCB0ICsgMik7CgkJCSAgICB9CgkJCXRlcm1fc3RyaW5nc1twLT5idF9lbnRyeV0gPSBzOwoJCQlzZXRfdGVybV9vcHRpb25fYWxsb2NlZCgmdGVybV9zdHJpbmdzW3AtPmJ0X2VudHJ5XSk7CgkJICAgIH0KCQl9CgkJZWxzZQoJCSAgICB0ZXJtX3N0cmluZ3NbcC0+YnRfZW50cnldID0gKGNoYXJfdSAqKXAtPmJ0X3N0cmluZzsKCSAgICB9Cgl9CgllbHNlCgl7CgkgICAgbmFtZVswXSA9IEtFWTJURVJNQ0FQMCgoaW50KXAtPmJ0X2VudHJ5KTsKCSAgICBuYW1lWzFdID0gS0VZMlRFUk1DQVAxKChpbnQpcC0+YnRfZW50cnkpOwoJICAgIGlmIChmaW5kX3Rlcm1jb2RlKG5hbWUpID09IE5VTEwpCgkJYWRkX3Rlcm1jb2RlKG5hbWUsIChjaGFyX3UgKilwLT5idF9zdHJpbmcsIHRlcm1fOGJpdCk7Cgl9CiAgICB9Cn0KI2lmIGRlZmluZWQoSEFWRV9UR0VURU5UKSB8fCBkZWZpbmVkKEZFQVRfVEVSTVJFU1BPTlNFKQpzdGF0aWMgdm9pZCBzZXRfY29sb3JfY291bnQgX19BUkdTKChpbnQgbnIpKTsKCi8qCiAqIFNldCBudW1iZXIgb2YgY29sb3JzLgogKiBTdG9yZSBpdCBhcyBhIG51bWJlciBpbiB0X2NvbG9ycy4KICogU3RvcmUgaXQgYXMgYSBzdHJpbmcgaW4gVF9DQ08gKHVzaW5nIG5yX2NvbG9yc1tdKS4KICovCiAgICBzdGF0aWMgdm9pZApzZXRfY29sb3JfY291bnQobnIpCiAgICBpbnQJCW5yOwp7CiAgICBjaGFyX3UJbnJfY29sb3JzWzIwXTsJCS8qIHN0cmluZyBmb3IgbnVtYmVyIG9mIGNvbG9ycyAqLwoKICAgIHRfY29sb3JzID0gbnI7CiAgICBpZiAodF9jb2xvcnMgPiAxKQoJc3ByaW50ZigoY2hhciAqKW5yX2NvbG9ycywgIiVkIiwgdF9jb2xvcnMpOwogICAgZWxzZQoJKm5yX2NvbG9ycyA9IE5VTDsKICAgIHNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopInRfQ28iLCAtMSwgbnJfY29sb3JzLCBPUFRfRlJFRSwgMCk7Cn0KI2VuZGlmCgojaWZkZWYgSEFWRV9UR0VURU5UCnN0YXRpYyBjaGFyICooa2V5X25hbWVzW10pID0KewojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKICAgIC8qIERvIHRoaXMgb25lIGZpcnN0LCBpdCBtYXkgY2F1c2UgYSBzY3JlZW4gcmVkcmF3LiAqLwogICAgIkNvIiwKI2VuZGlmCiAgICAia3UiLCAia2QiLCAia3IiLCAia2wiLAojIGlmZGVmIEFSQ0hJRQogICAgInN1IiwgInNkIiwJCS8qIFRlcm1jYXAgY29kZSBtYWRlIHVwISAqLwojIGVuZGlmCiAgICAiIzIiLCAiIzQiLCAiJWkiLCAiKjciLAogICAgImsxIiwgImsyIiwgImszIiwgIms0IiwgIms1IiwgIms2IiwKICAgICJrNyIsICJrOCIsICJrOSIsICJrOyIsICJGMSIsICJGMiIsCiAgICAiJTEiLCAiJjgiLCAia2IiLCAia0kiLCAia0QiLCAia2giLAogICAgIkA3IiwgImtQIiwgImtOIiwgIksxIiwgIkszIiwgIks0IiwgIks1IiwgImtCIiwKICAgIE5VTEwKfTsKI2VuZGlmCgovKgogKiBTZXQgdGVybWluYWwgb3B0aW9ucyBmb3IgdGVybWluYWwgInRlcm0iLgogKiBSZXR1cm4gT0sgaWYgdGVybWluYWwgJ3Rlcm0nIHdhcyBmb3VuZCBpbiBhIHRlcm1jYXAsIEZBSUwgb3RoZXJ3aXNlLgogKgogKiBXaGlsZSBkb2luZyB0aGlzLCB1bnRpbCB0dGVzdCgpLCBzb21lIG9wdGlvbnMgbWF5IGJlIE5VTEwsIGJlIGNhcmVmdWwuCiAqLwogICAgaW50CnNldF90ZXJtbmFtZSh0ZXJtKQogICAgY2hhcl91ICp0ZXJtOwp7CiAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICp0ZXJtcDsKI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgaW50CQlidWlsdGluX2ZpcnN0ID0gcF90Ymk7CiAgICBpbnQJCXRyeTsKICAgIGludAkJdGVybWNhcF9jbGVhcmVkID0gRkFMU0U7CiNlbmRpZgogICAgaW50CQl3aWR0aCA9IDAsIGhlaWdodCA9IDA7CiAgICBjaGFyX3UJKmVycm9yX21zZyA9IE5VTEw7CiAgICBjaGFyX3UJKmJzX3AsICpkZWxfcDsKCiAgICAvKiBJbiBzaWxlY3QgbW9kZSAoZXggLXMpIHdlIGRvbid0IHVzZSB0aGUgJ3Rlcm0nIG9wdGlvbi4gKi8KICAgIGlmIChzaWxlbnRfbW9kZSkKCXJldHVybiBPSzsKCiAgICBkZXRlY3RlZF84Yml0ID0gRkFMU0U7CQkvKiByZXNldCA4LWJpdCBkZXRlY3Rpb24gKi8KCiAgICBpZiAodGVybV9pc19idWlsdGluKHRlcm0pKQogICAgewoJdGVybSArPSA4OwojaWZkZWYgSEFWRV9UR0VURU5UCglidWlsdGluX2ZpcnN0ID0gMTsKI2VuZGlmCiAgICB9CgovKgogKiBJZiBIQVZFX1RHRVRFTlQgaXMgbm90IGRlZmluZWQsIG9ubHkgdGhlIGJ1aWx0aW4gdGVybWNhcCBpcyB1c2VkLCBvdGhlcndpc2U6CiAqICAgSWYgYnVpbHRpbl9maXJzdCBpcyBUUlVFOgogKiAgICAgMC4gdHJ5IGJ1aWx0aW4gdGVybWNhcAogKiAgICAgMS4gdHJ5IGV4dGVybmFsIHRlcm1jYXAKICogICAgIDIuIGlmIGJvdGggZmFpbCBkZWZhdWx0IHRvIGEgYnVpbHRpbiB0ZXJtaW5hbAogKiAgIElmIGJ1aWx0aW5fZmlyc3QgaXMgRkFMU0U6CiAqICAgICAxLiB0cnkgZXh0ZXJuYWwgdGVybWNhcAogKiAgICAgMi4gdHJ5IGJ1aWx0aW4gdGVybWNhcCwgaWYgYm90aCBmYWlsIGRlZmF1bHQgdG8gYSBidWlsdGluIHRlcm1pbmFsCiAqLwojaWZkZWYgSEFWRV9UR0VURU5UCiAgICBmb3IgKHRyeSA9IGJ1aWx0aW5fZmlyc3QgPyAwIDogMTsgdHJ5IDwgMzsgKyt0cnkpCiAgICB7CgkvKgoJICogVXNlIGV4dGVybmFsIHRlcm1jYXAKCSAqLwoJaWYgKHRyeSA9PSAxKQoJewoJICAgIGNoYXJfdQkgICAgKnA7CgkgICAgc3RhdGljIGNoYXJfdSAgIHRzdHJidWZbVEJVRlNaXTsKCSAgICBpbnQJCSAgICBpOwoJICAgIGNoYXJfdQkgICAgdGJ1ZltUQlVGU1pdOwoJICAgIGNoYXJfdQkgICAgKnRwOwoJICAgIHN0YXRpYyBzdHJ1Y3QgewoJCQkgICAgZW51bSBTcGVjaWFsS2V5IGRlc3Q7IC8qIGluZGV4IGluIHRlcm1fc3RyaW5nc1tdICovCgkJCSAgICBjaGFyICpuYW1lOwkJICAvKiB0ZXJtY2FwIG5hbWUgZm9yIHN0cmluZyAqLwoJCQkgIH0gc3RyaW5nX25hbWVzW10gPQoJCQkgICAgewl7S1NfQ0UsICJjZSJ9LCB7S1NfQUwsICJhbCJ9LCB7S1NfQ0FMLCJBTCJ9LAoJCQkJe0tTX0RMLCAiZGwifSwge0tTX0NETCwiREwifSwge0tTX0NTLCAiY3MifSwKCQkJCXtLU19DTCwgImNsIn0sIHtLU19DRCwgImNkIn0sCgkJCQl7S1NfVkksICJ2aSJ9LCB7S1NfVkUsICJ2ZSJ9LCB7S1NfTUIsICJtYiJ9LAoJCQkJe0tTX1ZTLCAidnMifSwge0tTX01FLCAibWUifSwge0tTX01SLCAibXIifSwKCQkJCXtLU19NRCwgIm1kIn0sIHtLU19TRSwgInNlIn0sIHtLU19TTywgInNvIn0sCgkJCQl7S1NfQ1pILCJaSCJ9LCB7S1NfQ1pSLCJaUiJ9LCB7S1NfVUUsICJ1ZSJ9LAoJCQkJe0tTX1VTLCAidXMifSwge0tTX1VDRSwgIkNlIn0sIHtLU19VQ1MsICJDcyJ9LAoJCQkJe0tTX0NNLCAiY20ifSwge0tTX1NSLCAic3IifSwKCQkJCXtLU19DUkksIlJJIn0sIHtLU19WQiwgInZiIn0sIHtLU19LUywgImtzIn0sCgkJCQl7S1NfS0UsICJrZSJ9LCB7S1NfVEksICJ0aSJ9LCB7S1NfVEUsICJ0ZSJ9LAoJCQkJe0tTX0JDLCAiYmMifSwge0tTX0NTQiwiU2IifSwge0tTX0NTRiwiU2YifSwKCQkJCXtLU19DQUIsIkFCIn0sIHtLU19DQUYsIkFGIn0sIHtLU19MRSwgImxlIn0sCgkJCQl7S1NfTkQsICJuZCJ9LCB7S1NfT1AsICJvcCJ9LCB7S1NfQ1JWLCAiUlYifSwKCQkJCXtLU19DSVMsICJJUyJ9LCB7S1NfQ0lFLCAiSUUifSwKCQkJCXtLU19UUywgInRzIn0sIHtLU19GUywgImZzIn0sCgkJCQl7S1NfQ1dQLCAiV1AifSwge0tTX0NXUywgIldTIn0sCgkJCQl7S1NfQ1NJLCAiU0kifSwge0tTX0NFSSwgIkVJIn0sCgkJCQl7KGVudW0gU3BlY2lhbEtleSkwLCBOVUxMfQoJCQkgICAgfTsKCgkgICAgLyoKCSAgICAgKiBJZiB0aGUgZXh0ZXJuYWwgdGVybWNhcCBkb2VzIG5vdCBoYXZlIGEgbWF0Y2hpbmcgZW50cnksIHRyeSB0aGUKCSAgICAgKiBidWlsdGluIG9uZXMuCgkgICAgICovCgkgICAgaWYgKChlcnJvcl9tc2cgPSB0Z2V0ZW50X2Vycm9yKHRidWYsIHRlcm0pKSA9PSBOVUxMKQoJICAgIHsKCQl0cCA9IHRzdHJidWY7CgkJaWYgKCF0ZXJtY2FwX2NsZWFyZWQpCgkJewoJCSAgICBjbGVhcl90ZXJtb3B0aW9ucygpOwkvKiBjbGVhciBvbGQgb3B0aW9ucyAqLwoJCSAgICB0ZXJtY2FwX2NsZWFyZWQgPSBUUlVFOwoJCX0KCgkgICAgLyogZ2V0IG91dHB1dCBzdHJpbmdzICovCgkJZm9yIChpID0gMDsgc3RyaW5nX25hbWVzW2ldLm5hbWUgIT0gTlVMTDsgKytpKQoJCXsKCQkgICAgaWYgKHRlcm1fc3RyKHN0cmluZ19uYW1lc1tpXS5kZXN0KSA9PSBOVUxMCgkJCSAgICB8fCB0ZXJtX3N0cihzdHJpbmdfbmFtZXNbaV0uZGVzdCkgPT0gZW1wdHlfb3B0aW9uKQoJCQl0ZXJtX3N0cihzdHJpbmdfbmFtZXNbaV0uZGVzdCkgPQoJCQkJCSAgIFRHRVRTVFIoc3RyaW5nX25hbWVzW2ldLm5hbWUsICZ0cCk7CgkJfQoKCQkvKiB0Z2V0ZmxhZygpIHJldHVybnMgMSBpZiB0aGUgZmxhZyBpcyBwcmVzZW50LCAwIGlmIG5vdCBhbmQKCQkgKiBwb3NzaWJseSAtMSBpZiB0aGUgZmxhZyBkb2Vzbid0IGV4aXN0LiAqLwoJCWlmICgoVF9NUyA9PSBOVUxMIHx8IFRfTVMgPT0gZW1wdHlfb3B0aW9uKQoJCQkJCQkJJiYgdGdldGZsYWcoIm1zIikgPiAwKQoJCSAgICBUX01TID0gKGNoYXJfdSAqKSJ5IjsKCQlpZiAoKFRfWFMgPT0gTlVMTCB8fCBUX1hTID09IGVtcHR5X29wdGlvbikKCQkJCQkJCSYmIHRnZXRmbGFnKCJ4cyIpID4gMCkKCQkgICAgVF9YUyA9IChjaGFyX3UgKikieSI7CgkJaWYgKChUX0RCID09IE5VTEwgfHwgVF9EQiA9PSBlbXB0eV9vcHRpb24pCgkJCQkJCQkmJiB0Z2V0ZmxhZygiZGIiKSA+IDApCgkJICAgIFRfREIgPSAoY2hhcl91ICopInkiOwoJCWlmICgoVF9EQSA9PSBOVUxMIHx8IFRfREEgPT0gZW1wdHlfb3B0aW9uKQoJCQkJCQkJJiYgdGdldGZsYWcoImRhIikgPiAwKQoJCSAgICBUX0RBID0gKGNoYXJfdSAqKSJ5IjsKCQlpZiAoKFRfVVQgPT0gTlVMTCB8fCBUX1VUID09IGVtcHR5X29wdGlvbikKCQkJCQkJCSYmIHRnZXRmbGFnKCJ1dCIpID4gMCkKCQkgICAgVF9VVCA9IChjaGFyX3UgKikieSI7CgoKCQkvKgoJCSAqIGdldCBrZXkgY29kZXMKCQkgKi8KCQlmb3IgKGkgPSAwOyBrZXlfbmFtZXNbaV0gIT0gTlVMTDsgKytpKQoJCXsKCQkgICAgaWYgKGZpbmRfdGVybWNvZGUoKGNoYXJfdSAqKWtleV9uYW1lc1tpXSkgPT0gTlVMTCkKCQkgICAgewoJCQlwID0gVEdFVFNUUihrZXlfbmFtZXNbaV0sICZ0cCk7CgkJCS8qIGlmIGN1cnNvci1sZWZ0ID09IGJhY2tzcGFjZSwgaWdub3JlIGl0ICh0ZWxldmlkZW8KCQkJICogOTI1KSAqLwoJCQlpZiAocCAhPSBOVUxMCgkJCQkmJiAoKnAgIT0gQ3RybF9ICgkJCQkgICAgfHwga2V5X25hbWVzW2ldWzBdICE9ICdrJwoJCQkJICAgIHx8IGtleV9uYW1lc1tpXVsxXSAhPSAnbCcpKQoJCQkgICAgYWRkX3Rlcm1jb2RlKChjaGFyX3UgKilrZXlfbmFtZXNbaV0sIHAsIEZBTFNFKTsKCQkgICAgfQoJCX0KCgkJaWYgKGhlaWdodCA9PSAwKQoJCSAgICBoZWlnaHQgPSB0Z2V0bnVtKCJsaSIpOwoJCWlmICh3aWR0aCA9PSAwKQoJCSAgICB3aWR0aCA9IHRnZXRudW0oImNvIik7CgoJCS8qCgkJICogR2V0IG51bWJlciBvZiBjb2xvcnMgKGlmIG5vdCBkb25lIGFscmVhZHkpLgoJCSAqLwoJCWlmICh0ZXJtX3N0cihLU19DQ08pID09IE5VTEwKCQkJfHwgdGVybV9zdHIoS1NfQ0NPKSA9PSBlbXB0eV9vcHRpb24pCgkJICAgIHNldF9jb2xvcl9jb3VudCh0Z2V0bnVtKCJDbyIpKTsKCiMgaWZuZGVmIGhwdXgKCQlCQyA9IChjaGFyICopVEdFVFNUUigiYmMiLCAmdHApOwoJCVVQID0gKGNoYXIgKilUR0VUU1RSKCJ1cCIsICZ0cCk7CgkJcCA9IFRHRVRTVFIoInBjIiwgJnRwKTsKCQlpZiAocCkKCQkgICAgUEMgPSAqcDsKIyBlbmRpZiAvKiBocHV4ICovCgkgICAgfQoJfQoJZWxzZQkgICAgLyogdHJ5ID09IDAgfHwgdHJ5ID09IDIgKi8KI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLwoJLyoKCSAqIFVzZSBidWlsdGluIHRlcm1jYXAKCSAqLwoJewojaWZkZWYgSEFWRV9UR0VURU5UCgkgICAgLyoKCSAgICAgKiBJZiBidWlsdGluIHRlcm1jYXAgd2FzIGFscmVhZHkgdXNlZCwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZWFyY2gKCSAgICAgKiBmb3IgdGhlIGJ1aWx0aW4gdGVybWNhcCBhZ2FpbiwgcXVpdCBub3cuCgkgICAgICovCgkgICAgaWYgKHRyeSA9PSAyICYmIGJ1aWx0aW5fZmlyc3QgJiYgdGVybWNhcF9jbGVhcmVkKQoJCWJyZWFrOwojZW5kaWYKCSAgICAvKgoJICAgICAqIHNlYXJjaCBmb3IgJ3Rlcm0nIGluIGJ1aWx0aW5fdGVybWNhcHNbXQoJICAgICAqLwoJICAgIHRlcm1wID0gZmluZF9idWlsdGluX3Rlcm0odGVybSk7CgkgICAgaWYgKHRlcm1wLT5idF9zdHJpbmcgPT0gTlVMTCkJLyogZGlkIG5vdCBmaW5kIGl0ICovCgkgICAgewojaWZkZWYgSEFWRV9UR0VURU5UCgkJLyoKCQkgKiBJZiB0cnkgPT0gMCwgZmlyc3QgdHJ5IHRoZSBleHRlcm5hbCB0ZXJtY2FwLiBJZiB0aGF0IGlzIG5vdAoJCSAqIGZvdW5kIHdlJ2xsIGdldCBiYWNrIGhlcmUgd2l0aCB0cnkgPT0gMi4KCQkgKiBJZiB0ZXJtY2FwX2NsZWFyZWQgaXMgc2V0IHdlIHVzZWQgdGhlIGV4dGVybmFsIHRlcm1jYXAsCgkJICogZG9uJ3QgY29tcGxhaW4gYWJvdXQgbm90IGZpbmRpbmcgdGhlIHRlcm0gaW4gdGhlIGJ1aWx0aW4KCQkgKiB0ZXJtY2FwLgoJCSAqLwoJCWlmICh0cnkgPT0gMCkJCQkvKiB0cnkgZXh0ZXJuYWwgb25lICovCgkJICAgIGNvbnRpbnVlOwoJCWlmICh0ZXJtY2FwX2NsZWFyZWQpCQkvKiBmb3VuZCBpbiBleHRlcm5hbCB0ZXJtY2FwICovCgkJICAgIGJyZWFrOwojZW5kaWYKCgkJbWNoX2Vycm1zZygiXHJcbiIpOwoJCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKCQl7CgkJICAgIG1jaF9lcnJtc2coKGNoYXIgKillcnJvcl9tc2cpOwoJCSAgICBtY2hfZXJybXNnKCJcclxuIik7CgkJfQoJCW1jaF9lcnJtc2coIiciKTsKCQltY2hfZXJybXNnKChjaGFyICopdGVybSk7CgkJbWNoX2Vycm1zZyhfKCInIG5vdCBrbm93bi4gQXZhaWxhYmxlIGJ1aWx0aW4gdGVybWluYWxzIGFyZToiKSk7CgkJbWNoX2Vycm1zZygiXHJcbiIpOwoJCWZvciAodGVybXAgPSAmKGJ1aWx0aW5fdGVybWNhcHNbMF0pOyB0ZXJtcC0+YnRfc3RyaW5nICE9IE5VTEw7CgkJCQkJCQkJICAgICAgKyt0ZXJtcCkKCQl7CgkJICAgIGlmICh0ZXJtcC0+YnRfZW50cnkgPT0gKGludClLU19OQU1FKQoJCSAgICB7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCQkJbWNoX2Vycm1zZygiICAgIGJ1aWx0aW5fIik7CiNlbHNlCgkJCW1jaF9lcnJtc2coIiAgICAiKTsKI2VuZGlmCgkJCW1jaF9lcnJtc2codGVybXAtPmJ0X3N0cmluZyk7CgkJCW1jaF9lcnJtc2coIlxyXG4iKTsKCQkgICAgfQoJCX0KCQkvKiB3aGVuIHVzZXIgdHlwZWQgOnNldCB0ZXJtPXh4eCwgcXVpdCBoZXJlICovCgkJaWYgKHN0YXJ0aW5nICE9IE5PX1NDUkVFTikKCQl7CgkJICAgIHNjcmVlbl9zdGFydCgpOwkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KCQkgICAgd2FpdF9yZXR1cm4oVFJVRSk7CgkJICAgIHJldHVybiBGQUlMOwoJCX0KCQl0ZXJtID0gREVGQVVMVF9URVJNOwoJCW1jaF9lcnJtc2coXygiZGVmYXVsdGluZyB0byAnIikpOwoJCW1jaF9lcnJtc2coKGNoYXIgKil0ZXJtKTsKCQltY2hfZXJybXNnKCInXHJcbiIpOwoJCWlmIChlbXNnX3NpbGVudCA9PSAwKQoJCXsKCQkgICAgc2NyZWVuX3N0YXJ0KCk7CS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwoJCSAgICBvdXRfZmx1c2goKTsKCQkgICAgdWlfZGVsYXkoMjAwMEwsIFRSVUUpOwoJCX0KCQlzZXRfc3RyaW5nX29wdGlvbl9kaXJlY3QoKGNoYXJfdSAqKSJ0ZXJtIiwgLTEsIHRlcm0sCgkJCQkJCQkJIE9QVF9GUkVFLCAwKTsKCQlkaXNwbGF5X2Vycm9ycygpOwoJICAgIH0KCSAgICBvdXRfZmx1c2goKTsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJICAgIGlmICghdGVybWNhcF9jbGVhcmVkKQoJICAgIHsKI2VuZGlmCgkJY2xlYXJfdGVybW9wdGlvbnMoKTsJICAgIC8qIGNsZWFyIG9sZCBvcHRpb25zICovCiNpZmRlZiBIQVZFX1RHRVRFTlQKCQl0ZXJtY2FwX2NsZWFyZWQgPSBUUlVFOwoJICAgIH0KI2VuZGlmCgkgICAgcGFyc2VfYnVpbHRpbl90Y2FwKHRlcm0pOwojaWZkZWYgRkVBVF9HVUkKCSAgICBpZiAodGVybV9pc19ndWkodGVybSkpCgkgICAgewoJCW91dF9mbHVzaCgpOwoJCWd1aV9pbml0KCk7CgkJLyogSWYgc3RhcnRpbmcgdGhlIEdVSSBmYWlsZWQsIGRvbid0IGRvIGFueSBvZiB0aGUgb3RoZXIKCQkgKiB0aGluZ3MgZm9yIHRoaXMgdGVybWluYWwgKi8KCQlpZiAoIWd1aS5pbl91c2UpCgkJICAgIHJldHVybiBGQUlMOwojaWZkZWYgSEFWRV9UR0VURU5UCgkJYnJlYWs7CQkvKiBkb24ndCB0cnkgdXNpbmcgZXh0ZXJuYWwgdGVybWNhcCAqLwojZW5kaWYKCSAgICB9CiNlbmRpZiAvKiBGRUFUX0dVSSAqLwoJfQojaWZkZWYgSEFWRV9UR0VURU5UCiAgICB9CiNlbmRpZgoKLyoKICogc3BlY2lhbDogVGhlcmUgaXMgbm8gaW5mbyBpbiB0aGUgdGVybWNhcCBhYm91dCB3aGV0aGVyIHRoZSBjdXJzb3IKICogcG9zaXRpb25pbmcgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzY3JlZW4gb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZQogKiBzY3JvbGxpbmcgcmVnaW9uLiAgV2UganVzdCBndWVzcyBoZXJlLiBPbmx5IG1zZG9zIHBjdGVybSBpcyBrbm93biB0byBkbyBpdAogKiByZWxhdGl2ZS4KICovCiAgICBpZiAoU1RSQ01QKHRlcm0sICJwY3Rlcm0iKSA9PSAwKQoJVF9DQ1MgPSAoY2hhcl91ICopInllcyI7CiAgICBlbHNlCglUX0NDUyA9IGVtcHR5X29wdGlvbjsKCiNpZmRlZiBVTklYCi8qCiAqIEFueSAic3R0eSIgc2V0dGluZ3Mgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZm9yIHRfa2IgZnJvbSB0aGUgdGVybWNhcC4KICogVGhpcyBpcyBpbiBvc191bml4LmMsIGJlY2F1c2UgaXQgZGVwZW5kcyBhIGxvdCBvbiB0aGUgdmVyc2lvbiBvZiB1bml4IHRoYXQKICogaXMgYmVpbmcgdXNlZC4KICogRG9uJ3QgZG8gdGhpcyB3aGVuIHRoZSBHVUkgaXMgYWN0aXZlLCBpdCB1c2VzICJ0X2tiIiBhbmQgInRfa0QiIGRpcmVjdGx5LgogKi8KI2lmZGVmIEZFQVRfR1VJCiAgICBpZiAoIWd1aS5pbl91c2UpCiNlbmRpZgoJZ2V0X3N0dHkoKTsKI2VuZGlmCgovKgogKiBJZiB0aGUgdGVybWNhcCBoYXMgbm8gZW50cnkgZm9yICdicycgYW5kL29yICdkZWwnIGFuZCB0aGUgaW9jdGwoKSBhbHNvCiAqIGRpZG4ndCB3b3JrLCB1c2UgdGhlIGRlZmF1bHQgQ1RSTC1ICiAqIFRoZSBkZWZhdWx0IGZvciB0X2tEIGlzIERFTCwgdW5sZXNzIHRfa2IgaXMgREVMLgogKiBUaGUgdmltX3N0cnNhdmUnZCBzdHJpbmdzIGFyZSBwcm9iYWJseSBsb3N0IGZvcmV2ZXIsIHdlbGwgaXQncyBvbmx5IHR3bwogKiBieXRlcy4gIERvbid0IGRvIHRoaXMgd2hlbiB0aGUgR1VJIGlzIGFjdGl2ZSwgaXQgdXNlcyAidF9rYiIgYW5kICJ0X2tEIgogKiBkaXJlY3RseS4KICovCiNpZmRlZiBGRUFUX0dVSQogICAgaWYgKCFndWkuaW5fdXNlKQojZW5kaWYKICAgIHsKCWJzX3AgPSBmaW5kX3Rlcm1jb2RlKChjaGFyX3UgKikia2IiKTsKCWRlbF9wID0gZmluZF90ZXJtY29kZSgoY2hhcl91ICopImtEIik7CglpZiAoYnNfcCA9PSBOVUxMIHx8ICpic19wID09IE5VTCkKCSAgICBhZGRfdGVybWNvZGUoKGNoYXJfdSAqKSJrYiIsIChic19wID0gKGNoYXJfdSAqKUNUUkxfSF9TVFIpLCBGQUxTRSk7CglpZiAoKGRlbF9wID09IE5VTEwgfHwgKmRlbF9wID09IE5VTCkgJiYKCQkJCQkgICAgKGJzX3AgPT0gTlVMTCB8fCAqYnNfcCAhPSBERUwpKQoJICAgIGFkZF90ZXJtY29kZSgoY2hhcl91ICopImtEIiwgKGNoYXJfdSAqKURFTF9TVFIsIEZBTFNFKTsKICAgIH0KCiNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQogICAgdGVybV9pc194dGVybSA9IHZpbV9pc194dGVybSh0ZXJtKTsKI2VuZGlmCgojaWZkZWYgRkVBVF9NT1VTRQojIGlmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpCiMgIGlmZGVmIEZFQVRfTU9VU0VfVFRZCiAgICAvKgogICAgICogRm9yIFVuaXgsIHNldCB0aGUgJ3R0eW1vdXNlJyBvcHRpb24gdG8gdGhlIHR5cGUgb2YgbW91c2UgdG8gYmUgdXNlZC4KICAgICAqIFRoZSB0ZXJtY29kZSBmb3IgdGhlIG1vdXNlIGlzIGFkZGVkIGFzIGEgc2lkZSBlZmZlY3QgaW4gb3B0aW9uLmMuCiAgICAgKi8KICAgIHsKCWNoYXJfdQkqcDsKCglwID0gKGNoYXJfdSAqKSIiOwojICBpZmRlZiBGRUFUX01PVVNFX1hURVJNCiMgICBpZmRlZiBGRUFUX0NMSVBCT0FSRAojICAgIGlmZGVmIEZFQVRfR1VJCglpZiAoIWd1aS5pbl91c2UpCiMgICAgZW5kaWYKCSAgICBjbGlwX2luaXQoRkFMU0UpOwojICAgZW5kaWYKCWlmICh0ZXJtX2lzX3h0ZXJtKQoJewoJICAgIGlmICh1c2VfeHRlcm1fbW91c2UoKSkKCQlwID0gTlVMTDsJLyoga2VlcCBleGlzdGluZyB2YWx1ZSwgbWlnaHQgYmUgInh0ZXJtMiIgKi8KCSAgICBlbHNlCgkJcCA9IChjaGFyX3UgKikieHRlcm0iOwoJfQojICBlbmRpZgoJaWYgKHAgIT0gTlVMTCkKCSAgICBzZXRfb3B0aW9uX3ZhbHVlKChjaGFyX3UgKikidHR5bSIsIDBMLCBwLCAwKTsKCWlmIChwID09IE5VTEwKIyAgIGlmZGVmIEZFQVRfR1VJCgkJfHwgZ3VpLmluX3VzZQojICAgZW5kaWYKCQkpCgkgICAgY2hlY2tfbW91c2VfdGVybWNvZGUoKTsJLyogc2V0IG1vdXNlIHRlcm1jb2RlIGFueXdheSAqLwogICAgfQojICBlbmRpZgojIGVsc2UKICAgIHNldF9tb3VzZV90ZXJtY29kZShLU19NT1VTRSwgKGNoYXJfdSAqKSJcMjMzTSIpOwojIGVuZGlmCiNlbmRpZgkvKiBGRUFUX01PVVNFICovCgojaWZkZWYgRkVBVF9TTklGRgogICAgewoJY2hhcl91CW5hbWVbMl07CgoJbmFtZVswXSA9IChpbnQpS1NfRVhUUkE7CgluYW1lWzFdID0gKGludClLRV9TTklGRjsKCWFkZF90ZXJtY29kZShuYW1lLCAoY2hhcl91ICopIlwyMzNzbmlmZiIsIEZBTFNFKTsKICAgIH0KI2VuZGlmCgojaWZkZWYgVVNFX1RFUk1fQ09OU09MRQogICAgLyogREVGQVVMVF9URVJNIGluZGljYXRlcyB0aGF0IGl0IGlzIHRoZSBtYWNoaW5lIGNvbnNvbGUuICovCiAgICBpZiAoU1RSQ01QKHRlcm0sIERFRkFVTFRfVEVSTSkgIT0gMCkKCXRlcm1fY29uc29sZSA9IEZBTFNFOwogICAgZWxzZQogICAgewoJdGVybV9jb25zb2xlID0gVFJVRTsKIyBpZmRlZiBBTUlHQQoJd2luX3Jlc2l6ZV9vbigpOwkvKiBlbmFibGUgd2luZG93IHJlc2l6aW5nIHJlcG9ydHMgKi8KIyBlbmRpZgogICAgfQojZW5kaWYKCiNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKQogICAgLyoKICAgICAqICd0dHlmYXN0JyBpcyBkZWZhdWx0IG9uIGZvciB4dGVybSwgaXJpcy1hbnNpIGFuZCBhIGZldyBvdGhlcnMuCiAgICAgKi8KICAgIGlmICh2aW1faXNfZmFzdHRlcm0odGVybSkpCglwX3RmID0gVFJVRTsKI2VuZGlmCiNpZmRlZiBVU0VfVEVSTV9DT05TT0xFCiAgICAvKgogICAgICogJ3R0eWZhc3QnIGlzIGRlZmF1bHQgb24gY29uc29sZXMKICAgICAqLwogICAgaWYgKHRlcm1fY29uc29sZSkKCXBfdGYgPSBUUlVFOwojZW5kaWYKCiAgICB0dGVzdChUUlVFKTsJLyogbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBzZXQgb2YgdGVybWluYWwgY29kZXMgKi8KCiAgICBmdWxsX3NjcmVlbiA9IFRSVUU7CQkvKiB3ZSBjYW4gdXNlIHRlcm1jYXAgY29kZXMgZnJvbSBub3cgb24gKi8KICAgIHNldF90ZXJtX2RlZmF1bHRzKCk7CS8qIHVzZSBjdXJyZW50IHZhbHVlcyBhcyBkZWZhdWx0cyAqLwojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKICAgIGNydl9zdGF0dXMgPSBDUlZfR0VUOwkvKiBHZXQgdGVybWluYWwgdmVyc2lvbiBsYXRlciAqLwojZW5kaWYKCiAgICAvKgogICAgICogSW5pdGlhbGl6ZSB0aGUgdGVybWluYWwgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdGVybWNhcCBjb2Rlcy4KICAgICAqIFNldCB0aGUgbW91c2UgYW5kIHdpbmRvdyB0aXRsZSBpZiBwb3NzaWJsZS4KICAgICAqIERvbid0IGRvIHRoaXMgd2hlbiBzdGFydGluZywgbmVlZCB0byBwYXJzZSB0aGUgLnZpbXJjIGZpcnN0LCBiZWNhdXNlIGl0CiAgICAgKiBtYXkgcmVkZWZpbmUgdF9USSBldGMuCiAgICAgKi8KICAgIGlmIChzdGFydGluZyAhPSBOT19TQ1JFRU4pCiAgICB7CglzdGFydHRlcm1jYXAoKTsJCS8qIG1heSBjaGFuZ2UgdGVybWluYWwgbW9kZSAqLwojaWZkZWYgRkVBVF9NT1VTRQoJc2V0bW91c2UoKTsJCS8qIG1heSBzdGFydCB1c2luZyB0aGUgbW91c2UgKi8KI2VuZGlmCiNpZmRlZiBGRUFUX1RJVExFCgltYWtldGl0bGUoKTsJCS8qIG1heSBkaXNwbGF5IHdpbmRvdyB0aXRsZSAqLwojZW5kaWYKICAgIH0KCgkvKiBkaXNwbGF5IGluaXRpYWwgc2NyZWVuIGFmdGVyIHR0ZXN0KCkgY2hlY2tpbmcuIGp3LiAqLwogICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCiAgICB7CgkvKiB0ZXJtY2FwIGZhaWxlZCB0byByZXBvcnQgc2l6ZSAqLwoJLyogc2V0IGRlZmF1bHRzLCBpbiBjYXNlIHVpX2dldF9zaGVsbHNpemUoKSBhbHNvIGZhaWxzICovCgl3aWR0aCA9IDgwOwojaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQoJaGVpZ2h0ID0gMjU7CSAgICAvKiBjb25zb2xlIGlzIG9mdGVuIDI1IGxpbmVzICovCiNlbHNlCgloZWlnaHQgPSAyNDsJICAgIC8qIG1vc3QgdGVybWluYWxzIGFyZSAyNCBsaW5lcyAqLwojZW5kaWYKICAgIH0KICAgIHNldF9zaGVsbHNpemUod2lkdGgsIGhlaWdodCwgRkFMU0UpOwkvKiBtYXkgY2hhbmdlIFJvd3MgKi8KICAgIGlmIChzdGFydGluZyAhPSBOT19TQ1JFRU4pCiAgICB7CglpZiAoc2Nyb2xsX3JlZ2lvbikKCSAgICBzY3JvbGxfcmVnaW9uX3Jlc2V0KCk7CQkvKiBJbiBjYXNlIFJvd3MgY2hhbmdlZCAqLwoJY2hlY2tfbWFwX2tleWNvZGVzKCk7CS8qIGNoZWNrIG1hcHBpbmdzIGZvciB0ZXJtaW5hbCBjb2RlcyB1c2VkICovCgojaWZkZWYgRkVBVF9BVVRPQ01ECgl7CgkgICAgYnVmX1QJKm9sZF9jdXJidWY7CgoJICAgIC8qCgkgICAgICogRXhlY3V0ZSB0aGUgVGVybUNoYW5nZWQgYXV0b2NvbW1hbmRzIGZvciBlYWNoIGJ1ZmZlciB0aGF0IGlzCgkgICAgICogbG9hZGVkLgoJICAgICAqLwoJICAgIG9sZF9jdXJidWYgPSBjdXJidWY7CgkgICAgZm9yIChjdXJidWYgPSBmaXJzdGJ1ZjsgY3VyYnVmICE9IE5VTEw7IGN1cmJ1ZiA9IGN1cmJ1Zi0+Yl9uZXh0KQoJICAgIHsKCQlpZiAoY3VyYnVmLT5iX21sLm1sX21mcCAhPSBOVUxMKQoJCSAgICBhcHBseV9hdXRvY21kcyhFVkVOVF9URVJNQ0hBTkdFRCwgTlVMTCwgTlVMTCwgRkFMU0UsCgkJCQkJCQkJICAgICAgY3VyYnVmKTsKCSAgICB9CgkgICAgaWYgKGJ1Zl92YWxpZChvbGRfY3VyYnVmKSkKCQljdXJidWYgPSBvbGRfY3VyYnVmOwoJfQojZW5kaWYKICAgIH0KCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQogICAgbWF5X3JlcV90ZXJtcmVzcG9uc2UoKTsKI2VuZGlmCgogICAgcmV0dXJuIE9LOwp9CgojaWYgZGVmaW5lZChGRUFUX01PVVNFKSB8fCBkZWZpbmVkKFBST1RPKQoKIyBpZmRlZiBGRUFUX01PVVNFX1RUWQojICBkZWZpbmUgSE1UX05PUk1BTAkxCiMgIGRlZmluZSBITVRfTkVUVEVSTQkyCiMgIGRlZmluZSBITVRfREVDCTQKIyAgZGVmaW5lIEhNVF9KU0JURVJNCTgKIyAgZGVmaW5lIEhNVF9QVEVSTQkxNgpzdGF0aWMgaW50IGhhc19tb3VzZV90ZXJtY29kZSA9IDA7CiMgZW5kaWYKCiMgaWYgKCFkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9YVEVSTSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX05FVCkgXAoJfHwgZGVmaW5lZChGRUFUX01PVVNFX0RFQykpIHx8IGRlZmluZWQoRkVBVF9NT1VTRV9KU0IpIFwKCXx8IGRlZmluZWQoRkVBVF9NT1VTRV9QVEVSTSkgfHwgZGVmaW5lZChQUk9UTykKICAgIHZvaWQKc2V0X21vdXNlX3Rlcm1jb2RlKG4sIHMpCiAgICBpbnQJCW47CS8qIEtTX01PVVNFLCBLU19ORVRURVJNX01PVVNFIG9yIEtTX0RFQ19NT1VTRSAqLwogICAgY2hhcl91CSpzOwp7CiAgICBjaGFyX3UJbmFtZVsyXTsKCiAgICBuYW1lWzBdID0gbjsKICAgIG5hbWVbMV0gPSBLRV9GSUxMRVI7CiAgICBhZGRfdGVybWNvZGUobmFtZSwgcywgRkFMU0UpOwojICBpZmRlZiBGRUFUX01PVVNFX1RUWQojICAgaWZkZWYgRkVBVF9NT1VTRV9KU0IKICAgIGlmIChuID09IEtTX0pTQlRFUk1fTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX0pTQlRFUk07CiAgICBlbHNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9ORVQKICAgIGlmIChuID09IEtTX05FVFRFUk1fTU9VU0UpCgloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX05FVFRFUk07CiAgICBlbHNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9ERUMKICAgIGlmIChuID09IEtTX0RFQ19NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSB8PSBITVRfREVDOwogICAgZWxzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfUFRFUk0KICAgIGlmIChuID09IEtTX1BURVJNX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlIHw9IEhNVF9QVEVSTTsKICAgIGVsc2UKIyAgIGVuZGlmCgloYXNfbW91c2VfdGVybWNvZGUgfD0gSE1UX05PUk1BTDsKIyAgZW5kaWYKfQojIGVuZGlmCgojIGlmICgoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChPUzIpKSBcCgkmJiAoZGVmaW5lZChGRUFUX01PVVNFX1hURVJNKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfREVDKSBcCgkgICAgfHwgZGVmaW5lZChGRUFUX01PVVNFX0dQTSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX1BURVJNKSkpIFwKCSAgICB8fCBkZWZpbmVkKFBST1RPKQogICAgdm9pZApkZWxfbW91c2VfdGVybWNvZGUobikKICAgIGludAkJbjsJLyogS1NfTU9VU0UsIEtTX05FVFRFUk1fTU9VU0Ugb3IgS1NfREVDX01PVVNFICovCnsKICAgIGNoYXJfdQluYW1lWzJdOwoKICAgIG5hbWVbMF0gPSBuOwogICAgbmFtZVsxXSA9IEtFX0ZJTExFUjsKICAgIGRlbF90ZXJtY29kZShuYW1lKTsKIyAgaWZkZWYgRkVBVF9NT1VTRV9UVFkKIyAgIGlmZGVmIEZFQVRfTU9VU0VfSlNCCiAgICBpZiAobiA9PSBLU19KU0JURVJNX01PVVNFKQoJaGFzX21vdXNlX3Rlcm1jb2RlICY9IH5ITVRfSlNCVEVSTTsKICAgIGVsc2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX05FVAogICAgaWYgKG4gPT0gS1NfTkVUVEVSTV9NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX05FVFRFUk07CiAgICBlbHNlCiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9NT1VTRV9ERUMKICAgIGlmIChuID09IEtTX0RFQ19NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX0RFQzsKICAgIGVsc2UKIyAgIGVuZGlmCiMgICBpZmRlZiBGRUFUX01PVVNFX1BURVJNCiAgICBpZiAobiA9PSBLU19QVEVSTV9NT1VTRSkKCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX1BURVJNOwogICAgZWxzZQojICAgZW5kaWYKCWhhc19tb3VzZV90ZXJtY29kZSAmPSB+SE1UX05PUk1BTDsKIyAgZW5kaWYKfQojIGVuZGlmCiNlbmRpZgoKI2lmZGVmIEhBVkVfVEdFVEVOVAovKgogKiBDYWxsIHRnZXRlbnQoKQogKiBSZXR1cm4gZXJyb3IgbWVzc2FnZSBpZiBpdCBmYWlscywgTlVMTCBpZiBpdCdzIE9LLgogKi8KICAgIHN0YXRpYyBjaGFyX3UgKgp0Z2V0ZW50X2Vycm9yKHRidWYsIHRlcm0pCiAgICBjaGFyX3UgICp0YnVmOwogICAgY2hhcl91ICAqdGVybTsKewogICAgaW50CSAgICBpOwoKICAgIGkgPSBUR0VURU5UKHRidWYsIHRlcm0pOwogICAgaWYgKGkgPCAwCQkgICAgLyogLTEgaXMgYWx3YXlzIGFuIGVycm9yICovCiMgaWZkZWYgVEdFVEVOVF9aRVJPX0VSUgoJICAgIHx8IGkgPT0gMAkgICAgLyogc29tZXRpbWVzIHplcm8gaXMgYWxzbyBhbiBlcnJvciAqLwojIGVuZGlmCiAgICAgICApCiAgICB7CgkvKiBPbiBGcmVlQlNEIHRwdXRzKCkgZ2V0cyBhIFNFR1YgYWZ0ZXIgYSB0Z2V0ZW50KCkgd2hpY2ggZmFpbHMuICBDYWxsCgkgKiB0Z2V0ZW50KCkgd2l0aCB0aGUgYWx3YXlzIGV4aXN0aW5nICJkdW1iIiBlbnRyeSB0byBhdm9pZCBhIGNyYXNoIG9yCgkgKiBoYW5nLiAqLwoJKHZvaWQpVEdFVEVOVCh0YnVmLCAiZHVtYiIpOwoKCWlmIChpIDwgMCkKIyBpZmRlZiBUR0VURU5UX1pFUk9fRVJSCgkgICAgcmV0dXJuIChjaGFyX3UgKilfKCJFNTU3OiBDYW5ub3Qgb3BlbiB0ZXJtY2FwIGZpbGUiKTsKCWlmIChpID09IDApCiMgZW5kaWYKI2lmZGVmIFRFUk1JTkZPCgkgICAgcmV0dXJuIChjaGFyX3UgKilfKCJFNTU4OiBUZXJtaW5hbCBlbnRyeSBub3QgZm91bmQgaW4gdGVybWluZm8iKTsKI2Vsc2UKCSAgICByZXR1cm4gKGNoYXJfdSAqKV8oIkU1NTk6IFRlcm1pbmFsIGVudHJ5IG5vdCBmb3VuZCBpbiB0ZXJtY2FwIik7CiNlbmRpZgogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIFNvbWUgdmVyc2lvbnMgb2YgdGdldHN0cigpIGhhdmUgYmVlbiByZXBvcnRlZCB0byByZXR1cm4gLTEgaW5zdGVhZCBvZiBOVUxMLgogKiBGaXggdGhhdCBoZXJlLgogKi8KICAgIHN0YXRpYyBjaGFyX3UgKgp2aW1fdGdldHN0cihzLCBwcCkKICAgIGNoYXIJKnM7CiAgICBjaGFyX3UJKipwcDsKewogICAgY2hhcgkqcDsKCiAgICBwID0gdGdldHN0cihzLCAoY2hhciAqKilwcCk7CiAgICBpZiAocCA9PSAoY2hhciAqKS0xKQoJcCA9IE5VTEw7CiAgICByZXR1cm4gKGNoYXJfdSAqKXA7Cn0KI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLwoKI2lmIGRlZmluZWQoSEFWRV9UR0VURU5UKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKF9fRU1YX18pIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE1BQ09TX1gpKQovKgogKiBHZXQgQ29sdW1ucyBhbmQgUm93cyBmcm9tIHRoZSB0ZXJtY2FwLiBVc2VkIGFmdGVyIGEgd2luZG93IHNpZ25hbCBpZiB0aGUKICogaW9jdGwoKSBmYWlscy4gSXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGNhbGwgdGdldGVudCBlYWNoIHRpbWUgaWYgdGhlICJjbyIKICogYW5kICJsaSIgZW50cmllcyBuZXZlciBjaGFuZ2UuIEJ1dCBvbiBzb21lIHN5c3RlbXMgdGhpcyB3b3Jrcy4KICogRXJyb3JzIHdoaWxlIGdldHRpbmcgdGhlIGVudHJpZXMgYXJlIGlnbm9yZWQuCiAqLwogICAgdm9pZApnZXRsaW5lY29sKGNwLCBycCkKICAgIGxvbmcJKmNwOwkvKiBwb2ludGVyIHRvIGNvbHVtbnMgKi8KICAgIGxvbmcJKnJwOwkvKiBwb2ludGVyIHRvIHJvd3MgKi8KewogICAgY2hhcl91CXRidWZbVEJVRlNaXTsKCiAgICBpZiAoVF9OQU1FICE9IE5VTEwgJiYgKlRfTkFNRSAhPSBOVUwgJiYgdGdldGVudF9lcnJvcih0YnVmLCBUX05BTUUpID09IE5VTEwpCiAgICB7CglpZiAoKmNwID09IDApCgkgICAgKmNwID0gdGdldG51bSgiY28iKTsKCWlmICgqcnAgPT0gMCkKCSAgICAqcnAgPSB0Z2V0bnVtKCJsaSIpOwogICAgfQp9CiNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfVEdFVEVOVCkgJiYgZGVmaW5lZChVTklYKSAqLwoKLyoKICogR2V0IGEgc3RyaW5nIGVudHJ5IGZyb20gdGhlIHRlcm1jYXAgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiB0ZXJtY29kZXMuCiAqIFVzZWQgZm9yIDx0X3h4PiBzcGVjaWFsIGtleXMuCiAqIEdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZmFpbHVyZSB3aGVuIG5vdCBzb3VyY2luZy4KICogSWYgZm9yY2UgZ2l2ZW4sIHJlcGxhY2UgYW4gZXhpc3RpbmcgZW50cnkuCiAqIFJldHVybiBGQUlMIGlmIHRoZSBlbnRyeSB3YXMgbm90IGZvdW5kLCBPSyBpZiB0aGUgZW50cnkgd2FzIGFkZGVkLgogKi8KICAgIGludAphZGRfdGVybWNhcF9lbnRyeShuYW1lLCBmb3JjZSkKICAgIGNoYXJfdSAgKm5hbWU7CiAgICBpbnQJICAgIGZvcmNlOwp7CiAgICBjaGFyX3UgICp0ZXJtOwogICAgaW50CSAgICBrZXk7CiAgICBzdHJ1Y3QgYnVpbHRpbl90ZXJtICp0ZXJtcDsKI2lmZGVmIEhBVkVfVEdFVEVOVAogICAgY2hhcl91ICAqc3RyaW5nOwogICAgaW50CSAgICBpOwogICAgaW50CSAgICBidWlsdGluX2ZpcnN0OwogICAgY2hhcl91ICB0YnVmW1RCVUZTWl07CiAgICBjaGFyX3UgIHRzdHJidWZbVEJVRlNaXTsKICAgIGNoYXJfdSAgKnRwID0gdHN0cmJ1ZjsKICAgIGNoYXJfdSAgKmVycm9yX21zZyA9IE5VTEw7CiNlbmRpZgoKLyoKICogSWYgdGhlIEdVSSBpcyBydW5uaW5nIG9yIHdpbGwgc3RhcnQgaW4gYSBtb21lbnQsIHdlIG9ubHkgc3VwcG9ydCB0aGUga2V5cwogKiB0aGF0IHRoZSBHVUkgY2FuIHByb2R1Y2UuCiAqLwojaWZkZWYgRkVBVF9HVUkKICAgIGlmIChndWkuaW5fdXNlIHx8IGd1aS5zdGFydGluZykKCXJldHVybiBndWlfbWNoX2hhc2tleShuYW1lKTsKI2VuZGlmCgogICAgaWYgKCFmb3JjZSAmJiBmaW5kX3Rlcm1jb2RlKG5hbWUpICE9IE5VTEwpCSAgICAvKiBpdCdzIGFscmVhZHkgdGhlcmUgKi8KCXJldHVybiBPSzsKCiAgICB0ZXJtID0gVF9OQU1FOwogICAgaWYgKHRlcm0gPT0gTlVMTCB8fCAqdGVybSA9PSBOVUwpCSAgICAvKiAndGVybScgbm90IGRlZmluZWQgeWV0ICovCglyZXR1cm4gRkFJTDsKCiAgICBpZiAodGVybV9pc19idWlsdGluKHRlcm0pKQkJICAgIC8qIG5hbWUgc3RhcnRzIHdpdGggImJ1aWx0aW5fIiAqLwogICAgewoJdGVybSArPSA4OwojaWZkZWYgSEFWRV9UR0VURU5UCglidWlsdGluX2ZpcnN0ID0gVFJVRTsKI2VuZGlmCiAgICB9CiNpZmRlZiBIQVZFX1RHRVRFTlQKICAgIGVsc2UKCWJ1aWx0aW5fZmlyc3QgPSBwX3RiaTsKI2VuZGlmCgojaWZkZWYgSEFWRV9UR0VURU5UCi8qCiAqIFdlIGNhbiBnZXQgdGhlIGVudHJ5IGZyb20gdGhlIGJ1aWx0aW4gdGVybWNhcCBhbmQgZnJvbSB0aGUgZXh0ZXJuYWwgb25lLgogKiBJZiAndHR5YnVpbHRpbicgaXMgb24gb3IgdGhlIHRlcm1pbmFsIG5hbWUgc3RhcnRzIHdpdGggImJ1aWx0aW5fIiwgdHJ5CiAqIGJ1aWx0aW4gdGVybWNhcCBmaXJzdC4KICogSWYgJ3R0eWJ1aWx0aW4nIGlzIG9mZiwgdHJ5IGV4dGVybmFsIHRlcm1jYXAgZmlyc3QuCiAqLwogICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkKICAgIHsKCWlmICghYnVpbHRpbl9maXJzdCA9PSBpKQojZW5kaWYKCS8qCgkgKiBTZWFyY2ggaW4gYnVpbHRpbiB0ZXJtY2FwCgkgKi8KCXsKCSAgICB0ZXJtcCA9IGZpbmRfYnVpbHRpbl90ZXJtKHRlcm0pOwoJICAgIGlmICh0ZXJtcC0+YnRfc3RyaW5nICE9IE5VTEwpCS8qIGZvdW5kIGl0ICovCgkgICAgewoJCWtleSA9IFRFUk1DQVAyS0VZKG5hbWVbMF0sIG5hbWVbMV0pOwoJCXdoaWxlICh0ZXJtcC0+YnRfZW50cnkgIT0gKGludClLU19OQU1FKQoJCXsKCQkgICAgaWYgKChpbnQpdGVybXAtPmJ0X2VudHJ5ID09IGtleSkKCQkgICAgewoJCQlhZGRfdGVybWNvZGUobmFtZSwgKGNoYXJfdSAqKXRlcm1wLT5idF9zdHJpbmcsCgkJCQkJCQkgIHRlcm1faXNfOGJpdCh0ZXJtKSk7CgkJCXJldHVybiBPSzsKCQkgICAgfQoJCSAgICArK3Rlcm1wOwoJCX0KCSAgICB9Cgl9CiNpZmRlZiBIQVZFX1RHRVRFTlQKCWVsc2UKCS8qCgkgKiBTZWFyY2ggaW4gZXh0ZXJuYWwgdGVybWNhcAoJICovCgl7CgkgICAgZXJyb3JfbXNnID0gdGdldGVudF9lcnJvcih0YnVmLCB0ZXJtKTsKCSAgICBpZiAoZXJyb3JfbXNnID09IE5VTEwpCgkgICAgewoJCXN0cmluZyA9IFRHRVRTVFIoKGNoYXIgKiluYW1lLCAmdHApOwoJCWlmIChzdHJpbmcgIT0gTlVMTCAmJiAqc3RyaW5nICE9IE5VTCkKCQl7CgkJICAgIGFkZF90ZXJtY29kZShuYW1lLCBzdHJpbmcsIEZBTFNFKTsKCQkgICAgcmV0dXJuIE9LOwoJCX0KCSAgICB9Cgl9CiAgICB9CiNlbmRpZgoKICAgIGlmIChzb3VyY2luZ19uYW1lID09IE5VTEwpCiAgICB7CiNpZmRlZiBIQVZFX1RHRVRFTlQKCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKCSAgICBFTVNHKGVycm9yX21zZyk7CgllbHNlCiNlbmRpZgoJICAgIEVNU0cyKF8oIkU0MzY6IE5vIFwiJXNcIiBlbnRyeSBpbiB0ZXJtY2FwIiksIG5hbWUpOwogICAgfQogICAgcmV0dXJuIEZBSUw7Cn0KCiAgICBzdGF0aWMgaW50CnRlcm1faXNfYnVpbHRpbihuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgcmV0dXJuIChTVFJOQ01QKG5hbWUsICJidWlsdGluXyIsIChzaXplX3QpOCkgPT0gMCk7Cn0KCi8qCiAqIFJldHVybiBUUlVFIGlmIHRlcm1pbmFsICJuYW1lIiB1c2VzIENTSSBpbnN0ZWFkIG9mIDxFc2M+Wy4KICogQXNzdW1lIHRoYXQgdGhlIHRlcm1pbmFsIGlzIHVzaW5nIDgtYml0IGNvbnRyb2xzIHdoZW4gdGhlIG5hbWUgY29udGFpbnMKICogIjhiaXQiLCBsaWtlIGluICJ4dGVybS04Yml0Ii4KICovCiAgICBpbnQKdGVybV9pc184Yml0KG5hbWUpCiAgICBjaGFyX3UgICpuYW1lOwp7CiAgICByZXR1cm4gKGRldGVjdGVkXzhiaXQgfHwgc3Ryc3RyKChjaGFyICopbmFtZSwgIjhiaXQiKSAhPSBOVUxMKTsKfQoKLyoKICogVHJhbnNsYXRlIHRlcm1pbmFsIGNvbnRyb2wgY2hhcnMgZnJvbSA3LWJpdCB0byA4LWJpdDoKICogPEVzYz5bIC0+IENTSQogKiA8RXNjPl0gLT4gPE0tQy1dPgogKiA8RXNjPk8gLT4gPE0tQy1PPgogKi8KICAgIHN0YXRpYyBpbnQKdGVybV83dG84Yml0KHApCiAgICBjaGFyX3UgICpwOwp7CiAgICBpZiAoKnAgPT0gRVNDKQogICAgewoJaWYgKHBbMV0gPT0gJ1snKQoJICAgIHJldHVybiBDU0k7CglpZiAocFsxXSA9PSAnXScpCgkgICAgcmV0dXJuIDB4OWQ7CglpZiAocFsxXSA9PSAnTycpCgkgICAgcmV0dXJuIDB4OGY7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKI2lmZGVmIEZFQVRfR1VJCiAgICBpbnQKdGVybV9pc19ndWkobmFtZSkKICAgIGNoYXJfdSAgKm5hbWU7CnsKICAgIHJldHVybiAoU1RSQ01QKG5hbWUsICJidWlsdGluX2d1aSIpID09IDAgfHwgU1RSQ01QKG5hbWUsICJndWkiKSA9PSAwKTsKfQojZW5kaWYKCiNpZiAhZGVmaW5lZChIQVZFX1RHRVRFTlQpIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoUFJPVE8pCgogICAgY2hhcl91ICoKdGx0b2EoaSkKICAgIHVuc2lnbmVkIGxvbmcgaTsKewogICAgc3RhdGljIGNoYXJfdSBidWZbMTZdOwogICAgY2hhcl91CSpwOwoKICAgIHAgPSBidWYgKyAxNTsKICAgICpwID0gJ1wwJzsKICAgIGRvCiAgICB7CgktLXA7CgkqcCA9IChjaGFyX3UpIChpICUgMTAgKyAnMCcpOwoJaSAvPSAxMDsKICAgIH0KICAgIHdoaWxlIChpID4gMCAmJiBwID4gYnVmKTsKICAgIHJldHVybiBwOwp9CiNlbmRpZgoKI2lmbmRlZiBIQVZFX1RHRVRFTlQKCi8qCiAqIG1pbmltYWwgdGdvdG8oKSBpbXBsZW1lbnRhdGlvbi4KICogbm8gcGFkZGluZyBhbmQgd2Ugb25seSBwYXJzZSBmb3IgJWkgJWQgYW5kICUrY2hhcgogKi8Kc3RhdGljIGNoYXIgKnRnb3RvIF9fQVJHUygoY2hhciAqLCBpbnQsIGludCkpOwoKICAgIHN0YXRpYyBjaGFyICoKdGdvdG8oY20sIHgsIHkpCiAgICBjaGFyICpjbTsKICAgIGludCB4LCB5Owp7CiAgICBzdGF0aWMgY2hhciBidWZbMzBdOwogICAgY2hhciAqcCwgKnMsICplOwoKICAgIGlmICghY20pCglyZXR1cm4gIk9PUFMiOwogICAgZSA9IGJ1ZiArIDI5OwogICAgZm9yIChzID0gYnVmOyBzIDwgZSAmJiAqY207IGNtKyspCiAgICB7CglpZiAoKmNtICE9ICclJykKCXsKCSAgICAqcysrID0gKmNtOwoJICAgIGNvbnRpbnVlOwoJfQoJc3dpdGNoICgqKytjbSkKCXsKCWNhc2UgJ2QnOgoJICAgIHAgPSAoY2hhciAqKXRsdG9hKCh1bnNpZ25lZCBsb25nKXkpOwoJICAgIHkgPSB4OwoJICAgIHdoaWxlICgqcCkKCQkqcysrID0gKnArKzsKCSAgICBicmVhazsKCWNhc2UgJ2knOgoJICAgIHgrKzsKCSAgICB5Kys7CgkgICAgYnJlYWs7CgljYXNlICcrJzoKCSAgICAqcysrID0gKGNoYXIpKCorK2NtICsgeSk7CgkgICAgeSA9IHg7CgkgICAgYnJlYWs7CgljYXNlICclJzoKCSAgICAqcysrID0gKmNtOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICByZXR1cm4gIk9PUFMiOwoJfQogICAgfQogICAgKnMgPSAnXDAnOwogICAgcmV0dXJuIGJ1ZjsKfQoKI2VuZGlmIC8qIEhBVkVfVEdFVEVOVCAqLwoKLyoKICogU2V0IHRoZSB0ZXJtaW5hbCBuYW1lIGFuZCBpbml0aWFsaXplIHRoZSB0ZXJtaW5hbCBvcHRpb25zLgogKiBJZiAibmFtZSIgaXMgTlVMTCBvciBlbXB0eSwgZ2V0IHRoZSB0ZXJtaW5hbCBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50LgogKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGRlZmF1bHQgdGVybWluYWwgbmFtZS4KICovCiAgICB2b2lkCnRlcm1jYXBpbml0KG5hbWUpCiAgICBjaGFyX3UgKm5hbWU7CnsKICAgIGNoYXJfdQkqdGVybTsKCiAgICBpZiAobmFtZSAhPSBOVUxMICYmICpuYW1lID09IE5VTCkKCW5hbWUgPSBOVUxMOwkgICAgLyogZW1wdHkgbmFtZSBpcyBlcXVhbCB0byBubyBuYW1lICovCiAgICB0ZXJtID0gbmFtZTsKCiNpZmRlZiBfX0JFT1NfXwogICAgLyoKICAgICAqIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm9ybWFsbHkgc2V0IHRvICdhbnNpJyBvbiB0aGUgQmVib3g7CiAgICAgKiBTaW5jZSB0aGUgQmVCb3ggZG9lc24ndCBxdWl0ZSBzdXBwb3J0IGZ1bGwgQU5TSSB5ZXQsIHdlIHVzZSBvdXIKICAgICAqIG93biBjdXN0b20gJ2Fuc2ktYmVvcycgdGVybWNhcCBpbnN0ZWFkLCB1bmxlc3MgdGhlIC1UIG9wdGlvbiBoYXMKICAgICAqIGJlZW4gZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAqLwogICAgaWYgKHRlcm0gPT0gTlVMTAoJCSAmJiBzdHJjbXAoKGNoYXIgKiltY2hfZ2V0ZW52KChjaGFyX3UgKikiVEVSTSIpLCAiYW5zaSIpID09IDApCgl0ZXJtID0gREVGQVVMVF9URVJNOwojZW5kaWYKI2lmbmRlZiBNU1dJTgogICAgaWYgKHRlcm0gPT0gTlVMTCkKCXRlcm0gPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiVEVSTSIpOwojZW5kaWYKICAgIGlmICh0ZXJtID09IE5VTEwgfHwgKnRlcm0gPT0gTlVMKQoJdGVybSA9IERFRkFVTFRfVEVSTTsKICAgIHNldF9zdHJpbmdfb3B0aW9uX2RpcmVjdCgoY2hhcl91ICopInRlcm0iLCAtMSwgdGVybSwgT1BUX0ZSRUUsIDApOwoKICAgIC8qIFNldCB0aGUgZGVmYXVsdCB0ZXJtaW5hbCBuYW1lLiAqLwogICAgc2V0X3N0cmluZ19kZWZhdWx0KCJ0ZXJtIiwgdGVybSk7CiAgICBzZXRfc3RyaW5nX2RlZmF1bHQoInR0eXR5cGUiLCB0ZXJtKTsKCiAgICAvKgogICAgICogQXZvaWQgdXNpbmcgInRlcm0iIGhlcmUsIGJlY2F1c2UgdGhlIG5leHQgbWNoX2dldGVudigpIG1heSBvdmVyd3JpdGUgaXQuCiAgICAgKi8KICAgIHNldF90ZXJtbmFtZShUX05BTUUgIT0gTlVMTCA/IFRfTkFNRSA6IHRlcm0pOwp9CgovKgogKiB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHVpX3dyaXRlIGlzIHJlZHVjZWQgYnkgdXNpbmcgdGhlIGJ1ZmZlciAib3V0X2J1ZiIKICovCiNpZmRlZiBET1MxNgojIGRlZmluZSBPVVRfU0laRQkyNTUJCS8qIG9ubHkgaGF2ZSA2NDBLIHRvdGFsLi4uICovCiNlbHNlCiMgaWZkZWYgRkVBVF9HVUlfVzE2CiMgIGRlZmluZSBPVVRfU0laRQkxMDIzCQkvKiBTYXZlIHByZWNpb3VzIDFLIG5lYXIgZGF0YSAqLwojIGVsc2UKIyAgZGVmaW5lIE9VVF9TSVpFCTIwNDcKIyBlbmRpZgojZW5kaWYKCSAgICAvKiBBZGQgb25lIHRvIGFsbG93IG1jaF93cml0ZSgpIGluIG9zX3dpbjMyLmMgdG8gYXBwZW5kIGEgTlVMICovCnN0YXRpYyBjaGFyX3UJCW91dF9idWZbT1VUX1NJWkUgKyAxXTsKc3RhdGljIGludAkJb3V0X3BvcyA9IDA7CS8qIG51bWJlciBvZiBjaGFycyBpbiBvdXRfYnVmICovCgovKgogKiBvdXRfZmx1c2goKTogZmx1c2ggdGhlIG91dHB1dCBidWZmZXIKICovCiAgICB2b2lkCm91dF9mbHVzaCgpCnsKICAgIGludAkgICAgbGVuOwoKICAgIGlmIChvdXRfcG9zICE9IDApCiAgICB7CgkvKiBzZXQgb3V0X3BvcyB0byAwIGJlZm9yZSB1aV93cml0ZSwgdG8gYXZvaWQgcmVjdXJzaXZlbmVzcyAqLwoJbGVuID0gb3V0X3BvczsKCW91dF9wb3MgPSAwOwoJdWlfd3JpdGUob3V0X2J1ZiwgbGVuKTsKICAgIH0KfQoKI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogU29tZXRpbWVzIGEgYnl0ZSBvdXQgb2YgYSBtdWx0aS1ieXRlIGNoYXJhY3RlciBpcyB3cml0dGVuIHdpdGggb3V0X2NoYXIoKS4KICogVG8gYXZvaWQgZmx1c2hpbmcgaGFsZiBvZiB0aGUgY2hhcmFjdGVyLCBjYWxsIHRoaXMgZnVuY3Rpb24gZmlyc3QuCiAqLwogICAgdm9pZApvdXRfZmx1c2hfY2hlY2soKQp7CiAgICBpZiAoZW5jX2RiY3MgIT0gMCAmJiBvdXRfcG9zID49IE9VVF9TSVpFIC0gTUJfTUFYQllURVMpCglvdXRfZmx1c2goKTsKfQojZW5kaWYKCiNpZmRlZiBGRUFUX0dVSQovKgogKiBvdXRfdHJhc2goKTogVGhyb3cgYXdheSB0aGUgY29udGVudHMgb2YgdGhlIG91dHB1dCBidWZmZXIKICovCiAgICB2b2lkCm91dF90cmFzaCgpCnsKICAgIG91dF9wb3MgPSAwOwp9CiNlbmRpZgoKLyoKICogb3V0X2NoYXIoYyk6IHB1dCBhIGJ5dGUgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KICoJCUZsdXNoIGl0IGlmIGl0IGJlY29tZXMgZnVsbC4KICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIG91dHB1dHRpbmcgdGV4dCBvbiB0aGUgc2NyZWVuICh1c2UgZnVuY3Rpb25zCiAqIGxpa2UgbXNnX3B1dHMoKSBhbmQgc2NyZWVuX3B1dGNoYXIoKSBmb3IgdGhhdCkuCiAqLwogICAgdm9pZApvdXRfY2hhcihjKQogICAgdW5zaWduZWQJYzsKewojaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChBTUlHQSkgfHwgZGVmaW5lZChNQUNPU19YX1VOSVgpCiAgICBpZiAoYyA9PSAnXG4nKQkvKiB0dXJuIExGIGludG8gQ1ItTEYgKENSTU9EIGRvZXNuJ3Qgc2VlbSB0byBkbyB0aGlzKSAqLwoJb3V0X2NoYXIoJ1xyJyk7CiNlbmRpZgoKICAgIG91dF9idWZbb3V0X3BvcysrXSA9IGM7CgogICAgLyogRm9yIHRlc3Rpbmcgd2UgZmx1c2ggZWFjaCB0aW1lLiAqLwogICAgaWYgKG91dF9wb3MgPj0gT1VUX1NJWkUgfHwgcF93ZCkKCW91dF9mbHVzaCgpOwp9CgpzdGF0aWMgdm9pZCBvdXRfY2hhcl9uZiBfX0FSR1MoKHVuc2lnbmVkKSk7CgovKgogKiBvdXRfY2hhcl9uZihjKTogbGlrZSBvdXRfY2hhcigpLCBidXQgZG9uJ3QgZmx1c2ggd2hlbiBwX3dkIGlzIHNldAogKi8KICAgIHN0YXRpYyB2b2lkCm91dF9jaGFyX25mKGMpCiAgICB1bnNpZ25lZAljOwp7CiNpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKE1BQ09TX1hfVU5JWCkKICAgIGlmIChjID09ICdcbicpCS8qIHR1cm4gTEYgaW50byBDUi1MRiAoQ1JNT0QgZG9lc24ndCBzZWVtIHRvIGRvIHRoaXMpICovCglvdXRfY2hhcl9uZignXHInKTsKI2VuZGlmCgogICAgb3V0X2J1ZltvdXRfcG9zKytdID0gYzsKCiAgICBpZiAob3V0X3BvcyA+PSBPVVRfU0laRSkKCW91dF9mbHVzaCgpOwp9CgovKgogKiBBIG5ldmVyLXBhZGRpbmcgb3V0X3N0ci4KICogdXNlIHRoaXMgd2hlbmV2ZXIgeW91IGRvbid0IHdhbnQgdG8gcnVuIHRoZSBzdHJpbmcgdGhyb3VnaCB0cHV0cy4KICogdHB1dHMgYWJvdmUgaXMgaGFybWxlc3MsIGJ1dCB0cHV0cyBmcm9tIHRoZSB0ZXJtY2FwIGxpYnJhcnkKICogaXMgbGlrZWx5IHRvIHN0cmlwIG9mZiBsZWFkaW5nIGRpZ2l0cywgdGhhdCBpdCBtaXN0YWtlcyBmb3IgcGFkZGluZwogKiBpbmZvcm1hdGlvbiwgYW5kICIlaSIsICIlZCIsIGV0Yy4KICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB3cml0aW5nIHRlcm1pbmFsIGNvZGVzLCBub3QgZm9yIG91dHB1dHRpbmcKICogbm9ybWFsIHRleHQgKHVzZSBmdW5jdGlvbnMgbGlrZSBtc2dfcHV0cygpIGFuZCBzY3JlZW5fcHV0Y2hhcigpIGZvciB0aGF0KS4KICovCiAgICB2b2lkCm91dF9zdHJfbmYocykKICAgIGNoYXJfdSAqczsKewogICAgaWYgKG91dF9wb3MgPiBPVVRfU0laRSAtIDIwKSAgLyogYXZvaWQgdGVybWluYWwgc3RyaW5ncyBiZWluZyBzcGxpdCB1cCAqLwoJb3V0X2ZsdXNoKCk7CiAgICB3aGlsZSAoKnMpCglvdXRfY2hhcl9uZigqcysrKTsKCiAgICAvKiBGb3IgdGVzdGluZyB3ZSB3cml0ZSBvbmUgc3RyaW5nIGF0IGEgdGltZS4gKi8KICAgIGlmIChwX3dkKQoJb3V0X2ZsdXNoKCk7Cn0KCi8qCiAqIG91dF9zdHIocyk6IFB1dCBhIGNoYXJhY3RlciBzdHJpbmcgYSBieXRlIGF0IGEgdGltZSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgogKiBJZiBIQVZFX1RHRVRFTlQgaXMgZGVmaW5lZCB1c2UgdGhlIHRlcm1jYXAgcGFyc2VyLiAoancpCiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igd3JpdGluZyB0ZXJtaW5hbCBjb2Rlcywgbm90IGZvciBvdXRwdXR0aW5nCiAqIG5vcm1hbCB0ZXh0ICh1c2UgZnVuY3Rpb25zIGxpa2UgbXNnX3B1dHMoKSBhbmQgc2NyZWVuX3B1dGNoYXIoKSBmb3IgdGhhdCkuCiAqLwogICAgdm9pZApvdXRfc3RyKHMpCiAgICBjaGFyX3UJICpzOwp7CiAgICBpZiAocyAhPSBOVUxMICYmICpzKQogICAgewojaWZkZWYgRkVBVF9HVUkKCS8qIERvbid0IHVzZSB0cHV0cygpIHdoZW4gR1VJIGlzIHVzZWQsIG5jdXJzZXMgY3Jhc2hlcy4gKi8KCWlmIChndWkuaW5fdXNlKQoJewoJICAgIG91dF9zdHJfbmYocyk7CgkgICAgcmV0dXJuOwoJfQojZW5kaWYKCS8qIGF2b2lkIHRlcm1pbmFsIHN0cmluZ3MgYmVpbmcgc3BsaXQgdXAgKi8KCWlmIChvdXRfcG9zID4gT1VUX1NJWkUgLSAyMCkKCSAgICBvdXRfZmx1c2goKTsKI2lmZGVmIEhBVkVfVEdFVEVOVAoJdHB1dHMoKGNoYXIgKilzLCAxLCBUUFVUU0ZVTkNBU1Qgb3V0X2NoYXJfbmYpOwojZWxzZQoJd2hpbGUgKCpzKQoJICAgIG91dF9jaGFyX25mKCpzKyspOwojZW5kaWYKCgkvKiBGb3IgdGVzdGluZyB3ZSB3cml0ZSBvbmUgc3RyaW5nIGF0IGEgdGltZS4gKi8KCWlmIChwX3dkKQoJICAgIG91dF9mbHVzaCgpOwogICAgfQp9CgovKgogKiBjdXJzb3IgcG9zaXRpb25pbmcgdXNpbmcgdGVybWNhcCBwYXJzZXIuIChqdykKICovCiAgICB2b2lkCnRlcm1fd2luZGdvdG8ocm93LCBjb2wpCiAgICBpbnQJICAgIHJvdzsKICAgIGludAkgICAgY29sOwp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DTSwgY29sLCByb3cpKTsKfQoKICAgIHZvaWQKdGVybV9jdXJzb3JfcmlnaHQoaSkKICAgIGludAkgICAgaTsKewogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfQ1JJLCAwLCBpKSk7Cn0KCiAgICB2b2lkCnRlcm1fYXBwZW5kX2xpbmVzKGxpbmVfY291bnQpCiAgICBpbnQJICAgIGxpbmVfY291bnQ7CnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NBTCwgMCwgbGluZV9jb3VudCkpOwp9CgogICAgdm9pZAp0ZXJtX2RlbGV0ZV9saW5lcyhsaW5lX2NvdW50KQogICAgaW50CSAgICBsaW5lX2NvdW50Owp7CiAgICBPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DREwsIDAsIGxpbmVfY291bnQpKTsKfQoKI2lmIGRlZmluZWQoSEFWRV9UR0VURU5UKSB8fCBkZWZpbmVkKFBST1RPKQogICAgdm9pZAp0ZXJtX3NldF93aW5wb3MoeCwgeSkKICAgIGludAkgICAgeDsKICAgIGludAkgICAgeTsKewogICAgLyogQ2FuJ3QgaGFuZGxlIGEgbmVnYXRpdmUgdmFsdWUgaGVyZSAqLwogICAgaWYgKHggPCAwKQoJeCA9IDA7CiAgICBpZiAoeSA8IDApCgl5ID0gMDsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NXUCwgeSwgeCkpOwp9CgogICAgdm9pZAp0ZXJtX3NldF93aW5zaXplKHdpZHRoLCBoZWlnaHQpCiAgICBpbnQJICAgIHdpZHRoOwogICAgaW50CSAgICBoZWlnaHQ7CnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NXUywgaGVpZ2h0LCB3aWR0aCkpOwp9CiNlbmRpZgoKICAgIHZvaWQKdGVybV9mZ19jb2xvcihuKQogICAgaW50CSAgICBuOwp7CiAgICAvKiBVc2UgIkFGIiB0ZXJtY2FwIGVudHJ5IGlmIHByZXNlbnQsICJTZiIgZW50cnkgb3RoZXJ3aXNlICovCiAgICBpZiAoKlRfQ0FGKQoJdGVybV9jb2xvcihUX0NBRiwgbik7CiAgICBlbHNlIGlmICgqVF9DU0YpCgl0ZXJtX2NvbG9yKFRfQ1NGLCBuKTsKfQoKICAgIHZvaWQKdGVybV9iZ19jb2xvcihuKQogICAgaW50CSAgICBuOwp7CiAgICAvKiBVc2UgIkFCIiB0ZXJtY2FwIGVudHJ5IGlmIHByZXNlbnQsICJTYiIgZW50cnkgb3RoZXJ3aXNlICovCiAgICBpZiAoKlRfQ0FCKQoJdGVybV9jb2xvcihUX0NBQiwgbik7CiAgICBlbHNlIGlmICgqVF9DU0IpCgl0ZXJtX2NvbG9yKFRfQ1NCLCBuKTsKfQoKICAgIHN0YXRpYyB2b2lkCnRlcm1fY29sb3IocywgbikKICAgIGNoYXJfdQkqczsKICAgIGludAkJbjsKewogICAgY2hhcglidWZbMjBdOwogICAgaW50IGkgPSAyOwkvKiBpbmRleCBpbiBzW10ganVzdCBhZnRlciA8RXNjPlsgb3IgQ1NJICovCgogICAgLyogU3BlY2lhbCBoYW5kbGluZyBvZiAxNiBjb2xvcnMsIGJlY2F1c2UgdGVybWNhcCBjYW4ndCBoYW5kbGUgaXQgKi8KICAgIC8qIEFsc28gYWNjZXB0ICJcZVszJWRtIiBmb3IgVEVSTUlORk8sIGl0IGlzIHNvbWV0aW1lcyB1c2VkICovCiAgICAvKiBBbHNvIGFjY2VwdCBDU0kgaW5zdGVhZCBvZiA8RXNjPlsgKi8KICAgIGlmIChuID49IDggJiYgdF9jb2xvcnMgPj0gMTYKCSAgICAgICYmICgoc1swXSA9PSBFU0MgJiYgc1sxXSA9PSAnWycpIHx8IChzWzBdID09IENTSSAmJiAoaSA9IDEpID09IDEpKQoJICAgICAgJiYgc1tpXSAhPSBOVUwKCSAgICAgICYmIChTVFJDTVAocyArIGkgKyAxLCAiJXAxJWRtIikgPT0gMAoJCSAgfHwgU1RSQ01QKHMgKyBpICsgMSwgIiVkbSIpID09IDApCgkgICAgICAmJiAoc1tpXSA9PSAnMycgfHwgc1tpXSA9PSAnNCcpKQogICAgewoJc3ByaW50ZihidWYsCiNpZmRlZiBURVJNSU5GTwoJCSIlcyVzJSVwMSUlZG0iLAojZWxzZQoJCSIlcyVzJSVkbSIsCiNlbmRpZgoJCWkgPT0gMiA/IElGX0VCKCJcMDMzWyIsIEVTQ19TVFIgIlsiKSA6ICJcMjMzIiwKCQlzW2ldID09ICczJyA/IChuID49IDE2ID8gIjM4OzU7IiA6ICI5IikKCQkJICAgIDogKG4gPj0gMTYgPyAiNDg7NTsiIDogIjEwIikpOwoJT1VUX1NUUih0Z290byhidWYsIDAsIG4gPj0gMTYgPyBuIDogbiAtIDgpKTsKICAgIH0KICAgIGVsc2UKCU9VVF9TVFIodGdvdG8oKGNoYXIgKilzLCAwLCBuKSk7Cn0KCiNpZiAoZGVmaW5lZChGRUFUX1RJVExFKSAmJiAoZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1NfWCkpKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBHZW5lcmljIGZ1bmN0aW9uIHRvIHNldCB3aW5kb3cgdGl0bGUsIHVzaW5nIHRfdHMgYW5kIHRfZnMuCiAqLwogICAgdm9pZAp0ZXJtX3NldHRpdGxlKHRpdGxlKQogICAgY2hhcl91CSp0aXRsZTsKewogICAgLyogdF90cyB0YWtlcyBvbmUgYXJndW1lbnQ6IGNvbHVtbiBpbiBzdGF0dXMgbGluZSAqLwogICAgT1VUX1NUUih0Z290bygoY2hhciAqKVRfVFMsIDAsIDApKTsJLyogc2V0IHRpdGxlIHN0YXJ0ICovCiAgICBvdXRfc3RyX25mKHRpdGxlKTsKICAgIG91dF9zdHIoVF9GUyk7CQkJLyogc2V0IHRpdGxlIGVuZCAqLwogICAgb3V0X2ZsdXNoKCk7Cn0KI2VuZGlmCgovKgogKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHNldCBvciB0ZXJtaW5hbCBvcHRpb25zLgogKiBSZXBsYWNlIGFsbCBlbnRyaWVzIHRoYXQgYXJlIE5VTEwgYnkgZW1wdHlfb3B0aW9uCiAqLwogICAgdm9pZAp0dGVzdChwYWlycykKICAgIGludAlwYWlyczsKewogICAgY2hlY2tfb3B0aW9ucygpOwkJICAgIC8qIG1ha2Ugc3VyZSBubyBvcHRpb25zIGFyZSBOVUxMICovCgogICAgLyoKICAgICAqIE1VU1QgaGF2ZSAiY20iOiBjdXJzb3IgbW90aW9uLgogICAgICovCiAgICBpZiAoKlRfQ00gPT0gTlVMKQoJRU1TRyhfKCJFNDM3OiB0ZXJtaW5hbCBjYXBhYmlsaXR5IFwiY21cIiByZXF1aXJlZCIpKTsKCiAgICAvKgogICAgICogaWYgImNzIiBkZWZpbmVkLCB1c2UgYSBzY3JvbGwgcmVnaW9uLCBpdCdzIGZhc3Rlci4KICAgICAqLwogICAgaWYgKCpUX0NTICE9IE5VTCkKCXNjcm9sbF9yZWdpb24gPSBUUlVFOwogICAgZWxzZQoJc2Nyb2xsX3JlZ2lvbiA9IEZBTFNFOwoKICAgIGlmIChwYWlycykKICAgIHsKCS8qCgkgKiBvcHRpb25hbCBwYWlycwoJICovCgkvKiBUUCBnb2VzIHRvIG5vcm1hbCBtb2RlIGZvciBUSSAoaW52ZXJ0KSBhbmQgVEIgKGJvbGQpICovCglpZiAoKlRfTUUgPT0gTlVMKQoJICAgIFRfTUUgPSBUX01SID0gVF9NRCA9IFRfTUIgPSBlbXB0eV9vcHRpb247CglpZiAoKlRfU08gPT0gTlVMIHx8ICpUX1NFID09IE5VTCkKCSAgICBUX1NPID0gVF9TRSA9IGVtcHR5X29wdGlvbjsKCWlmICgqVF9VUyA9PSBOVUwgfHwgKlRfVUUgPT0gTlVMKQoJICAgIFRfVVMgPSBUX1VFID0gZW1wdHlfb3B0aW9uOwoJaWYgKCpUX0NaSCA9PSBOVUwgfHwgKlRfQ1pSID09IE5VTCkKCSAgICBUX0NaSCA9IFRfQ1pSID0gZW1wdHlfb3B0aW9uOwoKCS8qIFRfVkUgaXMgbmVlZGVkIGV2ZW4gdGhvdWdoIFRfVkkgaXMgbm90IGRlZmluZWQgKi8KCWlmICgqVF9WRSA9PSBOVUwpCgkgICAgVF9WSSA9IGVtcHR5X29wdGlvbjsKCgkvKiBpZiAnbXInIG9yICdtZScgaXMgbm90IGRlZmluZWQgdXNlICdzbycgYW5kICdzZScgKi8KCWlmICgqVF9NRSA9PSBOVUwpCgl7CgkgICAgVF9NRSA9IFRfU0U7CgkgICAgVF9NUiA9IFRfU087CgkgICAgVF9NRCA9IFRfU087Cgl9CgoJLyogaWYgJ3NvJyBvciAnc2UnIGlzIG5vdCBkZWZpbmVkIHVzZSAnbXInIGFuZCAnbWUnICovCglpZiAoKlRfU08gPT0gTlVMKQoJewoJICAgIFRfU0UgPSBUX01FOwoJICAgIGlmICgqVF9NUiA9PSBOVUwpCgkJVF9TTyA9IFRfTUQ7CgkgICAgZWxzZQoJCVRfU08gPSBUX01SOwoJfQoKCS8qIGlmICdaSCcgb3IgJ1pSJyBpcyBub3QgZGVmaW5lZCB1c2UgJ21yJyBhbmQgJ21lJyAqLwoJaWYgKCpUX0NaSCA9PSBOVUwpCgl7CgkgICAgVF9DWlIgPSBUX01FOwoJICAgIGlmICgqVF9NUiA9PSBOVUwpCgkJVF9DWkggPSBUX01EOwoJICAgIGVsc2UKCQlUX0NaSCA9IFRfTVI7Cgl9CgoJLyogIlNiIiBhbmQgIlNmIiBjb21lIGluIHBhaXJzICovCglpZiAoKlRfQ1NCID09IE5VTCB8fCAqVF9DU0YgPT0gTlVMKQoJewoJICAgIFRfQ1NCID0gZW1wdHlfb3B0aW9uOwoJICAgIFRfQ1NGID0gZW1wdHlfb3B0aW9uOwoJfQoKCS8qICJBQiIgYW5kICJBRiIgY29tZSBpbiBwYWlycyAqLwoJaWYgKCpUX0NBQiA9PSBOVUwgfHwgKlRfQ0FGID09IE5VTCkKCXsKCSAgICBUX0NBQiA9IGVtcHR5X29wdGlvbjsKCSAgICBUX0NBRiA9IGVtcHR5X29wdGlvbjsKCX0KCgkvKiBpZiAnU2InIGFuZCAnQUInIGFyZSBub3QgZGVmaW5lZCwgcmVzZXQgIkNvIiAqLwoJaWYgKCpUX0NTQiA9PSBOVUwgJiYgKlRfQ0FCID09IE5VTCkKCSAgICBUX0NDTyA9IGVtcHR5X29wdGlvbjsKCgkvKiBTZXQgJ3dlaXJkaW52ZXJ0JyBhY2NvcmRpbmcgdG8gdmFsdWUgb2YgJ3RfeHMnICovCglwX3dpdiA9ICgqVF9YUyAhPSBOVUwpOwogICAgfQogICAgbmVlZF9nYXRoZXIgPSBUUlVFOwoKICAgIC8qIFNldCB0X2NvbG9ycyB0byB0aGUgdmFsdWUgb2YgdF9Dby4gKi8KICAgIHRfY29sb3JzID0gYXRvaSgoY2hhciAqKVRfQ0NPKTsKfQoKI2lmIChkZWZpbmVkKEZFQVRfR1VJKSAmJiAoZGVmaW5lZChGRUFUX01FTlUpIHx8ICFkZWZpbmVkKFVTRV9PTl9GTFlfU0NST0xMKSkpIFwKCXx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFJlcHJlc2VudCB0aGUgZ2l2ZW4gbG9uZ191IGFzIGluZGl2aWR1YWwgYnl0ZXMsIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQKICogYnl0ZSBmaXJzdCwgYW5kIHN0b3JlIHRoZW0gaW4gZHN0LgogKi8KICAgIHZvaWQKYWRkX2xvbmdfdG9fYnVmKHZhbCwgZHN0KQogICAgbG9uZ191ICB2YWw7CiAgICBjaGFyX3UgICpkc3Q7CnsKICAgIGludAkgICAgaTsKICAgIGludAkgICAgc2hpZnQ7CgogICAgZm9yIChpID0gMTsgaSA8PSBzaXplb2YobG9uZ191KTsgaSsrKQogICAgewoJc2hpZnQgPSA4ICogKHNpemVvZihsb25nX3UpIC0gaSk7Cglkc3RbaSAtIDFdID0gKGNoYXJfdSkgKCh2YWwgPj4gc2hpZnQpICYgMHhmZik7CiAgICB9Cn0KCnN0YXRpYyBpbnQgZ2V0X2xvbmdfZnJvbV9idWYgX19BUkdTKChjaGFyX3UgKmJ1ZiwgbG9uZ191ICp2YWwpKTsKCi8qCiAqIEludGVycHJldCB0aGUgbmV4dCBzdHJpbmcgb2YgYnl0ZXMgaW4gYnVmIGFzIGEgbG9uZyBpbnRlZ2VyLCB3aXRoIHRoZSBtb3N0CiAqIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuICBOb3RlIHRoYXQgaXQgaXMgYXNzdW1lZCB0aGF0IGJ1ZiBoYXMgYmVlbiB0aHJvdWdoCiAqIGluY2hhcigpLCBzbyB0aGF0IE5VTCBhbmQgS19TUEVDSUFMIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgdGhyZWUgYnl0ZXMgZWFjaC4KICogUHV0cyByZXN1bHQgaW4gdmFsLCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBidWYKICogKGJldHdlZW4gc2l6ZW9mKGxvbmdfdSkgYW5kIDIgKiBzaXplb2YobG9uZ191KSksIG9yIC0xIGlmIG5vdCBlbm91Z2ggYnl0ZXMKICogd2VyZSBwcmVzZW50LgogKi8KICAgIHN0YXRpYyBpbnQKZ2V0X2xvbmdfZnJvbV9idWYoYnVmLCB2YWwpCiAgICBjaGFyX3UgICpidWY7CiAgICBsb25nX3UgICp2YWw7CnsKICAgIGludAkgICAgbGVuOwogICAgY2hhcl91ICBieXRlc1tzaXplb2YobG9uZ191KV07CiAgICBpbnQJICAgIGk7CiAgICBpbnQJICAgIHNoaWZ0OwoKICAgICp2YWwgPSAwOwogICAgbGVuID0gZ2V0X2J5dGVzX2Zyb21fYnVmKGJ1ZiwgYnl0ZXMsIChpbnQpc2l6ZW9mKGxvbmdfdSkpOwogICAgaWYgKGxlbiAhPSAtMSkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobG9uZ191KTsgaSsrKQoJewoJICAgIHNoaWZ0ID0gOCAqIChzaXplb2YobG9uZ191KSAtIDEgLSBpKTsKCSAgICAqdmFsICs9IChsb25nX3UpYnl0ZXNbaV0gPDwgc2hpZnQ7Cgl9CiAgICB9CiAgICByZXR1cm4gbGVuOwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVF9HVUkpIFwKICAgIHx8IChkZWZpbmVkKEZFQVRfTU9VU0UpICYmICghZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pKSkKLyoKICogUmVhZCB0aGUgbmV4dCBudW1fYnl0ZXMgYnl0ZXMgZnJvbSBidWYsIGFuZCBzdG9yZSB0aGVtIGluIGJ5dGVzLiAgQXNzdW1lCiAqIHRoYXQgYnVmIGhhcyBiZWVuIHRocm91Z2ggaW5jaGFyKCkuCVJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZAogKiBmcm9tIGJ1ZiAoYmV0d2VlbiBudW1fYnl0ZXMgYW5kIG51bV9ieXRlcyoyKSwgb3IgLTEgaWYgbm90IGVub3VnaCBieXRlcyB3ZXJlCiAqIGF2YWlsYWJsZS4KICovCiAgICBzdGF0aWMgaW50CmdldF9ieXRlc19mcm9tX2J1ZihidWYsIGJ5dGVzLCBudW1fYnl0ZXMpCiAgICBjaGFyX3UgICpidWY7CiAgICBjaGFyX3UgICpieXRlczsKICAgIGludAkgICAgbnVtX2J5dGVzOwp7CiAgICBpbnQJICAgIGxlbiA9IDA7CiAgICBpbnQJICAgIGk7CiAgICBjaGFyX3UgIGM7CgogICAgZm9yIChpID0gMDsgaSA8IG51bV9ieXRlczsgaSsrKQogICAgewoJaWYgKChjID0gYnVmW2xlbisrXSkgPT0gTlVMKQoJICAgIHJldHVybiAtMTsKCWlmIChjID09IEtfU1BFQ0lBTCkKCXsKCSAgICBpZiAoYnVmW2xlbl0gPT0gTlVMIHx8IGJ1ZltsZW4gKyAxXSA9PSBOVUwpCSAgICAvKiBjYW5ub3QgaGFwcGVuPyAqLwoJCXJldHVybiAtMTsKCSAgICBpZiAoYnVmW2xlbisrXSA9PSAoaW50KUtTX1pFUk8pCgkJYyA9IE5VTDsKCSAgICArK2xlbjsJLyogc2tpcCBLRV9GSUxMRVIgKi8KCSAgICAvKiBlbHNlIGl0IHNob3VsZCBiZSBLU19TUEVDSUFMLCBhbmQgYyBhbHJlYWR5IGVxdWFscyBLX1NQRUNJQUwgKi8KCX0KCWVsc2UgaWYgKGMgPT0gQ1NJICYmIGJ1ZltsZW5dID09IEtTX0VYVFJBICYmIGJ1ZltsZW4gKyAxXSA9PSAoaW50KUtFX0NTSSkKCSAgICAvKiBDU0kgaXMgc3RvcmVkIGFzIENTSSBLU19TUEVDSUFMIEtFX0NTSSB0byBhdm9pZCBjb25mdXNpb24gd2l0aAoJICAgICAqIHRoZSBzdGFydCBvZiBhIHNwZWNpYWwga2V5LCBzZWUgYWRkX3RvX2lucHV0X2J1Zl9jc2koKS4gKi8KCSAgICBsZW4gKz0gMjsKCWJ5dGVzW2ldID0gYzsKICAgIH0KICAgIHJldHVybiBsZW47Cn0KI2VuZGlmCgovKgogKiBDaGVjayBpZiB0aGUgbmV3IHNoZWxsIHNpemUgaXMgdmFsaWQsIGNvcnJlY3QgaXQgaWYgaXQncyB0b28gc21hbGwuCiAqLwogICAgdm9pZApjaGVja19zaGVsbHNpemUoKQp7CiAgICBpZiAoQ29sdW1ucyA8IE1JTl9DT0xVTU5TKQoJQ29sdW1ucyA9IE1JTl9DT0xVTU5TOwogICAgaWYgKFJvd3MgPCBtaW5fcm93cygpKQkvKiBuZWVkIHJvb20gZm9yIG9uZSB3aW5kb3cgYW5kIGNvbW1hbmQgbGluZSAqLwoJUm93cyA9IG1pbl9yb3dzKCk7Cn0KCi8qCiAqIEludm9rZWQganVzdCBiZWZvcmUgdGhlIHNjcmVlbiBzdHJ1Y3R1cmVzIGFyZSBnb2luZyB0byBiZSAocmUpYWxsb2NhdGVkLgogKi8KICAgIHZvaWQKd2luX25ld19zaGVsbHNpemUoKQp7CiAgICBzdGF0aWMgaW50CW9sZF9Sb3dzID0gMDsKICAgIHN0YXRpYyBpbnQJb2xkX0NvbHVtbnMgPSAwOwoKICAgIGlmIChvbGRfUm93cyAhPSBSb3dzIHx8IG9sZF9Db2x1bW5zICE9IENvbHVtbnMpCgl1aV9uZXdfc2hlbGxzaXplKCk7CiAgICBpZiAob2xkX1Jvd3MgIT0gUm93cykKICAgIHsKCS8qIGlmICd3aW5kb3cnIHVzZXMgdGhlIHdob2xlIHNjcmVlbiwga2VlcCBpdCB1c2luZyB0aGF0ICovCglpZiAocF93aW5kb3cgPT0gb2xkX1Jvd3MgLSAxIHx8IG9sZF9Sb3dzID09IDApCgkgICAgcF93aW5kb3cgPSBSb3dzIC0gMTsKCW9sZF9Sb3dzID0gUm93czsKCXNoZWxsX25ld19yb3dzKCk7CS8qIHVwZGF0ZSB3aW5kb3cgc2l6ZXMgKi8KICAgIH0KICAgIGlmIChvbGRfQ29sdW1ucyAhPSBDb2x1bW5zKQogICAgewoJb2xkX0NvbHVtbnMgPSBDb2x1bW5zOwojaWZkZWYgRkVBVF9WRVJUU1BMSVQKCXNoZWxsX25ld19jb2x1bW5zKCk7CS8qIHVwZGF0ZSB3aW5kb3cgc2l6ZXMgKi8KI2VuZGlmCiAgICB9Cn0KCi8qCiAqIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBWaW0gc2hlbGwgaGFzIGJlZW4gcmVzaXplZCBpbiBhbnkgd2F5LgogKiBXaWxsIG9idGFpbiB0aGUgY3VycmVudCBzaXplIGFuZCByZWRyYXcgKGFsc28gd2hlbiBzaXplIGRpZG4ndCBjaGFuZ2UpLgogKi8KICAgIHZvaWQKc2hlbGxfcmVzaXplZCgpCnsKICAgIHNldF9zaGVsbHNpemUoMCwgMCwgRkFMU0UpOwp9CgovKgogKiBDaGVjayBpZiB0aGUgc2hlbGwgc2l6ZSBjaGFuZ2VkLiAgSGFuZGxlIGEgcmVzaXplLgogKiBXaGVuIHRoZSBzaXplIGRpZG4ndCBjaGFuZ2UsIG5vdGhpbmcgaGFwcGVucy4KICovCiAgICB2b2lkCnNoZWxsX3Jlc2l6ZWRfY2hlY2soKQp7CiAgICBpbnQJCW9sZF9Sb3dzID0gUm93czsKICAgIGludAkJb2xkX0NvbHVtbnMgPSBDb2x1bW5zOwoKICAgICh2b2lkKXVpX2dldF9zaGVsbHNpemUoKTsKICAgIGNoZWNrX3NoZWxsc2l6ZSgpOwogICAgaWYgKG9sZF9Sb3dzICE9IFJvd3MgfHwgb2xkX0NvbHVtbnMgIT0gQ29sdW1ucykKCXNoZWxsX3Jlc2l6ZWQoKTsKfQoKLyoKICogU2V0IHNpemUgb2YgdGhlIFZpbSBzaGVsbC4KICogSWYgJ211c3RzZXQnIGlzIFRSVUUsIHdlIG11c3Qgc2V0IFJvd3MgYW5kIENvbHVtbnMsIGRvIG5vdCBnZXQgdGhlIHJlYWwKICogd2luZG93IHNpemUgKHRoaXMgaXMgdXNlZCBmb3IgdGhlIDp3aW4gY29tbWFuZCkuCiAqIElmICdtdXN0c2V0JyBpcyBGQUxTRSwgd2UgbWF5IHRyeSB0byBnZXQgdGhlIHJlYWwgd2luZG93IHNpemUgYW5kIGlmCiAqIGl0IGZhaWxzIHVzZSAnd2lkdGgnIGFuZCAnaGVpZ2h0Jy4KICovCiAgICB2b2lkCnNldF9zaGVsbHNpemUod2lkdGgsIGhlaWdodCwgbXVzdHNldCkKICAgIGludAkgICAgd2lkdGgsIGhlaWdodDsKICAgIGludAkgICAgbXVzdHNldDsKewogICAgc3RhdGljIGludAkJYnVzeSA9IEZBTFNFOwoKICAgIC8qCiAgICAgKiBBdm9pZCByZWN1cnNpdmVuZXNzLCBjYW4gaGFwcGVuIHdoZW4gc2V0dGluZyB0aGUgd2luZG93IHNpemUgY2F1c2VzCiAgICAgKiBhbm90aGVyIHdpbmRvdy1jaGFuZ2VkIHNpZ25hbC4KICAgICAqLwogICAgaWYgKGJ1c3kpCglyZXR1cm47CgogICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSAgICAvKiBqdXN0IGNoZWNraW5nLi4uICovCglyZXR1cm47CgogICAgaWYgKFN0YXRlID09IEhJVFJFVFVSTiB8fCBTdGF0ZSA9PSBTRVRXU0laRSkgLyogcG9zdHBvbmUgdGhlIHJlc2l6aW5nICovCiAgICB7CglTdGF0ZSA9IFNFVFdTSVpFOwoJcmV0dXJuOwogICAgfQoKICAgICsrYnVzeTsKCiNpZmRlZiBBTUlHQQogICAgb3V0X2ZsdXNoKCk7CSAgICAvKiBtdXN0IGRvIHRoaXMgYmVmb3JlIG1jaF9nZXRfc2hlbGxzaXplKCkgZm9yCgkJCSAgICAgICBzb21lIG9ic2N1cmUgcmVhc29uICovCiNlbmRpZgoKICAgIGlmIChtdXN0c2V0IHx8ICh1aV9nZXRfc2hlbGxzaXplKCkgPT0gRkFJTCAmJiBoZWlnaHQgIT0gMCkpCiAgICB7CglSb3dzID0gaGVpZ2h0OwoJQ29sdW1ucyA9IHdpZHRoOwoJY2hlY2tfc2hlbGxzaXplKCk7Cgl1aV9zZXRfc2hlbGxzaXplKG11c3RzZXQpOwogICAgfQogICAgZWxzZQoJY2hlY2tfc2hlbGxzaXplKCk7CgogICAgLyogVGhlIHdpbmRvdyBsYXlvdXQgdXNlZCB0byBiZSBhZGp1c3RlZCBoZXJlLCBidXQgaXQgbm93IGhhcHBlbnMgaW4KICAgICAqIHNjcmVlbmFsbG9jKCkgKGFsc28gaW52b2tlZCBmcm9tIHNjcmVlbmNsZWFyKCkpLiAgVGhhdCBpcyBiZWNhdXNlIHRoZQogICAgICogImJ1c3kiIGNoZWNrIGFib3ZlIG1heSBza2lwIHRoaXMsIGJ1dCBub3Qgc2NyZWVuYWxsb2MoKS4gKi8KCiAgICBpZiAoU3RhdGUgIT0gQVNLTU9SRSAmJiBTdGF0ZSAhPSBFWFRFUk5DTUQgJiYgU3RhdGUgIT0gQ09ORklSTSkKCXNjcmVlbmNsZWFyKCk7CiAgICBlbHNlCglzY3JlZW5fc3RhcnQoKTsJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwoKICAgIGlmIChzdGFydGluZyAhPSBOT19TQ1JFRU4pCiAgICB7CiNpZmRlZiBGRUFUX1RJVExFCgltYWtldGl0bGUoKTsKI2VuZGlmCgljaGFuZ2VkX2xpbmVfYWJ2X2N1cnMoKTsKCWludmFsaWRhdGVfYm90bGluZSgpOwoKCS8qCgkgKiBXZSBvbmx5IHJlZHJhdyB3aGVuIGl0J3MgbmVlZGVkOgoJICogLSBXaGlsZSBhdCB0aGUgbW9yZSBwcm9tcHQgb3IgZXhlY3V0aW5nIGFuIGV4dGVybmFsIGNvbW1hbmQsIGRvbid0CgkgKiAgIHJlZHJhdywgYnV0IHBvc2l0aW9uIHRoZSBjdXJzb3IuCgkgKiAtIFdoaWxlIGVkaXRpbmcgdGhlIGNvbW1hbmQgbGluZSwgb25seSByZWRyYXcgdGhhdC4KCSAqIC0gaW4gRXggbW9kZSwgZG9uJ3QgcmVkcmF3IGFueXRoaW5nLgoJICogLSBPdGhlcndpc2UsIHJlZHJhdyByaWdodCBub3csIGFuZCBwb3NpdGlvbiB0aGUgY3Vyc29yLgoJICogQWx3YXlzIG5lZWQgdG8gY2FsbCB1cGRhdGVfc2NyZWVuKCkgb3Igc2NyZWVuYWxsb2MoKSwgdG8gbWFrZQoJICogc3VyZSBSb3dzL0NvbHVtbnMgYW5kIHRoZSBzaXplIG9mIFNjcmVlbkxpbmVzW10gaXMgY29ycmVjdCEKCSAqLwoJaWYgKFN0YXRlID09IEFTS01PUkUgfHwgU3RhdGUgPT0gRVhURVJOQ01EIHx8IFN0YXRlID09IENPTkZJUk0KCQkJCQkJCSAgICAgfHwgZXhtb2RlX2FjdGl2ZSkKCXsKCSAgICBzY3JlZW5hbGxvYyhGQUxTRSk7CgkgICAgcmVwZWF0X21lc3NhZ2UoKTsKCX0KCWVsc2UKCXsKI2lmZGVmIEZFQVRfU0NST0xMQklORAoJICAgIGlmIChjdXJ3aW4tPndfcF9zY2IpCgkJZG9fY2hlY2tfc2Nyb2xsYmluZChUUlVFKTsKI2VuZGlmCgkgICAgaWYgKFN0YXRlICYgQ01ETElORSkKCSAgICB7CgkJdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOwoJCXJlZHJhd2NtZGxpbmUoKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQl1cGRhdGVfdG9wbGluZSgpOwojaWYgZGVmaW5lZChGRUFUX0lOU19FWFBBTkQpCgkJaWYgKHB1bV92aXNpYmxlKCkpCgkJewoJCSAgICByZWRyYXdfbGF0ZXIoTk9UX1ZBTElEKTsKCQkgICAgaW5zX2NvbXBsX3Nob3dfcHVtKCk7IC8qIFRoaXMgaW5jbHVkZXMgdGhlIHJlZHJhdy4gKi8KCQl9CgkJZWxzZQojZW5kaWYKCQkgICAgdXBkYXRlX3NjcmVlbihOT1RfVkFMSUQpOwoJCWlmIChyZWRyYXdpbmcoKSkKCQkgICAgc2V0Y3Vyc29yKCk7CgkgICAgfQoJfQoJY3Vyc29yX29uKCk7CSAgICAvKiByZWRyYXdpbmcgbWF5IGhhdmUgc3dpdGNoZWQgaXQgb2ZmICovCiAgICB9CiAgICBvdXRfZmx1c2goKTsKICAgIC0tYnVzeTsKfQoKLyoKICogU2V0IHRoZSB0ZXJtaW5hbCB0byBUTU9ERV9SQVcgKGZvciBOb3JtYWwgbW9kZSkgb3IgVE1PREVfQ09PSyAoZm9yIGV4dGVybmFsCiAqIGNvbW1hbmRzIGFuZCBFeCBtb2RlKS4KICovCiAgICB2b2lkCnNldHRtb2RlKHRtb2RlKQogICAgaW50CSB0bW9kZTsKewojaWZkZWYgRkVBVF9HVUkKICAgIC8qIGRvbid0IHNldCB0aGUgdGVybSB3aGVyZSBndmltIHdhcyBzdGFydGVkIHRvIGFueSBtb2RlICovCiAgICBpZiAoZ3VpLmluX3VzZSkKCXJldHVybjsKI2VuZGlmCgogICAgaWYgKGZ1bGxfc2NyZWVuKQogICAgewoJLyoKCSAqIFdoZW4gcmV0dXJuaW5nIGFmdGVyIGNhbGxpbmcgYSBzaGVsbCB3ZSB3YW50IHRvIHJlYWxseSBzZXQgdGhlCgkgKiB0ZXJtaW5hbCB0byByYXcgbW9kZSwgZXZlbiB0aG91Z2ggd2UgdGhpbmsgaXQgYWxyZWFkeSBpcywgYmVjYXVzZQoJICogdGhlIHNoZWxsIHByb2dyYW0gbWF5IGhhdmUgcmVzZXQgdGhlIHRlcm1pbmFsIG1vZGUuCgkgKiBXaGVuIHdlIHRoaW5rIHRoZSB0ZXJtaW5hbCBpcyBub3JtYWwsIGRvbid0IHRyeSB0byBzZXQgaXQgdG8KCSAqIG5vcm1hbCBhZ2FpbiwgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyAobG9nb3V0ISkgb24gc29tZQoJICogbWFjaGluZXMuCgkgKi8KCWlmICh0bW9kZSAhPSBUTU9ERV9DT09LIHx8IGN1cl90bW9kZSAhPSBUTU9ERV9DT09LKQoJewojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKCSAgICAvKiBNYXkgbmVlZCB0byBjaGVjayBmb3IgVF9DUlYgcmVzcG9uc2UgYW5kIHRlcm1jb2RlcywgaXQgZG9lc24ndAoJICAgICAqIHdvcmsgaW4gQ29va2VkIG1vZGUsIGFuIGV4dGVybmFsIHByb2dyYW0gbWF5IGdldCB0aGVtLiAqLwoJICAgIGlmICh0bW9kZSAhPSBUTU9ERV9SQVcgJiYgY3J2X3N0YXR1cyA9PSBDUlZfU0VOVCkKCQkodm9pZCl2cGVla2Nfbm9tYXAoKTsKCSAgICBjaGVja19mb3JfY29kZXNfZnJvbV90ZXJtKCk7CiNlbmRpZgojaWZkZWYgRkVBVF9NT1VTRV9UVFkKCSAgICBpZiAodG1vZGUgIT0gVE1PREVfUkFXKQoJCW1jaF9zZXRtb3VzZShGQUxTRSk7CQkvKiBzd2l0Y2ggbW91c2Ugb2ZmICovCiNlbmRpZgoJICAgIG91dF9mbHVzaCgpOwoJICAgIG1jaF9zZXR0bW9kZSh0bW9kZSk7ICAgIC8qIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb24gKi8KCSAgICBjdXJfdG1vZGUgPSB0bW9kZTsKI2lmZGVmIEZFQVRfTU9VU0UKCSAgICBpZiAodG1vZGUgPT0gVE1PREVfUkFXKQoJCXNldG1vdXNlKCk7CQkJLyogbWF5IHN3aXRjaCBtb3VzZSBvbiAqLwojZW5kaWYKCSAgICBvdXRfZmx1c2goKTsKCX0KI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCgltYXlfcmVxX3Rlcm1yZXNwb25zZSgpOwojZW5kaWYKICAgIH0KfQoKICAgIHZvaWQKc3RhcnR0ZXJtY2FwKCkKewogICAgaWYgKGZ1bGxfc2NyZWVuICYmICF0ZXJtY2FwX2FjdGl2ZSkKICAgIHsKCW91dF9zdHIoVF9USSk7CQkJLyogc3RhcnQgdGVybWNhcCBtb2RlICovCglvdXRfc3RyKFRfS1MpOwkJCS8qIHN0YXJ0ICJrZXlwYWQgdHJhbnNtaXQiIG1vZGUgKi8KCW91dF9mbHVzaCgpOwoJdGVybWNhcF9hY3RpdmUgPSBUUlVFOwoJc2NyZWVuX3N0YXJ0KCk7CQkJLyogZG9uJ3Qga25vdyB3aGVyZSBjdXJzb3IgaXMgbm93ICovCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQoJbWF5X3JlcV90ZXJtcmVzcG9uc2UoKTsKCS8qIEltbWVkaWF0ZWx5IGNoZWNrIGZvciBhIHJlc3BvbnNlLiAgSWYgdF9DbyBjaGFuZ2VzLCB3ZSBkb24ndCB3YW50CgkgKiB0byByZWRyYXcgd2l0aCB3cm9uZyBjb2xvcnMgZmlyc3QuICovCgljaGVja19mb3JfY29kZXNfZnJvbV90ZXJtKCk7CiNlbmRpZgogICAgfQp9CgogICAgdm9pZApzdG9wdGVybWNhcCgpCnsKICAgIHNjcmVlbl9zdG9wX2hpZ2hsaWdodCgpOwogICAgcmVzZXRfY3Rlcm1fY29sb3JzKCk7CiAgICBpZiAodGVybWNhcF9hY3RpdmUpCiAgICB7CiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQoJLyogTWF5IG5lZWQgdG8gY2hlY2sgZm9yIFRfQ1JWIHJlc3BvbnNlLiAqLwoJaWYgKGNydl9zdGF0dXMgPT0gQ1JWX1NFTlQpCgkgICAgKHZvaWQpdnBlZWtjX25vbWFwKCk7CgkvKiBDaGVjayBmb3IgdGVybWNvZGVzIGZpcnN0LCBvdGhlcndpc2UgYW4gZXh0ZXJuYWwgcHJvZ3JhbSBtYXkgZ2V0CgkgKiB0aGVtLiAqLwoJY2hlY2tfZm9yX2NvZGVzX2Zyb21fdGVybSgpOwojZW5kaWYKCW91dF9zdHIoVF9LRSk7CQkJLyogc3RvcCAia2V5cGFkIHRyYW5zbWl0IiBtb2RlICovCglvdXRfZmx1c2goKTsKCXRlcm1jYXBfYWN0aXZlID0gRkFMU0U7CgljdXJzb3Jfb24oKTsJCQkvKiBqdXN0IGluIGNhc2UgaXQgaXMgc3RpbGwgb2ZmICovCglvdXRfc3RyKFRfVEUpOwkJCS8qIHN0b3AgdGVybWNhcCBtb2RlICovCglzY3JlZW5fc3RhcnQoKTsJCQkvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KCW91dF9mbHVzaCgpOwogICAgfQp9CgojaWYgZGVmaW5lZChGRUFUX1RFUk1SRVNQT05TRSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogUmVxdWVzdCB2ZXJzaW9uIHN0cmluZyAoZm9yIHh0ZXJtKSB3aGVuIG5lZWRlZC4KICogT25seSBkbyB0aGlzIGFmdGVyIHN3aXRjaGluZyB0byByYXcgbW9kZSwgb3RoZXJ3aXNlIHRoZSByZXN1bHQgd2lsbCBiZQogKiBlY2hvZWQuCiAqIE9ubHkgZG8gdGhpcyBhZnRlciBzdGFydHVwIGhhcyBmaW5pc2hlZCwgdG8gYXZvaWQgdGhhdCB0aGUgcmVzcG9uc2UgY29tZXMKICogd2hpbGUgZXhjdXRpbmcgIi1jICFjbWQiIG9yIGV2ZW4gYWZ0ZXIgIi1jIHF1aXQiLgogKiBPbmx5IGRvIHRoaXMgYWZ0ZXIgdGVybWNhcCBtb2RlIGhhcyBiZWVuIHN0YXJ0ZWQsIG90aGVyd2lzZSB0aGUgY29kZXMgZm9yCiAqIHRoZSBjdXJzb3Iga2V5cyBtYXkgYmUgd3JvbmcuCiAqIE9ubHkgZG8gdGhpcyB3aGVuICdlc2NrZXlzJyBpcyBvbiwgb3RoZXJ3aXNlIHRoZSByZXNwb25zZSBjYXVzZXMgdHJvdWJsZSBpbgogKiBJbnNlcnQgbW9kZS4KICogT24gVW5peCBvbmx5IGRvIGl0IHdoZW4gYm90aCBvdXRwdXQgYW5kIGlucHV0IGFyZSBhIHR0eSAoYXZvaWQgd3JpdGluZwogKiByZXF1ZXN0IHRvIHRlcm1pbmFsIHdoaWxlIHJlYWRpbmcgZnJvbSBhIGZpbGUpLgogKiBUaGUgcmVzdWx0IGlzIGNhdWdodCBpbiBjaGVja190ZXJtY29kZSgpLgogKi8KICAgIHZvaWQKbWF5X3JlcV90ZXJtcmVzcG9uc2UoKQp7CiAgICBpZiAoY3J2X3N0YXR1cyA9PSBDUlZfR0VUCgkgICAgJiYgY3VyX3Rtb2RlID09IFRNT0RFX1JBVwoJICAgICYmIHN0YXJ0aW5nID09IDAKCSAgICAmJiB0ZXJtY2FwX2FjdGl2ZQoJICAgICYmIHBfZWsKIyBpZmRlZiBVTklYCgkgICAgJiYgaXNhdHR5KDEpCgkgICAgJiYgaXNhdHR5KHJlYWRfY21kX2ZkKQojIGVuZGlmCgkgICAgJiYgKlRfQ1JWICE9IE5VTCkKICAgIHsKCW91dF9zdHIoVF9DUlYpOwoJY3J2X3N0YXR1cyA9IENSVl9TRU5UOwoJLyogY2hlY2sgZm9yIHRoZSBjaGFyYWN0ZXJzIG5vdywgb3RoZXJ3aXNlIHRoZXkgbWlnaHQgYmUgZWF0ZW4gYnkKCSAqIGdldF9rZXlzdHJva2UoKSAqLwoJb3V0X2ZsdXNoKCk7Cgkodm9pZCl2cGVla2Nfbm9tYXAoKTsKICAgIH0KfQojZW5kaWYKCi8qCiAqIFJldHVybiBUUlVFIHdoZW4gc2F2aW5nIGFuZCByZXN0b3JpbmcgdGhlIHNjcmVlbi4KICovCiAgICBpbnQKc3dhcHBpbmdfc2NyZWVuKCkKewogICAgcmV0dXJuIChmdWxsX3NjcmVlbiAmJiAqVF9USSAhPSBOVUwpOwp9CgojaWZkZWYgRkVBVF9NT1VTRQovKgogKiBzZXRtb3VzZSgpIC0gc3dpdGNoIG1vdXNlIG9uL29mZiBkZXBlbmRpbmcgb24gY3VycmVudCBtb2RlIGFuZCAnbW91c2UnCiAqLwogICAgdm9pZApzZXRtb3VzZSgpCnsKIyBpZmRlZiBGRUFUX01PVVNFX1RUWQogICAgaW50CSAgICBjaGVja2ZvcjsKIyBlbmRpZgoKIyBpZmRlZiBGRUFUX01PVVNFU0hBUEUKICAgIHVwZGF0ZV9tb3VzZXNoYXBlKC0xKTsKIyBlbmRpZgoKIyBpZmRlZiBGRUFUX01PVVNFX1RUWSAvKiBTaG91bGQgYmUgb3V0c2lkZSBwcm9jLCBidXQgbWF5IGJyZWFrIE1PVVNFU0hBUEUgKi8KIyAgaWZkZWYgRkVBVF9HVUkKICAgIC8qIEluIHRoZSBHVUkgdGhlIG1vdXNlIGlzIGFsd2F5cyBlbmFibGVkLiAqLwogICAgaWYgKGd1aS5pbl91c2UpCglyZXR1cm47CiMgIGVuZGlmCiAgICAvKiBiZSBxdWljayB3aGVuIG1vdXNlIGlzIG9mZiAqLwogICAgaWYgKCpwX21vdXNlID09IE5VTCB8fCBoYXNfbW91c2VfdGVybWNvZGUgPT0gMCkKCXJldHVybjsKCiAgICAvKiBkb24ndCBzd2l0Y2ggbW91c2Ugb24gd2hlbiBub3QgaW4gcmF3IG1vZGUgKEV4IG1vZGUpICovCiAgICBpZiAoY3VyX3Rtb2RlICE9IFRNT0RFX1JBVykKICAgIHsKCW1jaF9zZXRtb3VzZShGQUxTRSk7CglyZXR1cm47CiAgICB9CgojICBpZmRlZiBGRUFUX1ZJU1VBTAogICAgaWYgKFZJc3VhbF9hY3RpdmUpCgljaGVja2ZvciA9IE1PVVNFX1ZJU1VBTDsKICAgIGVsc2UKIyAgZW5kaWYKCWlmIChTdGF0ZSA9PSBISVRSRVRVUk4gfHwgU3RhdGUgPT0gQVNLTU9SRSB8fCBTdGF0ZSA9PSBTRVRXU0laRSkKCWNoZWNrZm9yID0gTU9VU0VfUkVUVVJOOwogICAgZWxzZSBpZiAoU3RhdGUgJiBJTlNFUlQpCgljaGVja2ZvciA9IE1PVVNFX0lOU0VSVDsKICAgIGVsc2UgaWYgKFN0YXRlICYgQ01ETElORSkKCWNoZWNrZm9yID0gTU9VU0VfQ09NTUFORDsKICAgIGVsc2UgaWYgKFN0YXRlID09IENPTkZJUk0gfHwgU3RhdGUgPT0gRVhURVJOQ01EKQoJY2hlY2tmb3IgPSAnICc7IC8qIGRvbid0IHVzZSBtb3VzZSBmb3IgIjpjb25maXJtIiBvciAiOiFjbWQiICovCiAgICBlbHNlCgljaGVja2ZvciA9IE1PVVNFX05PUk1BTDsgICAgLyogYXNzdW1lIG5vcm1hbCBtb2RlICovCgogICAgaWYgKG1vdXNlX2hhcyhjaGVja2ZvcikpCgltY2hfc2V0bW91c2UoVFJVRSk7CiAgICBlbHNlCgltY2hfc2V0bW91c2UoRkFMU0UpOwojIGVuZGlmCn0KCi8qCiAqIFJldHVybiBUUlVFIGlmCiAqIC0gImMiIGlzIGluICdtb3VzZScsIG9yCiAqIC0gJ2EnIGlzIGluICdtb3VzZScgYW5kICJjIiBpcyBpbiBNT1VTRV9BLCBvcgogKiAtIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBhIGhlbHAgZmlsZSBhbmQgJ2gnIGlzIGluICdtb3VzZScgYW5kIHdlIGFyZSBpbiBhCiAqICAgbm9ybWFsIGVkaXRpbmcgbW9kZSAobm90IGF0IGhpdC1yZXR1cm4gbWVzc2FnZSkuCiAqLwogICAgaW50Cm1vdXNlX2hhcyhjKQogICAgaW50CSAgICBjOwp7CiAgICBjaGFyX3UJKnA7CgogICAgZm9yIChwID0gcF9tb3VzZTsgKnA7ICsrcCkKCXN3aXRjaCAoKnApCgl7CgkgICAgY2FzZSAnYSc6IGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKilNT1VTRV9BLCBjKSAhPSBOVUxMKQoJCQkgIHJldHVybiBUUlVFOwoJCSAgICAgIGJyZWFrOwoJICAgIGNhc2UgTU9VU0VfSEVMUDogaWYgKGMgIT0gTU9VU0VfUkVUVVJOICYmIGN1cmJ1Zi0+Yl9oZWxwKQoJCQkJIHJldHVybiBUUlVFOwoJCQkgICAgIGJyZWFrOwoJICAgIGRlZmF1bHQ6IGlmIChjID09ICpwKSByZXR1cm4gVFJVRTsgYnJlYWs7Cgl9CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qCiAqIFJldHVybiBUUlVFIHdoZW4gJ21vdXNlbW9kZWwnIGlzIHNldCB0byAicG9wdXAiIG9yICJwb3B1cF9zZXRwb3MiLgogKi8KICAgIGludAptb3VzZV9tb2RlbF9wb3B1cCgpCnsKICAgIHJldHVybiAocF9tb3VzZW1bMF0gPT0gJ3AnKTsKfQojZW5kaWYKCi8qCiAqIEJ5IG91dHB1dHRpbmcgdGhlICdjdXJzb3IgdmVyeSB2aXNpYmxlJyB0ZXJtY2FwIGNvZGUsIGZvciBzb21lIHdpbmRvd2VkCiAqIHRlcm1pbmFscyB0aGlzIG1ha2VzIHRoZSBzY3JlZW4gc2Nyb2xsZWQgdG8gdGhlIGNvcnJlY3QgcG9zaXRpb24uCiAqIFVzZWQgd2hlbiBzdGFydGluZyBWaW0gb3IgcmV0dXJuaW5nIGZyb20gYSBzaGVsbC4KICovCiAgICB2b2lkCnNjcm9sbF9zdGFydCgpCnsKICAgIGlmICgqVF9WUyAhPSBOVUwpCiAgICB7CglvdXRfc3RyKFRfVlMpOwoJb3V0X3N0cihUX1ZFKTsKCXNjcmVlbl9zdGFydCgpOwkJCS8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwogICAgfQp9CgpzdGF0aWMgaW50IGN1cnNvcl9pc19vZmYgPSBGQUxTRTsKCi8qCiAqIEVuYWJsZSB0aGUgY3Vyc29yLgogKi8KICAgIHZvaWQKY3Vyc29yX29uKCkKewogICAgaWYgKGN1cnNvcl9pc19vZmYpCiAgICB7CglvdXRfc3RyKFRfVkUpOwoJY3Vyc29yX2lzX29mZiA9IEZBTFNFOwogICAgfQp9CgovKgogKiBEaXNhYmxlIHRoZSBjdXJzb3IuCiAqLwogICAgdm9pZApjdXJzb3Jfb2ZmKCkKewogICAgaWYgKGZ1bGxfc2NyZWVuKQogICAgewoJaWYgKCFjdXJzb3JfaXNfb2ZmKQoJICAgIG91dF9zdHIoVF9WSSk7CSAgICAvKiBkaXNhYmxlIGN1cnNvciAqLwoJY3Vyc29yX2lzX29mZiA9IFRSVUU7CiAgICB9Cn0KCiNpZiBkZWZpbmVkKENVUlNPUl9TSEFQRSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogU2V0IGN1cnNvciBzaGFwZSB0byBtYXRjaCBJbnNlcnQgbW9kZS4KICovCiAgICB2b2lkCnRlcm1fY3Vyc29yX3NoYXBlKCkKewogICAgc3RhdGljIGludCBzaG93aW5nX2luc2VydF9tb2RlID0gTUFZQkU7CgogICAgaWYgKCFmdWxsX3NjcmVlbiB8fCAqVF9DU0kgPT0gTlVMIHx8ICpUX0NFSSA9PSBOVUwpCglyZXR1cm47CgogICAgaWYgKFN0YXRlICYgSU5TRVJUKQogICAgewoJaWYgKHNob3dpbmdfaW5zZXJ0X21vZGUgIT0gVFJVRSkKCSAgICBvdXRfc3RyKFRfQ1NJKTsJICAgIC8qIEluc2VydCBtb2RlIGN1cnNvciAqLwoJc2hvd2luZ19pbnNlcnRfbW9kZSA9IFRSVUU7CiAgICB9CiAgICBlbHNlCiAgICB7CglpZiAoc2hvd2luZ19pbnNlcnRfbW9kZSAhPSBGQUxTRSkKCSAgICBvdXRfc3RyKFRfQ0VJKTsJICAgIC8qIG5vbi1JbnNlcnQgbW9kZSBjdXJzb3IgKi8KCXNob3dpbmdfaW5zZXJ0X21vZGUgPSBGQUxTRTsKICAgIH0KfQojZW5kaWYKCi8qCiAqIFNldCBzY3JvbGxpbmcgcmVnaW9uIGZvciB3aW5kb3cgJ3dwJy4KICogVGhlIHJlZ2lvbiBzdGFydHMgJ29mZicgbGluZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHdpbmRvdy4KICogQWxzbyBzZXQgdGhlIHZlcnRpY2FsIHNjcm9sbCByZWdpb24gZm9yIGEgdmVydGljYWxseSBzcGxpdCB3aW5kb3cuICBBbHdheXMKICogdGhlIGZ1bGwgd2lkdGggb2YgdGhlIHdpbmRvdywgZXhjbHVkaW5nIHRoZSB2ZXJ0aWNhbCBzZXBhcmF0b3IuCiAqLwogICAgdm9pZApzY3JvbGxfcmVnaW9uX3NldCh3cCwgb2ZmKQogICAgd2luX1QJKndwOwogICAgaW50CQlvZmY7CnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTLCBXX1dJTlJPVyh3cCkgKyB3cC0+d19oZWlnaHQgLSAxLAoJCQkJCQkJIFdfV0lOUk9XKHdwKSArIG9mZikpOwojaWZkZWYgRkVBVF9WRVJUU1BMSVQKICAgIGlmICgqVF9DU1YgIT0gTlVMICYmIHdwLT53X3dpZHRoICE9IENvbHVtbnMpCglPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DU1YsIFdfV0lOQ09MKHdwKSArIHdwLT53X3dpZHRoIC0gMSwKCQkJCQkJCSAgICAgICBXX1dJTkNPTCh3cCkpKTsKI2VuZGlmCiAgICBzY3JlZW5fc3RhcnQoKTsJCSAgICAvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KfQoKLyoKICogUmVzZXQgc2Nyb2xsaW5nIHJlZ2lvbiB0byB0aGUgd2hvbGUgc2NyZWVuLgogKi8KICAgIHZvaWQKc2Nyb2xsX3JlZ2lvbl9yZXNldCgpCnsKICAgIE9VVF9TVFIodGdvdG8oKGNoYXIgKilUX0NTLCAoaW50KVJvd3MgLSAxLCAwKSk7CiNpZmRlZiBGRUFUX1ZFUlRTUExJVAogICAgaWYgKCpUX0NTViAhPSBOVUwpCglPVVRfU1RSKHRnb3RvKChjaGFyICopVF9DU1YsIChpbnQpQ29sdW1ucyAtIDEsIDApKTsKI2VuZGlmCiAgICBzY3JlZW5fc3RhcnQoKTsJCSAgICAvKiBkb24ndCBrbm93IHdoZXJlIGN1cnNvciBpcyBub3cgKi8KfQoKCi8qCiAqIExpc3Qgb2YgdGVybWluYWwgY29kZXMgdGhhdCBhcmUgY3VycmVudGx5IHJlY29nbml6ZWQuCiAqLwoKc3RhdGljIHN0cnVjdCB0ZXJtY29kZQp7CiAgICBjaGFyX3UgIG5hbWVbMl07CSAgICAvKiB0ZXJtY2FwIG5hbWUgb2YgZW50cnkgKi8KICAgIGNoYXJfdSAgKmNvZGU7CSAgICAvKiB0ZXJtaW5hbCBjb2RlIChpbiBhbGxvY2F0ZWQgbWVtb3J5KSAqLwogICAgaW50CSAgICBsZW47CSAgICAvKiBTVFJMRU4oY29kZSkgKi8KICAgIGludAkgICAgbW9kbGVuOwkgICAgLyogbGVuZ3RoIG9mIHBhcnQgYmVmb3JlICI7Kn4iLiAqLwp9ICp0ZXJtY29kZXMgPSBOVUxMOwoKc3RhdGljIGludCAgdGNfbWF4X2xlbiA9IDA7IC8qIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgdGVybWNvZGVzW10gY2FuIGhvbGQgKi8Kc3RhdGljIGludCAgdGNfbGVuID0gMDsJICAgIC8qIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGVybWNvZGVzW10gKi8KCnN0YXRpYyBpbnQgdGVybWNvZGVfc3RhciBfX0FSR1MoKGNoYXJfdSAqY29kZSwgaW50IGxlbikpOwoKICAgIHZvaWQKY2xlYXJfdGVybWNvZGVzKCkKewogICAgd2hpbGUgKHRjX2xlbiA+IDApCgl2aW1fZnJlZSh0ZXJtY29kZXNbLS10Y19sZW5dLmNvZGUpOwogICAgdmltX2ZyZWUodGVybWNvZGVzKTsKICAgIHRlcm1jb2RlcyA9IE5VTEw7CiAgICB0Y19tYXhfbGVuID0gMDsKCiNpZmRlZiBIQVZFX1RHRVRFTlQKICAgIEJDID0gKGNoYXIgKillbXB0eV9vcHRpb247CiAgICBVUCA9IChjaGFyICopZW1wdHlfb3B0aW9uOwogICAgUEMgPSBOVUw7CQkJLyogc2V0IHBhZCBjaGFyYWN0ZXIgdG8gTlVMICovCiAgICBvc3BlZWQgPSAwOwojZW5kaWYKCiAgICBuZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCn0KCiNkZWZpbmUgQVRDX0ZST01fVEVSTSA1NQoKLyoKICogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBsaXN0IG9mIHRlcm1pbmFsIGNvZGVzLgogKiBUaGUgbGlzdCBpcyBrZXB0IGFscGhhYmV0aWNhbCBmb3IgIjpzZXQgdGVybWNhcCIKICogImZsYWdzIiBpcyBUUlVFIHdoZW4gcmVwbGFjaW5nIDctYml0IGJ5IDgtYml0IGNvbnRyb2xzIGlzIGRlc2lyZWQuCiAqICJmbGFncyIgY2FuIGFsc28gYmUgQVRDX0ZST01fVEVSTSBmb3IgZ290X2NvZGVfZnJvbV90ZXJtKCkuCiAqLwogICAgdm9pZAphZGRfdGVybWNvZGUobmFtZSwgc3RyaW5nLCBmbGFncykKICAgIGNoYXJfdQkqbmFtZTsKICAgIGNoYXJfdQkqc3RyaW5nOwogICAgaW50CQlmbGFnczsKewogICAgc3RydWN0IHRlcm1jb2RlICpuZXdfdGM7CiAgICBpbnQJCSAgICBpLCBqOwogICAgY2hhcl91CSAgICAqczsKICAgIGludAkJICAgIGxlbjsKCiAgICBpZiAoc3RyaW5nID09IE5VTEwgfHwgKnN0cmluZyA9PSBOVUwpCiAgICB7CglkZWxfdGVybWNvZGUobmFtZSk7CglyZXR1cm47CiAgICB9CgogICAgcyA9IHZpbV9zdHJzYXZlKHN0cmluZyk7CiAgICBpZiAocyA9PSBOVUxMKQoJcmV0dXJuOwoKICAgIC8qIENoYW5nZSBsZWFkaW5nIDxFc2M+WyB0byBDU0ksIGNoYW5nZSA8RXNjPk8gdG8gPE0tTz4uICovCiAgICBpZiAoZmxhZ3MgIT0gMCAmJiBmbGFncyAhPSBBVENfRlJPTV9URVJNICYmIHRlcm1fN3RvOGJpdChzdHJpbmcpICE9IDApCiAgICB7CgltY2hfbWVtbW92ZShzLCBzICsgMSwgU1RSTEVOKHMpKTsKCXNbMF0gPSB0ZXJtXzd0bzhiaXQoc3RyaW5nKTsKICAgIH0KICAgIGxlbiA9IChpbnQpU1RSTEVOKHMpOwoKICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsJCS8qIG5lZWQgdG8gZmlsbCB0ZXJtbGVhZGVyW10gKi8KCiAgICAvKgogICAgICogbmVlZCB0byBtYWtlIHNwYWNlIGZvciBtb3JlIGVudHJpZXMKICAgICAqLwogICAgaWYgKHRjX2xlbiA9PSB0Y19tYXhfbGVuKQogICAgewoJdGNfbWF4X2xlbiArPSAyMDsKCW5ld190YyA9IChzdHJ1Y3QgdGVybWNvZGUgKilhbGxvYygKCQkJICAgICh1bnNpZ25lZCkodGNfbWF4X2xlbiAqIHNpemVvZihzdHJ1Y3QgdGVybWNvZGUpKSk7CglpZiAobmV3X3RjID09IE5VTEwpCgl7CgkgICAgdGNfbWF4X2xlbiAtPSAyMDsKCSAgICByZXR1cm47Cgl9Cglmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCgkgICAgbmV3X3RjW2ldID0gdGVybWNvZGVzW2ldOwoJdmltX2ZyZWUodGVybWNvZGVzKTsKCXRlcm1jb2RlcyA9IG5ld190YzsKICAgIH0KCiAgICAvKgogICAgICogTG9vayBmb3IgZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSBuYW1lLCBpdCBpcyByZXBsYWNlZC4KICAgICAqIExvb2sgZm9yIGFuIGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgYWxwaGFiZXRpY2FsIGhpZ2hlciwgdGhlIG5ldyBlbnRyeQogICAgICogaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2YgaXQuCiAgICAgKi8KICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKICAgIHsKCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA8IG5hbWVbMF0pCgkgICAgY29udGludWU7CglpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPT0gbmFtZVswXSkKCXsKCSAgICBpZiAodGVybWNvZGVzW2ldLm5hbWVbMV0gPCBuYW1lWzFdKQoJCWNvbnRpbnVlOwoJICAgIC8qCgkgICAgICogRXhhY3QgbWF0Y2g6IE1heSByZXBsYWNlIG9sZCBjb2RlLgoJICAgICAqLwoJICAgIGlmICh0ZXJtY29kZXNbaV0ubmFtZVsxXSA9PSBuYW1lWzFdKQoJICAgIHsKCQlpZiAoZmxhZ3MgPT0gQVRDX0ZST01fVEVSTSAmJiAoaiA9IHRlcm1jb2RlX3N0YXIoCgkJCQkgICAgdGVybWNvZGVzW2ldLmNvZGUsIHRlcm1jb2Rlc1tpXS5sZW4pKSA+IDApCgkJewoJCSAgICAvKiBEb24ndCByZXBsYWNlIEVTQ1sxMjM7Klggb3IgRVNDIE8qWCB3aXRoIGFub3RoZXIgd2hlbgoJCSAgICAgKiBpbnZva2VkIGZyb20gZ290X2NvZGVfZnJvbV90ZXJtKCkuICovCgkJICAgIGlmIChsZW4gPT0gdGVybWNvZGVzW2ldLmxlbiAtIGoKCQkJICAgICYmIFNUUk5DTVAocywgdGVybWNvZGVzW2ldLmNvZGUsIGxlbiAtIDEpID09IDAKCQkJICAgICYmIHNbbGVuIC0gMV0KCQkJCSAgID09IHRlcm1jb2Rlc1tpXS5jb2RlW3Rlcm1jb2Rlc1tpXS5sZW4gLSAxXSkKCQkgICAgewoJCQkvKiBUaGV5IGFyZSBlcXVhbCBidXQgZm9yIHRoZSAiOyoiOiBkb24ndCBhZGQgaXQuICovCgkJCXZpbV9mcmVlKHMpOwoJCQlyZXR1cm47CgkJICAgIH0KCQl9CgkJZWxzZQoJCXsKCQkgICAgLyogUmVwbGFjZSBvbGQgY29kZS4gKi8KCQkgICAgdmltX2ZyZWUodGVybWNvZGVzW2ldLmNvZGUpOwoJCSAgICAtLXRjX2xlbjsKCQkgICAgYnJlYWs7CgkJfQoJICAgIH0KCX0KCS8qCgkgKiBGb3VuZCBhbHBoYWJldGljYWwgbGFyZ2VyIGVudHJ5LCBtb3ZlIHJlc3QgdG8gaW5zZXJ0IG5ldyBlbnRyeQoJICovCglmb3IgKGogPSB0Y19sZW47IGogPiBpOyAtLWopCgkgICAgdGVybWNvZGVzW2pdID0gdGVybWNvZGVzW2ogLSAxXTsKCWJyZWFrOwogICAgfQoKICAgIHRlcm1jb2Rlc1tpXS5uYW1lWzBdID0gbmFtZVswXTsKICAgIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID0gbmFtZVsxXTsKICAgIHRlcm1jb2Rlc1tpXS5jb2RlID0gczsKICAgIHRlcm1jb2Rlc1tpXS5sZW4gPSBsZW47CgogICAgLyogRm9yIHh0ZXJtIHdlIHJlY29nbml6ZSBzcGVjaWFsIGNvZGVzIGxpa2UgIkVTQ1s0MjsqWCIgYW5kICJFU0MgTypYIiB0aGF0CiAgICAgKiBhY2NlcHQgbW9kaWZpZXJzLiAqLwogICAgdGVybWNvZGVzW2ldLm1vZGxlbiA9IDA7CiAgICBqID0gdGVybWNvZGVfc3RhcihzLCBsZW4pOwogICAgaWYgKGogPiAwKQoJdGVybWNvZGVzW2ldLm1vZGxlbiA9IGxlbiAtIDEgLSBqOwogICAgKyt0Y19sZW47Cn0KCi8qCiAqIENoZWNrIHRlcm1jb2RlICJjb2RlW2xlbl0iIGZvciBlbmRpbmcgaW4gOypYLCA8RXNjPk8qWCBvciA8TS1PPipYLgogKiBUaGUgIlgiIGNhbiBiZSBhbnkgY2hhcmFjdGVyLgogKiBSZXR1cm4gMCBpZiBub3QgZm91bmQsIDIgZm9yIDsqWCBhbmQgMSBmb3IgTypYIGFuZCA8TS1PPipYLgogKi8KICAgIHN0YXRpYyBpbnQKdGVybWNvZGVfc3Rhcihjb2RlLCBsZW4pCiAgICBjaGFyX3UJKmNvZGU7CiAgICBpbnQJCWxlbjsKewogICAgLyogU2hvcnRlc3QgaXMgPE0tTz4qWC4gIFdpdGggOyBzaG9ydGVzdCBpcyA8Q1NJPjE7KlggKi8KICAgIGlmIChsZW4gPj0gMyAmJiBjb2RlW2xlbiAtIDJdID09ICcqJykKICAgIHsKCWlmIChsZW4gPj0gNSAmJiBjb2RlW2xlbiAtIDNdID09ICc7JykKCSAgICByZXR1cm4gMjsKCWlmICgobGVuID49IDQgJiYgY29kZVtsZW4gLSAzXSA9PSAnTycpIHx8IGNvZGVbbGVuIC0gM10gPT0gJ08nICsgMTI4KQoJICAgIHJldHVybiAxOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCiAgICBjaGFyX3UgICoKZmluZF90ZXJtY29kZShuYW1lKQogICAgY2hhcl91ICAqbmFtZTsKewogICAgaW50CSAgICBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCgkgICAgcmV0dXJuIHRlcm1jb2Rlc1tpXS5jb2RlOwogICAgcmV0dXJuIE5VTEw7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfQ01ETF9DT01QTCkgfHwgZGVmaW5lZChQUk9UTykKICAgIGNoYXJfdSAqCmdldF90ZXJtY29kZShpKQogICAgaW50CSAgICBpOwp7CiAgICBpZiAoaSA+PSB0Y19sZW4pCglyZXR1cm4gTlVMTDsKICAgIHJldHVybiAmdGVybWNvZGVzW2ldLm5hbWVbMF07Cn0KI2VuZGlmCgogICAgdm9pZApkZWxfdGVybWNvZGUobmFtZSkKICAgIGNoYXJfdSAgKm5hbWU7CnsKICAgIGludAkgICAgaTsKCiAgICBpZiAodGVybWNvZGVzID09IE5VTEwpCS8qIG5vdGhpbmcgdGhlcmUgeWV0ICovCglyZXR1cm47CgogICAgbmVlZF9nYXRoZXIgPSBUUlVFOwkJLyogbmVlZCB0byBmaWxsIHRlcm1sZWFkZXJbXSAqLwoKICAgIGZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCWlmICh0ZXJtY29kZXNbaV0ubmFtZVswXSA9PSBuYW1lWzBdICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IG5hbWVbMV0pCgl7CgkgICAgZGVsX3Rlcm1jb2RlX2lkeChpKTsKCSAgICByZXR1cm47Cgl9CiAgICAvKiBub3QgZm91bmQuIEdpdmUgZXJyb3IgbWVzc2FnZT8gKi8KfQoKICAgIHN0YXRpYyB2b2lkCmRlbF90ZXJtY29kZV9pZHgoaWR4KQogICAgaW50CQlpZHg7CnsKICAgIGludAkJaTsKCiAgICB2aW1fZnJlZSh0ZXJtY29kZXNbaWR4XS5jb2RlKTsKICAgIC0tdGNfbGVuOwogICAgZm9yIChpID0gaWR4OyBpIDwgdGNfbGVuOyArK2kpCgl0ZXJtY29kZXNbaV0gPSB0ZXJtY29kZXNbaSArIDFdOwp9CgojaWZkZWYgRkVBVF9URVJNUkVTUE9OU0UKLyoKICogQ2FsbGVkIHdoZW4gZGV0ZWN0ZWQgdGhhdCB0aGUgdGVybWluYWwgc2VuZHMgOC1iaXQgY29kZXMuCiAqIENvbnZlcnQgYWxsIDctYml0IGNvZGVzIHRvIHRoZWlyIDgtYml0IGVxdWl2YWxlbnQuCiAqLwogICAgc3RhdGljIHZvaWQKc3dpdGNoX3RvXzhiaXQoKQp7CiAgICBpbnQJCWk7CiAgICBpbnQJCWM7CgogICAgLyogT25seSBuZWVkIHRvIGRvIHNvbWV0aGluZyB3aGVuIG5vdCBhbHJlYWR5IHVzaW5nIDgtYml0IGNvZGVzLiAqLwogICAgaWYgKCF0ZXJtX2lzXzhiaXQoVF9OQU1FKSkKICAgIHsKCWZvciAoaSA9IDA7IGkgPCB0Y19sZW47ICsraSkKCXsKCSAgICBjID0gdGVybV83dG84Yml0KHRlcm1jb2Rlc1tpXS5jb2RlKTsKCSAgICBpZiAoYyAhPSAwKQoJICAgIHsKCQltY2hfbWVtbW92ZSh0ZXJtY29kZXNbaV0uY29kZSArIDEsIHRlcm1jb2Rlc1tpXS5jb2RlICsgMiwKCQkJCQkgICAgICAgU1RSTEVOKHRlcm1jb2Rlc1tpXS5jb2RlICsgMSkpOwoJCXRlcm1jb2Rlc1tpXS5jb2RlWzBdID0gYzsKCSAgICB9Cgl9CgluZWVkX2dhdGhlciA9IFRSVUU7CQkvKiBuZWVkIHRvIGZpbGwgdGVybWxlYWRlcltdICovCiAgICB9CiAgICBkZXRlY3RlZF84Yml0ID0gVFJVRTsKfQojZW5kaWYKCiNpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKc3RhdGljIGxpbmVucl9UIG9yaWdfdG9wbGluZSA9IDA7CiMgaWZkZWYgRkVBVF9ESUZGCnN0YXRpYyBpbnQgb3JpZ190b3BmaWxsID0gMDsKIyBlbmRpZgojZW5kaWYKI2lmIChkZWZpbmVkKEZFQVRfV0lORE9XUykgJiYgZGVmaW5lZChDSEVDS19ET1VCTEVfQ0xJQ0spKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBDaGVja2luZyBmb3IgZG91YmxlIGNsaWNrcyBvdXJzZWx2ZXMuCiAqICJvcmlnX3RvcGxpbmUiIGlzIHVzZWQgdG8gYXZvaWQgZGV0ZWN0aW5nIGEgZG91YmxlLWNsaWNrIHdoZW4gdGhlIHdpbmRvdwogKiBjb250ZW50cyBzY3JvbGxlZCAoZS5nLiwgd2hlbiAnc2Nyb2xsb2ZmJyBpcyBub24temVybykuCiAqLwovKgogKiBTZXQgb3JpZ190b3BsaW5lLiAgVXNlZCB3aGVuIGp1bXBpbmcgdG8gYW5vdGhlciB3aW5kb3csIHNvIHRoYXQgYSBkb3VibGUKICogY2xpY2sgc3RpbGwgd29ya3MuCiAqLwogICAgdm9pZApzZXRfbW91c2VfdG9wbGluZSh3cCkKICAgIHdpbl9UCSp3cDsKewogICAgb3JpZ190b3BsaW5lID0gd3AtPndfdG9wbGluZTsKIyBpZmRlZiBGRUFUX0RJRkYKICAgIG9yaWdfdG9wZmlsbCA9IHdwLT53X3RvcGZpbGw7CiMgZW5kaWYKfQojZW5kaWYKCi8qCiAqIENoZWNrIGlmIHR5cGVidWYudGJfYnVmW10gY29udGFpbnMgYSB0ZXJtaW5hbCBrZXkgY29kZS4KICogQ2hlY2sgZnJvbSB0eXBlYnVmLnRiX2J1Zlt0eXBlYnVmLnRiX29mZl0gdG8gdHlwZWJ1Zi50Yl9idWZbdHlwZWJ1Zi50Yl9vZmYKICogKyBtYXhfb2Zmc2V0XS4KICogUmV0dXJuIDAgZm9yIG5vIG1hdGNoLCAtMSBmb3IgcGFydGlhbCBtYXRjaCwgPiAwIGZvciBmdWxsIG1hdGNoLgogKiBXaXRoIGEgbWF0Y2gsIHRoZSBtYXRjaCBpcyByZW1vdmVkLCB0aGUgcmVwbGFjZW1lbnQgY29kZSBpcyBpbnNlcnRlZCBpbgogKiB0eXBlYnVmLnRiX2J1ZltdIGFuZCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdHlwZWJ1Zi50Yl9idWZbXSBpcwogKiByZXR1cm5lZC4KICogV2hlbiAiYnVmIiBpcyBub3QgTlVMTCwgaXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHR5cGVidWYudGJfYnVmW10uICJidWZsZW4iIGlzCiAqIHRoZW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ1ZltdLgogKi8KICAgIGludApjaGVja190ZXJtY29kZShtYXhfb2Zmc2V0LCBidWYsIGJ1ZmxlbikKICAgIGludAkJbWF4X29mZnNldDsKICAgIGNoYXJfdQkqYnVmOwogICAgaW50CQlidWZsZW47CnsKICAgIGNoYXJfdQkqdHA7CiAgICBjaGFyX3UJKnA7CiAgICBpbnQJCXNsZW4gPSAwOwkvKiBpbml0IGZvciBHQ0MgKi8KICAgIGludAkJbW9kc2xlbjsKICAgIGludAkJbGVuOwogICAgaW50CQlvZmZzZXQ7CiAgICBjaGFyX3UJa2V5X25hbWVbMl07CiAgICBpbnQJCW1vZGlmaWVyczsKICAgIGludAkJa2V5OwogICAgaW50CQluZXdfc2xlbjsKICAgIGludAkJZXh0cmE7CiAgICBjaGFyX3UJc3RyaW5nW01BWF9LRVlfQ09ERV9MRU4gKyAxXTsKICAgIGludAkJaSwgajsKICAgIGludAkJaWR4ID0gMDsKI2lmZGVmIEZFQVRfTU9VU0UKIyBpZiAhZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9HVUkpCiAgICBjaGFyX3UJYnl0ZXNbNl07CiAgICBpbnQJCW51bV9ieXRlczsKIyBlbmRpZgogICAgaW50CQltb3VzZV9jb2RlID0gMDsJICAgIC8qIGluaXQgZm9yIEdDQyAqLwogICAgaW50CQlpc19jbGljaywgaXNfZHJhZzsKICAgIGludAkJd2hlZWxfY29kZSA9IDA7CiAgICBpbnQJCWN1cnJlbnRfYnV0dG9uOwogICAgc3RhdGljIGludAloZWxkX2J1dHRvbiA9IE1PVVNFX1JFTEVBU0U7CiAgICBzdGF0aWMgaW50CW9yaWdfbnVtX2NsaWNrcyA9IDE7CiAgICBzdGF0aWMgaW50CW9yaWdfbW91c2VfY29kZSA9IDB4MDsKIyBpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKICAgIHN0YXRpYyBpbnQJb3JpZ19tb3VzZV9jb2wgPSAwOwogICAgc3RhdGljIGludAlvcmlnX21vdXNlX3JvdyA9IDA7CiAgICBzdGF0aWMgc3RydWN0IHRpbWV2YWwgIG9yaWdfbW91c2VfdGltZSA9IHswLCAwfTsKCQkJCQkvKiB0aW1lIG9mIHByZXZpb3VzIG1vdXNlIGNsaWNrICovCiAgICBzdHJ1Y3QgdGltZXZhbCAgbW91c2VfdGltZTsJCS8qIHRpbWUgb2YgY3VycmVudCBtb3VzZSBjbGljayAqLwogICAgbG9uZwl0aW1lZGlmZjsJCS8qIGVsYXBzZWQgdGltZSBpbiBtc2VjICovCiMgZW5kaWYKI2VuZGlmCiAgICBpbnQJCWNwb19rb2Zmc2V0OwojaWZkZWYgRkVBVF9NT1VTRV9HUE0KICAgIGV4dGVybiBpbnQJZ3BtX2ZsYWc7IC8qIGdwbSBsaWJyYXJ5IHZhcmlhYmxlICovCiNlbmRpZgoKICAgIGNwb19rb2Zmc2V0ID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19LT0ZGU0VUKSAhPSBOVUxMKTsKCiAgICAvKgogICAgICogU3BlZWQgdXAgdGhlIGNoZWNrcyBmb3IgdGVybWluYWwgY29kZXMgYnkgZ2F0aGVyaW5nIGFsbCBmaXJzdCBieXRlcwogICAgICogdXNlZCBpbiB0ZXJtbGVhZGVyW10uICBPZnRlbiB0aGlzIGlzIGp1c3QgYSBzaW5nbGUgPEVzYz4uCiAgICAgKi8KICAgIGlmIChuZWVkX2dhdGhlcikKCWdhdGhlcl90ZXJtbGVhZGVyKCk7CgogICAgLyoKICAgICAqIENoZWNrIGF0IHNldmVyYWwgcG9zaXRpb25zIGluIHR5cGVidWYudGJfYnVmW10sIHRvIGNhdGNoIHNvbWV0aGluZyBsaWtlCiAgICAgKiAieDxVcD4iIHRoYXQgY2FuIGJlIG1hcHBlZC4gU3RvcCBhdCBtYXhfb2Zmc2V0LCBiZWNhdXNlIGNoYXJhY3RlcnMKICAgICAqIGFmdGVyIHRoYXQgY2Fubm90IGJlIHVzZWQgZm9yIG1hcHBpbmcsIGFuZCB3aXRoIEByIGNvbW1hbmRzCiAgICAgKiB0eXBlYnVmLnRiX2J1ZltdCiAgICAgKiBjYW4gYmVjb21lIHZlcnkgbG9uZy4KICAgICAqIFRoaXMgaXMgdXNlZCBvZnRlbiwgS0VFUCBJVCBGQVNUIQogICAgICovCiAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IG1heF9vZmZzZXQ7ICsrb2Zmc2V0KQogICAgewoJaWYgKGJ1ZiA9PSBOVUxMKQoJewoJICAgIGlmIChvZmZzZXQgPj0gdHlwZWJ1Zi50Yl9sZW4pCgkJYnJlYWs7CgkgICAgdHAgPSB0eXBlYnVmLnRiX2J1ZiArIHR5cGVidWYudGJfb2ZmICsgb2Zmc2V0OwoJICAgIGxlbiA9IHR5cGVidWYudGJfbGVuIC0gb2Zmc2V0OwkvKiBsZW5ndGggb2YgdGhlIGlucHV0ICovCgl9CgllbHNlCgl7CgkgICAgaWYgKG9mZnNldCA+PSBidWZsZW4pCgkJYnJlYWs7CgkgICAgdHAgPSBidWYgKyBvZmZzZXQ7CgkgICAgbGVuID0gYnVmbGVuIC0gb2Zmc2V0OwoJfQoKCS8qCgkgKiBEb24ndCBjaGVjayBjaGFyYWN0ZXJzIGFmdGVyIEtfU1BFQ0lBTCwgdGhvc2UgYXJlIGFscmVhZHkKCSAqIHRyYW5zbGF0ZWQgdGVybWluYWwgY2hhcnMgKGF2b2lkIHRyYW5zbGF0aW5nIH5AXkh4KS4KCSAqLwoJaWYgKCp0cCA9PSBLX1NQRUNJQUwpCgl7CgkgICAgb2Zmc2V0ICs9IDI7CS8qIHRoZXJlIGFyZSBhbHdheXMgMiBleHRyYSBjaGFyYWN0ZXJzICovCgkgICAgY29udGludWU7Cgl9CgoJLyoKCSAqIFNraXAgdGhpcyBwb3NpdGlvbiBpZiB0aGUgY2hhcmFjdGVyIGRvZXMgbm90IGFwcGVhciBhcyB0aGUgZmlyc3QKCSAqIGNoYXJhY3RlciBpbiB0ZXJtX3N0cmluZ3MuIFRoaXMgc3BlZWRzIHVwIGEgbG90LCBzaW5jZSBtb3N0CgkgKiB0ZXJtY29kZXMgc3RhcnQgd2l0aCB0aGUgc2FtZSBjaGFyYWN0ZXIgKEVTQyBvciBDU0kpLgoJICovCglpID0gKnRwOwoJZm9yIChwID0gdGVybWxlYWRlcjsgKnAgJiYgKnAgIT0gaTsgKytwKQoJICAgIDsKCWlmICgqcCA9PSBOVUwpCgkgICAgY29udGludWU7CgoJLyoKCSAqIFNraXAgdGhpcyBwb3NpdGlvbiBpZiBwX2VrIGlzIG5vdCBzZXQgYW5kIHRwWzBdIGlzIGFuIEVTQyBhbmQgd2UKCSAqIGFyZSBpbiBJbnNlcnQgbW9kZS4KCSAqLwoJaWYgKCp0cCA9PSBFU0MgJiYgIXBfZWsgJiYgKFN0YXRlICYgSU5TRVJUKSkKCSAgICBjb250aW51ZTsKCglrZXlfbmFtZVswXSA9IE5VTDsJLyogbm8ga2V5IG5hbWUgZm91bmQgeWV0ICovCglrZXlfbmFtZVsxXSA9IE5VTDsJLyogbm8ga2V5IG5hbWUgZm91bmQgeWV0ICovCgltb2RpZmllcnMgPSAwOwkJLyogbm8gbW9kaWZpZXJzIHlldCAqLwoKI2lmZGVmIEZFQVRfR1VJCglpZiAoZ3VpLmluX3VzZSkKCXsKCSAgICAvKgoJICAgICAqIEdVSSBzcGVjaWFsIGtleSBjb2RlcyBhcmUgYWxsIG9mIHRoZSBmb3JtIFtDU0kgeHhdLgoJICAgICAqLwoJICAgIGlmICgqdHAgPT0gQ1NJKQkgICAgLyogU3BlY2lhbCBrZXkgZnJvbSBHVUkgKi8KCSAgICB7CgkJaWYgKGxlbiA8IDMpCgkJICAgIHJldHVybiAtMTsJICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KCQlzbGVuID0gMzsKCQlrZXlfbmFtZVswXSA9IHRwWzFdOwoJCWtleV9uYW1lWzFdID0gdHBbMl07CgkgICAgfQoJfQoJZWxzZQojZW5kaWYgLyogRkVBVF9HVUkgKi8KCXsKCSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRjX2xlbjsgKytpZHgpCgkgICAgewoJCS8qCgkJICogSWdub3JlIHRoZSBlbnRyeSBpZiB3ZSBhcmUgbm90IGF0IHRoZSBzdGFydCBvZgoJCSAqIHR5cGVidWYudGJfYnVmW10KCQkgKiBhbmQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2hhcmFjdGVycyB0byBtYWtlIGEgbWF0Y2guCgkJICogQnV0IG9ubHkgd2hlbiB0aGUgJ0snIGZsYWcgaXMgaW4gJ2Nwb3B0aW9ucycuCgkJICovCgkJc2xlbiA9IHRlcm1jb2Rlc1tpZHhdLmxlbjsKCQlpZiAoY3BvX2tvZmZzZXQgJiYgb2Zmc2V0ICYmIGxlbiA8IHNsZW4pCgkJICAgIGNvbnRpbnVlOwoJCWlmIChTVFJOQ01QKHRlcm1jb2Rlc1tpZHhdLmNvZGUsIHRwLAoJCQkJICAgICAoc2l6ZV90KShzbGVuID4gbGVuID8gbGVuIDogc2xlbikpID09IDApCgkJewoJCSAgICBpZiAobGVuIDwgc2xlbikJCS8qIGdvdCBhIHBhcnRpYWwgc2VxdWVuY2UgKi8KCQkJcmV0dXJuIC0xOwkJLyogbmVlZCB0byBnZXQgbW9yZSBjaGFycyAqLwoKCQkgICAgLyoKCQkgICAgICogV2hlbiBmb3VuZCBhIGtleXBhZCBrZXksIGNoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIga2V5CgkJICAgICAqIHRoYXQgbWF0Y2hlcyBhbmQgdXNlIHRoYXQgb25lLiAgVGhpcyBtYWtlcyA8SG9tZT4gdG8gYmUKCQkgICAgICogZm91bmQgaW5zdGVhZCBvZiA8a0hvbWU+IHdoZW4gdGhleSBwcm9kdWNlIHRoZSBzYW1lCgkJICAgICAqIGtleSBjb2RlLgoJCSAgICAgKi8KCQkgICAgaWYgKHRlcm1jb2Rlc1tpZHhdLm5hbWVbMF0gPT0gJ0snCgkJCQkgICAgICAgJiYgVklNX0lTRElHSVQodGVybWNvZGVzW2lkeF0ubmFtZVsxXSkpCgkJICAgIHsKCQkJZm9yIChqID0gaWR4ICsgMTsgaiA8IHRjX2xlbjsgKytqKQoJCQkgICAgaWYgKHRlcm1jb2Rlc1tqXS5sZW4gPT0gc2xlbiAmJgoJCQkJICAgIFNUUk5DTVAodGVybWNvZGVzW2lkeF0uY29kZSwKCQkJCQkgICAgdGVybWNvZGVzW2pdLmNvZGUsIHNsZW4pID09IDApCgkJCSAgICB7CgkJCQlpZHggPSBqOwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJICAgIH0KCgkJICAgIGtleV9uYW1lWzBdID0gdGVybWNvZGVzW2lkeF0ubmFtZVswXTsKCQkgICAga2V5X25hbWVbMV0gPSB0ZXJtY29kZXNbaWR4XS5uYW1lWzFdOwoJCSAgICBicmVhazsKCQl9CgoJCS8qCgkJICogQ2hlY2sgZm9yIGNvZGUgd2l0aCBtb2RpZmllciwgbGlrZSB4dGVybSB1c2VzOgoJCSAqIDxFc2M+WzEyMzsqWCAgKG1vZHNsZW4gPT0gc2xlbiAtIDMpCgkJICogQWxzbyA8RXNjPk8qWCBhbmQgPE0tTz4qWCAobW9kc2xlbiA9PSBzbGVuIC0gMikuCgkJICogV2hlbiB0aGVyZSBpcyBhIG1vZGlmaWVyIHRoZSAqIG1hdGNoZXMgYSBudW1iZXIuCgkJICogV2hlbiB0aGVyZSBpcyBubyBtb2RpZmllciB0aGUgOyogb3IgKiBpcyBvbWl0dGVkLgoJCSAqLwoJCWlmICh0ZXJtY29kZXNbaWR4XS5tb2RsZW4gPiAwKQoJCXsKCQkgICAgbW9kc2xlbiA9IHRlcm1jb2Rlc1tpZHhdLm1vZGxlbjsKCQkgICAgaWYgKGNwb19rb2Zmc2V0ICYmIG9mZnNldCAmJiBsZW4gPCBtb2RzbGVuKQoJCQljb250aW51ZTsKCQkgICAgaWYgKFNUUk5DTVAodGVybWNvZGVzW2lkeF0uY29kZSwgdHAsCgkJCQkoc2l6ZV90KShtb2RzbGVuID4gbGVuID8gbGVuIDogbW9kc2xlbikpID09IDApCgkJICAgIHsKCQkJaW50CSAgICBuOwoKCQkJaWYgKGxlbiA8PSBtb2RzbGVuKQkvKiBnb3QgYSBwYXJ0aWFsIHNlcXVlbmNlICovCgkJCSAgICByZXR1cm4gLTE7CQkvKiBuZWVkIHRvIGdldCBtb3JlIGNoYXJzICovCgoJCQlpZiAodHBbbW9kc2xlbl0gPT0gdGVybWNvZGVzW2lkeF0uY29kZVtzbGVuIC0gMV0pCgkJCSAgICBzbGVuID0gbW9kc2xlbiArIDE7CS8qIG5vIG1vZGlmaWVycyAqLwoJCQllbHNlIGlmICh0cFttb2RzbGVuXSAhPSAnOycgJiYgbW9kc2xlbiA9PSBzbGVuIC0gMykKCQkJICAgIGNvbnRpbnVlOwkvKiBubyBtYXRjaCAqLwoJCQllbHNlCgkJCXsKCQkJICAgIC8qIFNraXAgb3ZlciB0aGUgZGlnaXRzLCB0aGUgZmluYWwgY2hhciBtdXN0CgkJCSAgICAgKiBmb2xsb3cuICovCgkJCSAgICBmb3IgKGogPSBzbGVuIC0gMjsgaiA8IGxlbiAmJiBpc2RpZ2l0KHRwW2pdKTsgKytqKQoJCQkJOwoJCQkgICAgKytqOwoJCQkgICAgaWYgKGxlbiA8IGopCS8qIGdvdCBhIHBhcnRpYWwgc2VxdWVuY2UgKi8KCQkJCXJldHVybiAtMTsJLyogbmVlZCB0byBnZXQgbW9yZSBjaGFycyAqLwoJCQkgICAgaWYgKHRwW2ogLSAxXSAhPSB0ZXJtY29kZXNbaWR4XS5jb2RlW3NsZW4gLSAxXSkKCQkJCWNvbnRpbnVlOwkvKiBubyBtYXRjaCAqLwoKCQkJICAgIC8qIE1hdGNoISAgQ29udmVydCBtb2RpZmllciBiaXRzLiAqLwoJCQkgICAgbiA9IGF0b2koKGNoYXIgKil0cCArIHNsZW4gLSAyKSAtIDE7CgkJCSAgICBpZiAobiAmIDEpCgkJCQltb2RpZmllcnMgfD0gTU9EX01BU0tfU0hJRlQ7CgkJCSAgICBpZiAobiAmIDIpCgkJCQltb2RpZmllcnMgfD0gTU9EX01BU0tfQUxUOwoJCQkgICAgaWYgKG4gJiA0KQoJCQkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0NUUkw7CgkJCSAgICBpZiAobiAmIDgpCgkJCQltb2RpZmllcnMgfD0gTU9EX01BU0tfTUVUQTsKCgkJCSAgICBzbGVuID0gajsKCQkJfQoJCQlrZXlfbmFtZVswXSA9IHRlcm1jb2Rlc1tpZHhdLm5hbWVbMF07CgkJCWtleV9uYW1lWzFdID0gdGVybWNvZGVzW2lkeF0ubmFtZVsxXTsKCQkJYnJlYWs7CgkJICAgIH0KCQl9CgkgICAgfQoJfQoKI2lmZGVmIEZFQVRfVEVSTVJFU1BPTlNFCglpZiAoa2V5X25hbWVbMF0gPT0gTlVMKQoJewoJICAgIC8qIENoZWNrIGZvciB4dGVybSB2ZXJzaW9uIHN0cmluZzogIjxFc2M+Wz57eH07e3ZlcnN9O3t5fWMiLiAgQWxzbwoJICAgICAqIGVhdCBvdGhlciBwb3NzaWJsZSByZXNwb25zZXMgdG8gdF9SViwgcnh2dCByZXR1cm5zCgkgICAgICogIjxFc2M+Wz8xOzJjIi4gIEFsc28gYWNjZXB0IENTSSBpbnN0ZWFkIG9mIDxFc2M+Wy4gKi8KCSAgICBpZiAoKlRfQ1JWICE9IE5VTCAmJiAoKHRwWzBdID09IEVTQyAmJiB0cFsxXSA9PSAnWycgJiYgbGVuID49IDMpCgkJCQkJICAgICAgIHx8ICh0cFswXSA9PSBDU0kgJiYgbGVuID49IDIpKSkKCSAgICB7CgkJaiA9IDA7CgkJZXh0cmEgPSAwOwoJCWZvciAoaSA9IDIgKyAodHBbMF0gIT0gQ1NJKTsKCQkJaSA8IGxlbiAmJiAoVklNX0lTRElHSVQodHBbaV0pCgkJCSAgICB8fCB0cFtpXSA9PSAnOycgfHwgdHBbaV0gPT0gJy4nKTsgKytpKQoJCSAgICBpZiAodHBbaV0gPT0gJzsnICYmICsraiA9PSAxKQoJCQlleHRyYSA9IGF0b2koKGNoYXIgKil0cCArIGkgKyAxKTsKCQlpZiAoaSA9PSBsZW4pCgkJICAgIHJldHVybiAtMTsJCS8qIG5vdCBlbm91Z2ggY2hhcmFjdGVycyAqLwoKCQkvKiBlYXQgaXQgd2hlbiBhdCBsZWFzdCBvbmUgZGlnaXQgYW5kIGVuZGluZyBpbiAnYycgKi8KCQlpZiAoaSA+IDIgKyAodHBbMF0gIT0gQ1NJKSAmJiB0cFtpXSA9PSAnYycpCgkJewoJCSAgICBjcnZfc3RhdHVzID0gQ1JWX0dPVDsKCgkJICAgIC8qIElmIHRoaXMgY29kZSBzdGFydHMgd2l0aCBDU0ksIHlvdSBjYW4gYmV0IHRoYXQgdGhlCgkJICAgICAqIHRlcm1pbmFsIHVzZXMgOC1iaXQgY29kZXMuICovCgkJICAgIGlmICh0cFswXSA9PSBDU0kpCgkJCXN3aXRjaF90b184Yml0KCk7CgoJCSAgICAvKiByeHZ0IHNlbmRzIGl0cyB2ZXJzaW9uIG51bWJlcjogIjIwNzAzIiBpcyAyLjcuMy4KCQkgICAgICogSWdub3JlIGl0IGZvciB3aGVuIHRoZSB1c2VyIGhhcyBzZXQgJ3Rlcm0nIHRvIHh0ZXJtLAoJCSAgICAgKiBldmVuIHRob3VnaCBpdCdzIGFuIHJ4dnQuICovCgkJICAgIGlmIChleHRyYSA+IDIwMDAwKQoJCQlleHRyYSA9IDA7CgoJCSAgICBpZiAodHBbMSArICh0cFswXSAhPSBDU0kpXSA9PSAnPicgJiYgaiA9PSAyKQoJCSAgICB7CgkJCS8qIGlmIHh0ZXJtIHZlcnNpb24gPj0gOTUgdXNlIG1vdXNlIGRyYWdnaW5nICovCgkJCWlmIChleHRyYSA+PSA5NSkKCQkJICAgIHNldF9vcHRpb25fdmFsdWUoKGNoYXJfdSAqKSJ0dHltIiwgMEwsCgkJCQkJCSAgICAgICAoY2hhcl91ICopInh0ZXJtMiIsIDApOwoJCQkvKiBpZiB4dGVybSB2ZXJzaW9uID49IDE0MSB0cnkgdG8gZ2V0IHRlcm1jYXAgY29kZXMgKi8KCQkJaWYgKGV4dHJhID49IDE0MSkKCQkJewoJCQkgICAgY2hlY2tfZm9yX2NvZGVzID0gVFJVRTsKCQkJICAgIG5lZWRfZ2F0aGVyID0gVFJVRTsKCQkJICAgIHJlcV9jb2Rlc19mcm9tX3Rlcm0oKTsKCQkJfQoJCSAgICB9CiMgaWZkZWYgRkVBVF9FVkFMCgkJICAgIHNldF92aW1fdmFyX3N0cmluZyhWVl9URVJNUkVTUE9OU0UsIHRwLCBpICsgMSk7CiMgZW5kaWYKIyBpZmRlZiBGRUFUX0FVVE9DTUQKCQkgICAgYXBwbHlfYXV0b2NtZHMoRVZFTlRfVEVSTVJFU1BPTlNFLAoJCQkJCQkgICBOVUxMLCBOVUxMLCBGQUxTRSwgY3VyYnVmKTsKIyBlbmRpZgoJCSAgICBrZXlfbmFtZVswXSA9IChpbnQpS1NfRVhUUkE7CgkJICAgIGtleV9uYW1lWzFdID0gKGludClLRV9JR05PUkU7CgkJICAgIHNsZW4gPSBpICsgMTsKCQl9CgkgICAgfQoKCSAgICAvKiBDaGVjayBmb3IgJzxFc2M+UDErcjxoZXggYnl0ZXM+PEVzYz5cJy4gIEEgIjAiIGluc3RlYWQgb2YgdGhlCgkgICAgICogIjEiIG1lYW5zIGFuIGludmFsaWQgcmVxdWVzdC4gKi8KCSAgICBlbHNlIGlmIChjaGVja19mb3JfY29kZXMKCQkgICAgJiYgKCh0cFswXSA9PSBFU0MgJiYgdHBbMV0gPT0gJ1AnICYmIGxlbiA+PSAyKQoJCQl8fCB0cFswXSA9PSBEQ1MpKQoJICAgIHsKCQlqID0gMSArICh0cFswXSAhPSBEQ1MpOwoJCWZvciAoaSA9IGo7IGkgPCBsZW47ICsraSkKCQkgICAgaWYgKCh0cFtpXSA9PSBFU0MgJiYgdHBbaSArIDFdID09ICdcXCcgJiYgaSArIDEgPCBsZW4pCgkJCSAgICB8fCB0cFtpXSA9PSBTVEVSTSkKCQkgICAgewoJCQlpZiAoaSAtIGogPj0gMyAmJiB0cFtqICsgMV0gPT0gJysnICYmIHRwW2ogKyAyXSA9PSAncicpCgkJCSAgICBnb3RfY29kZV9mcm9tX3Rlcm0odHAgKyBqLCBpKTsKCQkJa2V5X25hbWVbMF0gPSAoaW50KUtTX0VYVFJBOwoJCQlrZXlfbmFtZVsxXSA9IChpbnQpS0VfSUdOT1JFOwoJCQlzbGVuID0gaSArIDEgKyAodHBbaV0gPT0gRVNDKTsKCQkJYnJlYWs7CgkJICAgIH0KCgkJaWYgKGkgPT0gbGVuKQoJCSAgICByZXR1cm4gLTE7CQkvKiBub3QgZW5vdWdoIGNoYXJhY3RlcnMgKi8KCSAgICB9Cgl9CiNlbmRpZgoKCWlmIChrZXlfbmFtZVswXSA9PSBOVUwpCgkgICAgY29udGludWU7CSAgICAvKiBObyBtYXRjaCBhdCB0aGlzIHBvc2l0aW9uLCB0cnkgbmV4dCBvbmUgKi8KCgkvKiBXZSBvbmx5IGdldCBoZXJlIHdoZW4gd2UgaGF2ZSBhIGNvbXBsZXRlIHRlcm1jb2RlIG1hdGNoICovCgojaWZkZWYgRkVBVF9NT1VTRQojIGlmZGVmIEZFQVRfR1VJCgkvKgoJICogT25seSBpbiB0aGUgR1VJOiBGZXRjaCB0aGUgcG9pbnRlciBjb29yZGluYXRlcyBvZiB0aGUgc2Nyb2xsIGV2ZW50CgkgKiBzbyB0aGF0IHdlIGtub3cgd2hpY2ggd2luZG93IHRvIHNjcm9sbCBsYXRlci4KCSAqLwoJaWYgKGd1aS5pbl91c2UKCQkmJiBrZXlfbmFtZVswXSA9PSAoaW50KUtTX0VYVFJBCgkJJiYgKGtleV9uYW1lWzFdID09IChpbnQpS0VfWDFNT1VTRQoJCSAgICB8fCBrZXlfbmFtZVsxXSA9PSAoaW50KUtFX1gyTU9VU0UKCQkgICAgfHwga2V5X25hbWVbMV0gPT0gKGludClLRV9NT1VTRURPV04KCQkgICAgfHwga2V5X25hbWVbMV0gPT0gKGludClLRV9NT1VTRVVQKSkKCXsKCSAgICBudW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgNCk7CgkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkJLyogbm90IGVub3VnaCBjb29yZGluYXRlcyAqLwoJCXJldHVybiAtMTsKCSAgICBtb3VzZV9jb2wgPSAxMjggKiAoYnl0ZXNbMF0gLSAnICcgLSAxKSArIGJ5dGVzWzFdIC0gJyAnIC0gMTsKCSAgICBtb3VzZV9yb3cgPSAxMjggKiAoYnl0ZXNbMl0gLSAnICcgLSAxKSArIGJ5dGVzWzNdIC0gJyAnIC0gMTsKCSAgICBzbGVuICs9IG51bV9ieXRlczsKCX0KCWVsc2UKIyBlbmRpZgoJLyoKCSAqIElmIGl0IGlzIGEgbW91c2UgY2xpY2ssIGdldCB0aGUgY29vcmRpbmF0ZXMuCgkgKi8KCWlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX01PVVNFCiMgaWZkZWYgRkVBVF9NT1VTRV9KU0IKCQl8fCBrZXlfbmFtZVswXSA9PSAoaW50KUtTX0pTQlRFUk1fTU9VU0UKIyBlbmRpZgojIGlmZGVmIEZFQVRfTU9VU0VfTkVUCgkJfHwga2V5X25hbWVbMF0gPT0gKGludClLU19ORVRURVJNX01PVVNFCiMgZW5kaWYKIyBpZmRlZiBGRUFUX01PVVNFX0RFQwoJCXx8IGtleV9uYW1lWzBdID09IChpbnQpS1NfREVDX01PVVNFCiMgZW5kaWYKIyBpZmRlZiBGRUFUX01PVVNFX1BURVJNCgkJfHwga2V5X25hbWVbMF0gPT0gKGludClLU19QVEVSTV9NT1VTRQojIGVuZGlmCgkJKQoJewoJICAgIGlzX2NsaWNrID0gaXNfZHJhZyA9IEZBTFNFOwoKIyBpZiAhZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKEZFQVRfTU9VU0VfWFRFUk0pIHx8IGRlZmluZWQoRkVBVF9HVUkpCgkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTU9VU0UpCgkgICAgewoJCS8qCgkJICogRm9yIHh0ZXJtIGFuZCBNU0RPUyB3ZSBnZXQgIjx0X21vdXNlPnNjciIsIHdoZXJlCgkJICogIHMgPT0gZW5jb2RlZCBidXR0b24gc3RhdGU6CgkJICoJICAgMHgyMCA9IGxlZnQgYnV0dG9uIGRvd24KCQkgKgkgICAweDIxID0gbWlkZGxlIGJ1dHRvbiBkb3duCgkJICoJICAgMHgyMiA9IHJpZ2h0IGJ1dHRvbiBkb3duCgkJICoJICAgMHgyMyA9IGFueSBidXR0b24gcmVsZWFzZQoJCSAqCSAgIDB4NjAgPSBidXR0b24gNCBkb3duIChzY3JvbGwgd2hlZWwgZG93bikKCQkgKgkgICAweDYxID0gYnV0dG9uIDUgZG93biAoc2Nyb2xsIHdoZWVsIHVwKQoJCSAqCWFkZCAweDA0IGZvciBTSElGVAoJCSAqCWFkZCAweDA4IGZvciBBTFQKCQkgKglhZGQgMHgxMCBmb3IgQ1RSTAoJCSAqCWFkZCAweDIwIGZvciBtb3VzZSBkcmFnICgweDQwIGlzIGRyYWcgd2l0aCBsZWZ0IGJ1dHRvbikKCQkgKiAgYyA9PSBjb2x1bW4gKyAnICcgKyAxID09IGNvbHVtbiArIDMzCgkJICogIHIgPT0gcm93ICsgJyAnICsgMSA9PSByb3cgKyAzMwoJCSAqCgkJICogVGhlIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWQgb24gdGhyb3VnaCBnbG9iYWwgdmFyaWFibGVzLgoJCSAqIFVnbHksIGJ1dCB0aGlzIGF2b2lkcyB0cm91YmxlIHdpdGggbW91c2UgY2xpY2tzIGF0IGFuCgkJICogdW5leHBlY3RlZCBtb21lbnQgYW5kIGFsbG93cyBmb3IgbWFwcGluZyB0aGVtLgoJCSAqLwoJCWZvciAoOzspCgkJewojaWZkZWYgRkVBVF9HVUkKCQkgICAgaWYgKGd1aS5pbl91c2UpCgkJICAgIHsKCQkJLyogR1VJIHVzZXMgbW9yZSBiaXRzIGZvciBjb2x1bW5zID4gMjIzICovCgkJCW51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCA1KTsKCQkJaWYgKG51bV9ieXRlcyA9PSAtMSkJLyogbm90IGVub3VnaCBjb29yZGluYXRlcyAqLwoJCQkgICAgcmV0dXJuIC0xOwoJCQltb3VzZV9jb2RlID0gYnl0ZXNbMF07CgkJCW1vdXNlX2NvbCA9IDEyOCAqIChieXRlc1sxXSAtICcgJyAtIDEpCgkJCQkJCQkgKyBieXRlc1syXSAtICcgJyAtIDE7CgkJCW1vdXNlX3JvdyA9IDEyOCAqIChieXRlc1szXSAtICcgJyAtIDEpCgkJCQkJCQkgKyBieXRlc1s0XSAtICcgJyAtIDE7CgkJICAgIH0KCQkgICAgZWxzZQojZW5kaWYKCQkgICAgewoJCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBzbGVuLCBieXRlcywgMyk7CgkJCWlmIChudW1fYnl0ZXMgPT0gLTEpCS8qIG5vdCBlbm91Z2ggY29vcmRpbmF0ZXMgKi8KCQkJICAgIHJldHVybiAtMTsKCQkJbW91c2VfY29kZSA9IGJ5dGVzWzBdOwoJCQltb3VzZV9jb2wgPSBieXRlc1sxXSAtICcgJyAtIDE7CgkJCW1vdXNlX3JvdyA9IGJ5dGVzWzJdIC0gJyAnIC0gMTsKCQkgICAgfQoJCSAgICBzbGVuICs9IG51bV9ieXRlczsKCgkJICAgIC8qIElmIHRoZSBmb2xsb3dpbmcgYnl0ZXMgaXMgYWxzbyBhIG1vdXNlIGNvZGUgYW5kIGl0IGhhcwoJCSAgICAgKiB0aGUgc2FtZSBjb2RlLCBkdW1wIHRoaXMgb25lIGFuZCBnZXQgdGhlIG5leHQuICBUaGlzCgkJICAgICAqIG1ha2VzIGRyYWdnaW5nIGEgd2hvbGUgbG90IGZhc3Rlci4gKi8KI2lmZGVmIEZFQVRfR1VJCgkJICAgIGlmIChndWkuaW5fdXNlKQoJCQlqID0gMzsKCQkgICAgZWxzZQojZW5kaWYKCQkJaiA9IHRlcm1jb2Rlc1tpZHhdLmxlbjsKCQkgICAgaWYgKFNUUk5DTVAodHAsIHRwICsgc2xlbiwgKHNpemVfdClqKSA9PSAwCgkJCSAgICAmJiB0cFtzbGVuICsgal0gPT0gbW91c2VfY29kZQoJCQkgICAgJiYgdHBbc2xlbiArIGogKyAxXSAhPSBOVUwKCQkJICAgICYmIHRwW3NsZW4gKyBqICsgMl0gIT0gTlVMCiNpZmRlZiBGRUFUX0dVSQoJCQkgICAgJiYgKCFndWkuaW5fdXNlCgkJCQl8fCAodHBbc2xlbiArIGogKyAzXSAhPSBOVUwKCQkJCQkmJiB0cFtzbGVuICsgaiArIDRdICE9IE5VTCkpCiNlbmRpZgoJCQkgICAgKQoJCQlzbGVuICs9IGo7CgkJICAgIGVsc2UKCQkJYnJlYWs7CgkJfQoKIyAgaWYgIWRlZmluZWQoTVNXSU4pICYmICFkZWZpbmVkKE1TRE9TKQoJCS8qCgkJICogSGFuZGxlIG1vdXNlIGV2ZW50cy4KCQkgKiBSZWNvZ25pemUgdGhlIHh0ZXJtIG1vdXNlIHdoZWVsLCBidXQgbm90IGluIHRoZSBHVUksIHRoZQoJCSAqIExpbnV4IGNvbnNvbGUgd2l0aCBHUE0gYW5kIHRoZSBNUy1ET1Mgb3IgV2luMzIgY29uc29sZQoJCSAqIChtdWx0aS1jbGlja3MgdXNlID49IDB4NjApLgoJCSAqLwoJCWlmIChtb3VzZV9jb2RlID49IE1PVVNFV0hFRUxfTE9XCiMgICBpZmRlZiBGRUFUX0dVSQoJCQkmJiAhZ3VpLmluX3VzZQojICAgZW5kaWYKIyAgIGlmZGVmIEZFQVRfTU9VU0VfR1BNCgkJCSYmIGdwbV9mbGFnID09IDAKIyAgIGVuZGlmCgkJCSkKCQl7CgkJICAgIC8qIEtlZXAgdGhlIG1vdXNlX2NvZGUgYmVmb3JlIGl0J3MgY2hhbmdlZCwgc28gdGhhdCB3ZQoJCSAgICAgKiByZW1lbWJlciB0aGF0IGl0IHdhcyBhIG1vdXNlIHdoZWVsIGNsaWNrLiAqLwoJCSAgICB3aGVlbF9jb2RlID0gbW91c2VfY29kZTsKCQl9CiMgICBpZmRlZiBGRUFUX01PVVNFX1hURVJNCgkJZWxzZSBpZiAoaGVsZF9idXR0b24gPT0gTU9VU0VfUkVMRUFTRQojICAgIGlmZGVmIEZFQVRfR1VJCgkJCSYmICFndWkuaW5fdXNlCiMgICAgZW5kaWYKCQkJJiYgKG1vdXNlX2NvZGUgPT0gMHgyMyB8fCBtb3VzZV9jb2RlID09IDB4MjQpKQoJCXsKCQkgICAgLyogQXBwYXJlbnRseSB1c2VkIGJ5IHJ4dnQgc2Nyb2xsIHdoZWVsLiAqLwoJCSAgICB3aGVlbF9jb2RlID0gbW91c2VfY29kZSAtIDB4MjMgKyBNT1VTRVdIRUVMX0xPVzsKCQl9CiMgICBlbmRpZgoKIyAgIGlmIGRlZmluZWQoVU5JWCkgJiYgZGVmaW5lZChGRUFUX01PVVNFX1RUWSkKCQllbHNlIGlmICh1c2VfeHRlcm1fbW91c2UoKSA+IDEpCgkJewoJCSAgICBpZiAobW91c2VfY29kZSAmIE1PVVNFX0RSQUdfWFRFUk0pCgkJCW1vdXNlX2NvZGUgfD0gTU9VU0VfRFJBRzsKCQl9CiMgICBlbmRpZgojICAgaWZkZWYgRkVBVF9YQ0xJUEJPQVJECgkJZWxzZSBpZiAoIShtb3VzZV9jb2RlICYgTU9VU0VfRFJBRyAmIH5NT1VTRV9DTElDS19NQVNLKSkKCQl7CgkJICAgIGlmICgobW91c2VfY29kZSAmIE1PVVNFX1JFTEVBU0UpID09IE1PVVNFX1JFTEVBU0UpCgkJCXN0b3BfeHRlcm1fdHJhY2UoKTsKCQkgICAgZWxzZQoJCQlzdGFydF94dGVybV90cmFjZShtb3VzZV9jb2RlKTsKCQl9CiMgICBlbmRpZgojICBlbmRpZgoJICAgIH0KIyBlbmRpZiAvKiAhVU5JWCB8fCBGRUFUX01PVVNFX1hURVJNICovCiMgaWZkZWYgRkVBVF9NT1VTRV9ORVQKCSAgICBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19ORVRURVJNX01PVVNFKQoJICAgIHsKCQlpbnQgbWMsIG1yOwoKCQkvKiBleHBlY3QgYSByYXRoZXIgbGltaXRlZCBzZXF1ZW5jZSBsaWtlOiBiYWxhbmNpbmcgewoJCSAqIFwwMzN9Niw0NVxyCgkJICogJzYnIGlzIHRoZSByb3csIDQ1IGlzIHRoZSBjb2x1bW4KCQkgKi8KCQlwID0gdHAgKyBzbGVuOwoJCW1yID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnLCcpCgkJICAgIHJldHVybiAtMTsKCQltYyA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJ1xyJykKCQkgICAgcmV0dXJuIC0xOwoKCQltb3VzZV9jb2wgPSBtYyAtIDE7CgkJbW91c2Vfcm93ID0gbXIgLSAxOwoJCW1vdXNlX2NvZGUgPSBNT1VTRV9MRUZUOwoJCXNsZW4gKz0gKGludCkocCAtICh0cCArIHNsZW4pKTsKCSAgICB9CiMgZW5kaWYJLyogRkVBVF9NT1VTRV9ORVQgKi8KIyBpZmRlZiBGRUFUX01PVVNFX0pTQgoJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX0pTQlRFUk1fTU9VU0UpCgkgICAgewoJCWludCBtdWx0LCB2YWwsIGl0ZXIsIGJ1dHRvbiwgc3RhdHVzOwoKCQkvKiBKU0JURVJNIElucHV0IE1vZGVsCgkJICogXDAzM1swfnp3IHVuaXEgZXNjYXBlIHNlcXVlbmNlCgkJICogKEwteCkgIExlZnQgYnV0dG9uIHByZXNzZWQgLSBub3QgcHJlc3NlZCB4IG5vdCByZXBvcnRpbmcKCQkgKiAoTS14KSAgTWlkZGxlIGJ1dHRvbiBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCgkJICogKFIteCkgIFJpZ2h0IGJ1dHRvbiBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCgkJICogKFNEbWR1KSAgU2luZ2xlICwgRG91YmxlIGNsaWNrLCBtIG1vdXNlIG1vdmUgZCBidXR0b24gZG93bgoJCSAqCQkJCQkJICAgdSBidXR0b24gdXAKCQkgKiAgIyMjICAgWCBjdXJzb3IgcG9zaXRpb24gcGFkZGVkIHRvIDMgZGlnaXRzCgkJICogICMjIyAgIFkgY3Vyc29yIHBvc2l0aW9uIHBhZGRlZCB0byAzIGRpZ2l0cwoJCSAqIChzLXgpICBTSElGVCBrZXkgcHJlc3NlZCAtIG5vdCBwcmVzc2VkIHggbm90IHJlcG9ydGluZwoJCSAqIChjLXgpICBDVFJMIGtleSBwcmVzc2VkIC0gbm90IHByZXNzZWQgeCBub3QgcmVwb3J0aW5nCgkJICogXDAzM1xcIHRlcm1pbmF0ZWluZyBzZXF1ZW5jZQoJCSAqLwoKCQlwID0gdHAgKyBzbGVuOwoJCWJ1dHRvbiA9IG1vdXNlX2NvZGUgPSAwOwoJCXN3aXRjaCAoKnArKykKCQl7CgkJICAgIGNhc2UgJ0wnOiBidXR0b24gPSAxOyBicmVhazsKCQkgICAgY2FzZSAnLSc6IGJyZWFrOwoJCSAgICBjYXNlICd4JzogYnJlYWs7IC8qIGlnbm9yZSBzZXF1ZW5jZSAqLwoJCSAgICBkZWZhdWx0OiAgcmV0dXJuIC0xOyAvKiBVbmtub3duIFJlc3VsdCAqLwoJCX0KCQlzd2l0Y2ggKCpwKyspCgkJewoJCSAgICBjYXNlICdNJzogYnV0dG9uIHw9IDI7IGJyZWFrOwoJCSAgICBjYXNlICctJzogYnJlYWs7CgkJICAgIGNhc2UgJ3gnOiBicmVhazsgLyogaWdub3JlIHNlcXVlbmNlICovCgkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCgkJfQoJCXN3aXRjaCAoKnArKykKCQl7CgkJICAgIGNhc2UgJ1InOiBidXR0b24gfD0gNDsgYnJlYWs7CgkJICAgIGNhc2UgJy0nOiBicmVhazsKCQkgICAgY2FzZSAneCc6IGJyZWFrOyAvKiBpZ25vcmUgc2VxdWVuY2UgKi8KCQkgICAgZGVmYXVsdDogIHJldHVybiAtMTsgLyogVW5rbm93biBSZXN1bHQgKi8KCQl9CgkJc3RhdHVzID0gKnArKzsKCQlmb3IgKHZhbCA9IDAsIG11bHQgPSAxMDAsIGl0ZXIgPSAwOyBpdGVyIDwgMzsgaXRlcisrLAoJCQkJCQkJICAgICAgbXVsdCAvPSAxMCwgcCsrKQoJCSAgICBpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKCQkJdmFsICs9ICgqcCAtICcwJykgKiBtdWx0OwoJCSAgICBlbHNlCgkJCXJldHVybiAtMTsKCQltb3VzZV9jb2wgPSB2YWw7CgkJZm9yICh2YWwgPSAwLCBtdWx0ID0gMTAwLCBpdGVyID0gMDsgaXRlciA8IDM7IGl0ZXIrKywKCQkJCQkJCSAgICAgIG11bHQgLz0gMTAsIHArKykKCQkgICAgaWYgKCpwID49ICcwJyAmJiAqcCA8PSAnOScpCgkJCXZhbCArPSAoKnAgLSAnMCcpICogbXVsdDsKCQkgICAgZWxzZQoJCQlyZXR1cm4gLTE7CgkJbW91c2Vfcm93ID0gdmFsOwoJCXN3aXRjaCAoKnArKykKCQl7CgkJICAgIGNhc2UgJ3MnOiBidXR0b24gfD0gODsgYnJlYWs7ICAvKiBTSElGVCBrZXkgUHJlc3NlZCAqLwoJCSAgICBjYXNlICctJzogYnJlYWs7ICAvKiBOb3QgUHJlc3NlZCAqLwoJCSAgICBjYXNlICd4JzogYnJlYWs7ICAvKiBOb3QgUmVwb3J0aW5nICovCgkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCgkJfQoJCXN3aXRjaCAoKnArKykKCQl7CgkJICAgIGNhc2UgJ2MnOiBidXR0b24gfD0gMTY7IGJyZWFrOyAgLyogQ1RSTCBrZXkgUHJlc3NlZCAqLwoJCSAgICBjYXNlICctJzogYnJlYWs7ICAvKiBOb3QgUHJlc3NlZCAqLwoJCSAgICBjYXNlICd4JzogYnJlYWs7ICAvKiBOb3QgUmVwb3J0aW5nICovCgkJICAgIGRlZmF1bHQ6ICByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCgkJfQoJCWlmICgqcCsrICE9ICdcMDMzJykKCQkgICAgcmV0dXJuIC0xOwoJCWlmICgqcCsrICE9ICdcXCcpCgkJICAgIHJldHVybiAtMTsKCQlzd2l0Y2ggKHN0YXR1cykKCQl7CgkJICAgIGNhc2UgJ0QnOiAvKiBEb3VibGUgQ2xpY2sgKi8KCQkgICAgY2FzZSAnUyc6IC8qIFNpbmdsZSBDbGljayAqLwoJCQlpZiAoYnV0dG9uICYgMSkgbW91c2VfY29kZSB8PSBNT1VTRV9MRUZUOwoJCQlpZiAoYnV0dG9uICYgMikgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEU7CgkJCWlmIChidXR0b24gJiA0KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUOwoJCQlpZiAoYnV0dG9uICYgOCkgbW91c2VfY29kZSB8PSBNT1VTRV9TSElGVDsKCQkJaWYgKGJ1dHRvbiAmIDE2KSBtb3VzZV9jb2RlIHw9IE1PVVNFX0NUUkw7CgkJCWJyZWFrOwoJCSAgICBjYXNlICdtJzogLyogTW91c2UgbW92ZSAqLwoJCQlpZiAoYnV0dG9uICYgMSkgbW91c2VfY29kZSB8PSBNT1VTRV9MRUZUOwoJCQlpZiAoYnV0dG9uICYgMikgbW91c2VfY29kZSB8PSBNT1VTRV9NSURETEU7CgkJCWlmIChidXR0b24gJiA0KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUOwoJCQlpZiAoYnV0dG9uICYgOCkgbW91c2VfY29kZSB8PSBNT1VTRV9TSElGVDsKCQkJaWYgKGJ1dHRvbiAmIDE2KSBtb3VzZV9jb2RlIHw9IE1PVVNFX0NUUkw7CgkJCWlmICgoYnV0dG9uICYgNykgIT0gMCkKCQkJewoJCQkgICAgaGVsZF9idXR0b24gPSBtb3VzZV9jb2RlOwoJCQkgICAgbW91c2VfY29kZSB8PSBNT1VTRV9EUkFHOwoJCQl9CgkJCWlzX2RyYWcgPSBUUlVFOwoJCQlzaG93bW9kZSgpOwoJCQlicmVhazsKCQkgICAgY2FzZSAnZCc6IC8qIEJ1dHRvbiBEb3duICovCgkJCWlmIChidXR0b24gJiAxKSBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQ7CgkJCWlmIChidXR0b24gJiAyKSBtb3VzZV9jb2RlIHw9IE1PVVNFX01JRERMRTsKCQkJaWYgKGJ1dHRvbiAmIDQpIG1vdXNlX2NvZGUgfD0gTU9VU0VfUklHSFQ7CgkJCWlmIChidXR0b24gJiA4KSBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOwoJCQlpZiAoYnV0dG9uICYgMTYpIG1vdXNlX2NvZGUgfD0gTU9VU0VfQ1RSTDsKCQkJYnJlYWs7CgkJICAgIGNhc2UgJ3UnOiAvKiBCdXR0b24gVXAgKi8KCQkJaWYgKGJ1dHRvbiAmIDEpCgkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX0xFRlQgfCBNT1VTRV9SRUxFQVNFOwoJCQlpZiAoYnV0dG9uICYgMikKCQkJICAgIG1vdXNlX2NvZGUgfD0gTU9VU0VfTUlERExFIHwgTU9VU0VfUkVMRUFTRTsKCQkJaWYgKGJ1dHRvbiAmIDQpCgkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX1JJR0hUIHwgTU9VU0VfUkVMRUFTRTsKCQkJaWYgKGJ1dHRvbiAmIDgpCgkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX1NISUZUOwoJCQlpZiAoYnV0dG9uICYgMTYpCgkJCSAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX0NUUkw7CgkJCWJyZWFrOwoJCSAgICBkZWZhdWx0OiByZXR1cm4gLTE7IC8qIFVua25vd24gUmVzdWx0ICovCgkJfQoKCQlzbGVuICs9IChwIC0gKHRwICsgc2xlbikpOwoJICAgIH0KIyBlbmRpZiAvKiBGRUFUX01PVVNFX0pTQiAqLwojIGlmZGVmIEZFQVRfTU9VU0VfREVDCgkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfREVDX01PVVNFKQoJICAgIHsKCSAgICAgICAvKiBUaGUgREVDIExvY2F0b3IgSW5wdXQgTW9kZWwKCQkqIE5ldHRlcm0gZGVsaXZlcnMgdGhlIGNvZGUgc2VxdWVuY2U6CgkJKiAgXDAzM1syOzQ7MjQ7ODAmdyAgKGxlZnQgYnV0dG9uIGRvd24pCgkJKiAgXDAzM1szOzA7MjQ7ODAmdyAgKGxlZnQgYnV0dG9uIHVwKQoJCSogIFwwMzNbNjsxOzI0OzgwJncgIChyaWdodCBidXR0b24gZG93bikKCQkqICBcMDMzWzc7MDsyNDs4MCZ3ICAocmlnaHQgYnV0dG9uIHVwKQoJCSogQ1NJIFBlIDsgUGIgOyBQciA7IFBjIDsgUHAgJiB3CgkJKiBQZSBpcyB0aGUgZXZlbnQgY29kZQoJCSogUGIgaXMgdGhlIGJ1dHRvbiBjb2RlCgkJKiBQciBpcyB0aGUgcm93IGNvb3JkaW5hdGUKCQkqIFBjIGlzIHRoZSBjb2x1bW4gY29vcmRpbmF0ZQoJCSogUHAgaXMgdGhlIHRoaXJkIGNvb3JkaW5hdGUgKHBhZ2UgbnVtYmVyKQoJCSogUGUsIHRoZSBldmVudCBjb2RlIGluZGljYXRlcyB3aGF0IGV2ZW50IGNhdXNlZCB0aGlzIHJlcG9ydAoJCSogICAgVGhlIGZvbGxvd2luZyBldmVudCBjb2RlcyBhcmUgZGVmaW5lZDoKCQkqICAgIDAgLSByZXF1ZXN0LCB0aGUgdGVybWluYWwgcmVjZWl2ZWQgYW4gZXhwbGljaXQgcmVxdWVzdAoJCSoJIGZvciBhIGxvY2F0b3IgcmVwb3J0LCBidXQgdGhlIGxvY2F0b3IgaXMgdW5hdmFpbGFibGUKCQkqICAgIDEgLSByZXF1ZXN0LCB0aGUgdGVybWluYWwgcmVjZWl2ZWQgYW4gZXhwbGljaXQgcmVxdWVzdAoJCSoJIGZvciBhIGxvY2F0b3IgcmVwb3J0CgkJKiAgICAyIC0gbGVmdCBidXR0b24gZG93bgoJCSogICAgMyAtIGxlZnQgYnV0dG9uIHVwCgkJKiAgICA0IC0gbWlkZGxlIGJ1dHRvbiBkb3duCgkJKiAgICA1IC0gbWlkZGxlIGJ1dHRvbiB1cAoJCSogICAgNiAtIHJpZ2h0IGJ1dHRvbiBkb3duCgkJKiAgICA3IC0gcmlnaHQgYnV0dG9uIHVwCgkJKiAgICA4IC0gZm91cnRoIGJ1dHRvbiBkb3duCgkJKiAgICA5IC0gZm91cnRoIGJ1dHRvbiB1cAoJCSogICAgMTAgLSBsb2NhdG9yIG91dHNpZGUgZmlsdGVyIHJlY3RhbmdsZQoJCSogUGIsIHRoZSBidXR0b24gY29kZSwgQVNDSUkgZGVjaW1hbCAwLTE1IGluZGljYXRpbmcgd2hpY2gKCQkqICAgYnV0dG9ucyBhcmUgZG93biBpZiBhbnkuIFRoZSBzdGF0ZSBvZiB0aGUgZm91ciBidXR0b25zCgkJKiAgIG9uIHRoZSBsb2NhdG9yIGNvcnJlc3BvbmQgdG8gdGhlIGxvdyBmb3VyIGJpdHMgb2YgdGhlCgkJKiAgIGRlY2ltYWwgdmFsdWUsCgkJKiAgICIxIiBtZWFucyBidXR0b24gZGVwcmVzc2VkCgkJKiAgIDAgLSBubyBidXR0b25zIGRvd24sCgkJKiAgIDEgLSByaWdodCwKCQkqICAgMiAtIG1pZGRsZSwKCQkqICAgNCAtIGxlZnQsCgkJKiAgIDggLSBmb3VydGgKCQkqIFByIGlzIHRoZSByb3cgY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRvciBwb3NpdGlvbiBpbiB0aGUgcGFnZSwKCQkqICAgZW5jb2RlZCBhcyBhbiBBU0NJSSBkZWNpbWFsIHZhbHVlLgoJCSogICBJZiBQciBpcyBvbWl0dGVkLCB0aGUgbG9jYXRvciBwb3NpdGlvbiBpcyB1bmRlZmluZWQKCQkqICAgKG91dHNpZGUgdGhlIHRlcm1pbmFsIHdpbmRvdyBmb3IgZXhhbXBsZSkuCgkJKiBQYyBpcyB0aGUgY29sdW1uIGNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0b3IgcG9zaXRpb24gaW4gdGhlCgkJKiAgIHBhZ2UsIGVuY29kZWQgYXMgYW4gQVNDSUkgZGVjaW1hbCB2YWx1ZS4KCQkqICAgSWYgUGMgaXMgb21pdHRlZCwgdGhlIGxvY2F0b3IgcG9zaXRpb24gaXMgdW5kZWZpbmVkCgkJKiAgIChvdXRzaWRlIHRoZSB0ZXJtaW5hbCB3aW5kb3cgZm9yIGV4YW1wbGUpLgoJCSogUHAgaXMgdGhlIHBhZ2UgY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRvciBwb3NpdGlvbgoJCSogICBlbmNvZGVkIGFzIGFuIEFTQ0lJIGRlY2ltYWwgdmFsdWUuCgkJKiAgIFRoZSBwYWdlIGNvb3JkaW5hdGUgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGxvY2F0b3IgaXMgb24KCQkqICAgcGFnZSBvbmUgKHRoZSBkZWZhdWx0KS4gIFdlIGlnbm9yZSBpdCBhbnl3YXkuCgkJKi8KCQlpbnQgUGUsIFBiLCBQciwgUGM7CgoJCXAgPSB0cCArIHNsZW47CgoJCS8qIGdldCBldmVudCBzdGF0dXMgKi8KCQlQZSA9IGdldGRpZ2l0cygmcCk7CgkJaWYgKCpwKysgIT0gJzsnKQoJCSAgICByZXR1cm4gLTE7CgoJCS8qIGdldCBidXR0b24gc3RhdHVzICovCgkJUGIgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICc7JykKCQkgICAgcmV0dXJuIC0xOwoKCQkvKiBnZXQgcm93IHN0YXR1cyAqLwoJCVByID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnOycpCgkJICAgIHJldHVybiAtMTsKCgkJLyogZ2V0IGNvbHVtbiBzdGF0dXMgKi8KCQlQYyA9IGdldGRpZ2l0cygmcCk7CgoJCS8qIHRoZSBwYWdlIHBhcmFtZXRlciBpcyBvcHRpb25hbCAqLwoJCWlmICgqcCA9PSAnOycpCgkJewoJCSAgICBwKys7CgkJICAgICh2b2lkKWdldGRpZ2l0cygmcCk7CgkJfQoJCWlmICgqcCsrICE9ICcmJykKCQkgICAgcmV0dXJuIC0xOwoJCWlmICgqcCsrICE9ICd3JykKCQkgICAgcmV0dXJuIC0xOwoKCQltb3VzZV9jb2RlID0gMDsKCQlzd2l0Y2ggKFBlKQoJCXsKCQljYXNlICAwOiByZXR1cm4gLTE7IC8qIHBvc2l0aW9uIHJlcXVlc3Qgd2hpbGUgdW5hdmFpbGFibGUgKi8KCQljYXNlICAxOiAvKiBhIHJlc3BvbnNlIHRvIGEgbG9jYXRvciBwb3NpdGlvbiByZXF1ZXN0IGluY2x1ZGVzCgkJCSAgICB0aGUgc3RhdHVzIG9mIGFsbCBidXR0b25zICovCgkJCSBQYiAmPSA3OyAgIC8qIG1hc2sgb2ZmIGFuZCBpZ25vcmUgZm91cnRoIGJ1dHRvbiAqLwoJCQkgaWYgKFBiICYgNCkKCQkJICAgICBtb3VzZV9jb2RlICA9IE1PVVNFX0xFRlQ7CgkJCSBpZiAoUGIgJiAyKQoJCQkgICAgIG1vdXNlX2NvZGUgID0gTU9VU0VfTUlERExFOwoJCQkgaWYgKFBiICYgMSkKCQkJICAgICBtb3VzZV9jb2RlICA9IE1PVVNFX1JJR0hUOwoJCQkgaWYgKFBiKQoJCQkgewoJCQkgICAgIGhlbGRfYnV0dG9uID0gbW91c2VfY29kZTsKCQkJICAgICBtb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CgkJCSAgICAgV2FudFF1ZXJ5TW91c2UgPSBUUlVFOwoJCQkgfQoJCQkgaXNfZHJhZyA9IFRSVUU7CgkJCSBzaG93bW9kZSgpOwoJCQkgYnJlYWs7CgkJY2FzZSAgMjogbW91c2VfY29kZSA9IE1PVVNFX0xFRlQ7CgkJCSBXYW50UXVlcnlNb3VzZSA9IFRSVUU7CgkJCSBicmVhazsKCQljYXNlICAzOiBtb3VzZV9jb2RlID0gTU9VU0VfUkVMRUFTRSB8IE1PVVNFX0xFRlQ7CgkJCSBicmVhazsKCQljYXNlICA0OiBtb3VzZV9jb2RlID0gTU9VU0VfTUlERExFOwoJCQkgV2FudFF1ZXJ5TW91c2UgPSBUUlVFOwoJCQkgYnJlYWs7CgkJY2FzZSAgNTogbW91c2VfY29kZSA9IE1PVVNFX1JFTEVBU0UgfCBNT1VTRV9NSURETEU7CgkJCSBicmVhazsKCQljYXNlICA2OiBtb3VzZV9jb2RlID0gTU9VU0VfUklHSFQ7CgkJCSBXYW50UXVlcnlNb3VzZSA9IFRSVUU7CgkJCSBicmVhazsKCQljYXNlICA3OiBtb3VzZV9jb2RlID0gTU9VU0VfUkVMRUFTRSB8IE1PVVNFX1JJR0hUOwoJCQkgYnJlYWs7CgkJY2FzZSAgODogcmV0dXJuIC0xOyAvKiBmb3VydGggYnV0dG9uIGRvd24gKi8KCQljYXNlICA5OiByZXR1cm4gLTE7IC8qIGZvdXJ0aCBidXR0b24gdXAgKi8KCQljYXNlIDEwOiByZXR1cm4gLTE7IC8qIG1vdXNlIG91dHNpZGUgb2YgZmlsdGVyIHJlY3RhbmdsZSAqLwoJCWRlZmF1bHQ6IHJldHVybiAtMTsgLyogc2hvdWxkIG5ldmVyIG9jY3VyICovCgkJfQoKCQltb3VzZV9jb2wgPSBQYyAtIDE7CgkJbW91c2Vfcm93ID0gUHIgLSAxOwoKCQlzbGVuICs9IChpbnQpKHAgLSAodHAgKyBzbGVuKSk7CgkgICAgfQojIGVuZGlmIC8qIEZFQVRfTU9VU0VfREVDICovCiMgaWZkZWYgRkVBVF9NT1VTRV9QVEVSTQoJICAgIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX1BURVJNX01PVVNFKQoJICAgIHsKCQlpbnQgYnV0dG9uLCBudW1fY2xpY2tzLCBhY3Rpb24sIG1jLCBtcjsKCgkJcCA9IHRwICsgc2xlbjsKCgkJYWN0aW9uID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnOycpCgkJICAgIHJldHVybiAtMTsKCgkJbW91c2Vfcm93ID0gZ2V0ZGlnaXRzKCZwKTsKCQlpZiAoKnArKyAhPSAnOycpCgkJICAgIHJldHVybiAtMTsKCQltb3VzZV9jb2wgPSBnZXRkaWdpdHMoJnApOwoJCWlmICgqcCsrICE9ICc7JykKCQkgICAgcmV0dXJuIC0xOwoKCQlidXR0b24gPSBnZXRkaWdpdHMoJnApOwoJCW1vdXNlX2NvZGUgPSAwOwoKCQlzd2l0Y2goIGJ1dHRvbiApCgkJewoJCSAgICBjYXNlIDQ6IG1vdXNlX2NvZGUgPSBNT1VTRV9MRUZUOyBicmVhazsKCQkgICAgY2FzZSAxOiBtb3VzZV9jb2RlID0gTU9VU0VfUklHSFQ7IGJyZWFrOwoJCSAgICBjYXNlIDI6IG1vdXNlX2NvZGUgPSBNT1VTRV9NSURETEU7IGJyZWFrOwoJCSAgICBkZWZhdWx0OiByZXR1cm4gLTE7CgkJfQoKCQlzd2l0Y2goIGFjdGlvbiApCgkJewoJCSAgICBjYXNlIDMxOiAvKiBJbml0aWFsIHByZXNzICovCgkJCWlmICgqcCsrICE9ICc7JykKCQkJICAgIHJldHVybiAtMTsKCgkJCW51bV9jbGlja3MgPSBnZXRkaWdpdHMoJnApOyAvKiBOb3QgdXNlZCAqLwoJCQlicmVhazsKCgkJICAgIGNhc2UgMzI6IC8qIFJlbGVhc2UgKi8KCQkJbW91c2VfY29kZSB8PSBNT1VTRV9SRUxFQVNFOwoJCQlicmVhazsKCgkJICAgIGNhc2UgMzM6IC8qIERyYWcgKi8KCQkJaGVsZF9idXR0b24gPSBtb3VzZV9jb2RlOwoJCQltb3VzZV9jb2RlIHw9IE1PVVNFX0RSQUc7CgkJCWJyZWFrOwoKCQkgICAgZGVmYXVsdDoKCQkJcmV0dXJuIC0xOwoJCX0KCgkJaWYgKCpwKysgIT0gJ3QnKQoJCSAgICByZXR1cm4gLTE7CgoJCXNsZW4gKz0gKHAgLSAodHAgKyBzbGVuKSk7CgkgICAgfQojIGVuZGlmIC8qIEZFQVRfTU9VU0VfUFRFUk0gKi8KCgkgICAgLyogSW50ZXJwcmV0IHRoZSBtb3VzZSBjb2RlICovCgkgICAgY3VycmVudF9idXR0b24gPSAobW91c2VfY29kZSAmIE1PVVNFX0NMSUNLX01BU0spOwoJICAgIGlmIChjdXJyZW50X2J1dHRvbiA9PSBNT1VTRV9SRUxFQVNFCiMgaWZkZWYgRkVBVF9NT1VTRV9YVEVSTQoJCSAgICAmJiB3aGVlbF9jb2RlID09IDAKIyBlbmRpZgoJCSAgICApCgkgICAgewoJCS8qCgkJICogSWYgd2UgZ2V0IGEgbW91c2UgZHJhZyBvciByZWxlYXNlIGV2ZW50IHdoZW4KCQkgKiB0aGVyZSBpcyBubyBtb3VzZSBidXR0b24gaGVsZCBkb3duIChoZWxkX2J1dHRvbiA9PQoJCSAqIE1PVVNFX1JFTEVBU0UpLCBwcm9kdWNlIGEgS19JR05PUkUgYmVsb3cuCgkJICogKGNhbiBoYXBwZW4gd2hlbiB5b3UgaG9sZCBkb3duIHR3byBidXR0b25zCgkJICogYW5kIHRoZW4gbGV0IHRoZW0gZ28sIG9yIGNsaWNrIGluIHRoZSBtZW51IGJhciwgYnV0IG5vdAoJCSAqIG9uIGEgbWVudSwgYW5kIGRyYWcgaW50byB0aGUgdGV4dCkuCgkJICovCgkJaWYgKChtb3VzZV9jb2RlICYgTU9VU0VfRFJBRykgPT0gTU9VU0VfRFJBRykKCQkgICAgaXNfZHJhZyA9IFRSVUU7CgkJY3VycmVudF9idXR0b24gPSBoZWxkX2J1dHRvbjsKCSAgICB9CgkgICAgZWxzZSBpZiAod2hlZWxfY29kZSA9PSAwKQoJICAgIHsKIyBpZmRlZiBDSEVDS19ET1VCTEVfQ0xJQ0sKIyAgaWZkZWYgRkVBVF9NT1VTRV9HUE0KIyAgIGlmZGVmIEZFQVRfR1VJCgkJLyoKCQkgKiBPbmx5IGZvciBVbml4LCB3aGVuIEdVSSBvciBncG0gaXMgbm90IGFjdGl2ZSwgd2UgaGFuZGxlCgkJICogbXVsdGktY2xpY2tzIGhlcmUuCgkJICovCgkJaWYgKGdwbV9mbGFnID09IDAgJiYgIWd1aS5pbl91c2UpCiMgICBlbHNlCgkJaWYgKGdwbV9mbGFnID09IDApCiMgICBlbmRpZgojICBlbHNlCiMgICBpZmRlZiBGRUFUX0dVSQoJCWlmICghZ3VpLmluX3VzZSkKIyAgIGVuZGlmCiMgIGVuZGlmCgkJewoJCSAgICAvKgoJCSAgICAgKiBDb21wdXRlIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIHByZXZpb3VzIG1vdXNlIGNsaWNrLgoJCSAgICAgKi8KCQkgICAgZ2V0dGltZW9mZGF5KCZtb3VzZV90aW1lLCBOVUxMKTsKCQkgICAgdGltZWRpZmYgPSAobW91c2VfdGltZS50dl91c2VjCgkJCQkJICAgIC0gb3JpZ19tb3VzZV90aW1lLnR2X3VzZWMpIC8gMTAwMDsKCQkgICAgaWYgKHRpbWVkaWZmIDwgMCkKCQkJLS1vcmlnX21vdXNlX3RpbWUudHZfc2VjOwoJCSAgICB0aW1lZGlmZiArPSAobW91c2VfdGltZS50dl9zZWMKCQkJCQkgICAgIC0gb3JpZ19tb3VzZV90aW1lLnR2X3NlYykgKiAxMDAwOwoJCSAgICBvcmlnX21vdXNlX3RpbWUgPSBtb3VzZV90aW1lOwoJCSAgICBpZiAobW91c2VfY29kZSA9PSBvcmlnX21vdXNlX2NvZGUKCQkJICAgICYmIHRpbWVkaWZmIDwgcF9tb3VzZXQKCQkJICAgICYmIG9yaWdfbnVtX2NsaWNrcyAhPSA0CgkJCSAgICAmJiBvcmlnX21vdXNlX2NvbCA9PSBtb3VzZV9jb2wKCQkJICAgICYmIG9yaWdfbW91c2Vfcm93ID09IG1vdXNlX3JvdwoJCQkgICAgJiYgKChvcmlnX3RvcGxpbmUgPT0gY3Vyd2luLT53X3RvcGxpbmUKI2lmZGVmIEZFQVRfRElGRgoJCQkJICAgICYmIG9yaWdfdG9wZmlsbCA9PSBjdXJ3aW4tPndfdG9wZmlsbAojZW5kaWYKCQkJCSkKI2lmZGVmIEZFQVRfV0lORE9XUwoJCQkJLyogRG91YmxlIGNsaWNrIGluIHRhYiBwYWdlcyBsaW5lIGFsc28gd29ya3MKCQkJCSAqIHdoZW4gd2luZG93IGNvbnRlbnRzIGNoYW5nZXMuICovCgkJCQl8fCAobW91c2Vfcm93ID09IDAgJiYgZmlyc3R3aW4tPndfd2lucm93ID4gMCkKI2VuZGlmCgkJCSAgICAgICApCgkJCSAgICApCgkJCSsrb3JpZ19udW1fY2xpY2tzOwoJCSAgICBlbHNlCgkJCW9yaWdfbnVtX2NsaWNrcyA9IDE7CgkJICAgIG9yaWdfbW91c2VfY29sID0gbW91c2VfY29sOwoJCSAgICBvcmlnX21vdXNlX3JvdyA9IG1vdXNlX3JvdzsKCQkgICAgb3JpZ190b3BsaW5lID0gY3Vyd2luLT53X3RvcGxpbmU7CiNpZmRlZiBGRUFUX0RJRkYKCQkgICAgb3JpZ190b3BmaWxsID0gY3Vyd2luLT53X3RvcGZpbGw7CiNlbmRpZgoJCX0KIyAgaWYgZGVmaW5lZChGRUFUX0dVSSkgfHwgZGVmaW5lZChGRUFUX01PVVNFX0dQTSkKCQllbHNlCgkJICAgIG9yaWdfbnVtX2NsaWNrcyA9IE5VTV9NT1VTRV9DTElDS1MobW91c2VfY29kZSk7CiMgIGVuZGlmCiMgZWxzZQoJCW9yaWdfbnVtX2NsaWNrcyA9IE5VTV9NT1VTRV9DTElDS1MobW91c2VfY29kZSk7CiMgZW5kaWYKCQlpc19jbGljayA9IFRSVUU7CgkJb3JpZ19tb3VzZV9jb2RlID0gbW91c2VfY29kZTsKCSAgICB9CgkgICAgaWYgKCFpc19kcmFnKQoJCWhlbGRfYnV0dG9uID0gbW91c2VfY29kZSAmIE1PVVNFX0NMSUNLX01BU0s7CgoJICAgIC8qCgkgICAgICogVHJhbnNsYXRlIHRoZSBhY3R1YWwgbW91c2UgZXZlbnQgaW50byBhIHBzZXVkbyBtb3VzZSBldmVudC4KCSAgICAgKiBGaXJzdCB3b3JrIG91dCB3aGF0IG1vZGlmaWVycyBhcmUgdG8gYmUgdXNlZC4KCSAgICAgKi8KCSAgICBpZiAob3JpZ19tb3VzZV9jb2RlICYgTU9VU0VfU0hJRlQpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX1NISUZUOwoJICAgIGlmIChvcmlnX21vdXNlX2NvZGUgJiBNT1VTRV9DVFJMKQoJCW1vZGlmaWVycyB8PSBNT0RfTUFTS19DVFJMOwoJICAgIGlmIChvcmlnX21vdXNlX2NvZGUgJiBNT1VTRV9BTFQpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLX0FMVDsKCSAgICBpZiAob3JpZ19udW1fY2xpY2tzID09IDIpCgkJbW9kaWZpZXJzIHw9IE1PRF9NQVNLXzJDTElDSzsKCSAgICBlbHNlIGlmIChvcmlnX251bV9jbGlja3MgPT0gMykKCQltb2RpZmllcnMgfD0gTU9EX01BU0tfM0NMSUNLOwoJICAgIGVsc2UgaWYgKG9yaWdfbnVtX2NsaWNrcyA9PSA0KQoJCW1vZGlmaWVycyB8PSBNT0RfTUFTS180Q0xJQ0s7CgoJICAgIC8qIFdvcmsgb3V0IG91ciBwc2V1ZG8gbW91c2UgZXZlbnQgKi8KCSAgICBrZXlfbmFtZVswXSA9IChpbnQpS1NfRVhUUkE7CgkgICAgaWYgKHdoZWVsX2NvZGUgIT0gMCkKCQlrZXlfbmFtZVsxXSA9ICh3aGVlbF9jb2RlICYgMSkKCQkJCQk/IChpbnQpS0VfTU9VU0VVUCA6IChpbnQpS0VfTU9VU0VET1dOOwoJICAgIGVsc2UKCQlrZXlfbmFtZVsxXSA9IGdldF9wc2V1ZG9fbW91c2VfY29kZShjdXJyZW50X2J1dHRvbiwKCQkJCQkJCSAgIGlzX2NsaWNrLCBpc19kcmFnKTsKCX0KI2VuZGlmIC8qIEZFQVRfTU9VU0UgKi8KCiNpZmRlZiBGRUFUX0dVSQoJLyoKCSAqIElmIHVzaW5nIHRoZSBHVUksIHRoZW4gd2UgZ2V0IG1lbnUgYW5kIHNjcm9sbGJhciBldmVudHMuCgkgKgoJICogQSBtZW51IGV2ZW50IGlzIGVuY29kZWQgYXMgS19TUEVDSUFMLCBLU19NRU5VLCBLRV9GSUxMRVIgZm9sbG93ZWQgYnkKCSAqIGZvdXIgYnl0ZXMgd2hpY2ggYXJlIHRvIGJlIHRha2VuIGFzIGEgcG9pbnRlciB0byB0aGUgdmltbWVudV9UCgkgKiBzdHJ1Y3R1cmUuCgkgKgoJICogQSB0YWIgbGluZSBldmVudCBpcyBlbmNvZGRlZCBhcyBLX1NQRUNJQUwgS1NfVEFCTElORSBuciwgd2hlcmUgIm5yIgoJICogaXMgb25lIGJ5dGUgd2l0aCB0aGUgdGFiIGluZGV4LgoJICoKCSAqIEEgc2Nyb2xsYmFyIGV2ZW50IGlzIEtfU1BFQ0lBTCwgS1NfVkVSX1NDUk9MTEJBUiwgS0VfRklMTEVSIGZvbGxvd2VkCgkgKiBieSBvbmUgYnl0ZSByZXByZXNlbnRpbmcgdGhlIHNjcm9sbGJhciBudW1iZXIsIGFuZCB0aGVuIGZvdXIgYnl0ZXMKCSAqIHJlcHJlc2VudGluZyBhIGxvbmdfdSB3aGljaCBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBzY3JvbGxiYXIuCgkgKgoJICogQSBob3Jpem9udGFsIHNjcm9sbGJhciBldmVudCBpcyBLX1NQRUNJQUwsIEtTX0hPUl9TQ1JPTExCQVIsCgkgKiBLRV9GSUxMRVIgZm9sbG93ZWQgYnkgZm91ciBieXRlcyByZXByZXNlbnRpbmcgYSBsb25nX3Ugd2hpY2ggaXMgdGhlCgkgKiBuZXcgdmFsdWUgb2YgdGhlIHNjcm9sbGJhci4KCSAqLwojIGlmZGVmIEZFQVRfTUVOVQoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19NRU5VKQoJewoJICAgIGxvbmdfdQl2YWw7CgoJICAgIG51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgc2xlbiwgJnZhbCk7CgkgICAgaWYgKG51bV9ieXRlcyA9PSAtMSkKCQlyZXR1cm4gLTE7CgkgICAgY3VycmVudF9tZW51ID0gKHZpbW1lbnVfVCAqKXZhbDsKCSAgICBzbGVuICs9IG51bV9ieXRlczsKCgkgICAgLyogVGhlIG1lbnUgbWF5IGhhdmUgYmVlbiBkZWxldGVkIHJpZ2h0IGFmdGVyIGl0IHdhcyB1c2VkLCBjaGVjawoJICAgICAqIGZvciB0aGF0LiAqLwoJICAgIGlmIChjaGVja19tZW51X3BvaW50ZXIocm9vdF9tZW51LCBjdXJyZW50X21lbnUpID09IEZBSUwpCgkgICAgewoJCWtleV9uYW1lWzBdID0gS1NfRVhUUkE7CgkJa2V5X25hbWVbMV0gPSAoaW50KUtFX0lHTk9SRTsKCSAgICB9Cgl9CiMgZW5kaWYKIyBpZmRlZiBGRUFUX0dVSV9UQUJMSU5FCgllbHNlIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX1RBQkxJTkUpCgl7CgkgICAgLyogU2VsZWN0aW5nIHRhYmxpbmUgdGFiIG9yIHVzaW5nIGl0cyBtZW51LiAqLwoJICAgIG51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCAxKTsKCSAgICBpZiAobnVtX2J5dGVzID09IC0xKQoJCXJldHVybiAtMTsKCSAgICBjdXJyZW50X3RhYiA9IChpbnQpYnl0ZXNbMF07CgkgICAgc2xlbiArPSBudW1fYnl0ZXM7Cgl9CgllbHNlIGlmIChrZXlfbmFtZVswXSA9PSAoaW50KUtTX1RBQk1FTlUpCgl7CgkgICAgLyogU2VsZWN0aW5nIHRhYmxpbmUgdGFiIG9yIHVzaW5nIGl0cyBtZW51LiAqLwoJICAgIG51bV9ieXRlcyA9IGdldF9ieXRlc19mcm9tX2J1Zih0cCArIHNsZW4sIGJ5dGVzLCAyKTsKCSAgICBpZiAobnVtX2J5dGVzID09IC0xKQoJCXJldHVybiAtMTsKCSAgICBjdXJyZW50X3RhYiA9IChpbnQpYnl0ZXNbMF07CgkgICAgY3VycmVudF90YWJtZW51ID0gKGludClieXRlc1sxXTsKCSAgICBzbGVuICs9IG51bV9ieXRlczsKCX0KIyBlbmRpZgojIGlmbmRlZiBVU0VfT05fRkxZX1NDUk9MTAoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19WRVJfU0NST0xMQkFSKQoJewoJICAgIGxvbmdfdQl2YWw7CgoJICAgIC8qIEdldCB0aGUgbGFzdCBzY3JvbGxiYXIgZXZlbnQgaW4gdGhlIHF1ZXVlIG9mIHRoZSBzYW1lIHR5cGUgKi8KCSAgICBqID0gMDsKCSAgICBmb3IgKGkgPSAwOyB0cFtqXSA9PSBDU0kgJiYgdHBbaiArIDFdID09IEtTX1ZFUl9TQ1JPTExCQVIKCQkJCQkJICAgICAmJiB0cFtqICsgMl0gIT0gTlVMOyArK2kpCgkgICAgewoJCWogKz0gMzsKCQludW1fYnl0ZXMgPSBnZXRfYnl0ZXNfZnJvbV9idWYodHAgKyBqLCBieXRlcywgMSk7CgkJaWYgKG51bV9ieXRlcyA9PSAtMSkKCQkgICAgYnJlYWs7CgkJaWYgKGkgPT0gMCkKCQkgICAgY3VycmVudF9zY3JvbGxiYXIgPSAoaW50KWJ5dGVzWzBdOwoJCWVsc2UgaWYgKGN1cnJlbnRfc2Nyb2xsYmFyICE9IChpbnQpYnl0ZXNbMF0pCgkJICAgIGJyZWFrOwoJCWogKz0gbnVtX2J5dGVzOwoJCW51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgaiwgJnZhbCk7CgkJaWYgKG51bV9ieXRlcyA9PSAtMSkKCQkgICAgYnJlYWs7CgkJc2Nyb2xsYmFyX3ZhbHVlID0gdmFsOwoJCWogKz0gbnVtX2J5dGVzOwoJCXNsZW4gPSBqOwoJICAgIH0KCSAgICBpZiAoaSA9PSAwKQkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2Ugb25lICovCgkJcmV0dXJuIC0xOwoJfQoJZWxzZSBpZiAoa2V5X25hbWVbMF0gPT0gKGludClLU19IT1JfU0NST0xMQkFSKQoJewoJICAgIGxvbmdfdQl2YWw7CgoJICAgIC8qIEdldCB0aGUgbGFzdCBob3Jpei4gc2Nyb2xsYmFyIGV2ZW50IGluIHRoZSBxdWV1ZSAqLwoJICAgIGogPSAwOwoJICAgIGZvciAoaSA9IDA7IHRwW2pdID09IENTSSAmJiB0cFtqICsgMV0gPT0gS1NfSE9SX1NDUk9MTEJBUgoJCQkJCQkgICAgICYmIHRwW2ogKyAyXSAhPSBOVUw7ICsraSkKCSAgICB7CgkJaiArPSAzOwoJCW51bV9ieXRlcyA9IGdldF9sb25nX2Zyb21fYnVmKHRwICsgaiwgJnZhbCk7CgkJaWYgKG51bV9ieXRlcyA9PSAtMSkKCQkgICAgYnJlYWs7CgkJc2Nyb2xsYmFyX3ZhbHVlID0gdmFsOwoJCWogKz0gbnVtX2J5dGVzOwoJCXNsZW4gPSBqOwoJICAgIH0KCSAgICBpZiAoaSA9PSAwKQkJLyogbm90IGVub3VnaCBjaGFyYWN0ZXJzIHRvIG1ha2Ugb25lICovCgkJcmV0dXJuIC0xOwoJfQojIGVuZGlmIC8qICFVU0VfT05fRkxZX1NDUk9MTCAqLwojZW5kaWYgLyogRkVBVF9HVUkgKi8KCgkvKgoJICogQ2hhbmdlIDx4SG9tZT4gdG8gPEhvbWU+LCA8eFVwPiB0byA8VXA+LCBldGMuCgkgKi8KCWtleSA9IGhhbmRsZV94X2tleXMoVEVSTUNBUDJLRVkoa2V5X25hbWVbMF0sIGtleV9uYW1lWzFdKSk7CgoJLyoKCSAqIEFkZCBhbnkgbW9kaWZpZXIgY29kZXMgdG8gb3VyIHN0cmluZy4KCSAqLwoJbmV3X3NsZW4gPSAwOwkJLyogTGVuZ3RoIG9mIHdoYXQgd2lsbCByZXBsYWNlIHRoZSB0ZXJtY29kZSAqLwoJaWYgKG1vZGlmaWVycyAhPSAwKQoJewoJICAgIC8qIFNvbWUga2V5cyBoYXZlIHRoZSBtb2RpZmllciBpbmNsdWRlZC4gIE5lZWQgdG8gaGFuZGxlIHRoYXQgaGVyZQoJICAgICAqIHRvIG1ha2UgbWFwcGluZ3Mgd29yay4gKi8KCSAgICBrZXkgPSBzaW1wbGlmeV9rZXkoa2V5LCAmbW9kaWZpZXJzKTsKCSAgICBpZiAobW9kaWZpZXJzICE9IDApCgkgICAgewoJCXN0cmluZ1tuZXdfc2xlbisrXSA9IEtfU1BFQ0lBTDsKCQlzdHJpbmdbbmV3X3NsZW4rK10gPSAoaW50KUtTX01PRElGSUVSOwoJCXN0cmluZ1tuZXdfc2xlbisrXSA9IG1vZGlmaWVyczsKCSAgICB9Cgl9CgoJLyogRmluYWxseSwgYWRkIHRoZSBzcGVjaWFsIGtleSBjb2RlIHRvIG91ciBzdHJpbmcgKi8KCWtleV9uYW1lWzBdID0gS0VZMlRFUk1DQVAwKGtleSk7CglrZXlfbmFtZVsxXSA9IEtFWTJURVJNQ0FQMShrZXkpOwoJaWYgKGtleV9uYW1lWzBdID09IEtTX0tFWSkKCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBrZXlfbmFtZVsxXTsJLyogZnJvbSAiOnNldCA8TS1iPj14eCIgKi8KCWVsc2UKCXsKCSAgICBzdHJpbmdbbmV3X3NsZW4rK10gPSBLX1NQRUNJQUw7CgkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMF07CgkgICAgc3RyaW5nW25ld19zbGVuKytdID0ga2V5X25hbWVbMV07Cgl9CglzdHJpbmdbbmV3X3NsZW5dID0gTlVMOwoJZXh0cmEgPSBuZXdfc2xlbiAtIHNsZW47CglpZiAoYnVmID09IE5VTEwpCgl7CgkgICAgaWYgKGV4dHJhIDwgMCkKCQkvKiByZW1vdmUgbWF0Y2hlZCBjaGFycywgdGFraW5nIGNhcmUgb2Ygbm9yZW1hcCAqLwoJCWRlbF90eXBlYnVmKC1leHRyYSwgb2Zmc2V0KTsKCSAgICBlbHNlIGlmIChleHRyYSA+IDApCgkJLyogaW5zZXJ0IHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkICovCgkJaW5zX3R5cGVidWYoc3RyaW5nICsgc2xlbiwgUkVNQVBfWUVTLCBvZmZzZXQsIEZBTFNFLCBGQUxTRSk7CgoJICAgIC8qCgkgICAgICogQ2FyZWZ1bDogZGVsX3R5cGVidWYoKSBhbmQgaW5zX3R5cGVidWYoKSBtYXkgaGF2ZSByZWFsbG9jYXRlZAoJICAgICAqIHR5cGVidWYudGJfYnVmW10hCgkgICAgICovCgkgICAgbWNoX21lbW1vdmUodHlwZWJ1Zi50Yl9idWYgKyB0eXBlYnVmLnRiX29mZiArIG9mZnNldCwgc3RyaW5nLAoJCQkJCQkJICAgIChzaXplX3QpbmV3X3NsZW4pOwoJfQoJZWxzZQoJewoJICAgIGlmIChleHRyYSA8IDApCgkJLyogcmVtb3ZlIG1hdGNoZWQgY2hhcmFjdGVycyAqLwoJCW1jaF9tZW1tb3ZlKGJ1ZiArIG9mZnNldCwgYnVmICsgb2Zmc2V0IC0gZXh0cmEsCgkJCQkJICAgKHNpemVfdCkoYnVmbGVuICsgb2Zmc2V0ICsgZXh0cmEpKTsKCSAgICBlbHNlIGlmIChleHRyYSA+IDApCgkJLyogaW5zZXJ0IHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkICovCgkJbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0ICsgZXh0cmEsIGJ1ZiArIG9mZnNldCwKCQkJCQkJICAgKHNpemVfdCkoYnVmbGVuIC0gb2Zmc2V0KSk7CgkgICAgbWNoX21lbW1vdmUoYnVmICsgb2Zmc2V0LCBzdHJpbmcsIChzaXplX3QpbmV3X3NsZW4pOwoJfQoJcmV0dXJuIChsZW4gKyBleHRyYSArIG9mZnNldCk7CiAgICB9CgogICAgcmV0dXJuIDA7CQkJICAgIC8qIG5vIG1hdGNoIGZvdW5kICovCn0KCi8qCiAqIFJlcGxhY2UgYW55IHRlcm1pbmFsIGNvZGUgc3RyaW5ncyBpbiBmcm9tW10gd2l0aCB0aGUgZXF1aXZhbGVudCBpbnRlcm5hbAogKiB2aW0gcmVwcmVzZW50YXRpb24uCVRoaXMgaXMgdXNlZCBmb3IgdGhlICJmcm9tIiBhbmQgInRvIiBwYXJ0IG9mIGEKICogbWFwcGluZywgYW5kIHRoZSAidG8iIHBhcnQgb2YgYSBtZW51IGNvbW1hbmQuCiAqIEFueSBzdHJpbmdzIGxpa2UgIjxDLVVQPiIgYXJlIGFsc28gcmVwbGFjZWQsIHVubGVzcyAnY3BvcHRpb25zJyBjb250YWlucwogKiAnPCcuCiAqIEtfU1BFQ0lBTCBieSBpdHNlbGYgaXMgcmVwbGFjZWQgYnkgS19TUEVDSUFMIEtTX1NQRUNJQUwgS0VfRklMTEVSLgogKgogKiBUaGUgcmVwbGFjZW1lbnQgaXMgZG9uZSBpbiByZXN1bHRbXSBhbmQgZmluYWxseSBjb3BpZWQgaW50byBhbGxvY2F0ZWQKICogbWVtb3J5LiBJZiB0aGlzIGFsbCB3b3JrcyB3ZWxsICpidWZwIGlzIHNldCB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYQogKiBwb2ludGVyIHRvIGl0IGlzIHJldHVybmVkLiBJZiBzb21ldGhpbmcgZmFpbHMgKmJ1ZnAgaXMgc2V0IHRvIE5VTEwgYW5kIGZyb20KICogaXMgcmV0dXJuZWQuCiAqCiAqIENUUkwtViBjaGFyYWN0ZXJzIGFyZSByZW1vdmVkLiAgV2hlbiAiZnJvbV9wYXJ0IiBpcyBUUlVFLCBhIHRyYWlsaW5nIENUUkwtVgogKiBpcyBpbmNsdWRlZCwgb3RoZXJ3aXNlIGl0IGlzIHJlbW92ZWQgKGZvciAiOm1hcCB4eCBeViIsIG1hcHMgeHggdG8KICogbm90aGluZykuICBXaGVuICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ0InLCBhIGJhY2tzbGFzaCBjYW4gYmUgdXNlZAogKiBpbnN0ZWFkIG9mIGEgQ1RSTC1WLgogKi8KICAgIGNoYXJfdSAqCnJlcGxhY2VfdGVybWNvZGVzKGZyb20sIGJ1ZnAsIGZyb21fcGFydCwgZG9fbHQsIHNwZWNpYWwpCiAgICBjaGFyX3UJKmZyb207CiAgICBjaGFyX3UJKipidWZwOwogICAgaW50CQlmcm9tX3BhcnQ7CiAgICBpbnQJCWRvX2x0OwkJLyogYWxzbyB0cmFuc2xhdGUgPGx0PiAqLwogICAgaW50CQlzcGVjaWFsOwkvKiBhbHdheXMgYWNjZXB0IDxrZXk+IG5vdGF0aW9uICovCnsKICAgIGludAkJaTsKICAgIGludAkJc2xlbjsKICAgIGludAkJa2V5OwogICAgaW50CQlkbGVuID0gMDsKICAgIGNoYXJfdQkqc3JjOwogICAgaW50CQlkb19iYWNrc2xhc2g7CS8qIGJhY2tzbGFzaCBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyICovCiAgICBpbnQJCWRvX3NwZWNpYWw7CS8qIHJlY29nbml6ZSA8PiBrZXkgY29kZXMgKi8KICAgIGludAkJZG9fa2V5X2NvZGU7CS8qIHJlY29nbml6ZSByYXcga2V5IGNvZGVzICovCiAgICBjaGFyX3UJKnJlc3VsdDsJLyogYnVmZmVyIGZvciByZXN1bHRpbmcgc3RyaW5nICovCgogICAgZG9fYmFja3NsYXNoID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19CU0xBU0gpID09IE5VTEwpOwogICAgZG9fc3BlY2lhbCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fU1BFQ0kpID09IE5VTEwpIHx8IHNwZWNpYWw7CiAgICBkb19rZXlfY29kZSA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fS0VZQ09ERSkgPT0gTlVMTCk7CgogICAgLyoKICAgICAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdHJhbnNsYXRpb24uICBXb3JzdCBjYXNlIGEgc2luZ2xlIGNoYXJhY3RlciBpcwogICAgICogcmVwbGFjZWQgYnkgNiBieXRlcyAoc2hpZnRlZCBzcGVjaWFsIGtleSksIHBsdXMgYSBOVUwgYXQgdGhlIGVuZC4KICAgICAqLwogICAgcmVzdWx0ID0gYWxsb2MoKHVuc2lnbmVkKVNUUkxFTihmcm9tKSAqIDYgKyAxKTsKICAgIGlmIChyZXN1bHQgPT0gTlVMTCkJCS8qIG91dCBvZiBtZW1vcnkgKi8KICAgIHsKCSpidWZwID0gTlVMTDsKCXJldHVybiBmcm9tOwogICAgfQoKICAgIHNyYyA9IGZyb207CgogICAgLyoKICAgICAqIENoZWNrIGZvciAjbiBhdCBzdGFydCBvbmx5OiBmdW5jdGlvbiBrZXkgbgogICAgICovCiAgICBpZiAoZnJvbV9wYXJ0ICYmIHNyY1swXSA9PSAnIycgJiYgVklNX0lTRElHSVQoc3JjWzFdKSkgIC8qIGZ1bmN0aW9uIGtleSAqLwogICAgewoJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CglyZXN1bHRbZGxlbisrXSA9ICdrJzsKCWlmIChzcmNbMV0gPT0gJzAnKQoJICAgIHJlc3VsdFtkbGVuKytdID0gJzsnOwkvKiAjMCBpcyBGMTAgaXMgIms7IiAqLwoJZWxzZQoJICAgIHJlc3VsdFtkbGVuKytdID0gc3JjWzFdOwkvKiAjMyBpcyBGMyBpcyAiazMiICovCglzcmMgKz0gMjsKICAgIH0KCiAgICAvKgogICAgICogQ29weSBlYWNoIGJ5dGUgZnJvbSAqZnJvbSB0byByZXN1bHRbZGxlbl0KICAgICAqLwogICAgd2hpbGUgKCpzcmMgIT0gTlVMKQogICAgewoJLyoKCSAqIElmICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJzwnLCBjaGVjayBmb3Igc3BlY2lhbCBrZXkgY29kZXMsCgkgKiBsaWtlICI8Qy1TLU1vdXNlTGVmdD4iCgkgKi8KCWlmIChkb19zcGVjaWFsICYmIChkb19sdCB8fCBTVFJOQ01QKHNyYywgIjxsdD4iLCA0KSAhPSAwKSkKCXsKI2lmZGVmIEZFQVRfRVZBTAoJICAgIC8qCgkgICAgICogUmVwbGFjZSA8U0lEPiBieSBLX1NOUiA8c2NyaXB0LW5yPiBfLgoJICAgICAqIChyb29tOiA1ICogNiA9IDMwIGJ5dGVzOyBuZWVkZWQ6IDMgKyA8bnI+ICsgMSA8PSAxNCkKCSAgICAgKi8KCSAgICBpZiAoU1RSTklDTVAoc3JjLCAiPFNJRD4iLCA1KSA9PSAwKQoJICAgIHsKCQlpZiAoY3VycmVudF9TSUQgPD0gMCkKCQkgICAgRU1TRyhfKGVfdXNpbmdzaWQpKTsKCQllbHNlCgkJewoJCSAgICBzcmMgKz0gNTsKCQkgICAgcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CgkJICAgIHJlc3VsdFtkbGVuKytdID0gKGludClLU19FWFRSQTsKCQkgICAgcmVzdWx0W2RsZW4rK10gPSAoaW50KUtFX1NOUjsKCQkgICAgc3ByaW50ZigoY2hhciAqKXJlc3VsdCArIGRsZW4sICIlbGQiLCAobG9uZyljdXJyZW50X1NJRCk7CgkJICAgIGRsZW4gKz0gKGludClTVFJMRU4ocmVzdWx0ICsgZGxlbik7CgkJICAgIHJlc3VsdFtkbGVuKytdID0gJ18nOwoJCSAgICBjb250aW51ZTsKCQl9CgkgICAgfQojZW5kaWYKCgkgICAgc2xlbiA9IHRyYW5zX3NwZWNpYWwoJnNyYywgcmVzdWx0ICsgZGxlbiwgVFJVRSk7CgkgICAgaWYgKHNsZW4pCgkgICAgewoJCWRsZW4gKz0gc2xlbjsKCQljb250aW51ZTsKCSAgICB9Cgl9CgoJLyoKCSAqIElmICdjcG9wdGlvbnMnIGRvZXMgbm90IGNvbnRhaW4gJ2snLCBzZWUgaWYgaXQncyBhbiBhY3R1YWwga2V5LWNvZGUuCgkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvIGNoZWNrZWQgYWZ0ZXIgcmVwbGFjaW5nIHRoZSA8PiBmb3JtLgoJICogU2luZ2xlIGNoYXJhY3RlciBjb2RlcyBhcmUgTk9UIHJlcGxhY2VkIChlLmcuIF5IIG9yIERFTCksIGJlY2F1c2UKCSAqIGl0IGNvdWxkIGJlIGEgY2hhcmFjdGVyIGluIHRoZSBmaWxlLgoJICovCglpZiAoZG9fa2V5X2NvZGUpCgl7CgkgICAgaSA9IGZpbmRfdGVybV9ieWtleXMoc3JjKTsKCSAgICBpZiAoaSA+PSAwKQoJICAgIHsKCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKCQlyZXN1bHRbZGxlbisrXSA9IHRlcm1jb2Rlc1tpXS5uYW1lWzBdOwoJCXJlc3VsdFtkbGVuKytdID0gdGVybWNvZGVzW2ldLm5hbWVbMV07CgkJc3JjICs9IHRlcm1jb2Rlc1tpXS5sZW47CgkJLyogSWYgdGVybWluYWwgY29kZSBtYXRjaGVkLCBjb250aW51ZSBhZnRlciBpdC4gKi8KCQljb250aW51ZTsKCSAgICB9Cgl9CgojaWZkZWYgRkVBVF9FVkFMCglpZiAoZG9fc3BlY2lhbCkKCXsKCSAgICBjaGFyX3UJKnAsICpzLCBsZW47CgoJICAgIC8qCgkgICAgICogUmVwbGFjZSA8TGVhZGVyPiBieSB0aGUgdmFsdWUgb2YgIm1hcGxlYWRlciIuCgkgICAgICogUmVwbGFjZSA8TG9jYWxMZWFkZXI+IGJ5IHRoZSB2YWx1ZSBvZiAibWFwbG9jYWxsZWFkZXIiLgoJICAgICAqIElmICJtYXBsZWFkZXIiIG9yICJtYXBsb2NhbGxlYWRlciIgaXNuJ3Qgc2V0IHVzZSBhIGJhY2tzbGFzaC4KCSAgICAgKi8KCSAgICBpZiAoU1RSTklDTVAoc3JjLCAiPExlYWRlcj4iLCA4KSA9PSAwKQoJICAgIHsKCQlsZW4gPSA4OwoJCXAgPSBnZXRfdmFyX3ZhbHVlKChjaGFyX3UgKikiZzptYXBsZWFkZXIiKTsKCSAgICB9CgkgICAgZWxzZSBpZiAoU1RSTklDTVAoc3JjLCAiPExvY2FsTGVhZGVyPiIsIDEzKSA9PSAwKQoJICAgIHsKCQlsZW4gPSAxMzsKCQlwID0gZ2V0X3Zhcl92YWx1ZSgoY2hhcl91ICopImc6bWFwbG9jYWxsZWFkZXIiKTsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQlsZW4gPSAwOwoJCXAgPSBOVUxMOwoJICAgIH0KCSAgICBpZiAobGVuICE9IDApCgkgICAgewoJCS8qIEFsbG93IHVwIHRvIDggKiA2IGNoYXJhY3RlcnMgZm9yICJtYXBsZWFkZXIiLiAqLwoJCWlmIChwID09IE5VTEwgfHwgKnAgPT0gTlVMIHx8IFNUUkxFTihwKSA+IDggKiA2KQoJCSAgICBzID0gKGNoYXJfdSAqKSJcXCI7CgkJZWxzZQoJCSAgICBzID0gcDsKCQl3aGlsZSAoKnMgIT0gTlVMKQoJCSAgICByZXN1bHRbZGxlbisrXSA9ICpzKys7CgkJc3JjICs9IGxlbjsKCQljb250aW51ZTsKCSAgICB9Cgl9CiNlbmRpZgoKCS8qCgkgKiBSZW1vdmUgQ1RSTC1WIGFuZCBpZ25vcmUgdGhlIG5leHQgY2hhcmFjdGVyLgoJICogRm9yICJmcm9tIiBzaWRlIHRoZSBDVFJMLVYgYXQgdGhlIGVuZCBpcyBpbmNsdWRlZCwgZm9yIHRoZSAidG8iCgkgKiBwYXJ0IGl0IGlzIHJlbW92ZWQuCgkgKiBJZiAnY3BvcHRpb25zJyBkb2VzIG5vdCBjb250YWluICdCJywgYWxzbyBhY2NlcHQgYSBiYWNrc2xhc2guCgkgKi8KCWtleSA9ICpzcmM7CglpZiAoa2V5ID09IEN0cmxfViB8fCAoZG9fYmFja3NsYXNoICYmIGtleSA9PSAnXFwnKSkKCXsKCSAgICArK3NyYzsJCQkJLyogc2tpcCBDVFJMLVYgb3IgYmFja3NsYXNoICovCgkgICAgaWYgKCpzcmMgPT0gTlVMKQoJICAgIHsKCQlpZiAoZnJvbV9wYXJ0KQoJCSAgICByZXN1bHRbZGxlbisrXSA9IGtleTsKCQlicmVhazsKCSAgICB9Cgl9CgojaWZkZWYgRkVBVF9NQllURQoJLyogc2tpcCBtdWx0aWJ5dGUgY2hhciBjb3JyZWN0bHkgKi8KCWZvciAoaSA9ICgqbWJfcHRyMmxlbikoc3JjKTsgaSA+IDA7IC0taSkKI2VuZGlmCgl7CgkgICAgLyoKCSAgICAgKiBJZiB0aGUgY2hhcmFjdGVyIGlzIEtfU1BFQ0lBTCwgcmVwbGFjZSBpdCB3aXRoIEtfU1BFQ0lBTAoJICAgICAqIEtTX1NQRUNJQUwgS0VfRklMTEVSLgoJICAgICAqIElmIGNvbXBpbGVkIHdpdGggdGhlIEdVSSByZXBsYWNlIENTSSB3aXRoIEtfQ1NJLgoJICAgICAqLwoJICAgIGlmICgqc3JjID09IEtfU1BFQ0lBTCkKCSAgICB7CgkJcmVzdWx0W2RsZW4rK10gPSBLX1NQRUNJQUw7CgkJcmVzdWx0W2RsZW4rK10gPSBLU19TUEVDSUFMOwoJCXJlc3VsdFtkbGVuKytdID0gS0VfRklMTEVSOwoJICAgIH0KIyBpZmRlZiBGRUFUX0dVSQoJICAgIGVsc2UgaWYgKCpzcmMgPT0gQ1NJKQoJICAgIHsKCQlyZXN1bHRbZGxlbisrXSA9IEtfU1BFQ0lBTDsKCQlyZXN1bHRbZGxlbisrXSA9IEtTX0VYVFJBOwoJCXJlc3VsdFtkbGVuKytdID0gKGludClLRV9DU0k7CgkgICAgfQojIGVuZGlmCgkgICAgZWxzZQoJCXJlc3VsdFtkbGVuKytdID0gKnNyYzsKCSAgICArK3NyYzsKCX0KICAgIH0KICAgIHJlc3VsdFtkbGVuXSA9IE5VTDsKCiAgICAvKgogICAgICogQ29weSB0aGUgbmV3IHN0cmluZyB0byBhbGxvY2F0ZWQgbWVtb3J5LgogICAgICogSWYgdGhpcyBmYWlscywganVzdCByZXR1cm4gZnJvbS4KICAgICAqLwogICAgaWYgKCgqYnVmcCA9IHZpbV9zdHJzYXZlKHJlc3VsdCkpICE9IE5VTEwpCglmcm9tID0gKmJ1ZnA7CiAgICB2aW1fZnJlZShyZXN1bHQpOwogICAgcmV0dXJuIGZyb207Cn0KCi8qCiAqIEZpbmQgYSB0ZXJtY29kZSB3aXRoIGtleXMgJ3NyYycgKG11c3QgYmUgTlVMIHRlcm1pbmF0ZWQpLgogKiBSZXR1cm4gdGhlIGluZGV4IGluIHRlcm1jb2Rlc1tdLCBvciAtMSBpZiBub3QgZm91bmQuCiAqLwogICAgaW50CmZpbmRfdGVybV9ieWtleXMoc3JjKQogICAgY2hhcl91CSpzcmM7CnsKICAgIGludAkJaTsKICAgIGludAkJc2xlbjsKCiAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCiAgICB7CglzbGVuID0gdGVybWNvZGVzW2ldLmxlbjsKCWlmIChzbGVuID4gMSAmJiBTVFJOQ01QKHRlcm1jb2Rlc1tpXS5jb2RlLCBzcmMsIChzaXplX3Qpc2xlbikgPT0gMCkKCSAgICByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiAtMTsKfQoKLyoKICogR2F0aGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXJzIGluIHRoZSB0ZXJtaW5hbCBrZXkgY29kZXMgaW50byBhIHN0cmluZy4KICogVXNlZCB0byBzcGVlZCB1cCBjaGVja190ZXJtY29kZSgpLgogKi8KICAgIHN0YXRpYyB2b2lkCmdhdGhlcl90ZXJtbGVhZGVyKCkKewogICAgaW50CSAgICBpOwogICAgaW50CSAgICBsZW4gPSAwOwoKI2lmZGVmIEZFQVRfR1VJCiAgICBpZiAoZ3VpLmluX3VzZSkKCXRlcm1sZWFkZXJbbGVuKytdID0gQ1NJOyAgICAvKiB0aGUgR1VJIGNvZGVzIGFyZSBub3QgaW4gdGVybWNvZGVzW10gKi8KI2VuZGlmCiNpZmRlZiBGRUFUX1RFUk1SRVNQT05TRQogICAgaWYgKGNoZWNrX2Zvcl9jb2RlcykKCXRlcm1sZWFkZXJbbGVuKytdID0gRENTOyAgICAvKiB0aGUgdGVybWNvZGUgcmVzcG9uc2Ugc3RhcnRzIHdpdGggRENTCgkJCQkgICAgICAgaW4gOC1iaXQgbW9kZSAqLwojZW5kaWYKICAgIHRlcm1sZWFkZXJbbGVuXSA9IE5VTDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgdGNfbGVuOyArK2kpCglpZiAodmltX3N0cmNocih0ZXJtbGVhZGVyLCB0ZXJtY29kZXNbaV0uY29kZVswXSkgPT0gTlVMTCkKCXsKCSAgICB0ZXJtbGVhZGVyW2xlbisrXSA9IHRlcm1jb2Rlc1tpXS5jb2RlWzBdOwoJICAgIHRlcm1sZWFkZXJbbGVuXSA9IE5VTDsKCX0KCiAgICBuZWVkX2dhdGhlciA9IEZBTFNFOwp9CgovKgogKiBTaG93IGFsbCB0ZXJtY29kZXMgKGZvciAiOnNldCB0ZXJtY2FwIikKICogVGhpcyBjb2RlIGxvb2tzIGEgbG90IGxpa2Ugc2hvd29wdGlvbnMoKSwgYnV0IGlzIGRpZmZlcmVudC4KICovCiAgICB2b2lkCnNob3dfdGVybWNvZGVzKCkKewogICAgaW50CQljb2w7CiAgICBpbnQJCSppdGVtczsKICAgIGludAkJaXRlbV9jb3VudDsKICAgIGludAkJcnVuOwogICAgaW50CQlyb3csIHJvd3M7CiAgICBpbnQJCWNvbHM7CiAgICBpbnQJCWk7CiAgICBpbnQJCWxlbjsKCiNkZWZpbmUgSU5DMyAyNwkgICAgLyogdHJ5IHRvIG1ha2UgdGhyZWUgY29sdW1ucyAqLwojZGVmaW5lIElOQzIgNDAJICAgIC8qIHRyeSB0byBtYWtlIHR3byBjb2x1bW5zICovCiNkZWZpbmUgR0FQIDIJICAgIC8qIHNwYWNlcyBiZXR3ZWVuIGNvbHVtbnMgKi8KCiAgICBpZiAodGNfbGVuID09IDApCSAgICAvKiBubyB0ZXJtaW5hbCBjb2RlcyAobXVzdCBiZSBHVUkpICovCglyZXR1cm47CiAgICBpdGVtcyA9IChpbnQgKilhbGxvYygodW5zaWduZWQpKHNpemVvZihpbnQpICogdGNfbGVuKSk7CiAgICBpZiAoaXRlbXMgPT0gTlVMTCkKCXJldHVybjsKCiAgICAvKiBIaWdobGlnaHQgdGl0bGUgKi8KICAgIE1TR19QVVRTX1RJVExFKF8oIlxuLS0tIFRlcm1pbmFsIGtleXMgLS0tIikpOwoKICAgIC8qCiAgICAgKiBkbyB0aGUgbG9vcCB0d28gdGltZXM6CiAgICAgKiAxLiBkaXNwbGF5IHRoZSBzaG9ydCBpdGVtcyAobm9uLXN0cmluZ3MgYW5kIHNob3J0IHN0cmluZ3MpCiAgICAgKiAyLiBkaXNwbGF5IHRoZSBtZWRpdW0gaXRlbXMgKG1lZGl1bSBsZW5ndGggc3RyaW5ncykKICAgICAqIDMuIGRpc3BsYXkgdGhlIGxvbmcgaXRlbXMgKHJlbWFpbmluZyBzdHJpbmdzKQogICAgICovCiAgICBmb3IgKHJ1biA9IDE7IHJ1biA8PSAzICYmICFnb3RfaW50OyArK3J1bikKICAgIHsKCS8qCgkgKiBjb2xsZWN0IHRoZSBpdGVtcyBpbiBpdGVtc1tdCgkgKi8KCWl0ZW1fY291bnQgPSAwOwoJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgaSsrKQoJewoJICAgIGxlbiA9IHNob3dfb25lX3Rlcm1jb2RlKHRlcm1jb2Rlc1tpXS5uYW1lLAoJCQkJCQkgICAgdGVybWNvZGVzW2ldLmNvZGUsIEZBTFNFKTsKCSAgICBpZiAobGVuIDw9IElOQzMgLSBHQVAgPyBydW4gPT0gMQoJCQk6IGxlbiA8PSBJTkMyIC0gR0FQID8gcnVuID09IDIKCQkJOiBydW4gPT0gMykKCQlpdGVtc1tpdGVtX2NvdW50KytdID0gaTsKCX0KCgkvKgoJICogZGlzcGxheSB0aGUgaXRlbXMKCSAqLwoJaWYgKHJ1biA8PSAyKQoJewoJICAgIGNvbHMgPSAoQ29sdW1ucyArIEdBUCkgLyAocnVuID09IDEgPyBJTkMzIDogSU5DMik7CgkgICAgaWYgKGNvbHMgPT0gMCkKCQljb2xzID0gMTsKCSAgICByb3dzID0gKGl0ZW1fY291bnQgKyBjb2xzIC0gMSkgLyBjb2xzOwoJfQoJZWxzZQkvKiBydW4gPT0gMyAqLwoJICAgIHJvd3MgPSBpdGVtX2NvdW50OwoJZm9yIChyb3cgPSAwOyByb3cgPCByb3dzICYmICFnb3RfaW50OyArK3JvdykKCXsKCSAgICBtc2dfcHV0Y2hhcignXG4nKTsJCQkvKiBnbyB0byBuZXh0IGxpbmUgKi8KCSAgICBpZiAoZ290X2ludCkJCQkvKiAncScgdHlwZWQgaW4gbW9yZSAqLwoJCWJyZWFrOwoJICAgIGNvbCA9IDA7CgkgICAgZm9yIChpID0gcm93OyBpIDwgaXRlbV9jb3VudDsgaSArPSByb3dzKQoJICAgIHsKCQltc2dfY29sID0gY29sOwkJCS8qIG1ha2UgY29sdW1ucyAqLwoJCXNob3dfb25lX3Rlcm1jb2RlKHRlcm1jb2Rlc1tpdGVtc1tpXV0ubmFtZSwKCQkJCQkgICAgICB0ZXJtY29kZXNbaXRlbXNbaV1dLmNvZGUsIFRSVUUpOwoJCWlmIChydW4gPT0gMikKCQkgICAgY29sICs9IElOQzI7CgkJZWxzZQoJCSAgICBjb2wgKz0gSU5DMzsKCSAgICB9CgkgICAgb3V0X2ZsdXNoKCk7CgkgICAgdWlfYnJlYWtjaGVjaygpOwoJfQogICAgfQogICAgdmltX2ZyZWUoaXRlbXMpOwp9CgovKgogKiBTaG93IG9uZSB0ZXJtY29kZSBlbnRyeS4KICogT3V0cHV0IGdvZXMgaW50byBJT2J1ZmZbXQogKi8KICAgIGludApzaG93X29uZV90ZXJtY29kZShuYW1lLCBjb2RlLCBwcmludGl0KQogICAgY2hhcl91ICAqbmFtZTsKICAgIGNoYXJfdSAgKmNvZGU7CiAgICBpbnQJICAgIHByaW50aXQ7CnsKICAgIGNoYXJfdQkqcDsKICAgIGludAkJbGVuOwoKICAgIGlmIChuYW1lWzBdID4gJ34nKQogICAgewoJSU9idWZmWzBdID0gJyAnOwoJSU9idWZmWzFdID0gJyAnOwoJSU9idWZmWzJdID0gJyAnOwoJSU9idWZmWzNdID0gJyAnOwogICAgfQogICAgZWxzZQogICAgewoJSU9idWZmWzBdID0gJ3QnOwoJSU9idWZmWzFdID0gJ18nOwoJSU9idWZmWzJdID0gbmFtZVswXTsKCUlPYnVmZlszXSA9IG5hbWVbMV07CiAgICB9CiAgICBJT2J1ZmZbNF0gPSAnICc7CgogICAgcCA9IGdldF9zcGVjaWFsX2tleV9uYW1lKFRFUk1DQVAyS0VZKG5hbWVbMF0sIG5hbWVbMV0pLCAwKTsKICAgIGlmIChwWzFdICE9ICd0JykKCVNUUkNQWShJT2J1ZmYgKyA1LCBwKTsKICAgIGVsc2UKCUlPYnVmZls1XSA9IE5VTDsKICAgIGxlbiA9IChpbnQpU1RSTEVOKElPYnVmZik7CiAgICBkbwoJSU9idWZmW2xlbisrXSA9ICcgJzsKICAgIHdoaWxlIChsZW4gPCAxNyk7CiAgICBJT2J1ZmZbbGVuXSA9IE5VTDsKICAgIGlmIChjb2RlID09IE5VTEwpCglsZW4gKz0gNDsKICAgIGVsc2UKCWxlbiArPSB2aW1fc3Ryc2l6ZShjb2RlKTsKCiAgICBpZiAocHJpbnRpdCkKICAgIHsKCW1zZ19wdXRzKElPYnVmZik7CglpZiAoY29kZSA9PSBOVUxMKQoJICAgIG1zZ19wdXRzKChjaGFyX3UgKikiTlVMTCIpOwoJZWxzZQoJICAgIG1zZ19vdXR0cmFucyhjb2RlKTsKICAgIH0KICAgIHJldHVybiBsZW47Cn0KCiNpZiBkZWZpbmVkKEZFQVRfVEVSTVJFU1BPTlNFKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBGb3IgWHRlcm0gPj0gMTQwIGNvbXBpbGVkIHdpdGggT1BUX1RDQVBfUVVFUlk6IE9idGFpbiB0aGUgYWN0dWFsbHkgdXNlZAogKiB0ZXJtY2FwIGNvZGVzIGZyb20gdGhlIHRlcm1pbmFsIGl0c2VsZi4KICogV2UgZ2V0IHRoZW0gb25lIGJ5IG9uZSB0byBhdm9pZCBhIHZlcnkgbG9uZyByZXNwb25zZSBzdHJpbmcuCiAqLwpzdGF0aWMgaW50IHh0X2luZGV4X2luID0gMDsKc3RhdGljIGludCB4dF9pbmRleF9vdXQgPSAwOwoKICAgIHN0YXRpYyB2b2lkCnJlcV9jb2Rlc19mcm9tX3Rlcm0oKQp7CiAgICB4dF9pbmRleF9vdXQgPSAwOwogICAgeHRfaW5kZXhfaW4gPSAwOwogICAgcmVxX21vcmVfY29kZXNfZnJvbV90ZXJtKCk7Cn0KCiAgICBzdGF0aWMgdm9pZApyZXFfbW9yZV9jb2Rlc19mcm9tX3Rlcm0oKQp7CiAgICBjaGFyCWJ1ZlsxMV07CiAgICBpbnQJCW9sZF9pZHggPSB4dF9pbmRleF9vdXQ7CgogICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgd2hlbiBnb2luZyB0byBleGl0LiAqLwogICAgaWYgKGV4aXRpbmcpCglyZXR1cm47CgogICAgLyogU2VuZCB1cCB0byAxMCBtb3JlIHJlcXVlc3RzIG91dCB0aGFuIHdlIHJlY2VpdmVkLiAgQXZvaWQgc2VuZGluZyB0b28KICAgICAqIG1hbnksIHRoZXJlIGNhbiBiZSBhIGJ1ZmZlciBvdmVyZmxvdyBzb21ld2hlcmUuICovCiAgICB3aGlsZSAoeHRfaW5kZXhfb3V0IDwgeHRfaW5kZXhfaW4gKyAxMCAmJiBrZXlfbmFtZXNbeHRfaW5kZXhfb3V0XSAhPSBOVUxMKQogICAgewoJc3ByaW50ZihidWYsICJcMDMzUCtxJTAyeCUwMnhcMDMzXFwiLAoJCSAgICAgIGtleV9uYW1lc1t4dF9pbmRleF9vdXRdWzBdLCBrZXlfbmFtZXNbeHRfaW5kZXhfb3V0XVsxXSk7CglvdXRfc3RyX25mKChjaGFyX3UgKilidWYpOwoJKyt4dF9pbmRleF9vdXQ7CiAgICB9CgogICAgLyogU2VuZCB0aGUgY29kZXMgb3V0IHJpZ2h0IGF3YXkuICovCiAgICBpZiAoeHRfaW5kZXhfb3V0ICE9IG9sZF9pZHgpCglvdXRfZmx1c2goKTsKfQoKLyoKICogRGVjb2RlIGtleSBjb2RlIHJlc3BvbnNlIGZyb20geHRlcm06ICc8RXNjPlAxK3I8bmFtZT49PHN0cmluZz48RXNjPlwnLgogKiBBICIwIiBpbnN0ZWFkIG9mIHRoZSAiMSIgaW5kaWNhdGVzIGEgY29kZSB0aGF0IGlzbid0IHN1cHBvcnRlZC4KICogQm90aCA8bmFtZT4gYW5kIDxzdHJpbmc+IGFyZSBlbmNvZGVkIGluIGhleC4KICogImNvZGUiIHBvaW50cyB0byB0aGUgIjAiIG9yICIxIi4KICovCiAgICBzdGF0aWMgdm9pZApnb3RfY29kZV9mcm9tX3Rlcm0oY29kZSwgbGVuKQogICAgY2hhcl91CSpjb2RlOwogICAgaW50CQlsZW47CnsKI2RlZmluZSBYVF9MRU4gMTAwCiAgICBjaGFyX3UJbmFtZVszXTsKICAgIGNoYXJfdQlzdHJbWFRfTEVOXTsKICAgIGludAkJaTsKICAgIGludAkJaiA9IDA7CiAgICBpbnQJCWM7CgogICAgLyogQSAnMScgbWVhbnMgdGhlIGNvZGUgaXMgc3VwcG9ydGVkLCBhICcwJyBtZWFucyBpdCBpc24ndC4KICAgICAqIFdoZW4gaGFsZiB0aGUgbGVuZ3RoIGlzID4gWFRfTEVOIHdlIGNhbid0IHVzZSBpdC4KICAgICAqIE91ciBuYW1lcyBhcmUgY3VycmVudGx5IGFsbCAyIGNoYXJhY3RlcnMuICovCiAgICBpZiAoY29kZVswXSA9PSAnMScgJiYgY29kZVs3XSA9PSAnPScgJiYgbGVuIC8gMiA8IFhUX0xFTikKICAgIHsKCS8qIEdldCB0aGUgbmFtZSBmcm9tIHRoZSByZXNwb25zZSBhbmQgZmluZCBpdCBpbiB0aGUgdGFibGUuICovCgluYW1lWzBdID0gaGV4aGV4Mm5yKGNvZGUgKyAzKTsKCW5hbWVbMV0gPSBoZXhoZXgybnIoY29kZSArIDUpOwoJbmFtZVsyXSA9IE5VTDsKCWZvciAoaSA9IDA7IGtleV9uYW1lc1tpXSAhPSBOVUxMOyArK2kpCgl7CgkgICAgaWYgKFNUUkNNUChrZXlfbmFtZXNbaV0sIG5hbWUpID09IDApCgkgICAgewoJCXh0X2luZGV4X2luID0gaTsKCQlicmVhazsKCSAgICB9Cgl9CglpZiAoa2V5X25hbWVzW2ldICE9IE5VTEwpCgl7CgkgICAgZm9yIChpID0gODsgKGMgPSBoZXhoZXgybnIoY29kZSArIGkpKSA+PSAwOyBpICs9IDIpCgkJc3RyW2orK10gPSBjOwoJICAgIHN0cltqXSA9IE5VTDsKCSAgICBpZiAobmFtZVswXSA9PSAnQycgJiYgbmFtZVsxXSA9PSAnbycpCgkgICAgewoJCS8qIENvbG9yIGNvdW50IGlzIG5vdCBhIGtleSBjb2RlLiAqLwoJCWkgPSBhdG9pKChjaGFyICopc3RyKTsKCQlpZiAoaSAhPSB0X2NvbG9ycykKCQl7CgkJICAgIC8qIE5yIG9mIGNvbG9ycyBjaGFuZ2VkLCBpbml0aWFsaXplIGhpZ2hsaWdodGluZyBhbmQKCQkgICAgICogcmVkcmF3IGV2ZXJ5dGhpbmcuICBUaGlzIGNhdXNlcyBhIHJlZHJhdywgd2hpY2ggdXN1YWxseQoJCSAgICAgKiBjbGVhcnMgdGhlIG1lc3NhZ2UuICBUcnkga2VlcGluZyB0aGUgbWVzc2FnZSBpZiBpdAoJCSAgICAgKiBtaWdodCB3b3JrLiAqLwoJCSAgICBzZXRfa2VlcF9tc2dfZnJvbV9oaXN0KCk7CgkJICAgIHNldF9jb2xvcl9jb3VudChpKTsKCQkgICAgaW5pdF9oaWdobGlnaHQoVFJVRSwgRkFMU0UpOwoJCSAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOwoJCX0KCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCQkvKiBGaXJzdCBkZWxldGUgYW55IGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgY29kZS4gKi8KCQlpID0gZmluZF90ZXJtX2J5a2V5cyhzdHIpOwoJCWlmIChpID49IDApCgkJICAgIGRlbF90ZXJtY29kZV9pZHgoaSk7CgkJYWRkX3Rlcm1jb2RlKG5hbWUsIHN0ciwgQVRDX0ZST01fVEVSTSk7CgkgICAgfQoJfQogICAgfQoKICAgIC8qIE1heSByZXF1ZXN0IG1vcmUgY29kZXMgbm93IHRoYXQgd2UgcmVjZWl2ZWQgb25lLiAqLwogICAgKyt4dF9pbmRleF9pbjsKICAgIHJlcV9tb3JlX2NvZGVzX2Zyb21fdGVybSgpOwp9CgovKgogKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHVuYW5zd2VyZWQgcmVxdWVzdHMgYW5kIGRlYWwgd2l0aCB0aGVtLgogKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgYW4gZXh0ZXJuYWwgcHJvZ3JhbSBvciBnZXR0aW5nIGRpcmVjdAogKiBrZXlib2FyZCBpbnB1dC4gIFdlIGRvbid0IHdhbnQgcmVzcG9uc2VzIHRvIGJlIHNlbmQgdG8gdGhhdCBwcm9ncmFtIG9yCiAqIGhhbmRsZWQgYXMgdHlwZWQgdGV4dC4KICovCiAgICBzdGF0aWMgdm9pZApjaGVja19mb3JfY29kZXNfZnJvbV90ZXJtKCkKewogICAgaW50CQljOwoKICAgIC8qIElmIG5vIGNvZGVzIHJlcXVlc3RlZCBvciBhbGwgYXJlIGFuc3dlcmVkLCBubyBuZWVkIHRvIHdhaXQuICovCiAgICBpZiAoeHRfaW5kZXhfb3V0ID09IDAgfHwgeHRfaW5kZXhfb3V0ID09IHh0X2luZGV4X2luKQoJcmV0dXJuOwoKICAgIC8qIFZnZXRjKCkgd2lsbCBjaGVjayBmb3IgYW5kIGhhbmRsZSBhbnkgcmVzcG9uc2UuCiAgICAgKiBLZWVwIGNhbGxpbmcgdnBlZWtjKCkgdW50aWwgd2UgZG9uJ3QgZ2V0IGFueSByZXNwb25zZXMuICovCiAgICArK25vX21hcHBpbmc7CiAgICArK2FsbG93X2tleXM7CiAgICBmb3IgKDs7KQogICAgewoJYyA9IHZwZWVrYygpOwoJaWYgKGMgPT0gTlVMKQkgICAgLyogbm90aGluZyBhdmFpbGFibGUgKi8KCSAgICBicmVhazsKCgkvKiBJZiBhIHJlc3BvbnNlIGlzIHJlY29nbml6ZWQgaXQncyByZXBsYWNlZCB3aXRoIEtfSUdOT1JFLCBtdXN0IHJlYWQKCSAqIGl0IGZyb20gdGhlIGlucHV0IHN0cmVhbS4gIElmIHRoZXJlIGlzIG5vIEtfSUdOT1JFIHdlIGNhbid0IGRvCgkgKiBhbnl0aGluZywgYnJlYWsgaGVyZSAodGhlcmUgbWlnaHQgYmUgc29tZSByZXNwb25zZXMgZnVydGhlciBvbiwgYnV0CgkgKiB3ZSBkb24ndCB3YW50IHRvIHRocm93IGF3YXkgYW55IHR5cGVkIGNoYXJzKS4gKi8KCWlmIChjICE9IEtfU1BFQ0lBTCAmJiBjICE9IEtfSUdOT1JFKQoJICAgIGJyZWFrOwoJYyA9IHZnZXRjKCk7CglpZiAoYyAhPSBLX0lHTk9SRSkKCXsKCSAgICB2dW5nZXRjKGMpOwoJICAgIGJyZWFrOwoJfQogICAgfQogICAgLS1ub19tYXBwaW5nOwogICAgLS1hbGxvd19rZXlzOwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVF9DTURMX0NPTVBMKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBUcmFuc2xhdGUgYW4gaW50ZXJuYWwgbWFwcGluZy9hYmJyZXZpYXRpb24gcmVwcmVzZW50YXRpb24gaW50byB0aGUKICogY29ycmVzcG9uZGluZyBleHRlcm5hbCBvbmUgcmVjb2duaXplZCBieSA6bWFwLzphYmJyZXYgY29tbWFuZHM7CiAqIHJlc3BlY3RzIHRoZSBjdXJyZW50IEIvay88IHNldHRpbmdzIG9mICdjcG9wdGlvbicuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZXhwYW5kaW5nIG1hcHBpbmdzL2FiYnJldmlhdGlvbnMgb24gdGhlCiAqIGNvbW1hbmQtbGluZSwgYW5kIGZvciBidWlsZGluZyB0aGUgIkFtYmlndW91cyBtYXBwaW5nLi4uIiBlcnJvciBtZXNz5mdlLgogKgogKiBJdCB1c2VzIGEgZ3Jvd2FycmF5IHRvIGJ1aWxkIHRoZSB0cmFuc2xhdGlvbiBzdHJpbmcgc2luY2UgdGhlCiAqIGxhdHRlciBjYW4gYmUgd2lkZXIgdGhhbiB0aGUgb3JpZ2luYWwgZGVzY3JpcHRpb24uIFRoZSBjYWxsZXIgaGFzIHRvCiAqIGZyZWUgdGhlIHN0cmluZyBhZnRlcndhcmRzLgogKgogKiBSZXR1cm5zIE5VTEwgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0uCiAqLwogICAgY2hhcl91ICoKdHJhbnNsYXRlX21hcHBpbmcoc3RyLCBleHBtYXApCiAgICBjaGFyX3UJKnN0cjsKICAgIGludAkJZXhwbWFwOyAgLyogVFJVRSB3aGVuIGV4cGFuZGluZyBtYXBwaW5ncyBvbiBjb21tYW5kLWxpbmUgKi8KewogICAgZ2FycmF5X1QJZ2E7CiAgICBpbnQJCWM7CiAgICBpbnQJCW1vZGlmaWVyczsKICAgIGludAkJY3BvX2JzbGFzaDsKICAgIGludAkJY3BvX3NwZWNpYWw7CiAgICBpbnQJCWNwb19rZXljb2RlOwoKICAgIGdhX2luaXQoJmdhKTsKICAgIGdhLmdhX2l0ZW1zaXplID0gMTsKICAgIGdhLmdhX2dyb3dzaXplID0gNDA7CgogICAgY3BvX2JzbGFzaCA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fQlNMQVNIKSAhPSBOVUxMKTsKICAgIGNwb19zcGVjaWFsID0gKHZpbV9zdHJjaHIocF9jcG8sIENQT19TUEVDSSkgIT0gTlVMTCk7CiAgICBjcG9fa2V5Y29kZSA9ICh2aW1fc3RyY2hyKHBfY3BvLCBDUE9fS0VZQ09ERSkgPT0gTlVMTCk7CgogICAgZm9yICg7ICpzdHI7ICsrc3RyKQogICAgewoJYyA9ICpzdHI7CglpZiAoYyA9PSBLX1NQRUNJQUwgJiYgc3RyWzFdICE9IE5VTCAmJiBzdHJbMl0gIT0gTlVMKQoJewoJICAgIG1vZGlmaWVycyA9IDA7CgkgICAgaWYgKHN0clsxXSA9PSBLU19NT0RJRklFUikKCSAgICB7CgkJc3RyKys7CgkJbW9kaWZpZXJzID0gKisrc3RyOwoJCWMgPSAqKytzdHI7CgkgICAgfQoJICAgIGlmIChjcG9fc3BlY2lhbCAmJiBjcG9fa2V5Y29kZSAmJiBjID09IEtfU1BFQ0lBTCAmJiAhbW9kaWZpZXJzKQoJICAgIHsKCQlpbnQJaTsKCgkJLyogdHJ5IHRvIGZpbmQgc3BlY2lhbCBrZXkgaW4gdGVybWNvZGVzICovCgkJZm9yIChpID0gMDsgaSA8IHRjX2xlbjsgKytpKQoJCSAgICBpZiAodGVybWNvZGVzW2ldLm5hbWVbMF0gPT0gc3RyWzFdCgkJCQkJICAgICYmIHRlcm1jb2Rlc1tpXS5uYW1lWzFdID09IHN0clsyXSkKCQkJYnJlYWs7CgkJaWYgKGkgPCB0Y19sZW4pCgkJewoJCSAgICBnYV9jb25jYXQoJmdhLCB0ZXJtY29kZXNbaV0uY29kZSk7CgkJICAgIHN0ciArPSAyOwoJCSAgICBjb250aW51ZTsgLyogZm9yIChzdHIpICovCgkJfQoJICAgIH0KCSAgICBpZiAoYyA9PSBLX1NQRUNJQUwgJiYgc3RyWzFdICE9IE5VTCAmJiBzdHJbMl0gIT0gTlVMKQoJICAgIHsKCQlpZiAoZXhwbWFwICYmIGNwb19zcGVjaWFsKQoJCXsKCQkgICAgZ2FfY2xlYXIoJmdhKTsKCQkgICAgcmV0dXJuIE5VTEw7CgkJfQoJCWMgPSBUT19TUEVDSUFMKHN0clsxXSwgc3RyWzJdKTsKCQlpZiAoYyA9PSBLX1pFUk8pCS8qIGRpc3BsYXkgPE51bD4gYXMgXkAgKi8KCQkgICAgYyA9IE5VTDsKCQlzdHIgKz0gMjsKCSAgICB9CgkgICAgaWYgKElTX1NQRUNJQUwoYykgfHwgbW9kaWZpZXJzKQkvKiBzcGVjaWFsIGtleSAqLwoJICAgIHsKCQlpZiAoZXhwbWFwICYmIGNwb19zcGVjaWFsKQoJCXsKCQkgICAgZ2FfY2xlYXIoJmdhKTsKCQkgICAgcmV0dXJuIE5VTEw7CgkJfQoJCWdhX2NvbmNhdCgmZ2EsIGdldF9zcGVjaWFsX2tleV9uYW1lKGMsIG1vZGlmaWVycykpOwoJCWNvbnRpbnVlOyAvKiBmb3IgKHN0cikgKi8KCSAgICB9Cgl9CglpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gQ3RybF9KIHx8IGMgPT0gQ3RybF9WCgkgICAgfHwgKGMgPT0gJzwnICYmICFjcG9fc3BlY2lhbCkgfHwgKGMgPT0gJ1xcJyAmJiAhY3BvX2JzbGFzaCkpCgkgICAgZ2FfYXBwZW5kKCZnYSwgY3BvX2JzbGFzaCA/IEN0cmxfViA6ICdcXCcpOwoJaWYgKGMpCgkgICAgZ2FfYXBwZW5kKCZnYSwgYyk7CiAgICB9CiAgICBnYV9hcHBlbmQoJmdhLCBOVUwpOwogICAgcmV0dXJuIChjaGFyX3UgKikoZ2EuZ2FfZGF0YSk7Cn0KI2VuZGlmCgojaWYgKGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUkpKSB8fCBkZWZpbmVkKFBST1RPKQpzdGF0aWMgY2hhciBrc21lX3N0clsyMF07CnN0YXRpYyBjaGFyIGtzbXJfc3RyWzIwXTsKc3RhdGljIGNoYXIga3NtZF9zdHJbMjBdOwoKLyoKICogRm9yIFdpbjMyIGNvbnNvbGU6IHVwZGF0ZSB0ZXJtY2FwIGNvZGVzIGZvciBleGlzdGluZyBjb25zb2xlIGF0dHJpYnV0ZXMuCiAqLwogICAgdm9pZAp1cGRhdGVfdGNhcChhdHRyKQogICAgaW50IGF0dHI7CnsKICAgIHN0cnVjdCBidWlsdGluX3Rlcm0gKnA7CgogICAgcCA9IGZpbmRfYnVpbHRpbl90ZXJtKERFRkFVTFRfVEVSTSk7CiAgICBzcHJpbnRmKGtzbWVfc3RyLCBJRl9FQigiXDAzM3wlZG0iLCBFU0NfU1RSICJ8JWRtIiksIGF0dHIpOwogICAgc3ByaW50Zihrc21kX3N0ciwgSUZfRUIoIlwwMzN8JWRtIiwgRVNDX1NUUiAifCVkbSIpLAoJCQkJICAgICBhdHRyIHwgMHgwOCk7ICAvKiBGT1JFR1JPVU5EX0lOVEVOU0lUWSAqLwogICAgc3ByaW50Zihrc21yX3N0ciwgSUZfRUIoIlwwMzN8JWRtIiwgRVNDX1NUUiAifCVkbSIpLAoJCQkJICgoYXR0ciAmIDB4MEYpIDw8IDQpIHwgKChhdHRyICYgMHhGMCkgPj4gNCkpOwoKICAgIHdoaWxlIChwLT5idF9zdHJpbmcgIT0gTlVMTCkKICAgIHsKICAgICAgaWYgKHAtPmJ0X2VudHJ5ID09IChpbnQpS1NfTUUpCgkgIHAtPmJ0X3N0cmluZyA9ICZrc21lX3N0clswXTsKICAgICAgZWxzZSBpZiAocC0+YnRfZW50cnkgPT0gKGludClLU19NUikKCSAgcC0+YnRfc3RyaW5nID0gJmtzbXJfc3RyWzBdOwogICAgICBlbHNlIGlmIChwLT5idF9lbnRyeSA9PSAoaW50KUtTX01EKQoJICBwLT5idF9zdHJpbmcgPSAma3NtZF9zdHJbMF07CiAgICAgICsrcDsKICAgIH0KfQojZW5kaWYK