XSL i kod kreskowy

0

Witam,
Korzystam z aplikacji, który do wyświetlania pewnych informacji używa XML oraz stylu XSL. Zaszła potrzeba, aby na tym widoku tworzył się również kod kreskowy. Znalazłem coś takiego:
http://www.renderx.com/~renderx/Demos/barcode/index.html Niestety nie mogę zastosować funkcji import, gdyż pliki xml i xsl są zapisane binarnie w bazie danych. Kiedy dograłem po prostu zawartość pliku do istniejącego i zapisałem całość, to niestety widok nie działa. Hmmmm. Czy ktoś mógłby mi pomóc w tej kwestii?

0

Ale ty to pokazujesz jako html?

Bo jeżeli tak, to dużo prościej jest pobrać czcionke np: https://github.com/graphicore/librebarcode
osadzić w css i wygenerować takiego htmla:

<html>

<head>
    <style>
        @font-face {
            font-family: 'libre_barcode_128regular';
            src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAlgABAAAAAAQAAAAAkBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GYACDEggYCYRlEQgK4hzSRguCCgABNgIkA4QQBCAFhXQHg1QMgT4bBjazAzFsHECWIe9IhHkaXIf8H48bQwQLNK3vJKdQRVV1GlkK7KLMpRmqhGBquqGbSnjtTT+yoy9hHJoDFQuN9Omkf3ivFvKFxXdlXs6WHEXShdl8tWT+RN4X1Pdjuvf/SwlZs6zveJCMEm2qyFdXuLAskHC1kZ1crW1/5hOuh7+zt4hqiSYl0RI1c7imV3StrMYRyhJh8s+BoTETckJNA0qg33Sv7z4H0a30nAv7guww34V5KvCW1MVpqfTslidcEbWXp2xJ61TFMMA2SqN22nX0/NfNDaUfMWK3e9bAEgkCwohLgAH+/BctVP5vFFJg2wuKowh6WUMKbAO6E767d2B/CbIB3rD/4+ATFxPAr1+27PRulgRHeQq7Qk2hcYsTQ0Pv2/pNTOlPITTCJ2FScMHhLrgz7oSJSp+QUZ9f7Z3Q76ArscY/2q1VFFu6EaWN/4qW5DA2UkZWZ7Bu3S2JjDKBqF3a3bTYJHmoB55IEtSEeT+f+IN4gv4gIlORPcgO9Oc7gfbvSkAArz95b5f53r2f5OsqHwhADlAGcAhxjmGAA8zdd50XCwx7EoC74Xxdwqq/w0ec2/EaRNhaD2TAEvUBAEC30wNAAwHwojX+DLhUuQyRlaYKDkcZb8vlyK0b9PBcMMZiHk6nHQgACAOMy30MMPKH1//hHrvT0994YP55FxgcOpgPEsSZy9fl5gO4PV6f/zY0dWuaelz1s4yewlPT0jMys7INkZObl19QWFRcUlpWXlFZVV1TW2fWNzQ2Nbe0trV3dHZ19/T29Q8MDg2PjEo1Nj4xOTU9Mwur5dV1kAKuQOMcLEkG5y98xoUNkNe2d0AB3ncN1EAtnIJruHffvlo9FwkEQUwndfVJ6jimCHhdIvkMWaNC3/lZhW+JxeQm5hAT+JlCjRxyic4B2cyVnkNusZqIZPZJnUyVQx6R+QKd66fkN+2ZKmWnPOz3xU6ukzcqh1qOKe/w9sQc8oqwibEc8gk7he31ScK9iQmNQOWQX9ipgVFzckBER2FFnnYHCTxbzbOfas8Ucqe1cyRPegdBn7QWrVlkZrmm60qz/KEBrrI02L7BSC1SV9ITIvB1g14XKjCP/MaERGzlLbNrKHFhrhBOacLqLhor0UrgWJXcuqi8QsOLryLTVSnNR31mcSzKpeF1XVjzPlHXNXxvdQ7Iv7F2JBi2TvWEjRGCx0v1gxxl5+D8DGJKWuRJb+cWR6vd4rNZSpznSDeRK4Ki01EXg6/9optgrDnNR2umLTx2xgi0dma34yo7FpZGP+F3U7X2MO7JWHETTGY2NLDOe5EwD+ecvHpYcsGA5HNIwBu00WFpRdoMvcgBhMb5Bochk/mE85S0eKS2pjhB4U2cwpy9hxwQUMq6AbgAoAzQAkBgGSDw65BICag+YOTf7cfCgU9uEPXE/wkZN1+8c8+/XMie/fNLGd8+59JDxsmh++HfJPAl/vaMQEl1SzsL3ky5CUSXIjYJEiTXIZIdgxIU6qkgqYQe6pqCkErL7MRBEVdsDmwQk+CVRpBsKy9AyhNzWJArSNhWbi8a7lgWCFeLXAKZtElRE7oYkh3f5BAV2a10vUWpSEKxHGpBD7laZUKoBT3s9cB5txTu9hYhwguDTCZ0CRQ2uC2ggYANAlvXAxFItWQ30AsswEMagVXsdMs2UlrVxhKwHkiQcLElAC2cCHGiZQLbCCRSxiKICxcEJYkAKUSOoYhzlfFt86y2yNVsGTzDbp4qCOKkHnjFILDtFSAyPFEi7dmKUnFtcA/x4rbi8HQLJ4hR8Fo2tThORJDZYsO3bn6syCVUKCm8+QjbvBMJtHfbd62Jp5+vy5H48fL293iHJF4UcJ+N9VY7reDfhXb56xznx4sIMOBBpyvkYAziCmcBGLamqOhykTcRXtspKmKul9Z7m/5OfGzBsFtN2zH7f7QPDMgvKMGNAEB1HjgB5qQODGAAJ50jEPbAwy2gnJu/k24EDqS2QEVFV7siA5+Fz7oFgwqEJfiUqgai70FlANAMAJxSSo5/D6iZ+AQ/rL4HjqJDyldRzqiyJIpPwgKxAJSJKLyUBkbGMxj+yJdAKA9XFoB/RwBYM67B6loAPiMAT5Hjo2B6QDoQTqrDcN3qfCBuFF6ewXJGx8h149wYydcAdXwE5b9ugY7/DMDNhJdnYJpRQp0yzk1okTPOIKzI1X+ge/CYba9Xt7/b3wLbJS0YFXF4i4GWcWFkO61l92Zrm8l1/Fdje3N/FuAD4LsAGVhCqo45IuQeH2TsAaQMxGF5Mb8k+GNzT/u+r8Ms3ljiUl9BoWEA4jZokxemc49sb9sYkcxRtRer770QSQTAIRxlQDAPAMjlkRtZJnAJfCSafMmRxzN5pj2TMRQUYDKiNPraoDxGeqQwR28UcdwfRdldjY0Vut7pM6iaCRhQaS4R2BrCOBHEVTDHMEzLmUvYDOGqviliTrWYm7YIJOg8//vr4RhERVBOkpMpilqKWCOmNAguhYgelnX0nXrycqRqP7LGSfFf9oQBIdIwURNX4y9n6ySTj85ea/VjrqVl2baTMZXCacdK5oVZmfaCqu1sUbBFP2mPs0y2UVGpV2l88vKe5murScN8GYeeL5ccuiLWjmykFLQtzay0gjlen8R1HM/hWpgnF9WV8PM8CGEGJ7ZKWmMkG6Tl3jnxilTpTQd62NZxrJAjMXIo/iMr3wsgJ4//B72/SAaZZJFNDrnkkU8BJxc3Dy8fv4CgkLCIqJg4JiEpJS0jK0ciU6g0OkMe4khBUUlZRVVNXUNTS1tHV1RMXEJSSlpGVk5eQVFJWUVVTV1DU0tbR1dP38DQyNjENFEBQu7Mmbux4NvShy//fvxmVboylKksZStHucpTvgpYIStixfBzs1hWysp8S6dLDZ34Ny/4OB+Hl0LvWBP9NKoBhyhQpESZClVqvhc4Lm76d6uzmFK0pHwazxL16zp+3/8MsSvQSYE+aTN2VdktPkPqFKk6KXbAPRfUUQq7mZCMGDaT22giFzY/AHb+vzFsd8uxQd3G5dGdZzvulO/hTWI8rlLxRW+C+o3P1SmB6I+SoAwB18yrKNYA) format('woff2'),
                url(data:application/font-woff;charset=utf-8;base64,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) format('woff');
            font-weight: normal;
            font-style: normal;

        }
        .barcode {
            font-family: 'libre_barcode_128regular'
            
        }
    </style>
</head>
<body>
    <p class="barcode">1 234 567</p>
</body>
</html>

Wredy masz ładnie wyświetlony kod kreskowy

0

Fajne rozwiązanie, ale ja potrzebuję EAN-13 w większości. Czasami zdarza się EAN-8.

1

No to znajdź font z ean 13/ean8 i osadź w dokumencie lub wykorzystaj: skrypt: JsBarcode.ean-upc.min.js ze strony https://lindell.me/JsBarcode/#download i go osadź:

<html>

<head>
    <script src="data:text/javascript;base64,LyohIEpzQmFyY29kZSB2My42LjAgfCAoYykgSm9oYW4gTGluZGVsbCB8IE1JVCBsaWNlbnNlICovCiFmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgaT1uW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxlKSxpLmw9ITAsaS5leHBvcnRzfXZhciBuPXt9O3JldHVybiBlLm09dCxlLmM9bixlLmk9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGUuZD1mdW5jdGlvbih0LGUsbil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Om59KX0sZS5uPWZ1bmN0aW9uKHQpe3ZhciBuPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0WyJkZWZhdWx0Il19OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBlLmQobiwiYSIsbiksbn0sZS5vPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSxlLnA9IiIsZShlLnM9MjMpfShbZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbiBpKHQsZSl7bih0aGlzLGkpLHRoaXMuZGF0YT10LHRoaXMudGV4dD1lLnRleHR8fHQsdGhpcy5vcHRpb25zPWV9O2VbImRlZmF1bHQiXT1yfSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe24odGhpcyx0KSx0aGlzLnN0YXJ0QmluPSIxMDEiLHRoaXMuZW5kQmluPSIxMDEiLHRoaXMubWlkZGxlQmluPSIwMTAxMCIsdGhpcy5MYmluYXJ5PVsiMDAwMTEwMSIsIjAwMTEwMDEiLCIwMDEwMDExIiwiMDExMTEwMSIsIjAxMDAwMTEiLCIwMTEwMDAxIiwiMDEwMTExMSIsIjAxMTEwMTEiLCIwMTEwMTExIiwiMDAwMTAxMSJdLHRoaXMuR2JpbmFyeT1bIjAxMDAxMTEiLCIwMTEwMDExIiwiMDAxMTAxMSIsIjAxMDAwMDEiLCIwMDExMTAxIiwiMDExMTAwMSIsIjAwMDAxMDEiLCIwMDEwMDAxIiwiMDAwMTAwMSIsIjAwMTAxMTEiXSx0aGlzLlJiaW5hcnk9WyIxMTEwMDEwIiwiMTEwMDExMCIsIjExMDExMDAiLCIxMDAwMDEwIiwiMTAxMTEwMCIsIjEwMDExMTAiLCIxMDEwMDAwIiwiMTAwMDEwMCIsIjEwMDEwMDAiLCIxMTEwMTAwIl19cmV0dXJuIHQucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9IiI7bj1ufHwiIjtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKykiTCI9PWVbaV0/cis9dGhpcy5MYmluYXJ5W3RbaV1dOiJHIj09ZVtpXT9yKz10aGlzLkdiaW5hcnlbdFtpXV06IlIiPT1lW2ldJiYocis9dGhpcy5SYmluYXJ5W3RbaV1dKSxpPHQubGVuZ3RoLTEmJihyKz1uKTtyZXR1cm4gcn0sdH0oKTtlWyJkZWZhdWx0Il09cn0sZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciBuLHI9e307Zm9yKG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYocltuXT10W25dKTtmb3IobiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJiJ1bmRlZmluZWQiIT10eXBlb2YgZVtuXSYmKHJbbl09ZVtuXSk7cmV0dXJuIHJ9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGVbImRlZmF1bHQiXT1ufSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gcih0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGkodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGksbyl7bih0aGlzLGUpO3ZhciBhPXIodGhpcyx0LmNhbGwodGhpcykpO3JldHVybiBhLm5hbWU9IkludmFsaWRJbnB1dEV4Y2VwdGlvbiIsYS5zeW1ib2xvZ3k9aSxhLmlucHV0PW8sYS5tZXNzYWdlPSciJythLmlucHV0KyciIGlzIG5vdCBhIHZhbGlkIGlucHV0IGZvciAnK2Euc3ltYm9sb2d5LGF9cmV0dXJuIGkoZSx0KSxlfShFcnJvciksYT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7bih0aGlzLGUpO3ZhciBpPXIodGhpcyx0LmNhbGwodGhpcykpO3JldHVybiBpLm5hbWU9IkludmFsaWRFbGVtZW50RXhjZXB0aW9uIixpLm1lc3NhZ2U9Ik5vdCBzdXBwb3J0ZWQgdHlwZSB0byByZW5kZXIgb24iLGl9cmV0dXJuIGkoZSx0KSxlfShFcnJvcikscz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7bih0aGlzLGUpO3ZhciBpPXIodGhpcyx0LmNhbGwodGhpcykpO3JldHVybiBpLm5hbWU9Ik5vRWxlbWVudEV4Y2VwdGlvbiIsaS5tZXNzYWdlPSJObyBlbGVtZW50IHRvIHJlbmRlciBvbi4iLGl9cmV0dXJuIGkoZSx0KSxlfShFcnJvcik7ZS5JbnZhbGlkSW5wdXRFeGNlcHRpb249byxlLkludmFsaWRFbGVtZW50RXhjZXB0aW9uPWEsZS5Ob0VsZW1lbnRFeGNlcHRpb249c30sZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1bIndpZHRoIiwiaGVpZ2h0IiwidGV4dE1hcmdpbiIsImZvbnRTaXplIiwibWFyZ2luIiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0Il07Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKG49ZVtuXSwic3RyaW5nIj09dHlwZW9mIHRbbl0mJih0W25dPXBhcnNlSW50KHRbbl0sMTApKSk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0LmRpc3BsYXlWYWx1ZSYmKHQuZGlzcGxheVZhbHVlPSJmYWxzZSIhPXQuZGlzcGxheVZhbHVlKSx0fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlWyJkZWZhdWx0Il09bn0sZnVuY3Rpb24odCxlKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPXt3aWR0aDoyLGhlaWdodDoxMDAsZm9ybWF0OiJhdXRvIixkaXNwbGF5VmFsdWU6ITAsZm9udE9wdGlvbnM6IiIsZm9udDoibW9ub3NwYWNlIix0ZXh0OnZvaWQgMCx0ZXh0QWxpZ246ImNlbnRlciIsdGV4dFBvc2l0aW9uOiJib3R0b20iLHRleHRNYXJnaW46Mixmb250U2l6ZToyMCxiYWNrZ3JvdW5kOiIjZmZmZmZmIixsaW5lQ29sb3I6IiMwMDAwMDAiLG1hcmdpbjoxMCxtYXJnaW5Ub3A6dm9pZCAwLG1hcmdpbkJvdHRvbTp2b2lkIDAsbWFyZ2luTGVmdDp2b2lkIDAsbWFyZ2luUmlnaHQ6dm9pZCAwLHZhbGlkOmZ1bmN0aW9uKCl7fX07ZVsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGUuaGVpZ2h0KyhlLmRpc3BsYXlWYWx1ZSYmdC50ZXh0Lmxlbmd0aD4wP2UuZm9udFNpemUrZS50ZXh0TWFyZ2luOjApK2UubWFyZ2luVG9wK2UubWFyZ2luQm90dG9tfWZ1bmN0aW9uIG8odCxlLG4pe2lmKG4uZGlzcGxheVZhbHVlJiZlPHQpe2lmKCJjZW50ZXIiPT1uLnRleHRBbGlnbilyZXR1cm4gTWF0aC5mbG9vcigodC1lKS8yKTtpZigibGVmdCI9PW4udGV4dEFsaWduKXJldHVybiAwO2lmKCJyaWdodCI9PW4udGV4dEFsaWduKXJldHVybiBNYXRoLmZsb29yKHQtZSl9cmV0dXJuIDB9ZnVuY3Rpb24gYSh0LGUsbil7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBhLHM9dFtyXSx1PSgwLGRbImRlZmF1bHQiXSkoZSxzLm9wdGlvbnMpO2E9dS5kaXNwbGF5VmFsdWU/ZihzLnRleHQsdSxuKTowO3ZhciBjPXMuZGF0YS5sZW5ndGgqdS53aWR0aDtzLndpZHRoPU1hdGguY2VpbChNYXRoLm1heChhLGMpKSxzLmhlaWdodD1pKHMsdSkscy5iYXJjb2RlUGFkZGluZz1vKGEsYyx1KX19ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9dFtuXS53aWR0aDtyZXR1cm4gZX1mdW5jdGlvbiB1KHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyl0W25dLmhlaWdodD5lJiYoZT10W25dLmhlaWdodCk7cmV0dXJuIGV9ZnVuY3Rpb24gZih0LGUsbil7dmFyIHI7cj0idW5kZWZpbmVkIj09dHlwZW9mIG4/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCgiMmQiKTpuLHIuZm9udD1lLmZvbnRPcHRpb25zKyIgIitlLmZvbnRTaXplKyJweCAiK2UuZm9udDt2YXIgaT1yLm1lYXN1cmVUZXh0KHQpLndpZHRoO3JldHVybiBpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmdldFRvdGFsV2lkdGhPZkVuY29kaW5ncz1lLmNhbGN1bGF0ZUVuY29kaW5nQXR0cmlidXRlcz1lLmdldEJhcmNvZGVQYWRkaW5nPWUuZ2V0RW5jb2RpbmdIZWlnaHQ9ZS5nZXRNYXhpbXVtSGVpZ2h0T2ZFbmNvZGluZ3M9dm9pZCAwO3ZhciBjPW4oMiksZD1yKGMpO2UuZ2V0TWF4aW11bUhlaWdodE9mRW5jb2RpbmdzPXUsZS5nZXRFbmNvZGluZ0hlaWdodD1pLGUuZ2V0QmFyY29kZVBhZGRpbmc9byxlLmNhbGN1bGF0ZUVuY29kaW5nQXR0cmlidXRlcz1hLGUuZ2V0VG90YWxXaWR0aE9mRW5jb2RpbmdzPXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oMTcpO2VbImRlZmF1bHQiXT17RUFOMTM6ci5FQU4xMyxFQU44OnIuRUFOOCxFQU41OnIuRUFONSxFQU4yOnIuRUFOMixVUEM6ci5VUEN9fSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXtuKHRoaXMsdCksdGhpcy5hcGk9ZX1yZXR1cm4gdC5wcm90b3R5cGUuaGFuZGxlQ2F0Y2g9ZnVuY3Rpb24odCl7aWYoIkludmFsaWRJbnB1dEV4Y2VwdGlvbiIhPT10Lm5hbWUpdGhyb3cgdDtpZih0aGlzLmFwaS5fb3B0aW9ucy52YWxpZD09PXRoaXMuYXBpLl9kZWZhdWx0cy52YWxpZCl0aHJvdyB0Lm1lc3NhZ2U7dGhpcy5hcGkuX29wdGlvbnMudmFsaWQoITEpLHRoaXMuYXBpLnJlbmRlcj1mdW5jdGlvbigpe319LHQucHJvdG90eXBlLndyYXBCYXJjb2RlQ2FsbD1mdW5jdGlvbih0KXt0cnl7dmFyIGU9dC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKTtyZXR1cm4gdGhpcy5hcGkuX29wdGlvbnMudmFsaWQoITApLGV9Y2F0Y2gobil7cmV0dXJuIHRoaXMuaGFuZGxlQ2F0Y2gobiksdGhpcy5hcGl9fSx0fSgpO2VbImRlZmF1bHQiXT1yfSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm1hcmdpblRvcD10Lm1hcmdpblRvcHx8dC5tYXJnaW4sdC5tYXJnaW5Cb3R0b209dC5tYXJnaW5Cb3R0b218fHQubWFyZ2luLHQubWFyZ2luUmlnaHQ9dC5tYXJnaW5SaWdodHx8dC5tYXJnaW4sdC5tYXJnaW5MZWZ0PXQubWFyZ2luTGVmdHx8dC5tYXJnaW4sdH1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZVsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiBpKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gbyh0KTtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7bisrKWUucHVzaChpKHRbbl0pKTtyZXR1cm4gZX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudClyZXR1cm4gYSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFNWR0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KXJldHVybntlbGVtZW50OnQsb3B0aW9uczooMCxmWyJkZWZhdWx0Il0pKHQpLHJlbmRlcmVyOmRbImRlZmF1bHQiXS5TVkdSZW5kZXJlcn07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KXJldHVybntlbGVtZW50OnQsb3B0aW9uczooMCxmWyJkZWZhdWx0Il0pKHQpLHJlbmRlcmVyOmRbImRlZmF1bHQiXS5DYW52YXNSZW5kZXJlcn07aWYodCYmdC5nZXRDb250ZXh0KXJldHVybntlbGVtZW50OnQscmVuZGVyZXI6ZFsiZGVmYXVsdCJdLkNhbnZhc1JlbmRlcmVyfTtpZih0JiYib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIHQ/InVuZGVmaW5lZCI6cyh0KSkmJiF0Lm5vZGVOYW1lKXJldHVybntlbGVtZW50OnQscmVuZGVyZXI6ZFsiZGVmYXVsdCJdLk9iamVjdFJlbmRlcmVyfTt0aHJvdyBuZXcgbC5JbnZhbGlkRWxlbWVudEV4Y2VwdGlvbn1mdW5jdGlvbiBvKHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCk7aWYoMCE9PWUubGVuZ3RoKXtmb3IodmFyIG49W10scj0wO3I8ZS5sZW5ndGg7cisrKW4ucHVzaChpKGVbcl0pKTtyZXR1cm4gbn19ZnVuY3Rpb24gYSh0KXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTtyZXR1cm57ZWxlbWVudDplLG9wdGlvbnM6KDAsZlsiZGVmYXVsdCJdKSh0KSxyZW5kZXJlcjpkWyJkZWZhdWx0Il0uQ2FudmFzUmVuZGVyZXIsYWZ0ZXJSZW5kZXI6ZnVuY3Rpb24oKXt0LnNldEF0dHJpYnV0ZSgic3JjIixlLnRvRGF0YVVSTCgpKX19fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sPyJzeW1ib2wiOnR5cGVvZiB0fSx1PW4oMTgpLGY9cih1KSxjPW4oMjApLGQ9cihjKSxsPW4oMyk7ZVsiZGVmYXVsdCJdPWl9LGZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7ZnVuY3Rpb24gZSh0KXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWUodFtyXSk7ZWxzZSB0LnRleHQ9dC50ZXh0fHwiIix0LmRhdGE9dC5kYXRhfHwiIixuLnB1c2godCl9dmFyIG49W107cmV0dXJuIGUodCksbn1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZVsiZGVmYXVsdCJdPW59LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGEodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHModCl7dmFyIGUsbj0wO2ZvcihlPTA7ZTwxMjtlKz0yKW4rPXBhcnNlSW50KHRbZV0pO2ZvcihlPTE7ZTwxMjtlKz0yKW4rPTMqcGFyc2VJbnQodFtlXSk7cmV0dXJuKDEwLW4lMTApJTEwfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdT1uKDEpLGY9cih1KSxjPW4oMCksZD1yKGMpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLHIpe2kodGhpcyxlKSxuLnNlYXJjaCgvXlswLTldezEyfSQvKSE9PS0xJiYobis9cyhuKSk7dmFyIGE9byh0aGlzLHQuY2FsbCh0aGlzLG4scikpO3JldHVybiFyLmZsYXQmJnIuZm9udFNpemU+MTAqci53aWR0aD9hLmZvbnRTaXplPTEwKnIud2lkdGg6YS5mb250U2l6ZT1yLmZvbnRTaXplLGEuZ3VhcmRIZWlnaHQ9ci5oZWlnaHQrYS5mb250U2l6ZS8yK3IudGV4dE1hcmdpbixhLmxhc3RDaGFyPXIubGFzdENoYXIsYX1yZXR1cm4gYShlLHQpLGUucHJvdG90eXBlLnZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5zZWFyY2goL15bMC05XXsxM30kLykhPT0tMSYmdGhpcy5kYXRhWzEyXT09cyh0aGlzLmRhdGEpfSxlLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmZsYXQ/dGhpcy5mbGF0RW5jb2RpbmcoKTp0aGlzLmd1YXJkZWRFbmNvZGluZygpfSxlLnByb3RvdHlwZS5nZXRTdHJ1Y3R1cmU9ZnVuY3Rpb24oKXtyZXR1cm5bIkxMTExMTCIsIkxMR0xHRyIsIkxMR0dMRyIsIkxMR0dHTCIsIkxHTExHRyIsIkxHR0xMRyIsIkxHR0dMTCIsIkxHTEdMRyIsIkxHTEdHTCIsIkxHR0xHTCJdfSxlLnByb3RvdHlwZS5ndWFyZGVkRW5jb2Rpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZlsiZGVmYXVsdCJdLGU9W10sbj10aGlzLmdldFN0cnVjdHVyZSgpW3RoaXMuZGF0YVswXV0scj10aGlzLmRhdGEuc3Vic3RyKDEsNiksaT10aGlzLmRhdGEuc3Vic3RyKDcsNik7cmV0dXJuIHRoaXMub3B0aW9ucy5kaXNwbGF5VmFsdWUmJmUucHVzaCh7ZGF0YToiMDAwMDAwMDAwMDAwIix0ZXh0OnRoaXMudGV4dC5zdWJzdHIoMCwxKSxvcHRpb25zOnt0ZXh0QWxpZ246ImxlZnQiLGZvbnRTaXplOnRoaXMuZm9udFNpemV9fSksZS5wdXNoKHtkYXRhOiIxMDEiLG9wdGlvbnM6e2hlaWdodDp0aGlzLmd1YXJkSGVpZ2h0fX0pLGUucHVzaCh7ZGF0YTp0LmVuY29kZShyLG4pLHRleHQ6dGhpcy50ZXh0LnN1YnN0cigxLDYpLG9wdGlvbnM6e2ZvbnRTaXplOnRoaXMuZm9udFNpemV9fSksZS5wdXNoKHtkYXRhOiIwMTAxMCIsb3B0aW9uczp7aGVpZ2h0OnRoaXMuZ3VhcmRIZWlnaHR9fSksZS5wdXNoKHtkYXRhOnQuZW5jb2RlKGksIlJSUlJSUiIpLHRleHQ6dGhpcy50ZXh0LnN1YnN0cig3LDYpLG9wdGlvbnM6e2ZvbnRTaXplOnRoaXMuZm9udFNpemV9fSksZS5wdXNoKHtkYXRhOiIxMDEiLG9wdGlvbnM6e2hlaWdodDp0aGlzLmd1YXJkSGVpZ2h0fX0pLHRoaXMub3B0aW9ucy5sYXN0Q2hhciYmdGhpcy5vcHRpb25zLmRpc3BsYXlWYWx1ZSYmKGUucHVzaCh7ZGF0YToiMDAifSksZS5wdXNoKHtkYXRhOiIwMDAwMCIsdGV4dDp0aGlzLm9wdGlvbnMubGFzdENoYXIsb3B0aW9uczp7Zm9udFNpemU6dGhpcy5mb250U2l6ZX19KSksZX0sZS5wcm90b3R5cGUuZmxhdEVuY29kaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGZbImRlZmF1bHQiXSxlPSIiLG49dGhpcy5nZXRTdHJ1Y3R1cmUoKVt0aGlzLmRhdGFbMF1dO3JldHVybiBlKz0iMTAxIixlKz10LmVuY29kZSh0aGlzLmRhdGEuc3Vic3RyKDEsNiksbiksZSs9IjAxMDEwIixlKz10LmVuY29kZSh0aGlzLmRhdGEuc3Vic3RyKDcsNiksIlJSUlJSUiIpLGUrPSIxMDEiLHtkYXRhOmUsdGV4dDp0aGlzLnRleHR9fSxlfShkWyJkZWZhdWx0Il0pO2VbImRlZmF1bHQiXT1sfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OnsiZGVmYXVsdCI6dH19ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiFlfHwib2JqZWN0IiE9dHlwZW9mIGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP3Q6ZX1mdW5jdGlvbiBhKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgIit0eXBlb2YgZSk7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmKE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxlKTp0Ll9fcHJvdG9fXz1lKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHM9bigxKSx1PXIocyksZj1uKDApLGM9cihmKSxkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixyKXtpKHRoaXMsZSk7dmFyIGE9byh0aGlzLHQuY2FsbCh0aGlzLG4scikpO3JldHVybiBhLnN0cnVjdHVyZT1bIkxMIiwiTEciLCJHTCIsIkdHIl0sYX1yZXR1cm4gYShlLHQpLGUucHJvdG90eXBlLnZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5zZWFyY2goL15bMC05XXsyfSQvKSE9PS0xfSxlLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgdVsiZGVmYXVsdCJdLGU9dGhpcy5zdHJ1Y3R1cmVbcGFyc2VJbnQodGhpcy5kYXRhKSU0XSxuPSIxMDExIjtyZXR1cm4gbis9dC5lbmNvZGUodGhpcy5kYXRhLGUsIjAxIikse2RhdGE6bix0ZXh0OnRoaXMudGV4dH19LGV9KGNbImRlZmF1bHQiXSk7ZVsiZGVmYXVsdCJdPWR9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGEodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcz1uKDEpLHU9cihzKSxmPW4oMCksYz1yKGYpLGQ9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLHIpe2kodGhpcyxlKTt2YXIgYT1vKHRoaXMsdC5jYWxsKHRoaXMsbixyKSk7cmV0dXJuIGEuc3RydWN0dXJlPVsiR0dMTEwiLCJHTEdMTCIsIkdMTEdMIiwiR0xMTEciLCJMR0dMTCIsIkxMR0dMIiwiTExMR0ciLCJMR0xHTCIsIkxHTExHIiwiTExHTEciXSxhfXJldHVybiBhKGUsdCksZS5wcm90b3R5cGUudmFsaWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLnNlYXJjaCgvXlswLTldezV9JC8pIT09LTF9LGUucHJvdG90eXBlLmVuY29kZT1mdW5jdGlvbigpe3ZhciB0PW5ldyB1WyJkZWZhdWx0Il0sZT10aGlzLmNoZWNrc3VtKCksbj0iMTAxMSI7cmV0dXJuIG4rPXQuZW5jb2RlKHRoaXMuZGF0YSx0aGlzLnN0cnVjdHVyZVtlXSwiMDEiKSx7ZGF0YTpuLHRleHQ6dGhpcy50ZXh0fX0sZS5wcm90b3R5cGUuY2hlY2tzdW09ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0Kz0zKnBhcnNlSW50KHRoaXMuZGF0YVswXSksdCs9OSpwYXJzZUludCh0aGlzLmRhdGFbMV0pLHQrPTMqcGFyc2VJbnQodGhpcy5kYXRhWzJdKSx0Kz05KnBhcnNlSW50KHRoaXMuZGF0YVszXSksdCs9MypwYXJzZUludCh0aGlzLmRhdGFbNF0pLHQlMTB9LGV9KGNbImRlZmF1bHQiXSk7ZVsiZGVmYXVsdCJdPWR9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGEodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHModCl7dmFyIGUsbj0wO2ZvcihlPTA7ZTw3O2UrPTIpbis9MypwYXJzZUludCh0W2VdKTtmb3IoZT0xO2U8NztlKz0yKW4rPXBhcnNlSW50KHRbZV0pO3JldHVybigxMC1uJTEwKSUxMH1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHU9bigxKSxmPXIodSksYz1uKDApLGQ9cihjKSxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixyKXtyZXR1cm4gaSh0aGlzLGUpLG4uc2VhcmNoKC9eWzAtOV17N30kLykhPT0tMSYmKG4rPXMobikpLG8odGhpcyx0LmNhbGwodGhpcyxuLHIpKX1yZXR1cm4gYShlLHQpLGUucHJvdG90eXBlLnZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5zZWFyY2goL15bMC05XXs4fSQvKSE9PS0xJiZ0aGlzLmRhdGFbN109PXModGhpcy5kYXRhKX0sZS5wcm90b3R5cGUuZW5jb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGZbImRlZmF1bHQiXSxlPSIiLG49dGhpcy5kYXRhLnN1YnN0cigwLDQpLHI9dGhpcy5kYXRhLnN1YnN0cig0LDQpO3JldHVybiBlKz10LnN0YXJ0QmluLGUrPXQuZW5jb2RlKG4sIkxMTEwiKSxlKz10Lm1pZGRsZUJpbixlKz10LmVuY29kZShyLCJSUlJSIiksZSs9dC5lbmRCaW4se2RhdGE6ZSx0ZXh0OnRoaXMudGV4dH19LGV9KGRbImRlZmF1bHQiXSk7ZVsiZGVmYXVsdCJdPWx9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1mdW5jdGlvbiBpKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gbyh0LGUpe2lmKCF0KXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIWV8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/dDplfWZ1bmN0aW9uIGEodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiBlKTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LGUpOnQuX19wcm90b19fPWUpfWZ1bmN0aW9uIHModCl7dmFyIGUsbj0wO2ZvcihlPTE7ZTwxMTtlKz0yKW4rPXBhcnNlSW50KHRbZV0pO2ZvcihlPTA7ZTwxMTtlKz0yKW4rPTMqcGFyc2VJbnQodFtlXSk7cmV0dXJuKDEwLW4lMTApJTEwfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdT1uKDEpLGY9cih1KSxjPW4oMCksZD1yKGMpLGw9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLHIpe2kodGhpcyxlKSxuLnNlYXJjaCgvXlswLTldezExfSQvKSE9PS0xJiYobis9cyhuKSk7dmFyIGE9byh0aGlzLHQuY2FsbCh0aGlzLG4scikpO3JldHVybiBhLmRpc3BsYXlWYWx1ZT1yLmRpc3BsYXlWYWx1ZSxyLmZvbnRTaXplPjEwKnIud2lkdGg/YS5mb250U2l6ZT0xMCpyLndpZHRoOmEuZm9udFNpemU9ci5mb250U2l6ZSxhLmd1YXJkSGVpZ2h0PXIuaGVpZ2h0K2EuZm9udFNpemUvMityLnRleHRNYXJnaW4sYX1yZXR1cm4gYShlLHQpLGUucHJvdG90eXBlLnZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5zZWFyY2goL15bMC05XXsxMn0kLykhPT0tMSYmdGhpcy5kYXRhWzExXT09cyh0aGlzLmRhdGEpfSxlLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmZsYXQ/dGhpcy5mbGF0RW5jb2RpbmcoKTp0aGlzLmd1YXJkZWRFbmNvZGluZygpfSxlLnByb3RvdHlwZS5mbGF0RW5jb2Rpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZlsiZGVmYXVsdCJdLGU9IiI7cmV0dXJuIGUrPSIxMDEiLGUrPXQuZW5jb2RlKHRoaXMuZGF0YS5zdWJzdHIoMCw2KSwiTExMTExMIiksZSs9IjAxMDEwIixlKz10LmVuY29kZSh0aGlzLmRhdGEuc3Vic3RyKDYsNiksIlJSUlJSUiIpLGUrPSIxMDEiLHtkYXRhOmUsdGV4dDp0aGlzLnRleHR9fSxlLnByb3RvdHlwZS5ndWFyZGVkRW5jb2Rpbmc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgZlsiZGVmYXVsdCJdLGU9W107cmV0dXJuIHRoaXMuZGlzcGxheVZhbHVlJiZlLnB1c2goe2RhdGE6IjAwMDAwMDAwIix0ZXh0OnRoaXMudGV4dC5zdWJzdHIoMCwxKSxvcHRpb25zOnt0ZXh0QWxpZ246ImxlZnQiLGZvbnRTaXplOnRoaXMuZm9udFNpemV9fSksZS5wdXNoKHtkYXRhOiIxMDEiK3QuZW5jb2RlKHRoaXMuZGF0YVswXSwiTCIpLG9wdGlvbnM6e2hlaWdodDp0aGlzLmd1YXJkSGVpZ2h0fX0pLGUucHVzaCh7ZGF0YTp0LmVuY29kZSh0aGlzLmRhdGEuc3Vic3RyKDEsNSksIkxMTExMIiksdGV4dDp0aGlzLnRleHQuc3Vic3RyKDEsNSksb3B0aW9uczp7Zm9udFNpemU6dGhpcy5mb250U2l6ZX19KSxlLnB1c2goe2RhdGE6IjAxMDEwIixvcHRpb25zOntoZWlnaHQ6dGhpcy5ndWFyZEhlaWdodH19KSxlLnB1c2goe2RhdGE6dC5lbmNvZGUodGhpcy5kYXRhLnN1YnN0cig2LDUpLCJSUlJSUiIpLHRleHQ6dGhpcy50ZXh0LnN1YnN0cig2LDUpLG9wdGlvbnM6e2ZvbnRTaXplOnRoaXMuZm9udFNpemV9fSksZS5wdXNoKHtkYXRhOnQuZW5jb2RlKHRoaXMuZGF0YVsxMV0sIlIiKSsiMTAxIixvcHRpb25zOntoZWlnaHQ6dGhpcy5ndWFyZEhlaWdodH19KSx0aGlzLmRpc3BsYXlWYWx1ZSYmZS5wdXNoKHtkYXRhOiIwMDAwMDAwMCIsdGV4dDp0aGlzLnRleHQuc3Vic3RyKDExLDEpLG9wdGlvbnM6e3RleHRBbGlnbjoicmlnaHQiLGZvbnRTaXplOnRoaXMuZm9udFNpemV9fSksZX0sZX0oZFsiZGVmYXVsdCJdKTtlWyJkZWZhdWx0Il09bH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ImRlZmF1bHQiOnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLlVQQz1lLkVBTjI9ZS5FQU41PWUuRUFOOD1lLkVBTjEzPXZvaWQgMDt2YXIgaT1uKDEyKSxvPXIoaSksYT1uKDE1KSxzPXIoYSksdT1uKDE0KSxmPXIodSksYz1uKDEzKSxkPXIoYyksbD1uKDE2KSxoPXIobCk7ZS5FQU4xMz1vWyJkZWZhdWx0Il0sZS5FQU44PXNbImRlZmF1bHQiXSxlLkVBTjU9ZlsiZGVmYXVsdCJdLGUuRUFOMj1kWyJkZWZhdWx0Il0sZS5VUEM9aFsiZGVmYXVsdCJdfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OnsiZGVmYXVsdCI6dH19ZnVuY3Rpb24gaSh0KXt2YXIgZT17fTtmb3IodmFyIG4gaW4gdVsiZGVmYXVsdCJdKXVbImRlZmF1bHQiXS5oYXNPd25Qcm9wZXJ0eShuKSYmKHQuaGFzQXR0cmlidXRlKCJqc2JhcmNvZGUtIituLnRvTG93ZXJDYXNlKCkpJiYoZVtuXT10LmdldEF0dHJpYnV0ZSgianNiYXJjb2RlLSIrbi50b0xvd2VyQ2FzZSgpKSksdC5oYXNBdHRyaWJ1dGUoImRhdGEtIituLnRvTG93ZXJDYXNlKCkpJiYoZVtuXT10LmdldEF0dHJpYnV0ZSgiZGF0YS0iK24udG9Mb3dlckNhc2UoKSkpKTtyZXR1cm4gZS52YWx1ZT10LmdldEF0dHJpYnV0ZSgianNiYXJjb2RlLXZhbHVlIil8fHQuZ2V0QXR0cmlidXRlKCJkYXRhLXZhbHVlIiksZT0oMCxhWyJkZWZhdWx0Il0pKGUpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDQpLGE9cihvKSxzPW4oNSksdT1yKHMpO2VbImRlZmF1bHQiXT1pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OnsiZGVmYXVsdCI6dH19ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbz1uKDIpLGE9cihvKSxzPW4oNiksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLHIpe2kodGhpcyx0KSx0aGlzLmNhbnZhcz1lLHRoaXMuZW5jb2RpbmdzPW4sdGhpcy5vcHRpb25zPXJ9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2lmKCF0aGlzLmNhbnZhcy5nZXRDb250ZXh0KXRocm93IG5ldyBFcnJvcigiVGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBjYW52YXMuIik7dGhpcy5wcmVwYXJlQ2FudmFzKCk7Zm9yKHZhciB0PTA7dDx0aGlzLmVuY29kaW5ncy5sZW5ndGg7dCsrKXt2YXIgZT0oMCxhWyJkZWZhdWx0Il0pKHRoaXMub3B0aW9ucyx0aGlzLmVuY29kaW5nc1t0XS5vcHRpb25zKTt0aGlzLmRyYXdDYW52YXNCYXJjb2RlKGUsdGhpcy5lbmNvZGluZ3NbdF0pLHRoaXMuZHJhd0NhbnZhc1RleHQoZSx0aGlzLmVuY29kaW5nc1t0XSksdGhpcy5tb3ZlQ2FudmFzRHJhd2luZyh0aGlzLmVuY29kaW5nc1t0XSl9dGhpcy5yZXN0b3JlQ2FudmFzKCl9LHQucHJvdG90eXBlLnByZXBhcmVDYW52YXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpO3Quc2F2ZSgpLCgwLHMuY2FsY3VsYXRlRW5jb2RpbmdBdHRyaWJ1dGVzKSh0aGlzLmVuY29kaW5ncyx0aGlzLm9wdGlvbnMsdCk7dmFyIGU9KDAscy5nZXRUb3RhbFdpZHRoT2ZFbmNvZGluZ3MpKHRoaXMuZW5jb2RpbmdzKSxuPSgwLHMuZ2V0TWF4aW11bUhlaWdodE9mRW5jb2RpbmdzKSh0aGlzLmVuY29kaW5ncyk7dGhpcy5jYW52YXMud2lkdGg9ZSt0aGlzLm9wdGlvbnMubWFyZ2luTGVmdCt0aGlzLm9wdGlvbnMubWFyZ2luUmlnaHQsdGhpcy5jYW52YXMuaGVpZ2h0PW4sdC5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodCksdGhpcy5vcHRpb25zLmJhY2tncm91bmQmJih0LmZpbGxTdHlsZT10aGlzLm9wdGlvbnMuYmFja2dyb3VuZCx0LmZpbGxSZWN0KDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpKSx0LnRyYW5zbGF0ZSh0aGlzLm9wdGlvbnMubWFyZ2luTGVmdCwwKX0sdC5wcm90b3R5cGUuZHJhd0NhbnZhc0JhcmNvZGU9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIiksaT1lLmRhdGE7bj0idG9wIj09dC50ZXh0UG9zaXRpb24/dC5tYXJnaW5Ub3ArdC5mb250U2l6ZSt0LnRleHRNYXJnaW46dC5tYXJnaW5Ub3Asci5maWxsU3R5bGU9dC5saW5lQ29sb3I7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBhPW8qdC53aWR0aCtlLmJhcmNvZGVQYWRkaW5nOyIxIj09PWlbb10/ci5maWxsUmVjdChhLG4sdC53aWR0aCx0LmhlaWdodCk6aVtvXSYmci5maWxsUmVjdChhLG4sdC53aWR0aCx0LmhlaWdodCppW29dKX19LHQucHJvdG90eXBlLmRyYXdDYW52YXNUZXh0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKSxyPXQuZm9udE9wdGlvbnMrIiAiK3QuZm9udFNpemUrInB4ICIrdC5mb250O2lmKHQuZGlzcGxheVZhbHVlKXt2YXIgaSxvO289InRvcCI9PXQudGV4dFBvc2l0aW9uP3QubWFyZ2luVG9wK3QuZm9udFNpemUtdC50ZXh0TWFyZ2luOnQuaGVpZ2h0K3QudGV4dE1hcmdpbit0Lm1hcmdpblRvcCt0LmZvbnRTaXplLG4uZm9udD1yLCJsZWZ0Ij09dC50ZXh0QWxpZ258fGUuYmFyY29kZVBhZGRpbmc+MD8oaT0wLG4udGV4dEFsaWduPSJsZWZ0Iik6InJpZ2h0Ij09dC50ZXh0QWxpZ24/KGk9ZS53aWR0aC0xLG4udGV4dEFsaWduPSJyaWdodCIpOihpPWUud2lkdGgvMixuLnRleHRBbGlnbj0iY2VudGVyIiksbi5maWxsVGV4dChlLnRleHQsaSxvKX19LHQucHJvdG90eXBlLm1vdmVDYW52YXNEcmF3aW5nPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7ZS50cmFuc2xhdGUodC53aWR0aCwwKX0sdC5wcm90b3R5cGUucmVzdG9yZUNhbnZhcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7dC5yZXN0b3JlKCl9LHR9KCk7ZVsiZGVmYXVsdCJdPXV9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6eyJkZWZhdWx0Ijp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGk9bigxOSksbz1yKGkpLGE9bigyMikscz1yKGEpLHU9bigyMSksZj1yKHUpO2VbImRlZmF1bHQiXT17Q2FudmFzUmVuZGVyZXI6b1siZGVmYXVsdCJdLFNWR1JlbmRlcmVyOnNbImRlZmF1bHQiXSxPYmplY3RSZW5kZXJlcjpmWyJkZWZhdWx0Il19fSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsaSl7bih0aGlzLHQpLHRoaXMub2JqZWN0PWUsdGhpcy5lbmNvZGluZ3M9cix0aGlzLm9wdGlvbnM9aX1yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5vYmplY3QuZW5jb2RpbmdzPXRoaXMuZW5jb2RpbmdzfSx0fSgpO2VbImRlZmF1bHQiXT1yfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OnsiZGVmYXVsdCI6dH19ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIG8odCxlLG4pe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkLCJnIik7cmV0dXJuIHIuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyIsICIrZSsiKSIpLG4uYXBwZW5kQ2hpbGQocikscn1mdW5jdGlvbiBhKHQsZSl7dC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmlsbDoiK2UubGluZUNvbG9yKyI7Iil9ZnVuY3Rpb24gcyh0LGUsbixyLGkpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkLCJyZWN0Iik7cmV0dXJuIG8uc2V0QXR0cmlidXRlKCJ4Iix0KSxvLnNldEF0dHJpYnV0ZSgieSIsZSksby5zZXRBdHRyaWJ1dGUoIndpZHRoIixuKSxvLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixyKSxpLmFwcGVuZENoaWxkKG8pLG99T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1PW4oMiksZj1yKHUpLGM9big2KSxkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLHIpe2kodGhpcyx0KSx0aGlzLnN2Zz1lLHRoaXMuZW5jb2RpbmdzPW4sdGhpcy5vcHRpb25zPXJ9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5tYXJnaW5MZWZ0O3RoaXMucHJlcGFyZVNWRygpO2Zvcih2YXIgZT0wO2U8dGhpcy5lbmNvZGluZ3MubGVuZ3RoO2UrKyl7dmFyIG49dGhpcy5lbmNvZGluZ3NbZV0scj0oMCxmWyJkZWZhdWx0Il0pKHRoaXMub3B0aW9ucyxuLm9wdGlvbnMpLGk9byh0LHIubWFyZ2luVG9wLHRoaXMuc3ZnKTthKGksciksdGhpcy5kcmF3U3ZnQmFyY29kZShpLHIsbiksdGhpcy5kcmF3U1ZHVGV4dChpLHIsbiksdCs9bi53aWR0aH19LHQucHJvdG90eXBlLnByZXBhcmVTVkc9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuc3ZnLmZpcnN0Q2hpbGQ7KXRoaXMuc3ZnLnJlbW92ZUNoaWxkKHRoaXMuc3ZnLmZpcnN0Q2hpbGQpOygwLGMuY2FsY3VsYXRlRW5jb2RpbmdBdHRyaWJ1dGVzKSh0aGlzLmVuY29kaW5ncyx0aGlzLm9wdGlvbnMpO3ZhciB0PSgwLGMuZ2V0VG90YWxXaWR0aE9mRW5jb2RpbmdzKSh0aGlzLmVuY29kaW5ncyksZT0oMCxjLmdldE1heGltdW1IZWlnaHRPZkVuY29kaW5ncykodGhpcy5lbmNvZGluZ3MpLG49dCt0aGlzLm9wdGlvbnMubWFyZ2luTGVmdCt0aGlzLm9wdGlvbnMubWFyZ2luUmlnaHQ7dGhpcy5zZXRTdmdBdHRyaWJ1dGVzKG4sZSksdGhpcy5vcHRpb25zLmJhY2tncm91bmQmJnMoMCwwLG4sZSx0aGlzLnN2Zykuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZpbGw6Iit0aGlzLm9wdGlvbnMuYmFja2dyb3VuZCsiOyIpfSx0LnByb3RvdHlwZS5kcmF3U3ZnQmFyY29kZT1mdW5jdGlvbih0LGUsbil7dmFyIHIsaT1uLmRhdGE7cj0idG9wIj09ZS50ZXh0UG9zaXRpb24/ZS5mb250U2l6ZStlLnRleHRNYXJnaW46MDtmb3IodmFyIG89MCxhPTAsdT0wO3U8aS5sZW5ndGg7dSsrKWE9dSplLndpZHRoK24uYmFyY29kZVBhZGRpbmcsIjEiPT09aVt1XT9vKys6bz4wJiYocyhhLWUud2lkdGgqbyxyLGUud2lkdGgqbyxlLmhlaWdodCx0KSxvPTApO28+MCYmcyhhLWUud2lkdGgqKG8tMSkscixlLndpZHRoKm8sZS5oZWlnaHQsdCl9LHQucHJvdG90eXBlLmRyYXdTVkdUZXh0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZCwidGV4dCIpO2lmKGUuZGlzcGxheVZhbHVlKXt2YXIgaSxvO3Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZvbnQ6IitlLmZvbnRPcHRpb25zKyIgIitlLmZvbnRTaXplKyJweCAiK2UuZm9udCksbz0idG9wIj09ZS50ZXh0UG9zaXRpb24/ZS5mb250U2l6ZS1lLnRleHRNYXJnaW46ZS5oZWlnaHQrZS50ZXh0TWFyZ2luK2UuZm9udFNpemUsImxlZnQiPT1lLnRleHRBbGlnbnx8bi5iYXJjb2RlUGFkZGluZz4wPyhpPTAsci5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIiwic3RhcnQiKSk6InJpZ2h0Ij09ZS50ZXh0QWxpZ24/KGk9bi53aWR0aC0xLHIuc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIsImVuZCIpKTooaT1uLndpZHRoLzIsci5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikpLHIuc2V0QXR0cmlidXRlKCJ4IixpKSxyLnNldEF0dHJpYnV0ZSgieSIsbyksci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuLnRleHQpKSx0LmFwcGVuZENoaWxkKHIpfX0sdC5wcm90b3R5cGUuc2V0U3ZnQXR0cmlidXRlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc3ZnO24uc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCsicHgiKSxuLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKyJweCIpLG4uc2V0QXR0cmlidXRlKCJ4IiwiMHB4Iiksbi5zZXRBdHRyaWJ1dGUoInkiLCIwcHgiKSxuLnNldEF0dHJpYnV0ZSgidmlld0JveCIsIjAgMCAiK3QrIiAiK2UpLG4uc2V0QXR0cmlidXRlKCJ4bWxucyIsZCksbi5zZXRBdHRyaWJ1dGUoInZlcnNpb24iLCIxLjEiKSxuLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlKDAsMCkifSx0fSgpO2VbImRlZmF1bHQiXT1sfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OnsiZGVmYXVsdCI6dH19ZnVuY3Rpb24gaSh0LGUpe08ucHJvdG90eXBlW2VdPU8ucHJvdG90eXBlW2UudG9VcHBlckNhc2UoKV09Ty5wcm90b3R5cGVbZS50b0xvd2VyQ2FzZSgpXT1mdW5jdGlvbihuLHIpe3ZhciBpPXRoaXM7cmV0dXJuIGkuX2Vycm9ySGFuZGxlci53cmFwQmFyY29kZUNhbGwoZnVuY3Rpb24oKXtyLnRleHQ9InVuZGVmaW5lZCI9PXR5cGVvZiByLnRleHQ/dm9pZCAwOiIiK3IudGV4dDt2YXIgYT0oMCxkWyJkZWZhdWx0Il0pKGkuX29wdGlvbnMscik7YT0oMCx3WyJkZWZhdWx0Il0pKGEpO3ZhciBzPXRbZV0sdT1vKG4scyxhKTtyZXR1cm4gaS5fZW5jb2RpbmdzLnB1c2godSksaX0pfX1mdW5jdGlvbiBvKHQsZSxuKXt0PSIiK3Q7dmFyIHI9bmV3IGUodCxuKTtpZighci52YWxpZCgpKXRocm93IG5ldyB4LkludmFsaWRJbnB1dEV4Y2VwdGlvbihyLmNvbnN0cnVjdG9yLm5hbWUsdCk7dmFyIGk9ci5lbmNvZGUoKTtpPSgwLGhbImRlZmF1bHQiXSkoaSk7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspaVtvXS5vcHRpb25zPSgwLGRbImRlZmF1bHQiXSkobixpW29dLm9wdGlvbnMpO3JldHVybiBpfWZ1bmN0aW9uIGEoKXtyZXR1cm4gZlsiZGVmYXVsdCJdLkNPREUxMjg/IkNPREUxMjgiOk9iamVjdC5rZXlzKGZbImRlZmF1bHQiXSlbMF19ZnVuY3Rpb24gcyh0LGUsbil7ZT0oMCxoWyJkZWZhdWx0Il0pKGUpO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0ub3B0aW9ucz0oMCxkWyJkZWZhdWx0Il0pKG4sZVtyXS5vcHRpb25zKSwoMCxnWyJkZWZhdWx0Il0pKGVbcl0ub3B0aW9ucyk7KDAsZ1siZGVmYXVsdCJdKShuKTt2YXIgaT10LnJlbmRlcmVyLG89bmV3IGkodC5lbGVtZW50LGUsbik7by5yZW5kZXIoKSx0LmFmdGVyUmVuZGVyJiZ0LmFmdGVyUmVuZGVyKCl9dmFyIHU9big3KSxmPXIodSksYz1uKDIpLGQ9cihjKSxsPW4oMTEpLGg9cihsKSxwPW4oOSksZz1yKHApLHY9bigxMCkseT1yKHYpLGI9big0KSx3PXIoYiksbT1uKDgpLF89cihtKSx4PW4oMyksTD1uKDUpLEU9cihMKSxPPWZ1bmN0aW9uKCl7fSxBPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uZXcgTztpZigidW5kZWZpbmVkIj09dHlwZW9mIHQpdGhyb3cgRXJyb3IoIk5vIGVsZW1lbnQgdG8gcmVuZGVyIG9uIHdhcyBwcm92aWRlZC4iKTtyZXR1cm4gci5fcmVuZGVyUHJvcGVydGllcz0oMCx5WyJkZWZhdWx0Il0pKHQpLHIuX2VuY29kaW5ncz1bXSxyLl9vcHRpb25zPUVbImRlZmF1bHQiXSxyLl9lcnJvckhhbmRsZXI9bmV3IF9bImRlZmF1bHQiXShyKSwidW5kZWZpbmVkIiE9dHlwZW9mIGUmJihuPW58fHt9LG4uZm9ybWF0fHwobi5mb3JtYXQ9YSgpKSxyLm9wdGlvbnMobilbbi5mb3JtYXRdKGUsbikucmVuZGVyKCkpLHJ9O0EuZ2V0TW9kdWxlPWZ1bmN0aW9uKHQpe3JldHVybiBmWyJkZWZhdWx0Il1bdF19O2Zvcih2YXIgUCBpbiBmWyJkZWZhdWx0Il0pZlsiZGVmYXVsdCJdLmhhc093blByb3BlcnR5KFApJiZpKGZbImRlZmF1bHQiXSxQKTtPLnByb3RvdHlwZS5vcHRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vcHRpb25zPSgwLGRbImRlZmF1bHQiXSkodGhpcy5fb3B0aW9ucyx0KSx0aGlzfSxPLnByb3RvdHlwZS5ibGFuaz1mdW5jdGlvbih0KXt2YXIgZT0iMCIucmVwZWF0KHQpO3JldHVybiB0aGlzLl9lbmNvZGluZ3MucHVzaCh7ZGF0YTplfSksdGhpc30sTy5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe2lmKHRoaXMuX3JlbmRlclByb3BlcnRpZXMpe0FycmF5LmlzQXJyYXkodGhpcy5fcmVuZGVyUHJvcGVydGllcyl8fCh0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzPVt0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzXSk7dmFyIHQ7Zm9yKHZhciBlIGluIHRoaXMuX3JlbmRlclByb3BlcnRpZXMpe3Q9dGhpcy5fcmVuZGVyUHJvcGVydGllc1tlXTt2YXIgbj0oMCxkWyJkZWZhdWx0Il0pKHRoaXMuX29wdGlvbnMsdC5vcHRpb25zKTsiYXV0byI9PW4uZm9ybWF0JiYobi5mb3JtYXQ9YSgpKSx0aGlzLl9lcnJvckhhbmRsZXIud3JhcEJhcmNvZGVDYWxsKGZ1bmN0aW9uKCl7dmFyIGU9bi52YWx1ZSxyPWZbImRlZmF1bHQiXVtuLmZvcm1hdC50b1VwcGVyQ2FzZSgpXSxpPW8oZSxyLG4pO3ModCxpLG4pfSl9fX0sTy5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX3JlbmRlclByb3BlcnRpZXMpdGhyb3cgbmV3IHguTm9FbGVtZW50RXhjZXB0aW9uO2lmKEFycmF5LmlzQXJyYXkodGhpcy5fcmVuZGVyUHJvcGVydGllcykpZm9yKHZhciB0PTA7dDx0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzLmxlbmd0aDt0Kyspcyh0aGlzLl9yZW5kZXJQcm9wZXJ0aWVzW3RdLHRoaXMuX2VuY29kaW5ncyx0aGlzLl9vcHRpb25zKTtlbHNlIHModGhpcy5fcmVuZGVyUHJvcGVydGllcyx0aGlzLl9lbmNvZGluZ3MsdGhpcy5fb3B0aW9ucyk7cmV0dXJuIHRoaXN9LE8ucHJvdG90eXBlLl9kZWZhdWx0cz1FWyJkZWZhdWx0Il0sInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuSnNCYXJjb2RlPUEpLCJ1bmRlZmluZWQiIT10eXBlb2YgalF1ZXJ5JiYoalF1ZXJ5LmZuLkpzQmFyY29kZT1mdW5jdGlvbih0LGUpe3ZhciBuPVtdO3JldHVybiBqUXVlcnkodGhpcykuZWFjaChmdW5jdGlvbigpe24ucHVzaCh0aGlzKX0pLEEobix0LGUpfSksdC5leHBvcnRzPUF9XSk7"></script> 
</head>
<body>

    <svg class="barcode"
  jsbarcode-format="EAN13"
  jsbarcode-value="7501031311309"
  jsbarcode-textmargin="0"
  jsbarcode-fontoptions="bold">
</svg>
    <svg class="barcode"
  jsbarcode-format="EAN8"
  jsbarcode-value="4012345"
  jsbarcode-textmargin="0"
  jsbarcode-fontoptions="bold">
</svg>
<script>
JsBarcode(".barcode").init();
</script>
</body>
</html>
0

O. To jest fajne. Tylko jeszcze drobna podpowiedź i będzie super. Generalnie działa. Jednak moduł wyświetlania w tym oprogramowaniu oparty jest o Internet Explorer (niestety). Kiedy testuję to rozwiązanie jako plik html i uruchamiam go w IE, to na dole pojawia mi się głupi komunikat, że Program Internet Explorer ograniczył tej witrynie uruchamianie skryptów i kontrolek ActiveX i jest przycisk Zezwalaj na zablokowaną zawartość. Po kliknięciu wszytko ładnie się pojawia. No cóż, w aplikacji tego komunikatu nie mam, przez co , kody się nie wyświetlają. Jak zmusić IE, do uruchomienia tego JS-a, bez głupich komentarzy?

0

Dodaj na początku pliku:

<!-- saved from url=(0014)about:internet -->

1 użytkowników online, w tym zalogowanych: 0, gości: 1