@next2d/core 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@next2d/core",
3
- "version": "2.3.0",
3
+ "version": "2.4.0",
4
4
  "description": "Next2D Core Package",
5
5
  "author": "Toshiyuki Ienaga<ienaga@next2d.app> (https://github.com/ienaga/)",
6
6
  "license": "MIT",
@@ -24,15 +24,15 @@
24
24
  "url": "git+https://github.com/Next2D/Player.git"
25
25
  },
26
26
  "dependencies": {
27
- "@next2d/core": "2.3.0",
28
- "@next2d/display": "2.3.0",
29
- "@next2d/events": "2.3.0",
30
- "@next2d/filters": "2.3.0",
31
- "@next2d/geom": "2.3.0",
32
- "@next2d/media": "2.3.0",
33
- "@next2d/net": "2.3.0",
34
- "@next2d/text": "2.3.0",
35
- "@next2d/ui": "2.3.0",
36
- "@next2d/render-queue": "2.3.0"
27
+ "@next2d/core": "2.4.0",
28
+ "@next2d/display": "2.4.0",
29
+ "@next2d/events": "2.4.0",
30
+ "@next2d/filters": "2.4.0",
31
+ "@next2d/geom": "2.4.0",
32
+ "@next2d/media": "2.4.0",
33
+ "@next2d/net": "2.4.0",
34
+ "@next2d/text": "2.4.0",
35
+ "@next2d/ui": "2.4.0",
36
+ "@next2d/render-queue": "2.4.0"
37
37
  }
38
38
  }
package/src/Next2D.js CHANGED
@@ -204,6 +204,6 @@ export class Next2D {
204
204
  * @public
205
205
  */
206
206
  async captureToCanvas(display_object, opstions = null) {
207
- return captureToCanvasUseCase(display_object, opstions);
207
+ return await captureToCanvasUseCase(display_object, opstions);
208
208
  }
209
209
  }
@@ -1 +1 @@
1
- export const workerInlineUrl = 'data:application/javascript;base64,IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgbjtsZXQgcjtjb25zdCBhPShlLHQsbixyPW51bGwpPT57Y29uc3QgYT0rZTtyZXR1cm4gaXNOYU4oYSkmJm51bGwhPT1yP3I6TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihhKT8wOmEpLG4pfSxzPVtdLG89KC4uLmUpPT57Y29uc3QgdD1zLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxpPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCkscy5wdXNoKGUpKX0sYz1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxsPVtdLHU9KGU9MCx0PTAsbj0wLHI9MCk9Pntjb25zdCBhPWwucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGFbMF09ZSxhWzFdPXQsYVsyXT1uLGFbM109cixhfSxoPWU9PntsLnB1c2goZSl9LGI9W10sZD0oZT0wLHQ9MCxuPTAscj0wLGE9MCxzPTAsbz0wLGk9MCxjPTApPT57Y29uc3QgbD1iLnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBsWzBdPWUsbFsxXT10LGxbMl09bixsWzNdPXIsbFs0XT1hLGxbNV09cyxsWzZdPW8sbFs3XT1pLGxbOF09YyxsfSxmPVtdLG09KGU9MCx0PTAsbj0wLHI9MCxhPTAscz0wKT0+e2NvbnN0IG89Zi5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gb1swXT1lLG9bMV09dCxvWzJdPW4sb1szXT1yLG9bNF09YSxvWzVdPXMsb30sdj1lPT57Zi5wdXNoKGUpfSxfPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLG49ZVszXSplWzddLWVbNF0qZVs2XSxyPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIGQoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAsbip0LHIqdCwxKX07bGV0IHA9MCxnPTA7Y29uc3QgeD0oKT0+cCxFPSgpPT5nO2xldCBBPTE7Y29uc3QgeT0oKT0+QSxUPShlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO1IubGVuZ3RoPHR8fE0ucHVzaChSLnNsaWNlKDApKSxSLmxlbmd0aD0wfSxSPW8oKSxNPW8oKSx3PShlPSExKT0+KFQoZSksTSksRj0oZSx0LG4pPT57Ui5wdXNoKGUsdCxuKX0sJD0oZSx0KT0+e2NvbnN0IG49Ui5sZW5ndGgscj0rUltuLTNdLGE9K1Jbbi0yXTtyZXR1cm4gZT09PXImJnQ9PT1hfSxPPShlLHQpPT57Ui5sZW5ndGg/JChlLHQpfHwoVCgpLEYoZSx0LCExKSk6RihlLHQsITEpfSxTPShlLHQsbixyKT0+e1IubGVuZ3RofHxPKDAsMCksJChuLHIpfHwoRihlLHQsITApLEYobixyLCExKSl9LGs9bmV3IEZsb2F0MzJBcnJheSgzMiksQz0oZSx0LG4scixhLHMsbyxpLGMsbCk9Pntjb25zdCB1PS4xMjUqKGUrMyoobithKStvKSxoPS4xMjUqKHQrMyoocitzKStpKSxiPS4xMjUqKG8rYS1uLWUpLGQ9LjEyNSooaStzLXItdCk7a1tjXT1lLGtbYysxXT10LGtbYysyXT0uNSooZStuKSxrW2MrM109LjUqKHQrciksa1tjKzRdPXUtYixrW2MrNV09aC1kLGtbYys2XT11LGtbYys3XT1oLGtbbF09dSxrW2wrMV09aCxrW2wrMl09dStiLGtbbCszXT1oK2Qsa1tsKzRdPS41KihhK28pLGtbbCs1XT0uNSoocytpKSxrW2wrNl09byxrW2wrN109aX0sUD0oZSx0LG4scixhLHMsbyxpLGMpPT57Y29uc3QgbD0uMTI1KihlKzMqKG4rYSkrbyksdT0uMTI1Kih0KzMqKHIrcykraSk7a1tjXT0uMjUqZSsuNzUqbixrW2MrMV09LjI1KnQrLjc1KnIsa1tjKzJdPWwsa1tjKzNdPXUsa1tjKzRdPS43NSphKy4yNSpvLGtbYys1XT0uNzUqcysuMjUqaSxrW2MrNl09byxrW2MrN109aX0sQj0oZSx0LG4scixhLHMpPT57aWYoUi5sZW5ndGh8fE8oMCwwKSwkKGEscykpcmV0dXJuO2NvbnN0IG89Ui5sZW5ndGgsaT0oKGUsdCxuLHIsYSxzLG8saSk9PihDKGUsdCxuLHIsYSxzLG8saSwwLDE2KSxDKGtbMF0sa1sxXSxrWzJdLGtbM10sa1s0XSxrWzVdLGtbNl0sa1s3XSwwLDgpLEMoa1sxNl0sa1sxN10sa1sxOF0sa1sxOV0sa1syMF0sa1syMV0sa1syMl0sa1syM10sMTYsMjQpLFAoa1swXSxrWzFdLGtbMl0sa1szXSxrWzRdLGtbNV0sa1s2XSxrWzddLDApLFAoa1s4XSxrWzldLGtbMTBdLGtbMTFdLGtbMTJdLGtbMTNdLGtbMTRdLGtbMTVdLDgpLFAoa1sxNl0sa1sxN10sa1sxOF0sa1sxOV0sa1syMF0sa1syMV0sa1syMl0sa1syM10sMTYpLFAoa1syNF0sa1syNV0sa1syNl0sa1syN10sa1syOF0sa1syOV0sa1szMF0sa1szMV0sMjQpLGspKSgrUltvLTNdLCtSW28tMl0sZSx0LG4scixhLHMpO2ZvcihsZXQgZT0wOzMyPmU7KVMoaVtlKytdLGlbZSsrXSxpW2UrK10saVtlKytdKX0sST1bXSxMPWU9PntsZXQgdD0tMSxuPUkubGVuZ3RoO2Zvcig7TWF0aC5hYnMobi10KT4xOyl7Y29uc3Qgcj1NYXRoLmZsb29yKChuK3QpLzIpO2U8PUlbcl0uYXJlYT9uPXI6dD1yfXJldHVybiBufSxVPWU9PntuLmRlbGV0ZVRleHR1cmUoZS5yZXNvdXJjZSl9LE49W107bGV0IEQ9MDtjb25zdCBqPShlLHQpPT4oe2lkOkQrKyxyZXNvdXJjZTpuLmNyZWF0ZVRleHR1cmUoKSx3aWR0aDplLGhlaWdodDp0LGFyZWE6ZSp0LHNtb290aDohMX0pO2xldCBYPS0xO2NvbnN0IHo9ZT0+e1g9ZX0sVj1bbnVsbCxudWxsLG51bGxdO2xldCBXPTA7Y29uc3QgRz1lPT57aWYoIUkubGVuZ3RoKXJldHVybigoKT0+e2NvbnN0IGU9e2lkOjAscmVzb3VyY2U6bi5jcmVhdGVSZW5kZXJidWZmZXIoKSx3aWR0aDowLGhlaWdodDowLGFyZWE6MCxkaXJ0eTohMX07cmV0dXJue3Jlc291cmNlOm4uY3JlYXRlUmVuZGVyYnVmZmVyKCksc3RlbmNpbDplLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfX0pKCk7Y29uc3QgdD1MKGUpO2lmKHQ8SS5sZW5ndGgpe2NvbnN0IGU9SVt0XTtyZXR1cm4gSS5zcGxpY2UodCwxKSxlfWNvbnN0IHI9SS5zaGlmdCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigidGhlIGNvbG9yIGJ1ZmZlciBpcyB2b2lkLiIpO3JldHVybiByfTtsZXQgWT0wO2NvbnN0IHE9KGUsdCk9PntpZighTi5sZW5ndGgpcmV0dXJue2lkOlkrKyxyZXNvdXJjZTpuLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtmb3IobGV0IG49MDtuPE4ubGVuZ3RoOysrbil7Y29uc3Qgcj1OW25dO2lmKHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXQpcmV0dXJuIE4uc3BsaWNlKG4sMSkscn1yZXR1cm4gTi5zaGlmdCgpfSxLPShlLHQscj0hMSk9Pntjb25zdCBhPWooZSx0KTtyZXR1cm4oKGUsdD0hMSk9PntYIT09bi5URVhUVVJFMCYmKHoobi5URVhUVVJFMCksbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTApKSxWWzBdPWUsbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQsZS5yZXNvdXJjZSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9TLG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9ULG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUix0P24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUix0P24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhTdG9yYWdlMkQobi5URVhUVVJFXzJELDEsbi5SR0JBOCxlLndpZHRoLGUuaGVpZ2h0KX0pKGEsciksYX0sSD0oZSxyLGE9ITEpPT57Y29uc3Qgcz1iZS5sZW5ndGg/YmUuc2hpZnQoKTp7aWQ6VysrLHdpZHRoOjAsaGVpZ2h0OjAsY2xpcExldmVsOjAsbXNhYTohMSxtYXNrOiExLGNvbG9yOm51bGwsdGV4dHVyZTpudWxsLHN0ZW5jaWw6bnVsbH07cmV0dXJuIHMud2lkdGg9ZSxzLmhlaWdodD1yLGE/KHMubXNhYT0hMCxzLnRleHR1cmU9bnVsbCxzLmNvbG9yPSgoZSxyKT0+e2U9TWF0aC5tYXgoMjU2LGMoZSkpLHI9TWF0aC5tYXgoMjU2LGMocikpO2NvbnN0IGE9RyhlKnIpO3JldHVybihhLndpZHRoPGV8fGEuaGVpZ2h0PHIpJiYoZT1NYXRoLm1heChlLGEud2lkdGgpLHI9TWF0aC5tYXgocixhLmhlaWdodCksYS53aWR0aD1lLGEuaGVpZ2h0PXIsYS5hcmVhPWUqcixuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsYS5yZXNvdXJjZSksbi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUobi5SRU5ERVJCVUZGRVIsdCxuLlJHQkE4LGUsciksbi5iaW5kUmVuZGVyYnVmZmVyKG4uUkVOREVSQlVGRkVSLGEuc3RlbmNpbC5yZXNvdXJjZSksbi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUobi5SRU5ERVJCVUZGRVIsdCxuLlNURU5DSUxfSU5ERVg4LGUscikpLGEuZGlydHk9ITAsYX0pKGUscikscy5zdGVuY2lsPXMuY29sb3Iuc3RlbmNpbCk6KHMubXNhYT0hMSxzLnRleHR1cmU9SyhlLHIpLHMuY29sb3I9bnVsbCxzLnN0ZW5jaWw9KChlLHQpPT57Y29uc3Qgcj1xKGUsdCk7cmV0dXJuIHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXR8fChyLndpZHRoPWUsci5oZWlnaHQ9dCxyLmFyZWE9ZSp0LHIuZGlydHk9ITEsbi5iaW5kUmVuZGVyYnVmZmVyKG4uUkVOREVSQlVGRkVSLHIucmVzb3VyY2UpLG4ucmVuZGVyYnVmZmVyU3RvcmFnZShuLlJFTkRFUkJVRkZFUixuLlNURU5DSUxfSU5ERVg4LGUsdCkpLHJ9KShlLHIpKSxzLm1hc2s9ITEscy5jbGlwTGV2ZWw9MCxzfTtsZXQgWj0wO2NvbnN0IFE9ZT0+e1o9ZX0sSj0oKT0+WixlZT1bXSx0ZT0oKT0+e3ZhciB0O3JldHVybiBaIGluIGVlfHwodD1IKGUsZSwhMCksZWVbWl09dCksZWVbWl19LG5lPVtdO2xldCByZT1udWxsO2NvbnN0IGFlPSgpPT4ocmV8fChyZT0oKCk9Pntjb25zdCB0PWooZSxlKTtyZXR1cm4gbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTMpLG4uYmluZFRleHR1cmUobi5URVhUVVJFXzJELHQucmVzb3VyY2UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfUyxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfVCxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01JTl9GSUxURVIsbi5MSU5FQVIpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01BR19GSUxURVIsbi5ORUFSRVNUKSxuLnRleFN0b3JhZ2UyRChuLlRFWFRVUkVfMkQsMSxuLlJHQkE4LHQud2lkdGgsdC5oZWlnaHQpLG4uYWN0aXZlVGV4dHVyZSgtMSE9PVg/WDpuLlRFWFRVUkUwKSx0fSkoKSkscmUpLHNlPVtdLG9lPWU9PihlIGluIHNlfHwoc2VbZV09bmV3IEZsb2F0MzJBcnJheShbTnVtYmVyLk1BWF9WQUxVRSxOdW1iZXIuTUFYX1ZBTFVFLC1OdW1iZXIuTUFYX1ZBTFVFLC1OdW1iZXIuTUFYX1ZBTFVFXSkpLHNlW2VdKSxpZT1bXSxjZT1lPT4oZSBpbiBpZXx8KGllW2VdPW5ldyBGbG9hdDMyQXJyYXkoW051bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRV0pKSxpZVtlXSk7bGV0IGxlPTA7Y29uc3QgdWU9ZT0+e2xlPWV9LGhlPSgpPT5sZSxiZT1bXTtsZXQgZGU7bGV0IGZlPW51bGw7bGV0IG1lPW51bGw7bGV0IHZlPW51bGw7Y29uc3QgX2U9ZT0+e3ZlPWV9LHBlPSgpPT52ZTtsZXQgZ2U9ITE7Y29uc3QgeGU9ZT0+e2dlPWV9LEVlPSgpPT5nZTtsZXQgQWU9bnVsbCx5ZT1udWxsLFRlPW51bGwsUmU9bnVsbDtjb25zdCBNZT0oKT0+eWUsd2U9KGUsdD0hMCk9Pnt2YXIgcjtlLm1zYWE/KChlPT57aWYoSS5pbmRleE9mKGUpPi0xKXJldHVybjtjb25zdCB0PUwoZS5hcmVhKTtlLmRpcnR5PSEwLEkuc3BsaWNlKHQsMCxlKX0pKGUuY29sb3IpLGUuY29sb3I9bnVsbCxlLnN0ZW5jaWw9bnVsbCk6KHQmJlUoZS50ZXh0dXJlKSxlLnRleHR1cmU9bnVsbCxyPWUuc3RlbmNpbCxOLmluZGV4T2Yocik+LTF8fChOLmxlbmd0aD4xMD9uLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLnJlc291cmNlKTooci5kaXJ0eT0hMCxOLnB1c2gocikpKSxlLnN0ZW5jaWw9bnVsbCksYmUucHVzaChlKX0sRmU9KCk9PntuZS5sZW5ndGg9MCxRKDApO2NvbnN0IGU9ZWU7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspd2UoZVt0XSk7ZS5sZW5ndGg9MH0sJGU9KGUsdCxyLGE9ITApPT57aWYoZS5jbGVhckFycmF5c0luc3RhbmNlZCgpLGUuJHN0YWNrQXR0YWNobWVudE9iamVjdC5sZW5ndGgpZm9yKGxldCB0PTA7dDxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoOysrdCl7Y29uc3Qgbj1lLiRzdGFja0F0dGFjaG1lbnRPYmplY3RbdF07biYmd2Uobil9ZWxzZSBlLiRtYWluQXR0YWNobWVudE9iamVjdCYmd2UoZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QpO2EmJkZlKCksX2UobnVsbCksRWUoKSYmKHhlKCExKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLG51bGwpKSxlLiRtYWluQXR0YWNobWVudE9iamVjdD1IKHQsciwhMCksZS5iaW5kKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KX0sT2U9KGUsdCxyPW51bGwsYT0hMSk9PnstMSE9PVgmJnQ9PT1YfHwoeih0KSxuLmFjdGl2ZVRleHR1cmUodCkpO2NvbnN0IHM9VltlXTtudWxsIT09cyYmbnVsbCE9PXImJnMuaWQ9PT1yLmlkfHxyPT09c3x8KFZbZV09cixuLmJpbmRUZXh0dXJlKG4uVEVYVFVSRV8yRCxyP3IucmVzb3VyY2U6bnVsbCksciYmci5zbW9vdGghPT1hJiYoci5zbW9vdGg9YSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NSU5fRklMVEVSLGE/bi5MSU5FQVI6bi5ORUFSRVNUKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NQUdfRklMVEVSLGE/bi5MSU5FQVI6bi5ORUFSRVNUKSkpfSxTZT0oZSx0PSExKT0+e09lKDIsbi5URVhUVVJFMixudWxsKSxPZSgxLG4uVEVYVFVSRTEsbnVsbCksT2UoMCxuLlRFWFRVUkUwLGUsdCl9LGtlPSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PWUuY2xpcExldmVsO2xldCBhPTA7Zm9yKGxldCBlPTA7ZTx0OysrZSlhfD0oMTw8dC1lKS0xO24uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uRVFVQUwsMjU1JmEsYSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uS0VFUCxuLktFRVApLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9O2xldCBDZT0hMTtjb25zdCBQZT1lPT57Q2U9ZX0sQmU9KCk9PkNlLEllPW5ldyBNYXAsTGU9bmV3IE1hcCxVZT0oZSx0KT0+e2NvbnN0IHI9cGUoKTtpZihyJiZ0LmlkPT09ci5pZClyZXR1cm47dmFyIGEsczsoZT0+e19lKGUpLEVlKCl8fCh4ZSghMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixkZSkpLGUubXNhYT8obi5iaW5kUmVuZGVyYnVmZmVyKG4uUkVOREVSQlVGRkVSLGUuY29sb3IucmVzb3VyY2UpLG4uZnJhbWVidWZmZXJSZW5kZXJidWZmZXIobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uUkVOREVSQlVGRkVSLGUuY29sb3IucmVzb3VyY2UpKTooU2UoZS50ZXh0dXJlKSxuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsZS50ZXh0dXJlLnJlc291cmNlLDApKSxuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKSxuLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKG4uRlJBTUVCVUZGRVIsbi5TVEVOQ0lMX0FUVEFDSE1FTlQsbi5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKX0pKHQpLHImJnIud2lkdGg9PT10LndpZHRoJiZyLmhlaWdodD09PXQuaGVpZ2h0fHwoYT10LndpZHRoLHM9dC5oZWlnaHQscD1hLGc9cyxuLnZpZXdwb3J0KDAsMCx0LndpZHRoLHQuaGVpZ2h0KSk7Y29uc3Qgbz10Lm1zYWE/dC5jb2xvcjp0LnN0ZW5jaWw7dmFyIGk7by5kaXJ0eSYmKG8uZGlydHk9ITEsZS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpKSwhKGk9dC5tYXNrKSYmQmUoKT8oUGUoITEpLG4uZGlzYWJsZShuLlNURU5DSUxfVEVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSk6aSYmIUJlKCkmJihQZSghMCksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLGtlKCkpfSxOZT1lPT57aWYoIWUuJHN0YWNrLmxlbmd0aClyZXR1cm47Y29uc3QgdD1lLiRzdGFjay5wb3AoKTt2YXIgbjtlLiRtYXRyaXhbMF09dFswXSxlLiRtYXRyaXhbMV09dFsxXSxlLiRtYXRyaXhbM109dFszXSxlLiRtYXRyaXhbNF09dFs0XSxlLiRtYXRyaXhbNl09dFs2XSxlLiRtYXRyaXhbN109dFs3XSxuPXQsYi5wdXNoKG4pfSxEZT0oZSx0LHIsYSk9PntuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUsdCxyKzEsYSsxKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5zY2lzc29yKGUsdCxyLGEpfSxqZT0oZSx0LG4scixhLHMsbyxpLGMsbCx1LGgsYik9Pntjb25zdCBkPWUubGVuZ3RoLTU7Zm9yKGxldCBmPTM7ZjxkO2YrPTMpe2xldCBkPTE3Km47ZVtmKzJdPyh0W2QrK109ZVtmLTNdLHRbZCsrXT1lW2YtMl0sdFtkKytdPTAsdFtkKytdPTAsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZl0sdFtkKytdPWVbZisxXSx0W2QrK109LjUsdFtkKytdPTAsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZiszXSx0W2QrK109ZVtmKzRdLHRbZCsrXT0xLHRbZCsrXT0xLHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wKTplW2YrNV0/KHRbZCsrXT1lWzBdLHRbZCsrXT1lWzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZl0sdFtkKytdPWVbZisxXSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wLHRbZCsrXT1lW2YrNl0sdFtkKytdPWVbZis3XSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wKToodFtkKytdPWVbMF0sdFtkKytdPWVbMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZiszXSx0W2QrK109ZVtmKzRdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApLG4rPTN9cmV0dXJuIG59LFhlPShlLHQ9ImZpbGwiKT0+e2NvbnN0IG49ImZpbGwiPT09dD9yLiRmaWxsU3R5bGU6ci4kc3Ryb2tlU3R5bGUsYT1uWzBdLHM9blsxXSxvPW5bMl0saT1uWzNdLGM9ci4kbWF0cml4LGw9eCgpLHU9RSgpLGg9Y1swXS9sLGI9Y1szXS9sLGQ9Y1s2XS9sLGY9Y1sxXS91LG09Y1s0XS91LHY9Y1s3XS91O2xldCBfPTA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpXys9NTEqKGVbdF0ubGVuZ3RoLzMtMik7Y29uc3QgcD1uZXcgRmxvYXQzMkFycmF5KF8pO2xldCBnPTA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpZz1qZShlW3RdLHAsZyxoLGYsYixtLGQsdixhLHMsbyxpKTtyZXR1cm57YnVmZmVyOnAsaW5kZXhDb3VudDpnfX07bGV0IHplPW5ldyBGbG9hdDMyQXJyYXkoMTI4KSxWZT0wO2NvbnN0IFdlPWU9Pntjb25zdCB0PWUubGVuZ3RoK1ZlO2lmKHQ+emUubGVuZ3RoKXtjb25zdCByPW5ldyBGbG9hdDMyQXJyYXkoKG49dCxuLS0sbnw9bj4+MSxufD1uPj4yLG58PW4+PjQsbnw9bj4+OCxufD1uPj4xNiwrK24pKTtyLnNldCh6ZSksci5zZXQoZSxWZSksemU9cn1lbHNlIHplLnNldChlLFZlKTt2YXIgbjtWZSs9ZS5sZW5ndGh9LEdlPVtdLFllPVtdLHFlPSgpPT57WWUubGVuZ3RoPTAsVmU9MCxHZS5sZW5ndGg9MH0sS2U9W10sSGU9KGUsdCxuKT0+e2NvbnN0IHI9e3g6dC54LWUueCx5OnQueS1lLnl9LGE9KChlLHQsbik9Pntjb25zdCByPU1hdGguc3FydChlKmUrdCp0KTtyZXR1cm57eDotdC9yKm4seTplL3Iqbn19KShyLngsci55LG4pLHM9e3g6ZS54K2EueCx5OmUueSthLnl9LG89e3g6dC54K2EueCx5OnQueSthLnl9LGk9e3g6ZS54LWEueCx5OmUueS1hLnl9LGM9e3g6dC54LWEueCx5OnQueS1hLnl9O3JldHVybltzLngscy55LCExLG8ueCxvLnksITEsYy54LGMueSwhMSxpLngsaS55LCExLHMueCxzLnksITFdfSxaZT0oZSx0LG4pPT4oe3g6ZS54Kyh0LngtZS54KSpuLHk6ZS55Kyh0LnktZS55KSpufSksUWU9KGUsdCxuLHI9LjUpPT57Y29uc3QgYT1aZShlLHQscikscz1aZSh0LG4sciksbz1aZShhLHMscik7cmV0dXJuW1tlLGEsb10sW28scyxuXV19LEplPShlLHQsbixyKT0+KHt4OigxLWUpKioyKnQueCsyKigxLWUpKmUqbi54K2UqKjIqci54LHk6KDEtZSkqKjIqdC55KzIqKDEtZSkqZSpuLnkrZSoqMipyLnl9KSxldD0oZSx0LG4scik9Pih7eDoyKigxLWUpKihuLngtdC54KSsyKmUqKHIueC1uLngpLHk6MiooMS1lKSoobi55LXQueSkrMiplKihyLnktbi55KX0pLHR0PWU9Pntjb25zdCB0PU1hdGguc3FydChlLngqZS54K2UueSplLnkpO3JldHVybiAwPT09dD97eDowLHk6MH06e3g6ZS54L3QseTplLnkvdH19LG50PShlLHQsbixyKT0+e2NvbnN0IGE9WzAsLjUsMV0scz1bXTtmb3IobGV0IG89MDtvPGEubGVuZ3RoOysrbyl7Y29uc3QgaT1hW29dLGM9SmUoaSxlLHQsbiksbD1ldChpLGUsdCxuKSx1PXR0KHt4Oi1sLnkseTpsLnh9KTtzLnB1c2goe3g6Yy54K3UueCpyLHk6Yy55K3UueSpyfSl9cmV0dXJuIHN9LHJ0PShlLHQsbixyKT0+e2NvbnN0IGE9KChlLHQsbixyPTQpPT57bGV0IGE9W1tlLHQsbl1dO2ZvcihsZXQgZT0wO2U8cjsrK2Upe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDsrK3Qpe2NvbnN0IG49YVt0XTtpZighbiljb250aW51ZTtjb25zdCByPVFlKG5bMF0sblsxXSxuWzJdLC41KTtlLnB1c2goclswXSxyWzFdKX1hPWV9cmV0dXJuIGF9KShlLHQsbiw1KSxzPVtdLG89W107Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDsrK2Upe2NvbnN0W3QsbixpXT1hW2VdO3MucHVzaChudCh0LG4saSwrcikpLG8ucHVzaChudCh0LG4saSwtcikpfWNvbnN0IGk9c1swXVswXSxjPVtpLngsaS55LCExXTtmb3IobGV0IGU9MDtlPHMubGVuZ3RoOysrZSl7Y29uc3QgdD1zW2VdO2MucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfWNvbnN0IGw9Wy4uLm9dLnJldmVyc2UoKTtmb3IobGV0IGU9MDtlPGwubGVuZ3RoOysrZSl7Y29uc3RbdCxuLHJdPWxbZV07bFtlXT1bcixuLHRdfWNvbnN0IHU9bFswXVswXTtjLnB1c2godS54LHUueSwhMSk7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDsrK2Upe2NvbnN0IHQ9bFtlXTtjLnB1c2godFsxXS54LHRbMV0ueSwhMCx0WzJdLngsdFsyXS55LCExKX1yZXR1cm4gY30sYXQ9KGUsdCxuLHIpPT57Y29uc3QgYT1bXTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoO3MrPTMpe2lmKHJbcysyXSljb250aW51ZTtjb25zdCBvPXJbc10saT1yW3MrMV07TWF0aC5zcXJ0KE1hdGgucG93KG8tZSwyKStNYXRoLnBvdyhpLXQsMikpPT09biYmYS5wdXNoKG8saSl9cmV0dXJuIGF9LHN0PW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKS5nZXRDb250ZXh0KCIyZCIpLG90PShlLHQpPT57c3QuYmVnaW5QYXRoKCksc3QubW92ZVRvKHRbMF0sdFsxXSk7Zm9yKGxldCBlPTM7ZTx0Lmxlbmd0aDtlKz0zKXRbZSsyXT8oc3QucXVhZHJhdGljQ3VydmVUbyh0W2VdLHRbZSsxXSx0W2UrM10sdFtlKzRdKSxlKz0zKTpzdC5saW5lVG8odFtlXSx0W2UrMV0pO3N0LmNsb3NlUGF0aCgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil7Y29uc3Qgbj1lW3RdLHI9ZVt0KzFdO2lmKCFzdC5pc1BvaW50SW5QYXRoKG4scikpcmV0dXJuW24scl19cmV0dXJuIG51bGx9LGl0PShlLHQsbixyLGE9ITEpPT57Y29uc3Qgcz1hPzA6ci5sZW5ndGgtMSxvPWE/ci5sZW5ndGgtMTpyLmxlbmd0aC0yLGk9YXQoZSx0LG4scltzXSksYz1hdChlLHQsbixyW29dKSxsPW90KGkscltvXSk7aWYoIWwpcmV0dXJuO2NvbnN0IHU9b3QoYyxyW3NdKTtpZighdSlyZXR1cm47Y29uc3QgaD1NYXRoLmF0YW4yKGxbMV0tdCxsWzBdLWUpO2xldCBiPU1hdGguYXRhbjIodVsxXS10LHVbMF0tZSktaDtiPk1hdGguUEk/Yi09MipNYXRoLlBJOmI8LU1hdGguUEkmJihiKz0yKk1hdGguUEkpO2NvbnN0IGQ9Yi84LGY9W2UsdCwhMV07Zm9yKGxldCByPTA7cjw9ODtyKyspe2NvbnN0IGE9aCtyKmQscz1lK24qTWF0aC5jb3MoYSksbz10K24qTWF0aC5zaW4oYSk7Zi5wdXNoKHMsbywhMSl9ci5zcGxpY2UoLTEsMCxmKX0sY3Q9KGUsdCxuLHIsYT0hMSk9Pntjb25zdCBzPWE/MDpyLmxlbmd0aC0xLG89YT9yLmxlbmd0aC0xOnIubGVuZ3RoLTIsaT1hdChlLHQsbixyW3NdKSxjPWF0KGUsdCxuLHJbb10pO2lmKGlbMF09PT1jWzBdJiZpWzFdPT09Y1sxXXx8aVswXT09PWNbMl0mJmlbMV09PT1jWzNdKXJldHVybjtjb25zdCBsPW90KGkscltvXSk7aWYoIWwpcmV0dXJuO2NvbnN0IHU9b3QoYyxyW3NdKTt1JiZyLnNwbGljZSgtMSwwLFtlLHQsITEsbFswXSxsWzFdLCExLHVbMF0sdVsxXSwhMSxlLHQsITFdKX0sbHQ9KGUsdCxuLHIsYSxzPSExKT0+e2NvbnN0IG89cz8wOmEubGVuZ3RoLTEsaT1zP2EubGVuZ3RoLTE6YS5sZW5ndGgtMixjPWF0KGUueCxlLnkscixhW29dKSxsPWF0KGUueCxlLnkscixhW2ldKTtpZihjWzBdPT09bFswXSYmY1sxXT09PWxbMV18fGNbMF09PT1sWzJdJiZjWzFdPT09bFszXSlyZXR1cm47Y29uc3QgdT1vdChjLGFbaV0pO2lmKCF1KXJldHVybjtjb25zdCBoPW90KGwsYVtvXSk7aWYoIWgpcmV0dXJuO2NvbnN0IGI9dC54LWUueCxkPXQueS1lLnksZj1NYXRoLmh5cG90KGIsZCksbT17eDpiL2YseTpkL2Z9LHY9bi54LWUueCxfPW4ueS1lLnkscD1NYXRoLmh5cG90KHYsXyksZz17eDp2L3AseTpfL3B9LHg9bS54LEU9bS55LEE9Zy54LHk9Zy55LFQ9eCp5LUUqQTswPT09VCYmYS5zcGxpY2UoLTEsMCxbZS54LGUueSwhMSx1WzBdLHVbMV0sITEsaFswXSxoWzFdLCExXSk7Y29uc3QgUj0oKGhbMF0tdVswXSkqeS0oaFsxXS11WzFdKSpBKS9ULE09dVswXStSKngsdz11WzFdK1IqRTthLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxNLHcsITEsZS54LGUueSwhMSxoWzBdLGhbMV0sITEsTSx3LCExXSl9LHV0PShlLHQpPT57Y29uc3Qgbj17eDplWzBdLHk6ZVsxXX0sYT17eDowLHk6MH0scz17eDowLHk6MH0sbz17eDowLHk6MH0saT1bXTtmb3IobGV0IGM9MztjPGUubGVuZ3RoO2MrPTMpe2NvbnN0IGw9ZVtjXSx1PWVbYysxXTtpZihlW2MrMl0pYS54PWwsYS55PXU7ZWxzZXtpZihzLng9bCxzLnk9dSxlW2MtMV0/aS5wdXNoKHJ0KG4sYSxzLHQpKTppLnB1c2goSGUobixzLHQpKSxpLmxlbmd0aD4xKXN3aXRjaChyLmpvaW50cyl7Y2FzZSAwOmN0KG4ueCxuLnksdCxpKTticmVhaztjYXNlIDE6by54PWVbYy02XSxvLnk9ZVtjLTVdLGx0KG4scyxvLHQsaSk7YnJlYWs7Y2FzZSAyOml0KG4ueCxuLnksdCxpKX1uLng9cy54LG4ueT1zLnl9fWlmKGVbMF09PT1lW2UubGVuZ3RoLTNdJiZlWzFdPT09ZVtlLmxlbmd0aC0yXSlzd2l0Y2goci5qb2ludHMpe2Nhc2UgMDpjdChuLngsbi55LHQsaSwhMCk7YnJlYWs7Y2FzZSAxOm4ueD1lWzBdLG4ueT1lWzFdLHMueD1lWzNdLHMueT1lWzRdLG8ueD1lW2UubGVuZ3RoLTZdLG8ueT1lW2UubGVuZ3RoLTVdLGx0KG4scyxvLHQsaSwhMCk7YnJlYWs7Y2FzZSAyOml0KG4ueCxuLnksdCxpLCEwKX1lbHNlIHN3aXRjaChyLmNhcHMpe2Nhc2UgMTooKGUsdCxuKT0+e2ZvcihsZXQgcj0wO3I8MjsrK3Ipe2xldCBhPTAscz0wLG89MCxpPTA7MD09PXI/KGE9ZVswXSxzPWVbMV0sbz1lWzNdLGk9ZVs0XSk6KGE9ZVtlLmxlbmd0aC0zXSxzPWVbZS5sZW5ndGgtMl0sbz1lW2UubGVuZ3RoLTZdLGk9ZVtlLmxlbmd0aC01XSk7Y29uc3QgYz1vLWEsbD1pLXMsdT1NYXRoLmF0YW4yKGwsYyksaD11K01hdGguUEkvMixiPXUtTWF0aC5QSS8yLGQ9MTYsZj0oYi1oKS9kLG09W107Zm9yKGxldCBlPTA7ZTw9ZDtlKyspe2NvbnN0IG49YitmKmUscj1hK3QqTWF0aC5jb3Mobiksbz1zK3QqTWF0aC5zaW4obik7bS5wdXNoKHIsbywhMSl9MD09PXI/bi51bnNoaWZ0KG0pOm4ucHVzaChtKX19KShlLHQsaSk7YnJlYWs7Y2FzZSAyOigoZSx0LG4pPT57Zm9yKGxldCByPTA7cjwyOysrcil7bGV0IGE9MCxzPTAsbz0wLGk9MDswPT09cj8oYT1lWzBdLHM9ZVsxXSxvPWVbM10saT1lWzRdKTooYT1lW2UubGVuZ3RoLTNdLHM9ZVtlLmxlbmd0aC0yXSxvPWVbZS5sZW5ndGgtNl0saT1lW2UubGVuZ3RoLTVdKTtjb25zdCBjPS0oby1hKSxsPS0oaS1zKSx1PU1hdGguc3FydChjKmMrbCpsKTtpZigwPT09dSljb250aW51ZTtjb25zdCBoPWMvdSxiPWwvdSxkPWErdCpoLGY9cyt0KmIsbT0tYix2PVtkK3QqaCt0Km0sZit0KmIrdCpoLCExLGQrdCpoLXQqbSxmK3QqYi10KmgsITEsZC10KmgtdCptLGYtdCpiLXQqaCwhMSxkK3QqaCt0Km0sZit0KmIrdCpoLCExLGQtdCpoLXQqbSxmLXQqYi10KmgsITEsZC10KmgrdCptLGYtdCpiK3QqaCwhMV07MD09PXI/bi51bnNoaWZ0KHYpOm4ucHVzaCh2KX19KShlLHQsaSl9cmV0dXJuIGl9LGh0PWU9Pntjb25zdCB0PXIudGhpY2tuZXNzLzIsbj1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoOysrcil7Y29uc3QgYT11dChlW3JdLHQpO24ucHVzaCguLi5hKX1yZXR1cm4gWGUobiwic3Ryb2tlIil9LGJ0PW5ldyBNYXAsZHQ9KCk9PntidC5jbGVhcigpfSxmdD0oKT0+KHtpZDpwdCgpLHJlc291cmNlOm4uY3JlYXRlVmVydGV4QXJyYXkoKSx2ZXJ0ZXhCdWZmZXI6bi5jcmVhdGVCdWZmZXIoKSx2ZXJ0ZXhMZW5ndGg6MH0pO2xldCBtdDtjb25zdCB2dD1lPT57bXQmJm10LmlkPT09ZS5pZHx8KG10PWUsbi5iaW5kVmVydGV4QXJyYXkoZS5yZXNvdXJjZSkpfTtsZXQgX3Q9MDtjb25zdCBwdD0oKT0+X3QrKyxndD1bXSx4dD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMCwxLDEsMCwxLDFdKTtsZXQgRXQ7bGV0IEF0O2xldCB5dDtjb25zdCBUdD0oKT0+KHl0fHwoeXQ9KCgpPT57Y29uc3QgZT1mdCgpO3Z0KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlcik7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwxLDEsMCwxLDEsMF0pO3JldHVybiBuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdCxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLGV9KSgpKSx5dCksUnQ9KCk9Pntjb25zdCBlPSgoKT0+e2lmKGd0Lmxlbmd0aClyZXR1cm4gZ3QucG9wKCk7Y29uc3QgZT1mdCgpO3JldHVybiB2dChlKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg0KSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSw2OCwwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMSwyLG4uRkxPQVQsITEsNjgsOCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDIsNCxuLkZMT0FULCExLDY4LDE2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywzLG4uRkxPQVQsITEsNjgsMzIpLG4udmVydGV4QXR0cmliUG9pbnRlcig0LDMsbi5GTE9BVCwhMSw2OCw0NCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDUsMyxuLkZMT0FULCExLDY4LDU2KSxlfSkoKTt2dChlKTtjb25zdCB0PXplLHI9VmU7cmV0dXJuIG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksZS52ZXJ0ZXhMZW5ndGg8dC5sZW5ndGgmJihlLnZlcnRleExlbmd0aD1jKHQubGVuZ3RoKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCplLnZlcnRleExlbmd0aCxuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLHQuc3ViYXJyYXkoMCxyKSksZX0sTXQ9ZT0+e2d0LmluZGV4T2YoZSk+LTF8fGd0LnB1c2goZSl9O2xldCB3dD0wO2xldCBGdD0tMTtjbGFzcyAkdHtjb25zdHJ1Y3RvcihlLHQscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kcHJvZ3JhbU9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHVuaWZvcm1NYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCByPW4uY3JlYXRlUHJvZ3JhbSgpLGE9bi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtuLnNoYWRlclNvdXJjZShhLGUpLG4uY29tcGlsZVNoYWRlcihhKTtjb25zdCBzPW4uY3JlYXRlU2hhZGVyKG4uRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gbi5zaGFkZXJTb3VyY2Uocyx0KSxuLmNvbXBpbGVTaGFkZXIocyksbi5hdHRhY2hTaGFkZXIocixhKSxuLmF0dGFjaFNoYWRlcihyLHMpLG4ubGlua1Byb2dyYW0ociksbi5kZXRhY2hTaGFkZXIocixhKSxuLmRldGFjaFNoYWRlcihyLHMpLG4uZGVsZXRlU2hhZGVyKGEpLG4uZGVsZXRlU2hhZGVyKHMpLHtpZDp3dCsrLHJlc291cmNlOnJ9fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LHI9ITEpPT57Y29uc3QgYT1uLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxuLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBzPTA7czxhOysrcyl7Y29uc3QgYT1uLmdldEFjdGl2ZVVuaWZvcm0oZSxzKSxvPWEubmFtZS5lbmRzV2l0aCgiWzBdIik/YS5uYW1lLnNsaWNlKDAsLTMpOmEubmFtZSxpPW4uZ2V0VW5pZm9ybUxvY2F0aW9uKGUsbyk7aWYoYS50eXBlPT09bi5TQU1QTEVSXzJEJiYxPT09YS5zaXplJiYhciljb250aW51ZTtjb25zdCBjPXt9O3N3aXRjaChhLnR5cGUpe2Nhc2Ugbi5GTE9BVF9WRUM0OmMubWV0aG9kPW4udW5pZm9ybTRmdi5iaW5kKG4saSksYy5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uSU5UX1ZFQzQ6Yy5tZXRob2Q9bi51bmlmb3JtNGl2LmJpbmQobixpKSxjLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uU0FNUExFUl8yRDpjLm1ldGhvZD1yP24udW5pZm9ybTFpLmJpbmQobixpLDMpOm4udW5pZm9ybTFpdi5iaW5kKG4saSksYy5hcnJheT1uZXcgSW50MzJBcnJheShhLnNpemUpLGMuYXNzaWduPTE7YnJlYWs7Y2FzZSBuLkZMT0FUOmNhc2Ugbi5GTE9BVF9WRUMyOmNhc2Ugbi5GTE9BVF9WRUMzOmNhc2Ugbi5GTE9BVF9NQVQyOmNhc2Ugbi5GTE9BVF9NQVQzOmNhc2Ugbi5GTE9BVF9NQVQ0OmNhc2Ugbi5JTlQ6Y2FzZSBuLklOVF9WRUMyOmNhc2Ugbi5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KG8sYyl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAscil9dXNlUHJvZ3JhbSgpe3ZhciBlO2U9dGhpcy5fJHByb2dyYW1PYmplY3QsRnQhPT1lLmlkJiYoRnQ9ZS5pZCxuLnVzZVByb2dyYW0oZS5yZXNvdXJjZSkpfWJpbmRVbmlmb3JtKCl7KGU9Pntmb3IoY29uc3QgdCBvZiBlLnZhbHVlcygpKXZvaWQgMCE9PXQubWV0aG9kJiZ2b2lkIDAhPT10LmFzc2lnbiYmKHQuYXNzaWduPDA/dC5tZXRob2QodC5hcnJheSk6dC5hc3NpZ24+MCYmKHQuYXNzaWduLS0sdC5tZXRob2QodC5hcnJheSkpKX0pKHRoaXMuXyR1bmlmb3JtTWFwKX1nZXQgaGlnaHAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIikuYXJyYXl9Z2V0IG1lZGl1bXAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X21lZGl1bXAiKS5hcnJheX1nZXQgdGV4dHVyZXMoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X3RleHR1cmVzIikuYXJyYXl9fWNvbnN0IE90PW5ldyBNYXAsU3Q9KGUsdCxuLHIpPT57Y29uc3QgYT1uPyJsYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjMiBhX2JlemllcjsiOiIiLHM9bj8ib3V0IHZlYzIgdl9iZXppZXI7Ijp0PyJvdXQgdmVjMiB2X3V2OyI6IiIsbz1uPyJ2X2JlemllciA9IGFfYmV6aWVyOyI6dD8iXG4gICAgbWF0MyB1dl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWzBdLnh5eixcbiAgICAgICAgdV9oaWdocFsxXS54eXosXG4gICAgICAgIHVfaGlnaHBbMl0ueHl6XG4gICAgKTtcbiAgICBtYXQzIGludmVyc2VfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFszXS54eXosXG4gICAgICAgIHVfaGlnaHBbNF0ueHl6LFxuICAgICAgICB2ZWMzKHVfaGlnaHBbMl0udywgdV9oaWdocFszXS53LCB1X2hpZ2hwWzRdLncpXG4gICAgKTtcbiAgICB2X3V2ID0gKGludmVyc2VfbWF0cml4ICogdXZfbWF0cml4ICogdmVjMyhhX3ZlcnRleCwgMS4wKSkueHk7IjoiIixpPXI/KGU9PmBcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIHBhcmVudF9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMn1dLnh5elxuICAgICk7XG4gICAgbWF0MyBhbmNlc3Rvcl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZSszfV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs0fV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs1fV0ueHl6XG4gICAgKTtcblxuICAgIHZlYzIgcGFyZW50X29mZnNldCA9IHZlYzIodV9oaWdocFske2UrMn1dLncsIHVfaGlnaHBbJHtlKzN9XS53KTtcbiAgICB2ZWMyIHBhcmVudF9zaXplICAgPSB2ZWMyKHVfaGlnaHBbJHtlKzR9XS53LCB1X2hpZ2hwWyR7ZSs1fV0udyk7XG4gICAgdmVjNCBncmlkX21pbiA9IHVfaGlnaHBbJHtlKzZ9XTtcbiAgICB2ZWM0IGdyaWRfbWF4ID0gdV9oaWdocFske2UrN31dO1xuICAgIFxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHthfVxuJHtuPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke3I/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7c31cbiR7bj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtpfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtuPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7b31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSxrdD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYoT3QuaGFzKHQpKXJldHVybiBPdC5nZXQodCk7Y29uc3Qgbj1uZXcgJHQoU3QoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBweCA9IGRGZHgodl9iZXppZXIpO1xuICAgIHZlYzIgcHkgPSBkRmR5KHZfYmV6aWVyKTtcblxuICAgIHZlYzIgZiA9ICgyLjAgKiB2X2Jlemllci54KSAqIHZlYzIocHgueCwgcHkueCkgLSB2ZWMyKHB4LnksIHB5LnkpO1xuICAgIGZsb2F0IGFscGhhID0gMC41IC0gKHZfYmV6aWVyLnggKiB2X2Jlemllci54IC0gdl9iZXppZXIueSkgLyBsZW5ndGgoZik7XG5cbiAgICBpZiAoYWxwaGEgPiAwLjApIHtcbiAgICAgICAgb19jb2xvciA9IHZlYzQobWluKGFscGhhLCAxLjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH0gICAgXG59Iik7cmV0dXJuIE90LnNldCh0LG4pLG59LEN0PShlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfTtsZXQgUHQ9Im5vcm1hbCI7Y29uc3QgQnQ9ZT0+e1B0PWV9LEl0PSgpPT5QdDtsZXQgTHQ9NjAwO2NvbnN0IFV0PWU9PntMdD1lfSxOdD0oKT0+THQsRHQ9KCk9Pns2MTMhPT1OdCgpJiYoVXQoNjEzKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sanQ9KGUsdCxyLGEpPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLER0KCksdnQodCksbi5kcmF3QXJyYXlzKG4uVFJJQU5HTEVTLHIsYSl9LFh0PSgpPT57Y29uc3QgZT0icm1ubiI7aWYoT3QuaGFzKGUpKXJldHVybiBPdC5nZXQoZSk7Y29uc3QgdD1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwb3MgPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLngsIC1wb3MueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KDEuMCk7XG59Iik7cmV0dXJuIE90LnNldChlLHQpLHR9LHp0PSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PTE8PGUuY2xpcExldmVsLTE7bi5zdGVuY2lsTWFzayh+dC0xKSxuLnN0ZW5jaWxGdW5jKG4uTEVRVUFMLHQsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5SRVBMQUNFLG4uUkVQTEFDRSksanQoWHQoKSxUdCgpLDAsNiksbi5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3Aobi5SRVBMQUNFLG4uUkVQTEFDRSxuLlJFUExBQ0UpLGp0KFh0KCksVHQoKSwwLDYpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpfTtjbGFzcyBWdHtjb25zdHJ1Y3RvcihlLHQsbixyLGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbmRleCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxlZnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmlnaHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidXNlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuaW5kZXg9ZSx0aGlzLng9dCx0aGlzLnk9bix0aGlzLnc9cix0aGlzLmg9YSx0aGlzLmxlZnQ9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy51c2VkPSExfWluc2VydChlLHQpe3JldHVybigoZSx0LG4pPT57aWYoZS51c2VkKXtjb25zdCByPWUubGVmdD8uaW5zZXJ0KHQsbik7cmV0dXJuIHJ8fGUucmlnaHQ/Lmluc2VydCh0LG4pfHxudWxsfWlmKHQ+ZS53fHxuPmUuaClyZXR1cm4gbnVsbDtpZih0PT09ZS53JiZuPT09ZS5oKXJldHVybiBlLnVzZWQ9ITAsZTtjb25zdCByPWUudy10LGE9ZS5oLW47cmV0dXJuIHI+YT8oZS5sZWZ0PW5ldyBWdChlLmluZGV4LGUueCxlLnksdCxuKSxlLnJpZ2h0PW5ldyBWdChlLmluZGV4LGUueCt0KzEsZS55LHItMSxlLmgpKTooZS5sZWZ0PW5ldyBWdChlLmluZGV4LGUueCxlLnksZS53LG4pLGUucmlnaHQ9bmV3IFZ0KGUuaW5kZXgsZS54LGUueStuKzEsZS53LGEtMSkpLGUudXNlZD0hMCxlLmxlZnQuaW5zZXJ0KHQsbil9KSh0aGlzLGUsdCl9ZGlzcG9zZShlLHQsbixyKXtyZXR1cm4oKGUsdCxuLHIsYSk9PmUubGVmdD8uZGlzcG9zZSh0LG4scixhKT8oZS5sZWZ0LnVzZWR8fGUucmlnaHQ/LnVzZWR8fChlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOmUucmlnaHQ/LmRpc3Bvc2UodCxuLHIsYSk/KGUucmlnaHQudXNlZHx8ZS5sZWZ0Py51c2VkfHwoZS5sZWZ0PWUucmlnaHQ9bnVsbCxlLnVzZWQ9ITEpLCEwKTp0PT09ZS54JiZuPT09ZS55JiZyPT09ZS53JiZhPT09ZS5oJiYoZS51c2VkPSExLCEwKSkodGhpcyxlLHQsbixyKX19Y2xhc3MgV3R7Y29uc3RydWN0b3IoZSx0LG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHJvb3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcm9vdD1uZXcgVnQoZSwwLDAsdCxuKX1pbnNlcnQoZSx0KXtyZXR1cm4gdGhpcy5fJHJvb3QuaW5zZXJ0KGUsdCl9ZGlzcG9zZShlLHQsbixyKXtyZXR1cm4gdGhpcy5fJHJvb3QuZGlzcG9zZShlLHQsbixyKX19Y29uc3QgR3Q9KHQsbik9Pntjb25zdCByPUooKTtuZVtyXXx8KG5lW3JdPW5ldyBXdChyLGUsZSkpO2NvbnN0IGE9bmVbcl0uaW5zZXJ0KHQsbik7cmV0dXJuIGF8fChRKHIrMSksR3QodCxuKSl9LFl0PWU9PmBcbiAgICB2ZWM0IG11bCA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IGFkZCA9IHVfbWVkaXVtcFske2UrMX1dO1xuXG4gICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgc3JjID0gY2xhbXAoc3JjICogbXVsICsgYWRkLCAwLjAsIDEuMCk7XG4gICAgc3JjLnJnYiAqPSBzcmMuYTtgLHF0PWU9PmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG4ke2U/InVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07IjoiIn1cblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuICAgICR7ZT9ZdCgwKToiIn1cbiAgICBvX2NvbG9yID0gc3JjO1xufWA7Y29uc3QgS3Q9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KDI1NiksdGhpcy5vZmZzZXQ9MH1wdXNoKC4uLmUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWVbdF19c2V0KGUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpLHRoaXMuYnVmZmVyLnNldChlLHRoaXMub2Zmc2V0KSx0aGlzLm9mZnNldCs9ZS5sZW5ndGh9cmVzaXplKGUpe2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheSgobj10aGlzLm9mZnNldCtlLG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3ZhciBuO3RoaXMuYnVmZmVyLmxlbmd0aCYmdC5zZXQodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyPXR9fTtjbGFzcyBIdCBleHRlbmRzICR0e2NvbnN0cnVjdG9yKGUsdCxuPSEwKXtzdXBlcihlLHQsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvdW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5jb3VudD0wfWNsZWFyKCl7dGhpcy5jb3VudD1LdC5vZmZzZXQ9MH19Y29uc3QgWnQ9bmV3IE1hcCxRdD0oKT0+e2lmKFp0LmhhcygiaSIpKXJldHVybiBadC5nZXQoImkiKTtjb25zdCBlPW5ldyBIdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xubGF5b3V0IChsb2NhdGlvbiA9IDEpIGluIHZlYzQgYV9yZWN0O1xubGF5b3V0IChsb2NhdGlvbiA9IDIpIGluIHZlYzQgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9IDMpIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gNCkgaW4gdmVjNCBhX21hdHJpeDtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWM0IGFfbXVsO1xubGF5b3V0IChsb2NhdGlvbiA9IDYpIGluIHZlYzQgYV9hZGQ7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCB2X211bDtcbm91dCB2ZWM0IHZfYWRkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4ICogYV9yZWN0Lnp3ICsgYV9yZWN0Lnh5O1xuICAgIHZfbXVsID0gYV9tdWw7XG4gICAgdl9hZGQgPSBhX2FkZDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSB2ZWMyKGFfdmVydGV4LngsIDEuMCAtIGFfdmVydGV4LnkpO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiBhX3NpemUueHk7XG5cbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoXG4gICAgICAgIGFfbWF0cml4LngsIGFfbWF0cml4LnksIDAuMCxcbiAgICAgICAgYV9tYXRyaXgueiwgYV9tYXRyaXgudywgMC4wLFxuICAgICAgICBhX29mZnNldC54LCBhX29mZnNldC55LCAxLjBcbiAgICApO1xuXG4gICAgcG9zaXRpb24gPSAobWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMS4wKSkueHk7XG4gICAgcG9zaXRpb24gLz0gYV9zaXplLnp3O1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueCwgLXBvc2l0aW9uLnksIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG5cbmluIHZlYzQgdl9tdWw7XG5pbiB2ZWM0IHZfYWRkO1xuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuXG4gICAgaWYgKHZfbXVsLnggIT0gMS4wIHx8IHZfbXVsLnkgIT0gMS4wIHx8IHZfbXVsLnogIT0gMS4wIHx8IHZfbXVsLncgIT0gMS4wXG4gICAgICAgIHx8IHZfYWRkLnggIT0gMC4wIHx8IHZfYWRkLnkgIT0gMC4wIHx8IHZfYWRkLnogIT0gMC4wIHx8IHZfYWRkLncgIT0gMC4wXG4gICAgKSB7XG4gICAgICAgIHNyYy5yZ2IgLz0gbWF4KDAuMDAwMSwgc3JjLmEpO1xuICAgICAgICBzcmMgPSBjbGFtcChzcmMgKiB2X211bCArIHZfYWRkLCAwLjAsIDEuMCk7XG4gICAgICAgIHNyYy5yZ2IgKj0gc3JjLmE7XG4gICAgfVxuICAgIFxuICAgIG9fY29sb3IgPSBzcmM7XG59Iik7cmV0dXJuIFp0LnNldCgiaSIsZSksZX0sSnQ9KGUsdCk9Pntjb25zdCBuPWBpJHtlfXlgO2lmKFp0LmhhcyhuKSlyZXR1cm4gWnQuZ2V0KG4pO2NvbnN0IHI9bmV3ICR0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwoZT0+e2xldCB0O3N3aXRjaChlKXtjYXNlInN1YnRyYWN0Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KGRzdC5yZ2IgLSBzcmMucmdiLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJtdWx0aXBseSI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcbiAgICB2ZWM0IGMgPSBzcmMgKiBkc3Q7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJsaWdodGVuIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChzcmMucmdiLCBkc3QucmdiLCBzdGVwKHNyYy5yZ2IsIGRzdC5yZ2IpKSwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiZGFya2VuIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChzcmMucmdiLCBkc3QucmdiLCBzdGVwKGRzdC5yZ2IsIHNyYy5yZ2IpKSwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2Uib3ZlcmxheSI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBtdWwgPSBzcmMgKiBkc3Q7XG4gICAgdmVjMyBjMSA9IDIuMCAqIG11bC5yZ2I7XG4gICAgdmVjMyBjMiA9IDIuMCAqIChzcmMucmdiICsgZHN0LnJnYiAtIG11bC5yZ2IpIC0gMS4wO1xuICAgIHZlYzQgYyA9IHZlYzQobWl4KGMxLCBjMiwgc3RlcCh2ZWMzKDAuNSksIGRzdC5yZ2IpKSwgbXVsLmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImhhcmRsaWdodCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBtdWwgPSBzcmMgKiBkc3Q7XG4gICAgdmVjMyBjMSA9IDIuMCAqIG11bC5yZ2I7XG4gICAgdmVjMyBjMiA9IDIuMCAqIChzcmMucmdiICsgZHN0LnJnYiAtIG11bC5yZ2IpIC0gMS4wO1xuICAgIHZlYzQgYyA9IHZlYzQobWl4KGMxLCBjMiwgc3RlcCh2ZWMzKDAuNSksIHNyYy5yZ2IpKSwgbXVsLmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImRpZmZlcmVuY2UiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQoYWJzKHNyYy5yZ2IgLSBkc3QucmdiKSwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiaW52ZXJ0Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG4gICAgdmVjNCBjID0gdmVjNChzcmMuYSAtIGRzdC5yZ2IgKiBzcmMuYSwgc3JjLmEpO1xuXG4gICAgcmV0dXJuIGIgKyBjO1xufSI7YnJlYWs7ZGVmYXVsdDp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIHJldHVybiBzcmMgKyBkc3QgLSBkc3QgKiBzcmMuYTtcbn0ifXJldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmVzWzJdO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsyXTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuJHt0fVxuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBkc3QgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmVzWzFdLCB2X2Nvb3JkKTtcbiAgICAke1l0KDApfVxuICAgIG9fY29sb3IgPSBibGVuZChzcmMsIGRzdCk7XG59YH0pKGUpKTtyZXR1cm4gWnQuc2V0KG4scikscn07bGV0IGVuPTA7Y29uc3QgdG49KCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsdD1yLmF0bGFzQXR0YWNobWVudE9iamVjdDtpZihyLmJpbmQodCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLG1lKSx4ZSghMSksZW49PT1KKCkpe2NvbnN0IGU9b2UoSigpKTtlWzJdIT09LU51bWJlci5NQVhfVkFMVUUmJmVbM10hPT0tTnVtYmVyLk1BWF9WQUxVRSYmKG4uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZVswXSxlWzFdLGVbMl0sZVszXSksbi5ibGl0RnJhbWVidWZmZXIoMCwwLHQud2lkdGgsdC5oZWlnaHQsMCwwLHQud2lkdGgsdC5oZWlnaHQsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSl9ZWxzZXtjb25zdCBlPWNlKEooKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlWzBdLGVbMV0sZVsyXSxlWzNdKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdC53aWR0aCx0LmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLGVuPUooKX1lJiZyLmJpbmQoZSl9LG5uPWU9Pntjb25zdCB0PUooKTtRKGUuaW5kZXgpLHRuKCk7Y29uc3Qgcj1BZTtuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLHIpO2NvbnN0IGE9YWUoKTtuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsYS5yZXNvdXJjZSwwKTtjb25zdCBzPU1lKCk7bi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixzKTtjb25zdCBvPUsoZS53LGUuaCk7cmV0dXJuIG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxvLnJlc291cmNlLDApLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsbnVsbCksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLHIpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUixzKSxuLmJsaXRGcmFtZWJ1ZmZlcihlLngsZS55LGUueCtlLncsZS55K2UuaCwwLDAsZS53LGUuaCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxRKHQpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixkZSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixkZSksb30scm49KGUsdCxyPSExKT0+e09lKDIsbi5URVhUVVJFMixudWxsLHIpLE9lKDEsbi5URVhUVVJFMSx0LHIpLE9lKDAsbi5URVhUVVJFMCxlLHIpfSxhbj0oKT0+e2lmKFp0LmhhcygicCIpKXJldHVybiBadC5nZXQoInAiKTtjb25zdCBlPW5ldyAkdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudW5pZm9ybSB2ZWM0IHVfaGlnaHBbMl07XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIG9mZnNldCAgID0gdV9oaWdocFswXS54eTtcbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFswXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzFdLngsIHVfaGlnaHBbMV0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZSArIG9mZnNldDtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixxdCghMSkpO3JldHVybiBadC5zZXQoInAiLGUpLGV9LHNuPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAscz1yLiRtYXRyaXg7YVswXT1zWzZdLGFbMV09c1s3XSxhWzJdPXQsYVszXT1uLGFbNF09eCgpLGFbNV09RSgpfSxvbj1lPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLHZ0KFR0KCkpLG4uZHJhd0FycmF5cyhuLlRSSUFOR0xFUywwLDYpfTtsZXQgY249bnVsbDtjb25zdCBsbj0oZSx0LGEscyk9Pntjb25zdCBvPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsaT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoaSk7Y29uc3QgYz1NZSgpO3JldHVybiBuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGMpLGNuJiZjbi53aWR0aD09PWkud2lkdGgmJmNuLmhlaWdodD09PWkuaGVpZ2h0fHwoY249SyhpLndpZHRoLGkuaGVpZ2h0KSksU2UoY24pLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxjbi5yZXNvdXJjZSwwKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixkZSksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGMpLG4uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSxpLmhlaWdodC10LXMsYSsxLHMrMSksbi5ibGl0RnJhbWVidWZmZXIoMCwwLGkud2lkdGgsaS5oZWlnaHQsMCwwLGkud2lkdGgsaS5oZWlnaHQsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGRlKSxvJiZyLmJpbmQobyksY259LHVuPShlLHQsbixhKT0+e2NvbnN0IHM9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxvPWxuKGUsdCxuLGEpLGk9SChuLGEsITEpO3IuYmluZChpKSxyLnNhdmUoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLC1lLC10KTtjb25zdCBjPWFuKCk7c24oYyxvLndpZHRoLG8uaGVpZ2h0KSxEdCgpLFNlKG8pLG9uKGMpO2NvbnN0IGw9aS50ZXh0dXJlO3JldHVybiByLnJlc3RvcmUoKSx3ZShpLCExKSxzJiZyLmJpbmQocyksbH0saG49KCk9Pns2MTAhPT1OdCgpJiYoVXQoNjEwKSxuLmJsZW5kRnVuYyhuLk9ORSxuLlpFUk8pKX0sYm49ZT0+e1NlKGUpLGhuKCk7Y29uc3QgdD1hbigpO3NuKHQsZS53aWR0aCxlLmhlaWdodCksb24odCksRHQoKX0sZG49KGUsdCxuLHIsYSxzLG8saSxjKT0+e2NvbnN0IGw9ZS50ZXh0dXJlcztsWzBdPTAsbFsxXT0xO2NvbnN0IHU9ZS5tZWRpdW1wO3VbMF09dCx1WzFdPW4sdVsyXT1yLHVbM109YSx1WzRdPXMsdVs1XT1vLHVbNl09aSx1WzddPWN9LGZuPShlPSExKT0+e2NvbnN0IHQ9Im0iKyhlPyJ5IjoibiIpO2lmKFp0Lmhhcyh0KSlyZXR1cm4gWnQuZ2V0KHQpO2NvbnN0IG49bmV3ICR0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG51bmlmb3JtIHZlYzQgdV9oaWdocFszXTtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54LCB1X2hpZ2hwWzBdLnksIDAuMCxcbiAgICAgICAgdV9oaWdocFswXS56LCB1X2hpZ2hwWzBdLncsIDAuMCxcbiAgICAgICAgdV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnksIDEuMFxuICAgICk7XG5cbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFsxXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzJdLngsIHVfaGlnaHBbMl0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZTtcbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixxdChlKSk7cmV0dXJuIFp0LnNldCh0LG4pLG59LG1uPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAscz1yLiRtYXRyaXg7YVswXT1zWzBdLGFbMV09c1sxXSxhWzJdPXNbM10sYVszXT1zWzRdLGFbNF09c1s2XSxhWzVdPXNbN10sYVs2XT10LGFbN109bixhWzhdPXgoKSxhWzldPUUoKX07bGV0IHZuPTA7Y29uc3QgX249ZT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSx2dChBdCksbi5iaW5kQnVmZmVyKG4uQVJSQVlfQlVGRkVSLEV0KSxLdC5idWZmZXIubGVuZ3RoPnZuJiYodm49S3QuYnVmZmVyLmxlbmd0aCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCp2bixuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLEt0LmJ1ZmZlci5zdWJhcnJheSgwLEt0Lm9mZnNldCkpLG4uZHJhd0FycmF5c0luc3RhbmNlZChuLlRSSUFOR0xFUywwLDYsZS5jb3VudCl9LHBuPSgpPT57NjAzIT09TnQoKSYmKFV0KDYwMyksbi5ibGVuZEZ1bmMobi5aRVJPLG4uT05FX01JTlVTX1NSQ19BTFBIQSkpfSxnbj1lPT57c3dpdGNoKGUpe2Nhc2UiYWRkIjo2MTEhPT1OdCgpJiYoVXQoNjExKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORSkpO2JyZWFrO2Nhc2Uic2NyZWVuIjo2NDEhPT1OdCgpJiYoVXQoNjQxKSxuLmJsZW5kRnVuYyhuLk9ORV9NSU5VU19EU1RfQ09MT1Isbi5PTkUpKTticmVhaztjYXNlImFscGhhIjo2MDYhPT1OdCgpJiYoVXQoNjA2KSxuLmJsZW5kRnVuYyhuLlpFUk8sbi5TUkNfQUxQSEEpKTticmVhaztjYXNlImVyYXNlIjpwbigpO2JyZWFrO2Nhc2UiY29weSI6aG4oKTticmVhaztkZWZhdWx0OkR0KCl9fSx4bj1lPT57dmFyIHQ7KGU9PntFdD1lLmNyZWF0ZUJ1ZmZlcigpfSkoZSksdD0oKCk9Pntjb25zdCBlPWZ0KCk7cmV0dXJuIHZ0KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLG5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDEsMSwwLDEsMSwwXSksbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsRXQpLG4uYnVmZmVyRGF0YShuLkFSUkFZX0JVRkZFUixLdC5idWZmZXIubGVuZ3RoLG4uRFlOQU1JQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLG4udmVydGV4QXR0cmliUG9pbnRlcigxLDQsbi5GTE9BVCwhMSw4OCwwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoMSwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4udmVydGV4QXR0cmliUG9pbnRlcigyLDQsbi5GTE9BVCwhMSw4OCwxNiksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDIsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywyLG4uRkxPQVQsITEsODgsMzIpLG4udmVydGV4QXR0cmliRGl2aXNvcigzLDEpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsNCxuLkZMT0FULCExLDg4LDQwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoNCwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcig1LDQsbi5GTE9BVCwhMSw4OCw1Niksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDUsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoNiw0LG4uRkxPQVQsITEsODgsNzIpLG4udmVydGV4QXR0cmliRGl2aXNvcig2LDEpLGV9KSgpLEF0PXR9LEVuPShlLHQscixhPSExKT0+e2NvbnN0IHM9SyhlLHQsYSk7cmV0dXJuIG4udGV4U3ViSW1hZ2UyRChuLlRFWFRVUkVfMkQsMCwwLDAsZSx0LG4uUkdCQSxuLlVOU0lHTkVEX0JZVEUsciksc30sQW49KGUsdCk9Pntjb25zdCByPSgoZSx0LHIsYT0hMSk9Pntjb25zdCBzPUsoZSx0LGEpO3JldHVybiBuLnRleFN1YkltYWdlMkQobi5URVhUVVJFXzJELDAsMCwwLG4uUkdCQSxuLlVOU0lHTkVEX0JZVEUsciksc30pKGUudyxlLmgsdCksYT1hbigpO3NuKGEsZS53LGUuaCksRHQoKSxvbihhKSxVKHIpfSx5bj1bXSxUbj1uZXcgTWFwLFJuPShlLHQsbik9PntTZShlLCEwKTtjb25zdCByPU1hdGguY2VpbCguNSpuKSxhPTEtKHItLjUqbikscz0xK24sbz0oZT0+e2NvbnN0IHQ9YGIke2V9YDtpZihUbi5oYXModCkpcmV0dXJuIFRuLmdldCh0KTtjb25zdCBuPW5ldyAkdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKGU9Pntjb25zdCB0PWUudG9GaXhlZCgxKTtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcDtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgIG9mZnNldCAgID0gdV9tZWRpdW1wLnh5O1xuICAgIGZsb2F0IGZyYWN0aW9uID0gdV9tZWRpdW1wLno7XG4gICAgZmxvYXQgc2FtcGxlcyAgPSB1X21lZGl1bXAudztcbiAgICBcbiAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuXG4gICAgZm9yIChmbG9hdCBpID0gMS4wOyBpIDwgJHt0fTsgaSArPSAxLjApIHtcbiAgICAgICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgKyBvZmZzZXQgKiBpKTtcbiAgICAgICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgLSBvZmZzZXQgKiBpKTtcbiAgICB9XG4gICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgKyBvZmZzZXQgKiAke3R9KSAqIGZyYWN0aW9uO1xuICAgIGNvbG9yICs9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkIC0gb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciAvPSBzYW1wbGVzO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufWB9KShlKSk7cmV0dXJuIFRuLnNldCh0LG4pLG59KShyKTsoKGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89ZS5tZWRpdW1wO3I/KG9bMF09MS90LG9bMV09MCk6KG9bMF09MCxvWzFdPTEvbiksb1syXT1hLG9bM109c30pKG8sZS53aWR0aCxlLmhlaWdodCx0LGEscyksb24obyl9LE1uPXt4OjAseTowfSx3bj0oZSx0LG4pPT4oZT4+MTYpKihuP3Q6MSkvMjU1LEZuPShlLHQsbik9PihlPj44JjI1NSkqKG4/dDoxKS8yNTUsJG49KGUsdCxuKT0+KDI1NSZlKSoobj90OjEpLzI1NSxPbj1bLjUsMS4wNSwxLjQsMS41NSwxLjc1LDEuOSwyLDIuMTUsMi4yLDIuMywyLjUsMywzLDMuNSwzLjVdLFNuPShlLHQsbj00LGE9NCxzPTEsbz0hMCk9Pntjb25zdCBpPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksbD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksdT15KCksaD1uKihjL3UpLGI9YSoobC91KSxkPU9uW3MtMV0sZj1NYXRoLnJvdW5kKGgqZCksbT1NYXRoLnJvdW5kKGIqZCk7TW4ueCs9ZixNbi55Kz1tO2NvbnN0IHY9ZS53aWR0aCsyKmYsXz1lLmhlaWdodCsyKm07bGV0IHA9MSxnPTE7aD4xMjg/cD0uMDYyNTpoPjY0P3A9LjEyNTpoPjMyP3A9LjI1Omg+MTYmJihwPS41KSxiPjEyOD9nPS4wNjI1OmI+NjQ/Zz0uMTI1OmI+MzI/Zz0uMjU6Yj4xNiYmKGc9LjUpO2NvbnN0IHg9TWF0aC5jZWlsKHYqcCksRT1NYXRoLmNlaWwoXypnKSxBPUgoeCxFLCExKSxUPVtBLEgoeCxFLCExKV07ci5iaW5kKEEpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybShwLDAsMCxnLGYqcCxtKmcpLFNlKGUpO2NvbnN0IFI9Zm4oKTttbihSLGUud2lkdGgsZS5oZWlnaHQpLG9uKFIpLG8mJlUoZSk7Y29uc3QgTT1oKnAsdz1iKmc7bGV0IEY9MCwkPUEudGV4dHVyZTtTZSgkLCEwKSxobigpO2ZvcihsZXQgZT0wO2U8czsrK2Upe2lmKG4+MCl7Rj0oRisxKSUyO2NvbnN0IGU9VFtGXTtyLmJpbmQoZSksUm4oJCwhMCxNKSwkPWUudGV4dHVyZX1pZihhPjApe0Y9KEYrMSklMjtjb25zdCBlPVRbRl07ci5iaW5kKGUpLFJuKCQsITEsdyksJD1lLnRleHR1cmV9fWlmKER0KCksMSE9PXB8fDEhPT1nKXtjb25zdCBlPUgodixfLCExKTtyLmJpbmQoZSksci5zZXRUcmFuc2Zvcm0oMS9wLDAsMCwxL2csMCwwKSxTZSgkLCEwKSxtbihSLCQud2lkdGgsJC5oZWlnaHQpLG9uKFIpLCQ9ZS50ZXh0dXJlLHdlKFRbMF0pLHdlKFRbMV0pLHdlKGUsITEpfWVsc2UgRj0oRisxKSUyLHdlKFRbRl0pLEY9KEYrMSklMix3ZShUW0ZdLCExKTtyZXR1cm4gaSYmci5iaW5kKGkpLCR9LGtuPShlLHQpPT57Y29uc3Qgbj1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGE9SChlLndpZHRoLGUuaGVpZ2h0LCExKTtyLmJpbmQoYSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlKSxEdCgpO2NvbnN0IHM9KCgpPT57aWYoVG4uaGFzKCJtIikpcmV0dXJuIFRuLmdldCgibSIpO2NvbnN0IGU9bmV3ICR0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFs1XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG1hdDQgbXVsID0gbWF0NCh1X21lZGl1bXBbMF0sIHVfbWVkaXVtcFsxXSwgdV9tZWRpdW1wWzJdLCB1X21lZGl1bXBbM10pO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWzRdO1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBjb2xvci5yZ2IgLz0gbWF4KDAuMDAwMSwgY29sb3IuYSk7XG4gICAgY29sb3IgPSBjbGFtcChjb2xvciAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufSIpO3JldHVybiBUbi5zZXQoIm0iLGUpLGV9KSgpOygoZSx0KT0+e2NvbnN0IG49ZS5tZWRpdW1wO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNV0sbls1XT10WzZdLG5bNl09dFs3XSxuWzddPXRbOF0sbls4XT10WzEwXSxuWzldPXRbMTFdLG5bMTBdPXRbMTJdLG5bMTFdPXRbMTNdLG5bMTJdPXRbMTVdLG5bMTNdPXRbMTZdLG5bMTRdPXRbMTddLG5bMTVdPXRbMThdLG5bMTZdPXRbNF0vMjU1LG5bMTddPXRbOV0vMjU1LG5bMThdPXRbMTRdLzI1NSxuWzE5XT10WzE5XS8yNTV9KShzLHQpLG9uKHMpO2NvbnN0IG89YS50ZXh0dXJlO3JldHVybiBVKGUpLHdlKGEsITEpLG4mJnIuYmluZChuKSxvfSxDbj0oZSx0LG4scixhLHMpPT57Y29uc3Qgbz1lPyJibHVyLmEgPSAxLjAgLSBibHVyLmE7IjoiIixpPW4/KGM9cyxgXG4gICAgZmxvYXQgc3RyZW5ndGggPSB1X21lZGl1bXBbJHtNYXRoLmZsb29yKGMvNCl9XVske2MlNH1dO1xuICAgIGJsdXIuYSA9IGNsYW1wKGJsdXIuYSAqIHN0cmVuZ3RoLCAwLjAsIDEuMCk7XG5gKToiIjt2YXIgYztjb25zdCBsPXI/KGU9PmBcbiAgICBibHVyID0gdGV4dHVyZSh1X3RleHR1cmVzWyR7ZT8yOjF9XSwgdmVjMihibHVyLmEsIDAuNSkpO1xuYCkodCk6KGU9PmBcbiAgICB2ZWM0IGNvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIGJsdXIgPSBjb2xvciAqIGJsdXIuYTtcbmApKGEpO3JldHVybmBcbiAgICAke299XG4gICAgJHtpfVxuICAgICR7bH1cbmB9LFBuPShlLHQsbixyLGEscyk9Pntjb25zdCBvPXQ/IlxuICAgIHZlYzIgcHEgPSAoMS4wIC0gdl9jb29yZCkgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyMiA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1swXSwgcHEpLCBpc0luc2lkZShwcSkpO1xuIjoiXG4gICAgdmVjNCBibHVyMiA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgMS4wIC0gdl9jb29yZCk7XG4iLGk9bj8oYz1zLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IoYy80KX1dWyR7YyU0fV07XG4gICAgaGlnaGxpZ2h0X2FscGhhICo9IHN0cmVuZ3RoO1xuICAgIHNoYWRvd19hbHBoYSAgICAqPSBzdHJlbmd0aDtcbmApOiIiO3ZhciBjO2NvbnN0IGw9cj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKFxuICAgICAgICAwLjUwMTk2MDc4NDMxMzcyNTUgLSAwLjUwMTk2MDc4NDMxMzcyNTUgKiBzaGFkb3dfYWxwaGEgKyAwLjQ5ODAzOTIxNTY4NjI3NDUgKiBoaWdobGlnaHRfYWxwaGEsXG4gICAgICAgIDAuNVxuICAgICkpO1xuYCkoZSk6KGU9PmBcbiAgICB2ZWM0IGhpZ2hsaWdodF9jb2xvciA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IHNoYWRvd19jb2xvciAgICA9IHVfbWVkaXVtcFske2UrMX1dO1xuICAgIGJsdXIgPSBoaWdobGlnaHRfY29sb3IgKiBoaWdobGlnaHRfYWxwaGEgKyBzaGFkb3dfY29sb3IgKiBzaGFkb3dfYWxwaGE7XG5gKShhKTtyZXR1cm5gXG4gICAgJHtvfVxuICAgIGZsb2F0IGhpZ2hsaWdodF9hbHBoYSA9IGJsdXIuYSAtIGJsdXIyLmE7XG4gICAgZmxvYXQgc2hhZG93X2FscGhhICAgID0gYmx1cjIuYSAtIGJsdXIuYTtcbiAgICAke2l9XG4gICAgaGlnaGxpZ2h0X2FscGhhID0gY2xhbXAoaGlnaGxpZ2h0X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgc2hhZG93X2FscGhhICAgID0gY2xhbXAoc2hhZG93X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgJHtsfVxuYH0sQm49KGUsdCxuLHIsYSxzLG8pPT57Y29uc3QgaT1gZiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7bj8ieSI6Im4ifSR7cn0ke2E/InkiOiJuIn0ke3M/InkiOiJuIn1gO2lmKFRuLmhhcyhpKSlyZXR1cm4gVG4uZ2V0KGkpO2xldCBjPTE7ZSYmYysrLG8mJmMrKztsZXQgbD0oZT80OjApKyh0PzQ6MCkrKHM/MTowKTtvfHwobCs9bj80OjgpLGw9TWF0aC5jZWlsKGwvNCk7Y29uc3QgdT1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scixhLHMsbyxpLGMpPT57bGV0IGw9MDtjb25zdCB1PW4/KGU9PmBcbiAgICB2ZWMyIGJhc2Vfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmFzZV9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHV2ID0gdl9jb29yZCAqIGJhc2Vfc2NhbGUgLSBiYXNlX29mZnNldDtcbiAgICB2ZWM0IGJhc2UgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHV2KSwgaXNJbnNpZGUodXYpKTtcbmApKGwrKyk6IiIsaD1yPyhlPT5gXG4gICAgdmVjMiBibHVyX3NjYWxlICA9IHVfbWVkaXVtcFske2V9XS54eTtcbiAgICB2ZWMyIGJsdXJfb2Zmc2V0ID0gdV9tZWRpdW1wWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBzdCksIGlzSW5zaWRlKHN0KSk7XG5gKShsKyspOiJcbiAgICB2ZWM0IGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuIixiPSJpbm5lciI9PT1zLGQ9bDtsZXQgZixtLHY9NCpsO3N3aXRjaChjP2Y9YT9DbighMSxuLGksYyxkLHYpOlBuKG4scixpLGMsZCx2KTphPyh2Kz00LGY9Q24oYixuLGksYyxkLHYpKToodis9OCxmPVBuKG4scixpLGMsZCx2KSkscyl7Y2FzZSJvdXRlciI6bT1vPyJibHVyIC0gYmx1ciAqIGJhc2UuYSI6ImJhc2UgKyBibHVyIC0gYmx1ciAqIGJhc2UuYSI7YnJlYWs7Y2FzZSJmdWxsIjptPW8/ImJsdXIiOiJiYXNlIC0gYmFzZSAqIGJsdXIuYSArIGJsdXIiO2JyZWFrO2RlZmF1bHQ6bT0iYmx1ciJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbJHtlfV07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7dH1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHt1fVxuICAgICR7aH1cbiAgICAke2Z9XG4gICAgb19jb2xvciA9ICR7bX07XG59YH0pKGMsbCxlLHQsbixyLGEscyxvKSk7cmV0dXJuIFRuLnNldChpLHUpLHV9LEluPW5ldyBNYXAsTG49KGUsdCk9Pntjb25zdCBuPWBsJHsoIjAwIitlKS5zbGljZSgtMyl9JHt0PyJ5IjoibiJ9YDtpZihJbi5oYXMobikpcmV0dXJuIEluLmdldChuKTtjb25zdCByPU1hdGguY2VpbCg1KmUvNCksYT1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4pPT57bGV0IHI9IiI7Zm9yKGxldCBlPTE7ZTx0OysrZSl7Y29uc3Qgbj1lLTEsYT1lLHM9YHVfbWVkaXVtcFske3QrTWF0aC5mbG9vcihuLzQpfV1bJHtuJTR9XWAsbz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKGEvNCl9XVske2ElNH1dYDtyKz1gXG4gICAgaWYgKHQgPD0gJHtvfSkge1xuICAgICAgICByZXR1cm4gbWl4KHVfbWVkaXVtcFske259XSwgdV9tZWRpdW1wWyR7YX1dLCAodCAtICR7c30pIC8gKCR7b30gLSAke3N9KSk7XG4gICAgfVxuYH1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudmVjNCBnZXRHcmFkaWVudENvbG9yKGluIGZsb2F0IHQpIHtcbiAgICBpZiAodCA8PSB1X21lZGl1bXBbJHt0fV1bMF0pIHtcbiAgICAgICAgcmV0dXJuIHVfbWVkaXVtcFswXTtcbiAgICB9XG4gICAgJHtyfVxuICAgIHJldHVybiB1X21lZGl1bXBbJHt0LTF9XTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgY29sb3IgPSBnZXRHcmFkaWVudENvbG9yKHZfY29vcmQueCk7XG4gICAgJHtuPyJjb2xvciA9IHBvdyhjb2xvciwgdmVjNCgwLjQ1NDU0NTQ1KSk7IjoiIn1cbiAgICBjb2xvci5yZ2IgKj0gY29sb3IuYTtcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkocixlLHQpKTtyZXR1cm4gSW4uc2V0KG4sYSksYX0sVW49KGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89ZS5tZWRpdW1wO2xldCBpPTA7Zm9yKGxldCBlPWE7ZTxzO2UrKyl7Y29uc3QgdD1uW2VdO29baSsrXT0odD4+MTYpLzI1NSxvW2krK109KHQ+PjgmMjU1KS8yNTUsb1tpKytdPSgyNTUmdCkvMjU1LG9baSsrXT1yW2VdfWZvcihsZXQgZT1hO2U8cztlKyspb1tpKytdPXRbZV0vMjU1fTtsZXQgTm47Y29uc3QgRG49KGUsdCk9PihObj94dFswXT09PWUmJnh0WzRdPT09dHx8KHh0WzBdPWUseHRbMl09ZSx4dFs0XT10LHh0WzZdPXQsbi5idWZmZXJTdWJEYXRhKG4uQVJSQVlfQlVGRkVSLDAseHQpKTpObj0oKGUsdCk9Pntjb25zdCByPWZ0KCk7cmV0dXJuIHZ0KHIpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixyLnZlcnRleEJ1ZmZlcikseHRbMF09ZSx4dFsyXT1lLHh0WzRdPXQseHRbNl09dCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIseHQsbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxyfSkoZSx0KSxObiksam49KGUsdCxyKT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSx2dChEbih0LHIpKSxuLmRyYXdBcnJheXMobi5UUklBTkdMRV9TVFJJUCwwLDQpfTtsZXQgWG49bnVsbDtjb25zdCB6bj0oKT0+KFhufHwoWG49SCg1MTIsMSwhMSkpLFhuKTtsZXQgVm49MDtjb25zdCBXbj0oKT0+Vm4sR249bmV3IEZsb2F0MzJBcnJheSgyNTYpLFluPW5ldyBGbG9hdDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjsrK2Upe2NvbnN0IHQ9ZS8yNTU7R25bZV09TWF0aC5wb3codCwyLjIzMzMzMzMzKSxZbltlXT10fWNvbnN0IHFuPShlLHQsYSxzLG8saSxjLGwsdSxoLGIsZCxmLG0sdixfLHA9bnVsbCxnPW51bGwseD1udWxsLEU9MCxBPTAseT0wLFQ9MCxSPTAsTT0wLHc9MCxGPTApPT57Y29uc3QgJD1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LE89SChhLHMsITEpO3IuYmluZChPKTtjb25zdCBTPSJpbm5lciI9PT1tLGs9bnVsbCE9PXAmJm51bGwhPT1nJiZudWxsIT09eDtsZXQgQz1udWxsO2lmKGsmJihDPSgoZSx0LG4pPT57Y29uc3QgYT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9em4oKTtyLmJpbmQocyk7Y29uc3Qgbz1lLmxlbmd0aDtobigpO2NvbnN0IGk9V24oKTtmb3IobGV0IHI9MDtyPG87cis9aS0xKXtjb25zdCBhPU1hdGgubWluKHIraSxvKSxzPUxuKGEtciwhMSk7VW4ocyxlLHQsbixyLGEpLGpuKHMsZVtyXS8yNTUsZVthLTFdLzI1NSl9cmV0dXJuIER0KCksYSYmci5iaW5kKGEpLHMudGV4dHVyZX0pKHAsZyx4KSksUyl7ci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlLCEwKTtjb25zdCBhPWFuKCk7c24oYSxlLndpZHRoLGUuaGVpZ2h0KSxvbihhKSxrJiZDPygoZSx0LHI9ITEpPT57T2UoMixuLlRFWFRVUkUyLHQsciksT2UoMSxuLlRFWFRVUkUxLG51bGwpLE9lKDAsbi5URVhUVVJFMCxlLHIpfSkodCxDLCEwKTpTZSh0LCEwKX1lbHNlIGsmJkM/KChlLHQscixhPSExKT0+e09lKDIsbi5URVhUVVJFMixyLGEpLE9lKDEsbi5URVhUVVJFMSx0LGEpLE9lKDAsbi5URVhUVVJFMCxlLGEpfSkodCxlLEMsITApOnJuKHQsZSwhMCk7Y29uc3QgUD0hKFN8fCJmdWxsIj09PW0mJnYpLEI9IShhPT09dSYmcz09PWgmJjA9PT1iJiYwPT09ZCksST0hKDE9PT1fKTtTP3Y/NjcwIT09TnQoKSYmKFV0KDY3MCksbi5ibGVuZEZ1bmMobi5EU1RfQUxQSEEsbi5aRVJPKSk6NjczIT09TnQoKSYmKFV0KDY3Myksbi5ibGVuZEZ1bmMobi5EU1RfQUxQSEEsbi5PTkVfTUlOVVNfU1JDX0FMUEhBKSk6aG4oKTtjb25zdCBMPUJuKFAsQixmLG0sdixJLGspOygoZSx0LG4scixhLHMsbyxpLGMsbCx1LGgsYixkLGYsbSx2LF8scCxnLHgsRSxBLHksVCk9PntsZXQgUjtFPyhSPWUudGV4dHVyZXMsUlswXT0wLFJbMV09MSxUJiYoUlsyXT0yKSk6VCYmKFI9ZS50ZXh0dXJlcyxSWzBdPTAsUlsxXT0yKTtjb25zdCBNPWUubWVkaXVtcDtsZXQgdz0wO0UmJihNW3crK109dC9yLE1bdysrXT1uL2EsTVt3KytdPXMvcixNW3crK109KG4tYS1vKS9hKSxBJiYoTVt3KytdPXQvaSxNW3crK109bi9jLE1bdysrXT1sL2ksTVt3KytdPShuLWMtdSkvYyksVHx8KGg/KE1bdysrXT1kLE1bdysrXT1mLE1bdysrXT1tLE1bdysrXT12KTooTVt3KytdPWQsTVt3KytdPWYsTVt3KytdPW0sTVt3KytdPXYsTVt3KytdPV8sTVt3KytdPXAsTVt3KytdPWcsTVt3KytdPXgpKSx5JiYoTVt3XT1iKX0pKEwsYSxzLG8saSxjLGwsdSxoLGIsZCxmLF8sRSxBLHksVCxSLE0sdyxGLFAsQixJLGspLG9uKEwpO2NvbnN0IFU9Ty50ZXh0dXJlO3JldHVybiB3ZShPLCExKSxEdCgpLCQmJnIuYmluZCgkKSxVfSxLbj0oZSx0LG49MCxhPTEscz00LG89NCxpPTEsYz0xLGw9ITEsdT0hMSk9Pntjb25zdCBoPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYj1lLndpZHRoLGQ9ZS5oZWlnaHQsZj1Nbi54LG09TW4ueSx2PVNuKGUsdCxzLG8sYywhMSksXz12LndpZHRoLHA9di5oZWlnaHQsZz1Nbi54LWYseD1Nbi55LW0sRT1xbihlLHYsbD9iOl8sbD9kOnAsYixkLGw/MDpnLGw/MDp4LF8scCxsPy1nOjAsbD8teDowLCEwLGw/ImlubmVyIjoib3V0ZXIiLHUsaSxudWxsLG51bGwsbnVsbCx3bihuLGEsITApLEZuKG4sYSwhMCksJG4obixhLCEwKSxhLDAsMCwwLDApO3JldHVybiBVKGUpLFUodiksaCYmci5iaW5kKGgpLEV9LEhuPU1hdGguUEkvMTgwLFpuPShlLHQsbj00LGE9NDUscz0wLG89MSxpPTQsYz00LGw9MSx1PTEsaD0hMSxiPSExLGQ9ITEpPT57Y29uc3QgZj1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG09ZS53aWR0aCx2PWUuaGVpZ2h0LF89TW4ueCxwPU1uLnksZz1TbihlLHQsaSxjLHUsITEpLHg9Zy53aWR0aCxFPWcuaGVpZ2h0LEE9TW4ueCxUPU1uLnksUj1BLV8sTT1ULXAsdz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksRj1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksJD15KCksTz1hKkhuLFM9TWF0aC5jb3MoTykqbioody8kKSxrPU1hdGguc2luKE8pKm4qKEYvJCksQz1oP206eCtNYXRoLm1heCgwLE1hdGguYWJzKFMpLVIpLFA9aD92OkUrTWF0aC5tYXgoMCxNYXRoLmFicyhrKS1NKSxCPU1hdGguY2VpbChDKSxJPU1hdGguY2VpbChQKSxMPShCLUMpLzIsTj0oSS1QKS8yLEQ9aD8wOk1hdGgubWF4KDAsUi1TKStMLGo9aD8wOk1hdGgubWF4KDAsTS1rKStOLFg9aD9TLUE6KFM+MD9NYXRoLm1heCgwLFMtUik6MCkrTCx6PWg/ay1UOihrPjA/TWF0aC5tYXgoMCxrLU0pOjApK047bGV0IFYsVz0iIjtoPyhXPSJpbm5lciIsVj1ifHxkKTohYiYmZD8oVz0iZnVsbCIsVj0hMCk6KFc9Im91dGVyIixWPWIpO2NvbnN0IEc9cW4oZSxnLEIsSSxtLHYsRCxqLHgsRSxYLHosITAsVyxWLGwsbnVsbCxudWxsLG51bGwsd24ocyxvLCEwKSxGbihzLG8sITApLCRuKHMsbywhMCksbywwLDAsMCwwKTtyZXR1cm4gVShlKSxVKGcpLGYmJnIuYmluZChmKSxHfSxRbj1NYXRoLlBJLzE4MCxKbj0oZSx0LG49NCxhPTQ1LHM9MTY3NzcyMTUsbz0xLGk9MCxjPTEsbD00LHU9NCxoPTEsYj0xLGQ9MCxmPSExKT0+e2NvbnN0IG09ZS53aWR0aCx2PWUuaGVpZ2h0LF89TW4ueCxwPU1uLnksZz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSkseD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksRT15KCksQT1hKlFuLFQ9TWF0aC5jb3MoQSkqbiooZy9FKSxSPU1hdGguc2luKEEpKm4qKHgvRSksTT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHc9SChtLHYsITEpO3IuYmluZCh3KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLFNlKGUpO2NvbnN0IEY9YW4oKTtzbihGLGUud2lkdGgsZS5oZWlnaHQpLG9uKEYpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMipULDIqUikscG4oKSxzbihGLGUud2lkdGgsZS5oZWlnaHQpLG9uKEYpLER0KCk7Y29uc3QgJD13LnRleHR1cmU7TSYmci5iaW5kKE0pO2NvbnN0IE89U24oJCx0LGwsdSxiLCExKTt3ZSh3KTtjb25zdCBTPU8ud2lkdGgsaz1PLmhlaWdodCxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpLFA9TWF0aC5jZWlsKGsrMipNYXRoLmFicyhSKSk7bGV0IEI9IiI7c3dpdGNoKGQpe2Nhc2UgMDpCPSJmdWxsIjticmVhaztjYXNlIDE6Qj0iaW5uZXIiO2JyZWFrO2Nhc2UgMjpCPSJvdXRlciJ9Y29uc3QgST0iaW5uZXIiPT09QixMPUk/bTpDLE49ST92OlAsRD1NYXRoLmFicyhUKSxqPU1hdGguYWJzKFIpLFg9KFMtbSkvMix6PShrLXYpLzIsVj1JPzA6RCtYLFc9ST8wOmoreixHPXFuKGUsTyxMLE4sbSx2LFYsVyxTLGssST8tWC1UOkQtVCxJPy16LVI6ai1SLCExLEIsZixoLG51bGwsbnVsbCxudWxsLHduKHMsbywhMCksRm4ocyxvLCEwKSwkbihzLG8sITApLG8sd24oaSxjLCEwKSxGbihpLGMsITApLCRuKGksYywhMCksYyk7cmV0dXJuIE1uLng9XytWLE1uLnk9cCtXLFUoZSksVShPKSxHfSxlcj1NYXRoLlBJLzE4MCx0cj0oZSx0LG49NCxhPTQ1LHMsbyxpLGM9NCxsPTQsdT0xLGg9MSxiPTAsZD0hMSk9Pntjb25zdCBmPWUud2lkdGgsbT1lLmhlaWdodCx2PU1uLngsXz1Nbi55LHA9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGc9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHg9eSgpLEU9YSplcixBPU1hdGguY29zKEUpKm4qKHAveCksVD1NYXRoLnNpbihFKSpuKihnL3gpLFI9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxNPUgoZixtLCExKTtyLmJpbmQoTSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlKTtjb25zdCB3PWFuKCk7c24odyxlLndpZHRoLGUuaGVpZ2h0KSxvbih3KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqQSwyKlQpLHBuKCksc24odyxlLndpZHRoLGUuaGVpZ2h0KSxvbih3KSxEdCgpO2NvbnN0IEY9TS50ZXh0dXJlO1ImJnIuYmluZChSKTtjb25zdCAkPVNuKEYsdCxjLGwsaCwhMSk7d2UoTSk7Y29uc3QgTz0kLndpZHRoLFM9JC5oZWlnaHQsaz1NYXRoLmNlaWwoTysyKk1hdGguYWJzKEEpKSxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpO2xldCBQPSIiO3N3aXRjaChiKXtjYXNlIDA6UD0iZnVsbCI7YnJlYWs7Y2FzZSAxOlA9ImlubmVyIjticmVhaztjYXNlIDI6UD0ib3V0ZXIifWNvbnN0IEI9ImlubmVyIj09PVAsST1CP2Y6ayxMPUI/bTpDLE49TWF0aC5hYnMoQSksRD1NYXRoLmFicyhUKSxqPShPLWYpLzIsWD0oUy1tKS8yLHo9Qj8wOk4raixWPUI/MDpEK1gsVz1xbihlLCQsSSxMLGYsbSx6LFYsTyxTLEI/LWotQTpOLUEsQj8tWC1UOkQtVCwhMSxQLGQsdSxpLHMsbywwLDAsMCwwLDAsMCwwLDApO3JldHVybiBNbi54PXYreixNbi55PV8rVixVKGUpLFUoJCksV30sbnI9TWF0aC5QSS8xODAscnI9KGUsdCxuPTQscj00NSxhLHMsbyxpPTQsYz00LGw9MSx1PTEsaD0wLGI9ITEpPT57Y29uc3QgZD1lLndpZHRoLGY9ZS5oZWlnaHQsbT1Nbi54LHY9TW4ueSxfPVNuKGUsdCxpLGMsdSwhMSkscD1fLndpZHRoLGc9Xy5oZWlnaHQseD1Nbi54LEU9TW4ueSxBPXgtbSxUPUUtdixSPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxNPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx3PXkoKSxGPXIqbnIsJD1NYXRoLmNvcyhGKSpuKihSL3cpLE89TWF0aC5zaW4oRikqbiooTS93KSxTPTE9PT1oLGs9Uz9kOnArTWF0aC5tYXgoMCxNYXRoLmFicygkKS1BKSxDPVM/ZjpnK01hdGgubWF4KDAsTWF0aC5hYnMoTyktVCksUD1NYXRoLmNlaWwoayksQj1NYXRoLmNlaWwoQyksST0oUC1rKS8yLEw9KEItQykvMixOPVM/MDpNYXRoLm1heCgwLEEtJCkrSSxEPVM/MDpNYXRoLm1heCgwLFQtTykrTCxqPVM/JC14OigkPjA/TWF0aC5tYXgoMCwkLUEpOjApK0ksWD1TP08tRTooTz4wP01hdGgubWF4KDAsTy1UKTowKStMO2xldCB6PSIiO3N3aXRjaChoKXtjYXNlIDA6ej0iZnVsbCI7YnJlYWs7Y2FzZSAxOno9ImlubmVyIjticmVhaztjYXNlIDI6ej0ib3V0ZXIifWNvbnN0IFY9cW4oZSxfLFAsQixkLGYsTixELHAsZyxqLFgsITAseixiLGwsbyxhLHMsMCwwLDAsMCwwLDAsMCwwKTtyZXR1cm4gTW4ueD1tK04sTW4ueT12K0QsVShlKSxVKF8pLFZ9LGFyPShlLHQsbixyKT0+e2NvbnN0IGE9YGMkeygiMCIrZSkuc2xpY2UoLTIpfSR7KCIwIit0KS5zbGljZSgtMil9JHtuPyJ5IjoibiJ9JHtyPyJ5IjoibiJ9YDtpZihUbi5oYXMoYSkpcmV0dXJuIFRuLmdldChhKTtjb25zdCBzPShyPzE6MikrTWF0aC5jZWlsKGUqdC80KSxvPW5ldyAkdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKChlLHQsbixyLGEpPT57Y29uc3Qgcz1NYXRoLmZsb29yKC41KnQpLG89TWF0aC5mbG9vciguNSpuKSxpPXQqbjtsZXQgYz0iIjtjb25zdCBsPWE/MToyO2ZvcihsZXQgZT0wO2U8aTsrK2UpYys9YFxuICAgIHJlc3VsdCArPSBnZXRXZWlnaHRlZENvbG9yKCR7ZX0sIHVfbWVkaXVtcFske2wrTWF0aC5mbG9vcihlLzQpfV1bJHtlJTR9XSk7XG5gO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7ZX1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52ZWM0IGdldFdlaWdodGVkQ29sb3IgKGluIGludCBpLCBpbiBmbG9hdCB3ZWlnaHQpIHtcbiAgICB2ZWMyIHJjcF9zaXplID0gdV9tZWRpdW1wWzBdLnh5O1xuXG4gICAgaW50IGlfZGl2X3ggPSBpIC8gJHt0fTtcbiAgICBpbnQgaV9tb2RfeCA9IGkgLSAke3R9ICogaV9kaXZfeDtcbiAgICB2ZWMyIG9mZnNldCA9IHZlYzIoaV9tb2RfeCAtICR7c30sICR7b30gLSBpX2Rpdl94KTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHJjcF9zaXplO1xuXG4gICAgdmVjNCBjb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB1dik7XG4gICAgY29sb3IucmdiIC89IG1heCgwLjAwMDEsIGNvbG9yLmEpO1xuICAgICR7YT8iIjoiXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzFdO1xuICAgIGNvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIGNvbG9yLCBpc0luc2lkZSh1dikpO1xuIn1cblxuICAgIHJldHVybiBjb2xvciAqIHdlaWdodDtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIGZsb2F0IHJjcF9kaXZpc29yID0gdV9tZWRpdW1wWzBdLno7XG4gICAgZmxvYXQgYmlhcyAgICAgICAgPSB1X21lZGl1bXBbMF0udztcblxuICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApO1xuICAgICR7Y31cbiAgICByZXN1bHQgPSBjbGFtcChyZXN1bHQgKiByY3BfZGl2aXNvciArIGJpYXMsIDAuMCwgMS4wKTtcbiAgICAke3I/InJlc3VsdC5hID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpLmE7IjoiIn1cblxuICAgIHJlc3VsdC5yZ2IgKj0gcmVzdWx0LmE7XG4gICAgb19jb2xvciA9IHJlc3VsdDtcbn1gfSkocyxlLHQsbixyKSk7cmV0dXJuIFRuLnNldChhLG8pLG99LHNyPShlLHQ9MCxuPTAsYSxzPTEsbz0wLGk9ITAsYz0hMCxsPTAsdT0wKT0+e2NvbnN0IGg9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxiPWUud2lkdGgsZD1lLmhlaWdodCxmPUgoYixkLCExKTtyLmJpbmQoZiksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlLCEwKSxEdCgpO2NvbnN0IG09YXIodCxuLGksYyk7KChlLHQsbixyLGEscyxvLGksYyxsLHUpPT57Y29uc3QgaD1lLm1lZGl1bXA7aFswXT0xL3QsaFsxXT0xL24saFsyXT0xL2EsaFszXT1zLzI1NTtsZXQgYj00O298fChoW2IrK109aSxoW2IrK109YyxoW2IrK109bCxoW2IrK109dSk7Y29uc3QgZD1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKWhbYisrXT1yW2VdfSkobSxiLGQsYSxzLG8sYyx3bihsLHUsITEpLEZuKGwsdSwhMSksJG4obCx1LCExKSx1KSxvbihtKTtjb25zdCB2PWYudGV4dHVyZTtyZXR1cm4gVShlKSx3ZShmLCExKSxoJiZyLmJpbmQoaCksdn0sb3I9KGUsdCxuLGE9MCxzPTAsbz0wLGk9MCxjPTAsbD0wLHU9MCxoPTAsYj0yLGQ9MCxmPTApPT57Y29uc3QgbT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHY9eSgpLF89TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pL3YscD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSkvdixnPWUud2lkdGgseD1lLmhlaWdodCxFPWcvXyxBPXgvcCxUPUgoZyx4LCExKTtyLmJpbmQoVCk7Y29uc3QgUj1FbihhLHMsbik7cm4oZSxSKTtjb25zdCBNPSgoZSx0LG4pPT57Y29uc3Qgcj1gZCR7ZX0ke3R9JHtufWA7aWYoVG4uaGFzKHIpKXJldHVybiBUbi5nZXQocik7Y29uc3QgYT1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scik9PntsZXQgYSxzLG87c3dpdGNoKHQpe2Nhc2UgMTphPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOmE9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6YT0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODphPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDphPSIwLjUifXN3aXRjaChuKXtjYXNlIDE6cz0ibWFwX2NvbG9yLnIiO2JyZWFrO2Nhc2UgMjpzPSJtYXBfY29sb3IuZyI7YnJlYWs7Y2FzZSA0OnM9Im1hcF9jb2xvci5iIjticmVhaztjYXNlIDg6cz0ibWFwX2NvbG9yLmEiO2JyZWFrO2RlZmF1bHQ6cz0iMC41In1zd2l0Y2gocil7Y2FzZSAwOm89IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1dik7XG4iO2JyZWFrO2Nhc2UgMzpvPSJcbiAgICB2ZWM0IHNvdXJjZV9jb2xvciA9dGV4dHVyZSh1X3RleHR1cmVzWzBdLCBtaXgodl9jb29yZCwgdXYsIHN0ZXAoYWJzKHV2IC0gdmVjMigwLjUpKSwgdmVjMigwLjUpKSkpO1xuIjticmVhaztjYXNlIDE6bz0iXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzJdO1xuICAgIHZlYzQgc291cmNlX2NvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIHRleHR1cmUodV90ZXh0dXJlc1swXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztkZWZhdWx0Om89IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBmcmFjdCh1dikpO1xuIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHtlfV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2X3RvX3N0X3NjYWxlICA9IHVfbWVkaXVtcFswXS54eTtcbiAgICB2ZWMyIHV2X3RvX3N0X29mZnNldCA9IHVfbWVkaXVtcFswXS56dztcbiAgICB2ZWMyIHNjYWxlICAgICAgICAgICA9IHVfbWVkaXVtcFsxXS54eTtcblxuICAgIHZlYzIgc3QgPSB2X2Nvb3JkICogdXZfdG9fc3Rfc2NhbGUgLSB1dl90b19zdF9vZmZzZXQ7XG4gICAgdmVjNCBtYXBfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHN0KTtcblxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigke2F9LCAke3N9KSAtIDAuNTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHNjYWxlO1xuICAgICR7b31cblxuICAgIG9fY29sb3IgPSBtaXgodGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKSwgc291cmNlX2NvbG9yLCBpc0luc2lkZShzdCkpO1xufWB9KSgxPT09bj8zOjIsZSx0LG4pKTtyZXR1cm4gVG4uc2V0KHIsYSksYX0pKGMsbCxiKTsoKGUsdCxuLHIsYSxzLG8saSxjLGwsdSxoLGIsZCk9Pntjb25zdCBmPWUudGV4dHVyZXM7ZlswXT0wLGZbMV09MTtjb25zdCBtPWUubWVkaXVtcDttWzBdPXIvdCxtWzFdPWEvbixtWzJdPXMvdCxtWzNdPShhLW4tbykvbixtWzRdPWkvcixtWzVdPS1jL2EsMT09PWwmJihtWzhdPXUsbVs5XT1oLG1bMTBdPWIsbVsxMV09ZCl9KShNLGcseCxFLEEsbyxpLHUsaCxiLHduKGQsZiwhMCksRm4oZCxmLCEwKSwkbihkLGYsITApLGYpLER0KCksb24oTSk7Y29uc3Qgdz1ULnRleHR1cmU7cmV0dXJuIG0mJnIuYmluZChtKSxVKGUpLFUoUiksd2UoVCwhMSksd30saXI9KGUsdCxuLGEpPT57Y29uc3Qgcz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG89ZS53aWR0aCxpPWUuaGVpZ2h0O3N3aXRjaChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7ci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLG4sYSk7Y29uc3Qgcz1mbighMCk7KChlLHQsbixhKT0+e2NvbnN0IHM9ZS5oaWdocCxvPXIuJG1hdHJpeDtzWzBdPW9bMF0sc1sxXT1vWzFdLHNbMl09b1szXSxzWzNdPW9bNF0sc1s0XT1vWzZdLHNbNV09b1s3XSxzWzZdPW4sc1s3XT1hLHNbOF09eCgpLHNbOV09RSgpO2NvbnN0IGk9ZS5tZWRpdW1wO2lbMF09dFswXSxpWzFdPXRbMV0saVsyXT10WzJdLGlbM109dFszXSxpWzRdPXRbNF0saVs1XT10WzVdLGlbNl09dFs2XSxpWzddPXRbN119KShzLHQsbyxpKSxTZShlKSxnbihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksb24ocyl9YnJlYWs7ZGVmYXVsdDp7Y29uc3Qgcz11bihuLGEsbyxpKSxjPUgobyxpLCExKTtyLmJpbmQoYykscm4ocyxlKTtjb25zdCBsPUp0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTtkbihsLHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSksb24obCksci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxuLGEpLGJuKGMudGV4dHVyZSksVShzKSx3ZShjKX19cyYmci5iaW5kKHMpLER0KCl9LGNyPVtdLGxyPWU9PntlLnNpemUmJmUuY2xlYXIoKSxjci5wdXNoKGUpfSx1cj0oZSx0LG4scixhPW51bGwpPT57dC5oYXMobil8fHQuc2V0KG4sY3IucG9wKCl8fG5ldyBNYXApO2NvbnN0IHM9dC5nZXQobik7aWYobnVsbD09PWEpe2lmKCFzLmhhcyhyKSlyZXR1cm47cmV0dXJuIGUuZGVzdHJveShzLmdldChyKSkscy5kZWxldGUociksdm9pZChzLnNpemV8fCh0LmRlbGV0ZShuKSxscihzKSkpfXMuc2V0KHIsYSl9O2NvbnN0IGhyPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRzdG9yZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHRyYXNoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiR0aW1lcklkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRyZW1vdmVDYWNoZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlSWRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5fJHBvb2w9W10sdGhpcy5fJHN0b3JlPW5ldyBNYXAsdGhpcy5fJHRyYXNoPW5ldyBNYXAsdGhpcy4kdGltZXJJZD1udWxsLHRoaXMuJHJlbW92ZUlkcz1bXSx0aGlzLiRyZW1vdmVDYWNoZT0hMX1yZXNldCgpeygoZSx0LG4pPT57bi5jbGVhcigpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCk7Zm9yKGNvbnN0IG4gb2YgdC52YWx1ZXMoKSl7Zm9yKGNvbnN0IHQgb2Ygbi52YWx1ZXMoKSl0JiZlLmRlc3Ryb3kodCk7bHIobil9dC5jbGVhcigpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoKX1kZXN0cm95KGU9bnVsbCl7KChlLHQpPT57aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiY2FudmFzImluIHQpe2NvbnN0IG49dC5jYW52YXMscj1uLndpZHRoLGE9bi5oZWlnaHQ7dC5jbGVhclJlY3QoMCwwLHIrMSxhKzEpLG4ud2lkdGg9bi5oZWlnaHQ9MSxlLnB1c2gobil9fSkodGhpcy5fJHBvb2wsZSl9Z2V0Q2FudmFzKCl7cmV0dXJuIHRoaXMuXyRwb29sLnBvcCgpfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX1yZW1vdmUoZSx0KXsoKGUsdCxuKT0+e2lmKCFlLmhhcyh0KSlyZXR1cm47Y29uc3Qgcj1lLmdldCh0KTtyLmhhcyhuKSYmKHIuZGVsZXRlKG4pLHIuc2l6ZXx8KGxyKHIpLGUuZGVsZXRlKHQpKSl9KSh0aGlzLl8kc3RvcmUsZSx0KX1yZW1vdmVUaW1lcihlKXsoKGUsdCxuLHIpPT57aWYobi5oYXMocikpcmV0dXJuO2NvbnN0IGE9dC5nZXQocik7YSYmKGEuc2V0KCJ0cmFzaCIsITApLG4uc2V0KHIsYSksbnVsbCE9PWUuJHRpbWVySWQmJmNsZWFyVGltZW91dChlLiR0aW1lcklkKSxlLiRyZW1vdmVDYWNoZT0hMSxlLiR0aW1lcklkPXNldFRpbWVvdXQoKCgpPT57ZS4kcmVtb3ZlQ2FjaGU9ITAsZS4kdGltZXJJZD1udWxsfSksMWUzKSl9KSh0aGlzLHRoaXMuXyRzdG9yZSx0aGlzLl8kdHJhc2gsZSl9cmVtb3ZlVGltZXJTY2hlZHVsZWRDYWNoZSgpeygoZSx0KT0+e2lmKHQuc2l6ZSl7Zm9yKGNvbnN0W24scl1vZiB0KXIuaGFzKCJ0cmFzaCIpJiYoZS5yZW1vdmVCeUlkKG4pLGUuJHJlbW92ZUlkcy5wdXNoKCtuKSk7dC5jbGVhcigpLGUuJHJlbW92ZUNhY2hlPSExfX0pKHRoaXMsdGhpcy5fJHRyYXNoKX1yZW1vdmVCeUlkKGUpeygoZSx0LG4pPT57aWYoIXQuaGFzKG4pKXJldHVybjtjb25zdCByPXQuZ2V0KG4pO2Zvcihjb25zdCB0IG9mIHIudmFsdWVzKCkpZS5kZXN0cm95KHQpO3QuZGVsZXRlKG4pLGxyKHIpfSkodGhpcyx0aGlzLl8kc3RvcmUsZSl9Z2V0QnlJZChlKXtyZXR1cm4gdGhpcy5fJHN0b3JlLmdldChlKX1nZXQoZSx0KXtyZXR1cm4oKGUsdCxuKT0+e2NvbnN0IHI9ZS5nZXQodCl8fG51bGw7cmV0dXJuIHI/KHIuZGVsZXRlKCJ0cmFzaCIpLHIuZ2V0KG4pfHxudWxsKTpudWxsfSkodGhpcy5fJHN0b3JlLGUsdCl9c2V0KGUsdCxuPW51bGwpe3VyKHRoaXMsdGhpcy5fJHN0b3JlLGUsdCxuKX1oYXMoZSx0PSIiKXtyZXR1cm4oKGUsdCxuPSIiKT0+bj8hIWUuaGFzKHQpJiZlLmdldCh0KS5oYXMobik6ZS5oYXModCkpKHRoaXMuXyRzdG9yZSxlLHQpfWdlbmVyYXRlS2V5cyhlLHQsbil7cmV0dXJuKChlLHQsbik9Pntjb25zdCByPVsxMDAqZSwxMDAqdF07biYmci5wdXNoKDEwMCpuKTtsZXQgYT0yMTY2MTM2MjYxO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7KytlKXtsZXQgdD0wfHJbZV07Zm9yKGxldCBlPTA7ZTw0O2UrKylhXj0yNTUmdCxhPU1hdGguaW11bChhLDE2Nzc3NjE5KSx0Pj4+PTh9cmV0dXJuKGE+Pj4wKSUxNjc3NzIxNn0pKGUsdCxuKX1nZW5lcmF0ZUZpbHRlcktleXMoZSx0LG4scil7cmV0dXJuKChlLHQsbixyKT0+YCR7ZX0ke3R9JHtufSR7cn1gKShlLHQsbixyKX19LGJyPShlLHQsbixhLHMsbyxpLGMsbCx1LGgpPT57Y29uc3QgYj1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2xldCBkPW51bGw7Y29uc3QgZj1NYXRoLnNxcnQoaVswXSppWzBdK2lbMV0qaVsxXSksXz1NYXRoLnNxcnQoaVsyXSppWzJdK2lbM10qaVszXSkscD1oci5nZW5lcmF0ZUZpbHRlcktleXMoaVswXSxpWzFdLGlbMl0saVszXSk7bGV0IGc9ITE7aWYoaHIuZ2V0KHQsImZLZXkiKT09PXApe2NvbnN0IGU9aHIuZ2V0KHQsImZUZXh0dXJlIik7bj9VKGUpOihnPSEwLGQ9ZSl9bGV0IHg9MCxFPTA7aWYoZyl4PWhyLmdldCh0LCJvZmZzZXRYIiksRT1oci5nZXQodCwib2Zmc2V0WSIpO2Vsc2V7ZD1ubihlKTtjb25zdCB0PU1hdGguYXRhbjIoaVsxXSxpWzBdKSxuPU1hdGguYXRhbjIoLWlbMl0saVszXSksYz1vP2YqTWF0aC5jb3ModCk6TWF0aC5jb3ModCksbD1vP2YqTWF0aC5zaW4odCk6TWF0aC5zaW4odCksdT1vPy1fKk1hdGguc2luKG4pOi1NYXRoLnNpbihuKSxwPW8/XypNYXRoLmNvcyhuKTpNYXRoLmNvcyhuKSxnPW0oYyxsLHUscCxhLzIscy8yKSxBPW0oMSwwLDAsMSwtZS53LzIsLWUuaC8yKSx5PSgoZSx0KT0+e2NvbnN0IG49ZVswXSxyPWVbMV0sYT1lWzJdLHM9ZVszXSxvPWVbNF0saT1lWzVdLGM9dFswXSxsPXRbMV0sdT10WzJdLGg9dFszXSxiPXRbNF0sZD10WzVdO3JldHVybiBtKG4qYythKmwscipjK3MqbCxuKnUrYSpoLHIqdStzKmgsbipiK2EqZCtvLHIqYitzKmQraSl9KShnLEEpO2lmKHYoZyksdihBKSwxIT09eVswXXx8MCE9PXlbMV18fDAhPT15WzJdfHwxIT09eVszXSl7Y29uc3QgZT1IKGEscywhMSk7ci5iaW5kKGUpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybSh5WzBdLHlbMV0seVsyXSx5WzNdLHlbNF0seVs1XSkseD15WzRdLEU9eVs1XSxTZShkKTtjb25zdCB0PWZuKCk7bW4odCxkLndpZHRoLGQuaGVpZ2h0KSxvbih0KSxVKGQpLGQ9ZS50ZXh0dXJlLHdlKGUsITEpLGImJnIuYmluZChiKX12KHkpLE1uLng9MCxNbi55PTA7Zm9yKGxldCBlPTA7aC5sZW5ndGg+ZTspe3N3aXRjaChoW2UrK10pe2Nhc2UgMDpkPUpuKGQsaSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSAxOmQ9U24oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdKTticmVhaztjYXNlIDI6ZD1rbihkLG5ldyBGbG9hdDMyQXJyYXkoW2hbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK11dKSk7YnJlYWs7Y2FzZSAzOntjb25zdCB0PWhbZSsrXSxuPWhbZSsrXSxyPXQqbixhPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1zcihkLHQsbixhLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSxoW2UrK10saFtlKytdKX1icmVhaztjYXNlIDQ6e2NvbnN0IHQ9aFtlKytdLG49bmV3IFVpbnQ4QXJyYXkodCk7bi5zZXQoaC5zdWJhcnJheShlLGUrdCkpLGUrPXQsZD1vcihkLGksbixoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdKX1icmVhaztjYXNlIDU6ZD1abihkLGksaFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSksQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSk7YnJlYWs7Y2FzZSA2OmQ9S24oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSxCb29sZWFuKGhbZSsrXSkpO2JyZWFrO2Nhc2UgNzp7Y29uc3QgdD1oW2UrK10sbj1oW2UrK107bGV0IHI9aFtlKytdO2NvbnN0IGE9aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBzPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIscj1oW2UrK107Y29uc3Qgbz1oLnN1YmFycmF5KGUsZStyKTtlKz1yLGQ9dHIoZCxpLHQsbixhLHMsbyxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSl9YnJlYWs7Y2FzZSA4Ontjb25zdCB0PWhbZSsrXSxuPWhbZSsrXTtsZXQgcj1oW2UrK107Y29uc3QgYT1oLnN1YmFycmF5KGUsZStyKTtlKz1yLHI9aFtlKytdO2NvbnN0IHM9aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBvPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIsZD1ycihkLGksdCxuLGEscyxvLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pKX19fX1pZihkKXtjb25zdCBlPXkoKSx0PXVbMF0qKGYvZSksbj11WzFdKihfL2UpO3IucmVzZXQoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249bCxpcihkLGMsLXgrdCtpWzRdLC1FK24raVs1XSl9Z3x8KGhyLnNldCh0LCJmS2V5IixwKSxoci5zZXQodCwiZlRleHR1cmUiLGQpLGhyLnNldCh0LCJvZmZzZXRYIix4KSxoci5zZXQodCwib2Zmc2V0WSIsRSkpLGImJnIuYmluZChiKX0sZHI9KGUsdCxyLGEpPT57bi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBzPSEhYSxvPWt0KHMpO2EmJkN0KG8sYSksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLGp0KG8sZSx0LHIpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IGk9KGU9Pntjb25zdCB0PSJzIisoZT8ieSI6Im4iKTtpZihPdC5oYXModCkpcmV0dXJuIE90LmdldCh0KTtjb25zdCBuPW5ldyAkdChTdChlPzk6MCwhMSwhMSxlKSwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxuaW4gdmVjNCB2X2NvbG9yO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KHZfY29sb3IucmdiICogdl9jb2xvci5hLCB2X2NvbG9yLmEpO1xufSIpO3JldHVybiBPdC5zZXQodCxuKSxufSkocyk7YSYmKChlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfSkoaSxhKSxqdChpLGUsdCxyKX0sZnI9KGUsdCxuLHIsYSk9Pntjb25zdCBzPWUubWVkaXVtcDtsZXQgbz0wO2ZvcihsZXQgZT1uO2U8cjsrK2Upe2NvbnN0IG49NSplO3NbbysrXT1hW3RbbisxXV0sc1tvKytdPWFbdFtuKzJdXSxzW28rK109YVt0W24rM11dLHNbbysrXT1hW3Rbbis0XV19Zm9yKGxldCBlPW47ZTxyOysrZSlzW28rK109dFs1KmVdfSxtcj0oZSx0KT0+e2NvbnN0IGE9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxzPW4uZ2V0UGFyYW1ldGVyKG4uU0NJU1NPUl9CT1gpO24uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCk7Y29uc3Qgbz16bigpO3IuYmluZChvKTtjb25zdCBpPTA9PT10LGM9ZS5sZW5ndGgvNSxsPWk/R246WW47aG4oKTtjb25zdCB1PVduKCk7Zm9yKGxldCB0PTA7dDxjO3QrPXUtMSl7Y29uc3Qgbj1NYXRoLm1pbih0K3UsYykscj1MbihuLXQsaSk7ZnIocixlLHQsbixsKSxqbihyLGVbMF0sZVtlLmxlbmd0aC01XSl9cmV0dXJuIER0KCksYSYmci5iaW5kKGEpLERlKHNbMF0sc1sxXSxzWzJdLHNbM10pLG8udGV4dHVyZX0sdnI9bmV3IE1hcCxfcj0oZSx0LG4scik9Pntjb25zdCBhPSgoZSx0LG4scik9PmAke2U/InkiOiJuIn0ke3Q/InkiOiJuIn0ke3QmJm4/InkiOiJuIn0ke3J9YCkocixlLHQsbik7aWYodnIuaGFzKGEpKXJldHVybiB2ci5nZXQoYSk7Y29uc3Qgcz0xKyhyPzE0OjUpLG89cy0xLGk9bmV3ICR0KFN0KHMsITAsITEsciksKChlLHQsbixyLGEpPT57Y29uc3Qgcz1uPygoZSx0KT0+e2NvbnN0IG49dD8oZT0+YFxuICAgIHZlYzIgZm9jYWwgPSB2ZWMyKHVfaGlnaHBbJHtlfV1bMV0sIDAuMCk7XG5cbiAgICB2ZWMyIGRpciA9IG5vcm1hbGl6ZShjb29yZCAtIGZvY2FsKTtcblxuICAgIGZsb2F0IGEgPSBkb3QoZGlyLCBkaXIpO1xuICAgIGZsb2F0IGIgPSAyLjAgKiBkb3QoZGlyLCBmb2NhbCk7XG4gICAgZmxvYXQgYyA9IGRvdChmb2NhbCwgZm9jYWwpIC0gMS4wO1xuICAgIGZsb2F0IHggPSAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKSAvICgyLjAgKiBhKTtcblxuICAgIGZsb2F0IHQgPSBkaXN0YW5jZShmb2NhbCwgY29vcmQpIC8gZGlzdGFuY2UoZm9jYWwsIGZvY2FsICsgZGlyICogeCk7YCkoZSk6ImZsb2F0IHQgPSBsZW5ndGgoY29vcmQpOyI7cmV0dXJuYFxuICAgIGZsb2F0IHJhZGl1cyA9IHVfaGlnaHBbJHtlfV1bMF07XG4gICAgdmVjMiBjb29yZCA9IHAgLyByYWRpdXM7XG4gICAgJHtufVxuYH0pKHQscik6KGU9PmBcbiAgICB2ZWMyIGEgPSB1X2hpZ2hwWyR7ZX1dLnh5O1xuICAgIHZlYzIgYiA9IHVfaGlnaHBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIGFiID0gYiAtIGE7XG4gICAgdmVjMiBhcCA9IHAgLSBhO1xuXG4gICAgZmxvYXQgdCA9IGRvdChhYiwgYXApIC8gZG90KGFiLCBhYik7YCkodCk7bGV0IG87c3dpdGNoKGEpe2Nhc2UgMDpvPSIxLjAgLSBhYnMoZnJhY3QodCAqIDAuNSkgKiAyLjAgLSAxLjApIjticmVhaztjYXNlIDE6bz0iZnJhY3QodCkiO2JyZWFrO2RlZmF1bHQ6bz0iY2xhbXAodCwgMC4wLCAxLjApIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X2hpZ2hwWyR7ZX1dO1xuICAgIFxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcbiAgICBcbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHAgPSB2X3V2O1xuICAgICR7c31cbiAgICB0ID0gJHtvfTtcbiAgICBvX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmUsIHZlYzIodCwgMC41KSk7XG59YH0pKHMsbyxlLHQsbikpO3JldHVybiB2ci5zZXQoYSxpKSxpfSxwcj0oZSx0LG4scixzPTAsbz1udWxsLGk9bnVsbCk9Pntjb25zdCBjPWUuaGlnaHA7Y1swXT1uWzBdLGNbMV09blsxXSxjWzJdPW5bMl0sY1s0XT1uWzNdLGNbNV09bls0XSxjWzZdPW5bNV0sY1s4XT1uWzZdLGNbOV09bls3XSxjWzEwXT1uWzhdLGNbMTJdPXJbMF0sY1sxM109clsxXSxjWzE0XT1yWzJdLGNbMTZdPXJbM10sY1sxN109cls0XSxjWzE4XT1yWzVdLGNbMTFdPXJbNl0sY1sxNV09cls3XSxjWzE5XT1yWzhdLGNbM109eCgpLGNbN109RSgpO2xldCBsPTIwO2kmJihjWzIwXT1pWzBdLGNbMjFdPWlbMV0sY1syMl09MCxjWzI0XT1pWzJdLGNbMjVdPWlbM10sY1syNl09MCxjWzI4XT1pWzRdLGNbMjldPWlbNV0sY1szMF09MSxjWzMyXT1pWzZdLGNbMzNdPWlbN10sY1szNF09MCxjWzM2XT1pWzhdLGNbMzddPWlbOV0sY1szOF09MCxjWzQwXT1pWzEwXSxjWzQxXT1pWzExXSxjWzQyXT0xLGNbMzFdPWlbMTJdLGNbMzVdPWlbMTNdLGNbMzldPWlbMTRdLGNbNDNdPWlbMTVdLGNbNDRdPWlbMTZdLGNbNDVdPWlbMTddLGNbNDZdPWlbMThdLGNbNDddPWlbMTldLGNbNDhdPWlbMjBdLGNbNDldPWlbMjFdLGNbNTBdPWlbMjJdLGNbNTFdPWlbMjNdLGNbNTJdPWlbMjRdLGNbNTNdPWlbMjVdLGw9NTYpLDA9PT10PyhjW2wrK109b1swXSxjW2wrK109b1sxXSxjW2wrK109b1syXSxjW2xdPW9bM10pOihjW2wrK109ODE5LjIsY1tsXT1hKHMsLS45NzUsLjk3NSwwKSl9LGdyPShlLHQsYSxzKT0+e2NvbnN0IG89S2Uuc2hpZnQoKSxpPUtlLnNoaWZ0KCksYz1LZS5zaGlmdCgpLGw9S2Uuc2hpZnQoKTtuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpO2NvbnN0IGI9bXIobyxsKTtTZShiKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksbi5mcm9udEZhY2Uobi5DQ1cpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uRlJPTlQsbi5LRUVQLG4uS0VFUCxuLklOQ1JfV1JBUCksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkJBQ0ssbi5LRUVQLG4uS0VFUCxuLkRFQ1JfV1JBUCksbi5jb2xvck1hc2soITEsITEsITEsITEpO2NvbnN0IGQ9ISFzLGY9a3QoZCk7cyYmQ3QoZixzKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksanQoZixlLHQsYSksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uTk9URVFVQUwsMCwyNTUpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLlpFUk8sbi5aRVJPKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCk7Y29uc3QgbT1fcighMSwhMSxjLGQpLHA9KGU9Pntjb25zdCB0PS04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxuPTgxOS4yKmVbMF0tODE5LjIqZVsyXStlWzRdLHI9LTgxOS4yKmVbMF0rODE5LjIqZVsyXStlWzRdLGE9LTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdLHM9ODE5LjIqZVsxXS04MTkuMiplWzNdK2VbNV07bGV0IG89ci10LGk9LTgxOS4yKmVbMV0rODE5LjIqZVszXStlWzVdLWE7Y29uc3QgYz1NYXRoLnNxcnQobypvK2kqaSk7Yz8oby89YyxpLz1jKToobz0wLGk9MCk7Y29uc3QgbD0obi10KSpvKyhzLWEpKmk7cmV0dXJuIHUodCtsKm8sYStsKmksbixzKX0pKGkpLGc9XyhyLiRtYXRyaXgpO3ByKG0sMCxyLiRtYXRyaXgsZywwLHAscyksaChwKSx2KGcpLGp0KG0sZSx0LGEpfSx4cj0oZSx0LGEscyk9Pntjb25zdCBvPUtlLnNoaWZ0KCksaT1LZS5zaGlmdCgpLGM9S2Uuc2hpZnQoKSxsPUtlLnNoaWZ0KCksdT1LZS5zaGlmdCgpO24uZGlzYWJsZShuLlNURU5DSUxfVEVTVCk7Y29uc3QgaD1tcihvLGwpO1NlKGgpLG4uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5GUk9OVCxuLktFRVAsbi5LRUVQLG4uSU5DUl9XUkFQKSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uQkFDSyxuLktFRVAsbi5LRUVQLG4uREVDUl9XUkFQKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSk7Y29uc3QgYj0hIXMsZD1rdChiKTtzJiZDdChkLHMpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxqdChkLGUsdCxhKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLG4uc3RlbmNpbEZ1bmMobi5OT1RFUVVBTCwwLDI1NSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uWkVSTyxuLlpFUk8pLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxyLnNhdmUoKSxyLnRyYW5zZm9ybShpWzBdLGlbMV0saVsyXSxpWzNdLGlbNF0saVs1XSk7Y29uc3QgZj1yLiRzdGFja1tyLiRzdGFjay5sZW5ndGgtMV0sbT1fKHIuJG1hdHJpeCkscD1fcighMCxCb29sZWFuKHUpLGMsYik7cHIocCwxLGYsbSx1LHMpLHIucmVzdG9yZSgpLHYobSksanQocCxlLHQsYSl9LEVyPW5ldyBNYXAsQXI9KGUsdCxhLHMpPT57bi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBvPSEhcyxpPWt0KG8pO3MmJkN0KGkscyksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLGp0KGksZSx0LGEpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk7Y29uc3QgYz15bi5zaGlmdCgpLGw9eW4uc2hpZnQoKSx1PXluLnNoaWZ0KCksaD15bi5zaGlmdCgpLGI9eW4uc2hpZnQoKSxkPXluLnNoaWZ0KCksZj1Fbih1LGgsYyxkKTtyLnNhdmUoKSxyLnRyYW5zZm9ybShsWzBdLGxbMV0sbFsyXSxsWzNdLGxbNF0sbFs1XSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IG09KChlLHQpPT57Y29uc3Qgbj1gYiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifWA7aWYoRXIuaGFzKG4pKXJldHVybiBFci5nZXQobik7Y29uc3Qgcj1lPyIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWzFdO1xuXG5pbiB2ZWMyIHZfdXY7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiB1diA9IGZyYWN0KHZlYzIodl91di54LCAtdl91di55KSAvIHVfbWVkaXVtcFswXS54eSk7XG4gICAgXG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIG9fY29sb3IgPSBzcmM7XG59IjoiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsxXTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXYgPSB2ZWMyKHZfdXYueCwgdV9tZWRpdW1wWzBdLnkgLSB2X3V2LnkpIC8gdV9tZWRpdW1wWzBdLnh5O1xuXG4gICAgdmVjNCBzcmMgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdXYpO1xuICAgIG9fY29sb3IgPSBzcmM7XG59IixhPW5ldyAkdChTdCh0PzE0OjUsITAsITEsdCkscik7cmV0dXJuIEVyLnNldChuLGEpLGF9KShiLG8pOygoZSx0LG4sYSk9Pntjb25zdCBzPWUuaGlnaHAsbz1yLiRzdGFja1tyLiRzdGFjay5sZW5ndGgtMV07c1swXT1vWzBdLHNbMV09b1sxXSxzWzJdPW9bMl0sc1s0XT1vWzNdLHNbNV09b1s0XSxzWzZdPW9bNV0sc1s4XT1vWzZdLHNbOV09b1s3XSxzWzEwXT1vWzhdO2NvbnN0IGk9XyhyLiRtYXRyaXgpO3NbMTJdPWlbMF0sc1sxM109aVsxXSxzWzE0XT1pWzJdLHNbMTZdPWlbM10sc1sxN109aVs0XSxzWzE4XT1pWzVdLHNbMTFdPWlbNl0sc1sxNV09aVs3XSxzWzE5XT1pWzhdLHNbM109eCgpLHNbN109RSgpLGEmJihzWzIwXT1hWzBdLHNbMjFdPWFbMV0sc1syMl09MCxzWzI0XT1hWzJdLHNbMjVdPWFbM10sc1syNl09MCxzWzI4XT1hWzRdLHNbMjldPWFbNV0sc1szMF09MSxzWzMyXT1hWzZdLHNbMzNdPWFbN10sc1szNF09MCxzWzM2XT1hWzhdLHNbMzddPWFbOV0sc1szOF09MCxzWzQwXT1hWzEwXSxzWzQxXT1hWzExXSxzWzQyXT0xLHNbMzFdPWFbMTJdLHNbMzVdPWFbMTNdLHNbMzldPWFbMTRdLHNbNDNdPWFbMTVdLHNbNDRdPWFbMTZdLHNbNDVdPWFbMTddLHNbNDZdPWFbMThdLHNbNDddPWFbMTldLHNbNDhdPWFbMjBdLHNbNDldPWFbMjFdLHNbNTBdPWFbMjJdLHNbNTFdPWFbMjNdLHNbNTJdPWFbMjRdLHNbNTNdPWFbMjVdKTtjb25zdCBjPWUubWVkaXVtcDtjWzBdPXQsY1sxXT1ufSkobSx1LGgscyksanQobSxlLHQsYSksci5yZXN0b3JlKCksVShmKX07bGV0IHlyPTA7Y29uc3QgVHI9YXN5bmMoZSx0KT0+e2NvbnN0IGE9bG4oMCwwLGUsdCk7U2UoYSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixUZSksbi5mcmFtZWJ1ZmZlclRleHR1cmUyRChuLkZSQU1FQlVGRkVSLG4uQ09MT1JfQVRUQUNITUVOVDAsbi5URVhUVVJFXzJELGEucmVzb3VyY2UsMCk7Y29uc3Qgcz1uZXcgVWludDhBcnJheShlKnQqNCksbz1yLiRtYWluQXR0YWNobWVudE9iamVjdDtzLmJ5dGVMZW5ndGg+eXImJih5cj1jKHMuYnl0ZUxlbmd0aCksbi5idWZmZXJEYXRhKG4uUElYRUxfUEFDS19CVUZGRVIseXIsbi5TVFJFQU1fUkVBRCkpLG4ucmVhZFBpeGVscygwLG8uaGVpZ2h0LXQsZSx0LG4uUkdCQSxuLlVOU0lHTkVEX0JZVEUsMCk7Y29uc3QgaT1uLmZlbmNlU3luYyhuLlNZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFLDApO2F3YWl0IG5ldyBQcm9taXNlKChlPT57Y29uc3QgdD0oKT0+e2lmKG4uY2xpZW50V2FpdFN5bmMoaSxuLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULDApIT09bi5USU1FT1VUX0VYUElSRUQpcmV0dXJuIG4uZGVsZXRlU3luYyhpKSxuLmdldEJ1ZmZlclN1YkRhdGEobi5QSVhFTF9QQUNLX0JVRkZFUiwwLHMpLGUoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9O3QoKX0pKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGRlKTtjb25zdCBsPW5ldyBPZmZzY3JlZW5DYW52YXMoZSx0KSx1PWwuZ2V0Q29udGV4dCgiMmQiKSxoPW5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHMpLGUsdCk7cmV0dXJuIHUucHV0SW1hZ2VEYXRhKGgsMCwwKSxhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChsLHtpbWFnZU9yaWVudGF0aW9uOiJmbGlwWSJ9KX07Y2xhc3MgUnJ7Y29uc3RydWN0b3IoYSxzLGk9MSl7dmFyIGM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRzdGFjayIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWF0cml4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yUiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckciLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JCIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yQSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkbWFpbkF0dGFjaG1lbnRPYmplY3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxBbHBoYSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaW1hZ2VTbW9vdGhpbmdFbmFibGVkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRmaWxsU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0cm9rZVN0eWxlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1hc2tCb3VuZHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidGhpY2tuZXNzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNhcHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiam9pbnRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIm1pdGVyTGltaXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSwoZT0+e249ZX0pKGEpLGM9YS5nZXRQYXJhbWV0ZXIoYS5NQVhfVEVYVFVSRV9TSVpFKSxlPU1hdGgubWluKDQwOTYsYy8yKSwoZT0+e3Q9ZX0pKHMpLChlPT57QT1lfSkoaSksdGhpcy4kc3RhY2s9bygpLHRoaXMuJHN0YWNrQXR0YWNobWVudE9iamVjdD1vKCksdGhpcy4kbWF0cml4PWQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXMuJGNsZWFyQ29sb3JSPTAsdGhpcy4kY2xlYXJDb2xvckc9MCx0aGlzLiRjbGVhckNvbG9yQj0wLHRoaXMuJGNsZWFyQ29sb3JBPTAsdGhpcy50aGlja25lc3M9MSx0aGlzLmNhcHM9MSx0aGlzLmpvaW50cz0yLHRoaXMubWl0ZXJMaW1pdD0wLHRoaXMuJG1haW5BdHRhY2htZW50T2JqZWN0PW51bGwsdGhpcy5nbG9iYWxBbHBoYT0xLHRoaXMuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLHRoaXMuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExLHRoaXMuJGZpbGxTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy4kc3Ryb2tlU3R5bGU9bmV3IEZsb2F0MzJBcnJheShbMSwxLDEsMV0pLHRoaXMubWFza0JvdW5kcz17eE1pbjowLHlNaW46MCx4TWF4OjAseU1heDowfSxhLnBpeGVsU3RvcmVpKGEuVU5QQUNLX0FMSUdOTUVOVCwxKSxhLnBpeGVsU3RvcmVpKGEuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCksKGU9PntkZT1lLmNyZWF0ZUZyYW1lYnVmZmVyKCl9KShhKSwoZT0+e2ZlPWUuY3JlYXRlRnJhbWVidWZmZXIoKX0pKGEpLChlPT57bWU9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbWUpO2NvbnN0IHQ9YWUoKTtlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGUuRlJBTUVCVUZGRVIsZS5DT0xPUl9BVFRBQ0hNRU5UMCxlLlRFWFRVUkVfMkQsdC5yZXNvdXJjZSwwKSxlLmJpbmRGcmFtZWJ1ZmZlcihlLkZSQU1FQlVGRkVSLG51bGwpLGUuYmluZEZyYW1lYnVmZmVyKGUuRFJBV19GUkFNRUJVRkZFUixtZSl9KShhKSwoZT0+e3llPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxBZT1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksVGU9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFJlPWUuY3JlYXRlQnVmZmVyKCksZS5iaW5kQnVmZmVyKGUuUElYRUxfUEFDS19CVUZGRVIsUmUpfSkoYSkseG4oYSksbi5lbmFibGUobi5CTEVORCksRHQoKSwoZT0+e1ZuPU1hdGguZmxvb3IoLjc1KmUuZ2V0UGFyYW1ldGVyKGUuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUykpfSkoYSkscj10aGlzfWNsZWFyVHJhbnNmZXJCb3VuZHMoKXsoKCk9Pntmb3IobGV0IGU9MDtlPHNlLmxlbmd0aDsrK2Upe2NvbnN0IHQ9c2VbZV07dCYmKHRbMF09dFsxXT1OdW1iZXIuTUFYX1ZBTFVFLHRbMl09dFszXT0tTnVtYmVyLk1BWF9WQUxVRSl9Zm9yKGxldCBlPTA7ZTxpZS5sZW5ndGg7KytlKXtjb25zdCB0PWllW2VdO3QmJih0WzBdPXRbMV09TnVtYmVyLk1BWF9WQUxVRSx0WzJdPXRbM109LU51bWJlci5NQVhfVkFMVUUpfX0pKCl9dXBkYXRlQmFja2dyb3VuZENvbG9yKGUsdCxuLHIpeygoZSx0LG4scixzKT0+e2UuJGNsZWFyQ29sb3JSPWEodCwwLDEsMCksZS4kY2xlYXJDb2xvckc9YShuLDAsMSwwKSxlLiRjbGVhckNvbG9yQj1hKHIsMCwxLDApLGUuJGNsZWFyQ29sb3JBPWEocywwLDEsMCl9KSh0aGlzLGUsdCxuLHIpfWZpbGxCYWNrZ3JvdW5kQ29sb3IoKXt2YXIgZSx0LHIsYTtlPXRoaXMuJGNsZWFyQ29sb3JSLHQ9dGhpcy4kY2xlYXJDb2xvckcscj10aGlzLiRjbGVhckNvbG9yQixhPXRoaXMuJGNsZWFyQ29sb3JBLG4uY2xlYXJDb2xvcihlLHQscixhKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5jbGVhckNvbG9yKDAsMCwwLDApfXJlc2l6ZShlLHQsbj0hMCl7JGUodGhpcyxlLHQsbil9Y2xlYXJSZWN0KGUsdCxyLGEpeygoZSx0LHIsYSk9PntuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUsdCxyLGEpLG4uY2xlYXIobi5DT0xPUl9CVUZGRVJfQklUfG4uU1RFTkNJTF9CVUZGRVJfQklUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfSkoZSx0LHIsYSl9YmluZChlKXtVZSh0aGlzLGUpfXNhdmUoKXt2YXIgZTsoZT10aGlzKS4kc3RhY2sucHVzaChkKC4uLmUuJG1hdHJpeCkpfXJlc3RvcmUoKXtOZSh0aGlzKX1zZXRUcmFuc2Zvcm0oZSx0LG4scixhLHMpeygoZSx0LG4scixhLHMsbyk9PntlWzBdPXQsZVsxXT1uLGVbM109cixlWzRdPWEsZVs2XT1zLGVbN109b30pKHRoaXMuJG1hdHJpeCxlLHQsbixyLGEscyl9dHJhbnNmb3JtKGUsdCxuLHIsYSxzKXsoKGUsdCxuLHIsYSxzLG8pPT57Y29uc3QgaT1lLiRtYXRyaXhbMF0sYz1lLiRtYXRyaXhbMV0sbD1lLiRtYXRyaXhbM10sdT1lLiRtYXRyaXhbNF0saD1lLiRtYXRyaXhbNl0sYj1lLiRtYXRyaXhbN107ZS4kbWF0cml4WzBdPXQqaStuKmwsZS4kbWF0cml4WzFdPXQqYytuKnUsZS4kbWF0cml4WzNdPXIqaSthKmwsZS4kbWF0cml4WzRdPXIqYythKnUsZS4kbWF0cml4WzZdPXMqaStvKmwraCxlLiRtYXRyaXhbN109cypjK28qdStifSkodGhpcyxlLHQsbixyLGEscyl9cmVzZXQoKXt2YXIgZTsoZT10aGlzKS5nbG9iYWxBbHBoYT0xLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJub3JtYWwiLGUuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSExfWJlZ2luUGF0aCgpe3ZhciBlOyhlPXRoaXMpLiRmaWxsU3R5bGUuZmlsbCgxKSxlLiRzdHJva2VTdHlsZS5maWxsKDEpLCgoKT0+e2ZvcihSLmxlbmd0aD0wO00ubGVuZ3RoOylpKE0ucG9wKCkpfSkoKX1tb3ZlVG8oZSx0KXtPKGUsdCl9bGluZVRvKGUsdCl7KChlLHQpPT57Ui5sZW5ndGh8fE8oZSx0KSwkKGUsdCl8fEYoZSx0LCExKX0pKGUsdCl9cXVhZHJhdGljQ3VydmVUbyhlLHQsbixyKXtTKGUsdCxuLHIpfWZpbGxTdHlsZShlLHQsbixyKXt0aGlzLiRmaWxsU3R5bGVbMF09ZSx0aGlzLiRmaWxsU3R5bGVbMV09dCx0aGlzLiRmaWxsU3R5bGVbMl09bix0aGlzLiRmaWxsU3R5bGVbM109cn1zdHJva2VTdHlsZShlLHQsbixyKXt0aGlzLiRzdHJva2VTdHlsZVswXT1lLHRoaXMuJHN0cm9rZVN0eWxlWzFdPXQsdGhpcy4kc3Ryb2tlU3R5bGVbMl09bix0aGlzLiRzdHJva2VTdHlsZVszXT1yfWNsb3NlUGF0aCgpeygoKT0+e2lmKFIubGVuZ3RoPDcpcmV0dXJuO2NvbnN0IGU9K1JbMF0sdD0rUlsxXTskKGUsdCl8fEYoZSx0LCExKX0pKCl9YXJjKGUsdCxuKXsoKGUsdCxuKT0+e2NvbnN0IHI9bixhPS41NTIyODQ3NDk4MzA3OTM2Km47QihlK3IsdCthLGUrYSx0K3IsZSx0K3IpLEIoZS1hLHQrcixlLXIsdCthLGUtcix0KSxCKGUtcix0LWEsZS1hLHQtcixlLHQtciksQihlK2EsdC1yLGUrcix0LWEsZStyLHQpfSkoZSx0LG4pfWJlemllckN1cnZlVG8oZSx0LG4scixhLHMpe0IoZSx0LG4scixhLHMpfWZpbGwoKXsoZT0+e2NvbnN0IHQ9dygpO2lmKCF0Lmxlbmd0aClyZXR1cm47WWUucHVzaChlKTtjb25zdCBuPVhlKHQpO1dlKG4uYnVmZmVyKSxHZS5wdXNoKG4uaW5kZXhDb3VudCl9KSgiZmlsbCIpfWdyYWRpZW50RmlsbChlLHQsbixyLGEscyl7KChlLHQsbixyLGEscyk9Pntjb25zdCBvPXcoKTtpZighby5sZW5ndGgpcmV0dXJuO1llLnB1c2goMD09PWU/ImxpbmVhciI6InJhZGlhbCIpO2NvbnN0IGk9WGUobyk7V2UoaS5idWZmZXIpLEdlLnB1c2goaS5pbmRleENvdW50KSxLZS5wdXNoKHQsbixyLGEpLDE9PT1lJiZLZS5wdXNoKHMpfSkoZSx0LG4scixhLHMpfWJpdG1hcEZpbGwoZSx0LG4scixhLHMpeygoZSx0LG4scixhLHMpPT57Y29uc3Qgbz13KCk7aWYoIW8ubGVuZ3RoKXJldHVybjtZZS5wdXNoKCJiaXRtYXAiKTtjb25zdCBpPVhlKG8pO1dlKGkuYnVmZmVyKSxHZS5wdXNoKGkuaW5kZXhDb3VudCkseW4ucHVzaChlLHQsbixyLGEscyl9KShlLHQsbixyLGEscyl9c3Ryb2tlKCl7KCgpPT57Y29uc3QgZT13KCEwKTtpZighZS5sZW5ndGgpcmV0dXJuO1llLnB1c2goImZpbGwiKTtjb25zdCB0PWh0KGUpO1dlKHQuYnVmZmVyKSxHZS5wdXNoKHQuaW5kZXhDb3VudCl9KSgpfWdyYWRpZW50U3Ryb2tlKGUsdCxuLHIsYSxzKXsoKGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89dygpO2lmKCFvLmxlbmd0aClyZXR1cm47WWUucHVzaCgwPT09ZT8ibGluZWFyIjoicmFkaWFsIik7Y29uc3QgaT1odChvKTtXZShpLmJ1ZmZlciksR2UucHVzaChpLmluZGV4Q291bnQpLEtlLnB1c2godCxuLHIsYSksMT09PWUmJktlLnB1c2gocyl9KShlLHQsbixyLGEscyl9Yml0bWFwU3Ryb2tlKGUsdCxuLHIsYSxzKXsoKGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89dyghMCk7aWYoIW8ubGVuZ3RoKXJldHVybjtZZS5wdXNoKCJiaXRtYXAiKTtjb25zdCBpPWh0KG8pO1dlKGkuYnVmZmVyKSxHZS5wdXNoKGkuaW5kZXhDb3VudCkseW4ucHVzaChlLHQsbixyLGEscyl9KShlLHQsbixyLGEscyl9Y2xpcCgpeygoKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtpZighZSlyZXR1cm47Y29uc3QgdD1JZS5nZXQoZS5jbGlwTGV2ZWwpLGE9dFswXSxzPXRbMV0sbz10WzJdLGk9dFszXSxjPU1hdGguY2VpbChNYXRoLmFicyhvLWEpKSxsPU1hdGguY2VpbChNYXRoLmFicyhpLXMpKTtuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGEsZS5oZWlnaHQtcy1sLGMsbCk7Y29uc3QgdT1SdCgpO2xldCBoPUxlLmdldChlLmNsaXBMZXZlbCksYj0wLGQ9bnVsbDtjb25zdCBmPUdlLmxlbmd0aDtmb3IobGV0IHQ9MDt0PGY7dCsrKXtuLnN0ZW5jaWxNYXNrKDE8PGgtMSk7Y29uc3Qgcj1HZVt0XTtidC5oYXModCkmJihkPWJ0LmdldCh0KSk7Y29uc3QgYT1rdCghIWQpO2QmJkN0KGEsZCksanQoYSx1LGIsciksYis9ciwrK2gsaD43JiYoenQoKSxoPWUuY2xpcExldmVsKzEpfUxlLnNldChlLmNsaXBMZXZlbCxoKSxNdCh1KSxxZSgpLGR0KCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKX0pKCl9Z2V0IGN1cnJlbnRBdHRhY2htZW50T2JqZWN0KCl7cmV0dXJuIHBlKCl9Z2V0IGF0bGFzQXR0YWNobWVudE9iamVjdCgpe3JldHVybiB0ZSgpfWNyZWF0ZU5vZGUoZSx0KXtyZXR1cm4gR3QoZSx0KX1yZW1vdmVOb2RlKGUpeyhlPT57Y29uc3QgdD1uZVtlLmluZGV4XTt0JiZ0LmRpc3Bvc2UoZS54LGUueSxlLncsZS5oKX0pKGUpfWJlZ2luTm9kZVJlbmRlcmluZyhlKXsoZT0+e2NvbnN0IHQ9b2UoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0scz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgscyl9KShlKSxEZShlLngsZS55LGUudyxlLmgpfWVuZE5vZGVSZW5kZXJpbmcoKXtuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfWRyYXdGaWxsKCl7KCgpPT57Y29uc3QgZT1SdCgpO24uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmZyb250RmFjZShuLkNDVyksbi5zdGVuY2lsTWFzaygyNTUpO2xldCB0PTAscj1udWxsO2ZvcihsZXQgbj0wO248WWUubGVuZ3RoO24rKylzd2l0Y2goYnQuaGFzKG4pJiYocj1idC5nZXQobikpLFllW25dKXtjYXNlImZpbGwiOntjb25zdCBuPUdlLnNoaWZ0KCk7ZHIoZSx0LG4sciksdCs9bn1icmVhaztjYXNlImxpbmVhciI6e2NvbnN0IG49R2Uuc2hpZnQoKTtncihlLHQsbixyKSx0Kz1ufWJyZWFrO2Nhc2UicmFkaWFsIjp7Y29uc3Qgbj1HZS5zaGlmdCgpO3hyKGUsdCxuLHIpLHQrPW59YnJlYWs7Y2FzZSJiaXRtYXAiOntjb25zdCBuPUdlLnNoaWZ0KCk7QXIoZSx0LG4sciksdCs9bn19bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxNdChlKSxxZSgpLGR0KCl9KSgpfWRyYXdEaXNwbGF5T2JqZWN0KHQsbixhLHMsbyxpKXsoZT0+e2NvbnN0IHQ9Y2UoZS5pbmRleCksbj10WzBdLHI9dFsxXSxhPXRbMl0scz10WzNdO3RbMF09TWF0aC5taW4oZS54LG4pLHRbMV09TWF0aC5taW4oZS55LHIpLHRbMl09TWF0aC5tYXgoZS54K2UudyxhKSx0WzNdPU1hdGgubWF4KGUueStlLmgscyl9KSh0KSwoKHQsbixhLHMsbyxpKT0+e2NvbnN0IGM9aVswXSxsPWlbMV0sdT1pWzJdLGg9ci5nbG9iYWxBbHBoYSxiPWlbNF0vMjU1LGQ9aVs1XS8yNTUsZj1pWzZdLzI1NSx2PXIuJG1hdHJpeDtzd2l0Y2goci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pe2Nhc2Uibm9ybWFsIjpjYXNlImxheWVyIjpjYXNlImFkZCI6Y2FzZSJzY3JlZW4iOmNhc2UiYWxwaGEiOmNhc2UiZXJhc2UiOmNhc2UiY29weSI6e2lmKEl0KCkhPT1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbnx8aGUoKSE9PXQuaW5kZXgpe1EoaGUoKSk7Y29uc3QgZT1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbjtyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1JdCgpLHIuZHJhd0FycmF5c0luc3RhbmNlZCgpLHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWUsQnQoci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLHVlKHQuaW5kZXgpLFEodC5pbmRleCl9Y29uc3Qgbj1RdCgpO0t0LnB1c2godC54L2UsdC55L2UsdC53L2UsdC5oL2UsdC53LHQuaCx4KCksRSgpLHZbNl0sdls3XSx2WzBdLHZbMV0sdlszXSx2WzRdLGMsbCx1LGgsYixkLGYsMCksbi5jb3VudCsrfWJyZWFrO2RlZmF1bHQ6e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtyLmRyYXdBcnJheXNJbnN0YW5jZWQoKTtjb25zdCBpPU1hdGguY2VpbChNYXRoLmFicyhzLW4pKSxfPU1hdGguY2VpbChNYXRoLmFicyhvLWEpKTtsZXQgcD0wLGc9MCx4PW5uKHQpO2lmKDEhPT12WzBdfHwwIT09dlsxXXx8MCE9PXZbM118fDEhPT12WzRdKXtjb25zdCBuPUgoaSxfLCExKSxhPW0odlswXSx2WzFdLHZbM10sdls0XSxpLzIsXy8yKSxzPW0oMSwwLDAsMSwtdC53LzIsLXQuaC8yKSxvPW0oYVswXSpzWzBdK2FbMl0qc1sxXSxhWzFdKnNbMF0rYVszXSpzWzFdLGFbMF0qc1syXSthWzJdKnNbM10sYVsxXSpzWzJdK2FbM10qc1szXSxhWzBdKnNbNF0rYVsyXSpzWzVdK2FbNF0sYVsxXSpzWzRdK2FbM10qc1s1XSthWzVdKTtyLnNhdmUoKSxyLmJpbmQobiksci5zZXRUcmFuc2Zvcm0ob1swXSxvWzFdLG9bMl0sb1szXSxvWzRdLG9bNV0pLHA9b1s0XSxnPW9bNV07Y29uc3QgYz1mbigpO21uKGMseC53aWR0aCx4LmhlaWdodCksU2UoeCwhMCksb24oYyksVSh4KSx4PW4udGV4dHVyZSx3ZShuLCExKSxlJiZyLmJpbmQoZSksci5yZXN0b3JlKCl9KHB8fGcpJiYodls2XS09cCx2WzddLT1nKTtjb25zdCBFPXVuKHZbNl0sdls3XSxpLF8pLEE9SChpLF8sITEpO3IuYmluZChBKSxybihFLHgpO2NvbnN0IHk9SnQoci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pO2RuKHksYyxsLHUsaCxiLGQsZiwwKSxvbih5KSxlJiZyLmJpbmQoZSksYm4oQS50ZXh0dXJlKSwocHx8ZykmJih2WzZdKz1wLHZbN10rPWcpLFUoeCksVShFKSx3ZShBKSxCdChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksdWUodC5pbmRleCksUSh0LmluZGV4KX19fSkodCxuLGEscyxvLGkpfWRyYXdBcnJheXNJbnN0YW5jZWQoKXsoKCk9Pntjb25zdCBlPVF0KCk7ZS5jb3VudCYmKHRuKCksZ24oci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24pLF9uKGUpLGUuY2xlYXIoKSl9KSgpfWNsZWFyQXJyYXlzSW5zdGFuY2VkKCl7UXQoKS5jbGVhcigpfXRyYW5zZmVyTWFpbkNhbnZhcygpeygoKT0+e2NvbnN0IGU9ci4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7ci5iaW5kKGUpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixkZSksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpO2NvbnN0IHQ9ZS53aWR0aCxhPWUuaGVpZ2h0O24uYmxpdEZyYW1lYnVmZmVyKDAsMCx0LGEsMCwwLHQsYSxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkRSQVdfRlJBTUVCVUZGRVIsZmUpLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsZGUpfSkoKX1kcmF3UGl4ZWxzKGUsdCl7KChlLHQpPT57Y29uc3Qgbj1FbihlLncsZS5oLHQpLHI9YW4oKTtzbihyLGUudyxlLmgpLER0KCksb24ociksVShuKX0pKGUsdCl9ZHJhd0VsZW1lbnQoZSx0KXtBbihlLHQpfWJlZ2luTWFzaygpeygoKT0+e2NvbnN0IGU9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtlJiYoZS5tYXNrPSEwLGUuY2xpcExldmVsKyssTGUuc2V0KGUuY2xpcExldmVsLGUuY2xpcExldmVsKSxCZSgpfHwoUGUoITApLG4uZW5hYmxlKG4uU1RFTkNJTF9URVNUKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3Aobi5aRVJPLG4uSU5WRVJULG4uSU5WRVJUKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSkpKX0pKCl9c2V0TWFza0JvdW5kcyhlLHQsYSxzKXsoKGUsdCxhLHMpPT57Y29uc3Qgbz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFvKXJldHVybjtJZS5zZXQoby5jbGlwTGV2ZWwsdShlLHQsYSxzKSk7Y29uc3QgaT1NYXRoLmNlaWwoTWF0aC5hYnMoYS1lKSksYz1NYXRoLmNlaWwoTWF0aC5hYnMocy10KSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlLG8uaGVpZ2h0LXQtYyxpLGMpfSkoZSx0LGEscyl9ZW5kTWFzaygpe2tlKCl9bGVhdmVNYXNrKCl7dGhpcy5kcmF3QXJyYXlzSW5zdGFuY2VkKCksKCgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PWUuY2xpcExldmVsLGE9SWUuZ2V0KHQpLHM9YVswXSxvPWFbMV0saT1hWzJdLGM9YVszXTtJZS5kZWxldGUodCksTGUuZGVsZXRlKHQpLGgoYSk7Y29uc3QgbD1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSksdT1NYXRoLmNlaWwoTWF0aC5hYnMoYy1vKSk7aWYobi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihzLGUuaGVpZ2h0LW8tdSxsLHUpLC0tZS5jbGlwTGV2ZWwsIWUuY2xpcExldmVsKXJldHVybiBlLm1hc2s9ITEsUGUoITEpLG4uY2xlYXIobi5TVEVOQ0lMX0JVRkZFUl9CSVQpLG4uZGlzYWJsZShuLlNURU5DSUxfVEVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSxMZS5jbGVhcigpLHZvaWQgSWUuY2xlYXIoKTtuLnN0ZW5jaWxNYXNrKDE8PGUuY2xpcExldmVsKSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcChuLlJFUExBQ0Usbi5SRVBMQUNFLG4uUkVQTEFDRSksbi5jb2xvck1hc2soITEsITEsITEsITEpLGp0KFh0KCksVHQoKSwwLDYpLGtlKCl9KSgpfXVzZUdyaWQoZSl7KGU9PntidC5zZXQoR2UubGVuZ3RoLGUpfSkoZSl9YXBwbHlGaWx0ZXIoZSx0LG4scixhLHMsbyxpLGMsbCx1KXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxicihlLHQsbixyLGEscyxvLGksYyxsLHUpfWFzeW5jIGNyZWF0ZUltYWdlQml0bWFwKGUsdCl7cmV0dXJuIGF3YWl0IFRyKGUsdCl9fWxldCBNcjtsZXQgd3I7bGV0IEZyPTA7bGV0ICRyPTA7bGV0IE9yPSExO2NvbnN0IFNyPVtdLGtyPSguLi5lKT0+e2NvbnN0IHQ9U3IucG9wKCl8fFtdO3JldHVybiBlLmxlbmd0aCYmdC5wdXNoKC4uLmUpLHR9LENyPShlLHQ9MSk9Pih7UjooMTY3MTE2ODAmZSk+PjE2LEc6KDY1MjgwJmUpPj44LEI6MjU1JmUsQToyNTUqdH0pLFByPShlLHQpPT57KGU9Pnt3cj1lfSkoZSk7Y29uc3Qgbj1lLmdldENvbnRleHQoIndlYmdsMiIse3N0ZW5jaWw6ITAscHJlbXVsdGlwbGllZEFscGhhOiEwLGFudGlhbGlhczohMSxkZXB0aDohMX0pO2lmKCFuKXRocm93IG5ldyBFcnJvcigid2ViZ2wyIGlzIG5vdCBzdXBwb3J0ZWQuIik7dmFyIHI7cj1uZXcgUnIobiw0LHQpLE1yPXJ9LEJyPShlLHQsbj0hMCk9PntGcj09PWUmJiRyPT09dHx8KE9yPSEwLEZyPWUsJHI9dCxNci5yZXNpemUoZSx0LG4pLG4mJmhyLnJlc2V0KCkpfSxJcj0oZSx0PSExKT0+e2xldCBuPTA7Zm9yKDtlLmxlbmd0aD5uOylzd2l0Y2goZVtuKytdKXtjYXNlIDk6TXIuYmVnaW5QYXRoKCk7YnJlYWs7Y2FzZSAwOk1yLm1vdmVUbyhlW24rK10sZVtuKytdKTticmVhaztjYXNlIDI6TXIubGluZVRvKGVbbisrXSxlW24rK10pO2JyZWFrO2Nhc2UgMTpNci5xdWFkcmF0aWNDdXJ2ZVRvKGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSA1OmlmKHQpe24rPTQ7YnJlYWt9TXIuZmlsbFN0eWxlKGVbbisrXS8yNTUsZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUpO2JyZWFrO2Nhc2UgNzpNci5maWxsKCk7YnJlYWs7Y2FzZSA2OmlmKHQpe24rPTg7YnJlYWt9TXIudGhpY2tuZXNzPWVbbisrXSxNci5jYXBzPWVbbisrXSxNci5qb2ludHM9ZVtuKytdLE1yLm1pdGVyTGltaXQ9ZVtuKytdLE1yLnN0cm9rZVN0eWxlKGVbbisrXS8yNTUsZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUpO2JyZWFrO2Nhc2UgODppZih0KWJyZWFrO01yLnN0cm9rZSgpO2JyZWFrO2Nhc2UgMTI6TXIuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSA0Ok1yLmFyYyhlW24rK10sZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAzOk1yLmJlemllckN1cnZlVG8oZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10pO2JyZWFrO2Nhc2UgMTA6e2lmKHQpe24rPTE7Y29uc3QgdD1lW24rK107bis9NSp0LG4rPTksTXIuZmlsbCgpO2JyZWFrfWNvbnN0IHI9ZVtuKytdLGE9a3IoKSxzPWVbbisrXTtmb3IobGV0IHQ9MDt0PHM7Kyt0KWEucHVzaChlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdKTtjb25zdCBvPW5ldyBGbG9hdDMyQXJyYXkoW2VbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdXSksaT1lW24rK10sYz1lW24rK10sbD1lW24rK107TXIuZ3JhZGllbnRGaWxsKHIsYSxvLGksYyxsKX1icmVhaztjYXNlIDEzOntpZih0KXtuKz0yO2NvbnN0IHQ9ZVtuKytdO24rPXQsbis9OCxNci5maWxsKCk7YnJlYWt9Y29uc3Qgcj1lW24rK10sYT1lW24rK10scz1lW24rK10sbz1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KG4sbitzKSk7bis9cztjb25zdCBpPW5ldyBGbG9hdDMyQXJyYXkoW2VbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdXSk7TXIuYml0bWFwRmlsbChvLGkscixhLEJvb2xlYW4oZVtuKytdKSxCb29sZWFuKGVbbisrXSkpfWJyZWFrO2Nhc2UgMTE6e2lmKHQpe24rPTIwLE1yLmZpbGwoKTticmVha31Nci50aGlja25lc3M9ZVtuKytdLE1yLmNhcHM9ZVtuKytdLE1yLmpvaW50cz1lW24rK10sTXIubWl0ZXJMaW1pdD1lW24rK107Y29uc3Qgcj1lW24rK10sYT1rcigpLHM9ZVtuKytdO2ZvcihsZXQgdD0wO3Q8czsrK3QpYS5wdXNoKGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10pO2NvbnN0IG89bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKSxpPWVbbisrXSxjPWVbbisrXSxsPWVbbisrXTtNci5ncmFkaWVudFN0cm9rZShyLGEsbyxpLGMsbCl9YnJlYWs7Y2FzZSAxNDp7aWYodCl7bis9Njtjb25zdCB0PWVbbisrXTtuKz10LG4rPTgsTXIuZmlsbCgpO2JyZWFrfU1yLnRoaWNrbmVzcz1lW24rK10sTXIuY2Fwcz1lW24rK10sTXIuam9pbnRzPWVbbisrXSxNci5taXRlckxpbWl0PWVbbisrXTtjb25zdCByPWVbbisrXSxhPWVbbisrXSxzPWVbbisrXSxvPW5ldyBVaW50OEFycmF5KGUuc3ViYXJyYXkobixuK3MpKTtuKz1zO2NvbnN0IGk9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKTtNci5iaXRtYXBTdHJva2UobyxpLHIsYSxCb29sZWFuKGVbbisrXSksQm9vbGVhbihlW24rK10pKX19fSxMcj1lPT57c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4iY29weSI7Y2FzZSAxOnJldHVybiJhZGQiO2Nhc2UgMjpyZXR1cm4iYWxwaGEiO2Nhc2UgMzpyZXR1cm4iZGFya2VuIjtjYXNlIDQ6cmV0dXJuImRpZmZlcmVuY2UiO2Nhc2UgNTpyZXR1cm4iZXJhc2UiO2Nhc2UgNjpyZXR1cm4iaGFyZGxpZ2h0IjtjYXNlIDc6cmV0dXJuImludmVydCI7Y2FzZSA4OnJldHVybiJsYXllciI7Y2FzZSA5OnJldHVybiJsaWdodGVuIjtjYXNlIDEwOnJldHVybiJtdWx0aXBseSI7Y2FzZSAxMTpkZWZhdWx0OnJldHVybiJub3JtYWwiO2Nhc2UgMTI6cmV0dXJuIm92ZXJsYXkiO2Nhc2UgMTM6cmV0dXJuInNjcmVlbiI7Y2FzZSAxNDpyZXR1cm4ic3VidHJhY3QifX0sVXI9KGUsdCk9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBzPWVbdCsrXSxvPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPUJvb2xlYW4oZVt0KytdKSx1PUJvb2xlYW4oZVt0KytdKSxoPUJvb2xlYW4oZVt0KytdKSxiPWAke2VbdCsrXX1gLGQ9ZVt0KytdLGY9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0pLG09TWF0aC5zcXJ0KG5bMl0qblsyXStuWzNdKm5bM10pO2xldCB2O2lmKGVbdCsrXSl7aWYodj1oci5nZXQoYixgJHtkfWApLCF2KXJldHVybiB0fWVsc2V7Y29uc3Qgbj1sP25ldyBGbG9hdDMyQXJyYXkoMjgpOm51bGw7biYmKG4uc2V0KGUuc3ViYXJyYXkodCx0KzI0KSksdCs9MjQpLE1yLnVzZUdyaWQobik7Y29uc3Qgcj1lW3QrK10sYT1lLnN1YmFycmF5KHQsdCtyKTtpZihoJiYhbCl7Y29uc3QgZT1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSksdD1NYXRoLmNlaWwoTWF0aC5hYnMoYy1vKSk7dj1Nci5jcmVhdGVOb2RlKGUsdCksaHIuc2V0KGIsYCR7ZH1gLHYpO2NvbnN0IG49TXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7TXIuYmluZChNci5hdGxhc0F0dGFjaG1lbnRPYmplY3QpLE1yLnJlc2V0KCksTXIuYmVnaW5Ob2RlUmVuZGVyaW5nKHYpO2NvbnN0IHI9TXIuYXRsYXNBdHRhY2htZW50T2JqZWN0LmhlaWdodC12LnktdDtNci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSx2LngsciksdT8oSXIoYSksTXIuZHJhd0ZpbGwoKSk6TXIuZHJhd1BpeGVscyh2LG5ldyBVaW50OEFycmF5KGEpKSxNci5lbmROb2RlUmVuZGVyaW5nKCksbiYmTXIuYmluZChuKX1lbHNle2NvbnN0IGU9TWF0aC5jZWlsKE1hdGguYWJzKGktcykqZiksdD1NYXRoLmNlaWwoTWF0aC5hYnMoYy1vKSptKTt2PU1yLmNyZWF0ZU5vZGUoZSx0KSxoci5zZXQoYixgJHtkfWAsdik7Y29uc3Qgcj1Nci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtNci5iaW5kKE1yLmF0bGFzQXR0YWNobWVudE9iamVjdCksTXIucmVzZXQoKSxNci5iZWdpbk5vZGVSZW5kZXJpbmcodik7Y29uc3QgbD1Nci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LXYueS10O01yLnNldFRyYW5zZm9ybShmLDAsMCxtLC1zKmYrdi54LC1vKm0rbCksbiYmKG5bMjRdPXYueCxuWzI1XT1sKSxJcihhKSxNci5kcmF3RmlsbCgpLE1yLmVuZE5vZGVSZW5kZXJpbmcoKSxyJiZNci5iaW5kKHIpfXQrPXJ9Y29uc3QgXz1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBzPUJvb2xlYW4oZVt0KytdKSxvPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgaT1lW3QrK10sYz1lLnN1YmFycmF5KHQsdCtpKSxsPU1hdGguY2VpbChNYXRoLmFicyhhWzJdLWFbMF0pKSx1PU1hdGguY2VpbChNYXRoLmFicyhhWzNdLWFbMV0pKTtyZXR1cm4gTXIuYXBwbHlGaWx0ZXIodixiLHMsbCx1LGgsbixyLExyKF8pLG8sYyksdCs9aX1pZihNci5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLHJbM10rcls3XS8yNTUpLDEpLE1yLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxNci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249THIoXyksaCYmIWwpTXIuc2V0VHJhbnNmb3JtKG5bMF0sblsxXSxuWzJdLG5bM10sbls0XSxuWzVdKSxNci5kcmF3RGlzcGxheU9iamVjdCh2LGFbMF0sYVsxXSxhWzJdLGFbM10scik7ZWxzZXtjb25zdCBlPU1hdGguYXRhbjIoblsxXSxuWzBdKSx0PU1hdGguYXRhbjIoLW5bMl0sblszXSk7aWYoZXx8dCl7Y29uc3Qgcj1zKmYsYT1vKm0saT1NYXRoLmNvcyhlKSxjPU1hdGguc2luKGUpLGw9TWF0aC5jb3ModCksdT1NYXRoLnNpbih0KTtNci5zZXRUcmFuc2Zvcm0oaSxjLC11LGwscippLWEqdStuWzRdLHIqYythKmwrbls1XSl9ZWxzZSBNci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxhWzBdLGFbMV0pO01yLmRyYXdEaXNwbGF5T2JqZWN0KHYsYVswXSxhWzFdLGFbMl0sYVszXSxyKX1yZXR1cm4gdH0sTnI9KGUsdCk9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTYsTXIucmVzZXQoKSxNci5zZXRUcmFuc2Zvcm0oblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0pO2NvbnN0IHI9Qm9vbGVhbihlW3QrK10pP25ldyBGbG9hdDMyQXJyYXkoMjgpOm51bGw7TXIudXNlR3JpZChyKSxyJiYoci5zZXQoZS5zdWJhcnJheSh0LHQrMjQpKSx0Kz0yNCk7Y29uc3QgYT1lW3QrK10scz1lLnN1YmFycmF5KHQsdCthKTtyZXR1cm4gSXIocywhMCksdCs9YSxNci5jbGlwKCksdH0sRHI9KGUsdCxuKT0+e2NvbnN0IHI9ZS53aWR0aFRhYmxlW3QubGluZV18fDAsYT10LnRleHRGb3JtYXQscz1hLmxlZnRNYXJnaW58fDA7aWYoIW4ud29yZFdyYXAmJnI+bi5yYXdXaWR0aClyZXR1cm4gTWF0aC5tYXgoMCxzKTtjb25zdCBvPWEucmlnaHRNYXJnaW58fDA7cmV0dXJuImNlbnRlciI9PT1hLmFsaWdufHwiY2VudGVyIj09PW4uYXV0b1NpemU/TWF0aC5tYXgoMCxuLnJhd1dpZHRoLzItcy1vLXIvMi0yKToicmlnaHQiPT09YS5hbGlnbnx8InJpZ2h0Ij09PW4uYXV0b1NpemU/TWF0aC5tYXgoMCxuLnJhd1dpZHRoLXMtci1vLTQpOk1hdGgubWF4KDAscyl9LGpyPWU9PntsZXQgdD0iIjtyZXR1cm4gZS5pdGFsaWMmJih0Kz0iaXRhbGljICIpLGUuYm9sZCYmKHQrPSJib2xkICIpLGAke3R9JHtlLnNpemV9cHggJyR7ZS5mb250fScsJ3NhbnMtc2VyaWYnYH0sWHI9bmV3IFRleHREZWNvZGVyLHpyPShlLHQpPT57Y29uc3Qgbj1lLnN1YmFycmF5KHQsdCs2KTt0Kz02O2NvbnN0IHI9ZS5zdWJhcnJheSh0LHQrOCk7dCs9ODtjb25zdCBhPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3Qgcz1lW3QrK10sbz1lW3QrK10saT1lW3QrK10sYz1lW3QrK10sbD1gJHtlW3QrK119YCx1PWVbdCsrXSxoPUJvb2xlYW4oZVt0KytdKSxiPU1hdGguc3FydChuWzBdKm5bMF0rblsxXSpuWzFdKSxkPU1hdGguc3FydChuWzJdKm5bMl0rblszXSpuWzNdKTtsZXQgZjtpZihlW3QrK10pe2lmKGY9aHIuZ2V0KGwsYCR7dX1gKSwhZilyZXR1cm4gdH1lbHNle2NvbnN0IG49TWF0aC5jZWlsKE1hdGguYWJzKGktcykqYikscj1NYXRoLmNlaWwoTWF0aC5hYnMoYy1vKSpkKSxhPUJvb2xlYW4oZVt0KytdKTtmPWE/aHIuZ2V0KGwsYCR7dX1gKTpNci5jcmVhdGVOb2RlKG4sciksYXx8aHIuc2V0KGwsYCR7dX1gLGYpO2NvbnN0IGg9ZVt0KytdLG09bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheSh0LHQraCkpO3QrPWg7bGV0IHY9Im5vbmUiO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp2PSJjZW50ZXIiO2JyZWFrO2Nhc2UgMTp2PSJsZWZ0IjticmVhaztjYXNlIDI6dj0ibm9uZSI7YnJlYWs7Y2FzZSAzOnY9InJpZ2h0In1jb25zdCBfPXt3aWR0aDpuLGhlaWdodDpyLGF1dG9TaXplOnYsc3RvcEluZGV4OmVbdCsrXSxzY3JvbGxYOmVbdCsrXSxzY3JvbGxZOmVbdCsrXSx0ZXh0V2lkdGg6ZVt0KytdLHRleHRIZWlnaHQ6ZVt0KytdLHJhd1dpZHRoOmVbdCsrXSxyYXdIZWlnaHQ6ZVt0KytdLGZvY3VzSW5kZXg6ZVt0KytdLHNlbGVjdEluZGV4OmVbdCsrXSxmb2N1c1Zpc2libGU6Qm9vbGVhbihlW3QrK10pLHRoaWNrbmVzczplW3QrK10sdGhpY2tuZXNzQ29sb3I6ZVt0KytdLHdvcmRXcmFwOkJvb2xlYW4oZVt0KytdKSxib3JkZXI6Qm9vbGVhbihlW3QrK10pLGJvcmRlckNvbG9yOmVbdCsrXSxiYWNrZ3JvdW5kOkJvb2xlYW4oZVt0KytdKSxiYWNrZ3JvdW5kQ29sb3I6ZVt0KytdLGRlZmF1bHRDb2xvcjplW3QrK10sZGVmYXVsdFNpemU6ZVt0KytdfSxwPSgoZSx0LG4scik9Pntjb25zdCBhPW5ldyBPZmZzY3JlZW5DYW52YXModC53aWR0aCx0LmhlaWdodCkscz1hLmdldENvbnRleHQoIjJkIik7aWYoIXMpcmV0dXJuIGE7Y29uc3Qgbz1NYXRoLm1pbigxLE1hdGgubWF4KG4scikpO2lmKHQuYmFja2dyb3VuZHx8dC5ib3JkZXIpe2lmKHMuYmVnaW5QYXRoKCkscy5tb3ZlVG8oMCwwKSxzLmxpbmVUbyh0LndpZHRoLDApLHMubGluZVRvKHQud2lkdGgsdC5oZWlnaHQpLHMubGluZVRvKDAsdC5oZWlnaHQpLHMubGluZVRvKDAsMCksdC5iYWNrZ3JvdW5kKXtjb25zdCBlPUNyKHQuYmFja2dyb3VuZENvbG9yKTtzLmZpbGxTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxzLmZpbGwoKX1pZih0LmJvcmRlcil7Y29uc3QgZT1Dcih0LmJvcmRlckNvbG9yKTtzLmxpbmVXaWR0aD1vLHMuc3Ryb2tlU3R5bGU9YHJnYmEoJHtlLlJ9LCR7ZS5HfSwke2UuQn0sJHtlLkF9KWAscy5zdHJva2UoKX19aWYoIWUpcmV0dXJuIGE7cy5zYXZlKCkscy5iZWdpblBhdGgoKSxzLm1vdmVUbygyLDIpLHMubGluZVRvKHQud2lkdGgtMiwyKSxzLmxpbmVUbyh0LndpZHRoLTIsdC5oZWlnaHQtMikscy5saW5lVG8oMix0LmhlaWdodC0yKSxzLmxpbmVUbygyLDIpLHMuY2xpcCgpO2xldCBpPTI7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoKzQtdC5yYXdXaWR0aCkvdC5yYXdXaWR0aDtpKz0tdC5zY3JvbGxYKmV9bGV0IGM9MjtpZih0LnNjcm9sbFk+MCl7Y29uc3QgZT0odC50ZXh0SGVpZ2h0KzItdC5yYXdIZWlnaHQpL3QucmF3SGVpZ2h0O2MrPS10LnNjcm9sbFkqZX1pZihzLnNldFRyYW5zZm9ybShuLDAsMCxyLGkqbixjKnIpLHMuYmVnaW5QYXRoKCksdC5zZWxlY3RJbmRleD4tMSYmdC5mb2N1c0luZGV4Pi0xKXtjb25zdCBuPWUudGV4dFRhYmxlLmxlbmd0aC0xO2xldCByPTAsYT0wO3QuZm9jdXNJbmRleDw9dC5zZWxlY3RJbmRleD8ocj1NYXRoLm1pbih0LmZvY3VzSW5kZXgsbiksYT1NYXRoLm1pbih0LnNlbGVjdEluZGV4LG4pKToocj1NYXRoLm1pbih0LnNlbGVjdEluZGV4LG4pLGE9TWF0aC5taW4odC5mb2N1c0luZGV4LTEsbikpO2NvbnN0IG89ZS50ZXh0VGFibGVbcl0saT1lLmxpbmVUYWJsZVtvLmxpbmVdLGM9RHIoZSxpLHQpO2xldCBsPTA7aWYociYmInRleHQiPT09by5tb2RlKXtsZXQgdD1yO2Zvcig7dDspe2NvbnN0IG49ZS50ZXh0VGFibGVbLS10XTtpZigidGV4dCIhPT1uLm1vZGUpYnJlYWs7bCs9bi53fX1zLmZpbGxTdHlsZT0iI2I0ZDdmZiI7bGV0IHU9MDtmb3IobGV0IHQ9cjt0PD1hOysrdCl7Y29uc3Qgbj1lLnRleHRUYWJsZVt0XTtpZigidGV4dCI9PT1uLm1vZGUmJih1Kz1uLncsdCE9PWEpKWNvbnRpbnVlO2xldCByPTA7Y29uc3Qgbz0idGV4dCI9PT1uLm1vZGU/bi5saW5lOm4ubGluZS0xO2ZvcihsZXQgdD0wO3Q8bzsrK3Qpcis9ZS5oZWlnaHRUYWJsZVt0XTtzLmJlZ2luUGF0aCgpLHMucmVjdChsLHIsdStjLGUuaGVpZ2h0VGFibGVbb10pLHMuZmlsbCgpLGw9MCx1PTB9fWNvbnN0IGw9dC5yYXdXaWR0aDtsZXQgdT0wO2lmKHQuc2Nyb2xsWD4wKXtjb25zdCBlPSh0LnRleHRXaWR0aC1sKS9sO3U9dC5zY3JvbGxYKmV9Y29uc3QgaD1sK3UsYj10LnJhd0hlaWdodDtsZXQgZD0wO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQtYikvYjtkPXQuc2Nyb2xsWSplfWNvbnN0IGY9YitkO2xldCBtPTAsdj0wLF89MCxwPTAsZz0hMSx4PS0xO2ZvcihsZXQgbj0wO248ZS50ZXh0VGFibGUubGVuZ3RoOysrbil7Y29uc3Qgcj1lLnRleHRUYWJsZVtuXTtpZighciljb250aW51ZTtpZigoInRleHQiPT09ci5tb2RlfHwiYnJlYWsiPT09ci5tb2RlKSYmKHgrKyx0LnN0b3BJbmRleD4tMSYmeD50LnN0b3BJbmRleCkpYnJlYWs7aWYoZyYmInRleHQiPT09ci5tb2RlKWNvbnRpbnVlO2NvbnN0IGE9ci50ZXh0Rm9ybWF0O2lmKCJub25lIj09PXQuYXV0b1NpemUpe2lmKHY+ZilicmVhaztpZigidGV4dCI9PT1yLm1vZGUmJih1Pm0rci53fHxtPmgpKXttKz1yLnc7Y29udGludWV9fWNvbnN0IGk9Q3IoYS5jb2xvcnx8MCk7aWYocy5maWxsU3R5bGU9YHJnYmEoJHtpLlJ9LCR7aS5HfSwke2kuQn0sJHtpLkF9KWAsdC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD09PW4pe2NvbnN0IHQ9bStfKy4xO2xldCBuPXIubGluZSxhPXIueSxvPWUuYXNjZW50VGFibGVbbl07InRleHQiIT09ci5tb2RlJiYoYT0iYnJlYWsiPT09ci5tb2RlP3IuaDplLmFzY2VudFRhYmxlW24tMV0sbj4wPyhuPXIubGluZS0xLG89ZS5hc2NlbnRUYWJsZVtuXSk6bz1yLmgpLG4+MCYmMD09PWUuYXNjZW50VGFibGVbbl0mJm4rKztmb3IobGV0IHQ9MDt0PG47Kyt0KW8rPWUuaGVpZ2h0VGFibGVbdF07cy5zdHJva2VTdHlsZT1gcmdiYSgke2kuUn0sJHtpLkd9LCR7aS5CfSwke2kuQX0pYCxzLmJlZ2luUGF0aCgpLHMubW92ZVRvKHQsbykscy5saW5lVG8odCxvLWEpLHMuc3Ryb2tlKCl9aWYodC50aGlja25lc3Mpe2NvbnN0IGU9Q3IodC50aGlja25lc3NDb2xvcik7cy5saW5lV2lkdGg9dC50aGlja25lc3Mscy5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYH1jb25zdCBjPTB8ci5saW5lO3N3aXRjaChyLm1vZGUpe2Nhc2UiYnJlYWsiOmNhc2Uid3JhcCI6aWYobT0wLGMmJih2Kz1lLmhlaWdodFRhYmxlW2MtMV0pLGQ+ditlLmhlaWdodFRhYmxlW2NdKXtnPSEwO2NvbnRpbnVlfXA9ZS5hc2NlbnRUYWJsZVtjXSxfPURyKGUscix0KSxnPSExO2JyZWFrO2Nhc2UidGV4dCI6e3MuYmVnaW5QYXRoKCkscy5mb250PWpyKGEpO2NvbnN0IGU9bStfLG49ditwO2lmKGEudW5kZXJsaW5lKXtjb25zdCB0PUNyKGEuY29sb3J8fDApO3MubGluZVdpZHRoPW8scy5zdHJva2VTdHlsZT1gcmdiYSgke3QuUn0sJHt0Lkd9LCR7dC5CfSwke3QuQX0pYCxzLmJlZ2luUGF0aCgpLHMubW92ZVRvKGUsbisyKSxzLmxpbmVUbyhlK3IudyxuKzIpLHMuc3Ryb2tlKCl9dC50aGlja25lc3MmJnMuc3Ryb2tlVGV4dChyLnRleHQsZSxuKSxzLmZpbGxUZXh0KHIudGV4dCxlLG4pLG0rPXIud319fWlmKHQuZm9jdXNWaXNpYmxlJiZ0LmZvY3VzSW5kZXg+PWUudGV4dFRhYmxlLmxlbmd0aCl7Y29uc3Qgbj1lLnRleHRUYWJsZVt0LmZvY3VzSW5kZXgtMV07aWYobil7Y29uc3QgZT1DcihuLnRleHRGb3JtYXQuY29sb3J8fDApO3Muc3Ryb2tlU3R5bGU9YHJnYmEoJHtlLlJ9LCR7ZS5HfSwke2UuQn0sJHtlLkF9KWA7Y29uc3QgdD1tK18rLjEscj12K3A7cy5iZWdpblBhdGgoKSwidGV4dCI9PT1uLm1vZGU/cy5tb3ZlVG8odCxyLW4ueSk6cy5tb3ZlVG8odCxyK24uaCkscy5saW5lVG8odCxyKSxzLnN0cm9rZSgpfX1yZXR1cm4gcy5yZXN0b3JlKCksYX0pKEpTT04ucGFyc2UoWHIuZGVjb2RlKG0pKSxfLGIsZCksZz1Nci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtNci5iaW5kKE1yLmF0bGFzQXR0YWNobWVudE9iamVjdCksTXIucmVzZXQoKSxNci5iZWdpbk5vZGVSZW5kZXJpbmcoZik7Y29uc3QgeD1Nci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LWYueS1yO01yLnNldFRyYW5zZm9ybSgxLDAsMCwxLGYueCx4KSxNci5kcmF3RWxlbWVudChmLHApLE1yLmVuZE5vZGVSZW5kZXJpbmcoKSxnJiZNci5iaW5kKGcpfWNvbnN0IG09ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3Qgcz1Cb29sZWFuKGVbdCsrXSksbz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGk9ZVt0KytdLGM9ZS5zdWJhcnJheSh0LHQraSksdT1NYXRoLmNlaWwoTWF0aC5hYnMoYVsyXS1hWzBdKSksYj1NYXRoLmNlaWwoTWF0aC5hYnMoYVszXS1hWzFdKSk7cmV0dXJuIE1yLmFwcGx5RmlsdGVyKGYsbCxCb29sZWFuKE1hdGgubWF4KCtoLCtzKSksdSxiLCExLG4scixMcihtKSxvLGMpLHQrPWl9TXIuZ2xvYmFsQWxwaGE9TWF0aC5taW4oTWF0aC5tYXgoMCxyWzNdK3JbN10vMjU1KSwxKSxNci5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITAsTXIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUxyKG0pO2NvbnN0IHY9TWF0aC5hdGFuMihuWzFdLG5bMF0pLF89TWF0aC5hdGFuMigtblsyXSxuWzNdKTtpZih2fHxfKXtjb25zdCBlPXMqYix0PW8qZCxyPU1hdGguY29zKHYpLGE9TWF0aC5zaW4odiksaT1NYXRoLmNvcyhfKSxjPU1hdGguc2luKF8pO01yLnNldFRyYW5zZm9ybShyLGEsLWMsaSxlKnItdCpjK25bNF0sZSphK3QqaStuWzVdKX1lbHNlIE1yLnNldFRyYW5zZm9ybSgxLDAsMCwxLGFbMF0sYVsxXSk7cmV0dXJuIE1yLmRyYXdEaXNwbGF5T2JqZWN0KGYsYVswXSxhWzFdLGFbMl0sYVszXSxyKSx0fSxWcj0oZSx0LG4pPT57Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs2KTt0Kz02O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrOCk7dCs9ODtjb25zdCBzPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3Qgbz1lW3QrK10saT1lW3QrK10sYz1lW3QrK10sbD1lW3QrK10sdT1gJHtlW3QrK119YCxoPUJvb2xlYW4oZVt0KytdKTtsZXQgYjtpZihlW3QrK10pe2lmKGI9aHIuZ2V0KHUsIjAiKSwhYilyZXR1cm4gdH1lbHNle2NvbnN0IHI9TWF0aC5hYnMoYy1vKSxhPU1hdGguYWJzKGwtaSkscz1Cb29sZWFuKGVbdCsrXSk7aWYoYj1zP2hyLmdldCh1LCIwIik6TXIuY3JlYXRlTm9kZShyLGEpLHN8fGhyLnNldCh1LCIwIixiKSxuJiZuLmxlbmd0aCl7Y29uc3QgZT1Nci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtNci5iaW5kKE1yLmF0bGFzQXR0YWNobWVudE9iamVjdCksTXIucmVzZXQoKSxNci5iZWdpbk5vZGVSZW5kZXJpbmcoYik7Y29uc3QgdD1Nci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LWIueS1hO01yLnNldFRyYW5zZm9ybSgxLDAsMCwxLGIueCx0KTtjb25zdCByPW4uc2hpZnQoKTtNci5kcmF3RWxlbWVudChiLHIpLE1yLmVuZE5vZGVSZW5kZXJpbmcoKSxlJiZNci5iaW5kKGUpfX1jb25zdCBkPWVbdCsrXTtpZihCb29sZWFuKGVbdCsrXSkpe2NvbnN0IG49Qm9vbGVhbihlW3QrK10pLG89ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBpPWVbdCsrXSxjPWUuc3ViYXJyYXkodCx0K2kpLGw9TWF0aC5jZWlsKE1hdGguYWJzKHNbMl0tc1swXSkpLGY9TWF0aC5jZWlsKE1hdGguYWJzKHNbM10tc1sxXSkpO3JldHVybiBNci5hcHBseUZpbHRlcihiLHUsQm9vbGVhbihNYXRoLm1heCgraCwrbikpLGwsZiwhMCxyLGEsTHIoZCksbyxjKSx0Kz1pfXJldHVybiBNci5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLGFbM10rYVs3XS8yNTUpLDEpLE1yLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxNci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249THIoZCksTXIuc2V0VHJhbnNmb3JtKHJbMF0sclsxXSxyWzJdLHJbM10scls0XSxyWzVdKSxNci5kcmF3RGlzcGxheU9iamVjdChiLHNbMF0sc1sxXSxzWzJdLHNbM10sYSksdH0sV3I9KGUsdCk9Pntjb25zdCBuPWVbdCsrXTtmb3IobGV0IHI9MDtyPG47KytyKXtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD1XcihlLHQpO2JyZWFrO2Nhc2UgMTp0PU5yKGUsdCl9fXJldHVybiB0fSxHcj0oZSx0LG4pPT57Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSk7aWYocil7TXIuZHJhd0FycmF5c0luc3RhbmNlZCgpLE1yLnNhdmUoKSxNci5iZWdpbk1hc2soKSxNci5zZXRNYXNrQm91bmRzKGVbdCsrXSxlW3QrK10sZVt0KytdLGVbdCsrXSk7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnQ9V3IoZSx0KTticmVhaztjYXNlIDE6dD1OcihlLHQpfU1yLmVuZE1hc2soKX1sZXQgYT0wLHM9ITA7Y29uc3Qgbz1lW3QrK107Zm9yKGxldCByPTA7bz5yO3IrKyl7Y29uc3Qgcj1lW3QrK10sbz1lW3QrK107aWYoYSYmcj5hJiYocyYmKE1yLnJlc3RvcmUoKSxNci5sZWF2ZU1hc2soKSksYT0wLHM9ITApLCFzKWNvbnRpbnVlO2lmKG8pe2lmKGE9byxzPUJvb2xlYW4oZVt0KytdKSwhcyljb250aW51ZTtNci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksTXIuc2F2ZSgpLE1yLmJlZ2luTWFzaygpLE1yLnNldE1hc2tCb3VuZHMoZVt0KytdLGVbdCsrXSxlW3QrK10sZVt0KytdKTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD1XcihlLHQpO2JyZWFrO2Nhc2UgMTp0PU5yKGUsdCl9TXIuZW5kTWFzaygpO2NvbnRpbnVlfWlmKCFlW3QrK10pY29udGludWU7Y29uc3QgaT1lW3QrK107c3dpdGNoKGkpe2Nhc2UgMDp0PUdyKGUsdCxuKTticmVhaztjYXNlIDE6dD1VcihlLHQpO2JyZWFrO2Nhc2UgMjp0PXpyKGUsdCk7YnJlYWs7Y2FzZSAzOnQ9VnIoZSx0LG4pO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigidW5rbm93biB0eXBlIixpKX19cmV0dXJuKGF8fHIpJiYoTXIucmVzdG9yZSgpLE1yLmxlYXZlTWFzaygpKSx0fTtsZXQgWXI9LTE7Y29uc3QgcXI9KGUsdCk9PntNci5jbGVhclRyYW5zZmVyQm91bmRzKCk7bGV0IG49MDtjb25zdCByPWVbbisrXTtmb3IoWXIhPT1yJiYoWXI9ciwtMT09PVlyP01yLnVwZGF0ZUJhY2tncm91bmRDb2xvcigwLDAsMCwwKTpNci51cGRhdGVCYWNrZ3JvdW5kQ29sb3IoWXI+PjE2JjEsWXI+PjgmMSwxJllyLDEpKSxNci5yZXNldCgpLE1yLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksTXIuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPm47KXtpZighZVtuKytdKWNvbnRpbnVlO2NvbnN0IHI9ZVtuKytdO3N3aXRjaChyKXtjYXNlIDA6bj1HcihlLG4sdCk7YnJlYWs7Y2FzZSAxOm49VXIoZSxuKTticmVhaztjYXNlIDI6bj16cihlLG4pO2JyZWFrO2Nhc2UgMzpuPVZyKGUsbix0KTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIscil9fU1yLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxPciYmKHdyLndpZHRoPUZyLHdyLmhlaWdodD0kcixPcj0hMSksTXIudHJhbnNmZXJNYWluQ2FudmFzKCl9LEtyPWU9Pntmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7Y29uc3Qgbj1gJHtlW3RdfWA7aWYoIWhyLmhhcyhuKSljb250aW51ZTtjb25zdCByPWhyLmdldEJ5SWQobik7Zm9yKGNvbnN0IGUgb2Ygci52YWx1ZXMoKSlNci5yZW1vdmVOb2RlKGUpO2hyLnJlbW92ZUJ5SWQobil9fSxIcj1hc3luYyhlLHQsbixyKT0+e01yLmNsZWFyVHJhbnNmZXJCb3VuZHMoKTtsZXQgYT0xO2ZvcihNci5yZXNldCgpLE1yLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksTXIuZmlsbEJhY2tncm91bmRDb2xvcigpO2UubGVuZ3RoPmE7KXtpZighZVthKytdKWNvbnRpbnVlO2NvbnN0IHQ9ZVthKytdO3N3aXRjaCh0KXtjYXNlIDA6YT1HcihlLGEscik7YnJlYWs7Y2FzZSAxOmE9VXIoZSxhKTticmVhaztjYXNlIDI6YT16cihlLGEpO2JyZWFrO2Nhc2UgMzphPVZyKGUsYSxyKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoInVua25vd24gdHlwZSIsdCl9fXJldHVybiBNci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksYXdhaXQgTXIuY3JlYXRlSW1hZ2VCaXRtYXAodCxuKX07Y29uc3QgWnI9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInN0YXRlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInF1ZXVlIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5zdGF0ZT0iZGVhY3RpdmF0ZSIsdGhpcy5xdWV1ZT1bXX1hc3luYyBleGVjdXRlKCl7Zm9yKHRoaXMuc3RhdGU9ImFjdGl2ZSI7dGhpcy5xdWV1ZS5sZW5ndGg7KXtjb25zdCBlPXRoaXMucXVldWUuc2hpZnQoKTtpZihlKXN3aXRjaChlLmNvbW1hbmQpe2Nhc2UicmVuZGVyIjpxcihlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLmltYWdlQml0bWFwcyksZ2xvYmFsVGhpcy5wb3N0TWVzc2FnZSh7bWVzc2FnZToicmVuZGVyIixidWZmZXI6ZS5idWZmZXJ9LFtlLmJ1ZmZlci5idWZmZXJdKTticmVhaztjYXNlInJlc2l6ZSI6QnIoZS5idWZmZXJbMF0sZS5idWZmZXJbMV0sQm9vbGVhbihlLmJ1ZmZlclsyXSkpO2JyZWFrO2Nhc2UiaW5pdGlhbGl6ZSI6UHIoZS5jYW52YXMsZS5kZXZpY2VQaXhlbFJhdGlvKTticmVhaztjYXNlInJlbW92ZUNhY2hlIjpLcihlLmJ1ZmZlcik7YnJlYWs7Y2FzZSJjYWNoZUNsZWFyIjpoci5yZXNldCgpO2JyZWFrO2Nhc2UiY2FwdHVyZSI6e2NvbnN0IHQ9YXdhaXQgSHIoZS5idWZmZXIuc3ViYXJyYXkoMCxlLmxlbmd0aCksZS53aWR0aCxlLmhlaWdodCxlLmltYWdlQml0bWFwcyk7Z2xvYmFsVGhpcy5wb3N0TWVzc2FnZSh7bWVzc2FnZToiY2FwdHVyZSIsYnVmZmVyOmUuYnVmZmVyLGltYWdlQml0bWFwOnR9LFtlLmJ1ZmZlci5idWZmZXIsdF0pfX19dGhpcy5zdGF0ZT0iZGVhY3RpdmF0ZSJ9fTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChhc3luYyBlPT57WnIucXVldWUucHVzaChlLmRhdGEpLCJkZWFjdGl2YXRlIj09PVpyLnN0YXRlJiZhd2FpdCBaci5leGVjdXRlKCl9KSl9KCk7Cg==';
1
+ export const workerInlineUrl = 'data:application/javascript;base64,IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2xldCBlPTIwNDg7bGV0IHQ9NDtsZXQgbjtsZXQgcjtjb25zdCBhPShlLHQsbixyPW51bGwpPT57Y29uc3QgYT0rZTtyZXR1cm4gaXNOYU4oYSkmJm51bGwhPT1yP3I6TWF0aC5taW4oTWF0aC5tYXgodCxpc05hTihhKT8wOmEpLG4pfSxzPVtdLG89KC4uLmUpPT57Y29uc3QgdD1zLnBvcCgpfHxbXTtyZXR1cm4gZS5sZW5ndGgmJnQucHVzaCguLi5lKSx0fSxpPShlPW51bGwpPT57ZSYmKGUubGVuZ3RoJiYoZS5sZW5ndGg9MCkscy5wdXNoKGUpKX0sYz1lPT4oZS0tLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlKSxsPVtdLHU9KGU9MCx0PTAsbj0wLHI9MCk9Pntjb25zdCBhPWwucG9wKCl8fG5ldyBGbG9hdDMyQXJyYXkoNCk7cmV0dXJuIGFbMF09ZSxhWzFdPXQsYVsyXT1uLGFbM109cixhfSxoPWU9PntsLnB1c2goZSl9LGI9W10sZD0oZT0wLHQ9MCxuPTAscj0wLGE9MCxzPTAsbz0wLGk9MCxjPTApPT57Y29uc3QgbD1iLnBvcCgpfHxuZXcgRmxvYXQzMkFycmF5KDkpO3JldHVybiBsWzBdPWUsbFsxXT10LGxbMl09bixsWzNdPXIsbFs0XT1hLGxbNV09cyxsWzZdPW8sbFs3XT1pLGxbOF09YyxsfSxmPVtdLG09KGU9MCx0PTAsbj0wLHI9MCxhPTAscz0wKT0+e2NvbnN0IG89Zi5wb3AoKXx8bmV3IEZsb2F0MzJBcnJheSg2KTtyZXR1cm4gb1swXT1lLG9bMV09dCxvWzJdPW4sb1szXT1yLG9bNF09YSxvWzVdPXMsb30sdj1lPT57Zi5wdXNoKGUpfSxfPWU9Pntjb25zdCB0PTEvKGVbMF0qZVs0XS1lWzNdKmVbMV0pLG49ZVszXSplWzddLWVbNF0qZVs2XSxyPWVbMV0qZVs2XS1lWzBdKmVbN107cmV0dXJuIGQoZVs0XSp0LDAtZVsxXSp0LDAsMC1lWzNdKnQsZVswXSp0LDAsbip0LHIqdCwxKX07bGV0IHA9MCxnPTA7Y29uc3QgeD0oKT0+cCxFPSgpPT5nO2xldCBBPTE7Y29uc3QgeT0oKT0+QSxUPShlPSExKT0+e2NvbnN0IHQ9ZT80OjEwO1IubGVuZ3RoPHR8fE0ucHVzaChSLnNsaWNlKDApKSxSLmxlbmd0aD0wfSxSPW8oKSxNPW8oKSx3PShlPSExKT0+KFQoZSksTSksRj0oZSx0LG4pPT57Ui5wdXNoKGUsdCxuKX0sJD0oZSx0KT0+e2NvbnN0IG49Ui5sZW5ndGgscj0rUltuLTNdLGE9K1Jbbi0yXTtyZXR1cm4gZT09PXImJnQ9PT1hfSxPPShlLHQpPT57Ui5sZW5ndGg/JChlLHQpfHwoVCgpLEYoZSx0LCExKSk6RihlLHQsITEpfSxTPShlLHQsbixyKT0+e1IubGVuZ3RofHxPKDAsMCksJChuLHIpfHwoRihlLHQsITApLEYobixyLCExKSl9LGs9bmV3IEZsb2F0MzJBcnJheSgzMiksQz0oZSx0LG4scixhLHMsbyxpLGMsbCk9Pntjb25zdCB1PS4xMjUqKGUrMyoobithKStvKSxoPS4xMjUqKHQrMyoocitzKStpKSxiPS4xMjUqKG8rYS1uLWUpLGQ9LjEyNSooaStzLXItdCk7a1tjXT1lLGtbYysxXT10LGtbYysyXT0uNSooZStuKSxrW2MrM109LjUqKHQrciksa1tjKzRdPXUtYixrW2MrNV09aC1kLGtbYys2XT11LGtbYys3XT1oLGtbbF09dSxrW2wrMV09aCxrW2wrMl09dStiLGtbbCszXT1oK2Qsa1tsKzRdPS41KihhK28pLGtbbCs1XT0uNSoocytpKSxrW2wrNl09byxrW2wrN109aX0sUD0oZSx0LG4scixhLHMsbyxpLGMpPT57Y29uc3QgbD0uMTI1KihlKzMqKG4rYSkrbyksdT0uMTI1Kih0KzMqKHIrcykraSk7a1tjXT0uMjUqZSsuNzUqbixrW2MrMV09LjI1KnQrLjc1KnIsa1tjKzJdPWwsa1tjKzNdPXUsa1tjKzRdPS43NSphKy4yNSpvLGtbYys1XT0uNzUqcysuMjUqaSxrW2MrNl09byxrW2MrN109aX0sQj0oZSx0LG4scixhLHMpPT57aWYoUi5sZW5ndGh8fE8oMCwwKSwkKGEscykpcmV0dXJuO2NvbnN0IG89Ui5sZW5ndGgsaT0oKGUsdCxuLHIsYSxzLG8saSk9PihDKGUsdCxuLHIsYSxzLG8saSwwLDE2KSxDKGtbMF0sa1sxXSxrWzJdLGtbM10sa1s0XSxrWzVdLGtbNl0sa1s3XSwwLDgpLEMoa1sxNl0sa1sxN10sa1sxOF0sa1sxOV0sa1syMF0sa1syMV0sa1syMl0sa1syM10sMTYsMjQpLFAoa1swXSxrWzFdLGtbMl0sa1szXSxrWzRdLGtbNV0sa1s2XSxrWzddLDApLFAoa1s4XSxrWzldLGtbMTBdLGtbMTFdLGtbMTJdLGtbMTNdLGtbMTRdLGtbMTVdLDgpLFAoa1sxNl0sa1sxN10sa1sxOF0sa1sxOV0sa1syMF0sa1syMV0sa1syMl0sa1syM10sMTYpLFAoa1syNF0sa1syNV0sa1syNl0sa1syN10sa1syOF0sa1syOV0sa1szMF0sa1szMV0sMjQpLGspKSgrUltvLTNdLCtSW28tMl0sZSx0LG4scixhLHMpO2ZvcihsZXQgZT0wOzMyPmU7KVMoaVtlKytdLGlbZSsrXSxpW2UrK10saVtlKytdKX0sST1bXSxMPWU9PntsZXQgdD0tMSxuPUkubGVuZ3RoO2Zvcig7TWF0aC5hYnMobi10KT4xOyl7Y29uc3Qgcj1NYXRoLmZsb29yKChuK3QpLzIpO2U8PUlbcl0uYXJlYT9uPXI6dD1yfXJldHVybiBufSxVPWU9PntuLmRlbGV0ZVRleHR1cmUoZS5yZXNvdXJjZSl9LE49W107bGV0IEQ9MDtjb25zdCBqPShlLHQpPT4oe2lkOkQrKyxyZXNvdXJjZTpuLmNyZWF0ZVRleHR1cmUoKSx3aWR0aDplLGhlaWdodDp0LGFyZWE6ZSp0LHNtb290aDohMX0pO2xldCBYPS0xO2NvbnN0IHo9ZT0+e1g9ZX0sVj1bbnVsbCxudWxsLG51bGxdO2xldCBXPTA7Y29uc3QgRz1lPT57aWYoIUkubGVuZ3RoKXJldHVybigoKT0+e2NvbnN0IGU9e2lkOjAscmVzb3VyY2U6bi5jcmVhdGVSZW5kZXJidWZmZXIoKSx3aWR0aDowLGhlaWdodDowLGFyZWE6MCxkaXJ0eTohMX07cmV0dXJue3Jlc291cmNlOm4uY3JlYXRlUmVuZGVyYnVmZmVyKCksc3RlbmNpbDplLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfX0pKCk7Y29uc3QgdD1MKGUpO2lmKHQ8SS5sZW5ndGgpe2NvbnN0IGU9SVt0XTtyZXR1cm4gSS5zcGxpY2UodCwxKSxlfWNvbnN0IHI9SS5zaGlmdCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigidGhlIGNvbG9yIGJ1ZmZlciBpcyB2b2lkLiIpO3JldHVybiByfTtsZXQgWT0wO2NvbnN0IHE9KGUsdCk9PntpZighTi5sZW5ndGgpcmV0dXJue2lkOlkrKyxyZXNvdXJjZTpuLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHdpZHRoOjAsaGVpZ2h0OjAsYXJlYTowLGRpcnR5OiExfTtmb3IobGV0IG49MDtuPE4ubGVuZ3RoOysrbil7Y29uc3Qgcj1OW25dO2lmKHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXQpcmV0dXJuIE4uc3BsaWNlKG4sMSkscn1yZXR1cm4gTi5zaGlmdCgpfSxLPShlLHQscj0hMSk9Pntjb25zdCBhPWooZSx0KTtyZXR1cm4oKGUsdD0hMSk9PntYIT09bi5URVhUVVJFMCYmKHoobi5URVhUVVJFMCksbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTApKSxWWzBdPWUsbi5iaW5kVGV4dHVyZShuLlRFWFRVUkVfMkQsZS5yZXNvdXJjZSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9TLG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfV1JBUF9ULG4uQ0xBTVBfVE9fRURHRSksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUlOX0ZJTFRFUix0P24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhQYXJhbWV0ZXJpKG4uVEVYVFVSRV8yRCxuLlRFWFRVUkVfTUFHX0ZJTFRFUix0P24uTElORUFSOm4uTkVBUkVTVCksbi50ZXhTdG9yYWdlMkQobi5URVhUVVJFXzJELDEsbi5SR0JBOCxlLndpZHRoLGUuaGVpZ2h0KX0pKGEsciksYX0sSD0oZSxyLGE9ITEpPT57Y29uc3Qgcz1iZS5sZW5ndGg/YmUuc2hpZnQoKTp7aWQ6VysrLHdpZHRoOjAsaGVpZ2h0OjAsY2xpcExldmVsOjAsbXNhYTohMSxtYXNrOiExLGNvbG9yOm51bGwsdGV4dHVyZTpudWxsLHN0ZW5jaWw6bnVsbH07cmV0dXJuIHMud2lkdGg9ZSxzLmhlaWdodD1yLGE/KHMubXNhYT0hMCxzLnRleHR1cmU9bnVsbCxzLmNvbG9yPSgoZSxyKT0+e2U9TWF0aC5tYXgoMjU2LGMoZSkpLHI9TWF0aC5tYXgoMjU2LGMocikpO2NvbnN0IGE9RyhlKnIpO3JldHVybihhLndpZHRoPGV8fGEuaGVpZ2h0PHIpJiYoZT1NYXRoLm1heChlLGEud2lkdGgpLHI9TWF0aC5tYXgocixhLmhlaWdodCksYS53aWR0aD1lLGEuaGVpZ2h0PXIsYS5hcmVhPWUqcixuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsYS5yZXNvdXJjZSksbi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUobi5SRU5ERVJCVUZGRVIsdCxuLlJHQkE4LGUsciksbi5iaW5kUmVuZGVyYnVmZmVyKG4uUkVOREVSQlVGRkVSLGEuc3RlbmNpbC5yZXNvdXJjZSksbi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUobi5SRU5ERVJCVUZGRVIsdCxuLlNURU5DSUxfSU5ERVg4LGUscikpLGEuZGlydHk9ITAsYX0pKGUscikscy5zdGVuY2lsPXMuY29sb3Iuc3RlbmNpbCk6KHMubXNhYT0hMSxzLnRleHR1cmU9SyhlLHIpLHMuY29sb3I9bnVsbCxzLnN0ZW5jaWw9KChlLHQpPT57Y29uc3Qgcj1xKGUsdCk7cmV0dXJuIHIud2lkdGg9PT1lJiZyLmhlaWdodD09PXR8fChyLndpZHRoPWUsci5oZWlnaHQ9dCxyLmFyZWE9ZSp0LHIuZGlydHk9ITEsbi5iaW5kUmVuZGVyYnVmZmVyKG4uUkVOREVSQlVGRkVSLHIucmVzb3VyY2UpLG4ucmVuZGVyYnVmZmVyU3RvcmFnZShuLlJFTkRFUkJVRkZFUixuLlNURU5DSUxfSU5ERVg4LGUsdCkpLHJ9KShlLHIpKSxzLm1hc2s9ITEscy5jbGlwTGV2ZWw9MCxzfTtsZXQgWj0wO2NvbnN0IFE9ZT0+e1o9ZX0sSj0oKT0+WixlZT1bXSx0ZT0oKT0+e3ZhciB0O3JldHVybiBaIGluIGVlfHwodD1IKGUsZSwhMCksZWVbWl09dCksZWVbWl19LG5lPVtdO2xldCByZT1udWxsO2NvbnN0IGFlPSgpPT4ocmV8fChyZT0oKCk9Pntjb25zdCB0PWooZSxlKTtyZXR1cm4gbi5hY3RpdmVUZXh0dXJlKG4uVEVYVFVSRTMpLG4uYmluZFRleHR1cmUobi5URVhUVVJFXzJELHQucmVzb3VyY2UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfUyxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX1dSQVBfVCxuLkNMQU1QX1RPX0VER0UpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01JTl9GSUxURVIsbi5MSU5FQVIpLG4udGV4UGFyYW1ldGVyaShuLlRFWFRVUkVfMkQsbi5URVhUVVJFX01BR19GSUxURVIsbi5ORUFSRVNUKSxuLnRleFN0b3JhZ2UyRChuLlRFWFRVUkVfMkQsMSxuLlJHQkE4LHQud2lkdGgsdC5oZWlnaHQpLG4uYWN0aXZlVGV4dHVyZSgtMSE9PVg/WDpuLlRFWFRVUkUwKSx0fSkoKSkscmUpLHNlPVtdLG9lPWU9PihlIGluIHNlfHwoc2VbZV09bmV3IEZsb2F0MzJBcnJheShbTnVtYmVyLk1BWF9WQUxVRSxOdW1iZXIuTUFYX1ZBTFVFLC1OdW1iZXIuTUFYX1ZBTFVFLC1OdW1iZXIuTUFYX1ZBTFVFXSkpLHNlW2VdKSxpZT1bXSxjZT1lPT4oZSBpbiBpZXx8KGllW2VdPW5ldyBGbG9hdDMyQXJyYXkoW051bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRSwtTnVtYmVyLk1BWF9WQUxVRV0pKSxpZVtlXSk7bGV0IGxlPTA7Y29uc3QgdWU9ZT0+e2xlPWV9LGhlPSgpPT5sZSxiZT1bXTtsZXQgZGU7bGV0IGZlPW51bGw7bGV0IG1lPW51bGw7bGV0IHZlPW51bGw7Y29uc3QgX2U9ZT0+e3ZlPWV9LHBlPSgpPT52ZTtsZXQgZ2U9ITE7Y29uc3QgeGU9ZT0+e2dlPWV9LEVlPSgpPT5nZTtsZXQgQWU9bnVsbCx5ZT1udWxsLFRlPW51bGwsUmU9bnVsbDtjb25zdCBNZT0oKT0+eWUsd2U9KGUsdD0hMCk9Pnt2YXIgcjtlLm1zYWE/KChlPT57aWYoSS5pbmRleE9mKGUpPi0xKXJldHVybjtjb25zdCB0PUwoZS5hcmVhKTtlLmRpcnR5PSEwLEkuc3BsaWNlKHQsMCxlKX0pKGUuY29sb3IpLGUuY29sb3I9bnVsbCxlLnN0ZW5jaWw9bnVsbCk6KHQmJlUoZS50ZXh0dXJlKSxlLnRleHR1cmU9bnVsbCxyPWUuc3RlbmNpbCxOLmluZGV4T2Yocik+LTF8fChOLmxlbmd0aD4xMD9uLmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLnJlc291cmNlKTooci5kaXJ0eT0hMCxOLnB1c2gocikpKSxlLnN0ZW5jaWw9bnVsbCksYmUucHVzaChlKX0sRmU9KCk9PntuZS5sZW5ndGg9MCxRKDApO2NvbnN0IGU9ZWU7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspd2UoZVt0XSk7ZS5sZW5ndGg9MH0sJGU9KGUsdCxyLGE9ITApPT57aWYoZS5jbGVhckFycmF5c0luc3RhbmNlZCgpLGUuJHN0YWNrQXR0YWNobWVudE9iamVjdC5sZW5ndGgpZm9yKGxldCB0PTA7dDxlLiRzdGFja0F0dGFjaG1lbnRPYmplY3QubGVuZ3RoOysrdCl7Y29uc3Qgbj1lLiRzdGFja0F0dGFjaG1lbnRPYmplY3RbdF07biYmd2Uobil9ZWxzZSBlLiRtYWluQXR0YWNobWVudE9iamVjdCYmd2UoZS4kbWFpbkF0dGFjaG1lbnRPYmplY3QpO2EmJkZlKCksX2UobnVsbCksRWUoKSYmKHhlKCExKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLG51bGwpKSxlLiRtYWluQXR0YWNobWVudE9iamVjdD1IKHQsciwhMCksZS5iaW5kKGUuJG1haW5BdHRhY2htZW50T2JqZWN0KX0sT2U9KGUsdCxyPW51bGwsYT0hMSk9PnstMSE9PVgmJnQ9PT1YfHwoeih0KSxuLmFjdGl2ZVRleHR1cmUodCkpO2NvbnN0IHM9VltlXTtudWxsIT09cyYmbnVsbCE9PXImJnMuaWQ9PT1yLmlkfHxyPT09c3x8KFZbZV09cixuLmJpbmRUZXh0dXJlKG4uVEVYVFVSRV8yRCxyP3IucmVzb3VyY2U6bnVsbCksciYmci5zbW9vdGghPT1hJiYoci5zbW9vdGg9YSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NSU5fRklMVEVSLGE/bi5MSU5FQVI6bi5ORUFSRVNUKSxuLnRleFBhcmFtZXRlcmkobi5URVhUVVJFXzJELG4uVEVYVFVSRV9NQUdfRklMVEVSLGE/bi5MSU5FQVI6bi5ORUFSRVNUKSkpfSxTZT0oZSx0PSExKT0+e09lKDIsbi5URVhUVVJFMixudWxsKSxPZSgxLG4uVEVYVFVSRTEsbnVsbCksT2UoMCxuLlRFWFRVUkUwLGUsdCl9LGtlPSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PWUuY2xpcExldmVsO2xldCBhPTA7Zm9yKGxldCBlPTA7ZTx0OysrZSlhfD0oMTw8dC1lKS0xO24uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uRVFVQUwsMjU1JmEsYSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uS0VFUCxuLktFRVApLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9O2xldCBDZT0hMTtjb25zdCBQZT1lPT57Q2U9ZX0sQmU9KCk9PkNlLEllPW5ldyBNYXAsTGU9bmV3IE1hcCxVZT0oZSx0KT0+e2NvbnN0IHI9cGUoKTtpZihyJiZ0LmlkPT09ci5pZClyZXR1cm47dmFyIGEsczsoZT0+e19lKGUpLEVlKCl8fCh4ZSghMCksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixkZSkpLGUubXNhYT8obi5iaW5kUmVuZGVyYnVmZmVyKG4uUkVOREVSQlVGRkVSLGUuY29sb3IucmVzb3VyY2UpLG4uZnJhbWVidWZmZXJSZW5kZXJidWZmZXIobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uUkVOREVSQlVGRkVSLGUuY29sb3IucmVzb3VyY2UpKTooU2UoZS50ZXh0dXJlKSxuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsZS50ZXh0dXJlLnJlc291cmNlLDApKSxuLmJpbmRSZW5kZXJidWZmZXIobi5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKSxuLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKG4uRlJBTUVCVUZGRVIsbi5TVEVOQ0lMX0FUVEFDSE1FTlQsbi5SRU5ERVJCVUZGRVIsZS5zdGVuY2lsLnJlc291cmNlKX0pKHQpLHImJnIud2lkdGg9PT10LndpZHRoJiZyLmhlaWdodD09PXQuaGVpZ2h0fHwoYT10LndpZHRoLHM9dC5oZWlnaHQscD1hLGc9cyxuLnZpZXdwb3J0KDAsMCx0LndpZHRoLHQuaGVpZ2h0KSk7Y29uc3Qgbz10Lm1zYWE/dC5jb2xvcjp0LnN0ZW5jaWw7dmFyIGk7by5kaXJ0eSYmKG8uZGlydHk9ITEsZS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpKSwhKGk9dC5tYXNrKSYmQmUoKT8oUGUoITEpLG4uZGlzYWJsZShuLlNURU5DSUxfVEVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSk6aSYmIUJlKCkmJihQZSghMCksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLGtlKCkpfSxOZT1lPT57aWYoIWUuJHN0YWNrLmxlbmd0aClyZXR1cm47Y29uc3QgdD1lLiRzdGFjay5wb3AoKTt2YXIgbjtlLiRtYXRyaXhbMF09dFswXSxlLiRtYXRyaXhbMV09dFsxXSxlLiRtYXRyaXhbM109dFszXSxlLiRtYXRyaXhbNF09dFs0XSxlLiRtYXRyaXhbNl09dFs2XSxlLiRtYXRyaXhbN109dFs3XSxuPXQsYi5wdXNoKG4pfSxEZT0oZSx0LHIsYSk9PntuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUsdCxyKzEsYSsxKSxuLmNsZWFyKG4uQ09MT1JfQlVGRkVSX0JJVHxuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5zY2lzc29yKGUsdCxyLGEpfSxqZT0oZSx0LG4scixhLHMsbyxpLGMsbCx1LGgsYik9Pntjb25zdCBkPWUubGVuZ3RoLTU7Zm9yKGxldCBmPTM7ZjxkO2YrPTMpe2xldCBkPTE3Km47ZVtmKzJdPyh0W2QrK109ZVtmLTNdLHRbZCsrXT1lW2YtMl0sdFtkKytdPTAsdFtkKytdPTAsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZl0sdFtkKytdPWVbZisxXSx0W2QrK109LjUsdFtkKytdPTAsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZiszXSx0W2QrK109ZVtmKzRdLHRbZCsrXT0xLHRbZCsrXT0xLHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wKTplW2YrNV0/KHRbZCsrXT1lWzBdLHRbZCsrXT1lWzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZl0sdFtkKytdPWVbZisxXSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wLHRbZCsrXT1lW2YrNl0sdFtkKytdPWVbZis3XSx0W2QrK109LjUsdFtkKytdPS41LHRbZCsrXT1sLHRbZCsrXT11LHRbZCsrXT1oLHRbZCsrXT1iLHRbZCsrXT1yLHRbZCsrXT1hLHRbZCsrXT0wLHRbZCsrXT1zLHRbZCsrXT1vLHRbZCsrXT0wLHRbZCsrXT1pLHRbZCsrXT1jLHRbZCsrXT0wKToodFtkKytdPWVbMF0sdFtkKytdPWVbMV0sdFtkKytdPS41LHRbZCsrXT0uNSx0W2QrK109bCx0W2QrK109dSx0W2QrK109aCx0W2QrK109Yix0W2QrK109cix0W2QrK109YSx0W2QrK109MCx0W2QrK109cyx0W2QrK109byx0W2QrK109MCx0W2QrK109aSx0W2QrK109Yyx0W2QrK109MCx0W2QrK109ZVtmXSx0W2QrK109ZVtmKzFdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTAsdFtkKytdPWVbZiszXSx0W2QrK109ZVtmKzRdLHRbZCsrXT0uNSx0W2QrK109LjUsdFtkKytdPWwsdFtkKytdPXUsdFtkKytdPWgsdFtkKytdPWIsdFtkKytdPXIsdFtkKytdPWEsdFtkKytdPTAsdFtkKytdPXMsdFtkKytdPW8sdFtkKytdPTAsdFtkKytdPWksdFtkKytdPWMsdFtkKytdPTApLG4rPTN9cmV0dXJuIG59LFhlPShlLHQ9ImZpbGwiKT0+e2NvbnN0IG49ImZpbGwiPT09dD9yLiRmaWxsU3R5bGU6ci4kc3Ryb2tlU3R5bGUsYT1uWzBdLHM9blsxXSxvPW5bMl0saT1uWzNdLGM9ci4kbWF0cml4LGw9eCgpLHU9RSgpLGg9Y1swXS9sLGI9Y1szXS9sLGQ9Y1s2XS9sLGY9Y1sxXS91LG09Y1s0XS91LHY9Y1s3XS91O2xldCBfPTA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpXys9NTEqKGVbdF0ubGVuZ3RoLzMtMik7Y29uc3QgcD1uZXcgRmxvYXQzMkFycmF5KF8pO2xldCBnPTA7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDsrK3QpZz1qZShlW3RdLHAsZyxoLGYsYixtLGQsdixhLHMsbyxpKTtyZXR1cm57YnVmZmVyOnAsaW5kZXhDb3VudDpnfX07bGV0IHplPW5ldyBGbG9hdDMyQXJyYXkoMTI4KSxWZT0wO2NvbnN0IFdlPWU9Pntjb25zdCB0PWUubGVuZ3RoK1ZlO2lmKHQ+emUubGVuZ3RoKXtjb25zdCByPW5ldyBGbG9hdDMyQXJyYXkoKG49dCxuLS0sbnw9bj4+MSxufD1uPj4yLG58PW4+PjQsbnw9bj4+OCxufD1uPj4xNiwrK24pKTtyLnNldCh6ZSksci5zZXQoZSxWZSksemU9cn1lbHNlIHplLnNldChlLFZlKTt2YXIgbjtWZSs9ZS5sZW5ndGh9LEdlPVtdLFllPVtdLHFlPSgpPT57WWUubGVuZ3RoPTAsVmU9MCxHZS5sZW5ndGg9MH0sS2U9W10sSGU9KGUsdCxuKT0+e2NvbnN0IHI9e3g6dC54LWUueCx5OnQueS1lLnl9LGE9KChlLHQsbik9Pntjb25zdCByPU1hdGguc3FydChlKmUrdCp0KTtyZXR1cm57eDotdC9yKm4seTplL3Iqbn19KShyLngsci55LG4pLHM9e3g6ZS54K2EueCx5OmUueSthLnl9LG89e3g6dC54K2EueCx5OnQueSthLnl9LGk9e3g6ZS54LWEueCx5OmUueS1hLnl9LGM9e3g6dC54LWEueCx5OnQueS1hLnl9O3JldHVybltzLngscy55LCExLG8ueCxvLnksITEsYy54LGMueSwhMSxpLngsaS55LCExLHMueCxzLnksITFdfSxaZT0oZSx0LG4pPT4oe3g6ZS54Kyh0LngtZS54KSpuLHk6ZS55Kyh0LnktZS55KSpufSksUWU9KGUsdCxuLHI9LjUpPT57Y29uc3QgYT1aZShlLHQscikscz1aZSh0LG4sciksbz1aZShhLHMscik7cmV0dXJuW1tlLGEsb10sW28scyxuXV19LEplPShlLHQsbixyKT0+KHt4OigxLWUpKioyKnQueCsyKigxLWUpKmUqbi54K2UqKjIqci54LHk6KDEtZSkqKjIqdC55KzIqKDEtZSkqZSpuLnkrZSoqMipyLnl9KSxldD0oZSx0LG4scik9Pih7eDoyKigxLWUpKihuLngtdC54KSsyKmUqKHIueC1uLngpLHk6MiooMS1lKSoobi55LXQueSkrMiplKihyLnktbi55KX0pLHR0PWU9Pntjb25zdCB0PU1hdGguc3FydChlLngqZS54K2UueSplLnkpO3JldHVybiAwPT09dD97eDowLHk6MH06e3g6ZS54L3QseTplLnkvdH19LG50PShlLHQsbixyKT0+e2NvbnN0IGE9WzAsLjUsMV0scz1bXTtmb3IobGV0IG89MDtvPGEubGVuZ3RoOysrbyl7Y29uc3QgaT1hW29dLGM9SmUoaSxlLHQsbiksbD1ldChpLGUsdCxuKSx1PXR0KHt4Oi1sLnkseTpsLnh9KTtzLnB1c2goe3g6Yy54K3UueCpyLHk6Yy55K3UueSpyfSl9cmV0dXJuIHN9LHJ0PShlLHQsbixyKT0+e2NvbnN0IGE9KChlLHQsbixyPTQpPT57bGV0IGE9W1tlLHQsbl1dO2ZvcihsZXQgZT0wO2U8cjsrK2Upe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDsrK3Qpe2NvbnN0IG49YVt0XTtpZighbiljb250aW51ZTtjb25zdCByPVFlKG5bMF0sblsxXSxuWzJdLC41KTtlLnB1c2goclswXSxyWzFdKX1hPWV9cmV0dXJuIGF9KShlLHQsbiw1KSxzPVtdLG89W107Zm9yKGxldCBlPTA7ZTxhLmxlbmd0aDsrK2Upe2NvbnN0W3QsbixpXT1hW2VdO3MucHVzaChudCh0LG4saSwrcikpLG8ucHVzaChudCh0LG4saSwtcikpfWNvbnN0IGk9c1swXVswXSxjPVtpLngsaS55LCExXTtmb3IobGV0IGU9MDtlPHMubGVuZ3RoOysrZSl7Y29uc3QgdD1zW2VdO2MucHVzaCh0WzFdLngsdFsxXS55LCEwLHRbMl0ueCx0WzJdLnksITEpfWNvbnN0IGw9Wy4uLm9dLnJldmVyc2UoKTtmb3IobGV0IGU9MDtlPGwubGVuZ3RoOysrZSl7Y29uc3RbdCxuLHJdPWxbZV07bFtlXT1bcixuLHRdfWNvbnN0IHU9bFswXVswXTtjLnB1c2godS54LHUueSwhMSk7Zm9yKGxldCBlPTA7ZTxsLmxlbmd0aDsrK2Upe2NvbnN0IHQ9bFtlXTtjLnB1c2godFsxXS54LHRbMV0ueSwhMCx0WzJdLngsdFsyXS55LCExKX1yZXR1cm4gY30sYXQ9KGUsdCxuLHIpPT57Y29uc3QgYT1bXTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoO3MrPTMpe2lmKHJbcysyXSljb250aW51ZTtjb25zdCBvPXJbc10saT1yW3MrMV07TWF0aC5zcXJ0KE1hdGgucG93KG8tZSwyKStNYXRoLnBvdyhpLXQsMikpPT09biYmYS5wdXNoKG8saSl9cmV0dXJuIGF9LHN0PW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKS5nZXRDb250ZXh0KCIyZCIpLG90PShlLHQpPT57c3QuYmVnaW5QYXRoKCksc3QubW92ZVRvKHRbMF0sdFsxXSk7Zm9yKGxldCBlPTM7ZTx0Lmxlbmd0aDtlKz0zKXRbZSsyXT8oc3QucXVhZHJhdGljQ3VydmVUbyh0W2VdLHRbZSsxXSx0W2UrM10sdFtlKzRdKSxlKz0zKTpzdC5saW5lVG8odFtlXSx0W2UrMV0pO3N0LmNsb3NlUGF0aCgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil7Y29uc3Qgbj1lW3RdLHI9ZVt0KzFdO2lmKCFzdC5pc1BvaW50SW5QYXRoKG4scikpcmV0dXJuW24scl19cmV0dXJuIG51bGx9LGl0PShlLHQsbixyLGE9ITEpPT57Y29uc3Qgcz1hPzA6ci5sZW5ndGgtMSxvPWE/ci5sZW5ndGgtMTpyLmxlbmd0aC0yLGk9YXQoZSx0LG4scltzXSksYz1hdChlLHQsbixyW29dKSxsPW90KGkscltvXSk7aWYoIWwpcmV0dXJuO2NvbnN0IHU9b3QoYyxyW3NdKTtpZighdSlyZXR1cm47Y29uc3QgaD1NYXRoLmF0YW4yKGxbMV0tdCxsWzBdLWUpO2xldCBiPU1hdGguYXRhbjIodVsxXS10LHVbMF0tZSktaDtiPk1hdGguUEk/Yi09MipNYXRoLlBJOmI8LU1hdGguUEkmJihiKz0yKk1hdGguUEkpO2NvbnN0IGQ9Yi84LGY9W2UsdCwhMV07Zm9yKGxldCByPTA7cjw9ODtyKyspe2NvbnN0IGE9aCtyKmQscz1lK24qTWF0aC5jb3MoYSksbz10K24qTWF0aC5zaW4oYSk7Zi5wdXNoKHMsbywhMSl9ci5zcGxpY2UoLTEsMCxmKX0sY3Q9KGUsdCxuLHIsYT0hMSk9Pntjb25zdCBzPWE/MDpyLmxlbmd0aC0xLG89YT9yLmxlbmd0aC0xOnIubGVuZ3RoLTIsaT1hdChlLHQsbixyW3NdKSxjPWF0KGUsdCxuLHJbb10pO2lmKGlbMF09PT1jWzBdJiZpWzFdPT09Y1sxXXx8aVswXT09PWNbMl0mJmlbMV09PT1jWzNdKXJldHVybjtjb25zdCBsPW90KGkscltvXSk7aWYoIWwpcmV0dXJuO2NvbnN0IHU9b3QoYyxyW3NdKTt1JiZyLnNwbGljZSgtMSwwLFtlLHQsITEsbFswXSxsWzFdLCExLHVbMF0sdVsxXSwhMSxlLHQsITFdKX0sbHQ9KGUsdCxuLHIsYSxzPSExKT0+e2NvbnN0IG89cz8wOmEubGVuZ3RoLTEsaT1zP2EubGVuZ3RoLTE6YS5sZW5ndGgtMixjPWF0KGUueCxlLnkscixhW29dKSxsPWF0KGUueCxlLnkscixhW2ldKTtpZihjWzBdPT09bFswXSYmY1sxXT09PWxbMV18fGNbMF09PT1sWzJdJiZjWzFdPT09bFszXSlyZXR1cm47Y29uc3QgdT1vdChjLGFbaV0pO2lmKCF1KXJldHVybjtjb25zdCBoPW90KGwsYVtvXSk7aWYoIWgpcmV0dXJuO2NvbnN0IGI9dC54LWUueCxkPXQueS1lLnksZj1NYXRoLmh5cG90KGIsZCksbT17eDpiL2YseTpkL2Z9LHY9bi54LWUueCxfPW4ueS1lLnkscD1NYXRoLmh5cG90KHYsXyksZz17eDp2L3AseTpfL3B9LHg9bS54LEU9bS55LEE9Zy54LHk9Zy55LFQ9eCp5LUUqQTswPT09VCYmYS5zcGxpY2UoLTEsMCxbZS54LGUueSwhMSx1WzBdLHVbMV0sITEsaFswXSxoWzFdLCExXSk7Y29uc3QgUj0oKGhbMF0tdVswXSkqeS0oaFsxXS11WzFdKSpBKS9ULE09dVswXStSKngsdz11WzFdK1IqRTthLnNwbGljZSgtMSwwLFtlLngsZS55LCExLHVbMF0sdVsxXSwhMSxNLHcsITEsZS54LGUueSwhMSxoWzBdLGhbMV0sITEsTSx3LCExXSl9LHV0PShlLHQpPT57Y29uc3Qgbj17eDplWzBdLHk6ZVsxXX0sYT17eDowLHk6MH0scz17eDowLHk6MH0sbz17eDowLHk6MH0saT1bXTtmb3IobGV0IGM9MztjPGUubGVuZ3RoO2MrPTMpe2NvbnN0IGw9ZVtjXSx1PWVbYysxXTtpZihlW2MrMl0pYS54PWwsYS55PXU7ZWxzZXtpZihzLng9bCxzLnk9dSxlW2MtMV0/aS5wdXNoKHJ0KG4sYSxzLHQpKTppLnB1c2goSGUobixzLHQpKSxpLmxlbmd0aD4xKXN3aXRjaChyLmpvaW50cyl7Y2FzZSAwOmN0KG4ueCxuLnksdCxpKTticmVhaztjYXNlIDE6by54PWVbYy02XSxvLnk9ZVtjLTVdLGx0KG4scyxvLHQsaSk7YnJlYWs7Y2FzZSAyOml0KG4ueCxuLnksdCxpKX1uLng9cy54LG4ueT1zLnl9fWlmKGVbMF09PT1lW2UubGVuZ3RoLTNdJiZlWzFdPT09ZVtlLmxlbmd0aC0yXSlzd2l0Y2goci5qb2ludHMpe2Nhc2UgMDpjdChuLngsbi55LHQsaSwhMCk7YnJlYWs7Y2FzZSAxOm4ueD1lWzBdLG4ueT1lWzFdLHMueD1lWzNdLHMueT1lWzRdLG8ueD1lW2UubGVuZ3RoLTZdLG8ueT1lW2UubGVuZ3RoLTVdLGx0KG4scyxvLHQsaSwhMCk7YnJlYWs7Y2FzZSAyOml0KG4ueCxuLnksdCxpLCEwKX1lbHNlIHN3aXRjaChyLmNhcHMpe2Nhc2UgMTooKGUsdCxuKT0+e2ZvcihsZXQgcj0wO3I8MjsrK3Ipe2xldCBhPTAscz0wLG89MCxpPTA7MD09PXI/KGE9ZVswXSxzPWVbMV0sbz1lWzNdLGk9ZVs0XSk6KGE9ZVtlLmxlbmd0aC0zXSxzPWVbZS5sZW5ndGgtMl0sbz1lW2UubGVuZ3RoLTZdLGk9ZVtlLmxlbmd0aC01XSk7Y29uc3QgYz1vLWEsbD1pLXMsdT1NYXRoLmF0YW4yKGwsYyksaD11K01hdGguUEkvMixiPXUtTWF0aC5QSS8yLGQ9MTYsZj0oYi1oKS9kLG09W107Zm9yKGxldCBlPTA7ZTw9ZDtlKyspe2NvbnN0IG49YitmKmUscj1hK3QqTWF0aC5jb3Mobiksbz1zK3QqTWF0aC5zaW4obik7bS5wdXNoKHIsbywhMSl9MD09PXI/bi51bnNoaWZ0KG0pOm4ucHVzaChtKX19KShlLHQsaSk7YnJlYWs7Y2FzZSAyOigoZSx0LG4pPT57Zm9yKGxldCByPTA7cjwyOysrcil7bGV0IGE9MCxzPTAsbz0wLGk9MDswPT09cj8oYT1lWzBdLHM9ZVsxXSxvPWVbM10saT1lWzRdKTooYT1lW2UubGVuZ3RoLTNdLHM9ZVtlLmxlbmd0aC0yXSxvPWVbZS5sZW5ndGgtNl0saT1lW2UubGVuZ3RoLTVdKTtjb25zdCBjPS0oby1hKSxsPS0oaS1zKSx1PU1hdGguc3FydChjKmMrbCpsKTtpZigwPT09dSljb250aW51ZTtjb25zdCBoPWMvdSxiPWwvdSxkPWErdCpoLGY9cyt0KmIsbT0tYix2PVtkK3QqaCt0Km0sZit0KmIrdCpoLCExLGQrdCpoLXQqbSxmK3QqYi10KmgsITEsZC10KmgtdCptLGYtdCpiLXQqaCwhMSxkK3QqaCt0Km0sZit0KmIrdCpoLCExLGQtdCpoLXQqbSxmLXQqYi10KmgsITEsZC10KmgrdCptLGYtdCpiK3QqaCwhMV07MD09PXI/bi51bnNoaWZ0KHYpOm4ucHVzaCh2KX19KShlLHQsaSl9cmV0dXJuIGl9LGh0PWU9Pntjb25zdCB0PXIudGhpY2tuZXNzLzIsbj1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoOysrcil7Y29uc3QgYT11dChlW3JdLHQpO24ucHVzaCguLi5hKX1yZXR1cm4gWGUobiwic3Ryb2tlIil9LGJ0PW5ldyBNYXAsZHQ9KCk9PntidC5jbGVhcigpfSxmdD0oKT0+KHtpZDpwdCgpLHJlc291cmNlOm4uY3JlYXRlVmVydGV4QXJyYXkoKSx2ZXJ0ZXhCdWZmZXI6bi5jcmVhdGVCdWZmZXIoKSx2ZXJ0ZXhMZW5ndGg6MH0pO2xldCBtdDtjb25zdCB2dD1lPT57bXQmJm10LmlkPT09ZS5pZHx8KG10PWUsbi5iaW5kVmVydGV4QXJyYXkoZS5yZXNvdXJjZSkpfTtsZXQgX3Q9MDtjb25zdCBwdD0oKT0+X3QrKyxndD1bXSx4dD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMCwxLDEsMCwxLDFdKTtsZXQgRXQ7bGV0IEF0O2xldCB5dDtjb25zdCBUdD0oKT0+KHl0fHwoeXQ9KCgpPT57Y29uc3QgZT1mdCgpO3Z0KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlcik7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFswLDAsMSwwLDAsMSwxLDEsMCwxLDEsMF0pO3JldHVybiBuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsdCxuLlNUQVRJQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDApLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSwwLDApLGV9KSgpKSx5dCksUnQ9KCk9Pntjb25zdCBlPSgoKT0+e2lmKGd0Lmxlbmd0aClyZXR1cm4gZ3QucG9wKCk7Y29uc3QgZT1mdCgpO3JldHVybiB2dChlKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsZS52ZXJ0ZXhCdWZmZXIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg0KSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcigwLDIsbi5GTE9BVCwhMSw2OCwwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMSwyLG4uRkxPQVQsITEsNjgsOCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDIsNCxuLkZMT0FULCExLDY4LDE2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywzLG4uRkxPQVQsITEsNjgsMzIpLG4udmVydGV4QXR0cmliUG9pbnRlcig0LDMsbi5GTE9BVCwhMSw2OCw0NCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDUsMyxuLkZMT0FULCExLDY4LDU2KSxlfSkoKTt2dChlKTtjb25zdCB0PXplLHI9VmU7cmV0dXJuIG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksZS52ZXJ0ZXhMZW5ndGg8dC5sZW5ndGgmJihlLnZlcnRleExlbmd0aD1jKHQubGVuZ3RoKSxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCplLnZlcnRleExlbmd0aCxuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLHQuc3ViYXJyYXkoMCxyKSksZX0sTXQ9ZT0+e2d0LmluZGV4T2YoZSk+LTF8fGd0LnB1c2goZSl9O2xldCB3dD0wO2xldCBGdD0tMTtjbGFzcyAkdHtjb25zdHJ1Y3RvcihlLHQscj0hMSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIl8kcHJvZ3JhbU9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHVuaWZvcm1NYXAiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcHJvZ3JhbU9iamVjdD0oKGUsdCk9Pntjb25zdCByPW4uY3JlYXRlUHJvZ3JhbSgpLGE9bi5jcmVhdGVTaGFkZXIobi5WRVJURVhfU0hBREVSKTtuLnNoYWRlclNvdXJjZShhLGUpLG4uY29tcGlsZVNoYWRlcihhKTtjb25zdCBzPW4uY3JlYXRlU2hhZGVyKG4uRlJBR01FTlRfU0hBREVSKTtyZXR1cm4gbi5zaGFkZXJTb3VyY2Uocyx0KSxuLmNvbXBpbGVTaGFkZXIocyksbi5hdHRhY2hTaGFkZXIocixhKSxuLmF0dGFjaFNoYWRlcihyLHMpLG4ubGlua1Byb2dyYW0ociksbi5kZXRhY2hTaGFkZXIocixhKSxuLmRldGFjaFNoYWRlcihyLHMpLG4uZGVsZXRlU2hhZGVyKGEpLG4uZGVsZXRlU2hhZGVyKHMpLHtpZDp3dCsrLHJlc291cmNlOnJ9fSkoZSx0KSx0aGlzLl8kdW5pZm9ybU1hcD1uZXcgTWFwLCgoZSx0LHI9ITEpPT57Y29uc3QgYT1uLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxuLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBzPTA7czxhOysrcyl7Y29uc3QgYT1uLmdldEFjdGl2ZVVuaWZvcm0oZSxzKSxvPWEubmFtZS5lbmRzV2l0aCgiWzBdIik/YS5uYW1lLnNsaWNlKDAsLTMpOmEubmFtZSxpPW4uZ2V0VW5pZm9ybUxvY2F0aW9uKGUsbyk7aWYoYS50eXBlPT09bi5TQU1QTEVSXzJEJiYxPT09YS5zaXplJiYhciljb250aW51ZTtjb25zdCBjPXt9O3N3aXRjaChhLnR5cGUpe2Nhc2Ugbi5GTE9BVF9WRUM0OmMubWV0aG9kPW4udW5pZm9ybTRmdi5iaW5kKG4saSksYy5hcnJheT1uZXcgRmxvYXQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uSU5UX1ZFQzQ6Yy5tZXRob2Q9bi51bmlmb3JtNGl2LmJpbmQobixpKSxjLmFycmF5PW5ldyBJbnQzMkFycmF5KDQqYS5zaXplKSxjLmFzc2lnbj0tMTticmVhaztjYXNlIG4uU0FNUExFUl8yRDpjLm1ldGhvZD1yP24udW5pZm9ybTFpLmJpbmQobixpLDMpOm4udW5pZm9ybTFpdi5iaW5kKG4saSksYy5hcnJheT1uZXcgSW50MzJBcnJheShhLnNpemUpLGMuYXNzaWduPTE7YnJlYWs7Y2FzZSBuLkZMT0FUOmNhc2Ugbi5GTE9BVF9WRUMyOmNhc2Ugbi5GTE9BVF9WRUMzOmNhc2Ugbi5GTE9BVF9NQVQyOmNhc2Ugbi5GTE9BVF9NQVQzOmNhc2Ugbi5GTE9BVF9NQVQ0OmNhc2Ugbi5JTlQ6Y2FzZSBuLklOVF9WRUMyOmNhc2Ugbi5JTlRfVkVDMzpkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVXNlIGdsLkZMT0FUX1ZFQzQgb3IgZ2wuSU5UX1ZFQzQgaW5zdGVhZCIpfXQuc2V0KG8sYyl9fSkodGhpcy5fJHByb2dyYW1PYmplY3QucmVzb3VyY2UsdGhpcy5fJHVuaWZvcm1NYXAscil9dXNlUHJvZ3JhbSgpe3ZhciBlO2U9dGhpcy5fJHByb2dyYW1PYmplY3QsRnQhPT1lLmlkJiYoRnQ9ZS5pZCxuLnVzZVByb2dyYW0oZS5yZXNvdXJjZSkpfWJpbmRVbmlmb3JtKCl7KGU9Pntmb3IoY29uc3QgdCBvZiBlLnZhbHVlcygpKXZvaWQgMCE9PXQubWV0aG9kJiZ2b2lkIDAhPT10LmFzc2lnbiYmKHQuYXNzaWduPDA/dC5tZXRob2QodC5hcnJheSk6dC5hc3NpZ24+MCYmKHQuYXNzaWduLS0sdC5tZXRob2QodC5hcnJheSkpKX0pKHRoaXMuXyR1bmlmb3JtTWFwKX1nZXQgaGlnaHAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X2hpZ2hwIikuYXJyYXl9Z2V0IG1lZGl1bXAoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X21lZGl1bXAiKS5hcnJheX1nZXQgdGV4dHVyZXMoKXtyZXR1cm4gdGhpcy5fJHVuaWZvcm1NYXAuZ2V0KCJ1X3RleHR1cmVzIikuYXJyYXl9fWNvbnN0IE90PW5ldyBNYXAsU3Q9KGUsdCxuLHIpPT57Y29uc3QgYT1uPyJsYXlvdXQgKGxvY2F0aW9uID0gMSkgaW4gdmVjMiBhX2JlemllcjsiOiIiLHM9bj8ib3V0IHZlYzIgdl9iZXppZXI7Ijp0PyJvdXQgdmVjMiB2X3V2OyI6IiIsbz1uPyJ2X2JlemllciA9IGFfYmV6aWVyOyI6dD8iXG4gICAgbWF0MyB1dl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWzBdLnh5eixcbiAgICAgICAgdV9oaWdocFsxXS54eXosXG4gICAgICAgIHVfaGlnaHBbMl0ueHl6XG4gICAgKTtcbiAgICBtYXQzIGludmVyc2VfbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFszXS54eXosXG4gICAgICAgIHVfaGlnaHBbNF0ueHl6LFxuICAgICAgICB2ZWMzKHVfaGlnaHBbMl0udywgdV9oaWdocFszXS53LCB1X2hpZ2hwWzRdLncpXG4gICAgKTtcbiAgICB2X3V2ID0gKGludmVyc2VfbWF0cml4ICogdXZfbWF0cml4ICogdmVjMyhhX3ZlcnRleCwgMS4wKSkueHk7IjoiIixpPXI/KGU9PmBcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIHBhcmVudF9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMX1dLnh5eixcbiAgICAgICAgdV9oaWdocFske2UrMn1dLnh5elxuICAgICk7XG4gICAgbWF0MyBhbmNlc3Rvcl9tYXRyaXggPSBtYXQzKFxuICAgICAgICB1X2hpZ2hwWyR7ZSszfV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs0fV0ueHl6LFxuICAgICAgICB1X2hpZ2hwWyR7ZSs1fV0ueHl6XG4gICAgKTtcblxuICAgIHZlYzIgcGFyZW50X29mZnNldCA9IHZlYzIodV9oaWdocFske2UrMn1dLncsIHVfaGlnaHBbJHtlKzN9XS53KTtcbiAgICB2ZWMyIHBhcmVudF9zaXplICAgPSB2ZWMyKHVfaGlnaHBbJHtlKzR9XS53LCB1X2hpZ2hwWyR7ZSs1fV0udyk7XG4gICAgdmVjNCBncmlkX21pbiA9IHVfaGlnaHBbJHtlKzZ9XTtcbiAgICB2ZWM0IGdyaWRfbWF4ID0gdV9oaWdocFske2UrN31dO1xuICAgIFxuICAgIHZlYzIgcG9zaXRpb24gPSAocGFyZW50X21hdHJpeCAqIHZlYzModmVydGV4LCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiA9IChwb3NpdGlvbiAtIHBhcmVudF9vZmZzZXQpIC8gcGFyZW50X3NpemU7XG5cbiAgICB2ZWM0IGdhID0gZ3JpZF9taW47XG4gICAgdmVjNCBnYiA9IGdyaWRfbWF4ICAtIGdyaWRfbWluO1xuICAgIHZlYzQgZ2MgPSB2ZWM0KDEuMCkgLSBncmlkX21heDtcblxuICAgIHZlYzIgcGEgPSBwb3NpdGlvbjtcbiAgICB2ZWMyIHBiID0gcG9zaXRpb24gLSBncmlkX21pbi5zdDtcbiAgICB2ZWMyIHBjID0gcG9zaXRpb24gLSBncmlkX21heC5zdDtcblxuICAgIHBvc2l0aW9uID0gKGdhLnBxIC8gZ2Euc3QpICogbWluKHBhLCBnYS5zdClcbiAgICAgICAgICAgICAgICArIChnYi5wcSAvIGdiLnN0KSAqIGNsYW1wKHBiLCB2ZWMyKDAuMCksIGdiLnN0KVxuICAgICAgICAgICAgICAgICsgKGdjLnBxIC8gZ2Muc3QpICogbWF4KHZlYzIoMC4wKSwgcGMpO1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIHBhcmVudF9zaXplICsgcGFyZW50X29mZnNldDtcbiAgICBwb3NpdGlvbiA9IChhbmNlc3Rvcl9tYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKyB2ZWMyKHVfaGlnaHBbJHtlKzh9XS54LCB1X2hpZ2hwWyR7ZSs4fV0ueSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uIC8gdmVjMih1X2hpZ2hwWzBdLncsIHVfaGlnaHBbMV0udyk7XG59YCkodD81OjApOiJcbnZlYzIgYXBwbHlNYXRyaXgoaW4gdmVjMiB2ZXJ0ZXgpIHtcbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoYV9tYXRyaXgwLCBhX21hdHJpeDEsIGFfbWF0cml4Mik7XG4gICAgcmV0dXJuIChtYXRyaXggKiB2ZWMzKHZlcnRleCwgMS4wKSkueHk7XG59IjtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuJHthfVxuJHtuPyIiOiJsYXlvdXQgKGxvY2F0aW9uID0gMikgaW4gdmVjNCBhX2NvbG9yOyJ9XG4ke3I/IiI6ImxheW91dCAobG9jYXRpb24gPSAzKSBpbiB2ZWMzIGFfbWF0cml4MDtcbmxheW91dCAobG9jYXRpb24gPSA0KSBpbiB2ZWMzIGFfbWF0cml4MTtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWMzIGFfbWF0cml4MjsifVxuXG4ke2U+MT9gdW5pZm9ybSB2ZWM0IHVfaGlnaHBbJHtlfV07YDoiIn1cbiR7c31cbiR7bj8iIjoib3V0IHZlYzQgdl9jb2xvcjsifVxuJHtpfVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHtuPyIiOiJ2X2NvbG9yID0gYV9jb2xvcjsifVxuICAgICR7b31cbiAgICB2ZWMyIHBvcyA9IGFwcGx5TWF0cml4KGFfdmVydGV4KTtcbiAgICBwb3MgPSBwb3MgKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvcy54LCAtcG9zLnksIDAuMCwgMS4wKTtcbn1gfSxrdD1lPT57Y29uc3QgdD0ibSIrKGU/InkiOiJuIik7aWYoT3QuaGFzKHQpKXJldHVybiBPdC5nZXQodCk7Y29uc3Qgbj1uZXcgJHQoU3QoZT85OjAsITEsITAsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzIgdl9iZXppZXI7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBweCA9IGRGZHgodl9iZXppZXIpO1xuICAgIHZlYzIgcHkgPSBkRmR5KHZfYmV6aWVyKTtcblxuICAgIHZlYzIgZiA9ICgyLjAgKiB2X2Jlemllci54KSAqIHZlYzIocHgueCwgcHkueCkgLSB2ZWMyKHB4LnksIHB5LnkpO1xuICAgIGZsb2F0IGFscGhhID0gMC41IC0gKHZfYmV6aWVyLnggKiB2X2Jlemllci54IC0gdl9iZXppZXIueSkgLyBsZW5ndGgoZik7XG5cbiAgICBpZiAoYWxwaGEgPiAwLjApIHtcbiAgICAgICAgb19jb2xvciA9IHZlYzQobWluKGFscGhhLCAxLjApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkaXNjYXJkO1xuICAgIH0gICAgXG59Iik7cmV0dXJuIE90LnNldCh0LG4pLG59LEN0PShlLHQpPT57Y29uc3Qgbj1lLmhpZ2hwO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT0wLG5bNF09dFsyXSxuWzVdPXRbM10sbls2XT0wLG5bOF09dFs0XSxuWzldPXRbNV0sblsxMF09MSxuWzEyXT10WzZdLG5bMTNdPXRbN10sblsxNF09MCxuWzE2XT10WzhdLG5bMTddPXRbOV0sblsxOF09MCxuWzIwXT10WzEwXSxuWzIxXT10WzExXSxuWzIyXT0xLG5bM109eCgpLG5bN109RSgpLG5bMTFdPXRbMTJdLG5bMTVdPXRbMTNdLG5bMTldPXRbMTRdLG5bMjNdPXRbMTVdLG5bMjRdPXRbMTZdLG5bMjVdPXRbMTddLG5bMjZdPXRbMThdLG5bMjddPXRbMTldLG5bMjhdPXRbMjBdLG5bMjldPXRbMjFdLG5bMzBdPXRbMjJdLG5bMzFdPXRbMjNdLG5bMzJdPXRbMjRdLG5bMzNdPXRbMjVdfTtsZXQgUHQ9Im5vcm1hbCI7Y29uc3QgQnQ9ZT0+e1B0PWV9LEl0PSgpPT5QdDtsZXQgTHQ9NjAwO2NvbnN0IFV0PWU9PntMdD1lfSxOdD0oKT0+THQsRHQ9KCk9Pns2MTMhPT1OdCgpJiYoVXQoNjEzKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORV9NSU5VU19TUkNfQUxQSEEpKX0sanQ9KGUsdCxyLGEpPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLER0KCksdnQodCksbi5kcmF3QXJyYXlzKG4uVFJJQU5HTEVTLHIsYSl9LFh0PSgpPT57Y29uc3QgZT0icm1ubiI7aWYoT3QuaGFzKGUpKXJldHVybiBPdC5nZXQoZSk7Y29uc3QgdD1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwb3MgPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLngsIC1wb3MueSwgMC4wLCAxLjApO1xufSIsIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xudm9pZCBtYWluKCkge1xuICAgIG9fY29sb3IgPSB2ZWM0KDEuMCk7XG59Iik7cmV0dXJuIE90LnNldChlLHQpLHR9LHp0PSgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PTE8PGUuY2xpcExldmVsLTE7bi5zdGVuY2lsTWFzayh+dC0xKSxuLnN0ZW5jaWxGdW5jKG4uTEVRVUFMLHQsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5SRVBMQUNFLG4uUkVQTEFDRSksanQoWHQoKSxUdCgpLDAsNiksbi5zdGVuY2lsTWFzaygxPDxlLmNsaXBMZXZlbCksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3Aobi5SRVBMQUNFLG4uUkVQTEFDRSxuLlJFUExBQ0UpLGp0KFh0KCksVHQoKSwwLDYpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpfTtjbGFzcyBWdHtjb25zdHJ1Y3RvcihlLHQsbixyLGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbmRleCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ4Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInkiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImxlZnQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmlnaHQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywidXNlZCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLHRoaXMuaW5kZXg9ZSx0aGlzLng9dCx0aGlzLnk9bix0aGlzLnc9cix0aGlzLmg9YSx0aGlzLmxlZnQ9bnVsbCx0aGlzLnJpZ2h0PW51bGwsdGhpcy51c2VkPSExfWluc2VydChlLHQpe3JldHVybigoZSx0LG4pPT57aWYoZS51c2VkKXtjb25zdCByPWUubGVmdD8uaW5zZXJ0KHQsbik7cmV0dXJuIHJ8fGUucmlnaHQ/Lmluc2VydCh0LG4pfHxudWxsfWlmKHQ+ZS53fHxuPmUuaClyZXR1cm4gbnVsbDtpZih0PT09ZS53JiZuPT09ZS5oKXJldHVybiBlLnVzZWQ9ITAsZTtjb25zdCByPWUudy10LGE9ZS5oLW47cmV0dXJuIHI+YT8oZS5sZWZ0PW5ldyBWdChlLmluZGV4LGUueCxlLnksdCxuKSxlLnJpZ2h0PW5ldyBWdChlLmluZGV4LGUueCt0KzEsZS55LHItMSxlLmgpKTooZS5sZWZ0PW5ldyBWdChlLmluZGV4LGUueCxlLnksZS53LG4pLGUucmlnaHQ9bmV3IFZ0KGUuaW5kZXgsZS54LGUueStuKzEsZS53LGEtMSkpLGUudXNlZD0hMCxlLmxlZnQuaW5zZXJ0KHQsbil9KSh0aGlzLGUsdCl9ZGlzcG9zZShlLHQsbixyKXtyZXR1cm4oKGUsdCxuLHIsYSk9PmUubGVmdD8uZGlzcG9zZSh0LG4scixhKT8oZS5sZWZ0LnVzZWR8fGUucmlnaHQ/LnVzZWR8fChlLmxlZnQ9ZS5yaWdodD1udWxsLGUudXNlZD0hMSksITApOmUucmlnaHQ/LmRpc3Bvc2UodCxuLHIsYSk/KGUucmlnaHQudXNlZHx8ZS5sZWZ0Py51c2VkfHwoZS5sZWZ0PWUucmlnaHQ9bnVsbCxlLnVzZWQ9ITEpLCEwKTp0PT09ZS54JiZuPT09ZS55JiZyPT09ZS53JiZhPT09ZS5oJiYoZS51c2VkPSExLCEwKSkodGhpcyxlLHQsbixyKX19Y2xhc3MgV3R7Y29uc3RydWN0b3IoZSx0LG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHJvb3QiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLl8kcm9vdD1uZXcgVnQoZSwwLDAsdCxuKX1pbnNlcnQoZSx0KXtyZXR1cm4gdGhpcy5fJHJvb3QuaW5zZXJ0KGUsdCl9ZGlzcG9zZShlLHQsbixyKXtyZXR1cm4gdGhpcy5fJHJvb3QuZGlzcG9zZShlLHQsbixyKX19Y29uc3QgR3Q9KHQsbik9Pntjb25zdCByPUooKTtuZVtyXXx8KG5lW3JdPW5ldyBXdChyLGUsZSkpO2NvbnN0IGE9bmVbcl0uaW5zZXJ0KHQsbik7cmV0dXJuIGF8fChRKHIrMSksR3QodCxuKSl9LFl0PWU9PmBcbiAgICB2ZWM0IG11bCA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IGFkZCA9IHVfbWVkaXVtcFske2UrMX1dO1xuXG4gICAgc3JjLnJnYiAvPSBtYXgoMC4wMDAxLCBzcmMuYSk7XG4gICAgc3JjID0gY2xhbXAoc3JjICogbXVsICsgYWRkLCAwLjAsIDEuMCk7XG4gICAgc3JjLnJnYiAqPSBzcmMuYTtgLHF0PWU9PmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG4ke2U/InVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMl07IjoiIn1cblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuICAgICR7ZT9ZdCgwKToiIn1cbiAgICBvX2NvbG9yID0gc3JjO1xufWA7Y29uc3QgS3Q9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJvZmZzZXQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQzMkFycmF5KDI1NiksdGhpcy5vZmZzZXQ9MH1wdXNoKC4uLmUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuYnVmZmVyW3RoaXMub2Zmc2V0KytdPWVbdF19c2V0KGUpe3RoaXMuYnVmZmVyLmxlbmd0aDx0aGlzLm9mZnNldCtlLmxlbmd0aCYmdGhpcy5yZXNpemUoZS5sZW5ndGgpLHRoaXMuYnVmZmVyLnNldChlLHRoaXMub2Zmc2V0KSx0aGlzLm9mZnNldCs9ZS5sZW5ndGh9cmVzaXplKGUpe2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheSgobj10aGlzLm9mZnNldCtlLG4tLSxufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LCsrbikpO3ZhciBuO3RoaXMuYnVmZmVyLmxlbmd0aCYmdC5zZXQodGhpcy5idWZmZXIpLHRoaXMuYnVmZmVyPXR9fTtjbGFzcyBIdCBleHRlbmRzICR0e2NvbnN0cnVjdG9yKGUsdCxuPSEwKXtzdXBlcihlLHQsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImNvdW50Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5jb3VudD0wfWNsZWFyKCl7dGhpcy5jb3VudD1LdC5vZmZzZXQ9MH19Y29uc3QgWnQ9bmV3IE1hcCxRdD0oKT0+e2lmKFp0LmhhcygiaSIpKXJldHVybiBadC5nZXQoImkiKTtjb25zdCBlPW5ldyBIdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xubGF5b3V0IChsb2NhdGlvbiA9IDEpIGluIHZlYzQgYV9yZWN0O1xubGF5b3V0IChsb2NhdGlvbiA9IDIpIGluIHZlYzQgYV9zaXplO1xubGF5b3V0IChsb2NhdGlvbiA9IDMpIGluIHZlYzIgYV9vZmZzZXQ7XG5sYXlvdXQgKGxvY2F0aW9uID0gNCkgaW4gdmVjNCBhX21hdHJpeDtcbmxheW91dCAobG9jYXRpb24gPSA1KSBpbiB2ZWM0IGFfbXVsO1xubGF5b3V0IChsb2NhdGlvbiA9IDYpIGluIHZlYzQgYV9hZGQ7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCB2X211bDtcbm91dCB2ZWM0IHZfYWRkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4ICogYV9yZWN0Lnp3ICsgYV9yZWN0Lnh5O1xuICAgIHZfbXVsID0gYV9tdWw7XG4gICAgdl9hZGQgPSBhX2FkZDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSB2ZWMyKGFfdmVydGV4LngsIDEuMCAtIGFfdmVydGV4LnkpO1xuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiBhX3NpemUueHk7XG5cbiAgICBtYXQzIG1hdHJpeCA9IG1hdDMoXG4gICAgICAgIGFfbWF0cml4LngsIGFfbWF0cml4LnksIDAuMCxcbiAgICAgICAgYV9tYXRyaXgueiwgYV9tYXRyaXgudywgMC4wLFxuICAgICAgICBhX29mZnNldC54LCBhX29mZnNldC55LCAxLjBcbiAgICApO1xuXG4gICAgcG9zaXRpb24gPSAobWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMS4wKSkueHk7XG4gICAgcG9zaXRpb24gLz0gYV9zaXplLnp3O1xuXG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueCwgLXBvc2l0aW9uLnksIDAuMCwgMS4wKTtcbn0iLCIjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG5cbmluIHZlYzQgdl9tdWw7XG5pbiB2ZWM0IHZfYWRkO1xuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuXG4gICAgaWYgKHZfbXVsLnggIT0gMS4wIHx8IHZfbXVsLnkgIT0gMS4wIHx8IHZfbXVsLnogIT0gMS4wIHx8IHZfbXVsLncgIT0gMS4wXG4gICAgICAgIHx8IHZfYWRkLnggIT0gMC4wIHx8IHZfYWRkLnkgIT0gMC4wIHx8IHZfYWRkLnogIT0gMC4wIHx8IHZfYWRkLncgIT0gMC4wXG4gICAgKSB7XG4gICAgICAgIHNyYy5yZ2IgLz0gbWF4KDAuMDAwMSwgc3JjLmEpO1xuICAgICAgICBzcmMgPSBjbGFtcChzcmMgKiB2X211bCArIHZfYWRkLCAwLjAsIDEuMCk7XG4gICAgICAgIHNyYy5yZ2IgKj0gc3JjLmE7XG4gICAgfVxuICAgIFxuICAgIG9fY29sb3IgPSBzcmM7XG59Iik7cmV0dXJuIFp0LnNldCgiaSIsZSksZX0sSnQ9KGUsdCk9Pntjb25zdCBuPWBpJHtlfXlgO2lmKFp0LmhhcyhuKSlyZXR1cm4gWnQuZ2V0KG4pO2NvbnN0IHI9bmV3ICR0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwoZT0+e2xldCB0O3N3aXRjaChlKXtjYXNlInN1YnRyYWN0Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KGRzdC5yZ2IgLSBzcmMucmdiLCBzcmMuYSAqIGRzdC5hKTtcbiAgICBjLnJnYiAqPSBjLmE7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJtdWx0aXBseSI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcbiAgICB2ZWM0IGMgPSBzcmMgKiBkc3Q7XG5cbiAgICByZXR1cm4gYSArIGIgKyBjO1xufSI7YnJlYWs7Y2FzZSJsaWdodGVuIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChzcmMucmdiLCBkc3QucmdiLCBzdGVwKHNyYy5yZ2IsIGRzdC5yZ2IpKSwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiZGFya2VuIjp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBhID0gc3JjIC0gc3JjICogZHN0LmE7XG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG5cbiAgICBzcmMucmdiIC89IHNyYy5hO1xuICAgIGRzdC5yZ2IgLz0gZHN0LmE7XG5cbiAgICB2ZWM0IGMgPSB2ZWM0KG1peChzcmMucmdiLCBkc3QucmdiLCBzdGVwKGRzdC5yZ2IsIHNyYy5yZ2IpKSwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2Uib3ZlcmxheSI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBtdWwgPSBzcmMgKiBkc3Q7XG4gICAgdmVjMyBjMSA9IDIuMCAqIG11bC5yZ2I7XG4gICAgdmVjMyBjMiA9IDIuMCAqIChzcmMucmdiICsgZHN0LnJnYiAtIG11bC5yZ2IpIC0gMS4wO1xuICAgIHZlYzQgYyA9IHZlYzQobWl4KGMxLCBjMiwgc3RlcCh2ZWMzKDAuNSksIGRzdC5yZ2IpKSwgbXVsLmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImhhcmRsaWdodCI6dD0iXG52ZWM0IGJsZW5kIChpbiB2ZWM0IHNyYywgaW4gdmVjNCBkc3QpIHtcbiAgICBpZiAoc3JjLmEgPT0gMC4wKSB7IHJldHVybiBkc3Q7IH1cbiAgICBpZiAoZHN0LmEgPT0gMC4wKSB7IHJldHVybiBzcmM7IH1cblxuICAgIHZlYzQgYSA9IHNyYyAtIHNyYyAqIGRzdC5hO1xuICAgIHZlYzQgYiA9IGRzdCAtIGRzdCAqIHNyYy5hO1xuXG4gICAgc3JjLnJnYiAvPSBzcmMuYTtcbiAgICBkc3QucmdiIC89IGRzdC5hO1xuXG4gICAgdmVjNCBtdWwgPSBzcmMgKiBkc3Q7XG4gICAgdmVjMyBjMSA9IDIuMCAqIG11bC5yZ2I7XG4gICAgdmVjMyBjMiA9IDIuMCAqIChzcmMucmdiICsgZHN0LnJnYiAtIG11bC5yZ2IpIC0gMS4wO1xuICAgIHZlYzQgYyA9IHZlYzQobWl4KGMxLCBjMiwgc3RlcCh2ZWMzKDAuNSksIHNyYy5yZ2IpKSwgbXVsLmEpO1xuICAgIGMucmdiICo9IGMuYTtcblxuICAgIHJldHVybiBhICsgYiArIGM7XG59IjticmVhaztjYXNlImRpZmZlcmVuY2UiOnQ9IlxudmVjNCBibGVuZCAoaW4gdmVjNCBzcmMsIGluIHZlYzQgZHN0KSB7XG4gICAgaWYgKHNyYy5hID09IDAuMCkgeyByZXR1cm4gZHN0OyB9XG4gICAgaWYgKGRzdC5hID09IDAuMCkgeyByZXR1cm4gc3JjOyB9XG5cbiAgICB2ZWM0IGEgPSBzcmMgLSBzcmMgKiBkc3QuYTtcbiAgICB2ZWM0IGIgPSBkc3QgLSBkc3QgKiBzcmMuYTtcblxuICAgIHNyYy5yZ2IgLz0gc3JjLmE7XG4gICAgZHN0LnJnYiAvPSBkc3QuYTtcblxuICAgIHZlYzQgYyA9IHZlYzQoYWJzKHNyYy5yZ2IgLSBkc3QucmdiKSwgc3JjLmEgKiBkc3QuYSk7XG4gICAgYy5yZ2IgKj0gYy5hO1xuXG4gICAgcmV0dXJuIGEgKyBiICsgYztcbn0iO2JyZWFrO2Nhc2UiaW52ZXJ0Ijp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIGlmIChzcmMuYSA9PSAwLjApIHsgcmV0dXJuIGRzdDsgfVxuICAgIGlmIChkc3QuYSA9PSAwLjApIHsgcmV0dXJuIHNyYzsgfVxuXG4gICAgdmVjNCBiID0gZHN0IC0gZHN0ICogc3JjLmE7XG4gICAgdmVjNCBjID0gdmVjNChzcmMuYSAtIGRzdC5yZ2IgKiBzcmMuYSwgc3JjLmEpO1xuXG4gICAgcmV0dXJuIGIgKyBjO1xufSI7YnJlYWs7ZGVmYXVsdDp0PSJcbnZlYzQgYmxlbmQgKGluIHZlYzQgc3JjLCBpbiB2ZWM0IGRzdCkge1xuICAgIHJldHVybiBzcmMgKyBkc3QgLSBkc3QgKiBzcmMuYTtcbn0ifXJldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmVzWzJdO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsyXTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxuJHt0fVxuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjNCBkc3QgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmVzWzFdLCB2X2Nvb3JkKTtcbiAgICAke1l0KDApfVxuICAgIG9fY29sb3IgPSBibGVuZChzcmMsIGRzdCk7XG59YH0pKGUpKTtyZXR1cm4gWnQuc2V0KG4scikscn07bGV0IGVuPTA7Y29uc3QgdG49KCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsdD1yLmF0bGFzQXR0YWNobWVudE9iamVjdDtpZihyLmJpbmQodCksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLG1lKSx4ZSghMSksZW49PT1KKCkpe2NvbnN0IGU9b2UoSigpKTtlWzJdIT09LU51bWJlci5NQVhfVkFMVUUmJmVbM10hPT0tTnVtYmVyLk1BWF9WQUxVRSYmKG4uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZVswXSxlWzFdLGVbMl0sZVszXSksbi5ibGl0RnJhbWVidWZmZXIoMCwwLHQud2lkdGgsdC5oZWlnaHQsMCwwLHQud2lkdGgsdC5oZWlnaHQsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSl9ZWxzZXtjb25zdCBlPWNlKEooKSk7bi5lbmFibGUobi5TQ0lTU09SX1RFU1QpLG4uc2Npc3NvcihlWzBdLGVbMV0sZVsyXSxlWzNdKSxuLmJsaXRGcmFtZWJ1ZmZlcigwLDAsdC53aWR0aCx0LmhlaWdodCwwLDAsdC53aWR0aCx0LmhlaWdodCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLGVuPUooKX1lJiZyLmJpbmQoZSl9LG5uPWU9Pntjb25zdCB0PUooKTtRKGUuaW5kZXgpLHRuKCk7Y29uc3Qgcj1BZTtuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLHIpO2NvbnN0IGE9YWUoKTtuLmZyYW1lYnVmZmVyVGV4dHVyZTJEKG4uRlJBTUVCVUZGRVIsbi5DT0xPUl9BVFRBQ0hNRU5UMCxuLlRFWFRVUkVfMkQsYS5yZXNvdXJjZSwwKTtjb25zdCBzPU1lKCk7bi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixzKTtjb25zdCBvPUsoZS53LGUuaCk7cmV0dXJuIG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxvLnJlc291cmNlLDApLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsbnVsbCksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLHIpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUixzKSxuLmJsaXRGcmFtZWJ1ZmZlcihlLngsZS55LGUueCtlLncsZS55K2UuaCwwLDAsZS53LGUuaCxuLkNPTE9SX0JVRkZFUl9CSVQsbi5ORUFSRVNUKSxRKHQpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixkZSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixkZSksb30scm49KGUsdCxyPSExKT0+e09lKDIsbi5URVhUVVJFMixudWxsLHIpLE9lKDEsbi5URVhUVVJFMSx0LHIpLE9lKDAsbi5URVhUVVJFMCxlLHIpfSxhbj0oKT0+e2lmKFp0LmhhcygicCIpKXJldHVybiBadC5nZXQoInAiKTtjb25zdCBlPW5ldyAkdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xudW5pZm9ybSB2ZWM0IHVfaGlnaHBbMl07XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIG9mZnNldCAgID0gdV9oaWdocFswXS54eTtcbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFswXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzFdLngsIHVfaGlnaHBbMV0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZSArIG9mZnNldDtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixxdCghMSkpO3JldHVybiBadC5zZXQoInAiLGUpLGV9LHNuPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAscz1yLiRtYXRyaXg7YVswXT1zWzZdLGFbMV09c1s3XSxhWzJdPXQsYVszXT1uLGFbNF09eCgpLGFbNV09RSgpfSxvbj1lPT57ZS51c2VQcm9ncmFtKCksZS5iaW5kVW5pZm9ybSgpLHZ0KFR0KCkpLG4uZHJhd0FycmF5cyhuLlRSSUFOR0xFUywwLDYpfTtsZXQgY249bnVsbDtjb25zdCBsbj0oZSx0LGEscyk9Pntjb25zdCBvPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsaT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoaSk7Y29uc3QgYz1NZSgpO3JldHVybiBuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGMpLGNuJiZjbi53aWR0aD09PWkud2lkdGgmJmNuLmhlaWdodD09PWkuaGVpZ2h0fHwoY249SyhpLndpZHRoLGkuaGVpZ2h0KSksU2UoY24pLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxjbi5yZXNvdXJjZSwwKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKG4uUkVBRF9GUkFNRUJVRkZFUixkZSksbi5iaW5kRnJhbWVidWZmZXIobi5EUkFXX0ZSQU1FQlVGRkVSLGMpLG4uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSxpLmhlaWdodC10LXMsYSsxLHMrMSksbi5ibGl0RnJhbWVidWZmZXIoMCwwLGkud2lkdGgsaS5oZWlnaHQsMCwwLGkud2lkdGgsaS5oZWlnaHQsbi5DT0xPUl9CVUZGRVJfQklULG4uTkVBUkVTVCksbi5kaXNhYmxlKG4uU0NJU1NPUl9URVNUKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkZSQU1FQlVGRkVSLGRlKSxvJiZyLmJpbmQobyksY259LHVuPShlLHQsbixhKT0+e2NvbnN0IHM9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxvPWxuKGUsdCxuLGEpLGk9SChuLGEsITEpO3IuYmluZChpKSxyLnNhdmUoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLC1lLC10KTtjb25zdCBjPWFuKCk7c24oYyxvLndpZHRoLG8uaGVpZ2h0KSxEdCgpLFNlKG8pLG9uKGMpO2NvbnN0IGw9aS50ZXh0dXJlO3JldHVybiByLnJlc3RvcmUoKSx3ZShpLCExKSxzJiZyLmJpbmQocyksbH0saG49KCk9Pns2MTAhPT1OdCgpJiYoVXQoNjEwKSxuLmJsZW5kRnVuYyhuLk9ORSxuLlpFUk8pKX0sYm49ZT0+e1NlKGUpLGhuKCk7Y29uc3QgdD1hbigpO3NuKHQsZS53aWR0aCxlLmhlaWdodCksb24odCksRHQoKX0sZG49KGUsdCxuLHIsYSxzLG8saSxjKT0+e2NvbnN0IGw9ZS50ZXh0dXJlcztsWzBdPTAsbFsxXT0xO2NvbnN0IHU9ZS5tZWRpdW1wO3VbMF09dCx1WzFdPW4sdVsyXT1yLHVbM109YSx1WzRdPXMsdVs1XT1vLHVbNl09aSx1WzddPWN9LGZuPShlPSExKT0+e2NvbnN0IHQ9Im0iKyhlPyJ5IjoibiIpO2lmKFp0Lmhhcyh0KSlyZXR1cm4gWnQuZ2V0KHQpO2NvbnN0IG49bmV3ICR0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG51bmlmb3JtIHZlYzQgdV9oaWdocFszXTtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIG1hdDMgbWF0cml4ID0gbWF0MyhcbiAgICAgICAgdV9oaWdocFswXS54LCB1X2hpZ2hwWzBdLnksIDAuMCxcbiAgICAgICAgdV9oaWdocFswXS56LCB1X2hpZ2hwWzBdLncsIDAuMCxcbiAgICAgICAgdV9oaWdocFsxXS54LCB1X2hpZ2hwWzFdLnksIDEuMFxuICAgICk7XG5cbiAgICB2ZWMyIHNpemUgICAgID0gdV9oaWdocFsxXS56dztcbiAgICB2ZWMyIHZpZXdwb3J0ID0gdmVjMih1X2hpZ2hwWzJdLngsIHVfaGlnaHBbMl0ueSk7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gdmVjMihhX3ZlcnRleC54LCAxLjAgLSBhX3ZlcnRleC55KTtcbiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uICogc2l6ZTtcbiAgICBwb3NpdGlvbiA9IChtYXRyaXggKiB2ZWMzKHBvc2l0aW9uLCAxLjApKS54eTtcbiAgICBwb3NpdGlvbiAvPSB2aWV3cG9ydDtcblxuICAgIHBvc2l0aW9uID0gcG9zaXRpb24gKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLngsIC1wb3NpdGlvbi55LCAwLjAsIDEuMCk7XG59IixxdChlKSk7cmV0dXJuIFp0LnNldCh0LG4pLG59LG1uPShlLHQsbik9Pntjb25zdCBhPWUuaGlnaHAscz1yLiRtYXRyaXg7YVswXT1zWzBdLGFbMV09c1sxXSxhWzJdPXNbM10sYVszXT1zWzRdLGFbNF09c1s2XSxhWzVdPXNbN10sYVs2XT10LGFbN109bixhWzhdPXgoKSxhWzldPUUoKX07bGV0IHZuPTA7Y29uc3QgX249ZT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSx2dChBdCksbi5iaW5kQnVmZmVyKG4uQVJSQVlfQlVGRkVSLEV0KSxLdC5idWZmZXIubGVuZ3RoPnZuJiYodm49S3QuYnVmZmVyLmxlbmd0aCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIsNCp2bixuLkRZTkFNSUNfRFJBVykpLG4uYnVmZmVyU3ViRGF0YShuLkFSUkFZX0JVRkZFUiwwLEt0LmJ1ZmZlci5zdWJhcnJheSgwLEt0Lm9mZnNldCkpLG4uZHJhd0FycmF5c0luc3RhbmNlZChuLlRSSUFOR0xFUywwLDYsZS5jb3VudCl9LHBuPSgpPT57NjAzIT09TnQoKSYmKFV0KDYwMyksbi5ibGVuZEZ1bmMobi5aRVJPLG4uT05FX01JTlVTX1NSQ19BTFBIQSkpfSxnbj1lPT57c3dpdGNoKGUpe2Nhc2UiYWRkIjo2MTEhPT1OdCgpJiYoVXQoNjExKSxuLmJsZW5kRnVuYyhuLk9ORSxuLk9ORSkpO2JyZWFrO2Nhc2Uic2NyZWVuIjo2NDEhPT1OdCgpJiYoVXQoNjQxKSxuLmJsZW5kRnVuYyhuLk9ORV9NSU5VU19EU1RfQ09MT1Isbi5PTkUpKTticmVhaztjYXNlImFscGhhIjo2MDYhPT1OdCgpJiYoVXQoNjA2KSxuLmJsZW5kRnVuYyhuLlpFUk8sbi5TUkNfQUxQSEEpKTticmVhaztjYXNlImVyYXNlIjpwbigpO2JyZWFrO2Nhc2UiY29weSI6aG4oKTticmVhaztkZWZhdWx0OkR0KCl9fSx4bj1lPT57dmFyIHQ7KGU9PntFdD1lLmNyZWF0ZUJ1ZmZlcigpfSkoZSksdD0oKCk9Pntjb25zdCBlPWZ0KCk7cmV0dXJuIHZ0KGUpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixlLnZlcnRleEJ1ZmZlciksbi5idWZmZXJEYXRhKG4uQVJSQVlfQlVGRkVSLG5ldyBGbG9hdDMyQXJyYXkoWzAsMCwxLDAsMCwxLDEsMSwwLDEsMSwwXSksbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxuLmJpbmRCdWZmZXIobi5BUlJBWV9CVUZGRVIsRXQpLG4uYnVmZmVyRGF0YShuLkFSUkFZX0JVRkZFUixLdC5idWZmZXIubGVuZ3RoLG4uRFlOQU1JQ19EUkFXKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDEpLG4udmVydGV4QXR0cmliUG9pbnRlcigxLDQsbi5GTE9BVCwhMSw4OCwwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoMSwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDIpLG4udmVydGV4QXR0cmliUG9pbnRlcigyLDQsbi5GTE9BVCwhMSw4OCwxNiksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDIsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgzKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMywyLG4uRkxPQVQsITEsODgsMzIpLG4udmVydGV4QXR0cmliRGl2aXNvcigzLDEpLG4uZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoNCksbi52ZXJ0ZXhBdHRyaWJQb2ludGVyKDQsNCxuLkZMT0FULCExLDg4LDQwKSxuLnZlcnRleEF0dHJpYkRpdmlzb3IoNCwxKSxuLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KDUpLG4udmVydGV4QXR0cmliUG9pbnRlcig1LDQsbi5GTE9BVCwhMSw4OCw1Niksbi52ZXJ0ZXhBdHRyaWJEaXZpc29yKDUsMSksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSg2KSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoNiw0LG4uRkxPQVQsITEsODgsNzIpLG4udmVydGV4QXR0cmliRGl2aXNvcig2LDEpLGV9KSgpLEF0PXR9LEVuPShlLHQscixhPSExKT0+e2NvbnN0IHM9SyhlLHQsYSk7cmV0dXJuIG4udGV4U3ViSW1hZ2UyRChuLlRFWFRVUkVfMkQsMCwwLDAsZSx0LG4uUkdCQSxuLlVOU0lHTkVEX0JZVEUsciksc30sQW49KGUsdCk9Pntjb25zdCByPSgoZSx0LHIsYT0hMSk9Pntjb25zdCBzPUsoZSx0LGEpO3JldHVybiBuLnRleFN1YkltYWdlMkQobi5URVhUVVJFXzJELDAsMCwwLG4uUkdCQSxuLlVOU0lHTkVEX0JZVEUsciksc30pKGUudyxlLmgsdCksYT1hbigpO3NuKGEsZS53LGUuaCksRHQoKSxvbihhKSxVKHIpfSx5bj1bXSxUbj1uZXcgTWFwLFJuPShlLHQsbik9PntTZShlLCEwKTtjb25zdCByPU1hdGguY2VpbCguNSpuKSxhPTEtKHItLjUqbikscz0xK24sbz0oZT0+e2NvbnN0IHQ9YGIke2V9YDtpZihUbi5oYXModCkpcmV0dXJuIFRuLmdldCh0KTtjb25zdCBuPW5ldyAkdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKGU9Pntjb25zdCB0PWUudG9GaXhlZCgxKTtyZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcDtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgIG9mZnNldCAgID0gdV9tZWRpdW1wLnh5O1xuICAgIGZsb2F0IGZyYWN0aW9uID0gdV9tZWRpdW1wLno7XG4gICAgZmxvYXQgc2FtcGxlcyAgPSB1X21lZGl1bXAudztcbiAgICBcbiAgICB2ZWM0IGNvbG9yID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpO1xuXG4gICAgZm9yIChmbG9hdCBpID0gMS4wOyBpIDwgJHt0fTsgaSArPSAxLjApIHtcbiAgICAgICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgKyBvZmZzZXQgKiBpKTtcbiAgICAgICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgLSBvZmZzZXQgKiBpKTtcbiAgICB9XG4gICAgY29sb3IgKz0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQgKyBvZmZzZXQgKiAke3R9KSAqIGZyYWN0aW9uO1xuICAgIGNvbG9yICs9IHRleHR1cmUodV90ZXh0dXJlLCB2X2Nvb3JkIC0gb2Zmc2V0ICogJHt0fSkgKiBmcmFjdGlvbjtcbiAgICBjb2xvciAvPSBzYW1wbGVzO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufWB9KShlKSk7cmV0dXJuIFRuLnNldCh0LG4pLG59KShyKTsoKGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89ZS5tZWRpdW1wO3I/KG9bMF09MS90LG9bMV09MCk6KG9bMF09MCxvWzFdPTEvbiksb1syXT1hLG9bM109c30pKG8sZS53aWR0aCxlLmhlaWdodCx0LGEscyksb24obyl9LE1uPXt4OjAseTowfSx3bj0oZSx0LG4pPT4oZT4+MTYpKihuP3Q6MSkvMjU1LEZuPShlLHQsbik9PihlPj44JjI1NSkqKG4/dDoxKS8yNTUsJG49KGUsdCxuKT0+KDI1NSZlKSoobj90OjEpLzI1NSxPbj1bLjUsMS4wNSwxLjQsMS41NSwxLjc1LDEuOSwyLDIuMTUsMi4yLDIuMywyLjUsMywzLDMuNSwzLjVdLFNuPShlLHQsbj00LGE9NCxzPTEsbz0hMCk9Pntjb25zdCBpPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksbD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksdT15KCksaD1uKihjL3UpLGI9YSoobC91KSxkPU9uW3MtMV0sZj1NYXRoLnJvdW5kKGgqZCksbT1NYXRoLnJvdW5kKGIqZCk7TW4ueCs9ZixNbi55Kz1tO2NvbnN0IHY9ZS53aWR0aCsyKmYsXz1lLmhlaWdodCsyKm07bGV0IHA9MSxnPTE7aD4xMjg/cD0uMDYyNTpoPjY0P3A9LjEyNTpoPjMyP3A9LjI1Omg+MTYmJihwPS41KSxiPjEyOD9nPS4wNjI1OmI+NjQ/Zz0uMTI1OmI+MzI/Zz0uMjU6Yj4xNiYmKGc9LjUpO2NvbnN0IHg9TWF0aC5jZWlsKHYqcCksRT1NYXRoLmNlaWwoXypnKSxBPUgoeCxFLCExKSxUPVtBLEgoeCxFLCExKV07ci5iaW5kKEEpLHIucmVzZXQoKSxyLnNldFRyYW5zZm9ybShwLDAsMCxnLGYqcCxtKmcpLFNlKGUpO2NvbnN0IFI9Zm4oKTttbihSLGUud2lkdGgsZS5oZWlnaHQpLG9uKFIpLG8mJlUoZSk7Y29uc3QgTT1oKnAsdz1iKmc7bGV0IEY9MCwkPUEudGV4dHVyZTtTZSgkLCEwKSxobigpO2ZvcihsZXQgZT0wO2U8czsrK2Upe2lmKG4+MCl7Rj0oRisxKSUyO2NvbnN0IGU9VFtGXTtyLmJpbmQoZSksUm4oJCwhMCxNKSwkPWUudGV4dHVyZX1pZihhPjApe0Y9KEYrMSklMjtjb25zdCBlPVRbRl07ci5iaW5kKGUpLFJuKCQsITEsdyksJD1lLnRleHR1cmV9fWlmKER0KCksMSE9PXB8fDEhPT1nKXtjb25zdCBlPUgodixfLCExKTtyLmJpbmQoZSksci5zZXRUcmFuc2Zvcm0oMS9wLDAsMCwxL2csMCwwKSxTZSgkLCEwKSxtbihSLCQud2lkdGgsJC5oZWlnaHQpLG9uKFIpLCQ9ZS50ZXh0dXJlLHdlKFRbMF0pLHdlKFRbMV0pLHdlKGUsITEpfWVsc2UgRj0oRisxKSUyLHdlKFRbRl0pLEY9KEYrMSklMix3ZShUW0ZdLCExKTtyZXR1cm4gaSYmci5iaW5kKGkpLCR9LGtuPShlLHQpPT57Y29uc3Qgbj1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LGE9SChlLndpZHRoLGUuaGVpZ2h0LCExKTtyLmJpbmQoYSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlKSxEdCgpO2NvbnN0IHM9KCgpPT57aWYoVG4uaGFzKCJtIikpcmV0dXJuIFRuLmdldCgibSIpO2NvbnN0IGU9bmV3ICR0KCIjdmVyc2lvbiAzMDAgZXNcblxubGF5b3V0IChsb2NhdGlvbiA9IDApIGluIHZlYzIgYV92ZXJ0ZXg7XG5cbm91dCB2ZWMyIHZfY29vcmQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2X2Nvb3JkID0gYV92ZXJ0ZXg7XG5cbiAgICB2ZWMyIHBvc2l0aW9uID0gYV92ZXJ0ZXggKiAyLjAgLSAxLjA7XG4gICAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7XG59IiwiI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFs1XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIG1hdDQgbXVsID0gbWF0NCh1X21lZGl1bXBbMF0sIHVfbWVkaXVtcFsxXSwgdV9tZWRpdW1wWzJdLCB1X21lZGl1bXBbM10pO1xuICAgIHZlYzQgYWRkID0gdV9tZWRpdW1wWzRdO1xuICAgIFxuICAgIHZlYzQgY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZSwgdl9jb29yZCk7XG5cbiAgICBjb2xvci5yZ2IgLz0gbWF4KDAuMDAwMSwgY29sb3IuYSk7XG4gICAgY29sb3IgPSBjbGFtcChjb2xvciAqIG11bCArIGFkZCwgMC4wLCAxLjApO1xuICAgIGNvbG9yLnJnYiAqPSBjb2xvci5hO1xuXG4gICAgb19jb2xvciA9IGNvbG9yO1xufSIpO3JldHVybiBUbi5zZXQoIm0iLGUpLGV9KSgpOygoZSx0KT0+e2NvbnN0IG49ZS5tZWRpdW1wO25bMF09dFswXSxuWzFdPXRbMV0sblsyXT10WzJdLG5bM109dFszXSxuWzRdPXRbNV0sbls1XT10WzZdLG5bNl09dFs3XSxuWzddPXRbOF0sbls4XT10WzEwXSxuWzldPXRbMTFdLG5bMTBdPXRbMTJdLG5bMTFdPXRbMTNdLG5bMTJdPXRbMTVdLG5bMTNdPXRbMTZdLG5bMTRdPXRbMTddLG5bMTVdPXRbMThdLG5bMTZdPXRbNF0vMjU1LG5bMTddPXRbOV0vMjU1LG5bMThdPXRbMTRdLzI1NSxuWzE5XT10WzE5XS8yNTV9KShzLHQpLG9uKHMpO2NvbnN0IG89YS50ZXh0dXJlO3JldHVybiBVKGUpLHdlKGEsITEpLG4mJnIuYmluZChuKSxvfSxDbj0oZSx0LG4scixhLHMpPT57Y29uc3Qgbz1lPyJibHVyLmEgPSAxLjAgLSBibHVyLmE7IjoiIixpPW4/KGM9cyxgXG4gICAgZmxvYXQgc3RyZW5ndGggPSB1X21lZGl1bXBbJHtNYXRoLmZsb29yKGMvNCl9XVske2MlNH1dO1xuICAgIGJsdXIuYSA9IGNsYW1wKGJsdXIuYSAqIHN0cmVuZ3RoLCAwLjAsIDEuMCk7XG5gKToiIjt2YXIgYztjb25zdCBsPXI/KGU9PmBcbiAgICBibHVyID0gdGV4dHVyZSh1X3RleHR1cmVzWyR7ZT8yOjF9XSwgdmVjMihibHVyLmEsIDAuNSkpO1xuYCkodCk6KGU9PmBcbiAgICB2ZWM0IGNvbG9yID0gdV9tZWRpdW1wWyR7ZX1dO1xuICAgIGJsdXIgPSBjb2xvciAqIGJsdXIuYTtcbmApKGEpO3JldHVybmBcbiAgICAke299XG4gICAgJHtpfVxuICAgICR7bH1cbmB9LFBuPShlLHQsbixyLGEscyk9Pntjb25zdCBvPXQ/IlxuICAgIHZlYzIgcHEgPSAoMS4wIC0gdl9jb29yZCkgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyMiA9IG1peCh2ZWM0KDAuMCksIHRleHR1cmUodV90ZXh0dXJlc1swXSwgcHEpLCBpc0luc2lkZShwcSkpO1xuIjoiXG4gICAgdmVjNCBibHVyMiA9IHRleHR1cmUodV90ZXh0dXJlc1swXSwgMS4wIC0gdl9jb29yZCk7XG4iLGk9bj8oYz1zLGBcbiAgICBmbG9hdCBzdHJlbmd0aCA9IHVfbWVkaXVtcFske01hdGguZmxvb3IoYy80KX1dWyR7YyU0fV07XG4gICAgaGlnaGxpZ2h0X2FscGhhICo9IHN0cmVuZ3RoO1xuICAgIHNoYWRvd19hbHBoYSAgICAqPSBzdHJlbmd0aDtcbmApOiIiO3ZhciBjO2NvbnN0IGw9cj8oZT0+YFxuICAgIGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbJHtlPzI6MX1dLCB2ZWMyKFxuICAgICAgICAwLjUwMTk2MDc4NDMxMzcyNTUgLSAwLjUwMTk2MDc4NDMxMzcyNTUgKiBzaGFkb3dfYWxwaGEgKyAwLjQ5ODAzOTIxNTY4NjI3NDUgKiBoaWdobGlnaHRfYWxwaGEsXG4gICAgICAgIDAuNVxuICAgICkpO1xuYCkoZSk6KGU9PmBcbiAgICB2ZWM0IGhpZ2hsaWdodF9jb2xvciA9IHVfbWVkaXVtcFske2V9XTtcbiAgICB2ZWM0IHNoYWRvd19jb2xvciAgICA9IHVfbWVkaXVtcFske2UrMX1dO1xuICAgIGJsdXIgPSBoaWdobGlnaHRfY29sb3IgKiBoaWdobGlnaHRfYWxwaGEgKyBzaGFkb3dfY29sb3IgKiBzaGFkb3dfYWxwaGE7XG5gKShhKTtyZXR1cm5gXG4gICAgJHtvfVxuICAgIGZsb2F0IGhpZ2hsaWdodF9hbHBoYSA9IGJsdXIuYSAtIGJsdXIyLmE7XG4gICAgZmxvYXQgc2hhZG93X2FscGhhICAgID0gYmx1cjIuYSAtIGJsdXIuYTtcbiAgICAke2l9XG4gICAgaGlnaGxpZ2h0X2FscGhhID0gY2xhbXAoaGlnaGxpZ2h0X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgc2hhZG93X2FscGhhICAgID0gY2xhbXAoc2hhZG93X2FscGhhLCAwLjAsIDEuMCk7XG4gICAgJHtsfVxuYH0sQm49KGUsdCxuLHIsYSxzLG8pPT57Y29uc3QgaT1gZiR7ZT8ieSI6Im4ifSR7dD8ieSI6Im4ifSR7bj8ieSI6Im4ifSR7cn0ke2E/InkiOiJuIn0ke3M/InkiOiJuIn1gO2lmKFRuLmhhcyhpKSlyZXR1cm4gVG4uZ2V0KGkpO2xldCBjPTE7ZSYmYysrLG8mJmMrKztsZXQgbD0oZT80OjApKyh0PzQ6MCkrKHM/MTowKTtvfHwobCs9bj80OjgpLGw9TWF0aC5jZWlsKGwvNCk7Y29uc3QgdT1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scixhLHMsbyxpLGMpPT57bGV0IGw9MDtjb25zdCB1PW4/KGU9PmBcbiAgICB2ZWMyIGJhc2Vfc2NhbGUgID0gdV9tZWRpdW1wWyR7ZX1dLnh5O1xuICAgIHZlYzIgYmFzZV9vZmZzZXQgPSB1X21lZGl1bXBbJHtlfV0uenc7XG5cbiAgICB2ZWMyIHV2ID0gdl9jb29yZCAqIGJhc2Vfc2NhbGUgLSBiYXNlX29mZnNldDtcbiAgICB2ZWM0IGJhc2UgPSBtaXgodmVjNCgwLjApLCB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHV2KSwgaXNJbnNpZGUodXYpKTtcbmApKGwrKyk6IiIsaD1yPyhlPT5gXG4gICAgdmVjMiBibHVyX3NjYWxlICA9IHVfbWVkaXVtcFske2V9XS54eTtcbiAgICB2ZWMyIGJsdXJfb2Zmc2V0ID0gdV9tZWRpdW1wWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBzdCA9IHZfY29vcmQgKiBibHVyX3NjYWxlIC0gYmx1cl9vZmZzZXQ7XG4gICAgdmVjNCBibHVyID0gbWl4KHZlYzQoMC4wKSwgdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBzdCksIGlzSW5zaWRlKHN0KSk7XG5gKShsKyspOiJcbiAgICB2ZWM0IGJsdXIgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMF0sIHZfY29vcmQpO1xuIixiPSJpbm5lciI9PT1zLGQ9bDtsZXQgZixtLHY9NCpsO3N3aXRjaChjP2Y9YT9DbighMSxuLGksYyxkLHYpOlBuKG4scixpLGMsZCx2KTphPyh2Kz00LGY9Q24oYixuLGksYyxkLHYpKToodis9OCxmPVBuKG4scixpLGMsZCx2KSkscyl7Y2FzZSJvdXRlciI6bT1vPyJibHVyIC0gYmx1ciAqIGJhc2UuYSI6ImJhc2UgKyBibHVyIC0gYmx1ciAqIGJhc2UuYSI7YnJlYWs7Y2FzZSJmdWxsIjptPW8/ImJsdXIiOiJiYXNlIC0gYmFzZSAqIGJsdXIuYSArIGJsdXIiO2JyZWFrO2RlZmF1bHQ6bT0iYmx1ciJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZXNbJHtlfV07XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7dH1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gICAgJHt1fVxuICAgICR7aH1cbiAgICAke2Z9XG4gICAgb19jb2xvciA9ICR7bX07XG59YH0pKGMsbCxlLHQsbixyLGEscyxvKSk7cmV0dXJuIFRuLnNldChpLHUpLHV9LEluPW5ldyBNYXAsTG49KGUsdCk9Pntjb25zdCBuPWBsJHsoIjAwIitlKS5zbGljZSgtMyl9JHt0PyJ5IjoibiJ9YDtpZihJbi5oYXMobikpcmV0dXJuIEluLmdldChuKTtjb25zdCByPU1hdGguY2VpbCg1KmUvNCksYT1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4pPT57bGV0IHI9IiI7Zm9yKGxldCBlPTE7ZTx0OysrZSl7Y29uc3Qgbj1lLTEsYT1lLHM9YHVfbWVkaXVtcFske3QrTWF0aC5mbG9vcihuLzQpfV1bJHtuJTR9XWAsbz1gdV9tZWRpdW1wWyR7dCtNYXRoLmZsb29yKGEvNCl9XVske2ElNH1dYDtyKz1gXG4gICAgaWYgKHQgPD0gJHtvfSkge1xuICAgICAgICByZXR1cm4gbWl4KHVfbWVkaXVtcFske259XSwgdV9tZWRpdW1wWyR7YX1dLCAodCAtICR7c30pIC8gKCR7b30gLSAke3N9KSk7XG4gICAgfVxuYH1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFske2V9XTtcblxuaW4gdmVjMiB2X2Nvb3JkO1xub3V0IHZlYzQgb19jb2xvcjtcblxudmVjNCBnZXRHcmFkaWVudENvbG9yKGluIGZsb2F0IHQpIHtcbiAgICBpZiAodCA8PSB1X21lZGl1bXBbJHt0fV1bMF0pIHtcbiAgICAgICAgcmV0dXJuIHVfbWVkaXVtcFswXTtcbiAgICB9XG4gICAgJHtyfVxuICAgIHJldHVybiB1X21lZGl1bXBbJHt0LTF9XTtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIHZlYzQgY29sb3IgPSBnZXRHcmFkaWVudENvbG9yKHZfY29vcmQueCk7XG4gICAgJHtuPyJjb2xvciA9IHBvdyhjb2xvciwgdmVjNCgwLjQ1NDU0NTQ1KSk7IjoiIn1cbiAgICBjb2xvci5yZ2IgKj0gY29sb3IuYTtcblxuICAgIG9fY29sb3IgPSBjb2xvcjtcbn1gfSkocixlLHQpKTtyZXR1cm4gSW4uc2V0KG4sYSksYX0sVW49KGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89ZS5tZWRpdW1wO2xldCBpPTA7Zm9yKGxldCBlPWE7ZTxzO2UrKyl7Y29uc3QgdD1uW2VdO29baSsrXT0odD4+MTYpLzI1NSxvW2krK109KHQ+PjgmMjU1KS8yNTUsb1tpKytdPSgyNTUmdCkvMjU1LG9baSsrXT1yW2VdfWZvcihsZXQgZT1hO2U8cztlKyspb1tpKytdPXRbZV0vMjU1fTtsZXQgTm47Y29uc3QgRG49KGUsdCk9PihObj94dFswXT09PWUmJnh0WzRdPT09dHx8KHh0WzBdPWUseHRbMl09ZSx4dFs0XT10LHh0WzZdPXQsbi5idWZmZXJTdWJEYXRhKG4uQVJSQVlfQlVGRkVSLDAseHQpKTpObj0oKGUsdCk9Pntjb25zdCByPWZ0KCk7cmV0dXJuIHZ0KHIpLG4uYmluZEJ1ZmZlcihuLkFSUkFZX0JVRkZFUixyLnZlcnRleEJ1ZmZlcikseHRbMF09ZSx4dFsyXT1lLHh0WzRdPXQseHRbNl09dCxuLmJ1ZmZlckRhdGEobi5BUlJBWV9CVUZGRVIseHQsbi5TVEFUSUNfRFJBVyksbi5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSgwKSxuLnZlcnRleEF0dHJpYlBvaW50ZXIoMCwyLG4uRkxPQVQsITEsMCwwKSxyfSkoZSx0KSxObiksam49KGUsdCxyKT0+e2UudXNlUHJvZ3JhbSgpLGUuYmluZFVuaWZvcm0oKSx2dChEbih0LHIpKSxuLmRyYXdBcnJheXMobi5UUklBTkdMRV9TVFJJUCwwLDQpfTtsZXQgWG49bnVsbDtjb25zdCB6bj0oKT0+KFhufHwoWG49SCg1MTIsMSwhMSkpLFhuKTtsZXQgVm49MDtjb25zdCBXbj0oKT0+Vm4sR249bmV3IEZsb2F0MzJBcnJheSgyNTYpLFluPW5ldyBGbG9hdDMyQXJyYXkoMjU2KTtmb3IobGV0IGU9MDtlPDI1NjsrK2Upe2NvbnN0IHQ9ZS8yNTU7R25bZV09TWF0aC5wb3codCwyLjIzMzMzMzMzKSxZbltlXT10fWNvbnN0IHFuPShlLHQsYSxzLG8saSxjLGwsdSxoLGIsZCxmLG0sdixfLHA9bnVsbCxnPW51bGwseD1udWxsLEU9MCxBPTAseT0wLFQ9MCxSPTAsTT0wLHc9MCxGPTApPT57Y29uc3QgJD1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LE89SChhLHMsITEpO3IuYmluZChPKTtjb25zdCBTPSJpbm5lciI9PT1tLGs9bnVsbCE9PXAmJm51bGwhPT1nJiZudWxsIT09eDtsZXQgQz1udWxsO2lmKGsmJihDPSgoZSx0LG4pPT57Y29uc3QgYT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHM9em4oKTtyLmJpbmQocyk7Y29uc3Qgbz1lLmxlbmd0aDtobigpO2NvbnN0IGk9V24oKTtmb3IobGV0IHI9MDtyPG87cis9aS0xKXtjb25zdCBhPU1hdGgubWluKHIraSxvKSxzPUxuKGEtciwhMSk7VW4ocyxlLHQsbixyLGEpLGpuKHMsZVtyXS8yNTUsZVthLTFdLzI1NSl9cmV0dXJuIER0KCksYSYmci5iaW5kKGEpLHMudGV4dHVyZX0pKHAsZyx4KSksUyl7ci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlLCEwKTtjb25zdCBhPWFuKCk7c24oYSxlLndpZHRoLGUuaGVpZ2h0KSxvbihhKSxrJiZDPygoZSx0LHI9ITEpPT57T2UoMixuLlRFWFRVUkUyLHQsciksT2UoMSxuLlRFWFRVUkUxLG51bGwpLE9lKDAsbi5URVhUVVJFMCxlLHIpfSkodCxDLCEwKTpTZSh0LCEwKX1lbHNlIGsmJkM/KChlLHQscixhPSExKT0+e09lKDIsbi5URVhUVVJFMixyLGEpLE9lKDEsbi5URVhUVVJFMSx0LGEpLE9lKDAsbi5URVhUVVJFMCxlLGEpfSkodCxlLEMsITApOnJuKHQsZSwhMCk7Y29uc3QgUD0hKFN8fCJmdWxsIj09PW0mJnYpLEI9IShhPT09dSYmcz09PWgmJjA9PT1iJiYwPT09ZCksST0hKDE9PT1fKTtTP3Y/NjcwIT09TnQoKSYmKFV0KDY3MCksbi5ibGVuZEZ1bmMobi5EU1RfQUxQSEEsbi5aRVJPKSk6NjczIT09TnQoKSYmKFV0KDY3Myksbi5ibGVuZEZ1bmMobi5EU1RfQUxQSEEsbi5PTkVfTUlOVVNfU1JDX0FMUEhBKSk6aG4oKTtjb25zdCBMPUJuKFAsQixmLG0sdixJLGspOygoZSx0LG4scixhLHMsbyxpLGMsbCx1LGgsYixkLGYsbSx2LF8scCxnLHgsRSxBLHksVCk9PntsZXQgUjtFPyhSPWUudGV4dHVyZXMsUlswXT0wLFJbMV09MSxUJiYoUlsyXT0yKSk6VCYmKFI9ZS50ZXh0dXJlcyxSWzBdPTAsUlsxXT0yKTtjb25zdCBNPWUubWVkaXVtcDtsZXQgdz0wO0UmJihNW3crK109dC9yLE1bdysrXT1uL2EsTVt3KytdPXMvcixNW3crK109KG4tYS1vKS9hKSxBJiYoTVt3KytdPXQvaSxNW3crK109bi9jLE1bdysrXT1sL2ksTVt3KytdPShuLWMtdSkvYyksVHx8KGg/KE1bdysrXT1kLE1bdysrXT1mLE1bdysrXT1tLE1bdysrXT12KTooTVt3KytdPWQsTVt3KytdPWYsTVt3KytdPW0sTVt3KytdPXYsTVt3KytdPV8sTVt3KytdPXAsTVt3KytdPWcsTVt3KytdPXgpKSx5JiYoTVt3XT1iKX0pKEwsYSxzLG8saSxjLGwsdSxoLGIsZCxmLF8sRSxBLHksVCxSLE0sdyxGLFAsQixJLGspLG9uKEwpO2NvbnN0IFU9Ty50ZXh0dXJlO3JldHVybiB3ZShPLCExKSxEdCgpLCQmJnIuYmluZCgkKSxVfSxLbj0oZSx0LG49MCxhPTEscz00LG89NCxpPTEsYz0xLGw9ITEsdT0hMSk9Pntjb25zdCBoPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3QsYj1lLndpZHRoLGQ9ZS5oZWlnaHQsZj1Nbi54LG09TW4ueSx2PVNuKGUsdCxzLG8sYywhMSksXz12LndpZHRoLHA9di5oZWlnaHQsZz1Nbi54LWYseD1Nbi55LW0sRT1xbihlLHYsbD9iOl8sbD9kOnAsYixkLGw/MDpnLGw/MDp4LF8scCxsPy1nOjAsbD8teDowLCEwLGw/ImlubmVyIjoib3V0ZXIiLHUsaSxudWxsLG51bGwsbnVsbCx3bihuLGEsITApLEZuKG4sYSwhMCksJG4obixhLCEwKSxhLDAsMCwwLDApO3JldHVybiBVKGUpLFUodiksaCYmci5iaW5kKGgpLEV9LEhuPU1hdGguUEkvMTgwLFpuPShlLHQsbj00LGE9NDUscz0wLG89MSxpPTQsYz00LGw9MSx1PTEsaD0hMSxiPSExLGQ9ITEpPT57Y29uc3QgZj1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG09ZS53aWR0aCx2PWUuaGVpZ2h0LF89TW4ueCxwPU1uLnksZz1TbihlLHQsaSxjLHUsITEpLHg9Zy53aWR0aCxFPWcuaGVpZ2h0LEE9TW4ueCxUPU1uLnksUj1BLV8sTT1ULXAsdz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSksRj1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksJD15KCksTz1hKkhuLFM9TWF0aC5jb3MoTykqbioody8kKSxrPU1hdGguc2luKE8pKm4qKEYvJCksQz1oP206eCtNYXRoLm1heCgwLE1hdGguYWJzKFMpLVIpLFA9aD92OkUrTWF0aC5tYXgoMCxNYXRoLmFicyhrKS1NKSxCPU1hdGguY2VpbChDKSxJPU1hdGguY2VpbChQKSxMPShCLUMpLzIsTj0oSS1QKS8yLEQ9aD8wOk1hdGgubWF4KDAsUi1TKStMLGo9aD8wOk1hdGgubWF4KDAsTS1rKStOLFg9aD9TLUE6KFM+MD9NYXRoLm1heCgwLFMtUik6MCkrTCx6PWg/ay1UOihrPjA/TWF0aC5tYXgoMCxrLU0pOjApK047bGV0IFYsVz0iIjtoPyhXPSJpbm5lciIsVj1ifHxkKTohYiYmZD8oVz0iZnVsbCIsVj0hMCk6KFc9Im91dGVyIixWPWIpO2NvbnN0IEc9cW4oZSxnLEIsSSxtLHYsRCxqLHgsRSxYLHosITAsVyxWLGwsbnVsbCxudWxsLG51bGwsd24ocyxvLCEwKSxGbihzLG8sITApLCRuKHMsbywhMCksbywwLDAsMCwwKTtyZXR1cm4gVShlKSxVKGcpLGYmJnIuYmluZChmKSxHfSxRbj1NYXRoLlBJLzE4MCxKbj0oZSx0LG49NCxhPTQ1LHM9MTY3NzcyMTUsbz0xLGk9MCxjPTEsbD00LHU9NCxoPTEsYj0xLGQ9MCxmPSExKT0+e2NvbnN0IG09ZS53aWR0aCx2PWUuaGVpZ2h0LF89TW4ueCxwPU1uLnksZz1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSkseD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSksRT15KCksQT1hKlFuLFQ9TWF0aC5jb3MoQSkqbiooZy9FKSxSPU1hdGguc2luKEEpKm4qKHgvRSksTT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHc9SChtLHYsITEpO3IuYmluZCh3KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLFNlKGUpO2NvbnN0IEY9YW4oKTtzbihGLGUud2lkdGgsZS5oZWlnaHQpLG9uKEYpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMipULDIqUikscG4oKSxzbihGLGUud2lkdGgsZS5oZWlnaHQpLG9uKEYpLER0KCk7Y29uc3QgJD13LnRleHR1cmU7TSYmci5iaW5kKE0pO2NvbnN0IE89U24oJCx0LGwsdSxiLCExKTt3ZSh3KTtjb25zdCBTPU8ud2lkdGgsaz1PLmhlaWdodCxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpLFA9TWF0aC5jZWlsKGsrMipNYXRoLmFicyhSKSk7bGV0IEI9IiI7c3dpdGNoKGQpe2Nhc2UgMDpCPSJmdWxsIjticmVhaztjYXNlIDE6Qj0iaW5uZXIiO2JyZWFrO2Nhc2UgMjpCPSJvdXRlciJ9Y29uc3QgST0iaW5uZXIiPT09QixMPUk/bTpDLE49ST92OlAsRD1NYXRoLmFicyhUKSxqPU1hdGguYWJzKFIpLFg9KFMtbSkvMix6PShrLXYpLzIsVj1JPzA6RCtYLFc9ST8wOmoreixHPXFuKGUsTyxMLE4sbSx2LFYsVyxTLGssST8tWC1UOkQtVCxJPy16LVI6ai1SLCExLEIsZixoLG51bGwsbnVsbCxudWxsLHduKHMsbywhMCksRm4ocyxvLCEwKSwkbihzLG8sITApLG8sd24oaSxjLCEwKSxGbihpLGMsITApLCRuKGksYywhMCksYyk7cmV0dXJuIE1uLng9XytWLE1uLnk9cCtXLFUoZSksVShPKSxHfSxlcj1NYXRoLlBJLzE4MCx0cj0oZSx0LG49NCxhPTQ1LHMsbyxpLGM9NCxsPTQsdT0xLGg9MSxiPTAsZD0hMSk9Pntjb25zdCBmPWUud2lkdGgsbT1lLmhlaWdodCx2PU1uLngsXz1Nbi55LHA9TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pLGc9TWF0aC5zcXJ0KHRbMl0qdFsyXSt0WzNdKnRbM10pLHg9eSgpLEU9YSplcixBPU1hdGguY29zKEUpKm4qKHAveCksVD1NYXRoLnNpbihFKSpuKihnL3gpLFI9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxNPUgoZixtLCExKTtyLmJpbmQoTSksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlKTtjb25zdCB3PWFuKCk7c24odyxlLndpZHRoLGUuaGVpZ2h0KSxvbih3KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDIqQSwyKlQpLHBuKCksc24odyxlLndpZHRoLGUuaGVpZ2h0KSxvbih3KSxEdCgpO2NvbnN0IEY9TS50ZXh0dXJlO1ImJnIuYmluZChSKTtjb25zdCAkPVNuKEYsdCxjLGwsaCwhMSk7d2UoTSk7Y29uc3QgTz0kLndpZHRoLFM9JC5oZWlnaHQsaz1NYXRoLmNlaWwoTysyKk1hdGguYWJzKEEpKSxDPU1hdGguY2VpbChTKzIqTWF0aC5hYnMoVCkpO2xldCBQPSIiO3N3aXRjaChiKXtjYXNlIDA6UD0iZnVsbCI7YnJlYWs7Y2FzZSAxOlA9ImlubmVyIjticmVhaztjYXNlIDI6UD0ib3V0ZXIifWNvbnN0IEI9ImlubmVyIj09PVAsST1CP2Y6ayxMPUI/bTpDLE49TWF0aC5hYnMoQSksRD1NYXRoLmFicyhUKSxqPShPLWYpLzIsWD0oUy1tKS8yLHo9Qj8wOk4raixWPUI/MDpEK1gsVz1xbihlLCQsSSxMLGYsbSx6LFYsTyxTLEI/LWotQTpOLUEsQj8tWC1UOkQtVCwhMSxQLGQsdSxpLHMsbywwLDAsMCwwLDAsMCwwLDApO3JldHVybiBNbi54PXYreixNbi55PV8rVixVKGUpLFUoJCksV30sbnI9TWF0aC5QSS8xODAscnI9KGUsdCxuPTQscj00NSxhLHMsbyxpPTQsYz00LGw9MSx1PTEsaD0wLGI9ITEpPT57Y29uc3QgZD1lLndpZHRoLGY9ZS5oZWlnaHQsbT1Nbi54LHY9TW4ueSxfPVNuKGUsdCxpLGMsdSwhMSkscD1fLndpZHRoLGc9Xy5oZWlnaHQseD1Nbi54LEU9TW4ueSxBPXgtbSxUPUUtdixSPU1hdGguc3FydCh0WzBdKnRbMF0rdFsxXSp0WzFdKSxNPU1hdGguc3FydCh0WzJdKnRbMl0rdFszXSp0WzNdKSx3PXkoKSxGPXIqbnIsJD1NYXRoLmNvcyhGKSpuKihSL3cpLE89TWF0aC5zaW4oRikqbiooTS93KSxTPTE9PT1oLGs9Uz9kOnArTWF0aC5tYXgoMCxNYXRoLmFicygkKS1BKSxDPVM/ZjpnK01hdGgubWF4KDAsTWF0aC5hYnMoTyktVCksUD1NYXRoLmNlaWwoayksQj1NYXRoLmNlaWwoQyksST0oUC1rKS8yLEw9KEItQykvMixOPVM/MDpNYXRoLm1heCgwLEEtJCkrSSxEPVM/MDpNYXRoLm1heCgwLFQtTykrTCxqPVM/JC14OigkPjA/TWF0aC5tYXgoMCwkLUEpOjApK0ksWD1TP08tRTooTz4wP01hdGgubWF4KDAsTy1UKTowKStMO2xldCB6PSIiO3N3aXRjaChoKXtjYXNlIDA6ej0iZnVsbCI7YnJlYWs7Y2FzZSAxOno9ImlubmVyIjticmVhaztjYXNlIDI6ej0ib3V0ZXIifWNvbnN0IFY9cW4oZSxfLFAsQixkLGYsTixELHAsZyxqLFgsITAseixiLGwsbyxhLHMsMCwwLDAsMCwwLDAsMCwwKTtyZXR1cm4gTW4ueD1tK04sTW4ueT12K0QsVShlKSxVKF8pLFZ9LGFyPShlLHQsbixyKT0+e2NvbnN0IGE9YGMkeygiMCIrZSkuc2xpY2UoLTIpfSR7KCIwIit0KS5zbGljZSgtMil9JHtuPyJ5IjoibiJ9JHtyPyJ5IjoibiJ9YDtpZihUbi5oYXMoYSkpcmV0dXJuIFRuLmdldChhKTtjb25zdCBzPShyPzE6MikrTWF0aC5jZWlsKGUqdC80KSxvPW5ldyAkdCgiI3ZlcnNpb24gMzAwIGVzXG5cbmxheW91dCAobG9jYXRpb24gPSAwKSBpbiB2ZWMyIGFfdmVydGV4O1xuXG5vdXQgdmVjMiB2X2Nvb3JkO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdl9jb29yZCA9IGFfdmVydGV4O1xuXG4gICAgdmVjMiBwb3NpdGlvbiA9IGFfdmVydGV4ICogMi4wIC0gMS4wO1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4wLCAxLjApO1xufSIsKChlLHQsbixyLGEpPT57Y29uc3Qgcz1NYXRoLmZsb29yKC41KnQpLG89TWF0aC5mbG9vciguNSpuKSxpPXQqbjtsZXQgYz0iIjtjb25zdCBsPWE/MToyO2ZvcihsZXQgZT0wO2U8aTsrK2UpYys9YFxuICAgIHJlc3VsdCArPSBnZXRXZWlnaHRlZENvbG9yKCR7ZX0sIHVfbWVkaXVtcFske2wrTWF0aC5mbG9vcihlLzQpfV1bJHtlJTR9XSk7XG5gO3JldHVybmAjdmVyc2lvbiAzMDAgZXNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9tZWRpdW1wWyR7ZX1dO1xuXG5pbiB2ZWMyIHZfY29vcmQ7XG5vdXQgdmVjNCBvX2NvbG9yO1xuXG5cbmZsb2F0IGlzSW5zaWRlKGluIHZlYzIgdXYpIHtcbiAgICByZXR1cm4gc3RlcCg0LjAsIGRvdChzdGVwKHZlYzQoMC4wLCB1di54LCAwLjAsIHV2LnkpLCB2ZWM0KHV2LngsIDEuMCwgdXYueSwgMS4wKSksIHZlYzQoMS4wKSkpO1xufVxuXG52ZWM0IGdldFdlaWdodGVkQ29sb3IgKGluIGludCBpLCBpbiBmbG9hdCB3ZWlnaHQpIHtcbiAgICB2ZWMyIHJjcF9zaXplID0gdV9tZWRpdW1wWzBdLnh5O1xuXG4gICAgaW50IGlfZGl2X3ggPSBpIC8gJHt0fTtcbiAgICBpbnQgaV9tb2RfeCA9IGkgLSAke3R9ICogaV9kaXZfeDtcbiAgICB2ZWMyIG9mZnNldCA9IHZlYzIoaV9tb2RfeCAtICR7c30sICR7b30gLSBpX2Rpdl94KTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHJjcF9zaXplO1xuXG4gICAgdmVjNCBjb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB1dik7XG4gICAgY29sb3IucmdiIC89IG1heCgwLjAwMDEsIGNvbG9yLmEpO1xuICAgICR7YT8iIjoiXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzFdO1xuICAgIGNvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIGNvbG9yLCBpc0luc2lkZSh1dikpO1xuIn1cblxuICAgIHJldHVybiBjb2xvciAqIHdlaWdodDtcbn1cblxudm9pZCBtYWluKCkge1xuICAgIGZsb2F0IHJjcF9kaXZpc29yID0gdV9tZWRpdW1wWzBdLno7XG4gICAgZmxvYXQgYmlhcyAgICAgICAgPSB1X21lZGl1bXBbMF0udztcblxuICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLjApO1xuICAgICR7Y31cbiAgICByZXN1bHQgPSBjbGFtcChyZXN1bHQgKiByY3BfZGl2aXNvciArIGJpYXMsIDAuMCwgMS4wKTtcbiAgICAke3I/InJlc3VsdC5hID0gdGV4dHVyZSh1X3RleHR1cmUsIHZfY29vcmQpLmE7IjoiIn1cblxuICAgIHJlc3VsdC5yZ2IgKj0gcmVzdWx0LmE7XG4gICAgb19jb2xvciA9IHJlc3VsdDtcbn1gfSkocyxlLHQsbixyKSk7cmV0dXJuIFRuLnNldChhLG8pLG99LHNyPShlLHQ9MCxuPTAsYSxzPTEsbz0wLGk9ITAsYz0hMCxsPTAsdT0wKT0+e2NvbnN0IGg9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdCxiPWUud2lkdGgsZD1lLmhlaWdodCxmPUgoYixkLCExKTtyLmJpbmQoZiksci5yZXNldCgpLHIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxTZShlLCEwKSxEdCgpO2NvbnN0IG09YXIodCxuLGksYyk7KChlLHQsbixyLGEscyxvLGksYyxsLHUpPT57Y29uc3QgaD1lLm1lZGl1bXA7aFswXT0xL3QsaFsxXT0xL24saFsyXT0xL2EsaFszXT1zLzI1NTtsZXQgYj00O298fChoW2IrK109aSxoW2IrK109YyxoW2IrK109bCxoW2IrK109dSk7Y29uc3QgZD1yLmxlbmd0aDtmb3IobGV0IGU9MDtlPGQ7ZSsrKWhbYisrXT1yW2VdfSkobSxiLGQsYSxzLG8sYyx3bihsLHUsITEpLEZuKGwsdSwhMSksJG4obCx1LCExKSx1KSxvbihtKTtjb25zdCB2PWYudGV4dHVyZTtyZXR1cm4gVShlKSx3ZShmLCExKSxoJiZyLmJpbmQoaCksdn0sb3I9KGUsdCxuLGE9MCxzPTAsbz0wLGk9MCxjPTAsbD0wLHU9MCxoPTAsYj0yLGQ9MCxmPTApPT57Y29uc3QgbT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LHY9eSgpLF89TWF0aC5zcXJ0KHRbMF0qdFswXSt0WzFdKnRbMV0pL3YscD1NYXRoLnNxcnQodFsyXSp0WzJdK3RbM10qdFszXSkvdixnPWUud2lkdGgseD1lLmhlaWdodCxFPWcvXyxBPXgvcCxUPUgoZyx4LCExKTtyLmJpbmQoVCk7Y29uc3QgUj1FbihhLHMsbik7cm4oZSxSKTtjb25zdCBNPSgoZSx0LG4pPT57Y29uc3Qgcj1gZCR7ZX0ke3R9JHtufWA7aWYoVG4uaGFzKHIpKXJldHVybiBUbi5nZXQocik7Y29uc3QgYT1uZXcgJHQoIiN2ZXJzaW9uIDMwMCBlc1xuXG5sYXlvdXQgKGxvY2F0aW9uID0gMCkgaW4gdmVjMiBhX3ZlcnRleDtcblxub3V0IHZlYzIgdl9jb29yZDtcblxudm9pZCBtYWluKCkge1xuICAgIHZfY29vcmQgPSBhX3ZlcnRleDtcblxuICAgIHZlYzIgcG9zaXRpb24gPSBhX3ZlcnRleCAqIDIuMCAtIDEuMDtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuMCwgMS4wKTtcbn0iLCgoZSx0LG4scik9PntsZXQgYSxzLG87c3dpdGNoKHQpe2Nhc2UgMTphPSJtYXBfY29sb3IuciI7YnJlYWs7Y2FzZSAyOmE9Im1hcF9jb2xvci5nIjticmVhaztjYXNlIDQ6YT0ibWFwX2NvbG9yLmIiO2JyZWFrO2Nhc2UgODphPSJtYXBfY29sb3IuYSI7YnJlYWs7ZGVmYXVsdDphPSIwLjUifXN3aXRjaChuKXtjYXNlIDE6cz0ibWFwX2NvbG9yLnIiO2JyZWFrO2Nhc2UgMjpzPSJtYXBfY29sb3IuZyI7YnJlYWs7Y2FzZSA0OnM9Im1hcF9jb2xvci5iIjticmVhaztjYXNlIDg6cz0ibWFwX2NvbG9yLmEiO2JyZWFrO2RlZmF1bHQ6cz0iMC41In1zd2l0Y2gocil7Y2FzZSAwOm89IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCB1dik7XG4iO2JyZWFrO2Nhc2UgMzpvPSJcbiAgICB2ZWM0IHNvdXJjZV9jb2xvciA9dGV4dHVyZSh1X3RleHR1cmVzWzBdLCBtaXgodl9jb29yZCwgdXYsIHN0ZXAoYWJzKHV2IC0gdmVjMigwLjUpKSwgdmVjMigwLjUpKSkpO1xuIjticmVhaztjYXNlIDE6bz0iXG4gICAgdmVjNCBzdWJzdGl0dXRlX2NvbG9yID0gdV9tZWRpdW1wWzJdO1xuICAgIHZlYzQgc291cmNlX2NvbG9yID0gbWl4KHN1YnN0aXR1dGVfY29sb3IsIHRleHR1cmUodV90ZXh0dXJlc1swXSwgdXYpLCBpc0luc2lkZSh1dikpO1xuIjticmVhaztkZWZhdWx0Om89IlxuICAgIHZlYzQgc291cmNlX2NvbG9yID0gdGV4dHVyZSh1X3RleHR1cmVzWzBdLCBmcmFjdCh1dikpO1xuIn1yZXR1cm5gI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlc1syXTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbJHtlfV07XG5cbmluIHZlYzIgdl9jb29yZDtcbm91dCB2ZWM0IG9fY29sb3I7XG5cblxuZmxvYXQgaXNJbnNpZGUoaW4gdmVjMiB1dikge1xuICAgIHJldHVybiBzdGVwKDQuMCwgZG90KHN0ZXAodmVjNCgwLjAsIHV2LngsIDAuMCwgdXYueSksIHZlYzQodXYueCwgMS4wLCB1di55LCAxLjApKSwgdmVjNCgxLjApKSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2X3RvX3N0X3NjYWxlICA9IHVfbWVkaXVtcFswXS54eTtcbiAgICB2ZWMyIHV2X3RvX3N0X29mZnNldCA9IHVfbWVkaXVtcFswXS56dztcbiAgICB2ZWMyIHNjYWxlICAgICAgICAgICA9IHVfbWVkaXVtcFsxXS54eTtcblxuICAgIHZlYzIgc3QgPSB2X2Nvb3JkICogdXZfdG9fc3Rfc2NhbGUgLSB1dl90b19zdF9vZmZzZXQ7XG4gICAgdmVjNCBtYXBfY29sb3IgPSB0ZXh0dXJlKHVfdGV4dHVyZXNbMV0sIHN0KTtcblxuICAgIHZlYzIgb2Zmc2V0ID0gdmVjMigke2F9LCAke3N9KSAtIDAuNTtcbiAgICB2ZWMyIHV2ID0gdl9jb29yZCArIG9mZnNldCAqIHNjYWxlO1xuICAgICR7b31cblxuICAgIG9fY29sb3IgPSBtaXgodGV4dHVyZSh1X3RleHR1cmVzWzBdLCB2X2Nvb3JkKSwgc291cmNlX2NvbG9yLCBpc0luc2lkZShzdCkpO1xufWB9KSgxPT09bj8zOjIsZSx0LG4pKTtyZXR1cm4gVG4uc2V0KHIsYSksYX0pKGMsbCxiKTsoKGUsdCxuLHIsYSxzLG8saSxjLGwsdSxoLGIsZCk9Pntjb25zdCBmPWUudGV4dHVyZXM7ZlswXT0wLGZbMV09MTtjb25zdCBtPWUubWVkaXVtcDttWzBdPXIvdCxtWzFdPWEvbixtWzJdPXMvdCxtWzNdPShhLW4tbykvbixtWzRdPWkvcixtWzVdPS1jL2EsMT09PWwmJihtWzhdPXUsbVs5XT1oLG1bMTBdPWIsbVsxMV09ZCl9KShNLGcseCxFLEEsbyxpLHUsaCxiLHduKGQsZiwhMCksRm4oZCxmLCEwKSwkbihkLGYsITApLGYpLER0KCksb24oTSk7Y29uc3Qgdz1ULnRleHR1cmU7cmV0dXJuIG0mJnIuYmluZChtKSxVKGUpLFUoUiksd2UoVCwhMSksd30saXI9KGUsdCxuLGEpPT57Y29uc3Qgcz1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0LG89ZS53aWR0aCxpPWUuaGVpZ2h0O3N3aXRjaChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7ci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLG4sYSk7Y29uc3Qgcz1mbighMCk7KChlLHQsbixhKT0+e2NvbnN0IHM9ZS5oaWdocCxvPXIuJG1hdHJpeDtzWzBdPW9bMF0sc1sxXT1vWzFdLHNbMl09b1szXSxzWzNdPW9bNF0sc1s0XT1vWzZdLHNbNV09b1s3XSxzWzZdPW4sc1s3XT1hLHNbOF09eCgpLHNbOV09RSgpO2NvbnN0IGk9ZS5tZWRpdW1wO2lbMF09dFswXSxpWzFdPXRbMV0saVsyXT10WzJdLGlbM109dFszXSxpWzRdPXRbNF0saVs1XT10WzVdLGlbNl09dFs2XSxpWzddPXRbN119KShzLHQsbyxpKSxTZShlKSxnbihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksb24ocyl9YnJlYWs7ZGVmYXVsdDp7Y29uc3Qgcz11bihuLGEsbyxpKSxjPUgobyxpLCExKTtyLmJpbmQoYykscm4ocyxlKTtjb25zdCBsPUp0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKTtkbihsLHRbMF0sdFsxXSx0WzJdLHRbM10sdFs0XSx0WzVdLHRbNl0sdFs3XSksb24obCksci5iaW5kKHIuJG1haW5BdHRhY2htZW50T2JqZWN0KSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSxuLGEpLGJuKGMudGV4dHVyZSksVShzKSx3ZShjKX19cyYmci5iaW5kKHMpLER0KCl9LGNyPVtdLGxyPWU9PntlLnNpemUmJmUuY2xlYXIoKSxjci5wdXNoKGUpfSx1cj0oZSx0LG4scixhPW51bGwpPT57dC5oYXMobil8fHQuc2V0KG4sY3IucG9wKCl8fG5ldyBNYXApO2NvbnN0IHM9dC5nZXQobik7aWYobnVsbD09PWEpe2lmKCFzLmhhcyhyKSlyZXR1cm47cmV0dXJuIGUuZGVzdHJveShzLmdldChyKSkscy5kZWxldGUociksdm9pZChzLnNpemV8fCh0LmRlbGV0ZShuKSxscihzKSkpfXMuc2V0KHIsYSl9O2NvbnN0IGhyPW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcigpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHBvb2wiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiXyRzdG9yZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfJHRyYXNoIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiR0aW1lcklkIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRyZW1vdmVDYWNoZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkcmVtb3ZlSWRzIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksdGhpcy5fJHBvb2w9W10sdGhpcy5fJHN0b3JlPW5ldyBNYXAsdGhpcy5fJHRyYXNoPW5ldyBNYXAsdGhpcy4kdGltZXJJZD1udWxsLHRoaXMuJHJlbW92ZUlkcz1bXSx0aGlzLiRyZW1vdmVDYWNoZT0hMX1yZXNldCgpeygoZSx0LG4pPT57bi5jbGVhcigpLG51bGwhPT1lLiR0aW1lcklkJiZjbGVhclRpbWVvdXQoZS4kdGltZXJJZCk7Zm9yKGNvbnN0IG4gb2YgdC52YWx1ZXMoKSl7Zm9yKGNvbnN0IHQgb2Ygbi52YWx1ZXMoKSl0JiZlLmRlc3Ryb3kodCk7bHIobil9dC5jbGVhcigpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoKX1kZXN0cm95KGU9bnVsbCl7KChlLHQpPT57aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiY2FudmFzImluIHQpe2NvbnN0IG49dC5jYW52YXMscj1uLndpZHRoLGE9bi5oZWlnaHQ7dC5jbGVhclJlY3QoMCwwLHIrMSxhKzEpLG4ud2lkdGg9bi5oZWlnaHQ9MSxlLnB1c2gobil9fSkodGhpcy5fJHBvb2wsZSl9Z2V0Q2FudmFzKCl7cmV0dXJuIHRoaXMuXyRwb29sLnBvcCgpfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKX1yZW1vdmUoZSx0KXsoKGUsdCxuKT0+e2lmKCFlLmhhcyh0KSlyZXR1cm47Y29uc3Qgcj1lLmdldCh0KTtyLmhhcyhuKSYmKHIuZGVsZXRlKG4pLHIuc2l6ZXx8KGxyKHIpLGUuZGVsZXRlKHQpKSl9KSh0aGlzLl8kc3RvcmUsZSx0KX1yZW1vdmVUaW1lcihlKXsoKGUsdCxuLHIpPT57aWYobi5oYXMocikpcmV0dXJuO2NvbnN0IGE9dC5nZXQocik7YSYmKGEuc2V0KCJ0cmFzaCIsITApLG4uc2V0KHIsYSksbnVsbCE9PWUuJHRpbWVySWQmJmNsZWFyVGltZW91dChlLiR0aW1lcklkKSxlLiRyZW1vdmVDYWNoZT0hMSxlLiR0aW1lcklkPXNldFRpbWVvdXQoKCk9PntlLiRyZW1vdmVDYWNoZT0hMCxlLiR0aW1lcklkPW51bGx9LDFlMykpfSkodGhpcyx0aGlzLl8kc3RvcmUsdGhpcy5fJHRyYXNoLGUpfXJlbW92ZVRpbWVyU2NoZWR1bGVkQ2FjaGUoKXsoKGUsdCk9PntpZih0LnNpemUpe2Zvcihjb25zdFtuLHJdb2YgdClyLmhhcygidHJhc2giKSYmKGUucmVtb3ZlQnlJZChuKSxlLiRyZW1vdmVJZHMucHVzaCgrbikpO3QuY2xlYXIoKSxlLiRyZW1vdmVDYWNoZT0hMX19KSh0aGlzLHRoaXMuXyR0cmFzaCl9cmVtb3ZlQnlJZChlKXsoKGUsdCxuKT0+e2lmKCF0LmhhcyhuKSlyZXR1cm47Y29uc3Qgcj10LmdldChuKTtmb3IoY29uc3QgdCBvZiByLnZhbHVlcygpKWUuZGVzdHJveSh0KTt0LmRlbGV0ZShuKSxscihyKX0pKHRoaXMsdGhpcy5fJHN0b3JlLGUpfWdldEJ5SWQoZSl7cmV0dXJuIHRoaXMuXyRzdG9yZS5nZXQoZSl9Z2V0KGUsdCl7cmV0dXJuKChlLHQsbik9Pntjb25zdCByPWUuZ2V0KHQpfHxudWxsO3JldHVybiByPyhyLmRlbGV0ZSgidHJhc2giKSxyLmdldChuKXx8bnVsbCk6bnVsbH0pKHRoaXMuXyRzdG9yZSxlLHQpfXNldChlLHQsbj1udWxsKXt1cih0aGlzLHRoaXMuXyRzdG9yZSxlLHQsbil9aGFzKGUsdD0iIil7cmV0dXJuKChlLHQsbj0iIik9Pm4/ISFlLmhhcyh0KSYmZS5nZXQodCkuaGFzKG4pOmUuaGFzKHQpKSh0aGlzLl8kc3RvcmUsZSx0KX1nZW5lcmF0ZUtleXMoZSx0LG4pe3JldHVybigoZSx0LG4pPT57Y29uc3Qgcj1bMTAwKmUsMTAwKnRdO24mJnIucHVzaCgxMDAqbik7bGV0IGE9MjE2NjEzNjI2MTtmb3IobGV0IGU9MDtlPHIubGVuZ3RoOysrZSl7bGV0IHQ9MHxyW2VdO2ZvcihsZXQgZT0wO2U8NDtlKyspYV49MjU1JnQsYT1NYXRoLmltdWwoYSwxNjc3NzYxOSksdD4+Pj04fXJldHVybihhPj4+MCklMTY3NzcyMTZ9KShlLHQsbil9Z2VuZXJhdGVGaWx0ZXJLZXlzKGUsdCxuLHIpe3JldHVybigoZSx0LG4scik9PmAke2V9JHt0fSR7bn0ke3J9YCkoZSx0LG4scil9fSxicj0oZSx0LG4sYSxzLG8saSxjLGwsdSxoKT0+e2NvbnN0IGI9ci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtsZXQgZD1udWxsO2NvbnN0IGY9TWF0aC5zcXJ0KGlbMF0qaVswXStpWzFdKmlbMV0pLF89TWF0aC5zcXJ0KGlbMl0qaVsyXStpWzNdKmlbM10pLHA9aHIuZ2VuZXJhdGVGaWx0ZXJLZXlzKGlbMF0saVsxXSxpWzJdLGlbM10pO2xldCBnPSExO2lmKGhyLmdldCh0LCJmS2V5Iik9PT1wKXtjb25zdCBlPWhyLmdldCh0LCJmVGV4dHVyZSIpO24/VShlKTooZz0hMCxkPWUpfWxldCB4PTAsRT0wO2lmKGcpeD1oci5nZXQodCwib2Zmc2V0WCIpLEU9aHIuZ2V0KHQsIm9mZnNldFkiKTtlbHNle2Q9bm4oZSk7Y29uc3QgdD1NYXRoLmF0YW4yKGlbMV0saVswXSksbj1NYXRoLmF0YW4yKC1pWzJdLGlbM10pLGM9bz9mKk1hdGguY29zKHQpOk1hdGguY29zKHQpLGw9bz9mKk1hdGguc2luKHQpOk1hdGguc2luKHQpLHU9bz8tXypNYXRoLnNpbihuKTotTWF0aC5zaW4obikscD1vP18qTWF0aC5jb3Mobik6TWF0aC5jb3MobiksZz1tKGMsbCx1LHAsYS8yLHMvMiksQT1tKDEsMCwwLDEsLWUudy8yLC1lLmgvMikseT0oKGUsdCk9Pntjb25zdCBuPWVbMF0scj1lWzFdLGE9ZVsyXSxzPWVbM10sbz1lWzRdLGk9ZVs1XSxjPXRbMF0sbD10WzFdLHU9dFsyXSxoPXRbM10sYj10WzRdLGQ9dFs1XTtyZXR1cm4gbShuKmMrYSpsLHIqYytzKmwsbip1K2EqaCxyKnUrcypoLG4qYithKmQrbyxyKmIrcypkK2kpfSkoZyxBKTtpZih2KGcpLHYoQSksMSE9PXlbMF18fDAhPT15WzFdfHwwIT09eVsyXXx8MSE9PXlbM10pe2NvbnN0IGU9SChhLHMsITEpO3IuYmluZChlKSxyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oeVswXSx5WzFdLHlbMl0seVszXSx5WzRdLHlbNV0pLHg9eVs0XSxFPXlbNV0sU2UoZCk7Y29uc3QgdD1mbigpO21uKHQsZC53aWR0aCxkLmhlaWdodCksb24odCksVShkKSxkPWUudGV4dHVyZSx3ZShlLCExKSxiJiZyLmJpbmQoYil9dih5KSxNbi54PTAsTW4ueT0wO2ZvcihsZXQgZT0wO2gubGVuZ3RoPmU7KXtzd2l0Y2goaFtlKytdKXtjYXNlIDA6ZD1KbihkLGksaFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSkpO2JyZWFrO2Nhc2UgMTpkPVNuKGQsaSxoW2UrK10saFtlKytdLGhbZSsrXSk7YnJlYWs7Y2FzZSAyOmQ9a24oZCxuZXcgRmxvYXQzMkFycmF5KFtoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdXSkpO2JyZWFrO2Nhc2UgMzp7Y29uc3QgdD1oW2UrK10sbj1oW2UrK10scj10Km4sYT1oLnN1YmFycmF5KGUsZStyKTtlKz1yLGQ9c3IoZCx0LG4sYSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSxCb29sZWFuKGhbZSsrXSksaFtlKytdLGhbZSsrXSl9YnJlYWs7Y2FzZSA0Ontjb25zdCB0PWhbZSsrXSxuPW5ldyBVaW50OEFycmF5KHQpO24uc2V0KGguc3ViYXJyYXkoZSxlK3QpKSxlKz10LGQ9b3IoZCxpLG4saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSl9YnJlYWs7Y2FzZSA1OmQ9Wm4oZCxpLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10sQm9vbGVhbihoW2UrK10pLEJvb2xlYW4oaFtlKytdKSxCb29sZWFuKGhbZSsrXSkpO2JyZWFrO2Nhc2UgNjpkPUtuKGQsaSxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSksQm9vbGVhbihoW2UrK10pKTticmVhaztjYXNlIDc6e2NvbnN0IHQ9aFtlKytdLG49aFtlKytdO2xldCByPWhbZSsrXTtjb25zdCBhPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIscj1oW2UrK107Y29uc3Qgcz1oLnN1YmFycmF5KGUsZStyKTtlKz1yLHI9aFtlKytdO2NvbnN0IG89aC5zdWJhcnJheShlLGUrcik7ZSs9cixkPXRyKGQsaSx0LG4sYSxzLG8saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLGhbZSsrXSxCb29sZWFuKGhbZSsrXSkpfWJyZWFrO2Nhc2UgODp7Y29uc3QgdD1oW2UrK10sbj1oW2UrK107bGV0IHI9aFtlKytdO2NvbnN0IGE9aC5zdWJhcnJheShlLGUrcik7ZSs9cixyPWhbZSsrXTtjb25zdCBzPWguc3ViYXJyYXkoZSxlK3IpO2UrPXIscj1oW2UrK107Y29uc3Qgbz1oLnN1YmFycmF5KGUsZStyKTtlKz1yLGQ9cnIoZCxpLHQsbixhLHMsbyxoW2UrK10saFtlKytdLGhbZSsrXSxoW2UrK10saFtlKytdLEJvb2xlYW4oaFtlKytdKSl9fX19aWYoZCl7Y29uc3QgZT15KCksdD11WzBdKihmL2UpLG49dVsxXSooXy9lKTtyLnJlc2V0KCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPWwsaXIoZCxjLC14K3QraVs0XSwtRStuK2lbNV0pfWd8fChoci5zZXQodCwiZktleSIscCksaHIuc2V0KHQsImZUZXh0dXJlIixkKSxoci5zZXQodCwib2Zmc2V0WCIseCksaHIuc2V0KHQsIm9mZnNldFkiLEUpKSxiJiZyLmJpbmQoYil9LGRyPShlLHQscixhKT0+e24uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5GUk9OVCxuLktFRVAsbi5LRUVQLG4uSU5DUl9XUkFQKSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uQkFDSyxuLktFRVAsbi5LRUVQLG4uREVDUl9XUkFQKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSk7Y29uc3Qgcz0hIWEsbz1rdChzKTthJiZDdChvLGEpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxqdChvLGUsdCxyKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLG4uc3RlbmNpbEZ1bmMobi5OT1RFUVVBTCwwLDI1NSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uWkVSTyxuLlpFUk8pLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKTtjb25zdCBpPShlPT57Y29uc3QgdD0icyIrKGU/InkiOiJuIik7aWYoT3QuaGFzKHQpKXJldHVybiBPdC5nZXQodCk7Y29uc3Qgbj1uZXcgJHQoU3QoZT85OjAsITEsITEsZSksIiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbmluIHZlYzQgdl9jb2xvcjtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICBvX2NvbG9yID0gdmVjNCh2X2NvbG9yLnJnYiAqIHZfY29sb3IuYSwgdl9jb2xvci5hKTtcbn0iKTtyZXR1cm4gT3Quc2V0KHQsbiksbn0pKHMpO2EmJigoZSx0KT0+e2NvbnN0IG49ZS5oaWdocDtuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09MCxuWzRdPXRbMl0sbls1XT10WzNdLG5bNl09MCxuWzhdPXRbNF0sbls5XT10WzVdLG5bMTBdPTEsblsxMl09dFs2XSxuWzEzXT10WzddLG5bMTRdPTAsblsxNl09dFs4XSxuWzE3XT10WzldLG5bMThdPTAsblsyMF09dFsxMF0sblsyMV09dFsxMV0sblsyMl09MSxuWzNdPXgoKSxuWzddPUUoKSxuWzExXT10WzEyXSxuWzE1XT10WzEzXSxuWzE5XT10WzE0XSxuWzIzXT10WzE1XSxuWzI0XT10WzE2XSxuWzI1XT10WzE3XSxuWzI2XT10WzE4XSxuWzI3XT10WzE5XSxuWzI4XT10WzIwXSxuWzI5XT10WzIxXSxuWzMwXT10WzIyXSxuWzMxXT10WzIzXSxuWzMyXT10WzI0XSxuWzMzXT10WzI1XX0pKGksYSksanQoaSxlLHQscil9LGZyPShlLHQsbixyLGEpPT57Y29uc3Qgcz1lLm1lZGl1bXA7bGV0IG89MDtmb3IobGV0IGU9bjtlPHI7KytlKXtjb25zdCBuPTUqZTtzW28rK109YVt0W24rMV1dLHNbbysrXT1hW3RbbisyXV0sc1tvKytdPWFbdFtuKzNdXSxzW28rK109YVt0W24rNF1dfWZvcihsZXQgZT1uO2U8cjsrK2Upc1tvKytdPXRbNSplXX0sbXI9KGUsdCk9Pntjb25zdCBhPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Qscz1uLmdldFBhcmFtZXRlcihuLlNDSVNTT1JfQk9YKTtuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpO2NvbnN0IG89em4oKTtyLmJpbmQobyk7Y29uc3QgaT0wPT09dCxjPWUubGVuZ3RoLzUsbD1pP0duOlluO2huKCk7Y29uc3QgdT1XbigpO2ZvcihsZXQgdD0wO3Q8Yzt0Kz11LTEpe2NvbnN0IG49TWF0aC5taW4odCt1LGMpLHI9TG4obi10LGkpO2ZyKHIsZSx0LG4sbCksam4ocixlWzBdLGVbZS5sZW5ndGgtNV0pfXJldHVybiBEdCgpLGEmJnIuYmluZChhKSxEZShzWzBdLHNbMV0sc1syXSxzWzNdKSxvLnRleHR1cmV9LHZyPW5ldyBNYXAsX3I9KGUsdCxuLHIpPT57Y29uc3QgYT0oKGUsdCxuLHIpPT5gJHtlPyJ5IjoibiJ9JHt0PyJ5IjoibiJ9JHt0JiZuPyJ5IjoibiJ9JHtyfWApKHIsZSx0LG4pO2lmKHZyLmhhcyhhKSlyZXR1cm4gdnIuZ2V0KGEpO2NvbnN0IHM9MSsocj8xNDo1KSxvPXMtMSxpPW5ldyAkdChTdChzLCEwLCExLHIpLCgoZSx0LG4scixhKT0+e2NvbnN0IHM9bj8oKGUsdCk9Pntjb25zdCBuPXQ/KGU9PmBcbiAgICB2ZWMyIGZvY2FsID0gdmVjMih1X2hpZ2hwWyR7ZX1dWzFdLCAwLjApO1xuXG4gICAgdmVjMiBkaXIgPSBub3JtYWxpemUoY29vcmQgLSBmb2NhbCk7XG5cbiAgICBmbG9hdCBhID0gZG90KGRpciwgZGlyKTtcbiAgICBmbG9hdCBiID0gMi4wICogZG90KGRpciwgZm9jYWwpO1xuICAgIGZsb2F0IGMgPSBkb3QoZm9jYWwsIGZvY2FsKSAtIDEuMDtcbiAgICBmbG9hdCB4ID0gKC1iICsgc3FydChiICogYiAtIDQuMCAqIGEgKiBjKSkgLyAoMi4wICogYSk7XG5cbiAgICBmbG9hdCB0ID0gZGlzdGFuY2UoZm9jYWwsIGNvb3JkKSAvIGRpc3RhbmNlKGZvY2FsLCBmb2NhbCArIGRpciAqIHgpO2ApKGUpOiJmbG9hdCB0ID0gbGVuZ3RoKGNvb3JkKTsiO3JldHVybmBcbiAgICBmbG9hdCByYWRpdXMgPSB1X2hpZ2hwWyR7ZX1dWzBdO1xuICAgIHZlYzIgY29vcmQgPSBwIC8gcmFkaXVzO1xuICAgICR7bn1cbmB9KSh0LHIpOihlPT5gXG4gICAgdmVjMiBhID0gdV9oaWdocFske2V9XS54eTtcbiAgICB2ZWMyIGIgPSB1X2hpZ2hwWyR7ZX1dLnp3O1xuXG4gICAgdmVjMiBhYiA9IGIgLSBhO1xuICAgIHZlYzIgYXAgPSBwIC0gYTtcblxuICAgIGZsb2F0IHQgPSBkb3QoYWIsIGFwKSAvIGRvdChhYiwgYWIpO2ApKHQpO2xldCBvO3N3aXRjaChhKXtjYXNlIDA6bz0iMS4wIC0gYWJzKGZyYWN0KHQgKiAwLjUpICogMi4wIC0gMS4wKSI7YnJlYWs7Y2FzZSAxOm89ImZyYWN0KHQpIjticmVhaztkZWZhdWx0Om89ImNsYW1wKHQsIDAuMCwgMS4wKSJ9cmV0dXJuYCN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7XG51bmlmb3JtIHZlYzQgdV9oaWdocFske2V9XTtcbiAgICBcbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG4gICAgXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBwID0gdl91djtcbiAgICAke3N9XG4gICAgdCA9ICR7b307XG4gICAgb19jb2xvciA9IHRleHR1cmUodV90ZXh0dXJlLCB2ZWMyKHQsIDAuNSkpO1xufWB9KShzLG8sZSx0LG4pKTtyZXR1cm4gdnIuc2V0KGEsaSksaX0scHI9KGUsdCxuLHIscz0wLG89bnVsbCxpPW51bGwpPT57Y29uc3QgYz1lLmhpZ2hwO2NbMF09blswXSxjWzFdPW5bMV0sY1syXT1uWzJdLGNbNF09blszXSxjWzVdPW5bNF0sY1s2XT1uWzVdLGNbOF09bls2XSxjWzldPW5bN10sY1sxMF09bls4XSxjWzEyXT1yWzBdLGNbMTNdPXJbMV0sY1sxNF09clsyXSxjWzE2XT1yWzNdLGNbMTddPXJbNF0sY1sxOF09cls1XSxjWzExXT1yWzZdLGNbMTVdPXJbN10sY1sxOV09cls4XSxjWzNdPXgoKSxjWzddPUUoKTtsZXQgbD0yMDtpJiYoY1syMF09aVswXSxjWzIxXT1pWzFdLGNbMjJdPTAsY1syNF09aVsyXSxjWzI1XT1pWzNdLGNbMjZdPTAsY1syOF09aVs0XSxjWzI5XT1pWzVdLGNbMzBdPTEsY1szMl09aVs2XSxjWzMzXT1pWzddLGNbMzRdPTAsY1szNl09aVs4XSxjWzM3XT1pWzldLGNbMzhdPTAsY1s0MF09aVsxMF0sY1s0MV09aVsxMV0sY1s0Ml09MSxjWzMxXT1pWzEyXSxjWzM1XT1pWzEzXSxjWzM5XT1pWzE0XSxjWzQzXT1pWzE1XSxjWzQ0XT1pWzE2XSxjWzQ1XT1pWzE3XSxjWzQ2XT1pWzE4XSxjWzQ3XT1pWzE5XSxjWzQ4XT1pWzIwXSxjWzQ5XT1pWzIxXSxjWzUwXT1pWzIyXSxjWzUxXT1pWzIzXSxjWzUyXT1pWzI0XSxjWzUzXT1pWzI1XSxsPTU2KSwwPT09dD8oY1tsKytdPW9bMF0sY1tsKytdPW9bMV0sY1tsKytdPW9bMl0sY1tsXT1vWzNdKTooY1tsKytdPTgxOS4yLGNbbF09YShzLC0uOTc1LC45NzUsMCkpfSxncj0oZSx0LGEscyk9Pntjb25zdCBvPUtlLnNoaWZ0KCksaT1LZS5zaGlmdCgpLGM9S2Uuc2hpZnQoKSxsPUtlLnNoaWZ0KCk7bi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKTtjb25zdCBiPW1yKG8sbCk7U2UoYiksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZnJvbnRGYWNlKG4uQ0NXKSxuLnN0ZW5jaWxNYXNrKDI1NSksbi5zdGVuY2lsRnVuYyhuLkFMV0FZUywwLDI1NSksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkZST05ULG4uS0VFUCxuLktFRVAsbi5JTkNSX1dSQVApLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5CQUNLLG4uS0VFUCxuLktFRVAsbi5ERUNSX1dSQVApLG4uY29sb3JNYXNrKCExLCExLCExLCExKTtjb25zdCBkPSEhcyxmPWt0KGQpO3MmJkN0KGYscyksbi5lbmFibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLGp0KGYsZSx0LGEpLG4uZGlzYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksbi5zdGVuY2lsRnVuYyhuLk5PVEVRVUFMLDAsMjU1KSxuLnN0ZW5jaWxPcChuLktFRVAsbi5aRVJPLG4uWkVSTyksbi5jb2xvck1hc2soITAsITAsITAsITApO2NvbnN0IG09X3IoITEsITEsYyxkKSxwPShlPT57Y29uc3QgdD0tODE5LjIqZVswXS04MTkuMiplWzJdK2VbNF0sbj04MTkuMiplWzBdLTgxOS4yKmVbMl0rZVs0XSxyPS04MTkuMiplWzBdKzgxOS4yKmVbMl0rZVs0XSxhPS04MTkuMiplWzFdLTgxOS4yKmVbM10rZVs1XSxzPTgxOS4yKmVbMV0tODE5LjIqZVszXStlWzVdO2xldCBvPXItdCxpPS04MTkuMiplWzFdKzgxOS4yKmVbM10rZVs1XS1hO2NvbnN0IGM9TWF0aC5zcXJ0KG8qbytpKmkpO2M/KG8vPWMsaS89Yyk6KG89MCxpPTApO2NvbnN0IGw9KG4tdCkqbysocy1hKSppO3JldHVybiB1KHQrbCpvLGErbCppLG4scyl9KShpKSxnPV8oci4kbWF0cml4KTtwcihtLDAsci4kbWF0cml4LGcsMCxwLHMpLGgocCksdihnKSxqdChtLGUsdCxhKX0seHI9KGUsdCxhLHMpPT57Y29uc3Qgbz1LZS5zaGlmdCgpLGk9S2Uuc2hpZnQoKSxjPUtlLnNoaWZ0KCksbD1LZS5zaGlmdCgpLHU9S2Uuc2hpZnQoKTtuLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpO2NvbnN0IGg9bXIobyxsKTtTZShoKSxuLmVuYWJsZShuLlNURU5DSUxfVEVTVCksbi5mcm9udEZhY2Uobi5DQ1cpLG4uc3RlbmNpbE1hc2soMjU1KSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uRlJPTlQsbi5LRUVQLG4uS0VFUCxuLklOQ1JfV1JBUCksbi5zdGVuY2lsT3BTZXBhcmF0ZShuLkJBQ0ssbi5LRUVQLG4uS0VFUCxuLkRFQ1JfV1JBUCksbi5jb2xvck1hc2soITEsITEsITEsITEpO2NvbnN0IGI9ISFzLGQ9a3QoYik7cyYmQ3QoZCxzKSxuLmVuYWJsZShuLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSksanQoZCxlLHQsYSksbi5kaXNhYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uTk9URVFVQUwsMCwyNTUpLG4uc3RlbmNpbE9wKG4uS0VFUCxuLlpFUk8sbi5aRVJPKSxuLmNvbG9yTWFzayghMCwhMCwhMCwhMCksci5zYXZlKCksci50cmFuc2Zvcm0oaVswXSxpWzFdLGlbMl0saVszXSxpWzRdLGlbNV0pO2NvbnN0IGY9ci4kc3RhY2tbci4kc3RhY2subGVuZ3RoLTFdLG09XyhyLiRtYXRyaXgpLHA9X3IoITAsQm9vbGVhbih1KSxjLGIpO3ByKHAsMSxmLG0sdSxzKSxyLnJlc3RvcmUoKSx2KG0pLGp0KHAsZSx0LGEpfSxFcj1uZXcgTWFwLEFyPShlLHQsYSxzKT0+e24uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wU2VwYXJhdGUobi5GUk9OVCxuLktFRVAsbi5LRUVQLG4uSU5DUl9XUkFQKSxuLnN0ZW5jaWxPcFNlcGFyYXRlKG4uQkFDSyxuLktFRVAsbi5LRUVQLG4uREVDUl9XUkFQKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSk7Y29uc3Qgbz0hIXMsaT1rdChvKTtzJiZDdChpLHMpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxqdChpLGUsdCxhKSxuLmRpc2FibGUobi5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpO2NvbnN0IGM9eW4uc2hpZnQoKSxsPXluLnNoaWZ0KCksdT15bi5zaGlmdCgpLGg9eW4uc2hpZnQoKSxiPXluLnNoaWZ0KCksZD15bi5zaGlmdCgpLGY9RW4odSxoLGMsZCk7ci5zYXZlKCksci50cmFuc2Zvcm0obFswXSxsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0pLG4uc3RlbmNpbEZ1bmMobi5OT1RFUVVBTCwwLDI1NSksbi5zdGVuY2lsT3Aobi5LRUVQLG4uWkVSTyxuLlpFUk8pLG4uY29sb3JNYXNrKCEwLCEwLCEwLCEwKTtjb25zdCBtPSgoZSx0KT0+e2NvbnN0IG49YGIke2U/InkiOiJuIn0ke3Q/InkiOiJuIn1gO2lmKEVyLmhhcyhuKSlyZXR1cm4gRXIuZ2V0KG4pO2NvbnN0IHI9ZT8iI3ZlcnNpb24gMzAwIGVzXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblxudW5pZm9ybSBzYW1wbGVyMkQgdV90ZXh0dXJlO1xudW5pZm9ybSB2ZWM0IHVfbWVkaXVtcFsxXTtcblxuaW4gdmVjMiB2X3V2O1xub3V0IHZlYzQgb19jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgdXYgPSBmcmFjdCh2ZWMyKHZfdXYueCwgLXZfdXYueSkgLyB1X21lZGl1bXBbMF0ueHkpO1xuICAgIFxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSI6IiN2ZXJzaW9uIDMwMCBlc1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbnVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4dHVyZTtcbnVuaWZvcm0gdmVjNCB1X21lZGl1bXBbMV07XG5cbmluIHZlYzIgdl91djtcbm91dCB2ZWM0IG9fY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gdmVjMih2X3V2LngsIHVfbWVkaXVtcFswXS55IC0gdl91di55KSAvIHVfbWVkaXVtcFswXS54eTtcblxuICAgIHZlYzQgc3JjID0gdGV4dHVyZSh1X3RleHR1cmUsIHV2KTtcbiAgICBvX2NvbG9yID0gc3JjO1xufSIsYT1uZXcgJHQoU3QodD8xNDo1LCEwLCExLHQpLHIpO3JldHVybiBFci5zZXQobixhKSxhfSkoYixvKTsoKGUsdCxuLGEpPT57Y29uc3Qgcz1lLmhpZ2hwLG89ci4kc3RhY2tbci4kc3RhY2subGVuZ3RoLTFdO3NbMF09b1swXSxzWzFdPW9bMV0sc1syXT1vWzJdLHNbNF09b1szXSxzWzVdPW9bNF0sc1s2XT1vWzVdLHNbOF09b1s2XSxzWzldPW9bN10sc1sxMF09b1s4XTtjb25zdCBpPV8oci4kbWF0cml4KTtzWzEyXT1pWzBdLHNbMTNdPWlbMV0sc1sxNF09aVsyXSxzWzE2XT1pWzNdLHNbMTddPWlbNF0sc1sxOF09aVs1XSxzWzExXT1pWzZdLHNbMTVdPWlbN10sc1sxOV09aVs4XSxzWzNdPXgoKSxzWzddPUUoKSxhJiYoc1syMF09YVswXSxzWzIxXT1hWzFdLHNbMjJdPTAsc1syNF09YVsyXSxzWzI1XT1hWzNdLHNbMjZdPTAsc1syOF09YVs0XSxzWzI5XT1hWzVdLHNbMzBdPTEsc1szMl09YVs2XSxzWzMzXT1hWzddLHNbMzRdPTAsc1szNl09YVs4XSxzWzM3XT1hWzldLHNbMzhdPTAsc1s0MF09YVsxMF0sc1s0MV09YVsxMV0sc1s0Ml09MSxzWzMxXT1hWzEyXSxzWzM1XT1hWzEzXSxzWzM5XT1hWzE0XSxzWzQzXT1hWzE1XSxzWzQ0XT1hWzE2XSxzWzQ1XT1hWzE3XSxzWzQ2XT1hWzE4XSxzWzQ3XT1hWzE5XSxzWzQ4XT1hWzIwXSxzWzQ5XT1hWzIxXSxzWzUwXT1hWzIyXSxzWzUxXT1hWzIzXSxzWzUyXT1hWzI0XSxzWzUzXT1hWzI1XSk7Y29uc3QgYz1lLm1lZGl1bXA7Y1swXT10LGNbMV09bn0pKG0sdSxoLHMpLGp0KG0sZSx0LGEpLHIucmVzdG9yZSgpLFUoZil9O2xldCB5cj0wO2NvbnN0IFRyPWFzeW5jKGUsdCk9Pntjb25zdCBhPWxuKDAsMCxlLHQpO1NlKGEpLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsVGUpLG4uZnJhbWVidWZmZXJUZXh0dXJlMkQobi5GUkFNRUJVRkZFUixuLkNPTE9SX0FUVEFDSE1FTlQwLG4uVEVYVFVSRV8yRCxhLnJlc291cmNlLDApO2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkoZSp0KjQpLG89ci4kbWFpbkF0dGFjaG1lbnRPYmplY3Q7cy5ieXRlTGVuZ3RoPnlyJiYoeXI9YyhzLmJ5dGVMZW5ndGgpLG4uYnVmZmVyRGF0YShuLlBJWEVMX1BBQ0tfQlVGRkVSLHlyLG4uU1RSRUFNX1JFQUQpKSxuLnJlYWRQaXhlbHMoMCxvLmhlaWdodC10LGUsdCxuLlJHQkEsbi5VTlNJR05FRF9CWVRFLDApO2NvbnN0IGk9bi5mZW5jZVN5bmMobi5TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwwKTthd2FpdCBuZXcgUHJvbWlzZShlPT57Y29uc3QgdD0oKT0+e2lmKG4uY2xpZW50V2FpdFN5bmMoaSxuLlNZTkNfRkxVU0hfQ09NTUFORFNfQklULDApIT09bi5USU1FT1VUX0VYUElSRUQpcmV0dXJuIG4uZGVsZXRlU3luYyhpKSxuLmdldEJ1ZmZlclN1YkRhdGEobi5QSVhFTF9QQUNLX0JVRkZFUiwwLHMpLGUoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9O3QoKX0pLG4uYmluZEZyYW1lYnVmZmVyKG4uRlJBTUVCVUZGRVIsZGUpO2NvbnN0IGw9bmV3IE9mZnNjcmVlbkNhbnZhcyhlLHQpLHU9bC5nZXRDb250ZXh0KCIyZCIpLGg9bmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkocyksZSx0KTtyZXR1cm4gdS5wdXRJbWFnZURhdGEoaCwwLDApLGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGwse2ltYWdlT3JpZW50YXRpb246ImZsaXBZIn0pfTtjbGFzcyBScntjb25zdHJ1Y3RvcihhLHMsaT0xKXt2YXIgYztPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJHN0YWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRtYXRyaXgiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JSIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRjbGVhckNvbG9yRyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkY2xlYXJDb2xvckIiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGNsZWFyQ29sb3JBIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIiRtYWluQXR0YWNobWVudE9iamVjdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3RhY2tBdHRhY2htZW50T2JqZWN0Iix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbEFscGhhIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpbWFnZVNtb290aGluZ0VuYWJsZWQiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiJGZpbGxTdHlsZSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCIkc3Ryb2tlU3R5bGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWFza0JvdW5kcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0aGlja25lc3MiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY2FwcyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJqb2ludHMiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibWl0ZXJMaW1pdCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnZvaWQgMH0pLChlPT57bj1lfSkoYSksYz1hLmdldFBhcmFtZXRlcihhLk1BWF9URVhUVVJFX1NJWkUpLGU9TWF0aC5taW4oNDA5NixjLzIpLChlPT57dD1lfSkocyksKGU9PntBPWV9KShpKSx0aGlzLiRzdGFjaz1vKCksdGhpcy4kc3RhY2tBdHRhY2htZW50T2JqZWN0PW8oKSx0aGlzLiRtYXRyaXg9ZCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpcy4kY2xlYXJDb2xvclI9MCx0aGlzLiRjbGVhckNvbG9yRz0wLHRoaXMuJGNsZWFyQ29sb3JCPTAsdGhpcy4kY2xlYXJDb2xvckE9MCx0aGlzLnRoaWNrbmVzcz0xLHRoaXMuY2Fwcz0xLHRoaXMuam9pbnRzPTIsdGhpcy5taXRlckxpbWl0PTAsdGhpcy4kbWFpbkF0dGFjaG1lbnRPYmplY3Q9bnVsbCx0aGlzLmdsb2JhbEFscGhhPTEsdGhpcy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Im5vcm1hbCIsdGhpcy5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITEsdGhpcy4kZmlsbFN0eWxlPW5ldyBGbG9hdDMyQXJyYXkoWzEsMSwxLDFdKSx0aGlzLiRzdHJva2VTdHlsZT1uZXcgRmxvYXQzMkFycmF5KFsxLDEsMSwxXSksdGhpcy5tYXNrQm91bmRzPXt4TWluOjAseU1pbjowLHhNYXg6MCx5TWF4OjB9LGEucGl4ZWxTdG9yZWkoYS5VTlBBQ0tfQUxJR05NRU5ULDEpLGEucGl4ZWxTdG9yZWkoYS5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCEwKSwoZT0+e2RlPWUuY3JlYXRlRnJhbWVidWZmZXIoKX0pKGEpLChlPT57ZmU9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpfSkoYSksKGU9PnttZT1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksZS5iaW5kRnJhbWVidWZmZXIoZS5GUkFNRUJVRkZFUixtZSk7Y29uc3QgdD1hZSgpO2UuZnJhbWVidWZmZXJUZXh0dXJlMkQoZS5GUkFNRUJVRkZFUixlLkNPTE9SX0FUVEFDSE1FTlQwLGUuVEVYVFVSRV8yRCx0LnJlc291cmNlLDApLGUuYmluZEZyYW1lYnVmZmVyKGUuRlJBTUVCVUZGRVIsbnVsbCksZS5iaW5kRnJhbWVidWZmZXIoZS5EUkFXX0ZSQU1FQlVGRkVSLG1lKX0pKGEpLChlPT57eWU9ZS5jcmVhdGVGcmFtZWJ1ZmZlcigpLEFlPWUuY3JlYXRlRnJhbWVidWZmZXIoKSxUZT1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksUmU9ZS5jcmVhdGVCdWZmZXIoKSxlLmJpbmRCdWZmZXIoZS5QSVhFTF9QQUNLX0JVRkZFUixSZSl9KShhKSx4bihhKSxuLmVuYWJsZShuLkJMRU5EKSxEdCgpLChlPT57Vm49TWF0aC5mbG9vciguNzUqZS5nZXRQYXJhbWV0ZXIoZS5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTKSl9KShhKSxyPXRoaXN9Y2xlYXJUcmFuc2ZlckJvdW5kcygpeygoKT0+e2ZvcihsZXQgZT0wO2U8c2UubGVuZ3RoOysrZSl7Y29uc3QgdD1zZVtlXTt0JiYodFswXT10WzFdPU51bWJlci5NQVhfVkFMVUUsdFsyXT10WzNdPS1OdW1iZXIuTUFYX1ZBTFVFKX1mb3IobGV0IGU9MDtlPGllLmxlbmd0aDsrK2Upe2NvbnN0IHQ9aWVbZV07dCYmKHRbMF09dFsxXT1OdW1iZXIuTUFYX1ZBTFVFLHRbMl09dFszXT0tTnVtYmVyLk1BWF9WQUxVRSl9fSkoKX11cGRhdGVCYWNrZ3JvdW5kQ29sb3IoZSx0LG4scil7KChlLHQsbixyLHMpPT57ZS4kY2xlYXJDb2xvclI9YSh0LDAsMSwwKSxlLiRjbGVhckNvbG9yRz1hKG4sMCwxLDApLGUuJGNsZWFyQ29sb3JCPWEociwwLDEsMCksZS4kY2xlYXJDb2xvckE9YShzLDAsMSwwKX0pKHRoaXMsZSx0LG4scil9ZmlsbEJhY2tncm91bmRDb2xvcigpe3ZhciBlLHQscixhO2U9dGhpcy4kY2xlYXJDb2xvclIsdD10aGlzLiRjbGVhckNvbG9yRyxyPXRoaXMuJGNsZWFyQ29sb3JCLGE9dGhpcy4kY2xlYXJDb2xvckEsbi5jbGVhckNvbG9yKGUsdCxyLGEpLG4uY2xlYXIobi5DT0xPUl9CVUZGRVJfQklUfG4uU1RFTkNJTF9CVUZGRVJfQklUKSxuLmNsZWFyQ29sb3IoMCwwLDAsMCl9cmVzaXplKGUsdCxuPSEwKXskZSh0aGlzLGUsdCxuKX1jbGVhclJlY3QoZSx0LHIsYSl7KChlLHQscixhKT0+e24uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoZSx0LHIsYSksbi5jbGVhcihuLkNPTE9SX0JVRkZFUl9CSVR8bi5TVEVOQ0lMX0JVRkZFUl9CSVQpLG4uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9KShlLHQscixhKX1iaW5kKGUpe1VlKHRoaXMsZSl9c2F2ZSgpe3ZhciBlOyhlPXRoaXMpLiRzdGFjay5wdXNoKGQoLi4uZS4kbWF0cml4KSl9cmVzdG9yZSgpe05lKHRoaXMpfXNldFRyYW5zZm9ybShlLHQsbixyLGEscyl7KChlLHQsbixyLGEscyxvKT0+e2VbMF09dCxlWzFdPW4sZVszXT1yLGVbNF09YSxlWzZdPXMsZVs3XT1vfSkodGhpcy4kbWF0cml4LGUsdCxuLHIsYSxzKX10cmFuc2Zvcm0oZSx0LG4scixhLHMpeygoZSx0LG4scixhLHMsbyk9Pntjb25zdCBpPWUuJG1hdHJpeFswXSxjPWUuJG1hdHJpeFsxXSxsPWUuJG1hdHJpeFszXSx1PWUuJG1hdHJpeFs0XSxoPWUuJG1hdHJpeFs2XSxiPWUuJG1hdHJpeFs3XTtlLiRtYXRyaXhbMF09dCppK24qbCxlLiRtYXRyaXhbMV09dCpjK24qdSxlLiRtYXRyaXhbM109cippK2EqbCxlLiRtYXRyaXhbNF09cipjK2EqdSxlLiRtYXRyaXhbNl09cyppK28qbCtoLGUuJG1hdHJpeFs3XT1zKmMrbyp1K2J9KSh0aGlzLGUsdCxuLHIsYSxzKX1yZXNldCgpe3ZhciBlOyhlPXRoaXMpLmdsb2JhbEFscGhhPTEsZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249Im5vcm1hbCIsZS5pbWFnZVNtb290aGluZ0VuYWJsZWQ9ITF9YmVnaW5QYXRoKCl7dmFyIGU7KGU9dGhpcykuJGZpbGxTdHlsZS5maWxsKDEpLGUuJHN0cm9rZVN0eWxlLmZpbGwoMSksKCgpPT57Zm9yKFIubGVuZ3RoPTA7TS5sZW5ndGg7KWkoTS5wb3AoKSl9KSgpfW1vdmVUbyhlLHQpe08oZSx0KX1saW5lVG8oZSx0KXsoKGUsdCk9PntSLmxlbmd0aHx8TyhlLHQpLCQoZSx0KXx8RihlLHQsITEpfSkoZSx0KX1xdWFkcmF0aWNDdXJ2ZVRvKGUsdCxuLHIpe1MoZSx0LG4scil9ZmlsbFN0eWxlKGUsdCxuLHIpe3RoaXMuJGZpbGxTdHlsZVswXT1lLHRoaXMuJGZpbGxTdHlsZVsxXT10LHRoaXMuJGZpbGxTdHlsZVsyXT1uLHRoaXMuJGZpbGxTdHlsZVszXT1yfXN0cm9rZVN0eWxlKGUsdCxuLHIpe3RoaXMuJHN0cm9rZVN0eWxlWzBdPWUsdGhpcy4kc3Ryb2tlU3R5bGVbMV09dCx0aGlzLiRzdHJva2VTdHlsZVsyXT1uLHRoaXMuJHN0cm9rZVN0eWxlWzNdPXJ9Y2xvc2VQYXRoKCl7KCgpPT57aWYoUi5sZW5ndGg8NylyZXR1cm47Y29uc3QgZT0rUlswXSx0PStSWzFdOyQoZSx0KXx8RihlLHQsITEpfSkoKX1hcmMoZSx0LG4peygoZSx0LG4pPT57Y29uc3Qgcj1uLGE9LjU1MjI4NDc0OTgzMDc5MzYqbjtCKGUrcix0K2EsZSthLHQrcixlLHQrciksQihlLWEsdCtyLGUtcix0K2EsZS1yLHQpLEIoZS1yLHQtYSxlLWEsdC1yLGUsdC1yKSxCKGUrYSx0LXIsZStyLHQtYSxlK3IsdCl9KShlLHQsbil9YmV6aWVyQ3VydmVUbyhlLHQsbixyLGEscyl7QihlLHQsbixyLGEscyl9ZmlsbCgpeyhlPT57Y29uc3QgdD13KCk7aWYoIXQubGVuZ3RoKXJldHVybjtZZS5wdXNoKGUpO2NvbnN0IG49WGUodCk7V2Uobi5idWZmZXIpLEdlLnB1c2gobi5pbmRleENvdW50KX0pKCJmaWxsIil9Z3JhZGllbnRGaWxsKGUsdCxuLHIsYSxzKXsoKGUsdCxuLHIsYSxzKT0+e2NvbnN0IG89dygpO2lmKCFvLmxlbmd0aClyZXR1cm47WWUucHVzaCgwPT09ZT8ibGluZWFyIjoicmFkaWFsIik7Y29uc3QgaT1YZShvKTtXZShpLmJ1ZmZlciksR2UucHVzaChpLmluZGV4Q291bnQpLEtlLnB1c2godCxuLHIsYSksMT09PWUmJktlLnB1c2gocyl9KShlLHQsbixyLGEscyl9Yml0bWFwRmlsbChlLHQsbixyLGEscyl7KChlLHQsbixyLGEscyk9Pntjb25zdCBvPXcoKTtpZighby5sZW5ndGgpcmV0dXJuO1llLnB1c2goImJpdG1hcCIpO2NvbnN0IGk9WGUobyk7V2UoaS5idWZmZXIpLEdlLnB1c2goaS5pbmRleENvdW50KSx5bi5wdXNoKGUsdCxuLHIsYSxzKX0pKGUsdCxuLHIsYSxzKX1zdHJva2UoKXsoKCk9Pntjb25zdCBlPXcoITApO2lmKCFlLmxlbmd0aClyZXR1cm47WWUucHVzaCgiZmlsbCIpO2NvbnN0IHQ9aHQoZSk7V2UodC5idWZmZXIpLEdlLnB1c2godC5pbmRleENvdW50KX0pKCl9Z3JhZGllbnRTdHJva2UoZSx0LG4scixhLHMpeygoZSx0LG4scixhLHMpPT57Y29uc3Qgbz13KCk7aWYoIW8ubGVuZ3RoKXJldHVybjtZZS5wdXNoKDA9PT1lPyJsaW5lYXIiOiJyYWRpYWwiKTtjb25zdCBpPWh0KG8pO1dlKGkuYnVmZmVyKSxHZS5wdXNoKGkuaW5kZXhDb3VudCksS2UucHVzaCh0LG4scixhKSwxPT09ZSYmS2UucHVzaChzKX0pKGUsdCxuLHIsYSxzKX1iaXRtYXBTdHJva2UoZSx0LG4scixhLHMpeygoZSx0LG4scixhLHMpPT57Y29uc3Qgbz13KCEwKTtpZighby5sZW5ndGgpcmV0dXJuO1llLnB1c2goImJpdG1hcCIpO2NvbnN0IGk9aHQobyk7V2UoaS5idWZmZXIpLEdlLnB1c2goaS5pbmRleENvdW50KSx5bi5wdXNoKGUsdCxuLHIsYSxzKX0pKGUsdCxuLHIsYSxzKX1jbGlwKCl7KCgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2lmKCFlKXJldHVybjtjb25zdCB0PUllLmdldChlLmNsaXBMZXZlbCksYT10WzBdLHM9dFsxXSxvPXRbMl0saT10WzNdLGM9TWF0aC5jZWlsKE1hdGguYWJzKG8tYSkpLGw9TWF0aC5jZWlsKE1hdGguYWJzKGktcykpO24uZW5hYmxlKG4uU0NJU1NPUl9URVNUKSxuLnNjaXNzb3IoYSxlLmhlaWdodC1zLWwsYyxsKTtjb25zdCB1PVJ0KCk7bGV0IGg9TGUuZ2V0KGUuY2xpcExldmVsKSxiPTAsZD1udWxsO2NvbnN0IGY9R2UubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8Zjt0Kyspe24uc3RlbmNpbE1hc2soMTw8aC0xKTtjb25zdCByPUdlW3RdO2J0Lmhhcyh0KSYmKGQ9YnQuZ2V0KHQpKTtjb25zdCBhPWt0KCEhZCk7ZCYmQ3QoYSxkKSxqdChhLHUsYixyKSxiKz1yLCsraCxoPjcmJih6dCgpLGg9ZS5jbGlwTGV2ZWwrMSl9TGUuc2V0KGUuY2xpcExldmVsLGgpLE10KHUpLHFlKCksZHQoKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpfSkoKX1nZXQgY3VycmVudEF0dGFjaG1lbnRPYmplY3QoKXtyZXR1cm4gcGUoKX1nZXQgYXRsYXNBdHRhY2htZW50T2JqZWN0KCl7cmV0dXJuIHRlKCl9Y3JlYXRlTm9kZShlLHQpe3JldHVybiBHdChlLHQpfXJlbW92ZU5vZGUoZSl7KGU9Pntjb25zdCB0PW5lW2UuaW5kZXhdO3QmJnQuZGlzcG9zZShlLngsZS55LGUudyxlLmgpfSkoZSl9YmVnaW5Ob2RlUmVuZGVyaW5nKGUpeyhlPT57Y29uc3QgdD1vZShlLmluZGV4KSxuPXRbMF0scj10WzFdLGE9dFsyXSxzPXRbM107dFswXT1NYXRoLm1pbihlLngsbiksdFsxXT1NYXRoLm1pbihlLnksciksdFsyXT1NYXRoLm1heChlLngrZS53LGEpLHRbM109TWF0aC5tYXgoZS55K2UuaCxzKX0pKGUpLERlKGUueCxlLnksZS53LGUuaCl9ZW5kTm9kZVJlbmRlcmluZygpe24uZGlzYWJsZShuLlNDSVNTT1JfVEVTVCl9ZHJhd0ZpbGwoKXsoKCk9Pntjb25zdCBlPVJ0KCk7bi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZnJvbnRGYWNlKG4uQ0NXKSxuLnN0ZW5jaWxNYXNrKDI1NSk7bGV0IHQ9MCxyPW51bGw7Zm9yKGxldCBuPTA7bjxZZS5sZW5ndGg7bisrKXN3aXRjaChidC5oYXMobikmJihyPWJ0LmdldChuKSksWWVbbl0pe2Nhc2UiZmlsbCI6e2NvbnN0IG49R2Uuc2hpZnQoKTtkcihlLHQsbixyKSx0Kz1ufWJyZWFrO2Nhc2UibGluZWFyIjp7Y29uc3Qgbj1HZS5zaGlmdCgpO2dyKGUsdCxuLHIpLHQrPW59YnJlYWs7Y2FzZSJyYWRpYWwiOntjb25zdCBuPUdlLnNoaWZ0KCk7eHIoZSx0LG4sciksdCs9bn1icmVhaztjYXNlImJpdG1hcCI6e2NvbnN0IG49R2Uuc2hpZnQoKTtBcihlLHQsbixyKSx0Kz1ufX1uLmRpc2FibGUobi5TVEVOQ0lMX1RFU1QpLE10KGUpLHFlKCksZHQoKX0pKCl9ZHJhd0Rpc3BsYXlPYmplY3QodCxuLGEscyxvLGkpeyhlPT57Y29uc3QgdD1jZShlLmluZGV4KSxuPXRbMF0scj10WzFdLGE9dFsyXSxzPXRbM107dFswXT1NYXRoLm1pbihlLngsbiksdFsxXT1NYXRoLm1pbihlLnksciksdFsyXT1NYXRoLm1heChlLngrZS53LGEpLHRbM109TWF0aC5tYXgoZS55K2UuaCxzKX0pKHQpLCgodCxuLGEscyxvLGkpPT57Y29uc3QgYz1pWzBdLGw9aVsxXSx1PWlbMl0saD1yLmdsb2JhbEFscGhhLGI9aVs0XS8yNTUsZD1pWzVdLzI1NSxmPWlbNl0vMjU1LHY9ci4kbWF0cml4O3N3aXRjaChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbil7Y2FzZSJub3JtYWwiOmNhc2UibGF5ZXIiOmNhc2UiYWRkIjpjYXNlInNjcmVlbiI6Y2FzZSJhbHBoYSI6Y2FzZSJlcmFzZSI6Y2FzZSJjb3B5Ijp7aWYoSXQoKSE9PXIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9ufHxoZSgpIT09dC5pbmRleCl7UShoZSgpKTtjb25zdCBlPXIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO3IuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPUl0KCksci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ZSxCdChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksdWUodC5pbmRleCksUSh0LmluZGV4KX1jb25zdCBuPVF0KCk7S3QucHVzaCh0LngvZSx0LnkvZSx0LncvZSx0LmgvZSx0LncsdC5oLHgoKSxFKCksdls2XSx2WzddLHZbMF0sdlsxXSx2WzNdLHZbNF0sYyxsLHUsaCxiLGQsZiwwKSxuLmNvdW50Kyt9YnJlYWs7ZGVmYXVsdDp7Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O3IuZHJhd0FycmF5c0luc3RhbmNlZCgpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGguYWJzKHMtbikpLF89TWF0aC5jZWlsKE1hdGguYWJzKG8tYSkpO2xldCBwPTAsZz0wLHg9bm4odCk7aWYoMSE9PXZbMF18fDAhPT12WzFdfHwwIT09dlszXXx8MSE9PXZbNF0pe2NvbnN0IG49SChpLF8sITEpLGE9bSh2WzBdLHZbMV0sdlszXSx2WzRdLGkvMixfLzIpLHM9bSgxLDAsMCwxLC10LncvMiwtdC5oLzIpLG89bShhWzBdKnNbMF0rYVsyXSpzWzFdLGFbMV0qc1swXSthWzNdKnNbMV0sYVswXSpzWzJdK2FbMl0qc1szXSxhWzFdKnNbMl0rYVszXSpzWzNdLGFbMF0qc1s0XSthWzJdKnNbNV0rYVs0XSxhWzFdKnNbNF0rYVszXSpzWzVdK2FbNV0pO3Iuc2F2ZSgpLHIuYmluZChuKSxyLnNldFRyYW5zZm9ybShvWzBdLG9bMV0sb1syXSxvWzNdLG9bNF0sb1s1XSkscD1vWzRdLGc9b1s1XTtjb25zdCBjPWZuKCk7bW4oYyx4LndpZHRoLHguaGVpZ2h0KSxTZSh4LCEwKSxvbihjKSxVKHgpLHg9bi50ZXh0dXJlLHdlKG4sITEpLGUmJnIuYmluZChlKSxyLnJlc3RvcmUoKX0ocHx8ZykmJih2WzZdLT1wLHZbN10tPWcpO2NvbnN0IEU9dW4odls2XSx2WzddLGksXyksQT1IKGksXywhMSk7ci5iaW5kKEEpLHJuKEUseCk7Y29uc3QgeT1KdChyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbik7ZG4oeSxjLGwsdSxoLGIsZCxmLDApLG9uKHkpLGUmJnIuYmluZChlKSxibihBLnRleHR1cmUpLChwfHxnKSYmKHZbNl0rPXAsdls3XSs9ZyksVSh4KSxVKEUpLHdlKEEpLEJ0KHIuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uKSx1ZSh0LmluZGV4KSxRKHQuaW5kZXgpfX19KSh0LG4sYSxzLG8saSl9ZHJhd0FycmF5c0luc3RhbmNlZCgpeygoKT0+e2NvbnN0IGU9UXQoKTtlLmNvdW50JiYodG4oKSxnbihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiksX24oZSksZS5jbGVhcigpKX0pKCl9Y2xlYXJBcnJheXNJbnN0YW5jZWQoKXtRdCgpLmNsZWFyKCl9dHJhbnNmZXJNYWluQ2FudmFzKCl7KCgpPT57Y29uc3QgZT1yLiRtYWluQXR0YWNobWVudE9iamVjdDtyLmJpbmQoZSksbi5iaW5kRnJhbWVidWZmZXIobi5SRUFEX0ZSQU1FQlVGRkVSLGRlKSxuLmJpbmRGcmFtZWJ1ZmZlcihuLkRSQVdfRlJBTUVCVUZGRVIsbnVsbCk7Y29uc3QgdD1lLndpZHRoLGE9ZS5oZWlnaHQ7bi5ibGl0RnJhbWVidWZmZXIoMCwwLHQsYSwwLDAsdCxhLG4uQ09MT1JfQlVGRkVSX0JJVCxuLk5FQVJFU1QpLG4uYmluZEZyYW1lYnVmZmVyKG4uRFJBV19GUkFNRUJVRkZFUixmZSksbi5iaW5kRnJhbWVidWZmZXIobi5GUkFNRUJVRkZFUixkZSl9KSgpfWRyYXdQaXhlbHMoZSx0KXsoKGUsdCk9Pntjb25zdCBuPUVuKGUudyxlLmgsdCkscj1hbigpO3NuKHIsZS53LGUuaCksRHQoKSxvbihyKSxVKG4pfSkoZSx0KX1kcmF3RWxlbWVudChlLHQpe0FuKGUsdCl9YmVnaW5NYXNrKCl7KCgpPT57Y29uc3QgZT1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O2UmJihlLm1hc2s9ITAsZS5jbGlwTGV2ZWwrKyxMZS5zZXQoZS5jbGlwTGV2ZWwsZS5jbGlwTGV2ZWwpLEJlKCl8fChQZSghMCksbi5lbmFibGUobi5TVEVOQ0lMX1RFU1QpLG4uZW5hYmxlKG4uU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKSxuLnN0ZW5jaWxGdW5jKG4uQUxXQVlTLDAsMjU1KSxuLnN0ZW5jaWxPcChuLlpFUk8sbi5JTlZFUlQsbi5JTlZFUlQpLG4uY29sb3JNYXNrKCExLCExLCExLCExKSkpfSkoKX1zZXRNYXNrQm91bmRzKGUsdCxhLHMpeygoZSx0LGEscyk9Pntjb25zdCBvPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIW8pcmV0dXJuO0llLnNldChvLmNsaXBMZXZlbCx1KGUsdCxhLHMpKTtjb25zdCBpPU1hdGguY2VpbChNYXRoLmFicyhhLWUpKSxjPU1hdGguY2VpbChNYXRoLmFicyhzLXQpKTtuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKGUsby5oZWlnaHQtdC1jLGksYyl9KShlLHQsYSxzKX1lbmRNYXNrKCl7a2UoKX1sZWF2ZU1hc2soKXt0aGlzLmRyYXdBcnJheXNJbnN0YW5jZWQoKSwoKCk9Pntjb25zdCBlPXIuY3VycmVudEF0dGFjaG1lbnRPYmplY3Q7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS5jbGlwTGV2ZWwsYT1JZS5nZXQodCkscz1hWzBdLG89YVsxXSxpPWFbMl0sYz1hWzNdO0llLmRlbGV0ZSh0KSxMZS5kZWxldGUodCksaChhKTtjb25zdCBsPU1hdGguY2VpbChNYXRoLmFicyhpLXMpKSx1PU1hdGguY2VpbChNYXRoLmFicyhjLW8pKTtpZihuLmVuYWJsZShuLlNDSVNTT1JfVEVTVCksbi5zY2lzc29yKHMsZS5oZWlnaHQtby11LGwsdSksLS1lLmNsaXBMZXZlbCwhZS5jbGlwTGV2ZWwpcmV0dXJuIGUubWFzaz0hMSxQZSghMSksbi5jbGVhcihuLlNURU5DSUxfQlVGRkVSX0JJVCksbi5kaXNhYmxlKG4uU1RFTkNJTF9URVNUKSxuLmRpc2FibGUobi5TQ0lTU09SX1RFU1QpLExlLmNsZWFyKCksdm9pZCBJZS5jbGVhcigpO24uc3RlbmNpbE1hc2soMTw8ZS5jbGlwTGV2ZWwpLG4uc3RlbmNpbEZ1bmMobi5BTFdBWVMsMCwyNTUpLG4uc3RlbmNpbE9wKG4uUkVQTEFDRSxuLlJFUExBQ0Usbi5SRVBMQUNFKSxuLmNvbG9yTWFzayghMSwhMSwhMSwhMSksanQoWHQoKSxUdCgpLDAsNiksa2UoKX0pKCl9dXNlR3JpZChlKXsoZT0+e2J0LnNldChHZS5sZW5ndGgsZSl9KShlKX1hcHBseUZpbHRlcihlLHQsbixyLGEscyxvLGksYyxsLHUpe3RoaXMuZHJhd0FycmF5c0luc3RhbmNlZCgpLGJyKGUsdCxuLHIsYSxzLG8saSxjLGwsdSl9YXN5bmMgY3JlYXRlSW1hZ2VCaXRtYXAoZSx0KXtyZXR1cm4gYXdhaXQgVHIoZSx0KX19bGV0IE1yO2xldCB3cjtsZXQgRnI9MDtsZXQgJHI9MDtsZXQgT3I9ITE7Y29uc3QgU3I9W10sa3I9KC4uLmUpPT57Y29uc3QgdD1Tci5wb3AoKXx8W107cmV0dXJuIGUubGVuZ3RoJiZ0LnB1c2goLi4uZSksdH0sQ3I9KGUsdD0xKT0+KHtSOigxNjcxMTY4MCZlKT4+MTYsRzooNjUyODAmZSk+PjgsQjoyNTUmZSxBOjI1NSp0fSksUHI9KGUsdCk9PnsoZT0+e3dyPWV9KShlKTtjb25zdCBuPWUuZ2V0Q29udGV4dCgid2ViZ2wyIix7c3RlbmNpbDohMCxwcmVtdWx0aXBsaWVkQWxwaGE6ITAsYW50aWFsaWFzOiExLGRlcHRoOiExfSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJ3ZWJnbDIgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgcjtyPW5ldyBScihuLDQsdCksTXI9cn0sQnI9KGUsdCxuPSEwKT0+e0ZyPT09ZSYmJHI9PT10fHwoT3I9ITAsRnI9ZSwkcj10LE1yLnJlc2l6ZShlLHQsbiksbiYmaHIucmVzZXQoKSl9LElyPShlLHQ9ITEpPT57bGV0IG49MDtmb3IoO2UubGVuZ3RoPm47KXN3aXRjaChlW24rK10pe2Nhc2UgOTpNci5iZWdpblBhdGgoKTticmVhaztjYXNlIDA6TXIubW92ZVRvKGVbbisrXSxlW24rK10pO2JyZWFrO2Nhc2UgMjpNci5saW5lVG8oZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxOk1yLnF1YWRyYXRpY0N1cnZlVG8oZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDU6aWYodCl7bis9NDticmVha31Nci5maWxsU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA3Ok1yLmZpbGwoKTticmVhaztjYXNlIDY6aWYodCl7bis9ODticmVha31Nci50aGlja25lc3M9ZVtuKytdLE1yLmNhcHM9ZVtuKytdLE1yLmpvaW50cz1lW24rK10sTXIubWl0ZXJMaW1pdD1lW24rK10sTXIuc3Ryb2tlU3R5bGUoZVtuKytdLzI1NSxlW24rK10vMjU1LGVbbisrXS8yNTUsZVtuKytdLzI1NSk7YnJlYWs7Y2FzZSA4OmlmKHQpYnJlYWs7TXIuc3Ryb2tlKCk7YnJlYWs7Y2FzZSAxMjpNci5jbG9zZVBhdGgoKTticmVhaztjYXNlIDQ6TXIuYXJjKGVbbisrXSxlW24rK10sZVtuKytdKTticmVhaztjYXNlIDM6TXIuYmV6aWVyQ3VydmVUbyhlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7YnJlYWs7Y2FzZSAxMDp7aWYodCl7bis9MTtjb25zdCB0PWVbbisrXTtuKz01KnQsbis9OSxNci5maWxsKCk7YnJlYWt9Y29uc3Qgcj1lW24rK10sYT1rcigpLHM9ZVtuKytdO2ZvcihsZXQgdD0wO3Q8czsrK3QpYS5wdXNoKGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10pO2NvbnN0IG89bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKSxpPWVbbisrXSxjPWVbbisrXSxsPWVbbisrXTtNci5ncmFkaWVudEZpbGwocixhLG8saSxjLGwpfWJyZWFrO2Nhc2UgMTM6e2lmKHQpe24rPTI7Y29uc3QgdD1lW24rK107bis9dCxuKz04LE1yLmZpbGwoKTticmVha31jb25zdCByPWVbbisrXSxhPWVbbisrXSxzPWVbbisrXSxvPW5ldyBVaW50OEFycmF5KGUuc3ViYXJyYXkobixuK3MpKTtuKz1zO2NvbnN0IGk9bmV3IEZsb2F0MzJBcnJheShbZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSxlW24rK11dKTtNci5iaXRtYXBGaWxsKG8saSxyLGEsQm9vbGVhbihlW24rK10pLEJvb2xlYW4oZVtuKytdKSl9YnJlYWs7Y2FzZSAxMTp7aWYodCl7bis9MjAsTXIuZmlsbCgpO2JyZWFrfU1yLnRoaWNrbmVzcz1lW24rK10sTXIuY2Fwcz1lW24rK10sTXIuam9pbnRzPWVbbisrXSxNci5taXRlckxpbWl0PWVbbisrXTtjb25zdCByPWVbbisrXSxhPWtyKCkscz1lW24rK107Zm9yKGxldCB0PTA7dDxzOysrdClhLnB1c2goZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXSk7Y29uc3Qgbz1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pLGk9ZVtuKytdLGM9ZVtuKytdLGw9ZVtuKytdO01yLmdyYWRpZW50U3Ryb2tlKHIsYSxvLGksYyxsKX1icmVhaztjYXNlIDE0OntpZih0KXtuKz02O2NvbnN0IHQ9ZVtuKytdO24rPXQsbis9OCxNci5maWxsKCk7YnJlYWt9TXIudGhpY2tuZXNzPWVbbisrXSxNci5jYXBzPWVbbisrXSxNci5qb2ludHM9ZVtuKytdLE1yLm1pdGVyTGltaXQ9ZVtuKytdO2NvbnN0IHI9ZVtuKytdLGE9ZVtuKytdLHM9ZVtuKytdLG89bmV3IFVpbnQ4QXJyYXkoZS5zdWJhcnJheShuLG4rcykpO24rPXM7Y29uc3QgaT1uZXcgRmxvYXQzMkFycmF5KFtlW24rK10sZVtuKytdLGVbbisrXSxlW24rK10sZVtuKytdLGVbbisrXV0pO01yLmJpdG1hcFN0cm9rZShvLGkscixhLEJvb2xlYW4oZVtuKytdKSxCb29sZWFuKGVbbisrXSkpfX19LExyPWU9Pntzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiJjb3B5IjtjYXNlIDE6cmV0dXJuImFkZCI7Y2FzZSAyOnJldHVybiJhbHBoYSI7Y2FzZSAzOnJldHVybiJkYXJrZW4iO2Nhc2UgNDpyZXR1cm4iZGlmZmVyZW5jZSI7Y2FzZSA1OnJldHVybiJlcmFzZSI7Y2FzZSA2OnJldHVybiJoYXJkbGlnaHQiO2Nhc2UgNzpyZXR1cm4iaW52ZXJ0IjtjYXNlIDg6cmV0dXJuImxheWVyIjtjYXNlIDk6cmV0dXJuImxpZ2h0ZW4iO2Nhc2UgMTA6cmV0dXJuIm11bHRpcGx5IjtjYXNlIDExOmRlZmF1bHQ6cmV0dXJuIm5vcm1hbCI7Y2FzZSAxMjpyZXR1cm4ib3ZlcmxheSI7Y2FzZSAxMzpyZXR1cm4ic2NyZWVuIjtjYXNlIDE0OnJldHVybiJzdWJ0cmFjdCJ9fSxVcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9Njtjb25zdCByPWUuc3ViYXJyYXkodCx0KzgpO3QrPTg7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IHM9ZVt0KytdLG89ZVt0KytdLGk9ZVt0KytdLGM9ZVt0KytdLGw9Qm9vbGVhbihlW3QrK10pLHU9Qm9vbGVhbihlW3QrK10pLGg9Qm9vbGVhbihlW3QrK10pLGI9YCR7ZVt0KytdfWAsZD1lW3QrK10sZj1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXSksbT1NYXRoLnNxcnQoblsyXSpuWzJdK25bM10qblszXSk7bGV0IHY7aWYoZVt0KytdKXtpZih2PWhyLmdldChiLGAke2R9YCksIXYpcmV0dXJuIHR9ZWxzZXtjb25zdCBuPWw/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtuJiYobi5zZXQoZS5zdWJhcnJheSh0LHQrMjQpKSx0Kz0yNCksTXIudXNlR3JpZChuKTtjb25zdCByPWVbdCsrXSxhPWUuc3ViYXJyYXkodCx0K3IpO2lmKGgmJiFsKXtjb25zdCBlPU1hdGguY2VpbChNYXRoLmFicyhpLXMpKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLW8pKTt2PU1yLmNyZWF0ZU5vZGUoZSx0KSxoci5zZXQoYixgJHtkfWAsdik7Y29uc3Qgbj1Nci5jdXJyZW50QXR0YWNobWVudE9iamVjdDtNci5iaW5kKE1yLmF0bGFzQXR0YWNobWVudE9iamVjdCksTXIucmVzZXQoKSxNci5iZWdpbk5vZGVSZW5kZXJpbmcodik7Y29uc3Qgcj1Nci5hdGxhc0F0dGFjaG1lbnRPYmplY3QuaGVpZ2h0LXYueS10O01yLnNldFRyYW5zZm9ybSgxLDAsMCwxLHYueCxyKSx1PyhJcihhKSxNci5kcmF3RmlsbCgpKTpNci5kcmF3UGl4ZWxzKHYsbmV3IFVpbnQ4QXJyYXkoYSkpLE1yLmVuZE5vZGVSZW5kZXJpbmcoKSxuJiZNci5iaW5kKG4pfWVsc2V7Y29uc3QgZT1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSpmKSx0PU1hdGguY2VpbChNYXRoLmFicyhjLW8pKm0pO3Y9TXIuY3JlYXRlTm9kZShlLHQpLGhyLnNldChiLGAke2R9YCx2KTtjb25zdCByPU1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O01yLmJpbmQoTXIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxNci5yZXNldCgpLE1yLmJlZ2luTm9kZVJlbmRlcmluZyh2KTtjb25zdCBsPU1yLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtdi55LXQ7TXIuc2V0VHJhbnNmb3JtKGYsMCwwLG0sLXMqZit2LngsLW8qbStsKSxuJiYoblsyNF09di54LG5bMjVdPWwpLElyKGEpLE1yLmRyYXdGaWxsKCksTXIuZW5kTm9kZVJlbmRlcmluZygpLHImJk1yLmJpbmQocil9dCs9cn1jb25zdCBfPWVbdCsrXTtpZihCb29sZWFuKGVbdCsrXSkpe2NvbnN0IHM9Qm9vbGVhbihlW3QrK10pLG89ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBpPWVbdCsrXSxjPWUuc3ViYXJyYXkodCx0K2kpLGw9TWF0aC5jZWlsKE1hdGguYWJzKGFbMl0tYVswXSkpLHU9TWF0aC5jZWlsKE1hdGguYWJzKGFbM10tYVsxXSkpO3JldHVybiBNci5hcHBseUZpbHRlcih2LGIscyxsLHUsaCxuLHIsTHIoXyksbyxjKSx0Kz1pfWlmKE1yLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsclszXStyWzddLzI1NSksMSksTXIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLE1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1McihfKSxoJiYhbClNci5zZXRUcmFuc2Zvcm0oblswXSxuWzFdLG5bMl0sblszXSxuWzRdLG5bNV0pLE1yLmRyYXdEaXNwbGF5T2JqZWN0KHYsYVswXSxhWzFdLGFbMl0sYVszXSxyKTtlbHNle2NvbnN0IGU9TWF0aC5hdGFuMihuWzFdLG5bMF0pLHQ9TWF0aC5hdGFuMigtblsyXSxuWzNdKTtpZihlfHx0KXtjb25zdCByPXMqZixhPW8qbSxpPU1hdGguY29zKGUpLGM9TWF0aC5zaW4oZSksbD1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpO01yLnNldFRyYW5zZm9ybShpLGMsLXUsbCxyKmktYSp1K25bNF0scipjK2EqbCtuWzVdKX1lbHNlIE1yLnNldFRyYW5zZm9ybSgxLDAsMCwxLGFbMF0sYVsxXSk7TXIuZHJhd0Rpc3BsYXlPYmplY3QodixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpfXJldHVybiB0fSxOcj0oZSx0KT0+e2NvbnN0IG49ZS5zdWJhcnJheSh0LHQrNik7dCs9NixNci5yZXNldCgpLE1yLnNldFRyYW5zZm9ybShuWzBdLG5bMV0sblsyXSxuWzNdLG5bNF0sbls1XSk7Y29uc3Qgcj1Cb29sZWFuKGVbdCsrXSk/bmV3IEZsb2F0MzJBcnJheSgyOCk6bnVsbDtNci51c2VHcmlkKHIpLHImJihyLnNldChlLnN1YmFycmF5KHQsdCsyNCkpLHQrPTI0KTtjb25zdCBhPWVbdCsrXSxzPWUuc3ViYXJyYXkodCx0K2EpO3JldHVybiBJcihzLCEwKSx0Kz1hLE1yLmNsaXAoKSx0fSxEcj0oZSx0LG4pPT57Y29uc3Qgcj1lLndpZHRoVGFibGVbdC5saW5lXXx8MCxhPXQudGV4dEZvcm1hdCxzPWEubGVmdE1hcmdpbnx8MDtpZighbi53b3JkV3JhcCYmcj5uLnJhd1dpZHRoKXJldHVybiBNYXRoLm1heCgwLHMpO2NvbnN0IG89YS5yaWdodE1hcmdpbnx8MDtyZXR1cm4iY2VudGVyIj09PWEuYWxpZ258fCJjZW50ZXIiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgvMi1zLW8tci8yLTIpOiJyaWdodCI9PT1hLmFsaWdufHwicmlnaHQiPT09bi5hdXRvU2l6ZT9NYXRoLm1heCgwLG4ucmF3V2lkdGgtcy1yLW8tNCk6TWF0aC5tYXgoMCxzKX0sanI9ZT0+e2xldCB0PSIiO3JldHVybiBlLml0YWxpYyYmKHQrPSJpdGFsaWMgIiksZS5ib2xkJiYodCs9ImJvbGQgIiksYCR7dH0ke2Uuc2l6ZX1weCAnJHtlLmZvbnR9Jywnc2Fucy1zZXJpZidgfSxYcj1uZXcgVGV4dERlY29kZXIsenI9KGUsdCk9Pntjb25zdCBuPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3Qgcj1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IGE9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBzPWVbdCsrXSxvPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWAke2VbdCsrXX1gLHU9ZVt0KytdLGg9Qm9vbGVhbihlW3QrK10pLGI9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0pLGQ9TWF0aC5zcXJ0KG5bMl0qblsyXStuWzNdKm5bM10pO2xldCBmO2lmKGVbdCsrXSl7aWYoZj1oci5nZXQobCxgJHt1fWApLCFmKXJldHVybiB0fWVsc2V7Y29uc3Qgbj1NYXRoLmNlaWwoTWF0aC5hYnMoaS1zKSpiKSxyPU1hdGguY2VpbChNYXRoLmFicyhjLW8pKmQpLGE9Qm9vbGVhbihlW3QrK10pO2Y9YT9oci5nZXQobCxgJHt1fWApOk1yLmNyZWF0ZU5vZGUobixyKSxhfHxoci5zZXQobCxgJHt1fWAsZik7Y29uc3QgaD1lW3QrK10sbT1uZXcgVWludDhBcnJheShlLnN1YmFycmF5KHQsdCtoKSk7dCs9aDtsZXQgdj0ibm9uZSI7c3dpdGNoKGVbdCsrXSl7Y2FzZSAwOnY9ImNlbnRlciI7YnJlYWs7Y2FzZSAxOnY9ImxlZnQiO2JyZWFrO2Nhc2UgMjp2PSJub25lIjticmVhaztjYXNlIDM6dj0icmlnaHQifWNvbnN0IF89e3dpZHRoOm4saGVpZ2h0OnIsYXV0b1NpemU6dixzdG9wSW5kZXg6ZVt0KytdLHNjcm9sbFg6ZVt0KytdLHNjcm9sbFk6ZVt0KytdLHRleHRXaWR0aDplW3QrK10sdGV4dEhlaWdodDplW3QrK10scmF3V2lkdGg6ZVt0KytdLHJhd0hlaWdodDplW3QrK10sZm9jdXNJbmRleDplW3QrK10sc2VsZWN0SW5kZXg6ZVt0KytdLGZvY3VzVmlzaWJsZTpCb29sZWFuKGVbdCsrXSksdGhpY2tuZXNzOmVbdCsrXSx0aGlja25lc3NDb2xvcjplW3QrK10sd29yZFdyYXA6Qm9vbGVhbihlW3QrK10pLGJvcmRlcjpCb29sZWFuKGVbdCsrXSksYm9yZGVyQ29sb3I6ZVt0KytdLGJhY2tncm91bmQ6Qm9vbGVhbihlW3QrK10pLGJhY2tncm91bmRDb2xvcjplW3QrK10sZGVmYXVsdENvbG9yOmVbdCsrXSxkZWZhdWx0U2l6ZTplW3QrK119LHA9KChlLHQsbixyKT0+e2NvbnN0IGE9bmV3IE9mZnNjcmVlbkNhbnZhcyh0LndpZHRoLHQuaGVpZ2h0KSxzPWEuZ2V0Q29udGV4dCgiMmQiKTtpZighcylyZXR1cm4gYTtjb25zdCBvPU1hdGgubWluKDEsTWF0aC5tYXgobixyKSk7aWYodC5iYWNrZ3JvdW5kfHx0LmJvcmRlcil7aWYocy5iZWdpblBhdGgoKSxzLm1vdmVUbygwLDApLHMubGluZVRvKHQud2lkdGgsMCkscy5saW5lVG8odC53aWR0aCx0LmhlaWdodCkscy5saW5lVG8oMCx0LmhlaWdodCkscy5saW5lVG8oMCwwKSx0LmJhY2tncm91bmQpe2NvbnN0IGU9Q3IodC5iYWNrZ3JvdW5kQ29sb3IpO3MuZmlsbFN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgLHMuZmlsbCgpfWlmKHQuYm9yZGVyKXtjb25zdCBlPUNyKHQuYm9yZGVyQ29sb3IpO3MubGluZVdpZHRoPW8scy5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYCxzLnN0cm9rZSgpfX1pZighZSlyZXR1cm4gYTtzLnNhdmUoKSxzLmJlZ2luUGF0aCgpLHMubW92ZVRvKDIsMikscy5saW5lVG8odC53aWR0aC0yLDIpLHMubGluZVRvKHQud2lkdGgtMix0LmhlaWdodC0yKSxzLmxpbmVUbygyLHQuaGVpZ2h0LTIpLHMubGluZVRvKDIsMikscy5jbGlwKCk7bGV0IGk9MjtpZih0LnNjcm9sbFg+MCl7Y29uc3QgZT0odC50ZXh0V2lkdGgrNC10LnJhd1dpZHRoKS90LnJhd1dpZHRoO2krPS10LnNjcm9sbFgqZX1sZXQgYz0yO2lmKHQuc2Nyb2xsWT4wKXtjb25zdCBlPSh0LnRleHRIZWlnaHQrMi10LnJhd0hlaWdodCkvdC5yYXdIZWlnaHQ7Yys9LXQuc2Nyb2xsWSplfWlmKHMuc2V0VHJhbnNmb3JtKG4sMCwwLHIsaSpuLGMqcikscy5iZWdpblBhdGgoKSx0LnNlbGVjdEluZGV4Pi0xJiZ0LmZvY3VzSW5kZXg+LTEpe2NvbnN0IG49ZS50ZXh0VGFibGUubGVuZ3RoLTE7bGV0IHI9MCxhPTA7dC5mb2N1c0luZGV4PD10LnNlbGVjdEluZGV4PyhyPU1hdGgubWluKHQuZm9jdXNJbmRleCxuKSxhPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbikpOihyPU1hdGgubWluKHQuc2VsZWN0SW5kZXgsbiksYT1NYXRoLm1pbih0LmZvY3VzSW5kZXgtMSxuKSk7Y29uc3Qgbz1lLnRleHRUYWJsZVtyXSxpPWUubGluZVRhYmxlW28ubGluZV0sYz1EcihlLGksdCk7bGV0IGw9MDtpZihyJiYidGV4dCI9PT1vLm1vZGUpe2xldCB0PXI7Zm9yKDt0Oyl7Y29uc3Qgbj1lLnRleHRUYWJsZVstLXRdO2lmKCJ0ZXh0IiE9PW4ubW9kZSlicmVhaztsKz1uLnd9fXMuZmlsbFN0eWxlPSIjYjRkN2ZmIjtsZXQgdT0wO2ZvcihsZXQgdD1yO3Q8PWE7Kyt0KXtjb25zdCBuPWUudGV4dFRhYmxlW3RdO2lmKCJ0ZXh0Ij09PW4ubW9kZSYmKHUrPW4udyx0IT09YSkpY29udGludWU7bGV0IHI9MDtjb25zdCBvPSJ0ZXh0Ij09PW4ubW9kZT9uLmxpbmU6bi5saW5lLTE7Zm9yKGxldCB0PTA7dDxvOysrdClyKz1lLmhlaWdodFRhYmxlW3RdO3MuYmVnaW5QYXRoKCkscy5yZWN0KGwscix1K2MsZS5oZWlnaHRUYWJsZVtvXSkscy5maWxsKCksbD0wLHU9MH19Y29uc3QgbD10LnJhd1dpZHRoO2xldCB1PTA7aWYodC5zY3JvbGxYPjApe2NvbnN0IGU9KHQudGV4dFdpZHRoLWwpL2w7dT10LnNjcm9sbFgqZX1jb25zdCBoPWwrdSxiPXQucmF3SGVpZ2h0O2xldCBkPTA7aWYodC5zY3JvbGxZPjApe2NvbnN0IGU9KHQudGV4dEhlaWdodC1iKS9iO2Q9dC5zY3JvbGxZKmV9Y29uc3QgZj1iK2Q7bGV0IG09MCx2PTAsXz0wLHA9MCxnPSExLHg9LTE7Zm9yKGxldCBuPTA7bjxlLnRleHRUYWJsZS5sZW5ndGg7KytuKXtjb25zdCByPWUudGV4dFRhYmxlW25dO2lmKCFyKWNvbnRpbnVlO2lmKCgidGV4dCI9PT1yLm1vZGV8fCJicmVhayI9PT1yLm1vZGUpJiYoeCsrLHQuc3RvcEluZGV4Pi0xJiZ4PnQuc3RvcEluZGV4KSlicmVhaztpZihnJiYidGV4dCI9PT1yLm1vZGUpY29udGludWU7Y29uc3QgYT1yLnRleHRGb3JtYXQ7aWYoIm5vbmUiPT09dC5hdXRvU2l6ZSl7aWYodj5mKWJyZWFrO2lmKCJ0ZXh0Ij09PXIubW9kZSYmKHU+bStyLnd8fG0+aCkpe20rPXIudztjb250aW51ZX19Y29uc3QgaT1DcihhLmNvbG9yfHwwKTtpZihzLmZpbGxTdHlsZT1gcmdiYSgke2kuUn0sJHtpLkd9LCR7aS5CfSwke2kuQX0pYCx0LmZvY3VzVmlzaWJsZSYmdC5mb2N1c0luZGV4PT09bil7Y29uc3QgdD1tK18rLjE7bGV0IG49ci5saW5lLGE9ci55LG89ZS5hc2NlbnRUYWJsZVtuXTsidGV4dCIhPT1yLm1vZGUmJihhPSJicmVhayI9PT1yLm1vZGU/ci5oOmUuYXNjZW50VGFibGVbbi0xXSxuPjA/KG49ci5saW5lLTEsbz1lLmFzY2VudFRhYmxlW25dKTpvPXIuaCksbj4wJiYwPT09ZS5hc2NlbnRUYWJsZVtuXSYmbisrO2ZvcihsZXQgdD0wO3Q8bjsrK3Qpbys9ZS5oZWlnaHRUYWJsZVt0XTtzLnN0cm9rZVN0eWxlPWByZ2JhKCR7aS5SfSwke2kuR30sJHtpLkJ9LCR7aS5BfSlgLHMuYmVnaW5QYXRoKCkscy5tb3ZlVG8odCxvKSxzLmxpbmVUbyh0LG8tYSkscy5zdHJva2UoKX1pZih0LnRoaWNrbmVzcyl7Y29uc3QgZT1Dcih0LnRoaWNrbmVzc0NvbG9yKTtzLmxpbmVXaWR0aD10LnRoaWNrbmVzcyxzLnN0cm9rZVN0eWxlPWByZ2JhKCR7ZS5SfSwke2UuR30sJHtlLkJ9LCR7ZS5BfSlgfWNvbnN0IGM9MHxyLmxpbmU7c3dpdGNoKHIubW9kZSl7Y2FzZSJicmVhayI6Y2FzZSJ3cmFwIjppZihtPTAsYyYmKHYrPWUuaGVpZ2h0VGFibGVbYy0xXSksZD52K2UuaGVpZ2h0VGFibGVbY10pe2c9ITA7Y29udGludWV9cD1lLmFzY2VudFRhYmxlW2NdLF89RHIoZSxyLHQpLGc9ITE7YnJlYWs7Y2FzZSJ0ZXh0Ijp7cy5iZWdpblBhdGgoKSxzLmZvbnQ9anIoYSk7Y29uc3QgZT1tK18sbj12K3A7aWYoYS51bmRlcmxpbmUpe2NvbnN0IHQ9Q3IoYS5jb2xvcnx8MCk7cy5saW5lV2lkdGg9byxzLnN0cm9rZVN0eWxlPWByZ2JhKCR7dC5SfSwke3QuR30sJHt0LkJ9LCR7dC5BfSlgLHMuYmVnaW5QYXRoKCkscy5tb3ZlVG8oZSxuKzIpLHMubGluZVRvKGUrci53LG4rMikscy5zdHJva2UoKX10LnRoaWNrbmVzcyYmcy5zdHJva2VUZXh0KHIudGV4dCxlLG4pLHMuZmlsbFRleHQoci50ZXh0LGUsbiksbSs9ci53fX19aWYodC5mb2N1c1Zpc2libGUmJnQuZm9jdXNJbmRleD49ZS50ZXh0VGFibGUubGVuZ3RoKXtjb25zdCBuPWUudGV4dFRhYmxlW3QuZm9jdXNJbmRleC0xXTtpZihuKXtjb25zdCBlPUNyKG4udGV4dEZvcm1hdC5jb2xvcnx8MCk7cy5zdHJva2VTdHlsZT1gcmdiYSgke2UuUn0sJHtlLkd9LCR7ZS5CfSwke2UuQX0pYDtjb25zdCB0PW0rXysuMSxyPXYrcDtzLmJlZ2luUGF0aCgpLCJ0ZXh0Ij09PW4ubW9kZT9zLm1vdmVUbyh0LHItbi55KTpzLm1vdmVUbyh0LHIrbi5oKSxzLmxpbmVUbyh0LHIpLHMuc3Ryb2tlKCl9fXJldHVybiBzLnJlc3RvcmUoKSxhfSkoSlNPTi5wYXJzZShYci5kZWNvZGUobSkpLF8sYixkKSxnPU1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O01yLmJpbmQoTXIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxNci5yZXNldCgpLE1yLmJlZ2luTm9kZVJlbmRlcmluZyhmKTtjb25zdCB4PU1yLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtZi55LXI7TXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsZi54LHgpLE1yLmRyYXdFbGVtZW50KGYscCksTXIuZW5kTm9kZVJlbmRlcmluZygpLGcmJk1yLmJpbmQoZyl9Y29uc3QgbT1lW3QrK107aWYoQm9vbGVhbihlW3QrK10pKXtjb25zdCBzPUJvb2xlYW4oZVt0KytdKSxvPWUuc3ViYXJyYXkodCx0KzQpO3QrPTQ7Y29uc3QgaT1lW3QrK10sYz1lLnN1YmFycmF5KHQsdCtpKSx1PU1hdGguY2VpbChNYXRoLmFicyhhWzJdLWFbMF0pKSxiPU1hdGguY2VpbChNYXRoLmFicyhhWzNdLWFbMV0pKTtyZXR1cm4gTXIuYXBwbHlGaWx0ZXIoZixsLEJvb2xlYW4oTWF0aC5tYXgoK2gsK3MpKSx1LGIsITEsbixyLExyKG0pLG8sYyksdCs9aX1Nci5nbG9iYWxBbHBoYT1NYXRoLm1pbihNYXRoLm1heCgwLHJbM10rcls3XS8yNTUpLDEpLE1yLmltYWdlU21vb3RoaW5nRW5hYmxlZD0hMCxNci5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249THIobSk7Y29uc3Qgdj1NYXRoLmF0YW4yKG5bMV0sblswXSksXz1NYXRoLmF0YW4yKC1uWzJdLG5bM10pO2lmKHZ8fF8pe2NvbnN0IGU9cypiLHQ9bypkLHI9TWF0aC5jb3ModiksYT1NYXRoLnNpbih2KSxpPU1hdGguY29zKF8pLGM9TWF0aC5zaW4oXyk7TXIuc2V0VHJhbnNmb3JtKHIsYSwtYyxpLGUqci10KmMrbls0XSxlKmErdCppK25bNV0pfWVsc2UgTXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYVswXSxhWzFdKTtyZXR1cm4gTXIuZHJhd0Rpc3BsYXlPYmplY3QoZixhWzBdLGFbMV0sYVsyXSxhWzNdLHIpLHR9LFZyPShlLHQsbik9Pntjb25zdCByPWUuc3ViYXJyYXkodCx0KzYpO3QrPTY7Y29uc3QgYT1lLnN1YmFycmF5KHQsdCs4KTt0Kz04O2NvbnN0IHM9ZS5zdWJhcnJheSh0LHQrNCk7dCs9NDtjb25zdCBvPWVbdCsrXSxpPWVbdCsrXSxjPWVbdCsrXSxsPWVbdCsrXSx1PWAke2VbdCsrXX1gLGg9Qm9vbGVhbihlW3QrK10pO2xldCBiO2lmKGVbdCsrXSl7aWYoYj1oci5nZXQodSwiMCIpLCFiKXJldHVybiB0fWVsc2V7Y29uc3Qgcj1NYXRoLmFicyhjLW8pLGE9TWF0aC5hYnMobC1pKSxzPUJvb2xlYW4oZVt0KytdKTtpZihiPXM/aHIuZ2V0KHUsIjAiKTpNci5jcmVhdGVOb2RlKHIsYSksc3x8aHIuc2V0KHUsIjAiLGIpLG4mJm4ubGVuZ3RoKXtjb25zdCBlPU1yLmN1cnJlbnRBdHRhY2htZW50T2JqZWN0O01yLmJpbmQoTXIuYXRsYXNBdHRhY2htZW50T2JqZWN0KSxNci5yZXNldCgpLE1yLmJlZ2luTm9kZVJlbmRlcmluZyhiKTtjb25zdCB0PU1yLmF0bGFzQXR0YWNobWVudE9iamVjdC5oZWlnaHQtYi55LWE7TXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsYi54LHQpO2NvbnN0IHI9bi5zaGlmdCgpO01yLmRyYXdFbGVtZW50KGIsciksTXIuZW5kTm9kZVJlbmRlcmluZygpLGUmJk1yLmJpbmQoZSl9fWNvbnN0IGQ9ZVt0KytdO2lmKEJvb2xlYW4oZVt0KytdKSl7Y29uc3Qgbj1Cb29sZWFuKGVbdCsrXSksbz1lLnN1YmFycmF5KHQsdCs0KTt0Kz00O2NvbnN0IGk9ZVt0KytdLGM9ZS5zdWJhcnJheSh0LHQraSksbD1NYXRoLmNlaWwoTWF0aC5hYnMoc1syXS1zWzBdKSksZj1NYXRoLmNlaWwoTWF0aC5hYnMoc1szXS1zWzFdKSk7cmV0dXJuIE1yLmFwcGx5RmlsdGVyKGIsdSxCb29sZWFuKE1hdGgubWF4KCtoLCtuKSksbCxmLCEwLHIsYSxMcihkKSxvLGMpLHQrPWl9cmV0dXJuIE1yLmdsb2JhbEFscGhhPU1hdGgubWluKE1hdGgubWF4KDAsYVszXSthWzddLzI1NSksMSksTXIuaW1hZ2VTbW9vdGhpbmdFbmFibGVkPSEwLE1yLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj1McihkKSxNci5zZXRUcmFuc2Zvcm0oclswXSxyWzFdLHJbMl0sclszXSxyWzRdLHJbNV0pLE1yLmRyYXdEaXNwbGF5T2JqZWN0KGIsc1swXSxzWzFdLHNbMl0sc1szXSxhKSx0fSxXcj0oZSx0KT0+e2NvbnN0IG49ZVt0KytdO2ZvcihsZXQgcj0wO3I8bjsrK3Ipe3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PVdyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9TnIoZSx0KX19cmV0dXJuIHR9LEdyPShlLHQsbik9Pntjb25zdCByPUJvb2xlYW4oZVt0KytdKTtpZihyKXtNci5kcmF3QXJyYXlzSW5zdGFuY2VkKCksTXIuc2F2ZSgpLE1yLmJlZ2luTWFzaygpLE1yLnNldE1hc2tCb3VuZHMoZVt0KytdLGVbdCsrXSxlW3QrK10sZVt0KytdKTtzd2l0Y2goZVt0KytdKXtjYXNlIDA6dD1XcihlLHQpO2JyZWFrO2Nhc2UgMTp0PU5yKGUsdCl9TXIuZW5kTWFzaygpfWxldCBhPTAscz0hMDtjb25zdCBvPWVbdCsrXTtmb3IobGV0IHI9MDtvPnI7cisrKXtjb25zdCByPWVbdCsrXSxvPWVbdCsrXTtpZihhJiZyPmEmJihzJiYoTXIucmVzdG9yZSgpLE1yLmxlYXZlTWFzaygpKSxhPTAscz0hMCksIXMpY29udGludWU7aWYobyl7aWYoYT1vLHM9Qm9vbGVhbihlW3QrK10pLCFzKWNvbnRpbnVlO01yLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxNci5zYXZlKCksTXIuYmVnaW5NYXNrKCksTXIuc2V0TWFza0JvdW5kcyhlW3QrK10sZVt0KytdLGVbdCsrXSxlW3QrK10pO3N3aXRjaChlW3QrK10pe2Nhc2UgMDp0PVdyKGUsdCk7YnJlYWs7Y2FzZSAxOnQ9TnIoZSx0KX1Nci5lbmRNYXNrKCk7Y29udGludWV9aWYoIWVbdCsrXSljb250aW51ZTtjb25zdCBpPWVbdCsrXTtzd2l0Y2goaSl7Y2FzZSAwOnQ9R3IoZSx0LG4pO2JyZWFrO2Nhc2UgMTp0PVVyKGUsdCk7YnJlYWs7Y2FzZSAyOnQ9enIoZSx0KTticmVhaztjYXNlIDM6dD1WcihlLHQsbik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJ1bmtub3duIHR5cGUiLGkpfX1yZXR1cm4oYXx8cikmJihNci5yZXN0b3JlKCksTXIubGVhdmVNYXNrKCkpLHR9O2xldCBZcj0tMTtjb25zdCBxcj0oZSx0KT0+e01yLmNsZWFyVHJhbnNmZXJCb3VuZHMoKTtsZXQgbj0wO2NvbnN0IHI9ZVtuKytdO2ZvcihZciE9PXImJihZcj1yLC0xPT09WXI/TXIudXBkYXRlQmFja2dyb3VuZENvbG9yKDAsMCwwLDApOk1yLnVwZGF0ZUJhY2tncm91bmRDb2xvcihZcj4+MTYmMSxZcj4+OCYxLDEmWXIsMSkpLE1yLnJlc2V0KCksTXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxNci5maWxsQmFja2dyb3VuZENvbG9yKCk7ZS5sZW5ndGg+bjspe2lmKCFlW24rK10pY29udGludWU7Y29uc3Qgcj1lW24rK107c3dpdGNoKHIpe2Nhc2UgMDpuPUdyKGUsbix0KTticmVhaztjYXNlIDE6bj1VcihlLG4pO2JyZWFrO2Nhc2UgMjpuPXpyKGUsbik7YnJlYWs7Y2FzZSAzOm49VnIoZSxuLHQpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigidW5rbm93biB0eXBlIixyKX19TXIuZHJhd0FycmF5c0luc3RhbmNlZCgpLE9yJiYod3Iud2lkdGg9RnIsd3IuaGVpZ2h0PSRyLE9yPSExKSxNci50cmFuc2Zlck1haW5DYW52YXMoKX0sS3I9ZT0+e2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXtjb25zdCBuPWAke2VbdF19YDtpZighaHIuaGFzKG4pKWNvbnRpbnVlO2NvbnN0IHI9aHIuZ2V0QnlJZChuKTtmb3IoY29uc3QgZSBvZiByLnZhbHVlcygpKU1yLnJlbW92ZU5vZGUoZSk7aHIucmVtb3ZlQnlJZChuKX19LEhyPWFzeW5jKGUsdCxuLHIpPT57TXIuY2xlYXJUcmFuc2ZlckJvdW5kcygpO2xldCBhPTE7Zm9yKE1yLnJlc2V0KCksTXIuc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKSxNci5maWxsQmFja2dyb3VuZENvbG9yKCk7ZS5sZW5ndGg+YTspe2lmKCFlW2ErK10pY29udGludWU7Y29uc3QgdD1lW2ErK107c3dpdGNoKHQpe2Nhc2UgMDphPUdyKGUsYSxyKTticmVhaztjYXNlIDE6YT1VcihlLGEpO2JyZWFrO2Nhc2UgMjphPXpyKGUsYSk7YnJlYWs7Y2FzZSAzOmE9VnIoZSxhLHIpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigidW5rbm93biB0eXBlIix0KX19cmV0dXJuIE1yLmRyYXdBcnJheXNJbnN0YW5jZWQoKSxhd2FpdCBNci5jcmVhdGVJbWFnZUJpdG1hcCh0LG4pfTtjb25zdCBacj1uZXcgY2xhc3N7Y29uc3RydWN0b3IoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywic3RhdGUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicXVldWUiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp2b2lkIDB9KSx0aGlzLnN0YXRlPSJkZWFjdGl2YXRlIix0aGlzLnF1ZXVlPVtdfWFzeW5jIGV4ZWN1dGUoKXtmb3IodGhpcy5zdGF0ZT0iYWN0aXZlIjt0aGlzLnF1ZXVlLmxlbmd0aDspe2NvbnN0IGU9dGhpcy5xdWV1ZS5zaGlmdCgpO2lmKGUpc3dpdGNoKGUuY29tbWFuZCl7Y2FzZSJyZW5kZXIiOnFyKGUuYnVmZmVyLnN1YmFycmF5KDAsZS5sZW5ndGgpLGUuaW1hZ2VCaXRtYXBzKSxnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJyZW5kZXIiLGJ1ZmZlcjplLmJ1ZmZlcn0sW2UuYnVmZmVyLmJ1ZmZlcl0pO2JyZWFrO2Nhc2UicmVzaXplIjpCcihlLmJ1ZmZlclswXSxlLmJ1ZmZlclsxXSxCb29sZWFuKGUuYnVmZmVyWzJdKSk7YnJlYWs7Y2FzZSJpbml0aWFsaXplIjpQcihlLmNhbnZhcyxlLmRldmljZVBpeGVsUmF0aW8pO2JyZWFrO2Nhc2UicmVtb3ZlQ2FjaGUiOktyKGUuYnVmZmVyKTticmVhaztjYXNlImNhY2hlQ2xlYXIiOmhyLnJlc2V0KCk7YnJlYWs7Y2FzZSJjYXB0dXJlIjp7Y29uc3QgdD1hd2FpdCBIcihlLmJ1ZmZlci5zdWJhcnJheSgwLGUubGVuZ3RoKSxlLndpZHRoLGUuaGVpZ2h0LGUuaW1hZ2VCaXRtYXBzKTtnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKHttZXNzYWdlOiJjYXB0dXJlIixidWZmZXI6ZS5idWZmZXIsaW1hZ2VCaXRtYXA6dH0sW2UuYnVmZmVyLmJ1ZmZlcix0XSl9fX10aGlzLnN0YXRlPSJkZWFjdGl2YXRlIn19O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsYXN5bmMgZT0+e1pyLnF1ZXVlLnB1c2goZS5kYXRhKSwiZGVhY3RpdmF0ZSI9PT1aci5zdGF0ZSYmYXdhaXQgWnIuZXhlY3V0ZSgpfSl9KCk7Cg==';