<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>RDMap</name>
	<version>0.4.1</version>
  <mincmsversion>1.9-beta1</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgaXMgdGhpcyB0aGluZz88L2gzPgo8cD5UaGUgUkQgTWFwIG1vZHVsZSBjYW4gZGlzcGxheSBhIG1hcCBvbiBhIHBhZ2UuIFRoYXQncyBhYm91dCBpdCwgcmVhbGx5LiBBIG1hcCBoYXMgYSBiYXNlbWFwIGxheWVyLCBhbmQgY2FuIGhhdmUgYW4gb3ZlcmxheSBsYXllci48L3A+PGgzPkhvdyBEbyBJIFVzZSBJdD88L2gzPgo8cD5XaGVuIGVkaXRpbmcgYSBwYWdlIChvciB0ZW1wbGF0ZSksIHBsYWNlIHRoZSB7TWFwfSB0YWcgc29tZXdoZXJlLiBUaGUgbWFwIHRhZyBoYXMgb25lIHJlcXVpcmVkIGFyZ3VtZW50LCB0aGF0IG9mIHRoZSBuYW1lIG9mIHRoZSBtYXAgdG8gaW5jbHVkZSwgbGlrZSBzbzogPHR0PntNYXAmbmJzcDtuYW1lPSZsdDttYXBfbmFtZSZndDt9PC90dD4uPC9wPgo8aDM+Q3JlYXRpbmcgTWFwczwvaDM+PHA+ClNvIGZhciwgdGhlIGRlZmF1bHQgbWFwIHRlbXBsYXRlIHJlcXVpcmVzIGFuIEFyY0dJUyB0aWxlZCBtYXAgc2VydmljZSBmb3IgYSBiYXNlbWFwLCBhbmQgYW4gQXJjR0lTIGZlYXR1cmUgc2VydmljZSBmb3IgdGhlIG92ZXJsYXkgbWFwLiBUaGUgbWFwIHRlbXBsYXRlcyBhcmUgY29tcGxldGVseSBjdXN0b21pemFibGUsIGhvd2V2ZXIuCjxoND5NYXAgTmFtZXMgYW5kIFRpdGxlczwvaDQ+CjxwPlRoZSBtYXAgbmFtZSBpcyBhIGhhbmR5IG5hbWUgdGhhdCB0aGUgc2l0ZSBhZG1pbmlzdHJhdG9yIGNhbiB1c2UgdG8gcmVmZXJlbmNlIHRoZSBtYXAgb24gdGhlIHBhZ2VzIHdoZXJlIGl0IGFwcGVhcnMuIFRoZSBzaXRlIHVzZXJzIHNob3VsZCBuZXZlciBzZWUgaXQuIFRoZSBtYXAgdGl0bGUgc2hvd3MgdXAgaW4gdGhlIGRlZmF1bHQgdGVtcGxhdGUgcmlnaHQgYWJvdmUgdGhlIG1hcC4KPC9wPjxoND5CYXNlbWFwczwvaDQ+PHA+VGhlIGJhc2VtYXAgc2hvdWxkIGJlIHRoZSBVUkwgdG8gdGhlIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0aGUgcmFzdGVyIGJhc2VtYXAgdGlsZXMuIEJ5IGRlZmF1bHQgdGhpcyBpcyBBcmNHSVMgU2VydmVyLCBhbmQgc2hvdWxkIGJlIHRoZSBVUkwgcmlnaHQgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIHRoZSBNYXBTZXJ2ZXIgcGFydC4gQW55IG90aGVyIGtpbmQgb2YgYmFzZW1hcCBzZXJ2aWNlIHdpbGwgcmVxdWlyZSBhIGN1c3RvbWl6ZWQgdGVtcGxhdGUgdG8gc3VwcG9ydC48L3A+CjxoND5Jbml0aWFsIE1hcCBFeHRlbnQ8aDQ+PHA+ClRoZSBpbml0aWFsIG1hcCBleHRlbnQgc2V0dGluZyBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjZW50cmUgb2YgdGhlIG1hcCBhbmQgdGhlIHpvb20gbGV2ZWwgYXMgdGhlIG1hcCBsb2Fkcy4gVGhlIGV4dGV0bnQgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyA8dHQ+bGF0L2xvbmcvem9vbTwvdHQ+LCB3aGVyZSA8dHQ+bGF0PC90dD4gYW5kIDx0dD5sb25nPC90dCBhcmUgaW4gZGVjaW1hbCBkZWdyZWVzLCBhbmQgdGhlIDx0dD56b29tPC90dD4gaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDIwLjwvcD4KPGg0Pk1hcCBPdmVybGF5IGFuZCBPdmVybGF5IFBhcmFtZXRlcnM8L2g0PjxwPgpXaXRoIHRoZSBkZWZhdWx0IHRlbXBsYXRlLCB0aGUgbWFwIG92ZXJsYXkgaXMgdHJlYXRlZCBhcyBhbiBBcmNHSVMgUkVTVCBGZWF0dXJlU2VydmVyIGxheWVyLiBPdGhlciBzZXJ2aWNlcyBhcmUgcG9zc2libGUgKGFzIHVzdWFsKSB3aXRoIGEgY3VzdG9taXplZCB0ZW1wbGF0ZS4gVGhlIG9wdGlvbmFsIG92ZXJsYXkgcGFyYW1ldGVycyBhcmUgZXh0cmEgcXVlcnkgcGFyYW1ldGVycyB0byBiZSBhZGRlZCBvbiB0byBldmVyeSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIsIGFuZCBtaWdodCBiZSBzb21ldGhpbmcgbGlrZTwvcD4KPHByZT53aGVyZT1OQU1FIExJS0UgIlNUQVRJT04iPC9wcmU+CjxwPkZvciB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSwgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSA8dHQ+d2hlcmU8L3R0PiBhbmQgPHR0PnRva2VuPC90dD4uCjxwPk11bHRpcGxlIHBhcmFtZXRlcnMgY2FuIGJlIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLgo8L3A+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbmFtZT0iIiAtIFRoZSBuYW1lIG9mIHRoZSBtYXAgdG8gYmUgcGxhY2VkIG9uIHRoZSBwYWdlLiBUaGlzIG5hbWUgd29uJ3Qgc2hvdyB1cCBhbnl3aGVyZSB0aGUgc2l0ZSB1c2VycyBjYW4gc2VlLCBhbmQgY2FuJ3QgaGF2ZSBhbnkgc3BhY2VzIG9yIHNwZWNpYWwgY2hhcmFjdGVycy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+VmVyc2lvbjogMC40LjE8YnIgLz4=]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/.event.Core.ContentPostRender.php.swp</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[YjBWSU0gNy40AAAAABAAAEai3VK7IRIAATgAAGRtYWhvbmV5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZWJpYW52bQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3Zhci93d3cvbW9kdWxlcy9SRE1hcC9ldmVudC5Db3JlLkNvbnRlbnRQb3N0UmVuZGVyLnBocAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1dGYtOA0AMzIxMAAAAAAjIiEgExJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAQB/AAAAAgAAAAAAAABDAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhZAAAjAQAALQFAAAAEAAAQwAAAAAAAAD6DwAAuw8AALoPAAC2DwAAaA8AAFQPAABRDwAAFg8AABMPAADIDgAAeg4AAC0OAAAXDgAAFg4AAMcNAAB+DQAAMQ0AAOUMAACeDAAAUAwAAA8MAAAODAAACgwAAAkMAADwCwAAyQsAAMgLAACoCwAAfgsAAFMLAAA0CwAAHQsAABwLAAD0CgAA8woAAMsKAACiCgAAfQoAAEUKAABECgAAOAoAAP0JAABlCQAAYwkAAFwJAADsCAAA6ggAAOkIAADVCAAAlwgAAPsHAAD5BwAA8gcAAIwHAACKBwAASgcAAKkGAACgBgAAJgYAACQGAAAjBgAAIgYAANkFAADYBQAAuQUAALcFAAC0BQAAtwUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8+AH0AJHBhcmFtc1snY29udGVudCddID0gJGNvbnRlbnQ7AAAkY29udGVudCA9IHN1YnN0cl9yZXBsYWNlKCRjb250ZW50LCRoZWFkY29udGVudCwkaGVhZHN0YXJ0LCRoZWFkbGVuZ3RoKTsAAAB9AAkkaGVhZGNvbnRlbnQgLj0gIlx0PHNjcmlwdCBzcmM9XCIiLiR0aGlzLT5HZXRNb2R1bGVVcmxQYXRoKCkuIi9saWIvanMvZXNyaS1sZWFmbGV0L2VzcmktbGVhZmxldC1zcmMuanNcIj48L3NjcmlwdD5cclxuIjsAfSBlbHNlIHsACSRoZWFkY29udGVudCAuPSAiPCEtLSBSRCBNYXAgbW9kdWxlIGZvdW5kIGFub3RoZXIgZXNyaS1sZWFmbGV0LmpzIGZpbGUgaW5jbHVkZWQuIFJlbW92ZSBpdCBmcm9tIHRoZSB0ZW1wbGF0ZSB0byB1c2UgdGhlIG9uZSBpbmNsdWRlZCBieSB0aGUgTWFwIG1vZHVsZS4gLS0+XG4iOwBpZiAocHJlZ19tYXRjaCgnL3MqPHNjcmlwdC4qZXNyaS1sZWFmbGV0LmpzLycsICRoZWFkY29udGVudCkpIHsAfQAJJGhlYWRjb250ZW50IC49ICJcdDxzY3JpcHQgc3JjPVwiaHR0cDovL2Nkbi5sZWFmbGV0anMuY29tL2xlYWZsZXQtMC43LjIvbGVhZmxldC5qc1wiPjwvc2NyaXB0PlxyXG4iOwBlbHNlIHsAfQAJJGhlYWRjb250ZW50IC49ICI8IS0tIFJEIE1hcCBtb2R1bGUgZm91bmQgYW5vdGhlciBsZWFmbGV0LmpzIGZpbGUgaW5jbHVkZWQuIFJlbW92ZSBpdCBmcm9tIHRoZSB0ZW1wbGF0ZSB0byB1c2UgdGhlIG9uZSBpbmNsdWRlZCBieSB0aGUgTWFwIG1vZHVsZS4gLS0+XG4iOwBpZiAocHJlZ19tYXRjaCgnL1xzKjxzY3JpcHQuKlwvbGVhZnRsZXQuanMvJywkaGVhZGNvbnRlbnQpKSB7AC8vIGphdmFzY3JpcHQgZmlsZXMAAH0ACSRoZWFkY29udGVudCAuPSAiPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIGhyZWY9XCJodHRwOi8vY2RuLmxlYWZsZXRqcy5jb20vbGVhZmxldC0wLjcuMi9sZWFmbGV0LmNzc1wiIC8+XHJcbiI7AGVsc2UgewB9AAkkaGVhZGNvbnRlbnQgLj0gJzwhLS0gUkQgTWFwIG1vZHVsZSBmb3VuZCBhbm90aGVyIGxlYWZsZXQgY3NzIGZpbGUgaGVyZS4gUmVtb3ZlIGl0IGZyb20gdGhlIHRlbXBsYXRlIHRvIHVzZSB0aGUgb25lIGluY2x1ZGVkIGJ5IHRoZSBNYXAgbW9kdWxlXG4gLS0+JzsAaWYgKHByZWdfbWF0Y2goIi9ccyo8bGluay4qbGVhZmxldC5jc3MvIiwgJGhlYWRjb250ZW50KSkgewAvLyBjc3MgZmlsZQAAJGhlYWRjb250ZW50ID0gc3Vic3RyKCRjb250ZW50LCRoZWFkc3RhcnQsJGhlYWRsZW5ndGgpOwAkaGVhZGxlbmd0aCA9ICRoZWFkZW5kIC0gJGhlYWRzdGFydDsAJGhlYWRlbmQgICA9IHN0cnBvcygkY29udGVudCwnPC9oZWFkPicpOwAkaGVhZHN0YXJ0ID0gc3RycG9zKCRjb250ZW50LCc8aGVhZD4nKTsAAC8vIEdldCB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudAAAJGRldGFpbF9rZXl3b3JkcyA9ICcnOwAkY29udGVudCA9ICRwYXJhbXNbJ2NvbnRlbnQnXTsAaWYgKGFycmF5X2tleV9leGlzdHMoJ3JkbWFwJywkdHBsX3ZhcnMpKSB7ACR0cGxfdmFycyA9ICRzbWFydHktPmdldF90ZW1wbGF0ZV92YXJzKCk7ACRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsAACRtb2QgPSBjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ1JETWFwJyk7AGlmICghaXNzZXQoJGdDbXMpKSBleGl0OwAAKiovAAAgKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMACAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yACAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUAICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljACAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IAICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yACAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAAAICogYW55IGxhdGVyIHZlcnNpb24uACAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikAICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUAICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQAICoAICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQAgKgAgKiBDU1MgdG8gdGhlIHBhZ2UuACAqIFByb2Nlc3MgdGhlIHBhZ2UgcG9zdC1yZW5kZXIuIFNwZWNpZmljYWxseSwgYWRkIHRoZSBsZWFmbGV0IEpTIHNjcmlwdHMgYW5kAC8qKgAALyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8APD9waHAA]]></data>
	</file>
	<file>
	  <filename>/action.admin_add_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBBZGQgYSBtYXAgdG8gdGhlIGRhdGFiYXNlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMgKSkgZXhpdDsKCiRzbWFydHkgPSAkdGhpcy0+c21hcnR5OwoKaWYgKCEgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2FsbG93X2FkZCcsMSkgPT0gMSkgZXhpdDsKCiRkYiA9ICRnQ21zLT5HZXREYigpOwoKaWYgKGlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSkgewoJCSRtYXAgPSBtYXBfb3BlcmF0aW9uczo6Z2V0X21hcF9ieV9pZCgkcGFyYW1zWydtYXBfaWQnXSk7Cn0gZWxzZSB7CgkkbWFwID0gbmV3IHJkZmZnX21hcDsKfQokdGhpcy0+RmlyZURlYnVnKCdpbmZvJywnb3ZlcmxheSAnLiRtYXAtPm92ZXJsYXkuJyBhbmQgcGFyYW1ldGVyczogJy4kbWFwLT5vdmVybGF5X3BhcmFtZXRlcnMpOwoKLy8gcG9wdWxhdGUgdGhlIG1hcCBvYmplY3QgZnJvbSB0aGUgcHJldmlvdXMgZm9ybQppZiAoaXNzZXQoJHBhcmFtc1snbmFtZSddKSkgJG1hcC0+bmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKaWYgKGlzc2V0KCRwYXJhbXNbJ3RpdGxlJ10pKSAkbWFwLT50aXRsZSA9ICRwYXJhbXNbJ3RpdGxlJ107CmlmIChpc3NldCgkcGFyYW1zWydiYXNlbWFwJ10pKSAkbWFwLT5iYXNlbWFwID0gJHBhcmFtc1snYmFzZW1hcCddOwppZiAoaXNzZXQoJHBhcmFtc1snb3ZlcmxheSddKSkgJG1hcC0+b3ZlcmxheSA9ICRwYXJhbXNbJ292ZXJsYXknXTsKaWYgKGlzc2V0KCRwYXJhbXNbJ292ZXJsYXlfcGFyYW1ldGVycyddKSkgJG1hcC0+b3ZlcmxheV9wYXJhbWV0ZXJzID0gJHBhcmFtc1snb3ZlcmxheV9wYXJhbWV0ZXJzJ107CmlmIChpc3NldCgkcGFyYW1zWyd0ZW1wbGF0ZSddKSkgJG1hcC0+dGVtcGxhdGUgPSAkcGFyYW1zWyd0ZW1wbGF0ZSddOwoKJHRlbXBsYXRlX25hbWVzID0gJHRoaXMtPkxpc3RUZW1wbGF0ZXMoKTsKJHRlbXBsYXRlcyA9IGFycmF5KCk7Ci8vIGFkZCB0aGUgZmlsZSBiYXNlZCBkZWZhdWx0IHRlbXBsYXRlCiR0ZW1wbGF0ZXNbJ2RlZmF1bHQnXSA9ICdkZWZhdWx0JzsKZm9yZWFjaCAoJHRlbXBsYXRlX25hbWVzIGFzICR0KSB7CgkkdGVtcGxhdGVzWyR0XSA9ICR0Owp9CgovLyB3aXBlIG91dCB0aGUgbWFwIGlkIGlmIHdlIGFyZSBjcmVhdGluZyBhIGNvcHkgb2YgdGhlIG1hcAppZiAoYXJyYXlfa2V5X2V4aXN0cygnY29weV9tYXAnLCAkcGFyYW1zKSkgewogICAgJG1hcC0+bWFwX2lkID0gbnVsbDsKICAgICRtYXAtPm5hbWUgPSBudWxsOwp9CgppZiAoaXNzZXQoJHBhcmFtc1snZXJyb3InXSkpIHsKICAgICRzbWFydHktPmFzc2lnbignZXJyb3InLCAkcGFyYW1zWydlcnJvciddKTsKfQoKJHNtYXJ0eS0+YXNzaWduKCdzdGFydF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlX21hcCcsICRyZXR1cm5pZCkpOwoKJHNtYXJ0eS0+YXNzaWduKCduYW1lJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICduYW1lJywgJG1hcC0+bmFtZSwgOTYpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9uYW1lJywgJHRoaXMtPkxhbmcoJ3RpdGxlX21hcF9uYW1lJykpOwokc21hcnR5LT5hc3NpZ24oJ3RpdGxlJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICd0aXRsZScsICRtYXAtPnRpdGxlLCA5NikpOwokc21hcnR5LT5hc3NpZ24oJ3RpdGxlX3RpdGxlJywgJHRoaXMtPkxhbmcoJ3RpdGxlX21hcF90aXRsZScpKTsKJHNtYXJ0eS0+YXNzaWduKCdiYXNlbWFwJywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdiYXNlbWFwJywgJG1hcC0+YmFzZW1hcCwgOTYpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9iYXNlbWFwJywgJHRoaXMtPkxhbmcoJ3RpdGxlX2Jhc2VtYXAnKSk7CiRzbWFydHktPmFzc2lnbigndGl0bGVfZXh0ZW50JywgJHRoaXMtPkxhbmcoJ3RpdGxlX2luaXRpYWxfZXh0ZW50JykpOwokc21hcnR5LT5hc3NpZ24oJ292ZXJsYXknLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ292ZXJsYXknLCAkbWFwLT5vdmVybGF5LCA5NikpOwokc21hcnR5LT5hc3NpZ24oJ3RpdGxlX292ZXJsYXknLCAkdGhpcy0+TGFuZygndGl0bGVfb3ZlcmxheScpKTsKJHNtYXJ0eS0+YXNzaWduKCdvdmVybGF5X3BhcmFtZXRlcnMnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ292ZXJsYXlfcGFyYW1ldGVycycsICRtYXAtPm92ZXJsYXlfcGFyYW1ldGVycywgOTYpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9vdmVybGF5X3BhcmFtZXRlcnMnLCAkdGhpcy0+TGFuZygndGl0bGVfb3ZlcmxheV9wYXJhbWV0ZXJzJykpOwokc21hcnR5LT5hc3NpZ24oJ2luaXRpYWxfZXh0ZW50JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsICdpbml0aWFsX2V4dGVudCcsICRtYXAtPmluaXRpYWxfZXh0ZW50LCA5NikpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiRzbWFydHktPmFzc2lnbignbWFwX2lkJywgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ21hcF9pZCcsICRtYXAtPm1hcF9pZCkpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfbmFtZScsICR0aGlzLT5MYW5nKCdoZWxwX21hcF9uYW1lJykpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfdGl0bGUnLCAkdGhpcy0+TGFuZygnaGVscF9tYXBfdGl0bGUnKSk7CiRzbWFydHktPmFzc2lnbignaGVscF9iYXNlbWFwJywgJHRoaXMtPkxhbmcoJ2hlbHBfbWFwX2Jhc2VtYXAnKSk7CiRzbWFydHktPmFzc2lnbignaGVscF9leHRlbnQnLCAkdGhpcy0+TGFuZygnaGVscF9tYXBfZXh0ZW50JykpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfb3ZlcmxheScsICR0aGlzLT5MYW5nKCdoZWxwX21hcF9vdmVybGF5JykpOwokc21hcnR5LT5hc3NpZ24oJ2hlbHBfb3ZlcmxheV9wYXJhbWV0ZXJzJywgJHRoaXMtPkxhbmcoJ2hlbHBfbWFwX292ZXJsYXlfcGFyYW1ldGVycycpKTsKJHNtYXJ0eS0+YXNzaWduKCdoZWxwX3RlbXBsYXRlX25hbWUnLCAkdGhpcy0+TGFuZygnaGVscF90ZW1wbGF0ZScpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV90ZW1wbGF0ZV9uYW1lJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlX25hbWUnKSk7CiRzbWFydHktPmFzc2lnbigndGVtcGxhdGVzJywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCAndGVtcGxhdGVfbmFtZScsICR0ZW1wbGF0ZXMsIC0xLCAkbWFwLT50ZW1wbGF0ZV9uYW1lKSk7CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZWRpdF9tYXAudHBsJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_add_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBFZGl0IGEgbWFwIHRlbXBsYXRlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCi8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIGFzIGEgY21zbXMgbW9kdWxlIGFjdGlvbgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsgCgokdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoKTsKaWYgKGlzc2V0KCRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXSkpIHsKICAgIC8vIHBvcHVsYXRlIGZpZWxkcyBmcm9tIHRoZSBkYXRhYmFzZQogICAgdHJ5IHsKICAgICAgICAkdGVtcGxhdGUtPmNvbnRlbnQgPSAkdGhpcy0+R2V0VGVtcGxhdGUoJHBhcmFtc1sndGVtcGxhdGVfbmFtZSddKTsKICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoCiAgICAgICAgICAgICAgICAndGVtcGxhdGVzJywKICAgICAgICAgICAgICAgIGFycmF5KCdlcnJvcic9PiAnRmFpbGVkIHRvIGxvYWQgdGVtcGxhdGUgJy4kcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10uJyBBbHNvLCAnLiRlLT5nZXRNZXNzYWdlKCkpKTsKICAgIH0KICAgIGlmICghaXNzZXQoJHBhcmFtc1snY29weV90ZW1wbGF0ZSddKSkgewogICAgICAgICR0ZW1wbGF0ZS0+bmFtZSA9ICRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXTsKICAgIH0KfSBlbHNlIHsKICAgIC8vIG5ldyB0ZW1wbGF0ZSAtLSBwb3B1bGF0ZSBjb2RlIHdpdGggdGhlIGRlZmF1bHQgdGVtcGxhdGUuCiAgICAkdGVtcGxhdGUtPmNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cyhfX0RJUl9fLicvdGVtcGxhdGVzL21hcC50cGwnKTsKfQoKLy8gcG9wdWxhdGUgdGhlIGZpZWxkcyB3aXRoIGRhdGEgaW4gd2UgYXJlIHJldHVybmluZyBmcm9tIHRoaXMgcGFnZSwgaWUKLy8gZm9sbG93aW5nIGZhaWxlZCBmb3JtIHZhbGlkYXRpb24uCmlmIChpc3NldCgkcGFyYW1zWyduYW1lJ10pKSAkdGVtcGxhdGUtPm5hbWUgPSAkcGFyYW1zWyduYW1lJ107CmlmIChpc3NldCgkcGFyYW1zWydjb2RlJ10pKSAkdGVtcGxhdGUtPmNvbnRlbnQgPSAkcGFyYW1zWyd0ZW1wbGF0ZV9jb2RlJ107Cgokc21hcnR5ID0gJHRoaXMtPnNtYXJ0eTsKJHNtYXJ0eS0+YXNzaWduKCdzdGFydF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdhZG1pbl9zYXZlX3RlbXBsYXRlJywgJHJldHVybmlkKSk7CiRzbWFydHktPmFzc2lnbignbmFtZScsIAogICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsIAogICAgICAgICduYW1lJywgCiAgICAgICAgJHRlbXBsYXRlLT5uYW1lLCAKICAgICAgICA5NiwgCiAgICAgICAgOTYsIAogICAgICAgIHN0cmxlbigkdGVtcGxhdGUtPm5hbWUpID4gMCAmJiAhYXJyYXlfa2V5X2V4aXN0cygnY29weV90ZW1wbGF0ZScsJHBhcmFtcykgPycgcmVhZG9ubHk9InJlYWRvbmx5Iic6JycpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9uYW1lJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlX25hbWUnKSk7CiRzbWFydHktPmFzc2lnbignY29kZScsICR0aGlzLT5DcmVhdGVTeW50YXhBcmVhKCRpZCwgJHRlbXBsYXRlLT5jb250ZW50LCAndGVtcGxhdGVfY29kZScpKTsKJHNtYXJ0eS0+YXNzaWduKCd0aXRsZV9jb2RlJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlX2NvZGUnKSk7CiRzbWFydHktPmFzc2lnbignaGVscF9uYW1lJywgJHRoaXMtPkxhbmcoJ2hlbHBfdGVtcGxhdGVfbmFtZScpKTsKJHNtYXJ0eS0+YXNzaWduKCdoZWxwX2NvZGUnLCAkdGhpcy0+TGFuZygnaGVscF90ZW1wbGF0ZV9jb2RlJykpOwokc21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKJHNtYXJ0eS0+YXNzaWduKCdjYW5jZWwnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnY2FuY2VsJywgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CmlmIChpc3NldCgkcGFyYW1zWydlcnJvciddKSkgewogICAgJHNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10pOwp9CmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnZWRpdF90ZW1wbGF0ZS50cGwnKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.admin_copy_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBFZGl0IGEgbWFwIHRlbXBsYXRlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCi8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIGFzIGEgY21zbXMgbW9kdWxlIGFjdGlvbgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsgCiAgICAkcGFyYW1zWydjb3B5X21hcCddID0gdHJ1ZTsKICAgICR0aGlzLT5SZWRpcmVjdCgkaWQsICdhZG1pbl9hZGRfbWFwJywgJHJldHVybmlkLCAkcGFyYW1zKTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.admin_copy_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBFZGl0IGEgbWFwIHRlbXBsYXRlCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCi8vIG1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIGFzIGEgY21zbXMgbW9kdWxlIGFjdGlvbgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsgCiAgICAkcGFyYW1zWydjb3B5X3RlbXBsYXRlJ10gPSB0cnVlOwogICAgJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2FkbWluX2FkZF90ZW1wbGF0ZScsICRyZXR1cm5pZCwgJHBhcmFtcyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.admin_delete_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAgCi8qIHZpbTogc2V0IGV4cGFuZHRhYiB0YWJzdG9wPTQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6ICovCgovKioKICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdGVtcGxhdGUgZnJvbSB0aGUgZGF0YWJhc2UuCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKCFpc3NldCgkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pIHx8IHN0cmxlbigkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pID09IDAgfHwgaXNfbnVsbCgkcGFyYW1zWyd0ZW1wbGF0ZV9uYW1lJ10pKSB7CiAgICAkcGFyYW1zWydlcnJvciddID0gJ3RlbXBsYXRlIG5hbWUgbm90IHNldCc7CiAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCd0ZW1wbGF0ZXMnLCAkcGFyYW1zKTsKICAgIHJldHVybjsKfSBlbHNlIHsKICAgIHRyeSB7CiAgICAgICAgJHRoaXMtPkRlbGV0ZVRlbXBsYXRlKCRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXSk7CiAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJ0ZhaWxlZCB0byBkZWxldGUgdGVtcGxhdGUnOwogICAgfQp9CiR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycpOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/action.admin_save_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGNoYW5nZXMgdG8gYSBtYXAgdGVtcGxhdGUKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKLy8gbWFrZSBzdXJlIHdlJ3JlIHJ1bm5pbmcgYXMgYSBjbXNtcyBtb2R1bGUgYWN0aW9uCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OyAKCmlmIChpc3NldCgkcGFyYW1zWydjYW5jZWwnXSkpIHsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycpOwp9IGVsc2UgaWYgKGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdCddKSkgewogICAgaWYgKCRwYXJhbXNbJ25hbWUnXSA9PSAnZGVmYXVsdCcpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJyJkZWZhdWx0IiBpcyBub3QgYSB2YWxpZCB0ZW1wbGF0ZSBuYW1lLic7CiAgICAgICAgJHRoaXMtPlJlZGlyZWN0KCRpZCwnYWRtaW5fYWRkX3RlbXBsYXRlJywkcmV0dXJuaWQsJHBhcmFtcyk7CiAgICB9CiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ25hbWUnXSkgfHwgc3RybGVuKCRwYXJhbXNbJ25hbWUnXSkgPT0gMCB8fCBpc19udWxsKCRwYXJhbXNbJ25hbWUnXSkpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX3RlbXBsYXRlX25vX25hbWUnKTsKICAgICAgICAkdGhpcy0+UmVkaXJlY3QoJGlkLCAnYWRtaW5fYWRkX3RlbXBsYXRlJywgJHJldHVybmlkLCAkcGFyYW1zKTsKICAgIH0KICAgICR0ZW1wbGF0ZSA9IG5ldyByZGZmZ190ZW1wbGF0ZTsKCSR0ZW1wbGF0ZS0+bmFtZSA9ICRwYXJhbXNbJ25hbWUnXTsKCSR0ZW1wbGF0ZS0+Y29udGVudCA9ICRwYXJhbXNbJ3RlbXBsYXRlX2NvZGUnXTsKICAgIHRyeSB7CiAgICAgICAgJHRoaXMtPlNldFRlbXBsYXRlKCRwYXJhbXNbJ25hbWUnXSwkcGFyYW1zWyd0ZW1wbGF0ZV9jb2RlJ10pOwogICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgJHBhcmFtc1snZXJyb3InXSA9ICdGYWlsZWQgdG8gc2F2ZSB0ZW1wbGF0ZSwgJy4kZS0+Z2V0TWVzc2FnZSgpOwogICAgfQoKICAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycsICRwYXJhbXMpOwoKfSBlbHNlIHsKCS8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQoJJHRoaXMtPkZpcmVEZWJ1Zygnd2FybmluZycsJ0dvdCB0byBzYXZlIHRlbXBsYXRlIHdpdGggbm8gc3VibWl0IG9yIGNhbmNlbCBhY3Rpb24gZGVmaW5lZC4nKTsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3RlbXBsYXRlcycpOwp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBDcmVhdGUgdGhlIG1hcCBvbiB0aGUgcGFnZQogKgogKiBjb3B5cmlnaHQgMjAxMywgUmVnaW9uYWwgRGlzdHJpY3Qgb2YgRnJhc2VyLUZvcnQgR2VvcmdlCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgT3IKICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAoKKiovCgppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCiRlcnJvciA9IG51bGw7CiRtYXAgPSBudWxsOwoKaWYgKCFpc3NldCgkcGFyYW1zWyduYW1lJ10pKSB7CgkkZXJyb3IgPSAkdGhpcy0+TGFuZygnbWFwX25hbWVfbm90X3NldCcpOwp9IGVsc2UgewoJdHJ5IHsKCQkkbWFwID0gbWFwX29wZXJhdGlvbnM6OmdldF9tYXBfYnlfbmFtZSgkcGFyYW1zWyduYW1lJ10pOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbigncmRtYXAnLCAkbWFwKTsKCX0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJCSR0aGlzLT5GaXJlRGVidWcoJ2Vycm9yJywgJ0NvdWxkIG5vdCByZXRyaWV2ZSBtYXAgJy4kcGFyYW1zWyduYW1lJ10pOwoJCSRlcnJvciA9ICR0aGlzLT5MYW5nKCdlcnJvcl9tYXBfbm90X2ZvdW5kJykgLiAnICgnIC4gJHBhcmFtc1snbmFtZSddIC4gJyknOwoJfQp9CiR0aGlzLT5zbWFydHktPmFzc2lnbignZXJyb3InLCAkZXJyb3IpOwppZiAoJG1hcCA9PT0gbnVsbCkgewogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICAgIHJldHVybjsKfQoKaWYgKCRtYXAtPmJhc2VtYXAgPT0gTlVMTCkgewoJJG1hcC0+YmFzZW1hcCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2Jhc2VtYXAnKTsKfQppZiAoJG1hcC0+aW5pdGlhbF9leHRlbnQgPT0gTlVMTCkgewoJJG1hcC0+aW5pdGlhbF9leHRlbnQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnaW5pdGlhbF9leHRlbnQnKTsKfQoKaWYgKCRtYXAtPnRlbXBsYXRlX25hbWUgPT0gJ2RlZmF1bHQnKSB7CiAgICAkdGhpcy0+RmlyZURlYnVnKCdpbmZvJywgJ1Byb2Nlc3NpbmcgZGVmYXVsdCB0ZW1wbGF0ZScpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdtYXAudHBsJyk7Cn0gZWxzZSB7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJG1hcC0+dGVtcGxhdGVfbmFtZSk7Cn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNYWluIGFkbWluIHBhbmVsCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKaWYgKEZBTFNFID09IGVtcHR5KCRwYXJhbXNbJ2FjdGl2ZV90YWInXSkpIHsKCSR0YWIgPSAkcGFyYW1zWydhY3RpdmVfdGFiJ107Cn0gZWxzZSB7CgkkdGFiID0gJyc7Cn0KCiR0YWJfaGVhZGVyID0gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpIC4KCSR0aGlzLT5TZXRUYWJIZWFkZXIoJ2dlbmVyYWwnLCAkdGhpcy0+TGFuZygndGl0bGVfZ2VuZXJhbCcpLCgnZ2VuZXJhbCcgPT0gJHRhYik/dHJ1ZTpmYWxzZSkgLgoJJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZmVyZW5jZXMnLCAkdGhpcy0+TGFuZygndGl0bGVfcHJlZnMnKSwoJ3ByZWZlcmVuY2VzJyA9PSAkdGFiKT90cnVlOmZhbHNlKS4KCSR0aGlzLT5TZXRUYWJIZWFkZXIoJ21hcHMnLCAkdGhpcy0+TGFuZygndGl0bGVfbWFwcycpLCAoJ21hcHMnID09ICR0YWIpP3RydWU6ZmFsc2UpLgoJJHRoaXMtPlNldFRhYkhlYWRlcigndGVtcGxhdGVzJywgJHRoaXMtPkxhbmcoJ3RpdGxlX3RlbXBsYXRlcycpLCAoJ3RlbXBsYXRlcycgPT0gJHRhYik/dHJ1ZTpmYWxzZSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0X2dlbmVyYWxfdGFiJywkdGhpcy0+U3RhcnRUYWIoJ2dlbmVyYWwnLCRwYXJhbXMpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydF9wcmVmZXJlbmNlX3RhYicsICR0aGlzLT5TdGFydFRhYigncHJlZmVyZW5jZXMnLCAkcGFyYW1zKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRfbWFwc190YWInLCAkdGhpcy0+U3RhcnRUYWIoJ21hcHMnLCAkcGFyYW1zKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRfdGVtcGxhdGVzX3RhYicsICR0aGlzLT5TdGFydFRhYigndGVtcGxhdGVzJywgJHBhcmFtcykpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0YWJzX3N0YXJ0JywgJHRhYl9oZWFkZXIuJHRoaXMtPkVuZFRhYkhlYWRlcnMoKS4kdGhpcy0+U3RhcnRUYWJDb250ZW50KCkpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RhYl9lbmQnLCR0aGlzLT5FbmRUYWIoKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFic19lbmQnLCR0aGlzLT5FbmRUYWJDb250ZW50KCkpOwoKLy8gbW9kdWxlIGRlZmF1bHRzIGZvcm0KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdGFydF9mb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlX2FkbWluX3ByZWZzJywgJHJldHVybmlkKSk7CgovLyBkZWZhdWx0IGJhc2VtYXAKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZV9iYXNlbWFwJywgJHRoaXMtPkxhbmcoJ3RpdGxlX2RlZmF1bHRfYmFzZW1hcCcsJycpKTsKJHRoaXMtPkZpcmVEZWJ1ZygnaW5mbycsJ0Jhc2VtYXA6ICcuJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlZmF1bHRfYmFzZW1hcCcsJycpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9iYXNlbWFwJywgJHRoaXMtPkNyZWF0ZUlucHV0VXJsKCRpZCwnYmFzZW1hcCcsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2Jhc2VtYXAnLCcnKSwgOTYpKTsKCi8vIGluaXRpYWwgZXh0ZW50cwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RpdGxlX2V4dGVudCcsICR0aGlzLT5MYW5nKCd0aXRsZV9kZWZhdWx0X2V4dGVudCcsJycpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9leHRlbnQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2luaXRpYWxfZXh0ZW50JywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2luaXRpYWxfZXh0ZW50JywnJyksIDk2KSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignd2VsY29tZV90ZXh0JywkdGhpcy0+TGFuZygnd2VsY29tZV90ZXh0JykpOwoKLy8gbWFwcyBwYWdlCiR0aGlzLT5zbWFydHktPmFzc2lnbignbWFwX2lkJywgJHRoaXMtPkxhbmcoJ2ZpZWxkX21hcF9pZCcpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXBfbmFtZScsICR0aGlzLT5MYW5nKCdmaWVsZF9tYXBfbmFtZScpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXBfYmFzZW1hcCcsICR0aGlzLT5MYW5nKCdmaWVsZF9tYXBfYmFzZW1hcCcpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXBfb3ZlcmxheScsICR0aGlzLT5MYW5nKCdmaWVsZF9tYXBfb3ZlcmxheScpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtYXBfaW5pdGlhbF9leHRlbnQnLCAkdGhpcy0+TGFuZygnZmllbGRfbWFwX2luaXRpYWxfZXh0ZW50JykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21hcHNfdGVtcGxhdGUnLCBfX0RJUl9fLicvdGVtcGxhdGVzL2FkbWlubWFwcy50cGwnKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZW1wbGF0ZXNfdGVtcGxhdGUnLCBfX0RJUl9fLicvdGVtcGxhdGVzL2FkbWludGVtcGxhdGVzLnRwbCcpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2ZpZWxkX3RlbXBsYXRlX25hbWUnLCAkdGhpcy0+TGFuZygnZmllbGRfdGVtcGxhdGVfbmFtZScpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdmaWVsZF90ZW1wbGF0ZV9pZCcsICR0aGlzLT5MYW5nKCdmaWVsZF90ZW1wbGF0ZV9pZCcpKTsKCiRtYXBsaXN0ID0gbWFwX29wZXJhdGlvbnM6OmdldF9tYXBzKCk7Cgpmb3JlYWNoICgkbWFwbGlzdCBhcyAkbWFwKSB7CgkkbWFwLT5lZGl0X2xpbmsgPSAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwgJ2FkbWluX2FkZF9tYXAnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdlZGl0X21hcCcpLAoJCQkgJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsJycsCgkJCWFycmF5KCdtYXBfaWQnPT4kbWFwLT5tYXBfaWQpKTsKICAgICRtYXAtPmNvcHlfbGluayA9ICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCAnYWRtaW5fY29weV9tYXAnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdjb3B5X21hcCcpLAogICAgICAgICAgICAnaWNvbnMvc3lzdGVtL2NvcHkuZ2lmJywgJycsCiAgICAgICAgICAgIGFycmF5KCdtYXBfaWQnPT4kbWFwLT5tYXBfaWQpKTsKCSRtYXAtPmRlbGV0ZV9saW5rID0gJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsICdkZWxldGVfbWFwJywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygnZGVsZXRlX21hcCcpLAoJCQknaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLCcnLAoJCQlhcnJheSgnbWFwX2lkJz0+JG1hcC0+bWFwX2lkKSk7Cn0KCiR0aGlzLT5zbWFydHktPmFzc2lnbignbWFwbGlzdCcsICRtYXBsaXN0KTsKJHRoaXMtPkZpcmVEZWJ1ZygnaW5mbycsICdGb3VuZCAnLmNvdW50KG1hcF9vcGVyYXRpb25zOjpnZXRfbWFwcygpKS4nIG1hcHMuJyk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignYWRkX21hcCcsICR0aGlzLT5DcmVhdGVJbWFnZUxpbmsoJGlkLCdhZG1pbl9hZGRfbWFwJywkcmV0dXJuaWQsICcnLCAnaWNvbnMvc3lzdGVtL25ld29iamVjdC5naWYnLCR0aGlzLT5MYW5nKCdhZGRfbWFwJykpKTsKCi8vIHRlbXBsYXRlcyBwYWdlCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGVtcGxhdGVfaWQnLCAkdGhpcy0+TGFuZygnZmllbGRfdGVtcGxhdGVfaWQnKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGVtcGxhdGVfbmFtZScsICR0aGlzLT5MYW5nKCdmaWVsZF90ZW1wbGF0ZV9uYW1lJykpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlX2NvZGUnLCAkdGhpcy0+TGFuZygnZmllbGRfdGVtcGxhdGVfY29kZScpKTsKJHRlbXBsYXRlX25hbWVzID0gJHRoaXMtPkxpc3RUZW1wbGF0ZXMoKTsKJHRlbXBsYXRlX2xpc3QgPSBhcnJheSgpOwoKZm9yZWFjaCgkdGVtcGxhdGVfbmFtZXMgYXMgJHRlbXBsYXRlX25hbWUpIHsKCSR0ZW1wbGF0ZSA9IG5ldyByZGZmZ190ZW1wbGF0ZTsKCSR0ZW1wbGF0ZS0+bmFtZSA9ICR0ZW1wbGF0ZV9uYW1lOwoJJHRlbXBsYXRlLT5lZGl0X2xpbmsgPSAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwgCgkJJ2FkbWluX2FkZF90ZW1wbGF0ZScsIAoJCSRyZXR1cm5pZCwgJHRoaXMtPkxhbmcoJ2VkaXRfdGVtcGxhdGUnKSwKCQknaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywnJywKCQlhcnJheSgndGVtcGxhdGVfbmFtZSc9PiR0ZW1wbGF0ZS0+bmFtZSkpOwogICAgJHRlbXBsYXRlLT5jb3B5X2xpbmsgPSAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwKICAgICAgICAnYWRtaW5fY29weV90ZW1wbGF0ZScsCiAgICAgICAgJHJldHVybmlkLCAkdGhpcy0+TGFuZygnY29weV90ZW1wbGF0ZScpLAogICAgICAgICdpY29ucy9zeXN0ZW0vY29weS5naWYnLCcnLAogICAgICAgIGFycmF5KCd0ZW1wbGF0ZV9uYW1lJz0+JHRlbXBsYXRlLT5uYW1lKSk7CgkkdGVtcGxhdGUtPmRlbGV0ZV9saW5rID0gJHRoaXMtPkNyZWF0ZUltYWdlTGluaygkaWQsIAoJCSdhZG1pbl9kZWxldGVfdGVtcGxhdGUnLCAKCQkkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCdkZWxldGVfdGVtcGxhdGUnKSwKCQknaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLCcnLAoJCWFycmF5KCd0ZW1wbGF0ZV9uYW1lJz0+JHRlbXBsYXRlLT5uYW1lKSk7CgkkdGVtcGxhdGVfbGlzdFtdID0gJHRlbXBsYXRlOwp9CgokdGhpcy0+RmlyZURlYnVnKCdpbmZvJywnJGlkIGlzOiAnLiRpZC4nLCBhbmQgJHJldHVybmlkIGlzOiAnLiRyZXR1cm5pZCk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RlbXBsYXRlbGlzdCcsICR0ZW1wbGF0ZV9saXN0KTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhZGRfdGVtcGxhdGUnLCAkdGhpcy0+Q3JlYXRlSW1hZ2VMaW5rKCRpZCwgJ2FkbWluX2FkZF90ZW1wbGF0ZScsICRyZXR1cm5pZCwKCScnLAoJJ2ljb25zL3N5c3RlbS9uZXdvYmplY3QuZ2lmJywKCSR0aGlzLT5MYW5nKCdhZGRfdGVtcGxhdGUnKSkpOwoKaWYgKGlzc2V0KCRwYXJhbXNbJ2Vycm9yJ10pKSB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yX21zZycsICRwYXJhbXNbJ2Vycm9yJ10pOwp9CgplY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2FkbWlucGFuZWwudHBsJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.delete_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBEZWxldGUgYSBtYXAgZnJvbSB0aGUgZGF0YWJhc2UKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKaWYgKCFpc3NldCgkZ0NtcykpIGV4aXQ7CgppZiAoIWlzc2V0KCRwYXJhbXNbJ21hcF9pZCddKSkgewoJJHRoaXMtPkZpcmVEZWJ1ZygnZXJyb3InLCdtYXAgaWQgbm90IHNldCcpOyAKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKfQoKdHJ5IHsKCSRtYXAgPSBtYXBfb3BlcmF0aW9uczo6Z2V0X21hcF9ieV9pZCgkcGFyYW1zWydtYXBfaWQnXSk7Cn0KY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewoJJHRoaXMtPkZpcmVEZWJ1Zygnd2FybmluZycsICdGYWlsZWQgdG8gZ2V0IG1hcCAnLiRwYXJhbXNbJ21hcF9pZCddLicgZnJvbSB0aGUgZGF0YWJhc2UnKTsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKfQoKbWFwX29wZXJhdGlvbnM6OmRlbGV0ZV9tYXAoJG1hcCk7CiR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.save_admin_prefs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGNoYW5nZXMgdG8gbW9kdWxlIHByZWZlcmVuY2VzCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKLy8gc2V0IHRoZSBwcmVmZXJlbmNlcwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVmYXVsdF9iYXNlbWFwJywgaXNzZXQoJHBhcmFtc1snYmFzZW1hcCddKT8kcGFyYW1zWydiYXNlbWFwJ106JycpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnaW5pdGlhbF9leHRlbnQnLCBpc3NldCgkcGFyYW1zWydpbml0aWFsX2V4dGVudCddKT8kcGFyYW1zWydpbml0aWFsX2V4dGVudCddOicnKTsKCiRwYXJtcyA9IGFycmF5KCk7CiRwYXJtc1snYmFzZW1hcCddID0gKGlzc2V0KCRwYXJhbXNbJ2Jhc2VtYXAnXSk/JHBhcmFtc1snYmFzZW1hcCddOicnKTsKJHBhcm1zWydpbml0aWFsX2V4dGVudCddID0gKGlzc2V0KCRwYXJhbXNbJ2luaXRpYWxfZXh0ZW50J10pPyRwYXJhbXNbJ2luaXRpYWxfZXh0ZW50J106JycpOwokdGhpcy0+U2VuZEV2ZW50KCdPblJETWFwUHJlZmVyZW5jZUNoYW5nZScsJHBhcm1zKTsKCi8vIHNldCB0aGUgYWN0aXZlIHRhYiBhbmQgbWVzc2FnZQokcGFyYW1zID0gYXJyYXkoJ3RhYl9tZXNzYWdlJz0+ICdwcmVmc3VwZGF0ZWQnLCAnYWN0aXZldGFiJyA9PiAncHJlZmVyZW5jZXMnKTsKJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCwgJHBhcmFtcyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/action.save_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGNoYW5nZXMgdG8gYSBtYXAKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwppZiAoIWlzc2V0KCRnQ21zKSkgZXhpdDsKCmlmIChpc3NldCgkcGFyYW1zWydjYW5jZWwnXSkpIHsKCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKCn0gZWxzZSBpZiAoaXNzZXQoJHBhcmFtc1snc3VibWl0J10pKSB7CglpZiAoaXNzZXQoJHBhcmFtc1snbWFwX2lkJ10pICYmICRwYXJhbXNbJ21hcF9pZCddICE9PSAnJyApIHsKCQkkbWFwID0gbWFwX29wZXJhdGlvbnM6OmdldF9tYXBfYnlfaWQoJHBhcmFtc1snbWFwX2lkJ10pOwoJfSBlbHNlIHsKCQkkbWFwID0gbmV3IHJkZmZnX21hcDsKCX0KCiAgICBpZiAoIWlzc2V0KCRwYXJhbXNbJ25hbWUnXSkgfHwgc3RybGVuKCRwYXJhbXNbJ25hbWUnXSkgPT0gMCB8fCBpc19udWxsKCRwYXJhbXNbJ25hbWUnXSkpIHsKICAgICAgICAkcGFyYW1zWydlcnJvciddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21hcF9ub19uYW1lJyk7CiAgICAgICAgJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2FkbWluX2FkZF9tYXAnLCAkcmV0dXJuaWQsICRwYXJhbXMpOwogICAgfQoKCSRtYXAtPm5hbWUgPSAkcGFyYW1zWyduYW1lJ107CgkkbWFwLT50aXRsZSA9ICRwYXJhbXNbJ3RpdGxlJ107CgkkbWFwLT5iYXNlbWFwID0gJHBhcmFtc1snYmFzZW1hcCddOwoJJG1hcC0+b3ZlcmxheSA9ICRwYXJhbXNbJ292ZXJsYXknXTsKICAgICRtYXAtPm92ZXJsYXlfcGFyYW1ldGVycyA9ICRwYXJhbXNbJ292ZXJsYXlfcGFyYW1ldGVycyddOwoJJG1hcC0+aW5pdGlhbF9leHRlbnQgPSAkcGFyYW1zWydpbml0aWFsX2V4dGVudCddOwoJJG1hcC0+dGVtcGxhdGVfbmFtZSA9ICRwYXJhbXNbJ3RlbXBsYXRlX25hbWUnXTsKCW1hcF9vcGVyYXRpb25zOjpzYXZlX21hcCgkbWFwKTsKCn0gZWxzZSB7CgkvLyBlcnJvciBjb25kaXRpb24/Cn0KCSR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ21hcHMnKTsKCj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/event.Core.ContentPostRender.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBQcm9jZXNzIHRoZSBwYWdlIHBvc3QtcmVuZGVyLiBTcGVjaWZpY2FsbHksIGFkZCB0aGUgbGVhZmxldCBKUyBzY3JpcHRzIGFuZAogKiBDU1MgdG8gdGhlIHBhZ2UuCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmlmICghaXNzZXQoJGdDbXMpKSBleGl0OwokbW9kID0gY21zX3V0aWxzOjpnZXRfbW9kdWxlKCdSRE1hcCcpOwoKJHNtYXJ0eSA9IGNtc21zKCktPkdldFNtYXJ0eSgpOwokdHBsX3ZhcnMgPSAkc21hcnR5LT5nZXRfdGVtcGxhdGVfdmFycygpOwppZiAoYXJyYXlfa2V5X2V4aXN0cygncmRtYXAnLCR0cGxfdmFycykpIHsKJGNvbnRlbnQgPSAkcGFyYW1zWydjb250ZW50J107CiRkZXRhaWxfa2V5d29yZHMgPSAnJzsKCi8vIEdldCB0aGUgaGVhZCBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudAoKJGhlYWRzdGFydCA9IHN0cnBvcygkY29udGVudCwnPGhlYWQ+Jyk7CiRoZWFkZW5kICAgPSBzdHJwb3MoJGNvbnRlbnQsJzwvaGVhZD4nKTsKJGhlYWRsZW5ndGggPSAkaGVhZGVuZCAtICRoZWFkc3RhcnQ7CiRoZWFkY29udGVudCA9IHN1YnN0cigkY29udGVudCwkaGVhZHN0YXJ0LCRoZWFkbGVuZ3RoKTsKCi8vIGNzcyBmaWxlCmlmIChwcmVnX21hdGNoKCIvXHMqPGxpbmsuKmxlYWZsZXQuY3NzLyIsICRoZWFkY29udGVudCkpIHsKCSRoZWFkY29udGVudCAuPSAnPCEtLSBSRCBNYXAgbW9kdWxlIGZvdW5kIGFub3RoZXIgbGVhZmxldCBjc3MgZmlsZSBoZXJlLiBSZW1vdmUgaXQgZnJvbSB0aGUgdGVtcGxhdGUgdG8gdXNlIHRoZSBvbmUgaW5jbHVkZWQgYnkgdGhlIE1hcCBtb2R1bGVcbiAtLT4nOwp9CmVsc2UgewoJJGhlYWRjb250ZW50IC49ICI8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cImh0dHA6Ly9jZG4ubGVhZmxldGpzLmNvbS9sZWFmbGV0LTAuNy4yL2xlYWZsZXQuY3NzXCIgLz5cclxuIjsKfQoKLy8gamF2YXNjcmlwdCBmaWxlcwppZiAocHJlZ19tYXRjaCgnL1xzKjxzY3JpcHQuKlwvbGVhZnRsZXQuanMvJywkaGVhZGNvbnRlbnQpKSB7CgkkaGVhZGNvbnRlbnQgLj0gIjwhLS0gUkQgTWFwIG1vZHVsZSBmb3VuZCBhbm90aGVyIGxlYWZsZXQuanMgZmlsZSBpbmNsdWRlZC4gUmVtb3ZlIGl0IGZyb20gdGhlIHRlbXBsYXRlIHRvIHVzZSB0aGUgb25lIGluY2x1ZGVkIGJ5IHRoZSBNYXAgbW9kdWxlLiAtLT5cbiI7Cn0KZWxzZSB7CgkkaGVhZGNvbnRlbnQgLj0gIlx0PHNjcmlwdCBzcmM9XCJodHRwOi8vY2RuLmxlYWZsZXRqcy5jb20vbGVhZmxldC0wLjcuMi9sZWFmbGV0LmpzXCI+PC9zY3JpcHQ+XHJcbiI7Cn0KaWYgKHByZWdfbWF0Y2goJy9zKjxzY3JpcHQuKmVzcmktbGVhZmxldC5qcy8nLCAkaGVhZGNvbnRlbnQpKSB7CgkkaGVhZGNvbnRlbnQgLj0gIjwhLS0gUkQgTWFwIG1vZHVsZSBmb3VuZCBhbm90aGVyIGVzcmktbGVhZmxldC5qcyBmaWxlIGluY2x1ZGVkLiBSZW1vdmUgaXQgZnJvbSB0aGUgdGVtcGxhdGUgdG8gdXNlIHRoZSBvbmUgaW5jbHVkZWQgYnkgdGhlIE1hcCBtb2R1bGUuIC0tPlxuIjsKfSBlbHNlIHsKCSRoZWFkY29udGVudCAuPSAiXHQ8c2NyaXB0IHNyYz1cIiIuJHRoaXMtPkdldE1vZHVsZVVybFBhdGgoKS4iL2xpYi9qcy9lc3JpLWxlYWZsZXQvZXNyaS1sZWFmbGV0LXNyYy5qc1wiPjwvc2NyaXB0PlxyXG4iOwp9CgoKJGNvbnRlbnQgPSBzdWJzdHJfcmVwbGFjZSgkY29udGVudCwkaGVhZGNvbnRlbnQsJGhlYWRzdGFydCwkaGVhZGxlbmd0aCk7CgokcGFyYW1zWydjb250ZW50J10gPSAkY29udGVudDsKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/images/icon.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAKEEAAAAAAAA/38AAP7+/iwAAAAAIAAgAAACoNwSpiPrDw1yosX7JsVc6WV11weGYpY81QMAJ6msS3sel1xLSAqZogYD1VyLXQQ3ABBny2LQEFI6lE3nE6mgVq1Bn0E72vGg2CQVI+aFfNKtxwkVZr+RscfrddtU9jjdtdVn0TeTZOhgh0P4pRQQuFEUAXj4JhcJASh16ZeBaQiQNublYTc5JtrRB4poifZWlZgjAVsiW9dqqwOZW4mLUQAAOw==]]></data>
	</file>
	<file>
	  <filename>/index.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKgogKiBjb3B5cmlnaHQgMjAxMywgUmVnaW9uYWwgRGlzdHJpY3Qgb2YgRnJhc2VyLUZvcnQgR2VvcmdlCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgT3IKICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAoKKiovCgoKJGxhbmdbJ2FkZF9tYXAnXSA9ICdBZGQgTWFwJzsKJGxhbmdbJ2FkZF90ZW1wbGF0ZSddID0gJ0FkZCBUZW1wbGF0ZSc7CiRsYW5nWydjb3B5X21hcCddID0gJ0NvcHkgTWFwJzsKJGxhbmdbJ2NvcHlfdGVtcGxhdGUnXSA9ICdDb3B5IFRlbXBsYXRlJzsKJGxhbmdbJ2RlbGV0ZV9tYXAnXSA9ICdEZWxldGUgTWFwJzsKJGxhbmdbJ2RlbGV0ZV90ZW1wbGF0ZSddID0gJ0RlbGV0ZSBUZW1wbGF0ZSc7CiRsYW5nWydlZGl0X21hcCddID0gJ0VkaXQgTWFwJzsKJGxhbmdbJ2VkaXRfdGVtcGxhdGUnXSA9ICdFZGl0IFRlbXBsYXRlJzsKJGxhbmdbJ2Vycm9yX21hcF9ub19uYW1lJ10gPSAnVGhlIG1hcCBtdXN0IGhhdmUgbmFtZSc7CiRsYW5nWydlcnJvcl90ZW1wbGF0ZV9ub19uYW1lJ10gPSAnVGhlIHRlbXBsYXRlIG11c3QgaGF2ZSBhIG5hbWUnOwokbGFuZ1snY2FuY2VsJ10gPSAnQ2FuY2VsJzsKJGxhbmdbJ2ZpZWxkX21hcF9pZCddID0gJ01hcCBJRCc7CiRsYW5nWydmaWVsZF9tYXBfdGl0bGUnXSA9ICdUaXRsZSc7CiRsYW5nWydmaWVsZF9tYXBfbmFtZSddID0gJ05hbWUnOwokbGFuZ1snZmllbGRfbWFwX2Jhc2VtYXAnXSA9ICdCYXNlbWFwJzsKJGxhbmdbJ2ZpZWxkX21hcF9vdmVybGF5J10gPSAnT3ZlcmxheSBNYXAnOwokbGFuZ1snZmllbGRfbWFwX2luaXRpYWxfZXh0ZW50J10gPSAnSW5pdGlhbCBFeHRlbnQnOwokbGFuZ1snZmllbGRfdGVtcGxhdGVfaWQnXSA9ICdUZW1wbGF0ZSBJRCc7CiRsYW5nWydmaWVsZF90ZW1wbGF0ZV9uYW1lJ10gPSAnTmFtZSc7IAokbGFuZ1snZnJpZW5kbHluYW1lJ10gPSAnUkQgTWFwJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBpcyB0aGlzIHRoaW5nPzwvaDM+CjxwPlRoZSBSRCBNYXAgbW9kdWxlIGNhbiBkaXNwbGF5IGEgbWFwIG9uIGEgcGFnZS4gVGhhdFwncyBhYm91dCBpdCwgcmVhbGx5LiBBIG1hcCBoYXMgYSBiYXNlbWFwIGxheWVyLCBhbmQgY2FuIGhhdmUgYW4gb3ZlcmxheSBsYXllci48L3A+PGgzPkhvdyBEbyBJIFVzZSBJdD88L2gzPgo8cD5XaGVuIGVkaXRpbmcgYSBwYWdlIChvciB0ZW1wbGF0ZSksIHBsYWNlIHRoZSB7TWFwfSB0YWcgc29tZXdoZXJlLiBUaGUgbWFwIHRhZyBoYXMgb25lIHJlcXVpcmVkIGFyZ3VtZW50LCB0aGF0IG9mIHRoZSBuYW1lIG9mIHRoZSBtYXAgdG8gaW5jbHVkZSwgbGlrZSBzbzogPHR0PntNYXAmbmJzcDtuYW1lPSZsdDttYXBfbmFtZSZndDt9PC90dD4uPC9wPgo8aDM+Q3JlYXRpbmcgTWFwczwvaDM+PHA+ClNvIGZhciwgdGhlIGRlZmF1bHQgbWFwIHRlbXBsYXRlIHJlcXVpcmVzIGFuIEFyY0dJUyB0aWxlZCBtYXAgc2VydmljZSBmb3IgYSBiYXNlbWFwLCBhbmQgYW4gQXJjR0lTIGZlYXR1cmUgc2VydmljZSBmb3IgdGhlIG92ZXJsYXkgbWFwLiBUaGUgbWFwIHRlbXBsYXRlcyBhcmUgY29tcGxldGVseSBjdXN0b21pemFibGUsIGhvd2V2ZXIuCjxoND5NYXAgTmFtZXMgYW5kIFRpdGxlczwvaDQ+CjxwPlRoZSBtYXAgbmFtZSBpcyBhIGhhbmR5IG5hbWUgdGhhdCB0aGUgc2l0ZSBhZG1pbmlzdHJhdG9yIGNhbiB1c2UgdG8gcmVmZXJlbmNlIHRoZSBtYXAgb24gdGhlIHBhZ2VzIHdoZXJlIGl0IGFwcGVhcnMuIFRoZSBzaXRlIHVzZXJzIHNob3VsZCBuZXZlciBzZWUgaXQuIFRoZSBtYXAgdGl0bGUgc2hvd3MgdXAgaW4gdGhlIGRlZmF1bHQgdGVtcGxhdGUgcmlnaHQgYWJvdmUgdGhlIG1hcC4KPC9wPjxoND5CYXNlbWFwczwvaDQ+PHA+VGhlIGJhc2VtYXAgc2hvdWxkIGJlIHRoZSBVUkwgdG8gdGhlIHNlcnZpY2UgdGhhdCBwcm92aWRlcyB0aGUgcmFzdGVyIGJhc2VtYXAgdGlsZXMuIEJ5IGRlZmF1bHQgdGhpcyBpcyBBcmNHSVMgU2VydmVyLCBhbmQgc2hvdWxkIGJlIHRoZSBVUkwgcmlnaHQgdXAgdG8gKGFuZCBpbmNsdWRpbmcpIHRoZSBNYXBTZXJ2ZXIgcGFydC4gQW55IG90aGVyIGtpbmQgb2YgYmFzZW1hcCBzZXJ2aWNlIHdpbGwgcmVxdWlyZSBhIGN1c3RvbWl6ZWQgdGVtcGxhdGUgdG8gc3VwcG9ydC48L3A+CjxoND5Jbml0aWFsIE1hcCBFeHRlbnQ8aDQ+PHA+ClRoZSBpbml0aWFsIG1hcCBleHRlbnQgc2V0dGluZyBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjZW50cmUgb2YgdGhlIG1hcCBhbmQgdGhlIHpvb20gbGV2ZWwgYXMgdGhlIG1hcCBsb2Fkcy4gVGhlIGV4dGV0bnQgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyA8dHQ+bGF0L2xvbmcvem9vbTwvdHQ+LCB3aGVyZSA8dHQ+bGF0PC90dD4gYW5kIDx0dD5sb25nPC90dCBhcmUgaW4gZGVjaW1hbCBkZWdyZWVzLCBhbmQgdGhlIDx0dD56b29tPC90dD4gaXMgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDIwLjwvcD4KPGg0Pk1hcCBPdmVybGF5IGFuZCBPdmVybGF5IFBhcmFtZXRlcnM8L2g0PjxwPgpXaXRoIHRoZSBkZWZhdWx0IHRlbXBsYXRlLCB0aGUgbWFwIG92ZXJsYXkgaXMgdHJlYXRlZCBhcyBhbiBBcmNHSVMgUkVTVCBGZWF0dXJlU2VydmVyIGxheWVyLiBPdGhlciBzZXJ2aWNlcyBhcmUgcG9zc2libGUgKGFzIHVzdWFsKSB3aXRoIGEgY3VzdG9taXplZCB0ZW1wbGF0ZS4gVGhlIG9wdGlvbmFsIG92ZXJsYXkgcGFyYW1ldGVycyBhcmUgZXh0cmEgcXVlcnkgcGFyYW1ldGVycyB0byBiZSBhZGRlZCBvbiB0byBldmVyeSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIsIGFuZCBtaWdodCBiZSBzb21ldGhpbmcgbGlrZTwvcD4KPHByZT53aGVyZT1OQU1FIExJS0UgIlNUQVRJT04iPC9wcmU+CjxwPkZvciB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSwgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSA8dHQ+d2hlcmU8L3R0PiBhbmQgPHR0PnRva2VuPC90dD4uCjxwPk11bHRpcGxlIHBhcmFtZXRlcnMgY2FuIGJlIHNlcGFyYXRlZCBieSBzZW1pY29sb25zLgo8L3A+JzsKJGxhbmdbJ2hlbHBfbmFtZSddID0gJ1RoZSBuYW1lIG9mIHRoZSBtYXAgdG8gYmUgcGxhY2VkIG9uIHRoZSBwYWdlLiBUaGlzIG5hbWUgd29uXCd0IHNob3cgdXAgYW55d2hlcmUgdGhlIHNpdGUgdXNlcnMgY2FuIHNlZSwgYW5kIGNhblwndCBoYXZlIGFueSBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLic7CiRsYW5nWydoZWxwX21hcF9iYXNlbWFwJ10gPSAnVXJsIHRvIHRoZSB0aWxpbmcgbWFwIHNlcnZpY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIGJhc2VtYXAnOwokbGFuZ1snaGVscF9tYXBfZXh0ZW50J10gPSAnVGhlIGluaXRpYWwgZXh0ZW50IG9mIHRoZSBtYXAsIGdpdmVuIGluIHRoZSBmb3JtIG9mIGxvbmdpdHVkZS9sYXRpdHVkZS96b29tLiBMYXQvbG9uZyBhcmUgaW4gZGVjaW1hbCBkZWdyZWVzLCBhbmQgbWFyayB0aGUgY2VudHJlIG9mIHRoZSBtYXAuIFRoZSBab29tIHBhcmFtZXRlciBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDE5Lic7CiRsYW5nWydoZWxwX21hcF9uYW1lJ10gPSAnVGhlIG5hbWUgaXMgdXNlZCBieSB0aGUge01hcH0gdGFnIGFuZCBzaG91bGQgY29udGFpbiBubyBzcGFjZXMgb3IgcHVuY3R1YXRpb24uJzsKJGxhbmdbJ2hlbHBfbWFwX292ZXJsYXknXSA9ICdVcmwgdG8gdGhlIG92ZXJsYXkgbWFwLiBUaGlzIHNob3VsZCBiZSBhIGZlYXR1cmUgc2VydmljZSB0aGF0IGNhbiBiZSBxdWVyaWVkIGZvciBhdHRyaWJ1dGVzLic7CiRsYW5nWydoZWxwX21hcF9vdmVybGF5X3BhcmFtZXRlcnMnXSA9ICdBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gaW5jbHVkZSB3aGVuIHF1ZXJ5aW5nIGZvciBvdmVybGF5IGZlYXR1cmVzLiBUaGUgdHlwaWNhbCB1c2Ugd291bGQgYmUgYSBBcmNHSVMgUkVTVCB3aGVyZSBjbGF1c2UuJzsKJGxhbmdbJ2hlbHBfbWFwX3RpdGxlJ10gPSAnVGhlIHRpdGxlIG9mIHRoZSBtYXAgdGhhdCB3aWxsIHNob3cgdXAgb24gdGhlIHBhZ2UuJzsKJGxhbmdbJ2hlbHBfdGVtcGxhdGUnXSA9ICdUaGUgdGVtcGxhdGUgZm9yIHRoZSBtYXAuIFRlbXBsYXRlcyBjYW4gYmUgY3VzdG9taXNlZCB0byBjb21wbGV0ZWx5IHJlZGVzaWduIGxvb2sgYW5kIGZ1bmN0aW9uIG9mIHRoZSBtYXAuJzsKJGxhbmdbJ2hlbHBfdGVtcGxhdGVfbmFtZSddID0gIlRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZS4gTWFrZSB0aGlzIGRlc2NyaXB0aXZlIGVub3VnaCB0aGF0IGl0XCdzIGVhc3kgdG8gaWRlbnRpZnkgd2hlbiBjcmVhdGluZyBhIG1hcC4iOwokbGFuZ1snaGVscF90ZW1wbGF0ZV9jb2RlJ10gPSAnVGhlIGNvZGUgdGhhdCBkZXNjcmliZSB0aGUgbG9vayBhbmQgYmVoYXZpb3VyIG9mIHRoZSBtYXAnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnaW5zdGFsbGVkJzsKJGxhbmdbJ21hcF9uYW1lX25vdF9zZXQnXSA9ICdNYXAgZXJyb3I6IHRoZSBtYXAgbmFtZSB3YXMgbm90IHNldCc7CiRsYW5nWydlcnJvcl9tYXBfbm90X2ZvdW5kJ10gPSAnVGhlIG1hcCB3YXMgbm90IGZvdW5kJzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWyd0aXRsZV9iYXNlbWFwJ10gPSAnQmFzZW1hcCc7CiRsYW5nWyd0aXRsZV9kZWZhdWx0X2Jhc2VtYXAnXSA9ICdEZWZhdWx0IEJhc2VtYXAnOwokbGFuZ1sndGl0bGVfZGVmYXVsdF9leHRlbnQnXSA9ICdEZWZhdWx0IE1hcCBFeHRlbnRzJzsKJGxhbmdbJ3RpdGxlX2luaXRpYWxfZXh0ZW50J10gPSAnSW5pdGlhbCBNYXAgRXh0ZW50JzsKJGxhbmdbJ3RpdGxlX2lucHV0X2RlZmF1bHRfYmFzZW1hcF9oZWxwJ10gPSAnU2V0IHRoZSBkZWZhdWx0IGJhc2VtYXAgdXJsJzsKJGxhbmdbJ3RpdGxlX2dlbmVyYWwnXSA9ICdHZW5lcmFsJzsKJGxhbmdbJ3RpdGxlX21hcHMnXSA9ICdNYXBzJzsKJGxhbmdbJ3RpdGxlX21hcF9uYW1lJ10gPSAnTmFtZSc7CiRsYW5nWyd0aXRsZV9tYXBfdGl0bGUnXSA9ICdUaXRsZSc7CiRsYW5nWyd0aXRsZV9vdmVybGF5J10gPSAnTWFwIE92ZXJsYXknOwokbGFuZ1sndGl0bGVfb3ZlcmxheV9wYXJhbWV0ZXJzJ10gPSAnTWFwIE92ZXJsYXkgQWRkaXRpb25hbCBQYXJhbWV0ZXJzJzsKJGxhbmdbJ3RpdGxlX3ByZWZzJ10gPSAnUHJlZmVyZW5jZXMnOwokbGFuZ1sndGl0bGVfdGVtcGxhdGVfbmFtZSddID0gJ01hcCBUZW1wbGF0ZSc7CiRsYW5nWyd0aXRsZV90ZW1wbGF0ZV9jb2RlJ10gPSAnVGVtcGxhdGUgQ29kZSc7CiRsYW5nWyd0aXRsZV90ZW1wbGF0ZXMnXSA9ICdUZW1wbGF0ZXMnOwokbGFuZ1sndW5pbnN0YWxsZWQnXSA9ICd1bmluc3RhbGxlZCc7CiRsYW5nWyd1cGdyYWRlX2ZhaWxlZCddID0gJ1VwZ3JhZGUgZmFpbGVkJzsKJGxhbmdbJ3dlbGNvbWVfdGV4dCddID0gJzxwPlRoaXMgaXMgdGhlIFJEIE1hcHMgbW9kdWxlLiBQbGFjZSBpdCBvbiBhIHBhZ2Ugd2l0aCB0aGUge01hcCBuYW1lPSZsdDttYXBfbmFtZSZndDt9IHRhZy48L3A+JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/.class.map_operations.php.swp</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[YjBWSU0gNy40AAAAABAAADGk3VLkJxIAATgAAGRtYWhvbmV5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZWJpYW52bQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3Zhci93d3cvbW9kdWxlcy9SRE1hcC9saWIvY2xhc3MubWFwX29wZXJhdGlvbnMucGhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1dGYtOA0AMzIxMAAAAAAjIiEgExJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAgB/AAAAAgAAAAAAAAB0AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAADAAAAAAAAAA4AAAAAAAAAdQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhZAAABgAAAPIBAAAAEAAAdAAAAAAAAAD6DwAAuw8AALoPAAC2DwAAiw8AAIgPAABNDwAASg8AAP8OAACxDgAAZA4AAE4OAABNDgAA/g0AALUNAABoDQAAHA0AANUMAACHDAAARgwAAEUMAABBDAAAQAwAACMMAADvCwAA1QsAALQLAACVCwAAhgsAAOMKAADfCgAA1goAAMUKAAAPCgAA6AkAAOQJAADCCQAAlwkAAIYJAACCCQAAgQkAAGIJAAA+CQAAOgkAACsJAAAoCQAAJwkAAPoIAADgCAAAlwgAAG0IAABRCAAAMggAABAIAAAMCAAAAwgAANoHAADWBwAAxwcAAMQHAADDBwAAkgcAAHgHAAAxBwAABQcAAMsGAACsBgAAigYAAH8GAABMBgAASAYAAEcGAAA4BgAANQYAADQGAAAPBgAA/AUAAOIFAACqBQAAjAUAAHEFAABHBQAAIQUAABwFAAAYBQAACAUAAAUFAAAEBQAAzgQAALwEAAChBAAAigQAAHIEAABYBAAAPgQAABkEAAD4AwAA2AMAAMkDAADGAwAAxQMAAJkDAACDAwAAZAMAAEkDAAAsAwAACwMAAOoCAACzAgAAhAIAAFcCAABKAgAARwIAAEYCAAAQAgAA8gEAAPMBAAAAAAAAAAAJCWlmICghaXNzZXQoJG1hcC0+bWFwX2lkKSkgewAJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWxldGVfbWFwKHJkZmZnX21hcCYgJG1hcCkgewAACX0ACQlyZXR1cm4gJG07AAkJJG0tPnRlbXBsYXRlX25hbWUgPSAkcm93Wyd0ZW1wbGF0ZV9uYW1lJ107AAkJJG0tPmluaXRpYWxfZXh0ZW50ID0gJHJvd1snaW5pdGlhbF9leHRlbnQnXTsACQkkbS0+b3ZlcmxheV9wYXJhbWV0ZXJzID0gJHJvd1snb3ZlcmxheV9wYXJhbWV0ZXJzJ107AAkJJG0tPm92ZXJsYXkgPSAkcm93WydvdmVybGF5J107AAkJJG0tPmJhc2VtYXAgPSAkcm93WydiYXNlbWFwJ107AAkJJG0tPnRpdGxlID0gJHJvd1sndGl0bGUnXTsACQkkbS0+bmFtZSA9ICRyb3dbJ25hbWUnXTsACQkkbS0+bWFwX2lkID0gJHJvd1snbWFwX2lkJ107AAkJJG0gPSBuZXcgcmRmZmdfbWFwOwAJcHVibGljIHN0YXRpYyBmdW5jdGlvbiAmcm93X3RvX21hcCgkcm93KSB7AAAJfQAJCXJldHVybiAkYXJyOwAJCSRhcnJbXSA9ICRtYXAtPnRlbXBsYXRlX25hbWU7AAkJJGFycltdID0gJG1hcC0+aW5pdGlhbF9leHRlbnQ7AAkJJGFycltdID0gJG1hcC0+b3ZlcmxheV9wYXJhbWV0ZXJzOwAJCSRhcnJbXSA9ICRtYXAtPm92ZXJsYXk7AAkJJGFycltdID0gJG1hcC0+YmFzZW1hcDsACQkkYXJyW10gPSAkbWFwLT50aXRsZTsACQkkYXJyW10gPSAkbWFwLT5uYW1lOwAJCS8vJGFycltdID0gJG1hcC0+bWFwX2lkOwAJCSRhcnIgPSBhcnJheSgpOwAJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXBfdG9fcm93KHJkZmZnX21hcCYgJG1hcCkgewAACX0ACQlyZXR1cm4gJG1hcHM7AAkJfQAJCQl9AAkJCQkkbWFwc1tdID0gc2VsZjo6cm93X3RvX21hcCgkcm93KTsACQkJZm9yZWFjaCAoJHJlc3VsdC0+R2V0Um93cygpIGFzICRyb3cpIHsACQlpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHsACQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxKTsACQkkcSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAnOwAJCSRkYiA9IGNtc21zKCktPkdldERiKCk7AAkJJG1hcHMgPSBhcnJheSgpOwAJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWFwcygpIHsAAAl9AAkJcmV0dXJuICRtYXA7AAAJCX0ACQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignbWFwIG5vdCBmb3VuZCwnLiRkYi0+c3FsKTsACQl9IGVsc2UgewAJCQkkbWFwID0gc2VsZjo6cm93X3RvX21hcCgkcm93KTsACQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7AAkJaWYgKCRyZXN1bHQgIT09IGZhbHNlICYmICRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewAJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHEsIGFycmF5KCRuYW1lKSk7AAkJJHEgPSAnU0VMRUNUICogRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX3JkbWFwIFdIRVJFIG5hbWUgPSA/JzsACQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwAJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWFwX2J5X25hbWUoJG5hbWUpIHsAAAl9AAkJcmV0dXJuICRtYXA7AAkJfQAJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdtYXAgbm90IGZvdW5kJyk7AAkJZWxzZSB7AAkJfQAJCQkkbWFwID0gc2VsZjo6cm93X3RvX21hcCgkcm93KTsACQkJJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCk7AAkJaWYgKCRyZXN1bHQgIT09IGZhbHNlKSB7IAAJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHEsIGFycmF5KCRpZCkpOwAJCSRxID0gJ1NFTEVDVCAqIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9yZG1hcCBXSEVSRSBtYXBfaWQgPSA/JzsACQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwAJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfbWFwX2J5X2lkKCRpZCkgewAACX0ACQlyZXR1cm4gdHJ1ZTsACQl9AAkJCSRtYXAtPm1hcF9pZCA9ICRkYi0+SW5zZXJ0X0lkKCk7AAkJaWYgKGlzX251bGwoJG1hcC0+bWFwX2lkKSkgewAACQl9AAkJCXJldHVybiBmYWxzZTsACQkJZGllICgkZGItPnNxbC4nPGJyLz4nLiRkYi0+RXJyb3JNc2coKSk7AAkJaWYoISRkYi0+RXhlY3V0ZSgkc3FsLCAkdG1wKSkgewAJCX0ACQkJJHRtcFsnbWFwX2lkJ10gPSAoaW50KSRtYXAtPm1hcF9pZDsACQkJJHNxbCA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcCBTRVQgbmFtZSA9ID8sIHRpdGxlID0gPywgYmFzZW1hcCA9ID8sIG92ZXJsYXkgPSA/LCBvdmVybGF5X3BhcmFtZXRlcnMgPSA/LCBpbml0aWFsX2V4dGVudCA9ID8sIHRlbXBsYXRlX25hbWUgPSA/IFdIRVJFIG1hcF9pZCA9ID8iOwAJCQkvLyB1cGRhdGUgbWFwAAkJZWxzZSB7AAkJfQAJCQkkc3FsID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXAgKG5hbWUsIHRpdGxlLCBiYXNlbWFwLCBvdmVybGF5LCBvdmVybGF5X3BhcmFtZXRlcnMsIGluaXRpYWxfZXh0ZW50LCB0ZW1wbGF0ZV9uYW1lKSBWQUxVRVMgKD8sPyw/LD8sPyw/LD8pIjsACQkJLy8gc2F2ZSBtYXAACQlpZiAoaXNfbnVsbCgkbWFwLT5tYXBfaWQpKSB7AAkJJHRtcCA9IHNlbGY6Om1hcF90b19yb3coJG1hcCk7AAkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsACXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F2ZV9tYXAocmRmZmdfbWFwJiAkbWFwKSB7AGZpbmFsIGNsYXNzIG1hcF9vcGVyYXRpb25zIHsAACoqLwAAICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgAgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlACAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwAgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yACAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQAACAqIGFueSBsYXRlciB2ZXJzaW9uLgAgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pACAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlACAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0ACAqACAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UAICoAICogU2F2ZSBhbmQgbG9hZCBtYXBzIHRvL2Zyb20gdGhlIGRhdGFiYXNlAC8qKgAALyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8APD9waHAAYWQAAGgOAAC8DgAAABAAAA4AAAAAAAAAxg8AAMIPAACoDwAAYQ8AAC8PAAAUDwAACQ8AAAUPAAD8DgAAyA4AAMQOAADBDgAAvw4AALwOAAC7DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8+AH0ACX0ACQl9AAkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0ZhaWxlZCB0byBkZWxldGUgdGhlIG1hcCcpOwAJCWVsc2UgewAJCX0ACQkJcmV0dXJuOwAJCWlmICgkcmVzdWx0ICE9PSBmYWxzZSkgewAJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHEsYXJyYXkoJG1hcC0+bWFwX2lkKSk7AAkJJHEgPSAnREVMRVRFIEZST00gJy5jbXNfZGJfcHJlZml4KCkuJ21vZHVsZV9yZG1hcCBXSEVSRSBtYXBfaWQgPSA/JzsACQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwAJCX0ACQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignQ2FuXCd0IGRlbGV0ZSBhIG1hcCB3aXRoIG5vIElEJyk7AA==]]></data>
	</file>
	<file>
	  <filename>/lib/class.map_operations.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBTYXZlIGFuZCBsb2FkIG1hcHMgdG8vZnJvbSB0aGUgZGF0YWJhc2UKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKZmluYWwgY2xhc3MgbWFwX29wZXJhdGlvbnMgewoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXZlX21hcChyZGZmZ19tYXAmICRtYXApIHsKCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCSR0bXAgPSBzZWxmOjptYXBfdG9fcm93KCRtYXApOwoJCWlmIChpc19udWxsKCRtYXAtPm1hcF9pZCkpIHsKCQkJLy8gc2F2ZSBtYXAKCQkJJHNxbCA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JkbWFwIChuYW1lLCB0aXRsZSwgYmFzZW1hcCwgb3ZlcmxheSwgb3ZlcmxheV9wYXJhbWV0ZXJzLCBpbml0aWFsX2V4dGVudCwgdGVtcGxhdGVfbmFtZSkgVkFMVUVTICg/LD8sPyw/LD8sPyw/KSI7CgkJfQoJCWVsc2UgewoJCQkvLyB1cGRhdGUgbWFwCgkJCSRzcWwgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXAgU0VUIG5hbWUgPSA/LCB0aXRsZSA9ID8sIGJhc2VtYXAgPSA/LCBvdmVybGF5ID0gPywgb3ZlcmxheV9wYXJhbWV0ZXJzID0gPywgaW5pdGlhbF9leHRlbnQgPSA/LCB0ZW1wbGF0ZV9uYW1lID0gPyBXSEVSRSBtYXBfaWQgPSA/IjsKCQkJJHRtcFsnbWFwX2lkJ10gPSAoaW50KSRtYXAtPm1hcF9pZDsKCQl9CgkJaWYoISRkYi0+RXhlY3V0ZSgkc3FsLCAkdG1wKSkgewoJCQlkaWUgKCRkYi0+c3FsLic8YnIvPicuJGRiLT5FcnJvck1zZygpKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKGlzX251bGwoJG1hcC0+bWFwX2lkKSkgewoJCQkkbWFwLT5tYXBfaWQgPSAkZGItPkluc2VydF9JZCgpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9tYXBfYnlfaWQoJGlkKSB7CgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKCQkkcSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAgV0hFUkUgbWFwX2lkID0gPyc7CgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcSwgYXJyYXkoJGlkKSk7CgkJaWYgKCRyZXN1bHQgIT09IGZhbHNlKSB7IAoJCQkkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJJG1hcCA9IHNlbGY6OnJvd190b19tYXAoJHJvdyk7CgkJfQoJCWVsc2UgewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdtYXAgbm90IGZvdW5kJyk7CgkJfQoJCXJldHVybiAkbWFwOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21hcF9ieV9uYW1lKCRuYW1lKSB7CgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKCQkkcSA9ICdTRUxFQ1QgKiBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAgV0hFUkUgbmFtZSA9ID8nOwoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHEsIGFycmF5KCRuYW1lKSk7CgkJaWYgKCRyZXN1bHQgIT09IGZhbHNlICYmICRyZXN1bHQtPlJlY29yZENvdW50KCkgPT0gMSkgewoJCQkkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKTsKCQkJJG1hcCA9IHNlbGY6OnJvd190b19tYXAoJHJvdyk7CgkJfSBlbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignbWFwIG5vdCBmb3VuZCwnLiRkYi0+c3FsKTsKCQl9CgoJCXJldHVybiAkbWFwOwoJfQoKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0X21hcHMoKSB7CgkJJG1hcHMgPSBhcnJheSgpOwoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7CgkJJHEgPSAnU0VMRUNUICogRlJPTSAnLmNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX3JkbWFwJzsKCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxKTsKCQlpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHsKCQkJZm9yZWFjaCAoJHJlc3VsdC0+R2V0Um93cygpIGFzICRyb3cpIHsKCQkJCSRtYXBzW10gPSBzZWxmOjpyb3dfdG9fbWFwKCRyb3cpOwoJCQl9CgkJfQoJCXJldHVybiAkbWFwczsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hcF90b19yb3cocmRmZmdfbWFwJiAkbWFwKSB7CgkJJGFyciA9IGFycmF5KCk7CgkJLy8kYXJyW10gPSAkbWFwLT5tYXBfaWQ7CgkJJGFycltdID0gJG1hcC0+bmFtZTsKCQkkYXJyW10gPSAkbWFwLT50aXRsZTsKCQkkYXJyW10gPSAkbWFwLT5iYXNlbWFwOwoJCSRhcnJbXSA9ICRtYXAtPm92ZXJsYXk7CgkJJGFycltdID0gJG1hcC0+b3ZlcmxheV9wYXJhbWV0ZXJzOwoJCSRhcnJbXSA9ICRtYXAtPmluaXRpYWxfZXh0ZW50OwoJCSRhcnJbXSA9ICRtYXAtPnRlbXBsYXRlX25hbWU7CgkJcmV0dXJuICRhcnI7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiAmcm93X3RvX21hcCgkcm93KSB7CgkJJG0gPSBuZXcgcmRmZmdfbWFwOwoJCSRtLT5tYXBfaWQgPSAkcm93WydtYXBfaWQnXTsKCQkkbS0+bmFtZSA9ICRyb3dbJ25hbWUnXTsKCQkkbS0+dGl0bGUgPSAkcm93Wyd0aXRsZSddOwoJCSRtLT5iYXNlbWFwID0gJHJvd1snYmFzZW1hcCddOwoJCSRtLT5vdmVybGF5ID0gJHJvd1snb3ZlcmxheSddOwoJCSRtLT5vdmVybGF5X3BhcmFtZXRlcnMgPSAkcm93WydvdmVybGF5X3BhcmFtZXRlcnMnXTsKCQkkbS0+aW5pdGlhbF9leHRlbnQgPSAkcm93Wydpbml0aWFsX2V4dGVudCddOwoJCSRtLT50ZW1wbGF0ZV9uYW1lID0gJHJvd1sndGVtcGxhdGVfbmFtZSddOwoJCXJldHVybiAkbTsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlbGV0ZV9tYXAocmRmZmdfbWFwJiAkbWFwKSB7CgkJaWYgKCFpc3NldCgkbWFwLT5tYXBfaWQpKSB7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0NhblwndCBkZWxldGUgYSBtYXAgd2l0aCBubyBJRCcpOwoJCX0KCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOwoJCSRxID0gJ0RFTEVURSBGUk9NICcuY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAgV0hFUkUgbWFwX2lkID0gPyc7CgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcSxhcnJheSgkbWFwLT5tYXBfaWQpKTsKCQlpZiAoJHJlc3VsdCAhPT0gZmFsc2UpIHsKCQkJcmV0dXJuOwoJCX0KCQllbHNlIHsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbignRmFpbGVkIHRvIGRlbGV0ZSB0aGUgbWFwJyk7CgkJfQoJfQp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.rdffg_map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBSZXByZXNlbnRzIGEgbWFwCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCgoJY2xhc3MgcmRmZmdfbWFwIHsKCQlwdWJsaWMgJG1hcF9pZCA9IE5VTEw7CgkJcHVibGljICRuYW1lID0gTlVMTDsKCQlwdWJsaWMgJHRpdGxlID0gTlVMTDsKCQlwdWJsaWMgJGJhc2VtYXAgPSBOVUxMOwoJCXB1YmxpYyAkb3ZlcmxheQk9IE5VTEw7CiAgICAgICAgcHVibGljICRvdmVybGF5X3BhcmFtZXRlcnMgPSBOVUxMOwoJCXB1YmxpYyAkaW5pdGlhbF9leHRlbnQgPSBOVUxMOwoJCXB1YmxpYyAkdGVtcGxhdGVfbmFtZSA9IE5VTEw7CgkJcHVibGljICRlZGl0X2xpbmsgPSBOVUxMOwogICAgICAgIHB1YmxpYyAkY29weV9saW5rID0gTlVMTDsKCQlwdWJsaWMgJGRlbGV0ZV9saW5rID0gTlVMTDsKCX0KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.rdffg_template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIHJkZmZnX3RlbXBsYXRlIGV4dGVuZHMgVGVtcGxhdGUgewoJcHVibGljICRlZGl0X2xpbmsgPSBOVUxMOwoJcHVibGljICRkZWxldGVfbGluayA9IE5VTEw7CglwdWJsaWMgJGNvcHlfbGluayA9IE5VTEw7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/esri-leaflet-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMS1iZXRhLjMgLSAyMDE0LTAxLTE3CiogICBDb3B5cmlnaHQgKGMpIDIwMTQgRW52aXJvbm1lbnRhbCBTeXN0ZW1zIFJlc2VhcmNoIEluc3RpdHV0ZSwgSW5jLgoqICAgQXBhY2hlIExpY2Vuc2UqLwooZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKCiAgLy8gTm9kZS4KICBpZih0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CiAgfQoKICAvLyBCcm93c2VyIEdsb2JhbC4KICBpZih0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IikgewogICAgcm9vdC5UZXJyYWZvcm1lciA9IGZhY3RvcnkoKTsKICB9Cgp9KHRoaXMsIGZ1bmN0aW9uKCl7CiAgdmFyIGV4cG9ydHMgPSB7fSwKICAgICAgRWFydGhSYWRpdXMgPSA2Mzc4MTM3LAogICAgICBEZWdyZWVzUGVyUmFkaWFuID0gNTcuMjk1Nzc5NTEzMDgyMzIwLAogICAgICBSYWRpYW5zUGVyRGVncmVlID0gIDAuMDE3NDUzMjkyNTE5OTQzLAogICAgICBNZXJjYXRvckNSUyA9IHsKICAgICAgICAidHlwZSI6ICJsaW5rIiwKICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICJocmVmIjogImh0dHA6Ly9zcGF0aWFscmVmZXJlbmNlLm9yZy9yZWYvc3Itb3JnLzY5Mjgvb2djd2t0LyIsCiAgICAgICAgICAidHlwZSI6ICJvZ2N3a3QiCiAgICAgICAgfQogICAgICB9LAogICAgICBHZW9ncmFwaGljQ1JTID0gewogICAgICAgICJ0eXBlIjogImxpbmsiLAogICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgImhyZWYiOiAiaHR0cDovL3NwYXRpYWxyZWZlcmVuY2Uub3JnL3JlZi9lcHNnLzQzMjYvb2djd2t0LyIsCiAgICAgICAgICAidHlwZSI6ICJvZ2N3a3QiCiAgICAgICAgfQogICAgICB9OwoKICAvKgogIEludGVybmFsOiBzYWZlIHdhcm5pbmcKICAqLwogIGZ1bmN0aW9uIHdhcm4oKSB7CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpOwoKICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gdW5kZWZpbmVkICYmIGNvbnNvbGUud2FybikgewogICAgICBjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSwgYXJncyk7CiAgICB9CiAgfQoKICAvKgogIEludGVybmFsOiBFeHRlbmQgb25lIG9iamVjdCB3aXRoIGFub3RoZXIuCiAgKi8KICBmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb24sIHNvdXJjZSkgewogICAgZm9yICh2YXIgayBpbiBzb3VyY2UpIHsKICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgIGRlc3RpbmF0aW9uW2tdID0gc291cmNlW2tdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGVzdGluYXRpb247CiAgfQoKICAvKgogIFB1YmxpYzogQ2FsY3VsYXRlIGFuIGJvdW5kaW5nIGJveCBmb3IgYSBnZW9qc29uIG9iamVjdAogICovCiAgZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzIChnZW9qc29uKSB7CgogICAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHsKICAgICAgY2FzZSAnUG9pbnQnOgogICAgICAgIHJldHVybiBbIGdlb2pzb24uY29vcmRpbmF0ZXNbMF0sIGdlb2pzb24uY29vcmRpbmF0ZXNbMV0sIGdlb2pzb24uY29vcmRpbmF0ZXNbMF0sIGdlb2pzb24uY29vcmRpbmF0ZXNbMV1dOwoKICAgICAgY2FzZSAnTXVsdGlQb2ludCc6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21BcnJheShnZW9qc29uLmNvb3JkaW5hdGVzKTsKCiAgICAgIGNhc2UgJ0xpbmVTdHJpbmcnOgogICAgICAgIHJldHVybiBjYWxjdWxhdGVCb3VuZHNGcm9tQXJyYXkoZ2VvanNvbi5jb29yZGluYXRlcyk7CgogICAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOgogICAgICAgIHJldHVybiBjYWxjdWxhdGVCb3VuZHNGcm9tTmVzdGVkQXJyYXlzKGdlb2pzb24uY29vcmRpbmF0ZXMpOwoKICAgICAgY2FzZSAnUG9seWdvbic6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21OZXN0ZWRBcnJheXMoZ2VvanNvbi5jb29yZGluYXRlcyk7CgogICAgICBjYXNlICdNdWx0aVBvbHlnb24nOgogICAgICAgIHJldHVybiBjYWxjdWxhdGVCb3VuZHNGcm9tTmVzdGVkQXJyYXlPZkFycmF5cyhnZW9qc29uLmNvb3JkaW5hdGVzKTsKCiAgICAgIGNhc2UgJ0ZlYXR1cmUnOgogICAgICAgIHJldHVybiBjYWxjdWxhdGVCb3VuZHMoZ2VvanNvbi5nZW9tZXRyeSk7CgogICAgICBjYXNlICdGZWF0dXJlQ29sbGVjdGlvbic6CiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0ZvckZlYXR1cmVDb2xsZWN0aW9uKGdlb2pzb24pOwoKICAgICAgY2FzZSAnR2VvbWV0cnlDb2xsZWN0aW9uJzoKICAgICAgICByZXR1cm4gY2FsY3VsYXRlQm91bmRzRm9yR2VvbWV0cnlDb2xsZWN0aW9uKGdlb2pzb24pOwoKICAgICAgZGVmYXVsdDoKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gdHlwZTogIiArIGdlb2pzb24udHlwZSk7CiAgICB9CiAgfQoKICAvKgogIEludGVybmFsOiBDYWxjdWxhdGUgYW4gYm91bmRpbmcgYm94IGZyb20gYW4gbmVzdGVkIGFycmF5IG9mIHBvc2l0aW9ucwogIFsKICAgIFsKICAgICAgWyBbbG5nLCBsYXRdLFtsbmcsIGxhdF0sW2xuZywgbGF0XSBdCiAgICBdCiAgICBbCiAgICAgIFtsbmcsIGxhdF0sW2xuZywgbGF0XSxbbG5nLCBsYXRdCiAgICBdCiAgICBbCiAgICAgIFtsbmcsIGxhdF0sW2xuZywgbGF0XSxbbG5nLCBsYXRdCiAgICBdCiAgXQogICovCiAgZnVuY3Rpb24gY2FsY3VsYXRlQm91bmRzRnJvbU5lc3RlZEFycmF5cyAoYXJyYXkpIHsKICAgIHZhciB4MSA9IG51bGwsIHgyID0gbnVsbCwgeTEgPSBudWxsLCB5MiA9IG51bGw7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaW5uZXIgPSBhcnJheVtpXTsKCiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5uZXIubGVuZ3RoOyBqKyspIHsKICAgICAgICB2YXIgbG9ubGF0ID0gaW5uZXJbal07CgogICAgICAgIHZhciBsb24gPSBsb25sYXRbMF07CiAgICAgICAgdmFyIGxhdCA9IGxvbmxhdFsxXTsKCiAgICAgICAgaWYgKHgxID09PSBudWxsKSB7CiAgICAgICAgICB4MSA9IGxvbjsKICAgICAgICB9IGVsc2UgaWYgKGxvbiA8IHgxKSB7CiAgICAgICAgICB4MSA9IGxvbjsKICAgICAgICB9CgogICAgICAgIGlmICh4MiA9PT0gbnVsbCkgewogICAgICAgICAgeDIgPSBsb247CiAgICAgICAgfSBlbHNlIGlmIChsb24gPiB4MikgewogICAgICAgICAgeDIgPSBsb247CiAgICAgICAgfQoKICAgICAgICBpZiAoeTEgPT09IG51bGwpIHsKICAgICAgICAgIHkxID0gbGF0OwogICAgICAgIH0gZWxzZSBpZiAobGF0IDwgeTEpIHsKICAgICAgICAgIHkxID0gbGF0OwogICAgICAgIH0KCiAgICAgICAgaWYgKHkyID09PSBudWxsKSB7CiAgICAgICAgICB5MiA9IGxhdDsKICAgICAgICB9IGVsc2UgaWYgKGxhdCA+IHkyKSB7CiAgICAgICAgICB5MiA9IGxhdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyIF07CiAgfQoKICAvKgogIEludGVybmFsOiBDYWxjdWxhdGUgYSBib3VuZGluZyBib3ggZnJvbSBhbiBhcnJheSBvZiBhcnJheXMgb2YgYXJyYXlzCiAgWwogICAgWyBbbG5nLCBsYXRdLFtsbmcsIGxhdF0sW2xuZywgbGF0XSBdCiAgICBbIFtsbmcsIGxhdF0sW2xuZywgbGF0XSxbbG5nLCBsYXRdIF0KICAgIFsgW2xuZywgbGF0XSxbbG5nLCBsYXRdLFtsbmcsIGxhdF0gXQogIF0KICAqLwogIGZ1bmN0aW9uIGNhbGN1bGF0ZUJvdW5kc0Zyb21OZXN0ZWRBcnJheU9mQXJyYXlzIChhcnJheSkgewogICAgdmFyIHgxID0gbnVsbCwgeDIgPSBudWxsLCB5MSA9IG51bGwsIHkyID0gbnVsbDsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBpbm5lciA9IGFycmF5W2ldOwoKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbm5lci5sZW5ndGg7IGorKykgewogICAgICAgIHZhciBpbm5lcmlubmVyID0gaW5uZXJbal07CiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBpbm5lcmlubmVyLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICB2YXIgbG9ubGF0ID0gaW5uZXJpbm5lcltrXTsKCiAgICAgICAgICB2YXIgbG9uID0gbG9ubGF0WzBdOwogICAgICAgICAgdmFyIGxhdCA9IGxvbmxhdFsxXTsKCiAgICAgICAgICBpZiAoeDEgPT09IG51bGwpIHsKICAgICAgICAgICAgeDEgPSBsb247CiAgICAgICAgICB9IGVsc2UgaWYgKGxvbiA8IHgxKSB7CiAgICAgICAgICAgIHgxID0gbG9uOwogICAgICAgICAgfQoKICAgICAgICAgIGlmICh4MiA9PT0gbnVsbCkgewogICAgICAgICAgICB4MiA9IGxvbjsKICAgICAgICAgIH0gZWxzZSBpZiAobG9uID4geDIpIHsKICAgICAgICAgICAgeDIgPSBsb247CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHkxID09PSBudWxsKSB7CiAgICAgICAgICAgIHkxID0gbGF0OwogICAgICAgICAgfSBlbHNlIGlmIChsYXQgPCB5MSkgewogICAgICAgICAgICB5MSA9IGxhdDsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoeTIgPT09IG51bGwpIHsKICAgICAgICAgICAgeTIgPSBsYXQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGxhdCA+IHkyKSB7CiAgICAgICAgICAgIHkyID0gbGF0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTJdOwogIH0KCiAgLyoKICBJbnRlcm5hbDogQ2FsY3VsYXRlIGEgYm91bmRpbmcgYm94IGZyb20gYW4gYXJyYXkgb2YgcG9zaXRpb25zCiAgWwogICAgW2xuZywgbGF0XSxbbG5nLCBsYXRdLFtsbmcsIGxhdF0KICBdCiAgKi8KICBmdW5jdGlvbiBjYWxjdWxhdGVCb3VuZHNGcm9tQXJyYXkgKGFycmF5KSB7CiAgICB2YXIgeDEgPSBudWxsLCB4MiA9IG51bGwsIHkxID0gbnVsbCwgeTIgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGxvbmxhdCA9IGFycmF5W2ldOwogICAgICB2YXIgbG9uID0gbG9ubGF0WzBdOwogICAgICB2YXIgbGF0ID0gbG9ubGF0WzFdOwoKICAgICAgaWYgKHgxID09PSBudWxsKSB7CiAgICAgICAgeDEgPSBsb247CiAgICAgIH0gZWxzZSBpZiAobG9uIDwgeDEpIHsKICAgICAgICB4MSA9IGxvbjsKICAgICAgfQoKICAgICAgaWYgKHgyID09PSBudWxsKSB7CiAgICAgICAgeDIgPSBsb247CiAgICAgIH0gZWxzZSBpZiAobG9uID4geDIpIHsKICAgICAgICB4MiA9IGxvbjsKICAgICAgfQoKICAgICAgaWYgKHkxID09PSBudWxsKSB7CiAgICAgICAgeTEgPSBsYXQ7CiAgICAgIH0gZWxzZSBpZiAobGF0IDwgeTEpIHsKICAgICAgICB5MSA9IGxhdDsKICAgICAgfQoKICAgICAgaWYgKHkyID09PSBudWxsKSB7CiAgICAgICAgeTIgPSBsYXQ7CiAgICAgIH0gZWxzZSBpZiAobGF0ID4geTIpIHsKICAgICAgICB5MiA9IGxhdDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTIgXTsKICB9CgogIC8qCiAgSW50ZXJuYWw6IENhbGN1bGF0ZSBhbiBib3VuZGluZyBib3ggZm9yIGEgZmVhdHVyZSBjb2xsZWN0aW9uCiAgKi8KICBmdW5jdGlvbiBjYWxjdWxhdGVCb3VuZHNGb3JGZWF0dXJlQ29sbGVjdGlvbihmZWF0dXJlQ29sbGVjdGlvbil7CiAgICB2YXIgZXh0ZW50cyA9IFtdLCBleHRlbnQ7CiAgICBmb3IgKHZhciBpID0gZmVhdHVyZUNvbGxlY3Rpb24uZmVhdHVyZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgZXh0ZW50ID0gY2FsY3VsYXRlQm91bmRzKGZlYXR1cmVDb2xsZWN0aW9uLmZlYXR1cmVzW2ldLmdlb21ldHJ5KTsKICAgICAgZXh0ZW50cy5wdXNoKFtleHRlbnRbMF0sZXh0ZW50WzFdXSk7CiAgICAgIGV4dGVudHMucHVzaChbZXh0ZW50WzJdLGV4dGVudFszXV0pOwogICAgfQoKICAgIHJldHVybiBjYWxjdWxhdGVCb3VuZHNGcm9tQXJyYXkoZXh0ZW50cyk7CiAgfQoKICAvKgogIEludGVybmFsOiBDYWxjdWxhdGUgYW4gYm91bmRpbmcgYm94IGZvciBhIGdlb21ldHJ5IGNvbGxlY3Rpb24KICAqLwogIGZ1bmN0aW9uIGNhbGN1bGF0ZUJvdW5kc0Zvckdlb21ldHJ5Q29sbGVjdGlvbihnZW9tZXRyeUNvbGxlY3Rpb24pewogICAgdmFyIGV4dGVudHMgPSBbXSwgZXh0ZW50OwoKICAgIGZvciAodmFyIGkgPSBnZW9tZXRyeUNvbGxlY3Rpb24uZ2VvbWV0cmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICBleHRlbnQgPSBjYWxjdWxhdGVCb3VuZHMoZ2VvbWV0cnlDb2xsZWN0aW9uLmdlb21ldHJpZXNbaV0pOwogICAgICBleHRlbnRzLnB1c2goW2V4dGVudFswXSxleHRlbnRbMV1dKTsKICAgICAgZXh0ZW50cy5wdXNoKFtleHRlbnRbMl0sZXh0ZW50WzNdXSk7CiAgICB9CgogICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kc0Zyb21BcnJheShleHRlbnRzKTsKICB9CgogIGZ1bmN0aW9uIGNhbGN1bGF0ZUVudmVsb3BlKGdlb2pzb24pewogICAgdmFyIGJvdW5kcyA9IGNhbGN1bGF0ZUJvdW5kcyhnZW9qc29uKTsKICAgIHJldHVybiB7CiAgICAgIHg6IGJvdW5kc1swXSwKICAgICAgeTogYm91bmRzWzFdLAogICAgICB3OiBNYXRoLmFicyhib3VuZHNbMF0gLSBib3VuZHNbMl0pLAogICAgICBoOiBNYXRoLmFicyhib3VuZHNbMV0gLSBib3VuZHNbM10pCiAgICB9OwogIH0KCiAgLyoKICBJbnRlcm5hbDogQ29udmVydCByYWRpYW5zIHRvIGRlZ3JlZXMuIFVzZWQgYnkgc3BhdGlhbCByZWZlcmVuY2UgY29udmVydGVycy4KICAqLwogIGZ1bmN0aW9uIHJhZFRvRGVnKHJhZCkgewogICAgcmV0dXJuIHJhZCAqIERlZ3JlZXNQZXJSYWRpYW47CiAgfQoKICAvKgogIEludGVybmFsOiBDb252ZXJ0IGRlZ3JlZXMgdG8gcmFkaWFucy4gVXNlZCBieSBzcGF0aWFsIHJlZmVyZW5jZSBjb252ZXJ0ZXJzLgogICovCiAgZnVuY3Rpb24gZGVnVG9SYWQoZGVnKSB7CiAgICByZXR1cm4gZGVnICogUmFkaWFuc1BlckRlZ3JlZTsKICB9CgogIC8qCiAgSW50ZXJuYWw6IExvb3Agb3ZlciBlYWNoIGFycmF5IGluIGEgZ2VvanNvbiBvYmplY3QgYW5kIGFwcGx5IGEgZnVuY3Rpb24gdG8gaXQuIFVzZWQgYnkgc3BhdGlhbCByZWZlcmVuY2UgY29udmVydGVycy4KICAqLwogIGZ1bmN0aW9uIGVhY2hQb3NpdGlvbihjb29yZGluYXRlcywgZnVuYykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAvLyB3ZSBmb3VuZCBhIG51bWJlciBzbyBsZXRzIGNvbnZlcnQgdGhpcyBwYWlyCiAgICAgIGlmKHR5cGVvZiBjb29yZGluYXRlc1tpXVswXSA9PT0gIm51bWJlciIpewogICAgICAgIGNvb3JkaW5hdGVzW2ldID0gZnVuYyhjb29yZGluYXRlc1tpXSk7CiAgICAgIH0KICAgICAgLy8gd2UgZm91bmQgYW4gY29vcmRpbmF0ZXMgYXJyYXkgaXQgYWdhaW4gYW5kIHJ1biBUSElTIGZ1bmN0aW9uIGFnYWluc3QgaXQKICAgICAgaWYodHlwZW9mIGNvb3JkaW5hdGVzW2ldID09PSAib2JqZWN0Iil7CiAgICAgICAgY29vcmRpbmF0ZXNbaV0gPSBlYWNoUG9zaXRpb24oY29vcmRpbmF0ZXNbaV0sIGZ1bmMpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY29vcmRpbmF0ZXM7CiAgfQoKICAvKgogIFB1YmxpYzogQ29udmVydCBhIEdlb0pTT04gUG9zaXRpb24gb2JqZWN0IHRvIEdlb2dyYXBoaWMgKDQzMjYpCiAgKi8KICBmdW5jdGlvbiBwb3NpdGlvblRvR2VvZ3JhcGhpYyhwb3NpdGlvbikgewogICAgdmFyIHggPSBwb3NpdGlvblswXTsKICAgIHZhciB5ID0gcG9zaXRpb25bMV07CiAgICByZXR1cm4gW3JhZFRvRGVnKHggLyBFYXJ0aFJhZGl1cykgLSAoTWF0aC5mbG9vcigocmFkVG9EZWcoeCAvIEVhcnRoUmFkaXVzKSArIDE4MCkgLyAzNjApICogMzYwKSwgcmFkVG9EZWcoKE1hdGguUEkgLyAyKSAtICgyICogTWF0aC5hdGFuKE1hdGguZXhwKC0xLjAgKiB5IC8gRWFydGhSYWRpdXMpKSkpXTsKICB9CgogIC8qCiAgUHVibGljOiBDb252ZXJ0IGEgR2VvSlNPTiBQb3NpdGlvbiBvYmplY3QgdG8gV2ViIE1lcmNhdG9yICgxMDIxMDApCiAgKi8KICBmdW5jdGlvbiBwb3NpdGlvblRvTWVyY2F0b3IocG9zaXRpb24pIHsKICAgIHZhciBsbmcgPSBwb3NpdGlvblswXTsKICAgIHZhciBsYXQgPSBNYXRoLm1heChNYXRoLm1pbihwb3NpdGlvblsxXSwgODkuOTk5OTkpLCAtODkuOTk5OTkpOwogICAgcmV0dXJuIFtkZWdUb1JhZChsbmcpICogRWFydGhSYWRpdXMsIEVhcnRoUmFkaXVzLzIuMCAqIE1hdGgubG9nKCAoMS4wICsgTWF0aC5zaW4oZGVnVG9SYWQobGF0KSkpIC8gKDEuMCAtIE1hdGguc2luKGRlZ1RvUmFkKGxhdCkpKSApXTsKICB9CgogIC8qCiAgUHVibGljOiBBcHBseSBhIGZ1bmN0aW9uIGFnYWlzdCBhbGwgcG9zaXRpb25zIGluIGEgZ2VvanNvbiBvYmplY3QuIFVzZWQgYnkgc3BhdGlhbCByZWZlcmVuY2UgY29udmVydGVycy4KICAqLwogIGZ1bmN0aW9uIGFwcGx5Q29udmVydGVyKGdlb2pzb24sIGNvbnZlcnRlciwgbm9DcnMpewogICAgaWYoZ2VvanNvbi50eXBlID09PSAiUG9pbnQiKSB7CiAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBjb252ZXJ0ZXIoZ2VvanNvbi5jb29yZGluYXRlcyk7CiAgICB9IGVsc2UgaWYoZ2VvanNvbi50eXBlID09PSAiRmVhdHVyZSIpIHsKICAgICAgZ2VvanNvbi5nZW9tZXRyeSA9IGFwcGx5Q29udmVydGVyKGdlb2pzb24uZ2VvbWV0cnksIGNvbnZlcnRlciwgdHJ1ZSk7CiAgICB9IGVsc2UgaWYoZ2VvanNvbi50eXBlID09PSAiRmVhdHVyZUNvbGxlY3Rpb24iKSB7CiAgICAgIGZvciAodmFyIGYgPSAwOyBmIDwgZ2VvanNvbi5mZWF0dXJlcy5sZW5ndGg7IGYrKykgewogICAgICAgIGdlb2pzb24uZmVhdHVyZXNbZl0gPSBhcHBseUNvbnZlcnRlcihnZW9qc29uLmZlYXR1cmVzW2ZdLCBjb252ZXJ0ZXIsIHRydWUpOwogICAgICB9CiAgICB9IGVsc2UgaWYoZ2VvanNvbi50eXBlID09PSAiR2VvbWV0cnlDb2xsZWN0aW9uIikgewogICAgICBmb3IgKHZhciBnID0gMDsgZyA8IGdlb2pzb24uZ2VvbWV0cmllcy5sZW5ndGg7IGcrKykgewogICAgICAgIGdlb2pzb24uZ2VvbWV0cmllc1tnXSA9IGFwcGx5Q29udmVydGVyKGdlb2pzb24uZ2VvbWV0cmllc1tnXSwgY29udmVydGVyLCB0cnVlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGVhY2hQb3NpdGlvbihnZW9qc29uLmNvb3JkaW5hdGVzLCBjb252ZXJ0ZXIpOwogICAgfQoKICAgIGlmKCFub0Nycyl7CiAgICAgIGlmKGNvbnZlcnRlciA9PT0gcG9zaXRpb25Ub01lcmNhdG9yKXsKICAgICAgICBnZW9qc29uLmNycyA9IE1lcmNhdG9yQ1JTOwogICAgICB9CiAgICB9CgogICAgaWYoY29udmVydGVyID09PSBwb3NpdGlvblRvR2VvZ3JhcGhpYyl7CiAgICAgIGRlbGV0ZSBnZW9qc29uLmNyczsKICAgIH0KCiAgICByZXR1cm4gZ2VvanNvbjsKICB9CgogIC8qCiAgUHVibGljOiBDb252ZXJ0IGEgR2VvSlNPTiBvYmplY3QgdG8gRVNSSSBXZWIgTWVyY2F0b3IgKDEwMjEwMCkKICAqLwogIGZ1bmN0aW9uIHRvTWVyY2F0b3IoZ2VvanNvbikgewogICAgcmV0dXJuIGFwcGx5Q29udmVydGVyKGdlb2pzb24sIHBvc2l0aW9uVG9NZXJjYXRvcik7CiAgfQoKICAvKgogIENvbnZlcnQgYSBHZW9KU09OIG9iamVjdCB0byBHZW9ncmFwaGljIGNvb3JkaW5hdGVzIChXU0c4NCwgNDMyNikKICAqLwogIGZ1bmN0aW9uIHRvR2VvZ3JhcGhpYyhnZW9qc29uKSB7CiAgICByZXR1cm4gYXBwbHlDb252ZXJ0ZXIoZ2VvanNvbiwgcG9zaXRpb25Ub0dlb2dyYXBoaWMpOwogIH0KCgogIC8qCiAgSW50ZXJuYWw6IC0xLDAsMSBjb21wYXJpc29uIGZ1bmN0aW9uCiAgKi8KICBmdW5jdGlvbiBjbXAoYSwgYikgewogICAgaWYoYSA8IGIpIHsKICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIGlmKGEgPiBiKSB7CiAgICAgIHJldHVybiAxOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQoKICAvKgogIEludGVybmFsOiB1c2VkIGZvciBzb3J0aW5nCiAgKi8KICBmdW5jdGlvbiBjb21wU29ydChwMSwgcDIpIHsKICAgIGlmKHAxWzBdIC0gcDJbMF0gPiBwMVsxXSAtIHAyWzFdKSB7CiAgICAgIHJldHVybiAxOwogICAgfSBlbHNlIGlmKHAxWzBdIC0gcDJbMF0gPCBwMVsxXSAtIHAyWzFdKSB7CiAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KCgogIC8qCiAgSW50ZXJuYWw6IHVzZWQgdG8gZGV0ZXJtaW5lIHR1cm4KICAqLwogIGZ1bmN0aW9uIHR1cm4ocCwgcSwgcikgewogICAgLy8gUmV0dXJucyAtMSwgMCwgMSBpZiBwLHEsciBmb3JtcyBhIHJpZ2h0LCBzdHJhaWdodCwgb3IgbGVmdCB0dXJuLgogICAgcmV0dXJuIGNtcCgocVswXSAtIHBbMF0pICogKHJbMV0gLSBwWzFdKSAtIChyWzBdIC0gcFswXSkgKiAocVsxXSAtIHBbMV0pLCAwKTsKICB9CgogIC8qCiAgSW50ZXJuYWw6IHVzZWQgdG8gZGV0ZXJtaW5lIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMKICAqLwogIGZ1bmN0aW9uIGV1Y2xpZGVhbkRpc3RhbmNlKHAsIHEpIHsKICAgIC8vIFJldHVybnMgdGhlIHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gcCBhbmQgcS4KICAgIHZhciBkeCA9IHFbMF0gLSBwWzBdOwogICAgdmFyIGR5ID0gcVsxXSAtIHBbMV07CgogICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwogIH0KCiAgZnVuY3Rpb24gbmV4dEh1bGxQb2ludChwb2ludHMsIHApIHsKICAgIC8vIFJldHVybnMgdGhlIG5leHQgcG9pbnQgb24gdGhlIGNvbnZleCBodWxsIGluIENDVyBmcm9tIHAuCiAgICB2YXIgcSA9IHA7CiAgICBmb3IodmFyIHIgaW4gcG9pbnRzKSB7CiAgICAgIHZhciB0ID0gdHVybihwLCBxLCBwb2ludHNbcl0pOwogICAgICBpZih0ID09PSAtMSB8fCB0ID09PSAwICYmIGV1Y2xpZGVhbkRpc3RhbmNlKHAsIHBvaW50c1tyXSkgPiBldWNsaWRlYW5EaXN0YW5jZShwLCBxKSkgewogICAgICAgIHEgPSBwb2ludHNbcl07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBxOwogIH0KCiAgZnVuY3Rpb24gY29udmV4SHVsbChwb2ludHMpIHsKICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKYXJ2aXMgTWFyY2ggYWxnb3JpdGhtCiAgICAvLyBhZGFwdGVkIGZyb20gaHR0cDovL3RpeHhpdC53b3JkcHJlc3MuY29tLzIwMDkvMTIvMDkvamFydmlzLW1hcmNoLwoKICAgIGlmKHBvaW50cy5sZW5ndGggPT09IDApIHsKICAgICAgcmV0dXJuIFtdOwogICAgfSBlbHNlIGlmKHBvaW50cy5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHBvaW50czsKICAgIH0KCiAgICAvLyBSZXR1cm5zIHRoZSBwb2ludHMgb24gdGhlIGNvbnZleCBodWxsIG9mIHBvaW50cyBpbiBDQ1cgb3JkZXIuCiAgICB2YXIgaHVsbCA9IFtwb2ludHMuc29ydChjb21wU29ydClbMF1dOwoKICAgIGZvcih2YXIgcCA9IDA7IHAgPCBodWxsLmxlbmd0aDsgcCsrKSB7CiAgICAgIHZhciBxID0gbmV4dEh1bGxQb2ludChwb2ludHMsIGh1bGxbcF0pOwoKICAgICAgaWYocSAhPT0gaHVsbFswXSkgewogICAgICAgIGh1bGwucHVzaChxKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBodWxsOwogIH0KCiAgZnVuY3Rpb24gY29vcmRpbmF0ZXNDb250YWluUG9pbnQoY29vcmRpbmF0ZXMsIHBvaW50KSB7CiAgICB2YXIgY29udGFpbnMgPSBmYWxzZTsKICAgIGZvcih2YXIgaSA9IC0xLCBsID0gY29vcmRpbmF0ZXMubGVuZ3RoLCBqID0gbCAtIDE7ICsraSA8IGw7IGogPSBpKSB7CiAgICAgIGlmICgoKGNvb3JkaW5hdGVzW2ldWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbal1bMV0pIHx8CiAgICAgICAgICAgKGNvb3JkaW5hdGVzW2pdWzFdIDw9IHBvaW50WzFdICYmIHBvaW50WzFdIDwgY29vcmRpbmF0ZXNbaV1bMV0pKSAmJgogICAgICAgICAgKHBvaW50WzBdIDwgKGNvb3JkaW5hdGVzW2pdWzBdIC0gY29vcmRpbmF0ZXNbaV1bMF0pICogKHBvaW50WzFdIC0gY29vcmRpbmF0ZXNbaV1bMV0pIC8gKGNvb3JkaW5hdGVzW2pdWzFdIC0gY29vcmRpbmF0ZXNbaV1bMV0pICsgY29vcmRpbmF0ZXNbaV1bMF0pKSB7CiAgICAgICAgY29udGFpbnMgPSAhY29udGFpbnM7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb250YWluczsKICB9CgogIGZ1bmN0aW9uIHBvbHlnb25Db250YWluc1BvaW50KHBvbHlnb24sIHBvaW50KSB7CiAgICBpZiAocG9seWdvbiAmJiBwb2x5Z29uLmxlbmd0aCkgewogICAgICBpZiAocG9seWdvbi5sZW5ndGggPT09IDEpIHsgLy8gcG9seWdvbiB3aXRoIG5vIGhvbGVzCiAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzQ29udGFpblBvaW50KHBvbHlnb25bMF0sIHBvaW50KTsKICAgICAgfSBlbHNlIHsgLy8gcG9seWdvbiB3aXRoIGhvbGVzCiAgICAgICAgaWYgKGNvb3JkaW5hdGVzQ29udGFpblBvaW50KHBvbHlnb25bMF0sIHBvaW50KSkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChjb29yZGluYXRlc0NvbnRhaW5Qb2ludChwb2x5Z29uW2ldLCBwb2ludCkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGZvdW5kIGluIGhvbGUKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB2ZXJ0ZXhJbnRlcnNlY3RzVmVydGV4KGExLCBhMiwgYjEsIGIyKSB7CiAgICB2YXIgdWFfdCA9IChiMlswXSAtIGIxWzBdKSAqIChhMVsxXSAtIGIxWzFdKSAtIChiMlsxXSAtIGIxWzFdKSAqIChhMVswXSAtIGIxWzBdKTsKICAgIHZhciB1Yl90ID0gKGEyWzBdIC0gYTFbMF0pICogKGExWzFdIC0gYjFbMV0pIC0gKGEyWzFdIC0gYTFbMV0pICogKGExWzBdIC0gYjFbMF0pOwogICAgdmFyIHVfYiAgPSAoYjJbMV0gLSBiMVsxXSkgKiAoYTJbMF0gLSBhMVswXSkgLSAoYjJbMF0gLSBiMVswXSkgKiAoYTJbMV0gLSBhMVsxXSk7CgogICAgaWYgKCB1X2IgIT09IDAgKSB7CiAgICAgIHZhciB1YSA9IHVhX3QgLyB1X2I7CiAgICAgIHZhciB1YiA9IHViX3QgLyB1X2I7CgogICAgICBpZiAoIDAgPD0gdWEgJiYgdWEgPD0gMSAmJiAwIDw9IHViICYmIHViIDw9IDEgKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBhcnJheUludGVyc2VjdHNBcnJheShhLCBiKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGggLSAxOyBqKyspIHsKICAgICAgICBpZiAodmVydGV4SW50ZXJzZWN0c1ZlcnRleChhW2ldLCBhW2kgKyAxXSwgYltqXSwgYltqICsgMV0pKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBhcnJheUludGVyc2VjdHNNdWx0aUFycmF5KGEsIGIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaW5uZXIgPSBiW2ldOwoKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbm5lci5sZW5ndGggLSAxOyBqKyspIHsKICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGEubGVuZ3RoIC0gMTsgaysrKSB7CiAgICAgICAgICBpZiAodmVydGV4SW50ZXJzZWN0c1ZlcnRleChpbm5lcltqXSwgaW5uZXJbaiArIDFdLCBhW2tdLCBhW2sgKyAxXSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gbXVsdGlBcnJheUludGVyc2VjdHNNdWx0aUFycmF5KGEsIGIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICBpZiAoYXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheShhW2ldLCBiKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gYXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KGEsIGIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykgewogICAgICBpZiAoYXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheShhLCBiW2ldKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheShhLCBiKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheShhW2ldLCBiKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtdWx0aU11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KGEsIGIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICBpZiAobXVsdGlBcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkoYVtpXSwgYikpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgLyoKICBJbnRlcm5hbDogUmV0dXJucyBhIGNvcHkgb2YgY29vcmRpbmF0ZXMgZm9yIHMgY2xvc2VkIHBvbHlnb24KICAqLwogIGZ1bmN0aW9uIGNsb3NlZFBvbHlnb24oY29vcmRpbmF0ZXMpIHsKICAgIHZhciBvdXRlciA9IFsgXTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBpbm5lciA9IGNvb3JkaW5hdGVzW2ldLnNsaWNlKCk7CgogICAgICBpZiAocG9pbnRzRXF1YWwoaW5uZXJbMF0sIGlubmVyW2lubmVyLmxlbmd0aCAtIDFdKSA9PT0gZmFsc2UpIHsKICAgICAgICBpbm5lci5wdXNoKGlubmVyWzBdKTsKICAgICAgfQoKICAgICAgb3V0ZXIucHVzaChpbm5lcik7CiAgICB9CgogICAgcmV0dXJuIG91dGVyOwogIH0KCiAgZnVuY3Rpb24gcG9pbnRzRXF1YWwoYSwgYikgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYi5sZW5ndGg7IGorKykgewogICAgICAgIGlmIChhW2ldICE9PSBiW2pdKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBjb29yZGluYXRlc0VxdWFsKGEsIGIpIHsKICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBuYSA9IGEuc2xpY2UoKS5zb3J0KGNvbXBTb3J0KTsKICAgIHZhciBuYiA9IGIuc2xpY2UoKS5zb3J0KGNvbXBTb3J0KTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChuYVtpXS5sZW5ndGggIT09IG5iW2ldLmxlbmd0aCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG5hLmxlbmd0aDsgaisrKSB7CiAgICAgICAgaWYgKG5hW2ldW2pdICE9PSBuYltpXVtqXSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLyoKICBJbnRlcm5hbDogQW4gYXJyYXkgb2YgdmFyaWFibGVzIHRoYXQgd2lsbCBiZSBleGNsdWRlZCBmb3JtIEpTT04gb2JqZWN0cy4KICAqLwogIHZhciBleGNsdWRlRnJvbUpTT04gPSBbImxlbmd0aCJdOwoKICAvKgogIEludGVybmFsOiBCYXNlIEdlb0pTT04gUHJpbWl0aXZlCiAgKi8KICBmdW5jdGlvbiBQcmltaXRpdmUoZ2VvanNvbil7CiAgICBpZihnZW9qc29uKXsKICAgICAgc3dpdGNoIChnZW9qc29uLnR5cGUpIHsKICAgICAgY2FzZSAnUG9pbnQnOgogICAgICAgIHJldHVybiBuZXcgUG9pbnQoZ2VvanNvbik7CgogICAgICBjYXNlICdNdWx0aVBvaW50JzoKICAgICAgICByZXR1cm4gbmV3IE11bHRpUG9pbnQoZ2VvanNvbik7CgogICAgICBjYXNlICdMaW5lU3RyaW5nJzoKICAgICAgICByZXR1cm4gbmV3IExpbmVTdHJpbmcoZ2VvanNvbik7CgogICAgICBjYXNlICdNdWx0aUxpbmVTdHJpbmcnOgogICAgICAgIHJldHVybiBuZXcgTXVsdGlMaW5lU3RyaW5nKGdlb2pzb24pOwoKICAgICAgY2FzZSAnUG9seWdvbic6CiAgICAgICAgcmV0dXJuIG5ldyBQb2x5Z29uKGdlb2pzb24pOwoKICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzoKICAgICAgICByZXR1cm4gbmV3IE11bHRpUG9seWdvbihnZW9qc29uKTsKCiAgICAgIGNhc2UgJ0ZlYXR1cmUnOgogICAgICAgIHJldHVybiBuZXcgRmVhdHVyZShnZW9qc29uKTsKCiAgICAgIGNhc2UgJ0ZlYXR1cmVDb2xsZWN0aW9uJzoKICAgICAgICByZXR1cm4gbmV3IEZlYXR1cmVDb2xsZWN0aW9uKGdlb2pzb24pOwoKICAgICAgY2FzZSAnR2VvbWV0cnlDb2xsZWN0aW9uJzoKICAgICAgICByZXR1cm4gbmV3IEdlb21ldHJ5Q29sbGVjdGlvbihnZW9qc29uKTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGU6ICIgKyBnZW9qc29uLnR5cGUpOwogICAgICB9CiAgICB9CiAgfQoKICBQcmltaXRpdmUucHJvdG90eXBlLnRvTWVyY2F0b3IgPSBmdW5jdGlvbigpewogICAgcmV0dXJuIHRvTWVyY2F0b3IodGhpcyk7CiAgfTsKCiAgUHJpbWl0aXZlLnByb3RvdHlwZS50b0dlb2dyYXBoaWMgPSBmdW5jdGlvbigpewogICAgcmV0dXJuIHRvR2VvZ3JhcGhpYyh0aGlzKTsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLmVudmVsb3BlID0gZnVuY3Rpb24oKXsKICAgIHJldHVybiBjYWxjdWxhdGVFbnZlbG9wZSh0aGlzKTsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpewogICAgcmV0dXJuIGNhbGN1bGF0ZUJvdW5kcyh0aGlzKTsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLmNvbnZleEh1bGwgPSBmdW5jdGlvbigpewogICAgdmFyIGNvb3JkaW5hdGVzID0gWyBdLCBpLCBqOwogICAgaWYgKHRoaXMudHlwZSA9PT0gJ1BvaW50JykgewogICAgICBpZiAodGhpcy5jb29yZGluYXRlcyAmJiB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCA+IDApIHsKICAgICAgICByZXR1cm4gWyB0aGlzLmNvb3JkaW5hdGVzIF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFsgXTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCB0aGlzLnR5cGUgPT09ICdNdWx0aVBvaW50JykgewogICAgICBpZiAodGhpcy5jb29yZGluYXRlcyAmJiB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBjb29yZGluYXRlcyA9IHRoaXMuY29vcmRpbmF0ZXM7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFsgXTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdQb2x5Z29uJyB8fCB0aGlzLnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7CiAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVzICYmIHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLmNvbmNhdCh0aGlzLmNvb3JkaW5hdGVzW2ldKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFsgXTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7CiAgICAgIGlmICh0aGlzLmNvb3JkaW5hdGVzICYmIHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5jb29yZGluYXRlc1tpXS5sZW5ndGg7IGorKykgewogICAgICAgICAgICBjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzLmNvbmNhdCh0aGlzLmNvb3JkaW5hdGVzW2ldW2pdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFsgXTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZ2V0IGNvbnZleCBodWxsIG9mICIgKyB0aGlzLnR5cGUpOwogICAgfQoKICAgIHJldHVybiBjb252ZXhIdWxsKGNvb3JkaW5hdGVzKTsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCl7CiAgICB2YXIgb2JqID0ge307CiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykgewogICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGV4Y2x1ZGVGcm9tSlNPTi5pbmRleE9mKGtleSkgPT09IC0xKSB7CiAgICAgICAgb2JqW2tleV0gPSB0aGlzW2tleV07CiAgICAgIH0KICAgIH0KICAgIG9iai5iYm94ID0gY2FsY3VsYXRlQm91bmRzKHRoaXMpOwogICAgcmV0dXJuIG9iajsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLndpdGhpbiA9IGZ1bmN0aW9uKHByaW1pdGl2ZSkgewogICAgdmFyIGNvb3JkaW5hdGVzLCBpLCBjb250YWluczsKCiAgICAvLyBwb2ludC53aXRoaW4ocG9pbnQpIDo6IGVxdWFsaXR5CiAgICBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICJQb2ludCIpIHsKICAgICAgaWYgKHRoaXMudHlwZSA9PT0gIlBvaW50IikgewogICAgICAgIHJldHVybiBwb2ludHNFcXVhbCh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwoKICAgICAgfQogICAgfQoKICAgIC8vIHBvaW50LndpdGhpbihtdWx0aWxpbmVzdHJpbmcpCiAgICBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICJNdWx0aUxpbmVTdHJpbmciKSB7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJQb2ludCIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgbGluZXN0cmluZyA9IHsgdHlwZTogIkxpbmVTdHJpbmciLCBjb29yZGluYXRlczogcHJpbWl0aXZlLmNvb3JkaW5hdGVzW2ldIH07CgogICAgICAgICAgaWYgKHRoaXMud2l0aGluKGxpbmVzdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIHBvaW50LndpdGhpbihsaW5lc3RyaW5nKSwgcG9pbnQud2l0aGluKG11bHRpcG9pbnQpCiAgICBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICJMaW5lU3RyaW5nIiB8fCBwcmltaXRpdmUudHlwZSA9PT0gIk11bHRpUG9pbnQiKSB7CiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJQb2ludCIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAodGhpcy5jb29yZGluYXRlcy5sZW5ndGggIT09IHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXS5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChwb2ludHNFcXVhbCh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV0pKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gIlBvbHlnb24iKSB7CiAgICAgIC8vIHBvbHlnb24ud2l0aGluKHBvbHlnb24pCiAgICAgIGlmICh0aGlzLnR5cGUgPT09ICJQb2x5Z29uIikgewogICAgICAgIC8vIGNoZWNrIGZvciBlcXVhbCBwb2x5Z29ucwogICAgICAgIGlmIChwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoID09PSB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCkgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGNvb3JkaW5hdGVzRXF1YWwodGhpcy5jb29yZGluYXRlc1tpXSwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzW2ldKSkgewogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5jb29yZGluYXRlcy5sZW5ndGggJiYgcG9seWdvbkNvbnRhaW5zUG9pbnQocHJpbWl0aXZlLmNvb3JkaW5hdGVzLCB0aGlzLmNvb3JkaW5hdGVzWzBdWzBdKSkgewogICAgICAgICAgcmV0dXJuICFtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkoY2xvc2VkUG9seWdvbih0aGlzLmNvb3JkaW5hdGVzKSwgY2xvc2VkUG9seWdvbihwcmltaXRpdmUuY29vcmRpbmF0ZXMpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgIC8vIHBvaW50LndpdGhpbihwb2x5Z29uKQogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIlBvaW50IikgewogICAgICAgIHJldHVybiBwb2x5Z29uQ29udGFpbnNQb2ludChwcmltaXRpdmUuY29vcmRpbmF0ZXMsIHRoaXMuY29vcmRpbmF0ZXMpOwoKICAgICAgLy8gbGluZXN0cmluZy9tdWx0aXBvaW50IHdpdGhpbmcgcG9seWdvbgogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIkxpbmVTdHJpbmciIHx8IHRoaXMudHlwZSA9PT0gIk11bHRpUG9pbnQiKSB7CiAgICAgICAgaWYgKCF0aGlzLmNvb3JkaW5hdGVzIHx8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KHByaW1pdGl2ZS5jb29yZGluYXRlcywgdGhpcy5jb29yZGluYXRlc1tpXSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgLy8gbXVsdGlsaW5lc3RyaW5nLndpdGhpbihwb2x5Z29uKQogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIk11bHRpTGluZVN0cmluZyIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGxzID0gbmV3IExpbmVTdHJpbmcodGhpcy5jb29yZGluYXRlc1tpXSk7CgogICAgICAgICAgaWYgKGxzLndpdGhpbihwcmltaXRpdmUpID09PSBmYWxzZSkgewogICAgICAgICAgICBjb250YWlucysrOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIC8vIG11bHRpcG9seWdvbi53aXRoaW4ocG9seWdvbikKICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICJNdWx0aVBvbHlnb24iKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBwMSA9IG5ldyBQcmltaXRpdmUoeyB0eXBlOiAiUG9seWdvbiIsIGNvb3JkaW5hdGVzOiB0aGlzLmNvb3JkaW5hdGVzW2ldIH0pOwoKICAgICAgICAgIGlmIChwMS53aXRoaW4ocHJpbWl0aXZlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICB9CgogICAgaWYgKHByaW1pdGl2ZS50eXBlID09PSAiTXVsdGlQb2x5Z29uIikgewogICAgICAvLyBwb2ludC53aXRoaW4obXVsdGlwb2x5Z29uKQogICAgICBpZiAodGhpcy50eXBlID09PSAiUG9pbnQiKSB7CiAgICAgICAgaWYgKHByaW1pdGl2ZS5jb29yZGluYXRlcy5sZW5ndGgpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmltaXRpdmUuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV07CiAgICAgICAgICAgIGlmIChwb2x5Z29uQ29udGFpbnNQb2ludChjb29yZGluYXRlcywgdGhpcy5jb29yZGluYXRlcykgJiYgbXVsdGlBcnJheUludGVyc2VjdHNNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgLy8gcG9seWdvbi53aXRoaW4obXVsdGlwb2x5Z29uKQogICAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gIlBvbHlnb24iKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV0ubGVuZ3RoID09PSB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIGlmIChjb29yZGluYXRlc0VxdWFsKHRoaXMuY29vcmRpbmF0ZXNbal0sIHByaW1pdGl2ZS5jb29yZGluYXRlc1tpXVtqXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcykgPT09IGZhbHNlKSB7CiAgICAgICAgICBpZiAocHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aCkgewogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV07CiAgICAgICAgICAgICAgaWYgKHBvbHlnb25Db250YWluc1BvaW50KGNvb3JkaW5hdGVzLCB0aGlzLmNvb3JkaW5hdGVzWzBdWzBdKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gZmFsc2U7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBjb250YWluczsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAvLyBsaW5lc3RyaW5nLndpdGhpbihtdWx0aXBvbHlnb24pLCBtdWx0aXBvaW50LndpdGhpbihtdWx0aXBvbHlnb24pCiAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAiTGluZVN0cmluZyIgfHwgdGhpcy50eXBlID09PSAiTXVsdGlQb2ludCIpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcCA9IHsgdHlwZTogIlBvbHlnb24iLCBjb29yZGluYXRlczogcHJpbWl0aXZlLmNvb3JkaW5hdGVzW2ldIH07CgogICAgICAgICAgaWYgKHRoaXMud2l0aGluKHApKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAvLyBtdWx0aWxpbmVzdHJpbmcud2l0aGluKG11bHRpcG9seWdvbikKICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICJNdWx0aUxpbmVTdHJpbmciKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBsaW5lcyA9IG5ldyBMaW5lU3RyaW5nKHRoaXMuY29vcmRpbmF0ZXNbaV0pOwoKICAgICAgICAgIGlmIChsaW5lcy53aXRoaW4ocHJpbWl0aXZlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAvLyBtdWx0aXBvbHlnb24ud2l0aGluKG11bHRpcG9seWdvbikKICAgICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICJNdWx0aVBvbHlnb24iKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByaW1pdGl2ZS5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIG1wb2x5ID0geyB0eXBlOiAiUG9seWdvbiIsIGNvb3JkaW5hdGVzOiBwcmltaXRpdmUuY29vcmRpbmF0ZXNbaV0gfTsKCiAgICAgICAgICBpZiAodGhpcy53aXRoaW4obXBvbHkpID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8vIGRlZmF1bHQgdG8gZmFsc2UKICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBQcmltaXRpdmUucHJvdG90eXBlLmludGVyc2VjdHMgPSBmdW5jdGlvbihwcmltaXRpdmUpIHsKICAgIC8vIGlmIHdlIGFyZSBwYXNzZWQgYSBmZWF0dXJlLCB1c2UgdGhlIHBvbHlnb24gaW5zaWRlIGluc3RlYWQKICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ0ZlYXR1cmUnKSB7CiAgICAgIHByaW1pdGl2ZSA9IHByaW1pdGl2ZS5nZW9tZXRyeTsKICAgIH0KCiAgICB2YXIgcCA9IG5ldyBQcmltaXRpdmUocHJpbWl0aXZlKTsKICAgIGlmICh0aGlzLndpdGhpbihwcmltaXRpdmUpIHx8IHAud2l0aGluKHRoaXMpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGlmICh0aGlzLnR5cGUgPT09ICdMaW5lU3RyaW5nJykgewogICAgICBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdMaW5lU3RyaW5nJykgewogICAgICAgIHJldHVybiBhcnJheUludGVyc2VjdHNBcnJheSh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwogICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTXVsdGlMaW5lU3RyaW5nJykgewogICAgICAgIHJldHVybiBhcnJheUludGVyc2VjdHNNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdQb2x5Z29uJykgewogICAgICAgIHJldHVybiBhcnJheUludGVyc2VjdHNNdWx0aUFycmF5KHRoaXMuY29vcmRpbmF0ZXMsIGNsb3NlZFBvbHlnb24ocHJpbWl0aXZlLmNvb3JkaW5hdGVzKSk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7CiAgICAgICAgcmV0dXJuIGFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheSh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHsKICAgICAgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTGluZVN0cmluZycpIHsKICAgICAgICByZXR1cm4gYXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheShwcmltaXRpdmUuY29vcmRpbmF0ZXMsIHRoaXMuY29vcmRpbmF0ZXMpOwogICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnUG9seWdvbicgfHwgcHJpbWl0aXZlLnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIG11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlBcnJheSh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwogICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykgewogICAgICAgIHJldHVybiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheSh0aGlzLmNvb3JkaW5hdGVzLCBwcmltaXRpdmUuY29vcmRpbmF0ZXMpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRoaXMudHlwZSA9PT0gJ1BvbHlnb24nKSB7CiAgICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIGFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkocHJpbWl0aXZlLmNvb3JkaW5hdGVzLCBjbG9zZWRQb2x5Z29uKHRoaXMuY29vcmRpbmF0ZXMpKTsKICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHsKICAgICAgICByZXR1cm4gbXVsdGlBcnJheUludGVyc2VjdHNNdWx0aUFycmF5KGNsb3NlZFBvbHlnb24odGhpcy5jb29yZGluYXRlcyksIHByaW1pdGl2ZS5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdQb2x5Z29uJykgewogICAgICAgIHJldHVybiBtdWx0aUFycmF5SW50ZXJzZWN0c011bHRpQXJyYXkoY2xvc2VkUG9seWdvbih0aGlzLmNvb3JkaW5hdGVzKSwgY2xvc2VkUG9seWdvbihwcmltaXRpdmUuY29vcmRpbmF0ZXMpKTsKICAgICAgfSBlbHNlIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHsKICAgICAgICByZXR1cm4gbXVsdGlBcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkoY2xvc2VkUG9seWdvbih0aGlzLmNvb3JkaW5hdGVzKSwgcHJpbWl0aXZlLmNvb3JkaW5hdGVzKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7CiAgICAgIGlmIChwcmltaXRpdmUudHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIGFycmF5SW50ZXJzZWN0c011bHRpTXVsdGlBcnJheShwcmltaXRpdmUuY29vcmRpbmF0ZXMsIHRoaXMuY29vcmRpbmF0ZXMpOwogICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS50eXBlID09PSAnUG9seWdvbicgfHwgcHJpbWl0aXZlLnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIG11bHRpQXJyYXlJbnRlcnNlY3RzTXVsdGlNdWx0aUFycmF5KGNsb3NlZFBvbHlnb24ocHJpbWl0aXZlLmNvb3JkaW5hdGVzKSwgdGhpcy5jb29yZGluYXRlcyk7CiAgICAgIH0gZWxzZSBpZiAocHJpbWl0aXZlLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7CiAgICAgICAgcmV0dXJuIG11bHRpTXVsdGlBcnJheUludGVyc2VjdHNNdWx0aU11bHRpQXJyYXkodGhpcy5jb29yZGluYXRlcywgcHJpbWl0aXZlLmNvb3JkaW5hdGVzKTsKICAgICAgfQogICAgfSBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdGZWF0dXJlJykgewogICAgICAvLyBpbiB0aGUgY2FzZSBvZiBhIEZlYXR1cmUsIHVzZSB0aGUgaW50ZXJuYWwgcHJpbWl0aXZlIGZvciBpbnRlcnNlY3Rpb24KICAgICAgdmFyIGlubmVyID0gbmV3IFByaW1pdGl2ZSh0aGlzLmdlb21ldHJ5KTsKICAgICAgcmV0dXJuIGlubmVyLmludGVyc2VjdHMocHJpbWl0aXZlKTsKICAgIH0KCiAgICB3YXJuKCJUeXBlICIgKyB0aGlzLnR5cGUgKyAiIHRvICIgKyBwcmltaXRpdmUudHlwZSArICIgaW50ZXJzZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaW50ZXJzZWN0cyIpOwogICAgcmV0dXJuIGZhbHNlOwogIH07CgoKICAvKgogIEdlb0pTT04gUG9pbnQgQ2xhc3MKICAgIG5ldyBQb2ludCgpOwogICAgbmV3IFBvaW50KHgseSx6LHd0Zik7CiAgICBuZXcgUG9pbnQoW3gseSx6LHd0Zl0pOwogICAgbmV3IFBvaW50KFt4LHldKTsKICAgIG5ldyBQb2ludCh7CiAgICAgIHR5cGU6ICJQb2ludCIsCiAgICAgIGNvb3JkaW5hdGVzOiBbeCx5XQogICAgfSk7CiAgKi8KICBmdW5jdGlvbiBQb2ludChpbnB1dCl7CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CgogICAgaWYoaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gIlBvaW50IiAmJiBpbnB1dC5jb29yZGluYXRlcyl7CiAgICAgIGV4dGVuZCh0aGlzLCBpbnB1dCk7CiAgICB9IGVsc2UgaWYoaW5wdXQgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gIltvYmplY3QgQXJyYXldIikgewogICAgICB0aGlzLmNvb3JkaW5hdGVzID0gaW5wdXQ7CiAgICB9IGVsc2UgaWYoYXJncy5sZW5ndGggPj0gMikgewogICAgICB0aGlzLmNvb3JkaW5hdGVzID0gYXJnczsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuUG9pbnQiOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJQb2ludCI7CiAgfQoKICBQb2ludC5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgUG9pbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnQ7CgogIC8qCiAgR2VvSlNPTiBNdWx0aVBvaW50IENsYXNzCiAgICAgIG5ldyBNdWx0aVBvaW50KCk7CiAgICAgIG5ldyBNdWx0aVBvaW50KFtbeCx5XSwgW3gxLHkxXV0pOwogICAgICBuZXcgTXVsdGlQb2ludCh7CiAgICAgICAgdHlwZTogIk11bHRpUG9pbnQiLAogICAgICAgIGNvb3JkaW5hdGVzOiBbeCx5XQogICAgICB9KTsKICAqLwogIGZ1bmN0aW9uIE11bHRpUG9pbnQoaW5wdXQpewogICAgaWYoaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gIk11bHRpUG9pbnQiICYmIGlucHV0LmNvb3JkaW5hdGVzKXsKICAgICAgZXh0ZW5kKHRoaXMsIGlucHV0KTsKICAgIH0gZWxzZSBpZihBcnJheS5pc0FycmF5KGlucHV0KSkgewogICAgICB0aGlzLmNvb3JkaW5hdGVzID0gaW5wdXQ7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLk11bHRpUG9pbnQiOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJNdWx0aVBvaW50IjsKICB9CgogIE11bHRpUG9pbnQucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIE11bHRpUG9pbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlQb2ludDsKICBNdWx0aVBvaW50LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZnVuYyl7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgZnVuYy5hcHBseSh0aGlzLCBbdGhpcy5jb29yZGluYXRlc1tpXSwgaSwgdGhpcy5jb29yZGluYXRlc10pOwogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBNdWx0aVBvaW50LnByb3RvdHlwZS5hZGRQb2ludCA9IGZ1bmN0aW9uKHBvaW50KXsKICAgIHRoaXMuY29vcmRpbmF0ZXMucHVzaChwb2ludCk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIE11bHRpUG9pbnQucHJvdG90eXBlLmluc2VydFBvaW50ID0gZnVuY3Rpb24ocG9pbnQsIGluZGV4KXsKICAgIHRoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKGluZGV4LCAwLCBwb2ludCk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIE11bHRpUG9pbnQucHJvdG90eXBlLnJlbW92ZVBvaW50ID0gZnVuY3Rpb24ocmVtb3ZlKXsKICAgIGlmKHR5cGVvZiByZW1vdmUgPT09ICJudW1iZXIiKXsKICAgICAgdGhpcy5jb29yZGluYXRlcy5zcGxpY2UocmVtb3ZlLCAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKHRoaXMuY29vcmRpbmF0ZXMuaW5kZXhPZihyZW1vdmUpLCAxKTsKICAgIH0KICAgIHJldHVybiB0aGlzOwogIH07CiAgTXVsdGlQb2ludC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaSl7CiAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMuY29vcmRpbmF0ZXNbaV0pOwogIH07CgogIC8qCiAgR2VvSlNPTiBMaW5lU3RyaW5nIENsYXNzCiAgICAgIG5ldyBMaW5lU3RyaW5nKCk7CiAgICAgIG5ldyBMaW5lU3RyaW5nKFtbeCx5XSwgW3gxLHkxXV0pOwogICAgICBuZXcgTGluZVN0cmluZyh7CiAgICAgICAgdHlwZTogIkxpbmVTdHJpbmciLAogICAgICAgIGNvb3JkaW5hdGVzOiBbeCx5XQogICAgICB9KTsKICAqLwogIGZ1bmN0aW9uIExpbmVTdHJpbmcoaW5wdXQpewogICAgaWYoaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gIkxpbmVTdHJpbmciICYmIGlucHV0LmNvb3JkaW5hdGVzKXsKICAgICAgZXh0ZW5kKHRoaXMsIGlucHV0KTsKICAgIH0gZWxzZSBpZihBcnJheS5pc0FycmF5KGlucHV0KSkgewogICAgICB0aGlzLmNvb3JkaW5hdGVzID0gaW5wdXQ7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkxpbmVTdHJpbmciOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJMaW5lU3RyaW5nIjsKICB9CgogIExpbmVTdHJpbmcucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIExpbmVTdHJpbmcucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZVN0cmluZzsKICBMaW5lU3RyaW5nLnByb3RvdHlwZS5hZGRWZXJ0ZXggPSBmdW5jdGlvbihwb2ludCl7CiAgICB0aGlzLmNvb3JkaW5hdGVzLnB1c2gocG9pbnQpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBMaW5lU3RyaW5nLnByb3RvdHlwZS5pbnNlcnRWZXJ0ZXggPSBmdW5jdGlvbihwb2ludCwgaW5kZXgpewogICAgdGhpcy5jb29yZGluYXRlcy5zcGxpY2UoaW5kZXgsIDAsIHBvaW50KTsKICAgIHJldHVybiB0aGlzOwogIH07CiAgTGluZVN0cmluZy5wcm90b3R5cGUucmVtb3ZlVmVydGV4ID0gZnVuY3Rpb24ocmVtb3ZlKXsKICAgIHRoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKHJlbW92ZSwgMSk7CiAgICByZXR1cm4gdGhpczsKICB9OwoKICAvKgogIEdlb0pTT04gTXVsdGlMaW5lU3RyaW5nIENsYXNzCiAgICAgIG5ldyBNdWx0aUxpbmVTdHJpbmcoKTsKICAgICAgbmV3IE11bHRpTGluZVN0cmluZyhbIFtbeCx5XSwgW3gxLHkxXV0sIFtbeDIseTJdLCBbeDMseTNdXSBdKTsKICAgICAgbmV3IE11bHRpTGluZVN0cmluZyh7CiAgICAgICAgdHlwZTogIk11bHRpTGluZVN0cmluZyIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgW1t4LHldLCBbeDEseTFdXSwgW1t4Mix5Ml0sIFt4Myx5M11dIF0KICAgICAgfSk7CiAgKi8KICBmdW5jdGlvbiBNdWx0aUxpbmVTdHJpbmcoaW5wdXQpewogICAgaWYoaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gIk11bHRpTGluZVN0cmluZyIgJiYgaW5wdXQuY29vcmRpbmF0ZXMpewogICAgICBleHRlbmQodGhpcywgaW5wdXQpOwogICAgfSBlbHNlIGlmKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBpbnB1dDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTXVsdGlMaW5lU3RyaW5nIjsKICAgIH0KCiAgICB0aGlzLnR5cGUgPSAiTXVsdGlMaW5lU3RyaW5nIjsKICB9CgogIE11bHRpTGluZVN0cmluZy5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgTXVsdGlMaW5lU3RyaW5nLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpTGluZVN0cmluZzsKICBNdWx0aUxpbmVTdHJpbmcucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbihmdW5jKXsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb29yZGluYXRlcy5sZW5ndGg7IGkrKykgewogICAgICBmdW5jLmFwcGx5KHRoaXMsIFt0aGlzLmNvb3JkaW5hdGVzW2ldLCBpLCB0aGlzLmNvb3JkaW5hdGVzIF0pOwogICAgfQogIH07CiAgTXVsdGlMaW5lU3RyaW5nLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpKXsKICAgIHJldHVybiBuZXcgTGluZVN0cmluZyh0aGlzLmNvb3JkaW5hdGVzW2ldKTsKICB9OwoKICAvKgogIEdlb0pTT04gUG9seWdvbiBDbGFzcwogICAgICBuZXcgUG9seWdvbigpOwogICAgICBuZXcgUG9seWdvbihbIFtbeCx5XSwgW3gxLHkxXSwgW3gyLHkyXV0gXSk7CiAgICAgIG5ldyBQb2x5Z29uKHsKICAgICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgW1t4LHldLCBbeDEseTFdLCBbeDIseTJdXSBdCiAgICAgIH0pOwogICovCiAgZnVuY3Rpb24gUG9seWdvbihpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiUG9seWdvbiIgJiYgaW5wdXQuY29vcmRpbmF0ZXMpewogICAgICBleHRlbmQodGhpcywgaW5wdXQpOwogICAgfSBlbHNlIGlmKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7CiAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBpbnB1dDsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuUG9seWdvbiI7CiAgICB9CgogICAgdGhpcy50eXBlID0gIlBvbHlnb24iOwogIH0KCiAgUG9seWdvbi5wcm90b3R5cGUgPSBuZXcgUHJpbWl0aXZlKCk7CiAgUG9seWdvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5Z29uOwogIFBvbHlnb24ucHJvdG90eXBlLmFkZFZlcnRleCA9IGZ1bmN0aW9uKHBvaW50KXsKICAgIHRoaXMuY29vcmRpbmF0ZXNbMF0ucHVzaChwb2ludCk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIFBvbHlnb24ucHJvdG90eXBlLmluc2VydFZlcnRleCA9IGZ1bmN0aW9uKHBvaW50LCBpbmRleCl7CiAgICB0aGlzLmNvb3JkaW5hdGVzWzBdLnNwbGljZShpbmRleCwgMCwgcG9pbnQpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICBQb2x5Z29uLnByb3RvdHlwZS5yZW1vdmVWZXJ0ZXggPSBmdW5jdGlvbihyZW1vdmUpewogICAgdGhpcy5jb29yZGluYXRlc1swXS5zcGxpY2UocmVtb3ZlLCAxKTsKICAgIHJldHVybiB0aGlzOwogIH07CgogIFBvbHlnb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmNvb3JkaW5hdGVzID0gY2xvc2VkUG9seWdvbih0aGlzLmNvb3JkaW5hdGVzKTsKICB9OwoKICAvKgogIEdlb0pTT04gTXVsdGlQb2x5Z29uIENsYXNzCiAgICAgIG5ldyBNdWx0aVBvbHlnb24oKTsKICAgICAgbmV3IE11bHRpUG9seWdvbihbIFsgW1t4LHldLCBbeDEseTFdXSwgW1t4Mix5Ml0sIFt4Myx5M11dIF0gXSk7CiAgICAgIG5ldyBNdWx0aVBvbHlnb24oewogICAgICAgIHR5cGU6ICJNdWx0aVBvbHlnb24iLAogICAgICAgIGNvb3JkaW5hdGVzOiBbIFsgW1t4LHldLCBbeDEseTFdXSwgW1t4Mix5Ml0sIFt4Myx5M11dIF0gXQogICAgICB9KTsKICAqLwogIGZ1bmN0aW9uIE11bHRpUG9seWdvbihpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiTXVsdGlQb2x5Z29uIiAmJiBpbnB1dC5jb29yZGluYXRlcyl7CiAgICAgIGV4dGVuZCh0aGlzLCBpbnB1dCk7CiAgICB9IGVsc2UgaWYoQXJyYXkuaXNBcnJheShpbnB1dCkpIHsKICAgICAgdGhpcy5jb29yZGluYXRlcyA9IGlucHV0OwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5NdWx0aVBvbHlnb24iOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJNdWx0aVBvbHlnb24iOwogIH0KCiAgTXVsdGlQb2x5Z29uLnByb3RvdHlwZSA9IG5ldyBQcmltaXRpdmUoKTsKICBNdWx0aVBvbHlnb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlQb2x5Z29uOwogIE11bHRpUG9seWdvbi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGZ1bmMpewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGZ1bmMuYXBwbHkodGhpcywgW3RoaXMuY29vcmRpbmF0ZXNbaV0sIGksIHRoaXMuY29vcmRpbmF0ZXMgXSk7CiAgICB9CiAgfTsKICBNdWx0aVBvbHlnb24ucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGkpewogICAgcmV0dXJuIG5ldyBQb2x5Z29uKHRoaXMuY29vcmRpbmF0ZXNbaV0pOwogIH07CgogIC8qCiAgR2VvSlNPTiBGZWF0dXJlIENsYXNzCiAgICAgIG5ldyBGZWF0dXJlKCk7CiAgICAgIG5ldyBGZWF0dXJlKHsKICAgICAgICB0eXBlOiAiRmVhdHVyZSIsCiAgICAgICAgZ2VvbWV0cnk6IHsKICAgICAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgICAgIGNvb3JkaW5hdGVzOiBbIFsgW1t4LHldLCBbeDEseTFdXSwgW1t4Mix5Ml0sIFt4Myx5M11dIF0gXQogICAgICAgIH0KICAgICAgfSk7CiAgICAgIG5ldyBGZWF0dXJlKHsKICAgICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFsgWyBbW3gseV0sIFt4MSx5MV1dLCBbW3gyLHkyXSwgW3gzLHkzXV0gXSBdCiAgICAgIH0pOwogICovCiAgZnVuY3Rpb24gRmVhdHVyZShpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiRmVhdHVyZSIgJiYgaW5wdXQuZ2VvbWV0cnkpewogICAgICBleHRlbmQodGhpcywgaW5wdXQpOwogICAgfSBlbHNlIGlmKGlucHV0ICYmIGlucHV0LnR5cGUgJiYgaW5wdXQuY29vcmRpbmF0ZXMpIHsKICAgICAgdGhpcy5nZW9tZXRyeSA9IGlucHV0OwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5GZWF0dXJlIjsKICAgIH0KCiAgICB0aGlzLnR5cGUgPSAiRmVhdHVyZSI7CiAgfQoKICBGZWF0dXJlLnByb3RvdHlwZSA9IG5ldyBQcmltaXRpdmUoKTsKICBGZWF0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZlYXR1cmU7CgogIC8qCiAgR2VvSlNPTiBGZWF0dXJlQ29sbGVjdGlvbiBDbGFzcwogICAgICBuZXcgRmVhdHVyZUNvbGxlY3Rpb24oKTsKICAgICAgbmV3IEZlYXR1cmVDb2xsZWN0aW9uKFtmZWF0dXJlLCBmZWF0dXJlMV0pOwogICAgICBuZXcgRmVhdHVyZUNvbGxlY3Rpb24oewogICAgICAgIHR5cGU6ICJGZWF0dXJlQ29sbGVjdGlvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IFtmZWF0dXJlLCBmZWF0dXJlMV0KICAgICAgfSk7CiAgKi8KICBmdW5jdGlvbiBGZWF0dXJlQ29sbGVjdGlvbihpbnB1dCl7CiAgICBpZihpbnB1dCAmJiBpbnB1dC50eXBlID09PSAiRmVhdHVyZUNvbGxlY3Rpb24iICYmIGlucHV0LmZlYXR1cmVzKXsKICAgICAgZXh0ZW5kKHRoaXMsIGlucHV0KTsKICAgIH0gZWxzZSBpZihBcnJheS5pc0FycmF5KGlucHV0KSkgewogICAgICB0aGlzLmZlYXR1cmVzID0gaW5wdXQ7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAiVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkZlYXR1cmVDb2xsZWN0aW9uIjsKICAgIH0KCiAgICB0aGlzLnR5cGUgPSAiRmVhdHVyZUNvbGxlY3Rpb24iOwogIH0KCiAgRmVhdHVyZUNvbGxlY3Rpb24ucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIEZlYXR1cmVDb2xsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZlYXR1cmVDb2xsZWN0aW9uOwogIEZlYXR1cmVDb2xsZWN0aW9uLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZnVuYyl7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgZnVuYy5hcHBseSh0aGlzLCBbdGhpcy5mZWF0dXJlc1tpXSwgaSwgdGhpcy5mZWF0dXJlc10pOwogICAgfQogIH07CiAgRmVhdHVyZUNvbGxlY3Rpb24ucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGlkKXsKICAgIHZhciBmb3VuZDsKICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbihmZWF0dXJlKXsKICAgICAgaWYoZmVhdHVyZS5pZCA9PT0gaWQpewogICAgICAgIGZvdW5kID0gZmVhdHVyZTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gbmV3IEZlYXR1cmUoZm91bmQpOwogIH07CgogIC8qCiAgR2VvSlNPTiBHZW9tZXRyeUNvbGxlY3Rpb24gQ2xhc3MKICAgICAgbmV3IEdlb21ldHJ5Q29sbGVjdGlvbigpOwogICAgICBuZXcgR2VvbWV0cnlDb2xsZWN0aW9uKFtnZW9tZXRyeSwgZ2VvbWV0cnkxXSk7CiAgICAgIG5ldyBHZW9tZXRyeUNvbGxlY3Rpb24oewogICAgICAgIHR5cGU6ICJHZW9tZXRyeUNvbGxlY3Rpb24iLAogICAgICAgIGNvb3JkaW5hdGVzOiBbZ2VvbWV0cnksIGdlb21ldHJ5MV0KICAgICAgfSk7CiAgKi8KICBmdW5jdGlvbiBHZW9tZXRyeUNvbGxlY3Rpb24oaW5wdXQpewogICAgaWYoaW5wdXQgJiYgaW5wdXQudHlwZSA9PT0gIkdlb21ldHJ5Q29sbGVjdGlvbiIgJiYgaW5wdXQuZ2VvbWV0cmllcyl7CiAgICAgIGV4dGVuZCh0aGlzLCBpbnB1dCk7CiAgICB9IGVsc2UgaWYoQXJyYXkuaXNBcnJheShpbnB1dCkpIHsKICAgICAgdGhpcy5nZW9tZXRyaWVzID0gaW5wdXQ7CiAgICB9IGVsc2UgaWYoaW5wdXQuY29vcmRpbmF0ZXMgJiYgaW5wdXQudHlwZSl7CiAgICAgIHRoaXMudHlwZSA9ICJHZW9tZXRyeUNvbGxlY3Rpb24iOwogICAgICB0aGlzLmdlb21ldHJpZXMgPSBbaW5wdXRdOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgIlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5HZW9tZXRyeUNvbGxlY3Rpb24iOwogICAgfQoKICAgIHRoaXMudHlwZSA9ICJHZW9tZXRyeUNvbGxlY3Rpb24iOwogIH0KCiAgR2VvbWV0cnlDb2xsZWN0aW9uLnByb3RvdHlwZSA9IG5ldyBQcmltaXRpdmUoKTsKICBHZW9tZXRyeUNvbGxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VvbWV0cnlDb2xsZWN0aW9uOwogIEdlb21ldHJ5Q29sbGVjdGlvbi5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGZ1bmMpewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgZnVuYy5hcHBseSh0aGlzLCBbdGhpcy5nZW9tZXRyaWVzW2ldLCBpLCB0aGlzLmdlb21ldHJpZXNdKTsKICAgIH0KICB9OwogIEdlb21ldHJ5Q29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaSl7CiAgICByZXR1cm4gbmV3IFByaW1pdGl2ZSh0aGlzLmdlb21ldHJpZXNbaV0pOwogIH07CgogIGZ1bmN0aW9uIGNyZWF0ZUNpcmNsZShjZW50ZXIsIHJhZGl1cywgaW50ZXJwb2xhdGUpewogICAgdmFyIG1lcmNhdG9yUG9zaXRpb24gPSBwb3NpdGlvblRvTWVyY2F0b3IoY2VudGVyKTsKICAgIHZhciBzdGVwcyA9IGludGVycG9sYXRlIHx8IDY0OwogICAgdmFyIHBvbHlnb24gPSB7CiAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgY29vcmRpbmF0ZXM6IFtbXV0KICAgIH07CiAgICBmb3IodmFyIGk9MTsgaTw9c3RlcHM7IGkrKykgewogICAgICB2YXIgcmFkaWFucyA9IGkgKiAoMzYwL3N0ZXBzKSAqIE1hdGguUEkgLyAxODA7CiAgICAgIHBvbHlnb24uY29vcmRpbmF0ZXNbMF0ucHVzaChbbWVyY2F0b3JQb3NpdGlvblswXSArIHJhZGl1cyAqIE1hdGguY29zKHJhZGlhbnMpLCBtZXJjYXRvclBvc2l0aW9uWzFdICsgcmFkaXVzICogTWF0aC5zaW4ocmFkaWFucyldKTsKICAgIH0KICAgIHJldHVybiB0b0dlb2dyYXBoaWMocG9seWdvbik7CiAgfQoKICBmdW5jdGlvbiBDaXJjbGUgKGNlbnRlciwgcmFkLCBpbnRlcnBvbGF0ZSkgewogICAgdmFyIHN0ZXBzID0gaW50ZXJwb2xhdGUgfHwgNjQ7CiAgICB2YXIgcmFkaXVzID0gcmFkIHx8IDI1MDsKCiAgICBpZighY2VudGVyIHx8IGNlbnRlci5sZW5ndGggPCAyIHx8ICFyYWRpdXMgfHwgIXN0ZXBzKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVGVycmFmb3JtZXI6IG1pc3NpbmcgcGFyYW1ldGVyIGZvciBUZXJyYWZvcm1lci5DaXJjbGUiKTsKICAgIH0KCiAgICBleHRlbmQodGhpcywgbmV3IEZlYXR1cmUoewogICAgICB0eXBlOiAiRmVhdHVyZSIsCiAgICAgIGdlb21ldHJ5OiBjcmVhdGVDaXJjbGUoY2VudGVyLCByYWRpdXMsIHN0ZXBzKSwKICAgICAgcHJvcGVydGllczogewogICAgICAgIHJhZGl1czogcmFkaXVzLAogICAgICAgIGNlbnRlcjogY2VudGVyLAogICAgICAgIHN0ZXBzOiBzdGVwcwogICAgICB9CiAgICB9KSk7CiAgfQoKICBDaXJjbGUucHJvdG90eXBlID0gbmV3IFByaW1pdGl2ZSgpOwogIENpcmNsZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGU7CiAgQ2lyY2xlLnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uKCl7CiAgICB0aGlzLmdlb21ldHJ5ID0gY3JlYXRlQ2lyY2xlKHRoaXMucHJvcGVydGllcy5jZW50ZXIsIHRoaXMucHJvcGVydGllcy5yYWRpdXMsIHRoaXMucHJvcGVydGllcy5zdGVwcyk7CiAgICByZXR1cm4gdGhpczsKICB9OwogIENpcmNsZS5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpewogICAgaWYoY29vcmRpbmF0ZXMpewogICAgICB0aGlzLnByb3BlcnRpZXMuY2VudGVyID0gY29vcmRpbmF0ZXM7CiAgICAgIHRoaXMucmVjYWxjdWxhdGUoKTsKICAgIH0KICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuY2VudGVyOwogIH07CiAgQ2lyY2xlLnByb3RvdHlwZS5yYWRpdXMgPSBmdW5jdGlvbihyYWRpdXMpewogICAgaWYocmFkaXVzKXsKICAgICAgdGhpcy5wcm9wZXJ0aWVzLnJhZGl1cyA9IHJhZGl1czsKICAgICAgdGhpcy5yZWNhbGN1bGF0ZSgpOwogICAgfQogICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5yYWRpdXM7CiAgfTsKICBDaXJjbGUucHJvdG90eXBlLnN0ZXBzID0gZnVuY3Rpb24oc3RlcHMpewogICAgaWYoc3RlcHMpewogICAgICB0aGlzLnByb3BlcnRpZXMuc3RlcHMgPSBzdGVwczsKICAgICAgdGhpcy5yZWNhbGN1bGF0ZSgpOwogICAgfQogICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5zdGVwczsKICB9OwoKICBDaXJjbGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkgewogICAgdmFyIG91dHB1dCA9IFByaW1pdGl2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7CiAgICByZXR1cm4gb3V0cHV0OwogIH07CgogIGV4cG9ydHMuUHJpbWl0aXZlID0gUHJpbWl0aXZlOwogIGV4cG9ydHMuUG9pbnQgPSBQb2ludDsKICBleHBvcnRzLk11bHRpUG9pbnQgPSBNdWx0aVBvaW50OwogIGV4cG9ydHMuTGluZVN0cmluZyA9IExpbmVTdHJpbmc7CiAgZXhwb3J0cy5NdWx0aUxpbmVTdHJpbmcgPSBNdWx0aUxpbmVTdHJpbmc7CiAgZXhwb3J0cy5Qb2x5Z29uID0gUG9seWdvbjsKICBleHBvcnRzLk11bHRpUG9seWdvbiA9IE11bHRpUG9seWdvbjsKICBleHBvcnRzLkZlYXR1cmUgPSBGZWF0dXJlOwogIGV4cG9ydHMuRmVhdHVyZUNvbGxlY3Rpb24gPSBGZWF0dXJlQ29sbGVjdGlvbjsKICBleHBvcnRzLkdlb21ldHJ5Q29sbGVjdGlvbiA9IEdlb21ldHJ5Q29sbGVjdGlvbjsKICBleHBvcnRzLkNpcmNsZSA9IENpcmNsZTsKCiAgZXhwb3J0cy50b01lcmNhdG9yID0gdG9NZXJjYXRvcjsKICBleHBvcnRzLnRvR2VvZ3JhcGhpYyA9IHRvR2VvZ3JhcGhpYzsKCiAgZXhwb3J0cy5Ub29scyA9IHt9OwogIGV4cG9ydHMuVG9vbHMucG9zaXRpb25Ub01lcmNhdG9yID0gcG9zaXRpb25Ub01lcmNhdG9yOwogIGV4cG9ydHMuVG9vbHMucG9zaXRpb25Ub0dlb2dyYXBoaWMgPSBwb3NpdGlvblRvR2VvZ3JhcGhpYzsKICBleHBvcnRzLlRvb2xzLmFwcGx5Q29udmVydGVyID0gYXBwbHlDb252ZXJ0ZXI7CiAgZXhwb3J0cy5Ub29scy50b01lcmNhdG9yID0gdG9NZXJjYXRvcjsKICBleHBvcnRzLlRvb2xzLnRvR2VvZ3JhcGhpYyA9IHRvR2VvZ3JhcGhpYzsKICBleHBvcnRzLlRvb2xzLmNyZWF0ZUNpcmNsZSA9IGNyZWF0ZUNpcmNsZTsKCiAgZXhwb3J0cy5Ub29scy5jYWxjdWxhdGVCb3VuZHMgPSBjYWxjdWxhdGVCb3VuZHM7CiAgZXhwb3J0cy5Ub29scy5jYWxjdWxhdGVFbnZlbG9wZSA9IGNhbGN1bGF0ZUVudmVsb3BlOwogIGV4cG9ydHMuVG9vbHMuY29vcmRpbmF0ZXNDb250YWluUG9pbnQgPSBjb29yZGluYXRlc0NvbnRhaW5Qb2ludDsKICBleHBvcnRzLlRvb2xzLnBvbHlnb25Db250YWluc1BvaW50ID0gcG9seWdvbkNvbnRhaW5zUG9pbnQ7CiAgZXhwb3J0cy5Ub29scy5hcnJheUludGVyc2VjdHNBcnJheSA9IGFycmF5SW50ZXJzZWN0c0FycmF5OwogIGV4cG9ydHMuVG9vbHMuY29vcmRpbmF0ZXNDb250YWluUG9pbnQgPSBjb29yZGluYXRlc0NvbnRhaW5Qb2ludDsKICBleHBvcnRzLlRvb2xzLmNvb3JkaW5hdGVzRXF1YWwgPSBjb29yZGluYXRlc0VxdWFsOwogIGV4cG9ydHMuVG9vbHMuY29udmV4SHVsbCA9IGNvbnZleEh1bGw7CgogIGV4cG9ydHMuTWVyY2F0b3JDUlMgPSBNZXJjYXRvckNSUzsKICBleHBvcnRzLkdlb2dyYXBoaWNDUlMgPSBHZW9ncmFwaGljQ1JTOwoKICByZXR1cm4gZXhwb3J0czsKfSkpOwoKLyogZ2xvYmFscyBUZXJyYWZvcm1lciAqLwooZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKCiAgLy8gTm9kZS4KICBpZih0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJ3RlcnJhZm9ybWVyJykpOwogIH0KCiAgLy8gQnJvd3NlciBHbG9iYWwuCiAgaWYodHlwZW9mIHJvb3QubmF2aWdhdG9yID09PSAib2JqZWN0IikgewogICAgaWYgKCFyb290LlRlcnJhZm9ybWVyKXsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJUZXJyYWZvcm1lci5BcmNHSVMgcmVxdWlyZXMgdGhlIGNvcmUgVGVycmFmb3JtZXIgbGlicmFyeS4gaHR0cHM6Ly9naXRodWIuY29tL2VzcmkvVGVycmFmb3JtZXIiKTsKICAgIH0KICAgIHJvb3QuVGVycmFmb3JtZXIuQXJjR0lTID0gZmFjdG9yeShyb290LlRlcnJhZm9ybWVyKTsKICB9Cgp9KHRoaXMsIGZ1bmN0aW9uKFRlcnJhZm9ybWVyKSB7CiAgdmFyIGV4cG9ydHMgPSB7fTsKCiAgLy8gc2hhbGxvdyBvYmplY3QgY2xvbmUgZm9yIGZlYXR1cmUgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcwogIC8vIGZyb20gaHR0cDovL2pzcGVyZi5jb20vY2xvbmluZy1hbi1vYmplY3QvMgogIGZ1bmN0aW9uIGNsb25lKG9iaikgewogICAgdmFyIHRhcmdldCA9IHt9OwogICAgZm9yICh2YXIgaSBpbiBvYmopIHsKICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICAgIHRhcmdldFtpXSA9IG9ialtpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIGRldGVybWluZSBpZiBwb2x5Z29uIHJpbmcgY29vcmRpbmF0ZXMgYXJlIGNsb2Nrd2lzZS4gY2xvY2t3aXNlIHNpZ25pZmllcyBvdXRlciByaW5nLCBjb3VudGVyLWNsb2Nrd2lzZSBhbiBpbm5lciByaW5nCiAgLy8gb3IgaG9sZS4gdGhpcyBsb2dpYyB3YXMgZm91bmQgYXQgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMTY1NjQ3L2hvdy10by1kZXRlcm1pbmUtaWYtYS1saXN0LW9mLXBvbHlnb24tCiAgLy8gcG9pbnRzLWFyZS1pbi1jbG9ja3dpc2Utb3JkZXIKICBmdW5jdGlvbiByaW5nSXNDbG9ja3dpc2UocmluZ1RvVGVzdCkgewogICAgdmFyIHRvdGFsID0gMCxpID0gMDsKICAgIHZhciByTGVuZ3RoID0gcmluZ1RvVGVzdC5sZW5ndGg7CiAgICB2YXIgcHQxID0gcmluZ1RvVGVzdFtpXTsKICAgIHZhciBwdDI7CiAgICBmb3IgKGk7IGkgPCByTGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgIHB0MiA9IHJpbmdUb1Rlc3RbaSArIDFdOwogICAgICB0b3RhbCArPSAocHQyWzBdIC0gcHQxWzBdKSAqIChwdDJbMV0gKyBwdDFbMV0pOwogICAgICBwdDEgPSBwdDI7CiAgICB9CiAgICByZXR1cm4gKHRvdGFsID49IDApOwogIH0KCiAgLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBwb2x5Z29ucyB0byBvbmUgYXJyYXkgb2YgcmluZ3MKICAvLwogIC8vIFsKICAvLyAgIFsgYXJyYXkgb2Ygb3V0ZXIgY29vcmRpbmF0ZXMgXQogIC8vICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gXQogIC8vIGJlY29tZXMKICAvLyBbCiAgLy8gICBbIGFycmF5IG9mIG91dGVyIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vIF0KICBmdW5jdGlvbiBmbGF0dGVuUG9seWdvblJpbmdzKHBvbHkpewogICAgdmFyIG91dHB1dCA9IFtdOwogICAgdmFyIHBvbHlnb24gPSBwb2x5LnNsaWNlKDApOwogICAgdmFyIG91dGVyUmluZyA9IHBvbHlnb24uc2hpZnQoKS5zbGljZSgwKTsKCiAgICBpZighcmluZ0lzQ2xvY2t3aXNlKG91dGVyUmluZykpewogICAgICBvdXRlclJpbmcucmV2ZXJzZSgpOwogICAgfQoKICAgIG91dHB1dC5wdXNoKG91dGVyUmluZyk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2x5Z29uLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBob2xlID0gcG9seWdvbltpXS5zbGljZSgwKTsKICAgICAgaWYocmluZ0lzQ2xvY2t3aXNlKGhvbGUpKXsKICAgICAgICBob2xlLnJldmVyc2UoKTsKICAgICAgfQogICAgICBvdXRwdXQucHVzaChob2xlKTsKICAgIH0KCiAgICByZXR1cm4gb3V0cHV0OwogIH0KCiAgLy8gVGhpcyBmdW5jdGlvbiBmbGF0dGVucyBob2xlcyBpbiBtdWx0aXBvbHlnb25zIHRvIG9uZSBhcnJheSBvZiBwb2x5Z29ucwogIC8vIHNvCiAgLy8gWwogIC8vICAgWwogIC8vICAgICBbIGFycmF5IG9mIG91dGVyIGNvb3JkaW5hdGVzIF0KICAvLyAgICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgIF0sCiAgLy8gICBbCiAgLy8gICAgIFsgYXJyYXkgb2Ygb3V0ZXIgY29vcmRpbmF0ZXMgXQogIC8vICAgICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vICAgICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vICAgXSwKICAvLyBdCiAgLy8gYmVjb21lcwogIC8vIFsKICAvLyAgIFsgYXJyYXkgb2Ygb3V0ZXIgY29vcmRpbmF0ZXMgXQogIC8vICAgWyBob2xlIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gICBbIGFycmF5IG9mIG91dGVyIGNvb3JkaW5hdGVzIF0KICAvLyAgIFsgaG9sZSBjb29yZGluYXRlcyBdCiAgLy8gICBbIGhvbGUgY29vcmRpbmF0ZXMgXQogIC8vIF0KICBmdW5jdGlvbiBmbGF0dGVuTXVsdGlQb2x5Z29uUmluZ3MocmluZ3MpewogICAgdmFyIG91dHB1dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByaW5ncy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcG9seWdvbiA9IGZsYXR0ZW5Qb2x5Z29uUmluZ3MocmluZ3NbaV0pOwogICAgICBmb3IgKHZhciB4ID0gcG9seWdvbi5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkgewogICAgICAgIHZhciByaW5nID0gcG9seWdvblt4XS5zbGljZSgwKTsKICAgICAgICBvdXRwdXQucHVzaChyaW5nKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dHB1dDsKICB9CgogIGZ1bmN0aW9uIGNvb3JkaW5hdGVzQ29udGFpbkNvb3JkaW5hdGVzKG91dGVyLCBpbm5lcil7CiAgICB2YXIgaW50ZXJzZWN0cyA9IFRlcnJhZm9ybWVyLlRvb2xzLmFycmF5SW50ZXJzZWN0c0FycmF5KG91dGVyLCBpbm5lcik7CiAgICB2YXIgY29udGFpbnMgPSBUZXJyYWZvcm1lci5Ub29scy5jb29yZGluYXRlc0NvbnRhaW5Qb2ludChvdXRlciwgaW5uZXJbMF0pOwogICAgaWYoIWludGVyc2VjdHMgJiYgY29udGFpbnMpewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIGRvIGFueSBwb2x5Z29ucyBpbiB0aGlzIGFycmF5IGNvbnRhaW4gYW55IG90aGVyIHBvbHlnb25zIGluIHRoaXMgYXJyYXk/CiAgLy8gdXNlZCBmb3IgY2hlY2tpbmcgZm9yIGhvbGVzIGluIGFyY2dpcyByaW5ncwogIGZ1bmN0aW9uIGNvbnZlcnRSaW5nc1RvR2VvSlNPTihyaW5ncyl7CiAgICB2YXIgb3V0ZXJSaW5ncyA9IFtdOwogICAgdmFyIGhvbGVzID0gW107CgogICAgLy8gZm9yIGVhY2ggcmluZwogICAgZm9yICh2YXIgciA9IDA7IHIgPCByaW5ncy5sZW5ndGg7IHIrKykgewogICAgICB2YXIgcmluZyA9IHJpbmdzW3JdLnNsaWNlKDApOwoKICAgICAgLy8gaXMgdGhpcyByaW5nIGFuIG91dGVyIHJpbmc/IGlzIGl0IGNsb2Nrd2lzZT8KICAgICAgaWYocmluZ0lzQ2xvY2t3aXNlKHJpbmcpKXsKICAgICAgICB2YXIgcG9seWdvbiA9IFsgcmluZyBdOwogICAgICAgIG91dGVyUmluZ3MucHVzaChwb2x5Z29uKTsgLy8gcHVzaCB0byBvdXRlciByaW5ncwogICAgICB9IGVsc2UgewogICAgICAgIGhvbGVzLnB1c2gocmluZyk7IC8vIGNvdW50ZXJjbG9ja3dpc2UgcHVzaCB0byBob2xlcwogICAgICB9CiAgICB9CgogICAgLy8gd2hpbGUgdGhlcmUgYXJlIGhvbGVzIGxlZnQuLi4KICAgIHdoaWxlKGhvbGVzLmxlbmd0aCl7CiAgICAgIC8vIHBvcCBhIGhvbGUgb2ZmIG91dCBzdGFjawogICAgICB2YXIgaG9sZSA9IGhvbGVzLnBvcCgpOwogICAgICB2YXIgbWF0Y2hlZCA9IGZhbHNlOwoKICAgICAgLy8gbG9vcCBvdmVyIGFsbCBvdXRlciByaW5ncyBhbmQgc2VlIGlmIHRoZXkgY29udGFpbiBvdXIgaG9sZS4KICAgICAgZm9yICh2YXIgeCA9IG91dGVyUmluZ3MubGVuZ3RoIC0gMTsgeCA+PSAwOyB4LS0pIHsKICAgICAgICB2YXIgb3V0ZXJSaW5nID0gb3V0ZXJSaW5nc1t4XVswXTsKICAgICAgICBpZihjb29yZGluYXRlc0NvbnRhaW5Db29yZGluYXRlcyhvdXRlclJpbmcsIGhvbGUpKXsKICAgICAgICAgIC8vIHRoZSBob2xlIGlzIGNvbnRhaW5lZCBwdXNoIGl0IGludG8gb3VyIHBvbHlnb24KICAgICAgICAgIG91dGVyUmluZ3NbeF0ucHVzaChob2xlKTsKCiAgICAgICAgICAvLyB3ZSBtYXRjaGVkIHRoZSBob2xlCiAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTsKCiAgICAgICAgICAvLyBzdG9wIGNoZWNraW5nIHRvIHNlZSBpZiBvdGhlciBvdXRlciByaW5ncyBjb250aWFuIHRoaXMgaG9sZQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBubyBvdXRlciByaW5ncyBjb250YWluIHRoaXMgaG9sZSB0dXJuIGl0IGludG8gYW5kIG91dGVyIHJpbmcgKHJldmVyc2UgaXQpCiAgICAgIGlmKCFtYXRjaGVkKXsKICAgICAgICBvdXRlclJpbmdzLnB1c2goWyBob2xlLnJldmVyc2UoKSBdKTsKICAgICAgfQogICAgfQoKICAgIGlmKG91dGVyUmluZ3MubGVuZ3RoID09PSAxKXsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IG91dGVyUmluZ3NbMF0KICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogIk11bHRpUG9seWdvbiIsCiAgICAgICAgY29vcmRpbmF0ZXM6IG91dGVyUmluZ3MKICAgICAgfTsKICAgIH0KICB9CgogIC8vIEFyY0dJUyAtPiBHZW9KU09OCiAgZnVuY3Rpb24gcGFyc2UoYXJjZ2lzKXsKICAgIHZhciBnZW9qc29uID0ge307CgogICAgaWYoYXJjZ2lzLnggJiYgYXJjZ2lzLnkpewogICAgICBnZW9qc29uLnR5cGUgPSAiUG9pbnQiOwogICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gW2FyY2dpcy54LCBhcmNnaXMueV07CiAgICB9CgogICAgaWYoYXJjZ2lzLnBvaW50cyl7CiAgICAgIGdlb2pzb24udHlwZSA9ICJNdWx0aVBvaW50IjsKICAgICAgZ2VvanNvbi5jb29yZGluYXRlcyA9IGFyY2dpcy5wb2ludHMuc2xpY2UoMCk7CiAgICB9CgogICAgaWYoYXJjZ2lzLnBhdGhzKSB7CiAgICAgIGlmKGFyY2dpcy5wYXRocy5sZW5ndGggPT09IDEpewogICAgICAgIGdlb2pzb24udHlwZSA9ICJMaW5lU3RyaW5nIjsKICAgICAgICBnZW9qc29uLmNvb3JkaW5hdGVzID0gYXJjZ2lzLnBhdGhzWzBdLnNsaWNlKDApOwogICAgICB9IGVsc2UgewogICAgICAgIGdlb2pzb24udHlwZSA9ICJNdWx0aUxpbmVTdHJpbmciOwogICAgICAgIGdlb2pzb24uY29vcmRpbmF0ZXMgPSBhcmNnaXMucGF0aHMuc2xpY2UoMCk7CiAgICAgIH0KICAgIH0KCiAgICBpZihhcmNnaXMucmluZ3MpIHsKICAgICAgZ2VvanNvbiA9IGNvbnZlcnRSaW5nc1RvR2VvSlNPTihhcmNnaXMucmluZ3Muc2xpY2UoMCkpOwogICAgfQoKICAgIGlmKGFyY2dpcy5nZW9tZXRyeSkgewogICAgICBnZW9qc29uLnR5cGUgPSAiRmVhdHVyZSI7CiAgICAgIGdlb2pzb24uZ2VvbWV0cnkgPSBwYXJzZShhcmNnaXMuZ2VvbWV0cnkpOwogICAgICBnZW9qc29uLnByb3BlcnRpZXMgPSBjbG9uZShhcmNnaXMuYXR0cmlidXRlcykgfHwge307CiAgICB9CgogICAgdmFyIGlucHV0U3BhdGlhbFJlZmVyZW5jZSA9IChhcmNnaXMuZ2VvbWV0cnkpID8gYXJjZ2lzLmdlb21ldHJ5LnNwYXRpYWxSZWZlcmVuY2UgOiBhcmNnaXMuc3BhdGlhbFJlZmVyZW5jZTsKCiAgICAvL2NvbnZlcnQgc3BhdGlhbCByZWYgaWYgbmVlZGVkCiAgICBpZihpbnB1dFNwYXRpYWxSZWZlcmVuY2UgJiYgaW5wdXRTcGF0aWFsUmVmZXJlbmNlLndraWQgPT09IDEwMjEwMCl7CiAgICAgIGdlb2pzb24gPSBUZXJyYWZvcm1lci50b0dlb2dyYXBoaWMoZ2VvanNvbik7CiAgICB9CgogICAgcmV0dXJuIG5ldyBUZXJyYWZvcm1lci5QcmltaXRpdmUoZ2VvanNvbik7CiAgfQoKICAvLyBHZW9KU09OIC0+IEFyY0dJUwogIGZ1bmN0aW9uIGNvbnZlcnQoZ2VvanNvbiwgc3IpewogICAgdmFyIHNwYXRpYWxSZWZlcmVuY2U7CgogICAgaWYoc3IpewogICAgICBzcGF0aWFsUmVmZXJlbmNlID0gc3I7CiAgICB9IGVsc2UgaWYgKGdlb2pzb24gJiYgZ2VvanNvbi5jcnMgPT09IFRlcnJhZm9ybWVyLk1lcmNhdG9yQ1JTKSB7CiAgICAgIHNwYXRpYWxSZWZlcmVuY2UgPSB7IHdraWQ6IDEwMjEwMCB9OwogICAgfSBlbHNlIHsKICAgICAgc3BhdGlhbFJlZmVyZW5jZSA9IHsgd2tpZDogNDMyNiB9OwogICAgfQoKICAgIHZhciByZXN1bHQgPSB7fTsKICAgIHZhciBpOwoKICAgIHN3aXRjaChnZW9qc29uLnR5cGUpewogICAgY2FzZSAiUG9pbnQiOgogICAgICByZXN1bHQueCA9IGdlb2pzb24uY29vcmRpbmF0ZXNbMF07CiAgICAgIHJlc3VsdC55ID0gZ2VvanNvbi5jb29yZGluYXRlc1sxXTsKICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlOwogICAgICBicmVhazsKICAgIGNhc2UgIk11bHRpUG9pbnQiOgogICAgICByZXN1bHQucG9pbnRzID0gZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKTsKICAgICAgcmVzdWx0LnNwYXRpYWxSZWZlcmVuY2UgPSBzcGF0aWFsUmVmZXJlbmNlOwogICAgICBicmVhazsKICAgIGNhc2UgIkxpbmVTdHJpbmciOgogICAgICByZXN1bHQucGF0aHMgPSBbZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKV07CiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJNdWx0aUxpbmVTdHJpbmciOgogICAgICByZXN1bHQucGF0aHMgPSBnZW9qc29uLmNvb3JkaW5hdGVzLnNsaWNlKDApOwogICAgICByZXN1bHQuc3BhdGlhbFJlZmVyZW5jZSA9IHNwYXRpYWxSZWZlcmVuY2U7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiUG9seWdvbiI6CiAgICAgIHJlc3VsdC5yaW5ncyA9IGZsYXR0ZW5Qb2x5Z29uUmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7CiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJNdWx0aVBvbHlnb24iOgogICAgICByZXN1bHQucmluZ3MgPSBmbGF0dGVuTXVsdGlQb2x5Z29uUmluZ3MoZ2VvanNvbi5jb29yZGluYXRlcy5zbGljZSgwKSk7CiAgICAgIHJlc3VsdC5zcGF0aWFsUmVmZXJlbmNlID0gc3BhdGlhbFJlZmVyZW5jZTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJGZWF0dXJlIjoKICAgICAgcmVzdWx0Lmdlb21ldHJ5ID0gY29udmVydChnZW9qc29uLmdlb21ldHJ5KTsKICAgICAgcmVzdWx0LmF0dHJpYnV0ZXMgPSBjbG9uZShnZW9qc29uLnByb3BlcnRpZXMpOwogICAgICBicmVhazsKICAgIGNhc2UgIkZlYXR1cmVDb2xsZWN0aW9uIjoKICAgICAgcmVzdWx0ID0gW107CiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9qc29uLmZlYXR1cmVzLmxlbmd0aDsgaSsrKXsKICAgICAgICByZXN1bHQucHVzaChjb252ZXJ0KGdlb2pzb24uZmVhdHVyZXNbaV0pKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgIkdlb21ldHJ5Q29sbGVjdGlvbiI6CiAgICAgIHJlc3VsdCA9IFtdOwogICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvanNvbi5nZW9tZXRyaWVzLmxlbmd0aDsgaSsrKXsKICAgICAgICByZXN1bHQucHVzaChjb252ZXJ0KGdlb2pzb24uZ2VvbWV0cmllc1tpXSkpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBleHBvcnRzLnBhcnNlICAgPSBwYXJzZTsKICBleHBvcnRzLmNvbnZlcnQgPSBjb252ZXJ0OwogIGV4cG9ydHMudG9HZW9KU09OID0gcGFyc2U7CiAgZXhwb3J0cy5mcm9tR2VvSlNPTiA9IGNvbnZlcnQ7CgogIHJldHVybiBleHBvcnRzOwp9KSk7CihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoKICAvLyBOb2RlLgogIGlmKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgidGVycmFmb3JtZXIiKSk7CiAgfQoKICBpZih0eXBlb2Ygcm9vdC5uYXZpZ2F0b3IgPT09ICJvYmplY3QiKSB7CiAgICBpZiAoIXJvb3QuVGVycmFmb3JtZXIpewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlRlcnJhZm9ybWVyLlJUcmVlIHJlcXVpcmVzIHRoZSBjb3JlIFRlcnJhZm9ybWVyIGxpYnJhcnkuIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3JpL1RlcnJhZm9ybWVyIik7CiAgICB9CiAgICByb290LlRlcnJhZm9ybWVyLlJUcmVlID0gZmFjdG9yeShyb290LlRlcnJhZm9ybWVyKS5SVHJlZTsKICB9Cgp9KHRoaXMsIGZ1bmN0aW9uKFRlcnJhZm9ybWVyKSB7CiAgdmFyIGV4cG9ydHMgPSB7IH07CgogIGZ1bmN0aW9uIGlzQXJyYXkob2JqKSB7CiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XSc7CiAgfQoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBydHJlZS5qcyAtIEdlbmVyYWwtUHVycG9zZSBOb24tUmVjdXJzaXZlIEphdmFzY3JpcHQgUi1UcmVlIExpYnJhcnkKIFZlcnNpb24gMC42LjIsIERlY2VtYmVyIDVzdCAyMDA5CiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9uLUNhcmxvcyBSaXZlcmEKIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCiBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogSm9uLUNhcmxvcyBSaXZlcmEgLSBpbWJjbWR0aEBob3RtYWlsLmNvbQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogUlRyZWUgLSBBIHNpbXBsZSByLXRyZWUgc3RydWN0dXJlIGZvciBncmVhdCByZXN1bHRzLgogKiBAY29uc3RydWN0b3IKICovCnZhciBSVHJlZSA9IGZ1bmN0aW9uICh3aWR0aCkgewogICAgLy8gVmFyaWFibGVzIHRvIGNvbnRyb2wgdHJlZS1kaW1lbnNpb25zCiAgICB2YXIgX01pbl9XaWR0aCA9IDM7IC8vIE1pbmltdW0gd2lkdGggb2YgYW55IG5vZGUgYmVmb3JlIGEgbWVyZ2UKICAgIHZhciBfTWF4X1dpZHRoID0gNjsgLy8gTWF4aW11bSB3aWR0aCBvZiBhbnkgbm9kZSBiZWZvcmUgYSBzcGxpdAogICAgaWYgKCFpc05hTih3aWR0aCkpIHsKICAgICAgX01pbl9XaWR0aCA9IE1hdGguZmxvb3Iod2lkdGggLyAyLjApOwogICAgICBfTWF4X1dpZHRoID0gd2lkdGg7CiAgICB9CgogICAgdGhpcy5taW5fd2lkdGggPSBfTWluX1dpZHRoOwogICAgdGhpcy5tYXhfd2lkdGggPSBfTWF4X1dpZHRoOwoKICAgIC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgcm9vdC10cmVlCiAgICB2YXIgX1QgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHc6IDAsCiAgICAgIGg6IDAsCiAgICAgIGlkOiAicm9vdCIsCiAgICAgIG5vZGVzOiBbXQogICAgfTsKCiAgIC8qIEBmdW5jdGlvbgogICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gZ2VuZXJhdGUgdW5pcXVlIHN0cmluZ3MgZm9yIGVsZW1lbnQgSURzCiAgICAqIEBwYXJhbSB7U3RyaW5nfSBuICAgICAgVGhlIHByZWZpeCB0byB1c2UgZm9yIHRoZSBJRHMgZ2VuZXJhdGVkLgogICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICBBIGd1YXJlbnRlZWQgdW5pcXVlIElELgogICAgKi8KICAgIHZhciBfbmFtZV90b19pZCA9IChmdW5jdGlvbigpIHsKICAgICAgLy8gaGlkZSBvdXIgaWRDYWNoZSBpbnNpZGUgdGhpcyBjbG9zdXJlCiAgICAgIHZhciBpZENhY2hlID0ge307CgogICAgICAvLyByZXR1cm4gdGhlIGFwaTogb3VyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHVuaXF1ZSBzdHJpbmcgd2l0aCBpbmNyZW1lbnRpbmcgbnVtYmVyIGFwcGVuZGVkIHRvIGdpdmVuIGlkUHJlZml4CiAgICAgIHJldHVybiBmdW5jdGlvbihpZFByZWZpeCkgewogICAgICAgIHZhciBpZFZhbCA9IDA7CiAgICAgICAgaWYgKGlkUHJlZml4IGluIGlkQ2FjaGUpIHsKICAgICAgICAgIGlkVmFsID0gaWRDYWNoZVtpZFByZWZpeF0rKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWRDYWNoZVtpZFByZWZpeF0gPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWRQcmVmaXggKyAiXyIgKyBpZFZhbDsKICAgICAgfTsKICAgIH0pKCk7CgogICAgLy8gVGhpcyBpcyBteSBzcGVjaWFsIGFkZGl0aW9uIHRvIHRoZSB3b3JsZCBvZiByLXRyZWVzCiAgICAvLyBldmVyeSBvdGhlciAoc2ltcGxlKSBtZXRob2QgSSBmb3VuZCBwcm9kdWNlZCBjcmFwIHRyZWVzCiAgICAvLyB0aGlzIHNrZXdzIGluc2VydGlvbnMgdG8gcHJlZmVyaW5nIHNxdWFyZXIgYW5kIGVtcHRpZXIgbm9kZXMKICAgIFJUcmVlLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvID0gZnVuY3Rpb24obCwgdywgZmlsbCkgewogICAgICAvLyBBcmVhIG9mIG5ldyBlbmxhcmdlZCByZWN0YW5nbGUKICAgICAgdmFyIGxwZXJpID0gKGwgKyB3KSAvIDIuMDsgLy8gQXZlcmFnZSBzaXplIG9mIGEgc2lkZSBvZiB0aGUgbmV3IHJlY3RhbmdsZQogICAgICB2YXIgbGFyZWEgPSBsICogdzsgLy8gQXJlYSBvZiBuZXcgcmVjdGFuZ2xlCiAgICAgIC8vIHJldHVybiB0aGUgcmF0aW8gb2YgdGhlIHBlcmltZXRlciB0byB0aGUgYXJlYSAtIHRoZSBjbG9zZXIgdG8gMSB3ZSBhcmUsCiAgICAgIC8vIHRoZSBtb3JlICJzcXVhcmUiIGEgcmVjdGFuZ2xlIGlzLiBjb252ZXJzbHksIHdoZW4gYXBwcm9hY2hpbmcgemVybyB0aGUKICAgICAgLy8gbW9yZSBlbG9uZ2F0ZWQgYSByZWN0YW5nbGUgaXMKICAgICAgdmFyIGxnZW8gPSBsYXJlYSAvIChscGVyaSAqIGxwZXJpKTsKICAgICAgcmV0dXJuIChsYXJlYSAqIGZpbGwgLyBsZ2VvKTsKICAgIH07CgogICAvKiBmaW5kIHRoZSBiZXN0IHNwZWNpZmljIG5vZGUocykgZm9yIG9iamVjdCB0byBiZSBkZWxldGVkIGZyb20KICAgICogWyBsZWFmIG5vZGUgcGFyZW50IF0gPSBfcmVtb3ZlX3N1YnRyZWUocmVjdGFuZ2xlLCBvYmplY3QsIHJvb3QpCiAgICAqIEBwcml2YXRlCiAgICAqLwogICAgdmFyIF9yZW1vdmVfc3VidHJlZSA9IGZ1bmN0aW9uKHJlY3QsIG9iaiwgcm9vdCkgewogICAgICAgIHZhciBoaXRfc3RhY2sgPSBbXTsgLy8gQ29udGFpbnMgdGhlIGVsZW1lbnRzIHRoYXQgb3ZlcmxhcAogICAgICAgIHZhciBjb3VudF9zdGFjayA9IFtdOyAvLyBDb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBvdmVybGFwCiAgICAgICAgdmFyIHJldF9hcnJheSA9IFtdOwogICAgICAgIHZhciBjdXJyZW50X2RlcHRoID0gMTsKCiAgICAgICAgaWYgKCFyZWN0IHx8ICFSVHJlZS5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUocmVjdCwgcm9vdCkpIHsKICAgICAgICAgIHJldHVybiByZXRfYXJyYXk7CiAgICAgICAgfQoKICAgICAgICB2YXIgcmV0X29iaiA9IHsKICAgICAgICAgIHg6IHJlY3QueCwKICAgICAgICAgIHk6IHJlY3QueSwKICAgICAgICAgIHc6IHJlY3QudywKICAgICAgICAgIGg6IHJlY3QuaCwKICAgICAgICAgIHRhcmdldDogb2JqCiAgICAgICAgfTsKCiAgICAgICAgY291bnRfc3RhY2sucHVzaChyb290Lm5vZGVzLmxlbmd0aCk7CiAgICAgICAgaGl0X3N0YWNrLnB1c2gocm9vdCk7CgogICAgICAgIGRvIHsKICAgICAgICAgIHZhciB0cmVlID0gaGl0X3N0YWNrLnBvcCgpOwogICAgICAgICAgdmFyIGkgPSBjb3VudF9zdGFjay5wb3AoKSAtIDE7CgogICAgICAgICAgaWYgKCJ0YXJnZXQiIGluIHJldF9vYmopIHsgLy8gV2UgYXJlIHNlYXJjaGluZyBmb3IgYSB0YXJnZXQKICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCkgewogICAgICAgICAgICAgIHZhciBsdHJlZSA9IHRyZWUubm9kZXNbaV07CiAgICAgICAgICAgICAgaWYgKFJUcmVlLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShyZXRfb2JqLCBsdHJlZSkpIHsKICAgICAgICAgICAgICAgIGlmICgocmV0X29iai50YXJnZXQgJiYgImxlYWYiIGluIGx0cmVlICYmIGx0cmVlLmxlYWYgPT09IHJldF9vYmoudGFyZ2V0KSB8fCAoIXJldF9vYmoudGFyZ2V0ICYmICgibGVhZiIgaW4gbHRyZWUgfHwgUlRyZWUuUmVjdGFuZ2xlLmNvbnRhaW5zX3JlY3RhbmdsZShsdHJlZSwgcmV0X29iaikpKSkgeyAvLyBBIE1hdGNoICEhCiAgICAgICAgICAgICAgICAgIC8vIFl1cCB3ZSBmb3VuZCBhIG1hdGNoLi4uCiAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBjYW5jZWwgc2VhcmNoIGFuZCBzdGFydCB3YWxraW5nIHVwIHRoZSBsaXN0CiAgICAgICAgICAgICAgICAgIGlmICgibm9kZXMiIGluIGx0cmVlKSB7IC8vIElmIHdlIGFyZSBkZWxldGluZyBhIG5vZGUgbm90IGEgbGVhZi4uLgogICAgICAgICAgICAgICAgICAgIHJldF9hcnJheSA9IF9zZWFyY2hfc3VidHJlZShsdHJlZSwgdHJ1ZSwgW10sIGx0cmVlKTsKICAgICAgICAgICAgICAgICAgICB0cmVlLm5vZGVzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXRfYXJyYXkgPSB0cmVlLm5vZGVzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyBSZXNpemUgTUJSIGRvd24uLi4KICAgICAgICAgICAgICAgICAgUlRyZWUuUmVjdGFuZ2xlLm1ha2VfTUJSKHRyZWUubm9kZXMsIHRyZWUpOwogICAgICAgICAgICAgICAgICBkZWxldGUgcmV0X29iai50YXJnZXQ7CiAgICAgICAgICAgICAgICAgIGlmICh0cmVlLm5vZGVzLmxlbmd0aCA8IF9NaW5fV2lkdGgpIHsgLy8gVW5kZXJmbG93CiAgICAgICAgICAgICAgICAgICAgcmV0X29iai5ub2RlcyA9IF9zZWFyY2hfc3VidHJlZSh0cmVlLCB0cnVlLCBbXSwgdHJlZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiAgZWxzZSBpZigibG9hZCIgaW4gbHRyZWUpIHsgLy8gQSBsb2FkCiAgICAgICAgICAgICAgICB9Ki8KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJub2RlcyIgaW4gbHRyZWUpIHsgLy8gTm90IGEgTGVhZgogICAgICAgICAgICAgICAgICBjdXJyZW50X2RlcHRoICs9IDE7CiAgICAgICAgICAgICAgICAgIGNvdW50X3N0YWNrLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgIGhpdF9zdGFjay5wdXNoKHRyZWUpOwogICAgICAgICAgICAgICAgICB0cmVlID0gbHRyZWU7CiAgICAgICAgICAgICAgICAgIGkgPSBsdHJlZS5ub2Rlcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGkgLT0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICgibm9kZXMiIGluIHJldF9vYmopIHsgLy8gV2UgYXJlIHVuc3BsaXR0aW5nCiAgICAgICAgICAgIHRyZWUubm9kZXMuc3BsaWNlKGkgKyAxLCAxKTsgLy8gUmVtb3ZlIHVuc3BsaXQgbm9kZQogICAgICAgICAgICAvLyByZXRfb2JqLm5vZGVzIGNvbnRhaW5zIGEgbGlzdCBvZiBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIHRyZWUgc28gZmFyCiAgICAgICAgICAgIGlmICh0cmVlLm5vZGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUubWFrZV9NQlIodHJlZS5ub2RlcywgdHJlZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCByZXRfb2JqLm5vZGVzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgX2luc2VydF9zdWJ0cmVlKHJldF9vYmoubm9kZXNbdF0sIHRyZWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldF9vYmoubm9kZXMubGVuZ3RoID0gMDsKICAgICAgICAgICAgaWYgKGhpdF9zdGFjay5sZW5ndGggPT09IDAgJiYgdHJlZS5ub2Rlcy5sZW5ndGggPD0gMSkgeyAvLyBVbmRlcmZsb3cuLm9uIHJvb3QhCiAgICAgICAgICAgICAgcmV0X29iai5ub2RlcyA9IF9zZWFyY2hfc3VidHJlZSh0cmVlLCB0cnVlLCByZXRfb2JqLm5vZGVzLCB0cmVlKTsKICAgICAgICAgICAgICB0cmVlLm5vZGVzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgaGl0X3N0YWNrLnB1c2godHJlZSk7CiAgICAgICAgICAgICAgY291bnRfc3RhY2sucHVzaCgxKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChoaXRfc3RhY2subGVuZ3RoID4gMCAmJiB0cmVlLm5vZGVzLmxlbmd0aCA8IF9NaW5fV2lkdGgpIHsgLy8gVW5kZXJmbG93Li5BR0FJTiEKICAgICAgICAgICAgICByZXRfb2JqLm5vZGVzID0gX3NlYXJjaF9zdWJ0cmVlKHRyZWUsIHRydWUsIHJldF9vYmoubm9kZXMsIHRyZWUpOwogICAgICAgICAgICAgIHRyZWUubm9kZXMubGVuZ3RoID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgcmV0X29iai5ub2RlczsgLy8gSnVzdCBzdGFydCByZXNpemluZwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgeyAvLyB3ZSBhcmUganVzdCByZXNpemluZwogICAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUubWFrZV9NQlIodHJlZS5ub2RlcywgdHJlZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50X2RlcHRoIC09IDE7CiAgICAgICAgfSB3aGlsZSAoaGl0X3N0YWNrLmxlbmd0aCA+IDApOwoKICAgICAgICByZXR1cm4gKHJldF9hcnJheSk7CiAgICAgICAgfTsKCiAgIC8qIGNob29zZSB0aGUgYmVzdCBkYW1uIG5vZGUgZm9yIHJlY3RhbmdsZSB0byBiZSBpbnNlcnRlZCBpbnRvCiAgICAqIFsgbGVhZiBub2RlIHBhcmVudCBdID0gX2Nob29zZV9sZWFmX3N1YnRyZWUocmVjdGFuZ2xlLCByb290IHRvIHN0YXJ0IHNlYXJjaCBhdCkKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX2Nob29zZV9sZWFmX3N1YnRyZWUgPSBmdW5jdGlvbihyZWN0LCByb290KSB7CiAgICAgICAgdmFyIGJlc3RfY2hvaWNlX2luZGV4ID0gLTE7CiAgICAgICAgdmFyIGJlc3RfY2hvaWNlX3N0YWNrID0gW107CiAgICAgICAgdmFyIGJlc3RfY2hvaWNlX2FyZWE7CgogICAgICAgIHZhciBsb2FkX2NhbGxiYWNrID0gZnVuY3Rpb24obG9jYWxfdHJlZSwgbG9jYWxfbm9kZSkgewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgIGxvY2FsX3RyZWUuX2F0dGFjaF9kYXRhKGxvY2FsX25vZGUsIGRhdGEpOwogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIGJlc3RfY2hvaWNlX3N0YWNrLnB1c2gocm9vdCk7CiAgICAgICAgdmFyIG5vZGVzID0gcm9vdC5ub2RlczsKCiAgICAgICAgZG8gewogICAgICAgICAgaWYgKGJlc3RfY2hvaWNlX2luZGV4ICE9PSAtMSkgewogICAgICAgICAgICBiZXN0X2Nob2ljZV9zdGFjay5wdXNoKG5vZGVzW2Jlc3RfY2hvaWNlX2luZGV4XSk7CiAgICAgICAgICAgIG5vZGVzID0gbm9kZXNbYmVzdF9jaG9pY2VfaW5kZXhdLm5vZGVzOwogICAgICAgICAgICBiZXN0X2Nob2ljZV9pbmRleCA9IC0xOwogICAgICAgICAgfQoKICAgICAgICAgIGZvciAodmFyIGkgPSBub2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICB2YXIgbHRyZWUgPSBub2Rlc1tpXTsKICAgICAgICAgICAgaWYgKCJsZWFmIiBpbiBsdHJlZSkgewogICAgICAgICAgICAgIC8vIEJhaWwgb3V0IG9mIGV2ZXJ5dGhpbmcgYW5kIHN0YXJ0IGluc2VydGluZwogICAgICAgICAgICAgIGJlc3RfY2hvaWNlX2luZGV4ID0gLTE7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEFyZWEgb2YgbmV3IGVubGFyZ2VkIHJlY3RhbmdsZQogICAgICAgICAgICB2YXIgb2xkX2xyYXRpbyA9IFJUcmVlLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKGx0cmVlLncsIGx0cmVlLmgsIGx0cmVlLm5vZGVzLmxlbmd0aCArIDEpOwoKICAgICAgICAgICAgLy8gRW5sYXJnZSByZWN0YW5nbGUgdG8gZml0IG5ldyByZWN0YW5nbGUKICAgICAgICAgICAgdmFyIG53ID0gTWF0aC5tYXgobHRyZWUueCArIGx0cmVlLncsIHJlY3QueCArIHJlY3QudykgLSBNYXRoLm1pbihsdHJlZS54LCByZWN0LngpOwogICAgICAgICAgICB2YXIgbmggPSBNYXRoLm1heChsdHJlZS55ICsgbHRyZWUuaCwgcmVjdC55ICsgcmVjdC5oKSAtIE1hdGgubWluKGx0cmVlLnksIHJlY3QueSk7CgogICAgICAgICAgICAvLyBBcmVhIG9mIG5ldyBlbmxhcmdlZCByZWN0YW5nbGUKICAgICAgICAgICAgdmFyIGxyYXRpbyA9IFJUcmVlLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKG53LCBuaCwgbHRyZWUubm9kZXMubGVuZ3RoICsgMik7CgogICAgICAgICAgICBpZiAoYmVzdF9jaG9pY2VfaW5kZXggPCAwIHx8IE1hdGguYWJzKGxyYXRpbyAtIG9sZF9scmF0aW8pIDwgYmVzdF9jaG9pY2VfYXJlYSkgewogICAgICAgICAgICAgIGJlc3RfY2hvaWNlX2FyZWEgPSBNYXRoLmFicyhscmF0aW8gLSBvbGRfbHJhdGlvKTsKICAgICAgICAgICAgICBiZXN0X2Nob2ljZV9pbmRleCA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlIChiZXN0X2Nob2ljZV9pbmRleCAhPT0gLTEpOwoKICAgICAgICByZXR1cm4gKGJlc3RfY2hvaWNlX3N0YWNrKTsKICAgICAgICB9OwoKICAgLyogc3BsaXQgYSBzZXQgb2Ygbm9kZXMgaW50byB0d28gcm91Z2hseSBlcXVhbGx5LWZpbGxlZCBub2RlcwogICAgKiBbIGFuIGFycmF5IG9mIHR3byBuZXcgYXJyYXlzIG9mIG5vZGVzIF0gPSBsaW5lYXJfc3BsaXQoYXJyYXkgb2Ygbm9kZXMpCiAgICAqIEBwcml2YXRlCiAgICAqLwogICAgdmFyIF9saW5lYXJfc3BsaXQgPSBmdW5jdGlvbihub2RlcykgewogICAgICAgIHZhciBuID0gX3BpY2tfbGluZWFyKG5vZGVzKTsKICAgICAgICB3aGlsZSAobm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgX3BpY2tfbmV4dChub2RlcywgblswXSwgblsxXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAobik7CiAgICAgICAgfTsKCiAgIC8qIGluc2VydCB0aGUgYmVzdCBzb3VyY2UgcmVjdGFuZ2xlIGludG8gdGhlIGJlc3QgZml0dGluZyBwYXJlbnQgbm9kZTogYSBvciBiCiAgICAqIFtdID0gcGlja19uZXh0KGFycmF5IG9mIHNvdXJjZSBub2RlcywgdGFyZ2V0IG5vZGUgYXJyYXkgYSwgdGFyZ2V0IG5vZGUgYXJyYXkgYikKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX3BpY2tfbmV4dCA9IGZ1bmN0aW9uKG5vZGVzLCBhLCBiKSB7CiAgICAgICAgLy8gQXJlYSBvZiBuZXcgZW5sYXJnZWQgcmVjdGFuZ2xlCiAgICAgICAgdmFyIGFyZWFfYSA9IFJUcmVlLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKGEudywgYS5oLCBhLm5vZGVzLmxlbmd0aCArIDEpOwogICAgICAgIHZhciBhcmVhX2IgPSBSVHJlZS5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhiLncsIGIuaCwgYi5ub2Rlcy5sZW5ndGggKyAxKTsKICAgICAgICB2YXIgaGlnaF9hcmVhX2RlbHRhOwogICAgICAgIHZhciBoaWdoX2FyZWFfbm9kZTsKICAgICAgICB2YXIgbG93ZXN0X2dyb3d0aF9ncm91cDsKCiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgbCA9IG5vZGVzW2ldOwogICAgICAgICAgdmFyIG5ld19hcmVhX2EgPSB7fTsKICAgICAgICAgIG5ld19hcmVhX2EueCA9IE1hdGgubWluKGEueCwgbC54KTsKICAgICAgICAgIG5ld19hcmVhX2EueSA9IE1hdGgubWluKGEueSwgbC55KTsKICAgICAgICAgIG5ld19hcmVhX2EudyA9IE1hdGgubWF4KGEueCArIGEudywgbC54ICsgbC53KSAtIG5ld19hcmVhX2EueDsKICAgICAgICAgIG5ld19hcmVhX2EuaCA9IE1hdGgubWF4KGEueSArIGEuaCwgbC55ICsgbC5oKSAtIG5ld19hcmVhX2EueTsKICAgICAgICAgIHZhciBjaGFuZ2VfbmV3X2FyZWFfYSA9IE1hdGguYWJzKFJUcmVlLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKG5ld19hcmVhX2EudywgbmV3X2FyZWFfYS5oLCBhLm5vZGVzLmxlbmd0aCArIDIpIC0gYXJlYV9hKTsKCiAgICAgICAgICB2YXIgbmV3X2FyZWFfYiA9IHt9OwogICAgICAgICAgbmV3X2FyZWFfYi54ID0gTWF0aC5taW4oYi54LCBsLngpOwogICAgICAgICAgbmV3X2FyZWFfYi55ID0gTWF0aC5taW4oYi55LCBsLnkpOwogICAgICAgICAgbmV3X2FyZWFfYi53ID0gTWF0aC5tYXgoYi54ICsgYi53LCBsLnggKyBsLncpIC0gbmV3X2FyZWFfYi54OwogICAgICAgICAgbmV3X2FyZWFfYi5oID0gTWF0aC5tYXgoYi55ICsgYi5oLCBsLnkgKyBsLmgpIC0gbmV3X2FyZWFfYi55OwogICAgICAgICAgdmFyIGNoYW5nZV9uZXdfYXJlYV9iID0gTWF0aC5hYnMoUlRyZWUuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8obmV3X2FyZWFfYi53LCBuZXdfYXJlYV9iLmgsIGIubm9kZXMubGVuZ3RoICsgMikgLSBhcmVhX2IpOwoKICAgICAgICAgIGlmICghaGlnaF9hcmVhX25vZGUgfHwgIWhpZ2hfYXJlYV9kZWx0YSB8fCBNYXRoLmFicyhjaGFuZ2VfbmV3X2FyZWFfYiAtIGNoYW5nZV9uZXdfYXJlYV9hKSA8IGhpZ2hfYXJlYV9kZWx0YSkgewogICAgICAgICAgICBoaWdoX2FyZWFfbm9kZSA9IGk7CiAgICAgICAgICAgIGhpZ2hfYXJlYV9kZWx0YSA9IE1hdGguYWJzKGNoYW5nZV9uZXdfYXJlYV9iIC0gY2hhbmdlX25ld19hcmVhX2EpOwogICAgICAgICAgICBsb3dlc3RfZ3Jvd3RoX2dyb3VwID0gY2hhbmdlX25ld19hcmVhX2IgPCBjaGFuZ2VfbmV3X2FyZWFfYSA/IGIgOiBhOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgdGVtcF9ub2RlID0gbm9kZXMuc3BsaWNlKGhpZ2hfYXJlYV9ub2RlLCAxKVswXTsKICAgICAgICBpZiAoYS5ub2Rlcy5sZW5ndGggKyBub2Rlcy5sZW5ndGggKyAxIDw9IF9NaW5fV2lkdGgpIHsKICAgICAgICAgIGEubm9kZXMucHVzaCh0ZW1wX25vZGUpOwogICAgICAgICAgUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoYSwgdGVtcF9ub2RlKTsKICAgICAgICB9IGVsc2UgaWYgKGIubm9kZXMubGVuZ3RoICsgbm9kZXMubGVuZ3RoICsgMSA8PSBfTWluX1dpZHRoKSB7CiAgICAgICAgICBiLm5vZGVzLnB1c2godGVtcF9ub2RlKTsKICAgICAgICAgIFJUcmVlLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGIsIHRlbXBfbm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxvd2VzdF9ncm93dGhfZ3JvdXAubm9kZXMucHVzaCh0ZW1wX25vZGUpOwogICAgICAgICAgUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUobG93ZXN0X2dyb3d0aF9ncm91cCwgdGVtcF9ub2RlKTsKICAgICAgICB9CiAgICAgICAgfTsKCiAgIC8qIHBpY2sgdGhlICJiZXN0IiB0d28gc3RhcnRlciBub2RlcyB0byB1c2UgYXMgc2VlZHMgdXNpbmcgdGhlICJsaW5lYXIiIGNyaXRlcmlhCiAgICAqIFsgYW4gYXJyYXkgb2YgdHdvIG5ldyBhcnJheXMgb2Ygbm9kZXMgXSA9IHBpY2tfbGluZWFyKGFycmF5IG9mIHNvdXJjZSBub2RlcykKICAgICogQHByaXZhdGUKICAgICovCiAgICB2YXIgX3BpY2tfbGluZWFyID0gZnVuY3Rpb24obm9kZXMpIHsKICAgICAgICB2YXIgbG93ZXN0X2hpZ2hfeCA9IG5vZGVzLmxlbmd0aCAtIDE7CiAgICAgICAgdmFyIGhpZ2hlc3RfbG93X3ggPSAwOwogICAgICAgIHZhciBsb3dlc3RfaGlnaF95ID0gbm9kZXMubGVuZ3RoIC0gMTsKICAgICAgICB2YXIgaGlnaGVzdF9sb3dfeSA9IDA7CiAgICAgICAgdmFyIHQxLCB0MjsKCiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgbCA9IG5vZGVzW2ldOwogICAgICAgICAgaWYgKGwueCA+IG5vZGVzW2hpZ2hlc3RfbG93X3hdLngpIHsKICAgICAgICAgICAgaGlnaGVzdF9sb3dfeCA9IGk7CiAgICAgICAgICB9IGVsc2UgaWYgKGwueCArIGwudyA8IG5vZGVzW2xvd2VzdF9oaWdoX3hdLnggKyBub2Rlc1tsb3dlc3RfaGlnaF94XS53KSB7CiAgICAgICAgICAgIGxvd2VzdF9oaWdoX3ggPSBpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGwueSA+IG5vZGVzW2hpZ2hlc3RfbG93X3ldLnkpIHsKICAgICAgICAgICAgaGlnaGVzdF9sb3dfeSA9IGk7CiAgICAgICAgICB9IGVsc2UgaWYgKGwueSArIGwuaCA8IG5vZGVzW2xvd2VzdF9oaWdoX3ldLnkgKyBub2Rlc1tsb3dlc3RfaGlnaF95XS5oKSB7CiAgICAgICAgICAgIGxvd2VzdF9oaWdoX3kgPSBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgZHggPSBNYXRoLmFicygobm9kZXNbbG93ZXN0X2hpZ2hfeF0ueCArIG5vZGVzW2xvd2VzdF9oaWdoX3hdLncpIC0gbm9kZXNbaGlnaGVzdF9sb3dfeF0ueCk7CiAgICAgICAgdmFyIGR5ID0gTWF0aC5hYnMoKG5vZGVzW2xvd2VzdF9oaWdoX3ldLnkgKyBub2Rlc1tsb3dlc3RfaGlnaF95XS5oKSAtIG5vZGVzW2hpZ2hlc3RfbG93X3ldLnkpOwogICAgICAgIGlmIChkeCA+IGR5KSB7CiAgICAgICAgICBpZiAobG93ZXN0X2hpZ2hfeCA+IGhpZ2hlc3RfbG93X3gpIHsKICAgICAgICAgICAgdDEgPSBub2Rlcy5zcGxpY2UobG93ZXN0X2hpZ2hfeCwgMSlbMF07CiAgICAgICAgICAgIHQyID0gbm9kZXMuc3BsaWNlKGhpZ2hlc3RfbG93X3gsIDEpWzBdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdDIgPSBub2Rlcy5zcGxpY2UoaGlnaGVzdF9sb3dfeCwgMSlbMF07CiAgICAgICAgICAgIHQxID0gbm9kZXMuc3BsaWNlKGxvd2VzdF9oaWdoX3gsIDEpWzBdOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobG93ZXN0X2hpZ2hfeSA+IGhpZ2hlc3RfbG93X3kpIHsKICAgICAgICAgICAgdDEgPSBub2Rlcy5zcGxpY2UobG93ZXN0X2hpZ2hfeSwgMSlbMF07CiAgICAgICAgICAgIHQyID0gbm9kZXMuc3BsaWNlKGhpZ2hlc3RfbG93X3ksIDEpWzBdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdDIgPSBub2Rlcy5zcGxpY2UoaGlnaGVzdF9sb3dfeSwgMSlbMF07CiAgICAgICAgICAgIHQxID0gbm9kZXMuc3BsaWNlKGxvd2VzdF9oaWdoX3ksIDEpWzBdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gKFt7CiAgICAgICAgICB4OiB0MS54LAogICAgICAgICAgeTogdDEueSwKICAgICAgICAgIHc6IHQxLncsCiAgICAgICAgICBoOiB0MS5oLAogICAgICAgICAgbm9kZXM6IFt0MV0KICAgICAgICB9LCB7CiAgICAgICAgICB4OiB0Mi54LAogICAgICAgICAgeTogdDIueSwKICAgICAgICAgIHc6IHQyLncsCiAgICAgICAgICBoOiB0Mi5oLAogICAgICAgICAgbm9kZXM6IFt0Ml0KICAgICAgICB9XSk7CiAgICAgICAgfTsKCiAgICB2YXIgX2F0dGFjaF9kYXRhID0gZnVuY3Rpb24obm9kZSwgbW9yZV90cmVlKSB7CiAgICAgICAgbm9kZS5ub2RlcyA9IG1vcmVfdHJlZS5ub2RlczsKICAgICAgICBub2RlLnggPSBtb3JlX3RyZWUueDsKICAgICAgICBub2RlLnkgPSBtb3JlX3RyZWUueTsKICAgICAgICBub2RlLncgPSBtb3JlX3RyZWUudzsKICAgICAgICBub2RlLmggPSBtb3JlX3RyZWUuaDsKICAgICAgICByZXR1cm4gKG5vZGUpOwogICAgfTsKCiAgIC8qIG5vbi1yZWN1cnNpdmUgaW50ZXJuYWwgc2VhcmNoIGZ1bmN0aW9uCiAgICAqIFsgbm9kZXMgfCBvYmplY3RzIF0gPSBfc2VhcmNoX3N1YnRyZWUocmVjdGFuZ2xlLCBbcmV0dXJuIG5vZGUgZGF0YV0sIFthcnJheSB0byBmaWxsXSwgcm9vdCB0byBiZWdpbiBzZWFyY2ggYXQpCiAgICAqIEBwcml2YXRlCiAgICAqLwogICAgdmFyIF9zZWFyY2hfc3VidHJlZSA9IGZ1bmN0aW9uKHJlY3QsIHJldHVybl9ub2RlLCByZXR1cm5fYXJyYXksIHJvb3QpIHsKICAgICAgdmFyIGhpdF9zdGFjayA9IFtdOyAvLyBDb250YWlucyB0aGUgZWxlbWVudHMgdGhhdCBvdmVybGFwCiAgICAgIGlmICghUlRyZWUuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKHJlY3QsIHJvb3QpKSB7CiAgICAgICAgcmV0dXJuIHJldHVybl9hcnJheTsKICAgICAgfQoKICAgICAgdmFyIGxvYWRfY2FsbGJhY2sgPSBmdW5jdGlvbihsb2NhbF90cmVlLCBsb2NhbF9ub2RlKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICBsb2NhbF90cmVlLl9hdHRhY2hfZGF0YShsb2NhbF9ub2RlLCBkYXRhKTsKICAgICAgICAgIH07CiAgICAgIH07CgogICAgICBoaXRfc3RhY2sucHVzaChyb290Lm5vZGVzKTsKCiAgICAgIGRvIHsKICAgICAgICB2YXIgbm9kZXMgPSBoaXRfc3RhY2sucG9wKCk7CgogICAgICAgIGZvciAodmFyIGkgPSBub2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGx0cmVlID0gbm9kZXNbaV07CiAgICAgICAgICBpZiAoUlRyZWUuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKHJlY3QsIGx0cmVlKSkgewogICAgICAgICAgICBpZiAoIm5vZGVzIiBpbiBsdHJlZSkgeyAvLyBOb3QgYSBMZWFmCiAgICAgICAgICAgICAgaGl0X3N0YWNrLnB1c2gobHRyZWUubm9kZXMpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCJsZWFmIiBpbiBsdHJlZSkgeyAvLyBBIExlYWYgISEKICAgICAgICAgICAgICBpZiAoIXJldHVybl9ub2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm5fYXJyYXkucHVzaChsdHJlZS5sZWFmKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuX2FycmF5LnB1c2gobHRyZWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSB3aGlsZSAoaGl0X3N0YWNrLmxlbmd0aCA+IDApOwoKICAgICAgcmV0dXJuIHJldHVybl9hcnJheTsKICAgIH07CgogICAgdmFyIF9zZWFyY2hfc3VidHJlZV9yZXZlcnNlID0gZnVuY3Rpb24ocmVjdCwgcmV0dXJuX25vZGUsIHJldHVybl9hcnJheSwgcm9vdCkgewogICAgICB2YXIgaGl0X3N0YWNrID0gW107IC8vIENvbnRhaW5zIHRoZSBlbGVtZW50cyB0aGF0IG92ZXJsYXAKICAgICAgaWYgKCFSVHJlZS5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUocm9vdCwgcmVjdCkpIHsKICAgICAgICByZXR1cm4gcmV0dXJuX2FycmF5OwogICAgICB9CgogICAgICB2YXIgbG9hZF9jYWxsYmFjayA9IGZ1bmN0aW9uKGxvY2FsX3RyZWUsIGxvY2FsX25vZGUpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICAgIGxvY2FsX3RyZWUuX2F0dGFjaF9kYXRhKGxvY2FsX25vZGUsIGRhdGEpOwogICAgICAgICAgfTsKICAgICAgfTsKCiAgICAgIGhpdF9zdGFjay5wdXNoKHJvb3Qubm9kZXMpOwoKICAgICAgZG8gewogICAgICAgIHZhciBub2RlcyA9IGhpdF9zdGFjay5wb3AoKTsKCiAgICAgICAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgbHRyZWUgPSBub2Rlc1tpXTsKICAgICAgICAgIGlmIChSVHJlZS5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUobHRyZWUsIHJlY3QpKSB7CiAgICAgICAgICAgIGlmICgibm9kZXMiIGluIGx0cmVlKSB7IC8vIE5vdCBhIExlYWYKICAgICAgICAgICAgICBoaXRfc3RhY2sucHVzaChsdHJlZS5ub2Rlcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoImxlYWYiIGluIGx0cmVlKSB7IC8vIEEgTGVhZiAhIQogICAgICAgICAgICAgIGlmICghcmV0dXJuX25vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybl9hcnJheS5wdXNoKGx0cmVlLmxlYWYpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm5fYXJyYXkucHVzaChsdHJlZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IHdoaWxlIChoaXRfc3RhY2subGVuZ3RoID4gMCk7CgogICAgICByZXR1cm4gcmV0dXJuX2FycmF5OwogICAgfTsKCiAgIC8qIG5vbi1yZWN1cnNpdmUgaW50ZXJuYWwgaW5zZXJ0IGZ1bmN0aW9uCiAgICAqIFtdID0gX2luc2VydF9zdWJ0cmVlKHJlY3RhbmdsZSwgb2JqZWN0IHRvIGluc2VydCwgcm9vdCB0byBiZWdpbiBpbnNlcnRpb24gYXQpCiAgICAqIEBwcml2YXRlCiAgICAqLwogICAgdmFyIF9pbnNlcnRfc3VidHJlZSA9IGZ1bmN0aW9uKG5vZGUsIHJvb3QpIHsKICAgICAgdmFyIGJjOyAvLyBCZXN0IEN1cnJlbnQgbm9kZQogICAgICAvLyBJbml0aWFsIGluc2VydGlvbiBpcyBzcGVjaWFsIGJlY2F1c2Ugd2UgcmVzaXplIHRoZSBUcmVlIGFuZCB3ZSBkb24ndAogICAgICAvLyBjYXJlIGFib3V0IGFueSBvdmVyZmxvdyAoc2VyaW91c2x5LCBob3cgY2FuIHRoZSBmaXJzdCBvYmplY3Qgb3ZlcmZsb3c/KQogICAgICBpZiAocm9vdC5ub2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgICByb290LnggPSBub2RlLng7CiAgICAgICAgcm9vdC55ID0gbm9kZS55OwogICAgICAgIHJvb3QudyA9IG5vZGUudzsKICAgICAgICByb290LmggPSBub2RlLmg7CiAgICAgICAgcm9vdC5ub2Rlcy5wdXNoKG5vZGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgLy8gRmluZCB0aGUgYmVzdCBmaXR0aW5nIGxlYWYgbm9kZQogICAgICAvLyBjaG9vc2VfbGVhZiByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0cmVlIGxldmVscyAoaW5jbHVkaW5nIHJvb3QpCiAgICAgIC8vIHRoYXQgd2VyZSB0cmF2ZXJzZWQgd2hpbGUgdHJ5aW5nIHRvIGZpbmQgdGhlIGxlYWYKICAgICAgdmFyIHRyZWVfc3RhY2sgPSBfY2hvb3NlX2xlYWZfc3VidHJlZShub2RlLCByb290KTsKICAgICAgdmFyIHJldF9vYmogPSBub2RlOyAvL3t4OnJlY3QueCx5OnJlY3QueSx3OnJlY3QudyxoOnJlY3QuaCwgbGVhZjpvYmp9OwogICAgICAvLyBXYWxrIGJhY2sgdXAgdGhlIHRyZWUgcmVzaXppbmcgYW5kIGluc2VydGluZyBhcyBuZWVkZWQKICAgICAgZG8gewogICAgICAgIC8vaGFuZGxlIHRoZSBjYXNlIG9mIGFuIGVtcHR5IG5vZGUgKGZyb20gYSBzcGxpdCkKICAgICAgICBpZiAoYmMgJiYgIm5vZGVzIiBpbiBiYyAmJiBiYy5ub2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgIHZhciBwYmMgPSBiYzsgLy8gUGFzdCBiYwogICAgICAgICAgYmMgPSB0cmVlX3N0YWNrLnBvcCgpOwogICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBiYy5ub2Rlcy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICBpZiAoYmMubm9kZXNbdF0gPT09IHBiYyB8fCBiYy5ub2Rlc1t0XS5ub2Rlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICBiYy5ub2Rlcy5zcGxpY2UodCwgMSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgYmMgPSB0cmVlX3N0YWNrLnBvcCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlcmUgaXMgZGF0YSBhdHRhY2hlZCB0byB0aGlzIHJldF9vYmoKICAgICAgICBpZiAoImxlYWYiIGluIHJldF9vYmogfHwgIm5vZGVzIiBpbiByZXRfb2JqIHx8IGlzQXJyYXkocmV0X29iaikpIHsKICAgICAgICAgIC8vIERvIEluc2VydAogICAgICAgICAgaWYgKGlzQXJyYXkocmV0X29iaikpIHsKICAgICAgICAgICAgZm9yICh2YXIgYWkgPSAwOyBhaSA8IHJldF9vYmoubGVuZ3RoOyBhaSsrKSB7CiAgICAgICAgICAgICAgUlRyZWUuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoYmMsIHJldF9vYmpbYWldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiYy5ub2RlcyA9IGJjLm5vZGVzLmNvbmNhdChyZXRfb2JqKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFJUcmVlLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGJjLCByZXRfb2JqKTsKICAgICAgICAgICAgYmMubm9kZXMucHVzaChyZXRfb2JqKTsgLy8gRG8gSW5zZXJ0CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGJjLm5vZGVzLmxlbmd0aCA8PSBfTWF4X1dpZHRoKSB7IC8vIFN0YXJ0IFJlc2l6ZWluZyBVcCB0aGUgVHJlZQogICAgICAgICAgICByZXRfb2JqID0gewogICAgICAgICAgICAgIHg6IGJjLngsCiAgICAgICAgICAgICAgeTogYmMueSwKICAgICAgICAgICAgICB3OiBiYy53LAogICAgICAgICAgICAgIGg6IGJjLmgKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7IC8vIE90aGVyd2lzZSBTcGxpdCB0aGlzIE5vZGUKICAgICAgICAgICAgLy8gbGluZWFyX3NwbGl0KCkgcmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHR3byBuZXcgbm9kZXMKICAgICAgICAgICAgLy8gZm9ybWVkIGZyb20gdGhlIHNwbGl0IG9mIHRoZSBwcmV2aW91cyBub2RlJ3Mgb3ZlcmZsb3cKICAgICAgICAgICAgdmFyIGEgPSBfbGluZWFyX3NwbGl0KGJjLm5vZGVzKTsKICAgICAgICAgICAgcmV0X29iaiA9IGE7IC8vWzFdOwogICAgICAgICAgICBpZiAodHJlZV9zdGFjay5sZW5ndGggPCAxKSB7IC8vIElmIGFyZSBzcGxpdHRpbmcgdGhlIHJvb3QuLgogICAgICAgICAgICAgIGJjLm5vZGVzLnB1c2goYVswXSk7CiAgICAgICAgICAgICAgdHJlZV9zdGFjay5wdXNoKGJjKTsgLy8gUmVjb25zaWRlciB0aGUgcm9vdCBlbGVtZW50CiAgICAgICAgICAgICAgcmV0X29iaiA9IGFbMV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAvLyBPdGhlcndpc2UgRG8gUmVzaXplCiAgICAgICAgICAvL0p1c3Qga2VlcCBhcHBseWluZyB0aGUgbmV3IGJvdW5kaW5nIHJlY3RhbmdsZSB0byB0aGUgcGFyZW50cy4uCiAgICAgICAgICBSVHJlZS5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShiYywgcmV0X29iaik7CiAgICAgICAgICByZXRfb2JqID0gewogICAgICAgICAgICB4OiBiYy54LAogICAgICAgICAgICB5OiBiYy55LAogICAgICAgICAgICB3OiBiYy53LAogICAgICAgICAgICBoOiBiYy5oCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfSB3aGlsZSAodHJlZV9zdGFjay5sZW5ndGggPiAwKTsKICAgIH07CgogICAvKiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJlZQogICAgKiBAcHVibGljCiAgICAqLwogICAgdGhpcy5zZXJpYWxpemUgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICBjYWxsYmFjayhudWxsLCBfVCk7CiAgICB9OwoKICAgLyogYWNjZXB0cyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyZWUgYW5kIGluc2VydHMgaXQKICAgICogQHB1YmxpYwogICAgKi8KICAgIHRoaXMuZGVzZXJpYWxpemUgPSBmdW5jdGlvbihuZXdfdHJlZSwgd2hlcmUsIGNhbGxiYWNrKSB7CgogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CgogICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7CiAgICAgIGNhc2UgMToKICAgICAgICB3aGVyZSA9IF9UOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgaWYodHlwZW9mIGFyZ3NbMV0gPT09ICJmdW5jdGlvbiIpewogICAgICAgICAgd2hlcmUgPSBfVDsKICAgICAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHZhciBkZXNlcmlhbGl6ZWQgPSBfYXR0YWNoX2RhdGEod2hlcmUsIG5ld190cmVlKTsKCiAgICAgIGlmKGNhbGxiYWNrKXsKICAgICAgICBjYWxsYmFjayhudWxsLCBkZXNlcmlhbGl6ZWQpOwogICAgICB9CiAgICB9OwoKICAgLyogbm9uLXJlY3Vyc2l2ZSBzZWFyY2ggZnVuY3Rpb24KICAgICogWyBub2RlcyB8IG9iamVjdHMgXSA9IFJUcmVlLnNlYXJjaChyZWN0YW5nbGUsIFtyZXR1cm4gbm9kZSBkYXRhXSwgW2FycmF5IHRvIGZpbGxdKQogICAgKiBAcHVibGljCiAgICAqLwoKICAgIHRoaXMuc2VhcmNoID0gZnVuY3Rpb24oc2hhcGUsIGNhbGxiYWNrKSB7CiAgICAgIHZhciByZWN0OwogICAgICBpZihzaGFwZS50eXBlKXsKICAgICAgICB2YXIgYiA9IFRlcnJhZm9ybWVyLlRvb2xzLmNhbGN1bGF0ZUJvdW5kcyhzaGFwZSk7CiAgICAgICAgcmVjdCA9IHsKICAgICAgICAgIHg6IGJbMF0sCiAgICAgICAgICB5OiBiWzFdLAogICAgICAgICAgdzogTWF0aC5hYnMoYlswXSAtIGJbMl0pLAogICAgICAgICAgaDogTWF0aC5hYnMoYlsxXSAtIGJbM10pCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZWN0ID0gc2hhcGU7CiAgICAgIH0KCiAgICAgIHZhciBhcmdzID0gWyByZWN0LCBmYWxzZSwgWyBdLCBfVCBdOwoKICAgICAgaWYgKHJlY3QgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHRocm93ICJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiBSVC5TZWFyY2ggcmVxdWlyZXMgYXQgbGVhc3QgYSBib3VuZGluZyByZWN0YW5nbGUuIjsKICAgICAgfQoKICAgICAgdmFyIHJlc3VsdHMgPSBfc2VhcmNoX3N1YnRyZWUuYXBwbHkodGhpcywgYXJncyk7CgogICAgICBpZihjYWxsYmFjayl7CiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0cyk7CiAgICAgIH0KICAgIH07CgogICAgdGhpcy53aXRoaW4gPSBmdW5jdGlvbihzaGFwZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIHJlY3Q7CiAgICAgIGlmKHNoYXBlLnR5cGUpewogICAgICAgIHZhciBiID0gVGVycmFmb3JtZXIuVG9vbHMuY2FsY3VsYXRlQm91bmRzKHNoYXBlKTsKICAgICAgICByZWN0ID0gewogICAgICAgICAgeDogYlswXSwKICAgICAgICAgIHk6IGJbMV0sCiAgICAgICAgICB3OiBNYXRoLmFicyhiWzBdIC0gYlsyXSksCiAgICAgICAgICBoOiBNYXRoLmFicyhiWzFdIC0gYlszXSkKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHJlY3QgPSBzaGFwZTsKICAgICAgfQoKICAgICAgdmFyIGFyZ3MgPSBbIHJlY3QsIGZhbHNlLCBbIF0sIF9UIF07CgogICAgICBpZiAocmVjdCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdGhyb3cgIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMuIFJULlNlYXJjaCByZXF1aXJlcyBhdCBsZWFzdCBhIGJvdW5kaW5nIHJlY3RhbmdsZS4iOwogICAgICB9CgogICAgICB2YXIgc2VhcmNoID0gX3NlYXJjaF9zdWJ0cmVlX3JldmVyc2UuYXBwbHkodGhpcywgYXJncyk7CgogICAgICBpZihjYWxsYmFjayl7CiAgICAgICAgY2FsbGJhY2sobnVsbCwgc2VhcmNoKTsKICAgICAgfQogICAgfTsKCgogICAvKiBub24tcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgZGVsZXRlcyBhIHNwZWNpZmljCiAgICAqIFsgbnVtYmVyIF0gPSBSVHJlZS5yZW1vdmUocmVjdGFuZ2xlLCBvYmopCiAgICAqLwogICAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbihzaGFwZSwgb2JqLCBjYWxsYmFjaykgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CgogICAgICAvLyB5b3Ugb25seSBwYXNzZWQgc2hhcGUKICAgICAgaWYoYXJncy5sZW5ndGggPT09IDEpewogICAgICAgIC8vIHNvIG1ha2UgdGhlIGFyZ3MgKHNoYXBlLCBmYWxzZSkKICAgICAgICBhcmdzLnB1c2goZmFsc2UpOwogICAgICB9CgogICAgICAvLyB5b3UgcGFzc2VkIChzaGFwZSwgb2JqLCBjYWxsYmFjaykKICAgICAgLy8gcG9wIHRoZSBjYWxsYmFjayBvZmYgdGhlIGFyZ3MgbGlzdAogICAgICBpZihhcmdzLmxlbmd0aCA9PT0gMyl7CiAgICAgICAgY2FsbGJhY2sgPSBhcmdzLnBvcCgpOwogICAgICB9CgogICAgICAvLyBjb252ZXJ0IHNoYXBlICh0aGUgZmlyc3QgYXJnKSB0byBhIGJib3ggaWYgaXRzIGdlb2pzb24KICAgICAgaWYoYXJncyAmJiBhcmdzWzBdICYmIGFyZ3NbMF0udHlwZSl7CiAgICAgICAgdmFyIGIgPSBUZXJyYWZvcm1lci5Ub29scy5jYWxjdWxhdGVCb3VuZHMoYXJnc1swXSk7CiAgICAgICAgYXJnc1swXSA9IHsKICAgICAgICAgIHg6IGJbMF0sCiAgICAgICAgICB5OiBiWzFdLAogICAgICAgICAgdzogTWF0aC5hYnMoYlswXSAtIGJbMl0pLAogICAgICAgICAgaDogTWF0aC5hYnMoYlsxXSAtIGJbM10pCiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLy8gcHVzaCBhIG5ldyByb290IG5vZGUgb250byB0aGUgYXJncyBzdGFjawogICAgICBhcmdzLnB1c2goX1QpOwoKICAgICAgaWYob2JqID09PSBmYWxzZSkgeyAvLyBEbyBhcmVhLXdpZGUgZGVsZXRlCiAgICAgICAgdmFyIG51bWJlcmRlbGV0ZWQgPSAwOwogICAgICAgIHZhciByZXRfYXJyYXkgPSBbXTsKICAgICAgICBkbyB7CiAgICAgICAgICBudW1iZXJkZWxldGVkID0gcmV0X2FycmF5Lmxlbmd0aDsKICAgICAgICAgIHJldF9hcnJheSA9IHJldF9hcnJheS5jb25jYXQoX3JlbW92ZV9zdWJ0cmVlLmFwcGx5KHRoaXMsIGFyZ3MpKTsKICAgICAgICB9IHdoaWxlKCBudW1iZXJkZWxldGVkICE9PSAgcmV0X2FycmF5Lmxlbmd0aCk7CiAgICAgICAgaWYoY2FsbGJhY2spewogICAgICAgICAgY2FsbGJhY2sobnVsbCwgcmV0X2FycmF5KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7IC8vIERlbGV0ZSBhIHNwZWNpZmljIGl0ZW0KICAgICAgICB2YXIgcmVtb3ZhbCA9IF9yZW1vdmVfc3VidHJlZS5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICBpZihjYWxsYmFjayl7CiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZW1vdmFsKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAvKiBub24tcmVjdXJzaXZlIGluc2VydCBmdW5jdGlvbgogICAgKiBbXSA9IFJUcmVlLmluc2VydChyZWN0YW5nbGUsIG9iamVjdCB0byBpbnNlcnQpCiAgICAqLwogICAgdGhpcy5pbnNlcnQgPSBmdW5jdGlvbihzaGFwZSwgb2JqLCBjYWxsYmFjaykgewogICAgICB2YXIgcmVjdDsKICAgICAgaWYoc2hhcGUudHlwZSl7CiAgICAgICAgdmFyIGIgPSBUZXJyYWZvcm1lci5Ub29scy5jYWxjdWxhdGVCb3VuZHMoc2hhcGUpOwogICAgICAgIHJlY3QgPSB7CiAgICAgICAgICB4OiBiWzBdLAogICAgICAgICAgeTogYlsxXSwKICAgICAgICAgIHc6IE1hdGguYWJzKGJbMF0gLSBiWzJdKSwKICAgICAgICAgIGg6IE1hdGguYWJzKGJbMV0gLSBiWzNdKQogICAgICAgIH07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjdCA9IHNoYXBlOwogICAgICB9CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB0aHJvdyAiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4gUlQuSW5zZXJ0IHJlcXVpcmVzIGF0IGxlYXN0IGEgYm91bmRpbmcgcmVjdGFuZ2xlIG9yIEdlb0pTT04gYW5kIGFuIG9iamVjdC4iOwogICAgICB9CgogICAgICB2YXIgaW5zZXJ0ID0gX2luc2VydF9zdWJ0cmVlKHsKICAgICAgICB4OiByZWN0LngsCiAgICAgICAgeTogcmVjdC55LAogICAgICAgIHc6IHJlY3QudywKICAgICAgICBoOiByZWN0LmgsCiAgICAgICAgbGVhZjogb2JqCiAgICAgIH0sIF9UKTsKCiAgICAgIGlmKGNhbGxiYWNrKXsKICAgICAgICBjYWxsYmFjayhudWxsLCBpbnNlcnQpOwogICAgICB9CiAgICB9OwoKICAgLyogbm9uLXJlY3Vyc2l2ZSBkZWxldGUgZnVuY3Rpb24KICAgICogW2RlbGV0ZWQgb2JqZWN0XSA9IFJUcmVlLnJlbW92ZShyZWN0YW5nbGUsIFtvYmplY3QgdG8gZGVsZXRlXSkKICAgICovCgogICAgLy9FbmQgb2YgUlRyZWUKICB9OwoKLyogUmVjdGFuZ2xlIC0gR2VuZXJpYyByZWN0YW5nbGUgb2JqZWN0IC0gTm90IHlldCB1c2VkICovClJUcmVlLlJlY3RhbmdsZSA9IGZ1bmN0aW9uKGl4LCBpeSwgaXcsIGloKSB7IC8vIG5ldyBSZWN0YW5nbGUoYm91bmRzKSBvciBuZXcgUmVjdGFuZ2xlKHgsIHksIHcsIGgpCiAgdmFyIHgsIHgyLCB5LCB5MiwgdywgaDsKCiAgaWYgKGl4LngpIHsKICAgIHggPSBpeC54OwogICAgeSA9IGl4Lnk7CiAgICBpZiAoaXgudyAhPT0gMCAmJiAhaXgudyAmJiBpeC54MikgewogICAgICB3ID0gaXgueDIgLSBpeC54OwogICAgICBoID0gaXgueTIgLSBpeC55OwogICAgfSBlbHNlIHsKICAgICAgdyA9IGl4Lnc7CiAgICAgIGggPSBpeC5oOwogICAgfQogICAgeDIgPSB4ICsgdzsKICAgIHkyID0geSArIGg7IC8vIEZvciBleHRyYSBmYXN0aXR1ZGUKICB9IGVsc2UgewogICAgeCA9IGl4OwogICAgeSA9IGl5OwogICAgdyA9IGl3OwogICAgaCA9IGloOwogICAgeDIgPSB4ICsgdzsKICAgIHkyID0geSArIGg7IC8vIEZvciBleHRyYSBmYXN0aXR1ZGUKICB9CgogIHRoaXMueDEgPSB0aGlzLnggPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07CiAgdGhpcy55MSA9IHRoaXMueSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHk7CiAgfTsKICB0aGlzLngyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDI7CiAgfTsKICB0aGlzLnkyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geTI7CiAgfTsKICB0aGlzLncgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB3OwogIH07CiAgdGhpcy5oID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gaDsKICB9OwoKICB0aGlzLnRvSlNPTiA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuICgneyJ4IjonICsgeC50b1N0cmluZygpICsgJywgInkiOicgKyB5LnRvU3RyaW5nKCkgKyAnLCAidyI6JyArIHcudG9TdHJpbmcoKSArICcsICJoIjonICsgaC50b1N0cmluZygpICsgJ30nKTsKICB9OwoKICB0aGlzLm92ZXJsYXAgPSBmdW5jdGlvbihhKSB7CiAgICByZXR1cm4gKHRoaXMueCgpIDwgYS54MigpICYmIHRoaXMueDIoKSA+IGEueCgpICYmIHRoaXMueSgpIDwgYS55MigpICYmIHRoaXMueTIoKSA+IGEueSgpKTsKICB9OwoKICB0aGlzLmV4cGFuZCA9IGZ1bmN0aW9uKGEpIHsKICAgIHZhciBueCA9IE1hdGgubWluKHRoaXMueCgpLCBhLngoKSk7CiAgICB2YXIgbnkgPSBNYXRoLm1pbih0aGlzLnkoKSwgYS55KCkpOwogICAgdyA9IE1hdGgubWF4KHRoaXMueDIoKSwgYS54MigpKSAtIG54OwogICAgaCA9IE1hdGgubWF4KHRoaXMueTIoKSwgYS55MigpKSAtIG55OwogICAgeCA9IG54OwogICAgeSA9IG55OwogICAgcmV0dXJuICh0aGlzKTsKICB9OwoKICB0aGlzLnNldFJlY3QgPSBmdW5jdGlvbihpeCwgaXksIGl3LCBpaCkgewogICAgdmFyIHgsIHgyLCB5LCB5MiwgdywgaDsKICAgIGlmIChpeC54KSB7CiAgICAgIHggPSBpeC54OwogICAgICB5ID0gaXgueTsKICAgICAgaWYgKGl4LncgIT09IDAgJiYgIWl4LncgJiYgaXgueDIpIHsKICAgICAgICB3ID0gaXgueDIgLSBpeC54OwogICAgICAgIGggPSBpeC55MiAtIGl4Lnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdyA9IGl4Lnc7CiAgICAgICAgaCA9IGl4Lmg7CiAgICAgIH0KICAgICAgeDIgPSB4ICsgdzsKICAgICAgeTIgPSB5ICsgaDsgLy8gRm9yIGV4dHJhIGZhc3RpdHVkZQogICAgfSBlbHNlIHsKICAgICAgeCA9IGl4OwogICAgICB5ID0gaXk7CiAgICAgIHcgPSBpdzsKICAgICAgaCA9IGloOwogICAgICB4MiA9IHggKyB3OwogICAgICB5MiA9IHkgKyBoOyAvLyBGb3IgZXh0cmEgZmFzdGl0dWRlCiAgICB9CiAgfTsKICAvL0VuZCBvZiBSVHJlZS5SZWN0YW5nbGUKfTsKCi8qIHJldHVybnMgdHJ1ZSBpZiByZWN0YW5nbGUgMSBvdmVybGFwcyByZWN0YW5nbGUgMgogKiBbIGJvb2xlYW4gXSA9IG92ZXJsYXBfcmVjdGFuZ2xlKHJlY3RhbmdsZSBhLCByZWN0YW5nbGUgYikKICogQHN0YXRpYyBmdW5jdGlvbgogKi8KUlRyZWUuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlID0gZnVuY3Rpb24oYSwgYikgewogIHJldHVybiAoYS54IDwgKGIueCArIGIudykgJiYgKGEueCArIGEudykgPiBiLnggJiYgYS55IDwgKGIueSArIGIuaCkgJiYgKGEueSArIGEuaCkgPiBiLnkpOwp9OwoKLyogcmV0dXJucyB0cnVlIGlmIHJlY3RhbmdsZSBhIGlzIGNvbnRhaW5lZCBpbiByZWN0YW5nbGUgYgogKiBbIGJvb2xlYW4gXSA9IGNvbnRhaW5zX3JlY3RhbmdsZShyZWN0YW5nbGUgYSwgcmVjdGFuZ2xlIGIpCiAqIEBzdGF0aWMgZnVuY3Rpb24KICovClJUcmVlLlJlY3RhbmdsZS5jb250YWluc19yZWN0YW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuICgoYS54ICsgYS53KSA8PSAoYi54ICsgYi53KSAmJiBhLnggPj0gYi54ICYmIChhLnkgKyBhLmgpIDw9IChiLnkgKyBiLmgpICYmIGEueSA+PSBiLnkpOwp9OwoKLyogZXhwYW5kcyByZWN0YW5nbGUgQSB0byBpbmNsdWRlIHJlY3RhbmdsZSBCLCByZWN0YW5nbGUgQiBpcyB1bnRvdWNoZWQKICogWyByZWN0YW5nbGUgYSBdID0gZXhwYW5kX3JlY3RhbmdsZShyZWN0YW5nbGUgYSwgcmVjdGFuZ2xlIGIpCiAqIEBzdGF0aWMgZnVuY3Rpb24KICovClJUcmVlLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlID0gZnVuY3Rpb24oYSwgYikgewogIHZhciBueCwgbnk7CgogIC8vIHVuaW50dWl0aXZlbHksIHRoaXMgaXMgd2F5IHdheSBmYXN0ZXIgdGhhbiBtYXgvbWluCiAgaWYgKGEueCA8IGIueCkgewogICAgbnggPSBhLng7CiAgfSBlbHNlIHsKICAgIG54ID0gYi54OwogIH0KCiAgaWYgKGEueSA8IGIueSkgewogICAgbnkgPSBhLnk7CiAgfSBlbHNlIHsKICAgIG55ID0gYi55OwogIH0KCiAgaWYgKGEueCArIGEudyA+IGIueCArIGIudykgewogICAgYS53ID0gKGEueCArIGEudykgLSBueDsKICB9IGVsc2UgewogICAgYS53ID0gKGIueCArIGIudykgLSBueDsKICB9CgogIGlmIChhLnkgKyBhLmggPiBiLnkgKyBiLmgpIHsKICAgIGEuaCA9IChhLnkgKyBhLmgpIC0gbnk7CiAgfSBlbHNlIHsKICAgIGEuaCA9IChiLnkgKyBiLmgpIC0gbnk7CiAgfQoKICBhLnggPSBueDsKICBhLnkgPSBueTsKCiAgcmV0dXJuIChhKTsKfTsKCi8qIGdlbmVyYXRlcyBhIG1pbmltYWxseSBib3VuZGluZyByZWN0YW5nbGUgZm9yIGFsbCByZWN0YW5nbGVzIGluCiAqIGFycmF5ICJub2RlcyIuIElmIHJlY3QgaXMgc2V0LCBpdCBpcyBtb2RpZmllZCBpbnRvIHRoZSBNQlIuIE90aGVyd2lzZSwKICogYSBuZXcgcmVjdGFuZ2xlIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWQuCiAqIFsgcmVjdGFuZ2xlIGEgXSA9IG1ha2VfTUJSKHJlY3RhbmdsZSBhcnJheSBub2RlcywgcmVjdGFuZ2xlIHJlY3QpCiAqIEBzdGF0aWMgZnVuY3Rpb24KICovClJUcmVlLlJlY3RhbmdsZS5tYWtlX01CUiA9IGZ1bmN0aW9uKG5vZGVzLCByZWN0KSB7CiAgaWYgKG5vZGVzLmxlbmd0aCA8IDEpIHsKICAgIHJldHVybiAoewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB3OiAwLAogICAgICBoOiAwCiAgICB9KTsKICB9CiAgLy90aHJvdyAibWFrZV9NQlI6IG5vZGVzIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgcmVjdGFuZ2xlISI7CiAgaWYgKCFyZWN0KSB7CiAgICByZWN0ID0gewogICAgICB4OiBub2Rlc1swXS54LAogICAgICB5OiBub2Rlc1swXS55LAogICAgICB3OiBub2Rlc1swXS53LAogICAgICBoOiBub2Rlc1swXS5oCiAgICB9OwogIH0gZWxzZSB7CiAgICByZWN0LnggPSBub2Rlc1swXS54OwogICAgcmVjdC55ID0gbm9kZXNbMF0ueTsKICAgIHJlY3QudyA9IG5vZGVzWzBdLnc7CiAgICByZWN0LmggPSBub2Rlc1swXS5oOwogIH0KCiAgZm9yICh2YXIgaSA9IG5vZGVzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgIFJUcmVlLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKHJlY3QsIG5vZGVzW2ldKTsKICB9CgogIHJldHVybiAocmVjdCk7Cn07CgoKICBleHBvcnRzLlJUcmVlID0gUlRyZWU7CgogIHJldHVybiBleHBvcnRzOwp9KSk7Ci8qIGdsb2JhbHMgTCAqLwoKTC5lc3JpID0gewogIF9jYWxsYmFjazoge30KfTsKCi8vIE5hbWVzcGFjZSBmb3IgdmFyaW91cyBzdXBwb3J0IHZhcmlhYmxlcyB3ZSBuZWVkIHRvIHRyYWNrCkwuZXNyaS5TdXBwb3J0ID0gewogIC8vIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy9jb3JzLmpzI0wyMAogIENPUlM6ICEhKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSkKfTsKCi8vIEFKQVggaGFuZGxlcnMgZm9yIENPUlMgKG1vZGVybiBicm93c2Vycykgb3IgSlNPTlAgKG9sZGVyIGJyb3dzZXJzKQpMLmVzcmkuUmVxdWVzdEhhbmRsZXJzID0gewogIENPUlM6IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCl7CiAgICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCiAgICBwYXJhbXMuZj0ianNvbiI7CgogICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKICAgICAgdmFyIHJlc3BvbnNlOwogICAgICBpZiAoaHR0cFJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIHJlc3BvbnNlID0gewogICAgICAgICAgICBlcnJvcjogIkNvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiIKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmKGNvbnRleHQpewogICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXNwb25zZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgTC5lc3JpLlV0aWwuc2VyaWFsaXplKHBhcmFtcyksIHRydWUpOwogICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTsKICB9LAogIEpTT05QOiBmdW5jdGlvbih1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpewogICAgdmFyIGNhbGxiYWNrSWQgPSAiYyIrKE1hdGgucmFuZG9tKCkgKiAxZTkpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKCIuIiwgIl8iKTsKCiAgICBwYXJhbXMuZj0ianNvbiI7CiAgICBwYXJhbXMuY2FsbGJhY2s9IkwuZXNyaS5fY2FsbGJhY2suIitjYWxsYmFja0lkOwoKICAgIHZhciBzY3JpcHQgPSBMLkRvbVV0aWwuY3JlYXRlKCdzY3JpcHQnLCBudWxsLCBkb2N1bWVudC5ib2R5KTsKICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICBzY3JpcHQuc3JjID0gdXJsICsgTC5lc3JpLlV0aWwuc2VyaWFsaXplKHBhcmFtcyk7CiAgICBzY3JpcHQuaWQgPSBjYWxsYmFja0lkOwoKICAgIEwuZXNyaS5fY2FsbGJhY2tbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIGlmKGNvbnRleHQpewogICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVzcG9uc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgICAgfQogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcmlwdCk7CiAgICAgIGRlbGV0ZSBMLmVzcmkuX2NhbGxiYWNrW2NhbGxiYWNrSWRdOwogICAgfTsKCiAgfQp9OwoKLy8gQ2hvb3NlIHRoZSBjb3JyZWN0IEFKQVggaGFuZGxlciBkZXBlbmRpbmcgb24gQ09SUyBzdXBwb3J0CkwuZXNyaS5nZXQgPSAoTC5lc3JpLlN1cHBvcnQuQ09SUykgPyBMLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkNPUlMgOiBMLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkpTT05QOwoKLy8gR2VuZXJhbCB1dGlsaXR5IG5hbWVzcGFjZQpMLmVzcmkuVXRpbCA9IHsKICAvLyBtYWtlIGl0IHNvIHRoYXQgcGFzc2VkIGBmdW5jdGlvbmAgbmV2ZXIgZ2V0cyBjYWxsZWQKICAvLyB0d2ljZSB3aXRoaW4gYGRlbGF5YCBtaWxsaXNlY29uZHMuIFVzZWQgdG8gdGhyb3R0bGUKICAvLyBgbW92ZWAgZXZlbnRzIG9uIHRoZSBsYXllci4KICAvLyBodHRwOi8vcmVteXNoYXJwLmNvbS8yMDEwLzA3LzIxL3Rocm90dGxpbmctZnVuY3Rpb24tY2FsbHMvCiAgZGVib3VuY2U6IGZ1bmN0aW9uIChmbiwgZGVsYXksIGNvbnRleHQpIHsKICAgIHZhciB0aW1lciA9IG51bGw7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb250ZXh0ID0gdGhpc3x8Y29udGV4dCwgYXJncyA9IGFyZ3VtZW50czsKICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgfSwgZGVsYXkpOwogICAgfTsKICB9LAogIC8vIHJvdW5kIGEgbnVtYmVyIGF3YXkgZnJvbSB6ZXJvIHVzZWQgdG8gc25hcAogIC8vIHJvdy9jb2x1bW5zIGF3YXkgZnJvbSB0aGUgb3JpZ2luIG9mIHRoZSBncmlkCiAgcm91bmRBd2F5RnJvbVplcm86IGZ1bmN0aW9uIChudW0pewogICAgcmV0dXJuIChudW0gPiAwKSA/IE1hdGguY2VpbChudW0pIDogTWF0aC5mbG9vcihudW0pOwogIH0sCiAgdHJpbTogZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cc1xzKi8sICcnKS5yZXBsYWNlKC9cc1xzKiQvLCAnJyk7CiAgfSwKICBjbGVhblVybDogZnVuY3Rpb24odXJsKXsKICAgIHVybCA9IEwuZXNyaS5VdGlsLnRyaW0odXJsKTsKCiAgICAvL2FkZCBhIHRyYWlsaW5nIHNsYXNoIHRvIHRoZSB1cmwgaWYgdGhlIHVzZXIgb21pdHRlZCBpdAogICAgaWYodXJsW3VybC5sZW5ndGgtMV0gIT09ICIvIil7CiAgICAgIHVybCArPSAiLyI7CiAgICB9CgogICAgcmV0dXJuIHVybDsKICB9LAogIC8vIHF1aWNrIGFuZCBkaXJ0eSBzZXJpYWxpemF0aW9uCiAgc2VyaWFsaXplOiBmdW5jdGlvbihwYXJhbXMpewogICAgdmFyIHFzPSI/IjsKCiAgICBmb3IodmFyIHBhcmFtIGluIHBhcmFtcyl7CiAgICAgIGlmKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpewogICAgICAgIHZhciBrZXkgPSBwYXJhbTsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbXNbcGFyYW1dOwogICAgICAgIHFzKz1lbmNvZGVVUklDb21wb25lbnQoa2V5KTsKICAgICAgICBxcys9Ij0iOwogICAgICAgIHFzKz1lbmNvZGVVUklDb21wb25lbnQodmFsdWUpOwogICAgICAgIHFzKz0iJiI7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcXMuc3Vic3RyaW5nKDAsIHFzLmxlbmd0aCAtIDEpOwogIH0sCgogIC8vIGluZGV4IG9mIHBvbHlmaWxsLCBuZWVkZWQgZm9yIElFIDgKICBpbmRleE9mOiBmdW5jdGlvbihhcnIsIG9iaiwgc3RhcnQpewogICAgc3RhcnQgPSBzdGFydCB8fCAwOwogICAgaWYoYXJyLmluZGV4T2YpewogICAgICByZXR1cm4gYXJyLmluZGV4T2Yob2JqLCBzdGFydCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBhcnIubGVuZ3RoOyBpIDwgajsgaSsrKSB7CiAgICAgIGlmIChhcnJbaV0gPT09IG9iaikgeyByZXR1cm4gaTsgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0sCgogIC8vIGNvbnZlcnQgYW4gZXh0ZW50IChBcmNHSVMpIHRvIExhdExuZ0JvdW5kcyAoTGVhZmxldCkKICBleHRlbnRUb0JvdW5kczogZnVuY3Rpb24oZXh0ZW50KXsKICAgIHZhciBzb3V0aFdlc3QgPSBuZXcgTC5MYXRMbmcoZXh0ZW50LnltaW4sIGV4dGVudC54bWluKTsKICAgIHZhciBub3J0aEVhc3QgPSBuZXcgTC5MYXRMbmcoZXh0ZW50LnltYXgsIGV4dGVudC54bWF4KTsKICAgIHJldHVybiBuZXcgTC5MYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogIH0sCgogIC8vIGNvbnZlcnQgYW4gTGF0TG5nQm91bmRzIChMZWFmbGV0KSB0byBleHRlbnQgKEFyY0dJUykKICBib3VuZHNUb0V4dGVudDogZnVuY3Rpb24oYm91bmRzKSB7CiAgICByZXR1cm4gewogICAgICAieG1pbiI6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsCiAgICAgICJ5bWluIjogYm91bmRzLmdldFNvdXRoV2VzdCgpLmxhdCwKICAgICAgInhtYXgiOiBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkubG5nLAogICAgICAieW1heCI6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsCiAgICAgICJzcGF0aWFsUmVmZXJlbmNlIjogewogICAgICAgICJ3a2lkIiA6IDQzMjYKICAgICAgfQogICAgfTsKICB9LAoKICAvLyBjb252ZXJ0IGEgTGF0TG5nQm91bmRzIChMZWFmbGV0KSB0byBhIEVudmVsb3BlIChUZXJyYWZvcm1lci5SdHJlZSkKICBib3VuZHNUb0VudmVsb3BlOiBmdW5jdGlvbihib3VuZHMpewogICAgdmFyIGV4dGVudCA9IEwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGJvdW5kcyk7CiAgICByZXR1cm4gewogICAgICB4OiBleHRlbnQueG1pbiwKICAgICAgeTogZXh0ZW50LnltaW4sCiAgICAgIHc6IE1hdGguYWJzKGV4dGVudC54bWluIC0gZXh0ZW50LnhtYXgpLAogICAgICBoOiBNYXRoLmFicyhleHRlbnQueW1pbiAtIGV4dGVudC55bWF4KQogICAgfTsKICB9Cn07CgpMLmVzcmkuTWl4aW5zID0ge307CgpMLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkID0gewogIF9hY3RpdmVSZXF1ZXN0czogMCwKICBfaW5pdGlhbGl6ZUZlYXR1cmVHcmlkOiBmdW5jdGlvbihtYXApewogICAgdGhpcy5fbWFwID0gbWFwOwogICAgdGhpcy5fcHJldmlvdXNDZWxscyA9IFtdOwogICAgdGhpcy5jZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7CiAgICB0aGlzLm9yaWdpbiA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuY2VudGVyKTsKCiAgICB0aGlzLl9tb3ZlSGFuZGxlciA9IEwuZXNyaS5VdGlsLmRlYm91bmNlKGZ1bmN0aW9uKGUpewogICAgICBpZihlLnR5cGUgPT09ICJ6b29tZW5kIil7CiAgICAgICAgdGhpcy5vcmlnaW4gPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlcik7CiAgICAgICAgdGhpcy5fcHJldmlvdXNDZWxscyA9IFtdOwogICAgICB9CiAgICAgIHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7CiAgICB9LCB0aGlzLm9wdGlvbnMuZGVib3VuY2UsIHRoaXMpOwoKICAgIG1hcC5vbigiem9vbWVuZCByZXNpemUgbW92ZSIsIHRoaXMuX21vdmVIYW5kbGVyLCB0aGlzKTsKCiAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMobWFwLmdldEJvdW5kcygpKTsKICB9LAogIF9kZXN0cm95RmVhdHVyZUdyaWQ6IGZ1bmN0aW9uKG1hcCl7CiAgICBtYXAub2ZmKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlIiwgdGhpcy5fbW92ZUhhbmRsZXIsIHRoaXMpOwogIH0sCiAgX3JlcXVlc3RGZWF0dXJlczogZnVuY3Rpb24oYm91bmRzKXsKICAgIHZhciBjZWxscyA9IHRoaXMuX2NlbGxzV2l0aGluKGJvdW5kcyk7CiAgICBpZihjZWxscyAmJiBjZWxscy5sZW5ndGggPiAwKSB7CiAgICAgIHRoaXMuZmlyZSgibG9hZGluZyIsIHsKICAgICAgICBib3VuZHM6IGJvdW5kcwogICAgICB9KTsKICAgIH0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHsKICAgICAgdGhpcy5fbWFrZVJlcXVlc3QoY2VsbHNbaV0sIGNlbGxzLCBib3VuZHMpOwogICAgfQogIH0sCiAgX21ha2VSZXF1ZXN0OiBmdW5jdGlvbihjZWxsLCBjZWxscywgYm91bmRzKXsKICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzKys7CgogICAgdmFyIHJlcXVlc3RPcHRpb25zID0gewogICAgICBnZW9tZXRyeVR5cGU6ICJlc3JpR2VvbWV0cnlFbnZlbG9wZSIsCiAgICAgIGdlb21ldHJ5OiBKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChjZWxsLmJvdW5kcykpLAogICAgICBvdXRGaWVsZHM6IioiLAogICAgICBvdXRTUjogNDMyNiwKICAgICAgaW5TUjogNDMyNgogICAgfTsKCiAgICBpZih0aGlzLm9wdGlvbnMudG9rZW4pewogICAgICByZXF1ZXN0T3B0aW9ucy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjsKICAgIH0KCiAgICBpZih0aGlzLm9wdGlvbnMud2hlcmUpewogICAgICByZXF1ZXN0T3B0aW9ucy53aGVyZSA9IHRoaXMub3B0aW9ucy53aGVyZTsKICAgIH0gICAgCgogICAgTC5lc3JpLmdldCh0aGlzLnVybCsicXVlcnkiLCByZXF1ZXN0T3B0aW9ucywgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAvL2RlaW5jcmltZW50IHRoZSByZXF1ZXN0IGNvdW50ZXIKICAgICAgdGhpcy5fYWN0aXZlUmVxdWVzdHMtLTsKCiAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGFjdGl2ZSByZXF1ZXN0cyBmaXJlIGEgbG9hZCBldmVudCBmb3IgdGhpcyB2aWV3CiAgICAgIGlmKHRoaXMuX2FjdGl2ZVJlcXVlc3RzIDw9IDApewogICAgICAgIHRoaXMuZmlyZSgibG9hZCIsIHsKICAgICAgICAgIGJvdW5kczogYm91bmRzCiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgaW52YWxpZCB0b2tlbiBlcnJvci4uLgogICAgICBpZihyZXNwb25zZS5lcnJvciAmJiAocmVzcG9uc2UuZXJyb3IuY29kZSA9PT0gNDk5IHx8IHJlc3BvbnNlLmVycm9yLmNvZGUgPT09IDQ5OCkpIHsKCiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbHJlYWR5IGFza2VkIGZvciBhdXRoZW50aWNhdGlvbgogICAgICAgIGlmKCF0aGlzLl9hdXRoZW50aWNhdGluZyl7CgogICAgICAgICAgLy8gYXNrIGZvciBhdXRoZW50aWNhdGlvbgogICAgICAgICAgdGhpcy5fYXV0aGVudGljYXRpbmcgPSB0cnVlOwoKICAgICAgICAgIC8vIGFzayBmb3IgYXV0aGVudGljYXRpb24uIGRldmVsb3BlciBzaG91bGQgZmlyZSB0aGUgcmV0cnkoKSBtZXRob2Qgd2l0aCB0aGUgbmV3IHRva2VuCiAgICAgICAgICB0aGlzLmZpcmUoJ2F1dGhlbnRpY2F0aW9ucmVxdWlyZWQnLCB7CiAgICAgICAgICAgIHJldHJ5OiBMLlV0aWwuYmluZChmdW5jdGlvbih0b2tlbil7CiAgICAgICAgICAgICAgLy8gd2UgYXJlIG5vIGxvbmdlciBhdXRoZW50aWNhdGluZwogICAgICAgICAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW5nID0gZmFsc2U7CgogICAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IHRva2VuCiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuID0gdG9rZW47CgogICAgICAgICAgICAgIC8vIGNsZWFyIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBjZWxscywgc2luY2UgdGhleSBmYWlsZWQgdG8gbG9hZCBzdWNjZXNzZnVsbHkKICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0NlbGxzID0gW107CgogICAgICAgICAgICAgIC8vIHJlcXVlc3QgdGhlIGZlYXR1cmVzIGluIHRoZSBjdXJyZW50IG1hcCB2aWV3IGFnYWluCiAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEZlYXR1cmVzKHRoaXMuX21hcC5nZXRCb3VuZHMoKSk7CiAgICAgICAgICAgIH0sIHRoaXMpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gY2FsbCB0aGUgcmVuZGVyIG1ldGhvZCB0byByZW5kZXIgZmVhdHVyZXMKICAgICAgICB0aGlzLl9yZW5kZXIocmVzcG9uc2UpOwogICAgICB9CiAgICB9LCB0aGlzKTsKICB9LAogIF9jZWxsc1dpdGhpbjogZnVuY3Rpb24obWFwQm91bmRzKXsKICAgIHZhciBzaXplID0gdGhpcy5fbWFwLmdldFNpemUoKTsKICAgIHZhciBvZmZzZXQgPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLl9tYXAuZ2V0Q2VudGVyKCkpOwogICAgdmFyIHBhZGRpbmcgPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMuY2VsbFNpemUvc2l6ZS54LCB0aGlzLm9wdGlvbnMuY2VsbFNpemUvc2l6ZS55KTsKICAgIHZhciBib3VuZHMgPSBtYXBCb3VuZHMucGFkKDAuMSk7CiAgICB2YXIgY2VsbHMgPSBbXTsKCiAgICB2YXIgdG9wTGVmdFBvaW50ID0gdGhpcy5fbWFwLnByb2plY3QoYm91bmRzLmdldE5vcnRoV2VzdCgpKTsKICAgIHZhciBib3R0b21SaWdodFBvaW50ID0gdGhpcy5fbWFwLnByb2plY3QoYm91bmRzLmdldFNvdXRoRWFzdCgpKTsKCiAgICB2YXIgdG9wTGVmdCA9IHRvcExlZnRQb2ludC5zdWJ0cmFjdChvZmZzZXQpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CiAgICB2YXIgYm90dG9tUmlnaHQgPSBib3R0b21SaWdodFBvaW50LnN1YnRyYWN0KG9mZnNldCkuZGl2aWRlQnkodGhpcy5vcHRpb25zLmNlbGxTaXplKTsKCiAgICB2YXIgb2Zmc2V0Um93cyA9IE1hdGgucm91bmQoKHRoaXMub3JpZ2luLnggLSBvZmZzZXQueCkgLyB0aGlzLm9wdGlvbnMuY2VsbFNpemUpOwogICAgdmFyIG9mZnNldENvbHMgPSBNYXRoLnJvdW5kKCh0aGlzLm9yaWdpbi55IC0gb2Zmc2V0LnkpIC8gdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKCiAgICB2YXIgbWluUm93ID0gTC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8odG9wTGVmdC54KS1vZmZzZXRSb3dzOwogICAgdmFyIG1heFJvdyA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKGJvdHRvbVJpZ2h0LngpLW9mZnNldFJvd3M7CiAgICB2YXIgbWluQ29sID0gTC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8odG9wTGVmdC55KS1vZmZzZXRDb2xzOwogICAgdmFyIG1heENvbCA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKGJvdHRvbVJpZ2h0LnkpLW9mZnNldENvbHM7CgogICAgZm9yICh2YXIgcm93ID0gbWluUm93OyByb3cgPCBtYXhSb3c7IHJvdysrKSB7CiAgICAgIGZvciAodmFyIGNvbCA9IG1pbkNvbDsgY29sIDwgbWF4Q29sOyBjb2wrKykgewogICAgICAgIHZhciBjZWxsSWQgPSAiY2VsbDoiK3JvdysiOiIrY29sOwogICAgICAgIHZhciBkdXBsaWNhdGUgPSBMLmVzcmkuVXRpbC5pbmRleE9mKHRoaXMuX3ByZXZpb3VzQ2VsbHMsIGNlbGxJZCkgPj0gMDsKCiAgICAgICAgaWYoIWR1cGxpY2F0ZSB8fCAhdGhpcy5vcHRpb25zLmRlZHVwbGljYXRlKXsKICAgICAgICAgIHZhciBjZWxsQm91bmRzID0gdGhpcy5fY2VsbEV4dGVudChyb3csIGNvbCk7CiAgICAgICAgICB2YXIgY2VsbENlbnRlciA9IGNlbGxCb3VuZHMuZ2V0Q2VudGVyKCk7CiAgICAgICAgICB2YXIgcmFkaXVzID0gY2VsbENlbnRlci5kaXN0YW5jZVRvKGNlbGxCb3VuZHMuZ2V0Tm9ydGhXZXN0KCkpOwogICAgICAgICAgdmFyIGRpc3RhbmNlID0gY2VsbENlbnRlci5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKTsKICAgICAgICAgIHZhciBjZWxsID0gewogICAgICAgICAgICByb3c6IHJvdywKICAgICAgICAgICAgY29sOiBjb2wsCiAgICAgICAgICAgIGlkOiBjZWxsSWQsCiAgICAgICAgICAgIGNlbnRlcjogY2VsbENlbnRlciwKICAgICAgICAgICAgYm91bmRzOiBjZWxsQm91bmRzLAogICAgICAgICAgICBkaXN0YW5jZTpkaXN0YW5jZSwKICAgICAgICAgICAgcmFkaXVzOiByYWRpdXMKICAgICAgICAgIH07CiAgICAgICAgICBjZWxscy5wdXNoKGNlbGwpOwogICAgICAgICAgdGhpcy5fcHJldmlvdXNDZWxscy5wdXNoKGNlbGxJZCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY2VsbHMuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICByZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7CiAgICB9KTsKCiAgICByZXR1cm4gY2VsbHM7CiAgfSwKICBfY2VsbEV4dGVudDogZnVuY3Rpb24ocm93LCBjb2wpewogICAgdmFyIHN3UG9pbnQgPSB0aGlzLl9jZWxsUG9pbnQocm93LCBjb2wpOwogICAgdmFyIG5lUG9pbnQgPSB0aGlzLl9jZWxsUG9pbnQocm93KzEsIGNvbCsxKTsKICAgIHZhciBzdyA9IHRoaXMuX21hcC51bnByb2plY3Qoc3dQb2ludCk7CiAgICB2YXIgbmUgPSB0aGlzLl9tYXAudW5wcm9qZWN0KG5lUG9pbnQpOwogICAgcmV0dXJuIEwubGF0TG5nQm91bmRzKHN3LCBuZSk7CiAgfSwKICBfY2VsbFBvaW50OmZ1bmN0aW9uKHJvdywgY29sKXsKICAgIHZhciB4ID0gdGhpcy5vcmlnaW4ueCArIChyb3cqdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKICAgIHZhciB5ID0gdGhpcy5vcmlnaW4ueSArIChjb2wqdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKICAgIHJldHVybiBbeCwgeV07CiAgfQp9OwoKTC5lc3JpLk1peGlucy5pZGVudGlmaWFibGVMYXllciA9IHsKICBpZGVudGlmeTpmdW5jdGlvbihsYXRMbmcsIG9wdGlvbnMsIGNhbGxiYWNrKXsKICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgc3I6ICc0MzI2JywKICAgICAgbWFwRXh0ZW50OiBKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudCh0aGlzLl9tYXAuZ2V0Qm91bmRzKCkpKSwKICAgICAgdG9sZXJhbmNlOiA1LAogICAgICBnZW9tZXRyeVR5cGU6ICdlc3JpR2VvbWV0cnlQb2ludCcsCiAgICAgIGltYWdlRGlzcGxheTogdGhpcy5fbWFwLl9zaXplLnggKyAnLCcgKyB0aGlzLl9tYXAuX3NpemUueSArICcsOTYnLAogICAgICBnZW9tZXRyeTogSlNPTi5zdHJpbmdpZnkoewogICAgICAgIHg6IGxhdExuZy5sbmcsCiAgICAgICAgeTogbGF0TG5nLmxhdCwKICAgICAgICBzcGF0aWFsUmVmZXJlbmNlOiB7CiAgICAgICAgICB3a2lkOiA0MzI2CiAgICAgICAgfQogICAgICB9KQogICAgfTsKCiAgICBpZih0aGlzLm9wdGlvbnMubGF5ZXJzKSB7CiAgICAgIGRlZmF1bHRzLmxheWVycyA9IHRoaXMub3B0aW9ucy5sYXllcnM7CiAgICB9CgogICAgdmFyIHBhcmFtczsKCiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNhbGxiYWNrID09PSAndW5kZWZpbmVkJykgewogICAgICBjYWxsYmFjayA9IG9wdGlvbnM7CiAgICAgIHBhcmFtcyA9IGRlZmF1bHRzOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHsKICAgICAgaWYgKG9wdGlvbnMubGF5ZXJEZWZzKSB7CiAgICAgICAgb3B0aW9ucy5sYXllckRlZnMgPSB0aGlzLnBhcnNlTGF5ZXJEZWZzKG9wdGlvbnMubGF5ZXJEZWZzKTsKICAgICAgfQoKICAgICAgcGFyYW1zID0gTC5VdGlsLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAgICB9CgogICAgTC5lc3JpLmdldCh0aGlzLnNlcnZpY2VVcmwgKyAnL2lkZW50aWZ5JywgcGFyYW1zLCBjYWxsYmFjayk7CiAgfSwKICBwYXJzZUxheWVyRGVmczogZnVuY3Rpb24gKGxheWVyRGVmcykgewogICAgaWYgKGxheWVyRGVmcyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgIC8vdGhyb3cgJ211c3QgYmUgb2JqZWN0IG9yIHN0cmluZyc7CiAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBpZiAodHlwZW9mIGxheWVyRGVmcyA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGxheWVyRGVmcyk7CiAgICB9CgogICAgcmV0dXJuIGxheWVyRGVmczsKICB9Cn07CgooZnVuY3Rpb24oTCl7CgogIHZhciB0aWxlUHJvdG9jb2wgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiaHR0cHM6IikgPyAiaHR0cDoiIDogImh0dHBzOiI7CiAgdmFyIGF0dHJpYnV0aW9uU3R5bGVzID0gImxpbmUtaGVpZ2h0OjlweDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsgd2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjsgZGlzcGxheTppbmxpbmUtYmxvY2s7IjsKICB2YXIgbG9nb1N0eWxlcyA9ICJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zOHB4OyByaWdodDoycHg7IjsKICB2YXIgYXR0cmlidXRpb25Mb2dvID0gIjxpbWcgc3JjPSdodHRwczovL3NlcnZlcmFwaS5hcmNnaXNvbmxpbmUuY29tL2pzYXBpL2FyY2dpcy8zLjUvanMvZXNyaS9pbWFnZXMvbWFwL2xvZ28tbWVkLnBuZycgYWx0PSdQb3dlcmVkIGJ5IEVzcmknIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9uLWxvZ28nIHN0eWxlPSciK2xvZ29TdHlsZXMrIic+IjsKICB2YXIgZm9ybWF0VGV4dEF0dHJpYnV0aW9ucyA9IGZ1bmN0aW9uIGZvcm1hdFRleHRBdHRyaWJ1dGlvbnModGV4dCl7CiAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9ucycgc3R5bGU9JyIrYXR0cmlidXRpb25TdHlsZXMrIic+IiArIHRleHQgKyAiPC9zcGFuPiI7CiAgfTsKCiAgTC5lc3JpLkJhc2VtYXBMYXllciA9IEwuVGlsZUxheWVyLmV4dGVuZCh7CiAgICBzdGF0aWNzOiB7CiAgICAgIFRJTEVTOiB7CiAgICAgICAgU3RyZWV0czogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1N0cmVldF9NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLAogICAgICAgICAgYXR0cmlidXRpb25Vcmw6ICJodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1N0cmVldF9NYXAiLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmkiKSArIGF0dHJpYnV0aW9uTG9nbwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgVG9wb2dyYXBoaWM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9Ub3BvX01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsCiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogImh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfVG9wb19NYXAiLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmkiKSArIGF0dHJpYnV0aW9uTG9nbwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgT2NlYW5zOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvT2NlYW5fQmFzZW1hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsCiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogImh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcCIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBOYXRpb25hbEdlb2dyYXBoaWM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiAiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9IiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTYsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFc3JpIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIERhcmtHcmF5OiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8vdGlsZXN7c30uYXJjZ2lzLmNvbS90aWxlcy9QM2VQTE1ZczJSVkNoa0p4L2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkX0RhcmtfR3JheV9CYXNlX0JldGEvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxMCwKICAgICAgICAgICAgc3ViZG9tYWluczogWzEsIDJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSwgRGVMb3JtZSwgSEVSRSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBEYXJrR3JheUxhYmVsczogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3RpbGVze3N9LmFyY2dpcy5jb20vdGlsZXMvUDNlUExNWXMyUlZDaGtKeC9hcmNnaXMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9EYXJrX0dyYXlfUmVmZXJlbmNlX0JldGEvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxMCwKICAgICAgICAgICAgc3ViZG9tYWluczogWzEsIDJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBHcmF5OiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSwgTkFWVEVRLCBEZUxvcm1lIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIEdyYXlMYWJlbHM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxNiwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgSW1hZ2VyeTogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX0ltYWdlcnkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5TGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5VHJhbnNwb3J0YXRpb246IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiB0aWxlUHJvdG9jb2wgKyAiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgU2hhZGVkUmVsaWVmOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU2hhZGVkX1JlbGllZi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDEzLAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRVNSSSwgTkFWVEVRLCBEZUxvcm1lIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFNoYWRlZFJlbGllZkxhYmVsczogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXNfQWx0ZXJuYXRlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9IiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTIsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbihrZXksIG9wdGlvbnMpewogICAgICB2YXIgY29uZmlnOwogICAgICAvLyBzZXQgdGhlIGNvbmZpZyB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWcgb2JqZWN0CiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAib2JqZWN0IiAmJiBrZXkudXJsVGVtcGxhdGUgJiYga2V5Lm9wdGlvbnMpewogICAgICAgIGNvbmZpZyA9IGtleTsKICAgICAgfSBlbHNlIGlmKHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICYmIEwuZXNyaS5CYXNlbWFwTGF5ZXIuVElMRVNba2V5XSl7CiAgICAgICAgY29uZmlnID0gTC5lc3JpLkJhc2VtYXBMYXllci5USUxFU1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTC5lc3JpLkJhc2VtYXBMYXllcjogSW52YWxpZCBwYXJhbWV0ZXIuIFVzZSBvbmUgb2YgJ1N0cmVldHMnLCAnVG9wb2dyYXBoaWMnLCAnT2NlYW5zJywgJ05hdGlvbmFsR2VvZ3JhcGhpYycsICdHcmF5JywgJ0dyYXlMYWJlbHMnLCAnRGFya0dyYXknLCAnRGFya0dyYXlMYWJlbHMnLCAnSW1hZ2VyeScsICdJbWFnZXJ5TGFiZWxzJywgJ0ltYWdlcnlUcmFuc3BvcnRhdGlvbicsICdTaGFkZWRSZWxpZWYnIG9yICdTaGFkZWRSZWxpZWZMYWJlbHMnIik7CiAgICAgIH0KCiAgICAgIC8vIG1lcmdlIHBhc3NlZCBvcHRpb25zIGludG8gdGhlIGNvbmZpZyBvcHRpb25zCiAgICAgIHZhciBtZXJnZWRPcHRpb25zID0gTC5VdGlsLmV4dGVuZChjb25maWcub3B0aW9ucywgb3B0aW9ucyk7CgogICAgICAvLyBjYWxsIHRoZSBpbml0aWFsaXplIG1ldGhvZCBvbiBMLlRpbGVMYXllciB0byBzZXQgZXZlcnl0aGluZyB1cAogICAgICBMLlRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIGNvbmZpZy51cmxUZW1wbGF0ZSwgTC5VdGlsLnNldE9wdGlvbnModGhpcywgbWVyZ2VkT3B0aW9ucykpOwoKICAgICAgLy8gaWYgdGhpcyBiYXNlbWFwIHJlcXVpcmVzIGR5bmFtaWMgYXR0cmlidXRpb24gc2V0IGl0IHVwCiAgICAgIGlmKGNvbmZpZy5hdHRyaWJ1dGlvblVybCl7CiAgICAgICAgdmFyIGF0dHJpYnV0aW9uVXJsID0gY29uZmlnLmF0dHJpYnV0aW9uVXJsOwogICAgICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGlvbiA9IHRydWU7CiAgICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25EYXRhKGF0dHJpYnV0aW9uVXJsKTsKICAgICAgfQogICAgfSwKICAgIF9keW5hbWljQXR0cmlidXRpb246IGZhbHNlLAogICAgYm91bmRzOiBudWxsLAogICAgem9vbTogbnVsbCwKICAgIG9uQWRkOiBmdW5jdGlvbihtYXApewogICAgICBpZighbWFwLmF0dHJpYnV0aW9uQ29udHJvbCAmJiBjb25zb2xlKXsKICAgICAgICBjb25zb2xlLndhcm4oIkwuZXNyaS5CYXNlbWFwTGF5ZXIgcmVxdWlyZXMgYXR0cmlidXRpb24uIFBsZWFzZSBzZXQgYXR0cmlidXRpb25Db250cm9sIHRvIHRydWUgb24geW91ciBtYXAiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgTC5UaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcywgbWFwKTsKICAgICAgaWYodGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uKXsKICAgICAgICB0aGlzLm9uKCJsb2FkIiwgdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsIHRoaXMpOwogICAgICAgIHRoaXMuX21hcC5vbigidmlld3Jlc2V0IHpvb21lbmQgZHJhZ2VuZCIsIHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLCB0aGlzKTsKICAgICAgfQogICAgICB0aGlzLl9tYXAub24oInJlc2l6ZSIsIHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uLCB0aGlzKTsKICAgIH0sCiAgICBvblJlbW92ZTogZnVuY3Rpb24obWFwKXsKICAgICAgaWYodGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uKXsKICAgICAgICB0aGlzLm9mZigibG9hZCIsIHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLCB0aGlzKTsKICAgICAgICB0aGlzLl9tYXAub2ZmKCJ2aWV3cmVzZXQgem9vbWVuZCBkcmFnZW5kIiwgdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsIHRoaXMpOwogICAgICB9CiAgICAgIHRoaXMuX21hcC5vZmYoInJlc2l6ZSIsIHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uLCB0aGlzKTsKICAgICAgTC5UaWxlTGF5ZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcywgbWFwKTsKICAgIH0sCiAgICBfaGFuZGxlVGlsZVVwZGF0ZXM6IGZ1bmN0aW9uKGUpewogICAgICB2YXIgbmV3Qm91bmRzOwogICAgICB2YXIgbmV3Wm9vbTsKCiAgICAgIGlmKGUudHlwZSA9PT0gImxvYWQiKXsKICAgICAgICBuZXdCb3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7CiAgICAgICAgbmV3Wm9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7CiAgICAgIH0KCiAgICAgIGlmKGUudHlwZSA9PT0gInZpZXdyZXNldCIgfHwgZS50eXBlID09PSAiZHJhZ2VuZCIgfHwgZS50eXBlID09PSJ6b29tZW5kIil7CiAgICAgICAgbmV3Qm91bmRzID0gZS50YXJnZXQuZ2V0Qm91bmRzKCk7CiAgICAgICAgbmV3Wm9vbSA9IGUudGFyZ2V0LmdldFpvb20oKTsKICAgICAgfQoKICAgICAgaWYodGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMgJiYgbmV3Qm91bmRzICYmIG5ld1pvb20pewogICAgICAgIGlmKCFuZXdCb3VuZHMuZXF1YWxzKHRoaXMuYm91bmRzKSB8fCBuZXdab29tICE9PSB0aGlzLnpvb20pewogICAgICAgICAgdGhpcy5ib3VuZHMgPSBuZXdCb3VuZHM7CiAgICAgICAgICB0aGlzLnpvb20gPSBuZXdab29tOwogICAgICAgICAgdGhpcy5fdXBkYXRlTWFwQXR0cmlidXRpb24oKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBfcmVzaXplQXR0cmlidXRpb246IGZ1bmN0aW9uKCl7CiAgICAgIHZhciBtYXBXaWR0aCA9IHRoaXMuX21hcC5nZXRTaXplKCkueDsKICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25Mb2dvKCkuc3R5bGUuZGlzcGxheSA9IChtYXBXaWR0aCA8IDYwMCkgPyAibm9uZSI6ImJsb2NrIjsKICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25TcGFuKCkuc3R5bGUubWF4V2lkdGggPSAgKG1hcFdpZHRoKiAwLjc1KSArICJweCI7CiAgICB9LAogICAgX2dldEF0dHJpYnV0aW9uRGF0YTogZnVuY3Rpb24odXJsKXsKICAgICAgdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMgPSBbXTsKICAgICAgTC5lc3JpLlJlcXVlc3RIYW5kbGVycy5KU09OUCh1cmwsIHt9LCB0aGlzLl9wcm9jZXNzQXR0cmlidXRpb25EYXRhLCB0aGlzKTsKICAgIH0sCiAgICBfcHJvY2Vzc0F0dHJpYnV0aW9uRGF0YTogZnVuY3Rpb24oYXR0cmlidXRpb25EYXRhKXsKICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBhdHRyaWJ1dGlvbkRhdGEuY29udHJpYnV0b3JzLmxlbmd0aDsgYysrKSB7CiAgICAgICAgdmFyIGNvbnRyaWJ1dG9yID0gYXR0cmlidXRpb25EYXRhLmNvbnRyaWJ1dG9yc1tjXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBjb3ZlcmFnZUFyZWEgPSBjb250cmlidXRvci5jb3ZlcmFnZUFyZWFzW2ldOwogICAgICAgICAgdmFyIHNvdXRoV2VzdCA9IG5ldyBMLkxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFswXSwgY292ZXJhZ2VBcmVhLmJib3hbMV0pOwogICAgICAgICAgdmFyIG5vcnRoRWFzdCA9IG5ldyBMLkxhdExuZyhjb3ZlcmFnZUFyZWEuYmJveFsyXSwgY292ZXJhZ2VBcmVhLmJib3hbM10pOwogICAgICAgICAgdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMucHVzaCh7CiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBjb250cmlidXRvci5hdHRyaWJ1dGlvbiwKICAgICAgICAgICAgc2NvcmU6IGNvdmVyYWdlQXJlYS5zY29yZSwKICAgICAgICAgICAgYm91bmRzOiBuZXcgTC5MYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpLAogICAgICAgICAgICBtaW5ab29tOiBjb3ZlcmFnZUFyZWEuem9vbU1pbiwKICAgICAgICAgICAgbWF4Wm9vbTogY292ZXJhZ2VBcmVhLnpvb21NYXgKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5zb3J0KGZ1bmN0aW9uKGEsYil7CiAgICAgICAgaWYgKGEuc2NvcmUgPCBiLnNjb3JlKXsgcmV0dXJuIC0xOyB9CiAgICAgICAgaWYgKGEuc2NvcmUgPiBiLnNjb3JlKXsgcmV0dXJuIDE7IH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfSk7CiAgICAgIGlmKHRoaXMuYm91bmRzKXsKICAgICAgICB0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpOwogICAgICB9CiAgICB9LAogICAgX2dldEF0dHJpYnV0aW9uU3BhbjpmdW5jdGlvbigpewogICAgICByZXR1cm4gdGhpcy5fbWFwLl9jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmVzcmktYXR0cmlidXRpb25zJylbMF07CiAgICB9LAogICAgX2dldEF0dHJpYnV0aW9uTG9nbzpmdW5jdGlvbigpewogICAgICByZXR1cm4gdGhpcy5fbWFwLl9jb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmVzcmktYXR0cmlidXRpb24tbG9nbycpWzBdOwogICAgfSwKICAgIF91cGRhdGVNYXBBdHRyaWJ1dGlvbjogZnVuY3Rpb24oKXsKICAgICAgdmFyIG5ld0F0dHJpYnV0aW9ucyA9ICcnOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGF0dHIgPSB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlc1tpXTsKICAgICAgICBpZih0aGlzLmJvdW5kcy5pbnRlcnNlY3RzKGF0dHIuYm91bmRzKSAmJiB0aGlzLnpvb20gPj0gYXR0ci5taW5ab29tICYmIHRoaXMuem9vbSA8PSBhdHRyLm1heFpvb20pIHsKICAgICAgICAgIHZhciBhdHRyaWJ1dGlvbiA9IHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2ldLmF0dHJpYnV0aW9uOwogICAgICAgICAgaWYobmV3QXR0cmlidXRpb25zLmluZGV4T2YoYXR0cmlidXRpb24pID09PSAtMSl7CiAgICAgICAgICAgIGlmKG5ld0F0dHJpYnV0aW9ucy5sZW5ndGggPiAwKXsKICAgICAgICAgICAgICBuZXdBdHRyaWJ1dGlvbnMgKz0gJywgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXdBdHRyaWJ1dGlvbnMgKz0gYXR0cmlidXRpb247CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuX2dldEF0dHJpYnV0aW9uU3BhbigpLmlubmVySFRNTCA9IG5ld0F0dHJpYnV0aW9uczsKICAgICAgdGhpcy5fcmVzaXplQXR0cmlidXRpb24oKTsKICAgIH0KICB9KTsKCiAgTC5lc3JpLmJhc2VtYXBMYXllciA9IGZ1bmN0aW9uKGtleSwgb3B0aW9ucyl7CiAgICByZXR1cm4gbmV3IEwuZXNyaS5CYXNlbWFwTGF5ZXIoa2V5LCBvcHRpb25zKTsKICB9OwoKfSkoTCk7CiAgLyogZ2xvYmFscyBUZXJyYWZvcm1lciwgTCAqLwooZnVuY3Rpb24oTCl7CgogIC8vIHRvZ2dsZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBsYXllci4gVXNlZCB0bwogIC8vIHNob3cgb3IgaGlkZSBsYXllcnMgdGhhdCBtb3ZlIGluIG9yIG91dCBvZgogIC8vIHRoZSBtYXAgYm91bmRzCiAgZnVuY3Rpb24gc2V0TGF5ZXJWaXNpYmlsaXR5KGxheWVyLCB2aXNpYmxlKXsKICAgIHZhciBzdHlsZSA9ICh2aXNpYmxlKSA/ICJibG9jayIgOiAibm9uZSI7CgogICAgaWYobGF5ZXIuX2ljb24pewogICAgICBsYXllci5faWNvbi5zdHlsZS5kaXNwbGF5ID0gc3R5bGU7CiAgICB9CgogICAgaWYobGF5ZXIuX3NoYWRvdyl7CiAgICAgIGxheWVyLl9zaGFkb3cuc3R5bGUuZGlzcGxheSA9IHN0eWxlOwogICAgfQoKICAgIGlmKGxheWVyLl9sYXllcnMpewogICAgICBmb3IodmFyIGxheWVyaWQgaW4gbGF5ZXIuX2xheWVycyl7CiAgICAgICAgaWYobGF5ZXIuX2xheWVycy5oYXNPd25Qcm9wZXJ0eShsYXllcmlkKSl7CiAgICAgICAgICBsYXllci5fbGF5ZXJzW2xheWVyaWRdLl9jb250YWluZXIuc3R5bGUuZGlzcGxheSA9IHN0eWxlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgTC5lc3JpLkZlYXR1cmVMYXllciA9IEwuR2VvSlNPTi5leHRlbmQoewogICAgaW5jbHVkZXM6IEwuZXNyaS5NaXhpbnMuZmVhdHVyZUdyaWQsCiAgICBvcHRpb25zOiB7CiAgICAgIGNlbGxTaXplOiA1MTIsCiAgICAgIGRlYm91bmNlOiAxMDAsCiAgICAgIGRlZHVwbGljYXRlOiB0cnVlCiAgICB9LAogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odXJsLCBvcHRpb25zKXsKICAgICAgdGhpcy5pbmRleCA9IG5ldyBUZXJyYWZvcm1lci5SVHJlZSgpOwogICAgICB0aGlzLnVybCA9IEwuZXNyaS5VdGlsLmNsZWFuVXJsKHVybCk7CiAgICAgIEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpOwoKICAgICAgdmFyIHJlcXVlc3RPcHRpb25zID0ge307CgogICAgICBpZih0aGlzLm9wdGlvbnMudG9rZW4pewogICAgICAgIHJlcXVlc3RPcHRpb25zLnRva2VuID0gdGhpcy5vcHRpb25zLnRva2VuOwogICAgICB9CgogICAgICBpZih0aGlzLm9wdGlvbnMud2hlcmUpewogICAgICAgIHJlcXVlc3RPcHRpb25zLndoZXJlID0gdGhpcy5vcHRpb25zLndoZXJlOwogICAgICB9CgogICAgICBMLmVzcmkuZ2V0KHRoaXMudXJsLCByZXF1ZXN0T3B0aW9ucywgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgIHRoaXMuZmlyZSgibWV0YWRhdGEiLCB7IG1ldGFkYXRhOiByZXNwb25zZSB9KTsKICAgICAgfSwgdGhpcyk7CgogICAgICBMLkdlb0pTT04ucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLCBbXSwgb3B0aW9ucyk7CiAgICB9LAogICAgb25BZGQ6IGZ1bmN0aW9uKG1hcCl7CiAgICAgIEwuTGF5ZXJHcm91cC5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApOwogICAgICBtYXAub24oInpvb21lbmQgcmVzaXplIG1vdmVlbmQiLCB0aGlzLl91cGRhdGUsIHRoaXMpOwogICAgICB0aGlzLl9pbml0aWFsaXplRmVhdHVyZUdyaWQobWFwKTsKICAgIH0sCiAgICBvblJlbW92ZTogZnVuY3Rpb24obWFwKXsKICAgICAgbWFwLm9mZigiem9vbWVuZCByZXNpemUgbW92ZWVuZCIsIHRoaXMuX3VwZGF0ZSwgdGhpcyk7CiAgICAgIEwuTGF5ZXJHcm91cC5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApOwogICAgICB0aGlzLl9kZXN0cm95RmVhdHVyZUdyaWQobWFwKTsKICAgIH0sCiAgICBnZXRMYXllcklkOiBmdW5jdGlvbihsYXllcil7CiAgICAgIHJldHVybiBsYXllci5mZWF0dXJlLmlkOwogICAgfSwKICAgIF91cGRhdGU6IGZ1bmN0aW9uKGUpewogICAgICB2YXIgZW52ZWxvcGUgPSBMLmVzcmkuVXRpbC5ib3VuZHNUb0VudmVsb3BlKGUudGFyZ2V0LmdldEJvdW5kcygpKTsKICAgICAgdGhpcy5pbmRleC5zZWFyY2goZW52ZWxvcGUsIEwuVXRpbC5iaW5kKGZ1bmN0aW9uKGVycm9yLHJlc3VsdHMpewogICAgICAgIHRoaXMuZWFjaExheWVyKEwuVXRpbC5iaW5kKGZ1bmN0aW9uKGxheWVyKXsKICAgICAgICAgIHZhciBpZCA9IGxheWVyLmZlYXR1cmUuaWQ7CiAgICAgICAgICBzZXRMYXllclZpc2liaWxpdHkobGF5ZXIsIEwuZXNyaS5VdGlsLmluZGV4T2YocmVzdWx0cywgaWQpID49IDApOwogICAgICAgIH0sIHRoaXMpKTsKICAgICAgfSwgdGhpcykpOwogICAgfSwKICAgIF9zZXRPYmplY3RJZEZpZWxkOiBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIGlmKHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lKXsKICAgICAgICB0aGlzLl9vYmplY3RJZEZpZWxkID0gcmVzcG9uc2Uub2JqZWN0SWRGaWVsZE5hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPD0gcmVzcG9uc2UuZmllbGRzLmxlbmd0aCAtIDE7IGorKykgewogICAgICAgICAgaWYocmVzcG9uc2UuZmllbGRzW2pdLnR5cGUgPT09ICJlc3JpRmllbGRUeXBlT0lEIikgewogICAgICAgICAgICB0aGlzLl9vYmplY3RJZEZpZWxkID0gcmVzcG9uc2UuZmllbGRzW2pdLm5hbWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIF9yZW5kZXI6IGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgaWYocmVzcG9uc2UuZmVhdHVyZXMgJiYgcmVzcG9uc2UuZmVhdHVyZXMubGVuZ3RoICYmICFyZXNwb25zZS5lcnJvcil7CiAgICAgICAgaWYoIXRoaXMuX29iamVjdElkRmllbGQpewogICAgICAgICAgdGhpcy5fc2V0T2JqZWN0SWRGaWVsZChyZXNwb25zZSk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSByZXNwb25zZS5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGZlYXR1cmUgPSByZXNwb25zZS5mZWF0dXJlc1tpXTsKICAgICAgICAgIHZhciBpZEZpZWxkTmFtZSA9IHRoaXMuX29iamVjdElkRmllbGQ7CiAgICAgICAgICB2YXIgaWQgPSBmZWF0dXJlLmF0dHJpYnV0ZXNbaWRGaWVsZE5hbWVdOwogICAgICAgICAgaWYoIXRoaXMuX2xheWVyc1tpZF0pewogICAgICAgICAgICB2YXIgZ2VvanNvbiA9IFRlcnJhZm9ybWVyLkFyY0dJUy5wYXJzZShmZWF0dXJlKTsKICAgICAgICAgICAgZ2VvanNvbi5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmluZGV4Lmluc2VydChnZW9qc29uLCBnZW9qc29uLmlkKTsKICAgICAgICAgICAgdGhpcy5hZGREYXRhKGdlb2pzb24pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0pOwoKICBMLmVzcmkuZmVhdHVyZUxheWVyID0gZnVuY3Rpb24odXJsLCBvcHRpb25zKXsKICAgIHJldHVybiBuZXcgTC5lc3JpLkZlYXR1cmVMYXllcih1cmwsIG9wdGlvbnMpOwogIH07Cgp9KShMKTsKCi8qIGdsb2JhbHMgTCAqLwoKTC5lc3JpLlRpbGVkTWFwTGF5ZXIgPSBMLlRpbGVMYXllci5leHRlbmQoewogIGluY2x1ZGVzOiBMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyLAogIGluaXRpYWxpemU6IGZ1bmN0aW9uKHVybCwgb3B0aW9ucyl7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAvLyBzZXQgdGhlIHVybHMKICAgIHRoaXMuc2VydmljZVVybCA9IEwuZXNyaS5VdGlsLmNsZWFuVXJsKHVybCk7CiAgICB0aGlzLnRpbGVVcmwgPSBMLmVzcmkuVXRpbC5jbGVhblVybCh1cmwpICsgInRpbGUve3p9L3t5fS97eH0iOwoKICAgIC8vaWYgdGhpcyBpcyBsb29raW5nIGF0IHRoZSBBR08gdGlsZXMgc3ViZG9tYWluIGluc2VydCB0aGUgc3ViZG9tYWluIHBsYWNlaG9sZGVyCiAgICBpZih0aGlzLnRpbGVVcmwubWF0Y2goIjovL3RpbGVzLmFyY2dpcy5jb20iKSl7CiAgICAgIHRoaXMudGlsZVVybCA9IHRoaXMudGlsZVVybC5yZXBsYWNlKCI6Ly90aWxlcy5hcmNnaXMuY29tIiwgIjovL3RpbGVze3N9LmFyY2dpcy5jb20iKTsKICAgICAgb3B0aW9ucy5zdWJkb21haW5zID0gWyIxIiwgIjIiLCAiMyIsICI0Il07CiAgICB9CgogICAgTC5lc3JpLmdldCh0aGlzLnNlcnZpY2VVcmwsIHt9LCBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIHRoaXMuZmlyZSgibWV0YWRhdGEiLCB7IG1ldGFkYXRhOiByZXNwb25zZSB9KTsKICAgIH0sIHRoaXMpOwoKICAgIC8vIGluaXQgbGF5ZXIgYnkgY2FsbGluZyBUaWxlTGF5ZXJzIGluaXRpYWxpemUgbWV0aG9kCiAgICBMLlRpbGVMYXllci5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsIHRoaXMudGlsZVVybCwgb3B0aW9ucyk7CiAgfQp9KTsKCkwuZXNyaS50aWxlZE1hcExheWVyID0gZnVuY3Rpb24oa2V5LCBvcHRpb25zKXsKICByZXR1cm4gbmV3IEwuZXNyaS5UaWxlZE1hcExheWVyKGtleSwgb3B0aW9ucyk7Cn07Ci8qIGdsb2JhbHMgTCAqLwoKLyohCiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKQogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTMgU2FuYm9ybiBNYXAgQ29tcGFueSwgSW5jLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAqIFRIRSBTT0ZUV0FSRS4KICovCgpMLmVzcmkuRHluYW1pY01hcExheWVyID0gTC5DbGFzcy5leHRlbmQoewogIGluY2x1ZGVzOiBMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyLAoKICBvcHRpb25zOiB7CiAgICBvcGFjaXR5OiAxLAogICAgcG9zaXRpb246ICdmcm9udCcKICB9LAoKICBfZGVmYXVsdExheWVyUGFyYW1zOiB7CiAgICBmb3JtYXQ6ICdwbmcyNCcsCiAgICB0cmFuc3BhcmVudDogdHJ1ZSwKICAgIGY6ICdpbWFnZScsCiAgICBiYm94U1I6IDM4NzUsCiAgICBpbWFnZVNSOiAzODc1LAogICAgbGF5ZXJzOiAnJwogIH0sCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uICh1cmwsIG9wdGlvbnMpIHsKICAgIHRoaXMuc2VydmljZVVybCA9IEwuZXNyaS5VdGlsLmNsZWFuVXJsKHVybCk7CiAgICB0aGlzLl9sYXllclBhcmFtcyA9IEwuVXRpbC5leHRlbmQoe30sIHRoaXMuX2RlZmF1bHRMYXllclBhcmFtcyk7CgogICAgZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHsKICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSAmJiB0aGlzLl9kZWZhdWx0TGF5ZXJQYXJhbXMuaGFzT3duUHJvcGVydHkob3B0KSkgewogICAgICAgIHRoaXMuX2xheWVyUGFyYW1zW29wdF0gPSBvcHRpb25zW29wdF07CiAgICAgIH0KICAgIH0KCiAgICB0aGlzLl9wYXJzZUxheWVycygpOwogICAgdGhpcy5fcGFyc2VMYXllckRlZnMoKTsKCgogICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7CgogICAgaWYoIXRoaXMuX2xheWVyUGFyYW1zLnRyYW5zcGFyZW50KSB7CiAgICAgIHRoaXMub3B0aW9ucy5vcGFjaXR5ID0gMTsKICAgIH0KCiAgICB0aGlzLl9nZXRNZXRhZGF0YSgpOwoKICB9LAoKICBfZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uKCl7CiAgIHZhciByZXF1ZXN0T3B0aW9ucyA9IHt9OwoKICAgIGlmKHRoaXMub3B0aW9ucy50b2tlbil7CiAgICAgIHJlcXVlc3RPcHRpb25zLnRva2VuID0gdGhpcy5vcHRpb25zLnRva2VuOwogICAgfQoKICAgIEwuZXNyaS5nZXQodGhpcy5zZXJ2aWNlVXJsLCByZXF1ZXN0T3B0aW9ucywgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAvLyBpZiB0aGVyZSBpcyBhIGludmFsaWQgdG9rZW4gZXJyb3IuLi4KICAgICAgaWYocmVzcG9uc2UuZXJyb3IgJiYgKHJlc3BvbnNlLmVycm9yLmNvZGUgPT09IDQ5OSB8fCByZXNwb25zZS5lcnJvci5jb2RlID09PSA0OTgpKSB7CgogICAgICAgIC8vIGlmIHdlIGhhdmUgYWxyZWFkeSBhc2tlZCBmb3IgYXV0aGVudGljYXRpb24KICAgICAgICBpZighdGhpcy5fYXV0aGVudGljYXRpbmcpewoKICAgICAgICAgIC8vIGFzayBmb3IgYXV0aGVudGljYXRpb24KICAgICAgICAgIHRoaXMuX2F1dGhlbnRpY2F0aW5nID0gdHJ1ZTsKCiAgICAgICAgICAvLyBhc2sgZm9yIGF1dGhlbnRpY2F0aW9uLiBkZXZlbG9wZXIgc2hvdWxkIGZpcmUgdGhlIHJldHJ5KCkgbWV0aG9kIHdpdGggdGhlIG5ldyB0b2tlbgogICAgICAgICAgdGhpcy5maXJlKCdhdXRoZW50aWNhdGlvbnJlcXVpcmVkJywgewogICAgICAgICAgICByZXRyeTogTC5VdGlsLmJpbmQoZnVuY3Rpb24odG9rZW4pewogICAgICAgICAgICAgIC8vIHNldCB0aGUgbmV3IHRva2VuCiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRva2VuID0gdG9rZW47CgogICAgICAgICAgICAgIC8vIGdldCBtZXRhZGF0YSBhZ2FpbgogICAgICAgICAgICAgIHRoaXMuX2dldE1ldGFkYXRhKCk7CgogICAgICAgICAgICAgIC8vIHJlbG9hZCB0aGUgaW1hZ2Ugc28gaXQgc2hvd3MgdXAgd2l0aCB0aGUgbmV3IHRva2VuCiAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7CiAgICAgICAgICAgIH0sIHRoaXMpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5maXJlKCJtZXRhZGF0YSIsIHsgbWV0YWRhdGE6IHJlc3BvbnNlIH0pOwogICAgICB9CgogICAgfSwgdGhpcyk7CiAgfSwKCiAgb25BZGQ6IGZ1bmN0aW9uIChtYXApIHsKICAgIHRoaXMuX21hcCA9IG1hcDsKICAgIHRoaXMuX21vdmVIYW5kbGVyID0gTC5lc3JpLlV0aWwuZGVib3VuY2UodGhpcy5fdXBkYXRlLCAxNTAsIHRoaXMpOwoKICAgIG1hcC5vbigibW92ZWVuZCIsIHRoaXMuX21vdmVIYW5kbGVyLCB0aGlzKTsKCiAgICBpZiAobWFwLm9wdGlvbnMuY3JzICYmIG1hcC5vcHRpb25zLmNycy5jb2RlKSB7CiAgICAgIHZhciBzciA9IG1hcC5vcHRpb25zLmNycy5jb2RlLnNwbGl0KCI6IilbMV07CiAgICAgIHRoaXMuX2xheWVyUGFyYW1zLmJib3hTUiA9IHNyOwogICAgICB0aGlzLl9sYXllclBhcmFtcy5pbWFnZVNSID0gc3I7CiAgICB9CgogICAgdGhpcy5fdXBkYXRlKCk7CiAgfSwKCiAgb25SZW1vdmU6IGZ1bmN0aW9uIChtYXApIHsKICAgIGlmICh0aGlzLl9jdXJyZW50SW1hZ2UpIHsgdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX2N1cnJlbnRJbWFnZSk7IH0KICAgIG1hcC5vZmYoIm1vdmVlbmQiLCB0aGlzLl9tb3ZlSGFuZGxlciwgdGhpcyk7CiAgfSwKCiAgYWRkVG86IGZ1bmN0aW9uIChtYXApIHsKICAgIG1hcC5hZGRMYXllcih0aGlzKTsKICAgIHJldHVybiB0aGlzOwogIH0sCgogIHNldE9wYWNpdHk6IGZ1bmN0aW9uKG9wYWNpdHkpewogICAgdGhpcy5vcHRpb25zLm9wYWNpdHkgPSBvcGFjaXR5OwogICAgdGhpcy5fY3VycmVudEltYWdlLnNldE9wYWNpdHkob3BhY2l0eSk7CiAgfSwKCiAgYnJpbmdUb0Zyb250OiBmdW5jdGlvbigpewogICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gJ2Zyb250JzsKICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvRnJvbnQoKTsKICAgIHJldHVybiB0aGlzOwogIH0sCgogIGJyaW5nVG9CYWNrOiBmdW5jdGlvbigpewogICAgdGhpcy5vcHRpb25zLnBvc2l0aW9uID0gJ2JhY2snOwogICAgdGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9CYWNrKCk7CiAgICByZXR1cm4gdGhpczsKICB9LAoKICBfcGFyc2VMYXllcnM6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0eXBlb2YgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJzID09PSAndW5kZWZpbmVkJykgewogICAgICBkZWxldGUgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJPcHRpb247CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgYWN0aW9uID0gdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJPcHRpb24gfHwgbnVsbCwKICAgICAgICBsYXllcnMgPSB0aGlzLl9sYXllclBhcmFtcy5sYXllcnMgfHwgbnVsbCwKICAgICAgICB2ZXJiID0gJ3Nob3cnLAogICAgICAgIHZlcmJzID0gWydzaG93JywgJ2hpZGUnLCAnaW5jbHVkZScsICdleGNsdWRlJ107CgogICAgZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyT3B0aW9uOwoKICAgIGlmICghYWN0aW9uKSB7CiAgICAgIGlmIChsYXllcnMgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgIHRoaXMuX2xheWVyUGFyYW1zLmxheWVycyA9IHZlcmIgKyAnOicgKyBsYXllcnMuam9pbignLCcpOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYXllcnMgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgdmFyIG1hdGNoID0gbGF5ZXJzLm1hdGNoKCc6Jyk7CgogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgbGF5ZXJzID0gbGF5ZXJzLnNwbGl0KG1hdGNoWzBdKTsKICAgICAgICAgIGlmIChOdW1iZXIobGF5ZXJzWzFdLnNwbGl0KCcsJylbMF0pKSB7CiAgICAgICAgICAgIGlmICh2ZXJicy5pbmRleE9mKGxheWVyc1swXSkgIT09IC0xKSB7CiAgICAgICAgICAgICAgdmVyYiA9IGxheWVyc1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGF5ZXJzID0gbGF5ZXJzWzFdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9sYXllclBhcmFtcy5sYXllcnMgPSB2ZXJiICsgJzonICsgbGF5ZXJzOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBpZiAodmVyYnMuaW5kZXhPZihhY3Rpb24pICE9PSAtMSkgewogICAgICAgIHZlcmIgPSBhY3Rpb247CiAgICAgIH0KCiAgICAgIHRoaXMuX2xheWVyUGFyYW1zLmxheWVycyA9IHZlcmIgKyAnOicgKyBsYXllcnM7CiAgICB9CiAgfSwKCiAgX3BhcnNlTGF5ZXJEZWZzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodHlwZW9mIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyRGVmcyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBsYXllckRlZnMgPSB0aGlzLl9sYXllclBhcmFtcy5sYXllckRlZnM7CgogICAgdmFyIGRlZnMgPSBbXTsKCiAgICBpZiAobGF5ZXJEZWZzIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgdmFyIGxlbiA9IGxheWVyRGVmcy5sZW5ndGg7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBpZiAobGF5ZXJEZWZzW2ldKSB7CiAgICAgICAgICBkZWZzLnB1c2goaSArICc6JyArIGxheWVyRGVmc1tpXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBsYXllckRlZnMgPT09ICdvYmplY3QnKSB7CiAgICAgIGZvciAodmFyIGxheWVyIGluIGxheWVyRGVmcykgewogICAgICAgIGlmKGxheWVyRGVmcy5oYXNPd25Qcm9wZXJ0eShsYXllcikpewogICAgICAgICAgZGVmcy5wdXNoKGxheWVyICsgJzonICsgbGF5ZXJEZWZzW2xheWVyXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkZWxldGUgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJEZWZzOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9sYXllclBhcmFtcy5sYXllckRlZnMgPSBkZWZzLmpvaW4oJzsnKTsKICB9LAoKICBfZ2V0SW1hZ2VVcmw6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBib3VuZHMgPSB0aGlzLl9tYXAuZ2V0Qm91bmRzKCk7CiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7CiAgICB2YXIgbmUgPSB0aGlzLl9tYXAub3B0aW9ucy5jcnMucHJvamVjdChib3VuZHMuX25vcnRoRWFzdCk7CiAgICB2YXIgc3cgPSB0aGlzLl9tYXAub3B0aW9ucy5jcnMucHJvamVjdChib3VuZHMuX3NvdXRoV2VzdCk7CgogICAgdGhpcy5fbGF5ZXJQYXJhbXMuYmJveCA9IFtzdy54LCBzdy55LCBuZS54LCBuZS55XS5qb2luKCcsJyk7CiAgICB0aGlzLl9sYXllclBhcmFtcy5zaXplID0gc2l6ZS54ICsgJywnICsgc2l6ZS55OwoKICAgIGlmKHRoaXMub3B0aW9ucy50b2tlbikgewogICAgICB0aGlzLl9sYXllclBhcmFtcy50b2tlbiA9IHRoaXMub3B0aW9ucy50b2tlbjsKICAgIH0KCiAgICB2YXIgdXJsID0gdGhpcy5zZXJ2aWNlVXJsICsgJ2V4cG9ydCcgKyBMLlV0aWwuZ2V0UGFyYW1TdHJpbmcodGhpcy5fbGF5ZXJQYXJhbXMpOwoKICAgIHJldHVybiB1cmw7CiAgfSwKCiAgX3VwZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgIGlmKHRoaXMuX2FuaW1hdGluZ1pvb20pewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbiAmJiB0aGlzLl9tYXAuX3BhblRyYW5zaXRpb24uX2luUHJvZ3Jlc3MpIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciB6b29tID0gdGhpcy5fbWFwLmdldFpvb20oKTsKCiAgICBpZiAoem9vbSA+IHRoaXMub3B0aW9ucy5tYXhab29tIHx8IHpvb20gPCB0aGlzLm9wdGlvbnMubWluWm9vbSkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGJvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTsKICAgIGJvdW5kcy5fc291dGhXZXN0LndyYXAoKTsKICAgIGJvdW5kcy5fbm9ydGhFYXN0LndyYXAoKTsKICAgIHZhciBpbWFnZSA9IG5ldyBMLkltYWdlT3ZlcmxheSh0aGlzLl9nZXRJbWFnZVVybCgpLCBib3VuZHMsIHsKICAgICAgb3BhY2l0eTogMAogICAgfSkuYWRkVG8odGhpcy5fbWFwKTsKCiAgICBpbWFnZS5vbignbG9hZCcsIGZ1bmN0aW9uKGUpewogICAgICB2YXIgbmV3SW1hZ2UgPSBlLnRhcmdldDsKICAgICAgdmFyIG9sZEltYWdlID0gdGhpcy5fY3VycmVudEltYWdlOwoKICAgICAgaWYobmV3SW1hZ2UuX2JvdW5kcy5lcXVhbHMoYm91bmRzKSl7CiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlID0gbmV3SW1hZ2U7CgogICAgICAgIGlmKHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gImZyb250Iil7CiAgICAgICAgICB0aGlzLl9jdXJyZW50SW1hZ2UuYnJpbmdUb0Zyb250KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvQmFjaygpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fY3VycmVudEltYWdlLnNldE9wYWNpdHkodGhpcy5vcHRpb25zLm9wYWNpdHkpOwoKICAgICAgICBpZihvbGRJbWFnZSl7CiAgICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIob2xkSW1hZ2UpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobmV3SW1hZ2UpOwogICAgICB9CiAgICB9LCB0aGlzKTsKCgogICAgdGhpcy5maXJlKCdsb2FkaW5nJywgewogICAgICBib3VuZHM6IGJvdW5kcwogICAgfSk7CiAgfQp9KTsKCkwuZXNyaS5EeW5hbWljTWFwTGF5ZXIuaW5jbHVkZShMLk1peGluLkV2ZW50cyk7CgpMLmVzcmkuZHluYW1pY01hcExheWVyID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykgewogIHJldHVybiBuZXcgTC5lc3JpLkR5bmFtaWNNYXBMYXllcih1cmwsIG9wdGlvbnMpOwp9Owo=]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/esri-leaflet.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMS1iZXRhLjMgLSAyMDE0LTAxLTE3CiogICBDb3B5cmlnaHQgKGMpIDIwMTQgRW52aXJvbm1lbnRhbCBTeXN0ZW1zIFJlc2VhcmNoIEluc3RpdHV0ZSwgSW5jLgoqICAgQXBhY2hlIExpY2Vuc2UqLwohZnVuY3Rpb24oYSxiKXsib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cyYmKGV4cG9ydHM9bW9kdWxlLmV4cG9ydHM9YigpKSwib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKGEuVGVycmFmb3JtZXI9YigpKX0odGhpcyxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJndW1lbnRzKTt2b2lkIDAhPT10eXBlb2YgY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4uYXBwbHkoY29uc29sZSxhKX1mdW5jdGlvbiBiKGEsYil7Zm9yKHZhciBjIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShjKSYmKGFbY109YltjXSk7cmV0dXJuIGF9ZnVuY3Rpb24gYyhhKXtzd2l0Y2goYS50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm5bYS5jb29yZGluYXRlc1swXSxhLmNvb3JkaW5hdGVzWzFdLGEuY29vcmRpbmF0ZXNbMF0sYS5jb29yZGluYXRlc1sxXV07Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gZihhLmNvb3JkaW5hdGVzKTtjYXNlIkxpbmVTdHJpbmciOnJldHVybiBmKGEuY29vcmRpbmF0ZXMpO2Nhc2UiTXVsdGlMaW5lU3RyaW5nIjpyZXR1cm4gZChhLmNvb3JkaW5hdGVzKTtjYXNlIlBvbHlnb24iOnJldHVybiBkKGEuY29vcmRpbmF0ZXMpO2Nhc2UiTXVsdGlQb2x5Z29uIjpyZXR1cm4gZShhLmNvb3JkaW5hdGVzKTtjYXNlIkZlYXR1cmUiOnJldHVybiBjKGEuZ2VvbWV0cnkpO2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBnKGEpO2Nhc2UiR2VvbWV0cnlDb2xsZWN0aW9uIjpyZXR1cm4gaChhKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biB0eXBlOiAiK2EudHlwZSl9fWZ1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPW51bGwsZj0wO2Y8YS5sZW5ndGg7ZisrKWZvcih2YXIgZz1hW2ZdLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGk9Z1toXSxqPWlbMF0saz1pWzFdO251bGw9PT1iP2I9ajpiPmomJihiPWopLG51bGw9PT1jP2M9ajpqPmMmJihjPWopLG51bGw9PT1kP2Q9azpkPmsmJihkPWspLG51bGw9PT1lP2U9azprPmUmJihlPWspfXJldHVybltiLGQsYyxlXX1mdW5jdGlvbiBlKGEpe2Zvcih2YXIgYj1udWxsLGM9bnVsbCxkPW51bGwsZT1udWxsLGY9MDtmPGEubGVuZ3RoO2YrKylmb3IodmFyIGc9YVtmXSxoPTA7aDxnLmxlbmd0aDtoKyspZm9yKHZhciBpPWdbaF0saj0wO2o8aS5sZW5ndGg7aisrKXt2YXIgaz1pW2pdLGw9a1swXSxtPWtbMV07bnVsbD09PWI/Yj1sOmI+bCYmKGI9bCksbnVsbD09PWM/Yz1sOmw+YyYmKGM9bCksbnVsbD09PWQ/ZD1tOmQ+bSYmKGQ9bSksbnVsbD09PWU/ZT1tOm0+ZSYmKGU9bSl9cmV0dXJuW2IsZCxjLGVdfWZ1bmN0aW9uIGYoYSl7Zm9yKHZhciBiPW51bGwsYz1udWxsLGQ9bnVsbCxlPW51bGwsZj0wO2Y8YS5sZW5ndGg7ZisrKXt2YXIgZz1hW2ZdLGg9Z1swXSxpPWdbMV07bnVsbD09PWI/Yj1oOmI+aCYmKGI9aCksbnVsbD09PWM/Yz1oOmg+YyYmKGM9aCksbnVsbD09PWQ/ZD1pOmQ+aSYmKGQ9aSksbnVsbD09PWU/ZT1pOmk+ZSYmKGU9aSl9cmV0dXJuW2IsZCxjLGVdfWZ1bmN0aW9uIGcoYSl7Zm9yKHZhciBiLGQ9W10sZT1hLmZlYXR1cmVzLmxlbmd0aC0xO2U+PTA7ZS0tKWI9YyhhLmZlYXR1cmVzW2VdLmdlb21ldHJ5KSxkLnB1c2goW2JbMF0sYlsxXV0pLGQucHVzaChbYlsyXSxiWzNdXSk7cmV0dXJuIGYoZCl9ZnVuY3Rpb24gaChhKXtmb3IodmFyIGIsZD1bXSxlPWEuZ2VvbWV0cmllcy5sZW5ndGgtMTtlPj0wO2UtLSliPWMoYS5nZW9tZXRyaWVzW2VdKSxkLnB1c2goW2JbMF0sYlsxXV0pLGQucHVzaChbYlsyXSxiWzNdXSk7cmV0dXJuIGYoZCl9ZnVuY3Rpb24gaShhKXt2YXIgYj1jKGEpO3JldHVybnt4OmJbMF0seTpiWzFdLHc6TWF0aC5hYnMoYlswXS1iWzJdKSxoOk1hdGguYWJzKGJbMV0tYlszXSl9fWZ1bmN0aW9uIGsoYSl7cmV0dXJuIGEqWX1mdW5jdGlvbiBsKGEpe3JldHVybiBhKlp9ZnVuY3Rpb24gbShhLGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKSJudW1iZXIiPT10eXBlb2YgYVtjXVswXSYmKGFbY109YihhW2NdKSksIm9iamVjdCI9PXR5cGVvZiBhW2NdJiYoYVtjXT1tKGFbY10sYikpO3JldHVybiBhfWZ1bmN0aW9uIG4oYSl7dmFyIGI9YVswXSxjPWFbMV07cmV0dXJuW2soYi9YKS0zNjAqTWF0aC5mbG9vcigoayhiL1gpKzE4MCkvMzYwKSxrKE1hdGguUEkvMi0yKk1hdGguYXRhbihNYXRoLmV4cCgtMSpjL1gpKSldfWZ1bmN0aW9uIG8oYSl7dmFyIGI9YVswXSxjPU1hdGgubWF4KE1hdGgubWluKGFbMV0sODkuOTk5OTkpLC04OS45OTk5OSk7cmV0dXJuW2woYikqWCxYLzIqTWF0aC5sb2coKDErTWF0aC5zaW4obChjKSkpLygxLU1hdGguc2luKGwoYykpKSldfWZ1bmN0aW9uIHAoYSxiLGMpe2lmKCJQb2ludCI9PT1hLnR5cGUpYS5jb29yZGluYXRlcz1iKGEuY29vcmRpbmF0ZXMpO2Vsc2UgaWYoIkZlYXR1cmUiPT09YS50eXBlKWEuZ2VvbWV0cnk9cChhLmdlb21ldHJ5LGIsITApO2Vsc2UgaWYoIkZlYXR1cmVDb2xsZWN0aW9uIj09PWEudHlwZSlmb3IodmFyIGQ9MDtkPGEuZmVhdHVyZXMubGVuZ3RoO2QrKylhLmZlYXR1cmVzW2RdPXAoYS5mZWF0dXJlc1tkXSxiLCEwKTtlbHNlIGlmKCJHZW9tZXRyeUNvbGxlY3Rpb24iPT09YS50eXBlKWZvcih2YXIgZT0wO2U8YS5nZW9tZXRyaWVzLmxlbmd0aDtlKyspYS5nZW9tZXRyaWVzW2VdPXAoYS5nZW9tZXRyaWVzW2VdLGIsITApO2Vsc2UgYS5jb29yZGluYXRlcz1tKGEuY29vcmRpbmF0ZXMsYik7cmV0dXJuIGN8fGI9PT1vJiYoYS5jcnM9JCksYj09PW4mJmRlbGV0ZSBhLmNycyxhfWZ1bmN0aW9uIHEoYSl7cmV0dXJuIHAoYSxvKX1mdW5jdGlvbiByKGEpe3JldHVybiBwKGEsbil9ZnVuY3Rpb24gcyhhLGIpe3JldHVybiBiPmE/LTE6YT5iPzE6MH1mdW5jdGlvbiB0KGEsYil7cmV0dXJuIGFbMF0tYlswXT5hWzFdLWJbMV0/MTphWzBdLWJbMF08YVsxXS1iWzFdPy0xOjB9ZnVuY3Rpb24gdShhLGIsYyl7cmV0dXJuIHMoKGJbMF0tYVswXSkqKGNbMV0tYVsxXSktKGNbMF0tYVswXSkqKGJbMV0tYVsxXSksMCl9ZnVuY3Rpb24gdihhLGIpe3ZhciBjPWJbMF0tYVswXSxkPWJbMV0tYVsxXTtyZXR1cm4gYypjK2QqZH1mdW5jdGlvbiB3KGEsYil7dmFyIGM9Yjtmb3IodmFyIGQgaW4gYSl7dmFyIGU9dShiLGMsYVtkXSk7KC0xPT09ZXx8MD09PWUmJnYoYixhW2RdKT52KGIsYykpJiYoYz1hW2RdKX1yZXR1cm4gY31mdW5jdGlvbiB4KGEpe2lmKDA9PT1hLmxlbmd0aClyZXR1cm5bXTtpZigxPT09YS5sZW5ndGgpcmV0dXJuIGE7Zm9yKHZhciBiPVthLnNvcnQodClbMF1dLGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9dyhhLGJbY10pO2QhPT1iWzBdJiZiLnB1c2goZCl9cmV0dXJuIGJ9ZnVuY3Rpb24geShhLGIpe2Zvcih2YXIgYz0hMSxkPS0xLGU9YS5sZW5ndGgsZj1lLTE7KytkPGU7Zj1kKShhW2RdWzFdPD1iWzFdJiZiWzFdPGFbZl1bMV18fGFbZl1bMV08PWJbMV0mJmJbMV08YVtkXVsxXSkmJmJbMF08KGFbZl1bMF0tYVtkXVswXSkqKGJbMV0tYVtkXVsxXSkvKGFbZl1bMV0tYVtkXVsxXSkrYVtkXVswXSYmKGM9IWMpO3JldHVybiBjfWZ1bmN0aW9uIHooYSxiKXtpZihhJiZhLmxlbmd0aCl7aWYoMT09PWEubGVuZ3RoKXJldHVybiB5KGFbMF0sYik7aWYoeShhWzBdLGIpKXtmb3IodmFyIGM9MTtjPGEubGVuZ3RoO2MrKylpZih5KGFbY10sYikpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9cmV0dXJuITF9ZnVuY3Rpb24gQShhLGIsYyxkKXt2YXIgZT0oZFswXS1jWzBdKSooYVsxXS1jWzFdKS0oZFsxXS1jWzFdKSooYVswXS1jWzBdKSxmPShiWzBdLWFbMF0pKihhWzFdLWNbMV0pLShiWzFdLWFbMV0pKihhWzBdLWNbMF0pLGc9KGRbMV0tY1sxXSkqKGJbMF0tYVswXSktKGRbMF0tY1swXSkqKGJbMV0tYVsxXSk7aWYoMCE9PWcpe3ZhciBoPWUvZyxpPWYvZztpZihoPj0wJiYxPj1oJiZpPj0wJiYxPj1pKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEIoYSxiKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoLTE7YysrKWZvcih2YXIgZD0wO2Q8Yi5sZW5ndGgtMTtkKyspaWYoQShhW2NdLGFbYysxXSxiW2RdLGJbZCsxXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gQyhhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZD1iW2NdLGU9MDtlPGQubGVuZ3RoLTE7ZSsrKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGgtMTtmKyspaWYoQShkW2VdLGRbZSsxXSxhW2ZdLGFbZisxXSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gRChhLGIpe2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWlmKEMoYVtjXSxiKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBFKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspcmV0dXJuIEMoYSxiW2NdKT8hMDohMX1mdW5jdGlvbiBGKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspcmV0dXJuIEUoYVtjXSxiKT8hMDohMX1mdW5jdGlvbiBHKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspcmV0dXJuIEYoYVtjXSxiKT8hMDohMX1mdW5jdGlvbiBIKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY10uc2xpY2UoKTtJKGRbMF0sZFtkLmxlbmd0aC0xXSk9PT0hMSYmZC5wdXNoKGRbMF0pLGIucHVzaChkKX1yZXR1cm4gYn1mdW5jdGlvbiBJKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspZm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspaWYoYVtjXSE9PWJbZF0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gSihhLGIpe2lmKGEubGVuZ3RoIT09Yi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBjPWEuc2xpY2UoKS5zb3J0KHQpLGQ9Yi5zbGljZSgpLnNvcnQodCksZT0wO2U8Yy5sZW5ndGg7ZSsrKXtpZihjW2VdLmxlbmd0aCE9PWRbZV0ubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKWlmKGNbZV1bZl0hPT1kW2VdW2ZdKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIEsoYSl7aWYoYSlzd2l0Y2goYS50eXBlKXtjYXNlIlBvaW50IjpyZXR1cm4gbmV3IEwoYSk7Y2FzZSJNdWx0aVBvaW50IjpyZXR1cm4gbmV3IE0oYSk7Y2FzZSJMaW5lU3RyaW5nIjpyZXR1cm4gbmV3IE4oYSk7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOnJldHVybiBuZXcgTyhhKTtjYXNlIlBvbHlnb24iOnJldHVybiBuZXcgUChhKTtjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIG5ldyBRKGEpO2Nhc2UiRmVhdHVyZSI6cmV0dXJuIG5ldyBSKGEpO2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiBuZXcgUyhhKTtjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6cmV0dXJuIG5ldyBUKGEpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGU6ICIrYS50eXBlKX19ZnVuY3Rpb24gTChhKXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2lmKGEmJiJQb2ludCI9PT1hLnR5cGUmJmEuY29vcmRpbmF0ZXMpYih0aGlzLGEpO2Vsc2UgaWYoYSYmIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKSl0aGlzLmNvb3JkaW5hdGVzPWE7ZWxzZXtpZighKGMubGVuZ3RoPj0yKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuUG9pbnQiO3RoaXMuY29vcmRpbmF0ZXM9Y310aGlzLnR5cGU9IlBvaW50In1mdW5jdGlvbiBNKGEpe2lmKGEmJiJNdWx0aVBvaW50Ij09PWEudHlwZSYmYS5jb29yZGluYXRlcyliKHRoaXMsYSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTXVsdGlQb2ludCI7dGhpcy5jb29yZGluYXRlcz1hfXRoaXMudHlwZT0iTXVsdGlQb2ludCJ9ZnVuY3Rpb24gTihhKXtpZihhJiYiTGluZVN0cmluZyI9PT1hLnR5cGUmJmEuY29vcmRpbmF0ZXMpYih0aGlzLGEpO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoYSkpdGhyb3ciVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkxpbmVTdHJpbmciO3RoaXMuY29vcmRpbmF0ZXM9YX10aGlzLnR5cGU9IkxpbmVTdHJpbmcifWZ1bmN0aW9uIE8oYSl7aWYoYSYmIk11bHRpTGluZVN0cmluZyI9PT1hLnR5cGUmJmEuY29vcmRpbmF0ZXMpYih0aGlzLGEpO2Vsc2V7aWYoIUFycmF5LmlzQXJyYXkoYSkpdGhyb3ciVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLk11bHRpTGluZVN0cmluZyI7dGhpcy5jb29yZGluYXRlcz1hfXRoaXMudHlwZT0iTXVsdGlMaW5lU3RyaW5nIn1mdW5jdGlvbiBQKGEpe2lmKGEmJiJQb2x5Z29uIj09PWEudHlwZSYmYS5jb29yZGluYXRlcyliKHRoaXMsYSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuUG9seWdvbiI7dGhpcy5jb29yZGluYXRlcz1hfXRoaXMudHlwZT0iUG9seWdvbiJ9ZnVuY3Rpb24gUShhKXtpZihhJiYiTXVsdGlQb2x5Z29uIj09PWEudHlwZSYmYS5jb29yZGluYXRlcyliKHRoaXMsYSk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShhKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuTXVsdGlQb2x5Z29uIjt0aGlzLmNvb3JkaW5hdGVzPWF9dGhpcy50eXBlPSJNdWx0aVBvbHlnb24ifWZ1bmN0aW9uIFIoYSl7aWYoYSYmIkZlYXR1cmUiPT09YS50eXBlJiZhLmdlb21ldHJ5KWIodGhpcyxhKTtlbHNle2lmKCEoYSYmYS50eXBlJiZhLmNvb3JkaW5hdGVzKSl0aHJvdyJUZXJyYWZvcm1lcjogaW52YWxpZCBpbnB1dCBmb3IgVGVycmFmb3JtZXIuRmVhdHVyZSI7dGhpcy5nZW9tZXRyeT1hfXRoaXMudHlwZT0iRmVhdHVyZSJ9ZnVuY3Rpb24gUyhhKXtpZihhJiYiRmVhdHVyZUNvbGxlY3Rpb24iPT09YS50eXBlJiZhLmZlYXR1cmVzKWIodGhpcyxhKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGEpKXRocm93IlRlcnJhZm9ybWVyOiBpbnZhbGlkIGlucHV0IGZvciBUZXJyYWZvcm1lci5GZWF0dXJlQ29sbGVjdGlvbiI7dGhpcy5mZWF0dXJlcz1hfXRoaXMudHlwZT0iRmVhdHVyZUNvbGxlY3Rpb24ifWZ1bmN0aW9uIFQoYSl7aWYoYSYmIkdlb21ldHJ5Q29sbGVjdGlvbiI9PT1hLnR5cGUmJmEuZ2VvbWV0cmllcyliKHRoaXMsYSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGEpKXRoaXMuZ2VvbWV0cmllcz1hO2Vsc2V7aWYoIWEuY29vcmRpbmF0ZXN8fCFhLnR5cGUpdGhyb3ciVGVycmFmb3JtZXI6IGludmFsaWQgaW5wdXQgZm9yIFRlcnJhZm9ybWVyLkdlb21ldHJ5Q29sbGVjdGlvbiI7dGhpcy50eXBlPSJHZW9tZXRyeUNvbGxlY3Rpb24iLHRoaXMuZ2VvbWV0cmllcz1bYV19dGhpcy50eXBlPSJHZW9tZXRyeUNvbGxlY3Rpb24ifWZ1bmN0aW9uIFUoYSxiLGMpe2Zvcih2YXIgZD1vKGEpLGU9Y3x8NjQsZj17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W1tdXX0sZz0xO2U+PWc7ZysrKXt2YXIgaD1nKigzNjAvZSkqTWF0aC5QSS8xODA7Zi5jb29yZGluYXRlc1swXS5wdXNoKFtkWzBdK2IqTWF0aC5jb3MoaCksZFsxXStiKk1hdGguc2luKGgpXSl9cmV0dXJuIHIoZil9ZnVuY3Rpb24gVihhLGMsZCl7dmFyIGU9ZHx8NjQsZj1jfHwyNTA7aWYoIWF8fGEubGVuZ3RoPDJ8fCFmfHwhZSl0aHJvdyBuZXcgRXJyb3IoIlRlcnJhZm9ybWVyOiBtaXNzaW5nIHBhcmFtZXRlciBmb3IgVGVycmFmb3JtZXIuQ2lyY2xlIik7Yih0aGlzLG5ldyBSKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTpVKGEsZixlKSxwcm9wZXJ0aWVzOntyYWRpdXM6ZixjZW50ZXI6YSxzdGVwczplfX0pKX12YXIgVz17fSxYPTYzNzgxMzcsWT01Ny4yOTU3Nzk1MTMwODIzMixaPS4wMTc0NTMyOTI1MTk5NDMsJD17dHlwZToibGluayIscHJvcGVydGllczp7aHJlZjoiaHR0cDovL3NwYXRpYWxyZWZlcmVuY2Uub3JnL3JlZi9zci1vcmcvNjkyOC9vZ2N3a3QvIix0eXBlOiJvZ2N3a3QifX0sXz17dHlwZToibGluayIscHJvcGVydGllczp7aHJlZjoiaHR0cDovL3NwYXRpYWxyZWZlcmVuY2Uub3JnL3JlZi9lcHNnLzQzMjYvb2djd2t0LyIsdHlwZToib2djd2t0In19LGFiPVsibGVuZ3RoIl07cmV0dXJuIEsucHJvdG90eXBlLnRvTWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKX0sSy5wcm90b3R5cGUudG9HZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcyl9LEsucHJvdG90eXBlLmVudmVsb3BlPWZ1bmN0aW9uKCl7cmV0dXJuIGkodGhpcyl9LEsucHJvdG90eXBlLmJib3g9ZnVuY3Rpb24oKXtyZXR1cm4gYyh0aGlzKX0sSy5wcm90b3R5cGUuY29udmV4SHVsbD1mdW5jdGlvbigpe3ZhciBhLGIsYz1bXTtpZigiUG9pbnQiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLmNvb3JkaW5hdGVzJiZ0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aD4wP1t0aGlzLmNvb3JkaW5hdGVzXTpbXTtpZigiTGluZVN0cmluZyI9PT10aGlzLnR5cGV8fCJNdWx0aVBvaW50Ij09PXRoaXMudHlwZSl7aWYoISh0aGlzLmNvb3JkaW5hdGVzJiZ0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aD4wKSlyZXR1cm5bXTtjPXRoaXMuY29vcmRpbmF0ZXN9ZWxzZSBpZigiUG9seWdvbiI9PT10aGlzLnR5cGV8fCJNdWx0aUxpbmVTdHJpbmciPT09dGhpcy50eXBlKXtpZighKHRoaXMuY29vcmRpbmF0ZXMmJnRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoPjApKXJldHVybltdO2ZvcihhPTA7YTx0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDthKyspYz1jLmNvbmNhdCh0aGlzLmNvb3JkaW5hdGVzW2FdKX1lbHNle2lmKCJNdWx0aVBvbHlnb24iIT09dGhpcy50eXBlKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGdldCBjb252ZXggaHVsbCBvZiAiK3RoaXMudHlwZSk7aWYoISh0aGlzLmNvb3JkaW5hdGVzJiZ0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aD4wKSlyZXR1cm5bXTtmb3IoYT0wO2E8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YSsrKWZvcihiPTA7Yjx0aGlzLmNvb3JkaW5hdGVzW2FdLmxlbmd0aDtiKyspYz1jLmNvbmNhdCh0aGlzLmNvb3JkaW5hdGVzW2FdW2JdKX1yZXR1cm4geChjKX0sSy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9e307Zm9yKHZhciBiIGluIHRoaXMpdGhpcy5oYXNPd25Qcm9wZXJ0eShiKSYmLTE9PT1hYi5pbmRleE9mKGIpJiYoYVtiXT10aGlzW2JdKTtyZXR1cm4gYS5iYm94PWModGhpcyksYX0sSy5wcm90b3R5cGUud2l0aGluPWZ1bmN0aW9uKGEpe3ZhciBiLGMsZDtpZigiUG9pbnQiPT09YS50eXBlJiYiUG9pbnQiPT09dGhpcy50eXBlKXJldHVybiBJKHRoaXMuY29vcmRpbmF0ZXMsYS5jb29yZGluYXRlcyk7aWYoIk11bHRpTGluZVN0cmluZyI9PT1hLnR5cGUmJiJQb2ludCI9PT10aGlzLnR5cGUpZm9yKGM9MDtjPGEuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKyl7dmFyIGU9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmEuY29vcmRpbmF0ZXNbY119O2lmKHRoaXMud2l0aGluKGUpKXJldHVybiEwfWlmKCgiTGluZVN0cmluZyI9PT1hLnR5cGV8fCJNdWx0aVBvaW50Ij09PWEudHlwZSkmJiJQb2ludCI9PT10aGlzLnR5cGUpZm9yKGM9MDtjPGEuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKyl7aWYodGhpcy5jb29yZGluYXRlcy5sZW5ndGghPT1hLmNvb3JkaW5hdGVzW2NdLmxlbmd0aClyZXR1cm4hMTtpZihJKHRoaXMuY29vcmRpbmF0ZXMsYS5jb29yZGluYXRlc1tjXSkpcmV0dXJuITB9aWYoIlBvbHlnb24iPT09YS50eXBlKXtpZigiUG9seWdvbiI9PT10aGlzLnR5cGUpe2lmKGEuY29vcmRpbmF0ZXMubGVuZ3RoPT09dGhpcy5jb29yZGluYXRlcy5sZW5ndGgpZm9yKGM9MDtjPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKylpZihKKHRoaXMuY29vcmRpbmF0ZXNbY10sYS5jb29yZGluYXRlc1tjXSkpcmV0dXJuITA7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoJiZ6KGEuY29vcmRpbmF0ZXMsdGhpcy5jb29yZGluYXRlc1swXVswXSk/IUQoSCh0aGlzLmNvb3JkaW5hdGVzKSxIKGEuY29vcmRpbmF0ZXMpKTohMX1pZigiUG9pbnQiPT09dGhpcy50eXBlKXJldHVybiB6KGEuY29vcmRpbmF0ZXMsdGhpcy5jb29yZGluYXRlcyk7aWYoIkxpbmVTdHJpbmciPT09dGhpcy50eXBlfHwiTXVsdGlQb2ludCI9PT10aGlzLnR5cGUpe2lmKCF0aGlzLmNvb3JkaW5hdGVzfHwwPT09dGhpcy5jb29yZGluYXRlcy5sZW5ndGgpcmV0dXJuITE7Zm9yKGM9MDtjPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKylpZih6KGEuY29vcmRpbmF0ZXMsdGhpcy5jb29yZGluYXRlc1tjXSk9PT0hMSlyZXR1cm4hMTtyZXR1cm4hMH1pZigiTXVsdGlMaW5lU3RyaW5nIj09PXRoaXMudHlwZSl7Zm9yKGM9MDtjPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKyl7dmFyIGY9bmV3IE4odGhpcy5jb29yZGluYXRlc1tjXSk7aWYoZi53aXRoaW4oYSk9PT0hMSlyZXR1cm4gZCsrLCExfXJldHVybiEwfWlmKCJNdWx0aVBvbHlnb24iPT09dGhpcy50eXBlKXtmb3IoYz0wO2M8dGhpcy5jb29yZGluYXRlcy5sZW5ndGg7YysrKXt2YXIgZz1uZXcgSyh7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6dGhpcy5jb29yZGluYXRlc1tjXX0pO2lmKGcud2l0aGluKGEpPT09ITEpcmV0dXJuITF9cmV0dXJuITB9fWlmKCJNdWx0aVBvbHlnb24iPT09YS50eXBlKXtpZigiUG9pbnQiPT09dGhpcy50eXBlKXtpZihhLmNvb3JkaW5hdGVzLmxlbmd0aClmb3IoYz0wO2M8YS5jb29yZGluYXRlcy5sZW5ndGg7YysrKWlmKGI9YS5jb29yZGluYXRlc1tjXSx6KGIsdGhpcy5jb29yZGluYXRlcykmJkQodGhpcy5jb29yZGluYXRlcyxhLmNvb3JkaW5hdGVzKT09PSExKXJldHVybiEwO3JldHVybiExfWlmKCJQb2x5Z29uIj09PXRoaXMudHlwZSl7Zm9yKGM9MDtjPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKylpZihhLmNvb3JkaW5hdGVzW2NdLmxlbmd0aD09PXRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoKWZvcihqPTA7ajx0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDtqKyspaWYoSih0aGlzLmNvb3JkaW5hdGVzW2pdLGEuY29vcmRpbmF0ZXNbY11bal0pKXJldHVybiEwO2lmKEYodGhpcy5jb29yZGluYXRlcyxhLmNvb3JkaW5hdGVzKT09PSExJiZhLmNvb3JkaW5hdGVzLmxlbmd0aCl7Zm9yKGM9MDtjPGEuY29vcmRpbmF0ZXMubGVuZ3RoO2MrKyliPWEuY29vcmRpbmF0ZXNbY10sZD16KGIsdGhpcy5jb29yZGluYXRlc1swXVswXSk9PT0hMT8hMTohMDtyZXR1cm4gZH19ZWxzZSBpZigiTGluZVN0cmluZyI9PT10aGlzLnR5cGV8fCJNdWx0aVBvaW50Ij09PXRoaXMudHlwZSlmb3IoYz0wO2M8YS5jb29yZGluYXRlcy5sZW5ndGg7YysrKXt2YXIgaD17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6YS5jb29yZGluYXRlc1tjXX07cmV0dXJuIHRoaXMud2l0aGluKGgpPyEwOiExfWVsc2V7aWYoIk11bHRpTGluZVN0cmluZyI9PT10aGlzLnR5cGUpe2ZvcihjPTA7Yzx0aGlzLmNvb3JkaW5hdGVzLmxlbmd0aDtjKyspe3ZhciBpPW5ldyBOKHRoaXMuY29vcmRpbmF0ZXNbY10pO2lmKGkud2l0aGluKGEpPT09ITEpcmV0dXJuITF9cmV0dXJuITB9aWYoIk11bHRpUG9seWdvbiI9PT10aGlzLnR5cGUpe2ZvcihjPTA7YzxhLmNvb3JkaW5hdGVzLmxlbmd0aDtjKyspe3ZhciBrPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczphLmNvb3JkaW5hdGVzW2NdfTtpZih0aGlzLndpdGhpbihrKT09PSExKXJldHVybiExfXJldHVybiEwfX19cmV0dXJuITF9LEsucHJvdG90eXBlLmludGVyc2VjdHM9ZnVuY3Rpb24oYil7IkZlYXR1cmUiPT09Yi50eXBlJiYoYj1iLmdlb21ldHJ5KTt2YXIgYz1uZXcgSyhiKTtpZih0aGlzLndpdGhpbihiKXx8Yy53aXRoaW4odGhpcykpcmV0dXJuITA7aWYoIkxpbmVTdHJpbmciPT09dGhpcy50eXBlKXtpZigiTGluZVN0cmluZyI9PT1iLnR5cGUpcmV0dXJuIEIodGhpcy5jb29yZGluYXRlcyxiLmNvb3JkaW5hdGVzKTtpZigiTXVsdGlMaW5lU3RyaW5nIj09PWIudHlwZSlyZXR1cm4gQyh0aGlzLmNvb3JkaW5hdGVzLGIuY29vcmRpbmF0ZXMpO2lmKCJQb2x5Z29uIj09PWIudHlwZSlyZXR1cm4gQyh0aGlzLmNvb3JkaW5hdGVzLEgoYi5jb29yZGluYXRlcykpO2lmKCJNdWx0aVBvbHlnb24iPT09Yi50eXBlKXJldHVybiBFKHRoaXMuY29vcmRpbmF0ZXMsYi5jb29yZGluYXRlcyl9ZWxzZSBpZigiTXVsdGlMaW5lU3RyaW5nIj09PXRoaXMudHlwZSl7aWYoIkxpbmVTdHJpbmciPT09Yi50eXBlKXJldHVybiBDKGIuY29vcmRpbmF0ZXMsdGhpcy5jb29yZGluYXRlcyk7aWYoIlBvbHlnb24iPT09Yi50eXBlfHwiTXVsdGlMaW5lU3RyaW5nIj09PWIudHlwZSlyZXR1cm4gRCh0aGlzLmNvb3JkaW5hdGVzLGIuY29vcmRpbmF0ZXMpO2lmKCJNdWx0aVBvbHlnb24iPT09Yi50eXBlKXJldHVybiBGKHRoaXMuY29vcmRpbmF0ZXMsYi5jb29yZGluYXRlcyl9ZWxzZSBpZigiUG9seWdvbiI9PT10aGlzLnR5cGUpe2lmKCJMaW5lU3RyaW5nIj09PWIudHlwZSlyZXR1cm4gQyhiLmNvb3JkaW5hdGVzLEgodGhpcy5jb29yZGluYXRlcykpO2lmKCJNdWx0aUxpbmVTdHJpbmciPT09Yi50eXBlKXJldHVybiBEKEgodGhpcy5jb29yZGluYXRlcyksYi5jb29yZGluYXRlcyk7aWYoIlBvbHlnb24iPT09Yi50eXBlKXJldHVybiBEKEgodGhpcy5jb29yZGluYXRlcyksSChiLmNvb3JkaW5hdGVzKSk7aWYoIk11bHRpUG9seWdvbiI9PT1iLnR5cGUpcmV0dXJuIEYoSCh0aGlzLmNvb3JkaW5hdGVzKSxiLmNvb3JkaW5hdGVzKX1lbHNlIGlmKCJNdWx0aVBvbHlnb24iPT09dGhpcy50eXBlKXtpZigiTGluZVN0cmluZyI9PT1iLnR5cGUpcmV0dXJuIEUoYi5jb29yZGluYXRlcyx0aGlzLmNvb3JkaW5hdGVzKTtpZigiUG9seWdvbiI9PT1iLnR5cGV8fCJNdWx0aUxpbmVTdHJpbmciPT09Yi50eXBlKXJldHVybiBGKEgoYi5jb29yZGluYXRlcyksdGhpcy5jb29yZGluYXRlcyk7aWYoIk11bHRpUG9seWdvbiI9PT1iLnR5cGUpcmV0dXJuIEcodGhpcy5jb29yZGluYXRlcyxiLmNvb3JkaW5hdGVzKX1lbHNlIGlmKCJGZWF0dXJlIj09PXRoaXMudHlwZSl7dmFyIGQ9bmV3IEsodGhpcy5nZW9tZXRyeSk7cmV0dXJuIGQuaW50ZXJzZWN0cyhiKX1yZXR1cm4gYSgiVHlwZSAiK3RoaXMudHlwZSsiIHRvICIrYi50eXBlKyIgaW50ZXJzZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgaW50ZXJzZWN0cyIpLCExfSxMLnByb3RvdHlwZT1uZXcgSyxMLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MLE0ucHJvdG90eXBlPW5ldyBLLE0ucHJvdG90eXBlLmNvbnN0cnVjdG9yPU0sTS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2IrKylhLmFwcGx5KHRoaXMsW3RoaXMuY29vcmRpbmF0ZXNbYl0sYix0aGlzLmNvb3JkaW5hdGVzXSk7cmV0dXJuIHRoaXN9LE0ucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVzLnB1c2goYSksdGhpc30sTS5wcm90b3R5cGUuaW5zZXJ0UG9pbnQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlcy5zcGxpY2UoYiwwLGEpLHRoaXN9LE0ucHJvdG90eXBlLnJlbW92ZVBvaW50PWZ1bmN0aW9uKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYT90aGlzLmNvb3JkaW5hdGVzLnNwbGljZShhLDEpOnRoaXMuY29vcmRpbmF0ZXMuc3BsaWNlKHRoaXMuY29vcmRpbmF0ZXMuaW5kZXhPZihhKSwxKSx0aGlzfSxNLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBMKHRoaXMuY29vcmRpbmF0ZXNbYV0pfSxOLnByb3RvdHlwZT1uZXcgSyxOLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OLE4ucHJvdG90eXBlLmFkZFZlcnRleD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb29yZGluYXRlcy5wdXNoKGEpLHRoaXN9LE4ucHJvdG90eXBlLmluc2VydFZlcnRleD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVzLnNwbGljZShiLDAsYSksdGhpc30sTi5wcm90b3R5cGUucmVtb3ZlVmVydGV4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVzLnNwbGljZShhLDEpLHRoaXN9LE8ucHJvdG90eXBlPW5ldyBLLE8ucHJvdG90eXBlLmNvbnN0cnVjdG9yPU8sTy5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2IrKylhLmFwcGx5KHRoaXMsW3RoaXMuY29vcmRpbmF0ZXNbYl0sYix0aGlzLmNvb3JkaW5hdGVzXSl9LE8ucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IE4odGhpcy5jb29yZGluYXRlc1thXSl9LFAucHJvdG90eXBlPW5ldyBLLFAucHJvdG90eXBlLmNvbnN0cnVjdG9yPVAsUC5wcm90b3R5cGUuYWRkVmVydGV4PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvb3JkaW5hdGVzWzBdLnB1c2goYSksdGhpc30sUC5wcm90b3R5cGUuaW5zZXJ0VmVydGV4PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXNbMF0uc3BsaWNlKGIsMCxhKSx0aGlzfSxQLnByb3RvdHlwZS5yZW1vdmVWZXJ0ZXg9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXNbMF0uc3BsaWNlKGEsMSksdGhpc30sUC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLmNvb3JkaW5hdGVzPUgodGhpcy5jb29yZGluYXRlcyl9LFEucHJvdG90eXBlPW5ldyBLLFEucHJvdG90eXBlLmNvbnN0cnVjdG9yPVEsUS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuY29vcmRpbmF0ZXMubGVuZ3RoO2IrKylhLmFwcGx5KHRoaXMsW3RoaXMuY29vcmRpbmF0ZXNbYl0sYix0aGlzLmNvb3JkaW5hdGVzXSl9LFEucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAodGhpcy5jb29yZGluYXRlc1thXSl9LFIucHJvdG90eXBlPW5ldyBLLFIucHJvdG90eXBlLmNvbnN0cnVjdG9yPVIsUy5wcm90b3R5cGU9bmV3IEssUy5wcm90b3R5cGUuY29uc3RydWN0b3I9UyxTLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5mZWF0dXJlcy5sZW5ndGg7YisrKWEuYXBwbHkodGhpcyxbdGhpcy5mZWF0dXJlc1tiXSxiLHRoaXMuZmVhdHVyZXNdKX0sUy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5pZD09PWEmJihiPWMpfSksbmV3IFIoYil9LFQucHJvdG90eXBlPW5ldyBLLFQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVQsVC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuZ2VvbWV0cmllcy5sZW5ndGg7YisrKWEuYXBwbHkodGhpcyxbdGhpcy5nZW9tZXRyaWVzW2JdLGIsdGhpcy5nZW9tZXRyaWVzXSl9LFQucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXtyZXR1cm4gbmV3IEsodGhpcy5nZW9tZXRyaWVzW2FdKX0sVi5wcm90b3R5cGU9bmV3IEssVi5wcm90b3R5cGUuY29uc3RydWN0b3I9VixWLnByb3RvdHlwZS5yZWNhbGN1bGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdlb21ldHJ5PVUodGhpcy5wcm9wZXJ0aWVzLmNlbnRlcix0aGlzLnByb3BlcnRpZXMucmFkaXVzLHRoaXMucHJvcGVydGllcy5zdGVwcyksdGhpc30sVi5wcm90b3R5cGUuY2VudGVyPWZ1bmN0aW9uKGEpe3JldHVybiBhJiYodGhpcy5wcm9wZXJ0aWVzLmNlbnRlcj1hLHRoaXMucmVjYWxjdWxhdGUoKSksdGhpcy5wcm9wZXJ0aWVzLmNlbnRlcn0sVi5wcm90b3R5cGUucmFkaXVzPWZ1bmN0aW9uKGEpe3JldHVybiBhJiYodGhpcy5wcm9wZXJ0aWVzLnJhZGl1cz1hLHRoaXMucmVjYWxjdWxhdGUoKSksdGhpcy5wcm9wZXJ0aWVzLnJhZGl1c30sVi5wcm90b3R5cGUuc3RlcHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJih0aGlzLnByb3BlcnRpZXMuc3RlcHM9YSx0aGlzLnJlY2FsY3VsYXRlKCkpLHRoaXMucHJvcGVydGllcy5zdGVwc30sVi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9Sy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIGF9LFcuUHJpbWl0aXZlPUssVy5Qb2ludD1MLFcuTXVsdGlQb2ludD1NLFcuTGluZVN0cmluZz1OLFcuTXVsdGlMaW5lU3RyaW5nPU8sVy5Qb2x5Z29uPVAsVy5NdWx0aVBvbHlnb249USxXLkZlYXR1cmU9UixXLkZlYXR1cmVDb2xsZWN0aW9uPVMsVy5HZW9tZXRyeUNvbGxlY3Rpb249VCxXLkNpcmNsZT1WLFcudG9NZXJjYXRvcj1xLFcudG9HZW9ncmFwaGljPXIsVy5Ub29scz17fSxXLlRvb2xzLnBvc2l0aW9uVG9NZXJjYXRvcj1vLFcuVG9vbHMucG9zaXRpb25Ub0dlb2dyYXBoaWM9bixXLlRvb2xzLmFwcGx5Q29udmVydGVyPXAsVy5Ub29scy50b01lcmNhdG9yPXEsVy5Ub29scy50b0dlb2dyYXBoaWM9cixXLlRvb2xzLmNyZWF0ZUNpcmNsZT1VLFcuVG9vbHMuY2FsY3VsYXRlQm91bmRzPWMsVy5Ub29scy5jYWxjdWxhdGVFbnZlbG9wZT1pLFcuVG9vbHMuY29vcmRpbmF0ZXNDb250YWluUG9pbnQ9eSxXLlRvb2xzLnBvbHlnb25Db250YWluc1BvaW50PXosVy5Ub29scy5hcnJheUludGVyc2VjdHNBcnJheT1CLFcuVG9vbHMuY29vcmRpbmF0ZXNDb250YWluUG9pbnQ9eSxXLlRvb2xzLmNvb3JkaW5hdGVzRXF1YWw9SixXLlRvb2xzLmNvbnZleEh1bGw9eCxXLk1lcmNhdG9yQ1JTPSQsVy5HZW9ncmFwaGljQ1JTPV8sV30pLGZ1bmN0aW9uKGEsYil7aWYoIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHMmJihleHBvcnRzPW1vZHVsZS5leHBvcnRzPWIocmVxdWlyZSgidGVycmFmb3JtZXIiKSkpLCJvYmplY3QiPT10eXBlb2YgYS5uYXZpZ2F0b3Ipe2lmKCFhLlRlcnJhZm9ybWVyKXRocm93IG5ldyBFcnJvcigiVGVycmFmb3JtZXIuQXJjR0lTIHJlcXVpcmVzIHRoZSBjb3JlIFRlcnJhZm9ybWVyIGxpYnJhcnkuIGh0dHBzOi8vZ2l0aHViLmNvbS9lc3JpL1RlcnJhZm9ybWVyIik7YS5UZXJyYWZvcm1lci5BcmNHSVM9YihhLlRlcnJhZm9ybWVyKX19KHRoaXMsZnVuY3Rpb24oVGVycmFmb3JtZXIpe2Z1bmN0aW9uIGEoYSl7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmKGJbY109YVtjXSk7cmV0dXJuIGJ9ZnVuY3Rpb24gYihhKXt2YXIgYixjPTAsZD0wLGU9YS5sZW5ndGgsZj1hW2RdO2ZvcihkO2UtMT5kO2QrKyliPWFbZCsxXSxjKz0oYlswXS1mWzBdKSooYlsxXStmWzFdKSxmPWI7cmV0dXJuIGM+PTB9ZnVuY3Rpb24gYyhhKXt2YXIgYz1bXSxkPWEuc2xpY2UoMCksZT1kLnNoaWZ0KCkuc2xpY2UoMCk7YihlKXx8ZS5yZXZlcnNlKCksYy5wdXNoKGUpO2Zvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgZz1kW2ZdLnNsaWNlKDApO2IoZykmJmcucmV2ZXJzZSgpLGMucHVzaChnKX1yZXR1cm4gY31mdW5jdGlvbiBkKGEpe2Zvcih2YXIgYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspZm9yKHZhciBlPWMoYVtkXSksZj1lLmxlbmd0aC0xO2Y+PTA7Zi0tKXt2YXIgZz1lW2ZdLnNsaWNlKDApO2IucHVzaChnKX1yZXR1cm4gYn1mdW5jdGlvbiBlKGEsYil7dmFyIGM9VGVycmFmb3JtZXIuVG9vbHMuYXJyYXlJbnRlcnNlY3RzQXJyYXkoYSxiKSxkPVRlcnJhZm9ybWVyLlRvb2xzLmNvb3JkaW5hdGVzQ29udGFpblBvaW50KGEsYlswXSk7cmV0dXJuIWMmJmQ/ITA6ITF9ZnVuY3Rpb24gZihhKXtmb3IodmFyIGM9W10sZD1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspe3ZhciBnPWFbZl0uc2xpY2UoMCk7aWYoYihnKSl7dmFyIGg9W2ddO2MucHVzaChoKX1lbHNlIGQucHVzaChnKX1mb3IoO2QubGVuZ3RoOyl7Zm9yKHZhciBpPWQucG9wKCksaj0hMSxrPWMubGVuZ3RoLTE7az49MDtrLS0pe3ZhciBsPWNba11bMF07aWYoZShsLGkpKXtjW2tdLnB1c2goaSksaj0hMDticmVha319anx8Yy5wdXNoKFtpLnJldmVyc2UoKV0pfXJldHVybiAxPT09Yy5sZW5ndGg/e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOmNbMF19Ont0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOmN9fWZ1bmN0aW9uIGcoYil7dmFyIGM9e307Yi54JiZiLnkmJihjLnR5cGU9IlBvaW50IixjLmNvb3JkaW5hdGVzPVtiLngsYi55XSksYi5wb2ludHMmJihjLnR5cGU9Ik11bHRpUG9pbnQiLGMuY29vcmRpbmF0ZXM9Yi5wb2ludHMuc2xpY2UoMCkpLGIucGF0aHMmJigxPT09Yi5wYXRocy5sZW5ndGg/KGMudHlwZT0iTGluZVN0cmluZyIsYy5jb29yZGluYXRlcz1iLnBhdGhzWzBdLnNsaWNlKDApKTooYy50eXBlPSJNdWx0aUxpbmVTdHJpbmciLGMuY29vcmRpbmF0ZXM9Yi5wYXRocy5zbGljZSgwKSkpLGIucmluZ3MmJihjPWYoYi5yaW5ncy5zbGljZSgwKSkpLGIuZ2VvbWV0cnkmJihjLnR5cGU9IkZlYXR1cmUiLGMuZ2VvbWV0cnk9ZyhiLmdlb21ldHJ5KSxjLnByb3BlcnRpZXM9YShiLmF0dHJpYnV0ZXMpfHx7fSk7dmFyIGQ9Yi5nZW9tZXRyeT9iLmdlb21ldHJ5LnNwYXRpYWxSZWZlcmVuY2U6Yi5zcGF0aWFsUmVmZXJlbmNlO3JldHVybiBkJiYxMDIxMDA9PT1kLndraWQmJihjPVRlcnJhZm9ybWVyLnRvR2VvZ3JhcGhpYyhjKSksbmV3IFRlcnJhZm9ybWVyLlByaW1pdGl2ZShjKX1mdW5jdGlvbiBoKGIsZSl7dmFyIGY7Zj1lP2U6YiYmYi5jcnM9PT1UZXJyYWZvcm1lci5NZXJjYXRvckNSUz97d2tpZDoxMDIxMDB9Ont3a2lkOjQzMjZ9O3ZhciBnLGk9e307c3dpdGNoKGIudHlwZSl7Y2FzZSJQb2ludCI6aS54PWIuY29vcmRpbmF0ZXNbMF0saS55PWIuY29vcmRpbmF0ZXNbMV0saS5zcGF0aWFsUmVmZXJlbmNlPWY7YnJlYWs7Y2FzZSJNdWx0aVBvaW50IjppLnBvaW50cz1iLmNvb3JkaW5hdGVzLnNsaWNlKDApLGkuc3BhdGlhbFJlZmVyZW5jZT1mO2JyZWFrO2Nhc2UiTGluZVN0cmluZyI6aS5wYXRocz1bYi5jb29yZGluYXRlcy5zbGljZSgwKV0saS5zcGF0aWFsUmVmZXJlbmNlPWY7YnJlYWs7Y2FzZSJNdWx0aUxpbmVTdHJpbmciOmkucGF0aHM9Yi5jb29yZGluYXRlcy5zbGljZSgwKSxpLnNwYXRpYWxSZWZlcmVuY2U9ZjticmVhaztjYXNlIlBvbHlnb24iOmkucmluZ3M9YyhiLmNvb3JkaW5hdGVzLnNsaWNlKDApKSxpLnNwYXRpYWxSZWZlcmVuY2U9ZjticmVhaztjYXNlIk11bHRpUG9seWdvbiI6aS5yaW5ncz1kKGIuY29vcmRpbmF0ZXMuc2xpY2UoMCkpLGkuc3BhdGlhbFJlZmVyZW5jZT1mO2JyZWFrO2Nhc2UiRmVhdHVyZSI6aS5nZW9tZXRyeT1oKGIuZ2VvbWV0cnkpLGkuYXR0cmlidXRlcz1hKGIucHJvcGVydGllcyk7YnJlYWs7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6Zm9yKGk9W10sZz0wO2c8Yi5mZWF0dXJlcy5sZW5ndGg7ZysrKWkucHVzaChoKGIuZmVhdHVyZXNbZ10pKTticmVhaztjYXNlIkdlb21ldHJ5Q29sbGVjdGlvbiI6Zm9yKGk9W10sZz0wO2c8Yi5nZW9tZXRyaWVzLmxlbmd0aDtnKyspaS5wdXNoKGgoYi5nZW9tZXRyaWVzW2ddKSl9cmV0dXJuIGl9dmFyIGk9e307cmV0dXJuIGkucGFyc2U9ZyxpLmNvbnZlcnQ9aCxpLnRvR2VvSlNPTj1nLGkuZnJvbUdlb0pTT049aCxpfSksZnVuY3Rpb24oYSxiKXtpZigib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cyYmKGV4cG9ydHM9bW9kdWxlLmV4cG9ydHM9YihyZXF1aXJlKCJ0ZXJyYWZvcm1lciIpKSksIm9iamVjdCI9PXR5cGVvZiBhLm5hdmlnYXRvcil7aWYoIWEuVGVycmFmb3JtZXIpdGhyb3cgbmV3IEVycm9yKCJUZXJyYWZvcm1lci5SVHJlZSByZXF1aXJlcyB0aGUgY29yZSBUZXJyYWZvcm1lciBsaWJyYXJ5LiBodHRwczovL2dpdGh1Yi5jb20vZXNyaS9UZXJyYWZvcm1lciIpO2EuVGVycmFmb3JtZXIuUlRyZWU9YihhLlRlcnJhZm9ybWVyKS5SVHJlZX19KHRoaXMsZnVuY3Rpb24oVGVycmFmb3JtZXIpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX12YXIgYj17fSxjPWZ1bmN0aW9uKGIpe3ZhciBkPTMsZT02O2lzTmFOKGIpfHwoZD1NYXRoLmZsb29yKGIvMiksZT1iKSx0aGlzLm1pbl93aWR0aD1kLHRoaXMubWF4X3dpZHRoPWU7dmFyIGY9e3g6MCx5OjAsdzowLGg6MCxpZDoicm9vdCIsbm9kZXM6W119OyFmdW5jdGlvbigpe3ZhciBhPXt9O3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz0wO3JldHVybiBiIGluIGE/Yz1hW2JdKys6YVtiXT0wLGIrIl8iK2N9fSgpLGMuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW89ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPShhK2IpLzIsZT1hKmIsZj1lLyhkKmQpO3JldHVybiBlKmMvZn07dmFyIGc9ZnVuY3Rpb24oYSxiLGUpe3ZhciBmPVtdLGc9W10saD1bXSxpPTE7aWYoIWF8fCFjLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShhLGUpKXJldHVybiBoO3ZhciBqPXt4OmEueCx5OmEueSx3OmEudyxoOmEuaCx0YXJnZXQ6Yn07Zy5wdXNoKGUubm9kZXMubGVuZ3RoKSxmLnB1c2goZSk7ZG97dmFyIGs9Zi5wb3AoKSxsPWcucG9wKCktMTtpZigidGFyZ2V0ImluIGopZm9yKDtsPj0wOyl7dmFyIG49ay5ub2Rlc1tsXTtpZihjLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShqLG4pKXtpZihqLnRhcmdldCYmImxlYWYiaW4gbiYmbi5sZWFmPT09ai50YXJnZXR8fCFqLnRhcmdldCYmKCJsZWFmImluIG58fGMuUmVjdGFuZ2xlLmNvbnRhaW5zX3JlY3RhbmdsZShuLGopKSl7Im5vZGVzImluIG4/KGg9bShuLCEwLFtdLG4pLGsubm9kZXMuc3BsaWNlKGwsMSkpOmg9ay5ub2Rlcy5zcGxpY2UobCwxKSxjLlJlY3RhbmdsZS5tYWtlX01CUihrLm5vZGVzLGspLGRlbGV0ZSBqLnRhcmdldCxrLm5vZGVzLmxlbmd0aDxkJiYoai5ub2Rlcz1tKGssITAsW10saykpO2JyZWFrfSJub2RlcyJpbiBuJiYoaSs9MSxnLnB1c2gobCksZi5wdXNoKGspLGs9bixsPW4ubm9kZXMubGVuZ3RoKX1sLT0xfWVsc2UgaWYoIm5vZGVzImluIGope2subm9kZXMuc3BsaWNlKGwrMSwxKSxrLm5vZGVzLmxlbmd0aD4wJiZjLlJlY3RhbmdsZS5tYWtlX01CUihrLm5vZGVzLGspO2Zvcih2YXIgcD0wO3A8ai5ub2Rlcy5sZW5ndGg7cCsrKW8oai5ub2Rlc1twXSxrKTtqLm5vZGVzLmxlbmd0aD0wLDA9PT1mLmxlbmd0aCYmay5ub2Rlcy5sZW5ndGg8PTE/KGoubm9kZXM9bShrLCEwLGoubm9kZXMsayksay5ub2Rlcy5sZW5ndGg9MCxmLnB1c2goayksZy5wdXNoKDEpKTpmLmxlbmd0aD4wJiZrLm5vZGVzLmxlbmd0aDxkPyhqLm5vZGVzPW0oaywhMCxqLm5vZGVzLGspLGsubm9kZXMubGVuZ3RoPTApOmRlbGV0ZSBqLm5vZGVzfWVsc2UgYy5SZWN0YW5nbGUubWFrZV9NQlIoay5ub2RlcyxrKTtpLT0xfXdoaWxlKGYubGVuZ3RoPjApO3JldHVybiBofSxoPWZ1bmN0aW9uKGEsYil7dmFyIGQsZT0tMSxmPVtdO2YucHVzaChiKTt2YXIgZz1iLm5vZGVzO2Rvey0xIT09ZSYmKGYucHVzaChnW2VdKSxnPWdbZV0ubm9kZXMsZT0tMSk7Zm9yKHZhciBoPWcubGVuZ3RoLTE7aD49MDtoLS0pe3ZhciBpPWdbaF07aWYoImxlYWYiaW4gaSl7ZT0tMTticmVha312YXIgaj1jLlJlY3RhbmdsZS5zcXVhcmlmaWVkX3JhdGlvKGkudyxpLmgsaS5ub2Rlcy5sZW5ndGgrMSksaz1NYXRoLm1heChpLngraS53LGEueCthLncpLU1hdGgubWluKGkueCxhLngpLGw9TWF0aC5tYXgoaS55K2kuaCxhLnkrYS5oKS1NYXRoLm1pbihpLnksYS55KSxtPWMuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8oayxsLGkubm9kZXMubGVuZ3RoKzIpOygwPmV8fE1hdGguYWJzKG0taik8ZCkmJihkPU1hdGguYWJzKG0taiksZT1oKX19d2hpbGUoLTEhPT1lKTtyZXR1cm4gZn0saT1mdW5jdGlvbihhKXtmb3IodmFyIGI9ayhhKTthLmxlbmd0aD4wOylqKGEsYlswXSxiWzFdKTtyZXR1cm4gYn0saj1mdW5jdGlvbihhLGIsZSl7Zm9yKHZhciBmLGcsaCxpPWMuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8oYi53LGIuaCxiLm5vZGVzLmxlbmd0aCsxKSxqPWMuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8oZS53LGUuaCxlLm5vZGVzLmxlbmd0aCsxKSxrPWEubGVuZ3RoLTE7az49MDtrLS0pe3ZhciBsPWFba10sbT17fTttLng9TWF0aC5taW4oYi54LGwueCksbS55PU1hdGgubWluKGIueSxsLnkpLG0udz1NYXRoLm1heChiLngrYi53LGwueCtsLncpLW0ueCxtLmg9TWF0aC5tYXgoYi55K2IuaCxsLnkrbC5oKS1tLnk7dmFyIG49TWF0aC5hYnMoYy5SZWN0YW5nbGUuc3F1YXJpZmllZF9yYXRpbyhtLncsbS5oLGIubm9kZXMubGVuZ3RoKzIpLWkpLG89e307by54PU1hdGgubWluKGUueCxsLngpLG8ueT1NYXRoLm1pbihlLnksbC55KSxvLnc9TWF0aC5tYXgoZS54K2UudyxsLngrbC53KS1vLngsby5oPU1hdGgubWF4KGUueStlLmgsbC55K2wuaCktby55O3ZhciBwPU1hdGguYWJzKGMuUmVjdGFuZ2xlLnNxdWFyaWZpZWRfcmF0aW8oby53LG8uaCxlLm5vZGVzLmxlbmd0aCsyKS1qKTsoIWd8fCFmfHxNYXRoLmFicyhwLW4pPGYpJiYoZz1rLGY9TWF0aC5hYnMocC1uKSxoPW4+cD9lOmIpfXZhciBxPWEuc3BsaWNlKGcsMSlbMF07Yi5ub2Rlcy5sZW5ndGgrYS5sZW5ndGgrMTw9ZD8oYi5ub2Rlcy5wdXNoKHEpLGMuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoYixxKSk6ZS5ub2Rlcy5sZW5ndGgrYS5sZW5ndGgrMTw9ZD8oZS5ub2Rlcy5wdXNoKHEpLGMuUmVjdGFuZ2xlLmV4cGFuZF9yZWN0YW5nbGUoZSxxKSk6KGgubm9kZXMucHVzaChxKSxjLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGgscSkpfSxrPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5sZW5ndGgtMSxlPTAsZj1hLmxlbmd0aC0xLGc9MCxoPWEubGVuZ3RoLTI7aD49MDtoLS0pe3ZhciBpPWFbaF07aS54PmFbZV0ueD9lPWg6aS54K2kudzxhW2RdLngrYVtkXS53JiYoZD1oKSxpLnk+YVtnXS55P2c9aDppLnkraS5oPGFbZl0ueSthW2ZdLmgmJihmPWgpfXZhciBqPU1hdGguYWJzKGFbZF0ueCthW2RdLnctYVtlXS54KSxrPU1hdGguYWJzKGFbZl0ueSthW2ZdLmgtYVtnXS55KTtyZXR1cm4gaj5rP2Q+ZT8oYj1hLnNwbGljZShkLDEpWzBdLGM9YS5zcGxpY2UoZSwxKVswXSk6KGM9YS5zcGxpY2UoZSwxKVswXSxiPWEuc3BsaWNlKGQsMSlbMF0pOmY+Zz8oYj1hLnNwbGljZShmLDEpWzBdLGM9YS5zcGxpY2UoZywxKVswXSk6KGM9YS5zcGxpY2UoZywxKVswXSxiPWEuc3BsaWNlKGYsMSlbMF0pLFt7eDpiLngseTpiLnksdzpiLncsaDpiLmgsbm9kZXM6W2JdfSx7eDpjLngseTpjLnksdzpjLncsaDpjLmgsbm9kZXM6W2NdfV19LGw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2Rlcz1iLm5vZGVzLGEueD1iLngsYS55PWIueSxhLnc9Yi53LGEuaD1iLmgsYX0sbT1mdW5jdGlvbihhLGIsZCxlKXt2YXIgZj1bXTtpZighYy5SZWN0YW5nbGUub3ZlcmxhcF9yZWN0YW5nbGUoYSxlKSlyZXR1cm4gZDtmLnB1c2goZS5ub2Rlcyk7ZG8gZm9yKHZhciBnPWYucG9wKCksaD1nLmxlbmd0aC0xO2g+PTA7aC0tKXt2YXIgaT1nW2hdO2MuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKGEsaSkmJigibm9kZXMiaW4gaT9mLnB1c2goaS5ub2Rlcyk6ImxlYWYiaW4gaSYmKGI/ZC5wdXNoKGkpOmQucHVzaChpLmxlYWYpKSl9d2hpbGUoZi5sZW5ndGg+MCk7cmV0dXJuIGR9LG49ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGY9W107aWYoIWMuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlKGUsYSkpcmV0dXJuIGQ7Zi5wdXNoKGUubm9kZXMpO2RvIGZvcih2YXIgZz1mLnBvcCgpLGg9Zy5sZW5ndGgtMTtoPj0wO2gtLSl7dmFyIGk9Z1toXTtjLlJlY3RhbmdsZS5vdmVybGFwX3JlY3RhbmdsZShpLGEpJiYoIm5vZGVzImluIGk/Zi5wdXNoKGkubm9kZXMpOiJsZWFmImluIGkmJihiP2QucHVzaChpKTpkLnB1c2goaS5sZWFmKSkpfXdoaWxlKGYubGVuZ3RoPjApO3JldHVybiBkfSxvPWZ1bmN0aW9uKGIsZCl7dmFyIGY7aWYoMD09PWQubm9kZXMubGVuZ3RoKXJldHVybiBkLng9Yi54LGQueT1iLnksZC53PWIudyxkLmg9Yi5oLGQubm9kZXMucHVzaChiKSx2b2lkIDA7dmFyIGc9aChiLGQpLGo9Yjtkb3tpZihmJiYibm9kZXMiaW4gZiYmMD09PWYubm9kZXMubGVuZ3RoKXt2YXIgaz1mO2Y9Zy5wb3AoKTtmb3IodmFyIGw9MDtsPGYubm9kZXMubGVuZ3RoO2wrKylpZihmLm5vZGVzW2xdPT09a3x8MD09PWYubm9kZXNbbF0ubm9kZXMubGVuZ3RoKXtmLm5vZGVzLnNwbGljZShsLDEpO2JyZWFrfX1lbHNlIGY9Zy5wb3AoKTtpZigibGVhZiJpbiBqfHwibm9kZXMiaW4ganx8YShqKSl7aWYoYShqKSl7Zm9yKHZhciBtPTA7bTxqLmxlbmd0aDttKyspYy5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShmLGpbbV0pO2Yubm9kZXM9Zi5ub2Rlcy5jb25jYXQoail9ZWxzZSBjLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlKGYsaiksZi5ub2Rlcy5wdXNoKGopO2lmKGYubm9kZXMubGVuZ3RoPD1lKWo9e3g6Zi54LHk6Zi55LHc6Zi53LGg6Zi5ofTtlbHNle3ZhciBuPWkoZi5ub2Rlcyk7aj1uLGcubGVuZ3RoPDEmJihmLm5vZGVzLnB1c2goblswXSksZy5wdXNoKGYpLGo9blsxXSl9fWVsc2UgYy5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShmLGopLGo9e3g6Zi54LHk6Zi55LHc6Zi53LGg6Zi5ofX13aGlsZShnLmxlbmd0aD4wKX07dGhpcy5zZXJpYWxpemU9ZnVuY3Rpb24oYSl7YShudWxsLGYpfSx0aGlzLmRlc2VyaWFsaXplPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3N3aXRjaChkLmxlbmd0aCl7Y2FzZSAxOmI9ZjticmVhaztjYXNlIDI6ImZ1bmN0aW9uIj09dHlwZW9mIGRbMV0mJihiPWYsYz1kWzFdKX12YXIgZT1sKGIsYSk7YyYmYyhudWxsLGUpfSx0aGlzLnNlYXJjaD1mdW5jdGlvbihhLGIpe3ZhciBjO2lmKGEudHlwZSl7dmFyIGQ9VGVycmFmb3JtZXIuVG9vbHMuY2FsY3VsYXRlQm91bmRzKGEpO2M9e3g6ZFswXSx5OmRbMV0sdzpNYXRoLmFicyhkWzBdLWRbMl0pLGg6TWF0aC5hYnMoZFsxXS1kWzNdKX19ZWxzZSBjPWE7dmFyIGU9W2MsITEsW10sZl07aWYodm9pZCAwPT09Yyl0aHJvdyJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiBSVC5TZWFyY2ggcmVxdWlyZXMgYXQgbGVhc3QgYSBib3VuZGluZyByZWN0YW5nbGUuIjt2YXIgZz1tLmFwcGx5KHRoaXMsZSk7YiYmYihudWxsLGcpfSx0aGlzLndpdGhpbj1mdW5jdGlvbihhLGIpe3ZhciBjO2lmKGEudHlwZSl7dmFyIGQ9VGVycmFmb3JtZXIuVG9vbHMuY2FsY3VsYXRlQm91bmRzKGEpO2M9e3g6ZFswXSx5OmRbMV0sdzpNYXRoLmFicyhkWzBdLWRbMl0pLGg6TWF0aC5hYnMoZFsxXS1kWzNdKX19ZWxzZSBjPWE7dmFyIGU9W2MsITEsW10sZl07aWYodm9pZCAwPT09Yyl0aHJvdyJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLiBSVC5TZWFyY2ggcmVxdWlyZXMgYXQgbGVhc3QgYSBib3VuZGluZyByZWN0YW5nbGUuIjt2YXIgZz1uLmFwcGx5KHRoaXMsZSk7YiYmYihudWxsLGcpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtpZigxPT09ZC5sZW5ndGgmJmQucHVzaCghMSksMz09PWQubGVuZ3RoJiYoYz1kLnBvcCgpKSxkJiZkWzBdJiZkWzBdLnR5cGUpe3ZhciBlPVRlcnJhZm9ybWVyLlRvb2xzLmNhbGN1bGF0ZUJvdW5kcyhkWzBdKTtkWzBdPXt4OmVbMF0seTplWzFdLHc6TWF0aC5hYnMoZVswXS1lWzJdKSxoOk1hdGguYWJzKGVbMV0tZVszXSl9fWlmKGQucHVzaChmKSxiPT09ITEpe3ZhciBoPTAsaT1bXTtkbyBoPWkubGVuZ3RoLGk9aS5jb25jYXQoZy5hcHBseSh0aGlzLGQpKTt3aGlsZShoIT09aS5sZW5ndGgpO2MmJmMobnVsbCxpKX1lbHNle3ZhciBqPWcuYXBwbHkodGhpcyxkKTtjJiZjKG51bGwsail9fSx0aGlzLmluc2VydD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7aWYoYS50eXBlKXt2YXIgZT1UZXJyYWZvcm1lci5Ub29scy5jYWxjdWxhdGVCb3VuZHMoYSk7ZD17eDplWzBdLHk6ZVsxXSx3Ok1hdGguYWJzKGVbMF0tZVsyXSksaDpNYXRoLmFicyhlWzFdLWVbM10pfX1lbHNlIGQ9YTtpZihhcmd1bWVudHMubGVuZ3RoPDIpdGhyb3ciV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4gUlQuSW5zZXJ0IHJlcXVpcmVzIGF0IGxlYXN0IGEgYm91bmRpbmcgcmVjdGFuZ2xlIG9yIEdlb0pTT04gYW5kIGFuIG9iamVjdC4iO3ZhciBnPW8oe3g6ZC54LHk6ZC55LHc6ZC53LGg6ZC5oLGxlYWY6Yn0sZik7YyYmYyhudWxsLGcpfX07cmV0dXJuIGMuUmVjdGFuZ2xlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksajthLng/KGU9YS54LGc9YS55LDAhPT1hLncmJiFhLncmJmEueDI/KGk9YS54Mi1hLngsaj1hLnkyLWEueSk6KGk9YS53LGo9YS5oKSxmPWUraSxoPWcraik6KGU9YSxnPWIsaT1jLGo9ZCxmPWUraSxoPWcraiksdGhpcy54MT10aGlzLng9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sdGhpcy55MT10aGlzLnk9ZnVuY3Rpb24oKXtyZXR1cm4gZ30sdGhpcy54Mj1mdW5jdGlvbigpe3JldHVybiBmfSx0aGlzLnkyPWZ1bmN0aW9uKCl7cmV0dXJuIGh9LHRoaXMudz1mdW5jdGlvbigpe3JldHVybiBpfSx0aGlzLmg9ZnVuY3Rpb24oKXtyZXR1cm4gan0sdGhpcy50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4neyJ4IjonK2UudG9TdHJpbmcoKSsnLCAieSI6JytnLnRvU3RyaW5nKCkrJywgInciOicraS50b1N0cmluZygpKycsICJoIjonK2oudG9TdHJpbmcoKSsifSJ9LHRoaXMub3ZlcmxhcD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KCk8YS54MigpJiZ0aGlzLngyKCk+YS54KCkmJnRoaXMueSgpPGEueTIoKSYmdGhpcy55MigpPmEueSgpfSx0aGlzLmV4cGFuZD1mdW5jdGlvbihhKXt2YXIgYj1NYXRoLm1pbih0aGlzLngoKSxhLngoKSksYz1NYXRoLm1pbih0aGlzLnkoKSxhLnkoKSk7cmV0dXJuIGk9TWF0aC5tYXgodGhpcy54MigpLGEueDIoKSktYixqPU1hdGgubWF4KHRoaXMueTIoKSxhLnkyKCkpLWMsZT1iLGc9Yyx0aGlzfSx0aGlzLnNldFJlY3Q9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqO2EueD8oZT1hLngsZz1hLnksMCE9PWEudyYmIWEudyYmYS54Mj8oaT1hLngyLWEueCxqPWEueTItYS55KTooaT1hLncsaj1hLmgpLGY9ZStpLGg9ZytqKTooZT1hLGc9YixpPWMsaj1kLGY9ZStpLGg9ZytqKX19LGMuUmVjdGFuZ2xlLm92ZXJsYXBfcmVjdGFuZ2xlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEueDxiLngrYi53JiZhLngrYS53PmIueCYmYS55PGIueStiLmgmJmEueSthLmg+Yi55fSxjLlJlY3RhbmdsZS5jb250YWluc19yZWN0YW5nbGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS54K2Eudzw9Yi54K2IudyYmYS54Pj1iLngmJmEueSthLmg8PWIueStiLmgmJmEueT49Yi55fSxjLlJlY3RhbmdsZS5leHBhbmRfcmVjdGFuZ2xlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtyZXR1cm4gYz1hLng8Yi54P2EueDpiLngsZD1hLnk8Yi55P2EueTpiLnksYS53PWEueCthLnc+Yi54K2Iudz9hLngrYS53LWM6Yi54K2Iudy1jLGEuaD1hLnkrYS5oPmIueStiLmg/YS55K2EuaC1kOmIueStiLmgtZCxhLng9YyxhLnk9ZCxhfSxjLlJlY3RhbmdsZS5tYWtlX01CUj1mdW5jdGlvbihhLGIpe2lmKGEubGVuZ3RoPDEpcmV0dXJue3g6MCx5OjAsdzowLGg6MH07Yj8oYi54PWFbMF0ueCxiLnk9YVswXS55LGIudz1hWzBdLncsYi5oPWFbMF0uaCk6Yj17eDphWzBdLngseTphWzBdLnksdzphWzBdLncsaDphWzBdLmh9O2Zvcih2YXIgZD1hLmxlbmd0aC0xO2Q+MDtkLS0pYy5SZWN0YW5nbGUuZXhwYW5kX3JlY3RhbmdsZShiLGFbZF0pO3JldHVybiBifSxiLlJUcmVlPWMsYn0pLEwuZXNyaT17X2NhbGxiYWNrOnt9fSxMLmVzcmkuU3VwcG9ydD17Q09SUzohISh3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KX0sTC5lc3JpLlJlcXVlc3RIYW5kbGVycz17Q09SUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5mPSJqc29uIixlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBhO2lmKDQ9PT1lLnJlYWR5U3RhdGUpe3RyeXthPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe2E9e2Vycm9yOiJDb3VsZCBub3QgcGFyc2UgcmVzcG9uc2UgYXMgSlNPTi4ifX1kP2MuY2FsbChkLGEpOmMoYSl9fSxlLm9wZW4oIkdFVCIsYStMLmVzcmkuVXRpbC5zZXJpYWxpemUoYiksITApLGUuc2VuZChudWxsKX0sSlNPTlA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ImMiKygxZTkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoIi4iLCJfIik7Yi5mPSJqc29uIixiLmNhbGxiYWNrPSJMLmVzcmkuX2NhbGxiYWNrLiIrZTt2YXIgZj1MLkRvbVV0aWwuY3JlYXRlKCJzY3JpcHQiLG51bGwsZG9jdW1lbnQuYm9keSk7Zi50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLGYuc3JjPWErTC5lc3JpLlV0aWwuc2VyaWFsaXplKGIpLGYuaWQ9ZSxMLmVzcmkuX2NhbGxiYWNrW2VdPWZ1bmN0aW9uKGEpe2Q/Yy5jYWxsKGQsYSk6YyhhKSxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpLGRlbGV0ZSBMLmVzcmkuX2NhbGxiYWNrW2VdfX19LEwuZXNyaS5nZXQ9TC5lc3JpLlN1cHBvcnQuQ09SUz9MLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkNPUlM6TC5lc3JpLlJlcXVlc3RIYW5kbGVycy5KU09OUCxMLmVzcmkuVXRpbD17ZGVib3VuY2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz1udWxsO3JldHVybiBmdW5jdGlvbigpe3ZhciBkPXRoaXN8fGQsZT1hcmd1bWVudHM7Y2xlYXJUaW1lb3V0KGMpLGM9c2V0VGltZW91dChmdW5jdGlvbigpe2EuYXBwbHkoZCxlKX0sYil9fSxyb3VuZEF3YXlGcm9tWmVybzpmdW5jdGlvbihhKXtyZXR1cm4gYT4wP01hdGguY2VpbChhKTpNYXRoLmZsb29yKGEpfSx0cmltOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL15cc1xzKi8sIiIpLnJlcGxhY2UoL1xzXHMqJC8sIiIpfSxjbGVhblVybDpmdW5jdGlvbihhKXtyZXR1cm4gYT1MLmVzcmkuVXRpbC50cmltKGEpLCIvIiE9PWFbYS5sZW5ndGgtMV0mJihhKz0iLyIpLGF9LHNlcmlhbGl6ZTpmdW5jdGlvbihhKXt2YXIgYj0iPyI7Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9YyxlPWFbY107Yis9ZW5jb2RlVVJJQ29tcG9uZW50KGQpLGIrPSI9IixiKz1lbmNvZGVVUklDb21wb25lbnQoZSksYis9IiYifXJldHVybiBiLnN1YnN0cmluZygwLGIubGVuZ3RoLTEpfSxpbmRleE9mOmZ1bmN0aW9uKGEsYixjKXtpZihjPWN8fDAsYS5pbmRleE9mKXJldHVybiBhLmluZGV4T2YoYixjKTtmb3IodmFyIGQ9YyxlPWEubGVuZ3RoO2U+ZDtkKyspaWYoYVtkXT09PWIpcmV0dXJuIGQ7cmV0dXJuLTF9LGV4dGVudFRvQm91bmRzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBMLkxhdExuZyhhLnltaW4sYS54bWluKSxjPW5ldyBMLkxhdExuZyhhLnltYXgsYS54bWF4KTtyZXR1cm4gbmV3IEwuTGF0TG5nQm91bmRzKGIsYyl9LGJvdW5kc1RvRXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybnt4bWluOmEuZ2V0U291dGhXZXN0KCkubG5nLHltaW46YS5nZXRTb3V0aFdlc3QoKS5sYXQseG1heDphLmdldE5vcnRoRWFzdCgpLmxuZyx5bWF4OmEuZ2V0Tm9ydGhFYXN0KCkubGF0LHNwYXRpYWxSZWZlcmVuY2U6e3draWQ6NDMyNn19fSxib3VuZHNUb0VudmVsb3BlOmZ1bmN0aW9uKGEpe3ZhciBiPUwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGEpO3JldHVybnt4OmIueG1pbix5OmIueW1pbix3Ok1hdGguYWJzKGIueG1pbi1iLnhtYXgpLGg6TWF0aC5hYnMoYi55bWluLWIueW1heCl9fX0sTC5lc3JpLk1peGlucz17fSxMLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkPXtfYWN0aXZlUmVxdWVzdHM6MCxfaW5pdGlhbGl6ZUZlYXR1cmVHcmlkOmZ1bmN0aW9uKGEpe3RoaXMuX21hcD1hLHRoaXMuX3ByZXZpb3VzQ2VsbHM9W10sdGhpcy5jZW50ZXI9dGhpcy5fbWFwLmdldENlbnRlcigpLHRoaXMub3JpZ2luPXRoaXMuX21hcC5wcm9qZWN0KHRoaXMuY2VudGVyKSx0aGlzLl9tb3ZlSGFuZGxlcj1MLmVzcmkuVXRpbC5kZWJvdW5jZShmdW5jdGlvbihhKXsiem9vbWVuZCI9PT1hLnR5cGUmJih0aGlzLm9yaWdpbj10aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlciksdGhpcy5fcHJldmlvdXNDZWxscz1bXSksdGhpcy5fcmVxdWVzdEZlYXR1cmVzKGEudGFyZ2V0LmdldEJvdW5kcygpKX0sdGhpcy5vcHRpb25zLmRlYm91bmNlLHRoaXMpLGEub24oInpvb21lbmQgcmVzaXplIG1vdmUiLHRoaXMuX21vdmVIYW5kbGVyLHRoaXMpLHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhhLmdldEJvdW5kcygpKX0sX2Rlc3Ryb3lGZWF0dXJlR3JpZDpmdW5jdGlvbihhKXthLm9mZigiem9vbWVuZCByZXNpemUgbW92ZSIsdGhpcy5fbW92ZUhhbmRsZXIsdGhpcyl9LF9yZXF1ZXN0RmVhdHVyZXM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5fY2VsbHNXaXRoaW4oYSk7YiYmYi5sZW5ndGg+MCYmdGhpcy5maXJlKCJsb2FkaW5nIix7Ym91bmRzOmF9KTtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLl9tYWtlUmVxdWVzdChiW2NdLGIsYSl9LF9tYWtlUmVxdWVzdDpmdW5jdGlvbihhLGIsYyl7dGhpcy5fYWN0aXZlUmVxdWVzdHMrKzt2YXIgZD17Z2VvbWV0cnlUeXBlOiJlc3JpR2VvbWV0cnlFbnZlbG9wZSIsZ2VvbWV0cnk6SlNPTi5zdHJpbmdpZnkoTC5lc3JpLlV0aWwuYm91bmRzVG9FeHRlbnQoYS5ib3VuZHMpKSxvdXRGaWVsZHM6IioiLG91dFNSOjQzMjYsaW5TUjo0MzI2fTt0aGlzLm9wdGlvbnMudG9rZW4mJihkLnRva2VuPXRoaXMub3B0aW9ucy50b2tlbiksdGhpcy5vcHRpb25zLndoZXJlJiYoZC53aGVyZT10aGlzLm9wdGlvbnMud2hlcmUpLEwuZXNyaS5nZXQodGhpcy51cmwrInF1ZXJ5IixkLGZ1bmN0aW9uKGEpe3RoaXMuX2FjdGl2ZVJlcXVlc3RzLS0sdGhpcy5fYWN0aXZlUmVxdWVzdHM8PTAmJnRoaXMuZmlyZSgibG9hZCIse2JvdW5kczpjfSksIWEuZXJyb3J8fDQ5OSE9PWEuZXJyb3IuY29kZSYmNDk4IT09YS5lcnJvci5jb2RlP3RoaXMuX3JlbmRlcihhKTp0aGlzLl9hdXRoZW50aWNhdGluZ3x8KHRoaXMuX2F1dGhlbnRpY2F0aW5nPSEwLHRoaXMuZmlyZSgiYXV0aGVudGljYXRpb25yZXF1aXJlZCIse3JldHJ5OkwuVXRpbC5iaW5kKGZ1bmN0aW9uKGEpe3RoaXMuX2F1dGhlbnRpY2F0aW5nPSExLHRoaXMub3B0aW9ucy50b2tlbj1hLHRoaXMuX3ByZXZpb3VzQ2VsbHM9W10sdGhpcy5fcmVxdWVzdEZlYXR1cmVzKHRoaXMuX21hcC5nZXRCb3VuZHMoKSl9LHRoaXMpfSkpfSx0aGlzKX0sX2NlbGxzV2l0aGluOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX21hcC5nZXRTaXplKCksYz10aGlzLl9tYXAucHJvamVjdCh0aGlzLl9tYXAuZ2V0Q2VudGVyKCkpO01hdGgubWluKHRoaXMub3B0aW9ucy5jZWxsU2l6ZS9iLngsdGhpcy5vcHRpb25zLmNlbGxTaXplL2IueSk7Zm9yKHZhciBkPWEucGFkKC4xKSxlPVtdLGY9dGhpcy5fbWFwLnByb2plY3QoZC5nZXROb3J0aFdlc3QoKSksZz10aGlzLl9tYXAucHJvamVjdChkLmdldFNvdXRoRWFzdCgpKSxoPWYuc3VidHJhY3QoYykuZGl2aWRlQnkodGhpcy5vcHRpb25zLmNlbGxTaXplKSxpPWcuc3VidHJhY3QoYykuZGl2aWRlQnkodGhpcy5vcHRpb25zLmNlbGxTaXplKSxqPU1hdGgucm91bmQoKHRoaXMub3JpZ2luLngtYy54KS90aGlzLm9wdGlvbnMuY2VsbFNpemUpLGs9TWF0aC5yb3VuZCgodGhpcy5vcmlnaW4ueS1jLnkpL3RoaXMub3B0aW9ucy5jZWxsU2l6ZSksbD1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhoLngpLWosbT1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhpLngpLWosbj1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhoLnkpLWssbz1MLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhpLnkpLWsscD1sO20+cDtwKyspZm9yKHZhciBxPW47bz5xO3ErKyl7dmFyIHI9ImNlbGw6IitwKyI6IitxLHM9TC5lc3JpLlV0aWwuaW5kZXhPZih0aGlzLl9wcmV2aW91c0NlbGxzLHIpPj0wO2lmKCFzfHwhdGhpcy5vcHRpb25zLmRlZHVwbGljYXRlKXt2YXIgdD10aGlzLl9jZWxsRXh0ZW50KHAscSksdT10LmdldENlbnRlcigpLHY9dS5kaXN0YW5jZVRvKHQuZ2V0Tm9ydGhXZXN0KCkpLHc9dS5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKSx4PXtyb3c6cCxjb2w6cSxpZDpyLGNlbnRlcjp1LGJvdW5kczp0LGRpc3RhbmNlOncscmFkaXVzOnZ9O2UucHVzaCh4KSx0aGlzLl9wcmV2aW91c0NlbGxzLnB1c2gocil9fXJldHVybiBlLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5kaXN0YW5jZS1iLmRpc3RhbmNlCn0pLGV9LF9jZWxsRXh0ZW50OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2VsbFBvaW50KGEsYiksZD10aGlzLl9jZWxsUG9pbnQoYSsxLGIrMSksZT10aGlzLl9tYXAudW5wcm9qZWN0KGMpLGY9dGhpcy5fbWFwLnVucHJvamVjdChkKTtyZXR1cm4gTC5sYXRMbmdCb3VuZHMoZSxmKX0sX2NlbGxQb2ludDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3JpZ2luLngrYSp0aGlzLm9wdGlvbnMuY2VsbFNpemUsZD10aGlzLm9yaWdpbi55K2IqdGhpcy5vcHRpb25zLmNlbGxTaXplO3JldHVybltjLGRdfX0sTC5lc3JpLk1peGlucy5pZGVudGlmaWFibGVMYXllcj17aWRlbnRpZnk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXtzcjoiNDMyNiIsbWFwRXh0ZW50OkpTT04uc3RyaW5naWZ5KEwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KHRoaXMuX21hcC5nZXRCb3VuZHMoKSkpLHRvbGVyYW5jZTo1LGdlb21ldHJ5VHlwZToiZXNyaUdlb21ldHJ5UG9pbnQiLGltYWdlRGlzcGxheTp0aGlzLl9tYXAuX3NpemUueCsiLCIrdGhpcy5fbWFwLl9zaXplLnkrIiw5NiIsZ2VvbWV0cnk6SlNPTi5zdHJpbmdpZnkoe3g6YS5sbmcseTphLmxhdCxzcGF0aWFsUmVmZXJlbmNlOnt3a2lkOjQzMjZ9fSl9O3RoaXMub3B0aW9ucy5sYXllcnMmJihkLmxheWVycz10aGlzLm9wdGlvbnMubGF5ZXJzKTt2YXIgZTsiZnVuY3Rpb24iPT10eXBlb2YgYiYmInVuZGVmaW5lZCI9PXR5cGVvZiBjPyhjPWIsZT1kKToib2JqZWN0Ij09dHlwZW9mIGImJihiLmxheWVyRGVmcyYmKGIubGF5ZXJEZWZzPXRoaXMucGFyc2VMYXllckRlZnMoYi5sYXllckRlZnMpKSxlPUwuVXRpbC5leHRlbmQoZCxiKSksTC5lc3JpLmdldCh0aGlzLnNlcnZpY2VVcmwrIi9pZGVudGlmeSIsZSxjKX0scGFyc2VMYXllckRlZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW5zdGFuY2VvZiBBcnJheT8iIjoib2JqZWN0Ij09dHlwZW9mIGE/SlNPTi5zdHJpbmdpZnkoYSk6YX19LGZ1bmN0aW9uKGEpe3ZhciBiPSJodHRwczoiIT09d2luZG93LmxvY2F0aW9uLnByb3RvY29sPyJodHRwOiI6Imh0dHBzOiIsYz0ibGluZS1oZWlnaHQ6OXB4OyB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyB3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuOyBkaXNwbGF5OmlubGluZS1ibG9jazsiLGQ9InBvc2l0aW9uOmFic29sdXRlOyB0b3A6LTM4cHg7IHJpZ2h0OjJweDsiLGU9IjxpbWcgc3JjPSdodHRwczovL3NlcnZlcmFwaS5hcmNnaXNvbmxpbmUuY29tL2pzYXBpL2FyY2dpcy8zLjUvanMvZXNyaS9pbWFnZXMvbWFwL2xvZ28tbWVkLnBuZycgYWx0PSdQb3dlcmVkIGJ5IEVzcmknIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9uLWxvZ28nIHN0eWxlPSciK2QrIic+IixmPWZ1bmN0aW9uKGEpe3JldHVybiI8c3BhbiBjbGFzcz0nZXNyaS1hdHRyaWJ1dGlvbnMnIHN0eWxlPSciK2MrIic+IithKyI8L3NwYW4+In07YS5lc3JpLkJhc2VtYXBMYXllcj1hLlRpbGVMYXllci5leHRlbmQoe3N0YXRpY3M6e1RJTEVTOntTdHJlZXRzOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1N0cmVldF9NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLGF0dHJpYnV0aW9uVXJsOiJodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1N0cmVldF9NYXAiLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sVG9wb2dyYXBoaWM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLGF0dHJpYnV0aW9uVXJsOiJodHRwczovL3N0YXRpYy5hcmNnaXMuY29tL2F0dHJpYnV0aW9uL1dvcmxkX1RvcG9fTWFwIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXSxhdHRyaWJ1dGlvbjpmKCJFc3JpIikrZX19LE9jZWFuczp7dXJsVGVtcGxhdGU6YisiLy9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9PY2Vhbl9CYXNlbWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9IixhdHRyaWJ1dGlvblVybDoiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9PY2Vhbl9CYXNlbWFwIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXSxhdHRyaWJ1dGlvbjpmKCJFc3JpIikrZX19LE5hdGlvbmFsR2VvZ3JhcGhpYzp7dXJsVGVtcGxhdGU6Imh0dHBzOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvTmF0R2VvX1dvcmxkX01hcC9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTYsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRXNyaSIpK2V9fSxEYXJrR3JheTp7dXJsVGVtcGxhdGU6YisiLy90aWxlc3tzfS5hcmNnaXMuY29tL3RpbGVzL1AzZVBMTVlzMlJWQ2hrSngvYXJjZ2lzL3Jlc3Qvc2VydmljZXMvV29ybGRfRGFya19HcmF5X0Jhc2VfQmV0YS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTAsc3ViZG9tYWluczpbMSwyXSxhdHRyaWJ1dGlvbjpmKCJFc3JpLCBEZUxvcm1lLCBIRVJFIikrZX19LERhcmtHcmF5TGFiZWxzOnt1cmxUZW1wbGF0ZTpiKyIvL3RpbGVze3N9LmFyY2dpcy5jb20vdGlsZXMvUDNlUExNWXMyUlZDaGtKeC9hcmNnaXMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9EYXJrX0dyYXlfUmVmZXJlbmNlX0JldGEvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjEwLHN1YmRvbWFpbnM6WzEsMl19fSxHcmF5Ont1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE2LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmksIE5BVlRFUSwgRGVMb3JtZSIpK2V9fSxHcmF5TGFiZWxzOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X1JlZmVyZW5jZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTYsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl19fSxJbWFnZXJ5Ont1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX0ltYWdlcnkvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpK2V9fSxJbWFnZXJ5TGFiZWxzOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdfX0sSW1hZ2VyeVRyYW5zcG9ydGF0aW9uOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9UcmFuc3BvcnRhdGlvbi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTksc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl19fSxTaGFkZWRSZWxpZWY6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfU2hhZGVkX1JlbGllZi9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTMsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRVNSSSwgTkFWVEVRLCBEZUxvcm1lIikrZX19LFNoYWRlZFJlbGllZkxhYmVsczp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfQm91bmRhcmllc19hbmRfUGxhY2VzX0FsdGVybmF0ZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fSIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTIsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl19fX19LGluaXRpYWxpemU6ZnVuY3Rpb24oYixjKXt2YXIgZDtpZigib2JqZWN0Ij09dHlwZW9mIGImJmIudXJsVGVtcGxhdGUmJmIub3B0aW9ucylkPWI7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIGJ8fCFhLmVzcmkuQmFzZW1hcExheWVyLlRJTEVTW2JdKXRocm93IG5ldyBFcnJvcigiTC5lc3JpLkJhc2VtYXBMYXllcjogSW52YWxpZCBwYXJhbWV0ZXIuIFVzZSBvbmUgb2YgJ1N0cmVldHMnLCAnVG9wb2dyYXBoaWMnLCAnT2NlYW5zJywgJ05hdGlvbmFsR2VvZ3JhcGhpYycsICdHcmF5JywgJ0dyYXlMYWJlbHMnLCAnRGFya0dyYXknLCAnRGFya0dyYXlMYWJlbHMnLCAnSW1hZ2VyeScsICdJbWFnZXJ5TGFiZWxzJywgJ0ltYWdlcnlUcmFuc3BvcnRhdGlvbicsICdTaGFkZWRSZWxpZWYnIG9yICdTaGFkZWRSZWxpZWZMYWJlbHMnIik7ZD1hLmVzcmkuQmFzZW1hcExheWVyLlRJTEVTW2JdfXZhciBlPWEuVXRpbC5leHRlbmQoZC5vcHRpb25zLGMpO2lmKGEuVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxkLnVybFRlbXBsYXRlLGEuVXRpbC5zZXRPcHRpb25zKHRoaXMsZSkpLGQuYXR0cmlidXRpb25Vcmwpe3ZhciBmPWQuYXR0cmlidXRpb25Vcmw7dGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uPSEwLHRoaXMuX2dldEF0dHJpYnV0aW9uRGF0YShmKX19LF9keW5hbWljQXR0cmlidXRpb246ITEsYm91bmRzOm51bGwsem9vbTpudWxsLG9uQWRkOmZ1bmN0aW9uKGIpe3JldHVybiFiLmF0dHJpYnV0aW9uQ29udHJvbCYmY29uc29sZT8oY29uc29sZS53YXJuKCJMLmVzcmkuQmFzZW1hcExheWVyIHJlcXVpcmVzIGF0dHJpYnV0aW9uLiBQbGVhc2Ugc2V0IGF0dHJpYnV0aW9uQ29udHJvbCB0byB0cnVlIG9uIHlvdXIgbWFwIiksdm9pZCAwKTooYS5UaWxlTGF5ZXIucHJvdG90eXBlLm9uQWRkLmNhbGwodGhpcyxiKSx0aGlzLl9keW5hbWljQXR0cmlidXRpb24mJih0aGlzLm9uKCJsb2FkIix0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcyx0aGlzKSx0aGlzLl9tYXAub24oInZpZXdyZXNldCB6b29tZW5kIGRyYWdlbmQiLHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLHRoaXMpKSx0aGlzLl9tYXAub24oInJlc2l6ZSIsdGhpcy5fcmVzaXplQXR0cmlidXRpb24sdGhpcyksdm9pZCAwKX0sb25SZW1vdmU6ZnVuY3Rpb24oYil7dGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uJiYodGhpcy5vZmYoImxvYWQiLHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLHRoaXMpLHRoaXMuX21hcC5vZmYoInZpZXdyZXNldCB6b29tZW5kIGRyYWdlbmQiLHRoaXMuX2hhbmRsZVRpbGVVcGRhdGVzLHRoaXMpKSx0aGlzLl9tYXAub2ZmKCJyZXNpemUiLHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uLHRoaXMpLGEuVGlsZUxheWVyLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsYil9LF9oYW5kbGVUaWxlVXBkYXRlczpmdW5jdGlvbihhKXt2YXIgYixjOyJsb2FkIj09PWEudHlwZSYmKGI9dGhpcy5fbWFwLmdldEJvdW5kcygpLGM9dGhpcy5fbWFwLmdldFpvb20oKSksKCJ2aWV3cmVzZXQiPT09YS50eXBlfHwiZHJhZ2VuZCI9PT1hLnR5cGV8fCJ6b29tZW5kIj09PWEudHlwZSkmJihiPWEudGFyZ2V0LmdldEJvdW5kcygpLGM9YS50YXJnZXQuZ2V0Wm9vbSgpKSx0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcyYmYiYmYyYmKGIuZXF1YWxzKHRoaXMuYm91bmRzKSYmYz09PXRoaXMuem9vbXx8KHRoaXMuYm91bmRzPWIsdGhpcy56b29tPWMsdGhpcy5fdXBkYXRlTWFwQXR0cmlidXRpb24oKSkpfSxfcmVzaXplQXR0cmlidXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9tYXAuZ2V0U2l6ZSgpLng7dGhpcy5fZ2V0QXR0cmlidXRpb25Mb2dvKCkuc3R5bGUuZGlzcGxheT02MDA+YT8ibm9uZSI6ImJsb2NrIix0aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5zdHlsZS5tYXhXaWR0aD0uNzUqYSsicHgifSxfZ2V0QXR0cmlidXRpb25EYXRhOmZ1bmN0aW9uKGIpe3RoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzPVtdLGEuZXNyaS5SZXF1ZXN0SGFuZGxlcnMuSlNPTlAoYix7fSx0aGlzLl9wcm9jZXNzQXR0cmlidXRpb25EYXRhLHRoaXMpfSxfcHJvY2Vzc0F0dHJpYnV0aW9uRGF0YTpmdW5jdGlvbihiKXtmb3IodmFyIGM9MDtjPGIuY29udHJpYnV0b3JzLmxlbmd0aDtjKyspZm9yKHZhciBkPWIuY29udHJpYnV0b3JzW2NdLGU9MDtlPGQuY292ZXJhZ2VBcmVhcy5sZW5ndGg7ZSsrKXt2YXIgZj1kLmNvdmVyYWdlQXJlYXNbZV0sZz1uZXcgYS5MYXRMbmcoZi5iYm94WzBdLGYuYmJveFsxXSksaD1uZXcgYS5MYXRMbmcoZi5iYm94WzJdLGYuYmJveFszXSk7dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMucHVzaCh7YXR0cmlidXRpb246ZC5hdHRyaWJ1dGlvbixzY29yZTpmLnNjb3JlLGJvdW5kczpuZXcgYS5MYXRMbmdCb3VuZHMoZyxoKSxtaW5ab29tOmYuem9vbU1pbixtYXhab29tOmYuem9vbU1heH0pfXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zY29yZTxiLnNjb3JlPy0xOmEuc2NvcmU+Yi5zY29yZT8xOjB9KSx0aGlzLmJvdW5kcyYmdGhpcy5fdXBkYXRlTWFwQXR0cmlidXRpb24oKX0sX2dldEF0dHJpYnV0aW9uU3BhbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCIuZXNyaS1hdHRyaWJ1dGlvbnMiKVswXX0sX2dldEF0dHJpYnV0aW9uTG9nbzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXAuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCIuZXNyaS1hdHRyaWJ1dGlvbi1sb2dvIilbMF19LF91cGRhdGVNYXBBdHRyaWJ1dGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iIixiPTA7Yjx0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5sZW5ndGg7YisrKXt2YXIgYz10aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlc1tiXTtpZih0aGlzLmJvdW5kcy5pbnRlcnNlY3RzKGMuYm91bmRzKSYmdGhpcy56b29tPj1jLm1pblpvb20mJnRoaXMuem9vbTw9Yy5tYXhab29tKXt2YXIgZD10aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlc1tiXS5hdHRyaWJ1dGlvbjstMT09PWEuaW5kZXhPZihkKSYmKGEubGVuZ3RoPjAmJihhKz0iLCAiKSxhKz1kKX19dGhpcy5fZ2V0QXR0cmlidXRpb25TcGFuKCkuaW5uZXJIVE1MPWEsdGhpcy5fcmVzaXplQXR0cmlidXRpb24oKX19KSxhLmVzcmkuYmFzZW1hcExheWVyPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIG5ldyBhLmVzcmkuQmFzZW1hcExheWVyKGIsYyl9fShMKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9Yj8iYmxvY2siOiJub25lIjtpZihhLl9pY29uJiYoYS5faWNvbi5zdHlsZS5kaXNwbGF5PWMpLGEuX3NoYWRvdyYmKGEuX3NoYWRvdy5zdHlsZS5kaXNwbGF5PWMpLGEuX2xheWVycylmb3IodmFyIGQgaW4gYS5fbGF5ZXJzKWEuX2xheWVycy5oYXNPd25Qcm9wZXJ0eShkKSYmKGEuX2xheWVyc1tkXS5fY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9Yyl9YS5lc3JpLkZlYXR1cmVMYXllcj1hLkdlb0pTT04uZXh0ZW5kKHtpbmNsdWRlczphLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkLG9wdGlvbnM6e2NlbGxTaXplOjUxMixkZWJvdW5jZToxMDAsZGVkdXBsaWNhdGU6ITB9LGluaXRpYWxpemU6ZnVuY3Rpb24oYixjKXt0aGlzLmluZGV4PW5ldyBUZXJyYWZvcm1lci5SVHJlZSx0aGlzLnVybD1hLmVzcmkuVXRpbC5jbGVhblVybChiKSxhLlV0aWwuc2V0T3B0aW9ucyh0aGlzLGMpO3ZhciBkPXt9O3RoaXMub3B0aW9ucy50b2tlbiYmKGQudG9rZW49dGhpcy5vcHRpb25zLnRva2VuKSx0aGlzLm9wdGlvbnMud2hlcmUmJihkLndoZXJlPXRoaXMub3B0aW9ucy53aGVyZSksYS5lc3JpLmdldCh0aGlzLnVybCxkLGZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgibWV0YWRhdGEiLHttZXRhZGF0YTphfSl9LHRoaXMpLGEuR2VvSlNPTi5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsW10sYyl9LG9uQWRkOmZ1bmN0aW9uKGIpe2EuTGF5ZXJHcm91cC5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLGIpLGIub24oInpvb21lbmQgcmVzaXplIG1vdmVlbmQiLHRoaXMuX3VwZGF0ZSx0aGlzKSx0aGlzLl9pbml0aWFsaXplRmVhdHVyZUdyaWQoYil9LG9uUmVtb3ZlOmZ1bmN0aW9uKGIpe2Iub2ZmKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlZW5kIix0aGlzLl91cGRhdGUsdGhpcyksYS5MYXllckdyb3VwLnByb3RvdHlwZS5vblJlbW92ZS5jYWxsKHRoaXMsYiksdGhpcy5fZGVzdHJveUZlYXR1cmVHcmlkKGIpfSxnZXRMYXllcklkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmZlYXR1cmUuaWR9LF91cGRhdGU6ZnVuY3Rpb24oYyl7dmFyIGQ9YS5lc3JpLlV0aWwuYm91bmRzVG9FbnZlbG9wZShjLnRhcmdldC5nZXRCb3VuZHMoKSk7dGhpcy5pbmRleC5zZWFyY2goZCxhLlV0aWwuYmluZChmdW5jdGlvbihjLGQpe3RoaXMuZWFjaExheWVyKGEuVXRpbC5iaW5kKGZ1bmN0aW9uKGMpe3ZhciBlPWMuZmVhdHVyZS5pZDtiKGMsYS5lc3JpLlV0aWwuaW5kZXhPZihkLGUpPj0wKX0sdGhpcykpfSx0aGlzKSl9LF9zZXRPYmplY3RJZEZpZWxkOmZ1bmN0aW9uKGEpe2lmKGEub2JqZWN0SWRGaWVsZE5hbWUpdGhpcy5fb2JqZWN0SWRGaWVsZD1hLm9iamVjdElkRmllbGROYW1lO2Vsc2UgZm9yKHZhciBiPTA7Yjw9YS5maWVsZHMubGVuZ3RoLTE7YisrKWlmKCJlc3JpRmllbGRUeXBlT0lEIj09PWEuZmllbGRzW2JdLnR5cGUpe3RoaXMuX29iamVjdElkRmllbGQ9YS5maWVsZHNbYl0ubmFtZTticmVha319LF9yZW5kZXI6ZnVuY3Rpb24oYSl7aWYoYS5mZWF0dXJlcyYmYS5mZWF0dXJlcy5sZW5ndGgmJiFhLmVycm9yKXt0aGlzLl9vYmplY3RJZEZpZWxkfHx0aGlzLl9zZXRPYmplY3RJZEZpZWxkKGEpO2Zvcih2YXIgYj1hLmZlYXR1cmVzLmxlbmd0aC0xO2I+PTA7Yi0tKXt2YXIgYz1hLmZlYXR1cmVzW2JdLGQ9dGhpcy5fb2JqZWN0SWRGaWVsZCxlPWMuYXR0cmlidXRlc1tkXTtpZighdGhpcy5fbGF5ZXJzW2VdKXt2YXIgZj1UZXJyYWZvcm1lci5BcmNHSVMucGFyc2UoYyk7Zi5pZD1lLHRoaXMuaW5kZXguaW5zZXJ0KGYsZi5pZCksdGhpcy5hZGREYXRhKGYpfX19fX0pLGEuZXNyaS5mZWF0dXJlTGF5ZXI9ZnVuY3Rpb24oYixjKXtyZXR1cm4gbmV3IGEuZXNyaS5GZWF0dXJlTGF5ZXIoYixjKX19KEwpLEwuZXNyaS5UaWxlZE1hcExheWVyPUwuVGlsZUxheWVyLmV4dGVuZCh7aW5jbHVkZXM6TC5lc3JpLk1peGlucy5pZGVudGlmaWFibGVMYXllcixpbml0aWFsaXplOmZ1bmN0aW9uKGEsYil7Yj1ifHx7fSx0aGlzLnNlcnZpY2VVcmw9TC5lc3JpLlV0aWwuY2xlYW5VcmwoYSksdGhpcy50aWxlVXJsPUwuZXNyaS5VdGlsLmNsZWFuVXJsKGEpKyJ0aWxlL3t6fS97eX0ve3h9Iix0aGlzLnRpbGVVcmwubWF0Y2goIjovL3RpbGVzLmFyY2dpcy5jb20iKSYmKHRoaXMudGlsZVVybD10aGlzLnRpbGVVcmwucmVwbGFjZSgiOi8vdGlsZXMuYXJjZ2lzLmNvbSIsIjovL3RpbGVze3N9LmFyY2dpcy5jb20iKSxiLnN1YmRvbWFpbnM9WyIxIiwiMiIsIjMiLCI0Il0pLEwuZXNyaS5nZXQodGhpcy5zZXJ2aWNlVXJsLHt9LGZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgibWV0YWRhdGEiLHttZXRhZGF0YTphfSl9LHRoaXMpLEwuVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyx0aGlzLnRpbGVVcmwsYil9fSksTC5lc3JpLnRpbGVkTWFwTGF5ZXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEwuZXNyaS5UaWxlZE1hcExheWVyKGEsYil9LC8qIQogKiBUaGUgTUlUIExpY2Vuc2UgKE1JVCkKICoKICogQ29weXJpZ2h0IChjKSAyMDEzIFNhbmJvcm4gTWFwIENvbXBhbnksIEluYy4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQogKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgogKiBUSEUgU09GVFdBUkUuCiAqLwpMLmVzcmkuRHluYW1pY01hcExheWVyPUwuQ2xhc3MuZXh0ZW5kKHtpbmNsdWRlczpMLmVzcmkuTWl4aW5zLmlkZW50aWZpYWJsZUxheWVyLG9wdGlvbnM6e29wYWNpdHk6MSxwb3NpdGlvbjoiZnJvbnQifSxfZGVmYXVsdExheWVyUGFyYW1zOntmb3JtYXQ6InBuZzI0Iix0cmFuc3BhcmVudDohMCxmOiJpbWFnZSIsYmJveFNSOjM4NzUsaW1hZ2VTUjozODc1LGxheWVyczoiIn0saW5pdGlhbGl6ZTpmdW5jdGlvbihhLGIpe3RoaXMuc2VydmljZVVybD1MLmVzcmkuVXRpbC5jbGVhblVybChhKSx0aGlzLl9sYXllclBhcmFtcz1MLlV0aWwuZXh0ZW5kKHt9LHRoaXMuX2RlZmF1bHRMYXllclBhcmFtcyk7Zm9yKHZhciBjIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShjKSYmdGhpcy5fZGVmYXVsdExheWVyUGFyYW1zLmhhc093blByb3BlcnR5KGMpJiYodGhpcy5fbGF5ZXJQYXJhbXNbY109YltjXSk7dGhpcy5fcGFyc2VMYXllcnMoKSx0aGlzLl9wYXJzZUxheWVyRGVmcygpLEwuVXRpbC5zZXRPcHRpb25zKHRoaXMsYiksdGhpcy5fbGF5ZXJQYXJhbXMudHJhbnNwYXJlbnR8fCh0aGlzLm9wdGlvbnMub3BhY2l0eT0xKSx0aGlzLl9nZXRNZXRhZGF0YSgpfSxfZ2V0TWV0YWRhdGE6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLm9wdGlvbnMudG9rZW4mJihhLnRva2VuPXRoaXMub3B0aW9ucy50b2tlbiksTC5lc3JpLmdldCh0aGlzLnNlcnZpY2VVcmwsYSxmdW5jdGlvbihhKXshYS5lcnJvcnx8NDk5IT09YS5lcnJvci5jb2RlJiY0OTghPT1hLmVycm9yLmNvZGU/dGhpcy5maXJlKCJtZXRhZGF0YSIse21ldGFkYXRhOmF9KTp0aGlzLl9hdXRoZW50aWNhdGluZ3x8KHRoaXMuX2F1dGhlbnRpY2F0aW5nPSEwLHRoaXMuZmlyZSgiYXV0aGVudGljYXRpb25yZXF1aXJlZCIse3JldHJ5OkwuVXRpbC5iaW5kKGZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucy50b2tlbj1hLHRoaXMuX2dldE1ldGFkYXRhKCksdGhpcy5fdXBkYXRlKCl9LHRoaXMpfSkpfSx0aGlzKX0sb25BZGQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5fbWFwPWEsdGhpcy5fbW92ZUhhbmRsZXI9TC5lc3JpLlV0aWwuZGVib3VuY2UodGhpcy5fdXBkYXRlLDE1MCx0aGlzKSxhLm9uKCJtb3ZlZW5kIix0aGlzLl9tb3ZlSGFuZGxlcix0aGlzKSxhLm9wdGlvbnMuY3JzJiZhLm9wdGlvbnMuY3JzLmNvZGUpe3ZhciBiPWEub3B0aW9ucy5jcnMuY29kZS5zcGxpdCgiOiIpWzFdO3RoaXMuX2xheWVyUGFyYW1zLmJib3hTUj1iLHRoaXMuX2xheWVyUGFyYW1zLmltYWdlU1I9Yn10aGlzLl91cGRhdGUoKX0sb25SZW1vdmU6ZnVuY3Rpb24oYSl7dGhpcy5fY3VycmVudEltYWdlJiZ0aGlzLl9tYXAucmVtb3ZlTGF5ZXIodGhpcy5fY3VycmVudEltYWdlKSxhLm9mZigibW92ZWVuZCIsdGhpcy5fbW92ZUhhbmRsZXIsdGhpcyl9LGFkZFRvOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFkZExheWVyKHRoaXMpLHRoaXN9LHNldE9wYWNpdHk6ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zLm9wYWNpdHk9YSx0aGlzLl9jdXJyZW50SW1hZ2Uuc2V0T3BhY2l0eShhKX0sYnJpbmdUb0Zyb250OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wb3NpdGlvbj0iZnJvbnQiLHRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvRnJvbnQoKSx0aGlzfSxicmluZ1RvQmFjazpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb249ImJhY2siLHRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvQmFjaygpLHRoaXN9LF9wYXJzZUxheWVyczpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJzKXJldHVybiBkZWxldGUgdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJPcHRpb24sdm9pZCAwO3ZhciBhPXRoaXMuX2xheWVyUGFyYW1zLmxheWVyT3B0aW9ufHxudWxsLGI9dGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJzfHxudWxsLGM9InNob3ciLGQ9WyJzaG93IiwiaGlkZSIsImluY2x1ZGUiLCJleGNsdWRlIl07aWYoZGVsZXRlIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyT3B0aW9uLGEpLTEhPT1kLmluZGV4T2YoYSkmJihjPWEpLHRoaXMuX2xheWVyUGFyYW1zLmxheWVycz1jKyI6IitiO2Vsc2UgaWYoYiBpbnN0YW5jZW9mIEFycmF5KXRoaXMuX2xheWVyUGFyYW1zLmxheWVycz1jKyI6IitiLmpvaW4oIiwiKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgYil7dmFyIGU9Yi5tYXRjaCgiOiIpO2UmJihiPWIuc3BsaXQoZVswXSksTnVtYmVyKGJbMV0uc3BsaXQoIiwiKVswXSkmJigtMSE9PWQuaW5kZXhPZihiWzBdKSYmKGM9YlswXSksYj1iWzFdKSksdGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJzPWMrIjoiK2J9fSxfcGFyc2VMYXllckRlZnM6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2xheWVyUGFyYW1zLmxheWVyRGVmcyl7dmFyIGE9dGhpcy5fbGF5ZXJQYXJhbXMubGF5ZXJEZWZzLGI9W107aWYoYSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgYz1hLmxlbmd0aCxkPTA7Yz5kO2QrKylhW2RdJiZiLnB1c2goZCsiOiIrYVtkXSk7ZWxzZXtpZigib2JqZWN0IiE9dHlwZW9mIGEpcmV0dXJuIGRlbGV0ZSB0aGlzLl9sYXllclBhcmFtcy5sYXllckRlZnMsdm9pZCAwO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJmIucHVzaChlKyI6IithW2VdKX10aGlzLl9sYXllclBhcmFtcy5sYXllckRlZnM9Yi5qb2luKCI7Iil9fSxfZ2V0SW1hZ2VVcmw6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9tYXAuZ2V0Qm91bmRzKCksYj10aGlzLl9tYXAuZ2V0U2l6ZSgpLGM9dGhpcy5fbWFwLm9wdGlvbnMuY3JzLnByb2plY3QoYS5fbm9ydGhFYXN0KSxkPXRoaXMuX21hcC5vcHRpb25zLmNycy5wcm9qZWN0KGEuX3NvdXRoV2VzdCk7dGhpcy5fbGF5ZXJQYXJhbXMuYmJveD1bZC54LGQueSxjLngsYy55XS5qb2luKCIsIiksdGhpcy5fbGF5ZXJQYXJhbXMuc2l6ZT1iLngrIiwiK2IueSx0aGlzLm9wdGlvbnMudG9rZW4mJih0aGlzLl9sYXllclBhcmFtcy50b2tlbj10aGlzLm9wdGlvbnMudG9rZW4pO3ZhciBlPXRoaXMuc2VydmljZVVybCsiZXhwb3J0IitMLlV0aWwuZ2V0UGFyYW1TdHJpbmcodGhpcy5fbGF5ZXJQYXJhbXMpO3JldHVybiBlfSxfdXBkYXRlOmZ1bmN0aW9uKCl7aWYoISh0aGlzLl9hbmltYXRpbmdab29tfHx0aGlzLl9tYXAuX3BhblRyYW5zaXRpb24mJnRoaXMuX21hcC5fcGFuVHJhbnNpdGlvbi5faW5Qcm9ncmVzcykpe3ZhciBhPXRoaXMuX21hcC5nZXRab29tKCk7aWYoIShhPnRoaXMub3B0aW9ucy5tYXhab29tfHxhPHRoaXMub3B0aW9ucy5taW5ab29tKSl7dmFyIGI9dGhpcy5fbWFwLmdldEJvdW5kcygpO2IuX3NvdXRoV2VzdC53cmFwKCksYi5fbm9ydGhFYXN0LndyYXAoKTt2YXIgYz1uZXcgTC5JbWFnZU92ZXJsYXkodGhpcy5fZ2V0SW1hZ2VVcmwoKSxiLHtvcGFjaXR5OjB9KS5hZGRUbyh0aGlzLl9tYXApO2Mub24oImxvYWQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9dGhpcy5fY3VycmVudEltYWdlO2MuX2JvdW5kcy5lcXVhbHMoYik/KHRoaXMuX2N1cnJlbnRJbWFnZT1jLCJmcm9udCI9PT10aGlzLm9wdGlvbnMucG9zaXRpb24/dGhpcy5fY3VycmVudEltYWdlLmJyaW5nVG9Gcm9udCgpOnRoaXMuX2N1cnJlbnRJbWFnZS5icmluZ1RvQmFjaygpLHRoaXMuX2N1cnJlbnRJbWFnZS5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5vcGFjaXR5KSxkJiZ0aGlzLl9tYXAucmVtb3ZlTGF5ZXIoZCkpOnRoaXMuX21hcC5yZW1vdmVMYXllcihjKX0sdGhpcyksdGhpcy5maXJlKCJsb2FkaW5nIix7Ym91bmRzOmJ9KX19fX0pLEwuZXNyaS5EeW5hbWljTWFwTGF5ZXIuaW5jbHVkZShMLk1peGluLkV2ZW50cyksTC5lc3JpLmR5bmFtaWNNYXBMYXllcj1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgTC5lc3JpLkR5bmFtaWNNYXBMYXllcihhLGIpfTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/clustered-feature-layer-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCi8qIGdsb2JhbHMgVGVycmFmb3JtZXIsIEwgKi8KKGZ1bmN0aW9uKEwsIFRlcnJhZm9ybWVyKXsKICBMLmVzcmkuQ2x1c3RlcmVkRmVhdHVyZUxheWVyID0gTC5DbGFzcy5leHRlbmQoewogICAgaW5jbHVkZXM6IEwuZXNyaS5NaXhpbnMuZmVhdHVyZUdyaWQsCiAgICBvcHRpb25zOiB7CiAgICAgIGNlbGxTaXplOiA1MTIsCiAgICAgIGRlYm91bmNlOiAxMDAsCiAgICAgIGRlZHVwbGljYXRlOiB0cnVlLAogICAgICBjcmVhdGVNYXJrZXI6IGZ1bmN0aW9uIChnZW9qc29uLCBsYXRsbmcpIHsKICAgICAgICByZXR1cm4gbmV3IEwubWFya2VyKGxhdGxuZyk7CiAgICAgIH0sCiAgICAgIG9uRWFjaE1hcmtlcjogdW5kZWZpbmVkCiAgICB9LAogICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24odXJsLCBvcHRpb25zKXsKICAgICAgTC5VdGlsLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7CiAgICAgIHRoaXMudXJsID0gTC5lc3JpLlV0aWwuY2xlYW5VcmwodXJsKTsKCiAgICAgIEwuZXNyaS5nZXQodGhpcy51cmwsIHt9LCBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgICAgdGhpcy5maXJlKCJtZXRhZGF0YSIsIHsgbWV0YWRhdGE6IHJlc3BvbnNlIH0pOwogICAgICB9LCB0aGlzKTsKCiAgICAgIHRoaXMuX2xvYWRlZCA9IFtdOwogICAgICB0aGlzLmNsdXN0ZXIgPSB0aGlzLm9wdGlvbnMuY2x1c3RlciB8fCBuZXcgTC5NYXJrZXJDbHVzdGVyR3JvdXAoKTsKICAgIH0sCiAgICBvbkFkZDogZnVuY3Rpb24obWFwKXsKICAgICAgdGhpcy5jbHVzdGVyLmFkZFRvKG1hcCk7CiAgICAgIHRoaXMuX2luaXRpYWxpemVGZWF0dXJlR3JpZChtYXApOwogICAgfSwKICAgIG9uUmVtb3ZlOiBmdW5jdGlvbihtYXApewogICAgICBtYXAucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKTsKICAgICAgdGhpcy5fZGVzdHJveUZlYXR1cmVHcmlkKG1hcCk7CiAgICB9LAogICAgYWRkVG86IGZ1bmN0aW9uIChtYXApIHsKICAgICAgbWFwLmFkZExheWVyKHRoaXMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0sCiAgICBfcmVuZGVyOiBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIGlmKHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lICYmIHJlc3BvbnNlLmZlYXR1cmVzLmxlbmd0aCAmJiAhcmVzcG9uc2UuZXJyb3IpewogICAgICAgIHZhciBpZEtleSA9IHJlc3BvbnNlLm9iamVjdElkRmllbGROYW1lOwogICAgICAgIGZvciAodmFyIGkgPSByZXNwb25zZS5mZWF0dXJlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGZlYXR1cmUgPSByZXNwb25zZS5mZWF0dXJlc1tpXTsKICAgICAgICAgIHZhciBpZCA9IGZlYXR1cmUuYXR0cmlidXRlc1tpZEtleV07CiAgICAgICAgICBpZihMLmVzcmkuVXRpbC5pbmRleE9mKHRoaXMuX2xvYWRlZCwgaWQpIDwgMCl7CiAgICAgICAgICAgIHZhciBnZW9qc29uID0gVGVycmFmb3JtZXIuQXJjR0lTLnBhcnNlKGZlYXR1cmUpOwogICAgICAgICAgICBnZW9qc29uLmlkID0gaWQ7CiAgICAgICAgICAgIHZhciBtYXJrZXIgPSB0aGlzLm9wdGlvbnMuY3JlYXRlTWFya2VyKGdlb2pzb24sIFtnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzFdLCBnZW9qc29uLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdXSk7CgogICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMub25FYWNoTWFya2VyKXsKICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMub25FYWNoTWFya2VyKGdlb2pzb24sIG1hcmtlcik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMuY2x1c3Rlci5hZGRMYXllcihtYXJrZXIpOwogICAgICAgICAgICB0aGlzLl9sb2FkZWQucHVzaChpZCk7CgogICAgICAgICAgICB0aGlzLmZpcmUoInJlbmRlciIsIHsKICAgICAgICAgICAgICBmZWF0dXJlOiBtYXJrZXIsCiAgICAgICAgICAgICAgZ2VvanNvbjogZ2VvanNvbgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9KTsKCiAgTC5lc3JpLkNsdXN0ZXJlZEZlYXR1cmVMYXllci5pbmNsdWRlKEwuTWl4aW4uRXZlbnRzKTsKCiAgTC5lc3JpLmNsdXN0ZXJlZEZlYXR1cmVMYXllciA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucyl7CiAgICByZXR1cm4gbmV3IEwuZXNyaS5DbHVzdGVyZWRGZWF0dXJlTGF5ZXIodXJsLCBvcHRpb25zKTsKICB9Owp9KShMLCBUZXJyYWZvcm1lcik7]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/clustered-feature-layer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCiFmdW5jdGlvbihhLFRlcnJhZm9ybWVyKXthLmVzcmkuQ2x1c3RlcmVkRmVhdHVyZUxheWVyPWEuQ2xhc3MuZXh0ZW5kKHtpbmNsdWRlczphLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkLG9wdGlvbnM6e2NlbGxTaXplOjUxMixkZWJvdW5jZToxMDAsZGVkdXBsaWNhdGU6ITAsY3JlYXRlTWFya2VyOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIG5ldyBhLm1hcmtlcihjKX0sb25FYWNoTWFya2VyOnZvaWQgMH0saW5pdGlhbGl6ZTpmdW5jdGlvbihiLGMpe2EuVXRpbC5zZXRPcHRpb25zKHRoaXMsYyksdGhpcy51cmw9YS5lc3JpLlV0aWwuY2xlYW5VcmwoYiksYS5lc3JpLmdldCh0aGlzLnVybCx7fSxmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm1ldGFkYXRhIix7bWV0YWRhdGE6YX0pfSx0aGlzKSx0aGlzLl9sb2FkZWQ9W10sdGhpcy5jbHVzdGVyPXRoaXMub3B0aW9ucy5jbHVzdGVyfHxuZXcgYS5NYXJrZXJDbHVzdGVyR3JvdXB9LG9uQWRkOmZ1bmN0aW9uKGEpe3RoaXMuY2x1c3Rlci5hZGRUbyhhKSx0aGlzLl9pbml0aWFsaXplRmVhdHVyZUdyaWQoYSl9LG9uUmVtb3ZlOmZ1bmN0aW9uKGEpe2EucmVtb3ZlTGF5ZXIodGhpcy5jbHVzdGVyKSx0aGlzLl9kZXN0cm95RmVhdHVyZUdyaWQoYSl9LGFkZFRvOmZ1bmN0aW9uKGEpe3JldHVybiBhLmFkZExheWVyKHRoaXMpLHRoaXN9LF9yZW5kZXI6ZnVuY3Rpb24oYil7aWYoYi5vYmplY3RJZEZpZWxkTmFtZSYmYi5mZWF0dXJlcy5sZW5ndGgmJiFiLmVycm9yKWZvcih2YXIgYz1iLm9iamVjdElkRmllbGROYW1lLGQ9Yi5mZWF0dXJlcy5sZW5ndGgtMTtkPj0wO2QtLSl7dmFyIGU9Yi5mZWF0dXJlc1tkXSxmPWUuYXR0cmlidXRlc1tjXTtpZihhLmVzcmkuVXRpbC5pbmRleE9mKHRoaXMuX2xvYWRlZCxmKTwwKXt2YXIgZz1UZXJyYWZvcm1lci5BcmNHSVMucGFyc2UoZSk7Zy5pZD1mO3ZhciBoPXRoaXMub3B0aW9ucy5jcmVhdGVNYXJrZXIoZyxbZy5nZW9tZXRyeS5jb29yZGluYXRlc1sxXSxnLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdXSk7dGhpcy5vcHRpb25zLm9uRWFjaE1hcmtlciYmdGhpcy5vcHRpb25zLm9uRWFjaE1hcmtlcihnLGgpLHRoaXMuY2x1c3Rlci5hZGRMYXllcihoKSx0aGlzLl9sb2FkZWQucHVzaChmKSx0aGlzLmZpcmUoInJlbmRlciIse2ZlYXR1cmU6aCxnZW9qc29uOmd9KX19fX0pLGEuZXNyaS5DbHVzdGVyZWRGZWF0dXJlTGF5ZXIuaW5jbHVkZShhLk1peGluLkV2ZW50cyksYS5lc3JpLmNsdXN0ZXJlZEZlYXR1cmVMYXllcj1mdW5jdGlvbihiLGMpe3JldHVybiBuZXcgYS5lc3JpLkNsdXN0ZXJlZEZlYXR1cmVMYXllcihiLGMpfX0oTCxUZXJyYWZvcm1lcik7]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/esri-basemaps-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCi8qIGdsb2JhbHMgTCAqLwoKTC5lc3JpID0gewogIF9jYWxsYmFjazoge30KfTsKCi8vIE5hbWVzcGFjZSBmb3IgdmFyaW91cyBzdXBwb3J0IHZhcmlhYmxlcyB3ZSBuZWVkIHRvIHRyYWNrCkwuZXNyaS5TdXBwb3J0ID0gewogIC8vIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy9jb3JzLmpzI0wyMAogIENPUlM6ICEhKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSkKfTsKCi8vIEFKQVggaGFuZGxlcnMgZm9yIENPUlMgKG1vZGVybiBicm93c2Vycykgb3IgSlNPTlAgKG9sZGVyIGJyb3dzZXJzKQpMLmVzcmkuUmVxdWVzdEhhbmRsZXJzID0gewogIENPUlM6IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBjYWxsYmFjaywgY29udGV4dCl7CiAgICB2YXIgaHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCiAgICBwYXJhbXMuZj0ianNvbiI7CgogICAgaHR0cFJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKICAgICAgdmFyIHJlc3BvbnNlOwogICAgICBpZiAoaHR0cFJlcXVlc3QucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXNwb25zZSA9IEpTT04ucGFyc2UoaHR0cFJlcXVlc3QucmVzcG9uc2VUZXh0KTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIHJlc3BvbnNlID0gewogICAgICAgICAgICBlcnJvcjogIkNvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBKU09OLiIKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmKGNvbnRleHQpewogICAgICAgICAgY2FsbGJhY2suY2FsbChjb250ZXh0LCByZXNwb25zZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgaHR0cFJlcXVlc3Qub3BlbignR0VUJywgdXJsICsgTC5lc3JpLlV0aWwuc2VyaWFsaXplKHBhcmFtcyksIHRydWUpOwogICAgaHR0cFJlcXVlc3Quc2VuZChudWxsKTsKICB9LAogIEpTT05QOiBmdW5jdGlvbih1cmwsIHBhcmFtcywgY2FsbGJhY2ssIGNvbnRleHQpewogICAgdmFyIGNhbGxiYWNrSWQgPSAiYyIrKE1hdGgucmFuZG9tKCkgKiAxZTkpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKCIuIiwgIl8iKTsKCiAgICBwYXJhbXMuZj0ianNvbiI7CiAgICBwYXJhbXMuY2FsbGJhY2s9IkwuZXNyaS5fY2FsbGJhY2suIitjYWxsYmFja0lkOwoKICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICBzY3JpcHQuc3JjID0gdXJsICsgTC5lc3JpLlV0aWwuc2VyaWFsaXplKHBhcmFtcyk7CiAgICBzY3JpcHQuaWQgPSBjYWxsYmFja0lkOwoKICAgIEwuZXNyaS5fY2FsbGJhY2tbY2FsbGJhY2tJZF0gPSBmdW5jdGlvbihyZXNwb25zZSl7CiAgICAgIGlmKGNvbnRleHQpewogICAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCwgcmVzcG9uc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgICAgfQogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcmlwdCk7CiAgICAgIGRlbGV0ZSBMLmVzcmkuX2NhbGxiYWNrW2NhbGxiYWNrSWRdOwogICAgfTsKCiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7CiAgfQp9OwoKLy8gQ2hvb3NlIHRoZSBjb3JyZWN0IEFKQVggaGFuZGxlciBkZXBlbmRpbmcgb24gQ09SUyBzdXBwb3J0CkwuZXNyaS5nZXQgPSAoTC5lc3JpLlN1cHBvcnQuQ09SUykgPyBMLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkNPUlMgOiBMLmVzcmkuUmVxdWVzdEhhbmRsZXJzLkpTT05QOwoKLy8gR2VuZXJhbCB1dGlsaXR5IG5hbWVzcGFjZQpMLmVzcmkuVXRpbCA9IHsKICAvLyBtYWtlIGl0IHNvIHRoYXQgcGFzc2VkIGBmdW5jdGlvbmAgbmV2ZXIgZ2V0cyBjYWxsZWQKICAvLyB0d2ljZSB3aXRoaW4gYGRlbGF5YCBtaWxsaXNlY29uZHMuIFVzZWQgdG8gdGhyb3R0bGUKICAvLyBgbW92ZWAgZXZlbnRzIG9uIHRoZSBsYXllci4KICAvLyBodHRwOi8vcmVteXNoYXJwLmNvbS8yMDEwLzA3LzIxL3Rocm90dGxpbmctZnVuY3Rpb24tY2FsbHMvCiAgZGVib3VuY2U6IGZ1bmN0aW9uIChmbiwgZGVsYXksIGNvbnRleHQpIHsKICAgIHZhciB0aW1lciA9IG51bGw7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb250ZXh0ID0gdGhpc3x8Y29udGV4dCwgYXJncyA9IGFyZ3VtZW50czsKICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgfSwgZGVsYXkpOwogICAgfTsKICB9LAogIC8vIHJvdW5kIGEgbnVtYmVyIGF3YXkgZnJvbSB6ZXJvIHVzZWQgdG8gc25hcAogIC8vIHJvdy9jb2x1bW5zIGF3YXkgZnJvbSB0aGUgb3JpZ2luIG9mIHRoZSBncmlkCiAgcm91bmRBd2F5RnJvbVplcm86IGZ1bmN0aW9uIChudW0pewogICAgcmV0dXJuIChudW0gPiAwKSA/IE1hdGguY2VpbChudW0pIDogTWF0aC5mbG9vcihudW0pOwogIH0sCiAgdHJpbTogZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL15cc1xzKi8sICcnKS5yZXBsYWNlKC9cc1xzKiQvLCAnJyk7CiAgfSwKICBjbGVhblVybDogZnVuY3Rpb24odXJsKXsKICAgIHVybCA9IEwuZXNyaS5VdGlsLnRyaW0odXJsKTsKCiAgICAvL2FkZCBhIHRyYWlsaW5nIHNsYXNoIHRvIHRoZSB1cmwgaWYgdGhlIHVzZXIgb21pdHRlZCBpdAogICAgaWYodXJsW3VybC5sZW5ndGgtMV0gIT09ICIvIil7CiAgICAgIHVybCArPSAiLyI7CiAgICB9CgogICAgcmV0dXJuIHVybDsKICB9LAogIC8vIHF1aWNrIGFuZCBkaXJ0eSBzZXJpYWxpemF0aW9uCiAgc2VyaWFsaXplOiBmdW5jdGlvbihwYXJhbXMpewogICAgdmFyIHFzPSI/IjsKCiAgICBmb3IodmFyIHBhcmFtIGluIHBhcmFtcyl7CiAgICAgIGlmKHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbSkpewogICAgICAgIHZhciBrZXkgPSBwYXJhbTsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbXNbcGFyYW1dOwogICAgICAgIHFzKz1lbmNvZGVVUklDb21wb25lbnQoa2V5KTsKICAgICAgICBxcys9Ij0iOwogICAgICAgIHFzKz1lbmNvZGVVUklDb21wb25lbnQodmFsdWUpOwogICAgICAgIHFzKz0iJiI7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcXMuc3Vic3RyaW5nKDAsIHFzLmxlbmd0aCAtIDEpOwogIH0sCgogIC8vIGluZGV4IG9mIHBvbHlmaWxsLCBuZWVkZWQgZm9yIElFIDgKICBpbmRleE9mOiBmdW5jdGlvbihhcnIsIG9iaiwgc3RhcnQpewogICAgc3RhcnQgPSBzdGFydCB8fCAwOwogICAgaWYoYXJyLmluZGV4T2YpewogICAgICByZXR1cm4gYXJyLmluZGV4T2Yob2JqLCBzdGFydCk7CiAgICB9CiAgICBmb3IgKHZhciBpID0gc3RhcnQsIGogPSBhcnIubGVuZ3RoOyBpIDwgajsgaSsrKSB7CiAgICAgIGlmIChhcnJbaV0gPT09IG9iaikgeyByZXR1cm4gaTsgfQogICAgfQogICAgcmV0dXJuIC0xOwogIH0sCgogIC8vIGNvbnZlcnQgYW4gZXh0ZW50IChBcmNHSVMpIHRvIExhdExuZ0JvdW5kcyAoTGVhZmxldCkKICBleHRlbnRUb0JvdW5kczogZnVuY3Rpb24oZXh0ZW50KXsKICAgIHZhciBzb3V0aFdlc3QgPSBuZXcgTC5MYXRMbmcoZXh0ZW50LnltaW4sIGV4dGVudC54bWluKTsKICAgIHZhciBub3J0aEVhc3QgPSBuZXcgTC5MYXRMbmcoZXh0ZW50LnltYXgsIGV4dGVudC54bWF4KTsKICAgIHJldHVybiBuZXcgTC5MYXRMbmdCb3VuZHMoc291dGhXZXN0LCBub3J0aEVhc3QpOwogIH0sCgogIC8vIGNvbnZlcnQgYW4gTGF0TG5nQm91bmRzIChMZWFmbGV0KSB0byBleHRlbnQgKEFyY0dJUykKICBib3VuZHNUb0V4dGVudDogZnVuY3Rpb24oYm91bmRzKSB7CiAgICByZXR1cm4gewogICAgICAieG1pbiI6IGJvdW5kcy5nZXRTb3V0aFdlc3QoKS5sbmcsCiAgICAgICJ5bWluIjogYm91bmRzLmdldFNvdXRoV2VzdCgpLmxhdCwKICAgICAgInhtYXgiOiBib3VuZHMuZ2V0Tm9ydGhFYXN0KCkubG5nLAogICAgICAieW1heCI6IGJvdW5kcy5nZXROb3J0aEVhc3QoKS5sYXQsCiAgICAgICJzcGF0aWFsUmVmZXJlbmNlIjogewogICAgICAgICJ3a2lkIiA6IDQzMjYKICAgICAgfQogICAgfTsKICB9LAoKICAvLyBjb252ZXJ0IGEgTGF0TG5nQm91bmRzIChMZWFmbGV0KSB0byBhIEVudmVsb3BlIChUZXJyYWZvcm1lci5SdHJlZSkKICBib3VuZHNUb0VudmVsb3BlOiBmdW5jdGlvbihib3VuZHMpewogICAgdmFyIGV4dGVudCA9IEwuZXNyaS5VdGlsLmJvdW5kc1RvRXh0ZW50KGJvdW5kcyk7CiAgICByZXR1cm4gewogICAgICB4OiBleHRlbnQueG1pbiwKICAgICAgeTogZXh0ZW50LnltaW4sCiAgICAgIHc6IE1hdGguYWJzKGV4dGVudC54bWluIC0gZXh0ZW50LnhtYXgpLAogICAgICBoOiBNYXRoLmFicyhleHRlbnQueW1pbiAtIGV4dGVudC55bWF4KQogICAgfTsKICB9Cn07CgpMLmVzcmkuTWl4aW5zID0ge307CgpMLmVzcmkuTWl4aW5zLmZlYXR1cmVHcmlkID0gewogIF9hY3RpdmVSZXF1ZXN0czogMCwKICBfaW5pdGlhbGl6ZUZlYXR1cmVHcmlkOiBmdW5jdGlvbihtYXApewogICAgdGhpcy5fbWFwID0gbWFwOwogICAgdGhpcy5fcHJldmlvdXNDZWxscyA9IFtdOwogICAgdGhpcy5jZW50ZXIgPSB0aGlzLl9tYXAuZ2V0Q2VudGVyKCk7CiAgICB0aGlzLm9yaWdpbiA9IHRoaXMuX21hcC5wcm9qZWN0KHRoaXMuY2VudGVyKTsKCiAgICB0aGlzLl9tb3ZlSGFuZGxlciA9IEwuZXNyaS5VdGlsLmRlYm91bmNlKGZ1bmN0aW9uKGUpewogICAgICBpZihlLnR5cGUgPT09ICJ6b29tZW5kIil7CiAgICAgICAgdGhpcy5vcmlnaW4gPSB0aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlcik7CiAgICAgICAgdGhpcy5fcHJldmlvdXNDZWxscyA9IFtdOwogICAgICB9CiAgICAgIHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhlLnRhcmdldC5nZXRCb3VuZHMoKSk7CiAgICB9LCB0aGlzLm9wdGlvbnMuZGVib3VuY2UsIHRoaXMpOwoKICAgIG1hcC5vbigiem9vbWVuZCByZXNpemUgbW92ZSIsIHRoaXMuX21vdmVIYW5kbGVyLCB0aGlzKTsKCiAgICB0aGlzLl9yZXF1ZXN0RmVhdHVyZXMobWFwLmdldEJvdW5kcygpKTsKICB9LAogIF9kZXN0cm95RmVhdHVyZUdyaWQ6IGZ1bmN0aW9uKG1hcCl7CiAgICBtYXAub2ZmKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlIiwgdGhpcy5fbW92ZUhhbmRsZXIsIHRoaXMpOwogIH0sCiAgX3JlcXVlc3RGZWF0dXJlczogZnVuY3Rpb24oYm91bmRzKXsKICAgIHZhciBjZWxscyA9IHRoaXMuX2NlbGxzV2l0aGluKGJvdW5kcyk7CgogICAgaWYoY2VsbHMpIHsKICAgICAgdGhpcy5maXJlKCJsb2FkaW5nIiwgeyBib3VuZHM6IGJvdW5kcyB9KTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuX21ha2VSZXF1ZXN0KGNlbGxzW2ldLCBjZWxscywgYm91bmRzKTsKICAgIH0KICB9LAogIF9tYWtlUmVxdWVzdDogZnVuY3Rpb24oY2VsbCwgY2VsbHMsIGJvdW5kcyl7CiAgICB0aGlzLl9hY3RpdmVSZXF1ZXN0cysrOwoKICAgIEwuZXNyaS5nZXQodGhpcy51cmwrInF1ZXJ5IiwgewogICAgICBnZW9tZXRyeVR5cGU6ICJlc3JpR2VvbWV0cnlFbnZlbG9wZSIsCiAgICAgIGdlb21ldHJ5OiBKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChjZWxsLmJvdW5kcykpLAogICAgICBvdXRGaWVsZHM6IioiLAogICAgICBvdXRTcjogNDMyNgogICAgfSwgZnVuY3Rpb24ocmVzcG9uc2UpewoKICAgICAgLy9kZWluY3JpbWVudCB0aGUgcmVxdWVzdCBjb3VudGVyCiAgICAgIHRoaXMuX2FjdGl2ZVJlcXVlc3RzLS07CgogICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gbW9yZSBhY3RpdmUgcmVxdWVzdHMgZmlyZSBhIGxvYWQgZXZlbnQgZm9yIHRoaXMgdmlldwogICAgICBpZih0aGlzLl9hY3RpdmVSZXF1ZXN0cyA8PSAwKXsKICAgICAgICB0aGlzLmZpcmUoImxvYWQiLCB7CiAgICAgICAgICBib3VuZHM6IGJvdW5kcywKICAgICAgICAgIGNlbGxzOiBjZWxscwogICAgICAgIH0pOwogICAgICB9CgogICAgICAvLyBjYWxsIHRoZSByZW5kZXIgbWV0aG9kIHRvIHJlbmRlciBmZWF0dXJlcwogICAgICB0aGlzLl9yZW5kZXIocmVzcG9uc2UpOwogICAgfSwgdGhpcyk7CiAgfSwKICBfY2VsbHNXaXRoaW46IGZ1bmN0aW9uKG1hcEJvdW5kcyl7CiAgICB2YXIgc2l6ZSA9IHRoaXMuX21hcC5nZXRTaXplKCk7CiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fbWFwLnByb2plY3QodGhpcy5fbWFwLmdldENlbnRlcigpKTsKICAgIHZhciBwYWRkaW5nID0gTWF0aC5taW4odGhpcy5vcHRpb25zLmNlbGxTaXplL3NpemUueCwgdGhpcy5vcHRpb25zLmNlbGxTaXplL3NpemUueSk7CiAgICB2YXIgYm91bmRzID0gbWFwQm91bmRzLnBhZCgwLjEpOwogICAgdmFyIGNlbGxzID0gW107CgogICAgdmFyIHRvcExlZnRQb2ludCA9IHRoaXMuX21hcC5wcm9qZWN0KGJvdW5kcy5nZXROb3J0aFdlc3QoKSk7CiAgICB2YXIgYm90dG9tUmlnaHRQb2ludCA9IHRoaXMuX21hcC5wcm9qZWN0KGJvdW5kcy5nZXRTb3V0aEVhc3QoKSk7CgogICAgdmFyIHRvcExlZnQgPSB0b3BMZWZ0UG9pbnQuc3VidHJhY3Qob2Zmc2V0KS5kaXZpZGVCeSh0aGlzLm9wdGlvbnMuY2VsbFNpemUpOwogICAgdmFyIGJvdHRvbVJpZ2h0ID0gYm90dG9tUmlnaHRQb2ludC5zdWJ0cmFjdChvZmZzZXQpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CgogICAgdmFyIG9mZnNldFJvd3MgPSBNYXRoLnJvdW5kKCh0aGlzLm9yaWdpbi54IC0gb2Zmc2V0LngpIC8gdGhpcy5vcHRpb25zLmNlbGxTaXplKTsKICAgIHZhciBvZmZzZXRDb2xzID0gTWF0aC5yb3VuZCgodGhpcy5vcmlnaW4ueSAtIG9mZnNldC55KSAvIHRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CgogICAgdmFyIG1pblJvdyA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKHRvcExlZnQueCktb2Zmc2V0Um93czsKICAgIHZhciBtYXhSb3cgPSBMLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhib3R0b21SaWdodC54KS1vZmZzZXRSb3dzOwogICAgdmFyIG1pbkNvbCA9IEwuZXNyaS5VdGlsLnJvdW5kQXdheUZyb21aZXJvKHRvcExlZnQueSktb2Zmc2V0Q29sczsKICAgIHZhciBtYXhDb2wgPSBMLmVzcmkuVXRpbC5yb3VuZEF3YXlGcm9tWmVybyhib3R0b21SaWdodC55KS1vZmZzZXRDb2xzOwoKICAgIGZvciAodmFyIHJvdyA9IG1pblJvdzsgcm93IDwgbWF4Um93OyByb3crKykgewogICAgICBmb3IgKHZhciBjb2wgPSBtaW5Db2w7IGNvbCA8IG1heENvbDsgY29sKyspIHsKICAgICAgICB2YXIgY2VsbElkID0gImNlbGw6Iityb3crIjoiK2NvbDsKICAgICAgICB2YXIgZHVwbGljYXRlID0gTC5lc3JpLlV0aWwuaW5kZXhPZih0aGlzLl9wcmV2aW91c0NlbGxzLCBjZWxsSWQpID49IDA7CgogICAgICAgIGlmKCFkdXBsaWNhdGUgfHwgIXRoaXMub3B0aW9ucy5kZWR1cGxpY2F0ZSl7CiAgICAgICAgICB2YXIgY2VsbEJvdW5kcyA9IHRoaXMuX2NlbGxFeHRlbnQocm93LCBjb2wpOwogICAgICAgICAgdmFyIGNlbGxDZW50ZXIgPSBjZWxsQm91bmRzLmdldENlbnRlcigpOwogICAgICAgICAgdmFyIHJhZGl1cyA9IGNlbGxDZW50ZXIuZGlzdGFuY2VUbyhjZWxsQm91bmRzLmdldE5vcnRoV2VzdCgpKTsKICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNlbGxDZW50ZXIuZGlzdGFuY2VUbyh0aGlzLmNlbnRlcik7CiAgICAgICAgICB2YXIgY2VsbCA9IHsKICAgICAgICAgICAgcm93OiByb3csCiAgICAgICAgICAgIGNvbDogY29sLAogICAgICAgICAgICBpZDogY2VsbElkLAogICAgICAgICAgICBjZW50ZXI6IGNlbGxDZW50ZXIsCiAgICAgICAgICAgIGJvdW5kczogY2VsbEJvdW5kcywKICAgICAgICAgICAgZGlzdGFuY2U6ZGlzdGFuY2UsCiAgICAgICAgICAgIHJhZGl1czogcmFkaXVzCiAgICAgICAgICB9OwogICAgICAgICAgY2VsbHMucHVzaChjZWxsKTsKICAgICAgICAgIHRoaXMuX3ByZXZpb3VzQ2VsbHMucHVzaChjZWxsSWQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGNlbGxzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgcmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlOwogICAgfSk7CgogICAgcmV0dXJuIGNlbGxzOwogIH0sCiAgX2NlbGxFeHRlbnQ6IGZ1bmN0aW9uKHJvdywgY29sKXsKICAgIHZhciBzd1BvaW50ID0gdGhpcy5fY2VsbFBvaW50KHJvdywgY29sKTsKICAgIHZhciBuZVBvaW50ID0gdGhpcy5fY2VsbFBvaW50KHJvdysxLCBjb2wrMSk7CiAgICB2YXIgc3cgPSB0aGlzLl9tYXAudW5wcm9qZWN0KHN3UG9pbnQpOwogICAgdmFyIG5lID0gdGhpcy5fbWFwLnVucHJvamVjdChuZVBvaW50KTsKICAgIHJldHVybiBMLmxhdExuZ0JvdW5kcyhzdywgbmUpOwogIH0sCiAgX2NlbGxQb2ludDpmdW5jdGlvbihyb3csIGNvbCl7CiAgICB2YXIgeCA9IHRoaXMub3JpZ2luLnggKyAocm93KnRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CiAgICB2YXIgeSA9IHRoaXMub3JpZ2luLnkgKyAoY29sKnRoaXMub3B0aW9ucy5jZWxsU2l6ZSk7CiAgICByZXR1cm4gW3gsIHldOwogIH0KfTsKCkwuZXNyaS5NaXhpbnMuaWRlbnRpZmlhYmxlTGF5ZXIgPSB7CiAgaWRlbnRpZnk6ZnVuY3Rpb24obGF0TG5nLCBvcHRpb25zLCBjYWxsYmFjayl7CiAgICB2YXIgZGVmYXVsdHMgPSB7CiAgICAgIHNyOiAnNDI2NScsCiAgICAgIG1hcEV4dGVudDogSlNPTi5zdHJpbmdpZnkoTC5lc3JpLlV0aWwuYm91bmRzVG9FeHRlbnQodGhpcy5fbWFwLmdldEJvdW5kcygpKSksCiAgICAgIHRvbGVyYW5jZTogMywKICAgICAgZ2VvbWV0cnlUeXBlOiAnZXNyaUdlb21ldHJ5UG9pbnQnLAogICAgICBpbWFnZURpc3BsYXk6ICc4MDAsNjAwLDk2JywKICAgICAgZ2VvbWV0cnk6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICB4OiBsYXRMbmcubG5nLAogICAgICAgIHk6IGxhdExuZy5sYXQsCiAgICAgICAgc3BhdGlhbFJlZmVyZW5jZTogewogICAgICAgICAgd2tpZDogNDI2NQogICAgICAgIH0KICAgICAgfSkKICAgIH07CgogICAgdmFyIHBhcmFtczsKCiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGNhbGxiYWNrID09PSAndW5kZWZpbmVkJykgewogICAgICBjYWxsYmFjayA9IG9wdGlvbnM7CiAgICAgIHBhcmFtcyA9IGRlZmF1bHRzOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHsKICAgICAgaWYgKG9wdGlvbnMubGF5ZXJEZWZzKSB7CiAgICAgICAgb3B0aW9ucy5sYXllckRlZnMgPSB0aGlzLnBhcnNlTGF5ZXJEZWZzKG9wdGlvbnMubGF5ZXJEZWZzKTsKICAgICAgfQoKICAgICAgcGFyYW1zID0gTC5VdGlsLmV4dGVuZChkZWZhdWx0cywgb3B0aW9ucyk7CiAgICB9CgogICAgTC5lc3JpLmdldCh0aGlzLl91cmwgKyAnL2lkZW50aWZ5JywgcGFyYW1zLCBjYWxsYmFjayk7CiAgfSwKICBwYXJzZUxheWVyRGVmczogZnVuY3Rpb24gKGxheWVyRGVmcykgewogICAgaWYgKGxheWVyRGVmcyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgIC8vdGhyb3cgJ211c3QgYmUgb2JqZWN0IG9yIHN0cmluZyc7CiAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICBpZiAodHlwZW9mIGxheWVyRGVmcyA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGxheWVyRGVmcyk7CiAgICB9CgogICAgcmV0dXJuIGxheWVyRGVmczsKICB9Cn07CgooZnVuY3Rpb24oTCl7CgogIHZhciB0aWxlUHJvdG9jb2wgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sICE9PSAiaHR0cHM6IikgPyAiaHR0cDoiIDogImh0dHBzOiI7CiAgdmFyIGF0dHJpYnV0aW9uU3R5bGVzID0gImxpbmUtaGVpZ2h0OjlweDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsgd2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjsgZGlzcGxheTppbmxpbmUtYmxvY2s7IjsKICB2YXIgbG9nb1N0eWxlcyA9ICJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zOHB4OyByaWdodDoycHg7IjsKICB2YXIgYXR0cmlidXRpb25Mb2dvID0gIjxpbWcgc3JjPSdodHRwczovL3NlcnZlcmFwaS5hcmNnaXNvbmxpbmUuY29tL2pzYXBpL2FyY2dpcy8zLjUvanMvZXNyaS9pbWFnZXMvbWFwL2xvZ28tbWVkLnBuZycgYWx0PSdQb3dlcmVkIGJ5IEVzcmknIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9uLWxvZ28nIHN0eWxlPSciK2xvZ29TdHlsZXMrIic+IjsKICB2YXIgZm9ybWF0VGV4dEF0dHJpYnV0aW9ucyA9IGZ1bmN0aW9uIGZvcm1hdFRleHRBdHRyaWJ1dGlvbnModGV4dCl7CiAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSdlc3JpLWF0dHJpYnV0aW9ucycgc3R5bGU9JyIrYXR0cmlidXRpb25TdHlsZXMrIic+IiArIHRleHQgKyAiPC9zcGFuPiI7CiAgfTsKCiAgTC5lc3JpLkJhc2VtYXBMYXllciA9IEwuVGlsZUxheWVyLmV4dGVuZCh7CiAgICBzdGF0aWNzOiB7CiAgICAgIFRJTEVTOiB7CiAgICAgICAgU3RyZWV0czogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1N0cmVldF9NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9TdHJlZXRfTWFwP2Y9anNvbiIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBUb3BvZ3JhcGhpYzogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1RvcG9fTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBhdHRyaWJ1dGlvblVybDogImh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfVG9wb19NYXA/Zj1qc29uIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTksCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFc3JpIikgKyBhdHRyaWJ1dGlvbkxvZ28KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIE9jZWFuczogewogICAgICAgICAgdXJsVGVtcGxhdGU6ICJodHRwczovL3NlcnZlci5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL09jZWFuX0Jhc2VtYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIGF0dHJpYnV0aW9uVXJsOiAiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9PY2Vhbl9CYXNlbWFwP2Y9anNvbiIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBOYXRpb25hbEdlb2dyYXBoaWM6IHsKICAgICAgICAgIHVybFRlbXBsYXRlOiAiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdLAogICAgICAgICAgICBhdHRyaWJ1dGlvbjogZm9ybWF0VGV4dEF0dHJpYnV0aW9ucygiRXNyaSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBHcmF5OiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfQmFzZS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxNiwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmksIE5BVlRFUSwgRGVMb3JtZSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBHcmF5TGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvQ2FudmFzL1dvcmxkX0xpZ2h0X0dyYXlfUmVmZXJlbmNlL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE2LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5OiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXSwKICAgICAgICAgICAgYXR0cmlidXRpb246IGZvcm1hdFRleHRBdHRyaWJ1dGlvbnMoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpICsgYXR0cmlidXRpb25Mb2dvCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5TGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlcy9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLAogICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICBtaW5ab29tOiAxLAogICAgICAgICAgICBtYXhab29tOiAxOSwKICAgICAgICAgICAgc3ViZG9tYWluczogWyJzZXJ2ZXIiLCAic2VydmljZXMiXQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgSW1hZ2VyeVRyYW5zcG9ydGF0aW9uOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX1RyYW5zcG9ydGF0aW9uL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsCiAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIG1pblpvb206IDEsCiAgICAgICAgICAgIG1heFpvb206IDE5LAogICAgICAgICAgICBzdWJkb21haW5zOiBbInNlcnZlciIsICJzZXJ2aWNlcyJdCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBJbWFnZXJ5QWx0ZXJuYXRlTGFiZWxzOiB7CiAgICAgICAgICB1cmxUZW1wbGF0ZTogdGlsZVByb3RvY29sICsgIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTIsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIFNoYWRlZFJlbGllZjogewogICAgICAgICAgdXJsVGVtcGxhdGU6IHRpbGVQcm90b2NvbCArICIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1dvcmxkX1NoYWRlZF9SZWxpZWYvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIiwKICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgbWluWm9vbTogMSwKICAgICAgICAgICAgbWF4Wm9vbTogMTMsCiAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsic2VydmVyIiwgInNlcnZpY2VzIl0sCiAgICAgICAgICAgIGF0dHJpYnV0aW9uOiBmb3JtYXRUZXh0QXR0cmlidXRpb25zKCJFU1JJLCBOQVZURVEsIERlTG9ybWUiKSArIGF0dHJpYnV0aW9uTG9nbwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIH0KICAgIH0sCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbihrZXksIG9wdGlvbnMpewogICAgICB2YXIgY29uZmlnOwogICAgICAvLyBzZXQgdGhlIGNvbmZpZyB2YXJpYWJsZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjb25maWcgb2JqZWN0CiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAib2JqZWN0IiAmJiBrZXkudXJsVGVtcGxhdGUgJiYga2V5Lm9wdGlvbnMpewogICAgICAgIGNvbmZpZyA9IGtleTsKICAgICAgfSBlbHNlIGlmKHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICYmIEwuZXNyaS5CYXNlbWFwTGF5ZXIuVElMRVNba2V5XSl7CiAgICAgICAgY29uZmlnID0gTC5lc3JpLkJhc2VtYXBMYXllci5USUxFU1trZXldOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTC5lc3JpLkJhc2VtYXBMYXllcjogSW52YWxpZCBwYXJhbWV0ZXIuIFVzZSBvbmUgb2YgJ1N0cmVldHMnLCAnVG9wb2dyYXBoaWMnLCAnT2NlYW5zJywgJ05hdGlvbmFsR2VvZ3JhcGhpYycsICdHcmF5JywgJ0dyYXlMYWJlbHMnLCAnSW1hZ2VyeScsICdJbWFnZXJ5TGFiZWxzJywgJ0ltYWdlcnlUcmFuc3BvcnRhdGlvbicsICdJbWFnZXJ5QWx0ZXJuYXRlTGFiZWxzJyBvciAnU2hhZGVkUmVsaWVmJyIpOwogICAgICB9CgogICAgICAvLyBtZXJnZSBwYXNzZWQgb3B0aW9ucyBpbnRvIHRoZSBjb25maWcgb3B0aW9ucwogICAgICB2YXIgbWVyZ2VkT3B0aW9ucyA9IEwuVXRpbC5leHRlbmQoY29uZmlnLm9wdGlvbnMsIG9wdGlvbnMpOwoKICAgICAgLy8gY2xlYW4gdXAgb3VyIGlucHV0IHVybAogICAgICB2YXIgdXJsID0gTC5lc3JpLlV0aWwuY2xlYW5VcmwoY29uZmlnLnVybFRlbXBsYXRlKTsKCiAgICAgIC8vIGNhbGwgdGhlIGluaXRpYWxpemUgbWV0aG9kIG9uIEwuVGlsZUxheWVyIHRvIHNldCBldmVyeXRoaW5nIHVwCiAgICAgIEwuVGlsZUxheWVyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgdXJsLCBMLlV0aWwuc2V0T3B0aW9ucyh0aGlzLCBtZXJnZWRPcHRpb25zKSk7CgogICAgICAvLyBpZiB0aGlzIGJhc2VtYXAgcmVxdWlyZXMgZHluYW1pYyBhdHRyaWJ1dGlvbiBzZXQgaXQgdXAKICAgICAgaWYoY29uZmlnLmF0dHJpYnV0aW9uVXJsKXsKICAgICAgICB2YXIgYXR0cmlidXRpb25VcmwgPSBMLmVzcmkuVXRpbC5jbGVhblVybChjb25maWcuYXR0cmlidXRpb25VcmwpOwogICAgICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGlvbiA9IHRydWU7CiAgICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25EYXRhKGF0dHJpYnV0aW9uVXJsKTsKICAgICAgfQogICAgfSwKICAgIF9keW5hbWljQXR0cmlidXRpb246IGZhbHNlLAogICAgYm91bmRzOiBudWxsLAogICAgem9vbTogbnVsbCwKICAgIG9uQWRkOiBmdW5jdGlvbihtYXApewogICAgICBMLlRpbGVMYXllci5wcm90b3R5cGUub25BZGQuY2FsbCh0aGlzLCBtYXApOwogICAgICBpZih0aGlzLl9keW5hbWljQXR0cmlidXRpb24pewogICAgICAgIHRoaXMub24oImxvYWQiLCB0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcywgdGhpcyk7CiAgICAgICAgdGhpcy5fbWFwLm9uKCJ2aWV3cmVzZXQgem9vbWVuZCBkcmFnZW5kIiwgdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsIHRoaXMpOwogICAgICB9CiAgICAgIHRoaXMuX21hcC5vbigicmVzaXplIiwgdGhpcy5fcmVzaXplQXR0cmlidXRpb24sIHRoaXMpOwogICAgfSwKICAgIG9uUmVtb3ZlOiBmdW5jdGlvbihtYXApewogICAgICBpZih0aGlzLl9keW5hbWljQXR0cmlidXRpb24pewogICAgICAgIHRoaXMub2ZmKCJsb2FkIiwgdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsIHRoaXMpOwogICAgICAgIHRoaXMuX21hcC5vZmYoInZpZXdyZXNldCB6b29tZW5kIGRyYWdlbmQiLCB0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcywgdGhpcyk7CiAgICAgIH0KICAgICAgdGhpcy5fbWFwLm9mZigicmVzaXplIiwgdGhpcy5fcmVzaXplQXR0cmlidXRpb24sIHRoaXMpOwogICAgICBMLlRpbGVMYXllci5wcm90b3R5cGUub25SZW1vdmUuY2FsbCh0aGlzLCBtYXApOwogICAgfSwKICAgIF9oYW5kbGVUaWxlVXBkYXRlczogZnVuY3Rpb24oZSl7CiAgICAgIHZhciBuZXdCb3VuZHM7CiAgICAgIHZhciBuZXdab29tOwoKICAgICAgaWYoZS50eXBlID09PSAibG9hZCIpewogICAgICAgIG5ld0JvdW5kcyA9IHRoaXMuX21hcC5nZXRCb3VuZHMoKTsKICAgICAgICBuZXdab29tID0gdGhpcy5fbWFwLmdldFpvb20oKTsKICAgICAgfQoKICAgICAgaWYoZS50eXBlID09PSAidmlld3Jlc2V0IiB8fCBlLnR5cGUgPT09ICJkcmFnZW5kIiB8fCBlLnR5cGUgPT09Inpvb21lbmQiKXsKICAgICAgICBuZXdCb3VuZHMgPSBlLnRhcmdldC5nZXRCb3VuZHMoKTsKICAgICAgICBuZXdab29tID0gZS50YXJnZXQuZ2V0Wm9vbSgpOwogICAgICB9CgogICAgICBpZih0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcyAmJiBuZXdCb3VuZHMgJiYgbmV3Wm9vbSl7CiAgICAgICAgaWYoIW5ld0JvdW5kcy5lcXVhbHModGhpcy5ib3VuZHMpIHx8IG5ld1pvb20gIT09IHRoaXMuem9vbSl7CiAgICAgICAgICB0aGlzLmJvdW5kcyA9IG5ld0JvdW5kczsKICAgICAgICAgIHRoaXMuem9vbSA9IG5ld1pvb207CiAgICAgICAgICB0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIF9yZXNpemVBdHRyaWJ1dGlvbjogZnVuY3Rpb24oKXsKICAgICAgdmFyIG1hcFdpZHRoID0gdGhpcy5fbWFwLmdldFNpemUoKS54OwogICAgICB0aGlzLl9nZXRBdHRyaWJ1dGlvbkxvZ28oKS5zdHlsZS5kaXNwbGF5ID0gKG1hcFdpZHRoIDwgNjAwKSA/ICJub25lIjoiYmxvY2siOwogICAgICB0aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5zdHlsZS5tYXhXaWR0aCA9ICAobWFwV2lkdGgqIDAuNzUpICsgInB4IjsKICAgIH0sCiAgICBfZ2V0QXR0cmlidXRpb25EYXRhOiBmdW5jdGlvbih1cmwpewogICAgICB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcyA9IFtdOwogICAgICBMLmVzcmkuZ2V0KHVybCwge30sIHRoaXMuX3Byb2Nlc3NBdHRyaWJ1dGlvbkRhdGEsIHRoaXMpOwogICAgfSwKICAgIF9wcm9jZXNzQXR0cmlidXRpb25EYXRhOiBmdW5jdGlvbihhdHRyaWJ1dGlvbkRhdGEpewogICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGF0dHJpYnV0aW9uRGF0YS5jb250cmlidXRvcnMubGVuZ3RoOyBjKyspIHsKICAgICAgICB2YXIgY29udHJpYnV0b3IgPSBhdHRyaWJ1dGlvbkRhdGEuY29udHJpYnV0b3JzW2NdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29udHJpYnV0b3IuY292ZXJhZ2VBcmVhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGNvdmVyYWdlQXJlYSA9IGNvbnRyaWJ1dG9yLmNvdmVyYWdlQXJlYXNbaV07CiAgICAgICAgICB2YXIgc291dGhXZXN0ID0gbmV3IEwuTGF0TG5nKGNvdmVyYWdlQXJlYS5iYm94WzBdLCBjb3ZlcmFnZUFyZWEuYmJveFsxXSk7CiAgICAgICAgICB2YXIgbm9ydGhFYXN0ID0gbmV3IEwuTGF0TG5nKGNvdmVyYWdlQXJlYS5iYm94WzJdLCBjb3ZlcmFnZUFyZWEuYmJveFszXSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5wdXNoKHsKICAgICAgICAgICAgYXR0cmlidXRpb246IGNvbnRyaWJ1dG9yLmF0dHJpYnV0aW9uLAogICAgICAgICAgICBzY29yZTogY292ZXJhZ2VBcmVhLnNjb3JlLAogICAgICAgICAgICBib3VuZHM6IG5ldyBMLkxhdExuZ0JvdW5kcyhzb3V0aFdlc3QsIG5vcnRoRWFzdCksCiAgICAgICAgICAgIG1pblpvb206IGNvdmVyYWdlQXJlYS56b29tTWluLAogICAgICAgICAgICBtYXhab29tOiBjb3ZlcmFnZUFyZWEuem9vbU1heAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLnNvcnQoZnVuY3Rpb24oYSxiKXsKICAgICAgICBpZiAoYS5zY29yZSA8IGIuc2NvcmUpeyByZXR1cm4gLTE7IH0KICAgICAgICBpZiAoYS5zY29yZSA+IGIuc2NvcmUpeyByZXR1cm4gMTsgfQogICAgICAgIHJldHVybiAwOwogICAgICB9KTsKICAgICAgaWYodGhpcy5ib3VuZHMpewogICAgICAgIHRoaXMuX3VwZGF0ZU1hcEF0dHJpYnV0aW9uKCk7CiAgICAgIH0KICAgIH0sCiAgICBfZ2V0QXR0cmlidXRpb25TcGFuOmZ1bmN0aW9uKCl7CiAgICAgIHJldHVybiB0aGlzLl9tYXAuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZXNyaS1hdHRyaWJ1dGlvbnMnKVswXTsKICAgIH0sCiAgICBfZ2V0QXR0cmlidXRpb25Mb2dvOmZ1bmN0aW9uKCl7CiAgICAgIHJldHVybiB0aGlzLl9tYXAuX2NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZXNyaS1hdHRyaWJ1dGlvbi1sb2dvJylbMF07CiAgICB9LAogICAgX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOiBmdW5jdGlvbigpewogICAgICB2YXIgbmV3QXR0cmlidXRpb25zID0gJyc7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYXR0ciA9IHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2ldOwogICAgICAgIGlmKHRoaXMuYm91bmRzLmludGVyc2VjdHMoYXR0ci5ib3VuZHMpICYmIHRoaXMuem9vbSA+PSBhdHRyLm1pblpvb20gJiYgdGhpcy56b29tIDw9IGF0dHIubWF4Wm9vbSkgewogICAgICAgICAgdmFyIGF0dHJpYnV0aW9uID0gdGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXNbaV0uYXR0cmlidXRpb247CiAgICAgICAgICBpZihuZXdBdHRyaWJ1dGlvbnMuaW5kZXhPZihhdHRyaWJ1dGlvbikgPT09IC0xKXsKICAgICAgICAgICAgaWYobmV3QXR0cmlidXRpb25zLmxlbmd0aCA+IDApewogICAgICAgICAgICAgIG5ld0F0dHJpYnV0aW9ucyArPSAnLCAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ld0F0dHJpYnV0aW9ucyArPSBhdHRyaWJ1dGlvbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fZ2V0QXR0cmlidXRpb25TcGFuKCkuaW5uZXJIVE1MID0gbmV3QXR0cmlidXRpb25zOwogICAgICB0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbigpOwogICAgfQogIH0pOwoKICBMLmVzcmkuYmFzZW1hcExheWVyID0gZnVuY3Rpb24oa2V5LCBvcHRpb25zKXsKICAgIHJldHVybiBuZXcgTC5lc3JpLkJhc2VtYXBMYXllcihrZXksIG9wdGlvbnMpOwogIH07Cgp9KShMKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/js/esri-leaflet/extras/esri-basemaps.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIEVzcmktTGVhZmxldCAtIHYwLjAuMSAtIDIwMTMtMDktMjYKKiAgIENvcHlyaWdodCAoYykgMjAxMyBFbnZpcm9ubWVudGFsIFN5c3RlbXMgUmVzZWFyY2ggSW5zdGl0dXRlLCBJbmMuCiogICBBcGFjaGUgTGljZW5zZSovCkwuZXNyaT17X2NhbGxiYWNrOnt9fSxMLmVzcmkuU3VwcG9ydD17Q09SUzohISh3aW5kb3cuWE1MSHR0cFJlcXVlc3QmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KX0sTC5lc3JpLlJlcXVlc3RIYW5kbGVycz17Q09SUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7Yi5mPSJqc29uIixlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe3ZhciBhO2lmKDQ9PT1lLnJlYWR5U3RhdGUpe3RyeXthPUpTT04ucGFyc2UoZS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe2E9e2Vycm9yOiJDb3VsZCBub3QgcGFyc2UgcmVzcG9uc2UgYXMgSlNPTi4ifX1kP2MuY2FsbChkLGEpOmMoYSl9fSxlLm9wZW4oIkdFVCIsYStMLmVzcmkuVXRpbC5zZXJpYWxpemUoYiksITApLGUuc2VuZChudWxsKX0sSlNPTlA6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ImMiKygxZTkqTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMzYpLnJlcGxhY2UoIi4iLCJfIik7Yi5mPSJqc29uIixiLmNhbGxiYWNrPSJMLmVzcmkuX2NhbGxiYWNrLiIrZTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZi5zcmM9YStMLmVzcmkuVXRpbC5zZXJpYWxpemUoYiksZi5pZD1lLEwuZXNyaS5fY2FsbGJhY2tbZV09ZnVuY3Rpb24oYSl7ZD9jLmNhbGwoZCxhKTpjKGEpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZiksZGVsZXRlIEwuZXNyaS5fY2FsbGJhY2tbZV19LGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZil9fSxMLmVzcmkuZ2V0PUwuZXNyaS5TdXBwb3J0LkNPUlM/TC5lc3JpLlJlcXVlc3RIYW5kbGVycy5DT1JTOkwuZXNyaS5SZXF1ZXN0SGFuZGxlcnMuSlNPTlAsTC5lc3JpLlV0aWw9e2RlYm91bmNlOmZ1bmN0aW9uKGEsYil7dmFyIGM9bnVsbDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzfHxkLGU9YXJndW1lbnRzO2NsZWFyVGltZW91dChjKSxjPXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLmFwcGx5KGQsZSl9LGIpfX0scm91bmRBd2F5RnJvbVplcm86ZnVuY3Rpb24oYSl7cmV0dXJuIGE+MD9NYXRoLmNlaWwoYSk6TWF0aC5mbG9vcihhKX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC9eXHNccyovLCIiKS5yZXBsYWNlKC9cc1xzKiQvLCIiKX0sY2xlYW5Vcmw6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9TC5lc3JpLlV0aWwudHJpbShhKSwiLyIhPT1hW2EubGVuZ3RoLTFdJiYoYSs9Ii8iKSxhfSxzZXJpYWxpemU6ZnVuY3Rpb24oYSl7dmFyIGI9Ij8iO2Zvcih2YXIgYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe3ZhciBkPWMsZT1hW2NdO2IrPWVuY29kZVVSSUNvbXBvbmVudChkKSxiKz0iPSIsYis9ZW5jb2RlVVJJQ29tcG9uZW50KGUpLGIrPSImIn1yZXR1cm4gYi5zdWJzdHJpbmcoMCxiLmxlbmd0aC0xKX0saW5kZXhPZjpmdW5jdGlvbihhLGIsYyl7aWYoYz1jfHwwLGEuaW5kZXhPZilyZXR1cm4gYS5pbmRleE9mKGIsYyk7Zm9yKHZhciBkPWMsZT1hLmxlbmd0aDtlPmQ7ZCsrKWlmKGFbZF09PT1iKXJldHVybiBkO3JldHVybi0xfSxleHRlbnRUb0JvdW5kczpmdW5jdGlvbihhKXt2YXIgYj1uZXcgTC5MYXRMbmcoYS55bWluLGEueG1pbiksYz1uZXcgTC5MYXRMbmcoYS55bWF4LGEueG1heCk7cmV0dXJuIG5ldyBMLkxhdExuZ0JvdW5kcyhiLGMpfSxib3VuZHNUb0V4dGVudDpmdW5jdGlvbihhKXtyZXR1cm57eG1pbjphLmdldFNvdXRoV2VzdCgpLmxuZyx5bWluOmEuZ2V0U291dGhXZXN0KCkubGF0LHhtYXg6YS5nZXROb3J0aEVhc3QoKS5sbmcseW1heDphLmdldE5vcnRoRWFzdCgpLmxhdCxzcGF0aWFsUmVmZXJlbmNlOnt3a2lkOjQzMjZ9fX0sYm91bmRzVG9FbnZlbG9wZTpmdW5jdGlvbihhKXt2YXIgYj1MLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChhKTtyZXR1cm57eDpiLnhtaW4seTpiLnltaW4sdzpNYXRoLmFicyhiLnhtaW4tYi54bWF4KSxoOk1hdGguYWJzKGIueW1pbi1iLnltYXgpfX19LEwuZXNyaS5NaXhpbnM9e30sTC5lc3JpLk1peGlucy5mZWF0dXJlR3JpZD17X2FjdGl2ZVJlcXVlc3RzOjAsX2luaXRpYWxpemVGZWF0dXJlR3JpZDpmdW5jdGlvbihhKXt0aGlzLl9tYXA9YSx0aGlzLl9wcmV2aW91c0NlbGxzPVtdLHRoaXMuY2VudGVyPXRoaXMuX21hcC5nZXRDZW50ZXIoKSx0aGlzLm9yaWdpbj10aGlzLl9tYXAucHJvamVjdCh0aGlzLmNlbnRlciksdGhpcy5fbW92ZUhhbmRsZXI9TC5lc3JpLlV0aWwuZGVib3VuY2UoZnVuY3Rpb24oYSl7Inpvb21lbmQiPT09YS50eXBlJiYodGhpcy5vcmlnaW49dGhpcy5fbWFwLnByb2plY3QodGhpcy5jZW50ZXIpLHRoaXMuX3ByZXZpb3VzQ2VsbHM9W10pLHRoaXMuX3JlcXVlc3RGZWF0dXJlcyhhLnRhcmdldC5nZXRCb3VuZHMoKSl9LHRoaXMub3B0aW9ucy5kZWJvdW5jZSx0aGlzKSxhLm9uKCJ6b29tZW5kIHJlc2l6ZSBtb3ZlIix0aGlzLl9tb3ZlSGFuZGxlcix0aGlzKSx0aGlzLl9yZXF1ZXN0RmVhdHVyZXMoYS5nZXRCb3VuZHMoKSl9LF9kZXN0cm95RmVhdHVyZUdyaWQ6ZnVuY3Rpb24oYSl7YS5vZmYoInpvb21lbmQgcmVzaXplIG1vdmUiLHRoaXMuX21vdmVIYW5kbGVyLHRoaXMpfSxfcmVxdWVzdEZlYXR1cmVzOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2NlbGxzV2l0aGluKGEpO2ImJnRoaXMuZmlyZSgibG9hZGluZyIse2JvdW5kczphfSk7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5fbWFrZVJlcXVlc3QoYltjXSxiLGEpfSxfbWFrZVJlcXVlc3Q6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuX2FjdGl2ZVJlcXVlc3RzKyssTC5lc3JpLmdldCh0aGlzLnVybCsicXVlcnkiLHtnZW9tZXRyeVR5cGU6ImVzcmlHZW9tZXRyeUVudmVsb3BlIixnZW9tZXRyeTpKU09OLnN0cmluZ2lmeShMLmVzcmkuVXRpbC5ib3VuZHNUb0V4dGVudChhLmJvdW5kcykpLG91dEZpZWxkczoiKiIsb3V0U3I6NDMyNn0sZnVuY3Rpb24oYSl7dGhpcy5fYWN0aXZlUmVxdWVzdHMtLSx0aGlzLl9hY3RpdmVSZXF1ZXN0czw9MCYmdGhpcy5maXJlKCJsb2FkIix7Ym91bmRzOmMsY2VsbHM6Yn0pLHRoaXMuX3JlbmRlcihhKX0sdGhpcyl9LF9jZWxsc1dpdGhpbjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLl9tYXAuZ2V0U2l6ZSgpLGM9dGhpcy5fbWFwLnByb2plY3QodGhpcy5fbWFwLmdldENlbnRlcigpKTtNYXRoLm1pbih0aGlzLm9wdGlvbnMuY2VsbFNpemUvYi54LHRoaXMub3B0aW9ucy5jZWxsU2l6ZS9iLnkpO2Zvcih2YXIgZD1hLnBhZCguMSksZT1bXSxmPXRoaXMuX21hcC5wcm9qZWN0KGQuZ2V0Tm9ydGhXZXN0KCkpLGc9dGhpcy5fbWFwLnByb2plY3QoZC5nZXRTb3V0aEVhc3QoKSksaD1mLnN1YnRyYWN0KGMpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSksaT1nLnN1YnRyYWN0KGMpLmRpdmlkZUJ5KHRoaXMub3B0aW9ucy5jZWxsU2l6ZSksaj1NYXRoLnJvdW5kKCh0aGlzLm9yaWdpbi54LWMueCkvdGhpcy5vcHRpb25zLmNlbGxTaXplKSxrPU1hdGgucm91bmQoKHRoaXMub3JpZ2luLnktYy55KS90aGlzLm9wdGlvbnMuY2VsbFNpemUpLGw9TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaC54KS1qLG09TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaS54KS1qLG49TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaC55KS1rLG89TC5lc3JpLlV0aWwucm91bmRBd2F5RnJvbVplcm8oaS55KS1rLHA9bDttPnA7cCsrKWZvcih2YXIgcT1uO28+cTtxKyspe3ZhciByPSJjZWxsOiIrcCsiOiIrcSxzPUwuZXNyaS5VdGlsLmluZGV4T2YodGhpcy5fcHJldmlvdXNDZWxscyxyKT49MDtpZighc3x8IXRoaXMub3B0aW9ucy5kZWR1cGxpY2F0ZSl7dmFyIHQ9dGhpcy5fY2VsbEV4dGVudChwLHEpLHU9dC5nZXRDZW50ZXIoKSx2PXUuZGlzdGFuY2VUbyh0LmdldE5vcnRoV2VzdCgpKSx3PXUuZGlzdGFuY2VUbyh0aGlzLmNlbnRlcikseD17cm93OnAsY29sOnEsaWQ6cixjZW50ZXI6dSxib3VuZHM6dCxkaXN0YW5jZTp3LHJhZGl1czp2fTtlLnB1c2goeCksdGhpcy5fcHJldmlvdXNDZWxscy5wdXNoKHIpfX1yZXR1cm4gZS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZGlzdGFuY2UtYi5kaXN0YW5jZX0pLGV9LF9jZWxsRXh0ZW50OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fY2VsbFBvaW50KGEsYiksZD10aGlzLl9jZWxsUG9pbnQoYSsxLGIrMSksZT10aGlzLl9tYXAudW5wcm9qZWN0KGMpLGY9dGhpcy5fbWFwLnVucHJvamVjdChkKTtyZXR1cm4gTC5sYXRMbmdCb3VuZHMoZSxmKX0sX2NlbGxQb2ludDpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMub3JpZ2luLngrYSp0aGlzLm9wdGlvbnMuY2VsbFNpemUsZD10aGlzLm9yaWdpbi55K2IqdGhpcy5vcHRpb25zLmNlbGxTaXplO3JldHVybltjLGRdfX0sTC5lc3JpLk1peGlucy5pZGVudGlmaWFibGVMYXllcj17aWRlbnRpZnk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9e3NyOiI0MjY1IixtYXBFeHRlbnQ6SlNPTi5zdHJpbmdpZnkoTC5lc3JpLlV0aWwuYm91bmRzVG9FeHRlbnQodGhpcy5fbWFwLmdldEJvdW5kcygpKSksdG9sZXJhbmNlOjMsZ2VvbWV0cnlUeXBlOiJlc3JpR2VvbWV0cnlQb2ludCIsaW1hZ2VEaXNwbGF5OiI4MDAsNjAwLDk2IixnZW9tZXRyeTpKU09OLnN0cmluZ2lmeSh7eDphLmxuZyx5OmEubGF0LHNwYXRpYWxSZWZlcmVuY2U6e3draWQ6NDI2NX19KX07ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJ1bmRlZmluZWQiPT10eXBlb2YgYz8oYz1iLGQ9ZSk6Im9iamVjdCI9PXR5cGVvZiBiJiYoYi5sYXllckRlZnMmJihiLmxheWVyRGVmcz10aGlzLnBhcnNlTGF5ZXJEZWZzKGIubGF5ZXJEZWZzKSksZD1MLlV0aWwuZXh0ZW5kKGUsYikpLEwuZXNyaS5nZXQodGhpcy5fdXJsKyIvaWRlbnRpZnkiLGQsYyl9LHBhcnNlTGF5ZXJEZWZzOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgQXJyYXk/IiI6Im9iamVjdCI9PXR5cGVvZiBhP0pTT04uc3RyaW5naWZ5KGEpOmF9fSxmdW5jdGlvbihhKXt2YXIgYj0iaHR0cHM6IiE9PXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD8iaHR0cDoiOiJodHRwczoiLGM9ImxpbmUtaGVpZ2h0OjlweDsgdGV4dC1vdmVyZmxvdzplbGxpcHNpczsgd2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjsgZGlzcGxheTppbmxpbmUtYmxvY2s7IixkPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOi0zOHB4OyByaWdodDoycHg7IixlPSI8aW1nIHNyYz0naHR0cHM6Ly9zZXJ2ZXJhcGkuYXJjZ2lzb25saW5lLmNvbS9qc2FwaS9hcmNnaXMvMy41L2pzL2VzcmkvaW1hZ2VzL21hcC9sb2dvLW1lZC5wbmcnIGFsdD0nUG93ZXJlZCBieSBFc3JpJyBjbGFzcz0nZXNyaS1hdHRyaWJ1dGlvbi1sb2dvJyBzdHlsZT0nIitkKyInPiIsZj1mdW5jdGlvbihhKXtyZXR1cm4iPHNwYW4gY2xhc3M9J2VzcmktYXR0cmlidXRpb25zJyBzdHlsZT0nIitjKyInPiIrYSsiPC9zcGFuPiJ9O2EuZXNyaS5CYXNlbWFwTGF5ZXI9YS5UaWxlTGF5ZXIuZXh0ZW5kKHtzdGF0aWNzOntUSUxFUzp7U3RyZWV0czp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TdHJlZXRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsYXR0cmlidXRpb25Vcmw6Imh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vV29ybGRfU3RyZWV0X01hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sVG9wb2dyYXBoaWM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixhdHRyaWJ1dGlvblVybDoiaHR0cHM6Ly9zdGF0aWMuYXJjZ2lzLmNvbS9hdHRyaWJ1dGlvbi9Xb3JsZF9Ub3BvX01hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sT2NlYW5zOnt1cmxUZW1wbGF0ZToiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9PY2Vhbl9CYXNlbWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsYXR0cmlidXRpb25Vcmw6Imh0dHBzOi8vc3RhdGljLmFyY2dpcy5jb20vYXR0cmlidXRpb24vT2NlYW5fQmFzZW1hcD9mPWpzb24iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE2LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmkiKStlfX0sTmF0aW9uYWxHZW9ncmFwaGljOnt1cmxUZW1wbGF0ZToiaHR0cHM6Ly9zZXJ2ZXIuYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9OYXRHZW9fV29ybGRfTWFwL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTYsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRXNyaSIpK2V9fSxHcmF5Ont1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL0NhbnZhcy9Xb3JsZF9MaWdodF9HcmF5X0Jhc2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXSxhdHRyaWJ1dGlvbjpmKCJFc3JpLCBOQVZURVEsIERlTG9ybWUiKStlfX0sR3JheUxhYmVsczp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9DYW52YXMvV29ybGRfTGlnaHRfR3JheV9SZWZlcmVuY2UvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxNixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnk6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfSW1hZ2VyeS9NYXBTZXJ2ZXIvdGlsZS97en0ve3l9L3t4fS8iLG9wdGlvbnM6e21pblpvb206MSxtYXhab29tOjE5LHN1YmRvbWFpbnM6WyJzZXJ2ZXIiLCJzZXJ2aWNlcyJdLGF0dHJpYnV0aW9uOmYoIkVzcmksIERpZ2l0YWxHbG9iZSwgR2VvRXllLCBpLWN1YmVkLCBVU0RBLCBVU0dTLCBBRVgsIEdldG1hcHBpbmcsIEFlcm9ncmlkLCBJR04sIElHUCwgc3dpc3N0b3BvLCBhbmQgdGhlIEdJUyBVc2VyIENvbW11bml0eSIpK2V9fSxJbWFnZXJ5TGFiZWxzOnt1cmxUZW1wbGF0ZTpiKyIvL3tzfS5hcmNnaXNvbmxpbmUuY29tL0FyY0dJUy9yZXN0L3NlcnZpY2VzL1JlZmVyZW5jZS9Xb3JsZF9Cb3VuZGFyaWVzX2FuZF9QbGFjZXMvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnlUcmFuc3BvcnRhdGlvbjp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9SZWZlcmVuY2UvV29ybGRfVHJhbnNwb3J0YXRpb24vTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxOSxzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LEltYWdlcnlBbHRlcm5hdGVMYWJlbHM6e3VybFRlbXBsYXRlOmIrIi8ve3N9LmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvUmVmZXJlbmNlL1dvcmxkX0JvdW5kYXJpZXNfYW5kX1BsYWNlc19BbHRlcm5hdGUvTWFwU2VydmVyL3RpbGUve3p9L3t5fS97eH0vIixvcHRpb25zOnttaW5ab29tOjEsbWF4Wm9vbToxMixzdWJkb21haW5zOlsic2VydmVyIiwic2VydmljZXMiXX19LFNoYWRlZFJlbGllZjp7dXJsVGVtcGxhdGU6YisiLy97c30uYXJjZ2lzb25saW5lLmNvbS9BcmNHSVMvcmVzdC9zZXJ2aWNlcy9Xb3JsZF9TaGFkZWRfUmVsaWVmL01hcFNlcnZlci90aWxlL3t6fS97eX0ve3h9LyIsb3B0aW9uczp7bWluWm9vbToxLG1heFpvb206MTMsc3ViZG9tYWluczpbInNlcnZlciIsInNlcnZpY2VzIl0sYXR0cmlidXRpb246ZigiRVNSSSwgTkFWVEVRLCBEZUxvcm1lIikrZX19fX0saW5pdGlhbGl6ZTpmdW5jdGlvbihiLGMpe3ZhciBkO2lmKCJvYmplY3QiPT10eXBlb2YgYiYmYi51cmxUZW1wbGF0ZSYmYi5vcHRpb25zKWQ9YjtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgYnx8IWEuZXNyaS5CYXNlbWFwTGF5ZXIuVElMRVNbYl0pdGhyb3cgbmV3IEVycm9yKCJMLmVzcmkuQmFzZW1hcExheWVyOiBJbnZhbGlkIHBhcmFtZXRlci4gVXNlIG9uZSBvZiAnU3RyZWV0cycsICdUb3BvZ3JhcGhpYycsICdPY2VhbnMnLCAnTmF0aW9uYWxHZW9ncmFwaGljJywgJ0dyYXknLCAnR3JheUxhYmVscycsICdJbWFnZXJ5JywgJ0ltYWdlcnlMYWJlbHMnLCAnSW1hZ2VyeVRyYW5zcG9ydGF0aW9uJywgJ0ltYWdlcnlBbHRlcm5hdGVMYWJlbHMnIG9yICdTaGFkZWRSZWxpZWYnIik7ZD1hLmVzcmkuQmFzZW1hcExheWVyLlRJTEVTW2JdfXZhciBlPWEuVXRpbC5leHRlbmQoZC5vcHRpb25zLGMpLGY9YS5lc3JpLlV0aWwuY2xlYW5VcmwoZC51cmxUZW1wbGF0ZSk7aWYoYS5UaWxlTGF5ZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGYsYS5VdGlsLnNldE9wdGlvbnModGhpcyxlKSksZC5hdHRyaWJ1dGlvblVybCl7dmFyIGc9YS5lc3JpLlV0aWwuY2xlYW5VcmwoZC5hdHRyaWJ1dGlvblVybCk7dGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uPSEwLHRoaXMuX2dldEF0dHJpYnV0aW9uRGF0YShnKX19LF9keW5hbWljQXR0cmlidXRpb246ITEsYm91bmRzOm51bGwsem9vbTpudWxsLG9uQWRkOmZ1bmN0aW9uKGIpe2EuVGlsZUxheWVyLnByb3RvdHlwZS5vbkFkZC5jYWxsKHRoaXMsYiksdGhpcy5fZHluYW1pY0F0dHJpYnV0aW9uJiYodGhpcy5vbigibG9hZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcyksdGhpcy5fbWFwLm9uKCJ2aWV3cmVzZXQgem9vbWVuZCBkcmFnZW5kIix0aGlzLl9oYW5kbGVUaWxlVXBkYXRlcyx0aGlzKSksdGhpcy5fbWFwLm9uKCJyZXNpemUiLHRoaXMuX3Jlc2l6ZUF0dHJpYnV0aW9uLHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbihiKXt0aGlzLl9keW5hbWljQXR0cmlidXRpb24mJih0aGlzLm9mZigibG9hZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcyksdGhpcy5fbWFwLm9mZigidmlld3Jlc2V0IHpvb21lbmQgZHJhZ2VuZCIsdGhpcy5faGFuZGxlVGlsZVVwZGF0ZXMsdGhpcykpLHRoaXMuX21hcC5vZmYoInJlc2l6ZSIsdGhpcy5fcmVzaXplQXR0cmlidXRpb24sdGhpcyksYS5UaWxlTGF5ZXIucHJvdG90eXBlLm9uUmVtb3ZlLmNhbGwodGhpcyxiKX0sX2hhbmRsZVRpbGVVcGRhdGVzOmZ1bmN0aW9uKGEpe3ZhciBiLGM7ImxvYWQiPT09YS50eXBlJiYoYj10aGlzLl9tYXAuZ2V0Qm91bmRzKCksYz10aGlzLl9tYXAuZ2V0Wm9vbSgpKSwoInZpZXdyZXNldCI9PT1hLnR5cGV8fCJkcmFnZW5kIj09PWEudHlwZXx8Inpvb21lbmQiPT09YS50eXBlKSYmKGI9YS50YXJnZXQuZ2V0Qm91bmRzKCksYz1hLnRhcmdldC5nZXRab29tKCkpLHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzJiZiJiZjJiYoYi5lcXVhbHModGhpcy5ib3VuZHMpJiZjPT09dGhpcy56b29tfHwodGhpcy5ib3VuZHM9Yix0aGlzLnpvb209Yyx0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpKSl9LF9yZXNpemVBdHRyaWJ1dGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX21hcC5nZXRTaXplKCkueDt0aGlzLl9nZXRBdHRyaWJ1dGlvbkxvZ28oKS5zdHlsZS5kaXNwbGF5PTYwMD5hPyJub25lIjoiYmxvY2siLHRoaXMuX2dldEF0dHJpYnV0aW9uU3BhbigpLnN0eWxlLm1heFdpZHRoPS43NSphKyJweCJ9LF9nZXRBdHRyaWJ1dGlvbkRhdGE6ZnVuY3Rpb24oYil7dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXM9W10sYS5lc3JpLmdldChiLHt9LHRoaXMuX3Byb2Nlc3NBdHRyaWJ1dGlvbkRhdGEsdGhpcyl9LF9wcm9jZXNzQXR0cmlidXRpb25EYXRhOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYz0wO2M8Yi5jb250cmlidXRvcnMubGVuZ3RoO2MrKylmb3IodmFyIGQ9Yi5jb250cmlidXRvcnNbY10sZT0wO2U8ZC5jb3ZlcmFnZUFyZWFzLmxlbmd0aDtlKyspe3ZhciBmPWQuY292ZXJhZ2VBcmVhc1tlXSxnPW5ldyBhLkxhdExuZyhmLmJib3hbMF0sZi5iYm94WzFdKSxoPW5ldyBhLkxhdExuZyhmLmJib3hbMl0sZi5iYm94WzNdKTt0aGlzLmF0dHJpYnV0aW9uQm91bmRpbmdCb3hlcy5wdXNoKHthdHRyaWJ1dGlvbjpkLmF0dHJpYnV0aW9uLHNjb3JlOmYuc2NvcmUsYm91bmRzOm5ldyBhLkxhdExuZ0JvdW5kcyhnLGgpLG1pblpvb206Zi56b29tTWluLG1heFpvb206Zi56b29tTWF4fSl9dGhpcy5hdHRyaWJ1dGlvbkJvdW5kaW5nQm94ZXMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnNjb3JlPGIuc2NvcmU/LTE6YS5zY29yZT5iLnNjb3JlPzE6MH0pLHRoaXMuYm91bmRzJiZ0aGlzLl91cGRhdGVNYXBBdHRyaWJ1dGlvbigpfSxfZ2V0QXR0cmlidXRpb25TcGFuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lc3JpLWF0dHJpYnV0aW9ucyIpWzBdfSxfZ2V0QXR0cmlidXRpb25Mb2dvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC5fY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoIi5lc3JpLWF0dHJpYnV0aW9uLWxvZ28iKVswXX0sX3VwZGF0ZU1hcEF0dHJpYnV0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSIiLGI9MDtiPHRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzLmxlbmd0aDtiKyspe3ZhciBjPXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2JdO2lmKHRoaXMuYm91bmRzLmludGVyc2VjdHMoYy5ib3VuZHMpJiZ0aGlzLnpvb20+PWMubWluWm9vbSYmdGhpcy56b29tPD1jLm1heFpvb20pe3ZhciBkPXRoaXMuYXR0cmlidXRpb25Cb3VuZGluZ0JveGVzW2JdLmF0dHJpYnV0aW9uOy0xPT09YS5pbmRleE9mKGQpJiYoYS5sZW5ndGg+MCYmKGErPSIsICIpLGErPWQpfX10aGlzLl9nZXRBdHRyaWJ1dGlvblNwYW4oKS5pbm5lckhUTUw9YSx0aGlzLl9yZXNpemVBdHRyaWJ1dGlvbigpfX0pLGEuZXNyaS5iYXNlbWFwTGF5ZXI9ZnVuY3Rpb24oYixjKXtyZXR1cm4gbmV3IGEuZXNyaS5CYXNlbWFwTGF5ZXIoYixjKX19KEwpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-label/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/leaflet-label/leaflet.label.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmxlYWZsZXQtbGFiZWwgewoJYmFja2dyb3VuZDogcmdiKDIzNSwgMjM1LCAyMzUpOwoJYmFja2dyb3VuZDogcmdiYSgyMzUsIDIzNSwgMjM1LCAwLjgxKTsKCWJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7Cglib3JkZXItY29sb3I6ICM3Nzc7Cglib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsMC4yNSk7Cglib3JkZXItcmFkaXVzOiA0cHg7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiA0cHg7Cgljb2xvcjogIzExMTsKCWRpc3BsYXk6IGJsb2NrOwoJZm9udDogMTJweC8yMHB4ICJIZWx2ZXRpY2EgTmV1ZSIsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cglmb250LXdlaWdodDogYm9sZDsKCXBhZGRpbmc6IDFweCA2cHg7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgktd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwoJICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKCSAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CgkgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCXotaW5kZXg6IDY7Cn0KCi5sZWFmbGV0LWxhYmVsLmxlYWZsZXQtY2xpY2thYmxlIHsKCWN1cnNvcjogcG9pbnRlcjsKfQoKLmxlYWZsZXQtbGFiZWw6YmVmb3JlLAoubGVhZmxldC1sYWJlbDphZnRlciB7Cglib3JkZXItdG9wOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7Cglib3JkZXItYm90dG9tOiA2cHggc29saWQgdHJhbnNwYXJlbnQ7Cgljb250ZW50OiBub25lOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiA1cHg7Cn0KCi5sZWFmbGV0LWxhYmVsOmJlZm9yZSB7Cglib3JkZXItcmlnaHQ6IDZweCBzb2xpZCBibGFjazsKCWJvcmRlci1yaWdodC1jb2xvcjogaW5oZXJpdDsKCWxlZnQ6IC0xMHB4Owp9CgoubGVhZmxldC1sYWJlbDphZnRlciB7Cglib3JkZXItbGVmdDogNnB4IHNvbGlkIGJsYWNrOwoJYm9yZGVyLWxlZnQtY29sb3I6IGluaGVyaXQ7CglyaWdodDogLTEwcHg7Cn0KCi5sZWFmbGV0LWxhYmVsLXJpZ2h0OmJlZm9yZSwKLmxlYWZsZXQtbGFiZWwtbGVmdDphZnRlciB7Cgljb250ZW50OiAiIjsKfQ==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-label/leaflet.label.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCUxlYWZsZXQubGFiZWwsIGEgcGx1Z2luIHRoYXQgYWRkcyBsYWJlbHMgdG8gbWFya2VycyBhbmQgdmVjdG9ycyBmb3IgTGVhZmxldCBwb3dlcmVkIG1hcHMuCgkoYykgMjAxMi0yMDEzLCBKYWNvYiBUb3llLCBTbWFydHJhawoKCWh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubGFiZWwKCWh0dHA6Ly9sZWFmbGV0anMuY29tCglodHRwczovL2dpdGh1Yi5jb20vamFjb2J0b3llCiovCiFmdW5jdGlvbigpe0wubGFiZWxWZXJzaW9uPSIwLjIuMS1kZXYiLEwuTGFiZWw9TC5DbGFzcy5leHRlbmQoe2luY2x1ZGVzOkwuTWl4aW4uRXZlbnRzLG9wdGlvbnM6e2NsYXNzTmFtZToiIixjbGlja2FibGU6ITEsZGlyZWN0aW9uOiJyaWdodCIsbm9IaWRlOiExLG9mZnNldDpbMTIsLTE1XSxvcGFjaXR5OjEsem9vbUFuaW1hdGlvbjohMH0saW5pdGlhbGl6ZTpmdW5jdGlvbih0LGUpe0wuc2V0T3B0aW9ucyh0aGlzLHQpLHRoaXMuX3NvdXJjZT1lLHRoaXMuX2FuaW1hdGVkPUwuQnJvd3Nlci5hbnkzZCYmdGhpcy5vcHRpb25zLnpvb21BbmltYXRpb24sdGhpcy5faXNPcGVuPSExfSxvbkFkZDpmdW5jdGlvbih0KXt0aGlzLl9tYXA9dCx0aGlzLl9wYW5lPXRoaXMuX3NvdXJjZSBpbnN0YW5jZW9mIEwuTWFya2VyP3QuX3BhbmVzLm1hcmtlclBhbmU6dC5fcGFuZXMucG9wdXBQYW5lLHRoaXMuX2NvbnRhaW5lcnx8dGhpcy5faW5pdExheW91dCgpLHRoaXMuX3BhbmUuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyKSx0aGlzLl9pbml0SW50ZXJhY3Rpb24oKSx0aGlzLl91cGRhdGUoKSx0aGlzLnNldE9wYWNpdHkodGhpcy5vcHRpb25zLm9wYWNpdHkpLHQub24oIm1vdmVlbmQiLHRoaXMuX29uTW92ZUVuZCx0aGlzKS5vbigidmlld3Jlc2V0Iix0aGlzLl9vblZpZXdSZXNldCx0aGlzKSx0aGlzLl9hbmltYXRlZCYmdC5vbigiem9vbWFuaW0iLHRoaXMuX3pvb21BbmltYXRpb24sdGhpcyksTC5Ccm93c2VyLnRvdWNoJiYhdGhpcy5vcHRpb25zLm5vSGlkZSYmTC5Eb21FdmVudC5vbih0aGlzLl9jb250YWluZXIsImNsaWNrIix0aGlzLmNsb3NlLHRoaXMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLl9wYW5lLnJlbW92ZUNoaWxkKHRoaXMuX2NvbnRhaW5lciksdC5vZmYoe3pvb21hbmltOnRoaXMuX3pvb21BbmltYXRpb24sbW92ZWVuZDp0aGlzLl9vbk1vdmVFbmQsdmlld3Jlc2V0OnRoaXMuX29uVmlld1Jlc2V0fSx0aGlzKSx0aGlzLl9yZW1vdmVJbnRlcmFjdGlvbigpLHRoaXMuX21hcD1udWxsfSxzZXRMYXRMbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhdGxuZz1MLmxhdExuZyh0KSx0aGlzLl9tYXAmJnRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpc30sc2V0Q29udGVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcHJldmlvdXNDb250ZW50PXRoaXMuX2NvbnRlbnQsdGhpcy5fY29udGVudD10LHRoaXMuX3VwZGF0ZUNvbnRlbnQoKSx0aGlzfSxjbG9zZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcDt0JiYoTC5Ccm93c2VyLnRvdWNoJiYhdGhpcy5vcHRpb25zLm5vSGlkZSYmTC5Eb21FdmVudC5vZmYodGhpcy5fY29udGFpbmVyLCJjbGljayIsdGhpcy5jbG9zZSksdC5yZW1vdmVMYXllcih0aGlzKSl9LHVwZGF0ZVpJbmRleDpmdW5jdGlvbih0KXt0aGlzLl96SW5kZXg9dCx0aGlzLl9jb250YWluZXImJnRoaXMuX3pJbmRleCYmKHRoaXMuX2NvbnRhaW5lci5zdHlsZS56SW5kZXg9dCl9LHNldE9wYWNpdHk6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLm9wYWNpdHk9dCx0aGlzLl9jb250YWluZXImJkwuRG9tVXRpbC5zZXRPcGFjaXR5KHRoaXMuX2NvbnRhaW5lcix0KX0sX2luaXRMYXlvdXQ6ZnVuY3Rpb24oKXt0aGlzLl9jb250YWluZXI9TC5Eb21VdGlsLmNyZWF0ZSgiZGl2IiwibGVhZmxldC1sYWJlbCAiK3RoaXMub3B0aW9ucy5jbGFzc05hbWUrIiBsZWFmbGV0LXpvb20tYW5pbWF0ZWQiKSx0aGlzLnVwZGF0ZVpJbmRleCh0aGlzLl96SW5kZXgpfSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fdXBkYXRlQ29udGVudCgpLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpcy5fY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHk9IiIpfSxfdXBkYXRlQ29udGVudDpmdW5jdGlvbigpe3RoaXMuX2NvbnRlbnQmJnRoaXMuX21hcCYmdGhpcy5fcHJldkNvbnRlbnQhPT10aGlzLl9jb250ZW50JiYic3RyaW5nIj09dHlwZW9mIHRoaXMuX2NvbnRlbnQmJih0aGlzLl9jb250YWluZXIuaW5uZXJIVE1MPXRoaXMuX2NvbnRlbnQsdGhpcy5fcHJldkNvbnRlbnQ9dGhpcy5fY29udGVudCx0aGlzLl9sYWJlbFdpZHRoPXRoaXMuX2NvbnRhaW5lci5vZmZzZXRXaWR0aCl9LF91cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKTt0aGlzLl9zZXRQb3NpdGlvbih0KX0sX3NldFBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcCxpPXRoaXMuX2NvbnRhaW5lcixuPWUubGF0TG5nVG9Db250YWluZXJQb2ludChlLmdldENlbnRlcigpKSxvPWUubGF5ZXJQb2ludFRvQ29udGFpbmVyUG9pbnQodCkscz10aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGE9dGhpcy5fbGFiZWxXaWR0aCxsPUwucG9pbnQodGhpcy5vcHRpb25zLm9mZnNldCk7InJpZ2h0Ij09PXN8fCJhdXRvIj09PXMmJm8ueDxuLng/KEwuRG9tVXRpbC5hZGRDbGFzcyhpLCJsZWFmbGV0LWxhYmVsLXJpZ2h0IiksTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGksImxlYWZsZXQtbGFiZWwtbGVmdCIpLHQ9dC5hZGQobCkpOihMLkRvbVV0aWwuYWRkQ2xhc3MoaSwibGVhZmxldC1sYWJlbC1sZWZ0IiksTC5Eb21VdGlsLnJlbW92ZUNsYXNzKGksImxlYWZsZXQtbGFiZWwtcmlnaHQiKSx0PXQuYWRkKEwucG9pbnQoLWwueC1hLGwueSkpKSxMLkRvbVV0aWwuc2V0UG9zaXRpb24oaSx0KX0sX3pvb21BbmltYXRpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcikucm91bmQoKTt0aGlzLl9zZXRQb3NpdGlvbihlKX0sX29uTW92ZUVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGVkJiYiYXV0byIhPT10aGlzLm9wdGlvbnMuZGlyZWN0aW9ufHx0aGlzLl91cGRhdGVQb3NpdGlvbigpfSxfb25WaWV3UmVzZXQ6ZnVuY3Rpb24odCl7dCYmdC5oYXJkJiZ0aGlzLl91cGRhdGUoKX0sX2luaXRJbnRlcmFjdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5jbGlja2FibGUpe3ZhciB0PXRoaXMuX2NvbnRhaW5lcixlPVsiZGJsY2xpY2siLCJtb3VzZWRvd24iLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNvbnRleHRtZW51Il07TC5Eb21VdGlsLmFkZENsYXNzKHQsImxlYWZsZXQtY2xpY2thYmxlIiksTC5Eb21FdmVudC5vbih0LCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKUwuRG9tRXZlbnQub24odCxlW2ldLHRoaXMuX2ZpcmVNb3VzZUV2ZW50LHRoaXMpfX0sX3JlbW92ZUludGVyYWN0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5vcHRpb25zLmNsaWNrYWJsZSl7dmFyIHQ9dGhpcy5fY29udGFpbmVyLGU9WyJkYmxjbGljayIsIm1vdXNlZG93biIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0IiwiY29udGV4dG1lbnUiXTtMLkRvbVV0aWwucmVtb3ZlQ2xhc3ModCwibGVhZmxldC1jbGlja2FibGUiKSxMLkRvbUV2ZW50Lm9mZih0LCJjbGljayIsdGhpcy5fb25Nb3VzZUNsaWNrLHRoaXMpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKUwuRG9tRXZlbnQub2ZmKHQsZVtpXSx0aGlzLl9maXJlTW91c2VFdmVudCx0aGlzKX19LF9vbk1vdXNlQ2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5oYXNFdmVudExpc3RlbmVycyh0LnR5cGUpJiZMLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbih0KSx0aGlzLmZpcmUodC50eXBlLHtvcmlnaW5hbEV2ZW50OnR9KX0sX2ZpcmVNb3VzZUV2ZW50OmZ1bmN0aW9uKHQpe3RoaXMuZmlyZSh0LnR5cGUse29yaWdpbmFsRXZlbnQ6dH0pLCJjb250ZXh0bWVudSI9PT10LnR5cGUmJnRoaXMuaGFzRXZlbnRMaXN0ZW5lcnModC50eXBlKSYmTC5Eb21FdmVudC5wcmV2ZW50RGVmYXVsdCh0KSwibW91c2Vkb3duIiE9PXQudHlwZT9MLkRvbUV2ZW50LnN0b3BQcm9wYWdhdGlvbih0KTpMLkRvbUV2ZW50LnByZXZlbnREZWZhdWx0KHQpfX0pLEwuQmFzZU1hcmtlck1ldGhvZHM9e3Nob3dMYWJlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhYmVsJiZ0aGlzLl9tYXAmJih0aGlzLmxhYmVsLnNldExhdExuZyh0aGlzLl9sYXRsbmcpLHRoaXMuX21hcC5zaG93TGFiZWwodGhpcy5sYWJlbCkpLHRoaXN9LGhpZGVMYWJlbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxhYmVsJiZ0aGlzLmxhYmVsLmNsb3NlKCksdGhpc30sc2V0TGFiZWxOb0hpZGU6ZnVuY3Rpb24odCl7dGhpcy5fbGFiZWxOb0hpZGUhPT10JiYodGhpcy5fbGFiZWxOb0hpZGU9dCx0Pyh0aGlzLl9yZW1vdmVMYWJlbFJldmVhbEhhbmRsZXJzKCksdGhpcy5zaG93TGFiZWwoKSk6KHRoaXMuX2FkZExhYmVsUmV2ZWFsSGFuZGxlcnMoKSx0aGlzLmhpZGVMYWJlbCgpKSl9LGJpbmRMYWJlbDpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5pY29uP3RoaXMub3B0aW9ucy5pY29uLm9wdGlvbnMubGFiZWxBbmNob3I6dGhpcy5vcHRpb25zLmxhYmVsQW5jaG9yLG49TC5wb2ludChpKXx8TC5wb2ludCgwLDApO3JldHVybiBuPW4uYWRkKEwuTGFiZWwucHJvdG90eXBlLm9wdGlvbnMub2Zmc2V0KSxlJiZlLm9mZnNldCYmKG49bi5hZGQoZS5vZmZzZXQpKSxlPUwuVXRpbC5leHRlbmQoe29mZnNldDpufSxlKSx0aGlzLl9sYWJlbE5vSGlkZT1lLm5vSGlkZSx0aGlzLmxhYmVsfHwodGhpcy5fbGFiZWxOb0hpZGV8fHRoaXMuX2FkZExhYmVsUmV2ZWFsSGFuZGxlcnMoKSx0aGlzLm9uKCJyZW1vdmUiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLm9uKCJtb3ZlIix0aGlzLl9tb3ZlTGFiZWwsdGhpcykub24oImFkZCIsdGhpcy5fb25NYXJrZXJBZGQsdGhpcyksdGhpcy5faGFzTGFiZWxIYW5kbGVycz0hMCksdGhpcy5sYWJlbD1uZXcgTC5MYWJlbChlLHRoaXMpLnNldENvbnRlbnQodCksdGhpc30sdW5iaW5kTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbCYmKHRoaXMuaGlkZUxhYmVsKCksdGhpcy5sYWJlbD1udWxsLHRoaXMuX2hhc0xhYmVsSGFuZGxlcnMmJih0aGlzLl9sYWJlbE5vSGlkZXx8dGhpcy5fcmVtb3ZlTGFiZWxSZXZlYWxIYW5kbGVycygpLHRoaXMub2ZmKCJyZW1vdmUiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLm9mZigibW92ZSIsdGhpcy5fbW92ZUxhYmVsLHRoaXMpLm9mZigiYWRkIix0aGlzLl9vbk1hcmtlckFkZCx0aGlzKSksdGhpcy5faGFzTGFiZWxIYW5kbGVycz0hMSksdGhpc30sdXBkYXRlTGFiZWxDb250ZW50OmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwmJnRoaXMubGFiZWwuc2V0Q29udGVudCh0KX0sZ2V0TGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbH0sX29uTWFya2VyQWRkOmZ1bmN0aW9uKCl7dGhpcy5fbGFiZWxOb0hpZGUmJnRoaXMuc2hvd0xhYmVsKCl9LF9hZGRMYWJlbFJldmVhbEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5vbigibW91c2VvdmVyIix0aGlzLnNob3dMYWJlbCx0aGlzKS5vbigibW91c2VvdXQiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLEwuQnJvd3Nlci50b3VjaCYmdGhpcy5vbigiY2xpY2siLHRoaXMuc2hvd0xhYmVsLHRoaXMpfSxfcmVtb3ZlTGFiZWxSZXZlYWxIYW5kbGVyczpmdW5jdGlvbigpe3RoaXMub2ZmKCJtb3VzZW92ZXIiLHRoaXMuc2hvd0xhYmVsLHRoaXMpLm9mZigibW91c2VvdXQiLHRoaXMuaGlkZUxhYmVsLHRoaXMpLEwuQnJvd3Nlci50b3VjaCYmdGhpcy5vZmYoImNsaWNrIix0aGlzLnNob3dMYWJlbCx0aGlzKX0sX21vdmVMYWJlbDpmdW5jdGlvbih0KXt0aGlzLmxhYmVsLnNldExhdExuZyh0LmxhdGxuZyl9fSxMLkljb24uRGVmYXVsdC5tZXJnZU9wdGlvbnMoe2xhYmVsQW5jaG9yOm5ldyBMLlBvaW50KDksLTIwKX0pLEwuTWFya2VyLm1lcmdlT3B0aW9ucyh7aWNvbjpuZXcgTC5JY29uLkRlZmF1bHR9KSxMLk1hcmtlci5pbmNsdWRlKEwuQmFzZU1hcmtlck1ldGhvZHMpLEwuTWFya2VyLmluY2x1ZGUoe19vcmlnaW5hbFVwZGF0ZVpJbmRleDpMLk1hcmtlci5wcm90b3R5cGUuX3VwZGF0ZVpJbmRleCxfdXBkYXRlWkluZGV4OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3pJbmRleCt0O3RoaXMuX29yaWdpbmFsVXBkYXRlWkluZGV4KHQpLHRoaXMubGFiZWwmJnRoaXMubGFiZWwudXBkYXRlWkluZGV4KGUpfSxfb3JpZ2luYWxTZXRPcGFjaXR5OkwuTWFya2VyLnByb3RvdHlwZS5zZXRPcGFjaXR5LHNldE9wYWNpdHk6ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbnMubGFiZWxIYXNTZW1pVHJhbnNwYXJlbmN5PWUsdGhpcy5fb3JpZ2luYWxTZXRPcGFjaXR5KHQpfSxfb3JpZ2luYWxVcGRhdGVPcGFjaXR5OkwuTWFya2VyLnByb3RvdHlwZS5fdXBkYXRlT3BhY2l0eSxfdXBkYXRlT3BhY2l0eTpmdW5jdGlvbigpe3ZhciB0PTA9PT10aGlzLm9wdGlvbnMub3BhY2l0eT8wOjE7dGhpcy5fb3JpZ2luYWxVcGRhdGVPcGFjaXR5KCksdGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5zZXRPcGFjaXR5KHRoaXMub3B0aW9ucy5sYWJlbEhhc1NlbWlUcmFuc3BhcmVuY3k/dGhpcy5vcHRpb25zLm9wYWNpdHk6dCl9LF9vcmlnaW5hbFNldExhdExuZzpMLk1hcmtlci5wcm90b3R5cGUuc2V0TGF0TG5nLHNldExhdExuZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sYWJlbCYmIXRoaXMuX2xhYmVsTm9IaWRlJiZ0aGlzLmhpZGVMYWJlbCgpLHRoaXMuX29yaWdpbmFsU2V0TGF0TG5nKHQpfX0pLEwuQ2lyY2xlTWFya2VyLm1lcmdlT3B0aW9ucyh7bGFiZWxBbmNob3I6bmV3IEwuUG9pbnQoMCwwKX0pLEwuQ2lyY2xlTWFya2VyLmluY2x1ZGUoTC5CYXNlTWFya2VyTWV0aG9kcyksTC5QYXRoLmluY2x1ZGUoe2JpbmRMYWJlbDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmxhYmVsJiZ0aGlzLmxhYmVsLm9wdGlvbnM9PT1lfHwodGhpcy5sYWJlbD1uZXcgTC5MYWJlbChlLHRoaXMpKSx0aGlzLmxhYmVsLnNldENvbnRlbnQodCksdGhpcy5fc2hvd0xhYmVsQWRkZWR8fCh0aGlzLm9uKCJtb3VzZW92ZXIiLHRoaXMuX3Nob3dMYWJlbCx0aGlzKS5vbigibW91c2Vtb3ZlIix0aGlzLl9tb3ZlTGFiZWwsdGhpcykub24oIm1vdXNlb3V0IHJlbW92ZSIsdGhpcy5faGlkZUxhYmVsLHRoaXMpLEwuQnJvd3Nlci50b3VjaCYmdGhpcy5vbigiY2xpY2siLHRoaXMuX3Nob3dMYWJlbCx0aGlzKSx0aGlzLl9zaG93TGFiZWxBZGRlZD0hMCksdGhpc30sdW5iaW5kTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbCYmKHRoaXMuX2hpZGVMYWJlbCgpLHRoaXMubGFiZWw9bnVsbCx0aGlzLl9zaG93TGFiZWxBZGRlZD0hMSx0aGlzLm9mZigibW91c2VvdmVyIix0aGlzLl9zaG93TGFiZWwsdGhpcykub2ZmKCJtb3VzZW1vdmUiLHRoaXMuX21vdmVMYWJlbCx0aGlzKS5vZmYoIm1vdXNlb3V0IHJlbW92ZSIsdGhpcy5faGlkZUxhYmVsLHRoaXMpKSx0aGlzfSx1cGRhdGVMYWJlbENvbnRlbnQ6ZnVuY3Rpb24odCl7dGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5zZXRDb250ZW50KHQpfSxfc2hvd0xhYmVsOmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwuc2V0TGF0TG5nKHQubGF0bG5nKSx0aGlzLl9tYXAuc2hvd0xhYmVsKHRoaXMubGFiZWwpfSxfbW92ZUxhYmVsOmZ1bmN0aW9uKHQpe3RoaXMubGFiZWwuc2V0TGF0TG5nKHQubGF0bG5nKX0sX2hpZGVMYWJlbDpmdW5jdGlvbigpe3RoaXMubGFiZWwuY2xvc2UoKX19KSxMLk1hcC5pbmNsdWRlKHtzaG93TGFiZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYWRkTGF5ZXIodCl9fSksTC5GZWF0dXJlR3JvdXAuaW5jbHVkZSh7Y2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmJpbmRMYWJlbCgpLHRoaXMuZWFjaExheWVyKHRoaXMucmVtb3ZlTGF5ZXIsdGhpcyksdGhpc30sYmluZExhYmVsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaW52b2tlKCJiaW5kTGFiZWwiLHQsZSl9LHVuYmluZExhYmVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW52b2tlKCJ1bmJpbmRMYWJlbCIpfSx1cGRhdGVMYWJlbENvbnRlbnQ6ZnVuY3Rpb24odCl7dGhpcy5pbnZva2UoInVwZGF0ZUxhYmVsQ29udGVudCIsdCl9fSl9KHRoaXMsZG9jdW1lbnQpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/leaflet.markercluster-src.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIExlYWZsZXQubWFya2VyY2x1c3RlciwgUHJvdmlkZXMgQmVhdXRpZnVsIEFuaW1hdGVkIE1hcmtlciBDbHVzdGVyaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIExlYWZsZXQsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4KIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubWFya2VyY2x1c3RlcgogKGMpIDIwMTItMjAxMywgRGF2ZSBMZWF2ZXIsIHNtYXJ0cmFrCiovCihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7Ci8qCiAqIEwuTWFya2VyQ2x1c3Rlckdyb3VwIGV4dGVuZHMgTC5GZWF0dXJlR3JvdXAgYnkgY2x1c3RlcmluZyB0aGUgbWFya2VycyBjb250YWluZWQgd2l0aGluCiAqLwoKTC5NYXJrZXJDbHVzdGVyR3JvdXAgPSBMLkZlYXR1cmVHcm91cC5leHRlbmQoewoKCW9wdGlvbnM6IHsKCQltYXhDbHVzdGVyUmFkaXVzOiA4MCwgLy9BIGNsdXN0ZXIgd2lsbCBjb3ZlciBhdCBtb3N0IHRoaXMgbWFueSBwaXhlbHMgZnJvbSBpdHMgY2VudGVyCgkJaWNvbkNyZWF0ZUZ1bmN0aW9uOiBudWxsLAoKCQlzcGlkZXJmeU9uTWF4Wm9vbTogdHJ1ZSwKCQlzaG93Q292ZXJhZ2VPbkhvdmVyOiB0cnVlLAoJCXpvb21Ub0JvdW5kc09uQ2xpY2s6IHRydWUsCgkJc2luZ2xlTWFya2VyTW9kZTogZmFsc2UsCgoJCWRpc2FibGVDbHVzdGVyaW5nQXRab29tOiBudWxsLAoKCQkvLyBTZXR0aW5nIHRoaXMgdG8gZmFsc2UgcHJldmVudHMgdGhlIHJlbW92YWwgb2YgYW55IGNsdXN0ZXJzIG91dHNpZGUgb2YgdGhlIHZpZXdwb2ludCwgd2hpY2gKCQkvLyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgkJcmVtb3ZlT3V0c2lkZVZpc2libGVCb3VuZHM6IHRydWUsCgoJCS8vV2hldGhlciB0byBhbmltYXRlIGFkZGluZyBtYXJrZXJzIGFmdGVyIGFkZGluZyB0aGUgTWFya2VyQ2x1c3Rlckdyb3VwIHRvIHRoZSBtYXAKCQkvLyBJZiB5b3UgYXJlIGFkZGluZyBpbmRpdmlkdWFsIG1hcmtlcnMgc2V0IHRvIHRydWUsIGlmIGFkZGluZyBidWxrIG1hcmtlcnMgbGVhdmUgZmFsc2UgZm9yIG1hc3NpdmUgcGVyZm9ybWFuY2UgZ2FpbnMuCgkJYW5pbWF0ZUFkZGluZ01hcmtlcnM6IGZhbHNlLAoKCQkvL0luY3JlYXNlIHRvIGluY3JlYXNlIHRoZSBkaXN0YW5jZSBhd2F5IHRoYXQgc3BpZGVyZmllZCBtYXJrZXJzIGFwcGVhciBmcm9tIHRoZSBjZW50ZXIKCQlzcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcjogMSwKCgkJLy9PcHRpb25zIHRvIHBhc3MgdG8gdGhlIEwuUG9seWdvbiBjb25zdHJ1Y3RvcgoJCXBvbHlnb25PcHRpb25zOiB7fQoJfSwKCglpbml0aWFsaXplOiBmdW5jdGlvbiAob3B0aW9ucykgewoJCUwuVXRpbC5zZXRPcHRpb25zKHRoaXMsIG9wdGlvbnMpOwoJCWlmICghdGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbikgewoJCQl0aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uID0gdGhpcy5fZGVmYXVsdEljb25DcmVhdGVGdW5jdGlvbjsKCQl9CgoJCXRoaXMuX2ZlYXR1cmVHcm91cCA9IEwuZmVhdHVyZUdyb3VwKCk7CgkJdGhpcy5fZmVhdHVyZUdyb3VwLm9uKEwuRmVhdHVyZUdyb3VwLkVWRU5UUywgdGhpcy5fcHJvcGFnYXRlRXZlbnQsIHRoaXMpOwoKCQl0aGlzLl9ub25Qb2ludEdyb3VwID0gTC5mZWF0dXJlR3JvdXAoKTsKCQl0aGlzLl9ub25Qb2ludEdyb3VwLm9uKEwuRmVhdHVyZUdyb3VwLkVWRU5UUywgdGhpcy5fcHJvcGFnYXRlRXZlbnQsIHRoaXMpOwoKCQl0aGlzLl9pblpvb21BbmltYXRpb24gPSAwOwoJCXRoaXMuX25lZWRzQ2x1c3RlcmluZyA9IFtdOwoJCXRoaXMuX25lZWRzUmVtb3ZpbmcgPSBbXTsgLy9NYXJrZXJzIHJlbW92ZWQgd2hpbGUgd2UgYXJlbid0IG9uIHRoZSBtYXAgbmVlZCB0byBiZSBrZXB0IHRyYWNrIG9mCgkJLy9UaGUgYm91bmRzIG9mIHRoZSBjdXJyZW50bHkgc2hvd24gYXJlYSAoZnJvbSBfZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKSBVcGRhdGVkIG9uIHpvb20vbW92ZQoJCXRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyA9IG51bGw7CgoJCXRoaXMuX3F1ZXVlID0gW107Cgl9LAoKCWFkZExheWVyOiBmdW5jdGlvbiAobGF5ZXIpIHsKCgkJaWYgKGxheWVyIGluc3RhbmNlb2YgTC5MYXllckdyb3VwKSB7CgkJCXZhciBhcnJheSA9IFtdOwoJCQlmb3IgKHZhciBpIGluIGxheWVyLl9sYXllcnMpIHsKCQkJCWFycmF5LnB1c2gobGF5ZXIuX2xheWVyc1tpXSk7CgkJCX0KCQkJcmV0dXJuIHRoaXMuYWRkTGF5ZXJzKGFycmF5KTsKCQl9CgoJCS8vRG9uJ3QgY2x1c3RlciBub24gcG9pbnQgZGF0YQoJCWlmICghbGF5ZXIuZ2V0TGF0TG5nKSB7CgkJCXRoaXMuX25vblBvaW50R3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICghdGhpcy5fbWFwKSB7CgkJCXRoaXMuX25lZWRzQ2x1c3RlcmluZy5wdXNoKGxheWVyKTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAodGhpcy5oYXNMYXllcihsYXllcikpIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCgkJLy9JZiB3ZSBoYXZlIGFscmVhZHkgY2x1c3RlcmVkIHdlJ2xsIG5lZWQgdG8gYWRkIHRoaXMgb25lIHRvIGEgY2x1c3RlcgoKCQlpZiAodGhpcy5fdW5zcGlkZXJmeSkgewoJCQl0aGlzLl91bnNwaWRlcmZ5KCk7CgkJfQoKCQl0aGlzLl9hZGRMYXllcihsYXllciwgdGhpcy5fbWF4Wm9vbSk7CgoJCS8vV29yayBvdXQgd2hhdCBpcyB2aXNpYmxlCgkJdmFyIHZpc2libGVMYXllciA9IGxheWVyLAoJCQljdXJyZW50Wm9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7CgkJaWYgKGxheWVyLl9fcGFyZW50KSB7CgkJCXdoaWxlICh2aXNpYmxlTGF5ZXIuX19wYXJlbnQuX3pvb20gPj0gY3VycmVudFpvb20pIHsKCQkJCXZpc2libGVMYXllciA9IHZpc2libGVMYXllci5fX3BhcmVudDsKCQkJfQoJCX0KCgkJaWYgKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcy5jb250YWlucyh2aXNpYmxlTGF5ZXIuZ2V0TGF0TG5nKCkpKSB7CgkJCWlmICh0aGlzLm9wdGlvbnMuYW5pbWF0ZUFkZGluZ01hcmtlcnMpIHsKCQkJCXRoaXMuX2FuaW1hdGlvbkFkZExheWVyKGxheWVyLCB2aXNpYmxlTGF5ZXIpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZChsYXllciwgdmlzaWJsZUxheWVyKTsKCQkJfQoJCX0KCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVtb3ZlTGF5ZXI6IGZ1bmN0aW9uIChsYXllcikgewoKCQlpZiAobGF5ZXIgaW5zdGFuY2VvZiBMLkxheWVyR3JvdXApCgkJewoJCQl2YXIgYXJyYXkgPSBbXTsKCQkJZm9yICh2YXIgaSBpbiBsYXllci5fbGF5ZXJzKSB7CgkJCQlhcnJheS5wdXNoKGxheWVyLl9sYXllcnNbaV0pOwoJCQl9CgkJCXJldHVybiB0aGlzLnJlbW92ZUxheWVycyhhcnJheSk7CgkJfQoKCQkvL05vbiBwb2ludCBsYXllcnMKCQlpZiAoIWxheWVyLmdldExhdExuZykgewoJCQl0aGlzLl9ub25Qb2ludEdyb3VwLnJlbW92ZUxheWVyKGxheWVyKTsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlpZiAoIXRoaXMuX21hcCkgewoJCQlpZiAoIXRoaXMuX2FycmF5U3BsaWNlKHRoaXMuX25lZWRzQ2x1c3RlcmluZywgbGF5ZXIpICYmIHRoaXMuaGFzTGF5ZXIobGF5ZXIpKSB7CgkJCQl0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2gobGF5ZXIpOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCFsYXllci5fX3BhcmVudCkgewoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICh0aGlzLl91bnNwaWRlcmZ5KSB7CgkJCXRoaXMuX3Vuc3BpZGVyZnkoKTsKCQkJdGhpcy5fdW5zcGlkZXJmeUxheWVyKGxheWVyKTsKCQl9CgoJCS8vUmVtb3ZlIHRoZSBtYXJrZXIgZnJvbSBjbHVzdGVycwoJCXRoaXMuX3JlbW92ZUxheWVyKGxheWVyLCB0cnVlKTsKCgkJaWYgKHRoaXMuX2ZlYXR1cmVHcm91cC5oYXNMYXllcihsYXllcikpIHsKCQkJdGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGxheWVyKTsKCQkJaWYgKGxheWVyLnNldE9wYWNpdHkpIHsKCQkJCWxheWVyLnNldE9wYWNpdHkoMSk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvL1Rha2VzIGFuIGFycmF5IG9mIG1hcmtlcnMgYW5kIGFkZHMgdGhlbSBpbiBidWxrCglhZGRMYXllcnM6IGZ1bmN0aW9uIChsYXllcnNBcnJheSkgewoJCXZhciBpLCBsLCBtLAoJCQlvbk1hcCA9IHRoaXMuX21hcCwKCQkJZmcgPSB0aGlzLl9mZWF0dXJlR3JvdXAsCgkJCW5wZyA9IHRoaXMuX25vblBvaW50R3JvdXA7CgoJCWZvciAoaSA9IDAsIGwgPSBsYXllcnNBcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJbSA9IGxheWVyc0FycmF5W2ldOwoKCQkJLy9Ob3QgcG9pbnQgZGF0YSwgY2FuJ3QgYmUgY2x1c3RlcmVkCgkJCWlmICghbS5nZXRMYXRMbmcpIHsKCQkJCW5wZy5hZGRMYXllcihtKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAodGhpcy5oYXNMYXllcihtKSkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICghb25NYXApIHsKCQkJCXRoaXMuX25lZWRzQ2x1c3RlcmluZy5wdXNoKG0pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXRoaXMuX2FkZExheWVyKG0sIHRoaXMuX21heFpvb20pOwoKCQkJLy9JZiB3ZSBqdXN0IG1hZGUgYSBjbHVzdGVyIG9mIHNpemUgMiB0aGVuIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvdGhlciBtYXJrZXIgZnJvbSB0aGUgbWFwIChpZiBpdCBpcykgb3Igd2UgbmV2ZXIgd2lsbAoJCQlpZiAobS5fX3BhcmVudCkgewoJCQkJaWYgKG0uX19wYXJlbnQuZ2V0Q2hpbGRDb3VudCgpID09PSAyKSB7CgkJCQkJdmFyIG1hcmtlcnMgPSBtLl9fcGFyZW50LmdldEFsbENoaWxkTWFya2VycygpLAoJCQkJCQlvdGhlck1hcmtlciA9IG1hcmtlcnNbMF0gPT09IG0gPyBtYXJrZXJzWzFdIDogbWFya2Vyc1swXTsKCQkJCQlmZy5yZW1vdmVMYXllcihvdGhlck1hcmtlcik7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChvbk1hcCkgewoJCQkvL1VwZGF0ZSB0aGUgaWNvbnMgb2YgYWxsIHRob3NlIHZpc2libGUgY2x1c3RlcnMgdGhhdCB3ZXJlIGFmZmVjdGVkCgkJCWZnLmVhY2hMYXllcihmdW5jdGlvbiAoYykgewoJCQkJaWYgKGMgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIgJiYgYy5faWNvbk5lZWRzVXBkYXRlKSB7CgkJCQkJYy5fdXBkYXRlSWNvbigpOwoJCQkJfQoJCQl9KTsKCgkJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsIHRoaXMuX3pvb20sIHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy9UYWtlcyBhbiBhcnJheSBvZiBtYXJrZXJzIGFuZCByZW1vdmVzIHRoZW0gaW4gYnVsawoJcmVtb3ZlTGF5ZXJzOiBmdW5jdGlvbiAobGF5ZXJzQXJyYXkpIHsKCQl2YXIgaSwgbCwgbSwKCQkJZmcgPSB0aGlzLl9mZWF0dXJlR3JvdXAsCgkJCW5wZyA9IHRoaXMuX25vblBvaW50R3JvdXA7CgoJCWlmICghdGhpcy5fbWFwKSB7CgkJCWZvciAoaSA9IDAsIGwgPSBsYXllcnNBcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJCW0gPSBsYXllcnNBcnJheVtpXTsKCQkJCXRoaXMuX2FycmF5U3BsaWNlKHRoaXMuX25lZWRzQ2x1c3RlcmluZywgbSk7CgkJCQlucGcucmVtb3ZlTGF5ZXIobSk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQlmb3IgKGkgPSAwLCBsID0gbGF5ZXJzQXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCW0gPSBsYXllcnNBcnJheVtpXTsKCgkJCWlmICghbS5fX3BhcmVudCkgewoJCQkJbnBnLnJlbW92ZUxheWVyKG0pOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXRoaXMuX3JlbW92ZUxheWVyKG0sIHRydWUsIHRydWUpOwoKCQkJaWYgKGZnLmhhc0xheWVyKG0pKSB7CgkJCQlmZy5yZW1vdmVMYXllcihtKTsKCQkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCQltLnNldE9wYWNpdHkoMSk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vRml4IHVwIHRoZSBjbHVzdGVycyBhbmQgbWFya2VycyBvbiB0aGUgbWFwCgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCwgdGhpcy5fem9vbSwgdGhpcy5fY3VycmVudFNob3duQm91bmRzKTsKCgkJZmcuZWFjaExheWVyKGZ1bmN0aW9uIChjKSB7CgkJCWlmIChjIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKSB7CgkJCQljLl91cGRhdGVJY29uKCk7CgkJCX0KCQl9KTsKCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8vUmVtb3ZlcyBhbGwgbGF5ZXJzIGZyb20gdGhlIE1hcmtlckNsdXN0ZXJHcm91cAoJY2xlYXJMYXllcnM6IGZ1bmN0aW9uICgpIHsKCQkvL05lZWQgb3VyIG93biBzcGVjaWFsIGltcGxlbWVudGF0aW9uIGFzIHRoZSBMYXllckdyb3VwIG9uZSBkb2Vzbid0IHdvcmsgZm9yIHVzCgoJCS8vSWYgd2UgYXJlbid0IG9uIHRoZSBtYXAgKHlldCksIGJsb3cgYXdheSB0aGUgbWFya2VycyB3ZSBrbm93IG9mCgkJaWYgKCF0aGlzLl9tYXApIHsKCQkJdGhpcy5fbmVlZHNDbHVzdGVyaW5nID0gW107CgkJCWRlbGV0ZSB0aGlzLl9ncmlkQ2x1c3RlcnM7CgkJCWRlbGV0ZSB0aGlzLl9ncmlkVW5jbHVzdGVyZWQ7CgkJfQoKCQlpZiAodGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KSB7CgkJCXRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpOwoJCX0KCgkJLy9SZW1vdmUgYWxsIHRoZSB2aXNpYmxlIGxheWVycwoJCXRoaXMuX2ZlYXR1cmVHcm91cC5jbGVhckxheWVycygpOwoJCXRoaXMuX25vblBvaW50R3JvdXAuY2xlYXJMYXllcnMoKTsKCgkJdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24gKG1hcmtlcikgewoJCQlkZWxldGUgbWFya2VyLl9fcGFyZW50OwoJCX0pOwoKCQlpZiAodGhpcy5fbWFwKSB7CgkJCS8vUmVzZXQgX3RvcENsdXN0ZXJMZXZlbCBhbmQgdGhlIERpc3RhbmNlR3JpZHMKCQkJdGhpcy5fZ2VuZXJhdGVJbml0aWFsQ2x1c3RlcnMoKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgkvL092ZXJyaWRlIEZlYXR1cmVHcm91cC5nZXRCb3VuZHMgYXMgaXQgZG9lc24ndCB3b3JrCglnZXRCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQl2YXIgYm91bmRzID0gbmV3IEwuTGF0TG5nQm91bmRzKCk7CgkJaWYgKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCkgewoJCQlib3VuZHMuZXh0ZW5kKHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fYm91bmRzKTsKCQl9IGVsc2UgewoJCQlmb3IgKHZhciBpID0gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQlib3VuZHMuZXh0ZW5kKHRoaXMuX25lZWRzQ2x1c3RlcmluZ1tpXS5nZXRMYXRMbmcoKSk7CgkJCX0KCQl9CgoJCWJvdW5kcy5leHRlbmQodGhpcy5fbm9uUG9pbnRHcm91cC5nZXRCb3VuZHMoKSk7CgoJCXJldHVybiBib3VuZHM7Cgl9LAoKCS8vT3ZlcnJpZGVzIExheWVyR3JvdXAuZWFjaExheWVyCgllYWNoTGF5ZXI6IGZ1bmN0aW9uIChtZXRob2QsIGNvbnRleHQpIHsKCQl2YXIgbWFya2VycyA9IHRoaXMuX25lZWRzQ2x1c3RlcmluZy5zbGljZSgpLAoJCSAgICBpOwoKCQlpZiAodGhpcy5fdG9wQ2x1c3RlckxldmVsKSB7CgkJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5nZXRBbGxDaGlsZE1hcmtlcnMobWFya2Vycyk7CgkJfQoKCQlmb3IgKGkgPSBtYXJrZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCW1ldGhvZC5jYWxsKGNvbnRleHQsIG1hcmtlcnNbaV0pOwoJCX0KCgkJdGhpcy5fbm9uUG9pbnRHcm91cC5lYWNoTGF5ZXIobWV0aG9kLCBjb250ZXh0KTsKCX0sCgoJLy9PdmVycmlkZXMgTGF5ZXJHcm91cC5nZXRMYXllcnMKCWdldExheWVyczogZnVuY3Rpb24gKCkgewoJCXZhciBsYXllcnMgPSBbXTsKCQl0aGlzLmVhY2hMYXllcihmdW5jdGlvbiAobCkgewoJCQlsYXllcnMucHVzaChsKTsKCQl9KTsKCQlyZXR1cm4gbGF5ZXJzOwoJfSwKCgkvL092ZXJyaWRlcyBMYXllckdyb3VwLmdldExheWVyLCBXQVJOSU5HOiBSZWFsbHkgYmFkIHBlcmZvcm1hbmNlCglnZXRMYXllcjogZnVuY3Rpb24gKGlkKSB7CgkJdmFyIHJlc3VsdCA9IG51bGw7CgoJCXRoaXMuZWFjaExheWVyKGZ1bmN0aW9uIChsKSB7CgkJCWlmIChMLnN0YW1wKGwpID09PSBpZCkgewoJCQkJcmVzdWx0ID0gbDsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gcmVzdWx0OwoJfSwKCgkvL1JldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbGF5ZXIgaXMgaW4gdGhpcyBNYXJrZXJDbHVzdGVyR3JvdXAKCWhhc0xheWVyOiBmdW5jdGlvbiAobGF5ZXIpIHsKCQlpZiAoIWxheWVyKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXZhciBpLCBhbkFycmF5ID0gdGhpcy5fbmVlZHNDbHVzdGVyaW5nOwoKCQlmb3IgKGkgPSBhbkFycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCWlmIChhbkFycmF5W2ldID09PSBsYXllcikgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgoJCWFuQXJyYXkgPSB0aGlzLl9uZWVkc1JlbW92aW5nOwoJCWZvciAoaSA9IGFuQXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJaWYgKGFuQXJyYXlbaV0gPT09IGxheWVyKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgoJCXJldHVybiAhIShsYXllci5fX3BhcmVudCAmJiBsYXllci5fX3BhcmVudC5fZ3JvdXAgPT09IHRoaXMpIHx8IHRoaXMuX25vblBvaW50R3JvdXAuaGFzTGF5ZXIobGF5ZXIpOwoJfSwKCgkvL1pvb20gZG93biB0byBzaG93IHRoZSBnaXZlbiBsYXllciAoc3BpZGVyZnlpbmcgaWYgbmVjZXNzYXJ5KSB0aGVuIGNhbGxzIHRoZSBjYWxsYmFjawoJem9vbVRvU2hvd0xheWVyOiBmdW5jdGlvbiAobGF5ZXIsIGNhbGxiYWNrKSB7CgoJCXZhciBzaG93TWFya2VyID0gZnVuY3Rpb24gKCkgewoJCQlpZiAoKGxheWVyLl9pY29uIHx8IGxheWVyLl9fcGFyZW50Ll9pY29uKSAmJiAhdGhpcy5faW5ab29tQW5pbWF0aW9uKSB7CgkJCQl0aGlzLl9tYXAub2ZmKCdtb3ZlZW5kJywgc2hvd01hcmtlciwgdGhpcyk7CgkJCQl0aGlzLm9mZignYW5pbWF0aW9uZW5kJywgc2hvd01hcmtlciwgdGhpcyk7CgoJCQkJaWYgKGxheWVyLl9pY29uKSB7CgkJCQkJY2FsbGJhY2soKTsKCQkJCX0gZWxzZSBpZiAobGF5ZXIuX19wYXJlbnQuX2ljb24pIHsKCQkJCQl2YXIgYWZ0ZXJTcGlkZXJmeSA9IGZ1bmN0aW9uICgpIHsKCQkJCQkJdGhpcy5vZmYoJ3NwaWRlcmZpZWQnLCBhZnRlclNwaWRlcmZ5LCB0aGlzKTsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9OwoKCQkJCQl0aGlzLm9uKCdzcGlkZXJmaWVkJywgYWZ0ZXJTcGlkZXJmeSwgdGhpcyk7CgkJCQkJbGF5ZXIuX19wYXJlbnQuc3BpZGVyZnkoKTsKCQkJCX0KCQkJfQoJCX07CgoJCWlmIChsYXllci5faWNvbiAmJiB0aGlzLl9tYXAuZ2V0Qm91bmRzKCkuY29udGFpbnMobGF5ZXIuZ2V0TGF0TG5nKCkpKSB7CgkJCWNhbGxiYWNrKCk7CgkJfSBlbHNlIGlmIChsYXllci5fX3BhcmVudC5fem9vbSA8IHRoaXMuX21hcC5nZXRab29tKCkpIHsKCQkJLy9MYXllciBzaG91bGQgYmUgdmlzaWJsZSBub3cgYnV0IGlzbid0IG9uIHNjcmVlbiwganVzdCBwYW4gb3ZlciB0byBpdAoJCQl0aGlzLl9tYXAub24oJ21vdmVlbmQnLCBzaG93TWFya2VyLCB0aGlzKTsKCQkJdGhpcy5fbWFwLnBhblRvKGxheWVyLmdldExhdExuZygpKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9tYXAub24oJ21vdmVlbmQnLCBzaG93TWFya2VyLCB0aGlzKTsKCQkJdGhpcy5vbignYW5pbWF0aW9uZW5kJywgc2hvd01hcmtlciwgdGhpcyk7CgkJCXRoaXMuX21hcC5zZXRWaWV3KGxheWVyLmdldExhdExuZygpLCBsYXllci5fX3BhcmVudC5fem9vbSArIDEpOwoJCQlsYXllci5fX3BhcmVudC56b29tVG9Cb3VuZHMoKTsKCQl9Cgl9LAoKCS8vT3ZlcnJpZGVzIEZlYXR1cmVHcm91cC5vbkFkZAoJb25BZGQ6IGZ1bmN0aW9uIChtYXApIHsKCQl0aGlzLl9tYXAgPSBtYXA7CgkJdmFyIGksIGwsIGxheWVyOwoKCQlpZiAoIWlzRmluaXRlKHRoaXMuX21hcC5nZXRNYXhab29tKCkpKSB7CgkJCXRocm93ICJNYXAgaGFzIG5vIG1heFpvb20gc3BlY2lmaWVkIjsKCQl9CgoJCXRoaXMuX2ZlYXR1cmVHcm91cC5vbkFkZChtYXApOwoJCXRoaXMuX25vblBvaW50R3JvdXAub25BZGQobWFwKTsKCgkJaWYgKCF0aGlzLl9ncmlkQ2x1c3RlcnMpIHsKCQkJdGhpcy5fZ2VuZXJhdGVJbml0aWFsQ2x1c3RlcnMoKTsKCQl9CgoJCWZvciAoaSA9IDAsIGwgPSB0aGlzLl9uZWVkc1JlbW92aW5nLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQlsYXllciA9IHRoaXMuX25lZWRzUmVtb3ZpbmdbaV07CgkJCXRoaXMuX3JlbW92ZUxheWVyKGxheWVyLCB0cnVlKTsKCQl9CgkJdGhpcy5fbmVlZHNSZW1vdmluZyA9IFtdOwoKCQlmb3IgKGkgPSAwLCBsID0gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQlsYXllciA9IHRoaXMuX25lZWRzQ2x1c3RlcmluZ1tpXTsKCgkJCS8vSWYgdGhlIGxheWVyIGRvZXNuJ3QgaGF2ZSBhIGdldExhdExuZyB0aGVuIHdlIGNhbid0IGNsdXN0ZXIgaXQsIHNvIGFkZCBpdCB0byBvdXIgY2hpbGQgZmVhdHVyZUdyb3VwCgkJCWlmICghbGF5ZXIuZ2V0TGF0TG5nKSB7CgkJCQl0aGlzLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwoJCQkJY29udGludWU7CgkJCX0KCgoJCQlpZiAobGF5ZXIuX19wYXJlbnQpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCXRoaXMuX2FkZExheWVyKGxheWVyLCB0aGlzLl9tYXhab29tKTsKCQl9CgkJdGhpcy5fbmVlZHNDbHVzdGVyaW5nID0gW107CgoKCQl0aGlzLl9tYXAub24oJ3pvb21lbmQnLCB0aGlzLl96b29tRW5kLCB0aGlzKTsKCQl0aGlzLl9tYXAub24oJ21vdmVlbmQnLCB0aGlzLl9tb3ZlRW5kLCB0aGlzKTsKCgkJaWYgKHRoaXMuX3NwaWRlcmZpZXJPbkFkZCkgeyAvL1RPRE8gRklYTUU6IE5vdCBzdXJlIGhvdyB0byBoYXZlIHNwaWRlcmZpZXIgYWRkIHNvbWV0aGluZyBvbiBoZXJlIG5pY2VseQoJCQl0aGlzLl9zcGlkZXJmaWVyT25BZGQoKTsKCQl9CgoJCXRoaXMuX2JpbmRFdmVudHMoKTsKCgoJCS8vQWN0dWFsbHkgYWRkIG91ciBtYXJrZXJzIHRvIHRoZSBtYXA6CgoJCS8vUmVtZW1iZXIgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBhbmQgYm91bmRzCgkJdGhpcy5fem9vbSA9IHRoaXMuX21hcC5nZXRab29tKCk7CgkJdGhpcy5fY3VycmVudFNob3duQm91bmRzID0gdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7CgoJCS8vTWFrZSB0aGluZ3MgYXBwZWFyIG9uIHRoZSBtYXAKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCB0aGlzLl96b29tLCB0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpOwoJfSwKCgkvL092ZXJyaWRlcyBGZWF0dXJlR3JvdXAub25SZW1vdmUKCW9uUmVtb3ZlOiBmdW5jdGlvbiAobWFwKSB7CgkJbWFwLm9mZignem9vbWVuZCcsIHRoaXMuX3pvb21FbmQsIHRoaXMpOwoJCW1hcC5vZmYoJ21vdmVlbmQnLCB0aGlzLl9tb3ZlRW5kLCB0aGlzKTsKCgkJdGhpcy5fdW5iaW5kRXZlbnRzKCk7CgoJCS8vSW4gY2FzZSB3ZSBhcmUgaW4gYSBjbHVzdGVyIGFuaW1hdGlvbgoJCXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUgPSB0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lLnJlcGxhY2UoJyBsZWFmbGV0LWNsdXN0ZXItYW5pbScsICcnKTsKCgkJaWYgKHRoaXMuX3NwaWRlcmZpZXJPblJlbW92ZSkgeyAvL1RPRE8gRklYTUU6IE5vdCBzdXJlIGhvdyB0byBoYXZlIHNwaWRlcmZpZXIgYWRkIHNvbWV0aGluZyBvbiBoZXJlIG5pY2VseQoJCQl0aGlzLl9zcGlkZXJmaWVyT25SZW1vdmUoKTsKCQl9CgoKCgkJLy9DbGVhbiB1cCBhbGwgdGhlIGxheWVycyB3ZSBhZGRlZCB0byB0aGUgbWFwCgkJdGhpcy5faGlkZUNvdmVyYWdlKCk7CgkJdGhpcy5fZmVhdHVyZUdyb3VwLm9uUmVtb3ZlKG1hcCk7CgkJdGhpcy5fbm9uUG9pbnRHcm91cC5vblJlbW92ZShtYXApOwoKCQl0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKTsKCgkJdGhpcy5fbWFwID0gbnVsbDsKCX0sCgoJZ2V0VmlzaWJsZVBhcmVudDogZnVuY3Rpb24gKG1hcmtlcikgewoJCXZhciB2TWFya2VyID0gbWFya2VyOwoJCXdoaWxlICh2TWFya2VyICYmICF2TWFya2VyLl9pY29uKSB7CgkJCXZNYXJrZXIgPSB2TWFya2VyLl9fcGFyZW50OwoJCX0KCQlyZXR1cm4gdk1hcmtlciB8fCBudWxsOwoJfSwKCgkvL1JlbW92ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZyb20gdGhlIGdpdmVuIGFycmF5CglfYXJyYXlTcGxpY2U6IGZ1bmN0aW9uIChhbkFycmF5LCBvYmopIHsKCQlmb3IgKHZhciBpID0gYW5BcnJheS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQlpZiAoYW5BcnJheVtpXSA9PT0gb2JqKSB7CgkJCQlhbkFycmF5LnNwbGljZShpLCAxKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoJfSwKCgkvL0ludGVybmFsIGZ1bmN0aW9uIGZvciByZW1vdmluZyBhIG1hcmtlciBmcm9tIGV2ZXJ5dGhpbmcuCgkvL2RvbnRVcGRhdGVNYXA6IHNldCB0byB0cnVlIGlmIHlvdSB3aWxsIGhhbmRsZSB1cGRhdGluZyB0aGUgbWFwIG1hbnVhbGx5IChmb3IgYnVsayBmdW5jdGlvbnMpCglfcmVtb3ZlTGF5ZXI6IGZ1bmN0aW9uIChtYXJrZXIsIHJlbW92ZUZyb21EaXN0YW5jZUdyaWQsIGRvbnRVcGRhdGVNYXApIHsKCQl2YXIgZ3JpZENsdXN0ZXJzID0gdGhpcy5fZ3JpZENsdXN0ZXJzLAoJCQlncmlkVW5jbHVzdGVyZWQgPSB0aGlzLl9ncmlkVW5jbHVzdGVyZWQsCgkJCWZnID0gdGhpcy5fZmVhdHVyZUdyb3VwLAoJCQltYXAgPSB0aGlzLl9tYXA7CgoJCS8vUmVtb3ZlIHRoZSBtYXJrZXIgZnJvbSBkaXN0YW5jZSBjbHVzdGVycyBpdCBtaWdodCBiZSBpbgoJCWlmIChyZW1vdmVGcm9tRGlzdGFuY2VHcmlkKSB7CgkJCWZvciAodmFyIHogPSB0aGlzLl9tYXhab29tOyB6ID49IDA7IHotLSkgewoJCQkJaWYgKCFncmlkVW5jbHVzdGVyZWRbel0ucmVtb3ZlT2JqZWN0KG1hcmtlciwgbWFwLnByb2plY3QobWFya2VyLmdldExhdExuZygpLCB6KSkpIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgkJLy9Xb3JrIG91ciB3YXkgdXAgdGhlIGNsdXN0ZXJzIHJlbW92aW5nIHRoZW0gYXMgd2UgZ28gaWYgcmVxdWlyZWQKCQl2YXIgY2x1c3RlciA9IG1hcmtlci5fX3BhcmVudCwKCQkJbWFya2VycyA9IGNsdXN0ZXIuX21hcmtlcnMsCgkJCW90aGVyTWFya2VyOwoKCQkvL1JlbW92ZSB0aGUgbWFya2VyIGZyb20gdGhlIGltbWVkaWF0ZSBwYXJlbnRzIG1hcmtlciBsaXN0CgkJdGhpcy5fYXJyYXlTcGxpY2UobWFya2VycywgbWFya2VyKTsKCgkJd2hpbGUgKGNsdXN0ZXIpIHsKCQkJY2x1c3Rlci5fY2hpbGRDb3VudC0tOwoKCQkJaWYgKGNsdXN0ZXIuX3pvb20gPCAwKSB7CgkJCQkvL1RvcCBsZXZlbCwgZG8gbm90aGluZwoJCQkJYnJlYWs7CgkJCX0gZWxzZSBpZiAocmVtb3ZlRnJvbURpc3RhbmNlR3JpZCAmJiBjbHVzdGVyLl9jaGlsZENvdW50IDw9IDEpIHsgLy9DbHVzdGVyIG5vIGxvbmdlciByZXF1aXJlZAoJCQkJLy9XZSBuZWVkIHRvIHB1c2ggdGhlIG90aGVyIG1hcmtlciB1cCB0byB0aGUgcGFyZW50CgkJCQlvdGhlck1hcmtlciA9IGNsdXN0ZXIuX21hcmtlcnNbMF0gPT09IG1hcmtlciA/IGNsdXN0ZXIuX21hcmtlcnNbMV0gOiBjbHVzdGVyLl9tYXJrZXJzWzBdOwoKCQkJCS8vVXBkYXRlIGRpc3RhbmNlIGdyaWQKCQkJCWdyaWRDbHVzdGVyc1tjbHVzdGVyLl96b29tXS5yZW1vdmVPYmplY3QoY2x1c3RlciwgbWFwLnByb2plY3QoY2x1c3Rlci5fY0xhdExuZywgY2x1c3Rlci5fem9vbSkpOwoJCQkJZ3JpZFVuY2x1c3RlcmVkW2NsdXN0ZXIuX3pvb21dLmFkZE9iamVjdChvdGhlck1hcmtlciwgbWFwLnByb2plY3Qob3RoZXJNYXJrZXIuZ2V0TGF0TG5nKCksIGNsdXN0ZXIuX3pvb20pKTsKCgkJCQkvL01vdmUgb3RoZXJNYXJrZXIgdXAgdG8gcGFyZW50CgkJCQl0aGlzLl9hcnJheVNwbGljZShjbHVzdGVyLl9fcGFyZW50Ll9jaGlsZENsdXN0ZXJzLCBjbHVzdGVyKTsKCQkJCWNsdXN0ZXIuX19wYXJlbnQuX21hcmtlcnMucHVzaChvdGhlck1hcmtlcik7CgkJCQlvdGhlck1hcmtlci5fX3BhcmVudCA9IGNsdXN0ZXIuX19wYXJlbnQ7CgoJCQkJaWYgKGNsdXN0ZXIuX2ljb24pIHsKCQkJCQkvL0NsdXN0ZXIgaXMgY3VycmVudGx5IG9uIHRoZSBtYXAsIG5lZWQgdG8gcHV0IHRoZSBtYXJrZXIgb24gdGhlIG1hcCBpbnN0ZWFkCgkJCQkJZmcucmVtb3ZlTGF5ZXIoY2x1c3Rlcik7CgkJCQkJaWYgKCFkb250VXBkYXRlTWFwKSB7CgkJCQkJCWZnLmFkZExheWVyKG90aGVyTWFya2VyKTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQljbHVzdGVyLl9yZWNhbGN1bGF0ZUJvdW5kcygpOwoJCQkJaWYgKCFkb250VXBkYXRlTWFwIHx8ICFjbHVzdGVyLl9pY29uKSB7CgkJCQkJY2x1c3Rlci5fdXBkYXRlSWNvbigpOwoJCQkJfQoJCQl9CgoJCQljbHVzdGVyID0gY2x1c3Rlci5fX3BhcmVudDsKCQl9CgoJCWRlbGV0ZSBtYXJrZXIuX19wYXJlbnQ7Cgl9LAoKCV9pc09ySXNQYXJlbnQ6IGZ1bmN0aW9uIChlbCwgb2VsKSB7CgkJd2hpbGUgKG9lbCkgewoJCQlpZiAoZWwgPT09IG9lbCkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJb2VsID0gb2VsLnBhcmVudE5vZGU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0sCgoJX3Byb3BhZ2F0ZUV2ZW50OiBmdW5jdGlvbiAoZSkgewoJCWlmIChlLmxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKSB7CgkJCS8vUHJldmVudCBtdWx0aXBsZSBjbHVzdGVybW91c2VvdmVyL29mZiBldmVudHMgaWYgdGhlIGljb24gaXMgbWFkZSB1cCBvZiBzdGFja2VkIGRpdnMgKERvZXNuJ3Qgd29yayBpbiBpZSA8PSA4LCBubyByZWxhdGVkVGFyZ2V0KQoJCQlpZiAoZS5vcmlnaW5hbEV2ZW50ICYmIHRoaXMuX2lzT3JJc1BhcmVudChlLmxheWVyLl9pY29uLCBlLm9yaWdpbmFsRXZlbnQucmVsYXRlZFRhcmdldCkpIHsKCQkJCXJldHVybjsKCQkJfQoJCQllLnR5cGUgPSAnY2x1c3RlcicgKyBlLnR5cGU7CgkJfQoKCQl0aGlzLmZpcmUoZS50eXBlLCBlKTsKCX0sCgoJLy9EZWZhdWx0IGZ1bmN0aW9uYWxpdHkKCV9kZWZhdWx0SWNvbkNyZWF0ZUZ1bmN0aW9uOiBmdW5jdGlvbiAoY2x1c3RlcikgewoJCXZhciBjaGlsZENvdW50ID0gY2x1c3Rlci5nZXRDaGlsZENvdW50KCk7CgoJCXZhciBjID0gJyBtYXJrZXItY2x1c3Rlci0nOwoJCWlmIChjaGlsZENvdW50IDwgMTApIHsKCQkJYyArPSAnc21hbGwnOwoJCX0gZWxzZSBpZiAoY2hpbGRDb3VudCA8IDEwMCkgewoJCQljICs9ICdtZWRpdW0nOwoJCX0gZWxzZSB7CgkJCWMgKz0gJ2xhcmdlJzsKCQl9CgoJCXJldHVybiBuZXcgTC5EaXZJY29uKHsgaHRtbDogJzxkaXY+PHNwYW4+JyArIGNoaWxkQ291bnQgKyAnPC9zcGFuPjwvZGl2PicsIGNsYXNzTmFtZTogJ21hcmtlci1jbHVzdGVyJyArIGMsIGljb25TaXplOiBuZXcgTC5Qb2ludCg0MCwgNDApIH0pOwoJfSwKCglfYmluZEV2ZW50czogZnVuY3Rpb24gKCkgewoJCXZhciBtYXAgPSB0aGlzLl9tYXAsCgkJICAgIHNwaWRlcmZ5T25NYXhab29tID0gdGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tLAoJCSAgICBzaG93Q292ZXJhZ2VPbkhvdmVyID0gdGhpcy5vcHRpb25zLnNob3dDb3ZlcmFnZU9uSG92ZXIsCgkJICAgIHpvb21Ub0JvdW5kc09uQ2xpY2sgPSB0aGlzLm9wdGlvbnMuem9vbVRvQm91bmRzT25DbGljazsKCgkJLy9ab29tIG9uIGNsdXN0ZXIgY2xpY2sgb3Igc3BpZGVyZnkgaWYgd2UgYXJlIGF0IHRoZSBsb3dlc3QgbGV2ZWwKCQlpZiAoc3BpZGVyZnlPbk1heFpvb20gfHwgem9vbVRvQm91bmRzT25DbGljaykgewoJCQl0aGlzLm9uKCdjbHVzdGVyY2xpY2snLCB0aGlzLl96b29tT3JTcGlkZXJmeSwgdGhpcyk7CgkJfQoKCQkvL1Nob3cgY29udmV4IGh1bGwgKGJvdW5kYXJ5KSBwb2x5Z29uIG9uIG1vdXNlIG92ZXIKCQlpZiAoc2hvd0NvdmVyYWdlT25Ib3ZlcikgewoJCQl0aGlzLm9uKCdjbHVzdGVybW91c2VvdmVyJywgdGhpcy5fc2hvd0NvdmVyYWdlLCB0aGlzKTsKCQkJdGhpcy5vbignY2x1c3Rlcm1vdXNlb3V0JywgdGhpcy5faGlkZUNvdmVyYWdlLCB0aGlzKTsKCQkJbWFwLm9uKCd6b29tZW5kJywgdGhpcy5faGlkZUNvdmVyYWdlLCB0aGlzKTsKCQl9Cgl9LAoKCV96b29tT3JTcGlkZXJmeTogZnVuY3Rpb24gKGUpIHsKCQl2YXIgbWFwID0gdGhpcy5fbWFwOwoJCWlmIChtYXAuZ2V0TWF4Wm9vbSgpID09PSBtYXAuZ2V0Wm9vbSgpKSB7CgkJCWlmICh0aGlzLm9wdGlvbnMuc3BpZGVyZnlPbk1heFpvb20pIHsKCQkJCWUubGF5ZXIuc3BpZGVyZnkoKTsKCQkJfQoJCX0gZWxzZSBpZiAodGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2spIHsKCQkJZS5sYXllci56b29tVG9Cb3VuZHMoKTsKCQl9CgogICAgLy8gRm9jdXMgdGhlIG1hcCBhZ2FpbiBmb3Iga2V5Ym9hcmQgdXNlcnMuCgkJaWYgKGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQua2V5Q29kZSA9PT0gMTMpIHsKCQkJbWFwLl9jb250YWluZXIuZm9jdXMoKTsKCQl9Cgl9LAoKCV9zaG93Q292ZXJhZ2U6IGZ1bmN0aW9uIChlKSB7CgkJdmFyIG1hcCA9IHRoaXMuX21hcDsKCQlpZiAodGhpcy5faW5ab29tQW5pbWF0aW9uKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKHRoaXMuX3Nob3duUG9seWdvbikgewoJCQltYXAucmVtb3ZlTGF5ZXIodGhpcy5fc2hvd25Qb2x5Z29uKTsKCQl9CgkJaWYgKGUubGF5ZXIuZ2V0Q2hpbGRDb3VudCgpID4gMiAmJiBlLmxheWVyICE9PSB0aGlzLl9zcGlkZXJmaWVkKSB7CgkJCXRoaXMuX3Nob3duUG9seWdvbiA9IG5ldyBMLlBvbHlnb24oZS5sYXllci5nZXRDb252ZXhIdWxsKCksIHRoaXMub3B0aW9ucy5wb2x5Z29uT3B0aW9ucyk7CgkJCW1hcC5hZGRMYXllcih0aGlzLl9zaG93blBvbHlnb24pOwoJCX0KCX0sCgoJX2hpZGVDb3ZlcmFnZTogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9zaG93blBvbHlnb24pIHsKCQkJdGhpcy5fbWFwLnJlbW92ZUxheWVyKHRoaXMuX3Nob3duUG9seWdvbik7CgkJCXRoaXMuX3Nob3duUG9seWdvbiA9IG51bGw7CgkJfQoJfSwKCglfdW5iaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7CgkJdmFyIHNwaWRlcmZ5T25NYXhab29tID0gdGhpcy5vcHRpb25zLnNwaWRlcmZ5T25NYXhab29tLAoJCQlzaG93Q292ZXJhZ2VPbkhvdmVyID0gdGhpcy5vcHRpb25zLnNob3dDb3ZlcmFnZU9uSG92ZXIsCgkJCXpvb21Ub0JvdW5kc09uQ2xpY2sgPSB0aGlzLm9wdGlvbnMuem9vbVRvQm91bmRzT25DbGljaywKCQkJbWFwID0gdGhpcy5fbWFwOwoKCQlpZiAoc3BpZGVyZnlPbk1heFpvb20gfHwgem9vbVRvQm91bmRzT25DbGljaykgewoJCQl0aGlzLm9mZignY2x1c3RlcmNsaWNrJywgdGhpcy5fem9vbU9yU3BpZGVyZnksIHRoaXMpOwoJCX0KCQlpZiAoc2hvd0NvdmVyYWdlT25Ib3ZlcikgewoJCQl0aGlzLm9mZignY2x1c3Rlcm1vdXNlb3ZlcicsIHRoaXMuX3Nob3dDb3ZlcmFnZSwgdGhpcyk7CgkJCXRoaXMub2ZmKCdjbHVzdGVybW91c2VvdXQnLCB0aGlzLl9oaWRlQ292ZXJhZ2UsIHRoaXMpOwoJCQltYXAub2ZmKCd6b29tZW5kJywgdGhpcy5faGlkZUNvdmVyYWdlLCB0aGlzKTsKCQl9Cgl9LAoKCV96b29tRW5kOiBmdW5jdGlvbiAoKSB7CgkJaWYgKCF0aGlzLl9tYXApIHsgLy9NYXkgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGJ5IGEgem9vbUVuZCBoYW5kbGVyCgkJCXJldHVybjsKCQl9CgkJdGhpcy5fbWVyZ2VTcGxpdENsdXN0ZXJzKCk7CgoJCXRoaXMuX3pvb20gPSB0aGlzLl9tYXAuX3pvb207CgkJdGhpcy5fY3VycmVudFNob3duQm91bmRzID0gdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7Cgl9LAoKCV9tb3ZlRW5kOiBmdW5jdGlvbiAoKSB7CgkJaWYgKHRoaXMuX2luWm9vbUFuaW1hdGlvbikgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgbmV3Qm91bmRzID0gdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCk7CgoJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLCB0aGlzLl96b29tLCBuZXdCb3VuZHMpOwoJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsIHRoaXMuX21hcC5fem9vbSwgbmV3Qm91bmRzKTsKCgkJdGhpcy5fY3VycmVudFNob3duQm91bmRzID0gbmV3Qm91bmRzOwoJCXJldHVybjsKCX0sCgoJX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzOiBmdW5jdGlvbiAoKSB7CgkJdmFyIG1heFpvb20gPSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpLAoJCQlyYWRpdXMgPSB0aGlzLm9wdGlvbnMubWF4Q2x1c3RlclJhZGl1czsKCgkJaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbSkgewoJCQltYXhab29tID0gdGhpcy5vcHRpb25zLmRpc2FibGVDbHVzdGVyaW5nQXRab29tIC0gMTsKCQl9CgkJdGhpcy5fbWF4Wm9vbSA9IG1heFpvb207CgkJdGhpcy5fZ3JpZENsdXN0ZXJzID0ge307CgkJdGhpcy5fZ3JpZFVuY2x1c3RlcmVkID0ge307CgoJCS8vU2V0IHVwIERpc3RhbmNlR3JpZHMgZm9yIGVhY2ggem9vbQoJCWZvciAodmFyIHpvb20gPSBtYXhab29tOyB6b29tID49IDA7IHpvb20tLSkgewoJCQl0aGlzLl9ncmlkQ2x1c3RlcnNbem9vbV0gPSBuZXcgTC5EaXN0YW5jZUdyaWQocmFkaXVzKTsKCQkJdGhpcy5fZ3JpZFVuY2x1c3RlcmVkW3pvb21dID0gbmV3IEwuRGlzdGFuY2VHcmlkKHJhZGl1cyk7CgkJfQoKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwgPSBuZXcgTC5NYXJrZXJDbHVzdGVyKHRoaXMsIC0xKTsKCX0sCgoJLy9ab29tOiBab29tIHRvIHN0YXJ0IGFkZGluZyBhdCAoUGFzcyB0aGlzLl9tYXhab29tIHRvIHN0YXJ0IGF0IHRoZSBib3R0b20pCglfYWRkTGF5ZXI6IGZ1bmN0aW9uIChsYXllciwgem9vbSkgewoJCXZhciBncmlkQ2x1c3RlcnMgPSB0aGlzLl9ncmlkQ2x1c3RlcnMsCgkJICAgIGdyaWRVbmNsdXN0ZXJlZCA9IHRoaXMuX2dyaWRVbmNsdXN0ZXJlZCwKCQkgICAgbWFya2VyUG9pbnQsIHo7CgoJCWlmICh0aGlzLm9wdGlvbnMuc2luZ2xlTWFya2VyTW9kZSkgewoJCQlsYXllci5vcHRpb25zLmljb24gPSB0aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHsKCQkJCWdldENoaWxkQ291bnQ6IGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gMTsKCQkJCX0sCgkJCQlnZXRBbGxDaGlsZE1hcmtlcnM6IGZ1bmN0aW9uICgpIHsKCQkJCQlyZXR1cm4gW2xheWVyXTsKCQkJCX0KCQkJfSk7CgkJfQoKCQkvL0ZpbmQgdGhlIGxvd2VzdCB6b29tIGxldmVsIHRvIHNsb3QgdGhpcyBvbmUgaW4KCQlmb3IgKDsgem9vbSA+PSAwOyB6b29tLS0pIHsKCQkJbWFya2VyUG9pbnQgPSB0aGlzLl9tYXAucHJvamVjdChsYXllci5nZXRMYXRMbmcoKSwgem9vbSk7IC8vIGNhbGN1bGF0ZSBwaXhlbCBwb3NpdGlvbgoKCQkJLy9UcnkgZmluZCBhIGNsdXN0ZXIgY2xvc2UgYnkKCQkJdmFyIGNsb3Nlc3QgPSBncmlkQ2x1c3RlcnNbem9vbV0uZ2V0TmVhck9iamVjdChtYXJrZXJQb2ludCk7CgkJCWlmIChjbG9zZXN0KSB7CgkJCQljbG9zZXN0Ll9hZGRDaGlsZChsYXllcik7CgkJCQlsYXllci5fX3BhcmVudCA9IGNsb3Nlc3Q7CgkJCQlyZXR1cm47CgkJCX0KCgkJCS8vVHJ5IGZpbmQgYSBtYXJrZXIgY2xvc2UgYnkgdG8gZm9ybSBhIG5ldyBjbHVzdGVyIHdpdGgKCQkJY2xvc2VzdCA9IGdyaWRVbmNsdXN0ZXJlZFt6b29tXS5nZXROZWFyT2JqZWN0KG1hcmtlclBvaW50KTsKCQkJaWYgKGNsb3Nlc3QpIHsKCQkJCXZhciBwYXJlbnQgPSBjbG9zZXN0Ll9fcGFyZW50OwoJCQkJaWYgKHBhcmVudCkgewoJCQkJCXRoaXMuX3JlbW92ZUxheWVyKGNsb3Nlc3QsIGZhbHNlKTsKCQkJCX0KCgkJCQkvL0NyZWF0ZSBuZXcgY2x1c3RlciB3aXRoIHRoZXNlIDIgaW4gaXQKCgkJCQl2YXIgbmV3Q2x1c3RlciA9IG5ldyBMLk1hcmtlckNsdXN0ZXIodGhpcywgem9vbSwgY2xvc2VzdCwgbGF5ZXIpOwoJCQkJZ3JpZENsdXN0ZXJzW3pvb21dLmFkZE9iamVjdChuZXdDbHVzdGVyLCB0aGlzLl9tYXAucHJvamVjdChuZXdDbHVzdGVyLl9jTGF0TG5nLCB6b29tKSk7CgkJCQljbG9zZXN0Ll9fcGFyZW50ID0gbmV3Q2x1c3RlcjsKCQkJCWxheWVyLl9fcGFyZW50ID0gbmV3Q2x1c3RlcjsKCgkJCQkvL0ZpcnN0IGNyZWF0ZSBhbnkgbmV3IGludGVybWVkaWF0ZSBwYXJlbnQgY2x1c3RlcnMgdGhhdCBkb24ndCBleGlzdAoJCQkJdmFyIGxhc3RQYXJlbnQgPSBuZXdDbHVzdGVyOwoJCQkJZm9yICh6ID0gem9vbSAtIDE7IHogPiBwYXJlbnQuX3pvb207IHotLSkgewoJCQkJCWxhc3RQYXJlbnQgPSBuZXcgTC5NYXJrZXJDbHVzdGVyKHRoaXMsIHosIGxhc3RQYXJlbnQpOwoJCQkJCWdyaWRDbHVzdGVyc1t6XS5hZGRPYmplY3QobGFzdFBhcmVudCwgdGhpcy5fbWFwLnByb2plY3QoY2xvc2VzdC5nZXRMYXRMbmcoKSwgeikpOwoJCQkJfQoJCQkJcGFyZW50Ll9hZGRDaGlsZChsYXN0UGFyZW50KTsKCgkJCQkvL1JlbW92ZSBjbG9zZXN0IGZyb20gdGhpcyB6b29tIGxldmVsIGFuZCBhbnkgYWJvdmUgdGhhdCBpdCBpcyBpbiwgcmVwbGFjZSB3aXRoIG5ld0NsdXN0ZXIKCQkJCWZvciAoeiA9IHpvb207IHogPj0gMDsgei0tKSB7CgkJCQkJaWYgKCFncmlkVW5jbHVzdGVyZWRbel0ucmVtb3ZlT2JqZWN0KGNsb3Nlc3QsIHRoaXMuX21hcC5wcm9qZWN0KGNsb3Nlc3QuZ2V0TGF0TG5nKCksIHopKSkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvL0RpZG4ndCBtYW5hZ2UgdG8gY2x1c3RlciBpbiBhdCB0aGlzIHpvb20sIHJlY29yZCB1cyBhcyBhIG1hcmtlciBoZXJlIGFuZCBjb250aW51ZSB1cHdhcmRzCgkJCWdyaWRVbmNsdXN0ZXJlZFt6b29tXS5hZGRPYmplY3QobGF5ZXIsIG1hcmtlclBvaW50KTsKCQl9CgoJCS8vRGlkbid0IGdldCBpbiBhbnl0aGluZywgYWRkIHVzIHRvIHRoZSB0b3AKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2FkZENoaWxkKGxheWVyKTsKCQlsYXllci5fX3BhcmVudCA9IHRoaXMuX3RvcENsdXN0ZXJMZXZlbDsKCQlyZXR1cm47Cgl9LAoKCS8vRW5xdWV1ZSBjb2RlIHRvIGZpcmUgYWZ0ZXIgdGhlIG1hcmtlciBleHBhbmQvY29udHJhY3QgaGFzIGhhcHBlbmVkCglfZW5xdWV1ZTogZnVuY3Rpb24gKGZuKSB7CgkJdGhpcy5fcXVldWUucHVzaChmbik7CgkJaWYgKCF0aGlzLl9xdWV1ZVRpbWVvdXQpIHsKCQkJdGhpcy5fcXVldWVUaW1lb3V0ID0gc2V0VGltZW91dChMLmJpbmQodGhpcy5fcHJvY2Vzc1F1ZXVlLCB0aGlzKSwgMzAwKTsKCQl9Cgl9LAoJX3Byb2Nlc3NRdWV1ZTogZnVuY3Rpb24gKCkgewoJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fcXVldWUubGVuZ3RoOyBpKyspIHsKCQkJdGhpcy5fcXVldWVbaV0uY2FsbCh0aGlzKTsKCQl9CgkJdGhpcy5fcXVldWUubGVuZ3RoID0gMDsKCQljbGVhclRpbWVvdXQodGhpcy5fcXVldWVUaW1lb3V0KTsKCQl0aGlzLl9xdWV1ZVRpbWVvdXQgPSBudWxsOwoJfSwKCgkvL01lcmdlIGFuZCBzcGxpdCBhbnkgZXhpc3RpbmcgY2x1c3RlcnMgdGhhdCBhcmUgdG9vIGJpZyBvciBzbWFsbAoJX21lcmdlU3BsaXRDbHVzdGVyczogZnVuY3Rpb24gKCkgewoKCQkvL0luY2FzZSB3ZSBhcmUgc3RhcnRpbmcgdG8gc3BsaXQgYmVmb3JlIHRoZSBhbmltYXRpb24gZmluaXNoZWQKCQl0aGlzLl9wcm9jZXNzUXVldWUoKTsKCgkJaWYgKHRoaXMuX3pvb20gPCB0aGlzLl9tYXAuX3pvb20gJiYgdGhpcy5fY3VycmVudFNob3duQm91bmRzLmNvbnRhaW5zKHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKSkgeyAvL1pvb20gaW4sIHNwbGl0CgkJCXRoaXMuX2FuaW1hdGlvblN0YXJ0KCk7CgkJCS8vUmVtb3ZlIGNsdXN0ZXJzIG5vdyBvZmYgc2NyZWVuCgkJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLCB0aGlzLl96b29tLCB0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSk7CgoJCQl0aGlzLl9hbmltYXRpb25ab29tSW4odGhpcy5fem9vbSwgdGhpcy5fbWFwLl96b29tKTsKCgkJfSBlbHNlIGlmICh0aGlzLl96b29tID4gdGhpcy5fbWFwLl96b29tKSB7IC8vWm9vbSBvdXQsIG1lcmdlCgkJCXRoaXMuX2FuaW1hdGlvblN0YXJ0KCk7CgoJCQl0aGlzLl9hbmltYXRpb25ab29tT3V0KHRoaXMuX3pvb20sIHRoaXMuX21hcC5fem9vbSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5fbW92ZUVuZCgpOwoJCX0KCX0sCgoJLy9HZXRzIHRoZSBtYXBzIHZpc2libGUgYm91bmRzIGV4cGFuZGVkIGluIGVhY2ggZGlyZWN0aW9uIGJ5IHRoZSBzaXplIG9mIHRoZSBzY3JlZW4gKHNvIHRoZSB1c2VyIGNhbm5vdCBzZWUgYW4gYXJlYSB3ZSBkbyBub3QgY292ZXIgaW4gb25lIHBhbikKCV9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQlpZiAoIXRoaXMub3B0aW9ucy5yZW1vdmVPdXRzaWRlVmlzaWJsZUJvdW5kcykgewoJCQlyZXR1cm4gdGhpcy5nZXRCb3VuZHMoKTsKCQl9CgoJCXZhciBtYXAgPSB0aGlzLl9tYXAsCgkJCWJvdW5kcyA9IG1hcC5nZXRCb3VuZHMoKSwKCQkJc3cgPSBib3VuZHMuX3NvdXRoV2VzdCwKCQkJbmUgPSBib3VuZHMuX25vcnRoRWFzdCwKCQkJbGF0RGlmZiA9IEwuQnJvd3Nlci5tb2JpbGUgPyAwIDogTWF0aC5hYnMoc3cubGF0IC0gbmUubGF0KSwKCQkJbG5nRGlmZiA9IEwuQnJvd3Nlci5tb2JpbGUgPyAwIDogTWF0aC5hYnMoc3cubG5nIC0gbmUubG5nKTsKCgkJcmV0dXJuIG5ldyBMLkxhdExuZ0JvdW5kcygKCQkJbmV3IEwuTGF0TG5nKHN3LmxhdCAtIGxhdERpZmYsIHN3LmxuZyAtIGxuZ0RpZmYsIHRydWUpLAoJCQluZXcgTC5MYXRMbmcobmUubGF0ICsgbGF0RGlmZiwgbmUubG5nICsgbG5nRGlmZiwgdHJ1ZSkpOwoJfSwKCgkvL1NoYXJlZCBhbmltYXRpb24gY29kZQoJX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQ6IGZ1bmN0aW9uIChsYXllciwgbmV3Q2x1c3RlcikgewoJCWlmIChuZXdDbHVzdGVyID09PSBsYXllcikgewoJCQl0aGlzLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIobGF5ZXIpOwoJCX0gZWxzZSBpZiAobmV3Q2x1c3Rlci5fY2hpbGRDb3VudCA9PT0gMikgewoJCQluZXdDbHVzdGVyLl9hZGRUb01hcCgpOwoKCQkJdmFyIG1hcmtlcnMgPSBuZXdDbHVzdGVyLmdldEFsbENoaWxkTWFya2VycygpOwoJCQl0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIobWFya2Vyc1swXSk7CgkJCXRoaXMuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihtYXJrZXJzWzFdKTsKCQl9IGVsc2UgewoJCQluZXdDbHVzdGVyLl91cGRhdGVJY29uKCk7CgkJfQoJfQp9KTsKCkwuTWFya2VyQ2x1c3Rlckdyb3VwLmluY2x1ZGUoIUwuRG9tVXRpbC5UUkFOU0lUSU9OID8gewoKCS8vTm9uIEFuaW1hdGVkIHZlcnNpb25zIG9mIGV2ZXJ5dGhpbmcKCV9hbmltYXRpb25TdGFydDogZnVuY3Rpb24gKCkgewoJCS8vRG8gbm90aGluZy4uLgoJfSwKCV9hbmltYXRpb25ab29tSW46IGZ1bmN0aW9uIChwcmV2aW91c1pvb21MZXZlbCwgbmV3Wm9vbUxldmVsKSB7CgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsIHByZXZpb3VzWm9vbUxldmVsKTsKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCBuZXdab29tTGV2ZWwsIHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKTsKCX0sCglfYW5pbWF0aW9uWm9vbU91dDogZnVuY3Rpb24gKHByZXZpb3VzWm9vbUxldmVsLCBuZXdab29tTGV2ZWwpIHsKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwpOwoJCXRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsIG5ld1pvb21MZXZlbCwgdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpOwoJfSwKCV9hbmltYXRpb25BZGRMYXllcjogZnVuY3Rpb24gKGxheWVyLCBuZXdDbHVzdGVyKSB7CgkJdGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZChsYXllciwgbmV3Q2x1c3Rlcik7Cgl9Cn0gOiB7CgoJLy9BbmltYXRlZCB2ZXJzaW9ucyBoZXJlCglfYW5pbWF0aW9uU3RhcnQ6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lICs9ICcgbGVhZmxldC1jbHVzdGVyLWFuaW0nOwoJCXRoaXMuX2luWm9vbUFuaW1hdGlvbisrOwoJfSwKCV9hbmltYXRpb25FbmQ6IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fbWFwKSB7CgkJCXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUgPSB0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lLnJlcGxhY2UoJyBsZWFmbGV0LWNsdXN0ZXItYW5pbScsICcnKTsKCQl9CgkJdGhpcy5faW5ab29tQW5pbWF0aW9uLS07CgkJdGhpcy5maXJlKCdhbmltYXRpb25lbmQnKTsKCX0sCglfYW5pbWF0aW9uWm9vbUluOiBmdW5jdGlvbiAocHJldmlvdXNab29tTGV2ZWwsIG5ld1pvb21MZXZlbCkgewoJCXZhciBib3VuZHMgPSB0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSwKCQkgICAgZmcgPSB0aGlzLl9mZWF0dXJlR3JvdXAsCgkJICAgIGk7CgoJCS8vQWRkIGFsbCBjaGlsZHJlbiBvZiBjdXJyZW50IGNsdXN0ZXJzIHRvIG1hcCBhbmQgcmVtb3ZlIHRob3NlIGNsdXN0ZXJzIGZyb20gbWFwCgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseShib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsLCAwLCBmdW5jdGlvbiAoYykgewoJCQl2YXIgc3RhcnRQb3MgPSBjLl9sYXRsbmcsCgkJCQltYXJrZXJzID0gYy5fbWFya2VycywKCQkJCW07CgoJCQlpZiAoIWJvdW5kcy5jb250YWlucyhzdGFydFBvcykpIHsKCQkJCXN0YXJ0UG9zID0gbnVsbDsKCQkJfQoKCQkJaWYgKGMuX2lzU2luZ2xlUGFyZW50KCkgJiYgcHJldmlvdXNab29tTGV2ZWwgKyAxID09PSBuZXdab29tTGV2ZWwpIHsgLy9JbW1lZGlhdGVseSBhZGQgdGhlIG5ldyBjaGlsZCBhbmQgcmVtb3ZlIHVzCgkJCQlmZy5yZW1vdmVMYXllcihjKTsKCQkJCWMuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCBuZXdab29tTGV2ZWwsIGJvdW5kcyk7CgkJCX0gZWxzZSB7CgkJCQkvL0ZhZGUgb3V0IG9sZCBjbHVzdGVyCgkJCQljLnNldE9wYWNpdHkoMCk7CgkJCQljLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAoc3RhcnRQb3MsIG5ld1pvb21MZXZlbCwgYm91bmRzKTsKCQkJfQoKCQkJLy9SZW1vdmUgYWxsIG1hcmtlcnMgdGhhdCBhcmVuJ3QgdmlzaWJsZSBhbnkgbW9yZQoJCQkvL1RPRE86IERvIHdlIGFjdHVhbGx5IG5lZWQgdG8gZG8gdGhpcyBvbiB0aGUgaGlnaGVyIGxldmVscyB0b28/CgkJCWZvciAoaSA9IG1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCW0gPSBtYXJrZXJzW2ldOwoJCQkJaWYgKCFib3VuZHMuY29udGFpbnMobS5fbGF0bG5nKSkgewoJCQkJCWZnLnJlbW92ZUxheWVyKG0pOwoJCQkJfQoJCQl9CgoJCX0pOwoKCQl0aGlzLl9mb3JjZUxheW91dCgpOwoKCQkvL1VwZGF0ZSBvcGFjaXRpZXMKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QmVjb21lVmlzaWJsZShib3VuZHMsIG5ld1pvb21MZXZlbCk7CgkJLy9UT0RPIE1heWJlPyBVcGRhdGUgbWFya2VycyBpbiBfcmVjdXJzaXZlbHlCZWNvbWVWaXNpYmxlCgkJZmcuZWFjaExheWVyKGZ1bmN0aW9uIChuKSB7CgkJCWlmICghKG4gaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIpICYmIG4uX2ljb24pIHsKCQkJCW4uc2V0T3BhY2l0eSgxKTsKCQkJfQoJCX0pOwoKCQkvL3VwZGF0ZSB0aGUgcG9zaXRpb25zIG9mIHRoZSBqdXN0IGFkZGVkIGNsdXN0ZXJzL21hcmtlcnMKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwsIG5ld1pvb21MZXZlbCwgZnVuY3Rpb24gKGMpIHsKCQkJYy5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMobmV3Wm9vbUxldmVsKTsKCQl9KTsKCgkJLy9SZW1vdmUgdGhlIG9sZCBjbHVzdGVycyBhbmQgY2xvc2UgdGhlIHpvb20gYW5pbWF0aW9uCgkJdGhpcy5fZW5xdWV1ZShmdW5jdGlvbiAoKSB7CgkJCS8vdXBkYXRlIHRoZSBwb3NpdGlvbnMgb2YgdGhlIGp1c3QgYWRkZWQgY2x1c3RlcnMvbWFya2VycwoJCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwsIDAsIGZ1bmN0aW9uIChjKSB7CgkJCQlmZy5yZW1vdmVMYXllcihjKTsKCQkJCWMuc2V0T3BhY2l0eSgxKTsKCQkJfSk7CgoJCQl0aGlzLl9hbmltYXRpb25FbmQoKTsKCQl9KTsKCX0sCgoJX2FuaW1hdGlvblpvb21PdXQ6IGZ1bmN0aW9uIChwcmV2aW91c1pvb21MZXZlbCwgbmV3Wm9vbUxldmVsKSB7CgkJdGhpcy5fYW5pbWF0aW9uWm9vbU91dFNpbmdsZSh0aGlzLl90b3BDbHVzdGVyTGV2ZWwsIHByZXZpb3VzWm9vbUxldmVsIC0gMSwgbmV3Wm9vbUxldmVsKTsKCgkJLy9OZWVkIHRvIGFkZCBtYXJrZXJzIGZvciB0aG9zZSB0aGF0IHdlcmVuJ3Qgb24gdGhlIG1hcCBiZWZvcmUgYnV0IGFyZSBub3cKCQl0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLCBuZXdab29tTGV2ZWwsIHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKTsKCQkvL1JlbW92ZSBtYXJrZXJzIHRoYXQgd2VyZSBvbiB0aGUgbWFwIGJlZm9yZSBidXQgd29uJ3QgYmUgbm93CgkJdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsIHByZXZpb3VzWm9vbUxldmVsLCB0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSk7Cgl9LAoJX2FuaW1hdGlvblpvb21PdXRTaW5nbGU6IGZ1bmN0aW9uIChjbHVzdGVyLCBwcmV2aW91c1pvb21MZXZlbCwgbmV3Wm9vbUxldmVsKSB7CgkJdmFyIGJvdW5kcyA9IHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpOwoKCQkvL0FuaW1hdGUgYWxsIG9mIHRoZSBtYXJrZXJzIGluIHRoZSBjbHVzdGVycyB0byBtb3ZlIHRvIHRoZWlyIGNsdXN0ZXIgY2VudGVyIHBvaW50CgkJY2x1c3Rlci5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcChib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsICsgMSwgbmV3Wm9vbUxldmVsKTsKCgkJdmFyIG1lID0gdGhpczsKCgkJLy9VcGRhdGUgdGhlIG9wYWNpdHkgKElmIHdlIGltbWVkaWF0ZWx5IHNldCBpdCB0aGV5IHdvbid0IGFuaW1hdGUpCgkJdGhpcy5fZm9yY2VMYXlvdXQoKTsKCQljbHVzdGVyLl9yZWN1cnNpdmVseUJlY29tZVZpc2libGUoYm91bmRzLCBuZXdab29tTGV2ZWwpOwoKCQkvL1RPRE86IE1heWJlIHVzZSB0aGUgdHJhbnNpdGlvbiB0aW1pbmcgc3R1ZmYgdG8gbWFrZSB0aGlzIG1vcmUgcmVsaWFibGUKCQkvL1doZW4gdGhlIGFuaW1hdGlvbnMgYXJlIGRvbmUsIHRpZHkgdXAKCQl0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uICgpIHsKCgkJCS8vVGhpcyBjbHVzdGVyIHN0b3BwZWQgYmVpbmcgYSBjbHVzdGVyIGJlZm9yZSB0aGUgdGltZW91dCBmaXJlZAoJCQlpZiAoY2x1c3Rlci5fY2hpbGRDb3VudCA9PT0gMSkgewoJCQkJdmFyIG0gPSBjbHVzdGVyLl9tYXJrZXJzWzBdOwoJCQkJLy9JZiB3ZSB3ZXJlIGluIGEgY2x1c3RlciBhbmltYXRpb24gYXQgdGhlIHRpbWUgdGhlbiB0aGUgb3BhY2l0eSBhbmQgcG9zaXRpb24gb2Ygb3VyIGNoaWxkIGNvdWxkIGJlIHdyb25nIG5vdywgc28gZml4IGl0CgkJCQltLnNldExhdExuZyhtLmdldExhdExuZygpKTsKCQkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCQltLnNldE9wYWNpdHkoMSk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQljbHVzdGVyLl9yZWN1cnNpdmVseShib3VuZHMsIG5ld1pvb21MZXZlbCwgMCwgZnVuY3Rpb24gKGMpIHsKCQkJCQljLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsICsgMSk7CgkJCQl9KTsKCQkJfQoJCQltZS5fYW5pbWF0aW9uRW5kKCk7CgkJfSk7Cgl9LAoJX2FuaW1hdGlvbkFkZExheWVyOiBmdW5jdGlvbiAobGF5ZXIsIG5ld0NsdXN0ZXIpIHsKCQl2YXIgbWUgPSB0aGlzLAoJCQlmZyA9IHRoaXMuX2ZlYXR1cmVHcm91cDsKCgkJZmcuYWRkTGF5ZXIobGF5ZXIpOwoJCWlmIChuZXdDbHVzdGVyICE9PSBsYXllcikgewoJCQlpZiAobmV3Q2x1c3Rlci5fY2hpbGRDb3VudCA+IDIpIHsgLy9XYXMgYWxyZWFkeSBhIGNsdXN0ZXIKCgkJCQluZXdDbHVzdGVyLl91cGRhdGVJY29uKCk7CgkJCQl0aGlzLl9mb3JjZUxheW91dCgpOwoJCQkJdGhpcy5fYW5pbWF0aW9uU3RhcnQoKTsKCgkJCQlsYXllci5fc2V0UG9zKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQobmV3Q2x1c3Rlci5nZXRMYXRMbmcoKSkpOwoJCQkJbGF5ZXIuc2V0T3BhY2l0eSgwKTsKCgkJCQl0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uICgpIHsKCQkJCQlmZy5yZW1vdmVMYXllcihsYXllcik7CgkJCQkJbGF5ZXIuc2V0T3BhY2l0eSgxKTsKCgkJCQkJbWUuX2FuaW1hdGlvbkVuZCgpOwoJCQkJfSk7CgoJCQl9IGVsc2UgeyAvL0p1c3QgYmVjYW1lIGEgY2x1c3RlcgoJCQkJdGhpcy5fZm9yY2VMYXlvdXQoKTsKCgkJCQltZS5fYW5pbWF0aW9uU3RhcnQoKTsKCQkJCW1lLl9hbmltYXRpb25ab29tT3V0U2luZ2xlKG5ld0NsdXN0ZXIsIHRoaXMuX21hcC5nZXRNYXhab29tKCksIHRoaXMuX21hcC5nZXRab29tKCkpOwoJCQl9CgkJfQoJfSwKCgkvL0ZvcmNlIGEgYnJvd3NlciBsYXlvdXQgb2Ygc3R1ZmYgaW4gdGhlIG1hcAoJLy8gU2hvdWxkIGFwcGx5IHRoZSBjdXJyZW50IG9wYWNpdHkgYW5kIGxvY2F0aW9uIHRvIGFsbCBlbGVtZW50cyBzbyB3ZSBjYW4gdXBkYXRlIHRoZW0gYWdhaW4gZm9yIGFuIGFuaW1hdGlvbgoJX2ZvcmNlTGF5b3V0OiBmdW5jdGlvbiAoKSB7CgkJLy9JbiBteSB0ZXN0aW5nIHRoaXMgd29ya3MsIGluZmFjdCBvZmZzZXRXaWR0aCBvZiBhbnkgZWxlbWVudCBzZWVtcyB0byB3b3JrLgoJCS8vQ291bGQgbG9vcCBhbGwgdGhpcy5fbGF5ZXJzIGFuZCBkbyB0aGlzIGZvciBlYWNoIF9pY29uIGlmIGl0IHN0b3BzIHdvcmtpbmcKCgkJTC5VdGlsLmZhbHNlRm4oZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCk7Cgl9Cn0pOwoKTC5tYXJrZXJDbHVzdGVyR3JvdXAgPSBmdW5jdGlvbiAob3B0aW9ucykgewoJcmV0dXJuIG5ldyBMLk1hcmtlckNsdXN0ZXJHcm91cChvcHRpb25zKTsKfTsKCgpMLk1hcmtlckNsdXN0ZXIgPSBMLk1hcmtlci5leHRlbmQoewoJaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGdyb3VwLCB6b29tLCBhLCBiKSB7CgoJCUwuTWFya2VyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywgYSA/IChhLl9jTGF0TG5nIHx8IGEuZ2V0TGF0TG5nKCkpIDogbmV3IEwuTGF0TG5nKDAsIDApLCB7IGljb246IHRoaXMgfSk7CgoKCQl0aGlzLl9ncm91cCA9IGdyb3VwOwoJCXRoaXMuX3pvb20gPSB6b29tOwoKCQl0aGlzLl9tYXJrZXJzID0gW107CgkJdGhpcy5fY2hpbGRDbHVzdGVycyA9IFtdOwoJCXRoaXMuX2NoaWxkQ291bnQgPSAwOwoJCXRoaXMuX2ljb25OZWVkc1VwZGF0ZSA9IHRydWU7CgoJCXRoaXMuX2JvdW5kcyA9IG5ldyBMLkxhdExuZ0JvdW5kcygpOwoKCQlpZiAoYSkgewoJCQl0aGlzLl9hZGRDaGlsZChhKTsKCQl9CgkJaWYgKGIpIHsKCQkJdGhpcy5fYWRkQ2hpbGQoYik7CgkJfQoJfSwKCgkvL1JlY3Vyc2l2ZWx5IHJldHJpZXZlIGFsbCBjaGlsZCBtYXJrZXJzIG9mIHRoaXMgY2x1c3RlcgoJZ2V0QWxsQ2hpbGRNYXJrZXJzOiBmdW5jdGlvbiAoc3RvcmFnZUFycmF5KSB7CgkJc3RvcmFnZUFycmF5ID0gc3RvcmFnZUFycmF5IHx8IFtdOwoKCQlmb3IgKHZhciBpID0gdGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl0aGlzLl9jaGlsZENsdXN0ZXJzW2ldLmdldEFsbENoaWxkTWFya2VycyhzdG9yYWdlQXJyYXkpOwoJCX0KCgkJZm9yICh2YXIgaiA9IHRoaXMuX21hcmtlcnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJc3RvcmFnZUFycmF5LnB1c2godGhpcy5fbWFya2Vyc1tqXSk7CgkJfQoKCQlyZXR1cm4gc3RvcmFnZUFycmF5OwoJfSwKCgkvL1JldHVybnMgdGhlIGNvdW50IG9mIGhvdyBtYW55IGNoaWxkIG1hcmtlcnMgd2UgaGF2ZQoJZ2V0Q2hpbGRDb3VudDogZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLl9jaGlsZENvdW50OwoJfSwKCgkvL1pvb20gdG8gdGhlIG1pbmltdW0gb2Ygc2hvd2luZyBhbGwgb2YgdGhlIGNoaWxkIG1hcmtlcnMsIG9yIHRoZSBleHRlbnRzIG9mIHRoaXMgY2x1c3RlcgoJem9vbVRvQm91bmRzOiBmdW5jdGlvbiAoKSB7CgkJdmFyIGNoaWxkQ2x1c3RlcnMgPSB0aGlzLl9jaGlsZENsdXN0ZXJzLnNsaWNlKCksCgkJCW1hcCA9IHRoaXMuX2dyb3VwLl9tYXAsCgkJCWJvdW5kc1pvb20gPSBtYXAuZ2V0Qm91bmRzWm9vbSh0aGlzLl9ib3VuZHMpLAoJCQl6b29tID0gdGhpcy5fem9vbSArIDEsCgkJCW1hcFpvb20gPSBtYXAuZ2V0Wm9vbSgpLAoJCQlpOwoKCQkvL2NhbGN1bGF0ZSBob3cgZmFyZSB3ZSBuZWVkIHRvIHpvb20gZG93biB0byBzZWUgYWxsIG9mIHRoZSBtYXJrZXJzCgkJd2hpbGUgKGNoaWxkQ2x1c3RlcnMubGVuZ3RoID4gMCAmJiBib3VuZHNab29tID4gem9vbSkgewoJCQl6b29tKys7CgkJCXZhciBuZXdDbHVzdGVycyA9IFtdOwoJCQlmb3IgKGkgPSAwOyBpIDwgY2hpbGRDbHVzdGVycy5sZW5ndGg7IGkrKykgewoJCQkJbmV3Q2x1c3RlcnMgPSBuZXdDbHVzdGVycy5jb25jYXQoY2hpbGRDbHVzdGVyc1tpXS5fY2hpbGRDbHVzdGVycyk7CgkJCX0KCQkJY2hpbGRDbHVzdGVycyA9IG5ld0NsdXN0ZXJzOwoJCX0KCgkJaWYgKGJvdW5kc1pvb20gPiB6b29tKSB7CgkJCXRoaXMuX2dyb3VwLl9tYXAuc2V0Vmlldyh0aGlzLl9sYXRsbmcsIHpvb20pOwoJCX0gZWxzZSBpZiAoYm91bmRzWm9vbSA8PSBtYXBab29tKSB7IC8vSWYgZml0Qm91bmRzIHdvdWxkbid0IHpvb20gdXMgZG93biwgem9vbSB1cyBkb3duIGluc3RlYWQKCQkJdGhpcy5fZ3JvdXAuX21hcC5zZXRWaWV3KHRoaXMuX2xhdGxuZywgbWFwWm9vbSArIDEpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2dyb3VwLl9tYXAuZml0Qm91bmRzKHRoaXMuX2JvdW5kcyk7CgkJfQoJfSwKCglnZXRCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQl2YXIgYm91bmRzID0gbmV3IEwuTGF0TG5nQm91bmRzKCk7CgkJYm91bmRzLmV4dGVuZCh0aGlzLl9ib3VuZHMpOwoJCXJldHVybiBib3VuZHM7Cgl9LAoKCV91cGRhdGVJY29uOiBmdW5jdGlvbiAoKSB7CgkJdGhpcy5faWNvbk5lZWRzVXBkYXRlID0gdHJ1ZTsKCQlpZiAodGhpcy5faWNvbikgewoJCQl0aGlzLnNldEljb24odGhpcyk7CgkJfQoJfSwKCgkvL0NsdWRnZSBmb3IgSWNvbiwgd2UgcHJldGVuZCB0byBiZSBhbiBpY29uIGZvciBwZXJmb3JtYW5jZQoJY3JlYXRlSWNvbjogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9pY29uTmVlZHNVcGRhdGUpIHsKCQkJdGhpcy5faWNvbk9iaiA9IHRoaXMuX2dyb3VwLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHRoaXMpOwoJCQl0aGlzLl9pY29uTmVlZHNVcGRhdGUgPSBmYWxzZTsKCQl9CgkJcmV0dXJuIHRoaXMuX2ljb25PYmouY3JlYXRlSWNvbigpOwoJfSwKCWNyZWF0ZVNoYWRvdzogZnVuY3Rpb24gKCkgewoJCXJldHVybiB0aGlzLl9pY29uT2JqLmNyZWF0ZVNoYWRvdygpOwoJfSwKCgoJX2FkZENoaWxkOiBmdW5jdGlvbiAobmV3MSwgaXNOb3RpZmljYXRpb25Gcm9tQ2hpbGQpIHsKCgkJdGhpcy5faWNvbk5lZWRzVXBkYXRlID0gdHJ1ZTsKCQl0aGlzLl9leHBhbmRCb3VuZHMobmV3MSk7CgoJCWlmIChuZXcxIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKSB7CgkJCWlmICghaXNOb3RpZmljYXRpb25Gcm9tQ2hpbGQpIHsKCQkJCXRoaXMuX2NoaWxkQ2x1c3RlcnMucHVzaChuZXcxKTsKCQkJCW5ldzEuX19wYXJlbnQgPSB0aGlzOwoJCQl9CgkJCXRoaXMuX2NoaWxkQ291bnQgKz0gbmV3MS5fY2hpbGRDb3VudDsKCQl9IGVsc2UgewoJCQlpZiAoIWlzTm90aWZpY2F0aW9uRnJvbUNoaWxkKSB7CgkJCQl0aGlzLl9tYXJrZXJzLnB1c2gobmV3MSk7CgkJCX0KCQkJdGhpcy5fY2hpbGRDb3VudCsrOwoJCX0KCgkJaWYgKHRoaXMuX19wYXJlbnQpIHsKCQkJdGhpcy5fX3BhcmVudC5fYWRkQ2hpbGQobmV3MSwgdHJ1ZSk7CgkJfQoJfSwKCgkvL0V4cGFuZCBvdXIgYm91bmRzIGFuZCB0ZWxsIG91ciBwYXJlbnQgdG8KCV9leHBhbmRCb3VuZHM6IGZ1bmN0aW9uIChtYXJrZXIpIHsKCQl2YXIgYWRkZWRDb3VudCwKCQkgICAgYWRkZWRMYXRMbmcgPSBtYXJrZXIuX3dMYXRMbmcgfHwgbWFya2VyLl9sYXRsbmc7CgoJCWlmIChtYXJrZXIgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXIpIHsKCQkJdGhpcy5fYm91bmRzLmV4dGVuZChtYXJrZXIuX2JvdW5kcyk7CgkJCWFkZGVkQ291bnQgPSBtYXJrZXIuX2NoaWxkQ291bnQ7CgkJfSBlbHNlIHsKCQkJdGhpcy5fYm91bmRzLmV4dGVuZChhZGRlZExhdExuZyk7CgkJCWFkZGVkQ291bnQgPSAxOwoJCX0KCgkJaWYgKCF0aGlzLl9jTGF0TG5nKSB7CgkJCS8vIHdoZW4gY2x1c3RlcmluZywgdGFrZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcG9pbnQgYXMgdGhlIGNsdXN0ZXIgY2VudGVyCgkJCXRoaXMuX2NMYXRMbmcgPSBtYXJrZXIuX2NMYXRMbmcgfHwgYWRkZWRMYXRMbmc7CgkJfQoKCQkvLyB3aGVuIHNob3dpbmcgY2x1c3RlcnMsIHRha2Ugd2VpZ2h0ZWQgYXZlcmFnZSBvZiBhbGwgcG9pbnRzIGFzIGNsdXN0ZXIgY2VudGVyCgkJdmFyIHRvdGFsQ291bnQgPSB0aGlzLl9jaGlsZENvdW50ICsgYWRkZWRDb3VudDsKCgkJLy9DYWxjdWxhdGUgd2VpZ2h0ZWQgbGF0bG5nIGZvciBkaXNwbGF5CgkJaWYgKCF0aGlzLl93TGF0TG5nKSB7CgkJCXRoaXMuX2xhdGxuZyA9IHRoaXMuX3dMYXRMbmcgPSBuZXcgTC5MYXRMbmcoYWRkZWRMYXRMbmcubGF0LCBhZGRlZExhdExuZy5sbmcpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX3dMYXRMbmcubGF0ID0gKGFkZGVkTGF0TG5nLmxhdCAqIGFkZGVkQ291bnQgKyB0aGlzLl93TGF0TG5nLmxhdCAqIHRoaXMuX2NoaWxkQ291bnQpIC8gdG90YWxDb3VudDsKCQkJdGhpcy5fd0xhdExuZy5sbmcgPSAoYWRkZWRMYXRMbmcubG5nICogYWRkZWRDb3VudCArIHRoaXMuX3dMYXRMbmcubG5nICogdGhpcy5fY2hpbGRDb3VudCkgLyB0b3RhbENvdW50OwoJCX0KCX0sCgoJLy9TZXQgb3VyIG1hcmtlcnMgcG9zaXRpb24gYXMgZ2l2ZW4gYW5kIGFkZCBpdCB0byB0aGUgbWFwCglfYWRkVG9NYXA6IGZ1bmN0aW9uIChzdGFydFBvcykgewoJCWlmIChzdGFydFBvcykgewoJCQl0aGlzLl9iYWNrdXBMYXRsbmcgPSB0aGlzLl9sYXRsbmc7CgkJCXRoaXMuc2V0TGF0TG5nKHN0YXJ0UG9zKTsKCQl9CgkJdGhpcy5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5hZGRMYXllcih0aGlzKTsKCX0sCgoJX3JlY3Vyc2l2ZWx5QW5pbWF0ZUNoaWxkcmVuSW46IGZ1bmN0aW9uIChib3VuZHMsIGNlbnRlciwgbWF4Wm9vbSkgewoJCXRoaXMuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgMCwgbWF4Wm9vbSAtIDEsCgkJCWZ1bmN0aW9uIChjKSB7CgkJCQl2YXIgbWFya2VycyA9IGMuX21hcmtlcnMsCgkJCQkJaSwgbTsKCQkJCWZvciAoaSA9IG1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCQltID0gbWFya2Vyc1tpXTsKCgkJCQkJLy9Pbmx5IGRvIGl0IGlmIHRoZSBpY29uIGlzIHN0aWxsIG9uIHRoZSBtYXAKCQkJCQlpZiAobS5faWNvbikgewoJCQkJCQltLl9zZXRQb3MoY2VudGVyKTsKCQkJCQkJbS5zZXRPcGFjaXR5KDApOwoJCQkJCX0KCQkJCX0KCQkJfSwKCQkJZnVuY3Rpb24gKGMpIHsKCQkJCXZhciBjaGlsZENsdXN0ZXJzID0gYy5fY2hpbGRDbHVzdGVycywKCQkJCQlqLCBjbTsKCQkJCWZvciAoaiA9IGNoaWxkQ2x1c3RlcnMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJCQljbSA9IGNoaWxkQ2x1c3RlcnNbal07CgkJCQkJaWYgKGNtLl9pY29uKSB7CgkJCQkJCWNtLl9zZXRQb3MoY2VudGVyKTsKCQkJCQkJY20uc2V0T3BhY2l0eSgwKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkpOwoJfSwKCglfcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcDogZnVuY3Rpb24gKGJvdW5kcywgcHJldmlvdXNab29tTGV2ZWwsIG5ld1pvb21MZXZlbCkgewoJCXRoaXMuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgbmV3Wm9vbUxldmVsLCAwLAoJCQlmdW5jdGlvbiAoYykgewoJCQkJYy5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5Jbihib3VuZHMsIGMuX2dyb3VwLl9tYXAubGF0TG5nVG9MYXllclBvaW50KGMuZ2V0TGF0TG5nKCkpLnJvdW5kKCksIHByZXZpb3VzWm9vbUxldmVsKTsKCgkJCQkvL1RPRE86IGRlcHRoVG9BbmltYXRlSW4gYWZmZWN0cyBfaXNTaW5nbGVQYXJlbnQsIGlmIHRoZXJlIGlzIGEgbXVsdGl6b29tIHdlIG1heS9tYXkgbm90IGJlLgoJCQkJLy9BcyBhIGhhY2sgd2Ugb25seSBkbyBhIGFuaW1hdGlvbiBmcmVlIHpvb20gb24gYSBzaW5nbGUgbGV2ZWwgem9vbSwgaWYgc29tZW9uZSBkb2VzIG11bHRpcGxlIGxldmVscyB0aGVuIHdlIGFsd2F5cyBhbmltYXRlCgkJCQlpZiAoYy5faXNTaW5nbGVQYXJlbnQoKSAmJiBwcmV2aW91c1pvb21MZXZlbCAtIDEgPT09IG5ld1pvb21MZXZlbCkgewoJCQkJCWMuc2V0T3BhY2l0eSgxKTsKCQkJCQljLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChib3VuZHMsIHByZXZpb3VzWm9vbUxldmVsKTsgLy9JbW1lZGlhdGVseSByZW1vdmUgb3VyIGNoaWxkcmVuIGFzIHdlIGFyZSByZXBsYWNpbmcgdGhlbS4gVE9ETyBwcmV2aW91c0JvdW5kcyBub3QgYm91bmRzCgkJCQl9IGVsc2UgewoJCQkJCWMuc2V0T3BhY2l0eSgwKTsKCQkJCX0KCgkJCQljLl9hZGRUb01hcCgpOwoJCQl9CgkJKTsKCX0sCgoJX3JlY3Vyc2l2ZWx5QmVjb21lVmlzaWJsZTogZnVuY3Rpb24gKGJvdW5kcywgem9vbUxldmVsKSB7CgkJdGhpcy5fcmVjdXJzaXZlbHkoYm91bmRzLCAwLCB6b29tTGV2ZWwsIG51bGwsIGZ1bmN0aW9uIChjKSB7CgkJCWMuc2V0T3BhY2l0eSgxKTsKCQl9KTsKCX0sCgoJX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcDogZnVuY3Rpb24gKHN0YXJ0UG9zLCB6b29tTGV2ZWwsIGJvdW5kcykgewoJCXRoaXMuX3JlY3Vyc2l2ZWx5KGJvdW5kcywgLTEsIHpvb21MZXZlbCwKCQkJZnVuY3Rpb24gKGMpIHsKCQkJCWlmICh6b29tTGV2ZWwgPT09IGMuX3pvb20pIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJLy9BZGQgb3VyIGNoaWxkIG1hcmtlcnMgYXQgc3RhcnRQb3MgKHNvIHRoZXkgY2FuIGJlIGFuaW1hdGVkIG91dCkKCQkJCWZvciAodmFyIGkgPSBjLl9tYXJrZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQkJdmFyIG5tID0gYy5fbWFya2Vyc1tpXTsKCgkJCQkJaWYgKCFib3VuZHMuY29udGFpbnMobm0uX2xhdGxuZykpIHsKCQkJCQkJY29udGludWU7CgkJCQkJfQoKCQkJCQlpZiAoc3RhcnRQb3MpIHsKCQkJCQkJbm0uX2JhY2t1cExhdGxuZyA9IG5tLmdldExhdExuZygpOwoKCQkJCQkJbm0uc2V0TGF0TG5nKHN0YXJ0UG9zKTsKCQkJCQkJaWYgKG5tLnNldE9wYWNpdHkpIHsKCQkJCQkJCW5tLnNldE9wYWNpdHkoMCk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWMuX2dyb3VwLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIobm0pOwoJCQkJfQoJCQl9LAoJCQlmdW5jdGlvbiAoYykgewoJCQkJYy5fYWRkVG9NYXAoc3RhcnRQb3MpOwoJCQl9CgkJKTsKCX0sCgoJX3JlY3Vyc2l2ZWx5UmVzdG9yZUNoaWxkUG9zaXRpb25zOiBmdW5jdGlvbiAoem9vbUxldmVsKSB7CgkJLy9GaXggcG9zaXRpb25zIG9mIGNoaWxkIG1hcmtlcnMKCQlmb3IgKHZhciBpID0gdGhpcy5fbWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl2YXIgbm0gPSB0aGlzLl9tYXJrZXJzW2ldOwoJCQlpZiAobm0uX2JhY2t1cExhdGxuZykgewoJCQkJbm0uc2V0TGF0TG5nKG5tLl9iYWNrdXBMYXRsbmcpOwoJCQkJZGVsZXRlIG5tLl9iYWNrdXBMYXRsbmc7CgkJCX0KCQl9CgoJCWlmICh6b29tTGV2ZWwgLSAxID09PSB0aGlzLl96b29tKSB7CgkJCS8vUmVwb3NpdGlvbiBjaGlsZCBjbHVzdGVycwoJCQlmb3IgKHZhciBqID0gdGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBqID49IDA7IGotLSkgewoJCQkJdGhpcy5fY2hpbGRDbHVzdGVyc1tqXS5fcmVzdG9yZVBvc2l0aW9uKCk7CgkJCX0KCQl9IGVsc2UgewoJCQlmb3IgKHZhciBrID0gdGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBrID49IDA7IGstLSkgewoJCQkJdGhpcy5fY2hpbGRDbHVzdGVyc1trXS5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMoem9vbUxldmVsKTsKCQkJfQoJCX0KCX0sCgoJX3Jlc3RvcmVQb3NpdGlvbjogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9iYWNrdXBMYXRsbmcpIHsKCQkJdGhpcy5zZXRMYXRMbmcodGhpcy5fYmFja3VwTGF0bG5nKTsKCQkJZGVsZXRlIHRoaXMuX2JhY2t1cExhdGxuZzsKCQl9Cgl9LAoKCS8vZXhjZXB0Qm91bmRzOiBJZiBzZXQsIGRvbid0IHJlbW92ZSBhbnkgbWFya2Vycy9jbHVzdGVycyBpbiBpdAoJX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwOiBmdW5jdGlvbiAocHJldmlvdXNCb3VuZHMsIHpvb21MZXZlbCwgZXhjZXB0Qm91bmRzKSB7CgkJdmFyIG0sIGk7CgkJdGhpcy5fcmVjdXJzaXZlbHkocHJldmlvdXNCb3VuZHMsIC0xLCB6b29tTGV2ZWwgLSAxLAoJCQlmdW5jdGlvbiAoYykgewoJCQkJLy9SZW1vdmUgbWFya2VycyBhdCBldmVyeSBsZXZlbAoJCQkJZm9yIChpID0gYy5fbWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJCW0gPSBjLl9tYXJrZXJzW2ldOwoJCQkJCWlmICghZXhjZXB0Qm91bmRzIHx8ICFleGNlcHRCb3VuZHMuY29udGFpbnMobS5fbGF0bG5nKSkgewoJCQkJCQljLl9ncm91cC5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKG0pOwoJCQkJCQlpZiAobS5zZXRPcGFjaXR5KSB7CgkJCQkJCQltLnNldE9wYWNpdHkoMSk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0sCgkJCWZ1bmN0aW9uIChjKSB7CgkJCQkvL1JlbW92ZSBjaGlsZCBjbHVzdGVycyBhdCBqdXN0IHRoZSBib3R0b20gbGV2ZWwKCQkJCWZvciAoaSA9IGMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCQltID0gYy5fY2hpbGRDbHVzdGVyc1tpXTsKCQkJCQlpZiAoIWV4Y2VwdEJvdW5kcyB8fCAhZXhjZXB0Qm91bmRzLmNvbnRhaW5zKG0uX2xhdGxuZykpIHsKCQkJCQkJYy5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihtKTsKCQkJCQkJaWYgKG0uc2V0T3BhY2l0eSkgewoJCQkJCQkJbS5zZXRPcGFjaXR5KDEpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJKTsKCX0sCgoJLy9SdW4gdGhlIGdpdmVuIGZ1bmN0aW9ucyByZWN1cnNpdmVseSB0byB0aGlzIGFuZCBjaGlsZCBjbHVzdGVycwoJLy8gYm91bmRzVG9BcHBseVRvOiBhIEwuTGF0TG5nQm91bmRzIHJlcHJlc2VudGluZyB0aGUgYm91bmRzIG9mIHdoYXQgY2x1c3RlcnMgdG8gcmVjdXJzZSBpbiB0bwoJLy8gem9vbUxldmVsVG9TdGFydDogem9vbSBsZXZlbCB0byBzdGFydCBydW5uaW5nIGZ1bmN0aW9ucyAoaW5jbHVzaXZlKQoJLy8gem9vbUxldmVsVG9TdG9wOiB6b29tIGxldmVsIHRvIHN0b3AgcnVubmluZyBmdW5jdGlvbnMgKGluY2x1c2l2ZSkKCS8vIHJ1bkF0RXZlcnlMZXZlbDogZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBMLk1hcmtlckNsdXN0ZXIgYXMgYW4gYXJndW1lbnQgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBvbiBldmVyeSBsZXZlbAoJLy8gcnVuQXRCb3R0b21MZXZlbDogZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBMLk1hcmtlckNsdXN0ZXIgYXMgYW4gYXJndW1lbnQgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBhdCBvbmx5IHRoZSBib3R0b20gbGV2ZWwKCV9yZWN1cnNpdmVseTogZnVuY3Rpb24gKGJvdW5kc1RvQXBwbHlUbywgem9vbUxldmVsVG9TdGFydCwgem9vbUxldmVsVG9TdG9wLCBydW5BdEV2ZXJ5TGV2ZWwsIHJ1bkF0Qm90dG9tTGV2ZWwpIHsKCQl2YXIgY2hpbGRDbHVzdGVycyA9IHRoaXMuX2NoaWxkQ2x1c3RlcnMsCgkJICAgIHpvb20gPSB0aGlzLl96b29tLAoJCQlpLCBjOwoKCQlpZiAoem9vbUxldmVsVG9TdGFydCA+IHpvb20pIHsgLy9TdGlsbCBnb2luZyBkb3duIHRvIHJlcXVpcmVkIGRlcHRoLCBqdXN0IHJlY3Vyc2UgdG8gY2hpbGQgY2x1c3RlcnMKCQkJZm9yIChpID0gY2hpbGRDbHVzdGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJYyA9IGNoaWxkQ2x1c3RlcnNbaV07CgkJCQlpZiAoYm91bmRzVG9BcHBseVRvLmludGVyc2VjdHMoYy5fYm91bmRzKSkgewoJCQkJCWMuX3JlY3Vyc2l2ZWx5KGJvdW5kc1RvQXBwbHlUbywgem9vbUxldmVsVG9TdGFydCwgem9vbUxldmVsVG9TdG9wLCBydW5BdEV2ZXJ5TGV2ZWwsIHJ1bkF0Qm90dG9tTGV2ZWwpOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsgLy9JbiByZXF1aXJlZCBkZXB0aAoKCQkJaWYgKHJ1bkF0RXZlcnlMZXZlbCkgewoJCQkJcnVuQXRFdmVyeUxldmVsKHRoaXMpOwoJCQl9CgkJCWlmIChydW5BdEJvdHRvbUxldmVsICYmIHRoaXMuX3pvb20gPT09IHpvb21MZXZlbFRvU3RvcCkgewoJCQkJcnVuQXRCb3R0b21MZXZlbCh0aGlzKTsKCQkJfQoKCQkJLy9UT0RPOiBUaGlzIGxvb3AgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIGFib3ZlCgkJCWlmICh6b29tTGV2ZWxUb1N0b3AgPiB6b29tKSB7CgkJCQlmb3IgKGkgPSBjaGlsZENsdXN0ZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQkJYyA9IGNoaWxkQ2x1c3RlcnNbaV07CgkJCQkJaWYgKGJvdW5kc1RvQXBwbHlUby5pbnRlcnNlY3RzKGMuX2JvdW5kcykpIHsKCQkJCQkJYy5fcmVjdXJzaXZlbHkoYm91bmRzVG9BcHBseVRvLCB6b29tTGV2ZWxUb1N0YXJ0LCB6b29tTGV2ZWxUb1N0b3AsIHJ1bkF0RXZlcnlMZXZlbCwgcnVuQXRCb3R0b21MZXZlbCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfSwKCglfcmVjYWxjdWxhdGVCb3VuZHM6IGZ1bmN0aW9uICgpIHsKCQl2YXIgbWFya2VycyA9IHRoaXMuX21hcmtlcnMsCgkJCWNoaWxkQ2x1c3RlcnMgPSB0aGlzLl9jaGlsZENsdXN0ZXJzLAoJCQlpOwoKCQl0aGlzLl9ib3VuZHMgPSBuZXcgTC5MYXRMbmdCb3VuZHMoKTsKCQlkZWxldGUgdGhpcy5fd0xhdExuZzsKCgkJZm9yIChpID0gbWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl0aGlzLl9leHBhbmRCb3VuZHMobWFya2Vyc1tpXSk7CgkJfQoJCWZvciAoaSA9IGNoaWxkQ2x1c3RlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJdGhpcy5fZXhwYW5kQm91bmRzKGNoaWxkQ2x1c3RlcnNbaV0pOwoJCX0KCX0sCgoKCS8vUmV0dXJucyB0cnVlIGlmIHdlIGFyZSB0aGUgcGFyZW50IG9mIG9ubHkgb25lIGNsdXN0ZXIgYW5kIHRoYXQgY2x1c3RlciBpcyB0aGUgc2FtZSBhcyB1cwoJX2lzU2luZ2xlUGFyZW50OiBmdW5jdGlvbiAoKSB7CgkJLy9Eb24ndCBuZWVkIHRvIGNoZWNrIHRoaXMuX21hcmtlcnMgYXMgdGhlIHJlc3Qgd29uJ3Qgd29yayBpZiB0aGVyZSBhcmUgYW55CgkJcmV0dXJuIHRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoID4gMCAmJiB0aGlzLl9jaGlsZENsdXN0ZXJzWzBdLl9jaGlsZENvdW50ID09PSB0aGlzLl9jaGlsZENvdW50OwoJfQp9KTsKCgoKTC5EaXN0YW5jZUdyaWQgPSBmdW5jdGlvbiAoY2VsbFNpemUpIHsKCXRoaXMuX2NlbGxTaXplID0gY2VsbFNpemU7Cgl0aGlzLl9zcUNlbGxTaXplID0gY2VsbFNpemUgKiBjZWxsU2l6ZTsKCXRoaXMuX2dyaWQgPSB7fTsKCXRoaXMuX29iamVjdFBvaW50ID0geyB9Owp9OwoKTC5EaXN0YW5jZUdyaWQucHJvdG90eXBlID0gewoKCWFkZE9iamVjdDogZnVuY3Rpb24gKG9iaiwgcG9pbnQpIHsKCQl2YXIgeCA9IHRoaXMuX2dldENvb3JkKHBvaW50LngpLAoJCSAgICB5ID0gdGhpcy5fZ2V0Q29vcmQocG9pbnQueSksCgkJICAgIGdyaWQgPSB0aGlzLl9ncmlkLAoJCSAgICByb3cgPSBncmlkW3ldID0gZ3JpZFt5XSB8fCB7fSwKCQkgICAgY2VsbCA9IHJvd1t4XSA9IHJvd1t4XSB8fCBbXSwKCQkgICAgc3RhbXAgPSBMLlV0aWwuc3RhbXAob2JqKTsKCgkJdGhpcy5fb2JqZWN0UG9pbnRbc3RhbXBdID0gcG9pbnQ7CgoJCWNlbGwucHVzaChvYmopOwoJfSwKCgl1cGRhdGVPYmplY3Q6IGZ1bmN0aW9uIChvYmosIHBvaW50KSB7CgkJdGhpcy5yZW1vdmVPYmplY3Qob2JqKTsKCQl0aGlzLmFkZE9iamVjdChvYmosIHBvaW50KTsKCX0sCgoJLy9SZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgZm91bmQKCXJlbW92ZU9iamVjdDogZnVuY3Rpb24gKG9iaiwgcG9pbnQpIHsKCQl2YXIgeCA9IHRoaXMuX2dldENvb3JkKHBvaW50LngpLAoJCSAgICB5ID0gdGhpcy5fZ2V0Q29vcmQocG9pbnQueSksCgkJICAgIGdyaWQgPSB0aGlzLl9ncmlkLAoJCSAgICByb3cgPSBncmlkW3ldID0gZ3JpZFt5XSB8fCB7fSwKCQkgICAgY2VsbCA9IHJvd1t4XSA9IHJvd1t4XSB8fCBbXSwKCQkgICAgaSwgbGVuOwoKCQlkZWxldGUgdGhpcy5fb2JqZWN0UG9pbnRbTC5VdGlsLnN0YW1wKG9iaildOwoKCQlmb3IgKGkgPSAwLCBsZW4gPSBjZWxsLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CgkJCWlmIChjZWxsW2ldID09PSBvYmopIHsKCgkJCQljZWxsLnNwbGljZShpLCAxKTsKCgkJCQlpZiAobGVuID09PSAxKSB7CgkJCQkJZGVsZXRlIHJvd1t4XTsKCQkJCX0KCgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgl9LAoKCWVhY2hPYmplY3Q6IGZ1bmN0aW9uIChmbiwgY29udGV4dCkgewoJCXZhciBpLCBqLCBrLCBsZW4sIHJvdywgY2VsbCwgcmVtb3ZlZCwKCQkgICAgZ3JpZCA9IHRoaXMuX2dyaWQ7CgoJCWZvciAoaSBpbiBncmlkKSB7CgkJCXJvdyA9IGdyaWRbaV07CgoJCQlmb3IgKGogaW4gcm93KSB7CgkJCQljZWxsID0gcm93W2pdOwoKCQkJCWZvciAoayA9IDAsIGxlbiA9IGNlbGwubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHsKCQkJCQlyZW1vdmVkID0gZm4uY2FsbChjb250ZXh0LCBjZWxsW2tdKTsKCQkJCQlpZiAocmVtb3ZlZCkgewoJCQkJCQlrLS07CgkJCQkJCWxlbi0tOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0sCgoJZ2V0TmVhck9iamVjdDogZnVuY3Rpb24gKHBvaW50KSB7CgkJdmFyIHggPSB0aGlzLl9nZXRDb29yZChwb2ludC54KSwKCQkgICAgeSA9IHRoaXMuX2dldENvb3JkKHBvaW50LnkpLAoJCSAgICBpLCBqLCBrLCByb3csIGNlbGwsIGxlbiwgb2JqLCBkaXN0LAoJCSAgICBvYmplY3RQb2ludCA9IHRoaXMuX29iamVjdFBvaW50LAoJCSAgICBjbG9zZXN0RGlzdFNxID0gdGhpcy5fc3FDZWxsU2l6ZSwKCQkgICAgY2xvc2VzdCA9IG51bGw7CgoJCWZvciAoaSA9IHkgLSAxOyBpIDw9IHkgKyAxOyBpKyspIHsKCQkJcm93ID0gdGhpcy5fZ3JpZFtpXTsKCQkJaWYgKHJvdykgewoKCQkJCWZvciAoaiA9IHggLSAxOyBqIDw9IHggKyAxOyBqKyspIHsKCQkJCQljZWxsID0gcm93W2pdOwoJCQkJCWlmIChjZWxsKSB7CgoJCQkJCQlmb3IgKGsgPSAwLCBsZW4gPSBjZWxsLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7CgkJCQkJCQlvYmogPSBjZWxsW2tdOwoJCQkJCQkJZGlzdCA9IHRoaXMuX3NxRGlzdChvYmplY3RQb2ludFtMLlV0aWwuc3RhbXAob2JqKV0sIHBvaW50KTsKCQkJCQkJCWlmIChkaXN0IDwgY2xvc2VzdERpc3RTcSkgewoJCQkJCQkJCWNsb3Nlc3REaXN0U3EgPSBkaXN0OwoJCQkJCQkJCWNsb3Nlc3QgPSBvYmo7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgkJcmV0dXJuIGNsb3Nlc3Q7Cgl9LAoKCV9nZXRDb29yZDogZnVuY3Rpb24gKHgpIHsKCQlyZXR1cm4gTWF0aC5mbG9vcih4IC8gdGhpcy5fY2VsbFNpemUpOwoJfSwKCglfc3FEaXN0OiBmdW5jdGlvbiAocCwgcDIpIHsKCQl2YXIgZHggPSBwMi54IC0gcC54LAoJCSAgICBkeSA9IHAyLnkgLSBwLnk7CgkJcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwoJfQp9OwoKCi8qIENvcHlyaWdodCAoYykgMjAxMiB0aGUgYXV0aG9ycyBsaXN0ZWQgYXQgdGhlIGZvbGxvd2luZyBVUkwsIGFuZC9vcgp0aGUgYXV0aG9ycyBvZiByZWZlcmVuY2VkIGFydGljbGVzIG9yIGluY29ycG9yYXRlZCBleHRlcm5hbCBjb2RlOgpodHRwOi8vZW4ubGl0ZXJhdGVwcm9ncmFtcy5vcmcvUXVpY2todWxsXyhKYXZhc2NyaXB0KT9hY3Rpb249aGlzdG9yeSZvZmZzZXQ9MjAxMjA0MTAxNzUyNTYKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwphIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwp3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwpwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgpSZXRyaWV2ZWQgZnJvbTogaHR0cDovL2VuLmxpdGVyYXRlcHJvZ3JhbXMub3JnL1F1aWNraHVsbF8oSmF2YXNjcmlwdCk/b2xkaWQ9MTg0MzQKKi8KCihmdW5jdGlvbiAoKSB7CglMLlF1aWNrSHVsbCA9IHsKCgkJLyoKCQkgKiBAcGFyYW0ge09iamVjdH0gY3B0IGEgcG9pbnQgdG8gYmUgbWVhc3VyZWQgZnJvbSB0aGUgYmFzZWxpbmUKCQkgKiBAcGFyYW0ge0FycmF5fSBibCB0aGUgYmFzZWxpbmUsIGFzIHJlcHJlc2VudGVkIGJ5IGEgdHdvLWVsZW1lbnQKCQkgKiAgIGFycmF5IG9mIGxhdGxuZyBvYmplY3RzLgoJCSAqIEByZXR1cm5zIHtOdW1iZXJ9IGFuIGFwcHJveGltYXRlIGRpc3RhbmNlIG1lYXN1cmUKCQkgKi8KCQlnZXREaXN0YW50OiBmdW5jdGlvbiAoY3B0LCBibCkgewoJCQl2YXIgdlkgPSBibFsxXS5sYXQgLSBibFswXS5sYXQsCgkJCQl2WCA9IGJsWzBdLmxuZyAtIGJsWzFdLmxuZzsKCQkJcmV0dXJuICh2WCAqIChjcHQubGF0IC0gYmxbMF0ubGF0KSArIHZZICogKGNwdC5sbmcgLSBibFswXS5sbmcpKTsKCQl9LAoKCQkvKgoJCSAqIEBwYXJhbSB7QXJyYXl9IGJhc2VMaW5lIGEgdHdvLWVsZW1lbnQgYXJyYXkgb2YgbGF0bG5nIG9iamVjdHMKCQkgKiAgIHJlcHJlc2VudGluZyB0aGUgYmFzZWxpbmUgdG8gcHJvamVjdCBmcm9tCgkJICogQHBhcmFtIHtBcnJheX0gbGF0TG5ncyBhbiBhcnJheSBvZiBsYXRsbmcgb2JqZWN0cwoJCSAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBtYXhpbXVtIHBvaW50IGFuZCBhbGwgbmV3IHBvaW50cyB0byBzdGF5CgkJICogICBpbiBjb25zaWRlcmF0aW9uIGZvciB0aGUgaHVsbC4KCQkgKi8KCQlmaW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZTogZnVuY3Rpb24gKGJhc2VMaW5lLCBsYXRMbmdzKSB7CgkJCXZhciBtYXhEID0gMCwKCQkJCW1heFB0ID0gbnVsbCwKCQkJCW5ld1BvaW50cyA9IFtdLAoJCQkJaSwgcHQsIGQ7CgoJCQlmb3IgKGkgPSBsYXRMbmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQlwdCA9IGxhdExuZ3NbaV07CgkJCQlkID0gdGhpcy5nZXREaXN0YW50KHB0LCBiYXNlTGluZSk7CgoJCQkJaWYgKGQgPiAwKSB7CgkJCQkJbmV3UG9pbnRzLnB1c2gocHQpOwoJCQkJfSBlbHNlIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQlpZiAoZCA+IG1heEQpIHsKCQkJCQltYXhEID0gZDsKCQkJCQltYXhQdCA9IHB0OwoJCQkJfQoJCQl9CgoJCQlyZXR1cm4geyBtYXhQb2ludDogbWF4UHQsIG5ld1BvaW50czogbmV3UG9pbnRzIH07CgkJfSwKCgoJCS8qCgkJICogR2l2ZW4gYSBiYXNlbGluZSwgY29tcHV0ZSB0aGUgY29udmV4IGh1bGwgb2YgbGF0TG5ncyBhcyBhbiBhcnJheQoJCSAqIG9mIGxhdExuZ3MuCgkJICoKCQkgKiBAcGFyYW0ge0FycmF5fSBsYXRMbmdzCgkJICogQHJldHVybnMge0FycmF5fQoJCSAqLwoJCWJ1aWxkQ29udmV4SHVsbDogZnVuY3Rpb24gKGJhc2VMaW5lLCBsYXRMbmdzKSB7CgkJCXZhciBjb252ZXhIdWxsQmFzZUxpbmVzID0gW10sCgkJCQl0ID0gdGhpcy5maW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZShiYXNlTGluZSwgbGF0TG5ncyk7CgoJCQlpZiAodC5tYXhQb2ludCkgeyAvLyBpZiB0aGVyZSBpcyBzdGlsbCBhIHBvaW50ICJvdXRzaWRlIiB0aGUgYmFzZSBsaW5lCgkJCQljb252ZXhIdWxsQmFzZUxpbmVzID0KCQkJCQljb252ZXhIdWxsQmFzZUxpbmVzLmNvbmNhdCgKCQkJCQkJdGhpcy5idWlsZENvbnZleEh1bGwoW2Jhc2VMaW5lWzBdLCB0Lm1heFBvaW50XSwgdC5uZXdQb2ludHMpCgkJCQkJKTsKCQkJCWNvbnZleEh1bGxCYXNlTGluZXMgPQoJCQkJCWNvbnZleEh1bGxCYXNlTGluZXMuY29uY2F0KAoJCQkJCQl0aGlzLmJ1aWxkQ29udmV4SHVsbChbdC5tYXhQb2ludCwgYmFzZUxpbmVbMV1dLCB0Lm5ld1BvaW50cykKCQkJCQkpOwoJCQkJcmV0dXJuIGNvbnZleEh1bGxCYXNlTGluZXM7CgkJCX0gZWxzZSB7ICAvLyBpZiB0aGVyZSBpcyBubyBtb3JlIHBvaW50ICJvdXRzaWRlIiB0aGUgYmFzZSBsaW5lLCB0aGUgY3VycmVudCBiYXNlIGxpbmUgaXMgcGFydCBvZiB0aGUgY29udmV4IGh1bGwKCQkJCXJldHVybiBbYmFzZUxpbmVbMF1dOwoJCQl9CgkJfSwKCgkJLyoKCQkgKiBHaXZlbiBhbiBhcnJheSBvZiBsYXRsbmdzLCBjb21wdXRlIGEgY29udmV4IGh1bGwgYXMgYW4gYXJyYXkKCQkgKiBvZiBsYXRsbmdzCgkJICoKCQkgKiBAcGFyYW0ge0FycmF5fSBsYXRMbmdzCgkJICogQHJldHVybnMge0FycmF5fQoJCSAqLwoJCWdldENvbnZleEh1bGw6IGZ1bmN0aW9uIChsYXRMbmdzKSB7CgkJCS8vIGZpbmQgZmlyc3QgYmFzZWxpbmUKCQkJdmFyIG1heExhdCA9IGZhbHNlLCBtaW5MYXQgPSBmYWxzZSwKCQkJCW1heFB0ID0gbnVsbCwgbWluUHQgPSBudWxsLAoJCQkJaTsKCgkJCWZvciAoaSA9IGxhdExuZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCXZhciBwdCA9IGxhdExuZ3NbaV07CgkJCQlpZiAobWF4TGF0ID09PSBmYWxzZSB8fCBwdC5sYXQgPiBtYXhMYXQpIHsKCQkJCQltYXhQdCA9IHB0OwoJCQkJCW1heExhdCA9IHB0LmxhdDsKCQkJCX0KCQkJCWlmIChtaW5MYXQgPT09IGZhbHNlIHx8IHB0LmxhdCA8IG1pbkxhdCkgewoJCQkJCW1pblB0ID0gcHQ7CgkJCQkJbWluTGF0ID0gcHQubGF0OwoJCQkJfQoJCQl9CgkJCXZhciBjaCA9IFtdLmNvbmNhdCh0aGlzLmJ1aWxkQ29udmV4SHVsbChbbWluUHQsIG1heFB0XSwgbGF0TG5ncyksCgkJCQkJCQkJdGhpcy5idWlsZENvbnZleEh1bGwoW21heFB0LCBtaW5QdF0sIGxhdExuZ3MpKTsKCQkJcmV0dXJuIGNoOwoJCX0KCX07Cn0oKSk7CgpMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7CglnZXRDb252ZXhIdWxsOiBmdW5jdGlvbiAoKSB7CgkJdmFyIGNoaWxkTWFya2VycyA9IHRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksCgkJCXBvaW50cyA9IFtdLAoJCQlwLCBpOwoKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJcCA9IGNoaWxkTWFya2Vyc1tpXS5nZXRMYXRMbmcoKTsKCQkJcG9pbnRzLnB1c2gocCk7CgkJfQoKCQlyZXR1cm4gTC5RdWlja0h1bGwuZ2V0Q29udmV4SHVsbChwb2ludHMpOwoJfQp9KTsKCgovL1RoaXMgY29kZSBpcyAxMDAlIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXdqL092ZXJsYXBwaW5nTWFya2VyU3BpZGVyZmllci1MZWFmbGV0Ci8vSHVnZSB0aGFua3MgdG8gamF3aiBmb3IgaW1wbGVtZW50aW5nIGl0IGZpcnN0IHRvIG1ha2UgbXkgam9iIGVhc3kgOi0pCgpMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7CgoJXzJQSTogTWF0aC5QSSAqIDIsCglfY2lyY2xlRm9vdFNlcGFyYXRpb246IDI1LCAvL3JlbGF0ZWQgdG8gY2lyY3VtZmVyZW5jZSBvZiBjaXJjbGUKCV9jaXJjbGVTdGFydEFuZ2xlOiBNYXRoLlBJIC8gNiwKCglfc3BpcmFsRm9vdFNlcGFyYXRpb246ICAyOCwgLy9yZWxhdGVkIHRvIHNpemUgb2Ygc3BpcmFsIChleHBlcmltZW50ISkKCV9zcGlyYWxMZW5ndGhTdGFydDogMTEsCglfc3BpcmFsTGVuZ3RoRmFjdG9yOiA1LAoKCV9jaXJjbGVTcGlyYWxTd2l0Y2hvdmVyOiA5LCAvL3Nob3cgc3BpcmFsIGluc3RlYWQgb2YgY2lyY2xlIGZyb20gdGhpcyBtYXJrZXIgY291bnQgdXB3YXJkcy4KCQkJCQkJCQkvLyAwIC0+IGFsd2F5cyBzcGlyYWw7IEluZmluaXR5IC0+IGFsd2F5cyBjaXJjbGUKCglzcGlkZXJmeTogZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9ncm91cC5fc3BpZGVyZmllZCA9PT0gdGhpcyB8fCB0aGlzLl9ncm91cC5faW5ab29tQW5pbWF0aW9uKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBjaGlsZE1hcmtlcnMgPSB0aGlzLmdldEFsbENoaWxkTWFya2VycygpLAoJCQlncm91cCA9IHRoaXMuX2dyb3VwLAoJCQltYXAgPSBncm91cC5fbWFwLAoJCQljZW50ZXIgPSBtYXAubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyksCgkJCXBvc2l0aW9uczsKCgkJdGhpcy5fZ3JvdXAuX3Vuc3BpZGVyZnkoKTsKCQl0aGlzLl9ncm91cC5fc3BpZGVyZmllZCA9IHRoaXM7CgoJCS8vVE9ETyBNYXliZTogY2hpbGRNYXJrZXJzIG9yZGVyIGJ5IGRpc3RhbmNlIHRvIGNlbnRlcgoKCQlpZiAoY2hpbGRNYXJrZXJzLmxlbmd0aCA+PSB0aGlzLl9jaXJjbGVTcGlyYWxTd2l0Y2hvdmVyKSB7CgkJCXBvc2l0aW9ucyA9IHRoaXMuX2dlbmVyYXRlUG9pbnRzU3BpcmFsKGNoaWxkTWFya2Vycy5sZW5ndGgsIGNlbnRlcik7CgkJfSBlbHNlIHsKCQkJY2VudGVyLnkgKz0gMTA7IC8vT3RoZXJ3aXNlIGNpcmNsZXMgbG9vayB3cm9uZwoJCQlwb3NpdGlvbnMgPSB0aGlzLl9nZW5lcmF0ZVBvaW50c0NpcmNsZShjaGlsZE1hcmtlcnMubGVuZ3RoLCBjZW50ZXIpOwoJCX0KCgkJdGhpcy5fYW5pbWF0aW9uU3BpZGVyZnkoY2hpbGRNYXJrZXJzLCBwb3NpdGlvbnMpOwoJfSwKCgl1bnNwaWRlcmZ5OiBmdW5jdGlvbiAoem9vbURldGFpbHMpIHsKCQkvLy8gPHBhcmFtIE5hbWU9Inpvb21EZXRhaWxzIj5Bcmd1bWVudCBmcm9tIHpvb21hbmltIGlmIGJlaW5nIGNhbGxlZCBpbiBhIHpvb20gYW5pbWF0aW9uIG9yIG51bGwgb3RoZXJ3aXNlPC9wYXJhbT4KCQlpZiAodGhpcy5fZ3JvdXAuX2luWm9vbUFuaW1hdGlvbikgewoJCQlyZXR1cm47CgkJfQoJCXRoaXMuX2FuaW1hdGlvblVuc3BpZGVyZnkoem9vbURldGFpbHMpOwoKCQl0aGlzLl9ncm91cC5fc3BpZGVyZmllZCA9IG51bGw7Cgl9LAoKCV9nZW5lcmF0ZVBvaW50c0NpcmNsZTogZnVuY3Rpb24gKGNvdW50LCBjZW50ZXJQdCkgewoJCXZhciBjaXJjdW1mZXJlbmNlID0gdGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllciAqIHRoaXMuX2NpcmNsZUZvb3RTZXBhcmF0aW9uICogKDIgKyBjb3VudCksCgkJCWxlZ0xlbmd0aCA9IGNpcmN1bWZlcmVuY2UgLyB0aGlzLl8yUEksICAvL3JhZGl1cyBmcm9tIGNpcmN1bWZlcmVuY2UKCQkJYW5nbGVTdGVwID0gdGhpcy5fMlBJIC8gY291bnQsCgkJCXJlcyA9IFtdLAoJCQlpLCBhbmdsZTsKCgkJcmVzLmxlbmd0aCA9IGNvdW50OwoKCQlmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCWFuZ2xlID0gdGhpcy5fY2lyY2xlU3RhcnRBbmdsZSArIGkgKiBhbmdsZVN0ZXA7CgkJCXJlc1tpXSA9IG5ldyBMLlBvaW50KGNlbnRlclB0LnggKyBsZWdMZW5ndGggKiBNYXRoLmNvcyhhbmdsZSksIGNlbnRlclB0LnkgKyBsZWdMZW5ndGggKiBNYXRoLnNpbihhbmdsZSkpLl9yb3VuZCgpOwoJCX0KCgkJcmV0dXJuIHJlczsKCX0sCgoJX2dlbmVyYXRlUG9pbnRzU3BpcmFsOiBmdW5jdGlvbiAoY291bnQsIGNlbnRlclB0KSB7CgkJdmFyIGxlZ0xlbmd0aCA9IHRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIgKiB0aGlzLl9zcGlyYWxMZW5ndGhTdGFydCwKCQkJc2VwYXJhdGlvbiA9IHRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIgKiB0aGlzLl9zcGlyYWxGb290U2VwYXJhdGlvbiwKCQkJbGVuZ3RoRmFjdG9yID0gdGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllciAqIHRoaXMuX3NwaXJhbExlbmd0aEZhY3RvciwKCQkJYW5nbGUgPSAwLAoJCQlyZXMgPSBbXSwKCQkJaTsKCgkJcmVzLmxlbmd0aCA9IGNvdW50OwoKCQlmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCWFuZ2xlICs9IHNlcGFyYXRpb24gLyBsZWdMZW5ndGggKyBpICogMC4wMDA1OwoJCQlyZXNbaV0gPSBuZXcgTC5Qb2ludChjZW50ZXJQdC54ICsgbGVnTGVuZ3RoICogTWF0aC5jb3MoYW5nbGUpLCBjZW50ZXJQdC55ICsgbGVnTGVuZ3RoICogTWF0aC5zaW4oYW5nbGUpKS5fcm91bmQoKTsKCQkJbGVnTGVuZ3RoICs9IHRoaXMuXzJQSSAqIGxlbmd0aEZhY3RvciAvIGFuZ2xlOwoJCX0KCQlyZXR1cm4gcmVzOwoJfSwKCglfbm9hbmltYXRpb25VbnNwaWRlcmZ5OiBmdW5jdGlvbiAoKSB7CgkJdmFyIGdyb3VwID0gdGhpcy5fZ3JvdXAsCgkJCW1hcCA9IGdyb3VwLl9tYXAsCgkJCWZnID0gZ3JvdXAuX2ZlYXR1cmVHcm91cCwKCQkJY2hpbGRNYXJrZXJzID0gdGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSwKCQkJbSwgaTsKCgkJdGhpcy5zZXRPcGFjaXR5KDEpOwoJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQltID0gY2hpbGRNYXJrZXJzW2ldOwoKCQkJZmcucmVtb3ZlTGF5ZXIobSk7CgoJCQlpZiAobS5fcHJlU3BpZGVyZnlMYXRsbmcpIHsKCQkJCW0uc2V0TGF0TG5nKG0uX3ByZVNwaWRlcmZ5TGF0bG5nKTsKCQkJCWRlbGV0ZSBtLl9wcmVTcGlkZXJmeUxhdGxuZzsKCQkJfQoJCQlpZiAobS5zZXRaSW5kZXhPZmZzZXQpIHsKCQkJCW0uc2V0WkluZGV4T2Zmc2V0KDApOwoJCQl9CgoJCQlpZiAobS5fc3BpZGVyTGVnKSB7CgkJCQltYXAucmVtb3ZlTGF5ZXIobS5fc3BpZGVyTGVnKTsKCQkJCWRlbGV0ZSBtLl9zcGlkZXJMZWc7CgkJCX0KCQl9CgoJCWdyb3VwLl9zcGlkZXJmaWVkID0gbnVsbDsKCX0KfSk7CgpMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSghTC5Eb21VdGlsLlRSQU5TSVRJT04gPyB7CgkvL05vbiBBbmltYXRlZCB2ZXJzaW9ucyBvZiBldmVyeXRoaW5nCglfYW5pbWF0aW9uU3BpZGVyZnk6IGZ1bmN0aW9uIChjaGlsZE1hcmtlcnMsIHBvc2l0aW9ucykgewoJCXZhciBncm91cCA9IHRoaXMuX2dyb3VwLAoJCQltYXAgPSBncm91cC5fbWFwLAoJCQlmZyA9IGdyb3VwLl9mZWF0dXJlR3JvdXAsCgkJCWksIG0sIGxlZywgbmV3UG9zOwoKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJbmV3UG9zID0gbWFwLmxheWVyUG9pbnRUb0xhdExuZyhwb3NpdGlvbnNbaV0pOwoJCQltID0gY2hpbGRNYXJrZXJzW2ldOwoKCQkJbS5fcHJlU3BpZGVyZnlMYXRsbmcgPSBtLl9sYXRsbmc7CgkJCW0uc2V0TGF0TG5nKG5ld1Bvcyk7CgkJCWlmIChtLnNldFpJbmRleE9mZnNldCkgewoJCQkJbS5zZXRaSW5kZXhPZmZzZXQoMTAwMDAwMCk7IC8vTWFrZSB0aGVzZSBhcHBlYXIgb24gdG9wIG9mIEVWRVJZVEhJTkcKCQkJfQoKCQkJZmcuYWRkTGF5ZXIobSk7CgoKCQkJbGVnID0gbmV3IEwuUG9seWxpbmUoW3RoaXMuX2xhdGxuZywgbmV3UG9zXSwgeyB3ZWlnaHQ6IDEuNSwgY29sb3I6ICcjMjIyJyB9KTsKCQkJbWFwLmFkZExheWVyKGxlZyk7CgkJCW0uX3NwaWRlckxlZyA9IGxlZzsKCQl9CgkJdGhpcy5zZXRPcGFjaXR5KDAuMyk7CgkJZ3JvdXAuZmlyZSgnc3BpZGVyZmllZCcpOwoJfSwKCglfYW5pbWF0aW9uVW5zcGlkZXJmeTogZnVuY3Rpb24gKCkgewoJCXRoaXMuX25vYW5pbWF0aW9uVW5zcGlkZXJmeSgpOwoJfQp9IDogewoJLy9BbmltYXRlZCB2ZXJzaW9ucyBoZXJlCglTVkdfQU5JTUFUSU9OOiAoZnVuY3Rpb24gKCkgewoJCXJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2FuaW1hdGUnKS50b1N0cmluZygpLmluZGV4T2YoJ1NWR0FuaW1hdGUnKSA+IC0xOwoJfSgpKSwKCglfYW5pbWF0aW9uU3BpZGVyZnk6IGZ1bmN0aW9uIChjaGlsZE1hcmtlcnMsIHBvc2l0aW9ucykgewoJCXZhciBtZSA9IHRoaXMsCgkJCWdyb3VwID0gdGhpcy5fZ3JvdXAsCgkJCW1hcCA9IGdyb3VwLl9tYXAsCgkJCWZnID0gZ3JvdXAuX2ZlYXR1cmVHcm91cCwKCQkJdGhpc0xheWVyUG9zID0gbWFwLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpLAoJCQlpLCBtLCBsZWcsIG5ld1BvczsKCgkJLy9BZGQgbWFya2VycyB0byBtYXAgaGlkZGVuIGF0IG91ciBjZW50ZXIgcG9pbnQKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJbSA9IGNoaWxkTWFya2Vyc1tpXTsKCgkJCS8vSWYgaXQgaXMgYSBtYXJrZXIsIGFkZCBpdCBub3cgYW5kIHdlJ2xsIGFuaW1hdGUgaXQgb3V0CgkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCW0uc2V0WkluZGV4T2Zmc2V0KDEwMDAwMDApOyAvL01ha2UgdGhlc2UgYXBwZWFyIG9uIHRvcCBvZiBFVkVSWVRISU5HCgkJCQltLnNldE9wYWNpdHkoMCk7CgkJCQoJCQkJZmcuYWRkTGF5ZXIobSk7CgoJCQkJbS5fc2V0UG9zKHRoaXNMYXllclBvcyk7CgkJCX0gZWxzZSB7CgkJCQkvL1ZlY3RvcnMganVzdCBnZXQgaW1tZWRpYXRlbHkgYWRkZWQKCQkJCWZnLmFkZExheWVyKG0pOwoJCQl9CgkJfQoKCQlncm91cC5fZm9yY2VMYXlvdXQoKTsKCQlncm91cC5fYW5pbWF0aW9uU3RhcnQoKTsKCgkJdmFyIGluaXRpYWxMZWdPcGFjaXR5ID0gTC5QYXRoLlNWRyA/IDAgOiAwLjMsCgkJCXhtbG5zID0gTC5QYXRoLlNWR19OUzsKCgoJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQluZXdQb3MgPSBtYXAubGF5ZXJQb2ludFRvTGF0TG5nKHBvc2l0aW9uc1tpXSk7CgkJCW0gPSBjaGlsZE1hcmtlcnNbaV07CgoJCQkvL01vdmUgbWFya2VyIHRvIG5ldyBwb3NpdGlvbgoJCQltLl9wcmVTcGlkZXJmeUxhdGxuZyA9IG0uX2xhdGxuZzsKCQkJbS5zZXRMYXRMbmcobmV3UG9zKTsKCQkJCgkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCW0uc2V0T3BhY2l0eSgxKTsKCQkJfQoKCgkJCS8vQWRkIExlZ3MuCgkJCWxlZyA9IG5ldyBMLlBvbHlsaW5lKFttZS5fbGF0bG5nLCBuZXdQb3NdLCB7IHdlaWdodDogMS41LCBjb2xvcjogJyMyMjInLCBvcGFjaXR5OiBpbml0aWFsTGVnT3BhY2l0eSB9KTsKCQkJbWFwLmFkZExheWVyKGxlZyk7CgkJCW0uX3NwaWRlckxlZyA9IGxlZzsKCgkJCS8vRm9sbG93aW5nIGFuaW1hdGlvbnMgZG9uJ3Qgd29yayBmb3IgY2FudmFzCgkJCWlmICghTC5QYXRoLlNWRyB8fCAhdGhpcy5TVkdfQU5JTUFUSU9OKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy9Ib3cgdGhpcyB3b3JrczoKCQkJLy9odHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU5MjQyMzgvaG93LWRvLXlvdS1hbmltYXRlLWFuLXN2Zy1wYXRoLWluLWlvcwoJCQkvL2h0dHA6Ly9kZXYub3BlcmEuY29tL2FydGljbGVzL3ZpZXcvYWR2YW5jZWQtc3ZnLWFuaW1hdGlvbi10ZWNobmlxdWVzLwoKCQkJLy9BbmltYXRlIGxlbmd0aAoJCQl2YXIgbGVuZ3RoID0gbGVnLl9wYXRoLmdldFRvdGFsTGVuZ3RoKCk7CgkJCWxlZy5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLCBsZW5ndGggKyAiLCIgKyBsZW5ndGgpOwoKCQkJdmFyIGFuaW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoeG1sbnMsICJhbmltYXRlIik7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJhdHRyaWJ1dGVOYW1lIiwgInN0cm9rZS1kYXNob2Zmc2V0Iik7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJiZWdpbiIsICJpbmRlZmluaXRlIik7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJmcm9tIiwgbGVuZ3RoKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoInRvIiwgMCk7CgkJCWFuaW0uc2V0QXR0cmlidXRlKCJkdXIiLCAwLjI1KTsKCQkJbGVnLl9wYXRoLmFwcGVuZENoaWxkKGFuaW0pOwoJCQlhbmltLmJlZ2luRWxlbWVudCgpOwoKCQkJLy9BbmltYXRlIG9wYWNpdHkKCQkJYW5pbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh4bWxucywgImFuaW1hdGUiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZU5hbWUiLCAic3Ryb2tlLW9wYWNpdHkiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZU5hbWUiLCAic3Ryb2tlLW9wYWNpdHkiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImJlZ2luIiwgImluZGVmaW5pdGUiKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImZyb20iLCAwKTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoInRvIiwgMC41KTsKCQkJYW5pbS5zZXRBdHRyaWJ1dGUoImR1ciIsIDAuMjUpOwoJCQlsZWcuX3BhdGguYXBwZW5kQ2hpbGQoYW5pbSk7CgkJCWFuaW0uYmVnaW5FbGVtZW50KCk7CgkJfQoJCW1lLnNldE9wYWNpdHkoMC4zKTsKCgkJLy9TZXQgdGhlIG9wYWNpdHkgb2YgdGhlIHNwaWRlckxlZ3MgYmFjayB0byB0aGVpciBjb3JyZWN0IHZhbHVlCgkJLy8gVGhlIGFuaW1hdGlvbnMgYWJvdmUgb3ZlcnJpZGUgdGhpcyB1bnRpbCB0aGV5IGNvbXBsZXRlLgoJCS8vIElmIHRoZSBpbml0aWFsIG9wYWNpdHkgb2YgdGhlIHNwaWRlcmxlZ3MgaXNuJ3QgMCB0aGVuIHRoZXkgYXBwZWFyIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHN0YXJ0cy4KCQlpZiAoTC5QYXRoLlNWRykgewoJCQl0aGlzLl9ncm91cC5fZm9yY2VMYXlvdXQoKTsKCgkJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJbSA9IGNoaWxkTWFya2Vyc1tpXS5fc3BpZGVyTGVnOwoKCQkJCW0ub3B0aW9ucy5vcGFjaXR5ID0gMC41OwoJCQkJbS5fcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgMC41KTsKCQkJfQoJCX0KCgkJc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CgkJCWdyb3VwLl9hbmltYXRpb25FbmQoKTsKCQkJZ3JvdXAuZmlyZSgnc3BpZGVyZmllZCcpOwoJCX0sIDIwMCk7Cgl9LAoKCV9hbmltYXRpb25VbnNwaWRlcmZ5OiBmdW5jdGlvbiAoem9vbURldGFpbHMpIHsKCQl2YXIgZ3JvdXAgPSB0aGlzLl9ncm91cCwKCQkJbWFwID0gZ3JvdXAuX21hcCwKCQkJZmcgPSBncm91cC5fZmVhdHVyZUdyb3VwLAoJCQl0aGlzTGF5ZXJQb3MgPSB6b29tRGV0YWlscyA/IG1hcC5fbGF0TG5nVG9OZXdMYXllclBvaW50KHRoaXMuX2xhdGxuZywgem9vbURldGFpbHMuem9vbSwgem9vbURldGFpbHMuY2VudGVyKSA6IG1hcC5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSwKCQkJY2hpbGRNYXJrZXJzID0gdGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSwKCQkJc3ZnID0gTC5QYXRoLlNWRyAmJiB0aGlzLlNWR19BTklNQVRJT04sCgkJCW0sIGksIGE7CgoJCWdyb3VwLl9hbmltYXRpb25TdGFydCgpOwoKCQkvL01ha2UgdXMgdmlzaWJsZSBhbmQgYnJpbmcgdGhlIGNoaWxkIG1hcmtlcnMgYmFjayBpbgoJCXRoaXMuc2V0T3BhY2l0eSgxKTsKCQlmb3IgKGkgPSBjaGlsZE1hcmtlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJbSA9IGNoaWxkTWFya2Vyc1tpXTsKCgkJCS8vTWFya2VyIHdhcyBhZGRlZCB0byB1cyBhZnRlciB3ZSB3ZXJlIHNwaWRpZmllZAoJCQlpZiAoIW0uX3ByZVNwaWRlcmZ5TGF0bG5nKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy9GaXggdXAgdGhlIGxvY2F0aW9uIHRvIHRoZSByZWFsIG9uZQoJCQltLnNldExhdExuZyhtLl9wcmVTcGlkZXJmeUxhdGxuZyk7CgkJCWRlbGV0ZSBtLl9wcmVTcGlkZXJmeUxhdGxuZzsKCQkJLy9IYWNrIG92ZXJyaWRlIHRoZSBsb2NhdGlvbiB0byBiZSBvdXIgY2VudGVyCgkJCWlmIChtLnNldE9wYWNpdHkpIHsKCQkJCW0uX3NldFBvcyh0aGlzTGF5ZXJQb3MpOwoJCQkJbS5zZXRPcGFjaXR5KDApOwoJCQl9IGVsc2UgewoJCQkJZmcucmVtb3ZlTGF5ZXIobSk7CgkJCX0KCgkJCS8vQW5pbWF0ZSB0aGUgc3BpZGVyIGxlZ3MgYmFjayBpbgoJCQlpZiAoc3ZnKSB7CgkJCQlhID0gbS5fc3BpZGVyTGVnLl9wYXRoLmNoaWxkTm9kZXNbMF07CgkJCQlhLnNldEF0dHJpYnV0ZSgndG8nLCBhLmdldEF0dHJpYnV0ZSgnZnJvbScpKTsKCQkJCWEuc2V0QXR0cmlidXRlKCdmcm9tJywgMCk7CgkJCQlhLmJlZ2luRWxlbWVudCgpOwoKCQkJCWEgPSBtLl9zcGlkZXJMZWcuX3BhdGguY2hpbGROb2Rlc1sxXTsKCQkJCWEuc2V0QXR0cmlidXRlKCdmcm9tJywgMC41KTsKCQkJCWEuc2V0QXR0cmlidXRlKCd0bycsIDApOwoJCQkJYS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgMCk7CgkJCQlhLmJlZ2luRWxlbWVudCgpOwoKCQkJCW0uX3NwaWRlckxlZy5fcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5JywgMCk7CgkJCX0KCQl9CgoJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewoJCQkvL0lmIHdlIGhhdmUgb25seSA8PSBvbmUgY2hpbGQgbGVmdCB0aGVuIHRoYXQgbWFya2VyIHdpbGwgYmUgc2hvd24gb24gdGhlIG1hcCBzbyBkb24ndCByZW1vdmUgaXQhCgkJCXZhciBzdGlsbFRoZXJlQ2hpbGRDb3VudCA9IDA7CgkJCWZvciAoaSA9IGNoaWxkTWFya2Vycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJbSA9IGNoaWxkTWFya2Vyc1tpXTsKCQkJCWlmIChtLl9zcGlkZXJMZWcpIHsKCQkJCQlzdGlsbFRoZXJlQ2hpbGRDb3VudCsrOwoJCQkJfQoJCQl9CgoKCQkJZm9yIChpID0gY2hpbGRNYXJrZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQltID0gY2hpbGRNYXJrZXJzW2ldOwoKCQkJCWlmICghbS5fc3BpZGVyTGVnKSB7IC8vSGFzIGFscmVhZHkgYmVlbiB1bnNwaWRlcmZpZWQKCQkJCQljb250aW51ZTsKCQkJCX0KCgoJCQkJaWYgKG0uc2V0T3BhY2l0eSkgewoJCQkJCW0uc2V0T3BhY2l0eSgxKTsKCQkJCQltLnNldFpJbmRleE9mZnNldCgwKTsKCQkJCX0KCgkJCQlpZiAoc3RpbGxUaGVyZUNoaWxkQ291bnQgPiAxKSB7CgkJCQkJZmcucmVtb3ZlTGF5ZXIobSk7CgkJCQl9CgoJCQkJbWFwLnJlbW92ZUxheWVyKG0uX3NwaWRlckxlZyk7CgkJCQlkZWxldGUgbS5fc3BpZGVyTGVnOwoJCQl9CgkJCWdyb3VwLl9hbmltYXRpb25FbmQoKTsKCQl9LCAyMDApOwoJfQp9KTsKCgpMLk1hcmtlckNsdXN0ZXJHcm91cC5pbmNsdWRlKHsKCS8vVGhlIE1hcmtlckNsdXN0ZXIgY3VycmVudGx5IHNwaWRlcmZpZWQgKGlmIGFueSkKCV9zcGlkZXJmaWVkOiBudWxsLAoKCV9zcGlkZXJmaWVyT25BZGQ6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9tYXAub24oJ2NsaWNrJywgdGhpcy5fdW5zcGlkZXJmeVdyYXBwZXIsIHRoaXMpOwoKCQlpZiAodGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbikgewoJCQl0aGlzLl9tYXAub24oJ3pvb21zdGFydCcsIHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsIHRoaXMpOwoJCX0KCQkvL0Jyb3dzZXJzIHdpdGhvdXQgem9vbUFuaW1hdGlvbiBvciBhIGJpZyB6b29tIGRvbid0IGZpcmUgem9vbXN0YXJ0CgkJdGhpcy5fbWFwLm9uKCd6b29tZW5kJywgdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5LCB0aGlzKTsKCgkJaWYgKEwuUGF0aC5TVkcgJiYgIUwuQnJvd3Nlci50b3VjaCkgewoJCQl0aGlzLl9tYXAuX2luaXRQYXRoUm9vdCgpOwoJCQkvL05lZWRzIHRvIGhhcHBlbiBpbiB0aGUgcGFnZWxvYWQsIG5vdCBhZnRlciwgb3IgYW5pbWF0aW9ucyBkb24ndCB3b3JrIGluIHdlYmtpdAoJCQkvLyAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NDU1MjAwL3N2Zy1hbmltYXRlLXdpdGgtZHluYW1pY2FsbHktYWRkZWQtZWxlbWVudHMKCQkJLy9EaXNhYmxlIG9uIHRvdWNoIGJyb3dzZXJzIGFzIHRoZSBhbmltYXRpb24gbWVzc2VzIHVwIG9uIGEgdG91Y2ggem9vbSBhbmQgaXNuJ3QgdmVyeSBub3RpY2FibGUKCQl9Cgl9LAoKCV9zcGlkZXJmaWVyT25SZW1vdmU6IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl9tYXAub2ZmKCdjbGljaycsIHRoaXMuX3Vuc3BpZGVyZnlXcmFwcGVyLCB0aGlzKTsKCQl0aGlzLl9tYXAub2ZmKCd6b29tc3RhcnQnLCB0aGlzLl91bnNwaWRlcmZ5Wm9vbVN0YXJ0LCB0aGlzKTsKCQl0aGlzLl9tYXAub2ZmKCd6b29tYW5pbScsIHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSwgdGhpcyk7CgoJCXRoaXMuX3Vuc3BpZGVyZnkoKTsgLy9FbnN1cmUgdGhhdCBtYXJrZXJzIGFyZSBiYWNrIHdoZXJlIHRoZXkgc2hvdWxkIGJlCgl9LAoKCgkvL09uIHpvb20gc3RhcnQgd2UgYWRkIGEgem9vbWFuaW0gaGFuZGxlciBzbyB0aGF0IHdlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGxhc3QgKGFmdGVyIG1hcmtlcnMgYXJlIGFuaW1hdGVkKQoJLy9UaGlzIG1lYW5zIHdlIGNhbiBkZWZpbmUgdGhlIGFuaW1hdGlvbiB0aGV5IGRvIHJhdGhlciB0aGFuIE1hcmtlcnMgZG9pbmcgYW4gYW5pbWF0aW9uIHRvIHRoZWlyIGFjdHVhbCBsb2NhdGlvbgoJX3Vuc3BpZGVyZnlab29tU3RhcnQ6IGZ1bmN0aW9uICgpIHsKCQlpZiAoIXRoaXMuX21hcCkgeyAvL01heSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYXAgYnkgYSB6b29tRW5kIGhhbmRsZXIKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5fbWFwLm9uKCd6b29tYW5pbScsIHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSwgdGhpcyk7Cgl9LAoJX3Vuc3BpZGVyZnlab29tQW5pbTogZnVuY3Rpb24gKHpvb21EZXRhaWxzKSB7CgkJLy9XYWl0IHVudGlsIHRoZSBmaXJzdCB6b29tYW5pbSBhZnRlciB0aGUgdXNlciBoYXMgZmluaXNoZWQgdG91Y2gtem9vbWluZyBiZWZvcmUgcnVubmluZyB0aGUgYW5pbWF0aW9uCgkJaWYgKEwuRG9tVXRpbC5oYXNDbGFzcyh0aGlzLl9tYXAuX21hcFBhbmUsICdsZWFmbGV0LXRvdWNoaW5nJykpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5fbWFwLm9mZignem9vbWFuaW0nLCB0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sIHRoaXMpOwoJCXRoaXMuX3Vuc3BpZGVyZnkoem9vbURldGFpbHMpOwoJfSwKCgoJX3Vuc3BpZGVyZnlXcmFwcGVyOiBmdW5jdGlvbiAoKSB7CgkJLy8vIDxzdW1tYXJ5Pl91bnNwaWRlcmZ5IGJ1dCBwYXNzZXMgbm8gYXJndW1lbnRzPC9zdW1tYXJ5PgoJCXRoaXMuX3Vuc3BpZGVyZnkoKTsKCX0sCgoJX3Vuc3BpZGVyZnk6IGZ1bmN0aW9uICh6b29tRGV0YWlscykgewoJCWlmICh0aGlzLl9zcGlkZXJmaWVkKSB7CgkJCXRoaXMuX3NwaWRlcmZpZWQudW5zcGlkZXJmeSh6b29tRGV0YWlscyk7CgkJfQoJfSwKCglfbm9hbmltYXRpb25VbnNwaWRlcmZ5OiBmdW5jdGlvbiAoKSB7CgkJaWYgKHRoaXMuX3NwaWRlcmZpZWQpIHsKCQkJdGhpcy5fc3BpZGVyZmllZC5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KCk7CgkJfQoJfSwKCgkvL0lmIHRoZSBnaXZlbiBsYXllciBpcyBjdXJyZW50bHkgYmVpbmcgc3BpZGVyZmllZCB0aGVuIHdlIHVuc3BpZGVyZnkgaXQgc28gaXQgaXNuJ3Qgb24gdGhlIG1hcCBhbnltb3JlIGV0YwoJX3Vuc3BpZGVyZnlMYXllcjogZnVuY3Rpb24gKGxheWVyKSB7CgkJaWYgKGxheWVyLl9zcGlkZXJMZWcpIHsKCQkJdGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKGxheWVyKTsKCgkJCWxheWVyLnNldE9wYWNpdHkoMSk7CgkJCS8vUG9zaXRpb24gd2lsbCBiZSBmaXhlZCB1cCBpbW1lZGlhdGVseSBpbiBfYW5pbWF0aW9uVW5zcGlkZXJmeQoJCQlsYXllci5zZXRaSW5kZXhPZmZzZXQoMCk7CgoJCQl0aGlzLl9tYXAucmVtb3ZlTGF5ZXIobGF5ZXIuX3NwaWRlckxlZyk7CgkJCWRlbGV0ZSBsYXllci5fc3BpZGVyTGVnOwoJCX0KCX0KfSk7CgoKfSh3aW5kb3csIGRvY3VtZW50KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/leaflet.markercluster.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIExlYWZsZXQubWFya2VyY2x1c3RlciwgUHJvdmlkZXMgQmVhdXRpZnVsIEFuaW1hdGVkIE1hcmtlciBDbHVzdGVyaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIExlYWZsZXQsIGEgSlMgbGlicmFyeSBmb3IgaW50ZXJhY3RpdmUgbWFwcy4KIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQubWFya2VyY2x1c3RlcgogKGMpIDIwMTItMjAxMywgRGF2ZSBMZWF2ZXIsIHNtYXJ0cmFrCiovCiFmdW5jdGlvbih0LGUpe0wuTWFya2VyQ2x1c3Rlckdyb3VwPUwuRmVhdHVyZUdyb3VwLmV4dGVuZCh7b3B0aW9uczp7bWF4Q2x1c3RlclJhZGl1czo4MCxpY29uQ3JlYXRlRnVuY3Rpb246bnVsbCxzcGlkZXJmeU9uTWF4Wm9vbTohMCxzaG93Q292ZXJhZ2VPbkhvdmVyOiEwLHpvb21Ub0JvdW5kc09uQ2xpY2s6ITAsc2luZ2xlTWFya2VyTW9kZTohMSxkaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbTpudWxsLHJlbW92ZU91dHNpZGVWaXNpYmxlQm91bmRzOiEwLGFuaW1hdGVBZGRpbmdNYXJrZXJzOiExLHNwaWRlcmZ5RGlzdGFuY2VNdWx0aXBsaWVyOjEscG9seWdvbk9wdGlvbnM6e319LGluaXRpYWxpemU6ZnVuY3Rpb24odCl7TC5VdGlsLnNldE9wdGlvbnModGhpcyx0KSx0aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9ufHwodGhpcy5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbj10aGlzLl9kZWZhdWx0SWNvbkNyZWF0ZUZ1bmN0aW9uKSx0aGlzLl9mZWF0dXJlR3JvdXA9TC5mZWF0dXJlR3JvdXAoKSx0aGlzLl9mZWF0dXJlR3JvdXAub24oTC5GZWF0dXJlR3JvdXAuRVZFTlRTLHRoaXMuX3Byb3BhZ2F0ZUV2ZW50LHRoaXMpLHRoaXMuX25vblBvaW50R3JvdXA9TC5mZWF0dXJlR3JvdXAoKSx0aGlzLl9ub25Qb2ludEdyb3VwLm9uKEwuRmVhdHVyZUdyb3VwLkVWRU5UUyx0aGlzLl9wcm9wYWdhdGVFdmVudCx0aGlzKSx0aGlzLl9pblpvb21BbmltYXRpb249MCx0aGlzLl9uZWVkc0NsdXN0ZXJpbmc9W10sdGhpcy5fbmVlZHNSZW1vdmluZz1bXSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHM9bnVsbCx0aGlzLl9xdWV1ZT1bXX0sYWRkTGF5ZXI6ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQuX2xheWVycyllLnB1c2godC5fbGF5ZXJzW2ldKTtyZXR1cm4gdGhpcy5hZGRMYXllcnMoZSl9aWYoIXQuZ2V0TGF0TG5nKXJldHVybiB0aGlzLl9ub25Qb2ludEdyb3VwLmFkZExheWVyKHQpLHRoaXM7aWYoIXRoaXMuX21hcClyZXR1cm4gdGhpcy5fbmVlZHNDbHVzdGVyaW5nLnB1c2godCksdGhpcztpZih0aGlzLmhhc0xheWVyKHQpKXJldHVybiB0aGlzO3RoaXMuX3Vuc3BpZGVyZnkmJnRoaXMuX3Vuc3BpZGVyZnkoKSx0aGlzLl9hZGRMYXllcih0LHRoaXMuX21heFpvb20pO3ZhciBuPXQscz10aGlzLl9tYXAuZ2V0Wm9vbSgpO2lmKHQuX19wYXJlbnQpZm9yKDtuLl9fcGFyZW50Ll96b29tPj1zOyluPW4uX19wYXJlbnQ7cmV0dXJuIHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcy5jb250YWlucyhuLmdldExhdExuZygpKSYmKHRoaXMub3B0aW9ucy5hbmltYXRlQWRkaW5nTWFya2Vycz90aGlzLl9hbmltYXRpb25BZGRMYXllcih0LG4pOnRoaXMuX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQodCxuKSksdGhpc30scmVtb3ZlTGF5ZXI6ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEwuTGF5ZXJHcm91cCl7dmFyIGU9W107Zm9yKHZhciBpIGluIHQuX2xheWVycyllLnB1c2godC5fbGF5ZXJzW2ldKTtyZXR1cm4gdGhpcy5yZW1vdmVMYXllcnMoZSl9cmV0dXJuIHQuZ2V0TGF0TG5nP3RoaXMuX21hcD90Ll9fcGFyZW50Pyh0aGlzLl91bnNwaWRlcmZ5JiYodGhpcy5fdW5zcGlkZXJmeSgpLHRoaXMuX3Vuc3BpZGVyZnlMYXllcih0KSksdGhpcy5fcmVtb3ZlTGF5ZXIodCwhMCksdGhpcy5fZmVhdHVyZUdyb3VwLmhhc0xheWVyKHQpJiYodGhpcy5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKHQpLHQuc2V0T3BhY2l0eSYmdC5zZXRPcGFjaXR5KDEpKSx0aGlzKTp0aGlzOighdGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLHQpJiZ0aGlzLmhhc0xheWVyKHQpJiZ0aGlzLl9uZWVkc1JlbW92aW5nLnB1c2godCksdGhpcyk6KHRoaXMuX25vblBvaW50R3JvdXAucmVtb3ZlTGF5ZXIodCksdGhpcyl9LGFkZExheWVyczpmdW5jdGlvbih0KXt2YXIgZSxpLG4scz10aGlzLl9tYXAscj10aGlzLl9mZWF0dXJlR3JvdXAsbz10aGlzLl9ub25Qb2ludEdyb3VwO2ZvcihlPTAsaT10Lmxlbmd0aDtpPmU7ZSsrKWlmKG49dFtlXSxuLmdldExhdExuZyl7aWYoIXRoaXMuaGFzTGF5ZXIobikpaWYocyl7aWYodGhpcy5fYWRkTGF5ZXIobix0aGlzLl9tYXhab29tKSxuLl9fcGFyZW50JiYyPT09bi5fX3BhcmVudC5nZXRDaGlsZENvdW50KCkpe3ZhciBhPW4uX19wYXJlbnQuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksaD1hWzBdPT09bj9hWzFdOmFbMF07ci5yZW1vdmVMYXllcihoKX19ZWxzZSB0aGlzLl9uZWVkc0NsdXN0ZXJpbmcucHVzaChuKX1lbHNlIG8uYWRkTGF5ZXIobik7cmV0dXJuIHMmJihyLmVhY2hMYXllcihmdW5jdGlvbih0KXt0IGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyJiZ0Ll9pY29uTmVlZHNVcGRhdGUmJnQuX3VwZGF0ZUljb24oKX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fem9vbSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpKSx0aGlzfSxyZW1vdmVMYXllcnM6ZnVuY3Rpb24odCl7dmFyIGUsaSxuLHM9dGhpcy5fZmVhdHVyZUdyb3VwLHI9dGhpcy5fbm9uUG9pbnRHcm91cDtpZighdGhpcy5fbWFwKXtmb3IoZT0wLGk9dC5sZW5ndGg7aT5lO2UrKyluPXRbZV0sdGhpcy5fYXJyYXlTcGxpY2UodGhpcy5fbmVlZHNDbHVzdGVyaW5nLG4pLHIucmVtb3ZlTGF5ZXIobik7cmV0dXJuIHRoaXN9Zm9yKGU9MCxpPXQubGVuZ3RoO2k+ZTtlKyspbj10W2VdLG4uX19wYXJlbnQ/KHRoaXMuX3JlbW92ZUxheWVyKG4sITAsITApLHMuaGFzTGF5ZXIobikmJihzLnJlbW92ZUxheWVyKG4pLG4uc2V0T3BhY2l0eSYmbi5zZXRPcGFjaXR5KDEpKSk6ci5yZW1vdmVMYXllcihuKTtyZXR1cm4gdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCx0aGlzLl96b29tLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcykscy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3RlciYmdC5fdXBkYXRlSWNvbigpfSksdGhpc30sY2xlYXJMYXllcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwfHwodGhpcy5fbmVlZHNDbHVzdGVyaW5nPVtdLGRlbGV0ZSB0aGlzLl9ncmlkQ2x1c3RlcnMsZGVsZXRlIHRoaXMuX2dyaWRVbmNsdXN0ZXJlZCksdGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5JiZ0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkoKSx0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl9ub25Qb2ludEdyb3VwLmNsZWFyTGF5ZXJzKCksdGhpcy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7ZGVsZXRlIHQuX19wYXJlbnR9KSx0aGlzLl9tYXAmJnRoaXMuX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzKCksdGhpc30sZ2V0Qm91bmRzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEwuTGF0TG5nQm91bmRzO2lmKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCl0LmV4dGVuZCh0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2JvdW5kcyk7ZWxzZSBmb3IodmFyIGU9dGhpcy5fbmVlZHNDbHVzdGVyaW5nLmxlbmd0aC0xO2U+PTA7ZS0tKXQuZXh0ZW5kKHRoaXMuX25lZWRzQ2x1c3RlcmluZ1tlXS5nZXRMYXRMbmcoKSk7cmV0dXJuIHQuZXh0ZW5kKHRoaXMuX25vblBvaW50R3JvdXAuZ2V0Qm91bmRzKCkpLHR9LGVhY2hMYXllcjpmdW5jdGlvbih0LGUpe3ZhciBpLG49dGhpcy5fbmVlZHNDbHVzdGVyaW5nLnNsaWNlKCk7Zm9yKHRoaXMuX3RvcENsdXN0ZXJMZXZlbCYmdGhpcy5fdG9wQ2x1c3RlckxldmVsLmdldEFsbENoaWxkTWFya2VycyhuKSxpPW4ubGVuZ3RoLTE7aT49MDtpLS0pdC5jYWxsKGUsbltpXSk7dGhpcy5fbm9uUG9pbnRHcm91cC5lYWNoTGF5ZXIodCxlKX0sZ2V0TGF5ZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGUpe3QucHVzaChlKX0pLHR9LGdldExheWVyOmZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7cmV0dXJuIHRoaXMuZWFjaExheWVyKGZ1bmN0aW9uKGkpe0wuc3RhbXAoaSk9PT10JiYoZT1pKX0pLGV9LGhhc0xheWVyOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO3ZhciBlLGk9dGhpcy5fbmVlZHNDbHVzdGVyaW5nO2ZvcihlPWkubGVuZ3RoLTE7ZT49MDtlLS0paWYoaVtlXT09PXQpcmV0dXJuITA7Zm9yKGk9dGhpcy5fbmVlZHNSZW1vdmluZyxlPWkubGVuZ3RoLTE7ZT49MDtlLS0paWYoaVtlXT09PXQpcmV0dXJuITE7cmV0dXJuISghdC5fX3BhcmVudHx8dC5fX3BhcmVudC5fZ3JvdXAhPT10aGlzKXx8dGhpcy5fbm9uUG9pbnRHcm91cC5oYXNMYXllcih0KX0sem9vbVRvU2hvd0xheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZnVuY3Rpb24oKXtpZigodC5faWNvbnx8dC5fX3BhcmVudC5faWNvbikmJiF0aGlzLl9pblpvb21BbmltYXRpb24paWYodGhpcy5fbWFwLm9mZigibW92ZWVuZCIsaSx0aGlzKSx0aGlzLm9mZigiYW5pbWF0aW9uZW5kIixpLHRoaXMpLHQuX2ljb24pZSgpO2Vsc2UgaWYodC5fX3BhcmVudC5faWNvbil7dmFyIG49ZnVuY3Rpb24oKXt0aGlzLm9mZigic3BpZGVyZmllZCIsbix0aGlzKSxlKCl9O3RoaXMub24oInNwaWRlcmZpZWQiLG4sdGhpcyksdC5fX3BhcmVudC5zcGlkZXJmeSgpfX07dC5faWNvbiYmdGhpcy5fbWFwLmdldEJvdW5kcygpLmNvbnRhaW5zKHQuZ2V0TGF0TG5nKCkpP2UoKTp0Ll9fcGFyZW50Ll96b29tPHRoaXMuX21hcC5nZXRab29tKCk/KHRoaXMuX21hcC5vbigibW92ZWVuZCIsaSx0aGlzKSx0aGlzLl9tYXAucGFuVG8odC5nZXRMYXRMbmcoKSkpOih0aGlzLl9tYXAub24oIm1vdmVlbmQiLGksdGhpcyksdGhpcy5vbigiYW5pbWF0aW9uZW5kIixpLHRoaXMpLHRoaXMuX21hcC5zZXRWaWV3KHQuZ2V0TGF0TG5nKCksdC5fX3BhcmVudC5fem9vbSsxKSx0Ll9fcGFyZW50Lnpvb21Ub0JvdW5kcygpKX0sb25BZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbWFwPXQ7dmFyIGUsaSxuO2lmKCFpc0Zpbml0ZSh0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSl0aHJvdyJNYXAgaGFzIG5vIG1heFpvb20gc3BlY2lmaWVkIjtmb3IodGhpcy5fZmVhdHVyZUdyb3VwLm9uQWRkKHQpLHRoaXMuX25vblBvaW50R3JvdXAub25BZGQodCksdGhpcy5fZ3JpZENsdXN0ZXJzfHx0aGlzLl9nZW5lcmF0ZUluaXRpYWxDbHVzdGVycygpLGU9MCxpPXRoaXMuX25lZWRzUmVtb3ZpbmcubGVuZ3RoO2k+ZTtlKyspbj10aGlzLl9uZWVkc1JlbW92aW5nW2VdLHRoaXMuX3JlbW92ZUxheWVyKG4sITApO2Zvcih0aGlzLl9uZWVkc1JlbW92aW5nPVtdLGU9MCxpPXRoaXMuX25lZWRzQ2x1c3RlcmluZy5sZW5ndGg7aT5lO2UrKyluPXRoaXMuX25lZWRzQ2x1c3RlcmluZ1tlXSxuLmdldExhdExuZz9uLl9fcGFyZW50fHx0aGlzLl9hZGRMYXllcihuLHRoaXMuX21heFpvb20pOnRoaXMuX2ZlYXR1cmVHcm91cC5hZGRMYXllcihuKTt0aGlzLl9uZWVkc0NsdXN0ZXJpbmc9W10sdGhpcy5fbWFwLm9uKCJ6b29tZW5kIix0aGlzLl96b29tRW5kLHRoaXMpLHRoaXMuX21hcC5vbigibW92ZWVuZCIsdGhpcy5fbW92ZUVuZCx0aGlzKSx0aGlzLl9zcGlkZXJmaWVyT25BZGQmJnRoaXMuX3NwaWRlcmZpZXJPbkFkZCgpLHRoaXMuX2JpbmRFdmVudHMoKSx0aGlzLl96b29tPXRoaXMuX21hcC5nZXRab29tKCksdGhpcy5fY3VycmVudFNob3duQm91bmRzPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fem9vbSx0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMpfSxvblJlbW92ZTpmdW5jdGlvbih0KXt0Lm9mZigiem9vbWVuZCIsdGhpcy5fem9vbUVuZCx0aGlzKSx0Lm9mZigibW92ZWVuZCIsdGhpcy5fbW92ZUVuZCx0aGlzKSx0aGlzLl91bmJpbmRFdmVudHMoKSx0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lPXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUucmVwbGFjZSgiIGxlYWZsZXQtY2x1c3Rlci1hbmltIiwiIiksdGhpcy5fc3BpZGVyZmllck9uUmVtb3ZlJiZ0aGlzLl9zcGlkZXJmaWVyT25SZW1vdmUoKSx0aGlzLl9oaWRlQ292ZXJhZ2UoKSx0aGlzLl9mZWF0dXJlR3JvdXAub25SZW1vdmUodCksdGhpcy5fbm9uUG9pbnRHcm91cC5vblJlbW92ZSh0KSx0aGlzLl9mZWF0dXJlR3JvdXAuY2xlYXJMYXllcnMoKSx0aGlzLl9tYXA9bnVsbH0sZ2V0VmlzaWJsZVBhcmVudDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dDtlJiYhZS5faWNvbjspZT1lLl9fcGFyZW50O3JldHVybiBlfHxudWxsfSxfYXJyYXlTcGxpY2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dC5sZW5ndGgtMTtpPj0wO2ktLSlpZih0W2ldPT09ZSlyZXR1cm4gdC5zcGxpY2UoaSwxKSwhMH0sX3JlbW92ZUxheWVyOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9ncmlkQ2x1c3RlcnMscz10aGlzLl9ncmlkVW5jbHVzdGVyZWQscj10aGlzLl9mZWF0dXJlR3JvdXAsbz10aGlzLl9tYXA7aWYoZSlmb3IodmFyIGE9dGhpcy5fbWF4Wm9vbTthPj0wJiZzW2FdLnJlbW92ZU9iamVjdCh0LG8ucHJvamVjdCh0LmdldExhdExuZygpLGEpKTthLS0pO3ZhciBoLF89dC5fX3BhcmVudCx1PV8uX21hcmtlcnM7Zm9yKHRoaXMuX2FycmF5U3BsaWNlKHUsdCk7XyYmKF8uX2NoaWxkQ291bnQtLSwhKF8uX3pvb208MCkpOyllJiZfLl9jaGlsZENvdW50PD0xPyhoPV8uX21hcmtlcnNbMF09PT10P18uX21hcmtlcnNbMV06Xy5fbWFya2Vyc1swXSxuW18uX3pvb21dLnJlbW92ZU9iamVjdChfLG8ucHJvamVjdChfLl9jTGF0TG5nLF8uX3pvb20pKSxzW18uX3pvb21dLmFkZE9iamVjdChoLG8ucHJvamVjdChoLmdldExhdExuZygpLF8uX3pvb20pKSx0aGlzLl9hcnJheVNwbGljZShfLl9fcGFyZW50Ll9jaGlsZENsdXN0ZXJzLF8pLF8uX19wYXJlbnQuX21hcmtlcnMucHVzaChoKSxoLl9fcGFyZW50PV8uX19wYXJlbnQsXy5faWNvbiYmKHIucmVtb3ZlTGF5ZXIoXyksaXx8ci5hZGRMYXllcihoKSkpOihfLl9yZWNhbGN1bGF0ZUJvdW5kcygpLGkmJl8uX2ljb258fF8uX3VwZGF0ZUljb24oKSksXz1fLl9fcGFyZW50O2RlbGV0ZSB0Ll9fcGFyZW50fSxfaXNPcklzUGFyZW50OmZ1bmN0aW9uKHQsZSl7Zm9yKDtlOyl7aWYodD09PWUpcmV0dXJuITA7ZT1lLnBhcmVudE5vZGV9cmV0dXJuITF9LF9wcm9wYWdhdGVFdmVudDpmdW5jdGlvbih0KXtpZih0LmxheWVyIGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyKXtpZih0Lm9yaWdpbmFsRXZlbnQmJnRoaXMuX2lzT3JJc1BhcmVudCh0LmxheWVyLl9pY29uLHQub3JpZ2luYWxFdmVudC5yZWxhdGVkVGFyZ2V0KSlyZXR1cm47dC50eXBlPSJjbHVzdGVyIit0LnR5cGV9dGhpcy5maXJlKHQudHlwZSx0KX0sX2RlZmF1bHRJY29uQ3JlYXRlRnVuY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRDaGlsZENvdW50KCksaT0iIG1hcmtlci1jbHVzdGVyLSI7cmV0dXJuIGkrPTEwPmU/InNtYWxsIjoxMDA+ZT8ibWVkaXVtIjoibGFyZ2UiLG5ldyBMLkRpdkljb24oe2h0bWw6IjxkaXY+PHNwYW4+IitlKyI8L3NwYW4+PC9kaXY+IixjbGFzc05hbWU6Im1hcmtlci1jbHVzdGVyIitpLGljb25TaXplOm5ldyBMLlBvaW50KDQwLDQwKX0pfSxfYmluZEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX21hcCxlPXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSxpPXRoaXMub3B0aW9ucy5zaG93Q292ZXJhZ2VPbkhvdmVyLG49dGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2s7KGV8fG4pJiZ0aGlzLm9uKCJjbHVzdGVyY2xpY2siLHRoaXMuX3pvb21PclNwaWRlcmZ5LHRoaXMpLGkmJih0aGlzLm9uKCJjbHVzdGVybW91c2VvdmVyIix0aGlzLl9zaG93Q292ZXJhZ2UsdGhpcyksdGhpcy5vbigiY2x1c3Rlcm1vdXNlb3V0Iix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcyksdC5vbigiem9vbWVuZCIsdGhpcy5faGlkZUNvdmVyYWdlLHRoaXMpKX0sX3pvb21PclNwaWRlcmZ5OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX21hcDtlLmdldE1heFpvb20oKT09PWUuZ2V0Wm9vbSgpP3RoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSYmdC5sYXllci5zcGlkZXJmeSgpOnRoaXMub3B0aW9ucy56b29tVG9Cb3VuZHNPbkNsaWNrJiZ0LmxheWVyLnpvb21Ub0JvdW5kcygpLHQub3JpZ2luYWxFdmVudCYmMTM9PT10Lm9yaWdpbmFsRXZlbnQua2V5Q29kZSYmZS5fY29udGFpbmVyLmZvY3VzKCl9LF9zaG93Q292ZXJhZ2U6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbWFwO3RoaXMuX2luWm9vbUFuaW1hdGlvbnx8KHRoaXMuX3Nob3duUG9seWdvbiYmZS5yZW1vdmVMYXllcih0aGlzLl9zaG93blBvbHlnb24pLHQubGF5ZXIuZ2V0Q2hpbGRDb3VudCgpPjImJnQubGF5ZXIhPT10aGlzLl9zcGlkZXJmaWVkJiYodGhpcy5fc2hvd25Qb2x5Z29uPW5ldyBMLlBvbHlnb24odC5sYXllci5nZXRDb252ZXhIdWxsKCksdGhpcy5vcHRpb25zLnBvbHlnb25PcHRpb25zKSxlLmFkZExheWVyKHRoaXMuX3Nob3duUG9seWdvbikpKX0sX2hpZGVDb3ZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3Nob3duUG9seWdvbiYmKHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzLl9zaG93blBvbHlnb24pLHRoaXMuX3Nob3duUG9seWdvbj1udWxsKX0sX3VuYmluZEV2ZW50czpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5zcGlkZXJmeU9uTWF4Wm9vbSxlPXRoaXMub3B0aW9ucy5zaG93Q292ZXJhZ2VPbkhvdmVyLGk9dGhpcy5vcHRpb25zLnpvb21Ub0JvdW5kc09uQ2xpY2ssbj10aGlzLl9tYXA7KHR8fGkpJiZ0aGlzLm9mZigiY2x1c3RlcmNsaWNrIix0aGlzLl96b29tT3JTcGlkZXJmeSx0aGlzKSxlJiYodGhpcy5vZmYoImNsdXN0ZXJtb3VzZW92ZXIiLHRoaXMuX3Nob3dDb3ZlcmFnZSx0aGlzKSx0aGlzLm9mZigiY2x1c3Rlcm1vdXNlb3V0Iix0aGlzLl9oaWRlQ292ZXJhZ2UsdGhpcyksbi5vZmYoInpvb21lbmQiLHRoaXMuX2hpZGVDb3ZlcmFnZSx0aGlzKSl9LF96b29tRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiYodGhpcy5fbWVyZ2VTcGxpdENsdXN0ZXJzKCksdGhpcy5fem9vbT10aGlzLl9tYXAuX3pvb20sdGhpcy5fY3VycmVudFNob3duQm91bmRzPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKX0sX21vdmVFbmQ6ZnVuY3Rpb24oKXtpZighdGhpcy5faW5ab29tQW5pbWF0aW9uKXt2YXIgdD10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKTt0aGlzLl90b3BDbHVzdGVyTGV2ZWwuX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcyx0aGlzLl96b29tLHQpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsdGhpcy5fbWFwLl96b29tLHQpLHRoaXMuX2N1cnJlbnRTaG93bkJvdW5kcz10fX0sX2dlbmVyYXRlSW5pdGlhbENsdXN0ZXJzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWFwLmdldE1heFpvb20oKSxlPXRoaXMub3B0aW9ucy5tYXhDbHVzdGVyUmFkaXVzO3RoaXMub3B0aW9ucy5kaXNhYmxlQ2x1c3RlcmluZ0F0Wm9vbSYmKHQ9dGhpcy5vcHRpb25zLmRpc2FibGVDbHVzdGVyaW5nQXRab29tLTEpLHRoaXMuX21heFpvb209dCx0aGlzLl9ncmlkQ2x1c3RlcnM9e30sdGhpcy5fZ3JpZFVuY2x1c3RlcmVkPXt9O2Zvcih2YXIgaT10O2k+PTA7aS0tKXRoaXMuX2dyaWRDbHVzdGVyc1tpXT1uZXcgTC5EaXN0YW5jZUdyaWQoZSksdGhpcy5fZ3JpZFVuY2x1c3RlcmVkW2ldPW5ldyBMLkRpc3RhbmNlR3JpZChlKTt0aGlzLl90b3BDbHVzdGVyTGV2ZWw9bmV3IEwuTWFya2VyQ2x1c3Rlcih0aGlzLC0xKX0sX2FkZExheWVyOmZ1bmN0aW9uKHQsZSl7dmFyIGksbixzPXRoaXMuX2dyaWRDbHVzdGVycyxyPXRoaXMuX2dyaWRVbmNsdXN0ZXJlZDtmb3IodGhpcy5vcHRpb25zLnNpbmdsZU1hcmtlck1vZGUmJih0Lm9wdGlvbnMuaWNvbj10aGlzLm9wdGlvbnMuaWNvbkNyZWF0ZUZ1bmN0aW9uKHtnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldEFsbENoaWxkTWFya2VyczpmdW5jdGlvbigpe3JldHVyblt0XX19KSk7ZT49MDtlLS0pe2k9dGhpcy5fbWFwLnByb2plY3QodC5nZXRMYXRMbmcoKSxlKTt2YXIgbz1zW2VdLmdldE5lYXJPYmplY3QoaSk7aWYobylyZXR1cm4gby5fYWRkQ2hpbGQodCksdC5fX3BhcmVudD1vLHZvaWQgMDtpZihvPXJbZV0uZ2V0TmVhck9iamVjdChpKSl7dmFyIGE9by5fX3BhcmVudDthJiZ0aGlzLl9yZW1vdmVMYXllcihvLCExKTt2YXIgaD1uZXcgTC5NYXJrZXJDbHVzdGVyKHRoaXMsZSxvLHQpO3NbZV0uYWRkT2JqZWN0KGgsdGhpcy5fbWFwLnByb2plY3QoaC5fY0xhdExuZyxlKSksby5fX3BhcmVudD1oLHQuX19wYXJlbnQ9aDt2YXIgXz1oO2ZvcihuPWUtMTtuPmEuX3pvb207bi0tKV89bmV3IEwuTWFya2VyQ2x1c3Rlcih0aGlzLG4sXyksc1tuXS5hZGRPYmplY3QoXyx0aGlzLl9tYXAucHJvamVjdChvLmdldExhdExuZygpLG4pKTtmb3IoYS5fYWRkQ2hpbGQoXyksbj1lO24+PTAmJnJbbl0ucmVtb3ZlT2JqZWN0KG8sdGhpcy5fbWFwLnByb2plY3Qoby5nZXRMYXRMbmcoKSxuKSk7bi0tKTtyZXR1cm59cltlXS5hZGRPYmplY3QodCxpKX10aGlzLl90b3BDbHVzdGVyTGV2ZWwuX2FkZENoaWxkKHQpLHQuX19wYXJlbnQ9dGhpcy5fdG9wQ2x1c3RlckxldmVsfSxfZW5xdWV1ZTpmdW5jdGlvbih0KXt0aGlzLl9xdWV1ZS5wdXNoKHQpLHRoaXMuX3F1ZXVlVGltZW91dHx8KHRoaXMuX3F1ZXVlVGltZW91dD1zZXRUaW1lb3V0KEwuYmluZCh0aGlzLl9wcm9jZXNzUXVldWUsdGhpcyksMzAwKSl9LF9wcm9jZXNzUXVldWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMuX3F1ZXVlLmxlbmd0aDt0KyspdGhpcy5fcXVldWVbdF0uY2FsbCh0aGlzKTt0aGlzLl9xdWV1ZS5sZW5ndGg9MCxjbGVhclRpbWVvdXQodGhpcy5fcXVldWVUaW1lb3V0KSx0aGlzLl9xdWV1ZVRpbWVvdXQ9bnVsbH0sX21lcmdlU3BsaXRDbHVzdGVyczpmdW5jdGlvbigpe3RoaXMuX3Byb2Nlc3NRdWV1ZSgpLHRoaXMuX3pvb208dGhpcy5fbWFwLl96b29tJiZ0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMuY29udGFpbnModGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpPyh0aGlzLl9hbmltYXRpb25TdGFydCgpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLHRoaXMuX3pvb20sdGhpcy5fZ2V0RXhwYW5kZWRWaXNpYmxlQm91bmRzKCkpLHRoaXMuX2FuaW1hdGlvblpvb21Jbih0aGlzLl96b29tLHRoaXMuX21hcC5fem9vbSkpOnRoaXMuX3pvb20+dGhpcy5fbWFwLl96b29tPyh0aGlzLl9hbmltYXRpb25TdGFydCgpLHRoaXMuX2FuaW1hdGlvblpvb21PdXQodGhpcy5fem9vbSx0aGlzLl9tYXAuX3pvb20pKTp0aGlzLl9tb3ZlRW5kKCl9LF9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHM6ZnVuY3Rpb24oKXtpZighdGhpcy5vcHRpb25zLnJlbW92ZU91dHNpZGVWaXNpYmxlQm91bmRzKXJldHVybiB0aGlzLmdldEJvdW5kcygpO3ZhciB0PXRoaXMuX21hcCxlPXQuZ2V0Qm91bmRzKCksaT1lLl9zb3V0aFdlc3Qsbj1lLl9ub3J0aEVhc3Qscz1MLkJyb3dzZXIubW9iaWxlPzA6TWF0aC5hYnMoaS5sYXQtbi5sYXQpLHI9TC5Ccm93c2VyLm1vYmlsZT8wOk1hdGguYWJzKGkubG5nLW4ubG5nKTtyZXR1cm4gbmV3IEwuTGF0TG5nQm91bmRzKG5ldyBMLkxhdExuZyhpLmxhdC1zLGkubG5nLXIsITApLG5ldyBMLkxhdExuZyhuLmxhdCtzLG4ubG5nK3IsITApKX0sX2FuaW1hdGlvbkFkZExheWVyTm9uQW5pbWF0ZWQ6ZnVuY3Rpb24odCxlKXtpZihlPT09dCl0aGlzLl9mZWF0dXJlR3JvdXAuYWRkTGF5ZXIodCk7ZWxzZSBpZigyPT09ZS5fY2hpbGRDb3VudCl7ZS5fYWRkVG9NYXAoKTt2YXIgaT1lLmdldEFsbENoaWxkTWFya2VycygpO3RoaXMuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihpWzBdKSx0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIoaVsxXSl9ZWxzZSBlLl91cGRhdGVJY29uKCl9fSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZShMLkRvbVV0aWwuVFJBTlNJVElPTj97X2FuaW1hdGlvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbWFwLl9tYXBQYW5lLmNsYXNzTmFtZSs9IiBsZWFmbGV0LWNsdXN0ZXItYW5pbSIsdGhpcy5faW5ab29tQW5pbWF0aW9uKyt9LF9hbmltYXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXAmJih0aGlzLl9tYXAuX21hcFBhbmUuY2xhc3NOYW1lPXRoaXMuX21hcC5fbWFwUGFuZS5jbGFzc05hbWUucmVwbGFjZSgiIGxlYWZsZXQtY2x1c3Rlci1hbmltIiwiIikpLHRoaXMuX2luWm9vbUFuaW1hdGlvbi0tLHRoaXMuZmlyZSgiYW5pbWF0aW9uZW5kIil9LF9hbmltYXRpb25ab29tSW46ZnVuY3Rpb24odCxlKXt2YXIgaSxuPXRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpLHM9dGhpcy5fZmVhdHVyZUdyb3VwO3RoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHkobix0LDAsZnVuY3Rpb24ocil7dmFyIG8sYT1yLl9sYXRsbmcsaD1yLl9tYXJrZXJzO2ZvcihuLmNvbnRhaW5zKGEpfHwoYT1udWxsKSxyLl9pc1NpbmdsZVBhcmVudCgpJiZ0KzE9PT1lPyhzLnJlbW92ZUxheWVyKHIpLHIuX3JlY3Vyc2l2ZWx5QWRkQ2hpbGRyZW5Ub01hcChudWxsLGUsbikpOihyLnNldE9wYWNpdHkoMCksci5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKGEsZSxuKSksaT1oLmxlbmd0aC0xO2k+PTA7aS0tKW89aFtpXSxuLmNvbnRhaW5zKG8uX2xhdGxuZyl8fHMucmVtb3ZlTGF5ZXIobyl9KSx0aGlzLl9mb3JjZUxheW91dCgpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlCZWNvbWVWaXNpYmxlKG4sZSkscy5lYWNoTGF5ZXIoZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIEwuTWFya2VyQ2x1c3Rlcnx8IXQuX2ljb258fHQuc2V0T3BhY2l0eSgxKX0pLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHkobix0LGUsZnVuY3Rpb24odCl7dC5fcmVjdXJzaXZlbHlSZXN0b3JlQ2hpbGRQb3NpdGlvbnMoZSl9KSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseShuLHQsMCxmdW5jdGlvbih0KXtzLnJlbW92ZUxheWVyKHQpLHQuc2V0T3BhY2l0eSgxKX0pLHRoaXMuX2FuaW1hdGlvbkVuZCgpfSl9LF9hbmltYXRpb25ab29tT3V0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fYW5pbWF0aW9uWm9vbU91dFNpbmdsZSh0aGlzLl90b3BDbHVzdGVyTGV2ZWwsdC0xLGUpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsZSx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsdCx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSl9LF9hbmltYXRpb25ab29tT3V0U2luZ2xlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbj10aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKTt0Ll9yZWN1cnNpdmVseUFuaW1hdGVDaGlsZHJlbkluQW5kQWRkU2VsZlRvTWFwKG4sZSsxLGkpO3ZhciBzPXRoaXM7dGhpcy5fZm9yY2VMYXlvdXQoKSx0Ll9yZWN1cnNpdmVseUJlY29tZVZpc2libGUobixpKSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7aWYoMT09PXQuX2NoaWxkQ291bnQpe3ZhciByPXQuX21hcmtlcnNbMF07ci5zZXRMYXRMbmcoci5nZXRMYXRMbmcoKSksci5zZXRPcGFjaXR5JiZyLnNldE9wYWNpdHkoMSl9ZWxzZSB0Ll9yZWN1cnNpdmVseShuLGksMCxmdW5jdGlvbih0KXt0Ll9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcChuLGUrMSl9KTtzLl9hbmltYXRpb25FbmQoKX0pfSxfYW5pbWF0aW9uQWRkTGF5ZXI6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG49dGhpcy5fZmVhdHVyZUdyb3VwO24uYWRkTGF5ZXIodCksZSE9PXQmJihlLl9jaGlsZENvdW50PjI/KGUuX3VwZGF0ZUljb24oKSx0aGlzLl9mb3JjZUxheW91dCgpLHRoaXMuX2FuaW1hdGlvblN0YXJ0KCksdC5fc2V0UG9zKHRoaXMuX21hcC5sYXRMbmdUb0xheWVyUG9pbnQoZS5nZXRMYXRMbmcoKSkpLHQuc2V0T3BhY2l0eSgwKSx0aGlzLl9lbnF1ZXVlKGZ1bmN0aW9uKCl7bi5yZW1vdmVMYXllcih0KSx0LnNldE9wYWNpdHkoMSksaS5fYW5pbWF0aW9uRW5kKCl9KSk6KHRoaXMuX2ZvcmNlTGF5b3V0KCksaS5fYW5pbWF0aW9uU3RhcnQoKSxpLl9hbmltYXRpb25ab29tT3V0U2luZ2xlKGUsdGhpcy5fbWFwLmdldE1heFpvb20oKSx0aGlzLl9tYXAuZ2V0Wm9vbSgpKSkpfSxfZm9yY2VMYXlvdXQ6ZnVuY3Rpb24oKXtMLlV0aWwuZmFsc2VGbihlLmJvZHkub2Zmc2V0V2lkdGgpfX06e19hbmltYXRpb25TdGFydDpmdW5jdGlvbigpe30sX2FuaW1hdGlvblpvb21JbjpmdW5jdGlvbih0LGUpe3RoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlSZW1vdmVDaGlsZHJlbkZyb21NYXAodGhpcy5fY3VycmVudFNob3duQm91bmRzLHQpLHRoaXMuX3RvcENsdXN0ZXJMZXZlbC5fcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwKG51bGwsZSx0aGlzLl9nZXRFeHBhbmRlZFZpc2libGVCb3VuZHMoKSl9LF9hbmltYXRpb25ab29tT3V0OmZ1bmN0aW9uKHQsZSl7dGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcCh0aGlzLl9jdXJyZW50U2hvd25Cb3VuZHMsdCksdGhpcy5fdG9wQ2x1c3RlckxldmVsLl9yZWN1cnNpdmVseUFkZENoaWxkcmVuVG9NYXAobnVsbCxlLHRoaXMuX2dldEV4cGFuZGVkVmlzaWJsZUJvdW5kcygpKX0sX2FuaW1hdGlvbkFkZExheWVyOmZ1bmN0aW9uKHQsZSl7dGhpcy5fYW5pbWF0aW9uQWRkTGF5ZXJOb25BbmltYXRlZCh0LGUpfX0pLEwubWFya2VyQ2x1c3Rlckdyb3VwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTC5NYXJrZXJDbHVzdGVyR3JvdXAodCl9LEwuTWFya2VyQ2x1c3Rlcj1MLk1hcmtlci5leHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24odCxlLGksbil7TC5NYXJrZXIucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzLGk/aS5fY0xhdExuZ3x8aS5nZXRMYXRMbmcoKTpuZXcgTC5MYXRMbmcoMCwwKSx7aWNvbjp0aGlzfSksdGhpcy5fZ3JvdXA9dCx0aGlzLl96b29tPWUsdGhpcy5fbWFya2Vycz1bXSx0aGlzLl9jaGlsZENsdXN0ZXJzPVtdLHRoaXMuX2NoaWxkQ291bnQ9MCx0aGlzLl9pY29uTmVlZHNVcGRhdGU9ITAsdGhpcy5fYm91bmRzPW5ldyBMLkxhdExuZ0JvdW5kcyxpJiZ0aGlzLl9hZGRDaGlsZChpKSxuJiZ0aGlzLl9hZGRDaGlsZChuKX0sZ2V0QWxsQ2hpbGRNYXJrZXJzOmZ1bmN0aW9uKHQpe3Q9dHx8W107Zm9yKHZhciBlPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tlXS5nZXRBbGxDaGlsZE1hcmtlcnModCk7Zm9yKHZhciBpPXRoaXMuX21hcmtlcnMubGVuZ3RoLTE7aT49MDtpLS0pdC5wdXNoKHRoaXMuX21hcmtlcnNbaV0pO3JldHVybiB0fSxnZXRDaGlsZENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NoaWxkQ291bnR9LHpvb21Ub0JvdW5kczpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPXRoaXMuX2NoaWxkQ2x1c3RlcnMuc2xpY2UoKSxpPXRoaXMuX2dyb3VwLl9tYXAsbj1pLmdldEJvdW5kc1pvb20odGhpcy5fYm91bmRzKSxzPXRoaXMuX3pvb20rMSxyPWkuZ2V0Wm9vbSgpO2UubGVuZ3RoPjAmJm4+czspe3MrKzt2YXIgbz1bXTtmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKW89by5jb25jYXQoZVt0XS5fY2hpbGRDbHVzdGVycyk7ZT1vfW4+cz90aGlzLl9ncm91cC5fbWFwLnNldFZpZXcodGhpcy5fbGF0bG5nLHMpOnI+PW4/dGhpcy5fZ3JvdXAuX21hcC5zZXRWaWV3KHRoaXMuX2xhdGxuZyxyKzEpOnRoaXMuX2dyb3VwLl9tYXAuZml0Qm91bmRzKHRoaXMuX2JvdW5kcyl9LGdldEJvdW5kczpmdW5jdGlvbigpe3ZhciB0PW5ldyBMLkxhdExuZ0JvdW5kcztyZXR1cm4gdC5leHRlbmQodGhpcy5fYm91bmRzKSx0fSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX2ljb25OZWVkc1VwZGF0ZT0hMCx0aGlzLl9pY29uJiZ0aGlzLnNldEljb24odGhpcyl9LGNyZWF0ZUljb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk5lZWRzVXBkYXRlJiYodGhpcy5faWNvbk9iaj10aGlzLl9ncm91cC5vcHRpb25zLmljb25DcmVhdGVGdW5jdGlvbih0aGlzKSx0aGlzLl9pY29uTmVlZHNVcGRhdGU9ITEpLHRoaXMuX2ljb25PYmouY3JlYXRlSWNvbigpfSxjcmVhdGVTaGFkb3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbk9iai5jcmVhdGVTaGFkb3coKX0sX2FkZENoaWxkOmZ1bmN0aW9uKHQsZSl7dGhpcy5faWNvbk5lZWRzVXBkYXRlPSEwLHRoaXMuX2V4cGFuZEJvdW5kcyh0KSx0IGluc3RhbmNlb2YgTC5NYXJrZXJDbHVzdGVyPyhlfHwodGhpcy5fY2hpbGRDbHVzdGVycy5wdXNoKHQpLHQuX19wYXJlbnQ9dGhpcyksdGhpcy5fY2hpbGRDb3VudCs9dC5fY2hpbGRDb3VudCk6KGV8fHRoaXMuX21hcmtlcnMucHVzaCh0KSx0aGlzLl9jaGlsZENvdW50KyspLHRoaXMuX19wYXJlbnQmJnRoaXMuX19wYXJlbnQuX2FkZENoaWxkKHQsITApfSxfZXhwYW5kQm91bmRzOmZ1bmN0aW9uKHQpe3ZhciBlLGk9dC5fd0xhdExuZ3x8dC5fbGF0bG5nO3QgaW5zdGFuY2VvZiBMLk1hcmtlckNsdXN0ZXI/KHRoaXMuX2JvdW5kcy5leHRlbmQodC5fYm91bmRzKSxlPXQuX2NoaWxkQ291bnQpOih0aGlzLl9ib3VuZHMuZXh0ZW5kKGkpLGU9MSksdGhpcy5fY0xhdExuZ3x8KHRoaXMuX2NMYXRMbmc9dC5fY0xhdExuZ3x8aSk7dmFyIG49dGhpcy5fY2hpbGRDb3VudCtlO3RoaXMuX3dMYXRMbmc/KHRoaXMuX3dMYXRMbmcubGF0PShpLmxhdCplK3RoaXMuX3dMYXRMbmcubGF0KnRoaXMuX2NoaWxkQ291bnQpL24sdGhpcy5fd0xhdExuZy5sbmc9KGkubG5nKmUrdGhpcy5fd0xhdExuZy5sbmcqdGhpcy5fY2hpbGRDb3VudCkvbik6dGhpcy5fbGF0bG5nPXRoaXMuX3dMYXRMbmc9bmV3IEwuTGF0TG5nKGkubGF0LGkubG5nKX0sX2FkZFRvTWFwOmZ1bmN0aW9uKHQpe3QmJih0aGlzLl9iYWNrdXBMYXRsbmc9dGhpcy5fbGF0bG5nLHRoaXMuc2V0TGF0TG5nKHQpKSx0aGlzLl9ncm91cC5fZmVhdHVyZUdyb3VwLmFkZExheWVyKHRoaXMpfSxfcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbjpmdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVjdXJzaXZlbHkodCwwLGktMSxmdW5jdGlvbih0KXt2YXIgaSxuLHM9dC5fbWFya2Vycztmb3IoaT1zLmxlbmd0aC0xO2k+PTA7aS0tKW49c1tpXSxuLl9pY29uJiYobi5fc2V0UG9zKGUpLG4uc2V0T3BhY2l0eSgwKSl9LGZ1bmN0aW9uKHQpe3ZhciBpLG4scz10Ll9jaGlsZENsdXN0ZXJzO2ZvcihpPXMubGVuZ3RoLTE7aT49MDtpLS0pbj1zW2ldLG4uX2ljb24mJihuLl9zZXRQb3MoZSksbi5zZXRPcGFjaXR5KDApKX0pfSxfcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5JbkFuZEFkZFNlbGZUb01hcDpmdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVjdXJzaXZlbHkodCxpLDAsZnVuY3Rpb24obil7bi5fcmVjdXJzaXZlbHlBbmltYXRlQ2hpbGRyZW5Jbih0LG4uX2dyb3VwLl9tYXAubGF0TG5nVG9MYXllclBvaW50KG4uZ2V0TGF0TG5nKCkpLnJvdW5kKCksZSksbi5faXNTaW5nbGVQYXJlbnQoKSYmZS0xPT09aT8obi5zZXRPcGFjaXR5KDEpLG4uX3JlY3Vyc2l2ZWx5UmVtb3ZlQ2hpbGRyZW5Gcm9tTWFwKHQsZSkpOm4uc2V0T3BhY2l0eSgwKSxuLl9hZGRUb01hcCgpfSl9LF9yZWN1cnNpdmVseUJlY29tZVZpc2libGU6ZnVuY3Rpb24odCxlKXt0aGlzLl9yZWN1cnNpdmVseSh0LDAsZSxudWxsLGZ1bmN0aW9uKHQpe3Quc2V0T3BhY2l0eSgxKX0pfSxfcmVjdXJzaXZlbHlBZGRDaGlsZHJlblRvTWFwOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl9yZWN1cnNpdmVseShpLC0xLGUsZnVuY3Rpb24obil7aWYoZSE9PW4uX3pvb20pZm9yKHZhciBzPW4uX21hcmtlcnMubGVuZ3RoLTE7cz49MDtzLS0pe3ZhciByPW4uX21hcmtlcnNbc107aS5jb250YWlucyhyLl9sYXRsbmcpJiYodCYmKHIuX2JhY2t1cExhdGxuZz1yLmdldExhdExuZygpLHIuc2V0TGF0TG5nKHQpLHIuc2V0T3BhY2l0eSYmci5zZXRPcGFjaXR5KDApKSxuLl9ncm91cC5fZmVhdHVyZUdyb3VwLmFkZExheWVyKHIpKX19LGZ1bmN0aW9uKGUpe2UuX2FkZFRvTWFwKHQpfSl9LF9yZWN1cnNpdmVseVJlc3RvcmVDaGlsZFBvc2l0aW9uczpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fbWFya2Vycy5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIGk9dGhpcy5fbWFya2Vyc1tlXTtpLl9iYWNrdXBMYXRsbmcmJihpLnNldExhdExuZyhpLl9iYWNrdXBMYXRsbmcpLGRlbGV0ZSBpLl9iYWNrdXBMYXRsbmcpfWlmKHQtMT09PXRoaXMuX3pvb20pZm9yKHZhciBuPXRoaXMuX2NoaWxkQ2x1c3RlcnMubGVuZ3RoLTE7bj49MDtuLS0pdGhpcy5fY2hpbGRDbHVzdGVyc1tuXS5fcmVzdG9yZVBvc2l0aW9uKCk7ZWxzZSBmb3IodmFyIHM9dGhpcy5fY2hpbGRDbHVzdGVycy5sZW5ndGgtMTtzPj0wO3MtLSl0aGlzLl9jaGlsZENsdXN0ZXJzW3NdLl9yZWN1cnNpdmVseVJlc3RvcmVDaGlsZFBvc2l0aW9ucyh0KX0sX3Jlc3RvcmVQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuX2JhY2t1cExhdGxuZyYmKHRoaXMuc2V0TGF0TG5nKHRoaXMuX2JhY2t1cExhdGxuZyksZGVsZXRlIHRoaXMuX2JhY2t1cExhdGxuZyl9LF9yZWN1cnNpdmVseVJlbW92ZUNoaWxkcmVuRnJvbU1hcDpmdW5jdGlvbih0LGUsaSl7dmFyIG4sczt0aGlzLl9yZWN1cnNpdmVseSh0LC0xLGUtMSxmdW5jdGlvbih0KXtmb3Iocz10Ll9tYXJrZXJzLmxlbmd0aC0xO3M+PTA7cy0tKW49dC5fbWFya2Vyc1tzXSxpJiZpLmNvbnRhaW5zKG4uX2xhdGxuZyl8fCh0Ll9ncm91cC5fZmVhdHVyZUdyb3VwLnJlbW92ZUxheWVyKG4pLG4uc2V0T3BhY2l0eSYmbi5zZXRPcGFjaXR5KDEpKX0sZnVuY3Rpb24odCl7Zm9yKHM9dC5fY2hpbGRDbHVzdGVycy5sZW5ndGgtMTtzPj0wO3MtLSluPXQuX2NoaWxkQ2x1c3RlcnNbc10saSYmaS5jb250YWlucyhuLl9sYXRsbmcpfHwodC5fZ3JvdXAuX2ZlYXR1cmVHcm91cC5yZW1vdmVMYXllcihuKSxuLnNldE9wYWNpdHkmJm4uc2V0T3BhY2l0eSgxKSl9KX0sX3JlY3Vyc2l2ZWx5OmZ1bmN0aW9uKHQsZSxpLG4scyl7dmFyIHIsbyxhPXRoaXMuX2NoaWxkQ2x1c3RlcnMsaD10aGlzLl96b29tO2lmKGU+aClmb3Iocj1hLmxlbmd0aC0xO3I+PTA7ci0tKW89YVtyXSx0LmludGVyc2VjdHMoby5fYm91bmRzKSYmby5fcmVjdXJzaXZlbHkodCxlLGksbixzKTtlbHNlIGlmKG4mJm4odGhpcykscyYmdGhpcy5fem9vbT09PWkmJnModGhpcyksaT5oKWZvcihyPWEubGVuZ3RoLTE7cj49MDtyLS0pbz1hW3JdLHQuaW50ZXJzZWN0cyhvLl9ib3VuZHMpJiZvLl9yZWN1cnNpdmVseSh0LGUsaSxuLHMpfSxfcmVjYWxjdWxhdGVCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX21hcmtlcnMsaT10aGlzLl9jaGlsZENsdXN0ZXJzO2Zvcih0aGlzLl9ib3VuZHM9bmV3IEwuTGF0TG5nQm91bmRzLGRlbGV0ZSB0aGlzLl93TGF0TG5nLHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLl9leHBhbmRCb3VuZHMoZVt0XSk7Zm9yKHQ9aS5sZW5ndGgtMTt0Pj0wO3QtLSl0aGlzLl9leHBhbmRCb3VuZHMoaVt0XSl9LF9pc1NpbmdsZVBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jaGlsZENsdXN0ZXJzLmxlbmd0aD4wJiZ0aGlzLl9jaGlsZENsdXN0ZXJzWzBdLl9jaGlsZENvdW50PT09dGhpcy5fY2hpbGRDb3VudH19KSxMLkRpc3RhbmNlR3JpZD1mdW5jdGlvbih0KXt0aGlzLl9jZWxsU2l6ZT10LHRoaXMuX3NxQ2VsbFNpemU9dCp0LHRoaXMuX2dyaWQ9e30sdGhpcy5fb2JqZWN0UG9pbnQ9e319LEwuRGlzdGFuY2VHcmlkLnByb3RvdHlwZT17YWRkT2JqZWN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5fZ2V0Q29vcmQoZS54KSxuPXRoaXMuX2dldENvb3JkKGUueSkscz10aGlzLl9ncmlkLHI9c1tuXT1zW25dfHx7fSxvPXJbaV09cltpXXx8W10sYT1MLlV0aWwuc3RhbXAodCk7dGhpcy5fb2JqZWN0UG9pbnRbYV09ZSxvLnB1c2godCl9LHVwZGF0ZU9iamVjdDpmdW5jdGlvbih0LGUpe3RoaXMucmVtb3ZlT2JqZWN0KHQpLHRoaXMuYWRkT2JqZWN0KHQsZSl9LHJlbW92ZU9iamVjdDpmdW5jdGlvbih0LGUpe3ZhciBpLG4scz10aGlzLl9nZXRDb29yZChlLngpLHI9dGhpcy5fZ2V0Q29vcmQoZS55KSxvPXRoaXMuX2dyaWQsYT1vW3JdPW9bcl18fHt9LGg9YVtzXT1hW3NdfHxbXTtmb3IoZGVsZXRlIHRoaXMuX29iamVjdFBvaW50W0wuVXRpbC5zdGFtcCh0KV0saT0wLG49aC5sZW5ndGg7bj5pO2krKylpZihoW2ldPT09dClyZXR1cm4gaC5zcGxpY2UoaSwxKSwxPT09biYmZGVsZXRlIGFbc10sITB9LGVhY2hPYmplY3Q6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHMscixvLGEsaCxfPXRoaXMuX2dyaWQ7Zm9yKGkgaW4gXyl7bz1fW2ldO2ZvcihuIGluIG8pZm9yKGE9b1tuXSxzPTAscj1hLmxlbmd0aDtyPnM7cysrKWg9dC5jYWxsKGUsYVtzXSksaCYmKHMtLSxyLS0pfX0sZ2V0TmVhck9iamVjdDpmdW5jdGlvbih0KXt2YXIgZSxpLG4scyxyLG8sYSxoLF89dGhpcy5fZ2V0Q29vcmQodC54KSx1PXRoaXMuX2dldENvb3JkKHQueSksbD10aGlzLl9vYmplY3RQb2ludCxkPXRoaXMuX3NxQ2VsbFNpemUscD1udWxsO2ZvcihlPXUtMTt1KzE+PWU7ZSsrKWlmKHM9dGhpcy5fZ3JpZFtlXSlmb3IoaT1fLTE7XysxPj1pO2krKylpZihyPXNbaV0pZm9yKG49MCxvPXIubGVuZ3RoO28+bjtuKyspYT1yW25dLGg9dGhpcy5fc3FEaXN0KGxbTC5VdGlsLnN0YW1wKGEpXSx0KSxkPmgmJihkPWgscD1hKTtyZXR1cm4gcH0sX2dldENvb3JkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvdGhpcy5fY2VsbFNpemUpfSxfc3FEaXN0OmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS54LXQueCxuPWUueS10Lnk7cmV0dXJuIGkqaStuKm59fSxmdW5jdGlvbigpe0wuUXVpY2tIdWxsPXtnZXREaXN0YW50OmZ1bmN0aW9uKHQsZSl7dmFyIGk9ZVsxXS5sYXQtZVswXS5sYXQsbj1lWzBdLmxuZy1lWzFdLmxuZztyZXR1cm4gbioodC5sYXQtZVswXS5sYXQpK2kqKHQubG5nLWVbMF0ubG5nKX0sZmluZE1vc3REaXN0YW50UG9pbnRGcm9tQmFzZUxpbmU6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHMscj0wLG89bnVsbCxhPVtdO2ZvcihpPWUubGVuZ3RoLTE7aT49MDtpLS0pbj1lW2ldLHM9dGhpcy5nZXREaXN0YW50KG4sdCkscz4wJiYoYS5wdXNoKG4pLHM+ciYmKHI9cyxvPW4pKTtyZXR1cm57bWF4UG9pbnQ6byxuZXdQb2ludHM6YX19LGJ1aWxkQ29udmV4SHVsbDpmdW5jdGlvbih0LGUpe3ZhciBpPVtdLG49dGhpcy5maW5kTW9zdERpc3RhbnRQb2ludEZyb21CYXNlTGluZSh0LGUpO3JldHVybiBuLm1heFBvaW50PyhpPWkuY29uY2F0KHRoaXMuYnVpbGRDb252ZXhIdWxsKFt0WzBdLG4ubWF4UG9pbnRdLG4ubmV3UG9pbnRzKSksaT1pLmNvbmNhdCh0aGlzLmJ1aWxkQ29udmV4SHVsbChbbi5tYXhQb2ludCx0WzFdXSxuLm5ld1BvaW50cykpKTpbdFswXV19LGdldENvbnZleEh1bGw6ZnVuY3Rpb24odCl7dmFyIGUsaT0hMSxuPSExLHM9bnVsbCxyPW51bGw7Zm9yKGU9dC5sZW5ndGgtMTtlPj0wO2UtLSl7dmFyIG89dFtlXTsoaT09PSExfHxvLmxhdD5pKSYmKHM9byxpPW8ubGF0KSwobj09PSExfHxvLmxhdDxuKSYmKHI9byxuPW8ubGF0KX12YXIgYT1bXS5jb25jYXQodGhpcy5idWlsZENvbnZleEh1bGwoW3Isc10sdCksdGhpcy5idWlsZENvbnZleEh1bGwoW3Mscl0sdCkpO3JldHVybiBhfX19KCksTC5NYXJrZXJDbHVzdGVyLmluY2x1ZGUoe2dldENvbnZleEh1bGw6ZnVuY3Rpb24oKXt2YXIgdCxlLGk9dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKSxuPVtdO2ZvcihlPWkubGVuZ3RoLTE7ZT49MDtlLS0pdD1pW2VdLmdldExhdExuZygpLG4ucHVzaCh0KTtyZXR1cm4gTC5RdWlja0h1bGwuZ2V0Q29udmV4SHVsbChuKX19KSxMLk1hcmtlckNsdXN0ZXIuaW5jbHVkZSh7XzJQSToyKk1hdGguUEksX2NpcmNsZUZvb3RTZXBhcmF0aW9uOjI1LF9jaXJjbGVTdGFydEFuZ2xlOk1hdGguUEkvNixfc3BpcmFsRm9vdFNlcGFyYXRpb246MjgsX3NwaXJhbExlbmd0aFN0YXJ0OjExLF9zcGlyYWxMZW5ndGhGYWN0b3I6NSxfY2lyY2xlU3BpcmFsU3dpdGNob3Zlcjo5LHNwaWRlcmZ5OmZ1bmN0aW9uKCl7aWYodGhpcy5fZ3JvdXAuX3NwaWRlcmZpZWQhPT10aGlzJiYhdGhpcy5fZ3JvdXAuX2luWm9vbUFuaW1hdGlvbil7dmFyIHQsZT10aGlzLmdldEFsbENoaWxkTWFya2VycygpLGk9dGhpcy5fZ3JvdXAsbj1pLl9tYXAscz1uLmxhdExuZ1RvTGF5ZXJQb2ludCh0aGlzLl9sYXRsbmcpO3RoaXMuX2dyb3VwLl91bnNwaWRlcmZ5KCksdGhpcy5fZ3JvdXAuX3NwaWRlcmZpZWQ9dGhpcyxlLmxlbmd0aD49dGhpcy5fY2lyY2xlU3BpcmFsU3dpdGNob3Zlcj90PXRoaXMuX2dlbmVyYXRlUG9pbnRzU3BpcmFsKGUubGVuZ3RoLHMpOihzLnkrPTEwLHQ9dGhpcy5fZ2VuZXJhdGVQb2ludHNDaXJjbGUoZS5sZW5ndGgscykpLHRoaXMuX2FuaW1hdGlvblNwaWRlcmZ5KGUsdCl9fSx1bnNwaWRlcmZ5OmZ1bmN0aW9uKHQpe3RoaXMuX2dyb3VwLl9pblpvb21BbmltYXRpb258fCh0aGlzLl9hbmltYXRpb25VbnNwaWRlcmZ5KHQpLHRoaXMuX2dyb3VwLl9zcGlkZXJmaWVkPW51bGwpfSxfZ2VuZXJhdGVQb2ludHNDaXJjbGU6ZnVuY3Rpb24odCxlKXt2YXIgaSxuLHM9dGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcip0aGlzLl9jaXJjbGVGb290U2VwYXJhdGlvbiooMit0KSxyPXMvdGhpcy5fMlBJLG89dGhpcy5fMlBJL3QsYT1bXTtmb3IoYS5sZW5ndGg9dCxpPXQtMTtpPj0wO2ktLSluPXRoaXMuX2NpcmNsZVN0YXJ0QW5nbGUraSpvLGFbaV09bmV3IEwuUG9pbnQoZS54K3IqTWF0aC5jb3MobiksZS55K3IqTWF0aC5zaW4obikpLl9yb3VuZCgpO3JldHVybiBhfSxfZ2VuZXJhdGVQb2ludHNTcGlyYWw6ZnVuY3Rpb24odCxlKXt2YXIgaSxuPXRoaXMuX2dyb3VwLm9wdGlvbnMuc3BpZGVyZnlEaXN0YW5jZU11bHRpcGxpZXIqdGhpcy5fc3BpcmFsTGVuZ3RoU3RhcnQscz10aGlzLl9ncm91cC5vcHRpb25zLnNwaWRlcmZ5RGlzdGFuY2VNdWx0aXBsaWVyKnRoaXMuX3NwaXJhbEZvb3RTZXBhcmF0aW9uLHI9dGhpcy5fZ3JvdXAub3B0aW9ucy5zcGlkZXJmeURpc3RhbmNlTXVsdGlwbGllcip0aGlzLl9zcGlyYWxMZW5ndGhGYWN0b3Isbz0wLGE9W107Zm9yKGEubGVuZ3RoPXQsaT10LTE7aT49MDtpLS0pbys9cy9uKzVlLTQqaSxhW2ldPW5ldyBMLlBvaW50KGUueCtuKk1hdGguY29zKG8pLGUueStuKk1hdGguc2luKG8pKS5fcm91bmQoKSxuKz10aGlzLl8yUEkqci9vO3JldHVybiBhfSxfbm9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKCl7dmFyIHQsZSxpPXRoaXMuX2dyb3VwLG49aS5fbWFwLHM9aS5fZmVhdHVyZUdyb3VwLHI9dGhpcy5nZXRBbGxDaGlsZE1hcmtlcnMoKTtmb3IodGhpcy5zZXRPcGFjaXR5KDEpLGU9ci5sZW5ndGgtMTtlPj0wO2UtLSl0PXJbZV0scy5yZW1vdmVMYXllcih0KSx0Ll9wcmVTcGlkZXJmeUxhdGxuZyYmKHQuc2V0TGF0TG5nKHQuX3ByZVNwaWRlcmZ5TGF0bG5nKSxkZWxldGUgdC5fcHJlU3BpZGVyZnlMYXRsbmcpLHQuc2V0WkluZGV4T2Zmc2V0JiZ0LnNldFpJbmRleE9mZnNldCgwKSx0Ll9zcGlkZXJMZWcmJihuLnJlbW92ZUxheWVyKHQuX3NwaWRlckxlZyksZGVsZXRlIHQuX3NwaWRlckxlZyk7aS5fc3BpZGVyZmllZD1udWxsfX0pLEwuTWFya2VyQ2x1c3Rlci5pbmNsdWRlKEwuRG9tVXRpbC5UUkFOU0lUSU9OP3tTVkdfQU5JTUFUSU9OOmZ1bmN0aW9uKCl7cmV0dXJuIGUuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImFuaW1hdGUiKS50b1N0cmluZygpLmluZGV4T2YoIlNWR0FuaW1hdGUiKT4tMX0oKSxfYW5pbWF0aW9uU3BpZGVyZnk6ZnVuY3Rpb24odCxpKXt2YXIgbixzLHIsbyxhPXRoaXMsaD10aGlzLl9ncm91cCxfPWguX21hcCx1PWguX2ZlYXR1cmVHcm91cCxsPV8ubGF0TG5nVG9MYXllclBvaW50KHRoaXMuX2xhdGxuZyk7Zm9yKG49dC5sZW5ndGgtMTtuPj0wO24tLSlzPXRbbl0scy5zZXRPcGFjaXR5PyhzLnNldFpJbmRleE9mZnNldCgxZTYpLHMuc2V0T3BhY2l0eSgwKSx1LmFkZExheWVyKHMpLHMuX3NldFBvcyhsKSk6dS5hZGRMYXllcihzKTtoLl9mb3JjZUxheW91dCgpLGguX2FuaW1hdGlvblN0YXJ0KCk7dmFyIGQ9TC5QYXRoLlNWRz8wOi4zLHA9TC5QYXRoLlNWR19OUztmb3Iobj10Lmxlbmd0aC0xO24+PTA7bi0tKWlmKG89Xy5sYXllclBvaW50VG9MYXRMbmcoaVtuXSkscz10W25dLHMuX3ByZVNwaWRlcmZ5TGF0bG5nPXMuX2xhdGxuZyxzLnNldExhdExuZyhvKSxzLnNldE9wYWNpdHkmJnMuc2V0T3BhY2l0eSgxKSxyPW5ldyBMLlBvbHlsaW5lKFthLl9sYXRsbmcsb10se3dlaWdodDoxLjUsY29sb3I6IiMyMjIiLG9wYWNpdHk6ZH0pLF8uYWRkTGF5ZXIocikscy5fc3BpZGVyTGVnPXIsTC5QYXRoLlNWRyYmdGhpcy5TVkdfQU5JTUFUSU9OKXt2YXIgYz1yLl9wYXRoLmdldFRvdGFsTGVuZ3RoKCk7ci5fcGF0aC5zZXRBdHRyaWJ1dGUoInN0cm9rZS1kYXNoYXJyYXkiLGMrIiwiK2MpO3ZhciBtPWUuY3JlYXRlRWxlbWVudE5TKHAsImFuaW1hdGUiKTttLnNldEF0dHJpYnV0ZSgiYXR0cmlidXRlTmFtZSIsInN0cm9rZS1kYXNob2Zmc2V0IiksbS5zZXRBdHRyaWJ1dGUoImJlZ2luIiwiaW5kZWZpbml0ZSIpLG0uc2V0QXR0cmlidXRlKCJmcm9tIixjKSxtLnNldEF0dHJpYnV0ZSgidG8iLDApLG0uc2V0QXR0cmlidXRlKCJkdXIiLC4yNSksci5fcGF0aC5hcHBlbmRDaGlsZChtKSxtLmJlZ2luRWxlbWVudCgpLG09ZS5jcmVhdGVFbGVtZW50TlMocCwiYW5pbWF0ZSIpLG0uc2V0QXR0cmlidXRlKCJhdHRyaWJ1dGVOYW1lIiwic3Ryb2tlLW9wYWNpdHkiKSxtLnNldEF0dHJpYnV0ZSgiYXR0cmlidXRlTmFtZSIsInN0cm9rZS1vcGFjaXR5IiksbS5zZXRBdHRyaWJ1dGUoImJlZ2luIiwiaW5kZWZpbml0ZSIpLG0uc2V0QXR0cmlidXRlKCJmcm9tIiwwKSxtLnNldEF0dHJpYnV0ZSgidG8iLC41KSxtLnNldEF0dHJpYnV0ZSgiZHVyIiwuMjUpLHIuX3BhdGguYXBwZW5kQ2hpbGQobSksbS5iZWdpbkVsZW1lbnQoKX1pZihhLnNldE9wYWNpdHkoLjMpLEwuUGF0aC5TVkcpZm9yKHRoaXMuX2dyb3VwLl9mb3JjZUxheW91dCgpLG49dC5sZW5ndGgtMTtuPj0wO24tLSlzPXRbbl0uX3NwaWRlckxlZyxzLm9wdGlvbnMub3BhY2l0eT0uNSxzLl9wYXRoLnNldEF0dHJpYnV0ZSgic3Ryb2tlLW9wYWNpdHkiLC41KTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5fYW5pbWF0aW9uRW5kKCksaC5maXJlKCJzcGlkZXJmaWVkIil9LDIwMCl9LF9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKHQpe3ZhciBlLGksbixzPXRoaXMuX2dyb3VwLHI9cy5fbWFwLG89cy5fZmVhdHVyZUdyb3VwLGE9dD9yLl9sYXRMbmdUb05ld0xheWVyUG9pbnQodGhpcy5fbGF0bG5nLHQuem9vbSx0LmNlbnRlcik6ci5sYXRMbmdUb0xheWVyUG9pbnQodGhpcy5fbGF0bG5nKSxoPXRoaXMuZ2V0QWxsQ2hpbGRNYXJrZXJzKCksXz1MLlBhdGguU1ZHJiZ0aGlzLlNWR19BTklNQVRJT047Zm9yKHMuX2FuaW1hdGlvblN0YXJ0KCksdGhpcy5zZXRPcGFjaXR5KDEpLGk9aC5sZW5ndGgtMTtpPj0wO2ktLSllPWhbaV0sZS5fcHJlU3BpZGVyZnlMYXRsbmcmJihlLnNldExhdExuZyhlLl9wcmVTcGlkZXJmeUxhdGxuZyksZGVsZXRlIGUuX3ByZVNwaWRlcmZ5TGF0bG5nLGUuc2V0T3BhY2l0eT8oZS5fc2V0UG9zKGEpLGUuc2V0T3BhY2l0eSgwKSk6by5yZW1vdmVMYXllcihlKSxfJiYobj1lLl9zcGlkZXJMZWcuX3BhdGguY2hpbGROb2Rlc1swXSxuLnNldEF0dHJpYnV0ZSgidG8iLG4uZ2V0QXR0cmlidXRlKCJmcm9tIikpLG4uc2V0QXR0cmlidXRlKCJmcm9tIiwwKSxuLmJlZ2luRWxlbWVudCgpLG49ZS5fc3BpZGVyTGVnLl9wYXRoLmNoaWxkTm9kZXNbMV0sbi5zZXRBdHRyaWJ1dGUoImZyb20iLC41KSxuLnNldEF0dHJpYnV0ZSgidG8iLDApLG4uc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsMCksbi5iZWdpbkVsZW1lbnQoKSxlLl9zcGlkZXJMZWcuX3BhdGguc2V0QXR0cmlidXRlKCJzdHJva2Utb3BhY2l0eSIsMCkpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IoaT1oLmxlbmd0aC0xO2k+PTA7aS0tKWU9aFtpXSxlLl9zcGlkZXJMZWcmJnQrKztmb3IoaT1oLmxlbmd0aC0xO2k+PTA7aS0tKWU9aFtpXSxlLl9zcGlkZXJMZWcmJihlLnNldE9wYWNpdHkmJihlLnNldE9wYWNpdHkoMSksZS5zZXRaSW5kZXhPZmZzZXQoMCkpLHQ+MSYmby5yZW1vdmVMYXllcihlKSxyLnJlbW92ZUxheWVyKGUuX3NwaWRlckxlZyksZGVsZXRlIGUuX3NwaWRlckxlZyk7cy5fYW5pbWF0aW9uRW5kKCl9LDIwMCl9fTp7X2FuaW1hdGlvblNwaWRlcmZ5OmZ1bmN0aW9uKHQsZSl7dmFyIGksbixzLHIsbz10aGlzLl9ncm91cCxhPW8uX21hcCxoPW8uX2ZlYXR1cmVHcm91cDtmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXI9YS5sYXllclBvaW50VG9MYXRMbmcoZVtpXSksbj10W2ldLG4uX3ByZVNwaWRlcmZ5TGF0bG5nPW4uX2xhdGxuZyxuLnNldExhdExuZyhyKSxuLnNldFpJbmRleE9mZnNldCYmbi5zZXRaSW5kZXhPZmZzZXQoMWU2KSxoLmFkZExheWVyKG4pLHM9bmV3IEwuUG9seWxpbmUoW3RoaXMuX2xhdGxuZyxyXSx7d2VpZ2h0OjEuNSxjb2xvcjoiIzIyMiJ9KSxhLmFkZExheWVyKHMpLG4uX3NwaWRlckxlZz1zO3RoaXMuc2V0T3BhY2l0eSguMyksby5maXJlKCJzcGlkZXJmaWVkIil9LF9hbmltYXRpb25VbnNwaWRlcmZ5OmZ1bmN0aW9uKCl7dGhpcy5fbm9hbmltYXRpb25VbnNwaWRlcmZ5KCl9fSksTC5NYXJrZXJDbHVzdGVyR3JvdXAuaW5jbHVkZSh7X3NwaWRlcmZpZWQ6bnVsbCxfc3BpZGVyZmllck9uQWRkOmZ1bmN0aW9uKCl7dGhpcy5fbWFwLm9uKCJjbGljayIsdGhpcy5fdW5zcGlkZXJmeVdyYXBwZXIsdGhpcyksdGhpcy5fbWFwLm9wdGlvbnMuem9vbUFuaW1hdGlvbiYmdGhpcy5fbWFwLm9uKCJ6b29tc3RhcnQiLHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsdGhpcyksdGhpcy5fbWFwLm9uKCJ6b29tZW5kIix0aGlzLl9ub2FuaW1hdGlvblVuc3BpZGVyZnksdGhpcyksTC5QYXRoLlNWRyYmIUwuQnJvd3Nlci50b3VjaCYmdGhpcy5fbWFwLl9pbml0UGF0aFJvb3QoKX0sX3NwaWRlcmZpZXJPblJlbW92ZTpmdW5jdGlvbigpe3RoaXMuX21hcC5vZmYoImNsaWNrIix0aGlzLl91bnNwaWRlcmZ5V3JhcHBlcix0aGlzKSx0aGlzLl9tYXAub2ZmKCJ6b29tc3RhcnQiLHRoaXMuX3Vuc3BpZGVyZnlab29tU3RhcnQsdGhpcyksdGhpcy5fbWFwLm9mZigiem9vbWFuaW0iLHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSx0aGlzKSx0aGlzLl91bnNwaWRlcmZ5KCl9LF91bnNwaWRlcmZ5Wm9vbVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbWFwJiZ0aGlzLl9tYXAub24oInpvb21hbmltIix0aGlzLl91bnNwaWRlcmZ5Wm9vbUFuaW0sdGhpcyl9LF91bnNwaWRlcmZ5Wm9vbUFuaW06ZnVuY3Rpb24odCl7TC5Eb21VdGlsLmhhc0NsYXNzKHRoaXMuX21hcC5fbWFwUGFuZSwibGVhZmxldC10b3VjaGluZyIpfHwodGhpcy5fbWFwLm9mZigiem9vbWFuaW0iLHRoaXMuX3Vuc3BpZGVyZnlab29tQW5pbSx0aGlzKSx0aGlzLl91bnNwaWRlcmZ5KHQpKX0sX3Vuc3BpZGVyZnlXcmFwcGVyOmZ1bmN0aW9uKCl7dGhpcy5fdW5zcGlkZXJmeSgpfSxfdW5zcGlkZXJmeTpmdW5jdGlvbih0KXt0aGlzLl9zcGlkZXJmaWVkJiZ0aGlzLl9zcGlkZXJmaWVkLnVuc3BpZGVyZnkodCl9LF9ub2FuaW1hdGlvblVuc3BpZGVyZnk6ZnVuY3Rpb24oKXt0aGlzLl9zcGlkZXJmaWVkJiZ0aGlzLl9zcGlkZXJmaWVkLl9ub2FuaW1hdGlvblVuc3BpZGVyZnkoKX0sX3Vuc3BpZGVyZnlMYXllcjpmdW5jdGlvbih0KXt0Ll9zcGlkZXJMZWcmJih0aGlzLl9mZWF0dXJlR3JvdXAucmVtb3ZlTGF5ZXIodCksdC5zZXRPcGFjaXR5KDEpLHQuc2V0WkluZGV4T2Zmc2V0KDApLHRoaXMuX21hcC5yZW1vdmVMYXllcih0Ll9zcGlkZXJMZWcpLGRlbGV0ZSB0Ll9zcGlkZXJMZWcpfX0pfSh3aW5kb3csZG9jdW1lbnQpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/MarkerCluster.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmxlYWZsZXQtY2x1c3Rlci1hbmltIC5sZWFmbGV0LW1hcmtlci1pY29uLCAubGVhZmxldC1jbHVzdGVyLWFuaW0gLmxlYWZsZXQtbWFya2VyLXNoYWRvdyB7Cgktd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MgZWFzZS1vdXQsIG9wYWNpdHkgMC4zcyBlYXNlLWluOwoJLW1vei10cmFuc2l0aW9uOiAtbW96LXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0LCBvcGFjaXR5IDAuM3MgZWFzZS1pbjsKCS1vLXRyYW5zaXRpb246IC1vLXRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0LCBvcGFjaXR5IDAuM3MgZWFzZS1pbjsKCXRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2Utb3V0LCBvcGFjaXR5IDAuM3MgZWFzZS1pbjsKCX0K]]></data>
	</file>
	<file>
	  <filename>/lib/js/leaflet-markercluster/MarkerCluster.Default.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm1hcmtlci1jbHVzdGVyLXNtYWxsIHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMTgxLCAyMjYsIDE0MCwgMC42KTsKCX0KLm1hcmtlci1jbHVzdGVyLXNtYWxsIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDExMCwgMjA0LCA1NywgMC42KTsKCX0KCi5tYXJrZXItY2x1c3Rlci1tZWRpdW0gewoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDEsIDIxMSwgODcsIDAuNik7Cgl9Ci5tYXJrZXItY2x1c3Rlci1tZWRpdW0gZGl2IHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjQwLCAxOTQsIDEyLCAwLjYpOwoJfQoKLm1hcmtlci1jbHVzdGVyLWxhcmdlIHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjUzLCAxNTYsIDExNSwgMC42KTsKCX0KLm1hcmtlci1jbHVzdGVyLWxhcmdlIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI0MSwgMTI4LCAyMywgMC42KTsKCX0KCgkvKiBJRSA2LTggZmFsbGJhY2sgY29sb3JzICovCi5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1zbWFsbCB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTgxLCAyMjYsIDE0MCk7Cgl9Ci5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1zbWFsbCBkaXYgewoJYmFja2dyb3VuZC1jb2xvcjogcmdiKDExMCwgMjA0LCA1Nyk7Cgl9CgoubGVhZmxldC1vbGRpZSAubWFya2VyLWNsdXN0ZXItbWVkaXVtIHsKCWJhY2tncm91bmQtY29sb3I6IHJnYigyNDEsIDIxMSwgODcpOwoJfQoubGVhZmxldC1vbGRpZSAubWFya2VyLWNsdXN0ZXItbWVkaXVtIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAxOTQsIDEyKTsKCX0KCi5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1sYXJnZSB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUzLCAxNTYsIDExNSk7Cgl9Ci5sZWFmbGV0LW9sZGllIC5tYXJrZXItY2x1c3Rlci1sYXJnZSBkaXYgewoJYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MSwgMTI4LCAyMyk7Cn0KCi5tYXJrZXItY2x1c3RlciB7CgliYWNrZ3JvdW5kLWNsaXA6IHBhZGRpbmctYm94OwoJYm9yZGVyLXJhZGl1czogMjBweDsKCX0KLm1hcmtlci1jbHVzdGVyIGRpdiB7Cgl3aWR0aDogMzBweDsKCWhlaWdodDogMzBweDsKCW1hcmdpbi1sZWZ0OiA1cHg7CgltYXJnaW4tdG9wOiA1cHg7CgoJdGV4dC1hbGlnbjogY2VudGVyOwoJYm9yZGVyLXJhZGl1czogMTVweDsKCWZvbnQ6IDEycHggIkhlbHZldGljYSBOZXVlIiwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKCX0KLm1hcmtlci1jbHVzdGVyIHNwYW4gewoJbGluZS1oZWlnaHQ6IDMwcHg7Cgl9]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNb2R1bGUgaW5zdGFsbGVyCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY21zbXMnKSkgZXhpdDsKCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdVc2UgUkQgTWFwJywnVXNlIFJEIE1hcCcpOwokdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignU2V0IFJEIE1hcCBQcmVmcycsICdTZXQgUkQgTWFwIFByZWZzJyk7CgokZGIgPSBjbXNtcygpLT5HZXREYigpOwoKLy8gbXlzcWwtc3BlY2lmaWMsIGJ1dCBpZ25vcmVkIGJ5IG90aGVyIGRhdGFiYXNlCiR0YWJvcHRhcnJheSA9IGFycmF5KCAnbXlzcWwnID0+ICdFTkdJTkU9TXlJU0FNJyApOwoKJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSggJGRiICk7CgovLyB0YWJsZSBzY2hlbWEgZGVzY3JpcHRpb24KJGZsZHMgPSAiCiAgICBtYXBfaWQgSSBBVVRPIEtFWSwKCW5hbWUgQyg4MCkgTk9UTlVMTCwKCXRpdGxlIEMoMjU2KSwKICAgIGJhc2VtYXAgQygyNTYpIE5PVE5VTEwsCglvdmVybGF5IEMoMjU2KSwKICAgIG92ZXJsYXlfcGFyYW1ldGVycyBDKDI1NiksCiAgICBpbml0aWFsX2V4dGVudCBDKDY0KSwKCXRlbXBsYXRlX25hbWUgQyg4MCkgTk9UTlVMTAoiOwogICAgICAgICAgICAgICAgICAgICAgICAKLy8gY3JlYXRlIGl0LiBUaGlzIHNob3VsZCBkbyBlcnJvciBjaGVja2luZywgYnV0IEknbSBhIGxhenkgc29kLgokc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JkbWFwIiwKICAgICAgICAkZmxkcywgCiAgICAgICAgJHRhYm9wdGFycmF5KTsKJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkc3FsYXJyYXkpOwoKJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZUluZGV4U1FMKCdpX25hbWUnLCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcCIsICduYW1lJyk7CiRyZXQgPSAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CmlmICgkcmV0ID09PSAwKSB7Cgl0aHJvdyBuZXcgRXhjZXB0aW9uKCJmYWlsZWQgdG8gY3JlYXRlIGluZGV4Iik7Cn0KCiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdkZWZhdWx0X2Jhc2VtYXAnLCdodHRwOi8vc2VydmVyLmFyY2dpc29ubGluZS5jb20vQXJjR0lTL3Jlc3Qvc2VydmljZXMvV29ybGRfVG9wb19NYXAvTWFwU2VydmVyJyk7CiR0aGlzLT5TZXRQcmVmZXJlbmNlKCdpbml0aWFsX2V4dGVudCcsJzAvMC8yJyk7CiR0aGlzLT5DcmVhdGVFdmVudCgnT25SRE1hcFByZWZlcmVuY2VDaGFuZ2UnKTsKJHRoaXMtPkF1ZGl0KCAwLAoJJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLAoJJHRoaXMtPkxhbmcoJ2luc3RhbGxlZCcpLCAkdGhpcy0+R2V0VmVyc2lvbigpKTsKCi8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzCiR0aGlzLT5BZGRFdmVudEhhbmRsZXIoJ0NvcmUnLCdDb250ZW50UG9zdFJlbmRlcicsZmFsc2UpOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNb2R1bGUgdW5pbnN0YWxsZXIKICoKICogY29weXJpZ2h0IDIwMTMsIFJlZ2lvbmFsIERpc3RyaWN0IG9mIEZyYXNlci1Gb3J0IEdlb3JnZQogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIE9yCiAqIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKCioqLwoKCgovLyByZW1vdmUgdGhlIGRhdGFiYXNlIHRhYmxlCiRkYiAtICRnQ21zLT5HZXREYigpOwokZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCAkZGIgKTsKJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXAiICk7CiRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcF9zZXEiKTsKCi8vIHJlbW92ZSBldmVudCBoYW5kbGVycwokdGhpcy0+UmVtb3ZlRXZlbnRIYW5kbGVyKCdDb3JlJywnQ29udGVudFBvc3RSZW5kZXInLGZhbHNlKTsKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2Jhc2VtYXAnKTsKJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ2luaXRpYWxfZXh0ZW50Jyk7Cgo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBNb2R1bGUgdXBncmFkZQogKgogKiBjb3B5cmlnaHQgMjAxMywgUmVnaW9uYWwgRGlzdHJpY3Qgb2YgRnJhc2VyLUZvcnQgR2VvcmdlCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCiAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKICogbW9yZSBkZXRhaWxzLiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgT3IKICogcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAoKKiovCgoKCWlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKCSRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsKCXN3aXRjaCgkY3VycmVudF92ZXJzaW9uKSB7CgkJY2FzZSAiMC4wLjEiOiB7CgkJCSRkYiA9IGNtc21zKCktPkdldERiKCk7CgkJCSR0YWJvcHRhcnJheSAgPWFycmF5KCdteXNxbCcgPT4gJ0VOR0lORT1NeUlTQU0nKTsKCQkJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoJCQkkZmxkcyA9ICJ0ZW1wbGF0ZV9pZCBJIEFVVE8gS0VZLAoJCQluYW1lIEMoODApIE5PVE5VTEwsCgkJCWNvZGUgWCBOT1ROVUxMCgkJCSI7CgkJCSRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9yZG1hcF90ZW1wbGF0ZXMiLCAkZmxkcywgJHRhYm9wdGFycmF5KTsKCQkJaWYgKCEkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSkpIHsKCQkJCSR0aGlzLT5BdWRpdCgxLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlX2ZhaWxlZCcpKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJJGZsZHMgPSAgIgoJCQkJdGVtcGxhdGVfaWQgSSBDT05TVFJBSU5UUyAnRk9SRUlHTiBLRVkgUkVGRVJFTkNFUyIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXBfdGVtcGxhdGVzJyI7CgoJCQkkc3FsYXJyYXkgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3JkbWFwIiwgJGZsZHMpOwoJCQlpZiAoISRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KSkgewoJCQkJJHRoaXMtPkF1ZGl0KDEsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtTGFuZygndXBncmFkZV9mYWlsZWQnKSk7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWJyZWFrOwoJCX0KCQljYXNlICIwLjAuMiI6IHsKCQkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsKCQkJJHRhYm9wdGFycmF5ICA9YXJyYXkoJ215c3FsJyA9PiAnRU5HSU5FPU15SVNBTScpOwoJCQkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgkJCSRxID0gJGRpY3QtPkRyb3BDb2x1bW5TUUwoY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXAnLCAndGVtcGxhdGVfaWQnKTsKCQkJJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSgkcSk7CgoJCQkkcSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLidtb2R1bGVfcmRtYXBfdGVtcGxhdGVzJyk7CgkJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHEpOwoKCQkJJHEgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKS4nbW9kdWxlX3JkbWFwJywgInRlbXBsYXRlX25hbWUgQyg4MCkgTk9UTlVMTCIpOwoJCQkkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRxKTsKCQl9CiAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAkZGIgPSBjbXNtcygpLT5HZXREYigpOwogICAgICAgICAgICAkc3FsID0gIlNFTEVDVCBDT1VOVCgqKSBhcyBjbnQgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEuY29sdW1ucyB3aGVyZSB0YWJsZV9uYW1lID0gJ2Ntc19tb2R1bGVfcmRtYXAnIGFuZCBjb2x1bW5fbmFtZSA9ICdvdmVybGF5X3BhcmFtZXRlcnMiOwogICAgICAgICAgICAkcmVzdWx0ID0gJGRiLT5HZXRSb3coJHNxbCk7CiAgICAgICAgICAgIGlmICgkcmVzdWx0WydjbnQnXSA9PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBtaXNzaW5nIHRoZSBvdmVybGF5X3BhcmFtZXRlcnMgZmllbGQKICAgICAgICAgICAgICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoJGRiKTsKICAgICAgICAgICAgICAgICR0YWJvcHRhcnJheSA9IGFycmF5KCdteXNxbCcgPT4gJ0VOR0lORT1NeUlTQU0nKTsKICAgICAgICAgICAgICAgICRmbGQgPSAib3ZlcmxheV9wYXJhbWV0ZXJzIEMoMjU2KSI7CiAgICAgICAgICAgICAgICAkcSA9ICRkaWN0LT5BZGRDb2x1bW5TUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfcmRtYXAiLCAkZmxkLCAkdGFib3B0YXJyYXkpOwogICAgICAgICAgICAgICAgaWYgKCEkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRxKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5BdWRpdCgxLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1cGdyYWRlX2ZhaWxlZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCX0KCSR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLCAkdGhpcy0+TGFuZygndXBncmFkZWQnKSk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/RDMap.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9NCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDogKi8KCi8qKgogKiBSRE1hcCBtb2R1bGU6IHBsYWNlIGEgY3VzdG9taXphYmxlIG1hcCBvbiBhIHBhZ2UuCiAqCiAqIGNvcHlyaWdodCAyMDEzLCBSZWdpb25hbCBEaXN0cmljdCBvZiBGcmFzZXItRm9ydCBHZW9yZ2UKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgogKiBtb3JlIGRldGFpbHMuICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSBPcgogKiByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCgoqKi8KCmNsYXNzIFJETWFwIGV4dGVuZHMgQ01TTW9kdWxlIHsKCWZ1bmN0aW9uIEdldE5hbWUoKSB7CgkJcmV0dXJuICdSRE1hcCc7Cgl9CgoJZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7Cgl9CgoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKCQlyZXR1cm4gJzAuNC4xJzsKCX0KCglmdW5jdGlvbiBHZXRIZWxwKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwoJfQoKCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiB0cnVlOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsKCQlyZXR1cm4gJ2V4dGVuc2lvbnMnOwoJfQoKCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKCQlyZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignVXNlIFJEIE1hcCcpOwoJfQoKCWZ1bmN0aW9uIEdldERhc2hib2FyZE91dHB1dCgpIHsKCQlyZXR1cm4gJyc7Cgl9CgoJZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgewoJCXJldHVybiBhcnJheSgpOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAnMS45LWJldGExJzsKCX0KCglmdW5jdGlvbiBNYXhpbXVtQ01TVmVyc2lvbigpIHsKCQlyZXR1cm4gJzIuMCc7Cgl9CgoJZnVuY3Rpb24gU2V0UGFyYW1ldGVycygpIHsKCQkkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKCQkkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CgkJJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbmFtZScsICcnLCAkdGhpcy0+TGFuZygnaGVscF9uYW1lJykpOwoJCSR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCduYW1lJyxDTEVBTl9TVFJJTkcpOwoKCX0KCglmdW5jdGlvbiBHZXRIZWFkZXJIVE1MKCkgewoJCSR0aGlzLT5GaXJlRGVidWcoJ2luZm8nLCdIZWFkZXIgdGV4dDogJy4kdGhpcy0+X291dF9oZWFkZXJfaHRtbCgpKTsKCQlyZXR1cm4gJHRoaXMtPl9vdXRfaGVhZGVyX2h0bWwoKTsKCX0KCglwcm90ZWN0ZWQgZnVuY3Rpb24gX291dF9oZWFkZXJfaHRtbCgpIHsKCQkkb3V0ID0gJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2Nkbi5sZWFmbGV0anMuY29tL2xlYWZsZXQtMC42LjQvbGVhZmxldC5jc3MiIC8+JzsKCQkkb3V0IC49ICc8c2NyaXB0IHNyYz0iaHR0cDovL2Nkbi5sZWFmbGV0anMuY29tL2xlYWZsZXQtMC42LjQvbGVhZmxldC5qcyI+PC9zY3JpcHQ+JzsKCQlyZXR1cm4gJG91dDsKCX0KCglmdW5jdGlvbiBGaXJlRGVidWcoJGNvbW1hbmQsICRtZXNzYWdlLCAkdmFyaWFibGVzPWFycmF5KCkpIHsKCQkkZmlyZXBocG1vZHVsZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0ZpcmVQSFBEZWJ1ZycpOwoJCWlmKCRmaXJlcGhwbW9kdWxlKSB7CgkJCSRmaXJlcGhwbW9kdWxlLT5TZXRNb2R1bGVOYW1lKCR0aGlzLT5HZXROYW1lKCkpOwoJCQkkZmlyZXBocG1vZHVsZS0+Q29tbWFuZCgkY29tbWFuZCwgJG1lc3NhZ2UsICR2YXJpYWJsZXMpOwoJCX0KCX0KCglmdW5jdGlvbiBDcmVhdGVJbWFnZUxpbmsoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQsICR0aXRsZSwgJGltYWdlcGF0aCwgJGFkZHRleHQ9JycsICRwYXJhbXMgPSBudWxsKSB7CgkJcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkLCBjbXNtcygpLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCRpbWFnZXBhdGgpLiRhZGR0ZXh0LCAkcGFyYW1zLCAnJywgZmFsc2UsIGZhbHNlLCAndGl0bGU9Jy4kdGl0bGUpOwoJfQp9Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/.map.tpl.swp</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[YjBWSU0gNy40AAAAABAAAGHK2VK2IhIAATgAAGRtYWhvbmV5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZWJpYW52bQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL3Zhci93d3cvbW9kdWxlcy9SRE1hcC90ZW1wbGF0ZXMvbWFwLnRwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1dGYtOA0AMzIxMAAAAAAjIiEgExJVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAQB/AAAAAgAAAAAAAAA5AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhZAAAfwgAAH8JAAAAEAAAOQAAAAAAAADPDwAAtg8AAIEPAAB6DwAAWg8AADMPAAAMDwAA2w4AAKIOAACYDgAAcg4AAFcOAAAPDgAA6g0AAMMNAAB/DQAARg0AAEENAAA9DQAAJA0AAAYNAAADDQAAAQ0AAAANAADXDAAArwwAAJAMAABxDAAAXQwAADYMAAAEDAAA7AsAAOkLAADWCwAA1AsAANMLAACtCwAAhwsAAF4LAABTCwAAFwsAAA0LAADcCgAAwAoAAKQKAAByCgAATgoAABwKAAAECgAA4gkAAN4JAADbCQAAlwkAAJUJAACUCQAAiQkAAH8JAABVCQAAbQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPC9zY3JpcHQ+AHsvbGl0ZXJhbH0AAH0ACWxheWVyRlMgPSBMLmVzcmkuPC9zY3JpcHQ+AHsvbGl0ZXJhbH0AAH0ACWxheWVyRlMgPSBMLmVzcmkuZmVhdHVyZUxheWVyKG92ZXJsYXlfdXJsLCBlc3JpcGFyYW1zKS5hZGRUbyhtYXApOwAJfQAJCX0ACQkJZXNyaXBhcmFtc1trZXldID0gcGFyYW1zW2tleV07AAkJZm9yIChrZXkgaW4gcGFyYW1zKSB7AAkJdmFyIHBhcmFtcyA9IHByb2Nlc3NQYXJhbXMob3ZlcmxheV9wYXJhbWV0ZXJzKTsACWlmIChvdmVybGF5X3BhcmFtZXRlcnMgIT09IG51bGwpIHsACXZhciBlc3JpcGFyYW1zID0geyBvbkVhY2hGZWF0dXJlOiBjcmVhdGVQb3B1cCB9OwBpZiAob3ZlcmxheV91cmwgIT09IG51bGwpIHsACW1heHpvb206IDE5IH0pLmFkZFRvKG1hcCk7AEwudGlsZUxheWVyKGJhc2VtYXBfdXJsICsgJy90aWxlL3t6fS97eX0ve3h9JywgewB7bGl0ZXJhbH0AdmFyIG1hcCA9IEwubWFwKCdtYXB7JHJkbWFwLT5tYXBfaWR9Jykuc2V0VmlldyhbeSx4XSx6b29tKTsAey9saXRlcmFsfQB2YXIgem9vbSA9IGluaXRpYWxfZXh0ZW50LnNwbGl0KCcvJylbMl07AHZhciB5ID0gaW5pdGlhbF9leHRlbnQuc3BsaXQoJy8nKVsxXTsAdmFyIHggPSBpbml0aWFsX2V4dGVudC5zcGxpdCgnLycpWzBdOwAAfQAJcmV0dXJuIG91dF90ZXJtczsACX0ACQlvdXRfdGVybXNba2V5XSA9IHZhbDsACQl2YXIgdmFsID0gdC5zbGljZSh0LmluZGV4T2YoJz0nKSArIDEsdC5sZW5ndGgpOwAJCXZhciBrZXkgPSB0LnNsaWNlKDAsdC5pbmRleE9mKCc9JykpOwAJCXZhciB0ID0gdGVybXNbaV07AAlmb3IoaT0wO2k8dGVybXMubGVuZ3RoO2krKykgewAJdmFyIG91dF90ZXJtcyA9IG5ldyBPYmplY3QoKTsACXZhciB0ZXJtcyA9IG92ZXJsYXlfcGFyYW1zLnNwbGl0KCc7Jyk7AGZ1bmN0aW9uIHByb2Nlc3NQYXJhbXMob3ZlcmxheV9wYXJhbXMpIHsAAH0ACX0ACQlsYXllci5iaW5kUG9wdXAocG9wdXBUZXh0KTsACQlwb3B1cFRleHQgKz0gIjwvZGl2PiI7AAkJfQAJCQl9AAkJCQlwb3B1cFRleHQgKz0gIjxiPiIgKyBwcm9wICsgIjwvYj46IiArIHZhbCArICI8YnIvPiI7AAkJCWlmICh2YWwgJiYgcHJvcCAhPT0gImdsb2JhbGlkIiAmJiAhcHJvcC5tYXRjaCgvb2JqZWN0aWRfXGQrLykpIHsACQkJdmFyIHZhbCA9IGdlb2pzb24ucHJvcGVydGllc1twcm9wXTsACQlmb3IgKHByb3AgaW4gZ2VvanNvbi5wcm9wZXJ0aWVzKSB7AAkJdmFyIHBvcHVwVGV4dCA9ICI8ZGl2IHN0eWxlPSdvdmVyZmxvdy15OnNjcm9sbDsgbWF4LWhlaWdodDoyMDBweDsnPiI7AAlpZiAoZ2VvanNvbi5wcm9wZXJ0aWVzKSB7AGZ1bmN0aW9uIGNyZWF0ZVBvcHVwKGdlb2pzb24sbGF5ZXIpIHsAe2xpdGVyYWx9AHZhciBvdmVybGF5X3BhcmFtZXRlcnMgPSAieyRyZG1hcC0+b3ZlcmxheV9wYXJhbWV0ZXJzfSI7AHZhciBpbml0aWFsX2V4dGVudCA9ICJ7JHJkbWFwLT5pbml0aWFsX2V4dGVudH0iOwB2YXIgb3ZlcmxheV91cmwgPSAieyRyZG1hcC0+b3ZlcmxheX0iOwB2YXIgYmFzZW1hcF91cmwgPSAieyRyZG1hcC0+YmFzZW1hcH0iOwA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+ADwvZGl2PgA8ZGl2IGlkPSJtYXB7JHJkbWFwLT5tYXBfaWR9IiBzdHlsZT0iaGVpZ2h0OiA0MDBweCI+ADxoMz57JHJkbWFwLT50aXRsZX08L2gzPgB7aWYgaXNzZXQoJGVycm9yKX08c3Ryb25nPnskZXJyb3J9PC9zdHJvbmc+ey9pZn0A]]></data>
	</file>
	<file>
	  <filename>/templates/adminmaps.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJPHRoIHdpZHRoPSI1JSI+eyRtYXBfaWR9PC90aD4KCQk8dGg+eyRtYXBfbmFtZX08L3RoPgoJCTx0aCBjbGFzcz0icGFnZWljb24iPjwvdGg+CgkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JG1hcGxpc3QgaXRlbT0nbWFwJ30KCQl7Y3ljbGUgdmFsdWVzPSdyb3cxLHJvdzInIGFzc2lnbj0ncm93Y2xhc3MnfQoJCTx0ciBjbGFzcz0ieyRyb3djbGFzc30iIG9ubW91c2VvdmVyPSJ0aGlzLmNsYXNzTmFtZT0neyRyb3djbGFzc31ob3Zlcic7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT0neyRyb3djbGFzc30nOyI+CgkJCTx0ZD57JG1hcC0+bWFwX2lkfTwvdGQ+CgkJCTx0ZD57JG1hcC0+bmFtZX08L3RkPgoJCQk8dGQ+e2lmIGlzc2V0KCRtYXAtPmVkaXRfbGluayl9eyRtYXAtPmVkaXRfbGlua317ZWxzZX0mbmJzcDt7L2lmfTwvdGQ+CgkJCTx0ZD57aWYgaXNzZXQoJG1hcC0+Y29weV9saW5rKX17JG1hcC0+Y29weV9saW5rfXtlbHNlfSZuYnNwO3svaWZ9PC90ZD4KCQkJPHRkPntpZiBpc3NldCgkbWFwLT5kZWxldGVfbGluayl9eyRtYXAtPmRlbGV0ZV9saW5rfXtlbHNlfSZuYnNwO3svaWZ9PC90ZD4KCQkJPCEtLSBhZGQgcmVtYWluaW5nIG1hcCBhdHRyaWJ1dGVzIC0tPgoJCTwvdHI+Cgl7L2ZvcmVhY2h9Cgk8L3Rib2R5PgkKPC90YWJsZT4KeyRhZGRfbWFwfQoK]]></data>
	</file>
	<file>
	  <filename>/templates/adminpanel.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyR0YWJzX3N0YXJ0fQoJeyRzdGFydF9nZW5lcmFsX3RhYn0KCQl7JHdlbGNvbWVfdGV4dH0KCXskdGFiX2VuZH0KCXskc3RhcnRfcHJlZmVyZW5jZV90YWJ9CgkJe2lmICRzdGFydF9wcmVmZXJlbmNlX3RhYiAhPSAnJ30KCQkJeyRzdGFydF9mb3JtfQoJCQkJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQkJCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfYmFzZW1hcH08L3A+CgkJCQkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iYXNlbWFwfTwvcD4KCQkJCTwvZGl2PgoJCQkJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQkJCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfZXh0ZW50fTwvcD4KCQkJCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2V4dGVudH08L3A+CgkJCQk8L2Rpdj4KCQkJCXskc3VibWl0fQoJCQk8L2Zvcm0+CgkJey9pZn0KCXskdGFiX2VuZH0KCXskc3RhcnRfbWFwc190YWJ9CgkJe2luY2x1ZGUgZmlsZT0iJG1hcHNfdGVtcGxhdGUifQoJeyR0YWJfZW5kfQoJeyRzdGFydF90ZW1wbGF0ZXNfdGFifQoJCXtpbmNsdWRlIGZpbGU9IiR0ZW1wbGF0ZXNfdGVtcGxhdGUifQoJeyR0YWJfZW5kfQp7JHRhYnNfZW5kfQp7aWYgaXNzZXQoJGVycm9yX21zZyl9CjxkaXYgaWQ9ImVycm9ycyIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZDsgcGFkZGluZzogM3B4OyBjb2xvcjpyZWQ7Ij4KRXJyb3I6IHskZXJyb3JfbXNnfQo8L2Rpdj4Key9pZn0K]]></data>
	</file>
	<file>
	  <filename>/templates/admintemplates.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJPHRoPnskZmllbGRfdGVtcGxhdGVfbmFtZX08L3RoPgoJCTx0aCBjbGFzcz0icGFnZWljb24iPjwvdGg+CgkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+PC90aD4KCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJPC90aGVhZD4KCTx0Ym9keT4KCXtmb3JlYWNoIGZyb209JHRlbXBsYXRlbGlzdCBpdGVtPSd0ZW1wbGF0ZSd9CgkJe2N5Y2xlIHZhbHVlcz0ncm93MSxyb3cyJyBhc3NpZ249J3Jvd2NsYXNzJ30KCQk8dHIgY2xhc3M9Inskcm93Y2xhc3N9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9aG92ZXInOyIgb25tb3VzZW91dD0idGhpcy5jbGFzc05hbWU9J3skcm93Y2xhc3N9JzsiPgoJCQk8dGQ+eyR0ZW1wbGF0ZS0+bmFtZX08L3RkPgoJCQk8dGQ+e2lmIGlzc2V0KCR0ZW1wbGF0ZS0+ZWRpdF9saW5rKX17JHRlbXBsYXRlLT5lZGl0X2xpbmt9e2Vsc2V9Jm5ic3A7ey9pZn08L3RkPgoJCQk8dGQ+e2lmIGlzc2V0KCR0ZW1wbGF0ZS0+Y29weV9saW5rKX17JHRlbXBsYXRlLT5jb3B5X2xpbmt9e2Vsc2V9Jm5ic3A7ey9pZn08L3RkPgoJCQk8dGQ+e2lmIGlzc2V0KCR0ZW1wbGF0ZS0+ZGVsZXRlX2xpbmspfXskdGVtcGxhdGUtPmRlbGV0ZV9saW5rfXtlbHNlfSZuYnNwO3svaWZ9PC90ZD4KCQkJPCEtLSBhZGQgcmVtYWluaW5nIG1hcCBhdHRyaWJ1dGVzIC0tPgoJCTwvdHI+Cgl7L2ZvcmVhY2h9Cgk8L3Rib2R5PgkKPC90YWJsZT4KeyRhZGRfdGVtcGxhdGV9Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/edit_map.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPkVkaXQgTWFwPC9oMj4Ke2lmIGlzc2V0KCRlcnJvcil9CjxkaXYgaWQ9ImVycm9ycyIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJlZDsgcGFkZGluZzogM3B4OyBjb2xvcjpyZWQ7Ij4KeyRlcnJvcn0KPC9kaXY+CnsvaWZ9Cnskc3RhcnRfZm9ybX0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfbmFtZX08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRuYW1lfTwvcD48cD57JGhlbHBfbmFtZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfdGl0bGV9PC9wPjxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGl0bGV9PC9wPjxwPnskaGVscF90aXRsZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfYmFzZW1hcH08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRiYXNlbWFwfTwvcD48cD57JGhlbHBfYmFzZW1hcH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfZXh0ZW50fTwvcD48cCBjbGFzcz0icGFnZWlucHV0Ij57JGluaXRpYWxfZXh0ZW50fTwvcD48cD57JGhlbHBfZXh0ZW50fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9vdmVybGF5fTwvcD48cCBjbGFzcz0icGFnZWlucHV0Ij57JG92ZXJsYXl9PC9wPjxwPnskaGVscF9vdmVybGF5fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9vdmVybGF5X3BhcmFtZXRlcnN9PC9wPjxwIGNsYXNzPSJwYWdlaW5wdXQiPnskb3ZlcmxheV9wYXJhbWV0ZXJzfTwvcD48cD57JGhlbHBfb3ZlcmxheV9wYXJhbWV0ZXJzfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV90ZW1wbGF0ZV9uYW1lfTwvcD48cCBjbGFzcz0icGFnZWlucHV0Ij57JHRlbXBsYXRlc308L3A+Cgk8L2Rpdj4KCXskbWFwX2lkfQoJeyRzdWJtaXR9eyRjYW5jZWx9CjwvZm9ybT4K]]></data>
	</file>
	<file>
	  <filename>/templates/edit_template.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPkVkaXQgVGVtcGxhdGU8L2gyPgp7aWYgaXNzZXQoJGVycm9yKX0KPGRpdiBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgcmVkOyBwYWRkaW5nOiAzcHg7IGNvbG9yOnJlZDsiPnskZXJyb3J9PC9kaXY+CnsvaWZ9Cnskc3RhcnRfZm9ybX0KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfbmFtZX08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRuYW1lfTwvcD48cD57JGhlbHBfbmFtZX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfY29kZX08L3A+PHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRjb2RlfTwvcD48cD57JGhlbHBfY29kZX08L3A+Cgk8L2Rpdj4KCXskc3VibWl0fXskY2FuY2VsfQo8L2Zvcm0+Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/error.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdj4KCTxoMz5FcnJvcjwvaDM+Cgk8cD5UaGUgbWFwIGNvdWxkIG5vdCBiZSBkcmF3bi4gVGhlIGVycm9yIHJlcG9ydGVkIHdhczo8L3A+Cgk8dHQ+eyRlcnJvcn08L3R0Pgo8L2Rpdj4K]]></data>
	</file>
	<file>
	  <filename>/templates/map.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmIGlzc2V0KCRlcnJvcil9PHN0cm9uZz57JGVycm9yfTwvc3Ryb25nPnsvaWZ9CjxoMz57JHJkbWFwLT50aXRsZX08L2gzPgo8ZGl2IGlkPSJtYXB7JHJkbWFwLT5tYXBfaWR9IiBzdHlsZT0iaGVpZ2h0OiA0MDBweCI+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CnZhciBiYXNlbWFwX3VybCA9ICJ7JHJkbWFwLT5iYXNlbWFwfSI7CnZhciBvdmVybGF5X3VybCA9ICJ7JHJkbWFwLT5vdmVybGF5fSI7CnZhciBpbml0aWFsX2V4dGVudCA9ICJ7JHJkbWFwLT5pbml0aWFsX2V4dGVudH0iOwp2YXIgb3ZlcmxheV9wYXJhbWV0ZXJzID0gInskcmRtYXAtPm92ZXJsYXlfcGFyYW1ldGVyc30iOwp7bGl0ZXJhbH0KZnVuY3Rpb24gY3JlYXRlUG9wdXAoZ2VvanNvbixsYXllcikgewoJaWYgKGdlb2pzb24ucHJvcGVydGllcykgewoJCXZhciBwb3B1cFRleHQgPSAiPGRpdiBzdHlsZT0nb3ZlcmZsb3cteTpzY3JvbGw7IG1heC1oZWlnaHQ6MjAwcHg7Jz4iOwoJCWZvciAocHJvcCBpbiBnZW9qc29uLnByb3BlcnRpZXMpIHsKCQkJdmFyIHZhbCA9IGdlb2pzb24ucHJvcGVydGllc1twcm9wXTsKCQkJaWYgKHZhbCAmJiBwcm9wICE9PSAiZ2xvYmFsaWQiICYmICFwcm9wLm1hdGNoKC9vYmplY3RpZF9cZCsvKSkgewoJCQkJcG9wdXBUZXh0ICs9ICI8Yj4iICsgcHJvcCArICI8L2I+OiIgKyB2YWwgKyAiPGJyLz4iOwoJCQl9CgkJfQoJCXBvcHVwVGV4dCArPSAiPC9kaXY+IjsKCQlsYXllci5iaW5kUG9wdXAocG9wdXBUZXh0KTsKCX0KfQoKZnVuY3Rpb24gcHJvY2Vzc1BhcmFtcyhvdmVybGF5X3BhcmFtcykgewoJdmFyIHRlcm1zID0gb3ZlcmxheV9wYXJhbXMuc3BsaXQoJzsnKTsKCXZhciBvdXRfdGVybXMgPSBuZXcgT2JqZWN0KCk7Cglmb3IoaT0wO2k8dGVybXMubGVuZ3RoO2krKykgewoJCXZhciB0ID0gdGVybXNbaV07CgkJdmFyIGtleSA9IHQuc2xpY2UoMCx0LmluZGV4T2YoJz0nKSk7CgkJdmFyIHZhbCA9IHQuc2xpY2UodC5pbmRleE9mKCc9JykgKyAxLHQubGVuZ3RoKTsKCQlvdXRfdGVybXNba2V5XSA9IHZhbDsKCX0KCXJldHVybiBvdXRfdGVybXM7Cn0KCnZhciB4ID0gaW5pdGlhbF9leHRlbnQuc3BsaXQoJy8nKVswXTsKdmFyIHkgPSBpbml0aWFsX2V4dGVudC5zcGxpdCgnLycpWzFdOwp2YXIgem9vbSA9IGluaXRpYWxfZXh0ZW50LnNwbGl0KCcvJylbMl07CnsvbGl0ZXJhbH0KdmFyIG1hcCA9IEwubWFwKCdtYXB7JHJkbWFwLT5tYXBfaWR9Jykuc2V0VmlldyhbeSx4XSx6b29tKTsKe2xpdGVyYWx9CkwudGlsZUxheWVyKGJhc2VtYXBfdXJsICsgJy90aWxlL3t6fS97eX0ve3h9JywgewoJbWF4em9vbTogMTkgfSkuYWRkVG8obWFwKTsKaWYgKG92ZXJsYXlfdXJsICE9PSBudWxsKSB7Cgl2YXIgZXNyaXBhcmFtcyA9IHsgb25FYWNoRmVhdHVyZTogY3JlYXRlUG9wdXAgfTsKCWlmIChvdmVybGF5X3BhcmFtZXRlcnMgIT09IG51bGwpIHsKCQl2YXIgcGFyYW1zID0gcHJvY2Vzc1BhcmFtcyhvdmVybGF5X3BhcmFtZXRlcnMpOwoJCWZvciAoa2V5IGluIHBhcmFtcykgewoJCQllc3JpcGFyYW1zW2tleV0gPSBwYXJhbXNba2V5XTsKCQl9Cgl9CglsYXllckZTID0gTC5lc3JpLmZlYXR1cmVMYXllcihvdmVybGF5X3VybCwgZXNyaXBhcmFtcykuYWRkVG8obWFwKTsKfQoKey9saXRlcmFsfQo8L3NjcmlwdD4K]]></data>
	</file>
</module>
