From: tadayoshi funaba Date: 2010-12-04T10:05:11+09:00 Subject: [ruby-core:33557] [Ruby 1.9-Feature#4068] Replace current standard Date/DateTime library with home_run --mimepart_4cf993c44c746_2647b7c37825cc Content-Type: text/plain Content-Transfer-Encoding: Quoted-printable Content-Disposition: inline Issue #4068 has been updated by tadayoshi funaba. File switch_hitter.patch added File bm2.rb added i've just written initial version of "switch_hitter". i've attached the patch to trunk and a script. swich_hitter provides both speed and quality. swich_hitter has highly compatibility with the current date. > d =3D Date.new(2001,2,23) #=3D> # > d + 1 #=3D> # > d +=3D Rational(3,2) #=3D> # > d.ctime #=3D> "Sat Feb 24 12:00:00 2001" > d =3D Date.new(1582,10,15) #=3D> # > d - 1 #=3D> # swich_hitter is fast only on purely small gregorian dates. i didn't enough replace methods with c yet. however, switch_hitter and home_run are even on some cases, i think. switch_hitter: user system total real Date::valid_date?: 0.030000 0.000000 0.030000 ( 0.029646) Date::new: 0.040000 0.000000 0.040000 ( 0.042592) Date#to_s: 0.080000 0.000000 0.080000 ( 0.072524) Date#+: 0.040000 0.000000 0.040000 ( 0.042738) Date#-: 0.050000 0.000000 0.050000 ( 0.048020) [Date]#sort: 0.220000 0.000000 0.220000 ( 0.224903) home_run: user system total real Date::valid_date?: 0.030000 0.000000 0.030000 ( 0.022076) Date::new: 0.040000 0.000000 0.040000 ( 0.048092) Date#to_s: 0.100000 0.000000 0.100000 ( 0.093716) Date#+: 0.030000 0.000000 0.030000 ( 0.034154) Date#-: 0.040000 0.000000 0.040000 ( 0.033082) [Date]#sort: 0.270000 0.000000 0.270000 ( 0.262382) ---------------------------------------- http://redmine.ruby-lang.org/issues/show/4068 ---------------------------------------- http://redmine.ruby-lang.org --mimepart_4cf993c44c746_2647b7c37825cc Content-Type: text/x-patch; name=switch_hitter.patch Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=switch_hitter.patch SW5kZXg6IGxpYi9kYXRlLnJiCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGxpYi9kYXRlLnJiCShyZXZpc2lvbiAzMDA3NCkKKysrIGxpYi9kYXRlLnJi CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogIwotIyBkYXRlLnJi IC0gZGF0ZSBhbmQgdGltZSBsaWJyYXJ5CisjIGRhdGUucmIgPHN3aXRjaF9o aXR0ZXI+IC0gZGF0ZSBhbmQgdGltZSBsaWJyYXJ5CiAjCiAjIEF1dGhvcjog VGFkYXlvc2hpIEZ1bmFiYSAxOTk4LTIwMTAKICMKQEAgLTcxOSwyNSArNzE5 LDE0IEBACiAgIGRlZiBzZWxmLmdyZWdvcmlhbl9sZWFwPyAoeSkgeSAlIDQg PT0gMCAmJiB5ICUgMTAwICE9IDAgfHwgeSAlIDQwMCA9PSAwIGVuZAogCiAg IGNsYXNzIDw8IHNlbGY7IGFsaWFzX21ldGhvZCA6bGVhcD8sIDpncmVnb3Jp YW5fbGVhcD8gZW5kCi0gIGNsYXNzIDw8IHNlbGY7IGFsaWFzX21ldGhvZCA6 bmV3ISwgOm5ldyBlbmQKIAotICBkZWYgc2VsZi52YWxpZF9qZD8gKGpkLCBz Zz1JVEFMWSkKLSAgICAhIV92YWxpZF9qZD8oamQsIHNnKQotICBlbmQKKyAg ZGVmIHNlbGYudmFsaWRfamQ/KCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRl ZEVycm9yIGVuZAorICBkZWYgc2VsZi52YWxpZF9vcmRpbmFsPygqYXJncykg cmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKyAgZGVmIHNlbGYudmFs aWRfY2l2aWw/KCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVu ZAogCi0gIGRlZiBzZWxmLnZhbGlkX29yZGluYWw/ICh5LCBkLCBzZz1JVEFM WSkKLSAgICAhIV92YWxpZF9vcmRpbmFsPyh5LCBkLCBzZykKLSAgZW5kCi0K LSAgZGVmIHNlbGYudmFsaWRfY2l2aWw/ICh5LCBtLCBkLCBzZz1JVEFMWSkK LSAgICAhIV92YWxpZF9jaXZpbD8oeSwgbSwgZCwgc2cpCi0gIGVuZAotCiAg IGNsYXNzIDw8IHNlbGY7IGFsaWFzX21ldGhvZCA6dmFsaWRfZGF0ZT8sIDp2 YWxpZF9jaXZpbD8gZW5kCiAKLSAgZGVmIHNlbGYudmFsaWRfY29tbWVyY2lh bD8gKHksIHcsIGQsIHNnPUlUQUxZKQotICAgICEhX3ZhbGlkX2NvbW1lcmNp YWw/KHksIHcsIGQsIHNnKQotICBlbmQKKyAgZGVmIHNlbGYudmFsaWRfY29t bWVyY2lhbD8oKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5k CiAKICAgZGVmIHNlbGYudmFsaWRfd2Vla251bT8gKHksIHcsIGQsIGYsIHNn PUlUQUxZKSAjIDpub2RvYzoKICAgICAhIV92YWxpZF93ZWVrbnVtPyh5LCB3 LCBkLCBmLCBzZykKQEAgLTc2MiwxMCArNzUxLDcgQEAKICAgIyAramQrIGlz IHRoZSBKdWxpYW4gRGF5IE51bWJlcjsgaWYgbm90IHNwZWNpZmllZCwgaXQg ZGVmYXVsdHMgdG8KICAgIyAwLgogICAjICtzZysgc3BlY2lmaWVzIHRoZSBE YXkgb2YgQ2FsZW5kYXIgUmVmb3JtLgotICBkZWYgc2VsZi5qZChqZD0wLCBz Zz1JVEFMWSkKLSAgICBqZCA9IF92YWxpZF9qZD8oamQsIHNnKQotICAgIG5l dyEoamRfdG9fYWpkKGpkLCAwLCAwKSwgMCwgc2cpCi0gIGVuZAorICBkZWYg c2VsZi5qZCgqYXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQK IAogICAjIENyZWF0ZSBhIG5ldyBEYXRlIG9iamVjdCBmcm9tIGFuIE9yZGlu YWwgRGF0ZSwgc3BlY2lmaWVkCiAgICMgYnkgeWVhciAreSsgYW5kIGRheS1v Zi15ZWFyICtkKy4gK2QrIGNhbiBiZSBuZWdhdGl2ZSwKQEAgLTc3NywxMiAr NzYzLDcgQEAKICAgIyBOdW1iZXIgZGF5IDAuCiAgICMKICAgIyArc2crIHNw ZWNpZmllcyB0aGUgRGF5IG9mIENhbGVuZGFyIFJlZm9ybS4KLSAgZGVmIHNl bGYub3JkaW5hbCh5PS00NzEyLCBkPTEsIHNnPUlUQUxZKQotICAgIHVubGVz cyBqZCA9IF92YWxpZF9vcmRpbmFsPyh5LCBkLCBzZykKLSAgICAgIHJhaXNl IEFyZ3VtZW50RXJyb3IsICdpbnZhbGlkIGRhdGUnCi0gICAgZW5kCi0gICAg bmV3IShqZF90b19hamQoamQsIDAsIDApLCAwLCBzZykKLSAgZW5kCisgIGRl ZiBzZWxmLm9yZGluYWwoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJy b3IgZW5kCiAKICAgIyBDcmVhdGUgYSBuZXcgRGF0ZSBvYmplY3QgZm9yIHRo ZSBDaXZpbCBEYXRlIHNwZWNpZmllZCBieQogICAjIHllYXIgK3krLCBtb250 aCArbSssIGFuZCBkYXktb2YtbW9udGggK2QrLgpAQCAtNzk3LDEyICs3Nzgs NyBAQAogICAjIEp1bGlhbiBEYXkgTnVtYmVyIGRheSAwLgogICAjCiAgICMg K3NnKyBzcGVjaWZpZXMgdGhlIERheSBvZiBDYWxlbmRhciBSZWZvcm0uCi0g IGRlZiBzZWxmLmNpdmlsKHk9LTQ3MTIsIG09MSwgZD0xLCBzZz1JVEFMWSkK LSAgICB1bmxlc3MgamQgPSBfdmFsaWRfY2l2aWw/KHksIG0sIGQsIHNnKQot ICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgJ2ludmFsaWQgZGF0ZScKLSAg ICBlbmQKLSAgICBuZXchKGpkX3RvX2FqZChqZCwgMCwgMCksIDAsIHNnKQot ICBlbmQKKyAgZGVmIHNlbGYuY2l2aWwoKmFyZ3MpIHJhaXNlIE5vdEltcGxl bWVudGVkRXJyb3IgZW5kCiAKICAgY2xhc3MgPDwgc2VsZjsgYWxpYXNfbWV0 aG9kIDpuZXcsIDpjaXZpbCBlbmQKIApAQCAtODIwLDEyICs3OTYsNyBAQAog ICAjIEp1bGlhbiBEYXkgTnVtYmVyIGRheSAwLgogICAjCiAgICMgK3NnKyBz cGVjaWZpZXMgdGhlIERheSBvZiBDYWxlbmRhciBSZWZvcm0uCi0gIGRlZiBz ZWxmLmNvbW1lcmNpYWwoeT0tNDcxMiwgdz0xLCBkPTEsIHNnPUlUQUxZKQot ICAgIHVubGVzcyBqZCA9IF92YWxpZF9jb21tZXJjaWFsPyh5LCB3LCBkLCBz ZykKLSAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICdpbnZhbGlkIGRhdGUn Ci0gICAgZW5kCi0gICAgbmV3IShqZF90b19hamQoamQsIDAsIDApLCAwLCBz ZykKLSAgZW5kCisgIGRlZiBzZWxmLmNvbW1lcmNpYWwoKmFyZ3MpIHJhaXNl IE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCiAKICAgZGVmIHNlbGYud2Vla251 bSh5PS00NzEyLCB3PTAsIGQ9MSwgZj0wLCBzZz1JVEFMWSkKICAgICB1bmxl c3MgamQgPSBfdmFsaWRfd2Vla251bT8oeSwgdywgZCwgZiwgc2cpCkBAIC0x MDM0LDEwICsxMDA1LDcgQEAKICAgIwogICAjIEFuIEFyZ3VtZW50RXJyb3Ig d2lsbCBiZSByYWlzZWQgaWYgK3N0cisgY2Fubm90IGJlCiAgICMgcGFyc2Vk LgotICBkZWYgc2VsZi5zdHJwdGltZShzdHI9Jy00NzEyLTAxLTAxJywgZm10 PSclRicsIHNnPUlUQUxZKQotICAgIGVsZW0gPSBfc3RycHRpbWUoc3RyLCBm bXQpCi0gICAgbmV3X2J5X2ZyYWdzKGVsZW0sIHNnKQotICBlbmQKKyAgZGVm IHNlbGYuc3RycHRpbWUoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJy b3IgZW5kCiAKICAgIyBDcmVhdGUgYSBuZXcgRGF0ZSBvYmplY3QgYnkgcGFy c2luZyBmcm9tIGEgU3RyaW5nLAogICAjIHdpdGhvdXQgc3BlY2lmeWluZyB0 aGUgZm9ybWF0LgpAQCAtMTA1NCw0MyArMTAyMiwxOCBAQAogICAjIERheSBO dW1iZXIgZGF5IDAuCiAgICMKICAgIyArc2crIHNwZWNpZmllcyB0aGUgRGF5 IG9mIENhbGVuZGFyIFJlZm9ybS4KLSAgZGVmIHNlbGYucGFyc2Uoc3RyPSct NDcxMi0wMS0wMScsIGNvbXA9dHJ1ZSwgc2c9SVRBTFkpCi0gICAgZWxlbSA9 IF9wYXJzZShzdHIsIGNvbXApCi0gICAgbmV3X2J5X2ZyYWdzKGVsZW0sIHNn KQotICBlbmQKKyAgZGVmIHNlbGYucGFyc2UoKmFyZ3MpIHJhaXNlIE5vdElt cGxlbWVudGVkRXJyb3IgZW5kCiAKLSAgZGVmIHNlbGYuaXNvODYwMShzdHI9 Jy00NzEyLTAxLTAxJywgc2c9SVRBTFkpICMgOm5vZG9jOgotICAgIGVsZW0g PSBfaXNvODYwMShzdHIpCi0gICAgbmV3X2J5X2ZyYWdzKGVsZW0sIHNnKQot ICBlbmQKKyAgZGVmIHNlbGYuaXNvODYwMSgqYXJncykgcmFpc2UgTm90SW1w bGVtZW50ZWRFcnJvciBlbmQKKyAgZGVmIHNlbGYucmZjMzMzOSgqYXJncykg cmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKyAgZGVmIHNlbGYueG1s c2NoZW1hKCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVuZAor ICBkZWYgc2VsZi5yZmMyODIyKCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRl ZEVycm9yIGVuZAogCi0gIGRlZiBzZWxmLnJmYzMzMzkoc3RyPSctNDcxMi0w MS0wMVQwMDowMDowMCswMDowMCcsIHNnPUlUQUxZKSAjIDpub2RvYzoKLSAg ICBlbGVtID0gX3JmYzMzMzkoc3RyKQotICAgIG5ld19ieV9mcmFncyhlbGVt LCBzZykKLSAgZW5kCi0KLSAgZGVmIHNlbGYueG1sc2NoZW1hKHN0cj0nLTQ3 MTItMDEtMDEnLCBzZz1JVEFMWSkgIyA6bm9kb2M6Ci0gICAgZWxlbSA9IF94 bWxzY2hlbWEoc3RyKQotICAgIG5ld19ieV9mcmFncyhlbGVtLCBzZykKLSAg ZW5kCi0KLSAgZGVmIHNlbGYucmZjMjgyMihzdHI9J01vbiwgMSBKYW4gLTQ3 MTIgMDA6MDA6MDAgKzAwMDAnLCBzZz1JVEFMWSkgIyA6bm9kb2M6Ci0gICAg ZWxlbSA9IF9yZmMyODIyKHN0cikKLSAgICBuZXdfYnlfZnJhZ3MoZWxlbSwg c2cpCi0gIGVuZAotCiAgIGNsYXNzIDw8IHNlbGY7IGFsaWFzX21ldGhvZCA6 cmZjODIyLCA6cmZjMjgyMiBlbmQKIAotICBkZWYgc2VsZi5odHRwZGF0ZShz dHI9J01vbiwgMDEgSmFuIC00NzEyIDAwOjAwOjAwIEdNVCcsIHNnPUlUQUxZ KSAjIDpub2RvYzoKLSAgICBlbGVtID0gX2h0dHBkYXRlKHN0cikKLSAgICBu ZXdfYnlfZnJhZ3MoZWxlbSwgc2cpCi0gIGVuZAorICBkZWYgc2VsZi5odHRw ZGF0ZSgqYXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKyAg ZGVmIHNlbGYuamlzeDAzMDEoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVk RXJyb3IgZW5kCiAKLSAgZGVmIHNlbGYuamlzeDAzMDEoc3RyPSctNDcxMi0w MS0wMScsIHNnPUlUQUxZKSAjIDpub2RvYzoKLSAgICBlbGVtID0gX2ppc3gw MzAxKHN0cikKLSAgICBuZXdfYnlfZnJhZ3MoZWxlbSwgc2cpCi0gIGVuZAot CiAgIGNsYXNzIDw8IHNlbGYKIAogICAgIGRlZiBvbmNlKCppZHMpICMgOm5v ZG9jOiAtLSByZXN0cmljdGVkCkBAIC0xMTAzLDcgKzEwNDYsNyBAQAogCSAg ZW5kCiAJZW5kOwogICAgICAgZW5kCi0gICAgZW5kCisgICAgZW5kICMgPDxk dW1teQogCiAgICAgcHJpdmF0ZSA6b25jZQogCkBAIC0xMTI4LDIwICsxMDcx LDE3IEBACiAgICMKICAgIyBVc2luZyBvbmUgb2YgdGhlIGZhY3RvcnkgbWV0 aG9kcyBzdWNoIGFzIERhdGU6OmNpdmlsIGlzCiAgICMgZ2VuZXJhbGx5IGVh c2llciBhbmQgc2FmZXIuCi0gIGRlZiBpbml0aWFsaXplKGFqZD0wLCBvZj0w LCBzZz1JVEFMWSkKLSAgICBAYWpkLCBAb2YsIEBzZyA9IGFqZCwgb2YsIHNn Ci0gICAgQF9fY2FfXyA9IHt9Ci0gIGVuZAorICBkZWYgaW5pdGlhbGl6ZSgq YXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKIAogICAjIEdl dCB0aGUgZGF0ZSBhcyBhbiBBc3Ryb25vbWljYWwgSnVsaWFuIERheSBOdW1i ZXIuCiAgIGRlZiBhamQoKSBAYWpkIGVuZAogCiAgICMgR2V0IHRoZSBkYXRl IGFzIGFuIEFzdHJvbm9taWNhbCBNb2RpZmllZCBKdWxpYW4gRGF5IE51bWJl ci4KLSAgZGVmIGFtamQoKSBhamRfdG9fYW1qZChAYWpkKSBlbmQKKyAgZGVm IGFtamQoKSBhamRfdG9fYW1qZChhamQpIGVuZAogCiAgIG9uY2UgOmFtamQK IAotICBkZWYgZGF5bnVtKCkgYWpkX3RvX2pkKEBhamQsIEBvZikgZW5kCisg IGRlZiBkYXludW0oKSBhamRfdG9famQoYWpkLCBvZmZzZXQpIGVuZAogCiAg IG9uY2UgOmRheW51bQogICBwcml2YXRlIDpkYXludW0KQEAgLTExNjIsMTYg KzExMDIsMTYgQEAKICAgb25jZSA6amQsIDpkYXlfZnJhY3Rpb24sIDptamQs IDpsZAogCiAgICMgR2V0IHRoZSBkYXRlIGFzIGEgQ2l2aWwgRGF0ZSwgW3ll YXIsIG1vbnRoLCBkYXlfb2ZfbW9udGhdCi0gIGRlZiBjaXZpbCgpIGpkX3Rv X2NpdmlsKGpkLCBAc2cpIGVuZCAjIDpub2RvYzoKKyAgZGVmIGNpdmlsKCkg amRfdG9fY2l2aWwoamQsIHN0YXJ0KSBlbmQgIyA6bm9kb2M6CiAKICAgIyBH ZXQgdGhlIGRhdGUgYXMgYW4gT3JkaW5hbCBEYXRlLCBbeWVhciwgZGF5X29m X3llYXJdCi0gIGRlZiBvcmRpbmFsKCkgamRfdG9fb3JkaW5hbChqZCwgQHNn KSBlbmQgIyA6bm9kb2M6CisgIGRlZiBvcmRpbmFsKCkgamRfdG9fb3JkaW5h bChqZCwgc3RhcnQpIGVuZCAjIDpub2RvYzoKIAogICAjIEdldCB0aGUgZGF0 ZSBhcyBhIENvbW1lcmNpYWwgRGF0ZSwgW3llYXIsIHdlZWtfb2ZfeWVhciwg ZGF5X29mX3dlZWtdCi0gIGRlZiBjb21tZXJjaWFsKCkgamRfdG9fY29tbWVy Y2lhbChqZCwgQHNnKSBlbmQgIyA6bm9kb2M6CisgIGRlZiBjb21tZXJjaWFs KCkgamRfdG9fY29tbWVyY2lhbChqZCwgc3RhcnQpIGVuZCAjIDpub2RvYzoK IAotICBkZWYgd2Vla251bTAoKSBqZF90b193ZWVrbnVtKGpkLCAwLCBAc2cp IGVuZCAjIDpub2RvYzoKLSAgZGVmIHdlZWtudW0xKCkgamRfdG9fd2Vla251 bShqZCwgMSwgQHNnKSBlbmQgIyA6bm9kb2M6CisgIGRlZiB3ZWVrbnVtMCgp IGpkX3RvX3dlZWtudW0oamQsIDAsIHN0YXJ0KSBlbmQgIyA6bm9kb2M6Cisg IGRlZiB3ZWVrbnVtMSgpIGpkX3RvX3dlZWtudW0oamQsIDEsIHN0YXJ0KSBl bmQgIyA6bm9kb2M6CiAKICAgb25jZSA6Y2l2aWwsIDpvcmRpbmFsLCA6Y29t bWVyY2lhbCwgOndlZWtudW0wLCA6d2Vla251bTEKICAgcHJpdmF0ZSA6Y2l2 aWwsIDpvcmRpbmFsLCA6Y29tbWVyY2lhbCwgOndlZWtudW0wLCA6d2Vla251 bTEKQEAgLTEyNzUsNyArMTIxNSw3IEBACiAgIHByaXZhdGUgOm50aF9rZGF5 PwogCiAgICMgSXMgdGhlIGN1cnJlbnQgZGF0ZSBvbGQtc3R5bGUgKEp1bGlh biBDYWxlbmRhcik/Ci0gIGRlZiBqdWxpYW4/ICgpIGpkIDwgQHNnIGVuZAor ICBkZWYganVsaWFuPyAoKSBqZCA8IHN0YXJ0IGVuZAogCiAgICMgSXMgdGhl IGN1cnJlbnQgZGF0ZSBuZXctc3R5bGUgKEdyZWdvcmlhbiBDYWxlbmRhcik/ CiAgIGRlZiBncmVnb3JpYW4/ICgpICFqdWxpYW4/IGVuZApAQCAtMTMwMiw3 ICsxMjQyLDcgQEAKICAgZGVmIHN0YXJ0KCkgQHNnIGVuZAogCiAgICMgQ3Jl YXRlIGEgY29weSBvZiB0aGlzIERhdGUgb2JqZWN0IHVzaW5nIGEgbmV3IERh eSBvZiBDYWxlbmRhciBSZWZvcm0uCi0gIGRlZiBuZXdfc3RhcnQoc2c9c2Vs Zi5jbGFzczo6SVRBTFkpIHNlbGYuY2xhc3MubmV3IShAYWpkLCBAb2YsIHNn KSBlbmQKKyAgZGVmIG5ld19zdGFydCgqYXJncykgcmFpc2UgTm90SW1wbGVt ZW50ZWRFcnJvciBlbmQKIAogICAjIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBE YXRlIG9iamVjdCB0aGF0IHVzZXMgdGhlIEl0YWxpYW4vQ2F0aG9saWMKICAg IyBEYXkgb2YgQ2FsZW5kYXIgUmVmb3JtLgpAQCAtMTMyMiwxMiArMTI2Miw3 IEBACiAKICAgZGVmIG9mZnNldCgpIEBvZiBlbmQKIAotICBkZWYgbmV3X29m ZnNldChvZj0wKQotICAgIGlmIFN0cmluZyA9PT0gb2YKLSAgICAgIG9mID0g UmF0aW9uYWwoem9uZV90b19kaWZmKG9mKSB8fCAwLCA4NjQwMCkKLSAgICBl bmQKLSAgICBzZWxmLmNsYXNzLm5ldyEoQGFqZCwgb2YsIEBzZykKLSAgZW5k CisgIGRlZiBuZXdfb2Zmc2V0KCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRl ZEVycm9yIGVuZAogCiAgIHByaXZhdGUgOm9mZnNldCwgOm5ld19vZmZzZXQK IApAQCAtMTM0MCwxMiArMTI3NSw3IEBACiAgICMKICAgIyBJZiArbisgaXMg bm90IGEgTnVtZXJpYywgYSBUeXBlRXJyb3Igd2lsbCBiZSB0aHJvd24uICBJ bgogICAjIHBhcnRpY3VsYXIsIHR3byBEYXRlcyBjYW5ub3QgYmUgYWRkZWQg dG8gZWFjaCBvdGhlci4KLSAgZGVmICsgKG4pCi0gICAgY2FzZSBuCi0gICAg d2hlbiBOdW1lcmljOyByZXR1cm4gc2VsZi5jbGFzcy5uZXchKEBhamQgKyBu LCBAb2YsIEBzZykKLSAgICBlbmQKLSAgICByYWlzZSBUeXBlRXJyb3IsICdl eHBlY3RlZCBudW1lcmljJwotICBlbmQKKyAgZGVmICsgKCphcmdzKSByYWlz ZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVuZAogCiAgICMgSWYgK3grIGlzIGEg TnVtZXJpYyB2YWx1ZSwgY3JlYXRlIGEgbmV3IERhdGUgb2JqZWN0IHRoYXQg aXMKICAgIyAreCsgZGF5cyBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQgb25l LgpAQCAtMTM1NSwxMyArMTI4NSw3IEBACiAgICMgZGF0ZSBpcyB0aGFuICt4 Ky4KICAgIwogICAjIElmICt4KyBpcyBuZWl0aGVyIE51bWVyaWMgbm9yIGEg RGF0ZSwgYSBUeXBlRXJyb3IgaXMgcmFpc2VkLgotICBkZWYgLSAoeCkKLSAg ICBjYXNlIHgKLSAgICB3aGVuIE51bWVyaWM7IHJldHVybiBzZWxmLmNsYXNz Lm5ldyEoQGFqZCAtIHgsIEBvZiwgQHNnKQotICAgIHdoZW4gRGF0ZTsgICAg cmV0dXJuIEBhamQgLSB4LmFqZAotICAgIGVuZAotICAgIHJhaXNlIFR5cGVF cnJvciwgJ2V4cGVjdGVkIG51bWVyaWMgb3IgZGF0ZScKLSAgZW5kCisgIGRl ZiAtICgqYXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKIAog ICAjIENvbXBhcmUgdGhpcyBkYXRlIHdpdGggYW5vdGhlciBkYXRlLgogICAj CkBAIC0xMzc2LDggKzEzMDAsOCBAQAogICAjIGNvbnNpZGVyZWQgYXMgZmFs bGluZyBvbiBtaWRuaWdodCBVVEMuCiAgIGRlZiA8PT4gKG90aGVyKQogICAg IGNhc2Ugb3RoZXIKLSAgICB3aGVuIE51bWVyaWM7IHJldHVybiBAYWpkIDw9 PiBvdGhlcgotICAgIHdoZW4gRGF0ZTsgICAgcmV0dXJuIEBhamQgPD0+IG90 aGVyLmFqZAorICAgIHdoZW4gTnVtZXJpYzsgcmV0dXJuIGFqZCA8PT4gb3Ro ZXIKKyAgICB3aGVuIERhdGU7ICAgIHJldHVybiBhamQgPD0+IG90aGVyLmFq ZAogICAgIGVsc2UKICAgICAgIGJlZ2luCiAgICAgICAgIGwsIHIgPSBvdGhl ci5jb2VyY2Uoc2VsZikKQEAgLTEzODgsNiArMTMxMiwxNyBAQAogICAgIG5p bAogICBlbmQKIAorICBkZWYgY29lcmNlKG90aGVyKQorICAgIGNhc2Ugb3Ro ZXIKKyAgICB3aGVuIExpZ2h0CisgICAgICByZXR1cm4gUmlnaHQubmV3IShv dGhlci5hamQsIG90aGVyLl9fc2VuZF9fKDpvZmZzZXQpLCBvdGhlci5zdGFy dCksIHNlbGYKKyAgICB3aGVuIFJpZ2h0CisgICAgICByZXR1cm4gc2VsZiwg UmlnaHQubmV3IShzZWxmLmFqZCwgc2VsZi5fX3NlbmRfXyg6b2Zmc2V0KSwg c2VsZi5zdGFydCkKKyAgICBlbHNlCisgICAgICBzdXBlcgorICAgIGVuZAor ICBlbmQKKwogICAjIFRoZSByZWxhdGlvbnNoaXAgb3BlcmF0b3IgZm9yIERh dGUuCiAgICMKICAgIyBDb21wYXJlcyBkYXRlcyBieSBKdWxpYW4gRGF5IE51 bWJlci4gIFdoZW4gY29tcGFyaW5nCkBAIC0xNDIzLDcgKzEzNTgsNyBAQAog ICAgIHksIG0gPSAoeWVhciAqIDEyICsgKG1vbiAtIDEpICsgbikuZGl2bW9k KDEyKQogICAgIG0sICAgPSAobSArIDEpICAgICAgICAgICAgICAgICAgICAu ZGl2bW9kKDEpCiAgICAgZCA9IG1kYXkKLSAgICB1bnRpbCBqZDIgPSBfdmFs aWRfY2l2aWw/KHksIG0sIGQsIEBzZykKKyAgICB1bnRpbCBqZDIgPSBfdmFs aWRfY2l2aWw/KHksIG0sIGQsIHN0YXJ0KQogICAgICAgZCAtPSAxCiAgICAg ICByYWlzZSBBcmd1bWVudEVycm9yLCAnaW52YWxpZCBkYXRlJyB1bmxlc3Mg ZCA+IDAKICAgICBlbmQKQEAgLTE0ODYsMTEgKzE0MjEsMTEgQEAKICAgZGVm IGVxbD8gKG90aGVyKSBEYXRlID09PSBvdGhlciAmJiBzZWxmID09IG90aGVy IGVuZAogCiAgICMgQ2FsY3VsYXRlIGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBk YXRlLgotICBkZWYgaGFzaCgpIEBhamQuaGFzaCBlbmQKKyAgZGVmIGhhc2go KSBhamQuaGFzaCBlbmQKIAogICAjIFJldHVybiBpbnRlcm5hbCBvYmplY3Qg c3RhdGUgYXMgYSBwcm9ncmFtbWVyLXJlYWRhYmxlIHN0cmluZy4KICAgZGVm IGluc3BlY3QKLSAgICBmb3JtYXQoJyM8JXM6ICVzICglcywlcywlcyk+Jywg c2VsZi5jbGFzcywgdG9fcywgQGFqZCwgQG9mLCBAc2cpCisgICAgZm9ybWF0 KCcjPCVzOiAlcyAoJXMsJXMsJXMpPicsIHNlbGYuY2xhc3MsIHRvX3MsIGFq ZCwgb2Zmc2V0LCBzdGFydCkKICAgZW5kCiAKICAgIyBSZXR1cm4gdGhlIGRh dGUgYXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCkBAIC0xNTU5LDYgKzE0 OTQsOCBAQAogIwogY2xhc3MgRGF0ZVRpbWUgPCBEYXRlCiAKKyAgZGVmIHNl bGYubmV3KCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVuZAor CiAgICMgQ3JlYXRlIGEgbmV3IERhdGVUaW1lIG9iamVjdCBjb3JyZXNwb25k aW5nIHRvIHRoZSBzcGVjaWZpZWQKICAgIyBKdWxpYW4gRGF5IE51bWJlciAr amQrIGFuZCBob3VyICtoKywgbWludXRlICttaW4rLCBzZWNvbmQgK3MrLgog ICAjCkBAIC0xNTcyLDE2ICsxNTA5LDcgQEAKICAgIyArc2crIHNwZWNpZmll cyB0aGUgRGF5IG9mIENhbGVuZGFyIFJlZm9ybS4KICAgIwogICAjIEFsbCBk YXkvdGltZSB2YWx1ZXMgZGVmYXVsdCB0byAwLgotICBkZWYgc2VsZi5qZChq ZD0wLCBoPTAsIG1pbj0wLCBzPTAsIG9mPTAsIHNnPUlUQUxZKQotICAgIHVu bGVzcyAoamQgPSBfdmFsaWRfamQ/KGpkLCBzZykpICYmCi0JICAgKGZyID0g X3ZhbGlkX3RpbWU/KGgsIG1pbiwgcykpCi0gICAgICByYWlzZSBBcmd1bWVu dEVycm9yLCAnaW52YWxpZCBkYXRlJwotICAgIGVuZAotICAgIGlmIFN0cmlu ZyA9PT0gb2YKLSAgICAgIG9mID0gUmF0aW9uYWwoem9uZV90b19kaWZmKG9m KSB8fCAwLCA4NjQwMCkKLSAgICBlbmQKLSAgICBuZXchKGpkX3RvX2FqZChq ZCwgZnIsIG9mKSwgb2YsIHNnKQotICBlbmQKKyAgZGVmIHNlbGYuamQoKmFy Z3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCiAKICAgIyBDcmVh dGUgYSBuZXcgRGF0ZVRpbWUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhl IHNwZWNpZmllZAogICAjIE9yZGluYWwgRGF0ZSBhbmQgaG91ciAraCssIG1p bnV0ZSArbWluKywgc2Vjb25kICtzKy4KQEAgLTE1OTcsMTYgKzE1MjUsNyBA QAogICAjCiAgICMgK3krIGRlZmF1bHRzIHRvIC00NzEyLCBhbmQgK2QrIHRv IDE7IHRoaXMgaXMgSnVsaWFuIERheSBOdW1iZXIKICAgIyBkYXkgMC4gIFRo ZSB0aW1lIHZhbHVlcyBkZWZhdWx0IHRvIDAuCi0gIGRlZiBzZWxmLm9yZGlu YWwoeT0tNDcxMiwgZD0xLCBoPTAsIG1pbj0wLCBzPTAsIG9mPTAsIHNnPUlU QUxZKQotICAgIHVubGVzcyAoamQgPSBfdmFsaWRfb3JkaW5hbD8oeSwgZCwg c2cpKSAmJgotCSAgIChmciA9IF92YWxpZF90aW1lPyhoLCBtaW4sIHMpKQot ICAgICAgcmFpc2UgQXJndW1lbnRFcnJvciwgJ2ludmFsaWQgZGF0ZScKLSAg ICBlbmQKLSAgICBpZiBTdHJpbmcgPT09IG9mCi0gICAgICBvZiA9IFJhdGlv bmFsKHpvbmVfdG9fZGlmZihvZikgfHwgMCwgODY0MDApCi0gICAgZW5kCi0g ICAgbmV3IShqZF90b19hamQoamQsIGZyLCBvZiksIG9mLCBzZykKLSAgZW5k CisgIGRlZiBzZWxmLm9yZGluYWwoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVu dGVkRXJyb3IgZW5kCiAKICAgIyBDcmVhdGUgYSBuZXcgRGF0ZVRpbWUgb2Jq ZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICAjIENpdmls IERhdGUgYW5kIGhvdXIgK2grLCBtaW51dGUgK21pbissIHNlY29uZCArcysu CkBAIC0xNjIyLDE5ICsxNTQxLDggQEAKICAgIwogICAjICt5KyBkZWZhdWx0 cyB0byAtNDcxMiwgK20rIHRvIDEsIGFuZCArZCsgdG8gMTsgdGhpcyBpcyBK dWxpYW4gRGF5CiAgICMgTnVtYmVyIGRheSAwLiAgVGhlIHRpbWUgdmFsdWVz IGRlZmF1bHQgdG8gMC4KLSAgZGVmIHNlbGYuY2l2aWwoeT0tNDcxMiwgbT0x LCBkPTEsIGg9MCwgbWluPTAsIHM9MCwgb2Y9MCwgc2c9SVRBTFkpCi0gICAg dW5sZXNzIChqZCA9IF92YWxpZF9jaXZpbD8oeSwgbSwgZCwgc2cpKSAmJgot CSAgIChmciA9IF92YWxpZF90aW1lPyhoLCBtaW4sIHMpKQotICAgICAgcmFp c2UgQXJndW1lbnRFcnJvciwgJ2ludmFsaWQgZGF0ZScKLSAgICBlbmQKLSAg ICBpZiBTdHJpbmcgPT09IG9mCi0gICAgICBvZiA9IFJhdGlvbmFsKHpvbmVf dG9fZGlmZihvZikgfHwgMCwgODY0MDApCi0gICAgZW5kCi0gICAgbmV3IShq ZF90b19hamQoamQsIGZyLCBvZiksIG9mLCBzZykKLSAgZW5kCisgIGRlZiBz ZWxmLmNpdmlsKCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVu ZAogCi0gIGNsYXNzIDw8IHNlbGY7IGFsaWFzX21ldGhvZCA6bmV3LCA6Y2l2 aWwgZW5kCi0KICAgIyBDcmVhdGUgYSBuZXcgRGF0ZVRpbWUgb2JqZWN0IGNv cnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICAjIENvbW1lcmNpYWwg RGF0ZSBhbmQgaG91ciAraCssIG1pbnV0ZSArbWluKywgc2Vjb25kICtzKy4K ICAgIwpAQCAtMTY1MCwxNiArMTU1OCw3IEBACiAgICMgK3krIGRlZmF1bHRz IHRvIC00NzEyLCArdysgdG8gMSwgYW5kICtkKyB0byAxOyB0aGlzIGlzCiAg ICMgSnVsaWFuIERheSBOdW1iZXIgZGF5IDAuCiAgICMgVGhlIHRpbWUgdmFs dWVzIGRlZmF1bHQgdG8gMC4KLSAgZGVmIHNlbGYuY29tbWVyY2lhbCh5PS00 NzEyLCB3PTEsIGQ9MSwgaD0wLCBtaW49MCwgcz0wLCBvZj0wLCBzZz1JVEFM WSkKLSAgICB1bmxlc3MgKGpkID0gX3ZhbGlkX2NvbW1lcmNpYWw/KHksIHcs IGQsIHNnKSkgJiYKLQkgICAoZnIgPSBfdmFsaWRfdGltZT8oaCwgbWluLCBz KSkKLSAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICdpbnZhbGlkIGRhdGUn Ci0gICAgZW5kCi0gICAgaWYgU3RyaW5nID09PSBvZgotICAgICAgb2YgPSBS YXRpb25hbCh6b25lX3RvX2RpZmYob2YpIHx8IDAsIDg2NDAwKQotICAgIGVu ZAotICAgIG5ldyEoamRfdG9fYWpkKGpkLCBmciwgb2YpLCBvZiwgc2cpCi0g IGVuZAorICBkZWYgc2VsZi5jb21tZXJjaWFsKCphcmdzKSByYWlzZSBOb3RJ bXBsZW1lbnRlZEVycm9yIGVuZAogCiAgIGRlZiBzZWxmLndlZWtudW0oeT0t NDcxMiwgdz0wLCBkPTEsIGY9MCwgaD0wLCBtaW49MCwgcz0wLCBvZj0wLCBz Zz1JVEFMWSkgIyA6bm9kb2M6CiAgICAgdW5sZXNzIChqZCA9IF92YWxpZF93 ZWVrbnVtPyh5LCB3LCBkLCBmLCBzZykpICYmCkBAIC0xNzE1LDEwICsxNjE0 LDcgQEAKICAgIwogICAjIEFuIEFyZ3VtZW50RXJyb3Igd2lsbCBiZSByYWlz ZWQgaWYgK3N0cisgY2Fubm90IGJlCiAgICMgcGFyc2VkLgotICBkZWYgc2Vs Zi5zdHJwdGltZShzdHI9Jy00NzEyLTAxLTAxVDAwOjAwOjAwKzAwOjAwJywg Zm10PSclRlQlVCV6Jywgc2c9SVRBTFkpCi0gICAgZWxlbSA9IF9zdHJwdGlt ZShzdHIsIGZtdCkKLSAgICBuZXdfYnlfZnJhZ3MoZWxlbSwgc2cpCi0gIGVu ZAorICBkZWYgc2VsZi5zdHJwdGltZSgqYXJncykgcmFpc2UgTm90SW1wbGVt ZW50ZWRFcnJvciBlbmQKIAogICAjIENyZWF0ZSBhIG5ldyBEYXRlVGltZSBv YmplY3QgYnkgcGFyc2luZyBmcm9tIGEgU3RyaW5nLAogICAjIHdpdGhvdXQg c3BlY2lmeWluZyB0aGUgZm9ybWF0LgpAQCAtMTczNSwxNyArMTYzMSwxNDIg QEAKICAgIyBEYXkgTnVtYmVyIGRheSAwLgogICAjCiAgICMgK3NnKyBzcGVj aWZpZXMgdGhlIERheSBvZiBDYWxlbmRhciBSZWZvcm0uCi0gIGRlZiBzZWxm LnBhcnNlKHN0cj0nLTQ3MTItMDEtMDFUMDA6MDA6MDArMDA6MDAnLCBjb21w PXRydWUsIHNnPUlUQUxZKQorICBkZWYgc2VsZi5wYXJzZSgqYXJncykgcmFp c2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKworICBkZWYgc2VsZi5pc284 NjAxKCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVuZAorICBk ZWYgc2VsZi5yZmMzMzM5KCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVy cm9yIGVuZAorICBkZWYgc2VsZi54bWxzY2hlbWEoKmFyZ3MpIHJhaXNlIE5v dEltcGxlbWVudGVkRXJyb3IgZW5kCisgIGRlZiBzZWxmLnJmYzI4MjIoKmFy Z3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCisKKyAgY2xhc3Mg PDwgc2VsZjsgYWxpYXNfbWV0aG9kIDpyZmM4MjIsIDpyZmMyODIyIGVuZAor CisgIGRlZiBzZWxmLmh0dHBkYXRlKCphcmdzKSByYWlzZSBOb3RJbXBsZW1l bnRlZEVycm9yIGVuZAorICBkZWYgc2VsZi5qaXN4MDMwMSgqYXJncykgcmFp c2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKworICBwdWJsaWMgOmhvdXIs IDptaW4sIDpzZWMsIDpzZWNfZnJhY3Rpb24sIDp6b25lLCA6b2Zmc2V0LCA6 bmV3X29mZnNldCwKKwkgOm1pbnV0ZSwgOnNlY29uZCwgOnNlY29uZF9mcmFj dGlvbgorCisgIGRlZiB0b19zICMgNHAKKyAgICBmb3JtYXQoJyUuNGQtJTAy ZC0lMDJkVCUwMmQ6JTAyZDolMDJkJXMnLAorCSAgIHllYXIsIG1vbiwgbWRh eSwgaG91ciwgbWluLCBzZWMsIHpvbmUpCisgIGVuZAorCitlbmQKKworcmVx dWlyZSAnZGF0ZV9jb3JlJworCitjbGFzcyBUaW1lCisKKyAgZGVmIHRvX3Rp bWUoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCisgIGRl ZiB0b19kYXRlKCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVu ZAorICBkZWYgdG9fZGF0ZXRpbWUoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVu dGVkRXJyb3IgZW5kCisKK2VuZAorCitjbGFzcyBEYXRlCisKKyAgZGVmIHRv X3RpbWUoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCisg IGRlZiB0b19kYXRlKCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9y IGVuZAorICBkZWYgdG9fZGF0ZXRpbWUoKmFyZ3MpIHJhaXNlIE5vdEltcGxl bWVudGVkRXJyb3IgZW5kCisKKyAgIyBDcmVhdGUgYSBuZXcgRGF0ZVRpbWUg b2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB0aW1lLgorICAjCisg ICMgK3NnKyBzcGVjaWZpZXMgdGhlIERheSBvZiBDYWxlbmRhciBSZWZvcm0u CisgIGRlZiBzZWxmLm5vdygqYXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRF cnJvciBlbmQKKworICBwcml2YXRlX2NsYXNzX21ldGhvZCA6bm93CisKK2Vu ZAorCitjbGFzcyBEYXRlVGltZSA8IERhdGUKKworICBkZWYgdG9fdGltZSgq YXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKyAgZGVmIHRv X2RhdGUoKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCisg IGRlZiB0b19kYXRldGltZSgqYXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRF cnJvciBlbmQKKworICBwcml2YXRlX2NsYXNzX21ldGhvZCA6dG9kYXkKKyAg cHVibGljX2NsYXNzX21ldGhvZCAgOm5vdworCitlbmQKKworY2xhc3MgRGF0 ZTo6UmlnaHQgPCBEYXRlCisKKyAgZGVmIHNlbGYudmFsaWRfamQ/IChqZCwg c2c9SVRBTFkpCisgICAgISFfdmFsaWRfamQ/KGpkLCBzZykKKyAgZW5kCisK KyAgZGVmIHNlbGYudmFsaWRfb3JkaW5hbD8gKHksIGQsIHNnPUlUQUxZKQor ICAgICEhX3ZhbGlkX29yZGluYWw/KHksIGQsIHNnKQorICBlbmQKKworICBk ZWYgc2VsZi52YWxpZF9jaXZpbD8gKHksIG0sIGQsIHNnPUlUQUxZKQorICAg ICEhX3ZhbGlkX2NpdmlsPyh5LCBtLCBkLCBzZykKKyAgZW5kCisKKyAgY2xh c3MgPDwgc2VsZjsgYWxpYXNfbWV0aG9kIDp2YWxpZF9kYXRlPywgOnZhbGlk X2NpdmlsPyBlbmQKKworICBkZWYgc2VsZi52YWxpZF9jb21tZXJjaWFsPyAo eSwgdywgZCwgc2c9SVRBTFkpCisgICAgISFfdmFsaWRfY29tbWVyY2lhbD8o eSwgdywgZCwgc2cpCisgIGVuZAorCisgIGRlZiBzZWxmLm5ldyEoYWpkPTAs IG9mPTAsIHNnPUlUQUxZKQorICAgIGQgPSBhbGxvY2F0ZQorICAgIGQuaW5z dGFuY2VfZXZhbCBkbworICAgICAgQGFqZCwgQG9mLCBAc2cgPSBhamQsIG9m LCBzZworICAgICAgQF9fY2FfXyA9IHt9CisgICAgZW5kCisgICAgZAorICBl bmQKKworICBkZWYgc2VsZi5qZChqZD0wLCBzZz1JVEFMWSkKKyAgICBqZCA9 IF92YWxpZF9qZD8oamQsIHNnKQorICAgIG5ldyEoamRfdG9fYWpkKGpkLCAw LCAwKSwgMCwgc2cpCisgIGVuZAorCisgIGRlZiBzZWxmLm9yZGluYWwoeT0t NDcxMiwgZD0xLCBzZz1JVEFMWSkKKyAgICB1bmxlc3MgamQgPSBfdmFsaWRf b3JkaW5hbD8oeSwgZCwgc2cpCisgICAgICByYWlzZSBBcmd1bWVudEVycm9y LCAnaW52YWxpZCBkYXRlJworICAgIGVuZAorICAgIG5ldyEoamRfdG9fYWpk KGpkLCAwLCAwKSwgMCwgc2cpCisgIGVuZAorCisgIGRlZiBzZWxmLmNpdmls KHk9LTQ3MTIsIG09MSwgZD0xLCBzZz1JVEFMWSkKKyAgICB1bmxlc3MgamQg PSBfdmFsaWRfY2l2aWw/KHksIG0sIGQsIHNnKQorICAgICAgcmFpc2UgQXJn dW1lbnRFcnJvciwgJ2ludmFsaWQgZGF0ZScKKyAgICBlbmQKKyAgICBuZXch KGpkX3RvX2FqZChqZCwgMCwgMCksIDAsIHNnKQorICBlbmQKKworICBjbGFz cyA8PCBzZWxmOyBhbGlhc19tZXRob2QgOm5ldywgOmNpdmlsIGVuZAorCisg IGRlZiBzZWxmLmNvbW1lcmNpYWwoeT0tNDcxMiwgdz0xLCBkPTEsIHNnPUlU QUxZKQorICAgIHVubGVzcyBqZCA9IF92YWxpZF9jb21tZXJjaWFsPyh5LCB3 LCBkLCBzZykKKyAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICdpbnZhbGlk IGRhdGUnCisgICAgZW5kCisgICAgbmV3IShqZF90b19hamQoamQsIDAsIDAp LCAwLCBzZykKKyAgZW5kCisKKyAgZGVmIHNlbGYuc3RycHRpbWUoc3RyPSct NDcxMi0wMS0wMScsIGZtdD0nJUYnLCBzZz1JVEFMWSkKKyAgICBlbGVtID0g X3N0cnB0aW1lKHN0ciwgZm10KQorICAgIG5ld19ieV9mcmFncyhlbGVtLCBz ZykKKyAgZW5kCisKKyAgZGVmIHNlbGYucGFyc2Uoc3RyPSctNDcxMi0wMS0w MScsIGNvbXA9dHJ1ZSwgc2c9SVRBTFkpCiAgICAgZWxlbSA9IF9wYXJzZShz dHIsIGNvbXApCiAgICAgbmV3X2J5X2ZyYWdzKGVsZW0sIHNnKQogICBlbmQK IAotICBkZWYgc2VsZi5pc284NjAxKHN0cj0nLTQ3MTItMDEtMDFUMDA6MDA6 MDArMDA6MDAnLCBzZz1JVEFMWSkgIyA6bm9kb2M6CisgIGRlZiBzZWxmLmlz bzg2MDEoc3RyPSctNDcxMi0wMS0wMScsIHNnPUlUQUxZKSAjIDpub2RvYzoK ICAgICBlbGVtID0gX2lzbzg2MDEoc3RyKQogICAgIG5ld19ieV9mcmFncyhl bGVtLCBzZykKICAgZW5kCiAKLSAgZGVmIHNlbGYueG1sc2NoZW1hKHN0cj0n LTQ3MTItMDEtMDFUMDA6MDA6MDArMDA6MDAnLCBzZz1JVEFMWSkgIyA6bm9k b2M6CisgIGRlZiBzZWxmLnJmYzMzMzkoc3RyPSctNDcxMi0wMS0wMVQwMDow MDowMCswMDowMCcsIHNnPUlUQUxZKSAjIDpub2RvYzoKKyAgICBlbGVtID0g X3JmYzMzMzkoc3RyKQorICAgIG5ld19ieV9mcmFncyhlbGVtLCBzZykKKyAg ZW5kCisKKyAgZGVmIHNlbGYueG1sc2NoZW1hKHN0cj0nLTQ3MTItMDEtMDEn LCBzZz1JVEFMWSkgIyA6bm9kb2M6CiAgICAgZWxlbSA9IF94bWxzY2hlbWEo c3RyKQogICAgIG5ld19ieV9mcmFncyhlbGVtLCBzZykKICAgZW5kCkBAIC0x NzYyLDg3ICsxNzgzLDEyMyBAQAogICAgIG5ld19ieV9mcmFncyhlbGVtLCBz ZykKICAgZW5kCiAKLSAgZGVmIHNlbGYuamlzeDAzMDEoc3RyPSctNDcxMi0w MS0wMVQwMDowMDowMCswMDowMCcsIHNnPUlUQUxZKSAjIDpub2RvYzoKKyAg ZGVmIHNlbGYuamlzeDAzMDEoc3RyPSctNDcxMi0wMS0wMScsIHNnPUlUQUxZ KSAjIDpub2RvYzoKICAgICBlbGVtID0gX2ppc3gwMzAxKHN0cikKICAgICBu ZXdfYnlfZnJhZ3MoZWxlbSwgc2cpCiAgIGVuZAogCi0gIHB1YmxpYyA6aG91 ciwgOm1pbiwgOnNlYywgOnNlY19mcmFjdGlvbiwgOnpvbmUsIDpvZmZzZXQs IDpuZXdfb2Zmc2V0LAotCSA6bWludXRlLCA6c2Vjb25kLCA6c2Vjb25kX2Zy YWN0aW9uCisgIGRlZiArIChuKQorICAgIGNhc2UgbgorICAgIHdoZW4gTnVt ZXJpYzsgcmV0dXJuIHNlbGYuY2xhc3MubmV3IShhamQgKyBuLCBvZmZzZXQs IHN0YXJ0KQorICAgIGVuZAorICAgIHJhaXNlIFR5cGVFcnJvciwgJ2V4cGVj dGVkIG51bWVyaWMnCisgIGVuZAogCi0gIGRlZiB0b19zICMgNHAKLSAgICBm b3JtYXQoJyUuNGQtJTAyZC0lMDJkVCUwMmQ6JTAyZDolMDJkJXMnLAotCSAg IHllYXIsIG1vbiwgbWRheSwgaG91ciwgbWluLCBzZWMsIHpvbmUpCisgIGRl ZiAtICh4KQorICAgIGNhc2UgeAorICAgIHdoZW4gTnVtZXJpYzsgcmV0dXJu IHNlbGYuY2xhc3MubmV3IShhamQgLSB4LCBvZmZzZXQsIHN0YXJ0KQorICAg IHdoZW4gRGF0ZTsgICAgcmV0dXJuIGFqZCAtIHguYWpkCisgICAgZW5kCisg ICAgcmFpc2UgVHlwZUVycm9yLCAnZXhwZWN0ZWQgbnVtZXJpYyBvciBkYXRl JwogICBlbmQKIAogZW5kCiAKLWNsYXNzIFRpbWUKK2NsYXNzIERhdGVUaW1l OjpSaWdodCA8IERhdGVUaW1lCiAKLSAgZGVmIHRvX3RpbWUoKSBnZXRsb2Nh bCBlbmQKKyAgZGVmIHNlbGYubmV3ISgqYXJncykgcmFpc2UgTm90SW1wbGVt ZW50ZWRFcnJvciBlbmQKIAotICBkZWYgdG9fZGF0ZQotICAgIGpkID0gRGF0 ZS5fX3NlbmRfXyg6Y2l2aWxfdG9famQsIHllYXIsIG1vbiwgbWRheSwgRGF0 ZTo6SVRBTFkpCi0gICAgRGF0ZS5uZXchKERhdGUuX19zZW5kX18oOmpkX3Rv X2FqZCwgamQsIDAsIDApLCAwLCBEYXRlOjpJVEFMWSkKKyAgZGVmIHNlbGYu amQoamQ9MCwgaD0wLCBtaW49MCwgcz0wLCBvZj0wLCBzZz1JVEFMWSkKKyAg ICB1bmxlc3MgKGpkID0gX3ZhbGlkX2pkPyhqZCwgc2cpKSAmJgorCSAgIChm ciA9IF92YWxpZF90aW1lPyhoLCBtaW4sIHMpKQorICAgICAgcmFpc2UgQXJn dW1lbnRFcnJvciwgJ2ludmFsaWQgZGF0ZScKKyAgICBlbmQKKyAgICBpZiBT dHJpbmcgPT09IG9mCisgICAgICBvZiA9IFJhdGlvbmFsKHpvbmVfdG9fZGlm ZihvZikgfHwgMCwgODY0MDApCisgICAgZW5kCisgICAgbmV3IShqZF90b19h amQoamQsIGZyLCBvZiksIG9mLCBzZykKICAgZW5kCiAKLSAgZGVmIHRvX2Rh dGV0aW1lCi0gICAgamQgPSBEYXRlVGltZS5fX3NlbmRfXyg6Y2l2aWxfdG9f amQsIHllYXIsIG1vbiwgbWRheSwgRGF0ZVRpbWU6OklUQUxZKQotICAgIGZy ID0gRGF0ZVRpbWUuX19zZW5kX18oOnRpbWVfdG9fZGF5X2ZyYWN0aW9uLCBo b3VyLCBtaW4sIFtzZWMsIDU5XS5taW4pICsKLSAgICAgIFJhdGlvbmFsKHN1 YnNlYywgODY0MDApCi0gICAgb2YgPSBSYXRpb25hbCh1dGNfb2Zmc2V0LCA4 NjQwMCkKLSAgICBEYXRlVGltZS5uZXchKERhdGVUaW1lLl9fc2VuZF9fKDpq ZF90b19hamQsIGpkLCBmciwgb2YpLAotCQkgIG9mLCBEYXRlVGltZTo6SVRB TFkpCisgIGRlZiBzZWxmLm9yZGluYWwoeT0tNDcxMiwgZD0xLCBoPTAsIG1p bj0wLCBzPTAsIG9mPTAsIHNnPUlUQUxZKQorICAgIHVubGVzcyAoamQgPSBf dmFsaWRfb3JkaW5hbD8oeSwgZCwgc2cpKSAmJgorCSAgIChmciA9IF92YWxp ZF90aW1lPyhoLCBtaW4sIHMpKQorICAgICAgcmFpc2UgQXJndW1lbnRFcnJv ciwgJ2ludmFsaWQgZGF0ZScKKyAgICBlbmQKKyAgICBpZiBTdHJpbmcgPT09 IG9mCisgICAgICBvZiA9IFJhdGlvbmFsKHpvbmVfdG9fZGlmZihvZikgfHwg MCwgODY0MDApCisgICAgZW5kCisgICAgbmV3IShqZF90b19hamQoamQsIGZy LCBvZiksIG9mLCBzZykKICAgZW5kCiAKLWVuZAorICBkZWYgc2VsZi5jaXZp bCh5PS00NzEyLCBtPTEsIGQ9MSwgaD0wLCBtaW49MCwgcz0wLCBvZj0wLCBz Zz1JVEFMWSkKKyAgICB1bmxlc3MgKGpkID0gX3ZhbGlkX2NpdmlsPyh5LCBt LCBkLCBzZykpICYmCisJICAgKGZyID0gX3ZhbGlkX3RpbWU/KGgsIG1pbiwg cykpCisgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAnaW52YWxpZCBkYXRl JworICAgIGVuZAorICAgIGlmIFN0cmluZyA9PT0gb2YKKyAgICAgIG9mID0g UmF0aW9uYWwoem9uZV90b19kaWZmKG9mKSB8fCAwLCA4NjQwMCkKKyAgICBl bmQKKyAgICBuZXchKGpkX3RvX2FqZChqZCwgZnIsIG9mKSwgb2YsIHNnKQor ICBlbmQKIAotY2xhc3MgRGF0ZQorICBjbGFzcyA8PCBzZWxmOyBhbGlhc19t ZXRob2QgOm5ldywgOmNpdmlsIGVuZAogCi0gIGRlZiB0b190aW1lKCkgVGlt ZS5sb2NhbCh5ZWFyLCBtb24sIG1kYXkpIGVuZAotICBkZWYgdG9fZGF0ZSgp IHNlbGYgZW5kCi0gIGRlZiB0b19kYXRldGltZSgpIERhdGVUaW1lLm5ldyEo amRfdG9fYWpkKGpkLCAwLCAwKSwgQG9mLCBAc2cpIGVuZAorICBkZWYgc2Vs Zi5jb21tZXJjaWFsKHk9LTQ3MTIsIHc9MSwgZD0xLCBoPTAsIG1pbj0wLCBz PTAsIG9mPTAsIHNnPUlUQUxZKQorICAgIHVubGVzcyAoamQgPSBfdmFsaWRf Y29tbWVyY2lhbD8oeSwgdywgZCwgc2cpKSAmJgorCSAgIChmciA9IF92YWxp ZF90aW1lPyhoLCBtaW4sIHMpKQorICAgICAgcmFpc2UgQXJndW1lbnRFcnJv ciwgJ2ludmFsaWQgZGF0ZScKKyAgICBlbmQKKyAgICBpZiBTdHJpbmcgPT09 IG9mCisgICAgICBvZiA9IFJhdGlvbmFsKHpvbmVfdG9fZGlmZihvZikgfHwg MCwgODY0MDApCisgICAgZW5kCisgICAgbmV3IShqZF90b19hamQoamQsIGZy LCBvZiksIG9mLCBzZykKKyAgZW5kCiAKLSAgIyBDcmVhdGUgYSBuZXcgRGF0 ZSBvYmplY3QgcmVwcmVzZW50aW5nIHRvZGF5LgotICAjCi0gICMgK3NnKyBz cGVjaWZpZXMgdGhlIERheSBvZiBDYWxlbmRhciBSZWZvcm0uCi0gIGRlZiBz ZWxmLnRvZGF5KHNnPUlUQUxZKQotICAgIHQgPSBUaW1lLm5vdwotICAgIGpk ID0gY2l2aWxfdG9famQodC55ZWFyLCB0Lm1vbiwgdC5tZGF5LCBzZykKLSAg ICBuZXchKGpkX3RvX2FqZChqZCwgMCwgMCksIDAsIHNnKQorICBkZWYgc2Vs Zi5zdHJwdGltZShzdHI9Jy00NzEyLTAxLTAxVDAwOjAwOjAwKzAwOjAwJywg Zm10PSclRlQlVCV6Jywgc2c9SVRBTFkpCisgICAgZWxlbSA9IF9zdHJwdGlt ZShzdHIsIGZtdCkKKyAgICBuZXdfYnlfZnJhZ3MoZWxlbSwgc2cpCiAgIGVu ZAogCi0gICMgQ3JlYXRlIGEgbmV3IERhdGVUaW1lIG9iamVjdCByZXByZXNl bnRpbmcgdGhlIGN1cnJlbnQgdGltZS4KLSAgIwotICAjICtzZysgc3BlY2lm aWVzIHRoZSBEYXkgb2YgQ2FsZW5kYXIgUmVmb3JtLgotICBkZWYgc2VsZi5u b3coc2c9SVRBTFkpCi0gICAgdCA9IFRpbWUubm93Ci0gICAgamQgPSBjaXZp bF90b19qZCh0LnllYXIsIHQubW9uLCB0Lm1kYXksIHNnKQotICAgIGZyID0g dGltZV90b19kYXlfZnJhY3Rpb24odC5ob3VyLCB0Lm1pbiwgW3Quc2VjLCA1 OV0ubWluKSArCi0gICAgICBSYXRpb25hbCh0LnN1YnNlYywgODY0MDApCi0g ICAgb2YgPSBSYXRpb25hbCh0LnV0Y19vZmZzZXQsIDg2NDAwKQotICAgIG5l dyEoamRfdG9fYWpkKGpkLCBmciwgb2YpLCBvZiwgc2cpCisgIGRlZiBzZWxm LnBhcnNlKHN0cj0nLTQ3MTItMDEtMDFUMDA6MDA6MDArMDA6MDAnLCBjb21w PXRydWUsIHNnPUlUQUxZKQorICAgIGVsZW0gPSBfcGFyc2Uoc3RyLCBjb21w KQorICAgIG5ld19ieV9mcmFncyhlbGVtLCBzZykKICAgZW5kCiAKLSAgcHJp dmF0ZV9jbGFzc19tZXRob2QgOm5vdworICBkZWYgc2VsZi5pc284NjAxKHN0 cj0nLTQ3MTItMDEtMDFUMDA6MDA6MDArMDA6MDAnLCBzZz1JVEFMWSkgIyA6 bm9kb2M6CisgICAgZWxlbSA9IF9pc284NjAxKHN0cikKKyAgICBuZXdfYnlf ZnJhZ3MoZWxlbSwgc2cpCisgIGVuZAogCi1lbmQKKyAgZGVmIHNlbGYueG1s c2NoZW1hKHN0cj0nLTQ3MTItMDEtMDFUMDA6MDA6MDArMDA6MDAnLCBzZz1J VEFMWSkgIyA6bm9kb2M6CisgICAgZWxlbSA9IF94bWxzY2hlbWEoc3RyKQor ICAgIG5ld19ieV9mcmFncyhlbGVtLCBzZykKKyAgZW5kCiAKLWNsYXNzIERh dGVUaW1lIDwgRGF0ZQorICBkZWYgc2VsZi5yZmMyODIyKHN0cj0nTW9uLCAx IEphbiAtNDcxMiAwMDowMDowMCArMDAwMCcsIHNnPUlUQUxZKSAjIDpub2Rv YzoKKyAgICBlbGVtID0gX3JmYzI4MjIoc3RyKQorICAgIG5ld19ieV9mcmFn cyhlbGVtLCBzZykKKyAgZW5kCiAKLSAgZGVmIHRvX3RpbWUKLSAgICBkID0g bmV3X29mZnNldCgwKQotICAgIGQuaW5zdGFuY2VfZXZhbCBkbwotICAgICAg VGltZS51dGMoeWVhciwgbW9uLCBtZGF5LCBob3VyLCBtaW4sIHNlYyArCi0J ICAgICAgIHNlY19mcmFjdGlvbikKLSAgICBlbmQuCi0JZ2V0bG9jYWwKKyAg Y2xhc3MgPDwgc2VsZjsgYWxpYXNfbWV0aG9kIDpyZmM4MjIsIDpyZmMyODIy IGVuZAorCisgIGRlZiBzZWxmLmh0dHBkYXRlKHN0cj0nTW9uLCAwMSBKYW4g LTQ3MTIgMDA6MDA6MDAgR01UJywgc2c9SVRBTFkpICMgOm5vZG9jOgorICAg IGVsZW0gPSBfaHR0cGRhdGUoc3RyKQorICAgIG5ld19ieV9mcmFncyhlbGVt LCBzZykKICAgZW5kCiAKLSAgZGVmIHRvX2RhdGUoKSBEYXRlLm5ldyEoamRf dG9fYWpkKGpkLCAwLCAwKSwgMCwgQHNnKSBlbmQKLSAgZGVmIHRvX2RhdGV0 aW1lKCkgc2VsZiBlbmQKKyAgZGVmIHNlbGYuamlzeDAzMDEoc3RyPSctNDcx Mi0wMS0wMVQwMDowMDowMCswMDowMCcsIHNnPUlUQUxZKSAjIDpub2RvYzoK KyAgICBlbGVtID0gX2ppc3gwMzAxKHN0cikKKyAgICBuZXdfYnlfZnJhZ3Mo ZWxlbSwgc2cpCisgIGVuZAogCi0gIHByaXZhdGVfY2xhc3NfbWV0aG9kIDp0 b2RheQotICBwdWJsaWNfY2xhc3NfbWV0aG9kICA6bm93CitlbmQKIAorY2xh c3MgRGF0ZTo6TGlnaHQgPCBEYXRlCisKKyAgZGVmIHlkYXkoKmFyZ3MpIHJh aXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCisgIGRlZiBjd3llYXIoKmFy Z3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IgZW5kCisgIGRlZiBjd2Vl aygqYXJncykgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciBlbmQKKyAgZGVm IGN3ZGF5KCphcmdzKSByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIGVuZAor ICBkZWYgbGVhcD8oKmFyZ3MpIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3Ig ZW5kCisKIGVuZApJbmRleDogZXh0L2RhdGUvZGF0ZV9jb3JlLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gZXh0L2RhdGUvZGF0ZV9jb3JlLmMJKHJl dmlzaW9uIDApCisrKyBleHQvZGF0ZS9kYXRlX2NvcmUuYwkocmV2aXNpb24g MCkKQEAgLTAsMCArMSw4MTkgQEAKKy8qCisgIGRhdGVfY29yZS5jIDxzd2l0 Y2hfaGl0dGVyPjogQ29kZWQgYnkgVGFkYXlvc2hpIEZ1bmFiYSAyMDEwCisq LworCisjaW5jbHVkZSAicnVieS5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNp bmNsdWRlIDx0aW1lLmg+CisKK3N0YXRpYyBWQUxVRSBjRGF0ZSwgY0RhdGVS aWdodCwgY0RhdGVMaWdodDsKKworc3RhdGljIHZvaWQKK2RhdGVfY2l2aWxf dG9famRfaW50ZXJuYWwoaW50IHksIGludCBtLCBpbnQgZCwgZG91YmxlIHNn LAorCQkJICBsb25nICpyamQsIGludCAqcm5zKQoreworICBkb3VibGUgYSwg YiwgamQ7CisKKyAgaWYgKG0gPD0gMikgeworICAgIHkgLT0gMTsKKyAgICBt ICs9IDEyOworICB9CisgIGEgPSBmbG9vcih5IC8gMTAwLjApOworICBiID0g MiAtIGEgKyBmbG9vcihhIC8gNC4wKTsKKyAgamQgPSBmbG9vcigzNjUuMjUg KiAoeSArIDQ3MTYpKSArCisgICAgZmxvb3IoMzAuNjAwMSAqIChtICsgMSkp ICsKKyAgICBkICsgYiAtIDE1MjQ7CisgIGlmIChqZCA8IHNnKSB7CisgICAg amQgLT0gYjsKKyAgICAqcm5zID0gMDsKKyAgfSBlbHNlCisgICAgKnJucyA9 IDE7CisKKyAgKnJqZCA9IGpkOworfQorCitzdGF0aWMgdm9pZAorZGF0ZV9q ZF90b19jaXZpbF9pbnRlcm5hbChsb25nIGpkLCBkb3VibGUgc2csCisJCQkg IGludCAqcnksIGludCAqcm0sIGludCAqcmRvbSkKK3sKKyAgZG91YmxlIHgs IGEsIGIsIGMsIGQsIGUsIHksIG0sIGRvbTsKKworICBpZiAoamQgPCBzZykK KyAgICBhID0gamQ7CisgIGVsc2UgeworICAgIHggPSBmbG9vcigoamQgLSAx ODY3MjE2LjI1KSAvIDM2NTI0LjI1KTsKKyAgICBhID0gamQgKyAxICsgeCAt IGZsb29yKHggLyA0LjApOworICB9CisgIGIgPSBhICsgMTUyNDsKKyAgYyA9 IGZsb29yKChiIC0gMTIyLjEpIC8gMzY1LjI1KTsKKyAgZCA9IGZsb29yKDM2 NS4yNSAqIGMpOworICBlID0gZmxvb3IoKGIgLSBkKSAvIDMwLjYwMDEpOwor ICBkb20gPSBiIC0gZCAtIGZsb29yKDMwLjYwMDEgKiBlKTsKKyAgaWYgKGUg PD0gMTMpIHsKKyAgICBtID0gZSAtIDE7CisgICAgeSA9IGMgLSA0NzE2Owor ICB9IGVsc2UgeworICAgIG0gPSBlIC0gMTM7CisgICAgeSA9IGMgLSA0NzE1 OworICB9CisKKyAgKnJ5ID0geTsKKyAgKnJtID0gbTsKKyAgKnJkb20gPSBk b207Cit9CisKK3N0YXRpYyBpbnQgZGF0ZV92YWxpZF9jaXZpbF9wX2ludGVy bmFsKGludCB5LCBpbnQgbSwgaW50IGQsIGRvdWJsZSBzZywKKwkJCQkgICAg ICAgaW50ICpubSwgaW50ICpuZCwKKwkJCQkgICAgICAgbG9uZyAqcmpkLCBp bnQgKm5zKTsKKworc3RhdGljIGludAorZmluZF9sZG9tKGludCB5LCBpbnQg bSwgaW50IHNnLAorCSAgbG9uZyAqcmpkLCBpbnQgKm5zKQoreworICBpbnQg aSwgbm0sIG5kOworCisgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKSB7Cisg ICAgaWYgKGRhdGVfdmFsaWRfY2l2aWxfcF9pbnRlcm5hbCh5LCBtLCAzMSAt IGksIHNnLCAmbm0sICZuZCwgcmpkLCBucykpCisgICAgICByZXR1cm4gMTsK KyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGludCBtb250 aHRhYlsyXVsxM10gPSB7CisgICAgeyAwLCAzMSwgMjgsIDMxLCAzMCwgMzEs IDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxIH0sCisgICAgeyAwLCAzMSwg MjksIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxIH0K K307CisKK2lubGluZSBzdGF0aWMgaW50CitsZWFwX3AoaW50IHkpCit7Cisg IHJldHVybiB5ICUgNCA9PSAwICYmIHkgJSAxMDAgIT0gMCB8fCB5ICUgNDAw ID09IDA7Cit9CisKK3N0YXRpYyBpbnQKK2xhc3RfZGF5X29mX21vbnRoKGlu dCB5LCBpbnQgbSkKK3sKKyAgcmV0dXJuIG1vbnRodGFiW2xlYXBfcCh5KSA/ IDEgOiAwXVttXTsKK30KKworc3RhdGljIGludAorZGF0ZV92YWxpZF9ncmVn b3JpYW5fcF9pbnRlcm5hbChpbnQgeSwgaW50IG0sIGludCBkLAorCQkJCWlu dCAqbm0sIGludCAqbmQpCit7CisgIGludCBsYXN0OworCisgIGlmIChtIDwg MCkKKyAgICBtICs9IDEzOworCisgIGxhc3QgPSBsYXN0X2RheV9vZl9tb250 aCh5LCBtKTsKKworICBpZiAoZCA8IDApIHsKKworICAgIGQgPSBsYXN0ICsg ZCArIDE7CisgIH0KKworICAqbm0gPSBtOworICAqbmQgPSBkOworCisgIHJl dHVybiAhKG0gPCAwIHx8IG0gPiAxMiB8fAorCSAgIGQgPCAxIHx8IGQgPiBs YXN0KTsKK30KKworc3RhdGljIGludAorZGF0ZV92YWxpZF9jaXZpbF9wX2lu dGVybmFsKGludCB5LCBpbnQgbSwgaW50IGQsIGRvdWJsZSBzZywKKwkJCSAg ICBpbnQgKm5tLCBpbnQgKm5kLAorCQkJICAgIGxvbmcgKnJqZCwgaW50ICpu cykKK3sKKyAgaW50IG55OworCisgIGlmIChtIDwgMCkKKyAgICBtICs9IDEz OworICBpZiAoZCA8IDApIHsKKyAgICBpZiAoIWZpbmRfbGRvbSh5LCBtLCBz ZywgcmpkLCBucykpCisgICAgICByZXR1cm4gMDsKKyAgICBkYXRlX2pkX3Rv X2NpdmlsX2ludGVybmFsKCpyamQgKyBkICsgMSwgc2csICZueSwgbm0sIG5k KTsKKyAgICBpZiAobnkgIT0geSB8fCAqbm0gIT0gbSkKKyAgICAgIHJldHVy biAwOworICAgIGQgPSAqbmQ7CisgIH0KKyAgZGF0ZV9jaXZpbF90b19qZF9p bnRlcm5hbCh5LCBtLCBkLCBzZywgcmpkLCBucyk7CisgIGRhdGVfamRfdG9f Y2l2aWxfaW50ZXJuYWwoKnJqZCwgc2csICZueSwgbm0sIG5kKTsKKyAgaWYg KG55ICE9IHkgfHwgKm5tICE9IG0gfHwgKm5kICE9IGQpCisgICAgcmV0dXJu IDA7CisgIHJldHVybiAxOworfQorCisjZGVmaW5lIEhBVkVfSkQgMQorI2Rl ZmluZSBIQVZFX0NJVklMIDIKKworI2RlZmluZSBJVEFMWSAyMjk5MTYxCisK K3N0cnVjdCBEYXRlTGlnaHREYXRhCit7CisgIGxvbmcgamQ7CisgIGRvdWJs ZSBzZzsKKyAgaW50IHllYXI7CisgIGludCBtb247CisgIGludCBtZGF5Owor ICB1bnNpZ25lZCBmbGFnczsKK307CisKKyNkZWZpbmUgZ2V0X2RhdDEoeCkg XAorICBzdHJ1Y3QgRGF0ZUxpZ2h0RGF0YSAqZGF0O1wKKyAgRGF0YV9HZXRf U3RydWN0KHgsIHN0cnVjdCBEYXRlTGlnaHREYXRhLCBkYXQpCisKKyNkZWZp bmUgZ2V0X2RhdDIoeCx5KSBcCisgIHN0cnVjdCBEYXRlTGlnaHREYXRhICph ZGF0LCAqYmRhdDtcCisgIERhdGFfR2V0X1N0cnVjdCh4LCBzdHJ1Y3QgRGF0 ZUxpZ2h0RGF0YSwgYWRhdCk7XAorICBEYXRhX0dldF9TdHJ1Y3QoeSwgc3Ry dWN0IERhdGVMaWdodERhdGEsIGJkYXQpCisKK2lubGluZSBzdGF0aWMgVkFM VUUKK2Zfa2luZF9vZl9wKFZBTFVFIHgsIFZBTFVFIGMpCit7CisgIHJldHVy biByYl9vYmpfaXNfa2luZF9vZih4LCBjKTsKK30KKworaW5saW5lIHN0YXRp YyBWQUxVRQora19kYXRlZ2VuX3AoVkFMVUUgeCkKK3sKKyAgcmV0dXJuIGZf a2luZF9vZl9wKHgsIGNEYXRlUmlnaHQpOworfQorCitpbmxpbmUgc3RhdGlj IFZBTFVFCitrX2RhdGVsaXRlX3AoVkFMVUUgeCkKK3sKKyAgcmV0dXJuIGZf a2luZF9vZl9wKHgsIGNEYXRlTGlnaHQpOworfQorCitzdGF0aWMgVkFMVUUK K2RhdGVfc192YWxpZF9jaXZpbF9wKGludCBhcmdjLCBWQUxVRSAqYXJndiwg VkFMVUUga2xhc3MpCit7CisgIFZBTFVFIHZ5LCB2bSwgdmQsIHZzZzsKKyAg aW50IHksIG0sIGQsIG5tLCBuZDsKKyAgZG91YmxlIHNnOworCisgIHJiX3Nj YW5fYXJncyhhcmdjLCBhcmd2LCAiMzEiLCAmdnksICZ2bSwgJnZkLCAmdnNn KTsKKworICBpZiAoIShGSVhOVU1fUCh2eSkgJiYKKwlGSVhOVU1fUCh2bSkg JiYKKwlGSVhOVU1fUCh2ZCkpKQorICAgIHJldHVybiByYl9mdW5jYWxsMihj RGF0ZVJpZ2h0LCByYl9pbnRlcm4oInZhbGlkX2NpdmlsPyIpLCBhcmdjLCBh cmd2KTsKKworICBpZiAoIU5JTF9QKHZzZykpCisgICAgc2cgPSBOVU0yREJM KHZzZyk7CisgIGVsc2UKKyAgICBzZyA9IElUQUxZOworCisgIHkgPSAtNDcx MjsKKyAgbSA9IDE7CisgIGQgPSAxOworCisgIHN3aXRjaCAoYXJnYykgewor ICBjYXNlIDQ6CisgIGNhc2UgMzoKKyAgICBkID0gTlVNMkxPTkcodmQpOwor ICBjYXNlIDI6CisgICAgbSA9IE5VTTJMT05HKHZtKTsKKyAgY2FzZSAxOgor ICAgIHkgPSBOVU0yTE9ORyh2eSk7CisgIH0KKworICBpZiAoaXNpbmYoc2cp ICYmIHNnIDwgMCkgeworICAgIGlmICghZGF0ZV92YWxpZF9ncmVnb3JpYW5f cF9pbnRlcm5hbCh5LCBtLCBkLCAmbm0sICZuZCkpCisgICAgICByZXR1cm4g UWZhbHNlOworICAgIHJldHVybiBRdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBs b25nIGpkOworICAgIGludCBuczsKKworICAgIGlmICghZGF0ZV92YWxpZF9j aXZpbF9wX2ludGVybmFsKHksIG0sIGQsIHNnLCAmbm0sICZuZCwgJmpkLCAm bnMpKQorICAgICAgcmV0dXJuIFFmYWxzZTsKKyAgICByZXR1cm4gUXRydWU7 CisgIH0KK30KKworaW5saW5lIHN0YXRpYyBWQUxVRQorZGF0ZWxpdGVfc19u ZXdfaW50ZXJuYWwwKFZBTFVFIGtsYXNzLCBsb25nIGpkLCBkb3VibGUgc2cs CisJCQkgaW50IHksIGludCBtLCBpbnQgZCwgdW5zaWduZWQgZmxhZ3MpCit7 CisgIHN0cnVjdCBEYXRlTGlnaHREYXRhICpkYXQ7CisgIFZBTFVFIG9iajsK KworICBvYmogPSBEYXRhX01ha2VfU3RydWN0KGtsYXNzLCBzdHJ1Y3QgRGF0 ZUxpZ2h0RGF0YSwgMCwgLTEsIGRhdCk7CisKKyAgZGF0LT5qZCA9IGpkOwor ICBkYXQtPnNnID0gc2c7CisgIGRhdC0+eWVhciA9IHk7CisgIGRhdC0+bW9u ID0gbTsKKyAgZGF0LT5tZGF5ID0gZDsKKyAgZGF0LT5mbGFncyA9IGZsYWdz OworCisgIHJldHVybiBvYmo7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxp dGVfc19uZXdfaW50ZXJuYWwoVkFMVUUga2xhc3MsIGxvbmcgamQsIGRvdWJs ZSBzZywgdW5zaWduZWQgZmxhZ3MpCit7CisgIHJldHVybiBkYXRlbGl0ZV9z X25ld19pbnRlcm5hbDAoa2xhc3MsIGpkLCBzZywgMCwgMCwgMCwgZmxhZ3Mp OworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRlX3NfYWxsb2MoVkFMVUUg a2xhc3MpCit7CisgIHJldHVybiBkYXRlbGl0ZV9zX25ld19pbnRlcm5hbChr bGFzcywgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZV9zX2pk KGludCBhcmdjLCBWQUxVRSAqYXJndiwgVkFMVUUga2xhc3MpCit7CisgIFZB TFVFIHZqZCwgdnNnOworICBsb25nIGpkOworICBkb3VibGUgc2c7CisKKyAg cmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIwMiIsICZ2amQsICZ2c2cpOwor CisgIGlmICghRklYTlVNX1AodmpkKSkKKyAgICByZXR1cm4gcmJfZnVuY2Fs bDIoY0RhdGVSaWdodCwgcmJfaW50ZXJuKCJqZCIpLCBhcmdjLCBhcmd2KTsK KworICBpZiAoIU5JTF9QKHZzZykpCisgICAgc2cgPSBOVU0yREJMKHZzZyk7 CisgIGVsc2UKKyAgICBzZyA9IElUQUxZOworCisgIGlmIChhcmdjID49IDEp CisgICAgamQgPSBOVU0yTE9ORyh2amQpOworICBlbHNlCisgICAgamQgPSAw OworCisgIGlmIChqZCA8IHNnKQorICAgIHJldHVybiByYl9mdW5jYWxsMihj RGF0ZVJpZ2h0LCByYl9pbnRlcm4oImpkIiksIGFyZ2MsIGFyZ3YpOworCisg IHJldHVybiBkYXRlbGl0ZV9zX25ld19pbnRlcm5hbChjRGF0ZUxpZ2h0LCBq ZCwgc2csIEhBVkVfSkQpOworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVfc19j aXZpbChpbnQgYXJnYywgVkFMVUUgKmFyZ3YsIFZBTFVFIGtsYXNzKQorewor ICBWQUxVRSB2eSwgdm0sIHZkLCB2c2c7CisgIGludCB5LCBtLCBkLCBubSwg bmQ7CisgIGRvdWJsZSBzZzsKKworICByYl9zY2FuX2FyZ3MoYXJnYywgYXJn diwgIjA0IiwgJnZ5LCAmdm0sICZ2ZCwgJnZzZyk7CisKKyAgaWYgKCEoKE5J TF9QKHZ5KSB8fCBGSVhOVU1fUCh2eSkpICYmCisJKE5JTF9QKHZtKSB8fCBG SVhOVU1fUCh2bSkpICYmCisJKE5JTF9QKHZkKSB8fCBGSVhOVU1fUCh2ZCkp KSkKKyAgICByZXR1cm4gcmJfZnVuY2FsbDIoY0RhdGVSaWdodCwgcmJfaW50 ZXJuKCJuZXciKSwgYXJnYywgYXJndik7CisKKyAgaWYgKCFOSUxfUCh2c2cp KQorICAgIHNnID0gTlVNMkRCTCh2c2cpOworICBlbHNlCisgICAgc2cgPSBJ VEFMWTsKKworICB5ID0gLTQ3MTI7CisgIG0gPSAxOworICBkID0gMTsKKwor ICBzd2l0Y2ggKGFyZ2MpIHsKKyAgY2FzZSA0OgorICBjYXNlIDM6CisgICAg ZCA9IE5VTTJMT05HKHZkKTsKKyAgY2FzZSAyOgorICAgIG0gPSBOVU0yTE9O Ryh2bSk7CisgIGNhc2UgMToKKyAgICB5ID0gTlVNMkxPTkcodnkpOworICB9 CisKKyAgaWYgKGlzaW5mKHNnKSAmJiBzZyA8IDApIHsKKyAgICBpZiAoIWRh dGVfdmFsaWRfZ3JlZ29yaWFuX3BfaW50ZXJuYWwoeSwgbSwgZCwgJm5tLCAm bmQpKQorICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiaW52YWxpZCBk YXRlIik7CisKKyAgICByZXR1cm4gZGF0ZWxpdGVfc19uZXdfaW50ZXJuYWww KGNEYXRlTGlnaHQsIDAsIHNnLCB5LCBubSwgbmQsIEhBVkVfQ0lWSUwpOwor ICB9IGVsc2UgeworICAgIGxvbmcgamQ7CisgICAgaW50IG5zOworCisgICAg aWYgKCFkYXRlX3ZhbGlkX2NpdmlsX3BfaW50ZXJuYWwoeSwgbSwgZCwgc2cs ICZubSwgJm5kLCAmamQsICZucykpCisgICAgICByYl9yYWlzZShyYl9lQXJn RXJyb3IsICJpbnZhbGlkIGRhdGUiKTsKKworICAgIGlmICghRklYQUJMRShq ZCkgfHwgIW5zKQorICAgICAgcmV0dXJuIHJiX2Z1bmNhbGwyKGNEYXRlUmln aHQsIHJiX2ludGVybigibmV3IiksIGFyZ2MsIGFyZ3YpOworCisgICAgcmV0 dXJuIGRhdGVsaXRlX3NfbmV3X2ludGVybmFsMChjRGF0ZUxpZ2h0LCBqZCwg c2csIHksIG5tLCBuZCwKKwkJCQkgICAgSEFWRV9KRCB8IEhBVkVfQ0lWSUwp OworICB9Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZV9zX3RvZGF5KGludCBh cmdjLCBWQUxVRSAqYXJndiwgVkFMVUUga2xhc3MpCit7CisgIHRpbWVfdCB0 OworICBzdHJ1Y3QgdG0gdG07CisgIFZBTFVFIHZzZywgYVs0XTsKKworICB0 ID0gdGltZShOVUxMKTsKKyAgbG9jYWx0aW1lX3IoJnQsICZ0bSk7CisKKyAg cmJfc2Nhbl9hcmdzKGFyZ2MsIGFyZ3YsICIwMSIsICZ2c2cpOworCisgIGFb MF0gPSBJTlQyRklYKHRtLnRtX3llYXIgKyAxOTAwKTsKKyAgYVsxXSA9IElO VDJGSVgodG0udG1fbW9uICsgMSk7CisgIGFbMl0gPSBJTlQyRklYKHRtLnRt X21kYXkpOworICBpZiAoIU5JTF9QKHZzZykpCisgICAgYVszXSA9IHZzZzsK KyAgZWxzZQorICAgIGFbM10gPSBJTlQyRklYKElUQUxZKTsKKyAgcmV0dXJu IGRhdGVfc19jaXZpbCg0LCBhLCBrbGFzcyk7Cit9CisKK2lubGluZSBzdGF0 aWMgdm9pZAorZ2V0X2pkKHN0cnVjdCBEYXRlTGlnaHREYXRhICp4KQorewor ICBpZiAoISh4LT5mbGFncyAmIEhBVkVfSkQpKSB7CisgICAgbG9uZyBqZDsK KyAgICBpbnQgbnM7CisKKyAgICBkYXRlX2NpdmlsX3RvX2pkX2ludGVybmFs KHgtPnllYXIsIHgtPm1vbiwgeC0+bWRheSwgeC0+c2csICZqZCwgJm5zKTsK KyAgICB4LT5qZCA9IGpkOworICB9Cit9CisKK2lubGluZSBzdGF0aWMgdm9p ZAorZ2V0X2NpdmlsKHN0cnVjdCBEYXRlTGlnaHREYXRhICp4KQoreworICBp ZiAoISh4LT5mbGFncyAmIEhBVkVfQ0lWSUwpKSB7CisgICAgaW50IHksIG0s IGQ7CisKKyAgICBkYXRlX2pkX3RvX2NpdmlsX2ludGVybmFsKHgtPmpkLCB4 LT5zZywgJnksICZtLCAmZCk7CisgICAgeC0+eWVhciA9IHk7CisgICAgeC0+ bW9uID0gbTsKKyAgICB4LT5tZGF5ID0gZDsKKyAgfQorfQorCitzdGF0aWMg VkFMVUUKK2RhdGVsaXRlX2FqZChWQUxVRSBzZWxmKQoreworICBnZXRfZGF0 MShzZWxmKTsKKyAgVkFMVUUgcjsKKworICBnZXRfamQoZGF0KTsKKyAgciA9 IHJiX3JhdGlvbmFsX25ldzEoSU5UMkZJWChkYXQtPmpkKSk7CisgIHJldHVy biByYl9mdW5jYWxsKHIsICctJywgMSwgcmJfcmF0aW9uYWxfbmV3MihJTlQy RklYKDEpLCBJTlQyRklYKDIpKSk7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0 ZWxpdGVfYW1qZChWQUxVRSBzZWxmKQoreworICBnZXRfZGF0MShzZWxmKTsK KworICBnZXRfamQoZGF0KTsKKyAgcmV0dXJuIHJiX3JhdGlvbmFsX25ldzEo TE9ORzJOVU0oZGF0LT5qZCAtIDI0MDAwMDFMKSk7Cit9CisKK3N0YXRpYyBW QUxVRQorZGF0ZWxpdGVfamQoVkFMVUUgc2VsZikKK3sKKyAgZ2V0X2RhdDEo c2VsZik7CisKKyAgZ2V0X2pkKGRhdCk7CisgIHJldHVybiBJTlQyRklYKGRh dC0+amQpOworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRlX21qZChWQUxV RSBzZWxmKQoreworICBnZXRfZGF0MShzZWxmKTsKKworICBnZXRfamQoZGF0 KTsKKyAgcmV0dXJuIExPTkcyTlVNKGRhdC0+amQgLSAyNDAwMDAxTCk7Cit9 CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVfbGQoVkFMVUUgc2VsZikKK3sK KyAgZ2V0X2RhdDEoc2VsZik7CisKKyAgZ2V0X2pkKGRhdCk7CisgIHJldHVy biBMT05HMk5VTShkYXQtPmpkIC0gMjI5OTE2MEwpOworfQorCitzdGF0aWMg VkFMVUUKK2RhdGVsaXRlX3llYXIoVkFMVUUgc2VsZikKK3sKKyAgZ2V0X2Rh dDEoc2VsZik7CisKKyAgZ2V0X2NpdmlsKGRhdCk7CisgIHJldHVybiBJTlQy RklYKGRhdC0+eWVhcik7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVf bW9uKFZBTFVFIHNlbGYpCit7CisgIGdldF9kYXQxKHNlbGYpOworCisgIGdl dF9jaXZpbChkYXQpOworICByZXR1cm4gSU5UMkZJWChkYXQtPm1vbik7Cit9 CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVfbWRheShWQUxVRSBzZWxmKQor eworICBnZXRfZGF0MShzZWxmKTsKKworICBnZXRfY2l2aWwoZGF0KTsKKyAg cmV0dXJuIElOVDJGSVgoZGF0LT5tZGF5KTsKK30KKworc3RhdGljIFZBTFVF CitkYXRlbGl0ZV93ZGF5KFZBTFVFIHNlbGYpCit7CisgIGdldF9kYXQxKHNl bGYpOworCisgIGdldF9qZChkYXQpOworICByZXR1cm4gSU5UMkZJWCgoZGF0 LT5qZCArIDEpICUgNyk7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVf c3RhcnQoVkFMVUUgc2VsZikKK3sKKyAgZ2V0X2RhdDEoc2VsZik7CisKKyAg cmV0dXJuIERCTDJOVU0oZGF0LT5zZyk7Cit9CisKK3N0YXRpYyBWQUxVRQor ZGF0ZWxpdGVfem9uZShWQUxVRSBzZWxmKQoreworICByZXR1cm4gcmJfc3Ry X25ldzIoIiswMDowMCIpOworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRl X2NtcChWQUxVRSBzZWxmLCBWQUxVRSBvdGhlcikKK3sKKyAgaWYgKGtfZGF0 ZWxpdGVfcChvdGhlcikpIHsKKyAgICBnZXRfZGF0MihzZWxmLCBvdGhlcik7 CisKKyAgICBpZiAoYWRhdC0+ZmxhZ3MgJiBIQVZFX0pEICYmCisJYmRhdC0+ ZmxhZ3MgJiBIQVZFX0pEKSB7CisgICAgICBpZiAoYWRhdC0+amQgPT0gYmRh dC0+amQpCisJcmV0dXJuIElOVDJGSVgoMCk7CisgICAgICBpZiAoYWRhdC0+ amQgPCBiZGF0LT5qZCkKKwlyZXR1cm4gSU5UMkZJWCgtMSk7CisgICAgICBy ZXR1cm4gSU5UMkZJWCgxKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2V0X2Np dmlsKGFkYXQpOworICAgICAgZ2V0X2NpdmlsKGJkYXQpOworICAgICAgaWYg KGFkYXQtPnllYXIgPT0gYmRhdC0+eWVhcikgeworCWlmIChhZGF0LT5tb24g PT0gYmRhdC0+bW9uKSB7CisJICBpZiAoYWRhdC0+bWRheSA9PSBiZGF0LT5t ZGF5KSB7CisJICAgIHJldHVybiBJTlQyRklYKDApOworCSAgfSBlbHNlIGlm IChhZGF0LT5tZGF5IDwgYmRhdC0+bWRheSkgeworCSAgICByZXR1cm4gSU5U MkZJWCgtMSk7CisJICB9IGVsc2UgeworCSAgICByZXR1cm4gSU5UMkZJWCgx KTsKKwkgIH0KKwl9IGVsc2UgaWYgKGFkYXQtPm1vbiA8IGJkYXQtPm1vbikg eworCSAgcmV0dXJuIElOVDJGSVgoLTEpOworCX0gZWxzZSB7CisJICByZXR1 cm4gSU5UMkZJWCgxKTsKKwl9CisgICAgICB9IGVsc2UgaWYgKGFkYXQtPnll YXIgPCBiZGF0LT55ZWFyKSB7CisJcmV0dXJuIElOVDJGSVgoLTEpOworICAg ICAgfSBlbHNlIHsKKwlyZXR1cm4gSU5UMkZJWCgxKTsKKyAgICAgIH0KKyAg ICB9CisgIH0KKyAgcmV0dXJuIHJiX251bV9jb2VyY2VfY21wKGRhdGVsaXRl X2FqZChzZWxmKSwgb3RoZXIsIHJiX2ludGVybigiPD0+IikpOworfQorCitz dGF0aWMgVkFMVUUKK2RhdGVsaXRlX2VxZXFlcShWQUxVRSBzZWxmLCBWQUxV RSBvdGhlcikKK3sKKyAgaWYgKGtfZGF0ZWxpdGVfcChvdGhlcikpIHsKKyAg ICBnZXRfZGF0MihzZWxmLCBvdGhlcik7CisKKyAgICBpZiAoYWRhdC0+Zmxh Z3MgJiBIQVZFX0pEICYmCisJYmRhdC0+ZmxhZ3MgJiBIQVZFX0pEKSB7Cisg ICAgICBpZiAoYWRhdC0+amQgPT0gYmRhdC0+amQpCisJcmV0dXJuIFF0cnVl OworICAgICAgcmV0dXJuIFFmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAg Z2V0X2NpdmlsKGFkYXQpOworICAgICAgZ2V0X2NpdmlsKGJkYXQpOworICAg ICAgaWYgKGFkYXQtPnllYXIgPT0gYmRhdC0+eWVhcikKKwlpZiAoYWRhdC0+ bW9uID09IGJkYXQtPm1vbikKKwkgIGlmIChhZGF0LT5tZGF5ID09IGJkYXQt Pm1kYXkpCisJICAgIHJldHVybiBRdHJ1ZTsKKyAgICAgIHJldHVybiBRZmFs c2U7CisgICAgfQorICB9CisgIHJldHVybiByYl9udW1fY29lcmNlX2NtcChk YXRlbGl0ZV9hamQoc2VsZiksIG90aGVyLCByYl9pbnRlcm4oIj09PSIpKTsK K30KKworc3RhdGljIFZBTFVFCitkYXRlbGl0ZV9lcWxfcChWQUxVRSBzZWxm LCBWQUxVRSBvdGhlcikKK3sKKyAgaWYgKGtfZGF0ZWxpdGVfcChvdGhlcikp IHsKKyAgICBnZXRfZGF0MihzZWxmLCBvdGhlcik7CisKKyAgICBpZiAoYWRh dC0+ZmxhZ3MgJiBIQVZFX0pEICYmCisJYmRhdC0+ZmxhZ3MgJiBIQVZFX0pE KSB7CisgICAgICBpZiAoYWRhdC0+amQgPT0gYmRhdC0+amQpCisJcmV0dXJu IFF0cnVlOworICAgICAgcmV0dXJuIFFmYWxzZTsKKyAgICB9IGVsc2Ugewor ICAgICAgZ2V0X2NpdmlsKGFkYXQpOworICAgICAgZ2V0X2NpdmlsKGJkYXQp OworICAgICAgaWYgKGFkYXQtPnllYXIgPT0gYmRhdC0+eWVhcikKKwlpZiAo YWRhdC0+bW9uID09IGJkYXQtPm1vbikKKwkgIGlmIChhZGF0LT5tZGF5ID09 IGJkYXQtPm1kYXkpCisJICAgIHJldHVybiBRdHJ1ZTsKKyAgICAgIHJldHVy biBRZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiByYl9udW1fY29lcmNl X2NtcChzZWxmLCBvdGhlciwgcmJfaW50ZXJuKCJlcWw/IikpOworfQorCitz dGF0aWMgVkFMVUUKK2RhdGVsaXRlX2hhc2goVkFMVUUgc2VsZikKK3sKKyAg Z2V0X2RhdDEoc2VsZik7CisKKyAgcmV0dXJuIHJiX2Z1bmNhbGwoZGF0ZWxp dGVfYWpkKHNlbGYpLCByYl9pbnRlcm4oImhhc2giKSwgMCk7Cit9CisKK3N0 YXRpYyBWQUxVRQorZGF0ZWxpdGVfcGx1cyhWQUxVRSBzZWxmLCBWQUxVRSBv dGhlcikKK3sKKyAgc3dpdGNoIChUWVBFKG90aGVyKSkgeworICBjYXNlIFRf RklYTlVNOgorICAgIHsKKyAgICAgIGdldF9kYXQxKHNlbGYpOworICAgICAg Z2V0X2pkKGRhdCk7CisgICAgICBWQUxVRSBhWzJdOworCisgICAgICBhWzBd ID0gTE9ORzJOVU0oZGF0LT5qZCArIEZJWDJMT05HKG90aGVyKSk7CisgICAg ICBhWzFdID0gREJMMk5VTShkYXQtPnNnKTsKKyAgICAgIHJldHVybiBkYXRl X3NfamQoMiwgYSwgQ0xBU1NfT0Yoc2VsZikpOworICAgIH0KKyAgY2FzZSBU X0ZMT0FUOgorICAgIHsKKyAgICAgIGRvdWJsZSBuID0gUkZMT0FUX1ZBTFVF KG90aGVyKTsKKworICAgICAgaWYgKChpbnQpcm91bmQobikgPT0gbikgewor CWdldF9kYXQxKHNlbGYpOworCWdldF9qZChkYXQpOworCVZBTFVFIGFbMl07 CisKKwlhWzBdID0gREJMMk5VTSgoZG91YmxlKWRhdC0+amQgKyBuKTsKKwlh WzFdID0gREJMMk5VTShkYXQtPnNnKTsKKwlyZXR1cm4gZGF0ZV9zX2pkKDIs IGEsIENMQVNTX09GKHNlbGYpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAg eworICAgIGdldF9kYXQxKHNlbGYpOworICAgIGdldF9qZChkYXQpOworICAg IHJldHVybiByYl9mdW5jYWxsKHJiX2Z1bmNhbGwKKwkJICAgICAgKGNEYXRl UmlnaHQsIHJiX2ludGVybigiamQiKSwgMiwKKwkJICAgICAgIElOVDJGSVgo ZGF0LT5qZCksIERCTDJOVU0oZGF0LT5zZykpLCAnKycsIDEsIG90aGVyKTsK KyAgfQorfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRlX21pbnVzKFZBTFVF IHNlbGYsIFZBTFVFIG90aGVyKQoreworICBpZiAoa19kYXRlbGl0ZV9wKG90 aGVyKSkgeworICAgIGxvbmcgZDsKKyAgICBnZXRfZGF0MihzZWxmLCBvdGhl cik7CisKKyAgICBnZXRfamQoYWRhdCk7CisgICAgZ2V0X2pkKGJkYXQpOwor ICAgIGQgPSBhZGF0LT5qZCAtIGJkYXQtPmpkOworICAgIHJldHVybiBMT05H Mk5VTShkKTsKKyAgfQorCisgIHN3aXRjaCAoVFlQRShvdGhlcikpIHsKKyAg Y2FzZSBUX0ZJWE5VTToKKyAgICB7CisgICAgICBnZXRfZGF0MShzZWxmKTsK KyAgICAgIFZBTFVFIGFbMl07CisKKyAgICAgIGdldF9qZChkYXQpOworICAg ICAgYVswXSA9IExPTkcyTlVNKGRhdC0+amQgLSBGSVgyTE9ORyhvdGhlcikp OworICAgICAgYVsxXSA9IERCTDJOVU0oZGF0LT5zZyk7CisgICAgICByZXR1 cm4gZGF0ZV9zX2pkKDIsIGEsIENMQVNTX09GKHNlbGYpKTsKKyAgICB9Cisg IGNhc2UgVF9GTE9BVDoKKyAgICB7CisgICAgICBkb3VibGUgbiA9IFJGTE9B VF9WQUxVRShvdGhlcik7CisKKyAgICAgIGlmICgoaW50KXJvdW5kKG4pID09 IG4pIHsKKwlnZXRfZGF0MShzZWxmKTsKKwlWQUxVRSBhWzJdOworCisJZ2V0 X2pkKGRhdCk7CisJYVswXSA9IERCTDJOVU0oKGRvdWJsZSlkYXQtPmpkIC0g bik7CisJYVsxXSA9IERCTDJOVU0oZGF0LT5zZyk7CisJcmV0dXJuIGRhdGVf c19qZCgyLCBhLCBDTEFTU19PRihzZWxmKSk7CisgICAgICB9CisgICAgfQor ICB9CisgIHsKKyAgICBnZXRfZGF0MShzZWxmKTsKKyAgICBnZXRfamQoZGF0 KTsKKyAgICByZXR1cm4gcmJfZnVuY2FsbChyYl9mdW5jYWxsCisJCSAgICAg IChjRGF0ZVJpZ2h0LCByYl9pbnRlcm4oImpkIiksIDIsCisJCSAgICAgICBJ TlQyRklYKGRhdC0+amQpLCBEQkwyTlVNKGRhdC0+c2cpKSwgJy0nLCAxLCBv dGhlcik7CisgIH0KK30KKworc3RhdGljIFZBTFVFCitkYXRlbGl0ZV9zdWNj KFZBTFVFIHNlbGYpCit7CisgIHJldHVybiBkYXRlbGl0ZV9wbHVzKHNlbGYs IElOVDJGSVgoMSkpOworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRlX3Rv X3MoVkFMVUUgc2VsZikKK3sKKyAgZ2V0X2RhdDEoc2VsZik7CisKKyAgZ2V0 X2NpdmlsKGRhdCk7CisgIHJldHVybiByYl9zcHJpbnRmKCIlLjRkLSUwMmQt JTAyZCIsIGRhdC0+eWVhciwgZGF0LT5tb24sIGRhdC0+bWRheSk7Cit9CisK K3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVfaW5zcGVjdChWQUxVRSBzZWxmKQor eworICBnZXRfZGF0MShzZWxmKTsKKworICBnZXRfY2l2aWwoZGF0KTsKKyAg Z2V0X2pkKGRhdCk7CisgIHJldHVybiByYl9zcHJpbnRmKCIjPERhdGU6Okxp Z2h0OiAlLjRkLSUwMmQtJTAyZCAoJWxkKT4iLAorCQkgICAgZGF0LT55ZWFy LCBkYXQtPm1vbiwgZGF0LT5tZGF5LCBkYXQtPmpkKTsKK30KKworc3RhdGlj IFZBTFVFCitkYXRlbGl0ZV96ZXJvKFZBTFVFIHNlbGYpCit7CisgIHJldHVy biBJTlQyRklYKDApOworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRlX3J6 ZXJvKFZBTFVFIHNlbGYpCit7CisgIHJldHVybiByYl9yYXRpb25hbF9uZXcx KElOVDJGSVgoMCkpOworfQorCitzdGF0aWMgVkFMVUUKK2RhdGVsaXRlX2Zh bHNlKFZBTFVFIHNlbGYpCit7CisgIHJldHVybiBRZmFsc2U7Cit9CisKK3N0 YXRpYyBWQUxVRQorZGF0ZWxpdGVfdHJ1ZShWQUxVRSBzZWxmKQoreworICBy ZXR1cm4gUXRydWU7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVfbWFy c2hhbF9kdW1wKFZBTFVFIHNlbGYpCit7CisgIFZBTFVFIGE7CisgIGdldF9k YXQxKHNlbGYpOworCisgIGEgPSByYl9hc3NvY19uZXcoSU5UMkZJWChkYXQt PmpkKSwgREJMMk5VTShkYXQtPnNnKSk7CisKKyAgaWYgKEZMX1RFU1Qoc2Vs ZiwgRkxfRVhJVkFSKSkgeworICAgIHJiX2NvcHlfZ2VuZXJpY19pdmFyKGEs IHNlbGYpOworICAgIEZMX1NFVChhLCBGTF9FWElWQVIpOworICB9CisKKyAg cmV0dXJuIGE7Cit9CisKK3N0YXRpYyBWQUxVRQorZGF0ZWxpdGVfbWFyc2hh bF9sb2FkKFZBTFVFIHNlbGYsIFZBTFVFIGEpCit7CisgIGdldF9kYXQxKHNl bGYpOworCisgIGRhdC0+amQgPSBGSVgySU5UKFJBUlJBWV9QVFIoYSlbMF0p OworICBkYXQtPnNnID0gTlVNMkRCTChSQVJSQVlfUFRSKGEpWzFdKTsKKyAg ZGF0LT55ZWFyID0gMDsKKyAgZGF0LT5tb24gPSAwOworICBkYXQtPm1kYXkg PSAwOworCisgIGlmIChGTF9URVNUKGEsIEZMX0VYSVZBUikpIHsKKyAgICBy Yl9jb3B5X2dlbmVyaWNfaXZhcihzZWxmLCBhKTsKKyAgICBGTF9TRVQoc2Vs ZiwgRkxfRVhJVkFSKTsKKyAgfQorCisgIHJldHVybiBzZWxmOworfQorCit2 b2lkCitJbml0X2RhdGVfY29yZSh2b2lkKQoreworICBjRGF0ZSA9IHJiX2Rl ZmluZV9jbGFzcygiRGF0ZSIsIHJiX2NPYmplY3QpOworCisgIGNEYXRlUmln aHQgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIoY0RhdGUsICJSaWdodCIsIGNE YXRlKTsKKyAgY0RhdGVMaWdodCA9IHJiX2RlZmluZV9jbGFzc191bmRlcihj RGF0ZSwgIkxpZ2h0IiwgY0RhdGUpOworCisgIHJiX2RlZmluZV9hbGxvY19m dW5jKGNEYXRlTGlnaHQsIGRhdGVsaXRlX3NfYWxsb2MpOworCisgIHJiX2Rl ZmluZV9zaW5nbGV0b25fbWV0aG9kKGNEYXRlLCAidmFsaWRfY2l2aWw/Iiwg ZGF0ZV9zX3ZhbGlkX2NpdmlsX3AsIC0xKTsKKyAgcmJfZGVmaW5lX3Npbmds ZXRvbl9tZXRob2QoY0RhdGUsICJ2YWxpZF9kYXRlPyIsIGRhdGVfc192YWxp ZF9jaXZpbF9wLCAtMSk7CisgIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9k KGNEYXRlLCAiamQiLCBkYXRlX3NfamQsIC0xKTsKKyAgcmJfZGVmaW5lX3Np bmdsZXRvbl9tZXRob2QoY0RhdGUsICJjaXZpbCIsIGRhdGVfc19jaXZpbCwg LTEpOworICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChjRGF0ZSwgIm5l dyIsIGRhdGVfc19jaXZpbCwgLTEpOworICByYl9kZWZpbmVfc2luZ2xldG9u X21ldGhvZChjRGF0ZSwgInRvZGF5IiwgZGF0ZV9zX3RvZGF5LCAtMSk7CisK KyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAiYWpkIiwgZGF0ZWxp dGVfYWpkLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAi YW1qZCIsIGRhdGVsaXRlX2FtamQsIDApOworICByYl9kZWZpbmVfbWV0aG9k KGNEYXRlTGlnaHQsICJqZCIsIGRhdGVsaXRlX2pkLCAwKTsKKyAgcmJfZGVm aW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAibWpkIiwgZGF0ZWxpdGVfbWpkLCAw KTsKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAibGQiLCBkYXRl bGl0ZV9sZCwgMCk7CisKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0 LCAieWVhciIsIGRhdGVsaXRlX3llYXIsIDApOworICByYl9kZWZpbmVfbWV0 aG9kKGNEYXRlTGlnaHQsICJtb24iLCBkYXRlbGl0ZV9tb24sIDApOworICBy Yl9kZWZpbmVfbWV0aG9kKGNEYXRlTGlnaHQsICJtb250aCIsIGRhdGVsaXRl X21vbiwgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoY0RhdGVMaWdodCwgIm1k YXkiLCBkYXRlbGl0ZV9tZGF5LCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChj RGF0ZUxpZ2h0LCAiZGF5IiwgZGF0ZWxpdGVfbWRheSwgMCk7CisgIHJiX2Rl ZmluZV9tZXRob2QoY0RhdGVMaWdodCwgIndkYXkiLCBkYXRlbGl0ZV93ZGF5 LCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAiZGF5X2Zy YWN0aW9uIiwgZGF0ZWxpdGVfcnplcm8sIDApOworCisgIHJiX2RlZmluZV9w cml2YXRlX21ldGhvZChjRGF0ZUxpZ2h0LCAiaG91ciIsIGRhdGVsaXRlX3pl cm8sIDApOworICByYl9kZWZpbmVfcHJpdmF0ZV9tZXRob2QoY0RhdGVMaWdo dCwgIm1pbiIsIGRhdGVsaXRlX3plcm8sIDApOworICByYl9kZWZpbmVfcHJp dmF0ZV9tZXRob2QoY0RhdGVMaWdodCwgIm1pbnV0ZSIsIGRhdGVsaXRlX3pl cm8sIDApOworICByYl9kZWZpbmVfcHJpdmF0ZV9tZXRob2QoY0RhdGVMaWdo dCwgInNlYyIsIGRhdGVsaXRlX3plcm8sIDApOworICByYl9kZWZpbmVfcHJp dmF0ZV9tZXRob2QoY0RhdGVMaWdodCwgInNlY29uZCIsIGRhdGVsaXRlX3pl cm8sIDApOworICByYl9kZWZpbmVfcHJpdmF0ZV9tZXRob2QoY0RhdGVMaWdo dCwgInNlY19mcmFjdGlvbiIsIGRhdGVsaXRlX3plcm8sIDApOworICByYl9k ZWZpbmVfcHJpdmF0ZV9tZXRob2QoY0RhdGVMaWdodCwgInNlY29uZF9mcmFj dGlvbiIsIGRhdGVsaXRlX3plcm8sIDApOworICByYl9kZWZpbmVfcHJpdmF0 ZV9tZXRob2QoY0RhdGVMaWdodCwgIm9mZnNldCIsIGRhdGVsaXRlX3plcm8s IDApOworICByYl9kZWZpbmVfcHJpdmF0ZV9tZXRob2QoY0RhdGVMaWdodCwg InpvbmUiLCBkYXRlbGl0ZV96b25lLCAwKTsKKworICByYl9kZWZpbmVfbWV0 aG9kKGNEYXRlTGlnaHQsICJzdGFydCIsIGRhdGVsaXRlX3N0YXJ0LCAwKTsK KworICByYl9kZWZpbmVfbWV0aG9kKGNEYXRlTGlnaHQsICI8PT4iLCBkYXRl bGl0ZV9jbXAsIDEpOworICByYl9kZWZpbmVfbWV0aG9kKGNEYXRlTGlnaHQs ICI9PT0iLCBkYXRlbGl0ZV9lcWVxZXEsIDEpOworICByYl9kZWZpbmVfbWV0 aG9kKGNEYXRlTGlnaHQsICJlcWw/IiwgZGF0ZWxpdGVfZXFsX3AsIDEpOwor ICByYl9kZWZpbmVfbWV0aG9kKGNEYXRlTGlnaHQsICJoYXNoIiwgZGF0ZWxp dGVfaGFzaCwgMCk7CisKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0 LCAianVsaWFuPyIsIGRhdGVsaXRlX2ZhbHNlLCAwKTsKKyAgcmJfZGVmaW5l X21ldGhvZChjRGF0ZUxpZ2h0LCAiZ3JlZ29yaWFuPyIsIGRhdGVsaXRlX3Ry dWUsIDApOworCisgIHJiX2RlZmluZV9tZXRob2QoY0RhdGVMaWdodCwgIisi LCBkYXRlbGl0ZV9wbHVzLCAxKTsKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0 ZUxpZ2h0LCAiLSIsIGRhdGVsaXRlX21pbnVzLCAxKTsKKyAgcmJfZGVmaW5l X21ldGhvZChjRGF0ZUxpZ2h0LCAic3VjYyIsIGRhdGVsaXRlX3N1Y2MsIDAp OworICByYl9kZWZpbmVfbWV0aG9kKGNEYXRlTGlnaHQsICJuZXh0IiwgZGF0 ZWxpdGVfc3VjYywgMCk7CisKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxp Z2h0LCAidG9fcyIsIGRhdGVsaXRlX3RvX3MsIDApOworICByYl9kZWZpbmVf bWV0aG9kKGNEYXRlTGlnaHQsICJpbnNwZWN0IiwgZGF0ZWxpdGVfaW5zcGVj dCwgMCk7CisKKyAgcmJfZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAibWFy c2hhbF9kdW1wIiwgZGF0ZWxpdGVfbWFyc2hhbF9kdW1wLCAwKTsKKyAgcmJf ZGVmaW5lX21ldGhvZChjRGF0ZUxpZ2h0LCAibWFyc2hhbF9sb2FkIiwgZGF0 ZWxpdGVfbWFyc2hhbF9sb2FkLCAxKTsKK30KClByb3BlcnR5IGNoYW5nZXMg b246IGV4dC9kYXRlL2RhdGVfY29yZS5jCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KQWRkZWQ6IHN2bjptaW1lLXR5cGUKICAgKyB0ZXh0L3BsYWluCgpJbmRl eDogZXh0L2RhdGUvZXh0Y29uZi5yYgo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBleHQvZGF0ZS9leHRjb25mLnJiCShyZXZpc2lvbiAwKQorKysgZXh0 L2RhdGUvZXh0Y29uZi5yYgkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyIEBA CityZXF1aXJlICdta21mJworY3JlYXRlX21ha2VmaWxlKCdkYXRlX2NvcmUn KQoKUHJvcGVydHkgY2hhbmdlcyBvbjogZXh0L2RhdGUvZXh0Y29uZi5yYgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46bWltZS10eXBlCiAg ICsgdGV4dC9wbGFpbgoK --mimepart_4cf993c44c746_2647b7c37825cc Content-Type: application/x-ruby; name=bm2.rb Content-Transfer-Encoding: Base64 Content-Disposition: attachment; filename=bm2.rb cmVxdWlyZSAnYmVuY2htYXJrJwoKbiA9IDEwMDAwMApCZW5jaG1hcmsuYm0g ZG8gfHh8CiAgeC5yZXBvcnQoJ0RhdGU6OnZhbGlkX2RhdGU/OicpIGRvCiAg ICBuLnRpbWVzIGRvCiAgICAgIERhdGUudmFsaWRfZGF0ZT8oMjAwMSwyLDMs RGF0ZTo6R1JFR09SSUFOKQogICAgZW5kCiAgZW5kCiAgeC5yZXBvcnQoJ0Rh dGU6Om5ldzonKSBkbwogICAgbi50aW1lcyBkbwogICAgICBEYXRlLm5ldygy MDAxLDIsMyxEYXRlOjpHUkVHT1JJQU4pCiAgICBlbmQKICBlbmQKICBkID0g RGF0ZS5uZXcoMjAwMSwyLDMsRGF0ZTo6R1JFR09SSUFOKQogIHgucmVwb3J0 KCdEYXRlI3RvX3M6JykgZG8KICAgIG4udGltZXMgZG8KICAgICAgZC50b19z CiAgICBlbmQKICBlbmQKICB4LnJlcG9ydCgnRGF0ZSMrOicpIGRvCiAgICBu LnRpbWVzIGRvCiAgICAgIGQgKyAxMAogICAgZW5kCiAgZW5kCiAgeC5yZXBv cnQoJ0RhdGUjLTonKSBkbwogICAgbi50aW1lcyBkbwogICAgICBkIC0gMTAK ICAgIGVuZAogIGVuZAogIGEgPSBbXQogIG4udGltZXMgZG8KICAgIGEgPDwg RGF0ZS5uZXcocmFuZCgyMDAwKSwgcmFuZCgxMikgKyAxLCByYW5kKDI4KSAr IDEsIERhdGU6OkdSRUdPUklBTikKICBlbmQKICB4LnJlcG9ydCgnW0RhdGVd I3NvcnQ6JykgZG8KICAgIGEuc29ydAogIGVuZAplbmQK --mimepart_4cf993c44c746_2647b7c37825cc--