From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH 5/6] drm/i915: Support for pread/pwrite from/to non shmem backed objects Date: Fri, 13 Nov 2015 17:23:46 +0000 Message-ID: <56461CA2.8040507@linux.intel.com> References: <1447238173-31347-1-git-send-email-ankitprasad.r.sharma@intel.com> <1447238173-31347-6-git-send-email-ankitprasad.r.sharma@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTP id 719346E52E for ; Fri, 13 Nov 2015 09:23:48 -0800 (PST) In-Reply-To: <1447238173-31347-6-git-send-email-ankitprasad.r.sharma@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: ankitprasad.r.sharma@intel.com, intel-gfx@lists.freedesktop.org Cc: akash.goel@intel.com, shashidhar.hiremath@intel.com List-Id: intel-gfx@lists.freedesktop.org CgpPbiAxMS8xMS8xNSAxMDozNiwgYW5raXRwcmFzYWQuci5zaGFybWFAaW50ZWwuY29tIHdyb3Rl Ogo+IEZyb206IEFua2l0cHJhc2FkIFNoYXJtYSA8YW5raXRwcmFzYWQuci5zaGFybWFAaW50ZWwu Y29tPgo+Cj4gVGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIGV4dGVuZGluZyB0aGUgcHJlYWQv cHdyaXRlIGZ1bmN0aW9uYWxpdHkKPiBmb3Igb2JqZWN0cyBub3QgYmFja2VkIGJ5IHNobWVtLiBU aGUgYWNjZXNzIHdpbGwgYmUgbWFkZSB0aHJvdWdoCj4gZ3R0IGludGVyZmFjZS4gVGhpcyB3aWxs IGNvdmVyIG9iamVjdHMgYmFja2VkIGJ5IHN0b2xlbiBtZW1vcnkgYXMgd2VsbAo+IGFzIG90aGVy IG5vbi1zaG1lbSBiYWNrZWQgb2JqZWN0cy4KPgo+IHYyOiBEcm9wIGxvY2tzIGFyb3VuZCBzbG93 X3VzZXJfYWNjZXNzLCBwcmVmYXVsdCB0aGUgcGFnZXMgYmVmb3JlCj4gYWNjZXNzIChDaHJpcykK Pgo+IHYzOiBSZWJhc2VkIHRvIHRoZSBsYXRlc3QgZHJtLWludGVsLW5pZ2h0bHkgKEFua2l0KQo+ Cj4gdjQ6IE1vdmVkIHBhZ2UgYmFzZSAmIG9mZnNldCBjYWxjdWxhdGlvbnMgb3V0c2lkZSB0aGUg Y29weSBsb29wLAo+IGNvcnJlY3RlZCBkYXRhIHR5cGVzIGZvciBzaXplIGFuZCBvZmZzZXQgdmFy aWFibGVzLCBjb3JyZWN0ZWQgaWYtZWxzZQo+IGJyYWNlcyBmb3JtYXQgKFR2cnRrby9rZXJuZWxk b2NzKQo+Cj4gdjU6IEVuYWJsZWQgcHJlYWQvcHdyaXRlIGZvciBhbGwgbm9uLXNobWVtIGJhY2tl ZCBvYmplY3RzIGluY2x1ZGluZwo+IHdpdGhvdXQgdGlsaW5nIHJlc3RyaWN0aW9ucyAoQW5raXQp Cj4KPiB2NjogVXNpbmcgcHdyaXRlX2Zhc3QgZm9yIG5vbi1zaG1lbSBiYWNrZWQgb2JqZWN0cyBh cyB3ZWxsIChDaHJpcykKPgo+IHY3OiBVcGRhdGVkIGNvbW1pdCBtZXNzYWdlIChUdnJ0a28pCgpT aW5jZSB2NiB5b3UgaGF2ZSBhbHNvIHJlbmFtZWQgaTkxNV9nZW1fZ3R0X3JlYWQgdG8gaTkxNV9n ZW1fZ3R0X2NvcHkgCmFuZCBhZGRlZCB0aGUgcHdyaXRlIHNsb3cgcGF0aCBzbyB0aGUgY29tbWl0 IHNob3VsZCBzYXkgdGhhdC4KCj4KPiBUZXN0Y2FzZTogaWd0L2dlbV9zdG9sZW4KPgo+IFNpZ25l ZC1vZmYtYnk6IEFua2l0cHJhc2FkIFNoYXJtYSA8YW5raXRwcmFzYWQuci5zaGFybWFAaW50ZWwu Y29tPgo+IC0tLQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyB8IDE0NiArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCj4gICAxIGZpbGUgY2hhbmdlZCwg MTIyIGluc2VydGlvbnMoKyksIDI0IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dl bS5jCj4gaW5kZXggMmQ4YzllMC4uZTBiOTUwMiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2dlbS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0u Ywo+IEBAIC02MTQsNiArNjE0LDk5IEBAIHNobWVtX3ByZWFkX3Nsb3coc3RydWN0IHBhZ2UgKnBh Z2UsIGludCBzaG1lbV9wYWdlX29mZnNldCwgaW50IHBhZ2VfbGVuZ3RoLAo+ICAgCXJldHVybiBy ZXQgPyAtIEVGQVVMVCA6IDA7Cj4gICB9Cj4KPiArc3RhdGljIGlubGluZSB1aW50NjRfdAo+ICtz bG93X3VzZXJfYWNjZXNzKHN0cnVjdCBpb19tYXBwaW5nICptYXBwaW5nLAo+ICsJCSB1aW50NjRf dCBwYWdlX2Jhc2UsIGludCBwYWdlX29mZnNldCwKPiArCQkgY2hhciBfX3VzZXIgKnVzZXJfZGF0 YSwKPiArCQkgaW50IGxlbmd0aCwgYm9vbCBwd3JpdGUpCj4gK3sKPiArCXZvaWQgX19pb21lbSAq dmFkZHJfaW5hdG9taWM7Cj4gKwl2b2lkICp2YWRkcjsKPiArCXVpbnQ2NF90IHVud3JpdHRlbjsK PiArCj4gKwl2YWRkcl9pbmF0b21pYyA9IGlvX21hcHBpbmdfbWFwX3djKG1hcHBpbmcsIHBhZ2Vf YmFzZSk7Cj4gKwkvKiBXZSBjYW4gdXNlIHRoZSBjcHUgbWVtIGNvcHkgZnVuY3Rpb24gYmVjYXVz ZSB0aGlzIGlzIFg4Ni4gKi8KPiArCXZhZGRyID0gKHZvaWQgX19mb3JjZSAqKXZhZGRyX2luYXRv bWljICsgcGFnZV9vZmZzZXQ7Cj4gKwlpZiAocHdyaXRlKQo+ICsJCXVud3JpdHRlbiA9IF9fY29w eV9mcm9tX3VzZXIodmFkZHIsIHVzZXJfZGF0YSwgbGVuZ3RoKTsKPiArCWVsc2UKPiArCQl1bndy aXR0ZW4gPSBfX2NvcHlfdG9fdXNlcih1c2VyX2RhdGEsIHZhZGRyLCBsZW5ndGgpOwo+ICsKPiAr CWlvX21hcHBpbmdfdW5tYXAodmFkZHJfaW5hdG9taWMpOwo+ICsJcmV0dXJuIHVud3JpdHRlbjsK PiArfQo+ICsKPiArc3RhdGljIGludAo+ICtpOTE1X2dlbV9ndHRfY29weShzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAo+ICsJCSAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVpbnQ2 NF90IHNpemUsCj4gKwkJICAgdWludDY0X3QgZGF0YV9vZmZzZXQsIHVpbnQ2NF90IGRhdGFfcHRy KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9w cml2YXRlOwo+ICsJY2hhciBfX3VzZXIgKnVzZXJfZGF0YTsKPiArCXVpbnQ2NF90IHJlbWFpbjsK PiArCXVpbnQ2NF90IG9mZnNldCwgcGFnZV9iYXNlOwo+ICsJaW50IHBhZ2Vfb2Zmc2V0LCBwYWdl X2xlbmd0aCwgcmV0ID0gMDsKPiArCj4gKwlyZXQgPSBpOTE1X2dlbV9vYmpfZ2d0dF9waW4ob2Jq LCAwLCBQSU5fTUFQUEFCTEUpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIG91dDsKPiArCj4gKwly ZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4ob2JqLCBmYWxzZSk7Cj4gKwlp ZiAocmV0KQo+ICsJCWdvdG8gb3V0X3VucGluOwo+ICsKPiArCXJldCA9IGk5MTVfZ2VtX29iamVj dF9wdXRfZmVuY2Uob2JqKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBvdXRfdW5waW47Cj4gKwo+ ICsJdXNlcl9kYXRhID0gdG9fdXNlcl9wdHIoZGF0YV9wdHIpOwo+ICsJcmVtYWluID0gc2l6ZTsK PiArCW9mZnNldCA9IGk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChvYmopICsgZGF0YV9vZmZzZXQ7 Cj4gKwo+ICsJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Cj4gKwlpZiAobGlrZWx5 KCFpOTE1LnByZWZhdWx0X2Rpc2FibGUpKQo+ICsJCXJldCA9IGZhdWx0X2luX211bHRpcGFnZXNf d3JpdGVhYmxlKHVzZXJfZGF0YSwgcmVtYWluKTsKPiArCj4gKwkvKgo+ICsJICogcGFnZV9vZmZz ZXQgPSBvZmZzZXQgd2l0aGluIHBhZ2UKPiArCSAqIHBhZ2VfYmFzZSA9IHBhZ2Ugb2Zmc2V0IHdp dGhpbiBhcGVydHVyZQo+ICsJICovCj4gKwlwYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9m ZnNldCk7Cj4gKwlwYWdlX2Jhc2UgPSBvZmZzZXQgJiBQQUdFX01BU0s7Cj4gKwo+ICsJd2hpbGUg KHJlbWFpbiA+IDApIHsKPiArCQkvKiBwYWdlX2xlbmd0aCA9IGJ5dGVzIHRvIGNvcHkgZm9yIHRo aXMgcGFnZSAqLwo+ICsJCXBhZ2VfbGVuZ3RoID0gcmVtYWluOwo+ICsJCWlmICgocGFnZV9vZmZz ZXQgKyByZW1haW4pID4gUEFHRV9TSVpFKQo+ICsJCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAt IHBhZ2Vfb2Zmc2V0Owo+ICsKPiArCQkvKiBUaGlzIGlzIGEgc2xvdyByZWFkL3dyaXRlIGFzIGl0 IHRyaWVzIHRvIHJlYWQgZnJvbQo+ICsJCSAqIGFuZCB3cml0ZSB0byB1c2VyIG1lbW9yeSB3aGlj aCBtYXkgcmVzdWx0IGludG8gcGFnZQo+ICsJCSAqIGZhdWx0cwo+ICsJCSAqLwo+ICsJCXJldCA9 IHNsb3dfdXNlcl9hY2Nlc3MoZGV2X3ByaXYtPmd0dC5tYXBwYWJsZSwgcGFnZV9iYXNlLAo+ICsJ CQkJICAgICAgIHBhZ2Vfb2Zmc2V0LCB1c2VyX2RhdGEsCj4gKwkJCQkgICAgICAgcGFnZV9sZW5n dGgsIGZhbHNlKTsKPiArCj4gKwkJaWYgKHJldCkgewo+ICsJCQlyZXQgPSAtRUZBVUxUOwo+ICsJ CQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKPiArCQl1c2Vy X2RhdGEgKz0gcGFnZV9sZW5ndGg7Cj4gKwkJcGFnZV9iYXNlICs9IHBhZ2VfbGVuZ3RoOwo+ICsJ CXBhZ2Vfb2Zmc2V0ID0gMDsKPiArCX0KPiArCj4gKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9t dXRleCk7Cj4gKwo+ICtvdXRfdW5waW46Cj4gKwlpOTE1X2dlbV9vYmplY3RfZ2d0dF91bnBpbihv YmopOwo+ICtvdXQ6Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICAgc3RhdGljIGludAo+ICAg aTkxNV9nZW1fc2htZW1fcHJlYWQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPiAgIAkJICAgICBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+IEBAIC03MzcsMTcgKzgzMCwxNCBAQCBp OTE1X2dlbV9wcmVhZF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ ICAgCQlnb3RvIG91dDsKPiAgIAl9Cj4KPiAtCS8qIHByaW1lIG9iamVjdHMgaGF2ZSBubyBiYWNr aW5nIGZpbHAgdG8gR0VNIHByZWFkL3B3cml0ZQo+IC0JICogcGFnZXMgZnJvbS4KPiAtCSAqLwo+ IC0JaWYgKCFvYmotPmJhc2UuZmlscCkgewo+IC0JCXJldCA9IC1FSU5WQUw7Cj4gLQkJZ290byBv dXQ7Cj4gLQl9Cj4gLQo+ICAgCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9wcmVhZChvYmosIGFyZ3Mt Pm9mZnNldCwgYXJncy0+c2l6ZSk7Cj4KPiAtCXJldCA9IGk5MTVfZ2VtX3NobWVtX3ByZWFkKGRl diwgb2JqLCBhcmdzLCBmaWxlKTsKPiArCS8qIHByZWFkIGZvciBub24gc2htZW0gYmFja2VkIG9i amVjdHMgKi8KPiArCWlmICghb2JqLT5iYXNlLmZpbHAgJiYgb2JqLT50aWxpbmdfbW9kZSA9PSBJ OTE1X1RJTElOR19OT05FKQo+ICsJCXJldCA9IGk5MTVfZ2VtX2d0dF9jb3B5KGRldiwgb2JqLCBh cmdzLT5zaXplLAo+ICsJCQkJCWFyZ3MtPm9mZnNldCwgYXJncy0+ZGF0YV9wdHIpOwo+ICsJZWxz ZQo+ICsJCXJldCA9IGk5MTVfZ2VtX3NobWVtX3ByZWFkKGRldiwgb2JqLCBhcmdzLCBmaWxlKTsK Pgo+ICAgb3V0Ogo+ICAgCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwo+ IEBAIC03OTMsNiArODgzLDcgQEAgaTkxNV9nZW1fZ3R0X3B3cml0ZV9mYXN0KHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1LAo+ICAgCXVpbnQ2NF90IHJlbWFpbiwgb2Zmc2V0Owo+ICAgCWNo YXIgX191c2VyICp1c2VyX2RhdGE7Cj4gICAJaW50IHJldDsKPiArCWJvb2wgZmF1bHRlZCA9IGZh bHNlOwo+Cj4gICAJcmV0ID0gaTkxNV9nZW1fb2JqX2dndHRfcGluKG9iaiwgMCwgUElOX01BUFBB QkxFIHwgUElOX05PTkJMT0NLKTsKPiAgIAlpZiAocmV0KSB7Cj4gQEAgLTg1MSwxMSArOTQyLDI1 IEBAIGk5MTVfZ2VtX2d0dF9wd3JpdGVfZmFzdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSwKPiAgIAkJLyogSWYgd2UgZ2V0IGEgZmF1bHQgd2hpbGUgY29weWluZyBkYXRhLCB0aGVuIChw cmVzdW1hYmx5KSBvdXIKPiAgIAkJICogc291cmNlIHBhZ2UgaXNuJ3QgYXZhaWxhYmxlLiAgUmV0 dXJuIHRoZSBlcnJvciBhbmQgd2UnbGwKPiAgIAkJICogcmV0cnkgaW4gdGhlIHNsb3cgcGF0aC4K PiArCQkgKiBJZiB0aGUgb2JqZWN0IGlzIG5vbi1zaG1lbSBiYWNrZWQsIHdlIHJldHJ5IGFnYWlu IHdpdGggdGhlCj4gKwkJICogcGF0aCB0aGF0IGhhbmRsZXMgcGFnZSBmYXVsdC4KPiAgIAkJICov Cj4gLQkJaWYgKGZhc3RfdXNlcl93cml0ZShpOTE1LT5ndHQubWFwcGFibGUsIHBhZ2VfYmFzZSwK PiAtCQkJCSAgICBwYWdlX29mZnNldCwgdXNlcl9kYXRhLCBwYWdlX2xlbmd0aCkpIHsKPiAtCQkJ cmV0ID0gLUVGQVVMVDsKPiAtCQkJZ290byBvdXRfZmx1c2g7Cj4gKwkJaWYgKGZhdWx0ZWQgfHwg ZmFzdF91c2VyX3dyaXRlKGk5MTUtPmd0dC5tYXBwYWJsZSwKPiArCQkJCQkJcGFnZV9iYXNlLCBw YWdlX29mZnNldCwKPiArCQkJCQkJdXNlcl9kYXRhLCBwYWdlX2xlbmd0aCkpIHsKPiArCQkJaWYg KCFvYmotPmJhc2UuZmlscCkgewo+ICsJCQkJZmF1bHRlZCA9IHRydWU7Cj4gKwkJCQlpZiAoc2xv d191c2VyX2FjY2VzcyhpOTE1LT5ndHQubWFwcGFibGUsCj4gKwkJCQkJCSAgICAgcGFnZV9iYXNl LAo+ICsJCQkJCQkgICAgIHBhZ2Vfb2Zmc2V0LCB1c2VyX2RhdGEsCj4gKwkJCQkJCSAgICAgcGFn ZV9sZW5ndGgsIHRydWUpKSB7Cj4gKwkJCQkJcmV0ID0gLUVGQVVMVDsKPiArCQkJCQlnb3RvIG91 dF9mbHVzaDsKCkkgaGF2ZSBjaGF0dGVkIHdpdGggQ2hyaXMgYWJvdXQgdGhpcyBzaW5jZSBJIHdh c24ndCBzdXJlIGlmIHlvdSB0d28gd2VyZSAKY29va2luZyB0aGlzIG5ldyBjb2RlIGJlaGluZCB0 aGUgc2NlbmVzLgoKQW55d2F5LCBpdCBpcyByZXF1aXJlZCB0byBkcm9wIHRoZSBzdHJ1Y3RfbXV0 ZXggYmVmb3JlIGF0dGVtcHRpbmcgdGhlIApzbG93IHBhdGguCgpDaHJpcyBzdWdnZXN0cyBhIG5l dyB0ZXN0IGNhc2UgdG8gY292ZXIgdGhpcywgZG9pbmcgYSBwd3JpdGUgZnJvbSBhIGd0dCAKbW1h cCB3aGljaCBzaG91bGQgdHJpZ2dlciB0aGUgbG9ja2luZyBpbnZlcnNpb24uCgo+ICsJCQkJfQo+ ICsJCQl9IGVsc2Ugewo+ICsJCQkJcmV0ID0gLUVGQVVMVDsKPiArCQkJCWdvdG8gb3V0X2ZsdXNo Owo+ICsJCQl9Cj4gICAJCX0KPgo+ICAgCQlyZW1haW4gLT0gcGFnZV9sZW5ndGg7Cj4gQEAgLTEx MjEsMTQgKzEyMjYsNiBAQCBpOTE1X2dlbV9wd3JpdGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgdm9pZCAqZGF0YSwKPiAgIAkJZ290byBvdXQ7Cj4gICAJfQo+Cj4gLQkvKiBwcmltZSBv YmplY3RzIGhhdmUgbm8gYmFja2luZyBmaWxwIHRvIEdFTSBwcmVhZC9wd3JpdGUKPiAtCSAqIHBh Z2VzIGZyb20uCj4gLQkgKi8KPiAtCWlmICghb2JqLT5iYXNlLmZpbHApIHsKPiAtCQlyZXQgPSAt RUlOVkFMOwo+IC0JCWdvdG8gb3V0Owo+IC0JfQo+IC0KPiAgIAl0cmFjZV9pOTE1X2dlbV9vYmpl Y3RfcHdyaXRlKG9iaiwgYXJncy0+b2Zmc2V0LCBhcmdzLT5zaXplKTsKPgo+ICAgCXJldCA9IC1F RkFVTFQ7Cj4gQEAgLTExMzksOCArMTIzNiw5IEBAIGk5MTVfZ2VtX3B3cml0ZV9pb2N0bChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ICAgCSAqIHBlcnNwZWN0aXZlLCByZXF1 aXJpbmcgbWFudWFsIGRldGlsaW5nIGJ5IHRoZSBjbGllbnQuCj4gICAJICovCj4gICAJaWYgKG9i ai0+dGlsaW5nX21vZGUgPT0gSTkxNV9USUxJTkdfTk9ORSAmJgo+IC0JICAgIG9iai0+YmFzZS53 cml0ZV9kb21haW4gIT0gSTkxNV9HRU1fRE9NQUlOX0NQVSAmJgo+IC0JICAgIGNwdV93cml0ZV9u ZWVkc19jbGZsdXNoKG9iaikpIHsKPiArCSAgICAoIW9iai0+YmFzZS5maWxwIHx8Cj4gKwkgICAg KG9iai0+YmFzZS53cml0ZV9kb21haW4gIT0gSTkxNV9HRU1fRE9NQUlOX0NQVSAmJgo+ICsJICAg IGNwdV93cml0ZV9uZWVkc19jbGZsdXNoKG9iaikpKSkgewoKRm9yIHN0b2xlbiBvYmplY3RzIHdl IGRvbid0IGhhdmUgdGhlIHNhbWUgdGlsaW5nIGxpbWl0YXRpb24gYXMgZm9yIApub3JtYWwgb25l cz8KClJlZ2FyZHMsCgpUdnJ0a28KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9p bnRlbC1nZngK