[6] | 1 | """Graphical user interface system. |
---|
| 2 | |
---|
| 3 | Widgets properties are classified as mutable or static. |
---|
| 4 | Mutable properties have a clear separation between model and view. |
---|
| 5 | |
---|
| 6 | @author Michael Reimpell |
---|
| 7 | """ |
---|
| 8 | # Copyright (C) 2005 Michael Reimpell |
---|
| 9 | # |
---|
| 10 | # This library is free software; you can redistribute it and/or |
---|
| 11 | # modify it under the terms of the GNU Lesser General Public |
---|
| 12 | # License as published by the Free Software Foundation; either |
---|
| 13 | # version 2.1 of the License, or (at your option) any later version. |
---|
| 14 | # |
---|
| 15 | # This library is distributed in the hope that it will be useful, |
---|
| 16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
| 18 | # Lesser General Public License for more details. |
---|
| 19 | # |
---|
| 20 | # You should have received a copy of the GNU Lesser General Public |
---|
| 21 | # License along with this library; if not, write to the Free Software |
---|
| 22 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
---|
| 23 | |
---|
| 24 | # epydoc doc format |
---|
| 25 | __docformat__ = "javadoc en" |
---|
| 26 | |
---|
| 27 | import os |
---|
| 28 | import Blender |
---|
| 29 | from Blender import Draw |
---|
| 30 | from Blender.BGL import * |
---|
| 31 | |
---|
| 32 | import base |
---|
| 33 | from base import * |
---|
| 34 | |
---|
| 35 | class Action: |
---|
| 36 | """Action interface. |
---|
| 37 | |
---|
| 38 | Actions encapsulate user requests. |
---|
| 39 | """ |
---|
| 40 | def __init__(self): |
---|
| 41 | """Constructor. |
---|
| 42 | """ |
---|
| 43 | return |
---|
| 44 | def execute(self): |
---|
| 45 | """Executes the action. |
---|
| 46 | """ |
---|
| 47 | return |
---|
| 48 | |
---|
| 49 | class QuitAction(Action): |
---|
| 50 | """Quits the windowing system. |
---|
| 51 | """ |
---|
| 52 | def execute(self): |
---|
| 53 | Blender.Draw.Exit() |
---|
| 54 | return |
---|
| 55 | |
---|
| 56 | class Size: |
---|
| 57 | """Size hints. |
---|
| 58 | |
---|
| 59 | @cvar INFINITY Infinity value for size hints. |
---|
| 60 | """ |
---|
| 61 | INFINITY = 2147483647 |
---|
| 62 | def __init__(self, preferredSize=None, minimumSize=None, maximumSize=None): |
---|
| 63 | """Constructor. |
---|
| 64 | |
---|
| 65 | A size hint is a list of integers <code>[width, height]</code>. |
---|
| 66 | |
---|
| 67 | @param preferredSize Default <code>[0,0]</code>. |
---|
| 68 | @param minimumSize Default <code>[0,0]</code>. |
---|
| 69 | @param maximumSize Default <code>[Size.INFINITY, Size.INFINITY]</code>. |
---|
| 70 | """ |
---|
| 71 | self.preferredSize = preferredSize or [0, 0] |
---|
| 72 | if minimumSize: |
---|
| 73 | self.minimumSize = minimumSize |
---|
| 74 | elif ((self.preferredSize[0] < Size.INFINITY) and (self.preferredSize[1] < Size.INFINITY)): |
---|
| 75 | self.minimumSize = self.preferredSize[:] |
---|
| 76 | else: |
---|
| 77 | self.minimumSize = [0, 0] |
---|
| 78 | if preferredSize: |
---|
| 79 | self.maximumSize = maximumSize or self.preferredSize[:] |
---|
| 80 | else: |
---|
| 81 | self.maximumSize = maximumSize or [Size.INFINITY, Size.INFINITY] |
---|
| 82 | return |
---|
| 83 | def getPreferredSize(self): |
---|
| 84 | return self.preferredSize |
---|
| 85 | def getMinimumSize(self): |
---|
| 86 | return self.minimumSize |
---|
| 87 | def getMaximumSize(self): |
---|
| 88 | return self.maximumSize |
---|
| 89 | |
---|
| 90 | class Widget: |
---|
| 91 | """Widget interface. |
---|
| 92 | """ |
---|
| 93 | def __init__(self, parent, size = Size()): |
---|
| 94 | """Constructor. |
---|
| 95 | |
---|
| 96 | Overwrite the constructor to get event numbers for all used |
---|
| 97 | actions via a call to <code>parent._addButtonAction()</code>. |
---|
| 98 | |
---|
| 99 | @param name The widget name must be unique. |
---|
| 100 | @param size Size hints. |
---|
| 101 | """ |
---|
| 102 | self.parent = parent |
---|
| 103 | self.size = size |
---|
| 104 | self.parent._addWidget(self) |
---|
| 105 | return |
---|
| 106 | def draw(self, screenRectangle): |
---|
| 107 | """Draws the widget into an area of the screen. |
---|
| 108 | |
---|
| 109 | @param screenRectangle Area of the screen to draw into. |
---|
| 110 | The screenRectangle is a list of the integers |
---|
| 111 | <code>[xl, yl, xu, yu]</code>, where (xl,yl) is |
---|
| 112 | the lower left corner of the area and (xu, yu) is |
---|
| 113 | the upper right corner of the area. |
---|
| 114 | """ |
---|
| 115 | return |
---|
| 116 | def eventFilter(self, event, value): |
---|
| 117 | """Called from event callback function. |
---|
| 118 | |
---|
| 119 | @see Blender.Draw.Register |
---|
| 120 | """ |
---|
| 121 | return |
---|
| 122 | def getSize(self): |
---|
| 123 | """Size hints of the widget. |
---|
| 124 | |
---|
| 125 | @return Size object. |
---|
| 126 | """ |
---|
| 127 | return self.size |
---|
| 128 | def resize(self, size=None): |
---|
| 129 | """Resizes the widget. |
---|
| 130 | |
---|
| 131 | @param size New widget size or <code>None</code> to |
---|
| 132 | inform about resize of child widgets. |
---|
| 133 | """ |
---|
| 134 | if size: |
---|
| 135 | self.size = size |
---|
| 136 | self.parent.resize() |
---|
| 137 | return |
---|
| 138 | def removeFromParent(self): |
---|
| 139 | """Remove this widget from parent widget. |
---|
| 140 | |
---|
| 141 | Remove a widget from its parent before deleting it. Overwrite |
---|
| 142 | this to also remove all button actions separately with a call |
---|
| 143 | to <code>self.parent._removeButtonAction()</code>. This is not |
---|
| 144 | done in the destructor as Python's garbage collector does not |
---|
| 145 | guarantee to delete objects. |
---|
| 146 | """ |
---|
| 147 | self.parent._removeWidget(self) |
---|
| 148 | return |
---|
| 149 | def _addWidget(self, widget): |
---|
| 150 | """Adds a child widget. |
---|
| 151 | |
---|
| 152 | @param widget Child widget to add. |
---|
| 153 | """ |
---|
| 154 | raise NotImplementedError |
---|
| 155 | return |
---|
| 156 | def _removeWidget(self, widget): |
---|
| 157 | """Removes a child widget. |
---|
| 158 | |
---|
| 159 | @param widget Child widget to remove. |
---|
| 160 | """ |
---|
| 161 | raise NotImplementedError |
---|
| 162 | return |
---|
| 163 | def _addButtonAction(self, action): |
---|
| 164 | """Registers an action for a button event. |
---|
| 165 | |
---|
| 166 | @param action Action to execute on receive of the returned button event number. |
---|
| 167 | @return eventNumber Event number to use for the button that corresponds to that action. |
---|
| 168 | """ |
---|
| 169 | return self.parent._addButtonAction(action) |
---|
| 170 | def _removeButtonAction(self, eventNumber): |
---|
| 171 | """Action for the given event number will no longer be called. |
---|
| 172 | |
---|
| 173 | @param eventNumber Event number for the action. |
---|
| 174 | """ |
---|
| 175 | self.parent._removeButtonAction(eventNumber) |
---|
| 176 | return |
---|
| 177 | |
---|
| 178 | class Spacer(Widget): |
---|
| 179 | """Occupies blank space on the screen. |
---|
| 180 | """ |
---|
| 181 | def __init__(self, parent, size): |
---|
| 182 | Widget.__init__(self, parent, size) |
---|
| 183 | return |
---|
| 184 | |
---|
| 185 | class Decorator(Widget): |
---|
| 186 | """Decorates a child widget. |
---|
| 187 | |
---|
| 188 | A decorator does not have a name on its own. It adopts the name |
---|
| 189 | of its child widget. |
---|
| 190 | """ |
---|
| 191 | def __init__(self, parent): |
---|
| 192 | self.childWidget = None |
---|
| 193 | Widget.__init__(self, parent) |
---|
| 194 | return |
---|
| 195 | def draw(self, screenRectangle): |
---|
| 196 | self.childWidget.draw(screenRectangle) |
---|
| 197 | return |
---|
| 198 | def eventFilter(self, event, value): |
---|
| 199 | self.childWidget.eventFilter(event, value) |
---|
| 200 | return |
---|
| 201 | def getSize(self): |
---|
| 202 | if self.childWidget: |
---|
| 203 | size = self.childWidget.getSize() |
---|
| 204 | else: |
---|
| 205 | # no child widget yet |
---|
| 206 | size = Size() |
---|
| 207 | return size |
---|
| 208 | def resize(self, size=None): |
---|
| 209 | if size: |
---|
| 210 | # pass resize request to the child |
---|
| 211 | self.childWidget.resize(size) |
---|
| 212 | else: |
---|
| 213 | # pass child resize notification to the parent |
---|
| 214 | self.parent.resize() |
---|
| 215 | return |
---|
| 216 | def _addWidget(self, widget): |
---|
| 217 | self.childWidget = widget |
---|
| 218 | self.parent.resize() |
---|
| 219 | return |
---|
| 220 | |
---|
| 221 | class Activator(Decorator): |
---|
| 222 | """Enables and disables child widget. |
---|
| 223 | """ |
---|
| 224 | def __init__(self, parent, enabled=1): |
---|
| 225 | Decorator.__init__(self, parent) |
---|
| 226 | self.enabled = enabled |
---|
| 227 | def eventFilter(self, event, value): |
---|
| 228 | if self.enabled: |
---|
| 229 | self.childWidget.eventFilter(event, value) |
---|
| 230 | return |
---|
| 231 | def draw(self, screenRectangle): |
---|
| 232 | if self.enabled: |
---|
| 233 | self.childWidget.draw(screenRectangle) |
---|
| 234 | return |
---|
| 235 | def setEnabled(self, enabled): |
---|
| 236 | self.enabled = enabled |
---|
| 237 | return |
---|
| 238 | def isEnabled(self): |
---|
| 239 | return self.enabled |
---|
| 240 | |
---|
| 241 | class ValueModel(Model): |
---|
| 242 | """Model with a value of arbitrary type. |
---|
| 243 | """ |
---|
| 244 | def __init__(self, value): |
---|
| 245 | Model.__init__(self) |
---|
| 246 | self.value = None |
---|
| 247 | self.setValue(value) |
---|
| 248 | return |
---|
| 249 | def setValue(self, value): |
---|
| 250 | self.value = value |
---|
| 251 | self._notify() |
---|
| 252 | return |
---|
| 253 | def getValue(self): |
---|
| 254 | return self.value |
---|
| 255 | |
---|
| 256 | class T(ValueModel): |
---|
| 257 | """Short name for ValueModel. |
---|
| 258 | |
---|
| 259 | @see ValueModel |
---|
| 260 | """ |
---|
| 261 | |
---|
| 262 | class BoundedValueModel(ValueModel): |
---|
| 263 | def __init__(self, minimum=0, maximum=0, initial=0): |
---|
| 264 | self.minimum = minimum |
---|
| 265 | self.maximum = maximum |
---|
| 266 | ValueModel.__init__(self, initial) |
---|
| 267 | return |
---|
| 268 | def getMinimum(self): |
---|
| 269 | return self.minimum |
---|
| 270 | def getMaximum(self): |
---|
| 271 | return self.maximum |
---|
| 272 | def setValue(self, value): |
---|
| 273 | if (value != self.value): |
---|
| 274 | if value < self.minimum: |
---|
| 275 | self.value = self.minimum |
---|
| 276 | elif value > self.maximum: |
---|
| 277 | self.value = self.maximum |
---|
| 278 | else: |
---|
| 279 | self.value = value |
---|
| 280 | self._notify() |
---|
| 281 | return |
---|
| 282 | |
---|
| 283 | class BoundedRangeModel(BoundedValueModel): |
---|
| 284 | """Model for a bounded range. |
---|
| 285 | |
---|
| 286 | minimum <= value <= value + extend <= maximum |
---|
| 287 | """ |
---|
| 288 | def __init__(self, minimum=0, initial=0, extend=0, maximum=0): |
---|
| 289 | self.extend = 0 |
---|
| 290 | BoundedValueModel.__init__(self, minimum, maximum, initial) |
---|
| 291 | self.setExtend(extend) |
---|
| 292 | return |
---|
| 293 | def setMaximum(self, maximum, silent=0): |
---|
| 294 | if (maximum != self.maximum): |
---|
| 295 | self.maximum = maximum |
---|
| 296 | if self.value > self.maximum: |
---|
| 297 | self.value = self.maximum |
---|
| 298 | if ((self.value + self.extend) > self.maximum): |
---|
| 299 | self.extend = self.maximum - self.value |
---|
| 300 | if not silent: |
---|
| 301 | self._notify() |
---|
| 302 | return |
---|
| 303 | def setValue(self, value, silent=0): |
---|
| 304 | if (value != self.value): |
---|
| 305 | if value < self.minimum: |
---|
| 306 | self.value = self.minimum |
---|
| 307 | elif value > self.maximum: |
---|
| 308 | self.value = self.maximum |
---|
| 309 | else: |
---|
| 310 | self.value = value |
---|
| 311 | if ((self.value + self.extend) > self.maximum): |
---|
| 312 | # minimum <= value <= maximum |
---|
| 313 | # ==> maximum - value >= 0 |
---|
| 314 | self.extend = self.maximum - self.value |
---|
| 315 | if not silent: |
---|
| 316 | self._notify() |
---|
| 317 | return |
---|
| 318 | def getExtend(self): |
---|
| 319 | return self.extend |
---|
| 320 | def setExtend(self, extend, silent=0): |
---|
| 321 | """ |
---|
| 322 | @param extend positive integer. |
---|
| 323 | """ |
---|
| 324 | if (extend != self.extend): |
---|
| 325 | if ((self.value + extend) > self.maximum): |
---|
| 326 | self.extend = self.maximum - self.value |
---|
| 327 | else: |
---|
| 328 | self.extend = extend |
---|
| 329 | if not silent: |
---|
| 330 | self._notify() |
---|
| 331 | return |
---|
| 332 | |
---|
| 333 | class BasenameModel(ValueModel): |
---|
| 334 | """Ensure string is a valid file name. |
---|
| 335 | """ |
---|
| 336 | def __init__(self, basename): |
---|
| 337 | ValueModel.__init__(self, self._ensureIsBasename(basename)) |
---|
| 338 | return |
---|
| 339 | def setValue(self, basename): |
---|
| 340 | ValueModel.setValue(self, self._ensureIsBasename(basename)) |
---|
| 341 | return |
---|
| 342 | def _ensureIsBasename(self, basename): |
---|
| 343 | return os.path.basename(basename) |
---|
| 344 | |
---|
| 345 | class DirnameModel(ValueModel): |
---|
| 346 | """Ensure string is a valid directory name. |
---|
| 347 | """ |
---|
| 348 | def __init__(self, dirname): |
---|
| 349 | ValueModel.__init__(self, self._ensureIsDirname(dirname)) |
---|
| 350 | return |
---|
| 351 | def setValue(self, dirname): |
---|
| 352 | ValueModel.setValue(self, self._ensureIsDirname(dirname)) |
---|
| 353 | return |
---|
| 354 | def _ensureIsDirname(self, dirname): |
---|
| 355 | if os.path.isdir(dirname) and os.path.exists(dirname): |
---|
| 356 | # remove possible trailing seperators |
---|
| 357 | name = os.path.dirname(dirname + os.sep) |
---|
| 358 | else: |
---|
| 359 | name = os.path.dirname(dirname) |
---|
| 360 | return name |
---|
| 361 | |
---|
| 362 | class RedrawView(View): |
---|
| 363 | def __init__(self, model): |
---|
| 364 | View.__init__(self, model) |
---|
| 365 | return |
---|
| 366 | def update(self): |
---|
| 367 | Blender.Draw.Redraw(1) |
---|
| 368 | return |
---|
| 369 | |
---|
| 370 | class ActionWidget(Widget): |
---|
| 371 | """Widget with single action and tooltip. |
---|
| 372 | """ |
---|
| 373 | def __init__(self, parent, size=Size(), action=Action(), tooltip=None): |
---|
| 374 | """Constructor. |
---|
| 375 | |
---|
| 376 | @param tooltip Optional widget tooltip string ValueModel. |
---|
| 377 | """ |
---|
| 378 | Widget.__init__(self, parent, size) |
---|
| 379 | self.event = self.parent._addButtonAction(action) |
---|
| 380 | self.tooltip = tooltip |
---|
| 381 | if tooltip: |
---|
| 382 | RedrawView(self.tooltip) |
---|
| 383 | return |
---|
| 384 | def removeFromParent(self): |
---|
| 385 | self.parent._removeButtonAction(self.event) |
---|
| 386 | Widget.removeFromParent(self) |
---|
| 387 | return |
---|
| 388 | |
---|
| 389 | class ActionTitleWidget(ActionWidget): |
---|
| 390 | """Widget with single action, title and tooltip. |
---|
| 391 | """ |
---|
| 392 | def __init__(self, parent, size=Size(), action=Action(), title=ValueModel(''), tooltip=None): |
---|
| 393 | """Constructor. |
---|
| 394 | |
---|
| 395 | @param title Widget title string ValueModel. |
---|
| 396 | @param tooltip Optional widget tooltip string ValueModel. |
---|
| 397 | """ |
---|
| 398 | ActionWidget.__init__(self, parent, size, action, tooltip) |
---|
| 399 | self.title = title |
---|
| 400 | RedrawView(self.title) |
---|
| 401 | return |
---|
| 402 | |
---|
| 403 | class Button(ActionTitleWidget): |
---|
| 404 | """Push button. |
---|
| 405 | """ |
---|
| 406 | def __init__(self, parent, size, action, title, tooltip=None): |
---|
| 407 | """Constructor. |
---|
| 408 | |
---|
| 409 | @param action Action to execute when the button is pushed. |
---|
| 410 | """ |
---|
| 411 | ActionTitleWidget.__init__(self, parent, size, action, title, tooltip) |
---|
| 412 | return |
---|
| 413 | def draw(self, rect): |
---|
| 414 | if self.tooltip: |
---|
| 415 | Blender.Draw.PushButton(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.tooltip.getValue()) |
---|
| 416 | else: |
---|
| 417 | Blender.Draw.PushButton(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1) |
---|
| 418 | return |
---|
| 419 | |
---|
| 420 | class ActionView(View): |
---|
| 421 | """View with single model and action. |
---|
| 422 | """ |
---|
| 423 | def __init__(self, model): |
---|
| 424 | View.__init__(self, model) |
---|
| 425 | self.valueButton = Blender.Draw.Create(self.model.getValue()) |
---|
| 426 | return |
---|
| 427 | def update(self): |
---|
| 428 | Blender.Draw.Redraw(1) |
---|
| 429 | return |
---|
| 430 | class ViewAction(Action): |
---|
| 431 | def __init__(self, view): |
---|
| 432 | self.view = view |
---|
| 433 | return |
---|
| 434 | def execute(self): |
---|
| 435 | self.view.model.setValue(self.view.valueButton.val) |
---|
| 436 | return |
---|
| 437 | |
---|
| 438 | class StringView(ActionTitleWidget, ActionView): |
---|
| 439 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
| 440 | """Constructor. |
---|
| 441 | |
---|
| 442 | @param model String ValueModel. |
---|
| 443 | """ |
---|
| 444 | ActionView.__init__(self, model) |
---|
| 445 | ActionTitleWidget.__init__(self, parent, size, StringView.ViewAction(self), title, tooltip) |
---|
| 446 | return |
---|
| 447 | def draw(self, rect): |
---|
| 448 | if self.tooltip: |
---|
| 449 | self.valueButton = Blender.Draw.String(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue(), 255, self.tooltip.getValue()) |
---|
| 450 | else: |
---|
| 451 | self.valueButton = Blender.Draw.String(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue(), 255) |
---|
| 452 | return |
---|
| 453 | |
---|
| 454 | class ToggleModel(ValueModel): |
---|
| 455 | """Interface and default implementation for a toggle model. |
---|
| 456 | |
---|
| 457 | The toggle value can be <code>True</code> or <code>False</code>. |
---|
| 458 | """ |
---|
| 459 | def toggle(self): |
---|
| 460 | if self.getValue(): |
---|
| 461 | self.setValue(False) |
---|
| 462 | else: |
---|
| 463 | self.setValue(True) |
---|
| 464 | return |
---|
| 465 | |
---|
| 466 | class ToggleGroup(ValueModel): |
---|
| 467 | """An exclusive toggle group. |
---|
| 468 | |
---|
| 469 | Only one toggle is selected at a time. Returns current active |
---|
| 470 | ToggleModel as value. |
---|
| 471 | """ |
---|
| 472 | def __init__(self): |
---|
| 473 | # key: ToggleModel, value: ToggleGroup.Toggle |
---|
| 474 | self.toggleDict = {} |
---|
| 475 | ValueModel.__init__(self, None) |
---|
| 476 | return |
---|
| 477 | def addToggle(self, model): |
---|
| 478 | """Adds a toggle to the toggle group. |
---|
| 479 | |
---|
| 480 | @param model ToggleModel. |
---|
| 481 | """ |
---|
| 482 | self.toggleDict[model] = ToggleGroup.Toggle(self, model) |
---|
| 483 | if (len(self.toggleDict) == 1): |
---|
| 484 | # always one toggle selected |
---|
| 485 | self.value = model |
---|
| 486 | model.setValue(True) |
---|
| 487 | self._notify() |
---|
| 488 | elif model.getValue(): |
---|
| 489 | # enable toggle |
---|
| 490 | self._toggle(model) |
---|
| 491 | return |
---|
| 492 | def removeToggle(self, model): |
---|
| 493 | """Removes a toggle from the toggle group. |
---|
| 494 | |
---|
| 495 | If the removed toggle was the current active, |
---|
| 496 | select the first toggle instead. |
---|
| 497 | |
---|
| 498 | @param model ToggleModel. |
---|
| 499 | """ |
---|
| 500 | if model in self.toggleDict.keys(): |
---|
| 501 | # remove toggle from group |
---|
| 502 | self.toggleDict[model].detachModel() |
---|
| 503 | del self.toggleDict[model] |
---|
| 504 | # update current selected |
---|
| 505 | if (model == self.getValue()): |
---|
| 506 | if (len(self.toggleDict) > 0): |
---|
| 507 | self.toggleDict.keys()[0].toggle() |
---|
| 508 | else: |
---|
| 509 | self.value = None |
---|
| 510 | self._notify() |
---|
| 511 | else: |
---|
| 512 | raise KeyError |
---|
| 513 | return |
---|
| 514 | def setValue(self, value): |
---|
| 515 | """Sets a toggle to <code>True</code>. |
---|
| 516 | |
---|
| 517 | @param value Key of ToggleModel. |
---|
| 518 | """ |
---|
| 519 | # set value as current active |
---|
| 520 | if (value in self.toggleDict.keys()): |
---|
| 521 | self.value = value |
---|
| 522 | self._notify() |
---|
| 523 | elif value is None: |
---|
| 524 | pass |
---|
| 525 | else: |
---|
| 526 | raise KeyError |
---|
| 527 | return |
---|
| 528 | def _toggle(self, model): |
---|
| 529 | # if self.toggleDict.has_key(model): |
---|
| 530 | if model.getValue(): |
---|
| 531 | ## selected |
---|
| 532 | if (self.value != model): |
---|
| 533 | # deselect old |
---|
| 534 | oldKey = self.value |
---|
| 535 | self.setValue(model) |
---|
| 536 | if self.toggleDict.has_key(oldKey): |
---|
| 537 | oldKey.setValue(False) |
---|
| 538 | elif (model == self.value): |
---|
| 539 | ## current selected deselected |
---|
| 540 | # select again, as always one toggle is selected |
---|
| 541 | model.setValue(True) |
---|
| 542 | return |
---|
| 543 | class Toggle(View): |
---|
| 544 | def __init__(self, group, model): |
---|
| 545 | View.__init__(self, model) |
---|
| 546 | self.group = group |
---|
| 547 | return |
---|
| 548 | def update(self): |
---|
| 549 | self.group._toggle(self.model) |
---|
| 550 | return |
---|
| 551 | |
---|
| 552 | class ToggleView(ActionTitleWidget, ActionView): |
---|
| 553 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
| 554 | """Constructor. |
---|
| 555 | @param model ToggleModel. |
---|
| 556 | """ |
---|
| 557 | View.__init__(self, model) |
---|
| 558 | ActionTitleWidget.__init__(self, parent, size, ToggleView.ViewAction(self), title, tooltip) |
---|
| 559 | def draw(self, rect): |
---|
| 560 | if self.tooltip: |
---|
| 561 | Blender.Draw.Toggle(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue(), self.tooltip.getValue()) |
---|
| 562 | else: |
---|
| 563 | Blender.Draw.Toggle(self.title.getValue(), self.event, rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.model.getValue()) |
---|
| 564 | return |
---|
| 565 | class ViewAction(Action): |
---|
| 566 | def __init__(self, view): |
---|
| 567 | self.view = view |
---|
| 568 | return |
---|
| 569 | def execute(self): |
---|
| 570 | self.view.model.toggle() |
---|
| 571 | return |
---|
| 572 | |
---|
| 573 | class ScrollbarBase(Widget, RedrawView): |
---|
| 574 | """Scrollbar base class. |
---|
| 575 | |
---|
| 576 | This class contains code common to VerticalScrollbar and HorizontalScrollbar. |
---|
| 577 | Don't use this class directly, use VerticalScrollbar or HorizontalScrollbar instead. |
---|
| 578 | """ |
---|
| 579 | def __init__(self, parent, size, model): |
---|
| 580 | """Constructor. |
---|
| 581 | |
---|
| 582 | @param size If l is the desired length of the smaller side, set the larger side to at least 2*l+5. |
---|
| 583 | @param model BoundedRangeModel |
---|
| 584 | """ |
---|
| 585 | Widget.__init__(self, parent, size) |
---|
| 586 | RedrawView.__init__(self, model) |
---|
| 587 | # translate MOUSEX and MOUSEY coordinates into local ones |
---|
| 588 | self.barRect = [0,0,0,0] |
---|
| 589 | self.markerRect = [0,0,0,0] |
---|
| 590 | self.mousePressed = 0 |
---|
| 591 | self.mouseFocusX = 0 |
---|
| 592 | self.mouseFocusY = 0 |
---|
| 593 | self.markerFocus = 0 |
---|
| 594 | self.mousePosition = 0 |
---|
| 595 | return |
---|
| 596 | def _inc(self, amount=1): |
---|
| 597 | """limit maximum value to value + extend <= maximum |
---|
| 598 | """ |
---|
| 599 | value = self.model.getValue() |
---|
| 600 | value += amount |
---|
| 601 | if ((value + self.model.getExtend()) <= self.model.getMaximum()): |
---|
| 602 | self.model.setValue(value) |
---|
| 603 | else: |
---|
| 604 | # set to maximum value |
---|
| 605 | self.model.setValue(self.model.getMaximum() - self.model.getExtend()) |
---|
| 606 | return |
---|
| 607 | def _dec(self, amount=1): |
---|
| 608 | value = self.model.getValue() |
---|
| 609 | value -= amount |
---|
| 610 | if (self.model.getMinimum() <= value): |
---|
| 611 | self.model.setValue(value) |
---|
| 612 | else: |
---|
| 613 | # set to minimum value |
---|
| 614 | self.model.setValue(self.model.getMinimum()) |
---|
| 615 | return |
---|
| 616 | def _addWidget(self, widget): |
---|
| 617 | return |
---|
| 618 | class IncAction(Action): |
---|
| 619 | def __init__(self, scrollbar): |
---|
| 620 | self.scrollbar = scrollbar |
---|
| 621 | return |
---|
| 622 | def execute(self): |
---|
| 623 | self.scrollbar._inc() |
---|
| 624 | return |
---|
| 625 | class DecAction(Action): |
---|
| 626 | def __init__(self, scrollbar): |
---|
| 627 | self.scrollbar = scrollbar |
---|
| 628 | return |
---|
| 629 | def execute(self): |
---|
| 630 | self.scrollbar._dec() |
---|
| 631 | return |
---|
| 632 | |
---|
| 633 | class VerticalScrollbar(ScrollbarBase): |
---|
| 634 | """Vertical scrollbar. |
---|
| 635 | """ |
---|
| 636 | def __init__(self, parent, size, model): |
---|
| 637 | ScrollbarBase.__init__(self, parent, size, model) |
---|
| 638 | self.incButton = Button(self, Size(), ScrollbarBase.IncAction(self), ValueModel("\\/"), ValueModel("Scroll down")) |
---|
| 639 | self.decButton = Button(self, Size(), ScrollbarBase.DecAction(self), ValueModel("/\\"), ValueModel("Scroll up")) |
---|
| 640 | return |
---|
| 641 | def draw(self, rect): |
---|
| 642 | # buttons |
---|
| 643 | buttonSize = rect[2] - rect[0] |
---|
| 644 | # \/ |
---|
| 645 | self.incButton.draw([rect[0], rect[1], rect[2], rect[1] + buttonSize]) |
---|
| 646 | # /\ |
---|
| 647 | self.decButton.draw([rect[0], rect[3]-buttonSize, rect[2], rect[3]]) |
---|
| 648 | # bar |
---|
| 649 | # marker and bar are > 3x3 pix each as they have 1 pix border |
---|
| 650 | self.barRect = [rect[0], rect[1] + buttonSize, rect[2], rect[3] - buttonSize] |
---|
| 651 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
| 652 | Blender.BGL.glRectf(self.barRect[0], self.barRect[1], self.barRect[2], self.barRect[3]) |
---|
| 653 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
| 654 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1], self.barRect[2], self.barRect[3] - 1) |
---|
| 655 | Blender.BGL.glColor3f(0.48,0.48,0.48) # grey |
---|
| 656 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1] + 1, self.barRect[2] - 1, self.barRect[3] - 1) |
---|
| 657 | # marker |
---|
| 658 | # calculate marker size |
---|
| 659 | range = self.model.getMaximum() - self.model.getMinimum() |
---|
| 660 | if range: |
---|
| 661 | step = float(self.barRect[3] - self.barRect[1] - 2)/range |
---|
| 662 | # relative positions |
---|
| 663 | markerStart = step*(self.model.getValue() - self.model.getMinimum()) |
---|
| 664 | markerEnd = markerStart + step*self.model.getExtend() |
---|
| 665 | else: |
---|
| 666 | # relative positions |
---|
| 667 | markerStart = 0.0 |
---|
| 668 | markerEnd = self.barRect[3] - self.barRect[1] - 2 |
---|
| 669 | if ((markerEnd - markerStart) < 3): |
---|
| 670 | # minimal marker size |
---|
| 671 | markerEnd = markerStart + 3 |
---|
| 672 | self.markerRect = [self.barRect[0] + 1, \ |
---|
| 673 | self.barRect[3] - 1 - markerEnd, \ |
---|
| 674 | self.barRect[2] - 1, \ |
---|
| 675 | self.barRect[3] - 1 - markerStart] |
---|
| 676 | # draw maker |
---|
| 677 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
| 678 | Blender.BGL.glRectf(self.markerRect[0], self.markerRect[1], self.markerRect[2], self.markerRect[3]) |
---|
| 679 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
| 680 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1], self.markerRect[2], self.markerRect[3] - 1) |
---|
| 681 | # check if marker has foucs |
---|
| 682 | if (self.mouseFocusX and self.mouseFocusY and (self.mousePosition > self.markerRect[1]) and (self.mousePosition < self.markerRect[3])): |
---|
| 683 | Blender.BGL.glColor3f(0.64,0.64,0.64) # marker focus grey |
---|
| 684 | else: |
---|
| 685 | Blender.BGL.glColor3f(0.60,0.60,0.60) # marker grey |
---|
| 686 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1] + 1, self.markerRect[2] - 1, self.markerRect[3] - 1) |
---|
| 687 | return |
---|
| 688 | def eventFilter(self, event, value): |
---|
| 689 | if (value != 0): |
---|
| 690 | # Mouse |
---|
| 691 | if (event == Blender.Draw.MOUSEX): |
---|
| 692 | mousePositionX = value - ScreenManager.getSingleton().getScissorRectangle()[0] |
---|
| 693 | # check if mouse is inside bar |
---|
| 694 | if ((mousePositionX >= self.barRect[0]) and (mousePositionX <= self.barRect[2])): |
---|
| 695 | # redraw if marker got focus |
---|
| 696 | if (not self.mouseFocusX) and self.mouseFocusY: |
---|
| 697 | Blender.Draw.Redraw(1) |
---|
| 698 | self.mouseFocusX = 1 |
---|
| 699 | else: |
---|
| 700 | # redraw if marker lost focus |
---|
| 701 | if self.mouseFocusX and self.mouseFocusY: |
---|
| 702 | Blender.Draw.Redraw(1) |
---|
| 703 | self.mouseFocusX = 0 |
---|
| 704 | elif (event == Blender.Draw.MOUSEY): |
---|
| 705 | # relative mouse position |
---|
| 706 | self.mousePosition = value - ScreenManager.getSingleton().getScissorRectangle()[1] |
---|
| 707 | # check if mouse is inside bar |
---|
| 708 | if ((self.mousePosition >= self.barRect[1]) and (self.mousePosition <= self.barRect[3])): |
---|
| 709 | self.mouseFocusY = 1 |
---|
| 710 | if ((self.mousePosition > self.markerRect[1]) and (self.mousePosition < self.markerRect[3])): |
---|
| 711 | # redraw if marker got focus |
---|
| 712 | if self.mouseFocusX and (not self.markerFocus): |
---|
| 713 | Blender.Draw.Redraw(1) |
---|
| 714 | self.markerFocus = 1 |
---|
| 715 | else: |
---|
| 716 | # redraw if marker lost focus |
---|
| 717 | if self.mouseFocusX and self.markerFocus: |
---|
| 718 | Blender.Draw.Redraw(1) |
---|
| 719 | self.markerFocus = 0 |
---|
| 720 | # move marker |
---|
| 721 | if (self.mousePressed == 1): |
---|
| 722 | # calculate step from distance to marker |
---|
| 723 | if (self.mousePosition > self.markerRect[3]): |
---|
| 724 | self._dec(1) |
---|
| 725 | Blender.Draw.Draw() |
---|
| 726 | elif (self.mousePosition < self.markerRect[1]): |
---|
| 727 | self._inc(1) |
---|
| 728 | Blender.Draw.Draw() |
---|
| 729 | else: |
---|
| 730 | # redraw if marker lost focus |
---|
| 731 | if self.mouseFocusX and self.markerFocus: |
---|
| 732 | Blender.Draw.Redraw(1) |
---|
| 733 | self.markerFocus = 0 |
---|
| 734 | self.mouseFocusY = 0 |
---|
| 735 | self.mousePressed = 0 |
---|
| 736 | elif ((event == Blender.Draw.LEFTMOUSE) and (self.mouseFocusX == 1) and (self.mouseFocusY == 1)): |
---|
| 737 | self.mousePressed = 1 |
---|
| 738 | # move marker |
---|
| 739 | if (self.mousePosition > self.markerRect[3]): |
---|
| 740 | self._dec(1) |
---|
| 741 | elif (self.mousePosition < self.markerRect[1]): |
---|
| 742 | self._inc(1) |
---|
| 743 | elif (event == Blender.Draw.WHEELUPMOUSE): |
---|
| 744 | if self.mouseFocusX and self.mouseFocusY: |
---|
| 745 | self._dec(1) |
---|
| 746 | elif (event == Blender.Draw.WHEELDOWNMOUSE): |
---|
| 747 | if self.mouseFocusX and self.mouseFocusY: |
---|
| 748 | self._inc(1) |
---|
| 749 | else: # released keys and buttons |
---|
| 750 | if (event == Blender.Draw.LEFTMOUSE): |
---|
| 751 | self.mousePressed = 0 |
---|
| 752 | return |
---|
| 753 | |
---|
| 754 | class HorizontalScrollbar(ScrollbarBase): |
---|
| 755 | """Horizontal scrollbar. |
---|
| 756 | """ |
---|
| 757 | def __init__(self, parent, size, model): |
---|
| 758 | ScrollbarBase.__init__(self, parent, size, model) |
---|
| 759 | self.incButton = Button(self, Size(), ScrollbarBase.IncAction(self), ValueModel(">"), ValueModel("Scroll right")) |
---|
| 760 | self.decButton = Button(self, Size(), ScrollbarBase.DecAction(self), ValueModel("<"), ValueModel("Scroll left")) |
---|
| 761 | return |
---|
| 762 | def draw(self, rect): |
---|
| 763 | # buttons |
---|
| 764 | buttonSize = rect[3] - rect[1] |
---|
| 765 | # < |
---|
| 766 | self.decButton.draw([rect[0], rect[1], rect[0] + buttonSize, rect[3]]) |
---|
| 767 | # > |
---|
| 768 | self.incButton.draw([rect[2] - buttonSize, rect[1], rect[2], rect[3]]) |
---|
| 769 | # bar |
---|
| 770 | # marker and bar are > 3x3 pix each as they have 1 pix border |
---|
| 771 | #TODO: Missed by one |
---|
| 772 | self.barRect = [rect[0] + buttonSize, rect[1] - 1, rect[2] - buttonSize, rect[3] - 1] |
---|
| 773 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
| 774 | Blender.BGL.glRectf(self.barRect[0], self.barRect[1], self.barRect[2], self.barRect[3]) |
---|
| 775 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
| 776 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1], self.barRect[2], self.barRect[3] - 1) |
---|
| 777 | Blender.BGL.glColor3f(0.48,0.48,0.48) # grey |
---|
| 778 | Blender.BGL.glRectf(self.barRect[0] + 1, self.barRect[1] + 1, self.barRect[2] - 1, self.barRect[3] - 1) |
---|
| 779 | # marker |
---|
| 780 | # calculate marker size |
---|
| 781 | range = self.model.getMaximum() - self.model.getMinimum() |
---|
| 782 | if range: |
---|
| 783 | step = float(self.barRect[2] - self.barRect[0] - 2)/range |
---|
| 784 | # relative positions |
---|
| 785 | markerStart = step*(self.model.getValue() - self.model.getMinimum()) |
---|
| 786 | markerEnd = markerStart + step*self.model.getExtend() |
---|
| 787 | else: |
---|
| 788 | # relative positions |
---|
| 789 | markerStart = 0.0 |
---|
| 790 | markerEnd = self.barRect[2] - self.barRect[0] - 2 |
---|
| 791 | if ((markerEnd - markerStart) < 3): |
---|
| 792 | # minimal marker size |
---|
| 793 | markerEnd = markerStart + 3 |
---|
| 794 | self.markerRect = [self.barRect[0] + 1 + markerStart, \ |
---|
| 795 | self.barRect[1] + 1, \ |
---|
| 796 | self.barRect[0] + markerEnd, \ |
---|
| 797 | self.barRect[3] - 1] |
---|
| 798 | # draw maker |
---|
| 799 | Blender.BGL.glColor3f(0.78,0.78,0.78) # light grey |
---|
| 800 | Blender.BGL.glRectf(self.markerRect[0], self.markerRect[1], self.markerRect[2], self.markerRect[3]) |
---|
| 801 | Blender.BGL.glColor3f(0.13,0.13,0.13) # dark grey |
---|
| 802 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1], self.markerRect[2], self.markerRect[3] - 1) |
---|
| 803 | # check if marker has foucs |
---|
| 804 | if (self.mouseFocusX and self.mouseFocusY and (self.mousePosition > self.markerRect[0]) and (self.mousePosition < self.markerRect[2])): |
---|
| 805 | Blender.BGL.glColor3f(0.64,0.64,0.64) # marker focus grey |
---|
| 806 | else: |
---|
| 807 | Blender.BGL.glColor3f(0.60,0.60,0.60) # marker grey |
---|
| 808 | Blender.BGL.glRectf(self.markerRect[0] + 1, self.markerRect[1] + 1, self.markerRect[2] - 1, self.markerRect[3] - 1) |
---|
| 809 | return |
---|
| 810 | def eventFilter(self, event, value): |
---|
| 811 | if (value != 0): |
---|
| 812 | # Mouse |
---|
| 813 | if (event == Blender.Draw.MOUSEY): |
---|
| 814 | mousePositionY = value - ScreenManager.getSingleton().getScissorRectangle()[1] |
---|
| 815 | # check if mouse is inside bar |
---|
| 816 | if ((mousePositionY >= self.barRect[1]) and (mousePositionY <= self.barRect[3])): |
---|
| 817 | # redraw if marker got focus |
---|
| 818 | if (not self.mouseFocusY) and self.mouseFocusX: |
---|
| 819 | Blender.Draw.Redraw(1) |
---|
| 820 | self.mouseFocusY = 1 |
---|
| 821 | else: |
---|
| 822 | # redraw if marker lost focus |
---|
| 823 | if self.mouseFocusX and self.mouseFocusY: |
---|
| 824 | Blender.Draw.Redraw(1) |
---|
| 825 | self.mouseFocusY = 0 |
---|
| 826 | elif (event == Blender.Draw.MOUSEX): |
---|
| 827 | # relative mouse position |
---|
| 828 | self.mousePosition = value - ScreenManager.getSingleton().getScissorRectangle()[0] |
---|
| 829 | # check if mouse is inside bar |
---|
| 830 | if ((self.mousePosition >= self.barRect[0]) and (self.mousePosition <= self.barRect[2])): |
---|
| 831 | self.mouseFocusX = 1 |
---|
| 832 | if ((self.mousePosition > self.markerRect[0]) and (self.mousePosition < self.markerRect[2])): |
---|
| 833 | # redraw if marker got focus |
---|
| 834 | if (not self.markerFocus) and self.mouseFocusY: |
---|
| 835 | Blender.Draw.Redraw(1) |
---|
| 836 | self.markerFocus = 1 |
---|
| 837 | else: |
---|
| 838 | # redraw if marker lost focus |
---|
| 839 | if self.mouseFocusX and self.markerFocus: |
---|
| 840 | Blender.Draw.Redraw(1) |
---|
| 841 | self.markerFocus = 0 |
---|
| 842 | # move marker |
---|
| 843 | if (self.mousePressed == 1): |
---|
| 844 | # calculate step from distance to marker |
---|
| 845 | if (self.mousePosition > self.markerRect[2]): |
---|
| 846 | self._inc(1) |
---|
| 847 | Blender.Draw.Draw() |
---|
| 848 | elif (self.mousePosition < self.markerRect[0]): |
---|
| 849 | self._dec(1) |
---|
| 850 | Blender.Draw.Draw() |
---|
| 851 | else: |
---|
| 852 | # redraw if marker lost focus |
---|
| 853 | if self.mouseFocusX and self.markerFocus: |
---|
| 854 | Blender.Draw.Redraw(1) |
---|
| 855 | self.markerFocus = 0 |
---|
| 856 | self.mouseFocusX = 0 |
---|
| 857 | self.mousePressed = 0 |
---|
| 858 | elif ((event == Blender.Draw.LEFTMOUSE) and (self.mouseFocusX == 1) and (self.mouseFocusY == 1)): |
---|
| 859 | self.mousePressed = 1 |
---|
| 860 | # move marker |
---|
| 861 | if (self.mousePosition > self.markerRect[2]): |
---|
| 862 | self._inc(1) |
---|
| 863 | elif (self.mousePosition < self.markerRect[0]): |
---|
| 864 | self._dec(1) |
---|
| 865 | elif (event == Blender.Draw.WHEELUPMOUSE): |
---|
| 866 | if self.mouseFocusX and self.mouseFocusY: |
---|
| 867 | self._dec(1) |
---|
| 868 | elif (event == Blender.Draw.WHEELDOWNMOUSE): |
---|
| 869 | if self.mouseFocusX and self.mouseFocusY: |
---|
| 870 | self._inc(1) |
---|
| 871 | else: # released keys and buttons |
---|
| 872 | if (event == Blender.Draw.LEFTMOUSE): |
---|
| 873 | self.mousePressed = 0 |
---|
| 874 | return |
---|
| 875 | |
---|
| 876 | class NumberView(ActionTitleWidget, ActionView): |
---|
| 877 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
| 878 | """Constructor. |
---|
| 879 | |
---|
| 880 | @param model BoundedValueModel. |
---|
| 881 | """ |
---|
| 882 | ActionView.__init__(self, model) |
---|
| 883 | ActionTitleWidget.__init__(self, parent, size, StringView.ViewAction(self), title, tooltip) |
---|
| 884 | return |
---|
| 885 | def draw(self, rect): |
---|
| 886 | if self.tooltip: |
---|
| 887 | self.valueButton = Blender.Draw.Number(self.title.getValue(), self.event, \ |
---|
| 888 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
| 889 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum(), self.tooltip.getValue()) |
---|
| 890 | else: |
---|
| 891 | self.valueButton = Blender.Draw.Number(self.title.getValue(), self.event, \ |
---|
| 892 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
| 893 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum()) |
---|
| 894 | return |
---|
| 895 | |
---|
| 896 | class SliderView(ActionTitleWidget, ActionView): |
---|
| 897 | def __init__(self, parent, size, model, title=ValueModel(''), tooltip=None): |
---|
| 898 | """Constructor. |
---|
| 899 | |
---|
| 900 | @param model BoundedValueModel. |
---|
| 901 | """ |
---|
| 902 | ActionView.__init__(self, model) |
---|
| 903 | ActionTitleWidget.__init__(self, parent, size, StringView.ViewAction(self), title, tooltip) |
---|
| 904 | return |
---|
| 905 | def draw(self, rect): |
---|
| 906 | if self.tooltip: |
---|
| 907 | self.valueButton = Blender.Draw.Slider(self.title.getValue(), self.event, \ |
---|
| 908 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
| 909 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum(), 1, self.tooltip.getValue()) |
---|
| 910 | else: |
---|
| 911 | self.valueButton = Blender.Draw.Slider(self.title.getValue(), self.event, \ |
---|
| 912 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, \ |
---|
| 913 | self.model.getValue(), self.model.getMinimum(), self.model.getMaximum(), 1) |
---|
| 914 | return |
---|
| 915 | |
---|
| 916 | class MenuItem(ValueModel): |
---|
| 917 | def __init__(self, text, action=Action()): |
---|
| 918 | """Constructor. |
---|
| 919 | |
---|
| 920 | @param text Item string. |
---|
| 921 | @param action Action to execute on selection. |
---|
| 922 | """ |
---|
| 923 | ValueModel.__init__(self, text) |
---|
| 924 | self.action = action |
---|
| 925 | return |
---|
| 926 | def select(self): |
---|
| 927 | self.action.execute() |
---|
| 928 | return |
---|
| 929 | |
---|
| 930 | class MenuTitle(MenuItem): |
---|
| 931 | def __init__(self, text): |
---|
| 932 | MenuItem.__init__(self, text + " %t") |
---|
| 933 | return |
---|
| 934 | def setValue(self, value): |
---|
| 935 | MenuItem.setValue(self, value + " %t") |
---|
| 936 | return |
---|
| 937 | |
---|
| 938 | class MenuSeparator(MenuItem): |
---|
| 939 | def __init__(self): |
---|
| 940 | MenuItem.__init__(self, " %l") |
---|
| 941 | return |
---|
| 942 | def setValue(self, value): |
---|
| 943 | raise NotImplementedError |
---|
| 944 | return |
---|
| 945 | |
---|
| 946 | class Menu(ActionWidget): |
---|
| 947 | """Blender menu button. |
---|
| 948 | """ |
---|
| 949 | def __init__(self, parent, size, tooltip=None): |
---|
| 950 | """Constructor. |
---|
| 951 | |
---|
| 952 | @param title Optional title ValueModel. |
---|
| 953 | """ |
---|
| 954 | ActionWidget.__init__(self, parent, size, Menu.SelectAction(self), tooltip) |
---|
| 955 | # cached menu string |
---|
| 956 | self.menuString = '' |
---|
| 957 | # current selected item id |
---|
| 958 | self.current = 0 |
---|
| 959 | # id management |
---|
| 960 | # display order of ids in menu |
---|
| 961 | # value: id |
---|
| 962 | self.displayList = [] |
---|
| 963 | # key: id, value: MenuItem |
---|
| 964 | self.itemDict = {} |
---|
| 965 | self.valueButton = Blender.Draw.Create(0) |
---|
| 966 | return |
---|
| 967 | def update(self): |
---|
| 968 | """Update cached menu string. |
---|
| 969 | """ |
---|
| 970 | self.menuString = '' |
---|
| 971 | for itemId in self.displayList: |
---|
| 972 | self.menuString = self.menuString + self.itemDict[itemId].getValue() + " %x" + str(itemId) + "|" |
---|
| 973 | return |
---|
| 974 | def insertItem(self, menuItem, position, setCurrent=False): |
---|
| 975 | """Inserts a menu item into a specific position of the display list. |
---|
| 976 | """ |
---|
| 977 | id = self._getId(menuItem, setCurrent) |
---|
| 978 | self.displayList.insert(position, id) |
---|
| 979 | # recreate menu string |
---|
| 980 | self.update() |
---|
| 981 | return id |
---|
| 982 | def appendItem(self, menuItem, setCurrent=False): |
---|
| 983 | """Appends an item to the menu. |
---|
| 984 | |
---|
| 985 | @param menuItem The MenuItem to add. |
---|
| 986 | @param setCurrent Sets the item to be the current selected. |
---|
| 987 | @return Item identifier. |
---|
| 988 | """ |
---|
| 989 | # get free id |
---|
| 990 | id = self._getId(menuItem, setCurrent) |
---|
| 991 | # append id |
---|
| 992 | self.displayList.append(id) |
---|
| 993 | # create menu string |
---|
| 994 | self.menuString = self.menuString + menuItem.getValue() + " %x" + str(id) + "|" |
---|
| 995 | return id |
---|
| 996 | def removeItem(self, id): |
---|
| 997 | if id in self.displayList: |
---|
| 998 | # remove id |
---|
| 999 | if self.current == id: |
---|
| 1000 | self.current = 0 |
---|
| 1001 | del self.itemDict[id] |
---|
| 1002 | self.displayList.remove(id) |
---|
| 1003 | # recreate menu string |
---|
| 1004 | self.update() |
---|
| 1005 | return |
---|
| 1006 | def removeAll(self): |
---|
| 1007 | """Removes all menu items. |
---|
| 1008 | """ |
---|
| 1009 | self.itemDict = {} |
---|
| 1010 | self.displayList = [] |
---|
| 1011 | self.current = 0 |
---|
| 1012 | self.menuString = '' |
---|
| 1013 | return |
---|
| 1014 | def draw(self, rect): |
---|
| 1015 | if self.tooltip: |
---|
| 1016 | self.valueButton = Blender.Draw.Menu(self.menuString, self.event, \ |
---|
| 1017 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.current, self.tooltip.getValue()) |
---|
| 1018 | else: |
---|
| 1019 | self.valueButton = Blender.Draw.Menu(self.menuString, self.event, \ |
---|
| 1020 | rect[0], rect[1], rect[2]-rect[0]-1, rect[3]-rect[1]-1, self.current.getValue()) |
---|
| 1021 | return |
---|
| 1022 | def _getId(self, menuItem, setCurrent): |
---|
| 1023 | """Creates an id for the menuItem and optinally set it to current menu string. |
---|
| 1024 | """ |
---|
| 1025 | # get a free id (button value) |
---|
| 1026 | if (len(self.itemDict) == len(self.displayList)): |
---|
| 1027 | # Blender's button values start with 1 |
---|
| 1028 | id = len(self.displayList) + 1 |
---|
| 1029 | else: |
---|
| 1030 | # first unused |
---|
| 1031 | id = [(x+1) for x in range(len(self.displayList)) if (x+1) not in self.itemDict.keys()][0] |
---|
| 1032 | # assign menu item to that id |
---|
| 1033 | self.itemDict[id] = menuItem |
---|
| 1034 | # manage current state |
---|
| 1035 | if setCurrent: |
---|
| 1036 | self.current = id |
---|
| 1037 | return id |
---|
| 1038 | class SelectAction(Action): |
---|
| 1039 | def __init__(self, menu): |
---|
| 1040 | self.menu = menu |
---|
| 1041 | return |
---|
| 1042 | def execute(self): |
---|
| 1043 | if self.menu.valueButton.val in self.menu.displayList: |
---|
| 1044 | self.menu.itemDict[self.menu.valueButton.val].select() |
---|
| 1045 | self.menu.current = self.menu.valueButton.val |
---|
| 1046 | return |
---|
| 1047 | |
---|
| 1048 | class Border(Decorator): |
---|
| 1049 | """Fixed border around widgets. |
---|
| 1050 | """ |
---|
| 1051 | def __init__(self, parent, borderSize=10): |
---|
| 1052 | """Constructor. |
---|
| 1053 | |
---|
| 1054 | @param borderSize Size of the border. |
---|
| 1055 | """ |
---|
| 1056 | Decorator.__init__(self, parent) |
---|
| 1057 | self.borderSize = borderSize |
---|
| 1058 | return |
---|
| 1059 | def draw(self, screenRectangle): |
---|
| 1060 | rect = screenRectangle[:] |
---|
| 1061 | rect[0] += self.borderSize |
---|
| 1062 | rect[1] += self.borderSize |
---|
| 1063 | rect[2] -= self.borderSize |
---|
| 1064 | rect[3] -= self.borderSize |
---|
| 1065 | self.childWidget.draw(rect) |
---|
| 1066 | return |
---|
| 1067 | def getSize(self): |
---|
| 1068 | prefSize = self.childWidget.getSize().getPreferredSize()[:] |
---|
| 1069 | prefSize[0] += 2*self.borderSize |
---|
| 1070 | prefSize[1] += 2*self.borderSize |
---|
| 1071 | minSize = self.childWidget.getSize().getMinimumSize()[:] |
---|
| 1072 | minSize[0] += 2*self.borderSize |
---|
| 1073 | minSize[1] += 2*self.borderSize |
---|
| 1074 | maxSize = self.childWidget.getSize().getMaximumSize()[:] |
---|
| 1075 | maxSize[0] += 2*self.borderSize |
---|
| 1076 | maxSize[1] += 2*self.borderSize |
---|
| 1077 | return Size(prefSize, minSize, maxSize) |
---|
| 1078 | |
---|
| 1079 | class LabelModel(Model): |
---|
| 1080 | def __init__(self, text, fontsize='normal', color=None): |
---|
| 1081 | """Constructor. |
---|
| 1082 | |
---|
| 1083 | @param text Text to display. |
---|
| 1084 | @param fontsize 'large', 'normal', 'small' or 'tiny' |
---|
| 1085 | @param color List of font color values. |
---|
| 1086 | """ |
---|
| 1087 | Model.__init__(self) |
---|
| 1088 | self.text = text |
---|
| 1089 | if fontsize in ['large', 'normal', 'small', 'tiny']: |
---|
| 1090 | self.fontsize = fontsize |
---|
| 1091 | else: |
---|
| 1092 | raise ValueError |
---|
| 1093 | self.color = color |
---|
| 1094 | return |
---|
| 1095 | def setText(self, text): |
---|
| 1096 | self.text = text |
---|
| 1097 | self._notify() |
---|
| 1098 | return |
---|
| 1099 | def getText(self): |
---|
| 1100 | return self.text |
---|
| 1101 | def setFontsize(self, fontsize): |
---|
| 1102 | if fontsize in ['large', 'normal', 'small', 'tiny']: |
---|
| 1103 | self.fontsize = fontsize |
---|
| 1104 | self._notify() |
---|
| 1105 | else: |
---|
| 1106 | raise ValueError |
---|
| 1107 | return |
---|
| 1108 | def getFontsize(self): |
---|
| 1109 | return self.fontsize |
---|
| 1110 | def setColor(self, color): |
---|
| 1111 | self.color = color |
---|
| 1112 | self._notify() |
---|
| 1113 | def getColor(self): |
---|
| 1114 | return self.color |
---|
| 1115 | |
---|
| 1116 | class L(LabelModel): |
---|
| 1117 | """Short name for LabelModel. |
---|
| 1118 | |
---|
| 1119 | @see LabelModel |
---|
| 1120 | """ |
---|
| 1121 | |
---|
| 1122 | class LabelView(Widget, View): |
---|
| 1123 | """Displays a text string. |
---|
| 1124 | """ |
---|
| 1125 | _HEIGHTDICT = {'large':14, 'normal':12, 'small':10, 'tiny':8} |
---|
| 1126 | _YSHIFT = {'large':5, 'normal':4, 'small':3, 'tiny':2} |
---|
| 1127 | def __init__(self, parent, model, size=None): |
---|
| 1128 | View.__init__(self, model) |
---|
| 1129 | if not size: |
---|
| 1130 | self.calculateSize = True |
---|
| 1131 | size = self._calculateSize() |
---|
| 1132 | else: |
---|
| 1133 | self.calculateSize = False |
---|
| 1134 | Widget.__init__(self, parent, size) |
---|
| 1135 | return |
---|
| 1136 | def draw(self, screenRectangle): |
---|
| 1137 | range = len(self.model.getText()) |
---|
| 1138 | while ((range > 0) and (Blender.Draw.GetStringWidth(self.model.getText()[:range], self.model.getFontsize()) > (screenRectangle[2] - screenRectangle[0]))): |
---|
| 1139 | range -= 1 |
---|
| 1140 | if self.model.getColor(): |
---|
| 1141 | if (len(self.model.getColor()) == 3): |
---|
| 1142 | glColor3f(*self.model.getColor()) |
---|
| 1143 | else: |
---|
| 1144 | glColor4f(*self.model.getColor()) |
---|
| 1145 | else: |
---|
| 1146 | # theme font color |
---|
| 1147 | theme = Blender.Window.Theme.Get()[0] |
---|
| 1148 | glColor4ub(*theme.get('text').text) |
---|
| 1149 | glRasterPos2i(screenRectangle[0], screenRectangle[1] + LabelView._YSHIFT[self.model.getFontsize()]) |
---|
| 1150 | Blender.Draw.Text(self.model.getText()[:range], self.model.getFontsize()) |
---|
| 1151 | return |
---|
| 1152 | def update(self): |
---|
| 1153 | if self.calculateSize: |
---|
| 1154 | self.size = self._calculateSize() |
---|
| 1155 | Blender.Draw.Redraw(1) |
---|
| 1156 | return |
---|
| 1157 | def _calculateSize(self): |
---|
| 1158 | size = [0, 0] |
---|
| 1159 | size[0] = Blender.Draw.GetStringWidth(self.model.getText(), self.model.getFontsize()) |
---|
| 1160 | size[1] = LabelView._HEIGHTDICT[self.model.getFontsize()] |
---|
| 1161 | return Size(size, size, size) |
---|
| 1162 | |
---|
| 1163 | class Box(Decorator): |
---|
| 1164 | """Provides a border with an optional title for a child widget. |
---|
| 1165 | """ |
---|
| 1166 | def __init__(self, parent, label=None, outerBorder=0, innerBorder=0): |
---|
| 1167 | """Constructor. |
---|
| 1168 | |
---|
| 1169 | @param childWidget Widget to decorate. |
---|
| 1170 | @param label Optional LabelModel as title. |
---|
| 1171 | """ |
---|
| 1172 | # borders |
---|
| 1173 | self.outerBorder = outerBorder |
---|
| 1174 | self.innerBorder = innerBorder |
---|
| 1175 | self.model = label |
---|
| 1176 | self.view = None |
---|
| 1177 | if self.model: |
---|
| 1178 | self.model.addView(self) |
---|
| 1179 | # use view to caculate size only |
---|
| 1180 | self.view = LabelView(Box.NoParent(), self.model) |
---|
| 1181 | Decorator.__init__(self, parent) |
---|
| 1182 | return |
---|
| 1183 | def draw(self, screenRectangle): |
---|
| 1184 | rect = screenRectangle[:] |
---|
| 1185 | rect[0] += self.outerBorder |
---|
| 1186 | rect[1] += self.outerBorder |
---|
| 1187 | rect[2] -= self.outerBorder |
---|
| 1188 | rect[3] -= self.outerBorder |
---|
| 1189 | if self.model: |
---|
| 1190 | # title |
---|
| 1191 | [labelWidth, labelHeight] = self.view.getSize().getMinimumSize() |
---|
| 1192 | self.view.draw([rect[0] + 7, rect[3] - labelHeight, rect[0] + 7 + labelWidth, rect[3]]) |
---|
| 1193 | # border |
---|
| 1194 | glColor3f(0.0, 0.0, 0.0) |
---|
| 1195 | glBegin(GL_LINE_STRIP) |
---|
| 1196 | # 5--6 TITLE 1--2 |
---|
| 1197 | # | | |
---|
| 1198 | # 4----------------3 |
---|
| 1199 | glVertex2i(rect[0] + 9 + labelWidth, rect[3] - int(labelHeight/2.0)) |
---|
| 1200 | glVertex2i(rect[2], rect[3] - int(labelHeight/2.0)) |
---|
| 1201 | glVertex2i(rect[2], rect[1]) |
---|
| 1202 | glVertex2i(rect[0], rect[1]) |
---|
| 1203 | glVertex2i(rect[0], rect[3] - int(labelHeight/2.0)) |
---|
| 1204 | glVertex2i(rect[0] + 3, rect[3] - int(labelHeight/2.0)) |
---|
| 1205 | glEnd() |
---|
| 1206 | rect[0] += 1 |
---|
| 1207 | rect[1] += 1 |
---|
| 1208 | rect[2] -= 1 |
---|
| 1209 | rect[3] -= labelHeight |
---|
| 1210 | else: |
---|
| 1211 | # border only |
---|
| 1212 | glColor3f(0.0, 0.0, 0.0) |
---|
| 1213 | glBegin(GL_LINE_STRIP) |
---|
| 1214 | glVertex2i(rect[0], rect[1]) |
---|
| 1215 | glVertex2i(rect[0], rect[3]) |
---|
| 1216 | glVertex2i(rect[2], rect[3]) |
---|
| 1217 | glVertex2i(rect[2], rect[1]) |
---|
| 1218 | glVertex2i(rect[0], rect[1]) |
---|
| 1219 | glEnd() |
---|
| 1220 | rect[0] += 1 |
---|
| 1221 | rect[1] += 1 |
---|
| 1222 | rect[2] -= 1 |
---|
| 1223 | rect[3] -= 1 |
---|
| 1224 | rect[0] += self.innerBorder |
---|
| 1225 | rect[1] += self.innerBorder |
---|
| 1226 | rect[2] -= self.innerBorder |
---|
| 1227 | rect[3] -= self.innerBorder |
---|
| 1228 | self.childWidget.draw(rect) |
---|
| 1229 | return |
---|
| 1230 | def getSize(self): |
---|
| 1231 | if self.childWidget: |
---|
| 1232 | minSize = self.childWidget.getSize().getMinimumSize()[:] |
---|
| 1233 | prefSize = self.childWidget.getSize().getPreferredSize()[:] |
---|
| 1234 | maxSize = self.childWidget.getSize().getMaximumSize()[:] |
---|
| 1235 | else: |
---|
| 1236 | minSize = [0, 0] |
---|
| 1237 | prefSize = [0, 0] |
---|
| 1238 | maxSize = [0, 0] |
---|
| 1239 | # border |
---|
| 1240 | minSize[0] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
| 1241 | minSize[1] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
| 1242 | prefSize[0] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
| 1243 | prefSize[1] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
| 1244 | maxSize[0] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
| 1245 | maxSize[1] += 2 + 2*self.outerBorder + 2*self.innerBorder |
---|
| 1246 | if self.model: |
---|
| 1247 | titleSize = self.view.getSize() |
---|
| 1248 | # 1+3 +3 +x +3+1 = 11+x |
---|
| 1249 | # +---___TITLE___+ y |
---|
| 1250 | # | | + |
---|
| 1251 | # +--------------+ 1 |
---|
| 1252 | if (minSize[0] < (titleSize.getMinimumSize()[0] + 9)): |
---|
| 1253 | minSize[0] += 9 + titleSize.getMinimumSize()[0] |
---|
| 1254 | prefSize[0] += 9 + titleSize.getPreferredSize()[0] |
---|
| 1255 | maxSize[0] += 9 + titleSize.getMaximumSize()[0] |
---|
| 1256 | minSize[1] += titleSize.getMinimumSize()[1] - 1 |
---|
| 1257 | prefSize[1] += titleSize.getPreferredSize()[1] - 1 |
---|
| 1258 | maxSize[1] += titleSize.getMaximumSize()[1] - 1 |
---|
| 1259 | return Size(prefSize, minSize, maxSize) |
---|
| 1260 | class NoParent(Widget): |
---|
| 1261 | """Widget acts as dummy parent. |
---|
| 1262 | """ |
---|
| 1263 | def __init__(self): |
---|
| 1264 | return |
---|
| 1265 | def resize(self, size=None): |
---|
| 1266 | return |
---|
| 1267 | def _addWidget(self, widget): |
---|
| 1268 | return |
---|
| 1269 | def _removeWidget(self, widget): |
---|
| 1270 | return |
---|
| 1271 | |
---|
| 1272 | class OgreFrame(Decorator): |
---|
| 1273 | """Ogre Logo, Title and border. |
---|
| 1274 | """ |
---|
| 1275 | OGRE_LOGO = Buffer(GL_BYTE, [48,122*4],[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1276 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,1,0,127,0,2,0,127,2,5,2,127,2,5,2,127,4,6,4,127,5,8,5,127,8,11,8,127,8,11,8,127,3,5,3,127,2,3,2,127,0,1,0,127,0,1,0,127,0,1,0,127,0,1,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1277 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,1,2,1,127,4,6,4,127,10,13,10,127,18,22,18,127,23,28,23,127,24,30,24,127,25,31,25,127,25,31,25,127,26,32,26,127,26,32,26,127,26,32,26,127,25,31,25,127,24,30,24,127,18,23,18,127,3,5,3,127,4,6,4,127,8,11,8,127,9,12,9,127,13,17,13,127,17,22,17,127,15,19,15,127,7,9,7,127,1,2,1,127,0,0,0,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1278 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,2,4,2,127,4,6,4,127,18,22,18,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,18,22,18,127,15,19,15,127,20,26,20,127,25,31,25,127,26,32,26,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,26,32,26,127,24,30,24,127,16,20,16,127,4,5,4,127,0,0,0,95,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1279 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,1,1,1,127,13,15,13,127,12,15,12,127,24,29,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,5,3,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1280 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,1,1,1,127,19,24,19,127,11,15,11,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,17,21,17,127,22,28,22,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,5,3,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1281 | [0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,20,24,20,127,16,20,16,127,20,25,20,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,5,3,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1282 | [0,0,0,0,0,0,0,0,0,0,0,64,5,7,5,127,26,32,26,127,15,19,15,127,41,48,41,127,38,45,38,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,3,4,3,127,0,0,0,127,58,66,58,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1283 | [0,0,0,0,0,0,0,0,0,0,0,127,20,24,20,127,27,34,27,127,26,32,26,127,47,55,47,127,47,55,47,127,39,46,39,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,11,16,11,127,0,1,0,127,3,3,3,127,94,106,94,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1284 | [0,0,0,0,0,0,0,0,0,0,0,127,33,39,33,127,45,52,45,127,28,32,28,127,47,55,47,127,44,51,44,127,39,46,39,127,27,33,27,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,21,26,21,127,0,2,0,127,0,0,0,127,23,26,23,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1285 | [0,0,0,0,0,0,0,0,0,0,0,127,24,28,24,127,33,40,33,127,18,22,18,127,29,35,29,127,25,31,25,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,5,8,5,127,1,2,1,127,0,0,0,127,70,79,70,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,94,105,94,127,70,79,70,127,76,86,76,127,90,101,90,127,103,116,103,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1286 | [0,0,0,0,0,0,0,64,0,0,0,127,4,6,4,127,12,16,12,127,22,27,22,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,28,34,28,127,35,42,35,127,28,35,28,127,25,31,25,127,23,29,23,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,17,21,17,127,0,2,0,127,0,0,0,127,31,36,31,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,100,112,100,127,92,103,92,127,103,116,103,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,100,112,100,127,81,92,81,127,68,77,68,127,65,73,65,127,65,73,65,127,76,86,76,127,78,88,78,127,83,94,83,127,92,103,92,127,85,95,85,127,31,35,31,127,6,7,6,127,6,7,6,127,13,14,13,127,13,14,13,127,19,21,19,127,26,29,26,127,26,29,26,127,48,54,48,127,96,108,96,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,70,78,70,127,3,3,3,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,12,13,11,127,23,26,23,127,36,40,36,127,49,55,49,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1287 | [0,0,0,64,0,0,0,127,2,4,2,127,16,20,16,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,26,33,26,127,59,68,59,127,81,91,81,127,87,98,87,127,86,96,86,127,80,90,80,127,71,79,71,127,59,66,59,127,36,41,35,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,31,24,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,5,8,5,127,0,1,0,127,18,20,18,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,91,103,91,127,58,65,58,127,29,33,29,127,6,7,6,127,0,0,0,127,0,0,0,127,1,2,1,127,22,24,22,127,54,61,54,127,94,106,94,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,88,99,88,127,51,58,51,127,18,21,18,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,17,19,17,127,48,54,48,127,80,91,80,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,29,33,29,127,0,0,0,127,41,31,14,127,33,25,11,127,18,14,6,127,2,2,1,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1288 | [0,0,0,127,2,3,2,127,24,29,24,127,26,32,26,127,24,30,24,127,25,31,25,127,24,30,24,127,24,30,24,127,24,30,24,127,23,29,23,127,34,41,34,127,78,88,78,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,87,97,87,127,84,93,84,127,62,69,62,127,34,40,34,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,28,23,127,26,30,26,127,36,38,36,127,47,50,46,127,39,42,37,127,34,40,34,127,30,37,30,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,15,19,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,94,106,94,127,43,48,43,127,4,5,4,127,0,0,0,127,0,0,0,127,0,0,0,127,6,5,2,127,16,12,5,127,2,2,1,127,0,0,0,127,0,0,0,127,7,8,7,127,58,65,58,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,96,108,96,127,41,47,41,127,1,1,1,127,0,0,0,127,0,0,0,127,6,5,2,127,27,21,9,127,42,33,14,127,46,36,16,127,46,36,16,127,33,25,11,127,31,24,11,127,25,19,9,127,16,12,5,127,12,9,4,127,0,0,0,127,107,82,36,127,115,88,38,127,107,82,36,127,107,82,36,127,100,76,33,127,92,71,31,127,88,68,30,127,0,0,0,127,4,3,2,127,0,0,0,127,0,0,0,127,0,0,0,127,13,15,13,127,65,73,65,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,13,14,13,127,0,0,0,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,109,84,36,127,96,73,32,127,80,62,27,127,65,50,22,127,52,40,17,127,37,28,12,127,21,16,7,127,2,2,1,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1289 | [0,0,0,127,9,11,9,127,48,56,48,127,45,53,45,127,41,48,41,127,33,40,33,127,34,41,34,127,37,44,37,127,54,62,54,127,77,87,77,127,87,97,87,127,87,97,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,79,88,79,127,61,69,61,127,25,31,25,127,25,31,25,127,23,28,23,127,19,23,19,127,42,43,41,127,60,60,59,127,61,61,59,127,61,61,59,127,63,63,61,127,35,37,34,127,38,45,38,127,33,39,33,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,15,19,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,81,91,81,127,9,11,9,127,0,0,0,127,2,2,1,127,44,34,15,127,86,66,29,127,115,88,38,127,122,94,41,127,122,94,41,127,121,92,40,127,94,72,31,127,39,30,13,127,0,0,0,127,0,0,0,127,40,45,40,127,101,114,101,127,105,118,105,127,105,118,105,127,105,118,105,127,85,95,85,127,11,13,11,127,0,0,0,127,4,3,2,127,50,38,17,127,94,72,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,92,71,31,127,0,0,0,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,2,2,1,127,105,81,35,127,98,75,33,127,60,46,20,127,23,18,8,127,0,0,0,127,1,1,1,127,90,102,90,127,105,118,105,127,105,118,105,127,105,118,105,127,6,7,6,127,0,0,0,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,8,6,3,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1290 | [0,0,0,127,3,5,3,127,45,53,45,127,46,54,46,127,46,54,46,127,47,55,47,127,46,54,46,127,68,78,68,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,98,87,127,67,76,67,127,38,46,38,127,21,26,21,127,50,52,50,127,60,60,59,127,61,61,59,127,60,60,58,127,60,60,58,127,60,60,58,127,61,61,59,127,39,41,38,127,52,59,52,127,67,76,67,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,15,19,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,59,67,59,127,1,1,1,127,0,0,0,127,35,27,12,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,86,66,29,127,8,6,3,127,0,0,0,127,36,40,36,127,105,118,105,127,105,118,105,127,82,92,82,127,7,7,7,127,0,0,0,127,31,24,10,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,80,62,27,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,82,63,28,127,46,36,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,27,21,9,127,0,0,0,127,78,88,78,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1291 | [0,0,0,127,0,2,0,127,41,49,41,127,46,54,46,127,46,54,46,127,49,56,49,127,77,87,77,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,85,96,85,127,55,64,55,127,44,52,44,127,23,28,23,127,17,22,17,127,90,92,90,127,84,84,82,127,60,60,58,127,60,60,58,127,60,60,58,127,60,60,58,127,61,61,59,127,39,41,38,127,54,62,54,127,62,71,62,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,15,20,15,127,0,1,0,127,0,0,0,127,102,115,102,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,81,90,81,127,1,1,1,127,0,0,0,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,103,79,34,127,12,9,4,127,0,0,0,127,47,52,47,127,93,104,93,127,8,9,8,127,0,0,0,127,52,40,17,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,63,49,21,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,0,0,0,127,9,11,9,127,101,113,101,127,105,118,105,127,105,118,105,127,105,118,105,127,0,0,0,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,69,53,23,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1292 | [0,0,0,127,0,1,0,127,37,44,37,127,46,54,46,127,49,57,49,127,79,89,79,127,87,97,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,56,64,56,127,46,53,46,127,25,31,25,127,22,27,22,127,25,31,25,127,44,47,44,127,116,116,115,127,59,59,57,127,60,60,58,127,60,60,58,127,60,60,58,127,61,61,59,127,38,41,37,127,69,78,69,127,45,53,45,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,15,20,15,127,0,0,0,127,5,6,5,127,104,117,104,127,105,118,105,127,105,118,105,127,105,118,105,127,93,104,93,127,8,9,8,127,0,0,0,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,96,73,32,127,2,2,1,127,0,0,0,127,24,28,24,127,0,0,0,127,37,28,12,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,10,8,3,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,88,68,30,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,39,30,13,127,0,0,0,127,43,49,43,127,105,118,105,127,105,118,105,127,105,118,105,127,93,105,93,127,0,0,0,127,14,11,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,39,30,13,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1293 | [0,0,0,64,0,1,0,127,21,25,21,127,48,57,49,127,82,92,82,127,87,97,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,87,98,87,127,60,69,60,127,43,50,43,127,29,36,29,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,116,116,116,127,71,71,70,127,60,60,58,127,60,60,58,127,60,60,58,127,62,62,60,127,30,32,29,127,75,85,75,127,29,36,29,127,25,31,25,127,24,30,24,127,24,30,24,127,23,28,23,127,10,14,10,127,0,0,0,127,40,45,40,127,105,118,105,127,105,118,105,127,105,118,105,127,105,118,105,127,33,38,33,127,0,0,0,127,39,30,13,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,67,52,23,127,0,0,0,127,0,0,0,127,10,8,3,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,107,82,36,127,84,65,28,127,71,54,24,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,67,51,22,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,105,81,35,127,2,2,1,127,0,0,0,127,0,0,0,127,18,21,18,127,61,69,61,127,102,115,102,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,60,46,20,127,52,40,17,127,69,53,23,127,86,66,29,127,10,8,3,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1294 | [0,0,0,0,0,0,0,127,2,5,2,127,49,57,49,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,98,87,127,86,97,86,127,75,84,75,127,53,61,53,127,34,41,34,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,96,97,96,127,93,93,92,127,59,59,58,127,60,60,58,127,60,60,58,127,61,61,59,127,34,39,34,127,74,84,74,127,23,29,23,127,25,31,25,127,37,39,34,127,47,47,41,127,44,45,39,127,17,18,16,127,0,0,0,127,52,59,52,127,105,118,105,127,105,118,105,127,105,118,105,127,81,92,81,127,0,0,0,127,8,6,3,127,111,85,37,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,50,38,17,127,16,12,5,127,33,25,11,127,103,79,34,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,23,18,8,127,0,0,0,127,69,53,23,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,27,21,9,127,0,0,0,127,0,0,0,127,0,0,0,127,92,71,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,61,47,21,127,18,14,6,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,117,90,39,127,88,68,29,127,54,41,18,127,14,11,5,127,0,0,0,127,0,0,0,127,17,18,17,127,68,76,68,127,0,0,0,127,21,16,7,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,31,24,11,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1295 | [0,0,0,0,0,0,0,95,0,0,0,127,37,43,37,127,89,100,89,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,88,99,88,127,82,92,82,127,61,69,61,127,36,42,36,127,27,32,27,127,23,29,23,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,78,80,76,127,102,102,102,127,58,58,57,127,60,60,58,127,60,60,58,127,58,58,56,127,40,47,40,127,56,64,56,127,24,29,23,127,44,45,40,127,49,49,43,127,49,49,43,127,46,46,41,127,41,42,37,127,0,0,0,127,38,43,38,127,105,118,105,127,105,118,105,127,105,118,105,127,33,37,33,127,0,0,0,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,0,0,0,127,0,0,0,127,0,0,0,127,12,9,4,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,84,65,28,127,4,3,2,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,42,33,14,127,0,0,0,127,119,91,40,127,102,78,34,127,75,57,25,127,52,40,17,127,88,68,29,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,61,47,21,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,84,65,28,127,19,15,7,127,0,0,0,127,4,5,4,127,0,0,0,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,111,85,37,127,115,88,38,127,122,94,41,127,122,94,41,127,48,37,16,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1296 | [0,0,0,0,0,0,0,32,0,0,0,127,6,7,5,127,67,75,67,127,89,100,89,127,87,97,87,127,87,97,87,127,87,98,87,127,88,99,88,127,88,98,88,127,80,90,80,127,62,71,62,127,45,52,45,127,39,46,39,127,57,65,57,127,65,74,65,127,59,67,59,127,54,61,54,127,55,61,55,127,28,34,28,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,64,67,64,127,109,109,108,127,58,58,57,127,60,60,58,127,61,60,59,127,50,50,47,127,47,55,47,127,33,39,33,127,44,44,39,127,48,48,42,127,48,48,42,127,28,30,25,127,36,37,31,127,48,48,42,127,1,2,1,127,36,41,36,127,105,118,105,127,105,118,105,127,99,111,99,127,4,5,4,127,2,2,1,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,65,50,22,127,0,0,0,127,30,34,30,127,27,30,27,127,0,0,0,127,67,51,22,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,58,44,19,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,71,54,24,127,0,0,0,127,18,14,6,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,54,41,18,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,56,43,19,127,0,0,0,127,0,0,0,127,31,24,11,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,37,28,12,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1297 | [0,0,0,0,0,0,0,0,0,0,0,95,0,0,0,127,2,3,2,127,28,32,28,127,58,65,58,127,56,64,56,127,50,57,50,127,46,54,46,127,42,49,42,127,43,50,43,127,62,71,62,127,80,90,80,127,87,98,87,127,87,98,87,127,87,97,87,127,87,98,87,127,86,97,87,127,78,85,78,127,46,52,46,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,64,67,64,127,104,104,104,127,58,58,57,127,60,60,58,127,62,61,60,127,34,38,33,127,37,43,37,127,50,51,44,127,48,48,42,127,48,48,42,127,23,27,22,127,32,36,30,127,95,95,82,127,43,45,39,127,0,0,0,127,45,51,45,127,105,118,105,127,105,118,105,127,71,80,71,127,0,0,0,127,35,27,12,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,103,79,35,127,2,2,1,127,0,0,0,127,11,13,11,127,0,0,0,127,65,50,22,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,23,18,8,127,0,0,0,127,35,27,12,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,46,36,16,127,41,31,14,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,37,28,12,127,50,38,17,127,73,56,24,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,69,53,23,127,0,0,0,127,44,34,15,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,27,21,9,127,0,0,0,127,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,0,0,0,0,0], |
---|
| 1298 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,8,10,8,127,51,59,51,127,84,95,84,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,87,127,63,71,63,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,76,78,75,127,100,100,99,127,58,58,57,127,61,60,59,127,53,54,51,127,24,30,24,127,29,33,28,127,77,76,63,127,47,48,42,127,29,32,27,127,24,30,24,127,30,35,29,127,90,91,84,127,28,29,25,127,0,0,0,127,77,86,76,127,105,118,105,127,105,118,105,127,44,50,44,127,0,0,0,127,69,53,23,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,81,62,27,127,4,3,2,127,0,0,0,127,12,9,4,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,4,3,2,127,0,0,0,127,54,41,18,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,46,36,16,127,46,36,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,48,37,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,42,33,14,127,46,36,16,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,16,12,5,127,0,0,0,127,0,0,0,127,4,3,2,127,6,5,2,127,0,0,0,95,0,0,0,0], |
---|
| 1299 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,95,1,1,1,127,60,68,60,127,87,98,87,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,97,87,127,73,82,73,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,89,92,89,127,87,87,86,127,59,59,58,127,60,59,58,127,31,35,31,127,25,31,25,127,43,45,38,127,74,74,62,127,43,43,38,127,22,28,22,127,25,31,25,127,24,30,24,127,26,32,26,127,13,14,12,127,0,0,0,127,100,113,100,127,105,118,105,127,105,118,105,127,21,24,21,127,0,0,0,127,98,75,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,113,87,38,127,92,71,31,127,117,90,39,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,19,15,7,127,0,0,0,127,71,54,24,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,39,30,13,127,50,38,17,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,82,63,28,127,0,0,0,127,23,26,23,127,38,42,38,127,5,7,5,127,0,0,0,127,96,73,32,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,111,85,37,127,54,41,18,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,82,63,28,127,16,12,5,127,16,12,5,127,16,12,5,127,12,9,4,127,46,35,16,127,82,63,28,127,117,90,39,127,46,36,16,127,0,0,0,127,0,0,0,0], |
---|
| 1300 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,33,38,33,127,89,99,89,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,84,94,84,127,28,35,28,127,25,31,25,127,25,31,25,127,25,31,25,127,22,28,22,127,100,101,100,127,73,73,71,127,61,60,59,127,35,38,35,127,24,30,24,127,24,30,24,127,48,51,41,127,69,69,57,127,36,37,32,127,24,30,24,127,28,34,28,127,25,31,25,127,25,31,25,127,17,21,17,127,0,0,0,127,80,90,80,127,105,118,105,127,105,118,105,127,6,7,6,127,0,0,0,127,115,88,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,56,43,19,127,0,0,0,127,88,68,29,127,117,90,39,127,107,82,36,127,92,71,31,127,80,62,27,127,69,53,23,127,60,46,20,127,46,36,16,127,33,25,11,127,23,18,8,127,4,3,2,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,65,50,22,127,0,0,0,127,20,22,20,127,26,30,26,127,0,0,0,127,2,2,1,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,21,16,7,127,60,46,20,127,94,72,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,54,41,18,127,0,0,0,127,0,0,0,0], |
---|
| 1301 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,6,7,6,127,81,91,81,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,88,98,88,127,60,68,60,127,27,33,27,127,24,30,24,127,25,31,25,127,22,28,22,127,91,91,91,127,57,58,56,127,31,36,31,127,24,30,24,127,25,31,25,127,25,31,25,127,27,31,26,127,70,71,58,127,41,42,36,127,37,43,37,127,66,74,66,127,23,29,23,127,25,31,25,127,19,22,19,127,0,0,0,127,75,84,75,127,105,118,105,127,102,114,102,127,0,0,0,127,4,3,2,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,117,90,39,127,31,24,10,127,2,2,1,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,4,3,2,127,61,47,21,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,46,36,16,127,0,0,0,127,0,0,0,127,0,0,0,127,8,6,3,127,73,56,24,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,61,47,21,127,0,0,0,127,0,0,0,0], |
---|
| 1302 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,45,52,45,127,87,98,88,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,82,92,82,127,46,54,46,127,34,41,34,127,25,31,25,127,25,31,25,127,26,30,26,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,33,37,31,127,48,48,42,127,43,43,38,127,66,74,65,127,23,29,23,127,25,31,25,127,20,25,20,127,0,0,0,127,70,78,70,127,105,118,105,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,86,66,29,127,48,37,16,127,31,24,11,127,16,12,5,127,23,18,8,127,33,25,11,127,52,40,17,127,71,54,24,127,96,73,32,127,117,90,39,127,63,49,21,127,73,56,24,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,88,68,29,127,77,59,26,127,77,59,26,127,90,69,30,127,117,90,39,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,73,56,24,127,0,0,0,127,0,0,0,32], |
---|
| 1303 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,25,28,25,127,88,99,88,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,86,97,86,127,87,98,87,127,70,79,70,127,46,54,46,127,47,55,47,127,45,52,45,127,30,37,30,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,44,52,44,127,72,81,72,127,70,79,70,127,23,29,23,127,25,31,25,127,21,25,21,127,0,0,0,127,66,73,65,127,105,118,105,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,80,62,27,127,77,59,26,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,77,59,26,127,0,0,0,127,0,0,0,64], |
---|
| 1304 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,1,0,127,64,72,64,127,87,97,87,127,86,97,86,127,86,97,86,127,87,97,87,127,86,97,86,127,86,96,86,127,85,95,85,127,71,80,71,127,47,55,47,127,46,54,46,127,46,54,46,127,46,54,46,127,47,55,47,127,31,38,31,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,23,29,23,127,59,67,59,127,77,87,77,127,58,66,58,127,25,31,25,127,25,31,25,127,22,27,22,127,0,0,0,127,48,54,48,127,105,118,105,127,92,103,92,127,0,0,0,127,16,12,5,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,80,62,27,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,92,71,31,127,0,0,0,127,0,0,0,64], |
---|
| 1305 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,127,14,16,14,127,88,99,88,127,88,98,88,127,88,98,88,127,72,82,72,127,51,59,51,127,52,61,52,127,55,63,55,127,47,55,47,127,45,53,45,127,45,53,45,127,46,54,46,127,46,54,46,127,46,54,46,127,45,53,45,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,37,44,37,127,76,86,76,127,73,82,73,127,32,39,32,127,23,29,23,127,2,2,2,127,30,34,30,95,105,118,105,64,98,111,98,64,0,0,0,95,4,3,2,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,115,88,38,127,92,71,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,0,0,0,127,0,0,0,64], |
---|
| 1306 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,21,24,21,127,55,62,55,127,51,57,50,127,64,72,64,127,86,96,86,127,85,95,85,127,84,94,84,127,86,96,86,127,84,95,84,127,82,92,82,127,75,85,75,127,52,60,52,127,46,54,46,127,46,54,46,127,45,53,45,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,29,36,29,127,28,34,28,127,24,30,24,127,62,71,62,127,88,99,88,127,66,75,66,127,24,30,24,127,8,11,8,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,100,76,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,107,82,36,127,0,0,0,127,0,0,0,64], |
---|
| 1307 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,31,36,31,127,35,40,35,127,33,36,32,127,31,34,31,127,47,55,47,127,51,59,51,127,47,55,47,127,39,46,39,127,29,36,29,127,37,43,37,127,52,60,52,127,77,87,77,127,49,58,49,127,46,54,46,127,40,48,40,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,29,35,29,127,80,90,80,127,59,67,59,127,24,30,24,127,24,30,24,127,76,86,76,127,87,98,87,127,39,46,39,127,17,22,17,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,75,57,25,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,79,60,26,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,71,55,24,127,103,79,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,117,90,39,127,0,0,0,127,0,0,0,64], |
---|
| 1308 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,41,48,41,127,69,79,69,127,39,45,39,127,47,54,47,127,77,87,77,127,86,97,86,127,88,97,87,127,87,97,86,127,82,93,83,127,57,65,57,127,25,31,25,127,24,30,24,127,26,32,26,127,26,32,26,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,75,85,75,127,87,98,87,127,67,75,67,127,23,29,23,127,23,29,23,127,56,64,56,127,85,95,85,127,75,84,75,127,24,30,24,127,3,3,3,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,127,29,22,10,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,8,6,3,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,6,5,2,127,107,82,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,0,0,0,127,0,0,0,64], |
---|
| 1309 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,12,15,12,127,45,53,46,127,48,56,48,127,65,72,63,127,98,81,79,127,123,119,119,127,117,108,108,127,94,79,76,127,88,88,80,127,64,73,64,127,24,30,24,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,35,41,35,127,86,96,86,127,87,98,87,127,61,69,61,127,23,29,23,127,24,30,24,127,46,53,46,127,84,94,84,127,87,98,87,127,55,63,55,127,10,12,10,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,92,71,31,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,75,57,25,127,0,0,0,127,52,40,17,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,12,9,4,127,0,0,0,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,14,11,5,127,0,0,0,95], |
---|
| 1310 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,22,26,22,127,30,37,30,127,23,29,23,127,41,40,35,127,91,73,72,127,113,103,103,127,100,75,75,127,87,58,58,127,83,72,66,127,54,63,55,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,30,25,127,34,41,34,127,69,78,69,127,81,91,81,127,34,41,34,127,25,31,25,127,23,29,23,127,61,69,61,127,82,92,82,127,75,85,75,127,82,92,82,127,24,29,24,127,1,1,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,127,23,18,8,127,119,91,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,17,14,6,127,0,0,0,127,2,2,1,127,96,73,32,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,75,58,25,127,6,5,2,127,0,0,0,127,0,0,0,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,18,14,6,127,0,0,0,127], |
---|
| 1311 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,24,29,24,127,48,56,48,127,28,34,28,127,24,30,24,127,25,31,25,127,36,37,32,127,68,55,52,127,82,63,62,127,80,52,52,127,81,82,74,127,28,34,28,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,23,29,23,127,25,31,25,127,24,30,24,127,25,31,25,127,24,29,24,127,56,64,56,127,87,97,87,127,70,79,70,127,88,99,88,127,49,57,49,127,10,12,10,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,44,34,15,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,67,52,23,127,0,0,0,127,0,0,0,95,0,0,0,127,12,9,4,127,109,84,36,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,100,76,33,127,33,25,11,127,0,0,0,127,0,0,0,127,0,0,0,95,0,0,0,127,107,82,36,127,117,90,39,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,31,24,11,127,0,0,0,127], |
---|
| 1312 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,14,16,14,127,81,91,81,127,72,81,72,127,43,51,43,127,23,29,23,127,24,30,24,127,23,30,24,127,23,30,23,127,25,31,25,127,26,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,26,32,26,127,32,39,32,127,30,37,30,127,24,30,24,127,25,31,25,127,25,31,25,127,25,32,25,127,83,93,83,127,77,86,77,127,87,97,87,127,80,90,80,127,22,27,22,127,1,1,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,46,35,15,127,121,92,40,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,96,73,32,127,4,3,2,127,0,0,0,95,0,0,0,0,0,0,0,32,0,0,0,127,12,9,4,127,98,75,33,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,96,73,32,127,40,31,14,127,2,2,1,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,32,0,0,0,127,0,0,0,127,0,0,0,127,2,2,1,127,16,12,5,127,25,19,9,127,33,25,11,127,46,36,16,127,56,43,19,127,61,47,21,127,77,59,26,127,84,65,28,127,92,71,31,127,107,82,36,127,115,88,38,127,122,94,41,127,122,94,41,127,39,30,13,127,0,0,0,127], |
---|
| 1313 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,18,21,18,127,83,93,83,127,89,100,89,127,71,81,71,127,54,61,54,127,37,44,37,127,24,30,24,127,23,29,23,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,24,30,24,127,42,50,42,127,70,79,70,127,87,98,87,127,74,83,74,127,28,35,28,127,25,31,25,127,24,30,24,127,42,49,42,127,76,86,76,127,86,97,86,127,88,99,88,127,41,49,41,127,11,14,11,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,27,21,9,127,105,81,35,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,98,75,33,127,12,9,4,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,2,2,1,127,58,44,19,127,113,87,38,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,105,81,35,127,63,49,21,127,21,16,7,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,16,12,5,127,6,5,2,127,0,0,0,95], |
---|
| 1314 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,13,17,13,127,61,70,61,127,85,96,85,127,89,100,89,127,88,98,88,127,77,87,77,127,60,67,60,127,26,32,26,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,25,31,25,127,12,16,12,127,12,15,12,127,40,46,40,127,80,90,80,127,80,89,80,127,34,40,34,127,24,30,24,127,23,29,23,127,51,59,51,127,88,99,88,127,86,97,86,127,76,85,76,127,22,27,22,127,1,2,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,4,3,2,127,59,46,20,127,111,85,37,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,119,91,40,127,65,50,22,127,4,3,2,127,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,0,0,0,127,4,3,2,127,44,34,15,127,80,62,27,127,111,85,37,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,122,94,41,127,121,92,40,127,100,76,33,127,75,57,25,127,48,37,16,127,18,13,6,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,127,0,0,0,64,0,0,0,0], |
---|
| 1315 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,127,19,23,19,127,46,53,46,127,64,72,64,127,80,90,80,127,85,96,85,127,74,84,74,127,28,34,28,127,25,31,25,127,25,31,25,127,25,30,25,127,25,31,25,127,25,31,25,127,25,31,25,127,17,21,17,127,1,3,1,127,0,1,0,127,0,0,0,127,9,11,9,127,51,59,52,127,82,93,83,127,45,52,45,127,23,29,23,127,24,30,24,127,59,67,59,127,88,99,88,127,85,96,85,127,30,37,30,127,12,15,12,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,4,3,2,127,42,33,14,127,82,63,28,127,107,82,36,127,103,79,35,127,84,65,28,127,54,41,18,127,12,9,4,127,0,0,0,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,10,8,3,127,25,19,9,127,31,24,11,127,31,24,11,127,31,24,11,127,31,24,11,127,18,14,6,127,35,27,12,127,105,81,35,127,80,62,27,127,54,41,18,127,29,22,10,127,6,5,2,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,95,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1316 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,8,10,8,127,33,39,33,127,44,51,44,127,46,53,46,127,44,52,44,127,39,46,39,127,25,30,25,127,25,31,25,127,25,31,25,127,24,30,24,127,15,19,15,127,5,7,5,127,0,1,0,127,0,0,0,127,0,0,0,95,0,0,0,64,0,0,0,64,0,1,0,127,21,24,21,127,66,74,66,127,57,66,57,127,24,30,24,127,23,29,23,127,52,60,52,127,40,47,40,127,24,30,24,127,23,28,23,127,1,2,1,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,95,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1317 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,11,13,11,127,23,28,23,127,33,39,33,127,36,43,36,127,23,29,23,127,20,26,20,127,11,15,11,127,3,4,3,127,0,1,0,127,0,0,0,127,0,0,0,95,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,3,5,3,127,37,41,37,127,58,66,58,127,27,33,27,127,24,30,24,127,26,32,26,127,25,31,25,127,25,31,25,127,8,9,8,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1318 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,0,0,0,127,0,0,0,127,0,0,0,127,0,1,0,127,0,0,0,127,0,0,0,127,0,0,0,127,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,127,12,15,12,127,42,49,42,127,32,39,32,127,24,30,24,127,25,31,25,127,25,31,25,127,18,22,18,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1319 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,2,2,2,127,23,27,23,127,37,43,37,127,26,33,26,127,25,31,25,127,24,30,24,127,4,4,4,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1320 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,4,5,4,127,24,28,23,127,29,35,29,127,25,31,25,127,12,16,12,127,0,0,0,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1321 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,95,4,4,4,127,11,14,11,127,16,20,16,127,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], |
---|
| 1322 | [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,64,0,0,0,127,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]) |
---|
| 1323 | def __init__(self, parent, title): |
---|
| 1324 | """Constructor. |
---|
| 1325 | |
---|
| 1326 | @param title Header title. |
---|
| 1327 | """ |
---|
| 1328 | Decorator.__init__(self, parent) |
---|
| 1329 | self.title = title |
---|
| 1330 | self.border = 10 |
---|
| 1331 | return |
---|
| 1332 | def draw(self, screenRectangle): |
---|
| 1333 | rect = screenRectangle[:] |
---|
| 1334 | rect[0] += self.border |
---|
| 1335 | rect[1] += self.border |
---|
| 1336 | rect[2] -= self.border |
---|
| 1337 | rect[3] -= self.border |
---|
| 1338 | # title |
---|
| 1339 | glColor3ub(210, 236, 210) |
---|
| 1340 | glRecti(rect[0],rect[3]-41,rect[2],rect[3]-17) |
---|
| 1341 | glColor3ub(50, 62, 50) |
---|
| 1342 | glRasterPos2i(rect[0]+126, rect[3]-34) |
---|
| 1343 | Blender.Draw.Text(self.title) |
---|
| 1344 | glRasterPos2i(rect[0]+127, rect[3]-34) |
---|
| 1345 | Blender.Draw.Text(self.title) |
---|
| 1346 | # logo |
---|
| 1347 | glRasterPos2i(rect[0]+1, rect[3]-48) |
---|
| 1348 | glEnable(GL_BLEND) |
---|
| 1349 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) |
---|
| 1350 | glDrawPixels(122, 48, GL_RGBA, GL_BYTE, OgreFrame.OGRE_LOGO) |
---|
| 1351 | rect[3] -= 48 + self.border |
---|
| 1352 | glDisable(GL_BLEND) |
---|
| 1353 | # child |
---|
| 1354 | self.childWidget.draw(rect) |
---|
| 1355 | return |
---|
| 1356 | def getSize(self): |
---|
| 1357 | width = 2*self.border + Blender.Draw.GetStringWidth(self.title) + 85 |
---|
| 1358 | height = 48 + 3*self.border |
---|
| 1359 | minSize = self.childWidget.getSize().getMinimumSize()[:] |
---|
| 1360 | minSize[0] += 2*self.border |
---|
| 1361 | minSize[1] += 3*self.border + 48 |
---|
| 1362 | if minSize[0] < width: |
---|
| 1363 | minSize[0] = width |
---|
| 1364 | if minSize[1] < height: |
---|
| 1365 | minSize[1] = height |
---|
| 1366 | prefSize = self.childWidget.getSize().getPreferredSize()[:] |
---|
| 1367 | prefSize[0] += 2*self.border |
---|
| 1368 | prefSize[1] += 3*self.border + 48 |
---|
| 1369 | if prefSize[0] < width: |
---|
| 1370 | prefSize[0] = width |
---|
| 1371 | if prefSize[1] < height: |
---|
| 1372 | prefSize[1] = height |
---|
| 1373 | maxSize = self.childWidget.getSize().getMaximumSize()[:] |
---|
| 1374 | return Size(prefSize, minSize, maxSize) |
---|
| 1375 | |
---|
| 1376 | class DirectionalLayout(Widget): |
---|
| 1377 | """Common layout functionality for horizontal and vertical layout. |
---|
| 1378 | """ |
---|
| 1379 | def __init__(self, parent): |
---|
| 1380 | """Constructor. |
---|
| 1381 | """ |
---|
| 1382 | Widget.__init__(self, parent, Size([0, 0])) |
---|
| 1383 | self.widgetList = [] |
---|
| 1384 | return |
---|
| 1385 | def resize(self, size=None): |
---|
| 1386 | self.size = Size([0, 0]) |
---|
| 1387 | for widget in self.widgetList: |
---|
| 1388 | self._addWidgetSize(widget) |
---|
| 1389 | self.parent.resize() |
---|
| 1390 | return |
---|
| 1391 | def eventFilter(self, event, value): |
---|
| 1392 | for widget in self.widgetList: |
---|
| 1393 | widget.eventFilter(event, value) |
---|
| 1394 | return |
---|
| 1395 | def _addWidget(self, widget): |
---|
| 1396 | """Adds a child widget to this layout. |
---|
| 1397 | |
---|
| 1398 | The child widget is appended below all other widgets. This |
---|
| 1399 | method gets called by the constructor of the child widget. |
---|
| 1400 | """ |
---|
| 1401 | self.widgetList.append(widget) |
---|
| 1402 | self._addWidgetSize(widget) |
---|
| 1403 | self.parent.resize() |
---|
| 1404 | return |
---|
| 1405 | def _removeWidget(self, widget): |
---|
| 1406 | """Removes a child widget from this layout. |
---|
| 1407 | |
---|
| 1408 | This method gets called by the <code>removeFromParent()</code> |
---|
| 1409 | method of the corresponding child widget. |
---|
| 1410 | """ |
---|
| 1411 | if widget in self.widgetList: |
---|
| 1412 | self.widgetList.remove(widget) |
---|
| 1413 | self.resize() |
---|
| 1414 | return |
---|
| 1415 | def _addWidgetSize(self, widget): |
---|
| 1416 | raise NotImplementedError |
---|
| 1417 | return |
---|
| 1418 | |
---|
| 1419 | class HorizontalLayout(DirectionalLayout): |
---|
| 1420 | """Widget that manages horizontally stacked child widgets. |
---|
| 1421 | """ |
---|
| 1422 | def draw(self, screenRectangle): |
---|
| 1423 | # split height for the child widgets |
---|
| 1424 | minimumSize = self.size.getMinimumSize() |
---|
| 1425 | width = screenRectangle[2]- screenRectangle[0] |
---|
| 1426 | additionalWidth = width - minimumSize[0] |
---|
| 1427 | stretchWidgetList = [] |
---|
| 1428 | extraWidth = 0 |
---|
| 1429 | # get widgets with unlimited preferred height |
---|
| 1430 | if (additionalWidth > 0): |
---|
| 1431 | stretchWidgetList = [w for w in self.widgetList if w.getSize().getPreferredSize()[0] >= Size.INFINITY] |
---|
| 1432 | if (len(stretchWidgetList) > 0): |
---|
| 1433 | # give equal extra height to widgets with unlimited preferred height |
---|
| 1434 | extraWidth = additionalWidth / len(stretchWidgetList) |
---|
| 1435 | # draw widgets with minimum or minimum plus extra size |
---|
| 1436 | x = screenRectangle[0] |
---|
| 1437 | dx = 0 |
---|
| 1438 | for widget in self.widgetList: |
---|
| 1439 | dx = widget.getSize().getMinimumSize()[0] |
---|
| 1440 | if (widget in stretchWidgetList): |
---|
| 1441 | dx += extraWidth |
---|
| 1442 | widget.draw([x, screenRectangle[1], x+dx, screenRectangle[3]]) |
---|
| 1443 | x += dx |
---|
| 1444 | return |
---|
| 1445 | def _addWidgetSize(self, widget): |
---|
| 1446 | """Adds size of a widget but does not notify parent. |
---|
| 1447 | """ |
---|
| 1448 | wMinSize = widget.getSize().getMinimumSize() |
---|
| 1449 | wMaxSize = widget.getSize().getMaximumSize() |
---|
| 1450 | wPrefSize = widget.getSize().getPreferredSize() |
---|
| 1451 | minSize = self.getSize().getMinimumSize() |
---|
| 1452 | maxSize = self.getSize().getMaximumSize() |
---|
| 1453 | prefSize = self.getSize().getPreferredSize() |
---|
| 1454 | # add in x direction |
---|
| 1455 | minSize[0] += wMinSize[0] |
---|
| 1456 | maxSize[0] += wMaxSize[0] |
---|
| 1457 | if (prefSize[0] < Size.INFINITY): |
---|
| 1458 | if (wPrefSize[0] < Size.INFINITY): |
---|
| 1459 | prefSize[0] += wPrefSize[0] |
---|
| 1460 | else: |
---|
| 1461 | prefSize[0] = Size.INFINITY |
---|
| 1462 | # maximum in y direction |
---|
| 1463 | if (wMinSize[1] > minSize[1]): |
---|
| 1464 | minSize[1] = wMinSize[1] |
---|
| 1465 | if (wPrefSize[1] > prefSize[1]): |
---|
| 1466 | prefSize[1] = wPrefSize[1] |
---|
| 1467 | if (wMaxSize[1] > maxSize[1]): |
---|
| 1468 | maxSize[1] = wMaxSize[1] |
---|
| 1469 | self.size = Size(prefSize, minSize, maxSize) |
---|
| 1470 | return |
---|
| 1471 | |
---|
| 1472 | |
---|
| 1473 | class VerticalLayout(DirectionalLayout): |
---|
| 1474 | """Widget that manages vertically stacked child widgets. |
---|
| 1475 | """ |
---|
| 1476 | def draw(self, screenRectangle): |
---|
| 1477 | # split height for the child widgets |
---|
| 1478 | minimumSize = self.getSize().getMinimumSize() |
---|
| 1479 | height = screenRectangle[3]- screenRectangle[1] |
---|
| 1480 | additionalHeight = height - minimumSize[1] |
---|
| 1481 | stretchWidgetList = [] |
---|
| 1482 | extraHeight = 0 |
---|
| 1483 | # get widgets with unlimited preferred height |
---|
| 1484 | if (additionalHeight > 0): |
---|
| 1485 | stretchWidgetList = [w for w in self.widgetList if w.getSize().getPreferredSize()[1] >= Size.INFINITY] |
---|
| 1486 | if (len(stretchWidgetList) > 0): |
---|
| 1487 | # give equal extra height to widgets with unlimited preferred height |
---|
| 1488 | extraHeight = additionalHeight / len(stretchWidgetList) |
---|
| 1489 | # draw widgets with minimum or minimum plus extra size |
---|
| 1490 | y = screenRectangle[3] |
---|
| 1491 | dy = 0 |
---|
| 1492 | for widget in self.widgetList: |
---|
| 1493 | dy = widget.getSize().getMinimumSize()[1] |
---|
| 1494 | if (widget in stretchWidgetList): |
---|
| 1495 | dy += extraHeight |
---|
| 1496 | widget.draw([screenRectangle[0], y-dy, screenRectangle[2], y]) |
---|
| 1497 | y -= dy |
---|
| 1498 | return |
---|
| 1499 | def _addWidgetSize(self, widget): |
---|
| 1500 | """Adds size of a widget but does not notify parent. |
---|
| 1501 | """ |
---|
| 1502 | wMinSize = widget.getSize().getMinimumSize() |
---|
| 1503 | wMaxSize = widget.getSize().getMaximumSize() |
---|
| 1504 | wPrefSize = widget.getSize().getPreferredSize() |
---|
| 1505 | minSize = self.getSize().getMinimumSize() |
---|
| 1506 | maxSize = self.getSize().getMaximumSize() |
---|
| 1507 | prefSize = self.getSize().getPreferredSize() |
---|
| 1508 | # add in y direction |
---|
| 1509 | minSize[1] += wMinSize[1] |
---|
| 1510 | maxSize[1] += wMaxSize[1] |
---|
| 1511 | if (prefSize[1] < Size.INFINITY): |
---|
| 1512 | if (wPrefSize[1] < Size.INFINITY): |
---|
| 1513 | prefSize[1] += wPrefSize[1] |
---|
| 1514 | else: |
---|
| 1515 | prefSize[1] = Size.INFINITY |
---|
| 1516 | # maximum in x direction |
---|
| 1517 | if (wMinSize[0] > minSize[0]): |
---|
| 1518 | minSize[0] = wMinSize[0] |
---|
| 1519 | if (wPrefSize[0] > prefSize[0]): |
---|
| 1520 | prefSize[0] = wPrefSize[0] |
---|
| 1521 | if (wMaxSize[0] > maxSize[0]): |
---|
| 1522 | maxSize[0] = wMaxSize[0] |
---|
| 1523 | self.size = Size(prefSize, minSize, maxSize) |
---|
| 1524 | return |
---|
| 1525 | |
---|
| 1526 | class AlternativesLayout(Widget): |
---|
| 1527 | """Displays one widget out of a given set of alternatives. |
---|
| 1528 | """ |
---|
| 1529 | def __init__(self, parent): |
---|
| 1530 | """Constructor. |
---|
| 1531 | """ |
---|
| 1532 | Widget.__init__(self, parent, Size()) |
---|
| 1533 | self.widgetList = [] |
---|
| 1534 | self.current = None |
---|
| 1535 | return |
---|
| 1536 | def getCurrent(self): |
---|
| 1537 | """Returns name of current choosen widget. |
---|
| 1538 | """ |
---|
| 1539 | return self.current |
---|
| 1540 | def setCurrent(self, widget): |
---|
| 1541 | """Sets current active widget to alternative called name. |
---|
| 1542 | |
---|
| 1543 | @param widget A previously added widget or <code>None</code>. |
---|
| 1544 | """ |
---|
| 1545 | if widget is None: |
---|
| 1546 | self.current = None |
---|
| 1547 | self.size = Size() |
---|
| 1548 | self.parent.resize() |
---|
| 1549 | elif widget in self.widgetList: |
---|
| 1550 | self.current = widget |
---|
| 1551 | self.size = widget.getSize() |
---|
| 1552 | self.parent.resize() |
---|
| 1553 | return |
---|
| 1554 | def removeAll(self): |
---|
| 1555 | self.setCurrent(None) |
---|
| 1556 | self.widgetList = [] |
---|
| 1557 | return |
---|
| 1558 | def draw(self, screenRectangle): |
---|
| 1559 | if self.current: |
---|
| 1560 | self.current.draw(screenRectangle) |
---|
| 1561 | return |
---|
| 1562 | def eventFilter(self, event, value): |
---|
| 1563 | if self.current: |
---|
| 1564 | self.current.eventFilter(event, value) |
---|
| 1565 | return |
---|
| 1566 | def _addWidget(self, widget): |
---|
| 1567 | """Adds a child widget to this layout. |
---|
| 1568 | |
---|
| 1569 | The child widget is appended below all other widgets. This |
---|
| 1570 | method gets called by the constructor of the child widget. |
---|
| 1571 | """ |
---|
| 1572 | self.widgetList.append(widget) |
---|
| 1573 | return |
---|
| 1574 | def _removeWidget(self, widget): |
---|
| 1575 | """Removes a child widget from this layout. |
---|
| 1576 | |
---|
| 1577 | This method gets called by the <code>removeFromParent()</code> |
---|
| 1578 | method of the corresponding child widget. |
---|
| 1579 | """ |
---|
| 1580 | if widget in self.widgetList: |
---|
| 1581 | if (widget == self.current): |
---|
| 1582 | self.setCurrent(None) |
---|
| 1583 | self.widgetList.remove(widget) |
---|
| 1584 | return |
---|
| 1585 | |
---|
| 1586 | class WidgetListLayout(Widget): |
---|
| 1587 | """Displays a list of vertically stacked widgets using a scrollbar if necessary. |
---|
| 1588 | """ |
---|
| 1589 | def __init__(self, parent, size, scrollbarWidth=20): |
---|
| 1590 | """Constructor. |
---|
| 1591 | |
---|
| 1592 | @param size Minimum size should exceed 3*scrollbarWidth in both directions |
---|
| 1593 | """ |
---|
| 1594 | Widget.__init__(self, parent, size) |
---|
| 1595 | # mousewheel scrolling |
---|
| 1596 | self.listRect = [0, 0, 0, 0] |
---|
| 1597 | # list of child widgets |
---|
| 1598 | self.widgetList = [] |
---|
| 1599 | # list of current displayed widgets |
---|
| 1600 | self.visibleList = [] |
---|
| 1601 | # parent to register buttons to. |
---|
| 1602 | self.boundedRange = BoundedRangeModel() |
---|
| 1603 | self.scrollbarWidth = scrollbarWidth |
---|
| 1604 | self.scrollbar = VerticalScrollbar(WidgetListLayout.Mediator(self), Size([self.scrollbarWidth, self.scrollbarWidth]), self.boundedRange) |
---|
| 1605 | # mousewheel scrolling |
---|
| 1606 | self.mouseFocusX = 0 |
---|
| 1607 | self.mouseFocusY = 0 |
---|
| 1608 | # unused widget space |
---|
| 1609 | self.remainingHeight = 0 |
---|
| 1610 | self.autoScroll = False |
---|
| 1611 | return |
---|
| 1612 | def setAutoScroll(self, autoScroll=True): |
---|
| 1613 | """Scroll to newly added widgets. |
---|
| 1614 | """ |
---|
| 1615 | self.autoScroll = autoScroll |
---|
| 1616 | return |
---|
| 1617 | def _addWidget(self, widget): |
---|
| 1618 | self.widgetList.append(widget) |
---|
| 1619 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() + 1) |
---|
| 1620 | if self.autoScroll: |
---|
| 1621 | # scroll into visible area |
---|
| 1622 | # Avoid call to Blender.Draw.Draw() to get the current |
---|
| 1623 | # scrollbar extend, as widget may be disabled |
---|
| 1624 | if( widget.getSize().getMinimumSize()[1] > self.remainingHeight): |
---|
| 1625 | self.boundedRange.setValue(self.boundedRange.getMaximum() - self.boundedRange.getExtend()) |
---|
| 1626 | return |
---|
| 1627 | def _removeWidget(self, widget): |
---|
| 1628 | if widget in self.widgetList: |
---|
| 1629 | if widget in self.visibleList: |
---|
| 1630 | self.visibleList.remove(widget) |
---|
| 1631 | self.widgetList.remove(widget) |
---|
| 1632 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() - 1) |
---|
| 1633 | return |
---|
| 1634 | def removeAll(self): |
---|
| 1635 | self.widgetList = [] |
---|
| 1636 | self.boundedRangeModel = BoundedRangeModel() |
---|
| 1637 | return |
---|
| 1638 | def draw(self, rect): |
---|
| 1639 | self.listRect = [rect[0] + 2, rect[1] + 2, rect[2] - self.scrollbarWidth - 2, rect[3] - 2] |
---|
| 1640 | remainingHeight = self.listRect[3] - self.listRect[1] |
---|
| 1641 | # Box |
---|
| 1642 | glColor3f(0.0, 0.0, 0.0) |
---|
| 1643 | glBegin(GL_LINE_STRIP) |
---|
| 1644 | glVertex2i(rect[0], rect[3]) |
---|
| 1645 | glVertex2i(rect[2], rect[3]) |
---|
| 1646 | glVertex2i(rect[2], rect[1]) |
---|
| 1647 | glVertex2i(rect[0], rect[1]) |
---|
| 1648 | glVertex2i(rect[0], rect[3]) |
---|
| 1649 | glEnd() |
---|
| 1650 | # Widgets |
---|
| 1651 | self.visibleList = [] |
---|
| 1652 | if len(self.widgetList): |
---|
| 1653 | listIndex = self.boundedRange.getValue() |
---|
| 1654 | widgetRect = self.listRect[:] |
---|
| 1655 | while ((listIndex < len(self.widgetList)) \ |
---|
| 1656 | and (remainingHeight >= self.widgetList[listIndex].getSize().getMinimumSize()[1])): |
---|
| 1657 | widgetRect[3] = self.listRect[1] + remainingHeight |
---|
| 1658 | remainingHeight -= self.widgetList[listIndex].getSize().getMinimumSize()[1] |
---|
| 1659 | widgetRect[1] = self.listRect[1] + remainingHeight |
---|
| 1660 | self.widgetList[listIndex].draw(widgetRect) |
---|
| 1661 | self.visibleList.append(self.widgetList[listIndex]) |
---|
| 1662 | listIndex += 1 |
---|
| 1663 | self.boundedRange.setExtend(len(self.visibleList), 1) |
---|
| 1664 | # Scrollbar |
---|
| 1665 | self.scrollbar.draw([rect[2]-self.scrollbarWidth-1, rect[1]+1, rect[2]-1, rect[3]-1]) |
---|
| 1666 | self.remainingHeight = remainingHeight |
---|
| 1667 | return |
---|
| 1668 | def eventFilter(self, event, value): |
---|
| 1669 | for widget in self.visibleList: |
---|
| 1670 | widget.eventFilter(event, value) |
---|
| 1671 | # mousewheel scrolling |
---|
| 1672 | if (event == Blender.Draw.MOUSEX): |
---|
| 1673 | mousePositionX = value - ScreenManager.getSingleton().getScissorRectangle()[0] |
---|
| 1674 | if (mousePositionX >= self.listRect[0]) and (mousePositionX <= self.listRect[2]): |
---|
| 1675 | self.mouseFocusX = 1 |
---|
| 1676 | else: |
---|
| 1677 | self.mouseFocusX = 0 |
---|
| 1678 | elif (event == Blender.Draw.MOUSEY): |
---|
| 1679 | mousePositionY = value - ScreenManager.getSingleton().getScissorRectangle()[1] |
---|
| 1680 | if (mousePositionY >= self.listRect[1]) and (mousePositionY <= self.listRect[3]): |
---|
| 1681 | self.mouseFocusY = 1 |
---|
| 1682 | else: |
---|
| 1683 | self.mouseFocusY = 0 |
---|
| 1684 | elif (event == Blender.Draw.WHEELUPMOUSE) \ |
---|
| 1685 | and self.mouseFocusX and self.mouseFocusY: |
---|
| 1686 | self.scrollbar._dec(1) |
---|
| 1687 | elif (event == Blender.Draw.WHEELDOWNMOUSE) \ |
---|
| 1688 | and self.mouseFocusX and self.mouseFocusY: |
---|
| 1689 | self.scrollbar._inc(1) |
---|
| 1690 | # scrollbar |
---|
| 1691 | self.scrollbar.eventFilter(event, value) |
---|
| 1692 | return |
---|
| 1693 | class Mediator(Widget): |
---|
| 1694 | def __init__(self, parent): |
---|
| 1695 | self.parent = parent |
---|
| 1696 | return |
---|
| 1697 | def resize(self, size=None): |
---|
| 1698 | self.parent.resize() |
---|
| 1699 | return |
---|
| 1700 | def _addWidget(self, widget): |
---|
| 1701 | return |
---|
| 1702 | def _removeWidget(self, widget): |
---|
| 1703 | return |
---|
| 1704 | def _addButtonAction(self, action): |
---|
| 1705 | return self.parent._addButtonAction(action) |
---|
| 1706 | def _removeButtonAction(self, eventNumber): |
---|
| 1707 | self.parent._removeButtonAction(eventNumber) |
---|
| 1708 | return |
---|
| 1709 | |
---|
| 1710 | class AddWidgetListLayout(WidgetListLayout): |
---|
| 1711 | """WidgetList with an additional button in the last row. |
---|
| 1712 | |
---|
| 1713 | The first widget added to this layout is used as add-button. The |
---|
| 1714 | add-button is not specified in the constructor in order to not |
---|
| 1715 | complicate a reference from the button action to the parent layout. |
---|
| 1716 | """ |
---|
| 1717 | def __init__(self, parent, size, scrollbarWidth=20): |
---|
| 1718 | """Constructor. |
---|
| 1719 | """ |
---|
| 1720 | WidgetListLayout.__init__(self, parent, size, scrollbarWidth) |
---|
| 1721 | # additional button |
---|
| 1722 | self.addButton = None |
---|
| 1723 | return |
---|
| 1724 | def removeAll(self): |
---|
| 1725 | """Remove all widgets but the add-button. |
---|
| 1726 | """ |
---|
| 1727 | self.widgetList = [] |
---|
| 1728 | self.boundedRangeModel = BoundedRangeModel(0, 0, 0, 1) |
---|
| 1729 | return |
---|
| 1730 | def draw(self, rect): |
---|
| 1731 | self.listRect = [rect[0] + 2, rect[1] + 2, rect[2] - self.scrollbarWidth - 2, rect[3] - 2] |
---|
| 1732 | self.visibleList = [] |
---|
| 1733 | remainingHeight = self.listRect[3] - self.listRect[1] |
---|
| 1734 | widgetRect = self.listRect[:] |
---|
| 1735 | if len(self.widgetList): |
---|
| 1736 | listIndex = self.boundedRange.getValue() |
---|
| 1737 | while ((listIndex < len(self.widgetList)) \ |
---|
| 1738 | and (remainingHeight >= self.widgetList[listIndex].getSize().getMinimumSize()[1])): |
---|
| 1739 | widgetRect[3] = self.listRect[1] + remainingHeight |
---|
| 1740 | remainingHeight -= self.widgetList[listIndex].getSize().getMinimumSize()[1] |
---|
| 1741 | widgetRect[1] = self.listRect[1] + remainingHeight |
---|
| 1742 | self.widgetList[listIndex].draw(widgetRect) |
---|
| 1743 | self.visibleList.append(self.widgetList[listIndex]) |
---|
| 1744 | listIndex += 1 |
---|
| 1745 | self.boundedRange.setExtend(len(self.visibleList), 1) |
---|
| 1746 | # add button |
---|
| 1747 | if remainingHeight >= self.addButton.getSize().getMinimumSize()[1]: |
---|
| 1748 | # draw button |
---|
| 1749 | widgetRect[3] = self.listRect[1] + remainingHeight |
---|
| 1750 | remainingHeight -= self.addButton.getSize().getMinimumSize()[1] |
---|
| 1751 | widgetRect[1] = self.listRect[1] + remainingHeight |
---|
| 1752 | widgetRect[2] = widgetRect[0] + self.addButton.getSize().getMinimumSize()[0] |
---|
| 1753 | self.addButton.draw(widgetRect) |
---|
| 1754 | self.boundedRange.setExtend(self.boundedRange.getExtend() + 1, 1) |
---|
| 1755 | # Scrollbar |
---|
| 1756 | self.scrollbar.draw([rect[2]-self.scrollbarWidth-1, rect[1]+1, rect[2]-1, rect[3]-1]) |
---|
| 1757 | self.remainingHeight = remainingHeight |
---|
| 1758 | return |
---|
| 1759 | def _addWidget(self, widget): |
---|
| 1760 | if self.addButton: |
---|
| 1761 | self.widgetList.append(widget) |
---|
| 1762 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() + 1) |
---|
| 1763 | # scroll into visible area |
---|
| 1764 | # Avoid call to Blender.Draw.Draw() to get the current |
---|
| 1765 | # scrollbar extend, as widget may be disabled |
---|
| 1766 | if self.autoScroll: |
---|
| 1767 | if((widget.getSize().getMinimumSize()[1] + self.addButton.getSize().getMinimumSize()[1]) > self.remainingHeight): |
---|
| 1768 | self.boundedRange.setValue(self.boundedRange.getMaximum() - self.boundedRange.getExtend()) |
---|
| 1769 | else: |
---|
| 1770 | self.addButton = widget |
---|
| 1771 | self.boundedRange.setMaximum(self.boundedRange.getMaximum() + 1) |
---|
| 1772 | return |
---|
| 1773 | |
---|
| 1774 | class LogView(Decorator, View): |
---|
| 1775 | """Shows the log messages. |
---|
| 1776 | """ |
---|
| 1777 | _COLOR = {Log.INFO:[0.0, 0.0, 0.0], Log.WARNING:[1.0, 1.0, 0.0], Log.ERROR:[1.0, 0.0, 0.0]} |
---|
| 1778 | def __init__(self, parent, size, scrollbarWidth=20, viewPrevious=True): |
---|
| 1779 | Decorator.__init__(self, parent) |
---|
| 1780 | WidgetListLayout(self, size, scrollbarWidth) |
---|
| 1781 | View.__init__(self, Log.getSingleton()) |
---|
| 1782 | self.labelSize = Size([self.getSize().getMinimumSize()[0], LabelView._HEIGHTDICT['normal'] + 2]) |
---|
| 1783 | # last considered log message |
---|
| 1784 | self.iMessages = 0 |
---|
| 1785 | for entry in Log.getSingleton().getMessageList(): |
---|
| 1786 | if viewPrevious: |
---|
| 1787 | self._addLogEntry(entry) |
---|
| 1788 | self.iMessages += 1 |
---|
| 1789 | # first line to display |
---|
| 1790 | if viewPrevious: |
---|
| 1791 | self.firstLine = 0 |
---|
| 1792 | else: |
---|
| 1793 | self.firstLine = self.iMessages |
---|
| 1794 | self.childWidget.setAutoScroll(True) |
---|
| 1795 | return |
---|
| 1796 | def update(self): |
---|
| 1797 | if (self.iMessages < len(Log.getSingleton().getMessageList())): |
---|
| 1798 | for entry in Log.getSingleton().getMessageList()[self.iMessages:]: |
---|
| 1799 | self._addLogEntry(entry) |
---|
| 1800 | self.iMessages += 1 |
---|
| 1801 | Blender.Draw.Draw() |
---|
| 1802 | return |
---|
| 1803 | def _addLogEntry(self, entry): |
---|
| 1804 | LabelView(self.childWidget, LabelModel(entry[1], color=LogView._COLOR[entry[0]]), size=self.labelSize) |
---|
| 1805 | return |
---|
| 1806 | |
---|
| 1807 | class Screen: |
---|
| 1808 | """Represents the complete script window. |
---|
| 1809 | |
---|
| 1810 | A screen represents the complete script window. It handles |
---|
| 1811 | drawing and events and can consist of several user interface |
---|
| 1812 | components. A screen has a single child widget. |
---|
| 1813 | """ |
---|
| 1814 | def __init__(self): |
---|
| 1815 | """Constructor. |
---|
| 1816 | """ |
---|
| 1817 | # buttonHandler event number management |
---|
| 1818 | self.nButtonEvent = 0 |
---|
| 1819 | # buttonEventDict key: iButtonEvent, value: Action |
---|
| 1820 | self.buttonEventDict = {} |
---|
| 1821 | # root widget of the screen |
---|
| 1822 | self.widget = None |
---|
| 1823 | Widget(self) |
---|
| 1824 | # scissor rectangle |
---|
| 1825 | self.scissorRectangle = [0, 0, 0, 0] |
---|
| 1826 | return |
---|
| 1827 | def activate(self): |
---|
| 1828 | """Makes this the current active screen. |
---|
| 1829 | |
---|
| 1830 | This method registers itself at the ScreenManager. |
---|
| 1831 | """ |
---|
| 1832 | ScreenManager.getSingleton().activate(self) |
---|
| 1833 | return |
---|
| 1834 | def deactivate(self): |
---|
| 1835 | """Deactivates this screen. |
---|
| 1836 | """ |
---|
| 1837 | ScreenManager.getSingleton().deactivate(self) |
---|
| 1838 | return |
---|
| 1839 | def resize(self): |
---|
| 1840 | """Resize notification from child widget. |
---|
| 1841 | """ |
---|
| 1842 | Blender.Draw.Redraw(1) |
---|
| 1843 | return |
---|
| 1844 | def getScissorRectangle(self): |
---|
| 1845 | return self.scissorRectangle |
---|
| 1846 | def _addWidget(self, widget): |
---|
| 1847 | """Adds a child widget. |
---|
| 1848 | |
---|
| 1849 | @param widget Child widget to add. |
---|
| 1850 | """ |
---|
| 1851 | if self.widget: |
---|
| 1852 | self.widget.removeFromParent() |
---|
| 1853 | self.widget = widget |
---|
| 1854 | return |
---|
| 1855 | def _removeWidget(self, widget): |
---|
| 1856 | """Removes a child widget. |
---|
| 1857 | |
---|
| 1858 | @param widget Child widget to remove. |
---|
| 1859 | """ |
---|
| 1860 | if (self.widget == widget): |
---|
| 1861 | self.widget = None |
---|
| 1862 | Widget(self) |
---|
| 1863 | return |
---|
| 1864 | def _addButtonAction(self, action): |
---|
| 1865 | """Registers an action for a button event. |
---|
| 1866 | |
---|
| 1867 | @param action Action to execute on receive of the returned button event number. |
---|
| 1868 | @return Event number to use for the button that corresponds to that action. |
---|
| 1869 | """ |
---|
| 1870 | # workaround for Blender 2.37 event 8 bug: |
---|
| 1871 | shiftEvents = 100 |
---|
| 1872 | # get a free event number |
---|
| 1873 | if (len(self.buttonEventDict) == self.nButtonEvent): |
---|
| 1874 | self.nButtonEvent += 1 |
---|
| 1875 | eventNumber = self.nButtonEvent + shiftEvents |
---|
| 1876 | else: |
---|
| 1877 | eventNumber = [(x+1+shiftEvents) for x in range(self.nButtonEvent) if (x+1+shiftEvents) not in self.buttonEventDict.keys()][0] |
---|
| 1878 | # assign action to that event |
---|
| 1879 | self.buttonEventDict[eventNumber] = action |
---|
| 1880 | return eventNumber |
---|
| 1881 | def _removeButtonAction(self, eventNumber): |
---|
| 1882 | """Action for the given event number will no longer be called. |
---|
| 1883 | |
---|
| 1884 | @param eventNumber Event number for the action. |
---|
| 1885 | """ |
---|
| 1886 | if self.buttonEventDict.has_key(eventNumber): |
---|
| 1887 | del self.buttonEventDict[eventNumber] |
---|
| 1888 | return |
---|
| 1889 | # callbacks for Blender.Draw.Register |
---|
| 1890 | def _draw(self): |
---|
| 1891 | """Draws the screen. |
---|
| 1892 | |
---|
| 1893 | Callback function for Blender.Draw.Register |
---|
| 1894 | """ |
---|
| 1895 | # clear background |
---|
| 1896 | theme = Blender.Window.Theme.Get()[0] |
---|
| 1897 | bgColor = [color/255.0 for color in theme.get('buts').back] |
---|
| 1898 | glClearColor(*bgColor) |
---|
| 1899 | glClear(GL_COLOR_BUFFER_BIT) |
---|
| 1900 | # scissor box: [lower-left-x, lower-left-y, width, height] |
---|
| 1901 | scissorBox = Blender.BGL.Buffer(GL_INT, 4) |
---|
| 1902 | Blender.BGL.glGetIntegerv(Blender.BGL.GL_SCISSOR_BOX, scissorBox) |
---|
| 1903 | self.scissorRectangle = [scissorBox[0], scissorBox[1], scissorBox[0] + scissorBox[2], scissorBox[1] + scissorBox[3]] |
---|
| 1904 | # size of the script window |
---|
| 1905 | size = list(Blender.Window.GetAreaSize()) |
---|
| 1906 | minimumSize = self.widget.getSize().getMinimumSize() |
---|
| 1907 | if size[0] < minimumSize[0]: |
---|
| 1908 | size[0] = minimumSize[0] |
---|
| 1909 | if size[1] < minimumSize[1]: |
---|
| 1910 | size[1] = minimumSize[1] |
---|
| 1911 | screenRect = [0, 0, size[0]-1, size[1]-1] |
---|
| 1912 | # draw widgets |
---|
| 1913 | self.widget.draw(screenRect) |
---|
| 1914 | return |
---|
| 1915 | def _eventHandler(self, event, value): |
---|
| 1916 | """Handles keyboard and mouse input events. |
---|
| 1917 | |
---|
| 1918 | Callback function for Blender.Draw.Register |
---|
| 1919 | """ |
---|
| 1920 | self.widget.eventFilter(event, value) |
---|
| 1921 | return |
---|
| 1922 | def _buttonHandler(self, event): |
---|
| 1923 | """Handles draw button events. |
---|
| 1924 | |
---|
| 1925 | Callback function for Blender.Draw.Register |
---|
| 1926 | """ |
---|
| 1927 | if self.buttonEventDict.has_key(event): |
---|
| 1928 | self.buttonEventDict[event].execute() |
---|
| 1929 | return |
---|
| 1930 | |
---|
| 1931 | class ScreenManager(Singleton): |
---|
| 1932 | """Manages screens. |
---|
| 1933 | """ |
---|
| 1934 | def __init__(self): |
---|
| 1935 | Singleton.__init__(self) |
---|
| 1936 | # current active screen is on top |
---|
| 1937 | self.screenStack = [] |
---|
| 1938 | return |
---|
| 1939 | def activate(self, screen): |
---|
| 1940 | """Activates a screen. |
---|
| 1941 | |
---|
| 1942 | This method calls Blender.Draw.Register to register a screen to |
---|
| 1943 | be responsible for windowing. |
---|
| 1944 | """ |
---|
| 1945 | self.screenStack.append(screen) |
---|
| 1946 | Blender.Draw.Register(screen._draw, screen._eventHandler, screen._buttonHandler) |
---|
| 1947 | Blender.Draw.Draw() |
---|
| 1948 | return |
---|
| 1949 | def deactivate(self, screen): |
---|
| 1950 | """Deactivates a screen. |
---|
| 1951 | |
---|
| 1952 | If the screen is the current displayed screen, the next screen on the stack |
---|
| 1953 | of activated screens will be reactivated. If there is no screen left, an empty |
---|
| 1954 | screen will be displayed. |
---|
| 1955 | """ |
---|
| 1956 | if screen in self.screenStack: |
---|
| 1957 | position = self.screenStack.index(screen) |
---|
| 1958 | self.screenStack.remove(screen) |
---|
| 1959 | if (position == len(self.screenStack)): |
---|
| 1960 | # screen was current active |
---|
| 1961 | if len(self.screenStack): |
---|
| 1962 | screen = self.screenStack.pop() |
---|
| 1963 | self.activate(screen) |
---|
| 1964 | else: |
---|
| 1965 | # empty screen |
---|
| 1966 | Blender.Draw.Register() |
---|
| 1967 | Blender.Draw.Draw() |
---|
| 1968 | return |
---|
| 1969 | def getScissorRectangle(self): |
---|
| 1970 | if len(self.screenStack): |
---|
| 1971 | scissorRectangle = self.screenStack[-1].getScissorRectangle() |
---|
| 1972 | else: |
---|
| 1973 | scissorRectangle = [0, 0, 0, 0] |
---|
| 1974 | return scissorRectangle |
---|