forked from silverbulletmd/silverbullet-plug-template
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathgraphview.plug.json
37 lines (37 loc) · 485 KB
/
graphview.plug.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"name": "graphview",
"imports": [
"https://get.silverbullet.md/global.plug.json"
],
"version": 0.1,
"assets": {
"style.css": "data:text/css;base64,dGV4dC5zdmd0ZXh0OmhvdmVyIHsKICBmaWxsOiAjMTcxMTVlOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGN1cnNvcjogcG9pbnRlcjsKfQoKYm9keSB7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQ==",
"asset/force-graph.js": "data:application/javascript;base64,Ly8KLy8gU2V0dGluZ3MgYWRkZWQgYnkgV2lsbGVtIEhlbmRyaWtzCi8vICghKSB0byBiZSBhZGRlZCB0byB5YW1sIG9yIG90aGVyIHNldHRpbmdzIGNvbmZpZwovLwovLwovLyBMQUJFTCBTRVRUSU5HUwpjb25zdCBMQUJFTF9NQVJHSU4gPSAyMjsgLy8gbWFyZ2luIGJldHdlZW4gbGFiZWwtdGV4dCBhbmQgbm9kZSwgaGlnaGVyIG51bWJlciAtPiBtb3JlIHNwYWNlCmNvbnN0IExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSyA9IDEuNTsgLy8gYXQgdGhpcyBrLCBsYWJlbHMgYXJlIHN0aWxsIGludmlzaWJsZQpjb25zdCBMQUJFTF9WSVNJQklMSVRZX0VORF9LID0gNTsgLy8gYXQgdGhpcyBrLCBsYWJlbHMgYXJlIGZ1bGx5IHZpc2libGUKY29uc3QgTEFCRUxfVFJVTkNBVElPTl9MRU5HVEggPSAyMDsgLy8gbWF4IGxlbmd0aCBvZiB3b3JkIGluIGxhYmVsCgovLyBDb3B5cmlnaHQgMjAyMSBPYnNlcnZhYmxlLCBJbmMuCi8vIFJlbGVhc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS4KLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BkMy9kaXNqb2ludC1mb3JjZS1kaXJlY3RlZC1ncmFwaApmdW5jdGlvbiBGb3JjZUdyYXBoKHsKICBub2RlcywgLy8gYW4gaXRlcmFibGUgb2Ygbm9kZSBvYmplY3RzICh0eXBpY2FsbHkgW3tpZH0sIOKApl0pCiAgbGlua3MgLy8gYW4gaXRlcmFibGUgb2YgbGluayBvYmplY3RzICh0eXBpY2FsbHkgW3tzb3VyY2UsIHRhcmdldH0sIOKApl0pCn0sIHsKICBub2RlSWQgPSBkID0+IGQuaWQsIC8vIGdpdmVuIGQgaW4gbm9kZXMsIHJldHVybnMgYSB1bmlxdWUgaWRlbnRpZmllciAoc3RyaW5nKQogIG5vZGVHcm91cCwgLy8gZ2l2ZW4gZCBpbiBub2RlcywgcmV0dXJucyBhbiAob3JkaW5hbCkgdmFsdWUgZm9yIGNvbG9yCiAgbm9kZUdyb3VwcywgLy8gYW4gYXJyYXkgb2Ygb3JkaW5hbCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBub2RlIGdyb3VwcwogIG5vZGVUaXRsZSwgLy8gZ2l2ZW4gZCBpbiBub2RlcywgYSB0aXRsZSBzdHJpbmcKICBub2RlRmlsbCA9ICJjdXJyZW50Q29sb3IiLCAvLyBub2RlIHN0cm9rZSBmaWxsIChpZiBub3QgdXNpbmcgYSBncm91cCBjb2xvciBlbmNvZGluZykKICBub2RlU3Ryb2tlID0gIiNmZmYiLCAvLyBub2RlIHN0cm9rZSBjb2xvcgogIG5vZGVTdHJva2VXaWR0aCA9IDEuNSwgLy8gbm9kZSBzdHJva2Ugd2lkdGgsIGluIHBpeGVscwogIG5vZGVTdHJva2VPcGFjaXR5ID0gMSwgLy8gbm9kZSBzdHJva2Ugb3BhY2l0eQogIG5vZGVTdHJlbmd0aCwKICBsaW5rU291cmNlID0gKHsgc291cmNlIH0pID0+IHNvdXJjZSwgLy8gZ2l2ZW4gZCBpbiBsaW5rcywgcmV0dXJucyBhIG5vZGUgaWRlbnRpZmllciBzdHJpbmcKICBsaW5rVGFyZ2V0ID0gKHsgdGFyZ2V0IH0pID0+IHRhcmdldCwgLy8gZ2l2ZW4gZCBpbiBsaW5rcywgcmV0dXJucyBhIG5vZGUgaWRlbnRpZmllciBzdHJpbmcKICBsaW5rU3Ryb2tlID0gIiM5OTkiLCAvLyBsaW5rIHN0cm9rZSBjb2xvcgogIGxpbmtTdHJva2VPcGFjaXR5ID0gMC42LCAvLyBsaW5rIHN0cm9rZSBvcGFjaXR5CiAgbGlua1N0cm9rZVdpZHRoID0gMS41LCAvLyBnaXZlbiBkIGluIGxpbmtzLCByZXR1cm5zIGEgc3Ryb2tlIHdpZHRoIGluIHBpeGVscwogIGxpbmtTdHJva2VMaW5lY2FwID0gInJvdW5kIiwgLy8gbGluayBzdHJva2UgbGluZWNhcAogIGxpbmtTdHJlbmd0aCwKICBjb2xvcnMgPSBkMy5zY2hlbWVUYWJsZWF1MTAsIC8vIGFuIGFycmF5IG9mIGNvbG9yIHN0cmluZ3MsIGZvciB0aGUgbm9kZSBncm91cHMKICB3aWR0aCA9IDY0MCwgLy8gb3V0ZXIgd2lkdGgsIGluIHBpeGVscwogIGhlaWdodCA9IDQwMCwgLy8gb3V0ZXIgaGVpZ2h0LCBpbiBwaXhlbHMKICBpbnZhbGlkYXRpb24gLy8gd2hlbiB0aGlzIHByb21pc2UgcmVzb2x2ZXMsIHN0b3AgdGhlIHNpbXVsYXRpb24KfSA9IHt9KSB7CiAgLy8gQ29tcHV0ZSB2YWx1ZXMuCgogIGNvbnN0IE4gPSBkMy5tYXAobm9kZXMsIG5vZGVJZCkubWFwKGludGVybik7CiAgY29uc3QgQyA9IGQzLm1hcChub2Rlcywgbm9kZUNvbm5lY3Rpdml0eS5iaW5kKG51bGwsIGxpbmtzKSk7CiAgY29uc3QgQ09MID0gZDMubWFwKG5vZGVzLCBkID0+IGQuY29sb3IpLm1hcChpbnRlcm4pOwogIGNvbnN0IExTID0gZDMubWFwKGxpbmtzLCBsaW5rU291cmNlKS5tYXAoaW50ZXJuKTsKICBjb25zdCBMVCA9IGQzLm1hcChsaW5rcywgbGlua1RhcmdldCkubWFwKGludGVybik7CiAgaWYgKG5vZGVUaXRsZSA9PT0gdW5kZWZpbmVkKSBub2RlVGl0bGUgPSAoXywgaSkgPT4gTltpXTsKICBjb25zdCBUID0gbm9kZVRpdGxlID09IG51bGwgPyBudWxsIDogZDMubWFwKG5vZGVzLCBub2RlVGl0bGUpOwogIGNvbnN0IEcgPSBub2RlR3JvdXAgPT0gbnVsbCA/IG51bGwgOiBkMy5tYXAobm9kZXMsIG5vZGVHcm91cCkubWFwKGludGVybik7CiAgY29uc3QgVyA9IHR5cGVvZiBsaW5rU3Ryb2tlV2lkdGggIT09ICJmdW5jdGlvbiIgPyBudWxsIDogZDMubWFwKGxpbmtzLCBsaW5rU3Ryb2tlV2lkdGgpOwoKICAvLyBSZXBsYWNlIHRoZSBpbnB1dCBub2RlcyBhbmQgbGlua3Mgd2l0aCBtdXRhYmxlIG9iamVjdHMgZm9yIHRoZSBzaW11bGF0aW9uLgogIG5vZGVzID0gZDMubWFwKG5vZGVzLCAoXywgaSkgPT4gKHsgaWQ6IE5baV0sIGNvbm5lY3Rpdml0eTogQ1tpXSwgY29sb3I6IENPTFtpXSB9KSk7CiAgbGlua3MgPSBkMy5tYXAobGlua3MsIChfLCBpKSA9PiAoeyBzb3VyY2U6IExTW2ldLCB0YXJnZXQ6IExUW2ldIH0pKTsKCiAgLy8gQ29tcHV0ZSBub2RlIGNvbm5lY3Rpdml0eQogIGZ1bmN0aW9uIGlzQ29ubmVjdGluZyhub2RlLCBsaW5rKSB7CiAgICByZXR1cm4gbGluay5zb3VyY2UgPT0gbm9kZS5pZCB8fCBsaW5rLnRhcmdldCA9PSBub2RlLmlkOwogIH0KCiAgZnVuY3Rpb24gbm9kZUNvbm5lY3Rpdml0eShsaW5rcywgbm9kZSkgewogICAgcmV0dXJuIGxpbmtzLnJlZHVjZSgoYWNjLCBjdXJyZW50TGluaykgPT4gewogICAgICByZXR1cm4gYWNjICsgKGlzQ29ubmVjdGluZyhub2RlLCBjdXJyZW50TGluaykgPyAxIDogMCk7CiAgICB9LCAwKTsKICB9CgogIC8vIENvbXB1dGUgZGVmYXVsdCBkb21haW5zLgogIGlmIChHICYmIG5vZGVHcm91cHMgPT09IHVuZGVmaW5lZCkgbm9kZUdyb3VwcyA9IGQzLnNvcnQoRyk7CgogIC8vIENvbnN0cnVjdCB0aGUgc2NhbGVzLgogIGNvbnN0IGNvbG9yID0gbm9kZUdyb3VwID09IG51bGwgPyBudWxsIDogZDMuc2NhbGVPcmRpbmFsKG5vZGVHcm91cHMsIGNvbG9ycyk7CgogIC8vIENvbnN0cnVjdCB0aGUgZm9yY2VzLgogIGNvbnN0IGZvcmNlTm9kZSA9IGQzLmZvcmNlTWFueUJvZHkoKTsKICBjb25zdCBmb3JjZUxpbmsgPSBkMy5mb3JjZUxpbmsobGlua3MpLmlkKCh7IGluZGV4OiBpIH0pID0+IE5baV0pOwogIGlmIChub2RlU3RyZW5ndGggIT09IHVuZGVmaW5lZCkgZm9yY2VOb2RlLnN0cmVuZ3RoKG5vZGVTdHJlbmd0aCk7CiAgaWYgKGxpbmtTdHJlbmd0aCAhPT0gdW5kZWZpbmVkKSBmb3JjZUxpbmsuc3RyZW5ndGgobGlua1N0cmVuZ3RoKTsKCiAgY29uc3Qgc3ZnID0gZDMuY3JlYXRlKCJzdmciKQogICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAuYXR0cigiaGVpZ2h0IiwgaGVpZ2h0KQogICAgLmF0dHIoInZpZXdCb3giLCBbLXdpZHRoIC8gMiwgLWhlaWdodCAvIDIsIHdpZHRoLCBoZWlnaHRdKQogICAgLmF0dHIoInN0eWxlIiwgIm1heC13aWR0aDogMTAwJTsgaGVpZ2h0OiBhdXRvOyBoZWlnaHQ6IGludHJpbnNpYzsiKTsKCiAgY29uc3QgbGluayA9IHN2Zy5hcHBlbmQoImciKQogICAgLmF0dHIoInN0cm9rZSIsIGxpbmtTdHJva2UpCiAgICAuYXR0cigic3Ryb2tlLW9wYWNpdHkiLCBsaW5rU3Ryb2tlT3BhY2l0eSkKICAgIC5hdHRyKCJzdHJva2Utd2lkdGgiLCB0eXBlb2YgbGlua1N0cm9rZVdpZHRoICE9PSAiZnVuY3Rpb24iID8gbGlua1N0cm9rZVdpZHRoIDogbnVsbCkKICAgIC5hdHRyKCJzdHJva2UtbGluZWNhcCIsIGxpbmtTdHJva2VMaW5lY2FwKQogICAgLnNlbGVjdEFsbCgibGluZSIpCiAgICAuZGF0YShsaW5rcykKICAgIC5qb2luKCJsaW5lIik7CgogIGlmIChXKSBsaW5rLmF0dHIoInN0cm9rZS13aWR0aCIsICh7IGluZGV4OiBpIH0pID0+IFdbaV0pOwoKICAvLyBTY2FsZXMgZm9yIG5vZGUgc2l6ZSBiYXNlZCBvbiBjb25uZWN0aXZpdHkKICBjb25zdCBub2RlU2l6ZVNjYWxlID0gZDMuc2NhbGVMaW5lYXIoKQogICAgLmRvbWFpbihbZDMubWluKEMpLCBkMy5tYXgoQyldKQogICAgLnJhbmdlKFszLCAxMl0pOwoKICAvLyBzY2FsZXMgZm9yIGxhYmVsIHNpemUgYmFzZWQgb24gY29ubmVjdGl2aXR5CiAgY29uc3QgbGFiZWxTaXplU2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpCiAgICAuZG9tYWluKFtkMy5taW4oQyksIGQzLm1heChDKV0pCiAgICAucmFuZ2UoWzAuNiwgMS4yXSk7CgogIGNvbnN0IG5vZGUgPSBzdmcuYXBwZW5kKCJnIikKICAgIC5hdHRyKCJzdHJva2Utb3BhY2l0eSIsIG5vZGVTdHJva2VPcGFjaXR5KQogICAgLmF0dHIoInN0cm9rZS13aWR0aCIsIG5vZGVTdHJva2VXaWR0aCkKICAgIC5zZWxlY3RBbGwoImNpcmNsZSIpCiAgICAuZGF0YShub2RlcykKICAgIC5qb2luKCJjaXJjbGUiKQogICAgLmF0dHIoInIiLCBkID0+IG5vZGVTaXplU2NhbGUoZC5jb25uZWN0aXZpdHkpKQogICAgLmF0dHIoInN0cm9rZSIsIGQgPT4gYCMke2QuY29sb3J9YCkKICAgIC5hdHRyKCJmaWxsIiwgZCA9PiBgIyR7ZC5jb2xvcn1gKTsKCiAgY29uc3QgbGFiZWxzID0gc3ZnLmFwcGVuZCgiZyIpCiAgICAuc2VsZWN0QWxsKCJ0ZXh0IikKICAgIC5kYXRhKG5vZGVzKQogICAgLmpvaW4oJ3RleHQnKQogICAgLnRleHQoZCA9PiB7CiAgICAgIGlmIChbLi4uZC5pZF0ubGVuZ3RoIDwgTEFCRUxfVFJVTkNBVElPTl9MRU5HVEgpIHJldHVybiBkLmlkCiAgICAgIGVsc2UgewogICAgICAgIGNvbnN0IGlkID0gZC5pZDsKICAgICAgICBjb25zdCBzcGxpdCA9IGlkLnNwbGl0KCcvJykKICAgICAgICBjb25zdCBsYXN0X2VsZW1lbnQgPSBzcGxpdC5wb3AoKQogICAgICAgIGNvbnN0IHJlc3VsdCA9IHNwbGl0Lm1hcCgoZSwgaSkgPT4gewogICAgICAgICAgcmV0dXJuIFsuLi5lXS5zbGljZSgwLCBNYXRoLm1pbig1LCBbLi4uZV0ubGVuZ3RoKSkuam9pbignJyk7CiAgICAgICAgfSkKICAgICAgICByZXN1bHQucHVzaChsYXN0X2VsZW1lbnQpOwogICAgICAgIHJldHVybiByZXN1bHQuam9pbignLi8nKTsKICAgICAgfQogICAgfSkKICAgIC5hdHRyKCdmb250LWZhbWlseScsICdTYW5zLEFyaWFsJykKICAgIC5hdHRyKCdmb250LXNpemUnLCBkID0+IGAke2xhYmVsU2l6ZVNjYWxlKGQuY29ubmVjdGl2aXR5KX1lbWApCiAgICAuYXR0cignZmlsbCcsICcjMjIyJykKICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgLmF0dHIoJ2NsYXNzJywgJ3N2Z3RleHQnKQogICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChldmVudCwgZCkgewogICAgICBzZW5kRXZlbnQoJ2dyYXBodmlldzpuYXZpZ2F0ZVRvJywgZC5pZCk7CiAgICB9KTsKCiAgaWYgKEcpIG5vZGUuYXR0cigiZmlsbCIsICh7IGluZGV4OiBpIH0pID0+IGNvbG9yKEdbaV0pKTsKICBpZiAoVCkgbm9kZS5hcHBlbmQoInRpdGxlIikudGV4dCgoeyBpbmRleDogaSB9KSA9PiBUW2ldKTsKCiAgLy8gSGFuZGxlIGludmFsaWRhdGlvbi4KICBpZiAoaW52YWxpZGF0aW9uICE9IG51bGwpIGludmFsaWRhdGlvbi50aGVuKCgpID0+IHNpbXVsYXRpb24uc3RvcCgpKTsKCiAgZnVuY3Rpb24gaW50ZXJuKHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlOwogIH0KCiAgY29uc3Qgc2ltdWxhdGlvbiA9IGQzLmZvcmNlU2ltdWxhdGlvbihub2RlcykKICAgIC5mb3JjZSgibGluayIsIGZvcmNlTGluaykKICAgIC5mb3JjZSgiY2hhcmdlIiwgZm9yY2VOb2RlKQogICAgLmZvcmNlKCJ4IiwgZDMuZm9yY2VYKCkpCiAgICAuZm9yY2UoInkiLCBkMy5mb3JjZVkoKSkKICAgIC5vbigidGljayIsIHRpY2tlZCkKICAgIC5zdG9wKCk7IC8vIERvbid0IHN0YXJ0IHRoZSBzaW11bGF0aW9uIGF1dG9tYXRpY2FsbHkuCgogIC8vIE5vdGU6IFRoaXMgbWFudWFsIGRyYXdpbmcgb2YgdGhlIHNpbXVsYXRpb24gaXMgbmVjZXNzYXJ5IHRvIGZpeCBicm9rZW4gem9vbWluZyBpbiB0aGUgZmlyc3Qgc2Vjb25kcwogIC8vIG9mIHRoZSBwYWdlIGxvYWQgd2hpbGUgdGhlIHNpbXVsYXRpb24gaXMgcnVubmluZy4KICBzaW11bGF0aW9uLnRpY2soMzAwKTsgLy8gUnVuIHRoZSBzaW11bGF0aW9uIGZvciAzMDAgdGlja3MsIGJ1dCB3aXRob3V0IGRyYXdpbmcuCiAgdGlja2VkKCk7IC8vIERyYXcgb25jZSBhZnRlciB0aGUgc2ltdWxhdGlvbiBoYXMgc3RhYmlsaXplZC4KCiAgZnVuY3Rpb24gdGlja2VkKCkgewogICAgbGluawogICAgICAuYXR0cigieDEiLCBkID0+IGQuc291cmNlLngpCiAgICAgIC5hdHRyKCJ5MSIsIGQgPT4gZC5zb3VyY2UueSkKICAgICAgLmF0dHIoIngyIiwgZCA9PiBkLnRhcmdldC54KQogICAgICAuYXR0cigieTIiLCBkID0+IGQudGFyZ2V0LnkpOwoKICAgIG5vZGUKICAgICAgLmF0dHIoImN4IiwgZCA9PiBkLngpCiAgICAgIC5hdHRyKCJjeSIsIGQgPT4gZC55KTsKCiAgICBsYWJlbHMKICAgICAgLmF0dHIoJ3gnLCBkID0+IGQueCkKICAgICAgLmF0dHIoJ3knLCBkID0+IGQueSk7CiAgfQoKICAvLyBab29tCiAgZnVuY3Rpb24gcmVzaXplTm9kZShkLCBrKSB7CiAgICAvLyBUT0RPOiBNYWtlIHN1cmUgZCBoYXMgc29tZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29ubmVjdGVkbmVzcyBvZiBhCiAgICAvLyBub2RlIHNvIHRoYXQgd2UgY2FuIHZhcnkgbm9kZSBzaXplcyBiYXNlZCBvbiB0aGF0LgogICAgY29uc3QgbWluID0gbm9kZVNpemVTY2FsZShkLmNvbm5lY3Rpdml0eSk7CiAgICBjb25zdCBjdXIgPSBub2RlU2l6ZVNjYWxlKGQuY29ubmVjdGl2aXR5KSAqIE1hdGgubG9nKGspOwogICAgcmV0dXJuIE1hdGgubWF4KG1pbiwgY3VyKTsKICB9CgogIGZ1bmN0aW9uIHpvb21lZChldmVudCkgewogICAgY29uc3QgdCA9IGV2ZW50LnRyYW5zZm9ybTsKICAgIGNvbnN0IHRyYW5zbGF0ZSA9ICJ0cmFuc2xhdGUoIiArIHQueCArICIsIiArIHQueSArICIpIgogICAgbm9kZQogICAgICAuYXR0cigiY3giLCBkID0+IGQueCAqIHQuaykKICAgICAgLmF0dHIoImN5IiwgZCA9PiBkLnkgKiB0LmspCiAgICAgIC5hdHRyKCJyIiwgZCA9PiByZXNpemVOb2RlKGQsIHQuaykpCiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUpOwogICAgbGluawogICAgICAuYXR0cigieDEiLCBkID0+IGQuc291cmNlLnggKiB0LmspCiAgICAgIC5hdHRyKCJ5MSIsIGQgPT4gZC5zb3VyY2UueSAqIHQuaykKICAgICAgLmF0dHIoIngyIiwgZCA9PiBkLnRhcmdldC54ICogdC5rKQogICAgICAuYXR0cigieTIiLCBkID0+IGQudGFyZ2V0LnkgKiB0LmspCiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUpOwogICAgbGFiZWxzCiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGUpCiAgICAgIC5hdHRyKCd4JywgZCA9PiBkLnggKiB0LmspCiAgICAgIC5hdHRyKCd5JywgZCA9PiBkLnkgKiB0LmsgKyBMQUJFTF9NQVJHSU4gKyByZXNpemVOb2RlKGQsIHQuaykpCiAgICAgIC5hdHRyKCdvcGFjaXR5Jywgb3BhY2l0eV9hY3RpdmF0aW9uKGV2ZW50LnRyYW5zZm9ybS5rKSk7CgogIH0KCiAgY29uc3Qgem9vbSA9IGQzLnpvb20oKQogICAgLnNjYWxlRXh0ZW50KFsxIC8gMiwgNjRdKQogICAgLm9uKCJ6b29tIiwgem9vbWVkKTsKCiAgc3ZnLmNhbGwoem9vbSkKICAgIC5jYWxsKHpvb20udHJhbnNsYXRlVG8sIDAsIDApOwoKCiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oc3ZnLm5vZGUoKSwgeyBzY2FsZXM6IHsgY29sb3IgfSB9KTsKfQoKCmZ1bmN0aW9uIG9wYWNpdHlfYWN0aXZhdGlvbih6b29tX2xldmVsKSB7CiAgLyogU3VtbWFyeTogcmV0dXJucyBvcGFjaXR5IHZhbHVlLCBkZXBlbmRpbmcgb24gem9vbSBsZXZlbCBrCiAgICoKICAgKiBvcGFjaXR5IGlzIGEgdmFsdWUgYmV0d2VuIFswLDFdIHdoZXJlIDAgaXMgaW52aXNpYmxlCiAgICoKICAgKiBEZXNjcmlwdGlvbjogQSBsaW5lYXIgb3BhY2l0eSBhY3RpdmF0aW9uIGZ1bmN0aW9uLgogICAqIC0gZm9yIExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSyAoYW5kIGJlbG93KSAtPiAwIChpbnZpc2libGUpCiAgICogLSBmb3IgTEFCRUxfVklTSUJJTElUWV9FTkRfSyAoYW5kIGFib3ZlKSAtPiAxIChmdWxseSB2aXNpYmxlKQogICAqIC0gYmV0d2VlbjogbGluZWFyCiAgICoKICAgKiAgQVNDSUkgYXJlIG9mIGFjdGl2YXRpb24gZnVuY3Rpb246IF9fX18vLS0tLQogICAqCiAgICovCgogIGlmICh6b29tX2xldmVsIDw9IExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSykgewogICAgcmV0dXJuIDA7CiAgfQogIGlmICh6b29tX2xldmVsID49IExBQkVMX1ZJU0lCSUxJVFlfRU5EX0spIHsKICAgIHJldHVybiAxOwogIH0KCiAgY29uc3QgbGluZWFyX29wYWNpdHkgPSAoem9vbV9sZXZlbCAtIExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSykgLyAoTEFCRUxfVklTSUJJTElUWV9FTkRfSyAtIExBQkVMX1ZJU0lCSUxJVFlfU1RBUlRfSyk7CgogIHJldHVybiBsaW5lYXJfb3BhY2l0eTsKfQo=",
"asset/d3-force.js": "data:application/javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1mb3JjZS8gdjMuMC4wIENvcHlyaWdodCAyMDEwLTIwMjEgTWlrZSBCb3N0b2NrCiFmdW5jdGlvbihuLHQpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/dChleHBvcnRzLHJlcXVpcmUoImQzLXF1YWR0cmVlIikscmVxdWlyZSgiZDMtZGlzcGF0Y2giKSxyZXF1aXJlKCJkMy10aW1lciIpKToiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiLCJkMy1xdWFkdHJlZSIsImQzLWRpc3BhdGNoIiwiZDMtdGltZXIiXSx0KTp0KChuPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOm58fHNlbGYpLmQzPW4uZDN8fHt9LG4uZDMsbi5kMyxuLmQzKX0odGhpcywoZnVuY3Rpb24obix0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkobil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIHUobil7cmV0dXJuIDFlLTYqKG4oKS0uNSl9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gbi54K24udnh9ZnVuY3Rpb24gZihuKXtyZXR1cm4gbi55K24udnl9ZnVuY3Rpb24gYShuKXtyZXR1cm4gbi5pbmRleH1mdW5jdGlvbiBjKG4sdCl7dmFyIGU9bi5nZXQodCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJub2RlIG5vdCBmb3VuZDogIit0KTtyZXR1cm4gZX1jb25zdCBsPTQyOTQ5NjcyOTY7ZnVuY3Rpb24gaChuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIHYobil7cmV0dXJuIG4ueX12YXIgeT1NYXRoLlBJKigzLU1hdGguc3FydCg1KSk7bi5mb3JjZUNlbnRlcj1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MTtmdW5jdGlvbiBpKCl7dmFyIGksdSxvPWUubGVuZ3RoLGY9MCxhPTA7Zm9yKGk9MDtpPG87KytpKWYrPSh1PWVbaV0pLngsYSs9dS55O2ZvcihmPShmL28tbikqcixhPShhL28tdCkqcixpPTA7aTxvOysraSkodT1lW2ldKS54LT1mLHUueS09YX1yZXR1cm4gbnVsbD09biYmKG49MCksbnVsbD09dCYmKHQ9MCksaS5pbml0aWFsaXplPWZ1bmN0aW9uKG4pe2U9bn0saS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LGkpOm59LGkueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixpKTp0fSxpLnN0cmVuZ3RoPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPStuLGkpOnJ9LGl9LG4uZm9yY2VDb2xsaWRlPWZ1bmN0aW9uKG4pe3ZhciBlLHIsYSxjPTEsbD0xO2Z1bmN0aW9uIGgoKXtmb3IodmFyIG4saSxoLHksZCxnLHgscz1lLmxlbmd0aCxwPTA7cDxsOysrcClmb3IoaT10LnF1YWR0cmVlKGUsbyxmKS52aXNpdEFmdGVyKHYpLG49MDtuPHM7KytuKWg9ZVtuXSxnPXJbaC5pbmRleF0seD1nKmcseT1oLngraC52eCxkPWgueStoLnZ5LGkudmlzaXQoTSk7ZnVuY3Rpb24gTShuLHQsZSxyLGkpe3ZhciBvPW4uZGF0YSxmPW4ucixsPWcrZjtpZighbylyZXR1cm4gdD55K2x8fHI8eS1sfHxlPmQrbHx8aTxkLWw7aWYoby5pbmRleD5oLmluZGV4KXt2YXIgdj15LW8ueC1vLnZ4LHM9ZC1vLnktby52eSxwPXYqditzKnM7cDxsKmwmJigwPT09diYmKHArPSh2PXUoYSkpKnYpLDA9PT1zJiYocCs9KHM9dShhKSkqcykscD0obC0ocD1NYXRoLnNxcnQocCkpKS9wKmMsaC52eCs9KHYqPXApKihsPShmKj1mKS8oeCtmKSksaC52eSs9KHMqPXApKmwsby52eC09dioobD0xLWwpLG8udnktPXMqbCl9fX1mdW5jdGlvbiB2KG4pe2lmKG4uZGF0YSlyZXR1cm4gbi5yPXJbbi5kYXRhLmluZGV4XTtmb3IodmFyIHQ9bi5yPTA7dDw0OysrdCluW3RdJiZuW3RdLnI+bi5yJiYobi5yPW5bdF0ucil9ZnVuY3Rpb24geSgpe2lmKGUpe3ZhciB0LGksdT1lLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkodSksdD0wO3Q8dTsrK3QpaT1lW3RdLHJbaS5pbmRleF09K24oaSx0LGUpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49aShudWxsPT1uPzE6K24pKSxoLmluaXRpYWxpemU9ZnVuY3Rpb24obix0KXtlPW4sYT10LHkoKX0saC5pdGVyYXRpb25zPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPStuLGgpOmx9LGguc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K24saCk6Y30saC5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSx5KCksaCk6bn0saH0sbi5mb3JjZUxpbms9ZnVuY3Rpb24obil7dmFyIHQsZSxyLG8sZixsLGg9YSx2PWZ1bmN0aW9uKG4pe3JldHVybiAxL01hdGgubWluKG9bbi5zb3VyY2UuaW5kZXhdLG9bbi50YXJnZXQuaW5kZXhdKX0seT1pKDMwKSxkPTE7ZnVuY3Rpb24gZyhyKXtmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8ZDsrK2kpZm9yKHZhciBhLGMsaCx2LHksZyx4LHM9MDtzPG87KytzKWM9KGE9bltzXSkuc291cmNlLHY9KGg9YS50YXJnZXQpLngraC52eC1jLngtYy52eHx8dShsKSx5PWgueStoLnZ5LWMueS1jLnZ5fHx1KGwpLHYqPWc9KChnPU1hdGguc3FydCh2KnYreSp5KSktZVtzXSkvZypyKnRbc10seSo9ZyxoLnZ4LT12Kih4PWZbc10pLGgudnktPXkqeCxjLnZ4Kz12Kih4PTEteCksYy52eSs9eSp4fWZ1bmN0aW9uIHgoKXtpZihyKXt2YXIgaSx1LGE9ci5sZW5ndGgsbD1uLmxlbmd0aCx2PW5ldyBNYXAoci5tYXAoKChuLHQpPT5baChuLHQsciksbl0pKSk7Zm9yKGk9MCxvPW5ldyBBcnJheShhKTtpPGw7KytpKSh1PW5baV0pLmluZGV4PWksIm9iamVjdCIhPXR5cGVvZiB1LnNvdXJjZSYmKHUuc291cmNlPWModix1LnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgdS50YXJnZXQmJih1LnRhcmdldD1jKHYsdS50YXJnZXQpKSxvW3Uuc291cmNlLmluZGV4XT0ob1t1LnNvdXJjZS5pbmRleF18fDApKzEsb1t1LnRhcmdldC5pbmRleF09KG9bdS50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihpPTAsZj1uZXcgQXJyYXkobCk7aTxsOysraSl1PW5baV0sZltpXT1vW3Uuc291cmNlLmluZGV4XS8ob1t1LnNvdXJjZS5pbmRleF0rb1t1LnRhcmdldC5pbmRleF0pO3Q9bmV3IEFycmF5KGwpLHMoKSxlPW5ldyBBcnJheShsKSxwKCl9fWZ1bmN0aW9uIHMoKXtpZihyKWZvcih2YXIgZT0wLGk9bi5sZW5ndGg7ZTxpOysrZSl0W2VdPSt2KG5bZV0sZSxuKX1mdW5jdGlvbiBwKCl7aWYocilmb3IodmFyIHQ9MCxpPW4ubGVuZ3RoO3Q8aTsrK3QpZVt0XT0reShuW3RdLHQsbil9cmV0dXJuIG51bGw9PW4mJihuPVtdKSxnLmluaXRpYWxpemU9ZnVuY3Rpb24obix0KXtyPW4sbD10LHgoKX0sZy5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LHgoKSxnKTpufSxnLmlkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sZyk6aH0sZy5pdGVyYXRpb25zPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuLGcpOmR9LGcuc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjppKCtuKSxzKCksZyk6dn0sZy5kaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmkoK24pLHAoKSxnKTp5fSxnfSxuLmZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXt2YXIgbixlLHIsbyxmLGE9aSgtMzApLGM9MSxsPTEvMCx5PS44MTtmdW5jdGlvbiBkKHIpe3ZhciBpLHU9bi5sZW5ndGgsZj10LnF1YWR0cmVlKG4saCx2KS52aXNpdEFmdGVyKHgpO2ZvcihvPXIsaT0wO2k8dTsrK2kpZT1uW2ldLGYudmlzaXQocyl9ZnVuY3Rpb24gZygpe2lmKG4pe3ZhciB0LGUscj1uLmxlbmd0aDtmb3IoZj1uZXcgQXJyYXkociksdD0wO3Q8cjsrK3QpZT1uW3RdLGZbZS5pbmRleF09K2EoZSx0LG4pfX1mdW5jdGlvbiB4KG4pe3ZhciB0LGUscixpLHUsbz0wLGE9MDtpZihuLmxlbmd0aCl7Zm9yKHI9aT11PTA7dTw0OysrdSkodD1uW3VdKSYmKGU9TWF0aC5hYnModC52YWx1ZSkpJiYobys9dC52YWx1ZSxhKz1lLHIrPWUqdC54LGkrPWUqdC55KTtuLng9ci9hLG4ueT1pL2F9ZWxzZXsodD1uKS54PXQuZGF0YS54LHQueT10LmRhdGEueTtkb3tvKz1mW3QuZGF0YS5pbmRleF19d2hpbGUodD10Lm5leHQpfW4udmFsdWU9b31mdW5jdGlvbiBzKG4sdCxpLGEpe2lmKCFuLnZhbHVlKXJldHVybiEwO3ZhciBoPW4ueC1lLngsdj1uLnktZS55LGQ9YS10LGc9aCpoK3YqdjtpZihkKmQveTxnKXJldHVybiBnPGwmJigwPT09aCYmKGcrPShoPXUocikpKmgpLDA9PT12JiYoZys9KHY9dShyKSkqdiksZzxjJiYoZz1NYXRoLnNxcnQoYypnKSksZS52eCs9aCpuLnZhbHVlKm8vZyxlLnZ5Kz12Km4udmFsdWUqby9nKSwhMDtpZighKG4ubGVuZ3RofHxnPj1sKSl7KG4uZGF0YSE9PWV8fG4ubmV4dCkmJigwPT09aCYmKGcrPShoPXUocikpKmgpLDA9PT12JiYoZys9KHY9dShyKSkqdiksZzxjJiYoZz1NYXRoLnNxcnQoYypnKSkpO2Rve24uZGF0YSE9PWUmJihkPWZbbi5kYXRhLmluZGV4XSpvL2csZS52eCs9aCpkLGUudnkrPXYqZCl9d2hpbGUobj1uLm5leHQpfX1yZXR1cm4gZC5pbml0aWFsaXplPWZ1bmN0aW9uKHQsZSl7bj10LHI9ZSxnKCl9LGQuc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjppKCtuKSxnKCksZCk6YX0sZC5kaXN0YW5jZU1pbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uKm4sZCk6TWF0aC5zcXJ0KGMpfSxkLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4qbixkKTpNYXRoLnNxcnQobCl9LGQudGhldGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9bipuLGQpOk1hdGguc3FydCh5KX0sZH0sbi5mb3JjZVJhZGlhbD1mdW5jdGlvbihuLHQsZSl7dmFyIHIsdSxvLGY9aSguMSk7ZnVuY3Rpb24gYShuKXtmb3IodmFyIGk9MCxmPXIubGVuZ3RoO2k8ZjsrK2kpe3ZhciBhPXJbaV0sYz1hLngtdHx8MWUtNixsPWEueS1lfHwxZS02LGg9TWF0aC5zcXJ0KGMqYytsKmwpLHY9KG9baV0taCkqdVtpXSpuL2g7YS52eCs9Yyp2LGEudnkrPWwqdn19ZnVuY3Rpb24gYygpe2lmKHIpe3ZhciB0LGU9ci5sZW5ndGg7Zm9yKHU9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLHQ9MDt0PGU7Kyt0KW9bdF09K24oclt0XSx0LHIpLHVbdF09aXNOYU4ob1t0XSk/MDorZihyW3RdLHQscil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1pKCtuKSksbnVsbD09dCYmKHQ9MCksbnVsbD09ZSYmKGU9MCksYS5pbml0aWFsaXplPWZ1bmN0aW9uKG4pe3I9bixjKCl9LGEuc3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjppKCtuKSxjKCksYSk6Zn0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSxjKCksYSk6bn0sYS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLGEpOnR9LGEueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rbixhKTplfSxhfSxuLmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbihuKXt2YXIgdCxpPTEsdT0uMDAxLG89MS1NYXRoLnBvdyh1LDEvMzAwKSxmPTAsYT0uNixjPW5ldyBNYXAsaD1yLnRpbWVyKGcpLHY9ZS5kaXNwYXRjaCgidGljayIsImVuZCIpLGQ9ZnVuY3Rpb24oKXtsZXQgbj0xO3JldHVybigpPT4obj0oMTY2NDUyNSpuKzEwMTM5MDQyMjMpJWwpL2x9KCk7ZnVuY3Rpb24gZygpe3goKSx2LmNhbGwoInRpY2siLHQpLGk8dSYmKGguc3RvcCgpLHYuY2FsbCgiZW5kIix0KSl9ZnVuY3Rpb24geChlKXt2YXIgcix1LGw9bi5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9MSk7Zm9yKHZhciBoPTA7aDxlOysraClmb3IoaSs9KGYtaSkqbyxjLmZvckVhY2goKGZ1bmN0aW9uKG4pe24oaSl9KSkscj0wO3I8bDsrK3IpbnVsbD09KHU9bltyXSkuZng/dS54Kz11LnZ4Kj1hOih1Lng9dS5meCx1LnZ4PTApLG51bGw9PXUuZnk/dS55Kz11LnZ5Kj1hOih1Lnk9dS5meSx1LnZ5PTApO3JldHVybiB0fWZ1bmN0aW9uIHMoKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSl7aWYoKHQ9bltlXSkuaW5kZXg9ZSxudWxsIT10LmZ4JiYodC54PXQuZngpLG51bGwhPXQuZnkmJih0Lnk9dC5meSksaXNOYU4odC54KXx8aXNOYU4odC55KSl7dmFyIGk9MTAqTWF0aC5zcXJ0KC41K2UpLHU9ZSp5O3QueD1pKk1hdGguY29zKHUpLHQueT1pKk1hdGguc2luKHUpfShpc05hTih0LnZ4KXx8aXNOYU4odC52eSkpJiYodC52eD10LnZ5PTApfX1mdW5jdGlvbiBwKHQpe3JldHVybiB0LmluaXRpYWxpemUmJnQuaW5pdGlhbGl6ZShuLGQpLHR9cmV0dXJuIG51bGw9PW4mJihuPVtdKSxzKCksdD17dGljazp4LHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5yZXN0YXJ0KGcpLHR9LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gaC5zdG9wKCksdH0sbm9kZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSxzKCksYy5mb3JFYWNoKHApLHQpOm59LGFscGhhOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuLHQpOml9LGFscGhhTWluOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PStuLHQpOnV9LGFscGhhRGVjYXk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K24sdCk6K299LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPStuLHQpOmZ9LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9MS1uLHQpOjEtYX0scmFuZG9tU291cmNlOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4sYy5mb3JFYWNoKHApLHQpOmR9LGZvcmNlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT9jLmRlbGV0ZShuKTpjLnNldChuLHAoZSkpLHQpOmMuZ2V0KG4pfSxmaW5kOmZ1bmN0aW9uKHQsZSxyKXt2YXIgaSx1LG8sZixhLGM9MCxsPW4ubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8bDsrK2MpKG89KGk9dC0oZj1uW2NdKS54KSppKyh1PWUtZi55KSp1KTxyJiYoYT1mLHI9byk7cmV0dXJuIGF9LG9uOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8odi5vbihuLGUpLHQpOnYub24obil9fX0sbi5mb3JjZVg9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9aSguMSk7ZnVuY3Rpb24gbyhuKXtmb3IodmFyIGksdT0wLG89dC5sZW5ndGg7dTxvOysrdSkoaT10W3VdKS52eCs9KHJbdV0taS54KSplW3VdKm59ZnVuY3Rpb24gZigpe2lmKHQpe3ZhciBpLG89dC5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KG8pLHI9bmV3IEFycmF5KG8pLGk9MDtpPG87KytpKWVbaV09aXNOYU4ocltpXT0rbih0W2ldLGksdCkpPzA6K3UodFtpXSxpLHQpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49aShudWxsPT1uPzA6K24pKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGYoKX0sby5zdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmkoK24pLGYoKSxvKTp1fSxvLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSxmKCksbyk6bn0sb30sbi5mb3JjZVk9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9aSguMSk7ZnVuY3Rpb24gbyhuKXtmb3IodmFyIGksdT0wLG89dC5sZW5ndGg7dTxvOysrdSkoaT10W3VdKS52eSs9KHJbdV0taS55KSplW3VdKm59ZnVuY3Rpb24gZigpe2lmKHQpe3ZhciBpLG89dC5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KG8pLHI9bmV3IEFycmF5KG8pLGk9MDtpPG87KytpKWVbaV09aXNOYU4ocltpXT0rbih0W2ldLGksdCkpPzA6K3UodFtpXSxpLHQpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49aShudWxsPT1uPzA6K24pKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24obil7dD1uLGYoKX0sby5zdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmkoK24pLGYoKSxvKTp1fSxvLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDppKCt0KSxmKCksbyk6bn0sb30sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSkpOw==",
"asset/d3.js": "data:application/javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyB2Ny44LjQgQ29weXJpZ2h0IDIwMTAtMjAyMyBNaWtlIEJvc3RvY2sKIWZ1bmN0aW9uKHQsbil7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9uKGV4cG9ydHMpOiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZXhwb3J0cyJdLG4pOm4oKHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikuZDM9dC5kM3x8e30pfSh0aGlzLChmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBudWxsPT10fHxudWxsPT1uP05hTjp0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIG51bGw9PXR8fG51bGw9PW4/TmFOOm48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfWZ1bmN0aW9uIHIodCl7bGV0IHIsbyxhO2Z1bmN0aW9uIHUodCxuLGU9MCxpPXQubGVuZ3RoKXtpZihlPGkpe2lmKDAhPT1yKG4sbikpcmV0dXJuIGk7ZG97Y29uc3Qgcj1lK2k+Pj4xO28odFtyXSxuKTwwP2U9cisxOmk9cn13aGlsZShlPGkpfXJldHVybiBlfXJldHVybiAyIT09dC5sZW5ndGg/KHI9bixvPShlLHIpPT5uKHQoZSksciksYT0obixlKT0+dChuKS1lKToocj10PT09bnx8dD09PWU/dDppLG89dCxhPXQpLHtsZWZ0OnUsY2VudGVyOmZ1bmN0aW9uKHQsbixlPTAscj10Lmxlbmd0aCl7Y29uc3QgaT11KHQsbixlLHItMSk7cmV0dXJuIGk+ZSYmYSh0W2ktMV0sbik+LWEodFtpXSxuKT9pLTE6aX0scmlnaHQ6ZnVuY3Rpb24odCxuLGU9MCxpPXQubGVuZ3RoKXtpZihlPGkpe2lmKDAhPT1yKG4sbikpcmV0dXJuIGk7ZG97Y29uc3Qgcj1lK2k+Pj4xO28odFtyXSxuKTw9MD9lPXIrMTppPXJ9d2hpbGUoZTxpKX1yZXR1cm4gZX19fWZ1bmN0aW9uIGkoKXtyZXR1cm4gMH1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24qYSh0LG4pe2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpbnVsbCE9biYmKG49K24pPj1uJiYoeWllbGQgbik7ZWxzZXtsZXQgZT0tMTtmb3IobGV0IHIgb2YgdCludWxsIT0ocj1uKHIsKytlLHQpKSYmKHI9K3IpPj1yJiYoeWllbGQgcil9fWNvbnN0IHU9cihuKSxjPXUucmlnaHQsZj11LmxlZnQscz1yKG8pLmNlbnRlcjt2YXIgbD1jO2NvbnN0IGg9cCh2KSxkPXAoKGZ1bmN0aW9uKHQpe2NvbnN0IG49dih0KTtyZXR1cm4odCxlLHIsaSxvKT0+e24odCxlLChyPDw9MikrMCwoaTw8PTIpKzAsbzw8PTIpLG4odCxlLHIrMSxpKzEsbyksbih0LGUscisyLGkrMixvKSxuKHQsZSxyKzMsaSszLG8pfX0pKTtmdW5jdGlvbiBwKHQpe3JldHVybiBmdW5jdGlvbihuLGUscj1lKXtpZighKChlPStlKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgcngiKTtpZighKChyPStyKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgcnkiKTtsZXR7ZGF0YTppLHdpZHRoOm8saGVpZ2h0OmF9PW47aWYoISgobz1NYXRoLmZsb29yKG8pKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgd2lkdGgiKTtpZighKChhPU1hdGguZmxvb3Iodm9pZCAwIT09YT9hOmkubGVuZ3RoL28pKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgaGVpZ2h0Iik7aWYoIW98fCFhfHwhZSYmIXIpcmV0dXJuIG47Y29uc3QgdT1lJiZ0KGUpLGM9ciYmdChyKSxmPWkuc2xpY2UoKTtyZXR1cm4gdSYmYz8oZyh1LGYsaSxvLGEpLGcodSxpLGYsbyxhKSxnKHUsZixpLG8sYSkseShjLGksZixvLGEpLHkoYyxmLGksbyxhKSx5KGMsaSxmLG8sYSkpOnU/KGcodSxpLGYsbyxhKSxnKHUsZixpLG8sYSksZyh1LGksZixvLGEpKTpjJiYoeShjLGksZixvLGEpLHkoYyxmLGksbyxhKSx5KGMsaSxmLG8sYSkpLG59fWZ1bmN0aW9uIGcodCxuLGUscixpKXtmb3IobGV0IG89MCxhPXIqaTtvPGE7KXQobixlLG8sbys9ciwxKX1mdW5jdGlvbiB5KHQsbixlLHIsaSl7Zm9yKGxldCBvPTAsYT1yKmk7bzxyOysrbyl0KG4sZSxvLG8rYSxyKX1mdW5jdGlvbiB2KHQpe2NvbnN0IG49TWF0aC5mbG9vcih0KTtpZihuPT09dClyZXR1cm4gZnVuY3Rpb24odCl7Y29uc3Qgbj0yKnQrMTtyZXR1cm4oZSxyLGksbyxhKT0+e2lmKCEoKG8tPWEpPj1pKSlyZXR1cm47bGV0IHU9dCpyW2ldO2NvbnN0IGM9YSp0O2ZvcihsZXQgdD1pLG49aStjO3Q8bjt0Kz1hKXUrPXJbTWF0aC5taW4obyx0KV07Zm9yKGxldCB0PWksZj1vO3Q8PWY7dCs9YSl1Kz1yW01hdGgubWluKG8sdCtjKV0sZVt0XT11L24sdS09cltNYXRoLm1heChpLHQtYyldfX0odCk7Y29uc3QgZT10LW4scj0yKnQrMTtyZXR1cm4odCxpLG8sYSx1KT0+e2lmKCEoKGEtPXUpPj1vKSlyZXR1cm47bGV0IGM9bippW29dO2NvbnN0IGY9dSpuLHM9Zit1O2ZvcihsZXQgdD1vLG49bytmO3Q8bjt0Kz11KWMrPWlbTWF0aC5taW4oYSx0KV07Zm9yKGxldCBuPW8sbD1hO248PWw7bis9dSljKz1pW01hdGgubWluKGEsbitmKV0sdFtuXT0oYytlKihpW01hdGgubWF4KG8sbi1zKV0raVtNYXRoLm1pbihhLG4rcyldKSkvcixjLT1pW01hdGgubWF4KG8sbi1mKV19fWZ1bmN0aW9uIF8odCxuKXtsZXQgZT0wO2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpbnVsbCE9biYmKG49K24pPj1uJiYrK2U7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCludWxsIT0oaT1uKGksKytyLHQpKSYmKGk9K2kpPj1pJiYrK2V9cmV0dXJuIGV9ZnVuY3Rpb24gYih0KXtyZXR1cm4gMHx0Lmxlbmd0aH1mdW5jdGlvbiBtKHQpe3JldHVybiEodD4wKX1mdW5jdGlvbiB4KHQpe3JldHVybiJvYmplY3QiIT10eXBlb2YgdHx8Imxlbmd0aCJpbiB0P3Q6QXJyYXkuZnJvbSh0KX1mdW5jdGlvbiB3KHQsbil7bGV0IGUscj0wLGk9MCxvPTA7aWYodm9pZCAwPT09bilmb3IobGV0IG4gb2YgdCludWxsIT1uJiYobj0rbik+PW4mJihlPW4taSxpKz1lLysrcixvKz1lKihuLWkpKTtlbHNle2xldCBhPS0xO2ZvcihsZXQgdSBvZiB0KW51bGwhPSh1PW4odSwrK2EsdCkpJiYodT0rdSk+PXUmJihlPXUtaSxpKz1lLysrcixvKz1lKih1LWkpKX1pZihyPjEpcmV0dXJuIG8vKHItMSl9ZnVuY3Rpb24gTSh0LG4pe2NvbnN0IGU9dyh0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIFQodCxuKXtsZXQgZSxyO2lmKHZvaWQgMD09PW4pZm9yKGNvbnN0IG4gb2YgdCludWxsIT1uJiYodm9pZCAwPT09ZT9uPj1uJiYoZT1yPW4pOihlPm4mJihlPW4pLHI8biYmKHI9bikpKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgbyBvZiB0KW51bGwhPShvPW4obywrK2ksdCkpJiYodm9pZCAwPT09ZT9vPj1vJiYoZT1yPW8pOihlPm8mJihlPW8pLHI8byYmKHI9bykpKX1yZXR1cm5bZSxyXX1jbGFzcyBBe2NvbnN0cnVjdG9yKCl7dGhpcy5fcGFydGlhbHM9bmV3IEZsb2F0NjRBcnJheSgzMiksdGhpcy5fbj0wfWFkZCh0KXtjb25zdCBuPXRoaXMuX3BhcnRpYWxzO2xldCBlPTA7Zm9yKGxldCByPTA7cjx0aGlzLl9uJiZyPDMyO3IrKyl7Y29uc3QgaT1uW3JdLG89dCtpLGE9TWF0aC5hYnModCk8TWF0aC5hYnMoaSk/dC0oby1pKTppLShvLXQpO2EmJihuW2UrK109YSksdD1vfXJldHVybiBuW2VdPXQsdGhpcy5fbj1lKzEsdGhpc312YWx1ZU9mKCl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgbixlLHIsaT10aGlzLl9uLG89MDtpZihpPjApe2ZvcihvPXRbLS1pXTtpPjAmJihuPW8sZT10Wy0taV0sbz1uK2Uscj1lLShvLW4pLCFyKTspO2k+MCYmKHI8MCYmdFtpLTFdPDB8fHI+MCYmdFtpLTFdPjApJiYoZT0yKnIsbj1vK2UsZT09bi1vJiYobz1uKSl9cmV0dXJuIG99fWNsYXNzIEludGVybk1hcCBleHRlbmRzIE1hcHtjb25zdHJ1Y3Rvcih0LG49ayl7aWYoc3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtfaW50ZXJuOnt2YWx1ZTpuZXcgTWFwfSxfa2V5Ont2YWx1ZTpufX0pLG51bGwhPXQpZm9yKGNvbnN0W24sZV1vZiB0KXRoaXMuc2V0KG4sZSl9Z2V0KHQpe3JldHVybiBzdXBlci5nZXQoUyh0aGlzLHQpKX1oYXModCl7cmV0dXJuIHN1cGVyLmhhcyhTKHRoaXMsdCkpfXNldCh0LG4pe3JldHVybiBzdXBlci5zZXQoRSh0aGlzLHQpLG4pfWRlbGV0ZSh0KXtyZXR1cm4gc3VwZXIuZGVsZXRlKE4odGhpcyx0KSl9fWNsYXNzIEludGVyblNldCBleHRlbmRzIFNldHtjb25zdHJ1Y3Rvcih0LG49ayl7aWYoc3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtfaW50ZXJuOnt2YWx1ZTpuZXcgTWFwfSxfa2V5Ont2YWx1ZTpufX0pLG51bGwhPXQpZm9yKGNvbnN0IG4gb2YgdCl0aGlzLmFkZChuKX1oYXModCl7cmV0dXJuIHN1cGVyLmhhcyhTKHRoaXMsdCkpfWFkZCh0KXtyZXR1cm4gc3VwZXIuYWRkKEUodGhpcyx0KSl9ZGVsZXRlKHQpe3JldHVybiBzdXBlci5kZWxldGUoTih0aGlzLHQpKX19ZnVuY3Rpb24gUyh7X2ludGVybjp0LF9rZXk6bn0sZSl7Y29uc3Qgcj1uKGUpO3JldHVybiB0LmhhcyhyKT90LmdldChyKTplfWZ1bmN0aW9uIEUoe19pbnRlcm46dCxfa2V5Om59LGUpe2NvbnN0IHI9bihlKTtyZXR1cm4gdC5oYXMocik/dC5nZXQocik6KHQuc2V0KHIsZSksZSl9ZnVuY3Rpb24gTih7X2ludGVybjp0LF9rZXk6bn0sZSl7Y29uc3Qgcj1uKGUpO3JldHVybiB0LmhhcyhyKSYmKGU9dC5nZXQociksdC5kZWxldGUocikpLGV9ZnVuY3Rpb24gayh0KXtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdD90LnZhbHVlT2YoKTp0fWZ1bmN0aW9uIEModCl7cmV0dXJuIHR9ZnVuY3Rpb24gUCh0LC4uLm4pe3JldHVybiBxKHQsQyxDLG4pfWZ1bmN0aW9uIHoodCwuLi5uKXtyZXR1cm4gcSh0LEFycmF5LmZyb20sQyxuKX1mdW5jdGlvbiAkKHQsbil7Zm9yKGxldCBlPTEscj1uLmxlbmd0aDtlPHI7KytlKXQ9dC5mbGF0TWFwKCh0PT50LnBvcCgpLm1hcCgoKFtuLGVdKT0+Wy4uLnQsbixlXSkpKSk7cmV0dXJuIHR9ZnVuY3Rpb24gRCh0LG4sLi4uZSl7cmV0dXJuIHEodCxDLG4sZSl9ZnVuY3Rpb24gUih0LG4sLi4uZSl7cmV0dXJuIHEodCxBcnJheS5mcm9tLG4sZSl9ZnVuY3Rpb24gRih0KXtpZigxIT09dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJkdXBsaWNhdGUga2V5Iik7cmV0dXJuIHRbMF19ZnVuY3Rpb24gcSh0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24gdChpLG8pe2lmKG8+PXIubGVuZ3RoKXJldHVybiBlKGkpO2NvbnN0IGE9bmV3IEludGVybk1hcCx1PXJbbysrXTtsZXQgYz0tMTtmb3IoY29uc3QgdCBvZiBpKXtjb25zdCBuPXUodCwrK2MsaSksZT1hLmdldChuKTtlP2UucHVzaCh0KTphLnNldChuLFt0XSl9Zm9yKGNvbnN0W24sZV1vZiBhKWEuc2V0KG4sdChlLG8pKTtyZXR1cm4gbihhKX0odCwwKX1mdW5jdGlvbiBVKHQsbil7cmV0dXJuIEFycmF5LmZyb20obiwobj0+dFtuXSkpfWZ1bmN0aW9uIEkodCwuLi5uKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFtTeW1ib2wuaXRlcmF0b3JdKXRocm93IG5ldyBUeXBlRXJyb3IoInZhbHVlcyBpcyBub3QgaXRlcmFibGUiKTt0PUFycmF5LmZyb20odCk7bGV0W2VdPW47aWYoZSYmMiE9PWUubGVuZ3RofHxuLmxlbmd0aD4xKXtjb25zdCByPVVpbnQzMkFycmF5LmZyb20odCwoKHQsbik9Pm4pKTtyZXR1cm4gbi5sZW5ndGg+MT8obj1uLm1hcCgobj0+dC5tYXAobikpKSxyLnNvcnQoKCh0LGUpPT57Zm9yKGNvbnN0IHIgb2Ygbil7Y29uc3Qgbj1CKHJbdF0scltlXSk7aWYobilyZXR1cm4gbn19KSkpOihlPXQubWFwKGUpLHIuc29ydCgoKHQsbik9PkIoZVt0XSxlW25dKSkpKSxVKHQscil9cmV0dXJuIHQuc29ydChPKGUpKX1mdW5jdGlvbiBPKHQ9bil7aWYodD09PW4pcmV0dXJuIEI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybihuLGUpPT57Y29uc3Qgcj10KG4sZSk7cmV0dXJuIHJ8fDA9PT1yP3I6KDA9PT10KGUsZSkpLSgwPT09dChuLG4pKX19ZnVuY3Rpb24gQih0LG4pe3JldHVybihudWxsPT10fHwhKHQ+PXQpKS0obnVsbD09bnx8IShuPj1uKSl8fCh0PG4/LTE6dD5uPzE6MCl9dmFyIFk9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEwodCl7cmV0dXJuKCk9PnR9Y29uc3Qgaj1NYXRoLnNxcnQoNTApLEg9TWF0aC5zcXJ0KDEwKSxYPU1hdGguc3FydCgyKTtmdW5jdGlvbiBHKHQsbixlKXtjb25zdCByPShuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLmZsb29yKE1hdGgubG9nMTAocikpLG89ci9NYXRoLnBvdygxMCxpKSxhPW8+PWo/MTA6bz49SD81Om8+PVg/MjoxO2xldCB1LGMsZjtyZXR1cm4gaTwwPyhmPU1hdGgucG93KDEwLC1pKS9hLHU9TWF0aC5yb3VuZCh0KmYpLGM9TWF0aC5yb3VuZChuKmYpLHUvZjx0JiYrK3UsYy9mPm4mJi0tYyxmPS1mKTooZj1NYXRoLnBvdygxMCxpKSphLHU9TWF0aC5yb3VuZCh0L2YpLGM9TWF0aC5yb3VuZChuL2YpLHUqZjx0JiYrK3UsYypmPm4mJi0tYyksYzx1JiYuNTw9ZSYmZTwyP0codCxuLDIqZSk6W3UsYyxmXX1mdW5jdGlvbiBWKHQsbixlKXtpZighKChlPStlKT4wKSlyZXR1cm5bXTtpZigodD0rdCk9PT0obj0rbikpcmV0dXJuW3RdO2NvbnN0IHI9bjx0LFtpLG8sYV09cj9HKG4sdCxlKTpHKHQsbixlKTtpZighKG8+PWkpKXJldHVybltdO2NvbnN0IHU9by1pKzEsYz1uZXcgQXJyYXkodSk7aWYocilpZihhPDApZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShvLXQpLy1hO2Vsc2UgZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShvLXQpKmE7ZWxzZSBpZihhPDApZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShpK3QpLy1hO2Vsc2UgZm9yKGxldCB0PTA7dDx1OysrdCljW3RdPShpK3QpKmE7cmV0dXJuIGN9ZnVuY3Rpb24gVyh0LG4sZSl7cmV0dXJuIEcodD0rdCxuPStuLGU9K2UpWzJdfWZ1bmN0aW9uIFoodCxuLGUpe2U9K2U7Y29uc3Qgcj0obj0rbik8KHQ9K3QpLGk9cj9XKG4sdCxlKTpXKHQsbixlKTtyZXR1cm4ocj8tMToxKSooaTwwPzEvLWk6aSl9ZnVuY3Rpb24gSyh0LG4sZSl7bGV0IHI7Zm9yKDs7KXtjb25zdCBpPVcodCxuLGUpO2lmKGk9PT1yfHwwPT09aXx8IWlzRmluaXRlKGkpKXJldHVyblt0LG5dO2k+MD8odD1NYXRoLmZsb29yKHQvaSkqaSxuPU1hdGguY2VpbChuL2kpKmkpOmk8MCYmKHQ9TWF0aC5jZWlsKHQqaSkvaSxuPU1hdGguZmxvb3IobippKS9pKSxyPWl9fWZ1bmN0aW9uIFEodCl7cmV0dXJuIE1hdGgubWF4KDEsTWF0aC5jZWlsKE1hdGgubG9nKF8odCkpL01hdGguTE4yKSsxKX1mdW5jdGlvbiBKKCl7dmFyIHQ9QyxuPVQsZT1RO2Z1bmN0aW9uIHIocil7QXJyYXkuaXNBcnJheShyKXx8KHI9QXJyYXkuZnJvbShyKSk7dmFyIGksbyxhLHU9ci5sZW5ndGgsYz1uZXcgQXJyYXkodSk7Zm9yKGk9MDtpPHU7KytpKWNbaV09dChyW2ldLGkscik7dmFyIGY9bihjKSxzPWZbMF0saD1mWzFdLGQ9ZShjLHMsaCk7aWYoIUFycmF5LmlzQXJyYXkoZCkpe2NvbnN0IHQ9aCxlPStkO2lmKG49PT1UJiYoW3MsaF09SyhzLGgsZSkpLChkPVYocyxoLGUpKVswXTw9cyYmKGE9VyhzLGgsZSkpLGRbZC5sZW5ndGgtMV0+PWgpaWYodD49aCYmbj09PVQpe2NvbnN0IHQ9VyhzLGgsZSk7aXNGaW5pdGUodCkmJih0PjA/aD0oTWF0aC5mbG9vcihoL3QpKzEpKnQ6dDwwJiYoaD0oTWF0aC5jZWlsKGgqLXQpKzEpLy10KSl9ZWxzZSBkLnBvcCgpfWZvcih2YXIgcD1kLmxlbmd0aCxnPTAseT1wO2RbZ108PXM7KSsrZztmb3IoO2RbeS0xXT5oOyktLXk7KGd8fHk8cCkmJihkPWQuc2xpY2UoZyx5KSxwPXktZyk7dmFyIHYsXz1uZXcgQXJyYXkocCsxKTtmb3IoaT0wO2k8PXA7KytpKSh2PV9baV09W10pLngwPWk+MD9kW2ktMV06cyx2LngxPWk8cD9kW2ldOmg7aWYoaXNGaW5pdGUoYSkpe2lmKGE+MClmb3IoaT0wO2k8dTsrK2kpbnVsbCE9KG89Y1tpXSkmJnM8PW8mJm88PWgmJl9bTWF0aC5taW4ocCxNYXRoLmZsb29yKChvLXMpL2EpKV0ucHVzaChyW2ldKTtlbHNlIGlmKGE8MClmb3IoaT0wO2k8dTsrK2kpaWYobnVsbCE9KG89Y1tpXSkmJnM8PW8mJm88PWgpe2NvbnN0IHQ9TWF0aC5mbG9vcigocy1vKSphKTtfW01hdGgubWluKHAsdCsoZFt0XTw9bykpXS5wdXNoKHJbaV0pfX1lbHNlIGZvcihpPTA7aTx1OysraSludWxsIT0obz1jW2ldKSYmczw9byYmbzw9aCYmX1tsKGQsbywwLHApXS5wdXNoKHJbaV0pO3JldHVybiBffXJldHVybiByLnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246TChuKSxyKTp0fSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkwoW3RbMF0sdFsxXV0pLHIpOm59LHIudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkwoQXJyYXkuaXNBcnJheSh0KT9ZLmNhbGwodCk6dCkscik6ZX0scn1mdW5jdGlvbiB0dCh0LG4pe2xldCBlO2lmKHZvaWQgMD09PW4pZm9yKGNvbnN0IG4gb2YgdCludWxsIT1uJiYoZTxufHx2b2lkIDA9PT1lJiZuPj1uKSYmKGU9bik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCludWxsIT0oaT1uKGksKytyLHQpKSYmKGU8aXx8dm9pZCAwPT09ZSYmaT49aSkmJihlPWkpfXJldHVybiBlfWZ1bmN0aW9uIG50KHQsbil7bGV0IGUscj0tMSxpPS0xO2lmKHZvaWQgMD09PW4pZm9yKGNvbnN0IG4gb2YgdCkrK2ksbnVsbCE9biYmKGU8bnx8dm9pZCAwPT09ZSYmbj49bikmJihlPW4scj1pKTtlbHNlIGZvcihsZXQgbyBvZiB0KW51bGwhPShvPW4obywrK2ksdCkpJiYoZTxvfHx2b2lkIDA9PT1lJiZvPj1vKSYmKGU9byxyPWkpO3JldHVybiByfWZ1bmN0aW9uIGV0KHQsbil7bGV0IGU7aWYodm9pZCAwPT09bilmb3IoY29uc3QgbiBvZiB0KW51bGwhPW4mJihlPm58fHZvaWQgMD09PWUmJm4+PW4pJiYoZT1uKTtlbHNle2xldCByPS0xO2ZvcihsZXQgaSBvZiB0KW51bGwhPShpPW4oaSwrK3IsdCkpJiYoZT5pfHx2b2lkIDA9PT1lJiZpPj1pKSYmKGU9aSl9cmV0dXJuIGV9ZnVuY3Rpb24gcnQodCxuKXtsZXQgZSxyPS0xLGk9LTE7aWYodm9pZCAwPT09bilmb3IoY29uc3QgbiBvZiB0KSsraSxudWxsIT1uJiYoZT5ufHx2b2lkIDA9PT1lJiZuPj1uKSYmKGU9bixyPWkpO2Vsc2UgZm9yKGxldCBvIG9mIHQpbnVsbCE9KG89bihvLCsraSx0KSkmJihlPm98fHZvaWQgMD09PWUmJm8+PW8pJiYoZT1vLHI9aSk7cmV0dXJuIHJ9ZnVuY3Rpb24gaXQodCxuLGU9MCxyPTEvMCxpKXtpZihuPU1hdGguZmxvb3IobiksZT1NYXRoLmZsb29yKE1hdGgubWF4KDAsZSkpLHI9TWF0aC5mbG9vcihNYXRoLm1pbih0Lmxlbmd0aC0xLHIpKSwhKGU8PW4mJm48PXIpKXJldHVybiB0O2ZvcihpPXZvaWQgMD09PWk/QjpPKGkpO3I+ZTspe2lmKHItZT42MDApe2NvbnN0IG89ci1lKzEsYT1uLWUrMSx1PU1hdGgubG9nKG8pLGM9LjUqTWF0aC5leHAoMip1LzMpLGY9LjUqTWF0aC5zcXJ0KHUqYyooby1jKS9vKSooYS1vLzI8MD8tMToxKTtpdCh0LG4sTWF0aC5tYXgoZSxNYXRoLmZsb29yKG4tYSpjL28rZikpLE1hdGgubWluKHIsTWF0aC5mbG9vcihuKyhvLWEpKmMvbytmKSksaSl9Y29uc3Qgbz10W25dO2xldCBhPWUsdT1yO2ZvcihvdCh0LGUsbiksaSh0W3JdLG8pPjAmJm90KHQsZSxyKTthPHU7KXtmb3Iob3QodCxhLHUpLCsrYSwtLXU7aSh0W2FdLG8pPDA7KSsrYTtmb3IoO2kodFt1XSxvKT4wOyktLXV9MD09PWkodFtlXSxvKT9vdCh0LGUsdSk6KCsrdSxvdCh0LHUscikpLHU8PW4mJihlPXUrMSksbjw9dSYmKHI9dS0xKX1yZXR1cm4gdH1mdW5jdGlvbiBvdCh0LG4sZSl7Y29uc3Qgcj10W25dO3Rbbl09dFtlXSx0W2VdPXJ9ZnVuY3Rpb24gYXQodCxlPW4pe2xldCByLGk9ITE7aWYoMT09PWUubGVuZ3RoKXtsZXQgbztmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PWUoYSk7KGk/bih0LG8pPjA6MD09PW4odCx0KSkmJihyPWEsbz10LGk9ITApfX1lbHNlIGZvcihjb25zdCBuIG9mIHQpKGk/ZShuLHIpPjA6MD09PWUobixuKSkmJihyPW4saT0hMCk7cmV0dXJuIHJ9ZnVuY3Rpb24gdXQodCxuLGUpe2lmKChyPSh0PUZsb2F0NjRBcnJheS5mcm9tKGEodCxlKSkpLmxlbmd0aCkmJiFpc05hTihuPStuKSl7aWYobjw9MHx8cjwyKXJldHVybiBldCh0KTtpZihuPj0xKXJldHVybiB0dCh0KTt2YXIgcixpPShyLTEpKm4sbz1NYXRoLmZsb29yKGkpLHU9dHQoaXQodCxvKS5zdWJhcnJheSgwLG8rMSkpO3JldHVybiB1KyhldCh0LnN1YmFycmF5KG8rMSkpLXUpKihpLW8pfX1mdW5jdGlvbiBjdCh0LG4sZT1vKXtpZigocj10Lmxlbmd0aCkmJiFpc05hTihuPStuKSl7aWYobjw9MHx8cjwyKXJldHVybitlKHRbMF0sMCx0KTtpZihuPj0xKXJldHVybitlKHRbci0xXSxyLTEsdCk7dmFyIHIsaT0oci0xKSpuLGE9TWF0aC5mbG9vcihpKSx1PStlKHRbYV0sYSx0KTtyZXR1cm4gdSsoK2UodFthKzFdLGErMSx0KS11KSooaS1hKX19ZnVuY3Rpb24gZnQodCxuLGUpe2lmKChyPSh0PUZsb2F0NjRBcnJheS5mcm9tKGEodCxlKSkpLmxlbmd0aCkmJiFpc05hTihuPStuKSl7aWYobjw9MHx8cjwyKXJldHVybiBydCh0KTtpZihuPj0xKXJldHVybiBudCh0KTt2YXIgcixpPU1hdGguZmxvb3IoKHItMSkqbiksbz1pdChVaW50MzJBcnJheS5mcm9tKHQsKCh0LG4pPT5uKSksaSwwLHItMSwoKG4sZSk9PkIodFtuXSx0W2VdKSkpO3JldHVybiBhdChvLnN1YmFycmF5KDAsaSsxKSwobj0+dFtuXSkpfX1mdW5jdGlvbiBzdCh0KXtyZXR1cm4gQXJyYXkuZnJvbShmdW5jdGlvbioodCl7Zm9yKGNvbnN0IG4gb2YgdCl5aWVsZCpufSh0KSl9ZnVuY3Rpb24gbHQodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBodCh0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb31mdW5jdGlvbiBkdCh0LGU9bil7aWYoMT09PWUubGVuZ3RoKXJldHVybiBydCh0LGUpO2xldCByLGk9LTEsbz0tMTtmb3IoY29uc3QgbiBvZiB0KSsrbywoaTwwPzA9PT1lKG4sbik6ZShuLHIpPDApJiYocj1uLGk9byk7cmV0dXJuIGl9dmFyIHB0PWd0KE1hdGgucmFuZG9tKTtmdW5jdGlvbiBndCh0KXtyZXR1cm4gZnVuY3Rpb24obixlPTAscj1uLmxlbmd0aCl7bGV0IGk9ci0oZT0rZSk7Zm9yKDtpOyl7Y29uc3Qgcj10KCkqaS0tfDAsbz1uW2krZV07bltpK2VdPW5bcitlXSxuW3IrZV09b31yZXR1cm4gbn19ZnVuY3Rpb24geXQodCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT1ldCh0LHZ0KSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0Lmxlbmd0aH1mdW5jdGlvbiBfdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEludGVyblNldD90Om5ldyBJbnRlcm5TZXQodCl9ZnVuY3Rpb24gYnQodCxuKXtjb25zdCBlPXRbU3ltYm9sLml0ZXJhdG9yXSgpLHI9bmV3IFNldDtmb3IoY29uc3QgdCBvZiBuKXtjb25zdCBuPW10KHQpO2lmKHIuaGFzKG4pKWNvbnRpbnVlO2xldCBpLG87Zm9yKDsoe3ZhbHVlOmksZG9uZTpvfT1lLm5leHQoKSk7KXtpZihvKXJldHVybiExO2NvbnN0IHQ9bXQoaSk7aWYoci5hZGQodCksT2JqZWN0LmlzKG4sdCkpYnJlYWt9fXJldHVybiEwfWZ1bmN0aW9uIG10KHQpe3JldHVybiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0P3QudmFsdWVPZigpOnR9ZnVuY3Rpb24geHQodCl7cmV0dXJuIHR9dmFyIHd0PTEsTXQ9MixUdD0zLEF0PTQsU3Q9MWUtNjtmdW5jdGlvbiBFdCh0KXtyZXR1cm4idHJhbnNsYXRlKCIrdCsiLDApIn1mdW5jdGlvbiBOdCh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIit0KyIpIn1mdW5jdGlvbiBrdCh0KXtyZXR1cm4gbj0+K3Qobil9ZnVuY3Rpb24gQ3QodCxuKXtyZXR1cm4gbj1NYXRoLm1heCgwLHQuYmFuZHdpZHRoKCktMipuKS8yLHQucm91bmQoKSYmKG49TWF0aC5yb3VuZChuKSksZT0+K3QoZSkrbn1mdW5jdGlvbiBQdCgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiB6dCh0LG4pe3ZhciBlPVtdLHI9bnVsbCxpPW51bGwsbz02LGE9Nix1PTMsYz0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LmRldmljZVBpeGVsUmF0aW8+MT8wOi41LGY9dD09PXd0fHx0PT09QXQ/LTE6MSxzPXQ9PT1BdHx8dD09PU10PyJ4IjoieSIsbD10PT09d3R8fHQ9PT1UdD9FdDpOdDtmdW5jdGlvbiBoKGgpe3ZhciBkPW51bGw9PXI/bi50aWNrcz9uLnRpY2tzLmFwcGx5KG4sZSk6bi5kb21haW4oKTpyLHA9bnVsbD09aT9uLnRpY2tGb3JtYXQ/bi50aWNrRm9ybWF0LmFwcGx5KG4sZSk6eHQ6aSxnPU1hdGgubWF4KG8sMCkrdSx5PW4ucmFuZ2UoKSx2PSt5WzBdK2MsXz0reVt5Lmxlbmd0aC0xXStjLGI9KG4uYmFuZHdpZHRoP0N0Omt0KShuLmNvcHkoKSxjKSxtPWguc2VsZWN0aW9uP2guc2VsZWN0aW9uKCk6aCx4PW0uc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLHc9bS5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShkLG4pLm9yZGVyKCksTT13LmV4aXQoKSxUPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxBPXcuc2VsZWN0KCJsaW5lIiksUz13LnNlbGVjdCgidGV4dCIpO3g9eC5tZXJnZSh4LmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSx3PXcubWVyZ2UoVCksQT1BLm1lcmdlKFQuYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihzKyIyIixmKm8pKSxTPVMubWVyZ2UoVC5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihzLGYqZykuYXR0cigiZHkiLHQ9PT13dD8iMGVtIjp0PT09VHQ/IjAuNzFlbSI6IjAuMzJlbSIpKSxoIT09bSYmKHg9eC50cmFuc2l0aW9uKGgpLHc9dy50cmFuc2l0aW9uKGgpLEE9QS50cmFuc2l0aW9uKGgpLFM9Uy50cmFuc2l0aW9uKGgpLE09TS50cmFuc2l0aW9uKGgpLmF0dHIoIm9wYWNpdHkiLFN0KS5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1iKHQpKT9sKHQrYyk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFQuYXR0cigib3BhY2l0eSIsU3QpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIGwoKG4mJmlzRmluaXRlKG49bih0KSk/bjpiKHQpKStjKX0pKSksTS5yZW1vdmUoKSx4LmF0dHIoImQiLHQ9PT1BdHx8dD09PU10P2E/Ik0iK2YqYSsiLCIrdisiSCIrYysiViIrXysiSCIrZiphOiJNIitjKyIsIit2KyJWIitfOmE/Ik0iK3YrIiwiK2YqYSsiViIrYysiSCIrXysiViIrZiphOiJNIit2KyIsIitjKyJIIitfKSx3LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBsKGIodCkrYyl9KSksQS5hdHRyKHMrIjIiLGYqbyksUy5hdHRyKHMsZipnKS50ZXh0KHApLG0uZmlsdGVyKFB0KS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIix0PT09TXQ/InN0YXJ0Ijp0PT09QXQ/ImVuZCI6Im1pZGRsZSIpLG0uZWFjaCgoZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ifSkpfXJldHVybiBoLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaCk6bn0saC50aWNrcz1mdW5jdGlvbigpe3JldHVybiBlPUFycmF5LmZyb20oYXJndW1lbnRzKSxofSxoLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpBcnJheS5mcm9tKHQpLGgpOmUuc2xpY2UoKX0saC50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDpBcnJheS5mcm9tKHQpLGgpOnImJnIuc2xpY2UoKX0saC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsaCk6aX0saC50aWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1hPSt0LGgpOm99LGgudGlja1NpemVJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxoKTpvfSxoLnRpY2tTaXplT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsaCk6YX0saC50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxoKTp1fSxoLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxoKTpjfSxofXZhciAkdD17dmFsdWU6KCk9Pnt9fTtmdW5jdGlvbiBEdCgpe2Zvcih2YXIgdCxuPTAsZT1hcmd1bWVudHMubGVuZ3RoLHI9e307bjxlOysrbil7aWYoISh0PWFyZ3VtZW50c1tuXSsiIil8fHQgaW4gcnx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBSdChyKX1mdW5jdGlvbiBSdCh0KXt0aGlzLl89dH1mdW5jdGlvbiBGdCh0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIHF0KHQsbixlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYodFtyXS5uYW1lPT09bil7dFtyXT0kdCx0PXQuc2xpY2UoMCxyKS5jb25jYXQodC5zbGljZShyKzEpKTticmVha31yZXR1cm4gbnVsbCE9ZSYmdC5wdXNoKHtuYW1lOm4sdmFsdWU6ZX0pLHR9UnQucHJvdG90eXBlPUR0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6UnQsb246ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dGhpcy5fLG89KHI9aSwodCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSksYT0tMSx1PW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK24pO2Zvcig7KythPHU7KWlmKGU9KHQ9b1thXSkudHlwZSlpW2VdPXF0KGlbZV0sdC5uYW1lLG4pO2Vsc2UgaWYobnVsbD09bilmb3IoZSBpbiBpKWlbZV09cXQoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPUZ0KGlbZV0sdC5uYW1lKSkpcmV0dXJuIGV9LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxuPXRoaXMuXztmb3IodmFyIGUgaW4gbil0W2VdPW5bZV0uc2xpY2UoKTtyZXR1cm4gbmV3IFJ0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsbil7aWYoKGU9YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgZSxyLGk9bmV3IEFycmF5KGUpLG89MDtvPGU7KytvKWlbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLGU9KHI9dGhpcy5fW3RdKS5sZW5ndGg7bzxlOysrbylyW29dLnZhbHVlLmFwcGx5KG4saSl9LGFwcGx5OmZ1bmN0aW9uKHQsbixlKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgcj10aGlzLl9bdF0saT0wLG89ci5sZW5ndGg7aTxvOysraSlyW2ldLnZhbHVlLmFwcGx5KG4sZSl9fTt2YXIgVXQ9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLEl0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpVdCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIE90KHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLEl0Lmhhc093blByb3BlcnR5KG4pP3tzcGFjZTpJdFtuXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIEJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09VXQmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PVV0P24uY3JlYXRlRWxlbWVudCh0KTpuLmNyZWF0ZUVsZW1lbnROUyhlLHQpfX1mdW5jdGlvbiBZdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBMdCh0KXt2YXIgbj1PdCh0KTtyZXR1cm4obi5sb2NhbD9ZdDpCdCkobil9ZnVuY3Rpb24ganQoKXt9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIG51bGw9PXQ/anQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gbnVsbD09dD9bXTpBcnJheS5pc0FycmF5KHQpP3Q6QXJyYXkuZnJvbSh0KX1mdW5jdGlvbiBHdCgpe3JldHVybltdfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBudWxsPT10P0d0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gV3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gWnQodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuLm1hdGNoZXModCl9fXZhciBLdD1BcnJheS5wcm90b3R5cGUuZmluZDtmdW5jdGlvbiBRdCgpe3JldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkfXZhciBKdD1BcnJheS5wcm90b3R5cGUuZmlsdGVyO2Z1bmN0aW9uIHRuKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbil9ZnVuY3Rpb24gbm4odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gZW4odCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59ZnVuY3Rpb24gcm4odCxuLGUscixpLG8pe2Zvcih2YXIgYSx1PTAsYz1uLmxlbmd0aCxmPW8ubGVuZ3RoO3U8ZjsrK3UpKGE9blt1XSk/KGEuX19kYXRhX189b1t1XSxyW3VdPWEpOmVbdV09bmV3IGVuKHQsb1t1XSk7Zm9yKDt1PGM7Kyt1KShhPW5bdV0pJiYoaVt1XT1hKX1mdW5jdGlvbiBvbih0LG4sZSxyLGksbyxhKXt2YXIgdSxjLGYscz1uZXcgTWFwLGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxkPW5ldyBBcnJheShsKTtmb3IodT0wO3U8bDsrK3UpKGM9blt1XSkmJihkW3VdPWY9YS5jYWxsKGMsYy5fX2RhdGFfXyx1LG4pKyIiLHMuaGFzKGYpP2lbdV09YzpzLnNldChmLGMpKTtmb3IodT0wO3U8aDsrK3UpZj1hLmNhbGwodCxvW3VdLHUsbykrIiIsKGM9cy5nZXQoZikpPyhyW3VdPWMsYy5fX2RhdGFfXz1vW3VdLHMuZGVsZXRlKGYpKTplW3VdPW5ldyBlbih0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoYz1uW3VdKSYmcy5nZXQoZFt1XSk9PT1jJiYoaVt1XT1jKX1mdW5jdGlvbiBhbih0KXtyZXR1cm4gdC5fX2RhdGFfX31mdW5jdGlvbiB1bih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJsZW5ndGgiaW4gdD90OkFycmF5LmZyb20odCl9ZnVuY3Rpb24gY24odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHNuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gbG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBobih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBkbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gcG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gZ24odCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIHluKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIHZuKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19ZnVuY3Rpb24gX24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19ZnVuY3Rpb24gYm4odCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxnbih0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKX1mdW5jdGlvbiBtbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24geG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPW59fWZ1bmN0aW9uIHduKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fWZ1bmN0aW9uIE1uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBUbih0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBBbih0KX1mdW5jdGlvbiBBbih0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9TW4odC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBTbih0LG4pe2Zvcih2YXIgZT1Ubih0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIEVuKHQsbil7Zm9yKHZhciBlPVRuKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24gTm4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7U24odGhpcyx0KX19ZnVuY3Rpb24ga24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7RW4odGhpcyx0KX19ZnVuY3Rpb24gQ24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXsobi5hcHBseSh0aGlzLGFyZ3VtZW50cyk/U246RW4pKHRoaXMsdCl9fWZ1bmN0aW9uIFBuKCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiB6bih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uICRuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBEbigpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIFJuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIEZuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gcW4oKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVW4oKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBJbigpe3JldHVybiBudWxsfWZ1bmN0aW9uIE9uKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gQm4oKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMSksbj10aGlzLnBhcmVudE5vZGU7cmV0dXJuIG4/bi5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWZ1bmN0aW9uIFluKCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITApLG49dGhpcy5wYXJlbnROb2RlO3JldHVybiBuP24uaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBMbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fb247aWYobil7Zm9yKHZhciBlLHI9MCxpPS0xLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sdC50eXBlJiZlLnR5cGUhPT10LnR5cGV8fGUubmFtZSE9PXQubmFtZT9uWysraV09ZTp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS50eXBlLGUubGlzdGVuZXIsZS5vcHRpb25zKTsrK2k/bi5sZW5ndGg9aTpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gam4odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByLGk9dGhpcy5fX29uLG89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3QuY2FsbCh0aGlzLG4sdGhpcy5fX2RhdGFfXyl9fShuKTtpZihpKWZvcih2YXIgYT0wLHU9aS5sZW5ndGg7YTx1OysrYSlpZigocj1pW2FdKS50eXBlPT09dC50eXBlJiZyLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLnR5cGUsci5saXN0ZW5lcixyLm9wdGlvbnMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihyLnR5cGUsci5saXN0ZW5lcj1vLHIub3B0aW9ucz1lKSx2b2lkKHIudmFsdWU9bik7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxvLGUpLHI9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOm4sbGlzdGVuZXI6byxvcHRpb25zOmV9LGk/aS5wdXNoKHIpOnRoaXMuX19vbj1bcl19fWZ1bmN0aW9uIEhuKHQsbixlKXt2YXIgcj1nbih0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX1mdW5jdGlvbiBYbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBIbih0aGlzLHQsbil9fWZ1bmN0aW9uIEduKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEhuKHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fWVuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZW4sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxuKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sQW4ucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVm49W251bGxdO2Z1bmN0aW9uIFduKHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIFpuKCl7cmV0dXJuIG5ldyBXbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLFZuKX1mdW5jdGlvbiBLbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFduKFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgV24oW1t0XV0sVm4pfVduLnByb3RvdHlwZT1abi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlduLHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SHQodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYSx1PW5baV0sYz11Lmxlbmd0aCxmPXJbaV09bmV3IEFycmF5KGMpLHM9MDtzPGM7KytzKShvPXVbc10pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGZbc109YSk7cmV0dXJuIG5ldyBXbihyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dD0iZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gWHQodC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0odCk6VnQodCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGM9dS5sZW5ndGgsZj0wO2Y8YzsrK2YpKGE9dVtmXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxmLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgV24ocixpKX0sc2VsZWN0Q2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0KG51bGw9PXQ/UXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEt0LmNhbGwodGhpcy5jaGlsZHJlbix0KX19KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WnQodCkpKX0sc2VsZWN0Q2hpbGRyZW46ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0QWxsKG51bGw9PXQ/dG46ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEp0LmNhbGwodGhpcy5jaGlsZHJlbix0KX19KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WnQodCkpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1XdCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxjPXJbaV09W10sZj0wO2Y8dTsrK2YpKG89YVtmXSkmJnQuY2FsbChvLG8uX19kYXRhX18sZixhKSYmYy5wdXNoKG8pO3JldHVybiBuZXcgV24ocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBBcnJheS5mcm9tKHRoaXMsYW4pO3ZhciBlPW4/b246cm4scj10aGlzLl9wYXJlbnRzLGk9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KHQpKTtmb3IodmFyIG89aS5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksYz1uZXcgQXJyYXkobyksZj0wO2Y8bzsrK2Ype3ZhciBzPXJbZl0sbD1pW2ZdLGg9bC5sZW5ndGgsZD11bih0LmNhbGwocyxzJiZzLl9fZGF0YV9fLGYscikpLHA9ZC5sZW5ndGgsZz11W2ZdPW5ldyBBcnJheShwKSx5PWFbZl09bmV3IEFycmF5KHApO2UocyxsLGcseSxjW2ZdPW5ldyBBcnJheShoKSxkLG4pO2Zvcih2YXIgdixfLGI9MCxtPTA7YjxwOysrYilpZih2PWdbYl0pe2ZvcihiPj1tJiYobT1iKzEpOyEoXz15W21dKSYmKyttPHA7KTt2Ll9uZXh0PV98fG51bGx9fXJldHVybihhPW5ldyBXbihhLHIpKS5fZW50ZXI9dSxhLl9leGl0PWMsYX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFduKHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKG5uKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgV24odGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChubiksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24odCxuLGUpe3ZhciByPXRoaXMuZW50ZXIoKSxpPXRoaXMsbz10aGlzLmV4aXQoKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10KHIpKSYmKHI9ci5zZWxlY3Rpb24oKSk6cj1yLmFwcGVuZCh0KyIiKSxudWxsIT1uJiYoaT1uKGkpKSYmKGk9aS5zZWxlY3Rpb24oKSksbnVsbD09ZT9vLnJlbW92ZSgpOmUobyksciYmaT9yLm1lcmdlKGkpLm9yZGVyKCk6aX0sbWVyZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dCxlPXRoaXMuX2dyb3VwcyxyPW4uX2dyb3VwcyxpPWUubGVuZ3RoLG89ci5sZW5ndGgsYT1NYXRoLm1pbihpLG8pLHU9bmV3IEFycmF5KGkpLGM9MDtjPGE7KytjKWZvcih2YXIgZixzPWVbY10sbD1yW2NdLGg9cy5sZW5ndGgsZD11W2NdPW5ldyBBcnJheShoKSxwPTA7cDxoOysrcCkoZj1zW3BdfHxsW3BdKSYmKGRbcF09Zik7Zm9yKDtjPGk7KytjKXVbY109ZVtjXTtyZXR1cm4gbmV3IFduKHUsdGhpcy5fcGFyZW50cyl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJjReci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLGEpLGE9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLGUpe3JldHVybiBuJiZlP3Qobi5fX2RhdGFfXyxlLl9fZGF0YV9fKTohbi0hZX10fHwodD1jbik7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIGEsdT1lW29dLGM9dS5sZW5ndGgsZj1pW29dPW5ldyBBcnJheShjKSxzPTA7czxjOysrcykoYT11W3NdKSYmKGZbc109YSk7Zi5zb3J0KG4pfXJldHVybiBuZXcgV24oaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMpfSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciBhPXJbaV07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgdGhpcykrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLGE9MCx1PW8ubGVuZ3RoO2E8dTsrK2EpKGk9b1thXSkmJnQuY2FsbChpLGkuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPU90KHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHI9dGhpcy5ub2RlKCk7cmV0dXJuIGUubG9jYWw/ci5nZXRBdHRyaWJ1dGVOUyhlLnNwYWNlLGUubG9jYWwpOnIuZ2V0QXR0cmlidXRlKGUpfXJldHVybiB0aGlzLmVhY2goKG51bGw9PW4/ZS5sb2NhbD9zbjpmbjoiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP3BuOmRuOmUubG9jYWw/aG46bG4pKGUsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/eW46ImZ1bmN0aW9uIj09dHlwZW9mIG4/X246dm4pKHQsbixudWxsPT1lPyIiOmUpKTpibih0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9tbjoiZnVuY3Rpb24iPT10eXBlb2Ygbj93bjp4bikodCxuKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1Nbih0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcj1Ubih0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9DbjpuP05uOmtuKShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9QbjooImZ1bmN0aW9uIj09dHlwZW9mIHQ/JG46em4pKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9EbjooImZ1bmN0aW9uIj09dHlwZW9mIHQ/Rm46Um4pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChxbil9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChVbil9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Okx0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6THQodCkscj1udWxsPT1uP0luOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246SHQobik7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goT24pfSxjbG9uZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9ZbjpCbil9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHt0eXBlOnQsbmFtZTpufX0pKX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/am46TG4scj0wO3I8YTsrK3IpdGhpcy5lYWNoKHUob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgdT10aGlzLm5vZGUoKS5fX29uO2lmKHUpZm9yKHZhciBjLGY9MCxzPXUubGVuZ3RoO2Y8czsrK2YpZm9yKHI9MCxjPXVbZl07cjxhOysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIG4/R246WG4pKHQsbikpfSxbU3ltYm9sLml0ZXJhdG9yXTpmdW5jdGlvbiooKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByLGk9dFtuXSxvPTAsYT1pLmxlbmd0aDtvPGE7KytvKShyPWlbb10pJiYoeWllbGQgcil9fTt2YXIgUW49MDtmdW5jdGlvbiBKbigpe3JldHVybiBuZXcgdGV9ZnVuY3Rpb24gdGUoKXt0aGlzLl89IkAiKygrK1FuKS50b1N0cmluZygzNil9ZnVuY3Rpb24gbmUodCl7bGV0IG47Zm9yKDtuPXQuc291cmNlRXZlbnQ7KXQ9bjtyZXR1cm4gdH1mdW5jdGlvbiBlZSh0LG4pe2lmKHQ9bmUodCksdm9pZCAwPT09biYmKG49dC5jdXJyZW50VGFyZ2V0KSxuKXt2YXIgZT1uLm93bmVyU1ZHRWxlbWVudHx8bjtpZihlLmNyZWF0ZVNWR1BvaW50KXt2YXIgcj1lLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIHIueD10LmNsaWVudFgsci55PXQuY2xpZW50WSxbKHI9ci5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LHIueV19aWYobi5nZXRCb3VuZGluZ0NsaWVudFJlY3Qpe3ZhciBpPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW3QuY2xpZW50WC1pLmxlZnQtbi5jbGllbnRMZWZ0LHQuY2xpZW50WS1pLnRvcC1uLmNsaWVudFRvcF19fXJldHVyblt0LnBhZ2VYLHQucGFnZVldfXRlLnByb3RvdHlwZT1Kbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRlLGdldDpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fOyEobiBpbiB0KTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0W25dfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdFt0aGlzLl9dPW59LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fIGluIHQmJmRlbGV0ZSB0W3RoaXMuX119LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O2NvbnN0IHJlPXtwYXNzaXZlOiExfSxpZT17Y2FwdHVyZTohMCxwYXNzaXZlOiExfTtmdW5jdGlvbiBvZSh0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGFlKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHVlKHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9S24odCkub24oImRyYWdzdGFydC5kcmFnIixhZSxpZSk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixhZSxpZSk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gY2UodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUtuKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGFlLGllKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3Iub24oImNsaWNrLmRyYWciLG51bGwpfSksMCkpLCJvbnNlbGVjdHN0YXJ0ImluIGU/ci5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KGUuc3R5bGUuTW96VXNlclNlbGVjdD1lLl9fbm9zZWxlY3QsZGVsZXRlIGUuX19ub3NlbGVjdCl9dmFyIGZlPXQ9PigpPT50O2Z1bmN0aW9uIHNlKHQse3NvdXJjZUV2ZW50Om4sc3ViamVjdDplLHRhcmdldDpyLGlkZW50aWZpZXI6aSxhY3RpdmU6byx4OmEseTp1LGR4OmMsZHk6ZixkaXNwYXRjaDpzfSl7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7dHlwZTp7dmFsdWU6dCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sc291cmNlRXZlbnQ6e3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHN1YmplY3Q6e3ZhbHVlOmUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHRhcmdldDp7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0saWRlbnRpZmllcjp7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sYWN0aXZlOnt2YWx1ZTpvLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx4Ont2YWx1ZTphLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx5Ont2YWx1ZTp1LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSxkeDp7dmFsdWU6YyxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sZHk6e3ZhbHVlOmYsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LF86e3ZhbHVlOnN9fSl9ZnVuY3Rpb24gbGUodCl7cmV0dXJuIXQuY3RybEtleSYmIXQuYnV0dG9ufWZ1bmN0aW9uIGhlKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBkZSh0LG4pe3JldHVybiBudWxsPT1uP3t4OnQueCx5OnQueX06bn1mdW5jdGlvbiBwZSgpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBnZSh0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geWUodCxuKXt2YXIgZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9ZnVuY3Rpb24gdmUoKXt9c2UucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIF9lPS43LGJlPTEvX2UsbWU9IlxccyooWystXT9cXGQrKVxccyoiLHhlPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIix3ZT0iXFxzKihbKy1dPyg/OlxcZCpcXC4pP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLE1lPS9eIyhbMC05YS1mXXszLDh9KSQvLFRlPW5ldyBSZWdFeHAoYF5yZ2JcXCgke21lfSwke21lfSwke21lfVxcKSRgKSxBZT1uZXcgUmVnRXhwKGBecmdiXFwoJHt3ZX0sJHt3ZX0sJHt3ZX1cXCkkYCksU2U9bmV3IFJlZ0V4cChgXnJnYmFcXCgke21lfSwke21lfSwke21lfSwke3hlfVxcKSRgKSxFZT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7d2V9LCR7d2V9LCR7d2V9LCR7eGV9XFwpJGApLE5lPW5ldyBSZWdFeHAoYF5oc2xcXCgke3hlfSwke3dlfSwke3dlfVxcKSRgKSxrZT1uZXcgUmVnRXhwKGBeaHNsYVxcKCR7eGV9LCR7d2V9LCR7d2V9LCR7eGV9XFwpJGApLENlPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIFBlKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gemUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiAkZSh0KXt2YXIgbixlO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1NZS5leGVjKHQpKT8oZT1uWzFdLmxlbmd0aCxuPXBhcnNlSW50KG5bMV0sMTYpLDY9PT1lP0RlKG4pOjM9PT1lP25ldyBVZShuPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6OD09PWU/UmUobj4+MjQmMjU1LG4+PjE2JjI1NSxuPj44JjI1NSwoMjU1Jm4pLzI1NSk6ND09PWU/UmUobj4+MTImMTV8bj4+OCYyNDAsbj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgoMTUmbik8PDR8MTUmbikvMjU1KTpudWxsKToobj1UZS5leGVjKHQpKT9uZXcgVWUoblsxXSxuWzJdLG5bM10sMSk6KG49QWUuZXhlYyh0KSk/bmV3IFVlKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLDEpOihuPVNlLmV4ZWModCkpP1JlKG5bMV0sblsyXSxuWzNdLG5bNF0pOihuPUVlLmV4ZWModCkpP1JlKDI1NSpuWzFdLzEwMCwyNTUqblsyXS8xMDAsMjU1Km5bM10vMTAwLG5bNF0pOihuPU5lLmV4ZWModCkpP2plKG5bMV0sblsyXS8xMDAsblszXS8xMDAsMSk6KG49a2UuZXhlYyh0KSk/amUoblsxXSxuWzJdLzEwMCxuWzNdLzEwMCxuWzRdKTpDZS5oYXNPd25Qcm9wZXJ0eSh0KT9EZShDZVt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IFVlKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gRGUodCl7cmV0dXJuIG5ldyBVZSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gUmUodCxuLGUscil7cmV0dXJuIHI8PTAmJih0PW49ZT1OYU4pLG5ldyBVZSh0LG4sZSxyKX1mdW5jdGlvbiBGZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHZlfHwodD0kZSh0KSksdD9uZXcgVWUoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IFVlfWZ1bmN0aW9uIHFlKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9GZSh0KTpuZXcgVWUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFVlKHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBJZSgpe3JldHVybmAjJHtMZSh0aGlzLnIpfSR7TGUodGhpcy5nKX0ke0xlKHRoaXMuYil9YH1mdW5jdGlvbiBPZSgpe2NvbnN0IHQ9QmUodGhpcy5vcGFjaXR5KTtyZXR1cm5gJHsxPT09dD8icmdiKCI6InJnYmEoIn0ke1llKHRoaXMucil9LCAke1llKHRoaXMuZyl9LCAke1llKHRoaXMuYil9JHsxPT09dD8iKSI6YCwgJHt0fSlgfWB9ZnVuY3Rpb24gQmUodCl7cmV0dXJuIGlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKX1mdW5jdGlvbiBZZSh0KXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpfWZ1bmN0aW9uIExlKHQpe3JldHVybigodD1ZZSh0KSk8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBqZSh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IEdlKHQsbixlLHIpfWZ1bmN0aW9uIEhlKHQpe2lmKHQgaW5zdGFuY2VvZiBHZSlyZXR1cm4gbmV3IEdlKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHZlfHwodD0kZSh0KSksIXQpcmV0dXJuIG5ldyBHZTtpZih0IGluc3RhbmNlb2YgR2UpcmV0dXJuIHQ7dmFyIG49KHQ9dC5yZ2IoKSkuci8yNTUsZT10LmcvMjU1LHI9dC5iLzI1NSxpPU1hdGgubWluKG4sZSxyKSxvPU1hdGgubWF4KG4sZSxyKSxhPU5hTix1PW8taSxjPShvK2kpLzI7cmV0dXJuIHU/KGE9bj09PW8/KGUtcikvdSs2KihlPHIpOmU9PT1vPyhyLW4pL3UrMjoobi1lKS91KzQsdS89YzwuNT9vK2k6Mi1vLWksYSo9NjApOnU9Yz4wJiZjPDE/MDphLG5ldyBHZShhLHUsYyx0Lm9wYWNpdHkpfWZ1bmN0aW9uIFhlKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9IZSh0KTpuZXcgR2UodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIEdlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBWZSh0KXtyZXR1cm4odD0odHx8MCklMzYwKTwwP3QrMzYwOnR9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSx0fHwwKSl9ZnVuY3Rpb24gWmUodCxuLGUpe3JldHVybiAyNTUqKHQ8NjA/bisoZS1uKSp0LzYwOnQ8MTgwP2U6dDwyNDA/bisoZS1uKSooMjQwLXQpLzYwOm4pfWdlKHZlLCRlLHtjb3B5KHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OlBlLGZvcm1hdEhleDpQZSxmb3JtYXRIZXg4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpfSxmb3JtYXRIc2w6ZnVuY3Rpb24oKXtyZXR1cm4gSGUodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjp6ZSx0b1N0cmluZzp6ZX0pLGdlKFVlLHFlLHllKHZlLHticmlnaHRlcih0KXtyZXR1cm4gdD1udWxsPT10P2JlOk1hdGgucG93KGJlLHQpLG5ldyBVZSh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXIodCl7cmV0dXJuIHQ9bnVsbD09dD9fZTpNYXRoLnBvdyhfZSx0KSxuZXcgVWUodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBVZShZZSh0aGlzLnIpLFllKHRoaXMuZyksWWUodGhpcy5iKSxCZSh0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OkllLGZvcm1hdEhleDpJZSxmb3JtYXRIZXg4OmZ1bmN0aW9uKCl7cmV0dXJuYCMke0xlKHRoaXMucil9JHtMZSh0aGlzLmcpfSR7TGUodGhpcy5iKX0ke0xlKDI1NSooaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkpfWB9LGZvcm1hdFJnYjpPZSx0b1N0cmluZzpPZX0pKSxnZShHZSxYZSx5ZSh2ZSx7YnJpZ2h0ZXIodCl7cmV0dXJuIHQ9bnVsbD09dD9iZTpNYXRoLnBvdyhiZSx0KSxuZXcgR2UodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXIodCl7cmV0dXJuIHQ9bnVsbD09dD9fZTpNYXRoLnBvdyhfZSx0KSxuZXcgR2UodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2IoKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLG49aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsZT10aGlzLmwscj1lKyhlPC41P2U6MS1lKSpuLGk9MiplLXI7cmV0dXJuIG5ldyBVZShaZSh0Pj0yNDA/dC0yNDA6dCsxMjAsaSxyKSxaZSh0LGksciksWmUodDwxMjA/dCsyNDA6dC0xMjAsaSxyKSx0aGlzLm9wYWNpdHkpfSxjbGFtcCgpe3JldHVybiBuZXcgR2UoVmUodGhpcy5oKSxXZSh0aGlzLnMpLFdlKHRoaXMubCksQmUodGhpcy5vcGFjaXR5KSl9LGRpc3BsYXlhYmxlKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2woKXtjb25zdCB0PUJlKHRoaXMub3BhY2l0eSk7cmV0dXJuYCR7MT09PXQ/ImhzbCgiOiJoc2xhKCJ9JHtWZSh0aGlzLmgpfSwgJHsxMDAqV2UodGhpcy5zKX0lLCAkezEwMCpXZSh0aGlzLmwpfSUkezE9PT10PyIpIjpgLCAke3R9KWB9YH19KSk7Y29uc3QgS2U9TWF0aC5QSS8xODAsUWU9MTgwL01hdGguUEksSmU9Ljk2NDIyLHRyPTEsbnI9LjgyNTIxLGVyPTQvMjkscnI9Ni8yOSxpcj0zKnJyKnJyLG9yPXJyKnJyKnJyO2Z1bmN0aW9uIGFyKHQpe2lmKHQgaW5zdGFuY2VvZiBjcilyZXR1cm4gbmV3IGNyKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGdyKXJldHVybiB5cih0KTt0IGluc3RhbmNlb2YgVWV8fCh0PUZlKHQpKTt2YXIgbixlLHI9aHIodC5yKSxpPWhyKHQuZyksbz1ocih0LmIpLGE9ZnIoKC4yMjI1MDQ1KnIrLjcxNjg3ODYqaSsuMDYwNjE2OSpvKS90cik7cmV0dXJuIHI9PT1pJiZpPT09bz9uPWU9YToobj1mcigoLjQzNjA3NDcqcisuMzg1MDY0OSppKy4xNDMwODA0Km8pL0plKSxlPWZyKCguMDEzOTMyMipyKy4wOTcxMDQ1KmkrLjcxNDE3MzMqbykvbnIpKSxuZXcgY3IoMTE2KmEtMTYsNTAwKihuLWEpLDIwMCooYS1lKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHVyKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9hcih0KTpuZXcgY3IodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGNyKHQsbixlLHIpe3RoaXMubD0rdCx0aGlzLmE9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBmcih0KXtyZXR1cm4gdD5vcj9NYXRoLnBvdyh0LDEvMyk6dC9pcitlcn1mdW5jdGlvbiBzcih0KXtyZXR1cm4gdD5ycj90KnQqdDppcioodC1lcil9ZnVuY3Rpb24gbHIodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBocih0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBkcih0KXtpZih0IGluc3RhbmNlb2YgZ3IpcmV0dXJuIG5ldyBncih0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBjcnx8KHQ9YXIodCkpLDA9PT10LmEmJjA9PT10LmIpcmV0dXJuIG5ldyBncihOYU4sMDx0LmwmJnQubDwxMDA/MDpOYU4sdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpRZTtyZXR1cm4gbmV3IGdyKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHByKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9kcih0KTpuZXcgZ3IodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGdyKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiB5cih0KXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgY3IodC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpLZTtyZXR1cm4gbmV3IGNyKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9Z2UoY3IsdXIseWUodmUse2JyaWdodGVyKHQpe3JldHVybiBuZXcgY3IodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXIodCl7cmV0dXJuIG5ldyBjcih0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixuPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsZT1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgVWUobHIoMy4xMzM4NTYxKihuPUplKnNyKG4pKS0xLjYxNjg2NjcqKHQ9dHIqc3IodCkpLS40OTA2MTQ2KihlPW5yKnNyKGUpKSksbHIoLS45Nzg3Njg0Km4rMS45MTYxNDE1KnQrLjAzMzQ1NCplKSxsciguMDcxOTQ1MypuLS4yMjg5OTE0KnQrMS40MDUyNDI3KmUpLHRoaXMub3BhY2l0eSl9fSkpLGdlKGdyLHByLHllKHZlLHticmlnaHRlcih0KXtyZXR1cm4gbmV3IGdyKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyKHQpe3JldHVybiBuZXcgZ3IodGhpcy5oLHRoaXMuYyx0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2IoKXtyZXR1cm4geXIodGhpcykucmdiKCl9fSkpO3ZhciB2cj0tLjE0ODYxLF9yPTEuNzgyNzcsYnI9LS4yOTIyNyxtcj0tLjkwNjQ5LHhyPTEuOTcyOTQsd3I9eHIqbXIsTXI9eHIqX3IsVHI9X3IqYnItbXIqdnI7ZnVuY3Rpb24gQXIodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBTcilyZXR1cm4gbmV3IFNyKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIFVlfHwodD1GZSh0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KFRyKnIrd3Iqbi1NciplKS8oVHIrd3ItTXIpLG89ci1pLGE9KHhyKihlLWkpLWJyKm8pL21yLHU9TWF0aC5zcXJ0KGEqYStvKm8pLyh4cippKigxLWkpKSxjPXU/TWF0aC5hdGFuMihhLG8pKlFlLTEyMDpOYU47cmV0dXJuIG5ldyBTcihjPDA/YyszNjA6Yyx1LGksdC5vcGFjaXR5KX0odCk6bmV3IFNyKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBTcih0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gRXIodCxuLGUscixpKXt2YXIgbz10KnQsYT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tYSkqbisoNC02Km8rMyphKSplKygxKzMqdCszKm8tMyphKSpyK2EqaSkvNn1mdW5jdGlvbiBOcih0KXt2YXIgbj10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lPD0wP2U9MDplPj0xPyhlPTEsbi0xKTpNYXRoLmZsb29yKGUqbiksaT10W3JdLG89dFtyKzFdLGE9cj4wP3Rbci0xXToyKmktbyx1PXI8bi0xP3RbcisyXToyKm8taTtyZXR1cm4gRXIoKGUtci9uKSpuLGEsaSxvLHUpfX1mdW5jdGlvbiBrcih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLGE9dFsocisxKSVuXSx1PXRbKHIrMiklbl07cmV0dXJuIEVyKChlLXIvbikqbixpLG8sYSx1KX19Z2UoU3IsQXIseWUodmUse2JyaWdodGVyKHQpe3JldHVybiB0PW51bGw9PXQ/YmU6TWF0aC5wb3coYmUsdCksbmV3IFNyKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyKHQpe3JldHVybiB0PW51bGw9PXQ/X2U6TWF0aC5wb3coX2UsdCksbmV3IFNyKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpLZSxuPSt0aGlzLmwsZT1pc05hTih0aGlzLnMpPzA6dGhpcy5zKm4qKDEtbikscj1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiBuZXcgVWUoMjU1KihuK2UqKHZyKnIrX3IqaSkpLDI1NSoobitlKihicipyK21yKmkpKSwyNTUqKG4rZSooeHIqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBDcj10PT4oKT0+dDtmdW5jdGlvbiBQcih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCtlKm59fWZ1bmN0aW9uIHpyKHQsbil7dmFyIGU9bi10O3JldHVybiBlP1ByKHQsZT4xODB8fGU8LTE4MD9lLTM2MCpNYXRoLnJvdW5kKGUvMzYwKTplKTpDcihpc05hTih0KT9uOnQpfWZ1bmN0aW9uICRyKHQpe3JldHVybiAxPT0odD0rdCk/RHI6ZnVuY3Rpb24obixlKXtyZXR1cm4gZS1uP2Z1bmN0aW9uKHQsbixlKXtyZXR1cm4gdD1NYXRoLnBvdyh0LGUpLG49TWF0aC5wb3cobixlKS10LGU9MS9lLGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnBvdyh0K3IqbixlKX19KG4sZSx0KTpDcihpc05hTihuKT9lOm4pfX1mdW5jdGlvbiBEcih0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9Qcih0LGUpOkNyKGlzTmFOKHQpP246dCl9dmFyIFJyPWZ1bmN0aW9uIHQobil7dmFyIGU9JHIobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9cWUodCkpLnIsKG49cWUobikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1Ecih0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gRnIodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1xZShuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgcXI9RnIoTnIpLFVyPUZyKGtyKTtmdW5jdGlvbiBJcih0LG4pe258fChuPVtdKTt2YXIgZSxyPXQ/TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpOjAsaT1uLnNsaWNlKCk7cmV0dXJuIGZ1bmN0aW9uKG8pe2ZvcihlPTA7ZTxyOysrZSlpW2VdPXRbZV0qKDEtbykrbltlXSpvO3JldHVybiBpfX1mdW5jdGlvbiBPcih0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gQnIodCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1Wcih0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSlhW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSlhW2VdPW9bZV0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIFlyKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbj0rbixmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQqKDEtcikrbipyKSxlfX1mdW5jdGlvbiBMcih0LG4pe3JldHVybiB0PSt0LG49K24sZnVuY3Rpb24oZSl7cmV0dXJuIHQqKDEtZSkrbiplfX1mdW5jdGlvbiBqcih0LG4pe3ZhciBlLHI9e30saT17fTtmb3IoZSBpbiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PW4mJiJvYmplY3QiPT10eXBlb2Ygbnx8KG49e30pLG4pZSBpbiB0P3JbZV09VnIodFtlXSxuW2VdKTppW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlIGluIHIpaVtlXT1yW2VdKHQpO3JldHVybiBpfX12YXIgSHI9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLFhyPW5ldyBSZWdFeHAoSHIuc291cmNlLCJnIik7ZnVuY3Rpb24gR3IodCxuKXt2YXIgZSxyLGksbz1Ici5sYXN0SW5kZXg9WHIubGFzdEluZGV4PTAsYT0tMSx1PVtdLGM9W107Zm9yKHQrPSIiLG4rPSIiOyhlPUhyLmV4ZWModCkpJiYocj1Yci5leGVjKG4pKTspKGk9ci5pbmRleCk+byYmKGk9bi5zbGljZShvLGkpLHVbYV0/dVthXSs9aTp1WysrYV09aSksKGU9ZVswXSk9PT0ocj1yWzBdKT91W2FdP3VbYV0rPXI6dVsrK2FdPXI6KHVbKythXT1udWxsLGMucHVzaCh7aTphLHg6THIoZSxyKX0pKSxvPVhyLmxhc3RJbmRleDtyZXR1cm4gbzxuLmxlbmd0aCYmKGk9bi5zbGljZShvKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLHUubGVuZ3RoPDI/Y1swXT9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9fShjWzBdLngpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0obik6KG49Yy5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBlLHI9MDtyPG47KytyKXVbKGU9Y1tyXSkuaV09ZS54KHQpO3JldHVybiB1LmpvaW4oIiIpfSl9ZnVuY3Rpb24gVnIodCxuKXt2YXIgZSxyPXR5cGVvZiBuO3JldHVybiBudWxsPT1ufHwiYm9vbGVhbiI9PT1yP0NyKG4pOigibnVtYmVyIj09PXI/THI6InN0cmluZyI9PT1yPyhlPSRlKG4pKT8obj1lLFJyKTpHcjpuIGluc3RhbmNlb2YgJGU/UnI6biBpbnN0YW5jZW9mIERhdGU/WXI6T3Iobik/SXI6QXJyYXkuaXNBcnJheShuKT9CcjoiZnVuY3Rpb24iIT10eXBlb2Ygbi52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2Ygbi50b1N0cmluZ3x8aXNOYU4obik/anI6THIpKHQsbil9ZnVuY3Rpb24gV3IodCxuKXtyZXR1cm4gdD0rdCxuPStuLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKHQqKDEtZSkrbiplKX19dmFyIFpyLEtyPTE4MC9NYXRoLlBJLFFyPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIEpyKHQsbixlLHIsaSxvKXt2YXIgYSx1LGM7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtuKm4pKSYmKHQvPWEsbi89YSksKGM9dCplK24qcikmJihlLT10KmMsci09bipjKSwodT1NYXRoLnNxcnQoZSplK3IqcikpJiYoZS89dSxyLz11LGMvPXUpLHQqcjxuKmUmJih0PS10LG49LW4sYz0tYyxhPS1hKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihuLHQpKktyLHNrZXdYOk1hdGguYXRhbihjKSpLcixzY2FsZVg6YSxzY2FsZVk6dX19ZnVuY3Rpb24gdGkodCxuLGUscil7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHU9W10sYz1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSxmdW5jdGlvbih0LHIsaSxvLGEsdSl7aWYodCE9PWl8fHIhPT1vKXt2YXIgYz1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsbixudWxsLGUpO3UucHVzaCh7aTpjLTQseDpMcih0LGkpfSx7aTpjLTIseDpMcihyLG8pfSl9ZWxzZShpfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIitpK24rbytlKX0oby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHUsYyksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/KHQtbj4xODA/bis9MzYwOm4tdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTplLnB1c2goaShlKSsicm90YXRlKCIsbnVsbCxyKS0yLHg6THIodCxuKX0pKTpuJiZlLnB1c2goaShlKSsicm90YXRlKCIrbityKX0oby5yb3RhdGUsYS5yb3RhdGUsdSxjKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj9vLnB1c2goe2k6ZS5wdXNoKGkoZSkrInNrZXdYKCIsbnVsbCxyKS0yLHg6THIodCxuKX0pOm4mJmUucHVzaChpKGUpKyJza2V3WCgiK24rcil9KG8uc2tld1gsYS5za2V3WCx1LGMpLGZ1bmN0aW9uKHQsbixlLHIsbyxhKXtpZih0IT09ZXx8biE9PXIpe3ZhciB1PW8ucHVzaChpKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6dS00LHg6THIodCxlKX0se2k6dS0yLHg6THIobixyKX0pfWVsc2UgMT09PWUmJjE9PT1yfHxvLnB1c2goaShvKSsic2NhbGUoIitlKyIsIityKyIpIil9KG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHUsYyksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj1jLmxlbmd0aDsrK2U8cjspdVsobj1jW2VdKS5pXT1uLngodCk7cmV0dXJuIHUuam9pbigiIil9fX12YXIgbmk9dGkoKGZ1bmN0aW9uKHQpe2NvbnN0IG49bmV3KCJmdW5jdGlvbiI9PXR5cGVvZiBET01NYXRyaXg/RE9NTWF0cml4OldlYktpdENTU01hdHJpeCkodCsiIik7cmV0dXJuIG4uaXNJZGVudGl0eT9RcjpKcihuLmEsbi5iLG4uYyxuLmQsbi5lLG4uZil9KSwicHgsICIsInB4KSIsImRlZykiKSxlaT10aSgoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/UXI6KFpyfHwoWnI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksWnIuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVpyLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0pyKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlFyKX0pLCIsICIsIikiLCIpIik7ZnVuY3Rpb24gcmkodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9dmFyIGlpPWZ1bmN0aW9uIHQobixlLHIpe2Z1bmN0aW9uIGkodCxpKXt2YXIgbyxhLHU9dFswXSxjPXRbMV0sZj10WzJdLHM9aVswXSxsPWlbMV0saD1pWzJdLGQ9cy11LHA9bC1jLGc9ZCpkK3AqcDtpZihnPDFlLTEyKWE9TWF0aC5sb2coaC9mKS9uLG89ZnVuY3Rpb24odCl7cmV0dXJuW3UrdCpkLGMrdCpwLGYqTWF0aC5leHAobip0KmEpXX07ZWxzZXt2YXIgeT1NYXRoLnNxcnQoZyksdj0oaCpoLWYqZityKmcpLygyKmYqZSp5KSxfPShoKmgtZipmLXIqZykvKDIqaCplKnkpLGI9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KSxtPU1hdGgubG9nKE1hdGguc3FydChfKl8rMSktXyk7YT0obS1iKS9uLG89ZnVuY3Rpb24odCl7dmFyIHI9dCphLGk9cmkoYiksbz1mLyhlKnkpKihpKmZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCgyKnQpKS0xKS8odCsxKX0obipyK2IpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShiKSk7cmV0dXJuW3UrbypkLGMrbypwLGYqaS9yaShuKnIrYildfX1yZXR1cm4gby5kdXJhdGlvbj0xZTMqYSpuL01hdGguU1FSVDIsb31yZXR1cm4gaS5yaG89ZnVuY3Rpb24obil7dmFyIGU9TWF0aC5tYXgoLjAwMSwrbikscj1lKmU7cmV0dXJuIHQoZSxyLHIqcil9LGl9KE1hdGguU1FSVDIsMiw0KTtmdW5jdGlvbiBvaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVhlKG4pKS5oLChlPVhlKGUpKS5oKSxpPURyKG4ucyxlLnMpLG89RHIobi5sLGUubCksYT1EcihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgYWk9b2koenIpLHVpPW9pKERyKTtmdW5jdGlvbiBjaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPXByKG4pKS5oLChlPXByKGUpKS5oKSxpPURyKG4uYyxlLmMpLG89RHIobi5sLGUubCksYT1EcihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgZmk9Y2koenIpLHNpPWNpKERyKTtmdW5jdGlvbiBsaSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1BcihuKSkuaCwocj1BcihyKSkuaCksbz1EcihuLnMsci5zKSxhPURyKG4ubCxyLmwpLHU9RHIobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIGhpPWxpKHpyKSxkaT1saShEcik7ZnVuY3Rpb24gcGkodCxuKXt2b2lkIDA9PT1uJiYobj10LHQ9VnIpO2Zvcih2YXIgZT0wLHI9bi5sZW5ndGgtMSxpPW5bMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPXQoaSxpPW5bKytlXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsTWF0aC5taW4oci0xLE1hdGguZmxvb3IodCo9cikpKTtyZXR1cm4gb1tuXSh0LW4pfX12YXIgZ2kseWksdmk9MCxfaT0wLGJpPTAsbWk9MWUzLHhpPTAsd2k9MCxNaT0wLFRpPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLEFpPSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIFNpKCl7cmV0dXJuIHdpfHwoQWkoRWkpLHdpPVRpLm5vdygpK01pKX1mdW5jdGlvbiBFaSgpe3dpPTB9ZnVuY3Rpb24gTmkoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIGtpKHQsbixlKXt2YXIgcj1uZXcgTmk7cmV0dXJuIHIucmVzdGFydCh0LG4sZSkscn1mdW5jdGlvbiBDaSgpe1NpKCksKyt2aTtmb3IodmFyIHQsbj1naTtuOykodD13aS1uLl90aW1lKT49MCYmbi5fY2FsbC5jYWxsKHZvaWQgMCx0KSxuPW4uX25leHQ7LS12aX1mdW5jdGlvbiBQaSgpe3dpPSh4aT1UaS5ub3coKSkrTWksdmk9X2k9MDt0cnl7Q2koKX1maW5hbGx5e3ZpPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9Z2kscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46Z2k9bik7eWk9dCwkaShyKX0oKSx3aT0wfX1mdW5jdGlvbiB6aSgpe3ZhciB0PVRpLm5vdygpLG49dC14aTtuPm1pJiYoTWktPW4seGk9dCl9ZnVuY3Rpb24gJGkodCl7dml8fChfaSYmKF9pPWNsZWFyVGltZW91dChfaSkpLHQtd2k+MjQ/KHQ8MS8wJiYoX2k9c2V0VGltZW91dChQaSx0LVRpLm5vdygpLU1pKSksYmkmJihiaT1jbGVhckludGVydmFsKGJpKSkpOihiaXx8KHhpPVRpLm5vdygpLGJpPXNldEludGVydmFsKHppLG1pKSksdmk9MSxBaShQaSkpKX1mdW5jdGlvbiBEaSh0LG4sZSl7dmFyIHI9bmV3IE5pO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoKGU9PntyLnN0b3AoKSx0KGUrbil9KSxuLGUpLHJ9TmkucHJvdG90eXBlPWtpLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TmkscmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP1NpKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fHlpPT09dGhpc3x8KHlpP3lpLl9uZXh0PXRoaXM6Z2k9dGhpcyx5aT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLCRpKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLCRpKCkpfX07dmFyIFJpPUR0KCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLEZpPVtdLHFpPTAsVWk9MSxJaT0yLE9pPTMsQmk9NCxZaT01LExpPTY7ZnVuY3Rpb24gamkodCxuLGUscixpLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKGUgaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshZnVuY3Rpb24odCxuLGUpe3ZhciByLGk9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyh0KXtlLnN0YXRlPVVpLGUudGltZXIucmVzdGFydChhLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZhKHQtZS5kZWxheSl9ZnVuY3Rpb24gYShvKXt2YXIgZixzLGwsaDtpZihlLnN0YXRlIT09VWkpcmV0dXJuIGMoKTtmb3IoZiBpbiBpKWlmKChoPWlbZl0pLm5hbWU9PT1lLm5hbWUpe2lmKGguc3RhdGU9PT1PaSlyZXR1cm4gRGkoYSk7aC5zdGF0ZT09PUJpPyhoLnN0YXRlPUxpLGgudGltZXIuc3RvcCgpLGgub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18saC5pbmRleCxoLmdyb3VwKSxkZWxldGUgaVtmXSk6K2Y8biYmKGguc3RhdGU9TGksaC50aW1lci5zdG9wKCksaC5vbi5jYWxsKCJjYW5jZWwiLHQsdC5fX2RhdGFfXyxoLmluZGV4LGguZ3JvdXApLGRlbGV0ZSBpW2ZdKX1pZihEaSgoZnVuY3Rpb24oKXtlLnN0YXRlPT09T2kmJihlLnN0YXRlPUJpLGUudGltZXIucmVzdGFydCh1LGUuZGVsYXksZS50aW1lKSx1KG8pKX0pKSxlLnN0YXRlPUlpLGUub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGUuc3RhdGU9PT1JaSl7Zm9yKGUuc3RhdGU9T2kscj1uZXcgQXJyYXkobD1lLnR3ZWVuLmxlbmd0aCksZj0wLHM9LTE7ZjxsOysrZikoaD1lLnR3ZWVuW2ZdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCkpJiYoclsrK3NdPWgpO3IubGVuZ3RoPXMrMX19ZnVuY3Rpb24gdShuKXtmb3IodmFyIGk9bjxlLmR1cmF0aW9uP2UuZWFzZS5jYWxsKG51bGwsbi9lLmR1cmF0aW9uKTooZS50aW1lci5yZXN0YXJ0KGMpLGUuc3RhdGU9WWksMSksbz0tMSxhPXIubGVuZ3RoOysrbzxhOylyW29dLmNhbGwodCxpKTtlLnN0YXRlPT09WWkmJihlLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksYygpKX1mdW5jdGlvbiBjKCl7Zm9yKHZhciByIGluIGUuc3RhdGU9TGksZS50aW1lci5zdG9wKCksZGVsZXRlIGlbbl0saSlyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufWlbbl09ZSxlLnRpbWVyPWtpKG8sMCxlLnRpbWUpfSh0LGUse25hbWU6bixpbmRleDpyLGdyb3VwOmksb246UmksdHdlZW46RmksdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6cWl9KX1mdW5jdGlvbiBIaSh0LG4pe3ZhciBlPUdpKHQsbik7aWYoZS5zdGF0ZT5xaSl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBlfWZ1bmN0aW9uIFhpKHQsbil7dmFyIGU9R2kodCxuKTtpZihlLnN0YXRlPk9pKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBlfWZ1bmN0aW9uIEdpKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKSl0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7cmV0dXJuIGV9ZnVuY3Rpb24gVmkodCxuKXt2YXIgZSxyLGksbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihpIGluIG49bnVsbD09bj9udWxsOm4rIiIsbykoZT1vW2ldKS5uYW1lPT09bj8ocj1lLnN0YXRlPklpJiZlLnN0YXRlPFlpLGUuc3RhdGU9TGksZS50aW1lci5zdG9wKCksZS5vbi5jYWxsKHI/ImludGVycnVwdCI6ImNhbmNlbCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksZGVsZXRlIG9baV0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBXaSh0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9WGkodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX1mdW5jdGlvbiBaaSh0LG4sZSl7dmFyIHIsaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89WGkodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PXIpe2k9KHI9YSkuc2xpY2UoKTtmb3IodmFyIHU9e25hbWU6bix2YWx1ZTplfSxjPTAsZj1pLmxlbmd0aDtjPGY7KytjKWlmKGlbY10ubmFtZT09PW4pe2lbY109dTticmVha31jPT09ZiYmaS5wdXNoKHUpfW8udHdlZW49aX19ZnVuY3Rpb24gS2kodCxuLGUpe3ZhciByPXQuX2lkO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9WGkodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gR2kodCxyKS52YWx1ZVtuXX19ZnVuY3Rpb24gUWkodCxuKXt2YXIgZTtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBuP0xyOm4gaW5zdGFuY2VvZiAkZT9ScjooZT0kZShuKSk/KG49ZSxScik6R3IpKHQsbil9ZnVuY3Rpb24gSmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHRvKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gbm8odCxuLGUpe3ZhciByLGksbz1lKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1yP2k6aT1uKHI9YSxlKX19ZnVuY3Rpb24gZW8odCxuLGUpe3ZhciByLGksbz1lKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gYT09PW8/bnVsbDphPT09cj9pOmk9bihyPWEsZSl9fWZ1bmN0aW9uIHJvKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdSxjPWUodGhpcyk7aWYobnVsbCE9YylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0odT1jKyIiKT9udWxsOmE9PT1yJiZ1PT09aT9vOihpPXUsbz1uKHI9YSxjKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGlvKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdSxjPWUodGhpcyk7aWYobnVsbCE9YylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09KHU9YysiIik/bnVsbDphPT09ciYmdT09PWk/bzooaT11LG89bihyPWEsYykpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gb28odCxuKXt2YXIgZSxyO2Z1bmN0aW9uIGkoKXt2YXIgaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PXImJihlPShyPWkpJiZmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuLmNhbGwodGhpcyxlKSl9fSh0LGkpKSxlfXJldHVybiBpLl92YWx1ZT1uLGl9ZnVuY3Rpb24gYW8odCxuKXt2YXIgZSxyO2Z1bmN0aW9uIGkoKXt2YXIgaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PXImJihlPShyPWkpJiZmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4uY2FsbCh0aGlzLGUpKX19KHQsaSkpLGV9cmV0dXJuIGkuX3ZhbHVlPW4saX1mdW5jdGlvbiB1byh0LG4pe3JldHVybiBmdW5jdGlvbigpe0hpKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBjbyh0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7SGkodGhpcyx0KS5kZWxheT1ufX1mdW5jdGlvbiBmbyh0LG4pe3JldHVybiBmdW5jdGlvbigpe1hpKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBzbyh0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7WGkodGhpcyx0KS5kdXJhdGlvbj1ufX12YXIgbG89Wm4ucHJvdG90eXBlLmNvbnN0cnVjdG9yO2Z1bmN0aW9uIGhvKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fXZhciBwbz0wO2Z1bmN0aW9uIGdvKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB5byh0KXtyZXR1cm4gWm4oKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIHZvKCl7cmV0dXJuKytwb312YXIgX289Wm4ucHJvdG90eXBlO2dvLnByb3RvdHlwZT15by5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmdvLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUh0KHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1uZXcgQXJyYXkoaSksYT0wO2E8aTsrK2EpZm9yKHZhciB1LGMsZj1yW2FdLHM9Zi5sZW5ndGgsbD1vW2FdPW5ldyBBcnJheShzKSxoPTA7aDxzOysraCkodT1mW2hdKSYmKGM9dC5jYWxsKHUsdS5fX2RhdGFfXyxoLGYpKSYmKCJfX2RhdGFfXyJpbiB1JiYoYy5fX2RhdGFfXz11Ll9fZGF0YV9fKSxsW2hdPWMsamkobFtoXSxuLGUsaCxsLEdpKHUsZSkpKTtyZXR1cm4gbmV3IGdvKG8sdGhpcy5fcGFyZW50cyxuLGUpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZSxlPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1WdCh0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89W10sYT1bXSx1PTA7dTxpOysrdSlmb3IodmFyIGMsZj1yW3VdLHM9Zi5sZW5ndGgsbD0wO2w8czsrK2wpaWYoYz1mW2xdKXtmb3IodmFyIGgsZD10LmNhbGwoYyxjLl9fZGF0YV9fLGwsZikscD1HaShjLGUpLGc9MCx5PWQubGVuZ3RoO2c8eTsrK2cpKGg9ZFtnXSkmJmppKGgsbixlLGcsZCxwKTtvLnB1c2goZCksYS5wdXNoKGMpfXJldHVybiBuZXcgZ28obyxhLG4sZSl9LHNlbGVjdENoaWxkOl9vLnNlbGVjdENoaWxkLHNlbGVjdENoaWxkcmVuOl9vLnNlbGVjdENoaWxkcmVuLGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9V3QodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sYT1uW2ldLHU9YS5sZW5ndGgsYz1yW2ldPVtdLGY9MDtmPHU7KytmKShvPWFbZl0pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGYsYSkmJmMucHVzaChvKTtyZXR1cm4gbmV3IGdvKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLGE9bmV3IEFycmF5KHIpLHU9MDt1PG87Kyt1KWZvcih2YXIgYyxmPW5bdV0scz1lW3VdLGw9Zi5sZW5ndGgsaD1hW3VdPW5ldyBBcnJheShsKSxkPTA7ZDxsOysrZCkoYz1mW2RdfHxzW2RdKSYmKGhbZF09Yyk7Zm9yKDt1PHI7Kyt1KWFbdV09blt1XTtyZXR1cm4gbmV3IGdvKGEsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsbyh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9dm8oKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgYSx1PXJbb10sYz11Lmxlbmd0aCxmPTA7ZjxjOysrZilpZihhPXVbZl0pe3ZhciBzPUdpKGEsbik7amkoYSx0LGUsZix1LHt0aW1lOnMudGltZStzLmRlbGF5K3MuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpzLmR1cmF0aW9uLGVhc2U6cy5lYXNlfSl9cmV0dXJuIG5ldyBnbyhyLHRoaXMuX3BhcmVudHMsdCxlKX0sY2FsbDpfby5jYWxsLG5vZGVzOl9vLm5vZGVzLG5vZGU6X28ubm9kZSxzaXplOl9vLnNpemUsZW1wdHk6X28uZW1wdHksZWFjaDpfby5lYWNoLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9HaSh0aGlzLm5vZGUoKSxlKS5vbi5vbih0KTp0aGlzLmVhY2goZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KSl9KG4pP0hpOlhpO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSx1PWEub247dSE9PXImJihpPShyPXUpLmNvcHkoKSkub24obixlKSxhLm9uPWl9fShlLHQsbikpfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9T3QodCkscj0idHJhbnNmb3JtIj09PWU/ZWk6UWk7cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/KGUubG9jYWw/aW86cm8pKGUscixLaSh0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD90bzpKaSkoZSk6KGUubG9jYWw/ZW86bm8pKGUscixuKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9T3QodCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9vbzphbykocixuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9uaTpRaTtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxmdW5jdGlvbih0LG4pe3ZhciBlLHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1ibih0aGlzLHQpLGE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksYm4odGhpcyx0KSk7cmV0dXJuIG89PT1hP251bGw6bz09PWUmJmE9PT1yP2k6aT1uKGU9byxyPWEpfX0odCxyKSkub24oImVuZC5zdHlsZS4iK3QsaG8odCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP3RoaXMuc3R5bGVUd2Vlbih0LGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9Ym4odGhpcyx0KSx1PWUodGhpcyksYz11KyIiO3JldHVybiBudWxsPT11JiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxjPXU9Ym4odGhpcyx0KSksYT09PWM/bnVsbDphPT09ciYmYz09PWk/bzooaT1jLG89bihyPWEsdSkpfX0odCxyLEtpKHRoaXMsInN0eWxlLiIrdCxuKSkpLmVhY2goZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbyxhPSJzdHlsZS4iK24sdT0iZW5kLiIrYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz1YaSh0aGlzLHQpLGY9Yy5vbixzPW51bGw9PWMudmFsdWVbYV0/b3x8KG89aG8obikpOnZvaWQgMDtmPT09ZSYmaT09PXN8fChyPShlPWYpLmNvcHkoKSkub24odSxpPXMpLGMub249cn19KHRoaXMuX2lkLHQpKTp0aGlzLnN0eWxlVHdlZW4odCxmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWUrIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9Ym4odGhpcyx0KTtyZXR1cm4gYT09PW8/bnVsbDphPT09cj9pOmk9bihyPWEsZSl9fSh0LHIsbiksZSkub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24odCxuLGUpe3ZhciByPSJzdHlsZS4iKyh0Kz0iIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihyPXRoaXMudHdlZW4ocikpJiZyLl92YWx1ZTtpZihudWxsPT1uKXJldHVybiB0aGlzLnR3ZWVuKHIsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKHIsZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7ZnVuY3Rpb24gbygpe3ZhciBvPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBvIT09aSYmKHI9KGk9bykmJmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24ocil7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4uY2FsbCh0aGlzLHIpLGUpfX0odCxvLGUpKSxyfXJldHVybiBvLl92YWx1ZT1uLG99KHQsbixudWxsPT1lPyIiOmUpKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19KEtpKHRoaXMsInRleHQiLHQpKTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uKHQpe3ZhciBuPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKG49dGhpcy50d2VlbihuKSkmJm4uX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4obixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4obixmdW5jdGlvbih0KXt2YXIgbixlO2Z1bmN0aW9uIHIoKXt2YXIgcj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWUmJihuPShlPXIpJiZmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy50ZXh0Q29udGVudD10LmNhbGwodGhpcyxuKX19KHIpKSxufXJldHVybiByLl92YWx1ZT10LHJ9KHQpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtmb3IodmFyIGUgaW4gdGhpcy5fX3RyYW5zaXRpb24paWYoK2UhPT10KXJldHVybjtuJiZuLnJlbW92ZUNoaWxkKHRoaXMpfX0odGhpcy5faWQpKX0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPUdpKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9XaTpaaSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD91bzpjbykobix0KSk6R2kodGhpcy5ub2RlKCksbikuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/Zm86c28pKG4sdCkpOkdpKHRoaXMubm9kZSgpLG4pLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtYaSh0aGlzLHQpLmVhc2U9bn19KG4sdCkpOkdpKHRoaXMubm9kZSgpLG4pLmVhc2V9LGVhc2VWYXJ5aW5nOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO1hpKHRoaXMsdCkuZWFzZT1lfX0odGhpcy5faWQsdCkpfSxlbmQ6ZnVuY3Rpb24oKXt2YXIgdCxuLGU9dGhpcyxyPWUuX2lkLGk9ZS5zaXplKCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGEpe3ZhciB1PXt2YWx1ZTphfSxjPXt2YWx1ZTpmdW5jdGlvbigpezA9PS0taSYmbygpfX07ZS5lYWNoKChmdW5jdGlvbigpe3ZhciBlPVhpKHRoaXMsciksaT1lLm9uO2khPT10JiYoKG49KHQ9aSkuY29weSgpKS5fLmNhbmNlbC5wdXNoKHUpLG4uXy5pbnRlcnJ1cHQucHVzaCh1KSxuLl8uZW5kLnB1c2goYykpLGUub249bn0pKSwwPT09aSYmbygpfSkpfSxbU3ltYm9sLml0ZXJhdG9yXTpfb1tTeW1ib2wuaXRlcmF0b3JdfTtmdW5jdGlvbiBibyh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiBtbyh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn12YXIgeG89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSx3bz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxNbz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LG4pOjItTWF0aC5wb3coMi10LG4pKS8yfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxUbz1NYXRoLlBJLEFvPVRvLzI7ZnVuY3Rpb24gU28odCl7cmV0dXJuKDEtTWF0aC5jb3MoVG8qdCkpLzJ9ZnVuY3Rpb24gRW8odCl7cmV0dXJuIDEuMDAwOTc3NTE3MTA2NTQ5NCooTWF0aC5wb3coMiwtMTAqdCktLjAwMDk3NjU2MjUpfWZ1bmN0aW9uIE5vKHQpe3JldHVybigodCo9Mik8PTE/RW8oMS10KToyLUVvKHQtMSkpLzJ9ZnVuY3Rpb24ga28odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIENvPTQvMTEsUG89Ni8xMSx6bz04LzExLCRvPTMvNCxEbz05LzExLFJvPTEwLzExLEZvPTE1LzE2LHFvPTIxLzIyLFVvPTYzLzY0LElvPTEvQ28vQ287ZnVuY3Rpb24gT28odCl7cmV0dXJuKHQ9K3QpPENvP0lvKnQqdDp0PHpvP0lvKih0LT1QbykqdCskbzp0PFJvP0lvKih0LT1EbykqdCtGbzpJbyoodC09cW8pKnQrVW99dmFyIEJvPTEuNzAxNTgsWW89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybih0PSt0KSp0KihuKih0LTEpK3QpfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oQm8pLExvPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKHQrMSkqbit0KSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oQm8pLGpvPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigobisxKSp0LW4pOih0LT0yKSp0KigobisxKSp0K24pKzIpLzJ9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfShCbyksSG89MipNYXRoLlBJLFhvPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPUhvKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKkVvKC0gLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKkhvKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksR289ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89SG8pO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipFbyh0PSt0KSpNYXRoLnNpbigodCtyKS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKkhvKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksVm89ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89SG8pO2Z1bmN0aW9uIGkodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qRW8oLXQpKk1hdGguc2luKChyLXQpL2UpOjItbipFbyh0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKkhvKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksV289e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOm1vfTtmdW5jdGlvbiBabyh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke259IG5vdCBmb3VuZGApO3JldHVybiBlfVpuLnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtWaSh0aGlzLHQpfSkpfSxabi5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBnbz8obj10Ll9pZCx0PXQuX25hbWUpOihuPXZvKCksKGU9V28pLnRpbWU9U2koKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxjPXUubGVuZ3RoLGY9MDtmPGM7KytmKShhPXVbZl0pJiZqaShhLHQsbixmLHUsZXx8Wm8oYSxuKSk7cmV0dXJuIG5ldyBnbyhyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIEtvPVtudWxsXTt2YXIgUW89dD0+KCk9PnQ7ZnVuY3Rpb24gSm8odCx7c291cmNlRXZlbnQ6bix0YXJnZXQ6ZSxzZWxlY3Rpb246cixtb2RlOmksZGlzcGF0Y2g6b30pe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3R5cGU6e3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHNvdXJjZUV2ZW50Ont2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx0YXJnZXQ6e3ZhbHVlOmUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHNlbGVjdGlvbjp7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sbW9kZTp7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sXzp7dmFsdWU6b319KX1mdW5jdGlvbiB0YSh0KXt0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgbmE9e25hbWU6ImRyYWcifSxlYT17bmFtZToic3BhY2UifSxyYT17bmFtZToiaGFuZGxlIn0saWE9e25hbWU6ImNlbnRlciJ9O2NvbnN0e2FiczpvYSxtYXg6YWEsbWluOnVhfT1NYXRoO2Z1bmN0aW9uIGNhKHQpe3JldHVyblsrdFswXSwrdFsxXV19ZnVuY3Rpb24gZmEodCl7cmV0dXJuW2NhKHRbMF0pLGNhKHRbMV0pXX12YXIgc2E9e25hbWU6IngiLGhhbmRsZXM6WyJ3IiwiZSJdLm1hcChfYSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD9udWxsOltbK3RbMF0sblswXVsxXV0sWyt0WzFdLG5bMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LGxhPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoX2EpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PXQ/bnVsbDpbW25bMF1bMF0sK3RbMF1dLFtuWzFdWzBdLCt0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxoYT17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwidyIsImUiLCJzIiwibnciLCJuZSIsInN3Iiwic2UiXS5tYXAoX2EpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P251bGw6ZmEodCl9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LGRhPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxwYT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sZ2E9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LHlhPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LHZhPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9O2Z1bmN0aW9uIF9hKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIGJhKHQpe3JldHVybiF0LmN0cmxLZXkmJiF0LmJ1dHRvbn1mdW5jdGlvbiBtYSgpe3ZhciB0PXRoaXMub3duZXJTVkdFbGVtZW50fHx0aGlzO3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgidmlld0JveCIpP1tbKHQ9dC52aWV3Qm94LmJhc2VWYWwpLngsdC55XSxbdC54K3Qud2lkdGgsdC55K3QuaGVpZ2h0XV06W1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIHhhKCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHdhKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gTWEodCl7dmFyIG4sZT1tYSxyPWJhLGk9eGEsbz0hMCxhPUR0KCJzdGFydCIsImJydXNoIiwiZW5kIiksdT02O2Z1bmN0aW9uIGMobil7dmFyIGU9bi5wcm9wZXJ0eSgiX19icnVzaCIsZykuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmRhdGEoW19hKCJvdmVybGF5IildKTtlLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLGRhLm92ZXJsYXkpLm1lcmdlKGUpLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9d2EodGhpcykuZXh0ZW50O0tuKHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pKSxuLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW19hKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLGRhLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciByPW4uc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YSh0LmhhbmRsZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9KSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwoZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkpLmF0dHIoImN1cnNvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBkYVt0LnR5cGVdfSkpLG4uZWFjaChmKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikub24oIm1vdXNlZG93bi5icnVzaCIsaCkuZmlsdGVyKGkpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixoKS5vbigidG91Y2htb3ZlLmJydXNoIixkKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLHApLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBmKCl7dmFyIHQ9S24odGhpcyksbj13YSh0aGlzKS5zZWxlY3Rpb247bj8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsblswXVswXSkuYXR0cigieSIsblswXVsxXSkuYXR0cigid2lkdGgiLG5bMV1bMF0tblswXVswXSkuYXR0cigiaGVpZ2h0IixuWzFdWzFdLW5bMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLXUvMjpuWzBdWzBdLXUvMn0pKS5hdHRyKCJ5IiwoZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP25bMV1bMV0tdS8yOm5bMF1bMV0tdS8yfSkpLmF0dHIoIndpZHRoIiwoZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/blsxXVswXS1uWzBdWzBdK3U6dX0pKS5hdHRyKCJoZWlnaHQiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rdTp1fSkpKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gcyh0LG4sZSl7dmFyIHI9dC5fX2JydXNoLmVtaXR0ZXI7cmV0dXJuIXJ8fGUmJnIuY2xlYW4/bmV3IGwodCxuLGUpOnJ9ZnVuY3Rpb24gbCh0LG4sZSl7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MCx0aGlzLmNsZWFuPWV9ZnVuY3Rpb24gaChlKXtpZigoIW58fGUudG91Y2hlcykmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgaSxhLHUsYyxsLGgsZCxwLGcseSx2LF89dGhpcyxiPWUudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsbT0ic2VsZWN0aW9uIj09PShvJiZlLm1ldGFLZXk/Yj0ib3ZlcmxheSI6Yik/bmE6byYmZS5hbHRLZXk/aWE6cmEseD10PT09bGE/bnVsbDp5YVtiXSx3PXQ9PT1zYT9udWxsOnZhW2JdLE09d2EoXyksVD1NLmV4dGVudCxBPU0uc2VsZWN0aW9uLFM9VFswXVswXSxFPVRbMF1bMV0sTj1UWzFdWzBdLGs9VFsxXVsxXSxDPTAsUD0wLHo9eCYmdyYmbyYmZS5zaGlmdEtleSwkPUFycmF5LmZyb20oZS50b3VjaGVzfHxbZV0sKHQ9Pntjb25zdCBuPXQuaWRlbnRpZmllcjtyZXR1cm4odD1lZSh0LF8pKS5wb2ludDA9dC5zbGljZSgpLHQuaWRlbnRpZmllcj1uLHR9KSk7VmkoXyk7dmFyIEQ9cyhfLGFyZ3VtZW50cywhMCkuYmVmb3Jlc3RhcnQoKTtpZigib3ZlcmxheSI9PT1iKXtBJiYoZz0hMCk7Y29uc3Qgbj1bJFswXSwkWzFdfHwkWzBdXTtNLnNlbGVjdGlvbj1BPVtbaT10PT09bGE/Uzp1YShuWzBdWzBdLG5bMV1bMF0pLHU9dD09PXNhP0U6dWEoblswXVsxXSxuWzFdWzFdKV0sW2w9dD09PWxhP046YWEoblswXVswXSxuWzFdWzBdKSxkPXQ9PT1zYT9rOmFhKG5bMF1bMV0sblsxXVsxXSldXSwkLmxlbmd0aD4xJiZJKGUpfWVsc2UgaT1BWzBdWzBdLHU9QVswXVsxXSxsPUFbMV1bMF0sZD1BWzFdWzFdO2E9aSxjPXUsaD1sLHA9ZDt2YXIgUj1LbihfKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSxGPVIuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmF0dHIoImN1cnNvciIsZGFbYl0pO2lmKGUudG91Y2hlcylELm1vdmVkPVUsRC5lbmRlZD1PO2Vsc2V7dmFyIHE9S24oZS52aWV3KS5vbigibW91c2Vtb3ZlLmJydXNoIixVLCEwKS5vbigibW91c2V1cC5icnVzaCIsTywhMCk7byYmcS5vbigia2V5ZG93bi5icnVzaCIsKGZ1bmN0aW9uKHQpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgMTY6ej14JiZ3O2JyZWFrO2Nhc2UgMTg6bT09PXJhJiYoeCYmKGw9aC1DKngsaT1hK0MqeCksdyYmKGQ9cC1QKncsdT1jK1AqdyksbT1pYSxJKHQpKTticmVhaztjYXNlIDMyOm0hPT1yYSYmbSE9PWlhfHwoeDwwP2w9aC1DOng+MCYmKGk9YS1DKSx3PDA/ZD1wLVA6dz4wJiYodT1jLVApLG09ZWEsRi5hdHRyKCJjdXJzb3IiLGRhLnNlbGVjdGlvbiksSSh0KSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dGEodCl9KSwhMCkub24oImtleXVwLmJydXNoIiwoZnVuY3Rpb24odCl7c3dpdGNoKHQua2V5Q29kZSl7Y2FzZSAxNjp6JiYoeT12PXo9ITEsSSh0KSk7YnJlYWs7Y2FzZSAxODptPT09aWEmJih4PDA/bD1oOng+MCYmKGk9YSksdzwwP2Q9cDp3PjAmJih1PWMpLG09cmEsSSh0KSk7YnJlYWs7Y2FzZSAzMjptPT09ZWEmJih0LmFsdEtleT8oeCYmKGw9aC1DKngsaT1hK0MqeCksdyYmKGQ9cC1QKncsdT1jK1AqdyksbT1pYSk6KHg8MD9sPWg6eD4wJiYoaT1hKSx3PDA/ZD1wOnc+MCYmKHU9YyksbT1yYSksRi5hdHRyKCJjdXJzb3IiLGRhW2JdKSxJKHQpKTticmVhaztkZWZhdWx0OnJldHVybn10YSh0KX0pLCEwKSx1ZShlLnZpZXcpfWYuY2FsbChfKSxELnN0YXJ0KGUsbS5uYW1lKX1mdW5jdGlvbiBVKHQpe2Zvcihjb25zdCBuIG9mIHQuY2hhbmdlZFRvdWNoZXN8fFt0XSlmb3IoY29uc3QgdCBvZiAkKXQuaWRlbnRpZmllcj09PW4uaWRlbnRpZmllciYmKHQuY3VyPWVlKG4sXykpO2lmKHomJiF5JiYhdiYmMT09PSQubGVuZ3RoKXtjb25zdCB0PSRbMF07b2EodC5jdXJbMF0tdFswXSk+b2EodC5jdXJbMV0tdFsxXSk/dj0hMDp5PSEwfWZvcihjb25zdCB0IG9mICQpdC5jdXImJih0WzBdPXQuY3VyWzBdLHRbMV09dC5jdXJbMV0pO2c9ITAsdGEodCksSSh0KX1mdW5jdGlvbiBJKHQpe2NvbnN0IG49JFswXSxlPW4ucG9pbnQwO3ZhciByO3N3aXRjaChDPW5bMF0tZVswXSxQPW5bMV0tZVsxXSxtKXtjYXNlIGVhOmNhc2UgbmE6eCYmKEM9YWEoUy1pLHVhKE4tbCxDKSksYT1pK0MsaD1sK0MpLHcmJihQPWFhKEUtdSx1YShrLWQsUCkpLGM9dStQLHA9ZCtQKTticmVhaztjYXNlIHJhOiRbMV0/KHgmJihhPWFhKFMsdWEoTiwkWzBdWzBdKSksaD1hYShTLHVhKE4sJFsxXVswXSkpLHg9MSksdyYmKGM9YWEoRSx1YShrLCRbMF1bMV0pKSxwPWFhKEUsdWEoaywkWzFdWzFdKSksdz0xKSk6KHg8MD8oQz1hYShTLWksdWEoTi1pLEMpKSxhPWkrQyxoPWwpOng+MCYmKEM9YWEoUy1sLHVhKE4tbCxDKSksYT1pLGg9bCtDKSx3PDA/KFA9YWEoRS11LHVhKGstdSxQKSksYz11K1AscD1kKTp3PjAmJihQPWFhKEUtZCx1YShrLWQsUCkpLGM9dSxwPWQrUCkpO2JyZWFrO2Nhc2UgaWE6eCYmKGE9YWEoUyx1YShOLGktQyp4KSksaD1hYShTLHVhKE4sbCtDKngpKSksdyYmKGM9YWEoRSx1YShrLHUtUCp3KSkscD1hYShFLHVhKGssZCtQKncpKSl9aDxhJiYoeCo9LTEscj1pLGk9bCxsPXIscj1hLGE9aCxoPXIsYiBpbiBwYSYmRi5hdHRyKCJjdXJzb3IiLGRhW2I9cGFbYl1dKSkscDxjJiYodyo9LTEscj11LHU9ZCxkPXIscj1jLGM9cCxwPXIsYiBpbiBnYSYmRi5hdHRyKCJjdXJzb3IiLGRhW2I9Z2FbYl1dKSksTS5zZWxlY3Rpb24mJihBPU0uc2VsZWN0aW9uKSx5JiYoYT1BWzBdWzBdLGg9QVsxXVswXSksdiYmKGM9QVswXVsxXSxwPUFbMV1bMV0pLEFbMF1bMF09PT1hJiZBWzBdWzFdPT09YyYmQVsxXVswXT09PWgmJkFbMV1bMV09PT1wfHwoTS5zZWxlY3Rpb249W1thLGNdLFtoLHBdXSxmLmNhbGwoXyksRC5icnVzaCh0LG0ubmFtZSkpfWZ1bmN0aW9uIE8odCl7aWYoZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0odCksdC50b3VjaGVzKXtpZih0LnRvdWNoZXMubGVuZ3RoKXJldHVybjtuJiZjbGVhclRpbWVvdXQobiksbj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe249bnVsbH0pLDUwMCl9ZWxzZSBjZSh0LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ui5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLEYuYXR0cigiY3Vyc29yIixkYS5vdmVybGF5KSxNLnNlbGVjdGlvbiYmKEE9TS5zZWxlY3Rpb24pLGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdWzBdPT09dFsxXVswXXx8dFswXVsxXT09PXRbMV1bMV19KEEpJiYoTS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoXykpLEQuZW5kKHQsbS5uYW1lKX19ZnVuY3Rpb24gZCh0KXtzKHRoaXMsYXJndW1lbnRzKS5tb3ZlZCh0KX1mdW5jdGlvbiBwKHQpe3ModGhpcyxhcmd1bWVudHMpLmVuZGVkKHQpfWZ1bmN0aW9uIGcoKXt2YXIgbj10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIG4uZXh0ZW50PWZhKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxuLmRpbT10LG59cmV0dXJuIGMubW92ZT1mdW5jdGlvbihuLGUscil7bi50d2Vlbj9uLm9uKCJzdGFydC5icnVzaCIsKGZ1bmN0aW9uKHQpe3ModGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQodCl9KSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLChmdW5jdGlvbih0KXtzKHRoaXMsYXJndW1lbnRzKS5lbmQodCl9KSkudHdlZW4oImJydXNoIiwoZnVuY3Rpb24oKXt2YXIgbj10aGlzLHI9bi5fX2JydXNoLGk9cyhuLGFyZ3VtZW50cyksbz1yLnNlbGVjdGlvbixhPXQuaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSxyLmV4dGVudCksdT1WcihvLGEpO2Z1bmN0aW9uIGModCl7ci5zZWxlY3Rpb249MT09PXQmJm51bGw9PT1hP251bGw6dSh0KSxmLmNhbGwobiksaS5icnVzaCgpfXJldHVybiBudWxsIT09byYmbnVsbCE9PWE/YzpjKDEpfSkpOm4uZWFjaCgoZnVuY3Rpb24oKXt2YXIgbj10aGlzLGk9YXJndW1lbnRzLG89bi5fX2JydXNoLGE9dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KG4saSk6ZSxvLmV4dGVudCksdT1zKG4saSkuYmVmb3Jlc3RhcnQoKTtWaShuKSxvLnNlbGVjdGlvbj1udWxsPT09YT9udWxsOmEsZi5jYWxsKG4pLHUuc3RhcnQocikuYnJ1c2gocikuZW5kKHIpfSkpfSxjLmNsZWFyPWZ1bmN0aW9uKHQsbil7Yy5tb3ZlKHQsbnVsbCxuKX0sbC5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnN0YXJ0aW5nPyh0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiLHQsbikpOnRoaXMuZW1pdCgiYnJ1c2giLHQpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giLHQsbiksdGhpc30sZW5kOmZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIix0LG4pKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKG4sZSxyKXt2YXIgaT1Lbih0aGlzLnRoYXQpLmRhdHVtKCk7YS5jYWxsKG4sdGhpcy50aGF0LG5ldyBKbyhuLHtzb3VyY2VFdmVudDplLHRhcmdldDpjLHNlbGVjdGlvbjp0Lm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbiksbW9kZTpyLGRpc3BhdGNoOmF9KSxpKX19LGMuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oZmEodCkpLGMpOmV9LGMuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oISF0KSxjKTpyfSxjLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCEhdCksYyk6aX0sYy5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGMpOnV9LGMua2V5TW9kaWZpZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxjKTpvfSxjLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP2M6dH0sY312YXIgVGE9TWF0aC5hYnMsQWE9TWF0aC5jb3MsU2E9TWF0aC5zaW4sRWE9TWF0aC5QSSxOYT1FYS8yLGthPTIqRWEsQ2E9TWF0aC5tYXgsUGE9MWUtMTI7ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gQXJyYXkuZnJvbSh7bGVuZ3RoOm4tdH0sKChuLGUpPT50K2UpKX1mdW5jdGlvbiAkYSh0LG4pe3ZhciBlPTAscj1udWxsLGk9bnVsbCxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxjPWEubGVuZ3RoLGY9bmV3IEFycmF5KGMpLHM9emEoMCxjKSxsPW5ldyBBcnJheShjKmMpLGg9bmV3IEFycmF5KGMpLGQ9MDthPUZsb2F0NjRBcnJheS5mcm9tKHtsZW5ndGg6YypjfSxuPyh0LG4pPT5hW24lY11bbi9jfDBdOih0LG4pPT5hW24vY3wwXVtuJWNdKTtmb3IobGV0IG49MDtuPGM7KytuKXtsZXQgZT0wO2ZvcihsZXQgcj0wO3I8YzsrK3IpZSs9YVtuKmMrcl0rdCphW3IqYytuXTtkKz1mW25dPWV9dT0oZD1DYSgwLGthLWUqYykvZCk/ZTprYS9jO3tsZXQgbj0wO3ImJnMuc29ydCgoKHQsbik9PnIoZlt0XSxmW25dKSkpO2Zvcihjb25zdCBlIG9mIHMpe2NvbnN0IHI9bjtpZih0KXtjb25zdCB0PXphKDErfmMsYykuZmlsdGVyKCh0PT50PDA/YVt+dCpjK2VdOmFbZSpjK3RdKSk7aSYmdC5zb3J0KCgodCxuKT0+aSh0PDA/LWFbfnQqYytlXTphW2UqYyt0XSxuPDA/LWFbfm4qYytlXTphW2UqYytuXSkpKTtmb3IoY29uc3QgciBvZiB0KWlmKHI8MCl7KGxbfnIqYytlXXx8KGxbfnIqYytlXT17c291cmNlOm51bGwsdGFyZ2V0Om51bGx9KSkudGFyZ2V0PXtpbmRleDplLHN0YXJ0QW5nbGU6bixlbmRBbmdsZTpuKz1hW35yKmMrZV0qZCx2YWx1ZTphW35yKmMrZV19fWVsc2V7KGxbZSpjK3JdfHwobFtlKmMrcl09e3NvdXJjZTpudWxsLHRhcmdldDpudWxsfSkpLnNvdXJjZT17aW5kZXg6ZSxzdGFydEFuZ2xlOm4sZW5kQW5nbGU6bis9YVtlKmMrcl0qZCx2YWx1ZTphW2UqYytyXX19aFtlXT17aW5kZXg6ZSxzdGFydEFuZ2xlOnIsZW5kQW5nbGU6bix2YWx1ZTpmW2VdfX1lbHNle2NvbnN0IHQ9emEoMCxjKS5maWx0ZXIoKHQ9PmFbZSpjK3RdfHxhW3QqYytlXSkpO2kmJnQuc29ydCgoKHQsbik9PmkoYVtlKmMrdF0sYVtlKmMrbl0pKSk7Zm9yKGNvbnN0IHIgb2YgdCl7bGV0IHQ7aWYoZTxyPyh0PWxbZSpjK3JdfHwobFtlKmMrcl09e3NvdXJjZTpudWxsLHRhcmdldDpudWxsfSksdC5zb3VyY2U9e2luZGV4OmUsc3RhcnRBbmdsZTpuLGVuZEFuZ2xlOm4rPWFbZSpjK3JdKmQsdmFsdWU6YVtlKmMrcl19KToodD1sW3IqYytlXXx8KGxbcipjK2VdPXtzb3VyY2U6bnVsbCx0YXJnZXQ6bnVsbH0pLHQudGFyZ2V0PXtpbmRleDplLHN0YXJ0QW5nbGU6bixlbmRBbmdsZTpuKz1hW2UqYytyXSpkLHZhbHVlOmFbZSpjK3JdfSxlPT09ciYmKHQuc291cmNlPXQudGFyZ2V0KSksdC5zb3VyY2UmJnQudGFyZ2V0JiZ0LnNvdXJjZS52YWx1ZTx0LnRhcmdldC52YWx1ZSl7Y29uc3Qgbj10LnNvdXJjZTt0LnNvdXJjZT10LnRhcmdldCx0LnRhcmdldD1ufX1oW2VdPXtpbmRleDplLHN0YXJ0QW5nbGU6cixlbmRBbmdsZTpuLHZhbHVlOmZbZV19fW4rPXV9fXJldHVybihsPU9iamVjdC52YWx1ZXMobCkpLmdyb3Vwcz1oLG8/bC5zb3J0KG8pOmx9cmV0dXJuIGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Q2EoMCx0KSxhKTplfSxhLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxhKTpyfSxhLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxhKTppfSxhLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz1udWxsOihuPXQsbz1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxhKTpvJiZvLl87dmFyIG59LGF9Y29uc3QgRGE9TWF0aC5QSSxSYT0yKkRhLEZhPTFlLTYscWE9UmEtRmE7ZnVuY3Rpb24gVWEodCl7dGhpcy5fKz10WzBdO2ZvcihsZXQgbj0xLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLl8rPWFyZ3VtZW50c1tuXSt0W25dfWxldCBJYT1jbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIix0aGlzLl9hcHBlbmQ9bnVsbD09dD9VYTpmdW5jdGlvbih0KXtsZXQgbj1NYXRoLmZsb29yKHQpO2lmKCEobj49MCkpdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGRpZ2l0czogJHt0fWApO2lmKG4+MTUpcmV0dXJuIFVhO2NvbnN0IGU9MTAqKm47cmV0dXJuIGZ1bmN0aW9uKHQpe3RoaXMuXys9dFswXTtmb3IobGV0IG49MSxyPXQubGVuZ3RoO248cjsrK24pdGhpcy5fKz1NYXRoLnJvdW5kKGFyZ3VtZW50c1tuXSplKS9lK3Rbbl19fSh0KX1tb3ZlVG8odCxuKXt0aGlzLl9hcHBlbmRgTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K259YH1jbG9zZVBhdGgoKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl9hcHBlbmRgWmApfWxpbmVUbyh0LG4pe3RoaXMuX2FwcGVuZGBMJHt0aGlzLl94MT0rdH0sJHt0aGlzLl95MT0rbn1gfXF1YWRyYXRpY0N1cnZlVG8odCxuLGUscil7dGhpcy5fYXBwZW5kYFEkeyt0fSwkeytufSwke3RoaXMuX3gxPStlfSwke3RoaXMuX3kxPStyfWB9YmV6aWVyQ3VydmVUbyh0LG4sZSxyLGksbyl7dGhpcy5fYXBwZW5kYEMkeyt0fSwkeytufSwkeytlfSwkeytyfSwke3RoaXMuX3gxPStpfSwke3RoaXMuX3kxPStvfWB9YXJjVG8odCxuLGUscixpKXtpZih0PSt0LG49K24sZT0rZSxyPStyLChpPStpKTwwKXRocm93IG5ldyBFcnJvcihgbmVnYXRpdmUgcmFkaXVzOiAke2l9YCk7bGV0IG89dGhpcy5feDEsYT10aGlzLl95MSx1PWUtdCxjPXItbixmPW8tdCxzPWEtbixsPWYqZitzKnM7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuX2FwcGVuZGBNJHt0aGlzLl94MT10fSwke3RoaXMuX3kxPW59YDtlbHNlIGlmKGw+RmEpaWYoTWF0aC5hYnMocyp1LWMqZik+RmEmJmkpe2xldCBoPWUtbyxkPXItYSxwPXUqdStjKmMsZz1oKmgrZCpkLHk9TWF0aC5zcXJ0KHApLHY9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoRGEtTWF0aC5hY29zKChwK2wtZykvKDIqeSp2KSkpLzIpLGI9Xy92LG09Xy95O01hdGguYWJzKGItMSk+RmEmJnRoaXMuX2FwcGVuZGBMJHt0K2IqZn0sJHtuK2Iqc31gLHRoaXMuX2FwcGVuZGBBJHtpfSwke2l9LDAsMCwkeysocypoPmYqZCl9LCR7dGhpcy5feDE9dCttKnV9LCR7dGhpcy5feTE9bittKmN9YH1lbHNlIHRoaXMuX2FwcGVuZGBMJHt0aGlzLl94MT10fSwke3RoaXMuX3kxPW59YDtlbHNlO31hcmModCxuLGUscixpLG8pe2lmKHQ9K3Qsbj0rbixvPSEhbywoZT0rZSk8MCl0aHJvdyBuZXcgRXJyb3IoYG5lZ2F0aXZlIHJhZGl1czogJHtlfWApO2xldCBhPWUqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGM9dCthLGY9bit1LHM9MV5vLGw9bz9yLWk6aS1yO251bGw9PT10aGlzLl94MT90aGlzLl9hcHBlbmRgTSR7Y30sJHtmfWA6KE1hdGguYWJzKHRoaXMuX3gxLWMpPkZhfHxNYXRoLmFicyh0aGlzLl95MS1mKT5GYSkmJnRoaXMuX2FwcGVuZGBMJHtjfSwke2Z9YCxlJiYobDwwJiYobD1sJVJhK1JhKSxsPnFhP3RoaXMuX2FwcGVuZGBBJHtlfSwke2V9LDAsMSwke3N9LCR7dC1hfSwke24tdX1BJHtlfSwke2V9LDAsMSwke3N9LCR7dGhpcy5feDE9Y30sJHt0aGlzLl95MT1mfWA6bD5GYSYmdGhpcy5fYXBwZW5kYEEke2V9LCR7ZX0sMCwkeysobD49RGEpfSwke3N9LCR7dGhpcy5feDE9dCtlKk1hdGguY29zKGkpfSwke3RoaXMuX3kxPW4rZSpNYXRoLnNpbihpKX1gKX1yZWN0KHQsbixlLHIpe3RoaXMuX2FwcGVuZGBNJHt0aGlzLl94MD10aGlzLl94MT0rdH0sJHt0aGlzLl95MD10aGlzLl95MT0rbn1oJHtlPStlfXYkeytyfWgkey1lfVpgfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX319O2Z1bmN0aW9uIE9hKCl7cmV0dXJuIG5ldyBJYX1PYS5wcm90b3R5cGU9SWEucHJvdG90eXBlO3ZhciBCYT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gWWEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIExhKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBqYSh0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gSGEodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIFhhKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gR2EodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gVmEoKXtyZXR1cm4gMH1mdW5jdGlvbiBXYSgpe3JldHVybiAxMH1mdW5jdGlvbiBaYSh0KXt2YXIgbj1MYSxlPWphLHI9SGEsaT1IYSxvPVhhLGE9R2EsdT1WYSxjPW51bGw7ZnVuY3Rpb24gZigpe3ZhciBmLHM9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsZD1CYS5jYWxsKGFyZ3VtZW50cykscD0rci5hcHBseSh0aGlzLChkWzBdPXMsZCkpLGc9by5hcHBseSh0aGlzLGQpLU5hLHk9YS5hcHBseSh0aGlzLGQpLU5hLHY9K2kuYXBwbHkodGhpcywoZFswXT1sLGQpKSxfPW8uYXBwbHkodGhpcyxkKS1OYSxiPWEuYXBwbHkodGhpcyxkKS1OYTtpZihjfHwoYz1mPU9hKCkpLGg+UGEmJihUYSh5LWcpPjIqaCtQYT95Pmc/KGcrPWgseS09aCk6KGctPWgseSs9aCk6Zz15PShnK3kpLzIsVGEoYi1fKT4yKmgrUGE/Yj5fPyhfKz1oLGItPWgpOihfLT1oLGIrPWgpOl89Yj0oXytiKS8yKSxjLm1vdmVUbyhwKkFhKGcpLHAqU2EoZykpLGMuYXJjKDAsMCxwLGcseSksZyE9PV98fHkhPT1iKWlmKHQpe3ZhciBtPXYtK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLHg9KF8rYikvMjtjLnF1YWRyYXRpY0N1cnZlVG8oMCwwLG0qQWEoXyksbSpTYShfKSksYy5saW5lVG8odipBYSh4KSx2KlNhKHgpKSxjLmxpbmVUbyhtKkFhKGIpLG0qU2EoYikpfWVsc2UgYy5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KkFhKF8pLHYqU2EoXykpLGMuYXJjKDAsMCx2LF8sYik7aWYoYy5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwKkFhKGcpLHAqU2EoZykpLGMuY2xvc2VQYXRoKCksZilyZXR1cm4gYz1udWxsLGYrIiJ8fG51bGx9cmV0dXJuIHQmJihmLmhlYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpZYSgrbiksZik6dH0pLGYucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6cn0sZi5zb3VyY2VSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6cn0sZi50YXJnZXRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6aX0sZi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WWEoK3QpLGYpOm99LGYuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZYSgrdCksZik6YX0sZi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OllhKCt0KSxmKTp1fSxmLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGYpOm59LGYudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsZik6ZX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PXQ/bnVsbDp0LGYpOmN9LGZ9dmFyIEthPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBRYSh0LG4pe3JldHVybiB0LW59dmFyIEphPXQ9PigpPT50O2Z1bmN0aW9uIHR1KHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1udSh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIG51KHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgYz10W29dLGY9Y1swXSxzPWNbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoZXUoYyxsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWYpKihyLXMpLyhkLXMpK2YmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBldSh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHJ1KCl7fXZhciBpdT1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIG91KCl7dmFyIHQ9MSxuPTEsZT1RLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KFFhKTtlbHNle2NvbnN0IGU9VCh0LGF1KTtmb3Iobj1WKC4uLksoZVswXSxlWzFdLG4pLG4pO25bbi5sZW5ndGgtMV0+PWVbMV07KW4ucG9wKCk7Zm9yKDtuWzFdPGVbMF07KW4uc2hpZnQoKX1yZXR1cm4gbi5tYXAoKG49Pm8odCxuKSkpfWZ1bmN0aW9uIG8oZSxpKXtjb25zdCBvPW51bGw9PWk/TmFOOitpO2lmKGlzTmFOKG8pKXRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZTogJHtpfWApO3ZhciB1PVtdLGM9W107cmV0dXJuIGZ1bmN0aW9uKGUscixpKXt2YXIgbyx1LGMsZixzLGwsaD1uZXcgQXJyYXksZD1uZXcgQXJyYXk7bz11PS0xLGY9dXUoZVswXSxyKSxpdVtmPDwxXS5mb3JFYWNoKHApO2Zvcig7KytvPHQtMTspYz1mLGY9dXUoZVtvKzFdLHIpLGl1W2N8Zjw8MV0uZm9yRWFjaChwKTtpdVtmPDwwXS5mb3JFYWNoKHApO2Zvcig7Kyt1PG4tMTspe2ZvcihvPS0xLGY9dXUoZVt1KnQrdF0scikscz11dShlW3UqdF0sciksaXVbZjw8MXxzPDwyXS5mb3JFYWNoKHApOysrbzx0LTE7KWM9ZixmPXV1KGVbdSp0K3QrbysxXSxyKSxsPXMscz11dShlW3UqdCtvKzFdLHIpLGl1W2N8Zjw8MXxzPDwyfGw8PDNdLmZvckVhY2gocCk7aXVbZnxzPDwzXS5mb3JFYWNoKHApfW89LTEscz1lW3UqdF0+PXIsaXVbczw8Ml0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWw9cyxzPXV1KGVbdSp0K28rMV0sciksaXVbczw8MnxsPDwzXS5mb3JFYWNoKHApO2Z1bmN0aW9uIHAodCl7dmFyIG4sZSxyPVt0WzBdWzBdK28sdFswXVsxXSt1XSxjPVt0WzFdWzBdK28sdFsxXVsxXSt1XSxmPWEocikscz1hKGMpOyhuPWRbZl0pPyhlPWhbc10pPyhkZWxldGUgZFtuLmVuZF0sZGVsZXRlIGhbZS5zdGFydF0sbj09PWU/KG4ucmluZy5wdXNoKGMpLGkobi5yaW5nKSk6aFtuLnN0YXJ0XT1kW2UuZW5kXT17c3RhcnQ6bi5zdGFydCxlbmQ6ZS5lbmQscmluZzpuLnJpbmcuY29uY2F0KGUucmluZyl9KTooZGVsZXRlIGRbbi5lbmRdLG4ucmluZy5wdXNoKGMpLGRbbi5lbmQ9c109bik6KG49aFtzXSk/KGU9ZFtmXSk/KGRlbGV0ZSBoW24uc3RhcnRdLGRlbGV0ZSBkW2UuZW5kXSxuPT09ZT8obi5yaW5nLnB1c2goYyksaShuLnJpbmcpKTpoW2Uuc3RhcnRdPWRbbi5lbmRdPXtzdGFydDplLnN0YXJ0LGVuZDpuLmVuZCxyaW5nOmUucmluZy5jb25jYXQobi5yaW5nKX0pOihkZWxldGUgaFtuLnN0YXJ0XSxuLnJpbmcudW5zaGlmdChyKSxoW24uc3RhcnQ9Zl09bik6aFtmXT1kW3NdPXtzdGFydDpmLGVuZDpzLHJpbmc6W3IsY119fWl1W3M8PDNdLmZvckVhY2gocCl9KGUsbywoZnVuY3Rpb24odCl7cih0LGUsbyksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD91LnB1c2goW3RdKTpjLnB1c2godCl9KSksYy5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0wLHI9dS5sZW5ndGg7ZTxyOysrZSlpZigtMSE9PXR1KChuPXVbZV0pWzBdLHQpKXJldHVybiB2b2lkIG4ucHVzaCh0KX0pKSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOnV9fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbz1lWzBdLGE9ZVsxXSx1PTB8byxjPTB8YSxmPWN1KHJbYyp0K3VdKTtvPjAmJm88dCYmdT09PW8mJihlWzBdPWZ1KG8sY3UocltjKnQrdS0xXSksZixpKSksYT4wJiZhPG4mJmM9PT1hJiYoZVsxXT1mdShhLGN1KHJbKGMtMSkqdCt1XSksZixpKSl9KSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmZsb29yKGVbMF0pLG89TWF0aC5mbG9vcihlWzFdKTtpZighKHI+PTAmJm8+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHQ9cixuPW8saX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9KYShLYS5jYWxsKHQpKTpKYSh0KSxpKTplfSxpLnNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10P3U6cnUsaSk6cj09PXV9LGl9ZnVuY3Rpb24gYXUodCl7cmV0dXJuIGlzRmluaXRlKHQpP3Q6TmFOfWZ1bmN0aW9uIHV1KHQsbil7cmV0dXJuIG51bGwhPXQmJit0Pj1ufWZ1bmN0aW9uIGN1KHQpe3JldHVybiBudWxsPT10fHxpc05hTih0PSt0KT8tMS8wOnR9ZnVuY3Rpb24gZnUodCxuLGUscil7Y29uc3QgaT1yLW4sbz1lLW4sYT1pc0Zpbml0ZShpKXx8aXNGaW5pdGUobyk/aS9vOk1hdGguc2lnbihpKS9NYXRoLnNpZ24obyk7cmV0dXJuIGlzTmFOKGEpP3Q6dCthLS41fWZ1bmN0aW9uIHN1KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGx1KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGh1KCl7cmV0dXJuIDF9Y29uc3QgZHU9MTM0MjE3NzI5LHB1PTMzMzA2NjkwNzM4NzU0NzA2ZS0zMjtmdW5jdGlvbiBndSh0LG4sZSxyLGkpe2xldCBvLGEsdSxjLGY9blswXSxzPXJbMF0sbD0wLGg9MDtzPmY9PXM+LWY/KG89ZixmPW5bKytsXSk6KG89cyxzPXJbKytoXSk7bGV0IGQ9MDtpZihsPHQmJmg8ZSlmb3Iocz5mPT1zPi1mPyhhPWYrbyx1PW8tKGEtZiksZj1uWysrbF0pOihhPXMrbyx1PW8tKGEtcykscz1yWysraF0pLG89YSwwIT09dSYmKGlbZCsrXT11KTtsPHQmJmg8ZTspcz5mPT1zPi1mPyhhPW8rZixjPWEtbyx1PW8tKGEtYykrKGYtYyksZj1uWysrbF0pOihhPW8rcyxjPWEtbyx1PW8tKGEtYykrKHMtYykscz1yWysraF0pLG89YSwwIT09dSYmKGlbZCsrXT11KTtmb3IoO2w8dDspYT1vK2YsYz1hLW8sdT1vLShhLWMpKyhmLWMpLGY9blsrK2xdLG89YSwwIT09dSYmKGlbZCsrXT11KTtmb3IoO2g8ZTspYT1vK3MsYz1hLW8sdT1vLShhLWMpKyhzLWMpLHM9clsrK2hdLG89YSwwIT09dSYmKGlbZCsrXT11KTtyZXR1cm4gMD09PW8mJjAhPT1kfHwoaVtkKytdPW8pLGR9ZnVuY3Rpb24geXUodCl7cmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkodCl9Y29uc3QgdnU9MjIyMDQ0NjA0OTI1MDMxNDZlLTMyLF91PTExMDkzMzU2NDc5NjcwNDg3ZS00NyxidT15dSg0KSxtdT15dSg4KSx4dT15dSgxMiksd3U9eXUoMTYpLE11PXl1KDQpO2Z1bmN0aW9uIFR1KHQsbixlLHIsaSxvKXtjb25zdCBhPShuLW8pKihlLWkpLHU9KHQtaSkqKHItbyksYz1hLXU7aWYoMD09PWF8fDA9PT11fHxhPjAhPXU+MClyZXR1cm4gYztjb25zdCBmPU1hdGguYWJzKGErdSk7cmV0dXJuIE1hdGguYWJzKGMpPj0zMzMwNjY5MDczODc1NDcxNmUtMzIqZj9jOi1mdW5jdGlvbih0LG4sZSxyLGksbyxhKXtsZXQgdSxjLGYscyxsLGgsZCxwLGcseSx2LF8sYixtLHgsdyxNLFQ7Y29uc3QgQT10LWksUz1lLWksRT1uLW8sTj1yLW87bT1BKk4saD1kdSpBLGQ9aC0oaC1BKSxwPUEtZCxoPWR1Kk4sZz1oLShoLU4pLHk9Ti1nLHg9cCp5LShtLWQqZy1wKmctZCp5KSx3PUUqUyxoPWR1KkUsZD1oLShoLUUpLHA9RS1kLGg9ZHUqUyxnPWgtKGgtUykseT1TLWcsTT1wKnktKHctZCpnLXAqZy1kKnkpLHY9eC1NLGw9eC12LGJ1WzBdPXgtKHYrbCkrKGwtTSksXz1tK3YsbD1fLW0sYj1tLShfLWwpKyh2LWwpLHY9Yi13LGw9Yi12LGJ1WzFdPWItKHYrbCkrKGwtdyksVD1fK3YsbD1ULV8sYnVbMl09Xy0oVC1sKSsodi1sKSxidVszXT1UO2xldCBrPWZ1bmN0aW9uKHQsbil7bGV0IGU9blswXTtmb3IobGV0IHI9MTtyPHQ7cisrKWUrPW5bcl07cmV0dXJuIGV9KDQsYnUpLEM9dnUqYTtpZihrPj1DfHwtaz49QylyZXR1cm4gaztpZihsPXQtQSx1PXQtKEErbCkrKGwtaSksbD1lLVMsZj1lLShTK2wpKyhsLWkpLGw9bi1FLGM9bi0oRStsKSsobC1vKSxsPXItTixzPXItKE4rbCkrKGwtbyksMD09PXUmJjA9PT1jJiYwPT09ZiYmMD09PXMpcmV0dXJuIGs7aWYoQz1fdSphK3B1Kk1hdGguYWJzKGspLGsrPUEqcytOKnUtKEUqZitTKmMpLGs+PUN8fC1rPj1DKXJldHVybiBrO209dSpOLGg9ZHUqdSxkPWgtKGgtdSkscD11LWQsaD1kdSpOLGc9aC0oaC1OKSx5PU4tZyx4PXAqeS0obS1kKmctcCpnLWQqeSksdz1jKlMsaD1kdSpjLGQ9aC0oaC1jKSxwPWMtZCxoPWR1KlMsZz1oLShoLVMpLHk9Uy1nLE09cCp5LSh3LWQqZy1wKmctZCp5KSx2PXgtTSxsPXgtdixNdVswXT14LSh2K2wpKyhsLU0pLF89bSt2LGw9Xy1tLGI9bS0oXy1sKSsodi1sKSx2PWItdyxsPWItdixNdVsxXT1iLSh2K2wpKyhsLXcpLFQ9Xyt2LGw9VC1fLE11WzJdPV8tKFQtbCkrKHYtbCksTXVbM109VDtjb25zdCBQPWd1KDQsYnUsNCxNdSxtdSk7bT1BKnMsaD1kdSpBLGQ9aC0oaC1BKSxwPUEtZCxoPWR1KnMsZz1oLShoLXMpLHk9cy1nLHg9cCp5LShtLWQqZy1wKmctZCp5KSx3PUUqZixoPWR1KkUsZD1oLShoLUUpLHA9RS1kLGg9ZHUqZixnPWgtKGgtZikseT1mLWcsTT1wKnktKHctZCpnLXAqZy1kKnkpLHY9eC1NLGw9eC12LE11WzBdPXgtKHYrbCkrKGwtTSksXz1tK3YsbD1fLW0sYj1tLShfLWwpKyh2LWwpLHY9Yi13LGw9Yi12LE11WzFdPWItKHYrbCkrKGwtdyksVD1fK3YsbD1ULV8sTXVbMl09Xy0oVC1sKSsodi1sKSxNdVszXT1UO2NvbnN0IHo9Z3UoUCxtdSw0LE11LHh1KTttPXUqcyxoPWR1KnUsZD1oLShoLXUpLHA9dS1kLGg9ZHUqcyxnPWgtKGgtcykseT1zLWcseD1wKnktKG0tZCpnLXAqZy1kKnkpLHc9YypmLGg9ZHUqYyxkPWgtKGgtYykscD1jLWQsaD1kdSpmLGc9aC0oaC1mKSx5PWYtZyxNPXAqeS0ody1kKmctcCpnLWQqeSksdj14LU0sbD14LXYsTXVbMF09eC0oditsKSsobC1NKSxfPW0rdixsPV8tbSxiPW0tKF8tbCkrKHYtbCksdj1iLXcsbD1iLXYsTXVbMV09Yi0oditsKSsobC13KSxUPV8rdixsPVQtXyxNdVsyXT1fLShULWwpKyh2LWwpLE11WzNdPVQ7Y29uc3QgJD1ndSh6LHh1LDQsTXUsd3UpO3JldHVybiB3dVskLTFdfSh0LG4sZSxyLGksbyxmKX1jb25zdCBBdT1NYXRoLnBvdygyLC01MiksU3U9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgRXV7c3RhdGljIGZyb20odCxuPSR1LGU9RHUpe2NvbnN0IHI9dC5sZW5ndGgsaT1uZXcgRmxvYXQ2NEFycmF5KDIqcik7Zm9yKGxldCBvPTA7bzxyO28rKyl7Y29uc3Qgcj10W29dO2lbMipvXT1uKHIpLGlbMipvKzFdPWUocil9cmV0dXJuIG5ldyBFdShpKX1jb25zdHJ1Y3Rvcih0KXtjb25zdCBuPXQubGVuZ3RoPj4xO2lmKG4+MCYmIm51bWJlciIhPXR5cGVvZiB0WzBdKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz10O2NvbnN0IGU9TWF0aC5tYXgoMipuLTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgzKmUpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheSgzKmUpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQobikpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheShuKSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkobiksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkobiksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkobiksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheShuKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3Jkczp0LF9odWxsUHJldjpuLF9odWxsTmV4dDplLF9odWxsVHJpOnIsX2h1bGxIYXNoOml9PXRoaXMsbz10Lmxlbmd0aD4+MTtsZXQgYT0xLzAsdT0xLzAsYz0tMS8wLGY9LTEvMDtmb3IobGV0IG49MDtuPG87bisrKXtjb25zdCBlPXRbMipuXSxyPXRbMipuKzFdO2U8YSYmKGE9ZSkscjx1JiYodT1yKSxlPmMmJihjPWUpLHI+ZiYmKGY9ciksdGhpcy5faWRzW25dPW59Y29uc3Qgcz0oYStjKS8yLGw9KHUrZikvMjtsZXQgaCxkLHAsZz0xLzA7Zm9yKGxldCBuPTA7bjxvO24rKyl7Y29uc3QgZT1OdShzLGwsdFsyKm5dLHRbMipuKzFdKTtlPGcmJihoPW4sZz1lKX1jb25zdCB5PXRbMipoXSx2PXRbMipoKzFdO2c9MS8wO2ZvcihsZXQgbj0wO248bztuKyspe2lmKG49PT1oKWNvbnRpbnVlO2NvbnN0IGU9TnUoeSx2LHRbMipuXSx0WzIqbisxXSk7ZTxnJiZlPjAmJihkPW4sZz1lKX1sZXQgXz10WzIqZF0sYj10WzIqZCsxXSxtPTEvMDtmb3IobGV0IG49MDtuPG87bisrKXtpZihuPT09aHx8bj09PWQpY29udGludWU7Y29uc3QgZT1DdSh5LHYsXyxiLHRbMipuXSx0WzIqbisxXSk7ZTxtJiYocD1uLG09ZSl9bGV0IHg9dFsyKnBdLHc9dFsyKnArMV07aWYobT09PTEvMCl7Zm9yKGxldCBuPTA7bjxvO24rKyl0aGlzLl9kaXN0c1tuXT10WzIqbl0tdFswXXx8dFsyKm4rMV0tdFsxXTtQdSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpO2NvbnN0IG49bmV3IFVpbnQzMkFycmF5KG8pO2xldCBlPTA7Zm9yKGxldCB0PTAscj0tMS8wO3Q8bzt0Kyspe2NvbnN0IGk9dGhpcy5faWRzW3RdO3RoaXMuX2Rpc3RzW2ldPnImJihuW2UrK109aSxyPXRoaXMuX2Rpc3RzW2ldKX1yZXR1cm4gdGhpcy5odWxsPW4uc3ViYXJyYXkoMCxlKSx0aGlzLnRyaWFuZ2xlcz1uZXcgVWludDMyQXJyYXkoMCksdm9pZCh0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCkpfWlmKFR1KHksdixfLGIseCx3KTwwKXtjb25zdCB0PWQsbj1fLGU9YjtkPXAsXz14LGI9dyxwPXQseD1uLHc9ZX1jb25zdCBNPWZ1bmN0aW9uKHQsbixlLHIsaSxvKXtjb25zdCBhPWUtdCx1PXItbixjPWktdCxmPW8tbixzPWEqYSt1KnUsbD1jKmMrZipmLGg9LjUvKGEqZi11KmMpLGQ9dCsoZipzLXUqbCkqaCxwPW4rKGEqbC1jKnMpKmg7cmV0dXJue3g6ZCx5OnB9fSh5LHYsXyxiLHgsdyk7dGhpcy5fY3g9TS54LHRoaXMuX2N5PU0ueTtmb3IobGV0IG49MDtuPG87bisrKXRoaXMuX2Rpc3RzW25dPU51KHRbMipuXSx0WzIqbisxXSxNLngsTS55KTtQdSh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxvLTEpLHRoaXMuX2h1bGxTdGFydD1oO2xldCBUPTM7ZVtoXT1uW3BdPWQsZVtkXT1uW2hdPXAsZVtwXT1uW2RdPWgscltoXT0wLHJbZF09MSxyW3BdPTIsaS5maWxsKC0xKSxpW3RoaXMuX2hhc2hLZXkoeSx2KV09aCxpW3RoaXMuX2hhc2hLZXkoXyxiKV09ZCxpW3RoaXMuX2hhc2hLZXkoeCx3KV09cCx0aGlzLnRyaWFuZ2xlc0xlbj0wLHRoaXMuX2FkZFRyaWFuZ2xlKGgsZCxwLC0xLC0xLC0xKTtmb3IobGV0IG8sYSx1PTA7dTx0aGlzLl9pZHMubGVuZ3RoO3UrKyl7Y29uc3QgYz10aGlzLl9pZHNbdV0sZj10WzIqY10scz10WzIqYysxXTtpZih1PjAmJk1hdGguYWJzKGYtbyk8PUF1JiZNYXRoLmFicyhzLWEpPD1BdSljb250aW51ZTtpZihvPWYsYT1zLGM9PT1ofHxjPT09ZHx8Yz09PXApY29udGludWU7bGV0IGw9MDtmb3IobGV0IHQ9MCxuPXRoaXMuX2hhc2hLZXkoZixzKTt0PHRoaXMuX2hhc2hTaXplJiYobD1pWyhuK3QpJXRoaXMuX2hhc2hTaXplXSwtMT09PWx8fGw9PT1lW2xdKTt0KyspO2w9bltsXTtsZXQgZyx5PWw7Zm9yKDtnPWVbeV0sVHUoZixzLHRbMip5XSx0WzIqeSsxXSx0WzIqZ10sdFsyKmcrMV0pPj0wOylpZih5PWcseT09PWwpe3k9LTE7YnJlYWt9aWYoLTE9PT15KWNvbnRpbnVlO2xldCB2PXRoaXMuX2FkZFRyaWFuZ2xlKHksYyxlW3ldLC0xLC0xLHJbeV0pO3JbY109dGhpcy5fbGVnYWxpemUodisyKSxyW3ldPXYsVCsrO2xldCBfPWVbeV07Zm9yKDtnPWVbX10sVHUoZixzLHRbMipfXSx0WzIqXysxXSx0WzIqZ10sdFsyKmcrMV0pPDA7KXY9dGhpcy5fYWRkVHJpYW5nbGUoXyxjLGcscltjXSwtMSxyW19dKSxyW2NdPXRoaXMuX2xlZ2FsaXplKHYrMiksZVtfXT1fLFQtLSxfPWc7aWYoeT09PWwpZm9yKDtnPW5beV0sVHUoZixzLHRbMipnXSx0WzIqZysxXSx0WzIqeV0sdFsyKnkrMV0pPDA7KXY9dGhpcy5fYWRkVHJpYW5nbGUoZyxjLHksLTEsclt5XSxyW2ddKSx0aGlzLl9sZWdhbGl6ZSh2KzIpLHJbZ109dixlW3ldPXksVC0tLHk9Zzt0aGlzLl9odWxsU3RhcnQ9bltjXT15LGVbeV09bltfXT1jLGVbY109XyxpW3RoaXMuX2hhc2hLZXkoZixzKV09YyxpW3RoaXMuX2hhc2hLZXkodFsyKnldLHRbMip5KzFdKV09eX10aGlzLmh1bGw9bmV3IFVpbnQzMkFycmF5KFQpO2ZvcihsZXQgdD0wLG49dGhpcy5faHVsbFN0YXJ0O3Q8VDt0KyspdGhpcy5odWxsW3RdPW4sbj1lW25dO3RoaXMudHJpYW5nbGVzPXRoaXMuX3RyaWFuZ2xlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKSx0aGlzLmhhbGZlZGdlcz10aGlzLl9oYWxmZWRnZXMuc3ViYXJyYXkoMCx0aGlzLnRyaWFuZ2xlc0xlbil9X2hhc2hLZXkodCxuKXtyZXR1cm4gTWF0aC5mbG9vcihmdW5jdGlvbih0LG4pe2NvbnN0IGU9dC8oTWF0aC5hYnModCkrTWF0aC5hYnMobikpO3JldHVybihuPjA/My1lOjErZSkvNH0odC10aGlzLl9jeCxuLXRoaXMuX2N5KSp0aGlzLl9oYXNoU2l6ZSkldGhpcy5faGFzaFNpemV9X2xlZ2FsaXplKHQpe2NvbnN0e190cmlhbmdsZXM6bixfaGFsZmVkZ2VzOmUsY29vcmRzOnJ9PXRoaXM7bGV0IGk9MCxvPTA7Zm9yKDs7KXtjb25zdCBhPWVbdF0sdT10LXQlMztpZihvPXUrKHQrMiklMywtMT09PWEpe2lmKDA9PT1pKWJyZWFrO3Q9U3VbLS1pXTtjb250aW51ZX1jb25zdCBjPWEtYSUzLGY9dSsodCsxKSUzLHM9YysoYSsyKSUzLGw9bltvXSxoPW5bdF0sZD1uW2ZdLHA9bltzXTtpZihrdShyWzIqbF0sclsyKmwrMV0sclsyKmhdLHJbMipoKzFdLHJbMipkXSxyWzIqZCsxXSxyWzIqcF0sclsyKnArMV0pKXtuW3RdPXAsblthXT1sO2NvbnN0IHI9ZVtzXTtpZigtMT09PXIpe2xldCBuPXRoaXMuX2h1bGxTdGFydDtkb3tpZih0aGlzLl9odWxsVHJpW25dPT09cyl7dGhpcy5faHVsbFRyaVtuXT10O2JyZWFrfW49dGhpcy5faHVsbFByZXZbbl19d2hpbGUobiE9PXRoaXMuX2h1bGxTdGFydCl9dGhpcy5fbGluayh0LHIpLHRoaXMuX2xpbmsoYSxlW29dKSx0aGlzLl9saW5rKG8scyk7Y29uc3QgdT1jKyhhKzEpJTM7aTxTdS5sZW5ndGgmJihTdVtpKytdPXUpfWVsc2V7aWYoMD09PWkpYnJlYWs7dD1TdVstLWldfX1yZXR1cm4gb31fbGluayh0LG4pe3RoaXMuX2hhbGZlZGdlc1t0XT1uLC0xIT09biYmKHRoaXMuX2hhbGZlZGdlc1tuXT10KX1fYWRkVHJpYW5nbGUodCxuLGUscixpLG8pe2NvbnN0IGE9dGhpcy50cmlhbmdsZXNMZW47cmV0dXJuIHRoaXMuX3RyaWFuZ2xlc1thXT10LHRoaXMuX3RyaWFuZ2xlc1thKzFdPW4sdGhpcy5fdHJpYW5nbGVzW2ErMl09ZSx0aGlzLl9saW5rKGEsciksdGhpcy5fbGluayhhKzEsaSksdGhpcy5fbGluayhhKzIsbyksdGhpcy50cmlhbmdsZXNMZW4rPTMsYX19ZnVuY3Rpb24gTnUodCxuLGUscil7Y29uc3QgaT10LWUsbz1uLXI7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24ga3UodCxuLGUscixpLG8sYSx1KXtjb25zdCBjPXQtYSxmPW4tdSxzPWUtYSxsPXItdSxoPWktYSxkPW8tdSxwPXMqcytsKmwsZz1oKmgrZCpkO3JldHVybiBjKihsKmctcCpkKS1mKihzKmctcCpoKSsoYypjK2YqZikqKHMqZC1sKmgpPDB9ZnVuY3Rpb24gQ3UodCxuLGUscixpLG8pe2NvbnN0IGE9ZS10LHU9ci1uLGM9aS10LGY9by1uLHM9YSphK3UqdSxsPWMqYytmKmYsaD0uNS8oYSpmLXUqYyksZD0oZipzLXUqbCkqaCxwPShhKmwtYypzKSpoO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIFB1KHQsbixlLHIpe2lmKHItZTw9MjApZm9yKGxldCBpPWUrMTtpPD1yO2krKyl7Y29uc3Qgcj10W2ldLG89bltyXTtsZXQgYT1pLTE7Zm9yKDthPj1lJiZuW3RbYV1dPm87KXRbYSsxXT10W2EtLV07dFthKzFdPXJ9ZWxzZXtsZXQgaT1lKzEsbz1yO3p1KHQsZStyPj4xLGkpLG5bdFtlXV0+blt0W3JdXSYmenUodCxlLHIpLG5bdFtpXV0+blt0W3JdXSYmenUodCxpLHIpLG5bdFtlXV0+blt0W2ldXSYmenUodCxlLGkpO2NvbnN0IGE9dFtpXSx1PW5bYV07Zm9yKDs7KXtkb3tpKyt9d2hpbGUoblt0W2ldXTx1KTtkb3tvLS19d2hpbGUoblt0W29dXT51KTtpZihvPGkpYnJlYWs7enUodCxpLG8pfXRbZSsxXT10W29dLHRbb109YSxyLWkrMT49by1lPyhQdSh0LG4saSxyKSxQdSh0LG4sZSxvLTEpKTooUHUodCxuLGUsby0xKSxQdSh0LG4saSxyKSl9fWZ1bmN0aW9uIHp1KHQsbixlKXtjb25zdCByPXRbbl07dFtuXT10W2VdLHRbZV09cn1mdW5jdGlvbiAkdSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBEdSh0KXtyZXR1cm4gdFsxXX1jb25zdCBSdT0xZS02O2NsYXNzIEZ1e2NvbnN0cnVjdG9yKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9bW92ZVRvKHQsbil7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K259YH1jbG9zZVBhdGgoKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9bGluZVRvKHQsbil7dGhpcy5fKz1gTCR7dGhpcy5feDE9K3R9LCR7dGhpcy5feTE9K259YH1hcmModCxuLGUpe2NvbnN0IHI9KHQ9K3QpKyhlPStlKSxpPW49K247aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzIik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9YE0ke3J9LCR7aX1gOihNYXRoLmFicyh0aGlzLl94MS1yKT5SdXx8TWF0aC5hYnModGhpcy5feTEtaSk+UnUpJiYodGhpcy5fKz0iTCIrcisiLCIraSksZSYmKHRoaXMuXys9YEEke2V9LCR7ZX0sMCwxLDEsJHt0LWV9LCR7bn1BJHtlfSwke2V9LDAsMSwxLCR7dGhpcy5feDE9cn0sJHt0aGlzLl95MT1pfWApfXJlY3QodCxuLGUscil7dGhpcy5fKz1gTSR7dGhpcy5feDA9dGhpcy5feDE9K3R9LCR7dGhpcy5feTA9dGhpcy5feTE9K259aCR7K2V9diR7K3J9aCR7LWV9WmB9dmFsdWUoKXtyZXR1cm4gdGhpcy5ffHxudWxsfX1jbGFzcyBxdXtjb25zdHJ1Y3Rvcigpe3RoaXMuXz1bXX1tb3ZlVG8odCxuKXt0aGlzLl8ucHVzaChbdCxuXSl9Y2xvc2VQYXRoKCl7dGhpcy5fLnB1c2godGhpcy5fWzBdLnNsaWNlKCkpfWxpbmVUbyh0LG4pe3RoaXMuXy5wdXNoKFt0LG5dKX12YWx1ZSgpe3JldHVybiB0aGlzLl8ubGVuZ3RoP3RoaXMuXzpudWxsfX1jbGFzcyBVdXtjb25zdHJ1Y3Rvcih0LFtuLGUscixpXT1bMCwwLDk2MCw1MDBdKXtpZighKChyPStyKT49KG49K24pJiYoaT0raSk+PShlPStlKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJvdW5kcyIpO3RoaXMuZGVsYXVuYXk9dCx0aGlzLl9jaXJjdW1jZW50ZXJzPW5ldyBGbG9hdDY0QXJyYXkoMip0LnBvaW50cy5sZW5ndGgpLHRoaXMudmVjdG9ycz1uZXcgRmxvYXQ2NEFycmF5KDIqdC5wb2ludHMubGVuZ3RoKSx0aGlzLnhtYXg9cix0aGlzLnhtaW49bix0aGlzLnltYXg9aSx0aGlzLnltaW49ZSx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuZGVsYXVuYXkudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnQsaHVsbDpuLHRyaWFuZ2xlczplfSx2ZWN0b3JzOnJ9PXRoaXM7bGV0IGksbztjb25zdCBhPXRoaXMuY2lyY3VtY2VudGVycz10aGlzLl9jaXJjdW1jZW50ZXJzLnN1YmFycmF5KDAsZS5sZW5ndGgvMyoyKTtmb3IobGV0IHIsdSxjPTAsZj0wLHM9ZS5sZW5ndGg7YzxzO2MrPTMsZis9Mil7Y29uc3Qgcz0yKmVbY10sbD0yKmVbYysxXSxoPTIqZVtjKzJdLGQ9dFtzXSxwPXRbcysxXSxnPXRbbF0seT10W2wrMV0sdj10W2hdLF89dFtoKzFdLGI9Zy1kLG09eS1wLHg9di1kLHc9Xy1wLE09MiooYip3LW0qeCk7aWYoTWF0aC5hYnMoTSk8MWUtOSl7aWYodm9pZCAwPT09aSl7aT1vPTA7Zm9yKGNvbnN0IGUgb2YgbilpKz10WzIqZV0sbys9dFsyKmUrMV07aS89bi5sZW5ndGgsby89bi5sZW5ndGh9Y29uc3QgZT0xZTkqTWF0aC5zaWduKChpLWQpKnctKG8tcCkqeCk7cj0oZCt2KS8yLWUqdyx1PShwK18pLzIrZSp4fWVsc2V7Y29uc3QgdD0xL00sbj1iKmIrbSptLGU9eCp4K3cqdztyPWQrKHcqbi1tKmUpKnQsdT1wKyhiKmUteCpuKSp0fWFbZl09cixhW2YrMV09dX1sZXQgdSxjLGYscz1uW24ubGVuZ3RoLTFdLGw9NCpzLGg9dFsyKnNdLGQ9dFsyKnMrMV07ci5maWxsKDApO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7KytlKXM9bltlXSx1PWwsYz1oLGY9ZCxsPTQqcyxoPXRbMipzXSxkPXRbMipzKzFdLHJbdSsyXT1yW2xdPWYtZCxyW3UrM109cltsKzFdPWgtY31yZW5kZXIodCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7ZGVsYXVuYXk6e2hhbGZlZGdlczplLGluZWRnZXM6cixodWxsOml9LGNpcmN1bWNlbnRlcnM6byx2ZWN0b3JzOmF9PXRoaXM7aWYoaS5sZW5ndGg8PTEpcmV0dXJuIG51bGw7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7KytuKXtjb25zdCByPWVbbl07aWYocjxuKWNvbnRpbnVlO2NvbnN0IGk9MipNYXRoLmZsb29yKG4vMyksYT0yKk1hdGguZmxvb3Ioci8zKSx1PW9baV0sYz1vW2krMV0sZj1vW2FdLHM9b1thKzFdO3RoaXMuX3JlbmRlclNlZ21lbnQodSxjLGYscyx0KX1sZXQgdSxjPWlbaS5sZW5ndGgtMV07Zm9yKGxldCBuPTA7bjxpLmxlbmd0aDsrK24pe3U9YyxjPWlbbl07Y29uc3QgZT0yKk1hdGguZmxvb3IocltjXS8zKSxmPW9bZV0scz1vW2UrMV0sbD00KnUsaD10aGlzLl9wcm9qZWN0KGYscyxhW2wrMl0sYVtsKzNdKTtoJiZ0aGlzLl9yZW5kZXJTZWdtZW50KGYscyxoWzBdLGhbMV0sdCl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJCb3VuZHModCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMDtyZXR1cm4gdC5yZWN0KHRoaXMueG1pbix0aGlzLnltaW4sdGhpcy54bWF4LXRoaXMueG1pbix0aGlzLnltYXgtdGhpcy55bWluKSxuJiZuLnZhbHVlKCl9cmVuZGVyQ2VsbCh0LG4pe2NvbnN0IGU9bnVsbD09bj9uPW5ldyBGdTp2b2lkIDAscj10aGlzLl9jbGlwKHQpO2lmKG51bGw9PT1yfHwhci5sZW5ndGgpcmV0dXJuO24ubW92ZVRvKHJbMF0sclsxXSk7bGV0IGk9ci5sZW5ndGg7Zm9yKDtyWzBdPT09cltpLTJdJiZyWzFdPT09cltpLTFdJiZpPjE7KWktPTI7Zm9yKGxldCB0PTI7dDxpO3QrPTIpclt0XT09PXJbdC0yXSYmclt0KzFdPT09clt0LTFdfHxuLmxpbmVUbyhyW3RdLHJbdCsxXSk7cmV0dXJuIG4uY2xvc2VQYXRoKCksZSYmZS52YWx1ZSgpfSpjZWxsUG9seWdvbnMoKXtjb25zdHtkZWxhdW5heTp7cG9pbnRzOnR9fT10aGlzO2ZvcihsZXQgbj0wLGU9dC5sZW5ndGgvMjtuPGU7KytuKXtjb25zdCB0PXRoaXMuY2VsbFBvbHlnb24obik7dCYmKHQuaW5kZXg9bix5aWVsZCB0KX19Y2VsbFBvbHlnb24odCl7Y29uc3Qgbj1uZXcgcXU7cmV0dXJuIHRoaXMucmVuZGVyQ2VsbCh0LG4pLG4udmFsdWUoKX1fcmVuZGVyU2VnbWVudCh0LG4sZSxyLGkpe2xldCBvO2NvbnN0IGE9dGhpcy5fcmVnaW9uY29kZSh0LG4pLHU9dGhpcy5fcmVnaW9uY29kZShlLHIpOzA9PT1hJiYwPT09dT8oaS5tb3ZlVG8odCxuKSxpLmxpbmVUbyhlLHIpKToobz10aGlzLl9jbGlwU2VnbWVudCh0LG4sZSxyLGEsdSkpJiYoaS5tb3ZlVG8ob1swXSxvWzFdKSxpLmxpbmVUbyhvWzJdLG9bM10pKX1jb250YWlucyh0LG4sZSl7cmV0dXJuKG49K24pPT1uJiYoZT0rZSk9PWUmJnRoaXMuZGVsYXVuYXkuX3N0ZXAodCxuLGUpPT09dH0qbmVpZ2hib3JzKHQpe2NvbnN0IG49dGhpcy5fY2xpcCh0KTtpZihuKWZvcihjb25zdCBlIG9mIHRoaXMuZGVsYXVuYXkubmVpZ2hib3JzKHQpKXtjb25zdCB0PXRoaXMuX2NsaXAoZSk7aWYodCl0OmZvcihsZXQgcj0wLGk9bi5sZW5ndGg7cjxpO3IrPTIpZm9yKGxldCBvPTAsYT10Lmxlbmd0aDtvPGE7bys9MilpZihuW3JdPT09dFtvXSYmbltyKzFdPT09dFtvKzFdJiZuWyhyKzIpJWldPT09dFsobythLTIpJWFdJiZuWyhyKzMpJWldPT09dFsobythLTEpJWFdKXt5aWVsZCBlO2JyZWFrIHR9fX1fY2VsbCh0KXtjb25zdHtjaXJjdW1jZW50ZXJzOm4sZGVsYXVuYXk6e2luZWRnZXM6ZSxoYWxmZWRnZXM6cix0cmlhbmdsZXM6aX19PXRoaXMsbz1lW3RdO2lmKC0xPT09bylyZXR1cm4gbnVsbDtjb25zdCBhPVtdO2xldCB1PW87ZG97Y29uc3QgZT1NYXRoLmZsb29yKHUvMyk7aWYoYS5wdXNoKG5bMiplXSxuWzIqZSsxXSksdT11JTM9PTI/dS0yOnUrMSxpW3VdIT09dClicmVhazt1PXJbdV19d2hpbGUodSE9PW8mJi0xIT09dSk7cmV0dXJuIGF9X2NsaXAodCl7aWYoMD09PXQmJjE9PT10aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoKXJldHVyblt0aGlzLnhtYXgsdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWluXTtjb25zdCBuPXRoaXMuX2NlbGwodCk7aWYobnVsbD09PW4pcmV0dXJuIG51bGw7Y29uc3R7dmVjdG9yczplfT10aGlzLHI9NCp0O3JldHVybiB0aGlzLl9zaW1wbGlmeShlW3JdfHxlW3IrMV0/dGhpcy5fY2xpcEluZmluaXRlKHQsbixlW3JdLGVbcisxXSxlW3IrMl0sZVtyKzNdKTp0aGlzLl9jbGlwRmluaXRlKHQsbikpfV9jbGlwRmluaXRlKHQsbil7Y29uc3QgZT1uLmxlbmd0aDtsZXQgcixpLG8sYSx1PW51bGwsYz1uW2UtMl0sZj1uW2UtMV0scz10aGlzLl9yZWdpb25jb2RlKGMsZiksbD0wO2ZvcihsZXQgaD0wO2g8ZTtoKz0yKWlmKHI9YyxpPWYsYz1uW2hdLGY9bltoKzFdLG89cyxzPXRoaXMuX3JlZ2lvbmNvZGUoYyxmKSwwPT09byYmMD09PXMpYT1sLGw9MCx1P3UucHVzaChjLGYpOnU9W2MsZl07ZWxzZXtsZXQgbixlLGgsZCxwO2lmKDA9PT1vKXtpZihudWxsPT09KG49dGhpcy5fY2xpcFNlZ21lbnQocixpLGMsZixvLHMpKSljb250aW51ZTtbZSxoLGQscF09bn1lbHNle2lmKG51bGw9PT0obj10aGlzLl9jbGlwU2VnbWVudChjLGYscixpLHMsbykpKWNvbnRpbnVlO1tkLHAsZSxoXT1uLGE9bCxsPXRoaXMuX2VkZ2Vjb2RlKGUsaCksYSYmbCYmdGhpcy5fZWRnZSh0LGEsbCx1LHUubGVuZ3RoKSx1P3UucHVzaChlLGgpOnU9W2UsaF19YT1sLGw9dGhpcy5fZWRnZWNvZGUoZCxwKSxhJiZsJiZ0aGlzLl9lZGdlKHQsYSxsLHUsdS5sZW5ndGgpLHU/dS5wdXNoKGQscCk6dT1bZCxwXX1pZih1KWE9bCxsPXRoaXMuX2VkZ2Vjb2RlKHVbMF0sdVsxXSksYSYmbCYmdGhpcy5fZWRnZSh0LGEsbCx1LHUubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiB1fV9jbGlwU2VnbWVudCh0LG4sZSxyLGksbyl7Y29uc3QgYT1pPG87Zm9yKGEmJihbdCxuLGUscixpLG9dPVtlLHIsdCxuLG8saV0pOzspe2lmKDA9PT1pJiYwPT09bylyZXR1cm4gYT9bZSxyLHQsbl06W3QsbixlLHJdO2lmKGkmbylyZXR1cm4gbnVsbDtsZXQgdSxjLGY9aXx8bzs4JmY/KHU9dCsoZS10KSoodGhpcy55bWF4LW4pLyhyLW4pLGM9dGhpcy55bWF4KTo0JmY/KHU9dCsoZS10KSoodGhpcy55bWluLW4pLyhyLW4pLGM9dGhpcy55bWluKToyJmY/KGM9bisoci1uKSoodGhpcy54bWF4LXQpLyhlLXQpLHU9dGhpcy54bWF4KTooYz1uKyhyLW4pKih0aGlzLnhtaW4tdCkvKGUtdCksdT10aGlzLnhtaW4pLGk/KHQ9dSxuPWMsaT10aGlzLl9yZWdpb25jb2RlKHQsbikpOihlPXUscj1jLG89dGhpcy5fcmVnaW9uY29kZShlLHIpKX19X2NsaXBJbmZpbml0ZSh0LG4sZSxyLGksbyl7bGV0IGEsdT1BcnJheS5mcm9tKG4pO2lmKChhPXRoaXMuX3Byb2plY3QodVswXSx1WzFdLGUscikpJiZ1LnVuc2hpZnQoYVswXSxhWzFdKSwoYT10aGlzLl9wcm9qZWN0KHVbdS5sZW5ndGgtMl0sdVt1Lmxlbmd0aC0xXSxpLG8pKSYmdS5wdXNoKGFbMF0sYVsxXSksdT10aGlzLl9jbGlwRmluaXRlKHQsdSkpZm9yKGxldCBuLGU9MCxyPXUubGVuZ3RoLGk9dGhpcy5fZWRnZWNvZGUodVtyLTJdLHVbci0xXSk7ZTxyO2UrPTIpbj1pLGk9dGhpcy5fZWRnZWNvZGUodVtlXSx1W2UrMV0pLG4mJmkmJihlPXRoaXMuX2VkZ2UodCxuLGksdSxlKSxyPXUubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnModCwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJih1PVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIHV9X2VkZ2UodCxuLGUscixpKXtmb3IoO24hPT1lOyl7bGV0IGUsbztzd2l0Y2gobil7Y2FzZSA1Om49NDtjb250aW51ZTtjYXNlIDQ6bj02LGU9dGhpcy54bWF4LG89dGhpcy55bWluO2JyZWFrO2Nhc2UgNjpuPTI7Y29udGludWU7Y2FzZSAyOm49MTAsZT10aGlzLnhtYXgsbz10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDpuPTg7Y29udGludWU7Y2FzZSA4Om49OSxlPXRoaXMueG1pbixvPXRoaXMueW1heDticmVhaztjYXNlIDk6bj0xO2NvbnRpbnVlO2Nhc2UgMTpuPTUsZT10aGlzLnhtaW4sbz10aGlzLnltaW59cltpXT09PWUmJnJbaSsxXT09PW98fCF0aGlzLmNvbnRhaW5zKHQsZSxvKXx8KHIuc3BsaWNlKGksMCxlLG8pLGkrPTIpfXJldHVybiBpfV9wcm9qZWN0KHQsbixlLHIpe2xldCBpLG8sYSx1PTEvMDtpZihyPDApe2lmKG48PXRoaXMueW1pbilyZXR1cm4gbnVsbDsoaT0odGhpcy55bWluLW4pL3IpPHUmJihhPXRoaXMueW1pbixvPXQrKHU9aSkqZSl9ZWxzZSBpZihyPjApe2lmKG4+PXRoaXMueW1heClyZXR1cm4gbnVsbDsoaT0odGhpcy55bWF4LW4pL3IpPHUmJihhPXRoaXMueW1heCxvPXQrKHU9aSkqZSl9aWYoZT4wKXtpZih0Pj10aGlzLnhtYXgpcmV0dXJuIG51bGw7KGk9KHRoaXMueG1heC10KS9lKTx1JiYobz10aGlzLnhtYXgsYT1uKyh1PWkpKnIpfWVsc2UgaWYoZTwwKXtpZih0PD10aGlzLnhtaW4pcmV0dXJuIG51bGw7KGk9KHRoaXMueG1pbi10KS9lKTx1JiYobz10aGlzLnhtaW4sYT1uKyh1PWkpKnIpfXJldHVybltvLGFdfV9lZGdlY29kZSh0LG4pe3JldHVybih0PT09dGhpcy54bWluPzE6dD09PXRoaXMueG1heD8yOjApfChuPT09dGhpcy55bWluPzQ6bj09PXRoaXMueW1heD84OjApfV9yZWdpb25jb2RlKHQsbil7cmV0dXJuKHQ8dGhpcy54bWluPzE6dD50aGlzLnhtYXg/MjowKXwobjx0aGlzLnltaW4/NDpuPnRoaXMueW1heD84OjApfV9zaW1wbGlmeSh0KXtpZih0JiZ0Lmxlbmd0aD40KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rPTIpe2NvbnN0IGU9KG4rMikldC5sZW5ndGgscj0obis0KSV0Lmxlbmd0aDsodFtuXT09PXRbZV0mJnRbZV09PT10W3JdfHx0W24rMV09PT10W2UrMV0mJnRbZSsxXT09PXRbcisxXSkmJih0LnNwbGljZShlLDIpLG4tPTIpfXQubGVuZ3RofHwodD1udWxsKX1yZXR1cm4gdH19Y29uc3QgSXU9MipNYXRoLlBJLE91PU1hdGgucG93O2Z1bmN0aW9uIEJ1KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIFl1KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIEx1KHQsbixlKXtyZXR1cm5bdCtNYXRoLnNpbih0K24pKmUsbitNYXRoLmNvcyh0LW4pKmVdfWNsYXNzIGp1e3N0YXRpYyBmcm9tKHQsbj1CdSxlPVl1LHIpe3JldHVybiBuZXcganUoImxlbmd0aCJpbiB0P2Z1bmN0aW9uKHQsbixlLHIpe2NvbnN0IGk9dC5sZW5ndGgsbz1uZXcgRmxvYXQ2NEFycmF5KDIqaSk7Zm9yKGxldCBhPTA7YTxpOysrYSl7Y29uc3QgaT10W2FdO29bMiphXT1uLmNhbGwocixpLGEsdCksb1syKmErMV09ZS5jYWxsKHIsaSxhLHQpfXJldHVybiBvfSh0LG4sZSxyKTpGbG9hdDY0QXJyYXkuZnJvbShmdW5jdGlvbioodCxuLGUscil7bGV0IGk9MDtmb3IoY29uc3QgbyBvZiB0KXlpZWxkIG4uY2FsbChyLG8saSx0KSx5aWVsZCBlLmNhbGwocixvLGksdCksKytpfSh0LG4sZSxyKSkpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX2RlbGF1bmF0b3I9bmV3IEV1KHQpLHRoaXMuaW5lZGdlcz1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aC8yKSx0aGlzLl9odWxsSW5kZXg9bmV3IEludDMyQXJyYXkodC5sZW5ndGgvMiksdGhpcy5wb2ludHM9dGhpcy5fZGVsYXVuYXRvci5jb29yZHMsdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLl9kZWxhdW5hdG9yLnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3QgdD10aGlzLl9kZWxhdW5hdG9yLG49dGhpcy5wb2ludHM7aWYodC5odWxsJiZ0Lmh1bGwubGVuZ3RoPjImJmZ1bmN0aW9uKHQpe2NvbnN0e3RyaWFuZ2xlczpuLGNvb3JkczplfT10O2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCs9Myl7Y29uc3Qgcj0yKm5bdF0saT0yKm5bdCsxXSxvPTIqblt0KzJdO2lmKChlW29dLWVbcl0pKihlW2krMV0tZVtyKzFdKS0oZVtpXS1lW3JdKSooZVtvKzFdLWVbcisxXSk+MWUtMTApcmV0dXJuITF9cmV0dXJuITB9KHQpKXt0aGlzLmNvbGxpbmVhcj1JbnQzMkFycmF5LmZyb20oe2xlbmd0aDpuLmxlbmd0aC8yfSwoKHQsbik9Pm4pKS5zb3J0KCgodCxlKT0+blsyKnRdLW5bMiplXXx8blsyKnQrMV0tblsyKmUrMV0pKTtjb25zdCB0PXRoaXMuY29sbGluZWFyWzBdLGU9dGhpcy5jb2xsaW5lYXJbdGhpcy5jb2xsaW5lYXIubGVuZ3RoLTFdLHI9W25bMip0XSxuWzIqdCsxXSxuWzIqZV0sblsyKmUrMV1dLGk9MWUtOCpNYXRoLmh5cG90KHJbM10tclsxXSxyWzJdLXJbMF0pO2ZvcihsZXQgdD0wLGU9bi5sZW5ndGgvMjt0PGU7Kyt0KXtjb25zdCBlPUx1KG5bMip0XSxuWzIqdCsxXSxpKTtuWzIqdF09ZVswXSxuWzIqdCsxXT1lWzFdfXRoaXMuX2RlbGF1bmF0b3I9bmV3IEV1KG4pfWVsc2UgZGVsZXRlIHRoaXMuY29sbGluZWFyO2NvbnN0IGU9dGhpcy5oYWxmZWRnZXM9dGhpcy5fZGVsYXVuYXRvci5oYWxmZWRnZXMscj10aGlzLmh1bGw9dGhpcy5fZGVsYXVuYXRvci5odWxsLGk9dGhpcy50cmlhbmdsZXM9dGhpcy5fZGVsYXVuYXRvci50cmlhbmdsZXMsbz10aGlzLmluZWRnZXMuZmlsbCgtMSksYT10aGlzLl9odWxsSW5kZXguZmlsbCgtMSk7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXtjb25zdCBuPWlbdCUzPT0yP3QtMjp0KzFdOy0xIT09ZVt0XSYmLTEhPT1vW25dfHwob1tuXT10KX1mb3IobGV0IHQ9MCxuPXIubGVuZ3RoO3Q8bjsrK3QpYVtyW3RdXT10O3IubGVuZ3RoPD0yJiZyLmxlbmd0aD4wJiYodGhpcy50cmlhbmdsZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy5oYWxmZWRnZXM9bmV3IEludDMyQXJyYXkoMykuZmlsbCgtMSksdGhpcy50cmlhbmdsZXNbMF09clswXSxvW3JbMF1dPTEsMj09PXIubGVuZ3RoJiYob1tyWzFdXT0wLHRoaXMudHJpYW5nbGVzWzFdPXJbMV0sdGhpcy50cmlhbmdsZXNbMl09clsxXSkpfXZvcm9ub2kodCl7cmV0dXJuIG5ldyBVdSh0aGlzLHQpfSpuZWlnaGJvcnModCl7Y29uc3R7aW5lZGdlczpuLGh1bGw6ZSxfaHVsbEluZGV4OnIsaGFsZmVkZ2VzOmksdHJpYW5nbGVzOm8sY29sbGluZWFyOmF9PXRoaXM7aWYoYSl7Y29uc3Qgbj1hLmluZGV4T2YodCk7cmV0dXJuIG4+MCYmKHlpZWxkIGFbbi0xXSksdm9pZChuPGEubGVuZ3RoLTEmJih5aWVsZCBhW24rMV0pKX1jb25zdCB1PW5bdF07aWYoLTE9PT11KXJldHVybjtsZXQgYz11LGY9LTE7ZG97aWYoeWllbGQgZj1vW2NdLGM9YyUzPT0yP2MtMjpjKzEsb1tjXSE9PXQpcmV0dXJuO2lmKGM9aVtjXSwtMT09PWMpe2NvbnN0IG49ZVsoclt0XSsxKSVlLmxlbmd0aF07cmV0dXJuIHZvaWQobiE9PWYmJih5aWVsZCBuKSl9fXdoaWxlKGMhPT11KX1maW5kKHQsbixlPTApe2lmKCh0PSt0KSE9dHx8KG49K24pIT1uKXJldHVybi0xO2NvbnN0IHI9ZTtsZXQgaTtmb3IoOyhpPXRoaXMuX3N0ZXAoZSx0LG4pKT49MCYmaSE9PWUmJmkhPT1yOyllPWk7cmV0dXJuIGl9X3N0ZXAodCxuLGUpe2NvbnN0e2luZWRnZXM6cixodWxsOmksX2h1bGxJbmRleDpvLGhhbGZlZGdlczphLHRyaWFuZ2xlczp1LHBvaW50czpjfT10aGlzO2lmKC0xPT09clt0XXx8IWMubGVuZ3RoKXJldHVybih0KzEpJShjLmxlbmd0aD4+MSk7bGV0IGY9dCxzPU91KG4tY1syKnRdLDIpK091KGUtY1syKnQrMV0sMik7Y29uc3QgbD1yW3RdO2xldCBoPWw7ZG97bGV0IHI9dVtoXTtjb25zdCBsPU91KG4tY1syKnJdLDIpK091KGUtY1syKnIrMV0sMik7aWYobDxzJiYocz1sLGY9ciksaD1oJTM9PTI/aC0yOmgrMSx1W2hdIT09dClicmVhaztpZihoPWFbaF0sLTE9PT1oKXtpZihoPWlbKG9bdF0rMSklaS5sZW5ndGhdLGghPT1yJiZPdShuLWNbMipoXSwyKStPdShlLWNbMipoKzFdLDIpPHMpcmV0dXJuIGg7YnJlYWt9fXdoaWxlKGghPT1sKTtyZXR1cm4gZn1yZW5kZXIodCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7cG9pbnRzOmUsaGFsZmVkZ2VzOnIsdHJpYW5nbGVzOml9PXRoaXM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87KytuKXtjb25zdCBvPXJbbl07aWYobzxuKWNvbnRpbnVlO2NvbnN0IGE9MippW25dLHU9MippW29dO3QubW92ZVRvKGVbYV0sZVthKzFdKSx0LmxpbmVUbyhlW3VdLGVbdSsxXSl9cmV0dXJuIHRoaXMucmVuZGVySHVsbCh0KSxuJiZuLnZhbHVlKCl9cmVuZGVyUG9pbnRzKHQsbil7dm9pZCAwIT09bnx8dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubW92ZVRvfHwobj10LHQ9bnVsbCksbj1udWxsPT1uPzI6K247Y29uc3QgZT1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7cG9pbnRzOnJ9PXRoaXM7Zm9yKGxldCBlPTAsaT1yLmxlbmd0aDtlPGk7ZSs9Mil7Y29uc3QgaT1yW2VdLG89cltlKzFdO3QubW92ZVRvKGkrbixvKSx0LmFyYyhpLG8sbiwwLEl1KX1yZXR1cm4gZSYmZS52YWx1ZSgpfXJlbmRlckh1bGwodCl7Y29uc3Qgbj1udWxsPT10P3Q9bmV3IEZ1OnZvaWQgMCx7aHVsbDplLHBvaW50czpyfT10aGlzLGk9MiplWzBdLG89ZS5sZW5ndGg7dC5tb3ZlVG8ocltpXSxyW2krMV0pO2ZvcihsZXQgbj0xO248bzsrK24pe2NvbnN0IGk9MiplW25dO3QubGluZVRvKHJbaV0scltpKzFdKX1yZXR1cm4gdC5jbG9zZVBhdGgoKSxuJiZuLnZhbHVlKCl9aHVsbFBvbHlnb24oKXtjb25zdCB0PW5ldyBxdTtyZXR1cm4gdGhpcy5yZW5kZXJIdWxsKHQpLHQudmFsdWUoKX1yZW5kZXJUcmlhbmdsZSh0LG4pe2NvbnN0IGU9bnVsbD09bj9uPW5ldyBGdTp2b2lkIDAse3BvaW50czpyLHRyaWFuZ2xlczppfT10aGlzLG89MippW3QqPTNdLGE9MippW3QrMV0sdT0yKmlbdCsyXTtyZXR1cm4gbi5tb3ZlVG8ocltvXSxyW28rMV0pLG4ubGluZVRvKHJbYV0sclthKzFdKSxuLmxpbmVUbyhyW3VdLHJbdSsxXSksbi5jbG9zZVBhdGgoKSxlJiZlLnZhbHVlKCl9KnRyaWFuZ2xlUG9seWdvbnMoKXtjb25zdHt0cmlhbmdsZXM6dH09dGhpcztmb3IobGV0IG49MCxlPXQubGVuZ3RoLzM7bjxlOysrbil5aWVsZCB0aGlzLnRyaWFuZ2xlUG9seWdvbihuKX10cmlhbmdsZVBvbHlnb24odCl7Y29uc3Qgbj1uZXcgcXU7cmV0dXJuIHRoaXMucmVuZGVyVHJpYW5nbGUodCxuKSxuLnZhbHVlKCl9fXZhciBIdT17fSxYdT17fSxHdT0zNCxWdT0xMCxXdT0xMztmdW5jdGlvbiBadSh0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK3QubWFwKChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisnXSB8fCAiIid9KSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gS3UodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxlPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSksZX1mdW5jdGlvbiBRdSh0LG4pe3ZhciBlPXQrIiIscj1lLmxlbmd0aDtyZXR1cm4gcjxuP25ldyBBcnJheShuLXIrMSkuam9pbigwKStlOmV9ZnVuY3Rpb24gSnUodCl7dmFyIG4sZT10LmdldFVUQ0hvdXJzKCkscj10LmdldFVUQ01pbnV0ZXMoKSxpPXQuZ2V0VVRDU2Vjb25kcygpLG89dC5nZXRVVENNaWxsaXNlY29uZHMoKTtyZXR1cm4gaXNOYU4odCk/IkludmFsaWQgRGF0ZSI6KChuPXQuZ2V0VVRDRnVsbFllYXIoKSk8MD8iLSIrUXUoLW4sNik6bj45OTk5PyIrIitRdShuLDYpOlF1KG4sNCkpKyItIitRdSh0LmdldFVUQ01vbnRoKCkrMSwyKSsiLSIrUXUodC5nZXRVVENEYXRlKCksMikrKG8/IlQiK1F1KGUsMikrIjoiK1F1KHIsMikrIjoiK1F1KGksMikrIi4iK1F1KG8sMykrIloiOmk/IlQiK1F1KGUsMikrIjoiK1F1KHIsMikrIjoiK1F1KGksMikrIloiOnJ8fGU/IlQiK1F1KGUsMikrIjoiK1F1KHIsMikrIloiOiIiKX1mdW5jdGlvbiB0Yyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsYz1vPD0wLGY9ITE7ZnVuY3Rpb24gcygpe2lmKGMpcmV0dXJuIFh1O2lmKGYpcmV0dXJuIGY9ITEsSHU7dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09R3Upe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUd1fHx0LmNoYXJDb2RlQXQoKythKT09PUd1Oyk7cmV0dXJuKG49YSk+PW8/Yz0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1WdT9mPSEwOnI9PT1XdSYmKGY9ITAsdC5jaGFyQ29kZUF0KGEpPT09VnUmJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVZ1KWY9ITA7ZWxzZSBpZihyPT09V3UpZj0hMCx0LmNoYXJDb2RlQXQoYSk9PT1WdSYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gYz0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VnUmJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PVd1JiYtLW87KHI9cygpKSE9PVh1Oyl7Zm9yKHZhciBsPVtdO3IhPT1IdSYmciE9PVh1OylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuLGUpe3JldHVybiBuLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gYShuW3RdKX0pKS5qb2luKHQpfSkpfWZ1bmN0aW9uIG8obil7cmV0dXJuIG4ubWFwKGEpLmpvaW4odCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbnVsbD09dD8iIjp0IGluc3RhbmNlb2YgRGF0ZT9KdSh0KTpuLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odCxuKXt2YXIgZSxpLG89cih0LChmdW5jdGlvbih0LHIpe2lmKGUpcmV0dXJuIGUodCxyLTEpO2k9dCxlPW4/ZnVuY3Rpb24odCxuKXt2YXIgZT1adSh0KTtyZXR1cm4gZnVuY3Rpb24ocixpKXtyZXR1cm4gbihlKHIpLGksdCl9fSh0LG4pOlp1KHQpfSkpO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPUt1KG4pKSxbZS5tYXAoYSkuam9pbih0KV0uY29uY2F0KGkobixlKSkuam9pbigiXG4iKX0sZm9ybWF0Qm9keTpmdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uJiYobj1LdSh0KSksaSh0LG4pLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKG8pLmpvaW4oIlxuIil9LGZvcm1hdFJvdzpvLGZvcm1hdFZhbHVlOmF9fXZhciBuYz10YygiLCIpLGVjPW5jLnBhcnNlLHJjPW5jLnBhcnNlUm93cyxpYz1uYy5mb3JtYXQsb2M9bmMuZm9ybWF0Qm9keSxhYz1uYy5mb3JtYXRSb3dzLHVjPW5jLmZvcm1hdFJvdyxjYz1uYy5mb3JtYXRWYWx1ZSxmYz10YygiXHQiKSxzYz1mYy5wYXJzZSxsYz1mYy5wYXJzZVJvd3MsaGM9ZmMuZm9ybWF0LGRjPWZjLmZvcm1hdEJvZHkscGM9ZmMuZm9ybWF0Um93cyxnYz1mYy5mb3JtYXRSb3cseWM9ZmMuZm9ybWF0VmFsdWU7Y29uc3QgdmM9bmV3IERhdGUoIjIwMTktMDEtMDFUMDA6MDAiKS5nZXRIb3VycygpfHxuZXcgRGF0ZSgiMjAxOS0wNy0wMVQwMDowMCIpLmdldEhvdXJzKCk7ZnVuY3Rpb24gX2ModCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmJsb2IoKX1mdW5jdGlvbiBiYyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQuYXJyYXlCdWZmZXIoKX1mdW5jdGlvbiBtYyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7cmV0dXJuIHQudGV4dCgpfWZ1bmN0aW9uIHhjKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihtYyl9ZnVuY3Rpb24gd2ModCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9dm9pZCAwKSx4YyhuLGUpLnRoZW4oKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KSl9fXZhciBNYz13YyhlYyksVGM9d2Moc2MpO2Z1bmN0aW9uIEFjKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtpZigyMDQhPT10LnN0YXR1cyYmMjA1IT09dC5zdGF0dXMpcmV0dXJuIHQuanNvbigpfWZ1bmN0aW9uIFNjKHQpe3JldHVybihuLGUpPT54YyhuLGUpLnRoZW4oKG49PihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KSkpfXZhciBFYz1TYygiYXBwbGljYXRpb24veG1sIiksTmM9U2MoInRleHQvaHRtbCIpLGtjPVNjKCJpbWFnZS9zdmcreG1sIik7ZnVuY3Rpb24gQ2ModCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sYSx1LGMsZixzLGwsaCxkPXQuX3Jvb3QscD17ZGF0YTpyfSxnPXQuX3gwLHk9dC5feTAsdj10Ll94MSxfPXQuX3kxO2lmKCFkKXJldHVybiB0Ll9yb290PXAsdDtmb3IoO2QubGVuZ3RoOylpZigoZj1uPj0obz0oZyt2KS8yKSk/Zz1vOnY9bywocz1lPj0oYT0oeStfKS8yKSk/eT1hOl89YSxpPWQsIShkPWRbbD1zPDwxfGZdKSlyZXR1cm4gaVtsXT1wLHQ7aWYodT0rdC5feC5jYWxsKG51bGwsZC5kYXRhKSxjPSt0Ll95LmNhbGwobnVsbCxkLmRhdGEpLG49PT11JiZlPT09YylyZXR1cm4gcC5uZXh0PWQsaT9pW2xdPXA6dC5fcm9vdD1wLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChmPW4+PShvPShnK3YpLzIpKT9nPW86dj1vLChzPWU+PShhPSh5K18pLzIpKT95PWE6Xz1hfXdoaWxlKChsPXM8PDF8Zik9PShoPShjPj1hKTw8MXx1Pj1vKSk7cmV0dXJuIGlbaF09ZCxpW2xdPXAsdH1mdW5jdGlvbiBQYyh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiB6Yyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiAkYyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBEYyh0LG4sZSl7dmFyIHI9bmV3IFJjKG51bGw9PW4/emM6bixudWxsPT1lPyRjOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIFJjKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gRmModCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufXZhciBxYz1EYy5wcm90b3R5cGU9UmMucHJvdG90eXBlO2Z1bmN0aW9uIFVjKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBJYyh0KXtyZXR1cm4gMWUtNioodCgpLS41KX1mdW5jdGlvbiBPYyh0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gQmModCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIFljKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIExjKHQsbil7dmFyIGU9dC5nZXQobik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJub2RlIG5vdCBmb3VuZDogIituKTtyZXR1cm4gZX1xYy5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsbixlPW5ldyBSYyh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLHI9dGhpcy5fcm9vdDtpZighcilyZXR1cm4gZTtpZighci5sZW5ndGgpcmV0dXJuIGUuX3Jvb3Q9RmMociksZTtmb3IodD1be3NvdXJjZTpyLHRhcmdldDplLl9yb290PW5ldyBBcnJheSg0KX1dO3I9dC5wb3AoKTspZm9yKHZhciBpPTA7aTw0OysraSkobj1yLnNvdXJjZVtpXSkmJihuLmxlbmd0aD90LnB1c2goe3NvdXJjZTpuLHRhcmdldDpyLnRhcmdldFtpXT1uZXcgQXJyYXkoNCl9KTpyLnRhcmdldFtpXT1GYyhuKSk7cmV0dXJuIGV9LHFjLmFkZD1mdW5jdGlvbih0KXtjb25zdCBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gQ2ModGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0scWMuYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksYz0xLzAsZj0xLzAscz0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KGFbZV09cix1W2VdPWkscjxjJiYoYz1yKSxyPnMmJihzPXIpLGk8ZiYmKGY9aSksaT5sJiYobD1pKSk7aWYoYz5zfHxmPmwpcmV0dXJuIHRoaXM7Zm9yKHRoaXMuY292ZXIoYyxmKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUNjKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxxYy5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7Zm9yKHZhciBhLHUsYz1pLWV8fDEsZj10aGlzLl9yb290O2U+dHx8dD49aXx8cj5ufHxuPj1vOylzd2l0Y2godT0objxyKTw8MXx0PGUsKGE9bmV3IEFycmF5KDQpKVt1XT1mLGY9YSxjKj0yLHUpe2Nhc2UgMDppPWUrYyxvPXIrYzticmVhaztjYXNlIDE6ZT1pLWMsbz1yK2M7YnJlYWs7Y2FzZSAyOmk9ZStjLHI9by1jO2JyZWFrO2Nhc2UgMzplPWktYyxyPW8tY310aGlzLl9yb290JiZ0aGlzLl9yb290Lmxlbmd0aCYmKHRoaXMuX3Jvb3Q9Zil9cmV0dXJuIHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpc30scWMuZGF0YT1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSkpLHR9LHFjLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0scWMuZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLGEsdSxjLGYscz10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEsZD10aGlzLl95MSxwPVtdLGc9dGhpcy5fcm9vdDtmb3IoZyYmcC5wdXNoKG5ldyBQYyhnLHMsbCxoLGQpKSxudWxsPT1lP2U9MS8wOihzPXQtZSxsPW4tZSxoPXQrZSxkPW4rZSxlKj1lKTtjPXAucG9wKCk7KWlmKCEoIShnPWMubm9kZSl8fChpPWMueDApPmh8fChvPWMueTApPmR8fChhPWMueDEpPHN8fCh1PWMueTEpPGwpKWlmKGcubGVuZ3RoKXt2YXIgeT0oaSthKS8yLHY9KG8rdSkvMjtwLnB1c2gobmV3IFBjKGdbM10seSx2LGEsdSksbmV3IFBjKGdbMl0saSx2LHksdSksbmV3IFBjKGdbMV0seSxvLGEsdiksbmV3IFBjKGdbMF0saSxvLHksdikpLChmPShuPj12KTw8MXx0Pj15KSYmKGM9cFtwLmxlbmd0aC0xXSxwW3AubGVuZ3RoLTFdPXBbcC5sZW5ndGgtMS1mXSxwW3AubGVuZ3RoLTEtZl09Yyl9ZWxzZXt2YXIgXz10LSt0aGlzLl94LmNhbGwobnVsbCxnLmRhdGEpLGI9bi0rdGhpcy5feS5jYWxsKG51bGwsZy5kYXRhKSxtPV8qXytiKmI7aWYobTxlKXt2YXIgeD1NYXRoLnNxcnQoZT1tKTtzPXQteCxsPW4teCxoPXQreCxkPW4reCxyPWcuZGF0YX19cmV0dXJuIHJ9LHFjLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKGE9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLGEsdSxjLGYscyxsLGgsZD10aGlzLl9yb290LHA9dGhpcy5feDAsZz10aGlzLl95MCx5PXRoaXMuX3gxLHY9dGhpcy5feTE7aWYoIWQpcmV0dXJuIHRoaXM7aWYoZC5sZW5ndGgpZm9yKDs7KXtpZigoZj1vPj0odT0ocCt5KS8yKSk/cD11Onk9dSwocz1hPj0oYz0oZyt2KS8yKSk/Zz1jOnY9YyxuPWQsIShkPWRbbD1zPDwxfGZdKSlyZXR1cm4gdGhpcztpZighZC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtkLmRhdGEhPT10OylpZihyPWQsIShkPWQubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9ZC5uZXh0KSYmZGVsZXRlIGQubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKGQ9blswXXx8blsxXXx8blsyXXx8blszXSkmJmQ9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFkLmxlbmd0aCYmKGU/ZVtoXT1kOnRoaXMuX3Jvb3Q9ZCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0scWMucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30scWMucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxxYy5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRveysrdH13aGlsZShuPW4ubmV4dCl9KSksdH0scWMudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sYz10aGlzLl9yb290O2ZvcihjJiZ1LnB1c2gobmV3IFBjKGMsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGM9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmMubGVuZ3RoKXt2YXIgZj0ocitvKS8yLHM9KGkrYSkvMjsoZT1jWzNdKSYmdS5wdXNoKG5ldyBQYyhlLGYscyxvLGEpKSwoZT1jWzJdKSYmdS5wdXNoKG5ldyBQYyhlLHIscyxmLGEpKSwoZT1jWzFdKSYmdS5wdXNoKG5ldyBQYyhlLGYsaSxvLHMpKSwoZT1jWzBdKSYmdS5wdXNoKG5ldyBQYyhlLHIsaSxmLHMpKX1yZXR1cm4gdGhpc30scWMudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgUGModGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxjPW4ueDEsZj1uLnkxLHM9KGErYykvMixsPSh1K2YpLzI7KG89aVswXSkmJmUucHVzaChuZXcgUGMobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgUGMobyxzLHUsYyxsKSksKG89aVsyXSkmJmUucHVzaChuZXcgUGMobyxhLGwscyxmKSksKG89aVszXSkmJmUucHVzaChuZXcgUGMobyxzLGwsYyxmKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30scWMueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LHFjLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTtjb25zdCBqYz0xNjY0NTI1LEhjPTEwMTM5MDQyMjMsWGM9NDI5NDk2NzI5NjtmdW5jdGlvbiBHYyh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIFZjKHQpe3JldHVybiB0Lnl9dmFyIFdjPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBaYyh0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX1mdW5jdGlvbiBLYyh0KXtyZXR1cm4odD1aYyhNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciBRYyxKYz0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiB0Zih0KXtpZighKG49SmMuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgbjtyZXR1cm4gbmV3IG5mKHtmaWxsOm5bMV0sYWxpZ246blsyXSxzaWduOm5bM10sc3ltYm9sOm5bNF0semVybzpuWzVdLHdpZHRoOm5bNl0sY29tbWE6bls3XSxwcmVjaXNpb246bls4XSYmbls4XS5zbGljZSgxKSx0cmltOm5bOV0sdHlwZTpuWzEwXX0pfWZ1bmN0aW9uIG5mKHQpe3RoaXMuZmlsbD12b2lkIDA9PT10LmZpbGw/IiAiOnQuZmlsbCsiIix0aGlzLmFsaWduPXZvaWQgMD09PXQuYWxpZ24/Ij4iOnQuYWxpZ24rIiIsdGhpcy5zaWduPXZvaWQgMD09PXQuc2lnbj8iLSI6dC5zaWduKyIiLHRoaXMuc3ltYm9sPXZvaWQgMD09PXQuc3ltYm9sPyIiOnQuc3ltYm9sKyIiLHRoaXMuemVybz0hIXQuemVybyx0aGlzLndpZHRoPXZvaWQgMD09PXQud2lkdGg/dm9pZCAwOit0LndpZHRoLHRoaXMuY29tbWE9ISF0LmNvbW1hLHRoaXMucHJlY2lzaW9uPXZvaWQgMD09PXQucHJlY2lzaW9uP3ZvaWQgMDordC5wcmVjaXNpb24sdGhpcy50cmltPSEhdC50cmltLHRoaXMudHlwZT12b2lkIDA9PT10LnR5cGU/IiI6dC50eXBlKyIifWZ1bmN0aW9uIGVmKHQsbil7dmFyIGU9WmModCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrcjpyLmxlbmd0aD5pKzE/ci5zbGljZSgwLGkrMSkrIi4iK3Iuc2xpY2UoaSsxKTpyK25ldyBBcnJheShpLXIubGVuZ3RoKzIpLmpvaW4oIjAiKX10Zi5wcm90b3R5cGU9bmYucHJvdG90eXBlLG5mLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciByZj17IiUiOih0LG4pPT4oMTAwKnQpLnRvRml4ZWQobiksYjp0PT5NYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpLGM6dD0+dCsiIixkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0PU1hdGgucm91bmQodCkpPj0xZTIxP3QudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTp0LnRvU3RyaW5nKDEwKX0sZToodCxuKT0+dC50b0V4cG9uZW50aWFsKG4pLGY6KHQsbik9PnQudG9GaXhlZChuKSxnOih0LG4pPT50LnRvUHJlY2lzaW9uKG4pLG86dD0+TWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KSxwOih0LG4pPT5lZigxMDAqdCxuKSxyOmVmLHM6ZnVuY3Rpb24odCxuKXt2YXIgZT1aYyh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdLG89aS0oUWM9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLGE9ci5sZW5ndGg7cmV0dXJuIG89PT1hP3I6bz5hP3IrbmV3IEFycmF5KG8tYSsxKS5qb2luKCIwIik6bz4wP3Iuc2xpY2UoMCxvKSsiLiIrci5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStaYyh0LE1hdGgubWF4KDAsbitvLTEpKVswXX0sWDp0PT5NYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLHg6dD0+TWF0aC5yb3VuZCh0KS50b1N0cmluZygxNil9O2Z1bmN0aW9uIG9mKHQpe3JldHVybiB0fXZhciBhZix1Zj1BcnJheS5wcm90b3R5cGUubWFwLGNmPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBmZih0KXt2YXIgbixlLHI9dm9pZCAwPT09dC5ncm91cGluZ3x8dm9pZCAwPT09dC50aG91c2FuZHM/b2Y6KG49dWYuY2FsbCh0Lmdyb3VwaW5nLE51bWJlciksZT10LnRob3VzYW5kcysiIixmdW5jdGlvbih0LHIpe2Zvcih2YXIgaT10Lmxlbmd0aCxvPVtdLGE9MCx1PW5bMF0sYz0wO2k+MCYmdT4wJiYoYyt1KzE+ciYmKHU9TWF0aC5tYXgoMSxyLWMpKSxvLnB1c2godC5zdWJzdHJpbmcoaS09dSxpK3UpKSwhKChjKz11KzEpPnIpKTspdT1uW2E9KGErMSklbi5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfSksaT12b2lkIDA9PT10LmN1cnJlbmN5PyIiOnQuY3VycmVuY3lbMF0rIiIsbz12b2lkIDA9PT10LmN1cnJlbmN5PyIiOnQuY3VycmVuY3lbMV0rIiIsYT12b2lkIDA9PT10LmRlY2ltYWw/Ii4iOnQuZGVjaW1hbCsiIix1PXZvaWQgMD09PXQubnVtZXJhbHM/b2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pKX19KHVmLmNhbGwodC5udW1lcmFscyxTdHJpbmcpKSxjPXZvaWQgMD09PXQucGVyY2VudD8iJSI6dC5wZXJjZW50KyIiLGY9dm9pZCAwPT09dC5taW51cz8i4oiSIjp0Lm1pbnVzKyIiLHM9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gbCh0KXt2YXIgbj0odD10Zih0KSkuZmlsbCxlPXQuYWxpZ24sbD10LnNpZ24saD10LnN5bWJvbCxkPXQuemVybyxwPXQud2lkdGgsZz10LmNvbW1hLHk9dC5wcmVjaXNpb24sdj10LnRyaW0sXz10LnR5cGU7Im4iPT09Xz8oZz0hMCxfPSJnIik6cmZbX118fCh2b2lkIDA9PT15JiYoeT0xMiksdj0hMCxfPSJnIiksKGR8fCIwIj09PW4mJiI9Ij09PWUpJiYoZD0hMCxuPSIwIixlPSI9Iik7dmFyIGI9IiQiPT09aD9pOiIjIj09PWgmJi9bYm94WF0vLnRlc3QoXyk/IjAiK18udG9Mb3dlckNhc2UoKToiIixtPSIkIj09PWg/bzovWyVwXS8udGVzdChfKT9jOiIiLHg9cmZbX10sdz0vW2RlZmdwcnMlXS8udGVzdChfKTtmdW5jdGlvbiBNKHQpe3ZhciBpLG8sYyxoPWIsTT1tO2lmKCJjIj09PV8pTT14KHQpK00sdD0iIjtlbHNle3ZhciBUPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP3M6eChNYXRoLmFicyh0KSx5KSx2JiYodD1mdW5jdGlvbih0KXt0OmZvcih2YXIgbixlPXQubGVuZ3RoLHI9MSxpPS0xO3I8ZTsrK3Ipc3dpdGNoKHRbcl0pe2Nhc2UiLiI6aT1uPXI7YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9ciksbj1yO2JyZWFrO2RlZmF1bHQ6aWYoISt0W3JdKWJyZWFrIHQ7aT4wJiYoaT0wKX1yZXR1cm4gaT4wP3Quc2xpY2UoMCxpKSt0LnNsaWNlKG4rMSk6dH0odCkpLFQmJjA9PSt0JiYiKyIhPT1sJiYoVD0hMSksaD0oVD8iKCI9PT1sP2w6ZjoiLSI9PT1sfHwiKCI9PT1sPyIiOmwpK2gsTT0oInMiPT09Xz9jZls4K1FjLzNdOiIiKStNKyhUJiYiKCI9PT1sPyIpIjoiIiksdylmb3IoaT0tMSxvPXQubGVuZ3RoOysraTxvOylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXtNPSg0Nj09PWM/YSt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkrTSx0PXQuc2xpY2UoMCxpKTticmVha319ZyYmIWQmJih0PXIodCwxLzApKTt2YXIgQT1oLmxlbmd0aCt0Lmxlbmd0aCtNLmxlbmd0aCxTPUE8cD9uZXcgQXJyYXkocC1BKzEpLmpvaW4obik6IiI7c3dpdGNoKGcmJmQmJih0PXIoUyt0LFMubGVuZ3RoP3AtTS5sZW5ndGg6MS8wKSxTPSIiKSxlKXtjYXNlIjwiOnQ9aCt0K00rUzticmVhaztjYXNlIj0iOnQ9aCtTK3QrTTticmVhaztjYXNlIl4iOnQ9Uy5zbGljZSgwLEE9Uy5sZW5ndGg+PjEpK2grdCtNK1Muc2xpY2UoQSk7YnJlYWs7ZGVmYXVsdDp0PVMraCt0K019cmV0dXJuIHUodCl9cmV0dXJuIHk9dm9pZCAwPT09eT82Oi9bZ3Byc10vLnRlc3QoXyk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSx5KSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCx5KSksTS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxNfXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1sKCgodD10Zih0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoS2MobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPWNmWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIHNmKG4pe3JldHVybiBhZj1mZihuKSx0LmZvcm1hdD1hZi5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9YWYuZm9ybWF0UHJlZml4LGFmfWZ1bmN0aW9uIGxmKHQpe3JldHVybiBNYXRoLm1heCgwLC1LYyhNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGhmKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoS2MobikvMykpKS1LYyhNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGRmKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsS2MobiktS2ModCkpKzF9dC5mb3JtYXQ9dm9pZCAwLHQuZm9ybWF0UHJlZml4PXZvaWQgMCxzZih7dGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl19KTt2YXIgcGY9MWUtNixnZj0xZS0xMix5Zj1NYXRoLlBJLHZmPXlmLzIsX2Y9eWYvNCxiZj0yKnlmLG1mPTE4MC95Zix4Zj15Zi8xODAsd2Y9TWF0aC5hYnMsTWY9TWF0aC5hdGFuLFRmPU1hdGguYXRhbjIsQWY9TWF0aC5jb3MsU2Y9TWF0aC5jZWlsLEVmPU1hdGguZXhwLE5mPU1hdGguaHlwb3Qsa2Y9TWF0aC5sb2csQ2Y9TWF0aC5wb3csUGY9TWF0aC5zaW4semY9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LCRmPU1hdGguc3FydCxEZj1NYXRoLnRhbjtmdW5jdGlvbiBSZih0KXtyZXR1cm4gdD4xPzA6dDwtMT95ZjpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gRmYodCl7cmV0dXJuIHQ+MT92Zjp0PC0xPy12ZjpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gcWYodCl7cmV0dXJuKHQ9UGYodC8yKSkqdH1mdW5jdGlvbiBVZigpe31mdW5jdGlvbiBJZih0LG4pe3QmJkJmLmhhc093blByb3BlcnR5KHQudHlwZSkmJkJmW3QudHlwZV0odCxuKX12YXIgT2Y9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtJZih0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspSWYoZVtyXS5nZW9tZXRyeSxuKX19LEJmPXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7WWYodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KVlmKGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe0xmKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspTGYoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KUlmKGVbcl0sbil9fTtmdW5jdGlvbiBZZih0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBMZih0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KVlmKHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBqZih0LG4pe3QmJk9mLmhhc093blByb3BlcnR5KHQudHlwZSk/T2ZbdC50eXBlXSh0LG4pOklmKHQsbil9dmFyIEhmLFhmLEdmLFZmLFdmLFpmLEtmLFFmLEpmLHRzLG5zLGVzLHJzLGlzLG9zLGFzLHVzPW5ldyBBLGNzPW5ldyBBLGZzPXtwb2ludDpVZixsaW5lU3RhcnQ6VWYsbGluZUVuZDpVZixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt1cz1uZXcgQSxmcy5saW5lU3RhcnQ9c3MsZnMubGluZUVuZD1sc30scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PSt1cztjcy5hZGQodDwwP2JmK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9VWZ9LHNwaGVyZTpmdW5jdGlvbigpe2NzLmFkZChiZil9fTtmdW5jdGlvbiBzcygpe2ZzLnBvaW50PWhzfWZ1bmN0aW9uIGxzKCl7ZHMoSGYsWGYpfWZ1bmN0aW9uIGhzKHQsbil7ZnMucG9pbnQ9ZHMsSGY9dCxYZj1uLEdmPXQqPXhmLFZmPUFmKG49KG4qPXhmKS8yK19mKSxXZj1QZihuKX1mdW5jdGlvbiBkcyh0LG4pe3ZhciBlPSh0Kj14ZiktR2Yscj1lPj0wPzE6LTEsaT1yKmUsbz1BZihuPShuKj14ZikvMitfZiksYT1QZihuKSx1PVdmKmEsYz1WZipvK3UqQWYoaSksZj11KnIqUGYoaSk7dXMuYWRkKFRmKGYsYykpLEdmPXQsVmY9byxXZj1hfWZ1bmN0aW9uIHBzKHQpe3JldHVybltUZih0WzFdLHRbMF0pLEZmKHRbMl0pXX1mdW5jdGlvbiBncyh0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUFmKGUpO3JldHVybltyKkFmKG4pLHIqUGYobiksUGYoZSldfWZ1bmN0aW9uIHlzKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIHZzKHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBfcyh0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIGJzKHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBtcyh0KXt2YXIgbj0kZih0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59dmFyIHhzLHdzLE1zLFRzLEFzLFNzLEVzLE5zLGtzLENzLFBzLHpzLCRzLERzLFJzLEZzLHFzPXtwb2ludDpVcyxsaW5lU3RhcnQ6T3MsbGluZUVuZDpCcyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtxcy5wb2ludD1Zcyxxcy5saW5lU3RhcnQ9THMscXMubGluZUVuZD1qcyxpcz1uZXcgQSxmcy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2ZzLnBvbHlnb25FbmQoKSxxcy5wb2ludD1Vcyxxcy5saW5lU3RhcnQ9T3MscXMubGluZUVuZD1Ccyx1czwwPyhaZj0tKFFmPTE4MCksS2Y9LShKZj05MCkpOmlzPnBmP0pmPTkwOmlzPC1wZiYmKEtmPS05MCksYXNbMF09WmYsYXNbMV09UWZ9LHNwaGVyZTpmdW5jdGlvbigpe1pmPS0oUWY9MTgwKSxLZj0tKEpmPTkwKX19O2Z1bmN0aW9uIFVzKHQsbil7b3MucHVzaChhcz1bWmY9dCxRZj10XSksbjxLZiYmKEtmPW4pLG4+SmYmJihKZj1uKX1mdW5jdGlvbiBJcyh0LG4pe3ZhciBlPWdzKFt0KnhmLG4qeGZdKTtpZihycyl7dmFyIHI9dnMocnMsZSksaT12cyhbclsxXSwtclswXSwwXSxyKTttcyhpKSxpPXBzKGkpO3ZhciBvLGE9dC10cyx1PWE+MD8xOi0xLGM9aVswXSptZip1LGY9d2YoYSk+MTgwO2ZeKHUqdHM8YyYmYzx1KnQpPyhvPWlbMV0qbWYpPkpmJiYoSmY9byk6Zl4odSp0czwoYz0oYyszNjApJTM2MC0xODApJiZjPHUqdCk/KG89LWlbMV0qbWYpPEtmJiYoS2Y9byk6KG48S2YmJihLZj1uKSxuPkpmJiYoSmY9bikpLGY/dDx0cz9IcyhaZix0KT5IcyhaZixRZikmJihRZj10KTpIcyh0LFFmKT5IcyhaZixRZikmJihaZj10KTpRZj49WmY/KHQ8WmYmJihaZj10KSx0PlFmJiYoUWY9dCkpOnQ+dHM/SHMoWmYsdCk+SHMoWmYsUWYpJiYoUWY9dCk6SHModCxRZik+SHMoWmYsUWYpJiYoWmY9dCl9ZWxzZSBvcy5wdXNoKGFzPVtaZj10LFFmPXRdKTtuPEtmJiYoS2Y9biksbj5KZiYmKEpmPW4pLHJzPWUsdHM9dH1mdW5jdGlvbiBPcygpe3FzLnBvaW50PUlzfWZ1bmN0aW9uIEJzKCl7YXNbMF09WmYsYXNbMV09UWYscXMucG9pbnQ9VXMscnM9bnVsbH1mdW5jdGlvbiBZcyh0LG4pe2lmKHJzKXt2YXIgZT10LXRzO2lzLmFkZCh3ZihlKT4xODA/ZSsoZT4wPzM2MDotMzYwKTplKX1lbHNlIG5zPXQsZXM9bjtmcy5wb2ludCh0LG4pLElzKHQsbil9ZnVuY3Rpb24gTHMoKXtmcy5saW5lU3RhcnQoKX1mdW5jdGlvbiBqcygpe1lzKG5zLGVzKSxmcy5saW5lRW5kKCksd2YoaXMpPnBmJiYoWmY9LShRZj0xODApKSxhc1swXT1aZixhc1sxXT1RZixycz1udWxsfWZ1bmN0aW9uIEhzKHQsbil7cmV0dXJuKG4tPXQpPDA/biszNjA6bn1mdW5jdGlvbiBYcyh0LG4pe3JldHVybiB0WzBdLW5bMF19ZnVuY3Rpb24gR3ModCxuKXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBWcz17c3BoZXJlOlVmLHBvaW50OldzLGxpbmVTdGFydDpLcyxsaW5lRW5kOnRsLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1ZzLmxpbmVTdGFydD1ubCxWcy5saW5lRW5kPWVsfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7VnMubGluZVN0YXJ0PUtzLFZzLmxpbmVFbmQ9dGx9fTtmdW5jdGlvbiBXcyh0LG4pe3QqPXhmO3ZhciBlPUFmKG4qPXhmKTtacyhlKkFmKHQpLGUqUGYodCksUGYobikpfWZ1bmN0aW9uIFpzKHQsbixlKXsrK3hzLE1zKz0odC1NcykveHMsVHMrPShuLVRzKS94cyxBcys9KGUtQXMpL3hzfWZ1bmN0aW9uIEtzKCl7VnMucG9pbnQ9UXN9ZnVuY3Rpb24gUXModCxuKXt0Kj14Zjt2YXIgZT1BZihuKj14Zik7RHM9ZSpBZih0KSxScz1lKlBmKHQpLEZzPVBmKG4pLFZzLnBvaW50PUpzLFpzKERzLFJzLEZzKX1mdW5jdGlvbiBKcyh0LG4pe3QqPXhmO3ZhciBlPUFmKG4qPXhmKSxyPWUqQWYodCksaT1lKlBmKHQpLG89UGYobiksYT1UZigkZigoYT1ScypvLUZzKmkpKmErKGE9RnMqci1EcypvKSphKyhhPURzKmktUnMqcikqYSksRHMqcitScyppK0ZzKm8pO3dzKz1hLFNzKz1hKihEcysoRHM9cikpLEVzKz1hKihScysoUnM9aSkpLE5zKz1hKihGcysoRnM9bykpLFpzKERzLFJzLEZzKX1mdW5jdGlvbiB0bCgpe1ZzLnBvaW50PVdzfWZ1bmN0aW9uIG5sKCl7VnMucG9pbnQ9cmx9ZnVuY3Rpb24gZWwoKXtpbCh6cywkcyksVnMucG9pbnQ9V3N9ZnVuY3Rpb24gcmwodCxuKXt6cz10LCRzPW4sdCo9eGYsbio9eGYsVnMucG9pbnQ9aWw7dmFyIGU9QWYobik7RHM9ZSpBZih0KSxScz1lKlBmKHQpLEZzPVBmKG4pLFpzKERzLFJzLEZzKX1mdW5jdGlvbiBpbCh0LG4pe3QqPXhmO3ZhciBlPUFmKG4qPXhmKSxyPWUqQWYodCksaT1lKlBmKHQpLG89UGYobiksYT1ScypvLUZzKmksdT1GcypyLURzKm8sYz1EcyppLVJzKnIsZj1OZihhLHUsYykscz1GZihmKSxsPWYmJi1zL2Y7a3MuYWRkKGwqYSksQ3MuYWRkKGwqdSksUHMuYWRkKGwqYyksd3MrPXMsU3MrPXMqKERzKyhEcz1yKSksRXMrPXMqKFJzKyhScz1pKSksTnMrPXMqKEZzKyhGcz1vKSksWnMoRHMsUnMsRnMpfWZ1bmN0aW9uIG9sKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBhbCh0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybihlPW4uaW52ZXJ0KGUscikpJiZ0LmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiB1bCh0LG4pe3JldHVybiB3Zih0KT55ZiYmKHQtPU1hdGgucm91bmQodC9iZikqYmYpLFt0LG5dfWZ1bmN0aW9uIGNsKHQsbixlKXtyZXR1cm4odCU9YmYpP258fGU/YWwoc2wodCksbGwobixlKSk6c2wodCk6bnx8ZT9sbChuLGUpOnVsfWZ1bmN0aW9uIGZsKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB3ZihuKz10KT55ZiYmKG4tPU1hdGgucm91bmQobi9iZikqYmYpLFtuLGVdfX1mdW5jdGlvbiBzbCh0KXt2YXIgbj1mbCh0KTtyZXR1cm4gbi5pbnZlcnQ9ZmwoLXQpLG59ZnVuY3Rpb24gbGwodCxuKXt2YXIgZT1BZih0KSxyPVBmKHQpLGk9QWYobiksbz1QZihuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9QWYobiksdT1BZih0KSphLGM9UGYodCkqYSxmPVBmKG4pLHM9ZiplK3UqcjtyZXR1cm5bVGYoYyppLXMqbyx1KmUtZipyKSxGZihzKmkrYypvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9QWYobiksdT1BZih0KSphLGM9UGYodCkqYSxmPVBmKG4pLHM9ZippLWMqbztyZXR1cm5bVGYoYyppK2Yqbyx1KmUrcypyKSxGZihzKmUtdSpyKV19LGF9ZnVuY3Rpb24gaGwodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qeGYsblsxXSp4ZikpWzBdKj1tZixuWzFdKj1tZixufXJldHVybiB0PWNsKHRbMF0qeGYsdFsxXSp4Zix0Lmxlbmd0aD4yP3RbMl0qeGY6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSp4ZixuWzFdKnhmKSlbMF0qPW1mLG5bMV0qPW1mLG59LG59ZnVuY3Rpb24gZGwodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUFmKG4pLHU9UGYobiksYz1yKmU7bnVsbD09aT8oaT1uK3IqYmYsbz1uLWMvMik6KGk9cGwoYSxpKSxvPXBsKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqYmYpKTtmb3IodmFyIGYscz1pO3I+MD9zPm86czxvO3MtPWMpZj1wcyhbYSwtdSpBZihzKSwtdSpQZihzKV0pLHQucG9pbnQoZlswXSxmWzFdKX19ZnVuY3Rpb24gcGwodCxuKXsobj1ncyhuKSlbMF0tPXQsbXMobik7dmFyIGU9UmYoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStiZi1wZiklYmZ9ZnVuY3Rpb24gZ2woKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUscil7dC5wdXNoKFtuLGUscl0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6VWYscmVqb2luOmZ1bmN0aW9uKCl7bi5sZW5ndGg+MSYmbi5wdXNoKG4ucG9wKCkuY29uY2F0KG4uc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgZT1uO3JldHVybiBuPVtdLHQ9bnVsbCxlfX19ZnVuY3Rpb24geWwodCxuKXtyZXR1cm4gd2YodFswXS1uWzBdKTxwZiYmd2YodFsxXS1uWzFdKTxwZn1mdW5jdGlvbiB2bCh0LG4sZSxyKXt0aGlzLng9dCx0aGlzLno9bix0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIF9sKHQsbixlLHIsaSl7dmFyIG8sYSx1PVtdLGM9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sYT10W25dO2lmKHlsKHIsYSkpe2lmKCFyWzJdJiYhYVsyXSl7Zm9yKGkubGluZVN0YXJ0KCksbz0wO288bjsrK28paS5wb2ludCgocj10W29dKVswXSxyWzFdKTtyZXR1cm4gdm9pZCBpLmxpbmVFbmQoKX1hWzBdKz0yKnBmfXUucHVzaChlPW5ldyB2bChyLHQsbnVsbCwhMCkpLGMucHVzaChlLm89bmV3IHZsKHIsbnVsbCxlLCExKSksdS5wdXNoKGU9bmV3IHZsKGEsdCxudWxsLCExKSksYy5wdXNoKGUubz1uZXcgdmwoYSxudWxsLGUsITApKX19KSksdS5sZW5ndGgpe2ZvcihjLnNvcnQobiksYmwodSksYmwoYyksbz0wLGE9Yy5sZW5ndGg7bzxhOysrbyljW29dLmU9ZT0hZTtmb3IodmFyIGYscyxsPXVbMF07Oyl7Zm9yKHZhciBoPWwsZD0hMDtoLnY7KWlmKChoPWgubik9PT1sKXJldHVybjtmPWgueixpLmxpbmVTdGFydCgpO2Rve2lmKGgudj1oLm8udj0hMCxoLmUpe2lmKGQpZm9yKG89MCxhPWYubGVuZ3RoO288YTsrK28paS5wb2ludCgocz1mW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgubi54LDEsaSk7aD1oLm59ZWxzZXtpZihkKWZvcihmPWgucC56LG89Zi5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KChzPWZbb10pWzBdLHNbMV0pO2Vsc2UgcihoLngsaC5wLngsLTEsaSk7aD1oLnB9Zj0oaD1oLm8pLnosZD0hZH13aGlsZSghaC52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIGJsKHQpe2lmKG49dC5sZW5ndGgpe2Zvcih2YXIgbixlLHI9MCxpPXRbMF07KytyPG47KWkubj1lPXRbcl0sZS5wPWksaT1lO2kubj1lPXRbMF0sZS5wPWl9fWZ1bmN0aW9uIG1sKHQpe3JldHVybiB3Zih0WzBdKTw9eWY/dFswXTp6Zih0WzBdKSooKHdmKHRbMF0pK3lmKSViZi15Zil9ZnVuY3Rpb24geGwodCxuKXt2YXIgZT1tbChuKSxyPW5bMV0saT1QZihyKSxvPVtQZihlKSwtQWYoZSksMF0sYT0wLHU9MCxjPW5ldyBBOzE9PT1pP3I9dmYrcGY6LTE9PT1pJiYocj0tdmYtcGYpO2Zvcih2YXIgZj0wLHM9dC5sZW5ndGg7ZjxzOysrZilpZihoPShsPXRbZl0pLmxlbmd0aClmb3IodmFyIGwsaCxkPWxbaC0xXSxwPW1sKGQpLGc9ZFsxXS8yK19mLHk9UGYoZyksdj1BZihnKSxfPTA7XzxoOysrXyxwPW0seT13LHY9TSxkPWIpe3ZhciBiPWxbX10sbT1tbChiKSx4PWJbMV0vMitfZix3PVBmKHgpLE09QWYoeCksVD1tLXAsUz1UPj0wPzE6LTEsRT1TKlQsTj1FPnlmLGs9eSp3O2lmKGMuYWRkKFRmKGsqUypQZihFKSx2Kk0raypBZihFKSkpLGErPU4/VCtTKmJmOlQsTl5wPj1lXm0+PWUpe3ZhciBDPXZzKGdzKGQpLGdzKGIpKTttcyhDKTt2YXIgUD12cyhvLEMpO21zKFApO3ZhciB6PShOXlQ+PTA/LTE6MSkqRmYoUFsyXSk7KHI+enx8cj09PXomJihDWzBdfHxDWzFdKSkmJih1Kz1OXlQ+PTA/MTotMSl9fXJldHVybihhPC1wZnx8YTxwZiYmYzwtZ2YpXjEmdX1mdW5jdGlvbiB3bCh0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG8sYSx1LGM9bihpKSxmPWdsKCkscz1uKGYpLGw9ITEsaD17cG9pbnQ6ZCxsaW5lU3RhcnQ6ZyxsaW5lRW5kOnkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7aC5wb2ludD12LGgubGluZVN0YXJ0PV8saC5saW5lRW5kPWIsYT1bXSxvPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7aC5wb2ludD1kLGgubGluZVN0YXJ0PWcsaC5saW5lRW5kPXksYT1zdChhKTt2YXIgdD14bChvLHIpO2EubGVuZ3RoPyhsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxfbChhLFRsLHQsZSxpKSk6dCYmKGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksbCYmKGkucG9seWdvbkVuZCgpLGw9ITEpLGE9bz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19O2Z1bmN0aW9uIGQobixlKXt0KG4sZSkmJmkucG9pbnQobixlKX1mdW5jdGlvbiBwKHQsbil7Yy5wb2ludCh0LG4pfWZ1bmN0aW9uIGcoKXtoLnBvaW50PXAsYy5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KCl7aC5wb2ludD1kLGMubGluZUVuZCgpfWZ1bmN0aW9uIHYodCxuKXt1LnB1c2goW3Qsbl0pLHMucG9pbnQodCxuKX1mdW5jdGlvbiBfKCl7cy5saW5lU3RhcnQoKSx1PVtdfWZ1bmN0aW9uIGIoKXt2KHVbMF1bMF0sdVswXVsxXSkscy5saW5lRW5kKCk7dmFyIHQsbixlLHIsYz1zLmNsZWFuKCksaD1mLnJlc3VsdCgpLGQ9aC5sZW5ndGg7aWYodS5wb3AoKSxvLnB1c2godSksdT1udWxsLGQpaWYoMSZjKXtpZigobj0oZT1oWzBdKS5sZW5ndGgtMSk+MCl7Zm9yKGx8fChpLnBvbHlnb25TdGFydCgpLGw9ITApLGkubGluZVN0YXJ0KCksdD0wO3Q8bjsrK3QpaS5wb2ludCgocj1lW3RdKVswXSxyWzFdKTtpLmxpbmVFbmQoKX19ZWxzZSBkPjEmJjImYyYmaC5wdXNoKGgucG9wKCkuY29uY2F0KGguc2hpZnQoKSkpLGEucHVzaChoLmZpbHRlcihNbCkpfXJldHVybiBofX1mdW5jdGlvbiBNbCh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBUbCh0LG4pe3JldHVybigodD10LngpWzBdPDA/dFsxXS12Zi1wZjp2Zi10WzFdKS0oKG49bi54KVswXTwwP25bMV0tdmYtcGY6dmYtblsxXSl9dWwuaW52ZXJ0PXVsO3ZhciBBbD13bCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3lmOi15ZixjPXdmKG8tZSk7d2YoYy15Zik8cGY/KHQucG9pbnQoZSxyPShyK2EpLzI+MD92ZjotdmYpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmYz49eWYmJih3ZihlLWkpPHBmJiYoZS09aSpwZiksd2Yoby11KTxwZiYmKG8tPXUqcGYpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVBmKHQtZSk7cmV0dXJuIHdmKGEpPnBmP01mKChQZihuKSoobz1BZihyKSkqUGYoZSktUGYocikqKGk9QWYobikpKlBmKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSksKGZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpO2lmKG51bGw9PXQpaT1lKnZmLHIucG9pbnQoLXlmLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KHlmLGkpLHIucG9pbnQoeWYsMCksci5wb2ludCh5ZiwtaSksci5wb2ludCgwLC1pKSxyLnBvaW50KC15ZiwtaSksci5wb2ludCgteWYsMCksci5wb2ludCgteWYsaSk7ZWxzZSBpZih3Zih0WzBdLW5bMF0pPnBmKXt2YXIgbz10WzBdPG5bMF0/eWY6LXlmO2k9ZSpvLzIsci5wb2ludCgtbyxpKSxyLnBvaW50KDAsaSksci5wb2ludChvLGkpfWVsc2Ugci5wb2ludChuWzBdLG5bMV0pfSksWy15ZiwtdmZdKTtmdW5jdGlvbiBTbCh0KXt2YXIgbj1BZih0KSxlPTYqeGYscj1uPjAsaT13ZihuKT5wZjtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEFmKHQpKkFmKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPXZzKGdzKHQpLGdzKGUpKSxhPXlzKG8sbyksdT1vWzBdLGM9YS11KnU7aWYoIWMpcmV0dXJuIXImJnQ7dmFyIGY9biphL2Mscz0tbip1L2MsbD12cyhpLG8pLGg9YnMoaSxmKTtfcyhoLGJzKG8scykpO3ZhciBkPWwscD15cyhoLGQpLGc9eXMoZCxkKSx5PXAqcC1nKih5cyhoLGgpLTEpO2lmKCEoeTwwKSl7dmFyIHY9JGYoeSksXz1icyhkLCgtcC12KS9nKTtpZihfcyhfLGgpLF89cHMoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgVD14LW0sQT13ZihULXlmKTxwZjtpZighQSYmTTx3JiYoYj13LHc9TSxNPWIpLEF8fFQ8cGY/QT93K00+MF5fWzFdPCh3ZihfWzBdLW0pPHBmP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpUPnlmXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIFM9YnMoZCwoLXArdikvZyk7cmV0dXJuIF9zKFMsaCksW18scHMoUyldfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDp5Zi10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiB3bChvLChmdW5jdGlvbih0KXt2YXIgbixlLGMsZixzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmPWM9ITEscz0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBkLHA9W2wsaF0sZz1vKGwsaCkseT1yP2c/MDp1KGwsaCk6Zz91KGwrKGw8MD95ZjoteWYpLGgpOjA7aWYoIW4mJihmPWM9ZykmJnQubGluZVN0YXJ0KCksZyE9PWMmJighKGQ9YShuLHApKXx8eWwobixkKXx8eWwocCxkKSkmJihwWzJdPTEpLGchPT1jKXM9MCxnPyh0LmxpbmVTdGFydCgpLGQ9YShwLG4pLHQucG9pbnQoZFswXSxkWzFdKSk6KGQ9YShuLHApLHQucG9pbnQoZFswXSxkWzFdLDIpLHQubGluZUVuZCgpKSxuPWQ7ZWxzZSBpZihpJiZuJiZyXmcpe3ZhciB2O3kmZXx8ISh2PWEocCxuLCEwKSl8fChzPTAscj8odC5saW5lU3RhcnQoKSx0LnBvaW50KHZbMF1bMF0sdlswXVsxXSksdC5wb2ludCh2WzFdWzBdLHZbMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludCh2WzFdWzBdLHZbMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludCh2WzBdWzBdLHZbMF1bMV0sMykpKX0hZ3x8biYmeWwobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxjPWcsZT15fSxsaW5lRW5kOmZ1bmN0aW9uKCl7YyYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChmJiZjKTw8MX19fSksKGZ1bmN0aW9uKG4scixpLG8pe2RsKG8sdCxlLGksbixyKX0pLHI/WzAsLXRdOlsteWYsdC15Zl0pfXZhciBFbCxObCxrbCxDbCxQbD0xZTksemw9LVBsO2Z1bmN0aW9uICRsKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGYpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxjKGksbyk8MF51PjApZG97Zi5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGYucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIHdmKHJbMF0tdCk8cGY/aT4wPzA6Mzp3ZihyWzBdLWUpPHBmP2k+MD8yOjE6d2YoclsxXS1uKTxwZj9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBjKHQueCxuLngpfWZ1bmN0aW9uIGModCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjLGYscyxsLGgsZCxwLGcseSx2LF8sYj1hLG09Z2woKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxmJiZmLnB1c2gocz1bXSk7dj0hMCx5PSExLHA9Zz1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtjJiYoTShsLGgpLGQmJnkmJm0ucmVqb2luKCksYy5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcseSYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxjPVtdLGY9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Zi5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWZbZV0sYz0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07YzxzOysrYylvPWgsYT1kLGg9KGw9dVtjXSlbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGM9c3QoYykpLmxlbmd0aDsoZXx8aSkmJihhLnBvbHlnb25TdGFydCgpLGUmJihhLmxpbmVTdGFydCgpLG8obnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLGkmJl9sKGMsdSxuLG8sYSksYS5wb2x5Z29uRW5kKCkpO2I9YSxjPWY9cz1udWxsfX07ZnVuY3Rpb24gdyh0LG4pe2kodCxuKSYmYi5wb2ludCh0LG4pfWZ1bmN0aW9uIE0obyxhKXt2YXIgdT1pKG8sYSk7aWYoZiYmcy5wdXNoKFtvLGFdKSx2KWw9byxoPWEsZD11LHY9ITEsdSYmKGIubGluZVN0YXJ0KCksYi5wb2ludChvLGEpKTtlbHNlIGlmKHUmJnkpYi5wb2ludChvLGEpO2Vsc2V7dmFyIGM9W3A9TWF0aC5tYXgoemwsTWF0aC5taW4oUGwscCkpLGc9TWF0aC5tYXgoemwsTWF0aC5taW4oUGwsZykpXSxtPVtvPU1hdGgubWF4KHpsLE1hdGgubWluKFBsLG8pKSxhPU1hdGgubWF4KHpsLE1hdGgubWluKFBsLGEpKV07IWZ1bmN0aW9uKHQsbixlLHIsaSxvKXt2YXIgYSx1PXRbMF0sYz10WzFdLGY9MCxzPTEsbD1uWzBdLXUsaD1uWzFdLWM7aWYoYT1lLXUsbHx8IShhPjApKXtpZihhLz1sLGw8MCl7aWYoYTxmKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYobD4wKXtpZihhPnMpcmV0dXJuO2E+ZiYmKGY9YSl9aWYoYT1pLXUsbHx8IShhPDApKXtpZihhLz1sLGw8MCl7aWYoYT5zKXJldHVybjthPmYmJihmPWEpfWVsc2UgaWYobD4wKXtpZihhPGYpcmV0dXJuO2E8cyYmKHM9YSl9aWYoYT1yLWMsaHx8IShhPjApKXtpZihhLz1oLGg8MCl7aWYoYTxmKXJldHVybjthPHMmJihzPWEpfWVsc2UgaWYoaD4wKXtpZihhPnMpcmV0dXJuO2E+ZiYmKGY9YSl9aWYoYT1vLWMsaHx8IShhPDApKXtpZihhLz1oLGg8MCl7aWYoYT5zKXJldHVybjthPmYmJihmPWEpfWVsc2UgaWYoaD4wKXtpZihhPGYpcmV0dXJuO2E8cyYmKHM9YSl9cmV0dXJuIGY+MCYmKHRbMF09dStmKmwsdFsxXT1jK2YqaCksczwxJiYoblswXT11K3MqbCxuWzFdPWMrcypoKSwhMH19fX19KGMsbSx0LG4sZSxyKT91JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSksXz0hMSk6KHl8fChiLmxpbmVTdGFydCgpLGIucG9pbnQoY1swXSxjWzFdKSksYi5wb2ludChtWzBdLG1bMV0pLHV8fGIubGluZUVuZCgpLF89ITEpfXA9byxnPWEseT11fXJldHVybiB4fX12YXIgRGw9e3NwaGVyZTpVZixwb2ludDpVZixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtEbC5wb2ludD1GbCxEbC5saW5lRW5kPVJsfSxsaW5lRW5kOlVmLHBvbHlnb25TdGFydDpVZixwb2x5Z29uRW5kOlVmfTtmdW5jdGlvbiBSbCgpe0RsLnBvaW50PURsLmxpbmVFbmQ9VWZ9ZnVuY3Rpb24gRmwodCxuKXtObD10Kj14ZixrbD1QZihuKj14ZiksQ2w9QWYobiksRGwucG9pbnQ9cWx9ZnVuY3Rpb24gcWwodCxuKXt0Kj14Zjt2YXIgZT1QZihuKj14Zikscj1BZihuKSxpPXdmKHQtTmwpLG89QWYoaSksYT1yKlBmKGkpLHU9Q2wqZS1rbCpyKm8sYz1rbCplK0NsKnIqbztFbC5hZGQoVGYoJGYoYSphK3UqdSksYykpLE5sPXQsa2w9ZSxDbD1yfWZ1bmN0aW9uIFVsKHQpe3JldHVybiBFbD1uZXcgQSxqZih0LERsKSwrRWx9dmFyIElsPVtudWxsLG51bGxdLE9sPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpJbH07ZnVuY3Rpb24gQmwodCxuKXtyZXR1cm4gSWxbMF09dCxJbFsxXT1uLFVsKE9sKX12YXIgWWw9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gamwodC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGpsKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxMbD17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIEhsKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKEhsKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gWGwodC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihYbChlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIEdsKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoR2woZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGpsKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBqbCh0LG4pe3JldHVybiEoIXR8fCFMbC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmTGxbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIEhsKHQsbil7cmV0dXJuIDA9PT1CbCh0LG4pfWZ1bmN0aW9uIFhsKHQsbil7Zm9yKHZhciBlLHIsaSxvPTAsYT10Lmxlbmd0aDtvPGE7bysrKXtpZigwPT09KHI9QmwodFtvXSxuKSkpcmV0dXJuITA7aWYobz4wJiYoaT1CbCh0W29dLHRbby0xXSkpPjAmJmU8PWkmJnI8PWkmJihlK3ItaSkqKDEtTWF0aC5wb3coKGUtcikvaSwyKSk8Z2YqaSlyZXR1cm4hMDtlPXJ9cmV0dXJuITF9ZnVuY3Rpb24gR2wodCxuKXtyZXR1cm4hIXhsKHQubWFwKFZsKSxXbChuKSl9ZnVuY3Rpb24gVmwodCl7cmV0dXJuKHQ9dC5tYXAoV2wpKS5wb3AoKSx0fWZ1bmN0aW9uIFdsKHQpe3JldHVyblt0WzBdKnhmLHRbMV0qeGZdfWZ1bmN0aW9uIFpsKHQsbixlKXt2YXIgcj1odCh0LG4tcGYsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoKGZ1bmN0aW9uKG4pe3JldHVyblt0LG5dfSkpfX1mdW5jdGlvbiBLbCh0LG4sZSl7dmFyIHI9aHQodCxuLXBmLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pKX19ZnVuY3Rpb24gUWwoKXt2YXIgdCxuLGUscixpLG8sYSx1LGMsZixzLGwsaD0xMCxkPWgscD05MCxnPTM2MCx5PTIuNTtmdW5jdGlvbiB2KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6XygpfX1mdW5jdGlvbiBfKCl7cmV0dXJuIGh0KFNmKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoaHQoU2YodS9nKSpnLGEsZykubWFwKGwpKS5jb25jYXQoaHQoU2Yobi9oKSpoLHQsaCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gd2YodCVwKT5wZn0pKS5tYXAoYykpLmNvbmNhdChodChTZihvL2QpKmQsaSxkKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB3Zih0JWcpPnBmfSkpLm1hcChmKSl9cmV0dXJuIHYubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSkpfSx2Lm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LHYuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3YuZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6di5leHRlbnRNaW5vcigpfSx2LmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksdi5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LHYuZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSx2LnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sdi5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Yuc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTp2LnN0ZXBNaW5vcigpfSx2LnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSxnPSt0WzFdLHYpOltwLGddfSx2LnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLHYpOltoLGRdfSx2LnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxjPVpsKG8saSw5MCksZj1LbChuLHQseSkscz1abCh1LGEsOTApLGw9S2wocixlLHkpLHYpOnl9LHYuZXh0ZW50TWFqb3IoW1stMTgwLC05MCtwZl0sWzE4MCw5MC1wZl1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLXBmXSxbMTgwLDgwK3BmXV0pfXZhciBKbCx0aCxuaCxlaCxyaD10PT50LGloPW5ldyBBLG9oPW5ldyBBLGFoPXtwb2ludDpVZixsaW5lU3RhcnQ6VWYsbGluZUVuZDpVZixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthaC5saW5lU3RhcnQ9dWgsYWgubGluZUVuZD1zaH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2FoLmxpbmVTdGFydD1haC5saW5lRW5kPWFoLnBvaW50PVVmLGloLmFkZCh3ZihvaCkpLG9oPW5ldyBBfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1paC8yO3JldHVybiBpaD1uZXcgQSx0fX07ZnVuY3Rpb24gdWgoKXthaC5wb2ludD1jaH1mdW5jdGlvbiBjaCh0LG4pe2FoLnBvaW50PWZoLEpsPW5oPXQsdGg9ZWg9bn1mdW5jdGlvbiBmaCh0LG4pe29oLmFkZChlaCp0LW5oKm4pLG5oPXQsZWg9bn1mdW5jdGlvbiBzaCgpe2ZoKEpsLHRoKX12YXIgbGg9YWgsaGg9MS8wLGRoPWhoLHBoPS1oaCxnaD1waCx5aD17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PGhoJiYoaGg9dCk7dD5waCYmKHBoPXQpO248ZGgmJihkaD1uKTtuPmdoJiYoZ2g9bil9LGxpbmVTdGFydDpVZixsaW5lRW5kOlVmLHBvbHlnb25TdGFydDpVZixwb2x5Z29uRW5kOlVmLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbaGgsZGhdLFtwaCxnaF1dO3JldHVybiBwaD1naD0tKGRoPWhoPTEvMCksdH19O3ZhciB2aCxfaCxiaCxtaCx4aD15aCx3aD0wLE1oPTAsVGg9MCxBaD0wLFNoPTAsRWg9MCxOaD0wLGtoPTAsQ2g9MCxQaD17cG9pbnQ6emgsbGluZVN0YXJ0OiRoLGxpbmVFbmQ6RmgscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7UGgubGluZVN0YXJ0PXFoLFBoLmxpbmVFbmQ9VWh9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtQaC5wb2ludD16aCxQaC5saW5lU3RhcnQ9JGgsUGgubGluZUVuZD1GaH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9Q2g/W05oL0NoLGtoL0NoXTpFaD9bQWgvRWgsU2gvRWhdOlRoP1t3aC9UaCxNaC9UaF06W05hTixOYU5dO3JldHVybiB3aD1NaD1UaD1BaD1TaD1FaD1OaD1raD1DaD0wLHR9fTtmdW5jdGlvbiB6aCh0LG4pe3doKz10LE1oKz1uLCsrVGh9ZnVuY3Rpb24gJGgoKXtQaC5wb2ludD1EaH1mdW5jdGlvbiBEaCh0LG4pe1BoLnBvaW50PVJoLHpoKGJoPXQsbWg9bil9ZnVuY3Rpb24gUmgodCxuKXt2YXIgZT10LWJoLHI9bi1taCxpPSRmKGUqZStyKnIpO0FoKz1pKihiaCt0KS8yLFNoKz1pKihtaCtuKS8yLEVoKz1pLHpoKGJoPXQsbWg9bil9ZnVuY3Rpb24gRmgoKXtQaC5wb2ludD16aH1mdW5jdGlvbiBxaCgpe1BoLnBvaW50PUlofWZ1bmN0aW9uIFVoKCl7T2godmgsX2gpfWZ1bmN0aW9uIEloKHQsbil7UGgucG9pbnQ9T2gsemgodmg9Ymg9dCxfaD1taD1uKX1mdW5jdGlvbiBPaCh0LG4pe3ZhciBlPXQtYmgscj1uLW1oLGk9JGYoZSplK3Iqcik7QWgrPWkqKGJoK3QpLzIsU2grPWkqKG1oK24pLzIsRWgrPWksTmgrPShpPW1oKnQtYmgqbikqKGJoK3QpLGtoKz1pKihtaCtuKSxDaCs9MyppLHpoKGJoPXQsbWg9bil9dmFyIEJoPVBoO2Z1bmN0aW9uIFloKHQpe3RoaXMuX2NvbnRleHQ9dH1ZaC5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsbik7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxuKSx0aGlzLl9jb250ZXh0LmFyYyh0LG4sdGhpcy5fcmFkaXVzLDAsYmYpfX0scmVzdWx0OlVmfTt2YXIgTGgsamgsSGgsWGgsR2gsVmg9bmV3IEEsV2g9e3BvaW50OlVmLGxpbmVTdGFydDpmdW5jdGlvbigpe1doLnBvaW50PVpofSxsaW5lRW5kOmZ1bmN0aW9uKCl7TGgmJktoKGpoLEhoKSxXaC5wb2ludD1VZn0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TGg9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtMaD1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rVmg7cmV0dXJuIFZoPW5ldyBBLHR9fTtmdW5jdGlvbiBaaCh0LG4pe1doLnBvaW50PUtoLGpoPVhoPXQsSGg9R2g9bn1mdW5jdGlvbiBLaCh0LG4pe1hoLT10LEdoLT1uLFZoLmFkZCgkZihYaCpYaCtHaCpHaCkpLFhoPXQsR2g9bn12YXIgUWg9V2g7bGV0IEpoLHRkLG5kLGVkO2NsYXNzIHJke2NvbnN0cnVjdG9yKHQpe3RoaXMuX2FwcGVuZD1udWxsPT10P2lkOmZ1bmN0aW9uKHQpe2NvbnN0IG49TWF0aC5mbG9vcih0KTtpZighKG4+PTApKXRocm93IG5ldyBSYW5nZUVycm9yKGBpbnZhbGlkIGRpZ2l0czogJHt0fWApO2lmKG4+MTUpcmV0dXJuIGlkO2lmKG4hPT1KaCl7Y29uc3QgdD0xMCoqbjtKaD1uLHRkPWZ1bmN0aW9uKG4pe2xldCBlPTE7dGhpcy5fKz1uWzBdO2Zvcihjb25zdCByPW4ubGVuZ3RoO2U8cjsrK2UpdGhpcy5fKz1NYXRoLnJvdW5kKGFyZ3VtZW50c1tlXSp0KS90K25bZV19fXJldHVybiB0ZH0odCksdGhpcy5fcmFkaXVzPTQuNSx0aGlzLl89IiJ9cG9pbnRSYWRpdXModCl7cmV0dXJuIHRoaXMuX3JhZGl1cz0rdCx0aGlzfXBvbHlnb25TdGFydCgpe3RoaXMuX2xpbmU9MH1wb2x5Z29uRW5kKCl7dGhpcy5fbGluZT1OYU59bGluZVN0YXJ0KCl7dGhpcy5fcG9pbnQ9MH1saW5lRW5kKCl7MD09PXRoaXMuX2xpbmUmJih0aGlzLl8rPSJaIiksdGhpcy5fcG9pbnQ9TmFOfXBvaW50KHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fYXBwZW5kYE0ke3R9LCR7bn1gLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2FwcGVuZGBMJHt0fSwke259YDticmVhaztkZWZhdWx0OmlmKHRoaXMuX2FwcGVuZGBNJHt0fSwke259YCx0aGlzLl9yYWRpdXMhPT1uZHx8dGhpcy5fYXBwZW5kIT09dGQpe2NvbnN0IHQ9dGhpcy5fcmFkaXVzLG49dGhpcy5fO3RoaXMuXz0iIix0aGlzLl9hcHBlbmRgbTAsJHt0fWEke3R9LCR7dH0gMCAxLDEgMCwkey0yKnR9YSR7dH0sJHt0fSAwIDEsMSAwLCR7Mip0fXpgLG5kPXQsdGQ9dGhpcy5fYXBwZW5kLGVkPXRoaXMuXyx0aGlzLl89bn10aGlzLl8rPWVkfX1yZXN1bHQoKXtjb25zdCB0PXRoaXMuXztyZXR1cm4gdGhpcy5fPSIiLHQubGVuZ3RoP3Q6bnVsbH19ZnVuY3Rpb24gaWQodCl7bGV0IG49MTt0aGlzLl8rPXRbMF07Zm9yKGNvbnN0IGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLl8rPWFyZ3VtZW50c1tuXSt0W25dfWZ1bmN0aW9uIG9kKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uZXcgYWQ7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdO3JldHVybiBlLnN0cmVhbT1uLGV9fWZ1bmN0aW9uIGFkKCl7fWZ1bmN0aW9uIHVkKHQsbixlKXt2YXIgcj10LmNsaXBFeHRlbnQmJnQuY2xpcEV4dGVudCgpO3JldHVybiB0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQobnVsbCksamYoZSx0LnN0cmVhbSh4aCkpLG4oeGgucmVzdWx0KCkpLG51bGwhPXImJnQuY2xpcEV4dGVudChyKSx0fWZ1bmN0aW9uIGNkKHQsbixlKXtyZXR1cm4gdWQodCwoZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9KSxlKX1mdW5jdGlvbiBmZCh0LG4sZSl7cmV0dXJuIGNkKHQsW1swLDBdLG5dLGUpfWZ1bmN0aW9uIHNkKHQsbixlKXtyZXR1cm4gdWQodCwoZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzBdLWVbMF1bMF0pLG89KHItaSooZVsxXVswXStlWzBdWzBdKSkvMixhPS1pKmVbMF1bMV07dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0pLGUpfWZ1bmN0aW9uIGxkKHQsbixlKXtyZXR1cm4gdWQodCwoZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzFdLWVbMF1bMV0pLG89LWkqZVswXVswXSxhPShyLWkqKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLGFdKX0pLGUpfWFkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWQscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIGhkPTE2LGRkPUFmKDMwKnhmKTtmdW5jdGlvbiBwZCh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsYyxmLHMsbCxoLGQscCxnLHkpe3ZhciB2PWYtcixfPXMtaSxiPXYqditfKl87aWYoYj40Km4mJmctLSl7dmFyIG09YStoLHg9dStkLHc9YytwLE09JGYobSptK3gqeCt3KncpLFQ9RmYody89TSksQT13Zih3Zih3KS0xKTxwZnx8d2Yoby1sKTxwZj8obytsKS8yOlRmKHgsbSksUz10KEEsVCksRT1TWzBdLE49U1sxXSxrPUUtcixDPU4taSxQPV8qay12KkM7KFAqUC9iPm58fHdmKCh2KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtjKnA8ZGQpJiYoZShyLGksbyxhLHUsYyxFLE4sQSxtLz1NLHgvPU0sdyxnLHkpLHkucG9pbnQoRSxOKSxlKEUsTixBLG0seCx3LGYscyxsLGgsZCxwLGcseSkpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxjLGYscyxsLGgsZCxwLGc9e3BvaW50OnksbGluZVN0YXJ0OnYsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksZy5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLGcubGluZVN0YXJ0PXZ9fTtmdW5jdGlvbiB5KGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHYoKXtzPU5hTixnLnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89Z3MoW3IsaV0pLGE9dChyLGkpO2UocyxsLGYsaCxkLHAscz1hWzBdLGw9YVsxXSxmPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0saGQsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXtnLnBvaW50PXksbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3YoKSxnLnBvaW50PXgsZy5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxjPXAsZy5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxmLGgsZCxwLGksbyxyLGEsdSxjLGhkLG4pLGcubGluZUVuZD1iLGIoKX1yZXR1cm4gZ319KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIG9kKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBnZD1vZCh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KnhmLG4qeGYpfX0pO2Z1bmN0aW9uIHlkKHQsbixlLHIsaSxvKXtpZighbylyZXR1cm4gZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKG8sYSl7cmV0dXJuW24rdCoobyo9ciksZS10KihhKj1pKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLW4pL3QqciwoZS1hKS90KmldfSxvfSh0LG4sZSxyLGkpO3ZhciBhPUFmKG8pLHU9UGYobyksYz1hKnQsZj11KnQscz1hL3QsbD11L3QsaD0odSplLWEqbikvdCxkPSh1Km4rYSplKS90O2Z1bmN0aW9uIHAodCxvKXtyZXR1cm5bYyoodCo9ciktZioobyo9aSkrbixlLWYqdC1jKm9dfXJldHVybiBwLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVybltyKihzKnQtbCpuK2gpLGkqKGQtbCp0LXMqbildfSxwfWZ1bmN0aW9uIHZkKHQpe3JldHVybiBfZCgoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKSgpfWZ1bmN0aW9uIF9kKHQpe3ZhciBuLGUscixpLG8sYSx1LGMsZixzLGw9MTUwLGg9NDgwLGQ9MjUwLHA9MCxnPTAseT0wLHY9MCxfPTAsYj0wLG09MSx4PTEsdz1udWxsLE09QWwsVD1udWxsLEE9cmgsUz0uNTtmdW5jdGlvbiBFKHQpe3JldHVybiBjKHRbMF0qeGYsdFsxXSp4Zil9ZnVuY3Rpb24gTih0KXtyZXR1cm4odD1jLmludmVydCh0WzBdLHRbMV0pKSYmW3RbMF0qbWYsdFsxXSptZl19ZnVuY3Rpb24gaygpe3ZhciB0PXlkKGwsMCwwLG0seCxiKS5hcHBseShudWxsLG4ocCxnKSkscj15ZChsLGgtdFswXSxkLXRbMV0sbSx4LGIpO3JldHVybiBlPWNsKHksdixfKSx1PWFsKG4sciksYz1hbChlLHUpLGE9cGQodSxTKSxDKCl9ZnVuY3Rpb24gQygpe3JldHVybiBmPXM9bnVsbCxFfXJldHVybiBFLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gZiYmcz09PXQ/ZjpmPWdkKGZ1bmN0aW9uKHQpe3JldHVybiBvZCh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKE0oYShBKHM9dCkpKSkpfSxFLnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXZvaWQgMCxDKCkpOk19LEUucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9dCxUPXI9aT1vPW51bGwsQygpKTpBfSxFLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT0rdD9TbCh3PXQqeGYpOih3PW51bGwsQWwpLEMoKSk6dyptZn0sRS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/KFQ9cj1pPW89bnVsbCxyaCk6JGwoVD0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksQygpKTpudWxsPT1UP251bGw6W1tULHJdLFtpLG9dXX0sRS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxrKCkpOmx9LEUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0saygpKTpbaCxkXX0sRS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqeGYsZz10WzFdJTM2MCp4ZixrKCkpOltwKm1mLGcqbWZdfSxFLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT10WzBdJTM2MCp4Zix2PXRbMV0lMzYwKnhmLF89dC5sZW5ndGg+Mj90WzJdJTM2MCp4ZjowLGsoKSk6W3kqbWYsdiptZixfKm1mXX0sRS5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCp4ZixrKCkpOmIqbWZ9LEUucmVmbGVjdFg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dD8tMToxLGsoKSk6bTwwfSxFLnJlZmxlY3RZPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQ/LTE6MSxrKCkpOng8MH0sRS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9cGQodSxTPXQqdCksQygpKTokZihTKX0sRS5maXRFeHRlbnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gY2QoRSx0LG4pfSxFLmZpdFNpemU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmQoRSx0LG4pfSxFLmZpdFdpZHRoPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHNkKEUsdCxuKX0sRS5maXRIZWlnaHQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGQoRSx0LG4pfSxmdW5jdGlvbigpe3JldHVybiBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEUuaW52ZXJ0PW4uaW52ZXJ0JiZOLGsoKX19ZnVuY3Rpb24gYmQodCl7dmFyIG49MCxlPXlmLzMscj1fZCh0KSxpPXIobixlKTtyZXR1cm4gaS5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cihuPXRbMF0qeGYsZT10WzFdKnhmKTpbbiptZixlKm1mXX0saX1mdW5jdGlvbiBtZCh0LG4pe3ZhciBlPVBmKHQpLHI9KGUrUGYobikpLzI7aWYod2Yocik8cGYpcmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPUFmKHQpO2Z1bmN0aW9uIGUodCxlKXtyZXR1cm5bdCpuLFBmKGUpL25dfXJldHVybiBlLmludmVydD1mdW5jdGlvbih0LGUpe3JldHVyblt0L24sRmYoZSpuKV19LGV9KHQpO3ZhciBpPTErZSooMipyLWUpLG89JGYoaSkvcjtmdW5jdGlvbiBhKHQsbil7dmFyIGU9JGYoaS0yKnIqUGYobikpL3I7cmV0dXJuW2UqUGYodCo9ciksby1lKkFmKHQpXX1yZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1vLW4sYT1UZih0LHdmKGUpKSp6ZihlKTtyZXR1cm4gZSpyPDAmJihhLT15Zip6Zih0KSp6ZihlKSksW2EvcixGZigoaS0odCp0K2UqZSkqcipyKS8oMipyKSldfSxhfWZ1bmN0aW9uIHhkKCl7cmV0dXJuIGJkKG1kKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIHdkKCl7cmV0dXJuIHhkKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gTWQodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9QWYobiksaT1BZihlKSxvPXQocippKTtyZXR1cm4gbz09PTEvMD9bMiwwXTpbbyppKlBmKG4pLG8qUGYoZSldfX1mdW5jdGlvbiBUZCh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj0kZihuKm4rZSplKSxpPXQociksbz1QZihpKSxhPUFmKGkpO3JldHVybltUZihuKm8sciphKSxGZihyJiZlKm8vcildfX12YXIgQWQ9TWQoKGZ1bmN0aW9uKHQpe3JldHVybiAkZigyLygxK3QpKX0pKTtBZC5pbnZlcnQ9VGQoKGZ1bmN0aW9uKHQpe3JldHVybiAyKkZmKHQvMil9KSk7dmFyIFNkPU1kKChmdW5jdGlvbih0KXtyZXR1cm4odD1SZih0KSkmJnQvUGYodCl9KSk7ZnVuY3Rpb24gRWQodCxuKXtyZXR1cm5bdCxrZihEZigodmYrbikvMikpXX1mdW5jdGlvbiBOZCh0KXt2YXIgbixlLHIsaT12ZCh0KSxvPWkuY2VudGVyLGE9aS5zY2FsZSx1PWkudHJhbnNsYXRlLGM9aS5jbGlwRXh0ZW50LGY9bnVsbDtmdW5jdGlvbiBzKCl7dmFyIG89eWYqYSgpLHU9aShobChpLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gYyhudWxsPT1mP1tbdVswXS1vLHVbMV0tb10sW3VbMF0rbyx1WzFdK29dXTp0PT09RWQ/W1tNYXRoLm1heCh1WzBdLW8sZiksbl0sW01hdGgubWluKHVbMF0rbyxlKSxyXV06W1tmLE1hdGgubWF4KHVbMV0tbyxuKV0sW2UsTWF0aC5taW4odVsxXStvLHIpXV0pfXJldHVybiBpLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHMoKSk6YSgpfSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSh0KSxzKCkpOnUoKX0saS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCkscygpKTpvKCl9LGkuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9mPW49ZT1yPW51bGw6KGY9K3RbMF1bMF0sbj0rdFswXVsxXSxlPSt0WzFdWzBdLHI9K3RbMV1bMV0pLHMoKSk6bnVsbD09Zj9udWxsOltbZixuXSxbZSxyXV19LHMoKX1mdW5jdGlvbiBrZCh0KXtyZXR1cm4gRGYoKHZmK3QpLzIpfWZ1bmN0aW9uIENkKHQsbil7dmFyIGU9QWYodCkscj10PT09bj9QZih0KTprZihlL0FmKG4pKS9rZihrZChuKS9rZCh0KSksaT1lKkNmKGtkKHQpLHIpL3I7aWYoIXIpcmV0dXJuIEVkO2Z1bmN0aW9uIG8odCxuKXtpPjA/bjwtdmYrcGYmJihuPS12ZitwZik6bj52Zi1wZiYmKG49dmYtcGYpO3ZhciBlPWkvQ2Yoa2Qobikscik7cmV0dXJuW2UqUGYocip0KSxpLWUqQWYocip0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9aS1uLG89emYocikqJGYodCp0K2UqZSksYT1UZih0LHdmKGUpKSp6ZihlKTtyZXR1cm4gZSpyPDAmJihhLT15Zip6Zih0KSp6ZihlKSksW2EvciwyKk1mKENmKGkvbywxL3IpKS12Zl19LG99ZnVuY3Rpb24gUGQodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiB6ZCh0LG4pe3ZhciBlPUFmKHQpLHI9dD09PW4/UGYodCk6KGUtQWYobikpLyhuLXQpLGk9ZS9yK3Q7aWYod2Yocik8cGYpcmV0dXJuIFBkO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUGYobyksaS1lKkFmKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1UZih0LHdmKGUpKSp6ZihlKTtyZXR1cm4gZSpyPDAmJihvLT15Zip6Zih0KSp6ZihlKSksW28vcixpLXpmKHIpKiRmKHQqdCtlKmUpXX0sb31TZC5pbnZlcnQ9VGQoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLEVkLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqTWYoRWYobikpLXZmXX0sUGQuaW52ZXJ0PVBkO3ZhciAkZD0xLjM0MDI2NCxEZD0tLjA4MTEwNixSZD04OTNlLTYsRmQ9LjAwMzc5NixxZD0kZigzKS8yO2Z1bmN0aW9uIFVkKHQsbil7dmFyIGU9RmYocWQqUGYobikpLHI9ZSplLGk9cipyKnI7cmV0dXJuW3QqQWYoZSkvKHFkKigkZCszKkRkKnIraSooNypSZCs5KkZkKnIpKSksZSooJGQrRGQqcitpKihSZCtGZCpyKSldfWZ1bmN0aW9uIElkKHQsbil7dmFyIGU9QWYobikscj1BZih0KSplO3JldHVybltlKlBmKHQpL3IsUGYobikvcl19ZnVuY3Rpb24gT2QodCxuKXt2YXIgZT1uKm4scj1lKmU7cmV0dXJuW3QqKC44NzA3LS4xMzE5NzkqZStyKihyKiguMDAzOTcxKmUtLjAwMTUyOSpyKS0uMDEzNzkxKSksbiooMS4wMDcyMjYrZSooLjAxNTA4NStyKiguMDI4ODc0KmUtLjA0NDQ3NS0uMDA1OTE2KnIpKSldfWZ1bmN0aW9uIEJkKHQsbil7cmV0dXJuW0FmKG4pKlBmKHQpLFBmKG4pXX1mdW5jdGlvbiBZZCh0LG4pe3ZhciBlPUFmKG4pLHI9MStBZih0KSplO3JldHVybltlKlBmKHQpL3IsUGYobikvcl19ZnVuY3Rpb24gTGQodCxuKXtyZXR1cm5ba2YoRGYoKHZmK24pLzIpKSwtdF19ZnVuY3Rpb24gamQodCxuKXtyZXR1cm4gdC5wYXJlbnQ9PT1uLnBhcmVudD8xOjJ9ZnVuY3Rpb24gSGQodCxuKXtyZXR1cm4gdCtuLnh9ZnVuY3Rpb24gWGQodCxuKXtyZXR1cm4gTWF0aC5tYXgodCxuLnkpfWZ1bmN0aW9uIEdkKHQpe3ZhciBuPTAsZT10LmNoaWxkcmVuLHI9ZSYmZS5sZW5ndGg7aWYocilmb3IoOy0tcj49MDspbis9ZVtyXS52YWx1ZTtlbHNlIG49MTt0LnZhbHVlPW59ZnVuY3Rpb24gVmQodCxuKXt0IGluc3RhbmNlb2YgTWFwPyh0PVt2b2lkIDAsdF0sdm9pZCAwPT09biYmKG49WmQpKTp2b2lkIDA9PT1uJiYobj1XZCk7Zm9yKHZhciBlLHIsaSxvLGEsdT1uZXcgSmQodCksYz1bdV07ZT1jLnBvcCgpOylpZigoaT1uKGUuZGF0YSkpJiYoYT0oaT1BcnJheS5mcm9tKGkpKS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPWksbz1hLTE7bz49MDstLW8pYy5wdXNoKHI9aVtvXT1uZXcgSmQoaVtvXSkpLHIucGFyZW50PWUsci5kZXB0aD1lLmRlcHRoKzE7cmV0dXJuIHUuZWFjaEJlZm9yZShRZCl9ZnVuY3Rpb24gV2QodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gWmQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dFsxXTpudWxsfWZ1bmN0aW9uIEtkKHQpe3ZvaWQgMCE9PXQuZGF0YS52YWx1ZSYmKHQudmFsdWU9dC5kYXRhLnZhbHVlKSx0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gUWQodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBKZCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1mdW5jdGlvbiB0cCh0KXtyZXR1cm4gbnVsbD09dD9udWxsOm5wKHQpfWZ1bmN0aW9uIG5wKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBlcCgpe3JldHVybiAwfWZ1bmN0aW9uIHJwKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1VZC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKigkZCtEZCppK28qKFJkK0ZkKmkpKS1uKS8oJGQrMypEZCppK28qKDcqUmQrOSpGZCppKSkpKnIpKmkqaSwhKHdmKGUpPGdmKSk7KythKTtyZXR1cm5bcWQqdCooJGQrMypEZCppK28qKDcqUmQrOSpGZCppKSkvQWYociksRmYoUGYocikvcWQpXX0sSWQuaW52ZXJ0PVRkKE1mKSxPZC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKHdmKGUpPnBmJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxCZC5pbnZlcnQ9VGQoRmYpLFlkLmludmVydD1UZCgoZnVuY3Rpb24odCl7cmV0dXJuIDIqTWYodCl9KSksTGQuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuWy1uLDIqTWYoRWYodCkpLXZmXX0sSmQucHJvdG90eXBlPVZkLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SmQsY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoR2QpfSxlYWNoOmZ1bmN0aW9uKHQsbil7bGV0IGU9LTE7Zm9yKGNvbnN0IHIgb2YgdGhpcyl0LmNhbGwobixyLCsrZSx0aGlzKTtyZXR1cm4gdGhpc30sZWFjaEFmdGVyOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaSxvPXRoaXMsYT1bb10sdT1bXSxjPS0xO289YS5wb3AoKTspaWYodS5wdXNoKG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcilhLnB1c2goZVtyXSk7Zm9yKDtvPXUucG9wKCk7KXQuY2FsbChuLG8sKytjLHRoaXMpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaT10aGlzLG89W2ldLGE9LTE7aT1vLnBvcCgpOylpZih0LmNhbGwobixpLCsrYSx0aGlzKSxlPWkuY2hpbGRyZW4pZm9yKHI9ZS5sZW5ndGgtMTtyPj0wOy0tcilvLnB1c2goZVtyXSk7cmV0dXJuIHRoaXN9LGZpbmQ6ZnVuY3Rpb24odCxuKXtsZXQgZT0tMTtmb3IoY29uc3QgciBvZiB0aGlzKWlmKHQuY2FsbChuLHIsKytlLHRoaXMpKXJldHVybiByfSxzdW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihuKXtmb3IodmFyIGU9K3Qobi5kYXRhKXx8MCxyPW4uY2hpbGRyZW4saT1yJiZyLmxlbmd0aDstLWk+PTA7KWUrPXJbaV0udmFsdWU7bi52YWx1ZT1lfSkpfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcyxlPWZ1bmN0aW9uKHQsbil7aWYodD09PW4pcmV0dXJuIHQ7dmFyIGU9dC5hbmNlc3RvcnMoKSxyPW4uYW5jZXN0b3JzKCksaT1udWxsO3Q9ZS5wb3AoKSxuPXIucG9wKCk7Zm9yKDt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzKX0sbGVhdmVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaEJlZm9yZSgoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPVtdO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKGUpe2UhPT10JiZuLnB1c2goe3NvdXJjZTplLnBhcmVudCx0YXJnZXQ6ZX0pfSkpLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gVmQodGhpcykuZWFjaEJlZm9yZShLZCl9LFtTeW1ib2wuaXRlcmF0b3JdOmZ1bmN0aW9uKigpe3ZhciB0LG4sZSxyLGk9dGhpcyxvPVtpXTtkb3tmb3IodD1vLnJldmVyc2UoKSxvPVtdO2k9dC5wb3AoKTspaWYoeWllbGQgaSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pfXdoaWxlKG8ubGVuZ3RoKX19O2NvbnN0IGlwPTE2NjQ1MjUsb3A9MTAxMzkwNDIyMyxhcD00Mjk0OTY3Mjk2O2Z1bmN0aW9uIHVwKCl7bGV0IHQ9MTtyZXR1cm4oKT0+KHQ9KGlwKnQrb3ApJWFwKS9hcH1mdW5jdGlvbiBjcCh0LG4pe2Zvcih2YXIgZSxyLGk9MCxvPSh0PWZ1bmN0aW9uKHQsbil7bGV0IGUscixpPXQubGVuZ3RoO2Zvcig7aTspcj1uKCkqaS0tfDAsZT10W2ldLHRbaV09dFtyXSx0W3JdPWU7cmV0dXJuIHR9KEFycmF5LmZyb20odCksbikpLmxlbmd0aCxhPVtdO2k8bzspZT10W2ldLHImJmxwKHIsZSk/KytpOihyPWRwKGE9ZnAoYSxlKSksaT0wKTtyZXR1cm4gcn1mdW5jdGlvbiBmcCh0LG4pe3ZhciBlLHI7aWYoaHAobix0KSlyZXR1cm5bbl07Zm9yKGU9MDtlPHQubGVuZ3RoOysrZSlpZihzcChuLHRbZV0pJiZocChwcCh0W2VdLG4pLHQpKXJldHVyblt0W2VdLG5dO2ZvcihlPTA7ZTx0Lmxlbmd0aC0xOysrZSlmb3Iocj1lKzE7cjx0Lmxlbmd0aDsrK3IpaWYoc3AocHAodFtlXSx0W3JdKSxuKSYmc3AocHAodFtlXSxuKSx0W3JdKSYmc3AocHAodFtyXSxuKSx0W2VdKSYmaHAoZ3AodFtlXSx0W3JdLG4pLHQpKXJldHVyblt0W2VdLHRbcl0sbl07dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uIHNwKHQsbil7dmFyIGU9dC5yLW4ucixyPW4ueC10LngsaT1uLnktdC55O3JldHVybiBlPDB8fGUqZTxyKnIraSppfWZ1bmN0aW9uIGxwKHQsbil7dmFyIGU9dC5yLW4ucisxZS05Kk1hdGgubWF4KHQucixuLnIsMSkscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBocCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCFscCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGRwKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fSh0WzBdKTtjYXNlIDI6cmV0dXJuIHBwKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBncCh0WzBdLHRbMV0sdFsyXSl9fWZ1bmN0aW9uIHBwKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LGE9bi55LHU9bi5yLGM9by1lLGY9YS1yLHM9dS1pLGw9TWF0aC5zcXJ0KGMqYytmKmYpO3JldHVybnt4OihlK28rYy9sKnMpLzIseToocithK2YvbCpzKS8yLHI6KGwraSt1KS8yfX1mdW5jdGlvbiBncCh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLGE9bi54LHU9bi55LGM9bi5yLGY9ZS54LHM9ZS55LGw9ZS5yLGg9ci1hLGQ9ci1mLHA9aS11LGc9aS1zLHk9Yy1vLHY9bC1vLF89cipyK2kqaS1vKm8sYj1fLWEqYS11KnUrYypjLG09Xy1mKmYtcypzK2wqbCx4PWQqcC1oKmcsdz0ocCptLWcqYikvKDIqeCktcixNPShnKnktcCp2KS94LFQ9KGQqYi1oKm0pLygyKngpLWksQT0oaCp2LWQqeSkveCxTPU0qTStBKkEtMSxFPTIqKG8rdypNK1QqQSksTj13KncrVCpULW8qbyxrPS0oTWF0aC5hYnMoUyk+MWUtNj8oRStNYXRoLnNxcnQoRSpFLTQqUypOKSkvKDIqUyk6Ti9FKTtyZXR1cm57eDpyK3crTSprLHk6aStUK0EqayxyOmt9fWZ1bmN0aW9uIHlwKHQsbixlKXt2YXIgcixpLG8sYSx1PXQueC1uLngsYz10Lnktbi55LGY9dSp1K2MqYztmPyhpPW4ucitlLnIsaSo9aSxhPXQucitlLnIsaT4oYSo9YSk/KHI9KGYrYS1pKS8oMipmKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGEvZi1yKnIpKSxlLng9dC54LXIqdS1vKmMsZS55PXQueS1yKmMrbyp1KToocj0oZitpLWEpLygyKmYpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsaS9mLXIqcikpLGUueD1uLngrcip1LW8qYyxlLnk9bi55K3IqYytvKnUpKTooZS54PW4ueCtlLnIsZS55PW4ueSl9ZnVuY3Rpb24gdnAodCxuKXt2YXIgZT10LnIrbi5yLTFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfcCh0KXt2YXIgbj10Ll8sZT10Lm5leHQuXyxyPW4ucitlLnIsaT0obi54KmUucitlLngqbi5yKS9yLG89KG4ueSplLnIrZS55Km4ucikvcjtyZXR1cm4gaSppK28qb31mdW5jdGlvbiBicCh0KXt0aGlzLl89dCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXZpb3VzPW51bGx9ZnVuY3Rpb24gbXAodCxuKXtpZighKG89KHQ9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYibGVuZ3RoImluIHQ/dDpBcnJheS5mcm9tKHQpfSh0KSkubGVuZ3RoKSlyZXR1cm4gMDt2YXIgZSxyLGksbyxhLHUsYyxmLHMsbCxoO2lmKChlPXRbMF0pLng9MCxlLnk9MCwhKG8+MSkpcmV0dXJuIGUucjtpZihyPXRbMV0sZS54PS1yLnIsci54PWUucixyLnk9MCwhKG8+MikpcmV0dXJuIGUucityLnI7eXAocixlLGk9dFsyXSksZT1uZXcgYnAoZSkscj1uZXcgYnAociksaT1uZXcgYnAoaSksZS5uZXh0PWkucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1pLGkubmV4dD1yLnByZXZpb3VzPWU7dDpmb3IoYz0zO2M8bzsrK2Mpe3lwKGUuXyxyLl8saT10W2NdKSxpPW5ldyBicChpKSxmPXIubmV4dCxzPWUucHJldmlvdXMsbD1yLl8ucixoPWUuXy5yO2Rve2lmKGw8PWgpe2lmKHZwKGYuXyxpLl8pKXtyPWYsZS5uZXh0PXIsci5wcmV2aW91cz1lLC0tYztjb250aW51ZSB0fWwrPWYuXy5yLGY9Zi5uZXh0fWVsc2V7aWYodnAocy5fLGkuXykpeyhlPXMpLm5leHQ9cixyLnByZXZpb3VzPWUsLS1jO2NvbnRpbnVlIHR9aCs9cy5fLnIscz1zLnByZXZpb3VzfX13aGlsZShmIT09cy5uZXh0KTtmb3IoaS5wcmV2aW91cz1lLGkubmV4dD1yLGUubmV4dD1yLnByZXZpb3VzPXI9aSxhPV9wKGUpOyhpPWkubmV4dCkhPT1yOykodT1fcChpKSk8YSYmKGU9aSxhPXUpO3I9ZS5uZXh0fWZvcihlPVtyLl9dLGk9cjsoaT1pLm5leHQpIT09cjspZS5wdXNoKGkuXyk7Zm9yKGk9Y3AoZSxuKSxjPTA7YzxvOysrYykoZT10W2NdKS54LT1pLngsZS55LT1pLnk7cmV0dXJuIGkucn1mdW5jdGlvbiB4cCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIHdwKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gTXAodCxuLGUpe3JldHVybiBmdW5jdGlvbihyKXtpZihpPXIuY2hpbGRyZW4pe3ZhciBpLG8sYSx1PWkubGVuZ3RoLGM9dChyKSpufHwwO2lmKGMpZm9yKG89MDtvPHU7KytvKWlbb10ucis9YztpZihhPW1wKGksZSksYylmb3Iobz0wO288dTsrK28paVtvXS5yLT1jO3Iucj1hK2N9fX1mdW5jdGlvbiBUcCh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBBcCh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gU3AodCxuLGUscixpKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHU9LTEsYz1hLmxlbmd0aCxmPXQudmFsdWUmJihyLW4pL3QudmFsdWU7Kyt1PGM7KShvPWFbdV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqZn12YXIgRXA9e2RlcHRoOi0xfSxOcD17fSxrcD17fTtmdW5jdGlvbiBDcCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBQcCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiB6cCh0KXtsZXQgbj10Lmxlbmd0aDtpZihuPDIpcmV0dXJuIiI7Zm9yKDstLW4+MSYmISRwKHQsbik7KTtyZXR1cm4gdC5zbGljZSgwLG4pfWZ1bmN0aW9uICRwKHQsbil7aWYoIi8iPT09dFtuXSl7bGV0IGU9MDtmb3IoO24+MCYmIlxcIj09PXRbLS1uXTspKytlO2lmKDA9PSgxJmUpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIERwKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIFJwKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/blswXTp0LnR9ZnVuY3Rpb24gRnAodCl7dmFyIG49dC5jaGlsZHJlbjtyZXR1cm4gbj9uW24ubGVuZ3RoLTFdOnQudH1mdW5jdGlvbiBxcCh0LG4sZSl7dmFyIHI9ZS8obi5pLXQuaSk7bi5jLT1yLG4ucys9ZSx0LmMrPXIsbi56Kz1lLG4ubSs9ZX1mdW5jdGlvbiBVcCh0LG4sZSl7cmV0dXJuIHQuYS5wYXJlbnQ9PT1uLnBhcmVudD90LmE6ZX1mdW5jdGlvbiBJcCh0LG4pe3RoaXMuXz10LHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1udWxsLHRoaXMuQT1udWxsLHRoaXMuYT10aGlzLHRoaXMuej0wLHRoaXMubT0wLHRoaXMuYz0wLHRoaXMucz0wLHRoaXMudD1udWxsLHRoaXMuaT1ufWZ1bmN0aW9uIE9wKHQsbixlLHIsaSl7Zm9yKHZhciBvLGE9dC5jaGlsZHJlbix1PS0xLGM9YS5sZW5ndGgsZj10LnZhbHVlJiYoaS1lKS90LnZhbHVlOysrdTxjOykobz1hW3VdKS54MD1uLG8ueDE9cixvLnkwPWUsby55MT1lKz1vLnZhbHVlKmZ9SXAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSmQucHJvdG90eXBlKTt2YXIgQnA9KDErTWF0aC5zcXJ0KDUpKS8yO2Z1bmN0aW9uIFlwKHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdSxjLGYscyxsLGgsZCxwLGcseSx2PVtdLF89bi5jaGlsZHJlbixiPTAsbT0wLHg9Xy5sZW5ndGgsdz1uLnZhbHVlO2I8eDspe2M9aS1lLGY9by1yO2Rve3M9X1ttKytdLnZhbHVlfXdoaWxlKCFzJiZtPHgpO2ZvcihsPWg9cyx5PXMqcyooZz1NYXRoLm1heChmL2MsYy9mKS8odyp0KSkscD1NYXRoLm1heChoL3kseS9sKTttPHg7KyttKXtpZihzKz11PV9bbV0udmFsdWUsdTxsJiYobD11KSx1PmgmJihoPXUpLHk9cypzKmcsKGQ9TWF0aC5tYXgoaC95LHkvbCkpPnApe3MtPXU7YnJlYWt9cD1kfXYucHVzaChhPXt2YWx1ZTpzLGRpY2U6YzxmLGNoaWxkcmVuOl8uc2xpY2UoYixtKX0pLGEuZGljZT9TcChhLGUscixpLHc/cis9ZipzL3c6byk6T3AoYSxlLHIsdz9lKz1jKnMvdzppLG8pLHctPXMsYj1tfXJldHVybiB2fXZhciBMcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtZcChuLHQsZSxyLGksbyl9cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oQnApO3ZhciBqcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtpZigoYT10Ll9zcXVhcmlmeSkmJmEucmF0aW89PT1uKWZvcih2YXIgYSx1LGMsZixzLGw9LTEsaD1hLmxlbmd0aCxkPXQudmFsdWU7KytsPGg7KXtmb3IoYz0odT1hW2xdKS5jaGlsZHJlbixmPXUudmFsdWU9MCxzPWMubGVuZ3RoO2Y8czsrK2YpdS52YWx1ZSs9Y1tmXS52YWx1ZTt1LmRpY2U/U3AodSxlLHIsaSxkP3IrPShvLXIpKnUudmFsdWUvZDpvKTpPcCh1LGUscixkP2UrPShpLWUpKnUudmFsdWUvZDppLG8pLGQtPXUudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPVlwKG4sdCxlLHIsaSxvKSxhLnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oQnApO2Z1bmN0aW9uIEhwKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKS0oblsxXS10WzFdKSooZVswXS10WzBdKX1mdW5jdGlvbiBYcCh0LG4pe3JldHVybiB0WzBdLW5bMF18fHRbMV0tblsxXX1mdW5jdGlvbiBHcCh0KXtjb25zdCBuPXQubGVuZ3RoLGU9WzAsMV07bGV0IHIsaT0yO2ZvcihyPTI7cjxuOysrcil7Zm9yKDtpPjEmJkhwKHRbZVtpLTJdXSx0W2VbaS0xXV0sdFtyXSk8PTA7KS0taTtlW2krK109cn1yZXR1cm4gZS5zbGljZSgwLGkpfXZhciBWcD1NYXRoLnJhbmRvbSxXcD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsMT09PWFyZ3VtZW50cy5sZW5ndGg/KGU9dCx0PTApOmUtPXQsZnVuY3Rpb24oKXtyZXR1cm4gbigpKmUrdH19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLFpwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJihlPXQsdD0wKSx0PU1hdGguZmxvb3IodCksZT1NYXRoLmZsb29yKGUpLXQsZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcihuKCkqZSt0KX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLEtwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3ZhciByLGk7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7dmFyIG87aWYobnVsbCE9cilvPXIscj1udWxsO2Vsc2UgZG97cj0yKm4oKS0xLG89MipuKCktMSxpPXIqcitvKm99d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpvKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLFFwPWZ1bmN0aW9uIHQobil7dmFyIGU9S3Auc291cmNlKG4pO2Z1bmN0aW9uIHIoKXt2YXIgdD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIHIuc291cmNlPXQscn0oVnApLEpwPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4odD0rdCk8PTA/KCk9PjA6ZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPXQ7cj4xOy0tcillKz1uKCk7cmV0dXJuIGUrcipuKCl9fXJldHVybiBlLnNvdXJjZT10LGV9KFZwKSx0Zz1mdW5jdGlvbiB0KG4pe3ZhciBlPUpwLnNvdXJjZShuKTtmdW5jdGlvbiByKHQpe2lmKDA9PSh0PSt0KSlyZXR1cm4gbjt2YXIgcj1lKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiByKCkvdH19cmV0dXJuIHIuc291cmNlPXQscn0oVnApLG5nPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2cxcCgtbigpKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfShWcCksZWc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe2lmKCh0PSt0KTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbnZhbGlkIGFscGhhIik7cmV0dXJuIHQ9MS8tdCxmdW5jdGlvbigpe3JldHVybiBNYXRoLnBvdygxLW4oKSx0KX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLHJnPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtpZigodD0rdCk8MHx8dD4xKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbnZhbGlkIHAiKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcihuKCkrdCl9fXJldHVybiBlLnNvdXJjZT10LGV9KFZwKSxpZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7aWYoKHQ9K3QpPDB8fHQ+MSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiaW52YWxpZCBwIik7cmV0dXJuIDA9PT10PygpPT4xLzA6MT09PXQ/KCk9PjE6KHQ9TWF0aC5sb2cxcCgtdCksZnVuY3Rpb24oKXtyZXR1cm4gMStNYXRoLmZsb29yKE1hdGgubG9nMXAoLW4oKSkvdCl9KX1yZXR1cm4gZS5zb3VyY2U9dCxlfShWcCksb2c9ZnVuY3Rpb24gdChuKXt2YXIgZT1LcC5zb3VyY2UobikoKTtmdW5jdGlvbiByKHQscil7aWYoKHQ9K3QpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgayIpO2lmKDA9PT10KXJldHVybigpPT4wO2lmKHI9bnVsbD09cj8xOityLDE9PT10KXJldHVybigpPT4tTWF0aC5sb2cxcCgtbigpKSpyO3ZhciBpPSh0PDE/dCsxOnQpLTEvMyxvPTEvKDMqTWF0aC5zcXJ0KGkpKSxhPXQ8MT8oKT0+TWF0aC5wb3cobigpLDEvdCk6KCk9PjE7cmV0dXJuIGZ1bmN0aW9uKCl7ZG97ZG97dmFyIHQ9ZSgpLHU9MStvKnR9d2hpbGUodTw9MCk7dSo9dSp1O3ZhciBjPTEtbigpfXdoaWxlKGM+PTEtLjAzMzEqdCp0KnQqdCYmTWF0aC5sb2coYyk+PS41KnQqdCtpKigxLXUrTWF0aC5sb2codSkpKTtyZXR1cm4gaSp1KmEoKSpyfX1yZXR1cm4gci5zb3VyY2U9dCxyfShWcCksYWc9ZnVuY3Rpb24gdChuKXt2YXIgZT1vZy5zb3VyY2Uobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUodCksaT1lKG4pO3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXIoKTtyZXR1cm4gMD09PXQ/MDp0Lyh0K2koKSl9fXJldHVybiByLnNvdXJjZT10LHJ9KFZwKSx1Zz1mdW5jdGlvbiB0KG4pe3ZhciBlPWlnLnNvdXJjZShuKSxyPWFnLnNvdXJjZShuKTtmdW5jdGlvbiBpKHQsbil7cmV0dXJuIHQ9K3QsKG49K24pPj0xPygpPT50Om48PTA/KCk9PjA6ZnVuY3Rpb24oKXtmb3IodmFyIGk9MCxvPXQsYT1uO28qYT4xNiYmbyooMS1hKT4xNjspe3ZhciB1PU1hdGguZmxvb3IoKG8rMSkqYSksYz1yKHUsby11KzEpKCk7Yzw9YT8oaSs9dSxvLT11LGE9KGEtYykvKDEtYykpOihvPXUtMSxhLz1jKX1mb3IodmFyIGY9YTwuNSxzPWUoZj9hOjEtYSksbD1zKCksaD0wO2w8PW87KytoKWwrPXMoKTtyZXR1cm4gaSsoZj9oOm8taCl9fXJldHVybiBpLnNvdXJjZT10LGl9KFZwKSxjZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIpe3ZhciBpO3JldHVybiAwPT0odD0rdCk/aT10PT4tTWF0aC5sb2codCk6KHQ9MS90LGk9bj0+TWF0aC5wb3cobix0KSksZT1udWxsPT1lPzA6K2Uscj1udWxsPT1yPzE6K3IsZnVuY3Rpb24oKXtyZXR1cm4gZStyKmkoLU1hdGgubG9nMXAoLW4oKSkpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfShWcCksZmc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLGZ1bmN0aW9uKCl7cmV0dXJuIHQrZSpNYXRoLnRhbihNYXRoLlBJKm4oKSl9fXJldHVybiBlLnNvdXJjZT10LGV9KFZwKSxzZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgcj1uKCk7cmV0dXJuIHQrZSpNYXRoLmxvZyhyLygxLXIpKX19cmV0dXJuIGUuc291cmNlPXQsZX0oVnApLGxnPWZ1bmN0aW9uIHQobil7dmFyIGU9b2cuc291cmNlKG4pLHI9dWcuc291cmNlKG4pO2Z1bmN0aW9uIGkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBpPTAsbz10O28+MTY7KXt2YXIgYT1NYXRoLmZsb29yKC44NzUqbyksdT1lKGEpKCk7aWYodT5vKXJldHVybiBpK3IoYS0xLG8vdSkoKTtpKz1hLG8tPXV9Zm9yKHZhciBjPS1NYXRoLmxvZzFwKC1uKCkpLGY9MDtjPD1vOysrZiljLT1NYXRoLmxvZzFwKC1uKCkpO3JldHVybiBpK2Z9fXJldHVybiBpLnNvdXJjZT10LGl9KFZwKTtjb25zdCBoZz0xLzQyOTQ5NjcyOTY7ZnVuY3Rpb24gZGcodCxuKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLnJhbmdlKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5yYW5nZShuKS5kb21haW4odCl9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gcGcodCxuKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOmJyZWFrO2Nhc2UgMToiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmludGVycG9sYXRvcih0KTp0aGlzLnJhbmdlKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5kb21haW4odCksImZ1bmN0aW9uIj09dHlwZW9mIG4/dGhpcy5pbnRlcnBvbGF0b3Iobik6dGhpcy5yYW5nZShuKX1yZXR1cm4gdGhpc31jb25zdCBnZz1TeW1ib2woImltcGxpY2l0Iik7ZnVuY3Rpb24geWcoKXt2YXIgdD1uZXcgSW50ZXJuTWFwLG49W10sZT1bXSxyPWdnO2Z1bmN0aW9uIGkoaSl7bGV0IG89dC5nZXQoaSk7aWYodm9pZCAwPT09byl7aWYociE9PWdnKXJldHVybiByO3Quc2V0KGksbz1uLnB1c2goaSktMSl9cmV0dXJuIGVbbyVlLmxlbmd0aF19cmV0dXJuIGkuZG9tYWluPWZ1bmN0aW9uKGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuLnNsaWNlKCk7bj1bXSx0PW5ldyBJbnRlcm5NYXA7Zm9yKGNvbnN0IHIgb2YgZSl0LmhhcyhyKXx8dC5zZXQocixuLnB1c2gociktMSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9QXJyYXkuZnJvbSh0KSxpKTplLnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkpOnJ9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB5ZyhuLGUpLnVua25vd24ocil9LGRnLmFwcGx5KGksYXJndW1lbnRzKSxpfWZ1bmN0aW9uIHZnKCl7dmFyIHQsbixlPXlnKCkudW5rbm93bih2b2lkIDApLHI9ZS5kb21haW4saT1lLnJhbmdlLG89MCxhPTEsdT0hMSxjPTAsZj0wLHM9LjU7ZnVuY3Rpb24gbCgpe3ZhciBlPXIoKS5sZW5ndGgsbD1hPG8saD1sP2E6byxkPWw/bzphO3Q9KGQtaCkvTWF0aC5tYXgoMSxlLWMrMipmKSx1JiYodD1NYXRoLmZsb29yKHQpKSxoKz0oZC1oLXQqKGUtYykpKnMsbj10KigxLWMpLHUmJihoPU1hdGgucm91bmQoaCksbj1NYXRoLnJvdW5kKG4pKTt2YXIgcD1odChlKS5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBoK3Qqbn0pKTtyZXR1cm4gaShsP3AucmV2ZXJzZSgpOnApfXJldHVybiBkZWxldGUgZS51bmtub3duLGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLGwoKSk6cigpfSxlLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhbbyxhXT10LG89K28sYT0rYSxsKCkpOltvLGFdfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuW28sYV09dCxvPStvLGE9K2EsdT0hMCxsKCl9LGUuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGUuc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxlLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSEhdCxsKCkpOnV9LGUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1pbigxLGY9K3QpLGwoKSk6Y30sZS5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9TWF0aC5taW4oMSx0KSxsKCkpOmN9LGUucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSt0LGwoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLGwoKSk6c30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHZnKHIoKSxbbyxhXSkucm91bmQodSkucGFkZGluZ0lubmVyKGMpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihzKX0sZGcuYXBwbHkobCgpLGFyZ3VtZW50cyl9ZnVuY3Rpb24gX2codCl7dmFyIG49dC5jb3B5O3JldHVybiB0LnBhZGRpbmc9dC5wYWRkaW5nT3V0ZXIsZGVsZXRlIHQucGFkZGluZ0lubmVyLGRlbGV0ZSB0LnBhZGRpbmdPdXRlcix0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gX2cobigpKX0sdH1mdW5jdGlvbiBiZyh0KXtyZXR1cm4rdH12YXIgbWc9WzAsMV07ZnVuY3Rpb24geGcodCl7cmV0dXJuIHR9ZnVuY3Rpb24gd2codCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShpc05hTihuKT9OYU46LjUpfWZ1bmN0aW9uIE1nKHQsbixlKXt2YXIgcj10WzBdLGk9dFsxXSxvPW5bMF0sYT1uWzFdO3JldHVybiBpPHI/KHI9d2coaSxyKSxvPWUoYSxvKSk6KHI9d2cocixpKSxvPWUobyxhKSksZnVuY3Rpb24odCl7cmV0dXJuIG8ocih0KSl9fWZ1bmN0aW9uIFRnKHQsbixlKXt2YXIgcj1NYXRoLm1pbih0Lmxlbmd0aCxuLmxlbmd0aCktMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPS0xO2Zvcih0W3JdPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksbj1uLnNsaWNlKCkucmV2ZXJzZSgpKTsrK2E8cjspaVthXT13Zyh0W2FdLHRbYSsxXSksb1thXT1lKG5bYV0sblthKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bCh0LG4sMSxyKS0xO3JldHVybiBvW2VdKGlbZV0obikpfX1mdW5jdGlvbiBBZyh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBTZygpe3ZhciB0LG4sZSxyLGksbyxhPW1nLHU9bWcsYz1WcixmPXhnO2Z1bmN0aW9uIHMoKXt2YXIgdD1NYXRoLm1pbihhLmxlbmd0aCx1Lmxlbmd0aCk7cmV0dXJuIGYhPT14ZyYmKGY9ZnVuY3Rpb24odCxuKXt2YXIgZTtyZXR1cm4gdD5uJiYoZT10LHQ9bixuPWUpLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKG4sZSkpfX0oYVswXSxhW3QtMV0pKSxyPXQ+Mj9UZzpNZyxpPW89bnVsbCxsfWZ1bmN0aW9uIGwobil7cmV0dXJuIG51bGw9PW58fGlzTmFOKG49K24pP2U6KGl8fChpPXIoYS5tYXAodCksdSxjKSkpKHQoZihuKSkpfXJldHVybiBsLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZihuKChvfHwobz1yKHUsYS5tYXAodCksTHIpKSkoZSkpKX0sbC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9QXJyYXkuZnJvbSh0LGJnKSxzKCkpOmEuc2xpY2UoKX0sbC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1BcnJheS5mcm9tKHQpLHMoKSk6dS5zbGljZSgpfSxsLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHU9QXJyYXkuZnJvbSh0KSxjPVdyLHMoKX0sbC5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXR8fHhnLHMoKSk6ZiE9PXhnfSxsLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQscygpKTpjfSxsLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxsKTplfSxmdW5jdGlvbihlLHIpe3JldHVybiB0PWUsbj1yLHMoKX19ZnVuY3Rpb24gRWcoKXtyZXR1cm4gU2coKSh4Zyx4Zyl9ZnVuY3Rpb24gTmcobixlLHIsaSl7dmFyIG8sYT1aKG4sZSxyKTtzd2l0Y2goKGk9dGYobnVsbD09aT8iLGYiOmkpKS50eXBlKXtjYXNlInMiOnZhciB1PU1hdGgubWF4KE1hdGguYWJzKG4pLE1hdGguYWJzKGUpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89aGYoYSx1KSl8fChpLnByZWNpc2lvbj1vKSx0LmZvcm1hdFByZWZpeChpLHUpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihvPWRmKGEsTWF0aC5tYXgoTWF0aC5hYnMobiksTWF0aC5hYnMoZSkpKSl8fChpLnByZWNpc2lvbj1vLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKG89bGYoYSkpfHwoaS5wcmVjaXNpb249by0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQoaSl9ZnVuY3Rpb24ga2codCl7dmFyIG49dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIGU9bigpO3JldHVybiBWKGVbMF0sZVtlLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1uKCk7cmV0dXJuIE5nKHJbMF0scltyLmxlbmd0aC0xXSxudWxsPT10PzEwOnQsZSl9LHQubmljZT1mdW5jdGlvbihlKXtudWxsPT1lJiYoZT0xMCk7dmFyIHIsaSxvPW4oKSxhPTAsdT1vLmxlbmd0aC0xLGM9b1thXSxmPW9bdV0scz0xMDtmb3IoZjxjJiYoaT1jLGM9ZixmPWksaT1hLGE9dSx1PWkpO3MtLSA+MDspe2lmKChpPVcoYyxmLGUpKT09PXIpcmV0dXJuIG9bYV09YyxvW3VdPWYsbihvKTtpZihpPjApYz1NYXRoLmZsb29yKGMvaSkqaSxmPU1hdGguY2VpbChmL2kpKmk7ZWxzZXtpZighKGk8MCkpYnJlYWs7Yz1NYXRoLmNlaWwoYyppKS9pLGY9TWF0aC5mbG9vcihmKmkpL2l9cj1pfXJldHVybiB0fSx0fWZ1bmN0aW9uIENnKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gUGcodCl7cmV0dXJuIE1hdGgubG9nKHQpfWZ1bmN0aW9uIHpnKHQpe3JldHVybiBNYXRoLmV4cCh0KX1mdW5jdGlvbiAkZyh0KXtyZXR1cm4tTWF0aC5sb2coLXQpfWZ1bmN0aW9uIERnKHQpe3JldHVybi1NYXRoLmV4cCgtdCl9ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIEZnKHQpe3JldHVybihuLGUpPT4tdCgtbixlKX1mdW5jdGlvbiBxZyhuKXtjb25zdCBlPW4oUGcsemcpLHI9ZS5kb21haW47bGV0IGksbyxhPTEwO2Z1bmN0aW9uIHUoKXtyZXR1cm4gaT1mdW5jdGlvbih0KXtyZXR1cm4gdD09PU1hdGguRT9NYXRoLmxvZzoxMD09PXQmJk1hdGgubG9nMTB8fDI9PT10JiZNYXRoLmxvZzJ8fCh0PU1hdGgubG9nKHQpLG49Pk1hdGgubG9nKG4pL3QpfShhKSxvPWZ1bmN0aW9uKHQpe3JldHVybiAxMD09PXQ/Umc6dD09PU1hdGguRT9NYXRoLmV4cDpuPT5NYXRoLnBvdyh0LG4pfShhKSxyKClbMF08MD8oaT1GZyhpKSxvPUZnKG8pLG4oJGcsRGcpKTpuKFBnLHpnKSxlfXJldHVybiBlLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSgpKTphfSxlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSx1KCkpOnIoKX0sZS50aWNrcz10PT57Y29uc3Qgbj1yKCk7bGV0IGU9blswXSx1PW5bbi5sZW5ndGgtMV07Y29uc3QgYz11PGU7YyYmKFtlLHVdPVt1LGVdKTtsZXQgZixzLGw9aShlKSxoPWkodSk7Y29uc3QgZD1udWxsPT10PzEwOit0O2xldCBwPVtdO2lmKCEoYSUxKSYmaC1sPGQpe2lmKGw9TWF0aC5mbG9vcihsKSxoPU1hdGguY2VpbChoKSxlPjApe2Zvcig7bDw9aDsrK2wpZm9yKGY9MTtmPGE7KytmKWlmKHM9bDwwP2YvbygtbCk6ZipvKGwpLCEoczxlKSl7aWYocz51KWJyZWFrO3AucHVzaChzKX19ZWxzZSBmb3IoO2w8PWg7KytsKWZvcihmPWEtMTtmPj0xOy0tZilpZihzPWw+MD9mL28oLWwpOmYqbyhsKSwhKHM8ZSkpe2lmKHM+dSlicmVhaztwLnB1c2gocyl9MipwLmxlbmd0aDxkJiYocD1WKGUsdSxkKSl9ZWxzZSBwPVYobCxoLE1hdGgubWluKGgtbCxkKSkubWFwKG8pO3JldHVybiBjP3AucmV2ZXJzZSgpOnB9LGUudGlja0Zvcm1hdD0obixyKT0+e2lmKG51bGw9PW4mJihuPTEwKSxudWxsPT1yJiYocj0xMD09PWE/InMiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihhJTF8fG51bGwhPShyPXRmKHIpKS5wcmVjaXNpb258fChyLnRyaW09ITApLHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7Y29uc3QgdT1NYXRoLm1heCgxLGEqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gdD0+e2xldCBuPXQvbyhNYXRoLnJvdW5kKGkodCkpKTtyZXR1cm4gbiphPGEtLjUmJihuKj1hKSxuPD11P3IodCk6IiJ9fSxlLm5pY2U9KCk9PnIoQ2cocigpLHtmbG9vcjp0PT5vKE1hdGguZmxvb3IoaSh0KSkpLGNlaWw6dD0+byhNYXRoLmNlaWwoaSh0KSkpfSkpLGV9ZnVuY3Rpb24gVWcodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNpZ24obikqTWF0aC5sb2cxcChNYXRoLmFicyhuL3QpKX19ZnVuY3Rpb24gSWcodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNpZ24obikqTWF0aC5leHBtMShNYXRoLmFicyhuKSkqdH19ZnVuY3Rpb24gT2codCl7dmFyIG49MSxlPXQoVWcobiksSWcobikpO3JldHVybiBlLmNvbnN0YW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QoVWcobj0rZSksSWcobikpOm59LGtnKGUpfWZ1bmN0aW9uIEJnKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbjwwPy1NYXRoLnBvdygtbix0KTpNYXRoLnBvdyhuLHQpfX1mdW5jdGlvbiBZZyh0KXtyZXR1cm4gdDwwPy1NYXRoLnNxcnQoLXQpOk1hdGguc3FydCh0KX1mdW5jdGlvbiBMZyh0KXtyZXR1cm4gdDwwPy10KnQ6dCp0fWZ1bmN0aW9uIGpnKHQpe3ZhciBuPXQoeGcseGcpLGU9MTtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8xPT09KGU9K24pP3QoeGcseGcpOi41PT09ZT90KFlnLExnKTp0KEJnKGUpLEJnKDEvZSkpOmV9LGtnKG4pfWZ1bmN0aW9uIEhnKCl7dmFyIHQ9amcoU2coKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBBZyh0LEhnKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LGRnLmFwcGx5KHQsYXJndW1lbnRzKSx0fWZ1bmN0aW9uIFhnKHQpe3JldHVybiBNYXRoLnNpZ24odCkqdCp0fWNvbnN0IEdnPW5ldyBEYXRlLFZnPW5ldyBEYXRlO2Z1bmN0aW9uIFdnKHQsbixlLHIpe2Z1bmN0aW9uIGkobil7cmV0dXJuIHQobj0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrbikpLG59cmV0dXJuIGkuZmxvb3I9bj0+KHQobj1uZXcgRGF0ZSgrbikpLG4pLGkuY2VpbD1lPT4odChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGUpLGkucm91bmQ9dD0+e2NvbnN0IG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PSh0LGUpPT4obih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdCksaS5yYW5nZT0oZSxyLG8pPT57Y29uc3QgYT1bXTtpZihlPWkuY2VpbChlKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEoZTxyJiZvPjApKXJldHVybiBhO2xldCB1O2Rve2EucHVzaCh1PW5ldyBEYXRlKCtlKSksbihlLG8pLHQoZSl9d2hpbGUodTxlJiZlPHIpO3JldHVybiBhfSxpLmZpbHRlcj1lPT5XZygobj0+e2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0pLCgodCxyKT0+e2lmKHQ+PXQpaWYocjwwKWZvcig7KytyPD0wOylmb3IoO24odCwtMSksIWUodCk7KTtlbHNlIGZvcig7LS1yPj0wOylmb3IoO24odCwxKSwhZSh0KTspO30pKSxlJiYoaS5jb3VudD0obixyKT0+KEdnLnNldFRpbWUoK24pLFZnLnNldFRpbWUoK3IpLHQoR2cpLHQoVmcpLE1hdGguZmxvb3IoZShHZyxWZykpKSxpLmV2ZXJ5PXQ9Pih0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/aS5maWx0ZXIocj9uPT5yKG4pJXQ9PTA6bj0+aS5jb3VudCgwLG4pJXQ9PTApOmk6bnVsbCkpLGl9Y29uc3QgWmc9V2coKCgpPT57fSksKCh0LG4pPT57dC5zZXRUaW1lKCt0K24pfSksKCh0LG4pPT5uLXQpKTtaZy5ldmVyeT10PT4odD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP1dnKChuPT57bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0pLCgobixlKT0+e24uc2V0VGltZSgrbitlKnQpfSksKChuLGUpPT4oZS1uKS90KSk6Wmc6bnVsbCk7Y29uc3QgS2c9WmcucmFuZ2UsUWc9MWUzLEpnPTZlNCx0eT02MCpKZyxueT0yNCp0eSxleT03Km55LHJ5PTMwKm55LGl5PTM2NSpueSxveT1XZygodD0+e3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCkpfSksKCh0LG4pPT57dC5zZXRUaW1lKCt0K24qUWcpfSksKCh0LG4pPT4obi10KS9RZyksKHQ9PnQuZ2V0VVRDU2Vjb25kcygpKSksYXk9b3kucmFuZ2UsdXk9V2coKHQ9Pnt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpLXQuZ2V0U2Vjb25kcygpKlFnKX0pLCgodCxuKT0+e3Quc2V0VGltZSgrdCtuKkpnKX0pLCgodCxuKT0+KG4tdCkvSmcpLCh0PT50LmdldE1pbnV0ZXMoKSkpLGN5PXV5LnJhbmdlLGZ5PVdnKCh0PT57dC5zZXRVVENTZWNvbmRzKDAsMCl9KSwoKHQsbik9Pnt0LnNldFRpbWUoK3QrbipKZyl9KSwoKHQsbik9PihuLXQpL0pnKSwodD0+dC5nZXRVVENNaW51dGVzKCkpKSxzeT1meS5yYW5nZSxseT1XZygodD0+e3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqUWctdC5nZXRNaW51dGVzKCkqSmcpfSksKCh0LG4pPT57dC5zZXRUaW1lKCt0K24qdHkpfSksKCh0LG4pPT4obi10KS90eSksKHQ9PnQuZ2V0SG91cnMoKSkpLGh5PWx5LnJhbmdlLGR5PVdnKCh0PT57dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VGltZSgrdCtuKnR5KX0pLCgodCxuKT0+KG4tdCkvdHkpLCh0PT50LmdldFVUQ0hvdXJzKCkpKSxweT1keS5yYW5nZSxneT1XZygodD0+dC5zZXRIb3VycygwLDAsMCwwKSksKCh0LG4pPT50LnNldERhdGUodC5nZXREYXRlKCkrbikpLCgodCxuKT0+KG4tdC0obi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqSmcpL255KSwodD0+dC5nZXREYXRlKCktMSkpLHl5PWd5LnJhbmdlLHZ5PVdnKCh0PT57dC5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStuKX0pLCgodCxuKT0+KG4tdCkvbnkpLCh0PT50LmdldFVUQ0RhdGUoKS0xKSksX3k9dnkucmFuZ2UsYnk9V2coKHQ9Pnt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKCh0LG4pPT57dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSksKCh0LG4pPT4obi10KS9ueSksKHQ9Pk1hdGguZmxvb3IodC9ueSkpKSxteT1ieS5yYW5nZTtmdW5jdGlvbiB4eSh0KXtyZXR1cm4gV2coKG49PntuLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrNy10KSU3KSxuLnNldEhvdXJzKDAsMCwwLDApfSksKCh0LG4pPT57dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqbil9KSwoKHQsbik9PihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKkpnKS9leSkpfWNvbnN0IHd5PXh5KDApLE15PXh5KDEpLFR5PXh5KDIpLEF5PXh5KDMpLFN5PXh5KDQpLEV5PXh5KDUpLE55PXh5KDYpLGt5PXd5LnJhbmdlLEN5PU15LnJhbmdlLFB5PVR5LnJhbmdlLHp5PUF5LnJhbmdlLCR5PVN5LnJhbmdlLER5PUV5LnJhbmdlLFJ5PU55LnJhbmdlO2Z1bmN0aW9uIEZ5KHQpe3JldHVybiBXZygobj0+e24uc2V0VVRDRGF0ZShuLmdldFVUQ0RhdGUoKS0obi5nZXRVVENEYXkoKSs3LXQpJTcpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoKHQsbik9Pnt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0pLCgodCxuKT0+KG4tdCkvZXkpKX1jb25zdCBxeT1GeSgwKSxVeT1GeSgxKSxJeT1GeSgyKSxPeT1GeSgzKSxCeT1GeSg0KSxZeT1GeSg1KSxMeT1GeSg2KSxqeT1xeS5yYW5nZSxIeT1VeS5yYW5nZSxYeT1JeS5yYW5nZSxHeT1PeS5yYW5nZSxWeT1CeS5yYW5nZSxXeT1ZeS5yYW5nZSxaeT1MeS5yYW5nZSxLeT1XZygodD0+e3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKCh0LG4pPT57dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9KSwoKHQsbik9Pm4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpKSwodD0+dC5nZXRNb250aCgpKSksUXk9S3kucmFuZ2UsSnk9V2coKHQ9Pnt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSksKCh0LG4pPT5uLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKSksKHQ9PnQuZ2V0VVRDTW9udGgoKSkpLHR2PUp5LnJhbmdlLG52PVdnKCh0PT57dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoKHQsbik9Pnt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStuKX0pLCgodCxuKT0+bi5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSksKHQ9PnQuZ2V0RnVsbFllYXIoKSkpO252LmV2ZXJ5PXQ9PmlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9XZygobj0+e24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9KSwoKG4sZSk9PntuLnNldEZ1bGxZZWFyKG4uZ2V0RnVsbFllYXIoKStlKnQpfSkpOm51bGw7Y29uc3QgZXY9bnYucmFuZ2UscnY9V2coKHQ9Pnt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgodCxuKT0+e3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSksKCh0LG4pPT5uLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKSwodD0+dC5nZXRVVENGdWxsWWVhcigpKSk7cnYuZXZlcnk9dD0+aXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1dnKChuPT57bi5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxuLnNldFVUQ01vbnRoKDAsMSksbi5zZXRVVENIb3VycygwLDAsMCwwKX0pLCgobixlKT0+e24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KSk6bnVsbDtjb25zdCBpdj1ydi5yYW5nZTtmdW5jdGlvbiBvdih0LG4sZSxpLG8sYSl7Y29uc3QgdT1bW295LDEsUWddLFtveSw1LDVlM10sW295LDE1LDE1ZTNdLFtveSwzMCwzZTRdLFthLDEsSmddLFthLDUsNSpKZ10sW2EsMTUsMTUqSmddLFthLDMwLDMwKkpnXSxbbywxLHR5XSxbbywzLDMqdHldLFtvLDYsNip0eV0sW28sMTIsMTIqdHldLFtpLDEsbnldLFtpLDIsMipueV0sW2UsMSxleV0sW24sMSxyeV0sW24sMywzKnJ5XSxbdCwxLGl5XV07ZnVuY3Rpb24gYyhuLGUsaSl7Y29uc3Qgbz1NYXRoLmFicyhlLW4pL2ksYT1yKCgoWywsdF0pPT50KSkucmlnaHQodSxvKTtpZihhPT09dS5sZW5ndGgpcmV0dXJuIHQuZXZlcnkoWihuL2l5LGUvaXksaSkpO2lmKDA9PT1hKXJldHVybiBaZy5ldmVyeShNYXRoLm1heChaKG4sZSxpKSwxKSk7Y29uc3RbYyxmXT11W28vdVthLTFdWzJdPHVbYV1bMl0vbz9hLTE6YV07cmV0dXJuIGMuZXZlcnkoZil9cmV0dXJuW2Z1bmN0aW9uKHQsbixlKXtjb25zdCByPW48dDtyJiYoW3Qsbl09W24sdF0pO2NvbnN0IGk9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucmFuZ2U/ZTpjKHQsbixlKSxvPWk/aS5yYW5nZSh0LCtuKzEpOltdO3JldHVybiByP28ucmV2ZXJzZSgpOm99LGNdfWNvbnN0W2F2LHV2XT1vdihydixKeSxxeSxieSxkeSxmeSksW2N2LGZ2XT1vdihudixLeSx3eSxneSxseSx1eSk7ZnVuY3Rpb24gc3YodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIGx2KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIGh2KHQsbixlKXtyZXR1cm57eTp0LG06bixkOmUsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBkdih0KXt2YXIgbj10LmRhdGVUaW1lLGU9dC5kYXRlLHI9dC50aW1lLGk9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMsdT10Lm1vbnRocyxjPXQuc2hvcnRNb250aHMsZj14dihpKSxzPXd2KGkpLGw9eHYobyksaD13dihvKSxkPXh2KGEpLHA9d3YoYSksZz14dih1KSx5PXd2KHUpLHY9eHYoYyksXz13dihjKSxiPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6THYsZTpMdixmOlZ2LGc6b18sRzp1XyxIOmp2LEk6SHYsajpYdixMOkd2LG06V3YsTTpadixwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRIb3VycygpPj0xMildfSxxOmZ1bmN0aW9uKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTpDXyxzOlBfLFM6S3YsdTpRdixVOkp2LFY6bl8sdzplXyxXOnJfLHg6bnVsbCxYOm51bGwseTppXyxZOmFfLFo6Y18sIiUiOmtffSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6Zl8sZTpmXyxmOnBfLGc6QV8sRzpFXyxIOnNfLEk6bF8sajpoXyxMOmRfLG06Z18sTTp5XyxwOmZ1bmN0aW9uKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxxOmZ1bmN0aW9uKHQpe3JldHVybiAxK35+KHQuZ2V0VVRDTW9udGgoKS8zKX0sUTpDXyxzOlBfLFM6dl8sdTpfXyxVOmJfLFY6eF8sdzp3XyxXOk1fLHg6bnVsbCxYOm51bGwseTpUXyxZOlNfLFo6Tl8sIiUiOmtffSx4PXthOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1kLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1wLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj12LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1fLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxCOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1nLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT15LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVCh0LG4sZSxyKX0sZDokdixlOiR2LGY6SXYsZzprdixHOk52LEg6UnYsSTpSdixqOkR2LEw6VXYsbTp6dixNOkZ2LHA6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5wPXMuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9LHE6UHYsUTpCdixzOll2LFM6cXYsdTpUdixVOkF2LFY6U3YsdzpNdixXOkV2LHg6ZnVuY3Rpb24odCxuLHIpe3JldHVybiBUKHQsZSxuLHIpfSxYOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gVCh0LHIsbixlKX0seTprdixZOk52LFo6Q3YsIiUiOk92fTtmdW5jdGlvbiB3KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyxhPVtdLHU9LTEsYz0wLGY9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrdTxmOykzNz09PXQuY2hhckNvZGVBdCh1KSYmKGEucHVzaCh0LnNsaWNlKGMsdSkpLG51bGwhPShpPWd2W3I9dC5jaGFyQXQoKyt1KV0pP3I9dC5jaGFyQXQoKyt1KTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSxhLnB1c2gociksYz11KzEpO3JldHVybiBhLnB1c2godC5zbGljZShjLHUpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBNKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbz1odigxOTAwLHZvaWQgMCwxKTtpZihUKG8sdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicyJpbiBvKXJldHVybiBuZXcgRGF0ZSgxZTMqby5zKygiTCJpbiBvP28uTDowKSk7aWYobiYmISgiWiJpbiBvKSYmKG8uWj0wKSwicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLHZvaWQgMD09PW8ubSYmKG8ubT0icSJpbiBvP28ucTowKSwiViJpbiBvKXtpZihvLlY8MXx8by5WPjUzKXJldHVybiBudWxsOyJ3ImluIG98fChvLnc9MSksIloiaW4gbz8oaT0ocj1sdihodihvLnksMCwxKSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9VeS5jZWlsKHIpOlV5KHIpLHI9dnkub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9c3YoaHYoby55LDAsMSkpKS5nZXREYXkoKSxyPWk+NHx8MD09PWk/TXkuY2VpbChyKTpNeShyKSxyPWd5Lm9mZnNldChyLDcqKG8uVi0xKSksby55PXIuZ2V0RnVsbFllYXIoKSxvLm09ci5nZXRNb250aCgpLG8uZD1yLmdldERhdGUoKSsoby53KzYpJTcpfWVsc2UoIlciaW4gb3x8IlUiaW4gbykmJigidyJpbiBvfHwoby53PSJ1ImluIG8/by51JTc6IlciaW4gbz8xOjApLGk9IloiaW4gbz9sdihodihvLnksMCwxKSkuZ2V0VVRDRGF5KCk6c3YoaHYoby55LDAsMSkpLmdldERheSgpLG8ubT0wLG8uZD0iVyJpbiBvPyhvLncrNiklNys3Km8uVy0oaSs1KSU3Om8udys3Km8uVS0oaSs2KSU3KTtyZXR1cm4iWiJpbiBvPyhvLkgrPW8uWi8xMDB8MCxvLk0rPW8uWiUxMDAsbHYobykpOnN2KG8pfX1mdW5jdGlvbiBUKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGM9ZS5sZW5ndGg7YTx1Oyl7aWYocj49YylyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gZ3Y/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLCExKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLCEwKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19dmFyIHB2LGd2PXsiLSI6IiIsXzoiICIsMDoiMCJ9LHl2PS9eXHMqXGQrLyx2dj0vXiUvLF92PS9bXFxeJCorP3xbXF0oKS57fV0vZztmdW5jdGlvbiBidih0LG4sZSl7dmFyIHI9dDwwPyItIjoiIixpPShyPy10OnQpKyIiLG89aS5sZW5ndGg7cmV0dXJuIHIrKG88ZT9uZXcgQXJyYXkoZS1vKzEpLmpvaW4obikraTppKX1mdW5jdGlvbiBtdih0KXtyZXR1cm4gdC5yZXBsYWNlKF92LCJcXCQmIil9ZnVuY3Rpb24geHYodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKG12KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gd3YodCl7cmV0dXJuIG5ldyBNYXAodC5tYXAoKCh0LG4pPT5bdC50b0xvd2VyQ2FzZSgpLG5dKSkpfWZ1bmN0aW9uIE12KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFR2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC51PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEF2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFN2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5WPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEV2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIE52KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGt2KHQsbixlKXt2YXIgcj15di5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQ3YodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5aPXJbMV0/MDotKHJbMl0rKHJbM118fCIwMCIpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBQdih0LG4sZSl7dmFyIHI9eXYuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQucT0zKnJbMF0tMyxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB6dih0LG4sZSl7dmFyIHI9eXYuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRHYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lm09MCx0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUnYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRnYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcXYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gVXYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSXYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Lkw9TWF0aC5mbG9vcihyWzBdLzFlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gT3YodCxuLGUpe3ZhciByPXZ2LmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gQnYodCxuLGUpe3ZhciByPXl2LmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBZdih0LG4sZSl7dmFyIHI9eXYuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5zPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEx2KHQsbil7cmV0dXJuIGJ2KHQuZ2V0RGF0ZSgpLG4sMil9ZnVuY3Rpb24ganYodCxuKXtyZXR1cm4gYnYodC5nZXRIb3VycygpLG4sMil9ZnVuY3Rpb24gSHYodCxuKXtyZXR1cm4gYnYodC5nZXRIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIFh2KHQsbil7cmV0dXJuIGJ2KDErZ3kuY291bnQobnYodCksdCksbiwzKX1mdW5jdGlvbiBHdih0LG4pe3JldHVybiBidih0LmdldE1pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gVnYodCxuKXtyZXR1cm4gR3YodCxuKSsiMDAwIn1mdW5jdGlvbiBXdih0LG4pe3JldHVybiBidih0LmdldE1vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIFp2KHQsbil7cmV0dXJuIGJ2KHQuZ2V0TWludXRlcygpLG4sMil9ZnVuY3Rpb24gS3YodCxuKXtyZXR1cm4gYnYodC5nZXRTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBRdih0KXt2YXIgbj10LmdldERheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gSnYodCxuKXtyZXR1cm4gYnYod3kuY291bnQobnYodCktMSx0KSxuLDIpfWZ1bmN0aW9uIHRfKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIG4+PTR8fDA9PT1uP1N5KHQpOlN5LmNlaWwodCl9ZnVuY3Rpb24gbl8odCxuKXtyZXR1cm4gdD10Xyh0KSxidihTeS5jb3VudChudih0KSx0KSsoND09PW52KHQpLmdldERheSgpKSxuLDIpfWZ1bmN0aW9uIGVfKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIHJfKHQsbil7cmV0dXJuIGJ2KE15LmNvdW50KG52KHQpLTEsdCksbiwyKX1mdW5jdGlvbiBpXyh0LG4pe3JldHVybiBidih0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gb18odCxuKXtyZXR1cm4gYnYoKHQ9dF8odCkpLmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24gYV8odCxuKXtyZXR1cm4gYnYodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIHVfKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gYnYoKHQ9ZT49NHx8MD09PWU/U3kodCk6U3kuY2VpbCh0KSkuZ2V0RnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBjXyh0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKG4+MD8iLSI6KG4qPS0xLCIrIikpK2J2KG4vNjB8MCwiMCIsMikrYnYobiU2MCwiMCIsMil9ZnVuY3Rpb24gZl8odCxuKXtyZXR1cm4gYnYodC5nZXRVVENEYXRlKCksbiwyKX1mdW5jdGlvbiBzXyh0LG4pe3JldHVybiBidih0LmdldFVUQ0hvdXJzKCksbiwyKX1mdW5jdGlvbiBsXyh0LG4pe3JldHVybiBidih0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gaF8odCxuKXtyZXR1cm4gYnYoMSt2eS5jb3VudChydih0KSx0KSxuLDMpfWZ1bmN0aW9uIGRfKHQsbil7cmV0dXJuIGJ2KHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBwXyh0LG4pe3JldHVybiBkXyh0LG4pKyIwMDAifWZ1bmN0aW9uIGdfKHQsbil7cmV0dXJuIGJ2KHQuZ2V0VVRDTW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geV8odCxuKXtyZXR1cm4gYnYodC5nZXRVVENNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB2Xyh0LG4pe3JldHVybiBidih0LmdldFVUQ1NlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIF9fKHQpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBiXyh0LG4pe3JldHVybiBidihxeS5jb3VudChydih0KS0xLHQpLG4sMil9ZnVuY3Rpb24gbV8odCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gbj49NHx8MD09PW4/QnkodCk6QnkuY2VpbCh0KX1mdW5jdGlvbiB4Xyh0LG4pe3JldHVybiB0PW1fKHQpLGJ2KEJ5LmNvdW50KHJ2KHQpLHQpKyg0PT09cnYodCkuZ2V0VVRDRGF5KCkpLG4sMil9ZnVuY3Rpb24gd18odCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24gTV8odCxuKXtyZXR1cm4gYnYoVXkuY291bnQocnYodCktMSx0KSxuLDIpfWZ1bmN0aW9uIFRfKHQsbil7cmV0dXJuIGJ2KHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBBXyh0LG4pe3JldHVybiBidigodD1tXyh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBTXyh0LG4pe3JldHVybiBidih0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gRV8odCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiBidigodD1lPj00fHwwPT09ZT9CeSh0KTpCeS5jZWlsKHQpKS5nZXRVVENGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIE5fKCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiBrXygpe3JldHVybiIlIn1mdW5jdGlvbiBDXyh0KXtyZXR1cm4rdH1mdW5jdGlvbiBQXyh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfWZ1bmN0aW9uIHpfKG4pe3JldHVybiBwdj1kdihuKSx0LnRpbWVGb3JtYXQ9cHYuZm9ybWF0LHQudGltZVBhcnNlPXB2LnBhcnNlLHQudXRjRm9ybWF0PXB2LnV0Y0Zvcm1hdCx0LnV0Y1BhcnNlPXB2LnV0Y1BhcnNlLHB2fXQudGltZUZvcm1hdD12b2lkIDAsdC50aW1lUGFyc2U9dm9pZCAwLHQudXRjRm9ybWF0PXZvaWQgMCx0LnV0Y1BhcnNlPXZvaWQgMCx6Xyh7ZGF0ZVRpbWU6IiV4LCAlWCIsZGF0ZToiJS1tLyUtZC8lWSIsdGltZToiJS1JOiVNOiVTICVwIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3ZhciAkXz0iJVktJW0tJWRUJUg6JU06JVMuJUxaIjt2YXIgRF89RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoJF8pLFJfPURfO3ZhciBGXz0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoJF8pLHFfPUZfO2Z1bmN0aW9uIFVfKHQpe3JldHVybiBuZXcgRGF0ZSh0KX1mdW5jdGlvbiBJXyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/K3Q6K25ldyBEYXRlKCt0KX1mdW5jdGlvbiBPXyh0LG4sZSxyLGksbyxhLHUsYyxmKXt2YXIgcz1FZygpLGw9cy5pbnZlcnQsaD1zLmRvbWFpbixkPWYoIi4lTCIpLHA9ZigiOiVTIiksZz1mKCIlSTolTSIpLHk9ZigiJUkgJXAiKSx2PWYoIiVhICVkIiksXz1mKCIlYiAlZCIpLGI9ZigiJUIiKSxtPWYoIiVZIik7ZnVuY3Rpb24geCh0KXtyZXR1cm4oYyh0KTx0P2Q6dSh0KTx0P3A6YSh0KTx0P2c6byh0KTx0P3k6cih0KTx0P2kodCk8dD92Ol86ZSh0KTx0P2I6bSkodCl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChBcnJheS5mcm9tKHQsSV8pKTpoKCkubWFwKFVfKX0scy50aWNrcz1mdW5jdGlvbihuKXt2YXIgZT1oKCk7cmV0dXJuIHQoZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PW4/MTA6bil9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP3g6ZihuKX0scy5uaWNlPWZ1bmN0aW9uKHQpe3ZhciBlPWgoKTtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQucmFuZ2V8fCh0PW4oZVswXSxlW2UubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCkpLHQ/aChDZyhlLHQpKTpzfSxzLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQWcocyxPXyh0LG4sZSxyLGksbyxhLHUsYyxmKSl9LHN9ZnVuY3Rpb24gQl8oKXt2YXIgdCxuLGUscixpLG89MCxhPTEsdT14ZyxjPSExO2Z1bmN0aW9uIGYobil7cmV0dXJuIG51bGw9PW58fGlzTmFOKG49K24pP2k6dSgwPT09ZT8uNToobj0ocihuKS10KSplLGM/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKTpuKSl9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGUscjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oW2Uscl09bix1PXQoZSxyKSxmKTpbdSgwKSx1KDEpXX19cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhbbyxhXT1pLHQ9cihvPStvKSxuPXIoYT0rYSksZT10PT09bj8wOjEvKG4tdCksZik6W28sYV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ISF0LGYpOmN9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZik6dX0sZi5yYW5nZT1zKFZyKSxmLnJhbmdlUm91bmQ9cyhXciksZi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZik6aX0sZnVuY3Rpb24oaSl7cmV0dXJuIHI9aSx0PWkobyksbj1pKGEpLGU9dD09PW4/MDoxLyhuLXQpLGZ9fWZ1bmN0aW9uIFlfKHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLmludGVycG9sYXRvcih0LmludGVycG9sYXRvcigpKS5jbGFtcCh0LmNsYW1wKCkpLnVua25vd24odC51bmtub3duKCkpfWZ1bmN0aW9uIExfKCl7dmFyIHQ9amcoQl8oKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBZXyh0LExfKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LHBnLmFwcGx5KHQsYXJndW1lbnRzKX1mdW5jdGlvbiBqXygpe3ZhciB0LG4sZSxyLGksbyxhLHU9MCxjPS41LGY9MSxzPTEsbD14ZyxoPSExO2Z1bmN0aW9uIGQodCl7cmV0dXJuIGlzTmFOKHQ9K3QpP2E6KHQ9LjUrKCh0PStvKHQpKS1uKSoocyp0PHMqbj9yOmkpLGwoaD9NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpOnQpKX1mdW5jdGlvbiBwKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFtlLHIsaV09bixsPXBpKHQsW2UscixpXSksZCk6W2woMCksbCguNSksbCgxKV19fXJldHVybiBkLmRvbWFpbj1mdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oW3UsYyxmXT1hLHQ9byh1PSt1KSxuPW8oYz0rYyksZT1vKGY9K2YpLHI9dD09PW4/MDouNS8obi10KSxpPW49PT1lPzA6LjUvKGUtbikscz1uPHQ/LTE6MSxkKTpbdSxjLGZdfSxkLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSEhdCxkKTpofSxkLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LGQpOmx9LGQucmFuZ2U9cChWciksZC5yYW5nZVJvdW5kPXAoV3IpLGQudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGQpOmF9LGZ1bmN0aW9uKGEpe3JldHVybiBvPWEsdD1hKHUpLG49YShjKSxlPWEoZikscj10PT09bj8wOi41LyhuLXQpLGk9bj09PWU/MDouNS8oZS1uKSxzPW48dD8tMToxLGR9fWZ1bmN0aW9uIEhfKCl7dmFyIHQ9amcoal8oKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBZXyh0LEhfKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LHBnLmFwcGx5KHQsYXJndW1lbnRzKX1mdW5jdGlvbiBYXyh0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgR189WF8oIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLFZfPVhfKCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxXXz1YXygiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IiksWl89WF8oImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLEtfPVhfKCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxRXz1YXygiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIiksSl89WF8oImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLHRiPVhfKCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxuYj1YXygiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIiksZWI9WF8oIjRlNzlhN2YyOGUyY2UxNTc1OTc2YjdiMjU5YTE0ZmVkYzk0OWFmN2FhMWZmOWRhNzljNzU1ZmJhYjBhYiIpLHJiPXQ9PnFyKHRbdC5sZW5ndGgtMV0pLGliPW5ldyBBcnJheSgzKS5jb25jYXQoImQ4YjM2NWY1ZjVmNTVhYjRhYyIsImE2NjExYWRmYzI3ZDgwY2RjMTAxODU3MSIsImE2NjExYWRmYzI3ZGY1ZjVmNTgwY2RjMTAxODU3MSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2M3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2Y1ZjVmNWM3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIpLm1hcChYXyksb2I9cmIoaWIpLGFiPW5ldyBBcnJheSgzKS5jb25jYXQoImFmOGRjM2Y3ZjdmNzdmYmY3YiIsIjdiMzI5NGMyYTVjZmE2ZGJhMDAwODgzNyIsIjdiMzI5NGMyYTVjZmY3ZjdmN2E2ZGJhMDAwODgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGQ5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGY3ZjdmN2Q5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIpLm1hcChYXyksdWI9cmIoYWIpLGNiPW5ldyBBcnJheSgzKS5jb25jYXQoImU5YTNjOWY3ZjdmN2ExZDc2YSIsImQwMWM4YmYxYjZkYWI4ZTE4NjRkYWMyNiIsImQwMWM4YmYxYjZkYWY3ZjdmN2I4ZTE4NjRkYWMyNiIsImM1MWI3ZGU5YTNjOWZkZTBlZmU2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGU5YTNjOWZkZTBlZmY3ZjdmN2U2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIpLm1hcChYXyksZmI9cmIoY2IpLHNiPW5ldyBBcnJheSgzKS5jb25jYXQoIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsIjVlM2M5OWIyYWJkMmZkYjg2M2U2NjEwMSIsIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMSIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIpLm1hcChYXyksbGI9cmIoc2IpLGhiPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmY3ZjdmNzY3YTljZiIsImNhMDAyMGY0YTU4MjkyYzVkZTA1NzFiMCIsImNhMDAyMGY0YTU4MmY3ZjdmNzkyYzVkZTA1NzFiMCIsImIyMTgyYmVmOGE2MmZkZGJjN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmVmOGE2MmZkZGJjN2Y3ZjdmN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIpLm1hcChYXyksZGI9cmIoaGIpLHBiPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmZmZmZmZjk5OTk5OSIsImNhMDAyMGY0YTU4MmJhYmFiYTQwNDA0MCIsImNhMDAyMGY0YTU4MmZmZmZmZmJhYmFiYTQwNDA0MCIsImIyMTgyYmVmOGE2MmZkZGJjN2UwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmVmOGE2MmZkZGJjN2ZmZmZmZmUwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIpLm1hcChYXyksZ2I9cmIocGIpLHliPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxYmZkYiIsImQ3MTkxY2ZkYWU2MWFiZDllOTJjN2JiNiIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNiIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGZmZmZiZmUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIpLm1hcChYXyksdmI9cmIoeWIpLF9iPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxY2Y2MCIsImQ3MTkxY2ZkYWU2MWE2ZDk2YTFhOTY0MSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmE2ZDk2YTFhOTY0MSIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmZmZmZiZmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIpLm1hcChYXyksYmI9cmIoX2IpLG1iPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjk5ZDU5NCIsImQ3MTkxY2ZkYWU2MWFiZGRhNDJiODNiYSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYSIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmZmZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIpLm1hcChYXykseGI9cmIobWIpLHdiPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVmOTk5ZDhjOTJjYTI1ZiIsImVkZjhmYmIyZTJlMjY2YzJhNDIzOGI0NSIsImVkZjhmYmIyZTJlMjY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChYXyksTWI9cmIod2IpLFRiPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZWNmNDllYmNkYTg4NTZhNyIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NDE5ZCIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDgxMGY3YzRkMDA0YiIpLm1hcChYXyksQWI9cmIoVGIpLFNiPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZjNkYmE4ZGRiNTQzYTJjYSIsImYwZjllOGJhZTRiYzdiY2NjNDJiOGNiZSIsImYwZjllOGJhZTRiYzdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NjhhYzA4NDA4MSIpLm1hcChYXyksRWI9cmIoU2IpLE5iPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZThjOGZkYmI4NGUzNGEzMyIsImZlZjBkOWZkY2M4YWZjOGQ1OWQ3MzAxZiIsImZlZjBkOWZkY2M4YWZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZmIzMDAwMDdmMDAwMCIpLm1hcChYXyksa2I9cmIoTmIpLENiPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTJmMGE2YmRkYjFjOTA5OSIsImY2ZWZmN2JkYzllMTY3YTljZjAyODE4YSIsImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNmM1OTAxNDYzNiIpLm1hcChYXyksUGI9cmIoQ2IpLHpiPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTdmMmE2YmRkYjJiOGNiZSIsImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIsImYxZWVmNmJkYzllMTc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDA0NWE4ZDAyMzg1OCIpLm1hcChYXyksJGI9cmIoemIpLERiPW5ldyBBcnJheSgzKS5jb25jYXQoImU3ZTFlZmM5OTRjN2RkMWM3NyIsImYxZWVmNmQ3YjVkOGRmNjViMGNlMTI1NiIsImYxZWVmNmQ3YjVkOGRmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1Njk4MDA0MzY3MDAxZiIpLm1hcChYXyksUmI9cmIoRGIpLEZiPW5ldyBBcnJheSgzKS5jb25jYXQoImZkZTBkZGZhOWZiNWM1MWI4YSIsImZlZWJlMmZiYjRiOWY3NjhhMWFlMDE3ZSIsImZlZWJlMmZiYjRiOWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NzQ5MDA2YSIpLm1hcChYXykscWI9cmIoRmIpLFViPW5ldyBBcnJheSgzKS5jb25jYXQoImVkZjhiMTdmY2RiYjJjN2ZiOCIsImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsImZmZmZjY2ExZGFiNDQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODI1MzQ5NDA4MWQ1OCIpLm1hcChYXyksSWI9cmIoVWIpLE9iPW5ldyBBcnJheSgzKS5jb25jYXQoImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsImZmZmZjY2MyZTY5OTc4YzY3OTIzODQ0MyIsImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIpLm1hcChYXyksQmI9cmIoT2IpLFliPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZjdiY2ZlYzQ0ZmQ5NWYwZSIsImZmZmZkNGZlZDk4ZWZlOTkyOWNjNGMwMiIsImZmZmZkNGZlZDk4ZWZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjk5MzQwNDY2MjUwNiIpLm1hcChYXyksTGI9cmIoWWIpLGpiPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZWRhMGZlYjI0Y2YwM2IyMCIsImZmZmZiMmZlY2M1Y2ZkOGQzY2UzMWExYyIsImZmZmZiMmZlY2M1Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2JkMDAyNjgwMDAyNiIpLm1hcChYXyksSGI9cmIoamIpLFhiPW5ldyBBcnJheSgzKS5jb25jYXQoImRlZWJmNzllY2FlMTMxODJiZCIsImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNSIsImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YiIpLm1hcChYXyksR2I9cmIoWGIpLFZiPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVlMGExZDk5YjMxYTM1NCIsImVkZjhlOWJhZTRiMzc0YzQ3NjIzOGI0NSIsImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChYXyksV2I9cmIoVmIpLFpiPW5ldyBBcnJheSgzKS5jb25jYXQoImYwZjBmMGJkYmRiZDYzNjM2MyIsImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNTAwMDAwMCIpLm1hcChYXyksS2I9cmIoWmIpLFFiPW5ldyBBcnJheSgzKS5jb25jYXQoImVmZWRmNWJjYmRkYzc1NmJiMSIsImYyZjBmN2NiYzllMjllOWFjODZhNTFhMyIsImYyZjBmN2NiYzllMjllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzU0Mjc4ZjNmMDA3ZCIpLm1hcChYXyksSmI9cmIoUWIpLHRtPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTBkMmZjOTI3MmRlMmQyNiIsImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIpLm1hcChYXyksbm09cmIodG0pLGVtPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTZjZWZkYWU2YmU2NTUwZCIsImZlZWRkZWZkYmU4NWZkOGQzY2Q5NDcwMSIsImZlZWRkZWZkYmU4NWZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMWE2MzYwMzdmMjcwNCIpLm1hcChYXykscm09cmIoZW0pO3ZhciBpbT1kaShBcigzMDAsLjUsMCksQXIoLTI0MCwuNSwxKSksb209ZGkoQXIoLTEwMCwuNzUsLjM1KSxBcig4MCwxLjUsLjgpKSxhbT1kaShBcigyNjAsLjc1LC4zNSksQXIoODAsMS41LC44KSksdW09QXIoKTt2YXIgY209cWUoKSxmbT1NYXRoLlBJLzMsc209MipNYXRoLlBJLzM7ZnVuY3Rpb24gbG0odCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGhtPWxtKFhfKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksZG09bG0oWF8oIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxwbT1sbShYXygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLGdtPWxtKFhfKCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24geW0odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWNvbnN0IHZtPU1hdGguYWJzLF9tPU1hdGguYXRhbjIsYm09TWF0aC5jb3MsbW09TWF0aC5tYXgseG09TWF0aC5taW4sd209TWF0aC5zaW4sTW09TWF0aC5zcXJ0LFRtPTFlLTEyLEFtPU1hdGguUEksU209QW0vMixFbT0yKkFtO2Z1bmN0aW9uIE5tKHQpe3JldHVybiB0Pj0xP1NtOnQ8PS0xPy1TbTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24ga20odCl7bGV0IG49MztyZXR1cm4gdC5kaWdpdHM9ZnVuY3Rpb24oZSl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47aWYobnVsbD09ZSluPW51bGw7ZWxzZXtjb25zdCB0PU1hdGguZmxvb3IoZSk7aWYoISh0Pj0wKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBkaWdpdHM6ICR7ZX1gKTtuPXR9cmV0dXJuIHR9LCgpPT5uZXcgSWEobil9ZnVuY3Rpb24gQ20odCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gUG0odCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gem0odCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiAkbSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBEbSh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiBSbSh0LG4sZSxyLGksbyxhKXt2YXIgdT10LWUsYz1uLXIsZj0oYT9vOi1vKS9NbSh1KnUrYypjKSxzPWYqYyxsPS1mKnUsaD10K3MsZD1uK2wscD1lK3MsZz1yK2wseT0oaCtwKS8yLHY9KGQrZykvMixfPXAtaCxiPWctZCxtPV8qXytiKmIseD1pLW8sdz1oKmctcCpkLE09KGI8MD8tMToxKSpNbShtbSgwLHgqeCptLXcqdykpLFQ9KHcqYi1fKk0pL20sQT0oLXcqXy1iKk0pL20sUz0odypiK18qTSkvbSxFPSgtdypfK2IqTSkvbSxOPVQteSxrPUEtdixDPVMteSxQPUUtdjtyZXR1cm4gTipOK2sqaz5DKkMrUCpQJiYoVD1TLEE9RSkse2N4OlQsY3k6QSx4MDE6LXMseTAxOi1sLHgxMTpUKihpL3gtMSkseTExOkEqKGkveC0xKX19dmFyIEZtPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBxbSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJsZW5ndGgiaW4gdD90OkFycmF5LmZyb20odCl9ZnVuY3Rpb24gVW0odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEltKHQpe3JldHVybiBuZXcgVW0odCl9ZnVuY3Rpb24gT20odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gQm0odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gWW0odCxuKXt2YXIgZT15bSghMCkscj1udWxsLGk9SW0sbz1udWxsLGE9a20odSk7ZnVuY3Rpb24gdSh1KXt2YXIgYyxmLHMsbD0odT1xbSh1KSkubGVuZ3RoLGg9ITE7Zm9yKG51bGw9PXImJihvPWkocz1hKCkpKSxjPTA7Yzw9bDsrK2MpIShjPGwmJmUoZj11W2NdLGMsdSkpPT09aCYmKChoPSFoKT9vLmxpbmVTdGFydCgpOm8ubGluZUVuZCgpKSxoJiZvLnBvaW50KCt0KGYsYyx1KSwrbihmLGMsdSkpO2lmKHMpcmV0dXJuIG89bnVsbCxzKyIifHxudWxsfXJldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwPT09dD9PbTp5bSh0KSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dm9pZCAwPT09bj9CbTp5bShuKSx1Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbiksdSk6dH0sdS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLHUpOm59LHUuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCEhdCksdSk6ZX0sdS5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPXImJihvPWkocikpLHUpOml9LHUuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9yPW89bnVsbDpvPWkocj10KSx1KTpyfSx1fWZ1bmN0aW9uIExtKHQsbixlKXt2YXIgcj1udWxsLGk9eW0oITApLG89bnVsbCxhPUltLHU9bnVsbCxjPWttKGYpO2Z1bmN0aW9uIGYoZil7dmFyIHMsbCxoLGQscCxnPShmPXFtKGYpKS5sZW5ndGgseT0hMSx2PW5ldyBBcnJheShnKSxfPW5ldyBBcnJheShnKTtmb3IobnVsbD09byYmKHU9YShwPWMoKSkpLHM9MDtzPD1nOysrcyl7aWYoIShzPGcmJmkoZD1mW3NdLHMsZikpPT09eSlpZih5PSF5KWw9cyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxoPXMtMTtoPj1sOy0taCl1LnBvaW50KHZbaF0sX1toXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9eSYmKHZbc109K3QoZCxzLGYpLF9bc109K24oZCxzLGYpLHUucG9pbnQocj8rcihkLHMsZik6dltzXSxlPytlKGQscyxmKTpfW3NdKSl9aWYocClyZXR1cm4gdT1udWxsLHArIiJ8fG51bGx9ZnVuY3Rpb24gcygpe3JldHVybiBZbSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gdD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMD09PXQ/T206eW0oK3QpLG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSh2b2lkIDA9PT1uPzA6K24pLGU9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp2b2lkIDA9PT1lP0JtOnltKCtlKSxmLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbikscj1udWxsLGYpOnR9LGYueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbiksZik6dH0sZi54MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksZik6cn0sZi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGU9bnVsbCxmKTpufSxmLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGYpOm59LGYueTE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGYpOmV9LGYubGluZVgwPWYubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKS54KHQpLnkobil9LGYubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKS54KHQpLnkoZSl9LGYubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKS54KHIpLnkobil9LGYuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCEhdCksZik6aX0sZi5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG51bGwhPW8mJih1PWEobykpLGYpOmF9LGYuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9vPXU9bnVsbDp1PWEobz10KSxmKTpvfSxmfWZ1bmN0aW9uIGptKHQsbil7cmV0dXJuIG48dD8tMTpuPnQ/MTpuPj10PzA6TmFOfWZ1bmN0aW9uIEhtKHQpe3JldHVybiB0fVVtLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pfX19O3ZhciBYbT1WbShJbSk7ZnVuY3Rpb24gR20odCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiBWbSh0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuZXcgR20odChuKSl9cmV0dXJuIG4uX2N1cnZlPXQsbn1mdW5jdGlvbiBXbSh0KXt2YXIgbj10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihWbSh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiBabSgpe3JldHVybiBXbShZbSgpLmN1cnZlKFhtKSl9ZnVuY3Rpb24gS20oKXt2YXIgdD1MbSgpLmN1cnZlKFhtKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFdtKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBXbShyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gV20oaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIFdtKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oVm0odCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gUW0odCxuKXtyZXR1cm5bKG49K24pKk1hdGguY29zKHQtPU1hdGguUEkvMiksbipNYXRoLnNpbih0KV19R20ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKX0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFFbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5fY3VydmUucG9pbnQobipNYXRoLnNpbih0KSxuKi1NYXRoLmNvcyh0KSl9fTtjbGFzcyBKbXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl94PW59YXJlYVN0YXJ0KCl7dGhpcy5fbGluZT0wfWFyZWFFbmQoKXt0aGlzLl9saW5lPU5hTn1saW5lU3RhcnQoKXt0aGlzLl9wb2ludD0wfWxpbmVFbmQoKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9cG9pbnQodCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX3g/dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHRoaXMuX3gwPSh0aGlzLl94MCt0KS8yLHRoaXMuX3kwLHRoaXMuX3gwLG4sdCxuKTp0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8odGhpcy5feDAsdGhpcy5feTA9KHRoaXMuX3kwK24pLzIsdCx0aGlzLl95MCx0LG4pfXRoaXMuX3gwPXQsdGhpcy5feTA9bn19Y2xhc3MgdHh7Y29uc3RydWN0b3IodCl7dGhpcy5fY29udGV4dD10fWxpbmVTdGFydCgpe3RoaXMuX3BvaW50PTB9bGluZUVuZCgpe31wb2ludCh0LG4pe2lmKHQ9K3Qsbj0rbiwwPT09dGhpcy5fcG9pbnQpdGhpcy5fcG9pbnQ9MTtlbHNle2NvbnN0IGU9UW0odGhpcy5feDAsdGhpcy5feTApLHI9UW0odGhpcy5feDAsdGhpcy5feTA9KHRoaXMuX3kwK24pLzIpLGk9UW0odCx0aGlzLl95MCksbz1RbSh0LG4pO3RoaXMuX2NvbnRleHQubW92ZVRvKC4uLmUpLHRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyguLi5yLC4uLmksLi4ubyl9dGhpcy5feDA9dCx0aGlzLl95MD1ufX1mdW5jdGlvbiBueCh0KXtyZXR1cm4gbmV3IEptKHQsITApfWZ1bmN0aW9uIGV4KHQpe3JldHVybiBuZXcgSm0odCwhMSl9ZnVuY3Rpb24gcngodCl7cmV0dXJuIG5ldyB0eCh0KX1mdW5jdGlvbiBpeCh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gb3godCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGF4KHQpe2xldCBuPWl4LGU9b3gscj1PbSxpPUJtLG89bnVsbCxhPW51bGwsdT1rbShjKTtmdW5jdGlvbiBjKCl7bGV0IGM7Y29uc3QgZj1GbS5jYWxsKGFyZ3VtZW50cykscz1uLmFwcGx5KHRoaXMsZiksbD1lLmFwcGx5KHRoaXMsZik7aWYobnVsbD09byYmKGE9dChjPXUoKSkpLGEubGluZVN0YXJ0KCksZlswXT1zLGEucG9pbnQoK3IuYXBwbHkodGhpcyxmKSwraS5hcHBseSh0aGlzLGYpKSxmWzBdPWwsYS5wb2ludCgrci5hcHBseSh0aGlzLGYpLCtpLmFwcGx5KHRoaXMsZikpLGEubGluZUVuZCgpLGMpcmV0dXJuIGE9bnVsbCxjKyIifHxudWxsfXJldHVybiBjLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGMpOm59LGMudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYyk6ZX0sYy54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGMpOnJ9LGMueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxjKTppfSxjLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/bz1hPW51bGw6YT10KG89biksYyk6b30sY31jb25zdCB1eD1NbSgzKTt2YXIgY3g9e2RyYXcodCxuKXtjb25zdCBlPS41OTQzNipNbShuK3htKG4vMjgsLjc1KSkscj1lLzIsaT1yKnV4O3QubW92ZVRvKDAsZSksdC5saW5lVG8oMCwtZSksdC5tb3ZlVG8oLWksLXIpLHQubGluZVRvKGksciksdC5tb3ZlVG8oLWksciksdC5saW5lVG8oaSwtcil9fSxmeD17ZHJhdyh0LG4pe2NvbnN0IGU9TW0obi9BbSk7dC5tb3ZlVG8oZSwwKSx0LmFyYygwLDAsZSwwLEVtKX19LHN4PXtkcmF3KHQsbil7Y29uc3QgZT1NbShuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fTtjb25zdCBseD1NbSgxLzMpLGh4PTIqbHg7dmFyIGR4PXtkcmF3KHQsbil7Y29uc3QgZT1NbShuL2h4KSxyPWUqbHg7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxweD17ZHJhdyh0LG4pe2NvbnN0IGU9LjYyNjI1Kk1tKG4pO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKGUsMCksdC5saW5lVG8oMCxlKSx0LmxpbmVUbygtZSwwKSx0LmNsb3NlUGF0aCgpfX0sZ3g9e2RyYXcodCxuKXtjb25zdCBlPS44NzU1OSpNbShuLXhtKG4vNywyKSk7dC5tb3ZlVG8oLWUsMCksdC5saW5lVG8oZSwwKSx0Lm1vdmVUbygwLGUpLHQubGluZVRvKDAsLWUpfX0seXg9e2RyYXcodCxuKXtjb25zdCBlPU1tKG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSx2eD17ZHJhdyh0LG4pe2NvbnN0IGU9LjQ0MzEqTW0obik7dC5tb3ZlVG8oZSxlKSx0LmxpbmVUbyhlLC1lKSx0LmxpbmVUbygtZSwtZSksdC5saW5lVG8oLWUsZSksdC5jbG9zZVBhdGgoKX19O2NvbnN0IF94PXdtKEFtLzEwKS93bSg3KkFtLzEwKSxieD13bShFbS8xMCkqX3gsbXg9LWJtKEVtLzEwKSpfeDt2YXIgeHg9e2RyYXcodCxuKXtjb25zdCBlPU1tKC44OTA4MTMwOTE1MjkyODUyKm4pLHI9YngqZSxpPW14KmU7dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ocixpKTtmb3IobGV0IG49MTtuPDU7KytuKXtjb25zdCBvPUVtKm4vNSxhPWJtKG8pLHU9d20obyk7dC5saW5lVG8odSplLC1hKmUpLHQubGluZVRvKGEqci11KmksdSpyK2EqaSl9dC5jbG9zZVBhdGgoKX19O2NvbnN0IHd4PU1tKDMpO3ZhciBNeD17ZHJhdyh0LG4pe2NvbnN0IGU9LU1tKG4vKDMqd3gpKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLXd4KmUsLWUpLHQubGluZVRvKHd4KmUsLWUpLHQuY2xvc2VQYXRoKCl9fTtjb25zdCBUeD1NbSgzKTt2YXIgQXg9e2RyYXcodCxuKXtjb25zdCBlPS42ODI0Kk1tKG4pLHI9ZS8yLGk9ZSpUeC8yO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKGksciksdC5saW5lVG8oLWksciksdC5jbG9zZVBhdGgoKX19O2NvbnN0IFN4PS0uNSxFeD1NbSgzKS8yLE54PTEvTW0oMTIpLGt4PTMqKE54LzIrMSk7dmFyIEN4PXtkcmF3KHQsbil7Y29uc3QgZT1NbShuL2t4KSxyPWUvMixpPWUqTngsbz1yLGE9ZSpOeCtlLHU9LW8sYz1hO3QubW92ZVRvKHIsaSksdC5saW5lVG8obyxhKSx0LmxpbmVUbyh1LGMpLHQubGluZVRvKFN4KnItRXgqaSxFeCpyK1N4KmkpLHQubGluZVRvKFN4Km8tRXgqYSxFeCpvK1N4KmEpLHQubGluZVRvKFN4KnUtRXgqYyxFeCp1K1N4KmMpLHQubGluZVRvKFN4KnIrRXgqaSxTeCppLUV4KnIpLHQubGluZVRvKFN4Km8rRXgqYSxTeCphLUV4Km8pLHQubGluZVRvKFN4KnUrRXgqYyxTeCpjLUV4KnUpLHQuY2xvc2VQYXRoKCl9fSxQeD17ZHJhdyh0LG4pe2NvbnN0IGU9LjYxODkqTW0obi14bShuLzYsMS43KSk7dC5tb3ZlVG8oLWUsLWUpLHQubGluZVRvKGUsZSksdC5tb3ZlVG8oLWUsZSksdC5saW5lVG8oZSwtZSl9fTtjb25zdCB6eD1bZngsc3gsZHgseXgseHgsTXgsQ3hdLCR4PVtmeCxneCxQeCxBeCxjeCx2eCxweF07ZnVuY3Rpb24gRHgoKXt9ZnVuY3Rpb24gUngodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIEZ4KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBxeCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gVXgodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl4KHQsbil7dGhpcy5fYmFzaXM9bmV3IEZ4KHQpLHRoaXMuX2JldGE9bn1GeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOlJ4KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0OlJ4KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxxeC5wcm90b3R5cGU9e2FyZWFTdGFydDpEeCxhcmVhRW5kOkR4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpSeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sVXgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpSeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXgucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGM9LTE7KytjPD1lOylyPWMvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbY10rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bY10rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBPeD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBGeCh0KTpuZXcgSXgodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBCeCh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFl4KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1ZeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6QngodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OkJ4KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgTHg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWXgodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gangodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWp4LnByb3RvdHlwZT17YXJlYVN0YXJ0OkR4LGFyZWFFbmQ6RHgsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpCeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEh4PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IGp4KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFh4KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpCeCh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEd4PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFh4KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFZ4KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5UbSl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsYz0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2MsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2N9aWYodC5fbDIzX2E+VG0pe3ZhciBmPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qZit0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpmK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gV3godCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1XeC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlZ4KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp4PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgV3godCxuKTpuZXcgWXgodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBLeCh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufUt4LnByb3RvdHlwZT17YXJlYVN0YXJ0OkR4LGFyZWFFbmQ6RHgsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6VngodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgUXg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBLeCh0LG4pOm5ldyBqeCh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIEp4KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59SngucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlZ4KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHR3PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSngodCxuKTpuZXcgWHgodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBudyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gZXcodCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIHJ3KHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKGV3KG8pK2V3KGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gaXcodCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIG93KHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBhdyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gdXcodCl7dGhpcy5fY29udGV4dD1uZXcgY3codCl9ZnVuY3Rpb24gY3codCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGZ3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBzdyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIGx3KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiBodyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZHcodCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHB3KHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gZ3codCl7Y29uc3Qgbj1bXTtyZXR1cm4gbi5rZXk9dCxufWZ1bmN0aW9uIHl3KHQpe3ZhciBuPXQubWFwKHZ3KTtyZXR1cm4gZHcodCkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gblt0XS1uW2VdfSkpfWZ1bmN0aW9uIHZ3KHQpe2Zvcih2YXIgbixlPS0xLHI9MCxpPXQubGVuZ3RoLG89LTEvMDsrK2U8aTspKG49K3RbZV1bMV0pPm8mJihvPW4scj1lKTtyZXR1cm4gcn1mdW5jdGlvbiBfdyh0KXt2YXIgbj10Lm1hcChidyk7cmV0dXJuIGR3KHQpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pKX1mdW5jdGlvbiBidyh0KXtmb3IodmFyIG4sZT0wLHI9LTEsaT10Lmxlbmd0aDsrK3I8aTspKG49K3Rbcl1bMV0pJiYoZSs9bik7cmV0dXJuIGV9bncucHJvdG90eXBlPXthcmVhU3RhcnQ6RHgsYXJlYUVuZDpEeCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxhdy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6b3codGhpcyx0aGlzLl90MCxpdyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsb3codGhpcyxpdyh0aGlzLGU9cncodGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0Om93KHRoaXMsdGhpcy5fdDAsZT1ydyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LCh1dy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhdy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2F3LnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sY3cucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0sZncucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9c3codCksaT1zdyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0sbHcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX07dmFyIG13PXQ9PigpPT50O2Z1bmN0aW9uIHh3KHQse3NvdXJjZUV2ZW50Om4sdGFyZ2V0OmUsdHJhbnNmb3JtOnIsZGlzcGF0Y2g6aX0pe09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3R5cGU6e3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHNvdXJjZUV2ZW50Ont2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSx0YXJnZXQ6e3ZhbHVlOmUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9LHRyYW5zZm9ybTp7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0sXzp7dmFsdWU6aX19KX1mdW5jdGlvbiB3dyh0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9d3cucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp3dyxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgd3codGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyB3dyh0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBNdz1uZXcgd3coMSwwLDApO2Z1bmN0aW9uIFR3KHQpe2Zvcig7IXQuX196b29tOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gTXc7cmV0dXJuIHQuX196b29tfWZ1bmN0aW9uIEF3KHQpe3Quc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gU3codCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gRXcodCl7cmV0dXJuISh0LmN0cmxLZXkmJiJ3aGVlbCIhPT10LnR5cGV8fHQuYnV0dG9uKX1mdW5jdGlvbiBOdygpe3ZhciB0PXRoaXM7cmV0dXJuIHQgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PXQub3duZXJTVkdFbGVtZW50fHx0KS5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKT9bWyh0PXQudmlld0JveC5iYXNlVmFsKS54LHQueV0sW3QueCt0LndpZHRoLHQueSt0LmhlaWdodF1dOltbMCwwXSxbdC53aWR0aC5iYXNlVmFsLnZhbHVlLHQuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTpbWzAsMF0sW3QuY2xpZW50V2lkdGgsdC5jbGllbnRIZWlnaHRdXX1mdW5jdGlvbiBrdygpe3JldHVybiB0aGlzLl9fem9vbXx8TXd9ZnVuY3Rpb24gQ3codCl7cmV0dXJuLXQuZGVsdGFZKigxPT09dC5kZWx0YU1vZGU/LjA1OnQuZGVsdGFNb2RlPzE6LjAwMikqKHQuY3RybEtleT8xMDoxKX1mdW5jdGlvbiBQdygpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiB6dyh0LG4sZSl7dmFyIHI9dC5pbnZlcnRYKG5bMF1bMF0pLWVbMF1bMF0saT10LmludmVydFgoblsxXVswXSktZVsxXVswXSxvPXQuaW52ZXJ0WShuWzBdWzFdKS1lWzBdWzFdLGE9dC5pbnZlcnRZKG5bMV1bMV0pLWVbMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKGk+cj8ocitpKS8yOk1hdGgubWluKDAscil8fE1hdGgubWF4KDAsaSksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9VHcucHJvdG90eXBlPXd3LnByb3RvdHlwZSx0LkFkZGVyPUEsdC5EZWxhdW5heT1qdSx0LkZvcm1hdFNwZWNpZmllcj1uZix0LkludGVybk1hcD1JbnRlcm5NYXAsdC5JbnRlcm5TZXQ9SW50ZXJuU2V0LHQuTm9kZT1KZCx0LlBhdGg9SWEsdC5Wb3Jvbm9pPVV1LHQuWm9vbVRyYW5zZm9ybT13dyx0LmFjdGl2ZT1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Ll9fdHJhbnNpdGlvbjtpZihpKWZvcihyIGluIG49bnVsbD09bj9udWxsOm4rIiIsaSlpZigoZT1pW3JdKS5zdGF0ZT5VaSYmZS5uYW1lPT09bilyZXR1cm4gbmV3IGdvKFtbdF1dLEtvLG4sK3IpO3JldHVybiBudWxsfSx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUNtLG49UG0sZT15bSgwKSxyPW51bGwsaT16bSxvPSRtLGE9RG0sdT1udWxsLGM9a20oZik7ZnVuY3Rpb24gZigpe3ZhciBmLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1TbSxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLVNtLGc9dm0ocC1kKSx5PXA+ZDtpZih1fHwodT1mPWMoKSksaDxsJiYocz1oLGg9bCxsPXMpLGg+VG0paWYoZz5FbS1UbSl1Lm1vdmVUbyhoKmJtKGQpLGgqd20oZCkpLHUuYXJjKDAsMCxoLGQscCwheSksbD5UbSYmKHUubW92ZVRvKGwqYm0ocCksbCp3bShwKSksdS5hcmMoMCwwLGwscCxkLHkpKTtlbHNle3ZhciB2LF8sYj1kLG09cCx4PWQsdz1wLE09ZyxUPWcsQT1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLFM9QT5UbSYmKHI/K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOk1tKGwqbCtoKmgpKSxFPXhtKHZtKGgtbCkvMiwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLE49RSxrPUU7aWYoUz5UbSl7dmFyIEM9Tm0oUy9sKndtKEEpKSxQPU5tKFMvaCp3bShBKSk7KE0tPTIqQyk+VG0/KHgrPUMqPXk/MTotMSx3LT1DKTooTT0wLHg9dz0oZCtwKS8yKSwoVC09MipQKT5UbT8oYis9UCo9eT8xOi0xLG0tPVApOihUPTAsYj1tPShkK3ApLzIpfXZhciB6PWgqYm0oYiksJD1oKndtKGIpLEQ9bCpibSh3KSxSPWwqd20odyk7aWYoRT5UbSl7dmFyIEYscT1oKmJtKG0pLFU9aCp3bShtKSxJPWwqYm0oeCksTz1sKndtKHgpO2lmKGc8QW0paWYoRj1mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBjPWUtdCxmPXItbixzPWEtaSxsPXUtbyxoPWwqYy1zKmY7aWYoIShoKmg8VG0pKXJldHVyblt0KyhoPShzKihuLW8pLWwqKHQtaSkpL2gpKmMsbitoKmZdfSh6LCQsSSxPLHEsVSxELFIpKXt2YXIgQj16LUZbMF0sWT0kLUZbMV0sTD1xLUZbMF0saj1VLUZbMV0sSD0xL3dtKGZ1bmN0aW9uKHQpe3JldHVybiB0PjE/MDp0PC0xP0FtOk1hdGguYWNvcyh0KX0oKEIqTCtZKmopLyhNbShCKkIrWSpZKSpNbShMKkwraipqKSkpLzIpLFg9TW0oRlswXSpGWzBdK0ZbMV0qRlsxXSk7Tj14bShFLChsLVgpLyhILTEpKSxrPXhtKEUsKGgtWCkvKEgrMSkpfWVsc2UgTj1rPTB9VD5UbT9rPlRtPyh2PVJtKEksTyx6LCQsaCxrLHkpLF89Um0ocSxVLEQsUixoLGsseSksdS5tb3ZlVG8odi5jeCt2LngwMSx2LmN5K3YueTAxKSxrPEU/dS5hcmModi5jeCx2LmN5LGssX20odi55MDEsdi54MDEpLF9tKF8ueTAxLF8ueDAxKSwheSk6KHUuYXJjKHYuY3gsdi5jeSxrLF9tKHYueTAxLHYueDAxKSxfbSh2LnkxMSx2LngxMSksIXkpLHUuYXJjKDAsMCxoLF9tKHYuY3krdi55MTEsdi5jeCt2LngxMSksX20oXy5jeStfLnkxMSxfLmN4K18ueDExKSwheSksdS5hcmMoXy5jeCxfLmN5LGssX20oXy55MTEsXy54MTEpLF9tKF8ueTAxLF8ueDAxKSwheSkpKToodS5tb3ZlVG8oeiwkKSx1LmFyYygwLDAsaCxiLG0sIXkpKTp1Lm1vdmVUbyh6LCQpLGw+VG0mJk0+VG0/Tj5UbT8odj1SbShELFIscSxVLGwsLU4seSksXz1SbSh6LCQsSSxPLGwsLU4seSksdS5saW5lVG8odi5jeCt2LngwMSx2LmN5K3YueTAxKSxOPEU/dS5hcmModi5jeCx2LmN5LE4sX20odi55MDEsdi54MDEpLF9tKF8ueTAxLF8ueDAxKSwheSk6KHUuYXJjKHYuY3gsdi5jeSxOLF9tKHYueTAxLHYueDAxKSxfbSh2LnkxMSx2LngxMSksIXkpLHUuYXJjKDAsMCxsLF9tKHYuY3krdi55MTEsdi5jeCt2LngxMSksX20oXy5jeStfLnkxMSxfLmN4K18ueDExKSx5KSx1LmFyYyhfLmN4LF8uY3ksTixfbShfLnkxMSxfLngxMSksX20oXy55MDEsXy54MDEpLCF5KSkpOnUuYXJjKDAsMCxsLHcseCx5KTp1LmxpbmVUbyhELFIpfWVsc2UgdS5tb3ZlVG8oMCwwKTtpZih1LmNsb3NlUGF0aCgpLGYpcmV0dXJuIHU9bnVsbCxmKyIifHxudWxsfXJldHVybiBmLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIGU9KCt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHI9KCtpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLUFtLzI7cmV0dXJuW2JtKHIpKmUsd20ocikqZV19LGYuaW5uZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSgrbiksZik6dH0sZi5vdXRlclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxmKTpufSxmLmNvcm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxmKTplfSxmLnBhZFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksZik6cn0sZi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGYpOml9LGYuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksZik6b30sZi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09dD9udWxsOnQsZik6dX0sZn0sdC5hcmVhPUxtLHQuYXJlYVJhZGlhbD1LbSx0LmFzY2VuZGluZz1uLHQuYXV0b1R5cGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHQpe3ZhciBlLHIsaT10W25dLnRyaW0oKTtpZihpKWlmKCJ0cnVlIj09PWkpaT0hMDtlbHNlIGlmKCJmYWxzZSI9PT1pKWk9ITE7ZWxzZSBpZigiTmFOIj09PWkpaT1OYU47ZWxzZSBpZihpc05hTihlPStpKSl7aWYoIShyPWkubWF0Y2goL14oWy0rXVxkezJ9KT9cZHs0fSgtXGR7Mn0oLVxkezJ9KT8pPyhUXGR7Mn06XGR7Mn0oOlxkezJ9KFwuXGR7M30pPyk/KFp8Wy0rXVxkezJ9OlxkezJ9KT8pPyQvKSkpY29udGludWU7dmMmJnJbNF0mJiFyWzddJiYoaT1pLnJlcGxhY2UoLy0vZywiLyIpLnJlcGxhY2UoL1QvLCIgIikpLGk9bmV3IERhdGUoaSl9ZWxzZSBpPWU7ZWxzZSBpPW51bGw7dFtuXT1pfXJldHVybiB0fSx0LmF4aXNCb3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIHp0KFR0LHQpfSx0LmF4aXNMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiB6dChBdCx0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHp0KE10LHQpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIHp0KHd0LHQpfSx0LmJpbj1KLHQuYmlzZWN0PWwsdC5iaXNlY3RDZW50ZXI9cyx0LmJpc2VjdExlZnQ9Zix0LmJpc2VjdFJpZ2h0PWMsdC5iaXNlY3Rvcj1yLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oX2MpfSx0LmJsdXI9ZnVuY3Rpb24odCxuKXtpZighKChuPStuKT49MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoImludmFsaWQgciIpO2xldCBlPXQubGVuZ3RoO2lmKCEoKGU9TWF0aC5mbG9vcihlKSk+PTApKXRocm93IG5ldyBSYW5nZUVycm9yKCJpbnZhbGlkIGxlbmd0aCIpO2lmKCFlfHwhbilyZXR1cm4gdDtjb25zdCByPXYobiksaT10LnNsaWNlKCk7cmV0dXJuIHIodCxpLDAsZSwxKSxyKGksdCwwLGUsMSkscih0LGksMCxlLDEpLHR9LHQuYmx1cjI9aCx0LmJsdXJJbWFnZT1kLHQuYnJ1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gTWEoaGEpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIE1hKHNhKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gTWEobGEpfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oYmMpfSx0LmNob3JkPWZ1bmN0aW9uKCl7cmV0dXJuICRhKCExLCExKX0sdC5jaG9yZERpcmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuICRhKCEwLCExKX0sdC5jaG9yZFRyYW5zcG9zZT1mdW5jdGlvbigpe3JldHVybiAkYSghMSwhMCl9LHQuY2x1c3Rlcj1mdW5jdGlvbigpe3ZhciB0PWpkLG49MSxlPTEscj0hMTtmdW5jdGlvbiBpKGkpe3ZhciBvLGE9MDtpLmVhY2hBZnRlcigoZnVuY3Rpb24obil7dmFyIGU9bi5jaGlsZHJlbjtlPyhuLng9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKEhkLDApL3QubGVuZ3RofShlKSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIDErdC5yZWR1Y2UoWGQsMCl9KGUpKToobi54PW8/YSs9dChuLG8pOjAsbi55PTAsbz1uKX0pKTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGM9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxmPXUueC10KHUsYykvMixzPWMueCt0KGMsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1mKS8ocy1mKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5jb2xvcj0kZSx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9c3Usbj1sdSxlPWh1LHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGM9cisyKnU+PmEsZj1pKzIqdT4+YSxzPUphKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoYypmKSxzPU1hdGgucG93KDIsLWEpLGw9LTE7Zm9yKGNvbnN0IG8gb2Ygcil7dmFyIGQ9KHQobywrK2wscikrdSkqcyxwPShuKG8sbCxyKSt1KSpzLGc9K2UobyxsLHIpO2lmKGcmJmQ+PTAmJmQ8YyYmcD49MCYmcDxmKXt2YXIgeT1NYXRoLmZsb29yKGQpLHY9TWF0aC5mbG9vcihwKSxfPWQteS0uNSxiPXAtdi0uNTtpW3krdipjXSs9KDEtXykqKDEtYikqZyxpW3krMSt2KmNdKz1fKigxLWIpKmcsaVt5KzErKHYrMSkqY10rPV8qYipnLGlbeSsodisxKSpjXSs9KDEtXykqYipnfX1yZXR1cm4gaCh7ZGF0YTppLHdpZHRoOmMsaGVpZ2h0OmZ9LG8qcyksaX1mdW5jdGlvbiBkKHQpe3ZhciBuPWwodCksZT1zKG4pLHI9TWF0aC5wb3coMiwyKmEpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1WKE51bWJlci5NSU5fVkFMVUUsdHQobikvcixlKSksb3UoKS5zaXplKFtjLGZdKS50aHJlc2hvbGRzKGUubWFwKCh0PT50KnIpKSkobikubWFwKCgodCxuKT0+KHQudmFsdWU9K2Vbbl0scCh0KSkpKX1mdW5jdGlvbiBwKHQpe3JldHVybiB0LmNvb3JkaW5hdGVzLmZvckVhY2goZyksdH1mdW5jdGlvbiBnKHQpe3QuZm9yRWFjaCh5KX1mdW5jdGlvbiB5KHQpe3QuZm9yRWFjaCh2KX1mdW5jdGlvbiB2KHQpe3RbMF09dFswXSpNYXRoLnBvdygyLGEpLXUsdFsxXT10WzFdKk1hdGgucG93KDIsYSktdX1mdW5jdGlvbiBfKCl7cmV0dXJuIGM9cisyKih1PTMqbyk+PmEsZj1pKzIqdT4+YSxkfXJldHVybiBkLmNvbnRvdXJzPWZ1bmN0aW9uKHQpe3ZhciBuPWwodCksZT1vdSgpLnNpemUoW2MsZl0pLHI9TWF0aC5wb3coMiwyKmEpLGk9dD0+e3Q9K3Q7dmFyIGk9cChlLmNvbnRvdXIobix0KnIpKTtyZXR1cm4gaS52YWx1ZT10LGl9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwibWF4Iix7Z2V0OigpPT50dChuKS9yfSksaX0sZC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246SmEoK24pLGQpOnR9LGQueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkphKCt0KSxkKTpufSxkLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkphKCt0KSxkKTplfSxkLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49K3RbMF0sZT0rdFsxXTtpZighKG4+PTAmJmU+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHI9bixpPWUsXygpfSxkLmNlbGxTaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiAxPDxhO2lmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7cmV0dXJuIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksXygpfSxkLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP0phKEthLmNhbGwodCkpOkphKHQpLGQpOnN9LGQuYmFuZHdpZHRoPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNYXRoLnNxcnQobyoobysxKSk7aWYoISgodD0rdCk+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiYW5kd2lkdGgiKTtyZXR1cm4gbz0oTWF0aC5zcXJ0KDQqdCp0KzEpLTEpLzIsXygpfSxkfSx0LmNvbnRvdXJzPW91LHQuY291bnQ9Xyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gS24oTHQodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sdC5jcmVhdG9yPUx0LHQuY3Jvc3M9ZnVuY3Rpb24oLi4udCl7Y29uc3Qgbj0iZnVuY3Rpb24iPT10eXBlb2YgdFt0Lmxlbmd0aC0xXSYmZnVuY3Rpb24odCl7cmV0dXJuIG49PnQoLi4ubil9KHQucG9wKCkpLGU9KHQ9dC5tYXAoeCkpLm1hcChiKSxyPXQubGVuZ3RoLTEsaT1uZXcgQXJyYXkocisxKS5maWxsKDApLG89W107aWYocjwwfHxlLnNvbWUobSkpcmV0dXJuIG87Zm9yKDs7KXtvLnB1c2goaS5tYXAoKChuLGUpPT50W2VdW25dKSkpO2xldCBhPXI7Zm9yKDsrK2lbYV09PT1lW2FdOyl7aWYoMD09PWEpcmV0dXJuIG4/by5tYXAobik6bztpW2EtLV09MH19fSx0LmNzdj1NYyx0LmNzdkZvcm1hdD1pYyx0LmNzdkZvcm1hdEJvZHk9b2MsdC5jc3ZGb3JtYXRSb3c9dWMsdC5jc3ZGb3JtYXRSb3dzPWFjLHQuY3N2Rm9ybWF0VmFsdWU9Y2MsdC5jc3ZQYXJzZT1lYyx0LmNzdlBhcnNlUm93cz1yYyx0LmN1YmVoZWxpeD1Bcix0LmN1bXN1bT1mdW5jdGlvbih0LG4pe3ZhciBlPTAscj0wO3JldHVybiBGbG9hdDY0QXJyYXkuZnJvbSh0LHZvaWQgMD09PW4/dD0+ZSs9K3R8fDA6aT0+ZSs9K24oaSxyKyssdCl8fDApfSx0LmN1cnZlQmFzaXM9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeCh0KX0sdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcXgodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVeCh0KX0sdC5jdXJ2ZUJ1bXBYPW54LHQuY3VydmVCdW1wWT1leCx0LmN1cnZlQnVuZGxlPU94LHQuY3VydmVDYXJkaW5hbD1MeCx0LmN1cnZlQ2FyZGluYWxDbG9zZWQ9SHgsdC5jdXJ2ZUNhcmRpbmFsT3Blbj1HeCx0LmN1cnZlQ2F0bXVsbFJvbT1aeCx0LmN1cnZlQ2F0bXVsbFJvbUNsb3NlZD1ReCx0LmN1cnZlQ2F0bXVsbFJvbU9wZW49dHcsdC5jdXJ2ZUxpbmVhcj1JbSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbncodCl9LHQuY3VydmVNb25vdG9uZVg9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhdyh0KX0sdC5jdXJ2ZU1vbm90b25lWT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHV3KHQpfSx0LmN1cnZlTmF0dXJhbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGZ3KHQpfSx0LmN1cnZlU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGx3KHQsLjUpfSx0LmN1cnZlU3RlcEFmdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbHcodCwxKX0sdC5jdXJ2ZVN0ZXBCZWZvcmU9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsdyh0LDApfSx0LmRlc2NlbmRpbmc9ZSx0LmRldmlhdGlvbj1NLHQuZGlmZmVyZW5jZT1mdW5jdGlvbih0LC4uLm4pe3Q9bmV3IEludGVyblNldCh0KTtmb3IoY29uc3QgZSBvZiBuKWZvcihjb25zdCBuIG9mIGUpdC5kZWxldGUobik7cmV0dXJuIHR9LHQuZGlzam9pbnQ9ZnVuY3Rpb24odCxuKXtjb25zdCBlPW5bU3ltYm9sLml0ZXJhdG9yXSgpLHI9bmV3IEludGVyblNldDtmb3IoY29uc3QgbiBvZiB0KXtpZihyLmhhcyhuKSlyZXR1cm4hMTtsZXQgdCxpO2Zvcig7KHt2YWx1ZTp0LGRvbmU6aX09ZS5uZXh0KCkpJiYhaTspe2lmKE9iamVjdC5pcyhuLHQpKXJldHVybiExO3IuYWRkKHQpfX1yZXR1cm4hMH0sdC5kaXNwYXRjaD1EdCx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpPWxlLG89aGUsYT1kZSx1PXBlLGM9e30sZj1EdCgic3RhcnQiLCJkcmFnIiwiZW5kIikscz0wLGw9MDtmdW5jdGlvbiBoKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixkKS5maWx0ZXIodSkub24oInRvdWNoc3RhcnQuZHJhZyIseSkub24oInRvdWNobW92ZS5kcmFnIix2LHJlKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIixfKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZChhLHUpe2lmKCFyJiZpLmNhbGwodGhpcyxhLHUpKXt2YXIgYz1iKHRoaXMsby5jYWxsKHRoaXMsYSx1KSxhLHUsIm1vdXNlIik7YyYmKEtuKGEudmlldykub24oIm1vdXNlbW92ZS5kcmFnIixwLGllKS5vbigibW91c2V1cC5kcmFnIixnLGllKSx1ZShhLnZpZXcpLG9lKGEpLGU9ITEsdD1hLmNsaWVudFgsbj1hLmNsaWVudFksYygic3RhcnQiLGEpKX19ZnVuY3Rpb24gcChyKXtpZihhZShyKSwhZSl7dmFyIGk9ci5jbGllbnRYLXQsbz1yLmNsaWVudFktbjtlPWkqaStvKm8+bH1jLm1vdXNlKCJkcmFnIixyKX1mdW5jdGlvbiBnKHQpe0tuKHQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsbnVsbCksY2UodC52aWV3LGUpLGFlKHQpLGMubW91c2UoImVuZCIsdCl9ZnVuY3Rpb24geSh0LG4pe2lmKGkuY2FsbCh0aGlzLHQsbikpe3ZhciBlLHIsYT10LmNoYW5nZWRUb3VjaGVzLHU9by5jYWxsKHRoaXMsdCxuKSxjPWEubGVuZ3RoO2ZvcihlPTA7ZTxjOysrZSkocj1iKHRoaXMsdSx0LG4sYVtlXS5pZGVudGlmaWVyLGFbZV0pKSYmKG9lKHQpLHIoInN0YXJ0Iix0LGFbZV0pKX19ZnVuY3Rpb24gdih0KXt2YXIgbixlLHI9dC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihuPTA7bjxpOysrbikoZT1jW3Jbbl0uaWRlbnRpZmllcl0pJiYoYWUodCksZSgiZHJhZyIsdCxyW25dKSl9ZnVuY3Rpb24gXyh0KXt2YXIgbixlLGk9dC5jaGFuZ2VkVG91Y2hlcyxvPWkubGVuZ3RoO2ZvcihyJiZjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3I9bnVsbH0pLDUwMCksbj0wO248bzsrK24pKGU9Y1tpW25dLmlkZW50aWZpZXJdKSYmKG9lKHQpLGUoImVuZCIsdCxpW25dKSl9ZnVuY3Rpb24gYih0LG4sZSxyLGksbyl7dmFyIHUsbCxkLHA9Zi5jb3B5KCksZz1lZShvfHxlLG4pO2lmKG51bGwhPShkPWEuY2FsbCh0LG5ldyBzZSgiYmVmb3Jlc3RhcnQiLHtzb3VyY2VFdmVudDplLHRhcmdldDpoLGlkZW50aWZpZXI6aSxhY3RpdmU6cyx4OmdbMF0seTpnWzFdLGR4OjAsZHk6MCxkaXNwYXRjaDpwfSkscikpKXJldHVybiB1PWQueC1nWzBdfHwwLGw9ZC55LWdbMV18fDAsZnVuY3Rpb24gZShvLGEsZil7dmFyIHksdj1nO3N3aXRjaChvKXtjYXNlInN0YXJ0IjpjW2ldPWUseT1zKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW2ldLC0tcztjYXNlImRyYWciOmc9ZWUoZnx8YSxuKSx5PXN9cC5jYWxsKG8sdCxuZXcgc2Uobyx7c291cmNlRXZlbnQ6YSxzdWJqZWN0OmQsdGFyZ2V0OmgsaWRlbnRpZmllcjppLGFjdGl2ZTp5LHg6Z1swXSt1LHk6Z1sxXStsLGR4OmdbMF0tdlswXSxkeTpnWzFdLXZbMV0sZGlzcGF0Y2g6cH0pLHIpfX1yZXR1cm4gaC5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmZSghIXQpLGgpOml9LGguY29udGFpbmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZmUodCksaCk6b30saC5zdWJqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZmUodCksaCk6YX0saC50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmZSghIXQpLGgpOnV9LGgub249ZnVuY3Rpb24oKXt2YXIgdD1mLm9uLmFwcGx5KGYsYXJndW1lbnRzKTtyZXR1cm4gdD09PWY/aDp0fSxoLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9KHQ9K3QpKnQsaCk6TWF0aC5zcXJ0KGwpfSxofSx0LmRyYWdEaXNhYmxlPXVlLHQuZHJhZ0VuYWJsZT1jZSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPXRjKHQpO3JldHVybiB4YyhuLGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBpLnBhcnNlKHQscil9KSl9LHQuZHN2Rm9ybWF0PXRjLHQuZWFzZUJhY2s9am8sdC5lYXNlQmFja0luPVlvLHQuZWFzZUJhY2tJbk91dD1qbyx0LmVhc2VCYWNrT3V0PUxvLHQuZWFzZUJvdW5jZT1Pbyx0LmVhc2VCb3VuY2VJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1PbygxLXQpfSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtT28oMS10KTpPbyh0LTEpKzEpLzJ9LHQuZWFzZUJvdW5jZU91dD1Pbyx0LmVhc2VDaXJjbGU9a28sdC5lYXNlQ2lyY2xlSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9a28sdC5lYXNlQ2lyY2xlT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfSx0LmVhc2VDdWJpYz1tbyx0LmVhc2VDdWJpY0luPWZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sdC5lYXNlQ3ViaWNJbk91dD1tbyx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUVsYXN0aWM9R28sdC5lYXNlRWxhc3RpY0luPVhvLHQuZWFzZUVsYXN0aWNJbk91dD1Wbyx0LmVhc2VFbGFzdGljT3V0PUdvLHQuZWFzZUV4cD1Obyx0LmVhc2VFeHBJbj1mdW5jdGlvbih0KXtyZXR1cm4gRW8oMS0rdCl9LHQuZWFzZUV4cEluT3V0PU5vLHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1Fbyh0KX0sdC5lYXNlTGluZWFyPXQ9Pit0LHQuZWFzZVBvbHk9TW8sdC5lYXNlUG9seUluPXhvLHQuZWFzZVBvbHlJbk91dD1Nbyx0LmVhc2VQb2x5T3V0PXdvLHQuZWFzZVF1YWQ9Ym8sdC5lYXNlUXVhZEluPWZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHQuZWFzZVF1YWRJbk91dD1ibyx0LmVhc2VRdWFkT3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0KigyLXQpfSx0LmVhc2VTaW49U28sdC5lYXNlU2luSW49ZnVuY3Rpb24odCl7cmV0dXJuIDE9PSt0PzE6MS1NYXRoLmNvcyh0KkFvKX0sdC5lYXNlU2luSW5PdXQ9U28sdC5lYXNlU2luT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KkFvKX0sdC5ldmVyeT1mdW5jdGlvbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoInRlc3QgaXMgbm90IGEgZnVuY3Rpb24iKTtsZXQgZT0tMTtmb3IoY29uc3QgciBvZiB0KWlmKCFuKHIsKytlLHQpKXJldHVybiExO3JldHVybiEwfSx0LmV4dGVudD1ULHQuZmN1bXN1bT1mdW5jdGlvbih0LG4pe2NvbnN0IGU9bmV3IEE7bGV0IHI9LTE7cmV0dXJuIEZsb2F0NjRBcnJheS5mcm9tKHQsdm9pZCAwPT09bj90PT5lLmFkZCgrdHx8MCk6aT0+ZS5hZGQoK24oaSwrK3IsdCl8fDApKX0sdC5maWx0ZXI9ZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJ0ZXN0IGlzIG5vdCBhIGZ1bmN0aW9uIik7Y29uc3QgZT1bXTtsZXQgcj0tMTtmb3IoY29uc3QgaSBvZiB0KW4oaSwrK3IsdCkmJmUucHVzaChpKTtyZXR1cm4gZX0sdC5mbGF0R3JvdXA9ZnVuY3Rpb24odCwuLi5uKXtyZXR1cm4gJCh6KHQsLi4ubiksbil9LHQuZmxhdFJvbGx1cD1mdW5jdGlvbih0LG4sLi4uZSl7cmV0dXJuICQoUih0LG4sLi4uZSksZSl9LHQuZm9yY2VDZW50ZXI9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPTE7ZnVuY3Rpb24gaSgpe3ZhciBpLG8sYT1lLmxlbmd0aCx1PTAsYz0wO2ZvcihpPTA7aTxhOysraSl1Kz0obz1lW2ldKS54LGMrPW8ueTtmb3IodT0odS9hLXQpKnIsYz0oYy9hLW4pKnIsaT0wO2k8YTsrK2kpKG89ZVtpXSkueC09dSxvLnktPWN9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PW4mJihuPTApLGkuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXR9LGkueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixpKTp0fSxpLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsaSk6bn0saS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxpKTpyfSxpfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHIsaT0xLG89MTtmdW5jdGlvbiBhKCl7Zm9yKHZhciB0LGEsYyxmLHMsbCxoLGQ9bi5sZW5ndGgscD0wO3A8bzsrK3ApZm9yKGE9RGMobixPYyxCYykudmlzaXRBZnRlcih1KSx0PTA7dDxkOysrdCljPW5bdF0sbD1lW2MuaW5kZXhdLGg9bCpsLGY9Yy54K2Mudngscz1jLnkrYy52eSxhLnZpc2l0KGcpO2Z1bmN0aW9uIGcodCxuLGUsbyxhKXt2YXIgdT10LmRhdGEsZD10LnIscD1sK2Q7aWYoIXUpcmV0dXJuIG4+ZitwfHxvPGYtcHx8ZT5zK3B8fGE8cy1wO2lmKHUuaW5kZXg+Yy5pbmRleCl7dmFyIGc9Zi11LngtdS52eCx5PXMtdS55LXUudnksdj1nKmcreSp5O3Y8cCpwJiYoMD09PWcmJih2Kz0oZz1JYyhyKSkqZyksMD09PXkmJih2Kz0oeT1JYyhyKSkqeSksdj0ocC0odj1NYXRoLnNxcnQodikpKS92KmksYy52eCs9KGcqPXYpKihwPShkKj1kKS8oaCtkKSksYy52eSs9KHkqPXYpKnAsdS52eC09ZyoocD0xLXApLHUudnktPXkqcCl9fX1mdW5jdGlvbiB1KHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPWVbdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gYygpe2lmKG4pe3ZhciByLGksbz1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobykscj0wO3I8bzsrK3IpaT1uW3JdLGVbaS5pbmRleF09K3QoaSxyLG4pfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9VWMobnVsbD09dD8xOit0KSksYS5pbml0aWFsaXplPWZ1bmN0aW9uKHQsZSl7bj10LHI9ZSxjKCl9LGEuaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxhKTpvfSxhLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LGEpOml9LGEucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246VWMoK24pLGMoKSxhKTp0fSxhfSx0LmZvcmNlTGluaz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdT1ZYyxjPWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1VYygzMCkscz0xO2Z1bmN0aW9uIGwocil7Zm9yKHZhciBpPTAsdT10Lmxlbmd0aDtpPHM7KytpKWZvcih2YXIgYyxmLGwsaCxkLHAsZyx5PTA7eTx1OysreSlmPShjPXRbeV0pLnNvdXJjZSxoPShsPWMudGFyZ2V0KS54K2wudngtZi54LWYudnh8fEljKGEpLGQ9bC55K2wudnktZi55LWYudnl8fEljKGEpLGgqPXA9KChwPU1hdGguc3FydChoKmgrZCpkKSktZVt5XSkvcCpyKm5beV0sZCo9cCxsLnZ4LT1oKihnPW9beV0pLGwudnktPWQqZyxmLnZ4Kz1oKihnPTEtZyksZi52eSs9ZCpnfWZ1bmN0aW9uIGgoKXtpZihyKXt2YXIgYSxjLGY9ci5sZW5ndGgscz10Lmxlbmd0aCxsPW5ldyBNYXAoci5tYXAoKCh0LG4pPT5bdSh0LG4sciksdF0pKSk7Zm9yKGE9MCxpPW5ldyBBcnJheShmKTthPHM7KythKShjPXRbYV0pLmluZGV4PWEsIm9iamVjdCIhPXR5cGVvZiBjLnNvdXJjZSYmKGMuc291cmNlPUxjKGwsYy5zb3VyY2UpKSwib2JqZWN0IiE9dHlwZW9mIGMudGFyZ2V0JiYoYy50YXJnZXQ9TGMobCxjLnRhcmdldCkpLGlbYy5zb3VyY2UuaW5kZXhdPShpW2Muc291cmNlLmluZGV4XXx8MCkrMSxpW2MudGFyZ2V0LmluZGV4XT0oaVtjLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKGE9MCxvPW5ldyBBcnJheShzKTthPHM7KythKWM9dFthXSxvW2FdPWlbYy5zb3VyY2UuaW5kZXhdLyhpW2Muc291cmNlLmluZGV4XStpW2MudGFyZ2V0LmluZGV4XSk7bj1uZXcgQXJyYXkocyksZCgpLGU9bmV3IEFycmF5KHMpLHAoKX19ZnVuY3Rpb24gZCgpe2lmKHIpZm9yKHZhciBlPTAsaT10Lmxlbmd0aDtlPGk7KytlKW5bZV09K2ModFtlXSxlLHQpfWZ1bmN0aW9uIHAoKXtpZihyKWZvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpOysrbillW25dPStmKHRbbl0sbix0KX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGwuaW5pdGlhbGl6ZT1mdW5jdGlvbih0LG4pe3I9dCxhPW4saCgpfSxsLmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saCgpLGwpOnR9LGwuaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxsKTp1fSxsLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3QsbCk6c30sbC5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlVjKCt0KSxkKCksbCk6Y30sbC5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlVjKCt0KSxwKCksbCk6Zn0sbH0sdC5mb3JjZU1hbnlCb2R5PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHIsaSxvPVVjKC0zMCksYT0xLHU9MS8wLGM9LjgxO2Z1bmN0aW9uIGYoZSl7dmFyIGksbz10Lmxlbmd0aCxhPURjKHQsR2MsVmMpLnZpc2l0QWZ0ZXIobCk7Zm9yKHI9ZSxpPTA7aTxvOysraSluPXRbaV0sYS52aXNpdChoKX1mdW5jdGlvbiBzKCl7aWYodCl7dmFyIG4sZSxyPXQubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillPXRbbl0saVtlLmluZGV4XT0rbyhlLG4sdCl9fWZ1bmN0aW9uIGwodCl7dmFyIG4sZSxyLG8sYSx1PTAsYz0wO2lmKHQubGVuZ3RoKXtmb3Iocj1vPWE9MDthPDQ7KythKShuPXRbYV0pJiYoZT1NYXRoLmFicyhuLnZhbHVlKSkmJih1Kz1uLnZhbHVlLGMrPWUscis9ZSpuLngsbys9ZSpuLnkpO3QueD1yL2MsdC55PW8vY31lbHNleyhuPXQpLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPWlbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIGgodCxvLGYscyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIGw9dC54LW4ueCxoPXQueS1uLnksZD1zLW8scD1sKmwraCpoO2lmKGQqZC9jPHApcmV0dXJuIHA8dSYmKDA9PT1sJiYocCs9KGw9SWMoZSkpKmwpLDA9PT1oJiYocCs9KGg9SWMoZSkpKmgpLHA8YSYmKHA9TWF0aC5zcXJ0KGEqcCkpLG4udngrPWwqdC52YWx1ZSpyL3Asbi52eSs9aCp0LnZhbHVlKnIvcCksITA7aWYoISh0Lmxlbmd0aHx8cD49dSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PWwmJihwKz0obD1JYyhlKSkqbCksMD09PWgmJihwKz0oaD1JYyhlKSkqaCkscDxhJiYocD1NYXRoLnNxcnQoYSpwKSkpO2Rve3QuZGF0YSE9PW4mJihkPWlbdC5kYXRhLmluZGV4XSpyL3Asbi52eCs9bCpkLG4udnkrPWgqZCl9d2hpbGUodD10Lm5leHQpfX1yZXR1cm4gZi5pbml0aWFsaXplPWZ1bmN0aW9uKG4scil7dD1uLGU9cixzKCl9LGYuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVYygrdCkscygpLGYpOm99LGYuZGlzdGFuY2VNaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi5kaXN0YW5jZU1heD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmLnRoZXRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQqdCxmKTpNYXRoLnNxcnQoYyl9LGZ9LHQuZm9yY2VSYWRpYWw9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyxhPVVjKC4xKTtmdW5jdGlvbiB1KHQpe2Zvcih2YXIgYT0wLHU9ci5sZW5ndGg7YTx1OysrYSl7dmFyIGM9clthXSxmPWMueC1ufHwxZS02LHM9Yy55LWV8fDFlLTYsbD1NYXRoLnNxcnQoZipmK3MqcyksaD0ob1thXS1sKSppW2FdKnQvbDtjLnZ4Kz1mKmgsYy52eSs9cypofX1mdW5jdGlvbiBjKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pb1tuXT0rdChyW25dLG4sciksaVtuXT1pc05hTihvW25dKT8wOithKHJbbl0sbixyKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVVjKCt0KSksbnVsbD09biYmKG49MCksbnVsbD09ZSYmKGU9MCksdS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxjKCl9LHUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVYygrdCksYygpLHUpOmF9LHUucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246VWMoK24pLGMoKSx1KTp0fSx1Lng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsdSk6bn0sdS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LHUpOmV9LHV9LHQuZm9yY2VTaW11bGF0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuLGU9MSxyPS4wMDEsaT0xLU1hdGgucG93KHIsMS8zMDApLG89MCxhPS42LHU9bmV3IE1hcCxjPWtpKGwpLGY9RHQoInRpY2siLCJlbmQiKSxzPWZ1bmN0aW9uKCl7bGV0IHQ9MTtyZXR1cm4oKT0+KHQ9KGpjKnQrSGMpJVhjKS9YY30oKTtmdW5jdGlvbiBsKCl7aCgpLGYuY2FsbCgidGljayIsbiksZTxyJiYoYy5zdG9wKCksZi5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBoKHIpe3ZhciBjLGYscz10Lmxlbmd0aDt2b2lkIDA9PT1yJiYocj0xKTtmb3IodmFyIGw9MDtsPHI7KytsKWZvcihlKz0oby1lKSppLHUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dChlKX0pKSxjPTA7YzxzOysrYyludWxsPT0oZj10W2NdKS5meD9mLngrPWYudngqPWE6KGYueD1mLmZ4LGYudng9MCksbnVsbD09Zi5meT9mLnkrPWYudnkqPWE6KGYueT1mLmZ5LGYudnk9MCk7cmV0dXJuIG59ZnVuY3Rpb24gZCgpe2Zvcih2YXIgbixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtpZigobj10W2VdKS5pbmRleD1lLG51bGwhPW4uZngmJihuLng9bi5meCksbnVsbCE9bi5meSYmKG4ueT1uLmZ5KSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT0xMCpNYXRoLnNxcnQoLjUrZSksbz1lKldjO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBwKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0LHMpLG59cmV0dXJuIG51bGw9PXQmJih0PVtdKSxkKCksbj17dGljazpoLHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5yZXN0YXJ0KGwpLG59LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gYy5zdG9wKCksbn0sbm9kZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxkKCksdS5mb3JFYWNoKHApLG4pOnR9LGFscGhhOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LG4pOmV9LGFscGhhTWluOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LGFscGhhRGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6K2l9LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LG4pOm99LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9MS10LG4pOjEtYX0scmFuZG9tU291cmNlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsdS5mb3JFYWNoKHApLG4pOnN9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LmRlbGV0ZSh0KTp1LnNldCh0LHAoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxjLGY9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsZj0wO2Y8czsrK2YpKGE9KGk9bi0odT10W2ZdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoYz11LHI9YSk7cmV0dXJuIGN9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oZi5vbih0LGUpLG4pOmYub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9VWMoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVVjKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VWMoK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpVYygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVVjKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1VYyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlVjKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246VWMoK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9c2YsdC5mb3JtYXRMb2NhbGU9ZmYsdC5mb3JtYXRTcGVjaWZpZXI9dGYsdC5mc3VtPWZ1bmN0aW9uKHQsbil7Y29uc3QgZT1uZXcgQTtpZih2b2lkIDA9PT1uKWZvcihsZXQgbiBvZiB0KShuPStuKSYmZS5hZGQobik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCkoaT0rbihpLCsrcix0KSkmJmUuYWRkKGkpfXJldHVybitlfSx0Lmdlb0FsYmVycz13ZCx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPXdkKCksdT14ZCgpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksYz14ZCgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxmPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/YzphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGMuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksYy5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGMuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oZikscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rcGYscysuMTIqbitwZl0sW28tLjIxNCpuLXBmLHMrLjIzNCpuLXBmXV0pLnN0cmVhbShmKSxpPWMudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitwZixzKy4xNjYqbitwZl0sW28tLjExNSpuLXBmLHMrLjIzNCpuLXBmXV0pLnN0cmVhbShmKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGNkKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZkKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBzZChzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGxkKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBjcz1uZXcgQSxqZih0LGZzKSwyKmNzfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiB2ZChBZCkuc2NhbGUoMTI0Ljc1KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3PUFkLHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdmQoU2QpLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudFJhdz1TZCx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihKZj1RZj0tKFpmPUtmPTEvMCksb3M9W10samYodCxxcyksZT1vcy5sZW5ndGgpe2Zvcihvcy5zb3J0KFhzKSxuPTEsbz1bcj1vc1swXV07bjxlOysrbilHcyhyLChpPW9zW25dKVswXSl8fEdzKHIsaVsxXSk/KEhzKHJbMF0saVsxXSk+SHMoclswXSxyWzFdKSYmKHJbMV09aVsxXSksSHMoaVswXSxyWzFdKT5IcyhyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1IcyhyWzFdLGlbMF0pKT5hJiYoYT11LFpmPWlbMF0sUWY9clsxXSl9cmV0dXJuIG9zPWFzPW51bGwsWmY9PT0xLzB8fEtmPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW1pmLEtmXSxbUWYsSmZdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXt4cz13cz1Ncz1Ucz1Bcz1Tcz1Fcz1Ocz0wLGtzPW5ldyBBLENzPW5ldyBBLFBzPW5ldyBBLGpmKHQsVnMpO3ZhciBuPStrcyxlPStDcyxyPStQcyxpPU5mKG4sZSxyKTtyZXR1cm4gaTxnZiYmKG49U3MsZT1FcyxyPU5zLHdzPHBmJiYobj1NcyxlPVRzLHI9QXMpLChpPU5mKG4sZSxyKSk8Z2YpP1tOYU4sTmFOXTpbVGYoZSxuKSptZixGZihyL2kpKm1mXX0sdC5nZW9DaXJjbGU9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9b2woWzAsMF0pLHI9b2woOTApLGk9b2woNiksbz17cG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goZT1uKGUscikpLGVbMF0qPW1mLGVbMV0qPW1mfX07ZnVuY3Rpb24gYSgpe3ZhciBhPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqeGYsYz1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSp4ZjtyZXR1cm4gdD1bXSxuPWNsKC1hWzBdKnhmLC1hWzFdKnhmLDApLmludmVydCxkbChvLHUsYywxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9bj1udWxsLGF9cmV0dXJuIGEuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6b2woWyt0WzBdLCt0WzFdXSksYSk6ZX0sYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvbCgrdCksYSk6cn0sYS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpvbCgrdCksYSk6aX0sYX0sdC5nZW9DbGlwQW50aW1lcmlkaWFuPUFsLHQuZ2VvQ2xpcENpcmNsZT1TbCx0Lmdlb0NsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCxhPTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9JGwocixpLG8sYSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt1WzBdWzBdLGk9K3VbMF1bMV0sbz0rdVsxXVswXSxhPSt1WzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyxhXV19fX0sdC5nZW9DbGlwUmVjdGFuZ2xlPSRsLHQuZ2VvQ29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gYmQoQ2QpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9Q2QsdC5nZW9Db25pY0VxdWFsQXJlYT14ZCx0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PW1kLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBiZCh6ZCkuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PXpkLHQuZ2VvQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtyZXR1cm4odCYmWWwuaGFzT3duUHJvcGVydHkodC50eXBlKT9ZbFt0LnR5cGVdOmpsKSh0LG4pfSx0Lmdlb0Rpc3RhbmNlPUJsLHQuZ2VvRXF1YWxFYXJ0aD1mdW5jdGlvbigpe3JldHVybiB2ZChVZCkuc2NhbGUoMTc3LjE1OCl9LHQuZ2VvRXF1YWxFYXJ0aFJhdz1VZCx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiB2ZChQZCkuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9UGQsdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiB2ZChJZCkuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz1JZCx0Lmdlb0dyYXRpY3VsZT1RbCx0Lmdlb0dyYXRpY3VsZTEwPWZ1bmN0aW9uKCl7cmV0dXJuIFFsKCkoKX0sdC5nZW9JZGVudGl0eT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhLHU9MSxjPTAsZj0wLHM9MSxsPTEsaD0wLGQ9bnVsbCxwPTEsZz0xLHk9b2Qoe3BvaW50OmZ1bmN0aW9uKHQsbil7dmFyIGU9YihbdCxuXSk7dGhpcy5zdHJlYW0ucG9pbnQoZVswXSxlWzFdKX19KSx2PXJoO2Z1bmN0aW9uIF8oKXtyZXR1cm4gcD11KnMsZz11Kmwsbz1hPW51bGwsYn1mdW5jdGlvbiBiKGUpe3ZhciByPWVbMF0qcCxpPWVbMV0qZztpZihoKXt2YXIgbz1pKnQtcipuO3I9cip0K2kqbixpPW99cmV0dXJuW3IrYyxpK2ZdfXJldHVybiBiLmludmVydD1mdW5jdGlvbihlKXt2YXIgcj1lWzBdLWMsaT1lWzFdLWY7aWYoaCl7dmFyIG89aSp0K3IqbjtyPXIqdC1pKm4saT1vfXJldHVybltyL3AsaS9nXX0sYi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIG8mJmE9PT10P286bz15KHYoYT10KSl9LGIucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCxkPWU9cj1pPW51bGwsXygpKTp2fSxiLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9bnVsbD09dD8oZD1lPXI9aT1udWxsLHJoKTokbChkPSt0WzBdWzBdLGU9K3RbMF1bMV0scj0rdFsxXVswXSxpPSt0WzFdWzFdKSxfKCkpOm51bGw9PWQ/bnVsbDpbW2QsZV0sW3IsaV1dfSxiLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LF8oKSk6dX0sYi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3RbMF0sZj0rdFsxXSxfKCkpOltjLGZdfSxiLmFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPVBmKGg9ZSUzNjAqeGYpLHQ9QWYoaCksXygpKTpoKm1mfSxiLnJlZmxlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQ/LTE6MSxfKCkpOnM8MH0sYi5yZWZsZWN0WT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10Py0xOjEsXygpKTpsPDB9LGIuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGNkKGIsdCxuKX0sYi5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZkKGIsdCxuKX0sYi5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBzZChiLHQsbil9LGIuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGxkKGIsdCxuKX0sYn0sdC5nZW9JbnRlcnBvbGF0ZT1mdW5jdGlvbih0LG4pe3ZhciBlPXRbMF0qeGYscj10WzFdKnhmLGk9blswXSp4ZixvPW5bMV0qeGYsYT1BZihyKSx1PVBmKHIpLGM9QWYobyksZj1QZihvKSxzPWEqQWYoZSksbD1hKlBmKGUpLGg9YypBZihpKSxkPWMqUGYoaSkscD0yKkZmKCRmKHFmKG8tcikrYSpjKnFmKGktZSkpKSxnPVBmKHApLHk9cD9mdW5jdGlvbih0KXt2YXIgbj1QZih0Kj1wKS9nLGU9UGYocC10KS9nLHI9ZSpzK24qaCxpPWUqbCtuKmQsbz1lKnUrbipmO3JldHVybltUZihpLHIpKm1mLFRmKG8sJGYocipyK2kqaSkpKm1mXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSptZixyKm1mXX07cmV0dXJuIHkuZGlzdGFuY2U9cCx5fSx0Lmdlb0xlbmd0aD1VbCx0Lmdlb01lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIE5kKEVkKS5zY2FsZSg5NjEvYmYpfSx0Lmdlb01lcmNhdG9yUmF3PUVkLHQuZ2VvTmF0dXJhbEVhcnRoMT1mdW5jdGlvbigpe3JldHVybiB2ZChPZCkuc2NhbGUoMTc1LjI5NSl9LHQuZ2VvTmF0dXJhbEVhcnRoMVJhdz1PZCx0Lmdlb09ydGhvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB2ZChCZCkuc2NhbGUoMjQ5LjUpLmNsaXBBbmdsZSg5MCtwZil9LHQuZ2VvT3J0aG9ncmFwaGljUmF3PUJkLHQuZ2VvUGF0aD1mdW5jdGlvbih0LG4pe2xldCBlLHIsaT0zLG89NC41O2Z1bmN0aW9uIGEodCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgbyYmci5wb2ludFJhZGl1cygrby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGpmKHQsZShyKSkpLHIucmVzdWx0KCl9cmV0dXJuIGEuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gamYodCxlKGxoKSksbGgucmVzdWx0KCl9LGEubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gamYodCxlKFFoKSksUWgucmVzdWx0KCl9LGEuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBqZih0LGUoeGgpKSx4aC5yZXN1bHQoKX0sYS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gamYodCxlKEJoKSksQmgucmVzdWx0KCl9LGEucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1uPyh0PW51bGwscmgpOih0PW4pLnN0cmVhbSxhKTp0fSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD8obj1udWxsLG5ldyByZChpKSk6bmV3IFloKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJnIucG9pbnRSYWRpdXMobyksYSk6bn0sYS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihyLnBvaW50UmFkaXVzKCt0KSwrdCksYSk6b30sYS5kaWdpdHM9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk7aWYobnVsbD09dClpPW51bGw7ZWxzZXtjb25zdCBuPU1hdGguZmxvb3IodCk7aWYoIShuPj0wKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgaW52YWxpZCBkaWdpdHM6ICR7dH1gKTtpPW59cmV0dXJuIG51bGw9PT1uJiYocj1uZXcgcmQoaSkpLGF9LGEucHJvamVjdGlvbih0KS5kaWdpdHMoaSkuY29udGV4dChuKX0sdC5nZW9Qcm9qZWN0aW9uPXZkLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9X2QsdC5nZW9Sb3RhdGlvbj1obCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdmQoWWQpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1ZZCx0Lmdlb1N0cmVhbT1qZix0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOm9kKHQpfX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1OZChMZCksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6Wyh0PW4oKSlbMV0sLXRbMF1dfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6Wyh0PWUoKSlbMF0sdFsxXSx0WzJdLTkwXX0sZShbMCwwLDkwXSkuc2NhbGUoMTU5LjE1NSl9LHQuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3PUxkLHQuZ3JheT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgY3IodCwwLDAsbnVsbD09bj8xOm4pfSx0LmdyZWF0ZXN0PWF0LHQuZ3JlYXRlc3RJbmRleD1mdW5jdGlvbih0LGU9bil7aWYoMT09PWUubGVuZ3RoKXJldHVybiBudCh0LGUpO2xldCByLGk9LTEsbz0tMTtmb3IoY29uc3QgbiBvZiB0KSsrbywoaTwwPzA9PT1lKG4sbik6ZShuLHIpPjApJiYocj1uLGk9byk7cmV0dXJuIGl9LHQuZ3JvdXA9UCx0Lmdyb3VwU29ydD1mdW5jdGlvbih0LGUscil7cmV0dXJuKDIhPT1lLmxlbmd0aD9JKEQodCxlLHIpLCgoW3QsZV0sW3IsaV0pPT5uKGUsaSl8fG4odCxyKSkpOkkoUCh0LHIpLCgoW3Qscl0sW2ksb10pPT5lKHIsbyl8fG4odCxpKSkpKS5tYXAoKChbdF0pPT50KSl9LHQuZ3JvdXBzPXosdC5oY2w9cHIsdC5oaWVyYXJjaHk9VmQsdC5oaXN0b2dyYW09Six0LmhzbD1YZSx0Lmh0bWw9TmMsdC5pbWFnZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxyKXt2YXIgaT1uZXcgSW1hZ2U7Zm9yKHZhciBvIGluIG4paVtvXT1uW29dO2kub25lcnJvcj1yLGkub25sb2FkPWZ1bmN0aW9uKCl7ZShpKX0saS5zcmM9dH0pKX0sdC5pbmRleD1mdW5jdGlvbih0LC4uLm4pe3JldHVybiBxKHQsQyxGLG4pfSx0LmluZGV4ZXM9ZnVuY3Rpb24odCwuLi5uKXtyZXR1cm4gcSh0LEFycmF5LmZyb20sRixuKX0sdC5pbnRlcnBvbGF0ZT1Wcix0LmludGVycG9sYXRlQXJyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4oT3Iobik/SXI6QnIpKHQsbil9LHQuaW50ZXJwb2xhdGVCYXNpcz1Ocix0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9a3IsdC5pbnRlcnBvbGF0ZUJsdWVzPUdiLHQuaW50ZXJwb2xhdGVCckJHPW9iLHQuaW50ZXJwb2xhdGVCdUduPU1iLHQuaW50ZXJwb2xhdGVCdVB1PUFiLHQuaW50ZXJwb2xhdGVDaXZpZGlzPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoLTQuNTQtdCooMzUuMzQtdCooMjM4MS43My10Kig2NDAyLjctdCooNzAyNC43Mi0yNzEwLjU3KnQpKSkpKSkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCgzMi40OSt0KigxNzAuNzMrdCooNTIuODItdCooMTMxLjQ2LXQqKDE3Ni41OC02Ny4zNyp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoODEuMjQrdCooNDQyLjM2LXQqKDI0ODIuNDMtdCooNjE2Ny4yNC10Kig2NjE0Ljk0LTI0NzUuNjcqdCkpKSkpKSkrIikifSx0LmludGVycG9sYXRlQ29vbD1hbSx0LmludGVycG9sYXRlQ3ViZWhlbGl4PWhpLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PWltLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPWRpLHQuaW50ZXJwb2xhdGVEYXRlPVlyLHQuaW50ZXJwb2xhdGVEaXNjcmV0ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX0sdC5pbnRlcnBvbGF0ZUduQnU9RWIsdC5pbnRlcnBvbGF0ZUdyZWVucz1XYix0LmludGVycG9sYXRlR3JleXM9S2IsdC5pbnRlcnBvbGF0ZUhjbD1maSx0LmludGVycG9sYXRlSGNsTG9uZz1zaSx0LmludGVycG9sYXRlSHNsPWFpLHQuaW50ZXJwb2xhdGVIc2xMb25nPXVpLHQuaW50ZXJwb2xhdGVIdWU9ZnVuY3Rpb24odCxuKXt2YXIgZT16cigrdCwrbik7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuIG4tMzYwKk1hdGguZmxvb3Iobi8zNjApfX0sdC5pbnRlcnBvbGF0ZUluZmVybm89cG0sdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPURyKCh0PXVyKHQpKS5sLChuPXVyKG4pKS5sKSxyPURyKHQuYSxuLmEpLGk9RHIodC5iLG4uYiksbz1Ecih0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlTWFnbWE9ZG0sdC5pbnRlcnBvbGF0ZU51bWJlcj1Mcix0LmludGVycG9sYXRlTnVtYmVyQXJyYXk9SXIsdC5pbnRlcnBvbGF0ZU9iamVjdD1qcix0LmludGVycG9sYXRlT3JSZD1rYix0LmludGVycG9sYXRlT3Jhbmdlcz1ybSx0LmludGVycG9sYXRlUFJHbj11Yix0LmludGVycG9sYXRlUGlZRz1mYix0LmludGVycG9sYXRlUGxhc21hPWdtLHQuaW50ZXJwb2xhdGVQdUJ1PSRiLHQuaW50ZXJwb2xhdGVQdUJ1R249UGIsdC5pbnRlcnBvbGF0ZVB1T3I9bGIsdC5pbnRlcnBvbGF0ZVB1UmQ9UmIsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9SmIsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiB1bS5oPTM2MCp0LTEwMCx1bS5zPTEuNS0xLjUqbix1bS5sPS44LS45Km4sdW0rIiJ9LHQuaW50ZXJwb2xhdGVSZEJ1PWRiLHQuaW50ZXJwb2xhdGVSZEd5PWdiLHQuaW50ZXJwb2xhdGVSZFB1PXFiLHQuaW50ZXJwb2xhdGVSZFlsQnU9dmIsdC5pbnRlcnBvbGF0ZVJkWWxHbj1iYix0LmludGVycG9sYXRlUmVkcz1ubSx0LmludGVycG9sYXRlUmdiPVJyLHQuaW50ZXJwb2xhdGVSZ2JCYXNpcz1xcix0LmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQ9VXIsdC5pbnRlcnBvbGF0ZVJvdW5kPVdyLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLGNtLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLGNtLmc9MjU1KihuPU1hdGguc2luKHQrZm0pKSpuLGNtLmI9MjU1KihuPU1hdGguc2luKHQrc20pKSpuLGNtKyIifSx0LmludGVycG9sYXRlU3BlY3RyYWw9eGIsdC5pbnRlcnBvbGF0ZVN0cmluZz1Hcix0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPW5pLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9ZWksdC5pbnRlcnBvbGF0ZVR1cmJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoMzQuNjErdCooMTE3Mi4zMy10KigxMDc5My41Ni10KigzMzMwMC4xMi10KigzODM5NC40OS0xNDgyNS4wNSp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoMjMuMzErdCooNTU3LjMzK3QqKDEyMjUuMzMtdCooMzU3NC45Ni10KigxMDczLjc3KzcwNy41Nip0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoMjcuMit0KigzMjExLjEtdCooMTUzMjcuOTctdCooMjc4MTQtdCooMjI1NjkuMTgtNjgzOC42Nip0KSkpKSkpKSsiKSJ9LHQuaW50ZXJwb2xhdGVWaXJpZGlzPWhtLHQuaW50ZXJwb2xhdGVXYXJtPW9tLHQuaW50ZXJwb2xhdGVZbEduPUJiLHQuaW50ZXJwb2xhdGVZbEduQnU9SWIsdC5pbnRlcnBvbGF0ZVlsT3JCcj1MYix0LmludGVycG9sYXRlWWxPclJkPUhiLHQuaW50ZXJwb2xhdGVab29tPWlpLHQuaW50ZXJydXB0PVZpLHQuaW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsLi4ubil7dD1uZXcgSW50ZXJuU2V0KHQpLG49bi5tYXAoX3QpO3Q6Zm9yKGNvbnN0IGUgb2YgdClmb3IoY29uc3QgciBvZiBuKWlmKCFyLmhhcyhlKSl7dC5kZWxldGUoZSk7Y29udGludWUgdH1yZXR1cm4gdH0sdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IE5pLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKTooci5fcmVzdGFydD1yLnJlc3RhcnQsci5yZXN0YXJ0PWZ1bmN0aW9uKHQsbixlKXtuPStuLGU9bnVsbD09ZT9TaSgpOitlLHIuX3Jlc3RhcnQoKGZ1bmN0aW9uIG8oYSl7YSs9aSxyLl9yZXN0YXJ0KG8saSs9bixlKSx0KGEpfSksbixlKX0sci5yZXN0YXJ0KHQsbixlKSxyKX0sdC5pc29Gb3JtYXQ9Ul8sdC5pc29QYXJzZT1xXyx0Lmpzb249ZnVuY3Rpb24odCxuKXtyZXR1cm4gZmV0Y2godCxuKS50aGVuKEFjKX0sdC5sYWI9dXIsdC5sY2g9ZnVuY3Rpb24odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2RyKHQpOm5ldyBncihlLG4sdCxudWxsPT1yPzE6cil9LHQubGVhc3Q9ZnVuY3Rpb24odCxlPW4pe2xldCByLGk9ITE7aWYoMT09PWUubGVuZ3RoKXtsZXQgbztmb3IoY29uc3QgYSBvZiB0KXtjb25zdCB0PWUoYSk7KGk/bih0LG8pPDA6MD09PW4odCx0KSkmJihyPWEsbz10LGk9ITApfX1lbHNlIGZvcihjb25zdCBuIG9mIHQpKGk/ZShuLHIpPDA6MD09PWUobixuKSkmJihyPW4saT0hMCk7cmV0dXJuIHJ9LHQubGVhc3RJbmRleD1kdCx0LmxpbmU9WW0sdC5saW5lUmFkaWFsPVptLHQubGluaz1heCx0LmxpbmtIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuIGF4KG54KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7Y29uc3QgdD1heChyeCk7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdH0sdC5saW5rVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gYXgoZXgpfSx0LmxvY2FsPUpuLHQubWFwPWZ1bmN0aW9uKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbU3ltYm9sLml0ZXJhdG9yXSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigibWFwcGVyIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIEFycmF5LmZyb20odCwoKGUscik9Pm4oZSxyLHQpKSl9LHQubWF0Y2hlcj1XdCx0Lm1heD10dCx0Lm1heEluZGV4PW50LHQubWVhbj1mdW5jdGlvbih0LG4pe2xldCBlPTAscj0wO2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpbnVsbCE9biYmKG49K24pPj1uJiYoKytlLHIrPW4pO2Vsc2V7bGV0IGk9LTE7Zm9yKGxldCBvIG9mIHQpbnVsbCE9KG89bihvLCsraSx0KSkmJihvPStvKT49byYmKCsrZSxyKz1vKX1pZihlKXJldHVybiByL2V9LHQubWVkaWFuPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHV0KHQsLjUsbil9LHQubWVkaWFuSW5kZXg9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnQodCwuNSxuKX0sdC5tZXJnZT1zdCx0Lm1pbj1ldCx0Lm1pbkluZGV4PXJ0LHQubW9kZT1mdW5jdGlvbih0LG4pe2NvbnN0IGU9bmV3IEludGVybk1hcDtpZih2b2lkIDA9PT1uKWZvcihsZXQgbiBvZiB0KW51bGwhPW4mJm4+PW4mJmUuc2V0KG4sKGUuZ2V0KG4pfHwwKSsxKTtlbHNle2xldCByPS0xO2ZvcihsZXQgaSBvZiB0KW51bGwhPShpPW4oaSwrK3IsdCkpJiZpPj1pJiZlLnNldChpLChlLmdldChpKXx8MCkrMSl9bGV0IHIsaT0wO2Zvcihjb25zdFt0LG5db2YgZSluPmkmJihpPW4scj10KTtyZXR1cm4gcn0sdC5uYW1lc3BhY2U9T3QsdC5uYW1lc3BhY2VzPUl0LHQubmljZT1LLHQubm93PVNpLHQucGFjaz1mdW5jdGlvbigpe3ZhciB0PW51bGwsbj0xLGU9MSxyPWVwO2Z1bmN0aW9uIGkoaSl7Y29uc3Qgbz11cCgpO3JldHVybiBpLng9bi8yLGkueT1lLzIsdD9pLmVhY2hCZWZvcmUod3AodCkpLmVhY2hBZnRlcihNcChyLC41LG8pKS5lYWNoQmVmb3JlKFRwKDEpKTppLmVhY2hCZWZvcmUod3AoeHApKS5lYWNoQWZ0ZXIoTXAoZXAsMSxvKSkuZWFjaEFmdGVyKE1wKHIsaS5yL01hdGgubWluKG4sZSksbykpLmVhY2hCZWZvcmUoVHAoTWF0aC5taW4obixlKS8oMippLnIpKSksaX1yZXR1cm4gaS5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9dHAobiksaSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJwKCt0KSxpKTpyfSxpfSx0LnBhY2tFbmNsb3NlPWZ1bmN0aW9uKHQpe3JldHVybiBjcCh0LHVwKCkpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gbXAodCx1cCgpKSx0fSx0LnBhaXJzPWZ1bmN0aW9uKHQsbj1sdCl7Y29uc3QgZT1bXTtsZXQgcixpPSExO2Zvcihjb25zdCBvIG9mIHQpaSYmZS5wdXNoKG4ocixvKSkscj1vLGk9ITA7cmV0dXJuIGV9LHQucGFydGl0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9MSxuPTEsZT0wLHI9ITE7ZnVuY3Rpb24gaShpKXt2YXIgbz1pLmhlaWdodCsxO3JldHVybiBpLngwPWkueTA9ZSxpLngxPXQsaS55MT1uL28saS5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3IuY2hpbGRyZW4mJlNwKHIsci54MCx0KihyLmRlcHRoKzEpL24sci54MSx0KihyLmRlcHRoKzIpL24pO3ZhciBpPXIueDAsbz1yLnkwLGE9ci54MS1lLHU9ci55MS1lO2E8aSYmKGk9YT0oaSthKS8yKSx1PG8mJihvPXU9KG8rdSkvMiksci54MD1pLHIueTA9byxyLngxPWEsci55MT11fX0obixvKSksciYmaS5lYWNoQmVmb3JlKEFwKSxpfXJldHVybiBpLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSEhdCxpKTpyfSxpLnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2VbMF0sbj0rZVsxXSxpKTpbdCxuXX0saS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkpOmV9LGl9LHQucGF0aD1PYSx0LnBhdGhSb3VuZD1mdW5jdGlvbih0PTMpe3JldHVybiBuZXcgSWEoK3QpfSx0LnBlcm11dGU9VSx0LnBpZT1mdW5jdGlvbigpe3ZhciB0PUhtLG49am0sZT1udWxsLHI9eW0oMCksaT15bShFbSksbz15bSgwKTtmdW5jdGlvbiBhKGEpe3ZhciB1LGMsZixzLGwsaD0oYT1xbShhKSkubGVuZ3RoLGQ9MCxwPW5ldyBBcnJheShoKSxnPW5ldyBBcnJheShoKSx5PStyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx2PU1hdGgubWluKEVtLE1hdGgubWF4KC1FbSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKS15KSksXz1NYXRoLm1pbihNYXRoLmFicyh2KS9oLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxiPV8qKHY8MD8tMToxKTtmb3IodT0wO3U8aDsrK3UpKGw9Z1twW3VdPXVdPSt0KGFbdV0sdSxhKSk+MCYmKGQrPWwpO2ZvcihudWxsIT1uP3Auc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihnW3RdLGdbZV0pfSkpOm51bGwhPWUmJnAuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShhW3RdLGFbbl0pfSkpLHU9MCxmPWQ/KHYtaCpiKS9kOjA7dTxoOysrdSx5PXMpYz1wW3VdLHM9eSsoKGw9Z1tjXSk+MD9sKmY6MCkrYixnW2NdPXtkYXRhOmFbY10saW5kZXg6dSx2YWx1ZTpsLHN0YXJ0QW5nbGU6eSxlbmRBbmdsZTpzLHBhZEFuZ2xlOl99O3JldHVybiBnfXJldHVybiBhLnZhbHVlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246eW0oK24pLGEpOnR9LGEuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGU9bnVsbCxhKTpufSxhLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuPW51bGwsYSk6ZX0sYS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oK3QpLGEpOnJ9LGEuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksYSk6aX0sYS5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnltKCt0KSxhKTpvfSxhfSx0LnBpZWNld2lzZT1waSx0LnBvaW50UmFkaWFsPVFtLHQucG9pbnRlcj1lZSx0LnBvaW50ZXJzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudGFyZ2V0JiYodD1uZSh0KSx2b2lkIDA9PT1uJiYobj10LmN1cnJlbnRUYXJnZXQpLHQ9dC50b3VjaGVzfHxbdF0pLEFycmF5LmZyb20odCwodD0+ZWUodCxuKSkpfSx0LnBvbHlnb25BcmVhPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9dC5sZW5ndGgsaT10W3ItMV0sbz0wOysrZTxyOyluPWksaT10W2VdLG8rPW5bMV0qaVswXS1uWzBdKmlbMV07cmV0dXJuIG8vMn0sdC5wb2x5Z29uQ2VudHJvaWQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89MCxhPTAsdT10W2ktMV0sYz0wOysrcjxpOyluPXUsdT10W3JdLGMrPWU9blswXSp1WzFdLXVbMF0qblsxXSxvKz0oblswXSt1WzBdKSplLGErPShuWzFdK3VbMV0pKmU7cmV0dXJuW28vKGMqPTMpLGEvY119LHQucG9seWdvbkNvbnRhaW5zPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHIsaT10Lmxlbmd0aCxvPXRbaS0xXSxhPW5bMF0sdT1uWzFdLGM9b1swXSxmPW9bMV0scz0hMSxsPTA7bDxpOysrbCllPShvPXRbbF0pWzBdLChyPW9bMV0pPnUhPWY+dSYmYTwoYy1lKSoodS1yKS8oZi1yKStlJiYocz0hcyksYz1lLGY9cjtyZXR1cm4gc30sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KFhwKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1HcChyKSxhPUdwKGkpLHU9YVswXT09PW9bMF0sYz1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxmPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pZi5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtYzsrK24pZi5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBmfSx0LnBvbHlnb25MZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLGE9b1swXSx1PW9bMV0sYz0wOysrcjxpOyluPWEsZT11LG4tPWE9KG89dFtyXSlbMF0sZS09dT1vWzFdLGMrPU1hdGguaHlwb3QobixlKTtyZXR1cm4gY30sdC5wcmVjaXNpb25GaXhlZD1sZix0LnByZWNpc2lvblByZWZpeD1oZix0LnByZWNpc2lvblJvdW5kPWRmLHQucXVhZHRyZWU9RGMsdC5xdWFudGlsZT11dCx0LnF1YW50aWxlSW5kZXg9ZnQsdC5xdWFudGlsZVNvcnRlZD1jdCx0LnF1YW50aXplPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcillW3JdPXQoci8obi0xKSk7cmV0dXJuIGV9LHQucXVpY2tzZWxlY3Q9aXQsdC5yYWRpYWxBcmVhPUttLHQucmFkaWFsTGluZT1abSx0LnJhbmRvbUJhdGVzPXRnLHQucmFuZG9tQmVybm91bGxpPXJnLHQucmFuZG9tQmV0YT1hZyx0LnJhbmRvbUJpbm9taWFsPXVnLHQucmFuZG9tQ2F1Y2h5PWZnLHQucmFuZG9tRXhwb25lbnRpYWw9bmcsdC5yYW5kb21HYW1tYT1vZyx0LnJhbmRvbUdlb21ldHJpYz1pZyx0LnJhbmRvbUludD1acCx0LnJhbmRvbUlyd2luSGFsbD1KcCx0LnJhbmRvbUxjZz1mdW5jdGlvbih0PU1hdGgucmFuZG9tKCkpe2xldCBuPTB8KDA8PXQmJnQ8MT90L2hnOk1hdGguYWJzKHQpKTtyZXR1cm4oKT0+KG49MTY2NDUyNSpuKzEwMTM5MDQyMjN8MCxoZyoobj4+PjApKX0sdC5yYW5kb21Mb2dOb3JtYWw9UXAsdC5yYW5kb21Mb2dpc3RpYz1zZyx0LnJhbmRvbU5vcm1hbD1LcCx0LnJhbmRvbVBhcmV0bz1lZyx0LnJhbmRvbVBvaXNzb249bGcsdC5yYW5kb21Vbmlmb3JtPVdwLHQucmFuZG9tV2VpYnVsbD1jZyx0LnJhbmdlPWh0LHQucmFuaz1mdW5jdGlvbih0LGU9bil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbU3ltYm9sLml0ZXJhdG9yXSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlIik7bGV0IHI9QXJyYXkuZnJvbSh0KTtjb25zdCBpPW5ldyBGbG9hdDY0QXJyYXkoci5sZW5ndGgpOzIhPT1lLmxlbmd0aCYmKHI9ci5tYXAoZSksZT1uKTtjb25zdCBvPSh0LG4pPT5lKHJbdF0scltuXSk7bGV0IGEsdTtyZXR1cm4odD1VaW50MzJBcnJheS5mcm9tKHIsKCh0LG4pPT5uKSkpLnNvcnQoZT09PW4/KHQsbik9PkIoclt0XSxyW25dKTpPKG8pKSx0LmZvckVhY2goKCh0LG4pPT57Y29uc3QgZT1vKHQsdm9pZCAwPT09YT90OmEpO2U+PTA/KCh2b2lkIDA9PT1hfHxlPjApJiYoYT10LHU9biksaVt0XT11KTppW3RdPU5hTn0pKSxpfSx0LnJlZHVjZT1mdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlciBpcyBub3QgYSBmdW5jdGlvbiIpO2NvbnN0IHI9dFtTeW1ib2wuaXRlcmF0b3JdKCk7bGV0IGksbyxhPS0xO2lmKGFyZ3VtZW50cy5sZW5ndGg8Myl7aWYoKHtkb25lOmksdmFsdWU6ZX09ci5uZXh0KCkpLGkpcmV0dXJuOysrYX1mb3IoOyh7ZG9uZTppLHZhbHVlOm99PXIubmV4dCgpKSwhaTspZT1uKGUsbywrK2EsdCk7cmV0dXJuIGV9LHQucmV2ZXJzZT1mdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFtTeW1ib2wuaXRlcmF0b3JdKXRocm93IG5ldyBUeXBlRXJyb3IoInZhbHVlcyBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gQXJyYXkuZnJvbSh0KS5yZXZlcnNlKCl9LHQucmdiPXFlLHQucmliYm9uPWZ1bmN0aW9uKCl7cmV0dXJuIFphKCl9LHQucmliYm9uQXJyb3c9ZnVuY3Rpb24oKXtyZXR1cm4gWmEoV2EpfSx0LnJvbGx1cD1ELHQucm9sbHVwcz1SLHQuc2NhbGVCYW5kPXZnLHQuc2NhbGVEaXZlcmdpbmc9ZnVuY3Rpb24gdCgpe3ZhciBuPWtnKGpfKCkoeGcpKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKX0scGcuYXBwbHkobixhcmd1bWVudHMpfSx0LnNjYWxlRGl2ZXJnaW5nTG9nPWZ1bmN0aW9uIHQoKXt2YXIgbj1xZyhqXygpKS5kb21haW4oWy4xLDEsMTBdKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKS5iYXNlKG4uYmFzZSgpKX0scGcuYXBwbHkobixhcmd1bWVudHMpfSx0LnNjYWxlRGl2ZXJnaW5nUG93PUhfLHQuc2NhbGVEaXZlcmdpbmdTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIEhfLmFwcGx5KG51bGwsYXJndW1lbnRzKS5leHBvbmVudCguNSl9LHQuc2NhbGVEaXZlcmdpbmdTeW1sb2c9ZnVuY3Rpb24gdCgpe3ZhciBuPU9nKGpfKCkpO3JldHVybiBuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gWV8obix0KCkpLmNvbnN0YW50KG4uY29uc3RhbnQoKSl9LHBnLmFwcGx5KG4sYXJndW1lbnRzKX0sdC5zY2FsZUlkZW50aXR5PWZ1bmN0aW9uIHQobil7dmFyIGU7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dHx8aXNOYU4odD0rdCk/ZTp0fXJldHVybiByLmludmVydD1yLHIuZG9tYWluPXIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49QXJyYXkuZnJvbSh0LGJnKSxyKTpuLnNsaWNlKCl9LHIudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHIpOmV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLnVua25vd24oZSl9LG49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5mcm9tKG4sYmcpOlswLDFdLGtnKHIpfSx0LnNjYWxlSW1wbGljaXQ9Z2csdC5zY2FsZUxpbmVhcj1mdW5jdGlvbiB0KCl7dmFyIG49RWcoKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEFnKG4sdCgpKX0sZGcuYXBwbHkobixhcmd1bWVudHMpLGtnKG4pfSx0LnNjYWxlTG9nPWZ1bmN0aW9uIHQoKXtjb25zdCBuPXFnKFNnKCkpLmRvbWFpbihbMSwxMF0pO3JldHVybiBuLmNvcHk9KCk9PkFnKG4sdCgpKS5iYXNlKG4uYmFzZSgpKSxkZy5hcHBseShuLGFyZ3VtZW50cyksbn0sdC5zY2FsZU9yZGluYWw9eWcsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIF9nKHZnLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfSx0LnNjYWxlUG93PUhnLHQuc2NhbGVRdWFudGlsZT1mdW5jdGlvbiB0KCl7dmFyIGUscj1bXSxpPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLGkubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPWN0KHIsdC9uKTtyZXR1cm4gdX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10fHxpc05hTih0PSt0KT9lOmlbbChvLHQpXX1yZXR1cm4gdS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49aS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOltuPjA/b1tuLTFdOnJbMF0sbjxvLmxlbmd0aD9vW25dOnJbci5sZW5ndGgtMV1dfSx1LmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W107Zm9yKGxldCBuIG9mIHQpbnVsbD09bnx8aXNOYU4obj0rbil8fHIucHVzaChuKTtyZXR1cm4gci5zb3J0KG4pLGEoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1BcnJheS5mcm9tKHQpLGEoKSk6aS5zbGljZSgpfSx1LnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCx1KTplfSx1LnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKHIpLnJhbmdlKGkpLnVua25vd24oZSl9LGRnLmFwcGx5KHUsYXJndW1lbnRzKX0sdC5zY2FsZVF1YW50aXplPWZ1bmN0aW9uIHQoKXt2YXIgbixlPTAscj0xLGk9MSxvPVsuNV0sYT1bMCwxXTtmdW5jdGlvbiB1KHQpe3JldHVybiBudWxsIT10JiZ0PD10P2FbbChvLHQsMCxpKV06bn1mdW5jdGlvbiBjKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KGkpOysrdDxpOylvW3RdPSgodCsxKSpyLSh0LWkpKmUpLyhpKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oW2Uscl09dCxlPStlLHI9K3IsYygpKTpbZSxyXX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0oYT1BcnJheS5mcm9tKHQpKS5sZW5ndGgtMSxjKCkpOmEuc2xpY2UoKX0sdS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49YS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsdSk6dX0sdS50aHJlc2hvbGRzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oW2Uscl0pLnJhbmdlKGEpLnVua25vd24obil9LGRnLmFwcGx5KGtnKHUpLGFyZ3VtZW50cyl9LHQuc2NhbGVSYWRpYWw9ZnVuY3Rpb24gdCgpe3ZhciBuLGU9RWcoKSxyPVswLDFdLGk9ITE7ZnVuY3Rpb24gbyh0KXt2YXIgcj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaWduKHQpKk1hdGguc3FydChNYXRoLmFicyh0KSl9KGUodCkpO3JldHVybiBpc05hTihyKT9uOmk/TWF0aC5yb3VuZChyKTpyfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gZS5pbnZlcnQoWGcodCkpfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZS5kb21haW4odCksbyk6ZS5kb21haW4oKX0sby5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZS5yYW5nZSgocj1BcnJheS5mcm9tKHQsYmcpKS5tYXAoWGcpKSxvKTpyLnNsaWNlKCl9LG8ucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5yYW5nZSh0KS5yb3VuZCghMCl9LG8ucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ISF0LG8pOml9LG8uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGUuY2xhbXAodCksbyk6ZS5jbGFtcCgpfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxvKTpufSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlLmRvbWFpbigpLHIpLnJvdW5kKGkpLmNsYW1wKGUuY2xhbXAoKSkudW5rbm93bihuKX0sZGcuYXBwbHkobyxhcmd1bWVudHMpLGtnKG8pfSx0LnNjYWxlU2VxdWVudGlhbD1mdW5jdGlvbiB0KCl7dmFyIG49a2coQl8oKSh4ZykpO3JldHVybiBuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gWV8obix0KCkpfSxwZy5hcHBseShuLGFyZ3VtZW50cyl9LHQuc2NhbGVTZXF1ZW50aWFsTG9nPWZ1bmN0aW9uIHQoKXt2YXIgbj1xZyhCXygpKS5kb21haW4oWzEsMTBdKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKS5iYXNlKG4uYmFzZSgpKX0scGcuYXBwbHkobixhcmd1bWVudHMpfSx0LnNjYWxlU2VxdWVudGlhbFBvdz1MXyx0LnNjYWxlU2VxdWVudGlhbFF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPXhnO2Z1bmN0aW9uIGkodCl7aWYobnVsbCE9dCYmIWlzTmFOKHQ9K3QpKXJldHVybiByKChsKGUsdCwxKS0xKS8oZS5sZW5ndGgtMSkpfXJldHVybiBpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W107Zm9yKGxldCBuIG9mIHQpbnVsbD09bnx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KG4pLGl9LGkuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5yYW5nZT1mdW5jdGlvbigpe3JldHVybiBlLm1hcCgoKHQsbik9PnIobi8oZS5sZW5ndGgtMSkpKSl9LGkucXVhbnRpbGVzPWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5mcm9tKHtsZW5ndGg6dCsxfSwoKG4scik9PnV0KGUsci90KSkpfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChyKS5kb21haW4oZSl9LHBnLmFwcGx5KGksYXJndW1lbnRzKX0sdC5zY2FsZVNlcXVlbnRpYWxTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIExfLmFwcGx5KG51bGwsYXJndW1lbnRzKS5leHBvbmVudCguNSl9LHQuc2NhbGVTZXF1ZW50aWFsU3ltbG9nPWZ1bmN0aW9uIHQoKXt2YXIgbj1PZyhCXygpKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFlfKG4sdCgpKS5jb25zdGFudChuLmNvbnN0YW50KCkpfSxwZy5hcHBseShuLGFyZ3VtZW50cyl9LHQuc2NhbGVTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIEhnLmFwcGx5KG51bGwsYXJndW1lbnRzKS5leHBvbmVudCguNSl9LHQuc2NhbGVTeW1sb2c9ZnVuY3Rpb24gdCgpe3ZhciBuPU9nKFNnKCkpO3JldHVybiBuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQWcobix0KCkpLmNvbnN0YW50KG4uY29uc3RhbnQoKSl9LGRnLmFwcGx5KG4sYXJndW1lbnRzKX0sdC5zY2FsZVRocmVzaG9sZD1mdW5jdGlvbiB0KCl7dmFyIG4sZT1bLjVdLHI9WzAsMV0saT0xO2Z1bmN0aW9uIG8odCl7cmV0dXJuIG51bGwhPXQmJnQ8PXQ/cltsKGUsdCwwLGkpXTpufXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1BcnJheS5mcm9tKHQpLGk9TWF0aC5taW4oZS5sZW5ndGgsci5sZW5ndGgtMSksbyk6ZS5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUFycmF5LmZyb20odCksaT1NYXRoLm1pbihlLmxlbmd0aCxyLmxlbmd0aC0xKSxvKTpyLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm5bZVtuLTFdLGVbbl1dfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxvKTpufSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihlKS5yYW5nZShyKS51bmtub3duKG4pfSxkZy5hcHBseShvLGFyZ3VtZW50cyl9LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGRnLmFwcGx5KE9fKGN2LGZ2LG52LEt5LHd5LGd5LGx5LHV5LG95LHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pLGFyZ3VtZW50cyl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gZGcuYXBwbHkoT18oYXYsdXYscnYsSnkscXksdnksZHksZnksb3ksdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKSxhcmd1bWVudHMpfSx0LnNjYW49ZnVuY3Rpb24odCxuKXtjb25zdCBlPWR0KHQsbik7cmV0dXJuIGU8MD92b2lkIDA6ZX0sdC5zY2hlbWVBY2NlbnQ9Vl8sdC5zY2hlbWVCbHVlcz1YYix0LnNjaGVtZUJyQkc9aWIsdC5zY2hlbWVCdUduPXdiLHQuc2NoZW1lQnVQdT1UYix0LnNjaGVtZUNhdGVnb3J5MTA9R18sdC5zY2hlbWVEYXJrMj1XXyx0LnNjaGVtZUduQnU9U2IsdC5zY2hlbWVHcmVlbnM9VmIsdC5zY2hlbWVHcmV5cz1aYix0LnNjaGVtZU9yUmQ9TmIsdC5zY2hlbWVPcmFuZ2VzPWVtLHQuc2NoZW1lUFJHbj1hYix0LnNjaGVtZVBhaXJlZD1aXyx0LnNjaGVtZVBhc3RlbDE9S18sdC5zY2hlbWVQYXN0ZWwyPVFfLHQuc2NoZW1lUGlZRz1jYix0LnNjaGVtZVB1QnU9emIsdC5zY2hlbWVQdUJ1R249Q2IsdC5zY2hlbWVQdU9yPXNiLHQuc2NoZW1lUHVSZD1EYix0LnNjaGVtZVB1cnBsZXM9UWIsdC5zY2hlbWVSZEJ1PWhiLHQuc2NoZW1lUmRHeT1wYix0LnNjaGVtZVJkUHU9RmIsdC5zY2hlbWVSZFlsQnU9eWIsdC5zY2hlbWVSZFlsR249X2IsdC5zY2hlbWVSZWRzPXRtLHQuc2NoZW1lU2V0MT1KXyx0LnNjaGVtZVNldDI9dGIsdC5zY2hlbWVTZXQzPW5iLHQuc2NoZW1lU3BlY3RyYWw9bWIsdC5zY2hlbWVUYWJsZWF1MTA9ZWIsdC5zY2hlbWVZbEduPU9iLHQuc2NoZW1lWWxHbkJ1PVViLHQuc2NoZW1lWWxPckJyPVliLHQuc2NoZW1lWWxPclJkPWpiLHQuc2VsZWN0PUtuLHQuc2VsZWN0QWxsPWZ1bmN0aW9uKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgV24oW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCldLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgV24oW1h0KHQpXSxWbil9LHQuc2VsZWN0aW9uPVpuLHQuc2VsZWN0b3I9SHQsdC5zZWxlY3RvckFsbD1WdCx0LnNodWZmbGU9cHQsdC5zaHVmZmxlcj1ndCx0LnNvbWU9ZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJ0ZXN0IGlzIG5vdCBhIGZ1bmN0aW9uIik7bGV0IGU9LTE7Zm9yKGNvbnN0IHIgb2YgdClpZihuKHIsKytlLHQpKXJldHVybiEwO3JldHVybiExfSx0LnNvcnQ9SSx0LnN0YWNrPWZ1bmN0aW9uKCl7dmFyIHQ9eW0oW10pLG49ZHcsZT1odyxyPXB3O2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1PUFycmF5LmZyb20odC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZ3cpLGM9dS5sZW5ndGgsZj0tMTtmb3IoY29uc3QgdCBvZiBpKWZvcihvPTAsKytmO288YzsrK28pKHVbb11bZl09WzAsK3IodCx1W29dLmtleSxmLGkpXSkuZGF0YT10O2ZvcihvPTAsYT1xbShuKHUpKTtvPGM7KytvKXVbYVtvXV0uaW5kZXg9bztyZXR1cm4gZSh1LGEpLHV9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnltKEFycmF5LmZyb20obikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2R3OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0oQXJyYXkuZnJvbSh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9odzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MClmb3IodmFyIGUscixpLG8sYSx1LGM9MCxmPXRbblswXV0ubGVuZ3RoO2M8ZjsrK2MpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bY10pWzFdLXJbMF0pPjA/KHJbMF09byxyWzFdPW8rPWkpOmk8MD8oclsxXT1hLHJbMF09YSs9aSk6KHJbMF09MCxyWzFdPWkpfSx0LnN0YWNrT2Zmc2V0RXhwYW5kPWZ1bmN0aW9uKHQsbil7aWYoKHI9dC5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9dFswXS5sZW5ndGg7bzxhOysrbyl7Zm9yKGk9ZT0wO2U8cjsrK2UpaSs9dFtlXVtvXVsxXXx8MDtpZihpKWZvcihlPTA7ZTxyOysrZSl0W2VdW29dWzFdLz1pfWh3KHQsbil9fSx0LnN0YWNrT2Zmc2V0Tm9uZT1odyx0LnN0YWNrT2Zmc2V0U2lsaG91ZXR0ZT1mdW5jdGlvbih0LG4pe2lmKChlPXQubGVuZ3RoKT4wKXtmb3IodmFyIGUscj0wLGk9dFtuWzBdXSxvPWkubGVuZ3RoO3I8bzsrK3Ipe2Zvcih2YXIgYT0wLHU9MDthPGU7KythKXUrPXRbYV1bcl1bMV18fDA7aVtyXVsxXSs9aVtyXVswXT0tdS8yfWh3KHQsbil9fSx0LnN0YWNrT2Zmc2V0V2lnZ2xlPWZ1bmN0aW9uKHQsbil7aWYoKGk9dC5sZW5ndGgpPjAmJihyPShlPXRbblswXV0pLmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT0xO2E8cjsrK2Epe2Zvcih2YXIgdT0wLGM9MCxmPTA7dTxpOysrdSl7Zm9yKHZhciBzPXRbblt1XV0sbD1zW2FdWzFdfHwwLGg9KGwtKHNbYS0xXVsxXXx8MCkpLzIsZD0wO2Q8dTsrK2Qpe3ZhciBwPXRbbltkXV07aCs9KHBbYV1bMV18fDApLShwW2EtMV1bMV18fDApfWMrPWwsZis9aCpsfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sYyYmKG8tPWYvYyl9ZVthLTFdWzFdKz1lW2EtMV1bMF09byxodyh0LG4pfX0sdC5zdGFja09yZGVyQXBwZWFyYW5jZT15dyx0LnN0YWNrT3JkZXJBc2NlbmRpbmc9X3csdC5zdGFja09yZGVyRGVzY2VuZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gX3codCkucmV2ZXJzZSgpfSx0LnN0YWNrT3JkZXJJbnNpZGVPdXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyPXQubGVuZ3RoLGk9dC5tYXAoYncpLG89eXcodCksYT0wLHU9MCxjPVtdLGY9W107Zm9yKG49MDtuPHI7KytuKWU9b1tuXSxhPHU/KGErPWlbZV0sYy5wdXNoKGUpKToodSs9aVtlXSxmLnB1c2goZSkpO3JldHVybiBmLnJldmVyc2UoKS5jb25jYXQoYyl9LHQuc3RhY2tPcmRlck5vbmU9ZHcsdC5zdGFja09yZGVyUmV2ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gZHcodCkucmV2ZXJzZSgpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQsbj1DcCxlPVBwO2Z1bmN0aW9uIHIocil7dmFyIGksbyxhLHUsYyxmLHMsbCxoPUFycmF5LmZyb20ociksZD1uLHA9ZSxnPW5ldyBNYXA7aWYobnVsbCE9dCl7Y29uc3Qgbj1oLm1hcCgoKG4sZSk9PmZ1bmN0aW9uKHQpe3Q9YCR7dH1gO2xldCBuPXQubGVuZ3RoOyRwKHQsbi0xKSYmISRwKHQsbi0yKSYmKHQ9dC5zbGljZSgwLC0xKSk7cmV0dXJuIi8iPT09dFswXT90OmAvJHt0fWB9KHQobixlLHIpKSkpLGU9bi5tYXAoenApLGk9bmV3IFNldChuKS5hZGQoIiIpO2Zvcihjb25zdCB0IG9mIGUpaS5oYXModCl8fChpLmFkZCh0KSxuLnB1c2godCksZS5wdXNoKHpwKHQpKSxoLnB1c2goa3ApKTtkPSh0LGUpPT5uW2VdLHA9KHQsbik9PmVbbl19Zm9yKGE9MCxpPWgubGVuZ3RoO2E8aTsrK2Epbz1oW2FdLGY9aFthXT1uZXcgSmQobyksbnVsbCE9KHM9ZChvLGEscikpJiYocys9IiIpJiYobD1mLmlkPXMsZy5zZXQobCxnLmhhcyhsKT9OcDpmKSksbnVsbCE9KHM9cChvLGEscikpJiYocys9IiIpJiYoZi5wYXJlbnQ9cyk7Zm9yKGE9MDthPGk7KythKWlmKHM9KGY9aFthXSkucGFyZW50KXtpZighKGM9Zy5nZXQocykpKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIitzKTtpZihjPT09TnApdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIrcyk7Yy5jaGlsZHJlbj9jLmNoaWxkcmVuLnB1c2goZik6Yy5jaGlsZHJlbj1bZl0sZi5wYXJlbnQ9Y31lbHNle2lmKHUpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSByb290cyIpO3U9Zn1pZighdSl0aHJvdyBuZXcgRXJyb3IoIm5vIHJvb3QiKTtpZihudWxsIT10KXtmb3IoO3UuZGF0YT09PWtwJiYxPT09dS5jaGlsZHJlbi5sZW5ndGg7KXU9dS5jaGlsZHJlblswXSwtLWk7Zm9yKGxldCB0PWgubGVuZ3RoLTE7dD49MCYmKGY9aFt0XSkuZGF0YT09PWtwOy0tdClmLmRhdGE9bnVsbH1pZih1LnBhcmVudD1FcCx1LmVhY2hCZWZvcmUoKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLWl9KSkuZWFjaEJlZm9yZShRZCksdS5wYXJlbnQ9bnVsbCxpPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiB1fXJldHVybiByLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXRwKHQpLHIpOm59LHIucGFyZW50SWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dHAodCkscik6ZX0sci5wYXRoPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PXRwKG4pLHIpOnR9LHJ9LHQuc3R5bGU9Ym4sdC5zdWJzZXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gYnQobix0KX0sdC5zdW09ZnVuY3Rpb24odCxuKXtsZXQgZT0wO2lmKHZvaWQgMD09PW4pZm9yKGxldCBuIG9mIHQpKG49K24pJiYoZSs9bik7ZWxzZXtsZXQgcj0tMTtmb3IobGV0IGkgb2YgdCkoaT0rbihpLCsrcix0KSkmJihlKz1pKX1yZXR1cm4gZX0sdC5zdXBlcnNldD1idCx0LnN2Zz1rYyx0LnN5bWJvbD1mdW5jdGlvbih0LG4pe2xldCBlPW51bGwscj1rbShpKTtmdW5jdGlvbiBpKCl7bGV0IGk7aWYoZXx8KGU9aT1yKCkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcoZSwrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGkpcmV0dXJuIGU9bnVsbCxpKyIifHxudWxsfXJldHVybiB0PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eW0odHx8ZngpLG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bSh2b2lkIDA9PT1uPzY0OituKSxpLnR5cGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp5bShuKSxpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5bSgrdCksaSk6bn0saS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDp0LGkpOmV9LGl9LHQuc3ltYm9sQXN0ZXJpc2s9Y3gsdC5zeW1ib2xDaXJjbGU9ZngsdC5zeW1ib2xDcm9zcz1zeCx0LnN5bWJvbERpYW1vbmQ9ZHgsdC5zeW1ib2xEaWFtb25kMj1weCx0LnN5bWJvbFBsdXM9Z3gsdC5zeW1ib2xTcXVhcmU9eXgsdC5zeW1ib2xTcXVhcmUyPXZ4LHQuc3ltYm9sU3Rhcj14eCx0LnN5bWJvbFRpbWVzPVB4LHQuc3ltYm9sVHJpYW5nbGU9TXgsdC5zeW1ib2xUcmlhbmdsZTI9QXgsdC5zeW1ib2xXeWU9Q3gsdC5zeW1ib2xYPVB4LHQuc3ltYm9scz16eCx0LnN5bWJvbHNGaWxsPXp4LHQuc3ltYm9sc1N0cm9rZT0keCx0LnRleHQ9eGMsdC50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzPWZ1bmN0aW9uKHQsbixlKXtjb25zdCByPV8odCksaT11dCh0LC43NSktdXQodCwuMjUpO3JldHVybiByJiZpP01hdGguY2VpbCgoZS1uKS8oMippKk1hdGgucG93KHIsLTEvMykpKToxfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtjb25zdCByPV8odCksaT1NKHQpO3JldHVybiByJiZpP01hdGguY2VpbCgoZS1uKSpNYXRoLmNicnQocikvKDMuNDkqaSkpOjF9LHQudGhyZXNob2xkU3R1cmdlcz1RLHQudGlja0Zvcm1hdD1OZyx0LnRpY2tJbmNyZW1lbnQ9Vyx0LnRpY2tTdGVwPVosdC50aWNrcz1WLHQudGltZURheT1neSx0LnRpbWVEYXlzPXl5LHQudGltZUZvcm1hdERlZmF1bHRMb2NhbGU9el8sdC50aW1lRm9ybWF0TG9jYWxlPWR2LHQudGltZUZyaWRheT1FeSx0LnRpbWVGcmlkYXlzPUR5LHQudGltZUhvdXI9bHksdC50aW1lSG91cnM9aHksdC50aW1lSW50ZXJ2YWw9V2csdC50aW1lTWlsbGlzZWNvbmQ9WmcsdC50aW1lTWlsbGlzZWNvbmRzPUtnLHQudGltZU1pbnV0ZT11eSx0LnRpbWVNaW51dGVzPWN5LHQudGltZU1vbmRheT1NeSx0LnRpbWVNb25kYXlzPUN5LHQudGltZU1vbnRoPUt5LHQudGltZU1vbnRocz1ReSx0LnRpbWVTYXR1cmRheT1OeSx0LnRpbWVTYXR1cmRheXM9UnksdC50aW1lU2Vjb25kPW95LHQudGltZVNlY29uZHM9YXksdC50aW1lU3VuZGF5PXd5LHQudGltZVN1bmRheXM9a3ksdC50aW1lVGh1cnNkYXk9U3ksdC50aW1lVGh1cnNkYXlzPSR5LHQudGltZVRpY2tJbnRlcnZhbD1mdix0LnRpbWVUaWNrcz1jdix0LnRpbWVUdWVzZGF5PVR5LHQudGltZVR1ZXNkYXlzPVB5LHQudGltZVdlZG5lc2RheT1BeSx0LnRpbWVXZWRuZXNkYXlzPXp5LHQudGltZVdlZWs9d3ksdC50aW1lV2Vla3M9a3ksdC50aW1lWWVhcj1udix0LnRpbWVZZWFycz1ldix0LnRpbWVvdXQ9RGksdC50aW1lcj1raSx0LnRpbWVyRmx1c2g9Q2ksdC50cmFuc2l0aW9uPXlvLHQudHJhbnNwb3NlPXl0LHQudHJlZT1mdW5jdGlvbigpe3ZhciB0PURwLG49MSxlPTEscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIGM9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpLG8sYT1uZXcgSXAodCwwKSx1PVthXTtuPXUucG9wKCk7KWlmKHI9bi5fLmNoaWxkcmVuKWZvcihuLmNoaWxkcmVuPW5ldyBBcnJheShvPXIubGVuZ3RoKSxpPW8tMTtpPj0wOy0taSl1LnB1c2goZT1uLmNoaWxkcmVuW2ldPW5ldyBJcChyW2ldLGkpKSxlLnBhcmVudD1uO3JldHVybihhLnBhcmVudD1uZXcgSXAobnVsbCwwKSkuY2hpbGRyZW49W2FdLGF9KGkpO2lmKGMuZWFjaEFmdGVyKG8pLGMucGFyZW50Lm09LWMueixjLmVhY2hCZWZvcmUoYSkscilpLmVhY2hCZWZvcmUodSk7ZWxzZXt2YXIgZj1pLHM9aSxsPWk7aS5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng8Zi54JiYoZj10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSkpO3ZhciBoPWY9PT1zPzE6dChmLHMpLzIsZD1oLWYueCxwPW4vKHMueCtoK2QpLGc9ZS8obC5kZXB0aHx8MSk7aS5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng9KHQueCtkKSpwLHQueT10LmRlcHRoKmd9KSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGM9by5wYXJlbnQuY2hpbGRyZW5bMF0sZj1vLm0scz1hLm0sbD11Lm0saD1jLm07dT1GcCh1KSxvPVJwKG8pLHUmJm87KWM9UnAoYyksKGE9RnAoYSkpLmE9biwoaT11LnorbC1vLnotZit0KHUuXyxvLl8pKT4wJiYocXAoVXAodSxuLHIpLG4saSksZis9aSxzKz1pKSxsKz11Lm0sZis9by5tLGgrPWMubSxzKz1hLm07dSYmIUZwKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFScChjKSYmKGMudD1vLGMubSs9Zi1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1McCxuPSExLGU9MSxyPTEsaT1bMF0sbz1lcCxhPWVwLHU9ZXAsYz1lcCxmPWVwO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShBcCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1mKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWMobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW5wKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cnAoK3QpLHMpOmN9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpycCgrdCkscyk6Zn0sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sYz11Lmxlbmd0aCxmPW5ldyBBcnJheShjKzEpO2ZvcihmWzBdPWE9bz0wO288YzsrK28pZltvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsYyl7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Yyl9dmFyIGw9ZltuXSxoPXIvMitsLGQ9bisxLHA9ZS0xO2Zvcig7ZDxwOyl7dmFyIGc9ZCtwPj4+MTtmW2ddPGg/ZD1nKzE6cD1nfWgtZltkLTFdPGZbZF0taCYmbisxPGQmJi0tZDt2YXIgeT1mW2RdLWwsdj1yLXk7aWYoYS1pPmMtbyl7dmFyIF89cj8oaSp2K2EqeSkvcjphO3QobixkLHksaSxvLF8sYyksdChkLGUsdixfLG8sYSxjKX1lbHNle3ZhciBiPXI/KG8qditjKnkpL3I6Yzt0KG4sZCx5LGksbyxhLGIpLHQoZCxlLHYsaSxiLGEsYyl9fSgwLGMsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1TcCx0LnRyZWVtYXBSZXNxdWFyaWZ5PWpwLHQudHJlZW1hcFNsaWNlPU9wLHQudHJlZW1hcFNsaWNlRGljZT1mdW5jdGlvbih0LG4sZSxyLGkpeygxJnQuZGVwdGg/T3A6U3ApKHQsbixlLHIsaSl9LHQudHJlZW1hcFNxdWFyaWZ5PUxwLHQudHN2PVRjLHQudHN2Rm9ybWF0PWhjLHQudHN2Rm9ybWF0Qm9keT1kYyx0LnRzdkZvcm1hdFJvdz1nYyx0LnRzdkZvcm1hdFJvd3M9cGMsdC50c3ZGb3JtYXRWYWx1ZT15Yyx0LnRzdlBhcnNlPXNjLHQudHN2UGFyc2VSb3dzPWxjLHQudW5pb249ZnVuY3Rpb24oLi4udCl7Y29uc3Qgbj1uZXcgSW50ZXJuU2V0O2Zvcihjb25zdCBlIG9mIHQpZm9yKGNvbnN0IHQgb2YgZSluLmFkZCh0KTtyZXR1cm4gbn0sdC51bml4RGF5PWJ5LHQudW5peERheXM9bXksdC51dGNEYXk9dnksdC51dGNEYXlzPV95LHQudXRjRnJpZGF5PVl5LHQudXRjRnJpZGF5cz1XeSx0LnV0Y0hvdXI9ZHksdC51dGNIb3Vycz1weSx0LnV0Y01pbGxpc2Vjb25kPVpnLHQudXRjTWlsbGlzZWNvbmRzPUtnLHQudXRjTWludXRlPWZ5LHQudXRjTWludXRlcz1zeSx0LnV0Y01vbmRheT1VeSx0LnV0Y01vbmRheXM9SHksdC51dGNNb250aD1KeSx0LnV0Y01vbnRocz10dix0LnV0Y1NhdHVyZGF5PUx5LHQudXRjU2F0dXJkYXlzPVp5LHQudXRjU2Vjb25kPW95LHQudXRjU2Vjb25kcz1heSx0LnV0Y1N1bmRheT1xeSx0LnV0Y1N1bmRheXM9anksdC51dGNUaHVyc2RheT1CeSx0LnV0Y1RodXJzZGF5cz1WeSx0LnV0Y1RpY2tJbnRlcnZhbD11dix0LnV0Y1RpY2tzPWF2LHQudXRjVHVlc2RheT1JeSx0LnV0Y1R1ZXNkYXlzPVh5LHQudXRjV2VkbmVzZGF5PU95LHQudXRjV2VkbmVzZGF5cz1HeSx0LnV0Y1dlZWs9cXksdC51dGNXZWVrcz1qeSx0LnV0Y1llYXI9cnYsdC51dGNZZWFycz1pdix0LnZhcmlhbmNlPXcsdC52ZXJzaW9uPSI3LjguNCIsdC53aW5kb3c9Z24sdC54bWw9RWMsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4geXQoYXJndW1lbnRzKX0sdC56b29tPWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9RXcsaT1OdyxvPXp3LGE9Q3csdT1QdyxjPVswLDEvMF0sZj1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPWlpLGg9RHQoInN0YXJ0Iiwiem9vbSIsImVuZCIpLGQ9NTAwLHA9MTUwLGc9MCx5PTEwO2Z1bmN0aW9uIHYodCl7dC5wcm9wZXJ0eSgiX196b29tIixrdykub24oIndoZWVsLnpvb20iLFQse3Bhc3NpdmU6ITF9KS5vbigibW91c2Vkb3duLnpvb20iLEEpLm9uKCJkYmxjbGljay56b29tIixTKS5maWx0ZXIodSkub24oInRvdWNoc3RhcnQuem9vbSIsRSkub24oInRvdWNobW92ZS56b29tIixOKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixrKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChjWzBdLE1hdGgubWluKGNbMV0sbikpKT09PXQuaz90Om5ldyB3dyhuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IHd3KHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSxyKXt0Lm9uKCJzdGFydC56b29tIiwoZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5ldmVudChyKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuZXZlbnQocikuZW5kKCl9KSkudHdlZW4oInpvb20iLChmdW5jdGlvbigpe3ZhciB0PXRoaXMsbz1hcmd1bWVudHMsYT13KHQsbykuZXZlbnQociksdT1pLmFwcGx5KHQsbyksYz1udWxsPT1lP20odSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LG8pOmUsZj1NYXRoLm1heCh1WzFdWzBdLXVbMF1bMF0sdVsxXVsxXS11WzBdWzFdKSxzPXQuX196b29tLGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LG8pOm4sZD1sKHMuaW52ZXJ0KGMpLmNvbmNhdChmL3MuayksaC5pbnZlcnQoYykuY29uY2F0KGYvaC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9aDtlbHNle3ZhciBuPWQodCksZT1mL25bMl07dD1uZXcgd3coZSxjWzBdLW5bMF0qZSxjWzFdLW5bMV0qZSl9YS56b29tKG51bGwsdCl9fSkpfWZ1bmN0aW9uIHcodCxuLGUpe3JldHVybiFlJiZ0Ll9fem9vbWluZ3x8bmV3IE0odCxuKX1mdW5jdGlvbiBNKHQsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPW4sdGhpcy5hY3RpdmU9MCx0aGlzLnNvdXJjZUV2ZW50PW51bGwsdGhpcy5leHRlbnQ9aS5hcHBseSh0LG4pLHRoaXMudGFwcz0wfWZ1bmN0aW9uIFQodCwuLi5uKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGU9dyh0aGlzLG4pLmV2ZW50KHQpLGk9dGhpcy5fX3pvb20sdT1NYXRoLm1heChjWzBdLE1hdGgubWluKGNbMV0saS5rKk1hdGgucG93KDIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKSkscz1lZSh0KTtpZihlLndoZWVsKWUubW91c2VbMF1bMF09PT1zWzBdJiZlLm1vdXNlWzBdWzFdPT09c1sxXXx8KGUubW91c2VbMV09aS5pbnZlcnQoZS5tb3VzZVswXT1zKSksY2xlYXJUaW1lb3V0KGUud2hlZWwpO2Vsc2V7aWYoaS5rPT09dSlyZXR1cm47ZS5tb3VzZT1bcyxpLmludmVydChzKV0sVmkodGhpcyksZS5zdGFydCgpfVN3KHQpLGUud2hlZWw9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLndoZWVsPW51bGwsZS5lbmQoKX0pLHApLGUuem9vbSgibW91c2UiLG8oYihfKGksdSksZS5tb3VzZVswXSxlLm1vdXNlWzFdKSxlLmV4dGVudCxmKSl9fWZ1bmN0aW9uIEEodCwuLi5uKXtpZighZSYmci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBpPXQuY3VycmVudFRhcmdldCxhPXcodGhpcyxuLCEwKS5ldmVudCh0KSx1PUtuKHQudmlldykub24oIm1vdXNlbW92ZS56b29tIiwoZnVuY3Rpb24odCl7aWYoU3codCksIWEubW92ZWQpe3ZhciBuPXQuY2xpZW50WC1zLGU9dC5jbGllbnRZLWw7YS5tb3ZlZD1uKm4rZSplPmd9YS5ldmVudCh0KS56b29tKCJtb3VzZSIsbyhiKGEudGhhdC5fX3pvb20sYS5tb3VzZVswXT1lZSh0LGkpLGEubW91c2VbMV0pLGEuZXh0ZW50LGYpKX0pLCEwKS5vbigibW91c2V1cC56b29tIiwoZnVuY3Rpb24odCl7dS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxjZSh0LnZpZXcsYS5tb3ZlZCksU3codCksYS5ldmVudCh0KS5lbmQoKX0pLCEwKSxjPWVlKHQsaSkscz10LmNsaWVudFgsbD10LmNsaWVudFk7dWUodC52aWV3KSxBdyh0KSxhLm1vdXNlPVtjLHRoaXMuX196b29tLmludmVydChjKV0sVmkodGhpcyksYS5zdGFydCgpfX1mdW5jdGlvbiBTKHQsLi4ubil7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlPXRoaXMuX196b29tLGE9ZWUodC5jaGFuZ2VkVG91Y2hlcz90LmNoYW5nZWRUb3VjaGVzWzBdOnQsdGhpcyksdT1lLmludmVydChhKSxjPWUuayoodC5zaGlmdEtleT8uNToyKSxsPW8oYihfKGUsYyksYSx1KSxpLmFwcGx5KHRoaXMsbiksZik7U3codCkscz4wP0tuKHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihzKS5jYWxsKHgsbCxhLHQpOktuKHRoaXMpLmNhbGwodi50cmFuc2Zvcm0sbCxhLHQpfX1mdW5jdGlvbiBFKGUsLi4uaSl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvLGEsdSxjLGY9ZS50b3VjaGVzLHM9Zi5sZW5ndGgsbD13KHRoaXMsaSxlLmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PXMpLmV2ZW50KGUpO2ZvcihBdyhlKSxhPTA7YTxzOysrYSljPVtjPWVlKHU9ZlthXSx0aGlzKSx0aGlzLl9fem9vbS5pbnZlcnQoYyksdS5pZGVudGlmaWVyXSxsLnRvdWNoMD9sLnRvdWNoMXx8bC50b3VjaDBbMl09PT1jWzJdfHwobC50b3VjaDE9YyxsLnRhcHM9MCk6KGwudG91Y2gwPWMsbz0hMCxsLnRhcHM9MSshIXQpO3QmJih0PWNsZWFyVGltZW91dCh0KSksbyYmKGwudGFwczwyJiYobj1jWzBdLHQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0PW51bGx9KSxkKSksVmkodGhpcyksbC5zdGFydCgpKX19ZnVuY3Rpb24gTih0LC4uLm4pe2lmKHRoaXMuX196b29taW5nKXt2YXIgZSxyLGksYSx1PXcodGhpcyxuKS5ldmVudCh0KSxjPXQuY2hhbmdlZFRvdWNoZXMscz1jLmxlbmd0aDtmb3IoU3codCksZT0wO2U8czsrK2UpaT1lZShyPWNbZV0sdGhpcyksdS50b3VjaDAmJnUudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP3UudG91Y2gwWzBdPWk6dS50b3VjaDEmJnUudG91Y2gxWzJdPT09ci5pZGVudGlmaWVyJiYodS50b3VjaDFbMF09aSk7aWYocj11LnRoYXQuX196b29tLHUudG91Y2gxKXt2YXIgbD11LnRvdWNoMFswXSxoPXUudG91Y2gwWzFdLGQ9dS50b3VjaDFbMF0scD11LnRvdWNoMVsxXSxnPShnPWRbMF0tbFswXSkqZysoZz1kWzFdLWxbMV0pKmcseT0oeT1wWzBdLWhbMF0pKnkrKHk9cFsxXS1oWzFdKSp5O3I9XyhyLE1hdGguc3FydChnL3kpKSxpPVsobFswXStkWzBdKS8yLChsWzFdK2RbMV0pLzJdLGE9WyhoWzBdK3BbMF0pLzIsKGhbMV0rcFsxXSkvMl19ZWxzZXtpZighdS50b3VjaDApcmV0dXJuO2k9dS50b3VjaDBbMF0sYT11LnRvdWNoMFsxXX11Lnpvb20oInRvdWNoIixvKGIocixpLGEpLHUuZXh0ZW50LGYpKX19ZnVuY3Rpb24gayh0LC4uLnIpe2lmKHRoaXMuX196b29taW5nKXt2YXIgaSxvLGE9dyh0aGlzLHIpLmV2ZW50KHQpLHU9dC5jaGFuZ2VkVG91Y2hlcyxjPXUubGVuZ3RoO2ZvcihBdyh0KSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLGQpLGk9MDtpPGM7KytpKW89dVtpXSxhLnRvdWNoMCYmYS50b3VjaDBbMl09PT1vLmlkZW50aWZpZXI/ZGVsZXRlIGEudG91Y2gwOmEudG91Y2gxJiZhLnRvdWNoMVsyXT09PW8uaWRlbnRpZmllciYmZGVsZXRlIGEudG91Y2gxO2lmKGEudG91Y2gxJiYhYS50b3VjaDAmJihhLnRvdWNoMD1hLnRvdWNoMSxkZWxldGUgYS50b3VjaDEpLGEudG91Y2gwKWEudG91Y2gwWzFdPXRoaXMuX196b29tLmludmVydChhLnRvdWNoMFswXSk7ZWxzZSBpZihhLmVuZCgpLDI9PT1hLnRhcHMmJihvPWVlKG8sdGhpcyksTWF0aC5oeXBvdChuWzBdLW9bMF0sblsxXS1vWzFdKTx5KSl7dmFyIGY9S24odGhpcykub24oImRibGNsaWNrLnpvb20iKTtmJiZmLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXJldHVybiB2LnRyYW5zZm9ybT1mdW5jdGlvbih0LG4sZSxyKXt2YXIgaT10LnNlbGVjdGlvbj90LnNlbGVjdGlvbigpOnQ7aS5wcm9wZXJ0eSgiX196b29tIixrdyksdCE9PWk/eCh0LG4sZSxyKTppLmludGVycnVwdCgpLmVhY2goKGZ1bmN0aW9uKCl7dyh0aGlzLGFyZ3VtZW50cykuZXZlbnQocikuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KSl9LHYuc2NhbGVCeT1mdW5jdGlvbih0LG4sZSxyKXt2LnNjYWxlVG8odCwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bil9KSxlLHIpfSx2LnNjYWxlVG89ZnVuY3Rpb24odCxuLGUscil7di50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPXRoaXMuX196b29tLGE9bnVsbD09ZT9tKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsdT1yLmludmVydChhKSxjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKHIsYyksYSx1KSx0LGYpfSksZSxyKX0sdi50cmFuc2xhdGVCeT1mdW5jdGlvbih0LG4sZSxyKXt2LnRyYW5zZm9ybSh0LChmdW5jdGlvbigpe3JldHVybiBvKHRoaXMuX196b29tLnRyYW5zbGF0ZSgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGYpfSksbnVsbCxyKX0sdi50cmFuc2xhdGVUbz1mdW5jdGlvbih0LG4sZSxyLGEpe3YudHJhbnNmb3JtKHQsKGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYT10aGlzLl9fem9vbSx1PW51bGw9PXI/bSh0KToiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyO3JldHVybiBvKE13LnRyYW5zbGF0ZSh1WzBdLHVbMV0pLnNjYWxlKGEuaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiwiZnVuY3Rpb24iPT10eXBlb2YgZT8tZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LWUpLHQsZil9KSxyLGEpfSxNLnByb3RvdHlwZT17ZXZlbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJih0aGlzLnNvdXJjZUV2ZW50PXQpLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnRoYXQuX196b29taW5nPXRoaXMsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7dmFyIG49S24odGhpcy50aGF0KS5kYXR1bSgpO2guY2FsbCh0LHRoaXMudGhhdCxuZXcgeHcodCx7c291cmNlRXZlbnQ6dGhpcy5zb3VyY2VFdmVudCx0YXJnZXQ6dix0eXBlOnQsdHJhbnNmb3JtOnRoaXMudGhhdC5fX3pvb20sZGlzcGF0Y2g6aH0pLG4pfX0sdi53aGVlbERlbHRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXcoK3QpLHYpOmF9LHYuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXcoISF0KSx2KTpyfSx2LnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om13KCEhdCksdik6dX0sdi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDptdyhbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSksdik6aX0sdi5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oY1swXT0rdFswXSxjWzFdPSt0WzFdLHYpOltjWzBdLGNbMV1dfSx2LnRyYW5zbGF0ZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZlswXVswXT0rdFswXVswXSxmWzFdWzBdPSt0WzFdWzBdLGZbMF1bMV09K3RbMF1bMV0sZlsxXVsxXT0rdFsxXVsxXSx2KTpbW2ZbMF1bMF0sZlswXVsxXV0sW2ZbMV1bMF0sZlsxXVsxXV1dfSx2LmNvbnN0cmFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LHYpOm99LHYuZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3Qsdik6c30sdi5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHYpOmx9LHYub249ZnVuY3Rpb24oKXt2YXIgdD1oLm9uLmFwcGx5KGgsYXJndW1lbnRzKTtyZXR1cm4gdD09PWg/djp0fSx2LmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9KHQ9K3QpKnQsdik6TWF0aC5zcXJ0KGcpfSx2LnRhcERpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHYpOnl9LHZ9LHQuem9vbUlkZW50aXR5PU13LHQuem9vbVRyYW5zZm9ybT1Ud30pKTs="
},
"functions": {
"toggle": {
"command": {
"name": "Show Global Graph",
"key": "ctrl-shift-g",
"mac": "Cmd-shift-g"
},
"code": "(() => { var mod=(()=>{var ie=Object.defineProperty;var an=Object.getOwnPropertyDescriptor;var pn=Object.getOwnPropertyNames;var fn=Object.prototype.hasOwnProperty;var R=(e,n)=>{for(var r in n)ie(e,r,{get:n[r],enumerable:!0})},mn=(e,n,r,t)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let i of pn(n))!fn.call(e,i)&&i!==r&&ie(e,i,{get:()=>n[i],enumerable:!(t=an(n,i))||t.enumerable});return e};var dn=e=>mn(ie({},\"__esModule\",{value:!0}),e);var Si={};R(Si,{default:()=>wi});var N={};R(N,{del:()=>yn,get:()=>hn,set:()=>gn});typeof self>\"u\"&&(self={syscall:()=>{throw new Error(\"Not implemented here\")}});var c=self.syscall;function gn(e,n){return c(\"clientStore.set\",e,n)}function hn(e){return c(\"clientStore.get\",e)}function yn(e){return c(\"clientStore.delete\",e)}var O={};R(O,{confirm:()=>jn,dispatch:()=>$n,downloadFile:()=>kn,filterBox:()=>Mn,flashNotification:()=>En,getCurrentPage:()=>xn,getCursor:()=>wn,getSelection:()=>Sn,getText:()=>An,getUiOption:()=>Un,hidePanel:()=>Ln,insertAtCursor:()=>Nn,insertAtPos:()=>Fn,moveCursor:()=>Rn,navigate:()=>Cn,openUrl:()=>On,prompt:()=>Dn,reloadPage:()=>vn,replaceRange:()=>In,save:()=>Tn,setPage:()=>bn,setSelection:()=>Pn,setUiOption:()=>Yn,showPanel:()=>_n,vimEx:()=>Bn});function xn(){return c(\"editor.getCurrentPage\")}function bn(e){return c(\"editor.setPage\",e)}function An(){return c(\"editor.getText\")}function wn(){return c(\"editor.getCursor\")}function Sn(){return c(\"editor.getSelection\")}function Pn(e,n){return c(\"editor.setSelection\",e,n)}function Tn(){return c(\"editor.save\")}function Cn(e,n,r=!1,t=!1){return c(\"editor.navigate\",e,n,r,t)}function vn(){return c(\"editor.reloadPage\")}function On(e){return c(\"editor.openUrl\",e)}function kn(e,n){return c(\"editor.downloadFile\",e,n)}function En(e,n=\"info\"){return c(\"editor.flashNotification\",e,n)}function Mn(e,n,r=\"\",t=\"\"){return c(\"editor.filterBox\",e,n,r,t)}function _n(e,n,r,t=\"\"){return c(\"editor.showPanel\",e,n,r,t)}function Ln(e){return c(\"editor.hidePanel\",e)}function Fn(e,n){return c(\"editor.insertAtPos\",e,n)}function In(e,n,r){return c(\"editor.replaceRange\",e,n,r)}function Rn(e,n=!1){return c(\"editor.moveCursor\",e,n)}function Nn(e){return c(\"editor.insertAtCursor\",e)}function $n(e){return c(\"editor.dispatch\",e)}function Dn(e,n=\"\"){return c(\"editor.prompt\",e,n)}function jn(e){return c(\"editor.confirm\",e)}function Un(e){return c(\"editor.getUiOption\",e)}function Yn(e,n){return c(\"editor.setUiOption\",e,n)}function Bn(e){return c(\"editor.vimEx\",e)}var v={};R(v,{batchSet:()=>Gn,clearPageIndex:()=>zn,clearPageIndexForPage:()=>Qn,del:()=>Kn,deletePrefixForPage:()=>Xn,get:()=>Vn,query:()=>Wn,queryPrefix:()=>qn,set:()=>Hn});function Hn(e,n,r){return c(\"index.set\",e,n,r)}function Gn(e,n){return c(\"index.batchSet\",e,n)}function Vn(e,n){return c(\"index.get\",e,n)}function Kn(e,n){return c(\"index.delete\",e,n)}function qn(e){return c(\"index.queryPrefix\",e)}function Wn(e){return c(\"index.query\",e)}function Qn(e){return c(\"index.clearPageIndexForPage\",e)}function Xn(e,n){return c(\"index.deletePrefixForPage\",e,n)}function zn(){return c(\"index.clearPageIndex\")}var K={};R(K,{parseMarkdown:()=>Zn});function Zn(e){return c(\"markdown.parseMarkdown\",e)}var te=class{listPages(n=!1){return c(\"space.listPages\",n)}getPageMeta(n){return c(\"space.getPageMeta\",n)}readPage(n){return c(\"space.readPage\",n)}writePage(n,r){return c(\"space.writePage\",n,r)}deletePage(n){return c(\"space.deletePage\",n)}listPlugs(){return c(\"space.listPlugs\")}listAttachments(){return c(\"space.listAttachments\")}getAttachmentMeta(n){return c(\"space.getAttachmentMeta\",n)}readAttachment(n){return c(\"space.readAttachment\",n)}writeAttachment(n,r,t){return c(\"space.writeAttachment\",n,r,t)}deleteAttachment(n){return c(\"space.deleteAttachment\",n)}readFile(n,r){return c(\"space.readFile\",n,r)}getFileMeta(n){return c(\"space.getFileMeta\",n)}writeFile(n,r,t){return c(\"space.writeFile\",n,r,t)}deleteFile(n){return c(\"space.deleteFile\",n)}listFiles(n){return c(\"space.listFiles\",n)}},k=new te;var F={};R(F,{readAsset:()=>tr});function ir(e){let n=atob(e),r=n.length,t=new Uint8Array(r);for(let i=0;i<r;i++)t[i]=n.charCodeAt(i);return t}function Ie(e){let n=e.split(\",\",2)[1];return ir(n)}var L=self.syscall;async function tr(e,n=\"utf8\"){let r=await L(\"asset.readAsset\",e);switch(n){case\"utf8\":return new TextDecoder().decode(Ie(r));case\"dataurl\":return r}}var q=class{constructor(n){this.graphViewKey=n}async getGraphViewStatus(){return!!await N.get(this.graphViewKey)}async setGraphViewStatus(n){await N.set(this.graphViewKey,n)}async toggleGraphViewStatus(){await N.set(this.graphViewKey,!await this.getGraphViewStatus())}};function oe(e,n){if(n(e))return[e];let r=[];if(e.children)for(let t of e.children)r=[...r,...oe(t,n)];return r}function le(e,n){return oe(e,r=>r.type===n)[0]}function Re(e,n){oe(e,n)}var E=class extends Error{constructor(r=\"(unknown reason)\",t=\"\"){super(`${r} ${t}`);this.mark=t;this.name=this.constructor.name}toString(r){return`${this.name}: ${this.message} ${this.mark}`}};function Ne(e){return typeof e==\"boolean\"||e instanceof Boolean}function $e(e){return e!==null&&typeof e==\"object\"}function T(e,n){let r=\"\";for(let t=0;t<n;t++)r+=e;return r}function U(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}var W=class{constructor(n,r,t,i,o){this.name=n;this.buffer=r;this.position=t;this.line=i;this.column=o}getSnippet(n=4,r=75){if(!this.buffer)return null;let t=\"\",i=this.position;for(;i>0&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(i-1))===-1;)if(i-=1,this.position-i>r/2-1){t=\" ... \",i+=5;break}let o=\"\",l=this.position;for(;l<this.buffer.length&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(l))===-1;)if(l+=1,l-this.position>r/2-1){o=\" ... \",l-=5;break}let s=this.buffer.slice(i,l);return`${T(\" \",n)}${t}${s}${o}\n${T(\" \",n+this.position-i+t.length)}^`}toString(n){let r,t=\"\";return this.name&&(t+=`in \"${this.name}\" `),t+=`at line ${this.line+1}, column ${this.column+1}`,n||(r=this.getSnippet(),r&&(t+=`:\n${r}`)),t}};function se(e,n,r){let t=[];for(let i of e.include)r=se(i,n,r);for(let i of e[n]){for(let o=0;o<r.length;o++){let l=r[o];l.tag===i.tag&&l.kind===i.kind&&t.push(o)}r.push(i)}return r.filter((i,o)=>!t.includes(o))}function ar(...e){let n={fallback:{},mapping:{},scalar:{},sequence:{}};for(let r of e)for(let t of r)t.kind!==null&&(n[t.kind][t.tag]=n.fallback[t.tag]=t);return n}var A=class{constructor(n){this.explicit=n.explicit||[],this.implicit=n.implicit||[],this.include=n.include||[];for(let r of this.implicit)if(r.loadKind&&r.loadKind!==\"scalar\")throw new E(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\");this.compiledImplicit=se(this,\"implicit\",[]),this.compiledExplicit=se(this,\"explicit\",[]),this.compiledTypeMap=ar(this.compiledImplicit,this.compiledExplicit)}extend(n){return new A({implicit:[...new Set([...this.implicit,...n?.implicit??[]])],explicit:[...new Set([...this.explicit,...n?.explicit??[]])],include:[...new Set([...this.include,...n?.include??[]])]})}static create(){}};var pr=()=>!0,fr=e=>e;var d=class{constructor(n,r){this.kind=null;this.resolve=()=>!0;this.construct=n=>n;this.tag=n,r&&(this.kind=r.kind,this.resolve=r.resolve||pr,this.construct=r.construct||fr,this.instanceOf=r.instanceOf,this.predicate=r.predicate,this.represent=r.represent,this.defaultStyle=r.defaultStyle,this.styleAliases=r.styleAliases)}};var ue=class extends Error{constructor(n){super(n),this.name=\"DenoStdInternalError\"}};function je(e,n=\"\"){if(!e)throw new ue(n)}function Y(e,n,r=0){r=Math.max(0,Math.min(r,n.byteLength));let t=n.byteLength-r;return e.byteLength>t&&(e=e.subarray(0,t)),n.set(e,r),e.byteLength}var Q=32*1024,ce=2**32-2,B=class{#e;#n=0;constructor(n){this.#e=n===void 0?new Uint8Array(0):new Uint8Array(n)}bytes(n={copy:!0}){return n.copy===!1?this.#e.subarray(this.#n):this.#e.slice(this.#n)}empty(){return this.#e.byteLength<=this.#n}get length(){return this.#e.byteLength-this.#n}get capacity(){return this.#e.buffer.byteLength}truncate(n){if(n===0){this.reset();return}if(n<0||n>this.length)throw Error(\"bytes.Buffer: truncation out of range\");this.#r(this.#n+n)}reset(){this.#r(0),this.#n=0}#t(n){let r=this.#e.byteLength;return n<=this.capacity-r?(this.#r(r+n),r):-1}#r(n){je(n<=this.#e.buffer.byteLength),this.#e=new Uint8Array(this.#e.buffer,0,n)}readSync(n){if(this.empty())return this.reset(),n.byteLength===0?0:null;let r=Y(this.#e.subarray(this.#n),n);return this.#n+=r,r}read(n){let r=this.readSync(n);return Promise.resolve(r)}writeSync(n){let r=this.#i(n.byteLength);return Y(n,this.#e,r)}write(n){let r=this.writeSync(n);return Promise.resolve(r)}#i(n){let r=this.length;r===0&&this.#n!==0&&this.reset();let t=this.#t(n);if(t>=0)return t;let i=this.capacity;if(n<=Math.floor(i/2)-r)Y(this.#e.subarray(this.#n),this.#e);else{if(i+n>ce)throw new Error(\"The buffer cannot be grown beyond the maximum size.\");{let o=new Uint8Array(Math.min(2*i+n,ce));Y(this.#e.subarray(this.#n),o),this.#e=o}}return this.#n=0,this.#r(Math.min(r+n,ce)),r}grow(n){if(n<0)throw Error(\"Buffer.grow: negative count\");let r=this.#i(n);this.#r(r)}async readFrom(n){let r=0,t=new Uint8Array(Q);for(;;){let i=this.capacity-this.length<Q,o=i?t:new Uint8Array(this.#e.buffer,this.length),l=await n.read(o);if(l===null)return r;i?this.writeSync(o.subarray(0,l)):this.#r(this.length+l),r+=l}}readFromSync(n){let r=0,t=new Uint8Array(Q);for(;;){let i=this.capacity-this.length<Q,o=i?t:new Uint8Array(this.#e.buffer,this.length),l=n.readSync(o);if(l===null)return r;i?this.writeSync(o.subarray(0,l)):this.#r(this.length+l),r+=l}}};var ae=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function mr(e){if(e===null)return!1;let n,r=0,t=e.length,i=ae;for(let o=0;o<t;o++)if(n=i.indexOf(e.charAt(o)),!(n>64)){if(n<0)return!1;r+=6}return r%8===0}function dr(e){let n=e.replace(/[\\r\\n=]/g,\"\"),r=n.length,t=ae,i=[],o=0;for(let s=0;s<r;s++)s%4===0&&s&&(i.push(o>>16&255),i.push(o>>8&255),i.push(o&255)),o=o<<6|t.indexOf(n.charAt(s));let l=r%4*6;return l===0?(i.push(o>>16&255),i.push(o>>8&255),i.push(o&255)):l===18?(i.push(o>>10&255),i.push(o>>2&255)):l===12&&i.push(o>>4&255),new B(new Uint8Array(i))}function gr(e){let n=e.length,r=ae,t=\"\",i=0;for(let l=0;l<n;l++)l%3===0&&l&&(t+=r[i>>18&63],t+=r[i>>12&63],t+=r[i>>6&63],t+=r[i&63]),i=(i<<8)+e[l];let o=n%3;return o===0?(t+=r[i>>18&63],t+=r[i>>12&63],t+=r[i>>6&63],t+=r[i&63]):o===2?(t+=r[i>>10&63],t+=r[i>>4&63],t+=r[i<<2&63],t+=r[64]):o===1&&(t+=r[i>>2&63],t+=r[i<<4&63],t+=r[64],t+=r[64]),t}function hr(e){if(typeof e?.readSync!=\"function\")return!1;let n=new B;try{return 0>n.readFromSync(e)}catch{return!1}finally{n.reset()}}var pe=new d(\"tag:yaml.org,2002:binary\",{construct:dr,kind:\"scalar\",predicate:hr,represent:gr,resolve:mr});function yr(e){let n=e.length;return n===4&&(e===\"true\"||e===\"True\"||e===\"TRUE\")||n===5&&(e===\"false\"||e===\"False\"||e===\"FALSE\")}function xr(e){return e===\"true\"||e===\"True\"||e===\"TRUE\"}var fe=new d(\"tag:yaml.org,2002:bool\",{construct:xr,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:Ne,represent:{lowercase(e){return e?\"true\":\"false\"},uppercase(e){return e?\"TRUE\":\"FALSE\"},camelcase(e){return e?\"True\":\"False\"}},resolve:yr});var br=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function Ar(e){return!(!br.test(e)||e[e.length-1]===\"_\")}function wr(e){let n=e.replace(/_/g,\"\").toLowerCase(),r=n[0]===\"-\"?-1:1,t=[];if(\"+-\".indexOf(n[0])>=0&&(n=n.slice(1)),n===\".inf\")return r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY;if(n===\".nan\")return NaN;if(n.indexOf(\":\")>=0){n.split(\":\").forEach(l=>{t.unshift(parseFloat(l))});let i=0,o=1;return t.forEach(l=>{i+=l*o,o*=60}),r*i}return r*parseFloat(n)}var Sr=/^[-+]?[0-9]+e/;function Pr(e,n){if(isNaN(e))switch(n){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(n){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(U(e))return\"-0.0\";let r=e.toString(10);return Sr.test(r)?r.replace(\"e\",\".e\"):r}function Tr(e){return Object.prototype.toString.call(e)===\"[object Number]\"&&(e%1!==0||U(e))}var me=new d(\"tag:yaml.org,2002:float\",{construct:wr,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:Tr,represent:Pr,resolve:Ar});function Ue(e){let n=new Function(`return ${e}`)();if(!(n instanceof Function))throw new TypeError(`Expected function but got ${typeof n}: ${e}`);return n}var Cr=new d(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve(e){if(e===null)return!1;try{return Ue(`${e}`),!0}catch{return!1}},construct(e){return Ue(e)},predicate(e){return e instanceof Function},represent(e){return e.toString()}});function vr(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function Or(e){return 48<=e&&e<=55}function kr(e){return 48<=e&&e<=57}function Er(e){let n=e.length,r=0,t=!1;if(!n)return!1;let i=e[r];if((i===\"-\"||i===\"+\")&&(i=e[++r]),i===\"0\"){if(r+1===n)return!0;if(i=e[++r],i===\"b\"){for(r++;r<n;r++)if(i=e[r],i!==\"_\"){if(i!==\"0\"&&i!==\"1\")return!1;t=!0}return t&&i!==\"_\"}if(i===\"x\"){for(r++;r<n;r++)if(i=e[r],i!==\"_\"){if(!vr(e.charCodeAt(r)))return!1;t=!0}return t&&i!==\"_\"}for(;r<n;r++)if(i=e[r],i!==\"_\"){if(!Or(e.charCodeAt(r)))return!1;t=!0}return t&&i!==\"_\"}if(i===\"_\")return!1;for(;r<n;r++)if(i=e[r],i!==\"_\"){if(i===\":\")break;if(!kr(e.charCodeAt(r)))return!1;t=!0}return!t||i===\"_\"?!1:i!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(r))}function Mr(e){let n=e,r=[];n.indexOf(\"_\")!==-1&&(n=n.replace(/_/g,\"\"));let t=1,i=n[0];if((i===\"-\"||i===\"+\")&&(i===\"-\"&&(t=-1),n=n.slice(1),i=n[0]),n===\"0\")return 0;if(i===\"0\")return n[1]===\"b\"?t*parseInt(n.slice(2),2):n[1]===\"x\"?t*parseInt(n,16):t*parseInt(n,8);if(n.indexOf(\":\")!==-1){n.split(\":\").forEach(s=>{r.unshift(parseInt(s,10))});let o=0,l=1;return r.forEach(s=>{o+=s*l,l*=60}),t*o}return t*parseInt(n,10)}function _r(e){return Object.prototype.toString.call(e)===\"[object Number]\"&&e%1===0&&!U(e)}var de=new d(\"tag:yaml.org,2002:int\",{construct:Mr,defaultStyle:\"decimal\",kind:\"scalar\",predicate:_r,represent:{binary(e){return e>=0?`0b${e.toString(2)}`:`-0b${e.toString(2).slice(1)}`},octal(e){return e>=0?`0${e.toString(8)}`:`-0${e.toString(8).slice(1)}`},decimal(e){return e.toString(10)},hexadecimal(e){return e>=0?`0x${e.toString(16).toUpperCase()}`:`-0x${e.toString(16).toUpperCase().slice(1)}`}},resolve:Er,styleAliases:{binary:[2,\"bin\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"],octal:[8,\"oct\"]}});var ge=new d(\"tag:yaml.org,2002:map\",{construct(e){return e!==null?e:{}},kind:\"mapping\"});function Lr(e){return e===\"<<\"||e===null}var he=new d(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:Lr});function Fr(e){let n=e.length;return n===1&&e===\"~\"||n===4&&(e===\"null\"||e===\"Null\"||e===\"NULL\")}function Ir(){return null}function Rr(e){return e===null}var ye=new d(\"tag:yaml.org,2002:null\",{construct:Ir,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:Rr,represent:{canonical(){return\"~\"},lowercase(){return\"null\"},uppercase(){return\"NULL\"},camelcase(){return\"Null\"}},resolve:Fr});var{hasOwn:Nr}=Object,$r=Object.prototype.toString;function Dr(e){let n=[],r=\"\",t=!1;for(let i of e){if(t=!1,$r.call(i)!==\"[object Object]\")return!1;for(r in i)if(Nr(i,r))if(!t)t=!0;else return!1;if(!t)return!1;if(n.indexOf(r)===-1)n.push(r);else return!1}return!0}function jr(e){return e!==null?e:[]}var xe=new d(\"tag:yaml.org,2002:omap\",{construct:jr,kind:\"sequence\",resolve:Dr});var Ur=Object.prototype.toString;function Yr(e){let n=Array.from({length:e.length});for(let r=0;r<e.length;r++){let t=e[r];if(Ur.call(t)!==\"[object Object]\")return!1;let i=Object.keys(t);if(i.length!==1)return!1;n[r]=[i[0],t[i[0]]]}return!0}function Br(e){if(e===null)return[];let n=Array.from({length:e.length});for(let r=0;r<e.length;r+=1){let t=e[r],i=Object.keys(t);n[r]=[i[0],t[i[0]]]}return n}var be=new d(\"tag:yaml.org,2002:pairs\",{construct:Br,kind:\"sequence\",resolve:Yr});var Ae=/^\\/(?<regexp>[\\s\\S]+)\\/(?<modifiers>[gismuy]*)$/,we=new d(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve(e){if(e===null||!e.length)return!1;let n=`${e}`;if(n.charAt(0)===\"/\"){if(!Ae.test(e))return!1;let r=[...n.match(Ae)?.groups?.modifiers??\"\"];if(new Set(r).size<r.length)return!1}return!0},construct(e){let{regexp:n=`${e}`,modifiers:r=\"\"}=`${e}`.match(Ae)?.groups??{};return new RegExp(n,r)},predicate(e){return e instanceof RegExp},represent(e){return e.toString()}});var Se=new d(\"tag:yaml.org,2002:seq\",{construct(e){return e!==null?e:[]},kind:\"sequence\"});var{hasOwn:Hr}=Object;function Gr(e){if(e===null)return!0;for(let n in e)if(Hr(e,n)&&e[n]!==null)return!1;return!0}function Vr(e){return e!==null?e:{}}var Pe=new d(\"tag:yaml.org,2002:set\",{construct:Vr,kind:\"mapping\",resolve:Gr});var Te=new d(\"tag:yaml.org,2002:str\",{construct(e){return e!==null?e:\"\"},kind:\"scalar\"});var Ye=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),Be=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function Kr(e){return e===null?!1:Ye.exec(e)!==null||Be.exec(e)!==null}function qr(e){let n=Ye.exec(e);if(n===null&&(n=Be.exec(e)),n===null)throw new Error(\"Date resolve error\");let r=+n[1],t=+n[2]-1,i=+n[3];if(!n[4])return new Date(Date.UTC(r,t,i));let o=+n[4],l=+n[5],s=+n[6],u=0;if(n[7]){let f=n[7].slice(0,3);for(;f.length<3;)f+=\"0\";u=+f}let p=null;if(n[9]){let f=+n[10],g=+(n[11]||0);p=(f*60+g)*6e4,n[9]===\"-\"&&(p=-p)}let m=new Date(Date.UTC(r,t,i,o,l,s,u));return p&&m.setTime(m.getTime()-p),m}function Wr(e){return e.toISOString()}var Ce=new d(\"tag:yaml.org,2002:timestamp\",{construct:qr,instanceOf:Date,kind:\"scalar\",represent:Wr,resolve:Kr});var ve=new d(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve(){return!0},construct(){},predicate(e){return typeof e>\"u\"},represent(){return\"\"}});var Oe=new A({explicit:[Te,Se,ge]});var ke=new A({implicit:[ye,fe,de,me],include:[Oe]});var Ee=new A({include:[ke]});var H=new A({explicit:[pe,xe,be,Pe],implicit:[Ce,he],include:[Ee]});var Qr=new A({explicit:[we,ve],include:[H]});var G=class{constructor(n=H){this.schema=n}};var X=class extends G{constructor(r,{filename:t,schema:i,onWarning:o,legacy:l=!1,json:s=!1,listener:u=null}){super(i);this.input=r;this.documents=[];this.lineIndent=0;this.lineStart=0;this.position=0;this.line=0;this.result=\"\";this.filename=t,this.onWarning=o,this.legacy=l,this.json=s,this.listener=u,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length}};var{hasOwn:_}=Object,z=1,Qe=2,Xe=3,Z=4,Me=1,Xr=2,He=3,zr=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,Zr=/[\\x85\\u2028\\u2029]/,Jr=/[,\\[\\]\\{\\}]/,ze=/^(?:!|!!|![a-z\\-]+!)$/i,Ze=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function Ge(e){return Object.prototype.toString.call(e)}function C(e){return e===10||e===13}function I(e){return e===9||e===32}function w(e){return e===9||e===32||e===10||e===13}function $(e){return e===44||e===91||e===93||e===123||e===125}function ei(e){if(48<=e&&e<=57)return e-48;let n=e|32;return 97<=n&&n<=102?n-97+10:-1}function ni(e){return e===120?2:e===117?4:e===85?8:0}function ri(e){return 48<=e&&e<=57?e-48:-1}function Ve(e){return e===48?\"\\0\":e===97?\"\\x07\":e===98?\"\\b\":e===116||e===9?\"\t\":e===110?`\n`:e===118?\"\\v\":e===102?\"\\f\":e===114?\"\\r\":e===101?\"\\x1B\":e===32?\" \":e===34?'\"':e===47?\"/\":e===92?\"\\\\\":e===78?\"\\x85\":e===95?\"\\xA0\":e===76?\"\\u2028\":e===80?\"\\u2029\":\"\"}function ii(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}var Je=Array.from({length:256}),en=Array.from({length:256});for(let e=0;e<256;e++)Je[e]=Ve(e)?1:0,en[e]=Ve(e);function nn(e,n){return new E(n,new W(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function a(e,n){throw nn(e,n)}function J(e,n){e.onWarning&&e.onWarning.call(null,nn(e,n))}var Ke={YAML(e,n,...r){if(e.version!==null)return a(e,\"duplication of %YAML directive\");if(r.length!==1)return a(e,\"YAML directive accepts exactly one argument\");let t=/^([0-9]+)\\.([0-9]+)$/.exec(r[0]);if(t===null)return a(e,\"ill-formed argument of the YAML directive\");let i=parseInt(t[1],10),o=parseInt(t[2],10);if(i!==1)return a(e,\"unacceptable YAML version of the document\");if(e.version=r[0],e.checkLineBreaks=o<2,o!==1&&o!==2)return J(e,\"unsupported YAML version of the document\")},TAG(e,n,...r){if(r.length!==2)return a(e,\"TAG directive accepts exactly two arguments\");let t=r[0],i=r[1];if(!ze.test(t))return a(e,\"ill-formed tag handle (first argument) of the TAG directive\");if(e.tagMap&&_(e.tagMap,t))return a(e,`there is a previously declared suffix for \"${t}\" tag handle`);if(!Ze.test(i))return a(e,\"ill-formed tag prefix (second argument) of the TAG directive\");typeof e.tagMap>\"u\"&&(e.tagMap=Object.create(null)),e.tagMap[t]=i}};function M(e,n,r,t){let i;if(n<r){if(i=e.input.slice(n,r),t)for(let o=0,l=i.length;o<l;o++){let s=i.charCodeAt(o);if(!(s===9||32<=s&&s<=1114111))return a(e,\"expected valid JSON character\")}else if(zr.test(i))return a(e,\"the stream contains non-printable characters\");e.result+=i}}function qe(e,n,r,t){if(!$e(r))return a(e,\"cannot merge mappings; the provided source object is unacceptable\");let i=Object.keys(r);for(let o=0,l=i.length;o<l;o++){let s=i[o];_(n,s)||(Object.defineProperty(n,s,{value:r[s],writable:!0,enumerable:!0,configurable:!0}),t[s]=!0)}}function D(e,n,r,t,i,o,l,s){if(Array.isArray(i)){i=Array.prototype.slice.call(i);for(let u=0,p=i.length;u<p;u++){if(Array.isArray(i[u]))return a(e,\"nested arrays are not supported inside keys\");typeof i==\"object\"&&Ge(i[u])===\"[object Object]\"&&(i[u]=\"[object Object]\")}}if(typeof i==\"object\"&&Ge(i)===\"[object Object]\"&&(i=\"[object Object]\"),i=String(i),n===null&&(n={}),t===\"tag:yaml.org,2002:merge\")if(Array.isArray(o))for(let u=0,p=o.length;u<p;u++)qe(e,n,o[u],r);else qe(e,n,o,r);else{if(!e.json&&!_(r,i)&&_(n,i))return e.line=l||e.line,e.position=s||e.position,a(e,\"duplicated mapping key\");Object.defineProperty(n,i,{value:o,writable:!0,enumerable:!0,configurable:!0}),delete r[i]}return n}function _e(e){let n=e.input.charCodeAt(e.position);if(n===10)e.position++;else if(n===13)e.position++,e.input.charCodeAt(e.position)===10&&e.position++;else return a(e,\"a line break is expected\");e.line+=1,e.lineStart=e.position}function h(e,n,r){let t=0,i=e.input.charCodeAt(e.position);for(;i!==0;){for(;I(i);)i=e.input.charCodeAt(++e.position);if(n&&i===35)do i=e.input.charCodeAt(++e.position);while(i!==10&&i!==13&&i!==0);if(C(i))for(_e(e),i=e.input.charCodeAt(e.position),t++,e.lineIndent=0;i===32;)e.lineIndent++,i=e.input.charCodeAt(++e.position);else break}return r!==-1&&t!==0&&e.lineIndent<r&&J(e,\"deficient indentation\"),t}function ee(e){let n=e.position,r=e.input.charCodeAt(n);return!!((r===45||r===46)&&r===e.input.charCodeAt(n+1)&&r===e.input.charCodeAt(n+2)&&(n+=3,r=e.input.charCodeAt(n),r===0||w(r)))}function Le(e,n){n===1?e.result+=\" \":n>1&&(e.result+=T(`\n`,n-1))}function ti(e,n,r){let t=e.kind,i=e.result,o=e.input.charCodeAt(e.position);if(w(o)||$(o)||o===35||o===38||o===42||o===33||o===124||o===62||o===39||o===34||o===37||o===64||o===96)return!1;let l;if((o===63||o===45)&&(l=e.input.charCodeAt(e.position+1),w(l)||r&&$(l)))return!1;e.kind=\"scalar\",e.result=\"\";let s,u=s=e.position,p=!1,m=0;for(;o!==0;){if(o===58){if(l=e.input.charCodeAt(e.position+1),w(l)||r&&$(l))break}else if(o===35){let f=e.input.charCodeAt(e.position-1);if(w(f))break}else{if(e.position===e.lineStart&&ee(e)||r&&$(o))break;if(C(o)){m=e.line;let f=e.lineStart,g=e.lineIndent;if(h(e,!1,-1),e.lineIndent>=n){p=!0,o=e.input.charCodeAt(e.position);continue}else{e.position=s,e.line=m,e.lineStart=f,e.lineIndent=g;break}}}p&&(M(e,u,s,!1),Le(e,e.line-m),u=s=e.position,p=!1),I(o)||(s=e.position+1),o=e.input.charCodeAt(++e.position)}return M(e,u,s,!1),e.result?!0:(e.kind=t,e.result=i,!1)}function oi(e,n){let r,t,i;if(r=e.input.charCodeAt(e.position),r!==39)return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,t=i=e.position;(r=e.input.charCodeAt(e.position))!==0;)if(r===39)if(M(e,t,e.position,!0),r=e.input.charCodeAt(++e.position),r===39)t=e.position,e.position++,i=e.position;else return!0;else if(C(r))M(e,t,i,!0),Le(e,h(e,!1,n)),t=i=e.position;else{if(e.position===e.lineStart&&ee(e))return a(e,\"unexpected end of the document within a single quoted scalar\");e.position++,i=e.position}return a(e,\"unexpected end of the stream within a single quoted scalar\")}function li(e,n){let r=e.input.charCodeAt(e.position);if(r!==34)return!1;e.kind=\"scalar\",e.result=\"\",e.position++;let t,i=t=e.position,o;for(;(r=e.input.charCodeAt(e.position))!==0;){if(r===34)return M(e,i,e.position,!0),e.position++,!0;if(r===92){if(M(e,i,e.position,!0),r=e.input.charCodeAt(++e.position),C(r))h(e,!1,n);else if(r<256&&Je[r])e.result+=en[r],e.position++;else if((o=ni(r))>0){let l=o,s=0;for(;l>0;l--)if(r=e.input.charCodeAt(++e.position),(o=ei(r))>=0)s=(s<<4)+o;else return a(e,\"expected hexadecimal character\");e.result+=ii(s),e.position++}else return a(e,\"unknown escape sequence\");i=t=e.position}else if(C(r))M(e,i,t,!0),Le(e,h(e,!1,n)),i=t=e.position;else{if(e.position===e.lineStart&&ee(e))return a(e,\"unexpected end of the document within a double quoted scalar\");e.position++,t=e.position}}return a(e,\"unexpected end of the stream within a double quoted scalar\")}function si(e,n){let r=e.input.charCodeAt(e.position),t,i=!0,o={};if(r===91)t=93,i=!1,o=[];else if(r===123)t=125;else return!1;e.anchor!==null&&typeof e.anchor<\"u\"&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=o),r=e.input.charCodeAt(++e.position);let l=e.tag,s=e.anchor,u=!0,p,m,f=m=p=null,g,S=g=!1,y=0,P=0,x=Object.create(null);for(;r!==0;){if(h(e,!0,n),r=e.input.charCodeAt(e.position),r===t)return e.position++,e.tag=l,e.anchor=s,e.kind=i?\"mapping\":\"sequence\",e.result=o,!0;if(!u)return a(e,\"missed comma between flow collection entries\");f=m=p=null,S=g=!1,r===63&&(y=e.input.charCodeAt(e.position+1),w(y)&&(S=g=!0,e.position++,h(e,!0,n))),P=e.line,j(e,n,z,!1,!0),f=e.tag||null,m=e.result,h(e,!0,n),r=e.input.charCodeAt(e.position),(g||e.line===P)&&r===58&&(S=!0,r=e.input.charCodeAt(++e.position),h(e,!0,n),j(e,n,z,!1,!0),p=e.result),i?D(e,o,x,f,m,p):S?o.push(D(e,null,x,f,m,p)):o.push(m),h(e,!0,n),r=e.input.charCodeAt(e.position),r===44?(u=!0,r=e.input.charCodeAt(++e.position)):u=!1}return a(e,\"unexpected end of the stream within a flow collection\")}function ui(e,n){let r=Me,t=!1,i=!1,o=n,l=0,s=!1,u=e.input.charCodeAt(e.position),p=!1;if(u===124)p=!1;else if(u===62)p=!0;else return!1;e.kind=\"scalar\",e.result=\"\";let m=0;for(;u!==0;)if(u=e.input.charCodeAt(++e.position),u===43||u===45)if(Me===r)r=u===43?He:Xr;else return a(e,\"repeat of a chomping mode identifier\");else if((m=ri(u))>=0){if(m===0)return a(e,\"bad explicit indentation width of a block scalar; it cannot be less than one\");if(!i)o=n+m-1,i=!0;else return a(e,\"repeat of an indentation width identifier\")}else break;if(I(u)){do u=e.input.charCodeAt(++e.position);while(I(u));if(u===35)do u=e.input.charCodeAt(++e.position);while(!C(u)&&u!==0)}for(;u!==0;){for(_e(e),e.lineIndent=0,u=e.input.charCodeAt(e.position);(!i||e.lineIndent<o)&&u===32;)e.lineIndent++,u=e.input.charCodeAt(++e.position);if(!i&&e.lineIndent>o&&(o=e.lineIndent),C(u)){l++;continue}if(e.lineIndent<o){r===He?e.result+=T(`\n`,t?1+l:l):r===Me&&t&&(e.result+=`\n`);break}p?I(u)?(s=!0,e.result+=T(`\n`,t?1+l:l)):s?(s=!1,e.result+=T(`\n`,l+1)):l===0?t&&(e.result+=\" \"):e.result+=T(`\n`,l):e.result+=T(`\n`,t?1+l:l),t=!0,i=!0,l=0;let f=e.position;for(;!C(u)&&u!==0;)u=e.input.charCodeAt(++e.position);M(e,f,e.position,!1)}return!0}function We(e,n){let r,t,i=!1,o,l=e.tag,s=e.anchor,u=[];for(e.anchor!==null&&typeof e.anchor<\"u\"&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=u),o=e.input.charCodeAt(e.position);o!==0&&!(o!==45||(t=e.input.charCodeAt(e.position+1),!w(t)));){if(i=!0,e.position++,h(e,!0,-1)&&e.lineIndent<=n){u.push(null),o=e.input.charCodeAt(e.position);continue}if(r=e.line,j(e,n,Xe,!1,!0),u.push(e.result),h(e,!0,-1),o=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>n)&&o!==0)return a(e,\"bad indentation of a sequence entry\");if(e.lineIndent<n)break}return i?(e.tag=l,e.anchor=s,e.kind=\"sequence\",e.result=u,!0):!1}function ci(e,n,r){let t=e.tag,i=e.anchor,o={},l=Object.create(null),s,u=!1,p,m,f=null,g=null,S=null,y=!1,P=!1,x;for(e.anchor!==null&&typeof e.anchor<\"u\"&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=o),x=e.input.charCodeAt(e.position);x!==0;){if(s=e.input.charCodeAt(e.position+1),p=e.line,m=e.position,(x===63||x===58)&&w(s)){if(x===63)y&&(D(e,o,l,f,g,null),f=g=S=null),P=!0,y=!0,u=!0;else if(y)y=!1,u=!0;else return a(e,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\");e.position+=1,x=s}else if(j(e,r,Qe,!1,!0))if(e.line===p){for(x=e.input.charCodeAt(e.position);I(x);)x=e.input.charCodeAt(++e.position);if(x===58){if(x=e.input.charCodeAt(++e.position),!w(x))return a(e,\"a whitespace character is expected after the key-value separator within a block mapping\");y&&(D(e,o,l,f,g,null),f=g=S=null),P=!0,y=!1,u=!1,f=e.tag,g=e.result}else return P?a(e,\"can not read an implicit mapping pair; a colon is missed\"):(e.tag=t,e.anchor=i,!0)}else return P?a(e,\"can not read a block mapping entry; a multiline key may not be an implicit key\"):(e.tag=t,e.anchor=i,!0);else break;if((e.line===p||e.lineIndent>n)&&(j(e,n,Z,!0,u)&&(y?g=e.result:S=e.result),y||(D(e,o,l,f,g,S,p,m),f=g=S=null),h(e,!0,-1),x=e.input.charCodeAt(e.position)),e.lineIndent>n&&x!==0)return a(e,\"bad indentation of a mapping entry\");if(e.lineIndent<n)break}return y&&D(e,o,l,f,g,null),P&&(e.tag=t,e.anchor=i,e.kind=\"mapping\",e.result=o),P}function ai(e){let n,r=!1,t=!1,i=\"\",o,l;if(l=e.input.charCodeAt(e.position),l!==33)return!1;if(e.tag!==null)return a(e,\"duplication of a tag property\");if(l=e.input.charCodeAt(++e.position),l===60?(r=!0,l=e.input.charCodeAt(++e.position)):l===33?(t=!0,i=\"!!\",l=e.input.charCodeAt(++e.position)):i=\"!\",n=e.position,r){do l=e.input.charCodeAt(++e.position);while(l!==0&&l!==62);if(e.position<e.length)o=e.input.slice(n,e.position),l=e.input.charCodeAt(++e.position);else return a(e,\"unexpected end of the stream within a verbatim tag\")}else{for(;l!==0&&!w(l);){if(l===33){if(t)return a(e,\"tag suffix cannot contain exclamation marks\");if(i=e.input.slice(n-1,e.position+1),!ze.test(i))return a(e,\"named tag handle cannot contain such characters\");t=!0,n=e.position+1}l=e.input.charCodeAt(++e.position)}if(o=e.input.slice(n,e.position),Jr.test(o))return a(e,\"tag suffix cannot contain flow indicator characters\")}if(o&&!Ze.test(o))return a(e,`tag name cannot contain such characters: ${o}`);if(r)e.tag=o;else if(typeof e.tagMap<\"u\"&&_(e.tagMap,i))e.tag=e.tagMap[i]+o;else if(i===\"!\")e.tag=`!${o}`;else if(i===\"!!\")e.tag=`tag:yaml.org,2002:${o}`;else return a(e,`undeclared tag handle \"${i}\"`);return!0}function pi(e){let n=e.input.charCodeAt(e.position);if(n!==38)return!1;if(e.anchor!==null)return a(e,\"duplication of an anchor property\");n=e.input.charCodeAt(++e.position);let r=e.position;for(;n!==0&&!w(n)&&!$(n);)n=e.input.charCodeAt(++e.position);return e.position===r?a(e,\"name of an anchor node must contain at least one character\"):(e.anchor=e.input.slice(r,e.position),!0)}function fi(e){let n=e.input.charCodeAt(e.position);if(n!==42)return!1;n=e.input.charCodeAt(++e.position);let r=e.position;for(;n!==0&&!w(n)&&!$(n);)n=e.input.charCodeAt(++e.position);if(e.position===r)return a(e,\"name of an alias node must contain at least one character\");let t=e.input.slice(r,e.position);return typeof e.anchorMap<\"u\"&&!_(e.anchorMap,t)?a(e,`unidentified alias \"${t}\"`):(typeof e.anchorMap<\"u\"&&(e.result=e.anchorMap[t]),h(e,!0,-1),!0)}function j(e,n,r,t,i){let o,l,s=1,u=!1,p=!1,m,f,g;e.listener&&e.listener!==null&&e.listener(\"open\",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null;let S=o=l=Z===r||Xe===r;if(t&&h(e,!0,-1)&&(u=!0,e.lineIndent>n?s=1:e.lineIndent===n?s=0:e.lineIndent<n&&(s=-1)),s===1)for(;ai(e)||pi(e);)h(e,!0,-1)?(u=!0,l=S,e.lineIndent>n?s=1:e.lineIndent===n?s=0:e.lineIndent<n&&(s=-1)):l=!1;if(l&&(l=u||i),s===1||Z===r)if(f=z===r||Qe===r?n:n+1,g=e.position-e.lineStart,s===1)if(l&&(We(e,g)||ci(e,g,f))||si(e,f))p=!0;else{if(o&&ui(e,f)||oi(e,f)||li(e,f))p=!0;else if(fi(e)){if(p=!0,e.tag!==null||e.anchor!==null)return a(e,\"alias node should not have Any properties\")}else ti(e,f,z===r)&&(p=!0,e.tag===null&&(e.tag=\"?\"));e.anchor!==null&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=e.result)}else s===0&&(p=l&&We(e,g));if(e.tag!==null&&e.tag!==\"!\")if(e.tag===\"?\"){for(let y=0,P=e.implicitTypes.length;y<P;y++)if(m=e.implicitTypes[y],m.resolve(e.result)){e.result=m.construct(e.result),e.tag=m.tag,e.anchor!==null&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=e.result);break}}else if(_(e.typeMap[e.kind||\"fallback\"],e.tag)){if(m=e.typeMap[e.kind||\"fallback\"][e.tag],e.result!==null&&m.kind!==e.kind)return a(e,`unacceptable node kind for !<${e.tag}> tag; it should be \"${m.kind}\", not \"${e.kind}\"`);if(m.resolve(e.result))e.result=m.construct(e.result),e.anchor!==null&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=e.result);else return a(e,`cannot resolve a node with !<${e.tag}> explicit tag`)}else return a(e,`unknown tag !<${e.tag}>`);return e.listener&&e.listener!==null&&e.listener(\"close\",e),e.tag!==null||e.anchor!==null||p}function mi(e){let n=e.position,r,t,i,o=!1,l;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);(l=e.input.charCodeAt(e.position))!==0&&(h(e,!0,-1),l=e.input.charCodeAt(e.position),!(e.lineIndent>0||l!==37));){for(o=!0,l=e.input.charCodeAt(++e.position),r=e.position;l!==0&&!w(l);)l=e.input.charCodeAt(++e.position);if(t=e.input.slice(r,e.position),i=[],t.length<1)return a(e,\"directive name must not be less than one character in length\");for(;l!==0;){for(;I(l);)l=e.input.charCodeAt(++e.position);if(l===35){do l=e.input.charCodeAt(++e.position);while(l!==0&&!C(l));break}if(C(l))break;for(r=e.position;l!==0&&!w(l);)l=e.input.charCodeAt(++e.position);i.push(e.input.slice(r,e.position))}l!==0&&_e(e),_(Ke,t)?Ke[t](e,t,...i):J(e,`unknown document directive \"${t}\"`)}if(h(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45)e.position+=3,h(e,!0,-1);else if(o)return a(e,\"directives end mark is expected\");if(j(e,e.lineIndent-1,Z,!1,!0),h(e,!0,-1),e.checkLineBreaks&&Zr.test(e.input.slice(n,e.position))&&J(e,\"non-ASCII line breaks are interpreted as content\"),e.documents.push(e.result),e.position===e.lineStart&&ee(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,h(e,!0,-1));return}if(e.position<e.length-1)return a(e,\"end of the stream or a document separator is expected\")}function di(e,n){e=String(e),n=n||{},e.length!==0&&(e.charCodeAt(e.length-1)!==10&&e.charCodeAt(e.length-1)!==13&&(e+=`\n`),e.charCodeAt(0)===65279&&(e=e.slice(1)));let r=new X(e,n);for(r.input+=\"\\0\";r.input.charCodeAt(r.position)===32;)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)mi(r);return r.documents}function rn(e,n){let r=di(e,n);if(r.length!==0){if(r.length===1)return r[0];throw new E(\"expected a single document in the stream, but found more\")}}function tn(e,n){return rn(e,n)}var{hasOwn:Zo}=Object;var{hasOwn:tl}=Object;var b={};b[0]=\"\\\\0\";b[7]=\"\\\\a\";b[8]=\"\\\\b\";b[9]=\"\\\\t\";b[10]=\"\\\\n\";b[11]=\"\\\\v\";b[12]=\"\\\\f\";b[13]=\"\\\\r\";b[27]=\"\\\\e\";b[34]='\\\\\"';b[92]=\"\\\\\\\\\";b[133]=\"\\\\N\";b[160]=\"\\\\_\";b[8232]=\"\\\\L\";b[8233]=\"\\\\P\";async function hi(e,n){let r=await k.readPage(e),t=await K.parseMarkdown(r),i;return Re(t,o=>{if(o.type!==\"FencedCode\")return!1;let l=le(o,\"CodeInfo\");if(n&&!l||n&&!n.includes(l.children[0].text))return!1;let s=le(o,\"CodeText\");return s?(i=s.children[0].text,!0):!1}),i}async function ln(e,n=[\"yaml\"]){let r=await hi(e,n);if(r!==void 0)try{return tn(r)}catch(t){throw console.error(\"YAML Page parser error\",t),new Error(`YAML Error: ${t.message}`)}}var yi=\"SETTINGS\";async function sn(e,n){try{let t=(await ln(yi,[\"yaml\"])||{})[e];return t===void 0?n:t}catch(r){if(r.message===\"Page not found\")return n;throw r}}async function V(e){let n=await sn(\"graphview\",{});return n[e]!==void 0?n[e]:!1}var ne=class{async init(){this.colorMapSettings=await V(\"colormap\"),console.log(this.colorMapSettings),this.colorMapPathSettings=this.colorMapSettings?this.colorMapSettings.path:[],this.colorMapTagSettings=this.colorMapSettings?this.colorMapSettings.tag:[],this.spacetags=await v.queryPrefix(\"tag:\"),this.taggedPages=[...new Set(this.spacetags.map(n=>n.page))],this.individuallyTaggedPages=await v.queryPrefix(\"tag:node_color=\"),this.spacepages=await k.listPages(),this.default_color=await V(\"default_color\")}build(){return this.spacepages.map(n=>{let r=this.spacetags.filter(t=>t.page===n.name);if(this.individuallyTaggedPages.find(t=>t.page===n.name))return{page:n.name,color:this.individuallyTaggedPages.find(t=>t.page===n.name).value.split(\"=\")[1]};if(this.colorMapTagSettings){let t=r.filter(i=>this.colorMapTagSettings[i.value]!==void 0);if(t.length>0)return{page:n.name,color:this.colorMapTagSettings[t[0].value]}}if(this.colorMapPathSettings){let t=Object.keys(this.colorMapPathSettings).find(i=>n.name.startsWith(i));if(t)return{page:n.name,color:this.colorMapPathSettings[t]}}return{page:n.name,color:this.default_color?this.default_color:\"000000\"}})}};var re=class{constructor(n=[]){this.pagefilter=n=>!this.isIgnoredPage(n.name);this.linkfilter=n=>{let r=n.key.split(\":\").slice(1,-1).join(\":\");return!this.isIgnoredPage(n.page)&&!this.isIgnoredPage(r)};this.ignoredPages=n}async init(){this.ignoredPages=(await v.queryPrefix(\"tag:.graphignore\")).map(n=>n.page)}isIgnoredPage(n){return this.ignoredPages.includes(n)}};var Fe=new q(\"showGraphView\"),un=new ne;async function cn(){if(await Fe.toggleGraphViewStatus(),await Fe.getGraphViewStatus()){let e=await O.getCurrentPage();await xi(e)}else await O.hidePanel(\"lhs\")}async function xi(e){let n=await Ai(e),r=JSON.stringify(n),t=await F.readAsset(\"style.css\");await Fe.getGraphViewStatus()&&await O.showPanel(\"lhs\",1,`<html>\n <head>\n <style>${t}</style>\n </head>\n <body>\n <div id=\"graph\" >\n </div>\n </body>\n </html>`,await bi(r))}async function bi(e){let n=await F.readAsset(\"asset/d3.js\",\"utf8\"),r=await F.readAsset(\"asset/d3-force.js\",\"utf8\"),t=await F.readAsset(\"asset/force-graph.js\",\"utf8\");return`\n ${n}\n ${r}\n ${t}\n \n const graph = ${e};\n console.log(graph);\n const graph_div = document.querySelector('#graph');\n \n let chart;\n function createChart() {\n // Remove the existing chart object from the DOM\n graph_div.innerHTML = '';\n \n // Create a new chart object with the updated dimensions\n chart = ForceGraph(graph, {\n nodeId: d => d.id,\n nodeTitle: d => d.id,\n nodeStrokeOpacity: 0.75,\n height: window.innerHeight,\n width: window.innerWidth,\n });\n \n // Add the new chart object to the DOM\n graph_div.appendChild(chart);\n }\n \n createChart();\n\n function handleResize() {\n // Check if the dimensions have actually changed\n if (window.innerHeight-10 !== chart.height || window.innerWidth-10 !== chart.width) {\n // Recreate/redraw the chart object\n createChart();\n }\n }\n \n let timeout = false;\n // Add an event listener to the window object that listens for the resize event\n window.addEventListener('resize', () => {\n clearTimeout(timeout);\n timeout = setTimeout(handleResize, 250);\n });\n `}async function Ai(e){let n=new re;await n.init();let t=(await k.listPages()).filter(n.pagefilter).map(({name:p})=>p),o=(await v.queryPrefix(\"pl:\")).filter(n.linkfilter).map(({key:p,page:m})=>{let f=p.split(\":\").slice(1,-1).join(\":\");return t.includes(f)||t.push(f),{source:m,target:f}});await un.init();let l=un.build(),s=await V(\"default_color\");return{nodes:t.map(p=>{let m=s||\"000000\";return l.find(f=>f.page===p)&&(m=l.find(f=>f.page===p).color),{id:p,color:m}}),links:o}}var wi=cn;return dn(Si);})();\n return mod;})()"
},
"updateGraphView": {
"env": "client",
"events": [
"plug:load",
"editor:pageLoaded"
],
"code": "(() => { var mod=(()=>{var ie=Object.defineProperty;var cn=Object.getOwnPropertyDescriptor;var an=Object.getOwnPropertyNames;var pn=Object.prototype.hasOwnProperty;var R=(e,n)=>{for(var r in n)ie(e,r,{get:n[r],enumerable:!0})},fn=(e,n,r,t)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let i of an(n))!pn.call(e,i)&&i!==r&&ie(e,i,{get:()=>n[i],enumerable:!(t=cn(n,i))||t.enumerable});return e};var mn=e=>fn(ie({},\"__esModule\",{value:!0}),e);var Si={};R(Si,{default:()=>wi});var N={};R(N,{del:()=>hn,get:()=>gn,set:()=>dn});typeof self>\"u\"&&(self={syscall:()=>{throw new Error(\"Not implemented here\")}});var c=self.syscall;function dn(e,n){return c(\"clientStore.set\",e,n)}function gn(e){return c(\"clientStore.get\",e)}function hn(e){return c(\"clientStore.delete\",e)}var _={};R(_,{confirm:()=>Dn,dispatch:()=>Nn,downloadFile:()=>On,filterBox:()=>En,flashNotification:()=>kn,getCurrentPage:()=>yn,getCursor:()=>An,getSelection:()=>wn,getText:()=>bn,getUiOption:()=>jn,hidePanel:()=>_n,insertAtCursor:()=>Rn,insertAtPos:()=>Ln,moveCursor:()=>In,navigate:()=>Tn,openUrl:()=>vn,prompt:()=>$n,reloadPage:()=>Cn,replaceRange:()=>Fn,save:()=>Pn,setPage:()=>xn,setSelection:()=>Sn,setUiOption:()=>Un,showPanel:()=>Mn,vimEx:()=>Yn});function yn(){return c(\"editor.getCurrentPage\")}function xn(e){return c(\"editor.setPage\",e)}function bn(){return c(\"editor.getText\")}function An(){return c(\"editor.getCursor\")}function wn(){return c(\"editor.getSelection\")}function Sn(e,n){return c(\"editor.setSelection\",e,n)}function Pn(){return c(\"editor.save\")}function Tn(e,n,r=!1,t=!1){return c(\"editor.navigate\",e,n,r,t)}function Cn(){return c(\"editor.reloadPage\")}function vn(e){return c(\"editor.openUrl\",e)}function On(e,n){return c(\"editor.downloadFile\",e,n)}function kn(e,n=\"info\"){return c(\"editor.flashNotification\",e,n)}function En(e,n,r=\"\",t=\"\"){return c(\"editor.filterBox\",e,n,r,t)}function Mn(e,n,r,t=\"\"){return c(\"editor.showPanel\",e,n,r,t)}function _n(e){return c(\"editor.hidePanel\",e)}function Ln(e,n){return c(\"editor.insertAtPos\",e,n)}function Fn(e,n,r){return c(\"editor.replaceRange\",e,n,r)}function In(e,n=!1){return c(\"editor.moveCursor\",e,n)}function Rn(e){return c(\"editor.insertAtCursor\",e)}function Nn(e){return c(\"editor.dispatch\",e)}function $n(e,n=\"\"){return c(\"editor.prompt\",e,n)}function Dn(e){return c(\"editor.confirm\",e)}function jn(e){return c(\"editor.getUiOption\",e)}function Un(e,n){return c(\"editor.setUiOption\",e,n)}function Yn(e){return c(\"editor.vimEx\",e)}var v={};R(v,{batchSet:()=>Hn,clearPageIndex:()=>Xn,clearPageIndexForPage:()=>Wn,del:()=>Vn,deletePrefixForPage:()=>Qn,get:()=>Gn,query:()=>qn,queryPrefix:()=>Kn,set:()=>Bn});function Bn(e,n,r){return c(\"index.set\",e,n,r)}function Hn(e,n){return c(\"index.batchSet\",e,n)}function Gn(e,n){return c(\"index.get\",e,n)}function Vn(e,n){return c(\"index.delete\",e,n)}function Kn(e){return c(\"index.queryPrefix\",e)}function qn(e){return c(\"index.query\",e)}function Wn(e){return c(\"index.clearPageIndexForPage\",e)}function Qn(e,n){return c(\"index.deletePrefixForPage\",e,n)}function Xn(){return c(\"index.clearPageIndex\")}var K={};R(K,{parseMarkdown:()=>zn});function zn(e){return c(\"markdown.parseMarkdown\",e)}var te=class{listPages(n=!1){return c(\"space.listPages\",n)}getPageMeta(n){return c(\"space.getPageMeta\",n)}readPage(n){return c(\"space.readPage\",n)}writePage(n,r){return c(\"space.writePage\",n,r)}deletePage(n){return c(\"space.deletePage\",n)}listPlugs(){return c(\"space.listPlugs\")}listAttachments(){return c(\"space.listAttachments\")}getAttachmentMeta(n){return c(\"space.getAttachmentMeta\",n)}readAttachment(n){return c(\"space.readAttachment\",n)}writeAttachment(n,r,t){return c(\"space.writeAttachment\",n,r,t)}deleteAttachment(n){return c(\"space.deleteAttachment\",n)}readFile(n,r){return c(\"space.readFile\",n,r)}getFileMeta(n){return c(\"space.getFileMeta\",n)}writeFile(n,r,t){return c(\"space.writeFile\",n,r,t)}deleteFile(n){return c(\"space.deleteFile\",n)}listFiles(n){return c(\"space.listFiles\",n)}},O=new te;var F={};R(F,{readAsset:()=>ir});function rr(e){let n=atob(e),r=n.length,t=new Uint8Array(r);for(let i=0;i<r;i++)t[i]=n.charCodeAt(i);return t}function Fe(e){let n=e.split(\",\",2)[1];return rr(n)}var L=self.syscall;async function ir(e,n=\"utf8\"){let r=await L(\"asset.readAsset\",e);switch(n){case\"utf8\":return new TextDecoder().decode(Fe(r));case\"dataurl\":return r}}var q=class{constructor(n){this.graphViewKey=n}async getGraphViewStatus(){return!!await N.get(this.graphViewKey)}async setGraphViewStatus(n){await N.set(this.graphViewKey,n)}async toggleGraphViewStatus(){await N.set(this.graphViewKey,!await this.getGraphViewStatus())}};function oe(e,n){if(n(e))return[e];let r=[];if(e.children)for(let t of e.children)r=[...r,...oe(t,n)];return r}function le(e,n){return oe(e,r=>r.type===n)[0]}function Ie(e,n){oe(e,n)}var k=class extends Error{constructor(r=\"(unknown reason)\",t=\"\"){super(`${r} ${t}`);this.mark=t;this.name=this.constructor.name}toString(r){return`${this.name}: ${this.message} ${this.mark}`}};function Re(e){return typeof e==\"boolean\"||e instanceof Boolean}function Ne(e){return e!==null&&typeof e==\"object\"}function T(e,n){let r=\"\";for(let t=0;t<n;t++)r+=e;return r}function U(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}var W=class{constructor(n,r,t,i,o){this.name=n;this.buffer=r;this.position=t;this.line=i;this.column=o}getSnippet(n=4,r=75){if(!this.buffer)return null;let t=\"\",i=this.position;for(;i>0&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(i-1))===-1;)if(i-=1,this.position-i>r/2-1){t=\" ... \",i+=5;break}let o=\"\",l=this.position;for(;l<this.buffer.length&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(l))===-1;)if(l+=1,l-this.position>r/2-1){o=\" ... \",l-=5;break}let s=this.buffer.slice(i,l);return`${T(\" \",n)}${t}${s}${o}\n${T(\" \",n+this.position-i+t.length)}^`}toString(n){let r,t=\"\";return this.name&&(t+=`in \"${this.name}\" `),t+=`at line ${this.line+1}, column ${this.column+1}`,n||(r=this.getSnippet(),r&&(t+=`:\n${r}`)),t}};function se(e,n,r){let t=[];for(let i of e.include)r=se(i,n,r);for(let i of e[n]){for(let o=0;o<r.length;o++){let l=r[o];l.tag===i.tag&&l.kind===i.kind&&t.push(o)}r.push(i)}return r.filter((i,o)=>!t.includes(o))}function cr(...e){let n={fallback:{},mapping:{},scalar:{},sequence:{}};for(let r of e)for(let t of r)t.kind!==null&&(n[t.kind][t.tag]=n.fallback[t.tag]=t);return n}var A=class{constructor(n){this.explicit=n.explicit||[],this.implicit=n.implicit||[],this.include=n.include||[];for(let r of this.implicit)if(r.loadKind&&r.loadKind!==\"scalar\")throw new k(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\");this.compiledImplicit=se(this,\"implicit\",[]),this.compiledExplicit=se(this,\"explicit\",[]),this.compiledTypeMap=cr(this.compiledImplicit,this.compiledExplicit)}extend(n){return new A({implicit:[...new Set([...this.implicit,...n?.implicit??[]])],explicit:[...new Set([...this.explicit,...n?.explicit??[]])],include:[...new Set([...this.include,...n?.include??[]])]})}static create(){}};var ar=()=>!0,pr=e=>e;var d=class{constructor(n,r){this.kind=null;this.resolve=()=>!0;this.construct=n=>n;this.tag=n,r&&(this.kind=r.kind,this.resolve=r.resolve||ar,this.construct=r.construct||pr,this.instanceOf=r.instanceOf,this.predicate=r.predicate,this.represent=r.represent,this.defaultStyle=r.defaultStyle,this.styleAliases=r.styleAliases)}};var ue=class extends Error{constructor(n){super(n),this.name=\"DenoStdInternalError\"}};function De(e,n=\"\"){if(!e)throw new ue(n)}function Y(e,n,r=0){r=Math.max(0,Math.min(r,n.byteLength));let t=n.byteLength-r;return e.byteLength>t&&(e=e.subarray(0,t)),n.set(e,r),e.byteLength}var Q=32*1024,ce=2**32-2,B=class{#e;#n=0;constructor(n){this.#e=n===void 0?new Uint8Array(0):new Uint8Array(n)}bytes(n={copy:!0}){return n.copy===!1?this.#e.subarray(this.#n):this.#e.slice(this.#n)}empty(){return this.#e.byteLength<=this.#n}get length(){return this.#e.byteLength-this.#n}get capacity(){return this.#e.buffer.byteLength}truncate(n){if(n===0){this.reset();return}if(n<0||n>this.length)throw Error(\"bytes.Buffer: truncation out of range\");this.#r(this.#n+n)}reset(){this.#r(0),this.#n=0}#t(n){let r=this.#e.byteLength;return n<=this.capacity-r?(this.#r(r+n),r):-1}#r(n){De(n<=this.#e.buffer.byteLength),this.#e=new Uint8Array(this.#e.buffer,0,n)}readSync(n){if(this.empty())return this.reset(),n.byteLength===0?0:null;let r=Y(this.#e.subarray(this.#n),n);return this.#n+=r,r}read(n){let r=this.readSync(n);return Promise.resolve(r)}writeSync(n){let r=this.#i(n.byteLength);return Y(n,this.#e,r)}write(n){let r=this.writeSync(n);return Promise.resolve(r)}#i(n){let r=this.length;r===0&&this.#n!==0&&this.reset();let t=this.#t(n);if(t>=0)return t;let i=this.capacity;if(n<=Math.floor(i/2)-r)Y(this.#e.subarray(this.#n),this.#e);else{if(i+n>ce)throw new Error(\"The buffer cannot be grown beyond the maximum size.\");{let o=new Uint8Array(Math.min(2*i+n,ce));Y(this.#e.subarray(this.#n),o),this.#e=o}}return this.#n=0,this.#r(Math.min(r+n,ce)),r}grow(n){if(n<0)throw Error(\"Buffer.grow: negative count\");let r=this.#i(n);this.#r(r)}async readFrom(n){let r=0,t=new Uint8Array(Q);for(;;){let i=this.capacity-this.length<Q,o=i?t:new Uint8Array(this.#e.buffer,this.length),l=await n.read(o);if(l===null)return r;i?this.writeSync(o.subarray(0,l)):this.#r(this.length+l),r+=l}}readFromSync(n){let r=0,t=new Uint8Array(Q);for(;;){let i=this.capacity-this.length<Q,o=i?t:new Uint8Array(this.#e.buffer,this.length),l=n.readSync(o);if(l===null)return r;i?this.writeSync(o.subarray(0,l)):this.#r(this.length+l),r+=l}}};var ae=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function fr(e){if(e===null)return!1;let n,r=0,t=e.length,i=ae;for(let o=0;o<t;o++)if(n=i.indexOf(e.charAt(o)),!(n>64)){if(n<0)return!1;r+=6}return r%8===0}function mr(e){let n=e.replace(/[\\r\\n=]/g,\"\"),r=n.length,t=ae,i=[],o=0;for(let s=0;s<r;s++)s%4===0&&s&&(i.push(o>>16&255),i.push(o>>8&255),i.push(o&255)),o=o<<6|t.indexOf(n.charAt(s));let l=r%4*6;return l===0?(i.push(o>>16&255),i.push(o>>8&255),i.push(o&255)):l===18?(i.push(o>>10&255),i.push(o>>2&255)):l===12&&i.push(o>>4&255),new B(new Uint8Array(i))}function dr(e){let n=e.length,r=ae,t=\"\",i=0;for(let l=0;l<n;l++)l%3===0&&l&&(t+=r[i>>18&63],t+=r[i>>12&63],t+=r[i>>6&63],t+=r[i&63]),i=(i<<8)+e[l];let o=n%3;return o===0?(t+=r[i>>18&63],t+=r[i>>12&63],t+=r[i>>6&63],t+=r[i&63]):o===2?(t+=r[i>>10&63],t+=r[i>>4&63],t+=r[i<<2&63],t+=r[64]):o===1&&(t+=r[i>>2&63],t+=r[i<<4&63],t+=r[64],t+=r[64]),t}function gr(e){if(typeof e?.readSync!=\"function\")return!1;let n=new B;try{return 0>n.readFromSync(e)}catch{return!1}finally{n.reset()}}var pe=new d(\"tag:yaml.org,2002:binary\",{construct:mr,kind:\"scalar\",predicate:gr,represent:dr,resolve:fr});function hr(e){let n=e.length;return n===4&&(e===\"true\"||e===\"True\"||e===\"TRUE\")||n===5&&(e===\"false\"||e===\"False\"||e===\"FALSE\")}function yr(e){return e===\"true\"||e===\"True\"||e===\"TRUE\"}var fe=new d(\"tag:yaml.org,2002:bool\",{construct:yr,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:Re,represent:{lowercase(e){return e?\"true\":\"false\"},uppercase(e){return e?\"TRUE\":\"FALSE\"},camelcase(e){return e?\"True\":\"False\"}},resolve:hr});var xr=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function br(e){return!(!xr.test(e)||e[e.length-1]===\"_\")}function Ar(e){let n=e.replace(/_/g,\"\").toLowerCase(),r=n[0]===\"-\"?-1:1,t=[];if(\"+-\".indexOf(n[0])>=0&&(n=n.slice(1)),n===\".inf\")return r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY;if(n===\".nan\")return NaN;if(n.indexOf(\":\")>=0){n.split(\":\").forEach(l=>{t.unshift(parseFloat(l))});let i=0,o=1;return t.forEach(l=>{i+=l*o,o*=60}),r*i}return r*parseFloat(n)}var wr=/^[-+]?[0-9]+e/;function Sr(e,n){if(isNaN(e))switch(n){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(n){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(U(e))return\"-0.0\";let r=e.toString(10);return wr.test(r)?r.replace(\"e\",\".e\"):r}function Pr(e){return Object.prototype.toString.call(e)===\"[object Number]\"&&(e%1!==0||U(e))}var me=new d(\"tag:yaml.org,2002:float\",{construct:Ar,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:Pr,represent:Sr,resolve:br});function je(e){let n=new Function(`return ${e}`)();if(!(n instanceof Function))throw new TypeError(`Expected function but got ${typeof n}: ${e}`);return n}var Tr=new d(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve(e){if(e===null)return!1;try{return je(`${e}`),!0}catch{return!1}},construct(e){return je(e)},predicate(e){return e instanceof Function},represent(e){return e.toString()}});function Cr(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function vr(e){return 48<=e&&e<=55}function Or(e){return 48<=e&&e<=57}function kr(e){let n=e.length,r=0,t=!1;if(!n)return!1;let i=e[r];if((i===\"-\"||i===\"+\")&&(i=e[++r]),i===\"0\"){if(r+1===n)return!0;if(i=e[++r],i===\"b\"){for(r++;r<n;r++)if(i=e[r],i!==\"_\"){if(i!==\"0\"&&i!==\"1\")return!1;t=!0}return t&&i!==\"_\"}if(i===\"x\"){for(r++;r<n;r++)if(i=e[r],i!==\"_\"){if(!Cr(e.charCodeAt(r)))return!1;t=!0}return t&&i!==\"_\"}for(;r<n;r++)if(i=e[r],i!==\"_\"){if(!vr(e.charCodeAt(r)))return!1;t=!0}return t&&i!==\"_\"}if(i===\"_\")return!1;for(;r<n;r++)if(i=e[r],i!==\"_\"){if(i===\":\")break;if(!Or(e.charCodeAt(r)))return!1;t=!0}return!t||i===\"_\"?!1:i!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(r))}function Er(e){let n=e,r=[];n.indexOf(\"_\")!==-1&&(n=n.replace(/_/g,\"\"));let t=1,i=n[0];if((i===\"-\"||i===\"+\")&&(i===\"-\"&&(t=-1),n=n.slice(1),i=n[0]),n===\"0\")return 0;if(i===\"0\")return n[1]===\"b\"?t*parseInt(n.slice(2),2):n[1]===\"x\"?t*parseInt(n,16):t*parseInt(n,8);if(n.indexOf(\":\")!==-1){n.split(\":\").forEach(s=>{r.unshift(parseInt(s,10))});let o=0,l=1;return r.forEach(s=>{o+=s*l,l*=60}),t*o}return t*parseInt(n,10)}function Mr(e){return Object.prototype.toString.call(e)===\"[object Number]\"&&e%1===0&&!U(e)}var de=new d(\"tag:yaml.org,2002:int\",{construct:Er,defaultStyle:\"decimal\",kind:\"scalar\",predicate:Mr,represent:{binary(e){return e>=0?`0b${e.toString(2)}`:`-0b${e.toString(2).slice(1)}`},octal(e){return e>=0?`0${e.toString(8)}`:`-0${e.toString(8).slice(1)}`},decimal(e){return e.toString(10)},hexadecimal(e){return e>=0?`0x${e.toString(16).toUpperCase()}`:`-0x${e.toString(16).toUpperCase().slice(1)}`}},resolve:kr,styleAliases:{binary:[2,\"bin\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"],octal:[8,\"oct\"]}});var ge=new d(\"tag:yaml.org,2002:map\",{construct(e){return e!==null?e:{}},kind:\"mapping\"});function _r(e){return e===\"<<\"||e===null}var he=new d(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:_r});function Lr(e){let n=e.length;return n===1&&e===\"~\"||n===4&&(e===\"null\"||e===\"Null\"||e===\"NULL\")}function Fr(){return null}function Ir(e){return e===null}var ye=new d(\"tag:yaml.org,2002:null\",{construct:Fr,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:Ir,represent:{canonical(){return\"~\"},lowercase(){return\"null\"},uppercase(){return\"NULL\"},camelcase(){return\"Null\"}},resolve:Lr});var{hasOwn:Rr}=Object,Nr=Object.prototype.toString;function $r(e){let n=[],r=\"\",t=!1;for(let i of e){if(t=!1,Nr.call(i)!==\"[object Object]\")return!1;for(r in i)if(Rr(i,r))if(!t)t=!0;else return!1;if(!t)return!1;if(n.indexOf(r)===-1)n.push(r);else return!1}return!0}function Dr(e){return e!==null?e:[]}var xe=new d(\"tag:yaml.org,2002:omap\",{construct:Dr,kind:\"sequence\",resolve:$r});var jr=Object.prototype.toString;function Ur(e){let n=Array.from({length:e.length});for(let r=0;r<e.length;r++){let t=e[r];if(jr.call(t)!==\"[object Object]\")return!1;let i=Object.keys(t);if(i.length!==1)return!1;n[r]=[i[0],t[i[0]]]}return!0}function Yr(e){if(e===null)return[];let n=Array.from({length:e.length});for(let r=0;r<e.length;r+=1){let t=e[r],i=Object.keys(t);n[r]=[i[0],t[i[0]]]}return n}var be=new d(\"tag:yaml.org,2002:pairs\",{construct:Yr,kind:\"sequence\",resolve:Ur});var Ae=/^\\/(?<regexp>[\\s\\S]+)\\/(?<modifiers>[gismuy]*)$/,we=new d(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve(e){if(e===null||!e.length)return!1;let n=`${e}`;if(n.charAt(0)===\"/\"){if(!Ae.test(e))return!1;let r=[...n.match(Ae)?.groups?.modifiers??\"\"];if(new Set(r).size<r.length)return!1}return!0},construct(e){let{regexp:n=`${e}`,modifiers:r=\"\"}=`${e}`.match(Ae)?.groups??{};return new RegExp(n,r)},predicate(e){return e instanceof RegExp},represent(e){return e.toString()}});var Se=new d(\"tag:yaml.org,2002:seq\",{construct(e){return e!==null?e:[]},kind:\"sequence\"});var{hasOwn:Br}=Object;function Hr(e){if(e===null)return!0;for(let n in e)if(Br(e,n)&&e[n]!==null)return!1;return!0}function Gr(e){return e!==null?e:{}}var Pe=new d(\"tag:yaml.org,2002:set\",{construct:Gr,kind:\"mapping\",resolve:Hr});var Te=new d(\"tag:yaml.org,2002:str\",{construct(e){return e!==null?e:\"\"},kind:\"scalar\"});var Ue=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),Ye=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function Vr(e){return e===null?!1:Ue.exec(e)!==null||Ye.exec(e)!==null}function Kr(e){let n=Ue.exec(e);if(n===null&&(n=Ye.exec(e)),n===null)throw new Error(\"Date resolve error\");let r=+n[1],t=+n[2]-1,i=+n[3];if(!n[4])return new Date(Date.UTC(r,t,i));let o=+n[4],l=+n[5],s=+n[6],u=0;if(n[7]){let f=n[7].slice(0,3);for(;f.length<3;)f+=\"0\";u=+f}let p=null;if(n[9]){let f=+n[10],g=+(n[11]||0);p=(f*60+g)*6e4,n[9]===\"-\"&&(p=-p)}let m=new Date(Date.UTC(r,t,i,o,l,s,u));return p&&m.setTime(m.getTime()-p),m}function qr(e){return e.toISOString()}var Ce=new d(\"tag:yaml.org,2002:timestamp\",{construct:Kr,instanceOf:Date,kind:\"scalar\",represent:qr,resolve:Vr});var ve=new d(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve(){return!0},construct(){},predicate(e){return typeof e>\"u\"},represent(){return\"\"}});var Oe=new A({explicit:[Te,Se,ge]});var ke=new A({implicit:[ye,fe,de,me],include:[Oe]});var Ee=new A({include:[ke]});var H=new A({explicit:[pe,xe,be,Pe],implicit:[Ce,he],include:[Ee]});var Wr=new A({explicit:[we,ve],include:[H]});var G=class{constructor(n=H){this.schema=n}};var X=class extends G{constructor(r,{filename:t,schema:i,onWarning:o,legacy:l=!1,json:s=!1,listener:u=null}){super(i);this.input=r;this.documents=[];this.lineIndent=0;this.lineStart=0;this.position=0;this.line=0;this.result=\"\";this.filename=t,this.onWarning=o,this.legacy=l,this.json=s,this.listener=u,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length}};var{hasOwn:M}=Object,z=1,We=2,Qe=3,Z=4,Me=1,Qr=2,Be=3,Xr=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,zr=/[\\x85\\u2028\\u2029]/,Zr=/[,\\[\\]\\{\\}]/,Xe=/^(?:!|!!|![a-z\\-]+!)$/i,ze=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function He(e){return Object.prototype.toString.call(e)}function C(e){return e===10||e===13}function I(e){return e===9||e===32}function w(e){return e===9||e===32||e===10||e===13}function $(e){return e===44||e===91||e===93||e===123||e===125}function Jr(e){if(48<=e&&e<=57)return e-48;let n=e|32;return 97<=n&&n<=102?n-97+10:-1}function ei(e){return e===120?2:e===117?4:e===85?8:0}function ni(e){return 48<=e&&e<=57?e-48:-1}function Ge(e){return e===48?\"\\0\":e===97?\"\\x07\":e===98?\"\\b\":e===116||e===9?\"\t\":e===110?`\n`:e===118?\"\\v\":e===102?\"\\f\":e===114?\"\\r\":e===101?\"\\x1B\":e===32?\" \":e===34?'\"':e===47?\"/\":e===92?\"\\\\\":e===78?\"\\x85\":e===95?\"\\xA0\":e===76?\"\\u2028\":e===80?\"\\u2029\":\"\"}function ri(e){return e<=65535?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}var Ze=Array.from({length:256}),Je=Array.from({length:256});for(let e=0;e<256;e++)Ze[e]=Ge(e)?1:0,Je[e]=Ge(e);function en(e,n){return new k(n,new W(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function a(e,n){throw en(e,n)}function J(e,n){e.onWarning&&e.onWarning.call(null,en(e,n))}var Ve={YAML(e,n,...r){if(e.version!==null)return a(e,\"duplication of %YAML directive\");if(r.length!==1)return a(e,\"YAML directive accepts exactly one argument\");let t=/^([0-9]+)\\.([0-9]+)$/.exec(r[0]);if(t===null)return a(e,\"ill-formed argument of the YAML directive\");let i=parseInt(t[1],10),o=parseInt(t[2],10);if(i!==1)return a(e,\"unacceptable YAML version of the document\");if(e.version=r[0],e.checkLineBreaks=o<2,o!==1&&o!==2)return J(e,\"unsupported YAML version of the document\")},TAG(e,n,...r){if(r.length!==2)return a(e,\"TAG directive accepts exactly two arguments\");let t=r[0],i=r[1];if(!Xe.test(t))return a(e,\"ill-formed tag handle (first argument) of the TAG directive\");if(e.tagMap&&M(e.tagMap,t))return a(e,`there is a previously declared suffix for \"${t}\" tag handle`);if(!ze.test(i))return a(e,\"ill-formed tag prefix (second argument) of the TAG directive\");typeof e.tagMap>\"u\"&&(e.tagMap=Object.create(null)),e.tagMap[t]=i}};function E(e,n,r,t){let i;if(n<r){if(i=e.input.slice(n,r),t)for(let o=0,l=i.length;o<l;o++){let s=i.charCodeAt(o);if(!(s===9||32<=s&&s<=1114111))return a(e,\"expected valid JSON character\")}else if(Xr.test(i))return a(e,\"the stream contains non-printable characters\");e.result+=i}}function Ke(e,n,r,t){if(!Ne(r))return a(e,\"cannot merge mappings; the provided source object is unacceptable\");let i=Object.keys(r);for(let o=0,l=i.length;o<l;o++){let s=i[o];M(n,s)||(Object.defineProperty(n,s,{value:r[s],writable:!0,enumerable:!0,configurable:!0}),t[s]=!0)}}function D(e,n,r,t,i,o,l,s){if(Array.isArray(i)){i=Array.prototype.slice.call(i);for(let u=0,p=i.length;u<p;u++){if(Array.isArray(i[u]))return a(e,\"nested arrays are not supported inside keys\");typeof i==\"object\"&&He(i[u])===\"[object Object]\"&&(i[u]=\"[object Object]\")}}if(typeof i==\"object\"&&He(i)===\"[object Object]\"&&(i=\"[object Object]\"),i=String(i),n===null&&(n={}),t===\"tag:yaml.org,2002:merge\")if(Array.isArray(o))for(let u=0,p=o.length;u<p;u++)Ke(e,n,o[u],r);else Ke(e,n,o,r);else{if(!e.json&&!M(r,i)&&M(n,i))return e.line=l||e.line,e.position=s||e.position,a(e,\"duplicated mapping key\");Object.defineProperty(n,i,{value:o,writable:!0,enumerable:!0,configurable:!0}),delete r[i]}return n}function _e(e){let n=e.input.charCodeAt(e.position);if(n===10)e.position++;else if(n===13)e.position++,e.input.charCodeAt(e.position)===10&&e.position++;else return a(e,\"a line break is expected\");e.line+=1,e.lineStart=e.position}function h(e,n,r){let t=0,i=e.input.charCodeAt(e.position);for(;i!==0;){for(;I(i);)i=e.input.charCodeAt(++e.position);if(n&&i===35)do i=e.input.charCodeAt(++e.position);while(i!==10&&i!==13&&i!==0);if(C(i))for(_e(e),i=e.input.charCodeAt(e.position),t++,e.lineIndent=0;i===32;)e.lineIndent++,i=e.input.charCodeAt(++e.position);else break}return r!==-1&&t!==0&&e.lineIndent<r&&J(e,\"deficient indentation\"),t}function ee(e){let n=e.position,r=e.input.charCodeAt(n);return!!((r===45||r===46)&&r===e.input.charCodeAt(n+1)&&r===e.input.charCodeAt(n+2)&&(n+=3,r=e.input.charCodeAt(n),r===0||w(r)))}function Le(e,n){n===1?e.result+=\" \":n>1&&(e.result+=T(`\n`,n-1))}function ii(e,n,r){let t=e.kind,i=e.result,o=e.input.charCodeAt(e.position);if(w(o)||$(o)||o===35||o===38||o===42||o===33||o===124||o===62||o===39||o===34||o===37||o===64||o===96)return!1;let l;if((o===63||o===45)&&(l=e.input.charCodeAt(e.position+1),w(l)||r&&$(l)))return!1;e.kind=\"scalar\",e.result=\"\";let s,u=s=e.position,p=!1,m=0;for(;o!==0;){if(o===58){if(l=e.input.charCodeAt(e.position+1),w(l)||r&&$(l))break}else if(o===35){let f=e.input.charCodeAt(e.position-1);if(w(f))break}else{if(e.position===e.lineStart&&ee(e)||r&&$(o))break;if(C(o)){m=e.line;let f=e.lineStart,g=e.lineIndent;if(h(e,!1,-1),e.lineIndent>=n){p=!0,o=e.input.charCodeAt(e.position);continue}else{e.position=s,e.line=m,e.lineStart=f,e.lineIndent=g;break}}}p&&(E(e,u,s,!1),Le(e,e.line-m),u=s=e.position,p=!1),I(o)||(s=e.position+1),o=e.input.charCodeAt(++e.position)}return E(e,u,s,!1),e.result?!0:(e.kind=t,e.result=i,!1)}function ti(e,n){let r,t,i;if(r=e.input.charCodeAt(e.position),r!==39)return!1;for(e.kind=\"scalar\",e.result=\"\",e.position++,t=i=e.position;(r=e.input.charCodeAt(e.position))!==0;)if(r===39)if(E(e,t,e.position,!0),r=e.input.charCodeAt(++e.position),r===39)t=e.position,e.position++,i=e.position;else return!0;else if(C(r))E(e,t,i,!0),Le(e,h(e,!1,n)),t=i=e.position;else{if(e.position===e.lineStart&&ee(e))return a(e,\"unexpected end of the document within a single quoted scalar\");e.position++,i=e.position}return a(e,\"unexpected end of the stream within a single quoted scalar\")}function oi(e,n){let r=e.input.charCodeAt(e.position);if(r!==34)return!1;e.kind=\"scalar\",e.result=\"\",e.position++;let t,i=t=e.position,o;for(;(r=e.input.charCodeAt(e.position))!==0;){if(r===34)return E(e,i,e.position,!0),e.position++,!0;if(r===92){if(E(e,i,e.position,!0),r=e.input.charCodeAt(++e.position),C(r))h(e,!1,n);else if(r<256&&Ze[r])e.result+=Je[r],e.position++;else if((o=ei(r))>0){let l=o,s=0;for(;l>0;l--)if(r=e.input.charCodeAt(++e.position),(o=Jr(r))>=0)s=(s<<4)+o;else return a(e,\"expected hexadecimal character\");e.result+=ri(s),e.position++}else return a(e,\"unknown escape sequence\");i=t=e.position}else if(C(r))E(e,i,t,!0),Le(e,h(e,!1,n)),i=t=e.position;else{if(e.position===e.lineStart&&ee(e))return a(e,\"unexpected end of the document within a double quoted scalar\");e.position++,t=e.position}}return a(e,\"unexpected end of the stream within a double quoted scalar\")}function li(e,n){let r=e.input.charCodeAt(e.position),t,i=!0,o={};if(r===91)t=93,i=!1,o=[];else if(r===123)t=125;else return!1;e.anchor!==null&&typeof e.anchor<\"u\"&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=o),r=e.input.charCodeAt(++e.position);let l=e.tag,s=e.anchor,u=!0,p,m,f=m=p=null,g,S=g=!1,y=0,P=0,x=Object.create(null);for(;r!==0;){if(h(e,!0,n),r=e.input.charCodeAt(e.position),r===t)return e.position++,e.tag=l,e.anchor=s,e.kind=i?\"mapping\":\"sequence\",e.result=o,!0;if(!u)return a(e,\"missed comma between flow collection entries\");f=m=p=null,S=g=!1,r===63&&(y=e.input.charCodeAt(e.position+1),w(y)&&(S=g=!0,e.position++,h(e,!0,n))),P=e.line,j(e,n,z,!1,!0),f=e.tag||null,m=e.result,h(e,!0,n),r=e.input.charCodeAt(e.position),(g||e.line===P)&&r===58&&(S=!0,r=e.input.charCodeAt(++e.position),h(e,!0,n),j(e,n,z,!1,!0),p=e.result),i?D(e,o,x,f,m,p):S?o.push(D(e,null,x,f,m,p)):o.push(m),h(e,!0,n),r=e.input.charCodeAt(e.position),r===44?(u=!0,r=e.input.charCodeAt(++e.position)):u=!1}return a(e,\"unexpected end of the stream within a flow collection\")}function si(e,n){let r=Me,t=!1,i=!1,o=n,l=0,s=!1,u=e.input.charCodeAt(e.position),p=!1;if(u===124)p=!1;else if(u===62)p=!0;else return!1;e.kind=\"scalar\",e.result=\"\";let m=0;for(;u!==0;)if(u=e.input.charCodeAt(++e.position),u===43||u===45)if(Me===r)r=u===43?Be:Qr;else return a(e,\"repeat of a chomping mode identifier\");else if((m=ni(u))>=0){if(m===0)return a(e,\"bad explicit indentation width of a block scalar; it cannot be less than one\");if(!i)o=n+m-1,i=!0;else return a(e,\"repeat of an indentation width identifier\")}else break;if(I(u)){do u=e.input.charCodeAt(++e.position);while(I(u));if(u===35)do u=e.input.charCodeAt(++e.position);while(!C(u)&&u!==0)}for(;u!==0;){for(_e(e),e.lineIndent=0,u=e.input.charCodeAt(e.position);(!i||e.lineIndent<o)&&u===32;)e.lineIndent++,u=e.input.charCodeAt(++e.position);if(!i&&e.lineIndent>o&&(o=e.lineIndent),C(u)){l++;continue}if(e.lineIndent<o){r===Be?e.result+=T(`\n`,t?1+l:l):r===Me&&t&&(e.result+=`\n`);break}p?I(u)?(s=!0,e.result+=T(`\n`,t?1+l:l)):s?(s=!1,e.result+=T(`\n`,l+1)):l===0?t&&(e.result+=\" \"):e.result+=T(`\n`,l):e.result+=T(`\n`,t?1+l:l),t=!0,i=!0,l=0;let f=e.position;for(;!C(u)&&u!==0;)u=e.input.charCodeAt(++e.position);E(e,f,e.position,!1)}return!0}function qe(e,n){let r,t,i=!1,o,l=e.tag,s=e.anchor,u=[];for(e.anchor!==null&&typeof e.anchor<\"u\"&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=u),o=e.input.charCodeAt(e.position);o!==0&&!(o!==45||(t=e.input.charCodeAt(e.position+1),!w(t)));){if(i=!0,e.position++,h(e,!0,-1)&&e.lineIndent<=n){u.push(null),o=e.input.charCodeAt(e.position);continue}if(r=e.line,j(e,n,Qe,!1,!0),u.push(e.result),h(e,!0,-1),o=e.input.charCodeAt(e.position),(e.line===r||e.lineIndent>n)&&o!==0)return a(e,\"bad indentation of a sequence entry\");if(e.lineIndent<n)break}return i?(e.tag=l,e.anchor=s,e.kind=\"sequence\",e.result=u,!0):!1}function ui(e,n,r){let t=e.tag,i=e.anchor,o={},l=Object.create(null),s,u=!1,p,m,f=null,g=null,S=null,y=!1,P=!1,x;for(e.anchor!==null&&typeof e.anchor<\"u\"&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=o),x=e.input.charCodeAt(e.position);x!==0;){if(s=e.input.charCodeAt(e.position+1),p=e.line,m=e.position,(x===63||x===58)&&w(s)){if(x===63)y&&(D(e,o,l,f,g,null),f=g=S=null),P=!0,y=!0,u=!0;else if(y)y=!1,u=!0;else return a(e,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\");e.position+=1,x=s}else if(j(e,r,We,!1,!0))if(e.line===p){for(x=e.input.charCodeAt(e.position);I(x);)x=e.input.charCodeAt(++e.position);if(x===58){if(x=e.input.charCodeAt(++e.position),!w(x))return a(e,\"a whitespace character is expected after the key-value separator within a block mapping\");y&&(D(e,o,l,f,g,null),f=g=S=null),P=!0,y=!1,u=!1,f=e.tag,g=e.result}else return P?a(e,\"can not read an implicit mapping pair; a colon is missed\"):(e.tag=t,e.anchor=i,!0)}else return P?a(e,\"can not read a block mapping entry; a multiline key may not be an implicit key\"):(e.tag=t,e.anchor=i,!0);else break;if((e.line===p||e.lineIndent>n)&&(j(e,n,Z,!0,u)&&(y?g=e.result:S=e.result),y||(D(e,o,l,f,g,S,p,m),f=g=S=null),h(e,!0,-1),x=e.input.charCodeAt(e.position)),e.lineIndent>n&&x!==0)return a(e,\"bad indentation of a mapping entry\");if(e.lineIndent<n)break}return y&&D(e,o,l,f,g,null),P&&(e.tag=t,e.anchor=i,e.kind=\"mapping\",e.result=o),P}function ci(e){let n,r=!1,t=!1,i=\"\",o,l;if(l=e.input.charCodeAt(e.position),l!==33)return!1;if(e.tag!==null)return a(e,\"duplication of a tag property\");if(l=e.input.charCodeAt(++e.position),l===60?(r=!0,l=e.input.charCodeAt(++e.position)):l===33?(t=!0,i=\"!!\",l=e.input.charCodeAt(++e.position)):i=\"!\",n=e.position,r){do l=e.input.charCodeAt(++e.position);while(l!==0&&l!==62);if(e.position<e.length)o=e.input.slice(n,e.position),l=e.input.charCodeAt(++e.position);else return a(e,\"unexpected end of the stream within a verbatim tag\")}else{for(;l!==0&&!w(l);){if(l===33){if(t)return a(e,\"tag suffix cannot contain exclamation marks\");if(i=e.input.slice(n-1,e.position+1),!Xe.test(i))return a(e,\"named tag handle cannot contain such characters\");t=!0,n=e.position+1}l=e.input.charCodeAt(++e.position)}if(o=e.input.slice(n,e.position),Zr.test(o))return a(e,\"tag suffix cannot contain flow indicator characters\")}if(o&&!ze.test(o))return a(e,`tag name cannot contain such characters: ${o}`);if(r)e.tag=o;else if(typeof e.tagMap<\"u\"&&M(e.tagMap,i))e.tag=e.tagMap[i]+o;else if(i===\"!\")e.tag=`!${o}`;else if(i===\"!!\")e.tag=`tag:yaml.org,2002:${o}`;else return a(e,`undeclared tag handle \"${i}\"`);return!0}function ai(e){let n=e.input.charCodeAt(e.position);if(n!==38)return!1;if(e.anchor!==null)return a(e,\"duplication of an anchor property\");n=e.input.charCodeAt(++e.position);let r=e.position;for(;n!==0&&!w(n)&&!$(n);)n=e.input.charCodeAt(++e.position);return e.position===r?a(e,\"name of an anchor node must contain at least one character\"):(e.anchor=e.input.slice(r,e.position),!0)}function pi(e){let n=e.input.charCodeAt(e.position);if(n!==42)return!1;n=e.input.charCodeAt(++e.position);let r=e.position;for(;n!==0&&!w(n)&&!$(n);)n=e.input.charCodeAt(++e.position);if(e.position===r)return a(e,\"name of an alias node must contain at least one character\");let t=e.input.slice(r,e.position);return typeof e.anchorMap<\"u\"&&!M(e.anchorMap,t)?a(e,`unidentified alias \"${t}\"`):(typeof e.anchorMap<\"u\"&&(e.result=e.anchorMap[t]),h(e,!0,-1),!0)}function j(e,n,r,t,i){let o,l,s=1,u=!1,p=!1,m,f,g;e.listener&&e.listener!==null&&e.listener(\"open\",e),e.tag=null,e.anchor=null,e.kind=null,e.result=null;let S=o=l=Z===r||Qe===r;if(t&&h(e,!0,-1)&&(u=!0,e.lineIndent>n?s=1:e.lineIndent===n?s=0:e.lineIndent<n&&(s=-1)),s===1)for(;ci(e)||ai(e);)h(e,!0,-1)?(u=!0,l=S,e.lineIndent>n?s=1:e.lineIndent===n?s=0:e.lineIndent<n&&(s=-1)):l=!1;if(l&&(l=u||i),s===1||Z===r)if(f=z===r||We===r?n:n+1,g=e.position-e.lineStart,s===1)if(l&&(qe(e,g)||ui(e,g,f))||li(e,f))p=!0;else{if(o&&si(e,f)||ti(e,f)||oi(e,f))p=!0;else if(pi(e)){if(p=!0,e.tag!==null||e.anchor!==null)return a(e,\"alias node should not have Any properties\")}else ii(e,f,z===r)&&(p=!0,e.tag===null&&(e.tag=\"?\"));e.anchor!==null&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=e.result)}else s===0&&(p=l&&qe(e,g));if(e.tag!==null&&e.tag!==\"!\")if(e.tag===\"?\"){for(let y=0,P=e.implicitTypes.length;y<P;y++)if(m=e.implicitTypes[y],m.resolve(e.result)){e.result=m.construct(e.result),e.tag=m.tag,e.anchor!==null&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=e.result);break}}else if(M(e.typeMap[e.kind||\"fallback\"],e.tag)){if(m=e.typeMap[e.kind||\"fallback\"][e.tag],e.result!==null&&m.kind!==e.kind)return a(e,`unacceptable node kind for !<${e.tag}> tag; it should be \"${m.kind}\", not \"${e.kind}\"`);if(m.resolve(e.result))e.result=m.construct(e.result),e.anchor!==null&&typeof e.anchorMap<\"u\"&&(e.anchorMap[e.anchor]=e.result);else return a(e,`cannot resolve a node with !<${e.tag}> explicit tag`)}else return a(e,`unknown tag !<${e.tag}>`);return e.listener&&e.listener!==null&&e.listener(\"close\",e),e.tag!==null||e.anchor!==null||p}function fi(e){let n=e.position,r,t,i,o=!1,l;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);(l=e.input.charCodeAt(e.position))!==0&&(h(e,!0,-1),l=e.input.charCodeAt(e.position),!(e.lineIndent>0||l!==37));){for(o=!0,l=e.input.charCodeAt(++e.position),r=e.position;l!==0&&!w(l);)l=e.input.charCodeAt(++e.position);if(t=e.input.slice(r,e.position),i=[],t.length<1)return a(e,\"directive name must not be less than one character in length\");for(;l!==0;){for(;I(l);)l=e.input.charCodeAt(++e.position);if(l===35){do l=e.input.charCodeAt(++e.position);while(l!==0&&!C(l));break}if(C(l))break;for(r=e.position;l!==0&&!w(l);)l=e.input.charCodeAt(++e.position);i.push(e.input.slice(r,e.position))}l!==0&&_e(e),M(Ve,t)?Ve[t](e,t,...i):J(e,`unknown document directive \"${t}\"`)}if(h(e,!0,-1),e.lineIndent===0&&e.input.charCodeAt(e.position)===45&&e.input.charCodeAt(e.position+1)===45&&e.input.charCodeAt(e.position+2)===45)e.position+=3,h(e,!0,-1);else if(o)return a(e,\"directives end mark is expected\");if(j(e,e.lineIndent-1,Z,!1,!0),h(e,!0,-1),e.checkLineBreaks&&zr.test(e.input.slice(n,e.position))&&J(e,\"non-ASCII line breaks are interpreted as content\"),e.documents.push(e.result),e.position===e.lineStart&&ee(e)){e.input.charCodeAt(e.position)===46&&(e.position+=3,h(e,!0,-1));return}if(e.position<e.length-1)return a(e,\"end of the stream or a document separator is expected\")}function mi(e,n){e=String(e),n=n||{},e.length!==0&&(e.charCodeAt(e.length-1)!==10&&e.charCodeAt(e.length-1)!==13&&(e+=`\n`),e.charCodeAt(0)===65279&&(e=e.slice(1)));let r=new X(e,n);for(r.input+=\"\\0\";r.input.charCodeAt(r.position)===32;)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)fi(r);return r.documents}function nn(e,n){let r=mi(e,n);if(r.length!==0){if(r.length===1)return r[0];throw new k(\"expected a single document in the stream, but found more\")}}function rn(e,n){return nn(e,n)}var{hasOwn:Zo}=Object;var{hasOwn:tl}=Object;var b={};b[0]=\"\\\\0\";b[7]=\"\\\\a\";b[8]=\"\\\\b\";b[9]=\"\\\\t\";b[10]=\"\\\\n\";b[11]=\"\\\\v\";b[12]=\"\\\\f\";b[13]=\"\\\\r\";b[27]=\"\\\\e\";b[34]='\\\\\"';b[92]=\"\\\\\\\\\";b[133]=\"\\\\N\";b[160]=\"\\\\_\";b[8232]=\"\\\\L\";b[8233]=\"\\\\P\";async function gi(e,n){let r=await O.readPage(e),t=await K.parseMarkdown(r),i;return Ie(t,o=>{if(o.type!==\"FencedCode\")return!1;let l=le(o,\"CodeInfo\");if(n&&!l||n&&!n.includes(l.children[0].text))return!1;let s=le(o,\"CodeText\");return s?(i=s.children[0].text,!0):!1}),i}async function on(e,n=[\"yaml\"]){let r=await gi(e,n);if(r!==void 0)try{return rn(r)}catch(t){throw console.error(\"YAML Page parser error\",t),new Error(`YAML Error: ${t.message}`)}}var hi=\"SETTINGS\";async function ln(e,n){try{let t=(await on(hi,[\"yaml\"])||{})[e];return t===void 0?n:t}catch(r){if(r.message===\"Page not found\")return n;throw r}}async function V(e){let n=await ln(\"graphview\",{});return n[e]!==void 0?n[e]:!1}var ne=class{async init(){this.colorMapSettings=await V(\"colormap\"),console.log(this.colorMapSettings),this.colorMapPathSettings=this.colorMapSettings?this.colorMapSettings.path:[],this.colorMapTagSettings=this.colorMapSettings?this.colorMapSettings.tag:[],this.spacetags=await v.queryPrefix(\"tag:\"),this.taggedPages=[...new Set(this.spacetags.map(n=>n.page))],this.individuallyTaggedPages=await v.queryPrefix(\"tag:node_color=\"),this.spacepages=await O.listPages(),this.default_color=await V(\"default_color\")}build(){return this.spacepages.map(n=>{let r=this.spacetags.filter(t=>t.page===n.name);if(this.individuallyTaggedPages.find(t=>t.page===n.name))return{page:n.name,color:this.individuallyTaggedPages.find(t=>t.page===n.name).value.split(\"=\")[1]};if(this.colorMapTagSettings){let t=r.filter(i=>this.colorMapTagSettings[i.value]!==void 0);if(t.length>0)return{page:n.name,color:this.colorMapTagSettings[t[0].value]}}if(this.colorMapPathSettings){let t=Object.keys(this.colorMapPathSettings).find(i=>n.name.startsWith(i));if(t)return{page:n.name,color:this.colorMapPathSettings[t]}}return{page:n.name,color:this.default_color?this.default_color:\"000000\"}})}};var re=class{constructor(n=[]){this.pagefilter=n=>!this.isIgnoredPage(n.name);this.linkfilter=n=>{let r=n.key.split(\":\").slice(1,-1).join(\":\");return!this.isIgnoredPage(n.page)&&!this.isIgnoredPage(r)};this.ignoredPages=n}async init(){this.ignoredPages=(await v.queryPrefix(\"tag:.graphignore\")).map(n=>n.page)}isIgnoredPage(n){return this.ignoredPages.includes(n)}};var yi=new q(\"showGraphView\"),sn=new ne;async function un(){let e=await _.getCurrentPage();await xi(e)}async function xi(e){let n=await Ai(e),r=JSON.stringify(n),t=await F.readAsset(\"style.css\");await yi.getGraphViewStatus()&&await _.showPanel(\"lhs\",1,`<html>\n <head>\n <style>${t}</style>\n </head>\n <body>\n <div id=\"graph\" >\n </div>\n </body>\n </html>`,await bi(r))}async function bi(e){let n=await F.readAsset(\"asset/d3.js\",\"utf8\"),r=await F.readAsset(\"asset/d3-force.js\",\"utf8\"),t=await F.readAsset(\"asset/force-graph.js\",\"utf8\");return`\n ${n}\n ${r}\n ${t}\n \n const graph = ${e};\n console.log(graph);\n const graph_div = document.querySelector('#graph');\n \n let chart;\n function createChart() {\n // Remove the existing chart object from the DOM\n graph_div.innerHTML = '';\n \n // Create a new chart object with the updated dimensions\n chart = ForceGraph(graph, {\n nodeId: d => d.id,\n nodeTitle: d => d.id,\n nodeStrokeOpacity: 0.75,\n height: window.innerHeight,\n width: window.innerWidth,\n });\n \n // Add the new chart object to the DOM\n graph_div.appendChild(chart);\n }\n \n createChart();\n\n function handleResize() {\n // Check if the dimensions have actually changed\n if (window.innerHeight-10 !== chart.height || window.innerWidth-10 !== chart.width) {\n // Recreate/redraw the chart object\n createChart();\n }\n }\n \n let timeout = false;\n // Add an event listener to the window object that listens for the resize event\n window.addEventListener('resize', () => {\n clearTimeout(timeout);\n timeout = setTimeout(handleResize, 250);\n });\n `}async function Ai(e){let n=new re;await n.init();let t=(await O.listPages()).filter(n.pagefilter).map(({name:p})=>p),o=(await v.queryPrefix(\"pl:\")).filter(n.linkfilter).map(({key:p,page:m})=>{let f=p.split(\":\").slice(1,-1).join(\":\");return t.includes(f)||t.push(f),{source:m,target:f}});await sn.init();let l=sn.build(),s=await V(\"default_color\");return{nodes:t.map(p=>{let m=s||\"000000\";return l.find(f=>f.page===p)&&(m=l.find(f=>f.page===p).color),{id:p,color:m}}),links:o}}var wi=un;return mn(Si);})();\n return mod;})()"
},
"navigateTo": {
"events": [
"graphview:navigateTo"
],
"code": "(() => { var mod=(()=>{var w=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var pe=Object.prototype.hasOwnProperty;var Q=(e,n)=>{for(var r in n)w(e,r,{get:n[r],enumerable:!0})},fe=(e,n,r,t)=>{if(n&&typeof n==\"object\"||typeof n==\"function\")for(let i of se(n))!pe.call(e,i)&&i!==r&&w(e,i,{get:()=>n[i],enumerable:!(t=ce(n,i))||t.enumerable});return e};var ae=e=>fe(w({},\"__esModule\",{value:!0}),e);var Nn={};Q(Nn,{default:()=>Rn});typeof self>\"u\"&&(self={syscall:()=>{throw new Error(\"Not implemented here\")}});var o=self.syscall;var h={};Q(h,{confirm:()=>Re,dispatch:()=>Fe,downloadFile:()=>Pe,filterBox:()=>Oe,flashNotification:()=>Ce,getCurrentPage:()=>de,getCursor:()=>ye,getSelection:()=>xe,getText:()=>ge,getUiOption:()=>Ne,hidePanel:()=>Ee,insertAtCursor:()=>Me,insertAtPos:()=>ve,moveCursor:()=>Le,navigate:()=>Se,openUrl:()=>Te,prompt:()=>Ie,reloadPage:()=>we,replaceRange:()=>_e,save:()=>Ae,setPage:()=>he,setSelection:()=>be,setUiOption:()=>$e,showPanel:()=>ke,vimEx:()=>De});function de(){return o(\"editor.getCurrentPage\")}function he(e){return o(\"editor.setPage\",e)}function ge(){return o(\"editor.getText\")}function ye(){return o(\"editor.getCursor\")}function xe(){return o(\"editor.getSelection\")}function be(e,n){return o(\"editor.setSelection\",e,n)}function Ae(){return o(\"editor.save\")}function Se(e,n,r=!1,t=!1){return o(\"editor.navigate\",e,n,r,t)}function we(){return o(\"editor.reloadPage\")}function Te(e){return o(\"editor.openUrl\",e)}function Pe(e,n){return o(\"editor.downloadFile\",e,n)}function Ce(e,n=\"info\"){return o(\"editor.flashNotification\",e,n)}function Oe(e,n,r=\"\",t=\"\"){return o(\"editor.filterBox\",e,n,r,t)}function ke(e,n,r,t=\"\"){return o(\"editor.showPanel\",e,n,r,t)}function Ee(e){return o(\"editor.hidePanel\",e)}function ve(e,n){return o(\"editor.insertAtPos\",e,n)}function _e(e,n,r){return o(\"editor.replaceRange\",e,n,r)}function Le(e,n=!1){return o(\"editor.moveCursor\",e,n)}function Me(e){return o(\"editor.insertAtCursor\",e)}function Fe(e){return o(\"editor.dispatch\",e)}function Ie(e,n=\"\"){return o(\"editor.prompt\",e,n)}function Re(e){return o(\"editor.confirm\",e)}function Ne(e){return o(\"editor.getUiOption\",e)}function $e(e,n){return o(\"editor.setUiOption\",e,n)}function De(e){return o(\"editor.vimEx\",e)}var T=class{listPages(n=!1){return o(\"space.listPages\",n)}getPageMeta(n){return o(\"space.getPageMeta\",n)}readPage(n){return o(\"space.readPage\",n)}writePage(n,r){return o(\"space.writePage\",n,r)}deletePage(n){return o(\"space.deletePage\",n)}listPlugs(){return o(\"space.listPlugs\")}listAttachments(){return o(\"space.listAttachments\")}getAttachmentMeta(n){return o(\"space.getAttachmentMeta\",n)}readAttachment(n){return o(\"space.readAttachment\",n)}writeAttachment(n,r,t){return o(\"space.writeAttachment\",n,r,t)}deleteAttachment(n){return o(\"space.deleteAttachment\",n)}readFile(n,r){return o(\"space.readFile\",n,r)}getFileMeta(n){return o(\"space.getFileMeta\",n)}writeFile(n,r,t){return o(\"space.writeFile\",n,r,t)}deleteFile(n){return o(\"space.deleteFile\",n)}listFiles(n){return o(\"space.listFiles\",n)}},P=new T;var a=class extends Error{constructor(r=\"(unknown reason)\",t=\"\"){super(`${r} ${t}`);this.mark=t;this.name=this.constructor.name}toString(r){return`${this.name}: ${this.message} ${this.mark}`}};function z(e){return typeof e==\"boolean\"||e instanceof Boolean}function g(e){return e===0&&Number.NEGATIVE_INFINITY===1/e}function C(e,n,r){let t=[];for(let i of e.include)r=C(i,n,r);for(let i of e[n]){for(let l=0;l<r.length;l++){let c=r[l];c.tag===i.tag&&c.kind===i.kind&&t.push(l)}r.push(i)}return r.filter((i,l)=>!t.includes(l))}function Ke(...e){let n={fallback:{},mapping:{},scalar:{},sequence:{}};for(let r of e)for(let t of r)t.kind!==null&&(n[t.kind][t.tag]=n.fallback[t.tag]=t);return n}var p=class{constructor(n){this.explicit=n.explicit||[],this.implicit=n.implicit||[],this.include=n.include||[];for(let r of this.implicit)if(r.loadKind&&r.loadKind!==\"scalar\")throw new a(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\");this.compiledImplicit=C(this,\"implicit\",[]),this.compiledExplicit=C(this,\"explicit\",[]),this.compiledTypeMap=Ke(this.compiledImplicit,this.compiledExplicit)}extend(n){return new p({implicit:[...new Set([...this.implicit,...n?.implicit??[]])],explicit:[...new Set([...this.explicit,...n?.explicit??[]])],include:[...new Set([...this.include,...n?.include??[]])]})}static create(){}};var Ge=()=>!0,Ve=e=>e;var u=class{constructor(n,r){this.kind=null;this.resolve=()=>!0;this.construct=n=>n;this.tag=n,r&&(this.kind=r.kind,this.resolve=r.resolve||Ge,this.construct=r.construct||Ve,this.instanceOf=r.instanceOf,this.predicate=r.predicate,this.represent=r.represent,this.defaultStyle=r.defaultStyle,this.styleAliases=r.styleAliases)}};var O=class extends Error{constructor(n){super(n),this.name=\"DenoStdInternalError\"}};function ee(e,n=\"\"){if(!e)throw new O(n)}function y(e,n,r=0){r=Math.max(0,Math.min(r,n.byteLength));let t=n.byteLength-r;return e.byteLength>t&&(e=e.subarray(0,t)),n.set(e,r),e.byteLength}var b=32*1024,k=2**32-2,x=class{#e;#n=0;constructor(n){this.#e=n===void 0?new Uint8Array(0):new Uint8Array(n)}bytes(n={copy:!0}){return n.copy===!1?this.#e.subarray(this.#n):this.#e.slice(this.#n)}empty(){return this.#e.byteLength<=this.#n}get length(){return this.#e.byteLength-this.#n}get capacity(){return this.#e.buffer.byteLength}truncate(n){if(n===0){this.reset();return}if(n<0||n>this.length)throw Error(\"bytes.Buffer: truncation out of range\");this.#r(this.#n+n)}reset(){this.#r(0),this.#n=0}#t(n){let r=this.#e.byteLength;return n<=this.capacity-r?(this.#r(r+n),r):-1}#r(n){ee(n<=this.#e.buffer.byteLength),this.#e=new Uint8Array(this.#e.buffer,0,n)}readSync(n){if(this.empty())return this.reset(),n.byteLength===0?0:null;let r=y(this.#e.subarray(this.#n),n);return this.#n+=r,r}read(n){let r=this.readSync(n);return Promise.resolve(r)}writeSync(n){let r=this.#i(n.byteLength);return y(n,this.#e,r)}write(n){let r=this.writeSync(n);return Promise.resolve(r)}#i(n){let r=this.length;r===0&&this.#n!==0&&this.reset();let t=this.#t(n);if(t>=0)return t;let i=this.capacity;if(n<=Math.floor(i/2)-r)y(this.#e.subarray(this.#n),this.#e);else{if(i+n>k)throw new Error(\"The buffer cannot be grown beyond the maximum size.\");{let l=new Uint8Array(Math.min(2*i+n,k));y(this.#e.subarray(this.#n),l),this.#e=l}}return this.#n=0,this.#r(Math.min(r+n,k)),r}grow(n){if(n<0)throw Error(\"Buffer.grow: negative count\");let r=this.#i(n);this.#r(r)}async readFrom(n){let r=0,t=new Uint8Array(b);for(;;){let i=this.capacity-this.length<b,l=i?t:new Uint8Array(this.#e.buffer,this.length),c=await n.read(l);if(c===null)return r;i?this.writeSync(l.subarray(0,c)):this.#r(this.length+c),r+=c}}readFromSync(n){let r=0,t=new Uint8Array(b);for(;;){let i=this.capacity-this.length<b,l=i?t:new Uint8Array(this.#e.buffer,this.length),c=n.readSync(l);if(c===null)return r;i?this.writeSync(l.subarray(0,c)):this.#r(this.length+c),r+=c}}};var E=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function qe(e){if(e===null)return!1;let n,r=0,t=e.length,i=E;for(let l=0;l<t;l++)if(n=i.indexOf(e.charAt(l)),!(n>64)){if(n<0)return!1;r+=6}return r%8===0}function We(e){let n=e.replace(/[\\r\\n=]/g,\"\"),r=n.length,t=E,i=[],l=0;for(let f=0;f<r;f++)f%4===0&&f&&(i.push(l>>16&255),i.push(l>>8&255),i.push(l&255)),l=l<<6|t.indexOf(n.charAt(f));let c=r%4*6;return c===0?(i.push(l>>16&255),i.push(l>>8&255),i.push(l&255)):c===18?(i.push(l>>10&255),i.push(l>>2&255)):c===12&&i.push(l>>4&255),new x(new Uint8Array(i))}function Qe(e){let n=e.length,r=E,t=\"\",i=0;for(let c=0;c<n;c++)c%3===0&&c&&(t+=r[i>>18&63],t+=r[i>>12&63],t+=r[i>>6&63],t+=r[i&63]),i=(i<<8)+e[c];let l=n%3;return l===0?(t+=r[i>>18&63],t+=r[i>>12&63],t+=r[i>>6&63],t+=r[i&63]):l===2?(t+=r[i>>10&63],t+=r[i>>4&63],t+=r[i<<2&63],t+=r[64]):l===1&&(t+=r[i>>2&63],t+=r[i<<4&63],t+=r[64],t+=r[64]),t}function Xe(e){if(typeof e?.readSync!=\"function\")return!1;let n=new x;try{return 0>n.readFromSync(e)}catch{return!1}finally{n.reset()}}var v=new u(\"tag:yaml.org,2002:binary\",{construct:We,kind:\"scalar\",predicate:Xe,represent:Qe,resolve:qe});function ze(e){let n=e.length;return n===4&&(e===\"true\"||e===\"True\"||e===\"TRUE\")||n===5&&(e===\"false\"||e===\"False\"||e===\"FALSE\")}function Ze(e){return e===\"true\"||e===\"True\"||e===\"TRUE\"}var _=new u(\"tag:yaml.org,2002:bool\",{construct:Ze,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:z,represent:{lowercase(e){return e?\"true\":\"false\"},uppercase(e){return e?\"TRUE\":\"FALSE\"},camelcase(e){return e?\"True\":\"False\"}},resolve:ze});var Je=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function en(e){return!(!Je.test(e)||e[e.length-1]===\"_\")}function nn(e){let n=e.replace(/_/g,\"\").toLowerCase(),r=n[0]===\"-\"?-1:1,t=[];if(\"+-\".indexOf(n[0])>=0&&(n=n.slice(1)),n===\".inf\")return r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY;if(n===\".nan\")return NaN;if(n.indexOf(\":\")>=0){n.split(\":\").forEach(c=>{t.unshift(parseFloat(c))});let i=0,l=1;return t.forEach(c=>{i+=c*l,l*=60}),r*i}return r*parseFloat(n)}var rn=/^[-+]?[0-9]+e/;function tn(e,n){if(isNaN(e))switch(n){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===e)switch(n){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===e)switch(n){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(g(e))return\"-0.0\";let r=e.toString(10);return rn.test(r)?r.replace(\"e\",\".e\"):r}function on(e){return Object.prototype.toString.call(e)===\"[object Number]\"&&(e%1!==0||g(e))}var L=new u(\"tag:yaml.org,2002:float\",{construct:nn,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:on,represent:tn,resolve:en});function ne(e){let n=new Function(`return ${e}`)();if(!(n instanceof Function))throw new TypeError(`Expected function but got ${typeof n}: ${e}`);return n}var ln=new u(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve(e){if(e===null)return!1;try{return ne(`${e}`),!0}catch{return!1}},construct(e){return ne(e)},predicate(e){return e instanceof Function},represent(e){return e.toString()}});function un(e){return 48<=e&&e<=57||65<=e&&e<=70||97<=e&&e<=102}function cn(e){return 48<=e&&e<=55}function sn(e){return 48<=e&&e<=57}function pn(e){let n=e.length,r=0,t=!1;if(!n)return!1;let i=e[r];if((i===\"-\"||i===\"+\")&&(i=e[++r]),i===\"0\"){if(r+1===n)return!0;if(i=e[++r],i===\"b\"){for(r++;r<n;r++)if(i=e[r],i!==\"_\"){if(i!==\"0\"&&i!==\"1\")return!1;t=!0}return t&&i!==\"_\"}if(i===\"x\"){for(r++;r<n;r++)if(i=e[r],i!==\"_\"){if(!un(e.charCodeAt(r)))return!1;t=!0}return t&&i!==\"_\"}for(;r<n;r++)if(i=e[r],i!==\"_\"){if(!cn(e.charCodeAt(r)))return!1;t=!0}return t&&i!==\"_\"}if(i===\"_\")return!1;for(;r<n;r++)if(i=e[r],i!==\"_\"){if(i===\":\")break;if(!sn(e.charCodeAt(r)))return!1;t=!0}return!t||i===\"_\"?!1:i!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(r))}function fn(e){let n=e,r=[];n.indexOf(\"_\")!==-1&&(n=n.replace(/_/g,\"\"));let t=1,i=n[0];if((i===\"-\"||i===\"+\")&&(i===\"-\"&&(t=-1),n=n.slice(1),i=n[0]),n===\"0\")return 0;if(i===\"0\")return n[1]===\"b\"?t*parseInt(n.slice(2),2):n[1]===\"x\"?t*parseInt(n,16):t*parseInt(n,8);if(n.indexOf(\":\")!==-1){n.split(\":\").forEach(f=>{r.unshift(parseInt(f,10))});let l=0,c=1;return r.forEach(f=>{l+=f*c,c*=60}),t*l}return t*parseInt(n,10)}function an(e){return Object.prototype.toString.call(e)===\"[object Number]\"&&e%1===0&&!g(e)}var M=new u(\"tag:yaml.org,2002:int\",{construct:fn,defaultStyle:\"decimal\",kind:\"scalar\",predicate:an,represent:{binary(e){return e>=0?`0b${e.toString(2)}`:`-0b${e.toString(2).slice(1)}`},octal(e){return e>=0?`0${e.toString(8)}`:`-0${e.toString(8).slice(1)}`},decimal(e){return e.toString(10)},hexadecimal(e){return e>=0?`0x${e.toString(16).toUpperCase()}`:`-0x${e.toString(16).toUpperCase().slice(1)}`}},resolve:pn,styleAliases:{binary:[2,\"bin\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"],octal:[8,\"oct\"]}});var F=new u(\"tag:yaml.org,2002:map\",{construct(e){return e!==null?e:{}},kind:\"mapping\"});function mn(e){return e===\"<<\"||e===null}var I=new u(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:mn});function dn(e){let n=e.length;return n===1&&e===\"~\"||n===4&&(e===\"null\"||e===\"Null\"||e===\"NULL\")}function hn(){return null}function gn(e){return e===null}var R=new u(\"tag:yaml.org,2002:null\",{construct:hn,defaultStyle:\"lowercase\",kind:\"scalar\",predicate:gn,represent:{canonical(){return\"~\"},lowercase(){return\"null\"},uppercase(){return\"NULL\"},camelcase(){return\"Null\"}},resolve:dn});var{hasOwn:yn}=Object,xn=Object.prototype.toString;function bn(e){let n=[],r=\"\",t=!1;for(let i of e){if(t=!1,xn.call(i)!==\"[object Object]\")return!1;for(r in i)if(yn(i,r))if(!t)t=!0;else return!1;if(!t)return!1;if(n.indexOf(r)===-1)n.push(r);else return!1}return!0}function An(e){return e!==null?e:[]}var N=new u(\"tag:yaml.org,2002:omap\",{construct:An,kind:\"sequence\",resolve:bn});var Sn=Object.prototype.toString;function wn(e){let n=Array.from({length:e.length});for(let r=0;r<e.length;r++){let t=e[r];if(Sn.call(t)!==\"[object Object]\")return!1;let i=Object.keys(t);if(i.length!==1)return!1;n[r]=[i[0],t[i[0]]]}return!0}function Tn(e){if(e===null)return[];let n=Array.from({length:e.length});for(let r=0;r<e.length;r+=1){let t=e[r],i=Object.keys(t);n[r]=[i[0],t[i[0]]]}return n}var $=new u(\"tag:yaml.org,2002:pairs\",{construct:Tn,kind:\"sequence\",resolve:wn});var D=/^\\/(?<regexp>[\\s\\S]+)\\/(?<modifiers>[gismuy]*)$/,j=new u(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve(e){if(e===null||!e.length)return!1;let n=`${e}`;if(n.charAt(0)===\"/\"){if(!D.test(e))return!1;let r=[...n.match(D)?.groups?.modifiers??\"\"];if(new Set(r).size<r.length)return!1}return!0},construct(e){let{regexp:n=`${e}`,modifiers:r=\"\"}=`${e}`.match(D)?.groups??{};return new RegExp(n,r)},predicate(e){return e instanceof RegExp},represent(e){return e.toString()}});var Y=new u(\"tag:yaml.org,2002:seq\",{construct(e){return e!==null?e:[]},kind:\"sequence\"});var{hasOwn:Pn}=Object;function Cn(e){if(e===null)return!0;for(let n in e)if(Pn(e,n)&&e[n]!==null)return!1;return!0}function On(e){return e!==null?e:{}}var U=new u(\"tag:yaml.org,2002:set\",{construct:On,kind:\"mapping\",resolve:Cn});var B=new u(\"tag:yaml.org,2002:str\",{construct(e){return e!==null?e:\"\"},kind:\"scalar\"});var re=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),ie=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function kn(e){return e===null?!1:re.exec(e)!==null||ie.exec(e)!==null}function En(e){let n=re.exec(e);if(n===null&&(n=ie.exec(e)),n===null)throw new Error(\"Date resolve error\");let r=+n[1],t=+n[2]-1,i=+n[3];if(!n[4])return new Date(Date.UTC(r,t,i));let l=+n[4],c=+n[5],f=+n[6],W=0;if(n[7]){let d=n[7].slice(0,3);for(;d.length<3;)d+=\"0\";W=+d}let m=null;if(n[9]){let d=+n[10],ue=+(n[11]||0);m=(d*60+ue)*6e4,n[9]===\"-\"&&(m=-m)}let S=new Date(Date.UTC(r,t,i,l,c,f,W));return m&&S.setTime(S.getTime()-m),S}function vn(e){return e.toISOString()}var H=new u(\"tag:yaml.org,2002:timestamp\",{construct:En,instanceOf:Date,kind:\"scalar\",represent:vn,resolve:kn});var K=new u(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve(){return!0},construct(){},predicate(e){return typeof e>\"u\"},represent(){return\"\"}});var G=new p({explicit:[B,Y,F]});var V=new p({implicit:[R,_,M,L],include:[G]});var q=new p({include:[V]});var A=new p({explicit:[v,N,$,U],implicit:[H,I],include:[q]});var _n=new p({explicit:[j,K],include:[A]});var{hasOwn:Vi}=Object;function te(e){return e===48?\"\\0\":e===97?\"\\x07\":e===98?\"\\b\":e===116||e===9?\"\t\":e===110?`\n`:e===118?\"\\v\":e===102?\"\\f\":e===114?\"\\r\":e===101?\"\\x1B\":e===32?\" \":e===34?'\"':e===47?\"/\":e===92?\"\\\\\":e===78?\"\\x85\":e===95?\"\\xA0\":e===76?\"\\u2028\":e===80?\"\\u2029\":\"\"}var Mn=Array.from({length:256}),Fn=Array.from({length:256});for(let e=0;e<256;e++)Mn[e]=te(e)?1:0,Fn[e]=te(e);var{hasOwn:et}=Object;var{hasOwn:lt}=Object;var s={};s[0]=\"\\\\0\";s[7]=\"\\\\a\";s[8]=\"\\\\b\";s[9]=\"\\\\t\";s[10]=\"\\\\n\";s[11]=\"\\\\v\";s[12]=\"\\\\f\";s[13]=\"\\\\r\";s[27]=\"\\\\e\";s[34]='\\\\\"';s[92]=\"\\\\\\\\\";s[133]=\"\\\\N\";s[160]=\"\\\\_\";s[8232]=\"\\\\L\";s[8233]=\"\\\\P\";async function le(e){if(e.length===0){console.log(\"no page name supplied, ignoring navigation\");return}let[n,r]=e.split(\"@\");console.log(`navigating to ${e}`),await h.navigate(n,+r)}var Rn=le;return ae(Nn);})();\n return mod;})()"
}
}
}