From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: [PATCH v7 3/9] mm: Extract allocation loop from alloc_heap_pages() Date: Tue, 8 Aug 2017 17:45:01 -0400 Message-ID: <1502228707-31883-4-git-send-email-boris.ostrovsky@oracle.com> References: <1502228707-31883-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: <1502228707-31883-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, julien.grall@arm.com, jbeulich@suse.com, Boris Ostrovsky List-Id: xen-devel@lists.xenproject.org VGhpcyB3aWxsIG1ha2UgY29kZSBhIGJpdCBtb3JlIHJlYWRhYmxlLCBlc3BlY2lhbGx5IHdpdGgg Y2hhbmdlcyB0aGF0CndpbGwgYmUgaW50cm9kdWNlZCBpbiBzdWJzZXF1ZW50IHBhdGNoZXMuCgpT aWduZWQtb2ZmLWJ5OiBCb3JpcyBPc3Ryb3Zza3kgPGJvcmlzLm9zdHJvdnNreUBvcmFjbGUuY29t PgpBY2tlZC1ieTogSmFuIEJldWxpY2ggPGpiZXVsaWNoQHN1c2UuY29tPgotLS0KIHhlbi9jb21t b24vcGFnZV9hbGxvYy5jIHwgMTM5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t LS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDc3IGluc2VydGlvbnMoKyksIDYyIGRlbGV0 aW9ucygtKQoKZGlmZiAtLWdpdCBhL3hlbi9jb21tb24vcGFnZV9hbGxvYy5jIGIveGVuL2NvbW1v bi9wYWdlX2FsbG9jLmMKaW5kZXggYjg1N2E0NC4uNTkyMGU4NyAxMDA2NDQKLS0tIGEveGVuL2Nv bW1vbi9wYWdlX2FsbG9jLmMKKysrIGIveGVuL2NvbW1vbi9wYWdlX2FsbG9jLmMKQEAgLTY5Nywy MiArNjk3LDE1IEBAIHN0YXRpYyB2b2lkIHBhZ2VfbGlzdF9hZGRfc2NydWIoc3RydWN0IHBhZ2Vf aW5mbyAqcGcsIHVuc2lnbmVkIGludCBub2RlLAogICAgICAgICBwYWdlX2xpc3RfYWRkKHBnLCAm aGVhcChub2RlLCB6b25lLCBvcmRlcikpOwogfQogCi0vKiBBbGxvY2F0ZSAyXkBvcmRlciBjb250 aWd1b3VzIHBhZ2VzLiAqLwotc3RhdGljIHN0cnVjdCBwYWdlX2luZm8gKmFsbG9jX2hlYXBfcGFn ZXMoCi0gICAgdW5zaWduZWQgaW50IHpvbmVfbG8sIHVuc2lnbmVkIGludCB6b25lX2hpLAotICAg IHVuc2lnbmVkIGludCBvcmRlciwgdW5zaWduZWQgaW50IG1lbWZsYWdzLAotICAgIHN0cnVjdCBk b21haW4gKmQpCitzdGF0aWMgc3RydWN0IHBhZ2VfaW5mbyAqZ2V0X2ZyZWVfYnVkZHkodW5zaWdu ZWQgaW50IHpvbmVfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgaW50IHpvbmVfaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgaW50IG9yZGVyLCB1bnNpZ25lZCBpbnQgbWVtZmxhZ3MsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGRvbWFpbiAqZCkK IHsKLSAgICB1bnNpZ25lZCBpbnQgaSwgaiwgem9uZSA9IDAsIG5vZGVtYXNrX3JldHJ5ID0gMCwg Zmlyc3RfZGlydHk7CiAgICAgbm9kZWlkX3QgZmlyc3Rfbm9kZSwgbm9kZSA9IE1FTUZfZ2V0X25v ZGUobWVtZmxhZ3MpLCByZXFfbm9kZSA9IG5vZGU7Ci0gICAgdW5zaWduZWQgbG9uZyByZXF1ZXN0 ID0gMVVMIDw8IG9yZGVyOworICAgIG5vZGVtYXNrX3Qgbm9kZW1hc2sgPSBkID8gZC0+bm9kZV9h ZmZpbml0eSA6IG5vZGVfb25saW5lX21hcDsKKyAgICB1bnNpZ25lZCBpbnQgaiwgem9uZSwgbm9k ZW1hc2tfcmV0cnkgPSAwOwogICAgIHN0cnVjdCBwYWdlX2luZm8gKnBnOwotICAgIG5vZGVtYXNr X3Qgbm9kZW1hc2sgPSAoZCAhPSBOVUxMICkgPyBkLT5ub2RlX2FmZmluaXR5IDogbm9kZV9vbmxp bmVfbWFwOwotICAgIGJvb2xfdCBuZWVkX3RsYmZsdXNoID0gMDsKLSAgICB1aW50MzJfdCB0bGJm bHVzaF90aW1lc3RhbXAgPSAwOwotCi0gICAgLyogTWFrZSBzdXJlIHRoZXJlIGFyZSBlbm91Z2gg Yml0cyBpbiBtZW1mbGFncyBmb3Igbm9kZUlELiAqLwotICAgIEJVSUxEX0JVR19PTigoX01FTUZf Yml0cyAtIF9NRU1GX25vZGUpIDwgKDggKiBzaXplb2Yobm9kZWlkX3QpKSk7CiAKICAgICBpZiAo IG5vZGUgPT0gTlVNQV9OT19OT0RFICkKICAgICB7CkBAIC03MjgsMzQgKzcyMSw2IEBAIHN0YXRp YyBzdHJ1Y3QgcGFnZV9pbmZvICphbGxvY19oZWFwX3BhZ2VzKAogICAgIGZpcnN0X25vZGUgPSBu b2RlOwogCiAgICAgQVNTRVJUKG5vZGUgPCBNQVhfTlVNTk9ERVMpOwotICAgIEFTU0VSVCh6b25l X2xvIDw9IHpvbmVfaGkpOwotICAgIEFTU0VSVCh6b25lX2hpIDwgTlJfWk9ORVMpOwotCi0gICAg aWYgKCB1bmxpa2VseShvcmRlciA+IE1BWF9PUkRFUikgKQotICAgICAgICByZXR1cm4gTlVMTDsK LQotICAgIHNwaW5fbG9jaygmaGVhcF9sb2NrKTsKLQotICAgIC8qCi0gICAgICogQ2xhaW1lZCBt ZW1vcnkgaXMgY29uc2lkZXJlZCB1bmF2YWlsYWJsZSB1bmxlc3MgdGhlIHJlcXVlc3QKLSAgICAg KiBpcyBtYWRlIGJ5IGEgZG9tYWluIHdpdGggc3VmZmljaWVudCB1bmNsYWltZWQgcGFnZXMuCi0g ICAgICovCi0gICAgaWYgKCAob3V0c3RhbmRpbmdfY2xhaW1zICsgcmVxdWVzdCA+Ci0gICAgICAg ICAgdG90YWxfYXZhaWxfcGFnZXMgKyB0bWVtX2ZyZWVhYmxlX3BhZ2VzKCkpICYmCi0gICAgICAg ICAgKChtZW1mbGFncyAmIE1FTUZfbm9fcmVmY291bnQpIHx8Ci0gICAgICAgICAgICFkIHx8IGQt Pm91dHN0YW5kaW5nX3BhZ2VzIDwgcmVxdWVzdCkgKQotICAgICAgICBnb3RvIG5vdF9mb3VuZDsK LQotICAgIC8qCi0gICAgICogVE1FTTogV2hlbiBhdmFpbGFibGUgbWVtb3J5IGlzIHNjYXJjZSBk dWUgdG8gdG1lbSBhYnNvcmJpbmcgaXQsIGFsbG93Ci0gICAgICogb25seSBtaWQtc2l6ZSBhbGxv Y2F0aW9ucyB0byBhdm9pZCB3b3JzdCBvZiBmcmFnbWVudGF0aW9uIGlzc3Vlcy4KLSAgICAgKiBP dGhlcnMgdHJ5IHRtZW0gcG9vbHMgdGhlbiBmYWlsLiAgVGhpcyBpcyBhIHdvcmthcm91bmQgdW50 aWwgYWxsCi0gICAgICogcG9zdC1kb20wLWNyZWF0aW9uLW11bHRpLXBhZ2UgYWxsb2NhdGlvbnMg Y2FuIGJlIGVsaW1pbmF0ZWQuCi0gICAgICovCi0gICAgaWYgKCAoKG9yZGVyID09IDApIHx8IChv cmRlciA+PSA5KSkgJiYKLSAgICAgICAgICh0b3RhbF9hdmFpbF9wYWdlcyA8PSBtaWRzaXplX2Fs bG9jX3pvbmVfcGFnZXMpICYmCi0gICAgICAgICB0bWVtX2ZyZWVhYmxlX3BhZ2VzKCkgKQotICAg ICAgICBnb3RvIHRyeV90bWVtOwogCiAgICAgLyoKICAgICAgKiBTdGFydCB3aXRoIHJlcXVlc3Rl ZCBub2RlLCBidXQgZXhoYXVzdCBhbGwgbm9kZSBtZW1vcnkgaW4gcmVxdWVzdGVkIApAQCAtNzY3 LDE3ICs3MzIsMTcgQEAgc3RhdGljIHN0cnVjdCBwYWdlX2luZm8gKmFsbG9jX2hlYXBfcGFnZXMo CiAgICAgICAgIHpvbmUgPSB6b25lX2hpOwogICAgICAgICBkbyB7CiAgICAgICAgICAgICAvKiBD aGVjayBpZiB0YXJnZXQgbm9kZSBjYW4gc3VwcG9ydCB0aGUgYWxsb2NhdGlvbi4gKi8KLSAgICAg ICAgICAgIGlmICggIWF2YWlsW25vZGVdIHx8IChhdmFpbFtub2RlXVt6b25lXSA8IHJlcXVlc3Qp ICkKKyAgICAgICAgICAgIGlmICggIWF2YWlsW25vZGVdIHx8IChhdmFpbFtub2RlXVt6b25lXSA8 ICgxVUwgPDwgb3JkZXIpKSApCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAg ICAgIC8qIEZpbmQgc21hbGxlc3Qgb3JkZXIgd2hpY2ggY2FuIHNhdGlzZnkgdGhlIHJlcXVlc3Qu ICovCiAgICAgICAgICAgICBmb3IgKCBqID0gb3JkZXI7IGogPD0gTUFYX09SREVSOyBqKysgKQog ICAgICAgICAgICAgICAgIGlmICggKHBnID0gcGFnZV9saXN0X3JlbW92ZV9oZWFkKCZoZWFwKG5v ZGUsIHpvbmUsIGopKSkgKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAg ICAgICAgICAgICAgICByZXR1cm4gcGc7CiAgICAgICAgIH0gd2hpbGUgKCB6b25lLS0gPiB6b25l X2xvICk7IC8qIGNhcmVmdWw6IHVuc2lnbmVkIHpvbmUgbWF5IHdyYXAgKi8KIAogICAgICAgICBp ZiAoIChtZW1mbGFncyAmIE1FTUZfZXhhY3Rfbm9kZSkgJiYgcmVxX25vZGUgIT0gTlVNQV9OT19O T0RFICkKLSAgICAgICAgICAgIGdvdG8gbm90X2ZvdW5kOworICAgICAgICAgICAgcmV0dXJuIE5V TEw7CiAKICAgICAgICAgLyogUGljayBuZXh0IG5vZGUuICovCiAgICAgICAgIGlmICggIW5vZGVf aXNzZXQobm9kZSwgbm9kZW1hc2spICkKQEAgLTc5NCw0NiArNzU5LDk2IEBAIHN0YXRpYyBzdHJ1 Y3QgcGFnZV9pbmZvICphbGxvY19oZWFwX3BhZ2VzKAogICAgICAgICB7CiAgICAgICAgICAgICAv KiBXaGVuIHdlIGhhdmUgdHJpZWQgYWxsIGluIG5vZGVtYXNrLCB3ZSBmYWxsIGJhY2sgdG8gb3Ro ZXJzLiAqLwogICAgICAgICAgICAgaWYgKCAobWVtZmxhZ3MgJiBNRU1GX2V4YWN0X25vZGUpIHx8 IG5vZGVtYXNrX3JldHJ5KysgKQotICAgICAgICAgICAgICAgIGdvdG8gbm90X2ZvdW5kOworICAg ICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgbm9kZXNfYW5kbm90KG5vZGVt YXNrLCBub2RlX29ubGluZV9tYXAsIG5vZGVtYXNrKTsKICAgICAgICAgICAgIGZpcnN0X25vZGUg PSBub2RlID0gZmlyc3Rfbm9kZShub2RlbWFzayk7CiAgICAgICAgICAgICBpZiAoIG5vZGUgPj0g TUFYX05VTU5PREVTICkKLSAgICAgICAgICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICAgICAg ICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KK30KKworLyogQWxsb2NhdGUg Ml5Ab3JkZXIgY29udGlndW91cyBwYWdlcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZV9pbmZvICph bGxvY19oZWFwX3BhZ2VzKAorICAgIHVuc2lnbmVkIGludCB6b25lX2xvLCB1bnNpZ25lZCBpbnQg em9uZV9oaSwKKyAgICB1bnNpZ25lZCBpbnQgb3JkZXIsIHVuc2lnbmVkIGludCBtZW1mbGFncywK KyAgICBzdHJ1Y3QgZG9tYWluICpkKQoreworICAgIG5vZGVpZF90IG5vZGU7CisgICAgdW5zaWdu ZWQgaW50IGksIGJ1ZGR5X29yZGVyLCB6b25lLCBmaXJzdF9kaXJ0eTsKKyAgICB1bnNpZ25lZCBs b25nIHJlcXVlc3QgPSAxVUwgPDwgb3JkZXI7CisgICAgc3RydWN0IHBhZ2VfaW5mbyAqcGc7Cisg ICAgYm9vbCBuZWVkX3RsYmZsdXNoID0gZmFsc2U7CisgICAgdWludDMyX3QgdGxiZmx1c2hfdGlt ZXN0YW1wID0gMDsKKworICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGJpdHMgaW4g bWVtZmxhZ3MgZm9yIG5vZGVJRC4gKi8KKyAgICBCVUlMRF9CVUdfT04oKF9NRU1GX2JpdHMgLSBf TUVNRl9ub2RlKSA8ICg4ICogc2l6ZW9mKG5vZGVpZF90KSkpOworCisgICAgQVNTRVJUKHpvbmVf bG8gPD0gem9uZV9oaSk7CisgICAgQVNTRVJUKHpvbmVfaGkgPCBOUl9aT05FUyk7CisKKyAgICBp ZiAoIHVubGlrZWx5KG9yZGVyID4gTUFYX09SREVSKSApCisgICAgICAgIHJldHVybiBOVUxMOwor CisgICAgc3Bpbl9sb2NrKCZoZWFwX2xvY2spOworCisgICAgLyoKKyAgICAgKiBDbGFpbWVkIG1l bW9yeSBpcyBjb25zaWRlcmVkIHVuYXZhaWxhYmxlIHVubGVzcyB0aGUgcmVxdWVzdAorICAgICAq IGlzIG1hZGUgYnkgYSBkb21haW4gd2l0aCBzdWZmaWNpZW50IHVuY2xhaW1lZCBwYWdlcy4KKyAg ICAgKi8KKyAgICBpZiAoIChvdXRzdGFuZGluZ19jbGFpbXMgKyByZXF1ZXN0ID4KKyAgICAgICAg ICB0b3RhbF9hdmFpbF9wYWdlcyArIHRtZW1fZnJlZWFibGVfcGFnZXMoKSkgJiYKKyAgICAgICAg ICAoKG1lbWZsYWdzICYgTUVNRl9ub19yZWZjb3VudCkgfHwKKyAgICAgICAgICAgIWQgfHwgZC0+ b3V0c3RhbmRpbmdfcGFnZXMgPCByZXF1ZXN0KSApCisgICAgeworICAgICAgICBzcGluX3VubG9j aygmaGVhcF9sb2NrKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gdHJ5X3RtZW06 Ci0gICAgLyogVHJ5IHRvIGZyZWUgbWVtb3J5IGZyb20gdG1lbSAqLwotICAgIGlmICggKHBnID0g dG1lbV9yZWxpbnF1aXNoX3BhZ2VzKG9yZGVyLCBtZW1mbGFncykpICE9IE5VTEwgKQorICAgIC8q CisgICAgICogVE1FTTogV2hlbiBhdmFpbGFibGUgbWVtb3J5IGlzIHNjYXJjZSBkdWUgdG8gdG1l bSBhYnNvcmJpbmcgaXQsIGFsbG93CisgICAgICogb25seSBtaWQtc2l6ZSBhbGxvY2F0aW9ucyB0 byBhdm9pZCB3b3JzdCBvZiBmcmFnbWVudGF0aW9uIGlzc3Vlcy4KKyAgICAgKiBPdGhlcnMgdHJ5 IHRtZW0gcG9vbHMgdGhlbiBmYWlsLiAgVGhpcyBpcyBhIHdvcmthcm91bmQgdW50aWwgYWxsCisg ICAgICogcG9zdC1kb20wLWNyZWF0aW9uLW11bHRpLXBhZ2UgYWxsb2NhdGlvbnMgY2FuIGJlIGVs aW1pbmF0ZWQuCisgICAgICovCisgICAgaWYgKCAoKG9yZGVyID09IDApIHx8IChvcmRlciA+PSA5 KSkgJiYKKyAgICAgICAgICh0b3RhbF9hdmFpbF9wYWdlcyA8PSBtaWRzaXplX2FsbG9jX3pvbmVf cGFnZXMpICYmCisgICAgICAgICB0bWVtX2ZyZWVhYmxlX3BhZ2VzKCkgKQogICAgIHsKLSAgICAg ICAgLyogcmVhc3NpZ25pbmcgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgYW5vbnltb3VzIGhlYXAgcGFn ZSAqLworICAgICAgICAvKiBUcnkgdG8gZnJlZSBtZW1vcnkgZnJvbSB0bWVtLiAqLworICAgICAg ICBwZyA9IHRtZW1fcmVsaW5xdWlzaF9wYWdlcyhvcmRlciwgbWVtZmxhZ3MpOwogICAgICAgICBz cGluX3VubG9jaygmaGVhcF9sb2NrKTsKICAgICAgICAgcmV0dXJuIHBnOwogICAgIH0KIAotIG5v dF9mb3VuZDoKLSAgICAvKiBObyBzdWl0YWJsZSBtZW1vcnkgYmxvY2tzLiBGYWlsIHRoZSByZXF1 ZXN0LiAqLwotICAgIHNwaW5fdW5sb2NrKCZoZWFwX2xvY2spOwotICAgIHJldHVybiBOVUxMOwor ICAgIHBnID0gZ2V0X2ZyZWVfYnVkZHkoem9uZV9sbywgem9uZV9oaSwgb3JkZXIsIG1lbWZsYWdz LCBkKTsKKyAgICBpZiAoICFwZyApCisgICAgeworICAgICAgICAvKiBObyBzdWl0YWJsZSBtZW1v cnkgYmxvY2tzLiBGYWlsIHRoZSByZXF1ZXN0LiAqLworICAgICAgICBzcGluX3VubG9jaygmaGVh cF9sb2NrKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gZm91bmQ6IAorICAgIG5v ZGUgPSBwaHlzX3RvX25pZChwYWdlX3RvX21hZGRyKHBnKSk7CisgICAgem9uZSA9IHBhZ2VfdG9f em9uZShwZyk7CisgICAgYnVkZHlfb3JkZXIgPSBQRk5fT1JERVIocGcpOwogCiAgICAgZmlyc3Rf ZGlydHkgPSBwZy0+dS5mcmVlLmZpcnN0X2RpcnR5OwogCiAgICAgLyogV2UgbWF5IGhhdmUgdG8g aGFsdmUgdGhlIGNodW5rIGEgbnVtYmVyIG9mIHRpbWVzLiAqLwotICAgIHdoaWxlICggaiAhPSBv cmRlciApCisgICAgd2hpbGUgKCBidWRkeV9vcmRlciAhPSBvcmRlciApCiAgICAgewotICAgICAg ICBqLS07Ci0gICAgICAgIHBhZ2VfbGlzdF9hZGRfc2NydWIocGcsIG5vZGUsIHpvbmUsIGosCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFVIDw8IGopID4gZmlyc3RfZGlydHkgPworICAg ICAgICBidWRkeV9vcmRlci0tOworICAgICAgICBwYWdlX2xpc3RfYWRkX3NjcnViKHBnLCBub2Rl LCB6b25lLCBidWRkeV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMVUgPDwg YnVkZHlfb3JkZXIpID4gZmlyc3RfZGlydHkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAg IGZpcnN0X2RpcnR5IDogSU5WQUxJRF9ESVJUWV9JRFgpOwotICAgICAgICBwZyArPSAxVSA8PCBq OworICAgICAgICBwZyArPSAxVSA8PCBidWRkeV9vcmRlcjsKIAogICAgICAgICBpZiAoIGZpcnN0 X2RpcnR5ICE9IElOVkFMSURfRElSVFlfSURYICkKICAgICAgICAgewogICAgICAgICAgICAgLyog QWRqdXN0IGZpcnN0X2RpcnR5ICovCi0gICAgICAgICAgICBpZiAoIGZpcnN0X2RpcnR5ID49IDFV IDw8IGogKQotICAgICAgICAgICAgICAgIGZpcnN0X2RpcnR5IC09IDFVIDw8IGo7CisgICAgICAg ICAgICBpZiAoIGZpcnN0X2RpcnR5ID49IDFVIDw8IGJ1ZGR5X29yZGVyICkKKyAgICAgICAgICAg ICAgICBmaXJzdF9kaXJ0eSAtPSAxVSA8PCBidWRkeV9vcmRlcjsKICAgICAgICAgICAgIGVsc2UK ICAgICAgICAgICAgICAgICBmaXJzdF9kaXJ0eSA9IDA7IC8qIFdlJ3ZlIG1vdmVkIHBhc3Qgb3Jp Z2luYWwgZmlyc3RfZGlydHkgKi8KICAgICAgICAgfQotLSAKMS44LjMuMQoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxp c3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZl bAo=