From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 306876E065 for ; Sat, 1 Sep 2018 04:18:08 +0000 (UTC) From: Rodrigo Vivi Date: Fri, 31 Aug 2018 21:18:01 -0700 Message-Id: <20180901041806.2627-1-rodrigo.vivi@intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t 1/6] tools: Add a simple tool to read/write/decode dpcd registers List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Rodrigo Vivi List-ID: RnJvbTogVGFydW4gVnlhcyA8dGFydW4udnlhc0BpbnRlbC5jb20+CgpUaGlzIHRvb2wgc2VydmVz IGFzIGEgd3JhcHBlciBhcm91bmQgdGhlIGNvbnN0cnVjdHMgcHJvdmlkZWQgYnkgdGhlCmRybV9k cGNkX2F1eF9kZXYga2VybmVsIG1vZHVsZSBieSB3b3JraW5nIG9uIHRoZSAvZGV2L2RybV9kcF9h dXhbbl0KZGV2aWNlcyBjcmVhdGVkIGJ5IHRoZSBrZXJuZWwgbW9kdWxlLgpJdCBzdXBwb3J0cyBy ZWFkaW5nIGFuZCB3cml0aW5nIGRwY2QgcmVnaXN0ZXJzIG9uIHRoZSBjb25uZWN0ZWQgYXV4CmNo YW5uZWxzLgpJbiB0aGUgZm9sbG93LXVwIHBhdGNoLCBzdXBwb3J0IGZvciBkZWNvZGluZyB0aGVz ZSByZWdpc3RlcnMgd2lsbCBiZQphZGRlZCB0byBmYWNpbGF0ZSBkZWJ1Z2dpbmcgcGFuZWwgcmVs YXRlZCBpc3N1ZXMuCgp2MjogKEZpeGVzIGJ5IFJvZHJpZ28gYnV0IG5vIGZ1bmN0aW9uYWwgY2hh bmdlcyB5ZXQpOgogICAgLSBJbmRlbnRhdGlvbnMsIFR5cG8sIE1pc3NlZCBzcGFjZXMKICAgIC0g UmVtb3ZpbmcgbWVudGlvbmluZyB0byBkZWNvZGUgYW5kIHNwZWMgdGhhdCBpcyBub3QgaW1wbGVt ZW50ZWQgeWV0LgogICAgLSBBZGQgTWFrZWZpbGUuc291cmNlcyBiYWNrCiAgICAtIE1pc3NlZCBz L3ByaW50Zi9pZ3Rfd2FybgoKU3VnZ2VzdGVkLWJ5OiBEaGluYWthcmFuIFBhbmRpeWFuIDxkaGlu YWthcmFuLnBhbmRpeWFuQGludGVsLmNvbT4KU2lnbmVkLW9mZi1ieTogVGFydW4gVnlhcyA8dGFy dW4udnlhc0BpbnRlbC5jb20+ClNpZ25lZC1vZmYtYnk6IFJvZHJpZ28gVml2aSA8cm9kcmlnby52 aXZpQGludGVsLmNvbT4KLS0tCiB0b29scy9NYWtlZmlsZS5zb3VyY2VzIHwgICAxICsKIHRvb2xz L2RwY2RfcmVnLmMgICAgICAgfCAyMDkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIHRvb2xzL21lc29uLmJ1aWxkICAgICAgfCAgIDEgKwogMyBmaWxlcyBjaGFuZ2Vk LCAyMTEgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL2RwY2RfcmVnLmMK CmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZpbGUuc291 cmNlcwppbmRleCBhYmQyM2EwZi4uNTA3MDZmNDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxl LnNvdXJjZXMKKysrIGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwpAQCAtNyw2ICs3LDcgQEAgbm9p bnN0X1BST0dSQU1TID0JCVwKIAogdG9vbHNfcHJvZ19saXN0cyA9CQlcCiAJaWd0X3N0YXRzCQlc CisJZHBjZF9yZWcJCVwKIAlpbnRlbF9hdWRpb19kdW1wCVwKIAlpbnRlbF9yZWcJCVwKIAlpbnRl bF9iYWNrbGlnaHQJCVwKZGlmZiAtLWdpdCBhL3Rvb2xzL2RwY2RfcmVnLmMgYi90b29scy9kcGNk X3JlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4zOWRkZTJjOQotLS0g L2Rldi9udWxsCisrKyBiL3Rvb2xzL2RwY2RfcmVnLmMKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisg KiBDb3B5cmlnaHQgwqkgMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24g aXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmlu ZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlv biBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0 aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJp Z2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1 YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8g cGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBk byBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGlu ZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVz IG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhF IFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJ TkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisg KiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJ TSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBP RiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBP UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVB TElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiBEUENEIHJlZ2lzdGVyIHJlYWQvd3Jp dGUgdG9vbAorICogVGhpcyB0b29sIHdyYXBzIGFyb3VuZCBEUk1fRFBfQVVYX0RFViBtb2R1bGUg dG8gcHJvdmlkZSBEUENEIHJlZ2lzdGVyIHJlYWQKKyAqIGFuZCB3cml0ZSwgc28gQ09ORklHX0RS TV9EUF9BVVhfREVWIG5lZWRzIHRvIGJlIHNldC4KKyAqLworCisjaW5jbHVkZSAiaWd0X2NvcmUu aCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNkZWZpbmUgSU5W QUxJRAkweGZmCisKK2NvbnN0IGNoYXIgYXV4X2RldltdID0gIi9kZXYvZHJtX2RwX2F1eCI7CisK K3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKGNoYXIgKnRvb2wsIGludCBoZWxwKQoreworCWlndF9p bmZvKCJEUENEIHJlZ2lzdGVyIHJlYWQgYW5kIHdyaXRlIHRvb2xcblxuIik7CisJaWd0X2luZm8o IlRoaXMgdG9vbCByZXF1aXJlcyBDT05GSUdfRFJNX0RQX0FVWF9DSEFSREVWXG4iCisJCSAidG8g YmUgc2V0IGluIHRoZSBrZXJuZWwgY29uZmlnLlxuXG4iKTsKKwlpZ3RfaW5mbygiVXNhZ2U6ICVz IFtPUFRJT04gLi4uXSBDT01NQU5EXG5cbiIsIHRvb2wpOworCWlndF9pbmZvKCJDT01NQU5EIGlz IG9uZSBvZjpcbiIpOworCWlndF9pbmZvKCIgIHJlYWQ6CVJlYWQgW2NvdW50XSBieXRlcyBkcGNk IHJlZyBhdCBhbiBvZmZzZXRcbiIpOworCWlndF9pbmZvKCIgIHdyaXRlOglXcml0ZSBhIGRwY2Qg cmVnIGF0IGFuIG9mZnNldFxuXG4iKTsKKwlpZ3RfaW5mbygiT3B0aW9ucyBmb3IgdGhlIGFib3Zl IENPTU1BTkRTIGFyZVxuIik7CisJaWd0X2luZm8oIiAtLWRldmljZT1ERVZJRCAJQXV4IGRldmlj ZSBpZCwgYXMgbGlzdGVkIGluIC9kZXYvZHJtX2RwX2F1eF9kZXZbbl1cbiIpOworCWlndF9pbmZv KCIgLS1vZmZzZXQ9UkVHX0FERFIJRFBDRCByZWdpc3RlciBvZmZzZXQgaW4gaGV4XG4iKTsKKwlp Z3RfaW5mbygiIC0tY291bnQ9QllURVMJRm9yIHJlYWRzLCBzcGVjaWZ5IG51bWJlciBvZiBieXRl cyB0byBiZSByZWFkIGZyb20gdGhlIG9mZnNldFxuIik7CisJaWd0X2luZm8oIiAtLXZhbD1CWVRF CQlGb3Igd3JpdGVzLCBzcGVjaWZ5IGEgQllURSBzaXplZCB2YWx1ZSB0byBiZSB3cml0dGVuaVxu XG4iKTsKKworCWlndF9pbmZvKCIgLS1oZWxwOiBwcmludCB0aGUgdXNhZ2VcbiIpOworCisJZXhp dCgoaGVscCA9PSAxKT8gRVhJVF9TVUNDRVNTIDogRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGlj IGludCBkcGNkX3JlYWQoY2hhciAqZGV2aWNlLCBjb25zdCB1aW50MzJfdCBvZmZzZXQsIHNpemVf dCBjb3VudCkKK3sKKwlpbnQgZmQsIHJldCwgaTsKKwl2b2lkICpidWYgPSBtYWxsb2Moc2l6ZW9m KHVpbnQ4X3QpICogY291bnQpOworCisJaWYgKE5VTEwgIT0gYnVmKQorCQltZW1zZXQoYnVmLCAw LCBzaXplb2YodWludDhfdCkgKiBjb3VudCk7CisJZWxzZSB7CisJCWlndF93YXJuKCJDYW4ndCBh bGxvY2F0ZSByZWFkIGJ1ZmZlclxuIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJ ZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFkpOworCWlmIChmZCA+IDApIHsKKwkJcmV0ID0gcHJl YWQoZmQsIGJ1ZiwgY291bnQsIG9mZnNldCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKHJldCAhPSBj b3VudCkgeworCQkJaWd0X3dhcm4oIkZhaWxlZCB0byByZWFkIGZyb20gJXMgYXV4IGRldmljZSAt IGVycm9yICVzXG4iLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXQgPSBFWElUX0ZB SUxVUkU7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlndF9pbmZvKCJSZWFkICV6dSBieXRlKHMp IHN0YXJ0aW5nIGF0IG9mZnNldCAleFxuXG4iLCBjb3VudCwgb2Zmc2V0KTsKKwkJZm9yIChpID0g MDsgaSA8IGNvdW50OyBpKyspCisJCQlpZ3RfaW5mbygiJXhcbiIsICooKCh1aW50OF90ICopKGJ1 ZikpICsgaSkpOworCX0KKwllbHNlIHsKKwkJaWd0X3dhcm4oIkZhaWxlZCB0byBvcGVuICVzIGF1 eCBkZXZpY2UgLSBlcnJvcjogJXNcbiIsIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0 ID0gRVhJVF9GQUlMVVJFOworCX0KK291dDoKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30K Kworc3RhdGljIGludCBkcGNkX3dyaXRlKGNoYXIgKmRldmljZSwgY29uc3QgdWludDMyX3Qgb2Zm c2V0LCBjb25zdCB1aW50OF90ICp2YWwpCit7CisJaW50IGZkLCByZXQ7CisKKwlmZCA9IG9wZW4o ZGV2aWNlLCBPX1JEV1IpOworCWlmIChmZCA+IDApIHsKKwkJcmV0ID0gcHdyaXRlKGZkLCAoY29u c3Qgdm9pZCAqKXZhbCwgc2l6ZW9mKHVpbnQ4X3QpLCBvZmZzZXQpOworCQljbG9zZShmZCk7CisJ CWlmIChyZXQgPCAwKSB7CisJCQlpZ3Rfd2FybigiRmFpbGVkIHRvIHdyaXRlIHRvICVzIGF1eCBk ZXZpY2UgLSBlcnJvciAlc1xuIiwgZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0g RVhJVF9GQUlMVVJFOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gZHBjZF9yZWFkKGRldmlj ZSwgb2Zmc2V0LCBzaXplb2YodWludDhfdCkpOworCX0KKwllbHNlIHsKKwkJaWd0X3dhcm4oIkZh aWxlZCB0byBvcGVuICVzIGF1eCBkZXZpY2UgLSBlcnJvcjogJXNcbiIsIGRldmljZSwgc3RyZXJy b3IoZXJybm8pKTsKKwkJcmV0ID0gRVhJVF9GQUlMVVJFOworCX0KK291dDoKKwlyZXR1cm4gcmV0 OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciBkZXZfbmFt ZVsyMF07CisJaW50IHJldCwgZGV2aWQsIGhlbHBfZmxnOworCXVpbnQzMl90IG9mZnNldDsKKwl1 aW50OF90IHZhbDsKKwlzaXplX3QgY291bnQ7CisKKwllbnVtIGNvbW1hbmQgeworCQlJTlYgPSAt MSwKKwkJUkVBRCA9IDIsCisJCVdSSVRFLAorCX0gY21kID0gSU5WOworCisJc3RydWN0IG9wdGlv biBsb25nb3B0cyBbXSA9IHsKKwkJeyAiY291bnQiLCAgICAgIHJlcXVpcmVkX2FyZ3VtZW50LCAg ICAgIE5VTEwsICAgICAgJ2MnIH0sCisJCXsgImRldmljZSIsCXJlcXVpcmVkX2FyZ3VtZW50LAlO VUxMLCAgICAgICdkJyB9LAorCQl7ICJoZWxwIiwgCW5vX2FyZ3VtZW50LCAJCSZoZWxwX2ZsZywg IDIgIH0sCisJCXsgIm9mZnNldCIsCXJlcXVpcmVkX2FyZ3VtZW50LAlOVUxMLAkgICAnbycgfSwK KwkJeyAidmFsIiwJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsCSAgICd2JyB9LAorCQl7IDAgfQor CX07CisKKwlvZmZzZXQgPSB2YWwgPSBjb3VudCA9IElOVkFMSUQ7CisJZGV2aWQgPSAtMTsKKwor CXdoaWxlICgocmV0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIi06YzpkOm86czo6djoiLCBs b25nb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgJ2MnOgor CQkJY291bnQgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTApOworCQkJYnJlYWs7CisJCWNhc2Ug J2QnOgorCQkJZGV2aWQgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTApOworCQkJYnJlYWs7CisJ CWNhc2UgJ28nOgorCQkJb2Zmc2V0ID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCWJy ZWFrOworCQljYXNlICd2JzoKKwkJCXZhbCA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAxNik7CisJ CQlicmVhazsKKwkJLyogRmFsbCB0aHJvdWdoIGZvciAtLWhlbHAgKi8KKwkJY2FzZSAwOgorCQkJ YnJlYWs7CisJCS8qIENvbW1hbmQgcGFyc2luZyAqLworCQljYXNlIDE6CisJCQlpZiAoc3RyY21w KG9wdGFyZywgInJlYWQiKSA9PSAwKQorCQkJCWNtZCA9IFJFQUQ7CisJCQllbHNlIGlmIChzdHJj bXAob3B0YXJnLCAid3JpdGUiKSA9PSAwKQorCQkJCWNtZCA9IFdSSVRFOworCQkJYnJlYWs7CisJ CWNhc2UgJzonOgorCQkJaWd0X3dhcm4oIlRoZSAtJWMgb3B0aW9uIG9mICVzIHJlcXVpcmVzIGFu IGFyZ3VtZW50XG4iLAorCQkJCSBvcHRvcHQsIGFyZ3ZbMF0pOworCQkJcHJpbnRfdXNhZ2UoYXJn dlswXSwgMCk7CisJCWNhc2UgJz8nOgorCQlkZWZhdWx0IDoKKwkJCWlndF93YXJuKCIlcyAtIG9w dGlvbiAlYyBpcyBpbnZhbGlkXG4iLCBhcmd2WzBdLAorCQkJCSBvcHRvcHQpOworCQkJcHJpbnRf dXNhZ2UoYXJndlswXSwgMCk7CisJCX0KKwl9CisKKwlpZiAoaGVscF9mbGcgPT0gMikKKwkJcHJp bnRfdXNhZ2UoYXJndlswXSwgMSk7CisKKwlpZiAoZGV2aWQgPT0gLTEgfHwgb2Zmc2V0ID09IElO VkFMSUQpIHsKKwkJaWd0X3dhcm4oIkF1eCBkZXZpY2UgaWQgYW5kL29yIG9mZnNldCBtaXNzaW5n XG4iKTsKKwkJcHJpbnRfdXNhZ2UoYXJndlswXSwgMCk7CisJfQorCisJbWVtc2V0KGRldl9uYW1l LCAnXDAnLCAyMCk7CisJc25wcmludGYoZGV2X25hbWUsIHNpemVvZihhdXhfZGV2KSArIDIsICIl cyVkIiwgYXV4X2RldiwgZGV2aWQpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJFQUQ6CisJ CWlmIChjb3VudCA9PSBJTlZBTElEKSB7CisJCQlpZ3Rfd2FybigiUGxlYXNlIHNwZWNpZnkgdGhl IGNvdW50IGluIGJ5dGVzXG4iKTsKKwkJCXByaW50X3VzYWdlKGFyZ3ZbMF0sIDApOworCQl9CisJ CXJldCA9IGRwY2RfcmVhZChkZXZfbmFtZSwgb2Zmc2V0LCBjb3VudCk7CisJCWJyZWFrOworCWNh c2UgV1JJVEU6CisJCWlmICh2YWwgPT0gSU5WQUxJRCkgeworCQkJaWd0X3dhcm4oIldyaXRlIHZh bHVlIGlzIG1pc3NpbmdcbiIpOworCQkJcHJpbnRfdXNhZ2UoYXJndlswXSwgMCk7CisJCX0KKwkJ cmV0ID0gZHBjZF93cml0ZShkZXZfbmFtZSwgb2Zmc2V0LCAmdmFsKTsKKwkJYnJlYWs7CisJY2Fz ZSBJTlY6CisJZGVmYXVsdDoKKwkJaWd0X3dhcm4oIlBsZWFzZSBzcGVjaWZ5IGEgY29tbWFuZDog cmVhZC93cml0ZS4gU2VlIHVzYWdlXG4iKTsKKwkJcHJpbnRfdXNhZ2UoYXJndlswXSwgMCk7CisJ fQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL21lc29uLmJ1aWxkIGIvdG9v bHMvbWVzb24uYnVpbGQKaW5kZXggZTQ1MTdkNjYuLjc5ZjM2YWE5IDEwMDY0NAotLS0gYS90b29s cy9tZXNvbi5idWlsZAorKysgYi90b29scy9tZXNvbi5idWlsZApAQCAtMzYsNiArMzYsNyBAQCB0 b29sc19wcm9ncyA9IFsKIAknaW50ZWxfd2F0ZXJtYXJrJywKIAknaW50ZWxfZ2VtX2luZm8nLAog CSdpbnRlbF9ndnRnX3Rlc3QnLAorCSdkcGNkX3JlZycsCiBdCiB0b29sX2RlcHMgPSBpZ3RfZGVw cwogCi0tIAoyLjE3LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRldgo=