From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: [PATCH v6 2/8] mm: Extract allocation loop from alloc_heap_pages() Date: Fri, 4 Aug 2017 13:05:40 -0400 Message-ID: <1501866346-9774-3-git-send-email-boris.ostrovsky@oracle.com> References: <1501866346-9774-1-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1501866346-9774-1-git-send-email-boris.ostrovsky@oracle.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: sstabellini@kernel.org, wei.liu2@citrix.com, George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, tim@xen.org, jbeulich@suse.com, Boris Ostrovsky List-Id: xen-devel@lists.xenproject.org VGhpcyB3aWxsIG1ha2UgY29kZSBhIGJpdCBtb3JlIHJlYWRhYmxlLCBlc3BlY2lhbGx5IHdpdGgg Y2hhbmdlcyB0aGF0CndpbGwgYmUgaW50cm9kdWNlZCBpbiBzdWJzZXF1ZW50IHBhdGNoZXMuCgpT aWduZWQtb2ZmLWJ5OiBCb3JpcyBPc3Ryb3Zza3kgPGJvcmlzLm9zdHJvdnNreUBvcmFjbGUuY29t PgotLS0KQ2hhbmdlcyBpbiB2NjoKKiBSZWJhc2VkIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBmaXJz dCBwYXRjaCAodGh1cyBkcm9wcGVkIEphbidzIEFDSykKCiB4ZW4vY29tbW9uL3BhZ2VfYWxsb2Mu YyB8IDEzOSArKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0K IDEgZmlsZSBjaGFuZ2VkLCA3NyBpbnNlcnRpb25zKCspLCA2MiBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS94ZW4vY29tbW9uL3BhZ2VfYWxsb2MuYyBiL3hlbi9jb21tb24vcGFnZV9hbGxvYy5j CmluZGV4IDllNzg3ZTAuLjZkNzQyMmQgMTAwNjQ0Ci0tLSBhL3hlbi9jb21tb24vcGFnZV9hbGxv Yy5jCisrKyBiL3hlbi9jb21tb24vcGFnZV9hbGxvYy5jCkBAIC02OTcsMjIgKzY5NywxNSBAQCBz dGF0aWMgdm9pZCBwYWdlX2xpc3RfYWRkX3NjcnViKHN0cnVjdCBwYWdlX2luZm8gKnBnLCB1bnNp Z25lZCBpbnQgbm9kZSwKICAgICAgICAgcGFnZV9saXN0X2FkZChwZywgJmhlYXAobm9kZSwgem9u ZSwgb3JkZXIpKTsKIH0KIAotLyogQWxsb2NhdGUgMl5Ab3JkZXIgY29udGlndW91cyBwYWdlcy4g Ki8KLXN0YXRpYyBzdHJ1Y3QgcGFnZV9pbmZvICphbGxvY19oZWFwX3BhZ2VzKAotICAgIHVuc2ln bmVkIGludCB6b25lX2xvLCB1bnNpZ25lZCBpbnQgem9uZV9oaSwKLSAgICB1bnNpZ25lZCBpbnQg b3JkZXIsIHVuc2lnbmVkIGludCBtZW1mbGFncywKLSAgICBzdHJ1Y3QgZG9tYWluICpkKQorc3Rh dGljIHN0cnVjdCBwYWdlX2luZm8gKmdldF9mcmVlX2J1ZGR5KHVuc2lnbmVkIGludCB6b25lX2xv LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB6 b25lX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVk IGludCBvcmRlciwgdW5zaWduZWQgaW50IG1lbWZsYWdzLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkb21haW4gKmQpCiB7Ci0gICAgdW5zaWdu ZWQgaW50IGksIGosIHpvbmUgPSAwLCBub2RlbWFza19yZXRyeSA9IDAsIGZpcnN0X2RpcnR5Owog ICAgIG5vZGVpZF90IGZpcnN0X25vZGUsIG5vZGUgPSBNRU1GX2dldF9ub2RlKG1lbWZsYWdzKSwg cmVxX25vZGUgPSBub2RlOwotICAgIHVuc2lnbmVkIGxvbmcgcmVxdWVzdCA9IDFVTCA8PCBvcmRl cjsKKyAgICBub2RlbWFza190IG5vZGVtYXNrID0gZCA/IGQtPm5vZGVfYWZmaW5pdHkgOiBub2Rl X29ubGluZV9tYXA7CisgICAgdW5zaWduZWQgaW50IGosIHpvbmUsIG5vZGVtYXNrX3JldHJ5ID0g MDsKICAgICBzdHJ1Y3QgcGFnZV9pbmZvICpwZzsKLSAgICBub2RlbWFza190IG5vZGVtYXNrID0g KGQgIT0gTlVMTCApID8gZC0+bm9kZV9hZmZpbml0eSA6IG5vZGVfb25saW5lX21hcDsKLSAgICBi b29sX3QgbmVlZF90bGJmbHVzaCA9IDA7Ci0gICAgdWludDMyX3QgdGxiZmx1c2hfdGltZXN0YW1w ID0gMDsKLQotICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGJpdHMgaW4gbWVtZmxh Z3MgZm9yIG5vZGVJRC4gKi8KLSAgICBCVUlMRF9CVUdfT04oKF9NRU1GX2JpdHMgLSBfTUVNRl9u b2RlKSA8ICg4ICogc2l6ZW9mKG5vZGVpZF90KSkpOwogCiAgICAgaWYgKCBub2RlID09IE5VTUFf Tk9fTk9ERSApCiAgICAgewpAQCAtNzI4LDM0ICs3MjEsNiBAQCBzdGF0aWMgc3RydWN0IHBhZ2Vf aW5mbyAqYWxsb2NfaGVhcF9wYWdlcygKICAgICBmaXJzdF9ub2RlID0gbm9kZTsKIAogICAgIEFT U0VSVChub2RlIDwgTUFYX05VTU5PREVTKTsKLSAgICBBU1NFUlQoem9uZV9sbyA8PSB6b25lX2hp KTsKLSAgICBBU1NFUlQoem9uZV9oaSA8IE5SX1pPTkVTKTsKLQotICAgIGlmICggdW5saWtlbHko b3JkZXIgPiBNQVhfT1JERVIpICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzcGluX2xv Y2soJmhlYXBfbG9jayk7Ci0KLSAgICAvKgotICAgICAqIENsYWltZWQgbWVtb3J5IGlzIGNvbnNp ZGVyZWQgdW5hdmFpbGFibGUgdW5sZXNzIHRoZSByZXF1ZXN0Ci0gICAgICogaXMgbWFkZSBieSBh IGRvbWFpbiB3aXRoIHN1ZmZpY2llbnQgdW5jbGFpbWVkIHBhZ2VzLgotICAgICAqLwotICAgIGlm ICggKG91dHN0YW5kaW5nX2NsYWltcyArIHJlcXVlc3QgPgotICAgICAgICAgIHRvdGFsX2F2YWls X3BhZ2VzICsgdG1lbV9mcmVlYWJsZV9wYWdlcygpKSAmJgotICAgICAgICAgICgobWVtZmxhZ3Mg JiBNRU1GX25vX3JlZmNvdW50KSB8fAotICAgICAgICAgICAhZCB8fCBkLT5vdXRzdGFuZGluZ19w YWdlcyA8IHJlcXVlc3QpICkKLSAgICAgICAgZ290byBub3RfZm91bmQ7Ci0KLSAgICAvKgotICAg ICAqIFRNRU06IFdoZW4gYXZhaWxhYmxlIG1lbW9yeSBpcyBzY2FyY2UgZHVlIHRvIHRtZW0gYWJz b3JiaW5nIGl0LCBhbGxvdwotICAgICAqIG9ubHkgbWlkLXNpemUgYWxsb2NhdGlvbnMgdG8gYXZv aWQgd29yc3Qgb2YgZnJhZ21lbnRhdGlvbiBpc3N1ZXMuCi0gICAgICogT3RoZXJzIHRyeSB0bWVt IHBvb2xzIHRoZW4gZmFpbC4gIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHVudGlsIGFsbAotICAgICAq IHBvc3QtZG9tMC1jcmVhdGlvbi1tdWx0aS1wYWdlIGFsbG9jYXRpb25zIGNhbiBiZSBlbGltaW5h dGVkLgotICAgICAqLwotICAgIGlmICggKChvcmRlciA9PSAwKSB8fCAob3JkZXIgPj0gOSkpICYm Ci0gICAgICAgICAodG90YWxfYXZhaWxfcGFnZXMgPD0gbWlkc2l6ZV9hbGxvY196b25lX3BhZ2Vz KSAmJgotICAgICAgICAgdG1lbV9mcmVlYWJsZV9wYWdlcygpICkKLSAgICAgICAgZ290byB0cnlf dG1lbTsKIAogICAgIC8qCiAgICAgICogU3RhcnQgd2l0aCByZXF1ZXN0ZWQgbm9kZSwgYnV0IGV4 aGF1c3QgYWxsIG5vZGUgbWVtb3J5IGluIHJlcXVlc3RlZCAKQEAgLTc2NywxNyArNzMyLDE3IEBA IHN0YXRpYyBzdHJ1Y3QgcGFnZV9pbmZvICphbGxvY19oZWFwX3BhZ2VzKAogICAgICAgICB6b25l ID0gem9uZV9oaTsKICAgICAgICAgZG8gewogICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGFyZ2V0 IG5vZGUgY2FuIHN1cHBvcnQgdGhlIGFsbG9jYXRpb24uICovCi0gICAgICAgICAgICBpZiAoICFh dmFpbFtub2RlXSB8fCAoYXZhaWxbbm9kZV1bem9uZV0gPCByZXF1ZXN0KSApCisgICAgICAgICAg ICBpZiAoICFhdmFpbFtub2RlXSB8fCAoYXZhaWxbbm9kZV1bem9uZV0gPCAoMVVMIDw8IG9yZGVy KSkgKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAvKiBGaW5kIHNt YWxsZXN0IG9yZGVyIHdoaWNoIGNhbiBzYXRpc2Z5IHRoZSByZXF1ZXN0LiAqLwogICAgICAgICAg ICAgZm9yICggaiA9IG9yZGVyOyBqIDw9IE1BWF9PUkRFUjsgaisrICkKICAgICAgICAgICAgICAg ICBpZiAoIChwZyA9IHBhZ2VfbGlzdF9yZW1vdmVfaGVhZCgmaGVhcChub2RlLCB6b25lLCBqKSkp ICkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICAgICAg cmV0dXJuIHBnOwogICAgICAgICB9IHdoaWxlICggem9uZS0tID4gem9uZV9sbyApOyAvKiBjYXJl ZnVsOiB1bnNpZ25lZCB6b25lIG1heSB3cmFwICovCiAKICAgICAgICAgaWYgKCAobWVtZmxhZ3Mg JiBNRU1GX2V4YWN0X25vZGUpICYmIHJlcV9ub2RlICE9IE5VTUFfTk9fTk9ERSApCi0gICAgICAg ICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAg IC8qIFBpY2sgbmV4dCBub2RlLiAqLwogICAgICAgICBpZiAoICFub2RlX2lzc2V0KG5vZGUsIG5v ZGVtYXNrKSApCkBAIC03OTQsNDYgKzc1OSw5NiBAQCBzdGF0aWMgc3RydWN0IHBhZ2VfaW5mbyAq YWxsb2NfaGVhcF9wYWdlcygKICAgICAgICAgewogICAgICAgICAgICAgLyogV2hlbiB3ZSBoYXZl IHRyaWVkIGFsbCBpbiBub2RlbWFzaywgd2UgZmFsbCBiYWNrIHRvIG90aGVycy4gKi8KICAgICAg ICAgICAgIGlmICggKG1lbWZsYWdzICYgTUVNRl9leGFjdF9ub2RlKSB8fCBub2RlbWFza19yZXRy eSsrICkKLSAgICAgICAgICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICAgICAgICAgICAgICBy ZXR1cm4gTlVMTDsKICAgICAgICAgICAgIG5vZGVzX2FuZG5vdChub2RlbWFzaywgbm9kZV9vbmxp bmVfbWFwLCBub2RlbWFzayk7CiAgICAgICAgICAgICBmaXJzdF9ub2RlID0gbm9kZSA9IGZpcnN0 X25vZGUobm9kZW1hc2spOwogICAgICAgICAgICAgaWYgKCBub2RlID49IE1BWF9OVU1OT0RFUyAp Ci0gICAgICAgICAgICAgICAgZ290byBub3RfZm91bmQ7CisgICAgICAgICAgICAgICAgcmV0dXJu IE5VTEw7CiAgICAgICAgIH0KICAgICB9Cit9CisKKy8qIEFsbG9jYXRlIDJeQG9yZGVyIGNvbnRp Z3VvdXMgcGFnZXMuICovCitzdGF0aWMgc3RydWN0IHBhZ2VfaW5mbyAqYWxsb2NfaGVhcF9wYWdl cygKKyAgICB1bnNpZ25lZCBpbnQgem9uZV9sbywgdW5zaWduZWQgaW50IHpvbmVfaGksCisgICAg dW5zaWduZWQgaW50IG9yZGVyLCB1bnNpZ25lZCBpbnQgbWVtZmxhZ3MsCisgICAgc3RydWN0IGRv bWFpbiAqZCkKK3sKKyAgICBub2RlaWRfdCBub2RlOworICAgIHVuc2lnbmVkIGludCBpLCBidWRk eV9vcmRlciwgem9uZSwgZmlyc3RfZGlydHk7CisgICAgdW5zaWduZWQgbG9uZyByZXF1ZXN0ID0g MVVMIDw8IG9yZGVyOworICAgIHN0cnVjdCBwYWdlX2luZm8gKnBnOworICAgIGJvb2wgbmVlZF90 bGJmbHVzaCA9IGZhbHNlOworICAgIHVpbnQzMl90IHRsYmZsdXNoX3RpbWVzdGFtcCA9IDA7CisK KyAgICAvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBiaXRzIGluIG1lbWZsYWdzIGZvciBu b2RlSUQuICovCisgICAgQlVJTERfQlVHX09OKChfTUVNRl9iaXRzIC0gX01FTUZfbm9kZSkgPCAo OCAqIHNpemVvZihub2RlaWRfdCkpKTsKKworICAgIEFTU0VSVCh6b25lX2xvIDw9IHpvbmVfaGkp OworICAgIEFTU0VSVCh6b25lX2hpIDwgTlJfWk9ORVMpOworCisgICAgaWYgKCB1bmxpa2VseShv cmRlciA+IE1BWF9PUkRFUikgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHNwaW5fbG9j aygmaGVhcF9sb2NrKTsKKworICAgIC8qCisgICAgICogQ2xhaW1lZCBtZW1vcnkgaXMgY29uc2lk ZXJlZCB1bmF2YWlsYWJsZSB1bmxlc3MgdGhlIHJlcXVlc3QKKyAgICAgKiBpcyBtYWRlIGJ5IGEg ZG9tYWluIHdpdGggc3VmZmljaWVudCB1bmNsYWltZWQgcGFnZXMuCisgICAgICovCisgICAgaWYg KCAob3V0c3RhbmRpbmdfY2xhaW1zICsgcmVxdWVzdCA+CisgICAgICAgICAgdG90YWxfYXZhaWxf cGFnZXMgKyB0bWVtX2ZyZWVhYmxlX3BhZ2VzKCkpICYmCisgICAgICAgICAgKChtZW1mbGFncyAm IE1FTUZfbm9fcmVmY291bnQpIHx8CisgICAgICAgICAgICFkIHx8IGQtPm91dHN0YW5kaW5nX3Bh Z2VzIDwgcmVxdWVzdCkgKQorICAgIHsKKyAgICAgICAgc3Bpbl91bmxvY2soJmhlYXBfbG9jayk7 CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotIHRyeV90bWVtOgotICAgIC8qIFRyeSB0 byBmcmVlIG1lbW9yeSBmcm9tIHRtZW0gKi8KLSAgICBpZiAoIChwZyA9IHRtZW1fcmVsaW5xdWlz aF9wYWdlcyhvcmRlciwgbWVtZmxhZ3MpKSAhPSBOVUxMICkKKyAgICAvKgorICAgICAqIFRNRU06 IFdoZW4gYXZhaWxhYmxlIG1lbW9yeSBpcyBzY2FyY2UgZHVlIHRvIHRtZW0gYWJzb3JiaW5nIGl0 LCBhbGxvdworICAgICAqIG9ubHkgbWlkLXNpemUgYWxsb2NhdGlvbnMgdG8gYXZvaWQgd29yc3Qg b2YgZnJhZ21lbnRhdGlvbiBpc3N1ZXMuCisgICAgICogT3RoZXJzIHRyeSB0bWVtIHBvb2xzIHRo ZW4gZmFpbC4gIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHVudGlsIGFsbAorICAgICAqIHBvc3QtZG9t MC1jcmVhdGlvbi1tdWx0aS1wYWdlIGFsbG9jYXRpb25zIGNhbiBiZSBlbGltaW5hdGVkLgorICAg ICAqLworICAgIGlmICggKChvcmRlciA9PSAwKSB8fCAob3JkZXIgPj0gOSkpICYmCisgICAgICAg ICAodG90YWxfYXZhaWxfcGFnZXMgPD0gbWlkc2l6ZV9hbGxvY196b25lX3BhZ2VzKSAmJgorICAg ICAgICAgdG1lbV9mcmVlYWJsZV9wYWdlcygpICkKICAgICB7Ci0gICAgICAgIC8qIHJlYXNzaWdu aW5nIGFuIGFscmVhZHkgYWxsb2NhdGVkIGFub255bW91cyBoZWFwIHBhZ2UgKi8KKyAgICAgICAg LyogVHJ5IHRvIGZyZWUgbWVtb3J5IGZyb20gdG1lbS4gKi8KKyAgICAgICAgcGcgPSB0bWVtX3Jl bGlucXVpc2hfcGFnZXMob3JkZXIsIG1lbWZsYWdzKTsKICAgICAgICAgc3Bpbl91bmxvY2soJmhl YXBfbG9jayk7CiAgICAgICAgIHJldHVybiBwZzsKICAgICB9CiAKLSBub3RfZm91bmQ6Ci0gICAg LyogTm8gc3VpdGFibGUgbWVtb3J5IGJsb2Nrcy4gRmFpbCB0aGUgcmVxdWVzdC4gKi8KLSAgICBz cGluX3VubG9jaygmaGVhcF9sb2NrKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICBwZyA9IGdldF9m cmVlX2J1ZGR5KHpvbmVfbG8sIHpvbmVfaGksIG9yZGVyLCBtZW1mbGFncywgZCk7CisgICAgaWYg KCAhcGcgKQorICAgIHsKKyAgICAgICAgLyogTm8gc3VpdGFibGUgbWVtb3J5IGJsb2Nrcy4gRmFp bCB0aGUgcmVxdWVzdC4gKi8KKyAgICAgICAgc3Bpbl91bmxvY2soJmhlYXBfbG9jayk7CisgICAg ICAgIHJldHVybiBOVUxMOworICAgIH0KIAotIGZvdW5kOiAKKyAgICBub2RlID0gcGh5c190b19u aWQocGFnZV90b19tYWRkcihwZykpOworICAgIHpvbmUgPSBwYWdlX3RvX3pvbmUocGcpOworICAg IGJ1ZGR5X29yZGVyID0gUEZOX09SREVSKHBnKTsKIAogICAgIGZpcnN0X2RpcnR5ID0gcGctPnUu ZnJlZS5maXJzdF9kaXJ0eTsKIAogICAgIC8qIFdlIG1heSBoYXZlIHRvIGhhbHZlIHRoZSBjaHVu ayBhIG51bWJlciBvZiB0aW1lcy4gKi8KLSAgICB3aGlsZSAoIGogIT0gb3JkZXIgKQorICAgIHdo aWxlICggYnVkZHlfb3JkZXIgIT0gb3JkZXIgKQogICAgIHsKLSAgICAgICAgai0tOwotICAgICAg ICBwYWdlX2xpc3RfYWRkX3NjcnViKHBnLCBub2RlLCB6b25lLCBqLAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICgxVSA8PCBqKSA+IGZpcnN0X2RpcnR5ID8KKyAgICAgICAgYnVkZHlfb3Jk ZXItLTsKKyAgICAgICAgcGFnZV9saXN0X2FkZF9zY3J1YihwZywgbm9kZSwgem9uZSwgYnVkZHlf b3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFVIDw8IGJ1ZGR5X29yZGVyKSA+ IGZpcnN0X2RpcnR5ID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9kaXJ0eSA6 IElOVkFMSURfRElSVFlfSURYKTsKLSAgICAgICAgcGcgKz0gMVUgPDwgajsKKyAgICAgICAgcGcg Kz0gMVUgPDwgYnVkZHlfb3JkZXI7CiAKICAgICAgICAgaWYgKCBmaXJzdF9kaXJ0eSAhPSBJTlZB TElEX0RJUlRZX0lEWCApCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIEFkanVzdCBmaXJzdF9k aXJ0eSAqLwotICAgICAgICAgICAgaWYgKCBmaXJzdF9kaXJ0eSA+PSAxVSA8PCBqICkKLSAgICAg ICAgICAgICAgICBmaXJzdF9kaXJ0eSAtPSAxVSA8PCBqOworICAgICAgICAgICAgaWYgKCBmaXJz dF9kaXJ0eSA+PSAxVSA8PCBidWRkeV9vcmRlciApCisgICAgICAgICAgICAgICAgZmlyc3RfZGly dHkgLT0gMVUgPDwgYnVkZHlfb3JkZXI7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg ICAgZmlyc3RfZGlydHkgPSAwOyAvKiBXZSd2ZSBtb3ZlZCBwYXN0IG9yaWdpbmFsIGZpcnN0X2Rp cnR5ICovCiAgICAgICAgIH0KLS0gCjEuOC4zLjEKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBs aXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK