Return-Path: X-Original-To: apmail-curator-user-archive@minotaur.apache.org Delivered-To: apmail-curator-user-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0AFCD116DE for ; Wed, 23 Jul 2014 20:34:23 +0000 (UTC) Received: (qmail 81505 invoked by uid 500); 23 Jul 2014 20:34:22 -0000 Delivered-To: apmail-curator-user-archive@curator.apache.org Received: (qmail 81465 invoked by uid 500); 23 Jul 2014 20:34:22 -0000 Mailing-List: contact user-help@curator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@curator.apache.org Delivered-To: mailing list user@curator.apache.org Received: (qmail 81455 invoked by uid 99); 23 Jul 2014 20:34:22 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 23 Jul 2014 20:34:22 +0000 X-ASF-Spam-Status: No, hits=1.5 required=5.0 tests=HTML_MESSAGE,RCVD_IN_DNSWL_LOW,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of comptechgeeky@gmail.com designates 209.85.212.178 as permitted sender) Received: from [209.85.212.178] (HELO mail-wi0-f178.google.com) (209.85.212.178) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 23 Jul 2014 20:34:19 +0000 Received: by mail-wi0-f178.google.com with SMTP id hi2so2860049wib.11 for ; Wed, 23 Jul 2014 13:33:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=cmxMawa73C2dsiau3tBRtCoHIrv4M4Cng2a4pT2GN5s=; b=g7l65NGNxrnVv4G7r1RcjQGNCj1VQ7i1y0egQPP942w/4lyx4+G8SvnWxH7Uv8GF5n YxC1FHUK65KaERSA2I24vl1eTdrAM9+A9YQ+ReuM6jnS3C46JTA0P7Pt8byBRa5kTQJq QF1Cmya9cEJ6l3XpAX8vRm0UK41t8E5wQWCwYHREm/ekrYhNE+v/n+YXDExUZFDFwhWg Vj3XiTvT+UOi8cPZx1M7n/Uj6xTwAdNGG6BKeS0gF6U2dxD2UqIxdoOhPMGhUcm1+55D K0+a87zYy9CRubY5mhijUDUgFt8nqsBcgtWmEKkQvZpQbxzPKxetfVeQv1is0viE3jKt urxQ== X-Received: by 10.194.90.51 with SMTP id bt19mr5056129wjb.105.1406147633243; Wed, 23 Jul 2014 13:33:53 -0700 (PDT) MIME-Version: 1.0 Received: by 10.180.96.233 with HTTP; Wed, 23 Jul 2014 13:33:33 -0700 (PDT) From: Check Peck Date: Wed, 23 Jul 2014 13:33:33 -0700 Message-ID: Subject: How to use PathChildrenCache properly for keeping a watch on three znodes on Zookeeper? To: user Content-Type: multipart/alternative; boundary=047d7bfd00662e6acf04fee242ed X-Virus-Checked: Checked by ClamAV on apache.org --047d7bfd00662e6acf04fee242ed Content-Type: text/plain; charset=UTF-8 I am using Curator library for Zookeeper. I am using zookeeper to monitor whether my app servers are up or not. If they are not up or shut down, then bring them up. I need to keep a watch on three of my znodes on the zookeeper. I am keeping a watch on ("/test/proc/phx/server", ("/test/proc/slc/server") and ("/test/proc/lvs/server"))I have a znode structure like below. /test/proc /phx /server /h1 /h2 /h3 /h4 /h5 /slc /server /h1 /h2 /h3 /h4 /h5 /lvs /server /h1 /h2 /h3 /h4 /h5 As you can see above, for "/test/proc/phx/server", we have 5 hosts starting with "h", similary for slc and lvs as well. And all those hosts starting with "h" are ephimeral znodes. Now as soon as any server dies, let's say for PHX, h4 machine went down, then the "h4" ephemeral znodes gets deleted from the "/test/proc/phx/server" and then I will try to re-start h4 machine on PHX datacenter. Similarly with SLC and LVS. Below is my code by which I am keeping a watch and re-starting the servers if any machine went down in any datacenters. With the below code what I am seeing is, suppose if three machine went down in same datacenter, then it restart those three one by one. Meaning let's say h1, h3, h5 went down in PHX datacenter, then first it will restart h1 and as soon as h1 is done, then it will restart h3 and then h5. So it is always waiting for one to get finished and then restart another host. I am not sure why? Those three should be restarted instantly right since it's a background thread ? And also sometimes what I am seeing if all the hosts went down instantly then it doesn't restart anything? May be thread is getting stuck? Does my below code looks right with the way I am keeping a watch on three Datacenters PHX ("/test/proc/phx/server"), SLC("/test/proc/slc/server") and LVS("/test/proc/lvs/server") List datacenters = Arrays.asList("PHX", "SLC", "LVS"); for (String dc : datacenters) { // in this example we will cache data. Notice that this is optional. PathChildrenCache cache = new PathChildrenCache(zookClient.getClient(), "/test/proc" + "/" + dc + "/" + "server", true); cache.start(); addListener(cache); } private static void addListener(PathChildrenCache cache) { PathChildrenCacheListener listener = new PathChildrenCacheListener() { public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { switch (event.getType()) { case CHILD_ADDED: { if (zookClient.isLeader()) { String path = ZKPaths.getPathAndNode(event.getData().getPath()).getPath(); String node = ZKPaths.getNodeFromPath(event.getData().getPath()); String datacenter = path.split("/")[3]; System.out.println("Node added: Path= ", path, ", Actual Node= ", node, ", Datacenter= ", datacenter); break; } } case CHILD_UPDATED: { if (zookClient.isLeader()) { String path = ZKPaths.getPathAndNode(event.getData().getPath()).getPath(); String node = ZKPaths.getNodeFromPath(event.getData().getPath()); String datacenter = path.split("/")[3]; System.out.println("Node updated: Path= ", path, ", Actual Node= ", node, ", Datacenter= ", datacenter); break; } } case CHILD_REMOVED: { if (zookClient.isLeader()) { String path = ZKPaths.getPathAndNode(event.getData().getPath()).getPath(); String node = ZKPaths.getNodeFromPath(event.getData().getPath()); String datacenter = path.split("/")[3]; System.out.println("Node removed: Path= ", path, ", Actual Node= ", node, ", Datacenter= ", datacenter); // restart machine which goes down // I am assuming as soon as any machine went down, call will come here instantly without waiting for anything? break; } } default: break; } } }; cache.getListenable().addListener(listener); } --047d7bfd00662e6acf04fee242ed Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+SSBhbSB1c2luZyBDdXJhdG9yIGxpYnJhcnkgZm9yIFpvb2tlZXBlci4g SSBhbSB1c2luZyB6b29rZWVwZXIgdG8gbW9uaXRvciB3aGV0aGVyIG15IGFwcCBzZXJ2ZXJzIGFy ZSB1cCBvciBub3QuIElmIHRoZXkgYXJlIG5vdCB1cCBvciBzaHV0IGRvd24sIHRoZW4gYnJpbmcg dGhlbSB1cC4gSSBuZWVkIHRvIGtlZXAgYSB3YXRjaCBvbiB0aHJlZSBvZiBteSB6bm9kZXMgb24g dGhlIHpvb2tlZXBlci4gSSBhbSBrZWVwaW5nIGEgd2F0Y2ggb24gKCZxdW90Oy90ZXN0L3Byb2Mv cGh4L3NlcnZlciZxdW90OywgKCZxdW90Oy90ZXN0L3Byb2Mvc2xjL3NlcnZlciZxdW90OykgYW5k ICgmcXVvdDsvdGVzdC9wcm9jL2x2cy9zZXJ2ZXImcXVvdDspKUkgaGF2ZSBhIHpub2RlIHN0cnVj dHVyZSBsaWtlIGJlbG93LiA8YnI+DQoNCjxicj7CoMKgwqAgL3Rlc3QvcHJvYzxicj7CoMKgwqAg wqDCoMKgIMKgwqDCoCAvcGh4PGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCAvc2VydmVy PGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2gxPGJyPsKgwqDCoCDCoMKg wqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2gyPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDC oCDCoMKgwqAgL2gzPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2g0PGJy PsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2g1PGJyPsKgwqDCoCDCoMKgwqAg wqDCoMKgIC9zbGM8YnI+DQoNCsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCAvc2VydmVyPGJy PsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2gxPGJyPsKgwqDCoCDCoMKgwqAg wqDCoMKgIMKgwqDCoCDCoMKgwqAgL2gyPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDC oMKgwqAgL2gzPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2g0PGJyPsKg wqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2g1PGJyPsKgwqDCoCDCoMKgwqAgwqDC oMKgIC9sdnM8YnI+wqDCoMKgIMKgwqDCoCDCoMKgwqAgwqDCoMKgIC9zZXJ2ZXI8YnI+wqDCoMKg IMKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCAvaDE8YnI+DQoNCsKgwqDCoCDCoMKgwqAgwqDC oMKgIMKgwqDCoCDCoMKgwqAgL2gyPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKg wqAgL2gzPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2g0PGJyPsKgwqDC oCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgL2g1PGJyPjxicj5BcyB5b3UgY2FuIHNlZSBh Ym92ZSwgZm9yICZxdW90Oy90ZXN0L3Byb2MvcGh4L3NlcnZlciZxdW90Oywgd2UgaGF2ZSA1IGhv c3RzIHN0YXJ0aW5nIHdpdGggJnF1b3Q7aCZxdW90Oywgc2ltaWxhcnkgZm9yIHNsYyBhbmQgbHZz IGFzIHdlbGwuIEFuZCBhbGwgdGhvc2UgaG9zdHMgc3RhcnRpbmcgd2l0aCAmcXVvdDtoJnF1b3Q7 IGFyZSBlcGhpbWVyYWwgem5vZGVzLiBOb3cgYXMgc29vbiBhcyBhbnkgc2VydmVyIGRpZXMsIGxl dCYjMzk7cyBzYXkgZm9yIFBIWCwgaDQgbWFjaGluZSB3ZW50IGRvd24sIHRoZW4gdGhlICZxdW90 O2g0JnF1b3Q7IGVwaGVtZXJhbCB6bm9kZXMgZ2V0cyBkZWxldGVkIGZyb20gdGhlICZxdW90Oy90 ZXN0L3Byb2MvcGh4L3NlcnZlciZxdW90OyBhbmQgdGhlbiBJIHdpbGwgdHJ5IHRvIHJlLXN0YXJ0 IGg0IG1hY2hpbmUgb24gUEhYIGRhdGFjZW50ZXIuIFNpbWlsYXJseSB3aXRoIFNMQyBhbmQgTFZT Ljxicj4NCg0KPGJyPkJlbG93IGlzIG15IGNvZGUgYnkgd2hpY2ggSSBhbSBrZWVwaW5nIGEgd2F0 Y2ggYW5kIHJlLXN0YXJ0aW5nIHRoZSBzZXJ2ZXJzIGlmIGFueSBtYWNoaW5lIHdlbnQgZG93biBp biBhbnkgZGF0YWNlbnRlcnMuIFdpdGggdGhlIGJlbG93IGNvZGUgd2hhdCBJIGFtIHNlZWluZyBp cywgc3VwcG9zZSBpZiB0aHJlZSBtYWNoaW5lIHdlbnQgZG93biBpbiBzYW1lIGRhdGFjZW50ZXIs IHRoZW4gaXQgcmVzdGFydCB0aG9zZSB0aHJlZSBvbmUgYnkgb25lLiBNZWFuaW5nIGxldCYjMzk7 cyBzYXkgaDEsIGgzLCBoNSB3ZW50IGRvd24gaW4gUEhYIGRhdGFjZW50ZXIsIHRoZW4gZmlyc3Qg aXQgd2lsbCByZXN0YXJ0IGgxIGFuZCBhcyBzb29uIGFzIGgxIGlzIGRvbmUsIHRoZW4gaXQgd2ls bCByZXN0YXJ0IGgzIGFuZCB0aGVuIGg1LiBTbyBpdCBpcyBhbHdheXMgd2FpdGluZyBmb3Igb25l IHRvIGdldCBmaW5pc2hlZCBhbmQgdGhlbiByZXN0YXJ0IGFub3RoZXIgaG9zdC4gSSBhbSBub3Qg c3VyZSB3aHk/IFRob3NlIHRocmVlIHNob3VsZCBiZSByZXN0YXJ0ZWQgaW5zdGFudGx5IHJpZ2h0 IHNpbmNlIGl0JiMzOTtzIGEgYmFja2dyb3VuZCB0aHJlYWQgPyA8YnI+DQoNCjxicj5BbmQgYWxz byBzb21ldGltZXMgd2hhdCBJIGFtIHNlZWluZyBpZiBhbGwgdGhlIGhvc3RzIHdlbnQgZG93biBp bnN0YW50bHkgdGhlbiBpdCBkb2VzbiYjMzk7dCByZXN0YXJ0IGFueXRoaW5nPyBNYXkgYmUgdGhy ZWFkIGlzIGdldHRpbmcgc3R1Y2s/IERvZXMgbXkgYmVsb3cgY29kZSBsb29rcyByaWdodCB3aXRo IHRoZSB3YXkgSSBhbSBrZWVwaW5nIGEgd2F0Y2ggb24gdGhyZWUgRGF0YWNlbnRlcnMgUEhYICgm cXVvdDsvdGVzdC9wcm9jL3BoeC9zZXJ2ZXImcXVvdDspLCBTTEMoJnF1b3Q7L3Rlc3QvcHJvYy9z bGMvc2VydmVyJnF1b3Q7KSBhbmQgTFZTKCZxdW90Oy90ZXN0L3Byb2MvbHZzL3NlcnZlciZxdW90 Oyk8YnI+DQoNCsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgPGJyPsKgwqDCoCBM aXN0Jmx0O1N0cmluZyZndDsgZGF0YWNlbnRlcnMgPSBBcnJheXMuYXNMaXN0KCZxdW90O1BIWCZx dW90OywgJnF1b3Q7U0xDJnF1b3Q7LCAmcXVvdDtMVlMmcXVvdDspOzxicj7CoMKgwqAgZm9yIChT dHJpbmcgZGMgOiBkYXRhY2VudGVycykgezxicj7CoMKgwqAgwqDCoMKgIC8vIGluIHRoaXMgZXhh bXBsZSB3ZSB3aWxsIGNhY2hlIGRhdGEuIE5vdGljZSB0aGF0IHRoaXMgaXMgb3B0aW9uYWwuPGJy Pg0KDQrCoMKgwqAgwqDCoMKgIFBhdGhDaGlsZHJlbkNhY2hlIGNhY2hlID0gbmV3IFBhdGhDaGls ZHJlbkNhY2hlKHpvb2tDbGllbnQuZ2V0Q2xpZW50KCksICZxdW90Oy90ZXN0L3Byb2MmcXVvdDsg KyAmcXVvdDsvJnF1b3Q7ICsgZGMgKyAmcXVvdDsvJnF1b3Q7ICsgJnF1b3Q7c2VydmVyJnF1b3Q7 LCB0cnVlKTs8YnI+wqDCoMKgIMKgwqDCoCBjYWNoZS5zdGFydCgpOzxicj48YnI+wqDCoMKgIMKg wqDCoCBhZGRMaXN0ZW5lcihjYWNoZSk7PGJyPg0KDQrCoMKgwqAgfTxicj7CoMKgwqAgPGJyPsKg wqDCoCBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZExpc3RlbmVyKFBhdGhDaGlsZHJlbkNhY2hlIGNh Y2hlKSB7PGJyPjxicj7CoMKgwqDCoMKgwqDCoCBQYXRoQ2hpbGRyZW5DYWNoZUxpc3RlbmVyIGxp c3RlbmVyID0gbmV3IFBhdGhDaGlsZHJlbkNhY2hlTGlzdGVuZXIoKSB7PGJyPsKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcHVibGljIHZvaWQgY2hpbGRFdmVudChDdXJhdG9yRnJhbWV3b3JrIGNsaWVu dCwgUGF0aENoaWxkcmVuQ2FjaGVFdmVudCBldmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7PGJyPg0K DQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkp IHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNhc2UgQ0hJTERfQURERUQ6IHs8 YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHpvb2tDbGllbnQu aXNMZWFkZXIoKSkgezxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIFN0cmluZyBwYXRoID0gWktQYXRocy5nZXRQYXRoQW5kTm9kZShldmVudC5nZXREYXRh KCkuZ2V0UGF0aCgpKS5nZXRQYXRoKCk7PGJyPg0KDQrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIFN0cmluZyBub2RlID0gWktQYXRocy5nZXROb2RlRnJvbVBh dGgoZXZlbnQuZ2V0RGF0YSgpLmdldFBhdGgoKSk7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU3RyaW5nIGRhdGFjZW50ZXIgPSBwYXRoLnNwbGl0KCZx dW90Oy8mcXVvdDspWzNdOzxicj48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7Tm9kZSBhZGRlZDogUGF0aD0g JnF1b3Q7LCBwYXRoLCAmcXVvdDssIEFjdHVhbCBOb2RlPSAmcXVvdDssIG5vZGUsICZxdW90Oywg RGF0YWNlbnRlcj0gJnF1b3Q7LCBkYXRhY2VudGVyKTs8YnI+DQoNCjxicj7CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOzxicj7CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9PGJyPjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2FzZSBDSElMRF9V UERBVEVEOiB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh6 b29rQ2xpZW50LmlzTGVhZGVyKCkpIHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBTdHJpbmcgcGF0aCA9IFpLUGF0aHMuZ2V0UGF0aEFuZE5vZGUoZXZl bnQuZ2V0RGF0YSgpLmdldFBhdGgoKSkuZ2V0UGF0aCgpOzxicj4NCg0KwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTdHJpbmcgbm9kZSA9IFpLUGF0aHMuZ2V0 Tm9kZUZyb21QYXRoKGV2ZW50LmdldERhdGEoKS5nZXRQYXRoKCkpOzxicj7CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFN0cmluZyBkYXRhY2VudGVyID0gcGF0 aC5zcGxpdCgmcXVvdDsvJnF1b3Q7KVszXTs8YnI+PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU3lzdGVtLm91dC5wcmludGxuKCZxdW90O05vZGUgdXBk YXRlZDogUGF0aD0gJnF1b3Q7LCBwYXRoLCAmcXVvdDssIEFjdHVhbCBOb2RlPSAmcXVvdDssIG5v ZGUsICZxdW90OywgRGF0YWNlbnRlcj0gJnF1b3Q7LCBkYXRhY2VudGVyKTs8YnI+DQoNCjxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOzxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9PGJyPsKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9PGJyPjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y2FzZSBDSElMRF9SRU1PVkVEOiB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGlmICh6b29rQ2xpZW50LmlzTGVhZGVyKCkpIHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTdHJpbmcgcGF0aCA9IFpLUGF0aHMuZ2V0UGF0 aEFuZE5vZGUoZXZlbnQuZ2V0RGF0YSgpLmdldFBhdGgoKSkuZ2V0UGF0aCgpOzxicj4NCg0KwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTdHJpbmcgbm9kZSA9 IFpLUGF0aHMuZ2V0Tm9kZUZyb21QYXRoKGV2ZW50LmdldERhdGEoKS5nZXRQYXRoKCkpOzxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFN0cmluZyBkYXRh Y2VudGVyID0gcGF0aC5zcGxpdCgmcXVvdDsvJnF1b3Q7KVszXTs8YnI+PGJyPsKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU3lzdGVtLm91dC5wcmludGxuKCZx dW90O05vZGUgcmVtb3ZlZDogUGF0aD0gJnF1b3Q7LCBwYXRoLCAmcXVvdDssIEFjdHVhbCBOb2Rl PSAmcXVvdDssIG5vZGUsICZxdW90OywgRGF0YWNlbnRlcj0gJnF1b3Q7LCBkYXRhY2VudGVyKTs8 YnI+DQoNCjxicj7CoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCAvLyBy ZXN0YXJ0IG1hY2hpbmUgd2hpY2ggZ29lcyBkb3duPGJyPsKgwqDCoCDCoMKgwqAgwqDCoMKgIMKg wqDCoCDCoMKgwqAgwqDCoMKgIC8vIEkgYW0gYXNzdW1pbmcgYXMgc29vbiBhcyBhbnkgbWFjaGlu ZSB3ZW50IGRvd24sIGNhbGwgd2lsbCBjb21lIGhlcmUgaW5zdGFudGx5IHdpdGhvdXQgd2FpdGlu ZyBmb3IgYW55dGhpbmc/PGJyPjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGJyZWFrOzxicj4NCg0KwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfTxicj7CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZGVmYXVsdDo8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7PGJyPjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfTxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH08YnI+wqDCoMKgwqDCoMKgwqAgfTs8 YnI+wqDCoMKgwqDCoMKgwqAgY2FjaGUuZ2V0TGlzdGVuYWJsZSgpLmFkZExpc3RlbmVyKGxpc3Rl bmVyKTs8YnI+wqDCoMKgIH3CoMKgwqAgPGJyPg0KDQo8L2Rpdj4NCg== --047d7bfd00662e6acf04fee242ed--