{"platform":"GEN.ART","image":"ipfs://bafybeiheu3gx6dcfqp7phcfzzu46wnseey5nb4va2hfzzezbeb2ydti4hi","name":"≈ 3000 #11","ipfs":"ipfs://QmSM6LhTjXr4Rm8aXMPRgfgbme4aCTjh3tcX96HZi2niEB","artist":"0x508574b9bfafc3fcaf30571dc84b23c441562483","description":"A celebration of the soul, emphasizing its human-exclusive conflicting relationship between reasoning and emotion.","external_url":"https://gen.art/gallery/30002/3000200011","animation_url":"data:text/html;base64,PGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy90aHJlZS5qcy9yMTI4L3RocmVlLm1pbi5qcyIKICAgIGludGVncml0eT0ic2hhNTEyLWRMeFVlbEFwbll4cEx0NksyaW9tR25nbkhPODNpVXZaeXRBM1lqRFVDalQwSERPSEtYblZZZGYzaFU0SmpNOHVFaHhmOW5EMS9leTk4VTN0MnZaMHFRPT0iCiAgICBjcm9zc29yaWdpbj0iYW5vbnltb3VzIiByZWZlcnJlcnBvbGljeT0ibm8tcmVmZXJyZXIiPjwvc2NyaXB0PgogIDxzY3JpcHQ+PC9zY3JpcHQ+CjwvaGVhZD4KCjxib2R5PgogIDxzdHlsZT4KICAgIGh0bWwsCiAgICBib2R5IHsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBwYWRkaW5nOiAwOwogICAgICBtYXJnaW46IDA7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIGJhY2tncm91bmQ6ICMwNjA2MDY7CiAgICB9CiAgPC9zdHlsZT4KICA8c2NyaXB0PndpbmRvdy5NRVRBREFUQSA9IHt9OwoKICAgIGZ1bmN0aW9uIG9uTWV0YWRhdGEoKSB7CiAgICAgIHdpbmRvdy50b3A/LnBvc3RNZXNzYWdlKAogICAgICAgIGBnZW5hcnQ6bWV0YWRhdGE6JHtKU09OLnN0cmluZ2lmeSh3aW5kb3cuTUVUQURBVEEpfWAsCiAgICAgICAgIioiCiAgICAgICk7CiAgICB9CiAgICBmdW5jdGlvbiBvbkRvbmUoKSB7CiAgICAgIHdpbmRvdy50b3A/LnBvc3RNZXNzYWdlKGBnZW5hcnQ6ZG9uZWAsICIqIik7CiAgICAgIHdpbmRvdy5vbkltYWdlUmVuZGVyZWQgJiYgd2luZG93Lm9uSW1hZ2VSZW5kZXJlZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhbmRvbV9oYXNoKCkgewogICAgICBsZXQgY2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CiAgICAgIGxldCByZXN1bHQgPSAiMHgiOwogICAgICBmb3IgKGxldCBpID0gNjQ7IGkgPiAwOyAtLWkpCiAgICAgICAgcmVzdWx0ICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCldOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGNsYXNzIFJhbmRvbSB7CiAgICAgIHNlZWQ7CiAgICAgIGRlY2ltYWxzOwogICAgICBjb25zdHJ1Y3RvcihoYXNoLCBkZWNpbWFscyA9IDMpIHsKICAgICAgICB0aGlzLnNlZWQgPSBwYXJzZUludChoYXNoLnNsaWNlKDAsIDE2KSwgMTYpOwogICAgICAgIHRoaXMuZGVjaW1hbHMgPSBkZWNpbWFsczsKICAgICAgfQogICAgICByYW5kb21fZGVjKCkgewogICAgICAgIHRoaXMuc2VlZCBePSB0aGlzLnNlZWQgPDwgMTM7CiAgICAgICAgdGhpcy5zZWVkIF49IHRoaXMuc2VlZCA+PiAxNzsKICAgICAgICB0aGlzLnNlZWQgXj0gdGhpcy5zZWVkIDw8IDU7CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICgodGhpcy5zZWVkIDwgMCA/IH50aGlzLnNlZWQgKyAxIDogdGhpcy5zZWVkKSAlIDEwICoqIHRoaXMuZGVjaW1hbHMpIC8KICAgICAgICAgIDEwICoqIHRoaXMuZGVjaW1hbHMKICAgICAgICApOwogICAgICB9CiAgICAgIHJhbmRvbV9iZXR3ZWVuKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSArIChiIC0gYSkgKiB0aGlzLnJhbmRvbV9kZWMoKTsKICAgICAgfQogICAgICByYW5kb21faW50KGEsIGIpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnJhbmRvbV9iZXR3ZWVuKGEsIGIgKyAxKSk7CiAgICAgIH0KICAgICAgcmFuZG9tX2Nob2ljZSh4KSB7CiAgICAgICAgcmV0dXJuIHhbTWF0aC5mbG9vcih0aGlzLnJhbmRvbV9iZXR3ZWVuKDAsIHgubGVuZ3RoICogMC45OSkpXTsKICAgICAgfQogICAgfQogIDwvc2NyaXB0PgogIDxzY3JpcHQgaWQ9ImdlbmFydC1vcHRpb25zIj5jb25zdCBvcHRpb25zID0gewogICJoYXNoIjogIjB4NmE0MTBmNDg4NWMxMjk1OTJjMTQ2NWQ2M2QxN2ZiMDk4NzkxYTRiZDQxYTgyMzllYjVmMzlkYTUyZWY5YTAzMiIsCiAgInRva2VuSWQiOiAiMzAwMDIwMDAxMSIsCiAgInBpeGVsRGVuc2l0eSI6IDIsCiAgImlzUmVuZGVyZXIiOiBmYWxzZQp9PC9zY3JpcHQ+CiAgPHNjcmlwdD5sZXQgdG9rZW5IYXNoID0gb3B0aW9ucy5oYXNoCgogICAgbGV0IHNuMyA9ICd2ZWM0IHoodmVjNCB4KXtyZXR1cm4geC1mbG9vcih4KigxLi8yODkuKSkqMjg5Ljt9dmVjNCBaKHZlYzQgeCl7cmV0dXJuIHooKCh4KjM0LikrMS4pKngpO31mbG9hdCBzbjModmVjMyB2KXt2ZWMyIEM9dmVjMigxLi82LiwxLi8zLik7dmVjNCBEPXZlYzQoMC4sLjUsMS4sMi4pO2Zsb2F0IGE9LjE0Mjg1NzE0Mjg1Nzt2ZWMzIGk9Zmxvb3Ioditkb3QodixDLnl5eSkpLGI9di1pK2RvdChpLEMueHh4KSxnPXN0ZXAoYi55engsYi54eXopLGw9MS4tZyxmPW1pbihnLnh5eixsLnp4eSksVz1tYXgoZy54eXosbC56eHkpLGM9Yi1mK0MueHh4LEE9Yi1XK0MueXl5LHQ9Yi1ELnl5eTtpLT1mbG9vcihpKigxLi8yODkuKSkqMjg5Ljt2ZWMzIGU9YSpELnd5ei1ELnh6eDt2ZWM0IHA9WihaKFooaS56K3ZlYzQoMC4sZi56LFcueiwxLikpK2kueSt2ZWM0KDAuLGYueSxXLnksMS4pKStpLngrdmVjNCgwLixmLngsVy54LDEuKSksaj1wLTQ5LipmbG9vcihwKmUueiplLnopLFg9Zmxvb3IoaiplLnopLEI9Zmxvb3Ioai03LipYKSx4PVgqZS54K2UueXl5eSx5PUIqZS54K2UueXl5eSxoPTEuLWFicyh4KS1hYnMoeSkscj12ZWM0KHgueHkseS54eSksZD12ZWM0KHguencseS56dyksbz1mbG9vcihyKSoyLisxLixzMT1mbG9vcihkKSoyLisxLixzaD0tc3RlcChoLHZlYzQoMC4pKSxxPXIueHp5dytvLnh6eXcqc2gueHh5eSxrPWQueHp5dytzMS54enl3KnNoLnp6d3c7dmVjMyB3PXZlYzMocS54eSxoLngpLHAxPXZlYzMocS56dyxoLnkpLHU9dmVjMyhrLnh5LGgueikscz12ZWMzKGsuencsaC53KTt2ZWM0IG49MS43OTI4NDI5MTQwMDE1OS0uODUzNzM0NzIwOTUzMTQqKHZlYzQoZG90KHcsdyksZG90KHAxLHAxKSxkb3QodSx1KSxkb3QocyxzKSkpO3cqPW4ueDtwMSo9bi55O3UqPW4uejtzKj1uLnc7dmVjNCBtPW1heCguNi12ZWM0KGRvdChiLGIpLGRvdChjLGMpLGRvdChBLEEpLGRvdCh0LHQpKSwwLik7bT1tKm07cmV0dXJuIDQyLipkb3QobSptLHZlYzQoZG90KHcsYiksZG90KHAxLGMpLGRvdCh1LEEpLGRvdChzLHQpKSk7fSc7CiAgICBsZXQgcmQgPSBgZmxvYXQgcmFuZG9tICh2ZWMyIHN0KXtyZXR1cm4gZnJhY3Qoc2luKGRvdChzdC54eSwgdmVjMigxMi45ODk4LDc4LjIzMykpKSo0Mzc1OC41NDUzMTIzKTt9YAogICAgbGV0IGNvcnIgPSBgdmVjMyBnQ29yKHZlYzMgYyxmbG9hdCBnKXtyZXR1cm4gcG93KGMsdmVjMygxLi9nKSk7fXZlYzMgbGV2KHZlYzMgYyxmbG9hdCBtbixmbG9hdCBteCl7cmV0dXJuIG1pbihtYXgoYy12ZWMzKG1uKSx2ZWMzKDAuKSkvKHZlYzMobXgpLXZlYzMobW4pKSx2ZWMzKDEuKSk7fXZlYzMgbGV2cyh2ZWMzIGMsZmxvYXQgbW4sZmxvYXQgZyxmbG9hdCBteCl7cmV0dXJuIGdDb3IobGV2KGMsbW4sbXgpLGcpO31gCiAgICBsZXQgU1MgPSB7fTsKICAgIFNTLmFmdGVyZnMgPSAndW5pZm9ybSBmbG9hdCBkO3VuaWZvcm0gc2FtcGxlcjJEIG87dW5pZm9ybSBzYW1wbGVyMkQgbjt2YXJ5aW5nIHZlYzIgdlV2O3ZvaWQgbWFpbigpe3ZlYzQgdG89dGV4dHVyZTJEKG8sdlV2KTt0byo9ZCptYXgoc2lnbih0by0uMSksMC4pO2dsX0ZyYWdDb2xvcj1tYXgodGV4dHVyZTJEKG4sdlV2KSx0byk7fSc7CiAgICBTUy5wdGZzID0gJ3VuaWZvcm0gc2FtcGxlcjJEIHBhc3NUaHJ1VGV4dHVyZTt2b2lkIG1haW4oKXt2ZWMyIHV2PWdsX0ZyYWdDb29yZC54eS9yZXNvbHV0aW9uLnh5O2dsX0ZyYWdDb2xvcj10ZXh0dXJlMkQocGFzc1RocnVUZXh0dXJlLHV2KTt9JzsKICAgIFNTLnB0dnMgPSAndm9pZCBtYWluKCl7Z2xfUG9zaXRpb249dmVjNChwb3NpdGlvbiwxLik7fSc7CiAgICBTUy5wdGIgPSAndmFyeWluZyB2ZWMyIHZVdjt2b2lkIG1haW4oKXt2VXY9dXY7Z2xfUG9zaXRpb249cHJvamVjdGlvbk1hdHJpeCptb2RlbFZpZXdNYXRyaXgqdmVjNChwb3NpdGlvbiwxLik7fSc7CiAgICBTUy5hZnRlcmZzID0gYHVuaWZvcm0gZmxvYXQgZDt1bmlmb3JtIGZsb2F0IG07dW5pZm9ybSBmbG9hdCB0aW1lO3VuaWZvcm0gc2FtcGxlcjJEIG87dW5pZm9ybSBzYW1wbGVyMkQgbjt1bmlmb3JtIHNhbXBsZXIyRCBtYXNrO3VuaWZvcm0gdmVjMiByZXM7dmFyeWluZyB2ZWMyIHZVdjt2b2lkIG1haW4oKXt2ZWM0IG1tPXRleHR1cmUyRChtYXNrLHZVdik7dmVjNCB0bz10ZXh0dXJlMkQobyx2VXYpO2Zsb2F0IGRhbXA9ZDt2ZWM0IG5ldz10ZXh0dXJlMkQobix2VXYpO2Zsb2F0IGZpeGRhbXA9MS47aWYodG8ucj4wLil0by5yKj1maXhkYW1wKm1heChzaWduKHRvLnItLjA5NSksMC4pO2Zsb2F0IHJtPW1heChuZXcucix0by5yKTtpZih0by5nPjAuKXRvLmcqPS45NyptYXgoc2lnbih0by5nLS4xKSwwLik7ZmxvYXQgZ209bWF4KG5ldy5nLHRvLmcpO2lmKHRvLmI+MC4pdG8uYio9Ljk3Km1heChzaWduKHRvLmItLjEpLDAuKTtmbG9hdCBibT1tYXgobmV3LmIsdG8uYik7Z2xfRnJhZ0NvbG9yPXZlYzQocm0sZ20sYm0sbW9kKHRpbWUqLjAwMSwxLikpO31gOwogICAgU1MucGFydGljbGVWZXJ0ID0gYGF0dHJpYnV0ZSB2ZWM0IHBhcnRpY2xlRGF0YTt1bmlmb3JtIHNhbXBsZXIyRCBwb3NpdGlvbkRhdGE7dW5pZm9ybSB2ZWM0IHNkO3ZhcnlpbmcgdmVjNCB2RGF0YTt1bmlmb3JtIGJvb2wgaXNtO3VuaWZvcm0gZmxvYXQgZHByO3VuaWZvcm0gYm9vbCBkb2Y7dm9pZCBtYWluKCl7dmVjNCBwb3M9dGV4dHVyZTJEKHBvc2l0aW9uRGF0YSxwYXJ0aWNsZURhdGEueHkpO3ZEYXRhPXBhcnRpY2xlRGF0YTt2ZWM0IG12UG9zaXRpb249bW9kZWxWaWV3TWF0cml4KnZlYzQodmVjMyhwb3MueHksMC4pLDEuKTtnbF9Qb2ludFNpemU9Mi47aWYoZHByPjEuKWdsX1BvaW50U2l6ZT00LjtnbF9Qb3NpdGlvbj1wcm9qZWN0aW9uTWF0cml4Km12UG9zaXRpb247fWA7CiAgICBTUy5wYXJ0aWNsZVBvcyA9IGB1bmlmb3JtIGZsb2F0IHRpbWU7dW5pZm9ybSBzYW1wbGVyMkQgZGF0YTt1bmlmb3JtIHZlYzQgc2VlZDt1bmlmb3JtIHZlYzQgc2VlZDI7dW5pZm9ybSB2ZWMyIHJlczt1bmlmb3JtIHNhbXBsZXIyRCBkaXN0YW5jZVRleDt1bmlmb3JtIGZsb2F0IHRyYW5zaXRpb25pbmc7Y29uc3QgZmxvYXQgRVBTPS4wMDAxO1xuI2RlZmluZSBQSSAzLjE0MTU5MjZcbiR7c24zfW1hdDQgcm0odmVjMyBhLGZsb2F0IHQpe2E9bm9ybWFsaXplKGEpO2Zsb2F0IHM9c2luKHQpLGM9Y29zKHQpLG89MS4tYztyZXR1cm4gbWF0NChvKmEueCphLngrYyxvKmEueCphLnktYS56KnMsbyphLnoqYS54K2EueSpzLDAuLG8qYS54KmEueSthLnoqcyxvKmEueSphLnkrYyxvKmEueSphLnotYS54KnMsMC4sbyphLnoqYS54LWEueSpzLG8qYS55KmEueithLngqcyxvKmEueiphLnorYywwLiwwLiwwLiwwLiwxLik7fXZlYzMgcnQodmVjMyB2LHZlYzMgYSxmbG9hdCB0KXtyZXR1cm4ocm0oYSx0KSp2ZWM0KHYsMS4pKS54eXo7fXZlYzMgc3YodmVjMyB4KXtmbG9hdCBzPXNuMyh2ZWMzKHgpKSxzMT1zbjModmVjMyh4LnktMTkuMSx4LnorMzMuNCx4LngrNDcuMikpLHMyPXNuMyh2ZWMzKHgueis3NC4yLHgueC0xMjQuNSx4LnkrOTkuNCkpO3ZlYzMgYz12ZWMzKHMsczEsczIpO3JldHVybiBjO312ZWMzIGNOb2lzZSh2ZWMzIHApe2NvbnN0IGZsb2F0IGU9LjE7dmVjMyBkeD12ZWMzKGUsMC4sMC4pO3ZlYzMgZHk9dmVjMygwLixlLDAuKTt2ZWMzIGR6PXZlYzMoMC4sMC4sZSk7dmVjMyBwX3gwPXN2KHAtZHgpO3ZlYzMgcF94MT1zdihwK2R4KTt2ZWMzIHBfeTA9c3YocC1keSk7dmVjMyBwX3kxPXN2KHArZHkpO3ZlYzMgcF96MD1zdihwLWR6KTt2ZWMzIHBfejE9c3YocCtkeik7ZmxvYXQgeD1wX3kxLnotcF95MC56LXBfejEueStwX3owLnkseT1wX3oxLngtcF96MC54LXBfeDEueitwX3gwLnosej1wX3gxLnktcF94MC55LXBfeTEueCtwX3kwLng7Y29uc3QgZmxvYXQgZGk9MS4vKDIuKmUpO3JldHVybiBub3JtYWxpemUodmVjMyh4LHkseikqZGkpO312b2lkIG1haW4oKXt2ZWMyIHV2PWdsX0ZyYWdDb29yZC54eS9yZXNvbHV0aW9uLnh5O3ZlYzQgcG9zPXRleHR1cmUyRCh0ZXh0dXJlUG9zaXRpb24sdXYpO3ZlYzQgZGF0PXRleHR1cmUyRChkYXRhLHV2KTt2ZWM0IGRzdG5jPXRleHR1cmUyRChkaXN0YW5jZVRleCwocG9zLnh5K3ZlYzIoMS4pKSouNSk7ZmxvYXQgdm11bHQ9LjAwMDc7dmVjMyB2ZWxvY2l0eT1jTm9pc2UodmVjMyhwb3MueHksMC4pKjEuNCtkYXQueikqdm11bHQqZGF0Lno7dmVsb2NpdHkueHkqPXZlYzIoMS4scmVzLngvcmVzLnkpO2lmKGRhdC54PC41JiZkYXQueTwuNSl7cG9zLnh5Kz12ZWxvY2l0eS54eTtwb3Mudys9KGRzdG5jLnctcG9zLncpKi41O2Zsb2F0IG5tPShzbjModmVjMyhwb3MueHkqcmVzLngsdGltZSkpKzEuKSouNTtpZihkYXQudz4uOSYmbGVuZ3RoKGRzdG5jKT09LjApcG9zLnc9KC4wMDEpKm5tO31pZihkYXQueD4uNSYmZGF0Lnk8LjUpe3ZlbG9jaXR5PWNOb2lzZSh2ZWMzKHBvcy54eStzZWVkLngqMTAwLiwwLikqMS4rZGF0LnoqMTAwLikqdm11bHQqZGF0Lno7ZmxvYXQgbnc9KHNuMyh2ZWMzKDAuLDAuLHRpbWUqLjUpKSsxLikqLjU7dmVsb2NpdHkueD0tYWJzKHZlbG9jaXR5LngpO3ZlbG9jaXR5Lnk9LWFicyh2ZWxvY2l0eS55KSouNTt2ZWxvY2l0eT1ydCh2ZWxvY2l0eSx2ZWMzKDAuLDAuLDEuKSwtbncqUEkqLjUpO3Bvcy54eSs9dmVsb2NpdHkueHk7cG9zLncrPShkc3RuYy53LXBvcy53KSouMDAxNTtwb3Muei09LjAwMDErLjAwMDEqZGF0Lnc7aWYocG9zLno8PTAuKXtwb3Mudz0wLjtwb3Muej0xLjtwb3MueD1zbjModmVjMyhkYXQueHkqMTAwMC4sdGltZSoxMDAuKSkqMi4zO3Bvcy55PXNuMyh2ZWMzKGRhdC55eCoxMDAuLHRpbWUqMTAwLikpKjIuMzt9fWlmKGRhdC55Pi41KXtwb3Mudys9KGRzdG5jLnctcG9zLncpKi4yNTtpZihsZW5ndGgoZHN0bmMpPT0wLil7cG9zLng9c24zKHZlYzMoZGF0Lnh5KjEwMDAuLHRpbWUqMTAwLikpKjIuMztwb3MueT1zbjModmVjMyhkYXQueXgqMTAwLix0aW1lKjEwMC4pKSoyLjM7fX1nbF9GcmFnQ29sb3I9cG9zO31gCiAgICBTUy5kaXN0RnJhZyA9IGB1bmlmb3JtIHNhbXBsZXIyRCBkYXRhO3VuaWZvcm0gYm9vbCBpc207Y29uc3QgZmxvYXQgRVBTPS4wMDAxO1xuI2RlZmluZSBQSSAzLjE0MTU5MjZcbiNkZWZpbmUgUkFEKHIpKChyKSoocikqMC43KVxuI2RlZmluZSBTUEgoaSxmLGMpbGVuZ3RoKGYtYyktUkFEKGhhc2goaStjKSlcbiR7c24zfW1hdDQgcm0odmVjMyBhLGZsb2F0IHQpe2E9bm9ybWFsaXplKGEpO2Zsb2F0IHM9c2luKHQpLGM9Y29zKHQpLG89MS4tYztyZXR1cm4gbWF0NChvKmEueCphLngrYyxvKmEueCphLnktYS56KnMsbyphLnoqYS54K2EueSpzLDAuLG8qYS54KmEueSthLnoqcyxvKmEueSphLnkrYyxvKmEueSphLnotYS54KnMsMC4sbyphLnoqYS54LWEueSpzLG8qYS55KmEueithLngqcyxvKmEueiphLnorYywwLiwwLiwwLiwwLiwxLik7fXZlYzMgcnQodmVjMyB2LHZlYzMgYSxmbG9hdCB0KXtyZXR1cm4ocm0oYSx0KSp2ZWM0KHYsMS4pKS54eXo7fWZsb2F0IHZtYXgodmVjMyB2KXtyZXR1cm4gbWF4KG1heCh2Lngsdi55KSx2LnopO31mbG9hdCBmU3BoZXJlKHZlYzMgcCxmbG9hdCByKXtyZXR1cm4gbGVuZ3RoKHApLXI7fWZsb2F0IGZCb3godmVjMyBwLHZlYzMgYil7dmVjMyBkPWFicyhwKS1iO3JldHVybiBsZW5ndGgobWF4KGQsdmVjMygwLikpKSt2bWF4KG1pbihkLHZlYzMoMC4pKSk7fWZsb2F0IGZscyh2ZWMzIHAsdmVjMyBhLHZlYzMgYil7dmVjMyBhYj1iLWE7ZmxvYXQgdD1jbGFtcChkb3QocC1hLGFiKS9kb3QoYWIsYWIpLDAuLDEuKTtyZXR1cm4gbGVuZ3RoKChhYip0K2EpLXApO31mbG9hdCBjcHNsKHZlYzMgcCx2ZWMzIGEsdmVjMyBiLGZsb2F0IHIpe3JldHVybiBmbHMocCxhLGIpLXI7fWZsb2F0IHRycyh2ZWMzIHAsZmxvYXQgc3IsZmxvYXQgbHIpe3JldHVybiBsZW5ndGgodmVjMihsZW5ndGgocC54eiktbHIscC55KSktc3I7fWZsb2F0IHBNb2QxKGZsb2F0IHAsZmxvYXQgc3ope2Zsb2F0IGhzPXN6Ki41O2Zsb2F0IGM9Zmxvb3IoKHAraHMpL3N6KTtwPW1vZChwK2hzLHN6KS1ocztyZXR1cm4gcDt9ZmxvYXQgZGlmQ29sKGZsb2F0IGEsZmxvYXQgYixmbG9hdCByLGZsb2F0IG4pe2E9LWE7ZmxvYXQgbT1taW4oYSxiKTtpZihhPHImJmI8cil7dmVjMiBwPXZlYzIoYSxiKTtmbG9hdCBjcj1yKnNxcnQoMi4pL24vMi47Y3I9cipzcXJ0KDIuKS8oKG4tMS4pKjIuK3NxcnQoMi4pKTtwPShwK3ZlYzIocC55LC1wLngpKSpzcXJ0KC41KTtwLnkrPWNyO3AueC09c3FydCgyLikvMi4qcjtwLngrPS1jcipzcXJ0KDIuKS8yLjtpZihtb2QobiwyLik9PTEuKXtwLnkrPWNyO307cC55PXBNb2QxKHAueSxjcioyLjApO2Zsb2F0IHI9LWxlbmd0aChwKStjcjtyPW1heChyLHAueCk7cj1taW4ocixhKTtyZXR1cm4gLW1pbihyLGIpO31lbHNle3JldHVybiAtbTt9fWZsb2F0IHVuaVN0cihmbG9hdCBhLGZsb2F0IGIsZmxvYXQgcixmbG9hdCBuKXtmbG9hdCBzPXIvbix1PWItcjtyZXR1cm4gbWluKG1pbihhLGIpLC41Kih1K2ErYWJzKChtb2QodS1hK3MsMi4qcykpLXMpKSk7fWZsb2F0IG9Hcih2ZWM0IHApe3JldHVybiBtYXgocC54LG1pbihwLngrcC56LHAudy1hYnMocC55KSkpO31mbG9hdCBvVG8odmVjNCBwKXtyZXR1cm4gbWluKHAueCxtYXgocC54LXAueixhYnMocC55KS1wLncpKTt9ZmxvYXQgY2N5KHZlYzMgcCx2ZWMyIGgpe3ZlYzIgZD1hYnModmVjMihsZW5ndGgocC54eikscC55KSktaDtyZXR1cm4gbWluKG1heChkLngsZC55KSwwLjApK2xlbmd0aChtYXgoZCwwLjApKTt9dmVjNCBlbG8odmVjMyBwLHZlYzMgaCl7dmVjMyBxPWFicyhwKS1oO3JldHVybiB2ZWM0KG1heChxLDAuKSxtaW4obWF4KHEueCxtYXgocS55LHEueikpLDAuKSk7fWZsb2F0IGZPcFVuaW9uQ2hhbWZlcihmbG9hdCBhLGZsb2F0IGIsZmxvYXQgcil7cmV0dXJuIG1pbihtaW4oYSxiKSwoYS1yK2IpKnNxcnQoLjUpKTt9ZmxvYXQgb3BVbmlvbihmbG9hdCBkMSxmbG9hdCBkMil7cmV0dXJuIG1pbihkMSxkMik7fWZsb2F0IG9wU3VidHJhY3Rpb24oZmxvYXQgZDEsZmxvYXQgZDIpe3JldHVybiBtYXgoLWQxLGQyKTt9ZmxvYXQgb3BJbnRlcnNlY3Rpb24oZmxvYXQgZDEsZmxvYXQgZDIpe3JldHVybiBtYXgoZDEsZDIpO31mbG9hdCBwTW9kUG9sYXIoaW5vdXQgdmVjMiBwLGZsb2F0IHJlcGV0aXRpb25zKXtmbG9hdCBhbmdsZT0yLjAqUEkvcmVwZXRpdGlvbnM7ZmxvYXQgYT1hdGFuKHAueSxwLngpK2FuZ2xlLzIuO2Zsb2F0IHI9bGVuZ3RoKHApO2Zsb2F0IGM9Zmxvb3IoYS9hbmdsZSk7YT1tb2QoYSxhbmdsZSktYW5nbGUvMi47cD12ZWMyKGNvcyhhKSxzaW4oYSkpKnI7aWYoYWJzKGMpPj0ocmVwZXRpdGlvbnMvMi4pKWM9YWJzKGMpO3JldHVybiBjO31mbG9hdCBmQm94Q2hlYXAodmVjMyBwLHZlYzMgYil7cmV0dXJuIHZtYXgoYWJzKHApLWIpO31mbG9hdCBmT3BVbmlvblN0YWlycyhmbG9hdCBhLGZsb2F0IGIsZmxvYXQgcixmbG9hdCBuKXtmbG9hdCBzPXIvbjtmbG9hdCB1PWItcjtyZXR1cm4gbWluKG1pbihhLGIpLC41Kih1K2ErYWJzKChtb2QodS1hK3MsMi4qcykpLXMpKSk7fWZsb2F0IGZPcERpZmZlcmVuY2VTdGFpcnMoZmxvYXQgYSxmbG9hdCBiLGZsb2F0IHIsZmxvYXQgbil7cmV0dXJuIC1mT3BVbmlvblN0YWlycygtYSxiLHIsbik7fWZsb2F0IGhhc2godmVjMyBwKXtwPTE3LipmcmFjdChwKi4zMTgzMDk5K3ZlYzMoLjExLC4xNywuMTMpKTtyZXR1cm4gZnJhY3QocC54KnAueSpwLnoqKHAueCtwLnkrcC56KSk7fWZsb2F0IHNtYXgoZmxvYXQgYSxmbG9hdCBiLGZsb2F0IGspe2Zsb2F0IGg9bWF4KGstYWJzKGEtYiksMC4pO3JldHVybiBtYXgoYSxiKStoKmgqLjI1L2s7fWZsb2F0IHNkQmFzZSh2ZWMzIHApe3ZlYzMgaT1mbG9vcihwKTt2ZWMzIGY9ZnJhY3QocCk7cmV0dXJuIG1pbihtaW4obWluKFNQSChpLGYsdmVjMygwLDAsMCkpLFNQSChpLGYsdmVjMygwLDAsMSkpKSxtaW4oU1BIKGksZix2ZWMzKDAsMSwwKSksU1BIKGksZix2ZWMzKDAsMSwxKSkpKSxtaW4obWluKFNQSChpLGYsdmVjMygxLDAsMCkpLFNQSChpLGYsdmVjMygxLDAsMSkpKSxtaW4oU1BIKGksZix2ZWMzKDEsMSwwKSksU1BIKGksZix2ZWMzKDEsMSwxKSkpKSk7fXZlYzIgc2RGYm0odmVjMyBwLGZsb2F0IGQpe2NvbnN0IG1hdDMgbT1tYXQzKC4wLC44LC42LC0uOCwuMzYsLS40OCwtLjYsLS40OCwuNjQpO2Zsb2F0IHQ9MC47ZmxvYXQgcz0xLjtmb3IoaW50IGk9MDtpPDc7aSsrKXtmbG9hdCBuPXMqc2RCYXNlKHApO2Q9c21heChkLC1uLC4yKnMpO3QrPWQ7cD0yLiptKnA7cz0uNSpzO31yZXR1cm4gdmVjMihkLHQpO31mbG9hdCBhcmthcmlhKHZlYzMgcCwgdmVjNCBzMil7dmVjMyBwMj1ydChwLHZlYzMoMC4sMC4sMC4pLDAuKTtmbG9hdCBjPTFlMTA7Zm9yKGludCBpPTA7aTwzMjtpKyspe3ZlYzQgc3QwPXRleHR1cmUyRChkdGV4LHZlYzIoLjI1LGZsb2F0KGkpLzY0LikpO3ZlYzQgc3QxPXRleHR1cmUyRChkdGV4LHZlYzIoLjc1LGZsb2F0KGkpLzY0LikpO2lmKHN0MS53Pi41KWM9bWluKGMsZlNwaGVyZShwLShzdDAueHl6LXZlYzMoLjUpKSp2ZWMzKDEuMikrdmVjMygwLiwwLiwwLiksc3QxLngqLjIrLjQqc3QwLncpKTtlbHNlIGM9bWF4KGMsLWZTcGhlcmUocC0oc3QwLnh5ei12ZWMzKC41KSkqdmVjMygxLjIpK3ZlYzMoMC4sMC4sMC4pLHN0MS54Ki4yKy40KnN0MC53KSk7fWZsb2F0IHMzPXNkRmJtKChwKiguNS1wLnoqLjEpKStzMi54eXoqMTAwLixjKS54O3JldHVybiBzMzt9ZmxvYXQgY29sczQodmVjMyBwLHZlYzQgczIpe3ZlYzMgcDI9cnQocCx2ZWMzKDAuLDEuLDAuKSxQSSouNSk7ZmxvYXQgYz0xZTEwO2ZvcihpbnQgaT0wO2k8MzI7aSsrKXt2ZWM0IHN0MD10ZXh0dXJlMkQoZHRleCx2ZWMyKDAuLGZsb2F0KGkpLzY0LikpO3ZlYzMgc3QxPXRleHR1cmUyRChkdGV4LHZlYzIoLjUsZmxvYXQoaSkvNjQuKSkueHl6O2lmKHN0MC53Pi41KWM9Zk9wVW5pb25DaGFtZmVyKGMsY2N5KHAtKHN0MC54eXotdmVjMyguNSkpKnZlYzMoMS4pLHN0MS54eSp2ZWMyKC4yLC40KSksIC4wMSk7ZWxzZSBjPWZPcERpZmZlcmVuY2VTdGFpcnMoYyxjY3kocC0oc3QwLnh5ei12ZWMzKC41KSkqdmVjMygxLiksc3QxLnh5KnZlYzIoLjIsLjQpKSwuMDEsMS4pO31jPWZPcERpZmZlcmVuY2VTdGFpcnMoYyxmQm94KHArdmVjMygwLiwoczIudy0uNSkqMi4sMC4pLHZlYzMoMy4sLjEsMy4pKSwuMDUsMTAuKTtjPWZPcERpZmZlcmVuY2VTdGFpcnMoYyxmQm94KHArdmVjMygoczIuei0uNSkqMi4sMC4sMC4pLHZlYzMoLjEsMy4sMy4pKSwuMDUsMTAuKTtyZXR1cm4gYzt9ZmxvYXQgY29sczModmVjMyBwLHZlYzQgczIpe3ZlYzMgcDI9cnQocCx2ZWMzKDAuLDEuLDAuKSxQSSouNSk7ZmxvYXQgYz0xZTEwO2ZvcihpbnQgaT0wO2k8MzI7aSsrKXt2ZWM0IHN0MD10ZXh0dXJlMkQoZHRleCx2ZWMyKDAuLGZsb2F0KGkpLzY0LikpO3ZlYzMgc3QxPXRleHR1cmUyRChkdGV4LHZlYzIoLjUsZmxvYXQoaSkvNjQuKSkueHl6O2lmKHN0MC53Pi41KWM9bWluKGMsZkJveChwLShzdDAueHl6LXZlYzMoLjUpKSp2ZWMzKC45KSwoc3QxKSouNCkpO2Vsc2UgZk9wRGlmZmVyZW5jZVN0YWlycyhjLGZCb3gocC0oc3QwLnh5ei12ZWMzKC41KSkqdmVjMyguOSksKHN0MSkqLjQpLC4xLDEuKTt9Yz1mT3BEaWZmZXJlbmNlU3RhaXJzKGMsZkJveChwK3ZlYzMoMC4sKHMyLnctLjUpKjIuLDAuKSx2ZWMzKDMuLC4xLDMuKSksLjA1LDEwLik7Yz1mT3BEaWZmZXJlbmNlU3RhaXJzKGMsZkJveChwK3ZlYzMoKHMyLnotLjUpKjIuLDAuLDAuKSx2ZWMzKC4xLDMuLDMuKSksLjA1LDEwLik7cmV0dXJuIGM7fWZsb2F0IGNvbHModmVjMyBwLHZlYzQgczIpe3ZlYzMgcDI9cnQocCx2ZWMzKDAuLDEuLDAuKSxQSSouNSk7ZmxvYXQgYz0xZTEwO2M9cE1vZFBvbGFyKHAyLnh6LDEyLik7ZmxvYXQgZDI9Y2N5KHAyLXZlYzMoLjM1LC4xMjUsLjApLHZlYzIoLjE1LC4zNSkpO2Zsb2F0IGd1YXJkPS1mQm94Q2hlYXAocDIsdmVjMyguMikpO2d1YXJkPWFicyhndWFyZCkrLjE7Yz1taW4oZGlmQ29sKGNjeShwMix2ZWMyKC41LC41KSksZDIsLjA1LDYuKSxndWFyZCk7Zm9yKGludCBpPTA7aTw0O2krKyl7dmVjMyBzdDA9dGV4dHVyZTJEKGR0ZXgsdmVjMigwLixmbG9hdChpKS82NC4pKS54eXo7aWYoczIueD4uMyljPW1pbihjLGNjeShwMi12ZWMzKC4zKyhzdDAueS0uNSkqLjIsZmxvYXQoaSkqLjEtLjMsMC4pLHZlYzIoc3QwLngqLjAxLC4yKSkpO2lmKHMyLnk+LjcpYz1taW4oYyxjY3kocC12ZWMzKDAuLHN0MC56Ki4zLDAuKSx2ZWMyKC4zNSsuMDUqZmxvYXQoaSksc3QwLnkqLjAyNSkpKTt9cmV0dXJuIGM7fWZsb2F0IGNvbHMyKHZlYzMgcCx2ZWM0IHMyKXt2ZWMzIHAyPXJ0KHAsdmVjMygwLiwxLiwwLiksUEkqLjUpO2Zsb2F0IGM9MC47Yz1wTW9kUG9sYXIocDIueHosMTIuKTtmbG9hdCBkMj1mQm94KHAyLXZlYzMoLjUsMC4sMC4pLHZlYzMoLjIsLjQsLjA1KSk7ZmxvYXQgZ3VhcmQ9LWZCb3hDaGVhcChwMix2ZWMzKC4yKSk7Z3VhcmQ9YWJzKGd1YXJkKSsuMTtyZXR1cm4gbWluKGRpZkNvbChjY3kocDIsdmVjMiguNSwuNSkpLGQyLC4wNSw2LiksZ3VhcmQpO31mbG9hdCBkZGQodmVjMyBwLHZlYzQgczEsdmVjNCBzMil7ZmxvYXQgZD0xZTEwO2Zsb2F0IGFyaz1taW4oZCxhcmthcmlhKHAsczIpKTt2ZWMzIHAyPXJ0KHAsdmVjMygxLiwxLiwwLiksUEkqczIudyoyLik7ZmxvYXQgZ2VuPTAuO2lmKHMxLng8LjEpZ2VuPWNvbHMocDIsczIpO2lmKHMxLng+PS4xJiZzMS54PC40KWdlbj1jb2xzMihwMixzMik7aWYoczEueD49LjQmJnMxLng8LjcpZ2VuPWNvbHMzKHAyLHMyKTtpZihzMS54Pj0uNylnZW49Y29sczQocDIsIHMyKTtnZW49bWluKGdlbixhcmspO3JldHVybiBtaW4oZCxnZW4pO31gCiAgICBTUy5Mb3dQYXNzU2hhZGVyID0geyB1bmlmb3JtczogeyAndERpZmZ1c2UnOiB7IHZhbHVlOiBudWxsIH0sICdvcGFjaXR5JzogeyB2YWx1ZTogMS4gfSB9LCB2ZXJ0ZXhTaGFkZXI6IFNTLnB0YiwgZnJhZ21lbnRTaGFkZXI6IGB1bmlmb3JtIGZsb2F0IG9wYWNpdHk7dW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7dmFyeWluZyB2ZWMyIHZVdjske2NvcnJ9dm9pZCBtYWluKCl7dmVjNCBjb3V0PXRleHR1cmUyRCh0RGlmZnVzZSx2VXYpO2dsX0ZyYWdDb2xvcj12ZWM0KHZlYzMobWF4KGNvdXQuYixtYXgoY291dC5yLGNvdXQuZykpKSwxLik7Z2xfRnJhZ0NvbG9yLnJnYj1sZXZzKGdsX0ZyYWdDb2xvci5yZ2IsMi4vMjU1LiwxLjA1LDI1NC4vMjU1Lik7fWAgfTsKICAgIFNTLnBhcnRpY2xlRnJhZyA9IGB2YXJ5aW5nIHZlYzQgdkRhdGE7dW5pZm9ybSBzYW1wbGVyMkQgcG9zaXRpb25EYXRhO3VuaWZvcm0gc2FtcGxlcjJEIGRpc3RhbmNlVGV4O3VuaWZvcm0gZmxvYXQgdHJhbnNpdGlvbmluZzt1bmlmb3JtIGJvb2wgZG9mOyR7c24zfXZvaWQgbWFpbigpe3ZlYzQgcD10ZXh0dXJlMkQocG9zaXRpb25EYXRhLHZEYXRhLnh5KTt2ZWM0IGRzdG5jPXRleHR1cmUyRChkaXN0YW5jZVRleCwocC54eSt2ZWMyKDEuKSkqLjUpO3ZlYzIgdXY9dmVjMihnbF9Qb2ludENvb3JkLngsZ2xfUG9pbnRDb29yZC55KTtmbG9hdCBkZG90PXNtb290aHN0ZXAoLjI1LC43NSwxLi1sZW5ndGgodXYtdmVjMiguNSkpKjIuKTtmbG9hdCBuPShzbjModmVjMyhwLnh5eioxMDAuKSkrMS4pKi41O2lmKHZEYXRhLng+LjUmJnZEYXRhLnk8LjUpe2Zsb2F0IGNvbnRpbnVvdXM9MC47aWYodkRhdGEuej4uOSljb250aW51b3VzPTEuO2dsX0ZyYWdDb2xvcj12ZWM0KHZlYzMoY29udGludW91cypuLDEuLHZEYXRhLnopLHAudypkZG90KiguNSsuNSp2RGF0YS53KSk7aWYobGVuZ3RoKGRzdG5jKT09MC4pZ2xfRnJhZ0NvbG9yPXZlYzQodmVjMygwLiwxLiwwLikscC53KmRkb3QqKC41Ky41KnZEYXRhLncpKTtlbHNlIGdsX0ZyYWdDb2xvcj12ZWM0KHZlYzMoMC4sMS4sMC4pLHAudypkZG90KiguMjUrLjI1KnZEYXRhLncpKTt9aWYodkRhdGEueDwuNSYmdkRhdGEueTwuNSl7dmVjMyBjMT12ZWMzKDAuKTt2ZWMzIGMyPXZlYzMoMS4sMC4sMC4pO2Zsb2F0IG1mPXZEYXRhLnkqMi47Z2xfRnJhZ0NvbG9yPXZlYzQobWl4KGMxLGMyLG1mKSxwLncqZGRvdCooLjUrLjUqdkRhdGEudykpO31pZih2RGF0YS55Pi41KXtmbG9hdCBjb250aW51b3VzPTAuO2lmKHZEYXRhLno+Ljk5KWNvbnRpbnVvdXM9MS47dmVjMyBjMT12ZWMzKDAuKTt2ZWMzIGMyPXZlYzMoMC4sMC4sMS4pO2Zsb2F0IG1mPSh2RGF0YS54KSoyLjt9fWAKICAgIFNTLnJheW1hcmNoZXJGcmFnID0gYHVuaWZvcm0gdmVjMiByZXM7dW5pZm9ybSB2ZWM0IHNlZWQ7dW5pZm9ybSB2ZWM0IHNlZWQyO3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIHNhbXBsZXIyRCBkdGV4O3VuaWZvcm0gdmVjMiB0bDt1bmlmb3JtIGJvb2wgcGFubmluZzt1bmlmb3JtIHZlYzMgbGlnO3VuaWZvcm0gZmxvYXQgcGFydGljbGVTY2FsZTt2YXJ5aW5nIHZlYzIgdlV2O1xuI2RlZmluZSBNQVhfSVRFUkFUSU9OUyAxMjhcbiNkZWZpbmUgTUlOX0RJU1RBTkNFIC4wMDAwMDAwMVxuI2RlZmluZSBTQU1QTEVTIDE2XG4jZGVmaW5lIEFNQklFTlQgLjAyNVxuJHtTUy5kaXN0RnJhZ312ZWM0IGRpc3QodmVjMyBwKXtyZXR1cm4gdmVjNChkZGQocCxzZWVkLHNlZWQyKSwwLiwwLiwwLik7fWZsb2F0IHNoZCh2ZWMzIGIsdmVjMyBhLGZsb2F0IGMsZmxvYXQgZSl7ZmxvYXQgcj0xLjtmbG9hdCB0PWM7Zm9yKGludCBpPTA7aTwxMjg7aSsrKXtmbG9hdCBoPWRpc3QoYithKnQpLng7ZmxvYXQgcz1jbGFtcCg4LipoL3QsMC4sMS4pO3I9bWluKHIscypzKigzLi0yLipzKSk7dCs9Y2xhbXAoaCwuMDIsLjIpO2lmKHI8MWUtNHx8dD5lKWJyZWFrO31yZXR1cm4gY2xhbXAociwwLiwxLik7fWZsb2F0IGxpZ2h0KHZlYzMgcCx2ZWMzIGwsdmVjMyBuLGZsb2F0IGkpe3JldHVybiBpKmNsYW1wKGRvdChuLGwpLDAuLDEuKSpzaGQocCxsLC4wNiwyLjUpO312ZWMzIG5vcih2ZWMzIHApe3ZlYzIgZT12ZWMyKDEuLC0xLikqLjU3NzMqLjAwMDU7cmV0dXJuIG5vcm1hbGl6ZShlLnh5eSpkaXN0KHArZS54eXkpLngrZS55eXgqZGlzdChwK2UueXl4KS54K2UueXh5KmRpc3QocCtlLnl4eSkueCtlLnh4eCpkaXN0KHArZS54eHgpLngpO31mbG9hdCBhbyh2ZWMzIHAsdmVjMyBuKXtmbG9hdCBvPTAuLHM9MS47Zm9yKGludCBpPTA7aTw1O2krKyl7ZmxvYXQgaD0uMDErLjEyKmZsb2F0KGkpLzQuLGQ9ZGlzdChwK2gqbikueDtvKz0oaC1kKSpzO3MqPS45NTtpZihvPi4zNSlicmVhazt9cmV0dXJuIGNsYW1wKDEuLTMuKm8sMC4sMS4pKiguNSsuNSpuLnkpO312ZWM0IGR0cyh2ZWMzIGEsdmVjMyBjKXt2ZWM0IHI9dmVjNCgtMS4pO2Zsb2F0IGQ9My47Zm9yKGludCBpPTA7aTwyNTY7aSsrKXt2ZWM0IGI9ZGlzdChhK2QqYyk7aWYoYi54PDFlLTQpe3JldHVybiB2ZWM0KGQsYi55encpO2JyZWFrO31kKz1iLng7aWYoZD49Ny4pe3IueD03LjtyZXR1cm4gcjt9fXJldHVybiByO312ZWMzIHJlZmxJZk5lZyhpbiB2ZWMzIHYsaW4gdmVjMyByKXtmbG9hdCBrPWRvdCh2LHIpO3JldHVybiAoaz4wLik/djp2LTIuKnIqazt9ZmxvYXQgcmFuZCh2ZWMyIGMpe3JldHVybiBmcmFjdChzaW4oZG90KGMueHksdmVjMigxMi45ODk4LDc4LjIzMykpKSo0Mzc1OC41NDUzKTt9XG4jZGVmaW5lIEFBIDRcbnN0cnVjdCBSYXl7dmVjMyBvcmk7dmVjMyBkaXI7fTtzdHJ1Y3QgRGlzdHtmbG9hdCBkc3Q7fTtzdHJ1Y3QgSGl0e3ZlYzMgcDtmbG9hdCBkc3Q7fTtzdHJ1Y3QgTGlnaHR7dmVjMyBwO2Zsb2F0IHI7fTtIaXQgcmF5bWFyY2goUmF5IHJheSl7dmVjMyBwPXJheS5vcmk7ZmxvYXQgZD0wLjtpbnQgaWQ9LTE7Zm9yKGludCBpPTA7aTxNQVhfSVRFUkFUSU9OUztpKyspe3A9cmF5Lm9yaStyYXkuZGlyKmQ7RGlzdCBkc3Q9RGlzdChkZGQocCxzZWVkLHNlZWQyKSk7ZCs9ZHN0LmRzdCouNzU7aWYoZHN0LmRzdDxNSU5fRElTVEFOQ0Upe3A9cmF5Lm9yaStyYXkuZGlyKmQ7YnJlYWs7fX1yZXR1cm4gSGl0KHAsZCk7fUxpZ2h0IGdldExpZ2h0KCl7cmV0dXJuIExpZ2h0KG5vcm1hbGl6ZSh2ZWMzKC0uNStzZWVkMi53LC40LDIuKSkqMTAuLDEwMC4pO312ZWMzIGNhbGNJcnJhZGlhbmNlKExpZ2h0IGwsdmVjMyBwKXtyZXR1cm4gdmVjMygxLi1jbGFtcChsZW5ndGgobC5wLXApL2wuciwwLiwxLikpO312ZWMzIGNhbGNWb2x1bWV0cmljKFJheSByYXksZmxvYXQgbWF4RGlzdCl7dmVjMyBjb2w9dmVjMygwLik7TGlnaHQgbD1nZXRMaWdodCgpO2Zsb2F0IGlzPW1heERpc3QvMjAwLjtmbG9hdCB2cnM9bWF4RGlzdC9mbG9hdChTQU1QTEVTIC0xKTtmbG9hdCBycz1yYW5kKGdsX0ZyYWdDb29yZC54eSkrdnJzO1JheSB2b2xSYXk9UmF5KHJheS5vcmkrcmF5LmRpcipycyx2ZWMzKDAuKSk7Zm9yKGludCB2PTA7djxTQU1QTEVTO3YrKyl7dmVjMyBsdj1sLnAtdm9sUmF5Lm9yaTtmbG9hdCBsZD1sZW5ndGgobHYpO3ZvbFJheS5kaXI9bHYvbGQ7SGl0IGk9cmF5bWFyY2godm9sUmF5KTtpZihpLmRzdD5sZCljb2wrPWNhbGNJcnJhZGlhbmNlKGwsdm9sUmF5Lm9yaSkqaXM7dm9sUmF5Lm9yaSs9cmF5LmRpcip2cnM7fXJldHVybiBjb2w7fXZlYzMgc2hhZGUoUmF5IHJheSl7SGl0IHNjZW5lPXJheW1hcmNoKHJheSk7dmVjMyBjb2w9dmVjMygwLik7dmVjMyB2bD1jYWxjVm9sdW1ldHJpYyhyYXksbWluKHNjZW5lLmRzdCwxMC4pKTtjb2wtPXZsKi41O2NvbCs9dmw7cmV0dXJuIGNvbDt9dmVjNCBjb2wodmVjMiB1dil7dmVjNCBjb3V0PXZlYzQoMC4pO3ZlYzMgbHA9dmVjMyhzaW4oLjIpLC41LDEuKTt2ZWMzIGV5ZT12ZWMzKDAuLDAuLDUuKTt2ZWMyIHNVdj0oKHV2LXZlYzIoLjUpKSoyLikqdmVjMigxLixyZXMueS9yZXMueCk7aWYocmVzLng+cmVzLnkpc1V2PSgodXYtdmVjMiguNSkpKjIuKSp2ZWMyKHJlcy54L3Jlcy55LDEuKTt2ZWMzIGRpcj1ub3JtYWxpemUodmVjMyhzVXYsMC4pLWV5ZSk7dmVjNCBkPWR0cyhleWUsZGlyKTt2ZWMzIGxkaXI9bm9ybWFsaXplKHZlYzMobHApKTtpZihkLng8PTcuLTFlLTQpe3ZlYzMgcD1leWUrZGlyKmQueDt2ZWMzIG49bm9yKHApO2Zsb2F0IG9jYz1hbyhwLG4pO2Zsb2F0IGNvbD0xLjtmbG9hdCBsaW49MC47dmVjMyBscD12ZWMzKC0wLjUrc2VlZDIudywuNCwyLik7dmVjMyBsaWc9bm9ybWFsaXplKGxwKTt2ZWMzIGhhbD1ub3JtYWxpemUobGlnLWRpcik7ZmxvYXQgZGlmPWNsYW1wKGRvdChuLGxpZyksMC4sMS4pO2RpZio9c2hkKHAsbGlnLC4wMiwyLjUpO2Zsb2F0IHNwZT1wb3coY2xhbXAoZG90KG4saGFsKSwwLiwxLiksMTYuKSooZGlmKiguMDQrLjk2KnBvdyhjbGFtcCgxLi1kb3QoaGFsLGxpZyksMC4sMS4pLDUuKSkpO2xpbis9Y29sKjIuMipkaWYrNS4qc3BlKi45O2Zsb2F0IGdsPS4wNSsoLjk1KmxpbipvY2MpO2NvdXQ9dmVjNChwLngsMC4sZC54LGdsKTt9ZWxzZXtjb3V0PXZlYzQoMC4sMC4sMC4sMC4pO31yZXR1cm4gY291dDt9dm9pZCBtYWluKCl7dmVjMiB1dj12VXYqMS4yLXZlYzIoLjEpO3ZlYzQgdG90PXZlYzQoMC4pO2ZvcihpbnQgbT0wO208QUE7bSsrKXtmb3IoaW50IG49MDtuPEFBO24rKyl7dmVjMiBvPXZlYzIoZmxvYXQobSksZmxvYXQobikpL2Zsb2F0KEFBKS0uNTt2ZWMyIHV2dj11ditvL3Jlczt0b3QrPWNvbCh1dnYpO319dG90Lz1mbG9hdChBQSpBQSk7dmVjMyBleWU9dmVjMygwLiwwLiw1Lik7dmVjMyBkaXI9bm9ybWFsaXplKHZlYzMoKCh1di0uNSkqdmVjMigxLixyZXMueS9yZXMueCkvKHBhcnRpY2xlU2NhbGUvMS4vMi4pKSwwLiktZXllKTtpZihyZXMueD5yZXMueSlkaXI9bm9ybWFsaXplKHZlYzMoKCh1di0uNSkqdmVjMihyZXMueC9yZXMueSwxLikpLyhwYXJ0aWNsZVNjYWxlLzEuLzIuKSwwLiktZXllKTtpZihsZW5ndGgodG90KT09MC4pdG90Lmc9Y2xhbXAoc2hhZGUoUmF5KGV5ZSxkaXIpKSwwLiwxLikucjtnbF9GcmFnQ29sb3I9dG90O31gCiAgICBTUy5wb3N0RnJhZyA9IGB2YXJ5aW5nIHZlYzIgdlV2O3VuaWZvcm0gdmVjMiByZXM7dW5pZm9ybSB2ZWM0IHMxO3VuaWZvcm0gZmxvYXQgdGw7dW5pZm9ybSBmbG9hdCB0aW1lO3VuaWZvcm0gc2FtcGxlcjJEIGRpc3RhbmNlVGV4OyR7c24zfSR7Y29ycn1mbG9hdCByYW5kb20gKHZlYzIgc3Qpe3JldHVybiBmcmFjdChzaW4oZG90KHN0Lnh5LCB2ZWMyKDEyLjk4OTgsNzguMjMzKSkpKjQzNzU4LjU0NTMxMjMpO312ZWM0IGRpc3QodmVjMyBwKXtmbG9hdCBkPWxlbmd0aChwKS0uNTtyZXR1cm4gdmVjNChkLDAuLDAuLDAuKTt9bWF0MiByb3RhdGUoZmxvYXQgYSl7ZmxvYXQgYz1jb3MoYSk7ZmxvYXQgcz1zaW4oYSk7cmV0dXJuIG1hdDIoYyxzLC1zLGMpO31mbG9hdCBub2lzZShpbiB2ZWMyIF9zdCl7dmVjMiBpPWZsb29yKF9zdCk7dmVjMiBmPWZyYWN0KF9zdCk7ZmxvYXQgYT1yYW5kb20oaSk7ZmxvYXQgYj1yYW5kb20oaSt2ZWMyKDEuLDAuKSk7ZmxvYXQgYz1yYW5kb20oaSt2ZWMyKDAuLDEuKSk7ZmxvYXQgZD1yYW5kb20oaSt2ZWMyKDEuLDEuKSk7dmVjMiB1PWYqZiooMy4tMi4qZik7cmV0dXJuIG1peChhLGIsdS54KSsoYy1hKSp1LnkqKDEuLXUueCkrKGQtYikqdS54KnUueTt9ZmxvYXQgZmJtKGluIHZlYzIgbil7ZmxvYXQgdG90YWw9MC47ZmxvYXQgYW1wbGl0dWRlPS43O21hdDIgcm90PXJvdGF0ZSguNSk7Zm9yKGludCBpPTA7aTw2OysraSl7dG90YWwrPWFtcGxpdHVkZSpub2lzZShuKTtuPXJvdCpuKjIuKzMwMC47YW1wbGl0dWRlKj0uNDU7fXJldHVybiB0b3RhbDt9dm9pZCBtYWluKCl7dmVjNCBkc3RuYz10ZXh0dXJlMkQoZGlzdGFuY2VUZXgsdlV2KTtmbG9hdCBuPShzbjModmVjMyh2VXYrdmVjMihzMS54eSksdGltZSouMSkpKzEuKSouNTtmbG9hdCBuMT0ocmFuZG9tKHZVdit2ZWMyKC41LC41KSktLjUpKjIuO2Zsb2F0IGNvbD1kc3RuYy5nO3ZlYzIgdXY9dlV2O3ZlYzIgc1V2PSgodXYtdmVjMiguNSkpKjIuKSp2ZWMyKDEuLHJlcy55L3Jlcy54KTtpZihyZXMueD5yZXMueSlzVXY9KCh1di12ZWMyKC41KSkqMi4pKnZlYzIocmVzLngvcmVzLnksMS4pO3ZlYzIgc3Q9c1V2KjMuK3ZlYzIodGltZSouMSx0aW1lKi4yKTt2ZWMzIGNvbG9yPXZlYzMoMC4pO3ZlYzIgcT12ZWMyKDAuKTtxLng9ZmJtKHN0Ky4xKnRpbWUrczEueHkqMTAwLik7cS55PWZibShzdCt2ZWMyKDEuKStzMS54eSoxMDAuKTt2ZWMyIHI9dmVjMigwLik7ci54PWZibShzdCsxLipxKy4xNSp0aW1lK3MxLnh5KjEwMC4pO3IueT1mYm0oc3QrMS4qcSsuMSp0aW1lK3MxLnh5KjEwMC4pO2Zsb2F0IGY9ZmJtKHN0K3IrczEueHkqMTAwLik7ZmxvYXQgYT10bCsobjEpO2Zsb2F0IGZmPSgoZipmKmYrLjkqZipmKy41KmYpKmNsYW1wKCgxLi0oZHN0bmMuei01LikpLC4wLCguMDUgKyAwLjI1ICogczEueikqY2xhbXAoKHBvdyhzVXYueSwyLikpLDAuLDEuKSkpO3ZlYzQgZm9nPXZlYzQodmVjMygxLiwxLiwuOTkpKmZmLC42K2EqLjQpO3ZlYzQgdm9sPXZlYzQodmVjMyhjb2wqLjIpLGEpO2dsX0ZyYWdDb2xvcj12ZWM0KDEuKS0oKHZlYzQoMS4pLXZvbCkqKHZlYzQoMS4pLWZvZykpO2dsX0ZyYWdDb2xvci5yZ2I9bGV2cyhnbF9GcmFnQ29sb3IucmdiLDIuLzI1NS4sMS4wNSwyNTQuLzI1NS4pO31gOwogICAgY2xhc3MgUmFuZCB7IGNvbnN0cnVjdG9yKHQpIHsgdGhpcy51YSA9IDA7IGxldCBzZmMzMiA9IGZ1bmN0aW9uICh1KSB7IGxldCBhID0gcGFyc2VJbnQodS5zdWJzdHIoMCwgOCksIDE2KSwgYiA9IHBhcnNlSW50KHUuc3Vic3RyKDgsIDgpLCAxNiksIGMgPSBwYXJzZUludCh1LnN1YnN0cigxNiwgOCksIDE2KSwgZCA9IHBhcnNlSW50KHUuc3Vic3RyKDI0LCA4KSwgMTYpOyByZXR1cm4gXyA9PiB7IDsgYSB8PSAwOyBiIHw9IDA7IGMgfD0gMDsgZCB8PSAwOyBsZXQgdCA9ICgoKGEgKyBiKSB8IDApICsgZCkgfCAwOyBkID0gKGQgKyAxKSB8IDA7IGEgPSBiIF4gKGIgPj4+IDkpOyBiID0gKGMgKyAoYyA8PCAzKSkgfCAwOyBjID0gKGMgPDwgMjEpIHwgKGMgPj4+IDExKTsgYyA9IChjICsgdCkgfCAwOyByZXR1cm4gKHQgPj4+IDApIC8gNDI5NDk2NzI5NjsgfTsgfTsgdGhpcy5wYSA9IG5ldyBzZmMzMih0LnN1YnN0cigyLCAzMikpOyB0aGlzLnBiID0gbmV3IHNmYzMyKHQuc3Vic3RyKDM0LCAzMikpOyBmb3IgKGxldCBpID0gMDsgaSA8IDFlNjsgaSArPSAyKSB7IHRoaXMucGEoKTsgdGhpcy5wYigpOyB9OyB9OyByKCkgeyB0aGlzLnVhID0gIXRoaXMudWE7IHJldHVybiB0aGlzLnVhID8gdGhpcy5wYSgpIDogdGhpcy5wYigpOyB9OyB9CiAgICB3aW5kb3cuciA9IG5ldyBSYW5kKHRva2VuSGFzaCkKICAgIGxldCBfID0gVEhSRUUKICAgIGNsYXNzIEZTUSB7IGNvbnN0cnVjdG9yKG0pIHsgdGhpcy5tYXRlcmlhbCA9IG07IGxldCBnID0gbmV3IF8uQnVmZmVyR2VvbWV0cnkoKTsgZy5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IF8uRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShbLTEsIDMsIDAsIC0xLCAtMSwgMCwgMywgLTEsIDBdLCAzKSk7IGcuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBfLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoWzAsIDIsIDAsIDAsIDIsIDBdLCAyKSk7IHRoaXMubSA9IG5ldyBfLk1lc2goZywgbSk7IH07IHJlbmRlcihyKSB7IHIucmVuZGVyKHRoaXMubSwgbmV3IF8uT3J0aG9ncmFwaGljQ2FtZXJhKC0xLCAxLCAxLCAtMSwgMCwgMSkpOyB9IH07CiAgICBjbGFzcyBBZnRlcmltYWdlUGFzcyB7IGNvbnN0cnVjdG9yKGQpIHsgdGhpcy5uZWVkc1N3YXAgPSAxOyB0aGlzLnUgPSBfLlVuaWZvcm1zVXRpbHMuY2xvbmUoeyAndHJhbnNpdGlvbmluZyc6IHsgdmFsdWU6IDAgfSwgJ3RpbWUnOiB7IHZhbHVlOiAwIH0sICdkJzogeyB2YWx1ZTogZCB9LCAnbyc6IHsgdmFsdWU6IDAgfSwgJ24nOiB7IHZhbHVlOiAwIH0sICdtYXNrJzogeyB2YWx1ZTogMCB9LCAnbSc6IHsgdmFsdWU6IDEgfSwgJ3Jlcyc6IHsgdmFsdWU6IG5ldyBfLlZlY3RvcjIoKSB9IH0pOyBsZXQgcCA9IHsgbWluRmlsdGVyOiAxMDA2LCBtYWdGaWx0ZXI6IDEwMDMsIGZvcm1hdDogMTAyMyB9OyB0aGlzLmEgPSBuZXcgXy5XZWJHTFJlbmRlclRhcmdldCgxLCAxLCBwKTsgdGhpcy5iID0gbmV3IF8uV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwgcCk7IHRoaXMuYyA9IG5ldyBGU1EobmV3IF8uU2hhZGVyTWF0ZXJpYWwoeyB1bmlmb3JtczogdGhpcy51LCB2ZXJ0ZXhTaGFkZXI6IFNTLnB0YiwgZnJhZ21lbnRTaGFkZXI6IFNTLmFmdGVyZnMgfSkpOyB0aGlzLmQgPSBuZXcgRlNRKG5ldyBfLk1lc2hCYXNpY01hdGVyaWFsKCkpOyB9OyByZW5kZXIociwgdywgYikgeyB0aGlzLnUuby52YWx1ZSA9IHRoaXMuYi50ZXh0dXJlOyB0aGlzLnUubi52YWx1ZSA9IGIudGV4dHVyZTsgci5zZXRSZW5kZXJUYXJnZXQodGhpcy5hKTsgdGhpcy5jLnJlbmRlcihyKTsgdGhpcy5kLm1hdGVyaWFsLm1hcCA9IHRoaXMuYS50ZXh0dXJlOyByLnNldFJlbmRlclRhcmdldCh3KTsgdGhpcy5kLnJlbmRlcihyKTsgbGV0IHQgPSB0aGlzLmI7IHRoaXMuYiA9IHRoaXMuYTsgdGhpcy5hID0gdDsgfTsgc2V0U2l6ZSh3LCBoKSB7IHRoaXMuYS5zZXRTaXplKHcsIGgpOyB0aGlzLmIuc2V0U2l6ZSh3LCBoKTsgfSB9OwogICAgY2xhc3MgUmVuZGVyUGFzcyB7IGNvbnN0cnVjdG9yKHMsIGMpIHsgdGhpcy5zID0gczsgdGhpcy5jID0gYzsgfTsgcmVuZGVyKHIsIF8sIGIpIHsgbGV0IG9sZEF1dG9DbGVhciA9IHIuYXV0b0NsZWFyOyByLmF1dG9DbGVhciA9IDA7IHIuc2V0UmVuZGVyVGFyZ2V0KGIpOyByLmNsZWFyKHIuYXV0b0NsZWFyQ29sb3IsIHIuYXV0b0NsZWFyRGVwdGgsIHIuYXV0b0NsZWFyU3RlbmNpbCk7IHIucmVuZGVyKHRoaXMucywgdGhpcy5jKTsgci5hdXRvQ2xlYXIgPSBvbGRBdXRvQ2xlYXI7IH07IHNldFNpemUoKSB7IH0gfTsKICAgIGNsYXNzIEVmZmVjdENvbXBvc2VyIHsgY29uc3RydWN0b3IocikgeyB0aGlzLnIgPSByOyBsZXQgcyA9IHIuZ2V0U2l6ZShuZXcgXy5WZWN0b3IyKCkpOyB0aGlzLnAgPSByLmdldFBpeGVsUmF0aW8oKTsgdGhpcy53ID0gcy53aWR0aDsgdGhpcy5oID0gcy5oZWlnaHQ7IGxldCB0ID0gbmV3IF8uV2ViR0xSZW5kZXJUYXJnZXQodGhpcy53ICogdGhpcy5wLCB0aGlzLmggKiB0aGlzLnAsIHsgbWluRmlsdGVyOiAxMDA2LCBtYWdGaWx0ZXI6IDEwMDYsIGZvcm1hdDogMTAyMyB9KTsgdGhpcy51ID0gdDsgdGhpcy52ID0gdC5jbG9uZSgpOyB0aGlzLmIgPSB0aGlzLnU7IHRoaXMucmVhZEJ1ZmZlciA9IHRoaXMudjsgdGhpcy5yZW5kZXJUb1NjcmVlbiA9IDE7IHRoaXMudCA9IFtdOyB0aGlzLmMgPSBuZXcgVEhSRUUuQ2xvY2soKTsgfSBzYigpIHsgbGV0IHRtcCA9IHRoaXMucmVhZEJ1ZmZlcjsgdGhpcy5yZWFkQnVmZmVyID0gdGhpcy5iOyB0aGlzLmIgPSB0bXA7IH0gYWRkUGFzcyhwKSB7IHRoaXMudC5wdXNoKHApOyBwLnNldFNpemUodGhpcy53ICogdGhpcy5wLCB0aGlzLmggKiB0aGlzLnApOyB9IGxwKHApIHsgZm9yIChsZXQgaSA9IHAgKyAxOyBpIDwgdGhpcy50Lmxlbmd0aDsgaSsrKWlmICh0aGlzLnRbaV0uZW5hYmxlZCkgcmV0dXJuIDA7IHJldHVybiAxOyB9IHJlbmRlcigpIHsgbGV0IGQgPSB0aGlzLmMuZ2V0RGVsdGEoKSwgYyA9IHRoaXMuci5nZXRSZW5kZXJUYXJnZXQoKTsgdGhpcy50LmZvckVhY2gocCA9PiB7IHAucmVuZGVyVG9TY3JlZW4gPSB0aGlzLnJlbmRlclRvU2NyZWVuICYmIHRoaXMubHAoaSk7IHAucmVuZGVyKHRoaXMuciwgdGhpcy5iLCB0aGlzLnJlYWRCdWZmZXIsIGQsIDApOyBpZiAocC5uZWVkc1N3YXApIHRoaXMuc2IoKTsgfSk7IHRoaXMuci5zZXRSZW5kZXJUYXJnZXQoYyk7IH07IHNldFNpemUodywgaCkgeyB0aGlzLncgPSB3OyB0aGlzLmggPSBoOyBsZXQgeCA9IHRoaXMudyAqIHRoaXMucCwgeSA9IHRoaXMuaCAqIHRoaXMucDsgdGhpcy51LnNldFNpemUoeCwgeSk7IHRoaXMudi5zZXRTaXplKHgsIHkpOyB0aGlzLnQuZm9yRWFjaChwID0+IHAuc2V0U2l6ZSh4LCB5KSk7IH0gfTsKICAgIGNsYXNzIEdQVUNvbXB1dGF0aW9uUmVuZGVyZXIgeyBjb25zdHJ1Y3Rvcih4LCB5LCByKSB7IHRoaXMuciA9IHI7IHRoaXMueCA9IHg7IHRoaXMueSA9IHk7IHRoaXMudiA9IFtdOyB0aGlzLm4gPSAwOyB0aGlzLnMgPSBuZXcgVEhSRUUuU2NlbmUoKTsgdGhpcy5jID0gbmV3IFRIUkVFLkNhbWVyYSgpOyB0aGlzLmMucG9zaXRpb24ueiA9IDE7IHRoaXMucCA9IHsgcGFzc1RocnVUZXh0dXJlOiB7IHZhbHVlOiAwIH0gfTsgdGhpcy50ID0gdGhpcy5jcyhTUy5wdGZzLCB0aGlzLnApOyB0aGlzLm0gPSBuZXcgVEhSRUUuTWVzaChuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeSgyLCAyKSwgdGhpcy50KTsgdGhpcy5zLmFkZCh0aGlzLm0pOyB9OyBhZGRWYXJpYWJsZShuLCBjLCB0KSB7IGxldCB2ID0geyBuYW1lOiBuLCBpOiB0LCBtYXRlcmlhbDogdGhpcy5jcyhjKSwgdDogW10sIG1pbkZpbHRlcjogMTAwMywgbWFnRmlsdGVyOiAxMDAzIH07IHRoaXMudi5wdXNoKHYpOyByZXR1cm4gdjsgfTsgaW5pdCgpIHsgdGhpcy52LmZvckVhY2godiA9PiB7IHYudCA9IFt0aGlzLmNyKCksIHRoaXMuY3IoKV07IHRoaXMucnQodi5pLCB2LnRbMF0pOyB0aGlzLnJ0KHYuaSwgdi50WzFdKTsgdi5kZXBlbmRlbmNpZXMuZm9yRWFjaChkID0+IHsgdi5tYXRlcmlhbC51bmlmb3Jtc1tkLm5hbWVdID0geyB2YWx1ZTogMCB9OyB2Lm1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0gJ3VuaWZvcm0gc2FtcGxlcjJEICcgKyBkLm5hbWUgKyAnOycgKyB2Lm1hdGVyaWFsLmZyYWdtZW50U2hhZGVyOyB9KTsgfSk7IHRoaXMubiA9IDA7IH07IGNvbXB1dGUoKSB7IGxldCBjID0gdGhpcy5uLCBuID0gdGhpcy5uID09PSAwID8gMSA6IDA7IHRoaXMudi5mb3JFYWNoKHYgPT4geyBsZXQgdSA9IHYubWF0ZXJpYWwudW5pZm9ybXM7IHYuZGVwZW5kZW5jaWVzLmZvckVhY2goZCA9PiB7IHVbZC5uYW1lXS52YWx1ZSA9IGQudFtjXS50ZXh0dXJlOyB9KTsgdGhpcy5kcih2Lm1hdGVyaWFsLCB2LnRbbl0pOyB9KTsgdGhpcy5uID0gbjsgfTsgY3IoKSB7IHJldHVybiBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQodGhpcy54LCB0aGlzLnksIHsgd3JhcFM6IDEwMDEsIHdyYXBUOiAxMDAxLCBtaW5GaWx0ZXI6IDEwMDMsIG1hZ0ZpbHRlcjogMTAwMywgZm9ybWF0OiAxMDIzLCB0eXBlOiAxMDE1LCBkZXB0aEJ1ZmZlcjogMCB9KTsgfTsgY3JlYXRlVGV4dHVyZSgpIHsgbGV0IHQgPSBuZXcgVEhSRUUuRGF0YVRleHR1cmUobmV3IEZsb2F0MzJBcnJheSh0aGlzLnggKiB0aGlzLnkgKiA0KSwgdGhpcy54LCB0aGlzLnksIDEwMjMsIDEwMTUpOyB0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsgcmV0dXJuIHQ7IH07IGdldEN1cnJlbnRSZW5kZXJUYXJnZXQodikgeyByZXR1cm4gdi50W3RoaXMubl07IH07IGNzKGMsIHUpIHsgbGV0IG0gPSBuZXcgVEhSRUUuU2hhZGVyTWF0ZXJpYWwoeyB1bmlmb3JtczogdSB8fCB7fSwgdmVydGV4U2hhZGVyOiBTUy5wdHZzLCBmcmFnbWVudFNoYWRlcjogYyB9KTsgdGhpcy5hcihtKTsgcmV0dXJuIG07IH07IGFyKG0pIHsgbS5kZWZpbmVzLnJlc29sdXRpb24gPSAndmVjMignICsgdGhpcy54LnRvRml4ZWQoMSkgKyAnLCcgKyB0aGlzLnkudG9GaXhlZCgxKSArICcpJzsgfTsgcnQoaSwgbykgeyB0aGlzLnAucGFzc1RocnVUZXh0dXJlLnZhbHVlID0gaTsgdGhpcy5kcih0aGlzLnQsIG8pOyB0aGlzLnAucGFzc1RocnVUZXh0dXJlLnZhbHVlID0gbnVsbDsgfTsgZHIobSwgbykgeyBsZXQgYyA9IHRoaXMuci5nZXRSZW5kZXJUYXJnZXQoKTsgdGhpcy5tLm1hdGVyaWFsID0gbTsgdGhpcy5yLnNldFJlbmRlclRhcmdldChvKTsgdGhpcy5yLnJlbmRlcih0aGlzLnMsIHRoaXMuYyk7IHRoaXMubS5tYXRlcmlhbCA9IHRoaXMudDsgdGhpcy5yLnNldFJlbmRlclRhcmdldChjKTsgfTsgfTsKICAgIGNsYXNzIFBhc3MgeyBjb25zdHJ1Y3RvcigpIHsgdGhpcy5lbmFibGVkID0gMTsgdGhpcy5uZWVkc1N3YXAgPSAxOyB0aGlzLmNsZWFyID0gMDsgdGhpcy5yZW5kZXJUb1NjcmVlbiA9IDA7IH07IHNldFNpemUoKSB7IH0gfQogICAgbGV0IF9jYW1lcmEgPSBuZXcgXy5PcnRob2dyYXBoaWNDYW1lcmEoLTEsIDEsIDEsIC0xLCAwLCAxKSwgX2dlb21ldHJ5ID0gbmV3IF8uQnVmZmVyR2VvbWV0cnkoKTsKICAgIF9nZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IF8uRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShbLTEsIDMsIDAsIC0xLCAtMSwgMCwgMywgLTEsIDBdLCAzKSk7CiAgICBfZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBfLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoWzAsIDIsIDAsIDAsIDIsIDBdLCAyKSk7CiAgICBjbGFzcyBTaGFkZXJQYXNzIGV4dGVuZHMgUGFzcyB7IGNvbnN0cnVjdG9yKHMpIHsgc3VwZXIoKTsgdGhpcy50ID0gJ3REaWZmdXNlJzsgdGhpcy51bmlmb3JtcyA9IF8uVW5pZm9ybXNVdGlscy5jbG9uZShzLnVuaWZvcm1zKTsgdGhpcy5tYXRlcmlhbCA9IG5ldyBfLlNoYWRlck1hdGVyaWFsKHsgZGVmaW5lczogT2JqZWN0LmFzc2lnbih7fSwgcy5kZWZpbmVzKSwgdW5pZm9ybXM6IHRoaXMudW5pZm9ybXMsIHZlcnRleFNoYWRlcjogcy52ZXJ0ZXhTaGFkZXIsIGZyYWdtZW50U2hhZGVyOiBzLmZyYWdtZW50U2hhZGVyIH0pOyB0aGlzLmZzUXVhZCA9IG5ldyBGU1EodGhpcy5tYXRlcmlhbCk7IH0gcmVuZGVyKHIsIHdiLCByYikgeyBpZiAodGhpcy51bmlmb3Jtc1t0aGlzLnRdKSB0aGlzLnVuaWZvcm1zW3RoaXMudF0udmFsdWUgPSByYi50ZXh0dXJlOyB0aGlzLmZzUXVhZC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7IHIuc2V0UmVuZGVyVGFyZ2V0KHdiKTsgaWYgKHRoaXMuY2xlYXIpIHIuY2xlYXIoci5hdXRvQ2xlYXJDb2xvciwgci5hdXRvQ2xlYXJEZXB0aCwgci5hdXRvQ2xlYXJTdGVuY2lsKTsgdGhpcy5mc1F1YWQucmVuZGVyKHIpOyB9IH07CiAgICBjbGFzcyBQYXJ0aWNsZXMgZXh0ZW5kcyBfLk9iamVjdDNEIHsgY29uc3RydWN0b3IocmQpIHsgc3VwZXIoKTsgdGhpcy5yID0gcmQ7IGxldCBzeiA9ICghaXNtb2JpbGUpID8gMTAyNCA6IDUxMjsgdGhpcy50bCA9IDA7IHRoaXMucnAgPSBuZXcgXy5NZXNoKG5ldyBfLlBsYW5lR2VvbWV0cnkoMSwgMSksIG5ldyBfLk1lc2hCYXNpY01hdGVyaWFsKHsgdHJhbnNwYXJlbnQ6IHRydWUsIG9wYWNpdHk6IDEgfSkpOyB0aGlzLmFkZCh0aGlzLnJwKTsgdGhpcy5zY24gPSBuZXcgXy5TY2VuZSgpOyB0aGlzLmNhbSA9IG5ldyBfLk9ydGhvZ3JhcGhpY0NhbWVyYSgpOyB0aGlzLnBhcnRpY2xlQ291bnQgPSAwOyB0aGlzLnN6MiA9IHN6ICogc3o7IGxldCBwcyA9IFtdLCBkcyA9IFtdOyBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3oyOyBpKyspIHsgcHMucHVzaCgoci5yKCkgLSAuNSkgKiAyLCAoci5yKCkgLSAuNSkgKiAyLCByLnIoKSwgMCk7IGRzLnB1c2goKGkgJSBzeikgLyBzeiwgKE1hdGguZmxvb3IoaSAvIHN6KSkgLyBzeiwgci5yKCksIHIucigpKTsgfTsgdGhpcy5nZW8gPSBuZXcgXy5CdWZmZXJHZW9tZXRyeSgpOyB0aGlzLmdlby5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IF8uQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkocHMpLCA0KSk7IHRoaXMuZ2VvLnNldEF0dHJpYnV0ZSgncGFydGljbGVEYXRhJywgbmV3IF8uQnVmZmVyQXR0cmlidXRlKG5ldyBGbG9hdDMyQXJyYXkoZHMpLCA0KSk7IHRoaXMubWF0ID0gbmV3IF8uU2hhZGVyTWF0ZXJpYWwoeyB1bmlmb3JtczogeyBwb3NpdGlvbkRhdGE6IHsgdmFsdWU6IG51bGwgfSwgdGltZTogeyB2YWx1ZTogMCB9LCBzZDogeyB2YWx1ZTogczEgfSwgc2QyOiB7IHZhbHVlOiBzMiB9LCBkcHI6IHsgdmFsdWU6IGRwciB9LCBkaXN0YW5jZVRleDogeyB2YWx1ZTogbnVsbCB9IH0sIHZlcnRleFNoYWRlcjogU1MucGFydGljbGVWZXJ0LCBmcmFnbWVudFNoYWRlcjogU1MucGFydGljbGVGcmFnLCB0cmFuc3BhcmVudDogMSwgZGVwdGhXcml0ZTogMCwgZGVwdGhUZXN0OiAwIH0pOyB0aGlzLnBhcnRpY2xlcyA9IG5ldyBfLlBvaW50cyh0aGlzLmdlbywgdGhpcy5tYXQpOyB0aGlzLnNjbi5hZGQodGhpcy5wYXJ0aWNsZXMpOyB0aGlzLmdwQyA9IG5ldyBHUFVDb21wdXRhdGlvblJlbmRlcmVyKHN6LCBzeiwgdGhpcy5yKTsgbGV0IHBUZXggPSB0aGlzLmdwQy5jcmVhdGVUZXh0dXJlKCksIGRUZXggPSB0aGlzLmdwQy5jcmVhdGVUZXh0dXJlKCk7IHBUZXguaW1hZ2UuZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkocHMpOyBkVGV4LmltYWdlLmRhdGEgPSBuZXcgRmxvYXQzMkFycmF5KGRzKTsgdGhpcy5wVmFyID0gdGhpcy5ncEMuYWRkVmFyaWFibGUoJ3RleHR1cmVQb3NpdGlvbicsIFNTLnBhcnRpY2xlUG9zLCBwVGV4KTsgdGhpcy5wVmFyLm1hdGVyaWFsLnVuaWZvcm1zID0geyB0aW1lOiB7IHZhbHVlOiAwIH0sIGRhdGE6IHsgdmFsdWU6IGRUZXggfSwgc2VlZDogeyB2YWx1ZTogczEgfSwgc2VlZDI6IHsgdmFsdWU6IHMyIH0sIHJlczogeyB2YWx1ZTogbmV3IF8uVmVjdG9yMihkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoLCBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCkgfSwgZGlzdGFuY2VUZXg6IHsgdmFsdWU6IG51bGwgfSB9OyB0aGlzLnBWYXIuZGVwZW5kZW5jaWVzID0gW3RoaXMucFZhcl07IHRoaXMuZ3BDLmluaXQoKTsgdGhpcy5jb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3Nlcih0aGlzLnIpOyB0aGlzLmNvbXBvc2VyLmFkZFBhc3MobmV3IFJlbmRlclBhc3ModGhpcy5zY24sIHRoaXMuY2FtKSk7IHRoaXMuYWZ0ZXJJbWFnZVBhc3MgPSBuZXcgQWZ0ZXJpbWFnZVBhc3MoMSk7IHRoaXMuY29tcG9zZXIuYWRkUGFzcyh0aGlzLmFmdGVySW1hZ2VQYXNzKTsgdGhpcy5jb21wb3Nlci5hZGRQYXNzKG5ldyBTaGFkZXJQYXNzKFNTLkxvd1Bhc3NTaGFkZXIpKTsgdGhpcy5jb21wb3Nlci5yZW5kZXJUb1NjcmVlbiA9IDA7IH0gcmVzaXplKHcsIGgpIHsgdGhpcy5zY2FsZS5zZXQodywgaCwgMSk7IGlmICh0aGlzLnRsID49IDEpIHJldHVybjsgdGhpcy5wYXJ0aWNsZUNvdW50ID0gdGhpcy5zejI7IHRoaXMucGFydGljbGVzLnNjYWxlLnNldCh3ICogMC41LCBoICogMC41LCAxKTsgT2JqZWN0LmFzc2lnbih0aGlzLmNhbSwgeyBsZWZ0OiB3IC8gLTIsIHJpZ2h0OiB3IC8gMiwgdG9wOiBoIC8gMiwgYm90dG9tOiBoIC8gLTIgfSk7IHRoaXMuY2FtLnBvc2l0aW9uLnogPSAxOyB0aGlzLmNhbS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7IHRoaXMuY29tcG9zZXIuc2V0U2l6ZSh3ICogZHByLCBoICogZHByKTsgfSBzdGVwKCkgeyB0aGlzLnRsID0gTWF0aC5taW4oMSwgZnJhbWUgLyAxMjgpOyB0aGlzLmFmdGVySW1hZ2VQYXNzLnUudGltZS52YWx1ZSArPSAwLjAxOyB0aGlzLnJwLm1hdGVyaWFsLm9wYWNpdHkgKz0gKDEgLSB0aGlzLnJwLm1hdGVyaWFsLm9wYWNpdHkpICogMC4wMTsgdGhpcy5nZW8uc2V0RHJhd1JhbmdlKDAsIHRoaXMucGFydGljbGVDb3VudCAqIHRoaXMudGwpOyB0aGlzLnBWYXIubWF0ZXJpYWwudW5pZm9ybXMudGltZS52YWx1ZSArPSAwLjAwMTsgdGhpcy5wYXJ0aWNsZXMubWF0ZXJpYWwudW5pZm9ybXMudGltZS52YWx1ZSArPSAwLjAwMTsgdGhpcy5wYXJ0aWNsZXMubWF0ZXJpYWwudW5pZm9ybXMucG9zaXRpb25EYXRhLnZhbHVlID0gdGhpcy5ncEMuZ2V0Q3VycmVudFJlbmRlclRhcmdldCh0aGlzLnBWYXIpLnRleHR1cmU7IHRoaXMuZ3BDLmNvbXB1dGUoKTsgdGhpcy5jb21wb3Nlci5yZW5kZXIoKTsgdGhpcy5ycC5tYXRlcmlhbC5tYXAgPSB0aGlzLmNvbXBvc2VyLnJlYWRCdWZmZXIudGV4dHVyZTsgfSB9OwogICAgY2xhc3MgVm9sdW1ldHJpYyBleHRlbmRzIF8uTWVzaCB7IGNvbnN0cnVjdG9yKHJkKSB7IHN1cGVyKCk7IHRoaXMuZ2VvbWV0cnkgPSBuZXcgXy5QbGFuZUdlb21ldHJ5KDEsIDEpOyB0aGlzLm1hdGVyaWFsID0gbmV3IF8uU2hhZGVyTWF0ZXJpYWwoeyB1bmlmb3JtczogeyByZXM6IHsgdmFsdWU6IG5ldyBfLlZlY3RvcjIoZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAqIDIsIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0ICogMikgfSwgczE6IHsgdmFsdWU6IHdpbmRvdy5zMSB9LCB0bDogeyB2YWx1ZTogMCB9LCB0aW1lOiB7IHZhbHVlOiAwIH0sIGRpc3RhbmNlVGV4OiB7IHZhbHVlOiBudWxsIH0gfSwgdmVydGV4U2hhZGVyOiBTUy5wdGIsIGZyYWdtZW50U2hhZGVyOiBTUy5wb3N0RnJhZywgdHJhbnNwYXJlbnQ6IHRydWUsIGJsZW5kaW5nOiAyIH0pOyB0aGlzLnNjZW5lID0gbmV3IF8uU2NlbmUoKTsgdGhpcy5jYW1lcmEgPSBuZXcgXy5PcnRob2dyYXBoaWNDYW1lcmEoKTsgdGhpcy5wb3NpdGlvbi56ID0gMSB9IHJlc2l6ZSh3LCBoKSB7IHRoaXMuc2NhbGUuc2V0KHcsIGgsIDEpOyBPYmplY3QuYXNzaWduKHRoaXMuY2FtZXJhLCB7IGxlZnQ6IHcgLyAtMiwgcmlnaHQ6IHcgLyAyLCB0b3A6IGggLyAyLCBib3R0b206IGggLyAtMiB9KTsgdGhpcy5jYW1lcmEucG9zaXRpb24ueiA9IDEwOyB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkgfTsgc3RlcCgpIHsgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50aW1lLnZhbHVlICs9IC4wMTsgaWYgKHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGwudmFsdWUgPCAxKSB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRsLnZhbHVlICs9IC4wMSB9IH0KICAgIGNsYXNzIFJheW1hcmNoZXIgZXh0ZW5kcyBfLldlYkdMUmVuZGVyVGFyZ2V0IHsgY29uc3RydWN0b3IodywgaCkgeyBzdXBlcih3LCBoKTsgdGhpcy5zY24gPSBuZXcgXy5TY2VuZSgpOyB0aGlzLmNhbSA9IG5ldyBfLk9ydGhvZ3JhcGhpY0NhbWVyYSgpOyB0aGlzLm1hdCA9IG5ldyBfLlNoYWRlck1hdGVyaWFsKHsgdW5pZm9ybXM6IHsgcmVzOiB7IHZhbHVlOiBuZXcgXy5WZWN0b3IyKHcsIGgpIH0sIHNlZWQ6IHsgdmFsdWU6IHMxIH0sIHNlZWQyOiB7IHZhbHVlOiBzMiB9LCBwYW5uaW5nOiB7IHZhbHVlOiBmYWxzZSB9LCBsaWc6IHsgdmFsdWU6IG5ldyBfLlZlY3RvcjMoMS4wLCAwLiwgMS4zKSB9LCBkdGV4OiB7IHZhbHVlOiBudWxsIH0sIHBhcnRpY2xlU2NhbGU6IHsgdmFsdWU6IDEgfSB9LCB2ZXJ0ZXhTaGFkZXI6IFNTLnB0YiwgZnJhZ21lbnRTaGFkZXI6IFNTLnJheW1hcmNoZXJGcmFnIH0pOyB0aGlzLnNjbi5hZGQobmV3IF8uTWVzaChuZXcgXy5QbGFuZUJ1ZmZlckdlb21ldHJ5KHcsIGgpLCB0aGlzLm1hdCkpOyBPYmplY3QuYXNzaWduKHRoaXMuY2FtLCB7IGxlZnQ6IHcgLyAtMiwgcmlnaHQ6IHcgLyAyLCB0b3A6IGggLyAyLCBib3R0b206IGggLyAtMiB9KS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7IHRoaXMuY2FtLnBvc2l0aW9uLnogPSAxOyB9IH0KICAgIHdpbmRvdy5pc21vYmlsZSA9IC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgIHdpbmRvdy5zMSA9IHsgeDogci5yKCksIHk6IHIucigpLCB6OiByLnIoKSwgdzogci5yKCkgfQogICAgd2luZG93LnMyID0geyB4OiByLnIoKSwgeTogci5yKCksIHo6IHIucigpLCB3OiByLnIoKSB9OwogICAgd2luZG93LmRwciA9IDIKICAgIGlmICghb3B0aW9ucy5pc1JlbmRlcmVyKSB3aW5kb3cuZHByID0gd2luZG93LmRldmljZVBpeGVsUmF0aW8KICAgIHdpbmRvdy5wYXJ0aWNsZVNjYWxlID0gMTsKICAgIHdpbmRvdy5mcmFtZSA9IDA7CiAgICB3aW5kb3cucXVhbGl0eSA9IDE7CiAgICBpZiAobG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkgPT0gJ2xvdycpIHdpbmRvdy5xdWFsaXR5ID0gMjsKICAgIGlmIChsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSA9PSAnbWluJykgd2luZG93LnF1YWxpdHkgPSAzOwogICAgaWYgKCFvcHRpb25zLmlzUmVuZGVyZXIpIHdpbmRvdy5xdWFsaXR5ID0gMjsKICAgIGxldCBkb25lU2VudCA9IGZhbHNlOwogICAgY2xhc3MgTWFpbiB7CiAgICAgIGNvbnN0cnVjdG9yKCkgeyB0aGlzLm4gPSBkb2N1bWVudC5ib2R5OyB0aGlzLmMgPSBuZXcgXy5PcnRob2dyYXBoaWNDYW1lcmEoKTsgdGhpcy5zID0gbmV3IF8uU2NlbmUoKTsgdGhpcy5yID0gbmV3IF8uV2ViR0xSZW5kZXJlcih7IGFscGhhOiB0cnVlLCBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsIGFudGlhbGlhczogdHJ1ZSB9KTsgdGhpcy5yLnNldENsZWFyQ29sb3IobmV3IF8uQ29sb3IoMHgwNjA2MDYpKTsgdGhpcy5yLnNldFBpeGVsUmF0aW8oZHByKTsgdGhpcy5uLmFwcGVuZENoaWxkKHRoaXMuci5kb21FbGVtZW50KTsgbGV0IGRhdGFUZXh0dXJlID0gbmV3IF8uRGF0YVRleHR1cmUobmV3IEZsb2F0MzJBcnJheSgxMDQ4NTc2KS5maWxsKCkubWFwKCgpID0+IHIucigpKSwgMTI4LCAxMjgsIDEwMjMsIDEwMTUsIDMwMCk7IHRoaXMucHJ0ID0gbmV3IFBhcnRpY2xlcyh0aGlzLnIpOyB0aGlzLnZvbCA9IG5ldyBWb2x1bWV0cmljKHRoaXMucik7IHRoaXMucy5hZGQodGhpcy5wcnQsIHRoaXMudm9sKTsgdGhpcy5wYXNzID0gbmV3IFJheW1hcmNoZXIodGhpcy5uLm9mZnNldFdpZHRoICogKDEgLyB3aW5kb3cucXVhbGl0eSksIHRoaXMubi5vZmZzZXRIZWlnaHQgKiAoMSAvIHdpbmRvdy5xdWFsaXR5KSk7IHRoaXMucGFzcy5tYXQudW5pZm9ybXMuZHRleC52YWx1ZSA9IGRhdGFUZXh0dXJlOyBkYXRhVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IDE7IHRoaXMuci5zZXRSZW5kZXJUYXJnZXQodGhpcy5wYXNzKTsgdGhpcy5yLnJlbmRlcih0aGlzLnBhc3Muc2NuLCB0aGlzLnBhc3MuY2FtKTsgdGhpcy5yLnNldFJlbmRlclRhcmdldChudWxsKTsgdGhpcy5wcnQucFZhci5tYXRlcmlhbC51bmlmb3Jtcy5kaXN0YW5jZVRleC52YWx1ZSA9IHRoaXMucGFzcy50ZXh0dXJlOyB0aGlzLnBydC5tYXQudW5pZm9ybXMuZGlzdGFuY2VUZXgudmFsdWUgPSB0aGlzLnBhc3MudGV4dHVyZTsgdGhpcy52b2wubWF0ZXJpYWwudW5pZm9ybXMuZGlzdGFuY2VUZXgudmFsdWUgPSB0aGlzLnBhc3MudGV4dHVyZTsgdGhpcy5wcnQuYWZ0ZXJJbWFnZVBhc3MudS5tYXNrLnZhbHVlID0gdGhpcy5wYXNzLnRleHR1cmU7IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZSgpKTsgdGhpcy5yZXNpemUoKTsgc2V0VGltZW91dChfID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnN0ZXAoKSksIDEwMDApOyB9IHJlc2l6ZSgpIHsgbGV0IFt3LCBoXSA9IFt0aGlzLm4ub2Zmc2V0V2lkdGgsIHRoaXMubi5vZmZzZXRIZWlnaHRdOyB0aGlzLnIuc2V0U2l6ZSh3LCBoKTsgT2JqZWN0LmFzc2lnbih0aGlzLmMsIHsgbGVmdDogdyAvIC0yLCByaWdodDogdyAvIDIsIHRvcDogaCAvIDIsIGJvdHRvbTogaCAvIC0yIH0pOyB0aGlzLmMucG9zaXRpb24ueiA9IDEwMDsgdGhpcy5jLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsgdGhpcy5zLmNoaWxkcmVuLmZvckVhY2goYyA9PiB7IGlmIChjLnJlc2l6ZSkgYy5yZXNpemUodywgaCkgfSk7IGlmIChmcmFtZSA+PSAxMDIzKSB0aGlzLnIucmVuZGVyKHRoaXMucywgdGhpcy5jKTsgfSByZW5kZXIoKSB7IHRoaXMucy5jaGlsZHJlbi5mb3JFYWNoKGMgPT4geyBpZiAoYy5zdGVwKSBjLnN0ZXAoKSB9KTsgdGhpcy5yLnJlbmRlcih0aGlzLnMsIHRoaXMuYyk7IH0KICAgICAgc3RlcCh0KSB7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQgPT4gdGhpcy5zdGVwKHQpKTsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgIGlmIChmcmFtZSA8IDMwMDApIGZyYW1lKys7CiAgICAgICAgaWYgKGZyYW1lID09IDMwMDApIHsKICAgICAgICAgIGlmICghZG9uZVNlbnQpIHsKICAgICAgICAgICAgb25Eb25lKCkKICAgICAgICAgICAgY29uc29sZS5sb2coJ2RvbmUnKQogICAgICAgICAgICBkb25lU2VudCA9IHRydWUKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHdpbmRvdy5vbmxvYWQgPSAoKSA9PiBuZXcgTWFpbigpOwogICAgbGV0IHNoYXBlID0gJycKICAgIGlmIChzMS54IDwgMC4xKSBzaGFwZSA9ICdFcmVjaHRoZWlvbicKICAgIGlmIChzMS54ID49IDAuMSAmJiBzMS54IDwgMC40KSBzaGFwZSA9ICdEb21pdGlhJwogICAgaWYgKHMxLnggPj0gMC40ICYmIHMxLnggPCAwLjcpIHNoYXBlID0gJ0hhZHJpYW5hJwogICAgaWYgKHMxLnggPj0gMC43KSBzaGFwZSA9ICdWaXR1cycKCiAgICBsZXQgbGRpciA9ICcnOwogICAgaWYgKHMxLncgPCAwLjUpIGxkaXIgPSBNYXRoLmZsb29yKHMxLncgLyAwLjUgKiA5MCkgKyAnwrAgfiBXZXN0JwogICAgZWxzZSBsZGlyID0gTWF0aC5mbG9vcigoczEudyAtIDAuNSkgLyAwLjUgKiA5MCkgKyAnwrAgfiBFYXN0JwogICAgd2luZG93Lk1FVEFEQVRBID0gewogICAgICAnU2hhcGUnOiBzaGFwZSwKICAgICAgJ0ZvZyBJbnRlbnNpdHknOiBNYXRoLmZsb29yKHMxLnogKiAxMDApICsgJyUnLAogICAgICAnTGlnaHQgRGlyZWN0aW9uJzogbGRpcgogICAgfQogICAgb25NZXRhZGF0YSgpOzwvc2NyaXB0Pgo8L2JvZHk+Cg==","attributes":[{"trait_type":"Shape","value":"Vitus"},{"trait_type":"Fog Intensity","value":"57%"},{"trait_type":"Light Direction","value":"48° ~ East"}]}