From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 32/42] drm/i915: Calculate haswell plane workaround. Date: Tue, 12 May 2015 18:54:43 +0200 Message-ID: <20150512165443.GL15256@phenom.ffwll.local> References: <1431354318-11995-1-git-send-email-maarten.lankhorst@linux.intel.com> <1431354318-11995-33-git-send-email-maarten.lankhorst@linux.intel.com> <20150512094348.GN15256@phenom.ffwll.local> <555208A4.1060808@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wi0-f169.google.com (mail-wi0-f169.google.com [209.85.212.169]) by gabe.freedesktop.org (Postfix) with ESMTP id 6A7E66E195 for ; Tue, 12 May 2015 09:52:23 -0700 (PDT) Received: by wief7 with SMTP id f7so116928519wie.0 for ; Tue, 12 May 2015 09:52:22 -0700 (PDT) Content-Disposition: inline In-Reply-To: <555208A4.1060808@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: Maarten Lankhorst Cc: Ander Conselvan de Oliveira , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gVHVlLCBNYXkgMTIsIDIwMTUgYXQgMDQ6MDU6MjRQTSArMDIwMCwgTWFhcnRlbiBMYW5raG9y c3Qgd3JvdGU6Cj4gT3AgMTItMDUtMTUgb20gMTE6NDMgc2NocmVlZiBEYW5pZWwgVmV0dGVyOgo+ ID4gT24gTW9uLCBNYXkgMTEsIDIwMTUgYXQgMDQ6MjU6MDhQTSArMDIwMCwgTWFhcnRlbiBMYW5r aG9yc3Qgd3JvdGU6Cj4gPj4gU2lnbmVkLW9mZi1ieTogTWFhcnRlbiBMYW5raG9yc3QgPG1hYXJ0 ZW4ubGFua2hvcnN0QGxpbnV4LmludGVsLmNvbT4KPiA+PiAtLS0KPiA+PiAgZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIHwgMTA5ICsrKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tCj4gPj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oICAgICB8ICAg MiArCj4gPj4gIDIgZmlsZXMgY2hhbmdlZCwgODEgaW5zZXJ0aW9ucygrKSwgMzAgZGVsZXRpb25z KC0pCj4gPj4KPiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlz cGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCj4gPj4gaW5kZXgg N2JjNzhiNDlmOWY0Li43YTc5NjU5ZGNhMDAgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCj4gPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZGlzcGxheS5jCj4gPj4gQEAgLTQ4NDgsMzUgKzQ4NDgsNiBAQCBzdGF0aWMgYm9vbCBo c3dfY3J0Y19zdXBwb3J0c19pcHMoc3RydWN0IGludGVsX2NydGMgKmNydGMpCj4gPj4gIAlyZXR1 cm4gSEFTX0lQUyhjcnRjLT5iYXNlLmRldikgJiYgY3J0Yy0+cGlwZSA9PSBQSVBFX0E7Cj4gPj4g IH0KPiA+PiAgCj4gPj4gLS8qCj4gPj4gLSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgd29ya2Fyb3Vu ZCBkZXNjcmliZWQgaW4gdGhlICJub3RlcyIgc2VjdGlvbiBvZiB0aGUgbW9kZQo+ID4+IC0gKiBz ZXQgc2VxdWVuY2UgZG9jdW1lbnRhdGlvbi4gV2hlbiBnb2luZyBmcm9tIG5vIHBpcGVzIG9yIHNp bmdsZSBwaXBlIHRvCj4gPj4gLSAqIG11bHRpcGxlIHBpcGVzLCBhbmQgcGxhbmVzIGFyZSBlbmFi bGVkIGFmdGVyIHRoZSBwaXBlLCB3ZSBuZWVkIHRvIHdhaXQgYXQKPiA+PiAtICogbGVhc3QgMiB2 YmxhbmtzIG9uIHRoZSBmaXJzdCBwaXBlIGJlZm9yZSBlbmFibGluZyBwbGFuZXMgb24gdGhlIHNl Y29uZCBwaXBlLgo+ID4+IC0gKi8KPiA+PiAtc3RhdGljIHZvaWQgaGFzd2VsbF9tb2RlX3NldF9w bGFuZXNfd29ya2Fyb3VuZChzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKPiA+PiAtewo+ID4+IC0J c3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2Owo+ID4+IC0Jc3RydWN0IGlu dGVsX2NydGMgKmNydGNfaXQsICpvdGhlcl9hY3RpdmVfY3J0YyA9IE5VTEw7Cj4gPj4gLQo+ID4+ IC0JLyogV2Ugd2FudCB0byBnZXQgdGhlIG90aGVyX2FjdGl2ZV9jcnRjIG9ubHkgaWYgdGhlcmUn cyBvbmx5IDEgb3RoZXIKPiA+PiAtCSAqIGFjdGl2ZSBjcnRjLiAqLwo+ID4+IC0JZm9yX2VhY2hf aW50ZWxfY3J0YyhkZXYsIGNydGNfaXQpIHsKPiA+PiAtCQlpZiAoIWNydGNfaXQtPmFjdGl2ZSB8 fCBjcnRjX2l0ID09IGNydGMpCj4gPj4gLQkJCWNvbnRpbnVlOwo+ID4+IC0KPiA+PiAtCQlpZiAo b3RoZXJfYWN0aXZlX2NydGMpCj4gPj4gLQkJCXJldHVybjsKPiA+PiAtCj4gPj4gLQkJb3RoZXJf YWN0aXZlX2NydGMgPSBjcnRjX2l0Owo+ID4+IC0JfQo+ID4+IC0JaWYgKCFvdGhlcl9hY3RpdmVf Y3J0YykKPiA+PiAtCQlyZXR1cm47Cj4gPj4gLQo+ID4+IC0JaW50ZWxfd2FpdF9mb3JfdmJsYW5r KGRldiwgb3RoZXJfYWN0aXZlX2NydGMtPnBpcGUpOwo+ID4+IC0JaW50ZWxfd2FpdF9mb3JfdmJs YW5rKGRldiwgb3RoZXJfYWN0aXZlX2NydGMtPnBpcGUpOwo+ID4+IC19Cj4gPj4gLQo+ID4+ICBz dGF0aWMgdm9pZCBoYXN3ZWxsX2NydGNfZW5hYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiA+ PiAgewo+ID4+ICAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKPiA+PiBAQCAt NDk2Nyw3ICs0OTM4LDEwIEBAIHN0YXRpYyB2b2lkIGhhc3dlbGxfY3J0Y19lbmFibGUoc3RydWN0 IGRybV9jcnRjICpjcnRjKQo+ID4+ICAKPiA+PiAgCS8qIElmIHdlIGNoYW5nZSB0aGUgcmVsYXRp dmUgb3JkZXIgYmV0d2VlbiBwaXBlL3BsYW5lcyBlbmFibGluZywgd2UgbmVlZAo+ID4+ICAJICog dG8gY2hhbmdlIHRoZSB3b3JrYXJvdW5kLiAqLwo+ID4+IC0JaGFzd2VsbF9tb2RlX3NldF9wbGFu ZXNfd29ya2Fyb3VuZChpbnRlbF9jcnRjKTsKPiA+PiArCWlmIChwaXBlX2NvbmZpZy0+aHN3X3dv cmthcm91bmRfcGlwZSAhPSBJTlZBTElEX1BJUEUpIHsKPiA+PiArCQlpbnRlbF93YWl0X2Zvcl92 YmxhbmsoZGV2LCBwaXBlX2NvbmZpZy0+aHN3X3dvcmthcm91bmRfcGlwZSk7Cj4gPj4gKwkJaW50 ZWxfd2FpdF9mb3JfdmJsYW5rKGRldiwgcGlwZV9jb25maWctPmhzd193b3JrYXJvdW5kX3BpcGUp Owo+ID4+ICsJfQo+ID4+ICB9Cj4gPj4gIAo+ID4+ICBzdGF0aWMgdm9pZCBpcm9ubGFrZV9wZml0 X2Rpc2FibGUoc3RydWN0IGludGVsX2NydGMgKmNydGMpCj4gPj4gQEAgLTEyMTQ3LDYgKzEyMTIx LDc0IEBAIGRvbmU6Cj4gPj4gIAlyZXR1cm4gcmV0Owo+ID4+ICB9Cj4gPj4gIAo+ID4+ICsvKgo+ ID4+ICsgKiBUaGlzIGltcGxlbWVudHMgdGhlIHdvcmthcm91bmQgZGVzY3JpYmVkIGluIHRoZSAi bm90ZXMiIHNlY3Rpb24gb2YgdGhlIG1vZGUKPiA+PiArICogc2V0IHNlcXVlbmNlIGRvY3VtZW50 YXRpb24uIFdoZW4gZ29pbmcgZnJvbSBubyBwaXBlcyBvciBzaW5nbGUgcGlwZSB0bwo+ID4+ICsg KiBtdWx0aXBsZSBwaXBlcywgYW5kIHBsYW5lcyBhcmUgZW5hYmxlZCBhZnRlciB0aGUgcGlwZSwg d2UgbmVlZCB0byB3YWl0IGF0Cj4gPj4gKyAqIGxlYXN0IDIgdmJsYW5rcyBvbiB0aGUgZmlyc3Qg cGlwZSBiZWZvcmUgZW5hYmxpbmcgcGxhbmVzIG9uIHRoZSBzZWNvbmQgcGlwZS4KPiA+PiArICov Cj4gPj4gK3N0YXRpYyBpbnQgaGFzd2VsbF9tb2RlX3NldF9wbGFuZXNfd29ya2Fyb3VuZChzdHJ1 Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBkcm1fY3J0 YyAqY3J0YzsKPiA+PiArCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKPiA+PiAr CXN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpmaXJzdF9jcnRjX3N0YXRlID0gTlVMTCwgKm90aGVy X2NydGNfc3RhdGUgPSBOVUxMOwo+ID4+ICsJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMs ICpmaXJzdF9jcnRjID0gTlVMTCwgKmVuYWJsZWRfY3J0YzsKPiA+PiArCWludCBlbmFibGVkX2Ny dGNzID0gMCwgcmV0LCBpOwo+ID4+ICsKPiA+PiArCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3Rh dGUsIGNydGMsIGNydGNfc3RhdGUsIGkpIHsKPiA+PiArCQlzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0 ZSAqcGlwZV9jb25maWcgPQo+ID4+ICsJCQl0b19pbnRlbF9jcnRjX3N0YXRlKGNydGNfc3RhdGUp Owo+ID4+ICsKPiA+PiArCQlwaXBlX2NvbmZpZy0+aHN3X3dvcmthcm91bmRfcGlwZSA9IElOVkFM SURfUElQRTsKPiA+IFRoaXMga2luZCBvZiBzdGF0ZSByZXNldHRpbmcgc2hvdWxkIGJlIGRvbmUg aW4gZHVwbGljYXRlX3N0YXRlLgo+IFRoZSB2MiBvZiB0aGlzIHBhdGNoIHVzZXMgaW50ZWxfY3J0 Yy0+YXRvbWljLmhzd193b3JrYXJvdW5kIHBpcGUsIHdoaWNoIHdvdWxkIHdvcmsgYmV0dGVyLiA6 KQo+ID4+ICsKPiA+PiArCQlpZiAoIWNydGNfc3RhdGUtPmFjdGl2ZSkKPiA+PiArCQkJY29udGlu dWU7Cj4gPj4gKwo+ID4+ICsJCWlmICghbmVlZHNfbW9kZXNldChjcnRjX3N0YXRlKSkgewo+ID4+ ICsJCQllbmFibGVkX2NydGNzKys7Cj4gPj4gKwkJCWVuYWJsZWRfY3J0YyA9IHRvX2ludGVsX2Ny dGMoY3J0Yyk7Cj4gPj4gKwkJCWNvbnRpbnVlOwo+ID4+ICsJCX0KPiA+PiArCj4gPj4gKwkJaWYg KGZpcnN0X2NydGMpIHsKPiA+PiArCQkJb3RoZXJfY3J0Y19zdGF0ZSA9IHBpcGVfY29uZmlnOwo+ ID4+ICsJCQlicmVhazsKPiA+PiArCQl9Cj4gPj4gKwkJZmlyc3RfY3J0YyA9IHRvX2ludGVsX2Ny dGMoY3J0Yyk7Cj4gPj4gKwkJZmlyc3RfY3J0Y19zdGF0ZSA9IHBpcGVfY29uZmlnOwo+ID4+ICsJ fQo+ID4+ICsKPiA+PiArCS8qIE5vIHdvcmthcm91bmQgbmVlZGVkPyAqLwo+ID4+ICsJaWYgKCFm aXJzdF9jcnRjIHx8IGVuYWJsZWRfY3J0Y3MgPiAxKQo+ID4+ICsJCXJldHVybiAwOwo+ID4+ICsK PiA+PiArCWZvcl9lYWNoX2ludGVsX2NydGMoc3RhdGUtPmRldiwgaW50ZWxfY3J0Yykgewo+ID4+ ICsJCWlmIChzdGF0ZS0+Y3J0Y3NbZHJtX2NydGNfaW5kZXgoJmludGVsX2NydGMtPmJhc2UpXSkK PiA+PiArCQkJY29udGludWU7Cj4gPj4gKwo+ID4+ICsJCXJldCA9IGRybV9tb2Rlc2V0X2xvY2so JmludGVsX2NydGMtPmJhc2UubXV0ZXgsCj4gPj4gKwkJCQkgICAgICAgc3RhdGUtPmFjcXVpcmVf Y3R4KTsKPiA+PiArCQlpZiAocmV0KQo+ID4+ICsJCQlyZXR1cm4gcmV0Owo+ID4+ICsKPiA+PiAr CQlpZiAoIWludGVsX2NydGMtPmJhc2Uuc3RhdGUtPmFjdGl2ZSkKPiA+PiArCQkJY29udGludWU7 Cj4gPiBJbW8ganVzdCB1bmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgY3J0YyBzdGF0ZSwgdGhl cmUnIHNob3VsZG4ndCBiZSBhbnkKPiA+IGhhcm0gaW4gdGhhdCAoYXMgbG9uZyBhcyB3ZSBsZWF2 ZSBtb2RlL2FjdGl2ZS9wbGFuZXNfY2hhbmdlZCB1bnRvdWNoZWQpLgo+IFByb2JhYmx5Lgo+ID4+ ICsKPiA+PiArCQkvKiAyIGVuYWJsZWQgY3J0Y3MgbWVhbnMgbm8gbmVlZCBmb3Igdy9hICovCj4g Pj4gKwkJaWYgKCsrZW5hYmxlZF9jcnRjcyA+PSAyKQo+ID4+ICsJCQlyZXR1cm4gMDsKPiA+PiAr Cj4gPj4gKwkJZW5hYmxlZF9jcnRjID0gaW50ZWxfY3J0YzsKPiA+PiArCX0KPiA+PiArCj4gPj4g KwlpZiAoZW5hYmxlZF9jcnRjcyA9PSAxKQo+ID4+ICsJCWZpcnN0X2NydGNfc3RhdGUtPmhzd193 b3JrYXJvdW5kX3BpcGUgPSBlbmFibGVkX2NydGMtPnBpcGU7Cj4gPiBmaXJzdF9jcnRjX3N0YXRl IGNvdWxkIGJlIG1pc2NvbXB1dGVkIGlmIDEgY3J0YyBpcyBhbHJlYWR5IG9uIGFuZCB5b3UgYWRk Cj4gPiBhbm90aGVyIG9uZS4gVGhlbiBmaXJzdF9jcnRjIHdpbGwgcG9pbnQgYXQgdGhlIG90aGVy IGNydGMgc2luY2UgdGhhdCdzIHRoZQo+ID4gb25seSBvbmUgYXQgZmlyc3QgaW4gdGhlIGF0b21p YyBzZXQuIEltbyBhIHNpbXBsZXIgYWxnbyB3b3VsZCBiZToKPiBObywgaW4gdGhhdCBjYXNlIGVu YWJsZWRfY3J0Y3MgIT0gMCBhbmQgZW5hYmxlZF9jcnRjIGlzIHNldCB0byB0aGUgY29ycmVjdCBj cnRjLgoKSG0gcmlnaHQgSSBtaXhlZCB1cCBmaXJzdF9jcnRjX3N0YXRlIGFuZCBlbmFibGVkX2Ny dGMuIExvb2tzIGNvcnJlY3Qgb24Kc2Vjb25kIHBhc3MuCgo+ID4gMS4gQ2hlY2sgd2hldGhlciB5 b3VyIGFjdGl2YXRpbmcgYW55IGNydGMgYXQgYWxsLgo+ID4gMi4gSWYgc28gYWRkIGFsbCBjcnRj IHN0YXRlcy4KPiA+IDMuIFNhbWUgbG9vcCBhcyB0aGUgb2xkIG9uZSwganVzdCB1c2luZyBmb3Jf ZWFjaF9jcnRjX2luX3N0YXRlLgo+ID4KPiA+IFRoZXJlJ3Mgb3RoZXIgY2FzZXMgd2l0aCBzaGFy ZWQgcmVzb3VyY2VzIHdoZXJlIHdlIG5lZWQgdG8gZ3JhYiBhbGwgY3J0Ywo+ID4gbG9ja3MgYWxy ZWFkeSBhbnl3YXkgKHNoYXJlZCBkcGxsKSwgdHJ5aW5nIHRvIGJlIGNsZXZlciBkb2Vzbid0IHNl ZW0KPiA+IGJlbmVmaWNpYWwuIEFuZCBpZiB0aGlzIGluZGVlZCBiZWNvbWVzIGEgcHJvYmxlbSB0 aGVuIHdlIG5lZWQgYSBnbG9iYWwKPiA+IHN0YXRlIHd3IG11dGV4IGFuZCB1c2UgdGhhdCAoaW5z dGVhZCBvZiBjcnRjIGxvY2tzKSBmb3IgdGhpcyBib29rLWtlZXBpbmc6Cj4gPiBGaXJzdCBlbmFi bGUgY3J0YyB3b3VsZCBzZXQgZ2xvYmFsX3N0YXRlLT5oc3dfd2FfcGlwZSwgMm5kIGFuZCBsYXRl ciB3b3VsZAo+ID4gY2xlYXIgaXQuIFdlIG1pZ2h0IG5lZWQgdGhpcyBldmVudHVhbGx5IChJJ3Zl IGhlYXJkIHJ1bW91cnMgYWJvdXQgcGVvcGxlCj4gPiBub3QgbGlraW5nIHN0YWxscyB3aGVuIHVu cGx1Z2dpbmcgZXh0ZXJuYWwgc2NyZWVucyB0aGF0IG11Y2gpLCBidXQgbGV0J3MKPiA+IG5vdCBv dmVyY29tcGxpY2F0ZSB0aGluZ3Mgd2hpbGUgd2UgZG8gdGhpcyBjb252ZXJzaW9uLgo+IFlvdSB3 b3VsZCBzdGlsbCBuZWVkIGl0IHdoZW4gZGlzYWJsaW5nIGNydGMncyB0aGVuLiBUbyBkbyBpdCBy aWdodCB5b3Ugd291bGQgbmVlZCB0byBrZWVwIGNydGMtPmFjdGl2ZSwKPiBvciB1c2UgYSBjcnRj X21hc2ssIGJ1dCB0aGF0IHdvdWxkIGJlIGFidXNlZCBzbyBJJ2QgcmF0aGVyIG5vdC4gVGhlIGNy dGMgbG9jayBpcyBhbHNvIG5lZWRlZCBzbyB0aGUKPiBvdGhlciBjcnRjJ3MgY2Fubm90IGJlIGRp c2FibGVkIG9yIGVuYWJsZWQgd2hpbGUgbW9kZXNldHRpbmcsIGJ1dCBJIGd1ZXNzIGFsd2F5cyB0 YWtpbmcgdGhlCj4gY29ubmVjdG9yX211dGV4IGZvciB0aGF0IGNvdWxkIHdvcmsgdG9vLgoKSG0g eWVhaCBjb25uZWN0b3JfbXV0ZXggaXMgdGhlIGdlbmVyYWwgImdsb2JhbCBtb2Rlc2V0IHN0YXRl IiBsb2NrLiBJCmd1ZXNzIHdlIGNvdWxkIGluc3RlYWQgYWNxdWlyZSB0aGF0IG9uZSBhbmQgbWFr ZSBzdXJlIHRoYXQKY3J0Y19zdGF0ZS0+YWN0aXZlIGlzIGFsc28gcHJvdGVjdGVkIGJ5IGl0LiBJ LmUuIGhhdmUgYQoKCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoY3J0Y19zdGF0ZSkKCQlpZiAoY3J0 Y19zdGF0ZS0+YWN0aXZlX2NoYW5nZWQpCgkJCWFjcXVpcmVfY29ubmVjdGlvbl9tdXRleCgpOwoK TWF5YmUgZXZlbiBkbyB0aGlzIGluIHRoZSBoZWxwZXIgY2hlY2tfbW9kZXNldCBmdW5jdGlvbj8g V2VsbCBsb29raW5nIGF0CnRoYXQgb25lIGl0J3Mga2luZGEgZ3VhcmFudGVlZCBhbHJlYWR5LCBz byBhIFdBUk5fT04oIXd3X211dGV4X2xvY2tlZCkKc2hvdWxkIGRvIHRoZSB0cmljayB0b28uIFBs dXMgYSBjb21tZW50IHRoYXQgY3J0Y19zdGF0ZS0+YWN0aXZlIGlzCnByb3RlY3RlZCBieSB0aGUg Y29ubmVjdGlvbl9tdXRleCB0aGFua3MgdG8gdGhlIGhlbHBlcidzIGxvZ2ljLgoKR29pbmcgd2l0 aCB0aGF0IGlzIGZpbmUgd2l0aCBtZSB0b28sIEkganVzdCBmZWVsIGxpa2UgdGhlIGN1cnJlbnQK b3Blbi1jb2RlZCBsb2NraW5nIGxvZ2ljIGlzIGEgYml0IHRvbyBjbGV2ZXIvY29tcGxpY2F0ZWQg Zm9yIHdoYXQgd2Ugd2FudAp0byBkby4KLURhbmllbAotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2Fy ZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxp bmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK