├── __init__.py ├── docs └── images │ ├── hum.png │ ├── 1kHz_Analog.png │ ├── 1kHz_Combined.png │ ├── 1kHz_Digitized.png │ └── D43-Screenshot.png ├── icons ├── D43-Icon.png ├── mac │ ├── D43.icns │ ├── D43.png │ └── generate_icns.sh └── windows │ └── D43-Icon.ico ├── .ropeproject ├── history ├── objectdb └── config.py ├── requirements.txt ├── CameraMount ├── bezel_new.png ├── camera_finished_mm.stl ├── cameramount_tubedrillingpattern.svg ├── bezel.svg └── cameramount.svg ├── .eric6project ├── project-apis.db ├── DigitalD43.e6t └── DigitalD43.e4q ├── D43_Resources.qrc ├── Forms ├── __pycache__ │ ├── Ui_Main.cpython-36.pyc │ ├── WebCamView.cpython-36.pyc │ └── Ui_WebCamView.cpython-36.pyc ├── Cursor_Enums.py ├── Cursor.py ├── Grid.ui ├── Ui_Grid.py ├── WebCamView.ui ├── WebCamView.py ├── Ui_WebCamView.py ├── Main.ui ├── Grid.py ├── Ui_Main.py ├── DigitizerView.py ├── CursorControl.py ├── Controls.py ├── Ui_Controls.py └── icons_rc.py ├── D43.py ├── README.md ├── .gitignore ├── .github └── workflows │ └── build.yml ├── DigitalD43.e4p └── LICENSE /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/images/hum.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/hum.png -------------------------------------------------------------------------------- /icons/D43-Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/D43-Icon.png -------------------------------------------------------------------------------- /icons/mac/D43.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/mac/D43.icns -------------------------------------------------------------------------------- /icons/mac/D43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/mac/D43.png -------------------------------------------------------------------------------- /.ropeproject/history: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/.ropeproject/history -------------------------------------------------------------------------------- /.ropeproject/objectdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/.ropeproject/objectdb -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | quantiphy 2 | numpy 3 | PyQt5 4 | opencv-python-headless 5 | pyinstaller 6 | -------------------------------------------------------------------------------- /CameraMount/bezel_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/CameraMount/bezel_new.png -------------------------------------------------------------------------------- /icons/windows/D43-Icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/icons/windows/D43-Icon.ico -------------------------------------------------------------------------------- /.eric6project/project-apis.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/.eric6project/project-apis.db -------------------------------------------------------------------------------- /docs/images/1kHz_Analog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/1kHz_Analog.png -------------------------------------------------------------------------------- /docs/images/1kHz_Combined.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/1kHz_Combined.png -------------------------------------------------------------------------------- /docs/images/1kHz_Digitized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/1kHz_Digitized.png -------------------------------------------------------------------------------- /docs/images/D43-Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/docs/images/D43-Screenshot.png -------------------------------------------------------------------------------- /CameraMount/camera_finished_mm.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/CameraMount/camera_finished_mm.stl -------------------------------------------------------------------------------- /D43_Resources.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | icons/D43-Icon.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /Forms/__pycache__/Ui_Main.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/Forms/__pycache__/Ui_Main.cpython-36.pyc -------------------------------------------------------------------------------- /Forms/__pycache__/WebCamView.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/Forms/__pycache__/WebCamView.cpython-36.pyc -------------------------------------------------------------------------------- /Forms/__pycache__/Ui_WebCamView.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JosephEoff/D43/HEAD/Forms/__pycache__/Ui_WebCamView.cpython-36.pyc -------------------------------------------------------------------------------- /Forms/Cursor_Enums.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | class CursorType(Enum): 4 | vertical = 1 5 | horizontal = 2 6 | zeroline = 3 7 | 8 | class CursorStyle(Enum): 9 | single = 1 10 | barred = 2 11 | 12 | -------------------------------------------------------------------------------- /.eric6project/DigitalD43.e6t: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.eric6project/DigitalD43.e4q: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /D43.py: -------------------------------------------------------------------------------- 1 | from PyQt5 import QtWidgets 2 | from PyQt5.QtCore import QCoreApplication 3 | from Forms.Ui_Main import Ui_MainWindow 4 | 5 | if __name__ == "__main__": 6 | QCoreApplication.setOrganizationName("JRE") 7 | QCoreApplication.setApplicationName("DigitalD43") 8 | QCoreApplication.setApplicationVersion('1.0.0') 9 | import sys 10 | app = QtWidgets.QApplication(sys.argv) 11 | MainWindow = QtWidgets.QMainWindow() 12 | ui = Ui_MainWindow() 13 | ui.setupUi(MainWindow) 14 | MainWindow.show() 15 | sys.exit(app.exec_()) 16 | -------------------------------------------------------------------------------- /icons/mac/generate_icns.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | mkdir $1.iconset 4 | convert $1.png -resize 16x16 $1.iconset/icon_16x16.png 5 | #convert $1.png -resize 32x32 $1.iconset/icon_16x16@2x.png 6 | convert $1.png -resize 32x32 $1.iconset/icon_32x32.png 7 | #convert $1.png -resize 64x64 $1.iconset/icon_32x32@2x.png 8 | convert $1.png -resize 128x128 $1.iconset/icon_128x128.png 9 | #convert $1.png -resize 256x256 $1.iconset/icon_128x128@2x.png 10 | convert $1.png -resize 256x256 $1.iconset/icon_256x256.png 11 | #convert $1.png -resize 512x512 $1.iconset/icon_256x256@2x.png 12 | convert $1.png -resize 512x512 $1.iconset/icon_512x512.png 13 | cp $1.png $1.iconset/icon_1024x1024.png 14 | png2icns $1.icns $1.iconset/icon_*.png 15 | 16 | rm -R $1.iconset 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Digital D43 - A digital camera for analog oscilloscopes 3 | 4 | Make crisp images of your analog oscilloscope for documenting or sharing your experiments. 5 | 6 | ![Digital D-43 Screenshot](/docs/images/D43-Screenshot.png) 7 | 8 | View the trace live: 9 | 10 | ![Live view](/docs/images/1kHz_Analog.png) 11 | 12 | Or digitized: 13 | 14 | ![Digitized view](/docs/images/1kHz_Digitized.png) 15 | 16 | Or combined: 17 | 18 | ![Combined view](/docs/images/1kHz_Combined.png) 19 | 20 | Use the onscreen cursors to measure voltage and frequency. 21 | 22 | You can download a pre-compiled binary [here.](https://github.com/JosephEoff/D43/releases) 23 | 24 | See the [Wiki](https://github.com/JosephEoff/D43/wiki) for a description of the manual installation and the setup of the D43 software. 25 | 26 | You will need Python 3.6 or higher, the Python OpenCV2 library, PyQt5, Numpy, and Quantiphy installed. 27 | -------------------------------------------------------------------------------- /Forms/Cursor.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtGui import QColor 2 | 3 | from Forms.Cursor_Enums import CursorType 4 | from Forms.Cursor_Enums import CursorStyle 5 | 6 | class Cursor(): 7 | def __init__(self, position, cursorColor, cursorBarColor, cursorType = CursorType.horizontal, cursorStyle = CursorStyle.barred ): 8 | self.cursorType = cursorType 9 | self.cursorStyle = cursorStyle 10 | self.cursorPosition = position 11 | 12 | self.cursorColor = QColor() 13 | self.cursorBarColor = QColor() 14 | self.cursorColor = cursorColor 15 | self.cursorBarColor = cursorBarColor 16 | 17 | 18 | def setCursorPosition(self, newPosition): 19 | self.cursorPosition = newPosition 20 | 21 | def getCursorPosition(self): 22 | return self.cursorPosition 23 | 24 | def getStyle(self): 25 | return self.cursorStyle 26 | 27 | def getType(self): 28 | return self.cursorType 29 | 30 | def getColor(self): 31 | return self.cursorColor 32 | 33 | def getBarColor(self): 34 | return self.cursorBarColor 35 | -------------------------------------------------------------------------------- /Forms/Grid.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Grid 4 | 5 | 6 | 7 | 0 8 | 0 9 | 102 10 | 78 11 | 12 | 13 | 14 | 15 | 0 16 | 0 17 | 18 | 19 | 20 | 21 | 50 22 | 50 23 | 24 | 25 | 26 | Form 27 | 28 | 29 | 30 | 0 31 | 32 | 33 | 0 34 | 35 | 36 | 0 37 | 38 | 39 | 0 40 | 41 | 42 | 0 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Forms/Ui_Grid.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/Grid.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.10.1 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_Grid(object): 12 | def setupUi(self, Grid): 13 | Grid.setObjectName("Grid") 14 | Grid.resize(102, 78) 15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) 16 | sizePolicy.setHorizontalStretch(0) 17 | sizePolicy.setVerticalStretch(0) 18 | sizePolicy.setHeightForWidth(Grid.sizePolicy().hasHeightForWidth()) 19 | Grid.setSizePolicy(sizePolicy) 20 | Grid.setMinimumSize(QtCore.QSize(50, 50)) 21 | self.gridLayout = QtWidgets.QGridLayout(Grid) 22 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 23 | self.gridLayout.setSpacing(0) 24 | self.gridLayout.setObjectName("gridLayout") 25 | 26 | self.retranslateUi(Grid) 27 | QtCore.QMetaObject.connectSlotsByName(Grid) 28 | 29 | def retranslateUi(self, Grid): 30 | _translate = QtCore.QCoreApplication.translate 31 | Grid.setWindowTitle(_translate("Grid", "Form")) 32 | 33 | 34 | if __name__ == "__main__": 35 | import sys 36 | app = QtWidgets.QApplication(sys.argv) 37 | Grid = QtWidgets.QWidget() 38 | ui = Ui_Grid() 39 | ui.setupUi(Grid) 40 | Grid.show() 41 | sys.exit(app.exec_()) 42 | 43 | -------------------------------------------------------------------------------- /Forms/WebCamView.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | WebCamView 4 | 5 | 6 | 7 | 0 8 | 0 9 | 102 10 | 120 11 | 12 | 13 | 14 | 15 | 0 16 | 0 17 | 18 | 19 | 20 | 21 | 50 22 | 50 23 | 24 | 25 | 26 | Form 27 | 28 | 29 | 30 | 0 31 | 32 | 33 | 0 34 | 35 | 36 | 0 37 | 38 | 39 | 0 40 | 41 | 42 | 0 43 | 44 | 45 | 46 | 47 | 48 | 0 49 | 0 50 | 51 | 52 | 53 | 54 | 50 55 | 50 56 | 57 | 58 | 59 | background-color: rgba(0, 0, 0, 0); 60 | 61 | 62 | QFrame::NoFrame 63 | 64 | 65 | QFrame::Plain 66 | 67 | 68 | 0 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | local_settings.py 60 | db.sqlite3 61 | db.sqlite3-journal 62 | 63 | # Flask stuff: 64 | instance/ 65 | .webassets-cache 66 | 67 | # Scrapy stuff: 68 | .scrapy 69 | 70 | # Sphinx documentation 71 | docs/_build/ 72 | 73 | # PyBuilder 74 | target/ 75 | 76 | # Jupyter Notebook 77 | .ipynb_checkpoints 78 | 79 | # IPython 80 | profile_default/ 81 | ipython_config.py 82 | 83 | # pyenv 84 | .python-version 85 | 86 | # pipenv 87 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 88 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 89 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 90 | # install all needed dependencies. 91 | #Pipfile.lock 92 | 93 | # celery beat schedule file 94 | celerybeat-schedule 95 | 96 | # SageMath parsed files 97 | *.sage.py 98 | 99 | # Environments 100 | .env 101 | .venv 102 | env/ 103 | venv/ 104 | ENV/ 105 | env.bak/ 106 | venv.bak/ 107 | 108 | # Spyder project settings 109 | .spyderproject 110 | .spyproject 111 | 112 | # Rope project settings 113 | .ropeproject 114 | 115 | # mkdocs documentation 116 | /site 117 | 118 | # mypy 119 | .mypy_cache/ 120 | .dmypy.json 121 | dmypy.json 122 | 123 | # Pyre type checker 124 | .pyre/ 125 | -------------------------------------------------------------------------------- /Forms/WebCamView.py: -------------------------------------------------------------------------------- 1 | from PyQt5 import QtGui 2 | from PyQt5.QtWidgets import QWidget 3 | from Forms.Ui_WebCamView import Ui_WebCamView 4 | import numpy as np 5 | import cv2 6 | 7 | class WebCamView(QWidget, Ui_WebCamView): 8 | def __init__(self, parent): 9 | super(QWidget, self).__init__() 10 | 11 | self.setupUi(self) 12 | self.transparentThreshold = 0 13 | self.thresholdMode = cv2.THRESH_BINARY 14 | self.rescaled=False 15 | self.persist = False 16 | self.persistImage = None 17 | self.liveViewOn = True 18 | 19 | def clearImage(self): 20 | self.viewer.clear() 21 | 22 | def setPersist(self, persistOn): 23 | self.persist = persistOn 24 | self.persistImage = None 25 | 26 | def setLiveViewOn(self, On): 27 | self.liveViewOn = On 28 | 29 | def getCurrentImage(self): 30 | return self.persistImage 31 | 32 | def setImage(self, scopeImage): 33 | grayframe = cv2.cvtColor(scopeImage, cv2.COLOR_RGB2GRAY) 34 | ret, alpha = cv2.threshold(grayframe, self.transparentThreshold, 255, self.thresholdMode) 35 | 36 | blue = scopeImage[:, :, 0] 37 | green = scopeImage[:, :, 1] 38 | red = scopeImage[:, :, 2] 39 | 40 | rgba = [blue,green,red, alpha] 41 | scopeImage= cv2.merge(rgba,4) 42 | if self.persist: 43 | scopeImage = self.doImagePersistance(scopeImage, green) 44 | 45 | self.persistImage = scopeImage 46 | if not self.liveViewOn: 47 | return 48 | img = QtGui.QImage(scopeImage, scopeImage.shape[1], scopeImage.shape[0], QtGui.QImage.Format_RGBA8888) 49 | pix = QtGui.QPixmap.fromImage(img) 50 | self.viewer.setPixmap(pix) 51 | 52 | def doImagePersistance(self, scopeImage, green): 53 | if self.persistImage is None: 54 | self.persistImage = scopeImage 55 | return scopeImage 56 | 57 | if self.persistImage.shape != scopeImage.shape: 58 | self.persistImage = scopeImage 59 | 60 | threshold = np.amax(self.persistImage[:, :, 1]) * 0.8 61 | bright = np.where(green.max(0) >= threshold)[0] 62 | if bright.size>0: 63 | for x in np.nditer(bright): 64 | self.persistImage[:, x] = scopeImage[:, x] 65 | 66 | return self.persistImage 67 | 68 | 69 | -------------------------------------------------------------------------------- /Forms/Ui_WebCamView.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/WebCamView.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.10.1 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_WebCamView(object): 12 | def setupUi(self, WebCamView): 13 | WebCamView.setObjectName("WebCamView") 14 | WebCamView.resize(102, 120) 15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) 16 | sizePolicy.setHorizontalStretch(0) 17 | sizePolicy.setVerticalStretch(0) 18 | sizePolicy.setHeightForWidth(WebCamView.sizePolicy().hasHeightForWidth()) 19 | WebCamView.setSizePolicy(sizePolicy) 20 | WebCamView.setMinimumSize(QtCore.QSize(50, 50)) 21 | self.gridLayout = QtWidgets.QGridLayout(WebCamView) 22 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 23 | self.gridLayout.setSpacing(0) 24 | self.gridLayout.setObjectName("gridLayout") 25 | self.viewer = QtWidgets.QLabel(WebCamView) 26 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 27 | sizePolicy.setHorizontalStretch(0) 28 | sizePolicy.setVerticalStretch(0) 29 | sizePolicy.setHeightForWidth(self.viewer.sizePolicy().hasHeightForWidth()) 30 | self.viewer.setSizePolicy(sizePolicy) 31 | self.viewer.setMinimumSize(QtCore.QSize(50, 50)) 32 | self.viewer.setStyleSheet("background-color: rgba(0, 0, 0, 0);") 33 | self.viewer.setFrameShape(QtWidgets.QFrame.NoFrame) 34 | self.viewer.setFrameShadow(QtWidgets.QFrame.Plain) 35 | self.viewer.setLineWidth(0) 36 | self.viewer.setText("") 37 | self.viewer.setObjectName("viewer") 38 | self.gridLayout.addWidget(self.viewer, 0, 0, 1, 1, QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 39 | 40 | self.retranslateUi(WebCamView) 41 | QtCore.QMetaObject.connectSlotsByName(WebCamView) 42 | 43 | def retranslateUi(self, WebCamView): 44 | _translate = QtCore.QCoreApplication.translate 45 | WebCamView.setWindowTitle(_translate("WebCamView", "Form")) 46 | 47 | 48 | if __name__ == "__main__": 49 | import sys 50 | app = QtWidgets.QApplication(sys.argv) 51 | WebCamView = QtWidgets.QWidget() 52 | ui = Ui_WebCamView() 53 | ui.setupUi(WebCamView) 54 | WebCamView.show() 55 | sys.exit(app.exec_()) 56 | 57 | -------------------------------------------------------------------------------- /Forms/Main.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 293 10 | 215 11 | 12 | 13 | 14 | 15 | 0 16 | 0 17 | 18 | 19 | 20 | D43 - Oscilloscope Camera 21 | 22 | 23 | 24 | :/icons/D43-Icon.png:/icons/D43-Icon.png 25 | 26 | 27 | 28 | 29 | 30 | false 31 | 32 | 33 | QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks 34 | 35 | 36 | 37 | 38 | 0 39 | 0 40 | 41 | 42 | 43 | 44 | QLayout::SetFixedSize 45 | 46 | 47 | 0 48 | 49 | 50 | 0 51 | 52 | 53 | 0 54 | 55 | 56 | 0 57 | 58 | 59 | 0 60 | 61 | 62 | 63 | 64 | 65 | 0 66 | 0 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | Controls 77 | QWidget 78 |
Forms.Controls
79 | 1 80 |
81 |
82 | 83 | 84 | 85 | 86 |
87 | -------------------------------------------------------------------------------- /Forms/Grid.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtGui import QPainter, QColor, QPen, QPixmap 2 | from PyQt5.QtWidgets import QWidget 3 | from PyQt5.QtCore import Qt 4 | 5 | from Forms.Ui_WebCamView import Ui_WebCamView 6 | 7 | class Grid(QWidget, Ui_WebCamView): 8 | def __init__(self, parent): 9 | super(QWidget, self).__init__() 10 | 11 | self.setupUi(self) 12 | self.pixelsPercm_H=30 13 | self.pixelsPercm_V=30 14 | self.gridWidth = 100 15 | self.gridHeight = 100 16 | self.grid_X1 = 0 17 | self.grid_X2 = 100 18 | self.grid_Y1 = 0 19 | self.grid_Y2 = 100 20 | 21 | def paintEvent(self, event): 22 | self.drawGrid() 23 | 24 | def drawGrid(self): 25 | gridPixmap = QPixmap(self.gridWidth + 1, self.gridHeight) 26 | gridPixmap.fill(QColor(255, 255, 255, 0)) 27 | 28 | qp = QPainter() 29 | qp.begin(gridPixmap) 30 | pen = QPen(QColor(255, 120, 0, 100), 1, Qt.SolidLine) 31 | qp.setPen(pen) 32 | cwidth= (self.grid_X1 + self.grid_X2)/2 33 | cheight= (self.grid_Y1+self.grid_Y2)/2 34 | hcount=cwidth/self.pixelsPercm_H + 1 35 | vcount=cheight/self.pixelsPercm_V + 1 36 | 37 | for n in range(int(hcount+0.5)): 38 | xstep= n*self.pixelsPercm_H 39 | qp.drawLine(cwidth+xstep, 0, cwidth+xstep, self.gridHeight) 40 | if n>0: 41 | qp.drawLine(cwidth-xstep, 0, cwidth-xstep, self.gridHeight) 42 | 43 | for n in range(int(vcount+0.5)): 44 | ystep= n*self.pixelsPercm_H 45 | qp.drawLine(0, cheight+ystep, self.gridWidth , cheight+ystep) 46 | if n>0: 47 | qp.drawLine(0, cheight-ystep, self.gridWidth , cheight-ystep) 48 | 49 | qp.end() 50 | self.viewer.setPixmap(gridPixmap) 51 | 52 | def updateGridSize(self, width, height): 53 | if self.gridHeight == height and self.gridWidth == width: 54 | return 55 | self.gridHeight = height 56 | self.gridWidth = width 57 | self.drawGrid() 58 | 59 | def updateGridSpacing(self, X1, X2, Y1, Y2, horizontalDivisions, verticalDivisions): 60 | self.grid_X1 = X1 61 | self.grid_X2 = X2 62 | self.grid_Y1 = Y1 63 | self.grid_Y2 = Y2 64 | self.pixelsPercm_H = abs(X2- X1)/horizontalDivisions 65 | self.pixelsPercm_V = abs(Y2-Y1)/verticalDivisions 66 | self.drawGrid() 67 | 68 | def getPixelsPerDivision_Horizontal(self): 69 | return self.pixelsPercm_H 70 | 71 | def getPixelsPerDivision_Vertical(self): 72 | return self.pixelsPercm_V 73 | 74 | 75 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 7 | 8 | jobs: 9 | 10 | createrelease: 11 | name: Create Release 12 | runs-on: [ubuntu-latest] 13 | steps: 14 | - name: Create Release 15 | id: create_release 16 | uses: actions/create-release@v1 17 | env: 18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 19 | with: 20 | tag_name: ${{ github.ref }} 21 | release_name: Release ${{ github.ref }} 22 | draft: false 23 | prerelease: false 24 | - name: Output Release URL File 25 | run: echo "${{ steps.create_release.outputs.upload_url }}" > release_url.txt 26 | - name: Save Release URL File for publish 27 | uses: actions/upload-artifact@v1 28 | with: 29 | name: release_url 30 | path: release_url.txt 31 | 32 | build: 33 | name: Build packages 34 | needs: createrelease 35 | runs-on: ${{ matrix.os }} 36 | strategy: 37 | matrix: 38 | include: 39 | - os: macos-latest 40 | TARGET: macos 41 | CMD_BUILD: > 42 | pyinstaller -F -w -n D43 -i icons/mac/D43.icns D43.py && 43 | cd dist/ && 44 | zip -r9 D43 D43.app/ 45 | OUT_FILE_NAME: D43.zip 46 | ASSET_MIME: application/zip 47 | - os: windows-latest 48 | TARGET: windows 49 | CMD_BUILD: pyinstaller -F -w -n D43 -i icons/windows/D43-Icon.ico D43.py 50 | OUT_FILE_NAME: D43.exe 51 | ASSET_MIME: application/vnd.microsoft.portable-executable 52 | - os: ubuntu-18.04 53 | TARGET: ubuntu 54 | CMD_BUILD: pyinstaller -F -w -n D43 D43.py 55 | OUT_FILE_NAME: D43 56 | ASSET_MIME: application/x-sharedlib 57 | steps: 58 | - uses: actions/checkout@v1 59 | - name: Set up Python 3.7 60 | uses: actions/setup-python@v2 61 | with: 62 | python-version: 3.7 63 | - name: Install dependencies 64 | run: | 65 | python -m pip install --upgrade pip 66 | pip install -r requirements.txt 67 | - name: Build with pyinstaller for ${{matrix.TARGET}} 68 | run: ${{matrix.CMD_BUILD}} 69 | - name: Load Release URL File from release job 70 | uses: actions/download-artifact@v1 71 | with: 72 | name: release_url 73 | - name: Get Release File Name & Upload URL 74 | id: get_release_info 75 | shell: bash 76 | run: | 77 | value=`cat release_url/release_url.txt` 78 | echo ::set-output name=upload_url::$value 79 | - name: Upload Release Asset 80 | id: upload-release-asset 81 | uses: actions/upload-release-asset@v1 82 | env: 83 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 84 | with: 85 | upload_url: ${{ steps.get_release_info.outputs.upload_url }} 86 | asset_path: ./dist/${{ matrix.OUT_FILE_NAME}} 87 | asset_name: ${{ matrix.OUT_FILE_NAME}} 88 | asset_content_type: ${{ matrix.ASSET_MIME}} 89 | -------------------------------------------------------------------------------- /Forms/Ui_Main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/Main.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.10.1 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_MainWindow(object): 12 | def setupUi(self, MainWindow): 13 | MainWindow.setObjectName("MainWindow") 14 | MainWindow.resize(293, 215) 15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 16 | sizePolicy.setHorizontalStretch(0) 17 | sizePolicy.setVerticalStretch(0) 18 | sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) 19 | MainWindow.setSizePolicy(sizePolicy) 20 | icon = QtGui.QIcon() 21 | icon.addPixmap(QtGui.QPixmap(":/icons/D43-Icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 22 | MainWindow.setWindowIcon(icon) 23 | MainWindow.setStyleSheet("") 24 | MainWindow.setAnimated(False) 25 | MainWindow.setDockOptions(QtWidgets.QMainWindow.AllowNestedDocks|QtWidgets.QMainWindow.AllowTabbedDocks) 26 | self.centralWidget = QtWidgets.QWidget(MainWindow) 27 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 28 | sizePolicy.setHorizontalStretch(0) 29 | sizePolicy.setVerticalStretch(0) 30 | sizePolicy.setHeightForWidth(self.centralWidget.sizePolicy().hasHeightForWidth()) 31 | self.centralWidget.setSizePolicy(sizePolicy) 32 | self.centralWidget.setObjectName("centralWidget") 33 | self.gridLayout = QtWidgets.QGridLayout(self.centralWidget) 34 | self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) 35 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 36 | self.gridLayout.setSpacing(0) 37 | self.gridLayout.setObjectName("gridLayout") 38 | self.widgetScope = Controls(self.centralWidget) 39 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 40 | sizePolicy.setHorizontalStretch(0) 41 | sizePolicy.setVerticalStretch(0) 42 | sizePolicy.setHeightForWidth(self.widgetScope.sizePolicy().hasHeightForWidth()) 43 | self.widgetScope.setSizePolicy(sizePolicy) 44 | self.widgetScope.setObjectName("widgetScope") 45 | self.gridLayout.addWidget(self.widgetScope, 0, 0, 1, 1) 46 | MainWindow.setCentralWidget(self.centralWidget) 47 | 48 | self.retranslateUi(MainWindow) 49 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 50 | 51 | def retranslateUi(self, MainWindow): 52 | _translate = QtCore.QCoreApplication.translate 53 | MainWindow.setWindowTitle(_translate("MainWindow", "D43 - Oscilloscope Camera")) 54 | 55 | from Forms.Controls import Controls 56 | import D43_Resources_rc 57 | 58 | if __name__ == "__main__": 59 | import sys 60 | app = QtWidgets.QApplication(sys.argv) 61 | MainWindow = QtWidgets.QMainWindow() 62 | ui = Ui_MainWindow() 63 | ui.setupUi(MainWindow) 64 | MainWindow.show() 65 | sys.exit(app.exec_()) 66 | 67 | -------------------------------------------------------------------------------- /Forms/DigitizerView.py: -------------------------------------------------------------------------------- 1 | from PyQt5 import QtGui 2 | from PyQt5.QtWidgets import QWidget 3 | from PyQt5.QtCore import QLineF 4 | from Forms.Ui_WebCamView import Ui_WebCamView 5 | import numpy as np 6 | 7 | class DigitizerView(QWidget, Ui_WebCamView): 8 | def __init__(self, parent): 9 | super(QWidget, self).__init__() 10 | 11 | self.setupUi(self) 12 | self.range_X1 = 100 13 | self.range_X2 = 200 14 | self.lineMode = False 15 | self.traceColor = QtGui.QColor(255, 0, 0) 16 | self.ScopeImage = None #np.zeros((200, 200, 3)) 17 | self.DigitizedData = None #np.zeros((200, 200)) 18 | self.triggered = False 19 | 20 | def clearImage(self): 21 | self.viewer.clear() 22 | 23 | def setLineMode(self, lineModeOn): 24 | self.lineMode=lineModeOn 25 | 26 | def setDigitizingRange(self, X1, X2): 27 | self.range_X1 = X1 28 | self.range_X2 = X2 29 | 30 | def setImage(self, scopeImage): 31 | if scopeImage is None: 32 | return 33 | self.ScopeImage = scopeImage 34 | self.digitizeImage() 35 | 36 | def paintEvent(self, event): 37 | self.redrawImage() 38 | 39 | def redrawImage(self): 40 | if self.ScopeImage is None: 41 | return 42 | 43 | digipix= QtGui.QPixmap(self.ScopeImage.shape[1], self.ScopeImage.shape[0]) 44 | digipix.fill(QtGui.QColor(0, 0, 0, 0)) 45 | 46 | if self.lineMode: 47 | self.drawLines(self.DigitizedData, digipix) 48 | else: 49 | self.drawDots(self.DigitizedData, digipix) 50 | 51 | def digitizeImage(self): 52 | #b, g, r , a = cv2.split(self.ScopeImage) 53 | 54 | green = self.ScopeImage[:, :, 1] 55 | trigger = np.max(green, axis=0) 56 | if len(trigger[np.where(trigger > 20)]) > abs(self.range_X1- self.range_X2)*0.9: 57 | self.triggered = True 58 | else: 59 | self.triggered = False 60 | 61 | spots = np.argmax(green, axis=0) 62 | self.DigitizedData = spots 63 | 64 | def drawDots(self, spots, digipix): 65 | qp = QtGui.QPainter() 66 | qp.begin(digipix) 67 | qp.setPen(self.traceColor) 68 | for x in range(self.range_X1, self.range_X2): 69 | qp.drawPoint( x, spots[x]) 70 | qp.end() 71 | 72 | self.viewer.setPixmap(digipix) 73 | 74 | def drawLines(self, spots, digipix): 75 | lines = [] 76 | for x in range(self.range_X1, self.range_X2): 77 | line = QLineF(x, spots[x], x+1, spots[x+1]) 78 | lines.append(line) 79 | 80 | qp = QtGui.QPainter() 81 | qp.begin(digipix) 82 | qp.setPen(self.traceColor) 83 | qp.drawLines(lines) 84 | qp.end() 85 | 86 | self.viewer.setPixmap(digipix) 87 | 88 | def getDigitizedData(self): 89 | return self.DigitizedData 90 | 91 | def getRange(self): 92 | return self.range_X1, self.range_X2 93 | 94 | def isTriggered(self): 95 | return self.triggered 96 | 97 | def resetTrigger(self): 98 | self.triggered = False 99 | -------------------------------------------------------------------------------- /CameraMount/cameramount_tubedrillingpattern.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 39 | 41 | 42 | 44 | image/svg+xml 45 | 47 | 48 | 49 | 50 | 51 | 55 | 58 | 65 | 72 | 79 | 80 | 83 | 90 | 97 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /.ropeproject/config.py: -------------------------------------------------------------------------------- 1 | # The default ``config.py`` 2 | # flake8: noqa 3 | 4 | 5 | def set_prefs(prefs): 6 | """This function is called before opening the project""" 7 | 8 | # Specify which files and folders to ignore in the project. 9 | # Changes to ignored resources are not added to the history and 10 | # VCSs. Also they are not returned in `Project.get_files()`. 11 | # Note that ``?`` and ``*`` match all characters but slashes. 12 | # '*.pyc': matches 'test.pyc' and 'pkg/test.pyc' 13 | # 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc' 14 | # '.svn': matches 'pkg/.svn' and all of its children 15 | # 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o' 16 | # 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o' 17 | prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject', 18 | '.hg', '.svn', '_svn', '.git', '.tox', 19 | '__pycache__', 20 | '_eric6project', '.eric6project', 21 | ] 22 | 23 | # Specifies which files should be considered python files. It is 24 | # useful when you have scripts inside your project. Only files 25 | # ending with ``.py`` are considered to be python files by 26 | # default. 27 | # prefs['python_files'] = ['*.py'] 28 | 29 | # Custom source folders: By default rope searches the project 30 | # for finding source folders (folders that should be searched 31 | # for finding modules). You can add paths to that list. Note 32 | # that rope guesses project source folders correctly most of the 33 | # time; use this if you have any problems. 34 | # The folders should be relative to project root and use '/' for 35 | # separating folders regardless of the platform rope is running on. 36 | # 'src/my_source_folder' for instance. 37 | # prefs.add('source_folders', 'src') 38 | 39 | # You can extend python path for looking up modules 40 | # prefs.add('python_path', '~/python/') 41 | 42 | # Should rope save object information or not. 43 | prefs['save_objectdb'] = True 44 | prefs['compress_objectdb'] = False 45 | 46 | # If `True`, rope analyzes each module when it is being saved. 47 | prefs['automatic_soa'] = True 48 | # The depth of calls to follow in static object analysis 49 | prefs['soa_followed_calls'] = 0 50 | 51 | # If `False` when running modules or unit tests "dynamic object 52 | # analysis" is turned off. This makes them much faster. 53 | prefs['perform_doa'] = True 54 | 55 | # Rope can check the validity of its object DB when running. 56 | prefs['validate_objectdb'] = True 57 | 58 | # How many undos to hold? 59 | prefs['max_history_items'] = 32 60 | 61 | # Shows whether to save history across sessions. 62 | prefs['save_history'] = True 63 | prefs['compress_history'] = False 64 | 65 | # Set the number spaces used for indenting. According to 66 | # :PEP:`8`, it is best to use 4 spaces. Since most of rope's 67 | # unit-tests use 4 spaces it is more reliable, too. 68 | prefs['indent_size'] = 4 69 | 70 | # Builtin and c-extension modules that are allowed to be imported 71 | # and inspected by rope. 72 | prefs['extension_modules'] = [] 73 | 74 | # Add all standard c-extensions to extension_modules list. 75 | prefs['import_dynload_stdmods'] = True 76 | 77 | # If `True` modules with syntax errors are considered to be empty. 78 | # The default value is `False`; When `False` syntax errors raise 79 | # `rope.base.exceptions.ModuleSyntaxError` exception. 80 | prefs['ignore_syntax_errors'] = False 81 | 82 | # If `True`, rope ignores unresolvable imports. Otherwise, they 83 | # appear in the importing namespace. 84 | prefs['ignore_bad_imports'] = False 85 | 86 | # If `True`, rope will insert new module imports as 87 | # `from import ` by default. 88 | prefs['prefer_module_from_imports'] = False 89 | 90 | # If `True`, rope will transform a comma list of imports into 91 | # multiple separate import statements when organizing 92 | # imports. 93 | prefs['split_imports'] = False 94 | 95 | # If `True`, rope will remove all top-level import statements and 96 | # reinsert them at the top of the module when making changes. 97 | prefs['pull_imports_to_top'] = True 98 | 99 | # If `True`, rope will sort imports alphabetically by module name instead 100 | # of alphabetically by import statement, with from imports after normal 101 | # imports. 102 | prefs['sort_imports_alphabetically'] = False 103 | 104 | # Location of implementation of 105 | # rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general 106 | # case, you don't have to change this value, unless you're an rope expert. 107 | # Change this value to inject you own implementations of interfaces 108 | # listed in module rope.base.oi.type_hinting.providers.interfaces 109 | # For example, you can add you own providers for Django Models, or disable 110 | # the search type-hinting in a class hierarchy, etc. 111 | prefs['type_hinting_factory'] = ( 112 | 'rope.base.oi.type_hinting.factory.default_type_hinting_factory') 113 | 114 | 115 | def project_opened(project): 116 | """This function is called after opening the project""" 117 | # Do whatever you like here! 118 | -------------------------------------------------------------------------------- /DigitalD43.e4p: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | en_US 8 | fb488d2ab10b73481ffb78b8d3487f4532d28877 9 | Python3 10 | PyQt5 11 | A program to capture images from analog oscilloscopes and make on screen measurements. 12 | 0.1 13 | Joseph Eoff 14 | joseph.eoff@molear.de 15 | 16 | 17 | D43.py 18 | D43_Resources_rc.py 19 | Forms/Controls.py 20 | Forms/Cursor.py 21 | Forms/CursorControl.py 22 | Forms/Cursor_Enums.py 23 | Forms/DigitizerView.py 24 | Forms/Grid.py 25 | Forms/Ui_Controls.py 26 | Forms/Ui_Grid.py 27 | Forms/Ui_Main.py 28 | Forms/Ui_WebCamView.py 29 | Forms/WebCamView.py 30 | Forms/icons_rc.py 31 | __init__.py 32 | 33 | 34 |
Forms/Controls.ui
35 |
Forms/Grid.ui
36 |
Forms/Main.ui
37 |
Forms/WebCamView.ui
38 |
39 | 40 | D43_Resources.qrc 41 | 42 | D43.py 43 | 44 | Git 45 | 46 | 47 | 48 | add 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | checkout 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | commit 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | diff 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | export 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | global 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | history 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | log 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | remove 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | status 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | tag 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | update 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 |
168 | -------------------------------------------------------------------------------- /CameraMount/bezel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 43 | 45 | 46 | 48 | image/svg+xml 49 | 51 | 52 | 53 | 54 | 55 | 61 | 66 | 68 | 71 | 77 | 78 | 80 | 82 | 88 | 94 | 95 | 102 | 105 | 111 | 117 | 118 | 124 | 125 | 131 | 132 | 133 | 134 | -------------------------------------------------------------------------------- /Forms/CursorControl.py: -------------------------------------------------------------------------------- 1 | from PyQt5.QtGui import QPainter, QPen , QPixmap , QColor 2 | from PyQt5.QtWidgets import QWidget 3 | from PyQt5.QtCore import Qt, QLineF, pyqtSignal 4 | 5 | from Forms.Ui_WebCamView import Ui_WebCamView 6 | from Forms.Cursor_Enums import CursorType 7 | from Forms.Cursor_Enums import CursorStyle 8 | from Forms.Cursor import Cursor 9 | 10 | class CursorControl(QWidget, Ui_WebCamView): 11 | cursorMoved = pyqtSignal() 12 | 13 | def __init__(self, parent): 14 | super(QWidget, self).__init__() 15 | 16 | self.setupUi(self) 17 | self.parent=parent 18 | 19 | self.setMouseTracking(True) 20 | 21 | self.cursors = [] 22 | self.barWidth= 5 23 | self.cursorWidth = self.width() 24 | self.cursorHeight = self.height() 25 | 26 | self.movingCursor = None 27 | 28 | self.cursor_T1 = None 29 | self.cursor_T2 = None 30 | self.cursor_V1 = None 31 | self.cursor_V2 = None 32 | self.cursor_zero = None 33 | self.addCursors() 34 | 35 | 36 | def addCursors(self): 37 | cursorColor = QColor(0, 186, 255, 100) 38 | cursorBarColor = QColor(0, 186, 255, 255) 39 | 40 | cursor = Cursor(15, cursorColor, cursorBarColor, CursorType.horizontal, CursorStyle.barred) 41 | self.addCursor(cursor) 42 | self.cursor_T1 = cursor 43 | 44 | cursor = Cursor(15, cursorColor, cursorBarColor, CursorType.vertical, CursorStyle.barred) 45 | self.addCursor(cursor) 46 | self.cursor_V1 = cursor 47 | 48 | cursor = Cursor(200, cursorColor, cursorBarColor, CursorType.vertical, CursorStyle.barred) 49 | self.addCursor(cursor) 50 | self.cursor_V2 = cursor 51 | 52 | cursor = Cursor(200, cursorColor, cursorBarColor, CursorType.horizontal, CursorStyle.barred) 53 | self.addCursor(cursor) 54 | self.cursor_T2 = cursor 55 | 56 | cursorColor = QColor(128, 128, 128, 100) 57 | cursorBarColor = QColor(128, 128, 128, 255) 58 | cursor = Cursor(200, cursorColor, cursorBarColor, CursorType.zeroline, CursorStyle.barred) 59 | self.addCursor(cursor) 60 | self.cursor_zero = cursor 61 | 62 | def getX1_pixels(self): 63 | return self.cursor_T1.getCursorPosition() 64 | 65 | def getX2_pixels(self): 66 | return self.cursor_T2.getCursorPosition() 67 | 68 | def getY1_pixels(self): 69 | return self.cursor_V1.getCursorPosition() 70 | 71 | def getY2_pixels(self): 72 | return self.cursor_V2.getCursorPosition() 73 | 74 | def getZero_pixels(self): 75 | return self.cursor_zero.getCursorPosition() 76 | 77 | def mousePressEvent(self, event): 78 | if not event.button() == Qt.LeftButton: 79 | self.movingCursor = None 80 | event.ignore() 81 | return 82 | 83 | cursor = self.getCursor(event.pos()) 84 | if cursor is None: 85 | event.ignore() 86 | return 87 | self.movingCursor = cursor 88 | 89 | def mouseReleaseEvent(self, event): 90 | if event.button() == Qt.LeftButton: 91 | self.movingCursor = None 92 | event.ignore() 93 | 94 | def mouseMoveEvent(self, event): 95 | if self.movingCursor is None: 96 | return 97 | if not (event.buttons() == Qt.LeftButton): 98 | event.ignore() 99 | return 100 | event.accept() 101 | self.changeCursorPosition(self.movingCursor, event.pos()) 102 | #self.drawCursors() 103 | self.cursorMoved.emit() 104 | 105 | def changeCursorPosition(self, cursor, eventPosition): 106 | x = eventPosition.x() 107 | y = eventPosition.y() 108 | if x<1: 109 | x = 1 110 | x = 1 111 | if y<1: 112 | y = 1 113 | if x > self.cursorWidth-2: 114 | x = self.cursorWidth-2 115 | if y > self.cursorHeight-2: 116 | y = self.cursorHeight -2 117 | if cursor.getType() == CursorType.horizontal: 118 | cursor.setCursorPosition(x) 119 | else: 120 | cursor.setCursorPosition(y) 121 | 122 | def getCursor(self, eventPosition): 123 | for cursor in self.cursors: 124 | if self.closeToCursor(cursor, eventPosition): 125 | return cursor 126 | return None 127 | 128 | def closeToCursor(self, cursor, position): 129 | if cursor.getType() == CursorType.horizontal: 130 | if abs(cursor.getCursorPosition() - position.x()) <= self.barWidth: 131 | return True 132 | else: 133 | if abs(cursor.getCursorPosition() - position.y()) <= self.barWidth: 134 | return True 135 | 136 | def updateSize(self, width, height): 137 | if self.cursorHeight == height and self.cursorWidth == width: 138 | return 139 | 140 | self.cursorHeight = height 141 | self.cursorWidth = width 142 | cursorPixmap = QPixmap(self.cursorWidth, self.cursorHeight) 143 | cursorPixmap.fill(QColor(255, 255, 255, 0)) 144 | self.viewer.setPixmap(cursorPixmap) 145 | 146 | for cursor in self.cursors: 147 | if cursor.getType() == CursorType.vertical or cursor.getType() == CursorType.zeroline: 148 | if cursor.getCursorPosition() > self.cursorHeight: 149 | cursor.setCursorPosition(self.cursorHeight -2) 150 | if cursor.getType() == CursorType.horizontal: 151 | if cursor.getCursorPosition() > self.cursorWidth: 152 | cursor.setCursorPosition(self.cursorWidth-2) 153 | 154 | def addCursor(self, cursor): 155 | self.cursors.append(cursor) 156 | #self.drawCursors() 157 | 158 | def paintEvent(self, event): 159 | self.drawCursors() 160 | 161 | def drawCursors(self): 162 | qp = QPainter() 163 | qp.begin(self) 164 | for cursor in self.cursors: 165 | pen = QPen(cursor.getColor(), 1, Qt.SolidLine) 166 | qp.setPen(pen) 167 | line = self.getLine(cursor) 168 | qp.drawLine(line) 169 | if cursor.getStyle() == CursorStyle.barred: 170 | lines = self.getBars(cursor) 171 | pen = QPen(cursor.getBarColor(), 1, Qt.SolidLine) 172 | qp.setPen(pen) 173 | qp.drawLines(lines) 174 | qp.end() 175 | 176 | def getLine(self, cursor): 177 | if cursor.getType() == CursorType.vertical or cursor.getType() == CursorType.zeroline: 178 | line = self.makeHorizontalLine(cursor.getCursorPosition()) 179 | else: 180 | line = self.makeVerticalLine(cursor.getCursorPosition()) 181 | return line 182 | 183 | def getBars(self, cursor): 184 | lines = [] 185 | if cursor.getType() == CursorType.vertical or cursor.getType() == CursorType.zeroline: 186 | line = self.makeHorizontalLine(cursor.getCursorPosition() + self.barWidth) 187 | lines.append(line) 188 | line = self.makeHorizontalLine(cursor.getCursorPosition() - self.barWidth) 189 | lines.append(line) 190 | elif cursor.getType() == CursorType.horizontal: 191 | line = self.makeVerticalLine(cursor.getCursorPosition() + self.barWidth) 192 | lines.append(line) 193 | line = self.makeVerticalLine(cursor.getCursorPosition() - self.barWidth) 194 | lines.append(line) 195 | 196 | return lines 197 | 198 | def makeHorizontalLine(self, position): 199 | line = QLineF(0, position, self.cursorWidth, position) 200 | return line 201 | 202 | def makeVerticalLine(self, position): 203 | line = QLineF(position, 0, position, self.cursorHeight) 204 | return line 205 | -------------------------------------------------------------------------------- /CameraMount/cameramount.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 39 | 41 | 42 | 44 | image/svg+xml 45 | 47 | 48 | 49 | 50 | 51 | 55 | 57 | 62 | 67 | 68 | 70 | 73 | 79 | 85 | 86 | 89 | 91 | 94 | 100 | 106 | 107 | 110 | 116 | 122 | 123 | 124 | 127 | 130 | 136 | 142 | 143 | 146 | 152 | 158 | 159 | 160 | 161 | 162 | 164 | 166 | 169 | 171 | 174 | 180 | 186 | 187 | 190 | 196 | 202 | 203 | 204 | 207 | 210 | 216 | 222 | 223 | 226 | 232 | 238 | 239 | 240 | 241 | 247 | 248 | 254 | 257 | 259 | 267 | 275 | 283 | 291 | 299 | 300 | 307 | 308 | 309 | 310 | 311 | -------------------------------------------------------------------------------- /Forms/Controls.py: -------------------------------------------------------------------------------- 1 | from PyQt5 import QtCore, QtMultimedia 2 | from PyQt5.QtCore import QSettings 3 | from PyQt5.QtWidgets import QWidget, QApplication, QFileDialog 4 | import os 5 | from quantiphy import Quantity 6 | import cv2 7 | import csv 8 | from Forms.Ui_Controls import Ui_Controls 9 | import numpy as np 10 | 11 | class Controls(QWidget, Ui_Controls): 12 | def __init__(self, parent): 13 | super(QWidget, self).__init__() 14 | 15 | self.transparentThreshold = 20 16 | self.timer = None 17 | self.thresholdMode = cv2.THRESH_BINARY 18 | self.fps = 24 19 | self.videocapture = None 20 | self.setupUi(self) 21 | self.dockWidgetCalibration.hide() 22 | self.toolButtonCalibrate.clicked.connect(self.doShowCalibration) 23 | 24 | self.availableCameras = self.getListOfCameras() 25 | self.comboBoxCameraSelect.addItems(self.availableCameras) 26 | self.checkBoxPause.stateChanged.connect(self.doPauseStateChanged) 27 | self.checkBoxLines.stateChanged.connect(self.doLineModeSelect) 28 | self.checkBoxPersist.stateChanged.connect(self.doPersistStateChanged) 29 | self.pushButtonCrop.clicked.connect(self.on_buttonCropClicked) 30 | self.pushButtonReset.clicked.connect(self.on_buttonResetClicked) 31 | self.pushButtonGrid.clicked.connect(self.on_buttonGridClicked) 32 | self.pushButtonSnapshot.clicked.connect(self.on_buttonSnapshotClicked) 33 | self.pushButtonDigitizedData.clicked.connect(self.on_SaveDigitizedDataClicked) 34 | self.widgetCursorControl.cursorMoved.connect(self.updateOnCursorMove) 35 | 36 | 37 | self.timebase = [ ("5 Secs", 5.0), ("2 Secs", 2.0), ("1Sec", 1.0), 38 | ("500 ms", 0.5), ("200 ms", 0.2), ("100 ms", 0.1), 39 | ("50 ms", 0.05), ("20 ms", 0.02), ("10 ms", 0.01), 40 | ("5 ms", 0.005), ("2 ms", 0.002), ("1 ms", 0.001), 41 | ("500 us", 0.0005), ("200 us", 0.0002), ("100 us", 0.0001), 42 | ("50 us", 0.00005), ("20 us", 0.00002), ("10 us", 0.00001), 43 | ("5 us", 0.000005), ("2 us", 0.000002), ("1 us", 0.000001), 44 | ("0.5 us", 0.0000005)] 45 | 46 | self.voltages = [ ("50 V", 50.0), ("20 V", 20.0), ("10 V", 10.0), 47 | ("5 V", 5.0), ("2 V", 2.0), ("1 V", 1.0), 48 | ("500 mV", 0.5), ("200 mV", 0.2), ("100 mV", 0.1)] 49 | 50 | self.multipliers = [("1", 1.0), ("10", 0.1), ("100", 0.01), ("1000", 0.001)] 51 | 52 | self.indexOfLastUsedCamera = -1 53 | self.settings = QSettings() 54 | self.rawImageWidth = int(self.settings.value("rawImageWidth", 640)) 55 | self.rawImageHeight = int(self.settings.value("rawImageHeight", 480)) 56 | self.crop_X1 = int(self.settings.value("crop_X1", 0)) 57 | self.crop_X2 = int(self.settings.value("crop_X2", 640)) 58 | self.crop_Y1 = int(self.settings.value("crop_Y1", 0)) 59 | self.crop_Y2 = int(self.settings.value("crop_Y2", 480)) 60 | self.grid_X1 = int(self.settings.value("grid_X1", 0)) 61 | self.grid_X2 = int(self.settings.value("grid_X2", 640)) 62 | self.grid_Y1 = int(self.settings.value("grid_Y1", 0)) 63 | self.grid_Y2 = int(self.settings.value("grid_Y2", 480)) 64 | self.grid_HorizontalDivisions = int(self.settings.value("grid_HorizontalDivisions", 8)) 65 | self.grid_VerticalDivisions = int(self.settings.value("grid_VerticalDivisions", 6)) 66 | self.spinBoxHorizontalDivisions.setValue(self.grid_HorizontalDivisions) 67 | self.spinBoxVerticalDivisions.setValue(self.grid_VerticalDivisions) 68 | self.updateGrid() 69 | self.updateDigitizingRange() 70 | self.fillComboBoxes(self.settings) 71 | self.setComboBoxSelectedItemFromSettings(self.settings, "Camera", self.comboBoxCameraSelect ) 72 | self.setComboBoxSelectedItemFromSettings(self.settings, "Multiplier_Selected", self.comboBoxMultiplier) 73 | self.setComboBoxSelectedItemFromSettings(self.settings, "Timebase_Selected", self.comboBoxTimeBase) 74 | self.setComboBoxSelectedItemFromSettings(self.settings, "VerticalDeflection_Selected", self.comboBoxVerticalDeflection) 75 | self.comboBoxMultiplier.currentIndexChanged.connect(self.settingChanged) 76 | self.comboBoxTimeBase.currentIndexChanged.connect(self.settingChanged) 77 | self.comboBoxVerticalDeflection.currentIndexChanged.connect(self.settingChanged) 78 | self.comboBoxCameraSelect.currentIndexChanged.connect(self.changeCamera) 79 | self.start() 80 | self.updateOnCursorMove() 81 | 82 | def on_SaveDigitizedDataClicked(self): 83 | data = self.widgetDigitizedView.getDigitizedData() 84 | data = self.widgetCursorControl.getZero_pixels() - data 85 | data = data * self.getVoltsPerPixel() 86 | filename, filter = QFileDialog.getSaveFileName(self, 'Save CSV Data File', '', 'CSV Files (*.csv)') 87 | if filename: 88 | filename, extension = os.path.splitext(filename) 89 | filename = filename + '.csv' 90 | timePerPixel = self.getSecondsPerPixel() 91 | count = 0 92 | x1, x2 = self.widgetDigitizedView.getRange() 93 | with open( filename, 'w') as csvfile: 94 | for x in range(x1, x2+1): 95 | csvwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) 96 | csvwriter.writerow([count * timePerPixel, data[x]]) 97 | count = count + 1 98 | 99 | def on_buttonSnapshotClicked(self): 100 | snapshot = QApplication.primaryScreen().grabWindow(self.groupBoxDisplay.winId()) 101 | filename, filter = QFileDialog.getSaveFileName(self, 'Save Snapshot', '', 'PNG Files (*.png)') 102 | if filename: 103 | filename, extension = os.path.splitext(filename) 104 | filename = filename + '.png' 105 | snapshot.save(filename, "PNG") 106 | 107 | def doShowCalibration(self): 108 | self.dockWidgetCalibration.setFloating(True) 109 | self.dockWidgetCalibration.show() 110 | 111 | def fillComboBoxes(self, settings): 112 | # This looks stupidly complicated. If I just let QT take care of things, it would be much shorter. 113 | # I want user editable entries for these values in the settings file, though. 114 | # Qt encodes the strings and values in a way that you can't easily edit with a text editor. 115 | # Hence extra conversion steps. 116 | # For example, the multipliers entry looks like this: 117 | # multipliers="('1', 1.0), ('10', 0.1), ('100', 0.01), ('1000', 0.001)" 118 | # Easy enough to edit 119 | if not settings.contains("timebase"): 120 | settings.setValue("timebase", str(self.timebase).strip('[]')) 121 | self.timebase = self.listOfTuplesFromString(settings.value("timebase")) 122 | self.fillComboBoxFromListOfTuples(self.comboBoxTimeBase, self.timebase) 123 | 124 | if not settings.contains("voltages"): 125 | settings.setValue("voltages", str(self.voltages).strip('[]')) 126 | self.voltages = self.listOfTuplesFromString(settings.value("voltages")) 127 | self.fillComboBoxFromListOfTuples(self.comboBoxVerticalDeflection, self.voltages) 128 | 129 | if not settings.contains("multipliers"): 130 | settings.setValue("multipliers", str(self.multipliers).strip('[]')) 131 | self.multipliers = self.listOfTuplesFromString(settings.value("multipliers")) 132 | self.fillComboBoxFromListOfTuples(self.comboBoxMultiplier, self.multipliers) 133 | 134 | def setComboBoxSelectedItemFromSettings(self, settings, settingName, combobox): 135 | savedItemName = settings.value(settingName, "-") 136 | itemIndex = combobox.findText(savedItemName ) 137 | if itemIndex>=0: 138 | combobox.setCurrentIndex(itemIndex) 139 | 140 | def fillComboBoxFromListOfTuples(self, combobox, valuesList): 141 | combobox.clear() 142 | for item in valuesList: 143 | combobox.addItem(item[0], item[1]) 144 | 145 | def listOfTuplesFromString(self, formattedString): 146 | return eval("[%s]" % formattedString) 147 | 148 | def updateGrid(self): 149 | self.widgetGridView.updateGridSpacing(self.grid_X1, self.grid_X2, self.grid_Y1, self.grid_Y2, self.grid_HorizontalDivisions, self.grid_VerticalDivisions) 150 | 151 | def updateDigitizingRange(self): 152 | self.widgetDigitizedView.setDigitizingRange(self.grid_X1, self.grid_X2) 153 | 154 | def on_buttonCropClicked(self): 155 | self.crop_X1 = self.widgetCursorControl.getX1_pixels() 156 | self.crop_X2 = self.widgetCursorControl.getX2_pixels() 157 | self.crop_Y1 = self.widgetCursorControl.getY1_pixels() 158 | self.crop_Y2 = self.widgetCursorControl.getY2_pixels() 159 | 160 | if self.crop_X2 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /Forms/Ui_Controls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file '/home/dev/EricProjects/DigitalD43/Forms/Controls.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.10.1 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | 11 | class Ui_Controls(object): 12 | def setupUi(self, Controls): 13 | Controls.setObjectName("Controls") 14 | Controls.resize(346, 559) 15 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 16 | sizePolicy.setHorizontalStretch(0) 17 | sizePolicy.setVerticalStretch(0) 18 | sizePolicy.setHeightForWidth(Controls.sizePolicy().hasHeightForWidth()) 19 | Controls.setSizePolicy(sizePolicy) 20 | self.gridLayout_6 = QtWidgets.QGridLayout(Controls) 21 | self.gridLayout_6.setContentsMargins(0, 0, 0, 0) 22 | self.gridLayout_6.setSpacing(0) 23 | self.gridLayout_6.setObjectName("gridLayout_6") 24 | self.layoutScope = QtWidgets.QGridLayout() 25 | self.layoutScope.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) 26 | self.layoutScope.setContentsMargins(0, 0, 0, 0) 27 | self.layoutScope.setSpacing(0) 28 | self.layoutScope.setObjectName("layoutScope") 29 | self.verticalLayout = QtWidgets.QVBoxLayout() 30 | self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) 31 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 32 | self.verticalLayout.setSpacing(0) 33 | self.verticalLayout.setObjectName("verticalLayout") 34 | self.groupBoxDisplay = QtWidgets.QGroupBox(Controls) 35 | self.groupBoxDisplay.setEnabled(True) 36 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 37 | sizePolicy.setHorizontalStretch(0) 38 | sizePolicy.setVerticalStretch(0) 39 | sizePolicy.setHeightForWidth(self.groupBoxDisplay.sizePolicy().hasHeightForWidth()) 40 | self.groupBoxDisplay.setSizePolicy(sizePolicy) 41 | self.groupBoxDisplay.setStyleSheet("background-color: rgb(0, 0, 0);\n" 42 | "") 43 | self.groupBoxDisplay.setTitle("") 44 | self.groupBoxDisplay.setAlignment(QtCore.Qt.AlignCenter) 45 | self.groupBoxDisplay.setFlat(False) 46 | self.groupBoxDisplay.setObjectName("groupBoxDisplay") 47 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBoxDisplay) 48 | self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) 49 | self.verticalLayout_2.setSpacing(0) 50 | self.verticalLayout_2.setObjectName("verticalLayout_2") 51 | self.gridLayout_Display = QtWidgets.QGridLayout() 52 | self.gridLayout_Display.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) 53 | self.gridLayout_Display.setContentsMargins(0, 0, 0, 0) 54 | self.gridLayout_Display.setSpacing(0) 55 | self.gridLayout_Display.setObjectName("gridLayout_Display") 56 | self.widgetLiveView = WebCamView(self.groupBoxDisplay) 57 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 58 | sizePolicy.setHorizontalStretch(0) 59 | sizePolicy.setVerticalStretch(0) 60 | sizePolicy.setHeightForWidth(self.widgetLiveView.sizePolicy().hasHeightForWidth()) 61 | self.widgetLiveView.setSizePolicy(sizePolicy) 62 | self.widgetLiveView.setMinimumSize(QtCore.QSize(50, 50)) 63 | self.widgetLiveView.setStyleSheet("background-color: rgb(0, 0, 0);") 64 | self.widgetLiveView.setObjectName("widgetLiveView") 65 | self.gridLayout_Display.addWidget(self.widgetLiveView, 0, 0, 1, 1, QtCore.Qt.AlignTop) 66 | self.widgetGridView = Grid(self.groupBoxDisplay) 67 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 68 | sizePolicy.setHorizontalStretch(0) 69 | sizePolicy.setVerticalStretch(0) 70 | sizePolicy.setHeightForWidth(self.widgetGridView.sizePolicy().hasHeightForWidth()) 71 | self.widgetGridView.setSizePolicy(sizePolicy) 72 | self.widgetGridView.setMinimumSize(QtCore.QSize(50, 50)) 73 | self.widgetGridView.setStyleSheet("background-color: rgba(255, 255, 255, 0);") 74 | self.widgetGridView.setObjectName("widgetGridView") 75 | self.gridLayout_Display.addWidget(self.widgetGridView, 0, 0, 1, 1, QtCore.Qt.AlignLeft) 76 | self.widgetDigitizedView = DigitizerView(self.groupBoxDisplay) 77 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 78 | sizePolicy.setHorizontalStretch(0) 79 | sizePolicy.setVerticalStretch(0) 80 | sizePolicy.setHeightForWidth(self.widgetDigitizedView.sizePolicy().hasHeightForWidth()) 81 | self.widgetDigitizedView.setSizePolicy(sizePolicy) 82 | self.widgetDigitizedView.setMinimumSize(QtCore.QSize(50, 50)) 83 | self.widgetDigitizedView.setStyleSheet("background-color: rgba(255, 255, 255, 0);\n" 84 | "") 85 | self.widgetDigitizedView.setObjectName("widgetDigitizedView") 86 | self.gridLayout_Display.addWidget(self.widgetDigitizedView, 0, 0, 1, 1) 87 | self.widgetCursorControl = CursorControl(self.groupBoxDisplay) 88 | self.widgetCursorControl.setEnabled(True) 89 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 90 | sizePolicy.setHorizontalStretch(0) 91 | sizePolicy.setVerticalStretch(0) 92 | sizePolicy.setHeightForWidth(self.widgetCursorControl.sizePolicy().hasHeightForWidth()) 93 | self.widgetCursorControl.setSizePolicy(sizePolicy) 94 | self.widgetCursorControl.setMinimumSize(QtCore.QSize(50, 50)) 95 | self.widgetCursorControl.setAutoFillBackground(False) 96 | self.widgetCursorControl.setStyleSheet("background-color: rgba(255, 255, 255, 0);\n" 97 | "border: 1px solid rgba(255,255,255,100);") 98 | self.widgetCursorControl.setObjectName("widgetCursorControl") 99 | self.gridLayout_Display.addWidget(self.widgetCursorControl, 0, 0, 1, 1) 100 | self.verticalLayout_2.addLayout(self.gridLayout_Display) 101 | self.groupBoxMeasurements = QtWidgets.QGroupBox(self.groupBoxDisplay) 102 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 103 | sizePolicy.setHorizontalStretch(0) 104 | sizePolicy.setVerticalStretch(0) 105 | sizePolicy.setHeightForWidth(self.groupBoxMeasurements.sizePolicy().hasHeightForWidth()) 106 | self.groupBoxMeasurements.setSizePolicy(sizePolicy) 107 | self.groupBoxMeasurements.setStyleSheet("") 108 | self.groupBoxMeasurements.setTitle("") 109 | self.groupBoxMeasurements.setAlignment(QtCore.Qt.AlignCenter) 110 | self.groupBoxMeasurements.setFlat(False) 111 | self.groupBoxMeasurements.setObjectName("groupBoxMeasurements") 112 | self.gridLayout_11 = QtWidgets.QGridLayout(self.groupBoxMeasurements) 113 | self.gridLayout_11.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) 114 | self.gridLayout_11.setContentsMargins(0, 0, 0, 0) 115 | self.gridLayout_11.setSpacing(0) 116 | self.gridLayout_11.setObjectName("gridLayout_11") 117 | self.groupBoxTime = QtWidgets.QGroupBox(self.groupBoxMeasurements) 118 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 119 | sizePolicy.setHorizontalStretch(0) 120 | sizePolicy.setVerticalStretch(0) 121 | sizePolicy.setHeightForWidth(self.groupBoxTime.sizePolicy().hasHeightForWidth()) 122 | self.groupBoxTime.setSizePolicy(sizePolicy) 123 | self.groupBoxTime.setTitle("") 124 | self.groupBoxTime.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 125 | self.groupBoxTime.setFlat(True) 126 | self.groupBoxTime.setObjectName("groupBoxTime") 127 | self.formLayout_2 = QtWidgets.QFormLayout(self.groupBoxTime) 128 | self.formLayout_2.setLabelAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 129 | self.formLayout_2.setContentsMargins(0, 0, 0, 0) 130 | self.formLayout_2.setSpacing(0) 131 | self.formLayout_2.setObjectName("formLayout_2") 132 | self.labelDeltaT = QtWidgets.QLabel(self.groupBoxTime) 133 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 134 | sizePolicy.setHorizontalStretch(0) 135 | sizePolicy.setVerticalStretch(0) 136 | sizePolicy.setHeightForWidth(self.labelDeltaT.sizePolicy().hasHeightForWidth()) 137 | self.labelDeltaT.setSizePolicy(sizePolicy) 138 | self.labelDeltaT.setStyleSheet("color: rgb(0, 255, 255);") 139 | self.labelDeltaT.setObjectName("labelDeltaT") 140 | self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.labelDeltaT) 141 | self.labelDeltaTDisplay = QtWidgets.QLabel(self.groupBoxTime) 142 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 143 | sizePolicy.setHorizontalStretch(0) 144 | sizePolicy.setVerticalStretch(0) 145 | sizePolicy.setHeightForWidth(self.labelDeltaTDisplay.sizePolicy().hasHeightForWidth()) 146 | self.labelDeltaTDisplay.setSizePolicy(sizePolicy) 147 | self.labelDeltaTDisplay.setStyleSheet("color: rgb(0, 255, 255);") 148 | self.labelDeltaTDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 149 | self.labelDeltaTDisplay.setObjectName("labelDeltaTDisplay") 150 | self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelDeltaTDisplay) 151 | self.labelTInverse = QtWidgets.QLabel(self.groupBoxTime) 152 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 153 | sizePolicy.setHorizontalStretch(0) 154 | sizePolicy.setVerticalStretch(0) 155 | sizePolicy.setHeightForWidth(self.labelTInverse.sizePolicy().hasHeightForWidth()) 156 | self.labelTInverse.setSizePolicy(sizePolicy) 157 | self.labelTInverse.setStyleSheet("color: rgb(0, 255, 255);") 158 | self.labelTInverse.setObjectName("labelTInverse") 159 | self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.labelTInverse) 160 | self.labelTInverseDisplay = QtWidgets.QLabel(self.groupBoxTime) 161 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 162 | sizePolicy.setHorizontalStretch(0) 163 | sizePolicy.setVerticalStretch(0) 164 | sizePolicy.setHeightForWidth(self.labelTInverseDisplay.sizePolicy().hasHeightForWidth()) 165 | self.labelTInverseDisplay.setSizePolicy(sizePolicy) 166 | self.labelTInverseDisplay.setStyleSheet("color: rgb(0, 255, 255);") 167 | self.labelTInverseDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 168 | self.labelTInverseDisplay.setObjectName("labelTInverseDisplay") 169 | self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.labelTInverseDisplay) 170 | self.labeltperDiv = QtWidgets.QLabel(self.groupBoxTime) 171 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 172 | sizePolicy.setHorizontalStretch(0) 173 | sizePolicy.setVerticalStretch(0) 174 | sizePolicy.setHeightForWidth(self.labeltperDiv.sizePolicy().hasHeightForWidth()) 175 | self.labeltperDiv.setSizePolicy(sizePolicy) 176 | self.labeltperDiv.setStyleSheet("color: rgb(0, 255, 255);") 177 | self.labeltperDiv.setObjectName("labeltperDiv") 178 | self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.labeltperDiv) 179 | self.labelTperDivDisplay = QtWidgets.QLabel(self.groupBoxTime) 180 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 181 | sizePolicy.setHorizontalStretch(0) 182 | sizePolicy.setVerticalStretch(0) 183 | sizePolicy.setHeightForWidth(self.labelTperDivDisplay.sizePolicy().hasHeightForWidth()) 184 | self.labelTperDivDisplay.setSizePolicy(sizePolicy) 185 | self.labelTperDivDisplay.setStyleSheet("color: rgb(0, 255, 255);") 186 | self.labelTperDivDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 187 | self.labelTperDivDisplay.setObjectName("labelTperDivDisplay") 188 | self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelTperDivDisplay) 189 | self.gridLayout_11.addWidget(self.groupBoxTime, 0, 0, 1, 1) 190 | self.groupBoxVoltage = QtWidgets.QGroupBox(self.groupBoxMeasurements) 191 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 192 | sizePolicy.setHorizontalStretch(0) 193 | sizePolicy.setVerticalStretch(0) 194 | sizePolicy.setHeightForWidth(self.groupBoxVoltage.sizePolicy().hasHeightForWidth()) 195 | self.groupBoxVoltage.setSizePolicy(sizePolicy) 196 | self.groupBoxVoltage.setTitle("") 197 | self.groupBoxVoltage.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTop|QtCore.Qt.AlignTrailing) 198 | self.groupBoxVoltage.setFlat(True) 199 | self.groupBoxVoltage.setObjectName("groupBoxVoltage") 200 | self.formLayout = QtWidgets.QFormLayout(self.groupBoxVoltage) 201 | self.formLayout.setLabelAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 202 | self.formLayout.setContentsMargins(0, 0, 0, 0) 203 | self.formLayout.setSpacing(0) 204 | self.formLayout.setObjectName("formLayout") 205 | self.labelVperDiv = QtWidgets.QLabel(self.groupBoxVoltage) 206 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 207 | sizePolicy.setHorizontalStretch(0) 208 | sizePolicy.setVerticalStretch(0) 209 | sizePolicy.setHeightForWidth(self.labelVperDiv.sizePolicy().hasHeightForWidth()) 210 | self.labelVperDiv.setSizePolicy(sizePolicy) 211 | self.labelVperDiv.setStyleSheet("color: rgb(0, 255, 255);") 212 | self.labelVperDiv.setObjectName("labelVperDiv") 213 | self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.labelVperDiv) 214 | self.labelVperDivDisplay = QtWidgets.QLabel(self.groupBoxVoltage) 215 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 216 | sizePolicy.setHorizontalStretch(0) 217 | sizePolicy.setVerticalStretch(0) 218 | sizePolicy.setHeightForWidth(self.labelVperDivDisplay.sizePolicy().hasHeightForWidth()) 219 | self.labelVperDivDisplay.setSizePolicy(sizePolicy) 220 | self.labelVperDivDisplay.setStyleSheet("color: rgb(0, 255, 255);") 221 | self.labelVperDivDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 222 | self.labelVperDivDisplay.setObjectName("labelVperDivDisplay") 223 | self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.labelVperDivDisplay) 224 | self.labelVpp = QtWidgets.QLabel(self.groupBoxVoltage) 225 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 226 | sizePolicy.setHorizontalStretch(0) 227 | sizePolicy.setVerticalStretch(0) 228 | sizePolicy.setHeightForWidth(self.labelVpp.sizePolicy().hasHeightForWidth()) 229 | self.labelVpp.setSizePolicy(sizePolicy) 230 | self.labelVpp.setStyleSheet("color: rgb(0, 255, 255);") 231 | self.labelVpp.setObjectName("labelVpp") 232 | self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.labelVpp) 233 | self.labelVppDisplay = QtWidgets.QLabel(self.groupBoxVoltage) 234 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 235 | sizePolicy.setHorizontalStretch(0) 236 | sizePolicy.setVerticalStretch(0) 237 | sizePolicy.setHeightForWidth(self.labelVppDisplay.sizePolicy().hasHeightForWidth()) 238 | self.labelVppDisplay.setSizePolicy(sizePolicy) 239 | self.labelVppDisplay.setStyleSheet("color: rgb(0, 255, 255);") 240 | self.labelVppDisplay.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 241 | self.labelVppDisplay.setObjectName("labelVppDisplay") 242 | self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.labelVppDisplay) 243 | self.labelVRMS = QtWidgets.QLabel(self.groupBoxVoltage) 244 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 245 | sizePolicy.setHorizontalStretch(0) 246 | sizePolicy.setVerticalStretch(0) 247 | sizePolicy.setHeightForWidth(self.labelVRMS.sizePolicy().hasHeightForWidth()) 248 | self.labelVRMS.setSizePolicy(sizePolicy) 249 | self.labelVRMS.setStyleSheet("color: rgb(0, 255, 255);") 250 | self.labelVRMS.setObjectName("labelVRMS") 251 | self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.labelVRMS) 252 | self.labelVRMS_Display = QtWidgets.QLabel(self.groupBoxVoltage) 253 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 254 | sizePolicy.setHorizontalStretch(0) 255 | sizePolicy.setVerticalStretch(0) 256 | sizePolicy.setHeightForWidth(self.labelVRMS_Display.sizePolicy().hasHeightForWidth()) 257 | self.labelVRMS_Display.setSizePolicy(sizePolicy) 258 | self.labelVRMS_Display.setStyleSheet("color: rgb(0, 255, 255);") 259 | self.labelVRMS_Display.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 260 | self.labelVRMS_Display.setObjectName("labelVRMS_Display") 261 | self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.labelVRMS_Display) 262 | self.labelVRMSAC = QtWidgets.QLabel(self.groupBoxVoltage) 263 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 264 | sizePolicy.setHorizontalStretch(0) 265 | sizePolicy.setVerticalStretch(0) 266 | sizePolicy.setHeightForWidth(self.labelVRMSAC.sizePolicy().hasHeightForWidth()) 267 | self.labelVRMSAC.setSizePolicy(sizePolicy) 268 | self.labelVRMSAC.setStyleSheet("color: rgb(0, 255, 255);") 269 | self.labelVRMSAC.setObjectName("labelVRMSAC") 270 | self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.labelVRMSAC) 271 | self.labelVRMSAC_Display = QtWidgets.QLabel(self.groupBoxVoltage) 272 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Preferred) 273 | sizePolicy.setHorizontalStretch(0) 274 | sizePolicy.setVerticalStretch(0) 275 | sizePolicy.setHeightForWidth(self.labelVRMSAC_Display.sizePolicy().hasHeightForWidth()) 276 | self.labelVRMSAC_Display.setSizePolicy(sizePolicy) 277 | self.labelVRMSAC_Display.setStyleSheet("color: rgb(0, 255, 255);") 278 | self.labelVRMSAC_Display.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 279 | self.labelVRMSAC_Display.setObjectName("labelVRMSAC_Display") 280 | self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.labelVRMSAC_Display) 281 | self.gridLayout_11.addWidget(self.groupBoxVoltage, 0, 2, 1, 1) 282 | self.line = QtWidgets.QFrame(self.groupBoxMeasurements) 283 | self.line.setStyleSheet("color: rgb(0, 255, 255);") 284 | self.line.setLineWidth(2) 285 | self.line.setFrameShape(QtWidgets.QFrame.VLine) 286 | self.line.setFrameShadow(QtWidgets.QFrame.Sunken) 287 | self.line.setObjectName("line") 288 | self.gridLayout_11.addWidget(self.line, 0, 1, 1, 1) 289 | self.gridLayout_11.setColumnStretch(0, 1) 290 | self.gridLayout_11.setColumnStretch(1, 1) 291 | self.gridLayout_11.setColumnStretch(2, 1) 292 | self.verticalLayout_2.addWidget(self.groupBoxMeasurements) 293 | self.verticalLayout_2.setStretch(1, 1) 294 | self.verticalLayout.addWidget(self.groupBoxDisplay) 295 | spacerItem = QtWidgets.QSpacerItem(10, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 296 | self.verticalLayout.addItem(spacerItem) 297 | self.verticalLayout.setStretch(0, 1) 298 | self.layoutScope.addLayout(self.verticalLayout, 0, 2, 1, 1) 299 | self.layoutControls = QtWidgets.QGridLayout() 300 | self.layoutControls.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) 301 | self.layoutControls.setContentsMargins(0, 0, 0, 0) 302 | self.layoutControls.setSpacing(0) 303 | self.layoutControls.setObjectName("layoutControls") 304 | self.groupBoxSettings = QtWidgets.QGroupBox(Controls) 305 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 306 | sizePolicy.setHorizontalStretch(0) 307 | sizePolicy.setVerticalStretch(0) 308 | sizePolicy.setHeightForWidth(self.groupBoxSettings.sizePolicy().hasHeightForWidth()) 309 | self.groupBoxSettings.setSizePolicy(sizePolicy) 310 | self.groupBoxSettings.setStyleSheet("") 311 | self.groupBoxSettings.setFlat(False) 312 | self.groupBoxSettings.setObjectName("groupBoxSettings") 313 | self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBoxSettings) 314 | self.gridLayout_3.setContentsMargins(3, 3, 3, 3) 315 | self.gridLayout_3.setSpacing(3) 316 | self.gridLayout_3.setObjectName("gridLayout_3") 317 | self.comboBoxTimeBase = QtWidgets.QComboBox(self.groupBoxSettings) 318 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 319 | sizePolicy.setHorizontalStretch(0) 320 | sizePolicy.setVerticalStretch(0) 321 | sizePolicy.setHeightForWidth(self.comboBoxTimeBase.sizePolicy().hasHeightForWidth()) 322 | self.comboBoxTimeBase.setSizePolicy(sizePolicy) 323 | self.comboBoxTimeBase.setInsertPolicy(QtWidgets.QComboBox.InsertAtBottom) 324 | self.comboBoxTimeBase.setFrame(True) 325 | self.comboBoxTimeBase.setObjectName("comboBoxTimeBase") 326 | self.gridLayout_3.addWidget(self.comboBoxTimeBase, 0, 0, 1, 1) 327 | self.labelTimeBase = QtWidgets.QLabel(self.groupBoxSettings) 328 | self.labelTimeBase.setObjectName("labelTimeBase") 329 | self.gridLayout_3.addWidget(self.labelTimeBase, 0, 2, 1, 1) 330 | self.comboBoxVerticalDeflection = QtWidgets.QComboBox(self.groupBoxSettings) 331 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 332 | sizePolicy.setHorizontalStretch(0) 333 | sizePolicy.setVerticalStretch(0) 334 | sizePolicy.setHeightForWidth(self.comboBoxVerticalDeflection.sizePolicy().hasHeightForWidth()) 335 | self.comboBoxVerticalDeflection.setSizePolicy(sizePolicy) 336 | self.comboBoxVerticalDeflection.setObjectName("comboBoxVerticalDeflection") 337 | self.gridLayout_3.addWidget(self.comboBoxVerticalDeflection, 1, 0, 1, 1) 338 | self.labelVerticalDeflection = QtWidgets.QLabel(self.groupBoxSettings) 339 | self.labelVerticalDeflection.setObjectName("labelVerticalDeflection") 340 | self.gridLayout_3.addWidget(self.labelVerticalDeflection, 1, 2, 1, 1) 341 | self.labelMultiplier = QtWidgets.QLabel(self.groupBoxSettings) 342 | self.labelMultiplier.setObjectName("labelMultiplier") 343 | self.gridLayout_3.addWidget(self.labelMultiplier, 2, 2, 1, 1) 344 | self.comboBoxMultiplier = QtWidgets.QComboBox(self.groupBoxSettings) 345 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 346 | sizePolicy.setHorizontalStretch(0) 347 | sizePolicy.setVerticalStretch(0) 348 | sizePolicy.setHeightForWidth(self.comboBoxMultiplier.sizePolicy().hasHeightForWidth()) 349 | self.comboBoxMultiplier.setSizePolicy(sizePolicy) 350 | self.comboBoxMultiplier.setObjectName("comboBoxMultiplier") 351 | self.gridLayout_3.addWidget(self.comboBoxMultiplier, 2, 0, 1, 1) 352 | self.layoutControls.addWidget(self.groupBoxSettings, 0, 0, 1, 1) 353 | self.groupBoxView = QtWidgets.QGroupBox(Controls) 354 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 355 | sizePolicy.setHorizontalStretch(0) 356 | sizePolicy.setVerticalStretch(0) 357 | sizePolicy.setHeightForWidth(self.groupBoxView.sizePolicy().hasHeightForWidth()) 358 | self.groupBoxView.setSizePolicy(sizePolicy) 359 | self.groupBoxView.setObjectName("groupBoxView") 360 | self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBoxView) 361 | self.gridLayout_5.setContentsMargins(0, 0, 0, 0) 362 | self.gridLayout_5.setSpacing(0) 363 | self.gridLayout_5.setObjectName("gridLayout_5") 364 | self.checkBoxLive = QtWidgets.QCheckBox(self.groupBoxView) 365 | self.checkBoxLive.setChecked(True) 366 | self.checkBoxLive.setObjectName("checkBoxLive") 367 | self.gridLayout_5.addWidget(self.checkBoxLive, 2, 0, 1, 1) 368 | self.checkBoxDigitizedView = QtWidgets.QCheckBox(self.groupBoxView) 369 | self.checkBoxDigitizedView.setObjectName("checkBoxDigitizedView") 370 | self.gridLayout_5.addWidget(self.checkBoxDigitizedView, 2, 1, 1, 1) 371 | self.checkBoxSingleShot = QtWidgets.QCheckBox(self.groupBoxView) 372 | self.checkBoxSingleShot.setObjectName("checkBoxSingleShot") 373 | self.gridLayout_5.addWidget(self.checkBoxSingleShot, 4, 0, 1, 1) 374 | self.checkBoxPersist = QtWidgets.QCheckBox(self.groupBoxView) 375 | self.checkBoxPersist.setObjectName("checkBoxPersist") 376 | self.gridLayout_5.addWidget(self.checkBoxPersist, 3, 0, 1, 1) 377 | self.checkBoxLines = QtWidgets.QCheckBox(self.groupBoxView) 378 | self.checkBoxLines.setObjectName("checkBoxLines") 379 | self.gridLayout_5.addWidget(self.checkBoxLines, 3, 1, 1, 1) 380 | self.layoutControls.addWidget(self.groupBoxView, 1, 0, 1, 1) 381 | self.groupBoxStorage = QtWidgets.QGroupBox(Controls) 382 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 383 | sizePolicy.setHorizontalStretch(0) 384 | sizePolicy.setVerticalStretch(0) 385 | sizePolicy.setHeightForWidth(self.groupBoxStorage.sizePolicy().hasHeightForWidth()) 386 | self.groupBoxStorage.setSizePolicy(sizePolicy) 387 | self.groupBoxStorage.setObjectName("groupBoxStorage") 388 | self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBoxStorage) 389 | self.gridLayout_4.setContentsMargins(0, 0, 0, 0) 390 | self.gridLayout_4.setSpacing(0) 391 | self.gridLayout_4.setObjectName("gridLayout_4") 392 | self.pushButtonSnapshot = QtWidgets.QPushButton(self.groupBoxStorage) 393 | self.pushButtonSnapshot.setObjectName("pushButtonSnapshot") 394 | self.gridLayout_4.addWidget(self.pushButtonSnapshot, 1, 0, 1, 1) 395 | self.pushButtonDigitizedData = QtWidgets.QPushButton(self.groupBoxStorage) 396 | self.pushButtonDigitizedData.setObjectName("pushButtonDigitizedData") 397 | self.gridLayout_4.addWidget(self.pushButtonDigitizedData, 1, 1, 1, 1) 398 | self.checkBoxPause = QtWidgets.QCheckBox(self.groupBoxStorage) 399 | self.checkBoxPause.setObjectName("checkBoxPause") 400 | self.gridLayout_4.addWidget(self.checkBoxPause, 0, 0, 1, 1) 401 | self.layoutControls.addWidget(self.groupBoxStorage, 2, 0, 1, 1) 402 | self.groupBoxSetup = QtWidgets.QGroupBox(Controls) 403 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 404 | sizePolicy.setHorizontalStretch(0) 405 | sizePolicy.setVerticalStretch(0) 406 | sizePolicy.setHeightForWidth(self.groupBoxSetup.sizePolicy().hasHeightForWidth()) 407 | self.groupBoxSetup.setSizePolicy(sizePolicy) 408 | self.groupBoxSetup.setObjectName("groupBoxSetup") 409 | self.gridLayout = QtWidgets.QGridLayout(self.groupBoxSetup) 410 | self.gridLayout.setContentsMargins(0, 0, 0, 0) 411 | self.gridLayout.setSpacing(0) 412 | self.gridLayout.setObjectName("gridLayout") 413 | self.comboBoxCameraSelect = QtWidgets.QComboBox(self.groupBoxSetup) 414 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) 415 | sizePolicy.setHorizontalStretch(0) 416 | sizePolicy.setVerticalStretch(0) 417 | sizePolicy.setHeightForWidth(self.comboBoxCameraSelect.sizePolicy().hasHeightForWidth()) 418 | self.comboBoxCameraSelect.setSizePolicy(sizePolicy) 419 | self.comboBoxCameraSelect.setObjectName("comboBoxCameraSelect") 420 | self.gridLayout.addWidget(self.comboBoxCameraSelect, 0, 1, 1, 1) 421 | self.toolButtonCalibrate = QtWidgets.QToolButton(self.groupBoxSetup) 422 | self.toolButtonCalibrate.setObjectName("toolButtonCalibrate") 423 | self.gridLayout.addWidget(self.toolButtonCalibrate, 0, 0, 1, 1) 424 | self.layoutControls.addWidget(self.groupBoxSetup, 3, 0, 1, 1) 425 | self.dockWidgetCalibration = QtWidgets.QDockWidget(Controls) 426 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) 427 | sizePolicy.setHorizontalStretch(0) 428 | sizePolicy.setVerticalStretch(0) 429 | sizePolicy.setHeightForWidth(self.dockWidgetCalibration.sizePolicy().hasHeightForWidth()) 430 | self.dockWidgetCalibration.setSizePolicy(sizePolicy) 431 | self.dockWidgetCalibration.setFloating(True) 432 | self.dockWidgetCalibration.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures) 433 | self.dockWidgetCalibration.setObjectName("dockWidgetCalibration") 434 | self.dockWidgetContents = QtWidgets.QWidget() 435 | self.dockWidgetContents.setObjectName("dockWidgetContents") 436 | self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.dockWidgetContents) 437 | self.verticalLayout_3.setContentsMargins(0, 0, 0, 0) 438 | self.verticalLayout_3.setSpacing(0) 439 | self.verticalLayout_3.setObjectName("verticalLayout_3") 440 | self.groupBoxCalibration = QtWidgets.QGroupBox(self.dockWidgetContents) 441 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) 442 | sizePolicy.setHorizontalStretch(0) 443 | sizePolicy.setVerticalStretch(0) 444 | sizePolicy.setHeightForWidth(self.groupBoxCalibration.sizePolicy().hasHeightForWidth()) 445 | self.groupBoxCalibration.setSizePolicy(sizePolicy) 446 | self.groupBoxCalibration.setTitle("") 447 | self.groupBoxCalibration.setObjectName("groupBoxCalibration") 448 | self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBoxCalibration) 449 | self.gridLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize) 450 | self.gridLayout_2.setContentsMargins(0, 0, 0, 0) 451 | self.gridLayout_2.setSpacing(0) 452 | self.gridLayout_2.setObjectName("gridLayout_2") 453 | self.labelHorizontalDivisions = QtWidgets.QLabel(self.groupBoxCalibration) 454 | self.labelHorizontalDivisions.setObjectName("labelHorizontalDivisions") 455 | self.gridLayout_2.addWidget(self.labelHorizontalDivisions, 1, 1, 1, 1) 456 | self.spinBoxHorizontalDivisions = QtWidgets.QSpinBox(self.groupBoxCalibration) 457 | self.spinBoxHorizontalDivisions.setMinimum(1) 458 | self.spinBoxHorizontalDivisions.setMaximum(15) 459 | self.spinBoxHorizontalDivisions.setObjectName("spinBoxHorizontalDivisions") 460 | self.gridLayout_2.addWidget(self.spinBoxHorizontalDivisions, 1, 3, 1, 1) 461 | self.pushButtonReset = QtWidgets.QPushButton(self.groupBoxCalibration) 462 | sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) 463 | sizePolicy.setHorizontalStretch(0) 464 | sizePolicy.setVerticalStretch(0) 465 | sizePolicy.setHeightForWidth(self.pushButtonReset.sizePolicy().hasHeightForWidth()) 466 | self.pushButtonReset.setSizePolicy(sizePolicy) 467 | self.pushButtonReset.setObjectName("pushButtonReset") 468 | self.gridLayout_2.addWidget(self.pushButtonReset, 0, 3, 1, 1) 469 | self.pushButtonCrop = QtWidgets.QPushButton(self.groupBoxCalibration) 470 | self.pushButtonCrop.setObjectName("pushButtonCrop") 471 | self.gridLayout_2.addWidget(self.pushButtonCrop, 0, 1, 1, 1) 472 | self.spinBoxVerticalDivisions = QtWidgets.QSpinBox(self.groupBoxCalibration) 473 | self.spinBoxVerticalDivisions.setMinimum(1) 474 | self.spinBoxVerticalDivisions.setMaximum(15) 475 | self.spinBoxVerticalDivisions.setObjectName("spinBoxVerticalDivisions") 476 | self.gridLayout_2.addWidget(self.spinBoxVerticalDivisions, 2, 3, 1, 1) 477 | self.labelVerticalDivisions = QtWidgets.QLabel(self.groupBoxCalibration) 478 | self.labelVerticalDivisions.setObjectName("labelVerticalDivisions") 479 | self.gridLayout_2.addWidget(self.labelVerticalDivisions, 2, 1, 1, 1) 480 | self.pushButtonGrid = QtWidgets.QPushButton(self.groupBoxCalibration) 481 | self.pushButtonGrid.setObjectName("pushButtonGrid") 482 | self.gridLayout_2.addWidget(self.pushButtonGrid, 3, 1, 1, 1) 483 | self.verticalLayout_3.addWidget(self.groupBoxCalibration) 484 | self.dockWidgetCalibration.setWidget(self.dockWidgetContents) 485 | self.layoutControls.addWidget(self.dockWidgetCalibration, 4, 0, 1, 1) 486 | spacerItem1 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 487 | self.layoutControls.addItem(spacerItem1, 5, 0, 1, 1) 488 | self.layoutScope.addLayout(self.layoutControls, 0, 3, 1, 1) 489 | spacerItem2 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) 490 | self.layoutScope.addItem(spacerItem2, 1, 3, 1, 1) 491 | self.layoutScope.setColumnStretch(0, 2) 492 | self.gridLayout_6.addLayout(self.layoutScope, 0, 1, 1, 1) 493 | spacerItem3 = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) 494 | self.gridLayout_6.addItem(spacerItem3, 0, 2, 1, 1) 495 | 496 | self.retranslateUi(Controls) 497 | QtCore.QMetaObject.connectSlotsByName(Controls) 498 | 499 | def retranslateUi(self, Controls): 500 | _translate = QtCore.QCoreApplication.translate 501 | Controls.setWindowTitle(_translate("Controls", "Form")) 502 | self.labelDeltaT.setText(_translate("Controls", "T")) 503 | self.labelDeltaTDisplay.setText(_translate("Controls", "0")) 504 | self.labelTInverse.setText(_translate("Controls", "F")) 505 | self.labelTInverseDisplay.setText(_translate("Controls", "0")) 506 | self.labeltperDiv.setText(_translate("Controls", "T/Div")) 507 | self.labelTperDivDisplay.setText(_translate("Controls", "0")) 508 | self.labelVperDiv.setText(_translate("Controls", "V/Div")) 509 | self.labelVperDivDisplay.setText(_translate("Controls", "0")) 510 | self.labelVpp.setText(_translate("Controls", "Vpp")) 511 | self.labelVppDisplay.setText(_translate("Controls", "0")) 512 | self.labelVRMS.setText(_translate("Controls", "VRMS")) 513 | self.labelVRMS_Display.setText(_translate("Controls", "-")) 514 | self.labelVRMSAC.setText(_translate("Controls", "VRMS(AC)")) 515 | self.labelVRMSAC_Display.setText(_translate("Controls", "-")) 516 | self.groupBoxSettings.setTitle(_translate("Controls", "Settings")) 517 | self.comboBoxTimeBase.setToolTip(_translate("Controls", "Seconds per centimeter")) 518 | self.labelTimeBase.setText(_translate("Controls", "Timebase")) 519 | self.labelVerticalDeflection.setText(_translate("Controls", "Vertical deflection")) 520 | self.labelMultiplier.setText(_translate("Controls", "Multiplier")) 521 | self.groupBoxView.setTitle(_translate("Controls", "View")) 522 | self.checkBoxLive.setText(_translate("Controls", "Live")) 523 | self.checkBoxDigitizedView.setText(_translate("Controls", "Digitized")) 524 | self.checkBoxSingleShot.setText(_translate("Controls", "Single shot")) 525 | self.checkBoxPersist.setText(_translate("Controls", "Persist")) 526 | self.checkBoxLines.setText(_translate("Controls", "Lines")) 527 | self.groupBoxStorage.setTitle(_translate("Controls", "Storage")) 528 | self.pushButtonSnapshot.setText(_translate("Controls", "Snapshot")) 529 | self.pushButtonDigitizedData.setText(_translate("Controls", "Digitized Data")) 530 | self.checkBoxPause.setText(_translate("Controls", "Pause")) 531 | self.groupBoxSetup.setTitle(_translate("Controls", "Setup")) 532 | self.toolButtonCalibrate.setText(_translate("Controls", "Calibrate")) 533 | self.dockWidgetCalibration.setWindowTitle(_translate("Controls", "&Calibration")) 534 | self.labelHorizontalDivisions.setText(_translate("Controls", "Horizontal Divisions")) 535 | self.pushButtonReset.setText(_translate("Controls", "Reset")) 536 | self.pushButtonCrop.setText(_translate("Controls", "Crop")) 537 | self.labelVerticalDivisions.setText(_translate("Controls", "Vertical Divisions")) 538 | self.pushButtonGrid.setText(_translate("Controls", "Grid")) 539 | 540 | from Forms.CursorControl import CursorControl 541 | from Forms.DigitizerView import DigitizerView 542 | from Forms.Grid import Grid 543 | from Forms.WebCamView import WebCamView 544 | 545 | if __name__ == "__main__": 546 | import sys 547 | app = QtWidgets.QApplication(sys.argv) 548 | Controls = QtWidgets.QWidget() 549 | ui = Ui_Controls() 550 | ui.setupUi(Controls) 551 | Controls.show() 552 | sys.exit(app.exec_()) 553 | 554 | -------------------------------------------------------------------------------- /Forms/icons_rc.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Resource object code 4 | # 5 | # Created by: The Resource Compiler for PyQt5 (Qt v5.9.4) 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore 10 | 11 | qt_resource_data = b"\ 12 | \x00\x00\x23\x1d\ 13 | \x89\ 14 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ 15 | \x00\x00\x40\x00\x00\x00\x35\x08\x06\x00\x00\x00\xf1\x86\xed\xac\ 16 | \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ 17 | \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ 18 | \x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ 19 | \xe3\x06\x06\x12\x17\x15\x81\xd3\x7e\x93\x00\x00\x20\x00\x49\x44\ 20 | \x41\x54\x68\xde\x55\xba\x69\x8c\xa5\xd9\x79\xdf\xf7\x3b\xcb\xbb\ 21 | \xdc\xf7\x2e\x75\x6b\xaf\xea\xa5\x7a\x9f\xee\x9e\xee\x59\xba\x87\ 22 | \xb3\x71\x1d\x0d\x35\x32\x29\x09\xb2\x65\xc6\x8e\x11\xca\xb2\xe5\ 23 | \xc4\x49\x6c\x39\x81\x10\x20\x01\x04\x24\x00\xe3\x00\x81\xa3\x0f\ 24 | \x0e\x62\xf8\x43\x3e\x44\x46\x02\x47\x8e\x0d\x49\xa4\x24\x9a\x26\ 25 | \x29\x71\x38\xe4\x70\x16\xce\x0c\x87\x33\x3d\xdd\xd3\xfb\x54\x6f\ 26 | \x55\x5d\x7b\xdd\xba\xdb\xbb\x9e\x25\x1f\xde\xea\x61\x52\xc0\x45\ 27 | \x15\x50\xf7\xde\xf7\x3c\xe7\x3c\xcf\x73\xfe\xff\xff\xf3\x17\x5f\ 28 | \xf9\xfa\x3f\xf4\xff\xc3\x6f\x1d\x64\x71\x2e\xc0\x7b\x87\x94\x92\ 29 | \xcd\x0d\xcf\x38\x55\x04\x7e\x8f\x83\x8b\x00\x15\xce\x39\x00\x94\ 30 | \xd6\x78\x6b\xb1\x65\x85\x31\x1e\x3c\x78\xe7\x10\x42\xe0\xac\xc7\ 31 | \x7b\x81\xf5\x1e\xad\x41\x07\x02\x21\x04\xd6\x38\xac\xb5\x48\x09\ 32 | \x52\x09\x6c\xa5\xd9\xda\x18\x62\x4c\xc1\xf4\x4c\x03\xef\x1d\x4e\ 33 | \x84\x54\x56\x52\x1a\x8b\x47\xe2\x3d\x54\xc6\xa1\x95\xa6\x34\x06\ 34 | \xef\x41\x48\x0d\x72\xff\xfb\x9c\x03\x0f\xd6\x82\x75\x16\xef\xc1\ 35 | \x7b\xb0\xd6\x63\x9d\xc3\x7a\x8f\xb3\x1e\xbc\xc3\x1a\x83\x35\x16\ 36 | \x6b\x2a\x16\x17\xda\x14\x55\xc5\xda\xd0\x72\x63\xa3\x40\xff\xe7\ 37 | \x7f\x2d\xe1\xc2\xe3\x82\x28\x89\x91\x12\x46\x83\x8c\xf1\x28\xe4\ 38 | \xec\xc5\x17\xb9\xfa\xd3\x6f\x23\x65\xc9\x81\x83\xb3\x54\x55\x89\ 39 | \x03\xf2\xac\xa2\x3f\xc8\xd9\x4e\x4b\xae\x5c\x5f\xe3\xee\x83\x1e\ 40 | \x7b\xfd\x94\xbc\xb4\x08\x01\xed\x66\xcc\xd2\x62\x97\xb3\x27\x67\ 41 | \x39\xb8\xd0\xa6\x11\x08\xa6\xa6\xdb\xe0\x1d\xa6\x32\x00\x64\xd5\ 42 | \x34\x27\x17\x2f\x30\xdc\x5d\x63\xbc\x7b\x83\x23\x47\xe7\x29\xcb\ 43 | \x1c\x63\x1d\x83\x41\xce\x4e\x2f\x63\x73\xab\x8f\xa9\x2c\x52\x08\ 44 | \xac\xf5\x38\xc0\x7b\x8f\x75\x1e\xcf\x2f\x36\x1e\x04\x50\x07\xed\ 45 | \x6c\x7d\x48\xce\xef\xff\x1f\x10\x52\x22\xa4\xc4\x23\x30\xc6\xb0\ 46 | \xbc\xbc\x8e\x07\x66\xe7\x26\xf8\xd2\xe9\x09\xf4\x5c\xd7\x12\xc5\ 47 | \x0d\x4c\x59\x80\xf3\x04\x4a\x72\xf3\xd2\xbb\x7c\xf7\x9b\xdf\x26\ 48 | \x0a\x0c\x13\x93\xf0\xf5\xdf\xfe\x0d\x06\xc3\x82\x6b\xcb\x9b\xfc\ 49 | \xe8\xed\xdb\x7c\xff\xb5\x6b\x5c\xbe\xb6\x45\x65\xa1\x7e\x24\x08\ 50 | \x01\xc8\xfa\x14\xa8\xff\xe4\xc8\xc1\x98\xcf\x7f\xe6\x38\x2f\x7f\ 51 | \xf6\x34\xe7\x8e\x4f\x73\x68\xae\x0b\xde\x71\xe7\xd6\x6d\xd6\xd6\ 52 | \x2e\x71\xeb\xea\x15\x26\xa7\x22\x16\x16\xa7\x50\x52\xa2\x95\x24\ 53 | \xcb\x4a\xfe\xcf\x7f\xf5\x1a\x0f\x56\xf6\x68\x4f\xb4\x11\x42\x22\ 54 | \xea\x90\x11\x4a\x20\x04\x08\x21\xf1\xae\x0e\x5d\x08\x81\xdc\x0f\ 55 | \xd2\x79\x8f\xc7\xee\xaf\x41\x00\x02\xe7\x2d\xde\x0b\xf6\x3f\x88\ 56 | \x90\x92\x74\x5c\x70\xfa\x74\x9b\x2f\xbd\x74\x01\x6d\x6d\x85\x29\ 57 | \x72\xac\xf3\xb0\x9f\x56\x27\x4f\xcd\x70\xef\xee\x0a\xe3\x6c\xcc\ 58 | \xe9\xf3\x8f\xf3\xf6\xcf\x1f\xf0\x6f\xff\xfc\x1d\xfe\xec\x7b\x97\ 59 | \x59\xdf\x2c\x51\x4a\x20\x95\x42\x4a\x8f\x14\xe2\x17\x51\x3f\xfa\ 60 | \x55\xaf\x8c\xfb\xeb\x15\x7f\xf4\xef\xaf\xf2\x27\x7f\x79\x95\xe7\ 61 | \x9f\x3a\xcc\xdf\x7c\xe5\x2c\x5f\xbc\x78\x8c\x20\x28\xb9\x7a\xf5\ 62 | \x0a\x9b\xeb\xdb\x48\xd5\xc1\x54\x15\x06\x8b\x94\x8a\xf1\xa8\xa4\ 63 | \xdd\xd2\xfc\x93\xdf\xff\x87\x1c\x3a\x72\x04\x2f\x3c\x78\x8b\x90\ 64 | \x1e\x21\x40\xaa\xfd\xcd\xf6\x96\x7c\x34\xc0\x56\x05\x52\x2a\x10\ 65 | \x12\xa1\x24\x49\x2b\x46\x6a\xf5\x68\x29\xfb\x6b\x13\x08\x59\xaf\ 66 | \x59\x69\x45\x91\x96\x7c\xf8\xd6\xdb\xd8\xaa\x42\x3b\xfb\x69\x21\ 67 | \xe1\xbc\x45\x78\xc1\x89\x13\x0b\x84\xf1\xf3\x0c\x87\x39\xdf\x7b\ 68 | \x73\x99\x3f\xfd\xee\xab\x7c\x7c\x7d\x1b\xa5\x04\x81\xae\x77\x56\ 69 | \xee\x9f\x88\xf3\x1e\xa9\xea\x5a\xf7\x80\xf0\x75\x56\x18\xe7\xf0\ 70 | \xae\x7e\x78\x55\x0a\x7e\xf2\xfe\x0a\x97\x97\x37\x79\xe9\xb9\xbb\ 71 | \xfc\xd6\x57\x2f\xf2\x85\x2f\x9c\xa7\xbf\xd7\xe7\xd0\xc1\x49\xb4\ 72 | \x16\x98\xca\xe3\x9d\x43\xe2\x78\xea\xc9\x23\xfc\x8d\xdf\xf9\x3b\ 73 | \xc0\xc4\x7e\x14\x06\xb0\xfb\xaf\x9c\xd1\x60\x87\x66\x2b\x66\x34\ 74 | \xd8\x61\xd4\xdb\x41\xeb\x3a\x30\x2f\x05\x9d\x6e\x87\xd1\x70\xc8\ 75 | \xe4\xcc\xec\xa7\xe5\xf1\x28\x1b\xea\xbc\xf4\xd8\x22\xe3\xf6\xa5\ 76 | \x9f\xe1\xac\x47\x23\xea\xc5\xe3\x3d\x62\x7f\xb7\xb4\x86\xb9\x03\ 77 | \x33\xfc\xf3\xff\xf9\x9b\xfc\xf9\xf7\x3e\x66\x34\x32\x68\x29\x10\ 78 | \x1e\x94\x52\xa8\x40\x22\xa4\x27\x08\x35\xcd\x56\x83\x56\x2b\x26\ 79 | \x69\x84\x04\x81\xa6\x32\x06\x63\x1c\x45\x69\x19\x8d\x72\xc6\xe3\ 80 | \x9c\x2c\x2b\x28\x2b\xc3\xde\x5e\xc5\xbf\xff\xc9\x1d\x96\x37\xfa\ 81 | \xfc\xde\xdf\x7a\x8e\x5f\x79\xe9\x09\xb2\x2c\xa5\x2a\xf7\x4f\x11\ 82 | \x08\x03\x45\x23\x12\xac\x5d\xfb\x39\xdd\xa5\x73\x20\x43\x1a\x8d\ 83 | \x16\x60\x28\x8a\x21\x7b\x3b\x1b\x24\xcd\x18\x8f\x27\x6a\x24\x64\ 84 | \xf9\x98\x3c\xcb\x88\x03\x45\xd2\x6c\x20\x75\x5d\x32\x5b\xeb\xab\ 85 | \x4c\xcd\x4e\x21\x95\x46\x20\x00\xc8\x8b\x92\x28\x0c\x29\xca\x0c\ 86 | \x29\xa1\xaa\x2a\xb4\x73\x1e\xef\x3c\xd6\x54\x48\x29\x90\x0a\x7a\ 87 | \xfd\x94\xff\xfa\x1b\xdf\xe4\xd5\x37\xef\x93\x8e\x4b\x24\x82\x48\ 88 | \x2b\xa2\x48\xa3\x43\xe8\x74\x5b\x2c\x1d\x5b\x60\x71\x71\x06\xd5\ 89 | \x52\x54\x0d\x49\x95\x04\x54\x91\xc4\x49\x70\xd6\x61\x4b\x4b\x39\ 90 | \xca\x49\x77\x47\x14\x9b\x29\xdb\x77\x77\xe8\x6d\xec\x91\xe6\x86\ 91 | \x8f\x3f\xe9\xf1\x4f\xff\xef\x37\x70\xde\xf2\xd2\x53\x87\x91\x5a\ 92 | \x63\x2b\x53\xd7\xbb\x14\xe0\x0c\x83\xf5\x55\xc2\xa9\x69\x1a\xcd\ 93 | \x49\xfa\xbd\x01\x52\x0a\x84\x2f\x48\x92\x88\x56\xbb\xc9\x68\xdc\ 94 | \x07\x1c\xed\x4e\x87\xe9\x99\x69\x8c\x29\x29\xca\x9c\xd1\x70\x44\ 95 | \x77\x6a\x82\xcd\x8d\x0d\x7a\x5b\xdb\x74\x26\xbb\xac\xaf\x6d\xd3\ 96 | \x9d\x6c\xb3\xbb\xbb\x47\xa7\xd3\x26\xd2\x41\x7d\xab\x79\x87\x36\ 97 | \xce\xe3\x70\x28\x1d\x80\x77\x48\x15\xf1\x3f\xfd\xcb\x6f\xf3\xfa\ 98 | \xbb\x2b\x64\x69\x89\x16\x90\xc4\x21\xcd\x66\xc8\xec\xec\x04\x8f\ 99 | \x3f\x71\x9c\xee\x42\x9b\xf6\xd2\x34\x7b\x2d\x18\x4c\x04\x8c\x94\ 100 | \xc7\x2a\x70\x78\xf2\xaa\x22\xaf\x4a\xbc\x77\xc0\x04\x45\x3e\x49\ 101 | \x9e\x96\x04\x3b\x0b\xcc\x2d\xf7\x49\x2f\xad\x32\x58\x1b\xb0\xbe\ 102 | \x95\xf3\x07\xdf\x7a\x8f\x85\xe9\x0e\x67\x0e\x76\x70\xde\xa1\x84\ 103 | \xac\x3b\xbb\x87\x6c\x38\x60\x7a\x7e\x96\x1b\x97\xaf\xf3\x07\xbf\ 104 | \xff\x4f\xf9\xdc\x2b\xbf\xcc\xdf\xfd\x47\x7f\x17\x21\x35\xe3\x74\ 105 | \x40\xbb\x1d\x93\xa5\x19\x51\xac\x31\x95\x21\x8a\x63\xd2\x6c\x4c\ 106 | \x14\x68\x76\x7b\xbb\x4c\xcd\x74\x11\x42\x70\xf3\xca\x0d\x6e\x5e\ 107 | \xb9\xce\xd3\x2f\x7c\x86\xa3\x27\x8f\x03\x90\xee\x0d\x00\x87\x00\ 108 | \xb4\x35\x1e\x6f\x0c\xd6\x43\xa3\x91\xf0\x87\x7f\xf2\x06\xdf\x7d\ 109 | \x73\x99\xe1\xa8\x6e\x76\xdd\x4e\x93\xd9\x99\x26\x4f\x3d\x75\x82\ 110 | \xe7\x3e\xfb\x04\x65\x5b\xb2\xd1\x95\x3c\x88\x2c\xae\xa1\xd9\x2e\ 111 | \x32\xc6\xc6\xa0\x3c\x74\x82\x88\x6e\x12\x50\xda\x88\x2c\xcf\x41\ 112 | \x2a\x72\x69\x19\xe0\x29\x1b\x0d\xdc\x42\x44\xfc\xf8\x14\x07\xdf\ 113 | \x79\xc8\xe8\xe3\x87\xf4\x76\x73\xfe\xd7\x3f\xff\x29\xff\xcb\xdf\ 114 | \x7f\x99\x76\xac\xb0\xd6\xa1\x94\x44\x08\x48\x87\x43\xc0\x33\x33\ 115 | \x33\xc1\xd3\x4f\x9f\x65\xa2\x21\xd8\xdb\xde\xa2\x33\xd3\x21\x69\ 116 | \x68\xd2\x34\x47\xeb\x90\xad\x8d\x11\x57\x2f\xdf\xa2\xd5\x4e\x38\ 117 | \x73\xee\x04\xde\xa5\x08\xa0\xdf\x1f\x32\x3d\x33\xc9\xb1\x93\xc7\ 118 | \xe9\x76\xbb\x4c\xcd\xcf\x50\x77\x27\x89\xf3\x0e\xe9\x3d\x08\xd0\ 119 | \x5a\x07\x38\xeb\x89\xa2\x98\x8f\x3f\x59\xe5\x9b\x3f\xbe\xc1\xf6\ 120 | \xd6\x98\x46\xac\x99\x9a\x9b\x60\x66\x7e\x82\x97\xbf\xf0\x04\x5f\ 121 | \xfe\xca\xe7\xd8\x24\x65\x33\x72\x48\x69\x98\x90\x8e\xc1\x78\x4c\ 122 | \xa7\xd5\x24\x1f\x0d\x89\x9c\x40\x59\x87\x96\x9a\x44\x05\x74\x62\ 123 | \xc5\xa0\x2c\xe8\xa8\x08\x95\x48\x06\xa6\xc2\x07\x9e\x38\x6e\x10\ 124 | \x7c\xf5\x34\x33\x53\x2d\xfc\xd5\x87\xac\x6c\x8d\xf9\x93\xb7\xae\ 125 | \xf2\xdb\x5f\x7a\x02\xbc\x40\x29\x85\x94\x50\x64\x63\xf0\x15\xd3\ 126 | \x8b\x0b\x7c\xfd\xbf\xfa\x2f\xc9\xc6\x23\xda\x93\x2d\xaa\x22\x83\ 127 | \x30\x40\x78\xc5\xbb\xaf\xbd\xcb\xbf\xf8\x83\x3f\xc4\x58\xc7\xe2\ 128 | \x7c\x97\x43\x87\x67\x79\xfe\x97\x5e\xe0\xe2\x0b\x67\x51\xb2\x62\ 129 | \x30\x18\xd1\xe9\x74\x58\x6c\x35\x29\x8b\x14\x53\x55\xe8\x20\xc4\ 130 | \x54\x25\x42\x82\x94\x02\xed\xf7\x01\x44\x5e\x56\xbc\xf6\xf3\x65\ 131 | \x2e\x7d\xbc\x86\x16\x82\xee\x6c\x87\x60\xb1\xc9\xd2\xe3\x8b\x7c\ 132 | \xf6\x95\xe7\xe9\x4d\x69\xee\x3b\x41\x6e\x3d\x3b\x55\xc9\x5a\x3a\ 133 | \x42\xcb\x80\x07\xc3\x3d\xf6\x30\x4c\x5a\x89\x51\x01\x3b\x76\x4c\ 134 | \x62\x60\x52\x45\xa4\x38\x2a\xe1\x30\x78\x76\xa9\x30\x38\x3a\x5e\ 135 | \x93\x2a\x03\xcf\x4c\xf1\xb8\xf3\xb8\x8f\x97\x79\xef\xe1\x1e\x9f\ 136 | \xdb\xec\x71\x7c\x7a\x02\x29\xea\x0c\xa8\x8a\x02\x4c\x05\x41\x93\ 137 | \xa9\xf9\xc3\x58\x97\x92\xa5\x3b\x84\xa1\x02\xa1\xb9\xf4\xfa\xdb\ 138 | \x24\x2e\xe6\xc0\xf4\x3c\x9d\x50\x71\x6a\xaa\x49\x0b\xb8\xfe\x9d\ 139 | \xb7\x98\x6a\xb7\x39\xf9\xcc\x12\xc2\x3b\xf2\xbc\x20\x8e\xdb\x5c\ 140 | \x7e\xe7\x12\xd3\xf3\x33\x1c\x3d\x7d\xaa\x46\x85\xd6\x61\x2d\x68\ 141 | \xef\x3d\x2a\x08\xb8\xfb\xb0\xc7\x0f\x7e\x74\x9d\xbc\x5f\xd2\x6e\ 142 | \x35\x88\x67\x1a\x2c\x9c\x3a\xc8\x53\x2f\x7f\x9e\xad\xa9\x84\xac\ 143 | \xa5\x49\x33\xc1\xb8\xac\xc8\x94\x26\x6c\xcf\x93\x84\x11\x0d\x34\ 144 | \xfd\x7c\xbb\x86\x10\x51\x13\x95\x34\x50\x42\x53\x95\x25\xd9\x68\ 145 | \x07\x89\xa0\x9d\xb4\x58\xea\x1c\xc1\x5a\x8f\x18\x8d\x30\xc3\x2d\ 146 | \x8a\x86\x63\xf0\xf2\x69\x26\x3a\x09\xab\x0f\x57\xf8\xd9\xbd\x2d\ 147 | \x8e\x74\x3b\x08\x51\xdf\xd9\x55\x51\x60\x8a\x0c\x15\x4c\x20\xb0\ 148 | \x78\x57\xa1\xa4\x25\x08\x42\xde\x7d\xe3\x43\x5e\xfd\xee\xdb\x8c\ 149 | \xfb\x29\x1d\x04\x7f\xfd\xd0\x22\xe7\xa7\x3b\x08\xeb\x28\xf2\x8a\ 150 | \xeb\x7f\xfa\x1a\xee\xf8\xd7\x68\x2e\x4c\x61\x0c\x0c\x76\xfb\x6c\ 151 | \xad\x8d\xb9\x75\x63\x9d\x4e\x77\x12\x6f\x2c\xce\x5a\x9c\x01\x29\ 152 | \xa5\xc0\x54\x8e\x4f\xee\xf5\xb8\xf4\xd1\x2a\x5a\x4a\x9a\xdd\x84\ 153 | \xd9\x99\x36\xc7\x9f\x3c\x45\x71\x72\x91\xf5\x66\x4c\xcf\x0b\x46\ 154 | \x65\x45\x6e\x2d\xc2\x4b\xba\x71\x9b\x56\xd4\x62\xb1\x35\xc9\x5c\ 155 | \xd8\xa4\x29\x54\xcd\x03\x64\x40\x25\x03\x8c\x0c\x28\x9c\xc3\x4b\ 156 | \x41\x23\x88\x48\x82\x88\x48\x85\xf5\x09\x3b\x8f\x72\x9e\x72\x32\ 157 | \xa4\xff\xf8\x1c\x7e\x73\xcc\xf2\x9d\x3e\xeb\xbd\xb4\x06\x64\x5e\ 158 | \x60\x2a\x4b\x95\xa6\x88\xfd\xfb\xdf\xb9\x82\xd1\xa8\x8f\xa0\xe2\ 159 | \xbd\xb7\x3f\xe2\x27\x6f\x5e\x63\xf5\xe1\x0e\xad\x34\xe7\xbc\x15\ 160 | \xd8\xf5\x5d\xfc\x20\xa3\xd5\xcf\xb9\xb0\x9e\x93\xfd\xeb\x57\xb1\ 161 | \x38\x9c\x73\x2c\xdf\x58\xe6\x5b\xff\xf6\x87\xfc\x6f\xff\xec\x9b\ 162 | \xbc\xf3\x93\x4b\xb8\xca\x60\x8c\x41\xe0\xd1\x78\xcf\x70\x94\x71\ 163 | \xfd\xf6\x36\xc3\x81\xa5\xdd\x4d\xe8\x4e\xb5\x78\xec\xf4\x51\xaa\ 164 | \xd9\x80\xbb\xd9\x2a\xb1\x09\xb0\xc2\x61\x6d\x05\x95\x21\x37\x15\ 165 | \x99\x2b\xd0\x08\x9c\xb3\xb8\xb2\xc0\x9b\x92\xc2\xee\xf1\x30\xdf\ 166 | \x02\xeb\x99\x15\x21\x85\x29\x90\x41\x44\x99\x8f\xb9\xbf\xb7\xc6\ 167 | \xb8\x2a\x69\x3a\x49\x66\x4a\x1c\x9e\xc1\xde\x0e\xa5\xcb\x39\xb9\ 168 | \x30\xcb\xa0\x97\x73\xf3\xee\x06\xe7\x0e\x4f\xef\x93\x21\x4f\x91\ 169 | \xa6\x34\xb0\x80\xc0\x7b\x47\xd2\x88\x41\x0a\xc2\xa8\x41\x7f\x98\ 170 | \xf2\xd8\xf1\x25\x92\x32\x27\xdf\x1d\xd0\x52\x0a\xdf\x2f\x29\x87\ 171 | \x63\x54\x5a\x32\x71\x63\x9d\x10\x41\x26\x0c\xdd\xa9\x0e\xad\x4e\ 172 | \x8b\x03\x0b\x5d\x06\xdb\x1b\xd8\x72\x09\x63\x0d\x51\x10\x20\x03\ 173 | \x2d\x18\x8e\x32\x6e\x2e\xaf\x23\x80\x46\x12\xb1\xb8\x38\x49\xf7\ 174 | \xc8\x34\xe5\x84\x02\x57\x90\x65\x03\x06\xc3\x3d\x8a\xb2\xa0\xb0\ 175 | \x86\xa2\xca\x29\xf2\x94\xc0\x7b\xca\xf1\x18\xe1\x2c\x91\xd4\x24\ 176 | \x48\xa6\xa4\x62\x52\x48\x94\xb5\x08\x3c\x4a\x0a\xbc\x73\x84\x78\ 177 | \x1a\x42\x10\x7b\x41\x88\xa8\x79\x47\x65\x69\xc5\x21\xc1\x89\x59\ 178 | \xaa\xca\x72\x7f\xb5\xc7\x70\x5c\x82\xaf\x09\x4d\x39\x1e\x02\x15\ 179 | \x60\x10\xc2\x33\x1e\x0e\xe8\x6f\x3f\xe4\x57\x7e\xed\x05\x8a\xa2\ 180 | \xe4\xc6\xed\xfb\xec\x36\x62\x3e\x18\x0d\x11\x16\xe4\xd6\x08\xbf\ 181 | \x35\x44\x25\x4d\x76\xdb\x0d\xfa\x0f\x37\x89\xe2\x98\x99\xb9\x0e\ 182 | \xff\xe0\x77\xff\x3a\xbf\xfb\xdf\xfe\x06\x2f\x7e\xe9\x33\xf5\x5d\ 183 | \x20\x45\xbd\xbe\xdf\xf9\x3b\xcf\x7c\x23\x0a\x24\xdf\xfc\xfe\x65\ 184 | \xd6\x77\xc7\xcc\x2e\x74\x39\x7d\xfe\x08\xad\xb3\x8b\x8c\x9a\xe0\ 185 | \xac\x21\xd4\x01\x7e\xff\xaa\x93\xd6\x53\x78\x4b\x5e\x95\xc8\xca\ 186 | \xe1\x9d\xa3\x21\x43\x26\x75\x48\x60\x1c\xd2\x3a\xba\x41\x4c\x60\ 187 | \x1c\x5a\x2a\x1a\x4e\xd2\x70\x35\x51\x51\xd6\xd3\x75\x12\x05\x48\ 188 | \x04\x13\x3a\xc4\x19\x43\x22\x34\xc1\x4a\x8f\x96\x52\x68\x57\xa2\ 189 | \x85\x23\x08\x14\xb3\x07\xe7\xe9\x1c\x9c\xc1\xe3\x10\xc2\x22\x29\ 190 | \x09\x84\x67\x72\x3a\xa1\xc8\xe0\xdd\xb7\xae\x20\x1b\x11\x1f\x6d\ 191 | \x0d\xb9\xb7\xd2\x63\x69\x76\x9a\xe6\x4c\x97\x87\x93\x8a\x6b\xd3\ 192 | \x96\x87\x83\x5d\x4e\x3c\x7d\x9e\xb0\x11\x30\x33\x3f\xc5\x91\x93\ 193 | \x4b\x4c\x2e\x4c\xb3\xb7\xb5\xcb\x83\xdb\x77\xf1\x0e\x74\x1c\x85\ 194 | \xe4\x45\x4e\xaf\x3f\x44\x29\xc9\xf4\x4c\x87\xce\x62\x97\x5d\x5d\ 195 | \x31\x74\x8e\xb4\xc8\x69\x9a\x92\xd2\x18\xa2\x30\x44\x21\xd9\x29\ 196 | \x33\x4a\xef\xf0\xca\x63\xbd\x23\xf5\x86\xb6\x95\x28\xeb\x18\xfa\ 197 | \x02\x51\x55\x28\x07\x9b\x26\xa3\x19\x84\xcc\xea\x98\xb4\x2a\x29\ 198 | \xbd\xc1\x52\xf3\xfb\xa2\x2a\x48\x8d\x03\x3c\x65\xac\x08\x66\x5a\ 199 | \xf8\xc2\xf1\x70\xad\xc7\xf1\x03\x1d\x8c\x71\x0c\x77\xfb\x6c\xad\ 200 | \x3e\xa4\xaa\x0c\x9d\x6e\x0b\x21\x3d\x52\x4a\x5c\x59\xf0\x0f\xfe\ 201 | \xd1\x97\xe9\x6d\x6d\x72\xef\xe6\x1e\xab\xfd\x21\x97\xb7\x7a\xbc\ 202 | \x36\xe8\xf3\xeb\xbf\x74\x8c\x6e\xa7\xc9\x60\x98\x32\xbb\x1d\x73\ 203 | \xf3\xcd\x9f\xd1\x58\x98\xa4\x91\x34\x10\x4a\x52\xe5\x15\xce\x1a\ 204 | \xbc\xab\x79\x92\x34\x55\x85\x31\x06\xef\x04\x3a\x50\x4c\xcd\x4f\ 205 | \x30\x73\x74\x1e\xd5\x08\x30\x58\x1c\xbe\xe6\xd7\x8f\x58\x9f\x73\ 206 | \x34\x82\x60\x1f\x9a\x7a\xc6\x65\x81\x31\x06\xad\x24\x81\x94\xb4\ 207 | \xa2\x06\xa1\x92\x04\x4a\xa1\x95\xa2\x32\x96\xbc\x28\x09\xa4\x64\ 208 | \x32\x6e\x30\x15\x45\x4c\x27\x4d\x42\xad\x91\x42\x20\x91\x88\x28\ 209 | \x20\x99\x6c\xd3\x6a\xb5\xe8\x0f\x73\xb2\xdc\xb2\xb3\x3b\xe6\xde\ 210 | \xf2\x2a\xde\x79\x92\x66\xcc\x5e\xaf\x07\x08\xd2\x3c\xa7\x3f\x1a\ 211 | \x11\x47\x92\xff\xee\x7f\xfc\x2d\xbe\xfc\x95\xf3\xb4\x1a\x8e\xd3\ 212 | \x27\x67\x78\xee\xf3\xc7\x08\xe7\xda\xf4\xb3\x82\x46\x92\xe0\x2b\ 213 | \x4f\xd9\x1b\x70\xf7\xca\x36\xbf\xff\x7b\xff\x9a\x7b\x77\xf7\x58\ 214 | \x58\x3a\xb4\x4f\x8a\x04\x08\x8f\xd6\x4a\x51\x15\x0e\xad\x15\x61\ 215 | \x28\x99\x9e\x9f\x40\x25\x92\xb9\x40\xb1\xd0\x39\x84\xc1\xb3\xdd\ 216 | \xdb\xa5\x10\x16\xa9\x02\xaa\xaa\x42\x58\x4f\xe2\x23\x9c\xb1\x34\ 217 | \x9d\x44\x2a\x49\xd7\x29\x62\x15\xa1\x5c\x45\xe5\x04\x81\x90\x68\ 218 | \xe1\x31\xc2\xd1\xf0\x82\x49\x19\x10\xa3\x50\x58\x44\x65\x50\x22\ 219 | \xc6\x7a\xd8\x36\x19\x2e\x0c\xb1\x4a\xa0\xa4\xc4\x3a\x4f\x51\x3a\ 220 | \x16\xe7\x26\x98\xea\xb6\x59\xbf\xbb\xc9\xd8\x5a\x9e\xfe\xcc\x29\ 221 | \x9a\xed\x06\xae\xd5\xc0\x59\xcb\xb0\x3f\x24\x89\x43\xfe\xe3\xdf\ 222 | \x79\x19\xb2\x21\xf7\xae\xdf\x61\x76\x36\xa2\xc8\x33\x3a\x9d\x06\ 223 | \x81\x56\x38\x6b\x79\xf0\xc9\x0a\xcb\x6b\x19\xa3\xad\x1d\x3e\xf9\ 224 | \xf8\x1e\x4f\x3e\x79\x02\xac\xc7\x7b\x50\x4a\xd6\x25\x50\x65\x8e\ 225 | \x66\x12\xa0\xc6\x92\xa8\x1d\x11\xc4\x21\xb3\xb1\x26\xb7\x9e\xf5\ 226 | \xf1\x80\xbc\xc8\xb1\x4a\x91\x9b\x94\xa2\x32\x8c\x70\x38\xa1\x28\ 227 | \xca\x92\x61\x55\xa0\x94\x24\x50\x16\xed\x05\x5b\xbe\xc2\x3a\x47\ 228 | \x22\x43\xfa\x26\xc7\x3b\x8f\x97\x9a\xac\x48\x09\xb5\x26\xf1\x92\ 229 | \xa1\xc9\x28\x2a\x83\x75\x1e\xa5\x25\xc6\x19\xb2\x22\x27\x2f\x1c\ 230 | \xc6\x39\x2a\xeb\xb0\xce\xb3\xbb\xd5\xe7\x5b\x7f\xf4\x2e\xef\x5c\ 231 | \xbe\xcf\x3f\xfb\xe7\xbf\xcd\xaf\xfd\xcd\xcf\x22\x55\x80\x54\x92\ 232 | \xc9\xd9\x29\xbc\x77\x08\x04\x5f\xfb\x4f\x7f\x95\x9f\x7d\xff\x0d\ 233 | \xb6\x57\xd7\xa8\x81\x9d\xad\x09\xbb\x17\xec\xec\x8c\x79\xef\x9d\ 234 | \xdb\xdc\xbd\xbb\xcb\xb7\xff\xe4\x55\x5e\x7e\xe5\x22\x55\x51\xd5\ 235 | \xdc\xc3\x2b\xb4\xc0\xd1\x88\x35\x33\x53\x09\xf7\x77\x86\x78\x2d\ 236 | \x11\x81\x64\x5c\x95\xdc\x1c\xf6\xe9\x97\x25\x9d\xa4\x45\x6e\x4a\ 237 | \xbc\x0e\x70\x52\xb0\x9b\x0e\x91\x61\x88\xd4\x92\xca\x4b\x7c\xa0\ 238 | \x18\x39\x4f\x88\xa0\x87\xab\x4b\x47\x3a\xb2\x40\x82\x73\xc4\x3a\ 239 | \x20\xa3\x22\x93\xb5\xb4\x35\x56\x92\x52\x83\xf4\x02\xe5\x6a\x69\ 240 | \x2b\x92\x0a\x85\xc3\x58\x8b\xb5\x16\xef\x04\xbd\xde\x88\xca\x69\ 241 | \x6c\x65\xb9\xf7\xc9\x2a\x2b\xf7\xd6\x40\x09\x16\x0e\xce\x21\xb4\ 242 | \xc4\x0b\x89\x42\x91\xcc\x4f\x71\xf1\x95\x17\xd9\xb8\x75\x8f\x2a\ 243 | \xcd\xf8\xe4\xe3\x1b\x94\x79\x85\xf7\x90\x8e\x0b\x94\x10\x1c\x3d\ 244 | \x3c\xc3\xfc\x54\x00\xb6\xc2\xda\x0a\xef\x6b\x16\xac\xab\xb2\x40\ 245 | \x78\xc3\xa1\xb9\x0e\x1f\xde\x5a\x27\x35\x25\x59\x55\xa2\xc3\x80\ 246 | \x38\x88\xc8\x1d\x94\x95\xa1\x32\x16\x85\x44\x79\x41\xa2\x22\x04\ 247 | \x1a\x21\x1c\x4e\x3a\xac\x07\xe1\xeb\xab\x2d\x96\x0a\xa1\x14\x09\ 248 | \xba\x16\x45\xbc\x24\xf1\x12\x74\x4c\xe1\x2d\xb1\xd0\xa0\x3d\x06\ 249 | \x45\x69\x0c\xd6\x57\x48\xe3\x98\x8d\x13\xf4\x60\x48\x59\x56\x38\ 250 | \x07\xfd\xde\x88\xa8\x91\x30\x4a\x0b\x3c\x92\x4e\xb7\xcb\xec\xc2\ 251 | \x0c\x69\x9a\x82\x94\x80\x42\x78\x49\x51\x14\x48\x04\x56\x29\xe6\ 252 | \xcf\x1c\xa5\x11\x47\x24\x49\xc4\xc7\x1f\x7c\xcc\xa8\x3f\x26\x69\ 253 | \x2a\xbe\xf2\xd5\x27\x38\x7e\xfe\x14\x51\x47\x33\x31\xd5\x62\xe3\ 254 | \x81\x45\x88\x9a\x14\x69\x01\xb4\x5a\x09\xa7\x8e\xcc\x11\xfe\xf4\ 255 | \x16\x83\x2c\x23\x77\x96\x22\xcd\xd8\x2d\x33\x2a\x21\x70\x1e\x06\ 256 | \xce\x10\xec\x8b\x22\x99\x33\x78\x6f\x09\x9d\x20\xad\x4a\x2a\xe5\ 257 | \x89\x09\x91\x48\x2a\x6f\x11\x1e\x72\x07\x63\x57\xa1\xa4\xa0\xf4\ 258 | \x9a\xd2\x5b\x52\x5b\x22\x85\xa7\xb0\x06\xe3\x2c\x65\x55\xd2\x50\ 259 | \x0a\x6d\x2c\x13\x5e\xe2\xaa\x0a\x6b\x2d\xb6\xf2\x14\x54\x38\x4a\ 260 | \x06\xa3\x1c\x84\x24\x69\x36\x89\x92\x09\xc2\x38\xc0\x09\x51\xa7\ 261 | \xb8\x90\x08\x24\xbd\xbd\x3d\x4c\x91\x91\x8e\x86\x2c\x1d\x3b\xcc\ 262 | \xd2\xb3\x4f\x32\x39\x3b\xc7\xee\xda\x26\x4e\x78\xe6\x4f\x1e\xa4\ 263 | \x31\xd3\x06\xad\x11\x42\xe3\x7d\x2d\xaf\xe1\x24\x5a\x29\x09\x58\ 264 | \x0e\xcc\xb5\x39\xbc\x38\xc1\x60\x38\x62\x54\x96\xe4\xae\xc2\x4a\ 265 | \x89\xf5\x0e\xa4\x64\x64\x2c\xde\x94\xf5\x06\x08\x87\x03\x42\x15\ 266 | \x22\xb4\x46\x28\x8f\x10\x1a\x8c\xc0\x52\xd6\xfa\x8b\x56\x78\x2b\ 267 | \xd1\x41\x88\x44\x53\x16\x25\x46\x08\x4a\x01\xa9\xf4\x64\xc6\xe2\ 268 | \x71\x34\x65\xc8\x42\x10\xd2\xaa\x32\x76\xd2\x0c\x89\xc4\x58\x87\ 269 | \x57\x8a\xac\xb0\x8c\xc6\x05\x78\xd8\xd9\xd8\x62\xbc\xbb\x41\xd8\ 270 | \x6a\x20\xc3\xe0\x53\xcd\x2f\x88\x22\x66\x66\xa7\xc1\x1b\x9c\x9d\ 271 | \x21\x88\x62\xb6\x1f\x6c\xb0\x7c\x73\x99\x72\x3c\xe2\xe0\xf1\x25\ 272 | \x92\x85\x19\xbc\xb4\xfb\x5a\xa2\xdb\x57\x93\xc1\x39\x8f\xae\x8a\ 273 | \x82\x48\x29\x66\x26\x1b\x3c\x71\x72\x9e\xf7\x8b\x92\xc1\x30\x43\ 274 | \x47\x0a\x19\x09\x4a\x63\xd1\x5a\x11\xe8\x80\x02\x08\x82\x90\xd0\ 275 | \x29\xbc\xf7\xb4\x64\x84\x12\x92\x4c\x0b\x62\xaf\x09\xb5\x20\x76\ 276 | \x8e\x48\x28\x5a\x42\x83\x8c\x90\x48\x42\x2f\x69\x01\xa1\x33\xc4\ 277 | \x42\x22\x8c\x22\x50\x11\x3e\xa8\x68\x3a\xc1\x19\xd3\x20\x72\x29\ 278 | \xbb\xbd\x1e\x42\x0a\x9c\x73\x58\x67\xa9\x8c\x24\xcd\x0a\x90\x02\ 279 | \xef\x2c\xdb\x9b\xbb\xcc\x37\x0e\x50\x43\xa9\x5a\x85\xf5\xa2\x9e\ 280 | \x35\x94\x79\x45\x18\x84\x2c\x7f\x74\x83\xf7\x7f\xf0\x2e\xae\x80\ 281 | \xe5\x1b\x77\x48\xc2\xcb\x9c\xf8\xe8\x36\x5f\xfc\xda\x4b\x74\x26\ 282 | \x5b\xe0\x3c\xc6\xda\x5a\x05\x73\x1e\x2d\xa5\xc0\x1b\x4b\x1c\x48\ 283 | \x2e\x3e\x76\x80\xb5\xe5\x35\xb2\xfe\x90\xa8\xd3\x22\x35\x15\x63\ 284 | \x57\xa1\xb5\xa5\x0a\x43\xba\x0b\x47\xe9\x24\x5d\x4a\x6f\xb9\x75\ 285 | \xff\x32\x45\x59\x52\x3a\xc3\xec\xa1\x33\x74\x54\x13\x5b\x95\xa8\ 286 | \xed\x4f\x48\xc7\x03\x34\x8e\xb9\x63\x8f\xa3\x55\x84\x77\x86\xd1\ 287 | \xd6\x3d\xf2\xbd\x6d\x90\x8a\x03\x87\xcf\xa0\x55\x84\x94\x30\xbb\ 288 | \xb3\xc1\x91\x5b\x3b\x6c\x0c\x07\xe4\x79\x4e\x20\x25\x61\xa8\x68\ 289 | \xb5\x1b\xec\x0c\x4a\xb2\xdc\xd0\x6e\xc7\x1c\x3f\x7b\x82\x23\x67\ 290 | \xce\xe1\xc8\x7f\xa1\xf8\xe2\x01\x8f\x31\x25\xd6\x18\xd2\x51\xc1\ 291 | \x5b\xdf\x7b\x9b\xf1\x6e\x4e\x7a\x6f\x9d\xaf\x1f\x3f\xc9\xac\x90\ 292 | \xac\x5e\xdb\xe4\x67\xff\xd7\xf7\xb8\xf0\x9f\x7c\x99\xc9\xa9\x6e\ 293 | \x7d\x53\xd4\x43\x03\xb4\x94\x12\x47\x85\x10\x9e\x23\x07\x26\x39\ 294 | \xb3\xb6\xcb\xcd\xdd\x11\xc3\x86\xa6\x88\x35\xce\x4a\x9c\x52\x88\ 295 | \x50\xb3\x33\xda\x66\xb7\xbf\x45\xe5\x2a\x8a\xaa\xc4\xe9\x18\x25\ 296 | \x42\xae\x6f\xdc\x24\xb6\x20\xad\x63\x60\x0b\x1a\x08\x5a\x52\xf2\ 297 | \xfe\xca\x47\x18\x04\xa1\x75\xa8\xca\x12\x49\x49\xa2\x03\x56\x57\ 298 | \xae\x31\xb6\x86\x86\xf3\xfc\xb5\xf6\x12\x2d\xe3\x79\xe3\xe6\x6d\ 299 | \xa4\x50\x04\x81\x60\x72\xaa\x4d\x14\x28\x8a\x9d\x14\x63\x1d\x81\ 300 | \x56\x84\x51\x5d\xaa\xfe\x53\x95\xb7\x0e\x5e\xe0\x19\x8f\xc6\xa4\ 301 | \xbd\x31\x76\x98\xd1\xef\xa5\xdc\xbb\xfa\x80\x7f\x72\xe6\x34\x4b\ 302 | \x65\xc5\x78\xb3\xcf\xdc\xb8\x20\xb9\xbf\x0d\x8f\x1d\x81\x97\x2f\ 303 | \xd4\x03\x94\x7d\x24\xa8\x9d\x77\xb5\x40\xe0\x0c\x5a\x6b\xce\x1f\ 304 | \x99\xc7\x6c\x0c\xb9\x92\x97\x88\x56\x40\xac\x42\xa4\xd0\x64\x45\ 305 | \x49\x91\xa7\x68\x2f\x08\x83\x90\xd8\x09\xd2\xaa\x40\x0a\x41\x47\ 306 | \x52\xa7\xbc\x05\xe7\x25\xd2\x83\x10\x9e\x99\x52\xe0\x84\x40\x7b\ 307 | \x85\xf1\x1e\xe9\xa0\xe3\x24\x07\xc2\x0e\xfd\x74\xc0\x73\xed\x29\ 308 | \x1e\xcb\x15\xdf\x79\xeb\x3d\x2a\x63\xd1\x42\x31\x39\xd9\xa1\xd3\ 309 | \x69\x80\x35\x14\x95\xc1\x5b\xf0\x38\x46\xc3\x11\xc6\xe6\x08\x25\ 310 | \x1e\x25\xff\xa7\x9b\x10\x85\x1a\xd9\x08\x90\x28\x84\x54\x14\xc3\ 311 | \x9c\x76\x65\x29\x86\x29\x8c\x0b\x3a\x33\xd3\xb4\x37\x77\xe8\xff\ 312 | \xf1\xdb\x70\xee\x18\xc2\x7a\xac\x71\x78\x1c\xd2\xd9\xaa\xd6\xf6\ 313 | \x85\x42\x08\x41\x23\x96\x2c\x08\xc1\x89\x9e\x43\x8f\x0b\xa4\xa8\ 314 | \x1b\xa1\x33\x16\x6d\x3d\xc2\x41\x59\x54\x08\x04\x23\x67\x18\x3a\ 315 | \xc3\xb8\x2c\xd9\x2b\x0b\xc6\xce\x12\x89\x00\xe1\x04\xa9\xb3\x78\ 316 | \x07\xae\x32\x78\xeb\x09\x51\x24\x28\x70\x8e\x62\x34\xe4\xf9\xf6\ 317 | \x14\xbf\xda\x3c\xc8\x3b\xaf\xbd\xc5\x83\x07\x6b\x48\xa1\xf0\x78\ 318 | \x0e\x1d\x9c\xa3\x11\x07\x78\x2c\x65\x51\xdf\x0a\xc6\x58\xbc\xb3\ 319 | \x28\x29\xf6\x43\xb7\x7c\x3a\x93\xf2\x0e\x67\x0c\xd9\x60\x44\x92\ 320 | \x44\x3c\xf3\xec\x39\x9a\xd3\x5d\xde\x7d\xb0\x81\x2a\x2a\x1a\x06\ 321 | \xca\x7b\x0f\x29\x07\x43\x92\xcc\x52\x2c\xaf\x63\x8b\xfa\xd0\xbd\ 322 | \xf7\x68\x6b\x2d\x4a\xd6\x03\x46\x84\xa0\xdd\x4e\xa8\xca\x0d\xfc\ 323 | \xea\x1e\x87\xc5\x2c\xef\xb9\x92\x22\x89\x28\xbd\xc7\x4a\x41\xe9\ 324 | \x2a\x2c\x02\x2f\x64\x4d\x88\x04\x58\x01\x5a\x38\x9a\x52\xd5\xc3\ 325 | \x48\x3c\xd2\x5b\x9c\x77\x78\x67\x09\x95\x20\x12\x12\x87\x67\xbb\ 326 | \x18\xf3\xf9\xc9\x79\x5e\x69\x1d\xe4\x87\x7f\xfc\x1f\xf8\xe0\xc3\ 327 | \xab\x68\x1d\x21\x10\x4c\x75\x9b\x2c\x1d\x9e\xc5\x97\x29\x0a\x41\ 328 | \xa8\x61\x71\xb2\xc9\xec\x54\x83\xb9\x99\x36\x42\x84\x78\x32\xf8\ 329 | \xff\xf4\x00\x21\x04\x91\xd6\x88\x56\x82\xb5\x86\x67\x9e\x7b\x9c\ 330 | \xbb\xb7\xd6\xf8\xb3\x6f\xfd\x08\x39\x79\x88\x5f\x0e\x14\x81\x17\ 331 | \x88\x4e\x9b\xdd\xc5\x0e\xf7\x6f\xdf\xa1\x9a\x98\xc4\x18\x87\x12\ 332 | \xa0\x1f\x0d\x13\x3d\x02\x1c\x18\x57\x71\xfc\xf8\x22\x3f\xfb\xf0\ 333 | \x4d\x1a\x69\xc5\x85\x8b\x4b\xfc\x70\x62\x80\x9f\x6a\x21\xbc\xc4\ 334 | \x21\xb0\x1e\xb4\x52\x68\x21\x29\x9c\xa9\x35\x1b\xe7\xb0\xae\x44\ 335 | \x78\x8f\xf4\x30\x99\xb4\xa8\xaa\x0a\xa4\xa5\x66\xde\xf5\xc3\x7e\ 336 | \xf9\xd0\x49\x9e\xdf\x13\x7c\xe7\x5f\xfd\x3b\xee\xdc\x59\x45\xcb\ 337 | \x3a\x78\xbc\xe5\xd8\xd1\x59\xa6\xba\x0d\xb6\xd7\x06\x0c\xfa\x7d\ 338 | \x9a\xa1\xe7\xab\x5f\x5a\xe2\xb9\xcf\x9f\x67\xa2\x13\x32\x1a\xed\ 339 | \xd0\x68\x25\x9f\x36\x41\x51\x0b\x07\xe0\x3c\x51\x1c\x81\xa9\xa5\ 340 | \xf5\x5f\xff\xcd\x2f\xf2\xc9\xad\xbb\x7c\xe7\xc6\x03\x9a\x67\x96\ 341 | \x38\x14\x4e\x51\x06\x82\x3b\x0d\xcb\xea\xdd\x55\x92\xe9\x92\xaa\ 342 | \x72\x08\xed\x51\xbf\xfb\x5b\xcf\x7c\xa3\x2a\x0b\xb4\xd2\x58\x5b\ 343 | \xab\x2f\x49\xb3\x41\xa7\xd3\xe1\xd5\xbf\x7a\x8f\x72\xa5\xcf\xf3\ 344 | \x0b\x47\xe9\xf9\x92\x71\x5c\x6f\x40\xa0\x14\x52\xd4\xf3\x16\x0b\ 345 | \x94\xd6\xd4\x10\xd6\xd7\x27\x02\x1e\x85\xc0\x99\xaa\xc6\xe5\xde\ 346 | \x73\x28\x8e\xf9\xcd\xe9\x13\x4c\xbd\xbf\xca\xeb\x7f\xfa\x1d\xb6\ 347 | \xb7\x7a\xe0\x14\x42\xd4\x70\xf9\xc0\xe2\x14\xcf\x5c\x38\xc1\x44\ 348 | \xa7\x41\x91\xe6\x78\xe7\x98\x9e\x9c\xe0\xd4\xc9\x05\x5e\xf8\xe2\ 349 | \x79\x0e\x9c\x3c\x8c\x6e\x44\x20\x41\xec\x6f\xa9\xa2\x06\x66\x94\ 350 | \x06\x69\x7f\x31\xa7\x0c\x23\xcd\xe9\xc7\x8e\xb0\xb1\xb3\x41\xd1\ 351 | \x8d\x58\x8b\x3c\x6b\x81\x27\x0b\x34\xbd\x61\xc1\xfb\x1f\xdd\xa6\ 352 | \xd1\x4a\x88\xe3\x06\xea\x77\xbf\x7e\xf1\x1b\x1e\x8f\xf7\xee\xd3\ 353 | \x0e\x2b\xa4\x64\x62\xa2\x4d\xd2\x9a\xe0\x9d\x37\xaf\xb0\x72\x79\ 354 | \x99\xb3\xae\xc5\x8c\x8a\xd9\x93\x15\x85\xaa\x87\xf1\xce\x3a\x1e\ 355 | \x7d\x4a\x4a\x89\x42\xa0\xa5\x44\x38\x47\x28\x25\xce\x54\x84\x02\ 356 | \x9e\x89\xa6\x78\x71\x3b\xe0\xf2\xff\xf1\x5d\xae\xbc\xfd\xb3\xba\ 357 | \xfd\x7a\x81\x10\x12\x25\x05\x13\xad\x98\xcf\x7c\xe6\x24\x4b\x87\ 358 | \xa7\xf0\xce\x92\x65\x39\x45\x5a\x51\x19\xf8\xb3\xff\x70\x99\x9d\ 359 | \x41\xce\xe3\x17\x8f\xd1\xe8\x34\x3e\x6d\x7d\x02\xc1\xde\xe6\x1e\ 360 | \xbb\x77\x1e\x22\x0a\x43\x99\xe6\xf4\xd6\xb7\x48\x47\x63\xc2\x40\ 361 | \x91\xb4\x22\x8e\x1e\x39\xc0\xea\xca\x2a\x85\xb1\x38\x21\x41\x29\ 362 | \xf6\xfa\x25\x1f\x7c\xb4\x85\x50\x30\x33\x3b\x81\xfa\xc7\x5f\xbf\ 363 | \xf0\x0d\x2d\x25\xd6\x1a\x4c\xe5\x90\x3a\x20\x8c\x3a\xf4\xf7\x52\ 364 | \xe6\x66\xda\x84\x71\xc4\xf5\x6b\xab\xdc\xb9\xb1\x4a\x79\x7d\x95\ 365 | \x53\x03\xcd\x51\xdd\x46\x59\x28\xaa\x12\x6b\x1d\x0d\x2f\x69\x13\ 366 | \xd0\x76\x92\x56\x05\x8d\xca\x33\x99\xc3\xf9\x22\xe1\xec\xed\x8c\ 367 | \xf4\x5b\x1f\xf2\xe3\xff\xe7\x2f\xa9\x8a\x94\x6e\xa7\x89\x56\x01\ 368 | \x71\x14\x33\xd1\x6e\xd3\x69\xc5\x9c\x3b\xbb\xc8\xa9\x53\xf3\xb5\ 369 | \xbe\x68\x3d\xd9\x38\xa7\xd7\x1b\x72\xe7\x5e\x9f\xbf\xf8\xf1\x0a\ 370 | \xf7\xd7\xf6\xb8\xf0\xec\x12\x87\x8f\x1f\xa8\x19\xe0\x7e\xf6\xc5\ 371 | \x2a\xa4\x1a\xe7\x94\x59\x89\x2b\xab\x7a\xc0\x6b\x1c\xc9\x44\x1b\ 372 | \x99\x34\x68\x4e\x4e\x70\xf0\xe0\x41\x76\xb7\x77\x48\xd3\x1c\x84\ 373 | \xa0\xb7\x97\x71\xfd\x93\x1e\xed\x4e\xc4\xc2\xe2\x24\xda\x39\x47\ 374 | \x14\x6a\xaa\x4a\xa1\x43\xc1\xea\x4a\x8f\xa3\xe7\x2f\x12\x35\xf7\ 375 | \xf8\xb3\x7f\xf7\x47\x7c\xf9\xab\x2f\x20\x84\xe4\x7b\x7f\xf5\x11\ 376 | \x3b\x3b\x29\x9b\xaf\x5d\x46\xbe\x76\x99\xf9\xb9\x09\x4e\x1d\x9c\ 377 | \x85\x6e\x03\x9a\x21\x2a\x0e\xb1\xd6\x21\x2a\x8b\x1a\x96\xa4\xeb\ 378 | \xbb\x5c\xbf\xbb\x46\x9a\x5a\xc2\x18\x66\xa7\xdb\xcc\x4c\x36\x51\ 379 | \x52\x92\xa5\x05\x4f\x3e\x79\x81\x5f\xff\x8d\x5f\xa7\xbf\xfd\x80\ 380 | \xc1\xce\x75\xa4\x78\xd4\xd8\x05\xd6\x78\xa4\x0c\xd8\xd9\x4b\x41\ 381 | \x0b\x10\x92\x3c\x2f\x71\xb6\xaa\x89\x90\xf7\xf5\x84\xc7\x18\x94\ 382 | \x00\xe7\x2a\xaa\xca\x10\x6b\x4d\xd4\x9a\xa0\x37\x32\xdc\xbd\x72\ 383 | \x15\xe7\x2c\x0b\xf3\xb3\x9c\xbb\xf0\x04\x1f\xbe\xf3\x01\xc3\xe1\ 384 | \x18\x8f\x40\xe0\xe8\x4e\xb6\xea\xbe\x34\xce\xca\xda\x9c\x10\x04\ 385 | \xd8\xb2\xc2\xfb\x98\x1f\x7f\xfb\x7b\xec\xf5\xf7\x18\x8d\x4a\x56\ 386 | \xef\x6f\xf2\xb9\x17\x4e\x31\xd1\x49\xf8\xe1\xeb\x37\xb8\x7b\x7f\ 387 | \x87\xbc\x34\xac\x6f\x8d\x58\xdb\x1c\xec\x4f\x94\xff\xff\x3f\x0e\ 388 | \x40\xd6\xe5\xd0\x6a\xc7\x4c\x4d\x26\x4c\x76\x1b\x08\x1c\xa6\xb2\ 389 | \x8c\x46\x25\xe9\x60\xcc\x8f\xbe\xf3\x5d\x1e\xdc\xbf\xc5\xc1\xc3\ 390 | \x2d\x9e\xbe\x70\x1c\x6f\x1d\xd6\x38\xb6\xb6\x7b\x48\x02\xa4\xac\ 391 | \xe7\xfc\x52\x49\xda\xed\x36\x52\x85\x58\x67\x6a\x1c\xe4\x1c\x08\ 392 | \x4f\x77\xb2\x0d\x49\x4c\x39\x4e\x89\x1a\x09\x97\xaf\xdd\xe3\x3b\ 393 | \x7f\xf1\x06\xd9\xb8\xc2\x96\x05\x8d\x50\xf0\xf4\xb3\xe7\x38\xfe\ 394 | \xd8\x49\x56\xee\xdd\x63\x6b\x37\x67\x72\x32\x62\x7a\xb2\x89\xb3\ 395 | \x0e\xfd\xe6\xbb\x2b\x1c\x9e\x93\x08\x21\x29\x0b\xcb\xde\x9e\xe1\ 396 | \xda\xb5\x55\x46\xa3\x9c\xcd\xad\x1e\x42\xee\x0f\x4d\x7d\xc5\x93\ 397 | \x8f\x1f\xc2\x5a\xc1\xca\x5a\x8f\xaa\xaa\x9d\x18\xe2\x51\x55\x8a\ 398 | \x5f\xd8\x52\xfc\x7e\x33\xd4\x5a\xd1\x4e\x1a\x68\x21\x19\xec\x0e\ 399 | \x6b\x32\x82\xa7\xd3\xee\x70\x7f\xf9\x01\xd7\x87\x43\xac\xb3\xdc\ 400 | \x7b\xb0\xc1\x70\x54\x92\x24\x11\xd9\x38\x07\x53\x90\x84\x11\x72\ 401 | \x9f\xb0\x84\xa1\x26\xd0\x12\x5c\x6d\x99\xa9\x7b\x56\x2d\xcf\x59\ 402 | \xef\xc8\x06\x23\x4c\x5e\xe2\x7c\xc0\x8f\xff\xea\x3d\x7a\x3b\x19\ 403 | \x49\xe9\xb9\xd8\x68\x91\x14\x15\xfd\xd7\xaf\xb3\xf1\xa2\xe0\xec\ 404 | \xc5\xc7\x59\x38\x7c\x10\x1f\x68\x9c\xaf\x1b\xa6\xbe\xfd\xd0\x21\ 405 | \x4d\xca\x5b\x3f\xb9\x4a\x14\x84\x68\x1d\x50\x55\x9e\xf1\xb8\xc4\ 406 | \x59\xcf\xca\xfd\x2d\x06\xbd\x11\xd6\x39\x2a\x2f\x29\x0b\x6a\xe9\ 407 | \x4a\xd6\x8d\x4f\x0b\x90\xc2\x01\x0e\xad\x14\x52\x4a\xa4\xd2\x54\ 408 | \xc6\x52\x94\x86\xaa\xac\xf0\x55\x85\x12\x0e\x2d\x05\x5a\x4b\x8a\ 409 | \x61\xca\xb8\x37\x40\x51\xbb\x36\x86\xa3\x8a\x1f\xff\xe8\x36\x41\ 410 | \xa0\x89\x22\xc7\xcb\x9f\x7f\x1c\x61\x2a\x0e\x1d\x98\x01\x7f\x9f\ 411 | \x30\x0a\x30\x45\xc9\xd6\xea\x06\xdd\xf9\x29\xa4\xd6\x3c\xf2\xc8\ 412 | \x08\xa5\x40\x82\xd6\x9a\xfe\xde\x90\xaa\xf0\x64\xbb\x43\xfe\xc6\ 413 | \xdc\x22\x2f\xce\x4e\xe1\xb3\x82\xde\xca\x06\xd7\x7f\x72\x95\xc6\ 414 | \x85\x93\x2c\x3d\xff\x14\x2b\x6b\xdb\x7c\xb2\xbc\x56\x9b\xb9\x3a\ 415 | \x93\x5d\x1a\x49\xca\xc3\xb5\x94\xc5\x19\x68\x25\x01\xa1\x10\x88\ 416 | \x38\xa4\x19\xc7\x54\xd6\x51\x15\x16\xe7\x3c\xa5\x71\xec\xec\x65\ 417 | \x6c\x0d\x4a\x8c\x85\x56\xa2\x99\x6e\x87\xb4\xe3\x88\x30\x92\x28\ 418 | \x21\x11\x42\x30\xcc\x0c\x5b\xfd\x8c\x51\x66\x88\xb4\x60\x61\xaa\ 419 | \x41\x12\x85\x84\x52\x20\xf7\xd1\x9c\x94\xf5\xfb\xbd\xf0\x84\x4a\ 420 | \x91\x1b\xcb\x60\x5c\x31\x1d\x05\x68\x2d\x31\xa5\xa3\x3b\xd1\xae\ 421 | \x4d\x13\x5a\x33\x3b\x3b\xcd\x44\xa7\x8d\x7a\xc4\x03\x84\x00\x25\ 422 | \x40\x82\x0c\x03\xaa\x22\x23\x89\x42\x9a\x49\x04\x83\x94\xa7\x4f\ 423 | \x35\x71\x83\x11\x59\x7f\xcc\x64\xb3\xcd\x93\xfd\x3e\xe5\x3b\xd7\ 424 | \x61\x69\xb6\x1e\xdd\x8b\xfa\x26\x93\xce\x39\xb4\x92\x34\x22\x4d\ 425 | \xa7\xd9\x44\x38\x87\xb7\x06\xe1\x6b\x03\x81\xad\x6a\x48\x5a\x19\ 426 | \x4b\x59\x59\xc6\x85\x23\x33\x8e\xc2\x38\xc6\x59\x45\x20\xa1\x1d\ 427 | \x2b\x9a\x81\x20\xd6\x9e\x40\x79\x86\xc3\x8c\x61\x61\xc8\x8d\x63\ 428 | \x54\x38\x86\xa3\x82\xa0\xb6\x2c\x81\xab\x71\x41\xa0\x34\xce\xd5\ 429 | \x2c\x74\xe9\xe0\x4c\x8d\x46\xbd\xc7\xed\xc3\x9c\x47\x8e\x32\x25\ 430 | \x40\x4a\x4f\x14\x69\xc2\x24\xaa\x8d\x4e\x7e\xdf\xfb\x23\x24\xc8\ 431 | \x5a\xb0\x71\xd6\xd2\x48\x34\x4f\x3e\x79\x02\x19\x25\xf4\xca\x9c\ 432 | \x6a\x94\xd2\x10\x01\x54\x86\x86\x07\xf5\xe6\x35\xdc\x66\x7f\xbf\ 433 | \x54\x5d\xed\x39\x72\xd6\x21\x70\x3c\xf5\xd4\x09\x2e\x3e\x73\x16\ 434 | \x1d\x80\x0a\x34\xd6\x7b\xd2\xbc\x24\x2b\x0a\x1c\x75\x5a\x5b\x2f\ 435 | \x28\x8c\xc7\x0b\x81\xd0\x12\xad\x04\xad\x58\x23\x85\xa5\xc8\x72\ 436 | \x8a\x2c\x07\x5b\xd3\x2c\x5b\x83\x03\x9c\x10\x38\x40\x29\x08\xf6\ 437 | \xcd\x4b\x79\x59\x90\x97\x19\x08\xcb\xc5\x67\x8e\x71\xf2\xe4\x14\ 438 | \x71\x14\xec\xf7\x0e\x5f\xcb\x6b\xc0\xc6\xe6\x1e\x0e\x28\x4b\xc7\ 439 | \xa8\x3f\x24\x1f\x8e\xf1\x95\xc1\x1b\x87\xb7\x0e\x9c\x47\x48\x49\ 440 | \x92\x44\xb4\x3b\x4d\xa4\x12\x3c\xfb\xdc\x19\xe6\x8e\xcf\xf0\x87\ 441 | \xd7\x57\xd0\x71\x8c\x1b\x8e\x48\xb7\x76\xa8\xb2\x82\xc0\x48\x6e\ 442 | \x7c\x70\x95\xa2\xac\xf6\xfd\x84\x1e\x59\x95\x16\x63\x72\xe6\xe6\ 443 | \x5b\x9c\x3a\x7d\x18\xa5\x25\x4e\x40\xe9\x1c\xe3\xd2\x51\x21\x29\ 444 | \x1f\x01\x1e\x51\xdb\xd4\xf4\x7e\x1a\x27\x91\x66\xba\xdb\x20\x0c\ 445 | \x34\x4a\x49\xbc\x17\x38\xe3\x68\x44\x01\xc2\xb3\xdf\xb0\xea\x86\ 446 | \xad\x94\xc4\x39\x87\x50\x0a\x15\x46\xe8\x28\xe2\x89\xa7\x8e\x30\ 447 | \x3d\x93\xe0\x31\x20\x7e\xc1\xef\x84\x10\xe8\x20\xe0\xee\x83\x35\ 448 | \x3c\x82\xe1\x60\xcc\x27\x37\x6e\xb3\x7e\x7f\x0d\x9b\x97\xe0\x1c\ 449 | \xde\xd4\xc6\xae\x3a\x63\x1d\x52\x3f\x72\x8a\x39\xfe\xfe\x7f\xf6\ 450 | \x6b\xdc\xd7\x29\xff\xfb\xbd\x87\xf8\x66\x8c\x4a\x12\x82\xc5\x59\ 451 | \xd6\x96\xba\xfc\xfc\xee\x03\x46\xa3\x0a\x63\xf7\xe9\xb0\xc7\x21\ 452 | \x24\x34\x9a\x01\x4b\xc7\x67\x68\x77\x1b\xec\xdc\x1f\xb0\xba\x93\ 453 | \x91\x95\x1e\x25\x24\x49\xac\x50\x81\x22\x8e\x14\xed\x86\x46\x6b\ 454 | \x49\x59\x59\x96\xe6\x9a\x34\x22\x45\xb1\x2f\x4f\x03\x18\xe7\xe9\ 455 | \x24\x21\x49\xa8\xc8\x4c\xad\xbc\xb6\x93\x00\x21\xc1\x58\x18\xe5\ 456 | \x25\xfd\x71\xc9\xcc\x74\x93\xb8\xa9\x31\xd6\x82\x04\xcb\xa3\xef\ 457 | \x10\x78\x01\x71\x12\xe3\x91\x48\xea\xa6\x7b\xf8\xd0\x41\x8e\x1e\ 458 | \x3b\x46\x96\x67\x98\x6a\x4c\x9e\x17\x04\x5a\xd1\x8a\xe3\xfd\x7b\ 459 | \x57\x61\x6c\x89\x14\x92\xc5\xc5\x2e\xbf\xfd\xf7\x7e\x95\xd7\x5e\ 460 | \x7d\x83\x1f\x4c\x69\x0e\xf8\x49\x52\xe9\xb8\x1f\x79\xee\xed\xa6\ 461 | \x8c\x36\xc6\xb4\xdb\x4d\x9c\xa7\x36\x48\x78\xef\x41\x79\x16\x0f\ 462 | \xcf\xd2\x9d\xee\xb0\x73\x65\x93\xdc\x08\x2a\x04\x85\x85\x71\x3f\ 463 | \x47\x2b\x98\x9d\x6a\x72\xea\x40\x0b\x94\x26\x0c\x3c\xd3\xed\x88\ 464 | \x32\xaf\xad\x34\x4a\x07\x54\xc6\xd4\x96\x58\x25\x78\xec\xc0\x04\ 465 | \x5b\xfd\x9c\x46\x20\x58\x98\x8a\xf1\xd6\xd1\x4f\x2b\x56\x76\x52\ 466 | \x9c\x14\xd8\xbd\x01\xef\x7e\x70\x8b\xf3\x8f\x1d\x62\xa2\xd3\xfa\ 467 | \xd4\x63\x28\x1e\x39\xda\x84\xa7\xd3\x8a\x38\x3c\x9f\x70\xfc\xf0\ 468 | \x24\x51\x50\x4f\x72\xf6\xf6\x46\x8c\xfa\x83\x5a\x28\x8d\x34\xc9\ 469 | \x94\x42\x38\x4f\x55\x18\x76\x76\x07\x34\x93\x06\x49\x22\x78\xe1\ 470 | \x0b\x4f\x11\x25\x9a\xab\x1f\xdf\xe2\xd6\x30\xa7\x11\x47\x68\xa5\ 471 | \xc9\x8b\x31\x1f\x5e\x7e\xc0\x93\x4f\x1f\x65\xa2\xd3\xaa\xd9\xa0\ 472 | \x17\x1e\xa1\x60\x72\x71\x9a\xa5\xe3\x8b\x3c\xfe\xa0\xc7\xd1\xf6\ 473 | \x24\xb1\x0a\x58\xde\xee\xf3\xd3\xbb\x5b\xe4\x79\x4e\xa4\x1c\x13\ 474 | \xed\x90\x24\x0e\x50\x5a\x32\x1e\x57\x48\xe9\xe9\x0d\x73\x1e\x6e\ 475 | \xa6\x08\x24\x13\xad\x08\xed\x2a\xda\x49\xcc\xfc\x91\x0e\x78\x4b\ 476 | \x65\x0c\xe3\xd2\xd2\x1f\x17\x84\xb1\xe6\x85\x53\x0b\x9c\xe8\x46\ 477 | \xe8\x48\xb1\x36\x4a\xeb\x03\xc0\x82\x37\x28\xa1\x81\xda\xb3\x2c\ 478 | \xa5\xe7\xc2\xd9\x69\xbe\xf8\xa5\x53\x74\x3a\x09\x58\x4f\x23\x0c\ 479 | \xe8\xe7\x35\xf2\x6b\x4f\x4f\xe0\x8d\x43\x22\x19\x8e\x32\xd6\x1e\ 480 | \x6e\xa1\x03\xcd\xe3\x4f\x9c\x26\x68\x34\x78\xe6\x85\x67\x30\x46\ 481 | \xf0\xda\x0f\xde\x45\x74\x34\xed\x76\x4c\x51\x38\x7a\x7b\x86\x5e\ 482 | \x2f\xa5\xd3\x69\xa3\x1f\xb1\x37\x21\x3c\x28\x49\x27\x94\x7c\xed\ 483 | \xf0\x14\x17\x82\x84\xc8\x38\x6e\xb9\x80\x84\x69\x7e\xfa\x60\x8d\ 484 | \x28\x80\xf9\x99\x26\xf3\xf3\xd3\x5c\xbf\x71\x87\x34\x2d\xd0\x61\ 485 | \x83\x87\xdb\x23\x36\xc7\x16\x6f\xeb\x61\xe9\x5c\x27\xa2\x2c\x73\ 486 | \x9a\x49\x0d\x7c\xa4\xf0\x78\x67\xd1\xa1\xe4\x95\x53\x07\xf8\x7b\ 487 | \x0b\x13\x1c\x00\x4a\xe0\x2d\x6f\xb9\xa4\x05\x2f\x3c\x77\x9a\xdb\ 488 | \x77\xd6\x88\x63\x10\x0a\x64\xa0\xa9\xac\x63\x6a\x66\x9a\xdd\xde\ 489 | \x80\xca\x78\xd0\x01\xeb\xf7\x37\x78\xef\xad\x2b\x04\x4a\x73\xe0\ 490 | \xc0\x14\xad\x0b\x67\x51\x5a\xf1\xe0\xfe\x26\x1f\x7e\x70\x07\x2f\ 491 | \x3c\x41\xa3\xc9\xb9\x8b\xe7\xb0\x65\xca\xb8\xa8\xe8\xa7\x8e\xd5\ 492 | \xcd\x75\x8e\x1e\x59\x24\x2f\x2d\x65\xe9\x10\x52\x63\x8c\xdd\xb7\ 493 | \xc8\x48\x89\x97\x30\xec\x0f\x99\xd8\x19\x72\x6e\x68\x88\x6c\x1f\ 494 | \x97\x17\x1c\x53\x82\x97\x67\x13\x56\xb2\x90\x93\x27\xe6\x78\xee\ 495 | \xd9\x13\x9c\x7b\xea\x0c\xe7\x3e\x39\xce\xfa\xe6\x2e\x95\x69\xf0\ 496 | \xde\xf5\xbf\x60\xa2\xdb\xa2\x2a\x2b\x84\xf2\x1c\x3f\x3e\x47\x40\ 497 | \x81\xab\x0a\x84\x50\xe4\x05\x54\x15\x1c\x9a\x8c\xf8\x72\x12\x70\ 498 | \x62\x54\x50\x16\x25\x4d\x0f\x17\x71\x6c\x87\x82\x13\x2f\x9f\xe5\ 499 | \xd0\xe1\x2e\x5b\xdb\x5b\x24\xcd\x88\x40\x47\xa8\xa8\x81\x0a\x42\ 500 | \x7a\x7b\x15\x0f\x57\x77\x58\x3c\x74\x80\x8f\x3f\xbc\x49\x9e\xc2\ 501 | \x4e\x3a\xc2\x3b\xc9\xdc\xcc\x3a\xf3\x0b\x73\xdc\xbe\xfd\x90\x07\ 502 | \xab\x3d\xc2\x38\xe6\x8d\x9f\x5c\x62\x6e\x61\x86\x3c\xcd\x79\xf3\ 503 | \xcd\x4b\x0c\x73\xc1\xda\x76\x46\xdc\x2e\x29\x6d\x6d\xb6\x68\xb7\ 504 | \x13\xca\xd2\xa2\xbd\x77\x28\x25\x40\x49\x4a\x6b\x99\x2a\x3d\x8d\ 505 | \xc2\x12\x4f\x4f\x22\x5a\x8e\xb2\x3f\x60\x22\xcf\x98\x9c\xd0\xbc\ 506 | \xf8\xf9\x33\x7c\xf6\x97\x2e\x12\x4e\xb5\x99\x3d\x77\x08\x93\x96\ 507 | \xec\x6c\xa4\xfc\xe1\xbf\xf9\x21\x2a\xec\x52\x96\x25\xa1\x4f\xf9\ 508 | \xcd\xdf\x78\x9a\x71\xef\x1e\xdd\x4e\x97\xaa\xf2\x5c\xfe\xf8\x26\ 509 | \xd3\x0b\x67\xb9\x7f\x6f\x87\xc6\xc6\x88\xd2\x41\x73\x7a\x06\xbc\ 510 | \x67\x76\x98\x72\x60\x94\xb1\xbd\xb3\xcb\xec\xec\x24\x59\x36\xa0\ 511 | \xa8\x72\xbe\xf4\xd2\xe7\x79\xe3\x9d\x5b\xbc\xff\xe1\x32\x9e\x80\ 512 | \x71\x9e\x33\x3b\x3d\xc5\xe2\xc2\x1c\xd7\xae\x5d\x66\x65\xad\xcf\ 513 | \xdb\x3f\xbb\xcf\xcd\xe5\x1e\xff\xf8\xbf\xf8\x2a\x51\xd4\xa0\x30\ 514 | \x30\xec\x57\x7c\xf0\xd1\x2d\xee\xaf\xf4\xf9\x6f\x7e\xef\x6f\x13\ 515 | \xc5\x09\xd6\x0f\x51\x61\x8b\x8f\xae\x3e\x24\x8e\x14\x73\x0b\x13\ 516 | \xb4\x92\x08\x21\x1c\x1a\x04\x52\x08\x8c\x77\x4c\x1f\x98\x45\x1e\ 517 | \x99\x27\xbe\xd7\x43\xa4\x29\xa6\xac\x50\xbe\x36\x4a\x4e\x36\x63\ 518 | \x5a\x93\x4d\xc2\x03\x33\x10\x08\x94\xab\xfd\x85\x8d\x66\xc0\xcc\ 519 | \x54\x9b\x5b\xcb\x1b\x38\xe7\x38\x7f\x72\x86\xee\x54\xcc\x13\x67\ 520 | \xce\x50\xe6\x39\xdd\xd9\x79\x26\xa6\x25\x27\x4e\x3f\xc1\xd5\x9b\ 521 | \x1b\x44\xdf\xbb\x44\xd4\x37\x90\xe5\x78\x6b\x09\x9d\xe5\x50\xd2\ 522 | \xe0\xd5\xfb\xab\xcc\xce\xcf\x20\xa5\x66\x67\xa7\xc7\xf4\x6c\x87\ 523 | \x57\x5e\x79\x81\xff\xfe\x1b\xff\x06\x84\x66\x6f\xb7\xc7\xc9\xe3\ 524 | \x0b\xfc\x47\x5f\xfb\x12\xaf\xbd\xfe\x31\xef\xbf\x7f\x8f\x34\xf3\ 525 | \xa4\x69\xc9\xf7\x7f\x70\x99\x5f\x7a\xe9\x29\x5e\x7f\xeb\x3a\xaf\ 526 | \xbf\x71\x9d\xd1\xd8\xb2\xbb\x3b\xe2\xbd\xcf\x2d\xf3\xc5\x2f\x3e\ 527 | \xc7\xcf\xff\xc5\x1f\x73\xef\xc1\x98\xc1\xa0\x24\x8c\x04\x5f\xf8\ 528 | \xc2\x19\xa4\xf6\x48\x03\xea\xd9\xa7\x8f\x7c\xe3\xd0\xb4\xc5\x1a\ 529 | \xcb\x67\x5e\x7a\x01\xb9\xd9\x83\xeb\x0f\xf0\xa3\x14\x5b\x94\xa0\ 530 | \x14\x2b\x2d\xc5\xd6\x54\xc8\xfc\xe2\x1c\x07\x4e\x1e\x82\x40\xe1\ 531 | \x8a\x0a\x2a\x47\x20\x15\x4a\xc5\x5c\xb9\x74\x9b\xf9\xd9\x0e\x4f\ 532 | \x9c\x39\x6d\xc4\x23\xb0\x00\x00\x02\x9e\x49\x44\x41\x54\xc0\xcc\ 533 | \x94\xe6\xd8\xf9\x23\x4c\x2c\x2d\x21\xe3\x06\xd3\x33\xf3\xb4\x26\ 534 | \xba\x2c\x9d\x3c\x4c\xbe\xb3\x47\xf3\xde\x2e\x8c\x52\xf2\xc1\x10\ 535 | \x1d\x86\x6c\xb4\x43\x5e\xdf\xdd\xc1\x22\x68\xb5\x13\xc6\xa3\x11\ 536 | \xcf\x3f\x7f\x91\x99\xd9\x29\x7e\xfe\xde\x75\xbe\xf2\xd5\xcf\x11\ 537 | \x44\x8a\x1b\xd7\x97\x39\xbc\x34\x43\xb3\xd1\xe4\xf2\xe5\x7b\xfc\ 538 | \xad\xbf\xfd\x2b\x14\x65\xc9\xcd\x5b\xcb\x9c\x39\x7b\x90\xf1\x30\ 539 | \x67\x6d\x6d\x8f\x2f\x7c\xf1\x19\xe2\x58\x72\xf5\xda\x27\xbc\xf8\ 540 | \xfc\x19\xaa\x0a\x1e\x3e\xdc\xe5\x85\x17\xce\xa3\xb4\xa3\xd7\xdb\ 541 | \xe3\xf0\xe1\x19\x4c\x65\xd0\xc2\x1b\x14\x9e\xed\xb5\x1d\x3e\xfc\ 542 | \xe1\x5b\xb8\x62\xc8\xc1\x03\x13\xc4\xab\x02\xa9\x34\x0f\x4d\xc5\ 543 | \x9f\xae\x6f\x32\xda\x53\x44\xcd\x3b\x84\x9d\x04\x1d\x2b\x8a\x51\ 544 | \x56\x83\x11\x11\xd0\x49\x2c\x4f\x9c\x9d\x63\x3c\x2e\xd8\xdd\xdd\ 545 | \xe6\xed\x77\x86\x34\x67\xa6\x68\xb6\x7a\xa4\xc3\x14\x5b\x9a\x7d\ 546 | \x57\x79\xc0\xb6\xcb\xd8\x0b\xe0\x44\x2b\x41\x4e\x36\xd9\x48\x22\ 547 | \x7e\xb8\xbb\xc1\x7a\x5a\x30\x77\x28\x40\x6a\xcd\x60\x64\xf9\xe8\ 548 | \xf2\x15\xf0\x92\xcf\x3c\x7b\x94\x1f\xbc\xfa\x06\x65\xe5\x71\xb6\ 549 | \xe4\xd2\x47\xb7\x79\xf2\xc9\x53\x3c\xf3\xcc\x31\xfe\xf2\x2f\x7f\ 550 | \x42\x5e\x18\x26\x26\x42\xae\x7c\xfc\x09\x2f\xbc\x78\x9a\xfb\x2b\ 551 | \xeb\xdc\xbd\x73\x97\xed\xdd\x11\x61\xe0\xb9\x76\xe3\x0e\x4f\x3f\ 552 | \xbd\xc4\xfd\x07\x6b\x6c\xac\xad\x60\xaa\x92\xf1\x68\x48\x9e\x97\ 553 | \x14\x69\x85\x7a\xe9\xd9\x83\xdf\x38\x76\x20\xe4\xf0\xa1\x59\x02\ 554 | \x5b\x51\x9a\x9c\x7b\x36\xe7\xaf\xae\xae\xf0\xfe\x70\xc8\xf7\xfb\ 555 | \xdb\xf4\x6a\xc2\xc5\xdc\x6c\x9b\xd9\x89\x04\x33\x4e\xc9\x86\x63\ 556 | \xd2\xc1\x88\x71\x7f\x4c\x36\x1e\x83\x70\x94\x45\x4a\xa3\xa1\x38\ 557 | \x7c\x78\x96\x38\xf0\x14\x69\x46\x36\x4e\x49\x47\x19\x79\x5e\x92\ 558 | \xa5\x39\x2a\x0a\x79\xa7\x37\xe4\xbd\x8d\x1d\x6e\x09\xc3\xf7\x7b\ 559 | \xdb\x2c\xe3\x69\x34\x42\x0e\x9e\x3e\xc6\xc1\x73\x8f\xd3\x4a\x14\ 560 | \xe5\x38\x63\x34\x1c\x93\x34\x63\xb2\xac\x60\xaf\x9f\x91\x17\x86\ 561 | \x28\x94\x44\x91\x60\x76\x76\x82\x51\x9a\xb2\xd7\xcf\x18\x0e\x52\ 562 | \x04\x15\xed\x76\x48\xab\x1d\xb1\xbd\x33\x64\x73\x7b\x40\x9e\x1b\ 563 | \x86\xa3\x21\x8b\x8b\x93\x44\xb1\x62\x94\xa6\x44\x51\x40\xa3\x51\ 564 | \xeb\x0a\x41\x18\xa1\x9f\x7d\x62\x81\x74\xb8\x46\x59\x18\xc6\xc3\ 565 | \xb4\x1e\x1c\xca\x88\x07\x1d\xc9\xe6\xf6\x00\xa5\x02\xa4\xf5\x54\ 566 | \xae\x64\xaf\x37\x60\xed\xe1\x0e\xf8\x7a\x86\xef\x3c\x14\xa5\xc5\ 567 | \xa3\xe8\x76\xda\xb4\x1f\x6b\xa3\xa4\x40\x08\xcb\xc3\x95\x1e\xce\ 568 | \x39\xca\xc2\x50\x99\x7a\x98\xea\x5c\x3d\xcb\x53\x9d\x98\xab\x21\ 569 | \xec\x6e\xed\x22\xbc\x40\x29\x81\xf1\x96\xd6\xf6\x88\xb3\xf3\xc7\ 570 | \x58\xbb\x74\x85\xbb\xab\xeb\xb5\xed\x26\x8c\x50\x52\x52\xe6\x05\ 571 | \x65\x5e\xb1\xbe\xbe\xc7\x27\xb7\x57\x69\xc4\x31\x4a\x08\x9c\xa9\ 572 | \xa5\xbc\xf5\xb5\x11\x1f\x7d\x74\xa7\x0e\xce\x54\xb5\x63\xdd\x3a\ 573 | \x36\x36\xfa\x7c\x78\xe9\x26\x5a\x29\xd2\xf1\x98\xed\x9d\x11\x95\ 574 | \x85\xf6\x44\x84\xc1\xf3\xff\x02\xe3\xc3\x27\xc6\xef\x49\xb3\x61\ 575 | \x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ 576 | " 577 | 578 | qt_resource_name = b"\ 579 | \x00\x0c\ 580 | \x02\xcf\x94\xa7\ 581 | \x00\x44\ 582 | \x00\x34\x00\x33\x00\x2d\x00\x49\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ 583 | " 584 | 585 | qt_resource_struct_v1 = b"\ 586 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 587 | \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 588 | " 589 | 590 | qt_resource_struct_v2 = b"\ 591 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 592 | \x00\x00\x00\x00\x00\x00\x00\x00\ 593 | \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 594 | \x00\x00\x01\x6b\x2e\x07\xf1\xa8\ 595 | " 596 | 597 | qt_version = QtCore.qVersion().split('.') 598 | if qt_version < ['5', '8', '0']: 599 | rcc_version = 1 600 | qt_resource_struct = qt_resource_struct_v1 601 | else: 602 | rcc_version = 2 603 | qt_resource_struct = qt_resource_struct_v2 604 | 605 | def qInitResources(): 606 | QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) 607 | 608 | def qCleanupResources(): 609 | QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data) 610 | 611 | qInitResources() 612 | --------------------------------------------------------------------------------