dolev31 commited on
Commit
5ee0240
·
1 Parent(s): a75cabf

Embed IBM logo as base64 constant to avoid LFS/Xet issues

Browse files

HF Spaces don't properly pull LFS objects at runtime, and HF now
rejects raw binary pushes (requires Xet). Embedding a compressed
200x200 version (~9KB base64) directly in the code works reliably.

Files changed (1) hide show
  1. app.py +110 -10
app.py CHANGED
@@ -51,17 +51,117 @@ from validation.validate import (
51
  logger = logging.getLogger(__name__)
52
 
53
  # ---------------------------------------------------------------------------
54
- # Embed IBM logo as base64 data URI (avoids static file serving issues)
55
  # ---------------------------------------------------------------------------
56
- _IBM_LOGO_PATH = Path(__file__).resolve().parent / "assets" / "ibm_logo.png"
57
- _IBM_LOGO_B64 = ""
58
- if _IBM_LOGO_PATH.exists():
59
- _IBM_LOGO_B64 = (
60
- "data:image/png;base64,"
61
- + base64.b64encode(_IBM_LOGO_PATH.read_bytes()).decode()
62
- )
63
- else:
64
- logger.warning("IBM logo not found at %s", _IBM_LOGO_PATH)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
 
67
  def _get_admin_password() -> str:
 
51
  logger = logging.getLogger(__name__)
52
 
53
  # ---------------------------------------------------------------------------
54
+ # IBM logo embedded as base64 data URI (avoids LFS/Xet issues on HF Spaces)
55
  # ---------------------------------------------------------------------------
56
+ _IBM_LOGO_B64 = (
57
+ "data:image/png;base64,"
58
+ "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAaQ0lEQVR42u2de4xc93Xfv+f87p07"
59
+ "++CSy10+Vk9KoiybSiTDrGqkjrExHCRC0shxITmy3aBAoUh/GDYSNElRNLAl1AmQtNYfSlqUToDE"
60
+ "jhE7ZBwjkJs4VSSbUhu9QhVVbJpWyZBLUtxdLrXc9zzu73dO/7j3ztyZnSGXkihr5fMBBnN3587v"
61
+ "Nff3OOd3zvkBhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEY"
62
+ "hmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEY"
63
+ "hmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmEYhmGYH0u2bEJQXq1a"
64
+ "yMvSLcrj9Vy5/GXaDPKGylhcvkZ55S3Io5vpXxuBfwh5Xo38xbqccSW4/GXYDPIG3y/eTJqqd4QW"
65
+ "q7/XVFV5FKFQ1YCAduhwQpxrAQ00W42ShqLBoCqqqoiIOacGQhwrAU00m+WfU2qHi+8rfTbPJGmg"
66
+ "3P0Ygn8I0rtISFQalJhPNhnkKqVQjIgo/z+1/t+8z69PFSokCgq1HplGqfoU8MIYVJ+FID5Pw3v9"
67
+ "t9b3igYkgmj/8VK85/4IqWjWf3rstewzAM1ms+Wy5xQhBLe6unpqenp6rSivaDcAd3d4c1rS+F7z"
68
+ "8K0dHqDWBhwgkkajUcqP/b5X7J2N8kfkJYMQdQ3aCoB7DNXV7JcsU14FYKpf2Qp5N0nyVpD9B2Lq"
69
+ "0Z7dfxd1e/Y3PQMidA8IJVdEe3l7MfPnsjbJTuW+cRw4x8H7Pg+l5NRHR0feQkTXA/hKnnc/gX27"
70
+ "gQ3L3EPeXhwzFBBUBZ2BZwDMl/LKnvvhU5v69P7rAEhC8BcB8hDJ23N1YG6S5K2gLo0YAFj7fD8I"
71
+ "NATA0MDA/5R6/d8XHWW9ynXZT/cYq4t3qdQdqCVJkvkQwjcoBO/zeimHOiggoLyOiOi73d4HYAqA"
72
+ "I6L/BuC7l2oHYhr0QQPAFH75IHB/ERyo6BtEsOMN7VwqgSZJcjEE/xwAxwACwIkPIYBCICAAkIQQ"
73
+ "oChTu1Ysf6PZuYNIhJkHCHgRyDqy/SWIyuefb8dM7RuZrHuprLuP0xwECR5S1bOqGquqqOrjAOYu"
74
+ "VQ+tra4N0/r3VyLYjCL3fIm4p/3yEUPWACRqvS9Icj8ABRUZt68JoVU9hRJJiIimVlZWvrj+fQ8g"
75
+ "kWazOZd/x7bEemdJrpYMMre0tHRaVdMgmqoqFfdNiasU/4nzA1+kHPTaXwDI05QWCq8D4E1A4GJs"
76
+ "ZdWqxK5Sq/39ysrKb5e7yT333OM2WzjqK9WhqT7/oD8FiGhEBNdz6D5Vu+tZRETGHIuaS0T0h6ur"
77
+ "q0/12cPpHk8q9X3aKILU6/XPNDL3FkK00LVPS3nFIgFBSCH5NjD/XlUhUfx/Go3G74lI6pzb1a2v"
78
+ "iAjOOSFi1BSYJ0Ek2X2T88Z+VBBEdEBE1h3E24qHqMoAJK7Xb0nTtMJMnomBdh+GfA3pqeMuCr2M"
79
+ "6b2P1c+n28q2e2d9V/J8O51oHmJW/h8XAuL8/6CqieCLmO+DIMrxRKWO2iJImmZJxF/SdpAJ0+58"
80
+ "Pp2O27dvT5ZXl78KwVB+D3dHWRWRiJlfu+OOO146fPhwP7MMBYCIIjh3NIQmlZaXQrIwgxDgAYKX"
81
+ "EBqilCfIhFBfYSalEMBBmgsXtVWUPa9m+Y2gCNiLkJA60Tx8Q1WBmnV5/7Rk7gMiR2b8Vu4UOXYz"
82
+ "L6vVLLFWRUJvGrTRaD6RpOkfp2nqnXOb+xxfZG2kA1EUfVtBDc7+Z0Q0IiIC53ARhIAKQdFaQEVE"
83
+ "bQxAKU+AKoqQ/Jef1Kl05EXrWv+EkN2JWl3h8f5/Z9ld0cVcVUn4K1C1T4bE3YHlhJnKc1pVrBLw"
84
+ "p4T0uxr0OwmFv0+S5MutE1Wu3P0NuKKJdp5e6pMHAXDb8PbhjSGEQeecQzmNHuRLTYQVw+Xkzv+4"
85
+ "m8vJnQ8oVNZWVj4LoMKFRLlMqvrsWq3xWcC1ZZHLl8UjX7DKfaGJt+gsX5B2bOi+00tqpxACdUYN"
86
+ "1lZD3YRKwkxPMjCnnVq8SUSfSJLkNzboJ73uH1E5o0ulBZTfpYc6r3NLHP1R2FqfqGsjHeSKJNp5"
87
+ "ennHJ3oZhglpaGu/L2FI5SKgDf8bPZqp/LdN3v9y+X/P/bLI2C1XfafjvPP0ICHCddgOtcwfxj7y"
88
+ "t8D+XufT/dYXCHhdm8qlyrjxdu4/pjbRDLKZZBD7IJp/4LdVBdQdDbNjLe90bCDN/9s2zCZ+2Kn/"
89
+ "tLHK3XZJm2A2e7OeQpek5X2LIE3RklZNO9JMdL2wY6OOFELoxp27flJpg+3Y2tbYRjLM5d7r21Le"
90
+ "TjJIR3+kPvqLdGv7+x8n9+/fv3VxcfFaZm6NdJVKBc1mMxvGcssiiiqqIuVrTKpCxXX7J8vn3DpC"
91
+ "G0Wyb4cC2oWACMCJqkZjY2NfIKLlK9SiMQBJHMf/ICKndC0kP1w7H5h4AHhtM3WQTSOkE1EqJRGx"
92
+ "uJb8WkQgKiifnf+5+srqB0qjynoSJHWOD4nIv6VKMrC2tqaqqvfdd5/bt29fvJH6f+CBB2Kappml"
93
+ "TZZm54u3KxlHNNJJLEXZEYBnkzTV3CqXNQviSl1/bHBwkIA5rO+d5qz2TJ5ht/xQNqvkZZ8Oocn"
94
+ "q8Aie9h57ICF4H8IbJ1L7J6J2eXv4ehIRBomAEKBFvk4BuNJt+8fWbXPfI+7N38N7Pgil5NRlCOp"
95
+ "bMqJjbGxsR/TRuOTIrqDiDJbIaUiPLDkoVSqX9JsyvcAyBZEKYDjLgo9EXGnA3KP96gBuHwdkUQ7"
96
+ "h8iF0HJqJaIXhCh84L3P22xZhbddblkLkVw04cXrP1Dne2FKO/8ygP/8Z94n4kXqp64wCCmXKfee"
97
+ "uvJuInb5e5VESmb6iqBVz0hV0Y7SrkfDXCiX6zL18svLyxIJSehO9w69xFb3ypE5B4ASWoZ/Ib9h"
98
+ "KJuqL4hcnT1XcVxlgLoLKP7/7MKFgy67fpkljn6tT5f7mPmtNk0Dk02OUK/VJprNpkvTcN7H9GkV"
99
+ "XWTmMSmO5eyud3udPBEEnfYqQd7nPHc/nZub+kJmRJAnJJh/d5fZrtyVW6Zhma9LsXt1x4MtRgq6"
100
+ "/+H64GUC/PBJVVe9BCbFo3yWmjRD0oSA8r0R4S1U/RUQ1AFKqWm2qntO1tOEj9lGC5WOB8k0fqcp"
101
+ "Svk+X1RHE+/cLCwtflcpWuq9UhyJaX+ywU9rU0I0MNpF/fWPW8qmyAe+c2eo/c5GNfFbm2Wfxth8"
102
+ "EUrT+aUBN8UvVhavB1UVdMStl3M/3q+c7dtc9Smv+0L/+nUaK4y/j7Ll/8/P0qbMZZpCN00HK8eU"
103
+ "A+FepUCeSuaXzQ3dH2KQ9g9GCx2H4c5t8v3fH+n6UEkuubPt5e+k2FU0gxbahB6a5RIulJ1uStIz"
104
+ "iWA04JN+XSPnr19h8t8+ynVr/9PXi9Z9J2e3d0z+h6LjO8tP9MF8wTDnP5ek/Z+P1zUwkAKGfFY"
105
+ "/VRWu1Y3Ys3OB/vVv63X7qYO/s2vhS1/6l+vxG2ew3KuGv2Y0CWqp2D9lGfZU2yV9v3O+Nt1c7S"
106
+ "D/SkT8Nx0LyZjBe5Rv3iu5e2rT/Sp76Ouf5LJPuyZLb0c4XjdhEZd3p+pfWfxe8t40Q53oK2vGVi"
107
+ "7MZMQ3tlYi/tUH66NanXG50NR23c3d/RtAPHlRVSHiLDdWGz2GWRbwN8pBBKwafbDIB5USHZ3MfO0"
108
+ "E/fCRjJI0U+9ZpjO+8u/t/9eakfSzMCK3d1y4Ntyk8p8/6E7Cz7z3KpptlQ+kKTJR8v3beSuvOq5"
109
+ "1n4c8d3BtT3POqyj3u6IbuWuO0pdEW7bvZjyv29E7r7XSpuqr1xWpz9vk8mSj9H6JqCOfysd0t2D"
110
+ "Sxnu5fqxVB5WlH4ue5fcz9Z/v/X5NxXfOqoZ+i2RuqJfQP1f3d68mz5V+gZOdU8LXZeSKe2DzK0P"
111
+ "SqHhL6I5n2EPqA3iq/f8WqXc7Sd8LIBs+sUYGBg4I8cuXYb8caWtYt6HB4c/NNXXnnlsU984hNx"
112
+ "13drAJIkSf6YiF50jtvLpyBbsiHKJuK0PfWnknuziKgWFhYAIMqV/c3eX+u4j4NpS7s2yzn5NkDr"
113
+ "q7Iq7YPXiEW7AguU1F/lZwGiKI5PNJvNnYB0b0AhIqTtnYJAliapykJORIQg+lyu7OCSPnTSVoqa"
114
+ "yf1K3r5B9OjRtcuQW3opFnV+ew8CuBLlp3UBq9rmvN1Ps3cXN/7UUa/uPEn1qjUmWmUTyGhWlz/"
115
+ "24VvYWHuV3p/30YZkfeUoKDC+2aj7lPcJ5yvRwXq98Tt/9qUv/bffvX//MID8/MqI5uoIKh2mYz+6"
116
+ "q2OV2ooC10f27NQe4n/SjBrqxgAgU4RAGkWRxH3W0evWx1lPVdq5zl6S9JGq4cPvZf3OcKmpJHl5s"
117
+ "LGKx8bGbm00Gh8EEOxV4gCBkLedeiSiagxxJTo2Ojr6t0tLS5vR5F5pVyqV/0NE7wdoWZWqWlqR9Q"
118
+ "48Kau7JL/GRKiqZaOOsqlFqKrGzByx+97y4vJvEzLbqI3f7i0C8GOGKqikWoWWTQ7Ks2+ehNE+g1L"
119
+ "xTyJpTdQKQWJ19PcLC4tfz6Y9eTDjEsS7ILcQz1UUqkJAe0FKJ6JHVcVXq9UXNwowPTk5GWUjrE"
120
+ "tJMulNqYw9upiV24WQhhBqRaAiJoqjkL6LiIKqUtGbSvsNdGRgYOt/WlpauVIuFfuELX/B/8RdfMZ"
121
+ "qm24Mok46I8u0w3i8qHcdK8Dj7u/eesSxoW5vFRFbXarUjJfUYldsxuxYStX1V27W29vl9pXpRO/f"
122
+ "MiVqHhJA+M4gAicDMKgYGBv4oS1/oMPftmC0B4FKqfj/JsgEyb1cmLg78VNGAkpNlIvUe2j3K9h4"
123
+ "d3d/rBLbe+qFiX2FfLJMJt+zcyEaFqfxZAJeT+5U+KqRfHZRPqOmYYIqy+NCrULbnXxcxl5Qcz3K"
124
+ "tW4U5FNdSz+M+wB8mopPkAIi2j0VWFfpzLfRrr2rrTk/1q4dym7Z3bFSKPMrqMy3P7u/Xr9YRLpb"
125
+ "MKhv3RLkMlZTpbPTxsbGbltdXf1Kj1l9CATW7b/5twP+a7VdF+kLyJUddrfVJkKLMZtqo5bTPNJU"
126
+ "/T2i+5eKxfFT5v1qr/bcz7b6E8pPPXvWJ62b9ovydOTcejITYXFl5b1LVu1U0ZqYKmxC/N+99de/"
127
+ "7mE98fCMkKdRh4IUVyZzQ9WJ2/s1Q3RxmUDVY+3aQK/ot0Xq8UWNfyLRm3d//D3vx+LZ93bIjq1k"
128
+ "7qYJVhCkSPWH5i6XhXwsT1pczUPYOavcfKb3+6TFqh19P+s/XfSv/R+f7e8VEpH5UeLYvbrR14Ow"
129
+ "9nHe9XuLyedJR3c8j/EBCOi+jPlxQXv6P27G5p/7r/mwbJz0EXTrVkc6V5SH3pfLkc/I7L4f2/Hd"
130
+ "uEd3Y2k+3j2pnlInbnDNVnq5e3l6e3TfbpCNvqI5Nqgb7cCIPqNqe5e5UGk9r9h7e68P/Rjy/p+m"
131
+ "I/gp35aetW/QLxDq8O9f1TS4mxaYQSFvR3rbte2sD23lj2K8bYG/3J9fzHY6MaL3JxLdj2ORFRId"
132
+ "+yiUPHuB0ARESvXW7+MO3B7g59FUA6QIVcQilIti7gIohzEWFmFoByO2rNZmtXuQyxTUqxsv0p0B"
133
+ "9AdB+BoB5k+T0AIPQPiOBRVQWRN3K/Vm75hqaA+HJ0Wy+6H5tWGa/bD/rdq5dwGmgPn8Cs3aewh+"
134
+ "eU6KmqPk5AqhqK0OhBLscaKIo0TbtjpOOtlGH2DDcYxjDWcZBnFHmQgW5+0P0PYcUHumH0P4fwG5"
135
+ "qmz+C6SsJV+SkfWn8OgX+VJHhVCAKqJBfKEr0PkYApBE0Aba2dGXPxf8/ISLZJQPlddT22d4X9Kh"
136
+ "aB2yTPKekI4DY4r7cGXb+eTHbQqXkd5xbkPWV1WkHDXUeGYl7fS4EWvYqNzrNM9UqWvJ/e8mN6QL"
137
+ "h5VVXWBJ7cF0ZW5wn2hj9f3+2FnHel+XqXJNBuQlqquYAB5v0m2t34sFkexI16gPtU2n+uyIjv83r"
138
+ "NX/9Z97QflNHAZhmsxeIUglDRYwIX21fy7hhGEaBRjxjHecNbblhvJuZm5uro6l6fXGXSpnM7w+qo"
139
+ "PcCwqfUZPgPjfYGJig0gB5iyVpTVy+WxgWjQJhbO3u5aGUiSKoVJJavV6Kxf2l2ppjJH2u3P3Lnua"
140
+ "IqLZBp0+JsBT/TRzGyyI95oE8hWBUTvC78K5YwyKb5T9dF3XvevEiekTHxeVTAjXTkgn2o5XFZFNN"
141
+ "NvLqkfZCiUV4yVNU2Zmr0X9OoKT5e2z3jfqZYwxm0W4UwVAhCw49crMzMx8P+LLvn37hmulYWlDS0"
142
+ "X5RBQRMgc2QsgdQrKZJvUIMFKqhxCKPHnIuZvzdCxHNvLXlb3oOxWLnBdV9dkwgwRVVRFJmPlYHMe"
143
+ "/FUKQOOaXz58/326r8v+bxeLdK7x6F5bLmrfp7Ozs0f/y3/7bp/TH3M7EMAzT6kCX0XEiIhIRi2vJ"
144
+ "r0UEokIWdCu+VB8p94B67X5RVfI0m5+WZn3qO2RJCWKL9VGiHjJI2ftFB9E9mVKbGQCk2WieaRBj+"
145
+ "bN/X0xC2YTSAzAsoh/SbIlaL2clSfJoZqzBRDERP09pJ8j6IcBLSeH1HwTn/hMAf9Pu3EiS5FER8Q"
146
+ "ATM+e+i92BQxARZ3rGTkYvaNQ2u7fv+ocrUGLWzxhGkP8Q0H9txyJ2pG0aklXxGd/OoMYzLgbwA0g"
147
+ "L0D37Q7g6hN0MhflRtTAzT6ihPcl8RkY+CEO2z8d8P5ZXKADIwMPBHTLSxP/wbM1bX7sN1iBWq6q"
148
+ "zp4I9v08wjvdoRGtJF7x0TkT/yrZdjQI8dO8avHR3dRcLjYeOBbJmmNM8i/4NVcVPQ5h+paocUVd"
149
+ "f2ddfZ3VvFOJ+P6I3+77Lel0H0OEGK/FWJkNdr6qZpLtWZ5eXl37+C/YBaWRcBFGVeP0dVG6W0Af"
150
+ "A3BmR2bWnaxuLi4vey36n0jkdF5Laqci1UlUAk+b8Bgqv0/2fvXeIo9gLgtkTyxywq5wxUJlKkWZ"
151
+ "Ak+oSIUESwFNMbKo5VVsn/N45U9dyVklFYJELeTi5Y2s+7rkn+hxDgBDAToq9eomx5gg/9k/OXRr"
152
+ "VYn0bq/edVNGLmxBxXY8p/f5LNIKoeAJTjSpLcwcyhO0Y9w/jRjcXs3BNEdD0Rtee9UrKVnZRVRX"
153
+ "F7z3m50K2QBjudrjcI7BaW2gEpYyg0zNTy98f7+AO9elY7t27gn/sYx+L+xmsHzx4MI5jgzwYt2T"
154
+ "bkkxORUQaQhAf1IsIO/bKvn3bv3T48OHG5VpSHjhwIE6SmIrn66q8AKkjk4OIfC3tTe2yGQE4BaC6"
155
+ "c+fONS7bJRQy4CUAk5vtCLZNI6QLSRpCUBER74P4EMSHoN77EMR7CSEE8UGKCN8ShJAnEIQQ8r8FI"
156
+ "QRRUWntd1SQJMnswsLCV5kZ4+PjtzYajQ8CSMKB8t5Np0DkxGmPtpGACH0Q3nOHT+1haqpW6ZHPV"
157
+ "+tLdakqx0QkUaUvq+ppVSXnHJzjOFE5OTAw8MT58+dbZcxms4m8jkQkJiKhqtnLqfNpOgWAF5h7u/"
158
+ "x5EsVfAlAU4Hie6OzsbFZfOjk5OblLREbzurR0HWKZ5/Fmry7bduSr7bRZaZYj+/k2N6b5Xnk+lV"
159
+ "qt9t+XlpY2zPPAgQPxU089ZQB8QlUzfzkpOYN2Hk2nVRoXrYN/kC2V0Z0P59x92dElIkx5xKf2SUj"
160
+ "EGqbprGezWDgzZKOqdvgqM3MbkOy8wd5bqDlJfKiW+AcKVSCKE2ZeOnbs2HLx/OTk5Aa0KJtiA0JR"
161
+ "d+y4ZW/dI5lHoOxvJJ7LiYjoZQA/cqOcYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiG"
162
+ "YRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYRiGYZi3C/8fAJ9vj0gs"
163
+ "k4cAAAAASUVORK5CYII="
164
+ )
165
 
166
 
167
  def _get_admin_password() -> str: