Return-Path: X-Original-To: apmail-hadoop-hdfs-user-archive@minotaur.apache.org Delivered-To: apmail-hadoop-hdfs-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 40C9710887 for ; Thu, 28 Nov 2013 07:24:05 +0000 (UTC) Received: (qmail 57475 invoked by uid 500); 28 Nov 2013 07:23:58 -0000 Delivered-To: apmail-hadoop-hdfs-user-archive@hadoop.apache.org Received: (qmail 57145 invoked by uid 500); 28 Nov 2013 07:23:57 -0000 Mailing-List: contact user-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@hadoop.apache.org Delivered-To: mailing list user@hadoop.apache.org Received: (qmail 57138 invoked by uid 99); 28 Nov 2013 07:23:56 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 28 Nov 2013 07:23:56 +0000 X-ASF-Spam-Status: No, hits=2.2 required=5.0 tests=HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of mirko.kaempf@gmail.com designates 209.85.192.175 as permitted sender) Received: from [209.85.192.175] (HELO mail-pd0-f175.google.com) (209.85.192.175) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 28 Nov 2013 07:23:50 +0000 Received: by mail-pd0-f175.google.com with SMTP id w10so11448056pde.20 for ; Wed, 27 Nov 2013 23:23:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=JwRl4OuEC3EvBf2b606dfYm8ni9U8HDySY4dSsxQYL4=; b=gJAQkRJ6/hlnEWYGMQVmeoiRKo9ogljBzyBrTFMB1Z8zGZjYR4oQmBMC7SB+KArcAp C7Fodnp63yxlG/eduSPRQw/H2BIG9bYqqbzuLv5OEAajZRnK4s6g2KeuzF8R1qmge9Jw IH4CIeLvI7JLx+fFDNLntkW1Mwy1sNwvMOl5BHMEezU65d95B+qyilXfCNY92bGoLEAJ 1RKP2QnIN/jYlCUX+BzNnt8RQvEI1GybGSmMtv+m5nIYRZKLpn7NaC0IVSVJDo7FAMw7 32Gd/p/FCOQdIFLOj3c8URTy7FHkdSql+1VdflCBFCuXzu9/cw8y+MCIqO+iHsHAqp4i OB7A== X-Received: by 10.68.194.71 with SMTP id hu7mr9289427pbc.68.1385623408565; Wed, 27 Nov 2013 23:23:28 -0800 (PST) MIME-Version: 1.0 Received: by 10.66.197.195 with HTTP; Wed, 27 Nov 2013 23:23:08 -0800 (PST) In-Reply-To: <969B118F8FF0104281DFF098C334754051D6B9DC85@PUNINMSMBX01.puneodc.lntinfotech.com> References: <969B118F8FF0104281DFF098C334754051D6B9DC85@PUNINMSMBX01.puneodc.lntinfotech.com> From: =?ISO-8859-1?Q?Mirko_K=E4mpf?= Date: Thu, 28 Nov 2013 08:23:08 +0100 Message-ID: Subject: Re: XML parsing in Hadoop To: "user@hadoop.apache.org" Content-Type: multipart/alternative; boundary=047d7b10ccc30f6a7704ec37977f X-Virus-Checked: Checked by ClamAV on apache.org --047d7b10ccc30f6a7704ec37977f Content-Type: text/plain; charset=ISO-8859-1 Chhaya, did you run the same code in stand alone mode without MapReduce framework? How long takes the code in you map() function standalone? Compare those two different times (t_0 MR mode, t_1 standalone mode) to find out if it is a MR issue or something which comes from the xml-parser logic or the data ... Usually it should be not that slow. But what cluster do you have and how many mappers / reducers and how many of such 2NB files do you have? Best wishes Mirko 2013/11/28 Chhaya Vishwakarma > Hi, > > > > > > The below code parses XML file, Here the output of the code is correct but > the job takes long time for completion. > > It took 20 hours to parse 2MB file. > > Kindly suggest what changes could be done to increase the performance. > > > > > > > > package xml; > > > > import java.io.FileInputStream; > > import java.io.FileNotFoundException; > > import java.io.IOException; > > import java.util.*; > > > > import javax.xml.parsers.DocumentBuilder; > > import javax.xml.parsers.DocumentBuilderFactory; > > import javax.xml.parsers.ParserConfigurationException; > > import javax.xml.xpath.XPath; > > import javax.xml.xpath.XPathConstants; > > import javax.xml.xpath.XPathExpressionException; > > import javax.xml.xpath.XPathFactory; > > > > import org.apache.hadoop.fs.FSDataInputStream; > > import org.apache.hadoop.fs.FSInputStream; > > import org.apache.hadoop.fs.FileSystem; > > import org.apache.hadoop.fs.Path; > > > > import org.apache.hadoop.conf.*; > > import org.apache.hadoop.io.*; > > > > import org.apache.hadoop.mapred.JobConf; > > import org.apache.hadoop.mapreduce.*; > > import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; > > import org.apache.hadoop.mapreduce.lib.input.FileSplit; > > import org.apache.hadoop.mapreduce.lib.input.TextInputFormat; > > import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; > > import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; > > > > > > import org.apache.log4j.Logger; > > import org.w3c.dom.Document; > > import org.w3c.dom.Element; > > import org.w3c.dom.NodeList; > > import org.xml.sax.SAXException; > > > > > > public class ReadXmlMR > > { > > static Logger log = > Logger.getLogger(ReadXmlMR.class.getName()); > > public static String fileName = new String(); > > public static Document dom; > > public void configure(JobConf job) { > > fileName = job.get("map.input.file"); > > } > > > > > > public static class Map extends > Mapper > > { > > > > public void map(LongWritable key, Text > value,Context context ) throws IOException, InterruptedException > > { > > try { > > FileSplit > fileSplit = (FileSplit)context.getInputSplit(); > > > Configuration conf = context.getConfiguration(); > > > > > DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); > > > > > FSDataInputStream fstream1; > > Path file > = fileSplit.getPath(); > > FileSystem fs = > file.getFileSystem(conf); > > fstream1 = > fs.open(fileSplit.getPath()); > > > DocumentBuilder db = dbf.newDocumentBuilder(); > > dom = > db.parse(fstream1); > > Element > docEle = null; > > docEle = > dom.getDocumentElement(); > > > > XPath > xpath = XPathFactory.newInstance().newXPath(); > > > > Object > result = xpath.compile("//*").evaluate(dom, XPathConstants.NODESET); > > > > NodeList > nodes = (NodeList) result; > > > > > > for (int n > = 2; n < nodes.getLength(); n++) > > > > { > > > Text colvalue=new Text(""); > > > Text nodename= new Text(""); > > > > > nodename = new Text(nodes.item(n).getNodeName()); > > > try{colvalue = new > Text(nodes.item(n).getFirstChild().getNodeValue());}catch(Exception e){} > > > if(colvalue.toString().equalsIgnoreCase(null)){colvalue=new Text("");} > > > context.write(nodename, colvalue); > > } > > > > > > } catch > (ParserConfigurationException e) { > > // TODO > Auto-generated catch block > > > e.printStackTrace(); > > } catch > (SAXException e) { > > // TODO > Auto-generated catch block > > > e.printStackTrace(); > > > > } catch > (XPathExpressionException e) { > > // TODO > Auto-generated catch block > > > e.printStackTrace(); > > } > > > > } > > > > } > > > > > > > > public static void main(String[] args) throws Exception > > > > { > > > > Configuration conf = new Configuration(); > > > > Job job = new Job(conf, "XmlParsing"); > > job.setJarByClass(ReadXmlMR.class); > > job.setOutputKeyClass(Text.class); > > job.setOutputValueClass(Text.class); > > > > > > job.setMapperClass(Map.class); > > > > > > job.setInputFormatClass(TextInputFormat.class); > > job.setOutputFormatClass(TextOutputFormat.class); > > > > FileInputFormat.addInputPath(job, new Path(args[0])); > > FileOutputFormat.setOutputPath(job, new Path(args[1])); > > > > > > job.submit(); > > > > job.waitForCompletion(true); > > > > > > } > > > > } > > > > > > > > Regards, > > Chhaya Vishwakarma > > > > ------------------------------ > The contents of this e-mail and any attachment(s) may contain confidential > or privileged information for the intended recipient(s). Unintended > recipients are prohibited from taking action on the basis of information in > this e-mail and using or disseminating the information, and must notify the > sender and delete it from their system. L&T Infotech will not accept > responsibility or liability for the accuracy or completeness of, or the > presence of any virus or disabling code in this e-mail" > --047d7b10ccc30f6a7704ec37977f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+Q2hoYXlhLDxkaXY+PGJyPjwvZGl2PjxkaXYgc3R5bGU+ZGlkIHlvdSBy dW4gdGhlIHNhbWUgY29kZSBpbiBzdGFuZCBhbG9uZSBtb2RlIHdpdGhvdXQgTWFwUmVkdWNlIGZy YW1ld29yaz88L2Rpdj48ZGl2IHN0eWxlPkhvdyBsb25nIHRha2VzIHRoZSBjb2RlIGluIHlvdSBt YXAoKSBmdW5jdGlvbiBzdGFuZGFsb25lP6A8L2Rpdj48ZGl2IHN0eWxlPkNvbXBhcmUgdGhvc2Ug dHdvIGRpZmZlcmVudCB0aW1lcyAodF8wIE1SIG1vZGUsIHRfMSBzdGFuZGFsb25lIG1vZGUpIHRv IGZpbmQgb3V0oDwvZGl2Pg0KDQo8ZGl2IHN0eWxlPmlmIGl0IGlzIGEgTVIgaXNzdWUgb3Igc29t ZXRoaW5nIHdoaWNoIGNvbWVzIGZyb20gdGhlIHhtbC1wYXJzZXIgbG9naWMgb3IgdGhlIGRhdGEg Li4uPC9kaXY+PGRpdiBzdHlsZT48YnI+PC9kaXY+PGRpdiBzdHlsZT5Vc3VhbGx5IGl0IHNob3Vs ZCBiZSBub3QgdGhhdCBzbG93LiBCdXQgd2hhdCBjbHVzdGVyIGRvIHlvdSBoYXZlIGFuZCBob3cg bWFueSBtYXBwZXJzIC8gcmVkdWNlcnMgYW5kIGhvdyBtYW55IG9mIHN1Y2ggMk5CIGZpbGVzIGRv IHlvdSBoYXZlPzwvZGl2Pg0KDQo8ZGl2IHN0eWxlPjxicj48L2Rpdj48ZGl2IHN0eWxlPkJlc3Qg d2lzaGVzPC9kaXY+PGRpdiBzdHlsZT5NaXJrbzwvZGl2PjxkaXYgc3R5bGU+PGJyPjwvZGl2Pjwv ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1 b3RlIj4yMDEzLzExLzI4IENoaGF5YSBWaXNod2FrYXJtYSA8c3BhbiBkaXI9Imx0ciI+Jmx0Ozxh IGhyZWY9Im1haWx0bzpDaGhheWEuVmlzaHdha2FybWFAbG50aW5mb3RlY2guY29tIiB0YXJnZXQ9 Il9ibGFuayI+Q2hoYXlhLlZpc2h3YWthcm1hQGxudGluZm90ZWNoLmNvbTwvYT4mZ3Q7PC9zcGFu Pjxicj4NCg0KPGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAg MCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+DQoN Cg0KDQoNCg0KPGRpdiBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SGksPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9u dC1zaXplOjEwLjBwdDtmb250LWZhbWlseTomcXVvdDtTZWdvZSBVSSZxdW90OywmcXVvdDtzYW5z LXNlcmlmJnF1b3Q7Ij5UaGUgYmVsb3cgY29kZSBwYXJzZXMgWE1MIGZpbGUsIEhlcmUgdGhlIG91 dHB1dCBvZiB0aGUgY29kZSBpcyBjb3JyZWN0IGJ1dCB0aGUgam9iIHRha2VzIGxvbmcgdGltZSBm b3IgY29tcGxldGlvbi48dT48L3U+PHU+PC91Pjwvc3Bhbj48L3A+DQoNCg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7 U2Vnb2UgVUkmcXVvdDssJnF1b3Q7c2Fucy1zZXJpZiZxdW90OyI+SXQgdG9vayAyMCBob3VycyB0 byBwYXJzZSAyTUIgZmlsZS48dT48L3U+PHU+PC91Pjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseTomcXVvdDtT ZWdvZSBVSSZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7Ij5LaW5kbHkgc3VnZ2VzdCB3aGF0 IGNoYW5nZXMgY291bGQgYmUgZG9uZSB0byBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2UuPHU+PC91 Pjx1PjwvdT48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMi4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7LCZx dW90O3NlcmlmJnF1b3Q7Ij48dT48L3U+oDx1PjwvdT48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91 PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+cGFja2FnZSB4bWw7PHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07PHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91 bmRFeGNlcHRpb247PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBv cnQgamF2YS5pby5JT0V4Y2VwdGlvbjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPmltcG9ydCBqYXZhLnV0aWwuKjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9y dCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWls ZGVyRmFjdG9yeTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9y dCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOzx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IGphdmF4LnhtbC54cGF0aC5Y UGF0aDs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBqYXZh eC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj5pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlv bjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBqYXZheC54 bWwueHBhdGguWFBhdGhGYWN0b3J5Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCI+oKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmlt cG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GU0RhdGFJbnB1dFN0cmVhbTs8dT48L3U+PHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5G U0lucHV0U3RyZWFtOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1w b3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDs8dT48 L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLio7PHU+ PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLmFwYWNoZS5o YWRvb3AuaW8uKjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1Pjwv dT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhh ZG9vcC5tYXByZWQuSm9iQ29uZjs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuKjs8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1 Y2UubGliLmlucHV0LkZpbGVJbnB1dEZvcm1hdDs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0 LkZpbGVTcGxpdDs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9y dCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UubGliLmlucHV0LlRleHRJbnB1dEZvcm1hdDs8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcuYXBhY2hl LmhhZG9vcC5tYXByZWR1Y2UubGliLm91dHB1dC5GaWxlT3V0cHV0Rm9ybWF0Ozx1PjwvdT48dT48 L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+aW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1h cHJlZHVjZS5saWIub3V0cHV0LlRleHRPdXRwdXRGb3JtYXQ7PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3Jn LmFwYWNoZS5sb2c0ai5Mb2dnZXI7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj5pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj5pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDs8dT48L3U+PHU+PC91 PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDs8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPmltcG9ydCBvcmcueG1sLnNh eC5TQVhFeGNlcHRpb247PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5wdWJsaWMgY2xhc3MgUmVhZFhtbE1SIDx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ezx1PjwvdT48dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIHN0YXRpYyBMb2dnZXIgbG9nID0gTG9n Z2VyLmdldExvZ2dlcihSZWFkWG1sTVIuY2xhc3MuZ2V0TmFtZSgpKTs8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgIKCgoKCgoKCgoKCgoCCgcHVibGljIHN0YXRpYyBT dHJpbmcgZmlsZU5hbWUgPSBuZXcgU3RyaW5nKCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKAgoKCgoKCgoKCgoKAgoHB1YmxpYyBzdGF0aWMgRG9jdW1lbnQgZG9t Ozx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgIKCgoKCgoKCgoKCg IKBwdWJsaWMgdm9pZCBjb25maWd1cmUoSm9iQ29uZiBqb2IpIHs8dT48L3U+PHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgIGZpbGVOYW1lID0gam9iLmdldCgmcXVvdDtt YXAuaW5wdXQuZmlsZSZxdW90Oyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj59PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goCA8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCBwdWJsaWMgc3RhdGljIGNsYXNzIE1h cCBleHRlbmRzIE1hcHBlciZsdDtMb25nV3JpdGFibGUsVGV4dCxUZXh0LFRleHQmZ3Q7PHU+PC91 Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoCB7IDx1Pjwv dT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgcHVibGljIHZvaWQgbWFwKExvbmdXcml0YWJsZSBr ZXksIFRleHQgdmFsdWUsQ29udGV4dCBjb250ZXh0ICkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRl cnJ1cHRlZEV4Y2VwdGlvbqANCjx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB7IDx1PjwvdT48dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKAgdHJ5IHs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoCBGaWxlU3BsaXQgZmlsZVNwbGl0ID0gKEZpbGVTcGxpdCljb250ZXh0LmdldElucHV0 U3BsaXQoKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBD b25maWd1cmF0aW9uIGNvbmYgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTs8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoA0KPHU+PC91Pjx1PjwvdT48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYg PSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7PHU+PC91Pjx1PjwvdT48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoCBGU0RhdGFJbnB1dFN0cmVhbSBmc3RyZWFtMTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBQYXRoIGZpbGUgPSBmaWxlU3BsaXQuZ2V0UGF0aCgpOzx1 PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKAgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgRmlsZVN5c3RlbSBmcyA9IGZpbGUuZ2V0Rmls ZVN5c3RlbShjb25mKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCg oKCgoKCgoKAgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGZzdHJlYW0xID0g ZnMub3BlbihmaWxlU3BsaXQuZ2V0UGF0aCgpKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoCBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRC dWlsZGVyKCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg ZG9tID0gZGIucGFyc2UoZnN0cmVhbTEpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIEVsZW1lbnQgZG9jRWxlID0gbnVsbDs8dT48L3U+PHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBkb2NFbGUgPSBkb20uZ2V0RG9jdW1lbnRFbGVt ZW50KCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBYUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5u ZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCA8 dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCBPYmplY3QgcmVz dWx0ID2gIHhwYXRoLmNvbXBpbGUoJnF1b3Q7Ly8qJnF1b3Q7KS5ldmFsdWF0ZShkb20sIFhQYXRo Q29uc3RhbnRzLk5PREVTRVQpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+PHU+PC91PqA8dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIE5vZGVM aXN0IG5vZGVzID0gKE5vZGVMaXN0KSByZXN1bHQ7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1PjwvdT48dT48L3U+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGZvciAoaW50IG4gPSAyOyBuICZsdDsgbm9kZXMu Z2V0TGVuZ3RoKCk7IG4rKykNCjx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgDQo8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oCB7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIFRleHQgY29sdmFsdWU9bmV3IFRleHQoJnF1b3Q7JnF1b3Q7KTs8dT48L3U+PHU+ PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgVGV4 dCBub2RlbmFtZT0gbmV3IFRleHQoJnF1b3Q7JnF1b3Q7KTs8dT48L3U+PHU+PC91PjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgbm9kZW5hbWUgPSBuZXcgVGV4dChub2Rlcy5pdGVt KG4pLmdldE5vZGVOYW1lKCkpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB0cnl7Y29sdmFsdWUgPSBuZXcgVGV4dChub2Rlcy5p dGVtKG4pLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7fWNhdGNoKEV4Y2VwdGlvbiBl KXt9PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgIGlmKGNvbHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShudWxsKSl7 Y29sdmFsdWU9bmV3IFRleHQoJnF1b3Q7JnF1b3Q7KTt9PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGNvbnRleHQud3JpdGUobm9k ZW5hbWUsIGNvbHZhbHVlKTugoKCgoA0KPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKAgfTx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1 PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48dT48L3U+oDx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2Vw dGlvbiBlKSB7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jazx1PjwvdT48dT48L3U+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIGUucHJpbnRTdGFja1RyYWNlKCk7PHU+PC91Pjx1Pjwv dT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgfSBjYXRjaCAoU0FYRXhjZXB0aW9u IGUpIHs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCAvLyBU T0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoCCgoKCgoKCgoKCgoKCgoKAgZS5wcmludFN0YWNrVHJhY2UoKTs8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgfSBjYXRjaCAo WFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoCAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrPHU+ PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAgZS5wcmludFN0YWNr VHJhY2UoKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB9 PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoCB9PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIH08dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCA8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKAg oKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCg oKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCg oKCgoKAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2Vw dGlvbjx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCg oKCgIHs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCg oKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCg oKCgoCBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOzx1PjwvdT48dT48 L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIKCgIDx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKBKb2Igam9iID0gbmV3IEpv Yihjb25mLCAmcXVvdDtYbWxQYXJzaW5nJnF1b3Q7KTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiPqCgoKCgoKAgam9iLnNldEphckJ5Q2xhc3MoUmVhZFhtbE1SLmNsYXNz KTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgIKCgoKCgoKCgoKCg oCBqb2Iuc2V0T3V0cHV0S2V5Q2xhc3MoVGV4dC5jbGFzcyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj6goCCgoKCgoKCgoKCgoKAgam9iLnNldE91dHB1dFZhbHVlQ2xh c3MoVGV4dC5jbGFzcyk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 dT48L3U+oDx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoCA8dT48L3U+ PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCgoCBqb2Iuc2V0 TWFwcGVyQ2xhc3MoTWFwLmNsYXNzKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPqCgIDx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCg oKA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKCgoKCgoKCg oCBqb2Iuc2V0SW5wdXRGb3JtYXRDbGFzcyhUZXh0SW5wdXRGb3JtYXQuY2xhc3MpOzx1PjwvdT48 dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgIKCgoKCgoKCgoKCgIGpvYi5zZXRP dXRwdXRGb3JtYXRDbGFzcyhUZXh0T3V0cHV0Rm9ybWF0LmNsYXNzKTs8dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKAgRmlsZUlucHV0Rm9ybWF0LmFkZElucHV0 UGF0aChqb2IsIG5ldyBQYXRoKGFyZ3NbMF0pKTs8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPqCgoCCgoKCgoKCgoKCgoCBGaWxlT3V0cHV0Rm9ybWF0LnNldE91dHB1dFBh dGgoam9iLCBuZXcgUGF0aChhcmdzWzFdKSk7PHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj6goKCgoKAgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij6goKCgPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCg oKCgoKAgam9iLnN1Ym1pdCgpOzx1PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCI+oKCgoKCgoCA8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPqCgoKCg oKCgoKCgoKCgoCBqb2Iud2FpdEZvckNvbXBsZXRpb24odHJ1ZSk7PHU+PC91Pjx1PjwvdT48L3A+ DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj6goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDx1 PjwvdT48dT48L3U+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHU+PC91PqA8dT48L3U+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+oKCgoKCgoKCgoKCgoKCgIH08dT48L3U+PHU+PC91Pjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPn08dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1Pjwv dT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjx1PjwvdT6gPHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPlJlZ2FyZHMsPHU+PC91Pjx1PjwvdT48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5D aGhheWEgVmlzaHdha2FybWE8dT48L3U+PHU+PC91PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi Pjx1PjwvdT6gPHU+PC91PjwvcD4NCjwvZGl2Pg0KPGJyPg0KPGhyPg0KPGZvbnQgZmFjZT0iQXJp YWwiIGNvbG9yPSJCbGFjayIgc2l6ZT0iMyI+VGhlIGNvbnRlbnRzIG9mIHRoaXMgZS1tYWlsIGFu ZCBhbnkgYXR0YWNobWVudChzKSBtYXkgY29udGFpbiBjb25maWRlbnRpYWwgb3IgcHJpdmlsZWdl ZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGludGVuZGVkIHJlY2lwaWVudChzKS4gVW5pbnRlbmRlZCBy ZWNpcGllbnRzIGFyZSBwcm9oaWJpdGVkIGZyb20gdGFraW5nIGFjdGlvbiBvbiB0aGUgYmFzaXMg b2YgaW5mb3JtYXRpb24NCiBpbiB0aGlzIGUtbWFpbCBhbmQgdXNpbmcgb3IgZGlzc2VtaW5hdGlu ZyB0aGUgaW5mb3JtYXRpb24sIGFuZCBtdXN0IG5vdGlmeSB0aGUgc2VuZGVyIGFuZCBkZWxldGUg aXQgZnJvbSB0aGVpciBzeXN0ZW0uIEwmYW1wO1QgSW5mb3RlY2ggd2lsbCBub3QgYWNjZXB0IHJl c3BvbnNpYmlsaXR5IG9yIGxpYWJpbGl0eSBmb3IgdGhlIGFjY3VyYWN5IG9yIGNvbXBsZXRlbmVz cyBvZiwgb3IgdGhlIHByZXNlbmNlIG9mIGFueSB2aXJ1cyBvciBkaXNhYmxpbmcgY29kZQ0KIGlu IHRoaXMgZS1tYWlsJnF1b3Q7PGJyPg0KPC9mb250Pg0KPC9kaXY+DQoNCjwvYmxvY2txdW90ZT48 L2Rpdj48YnI+PC9kaXY+DQo= --047d7b10ccc30f6a7704ec37977f--