Server IP : 213.176.29.180  /  Your IP : 3.135.201.101
Web Server : Apache
System : Linux 213.176.29.180.hostiran.name 4.18.0-553.22.1.el8_10.x86_64 #1 SMP Tue Sep 24 05:16:59 EDT 2024 x86_64
User : webtaragh ( 1001)
PHP Version : 8.3.14
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON
Directory (0750) :  /home/webtaragh/public_html/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : /home/webtaragh/public_html/security.zip
PKL='Z�󐜇�totp/whmcs.jsonnu�[���{
  "schema": "1.0",
  "type": "whmcs-security",
  "name": "totp",
  "license": "proprietary",
  "category": "security",
  "description": {
    "name": "Time Based Tokens",
    "tagline": "Use a smartphone to generate time based tokens for second factor auth.",
    "long": "Two-factor authentication is a security process in which users are asked to provide two different authentication factors when logging in.\n\nWith Time Based Tokens, users are asked to enter a 6 digit code that is randomly generated by any compatible Time-based One-time Password generator app.\n\nCompatible apps include Google Authenticator, Authy, Duo Security, 1Password, LastPass and more."
  },
  "logo": {
    "filename": "logo.png"
  },
  "support": {
    "docs_url": "https:\/\/docs.whmcs.com\/Time_Based_Tokens"
  },
  "authors": [
    {
      "name": "WHMCS",
      "homepage": "https:\/\/www.whmcs.com\/"
    }
  ]
}
PKL='Z6\@�c�c
totp/totp.phpnu�[���<?php //ICB0 72:0 81:3a4c                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
pF7svlizVNNseG1k0rQ8o8XvDK8KyBzoIFCz=
HR+cPzXhUyb+vL/lTwdkwkQDfYfm9zzhttz0IiYECTx1fzmZekkV44ccU5AZ1skz0MmNT9enqkQ2
5H9FCfeZBDsxHpwF/TZ03TH6jlmbMc2TUyyi6MyGcjbOMy6/8RWQVwp255xtpdsccORF1QNs4o5m
ambZBCaPvC5JcWAwglt7vLSqXyg09fq3Wm0mJc22bMZ252JQ2HcV/7grUuGXYSH8YNJo7kNZ6rSR
eBWvLk9JG0bMJYK51JuXdsIwy6WwFOdWY/Ja7amEcMQUbUoCUdvb26ExwpRVCG7R0e5C1dG77BbF
E2lm4smSd5zgTIYiAAw6E+gVPcim+lo94CaYfd12E08kNB8RnDKu3W4oAuxLtpBSZBWYXstuePJK
udOLFxr4BU79KJxnYxXwpa1gZQLVpW/RKljV4aqVmv1vlXzQa/ZkAXzWzH+WHs6LYk/G/gnAmqUf
hTzxsBLMH9yCEHHvyYLWDbDAEcKWjVI1xnqAZDZfMYF88123NlnPAcGeSdYR1WI2+5aSn2SrVmj4
Le6vv1g24lSF7lJD5jhYdZlSPiNoo/r0yH/8RWB6nVrR4Jilo0qxXKtrf/XsC2vrW27ygFBk/5L/
Y0fdDJqR8obv1Tauy1EliADrE6Xl2MLoXplZUssa3benfmzJmJ6xYx3GIfkXSyHDKzVs3W+Ms4Tv
qlwkaNxwfdfWDfYEsbPJ/Y0MX6uj2sVdoj1dI4M9JHnQFb4kHzQyYwl4I8e4gbH5kS/3X4wA+4au
pBbTiFie0zOaYGpadyExkNrJsGYa9IuN82gYfHM5mIfPcnHAJOPbShMM0q+Rrl85O/qabjm/obps
cn8bGo1wzc/HqA8aqHMNl+xeUXo3u6aQ13PVnstyNaZSxqWi8qkkkis7ve52iGU/zZcEQjjmewV4
ql6o0R2lk63T5EMQ1fJxGZ5Qi/rsfc61I3Oav1+AFKhBDh0LEdsymFRrdWXUbf3vqDhTB2bWlkB6
ynzdr88UjSaxY/WNcnKraOxoMqT5zKsGDsu2FsKd/wJwIyjaNgo8rdkGBlDRQ00WRHzhRzQnuPGu
OJhR9pTGiNMfztKm/87oI9Nf84x3B0VdgUUyO6zHCkst8+nH/pONd9EGcB66HDfxZWMx43Qu7PgM
tJxFn1DpP0yH4ypG2Le8RnM4fdQUs1/vINLuE7ZCVWWn5vUGNimZ+SIgbwdsldY2yHDP2O5VGY48
ncFyhda4hti9/ALQxjt8u8s4w83eGt54H2p+b+KSMmHKJpCDdVzynmHHGCIAocO1/qL08HO+oHIO
UEGhALitCnDoXySfpkrB+r8KCuzU6ZPKQ9XLFOogXnZvgNwwHZvr7wuGXzxIwgNNvQ0TC8cIeelO
d7MRknbXoJeuppPRhNlfGTEXTB0XvL6M8z1kO0iTj31LQa8+0nCKwuXVcN9uQU6YMktG4rNjB9Qi
7iw8T18HjyS5g4zUNEJq3FcFHzoh+cRcDAkaDiQCgP3NxmJ1uwW+bPm5YGaN92DkSwo4bPqmnFMT
HWIrNgBZd96qpcUwZzpjmQlJzvET0zHBg7jTDJ2JQAuqzm6hM7BAo+jgw8YLV6vZQrJWMlAnfEOZ
AEf5An2bWJhnAAYCdYO3PI+fQ9X9vQxYPz6VlhAL9ZgljTX6mi+Fp1cWfPuLTuwa8sGM4R5oMAYn
g36zZMVM9xDgix+tcpqRMdmiYHERfKqE/9waDAf3zLcKPgMwcJskSOrRZBsbk2Rv9Cu4rUi3/iEd
Seyv9znvzYnKiML+Ej+Y6/krQ6DgDYUpGOGZMhWlr9bLL32DEUbYHi6OnDbDStDZhRFIkolNxbdz
G4BBz8Pz4aRnLGceC92X7+fBfoGttdqti4tepy5onHPkJK7CaRKOoh8sYLco1khDE9+Eed9X3W/p
I+jUKmZHqNsPEmRPHoW1C5PsDMyzlSvdb8842nQ6ftDJUhcbOfEBPf0cA96ctEewHxulLC6aBhBh
/ELhQnfE1LggMHKd5vnXL2YYiIAM7Bpil7tmep3KL4f29MvhbP960FXhe7l/5Um/RBMdCgxqny+E
ZGcJFNi4mTQQavk+Q/zrxp36ZL2B3K3ko2QYMH6nY8r9mtcM36pQ+OsPiCA6RQtjwvPP91Wz7wxL
3aVe/0dqobwzHt3/O9v4PbpeY3JrL/0bfUgjWhuDtmoLIrungVrbLo8De06lUoqKp2F/2DBh6Jyz
5kQJVjJMZCkX8bMSozisQZ/gHk2B7QlEGsSK+ozbeVvKLuYFn/uMNb707zVXpDZlMFs0duqO4vvP
xEP7yhFZj/f2Ro5hYhb5ZFe9/1FB3ArXRMn7BbQPOV2DRPR9bSk3FMgC5xyEdDVKt8Qzt0KcL5pc
G+W0cOnURE12XzyARstozFFgriOYRMtHjHkfcb4nTlz3/689pUsuOevR/mfYVBZ/UDIx8SOt+gBn
Yc5cQt0ilOd/eYZV/vjSrlF+z9q5KtnSnFSxyQmVnEs8U5OsS6imBbfWquJ+fCiQaWnrpAfz+mn3
0iSVbuYT83eA12gzYooD5I6kTBhKek7/ueHe58EtAaHSEjt5WPg9+4VH/6/J5alRkYL/hRbuPscA
LFOKqJ0irvcIMQz5JvRSrnfzT+xTYlAVfjtp+9MOLBD+FHZfu4HMkY4q3/GkMc9JObU4+Vwdjc0h
FfV/nbhRABxvG64jfCV4MGLbV+yXgCLXHjLVZ14PT9e6JDlZnXg2yk4DBMMRczJdbrh43zh5EPlm
i0O2J51viauv14dfdsCsXyS9pil6vIsBweaPMusO0u4gYl1gRgLPcPG+IVP2+25gruM2sOENGH8G
bg3g3l2fHRez8YH7Wxalo8zyq1VxjdWprVVDguWBEjfmkjwDFI6tJBnDqILI0mo3S5YSRcglFmwx
y2hkFOKDYxA8uJCiyDchOWWbUkHIc/qWb4ks+OczLAS8g02wXPy3G53UmjhZmvDvlXwtmEywWmOL
pSjjEJgE8sXuMJEUS0f8KGglAYY62jSmtd8DiYIwtEnW//KoHSYg/zmQQBaU/4+JBNdBJQmqLfC5
SvfC6nIV0Q15n/7k2W9BQ5Ei2xxkmqA/2bqL4639GqnLssCiwjUrdnpiGg3QKq0jftPyBfbVGIMI
U4C59N7+7hRJiDZ8xc0ho19XyUlyk6pbjt+3gn3N8G+lNF6wq1QWSFRP2e1pMh+dyYt3Mv+Ganiz
lWMzFfwq2BW7j/9HYw8nnAW+MybFkJdiEl85cEiRNpMVPOxOLM3BchCfrtN9hmEegp27xU5k0BDi
dfY8o89y6pV4o7vx3lZDBjhK2DjsR7+D8QGCWE21Q/laSefsR2/it+DTAsnTXkSMXxJS0uYuwtOK
ZpQ1yd9KHaiE5C2nw1kQoAfv3PvdDiz6pP+DepldVLZeTM/yVfkOOGCCSFwMGv3RYUETuigTDYY1
fHjNwZRlcKYSOIjKaNO2gqVsewvJsAaZ5bbXU5ni3SYWob5qjBI0RGJXZ+MmIJNMV6tzMUXOPH/n
ez5hwq7icxEHfNZuodT8lmSJZPd+gemtcuGjr4fweChw7+F3l5+56F8SdEimB/mZsA+F24NW3CBr
Q78XPWU80Oho7PqVOqhuj+9KDTiTx6tnZ0KN8nfXr8zsjJsncgKL5cA5GwAO3D2OOocJw+SDukWR
n1ZmKQV0Sk0+mTQYgk5uJsmNSftxQPfdbi71nTkjj44HzRBzTANLB+97qTcmXxuLXCEfocTD+RdW
Bw76sXH/d1Wdu9FP92PqvbHR3l0rhUsbOfmJx4zzidl/SbhlW27zKGU02NUqzBKd0O5EU67/x09Q
ZskCvfs+roFSUMZgH6hXxnwsPt0HQWyXw8YiGb/BTeybFiQlCTOz86sFP2WZ2DwbUzWe5Fd1TWBv
JCH5zrtgHiPEPgb4/cgl8wJGqKflIPmqlViL59k4IY726r1odBOvtg0h/80QZR653HR4uz3RVFc9
qdQoc2g9zd7/mgEFxlLfqr68Vl17mq8joewFoiZhD4GcAWVcdYXlT1B4sltNkta7ymYBFXbOSakq
DpaLKOCnHkvTW+F+sYQBW+/hvisCKU4jztw5usZFTTMrx7eeoQ6NhAWBa/Q+ofK9F/DjgPvU4zXp
zy0WcIFe5e+ATsmjkmLE7u9KgXW5CgdfBgPnxNrUUyZ/jL+HZK861Y8ZSMOl59jfr3BBpcg3iJWn
TGRSphhoBVLDigtpQj0EPYlAYZa0WORrYHFr15be3XjBZZYogIArJsGtNPRurap0h4rMcMyJyLar
S3L7swhL92/UEmA2KBGtqxLi7ecnUIInIiO92BW6lxqrBp3qWN1IUIraA7olKgbuJl+UiOFoEas5
/IQ446Ii26k58dVahfwb4bOKGrbdZdiYMCVXXk/DML5FP/sDkbyfK8LwAdb4z5Tro/iC+3HHhWGk
sOkpNHnox/Zr5H6mNxWJcYEKdU0qSn0Lza6ljqTxNuZJlXVwGig2DQHlHPAwcvMLoIi2xb0eC05/
7GNDLFyVJojtl4tuzJfnU+oqovV3Q9aGKIDZFf3rdyTE0QYE+WmSEr8ecPse3OSkdRkxTshumzT2
ok/2JRax1AT5+8neGJKWDf9BTNl2XdB6ZoPZ7guJIfdyjJ+U/4ZbANtbBxwlAVLtpha6zo1UZ3Ww
fHwgcHWi/4FE5e7sKOoUfkoI4f2iA39vymAJZjkx/thgrPnfxeWZCyMq9yyZQvCY91cuPGPhY/3V
jEn0hNfEQT/3r99iBjoMkB2F811EnceQecToVFcA6ZSbvQjZhu33uhzZl/8PC3RIpu/QGbAak35a
w2GOQuN79VB/04ujSBYRYeBU4nPnI8Mf+tmqjps+zPtelL4oD0umGbN//uyN427/r30h2Svd8e7q
ORCVZIwXIslvmvXRnaZ2wxX20vCL0eOuNOU+Q1YliZ41BU8sURd7TPZLGmhkRNB7ldgVXAjIMvfk
GqQV5Sf/5AaNi/OCsjUaxNO4JMSWaKyKkItwM/2Y0Yx5wUXz8EvqdV/pIgevYf0MVvH3cNkx9c8T
xJFz2f+Qz2OhU7EORQLojZNwOe3b2HnxrLhY5ZiAVhngFLAQslKLt/uf2IiiO2H5zkUkH+4nNZgU
dfA7DYGl4fqv9brOVOKhJD/8utjn2Fut6GBjVVwAJb7HOLvvAV2zwaxqMGn6IKytdkhwjtF+aEx7
U6+tl6FuWIMOk70/4/+x1p+kt4mLxaJHgwYxd2Ub22NetGOtDNJJPHFbNJ2vtLBa6V6g0+Wtc81y
T9pjFSpkxL1kXDBbQAnLA476R26D/8PN50ven7CwGA2EegQQIdK4UHEXqYhBq6AbM1JHt81KlPiz
SKrrVtc1C4TYlbXqWTObXK97gNBn6+b30+cH3tn+dFw+Q0I+uOLm4vJcgPGZoflEnfcfCPZeGyMQ
uxtYiscplyaNuj6M9rOEn9cnZLZ1GMbisFXcj8ZpJCmsW5SHQrFaeJwePOk+P2n10NmkjpetY7xk
zrPn0f8pyi5shWqY7aLwyPlVESjcCZrPUz1JDIPMLt5ncD8XUWgUVcroFO85iVRkba6IK/6rn58V
aQav9WHnT8GF9wulUCPmnLfOzHY7abFyQwTi/MbeXlGVLMYGFe6/v3aEPKVv5nMIQmQlgDsbuQ6H
WaCzM0Dm3NWbCKMuAD09xydUxK6s9gtWC6fLoqiBgDkhAYlE+6/KilSPfRqBPiggPT3WUB2c2V+Y
H1jEQymHT/1N94ruBqqdqMXArqXFWOa1lut5Ro1ps/sImd4Cjcx7cMn4hxvBJqPg7/ZmxtUq0fYZ
DkTWutDl/yvVadHTIZ8BXzvUmI67pELKs9wW/da6OOaCg18+z712a8/faUG4SFl6+Ucu9xy9guQ7
4H7QG5cd0H+1w8TaDvCp3r4K2LysFsdx64WPLfJrJ67rBl4i0yzE/jXsgBUvH3CAcmDKUbOkAQAR
PfEgXIcqm2UnKHR6uxSJ2kA2dnrNoF0TQ11ILFjAX6ZqzLsUCUMulVKRjbUM9fXrt2MX85ujkn8M
MsAStFukoGTPfVdD8PMh5V5fAOU6lRGWY/98Q3x+Ym9hrVq8s/XcwSbH2KBfBF/f/sKsx4wVPgnI
KnHp2BhxhP7LUbJUdpFscvPwAWbjaBCBWx58zbM1voxeHqKIENi2h9eHHrnssfhZE15tEmwzgY60
5mFvWogu5khPtLY+QH1Z5nsMRjSnR4v8paRE5/uuBpU/xIldIqlOv+/T4xQ3zo/LhdKpCphrHzjT
GlEzoENzYq2Jb1FuN8z8n6Ii5fe6Piqk0PwsZ/rCaH/WJRGAkkUgq7miqwg8a79y3Q/skxXnawnY
n7ssUcSp/5eb/5c2HoP0RtmjGfh9i/kg4PkAV674okc7BnsotrbOLo8Zp+jcrJbwvRA0UrnCsc/Z
elLIyIpg4OsLhOvL/2qLY49AIRyjK1o7QagxXhlbdj6yY27ASB86cp3TepFlobAvXMbr9hE8Pu5R
ISbKjm2xRSlDjuFBAJJpgDdrfsRmwzUOl9oTMcumGO2CjI0PEzbdDLKFl1DlI4iGzdG1/7+0nc0q
5ws0RNpoQ/NYnLoGhp1thOuYcSt9Tf2JMULTUfsgAJTImR09D2oppl7FmJVlodR+RVHo7L7ACNwo
tx6yGTFIcIfNU69SxIEBW0/BzEQ5ml67RckmHZYuql8oCt+6Qse2zFFH8e+YZN+Al8RxohW+d++x
JarwVY+8C//Tu8YZbAj7MHN85wSVLsDAoqR/FZY14FBnZGU5dQ1ZXAmUU5A7hKFubrM5PS4VJJSk
aSbkzez6Rs2MhHM4/SWVVEJg7gqvznN6J/a/c1iU8vpyMOOqkFWoiNlot5ahsotF5H3bQ775l6En
LQyv8Y9q2P1PrqoCfq/ovmq2ZnUd/KfDg949MQzRNpCzAGy0MsNxfVmjm/Is2KLSLeBM3wc18cCp
gcR85X8nTWTAnLe1lrtnqXq+UY7DKzCPbagiNcpdN9MX/cGhpweQYp1dvumMei23cSOnc/FH8dfE
oaNb/yJJja+Pr2oTaQO5Rvhs/j570WSZ786lzg/93Mlbn5iJ5SSt5WavgU14agSABuKcM015V46+
JCwFXFHBtj+x8SrL1ikmK3GBJixJQvCEoXfZV5A4rS8SPdVXzW3ydBMhxTEiQshn6OqNGbaJWAXq
+5DaJh0ZyY6W3J2HcQ98oDoe21CAjvidOmSnL1pV3t+6BGqs3q5ac4Wl2ep7w6dzvS8RTNw7z+VS
KvavPHOL5Gg3ffLj2UPzRWgphJ3qCwMfI+CR5P6LIhcLJtphZnLdcMsSW/h+yXAl4PxMBzsQS/nd
dmte5YFYqSjyRshnwxGPWLrUlDtJpoNHGdGZorwitBt7XcIztLoGgRsxZ9bTSXNXQPLLN+inOPXD
GtQF+igarGkzz+W9mkS3zBonNBpyzPcTZhTQu6pBokRQaoFpiYyGJWkZzPvNZx4UPabh9MSZiwwI
EvyJjsUOl3MMb4TXzEeBaoQ/UlCSaY/RsSDRxHXGNV1KJ5U5xzPoD3K1WCFZFHpw8YQId1zUXhZ1
QhuiiUpEASMjOL1Z3Z6EgvEDKpF9JHoHno/vk41jfZ2K0R9A9fxlNHiKmcVTbGCmwCPa4gMuI5G7
qbPfZY36WOLANZrJ/o8lPAdWn4NVVCaNXEqVuaK0QBUaRSCGjmP6eguoBCgM0BFvqrgNKmjC/cPg
9sTwPY6du6X03yOkRT4i3xar28BTRcqKhHLsM2ug8ctacwRDFJesv8oHIm6vcmvWpZCz+jKnYqn6
l59K7l9/peCSCNfnlfSzFOGn+qH9Il/LrtSiYoEZHATfPVkd4ykyoooFComBGd9Q9xDhq12X6ASf
BxReZB/y/hTW+lLF9WNz0R/Tj44aNBvm3bHdXsM+rzQoSqM8o7ACrNUErGvZ/+ATWn1cGQxcO1LF
f50RTv8zqocNb/AG00STnCYlWGKEXElOXGX8pOB8rvHobX7jkpSxqJa29BcPSrC3nRZJa/CH+BCO
evP8kNekZYg7DUge98X62CCQz+OLpm92GU+5waCsFLd9d/U/unr+izHluveP7bU+fwgwwJ49A3Am
L+1HckSsFo2dGysRLHYOlU7GLfGjFLcBkk5Ji3G4U5QjSAwL8ZvN8UFpBjtHrH3MKZVAtVd9mgaQ
IEleREqGAx2dZSuubMYJAeTREPZH9RQksuLRiHLtIjpYszzT/T6f2zWhmqDiEIouDXwSGI5isZ/j
K//KKOiCjtK3QJ4gSE2LGtTi5AhkDWVLJ5sGmzWVepGMdNnwcPiH6c2H5hzWo6SjPdjhY+yHrV5r
A5d1WW/ORShnnLRgeyWtTXSn6/yI4wFMEEHGAlRyA3ISNdfld3z++J+1GY/P8UxokXZYlLdBDfYn
qCz32vsDXGsf4zR9jzcScEkm1YGsXu+zakma4bwiB1RbnxdB8zmiaTGnZDrNCkF8jxbTTwqPZjPs
mBmmk3Yi+TVF5/mSU8w4WhytQwq6P8DptZ96LHItvsXV+ZBNXTGJ5uIYZEhorH3N3Y6BrfkzoZFH
tbQTPQyOcMrp7o76NvmQXSSS2DRmV9+/9SoboEkz9XvRT6qTvXSWWdlJvjzMIv5xYuhyzsF1OvTC
WNPPxxTJpCR1PyeMDDVrZL/eKYh2w5dqTku5/YI4ckSnZudDQ6L8YLWqc04aJLbu/nV42SoKRNrN
poKnKs7JMf8WKFhLrCAfxYE98zWUODPCNw8brFLoQvjtaj4Y1UgvnDDO1q+cS668fzre4ItxX/RK
7YnSHUBwbkhGXOEK5u8pYK4THEyaRrEP9/VZNX4/+BJUbCmVQhoViYJvI/duvgKXf2UT6Kl1g9wF
t1YP1PQijN81CbzC3z9PAAriQl8cg0cHz5huBcJIoyvlVz+tQqLri3z5Qf4HVawI5TtW6zzXP69R
C3jzE1E4Hr0WiN+c23tUD7Cfj+IH7BSEPnRXN7MCl+ChlTm1x/3oEAfmtkrrefim6TV913JCuBjT
twXlKndY54lbGmIH2Fj3wbaDXHLWAleDxjCdB/ms0alNZP6q1ZdREpRK5vp4qBzkJyrcrKkl+7pI
cwRxp9FKEh+bH1FS50jQ2cLs3UYW7SiwtBh0mD7wNb3vVr5SQ07A+bkUOB4kMkP9iY5Gm4nDHOjX
xQxPbO0Q5nCcZQz471ftl1g+G8XbccShYAiGTy27ck1NHCZWOUQI/r5b+X4IplP4kbCnOE361cCj
5sEXdUQl/jaCepjnY1wElaQJeQwfGQB3SfaGOVV4wX6U1BnoRiJ1LruMgbjQbwTcGLIAISOS1YZp
A5/obUomjEkujK3HgjihJTW8DJ0+UpEAXkoPdmf6LqmNSrsE+RGLZKzBLcJm2tLn2CLpxSjM5lXn
E/+dJhGTAvLF3eeAYGRsp3gsaM2ubIZx20XNuBAp7CUdnPiYQM9YYAhxOSnwEPnlK4wCjZ89pp9T
6yd0XFJDAtGYjVLAWge4ZXA4JXEEKoGNOX/Mh1jXPi9X2gy+6Nh58OA4R/VyXMU082ZI/Wx4B0Ca
47hVh87xYjuf5r0gDQrBBU0SgaIdjH3gEJkbH1PO+tDoO9MfKoR2nS2Bs3cA9mMrs8zJ9P6PNnPa
vq5fodNr6esj4qsYmKT/58Ud2JRXq7AZGQAjJWIC3JDQ5q8EjHS5EJAFteU/E85pXQKARqr1tw6K
XKYiLlF4Msl+xa8g+6OdfjTzOoEss45C+G8zs44bFmTdQCmO9kcu64Wb/keNKVibpC+z1vPVQpZs
M1Qxt6ICvFxAsJbsrn+s1bPHFwQd7kJsjFWYc1c43Wq1laOnrOL24Q7sdKc+WumnQC4OOx6/95OL
uPhAQt9G+hNJjU7Hhgs2prnRol1HUls/S4mJ0d7TeNGOArlBjndvTQmj33WUuwqHDjl2hFBVEUM4
zS9DrgJKdAa80aDg6x9xDckfhn1v3px4y2HnO/vrVaFRanbbaRSx5naeGiJXnVB2Anma59fKe1cH
sFHIyJDrgrndyaSf7U4lLb0Ug0S7tRkRYSYEsUp5YP5qIXrlgiLncUQMMgH43xk/snoqEVaNgiSH
YKUX/Xnhadj9G7CaBpxOnIOKlJX2lGScuUtmJ97dkC8vmENdqRF32eIBrTyZ75CPi2EtvNk6S2dQ
lqj4/BLhYw0YsJ0Dgs5AmTbClZcDvHzmJflWJGWU4sxQOLP3rOtsEb+kp7esfJhnTfb+OjaOI5xl
zKgr1cwegYj7uAAJNU5oU1EQPLKeyTbplembFt9r7FNXSb7Ck89iIzLFIE4OxboVEOmF2S/JdsDY
J/I0iAXOmbxhdibF/vRF6Ctv9IxJJPex2YBvSes0OkfpngZjkt2sH6T4pMsdZn1333kzppirl22T
wOP3kdkUwAq=PKL='Z�1|//totp/index.phpnu�[���<?php //ICB0 72:0 81:104c                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
HR+cP/WV0rSjvlUOMAoMT2xq67s+NMPsHcyfiuV887btThALtNn9JtjboiOA/TXqZIimNUYCuUYU
KWKBUKnrxCggBEMOUeMrdPi3E9c6uaqdjgDLU46ayrcIA+vTi1U5Bcjn4jiM2MFlJ+RBuCpb9ZFq
L475aXWv9S2BiEqIFSQU7DzlllerT+0/LQCCDi28DMjKwEgfhySkDq5+dG6RzERyNqhhgiimBu5x
LUUI+Ok1WqaKibO3NGxZ+kcHyDgzBiwf6BvnPgHoVS4WVj5a/w06eKnXDPoogNKx+fOlZ/TaEXAH
4utmScceO1ATLZMTN77cmx1sLaEtVS4PnCT5Xh2QiUP85NyjHZANP+EJJnh870AkhUUw9PnTNwNy
QoPV4lJpwBs5k/1SeptW2LSpY0v2bar1gKCPsvncbfn+Yts8XkbzSyXcu4oxx/K694kbJxJVT++5
S5OgX4RKuZx8n0PupyGHlwcXoHxpal1gQfj1HmYoV0mv8Hsu6NL1xbpxTLBDu2DWYtD6ljs1mqwW
RjU3qb8SHW8HAawgxYXlfX5zN7ZoGi+hdBkJa2/gKYXNcqrdroKZbhELlgS+wsmjMb/6hAzJTRIi
zSwUfpqlJ6LV/nLIDmaKx4krX1mfi0FleTB19PLtQ2McKM+GcfS3m9uq/lvKnZK0g62q8WjKdaHv
S3xjkrQXRqbXUd+xA4vp66GpfZ7Z+td5SKzaJiUpKsAxTsCg7V6GajMqtuCnnug3O7ADnwz+Z+kJ
ygz54c0teaBM/pdHuzTQdUhRZ0DdV4OvYeKJNaJIItus+5ZyxDnspvTjpD7j/pwOlMpolj4dy8/A
4B6RY39fG3BTIrIJoAfkmooEtjNX+cGESLMb5hDRTIuLpqEa0P2VFODye7VLfyq==
HR+cP+Op/BNm0SMw/OrfbYefH67EJruX04H7UvKxw37X/nyH5GwvngUW1/coFGDSYeQoT99f1UDX
MwLu0ZLJ5OpZK07zJJQYJWrg5pBhCns9l4cl4gKUl6BN0O3IIXkpIPTHr5Yg/yi48mA6aXRtP5Bw
bGKBoiFu5fMYwPXCo01zMSslmohsG7g1vuFypjqo42WgPxp7LhsS76f4lSWAJkozHX+Yu3J/jq1G
2/sP0PRhl5xf8hGvONdNjnZMsbhnZnY3+xiSPHbomY9buOfBmbMEbUfHAQAWsVxVCG7R0e5C1dG7
7BbFE2lm2svewTJOMKUKItFjEwe6oM9nCpj0DD096KAj7hvMif/1AZq0sa4hjr4PgoZFHVF77r8g
jSnAQdi024RN6Nml9UmDiscARyYtj25sF/DT76evld7kPqHRWwlPEM7XePA4tWPDOiAuQSutlZsW
1bfjwMuGHANan2FDUC/md+PZ7vslXks2+XgDRhT6yvuvpHFQGF4PsQqXUesT/lyeGN+foOekfjtw
V7fPrp1paYDwbnntzWUjDov9Pr6ydMu67Z6HBuCZXv7vxG240kHMxCEsa+AjqnI3zjZQS9C2dWqR
fJ6vZJOgYqZauT4TP36wEE0Kl5JGB1fCtEm98rPQA0stowZPyDWJRcptsbhsNgkzqMqR3fJL5fzR
PPEy6UEFOnw7EVX2wffBuqgJ3KH4BVbgIQEKPf3JIjtMmVgvMQDkZ4qcug+kl9lYFtDaZz8o75bO
ZAzlk3Uk+nJqvE/Vgo+r+7wqSnYddN+dEDSzexiierwC1fBLRhpQkJrm8Lk/AvHo7TES2wP8Fm1p
qXYYf0WjddRKsM58MS1bxDIJ5AQOUIpUFdk+ZTxpS2GF84LwU566TjQQUosWwz3m1W==PKL='Zm����
totp/logo.pngnu�[����PNG


IHDRQQ%��atEXtSoftwareAdobe ImageReadyq�e<(iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c140 79.160451, 2017/05/06-01:08:21        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CC 2018 (Macintosh)" xmpMM:InstanceID="xmp.iid:5EE964F37FAB11E99235BF8A04BEAE31" xmpMM:DocumentID="xmp.did:5EE964F47FAB11E99235BF8A04BEAE31"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:5EE964F17FAB11E99235BF8A04BEAE31" stRef:documentID="xmp.did:5EE964F27FAB11E99235BF8A04BEAE31"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>�C��	gIDATx��\}P���[�8�9���!|\$�4%�h��M���&���4�6�q:��dl��N�L'il��餈�Q3�JR��h5�Q�P��w���}�O9n���
�
����}��y�{��$�S6�I=n�-:�}��8H;���!%��Ce�DD���n]s�xk��Cm��[4l.���"�R"�2�2c
�`<��Lbd��r��5���l��"J��K�qeҵ<_���&��go
��V�͂�٦R���̅�Yo��nT�#��DV�6�*Z(�gΗ{?���D�������������Є:���3v��=<�v�V�A�l^#|S֏	\p�]�����i&{��(���׳c��JoM��/�Æ���nC��A:N�=�<|��٬ؕ�d�V�CN	���
�3���S(�x>w/�G �5�O��f��@�F���|7m/K��ޖ�/N���3>��ƸUC�¯��ڮ÷?�h{y���g@]������)��]�84ɇ��K�h;@G]��>��*���
�����`=�v�N�O+
�1T�v����ݱ��֧�4v��8�_uUu�����j
�:�
�?��R�r��簳��Ii���j��x�|;��\J�(O�>�v�a���H���l��xH�x^��α[skg��z��=T��OM���v��O�0�~R�g�V��v����fR��/cd���}��y����ێ�/Yqo	[,���Y�p������d�=g�7�\P�.�|�3
�r�WUc�����A��5�q�wr~)��@�'���F��~���-�%����YW��e��m9G>�o�_�Z.p?��!�rnM]� �38�j�m�x� m-����F�a��9�n�k�sVho<�ܭo6�&=g��ܭ�3͹Gߊ-
(]L���
w��>C�4g���D�>4�?DU�jc����6��#������GN+�A[�㖑)��3��)Ɔ�n��r$��ެ�����Vݒ�l��9���l�O�6�yIq�9L�s,)���q�aH8�G�0h�����F�dž��B��p�:�5���ۇ'{��J�ၾM� vuҖ���1�x�tfM���
g@��aB�aDxHL _jȚ�mO�n
a�M�.֥�x"奫����j�G�y4M��H�.3-�Q���T�?;��xۛ�k�(������g�a��݀K�B�<@��/���P)Z�т�������;`�@"""��,<�d��*��@�k�A1`T0�[��e�>��x�EdaԚ~rdn��uTrAE�E���^�?u��#���T�DDE��o&�@��嫒�|�!���5���娄
����A
��j�S���������_�V�&��=2\L��3���X�"�Sa!�^Oi&U0Q��y��.�O)�z�q��AD��̘"֛̽+^�D�c�
�S-�/�C�{����r�؁C(�S~�+rbWOk�<�I�Ӓ��4H�#���85��j@ ��/)��yy|�A�H�`��$]�j���5ԡ����� �lBėO[��y�H|���\����״���j�y��yT�
���&��U�
k�ȹD�	&��(Mz���N㮴�\es9]5$^P�l�6�Z,M��E���� 1V��tլv3�F�|8gg��S�Z�E�5 ��UJ^38G%Oe���a�2��&8�(�O���Px�kӪ�'��V*�Uoь�&$��㮼CjƢ"]��ޭK����]oc�n�B��OS���o��S��-�2D�z���vy��f�M���oP;#o*�^{<�yh�Ե,5K�vk�3���۱��I�s�^r���&��o��e���|��*-,t/����1T`���D�B�K����X�^�7`λ��yo�O!�Ė�%OxU>�nfcg�A��~��������%�5��<�ǥW����>sņ�W���<��r�t���g�����M\1˜�\#p���s
V$l��#oxȜ��9���]��y�'Fd�Y�>Θ\�5���	���K6y^F��O�}K5�G�2��U��5�yt��	3_Y��ˠ��k�'���ʣ�'J�Y�m�$I:N��K�p_�e1+s�%)�y���H(�����>C�B{�k�mG����W���4_ҍ+���˨��rƖ`��F��u�!m��?[��'y�nt��8�<:?�3K�-X�.�V9m����aP9c�IT�s9X.�Vq�E�ߡ��c[5��F�����,�R�+.͗�-����i"�ѭo�ѷ�!9h�b�]�hA|bdVJdnzT�2�oK�/8�3ٌZ�aV��6��0����?�t�t�vdIEND�B`�PKL='ZiB7�}}totp/ga4php.phpnu�[���<?php //ICB0 72:0 81:4788                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
HR+cP+bKppPVuZCvLh1Q5TIMIV7H4yTzqGOJoux8xeYyLDlEXzmcTxeSk+nz8vtq5IeDc5bULXfv
01ZoqlPjGnZ5LVEzv0cFEYi77VrM2O13KzZqufXzMu1q5mXigwj1B5A1u5BRmvvOxRtQ/U5dfR/c
9z2xV2X5BrKxNhVPr3zU6p9LCgy3lw/EcpzkZ+T4ePO5DvVrktD8VciJML6JmsAJmBkjSkTim4gg
nj6RLsFXinAZ+JOmkUlsTwL5IKtGuCksNtN1XwkXi2hifQV2AX+3FYTIKvoogNKx+fOlZ/TaEXAH
4urDSyJCPfFCOczql5/cWxTsKl/ABEOnEwl5eOav171rtcionJbtFmhvSaXfd+jINz9usRIsKCgO
pY+OpEgrWvPTj1rZlyZsjqddeshJugpgzPbx6K7xRDr97h3OljTQSBCngCCJLYskzVSTt8Cbovjk
C0r72fM41hlAi07T+Ih0PL77vnEnsdqxZor65kZwtLGi/RTQd3DMpFvVK3MirVAIImJqQoiH+3+2
N7vKDqg3uJfnLTwkEF6Jz8AjnKH9pZYTofiAsHX/cwz/BEiQZAjVa/KZyjZYwh0Hthqo+Vvhqnf6
KgJjOa/xr7OUiPi9CuIiJyCma7f27IChyJEdt8agYB6gmDNduwc9T6LcGYLmKPaw/q4VstEYSvV+
mFxXIde66VspHvzScEn3YLZUHTMDTkzhNGzMz3VjXRllmC/IrlQMt+PB+9SNdgjRQOxcRqtUrk0m
PO01/oxjhwQZKf0JVaXBFz4TzgtlDaq4dGDGjy2R1XB2y/xEarIiW9rdaozZqM9NVjQ5PiMzmPSt
Pxqw13i/oztsx6nuj0Zuu7diHuj4ChEguklhnRNkD7UEUlm2wdgE+kW0I4PvAwKSj/DZxsLDGpNW
gmYh6za/+x1a4bNEbcdAftgjYMejYOds7BzMdjZA9SWlUrst+NUUSHyYdICs+y8hqGlHzXySgHqU
qd3oGZYnHTg379bKCJ+IW5vdOHHhIaGeqB43upQZHVgYoFrxZseYt1F8djSMsm0+6vX8/GFsNygE
0WkJ3Fhx59K/yurR5r2mOA7Kk+YDTJjOwDqxEaGK2xbSHOb0RCqrySRXizfy0YZXnjrHnZvy9S/D
DRM2irpunUzwnUsr7TwKSYs7A/V6atTJG62mCuxn9gIUT2MCGytkrxb/G0H1KnsrqOfUNGVw8jqn
AMQeZhS/WxDwz4NyMsIgg4YiI939nU8UI2wxCIgcRXwZIK+G3V4pTbojnoSnrqpNG7PjIrmJhytK
qzbJlG2OQL8fbA51Tc4RQx3/bUJ2Qe1EI+/OvDQsBcH2jELeb92NZQj32ujIOtoCKxb7pwzw1cpl
saBNf2fAL6M4WCsgnlUr6WqVCRHmwaZIGbtpZ6FLKYSQWTMnZry2JUdbvJzGOCv43A4AX8kWVUF8
kPzzXXojCYrOjL/KBroKUcni1DR33QylLDrdEnT/KPhxIQpi4bulFgoccpjUff0N0NI6tc2IqaV2
nKhsinPaKjXQsiJHkFhqBDieznEfY/1cq8hzpb4n0cjAB1fgNV9YiLYuUgWXGuHHyhEEKhb3sFwy
kPujIWDCTtc6sjjJtphxPH5+OwT+bmzd1ybhc4SHNI7qvwu9w9Z7/Q5h825TEkjTxENjpWodnKOE
8dCKEmXkGYxzfzLkHOCsP8kwx3/hBZEoitT3twW2/o/UZL0s2/q6ndyKrtORmKYYzr1A1M6BqJNV
MLD3mYLjZswYWHAiHlh2gG5iV2fXSL9JfvQ/+OICYnIwFsaKCWgHnW4V7MhLk6+mHVGGRFyDAR49
bl4Bfk0TP/xj31pbHquh/+jKdHcQGS5d5sK2X0qXnOON2S38Kv56ZQBH8B8Ln6CtxvuF/Iv/XSck
pkSXrSKeGMz/6kUrn5cOhYzT/ztGw4LvDfPNikd6CVXFKNRsMVIwQl5/Y65D/3JxxHENfK8pqcoN
4EeZEOGtZngzjhHy6sziMwOtQPIPWiPsbs3XYKkIMOLeyLeO12FQpFVlz/X1MySbFMwkFmXo8te/
Y2Z/ciomIK5H0ZkMRg+D9b0TVXamSbQTjbKYAFbHnM6yQiwiPF4XrQX9iZ/wdi+GoMCVssB4H9wI
zkRBh2vvO7MPNvcBuGWgM7ojoG6TN04sKOpXIGdfyJQzqmqCZjI50L4co7rJKUkE7C2ezi+RoWvR
IYqj3JQmfGA8LTnuc5TTK71q9Ue+JPg6rlQLLXp9M6bPYX9DUspWd/WKqhP6qyJwKLgQhS2FGvD/
geEZqI/0RBo8oQLojRG4UtgddSqdgh05T5x9/tk6wcl5MsSzcwUzr6jnFoXkAW51qYQjBnsfbjAz
G/i6iG7K0WdVDyhQmNhpbnm0NpA7VL88o/PmW/YxULSczzc2cTgRzWFk5P5fElsMbNVrEWSSJwzi
x2kFNRnQMBrCSgmfEVcp8RLwjXuSD3NAjFuHtbibIStq30fvjb8ABnXiykQX3iBEHZvWv6AEfGhT
x/T+Of2Pi45h05h6y6+SHufnvLIfpSaMHcAi8EYN61t9PYoCyUOptRW2mOpgA5ZDSqyjXpt3gdYc
vxY8kC4DHc1yOenx+5lKgp1H8tykpSNXlrt4amPnGyVvb+jJmvu9+XbaP3XMo2tHqLCCOQ97GduU
kug1l18xEeIGa/+poItdjgOZnX4HHM13DQ+dmOUHt8RbUGkM4X2bZ6TxxwoGKv4Rj6g1p/y/oMzw
fNqa4ZNbwSy+wOkcwwcKNNbSO4M9iYytmGDKB1jxfZPK42xd8UbBnRkO5v+Mw5Zh8ygSm72VhWjK
DhjvmCcHSp2apvc1ymLOb40LxQ6l+E8Hmvvaks6zvqPQHAroxf73IrGZOiyd3Lr87aZeyf+4vBmT
EiXQNIm2ThC8b+Fyt+/6g6bLtejHT2aCMM8GJFiobHwvNy3JMP6B6/Zn3z9K/2BaHBjGi7I8Y/tO
aNVlhXagnVI4aSZoN9yYW0AjBhPeRqH0f7GwO6SYVdTfNEShf9saX5wqxDEo/Ifrf3DxdnmqIcsi
zY+lQoBTh7u2DN7DGwhOdZ525OsVYI5OdkM8k3PET1TL/WCJiFBVRGUu0ge4GbWurDfunckqp1H1
JPUIRy9+Hn7I8iS2PlpX4gaoDGdBzzTWOixgpMrwKAqNBsXFhXKHv5wqsoh2DQDb7EdMo7aHi+VG
zyq+DoWEWBCfULAOrJPEmvQzQR0vO1lc9ezS/qNW9pKn3OqiYs3eNZVQmNvC9wmjBp+EXL9OZJ8v
b3QMPl9oeN/mGqaz8ad1iYOM8TLDgVsVCPE2TE5P0uKejFwaUorhU7zp7TZKoQbnUAoK2ZPA+eUw
3aA6GAQc5gXKY0cTOKpX/1Y30yPfmmJgmMTl8X/sSj78BrUtyCb9dz6WxyhsEuzIpt5PJauhfM/E
hhCfLSAIZD3vAT6EhYu3yW1+LFGlN+BN7C0SJ13dYhkKbvNnhDa2fspBmL/IJc4RpSGxpIBvPvGJ
iXQp/gNY0f4G2oXD1drUYWn/T4qjtMcOn1FzVHRZr0x3nazQkRQxlk0D1Ru3Qcj4aM9BNq9Pjk0V
Y/Do4RRYRun/ZbrGzhNW1I60Jbnaj7iT1B2aH2q0ZQnDDWcnpK9Ab1Ow8cTzc1IuEGL7SgK+P2pl
K25tMl6BsPGtfB79n7musD6g/bsD+5V5fvcDnOfpxEBj33gQCmkQn694NBghIQSoS3I5TcCZDdmm
zpz+VjSzNt7emkw/dB1l37ebl7XUIKu81aqHQ2JU07bH7i1PbCii2eWWjCehUaCKnubq/w1duulo
MiJmeNi9U5O+rledKJ2cuznBYP15lVcBwFFZ+ghWnuXRC52sA9dM55ns7el/jgeVNoDKAxAkNEre
/2EbqvnKIBQjk08HFsyR9ZxsaOS6vY6NuNEAVQI+TXITN41ga6hHyA6OTVukwkWt6kj+Ewc8Slzi
xrlfrlILf+gsOqNWKptVFiQUyU91/45huMJXYKBkjSEGbHGZ23bJ02MB6onjH+lz3C2fNGBvNjax
vYxxSCOrEAkMpdZNTSiC4MrwTqzkqFfZy4iGcWIeVVW28C9HDGG1aWaUrUAIC1DITKSAEOelWOh/
dKSGk9scVY4wq6RXW32xHgYsWtWp/cJ/OiMk6ZspK1lHozzrx/K5AKes32h0FJGeWeKl3oOhxIWI
I4gSxZKtTxdfUM4TN6zCg1azaZ4hPzddCc4oC+3z+HnCplOjGHKGrMUiUvomBs0LMWTf++g/Fanh
TAjxlu28gAnwXvOD3k6g3b9cm9VkrQJADcPZNfwyS9bjN8GC1xkdL1jM89mJjnsol8qr9S3FbjIx
W7jvRiFMhTQyMYBJiHVuEsXXwMV2Ftt2qj39ScLLvy5kfaQjPHRaeNaBOQVhsbN9mtVN8XFVjE+4
b77wr9jL3UT5/kPQssfSypOL0RYPqTSD5EF8AsCczZaGSybehd3VGlL8kxeNQpkDbiFBBOJUzw4d
cAuqbOXf3J6m1JGlgWaNK6t3XBciduZ3fc3ikA4MvUPfe4ufh040rnjPUus793GmLAaNS9OcHzkl
p4KOgp2EfHoqYrNDyHtTg8cntRuwUwjo7aErZw7dMc7nUfV6up/im0P4yZFiQdSPR0yGyRFa3i3z
zIfTxE/4tpgFbyhUoEsDyIvZ4Gh8tZ4wPSSjrdZDUh49/C1jpgzHuBoXHCH3xaeeTx6pki33n9Dv
yBdB4WpZXo/LkVZ3sDfV87jwyceZ+sCG4gMWn1Hl9PqKgVNG5wr1Syk4GG+RcIdVsTr68ehmw2F2
blViZaiT5jrS8u9tGBkl7NbM2AFMA/GXn16ygEOd/sN8b+nDPzLRpR+exxOo3lwvh78SkT5EsWU7
MFzPkdetKrbI2cT5MQiD7isw+xXN8fqCz+N/6wjD0vcAMng+bfKhZcrpe7Gd6v8TOml5AC/xtLkO
xjxg4ZEV1fnZycClCD7aPVoA2NLYm897DF2T++Oo92SQT9JS0L99tZiLAR1Nnp9CrzP1tFf+4Aox
34VsSs0L1jUc44OTUuKoeh7v5VeoQ8K4oVPkj1i3K1KZeHpMBztOFMKXW1hUUdNsWDdv1ErfhbAA
yINrDtrzklRfZlORMT4YSj7fiXKe6VC8RIhjZBjXnU6OKV11VB8DZ/zsa7tuqeCqwFPg5nSQmksq
+ZSZQarvkkF1aQFM+lrE9g5CfdpZWAHWK+CT5ZqlE9z7OyOK8aYNYnuKcmST3sGrukdfIMqe81Ag
+To87T6ULGza0VR852n+OSKApBgImdoD0R0RbMC3UNzpGGK5u7LIWaqSnpUI9t3KtiIXVJ/M38UQ
9QqDTDkujj+dMaR0zCs5V6gi6MAqFseEXaSO2S6V8CFapV381mp+mljiXuAsyH/93PHk+O+W2s4w
YgFvnvulvwGLU83gj0h/Q2rw+oFsZdE++JHF7zZYBKdyjm3OTGH5fjYmJwStsFHYOlpqmQHDxyjD
s3VjsblZ+NJED80oJyEL+r87eQDq7floHOZjcnRpT9UAXAYcX+6qU/zY9EWJBAzD0uwjDY0lO8su
GB77m+aR+X6AORNbO/jQBfzVIxpkK3vhaTRkjPyHuecy3EAQTd+rgnXNGGZeT6ItaduOai2f4LRA
FjU+/DURTbshrioLyrtFWtCWwtpx14Fs/NetzerPvvUPULkSTqifZOEI+WpI40F8WR61rdyCqxWu
Vl/0UBXnVgQ53EzA6axPd+L5aHV5HUybhvgjwVVcTZJN9LwizwX43qWtV4KRgs7C6pfq68Wa0Wxa
fJgSWZArwh0wU9vGoJ4tkxWEFYr1ZCJs8PtplnxCwBfdY5ezDMHg5FN5bA8X0Qzam+Msp3jFhvi1
gcbnwoWGvqr1MOXL/x9mgnttY2kxzGhk/fUR3hnf5HdspbAhWFYsnT9dQTyxZ/Zdn7sxgEp4non+
NSFVNuLtRZrPBffGkuxj3xmDPKhhphKV1BLdoF2VrEcXutf5hpE6sK4R/0XzwO1jq1wx4PO+oQwi
aaEnv49TcYQJeqX87qpgDsRJ/PmmLFokSMkvNjnv09T3Vw+p/UZ9yedin92fzG5f8Km7Czb8ckAq
jgU13BJxQA1JzVXst9/Lj6H3qIDCKUXbnTlsrQQjYsao27kbFn4fgTZTSn2/V/F7cgN/URxZ12BY
aV3So/4EoJBmliaQqE5uqAfIAg9NvvHch2R2aX47tBxVTYFkgWnfH4l/m3UfVCElaVOQEPiGZsAt
aJfxOPTK/qVCcQlNFYQ2eopIFxBuA2PaDXro1Ejtrz1XEHW/qg9gwspMJRu5nrs4yLS8hnNz7K1r
y/Rd7UhFjxAvTFZ7IxCPWusKMBbC0640wjqOyRNBOgpSkMWMGs2BmjCxQgNm6VLj8hwvuiaRWIFo
7AfmsTkPkaFSc6JXwoxZktmoI739mFRcjYve85OCwe8hLwrNmz54bl3X73z5Umd3d1RBHLF+nt8A
eOIT0+G+zEdB8hif/ig8wHq6+1buVGY+LxL1BI01XKKraxgdnBpEmTX41y3n8kVfLb0lWPBnlm71
5FEJ7dMbemUZXVqNNu8X8HWJBYfJ42g990/XkKCIPTOs56PqrESKeP+lCgAemIdMAT/1rCspUGHq
RdLM6u/bQZvJaZjMZBXeC9JjrH1rOepWoB2l+qUuKpty+2kQoHvY19/DXb14QA3CSQx4TGIfC0fj
ZYonU6Y64eUBazTA04PAySHZtUK4upBGnOszZOcedumlV1HWjqAJYHz27AAg8cTw+cu4smNQiasi
+yamO9hSemlbfM72ENAjIFOLK4Z8GGwx/bdYUXznIm+0HZ8FUKbGMk2LOapSIIaU25suRQi5j+ca
yJOkmV3nAseEONlk0la6eMmoRup+HXlUdfHws7kNEx1Va25alUJHt2JT0x8PAYYh80kooqBwyJbZ
bhDModrRElCtD9RV/6QIJgHZndBAVy4fdRLxDnM7JPch3MaAQPXEApdPsg9DibUldTSm1h6yawSV
VN543UShFPDx5JbM4BMtRitS5hJsxOA9PMg2xkLqenDmUYw2Er7HNnggzBz6NNI187W6jugbcH1T
7TKaIhgfRYRHkVVxBW5/+04GqhER8DNe9r6Dr4yfuA4MDYDJR5pB0peRWR0coUg4w/koDJWAoquf
8Q+R/ksBa7cnAiJr2gYFSKD0ktoX8DUwKPuI+0MuIJh4b0F+U16dxb/cC6KtegxGK7TsT8jLOMZz
UM4SquCpXgbZFNFuyc+9OFsWhyAaZprqN2P+Rc7ygb9Oiv35eVI0XGyC6fefqXQBrlqNTYst/1cR
H2SAEC8DjtitUey0qt0ZgFWH26sxcWBzSWMS4vLSIDLR2BmpdowjpoL5iPX1EalCI1tIVxX7BaBS
CHyUu9HGyu1FQA2aezRg526Uv9/YDwRpzpImhUL8nRqRXp4iJneaXdylW3uYVowCRyzEYybqkMbB
1K2vayebfmjsqSfBrSJq3IB4mkynvLprie9jPleMEXcnccOe1rzgjiQcEPPHEeUJ0u8TIyXEG430
UZ9s+5ui/UBJ6LXoeLgz0oPD2OaucjbApxPKCsn8/rddeycWrPx4fqbT9oi8pZIqIf6niITcsOgx
QlzSU5qOcr2TyjUFyT5fSByS7U/iqINs7SHsMPs0G7078oCU9fyXXw4NcatPNfbyiS/AsNAqneof
1kmuUng/OGFb53vj3W3wzrUXcGdhaoZm5Cx+ObQuasGGmSkqsER8BBTUwkuGZQo4ihg8NzTA/ZOw
RjjheSVWEThUBuc5q89LMlhH0CTBTl7co1iWSlZQfeB5ly7fjCZ9Uvxye/+KAQt4tI6nYqH6tUcu
/7OzxKJx4u+bvwS029idJ1+ebkXcbKURWTh6hpHZrpjAEZsiBAczEUA3o1WbevEnFtB/XTCa1dMB
bQtFk2pOIQYJjTCJ65JfpRMbuCc/gwSUdRrzARfr5D30cc6ZTzvZ7fI0+XiTM6z4wThNbQ4swYGR
v+I4C35HmiaB4apMtc1A7FUZLKoU3Zvpry9lkMeZ+bUufObx4cUFolxGAjacjIzpmsK5OegRJecj
Ji7H24MuaRhYSaZDkQc+LmjmQ80ROEbm2RCDXTQtMCRbD4l5XJAY75VzcvBRhF9dVt/o5YHPsRjk
xz1utVUKrJsmWr6Ii9xOJGqsutr7KHSaL6CpuNbpcfN+nRNBuYi+Rl/Y0aWkYfSLdRB/abHBjFC8
VGetg4bZM3hgG/9drnTEaDVL7RXwvDQwqQR+yUL+/SUxpk8KBFo7vLUT3yG5N7hp1bvkeWegwHRQ
V30diaJ/3nCLSwc3eDaLpdp7s0gcfDPPhBR73kxwULOMNowhldnq2dI3Kqool2h9t8MXS9e4eNp0
WH6FsxtRvygHByMmXQkKc7CtKBSkvn9no6A87ee+wlGYXwLVe5dte12DXzx2N3G+NE7X0eJL5cm+
TFF8+4YFodMA1njXDSg9xLAaUB7ZN/HDGW4uIIiIknOvcewt0CkveoAcDCVSXfLd2kGcGqW6dcTF
MzhJV19YNWqVvijLwVpeAgOBAC4Yx7i6mkn/kxhY81dEBYPVUOsjAnVK/Iii+x8Skng+6HQYBS2J
TaCvPcnocgesEkCgJltEzJOXUo5TBJzLueQokJ98uIX/OArjBerAKG051SNuqZAomI7hMIkP3m8N
GTdLduvqeiyoKcE0wE9zeUp4IwoLZ/xmOl0hthZDkONzbKaIpvgoWu2g2O78Fn70fTahGcSHqc0D
fVnttOogzMbjqsAonPBFjYV+hm8BHlXgAb9tHeMigVwUcOAQhAkKXxwyIySTWAGIj6h+tBRkAFXL
p0sEKAMjoDkj68YQKODrC6MLrVymVmvkEj5QoG4uoWqk+70TRO3HOb5S4slFlzOALKDY6sqOtk/V
pO4SOZR3EasGRu6Yvv8Kj5bntYXb7qhm22y9P6M9MoiqpGYkXcLCa/JsnlXVdoCTk6pNifKI1Yjc
C5768vM0FmfFbINY+/WIYwfX9FiqU2sCAZkmE0CJUae+ybzSsNyQm4YlmPD0A78jVbOOStKdhD5Z
MJ5N2dBPk8RhUNu+Ennhh8kAU0zogGomic9r5FGOsaW2LoPY46+fjC2EmCYGEnNamQeJGWMBr/5C
3V4TolmPgqOscSYaEmwL1pz2M8KRZBM4TN8rmAx9BfLCyn3JnNx2hVhmIqR/ZorSQJN9n/s+YiQ5
OcdvrtreU1kF84PwhH+WtCAPeYfhOa4WeiZ5a/tBuM+Y8S+vcuTAu2BLcNXclAQJX6VJww+P4P5K
wkl8SsZnAB0kBLx9IPGZ4Jf5rpd4lCLIJKaN7VSOR+/E7lqwuiUPj7d//BMJcqrgYZPSXzMHe9dF
zEXiSAzXMb2mrDeJaJvdLajCJ65rwy3N8Vc9kVtbi9lnoYrSINfWtUq1gDhT9b0UqyRHavqX0rp2
nJtNqMiui0MwHO+MQxdHG9TzYuXzPr5U4M8w98CmhsY/awHZNofrZQhmaBfAxd8ekgYQsrZR2w7O
a/J3KMxCxvaFk+kqysfIdCpxWFyOgem7skqsPUY/Qc5+7amYI8O9ADJRr7J9dTSA20f8jv3lHvhg
TolmK3VAziVt6kTH/a54G/cjI5MGYPLIlxGUAVbDoE3LfxUBapdb+V+T9wglcbj+IKI5xyU8G1rz
75At/LM6xJOwT3GiN+6qny0H6FiTaVB4AVEFIIK1Ll9vRSnnalQN7Q4tEszVeEhYdr9sc7zGLyIo
wUjDnVWxcQwL92SbAUVScwmQgnHugip81RQeFn8TT3D6HbrIgEGZttg0BntUGP3cc8h7LRQCql7M
cs/AVaZErvjmskyUSJIGWqENxRh0HVFQmzs7BmEfN9ErCDF6oTqXmEyOsPAuL0j3iiopzqOuRnVu
5cmHY89Oyda88IG65KP9UpCHu5tvhxGrcgoDabaa1My3s77VLkhDZguc+L9gz831W+7X8eoByDIF
pYNg90HKhZBLOFgVB48TEcvS/pYj6zmXmN1evE4ZpKpPOC9Y7pcRPi8nT7rK7CzEvBDjPuV9+tcd
kEz+L29e+gLpw5WEczo61UIKkpKFoqT0JBRS/b1V7Yj2QOZibKzGqd/Xsn4FJJWdfmiutH9Aqj8S
VDYry5NoiWW1GFb2SJOwk02+hPOBiQXYNvpODes9WXEQ1/m+d3JgDqz2nVWXpVomQfFbZZ5XctZg
XNCRrLHUV+XtR7z/KfeIOOIJUPhcv0pDGJd6rLqHPdVrz+aON/NC7kytq+L+bew6AruYVApheeaH
vkGkCpD1nn2zU3glu57VoAl5fwtxM3XHEyLgMPO/4ijidIO6Mwzssz2J/UbAYLDqFx4mtEgbiMnk
kCw7ZU4f34B+eAFMC9fppSI1KXe5AGuJh3qOXmFWCN32CTyMxgD/yA7lzux0FjgYRwxIpfGHGQZ4
Lr6N6Ameaw/HsA8fmKK9balzzYNfFng9MJ/VoPVPh8gwSBWGTzwAuFWulB4bJ0nRgKJaAE0X/TQP
1B7TlyJPqrDbUlPdPCEOK65GG41bmxj+fUpkYcCOT56YNlw01tHyzoFrT0aXLZcfh4BLJ67nfen2
8V++qScsg/3dV+HQsDxu4Q8gMzi8jBCP26eKo45jJQEOirGG0aTG61RwuBG+1O6a4JU7UHSbrnRw
hM8THvncNcKrWht3ovrbiWzbpxfjguxfuPAeaUQbgBhox9qNB9vXA13zKkDh6cTZSnm74tENbwBI
Qa2pq8Cd6n3hqAhRiJTq7ThRXb8T8xGBmh8dzeNzytrAI9h0QF9ZbKEYbjTh1iu+S99VKybc9fW3
QPLb5+wkDAB/YkXZlX0jYgecn//lksxLhp7xV9g7Yzw1kSmrN4VERr4/RDuZXMIBuAGQvgYwRIM1
TOGiso2kN34HxbYIKWzRvRBerJUO2bi1lXiOwLEa6yb+E7HHw3vNT7649Ua+j+ciWTMb9IHAQlWx
NOx1x132butSbhT8Kxn05XywZ1YOfcnystKv3SOgCe5j0JingQqbS5vLU9LM1H3yikl6SMRY6Y5S
RW4t6ett+7b5Hyd2R+f6qTxsz66aICf0ukgRB3erbljk7JtWdiHw4xHrWK6BaU0upu7Mby8Ji+Au
AzWFyH4tZawpjlnaq0Y62B68I14xlId1jRgL2DfERaQorAUidNc1V6sJB9zBDx3tXMhG7peDlRXw
g43EatZohr0c8A/5/5f20B3H5Vnk5KQTQXSkz+BIozHYLeqZNteqKrty4E9UDXjhVyIYLX977PBd
+SmvNCjwuzH9Ab88z53CVQRm7iXKaXrw1iotO+s0T91nGpg8CZbQgNerBXBmCvtY0KHpb7TJu+Zi
LARE8ZMevig0niCEe/IzGsfem+/rUpDdm9QtCrOIPNNXQJYAZRq4gwdFKxnYkcu05r8D6ylhlDNq
7GAEAyj/Q/7IhNwajc7t77N61YzUTx9cZOJzI574dSzrh4kF0oQI3aTLosRDrKkOzRMxarEB7wnr
RHgRneXu1w7hRA486oIevR0ziHJ78jiP+Q7o32Yx1pIJrBpuljeBEgxkncDdm1qZBOJ3hpU/RZrz
OnAv9MvUVZ4elSHsMYCGAZRWx6wSJ7s9Kc5pKRnwAJ2MGNyreTwdxm41hLwALNFt2NZNrG4Nh9Nq
LNM4B6o0+g770MUTpJdilKyiemH4G0SSMJvVgg6XObTQdECa3hfdYdMU4S76OMEMTmGLbTiIiVg1
kcks6cslsez8K4lMDKqnjGYPUzt1GYvCzzFIllhTEA1zZjwNVdYpBBLsSmRtdzDK/s72DOqKvpsI
srdfQI5zbbAjk9sMzHSXWYuRbvKlp00Wvf7VQG2/sQUgMAVvdib4NFp84m1M6RDZAsq4EEAGJvyR
+hvu23jqpbJYC0CrYK+eUxeCAe4YWHCVcM7n/e5bixOjP3fvU2JI3JG0fs8nbmQuZBzg1JUfBWGz
7zA6CwNmbBYX9w0GRANxehm24zDzS0A4bFqjCFrBJ/0qFLkM7P74pfbOXpFj0NmtTh1s06PqJHSD
cWKErVqc9tP0jUM8m8wFUOm1dC60WdBccq+AtfaiyylQlXIqPjbDgcQM7e8efX/86rp1xSOwPI5b
1l8uWC51dSuj9eSVE8szDCF4HcTAbrCWKxIUagky9SFRshQtXrLRDaF5smR2yzdpfUZeCo2zsawu
vtFSpxQFMO41zv/SxHKEt7ZyiEx3JOPhA30QWeCSTawyP8TPAss7j4IqHeTRxYaGnYESqda2nyN0
2Y2xHDaZQbZQ/Y4zXS1D8QDeBbae4VrVkvNne0FqTqPkra9VyBNuRKKJ/mcYCQXodavQm0oLXatu
TM14PvmJh7AJPBMHQFfl1Y3djNKg5x8J4qg8n/MFrdLZTDyg7rLrFoG3RGutjT+H8xUYJyJu79JL
xJLLtU/aTKtfWrNK9I2GYsRsZ+I5+F5sxh2YmIlSSbGVwMisWcJCL88jYwF0CjQQkKB3NlyCBg7v
SdT6kNG2T5i0+2pl90FrHf8o664kqV9vRIUsRTBghZsI9Nw2vzJgijd4o6siLdgeyiA3SdVRPdt/
4ThITy+lJyIOsoEFLDUPW0/G3DI9BAcb2C1bbWOrfGi2tTDhcD7MhcXNuDSVN2JBuxeoXTS8zERb
FK1slnTVEruVcgxHvip1WolAsIN48YBzCENRMDPg374NW1D9P+qjlvW1Wji4toHuK038NFZ5tdFn
OCKmSuq6Cfuty3iIATO8lWgSjdGI+mrjE4UhOKPEMmUMj8vIxrFJzcD+v7ntf9cNz2lVmylLEdMC
YvqOQcEN1t7oUNrHbMCKsYZzr23+bEim7P3G9rxWTFgmSzT19l69Lvqka6J6ccjBRd4lfIHTa844
PGTI108ZagbrcOUZBFhlzZeKfHEXxn5YO0skbnlbB7xdyqAh+PxkD02WmTE+PxsHVbbLdjmONJP2
VEu5HjesHhLt0InbQy3h7QtMFRLxVe2OleNSnskgD+W9LGzkVJZ653CSDQVZXEfbUnl9llhHgNgJ
yJZLQhhO7BXqSM5YO5gDpA7iNY1lWUDkZEtgHTxAezpHrmMXmpsVKL4m76LUSVPcUV4cTeqEN3fF
nBcN79P4dnJtJB2ke5hqMZ0atoHzm3y+3+DVJqQbAJy1xpIscdY/JpH3nYcCLh/6yYy+0V/k4DtL
HNh/KT1h3XnqXjRJ7K7UzGjjyq7C6XfOXhFIMvRGYzA54c5ApYArivA0pNr0ruooZaXQX6LWSio0
G0DWL8cq2NEtVj8BRtqfLoStR1Sh8RE0huZaiD9Z4aSwmv5pdf3SvApw6rhNcCT6//cm8HCAEnJZ
Hypv4a6sk+8EWW06njj48q9jxb3FH9Yt1wwP5AOBcYq0UXy6DHZn0Dui4EEkvC9GesP2E2Nqektr
7B3w//jTGMR/sYG5PtgY9XMQJnVG7DE1wvoK7wVQX/2Rb6oQ0fZwB/GZ5iEDmvWwU/2As3IZOKvj
kwWz0ew175cW9qiPrPI/0gUA9zponxE67Ke79GXnSQuz5qFGgL5KS+LgMzbcRgeEToi6kmZDDh87
gmwscjKzd6nQZR1WavNqX04O+GXbwm4FlKuhqUWgVoHHzn9CMWCEl9JVhwKumRr33ulgJorYdJGc
C57Hk8acoMOkYtV/JKuXAwAVr+T8BDBG0YaBR/YOkvRJoM44QWni+JueUbsgXI5zqCP4kj3y8s8D
nAfzowPTkvq992WAHNptNV0P6O4DoKGG5xPwpu67jJ8ieFEHJMjGPJtJao3yM8gyWs8bjkGzAr+Z
jrZz1PoBljjhHNnPlLM+6qI6ljFmxFAZjVsq6DvP+bJj0kYTzAysFNmI96GGb/wtvxcRLK1hBLrX
mkTp3Vidgqw/n5xgy/Wuibc4ea3+VA+d35DJQgUusK6d1HnFwGnxHs6D/IXarSwjeI4mQH4rwp8b
X1WTAmtgQctqfe3JWX+fKqnRiJwLB19wAyZVuzFujbrPENpPEY7wRVbpcnjwQDtZ5GP3+90OxqsJ
Zc6THLC3/PonSAb5Uy/1/Yz2p034w+I1xdLri3hpIOcoYj0eehgfh13qapJclatRW4khJfCj9OUI
X/OF0Axz18TaC2EuhzFGBVhOy7No+MqA2LtIpwmN3coaV/paHHt+oEd16oqkWP1aCIzOlSBWy3LP
9R2N73b122pNlTRRYx2sTO3r8rdw0DzvgCG8SG3/Et/jl5xtHy/mtnnMtlwVoWhJb75L5C3q3n3/
OphzOqGxXVztX8HPK7bL+Z+uOdxSC7Z4paeI1jH9Kkl72E0FylTlw09ZrGbXYlEZeOPSuwu5Q+in
j6QK/eWbXaBoPZ0Xe42SY6YesIvdwImObmAoDbmfMD97uNMI0lhJ2wK7w38HbhUj4bTudhfq/vKP
5gICHMjk3Q9V12B+1GP3tmKTKb3T5iDubZZYc+dYhjEELAcwsFi1I3yKLB+IGIa+ZD50D6BGnrY3
FRYa4z5tntGPRe0p9R6ZLdJa+Ft5xoZHpG+YLyW8wpI+Zdz4p0C//vLSfJhAIZUkAz81Z4P7OdvX
q/etMqAeRAFSHlBpWxogRWLRng/GPOu+H0Q9rZeMMc64n0lLwenpNWwu7Ib/ROygBFglZCXH5W8z
IxppyeFBtesB3EH8NZQT67SfrB/5cMvpgnUOLJM6Jf7q8diNQBUYMvjP+gRHazlpmuPlc4t9e9DP
kA+bVS8kvY/4DtuvmTp1KfiLuwkBjRELUEUCwxlCsztKVHuz91d9FaiRRk8Czp0vbIgsX6cn8oIL
K8sfBkhD2DsFvM8oL8GYUmDdlpMrebhPHVbQE4EiuecJOH9rP9xR4FYXciCn612nm0waeXL7dz3x
+LRKqBGpP8f7djTgWdIbdV734Eq6jIXc7BW==
HR+cPqP0z7Ljzynw69jXLlghezPuU9wECZlm+Rd8C+TPvb64WzsmV1nBunCde6HqVkDtvL+djZ0s
PP8LoEDiXkxEqrrObl/RdR74tY2wvdWNiCnbNHYzY9OYw9n8jNhxzJru9Iw9D7tEc8MTvl7i3HEI
kLwTTErCkUAS9kuThraAH4V2ex2EG0IbupVeclb7TkloXnYeoxyN4Xr37Cb0E9Zm7Fij49LdvIZ7
rtLWFvrq46ge7taVUrK6knvjX086olWacqcUEj1Arsnt7f6DQk3nVX7LCzyn0Ti2WKm6T0SSkKyu
A/0BSjQizDNRCZMcLsexAgLcRlymZqlYHwJXMb9G3dFvwzaEE+umw4Fe4b67FZqlIPmBePx0ou9V
zKFNlpEqGMJ4w8FaXbauuIP3mpwd0iCc91zUsXKRmL9COllbpsXN6pL8J/QMAdhJ9hDET+4zWBNT
yNr4dTd2YUhdPSffqWMzCzfYE1+VPDIRO628OWDD/HjIRO/JPHVuOnyamq1Vrl7P5Bv0P6r96leV
a7fwNp3n4kQNEPClGgVdoTuMm9urltmmWwi3ok7aCr5TaWrDiuFkwyBrb0ORPiU6l3F1BboeMLIh
oNFOmUHgKoiIvLIOroulNibo5vcfddkNLi7gpqBHKLdNAszJ+nlWerJb7HJaB1TaZTtW0c85f70C
GqZvNN71vvGihvHvMZLTttxeuYh14DrM4Q4hAdrVnjrlOdZ5SPeICsf4/9gXVOr/wk1XCQdPIdUD
J5roxNXNpm/k+0XgWMsP8t9qn2swZ6THrD0Dqj8s0WDBi0cz7W8YeG0Z5XtBUNdUCQoc8NWuogGo
2ObsIn9eSBxfYXfvEMOuIy2WweGNHN7R8P3mq9h7+exzUBtEPWhEk55WM2wI6sRIG+SgsqI/9Qyk
iesRFTFIeSbR4lcOADp8UG4EV47RO2cvRAttZ4Wji2ZuP7POdjRhwfX/Grp87wRwEqWhjLdoQ/a+
krRKrxnfTP9FNm/730ln1Uzlhup9wIvD07YyPsQg8bsuEUL/9x8Y4GjkAD/OoHLWKYowQE2suTr8
kRoPZhJg5j8weUAO8YNEqaXu2h6TWpRTdCkqo5GFrXCuRE8DV3t6NXbyfdcEW3klhrHNquWo7IVO
E5OJdh3DdYbm9e1LuNRfjim3e6In34T+yBKGiKc6p8STqAhJbGdYQDKjzSWqs0UpC3Qd9YitME0j
qW0ftnKfxbA/Os3ysVSRYScT0h59WSffhW+WjL9zaDTYfPS/W+HyTAEypu9yAB6+JyWROX21SwP2
7fwaUx28R9j8zo9AfusxDoNq6lJ8retEXpjkarDL50t27ARl9LLxG5xMj+SYfDv8KuUf5fiDIG4S
5kPaEHfD67NGV6SYfG1KeTUJHbWHnOVp1s38/6M3t9i8FLqkrdBhLOvgwTuK4lQC0xb7ZfQGiSJm
TCdgE7q5YJ5heG5J9HWubDLMrE57jtkZjIJ7HYP8eqzNqXnCx6EMhkfmBW/JLNaEflTebJW78+5Y
jwkTkI/AuQZMK9HHLXXoIbugfgXjfNxB/GjWHvHfvP7eCROBo4NvZdzt5U4vFPI9uhwjaq2s0S4M
PJYX+AjrJ8GR3VpRTUhZ6Kj/5BPiJQSWSDS6IWtxoLR43DHVX/DCwXok3zFNGKtRERKEZ9tNMQu8
jGdwEvRD3nW0ir3AA6ppqFnur3W/Z3qirJhdWCq0JcqT/x3NP/277CmVaCP4OVjXFhKKgxlPud0v
Klyj7JH5uYX45P67Y/MPrMy52mfCs427YCy91Y+qTOgk4O8xDX9nRdegxdW5zY6dLaN+dcEvpaX0
mcuxc/D4Em7t+NejtOTcDOOCMSiuaRHaG/BfuQI/wl17+pxiEkGB1Yeb2e+W8qMfF/cPL3QIV9F1
bK7TwOee4DSwu1zmTjRxJSwH+YWlUv5YhO06QBGhoc6RSD41e4r1+5kJyIdhbHRIfWDB7vFU7rby
KcPt/6aOBl2PYBZ4kIS1sOMIEMm3u9M7GNJBb3xhm8yhZUdTbU4KsuEkwPYVzl952fc4uXkNhjQ3
I7dB5p1fZQz2RIPQjvBzJAX5mXnLwEYBhdXOxoIb2+9ZinoCvpNMhki46TeOd5dk0ZfZQQHqwIWo
BoFDdwIvNcMFoZvAcE6jeV7KldFggNepVqG7UdNtK8FrbMphpsqrIZ3F1sMpQbicFjvsg8m9a9er
bSemmWFj05zQ6zu9QC/MR4mc5O2kWQgmdYY9HsCIpIcsmrEpAyXFddiDteZJHTkoafz6wUKNSJX0
PFQnMZ8iJSHPxB4eTc8LROy2mKr9zKaHRqrABGDnt2pQIftRnh90yRH1Rz2NpGTw4L/QfeSg4mQe
ofx1eJD73HyzJBAWr3Ze0m0rlSSRX1Ds5cxxDiU9CCv/CkllIl+LpHX2U+m84CCTnhwwyDqO7hu1
CIxfweAEd8xwsqbqrIFonQXoHHFSU2t+CzjB29BmQ/TjfEYCyzY6YQABRbvd3we7i2A8Gi8dPQHL
CiOnTsRqwYGUBp0rFnEhCRbhpI49UYUUBcrvRJTZzmHzorHJ+TNEWQFye/4uRGIy+tk2NKr8zdMB
Py8oZ/00pMsFMxpX8BiOI7NZfsXbZDZp0ZJqJJNn61nU4xdXH0RWHAEz6CTCC36CqYmCG4/neGyh
PXxYPgjZVGhZPkK7LM5lG2gOQu+WhLfzzGKz7FE7c1fAf0LK9MYQDpMec92dDjIgmulEq2Wct11w
zoJwyIyfigz6Jqc4ja444qykA+XGaQpIM3XsUum+ck3nFp7mzNrMTTlp40GaNEmAx4pkoF4l+hEB
bjEfXuuRcbv9cPdihtHfEcocheuAH1aWGl89Wo60aIc6GLglH4lHCVslVti0VGB/TBg55LK5Eudc
5H3fgR2Cg/qoUQ+Z28JekDfVDaigQMv7at3XCPmi53R1iAwI7ErKukcLxukdcpc0rzCYSdNsD6Kj
6mhpU20lSS4BUEvEfWfn0UtAlQJ8hRMADd1l7C48jf5uET8sYhV9sIglSGz3ZJ84oI2eKUOU3DXC
MFAbH0e0XyApnUXTibpKQ15HuaH2bEv3EsXcPONauUcz7HW41VYlNJLQ4ved5g0ZIviHQICxTEXm
SxkDx/DMHpDpVsj9GIfjkRSbA12kg/f6OiB1JtLXqThJhsPrZx2dRPn33OWoz4imCoAb49HSIoYB
KCttdoZuuvRWoONb+Cm2B9SEbHC48Y0g+GjN9QIaKdVwy3WCpR8JniZRXnUop2rmsekBUL4Zv2E4
OLw1I+3GUsqKjtNg1GeNOuFWNCQEZMSJpn7safyoDxWNsiywxB6rGV3o9G9SXjCZg7sGABfMVGkh
O/yHI+xqqW19erhUBiRhprKYDSi8co13iQfF2CVIRljm9rTkcTCx4kcnCF/CkgLZaFjkh4XXNRqL
V7iwritnll8wb9+uU9PYNLEMV/ydagm84ze/7X/OIZIdR+S2qlRbm9RC81URGEDHHeu6UAHSFYjZ
4URaLb94S0CQeaifxigLKcT89eUdQ98uIhgA3H6kPB1kZuVy/Q614LJP/o1N/Gkj3OXGa5idE4nI
CEEHlcZ+pI9lo0EO+vh6mW/6XW5sESkcSugsVsA4VutIxntTUtJqADmKLYRnoyX/SHhADuCgm1pB
/FJMVEdbNxTOTQgp4jU+tm2sk/GxI4D0VxJi/ZT7xjIYTFkF8q3ktR67m+t6Igt6qgL9+zmjvhQb
6OesYufiKEGDbOrOCk/jImVhEi8j60vi3mMf8q2hqaRkyGQ0caN3Bdu19SJYVdWl3VQ5Z+2hYGh5
O1qgvP+Fi53n1jWu38w1a7hDEMpKI8U9imoEAxGhrrY/Jw4h+JTZoukn2BiovxkGCswYCjICh31Z
UqAPpYmHysVPyxqPs7Lf0oVnB6xLYAc3Gdl4tFI6kM/0iJ5d1lNOCKd1gioe/0F/K2mm/lRV4dBU
05IflY63hUa9nzo9GHLru7YRmZdnZgWRzmGXPkdZUWJKcB4IqjcApISAwX4ePPgGPMhQ1BmcbWzU
f0fqGNUlMudBYP3tbQgT2BbPoxGuCD/Z32PFFQyGS2k1yYps+CYJaIMuI2nD1vWuWX4XQvVg9A/v
24S5UmDV20TRrLh0FYtILAII9TxE86OTLaDjU2vpR/+raUiHWk4kkfK+ZvAncXUbtwKYouI6L2eW
MXe4WEyNDt0oPjzSOOXDL46dzlxpB8m6aU6yPI6JJc2AopZ04TR61Rm1iE+zdeWCJwX0+ABCdR47
RjMFPlvv9RHov02OZq6dK5cIvzXeyA2TVQce8daSZ6ggTjDAQEqpalGFhMZ5SSkRXZyjoBpB5cRX
GaiVGxZ6+tPeA/VivSbZYdcamyWK16cPZboiaWv/Oll9AMaXJR/xCBaULac1c4bJP1gLY0Eu4TZ4
lKkMm4mpfZPa4peEYCcs6J6msyZn+Ug9NWTRMjEMuXkDc+0VzFq4vlRX8aasKMRN3gonoHPk0QUc
O//dyKtuROYXfgd8wonpSTaLffsX9x04qX80G6ambjpxLRtmj7/MLslFz+dxBCLPUtLcPRP7Bhbv
nk8DhQM2xMkK50IqPNeReW4cumokEitjnxnGpfG/A3rpE4gH9nVux/5ZqTMO1x+Px9WsCCSwTZJu
lfCIdkmZeaytP8zjvHSCojxzzzk3GJ5IV6+uN72dcRWZhcxoJrbn4S779YfDnlNGtu6q9yv/5RRs
WcmI3DScHa9f+v9TpQBMAZXxF+BKMh7R31ZtMIWqexK6PGTSXMtwMyVcLQZxot51YKffKdsJtR+6
3O57xfA5kZbxpoFqcVNiQpJaII45Mc0tGpYGaEOtMEr9yKai2JsecyB/JmhKE5EivtZR71Z0UhBd
PWJGODoiV92GSt7rpr+IgeC+73VD51hEoF8VIdzySTzowa70WeiMH9PsiZVSlZ+W2l7bGTAxR3VY
xxezh4+Nz7scA6CSBKSnij7VeoDjU/a4xPpwqI4BU95BBIdZAGgRRIJbsrjsW0eG/PJPZn/MGWrW
HYkMGt3RJvE34l1OQgim44GH7Inr/SlJrn9KtgoAIlvPOPi69+3HFMFKZ/loh6P6D/j4r4nHe4ty
tpJC4hyEIWVGboSl7Ae3Bq4IZJ9FQpb3zd/eZuhYhub+nEqAqAcyE07gjyehgbE7f7Kj6s0YOnvm
IPxoSbh/OeH3ldU/80GSQmyc7o60Japai3ei/k2zTk0XhiWvXqWXq6tNN1mfyoIMdgMBAElz4h77
bp7wySmjsXZihLjMU5lCf1ZsWaZGsyTuJKdv65NbITAD3zCPbaozWkCA0norlCbdVc+jXO045jMJ
T/v8RQ6q2RrDkaAUJWnVtsrUl3SBbGLlI8khomc5XGIlcXjtFSdLH1ioldJZInLdQattMTfjye4r
3D4dVRnFOwCTPP0siZbU4vVV2KEB5cserWRpupUvRoJxVdtE4F0bXd+vDUsqEd42lLNAw5qJcqGc
L82XOvMB1x8v+9FcQe3aiKMcFiWnDufOi7s2TGDijqy/NLtI9jMbqqvzFKazd/q99vUd/gbvXr95
kIOrsG5hjI90VvXmUqzTTmYkkxNLUAmZ7iuZR3Nc6D2w4IL3mOYUZfI8JU3ezTTGojweHe3o4YYS
QjJcOr3Ei6q0IdI6HY2T+oeckFEObWsGXbKp0ZOUjJYPpEPRFuOGmGXMC2TeQ5a5M7jXTSZnUtcA
2p5wcCVfPU9jvqP2T1GlSVXy48yCvSaL4LkCNQf+jiu3ojYsEQvnrjP1ZsqA0xIm3ibu6OSwi7Jt
AEcwTtfbZJhej2ix2xu1r1eSs6jNdFF6qfZM/CS1gy/X9fOoeobgydQ1i39UZQwU/3+aiyqUzJdQ
OfdooiSz5tAtQYbe/p1Nr5ESSkkgRJdayNgsxprX1vVzREDN0xP2oc0vjbyR7P3OqBhahjitCAfX
1FvD3Gw2896gr4tt7M713PJqcKcBBH7gHKWfCKKU7x5lfqje1hQOFwlYCLvxQwXtk6ASoITPEr/Q
PqD5kXffkMDwvTnrRvcnQqIyxbRJNPNQ6oF51vrfq7/NLK54i7xTm2lDKZeopJAvf+JKHv5gH6PU
MJi5/S7fJAduBjLUvNv7siCHcbAUmm/q7p6tgq6RHL/34uZJpTycye6qcGjWNgcRdkvLY4IYYs58
iK2iZ9EIa58C6R56U4CZ8FSYKqmByC0mfB74m97iugaaVzHdK4P6K1jge+kgHCo9s2EWETbejUfG
oS9w8mCrw/k7KJYp4y0WvpJPuuzAu2WoE+jCr6CZdhVbTH/22eTcoumA5ixz9aRsyCieK5vdrdcv
A/UfgauJJL/5WJgpRw3bfy8UkoUAUdDkiUuARD+P8nrmUfjrO16Nd1QZp2eihSlQ0uNwyc3S381i
217VD/cRqM2pxMZYc9gVqLLkCOYnNN3h7REsT35S1F3lghu6AhrtRjeEAZq/CbMV5P/cOkBhsgL2
qorMWVekD+BsyszsO8ZUgWeWLKT6X+bebSiTJPwpcBLjRKBV+jYP3mqz5LpNRBsg9nkkWt5lDtXL
DnFxskv2ORNQ3ic2KMQ9/zOV6c4x1W5LXYjb/J0Ifux4XbVoM9i6Mhn4hkgFsc+0gDRqdPX+BPHs
OeeM5I5mIrINnV8brY4mFLCASwLEz+0SKOpq2cJ54TXpyzXcttODlDxXEYzenKjg9XEyyU7vNv10
IyQ+5MyXKsHEXCWt6VyCxG7jgUwhquFvE7FZSw1rJxGAb5xZxHL8Q1tzadC6IPBo9yxFhn53AJg7
UaFXIMy50JH2vrAh8SGkX97+PU6L16GFIPfxX6mSPfctfPyXwNM1zE5Z8xuHBLDUngXhyrNmiXzc
iy89eKM3ZGx1uyuQ9nhUSUbA+HpVH7mps6VScgvy7bad7FFXk0LfK7aJQJFxLUjqgcLb6USPka+b
0MWmNkrcE0H52G+7ezu4XdcJw5wbW1FCzmhKTboj0vWa9aocdk7/pVEuDCuG7hKOb/VwIEehx0dt
RgDXa0GUfyJgtzrGusHm05QadIrxKVojx7KYcvL4DwpVax1YzYsV3eAEP1xPPanoensh52+moApP
VM+/pNY88noBYTzxY4jSVqFEIhzPYR3ApqY4LlzhHojZ12+VFlOGxBTXzx/qr/I9DlLZkECsO8/K
Cij4Et/P3sXyllYWzfbaOaGeLDdRtB56mUKoXulHDiudlHaZoa4rHEzb4rjxqY7r+wPL3yHcDFIr
nXueIL65lxICeWgXd2wJstsv80b8NXLbp52vlKHG884OAsia/R4T7M330aIYtm+Lv5PZK0YJPrM4
15siZhVpYtMJb84VDOBwEuyF70zG5LTltxipIAAPoR4jMexzfqxfMkJtzC1Krrscs90ALnY4B1KC
AndOwWalUtRflgwGbQjTeIyOrQJ2srPw25Pl+8Ej3zcuaTDl2s/67gmm35NcllWnTs77whro+X7I
PN4nWIQmib/NcaMzouOKpyIhpVLViqXXbjxy8KhW9C1kWlJVuVMVNDYVX/Q3q3XHq5EIoy3fqLA1
z+rmozYpc4cPsqZ/GYQ92v0GeI/8gx49DekUtVg8Pq3+DLRemiZzgjk1TogiSyg6wBmIZrX/Ca9S
qL6qLA4+0dKzqceLEiHkWrJjoUuLfUfHQLHS/IUNue/clsChXZwC7vU4hqmjjK/Leg1auhOI3Ndq
T1r9xWlABSLspPrzSJNKSJxtmV1DN6VqaRCh9Oyw6NBp+vJuPTnia04c0nlQlBg0AFknGP1y2yx1
yx6NEB5TpiS3JpQ2O2A9fSHG2vzT4elUiWKYQeLijzgF4z1zQKuCk/PVbFn0h/3qL+gRkp9R2n+F
y/cE6o/BWfxhTjLk8NxlA5ryDNtD98zPcENxg53+hjrZfwPHmPPm/0v0O1vTv6QPY0Bmki0EER3m
tbAEJYIzgWipuYrCiLLjuRAqgi6FuUft8ySiMBPZhOIA7bJTUjWtmIlDWeP7B1CJPWwXbEqtcoi0
fELWLVSmIYy4Fj3GQi/QUo4kpUshhn2LS9QWtxMJdjBYUgWiLRhvbHsSjp+AMQ/q6lmGveNOWBhN
83LlYiwQ354p5ySJ0G5xbXsmobcdbro8QUid2OS3l7gFcAMtTuvzQD1GM9AmBF3y1RIS0pTkZqbf
yyx1Pi2Q3aTPzVglDg6SnsgR73hpRN+U/hIGpjJ6JsOWztOljeVxGTq+wEYKG439x6UygNciKp1I
ypX/PRYNTpizRoMPtMo3vB7EaLVo86lCHKlW16WzlcNhL9cF8a6pFePlPzCQNGei2s/XkpC/ioA6
wNdJH7mAnIkQVfjW2t7/54aRo6v0ALx3dfi/O6m/6tPk11GH66u6JBFBQ1cIW2zMddMled8t+p1o
u81JVG+nWyZcs6oZ14dy7aJsIxYUIprT0lTRCcTPfB1kBHpILfj4GuCFrmfdyB4LCrG7X+bw3Inn
83wfh1PkClxYelcIPG7wzX2YdrDE9AvBEmTIFpeLos2M+SMqN0pWOekN36mY/EirLVRz7XEhxmbL
5ZclMaaaA222zH7HVdiNp1YOnWbXu4RUdzT+6cY11Il9ONjIChXxQqjfB9zzC4jJ2qrCGW1+Lhc6
qlKl9hD7AGXOdaDsy+hNIpvfEyv3LlkXkjpyZg8g0TbXXGLgZ+gPGQF3BePoqdwxidbesffBvDna
SaskGfuHLMjbtYAUpgkVeJD1tJisazNwRWA97ar1xVvd5jUMs0UVBxJbPRd6KgPE5LfEsyZ/cjH9
6H0UXW+y3wZz5TQVieUMsMrNu70N2AySLJTahtNpqw3d+QJjIOM+IYHyUtsSvSHaxq4xIxxyT53a
Tuu5yWJrhewxHtWKsvgqwfzaeIH8YISJlsZNGyFdWZYg7aFI2Ha4VFR9QNUW3nQhaQj1CF0IC4Pu
Ky3IbLKkSNPTpEoi/hbC5se1AjMzx40wwiuKi2Q9gbTO+peb2OS+S4DSnDDC+p8b+b29bmLWGCgj
DKq477z0ipskuABqvm73HS1s1AWkhEgM72dw/FPzBSxl5CX2DvH0SSyjW/m4m+VbmgCOTvxiOytt
3R6V3JtibhSSqW073DQGofIt28ACQqAvVZhD1sTUOddBKLiY8yOFyOY+BaCAurnEJQW8INgQBUdE
J4K3ATTxKsCeH0Xr/ofOMHbZdTgTKvfFXIS1SOnGMik+CL4Qm1sAsU2u9vHduz4WXYwQ2Hlg6Rrt
LtUdhrIBVdbrYMNy0XhZe1l7owZA+8CUBMFPpUvjbTs/DZdhM2XK+6IfmBfGNY9fMH6nysTYdyat
VvW6Z5GDZf+w6AosnprDoVE3l+l1hxR6RV/qjmlD4SfW/H3JEryL/IsbNFABiWDMVrxAD/nRtvL1
7oUJ6g8/uX9nJiSfaFHQzrYnqk60oilPXk8wl0Cqf2M4Xb4/PAZ25aqDSe9zMR9v4d24nyP2c8cs
R3wHdqPiDUgPVvXedfVshsraJS8Q1RL7fX+c2lq4yOJZKS2xvELsOX9FT85l9ZwXwxYD/qlQg09i
sl6GrRedMzZ5lu821rdhSNidHsZq4TQwGRzqIh3ls2bc0+KvwWgrKnMIppYzeiW/ZuUjf2227b99
omWKrPfenkzjG3Hmq459VeqNpLYpM7P539xQ23HOxKIyucSt6/GTRGuVouxxZtko/GU7EhliTzMt
VA+7ZG2ehFPsr+sx+qThnoV9lZWwYPZHKJ6dpbS30SovCXijts0BduFtViCs7zzFitMeEqPZLnbo
DkQ2G154ZiiCM+f19MYNe+K/aGvsNVLqyXYY2qaGsxszWO9qHfb/JKFYb6rOYoya2zJ55V8LWQXt
zA54YwnaPCVXd0cdWnjUYsUUdyiS9RHtKcVZtKW9xiXBbj0fijBDQYMep2mmKX1AAR+4qHgMHtxS
1fRZH6+ZKgqF3QYZ7BbJoK1aJl2/szy1rvq/ugAPjF2wj9FE/YLFtIHdmIKwcTlHtGOxg2n7JSku
dTN20I8IxtLzz5kxaVpi/RTVZMnftxHyacGcBRJwLtt6ZaTe24op/QCdRFwDquxqE4EgwxxMUkI/
Y9zTNMAiP9uUENprlvML3X/rupxPT/ehwA7JpwkkZcR65OMSHOmKUVT7JFionz4x7lsrE+tvp/Eg
zqJeVvN4K5fElxU8Di7ut8Nd6VDjjaXzfulWyKvetf5+GbJRwufV29r2LQ4ub36UY4HIQ08RopRC
jyLOtPfBPtLfbT7l4BI0o1rlUepPRIirc1wEHhXoK5rgCsKN4qnGi7AH6M72uvQvp1IHz7FW/YLB
URnj64NlR5SGG61xdA8VDVKbSQET7I8ZbNmxKLg5W080IMXVjuO6+WP/AylFoplCtnN4BoJOGb1Y
rk6lvTwwFKeV95HuIjV4JFYsnw9RXnWEqXGtxx1z0bsqgGzlgG7zHavjoqG/GMo6Kz6cVeNfl4+0
zOVlUbJosRD9QXjH03yGMEqb4x/Vhfqm0+VEIY704gcSQvr5mQ/lNzvZ/0EnRgNQayNGWL2H/5ha
ZcuH1gyllXD3vK/AtSu0Y5lUvnMz2DeKtd8upK31Jz/zZtr4Sz9Q0EhPojc6ylP1tecDdBB0EWnp
tp6fSX+gJqFSMg6JluUIYQYCVAT9zTInR9OoCEy6AKLmNz1DUhhdB+khiC0YJEIJchG5o+eiBGRh
xBZB2vcWrCiCsI5GAzcvt/ObesUNGiKagXG6lopAzaFuVjJz4Nw4qGGRXgiGFp7+QLEOVo5hbSjp
SaFo2yNrkbwVYRP73HCdMUzL5MHLWL915APipCb45KJwZJbKjYXrDPxftUZbvE3imfQ3J4QJCRnK
EX5Mt77Pnf14D8GANe3eTi9pQrldC4UaLgnJ7ChGuoss1BndaIHmsc+ihPI983Mxsc7Yj11x3ABQ
ZabwYgitO3OLFSbRcHx6GTxrVgfOZ7qFju5KRtDYMjtRUdVxq+9T4bOzwclAJEb4NwGJ98EiSoIb
Oe2xB1I6EaqC5m2d1SelrdP8IL5uieYR1056sxpKD1vqyo9sJf/dmnBfuuMBnGEGb8HcD5jHcuJ1
WA0Ru5i2DSVUwu/H9FAf/pK2FZT+csBwx1es8HRWmq31bzRIY/PtvVBi7AJCSq+fWfg0Yqp/6DfF
oyIINow3cekjKIL/somD3/IR31x9S6lq3jssbxSdSMn9mONDrJVeSVWn/vJXrH0f2c20P73DAZan
GkC8WjjISme30/eDCSLKBC5AqJeWriJ0Jt9HyVggBLXEOtLdVBLvnOKon++tT9GD+BmBdLxFB2Cv
zwUfz6KPfBH1/tnoLzIGNJ8HmiuvOPaJDnTbC8n3EHgl6/xEgMySHTrU1I2G+DYIvTbtFMJwpBNA
qNt8qmePNQRYpeGEa9FyIkYshFPp92fl4HGXziGPUXknULQ1bgTXnvQyism5QJek/MaCg3bAsFHQ
L7wWASyzPr47flSTp1jdpoaF1wKJMbIHUXbcKOLbHXhwOjVkRH+eBAHEDEsWqqI0JpJgcXfPY9Fs
+whrsku35RWC49fy77OFLNN6ki1C40OAxyvGTufUXTyBYn/dzMUcd34aHt0iuDs/a5SHNgOM2WAY
IhIMWeo6zzo+wfA/7I84elL8az+6NmWOTMOVFZa3q73RFbcD9NxF3iTx7vPBgGJ8iLmVYkJuxhKY
2OQbmH7bQ/8eI3/aPD4c+8zlzfQPN2XSc74rIsydvZt2z31kE9DlxzNJO2j0LD0Vgrb/Jw0VcPQv
oK1FdgDNs3ipQ65QD/q5ax/1epzw7M0oE/GP/2IB9eGT3FjlV3ltjtXnaHghowbybTMtzuc3CHAp
5+qjUfXAfldpu168EASWWk9KqluirvXL8ICxDwYQ3NR1DFRkW1qo5bxpZ7D81g4oSAI8dkPoxTM3
zW31pqLkHk00RuZrRL1Opf6aPYOMKKgCG96a2iwhoSIZnnv31cO/CfIJTAXY7AKZNrDO18oQy4In
Qr+822t3tojurGO0ZHnAX2sK/bKizIzHUL/GqzufsSfgppzf/aGu2p5LZxwmfkpvx7/jlZGwTfxD
sAbpFnFYJZ35UTbgvl1xsv44n3rp0RB7nO8kIi8vzQgEoGx4O0RiEMQTk/lYksx1BqEc0KCPZsWF
2W1fdofd+I19aXUxFrg9fqBMJtL88+vAOSzm04whRWq9JdmW9D54qImrKiI4AmmuM2+Q8qTwFV30
uSQzWfdSPMyIXHISK4VUQ8f6+jKcQfIk2TRURN8OANoP7TrHa/tPjfN/JYAnirQie8MqRbnwxC20
p1eD3jOhtckHo6cTVRaOQIgJcPYBTijAtfb3XLP73+Ehx0ZPk0/OGoQ5/dcK3R8HnPJb/Y5boNbb
UPUcqE+bZ/JWMATgz+TK0Cp+SkpUiARWTsk9moa0WH2we2m1Unb7icrIKujfU1B5J+Q9UH5KXP6q
vA1coERh69wS/4h51ebk/VbxqBGkq6Lr9GVDOkl8cSFO7SwiAFEMCQGBspHoCy45SHDA5VdYYcHD
Q+PKs6mmD7ar2/yGkDES7qPAWL/ktPL9+oxlJdb2D6ZXsiv3DXmqHvqvX31jyFW0rx4QMIkdPphM
FzBIx8+zMWhQC+RiHTE/RNz1G2brVlGG1rTPzCyPi0nn0K4QJ3IIacKgFRet2jeNMeiVBANZV8Bs
2w2GNWqBq1h2VHCQBQl65iqk6reS1UIkk5SuTcudvT3/M4lQA6uTsPpfq+A0Qs479GkAobdYvQFv
8GmvFwYKj1gFv6h2QTI3TwNe3REU953cb7Ob1Cn6DhhG3wCrhTsD3H//j7eu5wVcxA8MN8TV+ITs
t5TJRyWSASNn650OPrTsC5Dksr65nShD0a19OHe1JxIdBMuC2M8D/yKmoAPE2eEd6l3bn/qF/tI6
mrsbmjAkNsAwc7UoPrf/EOy8TdxFpk+r4J673Up97drvj/pPvAojkKItsvRrIwoBsbJmfVkrAio3
rzfKKWwrMKfPHCBuRMpzAkjXgmprqQvuf1TKVBLxNFLTHqMYUhjNHULz1r063cT8Rf87okLP+COU
rZjuKkFF/4Iev0nFcl79cpdE3cznm+c+EerfnWtPOfLt0Re9DfnO0w/f7ibPN48AvTew+Tid+/MW
hkvTrZTkmpfup9ZLQenwJzbgzzfy1g5RSBxk9SMwY4DudFF79qeOwUqJ2m3A6XyY5l/bjkcdSnCn
IwuZiv+mAYs560p9wS2RIqYOHJs0hDBGBTJULnDz++aYVIR1jql/ff80xU0VRGo9XhAoMUEU/RwF
kuU6bHZhwxCG3FDCNrJwrY79pOG201V3YZV5MmlL/ocQW9Wpft9g5Z8/etc065Uas+e8O1JwwgY4
arTuA718eB8SdEAJBdXhYeb83U09JhduP+Y6096g6WCe+ZiiVEU7iMI6h50wkVbPVPtzYenQufpV
szbRy2nIIokS6MVFgOxTa8vI+IMhTMMovH8qmOU5CQDicjE6BN7R8bSweeNxzDm=PKL='Z��v�1�1�totp/phpqrcode.phpnu�[���<?php

/*
 * PHP QR Code encoder
 *
 * This file contains MERGED version of PHP QR Code library.
 * It was auto-generated from full version for your convenience.
 *
 * This merged version was configured to not requre any external files,
 * with disabled cache, error loging and weker but faster mask matching.
 * If you need tune it up please use non-merged version.
 *
 * For full version, documentation, examples of use please visit:
 *
 *    http://phpqrcode.sourceforge.net/
 *    https://sourceforge.net/projects/phpqrcode/
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */



/*
 * Version: 1.1.4
 * Build: 2010100721
 */



//---- qrconst.php -----------------------------





/*
 * PHP QR Code encoder
 *
 * Common constants
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

// Encoding modes

define('QR_MODE_NUL', -1);
define('QR_MODE_NUM', 0);
define('QR_MODE_AN', 1);
define('QR_MODE_8', 2);
define('QR_MODE_KANJI', 3);
define('QR_MODE_STRUCTURE', 4);

// Levels of error correction.

define('QR_ECLEVEL_L', 0);
define('QR_ECLEVEL_M', 1);
define('QR_ECLEVEL_Q', 2);
define('QR_ECLEVEL_H', 3);

// Supported output formats

define('QR_FORMAT_TEXT', 0);
define('QR_FORMAT_PNG',  1);

class qrstr {
    public static function set(&$srctab, $x, $y, $repl, $replLen = false) {
        $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
    }
}



//---- merged_config.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Config file, tuned-up for merged verion
 */

define('QR_CACHEABLE', false);       // use cache - more disk reads but less CPU power, masks and format templates are stored there
define('QR_CACHE_DIR', false);       // used when QR_CACHEABLE === true
define('QR_LOG_DIR', false);         // default error logs dir

define('QR_FIND_BEST_MASK', true);                                                          // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
define('QR_FIND_FROM_RANDOM', 2);                                                       // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
define('QR_DEFAULT_MASK', 2);                                                               // when QR_FIND_BEST_MASK === false

define('QR_PNG_MAXIMUM_SIZE',  1024);                                                       // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images




//---- qrtools.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Toolset, handy and debug utilites.
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

class QRtools {

    //----------------------------------------------------------------------
    public static function binarize($frame)
    {
        $len = count($frame);
        foreach ($frame as &$frameLine) {

            for($i=0; $i<$len; $i++) {
                $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
            }
        }

        return $frame;
    }

    //----------------------------------------------------------------------
    public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
    {
        $barcode_array = array();

        if (!is_array($mode))
            $mode = explode(',', $mode);

        $eccLevel = 'L';

        if (count($mode) > 1) {
            $eccLevel = $mode[1];
        }

        $qrTab = QRcode::text($code, false, $eccLevel);
        $size = count($qrTab);

        $barcode_array['num_rows'] = $size;
        $barcode_array['num_cols'] = $size;
        $barcode_array['bcode'] = array();

        foreach ($qrTab as $line) {
            $arrAdd = array();
            foreach(str_split($line) as $char)
                $arrAdd[] = ($char=='1')?1:0;
            $barcode_array['bcode'][] = $arrAdd;
        }

        return $barcode_array;
    }

    //----------------------------------------------------------------------
    public static function clearCache()
    {
        self::$frames = array();
    }

    //----------------------------------------------------------------------
    public static function buildCache()
    {
        QRtools::markTime('before_build_cache');

        $mask = new QRmask();
        for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
            $frame = QRspec::newFrame($a);
            if (QR_IMAGE) {
                $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
                QRimage::png(self::binarize($frame), $fileName, 1, 0);
            }

            $width = count($frame);
            $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
            for ($maskNo=0; $maskNo<8; $maskNo++)
                $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
        }

        QRtools::markTime('after_build_cache');
    }

    //----------------------------------------------------------------------
    public static function log($outfile, $err)
    {
        if (QR_LOG_DIR !== false) {
            if ($err != '') {
                if ($outfile !== false) {
                    file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                } else {
                    file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                }
            }
        }
    }

    //----------------------------------------------------------------------
    public static function dumpMask($frame)
    {
        $width = count($frame);
        for($y=0;$y<$width;$y++) {
            for($x=0;$x<$width;$x++) {
                echo ord($frame[$y][$x]).',';
            }
        }
    }

    //----------------------------------------------------------------------
    public static function markTime($markerId)
    {
        list($usec, $sec) = explode(" ", microtime());
        $time = ((float)$usec + (float)$sec);

        if (!isset($GLOBALS['qr_time_bench']))
            $GLOBALS['qr_time_bench'] = array();

        $GLOBALS['qr_time_bench'][$markerId] = $time;
    }

    //----------------------------------------------------------------------
    public static function timeBenchmark()
    {
        self::markTime('finish');

        $lastTime = 0;
        $startTime = 0;
        $p = 0;

        echo '<table cellpadding="3" cellspacing="1">
                    <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>
                    <tbody>';

        foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
            if ($p > 0) {
                echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';
            } else {
                $startTime = $thisTime;
            }

            $p++;
            $lastTime = $thisTime;
        }

        echo '</tbody><tfoot>
                <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>
            </tfoot>
            </table>';
    }

}

//##########################################################################

QRtools::markTime('start');




//---- qrspec.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * QR Code specifications
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

define('QRSPEC_VERSION_MAX', 40);
define('QRSPEC_WIDTH_MAX',   177);

define('QRCAP_WIDTH',        0);
define('QRCAP_WORDS',        1);
define('QRCAP_REMINDER',     2);
define('QRCAP_EC',           3);

class QRspec {

    public static $capacity = array(
        array(  0,    0, 0, array(   0,    0,    0,    0)),
        array( 21,   26, 0, array(   7,   10,   13,   17)), // 1
        array( 25,   44, 7, array(  10,   16,   22,   28)),
        array( 29,   70, 7, array(  15,   26,   36,   44)),
        array( 33,  100, 7, array(  20,   36,   52,   64)),
        array( 37,  134, 7, array(  26,   48,   72,   88)), // 5
        array( 41,  172, 7, array(  36,   64,   96,  112)),
        array( 45,  196, 0, array(  40,   72,  108,  130)),
        array( 49,  242, 0, array(  48,   88,  132,  156)),
        array( 53,  292, 0, array(  60,  110,  160,  192)),
        array( 57,  346, 0, array(  72,  130,  192,  224)), //10
        array( 61,  404, 0, array(  80,  150,  224,  264)),
        array( 65,  466, 0, array(  96,  176,  260,  308)),
        array( 69,  532, 0, array( 104,  198,  288,  352)),
        array( 73,  581, 3, array( 120,  216,  320,  384)),
        array( 77,  655, 3, array( 132,  240,  360,  432)), //15
        array( 81,  733, 3, array( 144,  280,  408,  480)),
        array( 85,  815, 3, array( 168,  308,  448,  532)),
        array( 89,  901, 3, array( 180,  338,  504,  588)),
        array( 93,  991, 3, array( 196,  364,  546,  650)),
        array( 97, 1085, 3, array( 224,  416,  600,  700)), //20
        array(101, 1156, 4, array( 224,  442,  644,  750)),
        array(105, 1258, 4, array( 252,  476,  690,  816)),
        array(109, 1364, 4, array( 270,  504,  750,  900)),
        array(113, 1474, 4, array( 300,  560,  810,  960)),
        array(117, 1588, 4, array( 312,  588,  870, 1050)), //25
        array(121, 1706, 4, array( 336,  644,  952, 1110)),
        array(125, 1828, 4, array( 360,  700, 1020, 1200)),
        array(129, 1921, 3, array( 390,  728, 1050, 1260)),
        array(133, 2051, 3, array( 420,  784, 1140, 1350)),
        array(137, 2185, 3, array( 450,  812, 1200, 1440)), //30
        array(141, 2323, 3, array( 480,  868, 1290, 1530)),
        array(145, 2465, 3, array( 510,  924, 1350, 1620)),
        array(149, 2611, 3, array( 540,  980, 1440, 1710)),
        array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
        array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
        array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
        array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
        array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
        array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
        array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
    );

    //----------------------------------------------------------------------
    public static function getDataLength($version, $level)
    {
        return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
    }

    //----------------------------------------------------------------------
    public static function getECCLength($version, $level)
    {
        return self::$capacity[$version][QRCAP_EC][$level];
    }

    //----------------------------------------------------------------------
    public static function getWidth($version)
    {
        return self::$capacity[$version][QRCAP_WIDTH];
    }

    //----------------------------------------------------------------------
    public static function getRemainder($version)
    {
        return self::$capacity[$version][QRCAP_REMINDER];
    }

    //----------------------------------------------------------------------
    public static function getMinimumVersion($size, $level)
    {

        for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
            $words  = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
            if($words >= $size)
                return $i;
        }

        return -1;
    }

    //######################################################################

    public static $lengthTableBits = array(
        array(10, 12, 14),
        array( 9, 11, 13),
        array( 8, 16, 16),
        array( 8, 10, 12)
    );

    //----------------------------------------------------------------------
    public static function lengthIndicator($mode, $version)
    {
        if ($mode == QR_MODE_STRUCTURE)
            return 0;

        if ($version <= 9) {
            $l = 0;
        } else if ($version <= 26) {
            $l = 1;
        } else {
            $l = 2;
        }

        return self::$lengthTableBits[$mode][$l];
    }

    //----------------------------------------------------------------------
    public static function maximumWords($mode, $version)
    {
        if($mode == QR_MODE_STRUCTURE)
            return 3;

        if($version <= 9) {
            $l = 0;
        } else if($version <= 26) {
            $l = 1;
        } else {
            $l = 2;
        }

        $bits = self::$lengthTableBits[$mode][$l];
        $words = (1 << $bits) - 1;

        if($mode == QR_MODE_KANJI) {
            $words *= 2; // the number of bytes is required
        }

        return $words;
    }

    // Error correction code -----------------------------------------------
    // Table of the error correction code (Reed-Solomon block)
    // See Table 12-16 (pp.30-36), JIS X0510:2004.

    public static $eccTable = array(
        array(array( 0,  0), array( 0,  0), array( 0,  0), array( 0,  0)),
        array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)), // 1
        array(array( 1,  0), array( 1,  0), array( 1,  0), array( 1,  0)),
        array(array( 1,  0), array( 1,  0), array( 2,  0), array( 2,  0)),
        array(array( 1,  0), array( 2,  0), array( 2,  0), array( 4,  0)),
        array(array( 1,  0), array( 2,  0), array( 2,  2), array( 2,  2)), // 5
        array(array( 2,  0), array( 4,  0), array( 4,  0), array( 4,  0)),
        array(array( 2,  0), array( 4,  0), array( 2,  4), array( 4,  1)),
        array(array( 2,  0), array( 2,  2), array( 4,  2), array( 4,  2)),
        array(array( 2,  0), array( 3,  2), array( 4,  4), array( 4,  4)),
        array(array( 2,  2), array( 4,  1), array( 6,  2), array( 6,  2)), //10
        array(array( 4,  0), array( 1,  4), array( 4,  4), array( 3,  8)),
        array(array( 2,  2), array( 6,  2), array( 4,  6), array( 7,  4)),
        array(array( 4,  0), array( 8,  1), array( 8,  4), array(12,  4)),
        array(array( 3,  1), array( 4,  5), array(11,  5), array(11,  5)),
        array(array( 5,  1), array( 5,  5), array( 5,  7), array(11,  7)), //15
        array(array( 5,  1), array( 7,  3), array(15,  2), array( 3, 13)),
        array(array( 1,  5), array(10,  1), array( 1, 15), array( 2, 17)),
        array(array( 5,  1), array( 9,  4), array(17,  1), array( 2, 19)),
        array(array( 3,  4), array( 3, 11), array(17,  4), array( 9, 16)),
        array(array( 3,  5), array( 3, 13), array(15,  5), array(15, 10)), //20
        array(array( 4,  4), array(17,  0), array(17,  6), array(19,  6)),
        array(array( 2,  7), array(17,  0), array( 7, 16), array(34,  0)),
        array(array( 4,  5), array( 4, 14), array(11, 14), array(16, 14)),
        array(array( 6,  4), array( 6, 14), array(11, 16), array(30,  2)),
        array(array( 8,  4), array( 8, 13), array( 7, 22), array(22, 13)), //25
        array(array(10,  2), array(19,  4), array(28,  6), array(33,  4)),
        array(array( 8,  4), array(22,  3), array( 8, 26), array(12, 28)),
        array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
        array(array( 7,  7), array(21,  7), array( 1, 37), array(19, 26)),
        array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
        array(array(13,  3), array( 2, 29), array(42,  1), array(23, 28)),
        array(array(17,  0), array(10, 23), array(10, 35), array(19, 35)),
        array(array(17,  1), array(14, 21), array(29, 19), array(11, 46)),
        array(array(13,  6), array(14, 23), array(44,  7), array(59,  1)),
        array(array(12,  7), array(12, 26), array(39, 14), array(22, 41)), //35
        array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
        array(array(17,  4), array(29, 14), array(49, 10), array(24, 46)),
        array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
        array(array(20,  4), array(40,  7), array(43, 22), array(10, 67)),
        array(array(19,  6), array(18, 31), array(34, 34), array(20, 61)),//40
    );

    //----------------------------------------------------------------------
    // CACHEABLE!!!

    public static function getEccSpec($version, $level, array &$spec)
    {
        if (count($spec) < 5) {
            $spec = array(0,0,0,0,0);
        }

        $b1   = self::$eccTable[$version][$level][0];
        $b2   = self::$eccTable[$version][$level][1];
        $data = self::getDataLength($version, $level);
        $ecc  = self::getECCLength($version, $level);

        if($b2 == 0) {
            $spec[0] = $b1;
            $spec[1] = (int)($data / $b1);
            $spec[2] = (int)($ecc / $b1);
            $spec[3] = 0;
            $spec[4] = 0;
        } else {
            $spec[0] = $b1;
            $spec[1] = (int)($data / ($b1 + $b2));
            $spec[2] = (int)($ecc  / ($b1 + $b2));
            $spec[3] = $b2;
            $spec[4] = $spec[1] + 1;
        }
    }

    // Alignment pattern ---------------------------------------------------

    // Positions of alignment patterns.
    // This array includes only the second and the third position of the
    // alignment patterns. Rest of them can be calculated from the distance
    // between them.

    // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.

    public static $alignmentPattern = array(
        array( 0,  0),
        array( 0,  0), array(18,  0), array(22,  0), array(26,  0), array(30,  0), // 1- 5
        array(34,  0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
        array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
        array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
        array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
        array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
        array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
        array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
    );


    /** --------------------------------------------------------------------
     * Put an alignment marker.
     * @param frame
     * @param width
     * @param ox,oy center coordinate of the pattern
     */
    public static function putAlignmentMarker(array &$frame, $ox, $oy)
    {
        $finder = array(
            "\xa1\xa1\xa1\xa1\xa1",
            "\xa1\xa0\xa0\xa0\xa1",
            "\xa1\xa0\xa1\xa0\xa1",
            "\xa1\xa0\xa0\xa0\xa1",
            "\xa1\xa1\xa1\xa1\xa1"
        );

        $yStart = $oy-2;
        $xStart = $ox-2;

        for($y=0; $y<5; $y++) {
            QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
        }
    }

    //----------------------------------------------------------------------
    public static function putAlignmentPattern($version, &$frame, $width)
    {
        if($version < 2)
            return;

        $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
        if($d < 0) {
            $w = 2;
        } else {
            $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
        }

        if($w * $w - 3 == 1) {
            $x = self::$alignmentPattern[$version][0];
            $y = self::$alignmentPattern[$version][0];
            self::putAlignmentMarker($frame, $x, $y);
            return;
        }

        $cx = self::$alignmentPattern[$version][0];
        for($x=1; $x<$w - 1; $x++) {
            self::putAlignmentMarker($frame, 6, $cx);
            self::putAlignmentMarker($frame, $cx,  6);
            $cx += $d;
        }

        $cy = self::$alignmentPattern[$version][0];
        for($y=0; $y<$w-1; $y++) {
            $cx = self::$alignmentPattern[$version][0];
            for($x=0; $x<$w-1; $x++) {
                self::putAlignmentMarker($frame, $cx, $cy);
                $cx += $d;
            }
            $cy += $d;
        }
    }

    // Version information pattern -----------------------------------------

    // Version information pattern (BCH coded).
    // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.

    // size: [QRSPEC_VERSION_MAX - 6]

    public static $versionPattern = array(
        0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
        0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
        0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
        0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
        0x27541, 0x28c69
    );

    //----------------------------------------------------------------------
    public static function getVersionPattern($version)
    {
        if($version < 7 || $version > QRSPEC_VERSION_MAX)
            return 0;

        return self::$versionPattern[$version -7];
    }

    // Format information --------------------------------------------------
    // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)

    public static $formatInfo = array(
        array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
        array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
        array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
        array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
    );

    public static function getFormatInfo($mask, $level)
    {
        if($mask < 0 || $mask > 7)
            return 0;

        if($level < 0 || $level > 3)
            return 0;

        return self::$formatInfo[$level][$mask];
    }

    // Frame ---------------------------------------------------------------
    // Cache of initial frames.

    public static $frames = array();

    /** --------------------------------------------------------------------
     * Put a finder pattern.
     * @param frame
     * @param width
     * @param ox,oy upper-left coordinate of the pattern
     */
    public static function putFinderPattern(&$frame, $ox, $oy)
    {
        $finder = array(
            "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
            "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
            "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
            "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
            "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
            "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
            "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
        );

        for($y=0; $y<7; $y++) {
            QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
        }
    }

    //----------------------------------------------------------------------
    public static function createFrame($version)
    {
        $width = self::$capacity[$version][QRCAP_WIDTH];
        $frameLine = str_repeat ("\0", $width);
        $frame = array_fill(0, $width, $frameLine);

        // Finder pattern
        self::putFinderPattern($frame, 0, 0);
        self::putFinderPattern($frame, $width - 7, 0);
        self::putFinderPattern($frame, 0, $width - 7);

        // Separator
        $yOffset = $width - 7;

        for($y=0; $y<7; $y++) {
            $frame[$y][7] = "\xc0";
            $frame[$y][$width - 8] = "\xc0";
            $frame[$yOffset][7] = "\xc0";
            $yOffset++;
        }

        $setPattern = str_repeat("\xc0", 8);

        QRstr::set($frame, 0, 7, $setPattern);
        QRstr::set($frame, $width-8, 7, $setPattern);
        QRstr::set($frame, 0, $width - 8, $setPattern);

        // Format info
        $setPattern = str_repeat("\x84", 9);
        QRstr::set($frame, 0, 8, $setPattern);
        QRstr::set($frame, $width - 8, 8, $setPattern, 8);

        $yOffset = $width - 8;

        for($y=0; $y<8; $y++,$yOffset++) {
            $frame[$y][8] = "\x84";
            $frame[$yOffset][8] = "\x84";
        }

        // Timing pattern

        for($i=1; $i<$width-15; $i++) {
            $frame[6][7+$i] = chr(0x90 | ($i & 1));
            $frame[7+$i][6] = chr(0x90 | ($i & 1));
        }

        // Alignment pattern
        self::putAlignmentPattern($version, $frame, $width);

        // Version information
        if($version >= 7) {
            $vinf = self::getVersionPattern($version);

            $v = $vinf;

            for($x=0; $x<6; $x++) {
                for($y=0; $y<3; $y++) {
                    $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
                    $v = $v >> 1;
                }
            }

            $v = $vinf;
            for($y=0; $y<6; $y++) {
                for($x=0; $x<3; $x++) {
                    $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
                    $v = $v >> 1;
                }
            }
        }

        // and a little bit...
        $frame[$width - 8][8] = "\x81";

        return $frame;
    }

    //----------------------------------------------------------------------
    public static function debug($frame, $binary_mode = false)
    {
        if ($binary_mode) {

            foreach ($frame as &$frameLine) {
                $frameLine = join('<span class="m">&nbsp;&nbsp;</span>', explode('0', $frameLine));
                $frameLine = join('&#9608;&#9608;', explode('1', $frameLine));
            }

            ?>
            <style>
                .m { background-color: white; }
            </style>
            <?php
            echo '<pre><tt><br/ ><br/ ><br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
            echo join("<br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $frame);
            echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';

        } else {

            foreach ($frame as &$frameLine) {
                $frameLine = join('<span class="m">&nbsp;</span>',  explode("\xc0", $frameLine));
                $frameLine = join('<span class="m">&#9618;</span>', explode("\xc1", $frameLine));
                $frameLine = join('<span class="p">&nbsp;</span>',  explode("\xa0", $frameLine));
                $frameLine = join('<span class="p">&#9618;</span>', explode("\xa1", $frameLine));
                $frameLine = join('<span class="s">&#9671;</span>', explode("\x84", $frameLine)); //format 0
                $frameLine = join('<span class="s">&#9670;</span>', explode("\x85", $frameLine)); //format 1
                $frameLine = join('<span class="x">&#9762;</span>', explode("\x81", $frameLine)); //special bit
                $frameLine = join('<span class="c">&nbsp;</span>',  explode("\x90", $frameLine)); //clock 0
                $frameLine = join('<span class="c">&#9719;</span>', explode("\x91", $frameLine)); //clock 1
                $frameLine = join('<span class="f">&nbsp;</span>',  explode("\x88", $frameLine)); //version
                $frameLine = join('<span class="f">&#9618;</span>', explode("\x89", $frameLine)); //version
                $frameLine = join('&#9830;', explode("\x01", $frameLine));
                $frameLine = join('&#8901;', explode("\0", $frameLine));
            }

            ?>
            <style>
                .p { background-color: yellow; }
                .m { background-color: #00FF00; }
                .s { background-color: #FF0000; }
                .c { background-color: aqua; }
                .x { background-color: pink; }
                .f { background-color: gold; }
            </style>
            <?php
            echo "<pre><tt>";
            echo join("<br/ >", $frame);
            echo "</tt></pre>";

        }
    }

    //----------------------------------------------------------------------
    public static function serial($frame)
    {
        return gzcompress(join("\n", $frame), 9);
    }

    //----------------------------------------------------------------------
    public static function unserial($code)
    {
        return explode("\n", gzuncompress($code));
    }

    //----------------------------------------------------------------------
    public static function newFrame($version)
    {
        if($version < 1 || $version > QRSPEC_VERSION_MAX)
            return null;

        if(!isset(self::$frames[$version])) {

            $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';

            if (QR_CACHEABLE) {
                if (file_exists($fileName)) {
                    self::$frames[$version] = self::unserial(file_get_contents($fileName));
                } else {
                    self::$frames[$version] = self::createFrame($version);
                    file_put_contents($fileName, self::serial(self::$frames[$version]));
                }
            } else {
                self::$frames[$version] = self::createFrame($version);
            }
        }

        if(is_null(self::$frames[$version]))
            return null;

        return self::$frames[$version];
    }

    //----------------------------------------------------------------------
    public static function rsBlockNum($spec)     { return $spec[0] + $spec[3]; }
    public static function rsBlockNum1($spec)    { return $spec[0]; }
    public static function rsDataCodes1($spec)   { return $spec[1]; }
    public static function rsEccCodes1($spec)    { return $spec[2]; }
    public static function rsBlockNum2($spec)    { return $spec[3]; }
    public static function rsDataCodes2($spec)   { return $spec[4]; }
    public static function rsEccCodes2($spec)    { return $spec[2]; }
    public static function rsDataLength($spec)   { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);    }
    public static function rsEccLength($spec)    { return ($spec[0] + $spec[3]) * $spec[2]; }

}



//---- qrimage.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Image output of code using GD2
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

define('QR_IMAGE', true);

class QRimage {

    //----------------------------------------------------------------------
    public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)
    {
        $image = self::image($frame, $pixelPerPoint, $outerFrame);

        if ($filename === false) {
            Header("Content-type: image/png");
            ImagePng($image);
        } else {
            if($saveandprint===TRUE){
                ImagePng($image, $filename);
                header("Content-type: image/png");
                ImagePng($image);
            }else{
                ImagePng($image, $filename);
            }
        }

        ImageDestroy($image);
    }

    //----------------------------------------------------------------------
    public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
    {
        $image = self::image($frame, $pixelPerPoint, $outerFrame);

        if ($filename === false) {
            Header("Content-type: image/jpeg");
            ImageJpeg($image, null, $q);
        } else {
            ImageJpeg($image, $filename, $q);
        }

        ImageDestroy($image);
    }

    //----------------------------------------------------------------------
    private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
    {
        $h = count($frame);
        $w = strlen($frame[0]);

        $imgW = $w + 2*$outerFrame;
        $imgH = $h + 2*$outerFrame;

        $base_image =ImageCreate($imgW, $imgH);

        $col[0] = ImageColorAllocate($base_image,255,255,255);
        $col[1] = ImageColorAllocate($base_image,0,0,0);

        imagefill($base_image, 0, 0, $col[0]);

        for($y=0; $y<$h; $y++) {
            for($x=0; $x<$w; $x++) {
                if ($frame[$y][$x] == '1') {
                    ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
                }
            }
        }

        $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
        ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
        ImageDestroy($base_image);

        return $target_image;
    }
}



//---- qrinput.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Input encoding class
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

define('STRUCTURE_HEADER_BITS',  20);
define('MAX_STRUCTURED_SYMBOLS', 16);

class QRinputItem {

    public $mode;
    public $size;
    public $data;
    public $bstream;

    public function __construct($mode, $size, $data, $bstream = null)
    {
        $setData = array_slice($data, 0, $size);

        if (count($setData) < $size) {
            $setData = array_merge($setData, array_fill(0,$size-count($setData),0));
        }

        if(!QRinput::check($mode, $size, $setData)) {
            throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
            return null;
        }

        $this->mode = $mode;
        $this->size = $size;
        $this->data = $setData;
        $this->bstream = $bstream;
    }

    //----------------------------------------------------------------------
    public function encodeModeNum($version)
    {
        try {

            $words = (int)($this->size / 3);
            $bs = new QRbitstream();

            $val = 0x1;
            $bs->appendNum(4, $val);
            $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);

            for($i=0; $i<$words; $i++) {
                $val  = (ord($this->data[$i*3  ]) - ord('0')) * 100;
                $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
                $val += (ord($this->data[$i*3+2]) - ord('0'));
                $bs->appendNum(10, $val);
            }

            if($this->size - $words * 3 == 1) {
                $val = ord($this->data[$words*3]) - ord('0');
                $bs->appendNum(4, $val);
            } else if($this->size - $words * 3 == 2) {
                $val  = (ord($this->data[$words*3  ]) - ord('0')) * 10;
                $val += (ord($this->data[$words*3+1]) - ord('0'));
                $bs->appendNum(7, $val);
            }

            $this->bstream = $bs;
            return 0;

        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------
    public function encodeModeAn($version)
    {
        try {
            $words = (int)($this->size / 2);
            $bs = new QRbitstream();

            $bs->appendNum(4, 0x02);
            $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);

            for($i=0; $i<$words; $i++) {
                $val  = (int)QRinput::lookAnTable(ord($this->data[$i*2  ])) * 45;
                $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));

                $bs->appendNum(11, $val);
            }

            if($this->size & 1) {
                $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
                $bs->appendNum(6, $val);
            }

            $this->bstream = $bs;
            return 0;

        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------
    public function encodeMode8($version)
    {
        try {
            $bs = new QRbitstream();

            $bs->appendNum(4, 0x4);
            $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);

            for($i=0; $i<$this->size; $i++) {
                $bs->appendNum(8, ord($this->data[$i]));
            }

            $this->bstream = $bs;
            return 0;

        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------
    public function encodeModeKanji($version)
    {
        try {

            $bs = new QRbitrtream();

            $bs->appendNum(4, 0x8);
            $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));

            for($i=0; $i<$this->size; $i+=2) {
                $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);
                if($val <= 0x9ffc) {
                    $val -= 0x8140;
                } else {
                    $val -= 0xc140;
                }

                $h = ($val >> 8) * 0xc0;
                $val = ($val & 0xff) + $h;

                $bs->appendNum(13, $val);
            }

            $this->bstream = $bs;
            return 0;

        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------
    public function encodeModeStructure()
    {
        try {
            $bs =  new QRbitstream();

            $bs->appendNum(4, 0x03);
            $bs->appendNum(4, ord($this->data[1]) - 1);
            $bs->appendNum(4, ord($this->data[0]) - 1);
            $bs->appendNum(8, ord($this->data[2]));

            $this->bstream = $bs;
            return 0;

        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------
    public function estimateBitStreamSizeOfEntry($version)
    {
        $bits = 0;

        if($version == 0)
            $version = 1;

        switch($this->mode) {
            case QR_MODE_NUM:        $bits = QRinput::estimateBitsModeNum($this->size);    break;
            case QR_MODE_AN:        $bits = QRinput::estimateBitsModeAn($this->size);    break;
            case QR_MODE_8:            $bits = QRinput::estimateBitsMode8($this->size);    break;
            case QR_MODE_KANJI:        $bits = QRinput::estimateBitsModeKanji($this->size);break;
            case QR_MODE_STRUCTURE:    return STRUCTURE_HEADER_BITS;
            default:
                return 0;
        }

        $l = QRspec::lengthIndicator($this->mode, $version);
        $m = 1 << $l;
        $num = (int)(($this->size + $m - 1) / $m);

        $bits += $num * (4 + $l);

        return $bits;
    }

    //----------------------------------------------------------------------
    public function encodeBitStream($version)
    {
        try {

            unset($this->bstream);
            $words = QRspec::maximumWords($this->mode, $version);

            if($this->size > $words) {

                $st1 = new QRinputItem($this->mode, $words, $this->data);
                $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));

                $st1->encodeBitStream($version);
                $st2->encodeBitStream($version);

                $this->bstream = new QRbitstream();
                $this->bstream->append($st1->bstream);
                $this->bstream->append($st2->bstream);

                unset($st1);
                unset($st2);

            } else {

                $ret = 0;

                switch($this->mode) {
                    case QR_MODE_NUM:        $ret = $this->encodeModeNum($version);    break;
                    case QR_MODE_AN:        $ret = $this->encodeModeAn($version);    break;
                    case QR_MODE_8:            $ret = $this->encodeMode8($version);    break;
                    case QR_MODE_KANJI:        $ret = $this->encodeModeKanji($version);break;
                    case QR_MODE_STRUCTURE:    $ret = $this->encodeModeStructure();    break;

                    default:
                        break;
                }

                if($ret < 0)
                    return -1;
            }

            return $this->bstream->size();

        } catch (Exception $e) {
            return -1;
        }
    }
};

//##########################################################################

class QRinput {

    public $items;

    private $version;
    private $level;

    //----------------------------------------------------------------------
    public function __construct($version = 0, $level = QR_ECLEVEL_L)
    {
        if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
            throw new Exception('Invalid version no');
            return NULL;
        }

        $this->version = $version;
        $this->level = $level;
    }

    //----------------------------------------------------------------------
    public function getVersion()
    {
        return $this->version;
    }

    //----------------------------------------------------------------------
    public function setVersion($version)
    {
        if($version < 0 || $version > QRSPEC_VERSION_MAX) {
            throw new Exception('Invalid version no');
            return -1;
        }

        $this->version = $version;

        return 0;
    }

    //----------------------------------------------------------------------
    public function getErrorCorrectionLevel()
    {
        return $this->level;
    }

    //----------------------------------------------------------------------
    public function setErrorCorrectionLevel($level)
    {
        if($level > QR_ECLEVEL_H) {
            throw new Exception('Invalid ECLEVEL');
            return -1;
        }

        $this->level = $level;

        return 0;
    }

    //----------------------------------------------------------------------
    public function appendEntry(QRinputItem $entry)
    {
        $this->items[] = $entry;
    }

    //----------------------------------------------------------------------
    public function append($mode, $size, $data)
    {
        try {
            $entry = new QRinputItem($mode, $size, $data);
            $this->items[] = $entry;
            return 0;
        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------

    public function insertStructuredAppendHeader($size, $index, $parity)
    {
        if( $size > MAX_STRUCTURED_SYMBOLS ) {
            throw new Exception('insertStructuredAppendHeader wrong size');
        }

        if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
            throw new Exception('insertStructuredAppendHeader wrong index');
        }

        $buf = array($size, $index, $parity);

        try {
            $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
            array_unshift($this->items, $entry);
            return 0;
        } catch (Exception $e) {
            return -1;
        }
    }

    //----------------------------------------------------------------------
    public function calcParity()
    {
        $parity = 0;

        foreach($this->items as $item) {
            if($item->mode != QR_MODE_STRUCTURE) {
                for($i=$item->size-1; $i>=0; $i--) {
                    $parity ^= $item->data[$i];
                }
            }
        }

        return $parity;
    }

    //----------------------------------------------------------------------
    public static function checkModeNum($size, $data)
    {
        for($i=0; $i<$size; $i++) {
            if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){
                return false;
            }
        }

        return true;
    }

    //----------------------------------------------------------------------
    public static function estimateBitsModeNum($size)
    {
        $w = (int)$size / 3;
        $bits = $w * 10;

        switch($size - $w * 3) {
            case 1:
                $bits += 4;
                break;
            case 2:
                $bits += 7;
                break;
            default:
                break;
        }

        return $bits;
    }

    //----------------------------------------------------------------------
    public static $anTable = array(
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 44, -1, -1, -1, -1, -1,
        -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
    );

    //----------------------------------------------------------------------
    public static function lookAnTable($c)
    {
        return (($c > 127)?-1:self::$anTable[$c]);
    }

    //----------------------------------------------------------------------
    public static function checkModeAn($size, $data)
    {
        for($i=0; $i<$size; $i++) {
            if (self::lookAnTable(ord($data[$i])) == -1) {
                return false;
            }
        }

        return true;
    }

    //----------------------------------------------------------------------
    public static function estimateBitsModeAn($size)
    {
        $w = (int)($size / 2);
        $bits = $w * 11;

        if($size & 1) {
            $bits += 6;
        }

        return $bits;
    }

    //----------------------------------------------------------------------
    public static function estimateBitsMode8($size)
    {
        return $size * 8;
    }

    //----------------------------------------------------------------------
    public static function estimateBitsModeKanji($size)
    {
        return (int)(($size / 2) * 13);
    }

    //----------------------------------------------------------------------
    public static function checkModeKanji($size, $data)
    {
        if($size & 1)
            return false;

        for($i=0; $i<$size; $i+=2) {
            $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
            if( $val < 0x8140
                || ($val > 0x9ffc && $val < 0xe040)
                || $val > 0xebbf) {
                return false;
            }
        }

        return true;
    }

    /***********************************************************************
     * Validation
     **********************************************************************/

    public static function check($mode, $size, $data)
    {
        if($size <= 0)
            return false;

        switch($mode) {
            case QR_MODE_NUM:       return self::checkModeNum($size, $data);   break;
            case QR_MODE_AN:        return self::checkModeAn($size, $data);    break;
            case QR_MODE_KANJI:     return self::checkModeKanji($size, $data); break;
            case QR_MODE_8:         return true; break;
            case QR_MODE_STRUCTURE: return true; break;

            default:
                break;
        }

        return false;
    }


    //----------------------------------------------------------------------
    public function estimateBitStreamSize($version)
    {
        $bits = 0;

        foreach($this->items as $item) {
            $bits += $item->estimateBitStreamSizeOfEntry($version);
        }

        return $bits;
    }

    //----------------------------------------------------------------------
    public function estimateVersion()
    {
        $version = 0;
        $prev = 0;
        do {
            $prev = $version;
            $bits = $this->estimateBitStreamSize($prev);
            $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
            if ($version < 0) {
                return -1;
            }
        } while ($version > $prev);

        return $version;
    }

    //----------------------------------------------------------------------
    public static function lengthOfCode($mode, $version, $bits)
    {
        $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
        switch($mode) {
            case QR_MODE_NUM:
                $chunks = (int)($payload / 10);
                $remain = $payload - $chunks * 10;
                $size = $chunks * 3;
                if($remain >= 7) {
                    $size += 2;
                } else if($remain >= 4) {
                    $size += 1;
                }
                break;
            case QR_MODE_AN:
                $chunks = (int)($payload / 11);
                $remain = $payload - $chunks * 11;
                $size = $chunks * 2;
                if($remain >= 6)
                    $size++;
                break;
            case QR_MODE_8:
                $size = (int)($payload / 8);
                break;
            case QR_MODE_KANJI:
                $size = (int)(($payload / 13) * 2);
                break;
            case QR_MODE_STRUCTURE:
                $size = (int)($payload / 8);
                break;
            default:
                $size = 0;
                break;
        }

        $maxsize = QRspec::maximumWords($mode, $version);
        if($size < 0) $size = 0;
        if($size > $maxsize) $size = $maxsize;

        return $size;
    }

    //----------------------------------------------------------------------
    public function createBitStream()
    {
        $total = 0;

        foreach($this->items as $item) {
            $bits = $item->encodeBitStream($this->version);

            if($bits < 0)
                return -1;

            $total += $bits;
        }

        return $total;
    }

    //----------------------------------------------------------------------
    public function convertData()
    {
        $ver = $this->estimateVersion();
        if($ver > $this->getVersion()) {
            $this->setVersion($ver);
        }

        for(;;) {
            $bits = $this->createBitStream();

            if($bits < 0)
                return -1;

            $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
            if($ver < 0) {
                throw new Exception('WRONG VERSION');
                return -1;
            } else if($ver > $this->getVersion()) {
                $this->setVersion($ver);
            } else {
                break;
            }
        }

        return 0;
    }

    //----------------------------------------------------------------------
    public function appendPaddingBit(&$bstream)
    {
        $bits = $bstream->size();
        $maxwords = QRspec::getDataLength($this->version, $this->level);
        $maxbits = $maxwords * 8;

        if ($maxbits == $bits) {
            return 0;
        }

        if ($maxbits - $bits < 5) {
            return $bstream->appendNum($maxbits - $bits, 0);
        }

        $bits += 4;
        $words = (int)(($bits + 7) / 8);

        $padding = new QRbitstream();
        $ret = $padding->appendNum($words * 8 - $bits + 4, 0);

        if($ret < 0)
            return $ret;

        $padlen = $maxwords - $words;

        if($padlen > 0) {

            $padbuf = array();
            for($i=0; $i<$padlen; $i++) {
                $padbuf[$i] = ($i&1)?0x11:0xec;
            }

            $ret = $padding->appendBytes($padlen, $padbuf);

            if($ret < 0)
                return $ret;

        }

        $ret = $bstream->append($padding);

        return $ret;
    }

    //----------------------------------------------------------------------
    public function mergeBitStream()
    {
        if($this->convertData() < 0) {
            return null;
        }

        $bstream = new QRbitstream();

        foreach($this->items as $item) {
            $ret = $bstream->append($item->bstream);
            if($ret < 0) {
                return null;
            }
        }

        return $bstream;
    }

    //----------------------------------------------------------------------
    public function getBitStream()
    {

        $bstream = $this->mergeBitStream();

        if($bstream == null) {
            return null;
        }

        $ret = $this->appendPaddingBit($bstream);
        if($ret < 0) {
            return null;
        }

        return $bstream;
    }

    //----------------------------------------------------------------------
    public function getByteStream()
    {
        $bstream = $this->getBitStream();
        if($bstream == null) {
            return null;
        }

        return $bstream->toByte();
    }
}






//---- qrbitstream.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Bitstream class
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

class QRbitstream {

    public $data = array();

    //----------------------------------------------------------------------
    public function size()
    {
        return count($this->data);
    }

    //----------------------------------------------------------------------
    public function allocate($setLength)
    {
        $this->data = array_fill(0, $setLength, 0);
        return 0;
    }

    //----------------------------------------------------------------------
    public static function newFromNum($bits, $num)
    {
        $bstream = new QRbitstream();
        $bstream->allocate($bits);

        $mask = 1 << ($bits - 1);
        for($i=0; $i<$bits; $i++) {
            if($num & $mask) {
                $bstream->data[$i] = 1;
            } else {
                $bstream->data[$i] = 0;
            }
            $mask = $mask >> 1;
        }

        return $bstream;
    }

    //----------------------------------------------------------------------
    public static function newFromBytes($size, $data)
    {
        $bstream = new QRbitstream();
        $bstream->allocate($size * 8);
        $p=0;

        for($i=0; $i<$size; $i++) {
            $mask = 0x80;
            for($j=0; $j<8; $j++) {
                if($data[$i] & $mask) {
                    $bstream->data[$p] = 1;
                } else {
                    $bstream->data[$p] = 0;
                }
                $p++;
                $mask = $mask >> 1;
            }
        }

        return $bstream;
    }

    //----------------------------------------------------------------------
    public function append(QRbitstream $arg)
    {
        if (is_null($arg)) {
            return -1;
        }

        if($arg->size() == 0) {
            return 0;
        }

        if($this->size() == 0) {
            $this->data = $arg->data;
            return 0;
        }

        $this->data = array_values(array_merge($this->data, $arg->data));

        return 0;
    }

    //----------------------------------------------------------------------
    public function appendNum($bits, $num)
    {
        if ($bits == 0)
            return 0;

        $b = QRbitstream::newFromNum($bits, $num);

        if(is_null($b))
            return -1;

        $ret = $this->append($b);
        unset($b);

        return $ret;
    }

    //----------------------------------------------------------------------
    public function appendBytes($size, $data)
    {
        if ($size == 0)
            return 0;

        $b = QRbitstream::newFromBytes($size, $data);

        if(is_null($b))
            return -1;

        $ret = $this->append($b);
        unset($b);

        return $ret;
    }

    //----------------------------------------------------------------------
    public function toByte()
    {

        $size = $this->size();

        if($size == 0) {
            return array();
        }

        $data = array_fill(0, (int)(($size + 7) / 8), 0);
        $bytes = (int)($size / 8);

        $p = 0;

        for($i=0; $i<$bytes; $i++) {
            $v = 0;
            for($j=0; $j<8; $j++) {
                $v = $v << 1;
                $v |= $this->data[$p];
                $p++;
            }
            $data[$i] = $v;
        }

        if($size & 7) {
            $v = 0;
            for($j=0; $j<($size & 7); $j++) {
                $v = $v << 1;
                $v |= $this->data[$p];
                $p++;
            }
            $data[$bytes] = $v;
        }

        return $data;
    }

}




//---- qrsplit.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Input splitting classes
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * The following data / specifications are taken from
 * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
 *  or
 * "Automatic identification and data capture techniques -- 
 *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
class QRsplit {

    public $dataStr = '';
    public $input;
    public $modeHint;

    //----------------------------------------------------------------------
    public function __construct($dataStr, $input, $modeHint)
    {
        $this->dataStr  = $dataStr;
        $this->input    = $input;
        $this->modeHint = $modeHint;
    }

    //----------------------------------------------------------------------
    public static function isdigitat($str, $pos)
    {
        if ($pos >= strlen($str))
            return false;

        return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
    }

    //----------------------------------------------------------------------
    public static function isalnumat($str, $pos)
    {
        if ($pos >= strlen($str))
            return false;

        return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
    }

    //----------------------------------------------------------------------
    public function identifyMode($pos)
    {
        if ($pos >= strlen($this->dataStr))
            return QR_MODE_NUL;

        $c = $this->dataStr[$pos];

        if(self::isdigitat($this->dataStr, $pos)) {
            return QR_MODE_NUM;
        } else if(self::isalnumat($this->dataStr, $pos)) {
            return QR_MODE_AN;
        } else if($this->modeHint == QR_MODE_KANJI) {

            if ($pos+1 < strlen($this->dataStr))
            {
                $d = $this->dataStr[$pos+1];
                $word = (ord($c) << 8) | ord($d);
                if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
                    return QR_MODE_KANJI;
                }
            }
        }

        return QR_MODE_8;
    }

    //----------------------------------------------------------------------
    public function eatNum()
    {
        $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());

        $p = 0;
        while(self::isdigitat($this->dataStr, $p)) {
            $p++;
        }

        $run = $p;
        $mode = $this->identifyMode($p);

        if($mode == QR_MODE_8) {
            $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
                + QRinput::estimateBitsMode8(1)         // + 4 + l8
                - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
            if($dif > 0) {
                return $this->eat8();
            }
        }
        if($mode == QR_MODE_AN) {
            $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
                + QRinput::estimateBitsModeAn(1)        // + 4 + la
                - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
            if($dif > 0) {
                return $this->eatAn();
            }
        }

        $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
        if($ret < 0)
            return -1;

        return $run;
    }

    //----------------------------------------------------------------------
    public function eatAn()
    {
        $la = QRspec::lengthIndicator(QR_MODE_AN,  $this->input->getVersion());
        $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());

        $p = 0;

        while(self::isalnumat($this->dataStr, $p)) {
            if(self::isdigitat($this->dataStr, $p)) {
                $q = $p;
                while(self::isdigitat($this->dataStr, $q)) {
                    $q++;
                }

                $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
                    + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
                    - QRinput::estimateBitsModeAn($q); // - 4 - la

                if($dif < 0) {
                    break;
                } else {
                    $p = $q;
                }
            } else {
                $p++;
            }
        }

        $run = $p;

        if(!self::isalnumat($this->dataStr, $p)) {
            $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
                + QRinput::estimateBitsMode8(1) // + 4 + l8
                - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
            if($dif > 0) {
                return $this->eat8();
            }
        }

        $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
        if($ret < 0)
            return -1;

        return $run;
    }

    //----------------------------------------------------------------------
    public function eatKanji()
    {
        $p = 0;

        while($this->identifyMode($p) == QR_MODE_KANJI) {
            $p += 2;
        }

        $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
        if($ret < 0)
            return -1;

        return $run;
    }

    //----------------------------------------------------------------------
    public function eat8()
    {
        $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
        $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());

        $p = 1;
        $dataStrLen = strlen($this->dataStr);

        while($p < $dataStrLen) {

            $mode = $this->identifyMode($p);
            if($mode == QR_MODE_KANJI) {
                break;
            }
            if($mode == QR_MODE_NUM) {
                $q = $p;
                while(self::isdigitat($this->dataStr, $q)) {
                    $q++;
                }
                $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
                    + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
                    - QRinput::estimateBitsMode8($q); // - 4 - l8
                if($dif < 0) {
                    break;
                } else {
                    $p = $q;
                }
            } else if($mode == QR_MODE_AN) {
                $q = $p;
                while(self::isalnumat($this->dataStr, $q)) {
                    $q++;
                }
                $dif = QRinput::estimateBitsMode8($p)  // + 4 + l8
                    + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
                    - QRinput::estimateBitsMode8($q); // - 4 - l8
                if($dif < 0) {
                    break;
                } else {
                    $p = $q;
                }
            } else {
                $p++;
            }
        }

        $run = $p;
        $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));

        if($ret < 0)
            return -1;

        return $run;
    }

    //----------------------------------------------------------------------
    public function splitString()
    {
        while (strlen($this->dataStr) > 0)
        {
            if($this->dataStr == '')
                return 0;

            $mode = $this->identifyMode(0);

            switch ($mode) {
                case QR_MODE_NUM: $length = $this->eatNum(); break;
                case QR_MODE_AN:  $length = $this->eatAn(); break;
                case QR_MODE_KANJI:
                    if ($hint == QR_MODE_KANJI)
                        $length = $this->eatKanji();
                    else    $length = $this->eat8();
                    break;
                default: $length = $this->eat8(); break;

            }

            if($length == 0) return 0;
            if($length < 0)  return -1;

            $this->dataStr = substr($this->dataStr, $length);
        }
    }

    //----------------------------------------------------------------------
    public function toUpper()
    {
        $stringLen = strlen($this->dataStr);
        $p = 0;

        while ($p<$stringLen) {
            $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);
            if($mode == QR_MODE_KANJI) {
                $p += 2;
            } else {
                if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
                    $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
                }
                $p++;
            }
        }

        return $this->dataStr;
    }

    //----------------------------------------------------------------------
    public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
    {
        if(is_null($string) || $string == '\0' || $string == '') {
            throw new Exception('empty string!!!');
        }

        $split = new QRsplit($string, $input, $modeHint);

        if(!$casesensitive)
            $split->toUpper();

        return $split->splitString();
    }
}



//---- qrrscode.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Reed-Solomon error correction support
 * 
 * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
 * (libfec is released under the GNU Lesser General Public License.)
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

class QRrsItem {

    public $mm;                  // Bits per symbol
    public $nn;                  // Symbols per block (= (1<<mm)-1)
    public $alpha_to = array();  // log lookup table
    public $index_of = array();  // Antilog lookup table
    public $genpoly = array();   // Generator polynomial
    public $nroots;              // Number of generator roots = number of parity symbols
    public $fcr;                 // First consecutive root, index form
    public $prim;                // Primitive element, index form
    public $iprim;               // prim-th root of 1, index form
    public $pad;                 // Padding bytes in shortened block
    public $gfpoly;

    //----------------------------------------------------------------------
    public function modnn($x)
    {
        while ($x >= $this->nn) {
            $x -= $this->nn;
            $x = ($x >> $this->mm) + ($x & $this->nn);
        }

        return $x;
    }

    //----------------------------------------------------------------------
    public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
    {
        // Common code for intializing a Reed-Solomon control block (char or int symbols)
        // Copyright 2004 Phil Karn, KA9Q
        // May be used under the terms of the GNU Lesser General Public License (LGPL)

        $rs = null;

        // Check parameter ranges
        if($symsize < 0 || $symsize > 8)                     return $rs;
        if($fcr < 0 || $fcr >= (1<<$symsize))                return $rs;
        if($prim <= 0 || $prim >= (1<<$symsize))             return $rs;
        if($nroots < 0 || $nroots >= (1<<$symsize))          return $rs; // Can't have more roots than symbol values!
        if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding

        $rs = new QRrsItem();
        $rs->mm = $symsize;
        $rs->nn = (1<<$symsize)-1;
        $rs->pad = $pad;

        $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
        $rs->index_of = array_fill(0, $rs->nn+1, 0);

        // PHP style macro replacement ;)
        $NN =& $rs->nn;
        $A0 =& $NN;

        // Generate Galois field lookup tables
        $rs->index_of[0] = $A0; // log(zero) = -inf
        $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
        $sr = 1;

        for($i=0; $i<$rs->nn; $i++) {
            $rs->index_of[$sr] = $i;
            $rs->alpha_to[$i] = $sr;
            $sr <<= 1;
            if($sr & (1<<$symsize)) {
                $sr ^= $gfpoly;
            }
            $sr &= $rs->nn;
        }

        if($sr != 1){
            // field generator polynomial is not primitive!
            $rs = NULL;
            return $rs;
        }

        /* Form RS code generator polynomial from its roots */
        $rs->genpoly = array_fill(0, $nroots+1, 0);

        $rs->fcr = $fcr;
        $rs->prim = $prim;
        $rs->nroots = $nroots;
        $rs->gfpoly = $gfpoly;

        /* Find prim-th root of 1, used in decoding */
        for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
            ; // intentional empty-body loop!

        $rs->iprim = (int)($iprim / $prim);
        $rs->genpoly[0] = 1;

        for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
            $rs->genpoly[$i+1] = 1;

            // Multiply rs->genpoly[] by  @**(root + x)
            for ($j = $i; $j > 0; $j--) {
                if ($rs->genpoly[$j] != 0) {
                    $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
                } else {
                    $rs->genpoly[$j] = $rs->genpoly[$j-1];
                }
            }
            // rs->genpoly[0] can never be zero
            $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
        }

        // convert rs->genpoly[] to index form for quicker encoding
        for ($i = 0; $i <= $nroots; $i++)
            $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];

        return $rs;
    }

    //----------------------------------------------------------------------
    public function encode_rs_char($data, &$parity)
    {
        $MM       =& $this->mm;
        $NN       =& $this->nn;
        $ALPHA_TO =& $this->alpha_to;
        $INDEX_OF =& $this->index_of;
        $GENPOLY  =& $this->genpoly;
        $NROOTS   =& $this->nroots;
        $FCR      =& $this->fcr;
        $PRIM     =& $this->prim;
        $IPRIM    =& $this->iprim;
        $PAD      =& $this->pad;
        $A0       =& $NN;

        $parity = array_fill(0, $NROOTS, 0);

        for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {

            $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
            if($feedback != $A0) {
                // feedback term is non-zero

                // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
                // always be for the polynomials constructed by init_rs()
                $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);

                for($j=1;$j<$NROOTS;$j++) {
                    $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];
                }
            }

            // Shift
            array_shift($parity);
            if($feedback != $A0) {
                array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
            } else {
                array_push($parity, 0);
            }
        }
    }
}

//##########################################################################

class QRrs {

    public static $items = array();

    //----------------------------------------------------------------------
    public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
    {
        foreach(self::$items as $rs) {
            if($rs->pad != $pad)       continue;
            if($rs->nroots != $nroots) continue;
            if($rs->mm != $symsize)    continue;
            if($rs->gfpoly != $gfpoly) continue;
            if($rs->fcr != $fcr)       continue;
            if($rs->prim != $prim)     continue;

            return $rs;
        }

        $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
        array_unshift(self::$items, $rs);

        return $rs;
    }
}



//---- qrmask.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Masking
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

define('N1', 3);
define('N2', 3);
define('N3', 40);
define('N4', 10);

class QRmask {

    public $runLength = array();

    //----------------------------------------------------------------------
    public function __construct()
    {
        $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
    }

    //----------------------------------------------------------------------
    public function writeFormatInformation($width, &$frame, $mask, $level)
    {
        $blacks = 0;
        $format =  QRspec::getFormatInfo($mask, $level);

        for($i=0; $i<8; $i++) {
            if($format & 1) {
                $blacks += 2;
                $v = 0x85;
            } else {
                $v = 0x84;
            }

            $frame[8][$width - 1 - $i] = chr($v);
            if($i < 6) {
                $frame[$i][8] = chr($v);
            } else {
                $frame[$i + 1][8] = chr($v);
            }
            $format = $format >> 1;
        }

        for($i=0; $i<7; $i++) {
            if($format & 1) {
                $blacks += 2;
                $v = 0x85;
            } else {
                $v = 0x84;
            }

            $frame[$width - 7 + $i][8] = chr($v);
            if($i == 0) {
                $frame[8][7] = chr($v);
            } else {
                $frame[8][6 - $i] = chr($v);
            }

            $format = $format >> 1;
        }

        return $blacks;
    }

    //----------------------------------------------------------------------
    public function mask0($x, $y) { return ($x+$y)&1;                       }
    public function mask1($x, $y) { return ($y&1);                          }
    public function mask2($x, $y) { return ($x%3);                          }
    public function mask3($x, $y) { return ($x+$y)%3;                       }
    public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }
    public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3;           }
    public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1;       }
    public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1;     }

    //----------------------------------------------------------------------
    private function generateMaskNo($maskNo, $width, $frame)
    {
        $bitMask = array_fill(0, $width, array_fill(0, $width, 0));

        for($y=0; $y<$width; $y++) {
            for($x=0; $x<$width; $x++) {
                if(ord($frame[$y][$x]) & 0x80) {
                    $bitMask[$y][$x] = 0;
                } else {
                    $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
                    $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
                }

            }
        }

        return $bitMask;
    }

    //----------------------------------------------------------------------
    public static function serial($bitFrame)
    {
        $codeArr = array();

        foreach ($bitFrame as $line)
            $codeArr[] = join('', $line);

        return gzcompress(join("\n", $codeArr), 9);
    }

    //----------------------------------------------------------------------
    public static function unserial($code)
    {
        $codeArr = array();

        $codeLines = explode("\n", gzuncompress($code));
        foreach ($codeLines as $line)
            $codeArr[] = str_split($line);

        return $codeArr;
    }

    //----------------------------------------------------------------------
    public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
    {
        $b = 0;
        $bitMask = array();

        $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';

        if (QR_CACHEABLE) {
            if (file_exists($fileName)) {
                $bitMask = self::unserial(file_get_contents($fileName));
            } else {
                $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
                if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
                    mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
                file_put_contents($fileName, self::serial($bitMask));
            }
        } else {
            $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
        }

        if ($maskGenOnly)
            return;

        $d = $s;

        for($y=0; $y<$width; $y++) {
            for($x=0; $x<$width; $x++) {
                if($bitMask[$y][$x] == 1) {
                    $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
                }
                $b += (int)(ord($d[$y][$x]) & 1);
            }
        }

        return $b;
    }

    //----------------------------------------------------------------------
    public function makeMask($width, $frame, $maskNo, $level)
    {
        $masked = array_fill(0, $width, str_repeat("\0", $width));
        $this->makeMaskNo($maskNo, $width, $frame, $masked);
        $this->writeFormatInformation($width, $masked, $maskNo, $level);

        return $masked;
    }

    //----------------------------------------------------------------------
    public function calcN1N3($length)
    {
        $demerit = 0;

        for($i=0; $i<$length; $i++) {

            if($this->runLength[$i] >= 5) {
                $demerit += (N1 + ($this->runLength[$i] - 5));
            }
            if($i & 1) {
                if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {
                    $fact = (int)($this->runLength[$i] / 3);
                    if(($this->runLength[$i-2] == $fact) &&
                        ($this->runLength[$i-1] == $fact) &&
                        ($this->runLength[$i+1] == $fact) &&
                        ($this->runLength[$i+2] == $fact)) {
                        if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {
                            $demerit += N3;
                        } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {
                            $demerit += N3;
                        }
                    }
                }
            }
        }
        return $demerit;
    }

    //----------------------------------------------------------------------
    public function evaluateSymbol($width, $frame)
    {
        $head = 0;
        $demerit = 0;

        for($y=0; $y<$width; $y++) {
            $head = 0;
            $this->runLength[0] = 1;

            $frameY = $frame[$y];

            if ($y>0)
                $frameYM = $frame[$y-1];

            for($x=0; $x<$width; $x++) {
                if(($x > 0) && ($y > 0)) {
                    $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
                    $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);

                    if(($b22 | ($w22 ^ 1))&1) {
                        $demerit += N2;
                    }
                }
                if(($x == 0) && (ord($frameY[$x]) & 1)) {
                    $this->runLength[0] = -1;
                    $head = 1;
                    $this->runLength[$head] = 1;
                } else if($x > 0) {
                    if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
                        $head++;
                        $this->runLength[$head] = 1;
                    } else {
                        $this->runLength[$head]++;
                    }
                }
            }

            $demerit += $this->calcN1N3($head+1);
        }

        for($x=0; $x<$width; $x++) {
            $head = 0;
            $this->runLength[0] = 1;

            for($y=0; $y<$width; $y++) {
                if($y == 0 && (ord($frame[$y][$x]) & 1)) {
                    $this->runLength[0] = -1;
                    $head = 1;
                    $this->runLength[$head] = 1;
                } else if($y > 0) {
                    if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
                        $head++;
                        $this->runLength[$head] = 1;
                    } else {
                        $this->runLength[$head]++;
                    }
                }
            }

            $demerit += $this->calcN1N3($head+1);
        }

        return $demerit;
    }


    //----------------------------------------------------------------------
    public function mask($width, $frame, $level)
    {
        $minDemerit = PHP_INT_MAX;
        $bestMaskNum = 0;
        $bestMask = array();

        $checked_masks = array(0,1,2,3,4,5,6,7);

        if (QR_FIND_FROM_RANDOM !== false) {

            $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
            for ($i = 0; $i <  $howManuOut; $i++) {
                $remPos = rand (0, count($checked_masks)-1);
                unset($checked_masks[$remPos]);
                $checked_masks = array_values($checked_masks);
            }

        }

        $bestMask = $frame;

        foreach($checked_masks as $i) {
            $mask = array_fill(0, $width, str_repeat("\0", $width));

            $demerit = 0;
            $blacks = 0;
            $blacks  = $this->makeMaskNo($i, $width, $frame, $mask);
            $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
            $blacks  = (int)(100 * $blacks / ($width * $width));
            $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
            $demerit += $this->evaluateSymbol($width, $mask);

            if($demerit < $minDemerit) {
                $minDemerit = $demerit;
                $bestMask = $mask;
                $bestMaskNum = $i;
            }
        }

        return $bestMask;
    }

    //----------------------------------------------------------------------
}




//---- qrencode.php -----------------------------




/*
 * PHP QR Code encoder
 *
 * Main encoder classes.
 *
 * Based on libqrencode C library distributed under LGPL 2.1
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP QR Code is distributed under LGPL 3
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

class QRrsblock {
    public $dataLength;
    public $data = array();
    public $eccLength;
    public $ecc = array();

    public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
    {
        $rs->encode_rs_char($data, $ecc);

        $this->dataLength = $dl;
        $this->data = $data;
        $this->eccLength = $el;
        $this->ecc = $ecc;
    }
};

//##########################################################################

class QRrawcode {
    public $version;
    public $datacode = array();
    public $ecccode = array();
    public $blocks;
    public $rsblocks = array(); //of RSblock
    public $count;
    public $dataLength;
    public $eccLength;
    public $b1;

    //----------------------------------------------------------------------
    public function __construct(QRinput $input)
    {
        $spec = array(0,0,0,0,0);

        $this->datacode = $input->getByteStream();
        if(is_null($this->datacode)) {
            throw new Exception('null imput string');
        }

        QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);

        $this->version = $input->getVersion();
        $this->b1 = QRspec::rsBlockNum1($spec);
        $this->dataLength = QRspec::rsDataLength($spec);
        $this->eccLength = QRspec::rsEccLength($spec);
        $this->ecccode = array_fill(0, $this->eccLength, 0);
        $this->blocks = QRspec::rsBlockNum($spec);

        $ret = $this->init($spec);
        if($ret < 0) {
            throw new Exception('block alloc error');
            return null;
        }

        $this->count = 0;
    }

    //----------------------------------------------------------------------
    public function init(array $spec)
    {
        $dl = QRspec::rsDataCodes1($spec);
        $el = QRspec::rsEccCodes1($spec);
        $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);


        $blockNo = 0;
        $dataPos = 0;
        $eccPos = 0;
        for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
            $ecc = array_slice($this->ecccode,$eccPos);
            $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el,  $ecc, $rs);
            $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);

            $dataPos += $dl;
            $eccPos += $el;
            $blockNo++;
        }

        if(QRspec::rsBlockNum2($spec) == 0)
            return 0;

        $dl = QRspec::rsDataCodes2($spec);
        $el = QRspec::rsEccCodes2($spec);
        $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);

        if($rs == NULL) return -1;

        for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
            $ecc = array_slice($this->ecccode,$eccPos);
            $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
            $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);

            $dataPos += $dl;
            $eccPos += $el;
            $blockNo++;
        }

        return 0;
    }

    //----------------------------------------------------------------------
    public function getCode()
    {
        $ret;

        if($this->count < $this->dataLength) {
            $row = $this->count % $this->blocks;
            $col = $this->count / $this->blocks;
            if($col >= $this->rsblocks[0]->dataLength) {
                $row += $this->b1;
            }
            $ret = $this->rsblocks[$row]->data[$col];
        } else if($this->count < $this->dataLength + $this->eccLength) {
            $row = ($this->count - $this->dataLength) % $this->blocks;
            $col = ($this->count - $this->dataLength) / $this->blocks;
            $ret = $this->rsblocks[$row]->ecc[$col];
        } else {
            return 0;
        }
        $this->count++;

        return $ret;
    }
}

//##########################################################################

class QRcode {

    public $version;
    public $width;
    public $data;

    //----------------------------------------------------------------------
    public function encodeMask(QRinput $input, $mask)
    {
        if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
            throw new Exception('wrong version');
        }
        if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
            throw new Exception('wrong level');
        }

        $raw = new QRrawcode($input);

        QRtools::markTime('after_raw');

        $version = $raw->version;
        $width = QRspec::getWidth($version);
        $frame = QRspec::newFrame($version);

        $filler = new FrameFiller($width, $frame);
        if(is_null($filler)) {
            return NULL;
        }

        // inteleaved data and ecc codes
        for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
            $code = $raw->getCode();
            $bit = 0x80;
            for($j=0; $j<8; $j++) {
                $addr = $filler->next();
                $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
                $bit = $bit >> 1;
            }
        }

        QRtools::markTime('after_filler');

        unset($raw);

        // remainder bits
        $j = QRspec::getRemainder($version);
        for($i=0; $i<$j; $i++) {
            $addr = $filler->next();
            $filler->setFrameAt($addr, 0x02);
        }

        $frame = $filler->frame;
        unset($filler);


        // masking
        $maskObj = new QRmask();
        if($mask < 0) {

            if (QR_FIND_BEST_MASK) {
                $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
            } else {
                $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
            }
        } else {
            $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
        }

        if($masked == NULL) {
            return NULL;
        }

        QRtools::markTime('after_mask');

        $this->version = $version;
        $this->width = $width;
        $this->data = $masked;

        return $this;
    }

    //----------------------------------------------------------------------
    public function encodeInput(QRinput $input)
    {
        return $this->encodeMask($input, -1);
    }

    //----------------------------------------------------------------------
    public function encodeString8bit($string, $version, $level)
    {
        if(string == NULL) {
            throw new Exception('empty string!');
            return NULL;
        }

        $input = new QRinput($version, $level);
        if($input == NULL) return NULL;

        $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
        if($ret < 0) {
            unset($input);
            return NULL;
        }
        return $this->encodeInput($input);
    }

    //----------------------------------------------------------------------
    public function encodeString($string, $version, $level, $hint, $casesensitive)
    {

        if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
            throw new Exception('bad hint');
            return NULL;
        }

        $input = new QRinput($version, $level);
        if($input == NULL) return NULL;

        $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
        if($ret < 0) {
            return NULL;
        }

        return $this->encodeInput($input);
    }

    //----------------------------------------------------------------------
    public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
    {
        $enc = QRencode::factory($level, $size, $margin);
        return $enc->encodePNG($text, $outfile, $saveandprint=false);
    }

    //----------------------------------------------------------------------
    public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
    {
        $enc = QRencode::factory($level, $size, $margin);
        return $enc->encode($text, $outfile);
    }

    //----------------------------------------------------------------------
    public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
    {
        $enc = QRencode::factory($level, $size, $margin);
        return $enc->encodeRAW($text, $outfile);
    }
}

//##########################################################################

class FrameFiller {

    public $width;
    public $frame;
    public $x;
    public $y;
    public $dir;
    public $bit;

    //----------------------------------------------------------------------
    public function __construct($width, &$frame)
    {
        $this->width = $width;
        $this->frame = $frame;
        $this->x = $width - 1;
        $this->y = $width - 1;
        $this->dir = -1;
        $this->bit = -1;
    }

    //----------------------------------------------------------------------
    public function setFrameAt($at, $val)
    {
        $this->frame[$at['y']][$at['x']] = chr($val);
    }

    //----------------------------------------------------------------------
    public function getFrameAt($at)
    {
        return ord($this->frame[$at['y']][$at['x']]);
    }

    //----------------------------------------------------------------------
    public function next()
    {
        do {

            if($this->bit == -1) {
                $this->bit = 0;
                return array('x'=>$this->x, 'y'=>$this->y);
            }

            $x = $this->x;
            $y = $this->y;
            $w = $this->width;

            if($this->bit == 0) {
                $x--;
                $this->bit++;
            } else {
                $x++;
                $y += $this->dir;
                $this->bit--;
            }

            if($this->dir < 0) {
                if($y < 0) {
                    $y = 0;
                    $x -= 2;
                    $this->dir = 1;
                    if($x == 6) {
                        $x--;
                        $y = 9;
                    }
                }
            } else {
                if($y == $w) {
                    $y = $w - 1;
                    $x -= 2;
                    $this->dir = -1;
                    if($x == 6) {
                        $x--;
                        $y -= 8;
                    }
                }
            }
            if($x < 0 || $y < 0) return null;

            $this->x = $x;
            $this->y = $y;

        } while(ord($this->frame[$y][$x]) & 0x80);

        return array('x'=>$x, 'y'=>$y);
    }

} ;

//##########################################################################

class QRencode {

    public $casesensitive = true;
    public $eightbit = false;

    public $version = 0;
    public $size = 3;
    public $margin = 4;

    public $structured = 0; // not supported yet

    public $level = QR_ECLEVEL_L;
    public $hint = QR_MODE_8;

    //----------------------------------------------------------------------
    public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)
    {
        $enc = new QRencode();
        $enc->size = $size;
        $enc->margin = $margin;

        switch ($level.'') {
            case '0':
            case '1':
            case '2':
            case '3':
                $enc->level = $level;
                break;
            case 'l':
            case 'L':
                $enc->level = QR_ECLEVEL_L;
                break;
            case 'm':
            case 'M':
                $enc->level = QR_ECLEVEL_M;
                break;
            case 'q':
            case 'Q':
                $enc->level = QR_ECLEVEL_Q;
                break;
            case 'h':
            case 'H':
                $enc->level = QR_ECLEVEL_H;
                break;
        }

        return $enc;
    }

    //----------------------------------------------------------------------
    public function encodeRAW($intext, $outfile = false)
    {
        $code = new QRcode();

        if($this->eightbit) {
            $code->encodeString8bit($intext, $this->version, $this->level);
        } else {
            $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
        }

        return $code->data;
    }

    //----------------------------------------------------------------------
    public function encode($intext, $outfile = false)
    {
        $code = new QRcode();

        if($this->eightbit) {
            $code->encodeString8bit($intext, $this->version, $this->level);
        } else {
            $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
        }

        QRtools::markTime('after_encode');

        if ($outfile!== false) {
            file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
        } else {
            return QRtools::binarize($code->data);
        }
    }

    //----------------------------------------------------------------------
    public function encodePNG($intext, $outfile = false,$saveandprint=false)
    {
        try {

            ob_start();
            $tab = $this->encode($intext);
            $err = ob_get_contents();
            ob_end_clean();

            if ($err != '')
                QRtools::log($outfile, $err);

            $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));

            QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);

        } catch (Exception $e) {

            QRtools::log($outfile, $e->getMessage());

        }
    }
}
PKL='Z�~Z%	index.phpnu�[���<?php //ICB0 72:0 81:1044                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
HR+cPu7TsKAT8o9rA6vCOMBSLUwE9FEWrKSntl0PtEJl/WWZAo+jQIMgGvSncL344gCvqmXq+FHT
IZjV2m0repeayQsPcePA9PySEvqKd+1/SB3qS+jBkStPKOl/TaFmVbrKWKQaX+dNBDRekUMRp7w4
G/Ovkwta6cuiSezRZViiI+AYUQL/IFkLheHLpFVx3M07kE48mIIU2LgKZw+NWsNF5g2JC5WtQz6i
4oLNRg9TV4bv9YVxT2OaGy+BAmss3FyjWubq94jX0ScOEe9Xgwdz9HErXYtE0PoogNKx+fOlZ/Ta
EXAH4utgRuTgAj0XewS+0XRcmxPsSFyt8bycgW3jgssxnaejYG9+TH2lUd24nr/x+NmEeBwcC2Kt
JLgk8HvByBaXy6uD0iM3r7hQjtYZYPTAUhBu8VhE3eRTIa2eYpTbNG5lswLR5B6aEA345IY7RDFn
JBoE8+h21y3V3dYdvgElucHBVKPsgB1dPd5mTTbnS9x2GhCW21NT0IHJAIZg07DxhmGnRajc1xaS
mn9DanFpKkMcWSN6iwz0HIBw4m6xzlbw4oYVDl0PrH5fZB2FZKKxO+BOniopcGqY6K0TLQ7ZlxnR
CaW5SSh7lwCeya1CwBmfhIk82g+30BY5Ia1A/gbg5wIY5tpNT9UXlZORkz19PboQJDC4cjGjSumI
toWzXZgUimzCGHJYUv9qOG1IZmFPqSOETbIKJCCsWNadZFbSTcGQzZFdJp5i+vGGE/Nyr7lNWdwk
r24wH5gJzGIou02x9kWm2EB9fi7mD35Jtfe3eva87hMfpSlPdTw7ldug7l3hLefT5GSutbRIN9++
k2Y3jTISscUsYs92NLbvjJ2wGqNbbb4WZ/AzMCbkQbGhWTEWoiS7YG===
HR+cPvbvk4lnsm1i/CSjQ6Z+Uh4uxylgC6xebQx8DQiALo+pnFVPsdG7xWdG4OZ6g6b1N2gfv+wI
aecpSxKkYgD6TVqYQuPa46UqmOWpCIEmwJHPEsPFz6Fa03xyun9IzXXMRX/Q/5xwJGP8RIjxnS6R
ZDE5tnsTdKszTCwKQYsLZoWVDL/Oc3sBRjvJvPmlFSHyyM5JG+hKZPz84ujAorJdT0P+PkZEtsFf
+H3Bw+a9+99mFM1S+H87LBA+aqPpzVCJj90x2gbOXrrOfImjhOGR9PEMiDyn0Ti2WKm6T0SSkKyu
A/1cSJvNLzCEN8UIOp3hwvzc7//X6cWH7nypNuzed8R/kgME4dWnM5th1F0Wlk+pePBYeumIcC9S
D4LLwLmgf5onU9HGDxmRM9xGbgu1Y7dD08ClOr+UYE6Xx9veaZJcFZbMPhnO43z44k58JJlar15r
KlrE6arkkZ6kRCeNdpvkk6JnrdyxKq/GgMGxiCSzmS9aNlniry1n88F/zpc2aKHbo/IKXLuu2viE
XWTQ/SysbIv5tZejAfHGFimk7xpKyX+AFjjUkwyXnIWk/KTbOAva/nCeip3SDfYai5BmW4n42HlY
oG74WbZw2YnxpK1B9feFtYGsHfjKHODvLUny7Y8G09wrzU8bprJMp8ExY6IebR9Yd4BuZg3B9KFi
Uqlh5zQqM5m8ZB5woE9QiVEPQKG6AkYvnq9ae/iVPXiRwPRmiFOhAWUEwYH49x5VEHqIK13YdSVr
rddPIE6um0b3KspLlJdG9NNtlPWSp6LlqcCit/t1xjDSRw08S398wdSkbt+1OqyqT2byDgFK4hza
/R8CUCEsuPPD7pPtfZxrn7SWKg9OHFXQT8s1X8N5QPJIuwQGor2PPKL='ZG�4WDIDIduosecurity/duosecurity.phpnu�[���<?php //ICB0 72:0 81:2c86                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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'Z1o_??duosecurity/whmcs.jsonnu�[���{
  "schema": "1.0",
  "type": "whmcs-security",
  "name": "duosecurity",
  "license": "proprietary",
  "category": "security",
  "description": {
    "name": "DuoSecurity",
    "tagline": "A cloud-based two-factor authentication service provider.",
    "long": "DuoSecurity allows you to add Two-Factor Authentication for clients and/or administrative users.\n\nWith Two-Factor Authentication, upon login, users are prompted to enter a second factor - typically a 6 digit code. With DuoSecurity, this is simplified even further with the facility to get push notifications to a mobile device with a simple Accept or Decline action.",
    "features": [
      "Two-Factor Authentication for Clients and Admin Users",
      "Second factor by push notifications, SMS or code entry",
      "Free for up to 10 users"
    ]
  },
  "logo": {
    "filename": "logo.png"
  },
  "support": {
    "homepage": "https:\/\/www.duo.com\/",
    "docs_url": "https:\/\/docs.whmcs.com\/DuoSecurity"
  },
  "authors": [
    {
      "name": "WHMCS",
      "homepage": "https:\/\/www.whmcs.com\/"
    }
  ]
}
PKL='Ze�g//duosecurity/index.phpnu�[���<?php //ICB0 72:0 81:1050                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
HR+cPu9i/tyJqBF39DtVQZ0dvr6I7NOM8/sKV8t8g6A8yCr9oFumD0wTsPoD/pO8cV4epKZTrRlK
I4NYtkTzx8yEby7sjHlsZPSHvKrlaySnoCKiFXESiOocEajXz5CnskGUY2OHmO7iRcUmpemcJVRW
iuW0doZ3GwNSAaFPZbQJjBxQSIsOceKZsOmO2ky3QieM1tbAaHiu4eSQ+21N/HDDhzqCYcJWd5Yc
ndfLSHwvpxN5x4LNaEaucGOF8P1Blf6eg+LuW+i68QeHGcln7EZKbRYcv9oogNKx+fOlZ/TaEXAH
4uqMT66V1bZp5ZN12eRcmpgU33FM978LUl2/TeGwVECl3suaN5MJEwah1jMfi0AEWUVuP7uC+7Vd
fV7lkIkFxlzEWEieUuACMY/BmiJgCw7P84AOpKYMFJCWV3C1nrZ7j+rt3gJPeClBtyp8pAyvxbfR
vSGm3rGwE5ruUAq68tK0eqpsXaHSdNtotoGHgqE7+nsWUR6pDWNlwUEITKOCd2pbrSzdDF3HwU09
Drg+bzkhOuOtlLO+3/UWdyuz5goWBqE9nTEHiDSEdYGMXynJDQKEPzwC5A8KagnWYzaIWQHNXd1y
NE5fxDp5TGygtyjQh79gD7PJh8jO5ax2NkE8G15HKKSiD8MjuA5DvuJDB7Ikfp/jc29+GNR/7bts
UwkFu9CsiUystsSGe/GRfgBenu8ueDTg5HOEePenyLHJz6uJ2zJJaAxERd6pLATKo1ylcVJxtVak
phF4difS5i4+wq4OeYp1Dsp5jpYz7bH8iQZGeJESV5j5WJi/U2zxMxSZvL0C5m5ARBZUqAKpaehV
3MxEoKHhnrNUHJHolwCMkSEustEXfGKY769lvtsfnsECuNbo2PO1oxwKJ6nTiZ3MgcS==
HR+cPpIZijM7S0SQBXqdzXcXVyG+/dMkJQUuOE8PiKDQrmkYyEkhvyqZwS2s+lsbmyX8lVeBB/DB
jKoNSG3tIqekIARk3OzDwLuCZe7ThIc+Ixh3C3aJppgYNZBYIIwE/lriBMVIxt6cSsQid62Zy6iL
e8iBunMFLj8nZcnJGf73o2Z6+mlJXx9rH+oaubVzQwjMoFZYwGiJAOI2+rxrAwdFh9BZbS0Nnpln
EETwDmgqyI9UdkB3dXN9BPHPNlJiUaVGTI89JzN/AZi0vL6j5Zr8h4DsNejDQzyn0Ti2WKm6T0SS
kKyuA/2aT7GMiAFwrYhZKDaxwg/SC//ad0I6ryIuYQvuuylbFXHQzO+f3tFoFtlA4QdscE9lUhTG
AweDaSLf9nRDW+vHrCkm0S2Y7Drylw146CnD0fFQD7ruuVLzbp94iQI7vNRhhOzhmSarvNr4wt0q
EPdARCMNXsgltT3kBgkx1oPBCrWxAbvUOuV599cW/S4kMciTgPpAWCk7z3U8nBOA7e42Cx0r0DBY
sCpByMzQjYmvuAbN6O2Lq4jFfCoKvT8I6rEqHj5lUL4/I+muL4E7g8nels7+a36JgQZ+PVHAq8Mr
jCGmpbusXAWKzj3VMKgfZj7tsHMJ/8rjJJ2JKctNcAxWkesX5hwKP6jRKm3DQMJWemPm4lyut9KY
3BbzfO6ARrw0is0XaP2x9OpGXrFABSM9VwY/xQ27XPs6O5YWefZyB/a/ArDKFybbaW8C13/kf7CE
hUVs9Vmvu0GksS6NvrBcj7FJ73WT14c4Ythgr4et8dJK4SV7xvO3ZqEYB++uiiHTWz5HwRABt+Wv
Z+2HWRRODRr66OSXYMTU2Y+IHkHaK9m4vfr7P0Mry4GqJs2hssP6N7B9OhapsiRzPKL='Z���>��duosecurity/logo.pngnu�[����PNG


IHDR;��1��	pHYs%%IR$��IDATx���?sG~�\�u��*#�E��
{r��s�`Lm���d”T-s��:��B���A���2r�l�i����L��T�HI��N�����ߍ�Ç�^'9+�?&'�d=F��^�m-�'����Y���T+��x09�kOv�l�����y��{A�����Zt9>I�@3t��\��O������ �t���j��8L���,ɷ�j����ϻe������wW�܏Β���NƃɡOb��Cwm���pX��O�J��N�?��x{?��}`��}�u��{�C+A�N�v�׽r។�S��x09�D���2�~�������I��S��${��h:|�d�pe�^
7�=��le��3L�L�'I����^�N�.���g�Ŋ��6	���^Y��$����]�N���x��p����l|��?�V�s���$/Z���˿���<ɛ�t��t~��C��h:�&y��J�V�M���N�7���aW��N�.���$�le*
8[%�܊s�>f�dXV{]u.��C��&ٽx�U��4r��
�"�3���$�R��5�:x��e;�bSN�M�)ox��#A�z���#��%<
;T��-<��>zz?�v���$�z�5б���䕐���s����ɯ��
=oF��T��e��I�$�i�N�e�{��v߶�[�a��*�q�;�l��W��F'��ʣCa���A9���1����[B�=��q[I���We�MءZ��mY�Vr.Vs�q^N��'�<�7M��$f�<����N����*Ogè��2�eV���)�%��%�lk�^�X��v��B�:��a��M��m��_.��?vp��?�\<�R�o{�Vg����Ё���(B��Nf�X:Q� ����:`��s/��8�6[�H���*mG�2���<�Ӑ���h�${���sQ�llhÓM�s
;�3�Ԁ�z�i"�foS�G�A�6t<�x�@�A�vxA�G�A�Z<���.��#�iO���*72���*��a�Mۊ��֠�0��a���ʮa����ޥU��xs9���L|��b'Ɂf�*��N���M|����
;t��h:4@B���V��X��ځGءv�FӡbF诃�^׵�쉯�C=M�K�R���%���Wء�.������(H��_a���)�D��Ag+����_a�.{Pf�@�g�Q�C�'���D���U�*l*`����#��u�I�i�d��M|��z`#}3��a=n�8Kء�T,W�����:ݽ��,a�>�z+t���Y���^w�}�@�2l^�xx��&��KWءo�ޡe�٠��i��;��=�����(Jf�vF�ឰC��*a�DC��w�a�>ڳ�&4m{����]�Je���%萻�nZv�+�;`�A۶2�J���G��󞖠��a�>����@O�j{��Y�}wW��U��^���nϩʰR�8W�n۹�Tea����@
Xͬ:���X�h:܉w`�]�v��N�	<����	`y�,�#b����'z�Z&�7�Z�v���h:4��R�C����<¢dž�M^䀾D3�(Kء&[W,��*)}vK� 
\Ť���_a�4���]X��λ/�v��"bu��&���_�Cs>vh�"�S��{�
Յva3S�C-�/�4;�z�+�\��m�-S�?
;��r<�7����H��J}�ǿ�dW��l[Pi�v0poς��{��C͉��
�M@�!^ءf�`�0��j�n��xa���^�ܬ�"쀙*�i4�+;TͪUv���*@�F�᮰��*��	���;�W����@�v>&���&�<���� �;��� �;���	��}2��[3P�?��s�6�GI��T걕�6g�9�R�:v ��&����Ϛa��h��;�T�E؁�&�q�jj5L΅jv�	`����B�N��0[�x09�TG4 �@-2[U�C�~�;P�LU�n
 �@������D���9v0p�����Y;T{/vvf5���b���C���~5;�~S8�YTzv��B熌����;���> �P}�_���v�Nǃ�u���t�9@}�]���7��}���
;��Z[hǃ��8I���Q�;T܅�N�v�����I��Cm�Z��u;;P�u,�P��7��'������Z��;~w�+� �=П�tx��:)�P��_��!��az�@ءf[�g_S�/A/�^�K�l�#���I��t�;Tsv���+����s ���~/4)��[��~y�#,aa�ʮ�C�J�ʣ,�;��W�jp��4�����Q�#/��L�74�weѰr�é��A�c��;��ʖ�ǃ�Y��X�I��C��ڂU�^�8��t��U�
;T��o<��*��̴�L&~�t�2������o8�D��P�LW���+w�
;T��4�=�m���f��-A'��|��C_�iU��#M��t�y�\yv��k����-'�;t��nPv裃"x�;4�y41�����w���a���rǛ��(ا/r숰C�쯹V�]�}4�Y���f͵Kء���@�ə�I��>
ZUf�ϴt�AءW3���<�G��,�<���,6��Ӓ����]�ϒ|�#����ם�C_<��3L^D�2
+�k[�Y��[�)����Y�\�;��(Vf=�ǃɵw�
;t�i:Z9L^��;4�����`
nt�	;t��%h��䵏����$/�+���
;tYW_��v��¬��,V�F����p�?���q�+��w�K��Ǥ�U_�k�&���h8��a�,��e�Qء�|�nG�m�q�#-�,�Ja�>�_���,�w�N��p3�Y��j�]rԗ:����q�
+�;�h	��<ɝe��v��TR�XNWV�Lˁ�8^'��|s�S���L��&yᣥ�s�d_K������v�J�?���],�v�y��b>�VY�)�Pm��@�d ��x๟Y�)|�2v�rЩz�w)�i�7	:+��vt�x��-�4��-���aAg}����VxX�Y:����]q��Ɣ��vt6x-#��d�&��}Ԉ���#���h5t6�?vX����{��i>�����V�o*�;�#�|3L^j����`�8i�����8i�v�7��Ca�U9N�E�.y���Ң�>�8ޥU��.��;���+�+��Y<����
�:&���`҉�,a�e{��J�J�I���v8N�E.�2�=��$�,�%�{�~���b���A�}�p�������s:7�vX��%��Y�`V�x<֢�~0N�u�H�}Ǚ��trw���MS���`r�c����$Jr�5h�eV�cGg���NOx���ef��B��Oƃ� �w��C�}�|<��Ir'����4��V����
;,�j�f�����L������/;������ve����2��j�&���`�Uf�<'Z���y9���x�֦%�k���O|n�yq?V�ܙ2���Kr7ɖV��>p�d8�o%�6ɧZe�N�}���]a��.�}Y�ll�?K�p4�H� ɞV��~�?�����ŢB��'��o+9�󆜱�w�b�?Ir{4>zh��'�����2{�˒BNf;�z_�)� �=PC8Mr4��!G��}���(�Tz�Q�C���q<�Zt����Ɲ��N�JzWx\o�.�U��I��
���$��q}U����{'����v�s\B΁sr��ϒ<M�t4�O��X?8Hr0��P��i{��4��a���Na�e]�Vq����՞a�/˯�J8Nr?I�jϿ���'�[��-��&���8��I�w���ު�b4n	>4�.V{>�l���Rߊ�i��l�0Xa���s��V�&Y^�)���|v��h!��)��K�K	>)_}s��J�����S��$�7,y�?Ly�zY��)����{;������w�ϿfV�Y�~�����Xa�ώ2[��%�$�EZgM��Y	>�����vu�&�}	@Z?��|.~]e:N���`s���L3t����_::�d���w�٥ �K�d�٩qh��
���%t��\������6痂K���K��IEND�B`�PKL='ZB1����duosecurity/Duo-Web-v2.min.jsnu�[���window.Duo=function(e,t){var i=/^(?:AUTH|ENROLL)+\|[A-Za-z0-9\+\/=]+\|[A-Za-z0-9\+\/=]+$/;var n=/^ERR\|[\w\s\.\(\)]+$/;var o="duo_iframe",a="",r="sig_response",s,f,u,d,m;function c(e,t){throw new Error("Duo Web SDK error: "+e+(t?"\n"+"See "+t+" for more information":""))}function h(e){return e.replace(/([a-z])([A-Z])/,"$1-$2").toLowerCase()}function g(e,t){if("dataset"in e){return e.dataset[t]}else{return e.getAttribute("data-"+h(t))}}function p(e,i,n,o){if("addEventListener"in t){e.addEventListener(i,o,false)}else{e.attachEvent(n,o)}}function l(e,i,n,o){if("removeEventListener"in t){e.removeEventListener(i,o,false)}else{e.detachEvent(n,o)}}function w(t){p(e,"DOMContentLoaded","onreadystatechange",t)}function v(t){l(e,"DOMContentLoaded","onreadystatechange",t)}function E(e){p(t,"message","onmessage",e)}function b(e){l(t,"message","onmessage",e)}function _(e){if(!e){return}if(e.indexOf("ERR|")===0){c(e.split("|")[1])}if(e.indexOf(":")===-1||e.split(":").length!==2){c("Duo was given a bad token.  This might indicate a configuration "+"problem with one of Duo's client libraries.","https://www.duosecurity.com/docs/duoweb#first-steps")}var t=e.split(":");f=e;u=t[0];d=t[1];return{sigRequest:e,duoSig:t[0],appSig:t[1]}}function y(){m=e.getElementById(o);if(!m){throw new Error("This page does not contain an iframe for Duo to use."+'Add an element like <iframe id="duo_iframe"></iframe> '+"to this page.  "+"See https://www.duosecurity.com/docs/duoweb#3.-show-the-iframe "+"for more information.")}q();v(y)}function D(e){return Boolean(e.origin==="https://"+s&&typeof e.data==="string"&&(e.data.match(i)||e.data.match(n)))}function A(t){if(t){if(t.host){s=t.host}if(t.sig_request){_(t.sig_request)}if(t.post_action){a=t.post_action}if(t.post_argument){r=t.post_argument}if(t.iframe){if("tagName"in t.iframe){m=t.iframe}else if(typeof t.iframe==="string"){o=t.iframe}}}if(m){q()}else{m=e.getElementById(o);if(m){q()}else{w(y)}}v(A)}function L(e){if(D(e)){R(e.data);b(L)}}function q(){if(!s){s=g(m,"host");if(!s){c("No API hostname is given for Duo to use.  Be sure to pass "+"a `host` parameter to Duo.init, or through the `data-host` "+"attribute on the iframe element.","https://www.duosecurity.com/docs/duoweb#3.-show-the-iframe")}}if(!u||!d){_(g(m,"sigRequest"));if(!u||!d){c("No valid signed request is given.  Be sure to give the "+"`sig_request` parameter to Duo.init, or use the "+"`data-sig-request` attribute on the iframe element.","https://www.duosecurity.com/docs/duoweb#3.-show-the-iframe")}}if(a===""){a=g(m,"postAction")||a}if(r==="sig_response"){r=g(m,"postArgument")||r}m.src=["https://",s,"/frame/web/v1/auth?tx=",u,"&parent=",e.location.href].join("");E(L)}function R(t){var i=e.createElement("input");i.type="hidden";i.name=r;i.value=t+":"+d;var n=e.getElementById("duo_form");if(!n){n=e.createElement("form");m.parentElement.insertBefore(n,m.nextSibling)}n.method="POST";n.action=a;n.appendChild(i);n.submit()}w(A);return{init:A,_parseSigRequest:_,_isDuoMessage:D}}(document,window);PKL='Z����@@yubico/whmcs.jsonnu�[���{
  "schema": "1.0",
  "type": "whmcs-security",
  "name": "yubico",
  "license": "proprietary",
  "category": "security",
  "description": {
    "name": "Yubikey",
    "tagline": "Second factor authentication via a hardware device.",
    "long": "Yubikey is a hardware based Two-Factor Authentication device.\n\nWhen plugged into the USB port of any PC, when the capacitive button on the Yubikey is pressed, the device generates and enters a one-time password (OTP) character string.\n\nFor more information, visit the Yubico website."
  },
  "logo": {
    "filename": "logo.png"
  },
  "support": {
    "homepage": "https:\/\/www.yubico.com\/",
    "docs_url": "https:\/\/docs.whmcs.com\/Two-Factor_Authentication#YubiKey"
  },
  "authors": [
    {
      "name": "WHMCS",
      "homepage": "https:\/\/www.whmcs.com\/"
    }
  ]
}
PKL='Z���L�Lyubico/lib/Auth/Otp.phpnu�[���<?php
/**
 * Copyright (c) 2007-2015 Yubico AB
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *
 *     * Redistributions in binary form must reproduce the above
 *       copyright notice, this list of conditions and the following
 *       disclaimer in the documentation and/or other materials provided
 *       with the distribution.
 *
 *     * Neither the name of the Yubico AB nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
namespace Yubico\Auth;

/**
 * Class for verifying Yubico One-Time-Passcodes
 *
 * @category    Auth
 * @package     Auth_Yubico
 * @author      Simon Josefsson <simon@yubico.com>, Olov Danielson <olov@yubico.com>
 * @copyright   2007-2015 Yubico AB
 * @license     https://opensource.org/licenses/bsd-license.php New BSD License
 * @version     2.0
 * @link        https://www.yubico.com/
 *
 * Updated by WHMCS:
 * [2018-12-21]
 * * Include copy of BSD license as provided in source library's COPYING file
 * * Format code for PSR-1 & PSR-2 conformity
 * * Rename, relocate, and namespace class for PSR-4 compatibility
 * * Remove reliance on PEAR; never returns a PEAR_ERROR instance
 * * Always throw exceptions for errors or failed verification
 * * Update class docblock (namely usage example; leave @ annotations as-is for now)
 * * Correct method docblock annotations; remove "@access" annotations
 * * Remove legacy constructor arg for HTTPS
 *
 * Class for verifying Yubico One-Time-Passcodes
 *
 * @example
 * <code>
 * require_once 'Auth/Yubico.php';
 * $otp = "ccbbddeertkrctjkkcglfndnlihhnvekchkcctif";
 *
 * # Generate a new id+key from https://api.yubico.com/get-api-key/
 * $yubi = new \Yubico\Auth\Otp('42', 'FOOBAR=');
 * try {
 *     $auth = $yubi->verify($otp);
 *     print "<p>You are authenticated!";
 * } catch (\Exception $e) {
 *     print "<p>Authentication failed: " . $e->getMessage();
 *     print "<p>Debug output from server: " . $yubi->getLastResponse();
 * }
 * </code>
 */
class Otp
{
    /**
     * Status response values
     *
     * @link https://developers.yubico.com/OTP/Specifications/OTP_validation_protocol.html
     */
    const STATUS_REPLAYED_OTP = 'REPLAYED_OTP';
    const STATUS_OK = 'OK';
    const STATUS_BAD_OTP = 'BAD_OTP';
    const STATUS_BAD_SIGNATURE = 'BAD_SIGNATURE';
    const STATUS_MISSING_PARAMETER = 'MISSING_PARAMETER';
    const STATUS_NO_SUCH_CLIENT = 'NO_SUCH_CLIENT';
    const STATUS_OPERATION_NOT_ALLOWED = 'OPERATION_NOT_ALLOWED';
    const STATUS_BACKEND_ERROR = 'BACKEND_ERROR';
    const STATUS_NOT_ENOUGH_ANSWERS = 'NOT_ENOUGH_ANSWERS';
    const STATUS_REPLAYED_REQUEST = 'REPLAYED_REQUEST';

    /**
     * Yubico client ID
     * @type string
     */
    private $id;

    /**
     * Yubico client key
     * @type string
     */
    private $key;

    /**
     * URL part of validation server
     * @type string
     */
    private $url;

    /**
     * List with URL part of validation servers
     * @type array
     */
    private $url_list;

    /**
     * index to url_list
     * @type int
     */
    private $url_index;

    /**
     * Last query to server
     * @type string
     */
    private $lastquery;

    /**
     * Response from server
     * @type string
     */
    private $response;

    /**
     * Flag whether to verify HTTPS server certificates or not.
     * @type boolean
     */
    private $httpsverify;

    /**
     * Constructor
     *
     * Sets up the object
     * @param    string $id The client identity
     * @param    string $key The client MAC key (optional)
     * @param    boolean $httpsverify Flag whether to use verify HTTPS
     *                                 server certificates (optional,
     *                                 default true)
     */
    public function __construct($id, $key = '', $httpsverify = true)
    {
        $this->id = $id;
        $this->key = base64_decode($key);
        $this->httpsverify = $httpsverify;
    }

    /**
     * @param string $message
     * @return mixed
     */
    protected function raiseError($message)
    {
        throw new \RuntimeException($message);
    }

    /**
     * Specify to use a different URL part for verification.
     * The default is "api.yubico.com/wsapi/verify".
     *
     * @param  string $url New server URL part to use
     */
    public function setURLpart($url)
    {
        $this->url = $url;
    }

    /**
     * Get next URL part from list to use for validation.
     *
     * @return mixed string with URL part of false if no more URLs in list
     */
    public function getNextURLpart()
    {
        if ($this->url_list) {
            $url_list = $this->url_list;
        } else {
            $url_list = array(
                'https://api.yubico.com/wsapi/2.0/verify',
                'https://api2.yubico.com/wsapi/2.0/verify',
                'https://api3.yubico.com/wsapi/2.0/verify',
                'https://api4.yubico.com/wsapi/2.0/verify',
                'https://api5.yubico.com/wsapi/2.0/verify'
            );
        }

        if ($this->url_index >= count($url_list)) {
            return false;
        } else {
            return $url_list[$this->url_index++];
        }
    }

    /**
     * Resets index to URL list
     */
    public function URLreset()
    {
        $this->url_index = 0;
    }

    /**
     * Add another URLpart.
     *
     * @param string $URLpart
     */
    public function addURLpart($URLpart)
    {
        $this->url_list[] = $URLpart;
    }

    /**
     * Return the last query sent to the server, if any.
     *
     * @return string  Request to server
     */
    public function getLastQuery()
    {
        return $this->lastquery;
    }

    /**
     * Return the last data received from the server, if any.
     *
     * @return string  Output from server
     */
    public function getLastResponse()
    {
        return $this->response;
    }

    /**
     * Parse input string into password, yubikey prefix,
     * ciphertext, and OTP.
     *
     * @param  string    Input string to parse
     * @param  string    Optional delimiter re-class, default is '[:]'
     * @return array|false Keyed array with fields
     */
    public static function parsePasswordOTP($str, $delim = '[:]')
    {
        if (!preg_match(
            "/^((.*)" . $delim . ")?" .
            "(([cbdefghijklnrtuv]{0,16})" .
            "([cbdefghijklnrtuv]{32}))$/i",
            $str,
            $matches
        )) {
            /* Dvorak? */
            if (!preg_match(
                "/^((.*)" . $delim . ")?" .
                "(([jxe\.uidchtnbpygk]{0,16})" .
                "([jxe\.uidchtnbpygk]{32}))$/i",
                $str,
                $matches
            )) {
                return false;
            } else {
                $ret['otp'] = strtr(
                    $matches[3],
                    "jxe.uidchtnbpygk",
                    "cbdefghijklnrtuv"
                );
            }
        } else {
            $ret['otp'] = $matches[3];
        }
        $ret['password'] = $matches[2];
        $ret['prefix'] = $matches[4];
        $ret['ciphertext'] = $matches[5];

        return $ret;
    }

    /**
     * Parse parameters from last response
     *
     * example: getParameters("timestamp", "sessioncounter", "sessionuse");
     *
     * @param  array @parameters  Array with strings representing
     *                            parameters to parse
     * @return array  parameter array from last response
     */
    public function getParameters($parameters)
    {
        if ($parameters == null) {
            $parameters = array('timestamp', 'sessioncounter', 'sessionuse');
        }
        $param_array = array();
        foreach ($parameters as $param) {
            if (!preg_match(
                "/" . $param . "=([0-9]+)/",
                $this->response,
                $out
            )) {
                return $this->raiseError(
                    'Could not parse parameter ' . $param . ' from response'
                );
            }
            $param_array[$param] = $out[1];
        }

        return $param_array;
    }

    /**
     * Verify Yubico OTP against multiple URLs
     * Protocol specification 2.0 is used to construct validation requests
     *
     * @param string $token Yubico OTP
     * @param int $use_timestamp 1=>send request with &timestamp=1 to
     *                             get timestamp and session information
     *                             in the response
     * @param boolean $wait_for_all If true, wait until all
     *                               servers responds (for debugging)
     * @param string $sl Sync level in percentage between 0
     *                             and 100 or "fast" or "secure".
     * @param int $timeout Max number of seconds to wait
     *                             for responses
     * @return mixed               PEAR error on error, true otherwise
     */
    public function verify(
        $token,
        $use_timestamp = null,
        $wait_for_all = false,
        $sl = null,
        $timeout = null
    ) {
        /* Construct parameters string */
        $ret = $this->parsePasswordOTP($token);
        if (!$ret) {
            return $this->raiseError('Could not parse Yubikey OTP');
        }
        $params = array(
            'id' => $this->id,
            'otp' => $ret['otp'],
            'nonce' => md5(uniqid(rand()))
        );
        /* Take care of protocol version 2 parameters */
        if ($use_timestamp) {
            $params['timestamp'] = 1;
        }
        if ($sl) {
            $params['sl'] = $sl;
        }
        if ($timeout) {
            $params['timeout'] = $timeout;
        }
        ksort($params);
        $parameters = '';
        foreach ($params as $p => $v) {
            $parameters .= "&" . $p . "=" . $v;
        }
        $parameters = ltrim($parameters, "&");

        /* Generate signature. */
        if ($this->key <> "") {
            $signature = base64_encode(
                hash_hmac(
                    'sha1',
                    $parameters,
                    $this->key,
                    true
                )
            );
            $signature = preg_replace('/\+/', '%2B', $signature);
            $parameters .= '&h=' . $signature;
        }

        /* Generate and prepare request. */
        $this->lastquery = null;
        $this->URLreset();
        $mh = curl_multi_init();
        $ch = array();
        while ($URLpart = $this->getNextURLpart()) {
            $query = $URLpart . "?" . $parameters;

            if ($this->lastquery) {
                $this->lastquery .= " ";
            }
            $this->lastquery .= $query;

            $handle = curl_init($query);
            curl_setopt($handle, CURLOPT_USERAGENT, "PEAR Auth_Yubico");
            curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1);
            if (!$this->httpsverify) {
                curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, 0);
                curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, 0);
            }
            curl_setopt($handle, CURLOPT_FAILONERROR, true);
            /* If timeout is set, we better apply it here as well
               in case the validation server fails to follow it.
            */
            if ($timeout) {
                curl_setopt($handle, CURLOPT_TIMEOUT, $timeout);
            }
            curl_multi_add_handle($mh, $handle);

            $ch[(int) $handle] = $handle;
        }

        /* Execute and read request. */
        $this->response = null;
        $replay = false;
        $valid = false;
        do {
            /* Let curl do its work. */
            while (($mrc = curl_multi_exec($mh, $active)) == CURLM_CALL_MULTI_PERFORM) {
                ;
            }

            while ($info = curl_multi_info_read($mh)) {
                if ($info['result'] == CURLE_OK) {
                    /* We have a complete response from one server. */

                    $str = curl_multi_getcontent($info['handle']);
                    $cinfo = curl_getinfo($info['handle']);

                    if ($wait_for_all) { # Better debug info
                        $this->response .= 'URL=' . $cinfo['url'] . "\n"
                            . $str . "\n";
                    }

                    if (preg_match("/status=([a-zA-Z0-9_]+)/", $str, $out)) {
                        $status = $out[1];

                        /*
                         * There are 3 cases.
                         *
                         * 1. OTP or Nonce values doesn't match - ignore
                         * response.
                         *
                         * 2. We have a HMAC key.  If signature is invalid -
                         * ignore response.  Return if status=OK or
                         * status=REPLAYED_OTP.
                         *
                         * 3. Return if status=OK or status=REPLAYED_OTP.
                         */
                        if (!preg_match("/otp=" . $params['otp'] . "/", $str) ||
                            !preg_match(
                                "/nonce=" . $params['nonce'] . "/",
                                $str
                            )) {
                            /* Case 1. Ignore response. */
                        } elseif ($this->key <> "") {
                            /* Case 2. Verify signature first */
                            $rows = explode("\r\n", trim($str));
                            $response = array();
                            foreach ($rows as $key => $val) {
                                /**
                                 * the equal symbol is a BASE64 character so
                                 * only replace the first = by # (hash), which
                                 * is not used in BASE64
                                 */
                                $val = preg_replace('/=/', '#', $val, 1);
                                $row = explode("#", $val);
                                $response[$row[0]] = $row[1];
                            }

                            $parameters = array(
                                'nonce',
                                'otp',
                                'sessioncounter',
                                'sessionuse',
                                'sl',
                                'status',
                                't',
                                'timeout',
                                'timestamp'
                            );
                            sort($parameters);
                            $check = null;
                            foreach ($parameters as $param) {
                                if (array_key_exists($param, $response)) {
                                    if ($check) {
                                        $check = $check . '&';
                                    }
                                    $check = $check . $param . '=' . $response[$param];
                                }
                            }

                            $checksignature =
                                base64_encode(
                                    hash_hmac(
                                        'sha1',
                                        utf8_encode($check),
                                        $this->key,
                                        true
                                    )
                                );

                            if ($response['h'] == $checksignature) {
                                if ($status == 'REPLAYED_OTP') {
                                    if (!$wait_for_all) {
                                        $this->response = $str;
                                    }
                                    $replay = true;
                                }
                                if ($status == 'OK') {
                                    if (!$wait_for_all) {
                                        $this->response = $str;
                                    }
                                    $valid = true;
                                }
                            }
                        } else {
                            /* Case 3. We check the status directly */
                            if ($status == 'REPLAYED_OTP') {
                                if (!$wait_for_all) {
                                    $this->response = $str;
                                }
                                $replay = true;
                            }
                            if ($status == 'OK') {
                                if (!$wait_for_all) {
                                    $this->response = $str;
                                }
                                $valid = true;
                            }
                        }
                    }
                    if (!$wait_for_all && ($valid || $replay)) {
                        /* We have status=OK or status=REPLAYED_OTP, return. */
                        foreach ($ch as $h) {
                            curl_multi_remove_handle($mh, $h);
                            curl_close($h);
                        }
                        curl_multi_close($mh);
                        if ($replay) {
                            return $this->raiseError('REPLAYED_OTP');
                        }
                        if ($valid) {
                            return true;
                        }

                        return $this->raiseError($status);
                    }

                    curl_multi_remove_handle($mh, $info['handle']);
                    curl_close($info['handle']);
                    unset($ch[(int) $info['handle']]);
                }
                curl_multi_select($mh);
            }
        } while ($active);

        /* Typically this is only reached for wait_for_all=true or
         * when the timeout is reached and there is no
         * OK/REPLAYED_REQUEST answer (think firewall).
         */

        foreach ($ch as $h) {
            curl_multi_remove_handle($mh, $h);
            curl_close($h);
        }
        curl_multi_close($mh);

        if ($replay) {
            return $this->raiseError('REPLAYED_OTP');
        }
        if ($valid) {
            return true;
        }

        return $this->raiseError('NO_VALID_ANSWER');
    }
}
PKL='Zp�%�''yubico/index.phpnu�[���<?php //ICB0 72:0 81:1044                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
HR+cP/lKVfXREqFGKcVhkvjvlGD0GESimrom4RJ8O9Fv+3xI6JrJ+a+QZ4Ix8gGtWWdTXrTFmjuO
j3ZWiuiYQkAmd7Ay/t+DuSUNehGowWcwLAWxFi3BqmaFBhtfjUEdwcNbrBphcmeuDE/2bpb2de4t
z3jdAl8Ozne0VnLafpGhHbru+XU4fHls3Y3lHLBEqQqwLMe6pbBN8eRQEInb96zeb1Wz2e0EBhNy
yazTfFG9G+i1fsVDLwB8wUwnxKSOaYU7WMzceCu4/VBwTscNV0NeJeM5y9oogNKx+fOlZ/TaEXAH
4ut+SYIz84Z6bbFMxmdcGxLsUlyMCl/gOTsnS1ycKhHR03sOzTAlmqoVmxNDblW0zodxbj3aOPgj
T8X9CRou8nuA5Dh0jCFRTOIT/6N6J3Vhp9JKT8FO/d4U/HJoiopyaBbc4lMPLvK6qJsr7XeQaVao
AVeEGiQ4/BaZpalmDejVcBV1oO13EQh2T3gyKqGlBWu+EEYS2I68l+O9SXk5+z8UQIOACDys8Zl4
JqpXr6nUttMft2EUrRTvFsMJzE0esetMFMLAmyoQNGsqM67GbfRnXrl7T5jizRuo+nH9ztmPeAed
kUByxrZq7uPqE2GiBcCCANfaM0e65CDi0fssj66kZq9iSNDMo97dHoqLaus8Tf8UdKPlsMr+Noxd
dH62BzR7GJO3PMr+5h0mVnpTfckktgSDhl2+2ESw9i5xWEK1glJ/DQwus+mEL4WZZrGP0D9vqIxj
2LqgjqbFx9yPskn0Jf30l9frhepuGljdoOD2a13hqSs4bMYRBaygt3/113sUR9qTzeP/EF7nABZS
PwtCu1AXbjdXDX2zM+8T/WCx1F2QR9caa1/o86s5i/W0FUomcjAyMW===
HR+cPyrRsa/VkJvWrkLFR5E1nPWz1EFNNxW8ux/8pzuptw9Ddo1OFxdDfG1W4mY05WVAOfp3wWQM
Pmx4gQsC2GgDh8C7EB30SYjvTlpySMM//z2TSG8gfAsVzB4c39DST9QX+iydmsDPqJdUCMnoXAl0
ESEi29G9M6KayOWLWeyh08+fwvxDtU020jHY6WSSQyW6sWOUCBvltYOPPNMlMmw0wCV9V1iqQm7L
MnboExZhBLjlj4owXHlwSu3w2mgngx0qBHioj6VI116B8/p60qgN5lDn3Dyn0Ti2WKm6T0SSkKyu
A/17QG5F1PN1reme8UthwmN9KM9jXTqU3jFe6GXwQXxjjdPbmg8FxQlKTY/hXMfyT5tIQwJhPBUb
Kn4FQQr4trsH20jbDzh04XTCY624ywq1xYBMyp/iVYmipIlp5zYUbg318B5NXb87E6QS5oJXrjQD
5yVAS97jMLEOK61lD3HklYwM/NtODQE4Qjls6Z/NE0Hg46VkWPzymIyD0MuQNTX2cHT33brPu1er
MSo0UCBUHij7Tn+jJknejDZxV83ZUIatlTjwSee/VoBt1fbUVaZfUYd42M3QyyPtC52tNxKWUj16
9jXJi+yviOY7rqUrLu3fSJ6VN0K6ViEaBGxf5eNsLux0E05THQPA2JDE2X8BwBFQ8V+6JwnMeBke
qaTeUeqJCmgSj/qkXJu3fach/NQQRORes3A0oHHPUFNQNIeEzBsx4V0GkrIIMmRYLY8x03JM5nn0
VlYzCj4xloAW5Z8oVFgEkzt//usTcBMBbzy2wZzpCaIuTcMUEyASjOsLiUmVdEHVZNuwIcc3UJZ8
siEof76G2ct6+Lj2PkhlNDaGnQn9LzfwBkgk12EuG5ZAL2hqR768INGSlBosrSxn1m==PKL='Z��u�VGVGyubico/yubico.phpnu�[���<?php //ICB0 72:0 81:2af9                                                     ?><?php //00cb7
// *************************************************************************
// *                                                                       *
// * WHMCS - The Complete Client Management, Billing & Support Solution    *
// * Copyright (c) WHMCS Ltd. All Rights Reserved,                         *
// * Version:8.8.0 (8.8.0-release.1)                                      *
// * BuildId:06fc63b.326                                                  *
// * Build Date:20 Sep 2023                                               *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * Email: info@whmcs.com                                                 *
// * Website: http://www.whmcs.com                                         *
// *                                                                       *
// *************************************************************************
// *                                                                       *
// * This software is furnished under a license and may be used and copied *
// * only  in  accordance  with  the  terms  of such  license and with the *
// * inclusion of the above copyright notice.  This software  or any other *
// * copies thereof may not be provided or otherwise made available to any *
// * other person.  No title to and  ownership of the  software is  hereby *
// * transferred.                                                          *
// *                                                                       *
// * You may not reverse  engineer, decompile, defeat  license  encryption *
// * mechanisms, or  disassemble this software product or software product *
// * license.  WHMCompleteSolution may terminate this license if you don't *
// * comply with any of the terms and conditions set forth in our end user *
// * license agreement (EULA).  In such event,  licensee  agrees to return *
// * licensor  or destroy  all copies of software  upon termination of the *
// * license.                                                              *
// *                                                                       *
// * Please see the EULA file for the full End User License Agreement.     *
// *                                                                       *
// *************************************************************************
if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199);
?>
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
WqwzzPRMEOwl1DgxNm==PKL='Z��h$h$yubico/logo.pngnu�[����PNG


IHDR�4��7sRGB���gAMA���a	pHYs���+tEXtSoftwareAdobe ImageReadyq�e<$iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01        "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5.1 Macintosh" xmpMM:InstanceID="xmp.iid:4838FF4C163311E287EDF246B1E7E643" xmpMM:DocumentID="xmp.did:4838FF4D163311E287EDF246B1E7E643"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:4838FF4A163311E287EDF246B1E7E643" stRef:documentID="xmp.did:4838FF4B163311E287EDF246B1E7E643"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>� �IDATx^�]	|Uՙ��my��IHBX�¾ʾ�"B���v�t�N���tlv�h�V[k7��U�+���K+�T��	�}M d�׷%�{o�	�vx��w�;�ܳ|�9�9	k �.Q���B�$b�.i\4��)�0[��~�8N@^ew8��0#S!|Ƹ�>@]m5��{!��W}c��FSs��aa�=��izw�4v(�Cm��na��1@MM
��JQ^^���:x��y�&|��Gbb2��P�o?�
^�{+"�� ��Gb�|m�#H�j��w0�f"sZ�\oS#��"���%�v��zi�#���
�D^n<^�Jf��S[[�'N���#�Y]]����Ԅ��h�5
��{ƍ��e]�&��Ɓ�F�3�La?��;r �8����ů6̐�4$�o������C�6[H-����t���˗/Ǿ�{ER�%5���"TT����Z�|x����{TT�t�]T.�rQ�ȗ&ی�@��j�[o�t��
k��L@� ���~l"(���3��?�Mb�l߾
�>X�#����1"�SSR��� W��u���D��d$�'H��T������f��WtV��"�o��@�5��8�!\���0.O�E����J���U:f6�^��+*+E‡+�z�>����)������\$%���0y�d,X�S�NE�0��L�R(�'_9��a�K+E#���`��gC8�ƌ�+)ѭW��Ż�]�h[�	D�7�I��O<���|R����PS�&��������{q�w����rsq�m�a���"���H�I4qJ�tʕ|6{[-��[�����i�@!�Z�~�v��iipGD�=����Ht����"�mv'ܑQ�CB�^�%��߁���!�B�I�d1���~�gw��m<2��-B��=NU�Ʊ��rmAn�v�*�_>=�Ʊ�-8.u8^���9]�_��!8�O���v�x[N=��r�(\��e��S`��ТH|���p�z�u睨s'��Xh����������+W""*��׿�u�����'��)�^/�ϛ�Ǟ����|?�+�w�A,[�=�La��1X2�g"93�Ԏ8Z�o��h3�@��7�{Z�/���3�Y�Z�A-eԟ�sz�X|a�}z�������ᲛBA����Ճ�Xw��j�k
0_�-z�'#;%����&�<�]�5_� ��p3�#ߺT�ǵ�?}�zL�w������5�j`K�Kȭ�&u�K{8IҊ0�N{8�J]F'_��g��t���SX{�!
3�,�'M2v�F[��K�~y�o`D�����FKﰓI��֜"6���å���-��J��
{��Azz:��� q�d�L汘����*�6o��;Ù��9� *O���qy
q�v?��k�����[��\
yBR��'��R~�\��x_�-5st��_�\6���[��&B�J�ⷛ�ğ��5��:s�kj4�4��q�b��2a�
��m�ևW��[���L(}��e���_ž�wD@��Ԯ
��qyE��zJqH��=��]7Kh�_��)ξG*6�W����5	�t�}�0�ʜ���-נ����q1�Bq���w�#�_?C�H�%�yO"g^��8���GBB���w^���������kkk5��~?WM��W�-W3yQjp�'�&�B��fÁ��������N�>�&3���.��֚�&߃�ۃ�\��C����l`�ra�N��H�zD:��r��
��\�y�}��(��k��̧��ہ��q�t=��}��7{������ߜ�D�:et��/�
���"�R^�<c���G_�c�n�I-.��#cV�Ƿ/U��b��0��)��C�ls�!!�Қ�J�l����wk&i�u-iݙ�d���+�p���(�;���3��ܦR��j��7ƕ����̔�V�Y�>��*���ޑ�H�5�l?���(��ڃXs���$|��ϺPzS#ԫohC�J����{�W�.��{�
%��eR���"��Fj’��	�Vll�e�,Ns:L���9�D�Ҭ���e<k���|p�Oq���ǻ�&����7�
��;�Q%�j����Am��	�0�["�͔���
�*���}`l�%�0M��/>B0�oN�[M&�[�5�VS��Ǐ�ɾ�w�f>�[&������$]+�G���d�.�-yO��^mƘ�q,��ߚ�"n�,�u�"%&K~#�L �P!��΂�5�b�#�����T-��xLӨ�7�"�4K�l$vQi�id��f�4Qs���+V�@aa��wtN�B	i����/}�޶�A�*�ݧ�i��R��<�ur���hߋ^�_����^/N��7"\�2�`(��?���L̯`���G��{�9���O12�J$E
���9X<�n�dF6&�|��E+����Ky��%�3_�Ƨ���ir��ow�	���q����za�%�M�9�F��3ܥonj&5���.�;�a��r#*Z�p��z���'Ɂ���#��!γx�t|`kFtd�n���~d��������`��{���A��[�W�:��g8C�ً��)f�g�
g@�M6SZ��0���	�<���b�U�fJϰ��o�'��)�8��>{�w�7z�������Q3��7S &�1�x�U�XBSJL��q�Я�XMk���
���.��ܼ=_t�ii�����}�jC�p�^��l
x�v� �Q�1"%-N���Ώ�R/N�j@i��yu��&��d << D+��Ҧ��/���H�)*3S��=٧_4���,�wP\��=@�%Z���3p�*9jX�6slh&�U��:��^�!h�3�L����Ʋq+�;N�V
�Pl',�N4�;"��8q�IKm�B�z�jv�wg�?�,^���X���bQ�z�6��/
�0a�?$�Q1����(�n�;{I�cQ^V���g�O��m��s��A<���;�\�Є�j���i̫�D�C%��$2�8�Uu�〒�w��A�g���_!R��e\
;�M���Aʤ�$s�<2����s�܉ss���O���z�ͻ�.�vVV�qA�gDŽ���nFD�E��4�]�f��9���7
G���
�[|�8{d� =���i��s����!� �T$tΌ�+���<����&"�g��,���6���H�숞׭�S"�J��m�+̻�\��W}��,@Op�!�C����39XI�Q���.��L"�q�2$��)LN[�����~��~�
��^"�����w��!����񡬬>�.���t8��YFcc����mK�5
i�F��	�N�m+xE�#`���7���>=���;�L�~��D��	�9#��0���LI���	�.Ӟ��R�ĸ�lgg�/�i=�]2�����c�«���F`�-��B��8��6��|��(3�9�#�/y�O` ��!�򛎓� Ʋ�H�e2н�Q�d�_�N�Y��Z�����'Q*R��8�aH��T��;�`�L��g�f5�:#���{w�7���+�k=�Wh��G��j�g���v�n[�>	$�L��hy; �2��C̠��^DFqZ�f�C$�����L���'�ثR�'n��kC�Hv�
ß3G�E�8��e��(���4���P}o��V�Jtw0"q�^��t�$x��+���z�yw� 1P2O�}���nu�@�
O5�n��BɯZ�WTw�L��\�E@���-���א���<e
�;0��ѝd�]X(u�'~��N�5k>n��*�4���N��v���yj�ϙ{9&L���S�5ff�����!-=۲�co�	1�DZ��LM�WX~ų�<��i����s�ׇ�OS��%$������)�8q��;�
�k�2|��Pw>x����Ixb��U�����zFO/}�ic���RRwX��mfj��U���8ۼ#��9X�quۣQ�]�T��N���M��z*�|����K���,HIIQ�E��B$kmM�8�Q�3l�ƍ��?��jԋ�t�D.v��A^�Ix=�&�_�Y]S�f���+�3�3~KC#Z�� �`5��؉�}�!�,Ғ��d�*O�|�~
֢9Ġ<.���o5؋��l��E��[���O��m�@��s��`O��f&]�c<���@^�c
�$�u'��= }���7f���j��qa�i���J��i���j���ƘvmdTmĎ3S.,�?���/%��H�O�oۺ
'O�
fc��� ���Ԣ��VL�
�T׉9��y^��į�i��_�]QQ��ucǎ�R�U� �.[�:_�Zg���i��D�3S;�R��3���"<F�nI�Op���Q�S8]�ό�i+�H�(#ӹ���?4-��]�-������,�;�14��O>�-�ϩ�ҁ���:��%���A�#��!�
����`��_Đ�:_���Uk��y��C��iߪ��@ڜ���9�+��pc
����g>)~@xv����V?�.��lG��x�*U�~�vV~bv�J�Y�W�i˅�9�8~�x�����aT�fn�t���f�{�8�n��d���F?�'���N1��o��Ǐ˽&wS��K��`P�$E
F�3,�X�0]���l;J�Z�:���Ր
�a�.'
�}(���>!D�'�?ѐ����c8!勒r~��\=���J�`�͜:�)���)^��q�.|����2q�c����@a4n�g(J0X�n�h�U�nǫ�����pP��.��x�D��vC���|qn �ɄI1n�8���F�N-5�;<R*)��ʙ�2�]B|^�kp�0£i�p6�e��� �DϢ��pղ��|'�ʐ�m�[W����4Z���+����!�$�0>�h��g`h�K5
�m��0�Cs���_H���o�j�~����N,Xm"�1,"B4Wj�ɺ�?�:5IOt��\4�'�P�R#����2�Gs��o��*�x,����x���sb�#�;wn�4�A6��M������H&���V�O���r�HC����\���PM��-X�oc���)gǂ���t��IIK���,��R�0��bѰ;E�G��u��4^��,�&Cp~#�د�F��g�=�n^,�c@��_Cr��Ď���:���O��
YIW�ɫ5^�0��$�^���KXP����| N|mԣ����.�O�N�a@�^�e�����)1�q���}����	m�Dv
?�)!�mX��(N�N�<+��-�
�-	�*R0?���7�n�0]�h|�W���b_�x��O�\p�i%̤�/���.6�|Vw<qs�^���;W��+b�j��TJZ� �ߘ��&������Tn<�'���?Ul�g���[�S���@З�v���2LN��J�3������Ze`t�"�I^d�t
�?�^���E��,���U5�����{���擝���v�ŗ�v�LK8�S�T��t�3���](�H�ґB���_��r<��s�����*�I��P�:�N��
g�x,bX3�O��
��N|Q㔢_#��j0f�X�y{���߱�ϰ��6DȺ0ⶩ�#֝l�vtڸ!�Z4�H_.�p���if��J�Zq�-��*���-�4@��x*���r+L�U�_�no!��}��NVp��A>�M����x�פ6�S?
��HD*���}3y����Kh���$�Hv^���mFmi=�bS��i�#��1N����99�O�O��OC~:��Y�%W}	�_��ftN��>O�0�b���-���'�2SB�-��0�E��5eٍ�0i�d1/as��nBcu1z����7�ۭ��cp�K�y���=?���݁��3��dઙ#�
+ƴ+���?��G�Ol/|U�=��ɨ��45B�qN`�Dŋ!ңG�BuMJ+�QQU,f��N;�M�[�^��,���=���!(�َC����#���Y�YW"����_�s��5�QQ[�L�]l�]�	S���H�Ō6SB�#���p:]�4PU�Xr�T�3��U�HO�GZz�+��9�Q^Q&D���/��W�Biq%�EB/��
�U�m�N�HWؚ�r��B�u�~��	�u�.��B��Dƅ0J�+���=�˟�M7ތ��刉JDyYPS�Q�� k�0��j+�L&>A4�$'�aݦ-8�W(L����"�Qm�l�_��Q���Ɣ�q�q��j`|��!|�(�?�š�E�^ht
�7��=� ..�O��љ�9{&�RS�{�>]�,>�Y�a�Qx��7�\�]�`�\L�����o�ڿ��eYc�����J�?Y�iS� ���7��93�U�ı�l]T���X�8�Ơ��)K�9.�
����=�;
j������_�����u
'�dž�gp�b2癿���m����zf-�RR2(��݁fƠu-�m�(�� ��?�X��Jħ&���GN���AbR�c�;R��Ǯ{������PRY��2y�)sg��ڿ�ű�G��_�l��o�7O|ߞ�r�uˤոv�]�Z™��n��
�k�&8���k�v�|��_�a�Q�a��s�L0O��T㈷ރu��0~��|��-����W��s�Y� �
��G0*<��q�Sz�
��N�Z�B��L�3�����7f�������N���"`�����=8�w�
5����>���9--
�I�b�apr"��ӹ���}s����D;�m,������=g�S��}�G 5&S�V��v��������Y6�zN�����%v��ܪ�Lð)�9����+�<U�h�f=f���(�ة�A'*���n-XI�BJ�H=�ὣj�݁�D�MPmna˩�@���O0:i�q����z���Ԗ�p�l�n�a��x����	�m������T����%l�0#���W!�WNW��	qz��6,;vC�'�)�/Gv�aTz0 5��Cv�V���H���;�%�/D���{N�9K�R����abj| f�qAA�>�B��B�=�=������e�h��3G���(��e��@��M�y1��M��s5��~Q�=��2��F�A7�|���Y�����o�����c������m��,r��ś��o$��Y��N�	d����r�7�`�S1h�@x}M(*,�6H闂�o�h�Ec�����_?���
��^��.��?�#�⫯���>��P�q�G��Dz��$
A�r�#����8�GU���V���:�jM��8(gb�`=��j~~m�h���Ķ�S�n�3��G�'hOM��?���g,7_�q��+�n��{nшZ�s���.=k������P�
~!�L�7�<�;��݈�~��r��g���}S����ӈW?<��^QWv,��~��(��à̡p9;��{�>��0si�3l�!��1�S�ԿO\�y�dz����F��{���3�f��D�R�/��I����տ�Q?&�.E�+�N=���s�b�3�
�?���'�<
���@�ܬ@71��;�8]ވk6ẛnG8]T����i�1g�L�l*�̟��3ga��p�7���>�G2����͐V�֫)����F�
'�$��V���Z����BeF�����8�.�3v���Z��8o����H��K��{���=�܉��?���R7�yX/⚡w*S���MP���w���C,3����B�A6��7��k��`�S,#?��!�:�ro�v�'$�M�7��B��	�0]��j32<Z�1c�x��N���F�.��i!\<�	N��N0L���U����8>�f4,���E\x��R:�7Q�H�N�J�i�7��ɪ]z�'O�c�.#lG&.�aſ�/Na��Ц�,ј����Z� �85p�{�y�)�q'\!�r9%k�I��K�0,L��q������[�C�U0Z�L �1	�
�@�(U�k��t ?��xI�1�t���y���M��Z�t��!ڡ��4Q�{H��b�.z���&�l�Fۏ'���?�����xL��OT����!��Dڅ��k��N+�!|jP0��b�.B�%��pI#�!\��d6g�E��IEND�B`�PKL='Z�󐜇�totp/whmcs.jsonnu�[���PKL='Z6\@�c�c
�totp/totp.phpnu�[���PKL='Z�1|//�gtotp/index.phpnu�[���PKL='Zm����
|totp/logo.pngnu�[���PKL='ZiB7�}}6�totp/ga4php.phpnu�[���PKL='Z��v�1�1�}totp/phpqrcode.phpnu�[���PKL='Z�~Z%	�index.phpnu�[���PKL='ZG�4WDIDI@�duosecurity/duosecurity.phpnu�[���PKL='Z1o_??�duosecurity/whmcs.jsonnu�[���PKL='Ze�g//Tduosecurity/index.phpnu�[���PKL='Z���>���duosecurity/logo.pngnu�[���PKL='ZB1����)duosecurity/Duo-Web-v2.min.jsnu�[���PKL='Z����@@5yubico/whmcs.jsonnu�[���PKL='Z���L�L�8yubico/lib/Auth/Otp.phpnu�[���PKL='Zp�%�''_�yubico/index.phpnu�[���PKL='Z��u�VGVGƙyubico/yubico.phpnu�[���PKL='Z��h$h$]�yubico/logo.pngnu�[���PKp