From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Widawsky Subject: Re: [PATCH] [v2] intel_frequency: A tool to manipulate Intel GPU frequency Date: Sun, 11 Jan 2015 19:47:43 -0800 Message-ID: <20150112034742.GA3698@bwidawsk.net> References: <1420949969-877-2-git-send-email-benjamin.widawsky@intel.com> <1421033721-3601-1-git-send-email-benjamin.widawsky@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail.bwidawsk.net (bwidawsk.net [166.78.191.112]) by gabe.freedesktop.org (Postfix) with ESMTP id 74C0E6E484 for ; Sun, 11 Jan 2015 19:47:51 -0800 (PST) Content-Disposition: inline In-Reply-To: <1421033721-3601-1-git-send-email-benjamin.widawsky@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Ben Widawsky Cc: Intel GFX List-Id: intel-gfx@lists.freedesktop.org T24gU3VuLCBKYW4gMTEsIDIwMTUgYXQgMDc6MzU6MjFQTSAtMDgwMCwgQmVuIFdpZGF3c2t5IHdy b3RlOgo+IFdBUk5JTkc6IHZlcnkgbWluaW1hbGx5IHRlc3RlZAo+IAo+IEluIGdlbmVyYWwgeW91 IHNob3VsZCBub3QgbmVlZCB0aGlzIHRvb2wuIEl0J3MgcHJpbWFyeSBwdXJwb3NlIGlzIGZvcgo+ IGJlbmNobWFya2luZywgYW5kIGZvciBkZWJ1Z2dpbmcgcGVyZm9ybWFuY2UgaXNzdWVzLgoKSSBu b3RpY2VkIHRoZSAiaXQncyIgdnMgIml0cyIgb24gdjEsIGJ1dCBmb3Jnb3QgdG8gZml4IGl0LiBJ VCdTIGZpeGVkIGxvY2FsbHkKdGhvdWdoLgoKPiAKPiBGb3IgbWFueSBrZXJuZWwgcmVsZWFzZXMg bm93IHN5c2ZzIGhhcyBzdXBwb3J0ZWQgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgR1BVCj4gZnJl cXVlbmN5LiBUaGVyZWZvcmUsIHRoaXMgdG9vbCBwcm92aWRlcyBubyBuZXcgZnVuY3Rpb25hbGl0 eS4gV2hhdCBpdCBkb2VzCj4gcHJvdmlkZSBpcyBhbiBlYXN5IHRvIHBhY2thZ2UgKGZvciBkaXN0 cm9zKSB0b29sIHRoYXQgaGFuZGxlcyB0aGUgbW9zdCBjb21tb24KPiBzY2VuYXJpb3MuCj4gCj4g djI6Cj4gR2V0IHJpZCBvZiAtZiBmcm9tIHRoZSB1c2FnZSBtZXNzYWdlIChKb3JkYW4pCj4gQWRk IHNwYWNlIGJlZm9yZSBbLXMgKEpvcmRhbikKPiBBZGQgYSAtYy8tLWN1c3RvbSBleGFtcGxlIChK b3JkYW4pCj4gQWRkIGEgc2V0dGluZyBmb3IgcmVzZXR0aW5nIHRvIGhhcmR3YXJlIGRlZmF1bHQg KEtlbikKPiBSZXBsaWNhdGUgZXhhbXBsZXMgaW4gY29tbWl0IG1lc3NhZ2UgaW4gdGhlIHNvdXJj ZSBjb2RlLiAobWUpCj4gCj4gU2lnbmVkLW9mZi1ieTogQmVuIFdpZGF3c2t5IDxiZW5AYndpZGF3 c2submV0Pgo+IFJldmlld2VkLWJ5OiBKb3JkYW4gSnVzdGVuIDxqb3JkYW4ubC5qdXN0ZW5AaW50 ZWwuY29tPgo+IENjOiBLZW5uZXRoIEdyYXVua2UgPGtlbm5ldGhAd2hpdGVjYXBlLm9yZz4KPiAK PiBIZXJlIGFyZSBzb21lIHNhbXBsZSB1c2FnZXM6Cj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAt LWdldD1jdXIsbWluLG1heCxlZmYKPiBjdXI6IDIwMCBNSHoKPiBtaW46IDIwMCBNSHoKPiBSUDE6 IDIwMCBNSHoKPiBtYXg6IDEyMDAgTUh6Cj4gCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwo+ IGN1cjogMjAwIE1Iego+IG1pbjogMjAwIE1Iego+IFJQMTogMjAwIE1Iego+IG1heDogMTIwMCBN SHoKPiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1nZWZmCj4gUlAxOiAyMDAgTUh6Cj4gCj4g JCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLXNldCBtaW49MzAwCj4gJCBzdWRvIGludGVsX2ZyZXF1 ZW5jeSAtLWdldCBtaW4KPiBjdXI6IDMwMCBNSHoKPiBtaW46IDMwMCBNSHoKPiBSUDE6IDIwMCBN SHoKPiBtYXg6IDEyMDAgTUh6Cj4gCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLWN1c3RvbSBt YXg9OTAwCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLWdldCBtYXgKPiBjdXI6IDMwMCBNSHoK PiBtaW46IDMwMCBNSHoKPiBSUDE6IDIwMCBNSHoKPiBtYXg6IDkwMCBNSHoKPiAKPiAkIHN1ZG8g aW50ZWxfZnJlcXVlbmN5IC0tbWF4Cj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwo+IGN1cjog MTIwMCBNSHoKPiBtaW46IDEyMDAgTUh6Cj4gUlAxOiAyMDAgTUh6Cj4gbWF4OiAxMjAwIE1Iego+ IAo+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWUKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1n Cj4gY3VyOiAyMDAgTUh6Cj4gbWluOiAyMDAgTUh6Cj4gUlAxOiAyMDAgTUh6Cj4gbWF4OiAyMDAg TUh6Cj4gCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLW1heAo+ICQgc3VkbyBpbnRlbF9mcmVx dWVuY3kgLWcKPiBjdXI6IDEyMDAgTUh6Cj4gbWluOiAxMjAwIE1Iego+IFJQMTogMjAwIE1Iego+ IG1heDogMTIwMCBNSHoKPiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tbWluCj4gJCBzdWRv IGludGVsX2ZyZXF1ZW5jeSAtZwo+IGN1cjogMjAwIE1Iego+IG1pbjogMjAwIE1Iego+IFJQMTog MjAwIE1Iego+IG1heDogMjAwIE1Iego+IC0tLQo+ICB0b29scy9NYWtlZmlsZS5zb3VyY2VzICB8 ICAgMSArCj4gIHRvb2xzL2ludGVsX2ZyZXF1ZW5jeS5jIHwgMzYzICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAyIGZpbGVzIGNoYW5nZWQsIDM2NCBp bnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9mcmVxdWVuY3ku Ywo+IAo+IGRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZp bGUuc291cmNlcwo+IGluZGV4IGI4NWE2YjguLjJiZWEzODkgMTAwNjQ0Cj4gLS0tIGEvdG9vbHMv TWFrZWZpbGUuc291cmNlcwo+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPiBAQCAtMTQs NiArMTQsNyBAQCBiaW5fUFJPR1JBTVMgPSAJCQkJXAo+ICAJaW50ZWxfZHVtcF9kZWNvZGUgCQlc Cj4gIAlpbnRlbF9lcnJvcl9kZWNvZGUgCQlcCj4gIAlpbnRlbF9mb3JjZXdha2VkCQlcCj4gKwlp bnRlbF9mcmVxdWVuY3kJCQlcCj4gIAlpbnRlbF9mcmFtZWJ1ZmZlcl9kdW1wIAkJXAo+ICAJaW50 ZWxfZ3B1X3RpbWUgCQkJXAo+ICAJaW50ZWxfZ3B1X3RvcCAJCQlcCj4gZGlmZiAtLWdpdCBhL3Rv b2xzL2ludGVsX2ZyZXF1ZW5jeS5jIGIvdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMKPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjU5ZjM4MTQKPiAtLS0gL2Rldi9udWxsCj4g KysrIGIvdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMKPiBAQCAtMCwwICsxLDM2MyBAQAo+ICsvKgo+ ICsgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsgKiBQZXJt aXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBv YnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9j dW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u Cj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBk aXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNv ZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiArICogU29mdHdhcmUg aXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlz c2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ICsgKiBwYXJhZ3JhcGgpIHNoYWxsIGJl IGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCj4g KyAqIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT IiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVE LCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklO RlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCj4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlS SUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4g KyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Ig T1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKPiArICogREVBTElOR1MgSU4gVEhF IFNPRlRXQVJFLgo+ICsgKgo+ICsgKiBFeGFtcGxlOgo+ICsgKiBHZXQgYWxsIGZyZXF1ZW5jaWVz Ogo+ICsgKiBpbnRlbF9mcmVxdWVuY3kgLS1nZXQ9Y3VyLG1pbixtYXgsZWZmCj4gKyAqCj4gKyAq IFNhbWUgYXMgYWJvdmU6Cj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtZwo+ICsgKgo+ICsgKiBHZXQg dGhlIGVmZmljaWVudCBmcmVxdWVuY3k6Cj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtZ2VmZgo+ICsg Kgo+ICsgKiBMb2NrIHRoZSBHUFUgZnJlcXVlbmN5IHRvIDMwME1IejoKPiArICogaW50ZWxfZnJl cXVlbmN5IC0tc2V0IG1pbj0zMDAKPiArICoKPiArICogU2V0IHRoZSBtYXhpbXVtIGZyZXF1ZW5j eSB0byA5MDBNSHo6Cj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtLWN1c3RvbSBtYXg9OTAwCj4gKyAq Cj4gKyAqIExvY2sgdGhlIEdQVSBmcmVxdWVuY3kgdG8gaXRzIG1heGltdW0gZnJlcXVlbmN5Ogo+ ICsgKiBpbnRlbF9mcmVxdWVuY3kgLS1tYXgKPiArICoKPiArICogTG9jayB0aGUgR1BVIGZyZXF1 ZW5jeSB0byBpdHMgbW9zdCBlZmZpY2llbnQgZnJlcXVlbmN5Ogo+ICsgKiBpbnRlbF9mcmVxdWVu Y3kgLWUKPiArICoKPiArICogTG9jayBUaGUgR1BVIGZyZXF1ZW5jeSB0byBpdHMgbWluaW11bSBm cmVxdWVuY3k6Cj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtLW1pbgo+ICsgKgo+ICsgKiBSZXNldCB0 aGUgR1BVIHRvIGhhcmR3YXJlIGRlZmF1bHRzCj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtZAo+ICsg Ki8KPiArCj4gKyNkZWZpbmUgX0dOVV9TT1VSQ0UKPiArI2luY2x1ZGUgPGFzc2VydC5oPgo+ICsj aW5jbHVkZSA8Z2V0b3B0Lmg+Cj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8dGlt ZS5oPgo+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4gKwo+ICsjaW5jbHVkZSAiZHJtdGVzdC5oIgo+ ICsjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgo+ICsKPiArc3RhdGljIGludCBkZXZpY2UsIGRl dmlkOwo+ICsKPiArZW51bSB7Cj4gKwlDVVI9MCwKPiArCU1JTiwKPiArCUVGRiwKPiArCU1BWCwK PiArCVJQMCwKPiArCVJQbgo+ICt9Owo+ICsKPiArc3RydWN0IGZyZXFfaW5mbyB7Cj4gKwljb25z dCBjaGFyICpuYW1lOwo+ICsJY29uc3QgY2hhciAqbW9kZTsKPiArCUZJTEUgKmZpbHA7Cj4gKwlj aGFyICpwYXRoOwo+ICt9Owo+ICsKPiArc3RhdGljIHN0cnVjdCBmcmVxX2luZm8gaW5mb1tdID0g ewo+ICsJeyAiY3VyIiwgInIiICB9LAo+ICsJeyAibWluIiwgInJiKyIgfSwKPiArCXsgIlJQMSIs ICJyIiB9LAo+ICsJeyAibWF4IiwgInJiKyIgfSwKPiArCXsgIlJQMCIsICJyIiB9LAo+ICsJeyAi UlBuIiwgInIiIH0KPiArfTsKPiArCj4gK3N0YXRpYyBjaGFyICoKPiArZ2V0X3N5c2ZzX3BhdGgo Y29uc3QgY2hhciAqd2hpY2gpCj4gK3sKPiArCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIi9z eXMvY2xhc3MvZHJtL2NhcmQlMWQvZ3RfJTNzX2ZyZXFfbWh6IjsKPiArCWNoYXIgKnBhdGg7Cj4g KwlpbnQgcmV0Owo+ICsKPiArI2RlZmluZSBTVEFUSUNfU1RSTEVOKHN0cmluZykgKHNpemVvZihz dHJpbmcpIC8gc2l6ZW9mKHN0cmluZyBbMF0pKQo+ICsJcmV0ID0gYXNwcmludGYoJnBhdGgsIGZt dCwgZGV2aWNlLCB3aGljaCk7Cj4gKwlhc3NlcnQocmV0ID09IChTVEFUSUNfU1RSTEVOKGZtdCkg LSAzKSk7Cj4gKyN1bmRlZiBTVEFUSUNfU1RSTEVOCj4gKwo+ICsJcmV0dXJuIHBhdGg7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkCj4gK2luaXRpYWxpemVfZnJlcV9pbmZvKHN0cnVjdCBmcmVxX2lu Zm8gKmZyZXFfaW5mbykKPiArewo+ICsJaWYgKGZyZXFfaW5mby0+ZmlscCkKPiArCQlyZXR1cm47 Cj4gKwo+ICsJZnJlcV9pbmZvLT5wYXRoID0gZ2V0X3N5c2ZzX3BhdGgoZnJlcV9pbmZvLT5uYW1l KTsKPiArCWFzc2VydChmcmVxX2luZm8tPnBhdGgpOwo+ICsJZnJlcV9pbmZvLT5maWxwID0gZm9w ZW4oZnJlcV9pbmZvLT5wYXRoLCBmcmVxX2luZm8tPm1vZGUpOwo+ICsJYXNzZXJ0KGZyZXFfaW5m by0+ZmlscCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHdhaXRfZnJlcV9zZXR0bGUodm9pZCkK PiArewo+ICsJc3RydWN0IHRpbWVzcGVjIHRzOwo+ICsKPiArCS8qIEZJWE1FOiBMYXp5IHNsZWVw IHdpdGhvdXQgY2hlY2suICovCj4gKwl0cy50dl9zZWMgPSAwOwo+ICsJdHMudHZfbnNlYyA9IDIw MDAwOwo+ICsJY2xvY2tfbmFub3NsZWVwKENMT0NLX01PTk9UT05JQywgMCwgJnRzLCBOVUxMKTsK PiArfQo+ICsKPiArc3RhdGljIHZvaWQgc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZnJlcV9pbmZvICpm cmVxX2luZm8sIGludCB2YWwpCj4gK3sKPiArCWluaXRpYWxpemVfZnJlcV9pbmZvKGZyZXFfaW5m byk7Cj4gKwlyZXdpbmQoZnJlcV9pbmZvLT5maWxwKTsKPiArCWFzc2VydChmcHJpbnRmKGZyZXFf aW5mby0+ZmlscCwgIiVkIiwgdmFsKSA+IDApOwo+ICsKPiArCXdhaXRfZnJlcV9zZXR0bGUoKTsK PiArfQo+ICsKPiArc3RhdGljIGludCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBmcmVxX2luZm8gKmZy ZXFfaW5mbykKPiArewo+ICsJaW50IHZhbDsKPiArCj4gKwlpbml0aWFsaXplX2ZyZXFfaW5mbyhm cmVxX2luZm8pOwo+ICsJcmV3aW5kKGZyZXFfaW5mby0+ZmlscCk7Cj4gKwlhc3NlcnQoZnNjYW5m KGZyZXFfaW5mby0+ZmlscCwgIiVkIiwgJnZhbCk9PTEpOwo+ICsKPiArCXJldHVybiB2YWw7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkCj4gK3VzYWdlKGNvbnN0IGNoYXIgKnByb2cpCj4gK3sKPiAr CXByaW50ZigiVXNhZ2U6ICVzIFstZV0gWy0tbWluIHwgLS1tYXhdIFstZyAobWlufG1heHxlZmZp Y2llbnQpXSBbLXMgZnJlcXVlbmN5X21oel1cblxuIiwgcHJvZyk7Cj4gKwlwcmludGYoIiVzIEEg cHJvZ3JhbSB0byBtYW5pcHVsYXRlIEludGVsIEdQVSBmcmVxdWVuY2llcy5cblxuIiwgcHJvZyk7 Cj4gKwlwcmludGYoIk9wdGlvbnM6IFxuIik7Cj4gKwlwcmludGYoIiAgLWUJCUxvY2sgZnJlcXVl bmN5IHRvIHRoZSBtb3N0IGVmZmljaWVudCBmcmVxdWVuY3lcbiIpOwo+ICsJcHJpbnRmKCIgIC1n LCAtLWdldD0gICAgR2V0IHRoZSBmcmVxdWVuY3kgKG9wdGlvbmFsIGFyZzogXCJjdXJcInxcIm1p blwifFwibWF4XCJ8XCJlZmZcIilcbiIpOwo+ICsJcHJpbnRmKCIgIC1zLCAtLXNldCAgICAgTG9j ayBmcmVxdWVuY3kgdG8gYW4gYWJzb2x1dGUgdmFsdWUgKE1IeilcbiIpOwo+ICsJcHJpbnRmKCIg IC1jLCAtLWN1c3RvbSAgU2V0IGEgbWluLCBvciBtYXggZnJlcXVlbmN5IFwibWluPVggfCBtYXg9 WVwiXG4iKTsKPiArCXByaW50ZigiICAtbSAgLS1tYXggICAgIExvY2sgZnJlcXVlbmN5IHRvIG1h eCBmcmVxdWVuY3lcbiIpOwo+ICsJcHJpbnRmKCIgIC1pICAtLW1pbiAgICAgTG9jayBmcmVxdWVu Y3kgdG8gbWluIChuZXZlciBhIGdvb2QgaWRlYSwgREVCVUcgT05MWSlcbiIpOwo+ICsJcHJpbnRm KCIgIC1kICAtLWRlZmF1bHRzICBSZXR1cm4gdGhlIHN5c3RlbSB0byBoYXJkd2FyZSBkZWZhdWx0 c1xuIik7Cj4gKwlwcmludGYoIkV4YW1wbGVzOlxuIik7Cj4gKwlwcmludGYoIlx0aW50ZWxfZnJl cXVlbmN5IC1nbWluLGN1ciBHZXQgdGhlIGN1cnJlbnQgYW5kIG1pbmltdW0gZnJlcXVlbmN5XG4i KTsKPiArCXByaW50ZigiXHRpbnRlbF9mcmVxdWVuY3kgLXMgNDAwICAgIExvY2sgZnJlcXVlbmN5 IHRvIDQwME1oelxuIik7Cj4gKwlwcmludGYoIlx0aW50ZWxfZnJlcXVlbmN5IC1jIG1heD03NTAg U2V0IHRoZSBtYXggZnJlcXVlbmN5IHRvIDc1ME1IelxuIik7Cj4gKwlleGl0KEVYSVRfRkFJTFVS RSk7Cj4gK30KPiArCj4gKy8qIFJldHVybnMgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gKi8KPiAr c3RhdGljIGJvb2wKPiArcGFyc2UoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgYm9vbCAqYWN0X3Vw b24sIGludCAqbmV3X2ZyZXEpCj4gK3sKPiArCWludCBjLCB0bXA7Cj4gKwlib29sIHdyaXRlID0g ZmFsc2U7Cj4gKwo+ICsJY2hhciAqdG9rZW5bXSA9IHsKPiArCQkoY2hhciAqKWluZm9bQ1VSXS5u YW1lLAo+ICsJCShjaGFyICopaW5mb1tNSU5dLm5hbWUsCj4gKwkJKGNoYXIgKikiZWZmIiwKPiAr CQkoY2hhciAqKWluZm9bTUFYXS5uYW1lCj4gKwl9Owo+ICsKPiArCS8qIE5vIGFyZ3MgbWVhbnMg LWciICovCj4gKwlpZiAoYXJnYyA9PSAxKSB7Cj4gKwkJZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJ WkUoYWN0X3Vwb24pOyBjKyspCj4gKwkJCWFjdF91cG9uW2NdID0gdHJ1ZTsKPiArCQlnb3RvIGRv bmU7Cj4gKwl9Cj4gKwl3aGlsZSAoMSkgewo+ICsJCWludCBvcHRpb25faW5kZXggPSAwOwo+ICsJ CXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0gewo+ICsJCQl7ICJnZXQiLCBv cHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ2cnIH0sCj4gKwkJCXsgInNldCIsIHJlcXVpcmVkX2Fy Z3VtZW50LCBOVUxMLCAncycgfSwKPiArCQkJeyAiY3VzdG9tIiwgcmVxdWlyZWRfYXJndW1lbnQs IE5VTEwsICdjJ30sCj4gKwkJCXsgIm1pbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaScgfSwKPiAr CQkJeyAibWF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdtJyB9LAo+ICsJCQl7ICJkZWZhdWx0cyIs IG5vX2FyZ3VtZW50LCBOVUxMLCAnZCcgfSwKPiArCQkJeyAiaGVscCIsIG5vX2FyZ3VtZW50LCBO VUxMLCAnaCcgfSwKPiArCQkJeyBOVUxMLCAwLCBOVUxMLCAwfQo+ICsJCX07Cj4gKwo+ICsJCWMg PSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiZWc6OnM6YzptaWRoIiwgbG9uZ19vcHRpb25zLCAm b3B0aW9uX2luZGV4KTsKPiArCQlpZiAoYyA9PSAtMSkKPiArCQkJYnJlYWs7Cj4gKwo+ICsJCXN3 aXRjaCAoYykgewo+ICsJCWNhc2UgJ2cnOgo+ICsJCQlpZiAod3JpdGUgPT0gdHJ1ZSkKPiArCQkJ CWZwcmludGYoc3RkZXJyLCAiUmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydCBz aW11bHRhbmVvdXNseS5cbiIpOwo+ICsKPiArCQkJaWYgKG9wdGFyZykgewo+ICsJCQkJY2hhciAq dmFsdWUsICpzdWJvcHRzID0gb3B0YXJnOwo+ICsJCQkJaW50IHg7Cj4gKwkJCQl3aGlsZSAoKnN1 Ym9wdHMgIT0gJ1wwJykgewo+ICsJCQkJCXggPSBnZXRzdWJvcHQoJnN1Ym9wdHMsIHRva2VuLCAm dmFsdWUpOwo+ICsJCQkJCWlmICh4ID09IC0xKSB7Cj4gKwkJCQkJCWZwcmludGYoc3RkZXJyLCAi VW5yZWNvZ25pemVkIG9wdGlvbiAoJXMpXG4iLCB2YWx1ZSk7Cj4gKwkJCQkJCWJyZWFrOwo+ICsJ CQkJCX0gZWxzZQo+ICsJCQkJCQlhY3RfdXBvblt4XSA9IHRydWU7Cj4gKwkJCQl9Cj4gKwkJCX0g ZWxzZSB7Cj4gKwkJCQlpbnQgaTsKPiArCQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFj dF91cG9uKTsgaSsrKQo+ICsJCQkJCWFjdF91cG9uW2ldID0gdHJ1ZTsKPiArCQkJfQo+ICsJCQli cmVhazsKPiArCQljYXNlICdzJzoKPiArCQkJaWYgKCFvcHRhcmcpCj4gKwkJCQl1c2FnZShhcmd2 WzBdKTsKPiArCj4gKwkJCWlmICh3cml0ZSA9PSB0cnVlKSB7Cj4gKwkJCQlmcHJpbnRmKHN0ZGVy ciwgIk9ubHkgb25lIHdyaXRlIG1heSBiZSBzcGVjaWZpZWQgYXQgYSB0aW1lXG4iKTsKPiArCQkJ CWV4aXQoRVhJVF9GQUlMVVJFKTsKPiArCQkJfQo+ICsKPiArCQkJd3JpdGUgPSB0cnVlOwo+ICsJ CQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKPiArCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gKwkJ CXNzY2FuZihvcHRhcmcsICIlZCIsICZuZXdfZnJlcVtNQVhdKTsKPiArCQkJbmV3X2ZyZXFbTUlO XSA9IG5ld19mcmVxW01BWF07Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgJ2MnOgo+ICsJCQlpZiAo IW9wdGFyZykKPiArCQkJCXVzYWdlKGFyZ3ZbMF0pOwo+ICsKPiArCQkJaWYgKHdyaXRlID09IHRy dWUpIHsKPiArCQkJCWZwcmludGYoc3RkZXJyLCAiT25seSBvbmUgd3JpdGUgbWF5IGJlIHNwZWNp ZmllZCBhdCBhIHRpbWVcbiIpOwo+ICsJCQkJZXhpdChFWElUX0ZBSUxVUkUpOwo+ICsJCQl9Cj4g Kwo+ICsJCQl3cml0ZSA9IHRydWU7Cj4gKwo+ICsJCQlpZiAoIXN0cm5jbXAoIm1pbj0iLCBvcHRh cmcsIDQpKSB7Cj4gKwkJCQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKPiArCQkJCXNzY2FuZihvcHRh cmcrNCwgIiVkIiwgJm5ld19mcmVxW01JTl0pOwo+ICsJCQl9IGVsc2UgaWYgKCFzdHJuY21wKCJt YXg9Iiwgb3B0YXJnLCA0KSkgewo+ICsJCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gKwkJCQlz c2NhbmYob3B0YXJnKzQsICIlZCIsICZuZXdfZnJlcVtNQVhdKTsKPiArCQkJfSBlbHNlIHsKPiAr CQkJCWZwcmludGYoc3RkZXJyLCAiU2VsZWN0ZWQgdW5tb2RpZmlhYmxlIGZyZXF1ZW5jeVxuIik7 Cj4gKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Cj4gKwkJCX0KPiArCQkJYnJlYWs7Cj4gKwkJY2Fz ZSAnZSc6IC8qIGVmZmljaWVudCAqLwo+ICsJCQlpZiAoSVNfVkFMTEVZVklFVyhkZXZpZCkgfHwg SVNfQ0hFUlJZVklFVyhkZXZpZCkpIHsKPiArCQkJCS8qIHRoZSBMUCBwYXJ0cyBoYXZlIHNwZWNp YWwgZWZmaWNpZW50IGZyZXF1ZW5jaWVzICovCj4gKwkJCQlmcHJpbnRmKHN0ZGVyciwKPiArCQkJ CQkiRklYTUU6IFdhcm5pbmcgZWZmaWNpZW50IGZyZXF1ZW5jeSBpbmZvcm1hdGlvbiBpcyBpbmNv cnJlY3QuXG4iKTsKPiArCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKPiArCQkJfQo+ICsJCQl0bXAg PSBnZXRfZnJlcXVlbmN5KCZpbmZvW0VGRl0pOwo+ICsJCQluZXdfZnJlcVtNSU5dID0gdG1wOwo+ ICsJCQluZXdfZnJlcVtNQVhdID0gdG1wOwo+ICsJCQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKPiAr CQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gKwkJCXdyaXRlID0gdHJ1ZTsKPiArCQkJYnJlYWs7 Cj4gKwkJY2FzZSAnaSc6IC8qIG1JbiAqLwo+ICsJCQl0bXAgPSBnZXRfZnJlcXVlbmN5KCZpbmZv W1JQbl0pOwo+ICsJCQluZXdfZnJlcVtNSU5dID0gdG1wOwo+ICsJCQluZXdfZnJlcVtNQVhdID0g dG1wOwo+ICsJCQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKPiArCQkJYWN0X3Vwb25bTUFYXSA9IHRy dWU7Cj4gKwkJCXdyaXRlID0gdHJ1ZTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAnbSc6IC8qIG1h eCAqLwo+ICsJCQl0bXAgPSBnZXRfZnJlcXVlbmN5KCZpbmZvW1JQMF0pOwo+ICsJCQluZXdfZnJl cVtNSU5dID0gdG1wOwo+ICsJCQluZXdfZnJlcVtNQVhdID0gdG1wOwo+ICsJCQlhY3RfdXBvbltN SU5dID0gdHJ1ZTsKPiArCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gKwkJCXdyaXRlID0gdHJ1 ZTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAnZCc6IC8qIGRlZmF1bHRzICovCj4gKwkJCW5ld19m cmVxW01JTl0gPSBnZXRfZnJlcXVlbmN5KCZpbmZvW1JQbl0pOwo+ICsJCQluZXdfZnJlcVtNQVhd ID0gZ2V0X2ZyZXF1ZW5jeSgmaW5mb1tSUDBdKTsKPiArCQkJYWN0X3Vwb25bTUlOXSA9IHRydWU7 Cj4gKwkJCWFjdF91cG9uW01BWF0gPSB0cnVlOwo+ICsJCQl3cml0ZSA9IHRydWU7Cj4gKwkJCWJy ZWFrOwo+ICsJCWNhc2UgJ2gnOgo+ICsJCWRlZmF1bHQ6Cj4gKwkJCXVzYWdlKGFyZ3ZbMF0pOwo+ ICsJCX0KPiArCX0KPiArCj4gK2RvbmU6Cj4gKwlyZXR1cm4gd3JpdGU7Cj4gK30KPiArCj4gK2lu dCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCj4gK3sKPiArCj4gKwlib29sIHdyaXRlLCBm YWlsLCB0YXJnZXRzW01BWCsxXSA9IHtmYWxzZX07Cj4gKwlpbnQgaSwgdHJ5ID0gMSwgc2V0X2Zy ZXFbTUFYKzFdID0gezB9Owo+ICsKPiArCWRldmlkID0gaW50ZWxfZ2V0X2RybV9kZXZpZChkcm1f b3Blbl9hbnkoKSk7Cj4gKwlkZXZpY2UgPSBkcm1fZ2V0X2NhcmQoKTsKPiArCj4gKwl3cml0ZSA9 IHBhcnNlKGFyZ2MsIGFyZ3YsIHRhcmdldHMsIHNldF9mcmVxKTsKPiArCWZhaWwgPSB3cml0ZTsK PiArCj4gKwkvKiBJZiB3ZSd2ZSBwcmV2aW91c2x5IGxvY2tlZCB0aGUgZnJlcXVlbmN5LCB3ZSBu ZWVkIHRvIG1ha2Ugc3VyZSB0byBzZXQgdGhpbmdzCj4gKwkgKiBpbiB0aGUgY29ycmVjdCBvcmRl ciwgb3IgZWxzZSB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCAoaWUuIG1pbiA9IG1heCA9IDIwMCwK PiArCSAqIGFuZCB3ZSBzZXQgbWluIHRvIDMwMCwgd2UgZmFpbCBiZWNhdXNlIGl0IHdvdWxkIHRy eSB0byBzZXQgbWluID4KPiArCSAqIG1heCkuIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBiZSBn b2luZyBlaXRoZXIgZm9yd2FyZCBvciByZXZlcnNlCj4gKwkgKiB0aHJvdWdoIHRoZSBsb29wLiBN SU4gaXMgYWx3YXlzIGJlZm9yZSBNQVguCj4gKwkgKgo+ICsJICogWFhYOiBTaW5jZSBvbmx5IG1p biBhbmQgbWF4IGFyZSBhdCBwbGF5LCB0aGUgc3VwZXIgbGF6eSB3YXkgaXMgdG8gZG8gdGhpcwo+ ICsJICogMyB0aW1lcyBhbmQgaWYgd2Ugc3RpbGwgZmFpbCBhZnRlciAzLCBpdCdzIGZvciByZWFs Lgo+ICsJICovCj4gK2FnYWluOgo+ICsJaWYgKHRyeSA+IDIpIHsKPiArCQlmcHJpbnRmKHN0ZGVy ciwgIkRpZCBub3QgYWNoaWV2ZSBkZXNpcmVkIGZyZXEuXG4iKTsKPiArCQlleGl0KEVYSVRfRkFJ TFVSRSk7Cj4gKwl9Cj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXRzKTsgaSsr KSB7Cj4gKwkJaWYgKHRhcmdldHNbaV0gPT0gZmFsc2UpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiAr CQlpZiAod3JpdGUpIHsKPiArCQkJc2V0X2ZyZXF1ZW5jeSgmaW5mb1tpXSwgc2V0X2ZyZXFbaV0p Owo+ICsJCQlpZiAoZ2V0X2ZyZXF1ZW5jeSgmaW5mb1tpXSkgIT0gc2V0X2ZyZXFbaV0pCj4gKwkJ CQlmYWlsID0gdHJ1ZTsKPiArCQkJZWxzZQo+ICsJCQkJZmFpbCA9IGZhbHNlOwo+ICsJCX0gZWxz ZSB7Cj4gKwkJCXByaW50ZigiJXM6ICVkIE1IelxuIiwgaW5mb1tpXS5uYW1lLCBnZXRfZnJlcXVl bmN5KCZpbmZvW2ldKSk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWlmIChmYWlsKSB7Cj4gKwkJdHJ5 Kys7Cj4gKwkJZ290byBhZ2FpbjsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRSh0YXJnZXRzKTsgaSsrKSB7Cj4gKwkJaWYgKGluZm9baV0uZmlscCkgewo+ICsJCQlmY2xv c2UoaW5mb1tpXS5maWxwKTsKPiArCQkJZnJlZShpbmZvW2ldLnBhdGgpOwo+ICsJCX0KPiArCX0K PiArCj4gKwlyZXR1cm4gRVhJVF9TVUNDRVNTOwo+ICt9Cj4gLS0gCj4gMi4yLjEKPiAKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxp bmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK