--- /u/guests/jc/Mail/inbox/146 From colomon@gmail.com Sun Jan 21 13:57:29 2007 Date: Sun, 21 Jan 2007 13:57:12 -0500 From: "Solomon Foster" To: "John Chambers" Subject: jcabc2ps PATCH X-Spam-Score: 0.0 (/) ------=_Part_54453_20771057.1169405832440 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi John, On 1/21/07, Solomon Foster wrote: > I've gone ahead and cleaned up the annotation / decoration code as > much as I could easily and added segno and coda symbols (borrowing the > relevant Postscript code from yaps). I've cleaned up the following > bugs: > > -- !ann! decorations not properly stored as decorations if !ann! is > the first decoration (so that it goes to prsAnn rather than prsDeco). > -- !ann! decorations screw up parser if a normal decoration comes > first (so that prsDeco is calling prsAnn). > -- Decorations in chords were broken -- previously it would copy all > the decorations in the dtype buffer (including the previous > decorations) to the end of the decorations on the current symbol, then > set the number to be the number in the buffer. So for instance, if > you had H on the outside and T inside the chord, it would append the > full dtype buffer (HT) to the current symbol buffer, yielding HHT, > then set the length to the length of the dtype buffer, yielding HH. > Ick. > -- There was nothing preventing a buffer overflow if you threw more > than 30 decorations at a single note. > > I think I'll take a stab at supporting the 2.0 +ann+ notation as well > as !ann!, and maybe see if I can make the segno and coda look a tad > better, then send my changes to you. Got the +ann+ form working. I sort of manually centered the segno and coda so they look right. And I implemented decorations for rests (including invisible ones) and bar lines. I think there are still issues with what happens to the decorations (and annotations?) on the last bar line on a line. Right now it gets pushes to the next line, and just disappears if there is no next line. The first behavior clearly isn't right in all cases, and the second one is clearly wrong altogether. But I'm not sure how to easily sort out the right cases from the wrong cases, so I'm leaving this for the moment. I've attached the diff from the source I downloaded. Thanks, -- Solomon Foster: colomon@ralf.org HarmonyWare, Inc: http://www.harmonyware.com ------=_Part_54453_20771057.1169405832440 Content-Type: application/octet-stream; name=coda_and_segno.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_ex7tv2z2 Content-Disposition: attachment; filename="coda_and_segno.patch" SW5kZXg6IHByc0RlY28uYw0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIHByc0RlY28uYwkocmV2aXNpb24gNDky NSkNCisrKyBwcnNEZWNvLmMJKHdvcmtpbmcgY29weSkNCkBAIC0yMywxOSArMjMsMjkgQEANCiAJ CWNhc2UgJ0snOiBkdCA9IERfSEFUOyBicmVhazsKIAkJY2FzZSAnayc6IGR0ID0gRF9BVFQ7IGJy ZWFrOwogCQljYXNlICchJzoKKwkJY2FzZSAnKyc6CiAJCQlWNSAiJXM6IERlY28gISU0cyAuLi5c biIsRixQIFY7Ci0JCQlkdCA9IHByc0FubigpOwotCQkJVjUgIiVzOiBEZWNvICVkIHR5cGUgJWQ9 JXMuXG4iLEYsZGVjb3MsZHQsYW5ubmFtZVtkdF0udmFsdWUgVjsKKwkJCWlmIChwcnNBbm4gKCkp IC8vIHByc0FubiB3aWxsIGNhbGwgYWRkRGVjbyBpZiBpdCBmaW5kcyBhIGRlY29yYXRpb24KKyAg ICAgICAgICAgIHsgICAgICAgICAgICAgIC8vIGFuZCB3aWxsIHJldHVybiB0cnVlIGlmIGl0IGZp bmRzIGFueSBzb3J0IG9mCisgICAgICAgICAgICAgICAgY29udGludWU7ICAvLyBhbm5vdGF0aW9u IGF0IGFsbAorLy8JCQlWNSAiJXM6IERlY28gJWQgdHlwZSAlZD0lcy5cbiIsRixkZWNvcyxkdCxh bm5uYW1lW2R0XS52YWx1ZSBWOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAg ICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG5vdCBhIHZhbGlkIGFubm90YXRpb24sIHRo ZSBsaXN0IG9mIGRlY29yYXRpb25zIG11c3QKKyAgICAgICAgICAgICAgICAvLyBiZSBkb25lCisg ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAJCX0KIAkJaWYgKGR0KSB7Ci0J CQlWNSAiJXM6IERFQ08gJWQgaXMgdHlwZSAlZC5cbiIsRixkZWNvcyxkdCBWOworLy8JCQlWNSAi JXM6IERFQ08gJWQgaXMgdHlwZSAlZC5cbiIsRixkZWNvcyxkdCBWOwogCQkJUCsrOwotCQkJZHR5 cGVbZGVjb3MrK10gPSBkdDsKKyAgICAgICAgICAgIGFkZERlY28gKGR0KTsKIAkJCW4rKzsKIAkJ fSBlbHNlIHsKIAkJCWJyZWFrOwogCQl9CiAJfQotCVYzICIlczogJWQgZGVjb3MgZm91bmQsICVk IHRvdGFsLlxuIixGLG4sZGVjb3MgVjsKKy8vCVYzICIlczogJWQgZGVjb3MgZm91bmQsICVkIHRv dGFsLlxuIixGLG4sZGVjb3MgVjsKIAlyZXR1cm4gbjsKIH0KSW5kZXg6IHN5bXMuYw0KPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQ0KLS0tIHN5bXMuYwkocmV2aXNpb24gNDkyNSkNCisrKyBzeW1zLmMJKHdvcmtpbmcgY29w eSkNCkBAIC00MjMsNiArNDIzLDQ1IEBADQogCWFkZF9jdiAoZnAsZjEsZjIscCw1LDEpOwogCWZw cmludGYgKGZwLCAiICAgZmlsbFxufSBiaW5kIGRlZlxuIik7CiAKKyAgICAvLyBDb2RlIGJvcnJv d2VkIGZyb20geWFwcywKKyAgICAvLyBjb3B5cmlnaHQgTWljaGFlbCBNZXRoZmVzc2VsIGFuZCBK YW1lcyBBbGx3cmlnaHQKKyAgICBmcHJpbnRmKGZwLCAiL3NlZ25vIHsgJSUgc2Vnbm8gc3ltYm9s IHVzYWdlOiB5IHNlZ25vXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiICB4IDMuNzUgc3ViIGV4Y2hc biIpOyAvLyBtYWtlIGl0IHggeSBsaWtlIHRoZSBvcmlnaW5hbAorICAgIGZwcmludGYoZnAsICIg IGdzYXZlIHRyYW5zbGF0ZVxuIik7CisgICAgZnByaW50ZihmcCwgIiAgNS44MiAwLjg0IG1vdmV0 b1xuIik7CisgICAgZnByaW50ZihmcCwgIiAgNC42MiAxLjE1ICAgNS4wNCAzLjIwICAgNC42IDMu NjQgY3VydmV0b1xuIik7CisgICAgZnByaW50ZihmcCwgIiAgNC4xNyA0LjA4ICAgMy4xOSAyLjc1 ICAgMy45IDEuNTEgY3VydmV0b1xuIik7CisgICAgZnByaW50ZihmcCwgIiAgNC42MiAwLjI3ICAg Ny40NSAwLjAgICAgOC4wMyAxLjgyIGN1cnZldG9cbiIpOworICAgIGZwcmludGYoZnAsICIgIDgu NjEgMy42NCAgIDUuMDYgNy44MSAgIDMuMzggOS42NyBjdXJ2ZXRvXG4iKTsKKyAgICBmcHJpbnRm KGZwLCAiICAxLjY5IDExLjUzICAxLjU5IDE0LjQ2ICAyLjc5IDE0LjE2IGN1cnZldG9cbiIpOwor ICAgIGZwcmludGYoZnAsICIgIDMuOTkgMTMuODUgIDMuNTUgMTEuODAgIDQuMDAgMTEuMzYgY3Vy dmV0b1xuIik7CisgICAgZnByaW50ZihmcCwgIiAgNC40NCAxMC45MiAgNS4zMyAxMi4yNSAgNC42 NiAxMy40OSBjdXJ2ZXRvXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiICAzLjk5IDE0LjczICAxLjE1 IDE1LjAgICAwLjU3IDEzLjE4IGN1cnZldG9cbiIpOworICAgIGZwcmludGYoZnAsICIgIDAuMCAg MTEuMzYgIDMuNTAgNy4xOSAgIDUuMjEgNS4zMiAgY3VydmV0b1xuIik7CisgICAgZnByaW50Zihm cCwgIiAgNi45MiAzLjQ2ICAgNy4wMSAwLjUzICAgNS44MiAwLjg0IGN1cnZldG9cbiIpOworICAg IGZwcmludGYoZnAsICIgIGNsb3NlcGF0aCBmaWxsXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiICAt MC40MyAyLjkzIG1vdmV0b1xuIik7CisgICAgZnByaW50ZihmcCwgIiAgOC43OSAxMi4yNSBsaW5l dG8gOS4zMiAxMS43MiBsaW5ldG8gLTAuMDkgMi40MCBsaW5ldG9cbiIpOworICAgIGZwcmludGYo ZnAsICIgIGNsb3NlcGF0aCBmaWxsXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiICAwLjcxIDcuNTAg MS4wIDAgMzYwIGFyY1xuIik7CisgICAgZnByaW50ZihmcCwgIiAgY2xvc2VwYXRoIGZpbGxcbiIp OworICAgIGZwcmludGYoZnAsICIgIDcuODUgNy41MCAxLjAgMCAzNjAgYXJjXG4iKTsKKyAgICBm cHJpbnRmKGZwLCAiICBjbG9zZXBhdGggZmlsbFxuIik7CisgICAgZnByaW50ZihmcCwgIiAgZ3Jl c3RvcmVcbiIpOworICAgIGZwcmludGYoZnAsICJ9IGJpbmQgZGVmXG4iKTsKKyAgICBmcHJpbnRm KGZwLCAiXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiL2NvZGEgeyAlJSBjb2RhIDogdXNhZ2UgeSBj b2RhXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiICB4IDcuNSBzdWIgZXhjaFxuIik7IC8vIG1ha2Ug aXQgeCB5IGxpa2UgdGhlIG9yaWdpbmFsPworICAgIGZwcmludGYoZnAsICIgIGdzYXZlXG4iKTsK KyAgICBmcHJpbnRmKGZwLCAiICB0cmFuc2xhdGVcbiIpOworICAgIGZwcmludGYoZnAsICIgIDEu MCBzZXRsaW5ld2lkdGhcbiIpOworICAgIGZwcmludGYoZnAsICIgIDAuMCA3LjUgbW92ZXRvIDE1 LjAgNy41IGxpbmV0byBzdHJva2VcbiIpOworICAgIGZwcmludGYoZnAsICIgIDcuNSAwLjAgbW92 ZXRvIDcuNSAxNS4wIGxpbmV0byBzdHJva2VcbiIpOworICAgIGZwcmludGYoZnAsICIgIDcuNSA3 LjUgNS4wIDAgMzYwIGFyYyBzdHJva2VcbiIpOworICAgIGZwcmludGYoZnAsICIgIGdyZXN0b3Jl XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAifSBiaW5kIGRlZlxuIik7CisgICAgZnByaW50ZihmcCwg IlxuIik7CisKIAlmMT1mMj0wLjg7CiAJZnByaW50ZiAoZnAsICJcbi9kbmIgeyAgJSUgdXNhZ2U6 ICB5IGRuYiAgLSBkb3duIGJvd1xuIgogCQkJIiAgeCBleGNoIG1vdmV0b1xuIik7CkluZGV4OiBq Y2FiYzJwcy5oDQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09DQotLS0gamNhYmMycHMuaAkocmV2aXNpb24gNDkyNSkNCisr KyBqY2FiYzJwcy5oCSh3b3JraW5nIGNvcHkpDQpAQCAtMjUwLDYgKzI1MCw4IEBADQogI2RlZmlu ZSBEX1RSSUxMICAgICAgOQogI2RlZmluZSBEX0hBVCAgICAgICAxMAogI2RlZmluZSBEX0FUVCAg ICAgICAxMQorI2RlZmluZSBEX1NFR05PICAgICAxMgorI2RlZmluZSBEX0NPREEgICAgICAxMwog CiAvKiB0eXBlcyBvZiBoZWFkcwogKi8KSW5kZXg6IHByc0Fubi5jDQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g cHJzQW5uLmMJKHJldmlzaW9uIDQ5MjUpDQorKysgcHJzQW5uLmMJKHdvcmtpbmcgY29weSkNCkBA IC0xNyw2ICsxNyw4IEBADQogCXtEX1RSSUxMLCAgICJUUklMTCJ9LCAgIC8qICA5ICovCiAJe0Rf SEFULCAgICAgIkhBVCJ9LCAgICAgLyogMTAgKi8KIAl7RF9BVFQsICAgICAiQVRUIn0sICAgICAv KiAxMSAqLworCXtEX1NFR05PLCAgICJzZWdubyJ9LCAgIC8qIDEyICovCisJe0RfQ09EQSwgICAg ImNvZGEifSwgICAgLyogMTMgKi8KIAl7MH0sCiB9OwogCkBAIC0zMiw4MSArMzQsMTA0IEBADQog CWludCAgIGMsIGksIGw7CiAJaW50ICAgbj0wOwkJLy8gQW5ub3RhdGlvbiBjb3VudAogCWZsb2F0 IHl5OworICAgIGNoYXIgYW5uX3RbMjAwXTsKKyAgICBkb3VibGUgYW5uX3gsIGFubl95OworICAg IGludCBhbm5fcCA9IDA7CisgICAgY2hhciBtYXJrZXI7CiAKIAlWMyAiJXM6IENhbGxlZCBhdCA8 JXM+XG4iLEYsUCBWOwotCWlmICgqUCAhPSAnIScpIHtWNSAiJXM6IE5vIGFubm90YXRpb25cbiIs RiBWOyAgICAgICAgIHJldHVybiAwO30KLQlpZiAoIVBbMV0pICAgICB7VjUgIiVzOiBUcmFpbGlu ZyAnISdcbiIsRiBWOyAgICAgICAgICByZXR1cm4gMDt9CisgICAgbWFya2VyID0gKlA7CisJaWYg KCpQICE9ICchJyAmJiAqUCAhPSAnKycpIHsKKyAgICAgICAgVjUgIiVzOiBObyBhbm5vdGF0aW9u XG4iLEYgVjsgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisJaWYgKCFQWzFdKSAgICAge1Y1ICIl czogVHJhaWxpbmcgJyVjJ1xuIixGLG1hcmtlciBWOyAgICAgICAgICByZXR1cm4gMDt9CiAJaWYg KCFhbm4pIHsKIAkJVjUgIiVzOiBObyBjdXJyZW50IGFubm90YXRpb25cbiIsRiBWOwogCQlUZXh0 SW5pdCgmYW5uLDMyKTsKIAl9CiAJcSA9IFA7CQkJCS8qIE5vdGUgcG9zaXRpb24gb2Ygb3Blbmlu ZyBxdW90ZSAqLwogCVArKzsJCQkJLyogU2tpcCB0byBmaXJzdCBjaGFyIG9mIHN0cmluZyAqLwot CWFubi0+cCA9IDA7Ci0JYW5uLT54ID0gYW5uLT55ID0gMC4wOworCWFubl9wID0gMDsKKwlhbm5f eCA9IGFubl95ID0gMC4wOworICAgIGwgPSAwOwogCXN3aXRjaCAoYyA9ICpQKSB7CS8qIENoZWNr IGZvciBwb3NpdGlvbiBjaGFyICovCiAJY2FzZSAnXic6CQkJLyogQWJvdmUgc3RhZmYgKi8KIAkJ VjMgIiAgQW5ub3RhdGlvbiBwb3NpdGlvbiAnJWMnIGFib3ZlIHN0YWZmLlxuIixjIFY7Ci0JCVAr KzsgYW5uLT5wID0gUF9BQk9WRTsgYW5uLT55ID0gMzg7IGJyZWFrOworCQlQKys7IGFubl9wID0g UF9BQk9WRTsgYW5uX3kgPSAzODsgYnJlYWs7CiAJY2FzZSAnPCc6CQkJLyogTGVmdCBvZiBub3Rl ICovCiAJCVYzICIgIEFubm90YXRpb24gcG9zaXRpb24gJyVjJyBsZWZ0IG9mIG5vdGUuXG4iLGMg VjsKLQkJUCsrOyBhbm4tPnAgPSBQX0xFRlQ7IGJyZWFrOworCQlQKys7IGFubl9wID0gUF9MRUZU OyBicmVhazsKIAljYXNlICc9JzoJCQkvKiBOZXh0IHRvIG5vdGUgKi8KIAkJVjMgIiAgQW5ub3Rh dGlvbiBwb3NpdGlvbiAnJWMnIG5leHQgdG8gbm90ZS5cbiIsYyBWOwotCQlQKys7IGFubi0+cCA9 IFBfTkVYVDsgYnJlYWs7CisJCVArKzsgYW5uX3AgPSBQX05FWFQ7IGJyZWFrOwogCWNhc2UgJz4n OgkJCS8qIFJpZ2h0IG9mIG5vdGUgKi8KIAkJVjMgIiAgQW5ub3RhdGlvbiBwb3NpdGlvbiAnJWMn IHJpZ2h0IG9mIG5vdGUuXG4iLGMgVjsKLQkJUCsrOyBhbm4tPnAgPSBQX1JJR0hUOyBicmVhazsK KwkJUCsrOyBhbm5fcCA9IFBfUklHSFQ7IGJyZWFrOwogCWNhc2UgJ18nOgkJCS8qIEJlbG93IHN0 YWZmICovCiAJCVYzICIgIEFubm90YXRpb24gcG9zaXRpb24gJyVjJyBiZWxvdyBzdGFmZi5cbiIs YyBWOwotCQlQKys7IGFubi0+cCA9IFBfQkVMT1c7IGFubi0+eSA9IC0xMjsgYnJlYWs7CisJCVAr KzsgYW5uX3AgPSBQX0JFTE9XOyBhbm5feSA9IC0xMjsgYnJlYWs7CiAJfQotCVYzICIlczogUG9z aXRpb24gaXMgJWQgYW5uLT55PSUuM2ZcbiIsRixhbm4tPnAsYW5uLT55IFY7Ci0JbCA9IGFubi0+ bDsJCQkvKiBMZW5ndGggb2YgYW5ub3RhdGlvbiBzbyBmYXIgKi8KLQlpZiAobCA+IDApIHsJCS8q IE9ubHkgb25lIGFsbG93ZWQgYXQgcHJlc2VudCAqLwotCQlzeW50YXgoIk92ZXJ3cml0ZSBlYXJs aWVyIGFubm90YXRpb24iLCBxKTsKLQkJVGV4dEluaXQoJmFubiw2NCk7Ci0JfQotCXdoaWxlICgo YyA9ICpQKSAmJiAoYyAhPSAnIScpICYmIChjICE9ICcgJykpIHsKLQkJYW5uLT50W2wrK10gPSBj OwotCQlhbm4tPnRbbF0gPSAwOwotCQlhbm4tPmwgKys7CisJVjMgIiVzOiBQb3NpdGlvbiBpcyAl ZCBhbm5feT0lLjNmXG4iLEYsYW5uX3AsYW5uX3kgVjsKKwl3aGlsZSAoKGMgPSAqUCkgJiYgKGMg IT0gbWFya2VyKSAmJiAoYyAhPSAnICcpKSB7CisJCWFubl90W2wrK10gPSBjOworCQlhbm5fdFts XSA9IDA7CiAJCWlmIChjID09ICdAJykgewogCQkJaWYgKHNzY2FuZihQKzEsIiVmIiwmeXkpID4g MCkgewotCQkJCWFubi0+eSA9IHl5OwotCQkJCVY1ICIlczogTWF0Y2hlZCBhbm4tPnk9JTYuM2Zc biIsRix5eSBWOworCQkJCWFubl95ID0geXk7CisJCQkJVjUgIiVzOiBNYXRjaGVkIGFubl95PSU2 LjNmXG4iLEYseXkgVjsKIAkJCX0KIAkJfQotCQlWNyAiJXM6IGFubj1cIiVzXCJcbiIsRixhbm4t PnQgVjsKKwkJVjcgIiVzOiBhbm49XCIlc1wiXG4iLEYsYW5uX3QgVjsKIAkJaWYgKGwgPj0gMjAw KSB7CiAJCQlzeW50YXgoIlN0cmluZyBmb3IgYW5ub3RhdGlvbiB0b28gbG9uZyIsIHEpOwotCQkJ cmV0dXJuIDE7CisJCQlyZXR1cm4gMTsgLy8gdGhpcyBiZWhhdmlvciBzdHJpa2VzIG1lIGFzIHF1 ZXN0aW9uYWJsZQogCQl9CiAJCVArKzsKIAl9Ci0JaWYgKGMgIT0gJyEnKSB7CisJaWYgKGMgIT0g bWFya2VyKSB7CiAJCWlmICghYykgVjMgIiVzOiBFT0wgcmVhY2hlZCB3aGlsZSBwYXJzaW5nIGFu bm90YXRpb24uXG4iLEYgVjsKIAkJaWYgKCBjKSBWMyAiJXM6ICclYycgZm91bmQgIHdoaWxlIHBh cnNpbmcgYW5ub3RhdGlvbi5cbiIsRixjIFY7CiAJCVAgPSBxICsgMTsJCQkvKiBSZXBvc2l0aW9u IGp1c3QgYWZ0ZXIgdGhlICEgKi8KIAkJd2hpbGUgKChjID0gKlApICYmIGlzc3BhY2UoYykpIFAr KzsKLQkJVGV4dEluaXQoJmFubiw2NCk7CQkvKiBEaXNjYXJkIGFjY3VtdWxhdGVkIGNoYXJzICov CisvLwkJVGV4dEluaXQoJmFubiw2NCk7CQkvKiBEaXNjYXJkIGFjY3VtdWxhdGVkIGNoYXJzICov IC0tIG5vIGxvbmdlciBuZWVkZWQKIAkJVjMgIiVzOiBDb250aW51ZSBhdCA8JTMuM3M+XG4iLEYs UCBWOwogCQlyZXR1cm4gMDsJCQkvKiBJZ25vcmUgaXQ7IGl0J3MgYW4gYWJjMndpbiAhICovCiAJ fQorCiAJUCsrOwotCVYzICIgIHBhcnNlZCBhbm5vdGF0aW9uIDwlcz5cbiIsVGV4dFN0cihhbm4p IFY7CisKKyAgICAvLyBza2lwIHRyYWlsaW5nIHdoaXRlc3BhY2VzCisJd2hpbGUgKChjID0gKlAp ICYmIChjID09ICcgJykgfHwgKGMgPT0gJ1x0JykpIHsKKwkJUCsrOworCX0KKworCVYzICIgIHBh cnNlZCBhbm5vdGF0aW9uIDwlcz5cbiIsYW5uX3QgVjsKIAlmb3IgKGk9MDsgYW5ubmFtZVtpXS52 YWx1ZTsgaSsrKSB7Ci0JCWlmICghc3RyY2FzZWNtcChhbm4tPnQsYW5ubmFtZVtpXS52YWx1ZSkp IHsKKwkJaWYgKCFzdHJjYXNlY21wKGFubl90LGFubm5hbWVbaV0udmFsdWUpKSB7CiAJCQlWNSAi JXM6IE1hdGNoZWQgYW5ub3RhdGlvbiBuYW1lICVkLlxuIixGLGkgVjsKLQkJCWR0eXBlW2RlY29z XSA9IGFubm5hbWVbaV0udHlwZTsKLQkJCVY1ICIlczogRGVjbyBkdHlwZVslZF0gaXMgJWQgXCIl c1wiXG4iLEYsZGVjb3MsZHR5cGVbZGVjb3NdLFRleHRTdHIoYW5uKSBWOwotCQkJZGVjb3MrKzsK KyAgICAgICAgICAgIGFkZERlY28gKGFubm5hbWVbaV0udHlwZSk7CisvLwkJCVY1ICIlczogRGVj byBkdHlwZVslZF0gaXMgJWQgXCIlc1wiXG4iLEYsZGVjb3MsZHR5cGVbZGVjb3NdLFRleHRTdHIo YW5uKSBWOwogCQkJKytuOwkvLyBOdW1iZXIgb2YgZGVjb3MgZm91bmQKIAkJCWJyZWFrOwogCQl9 CiAJfQotCVYzICIlczogJWQgZGVjb3MgZm91bmQsICVkIHRvdGFsLlxuIixGLG4sZGVjb3MgVjsK LQlWMyAiJXM6IFJldHVybiAxIGZvciBhbm4gISVzIVxuIixGLFRleHRTdHIoYW5uKSBWOworCisg ICAgaWYgKG4gPT0gMCkgLy8gaWYgbm8gZGVjb3JhdGlvbiBmb3VuZCwgdHJlYXQgYXMgYW5ub3Rh dGlvbgorICAgIHsKKyAgICAJaWYgKGFubi0+bCA+IDApIHsJCS8qIE9ubHkgb25lIGFsbG93ZWQg YXQgcHJlc2VudCAqLworICAgIAkJc3ludGF4KCJPdmVyd3JpdGUgZWFybGllciBhbm5vdGF0aW9u IiwgcSk7CisgICAgCQlUZXh0SW5pdCgmYW5uLDY0KTsKKyAgICAJfQorCisgICAgICAgIHN0cmNw eSAoYW5uLT50LCBhbm5fdCk7CisgICAgICAgIGFubi0+bCA9IGw7CisgICAgICAgIGFubi0+eCA9 IGFubl94OworICAgICAgICBhbm4tPnkgPSBhbm5feTsKKyAgICAgICAgYW5uLT5wID0gYW5uX3A7 CisgICAgfQorCisvLwlWMyAiJXM6ICVkIGRlY29zIGZvdW5kLCAlZCB0b3RhbC5cbiIsRixuLGRl Y29zIFY7CisJVjMgIiVzOiBSZXR1cm4gMSBmb3IgYW5uICVjJXMlY1xuIixGLG1hcmtlcixUZXh0 U3RyKGFubiksbWFya2VyIFY7CiAJcmV0dXJuIDE7CiB9CiAKSW5kZXg6IHBhcnNlLmMNCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0NCi0tLSBwYXJzZS5jCShyZXZpc2lvbiA0OTI1KQ0KKysrIHBhcnNlLmMJKHdvcmtpbmcg Y29weSkNCkBAIC05OSw2ICs5OSw0NCBAQA0KIAogLyogIHN1YnJvdXRpbmVzIGNvbm5lY3RlZCB3 aXRoIHBhcnNpbmcgdGhlIGlucHV0IGZpbGUgICovCiAKK3ZvaWQgY2xlYXJEZWNvcyAodm9pZCkK K3sKKyAgICBjaGFyICpGID0iY2xlYXJEZWNvcyI7CisKKyAgICBWMyAiJXM6IERFQ09zIGNsZWFy ZWQgb3V0XG4iLEYgVjsKKyAgICBkZWNvcyA9IDA7Cit9CisKK3ZvaWQgYWRkRGVjbygKKwlpbnQg ZGVjb190eXBlKQoreworICAgIGNoYXIgKkYgPSJhZGREZWNvIjsKKworICAgIGlmIChkZWNvcyA8 IDMwKQorICAgIHsKKyAgICAgICAgVjUgIiVzOiBERUNPICVkIGlzIHR5cGUgJWQuXG4iLEYsZGVj b3MsZGVjb190eXBlIFY7CisgICAgICAgIGR0eXBlW2RlY29zKytdID0gZGVjb190eXBlOworICAg IH0KKyAgICBlbHNlCisgICAgeworCQlWNSAiJXM6IERFQ08gYnVmZmVyIGZ1bGwsIHNraXBwaW5n IERFQ08gb2YgdHlwZSAlZC5cbiIsRixkZWNvX3R5cGUgVjsKKyAgICB9Cit9CisKK3ZvaWQgY29w eURlY29zVG9TeW0oCisgICAgU3ltICpzcCkKK3sKKyAgICBjaGFyICpGID0iY29weURlY29zVG9T eW0iOworICAgIGludCBpOworCisgICAgVjMgIiVzOiBDb3B5aW5nIERFQ09zIHRvIHN5bWJvbFxu IixGIFY7CisgICAgZm9yIChpID0gMDtpPGRlY29zO2krKykgeworICAgICAgICBzcC0+ZGMudFtp XSA9IGR0eXBlW2ldOworICAgICAgICBWNSAiJXM6IGRlY29yYXRpb24gJWQgaXMgdHlwZSAlZC5c biIsRixpLHNwLT5kYy50W2ldIFY7CisgICAgfQorICAgIHNwLT5kYy5uID0gZGVjb3M7ICAgICAg ICAvKiBEZWNvcmF0aW9uIGNvdW50ICovCit9CisKIC8qIC0tLS0tIHN5dGF4OiBwcmludCBtZXNz YWdlIGZvciBzeW50YXggZXJycm9yIC0tLS0tLS0tICovCiB2b2lkIHN5bnRheCgKIAljaGFyICpt c2csCkBAIC0yMjg0LDcgKzIzMjIsNyBAQA0KIC8vCW5nciA9IHByc0dyU2VxKHBncixhZ3IpOyAv KiBncmFjZSBub3RlcyAqLwogLy8Jd2hpbGUgKChjID0gKlApICYmIGlzc3BhY2UoYykpICsrUDsK IAlWMyAiJXM6IEJhciBzeW0gaGFzICVkIGdyYWNlIG5vdGVzIGF0IDwlcz4uXG4iLEYsbmdyLFAg VjsKLQlwcnNBbm4oKTsJLy8gQWxsb3cgYW5ub3RhdGlvbnMgb24gcGFyIGxpbmVzCisJcHJzRGVj bygpOwkvLyBBbGxvdyBkZWNvcmF0aW9ucyBhbmQgYW5ub3RhdGlvbnMgb24gcGFyIGxpbmVzCiAJ cHJzQWNoKCk7CS8vIEFsbG93ICJjaG9yZHMiIG9uIGJhciBsaW5lcwogCiAJLy8gc3BlY2lhbCBj YXNlczogWyBhbmQgZGlnaXQgb3IgcXVvdGUgd2l0aG91dCBhIHByZWNlZWRpbmcgYmFyLCBbIGVu ZGluZwpAQCAtMjM4Nyw2ICsyNDI1LDkgQEANCiAJVjMgIiVzOiBCYXIgc3ltdlslZF1bJWRdIGhh cyAlZCBncmFjZSBub3Rlcy5cbiIsRixpdmMsayxuZ3IgVjsKIAlzcCA9ICZzeW12W2l2Y11ba107 CiAJc3AtPmdyLm4gPSBuZ3I7CQkJLyogR3JhY2Ugbm90ZSBjb3VudCAqLworCisgICAgY29weURl Y29zVG9TeW0gKHNwKTsKKyAgICBjbGVhckRlY29zICgpOwogCVYzICIlczogQmFyIHN5bXZbJWRd WyVkXSBoYXMgJWQgZGVjb3JhdGlvbnMgYW5kICVkIGdyYWNlIG5vdGVzLlxuIixGLGl2YyxrLHNw LT5kYy5uLHNwLT5nci5uIFY7CiAJZm9yIChpID0gMDtpPG5ncjtpKyspIHsKIAkJc3AtPmdyLnBb aV0gPSBwZ3JbaV07CkBAIC0yOTgzLDExICszMDI0LDcgQEANCiAJayA9IGFkZF9zeW0odHlwZSk7 CQkvKiBhZGQgbmV3IHN5bWJvbCB0byBsaXN0ICovCiAJc3AgPSAmc3ltdltpdmNdW2tdOwogCi0J Zm9yIChpID0gMDtpPGRlY29zO2krKykgewotCQlzcC0+ZGMudFtpXSA9IGR0eXBlW2ldOwotCQlW NSAiJXM6IHN5bXZbJWRdWyVkXSBkZWNvcmF0aW9uICVkIGlzIHR5cGUgJWQuXG4iLEYsaXZjLGss aSxzcC0+ZGMudFtpXSBWOwotCX0KLQlzcC0+ZGMubiA9IGRlY29zOwkJLyogRGVjb3JhdGlvbiBj b3VudCAqLworICAgIGNvcHlEZWNvc1RvU3ltIChzcCk7CiAJc3AtPmdyLm4gPSBuZ3I7CQkJLyog R3JhY2Ugbm90ZSBjb3VudCAqLwogCVY1ICIlczogQmFyIHN5bXZbJWRdWyVkXSBoYXMgJWQgZGVj b3JhdGlvbnMgYW5kICVkIGdyYWNlIG5vdGVzLlxuIixGLGl2YyxrLHNwLT5kYy5uLHNwLT5nci5u IFY7CiAJZm9yIChpID0gMDtpPG5ncjtpKyspIHsKQEAgLTMwMzgsOSArMzA3NSw3IEBADQogCQkJ fQogCQkJcHJzRGVjbygpOwkvKiBmb3IgZXh0cmEgZGVjb3JhdGlvbnMgd2l0aGluIGNob3JkICov CiAJCQlWNSAiJXM6ICVkIGRlY29zIGZvdW5kIGluIGNob3JkLlxuIixGLGRlY29zIFY7Ci0JCQlm b3IgKGkgPSAwO2k8ZGVjb3M7aSsrKQotCQkJCXNwLT5kYy50W2krc3AtPmRjLm5dID0gZHR5cGVb aV07Ci0JCQlzcC0+ZGMubiA9IGRlY29zOworICAgICAgICAgICAgY29weURlY29zVG9TeW0gKHNw KTsKIAogCQkJaWYgKChyYyA9IHBhcnNlX2Jhc2ljX25vdGUoJnBpdGNoLCZsZW5ndGgsJmFjY2lk ZW50YWwpKSA9PSAwKSB7CiAJCQkJdm9pY2VbaXZjXS5uc3ltLS07CkBAIC0zMTM1LDYgKzMxNzAs NyBAQA0KICNlbmRpZgogCWlkZW50aWZ5X25vdGUoJnN5bXZbaXZjXVtrXSxxMCk7CiAJVjMgIiVz OiBzeW12WyVkXVslZF0gcmV0dXJucyB0eXBlICVkIHdpdGggYW5ub3RhdGlvbiAhJXMhXG4iLEYs aXZjLGssdHlwZSxUZXh0U3RyKHNwLT5hbm4pIFY7CisgICAgY2xlYXJEZWNvcyAoKTsKIAlyZXR1 cm4gdHlwZTsKIH0KIApAQCAtMzE5Niw3ICszMjMyLDYgQEANCiAJaW50IGk7CiAKIAlWNSAiJXM6 IENhbGxlZCBhdCA8JXM+XG4iLEYsUCBWOwotCWRlY29zID0gMDsKIAlkb01hY3JvKCk7CiAJaWYg KHByc0FubigpKSAgICAgICAgICB7VjQgIiVzOiBSZXR1cm4gJWQ9QU5OT1RcbiIsRixBTk5PVCBW OyAgICAgcmV0dXJuIEFOTk9UO30KIAlpZiAocHJzQWNoKCkpICAgICAgICAgIHtWNCAiJXM6IFJl dHVybiAlZD1BQ0hPUkRcbiIsRixBQ0hPUkQgVjsgICByZXR1cm4gQUNIT1JEO30KQEAgLTMzMTAs NiArMzM0NSw3IEBADQogCW5iciA9IDA7CiAJUCA9IFEgPSBsaW5lOwkJLy8gUG9zaXRpb25zIGlu IG11c2ljIGxpbmUKIAlwbXggPSBQK3N0cmxlbihQKTsJLy8gRW5kIG9mIG11c2ljIGxpbmUKKyAg ICBjbGVhckRlY29zICgpOwogCiAJd2hpbGUgKCpQICE9IDApIHsJLy8gRW5kIGF0IG51bGwgYnl0 ZQogCQlpZiAodmIgPiA2KSB7CkluZGV4OiBwYXJzZS5oDQo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0gcGFyc2Uu aAkocmV2aXNpb24gNDkyNSkNCisrKyBwYXJzZS5oCSh3b3JraW5nIGNvcHkpDQpAQCAtMTAsOSAr MTAsMTAgQEANCiAjaW5jbHVkZSAiamNhYmMycHMuaCIKIAogZXh0ZXJuIGludCBvbGRrczsKLWV4 dGVybiBpbnQgZHR5cGVbMzBdOwkJLyogRGVjb3JhdGlvbiB0eXBlcyAqLwotZXh0ZXJuIGludCBk ZWNvczsJCS8qIE51bWJlciBvZiBkZWNvcmF0aW9ucyBvbiBjdXJyZW50IHN5bWJvbCAqLworLy8g ZXh0ZXJuIGludCBkdHlwZVszMF07CQkvKiBEZWNvcmF0aW9uIHR5cGVzICovCisvLyBleHRlcm4g aW50IGRlY29zOwkJLyogTnVtYmVyIG9mIGRlY29yYXRpb25zIG9uIGN1cnJlbnQgc3ltYm9sICov CiAKK3ZvaWQgYWRkRGVjbyhpbnQgZGVjb190eXBlKTsKIGludCAgYWRkX3N5bShpbnQgdHlwZSk7 CiBpbnQgIGZpbmRfdm9pY2UoY2hhciB2aWRbXSwgaW50ICpuZXcpOwogaW50ICBnZXRfaGFsZnRv bmVzKHN0cnVjdCBLRVlTVFIga2V5LCBjaGFyIHRyYW5zcG9zZVtdKTsKSW5kZXg6IG11c2ljLmMN Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0NCi0tLSBtdXNpYy5jCShyZXZpc2lvbiA0OTI1KQ0KKysrIG11c2ljLmMJKHdv cmtpbmcgY29weSkNCkBAIC0yMDY5LDYgKzIwNjksNyBAQA0KIAlTeW0gICpzcCkJLy8gU3ltYm9s CiB7CWNoYXIgKkY9ImRyYXdCYXIiOwogCWludCAgIG47CisgICAgZmxvYXQgdG9wLCB0b3AyOwog CiAJVjUgIiVzOiBDYWxsZWQgYXQgeD0lLjJmIHNwLT51PSVkLlxuIixGLHgsc3AtPnUgVjsKIAlp ZiAoc3AtPmdyLm4gPiAwKSB7CkBAIC0yMTIyLDYgKzIxMjMsMTAgQEANCiAJfSBlbHNlIHsKIAkJ ZnByaW50ZihzdGRlcnIsIj4+PiBkb250IGtub3cgaG93IHRvIGRyYXcgYmFyIHR5cGUgJWRcbiIs IHNwLT51KTsKIAl9CisKKyAgICBQVVQxKCIveCAlLjJmIGRlZiIsIHgpCisgICAgdG9wID0gZHJh d0RlY29zICh4LHNwLCZ0b3AyKTsgICAgICAgICAgICAgICAgLyogYWRkIGRlY29yYXRpb25zICov CisKIAlQVVQwKCJcbiIpCiB9CiAKQEAgLTIzMjAsMzYgKzIzMjUsNDQgQEANCiB7IAljaGFyICpG ID0gImRyYXdSZXN0IjsKIAlpbnQgeSxpOwogCWZsb2F0IGRvdHgsZG90eTsKKyAgICBmbG9hdCB0 b3AsIHRvcDI7CiAKIAlkcmF3R3JhY2VOb3Rlcyh4LCB3LCBkLCAmcyk7CQkJCQkvKiBkcmF3IGdy YWNlIG5vdGVzICovCiAKIAkqYWNoeSA9IERmbENoWVlBOwogCSphbm55ID0gRGZsQW5ZWUE7Ci0J aWYgKHMuaW52aXMpIHJldHVybjsKKwlpZiAoIXMuaW52aXMpCisgICAgeworICAgIAl5ID0gKGlu dClzLnk7CisgICAgCVBVVDIoIiUuMmYgJS4wZiIsIHgsIHl5KQogCi0JeSA9IChpbnQpcy55Owot CVBVVDIoIiUuMmYgJS4wZiIsIHgsIHl5KQorICAgIAlpZiAocy5oZWFkID09IEhfT1ZBTCkgICAg IHtQVVQwKCIgcjEiKTt9CisgICAgCWVsc2lmIChzLmhlYWQgPT0gSF9FTVBUWSkge1BVVDAoIiBy MiIpO30KKyAgICAJZWxzZSB7CisgICAgCQlpZiAocy5mbGFncyA9PSAwKSAgICAge1BVVDAoIiBy NCIpO30KKyAgICAJCWVsc2lmIChzLmZsYWdzID09IDEpICB7UFVUMCgiIHI4Iik7fQorICAgIAkJ ZWxzaWYgKHMuZmxhZ3MgPT0gMikgIHtQVVQwKCIgcjE2Iik7fQorICAgIAkJZWxzaWYgKHMuZmxh Z3MgPT0gMykgIHtQVVQwKCIgcjMyIik7fQorICAgIAkJZWxzZSAgICAgICAgICAgICAgICAgIHtQ VVQwKCIgcjY0Iik7fQorICAgIAl9CiAKLQlpZiAocy5oZWFkID09IEhfT1ZBTCkgICAgIHtQVVQw KCIgcjEiKTt9Ci0JZWxzaWYgKHMuaGVhZCA9PSBIX0VNUFRZKSB7UFVUMCgiIHIyIik7fQotCWVs c2UgewotCQlpZiAocy5mbGFncyA9PSAwKSAgICAge1BVVDAoIiByNCIpO30KLQkJZWxzaWYgKHMu ZmxhZ3MgPT0gMSkgIHtQVVQwKCIgcjgiKTt9Ci0JCWVsc2lmIChzLmZsYWdzID09IDIpICB7UFVU MCgiIHIxNiIpO30KLQkJZWxzaWYgKHMuZmxhZ3MgPT0gMykgIHtQVVQwKCIgcjMyIik7fQotCQll bHNlICAgICAgICAgICAgICAgICAge1BVVDAoIiByNjQiKTt9Ci0JfQorICAgIAlpZiAoeSU2KSB7 IGRvdHg9Ni41OyBkb3R5PTA7IH0gICAgICAgICAgICAgICAgICAgLyogZG90cyAqLworICAgIAll bHNlICAgICB7IGRvdHg9Ni41OyBkb3R5PTM7IH0KKyAgICAJaWYgKHMuaGVhZCA9PSBIX09WQUwp ICB7IGRvdHg9ODsgZG90eT0tMzsgfQorICAgIAlpZiAocy5oZWFkID09IEhfRU1QVFkpIHsgZG90 eD04OyBkb3R5PTM7ICB9CisgICAgCWZvciAoaT0wO2k8cy5kb3RzO2krKykgeworICAgIAkJUFVU MigiICUuMWYgJS4xZiBkdCIsIGRvdHgsIGRvdHkpCisgICAgCQlkb3R4PWRvdHgrMy41OworICAg IAl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIGRlZmluZSB4IHNvIHRoZSBk ZWNvcmF0aW9ucyBrbm93IHdoZXJlIHRvIGdvIQorICAgIAlQVVQxKCIveCAlLjJmIGRlZiIsIHgp CisgICAgfQogCi0JaWYgKHklNikgeyBkb3R4PTYuNTsgZG90eT0wOyB9ICAgICAgICAgICAgICAg ICAgIC8qIGRvdHMgKi8KLQllbHNlICAgICB7IGRvdHg9Ni41OyBkb3R5PTM7IH0KLQlpZiAocy5o ZWFkID09IEhfT1ZBTCkgIHsgZG90eD04OyBkb3R5PS0zOyB9Ci0JaWYgKHMuaGVhZCA9PSBIX0VN UFRZKSB7IGRvdHg9ODsgZG90eT0zOyAgfQotCWZvciAoaT0wO2k8cy5kb3RzO2krKykgewotCQlQ VVQyKCIgJS4xZiAlLjFmIGR0IiwgZG90eCwgZG90eSkKLQkJZG90eD1kb3R4KzMuNTsKLQl9CisJ dG9wID0gZHJhd0RlY29zICh4LCZzLCZ0b3AyKTsgICAgICAgICAgICAgICAgLyogYWRkIGRlY29y YXRpb25zICovCiAKLQogCVBVVDAoIlxuIikKIH0KIApAQCAtMjY0NCw2ICsyNjU3LDMwIEBADQog CQkJaWYgKHRvcDx5YysxMikgdG9wPXljKzEyOwogCQkJUFVUMSgiICUuMWYgaGxkIiwgeWMpCiAJ CX0KKwkJaWYgKGRlY28gPT0gRF9TRUdOTykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q IHNlZ25vIHNpZ24gKi8KKwkJCXljPTI3OworCQkJaWYgKHMtPnN0ZW0gPT0gMSkgeworCQkJCXkx PXMtPnlzKzQ7CisJCQl9IGVsc2UgeworCQkJCXkxPXMtPnlteCs2OworCQkJfQorCQkJaWYgKHlj PHkxKSB5Yz15MTsKKwkJCWlmICh5Yzx0b3ArNCkgeWM9dG9wKzQ7CisJCQlpZiAodG9wPHljKzEy KSB0b3A9eWMrMTI7CisJCQlQVVQxKCIgJS4xZiBzZWdubyIsIHljKQorCQl9CisJCWlmIChkZWNv ID09IERfQ09EQSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGEgc2lnbiAqLwor CQkJeWM9Mjc7CisJCQlpZiAocy0+c3RlbSA9PSAxKSB7CisJCQkJeTE9cy0+eXMrNDsKKwkJCX0g ZWxzZSB7CisJCQkJeTE9cy0+eW14KzY7CisJCQl9CisJCQlpZiAoeWM8eTEpIHljPXkxOworCQkJ aWYgKHljPHRvcCs0KSB5Yz10b3ArNDsKKwkJCWlmICh0b3A8eWMrMTIpIHRvcD15YysxMjsKKwkJ CVBVVDEoIiAlLjFmIGNvZGEiLCB5YykKKwkJfQogCQlpZiAoZGVjbyA9PSBEX1RSSUxMKSB7ICAg ICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmlsbCBzaWduICovCiAJCQl5Yz0zMDsKIAkJCWlm IChzLT5zdGVtID09IDEpIHsK ------=_Part_54453_20771057.1169405832440--