From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH 05/10] drm/i915: Engine busy time tracking Date: Fri, 29 Sep 2017 13:34:55 +0100 Message-ID: <20170929123500.3186-6-tvrtko.ursulin@linux.intel.com> References: <20170929123500.3186-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-x243.google.com (mail-wr0-x243.google.com [IPv6:2a00:1450:400c:c0c::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 79B8A6EB78 for ; Fri, 29 Sep 2017 12:35:13 +0000 (UTC) Received: by mail-wr0-x243.google.com with SMTP id k10so1199230wrk.3 for ; Fri, 29 Sep 2017 05:35:13 -0700 (PDT) In-Reply-To: <20170929123500.3186-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 RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KClRyYWNrIHRv dGFsIHRpbWUgcmVxdWVzdHMgaGF2ZSBiZWVuIGV4ZWN1dGluZyBvbiB0aGUgaGFyZHdhcmUuCgpX ZSBhZGQgbmV3IGtlcm5lbCBBUEkgdG8gYWxsb3cgc29mdHdhcmUgdHJhY2tpbmcgb2YgdGltZSBH UFUKZW5naW5lcyBhcmUgc3BlbmRpbmcgZXhlY3V0aW5nIHJlcXVlc3RzLgoKQm90aCBwZXItZW5n aW5lIGFuZCBnbG9iYWwgQVBJIGlzIGFkZGVkIHdpdGggdGhlIGxhdHRlciBhbHNvCmJlaW5nIGV4 cG9ydGVkIGZvciB1c2UgYnkgZXh0ZXJuYWwgdXNlcnMuCgp2MjoKICogU3F1YXNoZWQgd2l0aCB0 aGUgaW50ZXJuYWwgQVBJLgogKiBEcm9wcGVkIHN0YXRpYyBrZXkuCiAqIE1hZGUgcGVyLWVuZ2lu ZS4KICogU3RvcmUgdGltZSBpbiBtb25vdG9uaWMga3RpbWUuCgp2MzogTW92ZWQgc3RhdHMgY2xl YXJpbmcgdG8gZGlzYWJsZS4KCnY0OgogKiBDb21tZW50cy4KICogRG9uJ3QgZXhwb3J0IHRoZSBB UEkganVzdCB5ZXQuCgp2NTogV2hpdGVzcGFjZSBjbGVhbnVwLgoKdjY6CiAqIFJlbmFtZSByZWYg dG8gYWN0aXZlLgogKiBEcm9wIGVuZ2luZSBhZ2dyZWdhdGUgc3RhdHMgZm9yIG5vdy4KICogQWNj b3VudCBpbml0aWFsIGJ1c3kgcGVyaW9kIGFmdGVyIGVuYWJsaW5nIHN0YXRzLgoKdjc6CiAqIFJl YmFzZS4KCnY4OgogKiBNb3ZlIGNvbnRleHQgaW4gbm90aWZpY2F0aW9uIGFmdGVyIHRoZSBub3Rp Zmllci4gKENocmlzIFdpbHNvbikKClNpZ25lZC1vZmYtYnk6IFR2cnRrbyBVcnN1bGluIDx0dnJ0 a28udXJzdWxpbkBpbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZW5n aW5lX2NzLmMgIHwgODQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9scmMuYyAgICAgICAgfCAgMiArCiBkcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9yaW5nYnVmZmVyLmggfCA5MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKIDMgZmlsZXMgY2hhbmdlZCwgMTc4IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2VuZ2luZV9jcy5jCmluZGV4IDM1YzExN2MzZmEwZC4uOGRiODNmNTA0ZDcwIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYworKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYwpAQCAtMjM0LDYgKzIzNCw4IEBAIGlu dGVsX2VuZ2luZV9zZXR1cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJLyog Tm90aGluZyB0byBkbyBoZXJlLCBleGVjdXRlIGluIG9yZGVyIG9mIGRlcGVuZGVuY2llcyAqLwog CWVuZ2luZS0+c2NoZWR1bGUgPSBOVUxMOwogCisJc3Bpbl9sb2NrX2luaXQoJmVuZ2luZS0+c3Rh dHMubG9jayk7CisKIAlBVE9NSUNfSU5JVF9OT1RJRklFUl9IRUFEKCZlbmdpbmUtPmNvbnRleHRf c3RhdHVzX25vdGlmaWVyKTsKIAogCWRldl9wcml2LT5lbmdpbmVfY2xhc3NbaW5mby0+Y2xhc3Nd W2luZm8tPmluc3RhbmNlXSA9IGVuZ2luZTsKQEAgLTE2MTMsNiArMTYxNSw4OCBAQCBpbnRlbF9l bmdpbmVfbG9va3VwX3VzZXIoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHU4IGNsYXNz LCB1OCBpbnN0YW5jZSkKIAlyZXR1cm4gaTkxNS0+ZW5naW5lX2NsYXNzW2NsYXNzXVtpbnN0YW5j ZV07CiB9CiAKKy8qKgorICogaW50ZWxfZW5hYmxlX2VuZ2luZV9zdGF0cygpIC0gRW5hYmxlIGVu Z2luZSBidXN5IHRyYWNraW5nIG9uIGVuZ2luZQorICogQGVuZ2luZTogZW5naW5lIHRvIGVuYWJs ZSBzdGF0cyBjb2xsZWN0aW9uCisgKgorICogU3RhcnQgY29sbGVjdGluZyB0aGUgZW5naW5lIGJ1 c3luZXNzIGRhdGEgZm9yIEBlbmdpbmUuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3Ig YSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgaW50ZWxfZW5hYmxlX2VuZ2luZV9zdGF0 cyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKworCWlmICghaTkxNV9tb2RwYXJhbXMuZW5hYmxlX2V4ZWNsaXN0cykKKwkJcmV0dXJuIC1F Tk9ERVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7 CisJaWYgKGVuZ2luZS0+c3RhdHMuZW5hYmxlZCA9PSB+MCkKKwkJZ290byBidXN5OworCWlmIChl bmdpbmUtPnN0YXRzLmVuYWJsZWQrKyA9PSAwKQorCQllbmdpbmUtPnN0YXRzLmVuYWJsZWRfYXQg PSBrdGltZV9nZXQoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPnN0YXRzLmxv Y2ssIGZsYWdzKTsKKworCXJldHVybiAwOworCitidXN5OgorCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmVuZ2luZS0+c3RhdHMubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKwor LyoqCisgKiBpbnRlbF9kaXNhYmxlX2VuZ2luZV9zdGF0cygpIC0gRGlzYWJsZSBlbmdpbmUgYnVz eSB0cmFja2luZyBvbiBlbmdpbmUKKyAqIEBlbmdpbmU6IGVuZ2luZSB0byBkaXNhYmxlIHN0YXRz IGNvbGxlY3Rpb24KKyAqCisgKiBTdG9wcyBjb2xsZWN0aW5nIHRoZSBlbmdpbmUgYnVzeW5lc3Mg ZGF0YSBmb3IgQGVuZ2luZS4KKyAqLwordm9pZCBpbnRlbF9kaXNhYmxlX2VuZ2luZV9zdGF0cyhz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KworCWlmICghaTkxNV9tb2RwYXJhbXMuZW5hYmxlX2V4ZWNsaXN0cykKKwkJcmV0dXJuOworCisJ c3Bpbl9sb2NrX2lycXNhdmUoJmVuZ2luZS0+c3RhdHMubG9jaywgZmxhZ3MpOworCVdBUk5fT05f T05DRShlbmdpbmUtPnN0YXRzLmVuYWJsZWQgPT0gMCk7CisJaWYgKC0tZW5naW5lLT5zdGF0cy5l bmFibGVkID09IDApIHsKKwkJZW5naW5lLT5zdGF0cy5lbmFibGVkX2F0ID0gMDsKKwkJZW5naW5l LT5zdGF0cy5hY3RpdmUgPSAwOworCQllbmdpbmUtPnN0YXRzLnN0YXJ0ID0gMDsKKwkJZW5naW5l LT5zdGF0cy50b3RhbCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+ c3RhdHMubG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGludGVsX2VuZ2luZV9nZXRfYnVzeV90 aW1lKCkgLSBSZXR1cm4gY3VycmVudCBhY2N1bXVsYXRlZCBlbmdpbmUgYnVzeW5lc3MKKyAqIEBl bmdpbmU6IGVuZ2luZSB0byByZXBvcnQgb24KKyAqCisgKiBSZXR1cm5zIGFjY3VtdWxhdGVkIHRp bWUgQGVuZ2luZSB3YXMgYnVzeSBzaW5jZSBlbmdpbmUgc3RhdHMgd2VyZSBlbmFibGVkLgorICov CitrdGltZV90IGludGVsX2VuZ2luZV9nZXRfYnVzeV90aW1lKHN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZSkKK3sKKwlrdGltZV90IHRvdGFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisK KwlzcGluX2xvY2tfaXJxc2F2ZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7CisKKwl0b3Rh bCA9IGVuZ2luZS0+c3RhdHMudG90YWw7CisKKwkvKgorCSAqIElmIHRoZSBlbmdpbmUgaXMgZXhl Y3V0aW5nIHNvbWV0aGluZyBhdCB0aGUgbW9tZW50CisJICogYWRkIGl0IHRvIHRoZSB0b3RhbC4K KwkgKi8KKwlpZiAoZW5naW5lLT5zdGF0cy5hY3RpdmUpCisJCXRvdGFsID0ga3RpbWVfYWRkKHRv dGFsLAorCQkJCSAga3RpbWVfc3ViKGt0aW1lX2dldCgpLCBlbmdpbmUtPnN0YXRzLnN0YXJ0KSk7 CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPnN0YXRzLmxvY2ssIGZsYWdzKTsK KworCXJldHVybiB0b3RhbDsKK30KKwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X1NF TEZURVNUKQogI2luY2x1ZGUgInNlbGZ0ZXN0cy9tb2NrX2VuZ2luZS5jIgogI2VuZGlmCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2ludGVsX2xyYy5jCmluZGV4IDgwY2ViMDhmMGQ1MC4uN2IzMmUyY2U2NWFmIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9scmMuYwpAQCAtMzY3LDExICszNjcsMTMgQEAgc3RhdGljIGlubGlu ZSB2b2lkCiBleGVjbGlzdHNfY29udGV4dF9zY2hlZHVsZV9pbihzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X3JlcXVlc3QgKnJxKQogewogCWV4ZWNsaXN0c19jb250ZXh0X3N0YXR1c19jaGFuZ2UocnEsIElO VEVMX0NPTlRFWFRfU0NIRURVTEVfSU4pOworCWludGVsX2VuZ2luZV9jb250ZXh0X2luKHJxLT5l bmdpbmUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGV4ZWNsaXN0c19jb250ZXh0X3NjaGVk dWxlX291dChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxKQogeworCWludGVsX2VuZ2lu ZV9jb250ZXh0X291dChycS0+ZW5naW5lKTsKIAlleGVjbGlzdHNfY29udGV4dF9zdGF0dXNfY2hh bmdlKHJxLCBJTlRFTF9DT05URVhUX1NDSEVEVUxFX09VVCk7CiB9CiAKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX3JpbmdidWZmZXIuaAppbmRleCA3ZTA3ZWMxYmZlZDEuLmVlNzM4Yzc2OTRlNSAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5oCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaApAQCAtNTM5LDYgKzUzOSwz OCBAQCBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzIHsKIAkgKiBjZXJ0YWluIGJpdHMgdG8gZW5jb2Rl IHRoZSBjb21tYW5kIGxlbmd0aCBpbiB0aGUgaGVhZGVyKS4KIAkgKi8KIAl1MzIgKCpnZXRfY21k X2xlbmd0aF9tYXNrKSh1MzIgY21kX2hlYWRlcik7CisKKwlzdHJ1Y3QgeworCQkvKioKKwkJICog QGxvY2s6IExvY2sgcHJvdGVjdGluZyB0aGUgYmVsb3cgZmllbGRzLgorCQkgKi8KKwkJc3Bpbmxv Y2tfdCBsb2NrOworCQkvKioKKwkJICogQGVuYWJsZWQ6IFJlZmVyZW5jZSBjb3VudCBpbmRpY2F0 aW5nIG51bWJlciBvZiBsaXN0ZW5lcnMuCisJCSAqLworCQl1bnNpZ25lZCBpbnQgZW5hYmxlZDsK KwkJLyoqCisJCSAqIEBhY3RpdmU6IE51bWJlciBvZiBjb250ZXh0cyBjdXJyZW50bHkgc2NoZWR1 bGVkIGluLgorCQkgKi8KKwkJdW5zaWduZWQgaW50IGFjdGl2ZTsKKwkJLyoqCisJCSAqIEBlbmFi bGVkX2F0OiBUaW1lc3RhbXAgd2hlbiBidXN5IHN0YXRzIHdlcmUgZW5hYmxlZC4KKwkJICovCisJ CWt0aW1lX3QgZW5hYmxlZF9hdDsKKwkJLyoqCisJCSAqIEBzdGFydDogVGltZXN0YW1wIG9mIHRo ZSBsYXN0IGlkbGUgdG8gYWN0aXZlIHRyYW5zaXRpb24uCisJCSAqCisJCSAqIElkbGUgaXMgZGVm aW5lZCBhcyBhY3RpdmUgPT0gMCwgYWN0aXZlIGlzIGFjdGl2ZSA+IDAuCisJCSAqLworCQlrdGlt ZV90IHN0YXJ0OworCQkvKioKKwkJICogQHRvdGFsOiBUb3RhbCB0aW1lIHRoaXMgZW5naW5lIHdh cyBidXN5LgorCQkgKgorCQkgKiBBY2N1bXVsYXRlZCB0aW1lIG5vdCBjb3VudGluZyB0aGUgbW9z dCByZWNlbnQgYmxvY2sgaW4gY2FzZXMKKwkJICogd2hlcmUgZW5naW5lIGlzIGN1cnJlbnRseSBi dXN5IChhY3RpdmUgPiAwKS4KKwkJICovCisJCWt0aW1lX3QgdG90YWw7CisJfSBzdGF0czsKIH07 CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CkBAIC04NjAsNCArODkyLDY0IEBAIGJvb2wg aW50ZWxfZW5naW5lX2Nhbl9zdG9yZV9kd29yZChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUpOwogc3RydWN0IGludGVsX2VuZ2luZV9jcyAqCiBpbnRlbF9lbmdpbmVfbG9va3VwX3VzZXIo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHU4IGNsYXNzLCB1OCBpbnN0YW5jZSk7CiAK K3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9lbmdpbmVfY29udGV4dF9pbihzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChSRUFE X09OQ0UoZW5naW5lLT5zdGF0cy5lbmFibGVkKSA9PSAwKQorCQlyZXR1cm47CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmZW5naW5lLT5zdGF0cy5sb2NrLCBmbGFncyk7CisKKwlpZiAoZW5naW5lLT5z dGF0cy5lbmFibGVkID4gMCkgeworCQlpZiAoZW5naW5lLT5zdGF0cy5hY3RpdmUrKyA9PSAwKQor CQkJZW5naW5lLT5zdGF0cy5zdGFydCA9IGt0aW1lX2dldCgpOworCQlHRU1fQlVHX09OKGVuZ2lu ZS0+c3RhdHMuYWN0aXZlID09IDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVu Z2luZS0+c3RhdHMubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxf ZW5naW5lX2NvbnRleHRfb3V0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKFJFQURfT05DRShlbmdpbmUtPnN0YXRzLmVuYWJs ZWQpID09IDApCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlbmdpbmUtPnN0YXRz LmxvY2ssIGZsYWdzKTsKKworCWlmIChlbmdpbmUtPnN0YXRzLmVuYWJsZWQgPiAwKSB7CisJCWt0 aW1lX3QgbGFzdCwgbm93ID0ga3RpbWVfZ2V0KCk7CisKKwkJaWYgKGVuZ2luZS0+c3RhdHMuYWN0 aXZlICYmIC0tZW5naW5lLT5zdGF0cy5hY3RpdmUgPT0gMCkgeworCQkJLyoKKwkJCSAqIERlY3Jl bWVudCB0aGUgYWN0aXZlIGNvbnRleHQgY291bnQgYW5kIGluIGNhc2UgR1BVCisJCQkgKiBpcyBu b3cgaWRsZSBhZGQgdXAgdG8gdGhlIHJ1bm5pbmcgdG90YWwuCisJCQkgKi8KKwkJCWxhc3QgPSBr dGltZV9zdWIobm93LCBlbmdpbmUtPnN0YXRzLnN0YXJ0KTsKKworCQkJZW5naW5lLT5zdGF0cy50 b3RhbCA9IGt0aW1lX2FkZChlbmdpbmUtPnN0YXRzLnRvdGFsLAorCQkJCQkJCWxhc3QpOworCQl9 IGVsc2UgaWYgKGVuZ2luZS0+c3RhdHMuYWN0aXZlID09IDApIHsKKwkJCS8qCisJCQkgKiBBZnRl ciB0dXJuaW5nIG9uIGVuZ2luZSBzdGF0cywgY29udGV4dCBvdXQgbWlnaHQgYmUKKwkJCSAqIHRo ZSBmaXJzdCBldmVudCBpbiB3aGljaCBjYXNlIHdlIGFjY291bnQgZnJvbSB0aGUKKwkJCSAqIHRp bWUgc3RhdHMgZ2F0aGVyaW5nIHdhcyB0dXJuZWQgb24uCisJCQkgKi8KKwkJCWxhc3QgPSBrdGlt ZV9zdWIobm93LCBlbmdpbmUtPnN0YXRzLmVuYWJsZWRfYXQpOworCisJCQllbmdpbmUtPnN0YXRz LnRvdGFsID0ga3RpbWVfYWRkKGVuZ2luZS0+c3RhdHMudG90YWwsCisJCQkJCQkJbGFzdCk7CisJ CX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPnN0YXRzLmxvY2ssIGZs YWdzKTsKK30KKworaW50IGludGVsX2VuYWJsZV9lbmdpbmVfc3RhdHMoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqZW5naW5lKTsKK3ZvaWQgaW50ZWxfZGlzYWJsZV9lbmdpbmVfc3RhdHMoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKTsKKwora3RpbWVfdCBpbnRlbF9lbmdpbmVfZ2V0X2J1 c3lfdGltZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpOworCiAjZW5kaWYgLyogX0lO VEVMX1JJTkdCVUZGRVJfSF8gKi8KLS0gCjIuOS41CgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1h bi9saXN0aW5mby9pbnRlbC1nZngK