From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH i-g-t 2/7] intel-gpu-overlay: Consolidate perf PMU access to library Date: Fri, 29 Sep 2017 13:39:34 +0100 Message-ID: <20170929123939.3312-3-tvrtko.ursulin@linux.intel.com> References: <20170929123939.3312-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5CAC36EB01 for ; Fri, 29 Sep 2017 12:39:50 +0000 (UTC) Received: by mail-wr0-x241.google.com with SMTP id n64so1211247wrb.2 for ; Fri, 29 Sep 2017 05:39:50 -0700 (PDT) In-Reply-To: <20170929123939.3312-1-tvrtko.ursulin@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KClZhcmlvdXMg dG9vbCBtb2R1bGVzIGltcGxlbWVudCB0aGVpciBvd20gUE1VIG9wZW4gd3JhcHBlciB3aGljaApj YW4gYmUgcmVwbGFjZWQgYnkgY2FsbGluZyB0aGUgbGlicmFyeSBvbmUuCgp2MjoKICogUmVtb3Zl IGV4dHJhIG5ld2xpbmUuIChDaHJpcyBXaWxzb24pCiAqIENvbW1pdCBtc2cuCgpTaWduZWQtb2Zm LWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgotLS0KIGxpYi9p Z3RfcGVyZi5jICAgICAgICAgICB8IDMyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr CiBsaWIvaWd0X3BlcmYuaCAgICAgICAgICAgfCAgMiArKwogb3ZlcmxheS9nZW0taW50ZXJydXB0 cy5jIHwgMTYgKy0tLS0tLS0tLS0tLS0tLQogb3ZlcmxheS9ncHUtZnJlcS5jICAgICAgIHwgMjIg KystLS0tLS0tLS0tLS0tLS0tLS0tLQogb3ZlcmxheS9ncHUtdG9wLmMgICAgICAgIHwgMzIgKysr KysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG92ZXJsYXkvcG93ZXIuYyAgICAgICAgICB8 IDE3ICstLS0tLS0tLS0tLS0tLS0tCiBvdmVybGF5L3JjNi5jICAgICAgICAgICAgfCAyNCArKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0KIDcgZmlsZXMgY2hhbmdlZCwgNDkgaW5zZXJ0aW9ucygrKSwg OTYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9wZXJmLmMgYi9saWIvaWd0X3Bl cmYuYwppbmRleCA0NWNjY2ZmMGFlNTMuLjk2MWE4NThhZjllMyAxMDA2NDQKLS0tIGEvbGliL2ln dF9wZXJmLmMKKysrIGIvbGliL2lndF9wZXJmLmMKQEAgLTIsNiArMiw4IEBACiAjaW5jbHVkZSA8 ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNs dWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgogCiAjaW5jbHVkZSAiaWd0X3BlcmYu aCIKIApAQCAtMjQsMyArMjYsMzMgQEAgdWludDY0X3QgaTkxNV90eXBlX2lkKHZvaWQpCiAJcmV0 dXJuIHN0cnRvdWxsKGJ1ZiwgMCwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgX3BlcmZfb3BlbihpbnQg Y29uZmlnLCBpbnQgZ3JvdXAsIGludCBmb3JtYXQpCit7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0 ciBhdHRyOworCisJbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YgKGF0dHIpKTsKKworCWF0dHIudHlw ZSA9IGk5MTVfdHlwZV9pZCgpOworCWlmIChhdHRyLnR5cGUgPT0gMCkKKwkJcmV0dXJuIC1FTk9F TlQ7CisKKwlhdHRyLmNvbmZpZyA9IGNvbmZpZzsKKworCWlmIChncm91cCA+PSAwKQorCQlmb3Jt YXQgJj0gflBFUkZfRk9STUFUX0dST1VQOworCisJYXR0ci5yZWFkX2Zvcm1hdCA9IGZvcm1hdDsK KworCXJldHVybiBwZXJmX2V2ZW50X29wZW4oJmF0dHIsIC0xLCAwLCBncm91cCwgMCk7Cit9CisK K2ludCBwZXJmX2k5MTVfb3BlbihpbnQgY29uZmlnKQoreworCXJldHVybiBfcGVyZl9vcGVuKGNv bmZpZywgLTEsIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCk7Cit9CisKK2ludCBwZXJm X2k5MTVfb3Blbl9ncm91cChpbnQgY29uZmlnLCBpbnQgZ3JvdXApCit7CisJcmV0dXJuIF9wZXJm X29wZW4oY29uZmlnLCBncm91cCwKKwkJCSAgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVE IHwgUEVSRl9GT1JNQVRfR1JPVVApOworfQpkaWZmIC0tZ2l0IGEvbGliL2lndF9wZXJmLmggYi9s aWIvaWd0X3BlcmYuaAppbmRleCBhODBiMzExY2QxZDEuLjhlNjc0YzNhMzc1NSAxMDA2NDQKLS0t IGEvbGliL2lndF9wZXJmLmgKKysrIGIvbGliL2lndF9wZXJmLmgKQEAgLTYyLDUgKzYyLDcgQEAg cGVyZl9ldmVudF9vcGVuKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCiB9CiAKIHVpbnQ2 NF90IGk5MTVfdHlwZV9pZCh2b2lkKTsKK2ludCBwZXJmX2k5MTVfb3BlbihpbnQgY29uZmlnKTsK K2ludCBwZXJmX2k5MTVfb3Blbl9ncm91cChpbnQgY29uZmlnLCBpbnQgZ3JvdXApOwogCiAjZW5k aWYgLyogSTkxNV9QRVJGX0ggKi8KZGlmZiAtLWdpdCBhL292ZXJsYXkvZ2VtLWludGVycnVwdHMu YyBiL292ZXJsYXkvZ2VtLWludGVycnVwdHMuYwppbmRleCA3YmE1NGZjZDQ4N2QuLmE4NGFlZjAz OThhNyAxMDA2NDQKLS0tIGEvb3ZlcmxheS9nZW0taW50ZXJydXB0cy5jCisrKyBiL292ZXJsYXkv Z2VtLWludGVycnVwdHMuYwpAQCAtMzYsMjAgKzM2LDYgQEAKICNpbmNsdWRlICJnZW0taW50ZXJy dXB0cy5oIgogI2luY2x1ZGUgImRlYnVnZnMuaCIKIAotc3RhdGljIGludCBwZXJmX29wZW4odm9p ZCkKLXsKLQlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7Ci0KLQltZW1zZXQoJmF0dHIsIDAs IHNpemVvZiAoYXR0cikpOwotCi0JYXR0ci50eXBlID0gaTkxNV90eXBlX2lkKCk7Ci0JaWYgKGF0 dHIudHlwZSA9PSAwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlhdHRyLmNvbmZpZyA9IEk5MTVfUEVS Rl9JTlRFUlJVUFRTOwotCi0JcmV0dXJuIHBlcmZfZXZlbnRfb3BlbigmYXR0ciwgLTEsIDAsIC0x LCAwKTsKLX0KLQogc3RhdGljIGxvbmcgbG9uZyBkZWJ1Z2ZzX3JlYWQodm9pZCkKIHsKIAljaGFy IGJ1Zls4MTkyXSwgKmI7CkBAIC0xMjcsNyArMTEzLDcgQEAgaW50IGdlbV9pbnRlcnJ1cHRzX2lu aXQoc3RydWN0IGdlbV9pbnRlcnJ1cHRzICppcnFzKQogewogCW1lbXNldChpcnFzLCAwLCBzaXpl b2YoKmlycXMpKTsKIAotCWlycXMtPmZkID0gcGVyZl9vcGVuKCk7CisJaXJxcy0+ZmQgPSBwZXJm X2k5MTVfb3BlbihJOTE1X1BFUkZfSU5URVJSVVBUUyk7CiAJaWYgKGlycXMtPmZkIDwgMCAmJiBp bnRlcnJ1cHRzX3JlYWQoKSA8IDApCiAJCWlycXMtPmVycm9yID0gRU5PREVWOwogCmRpZmYgLS1n aXQgYS9vdmVybGF5L2dwdS1mcmVxLmMgYi9vdmVybGF5L2dwdS1mcmVxLmMKaW5kZXggN2YyOWIx YWE5ODZlLi43NmM1ZWQ5YWNmZDEgMTAwNjQ0Ci0tLSBhL292ZXJsYXkvZ3B1LWZyZXEuYworKysg Yi9vdmVybGF5L2dwdS1mcmVxLmMKQEAgLTMzLDMwICszMywxMiBAQAogI2luY2x1ZGUgImdwdS1m cmVxLmgiCiAjaW5jbHVkZSAiZGVidWdmcy5oIgogCi1zdGF0aWMgaW50IHBlcmZfaTkxNV9vcGVu KGludCBjb25maWcsIGludCBncm91cCkKLXsKLQlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHI7 Ci0KLQltZW1zZXQoJmF0dHIsIDAsIHNpemVvZiAoYXR0cikpOwotCi0JYXR0ci50eXBlID0gaTkx NV90eXBlX2lkKCk7Ci0JaWYgKGF0dHIudHlwZSA9PSAwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlh dHRyLmNvbmZpZyA9IGNvbmZpZzsKLQotCWF0dHIucmVhZF9mb3JtYXQgPSBQRVJGX0ZPUk1BVF9U T1RBTF9USU1FX0VOQUJMRUQ7Ci0JaWYgKGdyb3VwID09IC0xKQotCQlhdHRyLnJlYWRfZm9ybWF0 IHw9IFBFUkZfRk9STUFUX0dST1VQOwotCi0JcmV0dXJuIHBlcmZfZXZlbnRfb3BlbigmYXR0ciwg LTEsIDAsIGdyb3VwLCAwKTsKLX0KLQogc3RhdGljIGludCBwZXJmX29wZW4odm9pZCkKIHsKIAlp bnQgZmQ7CiAKLQlmZCA9IHBlcmZfaTkxNV9vcGVuKEk5MTVfUEVSRl9BQ1RVQUxfRlJFUVVFTkNZ LCAtMSk7Ci0JaWYgKHBlcmZfaTkxNV9vcGVuKEk5MTVfUEVSRl9SRVFVRVNURURfRlJFUVVFTkNZ LCBmZCkgPCAwKSB7CisJZmQgPSBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BFUkZfQUNUVUFM X0ZSRVFVRU5DWSwgLTEpOworCWlmIChwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BFUkZfUkVR VUVTVEVEX0ZSRVFVRU5DWSwgZmQpIDwgMCkgewogCQljbG9zZShmZCk7CiAJCWZkID0gLTE7CiAJ fQpkaWZmIC0tZ2l0IGEvb3ZlcmxheS9ncHUtdG9wLmMgYi9vdmVybGF5L2dwdS10b3AuYwppbmRl eCAwNmY0ODlkZmRjODMuLjgxMmY0N2Q1YWNlZCAxMDA2NDQKLS0tIGEvb3ZlcmxheS9ncHUtdG9w LmMKKysrIGIvb3ZlcmxheS9ncHUtdG9wLmMKQEAgLTQ4LDI0ICs0OCw2IEBACiAjZGVmaW5lIEk5 MTVfUEVSRl9SSU5HX1dBSVQobikgKF9fSTkxNV9QRVJGX1JJTkcobikgKyAxKQogI2RlZmluZSBJ OTE1X1BFUkZfUklOR19TRU1BKG4pIChfX0k5MTVfUEVSRl9SSU5HKG4pICsgMikKIAotc3RhdGlj IGludCBwZXJmX2k5MTVfb3BlbihpbnQgY29uZmlnLCBpbnQgZ3JvdXApCi17Ci0Jc3RydWN0IHBl cmZfZXZlbnRfYXR0ciBhdHRyOwotCi0JbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YgKGF0dHIpKTsK LQotCWF0dHIudHlwZSA9IGk5MTVfdHlwZV9pZCgpOwotCWlmIChhdHRyLnR5cGUgPT0gMCkKLQkJ cmV0dXJuIC1FTk9FTlQ7Ci0JYXR0ci5jb25maWcgPSBjb25maWc7Ci0KLQlhdHRyLnJlYWRfZm9y bWF0ID0gUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEOwotCWlmIChncm91cCA9PSAtMSkK LQkJYXR0ci5yZWFkX2Zvcm1hdCB8PSBQRVJGX0ZPUk1BVF9HUk9VUDsKLQotCXJldHVybiBwZXJm X2V2ZW50X29wZW4oJmF0dHIsIC0xLCAwLCBncm91cCwgMCk7Ci19Ci0KIHN0YXRpYyBpbnQgcGVy Zl9pbml0KHN0cnVjdCBncHVfdG9wICpndCkKIHsKIAljb25zdCBjaGFyICpuYW1lc1tdID0gewpA QCAtNzcsMjcgKzU5LDI5IEBAIHN0YXRpYyBpbnQgcGVyZl9pbml0KHN0cnVjdCBncHVfdG9wICpn dCkKIAl9OwogCWludCBuOwogCi0JZ3QtPmZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QRVJGX1JJ TkdfQlVTWSgwKSwgLTEpOworCWd0LT5mZCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5MTVfUEVS Rl9SSU5HX0JVU1koMCksIC0xKTsKIAlpZiAoZ3QtPmZkIDwgMCkKIAkJcmV0dXJuIC0xOwogCi0J aWYgKHBlcmZfaTkxNV9vcGVuKEk5MTVfUEVSRl9SSU5HX1dBSVQoMCksIGd0LT5mZCkgPj0gMCkK KwlpZiAocGVyZl9pOTE1X29wZW5fZ3JvdXAoSTkxNV9QRVJGX1JJTkdfV0FJVCgwKSwgZ3QtPmZk KSA+PSAwKQogCQlndC0+aGF2ZV93YWl0ID0gMTsKIAotCWlmIChwZXJmX2k5MTVfb3BlbihJOTE1 X1BFUkZfUklOR19TRU1BKDApLCBndC0+ZmQpID49IDApCisJaWYgKHBlcmZfaTkxNV9vcGVuX2dy b3VwKEk5MTVfUEVSRl9SSU5HX1NFTUEoMCksIGd0LT5mZCkgPj0gMCkKIAkJZ3QtPmhhdmVfc2Vt YSA9IDE7CiAKIAlndC0+cmluZ1swXS5uYW1lID0gbmFtZXNbMF07CiAJZ3QtPm51bV9yaW5ncyA9 IDE7CiAKIAlmb3IgKG4gPSAxOyBuYW1lc1tuXTsgbisrKSB7Ci0JCWlmIChwZXJmX2k5MTVfb3Bl bihJOTE1X1BFUkZfUklOR19CVVNZKG4pLCBndC0+ZmQpID49IDApIHsKKwkJaWYgKHBlcmZfaTkx NV9vcGVuX2dyb3VwKEk5MTVfUEVSRl9SSU5HX0JVU1kobiksIGd0LT5mZCkgPj0gMCkgewogCQkJ aWYgKGd0LT5oYXZlX3dhaXQgJiYKLQkJCSAgICBwZXJmX2k5MTVfb3BlbihJOTE1X1BFUkZfUklO R19XQUlUKG4pLCBndC0+ZmQpIDwgMCkKKwkJCSAgICBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1 X1BFUkZfUklOR19XQUlUKG4pLAorCQkJCQkJIGd0LT5mZCkgPCAwKQogCQkJCXJldHVybiAtMTsK IAogCQkJaWYgKGd0LT5oYXZlX3NlbWEgJiYKLQkJCSAgICBwZXJmX2k5MTVfb3BlbihJOTE1X1BF UkZfUklOR19TRU1BKG4pLCBndC0+ZmQpIDwgMCkKKwkJCSAgICBwZXJmX2k5MTVfb3Blbl9ncm91 cChJOTE1X1BFUkZfUklOR19TRU1BKG4pLAorCQkJCQkJIGd0LT5mZCkgPCAwKQogCQkJCXJldHVy biAtMTsKIAogCQkJZ3QtPnJpbmdbZ3QtPm51bV9yaW5ncysrXS5uYW1lID0gbmFtZXNbbl07CmRp ZmYgLS1naXQgYS9vdmVybGF5L3Bvd2VyLmMgYi9vdmVybGF5L3Bvd2VyLmMKaW5kZXggODRkODYw Y2FlNDBjLi5kZDRhZWM2YmZmZDkgMTAwNjQ0Ci0tLSBhL292ZXJsYXkvcG93ZXIuYworKysgYi9v dmVybGF5L3Bvd2VyLmMKQEAgLTM4LDIxICszOCw2IEBACiAKIC8qIFhYWCBJcyB0aGlzIGV4cG9z ZWQgdGhyb3VnaCBSQVBMPyAqLwogCi1zdGF0aWMgaW50IHBlcmZfb3Blbih2b2lkKQotewotCXN0 cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKLQotCW1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mIChh dHRyKSk7Ci0KLQlhdHRyLnR5cGUgPSBpOTE1X3R5cGVfaWQoKTsKLQlpZiAoYXR0ci50eXBlID09 IDApCi0JCXJldHVybiAtMTsKLQlhdHRyLmNvbmZpZyA9IEk5MTVfUEVSRl9FTkVSR1k7Ci0KLQlh dHRyLnJlYWRfZm9ybWF0ID0gUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEOwotCXJldHVy biBwZXJmX2V2ZW50X29wZW4oJmF0dHIsIC0xLCAwLCAtMSwgMCk7Ci19Ci0KIGludCBwb3dlcl9p bml0KHN0cnVjdCBwb3dlciAqcG93ZXIpCiB7CiAJY2hhciBidWZbNDA5Nl07CkBAIC02MCw3ICs0 NSw3IEBAIGludCBwb3dlcl9pbml0KHN0cnVjdCBwb3dlciAqcG93ZXIpCiAKIAltZW1zZXQocG93 ZXIsIDAsIHNpemVvZigqcG93ZXIpKTsKIAotCXBvd2VyLT5mZCA9IHBlcmZfb3BlbigpOworCXBv d2VyLT5mZCA9IHBlcmZfaTkxNV9vcGVuKEk5MTVfUEVSRl9FTkVSR1kpOwogCWlmIChwb3dlci0+ ZmQgIT0gLTEpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9vdmVybGF5L3JjNi5jIGIvb3Zl cmxheS9yYzYuYwppbmRleCAzMTc1YmIyMjMwOGYuLjQ2Yzk3NWE1NTdmZiAxMDA2NDQKLS0tIGEv b3ZlcmxheS9yYzYuYworKysgYi9vdmVybGF5L3JjNi5jCkBAIC0zNSwyNCArMzUsNiBAQAogCiAj aW5jbHVkZSAicmM2LmgiCiAKLXN0YXRpYyBpbnQgcGVyZl9pOTE1X29wZW4oaW50IGNvbmZpZywg aW50IGdyb3VwKQotewotCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKLQotCW1lbXNldCgm YXR0ciwgMCwgc2l6ZW9mIChhdHRyKSk7Ci0KLQlhdHRyLnR5cGUgPSBpOTE1X3R5cGVfaWQoKTsK LQlpZiAoYXR0ci50eXBlID09IDApCi0JCXJldHVybiAtRU5PRU5UOwotCWF0dHIuY29uZmlnID0g Y29uZmlnOwotCi0JYXR0ci5yZWFkX2Zvcm1hdCA9IFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5B QkxFRDsKLQlpZiAoZ3JvdXAgPT0gLTEpCi0JCWF0dHIucmVhZF9mb3JtYXQgfD0gUEVSRl9GT1JN QVRfR1JPVVA7Ci0KLQlyZXR1cm4gcGVyZl9ldmVudF9vcGVuKCZhdHRyLCAtMSwgMCwgZ3JvdXAs IDApOwotfQotCiAjZGVmaW5lIFJDNgkoMTw8MCkKICNkZWZpbmUgUkM2cAkoMTw8MSkKICNkZWZp bmUgUkM2cHAJKDE8PDIpCkBAIC02MSwxNSArNDMsMTUgQEAgc3RhdGljIGludCBwZXJmX29wZW4o dW5zaWduZWQgKmZsYWdzKQogewogCWludCBmZDsKIAotCWZkID0gcGVyZl9pOTE1X29wZW4oSTkx NV9QRVJGX1JDNl9SRVNJREVOQ1ksIC0xKTsKKwlmZCA9IHBlcmZfaTkxNV9vcGVuX2dyb3VwKEk5 MTVfUEVSRl9SQzZfUkVTSURFTkNZLCAtMSk7CiAJaWYgKGZkIDwgMCkKIAkJcmV0dXJuIC0xOwog CiAJKmZsYWdzIHw9IFJDNjsKLQlpZiAocGVyZl9pOTE1X29wZW4oSTkxNV9QRVJGX1JDNnBfUkVT SURFTkNZLCBmZCkgPj0gMCkKKwlpZiAocGVyZl9pOTE1X29wZW5fZ3JvdXAoSTkxNV9QRVJGX1JD NnBfUkVTSURFTkNZLCBmZCkgPj0gMCkKIAkJKmZsYWdzIHw9IFJDNnA7CiAKLQlpZiAocGVyZl9p OTE1X29wZW4oSTkxNV9QRVJGX1JDNnBwX1JFU0lERU5DWSwgZmQpID49IDApCisJaWYgKHBlcmZf aTkxNV9vcGVuX2dyb3VwKEk5MTVfUEVSRl9SQzZwcF9SRVNJREVOQ1ksIGZkKSA+PSAwKQogCQkq ZmxhZ3MgfD0gUkM2cHA7CiAKIAlyZXR1cm4gZmQ7Ci0tIAoyLjkuNQoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJ bnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==