[Po4a-devel]Xml.pm

Jordi Vilalta jvprat@wanadoo.es
Sat, 17 Jul 2004 20:40:04 +0200 (CEST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---1463811584-217772048-1090089604=:12219
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hello,

I've finally sent what I have from the Xml module. Don't expect too much 
from it, it's in an initial state, with not much functionality. Currently 
it can extract the tags contents, but the attributes are in the TODO list.

I hope you get the idea on how it works. There's a list of the tag types, 
and there's a custom function (callbacks) for handling each tag type's 
translation. Modifying this tag types list you and writing the custom 
handling functions you can treat (I hope) each possible XML derivate 
format (even some non-XML formats). The documentation should clear it a 
little more.

I attach an adaptation of the Dia module and a sample Docbook module that 
work both with the Xml module. The new Dia module is fully functional (I 
like those really simple formats ;), but the Docbook one is only for 
testing. At least those are examples of how simple the derived modules can 
be.

Comments, patches, ideas, etc... are welcome.

Regards,

Jordi Vilalta
---1463811584-217772048-1090089604=:12219
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Docbook.pm"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.58.0407172040040.12219@r2d2.localdomain.com>
Content-Description: 
Content-Disposition: attachment; filename="Docbook.pm"

IyEvdXNyL2Jpbi9wZXJsDQoNCiMgUG80YTo6RG9jYm9vay5wbSANCiMgDQoj
IGV4dHJhY3QgYW5kIHRyYW5zbGF0ZSB0cmFuc2xhdGFibGUgc3RyaW5ncyBm
cm9tIERvY2Jvb2sgWE1MIGRvY3VtZW50cy4NCiMgDQojIFRoaXMgY29kZSBl
eHRyYWN0cyBwbGFpbiB0ZXh0IGZyb20gdGFncyBhbmQgYXR0cmlidXRlcyBv
biBEb2Nib29rIFhNTA0KIyBkb2N1bWVudHMuDQojDQojIENvcHlyaWdodCAo
YykgMjAwNCBieSBKb3JkaSBWaWxhbHRhICA8anZwcmF0QHdhbmFkb28uZXM+
DQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQojIGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5DQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yDQojIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQojDQojIFRoaXMgcHJv
Z3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLA0KIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KIyBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlDQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuDQojDQojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFsb25n
IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl
IFNvZnR3YXJlDQojIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwg
Q2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLg0KIw0KIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjDQoNCj1oZWFkMSBOQU1FDQoNCkxvY2FsZTo6UG80YTo6
RG9jYm9vayAtIENvbnZlcnQgRG9jYm9vayBYTUwgZG9jdW1lbnRzIGZyb20v
dG8gUE8gZmlsZXMNCg0KPWhlYWQxIFNFRSBBTFNPDQoNCkw8cG80YSg3KT4s
IEw8TG9jYWxlOjpQbzRhOjpUcmFuc1RyYWN0b3IoM3BtKT4sIEw8TG9jYWxl
OjpQbzRhOjpYbWwoM3BtKT4uDQoNCj1oZWFkMSBBVVRIT1JTDQoNCkpvcmRp
IFZpbGFsdGEgPGp2cHJhdEB3YW5hZG9vLmVzPg0KDQo9aGVhZDEgQ09QWVJJ
R0hUIEFORCBMSUNFTlNFDQoNCkNvcHlyaWdodCAoYykgMjAwNCBieSBKb3Jk
aSBWaWxhbHRhICA8anZwcmF0QHdhbmFkb28uZXM+DQoNClRoaXMgcHJvZ3Jh
bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IgbW9kaWZ5IGl0DQp1bmRlciB0aGUgdGVybXMgb2YgR1BMIChzZWUg
Q09QWUlORyBmaWxlKS4NCg0KPWN1dA0KDQpwYWNrYWdlIExvY2FsZTo6UG80
YTo6RG9jYm9vazsNCg0KdXNlIDUuMDA2Ow0KdXNlIHN0cmljdDsNCnVzZSB3
YXJuaW5nczsNCg0KdXNlIExvY2FsZTo6UG80YTo6WG1sOw0KDQp1c2UgdmFy
cyBxdyhASVNBKTsNCkBJU0EgPSBxdyhMb2NhbGU6OlBvNGE6OlhtbCk7DQoN
CnN1YiBpbml0aWFsaXplIHsNCglteSAkc2VsZiA9IHNoaWZ0Ow0KCW15ICVv
cHRpb25zID0gQF87DQoNCgkkc2VsZi0+U1VQRVI6OmluaXRpYWxpemUoJW9w
dGlvbnMpOw0KCSRzZWxmLT57b3B0aW9uc317J3N0cmlwJ309MTsNCgkkc2Vs
Zi0+e29wdGlvbnN9eyd0YWdzb25seSd9PTE7DQoJJHNlbGYtPntvcHRpb25z
fXsnZG9jdHlwZSd9PSRzZWxmLT57b3B0aW9uc317J2RvY3R5cGUnfSB8fCAn
ZG9jYm9vayB4bWwnOw0KCSRzZWxmLT57b3B0aW9uc317J3RhZ3MnfS49Jw0K
CQk8YWJicmV2Pg0KCQk8YWNyb255bT4NCgkJPGFyZz4NCgkJPGFydGhlYWRl
cj4NCgkJPGF0dHJpYnV0aW9uPg0KCQk8ZGF0ZT4NCgkJPGVudHJ5Pg0KCQk8
ZmlndXJlPg0KCQk8Z2xvc3NzZWU+DQoJCTxnbG9zc3NlZWFsc28+DQoJCTxn
bG9zc3Rlcm0+DQoJCTxob2xkZXI+DQoJCTxtZW1iZXI+DQoJCTxtc2dhdWQ+
DQoJCTxtc2dsZXZlbD4NCgkJPG1zZ29yaWc+DQoJCTxvcHRpb24+DQoJCTxv
cmduYW1lPg0KCQk8cGFyYT4NCgkJPHBocmFzZT4NCgkJPHB1YmRhdGU+DQoJ
CTxwdWJsaXNoZXJuYW1lPg0KCQk8cHJpbWFyeT4NCgkJPHJlZmNsYXNzPg0K
CQk8cmVmZGVzY3JpcHRvcj4NCgkJPHJlZmVudHJ5dGl0bGU+DQoJCTxyZWZt
aXNjaW5mbz4NCgkJPHJlZm5hbWU+DQoJCTxyZWZwdXJwb3NlPg0KCQk8cmVs
ZWFzZWluZm8+DQoJCTxyZW1hcms+DQoJCTxyZXZudW1iZXI+DQoJCTxzY3Jl
ZW5pbmZvPg0KCQk8c2VnPg0KCQk8c2VndGl0bGU+DQoJCTxzaW1wYXJhPg0K
CQk8c3VidGl0bGU+DQoJCTxzeW5vcGZyYWdtZW50cmVmPg0KCQk8dGVybT4N
CgkJPHRpdGxlPg0KCQk8dGl0bGVhYmJyZXY+JzsNCgkkc2VsZi0+e29wdGlv
bnN9eydpbmxpbmUnfS49Jw0KCQk8YWN0aW9uPg0KCQk8YWZmaWxpYXRpb24+
DQoJCTxhbmNob3I+DQoJCTxhcHBsaWNhdGlvbj4NCgkJPGF1dGhvcj4NCgkJ
PGF1dGhvcmluaXRpYWxzPg0KCQk8Y29tbWFuZD4NCgkJPGNpdGF0aW9uPg0K
CQk8Y2l0ZXJlZmVudHJ5Pg0KCQk8Y2l0ZXRpdGxlPg0KCQk8Y2xhc3NuYW1l
Pg0KCQk8Y28+DQoJCTxjb21wdXRlcm91dHB1dD4NCgkJPGNvbnN0YW50Pg0K
CQk8Y29ycGF1dGhvcj4NCgkJPGRhdGFiYXNlPg0KCQk8ZW1haWw+DQoJCTxl
bXBoYXNpcz4NCgkJPGVudmFyPg0KCQk8ZXJyb3Jjb2RlPg0KCQk8ZXJyb3Ju
YW1lPg0KCQk8ZXJyb3J0ZXh0Pg0KCQk8ZXJyb3J0eXBlPg0KCQk8ZXhjZXB0
aW9ubmFtZT4NCgkJPGZpbGVuYW1lPg0KCQk8Zmlyc3RuYW1lPg0KCQk8Zmly
c3R0ZXJtPg0KCQk8Zm9vdG5vdGU+DQoJCTxmb290bm90ZXJlZj4NCgkJPGZv
cmVpZ25waHJhc2U+DQoJCTxmdW5jdGlvbj4NCgkJPGdsb3NzdGVybT4NCgkJ
PGd1aWJ1dHRvbj4NCgkJPGd1aWljb24+DQoJCTxndWlsYWJlbD4NCgkJPGd1
aW1lbnU+DQoJCTxndWltZW51aXRlbT4NCgkJPGd1aXN1Ym1lbnU+DQoJCTxo
YXJkd2FyZT4NCgkJPGluZGV4dGVybT4NCgkJPGluZm9ybWFsZXhhbXBsZT4N
CgkJPGlubGluZWVxdWF0aW9uPg0KCQk8aW5saW5lZ3JhcGhpYz4NCgkJPGlu
bGluZW1lZGlhb2JqZWN0Pg0KCQk8aW50ZXJmYWNlPg0KCQk8aW50ZXJmYWNl
bmFtZT4NCgkJPGtleWNhcD4NCgkJPGtleWNvZGU+DQoJCTxrZXljb21ibz4N
CgkJPGtleXN5bT4NCgkJPGxpbms+DQoJCTxsaXRlcmFsPg0KCQk8bWFudm9s
bnVtPg0KCQk8bWFya3VwPg0KCQk8bWVkaWFsYWJlbD4NCgkJPG1lbnVjaG9p
Y2U+DQoJCTxtZXRob2RuYW1lPg0KCQk8bW9kZXNwZWM+DQoJCTxtb3VzZWJ1
dHRvbj4NCgkJPG5vbnRlcm1pbmFsPg0KCQk8b2xpbms+DQoJCTxvb2NsYXNz
Pg0KCQk8b29leGNlcHRpb24+DQoJCTxvb2ludGVyZmFjZT4NCgkJPG9wdGlv
bmFsPg0KCQk8b3RoZXJjcmVkaXQ+DQoJCTxwYXJhbWV0ZXI+DQoJCTxwZXJz
b25uYW1lPg0KCQk8cGhyYXNlPg0KCQk8cHJvZHVjdG5hbWU+DQoJCTxwcm9k
dWN0bnVtYmVyPg0KCQk8cHJvbXB0Pg0KCQk8cHJvcGVydHk+DQoJCTxxdW90
ZT4NCgkJPHJlbWFyaz4NCgkJPHJlcGxhY2VhYmxlPg0KCQk8cmV0dXJudmFs
dWU+DQoJCTxyZXZoaXN0b3J5Pg0KCQk8c2dtbHRhZz4NCgkJPHNpZGViYXI+
DQoJCTxzdHJ1Y3RmaWVsZD4NCgkJPHN0cnVjdG5hbWUNCgkJPHN1YnNjcmlw
dD4NCgkJPHN1cGVyc2NyaXB0Pg0KCQk8c3VybmFtZT4NCgkJPHN5bWJvbD4N
CgkJPHN5c3RlbWl0ZW0+DQoJCTx0b2tlbj4NCgkJPHRyYWRlbWFyaz4NCgkJ
PHR5cGU+DQoJCTx1bGluaz4NCgkJPHVzZXJpbnB1dD4NCgkJPHZhcm5hbWU+
DQoJCTx3b3JkYXN3b3JkPg0KCQk8eHJlZj4NCgkJPHllYXI+JzsNCgkkc2Vs
Zi0+dHJlYXRfb3B0aW9uczsNCn0NCg==

---1463811584-217772048-1090089604=:12219
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Dia2.pm"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.58.0407172040041.12219@r2d2.localdomain.com>
Content-Description: 
Content-Disposition: attachment; filename="Dia2.pm"

IyEvdXNyL2Jpbi9wZXJsDQoNCiMgUG80YTo6RGlhLnBtIA0KIyANCiMgZXh0
cmFjdCBhbmQgdHJhbnNsYXRlIHRyYW5zbGF0YWJsZSBzdHJpbmdzIGZyb20g
RGlhIGRpYWdyYW1zLg0KIyANCiMgVGhpcyBjb2RlIGV4dHJhY3RzIHBsYWlu
IHRleHQgZnJvbSBzdHJpbmcgdGFncyBvbiB1bmNvbXByZXNzZWQgRGlhDQoj
IGRpYWdyYW1zLg0KIw0KIyBDb3B5cmlnaHQgKGMpIDIwMDQgYnkgSm9yZGkg
VmlsYWx0YSAgPGp2cHJhdEB3YW5hZG9vLmVzPg0KIw0KIyBUaGlzIHByb2dy
YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yIG1vZGlmeQ0KIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQ0KIyB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvcg0KIyAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiMgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YNCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KIyBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KIw0KIyBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3Jh
bTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQ0KIyBGb3Vu
ZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIx
MzksIFVTQS4NCiMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQo9
aGVhZDEgTkFNRQ0KDQpMb2NhbGU6OlBvNGE6OkRpYSAtIENvbnZlcnQgdW5j
b21wcmVzc2VkIERpYSBkaWFncmFtcyBmcm9tL3RvIFBPIGZpbGVzDQoNCj1o
ZWFkMSBERVNDUklQVElPTg0KDQpUaGUgZ29hbCBwbzRhIFtwbyBmb3IgYW55
dGhpbmddIHByb2plY3QgaXMgdG8gZWFzZSB0cmFuc2xhdGlvbnMgKGFuZCBt
b3JlDQppbnRlcmVzdGluZ2x5LCB0aGUgbWFpbnRlbmFuY2Ugb2YgdHJhbnNs
YXRpb24pIHVzaW5nIGdldHRleHQgdG9vbHMgb24gYXJlYXMNCndoZXJlIHRo
ZXkgd2VyZSBub3QgZXhwZWN0ZWQgbGlrZSBkb2N1bWVudGF0aW9uLiANCg0K
TG9jYWxlOjpQbzRhOjpEaWEgaXMgYSBtb2R1bGUgdG8gaGVscCB0aGUgdHJh
bnNsYXRpb24gb2YgZGlhZ3JhbXMgaW4gdGhlDQp1bmNvbXByZXNzZWQgRGlh
IGZvcm1hdCBpbnRvIG90aGVyIFtodW1hbl0gbGFuZ3VhZ2VzLg0KDQpZb3Ug
Y2FuIGdldCBEaWEgKHRoZSBncmFwaGljYWwgZWRpdG9yIGZvciB0aGVzZSBk
aWFncmFtcykgZnJvbToNCiAgaHR0cDovL3d3dy5nbm9tZS5vcmcvcHJvamVj
dHMvZGlhLw0KDQo9aGVhZDEgVFJBTlNMQVRJTkcgV0lUSCBQTzRBOjpESUEN
Cg0KVGhpcyBtb2R1bGUgb25seSB0cmFuc2xhdGVzIHVuY29tcHJlc3NlZCBE
aWEgZGlhZ3JhbXMuICBZb3UgY2FuIHNhdmUgeW91cg0KdW5jb21wcmVzc2Vk
IGRpYWdyYW1zIHdpdGggRGlhIGl0c2VsZiwgdW5jaGVja2luZyB0aGUgIkNv
bXByZXNzIGRpYWdyYW0NCmZpbGVzIiBhdCB0aGUgIlNhdmUgRGlhZ3JhbSIg
ZGlhbG9nLg0KDQpBbm90aGVyIHdheSBpcyB0byB1bmNvbXByZXNzIHRoZSBk
aWEgZmlsZXMgZnJvbSBjb21tYW5kIGxpbmUgd2l0aDoNCiAgZ3VuemlwIDwg
b3JpZ2luYWwuZGlhID4gdW5jb21wcmVzc2VkLmRpYQ0KDQo9aGVhZDEgU1RB
VFVTIE9GIFRISVMgTU9EVUxFDQoNClRoaXMgbW9kdWxlIGlzIGZ1bGx5IGZ1
bmN0aW9uYWwsIGFzIGl0IHJlbGllcyBpbiB0aGUgTG9jYWxlOjpQbzRhOjpY
bWwgbW9kdWxlLg0KVGhpcyBvbmx5IGRlZmluZXMgdGhlIHRyYW5zbGF0ZWFi
bGUgdGFncyAoRTxsdD5kaWE6c3RyaW5nRTxndD4pLCBhbmQgZmlsdGVycw0K
dGhlIGludGVybmFsIHN0cmluZ3MgKHRoZSBjb250ZW50IG9mIHRoZSBFPGx0
PmRpYTpkaWFncmFtZGF0YUU8Z3Q+IHRhZyksIG5vdA0KaW50ZXJlc3Rpbmcg
Zm9yIHRyYW5zbGF0aW9uKS4NCg0KKE5FRURTIEFOIFVQREFURSkNCg0KQ3Vy
cmVudGx5IGl0IHRyaWVzIHRvIGdldCB0aGUgZGlhZ3JhbSBlbmNvZGluZyBm
cm9tIHRoZSBmaXJzdCBsaW5lICh0aGUgeG1sDQpkZWNsYXJhdGlvbiksIGFu
ZCBlbHNlIGl0IGFzc3VtZXMgVVRGLTgsIGFuZCBjcmVhdGVzIHRoZSAucG8g
Y29udGVucyBpbiB0aGUNCklTTy04ODU5LTEgY2hhcmFjdGVyIHNldC4gIEl0
IHdvdWxkIGJlIG5pY2UgaWYgaXQgY291bGQgcmVhZCB0aGUgY29tbWFuZCBs
aW5lDQplbmNvZGluZyBvcHRpb25zLCBidXQgSSBoYXZlbid0IHdhdGNoZWQg
aG93IHRvIGRvIGl0Lg0KDQpJdCB1c2VzIExvY2FsZTo6UmVjb2RlIGZyb20g
dGhlIHBhY2thZ2UgbGliaW50bCB0byByZWNvZGUgdGhlIGNoYXJhY3Rlcg0K
c2V0cy4gIFlvdSBjYW4gZ2V0IGl0IGZyb20gaHR0cDovL3NlYXJjaC5jcGFu
Lm9yZy9+Z3VpZG8vbGliaW50bC1wZXJsLTEuMTAvDQpUaGVyZSBtYXkgYmUg
YSBiZXR0ZXIgb3IgbW9yZSBzdGFuZGFyZCBtb2R1bGUgdG8gZG8gdGhpcywg
YnV0IEkgZGlkbid0IGtub3cuDQpZb3UncmUgd2VsY29tZSB0byBpbXByb3Zl
IGl0Lg0KDQo9aGVhZDEgU0VFIEFMU08NCg0KTDxwbzRhKDcpPiwgTDxMb2Nh
bGU6OlBvNGE6OlRyYW5zVHJhY3RvcigzcG0pPiwgTDxMb2NhbGU6OlBvNGE6
OlhtbCgzcG0pPi4NCg0KPWhlYWQxIEFVVEhPUlMNCg0KSm9yZGkgVmlsYWx0
YSA8anZwcmF0QHdhbmFkb28uZXM+DQoNCj1oZWFkMSBDT1BZUklHSFQgQU5E
IExJQ0VOU0UNCg0KQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEpvcmRpIFZpbGFs
dGEgIDxqdnByYXRAd2FuYWRvby5lcz4NCg0KVGhpcyBwcm9ncmFtIGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt
b2RpZnkgaXQNCnVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKHNlZSBDT1BZSU5H
IGZpbGUpLg0KDQo9Y3V0DQoNCnBhY2thZ2UgTG9jYWxlOjpQbzRhOjpEaWEy
Ow0KDQp1c2UgNS4wMDY7DQp1c2Ugc3RyaWN0Ow0KdXNlIHdhcm5pbmdzOw0K
DQp1c2UgTG9jYWxlOjpQbzRhOjpYbWw7DQoNCnVzZSB2YXJzIHF3KEBJU0Ep
Ow0KQElTQSA9IHF3KExvY2FsZTo6UG80YTo6WG1sKTsNCg0Kc3ViIGluaXRp
YWxpemUgew0KCW15ICRzZWxmID0gc2hpZnQ7DQoJbXkgJW9wdGlvbnMgPSBA
XzsNCg0KCSRzZWxmLT5TVVBFUjo6aW5pdGlhbGl6ZSglb3B0aW9ucyk7DQoJ
JHNlbGYtPntvcHRpb25zfXsndGFnc29ubHknfT0xOw0KCSRzZWxmLT57b3B0
aW9uc317J3RhZ3MnfS49JyA8ZGlhOnN0cmluZz4nOw0KCSRzZWxmLT50cmVh
dF9vcHRpb25zOw0KfQ0KDQpzdWIgZm91bmRfc3RyaW5nIHsNCglteSAoJHNl
bGYsJHRleHQsJHJlZiwkY29tbWVudCk9QF87DQoNCgkjV2Ugc2tpcCB0aGUg
cGFwZXIgdHlwZSBzdHJpbmcNCglpZiAoICRjb21tZW50ICF+IC88ZGlhOmRp
YWdyYW1kYXRhPi8gKSB7DQoJCSR0ZXh0ID1+IC9eIyguKikjJC9zOw0KCQkk
dGV4dCA9ICIjIi4kc2VsZi0+dHJhbnNsYXRlKCQxLCRyZWYsJGNvbW1lbnQs
DQoJCQknd3JhcCc9PiRzZWxmLT57b3B0aW9uc317J3dyYXAnfSkuIiMiOw0K
CX0NCg0KCXJldHVybiAkdGV4dDsNCn0NCg==

---1463811584-217772048-1090089604=:12219--