From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bruno Alvisio Subject: [PATCH v2 14/16] Save/Restore Support: Add suspend/restore support for xenbus Date: Tue, 13 Feb 2018 18:27:37 -0800 Message-ID: <1518575259-71141-15-git-send-email-bruno.alvisio@gmail.com> References: <1518575259-71141-1-git-send-email-bruno.alvisio@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1elmnx-0004Xq-CV for xen-devel@lists.xenproject.org; Wed, 14 Feb 2018 02:28:17 +0000 In-Reply-To: <1518575259-71141-1-git-send-email-bruno.alvisio@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: minios-devel@lists.xenproject.org, xen-devel@lists.xenproject.org Cc: jgross@suse.com, samuel.thibault@ens-lyon.org, wei.liu2@citrix.com List-Id: xen-devel@lists.xenproject.org Q3VycmVudGx5IHRoZSB3YXRjaCBwYXRoIGlzIG5vdCBzYXZlZCBpbiB0aGUgd2F0Y2ggc3RydWN0 IHdoZW4gaXQgaXMgcmVnaXN0ZXJlZC4KRHVyaW5nIHhlbmJ1cyByZXN1bWUgdGhlIHBhdGggaXMg bmVlZGVkIHNvIHRoYXQgdGhlIHdhdGNoZXMgY2FuIGJlIHJlZ2lzdGVyZWQgYWdhaW4uClRodXMs ICdwYXRoJyBmaWVsZCBpcyBhZGRlZCB0byBzdHJ1Y3Qgd2F0Y2ggc28gdGhhdCB3YXRjaGVzIGNh biBiZSByZS1yZWdpc3RlcmVkCmR1cmluZyB4ZW5idXMgcmVzdW1lLgoKU2lnbmVkLW9mZi1ieTog QnJ1bm8gQWx2aXNpbyA8YnJ1bm8uYWx2aXNpb0BnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBTYW11 ZWwgVGhpYmF1bHQgPHNhbXVlbC50aGliYXVsdEBlbnMtbHlvbi5vcmc+Ci0tLQogaW5jbHVkZS94 ZW5idXMuaCB8ICAgMiArKwoga2VybmVsLmMgICAgICAgICB8ICAgOCArKysrKwogeGVuYnVzL3hl bmJ1cy5jICB8IDEwNiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0t LS0tLS0tLS0tLS0tCiAzIGZpbGVzIGNoYW5nZWQsIDg1IGluc2VydGlvbnMoKyksIDMxIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuYnVzLmggYi9pbmNsdWRlL3hlbmJ1cy5o CmluZGV4IGIyZDUwNzIuLjM4NzFmMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuYnVzLmgKKysr IGIvaW5jbHVkZS94ZW5idXMuaApAQCAtMTIwLDYgKzEyMCw4IEBAIGRvbWlkX3QgeGVuYnVzX2dl dF9zZWxmX2lkKHZvaWQpOwogI2lmZGVmIENPTkZJR19YRU5CVVMKIC8qIFJlc2V0IHRoZSBYZW5C dXMgc3lzdGVtLiAqLwogdm9pZCBmaW5pX3hlbmJ1cyh2b2lkKTsKK3ZvaWQgc3VzcGVuZF94ZW5i dXModm9pZCk7Cit2b2lkIHJlc3VtZV94ZW5idXMoaW50IGNhbmNlbGVkKTsKICNlbHNlCiBzdGF0 aWMgaW5saW5lIHZvaWQgZmluaV94ZW5idXModm9pZCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC5j IGIva2VybmVsLmMKaW5kZXggOTMzY2JjZC4uMTM5M2QxNSAxMDA2NDQKLS0tIGEva2VybmVsLmMK KysrIGIva2VybmVsLmMKQEAgLTExOSw2ICsxMTksMTAgQEAgdm9pZCBzdGFydF9rZXJuZWwodm9p ZCogcGFyKQogCiB2b2lkIHByZV9zdXNwZW5kKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1hFTkJV UworICAgIHN1c3BlbmRfeGVuYnVzKCk7CisjZW5kaWYKKwogICAgIGxvY2FsX2lycV9kaXNhYmxl KCk7CiAKICAgICBzdXNwZW5kX2dudHRhYigpOwpAQCAtMTM5LDYgKzE0MywxMCBAQCB2b2lkIHBv c3Rfc3VzcGVuZChpbnQgY2FuY2VsZWQpCiAgICAgcmVzdW1lX2dudHRhYigpOwogCiAgICAgbG9j YWxfaXJxX2VuYWJsZSgpOworCisjaWZkZWYgQ09ORklHX1hFTkJVUworICAgIHJlc3VtZV94ZW5i dXMoY2FuY2VsZWQpOworI2VuZGlmCiB9CiAKIHZvaWQgc3RvcF9rZXJuZWwodm9pZCkKZGlmZiAt LWdpdCBhL3hlbmJ1cy94ZW5idXMuYyBiL3hlbmJ1cy94ZW5idXMuYwppbmRleCBjMmQyYmQxLi5k NzJkYzNhIDEwMDY0NAotLS0gYS94ZW5idXMveGVuYnVzLmMKKysrIGIveGVuYnVzL3hlbmJ1cy5j CkBAIC01MCw2ICs1MCw3IEBAIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHhlbmJ1c193YXRjaF9x dWV1ZSk7CiB4ZW5idXNfZXZlbnRfcXVldWUgeGVuYnVzX2V2ZW50czsKIHN0YXRpYyBzdHJ1Y3Qg d2F0Y2ggewogICAgIGNoYXIgKnRva2VuOworICAgIGNoYXIgKnBhdGg7CiAgICAgeGVuYnVzX2V2 ZW50X3F1ZXVlICpldmVudHM7CiAgICAgc3RydWN0IHdhdGNoICpuZXh0OwogfSAqd2F0Y2hlczsK QEAgLTYzLDYgKzY0LDggQEAgc3RydWN0IHhlbmJ1c19yZXFfaW5mbwogI2RlZmluZSBOUl9SRVFT IDMyCiBzdGF0aWMgc3RydWN0IHhlbmJ1c19yZXFfaW5mbyByZXFfaW5mb1tOUl9SRVFTXTsKIAor c3RhdGljIGNoYXIgKmVycm1zZyhzdHJ1Y3QgeHNkX3NvY2ttc2cgKnJlcCk7CisKIHVpbnQzMl90 IHhlbmJ1c19ldnRjaG47CiAKICNpZmRlZiBDT05GSUdfUEFSQVZJUlQKQEAgLTIzMSw0NSArMjM0 LDM5IEBAIHN0YXRpYyB2b2lkIHhlbmJ1c190aHJlYWRfZnVuYyh2b2lkICppZ24pCiAgICAgc3Ry dWN0IHhzZF9zb2NrbXNnIG1zZzsKICAgICB1bnNpZ25lZCBwcm9kID0geGVuc3RvcmVfYnVmLT5y c3BfcHJvZDsKIAotICAgIGZvciAoOzspIAotICAgIHsKKyAgICBmb3IgKDs7KSB7CiAgICAgICAg IHdhaXRfZXZlbnQoeGJfd2FpdHEsIHByb2QgIT0geGVuc3RvcmVfYnVmLT5yc3BfcHJvZCk7Ci0g ICAgICAgIHdoaWxlICgxKSAKLSAgICAgICAgeworICAgICAgICB3aGlsZSAoMSkgewogICAgICAg ICAgICAgcHJvZCA9IHhlbnN0b3JlX2J1Zi0+cnNwX3Byb2Q7CiAgICAgICAgICAgICBERUJVRygi UnNwX2NvbnMgJWQsIHJzcF9wcm9kICVkLlxuIiwgeGVuc3RvcmVfYnVmLT5yc3BfY29ucywKLSAg ICAgICAgICAgICAgICAgICAgeGVuc3RvcmVfYnVmLT5yc3BfcHJvZCk7CisgICAgICAgICAgICAg ICAgICB4ZW5zdG9yZV9idWYtPnJzcF9wcm9kKTsKICAgICAgICAgICAgIGlmICh4ZW5zdG9yZV9i dWYtPnJzcF9wcm9kIC0geGVuc3RvcmVfYnVmLT5yc3BfY29ucyA8IHNpemVvZihtc2cpKQogICAg ICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgcm1iKCk7Ci0gICAgICAgICAgICBtZW1j cHlfZnJvbV9yaW5nKHhlbnN0b3JlX2J1Zi0+cnNwLAotICAgICAgICAgICAgICAgICAgICAmbXNn LAotICAgICAgICAgICAgICAgICAgICBNQVNLX1hFTlNUT1JFX0lEWCh4ZW5zdG9yZV9idWYtPnJz cF9jb25zKSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1zZykpOwotICAgICAgICAgICAg REVCVUcoIk1zZyBsZW4gJWQsICVkIGF2YWlsLCBpZCAlZC5cbiIsCi0gICAgICAgICAgICAgICAg ICAgIG1zZy5sZW4gKyBzaXplb2YobXNnKSwKLSAgICAgICAgICAgICAgICAgICAgeGVuc3RvcmVf YnVmLT5yc3BfcHJvZCAtIHhlbnN0b3JlX2J1Zi0+cnNwX2NvbnMsCi0gICAgICAgICAgICAgICAg ICAgIG1zZy5yZXFfaWQpOworICAgICAgICAgICAgbWVtY3B5X2Zyb21fcmluZyh4ZW5zdG9yZV9i dWYtPnJzcCwgJm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFTS19YRU5TVE9S RV9JRFgoeGVuc3RvcmVfYnVmLT5yc3BfY29ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNpemVvZihtc2cpKTsKKyAgICAgICAgICAgIERFQlVHKCJNc2cgbGVuICVkLCAlZCBhdmFp bCwgaWQgJWQuXG4iLCBtc2cubGVuICsgc2l6ZW9mKG1zZyksCisgICAgICAgICAgICAgICAgICB4 ZW5zdG9yZV9idWYtPnJzcF9wcm9kIC0geGVuc3RvcmVfYnVmLT5yc3BfY29ucywgbXNnLnJlcV9p ZCk7CisKICAgICAgICAgICAgIGlmICh4ZW5zdG9yZV9idWYtPnJzcF9wcm9kIC0geGVuc3RvcmVf YnVmLT5yc3BfY29ucyA8Ci0gICAgICAgICAgICAgICAgICAgIHNpemVvZihtc2cpICsgbXNnLmxl bikKKyAgICAgICAgICAgICAgICBzaXplb2YobXNnKSArIG1zZy5sZW4pCiAgICAgICAgICAgICAg ICAgYnJlYWs7CiAKICAgICAgICAgICAgIERFQlVHKCJNZXNzYWdlIGlzIGdvb2QuXG4iKTsKIAot ICAgICAgICAgICAgaWYobXNnLnR5cGUgPT0gWFNfV0FUQ0hfRVZFTlQpCi0gICAgICAgICAgICB7 Ci0JCXN0cnVjdCB4ZW5idXNfZXZlbnQgKmV2ZW50ID0gbWFsbG9jKHNpemVvZigqZXZlbnQpICsg bXNnLmxlbik7CisgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT0gWFNfV0FUQ0hfRVZFTlQpIHsK KyAgICAgICAgICAgICAgICBzdHJ1Y3QgeGVuYnVzX2V2ZW50ICpldmVudCA9IG1hbGxvYyhzaXpl b2YoKmV2ZW50KSArIG1zZy5sZW4pOwogICAgICAgICAgICAgICAgIHhlbmJ1c19ldmVudF9xdWV1 ZSAqZXZlbnRzID0gTlVMTDsKLQkJY2hhciAqZGF0YSA9IChjaGFyKilldmVudCArIHNpemVvZigq ZXZlbnQpOworICAgICAgICAgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciopZXZlbnQgKyBzaXpl b2YoKmV2ZW50KTsKICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2F0Y2ggKndhdGNoOwogCi0gICAg ICAgICAgICAgICAgbWVtY3B5X2Zyb21fcmluZyh4ZW5zdG9yZV9idWYtPnJzcCwKLQkJICAgIGRh dGEsCisgICAgICAgICAgICAgICAgbWVtY3B5X2Zyb21fcmluZyh4ZW5zdG9yZV9idWYtPnJzcCwg ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgTUFTS19YRU5TVE9SRV9JRFgoeGVuc3RvcmVfYnVm LT5yc3BfY29ucyArIHNpemVvZihtc2cpKSwKICAgICAgICAgICAgICAgICAgICAgbXNnLmxlbik7 CiAKLQkJZXZlbnQtPnBhdGggPSBkYXRhOwotCQlldmVudC0+dG9rZW4gPSBldmVudC0+cGF0aCAr IHN0cmxlbihldmVudC0+cGF0aCkgKyAxOworICAgICAgICAgICAgICAgIGV2ZW50LT5wYXRoID0g ZGF0YTsKKyAgICAgICAgICAgICAgICBldmVudC0+dG9rZW4gPSBldmVudC0+cGF0aCArIHN0cmxl bihldmVudC0+cGF0aCkgKyAxOwogCiAgICAgICAgICAgICAgICAgbWIoKTsKICAgICAgICAgICAg ICAgICB4ZW5zdG9yZV9idWYtPnJzcF9jb25zICs9IG1zZy5sZW4gKyBzaXplb2YobXNnKTsKQEAg LTI4OCwxNSArMjg1LDExIEBAIHN0YXRpYyB2b2lkIHhlbmJ1c190aHJlYWRfZnVuYyh2b2lkICpp Z24pCiAgICAgICAgICAgICAgICAgICAgIHByaW50aygidW5leHBlY3RlZCB3YXRjaCB0b2tlbiAl c1xuIiwgZXZlbnQtPnRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZShldmVudCk7CiAg ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbHNlCi0gICAg ICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcV9pbmZv W21zZy5yZXFfaWRdLnJlcGx5ID0gbWFsbG9jKHNpemVvZihtc2cpICsgbXNnLmxlbik7Ci0gICAg ICAgICAgICAgICAgbWVtY3B5X2Zyb21fcmluZyh4ZW5zdG9yZV9idWYtPnJzcCwKLSAgICAgICAg ICAgICAgICAgICAgcmVxX2luZm9bbXNnLnJlcV9pZF0ucmVwbHksCi0gICAgICAgICAgICAgICAg ICAgIE1BU0tfWEVOU1RPUkVfSURYKHhlbnN0b3JlX2J1Zi0+cnNwX2NvbnMpLAotICAgICAgICAg ICAgICAgICAgICBtc2cubGVuICsgc2l6ZW9mKG1zZykpOworICAgICAgICAgICAgICAgIG1lbWNw eV9mcm9tX3JpbmcoeGVuc3RvcmVfYnVmLT5yc3AsIHJlcV9pbmZvW21zZy5yZXFfaWRdLnJlcGx5 LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFTS19YRU5TVE9SRV9JRFgoeGVu c3RvcmVfYnVmLT5yc3BfY29ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt c2cubGVuICsgc2l6ZW9mKG1zZykpOwogICAgICAgICAgICAgICAgIG1iKCk7CiAgICAgICAgICAg ICAgICAgeGVuc3RvcmVfYnVmLT5yc3BfY29ucyArPSBtc2cubGVuICsgc2l6ZW9mKG1zZyk7CiAg ICAgICAgICAgICAgICAgd2FrZV91cCgmcmVxX2luZm9bbXNnLnJlcV9pZF0ud2FpdHEpOwpAQCAt MzgwLDYgKzM3Myw1NSBAQCB2b2lkIGZpbmlfeGVuYnVzKHZvaWQpCiB7CiB9CiAKK3ZvaWQgc3Vz cGVuZF94ZW5idXModm9pZCkKK3sKKyAgICAvKiBDaGVjayBmb3IgbGl2ZSByZXF1ZXN0cyBhbmQg d2FpdCB1bnRpbCB0aGV5IGZpbmlzaCAqLworICAgIHdoaWxlICgxKQorICAgIHsKKyAgICAgICAg c3Bpbl9sb2NrKCZyZXFfbG9jayk7CisgICAgICAgIGlmIChucl9saXZlX3JlcXMgPT0gMCkKKyAg ICAgICAgICAgIGJyZWFrOworICAgICAgICBzcGluX3VubG9jaygmcmVxX2xvY2spOworICAgICAg ICB3YWl0X2V2ZW50KHJlcV93cSwgKG5yX2xpdmVfcmVxcyA9PSAwKSk7CisgICAgfQorCisgICAg bWFza19ldnRjaG4oeGVuYnVzX2V2dGNobik7CisgICAgeGVuc3RvcmVfYnVmID0gTlVMTDsKKyAg ICBzcGluX3VubG9jaygmcmVxX2xvY2spOworfQorCit2b2lkIHJlc3VtZV94ZW5idXMoaW50IGNh bmNlbGVkKQoreworICAgIGNoYXIgKm1zZzsKKyAgICBzdHJ1Y3Qgd2F0Y2ggKndhdGNoOworICAg IHN0cnVjdCB3cml0ZV9yZXEgcmVxWzJdOworICAgIHN0cnVjdCB4c2Rfc29ja21zZyAqcmVwOwor CisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisgICAgZ2V0X3hlbmJ1cygmc3RhcnRfaW5mbyk7Cisj ZWxzZQorICAgIGdldF94ZW5idXMoMCk7CisjZW5kaWYKKyAgICB1bm1hc2tfZXZ0Y2huKHhlbmJ1 c19ldnRjaG4pOworCisgICAgaWYgKCFjYW5jZWxlZCkgeworICAgICAgICBmb3IgKHdhdGNoID0g d2F0Y2hlczsgd2F0Y2g7IHdhdGNoID0gd2F0Y2gtPm5leHQpIHsKKyAgICAgICAgICAgIHJlcVsw XS5kYXRhID0gd2F0Y2gtPnBhdGg7CisgICAgICAgICAgICByZXFbMF0ubGVuID0gc3RybGVuKHdh dGNoLT5wYXRoKSArIDE7CisgICAgICAgICAgICByZXFbMV0uZGF0YSA9IHdhdGNoLT50b2tlbjsK KyAgICAgICAgICAgIHJlcVsxXS5sZW4gPSBzdHJsZW4od2F0Y2gtPnRva2VuKSArIDE7CisKKyAg ICAgICAgICAgIHJlcCA9IHhlbmJ1c19tc2dfcmVwbHkoWFNfV0FUQ0gsIFhCVF9OSUwsIHJlcSwg QVJSQVlfU0laRShyZXEpKTsKKyAgICAgICAgICAgIG1zZyA9IGVycm1zZyhyZXApOworICAgICAg ICAgICAgaWYgKG1zZykKKyAgICAgICAgICAgICAgICB4cHJpbnRrKCJlcnJvciBvbiBYU19XQVRD SDogJXNcbiIsIG1zZyk7CisgICAgICAgICAgICBmcmVlKHJlcCk7CisgICAgICAgIH0KKyAgICB9 CisKKyAgICBub3RpZnlfcmVtb3RlX3ZpYV9ldnRjaG4oeGVuYnVzX2V2dGNobik7Cit9CisKIC8q IFNlbmQgZGF0YSB0byB4ZW5idXMuICBUaGlzIGNhbiBibG9jay4gIEFsbCBvZiB0aGUgcmVxdWVz dHMgYXJlIHNlZW4KICAgIGJ5IHhlbmJ1cyBhcyBpZiBzZW50IGF0b21pY2FsbHkuICBUaGUgaGVh ZGVyIGlzIGFkZGVkCiAgICBhdXRvbWF0aWNhbGx5LCB1c2luZyB0eXBlICV0eXBlLCByZXFfaWQg JXJlcV9pZCwgYW5kIHRyYW5zX2lkCkBAIC01MDEsNyArNTQzLDcgQEAgc3RhdGljIGNoYXIgKmVy cm1zZyhzdHJ1Y3QgeHNkX3NvY2ttc2cgKnJlcCkKICAgICByZXNbcmVwLT5sZW5dID0gMDsKICAg ICBmcmVlKHJlcCk7CiAgICAgcmV0dXJuIHJlczsKLX0JCit9CiAKIC8qIFNlbmQgYSBkZWJ1ZyBt ZXNzYWdlIHRvIHhlbmJ1cy4gIENhbiBibG9jay4gKi8KIHN0YXRpYyB2b2lkIHhlbmJ1c19kZWJ1 Z19tc2coY29uc3QgY2hhciAqbXNnKQpAQCAtNjAxLDYgKzY0Myw3IEBAIGNoYXIqIHhlbmJ1c193 YXRjaF9wYXRoX3Rva2VuKCB4ZW5idXNfdHJhbnNhY3Rpb25fdCB4YnQsIGNvbnN0IGNoYXIgKnBh dGgsIGNvbnN0CiAgICAgICAgIGV2ZW50cyA9ICZ4ZW5idXNfZXZlbnRzOwogCiAgICAgd2F0Y2gt PnRva2VuID0gc3RyZHVwKHRva2VuKTsKKyAgICB3YXRjaC0+cGF0aCA9IHN0cmR1cChwYXRoKTsK ICAgICB3YXRjaC0+ZXZlbnRzID0gZXZlbnRzOwogICAgIHdhdGNoLT5uZXh0ID0gd2F0Y2hlczsK ICAgICB3YXRjaGVzID0gd2F0Y2g7CkBAIC02MzYsNiArNjc5LDcgQEAgY2hhciogeGVuYnVzX3Vu d2F0Y2hfcGF0aF90b2tlbiggeGVuYnVzX3RyYW5zYWN0aW9uX3QgeGJ0LCBjb25zdCBjaGFyICpw YXRoLCBjb24KICAgICBmb3IgKHByZXYgPSAmd2F0Y2hlcywgd2F0Y2ggPSAqcHJldjsgd2F0Y2g7 IHByZXYgPSAmd2F0Y2gtPm5leHQsIHdhdGNoID0gKnByZXYpCiAgICAgICAgIGlmICghc3RyY21w KHdhdGNoLT50b2tlbiwgdG9rZW4pKSB7CiAgICAgICAgICAgICBmcmVlKHdhdGNoLT50b2tlbik7 CisgICAgICAgICAgICBmcmVlKHdhdGNoLT5wYXRoKTsKICAgICAgICAgICAgICpwcmV2ID0gd2F0 Y2gtPm5leHQ7CiAgICAgICAgICAgICBmcmVlKHdhdGNoKTsKICAgICAgICAgICAgIGJyZWFrOwot LSAKMi4zLjIgKEFwcGxlIEdpdC01NSkKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54 ZW5wcm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGlu Zm8veGVuLWRldmVs