From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chao Gao Subject: [PATCH 3/4] VT-d PI: Add reference count to pi_desc Date: Wed, 26 Apr 2017 08:52:46 +0800 Message-ID: <1493167967-74144-4-git-send-email-chao.gao@intel.com> References: <1493167967-74144-1-git-send-email-chao.gao@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1493167967-74144-1-git-send-email-chao.gao@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xen.org Cc: Andrew Cooper , Kevin Tian , Jan Beulich , Jun Nakajima , Chao Gao List-Id: xen-devel@lists.xenproject.org VGhpcyBwYXRjaCBpbnRydWR1Y2VzIGEgJ3JlZmNudCcgZmllbGQgaW4gdm14X3BpX2Jsb2NraW5n IHRvIHRyYWNrCnRoZSByZWZlcmVuY2UgY291bnQgb2YgJ3BpX2Rlc2MnIG9mIHRoZSB2Q1BVLiBB bmQgY2hhbmdlIHRoaXMgZmllbGQKZXZlcnkgdGltZSB3ZSByZS1wcm9ncmFtIG9uZSBJUlRFLgoK U2lnbmVkLW9mZi1ieTogQ2hhbyBHYW8gPGNoYW8uZ2FvQGludGVsLmNvbT4KLS0tCiB4ZW4vYXJj aC94ODYvaHZtL3ZteC92bXguYyAgICAgICAgICAgICB8IDI5ICsrKysrKysrKysrKysrKysrKysr KysrKwogeGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvaW8uYyAgICAgICAgICAgfCAgMiArLQogeGVu L2RyaXZlcnMvcGFzc3Rocm91Z2gvdnRkL2ludHJlbWFwLmMgfCA0MSArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKy0tCiB4ZW4vaW5jbHVkZS9hc20teDg2L2h2bS9kb21haW4uaCAgICAg ICB8ICA2ICsrKysrCiB4ZW4vaW5jbHVkZS9hc20teDg2L2h2bS92bXgvdm1jcy5oICAgICB8ICAz ICsrKwogeGVuL2luY2x1ZGUvYXNtLXg4Ni9pb21tdS5oICAgICAgICAgICAgfCAgMiArLQogeGVu L2luY2x1ZGUvYXNtLXg4Ni9tc2kuaCAgICAgICAgICAgICAgfCAgMiArLQogNyBmaWxlcyBjaGFu Z2VkLCA4MCBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3hlbi9h cmNoL3g4Ni9odm0vdm14L3ZteC5jIGIveGVuL2FyY2gveDg2L2h2bS92bXgvdm14LmMKaW5kZXgg NGM5YWY1OS4uNzZjYjQyMSAxMDA2NDQKLS0tIGEveGVuL2FyY2gveDg2L2h2bS92bXgvdm14LmMK KysrIGIveGVuL2FyY2gveDg2L2h2bS92bXgvdm14LmMKQEAgLTEwMCw2ICsxMDAsMjMgQEAgdm9p ZCB2bXhfcGlfcGVyX2NwdV9pbml0KHVuc2lnbmVkIGludCBjcHUpCiAgICAgc3Bpbl9sb2NrX2lu aXQoJnBlcl9jcHUodm14X3BpX2Jsb2NraW5nLCBjcHUpLmxvY2spOwogfQogCit2b2lkIHZteF9w aV9nZXRfcmVmKHN0cnVjdCB2Y3B1ICp2KQoreworICAgIEFTU0VSVChhdG9taWNfcmVhZCgmdi0+ YXJjaC5odm1fdm14LnBpX2Jsb2NraW5nLnJlZmNudCkgPj0gMCk7CisgICAgYXRvbWljX2luYygm di0+YXJjaC5odm1fdm14LnBpX2Jsb2NraW5nLnJlZmNudCk7Cit9CisKK3ZvaWQgdm14X3BpX3B1 dF9yZWYoc3RydWN0IHZjcHUgKnYpCit7CisgICAgYXRvbWljX2RlYygmdi0+YXJjaC5odm1fdm14 LnBpX2Jsb2NraW5nLnJlZmNudCk7CisgICAgQVNTRVJUKGF0b21pY19yZWFkKCZ2LT5hcmNoLmh2 bV92bXgucGlfYmxvY2tpbmcucmVmY250KSA+PSAwKTsKK30KKworYm9vbCB2bXhfcGlfaW5fdXNl KHN0cnVjdCB2Y3B1ICp2KQoreworICAgIHJldHVybiAhIWF0b21pY19yZWFkKCZ2LT5hcmNoLmh2 bV92bXgucGlfYmxvY2tpbmcucmVmY250KTsKK30KKwogc3RhdGljIHZvaWQgdm14X3ZjcHVfYmxv Y2soc3RydWN0IHZjcHUgKnYpCiB7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM3OCw2 ICszOTUsOSBAQCB2b2lkIHZteF9waV9ob29rc19hc3NpZ24oc3RydWN0IGRvbWFpbiAqZCkKIAog ICAgIGQtPmFyY2guaHZtX2RvbWFpbi5waV9vcHMudmNwdV9ibG9jayA9IHZteF92Y3B1X2Jsb2Nr OwogICAgIGQtPmFyY2guaHZtX2RvbWFpbi5waV9vcHMuZG9fcmVzdW1lID0gdm14X3BpX2RvX3Jl c3VtZTsKKyAgICBkLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLmdldF9yZWYgPSB2bXhfcGlfZ2V0 X3JlZjsKKyAgICBkLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLnB1dF9yZWYgPSB2bXhfcGlfcHV0 X3JlZjsKKyAgICBkLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLmluX3VzZSA9IHZteF9waV9pbl91 c2U7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gcGNpZGV2c19sb2NrIGlz IGhlbGQgKi8KQEAgLTQxNiw2ICs0MzYsMTUgQEAgdm9pZCB2bXhfcGlfaG9va3NfZGVhc3NpZ24o c3RydWN0IGRvbWFpbiAqZCkKICAgICBkLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLnZjcHVfYmxv Y2sgPSBOVUxMOwogICAgIGQtPmFyY2guaHZtX2RvbWFpbi5waV9vcHMuc3dpdGNoX2Zyb20gPSBO VUxMOwogICAgIGQtPmFyY2guaHZtX2RvbWFpbi5waV9vcHMuZG9fcmVzdW1lID0gTlVMTDsKKyAg ICBkLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLmdldF9yZWYgPSBOVUxMOworICAgIGQtPmFyY2gu aHZtX2RvbWFpbi5waV9vcHMucHV0X3JlZiA9IE5VTEw7CisgICAgZC0+YXJjaC5odm1fZG9tYWlu LnBpX29wcy5pbl91c2UgPSBOVUxMOworICAgIC8qCisgICAgICogSWYgZGV2aWNlIGlzIHN0aWxs IHVzaW5nIGJ5IGd1ZXN0LCBidXQgd2UgZm9yY2libHkgZGVhc3NpZ24gaXQsCisgICAgICogdGhl biB0aGUgJ3JlZmNudCcgaXMgbm90IHplcm8gaGVyZS4gQ2xlYXIgaXQgZm9yIHJlLWFzc2lnbm1l bnQuCisgICAgICovCisgICAgZm9yX2VhY2hfdmNwdSAoIGQsIHYgKQorICAgICAgICBhdG9taWNf c2V0KCZ2LT5hcmNoLmh2bV92bXgucGlfYmxvY2tpbmcucmVmY250LCAwKTsKIAogICAgIGZvcl9l YWNoX3ZjcHUgKCBkLCB2ICkKICAgICAgICAgdm14X3BpX3VuYmxvY2tfdmNwdSh2KTsKZGlmZiAt LWdpdCBhL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2lvLmMgYi94ZW4vZHJpdmVycy9wYXNzdGhy b3VnaC9pby5jCmluZGV4IGU1YTQzZTUuLjk3OWJlNzcgMTAwNjQ0Ci0tLSBhL3hlbi9kcml2ZXJz L3Bhc3N0aHJvdWdoL2lvLmMKKysrIGIveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvaW8uYwpAQCAt MzE5LDcgKzMxOSw3IEBAIGludCBwdF9pcnFfY3JlYXRlX2JpbmQoCiAgICAgewogICAgICAgICB1 aW50OF90IGRlc3QsIGRlc3RfbW9kZSwgZGVsaXZlcnlfbW9kZTsKICAgICAgICAgaW50IGRlc3Rf dmNwdV9pZDsKLSAgICAgICAgY29uc3Qgc3RydWN0IHZjcHUgKnZjcHU7CisgICAgICAgIHN0cnVj dCB2Y3B1ICp2Y3B1OwogCiAgICAgICAgIGlmICggIShwaXJxX2RwY2ktPmZsYWdzICYgSFZNX0lS UV9EUENJX01BUFBFRCkgKQogICAgICAgICB7CmRpZmYgLS1naXQgYS94ZW4vZHJpdmVycy9wYXNz dGhyb3VnaC92dGQvaW50cmVtYXAuYyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0ZC9pbnRy ZW1hcC5jCmluZGV4IDFlMDMxN2MuLjk5ZjFjY2UgMTAwNjQ0Ci0tLSBhL3hlbi9kcml2ZXJzL3Bh c3N0aHJvdWdoL3Z0ZC9pbnRyZW1hcC5jCisrKyBiL3hlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL3Z0 ZC9pbnRyZW1hcC5jCkBAIC01OTYsNiArNTk2LDMyIEBAIHN0YXRpYyBpbnQgcmVtYXBfZW50cnlf dG9fbXNpX21zZygKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcGlfZ2V0X3JlZihz dHJ1Y3QgcGlfZGVzYyAqcGlfZGVzYykKK3sKKyAgICBzdHJ1Y3QgdmNwdSAqdjsKKworICAgIGlm ICggIXBpX2Rlc2MgKQorICAgICAgICByZXR1cm47CisKKyAgICB2ID0gcGlfZGVzY190b192Y3B1 KHBpX2Rlc2MpOworICAgIEFTU0VSVChpc19odm1fZG9tYWluKHYtPmRvbWFpbikpOworICAgIGlm ICggdi0+ZG9tYWluLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLmdldF9yZWYgKQorICAgICAgICB2 LT5kb21haW4tPmFyY2guaHZtX2RvbWFpbi5waV9vcHMuZ2V0X3JlZih2KTsKK30KKworc3RhdGlj IHZvaWQgcGlfcHV0X3JlZihzdHJ1Y3QgcGlfZGVzYyAqcGlfZGVzYykKK3sKKyAgICBzdHJ1Y3Qg dmNwdSAqdjsKKworICAgIGlmICggIXBpX2Rlc2MgKQorICAgICAgICByZXR1cm47CisKKyAgICB2 ID0gcGlfZGVzY190b192Y3B1KHBpX2Rlc2MpOworICAgIEFTU0VSVChpc19odm1fZG9tYWluKHYt PmRvbWFpbikpOworICAgIGlmICggdi0+ZG9tYWluLT5hcmNoLmh2bV9kb21haW4ucGlfb3BzLnB1 dF9yZWYgKQorICAgICAgICB2LT5kb21haW4tPmFyY2guaHZtX2RvbWFpbi5waV9vcHMucHV0X3Jl Zih2KTsKK30KKwogc3RhdGljIGludCBtc2lfbXNnX3RvX3JlbWFwX2VudHJ5KAogICAgIHN0cnVj dCBpb21tdSAqaW9tbXUsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogICAgIHN0cnVjdCBtc2lfZGVz YyAqbXNpX2Rlc2MsIHN0cnVjdCBtc2lfbXNnICptc2cpCkBAIC02MTksNiArNjQ1LDcgQEAgc3Rh dGljIGludCBtc2lfbXNnX3RvX3JlbWFwX2VudHJ5KAogICAgICAgICB7CiAgICAgICAgICAgICBm cmVlX3JlbWFwX2VudHJ5KGlvbW11LCBtc2lfZGVzYy0+cmVtYXBfaW5kZXggKyBpKTsKICAgICAg ICAgICAgIG1zaV9kZXNjW2ldLmlydGVfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgICAg IHBpX3B1dF9yZWYobXNpX2Rlc2NbaV0ucGlfZGVzYyk7CiAgICAgICAgIH0KICAgICAgICAgc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmaXJfY3RybC0+aXJlbWFwX2xvY2ssIGZsYWdzKTsKICAgICAg ICAgcmV0dXJuIDA7CkBAIC05NjIsMTEgKzk4OSwxMiBAQCB2b2lkIGlvbW11X2Rpc2FibGVfeDJh cGljX0lSKHZvaWQpCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBJUlRF IGZvciBwb3N0ZWQtaW50ZXJydXB0CiAgKiB3aGVuIGd1ZXN0IGNoYW5nZXMgTVNJL01TSS1YIGlu Zm9ybWF0aW9uLgogICovCi1pbnQgcGlfdXBkYXRlX2lydGUoY29uc3Qgc3RydWN0IHBpX2Rlc2Mg KnBpX2Rlc2MsIGNvbnN0IHN0cnVjdCBwaXJxICpwaXJxLAoraW50IHBpX3VwZGF0ZV9pcnRlKHN0 cnVjdCBwaV9kZXNjICpwaV9kZXNjLCBjb25zdCBzdHJ1Y3QgcGlycSAqcGlycSwKICAgICBjb25z dCB1aW50OF90IGd2ZWMpCiB7CiAgICAgc3RydWN0IGlycV9kZXNjICpkZXNjOwogICAgIHN0cnVj dCBtc2lfZGVzYyAqbXNpX2Rlc2M7CisgICAgc3RydWN0IHBpX2Rlc2MgKm9sZF9waV9kZXNjOwog ICAgIGludCByYzsKIAogICAgIGRlc2MgPSBwaXJxX3NwaW5fbG9ja19pcnFfZGVzYyhwaXJxLCBO VUxMKTsKQEAgLTk3OSwxMyArMTAwNywyMiBAQCBpbnQgcGlfdXBkYXRlX2lydGUoY29uc3Qgc3Ry dWN0IHBpX2Rlc2MgKnBpX2Rlc2MsIGNvbnN0IHN0cnVjdCBwaXJxICpwaXJxLAogICAgICAgICBy YyA9IC1FTk9ERVY7CiAgICAgICAgIGdvdG8gdW5sb2NrX291dDsKICAgICB9CisgICAgb2xkX3Bp X2Rlc2MgPSBtc2lfZGVzYy0+cGlfZGVzYzsKKworICAgIHBpX2dldF9yZWYocGlfZGVzYyk7CiAg ICAgbXNpX2Rlc2MtPnBpX2Rlc2MgPSBwaV9kZXNjOwogICAgIG1zaV9kZXNjLT5ndmVjID0gZ3Zl YzsKIAogICAgIHNwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CiAKICAgICBBU1NFUlQocGNp ZGV2c19sb2NrZWQoKSk7Ci0gICAgcmV0dXJuIGlvbW11X3VwZGF0ZV9pcmVfZnJvbV9tc2kobXNp X2Rlc2MsICZtc2lfZGVzYy0+bXNnKTsKKyAgICByYyA9IGlvbW11X3VwZGF0ZV9pcmVfZnJvbV9t c2kobXNpX2Rlc2MsICZtc2lfZGVzYy0+bXNnKTsKKyAgICBpZiAoICFyYyApCisgICAgICAgIHBp X3B1dF9yZWYob2xkX3BpX2Rlc2MpOworICAgIGVsc2UKKyAgICAgICAgQVNTRVJUX1VOUkVBQ0hB QkxFKCk7CisKKyAgICByZXR1cm4gcmM7CiAKICB1bmxvY2tfb3V0OgogICAgIHNwaW5fdW5sb2Nr X2lycSgmZGVzYy0+bG9jayk7CmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9hc20teDg2L2h2bS9k b21haW4uaCBiL3hlbi9pbmNsdWRlL2FzbS14ODYvaHZtL2RvbWFpbi5oCmluZGV4IGQyODk5Yzku LjZmYzk3YzQgMTAwNjQ0Ci0tLSBhL3hlbi9pbmNsdWRlL2FzbS14ODYvaHZtL2RvbWFpbi5oCisr KyBiL3hlbi9pbmNsdWRlL2FzbS14ODYvaHZtL2RvbWFpbi5oCkBAIC05OCw2ICs5OCwxMiBAQCBz dHJ1Y3QgaHZtX3BpX29wcyB7CiAKICAgICAvKiBIb29rIGludG8gdGhlIHZtZW50cnkgcGF0aC4g Ki8KICAgICB2b2lkICgqZG9fcmVzdW1lKShzdHJ1Y3QgdmNwdSAqdik7CisKKyAgICAvKiBHZXQv UHV0IHJlZmNvdW50IG9mIFBJIGJsb2NraW5nIG9mIHRoaXMgdkNQVSAqLworICAgIHZvaWQgKCpn ZXRfcmVmKShzdHJ1Y3QgdmNwdSAqdik7CisgICAgdm9pZCAoKnB1dF9yZWYpKHN0cnVjdCB2Y3B1 ICp2KTsKKyAgICAvKiBJcyB0aGUgUEkgYmxvY2tpbmcgaXMgcmVmZXJyZWQgYnkgSVJURXMgKi8K KyAgICBib29sICgqaW5fdXNlKShzdHJ1Y3QgdmNwdSAqdik7CiB9OwogCiBzdHJ1Y3QgaHZtX2Rv bWFpbiB7CmRpZmYgLS1naXQgYS94ZW4vaW5jbHVkZS9hc20teDg2L2h2bS92bXgvdm1jcy5oIGIv eGVuL2luY2x1ZGUvYXNtLXg4Ni9odm0vdm14L3ZtY3MuaAppbmRleCA5NTA3YmQyLi43Y2IxYTky IDEwMDY0NAotLS0gYS94ZW4vaW5jbHVkZS9hc20teDg2L2h2bS92bXgvdm1jcy5oCisrKyBiL3hl bi9pbmNsdWRlL2FzbS14ODYvaHZtL3ZteC92bWNzLmgKQEAgLTg1LDYgKzg1LDcgQEAgc3RydWN0 IHBpX2Rlc2Mgewogc3RydWN0IHBpX2Jsb2NraW5nX3ZjcHUgewogICAgIHN0cnVjdCBsaXN0X2hl YWQgICAgIGxpc3Q7CiAgICAgc3BpbmxvY2tfdCAgICAgICAgICAgKmxvY2s7CisgICAgYXRvbWlj X3QgICAgICAgICAgICAgcmVmY250OyAgLyogSG93IG1hbnkgSVJURXMgcmVmZXIgdG8gdGhpcyB2 Q1BVPyAqLwogfTsKIAogc3RydWN0IGFyY2hfdm14X3N0cnVjdCB7CkBAIC0xNjAsNiArMTYxLDgg QEAgc3RydWN0IGFyY2hfdm14X3N0cnVjdCB7CiAgICAgc3RydWN0IHBpX2Jsb2NraW5nX3ZjcHUg cGlfYmxvY2tpbmc7CiB9OwogCisjZGVmaW5lIHBpX2Rlc2NfdG9fdmNwdShhKSBjb250YWluZXJf b2YoYSwgc3RydWN0IHZjcHUsIGFyY2guaHZtX3ZteC5waV9kZXNjKQorCiBpbnQgdm14X2NyZWF0 ZV92bWNzKHN0cnVjdCB2Y3B1ICp2KTsKIHZvaWQgdm14X2Rlc3Ryb3lfdm1jcyhzdHJ1Y3QgdmNw dSAqdik7CiB2b2lkIHZteF92bWNzX2VudGVyKHN0cnVjdCB2Y3B1ICp2KTsKZGlmZiAtLWdpdCBh L3hlbi9pbmNsdWRlL2FzbS14ODYvaW9tbXUuaCBiL3hlbi9pbmNsdWRlL2FzbS14ODYvaW9tbXUu aAppbmRleCAwNDMxMjMzLi5jZmEwMDU4IDEwMDY0NAotLS0gYS94ZW4vaW5jbHVkZS9hc20teDg2 L2lvbW11LmgKKysrIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9pb21tdS5oCkBAIC05Miw3ICs5Miw3 IEBAIGJvb2xfdCBpb21tdV9zdXBwb3J0c19laW0odm9pZCk7CiBpbnQgaW9tbXVfZW5hYmxlX3gy YXBpY19JUih2b2lkKTsKIHZvaWQgaW9tbXVfZGlzYWJsZV94MmFwaWNfSVIodm9pZCk7CiAKLWlu dCBwaV91cGRhdGVfaXJ0ZShjb25zdCBzdHJ1Y3QgcGlfZGVzYyAqcGlfZGVzYywgY29uc3Qgc3Ry dWN0IHBpcnEgKnBpcnEsCitpbnQgcGlfdXBkYXRlX2lydGUoc3RydWN0IHBpX2Rlc2MgKnBpX2Rl c2MsIGNvbnN0IHN0cnVjdCBwaXJxICpwaXJxLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVp bnQ4X3QgZ3ZlYyk7CiAKICNlbmRpZiAvKiAhX19BUkNIX1g4Nl9JT01NVV9IX18gKi8KZGlmZiAt LWdpdCBhL3hlbi9pbmNsdWRlL2FzbS14ODYvbXNpLmggYi94ZW4vaW5jbHVkZS9hc20teDg2L21z aS5oCmluZGV4IGE1ZGU2YTEuLmZiZjE3OTMgMTAwNjQ0Ci0tLSBhL3hlbi9pbmNsdWRlL2FzbS14 ODYvbXNpLmgKKysrIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9tc2kuaApAQCAtMTA1LDcgKzEwNSw3 IEBAIHN0cnVjdCBtc2lfZGVzYyB7CiAKIAlib29sIGlydGVfaW5pdGlhbGl6ZWQ7CiAJdWludDhf dCBndmVjOwkJCS8qIGd1ZXN0IHZlY3Rvci4gdmFsaWQgd2hlbiBwaV9kZXNjIGlzbid0IE5VTEwg Ki8KLQljb25zdCBzdHJ1Y3QgcGlfZGVzYyAqcGlfZGVzYzsJLyogcG9pbnRlciB0byBwb3N0ZWQg ZGVzY3JpcHRvciAqLworCXN0cnVjdCBwaV9kZXNjICpwaV9kZXNjOwkvKiBwb2ludGVyIHRvIHBv c3RlZCBkZXNjcmlwdG9yICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKLS0gCjEuOC4z LjEKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4t ZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMu eGVuLm9yZy94ZW4tZGV2ZWwK