From mboxrd@z Thu Jan 1 00:00:00 1970 From: George Dunlap Subject: [PATCH v5 10/10] golang/xenlight: Implement cpupool operations Date: Wed, 5 Apr 2017 17:05:54 +0100 Message-ID: <1491408354-9643-11-git-send-email-george.dunlap@citrix.com> References: <1491408354-9643-1-git-send-email-george.dunlap@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvnbh-0006On-6C for xen-devel@lists.xenproject.org; Wed, 05 Apr 2017 16:16:29 +0000 In-Reply-To: <1491408354-9643-1-git-send-email-george.dunlap@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Ronald Rojas , Wei Liu , George Dunlap , Ian Jackson List-Id: xen-devel@lists.xenproject.org RnJvbTogUm9uYWxkIFJvamFzIDxyb25sYWRyZWRAZ21haWwuY29tPgoKSW5jbHVkZSBzb21lIHVz ZWZ1bCAiVXRpbGl0eSIgZnVuY3Rpb25zOgotIENwdXBvb2xGaW5kQnlOYW1lCi0gQ3B1cG9vbE1h a2VGcmVlCgpTdGlsbCBuZWVkIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoK LSBsaWJ4bF9jcHVwb29sX3JlbmFtZQotIGxpYnhsX2NwdXBvb2xfY3B1YWRkX25vZGUKLSBsaWJ4 bF9jcHVwb29sX2NwdXJlbW92ZV9ub2RlCi0gbGlieGxfY3B1cG9vbF9tb3ZlZG9tYWluCgpTaWdu ZWQtb2ZmLWJ5OiBHZW9yZ2UgRHVubGFwIDxnZW9yZ2UuZHVubGFwQGNpdHJpeC5jb20+ClNpZ25l ZC1vZmYtYnk6IFJvbmFsZCBSb2phcyA8cm9ubGFkcmVkQGdtYWlsLmNvbT4KLS0tCkNDOiBJYW4g SmFja3NvbiA8aWFuLmphY2tzb25AY2l0cml4LmNvbT4KQ0M6IFdlaSBMaXUgPHdlaS5saXUyQGNp dHJpeC5jb20+CgpDaGFuZ2VzIHNpbmNlIHY0OgogLSBVc2UgTElCWExfQ1BVUE9PTF9QT09MSURf QU5ZIHJhdGhlciB0aGFuIG1hZ2ljIGNvbnN0YW50ICcwJyB0bwogICBpbmRpY2F0ZSBjaG9vc2lu ZyBhbnkgY3B1IHBvb2xpZAogLSBJbXBsZW1lbnQgbWlzc2luZyBjcHVwb29sIGZ1bmN0aW9uczog cmVuYW1lLCBjcHVhZGRfbm9kZSwKICAgY3B1cmVtb3ZlX25vZGUsIGFuZCBtb3ZlZG9tYWluCi0t LQogdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L3hlbmxpZ2h0LmdvIHwgMzA1ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdlZCwgMzA1IGluc2VydGlvbnMo KykKCmRpZmYgLS1naXQgYS90b29scy9nb2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28gYi90b29s cy9nb2xhbmcveGVubGlnaHQveGVubGlnaHQuZ28KaW5kZXggODJhZWIyMi4uOWMzN2U1OSAxMDA2 NDQKLS0tIGEvdG9vbHMvZ29sYW5nL3hlbmxpZ2h0L3hlbmxpZ2h0LmdvCisrKyBiL3Rvb2xzL2dv bGFuZy94ZW5saWdodC94ZW5saWdodC5nbwpAQCAtMzc1LDYgKzM3NSwzMTEgQEAgZnVuYyBTY2hl ZHVsZXJGcm9tU3RyaW5nKG5hbWUgc3RyaW5nKSAocyBTY2hlZHVsZXIsIGVyciBlcnJvcikgewog CXJldHVybgogfQogCisvLyBsaWJ4bF9jcHVwb29saW5mbyA9IFN0cnVjdCgiY3B1cG9vbGluZm8i LCBbCisvLyAgICAgKCJwb29saWQiLCAgICAgIHVpbnQzMiksCisvLyAgICAgKCJwb29sX25hbWUi LCAgIHN0cmluZyksCisvLyAgICAgKCJzY2hlZCIsICAgICAgIGxpYnhsX3NjaGVkdWxlciksCisv LyAgICAgKCJuX2RvbSIsICAgICAgIHVpbnQzMiksCisvLyAgICAgKCJjcHVtYXAiLCAgICAgIGxp YnhsX2JpdG1hcCkKKy8vICAgICBdLCBkaXI9RElSX09VVCkKKwordHlwZSBDcHVwb29sSW5mbyBz dHJ1Y3QgeworCVBvb2xpZCAgICAgIHVpbnQzMgorCVBvb2xOYW1lICAgIHN0cmluZworCVNjaGVk dWxlciAgIFNjaGVkdWxlcgorCURvbWFpbkNvdW50IGludAorCUNwdW1hcCAgICAgIEJpdG1hcAor fQorCitmdW5jIChjY2kgQy5saWJ4bF9jcHVwb29saW5mbykgdG9HbygpIChnY2kgQ3B1cG9vbElu Zm8pIHsKKwlnY2kuUG9vbGlkID0gdWludDMyKGNjaS5wb29saWQpCisJZ2NpLlBvb2xOYW1lID0g Qy5Hb1N0cmluZyhjY2kucG9vbF9uYW1lKQorCWdjaS5TY2hlZHVsZXIgPSBTY2hlZHVsZXIoY2Np LnNjaGVkKQorCWdjaS5Eb21haW5Db3VudCA9IGludChjY2kubl9kb20pCisJZ2NpLkNwdW1hcCA9 IGNjaS5jcHVtYXAudG9HbygpCisKKwlyZXR1cm4KK30KKworLy8gbGlieGxfY3B1cG9vbGluZm8g KiBsaWJ4bF9saXN0X2NwdXBvb2wobGlieGxfY3R4KiwgaW50ICpuYl9wb29sX291dCk7CisvLyB2 b2lkIGxpYnhsX2NwdXBvb2xpbmZvX2xpc3RfZnJlZShsaWJ4bF9jcHVwb29saW5mbyAqbGlzdCwg aW50IG5iX3Bvb2wpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBMaXN0Q3B1cG9vbCgpIChsaXN0IFtd Q3B1cG9vbEluZm8pIHsKKwllcnIgOj0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7 CisJCXJldHVybgorCX0KKworCXZhciBuYlBvb2wgQy5pbnQKKworCWNfY3B1cG9vbF9saXN0IDo9 IEMubGlieGxfbGlzdF9jcHVwb29sKEN0eC5jdHgsICZuYlBvb2wpCisKKwlkZWZlciBDLmxpYnhs X2NwdXBvb2xpbmZvX2xpc3RfZnJlZShjX2NwdXBvb2xfbGlzdCwgbmJQb29sKQorCisJaWYgaW50 KG5iUG9vbCkgPT0gMCB7CisJCXJldHVybgorCX0KKworCS8vIE1hZ2ljCisJY3B1cG9vbExpc3RT bGljZSA6PSAoKlsxIDw8IDMwXUMubGlieGxfY3B1cG9vbGluZm8pKHVuc2FmZS5Qb2ludGVyKGNf Y3B1cG9vbF9saXN0KSlbOm5iUG9vbDpuYlBvb2xdCisJZm9yIGkgOj0gcmFuZ2UgY3B1cG9vbExp c3RTbGljZSB7CisJCWluZm8gOj0gY3B1cG9vbExpc3RTbGljZVtpXS50b0dvKCkKKwkJbGlzdCA9 IGFwcGVuZChsaXN0LCBpbmZvKQorCX0KKworCXJldHVybgorfQorCisvLyBpbnQgbGlieGxfY3B1 cG9vbF9pbmZvKGxpYnhsX2N0eCAqY3R4LCBsaWJ4bF9jcHVwb29saW5mbyAqaW5mbywgdWludDMy X3QgcG9vbGlkKTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbEluZm8oUG9vbGlkIHVpbnQz MikgKHBvb2wgQ3B1cG9vbEluZm8pIHsKKwllcnIgOj0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJy ICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXZhciBjX2NwdXBvb2wgQy5saWJ4bF9jcHVwb29s aW5mbworCisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9pbmZvKEN0eC5jdHgsICZjX2NwdXBvb2ws IEMudWludDMyX3QoUG9vbGlkKSkKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IEVycm9yKC1yZXQp CisJCXJldHVybgorCX0KKwlkZWZlciBDLmxpYnhsX2NwdXBvb2xpbmZvX2Rpc3Bvc2UoJmNfY3B1 cG9vbCkKKworCXBvb2wgPSBjX2NwdXBvb2wudG9HbygpCisKKwlyZXR1cm4KK30KKworLy8gaW50 IGxpYnhsX2NwdXBvb2xfY3JlYXRlKGxpYnhsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLAor Ly8gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX3NjaGVkdWxlciBzY2hlZCwKKy8vICAg ICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9iaXRtYXAgY3B1bWFwLCBsaWJ4bF91dWlkICp1 dWlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwb29saWQpOworLy8g RklYTUU6IHV1aWQKKy8vIEZJWE1FOiBTZXR0aW5nIHBvb2xpZAorZnVuYyAoQ3R4ICpDb250ZXh0 KSBDcHVwb29sQ3JlYXRlKE5hbWUgc3RyaW5nLCBTY2hlZHVsZXIgU2NoZWR1bGVyLCBDcHVtYXAg Qml0bWFwKSAoZXJyIGVycm9yLCBQb29saWQgdWludDMyKSB7CisJZXJyID0gQ3R4LkNoZWNrT3Bl bigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXBvb2xpZCA6PSBDLnVpbnQz Ml90KEMuTElCWExfQ1BVUE9PTF9QT09MSURfQU5ZKQorCW5hbWUgOj0gQy5DU3RyaW5nKE5hbWUp CisJZGVmZXIgQy5mcmVlKHVuc2FmZS5Qb2ludGVyKG5hbWUpKQorCisJLy8gRm9yIG5vdywganVz dCBkbyB3aGF0IHhsIGRvZXMsIGFuZCBtYWtlIGEgbmV3IHV1aWQgZXZlcnkgdGltZSB3ZSBjcmVh dGUgdGhlIHBvb2wKKwl2YXIgdXVpZCBDLmxpYnhsX3V1aWQKKwlDLmxpYnhsX3V1aWRfZ2VuZXJh dGUoJnV1aWQpCisKKwljYm0gOj0gQ3B1bWFwLnRvQygpCisJZGVmZXIgQy5saWJ4bF9iaXRtYXBf ZGlzcG9zZSgmY2JtKQorCisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcmVhdGUoQ3R4LmN0eCwg bmFtZSwgQy5saWJ4bF9zY2hlZHVsZXIoU2NoZWR1bGVyKSwKKwkJY2JtLCAmdXVpZCwgJnBvb2xp ZCkKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IEVycm9yKC1yZXQpCisJCXJldHVybgorCX0KKwor CVBvb2xpZCA9IHVpbnQzMihwb29saWQpCisKKwlyZXR1cm4KK30KKworLy8gaW50IGxpYnhsX2Nw dXBvb2xfZGVzdHJveShsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkKTsKK2Z1bmMgKEN0 eCAqQ29udGV4dCkgQ3B1cG9vbERlc3Ryb3koUG9vbGlkIHVpbnQzMikgKGVyciBlcnJvcikgewor CWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisK KwlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2Rlc3Ryb3koQ3R4LmN0eCwgQy51aW50MzJfdChQb29s aWQpKQorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gRXJyb3IoLXJldCkKKwkJcmV0dXJuCisJfQor CisJcmV0dXJuCit9CisKKy8vIGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZChsaWJ4bF9jdHggKmN0 eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgY3B1KTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9v bENwdWFkZChQb29saWQgdWludDMyLCBDcHUgaW50KSAoZXJyIGVycm9yKSB7CisJZXJyID0gQ3R4 LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXJldCA6PSBD LmxpYnhsX2NwdXBvb2xfY3B1YWRkKEN0eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5pbnQo Q3B1KSkKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IEVycm9yKC1yZXQpCisJCXJldHVybgorCX0K KworCXJldHVybgorfQorCisvLyBpbnQgbGlieGxfY3B1cG9vbF9jcHVhZGRfY3B1bWFwKGxpYnhs X2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnN0IGxpYnhsX2JpdG1hcCAqY3B1bWFwKTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkg Q3B1cG9vbENwdWFkZENwdW1hcChQb29saWQgdWludDMyLCBDcHVtYXAgQml0bWFwKSAoZXJyIGVy cm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVy bgorCX0KKworCWNibSA6PSBDcHVtYXAudG9DKCkKKwlkZWZlciBDLmxpYnhsX2JpdG1hcF9kaXNw b3NlKCZjYm0pCisKKwlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdWFkZF9jcHVtYXAoQ3R4LmN0 eCwgQy51aW50MzJfdChQb29saWQpLCAmY2JtKQorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gRXJy b3IoLXJldCkKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuCit9CisKKy8vIGludCBsaWJ4bF9jcHVw b29sX2NwdXJlbW92ZShsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgY3B1KTsK K2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdXJlbW92ZShQb29saWQgdWludDMyLCBDcHUg aW50KSAoZXJyIGVycm9yKSB7CisJZXJyID0gQ3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5p bCB7CisJCXJldHVybgorCX0KKworCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlKEN0 eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5pbnQoQ3B1KSkKKwlpZiByZXQgIT0gMCB7CisJ CWVyciA9IEVycm9yKC1yZXQpCisJCXJldHVybgorCX0KKworCXJldHVybgorfQorCisvLyBpbnQg bGlieGxfY3B1cG9vbF9jcHVyZW1vdmVfY3B1bWFwKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBw b29saWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpYnhs X2JpdG1hcCAqY3B1bWFwKTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdXJlbW92ZUNw dW1hcChQb29saWQgdWludDMyLCBDcHVtYXAgQml0bWFwKSAoZXJyIGVycm9yKSB7CisJZXJyID0g Q3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWNibSA6 PSBDcHVtYXAudG9DKCkKKwlkZWZlciBDLmxpYnhsX2JpdG1hcF9kaXNwb3NlKCZjYm0pCisKKwly ZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9jcHVtYXAoQ3R4LmN0eCwgQy51aW50MzJf dChQb29saWQpLCAmY2JtKQorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gRXJyb3IoLXJldCkKKwkJ cmV0dXJuCisJfQorCisJcmV0dXJuCit9CisKKy8vIGludCBsaWJ4bF9jcHVwb29sX3JlbmFtZShs aWJ4bF9jdHggKmN0eCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgcG9vbGlkKTsKK2Z1bmMg KEN0eCAqQ29udGV4dCkgQ3B1cG9vbFJlbmFtZShOYW1lIHN0cmluZywgUG9vbGlkIHVpbnQzMikg KGVyciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwgewor CQlyZXR1cm4KKwl9CisKKwluYW1lIDo9IEMuQ1N0cmluZyhOYW1lKQorCWRlZmVyIEMuZnJlZSh1 bnNhZmUuUG9pbnRlcihuYW1lKSkKKworCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfcmVuYW1lKEN0 eC5jdHgsIG5hbWUsIEMudWludDMyX3QoUG9vbGlkKSkKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9 IEVycm9yKC1yZXQpCisJCXJldHVybgorCX0KKworCXJldHVybgorfQorCisvLyBpbnQgbGlieGxf Y3B1cG9vbF9jcHVhZGRfbm9kZShsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQg bm9kZSwgaW50ICpjcHVzKTsKK2Z1bmMgKEN0eCAqQ29udGV4dCkgQ3B1cG9vbENwdWFkZE5vZGUo UG9vbGlkIHVpbnQzMiwgTm9kZSBpbnQpIChDcHVzIGludCwgZXJyIGVycm9yKSB7CisJZXJyID0g Q3R4LkNoZWNrT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCWNjcHVz IDo9IEMuaW50KDApCisKKwlyZXQgOj0gQy5saWJ4bF9jcHVwb29sX2NwdWFkZF9ub2RlKEN0eC5j dHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5pbnQoTm9kZSksICZjY3B1cykKKwlpZiByZXQgIT0g MCB7CisJCWVyciA9IEVycm9yKC1yZXQpCisJCXJldHVybgorCX0KKworCUNwdXMgPSBpbnQoY2Nw dXMpCisKKwlyZXR1cm4KK30KKworLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX25vZGUo bGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwgaW50IG5vZGUsIGludCAqY3B1cyk7Citm dW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xDcHVyZW1vdmVOb2RlKFBvb2xpZCB1aW50MzIsIE5v ZGUgaW50KSAoQ3B1cyBpbnQsIGVyciBlcnJvcikgeworCWVyciA9IEN0eC5DaGVja09wZW4oKQor CWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwljY3B1cyA6PSBDLmludCgwKQorCisJ cmV0IDo9IEMubGlieGxfY3B1cG9vbF9jcHVyZW1vdmVfbm9kZShDdHguY3R4LCBDLnVpbnQzMl90 KFBvb2xpZCksIEMuaW50KE5vZGUpLCAmY2NwdXMpCisJaWYgcmV0ICE9IDAgeworCQllcnIgPSBF cnJvcigtcmV0KQorCQlyZXR1cm4KKwl9CisKKwlDcHVzID0gaW50KGNjcHVzKQorCisJcmV0dXJu Cit9CisKKy8vIGludCBsaWJ4bF9jcHVwb29sX21vdmVkb21haW4obGlieGxfY3R4ICpjdHgsIHVp bnQzMl90IHBvb2xpZCwgdWludDMyX3QgZG9taWQpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVw b29sTW92ZWRvbWFpbihQb29saWQgdWludDMyLCBJZCBEb21pZCkgKGVyciBlcnJvcikgeworCWVy ciA9IEN0eC5DaGVja09wZW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwly ZXQgOj0gQy5saWJ4bF9jcHVwb29sX21vdmVkb21haW4oQ3R4LmN0eCwgQy51aW50MzJfdChQb29s aWQpLCBDLnVpbnQzMl90KElkKSkKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9IEVycm9yKC1yZXQp CisJCXJldHVybgorCX0KKworCXJldHVybgorfQorCisvLworLy8gVXRpbGl0eSBmdW5jdGlvbnMK Ky8vCitmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xGaW5kQnlOYW1lKG5hbWUgc3RyaW5nKSAo aW5mbyBDcHVwb29sSW5mbywgZm91bmQgYm9vbCkgeworCXBsaXN0IDo9IEN0eC5MaXN0Q3B1cG9v bCgpCisKKwlmb3IgaSA6PSByYW5nZSBwbGlzdCB7CisJCWlmIHBsaXN0W2ldLlBvb2xOYW1lID09 IG5hbWUgeworCQkJZm91bmQgPSB0cnVlCisJCQlpbmZvID0gcGxpc3RbaV0KKwkJCXJldHVybgor CQl9CisJfQorCXJldHVybgorfQorCitmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xNYWtlRnJl ZShDcHVtYXAgQml0bWFwKSAoZXJyIGVycm9yKSB7CisJcGxpc3QgOj0gQ3R4Lkxpc3RDcHVwb29s KCkKKworCWZvciBpIDo9IHJhbmdlIHBsaXN0IHsKKwkJdmFyIEludGVyc2VjdGlvbiBCaXRtYXAK KwkJSW50ZXJzZWN0aW9uID0gQ3B1bWFwLkFuZChwbGlzdFtpXS5DcHVtYXApCisJCWlmICFJbnRl cnNlY3Rpb24uSXNFbXB0eSgpIHsKKwkJCWVyciA9IEN0eC5DcHVwb29sQ3B1cmVtb3ZlQ3B1bWFw KHBsaXN0W2ldLlBvb2xpZCwgSW50ZXJzZWN0aW9uKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJ cmV0dXJuCisJCQl9CisJCX0KKwl9CisJcmV0dXJuCit9CisKIC8qCiAgKiBCaXRtYXAgb3BlcmF0 aW9ucwogICovCi0tIAoyLjEuNAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5v cmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=