Added monthly summaries for certain reports

v3.1
Griffiths Lott 3 years ago
commit 717206c438
  1. 51
      IL Extract.spec
  2. 194
      ILE_MainWindow.py
  3. 933
      ILExtract.py
  4. 44
      assets/checkedCircle.svg
  5. 60
      assets/copy.svg
  6. 6
      assets/excel.svg
  7. BIN
      assets/extract.ico
  8. 1
      assets/extract.svg
  9. 4
      assets/fileSearch.svg
  10. 2
      assets/folder.svg
  11. 24
      assets/maximize.svg
  12. 1
      assets/process.svg
  13. 62
      assets/settings.svg
  14. 197
      defLocs_Window2.py
  15. 410
      main.py
  16. 1
      settings.json
  17. 341
      ui/ILE_MainWindow.ui
  18. 373
      ui/default_locations.ui
  19. 16
      v3_todo.txt
  20. 1
      venv/Lib/site-packages/PyQt5-5.15.7.dist-info/INSTALLER
  21. 65
      venv/Lib/site-packages/PyQt5-5.15.7.dist-info/METADATA
  22. 988
      venv/Lib/site-packages/PyQt5-5.15.7.dist-info/RECORD
  23. 0
      venv/Lib/site-packages/PyQt5-5.15.7.dist-info/REQUESTED
  24. 4
      venv/Lib/site-packages/PyQt5-5.15.7.dist-info/WHEEL
  25. 4
      venv/Lib/site-packages/PyQt5-5.15.7.dist-info/entry_points.txt
  26. BIN
      venv/Lib/site-packages/PyQt5/QAxContainer.pyd
  27. 105
      venv/Lib/site-packages/PyQt5/QAxContainer.pyi
  28. BIN
      venv/Lib/site-packages/PyQt5/Qt.pyd
  29. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Bluetooth.dll
  30. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Core.dll
  31. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5DBus.dll
  32. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Designer.dll
  33. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Gui.dll
  34. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Help.dll
  35. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Location.dll
  36. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Multimedia.dll
  37. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5MultimediaWidgets.dll
  38. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Network.dll
  39. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Nfc.dll
  40. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5OpenGL.dll
  41. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Positioning.dll
  42. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5PositioningQuick.dll
  43. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5PrintSupport.dll
  44. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Qml.dll
  45. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QmlModels.dll
  46. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QmlWorkerScript.dll
  47. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Quick.dll
  48. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Quick3D.dll
  49. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Quick3DAssetImport.dll
  50. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Quick3DRender.dll
  51. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Quick3DRuntimeRender.dll
  52. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Quick3DUtils.dll
  53. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QuickControls2.dll
  54. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QuickParticles.dll
  55. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QuickShapes.dll
  56. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QuickTemplates2.dll
  57. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QuickTest.dll
  58. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5QuickWidgets.dll
  59. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5RemoteObjects.dll
  60. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Sensors.dll
  61. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5SerialPort.dll
  62. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Sql.dll
  63. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Svg.dll
  64. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Test.dll
  65. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5TextToSpeech.dll
  66. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5WebChannel.dll
  67. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5WebSockets.dll
  68. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5WebView.dll
  69. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Widgets.dll
  70. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5WinExtras.dll
  71. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5Xml.dll
  72. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/Qt5XmlPatterns.dll
  73. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/concrt140.dll
  74. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/d3dcompiler_47.dll
  75. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/libEGL.dll
  76. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/libGLESv2.dll
  77. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/libcrypto-1_1-x64.dll
  78. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/libeay32.dll
  79. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/libssl-1_1-x64.dll
  80. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/msvcp140.dll
  81. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/msvcp140_1.dll
  82. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/msvcp140_2.dll
  83. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/opengl32sw.dll
  84. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/ssleay32.dll
  85. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/vcruntime140.dll
  86. BIN
      venv/Lib/site-packages/PyQt5/Qt5/bin/vcruntime140_1.dll
  87. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/assetimporters/assimp.dll
  88. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/assetimporters/uip.dll
  89. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/audio/qtaudio_wasapi.dll
  90. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/audio/qtaudio_windows.dll
  91. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/bearer/qgenericbearer.dll
  92. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/generic/qtuiotouchplugin.dll
  93. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geometryloaders/defaultgeometryloader.dll
  94. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geometryloaders/gltfgeometryloader.dll
  95. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geoservices/qtgeoservices_esri.dll
  96. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geoservices/qtgeoservices_itemsoverlay.dll
  97. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geoservices/qtgeoservices_mapbox.dll
  98. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geoservices/qtgeoservices_nokia.dll
  99. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/geoservices/qtgeoservices_osm.dll
  100. BIN
      venv/Lib/site-packages/PyQt5/Qt5/plugins/iconengines/qsvgicon.dll
  101. Some files were not shown because too many files have changed in this diff Show More

@ -0,0 +1,51 @@
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[('settings.json', '.'), ('assets/*', 'assets/.')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='IL Extract',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='assets\\extract.ico',
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='IL Extract',
)

@ -0,0 +1,194 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ILE_MainWindow.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(889, 634)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("assets/extract.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.reportTypeL = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.reportTypeL.setFont(font)
self.reportTypeL.setObjectName("reportTypeL")
self.horizontalLayout_2.addWidget(self.reportTypeL, 0, QtCore.Qt.AlignLeft)
self.reportTypeCB = QtWidgets.QComboBox(self.centralwidget)
self.reportTypeCB.setObjectName("reportTypeCB")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.reportTypeCB.addItem("")
self.horizontalLayout_2.addWidget(self.reportTypeCB)
self.gridLayout.addLayout(self.horizontalLayout_2, 0, 0, 1, 1)
self.fileSettingsBox = QtWidgets.QVBoxLayout()
self.fileSettingsBox.setObjectName("fileSettingsBox")
self.inputFileBox = QtWidgets.QHBoxLayout()
self.inputFileBox.setObjectName("inputFileBox")
self.inputFileButton = QtWidgets.QPushButton(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.inputFileButton.sizePolicy().hasHeightForWidth())
self.inputFileButton.setSizePolicy(sizePolicy)
self.inputFileButton.setMinimumSize(QtCore.QSize(250, 0))
self.inputFileButton.setMaximumSize(QtCore.QSize(250, 55))
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("assets/folder.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.inputFileButton.setIcon(icon1)
self.inputFileButton.setObjectName("inputFileButton")
self.inputFileBox.addWidget(self.inputFileButton)
self.inputFileLE = QtWidgets.QLineEdit(self.centralwidget)
self.inputFileLE.setReadOnly(True)
self.inputFileLE.setObjectName("inputFileLE")
self.inputFileBox.addWidget(self.inputFileLE)
self.fileSettingsBox.addLayout(self.inputFileBox)
self.outFileLocation = QtWidgets.QHBoxLayout()
self.outFileLocation.setObjectName("outFileLocation")
self.outputFileButton = QtWidgets.QPushButton(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.outputFileButton.sizePolicy().hasHeightForWidth())
self.outputFileButton.setSizePolicy(sizePolicy)
self.outputFileButton.setMinimumSize(QtCore.QSize(250, 0))
self.outputFileButton.setMaximumSize(QtCore.QSize(250, 55))
self.outputFileButton.setIcon(icon1)
self.outputFileButton.setObjectName("outputFileButton")
self.outFileLocation.addWidget(self.outputFileButton)
self.outputFileLE = QtWidgets.QLineEdit(self.centralwidget)
self.outputFileLE.setReadOnly(True)
self.outputFileLE.setObjectName("outputFileLE")
self.outFileLocation.addWidget(self.outputFileLE)
self.fileSettingsBox.addLayout(self.outFileLocation)
self.gridLayout.addLayout(self.fileSettingsBox, 1, 0, 1, 1)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.processReportButton = QtWidgets.QPushButton(self.centralwidget)
self.processReportButton.setEnabled(False)
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap("assets/process.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.processReportButton.setIcon(icon2)
self.processReportButton.setObjectName("processReportButton")
self.horizontalLayout.addWidget(self.processReportButton)
self.copyButton = QtWidgets.QPushButton(self.centralwidget)
self.copyButton.setEnabled(False)
icon3 = QtGui.QIcon()
icon3.addPixmap(QtGui.QPixmap("assets/copy.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.copyButton.setIcon(icon3)
self.copyButton.setObjectName("copyButton")
self.horizontalLayout.addWidget(self.copyButton)
self.openFolderButton = QtWidgets.QPushButton(self.centralwidget)
self.openFolderButton.setEnabled(False)
self.openFolderButton.setIcon(icon1)
self.openFolderButton.setObjectName("openFolderButton")
self.horizontalLayout.addWidget(self.openFolderButton)
self.openExcelButton = QtWidgets.QPushButton(self.centralwidget)
self.openExcelButton.setEnabled(False)
icon4 = QtGui.QIcon()
icon4.addPixmap(QtGui.QPixmap("assets/excel.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.openExcelButton.setIcon(icon4)
self.openExcelButton.setObjectName("openExcelButton")
self.horizontalLayout.addWidget(self.openExcelButton)
self.gridLayout.addLayout(self.horizontalLayout, 2, 0, 1, 1)
self.inputFilePreview = QtWidgets.QTextBrowser(self.centralwidget)
self.inputFilePreview.setObjectName("inputFilePreview")
self.gridLayout.addWidget(self.inputFilePreview, 3, 0, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 889, 24))
self.menubar.setObjectName("menubar")
self.menu_Settings = QtWidgets.QMenu(self.menubar)
icon5 = QtGui.QIcon()
icon5.addPixmap(QtGui.QPixmap("assets/settings.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.menu_Settings.setIcon(icon5)
self.menu_Settings.setObjectName("menu_Settings")
self.menuStart_Maximized = QtWidgets.QMenu(self.menu_Settings)
icon6 = QtGui.QIcon()
icon6.addPixmap(QtGui.QPixmap("assets/maximize.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.menuStart_Maximized.setIcon(icon6)
self.menuStart_Maximized.setObjectName("menuStart_Maximized")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.action_Default_Locations = QtWidgets.QAction(MainWindow)
icon7 = QtGui.QIcon()
icon7.addPixmap(QtGui.QPixmap("assets/fileSearch.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.action_Default_Locations.setIcon(icon7)
self.action_Default_Locations.setObjectName("action_Default_Locations")
self.menu_Settings.addAction(self.action_Default_Locations)
self.menubar.addAction(self.menu_Settings.menuAction())
self.reportTypeL.setBuddy(self.reportTypeCB)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
MainWindow.setTabOrder(self.reportTypeCB, self.inputFileButton)
MainWindow.setTabOrder(self.inputFileButton, self.outputFileButton)
MainWindow.setTabOrder(self.outputFileButton, self.processReportButton)
MainWindow.setTabOrder(self.processReportButton, self.copyButton)
MainWindow.setTabOrder(self.copyButton, self.inputFileLE)
MainWindow.setTabOrder(self.inputFileLE, self.outputFileLE)
MainWindow.setTabOrder(self.outputFileLE, self.inputFilePreview)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "IL Extract"))
self.reportTypeL.setText(_translate("MainWindow", "Infolease Report Type:"))
self.reportTypeCB.setItemText(0, _translate("MainWindow", "ACH"))
self.reportTypeCB.setItemText(1, _translate("MainWindow", "Disposition"))
self.reportTypeCB.setItemText(2, _translate("MainWindow", "Gain Loss"))
self.reportTypeCB.setItemText(3, _translate("MainWindow", "Lock Box"))
self.reportTypeCB.setItemText(4, _translate("MainWindow", "Minv_C"))
self.reportTypeCB.setItemText(5, _translate("MainWindow", "Net Inv. Loans"))
self.reportTypeCB.setItemText(6, _translate("MainWindow", "NI Renewal"))
self.reportTypeCB.setItemText(7, _translate("MainWindow", "NIV After"))
self.reportTypeCB.setItemText(8, _translate("MainWindow", "PBP / Epay"))
self.reportTypeCB.setItemText(9, _translate("MainWindow", "Returned Check"))
self.reportTypeCB.setItemText(10, _translate("MainWindow", "Unapplied"))
self.reportTypeCB.setItemText(11, _translate("MainWindow", "VMCC"))
self.reportTypeCB.setItemText(12, _translate("MainWindow", "Wires"))
self.reportTypeCB.setItemText(13, _translate("MainWindow", "Past Due"))
self.inputFileButton.setText(_translate("MainWindow", "Select &InfoLease Report"))
self.inputFileLE.setPlaceholderText(_translate("MainWindow", "No file selected"))
self.outputFileButton.setText(_translate("MainWindow", "Select &Report Output Location"))
self.outputFileLE.setPlaceholderText(_translate("MainWindow", "No location selected"))
self.processReportButton.setText(_translate("MainWindow", "&Process Report"))
self.copyButton.setText(_translate("MainWindow", "&Copy to Clipboard"))
self.openFolderButton.setText(_translate("MainWindow", "&Open Folder"))
self.openExcelButton.setText(_translate("MainWindow", "&Open File"))
self.menu_Settings.setTitle(_translate("MainWindow", "&Settings"))
self.action_Default_Locations.setText(_translate("MainWindow", "&Default Locations"))

@ -0,0 +1,933 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import sys, getopt
import re
from pathlib import Path
import time
import numpy as np
# V3.0 | 08/22/22
# contract numbers are a common feature in many reports to it's
# useful to have the regex for them globally avaiable
contract_number_regex = "\d{3}-\d{7}-\d{3}"
class ILReport:
"""
InfoLease Report class will be used to work with the files.
It makes it easier to add new reports to the workflow and to make it more clear where
the reports are coming from. It also helps with tracking reports that may not be ready yet.
"""
def __init__(self, location, extraction_function, output_location = None):
# The location where the InfoLease report is stored
self.location = location
# If output location not specified, save to the input location
if output_location == None:
self.output_location = Path(location).parent.absolute()
else:
self.output_location = output_location
# The function used to extract the data from the report
self.x_method = extraction_function
# Tracks whether the data was successfully exctracted
self.successful = False
def process(self):
print("Processing file")
try:
# Open the file and read it to a string | errors = 'replace' deals with non UTF-8 characters (no affect on output)
with open(self.location, errors="replace") as ifile:
report = ifile.read()
report = report.replace("^"," ")
except IOError as ioe:
print(f"Failed to open file: {self.location}\n{ioe}")
self.successful = False
return 1
#try:
# Run the associated method to extract the data and get the dataframe
print("Running parsing process")
print("Print something")
dataframe = self.x_method(report, self.output_location)
#except Exception as e:
# print(f"Failed to create dataframe: {self.output_name}\n{e}")
# self.successful = False
# return 1
try:
assert(len(dataframe) > 1)
except Exception as e:
print(f"Data Length Error: {self.output_name} is empty:\n{dataframe}")
self.successful = False
return 1
self.successful = True
return dataframe
def append_to_consolidated_report(self, output_dataframe: pd.DataFrame):
"""
Add's the reports dataframe to the current months consolidated report or creates one if
it already exists
The month folder is typically 2 directories above the output location
Year is the folder abover that^
"""
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
# We can't have a slot number higher than the number of slots
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
# In order to create a float we need to remove the , from the string
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
######################################################################################################################
# #
# EXTRACTION FUNCTIONS: used to pull data out of specific InfoLease report types #
# #
######################################################################################################################
"""
COMMON EXTRACTION COMPONENTS/FEATURES:
- lines = report.splitlines() : splits the reports into a list of lines (based on \n line breaks in document)
- extracted_data_dict : this is a dictionary that will hold the extracted data and will be used to create the dataframe
- columns = list(extracted_data_dict.keys()) : breaks the extracted_data_dict into a list of its keys (excel column heads)
- data_extractor = create_line_divider([#,#,#,#,#]): This creates a function we can use to pull data from a line based on
its 'slot position'. A slot position is the characters between the numbers specified in the list passed into the function
- for line in enumerate(lines): iterates through each line in the document. Line is a tuple of (line number, line string)
having the line number can be very useful when we need to access data in adjacent lines
- line# = list(zip(columns[#:#],[i for i in range(#,#)])): This creates a list with the tuple (column name, slot number).
It allows us to iterate through this list and make sure the correct data slots are being used for each column/key in the
data dictionary
COMMON REGEX COMPONENTS
\d : any digit [0-9]
\D : any character that is not a digit
\s : whitespace
. : any character besides newline (\n)
{#}: # number of the preceding character
* : 0 or more repetitions of the preceding character
"""
def ach(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"ContractNumber" : [],
"CustomerName" : [],
"BankCode" : [],
"BankNumber": [],
"AccountNumber" : [],
"Payment" : [],
"Batch": [],
"Lessor": [],
"PaymentDate": [],
}
columns = list(extracted_data_dict.keys())
batches = {
"batch_num": [],
"payment_date": [],
"lessor": [],
#"count": [],
"total": []
}
data_extractor = create_line_divider([19,57,67,82,104])
bank_number_regex = "\d{9}"
batch_num_regex = "BATCH \d{4} TOTAL"
for line in enumerate(lines):
# Check for a contract number and a bank number in the line
if (re.search(contract_number_regex, line[1]) != None) & (re.search(bank_number_regex, line[1]) != None):
# Iterates through the columns list and adds the corresponding slot number to the dictonary for the column
# Here the order of the columns (keys in dictonary) matter since they need to be in the same order as
# the slot numbers
[extracted_data_dict[columns[c]].append(data_extractor(c, line[1])) for c in range(0, len(columns)-3)]
# This searches for a statement that looks like a batch number
# This sums the contracts by thier lessor code. A feature requested by cash apps
if re.search(batch_num_regex, line[1]) != None:
# Batch number is always in characters 96 to 101
batches["batch_num"].append(line[1][96:101])
# Payment date will be 2 lines below that between charactes 114 and 125
batches["payment_date"].append(lines[line[0]+2][114:125])
# Lessor is just the first three number sof the contract number
batches["lessor"].append(extracted_data_dict["ContractNumber"][-1][0:3])
# Total is a number given by the report for that batch. ',' is removed so that it can be transformed into a float
batches["total"].append(float(line[1][107:125].strip().replace(",", "")))
#print(f"{line[0]+6} | {lines[line[0]+6][107:125]}\n{lines[line[0]+6]}")
#batches["count"].append(float(lines[line[0]+6][107:125].strip().replace(",", "")))
# Any time there's a new batch we need to add this data to the dictionary up up to the currrent place
# So we iterate over the number of contracts and add in the newest value for each that don't have one of these values already
[extracted_data_dict["Batch"].append(batches["batch_num"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["Batch"])))]
[extracted_data_dict["Lessor"].append(batches["lessor"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["Lessor"])))]
[extracted_data_dict["PaymentDate"].append(batches["payment_date"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["PaymentDate"])))]
# Now the dictioanry lists should all be equal lengths and we can create a dataframe
dataframe = pd.DataFrame(extracted_data_dict)
# We're creating two sheets: data & summary so we need to open and excel writer
# This also helps with a bug caused by larger dataframes
with pd.ExcelWriter(save_name) as writer:
dataframe.to_excel(writer, index=False, sheet_name="data")
# The batches dictioanry is converted to a dataframe and added as it's own sheet
pd.DataFrame(batches).to_excel(writer, index=False, sheet_name="Summary")
return dataframe
def disposition(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"ContractNumber" : [],
"Amount Rec" : [],
"Trans Num" : [],
"Date RCVD": [],
"Date Posted" : [],
"Last Pymt Due" : [],
"Date Due" : [],
"Residual Amt" : [],
"Term Date" : [],
"Total Pastdue" : [],
"Customer Name" : [],
}
columns = list(extracted_data_dict.keys())
data_extractor = create_line_divider([15,32,41, 51, 61, 79,88, 103, 114])
for line in enumerate(lines):
if re.search(contract_number_regex, data_extractor(0,line[1])):
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1])) for c in range(0, len(columns)-1)]
# Customer name is on a seperate line so we need to grab that seperately
extracted_data_dict["Customer Name"].append(lines[line[0]+1].strip())
dataframe = pd.DataFrame(extracted_data_dict)
dataframe.to_excel(save_name, index=False)
return dataframe
def gainloss(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
'REM RENT RCVB' : [],
'GUAR RESIDUAL' : [],
'ASSET VAL' : [],
'EQUITY ADDON' : [],
'CURR INT RCVB' : [],
'MISC G/L' : [],
'BLENDED INC' : [],
'CONTRACT NUMBER' : [],
'CURR RENT RCVB' : [],
'RESIDUAL' : [],
'END/SEC DEP' : [],
'SALES TAX' : [],
'INVENT CHANGE' : [],
'NET RESERVE' : [],
'LATE CHGS' : [],
'CUSTOMER NAME' : [],
'UNEARNED FIN' : [],
'UNAMORT RES' : [],
'MISC' : [],
'MISC TAX' : [],
'CASH RECEIVED' : [],
'RCV OFFSET' : [],
'GAIN/LOSS' : [],
'DISPOSITION CODE' : [],
'UNEARNED IDC' : [],
'UNPAID INT' : [],
'PENALTY FEE' : [],
'UNPAID ACCRD' : [],
'RENEWAL RCVBL' : [],
'DEF REN INC' : [],
'DEF REN INT' : [],
'EARNED IDC' : [],
'GST BOOK G/L' : [],
'UNRECOG GST' : [],
'INT EARNED' : [],
'OVER/SHORT' : [],
'OPER RCVB' : [],
'OPER BASIS' : [],
'CTD OPER DEPR' : [],
}
# L0: BlendedInc 6
# L1: Late CHGS 14
# L2: Gain/Loss 22
# L3: Def Ren Int 30
# l4 Over/Short 35
# L5: CTD OPER
columns = list(extracted_data_dict.keys())
# These line data are used to tell the data extrator which values to pull for each line of
# relevant data. It pairs dictionary keys with thier corresponding data slot in the line
# so that they can be iterated through during data extraction
#
# It looks confusing but makes more sense if you look at the actual Info Lease reports
# This is one of the messiest reports
line0 = list(zip(columns[0:7],[i for i in range(1,8)]))
line1 = list(zip(columns[7:15],[i for i in range(0,8)]))
line2 = list(zip(columns[15:23], [i for i in range(0,8)]))
line3 = list(zip(columns[23:31], [i for i in range(0,8)]))
line4 = list(zip(columns[31:36], [i for i in range(1,8) if i not in [3,6]]))
line5 = list(zip(columns[36:], [i for i in range(1,4)]))
data_extractor = create_line_divider([27,43,58,74,88,105,120])
for line in enumerate(lines):
# The line must contain a contract number and the first data slot should be a float
if (re.search(contract_number_regex, data_extractor(0,line[1])) != None)&\
(type(data_extractor(1,line[1])) == float) :
data_section = lines[line[0]-1:line[0]+5]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[0])) for c in line0]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[1])) for c in line1]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[2])) for c in line2]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[3])) for c in line3]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[4])) for c in line4]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[5])) for c in line5]
df = pd.DataFrame(extracted_data_dict)
print("df created")
# The Accounting team wanted the disposotion code split into number and descriptionso...
print("Splitting disp")
df["DISPOSITION DESC"] = df['DISPOSITION CODE'].apply(lambda dc: " ".join(dc.split(" ")[1:]))
df["DISPOSITION CODE"] = df['DISPOSITION CODE'].apply(lambda dc: dc.split(" ")[0])
print("adding Fund")
df["Fund"] = df["CONTRACT NUMBER"].apply(
lambda con_num: con_num[0:3])
print("Reordering df")
df = df[['Fund',
'CONTRACT NUMBER',
'CUSTOMER NAME',
'DISPOSITION CODE',
'DISPOSITION DESC',
'CASH RECEIVED',
'GAIN/LOSS',
'NET RESERVE',
'REM RENT RCVB',
'RESIDUAL',
'UNAMORT RES',
'UNEARNED FIN',
'BLENDED INC',
'END/SEC DEP',
'UNEARNED IDC',
'UNPAID INT',
'MISC',
'ASSET VAL',
'CTD OPER DEPR',
'CURR INT RCVB',
'CURR RENT RCVB',
'DEF REN INC',
'DEF REN INT',
'EARNED IDC',
'EQUITY ADDON',
'GST BOOK G/L',
'GUAR RESIDUAL',
'INT EARNED',
'INVENT CHANGE',
'LATE CHGS',
'MISC G/L',
'MISC TAX',
'OPER BASIS',
'OPER RCVB',
'OVER/SHORT',
'PENALTY FEE',
'RCV OFFSET',
'RENEWAL RCVBL',
'SALES TAX',
'UNPAID ACCRD',
'UNRECOG GST',
]]
print("saving df")
df.to_excel(save_name, index=False)
return df
# Works for Net-inv-loans & NIV-after
def net_invest_trial_balance(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
'CUSTOMER NAME': [],
'CURR INT RCVB': [],
'UNEARNED BLENDED': [],
'BLEND NET INV': [],
'LEASE NUMBER': [],
'GROSS CONTRACT': [],
'CURR RENT RCVB': [],
'UNEARN FIN': [],
'END DEPOSIT': [],
'SEC DEPOSIT': [],
'LEASE PYMTS': [],
'TOTAL': [],
'CONTRACT STAT': [],
'PAYMENTS RCVD': [],
'REM RENT RCVB': [],
'UNEARN RESID': [],
'PROV LOSS': [],
'NET RESERVE': [],
'UNEARN INC': [],
'BAL REMAINING': [],
'RESIDUAL': [],
'UNPAID INT': [],
'NET INV': [],
'UNEARNED IDC': [],
}
lessors = []
columns = list(extracted_data_dict.keys())
line0 = list(zip(columns[0:4], [0, 3, 4, 5]))
line1 = list(zip(columns[4:12], [i for i in range(0, 8)]))
line2 = list(zip(columns[12:19], [i for i in range(0, 7)]))
line3 = list(zip(columns[19:], [i for i in range(1, 6)]))
data_extractor = create_line_divider([18, 32, 50, 66, 84, 100, 117,132])
for line in enumerate(lines):
slot1 = data_extractor(0, line[1], False)
if type(slot1) != str:
continue
if re.search(contract_number_regex, slot1) != None:
data_section = lines[line[0]-1:line[0]+3]
# There were issues were the IL Report would have random blank lines so that needs to be checked
# and adjusted for
# A dead give away of an empty line in a data section is a line without a '.'
# Check the first data line
if data_section[0].find(".") == -1:
# Move it back if empty
data_section[0] = lines[line[0]-2]
# Now we go through each relevant data line and make sure they're not blank
for ds in enumerate(data_section):
if ds[1].find(".") == -1:
if ds[0] < len(data_section) - 1:
for i in range(ds[0], len(data_section)-1):
# This allows us to move down all the data lines after a blank data line
data_section[i] = data_section[i+1]
# This handles the last data line which goes 'out-of-bounds' of the existing data selection
data_section[3] = lines[line[0]+3]
else:
data_section[3] = lines[line[0]+3]
# Now that the datasection is sorted we can extract the data
[extracted_data_dict[c[0]].append(data_extractor(
c[1], data_section[0], False)) for c in line0]
[extracted_data_dict[c[0]].append(data_extractor(
c[1], data_section[1], False)) for c in line1]
[extracted_data_dict[c[0]].append(data_extractor(
c[1], data_section[2], False)) for c in line2]
[extracted_data_dict[c[0]].append(data_extractor(
c[1], data_section[3], False)) for c in line3]
dataframe = pd.DataFrame(extracted_data_dict)
dataframe["LESSOR"] = dataframe["LEASE NUMBER"].apply(lambda con: con[0:3])
dataframe = dataframe.replace("REVOLV", np.NaN)
dataframe = dataframe.replace("ING ACCOUNT", np.NaN)
dataframe = dataframe.replace("", np.NaN)
print(dataframe)
#dataframe.to_excel("test_niv.xlsx")
print("Dataframe complete")
print("Createing pivot...")
nums = ['RESIDUAL',
'UNEARN FIN',
'UNEARNED BLENDED',
'UNEARN RESID',
'SEC DEPOSIT',
'UNEARNED IDC',
'NET RESERVE',
'UNPAID INT',
'NET INV',
'BLEND NET INV',
'GROSS CONTRACT',
'PAYMENTS RCVD',
'REM RENT RCVB',
'LEASE PYMTS',
'UNEARN INC',
'TOTAL',
'CURR INT RCVB',
'PROV LOSS',
'CURR RENT RCVB',
'END DEPOSIT']
for n in nums:
dataframe[n].astype("float",copy=False)
summary = pd.pivot_table(dataframe,
values=['CUSTOMER NAME',
'RESIDUAL',
'UNEARN FIN',
'UNEARNED BLENDED',
'UNEARN RESID',
'SEC DEPOSIT',
'UNEARNED IDC',
'NET RESERVE',
'UNPAID INT',
'NET INV',
'BLEND NET INV',
'GROSS CONTRACT',
'PAYMENTS RCVD',
'REM RENT RCVB',
'LEASE PYMTS',
'UNEARN INC',
'TOTAL',
'CURR INT RCVB',
'PROV LOSS',
'CURR RENT RCVB',
'END DEPOSIT',
'BAL REMAINING',
],
aggfunc={
'CUSTOMER NAME': np.size,
'RESIDUAL': np.sum,
'UNEARN FIN': np.sum,
'UNEARNED BLENDED': np.sum,
'UNEARN RESID': np.sum,
'SEC DEPOSIT': np.sum,
'UNEARNED IDC': np.sum,
'NET RESERVE': np.sum,
'UNPAID INT': np.sum,
'NET INV': np.sum,
'BLEND NET INV': np.sum,
'GROSS CONTRACT': np.sum,
'PAYMENTS RCVD': np.sum,
'REM RENT RCVB': np.sum,
'LEASE PYMTS': np.sum,
'UNEARN INC': np.sum,
'TOTAL': np.sum,
'CURR INT RCVB': np.sum,
'PROV LOSS': np.sum,
'CURR RENT RCVB': np.sum,
'END DEPOSIT': np.sum,
'BAL REMAINING' : np.sum,
},
index="LESSOR")
print(summary)
print("Summary complete")
summary.rename(columns={"CUSTOMER NAME": "Contract Count"}, inplace=True)
summary = summary[['Contract Count',
'BAL REMAINING',
'RESIDUAL',
'UNEARN FIN',
'UNEARNED BLENDED',
'UNEARN RESID',
'SEC DEPOSIT',
'UNEARNED IDC',
'NET RESERVE',
'UNPAID INT',
'NET INV',
'BLEND NET INV',
'GROSS CONTRACT',
'PAYMENTS RCVD',
'REM RENT RCVB',
'LEASE PYMTS',
'UNEARN INC',
'TOTAL',
'CURR INT RCVB',
'PROV LOSS',
'CURR RENT RCVB',
'END DEPOSIT',
]]
dataframe = dataframe[['LESSOR',
'LEASE NUMBER',
'BAL REMAINING',
'RESIDUAL',
'UNEARN FIN',
'UNEARNED BLENDED',
'UNEARN RESID',
'SEC DEPOSIT',
'NET RESERVE',
'UNEARNED IDC',
'UNPAID INT',
'BLEND NET INV',
'NET INV',
'CUSTOMER NAME',
'GROSS CONTRACT',
'CURR RENT RCVB',
'END DEPOSIT',
'LEASE PYMTS',
'TOTAL',
'CONTRACT STAT',
'PAYMENTS RCVD',
'PROV LOSS',
'UNEARN INC',
'REM RENT RCVB',
'CURR INT RCVB',
]]
print("Attempting to save")
with pd.ExcelWriter(save_name) as writer:
dataframe.to_excel(writer, index=False, sheet_name="data")
summary.to_excel(
writer, index=True, sheet_name="Summary")
return dataframe
def lockbox(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"SEQ" : [],
"PYMT DATE" : [],
"INV NUM" : [],
"CHECK NUMBER" : [],
"PAYMENT AMOUNT" : [],
"NOTE" : [],
"IL SEQ" : [],
"CONTRACT NUM" : [],
"IL PAYMENT AMOUNT" : [],
"CUST NAME" : [],
}
columns = list(extracted_data_dict.keys())
data_extractor = create_line_divider([9,19,39,56,69,89,98,118])
for line in enumerate(lines):
match = False
# Try to find the first SEQ # & a contract payment date e.i. ' 197 05/10/2022'
if re.match("(\s|\d){3}\d{1}\s{5}\d{2}/\d{2}/\d{4}", line[1]):
match = True
# Add all of the data points except customer name
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1],debug=False)) for c in range(0,len(columns)-1)]
# Check to see if this line contains only an infolease payment
# Some times there are multiple infolease payments for a single bank record
elif re.search(contract_number_regex, line[1]) != None:
match = True
# If there is then we can add the same data as the previous complete line
[extracted_data_dict[columns[c]].append(extracted_data_dict[columns[c]][-1]) for c in range(0,6)]
# Then add the new data for the infolease contract
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1],debug=False)) for c in range(6,len(columns)-1)]
# If we had a match we need a customer name to associate with it
# Sometimes these can appear on the next page hense the while loop searching for a match
if match:
# We can tell the cust name will be on the next page if the word "PAGE" appears three lines under the current line
# And the next line is blank
if (lines[line[0]+1].strip() == "") & (lines[line[0]+3].find("PAGE") != -1):
i = 0
# Look for a bunch of whitespace then some writing
while not re.match("\s{98}.{34}", lines[line[0]+i]):
i +=1
# Once we find it add the cust name to the dict (it's the only thing on the line)
extracted_data_dict["CUST NAME"].append(lines[line[0]+i].strip())
# if the condition above isnt met then the cust name is on the next line (even if that line is blank)
else:
extracted_data_dict["CUST NAME"].append(lines[line[0]+1].strip())
dataframe = pd.DataFrame(extracted_data_dict)
dataframe.to_excel(save_name, index=False)
return dataframe
def minv(report: str, save_name: str):
print("Started minv process")
lines = report.splitlines()
data_extractor = create_line_divider([15,32,52,71,83,107,116,128])
extracted_data_dict = {
"ContractNumber" : [],
"UTAB_OIC_DUE" : [],
"RentalDue" : [],
"UTAB_OIC_PYMT" : [],
"ChargeType" : [],
"OutstandBalance" : [],
"BizSegment" : [],
"BookingDate" : [],
"Branch" : [],
}
columns = list(extracted_data_dict.keys())
for line in enumerate(lines):
if re.search(contract_number_regex, line[1]) != None:
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1],debug=False)) for c in range(0,len(columns))]
#All the list lengths need to be the same so if anything was missed it will fail to build
dataframe = pd.DataFrame(extracted_data_dict)
filtered = dataframe[(dataframe["BookingDate"] != dt.today().strftime("%m/%d/%Y")) &
((dataframe["RentalDue"] > 0) | ((dataframe["RentalDue"] == 0) & (dataframe["OutstandBalance"] > 100)))]
with open(save_name, 'w') as output:
add_contracts = []
for contract in filtered['ContractNumber'].to_list():
output.write(f"{contract}\n") if contract not in add_contracts else None
add_contracts.append(contract)
return filtered
# Good for PUB_WIRES, VMCC, PBP_EPAY, returned check
def payment_transactions(report: str, save_name: str):
lines = report.splitlines()
data_extractor = create_line_divider([6,33,52,62,80,89,110,121])
extracted_data_dict = {
'SEQ' : [],
'ACCOUNT NUMBER' : [],
'PYMT METHOD' : [],
'DATE RCVD' : [],
'AMOUNT' : [],
'REF NO': [],
'PAYMENT MEMO' : [],
'PYMT TYPE' : [],
'CHECK NO' : [],
'CUSTOMER NAME' : [],
'TRANSACTIONS NUM': [],
'INV NO' : [],
}
columns = list(extracted_data_dict.keys())
transaction_num_regex = "\d{8}"
for line in enumerate(lines):
slot1 = data_extractor(1,line[1],False)
if type(slot1) != str : continue
if (re.search(contract_number_regex, slot1) or re.search("\d{3}\.\d{4}\.\d{4}", slot1))!= None:
[extracted_data_dict[columns[c]].append(data_extractor(c, line[1])) for c in range(0,len(columns)-3)]
tnum_match = re.search(transaction_num_regex, lines[line[0]+1])
if tnum_match:
tnum = lines[line[0]+1][tnum_match.start():tnum_match.end()]
else:
tnum = ""
extracted_data_dict["TRANSACTIONS NUM"].append(tnum)
cname = lines[line[0]+1][6:37].strip()
extracted_data_dict['CUSTOMER NAME'].append(cname)
inv_no = lines[line[0]+1][79:90].strip()
extracted_data_dict['INV NO'].append(inv_no)
dataframe = pd.DataFrame(extracted_data_dict)
print(dataframe)
print("Saving")
dataframe.to_excel(save_name, index=False)
print("Saved successfully")
return dataframe
def renewal_net_invest_trial_balance(report: str, save_name: str):
lines = report.splitlines()
data_extractor = create_line_divider([21, 29, 43, 58, 71, 88, 99, 113])
extracted_data_dict = {
'CUSTOMER NAME': [],
'TYPE': [],
'GROSS RENEWAL': [],
'REMAINING BAL': [],
'FINANCED RES': [],
'REMAINING RES': [],
'LEASE PYMTS': [],
'CONTRACT NUMBER': [],
'RENEWAL': [],
'PAYMENTS RCVD': [],
'CUR RENT RCVB': [],
'UNEARNED RIN': [],
'SECURITY DEP': [],
'NET INVEST': [],
'UNEARN INCOME': [],
'TOTAL': [],
'REM RENT RCVB': [],
'UNPAID RES': [],
}
columns = list(extracted_data_dict.keys())
line0 = list(zip(columns[0:7], [0, 1, 2, 3, 4, 5, 7]))
line1 = list(zip(columns[7:16], [i for i in range(0, 9)]))
line2 = list(zip(columns[16:], [3, 4]))
for line in enumerate(lines):
slot1 = data_extractor(0, line[1], False)
if type(slot1) != str:
continue
if re.search(contract_number_regex, slot1) != None:
data_section = lines[line[0]-1:line[0]+2]
# SEE net_invest_trial_balance FOR EXPLAINATION
if data_section[0].find(".") == -1:
data_section[0] = lines[line[0]-2]
for ds in enumerate(data_section):
if ds[1].find(".") == -1:
if ds[0] < len(data_section) - 1:
for i in range(ds[0], len(data_section)-1):
data_section[i] = data_section[i+1]
data_section[2] = lines[line[0]+2]
else:
data_section[2] = lines[line[0]+2]
[extracted_data_dict[c[0]].append(
data_extractor(c[1], data_section[0])) for c in line0]
[extracted_data_dict[c[0]].append(
data_extractor(c[1], data_section[1])) for c in line1]
[extracted_data_dict[c[0]].append(
data_extractor(c[1], data_section[2])) for c in line2]
dataframe = pd.DataFrame(extracted_data_dict)
print("df created")
dataframe["Fund"] = dataframe["CONTRACT NUMBER"].apply(
lambda con_num: con_num[0:3])
print("Fund added")
summary = pd.pivot_table(dataframe,
values=['CUSTOMER NAME',
"UNPAID RES", "REMAINING RES", "SECURITY DEP", 'GROSS RENEWAL',
"FINANCED RES", "LEASE PYMTS", "PAYMENTS RCVD", "NET INVEST", "TOTAL",
"CUR RENT RCVB", "UNEARNED RIN", "UNEARN INCOME", "REM RENT RCVB"],
aggfunc={
'CUSTOMER NAME': np.size,
"UNPAID RES": np.sum,
"REMAINING RES": np.sum,
"SECURITY DEP": np.sum,
'GROSS RENEWAL': np.sum,
"FINANCED RES": np.sum,
"LEASE PYMTS": np.sum,
"PAYMENTS RCVD": np.sum,
"NET INVEST": np.sum,
"TOTAL": np.sum,
"CUR RENT RCVB": np.sum,
"UNEARNED RIN": np.sum,
"UNEARN INCOME": np.sum,
"REM RENT RCVB": np.sum
},
index="Fund")
print("Summary complete")
summary.rename(columns={"CUSTOMER NAME": "Renewal Count"}, inplace=True)
print("Remaned Renewal count")
summary = summary[['Renewal Count',
'UNPAID RES',
'REMAINING RES',
'SECURITY DEP',
'GROSS RENEWAL',
'REMAINING RES',
'FINANCED RES',
'LEASE PYMTS',
'PAYMENTS RCVD',
'NET INVEST',
'TOTAL',
'CUR RENT RCVB',
'UNEARNED RIN',
'UNEARN INCOME',
'REM RENT RCVB',
]]
print("Reordered sum")
dataframe = dataframe[['Fund',
'CONTRACT NUMBER',
'TYPE',
'RENEWAL',
'UNPAID RES',
'REMAINING RES',
'SECURITY DEP',
'GROSS RENEWAL',
'FINANCED RES',
'PAYMENTS RCVD',
'NET INVEST',
'REMAINING BAL',
'CUSTOMER NAME',
'LEASE PYMTS',
'CUR RENT RCVB',
'UNEARNED RIN',
'UNEARN INCOME',
'TOTAL',
'REM RENT RCVB',
]]
print("dfs rearragned | Savings")
with pd.ExcelWriter(save_name) as writer:
dataframe.to_excel(writer, index=False, sheet_name="data")
summary.to_excel(
writer, index=True, sheet_name="Summary")
return dataframe
def unapplied(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"Trans Num": [],
"ContractNumber": [],
"CheckNum": [],
"Date RCVD": [],
"Asset ID": [],
"Reversed Amt": [],
"Branch": [],
"Unapplied Susp Acct": [],
"PaymentMemo": [],
"Payers Name": [],
"Batch Num": [],
"Posting Date": [],
"Unapplied Amt": [],
"Rev Post Date": [],
"Ref Num": [],
"Check Amt": [],
"Reason Code": [],
}
columns = list(extracted_data_dict.keys())
# Iterate through the lines one at a time to look for relavant data
# Use enumerate so that we know which line we're currently working on
# this allows us to also work in the 'report' structure so that we can
# grab the customer name from the line proceding the data
data_extractor = create_line_divider([9, 29, 38, 50, 65, 80, 89, 108])
bank_num_reg = ".*\s*\d\d\d\.\d\d\s.*PAGE"
#current_bank_num = np.NaN
#bank_nums = []
trans_num = "\d{7}"
for line in enumerate(lines):
if (re.search("\d{7}", str(data_extractor(0, line[1], debug=False))) != None) &\
(re.search("\d{2}/\d{2}/\d{4}", str(data_extractor(3, line[1], debug=False))) != None):
[extracted_data_dict[columns[c]].append(
data_extractor(c, line[1])) for c in range(0, 9)]
[extracted_data_dict[columns[8+c]].append(data_extractor(
c, lines[line[0]+1])) for c in range(1, len(columns)-8)]
#bank_nums.append(current_bank_num)
#elif re.search(bank_num_reg, line[1]) != None:
#current_bank_num = re.search("\d\d\d\.\d\d", line[1]).group(0)
dataframe = pd.DataFrame(extracted_data_dict)
dataframe["ReverseAmt"] = [np.NaN for _ in range(0, len(dataframe))]
#dataframe["Bank_"]
dataframe = dataframe[[
'Trans Num',
'ContractNumber',
'CheckNum',
'Date RCVD',
'Payers Name',
'Unapplied Amt',
'Reason Code',
'Batch Num',
'Posting Date',
'Asset ID',
'Rev Post Date',
'ReverseAmt',
'Branch',
'Ref Num',
'Unapplied Susp Acct',
'PaymentMemo',
'Check Amt',
]]
dataframe.to_excel(save_name, index=False)
print(dataframe)
return dataframe
def pastdue(report: str, save_name: str):
print("Running past due")
lines = report.splitlines()
extracted_data_dict = {
"Contract Number": [],
"Right 11": [],
"Past Due Rental": [],
"Current Rent": [],
"Cust Cred Act": [],
"Cust Name": [],
"Branch": [],
"Blend NIV": [],
"Delinq Code": [],
"Pymt Option": [],
"Bank Num": [],
"Account Num": [],
"Due Day": [],
"LEAD Days": [],
"Invoice Lead Days": [],
"ACH LEAD Days": [],
"Renewal": [],
"Follow Up Code": [],
}
# WIll need 'right 11' later
columns = list(extracted_data_dict.keys())
# These are the line spaces where each column is held
slots = [(0,16), (5,16),(389,405),(126,141),(16,36),(37,67),(68,74),(75,93),(94,111),(168,180),\
(190,204),(204,225), (242,253), (225,241), (436,444), (445,461), (462,469), (470,478)]
for line in enumerate(lines):
if re.search(contract_number_regex, line[1]) != None:
# goes through the column names (by number) then gets the charcter slot (start and end)
[extracted_data_dict[columns[c]].append((line[1][slots[c][0]:slots[c][1]]).strip()) for c in range(0, len(columns))]
# This regex finds lines with only a name in them | (blank in the beginig then atleast one character)
elif re.search("\s{38}\w+", line[1]) != None:
extracted_data_dict["Cust Name"][-1] = (extracted_data_dict["Cust Name"][-1] + line[1][37:67]).strip()
dataframe = pd.DataFrame(extracted_data_dict)
dataframe = dataframe.astype(
{"Past Due Rental": "float", "Current Rent": "float", "Branch": "int32",
"Blend NIV": "float", "Delinq Code": "int32", "Due Day":"int32", "Invoice LEAD Days": "int32", "ACH LEAD Days": "int32"
}, errors="ignore" )
dataframe.to_excel(save_name, index=False)
return dataframe

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 330 330" style="enable-background:new 0 0 330 330;" xml:space="preserve">
<g>
<path d="M165,0C74.019,0,0,74.019,0,165s74.019,165,165,165s165-74.019,165-165S255.981,0,165,0z M165,300
c-74.44,0-135-60.561-135-135S90.56,30,165,30s135,60.561,135,135S239.439,300,165,300z"/>
<path d="M226.872,106.664l-84.854,84.853l-38.89-38.891c-5.857-5.857-15.355-5.858-21.213-0.001
c-5.858,5.858-5.858,15.355,0,21.213l49.496,49.498c2.813,2.813,6.628,4.394,10.606,4.394c0.001,0,0,0,0.001,0
c3.978,0,7.793-1.581,10.606-4.393l95.461-95.459c5.858-5.858,5.858-15.355,0-21.213
C242.227,100.807,232.73,100.806,226.872,106.664z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
<g id="Text-files">
<path d="M53.9791489,9.1429005H50.010849c-0.0826988,0-0.1562004,0.0283995-0.2331009,0.0469999V5.0228
C49.7777481,2.253,47.4731483,0,44.6398468,0h-34.422596C7.3839517,0,5.0793519,2.253,5.0793519,5.0228v46.8432999
c0,2.7697983,2.3045998,5.0228004,5.1378999,5.0228004h6.0367002v2.2678986C16.253952,61.8274002,18.4702511,64,21.1954517,64
h32.783699c2.7252007,0,4.9414978-2.1725998,4.9414978-4.8432007V13.9861002
C58.9206467,11.3155003,56.7043495,9.1429005,53.9791489,9.1429005z M7.1110516,51.8661003V5.0228
c0-1.6487999,1.3938999-2.9909999,3.1062002-2.9909999h34.422596c1.7123032,0,3.1062012,1.3422,3.1062012,2.9909999v46.8432999
c0,1.6487999-1.393898,2.9911003-3.1062012,2.9911003h-34.422596C8.5049515,54.8572006,7.1110516,53.5149002,7.1110516,51.8661003z
M56.8888474,59.1567993c0,1.550602-1.3055,2.8115005-2.9096985,2.8115005h-32.783699
c-1.6042004,0-2.9097996-1.2608986-2.9097996-2.8115005v-2.2678986h26.3541946
c2.8333015,0,5.1379013-2.2530022,5.1379013-5.0228004V11.1275997c0.0769005,0.0186005,0.1504021,0.0469999,0.2331009,0.0469999
h3.9682999c1.6041985,0,2.9096985,1.2609005,2.9096985,2.8115005V59.1567993z"/>
<path d="M38.6031494,13.2063999H16.253952c-0.5615005,0-1.0159006,0.4542999-1.0159006,1.0158005
c0,0.5615997,0.4544001,1.0158997,1.0159006,1.0158997h22.3491974c0.5615005,0,1.0158997-0.4542999,1.0158997-1.0158997
C39.6190491,13.6606998,39.16465,13.2063999,38.6031494,13.2063999z"/>
<path d="M38.6031494,21.3334007H16.253952c-0.5615005,0-1.0159006,0.4542999-1.0159006,1.0157986
c0,0.5615005,0.4544001,1.0159016,1.0159006,1.0159016h22.3491974c0.5615005,0,1.0158997-0.454401,1.0158997-1.0159016
C39.6190491,21.7877007,39.16465,21.3334007,38.6031494,21.3334007z"/>
<path d="M38.6031494,29.4603004H16.253952c-0.5615005,0-1.0159006,0.4543991-1.0159006,1.0158997
s0.4544001,1.0158997,1.0159006,1.0158997h22.3491974c0.5615005,0,1.0158997-0.4543991,1.0158997-1.0158997
S39.16465,29.4603004,38.6031494,29.4603004z"/>
<path d="M28.4444485,37.5872993H16.253952c-0.5615005,0-1.0159006,0.4543991-1.0159006,1.0158997
s0.4544001,1.0158997,1.0159006,1.0158997h12.1904964c0.5615025,0,1.0158005-0.4543991,1.0158005-1.0158997
S29.0059509,37.5872993,28.4444485,37.5872993z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@ -0,0 +1,6 @@
<svg width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g>
<path fill="none" d="M0 0h24v24H0z"/>
<path d="M2.859 2.877l12.57-1.795a.5.5 0 0 1 .571.495v20.846a.5.5 0 0 1-.57.495L2.858 21.123a1 1 0 0 1-.859-.99V3.867a1 1 0 0 1 .859-.99zM4 4.735v14.53l10 1.429V3.306L4 4.735zM17 19h3V5h-3V3h4a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1h-4v-2zm-6.8-7l2.8 4h-2.4L9 13.714 7.4 16H5l2.8-4L5 8h2.4L9 10.286 10.6 8H13l-2.8 4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,4 @@
<?xml version="1.0" standalone="no"?>
<svg width="1024px" height="1024px" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon">
<path d="M688 312v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm144 452H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm445.7 51.5l-93.3-93.3C814.7 780.7 828 743.9 828 704c0-97.2-78.8-176-176-176s-176 78.8-176 176 78.8 176 176 176c35.8 0 69-10.7 96.8-29l94.7 94.7c1.6 1.6 3.6 2.3 5.6 2.3s4.1-.8 5.6-2.3l31-31a7.9 7.9 0 0 0 0-11.2zM652 816c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"/>
</svg>

After

Width:  |  Height:  |  Size: 819 B

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewBox="0 0 24 24" width="512" height="512"><path d="M19,3H12.472a1.019,1.019,0,0,1-.447-.1L8.869,1.316A3.014,3.014,0,0,0,7.528,1H5A5.006,5.006,0,0,0,0,6V18a5.006,5.006,0,0,0,5,5H19a5.006,5.006,0,0,0,5-5V8A5.006,5.006,0,0,0,19,3ZM5,3H7.528a1.019,1.019,0,0,1,.447.1l3.156,1.579A3.014,3.014,0,0,0,12.472,5H19a3,3,0,0,1,2.779,1.882L2,6.994V6A3,3,0,0,1,5,3ZM19,21H5a3,3,0,0,1-3-3V8.994l20-.113V18A3,3,0,0,1,19,21Z"/></svg>

After

Width:  |  Height:  |  Size: 512 B

@ -0,0 +1,24 @@
<svg
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M3 3H9V5H6.46173L11.3047 9.84298L9.8905 11.2572L5 6.3667V9H3V3Z"
fill="currentColor"
/>
<path
d="M3 21H9V19H6.3764L11.3046 14.0718L9.89038 12.6576L5 17.548V15H3V21Z"
fill="currentColor"
/>
<path
d="M15 21H21V15H19V17.5244L14.1332 12.6576L12.719 14.0718L17.6472 19H15V21Z"
fill="currentColor"
/>
<path
d="M21 3H15V5H17.5619L12.7189 9.84301L14.1331 11.2572L19 6.39032V9H21V3Z"
fill="currentColor"
/>
</svg>

After

Width:  |  Height:  |  Size: 568 B

@ -0,0 +1 @@
<svg width="16px" height="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2h13l.5.5V9h-1V6H2v7h7v1H1.5l-.5-.5v-11l.5-.5zM2 5h12V3H2v2zm5 7v-1.094a1.633 1.633 0 0 1-.469-.265l-.945.539-.5-.86.937-.547a1.57 1.57 0 0 1 0-.547l-.937-.546.5-.86.945.54c.151-.12.308-.209.469-.266V7h1v1.094a1.48 1.48 0 0 1 .469.265l.945-.539.5.86-.937.547a1.57 1.57 0 0 1 0 .546l.937.547-.5.86-.945-.54a1.807 1.807 0 0 1-.469.266V12H7zm-.25-2.5c0 .208.073.385.219.531a.723.723 0 0 0 .531.219.723.723 0 0 0 .531-.219.723.723 0 0 0 .219-.531.723.723 0 0 0-.219-.531.723.723 0 0 0-.531-.219.723.723 0 0 0-.531.219.723.723 0 0 0-.219.531zm5.334 5.5v-1.094a1.634 1.634 0 0 1-.469-.265l-.945.539-.5-.86.938-.547a1.572 1.572 0 0 1 0-.547l-.938-.546.5-.86.945.54c.151-.12.308-.209.47-.266V10h1v1.094a1.486 1.486 0 0 1 .468.265l.945-.539.5.86-.937.547a1.562 1.562 0 0 1 0 .546l.937.547-.5.86-.945-.54a1.806 1.806 0 0 1-.469.266V15h-1zm-.25-2.5c0 .208.073.385.219.531a.723.723 0 0 0 .531.219.723.723 0 0 0 .531-.219.723.723 0 0 0 .22-.531.723.723 0 0 0-.22-.531.723.723 0 0 0-.53-.219.723.723 0 0 0-.532.219.723.723 0 0 0-.219.531z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 478.703 478.703" style="enable-background:new 0 0 478.703 478.703;" xml:space="preserve">
<g>
<g>
<path d="M454.2,189.101l-33.6-5.7c-3.5-11.3-8-22.2-13.5-32.6l19.8-27.7c8.4-11.8,7.1-27.9-3.2-38.1l-29.8-29.8
c-5.6-5.6-13-8.7-20.9-8.7c-6.2,0-12.1,1.9-17.1,5.5l-27.8,19.8c-10.8-5.7-22.1-10.4-33.8-13.9l-5.6-33.2
c-2.4-14.3-14.7-24.7-29.2-24.7h-42.1c-14.5,0-26.8,10.4-29.2,24.7l-5.8,34c-11.2,3.5-22.1,8.1-32.5,13.7l-27.5-19.8
c-5-3.6-11-5.5-17.2-5.5c-7.9,0-15.4,3.1-20.9,8.7l-29.9,29.8c-10.2,10.2-11.6,26.3-3.2,38.1l20,28.1
c-5.5,10.5-9.9,21.4-13.3,32.7l-33.2,5.6c-14.3,2.4-24.7,14.7-24.7,29.2v42.1c0,14.5,10.4,26.8,24.7,29.2l34,5.8
c3.5,11.2,8.1,22.1,13.7,32.5l-19.7,27.4c-8.4,11.8-7.1,27.9,3.2,38.1l29.8,29.8c5.6,5.6,13,8.7,20.9,8.7c6.2,0,12.1-1.9,17.1-5.5
l28.1-20c10.1,5.3,20.7,9.6,31.6,13l5.6,33.6c2.4,14.3,14.7,24.7,29.2,24.7h42.2c14.5,0,26.8-10.4,29.2-24.7l5.7-33.6
c11.3-3.5,22.2-8,32.6-13.5l27.7,19.8c5,3.6,11,5.5,17.2,5.5l0,0c7.9,0,15.3-3.1,20.9-8.7l29.8-29.8c10.2-10.2,11.6-26.3,3.2-38.1
l-19.8-27.8c5.5-10.5,10.1-21.4,13.5-32.6l33.6-5.6c14.3-2.4,24.7-14.7,24.7-29.2v-42.1
C478.9,203.801,468.5,191.501,454.2,189.101z M451.9,260.401c0,1.3-0.9,2.4-2.2,2.6l-42,7c-5.3,0.9-9.5,4.8-10.8,9.9
c-3.8,14.7-9.6,28.8-17.4,41.9c-2.7,4.6-2.5,10.3,0.6,14.7l24.7,34.8c0.7,1,0.6,2.5-0.3,3.4l-29.8,29.8c-0.7,0.7-1.4,0.8-1.9,0.8
c-0.6,0-1.1-0.2-1.5-0.5l-34.7-24.7c-4.3-3.1-10.1-3.3-14.7-0.6c-13.1,7.8-27.2,13.6-41.9,17.4c-5.2,1.3-9.1,5.6-9.9,10.8l-7.1,42
c-0.2,1.3-1.3,2.2-2.6,2.2h-42.1c-1.3,0-2.4-0.9-2.6-2.2l-7-42c-0.9-5.3-4.8-9.5-9.9-10.8c-14.3-3.7-28.1-9.4-41-16.8
c-2.1-1.2-4.5-1.8-6.8-1.8c-2.7,0-5.5,0.8-7.8,2.5l-35,24.9c-0.5,0.3-1,0.5-1.5,0.5c-0.4,0-1.2-0.1-1.9-0.8l-29.8-29.8
c-0.9-0.9-1-2.3-0.3-3.4l24.6-34.5c3.1-4.4,3.3-10.2,0.6-14.8c-7.8-13-13.8-27.1-17.6-41.8c-1.4-5.1-5.6-9-10.8-9.9l-42.3-7.2
c-1.3-0.2-2.2-1.3-2.2-2.6v-42.1c0-1.3,0.9-2.4,2.2-2.6l41.7-7c5.3-0.9,9.6-4.8,10.9-10c3.7-14.7,9.4-28.9,17.1-42
c2.7-4.6,2.4-10.3-0.7-14.6l-24.9-35c-0.7-1-0.6-2.5,0.3-3.4l29.8-29.8c0.7-0.7,1.4-0.8,1.9-0.8c0.6,0,1.1,0.2,1.5,0.5l34.5,24.6
c4.4,3.1,10.2,3.3,14.8,0.6c13-7.8,27.1-13.8,41.8-17.6c5.1-1.4,9-5.6,9.9-10.8l7.2-42.3c0.2-1.3,1.3-2.2,2.6-2.2h42.1
c1.3,0,2.4,0.9,2.6,2.2l7,41.7c0.9,5.3,4.8,9.6,10,10.9c15.1,3.8,29.5,9.7,42.9,17.6c4.6,2.7,10.3,2.5,14.7-0.6l34.5-24.8
c0.5-0.3,1-0.5,1.5-0.5c0.4,0,1.2,0.1,1.9,0.8l29.8,29.8c0.9,0.9,1,2.3,0.3,3.4l-24.7,34.7c-3.1,4.3-3.3,10.1-0.6,14.7
c7.8,13.1,13.6,27.2,17.4,41.9c1.3,5.2,5.6,9.1,10.8,9.9l42,7.1c1.3,0.2,2.2,1.3,2.2,2.6v42.1H451.9z"/>
<path d="M239.4,136.001c-57,0-103.3,46.3-103.3,103.3s46.3,103.3,103.3,103.3s103.3-46.3,103.3-103.3S296.4,136.001,239.4,136.001
z M239.4,315.601c-42.1,0-76.3-34.2-76.3-76.3s34.2-76.3,76.3-76.3s76.3,34.2,76.3,76.3S281.5,315.601,239.4,315.601z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@ -0,0 +1,197 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'ui/default_locations.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
# V3.0 | 08/22/22
class Ui_defaultLocationDiag(object):
def setupUi(self, defaultLocationDiag):
defaultLocationDiag.setObjectName("defaultLocationDiag")
defaultLocationDiag.setWindowModality(QtCore.Qt.NonModal)
defaultLocationDiag.resize(954, 525)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(defaultLocationDiag.sizePolicy().hasHeightForWidth())
defaultLocationDiag.setSizePolicy(sizePolicy)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("ui/extract.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
defaultLocationDiag.setWindowIcon(icon)
self.gridLayout_2 = QtWidgets.QGridLayout(defaultLocationDiag)
self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(defaultLocationDiag)
font = QtGui.QFont()
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 2)
self.label_2 = QtWidgets.QLabel(defaultLocationDiag)
self.label_2.setWordWrap(True)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 4)
self.label_3 = QtWidgets.QLabel(defaultLocationDiag)
self.label_3.setWordWrap(True)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 2, 0, 1, 4)
self.label_4 = QtWidgets.QLabel(defaultLocationDiag)
font = QtGui.QFont()
font.setItalic(True)
self.label_4.setFont(font)
self.label_4.setWordWrap(True)
self.label_4.setObjectName("label_4")
self.gridLayout.addWidget(self.label_4, 3, 0, 1, 4)
self.label_5 = QtWidgets.QLabel(defaultLocationDiag)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.gridLayout.addWidget(self.label_5, 4, 0, 1, 1)
spacerItem = QtWidgets.QSpacerItem(588, 13, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem, 4, 1, 1, 2)
self.label_6 = QtWidgets.QLabel(defaultLocationDiag)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.label_6.setFont(font)
self.label_6.setObjectName("label_6")
self.gridLayout.addWidget(self.label_6, 4, 3, 1, 1)
self.ach_B = QtWidgets.QPushButton(defaultLocationDiag)
self.ach_B.setObjectName("ach_B")
self.gridLayout.addWidget(self.ach_B, 5, 0, 1, 1)
self.ach_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.ach_LE.setMinimumSize(QtCore.QSize(581, 0))
self.ach_LE.setObjectName("ach_LE")
self.gridLayout.addWidget(self.ach_LE, 5, 1, 1, 1)
self.ach_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.ach_FN.setObjectName("ach_FN")
self.gridLayout.addWidget(self.ach_FN, 5, 2, 1, 2)
self.disp_B = QtWidgets.QPushButton(defaultLocationDiag)
self.disp_B.setObjectName("disp_B")
self.gridLayout.addWidget(self.disp_B, 6, 0, 1, 1)
self.disp_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.disp_LE.setMinimumSize(QtCore.QSize(581, 0))
self.disp_LE.setObjectName("disp_LE")
self.gridLayout.addWidget(self.disp_LE, 6, 1, 1, 1)
self.disp_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.disp_FN.setObjectName("disp_FN")
self.gridLayout.addWidget(self.disp_FN, 6, 2, 1, 2)
self.gl_B = QtWidgets.QPushButton(defaultLocationDiag)
self.gl_B.setObjectName("gl_B")
self.gridLayout.addWidget(self.gl_B, 7, 0, 1, 1)
self.gl_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.gl_LE.setMinimumSize(QtCore.QSize(581, 0))
self.gl_LE.setObjectName("gl_LE")
self.gridLayout.addWidget(self.gl_LE, 7, 1, 1, 1)
self.gl_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.gl_FN.setObjectName("gl_FN")
self.gridLayout.addWidget(self.gl_FN, 7, 2, 1, 2)
self.lb_B = QtWidgets.QPushButton(defaultLocationDiag)
self.lb_B.setObjectName("lb_B")
self.gridLayout.addWidget(self.lb_B, 8, 0, 1, 1)
self.lb_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.lb_LE.setMinimumSize(QtCore.QSize(581, 0))
self.lb_LE.setObjectName("lb_LE")
self.gridLayout.addWidget(self.lb_LE, 8, 1, 1, 1)
self.lb_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.lb_FN.setObjectName("lb_FN")
self.gridLayout.addWidget(self.lb_FN, 8, 2, 1, 2)
self.minv_B = QtWidgets.QPushButton(defaultLocationDiag)
self.minv_B.setObjectName("minv_B")
self.gridLayout.addWidget(self.minv_B, 9, 0, 1, 1)
self.minv_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.minv_LE.setMinimumSize(QtCore.QSize(581, 0))
self.minv_LE.setObjectName("minv_LE")
self.gridLayout.addWidget(self.minv_LE, 9, 1, 1, 1)
self.minv_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.minv_FN.setObjectName("minv_FN")
self.gridLayout.addWidget(self.minv_FN, 9, 2, 1, 2)
self.niv_B = QtWidgets.QPushButton(defaultLocationDiag)
self.niv_B.setObjectName("niv_B")
self.gridLayout.addWidget(self.niv_B, 10, 0, 1, 1)
self.niv_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.niv_LE.setMinimumSize(QtCore.QSize(581, 0))
self.niv_LE.setObjectName("niv_LE")
self.gridLayout.addWidget(self.niv_LE, 10, 1, 1, 1)
self.niv_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.niv_FN.setObjectName("niv_FN")
self.gridLayout.addWidget(self.niv_FN, 10, 2, 1, 2)
self.ren_B = QtWidgets.QPushButton(defaultLocationDiag)
self.ren_B.setObjectName("ren_B")
self.gridLayout.addWidget(self.ren_B, 11, 0, 1, 1)
self.ren_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.ren_LE.setMinimumSize(QtCore.QSize(581, 0))
self.ren_LE.setObjectName("ren_LE")
self.gridLayout.addWidget(self.ren_LE, 11, 1, 1, 1)
self.ren_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.ren_FN.setObjectName("ren_FN")
self.gridLayout.addWidget(self.ren_FN, 11, 2, 1, 2)
self.pymt_B = QtWidgets.QPushButton(defaultLocationDiag)
self.pymt_B.setObjectName("pymt_B")
self.gridLayout.addWidget(self.pymt_B, 12, 0, 1, 1)
self.pymt_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.pymt_LE.setMinimumSize(QtCore.QSize(581, 0))
self.pymt_LE.setObjectName("pymt_LE")
self.gridLayout.addWidget(self.pymt_LE, 12, 1, 1, 1)
self.pymt_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.pymt_FN.setObjectName("pymt_FN")
self.gridLayout.addWidget(self.pymt_FN, 12, 2, 1, 2)
self.uap_B = QtWidgets.QPushButton(defaultLocationDiag)
self.uap_B.setObjectName("uap_B")
self.gridLayout.addWidget(self.uap_B, 13, 0, 1, 1)
self.uap_LE = QtWidgets.QLineEdit(defaultLocationDiag)
self.uap_LE.setMinimumSize(QtCore.QSize(581, 0))
self.uap_LE.setObjectName("uap_LE")
self.gridLayout.addWidget(self.uap_LE, 13, 1, 1, 1)
self.uap_FN = QtWidgets.QLineEdit(defaultLocationDiag)
self.uap_FN.setObjectName("uap_FN")
self.gridLayout.addWidget(self.uap_FN, 13, 2, 1, 2)
self.optionBBox = QtWidgets.QDialogButtonBox(defaultLocationDiag)
self.optionBBox.setOrientation(QtCore.Qt.Horizontal)
self.optionBBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Save)
self.optionBBox.setObjectName("optionBBox")
self.gridLayout.addWidget(self.optionBBox, 14, 3, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
self.retranslateUi(defaultLocationDiag)
self.optionBBox.accepted.connect(defaultLocationDiag.accept) # type: ignore
self.optionBBox.rejected.connect(defaultLocationDiag.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(defaultLocationDiag)
def retranslateUi(self, defaultLocationDiag):
_translate = QtCore.QCoreApplication.translate
defaultLocationDiag.setWindowTitle(_translate("defaultLocationDiag", "Default locations"))
self.label.setText(_translate("defaultLocationDiag", "Default File Locations:"))
self.label_2.setText(_translate("defaultLocationDiag", "Here you can determine which folders will be automatically be opened for each report type. You can even specify which file should be defaulted to."))
self.label_3.setText(_translate("defaultLocationDiag", "Use the following inline formaters to specify dates that will be automatically filled with the current date when running the program:"))
self.label_4.setText(_translate("defaultLocationDiag", "Day of Month {d} | Month of Year {m} | Year {y} | Note that using multiple characters equates to representing with that number of digits so: {dd} == 07 or {mm} == 02 or {yy} == 22 or {yyyy} == 2022"))
self.label_5.setText(_translate("defaultLocationDiag", "Folder Path"))
self.label_6.setToolTip(_translate("defaultLocationDiag", "<html><head/><body><p>Default file name to look for. Don\'t foreget the file type (.xlsx)</p></body></html>"))
self.label_6.setText(_translate("defaultLocationDiag", "File Name"))
self.ach_B.setText(_translate("defaultLocationDiag", "Edit ACH"))
self.disp_B.setText(_translate("defaultLocationDiag", "Edit Dispostition"))
self.gl_B.setWhatsThis(_translate("defaultLocationDiag", "<html><head/><body><p>Gain Loss</p></body></html>"))
self.gl_B.setText(_translate("defaultLocationDiag", "Edit Gain Loss"))
self.lb_B.setText(_translate("defaultLocationDiag", "Edit Lock Box"))
self.minv_B.setWhatsThis(_translate("defaultLocationDiag", "<html><head/><body><p>Good for Manual Invoicing</p></body></html>"))
self.minv_B.setText(_translate("defaultLocationDiag", "Edit Manual Invoice"))
self.niv_B.setWhatsThis(_translate("defaultLocationDiag", "<html><head/><body><p>Good for: Net Investment reports (loan and after)</p></body></html>"))
self.niv_B.setText(_translate("defaultLocationDiag", "Edit Net Inv"))
self.ren_B.setWhatsThis(_translate("defaultLocationDiag", "<html><head/><body><p>Renewal Net Investment Trial Balance</p></body></html>"))
self.ren_B.setText(_translate("defaultLocationDiag", "Edit Renewl NIV"))
self.pymt_B.setWhatsThis(_translate("defaultLocationDiag", "<html><head/><body><p>Payment transactions:</p><p>- Wires, VMCC, PBP. EPAY, Returned Check</p></body></html>"))
self.pymt_B.setText(_translate("defaultLocationDiag", "Edit Payments"))
self.uap_B.setWhatsThis(_translate("defaultLocationDiag", "<html><head/><body><p>Unapplied</p></body></html>"))
self.uap_B.setText(_translate("defaultLocationDiag", "Edit Unaplied"))

@ -0,0 +1,410 @@
from ILE_MainWindow import Ui_MainWindow
from defLocs_Window2 import Ui_defaultLocationDiag
import sys
import os
import pandas as pd
import json
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow, QPushButton
from datetime import datetime as dt
import ILExtract as ilx
print("Starting GUI... will anything else print?")
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, *args, obj=None, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi(self)
self.setAcceptDrops(True)
self.inputFile = ""
self.outputFile = ""
self.inputCustomized = False
with open("settings.json") as s:
self.settings = json.loads(s.read())
self.curReportType = "ach"
self.extract_function = ilx.ach
cbs = self.copyButton.objectName()
self.report_type_change()
# Actions
self.inputFileButton.clicked.connect(self.getfile)
self.outputFileButton.clicked.connect(self.setOutput)
self.processReportButton.clicked.connect(self.process_selection)
self.copyButton.clicked.connect(self.to_clipboard)
self.reportTypeCB.currentTextChanged.connect(self.report_type_change)
self.openFolderButton.clicked.connect(lambda: self.openWithDefaultApp(self.outputFile.removesuffix(self.outputFile.split('/')[-1])))
self.openExcelButton.clicked.connect(lambda: self.openWithDefaultApp(self.outputFile))
self.action_Default_Locations.triggered.connect(self.df)
self.inputFilePreview.setText("Drag & Drop Input file here!")
def set_input(self, ifile):
with open(ifile, errors="replace") as inF:
txt = inF.read()
self.inputFilePreview.setText(txt)
self.inputFileLE.setText(ifile)
self.inputFile = ifile
# This gets the actual file name
inFileEnd = ifile.split('/')[-1]
# Takes just the root of the input file
outputRoot = self.inputFile.removesuffix(inFileEnd)
# Automatically sets output to be in the same file as input, with a naming scheme
# The report type selected in the combo box will dictate the naming
if self.reportTypeCB.currentText() == "Minv_C":
self.outputFile = f"{outputRoot}{self.reportTypeCB.currentText()}_{dt.now().strftime('%Y%m%d_%H%M')}.txt"
else:
self.outputFile = f"{outputRoot}{self.reportTypeCB.currentText().replace('/','')}_{dt.now().strftime('%Y%m%d_%H%M')}.xlsx"
self.outputFileLE.setText(self.outputFile)
self.inputCustomized = True
self.openExcelButton.setEnabled(False)
self.copyButton.setEnabled(False)
self.openFolderButton.setEnabled(True)
# Enables the process button
self.check_ready_to_process()
def getfile(self):
inFile = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file')
if inFile[0] == '':
return 1
else:
self.set_input(inFile[0])
def df(self):
dlg = defLocWindow(self)
dlg.exec()
with open("settings.json") as s:
self.settings = json.loads(s.read())
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.accept()
else:
event.ignore()
def dropEvent(self, event):
file = [u.toLocalFile() for u in event.mimeData().urls()][0]
print(file)
self.set_input(file)
def setOutput(self):
# This allows the user to change the automatic naming and location
outFile = QtWidgets.QFileDialog.getSaveFileName(self, "Output file name")
if outFile[0] == '': return ''
if self.reportTypeCB.currentText() == "Minv_C":
self.outputFileLE.setText(f"{outFile[0]}__{dt.now().strftime('%Y%m%d_%H_%M')}.txt")
else:
self.outputFileLE.setText(f"{outFile[0]}__{dt.now().strftime('%Y%m%d_%H_%M')}.xlsx")
print(f"Output: {outFile}")
self.outputFile = f"{outFile[0]}__{dt.now().strftime('%Y%m%d_%H_%M')}.xlsx"
self.check_ready_to_process()
def check_ready_to_process(self):
# Makes sure there is an input and output selected before allowing processing
rtp = True if ((self.inputFile != "") & (self.outputFile != "")) else False
if rtp :
self.processReportButton.setEnabled(True)
if self.outputFile == "":
self.openFolderButton.setEnabled(False)
def process_selection(self):
print("Processing selection...")
self.inputFilePreview.setText("Processing file...")
# If only this was python 3.10 and we could use switch statments
# but this should get the job done
#try:
# This is where the actual processing happens
# We create an ILReport object and pass in the nessecary information
print(self.inputFile)
print(self.outputFile)
dataframe = ilx.ILReport(
location= self.inputFile,
extraction_function=self.extract_function,
output_location=self.outputFile,
).process()
# The text preview box can have trouble loading the larger dataframes so
# they are trimmed to 500 so that the users can see if anything got messed up
smallDF = dataframe.iloc[0:500,:]
self.inputFilePreview.setText(smallDF.to_html(index=False))
#except:
# error = QtWidgets.QMessageBox()
# error.setWindowTitle('Error Processing File!')
# error.setText(f"Unable to process {self.inputFile}!\nPlease check input file!")
self.openExcelButton.setEnabled(True)
self.copyButton.setEnabled(True)
self.checked_for_saved()
self.openFolderButton.setEnabled(True)
self.inputCustomized = False
def preview_report(self):
df = pd.read_excel(self.outputFile)
self.inputFilePreview.setText(df.to_html())
def to_clipboard(self):
df = pd.read_excel(self.outputFile)
df.to_clipboard(excel=True)
def openFolder(self):
outputRoot = self.outputFile.removesuffix(self.outputFile.split('/')[-1])
os.startfile(outputRoot)
def openWithDefaultApp(self, item):
print(item)
outputRoot = self.outputFile.removesuffix(self.outputFile.split('/')[-1])
os.startfile(item)
def checked_for_saved(self):
if self.settings["defaultLocations"][self.curReportType]["dir"] == '':
self.settings["defaultLocations"][self.curReportType]["dir"] = ('/').join(self.inputFile.split('/')[:-1])
with open('settings.json', 'w') as s:
json.dump(self.settings, s)
def report_type_change(self):
# Adjust the report type according to the combo box
# This will be used in settings the the extract function and determining file locations
self.processReportButton.setEnabled(False)
if self.reportTypeCB.currentText() == "ACH":
self.curReportType = "ach"
self.extract_function = ilx.ach
elif self.reportTypeCB.currentText() == "Disposition":
self.curReportType = "disp"
self.extract_function = ilx.disposition
elif self.reportTypeCB.currentText() == "Gain Loss":
self.curReportType = "gl"
self.extract_function = ilx.gainloss
elif self.reportTypeCB.currentText() == "Lock Box":
self.curReportType = "lb"
self.extract_function = ilx.lockbox
elif self.reportTypeCB.currentText() == "Minv_C":
self.curReportType = "minv"
self.extract_function = ilx.minv
elif self.reportTypeCB.currentText() == "Net Inv. Loans":
self.curReportType = "niv"
self.extract_function = ilx.net_invest_trial_balance
elif self.reportTypeCB.currentText() == "NI Renewal":
self.curReportType = "ren"
self.extract_function = ilx.renewal_net_invest_trial_balance
elif self.reportTypeCB.currentText() == "NIV After":
self.curReportType = "niv"
self.extract_function = ilx.net_invest_trial_balance
elif self.reportTypeCB.currentText() == "PBP / Epay":
self.curReportType = "pymt"
self.extract_function = ilx.payment_transactions
elif self.reportTypeCB.currentText() == "Unapplied":
self.curReportType = "uap"
self.extract_function = ilx.unapplied
elif self.reportTypeCB.currentText() == "Past Due":
self.curReportType = "pastdue"
self.extract_function = ilx.pastdue
elif self.reportTypeCB.currentText() == "VMCC":
self.curReportType = "pymt"
self.extract_function = ilx.payment_transactions
elif self.reportTypeCB.currentText() == "Wires":
self.curReportType = "pymt"
self.extract_function = ilx.payment_transactions
elif self.reportTypeCB.currentText() == "Returned Check":
self.curReportType = "pymt"
self.extract_function = ilx.payment_transactions
inputRoot = self.settings["defaultLocations"][self.curReportType]["dir"]\
.replace("{dd}",dt.now().strftime('%d'))\
.replace("{mm}",dt.now().strftime('%m'))\
.replace("{yyyy}",dt.now().strftime('%Y')).replace("{yy}",dt.now().strftime('%y'))
inputFile = self.settings["defaultLocations"][self.curReportType]["fn"]\
.replace("{dd}",dt.now().strftime('%d'))\
.replace("{mm}",dt.now().strftime('%m'))\
.replace("{yyyy}",dt.now().strftime('%Y')).replace("{yy}",dt.now().strftime('%y'))
self.inputFile = f"{inputRoot}/{inputFile}" if (inputFile != '') else inputRoot
self.inputFileLE.setText(self.inputFile)
# Automatically sets output to be in the same file as input, with a naming scheme
# The report type selected in the combo box will dictate the naming
if self.inputFile == "":
outputroot = ('/').join(self.inputFileLE.text().split('/')[:-1])
else:
outputroot = inputRoot + '/'
if self.curReportType == "minv":
self.outputFile = f"{outputroot}{self.reportTypeCB.currentText()}_{dt.now().strftime('%Y%m%d_%H%M')}.txt"
else:
self.outputFile = f"{outputroot}{self.reportTypeCB.currentText().replace('/','')}_{dt.now().strftime('%Y%m%d_%H%M')}.xlsx"
self.outputFileLE.setText(self.outputFile)
self.openExcelButton.setEnabled(False)
self.copyButton.setEnabled(False)
self.openFolderButton.setEnabled(True)
print(self.inputFile)
print(self.outputFile)
self.check_ready_to_process()
class defLocWindow(QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
# Create an instance of the GUI
self.ui = Ui_defaultLocationDiag()
# Run the .setupUi() method to show the GUI
self.ui.setupUi(self)
with open("settings.json") as s:
self.settings = json.loads(s.read())
self.load_user_settings()
# Add dest folder buttons
# Lambdas are used to create anon functions to that they don't execute at init
self.ui.ach_B.clicked.connect(lambda : self.add_defloc(self.ui.ach_B.objectName(), True))
self.ui.disp_B.clicked.connect(lambda : self.add_defloc(self.ui.disp_B.objectName(), True))
self.ui.gl_B.clicked.connect(lambda : self.add_defloc(self.ui.gl_B.objectName(), True))
self.ui.lb_B.clicked.connect(lambda : self.add_defloc(self.ui.lb_B.objectName(), True))
self.ui.minv_B.clicked.connect(lambda : self.add_defloc(self.ui.minv_B.objectName(), True))
self.ui.niv_B.clicked.connect(lambda : self.add_defloc(self.ui.niv_B.objectName(), True))
self.ui.ren_B.clicked.connect(lambda : self.add_defloc(self.ui.ren_B.objectName(), True))
self.ui.pymt_B.clicked.connect(lambda : self.add_defloc(self.ui.pymt_B.objectName(), True))
self.ui.uap_B.clicked.connect(lambda : self.add_defloc(self.ui.uap_B.objectName(), True))
# Text Changes
self.ui.ach_LE.textChanged.connect(lambda : self.add_defloc(self.ui.ach_B.objectName(), False))
self.ui.disp_LE.textChanged.connect(lambda : self.add_defloc(self.ui.disp_B.objectName(), False))
self.ui.gl_LE.textChanged.connect(lambda : self.add_defloc(self.ui.gl_B.objectName(), False))
self.ui.lb_LE.textChanged.connect(lambda : self.add_defloc(self.ui.lb_B.objectName(), False))
self.ui.minv_LE.textChanged.connect(lambda : self.add_defloc(self.ui.minv_B.objectName(), False))
self.ui.niv_LE.textChanged.connect(lambda : self.add_defloc(self.ui.niv_B.objectName(), False))
self.ui.ren_LE.textChanged.connect(lambda : self.add_defloc(self.ui.ren_B.objectName(), False))
self.ui.pymt_LE.textChanged.connect(lambda : self.add_defloc(self.ui.pymt_B.objectName(), False))
self.ui.uap_LE.textChanged.connect(lambda : self.add_defloc(self.ui.uap_B.objectName(), False))
self.ui.ach_FN.textChanged.connect(lambda : self.add_fn(self.ui.ach_FN.objectName()))
self.ui.disp_FN.textChanged.connect(lambda : self.add_fn(self.ui.disp_FN.objectName()))
self.ui.gl_FN.textChanged.connect(lambda : self.add_fn(self.ui.gl_FN.objectName()))
self.ui.lb_FN.textChanged.connect(lambda : self.add_fn(self.ui.lb_FN.objectName()))
self.ui.minv_FN.textChanged.connect(lambda : self.add_fn(self.ui.minv_FN.objectName()))
self.ui.niv_FN.textChanged.connect(lambda : self.add_fn(self.ui.niv_FN.objectName()))
self.ui.ren_FN.textChanged.connect(lambda : self.add_fn(self.ui.ren_FN.objectName()))
self.ui.pymt_FN.textChanged.connect(lambda : self.add_fn(self.ui.pymt_FN.objectName()))
self.ui.uap_FN.textChanged.connect(lambda : self.add_fn(self.ui.uap_FN.objectName()))
self.ui.optionBBox.accepted.connect(self.save_changes)
def add_defloc(self, button_name, use_filebrowser: bool):
folder = QtWidgets.QFileDialog.getExistingDirectory() if use_filebrowser else None
if folder == '':
use_filebrowser = False
report_type = button_name.split('_')[0]
if report_type == "ach":
if use_filebrowser:
self.ui.ach_LE.setText(folder)
else:
folder = self.ui.ach_LE.text()
elif report_type == "disp":
if use_filebrowser:
self.ui.disp_LE.setText(folder)
else:
folder = self.ui.disp_LE.text()
elif report_type == "gl":
if use_filebrowser:
self.ui.gl_LE.setText(folder)
else:
folder = self.ui.gl_LE.text()
elif report_type == "lb":
if use_filebrowser:
self.ui.lb_LE.setText(folder)
else:
folder = self.ui.lb_LE.text()
elif report_type == "minv":
if use_filebrowser:
self.ui.minv_LE.setText(folder)
else:
folder = self.ui.minv_LE.text()
elif report_type == "niv":
if use_filebrowser:
self.ui.niv_LE.setText(folder)
else:
folder = self.ui.niv_LE.text()
elif report_type == "ren":
if use_filebrowser:
self.ui.ren_LE.setText(folder)
else:
folder = self.ui.ren_LE.text()
elif report_type == "pymt":
if use_filebrowser:
self.ui.pymt_LE.setText(folder)
else:
folder = self.ui.pymt_LE.text()
elif report_type == "uap":
if use_filebrowser:
self.ui.uap_LE.setText(folder)
else:
folder = self.ui.uap_LE.text()
if folder != "":
self.settings["defaultLocations"][report_type]["dir"] = folder
def chg_folder(self, button_name):
report_type = button_name.split('_')[0]
if report_type == "ach":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.ach_FN.text()
elif report_type == "disp":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.disp_FN.text()
elif report_type == "gl":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.gl_FN.text()
elif report_type == "lb":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.lb_FN.text()
elif report_type == "minv":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.minv_FN.text()
elif report_type == "niv":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.niv_FN.text()
elif report_type == "ren":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.ren_FN.text()
elif report_type == "pymt":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.pymt_FN.text()
elif report_type == "uap":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.uap_FN.text()
def add_fn(self, button_name):
report_type = button_name.split('_')[0]
if report_type == "ach":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.ach_FN.text()
elif report_type == "disp":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.disp_FN.text()
elif report_type == "gl":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.gl_FN.text()
elif report_type == "lb":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.lb_FN.text()
elif report_type == "minv":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.minv_FN.text()
elif report_type == "niv":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.niv_FN.text()
elif report_type == "ren":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.ren_FN.text()
elif report_type == "pymt":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.pymt_FN.text()
elif report_type == "uap":
self.settings["defaultLocations"][report_type]["fn"] = self.ui.uap_FN.text()
def load_user_settings(self):
self.ui.ach_LE.setText(self.settings["defaultLocations"]["ach"]["dir"])
self.ui.ach_FN.setText(self.settings["defaultLocations"]["ach"]["fn"])
self.ui.disp_LE.setText(self.settings["defaultLocations"]["disp"]["dir"])
self.ui.disp_FN.setText(self.settings["defaultLocations"]["disp"]["fn"])
self.ui.gl_LE.setText(self.settings["defaultLocations"]["gl"]["dir"])
self.ui.gl_FN.setText(self.settings["defaultLocations"]["gl"]["fn"])
self.ui.lb_LE.setText(self.settings["defaultLocations"]["lb"]["dir"])
self.ui.lb_FN.setText(self.settings["defaultLocations"]["lb"]["fn"])
self.ui.minv_LE.setText(self.settings["defaultLocations"]["minv"]["dir"])
self.ui.minv_FN.setText(self.settings["defaultLocations"]["minv"]["fn"])
self.ui.niv_LE.setText(self.settings["defaultLocations"]["niv"]["dir"])
self.ui.niv_FN.setText(self.settings["defaultLocations"]["niv"]["fn"])
self.ui.ren_LE.setText(self.settings["defaultLocations"]["ren"]["dir"])
self.ui.ren_FN.setText(self.settings["defaultLocations"]["ren"]["fn"])
self.ui.pymt_LE.setText(self.settings["defaultLocations"]["pymt"]["dir"])
self.ui.pymt_FN.setText(self.settings["defaultLocations"]["pymt"]["fn"])
self.ui.uap_LE.setText(self.settings["defaultLocations"]["uap"]["dir"])
self.ui.uap_FN.setText(self.settings["defaultLocations"]["uap"]["fn"])
def save_changes(self):
print(self.settings)
with open('settings.json', 'w') as s:
json.dump(self.settings, s)
print(self.settings)
app = QtWidgets.QApplication(sys.argv)
app.setStyle("Fusion")
window = MainWindow()
window.setWindowTitle("IL Extract")
window.show()
app.exec()

@ -0,0 +1 @@
{"firstRun": true, "startMaxed": false, "defaultLocations": {"ach": {"dir": "", "fn": "", "custom": false}, "disp": {"dir": "", "fn": "", "custom": false}, "gl": {"dir": "", "fn": "", "custom": false}, "lb": {"dir": "", "fn": "", "custom": false}, "minv": {"dir": "", "fn": "", "custom": false}, "niv": {"dir": "C:/Users/GLott/OneDrive - LEAF Commercial Capital/Documents/0 In Progess/Monarch/TestFolder", "fn": "", "custom": false}, "ren": {"dir": "", "fn": "", "custom": false}, "pymt": {"dir": "", "fn": "", "custom": false}, "uap": {"dir": "", "fn": "", "custom": false}, "pastdue": {"dir": "", "fn": "", "custom": false}}}

@ -0,0 +1,341 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>889</width>
<height>634</height>
</rect>
</property>
<property name="windowTitle">
<string>IL Extract</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>extract.svg</normaloff>extract.svg</iconset>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item alignment="Qt::AlignLeft">
<widget class="QLabel" name="reportTypeL">
<property name="font">
<font>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Infolease Report Type:</string>
</property>
<property name="buddy">
<cstring>reportTypeCB</cstring>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="reportTypeCB">
<item>
<property name="text">
<string>ACH</string>
</property>
</item>
<item>
<property name="text">
<string>Disposition</string>
</property>
</item>
<item>
<property name="text">
<string>Gain Loss</string>
</property>
</item>
<item>
<property name="text">
<string>Lock Box</string>
</property>
</item>
<item>
<property name="text">
<string>Minv_C</string>
</property>
</item>
<item>
<property name="text">
<string>Net Inv. Loans</string>
</property>
</item>
<item>
<property name="text">
<string>NI Renewal</string>
</property>
</item>
<item>
<property name="text">
<string>NIV After</string>
</property>
</item>
<item>
<property name="text">
<string>PBP / Epay</string>
</property>
</item>
<item>
<property name="text">
<string>Returned Check</string>
</property>
</item>
<item>
<property name="text">
<string>Unapplied</string>
</property>
</item>
<item>
<property name="text">
<string>VMCC</string>
</property>
</item>
<item>
<property name="text">
<string>Wires</string>
</property>
</item>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QVBoxLayout" name="fileSettingsBox">
<item>
<layout class="QHBoxLayout" name="inputFileBox">
<item>
<widget class="QPushButton" name="inputFileButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>250</width>
<height>55</height>
</size>
</property>
<property name="text">
<string>Select &amp;InfoLease Report</string>
</property>
<property name="icon">
<iconset>
<normaloff>folder.svg</normaloff>folder.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="inputFileLE">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>No file selected</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="outFileLocation">
<item>
<widget class="QPushButton" name="outputFileButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>250</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>250</width>
<height>55</height>
</size>
</property>
<property name="text">
<string>Select &amp;Report Output Location</string>
</property>
<property name="icon">
<iconset>
<normaloff>folder.svg</normaloff>folder.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="outputFileLE">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>No location selected</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="processReportButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Process Report</string>
</property>
<property name="icon">
<iconset>
<normaloff>process.svg</normaloff>process.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="openReportButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Copy to Clipboard</string>
</property>
<property name="icon">
<iconset>
<normaloff>copy.svg</normaloff>copy.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="openReportButton_2">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Open Folder</string>
</property>
<property name="icon">
<iconset>
<normaloff>folder.svg</normaloff>folder.svg</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="openReportButton_3">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Open File</string>
</property>
<property name="icon">
<iconset>
<normaloff>excel.svg</normaloff>excel.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="QTextBrowser" name="inputFilePreview"/>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>889</width>
<height>24</height>
</rect>
</property>
<widget class="QMenu" name="menu_Settings">
<property name="title">
<string>&amp;Settings</string>
</property>
<property name="icon">
<iconset>
<normaloff>settings.svg</normaloff>settings.svg</iconset>
</property>
<widget class="QMenu" name="menuStart_Maximized">
<property name="title">
<string>Start &amp;Maximized</string>
</property>
<property name="icon">
<iconset>
<normaloff>maximize.svg</normaloff>maximize.svg</iconset>
</property>
<addaction name="action_True"/>
<addaction name="action_False"/>
</widget>
<addaction name="action_Default_Locations"/>
<addaction name="menuStart_Maximized"/>
</widget>
<addaction name="menu_Settings"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="action_Default_Locations">
<property name="icon">
<iconset>
<normaloff>fileSearch.svg</normaloff>fileSearch.svg</iconset>
</property>
<property name="text">
<string>&amp;Default Locations</string>
</property>
</action>
<action name="action_True">
<property name="text">
<string>&amp;True</string>
</property>
</action>
<action name="action_False">
<property name="icon">
<iconset>
<normaloff>checkedCircle.svg</normaloff>checkedCircle.svg</iconset>
</property>
<property name="text">
<string>&amp;False</string>
</property>
</action>
</widget>
<tabstops>
<tabstop>reportTypeCB</tabstop>
<tabstop>inputFileButton</tabstop>
<tabstop>outputFileButton</tabstop>
<tabstop>processReportButton</tabstop>
<tabstop>openReportButton</tabstop>
<tabstop>inputFileLE</tabstop>
<tabstop>outputFileLE</tabstop>
<tabstop>inputFilePreview</tabstop>
</tabstops>
<resources/>
<connections/>
</ui>

@ -0,0 +1,373 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>defaultLocationDiag</class>
<widget class="QDialog" name="defaultLocationDiag">
<property name="windowModality">
<enum>Qt::NonModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>954</width>
<height>525</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Default locations</string>
</property>
<property name="windowIcon">
<iconset>
<normaloff>extract.svg</normaloff>extract.svg</iconset>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="font">
<font>
<pointsize>14</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Default File Locations:</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Here you can determine which folders will be automatically be opened for each report type. You can even specify which file should be defaulted to.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0" colspan="4">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Use the following inline formaters to specify dates that will be automatically filled with the current date when running the program:</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="0" colspan="4">
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<italic>true</italic>
</font>
</property>
<property name="text">
<string>Day of Month {d} | Month of Year {m} | Year {y} | Note that using multiple characters equates to representing with that number of digits so: {dd} == 07 or {mm} == 02 or {yy} == 22 or {yyyy} == 2022</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Folder Path</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>588</width>
<height>13</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="3">
<widget class="QLabel" name="label_6">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Default file name to look for. Don't foreget the file type (.xlsx)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>File Name</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QPushButton" name="ach_B">
<property name="text">
<string>Edit ACH</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="ach_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="5" column="2" colspan="2">
<widget class="QLineEdit" name="ach_FN"/>
</item>
<item row="6" column="0">
<widget class="QPushButton" name="disp_B">
<property name="text">
<string>Edit Dispostition</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="disp_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="6" column="2" colspan="2">
<widget class="QLineEdit" name="disp_FN"/>
</item>
<item row="7" column="0">
<widget class="QPushButton" name="gl_B">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Gain Loss&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit Gain Loss</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="gl_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="7" column="2" colspan="2">
<widget class="QLineEdit" name="gl_FN"/>
</item>
<item row="8" column="0">
<widget class="QPushButton" name="lb_B">
<property name="text">
<string>Edit Lock Box</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLineEdit" name="lb_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="8" column="2" colspan="2">
<widget class="QLineEdit" name="lb_FN"/>
</item>
<item row="9" column="0">
<widget class="QPushButton" name="minv_B">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Good for Manual Invoicing&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit Manual Invoice</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLineEdit" name="minv_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="9" column="2" colspan="2">
<widget class="QLineEdit" name="minv_FN"/>
</item>
<item row="10" column="0">
<widget class="QPushButton" name="niv_B">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Good for: Net Investment reports (loan and after)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit Net Inv</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QLineEdit" name="niv_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="10" column="2" colspan="2">
<widget class="QLineEdit" name="niv_FN"/>
</item>
<item row="11" column="0">
<widget class="QPushButton" name="ren_B">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Renewal Net Investment Trial Balance&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit Renewl NIV</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QLineEdit" name="ren_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="11" column="2" colspan="2">
<widget class="QLineEdit" name="ren_FN"/>
</item>
<item row="12" column="0">
<widget class="QPushButton" name="pymt_B">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Payment transactions:&lt;/p&gt;&lt;p&gt;- Wires, VMCC, PBP. EPAY, Returned Check&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit Payments</string>
</property>
</widget>
</item>
<item row="12" column="1">
<widget class="QLineEdit" name="pymt_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="12" column="2" colspan="2">
<widget class="QLineEdit" name="pymt_FN"/>
</item>
<item row="13" column="0">
<widget class="QPushButton" name="uap_B">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Unapplied&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Edit Unaplied</string>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QLineEdit" name="uap_LE">
<property name="minimumSize">
<size>
<width>581</width>
<height>0</height>
</size>
</property>
</widget>
</item>
<item row="13" column="2" colspan="2">
<widget class="QLineEdit" name="uap_FN"/>
</item>
<item row="14" column="3">
<widget class="QDialogButtonBox" name="optionBBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>optionBBox</sender>
<signal>accepted()</signal>
<receiver>defaultLocationDiag</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>optionBBox</sender>
<signal>rejected()</signal>
<receiver>defaultLocationDiag</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

@ -0,0 +1,16 @@
Add in consolidated reports and MoM summaries
[] Each month will have a consolidated report. This report is an extended version of the typical outputs, each with their own tab. As reports are processed, they will be appended to that months
consolidated report
[] There will also be a yearly summary tab. This will also have a tab for each payment type, but it will have a total amount for the month, and a count
~ This could be a ribbon button for them to 'summerize year'
~ Could Skip already summed months
[] Add a GUI for setting these report locations
~ Just set the YEAR folder and have the scheme matched
Optional
[] Add default save locations for the report types based on the file structure shared by Blad
~ Would have to deal with overriding defaults
[] Add new report types to defLoc window

@ -0,0 +1,65 @@
Metadata-Version: 2.1
Name: PyQt5
Version: 5.15.7
Requires-Python: >=3.7
Summary: Python bindings for the Qt cross platform application toolkit
Home-Page: https://www.riverbankcomputing.com/software/pyqt/
Author: Riverbank Computing Limited
Author-Email: info@riverbankcomputing.com
License: GPL v3
Requires-Dist: PyQt5-sip (>=12.11, <13)
Requires-Dist: PyQt5-Qt5 (>=5.15.0)
PyQt5 - Comprehensive Python Bindings for Qt v5
===============================================
Qt is set of cross-platform C++ libraries that implement high-level APIs for
accessing many aspects of modern desktop and mobile systems. These include
location and positioning services, multimedia, NFC and Bluetooth connectivity,
a Chromium based web browser, as well as traditional UI development.
PyQt5 is a comprehensive set of Python bindings for Qt v5. It is implemented
as more than 35 extension modules and enables Python to be used as an
alternative application development language to C++ on all supported platforms
including iOS and Android.
PyQt5 may also be embedded in C++ based applications to allow users of those
applications to configure or enhance the functionality of those applications.
Author
------
PyQt5 is copyright (c) Riverbank Computing Limited. Its homepage is
https://www.riverbankcomputing.com/software/pyqt/.
Support may be obtained from the PyQt mailing list at
https://www.riverbankcomputing.com/mailman/listinfo/pyqt/.
License
-------
PyQt5 is released under the GPL v3 license and under a commercial license that
allows for the development of proprietary applications.
Documentation
-------------
The documentation for the latest release can be found
`here <https://www.riverbankcomputing.com/static/Docs/PyQt5/>`__.
Installation
------------
The GPL version of PyQt5 can be installed from PyPI::
pip install PyQt5
``pip`` will also build and install the bindings from the sdist package but
Qt's ``qmake`` tool must be on ``PATH``.
The ``sip-install`` tool will also install the bindings from the sdist package
but will allow you to configure many aspects of the installation.

@ -0,0 +1,988 @@
../../Scripts/pylupdate5.exe,sha256=vaUMhZFpu4uZKQTGe7IXx7Qb4oD7OVM2T25aZrL78Xk,106382
../../Scripts/pyrcc5.exe,sha256=SlUWJ_CtBKTJgmq4P9lZ3YzC_x37lhdKNxcZnHsdwTY,106378
../../Scripts/pyuic5.exe,sha256=_IzDFm8jW0gPsdm-aGVkwRkM3oLiPQjTL4ORz6SFRL0,106377
PyQt5-5.15.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
PyQt5-5.15.7.dist-info/METADATA,sha256=M-S2TvZAFdjOXJ8Gst5lElSWPh6B4ASjZosjGWvgmDQ,2176
PyQt5-5.15.7.dist-info/RECORD,,
PyQt5-5.15.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
PyQt5-5.15.7.dist-info/WHEEL,sha256=SjgHfdmYYjtK5R1U591pZ13RLo5V4uk6p0Iu-Hx4LLQ,98
PyQt5-5.15.7.dist-info/entry_points.txt,sha256=Qif0K5dtSx55Jy85ruKNbDlFdMdcekmMavb6lQz49g0,116
PyQt5/QAxContainer.pyd,sha256=OEIMIdeHoIzS9zYKqkObZF9t36o5qKQ6E9S8HuXiV2A,275456
PyQt5/QAxContainer.pyi,sha256=T0nFtKXaiFQ23Pkqdn10ldvCakTflsuOGVN0c0cpghs,4806
PyQt5/Qt.pyd,sha256=B8ZRUD5pt-yBO5jbKxtos8xpuRYv-9-twsFjFb7YzoU,12288
PyQt5/Qt5/qsci/api/python/PyQt5.api,sha256=AhLMODzWgTTsDwsVwShDeGEtogIY0h0HK5Rkg1ZCTE8,1792081
PyQt5/QtBluetooth.pyd,sha256=MT1hDMsfY9cWZh9KTmydvB35_M0c3du5nVP7wBYurJ8,342016
PyQt5/QtBluetooth.pyi,sha256=PyGM0h0ofjhI_mVcDFfiRukhGxv6wkywIoNL5GTcP6g,85872
PyQt5/QtCore.pyd,sha256=mJVV6R_vkRdXfNoz4HyjDyP2751Cv8_c-qdgwDSMu8M,2442752
PyQt5/QtCore.pyi,sha256=saqNEDOq03_0jUa3ux67BmribS9QMU8atAxzyIrditY,483460
PyQt5/QtDBus.pyd,sha256=wVz7IPgRo6cnug1HLTQfqvbl_q5v1kYWC6jsLXPLYE8,175104
PyQt5/QtDBus.pyi,sha256=-SUCN2fCBQeqdc5QTR8Uu_cto8Q_eNaXDrr5s5Z_m3c,27287
PyQt5/QtDesigner.pyd,sha256=T86J2XnKqMZ--1xv0SlQwzJvU-rkLF1LW92F5_UP78w,309248
PyQt5/QtDesigner.pyi,sha256=q0rvrzlD3vXDENhVPRgRRZFGHH-BALKyyCRyG9pNXvI,24052
PyQt5/QtGui.pyd,sha256=z8EIJentBIeTUANtEyhZ-tTYYaVQb63yP-Pz9mt4BlE,2455040
PyQt5/QtGui.pyi,sha256=bLWbVFAAPNboB34Yl1NdfBpQ5VKNFie7Nb5J2MMO3Rg,471157
PyQt5/QtHelp.pyd,sha256=KVO41l7GLam913zCv1ojofuZcrCy5CVV8-wIPHsbBpM,197120
PyQt5/QtHelp.pyi,sha256=Q4jPP03-DEH5HKWt8mKMuqrq-QOIHiqQS4YfdMVpaJQ,13472
PyQt5/QtLocation.pyd,sha256=VvR97VvhbmQZOE8Nlbd1FpTovoLAV7EySM5dVLL9vKI,440832
PyQt5/QtLocation.pyi,sha256=3goJ9v5bca9bT5QhLtp8eaR0FQaO3cS_4gWu3G-B14c,68208
PyQt5/QtMultimedia.pyd,sha256=O2cC05ccPSFXfrd85Gm2vo-jWxTp10JNOrTyD1pesdI,910336
PyQt5/QtMultimedia.pyi,sha256=H8q2mixxn2zXlETkEdOk3JCTf-UPKVIkosHVSRI7Gio,126953
PyQt5/QtMultimediaWidgets.pyd,sha256=57-N7W_KVR293qu2ECZZC_kM2O0BmyfidjjXFFfkSBs,141312
PyQt5/QtMultimediaWidgets.pyi,sha256=gWgsm4D_ONQy4wDJVv03Xe7laEpX5UTnxFX85rmIOZ4,5938
PyQt5/QtNetwork.pyd,sha256=Q91_eARVULmX2id7UbnRxgIGtPDgoPH8OGMMG_ssXn4,697856
PyQt5/QtNetwork.pyi,sha256=z6rjXQ2trObOsxz02aV6kf9LQAYlRC3DwVYpf2tbsW8,119584
PyQt5/QtNfc.pyd,sha256=4KYkqVuTSwXZgADpagFU4uiw4HVgGpf4TiX7tpKFNkM,142336
PyQt5/QtNfc.pyi,sha256=imgi2G-DWZKhYUnO4LdVGkP2D5_XpRekkY5X5oMYLyM,23048
PyQt5/QtOpenGL.pyd,sha256=bvJ_8hWxoqSdz2zvGDyFLGDh7PS3Zuo_FeZrwyWp-OU,124416
PyQt5/QtOpenGL.pyi,sha256=ekegg8eu78FVdeWiisR9D7WwMjs2VfJMBECx4Irns8s,18648
PyQt5/QtPositioning.pyd,sha256=oW-CjfyFiMQ-tHaK_O6QQBH_H2gUnIYip_ohPp6Tzlg,181760
PyQt5/QtPositioning.pyi,sha256=XAXJGboeVUkW7FK82nt63VAo0Vl1xDPVMhzTbg8wN7s,28128
PyQt5/QtPrintSupport.pyd,sha256=RBl-7RRgQsbdgrLyFUQzFqrYpnQiFNJJdgba36hL5uc,253952
PyQt5/QtPrintSupport.pyi,sha256=ZOdkDde-Oino6kfEfVVl6x67twfU7SrW90zuzWg5_nI,21743
PyQt5/QtQml.pyd,sha256=UA12EOQiyS8qTeqZPNKtHRkvKj870zN8jPrAI8w5mf4,466432
PyQt5/QtQml.pyi,sha256=o1QfY6bscw_XogmroiHF_Z_HdloXYEDPkyHI3-AjAIc,31169
PyQt5/QtQuick.pyd,sha256=zD9kWEjYsi4yGLxkJAvQB00_OIHNe05qZjWDqfe8wko,921088
PyQt5/QtQuick.pyi,sha256=_H5RybSAcyI0Rc9AdbysCgVob4wFmO7Zxm9Tv27vJII,90692
PyQt5/QtQuick3D.pyd,sha256=m3obJzpSZ6fRFhXI6kXt2Wq7FaYH1_VPaUuQfS6Uz8g,38400
PyQt5/QtQuick3D.pyi,sha256=nDPQfHEnCDB-pkesF7ufEzKlN-dbWz3u4gE2nm3ezss,5574
PyQt5/QtQuickWidgets.pyd,sha256=N7Tb2TD6DihlZOkfJp5uaiRaBByBNjSEIbZcD8TeS-k,61952
PyQt5/QtQuickWidgets.pyi,sha256=oYUbkLScxS5xMEuwfZyjEOznKiBASqaLiBEBGIuCZKY,4812
PyQt5/QtRemoteObjects.pyd,sha256=sQHNqpd_16JaxmSpso_BsSHeNQPtFYzj7ZjCkVcgMI4,94208
PyQt5/QtRemoteObjects.pyi,sha256=LFtUgXWc4STtWJDcaocBccxjUAWm-bNQMnG5Z1j3Egk,9511
PyQt5/QtSensors.pyd,sha256=lfV_SZtq1oivx09QROvTe8rD2lqhTLEA-hphW7l_b7w,252416
PyQt5/QtSensors.pyi,sha256=2e0QuA4csE-fYmlkAsJH4Hy1rRfzxHwws9tr3Oq-ql8,21372
PyQt5/QtSerialPort.pyd,sha256=mDj2QM2VdAF5jg2GRxMTPRfq8Eo5H1nL0IA8vkwjM9k,74240
PyQt5/QtSerialPort.pyi,sha256=RzMTWBDyjos-qwbjdwUYe0AO2UJ4ilN5XqBtyxOJjSo,13082
PyQt5/QtSql.pyd,sha256=BM_ey2ub5Nf0iurgbLLgSAIUPWoI7d7Bsrqt43ZnBMM,311296
PyQt5/QtSql.pyi,sha256=pgkA0yA1CDyhZ_eg508rXnK5qTVKuRDRlpZULwLFhiU,30833
PyQt5/QtSvg.pyd,sha256=TKQW8p9sYg_6y4fo7et5a09eqcBJyTDr5YNrevv5HuI,116224
PyQt5/QtSvg.pyi,sha256=NEvB3_2XHpCTlzGy5PYHWKP8YNLQ-NoxlzVapI67Ybg,6285
PyQt5/QtTest.pyd,sha256=rtp-0HSYjq5BHzO5n3Y-QkymWUulrJi2S_i-vLTUNRM,84480
PyQt5/QtTest.pyi,sha256=EcKM22HrsTYOBgtZ_GqgNwxm6VSlt2NVoZMRN5c_Ctc,11453
PyQt5/QtTextToSpeech.pyd,sha256=1GTp8jQ5OTU0U7v3JYUCKxViPO7gUrxkrzLsX90VJtw,40448
PyQt5/QtTextToSpeech.pyi,sha256=pit9U-448SnRhADNQ4ZwNi_-o1lwgeV0LISu-gHrqsw,3977
PyQt5/QtWebChannel.pyd,sha256=zhvSUyqiOXO2zeeAtTNhv_trfCk4GpiuQdGaQQbCPe0,37376
PyQt5/QtWebChannel.pyi,sha256=EvoSp4VnEbDEwz2lUR1R7gHU1xudNmkAN48qqD82O0A,2577
PyQt5/QtWebSockets.pyd,sha256=z_QUrNB6rhFX1EIAqfLPFXYOcjBWoBzMdkDtm-rs1FI,77312
PyQt5/QtWebSockets.pyi,sha256=XcBVr2W2pAUZdHDoJNlEk5rQC2iWDJWRx3j887Ec6KU,10656
PyQt5/QtWidgets.pyd,sha256=45SPFX-2ElggGAxuSi7hpS6TPI7GStiODHgKyIrbuoY,5036032
PyQt5/QtWidgets.pyi,sha256=1dQvz221RpERm0ncozyMFvlQQLOdmbE3UVJOrjphTIE,555335
PyQt5/QtWinExtras.pyd,sha256=Z-ASEudu3piG-v2oIUfn10XHSu2xsI7lSBG8SapKTLQ,110080
PyQt5/QtWinExtras.pyi,sha256=Mz0UV6R92WDh67oCluDMjhmwb_xu4ffLHvrBbk9ag_Y,13703
PyQt5/QtXml.pyd,sha256=miXM76UuYW-q0t7kVp4xp01-f0VJAhfd3DJRKI53NA0,221184
PyQt5/QtXml.pyi,sha256=HPtXqLCDrhSuDKEOu1N1n42lZytY0TCXEb7DcM8UWn0,28851
PyQt5/QtXmlPatterns.pyd,sha256=oOZhrRW5PwwatyUAld7YqJKdSn63ZIN3E5EXCTPysTU,135168
PyQt5/QtXmlPatterns.pyi,sha256=vW9x5JQXiqmnUe9-r_Tfv8Oe6K309Bq63bGPafQPZCQ,15891
PyQt5/_QOpenGLFunctions_2_0.pyd,sha256=S5Z6U1nG8gBs0Q_U6w6MMgcpu17B0gAdv3zOuloJ6Zg,241152
PyQt5/_QOpenGLFunctions_2_1.pyd,sha256=FmuPojptCQPI-NZhOQ_8VM0TpYeI2j9MFUg1Jk1UmNU,242688
PyQt5/_QOpenGLFunctions_4_1_Core.pyd,sha256=4jKYjliVHLQYI0TEBASYv5wEilashDx6xs53qQX5-CE,129024
PyQt5/__init__.py,sha256=OLOV6qzayk2yK-yj21dQ1UPHp9TPWPe7-pF4Ug-B2HA,1691
PyQt5/__pycache__/__init__.cpython-39.pyc,,
PyQt5/__pycache__/pylupdate_main.cpython-39.pyc,,
PyQt5/__pycache__/pyrcc_main.cpython-39.pyc,,
PyQt5/bindings/QAxContainer/QAxContainer.toml,sha256=8WscXP3c0Y37L0t30xCDwgGv-G2_GwpzkLzl8D-0Y7s,187
PyQt5/bindings/QAxContainer/QAxContainermod.sip,sha256=zQJlaEa_RDN0UHD-9m0qsKoqNvvAmAEi4xD4M4zBfXY,2010
PyQt5/bindings/QAxContainer/qaxbase.sip,sha256=4nkTM9Vd5qwSe8IAvmhsPKcImrcFvLwP-87yv-uFjy8,5361
PyQt5/bindings/QAxContainer/qaxobject.sip,sha256=r-S9x3v0cBinxaJYkPU9xgaJr0AwMSoUg_615mGO2eo,1951
PyQt5/bindings/QAxContainer/qaxwidget.sip,sha256=OoRTDG6Ku5LDuXLedA1SoCImCqDsBBvIplPbHebuZvI,1786
PyQt5/bindings/QtBluetooth/QtBluetooth.toml,sha256=gfyMBCYkE1PelCewgGtkAoBPtCgbgMN3u8-YQJtAVno,186
PyQt5/bindings/QtBluetooth/QtBluetoothmod.sip,sha256=kYb56zErH9VUsCXwO7T8mycFsnNwlPWaPixq1JIxHis,2883
PyQt5/bindings/QtBluetooth/qbluetooth.sip,sha256=aVm0BE_APSvKikdG7HyaMWaqyGld0jEEltygLTNNtno,1881
PyQt5/bindings/QtBluetooth/qbluetoothaddress.sip,sha256=XzYjklCCMDNFWKshB9gSu7aMFzIy6osA5bw3ajj9A9U,1611
PyQt5/bindings/QtBluetooth/qbluetoothdevicediscoveryagent.sip,sha256=AcZR_YcZ_Kg51wkGbvYP403O7e3poueS8OpIo5_CV4M,3372
PyQt5/bindings/QtBluetooth/qbluetoothdeviceinfo.sip,sha256=PGwoprEURBJDobW4kZK6ruBvjIsUjkqmSJU3uLjmybQ,7390
PyQt5/bindings/QtBluetooth/qbluetoothhostinfo.sip,sha256=nh3cXIpVS2xTXrcF0eoYsHVSZ5-PfuaR2DkorCbFzzI,1558
PyQt5/bindings/QtBluetooth/qbluetoothlocaldevice.sip,sha256=16P6Hk19wLUvDzB64v2Ol248-Mk31SOYx8Us8O15_fQ,2999
PyQt5/bindings/QtBluetooth/qbluetoothserver.sip,sha256=3jHGjSof1tqy0lib0NPPs6w353SHVpZWfYrq_jnsySU,3721
PyQt5/bindings/QtBluetooth/qbluetoothservicediscoveryagent.sip,sha256=wvHTUJYYBmUT5lkyVO75tkVBhVgy4lKuTzQ6Q89fYKQ,2622
PyQt5/bindings/QtBluetooth/qbluetoothserviceinfo.sip,sha256=u7oZT6QMWhLKLBJqiCt0jFgwUf_WoyE37Xy8VVFN9bM,3412
PyQt5/bindings/QtBluetooth/qbluetoothsocket.sip,sha256=al9AA6kCkwszxlgNVVbX5y4PMQH5iLEnd-yOnlpkaGY,5191
PyQt5/bindings/QtBluetooth/qbluetoothtransfermanager.sip,sha256=ie-xuoZw1S37d3ePswwa3cEiRSivFe7WK3zlRRmVXPY,1432
PyQt5/bindings/QtBluetooth/qbluetoothtransferreply.sip,sha256=vCEXSjLNXCa7IttKSrSh3XwXFtbacSqD1XXhb9Ii_ro,2276
PyQt5/bindings/QtBluetooth/qbluetoothtransferrequest.sip,sha256=km8PsfwWoVkGwuzTIyPnG_nmTbma-0xLtKfTmvrBwdU,1886
PyQt5/bindings/QtBluetooth/qbluetoothuuid.sip,sha256=3v50010wbJfylSzPOKpmiOFRzA1rDcGcSChyWL6glNM,12247
PyQt5/bindings/QtBluetooth/qlowenergyadvertisingdata.sip,sha256=CotwweKvKeKYFraNYkDGusHTRrRZUoRF71-rEFdzBmk,2400
PyQt5/bindings/QtBluetooth/qlowenergyadvertisingparameters.sip,sha256=5688EpPYp101LfMyjD7FpqljoQaduljhh1TgZ8MvxMY,2930
PyQt5/bindings/QtBluetooth/qlowenergycharacteristic.sip,sha256=ErZJ-yQgWhzElv-Lh3L86lJgqmkbMG-ICZnzoHwV5Bs,2224
PyQt5/bindings/QtBluetooth/qlowenergycharacteristicdata.sip,sha256=CutxHQyLXSK4nDpkYJpWlquk2k1s9UpkrgdQlYcJstw,2533
PyQt5/bindings/QtBluetooth/qlowenergyconnectionparameters.sip,sha256=tl7hzpzDLrifmb9n9tYvoLVmBLaxizOIraiJFPxi_bw,1894
PyQt5/bindings/QtBluetooth/qlowenergycontroller.sip,sha256=-Z7fnzLkD12RKNtjmlrJLnSLbUZxNEAwJ59yldWVj_s,4733
PyQt5/bindings/QtBluetooth/qlowenergydescriptor.sip,sha256=FTIidcr38a3LyAzGL4gs56UTB42iPJbhU8YN3h1mTYE,1572
PyQt5/bindings/QtBluetooth/qlowenergydescriptordata.sip,sha256=DIs4AyUB_hpbpg5Z8rdAR04yYP_O3g1Kvj72KbGnHC0,2257
PyQt5/bindings/QtBluetooth/qlowenergyservice.sip,sha256=w_xoguF4LVOhuif5iN1DT1SCEh0ye-QJuAInldcTPqs,3855
PyQt5/bindings/QtBluetooth/qlowenergyservicedata.sip,sha256=A-rOPLO9SgZdB_Iz2zyE2IciijRUVDpiBYlgiXTiPGg,2263
PyQt5/bindings/QtBluetooth/qpybluetooth_qlist.sip,sha256=vxD7ehzVoi3D_g7tkZSJWo_ubu9RZXQGuaUOuiKnbIo,5611
PyQt5/bindings/QtBluetooth/qpybluetooth_quint128.sip,sha256=xzgXhM2ZpD6kueEuqBDmyE6_Ch_SKN7Cd8ByGfDLvgE,3041
PyQt5/bindings/QtCore/QtCore.toml,sha256=qtKHQaCD0vtVikrTnp13msrk6nEr3YGlPnGTFJnVLT4,181
PyQt5/bindings/QtCore/QtCoremod.sip,sha256=bFVbAHNdJrxk4VGRyZZg6t40YQKvDmD806QNiKNF_WQ,7142
PyQt5/bindings/QtCore/pyqt-gpl.sip5,sha256=8Wcb4_ynBJpHsFcqQKmX0N_NBHUWfZDQTd4Q2ggPB98,22
PyQt5/bindings/QtCore/qabstractanimation.sip,sha256=f8pyDOtKBWc1bXMp4_naDbqd3LYDG2iFrFX4w39EZAk,2639
PyQt5/bindings/QtCore/qabstracteventdispatcher.sip,sha256=kpQk2kwOlPdAbwWt26KGE7-MWCMFRhuUI_1hiqYp6Cw,2911
PyQt5/bindings/QtCore/qabstractitemmodel.sip,sha256=nI8KfUj-uUGaQ1N72tQFXGYhGunZxicKhbg-WbFpWBY,14579
PyQt5/bindings/QtCore/qabstractnativeeventfilter.sip,sha256=h7CWgPmmzFKiYToqixWqv6jq9865Mz-ve7w5qYjRkms,1362
PyQt5/bindings/QtCore/qabstractproxymodel.sip,sha256=qOggxle5ITKBwDN5d0_et53Gp3Vo1oO08JGEEu3i1No,3733
PyQt5/bindings/QtCore/qabstractstate.sip,sha256=vkwmtZts8SXKRK6cf2WbgX7whewkKSHhnaUgVGp9UTw,1542
PyQt5/bindings/QtCore/qabstracttransition.sip,sha256=S8xD4RFzlDZ8U4m1BP5tRAafA-qnAvEVL1-CRuII9ig,3602
PyQt5/bindings/QtCore/qanimationgroup.sip,sha256=Li547ywDTxkDnuweljC9F1IbEKPMVS27zhHIOJPZzQw,1692
PyQt5/bindings/QtCore/qbasictimer.sip,sha256=YKe-DFcH4z-cNDqdRGPOgHTWLWBj8JHEItDVrmeN4RY,1417
PyQt5/bindings/QtCore/qbitarray.sip,sha256=sYS1BQRLP-NyIlEMZKSWx1fTnMghlNp0oiPgBoahBwU,3106
PyQt5/bindings/QtCore/qbuffer.sip,sha256=woW2Ruex-74l6F6qv_Fh9TgLLxf1Mb2hjDFQcdu2x9I,3098
PyQt5/bindings/QtCore/qbytearray.sip,sha256=402RaXUUFEfxJ2pLSpEpf7KrHmDEkmnjJy0fYvl-rJk,17417
PyQt5/bindings/QtCore/qbytearraymatcher.sip,sha256=E4kVTiUZaOkQ6olxmf1ytDBS_484saaY64djTdYMX48,1387
PyQt5/bindings/QtCore/qcalendar.sip,sha256=hX_1L3Bcj0t7RKCZPalku4Qc1zRPo3X-q2ZRqFSll6o,3571
PyQt5/bindings/QtCore/qcborcommon.sip,sha256=vfTqtQcyBf7TixpPbvnKTV18JgiKowmQFwQWmeSCuZU,2490
PyQt5/bindings/QtCore/qcborstream.sip,sha256=lrJucm2sbcXrYsz6VI6aAStkApgt99rVQn6dfaJCm84,6687
PyQt5/bindings/QtCore/qchar.sip,sha256=io6lkR7FCKK-xf_z4l94C3EqxXEnOykLdS8wknxa8nk,1637
PyQt5/bindings/QtCore/qcollator.sip,sha256=XoJy37momm_G7muPteOla8W0bDxQanAQ5t0UlVIKaK4,2126
PyQt5/bindings/QtCore/qcommandlineoption.sip,sha256=i4ZMQyJQN_XTF_tAhckd9GpVylDxXMUDkg_MJ90qEFg,3090
PyQt5/bindings/QtCore/qcommandlineparser.sip,sha256=h8k_IQnW1swOmsmTRHFf5Q5hlSlsIK1sPoJ3JD0lYYE,3024
PyQt5/bindings/QtCore/qconcatenatetablesproxymodel.sip,sha256=FfShqMbBpPy3UWQSOcJSqT6ePvmK2uvCWp-efHEMHNk,4272
PyQt5/bindings/QtCore/qcoreapplication.sip,sha256=cEkH3_S0cCLRRyWqOrurYD3u02uvbRm4CXgsYQipeb4,11457
PyQt5/bindings/QtCore/qcoreevent.sip,sha256=-IzPxQAtoSCA1FPZorw2vncOfcMz77BeTq3AaDnHR30,6702
PyQt5/bindings/QtCore/qcryptographichash.sip,sha256=dzgFiZT2j6nveaMYMGWlrA2ABQOIGfeUjN5Fk0fOmmE,2127
PyQt5/bindings/QtCore/qdatastream.sip,sha256=xptAaSK-xEKUdzVVnkeMYfhJe4MiSlifYA1sOl5D-D0,10188
PyQt5/bindings/QtCore/qdatetime.sip,sha256=Xf4Z9qrsir6b7KLcGN8_2B80y9r4xVB6RSGk8E3h00Q,20512
PyQt5/bindings/QtCore/qdeadlinetimer.sip,sha256=FN0tz8xk49vudqKmYVJ9_1LqfegNBxUiD3qe0X2PgOA,3123
PyQt5/bindings/QtCore/qdir.sip,sha256=gv76aqFLf_6f-4w8FBtA-5WuJ5O7ZcPGIIrmK6apCPo,6420
PyQt5/bindings/QtCore/qdiriterator.sip,sha256=0l8cLh-yH7_ZskKbwkZeti2S0OtY5GeLKnxUOhASTlo,2109
PyQt5/bindings/QtCore/qeasingcurve.sip,sha256=H7kqH0r8ri5UXf0RYOw0_G1qUzu-88wQ_nUiiZ6OxeY,6957
PyQt5/bindings/QtCore/qelapsedtimer.sip,sha256=VRTGsPQZIDfj2bmSjE8Oc_CjfnNtmT9Z8JIRRRaz_RU,1886
PyQt5/bindings/QtCore/qeventloop.sip,sha256=09Lvo6mleJ39CZgFc4FEABmkWboujlv6W2PHWg2k3Jc,2586
PyQt5/bindings/QtCore/qeventtransition.sip,sha256=hGvPuJkPQLWTdISqUpoH3UWQBFWTkjE2zL0stjOn1YQ,1628
PyQt5/bindings/QtCore/qfile.sip,sha256=v8L_tHoFeeymdGe583p6XfRJxkOYf-ivQs28PXJutWI,3033
PyQt5/bindings/QtCore/qfiledevice.sip,sha256=AXjfbP8TEJITEjMzzfbk_9Hy0V4lpiq_Q-NCNq0l46Q,5888
PyQt5/bindings/QtCore/qfileinfo.sip,sha256=ZlNXuWPQORb1mrib8AG3WWKjDV6qkN5fW6Ig7MbFZ6w,3521
PyQt5/bindings/QtCore/qfileselector.sip,sha256=G4hMmdEZJaXckWh_iUcuzjZtuS6iExjv-Vh7c4N-KUo,1430
PyQt5/bindings/QtCore/qfilesystemwatcher.sip,sha256=aYFg_xrjT4MIwXQvEpMXdtTI0to-vlq-lbfHU58Wiyk,1640
PyQt5/bindings/QtCore/qfinalstate.sip,sha256=v6wILEySPh7xNQG7VID9DM_dW7eCEVJfGdOv2sY5Hmc,1290
PyQt5/bindings/QtCore/qglobal.sip,sha256=-WoFuQySOs9LFwqjOvUuv6CMj6dIAwqgF27rmuwhUMs,7262
PyQt5/bindings/QtCore/qhistorystate.sip,sha256=iSccfbA4CBmVr5BEJR8yveHnVl8B923DrH2fGqaIcH8,2091
PyQt5/bindings/QtCore/qidentityproxymodel.sip,sha256=n9Lpm5fJnFQB11h8yYtrm6MGcrP9yn4u27Oa3EhG8lU,3318
PyQt5/bindings/QtCore/qiodevice.sip,sha256=NpmagieSpQRT_uql6hdrvU5dNtbyRqpExWcenGaIn5c,10032
PyQt5/bindings/QtCore/qitemselectionmodel.sip,sha256=RO_8a485etZ5LsD5rB_VCtfB86jmQwJ68CWgjs2w-38,10238
PyQt5/bindings/QtCore/qjsonarray.sip,sha256=_oB4YBUJFkJWmd4imx1kz81rZD74wZ9XckHObBrG-k4,3486
PyQt5/bindings/QtCore/qjsondocument.sip,sha256=JAKovtEYAjgbhkqavNZDRaikd0hV3fU5qb-HaOGhZKU,3585
PyQt5/bindings/QtCore/qjsonobject.sip,sha256=hCg2SIRwOexHR3D3ysC5Zu679pbZDferenheb6XSpFY,3636
PyQt5/bindings/QtCore/qjsonvalue.sip,sha256=CfmRPgIbapcdgAUuf20TRzcjBSd6QEhNzNb4tQYgKaA,3204
PyQt5/bindings/QtCore/qlibrary.sip,sha256=i7IbGI3mD-MXxtucGpjtXh7bGtdkidO18zDi3JuNuFY,2581
PyQt5/bindings/QtCore/qlibraryinfo.sip,sha256=NmMp4Jvq1cxa2-drytKczPPylzCV0Owyyr6OBIrVQk8,1767
PyQt5/bindings/QtCore/qline.sip,sha256=9jkI9irIn6Lx6fi2XAIrWMRUdMiYiueWyVGozgKS8CQ,6678
PyQt5/bindings/QtCore/qlocale.sip,sha256=aPAMolRWjIQprlV-swYFwtmozUfmTi-efAo_EDMPdUo,34464
PyQt5/bindings/QtCore/qlockfile.sip,sha256=oFU03flt3fJSTLXuivf6cwChs1LM6WQcAXEUuA12NXE,1722
PyQt5/bindings/QtCore/qlogging.sip,sha256=ktFi6gUCbtqrL5OEZGDiTyyOXLymzLZL-AtA4B3pKCU,6174
PyQt5/bindings/QtCore/qloggingcategory.sip,sha256=mcmHhgC9klbGFAMzlNoB4KomfqB-CCEz-kZWL14Zv2U,1726
PyQt5/bindings/QtCore/qmargins.sip,sha256=OUJY7BLsk3FV9Fz2zSuBid4w00jiIgSI9aEnW9pVeRI,5292
PyQt5/bindings/QtCore/qmessageauthenticationcode.sip,sha256=fX_mHmqn9hbB_ggzvIaBou3DKtI1-DJX0_nFN-768YE,1696
PyQt5/bindings/QtCore/qmetaobject.sip,sha256=vjXnufWc9cC_Ddf9dQFfVeJQd-hAN9JC6gMsBr7E8jg,8172
PyQt5/bindings/QtCore/qmetatype.sip,sha256=q1VHaggH_ZJhXcVAPn8DSZD1YVyZrLhiACMap-2AHOs,4007
PyQt5/bindings/QtCore/qmimedata.sip,sha256=E7lNKvx_TICeFCJBxVnQb4lwEjFB2vUWw9yjkDGAwzY,2062
PyQt5/bindings/QtCore/qmimedatabase.sip,sha256=Gi6h6Tg7xiAPCFM5wVshqLM17fI8sQuybY8XuZ4tjlA,2136
PyQt5/bindings/QtCore/qmimetype.sip,sha256=Eh41cQqv4R5Roa2ECUW3tNhb7HeisshB8pj-q1pYWBI,1887
PyQt5/bindings/QtCore/qmutex.sip,sha256=tRPXzp4y2n0_7DDFdjdrGDxeDH6yRRiUxzNIqe9K53I,2368
PyQt5/bindings/QtCore/qnamespace.sip,sha256=10vzBXC7uqIqG3By_gFgZ2dWIfzcxRrM7rn-7Std6rs,39318
PyQt5/bindings/QtCore/qnumeric.sip,sha256=cGcENAXAJ3LnSSm8KTqhC2QzR1WMY22KbgPE9EXbw1w,1207
PyQt5/bindings/QtCore/qobject.sip,sha256=Cj0D6W9nhEXRAgldYL_oH84K550HIHORaNIuNVns1TU,25277
PyQt5/bindings/QtCore/qobjectcleanuphandler.sip,sha256=vETmoIrqn693ctRmX1y3C3GiKWFZ910wzazDI4bbkYU,1284
PyQt5/bindings/QtCore/qobjectdefs.sip,sha256=JITSzwmIYgsKmlP3g_J_KfCQb2tNhfX9vrewFfE3N84,7914
PyQt5/bindings/QtCore/qoperatingsystemversion.sip,sha256=ZAQExR0ptk8qX7zCuU8JJZjiYhxc-036QKTwkQL61PU,3616
PyQt5/bindings/QtCore/qparallelanimationgroup.sip,sha256=Mmkp4DnDPiHlkFYtc4jmAy5ggd-HZcRVa88QnIiuFNI,1541
PyQt5/bindings/QtCore/qpauseanimation.sip,sha256=EXYqhYljqU8ugctU1Fbl5IYFssvj0l28A7eijgmIZas,1412
PyQt5/bindings/QtCore/qpluginloader.sip,sha256=gEGwTGeaEaAay3RBFF1as70ByIURpKfgh3HjLK07zXE,1598
PyQt5/bindings/QtCore/qpoint.sip,sha256=2Lk5vncwhA4NrxFxE2A9Vm0ZfgyMkPqDSIHzpxJb0Lk,6649
PyQt5/bindings/QtCore/qprocess.sip,sha256=_-89c9P77FT5LiZ1-C8ynCEWiViXDbGKqj6t_x3JYzA,7926
PyQt5/bindings/QtCore/qpropertyanimation.sip,sha256=e1hn-ti3BKL4JZzm_gvxDVwEmcfjkG3MqEQJkkU-Bm4,1737
PyQt5/bindings/QtCore/qpycore_qhash.sip,sha256=Qpn3PjCslEks7cSCmew0w4TNKGBWZrh5e5uxZ527C8c,11683
PyQt5/bindings/QtCore/qpycore_qlist.sip,sha256=faR8hByvsbKEzADYzMsW3grXEN4VE9D0Ya9wrNPNkOQ,21174
PyQt5/bindings/QtCore/qpycore_qmap.sip,sha256=qB65Mmh0nITdRjeXMqvPTDAWjoETUX_wJlpK-hroxoA,8550
PyQt5/bindings/QtCore/qpycore_qpair.sip,sha256=swoE_8rAN2Zgx6L-dGswOQmIqabOps078xCykG4Jbk4,8489
PyQt5/bindings/QtCore/qpycore_qset.sip,sha256=qf5RwF60MbRQByaI5k_6gjMcHko6b65VVIjGtAkhC1k,5661
PyQt5/bindings/QtCore/qpycore_qvariantmap.sip,sha256=-hicjWWRxyshVa7wXfV0SAo6gwpCYkLhl72tniwbIck,1425
PyQt5/bindings/QtCore/qpycore_qvector.sip,sha256=2Vityo7jsXLp9BOchEXVqSrRIB3nMEUzDsTHMjuUqHg,14035
PyQt5/bindings/QtCore/qpycore_virtual_error_handler.sip,sha256=i4pwWQ61YHHev1znWw2GWtMP0PaSU3_k4V-GQz6AR3o,999
PyQt5/bindings/QtCore/qrandom.sip,sha256=rIFFERXBlKzRwXV52XcMc7mvIZsZuc166tBPyql0Ssw,2000
PyQt5/bindings/QtCore/qreadwritelock.sip,sha256=c5ItErcSn9cfj2Cojp4e8LpsE3TVO7Pma0zJieWIj-0,2810
PyQt5/bindings/QtCore/qrect.sip,sha256=euGhkEqbtmxIPPF1vTb5MA7vrI1C47u-yzN83Qekams,11291
PyQt5/bindings/QtCore/qregexp.sip,sha256=7zjlVrfpn2Nge0gXTuIOF1NU5EnZ8aNDxGAu8F-QPao,5016
PyQt5/bindings/QtCore/qregularexpression.sip,sha256=C3Kmx0IImjhmcojg0qnZghvkd2a9uo6cd9L0p7oxuAw,7379
PyQt5/bindings/QtCore/qresource.sip,sha256=-d1apFDkdvVk1UzPCSnLTaVM8Wd1n9N9hKS_99PB9DA,2909
PyQt5/bindings/QtCore/qrunnable.sip,sha256=KRJI4WbE0ULd0M4Xc9yYgFmdw4onZh8Ltu2EoApwkIQ,1747
PyQt5/bindings/QtCore/qsavefile.sip,sha256=TAweZF4Ym85UxNV1froiVq9vX5jIXfSfApRou3yPyYk,1725
PyQt5/bindings/QtCore/qsemaphore.sip,sha256=z8Un1jDcXQX1JKhUmUsWmVGeuqKRSXvYjJ3H8xknQtM,1704
PyQt5/bindings/QtCore/qsequentialanimationgroup.sip,sha256=Cv7GW5cXbnvAqxr0S021kolT1Evt5kbuGkNjc667R1g,1766
PyQt5/bindings/QtCore/qsettings.sip,sha256=5Od4FiTS7iPal2rB77cL_0TePlc8cICo6Do4HujaFzg,4238
PyQt5/bindings/QtCore/qsharedmemory.sip,sha256=ggRsEt0goPNC2DiWJt_mfkyH3eeEI4HR-Nt6TuMUHLQ,2395
PyQt5/bindings/QtCore/qsignalmapper.sip,sha256=VFWbJRrP_3X6UNTLXiQcAjXFgb-qQKDOrVkQ4yYgaXI,2186
PyQt5/bindings/QtCore/qsignaltransition.sip,sha256=kPoHrcZF_kasNIQxhXZzoIsESdd38RfcQWbp4tjFCI4,2235
PyQt5/bindings/QtCore/qsize.sip,sha256=sBkUtawmQtn2pbs8UQR75W9Wvzlcs855XxjrgJn5CZk,6215
PyQt5/bindings/QtCore/qsocketnotifier.sip,sha256=uYXh_vqJHINBGtOijg_orZBJ623S6c4QBX3fzWMlvTw,1531
PyQt5/bindings/QtCore/qsortfilterproxymodel.sip,sha256=MZueecD-EWhGkL1jP2db_3eKWhX3w962bCn6SKj3Zj4,6342
PyQt5/bindings/QtCore/qstandardpaths.sip,sha256=slpAa_lrSFOUDfv9E9kggnwN20718zkt0drcHcvpwAY,2942
PyQt5/bindings/QtCore/qstate.sip,sha256=gBVVuu8gHIhUVTyjh8EJJXbdz1Zpr26DdDJDDJtLsuQ,2943
PyQt5/bindings/QtCore/qstatemachine.sip,sha256=RcHCZYole8rfQ9kck5YYGQM8w0nA9sIHJMSnj-_2_cU,4749
PyQt5/bindings/QtCore/qstorageinfo.sip,sha256=lTvPRuDKyBj_uouTJ121M-K0xnT11kxH4mcJL9z3WPA,2145
PyQt5/bindings/QtCore/qstring.sip,sha256=0wi0G_LQB2KOJ1NmXBRO63udKtxjOY2crAcR-KIDuRI,2063
PyQt5/bindings/QtCore/qstringlist.sip,sha256=rGV8jqtfErMwvp0o7SJ4be-kb4Es8YVxsqvfaexsdfA,3714
PyQt5/bindings/QtCore/qstringlistmodel.sip,sha256=h4y4pSbeopfQhAPJyUuqYpu-jFlRDuVltPcLvLMbkDw,2448
PyQt5/bindings/QtCore/qsysinfo.sip,sha256=dCwP4zoARiLe9KINOly1jw-qhG-wzCkCYrJt_tzRqb4,4005
PyQt5/bindings/QtCore/qsystemsemaphore.sip,sha256=f9J9Gu8zVmKTi0P3Vx1mqqbIlGwui8_ibLM4p5MJTAA,1848
PyQt5/bindings/QtCore/qtemporarydir.sip,sha256=js1XzTCikSzDmGWno7kmuV-eevF687EDLGUSjwMwdIA,1495
PyQt5/bindings/QtCore/qtemporaryfile.sip,sha256=EZVcDCe9yW2ABpxKITF2au7K8iQ9TFj0w7s6gp8TRdg,1866
PyQt5/bindings/QtCore/qtextboundaryfinder.sip,sha256=a3AUhqV9rEtd6Zt0kr3DZGvsqt9lh7Bqbgc-6VEX4Ko,2169
PyQt5/bindings/QtCore/qtextcodec.sip,sha256=1QCLeKWR8hNriKez0Wn4h3K1FDkVmt9_7T8nrxhd9jM,4228
PyQt5/bindings/QtCore/qtextstream.sip,sha256=CzQNA9RsZ3z7aUT1euD48uRHIiWr20ze1VIl6R9Gp_Q,6053
PyQt5/bindings/QtCore/qthread.sip,sha256=9tlCUm8qe58SA2JJQw1i9f1BYk2OeewcSdH8yI7cEjM,2985
PyQt5/bindings/QtCore/qthreadpool.sip,sha256=JMyY3byizHvCnrMeAn1hM-tanEA6v05thAKpFYOCRew,4154
PyQt5/bindings/QtCore/qtimeline.sip,sha256=-YYTvHF8BqEH4w1_mYCz-wPJif7_xIfGVrbogbJW1v8,2789
PyQt5/bindings/QtCore/qtimer.sip,sha256=ObCcop5a0BWmH6AkhZG8C_X6tJq-w_znOO1ZpoQ3Y_I,2668
PyQt5/bindings/QtCore/qtimezone.sip,sha256=a-SVH_3HdRfHKdRQgK04sq9eldPCah20RFhAkrOZ5mo,4380
PyQt5/bindings/QtCore/qtranslator.sip,sha256=bhzIDgImV3MQWZo-OKSB6tUxCJZtok1CzZILFOrRjAY,1926
PyQt5/bindings/QtCore/qtransposeproxymodel.sip,sha256=EWd3NSQ6x0LBOPYcCT8UEXp91eGF7X1e81dRhISbMyA,3053
PyQt5/bindings/QtCore/qurl.sip,sha256=JFL7IDVsaqkkjtmQX2F9hnNKIOwWRFtJXK1zgZsZlaI,12212
PyQt5/bindings/QtCore/qurlquery.sip,sha256=V7RjtYxd6M9fhgV_NN0oO0cAdf4wUOfmCT0HR4Q5qso,2685
PyQt5/bindings/QtCore/quuid.sip,sha256=XilJs6QKDTq_rCR0WLfID7Zz1IyXJn9LxkN3G6qk2tc,3632
PyQt5/bindings/QtCore/qvariant.sip,sha256=XfHpmfc4rjefimd7_CGY-8AKbNMmpDJl9JMe0sC-Z9Q,4727
PyQt5/bindings/QtCore/qvariantanimation.sip,sha256=MeNUPXkopmU-H_TKgWelK7JV5l1gPe1xzoqSKHkQ6KU,2252
PyQt5/bindings/QtCore/qversionnumber.sip,sha256=CXGKgIExGP1kw6FilqFrUjE1fu20xhNygUx1CwkDltY,2836
PyQt5/bindings/QtCore/qwaitcondition.sip,sha256=pSvo9UwfgEfEiS5fpDKt8Z3bFOWHO-ivqQJN3_Se4fE,1599
PyQt5/bindings/QtCore/qwineventnotifier.sip,sha256=jQ2F1eFlKOVFu8XhORLuue7aR586GQWuKa09u_Cxfxs,1630
PyQt5/bindings/QtCore/qxmlstream.sip,sha256=GxdrWjzsLF92pOPI5N_WdB4nm1zIOZGScVVfZrIQSgw,14468
PyQt5/bindings/QtDBus/QtDBus.toml,sha256=14vhtP-qohpjX1B_BtvV0VsbzOJhsG0WQJ9umK9XzFI,181
PyQt5/bindings/QtDBus/QtDBusmod.sip,sha256=7WqefIZNGCL2iDJKICaUQzG_xvWuZUaFFsXL-Hey4e4,2395
PyQt5/bindings/QtDBus/qdbusabstractadaptor.sip,sha256=OA902WUreUPqE0V6oSI9R8_MzFoC9_wWWveW2-EW-wI,1309
PyQt5/bindings/QtDBus/qdbusabstractinterface.sip,sha256=Kwh55oXjKlVQb0HJA5wVXJxZMe7ZvExQoNaHcAOdfC0,6844
PyQt5/bindings/QtDBus/qdbusargument.sip,sha256=iF5SlahV8K233QYFgaiA-R2NG-rTJlNOJnD3DN5GXwY,5238
PyQt5/bindings/QtDBus/qdbusconnection.sip,sha256=EJuiJxNfmMlYI_BXMyBROpw5xeuI5ZV9UsCv4NY5TMk,10165
PyQt5/bindings/QtDBus/qdbusconnectioninterface.sip,sha256=LiDlZgdDcnHi287K0ySKW9f5W9m6kRHMj9hGiq2ftwE,3073
PyQt5/bindings/QtDBus/qdbuserror.sip,sha256=x_GjSEoPkuuUDNFl9TAvDsW0EcSRT3WKUpY6QdnkAe0,2026
PyQt5/bindings/QtDBus/qdbusextratypes.sip,sha256=YLPt_DkLT4FwzTTULrNASt9lxNfPSWq8tO5WEPpldyA,2652
PyQt5/bindings/QtDBus/qdbusinterface.sip,sha256=tCBA55EZrjzLO87x79wExyjcAonQVevWMOglOm72tq8,1331
PyQt5/bindings/QtDBus/qdbusmessage.sip,sha256=NiFdVOhaURi47KBk5khyR8X8k-0Vc6ennU3oGtFjBAw,3184
PyQt5/bindings/QtDBus/qdbuspendingcall.sip,sha256=OYcR9p8pqcvZdh0Dhuot3Ow90A4sKsOaI0VCp6SVMw0,1901
PyQt5/bindings/QtDBus/qdbusservicewatcher.sip,sha256=uQbUEzBEEJ3NMVzikAD5usoPrrcs6AVqsBWVHZlTGbI,2539
PyQt5/bindings/QtDBus/qdbusunixfiledescriptor.sip,sha256=d8f-kysL9G3GM5zll31DgFc5ITN343Sz3DlkIBfv4I8,1489
PyQt5/bindings/QtDBus/qpydbuspendingreply.sip,sha256=IlOihyBQGwt73PCBDi_NQV8c5pYBEHqUXSOLTlgQBUw,1783
PyQt5/bindings/QtDBus/qpydbusreply.sip,sha256=pcmTt_CRn6tXWutba4zGNX-R1lHex2rIBeZe9p2-QFA,5529
PyQt5/bindings/QtDesigner/QtDesigner.toml,sha256=gIK96u0Bp0bnk50tKaznnVkxf2P2qrCKg8J3_mT_C20,185
PyQt5/bindings/QtDesigner/QtDesignermod.sip,sha256=E4wOaQ0uTgH-Yq2yVZzGGx1Auipq5Vn1mm_f4DVbr7c,2848
PyQt5/bindings/QtDesigner/abstractactioneditor.sip,sha256=MAyiMjjao-DXnBe40mWhc2Jqb3gWpeCfN3pm37T5mlM,1530
PyQt5/bindings/QtDesigner/abstractformbuilder.sip,sha256=UFhCXvsvZaboyuhaRjLaSAU2E8v-jl0SzLgkExPiOxg,1502
PyQt5/bindings/QtDesigner/abstractformeditor.sip,sha256=VJOfQSiI02bslVtCwaFivlrYT7hiUTHxhAglDH707UE,2191
PyQt5/bindings/QtDesigner/abstractformwindow.sip,sha256=uLQgWSR20t5oKnF1xWnB2LCMUXop5kiMQRwHcvKhD40,4826
PyQt5/bindings/QtDesigner/abstractformwindowcursor.sip,sha256=RAkLWk0CwjFJ-WRs_SZTqySIplEur0EYDSlOIAKQlUI,2460
PyQt5/bindings/QtDesigner/abstractformwindowmanager.sip,sha256=jR9wz8gnh1PRTAQR4VFoJxK-vwl7n5vhA9q_LRpgjCs,3358
PyQt5/bindings/QtDesigner/abstractobjectinspector.sip,sha256=pMZPJHIkWCqqxYrg2qdRpxopgwrNfIGngd4hz3AFFC8,1437
PyQt5/bindings/QtDesigner/abstractpropertyeditor.sip,sha256=4f7y1BGCeh8r3FT4EmZTZhcJqJZFT9Qqp1kOY9X9S6U,1779
PyQt5/bindings/QtDesigner/abstractwidgetbox.sip,sha256=95EtkQD8NXPBTM6F7zS7Dv6y6xCgu1-l-v6NKSLmJAE,1417
PyQt5/bindings/QtDesigner/container.sip,sha256=cztyVvANBVov-Q32WfCPj0cq3-CBoQA_oGS51RDIgv4,1550
PyQt5/bindings/QtDesigner/customwidget.sip,sha256=EFfPNjqTFDlkAHclbC7jJAoBR3tT89F6nACAk5UwRxc,1938
PyQt5/bindings/QtDesigner/default_extensionfactory.sip,sha256=aEhXh5ZYXDrd0advIplt0h_I6EW1f0bn4ukMTxKTHgM,1594
PyQt5/bindings/QtDesigner/extension.sip,sha256=GMSNVZ3d6foAe3hYJY1bCLD2-fMe78sKkQNQxmi9Ny0,1616
PyQt5/bindings/QtDesigner/formbuilder.sip,sha256=-BrcmGV9M9zYBnP25Gx-TWQKLQH9Z2n2gMafJ210yTI,1382
PyQt5/bindings/QtDesigner/membersheet.sip,sha256=Q4jfiyLNoGYh0XKlm0m2GOu1HBZdBa-gqqNhlsBfBx4,1917
PyQt5/bindings/QtDesigner/propertysheet.sip,sha256=LkXMDq4QOlvm8xvRtbcBMauYGFWvGWW0cegles7PnbA,2000
PyQt5/bindings/QtDesigner/qextensionmanager.sip,sha256=XmS1OJuxgMQdeoSRhvmQNmIJcngwuRwLZeRZlN1GD0g,3582
PyQt5/bindings/QtDesigner/qpydesignercontainerextension.sip,sha256=GguaQlN-nzt2fn8Qi3_H8nFlXQfKTRj9mfp9Gn8wVPU,1260
PyQt5/bindings/QtDesigner/qpydesignercustomwidgetcollectionplugin.sip,sha256=Kl9OeLAiqHw-vdwsDCYqdWQn_ezoddOieIfd6_jFw44,1341
PyQt5/bindings/QtDesigner/qpydesignercustomwidgetplugin.sip,sha256=lBCQnks9wYAteMxBQwclLihYYCHK1Vfoo2mkNG5eqkM,1267
PyQt5/bindings/QtDesigner/qpydesignermembersheetextension.sip,sha256=-VcgMOWgRQgdr4RhpfqrmCoZqYsXcvhNcmtQy4Gl1v4,1274
PyQt5/bindings/QtDesigner/qpydesignerpropertysheetextension.sip,sha256=BNoQYWTgvXBfacs2q6t4bUysqVLgNRdhm-wi4-6zLE8,1292
PyQt5/bindings/QtDesigner/qpydesignertaskmenuextension.sip,sha256=K6q1ecjS2d1_Ey23Mv_DBHQxViT7OSXrVbQV_gbwZAE,1253
PyQt5/bindings/QtDesigner/taskmenu.sip,sha256=DYlA2HdKCWEmP3oqxbG-16Yu6eY67TWfJ1Sye22wyl8,1221
PyQt5/bindings/QtGui/QtGui.toml,sha256=YVg0EURXBYuBt3VnPMTdr8snMOnEnLnwS_ljt4vYUDk,180
PyQt5/bindings/QtGui/QtGuimod.sip,sha256=ZFjugD9SCeJImObsmLjJXj64htQJ8ZaRmtAufOb1xJA,4639
PyQt5/bindings/QtGui/opengl_types.sip,sha256=-KJH03fewoazENzxgkFOaRiHr9LBuABLSMFRn6lG5_U,1450
PyQt5/bindings/QtGui/qabstracttextdocumentlayout.sip,sha256=naQiv_3g27C56Zvyv-aNzkLFwF1MvkPa8QdQRFwkDgk,3924
PyQt5/bindings/QtGui/qbackingstore.sip,sha256=hwCAh3dLnb8b5i18lAvyWJ7intrJL1BiXciUKOhN25w,1611
PyQt5/bindings/QtGui/qbitmap.sip,sha256=8X8SEVOC5sTgyQT-3OAgAmyIHcv07XyzmWfWYRQ20Y4,1932
PyQt5/bindings/QtGui/qbrush.sip,sha256=K1NTlbvj81HQosHvhv0zwPoVnVuYqOY9cauE92hR_mA,11361
PyQt5/bindings/QtGui/qclipboard.sip,sha256=Af3dXSG0uaxqOiI4OYv051Div8JSe6P9QUx4tUD4Y9M,3633
PyQt5/bindings/QtGui/qcolor.sip,sha256=d9t79k2MVZOAA1cJBiaCuzdQNH4aMIL3sMuMJPA6dlY,12487
PyQt5/bindings/QtGui/qcolorspace.sip,sha256=sKvoRTygRIsM2kbn2agQMwWRoGj0I4TYDvyzWYLjIs8,3243
PyQt5/bindings/QtGui/qcolortransform.sip,sha256=vDPGzEY8o--9VDD4dv4lxsVpFjlKzl_PuKFu4UrqNUQ,1378
PyQt5/bindings/QtGui/qcursor.sip,sha256=6Hw7K6ccen2GKIVr-BlHgWmtP3MEUsYjKeDzpjsRsgA,3162
PyQt5/bindings/QtGui/qdesktopservices.sip,sha256=s1nDwLMYKJdyw43Msa1BUjHf3wr_V1ZsF-meN_IXcM8,2485
PyQt5/bindings/QtGui/qdrag.sip,sha256=5t8ZkFaut4LSW-6JkdYcJkCHnNvugjAs2ZK9C4BTSdk,2266
PyQt5/bindings/QtGui/qevent.sip,sha256=P6oomItprIJq6KhPCBPcm6d4yLqClMVAREdFH-kKwaQ,24977
PyQt5/bindings/QtGui/qfont.sip,sha256=aya3IYk0pDD8KIdX5U3ZrZkNk2tKmuXWLBuvVybufeM,6343
PyQt5/bindings/QtGui/qfontdatabase.sip,sha256=YKBykT3agI4lG_Kw7rayCYqaMULyeD_C_fI_X8U4SNc,3821
PyQt5/bindings/QtGui/qfontinfo.sip,sha256=wwCF2upkj79oDMC13iOh-tvj6cpMEKYUOiPwqBk3mRg,1568
PyQt5/bindings/QtGui/qfontmetrics.sip,sha256=zxgwLtPx_r7SV4iTDKg3L4Y9xIz39dF2-tgYtUmi93c,6552
PyQt5/bindings/QtGui/qgenericmatrix.sip,sha256=jNkAL-U0z9u2JKeV4KQaeWLffKXMV2hVIT8-uZyywB8,32592
PyQt5/bindings/QtGui/qglyphrun.sip,sha256=In4APWE6rgopQ5ms0QEVg0zzsS2BdrVE_AkdkjXW0pM,2388
PyQt5/bindings/QtGui/qguiapplication.sip,sha256=z1YZnKCSut_VOtpvbNjAvI1IwDJ97_F0RNoWkhJg27k,11884
PyQt5/bindings/QtGui/qicon.sip,sha256=DhPADRgfyHFR-aiMBURqP49LtUGPuZvOtjSfUdghfUk,4828
PyQt5/bindings/QtGui/qiconengine.sip,sha256=QkcmrxpRbsLqIaABqamXM3cbTFYBiwzoxgPG_ZTRbbM,2835
PyQt5/bindings/QtGui/qimage.sip,sha256=9qwxpjYhHSjm6SvWvcUqSmuXbzDYqSqEIM2Ntj7tFm0,10734
PyQt5/bindings/QtGui/qimageiohandler.sip,sha256=DIhA3JT5nkOT_v_UY9AJ_r8ERL9WZWyOMsqp5BzxhyA,3022
PyQt5/bindings/QtGui/qimagereader.sip,sha256=fcisRMc_ZiFNv8F4scGo-crsyloKVX9-JCpI9QWy89c,3767
PyQt5/bindings/QtGui/qimagewriter.sip,sha256=LfKalTVXGnVbnrbNNaEiNy78BsJqjy1Upxy0PcvhZkM,3088
PyQt5/bindings/QtGui/qinputmethod.sip,sha256=JtW9sbqxlw6C8M0dtsV33vqKEcCW_7XFTVYVnZfPZd4,2541
PyQt5/bindings/QtGui/qkeysequence.sip,sha256=RRn9zCu0qKGtSOVJduQku8pEJmrzyH-xnxPamQOF-e4,7097
PyQt5/bindings/QtGui/qmatrix4x4.sip,sha256=ErNgG-QXWm2RxrmVt72zg8Wl2iRlUABnpVSlbdqsrdI,10969
PyQt5/bindings/QtGui/qmovie.sip,sha256=U4djd66R6JIkO7wHTfFt0TSYaAZyhItrqqF47Yyq8hY,2998
PyQt5/bindings/QtGui/qoffscreensurface.sip,sha256=wqRK_P0Bf5zzt3liWZa3XJEo6MS1DDUFA9MR1Ea-xXQ,1862
PyQt5/bindings/QtGui/qopenglbuffer.sip,sha256=ZdwNMqucD9ulSO536ULOpgL12dgRfkfYUbq0DgVMsAQ,2939
PyQt5/bindings/QtGui/qopenglcontext.sip,sha256=G5uruQHjYUE1GN53QYBTVmgBlsjWCttECisOCzrbKog,4123
PyQt5/bindings/QtGui/qopengldebug.sip,sha256=zZzKB7nWPkRte_9pAdEWHzA26uMQ1W-siSwaqnvOxqo,5517
PyQt5/bindings/QtGui/qopenglframebufferobject.sip,sha256=MZSeQoNnjJ2IEaXihpwGO5I1kjdzMoBbXL1PKuZdP60,5540
PyQt5/bindings/QtGui/qopenglpaintdevice.sip,sha256=kUf39tf__pnolwF2dZr5faqXMuwWjH8jrdauR7DVjYY,1939
PyQt5/bindings/QtGui/qopenglpixeltransferoptions.sip,sha256=XK7VoK9iPxox4zLqaQUf2Mk2aucybWH42hUB5L5BEYI,1965
PyQt5/bindings/QtGui/qopenglshaderprogram.sip,sha256=kBlLCD62ZyDDWVgZTWYG14CbjgxsogmUmw0goiJfS3A,16834
PyQt5/bindings/QtGui/qopengltexture.sip,sha256=2wHhB7vtjQSb7TQAZbx_V7Cmo2XT7__KDkSfTwYvZgA,18884
PyQt5/bindings/QtGui/qopengltextureblitter.sip,sha256=8D6mBTmWcQAGMZI5SrOFeY1kFX9nw-YjRYY25iBw6Yk,2050
PyQt5/bindings/QtGui/qopengltimerquery.sip,sha256=ROHTZvCZ6yAIE4or4NYCvFv0JIxIz_RM_Nm-bJbAdGU,2217
PyQt5/bindings/QtGui/qopenglversionfunctions.sip,sha256=aw2c1E8dP_61imTHQa0S0L2RLgmNdTSTaNYduWym9Qg,1242
PyQt5/bindings/QtGui/qopenglvertexarrayobject.sip,sha256=0gMf0cs3ZtZk8Iwtfp8hus064JHdemoxQPNQrM_97pw,2024
PyQt5/bindings/QtGui/qopenglwindow.sip,sha256=qtJOQtY8LIoWXR8ORvEXRJSsCZjCnHxNsBMloqBh02w,2356
PyQt5/bindings/QtGui/qpagedpaintdevice.sip,sha256=_agMZC19Ur0lrPihZi2WWW8yrcVW4f6vH8ZtNpc9VD4,7036
PyQt5/bindings/QtGui/qpagelayout.sip,sha256=gfajXElHAk9nDibR1j29A4yNHf_uHPfpGzcyYjqaidM,3268
PyQt5/bindings/QtGui/qpagesize.sip,sha256=u4sHxfWAU6OW2dspgxC1e7zvTtPakeECkA3HMcdX31o,5824
PyQt5/bindings/QtGui/qpaintdevice.sip,sha256=biMMAOmVYKfNZ1fbjXZ50Dsr6J6OtW6JDbuSxxnRKFw,2183
PyQt5/bindings/QtGui/qpaintdevicewindow.sip,sha256=em7_pFuKRhP5Ca7o35jwCAO2i_crle8WK1NLVWSSB9c,1484
PyQt5/bindings/QtGui/qpaintengine.sip,sha256=E695gTaA1HTty-meZzPijLvatJ6WQRBODMM5ICY9jug,6092
PyQt5/bindings/QtGui/qpainter.sip,sha256=4_0X83-pRmxDyiGt2iwBMoASrwa7fyp39KkNNGy3NS0,21587
PyQt5/bindings/QtGui/qpainterpath.sip,sha256=4z3TJb__m8veVrfbP7uMK9I6OFUGfMRI26vWNmYOC-Y,7180
PyQt5/bindings/QtGui/qpalette.sip,sha256=vuuKEC4aIFQLYwEh-ud6QTrhaQAsSreTjfLwBRePNRY,4799
PyQt5/bindings/QtGui/qpdfwriter.sip,sha256=Pg8OvdC8v7SqU5BreXuR_E52TYMD4voaIn0k29oc06I,2393
PyQt5/bindings/QtGui/qpen.sip,sha256=qh_yVpfLoL4lwdZ7KlMMPya00lzxPrzeoMpsimJgLQE,3518
PyQt5/bindings/QtGui/qpicture.sip,sha256=dKP2rdycX-TJsLn2ufFP2ZVb6KWj-5bluswafT3TYeo,5881
PyQt5/bindings/QtGui/qpixelformat.sip,sha256=nt-7D4q4085vsxdANq1rbKPwZA-Ui6_yqDA-yBHVJh0,5944
PyQt5/bindings/QtGui/qpixmap.sip,sha256=E04DZ98h0kUmiBy66a5OlLBzvhp-uS1btk082D8J7XQ,4987
PyQt5/bindings/QtGui/qpixmapcache.sip,sha256=cvWieGnFlee7vA1PXYJSUyM9yR6JttGAOD1gXDcT7lA,2364
PyQt5/bindings/QtGui/qpolygon.sip,sha256=L0J3UmsGrG4hVn_vjpkkkXgvq88Jpa9tL0-OxUY6yVI,13769
PyQt5/bindings/QtGui/qpygui_qlist.sip,sha256=rBTdVue16YnuGvYB3xn76IdIYm6f16wFqTyA6CWgHWk,2890
PyQt5/bindings/QtGui/qpygui_qpair.sip,sha256=ehnaDoicIlc0IwpiH9-5rGlpsejMhtr_BDcdgn92sWU,5478
PyQt5/bindings/QtGui/qpygui_qvector.sip,sha256=ulTrCv6TLL8y0aFDuMKYFBS2FAOmK3oeLz7k7cZ1I64,9158
PyQt5/bindings/QtGui/qquaternion.sip,sha256=tc7UC91yC-Qku10FflZOpLkdiGYRwkW-kDZ7mYoXna8,6292
PyQt5/bindings/QtGui/qrasterwindow.sip,sha256=xT4HlBAgRI-OGho_scKVgSkfngyvXU2D4gkzj9HUYG0,1317
PyQt5/bindings/QtGui/qrawfont.sip,sha256=8_Rnsj1UHYpmnvE5dGajvZbdn9lHtETac_NrAqTQoYI,3942
PyQt5/bindings/QtGui/qregion.sip,sha256=JI-pLLtyngbEY8PGm96aMuWvD58z71CI-pDhPmHMjeY,4641
PyQt5/bindings/QtGui/qrgb.sip,sha256=zkSZGzfPojRnl4Hqgot0y7qD57m1KrsOJArJWovS8_I,1381
PyQt5/bindings/QtGui/qrgba64.sip,sha256=y1lxx6Dyho6TVXz0G5nB6Ap3UJy1NhukleiuLfkXL_E,2474
PyQt5/bindings/QtGui/qscreen.sip,sha256=bjIz7cTX-ZTs_Vf7IF-77rdc5rmRzpJraXYNI0Mxoi8,3482
PyQt5/bindings/QtGui/qsessionmanager.sip,sha256=Sts0kK4eh_DUBrS3_OifNrIdCAi74cV8hP5wiqJINKM,2052
PyQt5/bindings/QtGui/qstandarditemmodel.sip,sha256=slHCM6I7yJbt0Dn6-DVuSMytuuymCd0Z9BNS3MRquU8,10166
PyQt5/bindings/QtGui/qstatictext.sip,sha256=qbeLlbZAgTHBeKeNsJ9hw4GBZhnedL_76zKTGIItxrs,2097
PyQt5/bindings/QtGui/qstylehints.sip,sha256=iBnOTCBzRk5SE0vwj7ygzMbBOM7PF3xUe2Ogsp86yBE,3538
PyQt5/bindings/QtGui/qsurface.sip,sha256=H8r8X2oxl-w4hKjeLiX5z_kTHlUqG6O9mTViN7Zo2WY,1788
PyQt5/bindings/QtGui/qsurfaceformat.sip,sha256=nrPz9HVUf8ZiDfuL95oD9hWyt9WaR96bGfYFHyAz9lU,4382
PyQt5/bindings/QtGui/qsyntaxhighlighter.sip,sha256=1dGaqr1Zyr4OCF9ZB2MAf19b-RvaauLyS4SUppk4Qts,3119
PyQt5/bindings/QtGui/qtextcursor.sip,sha256=gw9gFwphyuRof9cpm2qLP6ZUp4IHoarFNg-zoO3gXIc,5533
PyQt5/bindings/QtGui/qtextdocument.sip,sha256=yWcBeFsO04zc3oSDDIWXfghTGxvCEDiqigew_3gBlfQ,7516
PyQt5/bindings/QtGui/qtextdocumentfragment.sip,sha256=PIJRhwN6Zn6smaFHmld2c9qoIBd3stNwjcVo14AjfgU,1716
PyQt5/bindings/QtGui/qtextdocumentwriter.sip,sha256=3n-4Zyn7kYbE28dTZHp08efrxgxBZCpGeD5N21mg_94,1847
PyQt5/bindings/QtGui/qtextformat.sip,sha256=SbljbeIPEbPCRuBPKBT_vEseg__vJZDgq_THCqKZ0XM,20387
PyQt5/bindings/QtGui/qtextlayout.sip,sha256=2rtuBtJCTZV50G4HaACdGJ6b9War7w-zuyi0FqEXsqU,5847
PyQt5/bindings/QtGui/qtextlist.sip,sha256=k6x5yjWcFX9cf_ldxcBXCMrVW7OrN3OWtT4PRNHDYM0,1550
PyQt5/bindings/QtGui/qtextobject.sip,sha256=bhYZf_gnMlJaJ3iIHPsjSezo6bLEQ5oc6YFSyWxnQHw,8097
PyQt5/bindings/QtGui/qtextoption.sip,sha256=OcFiEGiIuRHFMKL8dLBSMTT3X8T1OOOpjnDuXh1LjUg,3098
PyQt5/bindings/QtGui/qtexttable.sip,sha256=DL7d9Hir5tvZkvY8GrJRcayPl03X09HpNnl4CrL-vqQ,2644
PyQt5/bindings/QtGui/qtouchdevice.sip,sha256=aO1Cs0qsTZn0X9adD7PdQyxeYkCOqso3razr4EjsYx4,2042
PyQt5/bindings/QtGui/qtransform.sip,sha256=uYGf9WbHKMwo_l1FBKmBd0Cb_gBqSjIjWFJwVBXDkc0,5217
PyQt5/bindings/QtGui/qvalidator.sip,sha256=7XA_S2QPyQ4uJRkJxoaMEsc2_74V7sFK4_9_nqkNWQ4,3904
PyQt5/bindings/QtGui/qvector2d.sip,sha256=eCiS5OFK2VyYVkYsUwkZOQDZLTVl1xdeuMS7J9O2DEU,4173
PyQt5/bindings/QtGui/qvector3d.sip,sha256=GS7qRhnk153lzGYjMi5-Kxe_GE6GiDhvymE0B5lJygI,5245
PyQt5/bindings/QtGui/qvector4d.sip,sha256=AfQIiFo6lyf5niFOKeFWeSfwBJBdMURg1fFS9OJCCNY,4816
PyQt5/bindings/QtGui/qwindow.sip,sha256=axk1HHeNN1Dm6kuq1BIKAvvC4jD5W671I1DDzV8pITU,7623
PyQt5/bindings/QtGui/qwindowdefs.sip,sha256=kYU-J4yfAQ67T9x4sLknwKuCjJ5xi0Uh_nbFcVHOHyE,1033
PyQt5/bindings/QtHelp/QtHelp.toml,sha256=3XWJz3RtjQRU35X_LgZyA8Hl7pjdpdaAdPq5nW-YkBs,181
PyQt5/bindings/QtHelp/QtHelpmod.sip,sha256=sa8NrQg6PlKSSAQMrIpPhcQi5Fn960RDYC6Nj1SLKcc,2402
PyQt5/bindings/QtHelp/qcompressedhelpinfo.sip,sha256=sF1ukRTuZtnY9e2Fo3boAFycdaxKshd19W-vCiLbTDI,1522
PyQt5/bindings/QtHelp/qhelpcontentwidget.sip,sha256=SjhgKIw-em7Vqzh9dhVgvTJiEHEiQHH92AwtbXjvvuw,2424
PyQt5/bindings/QtHelp/qhelpengine.sip,sha256=LrIcO-FQu_be5bDOj9pYmKKeiHpNNdgIsghbpfKGCcc,1398
PyQt5/bindings/QtHelp/qhelpenginecore.sip,sha256=lKFXlExDvYOxzD4vZoGDa21IVOn2s2qhl62lcAMrqBE,5469
PyQt5/bindings/QtHelp/qhelpfilterdata.sip,sha256=lgVDCKo84e6bFy_3jlY-hVFfNzIU_p4-JpXV1fU3B9E,1498
PyQt5/bindings/QtHelp/qhelpfilterengine.sip,sha256=T7PInj8Kq2N6X2aIr6jX85QPRX3bciPkh2Ct0hidAtM,2044
PyQt5/bindings/QtHelp/qhelpfiltersettingswidget.sip,sha256=szahQnDRxbv9MQG7c63XUUeAi2F0GpyLetydJJ85lXk,1522
PyQt5/bindings/QtHelp/qhelpindexwidget.sip,sha256=76idtcmMY1VKCLnrS8rF380DisS7J2173hzLhEjT4JM,2205
PyQt5/bindings/QtHelp/qhelplink.sip,sha256=g222R-dHME74pWh4A_kSrpXisAncMTka-hZoHH19yfI,1108
PyQt5/bindings/QtHelp/qhelpsearchengine.sip,sha256=SMKmvMFh8ccgwg1wqFEAl9jU4KSK_x6DPSirsneq9gI,2814
PyQt5/bindings/QtHelp/qhelpsearchquerywidget.sip,sha256=MnFaEKmGzQl7eIdEB49qeXAzDGEyA9k6vls1T6q59NY,1914
PyQt5/bindings/QtHelp/qhelpsearchresultwidget.sip,sha256=_LUHc4zGnHM6DkBdFf5H7b0xmx7YBPhh2kDDj4HeSXw,1257
PyQt5/bindings/QtLocation/QtLocation.toml,sha256=ZuqsLF95KjvQn6qiJgL5iCLWm6JsytCWYZTl_yh2NXA,185
PyQt5/bindings/QtLocation/QtLocationmod.sip,sha256=jHt3Fh9r1ja5ggLqPQu3iWerB1REIN5cdmC_F905wzQ,3199
PyQt5/bindings/QtLocation/qgeocodereply.sip,sha256=uSECTmDHntlXGd1GtV84HqUCv6YVKEZson5v_GAQlGc,2409
PyQt5/bindings/QtLocation/qgeocodingmanager.sip,sha256=aGYRom2CtPXqMoAgi7Y2KL5N9TXXjgpdG3VZEkHXmPw,1828
PyQt5/bindings/QtLocation/qgeocodingmanagerengine.sip,sha256=8S4_80qBIM0n9tIW8hAQ0fLqj06_cL5VP40L77ztCAc,1900
PyQt5/bindings/QtLocation/qgeomaneuver.sip,sha256=zcDSFD7Y7LcI7gcG4ooCQdukJvV2EwjPXiIvJ6TiYrU,2469
PyQt5/bindings/QtLocation/qgeoroute.sip,sha256=yYfkxq1Xtf1GpwH02ahRKFrf5BlOrL6Q_JJCfuHAaVk,2655
PyQt5/bindings/QtLocation/qgeoroutereply.sip,sha256=VFxr_IY-l5dixAMWIA-7ZwrtrMGlYpU0M2d-0PSe9WM,2140
PyQt5/bindings/QtLocation/qgeorouterequest.sip,sha256=fboqLdK4Z4SmVfJZieP2ZWO7ydGGr5hgGTrBB3A5Om8,5481
PyQt5/bindings/QtLocation/qgeoroutesegment.sip,sha256=Ys1wqkadz57XOUr6F0Xtov7ijfcjgRut_IxMEtYm15s,1849
PyQt5/bindings/QtLocation/qgeoroutingmanager.sip,sha256=dh_OnfKYiRTMaVKQFzWnmEgJR2E3kiIW6ZIRxGV6GhQ,2208
PyQt5/bindings/QtLocation/qgeoroutingmanagerengine.sip,sha256=l0Vbpbn7VoJvvD6ZQ_Gj0EHoxSKi4iMkwFI9UlWCg0E,2859
PyQt5/bindings/QtLocation/qgeoserviceprovider.sip,sha256=oYlziLpNAbSd3j_Yd8yjFrLoUAU8HLN5-qXccuxG__Q,7498
PyQt5/bindings/QtLocation/qlocation.sip,sha256=ntjkWiBu0-S1BJoG2dM1JlzEQYY7UZWSrtU3C6DMIsk,1417
PyQt5/bindings/QtLocation/qplace.sip,sha256=eAs2rMX78FBqIOuy63eQe1SosdKctpM_ORZVanCEnA4,3368
PyQt5/bindings/QtLocation/qplaceattribute.sip,sha256=DmKZnMNw47Wcegwqtf-rMJSN75CPPIDgZzVXWNPqiFQ,1602
PyQt5/bindings/QtLocation/qplacecategory.sip,sha256=yYRS7_0HHiWXjQZceuRTTMapUMd_RXCJqzku7wa4aWc,1676
PyQt5/bindings/QtLocation/qplacecontactdetail.sip,sha256=S_ccPM6JN1oqmB98jTn980CGiMTEA5BXaQRUbYwWOCE,1654
PyQt5/bindings/QtLocation/qplacecontent.sip,sha256=Nr9Ix1fV1j-OZxS_JhJQODo11cnlcq57l8O9xvx7c_Y,1814
PyQt5/bindings/QtLocation/qplacecontentreply.sip,sha256=3-L_UhjDSCiYsa8BFlf2_-s612XMRgwq1_JQNidBz50,1811
PyQt5/bindings/QtLocation/qplacecontentrequest.sip,sha256=NOrznGSryfv9qsaowtcV5AAP0QBd9jncZhJgM-Czxks,1707
PyQt5/bindings/QtLocation/qplacedetailsreply.sip,sha256=dUqc5YTHXK2_GEz0Mk6UkNbu_OecmXdbDUECEYHZD-k,1358
PyQt5/bindings/QtLocation/qplaceeditorial.sip,sha256=-m75qYqBbGFsJdVMsSQWaUTr9CzjTrWwE8FCIh7VQdQ,1436
PyQt5/bindings/QtLocation/qplaceicon.sip,sha256=degFOHaO4JDo6MuajtC0azbAsr4W5d8T0jUGSKgWs0o,1564
PyQt5/bindings/QtLocation/qplaceidreply.sip,sha256=spch_59nsKgjSqGQNu8cOEQm2qDVgvQVWX2O-FRfDPg,1557
PyQt5/bindings/QtLocation/qplaceimage.sip,sha256=zQnSczayoouMSSdjDW2pUM80zsYiQYaX2G9ln_v_6lQ,1413
PyQt5/bindings/QtLocation/qplacemanager.sip,sha256=bZSVkFZQy2RBl0PkMBOmI_EQy8wfRMdSF0Yu3PzB0-g,2979
PyQt5/bindings/QtLocation/qplacemanagerengine.sip,sha256=jj2R-1RCoQw1JuEa7BQhrJNOyZjSV8M6mIX5lD4L0FQ,3279
PyQt5/bindings/QtLocation/qplacematchreply.sip,sha256=1qWQEuKD2yb9RYjoLqGjQ6MRWlHTmwGz0VXByg93l8w,1464
PyQt5/bindings/QtLocation/qplacematchrequest.sip,sha256=J8zRW352-sUKc-vWiv8RFFmdBu7OViEH_WcIDvHRo_c,1647
PyQt5/bindings/QtLocation/qplaceproposedsearchresult.sip,sha256=u_dyMPZCrN3nKwuU_1nONNKKeD4auibx36XkgVQ6o_8,1413
PyQt5/bindings/QtLocation/qplaceratings.sip,sha256=yQyOktZ-oDI0a-H0HZpmSqwW4pNMSNj9v8AURHbObsA,1509
PyQt5/bindings/QtLocation/qplacereply.sip,sha256=WwOQQPIPIamn0CrSFcqIkmpvPzfD-rtnS-13wiK3Tzg,2208
PyQt5/bindings/QtLocation/qplaceresult.sip,sha256=R1RJ_zxj8uuKBUbdgBHROoMRNZY4rzrzTdcYlDkMJKY,1424
PyQt5/bindings/QtLocation/qplacereview.sip,sha256=QV3TnMDN1MhSReBi6UL-dKXAy1qPlYxN2Cfmrw9ToyU,1636
PyQt5/bindings/QtLocation/qplacesearchreply.sip,sha256=1q1L5GwZC23MpWJ_zbip4Op914QMY3pfLqaqZI2-gYk,1735
PyQt5/bindings/QtLocation/qplacesearchrequest.sip,sha256=ADGCuBPPdUqpgJ64IsHMdxTFx1i52eb_83Vn4XvEu8Q,2337
PyQt5/bindings/QtLocation/qplacesearchresult.sip,sha256=s_pgka8MeJZPxgXLlYb0-Q8Cyy0IhKij10MoP1e4zPU,1682
PyQt5/bindings/QtLocation/qplacesearchsuggestionreply.sip,sha256=eFD4vADtb_cUFxbrT_tucyvpBMToRLyuRgYFyKgsw3Y,1431
PyQt5/bindings/QtLocation/qplacesupplier.sip,sha256=wXhEyZlSFSx2_5tgkSNNzJoqtsXgvfy0HSgu4M-zBwY,1621
PyQt5/bindings/QtLocation/qplaceuser.sip,sha256=VfAJh2xK4Da-piL7HLY8jHzeObcp6KakqZD_bXZlwI4,1418
PyQt5/bindings/QtMultimedia/QtMultimedia.toml,sha256=MTOFpgEw-USTCox_ksOAA35Fx1ziXnK66H5jOSffWXs,187
PyQt5/bindings/QtMultimedia/QtMultimediamod.sip,sha256=Ri3-_5qFZJFoS43eaBOQRe2yXpQKHCrbxRQwPtggItk,4600
PyQt5/bindings/QtMultimedia/qabstractvideobuffer.sip,sha256=n24Ma5KJR49y2umA0AdEv5hNnl43C7y_BovGduTdLXQ,2558
PyQt5/bindings/QtMultimedia/qabstractvideofilter.sip,sha256=ZwUlf6tbAbbUKEVKEuqBWeAQqtfwUa-SROAC4o-yYEc,1980
PyQt5/bindings/QtMultimedia/qabstractvideosurface.sip,sha256=ukOhFn3HsiP9LS23wXIs1fVpw6XguK0jaeoSD7Mrqus,7903
PyQt5/bindings/QtMultimedia/qaudio.sip,sha256=F9le0taDG41KqqSMDDOBA4C1noMIXKc_I1C3BOzvfZc,2067
PyQt5/bindings/QtMultimedia/qaudiobuffer.sip,sha256=0TN7-6Uc2BbSucSAuNkvcjW330FfUCiCh27JQjozjtM,1599
PyQt5/bindings/QtMultimedia/qaudiodecoder.sip,sha256=gzAtZe_dXWdwgyJ4My6E-R4oynjLAz60egGzvFYrRnI,2656
PyQt5/bindings/QtMultimedia/qaudiodecodercontrol.sip,sha256=njTCpciQb4Qixw_lzzStuTfntAHq0J5vBG6kURbwLyo,2242
PyQt5/bindings/QtMultimedia/qaudiodeviceinfo.sip,sha256=gqjveqAmByOhJ_o2WL6CKp_QGhgllEtA1qgpPl5cTVQ,2074
PyQt5/bindings/QtMultimedia/qaudioencodersettingscontrol.sip,sha256=paMKQynLtjSBSfBkaP-hMKcc_kWzlCyoOkrrBCidjLw,1663
PyQt5/bindings/QtMultimedia/qaudioformat.sip,sha256=f5Z8FYVCzjKuOMiR0hqaXLoReIFg-yCq-FoKHdJawSA,2337
PyQt5/bindings/QtMultimedia/qaudioinput.sip,sha256=SIktSB1O-figmlFQxoNHnihKGSqeZdYRYFyDWOB8HIo,1996
PyQt5/bindings/QtMultimedia/qaudioinputselectorcontrol.sip,sha256=bKdtBKiRdQnRvRIkG0qhMvhl4YdHlpamaTMrvoUxbAw,1656
PyQt5/bindings/QtMultimedia/qaudiooutput.sip,sha256=tAJakK01scrbJR096MnMlxxIkU5jNZwiqTUkJNRRW4I,2073
PyQt5/bindings/QtMultimedia/qaudiooutputselectorcontrol.sip,sha256=ZsrMNksNF_0E3VbV9J9p8gbJ8fA8nE-K39u1UwrT91c,1668
PyQt5/bindings/QtMultimedia/qaudioprobe.sip,sha256=uXdMRZB9dUMgIRrEL-NDlL00tzc02iHf-r3Gm9NLGxM,1375
PyQt5/bindings/QtMultimedia/qaudiorecorder.sip,sha256=P50DRvDz6ht8GOQcMnPgb0Z2Xic3OsaS3g45mCZRErc,1633
PyQt5/bindings/QtMultimedia/qaudiorolecontrol.sip,sha256=tGW4cXo8WuCk0zGR5RFylNP7cfUFPXEsDC4p1kQ8nB0,1473
PyQt5/bindings/QtMultimedia/qcamera.sip,sha256=-P56HWaHbTjLtEi_FhKYIl1r_GDGwZIEOdMLD0WFo6g,5926
PyQt5/bindings/QtMultimedia/qcameracapturebufferformatcontrol.sip,sha256=m5Qdr-v5_OrjpdswfwOYN3wQqClVN8qNQbLahzdLGnY,1589
PyQt5/bindings/QtMultimedia/qcameracapturedestinationcontrol.sip,sha256=704a9Ta7CPK4av8gT6GUkxSNYpL0u1JZt3pt3vyx3yE,1692
PyQt5/bindings/QtMultimedia/qcameracontrol.sip,sha256=DPE7GuTXUBi8gccSzVkhsLF6M863LfUcIdNMV5PHBu0,2060
PyQt5/bindings/QtMultimedia/qcameraexposure.sip,sha256=ltmLJBE6TYTBXPfISuhBWs5UNxqBn6H9ANfKKk0t1W8,4523
PyQt5/bindings/QtMultimedia/qcameraexposurecontrol.sip,sha256=ZZkauuyosatfwdLIaPQvwiHynlILY_WQldrZzLWl7qg,2250
PyQt5/bindings/QtMultimedia/qcamerafeedbackcontrol.sip,sha256=BdJiWexD2TNbA0nCqxXfaM-EI_Bsw6Q5RVHyTuUExo4,2009
PyQt5/bindings/QtMultimedia/qcameraflashcontrol.sip,sha256=sBsZaPz2e7DeQ1ox4QyUzNJ8ezrPAwFYiqkGe6o2sms,1528
PyQt5/bindings/QtMultimedia/qcamerafocus.sip,sha256=UMQ5_nk6JPQ-iquGV14PdTTIztdBJqptTTHle63p0qo,3314
PyQt5/bindings/QtMultimedia/qcamerafocuscontrol.sip,sha256=1HKJgKGHWZhPIocwh2xo5HFnxtHtuguggPQQb5BbhF0,2072
PyQt5/bindings/QtMultimedia/qcameraimagecapture.sip,sha256=3CqcQ8rL99r3itumAbV2HV6o9tPekpCqxSdie7f4VfI,3644
PyQt5/bindings/QtMultimedia/qcameraimagecapturecontrol.sip,sha256=C70MnGpRGbT5suBjKnNXUYvK3jIWpuBoCFL4Le0Ho9g,1983
PyQt5/bindings/QtMultimedia/qcameraimageprocessing.sip,sha256=O0vWe1OAifcThGSJxiqyezYNvubx45jUPGIYwg4-o8k,3154
PyQt5/bindings/QtMultimedia/qcameraimageprocessingcontrol.sip,sha256=eq8bxN_DXhXwma3nKb5Ex-URunIYg-fGWOrkfDd9B3Y,2153
PyQt5/bindings/QtMultimedia/qcamerainfo.sip,sha256=FZpas_t2mwa2Y_Gz5JNawF6uAaDzWWRN9Jfr2GyfuQ0,1694
PyQt5/bindings/QtMultimedia/qcamerainfocontrol.sip,sha256=UgUAGIoYPWK9o1OLX3-bPMmc2ieMP1dS0NjnRpc7ams,1378
PyQt5/bindings/QtMultimedia/qcameralockscontrol.sip,sha256=w7A3gQKR-hfYDvH9yOmf4Vbid2ZNRxro41eecZ9sBu8,1611
PyQt5/bindings/QtMultimedia/qcameraviewfindersettings.sip,sha256=qudy3il8lSlNufuN7XTuPcy4741NbuyymXplco8GTJ8,2139
PyQt5/bindings/QtMultimedia/qcameraviewfindersettingscontrol.sip,sha256=3unENKXrvXuDIWk--kixfI3MYQFG3GUNyJ1fVNeqi-o,2406
PyQt5/bindings/QtMultimedia/qcamerazoomcontrol.sip,sha256=_Berr6x6cX4ndn9dI27uZi0a9ordKKArNhH6LiatvqI,1919
PyQt5/bindings/QtMultimedia/qcustomaudiorolecontrol.sip,sha256=eXkrWKO54fnVys4eJPC2vw3cd2W4ZEEtAEboWxQlSpU,1519
PyQt5/bindings/QtMultimedia/qimageencodercontrol.sip,sha256=oDw81AC9rwfh8FRwJ6G4nBTW0UvXTsLBDvdP2RTM5fw,1626
PyQt5/bindings/QtMultimedia/qmediaaudioprobecontrol.sip,sha256=6MaFO7UevNc4hLu55WL910A5siaKRevgrSatqCtqpPY,1334
PyQt5/bindings/QtMultimedia/qmediaavailabilitycontrol.sip,sha256=nornzcjg30SN2n2avc9Pmr5NZg04dtw3J3fH5F4-Y24,1416
PyQt5/bindings/QtMultimedia/qmediabindableinterface.sip,sha256=6v52tIibGXZPpm0UzfzvwMZ1Q5614XPmg5Xa6EsGSsc,1267
PyQt5/bindings/QtMultimedia/qmediacontainercontrol.sip,sha256=SZ2dVjG3C_OHhDiSCVIpO_brEsWIMRo6Y6pvhd3-t3o,1498
PyQt5/bindings/QtMultimedia/qmediacontent.sip,sha256=iGoXd6yez4jlp8o15CEYOd6rYV4KffQnturQkEJRxd4,1870
PyQt5/bindings/QtMultimedia/qmediacontrol.sip,sha256=7-Tk6HghZvmx95vmfenwKzFRtw77Vwo9FrRJXK503x0,1294
PyQt5/bindings/QtMultimedia/qmediaencodersettings.sip,sha256=iWzpwCX64CXh_bqvZCvn51R-TfVjYsqAaNzfe9x_zCg,4158
PyQt5/bindings/QtMultimedia/qmediagaplessplaybackcontrol.sip,sha256=1X1prIbvkFjsq07Qej-3gWkmKjFrVOiTuq7wIHHuvJ8,1698
PyQt5/bindings/QtMultimedia/qmediametadata.sip,sha256=zywmhwsIKR2woxO6W71LTIP8HAtbzE4JqthTV7XXvlQ,3993
PyQt5/bindings/QtMultimedia/qmedianetworkaccesscontrol.sip,sha256=mrT8hKZ7LmATR8dXCwiiFt0sY2Acdqr_k0KeHSZAv0w,1510
PyQt5/bindings/QtMultimedia/qmediaobject.sip,sha256=PybY61rjzMKkYYm_XcQ3QAsvlTJHbTurhqCFknMXOks,2091
PyQt5/bindings/QtMultimedia/qmediaplayer.sip,sha256=6HaJ15M2hGn2hOtoS20hYA_65EvUr9t2PUsUXNWbB0g,5106
PyQt5/bindings/QtMultimedia/qmediaplayercontrol.sip,sha256=QXeMJFzEJrP0qLPTSbn441ueBjd34b57N7oYDqopsBM,2972
PyQt5/bindings/QtMultimedia/qmediaplaylist.sip,sha256=CoIe8OcDqqTWNwpBXQHDeHdP7fYVkSACw6pK18Wr0kE,3559
PyQt5/bindings/QtMultimedia/qmediarecorder.sip,sha256=shewg_d1L9FIuzRpurepCmWpmM2GH2oP0RgV1CEYyR8,4562
PyQt5/bindings/QtMultimedia/qmediarecordercontrol.sip,sha256=fdwsOFWt4sCqU0sOsuMoF7u4DtIUwRvcqrdE0w6QAGw,2134
PyQt5/bindings/QtMultimedia/qmediaresource.sip,sha256=cHotO3CcxfI1yoicJv9kaMOHMagg6zDWqMv1UDbGDSM,2337
PyQt5/bindings/QtMultimedia/qmediaservice.sip,sha256=Wz_NSDrlVXOEXZt6iX-p9W5_tdKOT-ivNlE7siSlFuw,1305
PyQt5/bindings/QtMultimedia/qmediastreamscontrol.sip,sha256=HJAUC66h3W8xs5jGJWvtUDPqO1XSWI82U1RhPXoNfD4,1762
PyQt5/bindings/QtMultimedia/qmediatimerange.sip,sha256=lgX1SJ_MFrFVmTYlF-Szr53Wk33rXJg8vSovK0yj0GI,2967
PyQt5/bindings/QtMultimedia/qmediavideoprobecontrol.sip,sha256=X1kvyP8MxIkB9_Tv_EwDltCdaj9EOBXemDqCCfuPXIE,1331
PyQt5/bindings/QtMultimedia/qmetadatareadercontrol.sip,sha256=vh4Bnj_hT6_TMekDEjFWn89vQqooLIVYiKOBp3vvXRU,1573
PyQt5/bindings/QtMultimedia/qmetadatawritercontrol.sip,sha256=xyI9VB2eq8LPDQDTVQ98bFSTS7xyASguTC6-Tw0ptn0,1735
PyQt5/bindings/QtMultimedia/qmultimedia.sip,sha256=J36elHmaoLUIWvYuZbYHLRfFbUsctL5eWaEBFqyS8bk,1661
PyQt5/bindings/QtMultimedia/qpymultimedia_qlist.sip,sha256=AbqrTxpaejsBEjPTGuSqeBv4jBU7Kas1-XooC2aIZOg,9462
PyQt5/bindings/QtMultimedia/qradiodata.sip,sha256=AcL4Zve6oViEgbeUtthJuTajnRMqeKWSxNifE4u8E3M,3284
PyQt5/bindings/QtMultimedia/qradiodatacontrol.sip,sha256=I19bFLBPgFeRIy769-dKJ1gy6c6zyQsPkNpXE5-lY_M,2076
PyQt5/bindings/QtMultimedia/qradiotuner.sip,sha256=0M64qzZU1-azam_VYa-E2CAnnhI2RU0ivKDDSefe91Y,3392
PyQt5/bindings/QtMultimedia/qradiotunercontrol.sip,sha256=qZgsCzYHZMCMk4JKGFcKfyL7hjcjiesr9qDCq2Inkts,3037
PyQt5/bindings/QtMultimedia/qsound.sip,sha256=L12W09C_XV1J1x6a6bEYvps4PWjgVyP7RPTw8b-pxPk,1452
PyQt5/bindings/QtMultimedia/qsoundeffect.sip,sha256=ZwW5lTf-dNEh9p1vXr4dFEDHlt7s954iU4yT5yTTZiI,2268
PyQt5/bindings/QtMultimedia/qvideodeviceselectorcontrol.sip,sha256=1H52mlg0AK2ew6FcGJ1pLyFp2ecGlFsFDhrLmzfpO1M,1719
PyQt5/bindings/QtMultimedia/qvideoencodersettingscontrol.sip,sha256=wP8hZ7Xf2UIvX9ExfNRkA4ZLsArDCNBg-pwyLT4xdYw,1785
PyQt5/bindings/QtMultimedia/qvideoframe.sip,sha256=bgHho2bf21tD0Zu_Nu-LMh37uCKnex3JOlIqVBgo9pg,4494
PyQt5/bindings/QtMultimedia/qvideoprobe.sip,sha256=6yP_OAjmwDwwB5JjiTRZHA4_vQPA5lA2cAlKg7TJKFQ,1372
PyQt5/bindings/QtMultimedia/qvideorenderercontrol.sip,sha256=VvR1_T1ozqxoaALPeqs60BPxaodMKyKgzIwWLLLLkvo,1359
PyQt5/bindings/QtMultimedia/qvideosurfaceformat.sip,sha256=P0BJuThhLiswUewQBiPSe68t_GzaGTtWD1deOqHBLH0,2933
PyQt5/bindings/QtMultimedia/qvideowindowcontrol.sip,sha256=seUneAexkzMl4kgYnCfD1wSxztbQMZSA17_TTqXltDo,2307
PyQt5/bindings/QtMultimediaWidgets/QtMultimediaWidgets.toml,sha256=5aszZH0lGWyVJ5x-jaf6N3Yg-spw838eXWToeDdEj0o,194
PyQt5/bindings/QtMultimediaWidgets/QtMultimediaWidgetsmod.sip,sha256=2WbZqIwJYwGzzuKwsy2zBQY_uQbl0PCFj1LZmJhRJrU,2194
PyQt5/bindings/QtMultimediaWidgets/qcameraviewfinder.sip,sha256=yEBtXOgDvvDldNx6Axh3u3OsWykkcWDwrlXZdaYhnr0,1434
PyQt5/bindings/QtMultimediaWidgets/qgraphicsvideoitem.sip,sha256=tvaijTVXQfwwzpw8fWgP0JEP-cTnUyGcYTe9mgC_EG4,2301
PyQt5/bindings/QtMultimediaWidgets/qvideowidget.sip,sha256=v8Ffn48EgmdV1cBXpYojIXIeAf3gTfw9qPnNTzWFu3g,3260
PyQt5/bindings/QtMultimediaWidgets/qvideowidgetcontrol.sip,sha256=oLLJa5nBKD4d8Gqu-ia0F5XBG9rftSpOK4PdqITXWWA,2071
PyQt5/bindings/QtNetwork/QtNetwork.toml,sha256=ZF8lIMEK7V3PFgZff-On4iUfUeoTnVNyQG_hWGmi4qM,184
PyQt5/bindings/QtNetwork/QtNetworkmod.sip,sha256=D9-4dH2BmkbZwGq-1RDzIdqdigAeBJ16eIW53MAevWE,3184
PyQt5/bindings/QtNetwork/qabstractnetworkcache.sip,sha256=3MzrpGhWzvjdfRjtKPU5ZQzyjYTh8wvPYkjnyEs06cQ,3069
PyQt5/bindings/QtNetwork/qabstractsocket.sip,sha256=-yNVEBgeMRCJ3MUPXFYkCRRj8sfJEWdbi0vav31a3t4,10800
PyQt5/bindings/QtNetwork/qauthenticator.sip,sha256=zELgNCBJG6rYoNtcopEYtdc0Oq-X3I9L1KjX5hXnRk0,1628
PyQt5/bindings/QtNetwork/qdnslookup.sip,sha256=pLiI09iFA_L2TkXiyEUWcQbXetyCqQowcX5_3iqeyhU,4864
PyQt5/bindings/QtNetwork/qhostaddress.sip,sha256=Y82TbyPFCvFtTzUYbAjsB5Cy6bvbxxxkpTCCO-EGsxc,6167
PyQt5/bindings/QtNetwork/qhostinfo.sip,sha256=LJEde2G9I1bk0bX3z7oEC4kZdVzgmyqDuLDS1ybJR44,3099
PyQt5/bindings/QtNetwork/qhstspolicy.sip,sha256=sLcIooTgT9eYq9c_9JMDqCBnyTtEACuYYsZpa7kcTvY,2174
PyQt5/bindings/QtNetwork/qhttp2configuration.sip,sha256=9612cpERDQdq4T7lgjQ4ZtlL4qbL7si33zmBmTH3MuA,1987
PyQt5/bindings/QtNetwork/qhttpmultipart.sip,sha256=tbguXB17vZj-sR7sqA0eqWFxbjxS-QNaBPmGq2wLRfU,2175
PyQt5/bindings/QtNetwork/qlocalserver.sip,sha256=hXVR23lBaU7oDMEF6FJC4mke51052Zq3VLWe1swjudM,2436
PyQt5/bindings/QtNetwork/qlocalsocket.sip,sha256=G64UcEpNKJP-PuJcY1TFiOTJQEVkSFiu893CBx-eWb8,4647
PyQt5/bindings/QtNetwork/qnetworkaccessmanager.sip,sha256=WEb5cSprS9ajLLc7PRKO7ZHy7Cl_a5nKqsh9wYB8SVg,6052
PyQt5/bindings/QtNetwork/qnetworkconfigmanager.sip,sha256=3tAPpKhMw41J1nefY_4dOXy5AAU5niBsRKOncr1m2HM,2584
PyQt5/bindings/QtNetwork/qnetworkconfiguration.sip,sha256=YJAWRxOi0tauzwRRwYNwbNR-XruMfB8vU-1J5zupBQc,2906
PyQt5/bindings/QtNetwork/qnetworkcookie.sip,sha256=-fOBaSSibsjSGjJfb7XIuG8wI0ssehdEAE1JO3CoaO8,2305
PyQt5/bindings/QtNetwork/qnetworkcookiejar.sip,sha256=K2z7pXaJBS6aKXDTk2_dDYDYsf_-qq2MmfQLEyn73x0,1761
PyQt5/bindings/QtNetwork/qnetworkdatagram.sip,sha256=qjSiFipeWTWh9b_KmykKCIwQRIw_U7NfM6tOh_dmveQ,2020
PyQt5/bindings/QtNetwork/qnetworkdiskcache.sip,sha256=jef88IeiCs37q1OAgedTWoq25dG9bzBBtRuvlGLADOY,1931
PyQt5/bindings/QtNetwork/qnetworkinterface.sip,sha256=Ou-K9e_YExeCvwvdb6htLYSghh4l3sVL9HW5-1pCeO4,4334
PyQt5/bindings/QtNetwork/qnetworkproxy.sip,sha256=C9UCdSWA2N64ThLpRFhyeQJwPA77CU5pPvyM2mhn38Q,6066
PyQt5/bindings/QtNetwork/qnetworkreply.sip,sha256=9oFEZDN6n3LtEEFjRto6QP38OYtJLCv7sITBgqqIl9I,5309
PyQt5/bindings/QtNetwork/qnetworkrequest.sip,sha256=XyFg9jAGs2gMdPi1OdAt7jyVfyizqaZQUTvHv1XyW5Y,5549
PyQt5/bindings/QtNetwork/qnetworksession.sip,sha256=L8Rj0whmjKByG_U_YBT-pU-pLqy6b4qQspZTeDh3vJI,3012
PyQt5/bindings/QtNetwork/qocspresponse.sip,sha256=w9mJ3DZUAxae9B5DTiJTrJM4_66rkEYyJfNN9A5swWk,2264
PyQt5/bindings/QtNetwork/qpassworddigestor.sip,sha256=CMIKWRevLNJNM_ykdvYH8VOOVhVuQPWfEVG0S8qjYzQ,1439
PyQt5/bindings/QtNetwork/qpynetwork_qhash.sip,sha256=c7F9H4zIfAEjWRLhQRqbAWHOUUKsw_-k9QecR4e07uE,3590
PyQt5/bindings/QtNetwork/qpynetwork_qmap.sip,sha256=EuLf5yvAe-PAIVuej_kNoecNIOpOIvnrI_T0vm6YpE8,5232
PyQt5/bindings/QtNetwork/qssl.sip,sha256=qfJGwxo7Yi8ZP_jwkNalCktjAnltmiWFjpwvsR90IuE,2771
PyQt5/bindings/QtNetwork/qsslcertificate.sip,sha256=oTeOwrb8fkHtTZKVcOwmw2Zwau835WLgiu13JC8mE44,3964
PyQt5/bindings/QtNetwork/qsslcertificateextension.sip,sha256=0U6FvPHgEp85CYBvYJRBPTHobIq-LDHfxXJtSyCMMFI,1469
PyQt5/bindings/QtNetwork/qsslcipher.sip,sha256=oUHQnBwCEGvjqe6h3MCDMS38jLxGedS2JwpwS9qxhwc,1769
PyQt5/bindings/QtNetwork/qsslconfiguration.sip,sha256=Yfn1zZVK7ELjARyZ6v8N2yzsPR9nGzN7GeQkkrIsQDo,5450
PyQt5/bindings/QtNetwork/qssldiffiehellmanparameters.sip,sha256=lXvrKPpD2IFfwDvTleL_72UaYBmV8vDEKuEDL8brkK0,2345
PyQt5/bindings/QtNetwork/qsslellipticcurve.sip,sha256=p1CYlgRa44Z6hJyQCTNti5qhxta4QWlnDIHfr4D0nrk,1712
PyQt5/bindings/QtNetwork/qsslerror.sip,sha256=FjxO2L6aCFAW5Xe9cM5l-QW92T6uG2txKCZP4BmAFdw,3206
PyQt5/bindings/QtNetwork/qsslkey.sip,sha256=nbr4NqG5Ab0_EJg1TFC3rzyGlhbzP9n1BdimOguUKDI,2072
PyQt5/bindings/QtNetwork/qsslpresharedkeyauthenticator.sip,sha256=P760AAE2vAid1MYRBgR8VdtJtXnG_qpEOw1IHqnIOgU,2006
PyQt5/bindings/QtNetwork/qsslsocket.sip,sha256=K75KOF_QkgPtEGLRN_pY6sqGODnFBa15D8FBgpfvOCk,8303
PyQt5/bindings/QtNetwork/qtcpserver.sip,sha256=dVjD0Ce2iCCJJgtjv9PdJ1UcI4RUG__3uPAqpKtrPVQ,2197
PyQt5/bindings/QtNetwork/qtcpsocket.sip,sha256=USDXVVukSBjbM6WjabId_OGl6xwQ4l6eqUEmqOMvFQo,1166
PyQt5/bindings/QtNetwork/qudpsocket.sip,sha256=UniWoIEJ4lBTDgXMMw30O7n6xC3tmp4mIJU5FivvLfE,3105
PyQt5/bindings/QtNfc/QtNfc.toml,sha256=Vr2wajB4PKcC9imX3wMtrWr6P4u9ZqI-JFFm9A_4TBw,180
PyQt5/bindings/QtNfc/QtNfcmod.sip,sha256=tFDFoweYzt8EO7aYZeAHDq6gqhPcJ_xhrXfnw38z7H8,2297
PyQt5/bindings/QtNfc/qndeffilter.sip,sha256=X_jwD8KBcWKP-TJoWHabG2frEnfB_BsJ3cyWWqZTgiU,1766
PyQt5/bindings/QtNfc/qndefmessage.sip,sha256=tklaX0jDbGSLs42BNumCPQ_-wKk4PNSaIyNUcvYJMgE,2252
PyQt5/bindings/QtNfc/qndefnfcsmartposterrecord.sip,sha256=mFbdWFEhYlLwJLTd1Ltd4YabJjvbNkdAr4UFRMi5wvo,3441
PyQt5/bindings/QtNfc/qndefnfctextrecord.sip,sha256=Ks5rHDtSZnxumowXgNQdDLGqzYCgxpBo92qyeoE-xjU,1520
PyQt5/bindings/QtNfc/qndefnfcurirecord.sip,sha256=sTiYvrfm6uKWWdWVAZH-D-0pTrpJ0shrxo83AafczbE,1251
PyQt5/bindings/QtNfc/qndefrecord.sip,sha256=u1Qh9PtyaOoQb45ks51HRiOkrk3owchOFYA1w371J1g,2605
PyQt5/bindings/QtNfc/qnearfieldmanager.sip,sha256=nbXDzp9QohO1B-MdBY0tJ2auCdGXEVEHiC5jJOpqTWg,5384
PyQt5/bindings/QtNfc/qnearfieldsharemanager.sip,sha256=7MRZLX52PHkNeAfShOGUHzsIs6hWXf1nleqi-xG3lYQ,2344
PyQt5/bindings/QtNfc/qnearfieldsharetarget.sip,sha256=L9TjUAqIscLsxU8RGLF0itVmyb62v82IGCxjiPB3eZE,1550
PyQt5/bindings/QtNfc/qnearfieldtarget.sip,sha256=Xx2pzYbdRbdDWuGI3Nra6PiWnBrUVwF-nlwHYm_uv0E,4233
PyQt5/bindings/QtNfc/qqmlndefrecord.sip,sha256=D_DMMtRr7B5CSMWbqQy4Z7sRufMMVtcKSk5kq7V6vSY,1834
PyQt5/bindings/QtOpenGL/QtOpenGL.toml,sha256=lKNQLg_6_YvW9MkycLFk3tXf8iiaSJ1qI-u2N9b_p54,183
PyQt5/bindings/QtOpenGL/QtOpenGLmod.sip,sha256=buBes7T-ui-b3oadDeAE1ayYDtlJ1ONyQavWR5fM0HA,2039
PyQt5/bindings/QtOpenGL/qgl.sip,sha256=0i5uuQWaQ-Ju7fHDCNg8E37ZfewAq6V8w9Ry8knTcYE,11047
PyQt5/bindings/QtPositioning/QtPositioning.toml,sha256=hdolSHBEoh_kIEjNGfONo1cb_EU39DH4WKk5q6nvbCg,188
PyQt5/bindings/QtPositioning/QtPositioningmod.sip,sha256=lMYwfCuFva17vJGPakv_CSMpJkdcr01ihjqFTOy4RcE,2387
PyQt5/bindings/QtPositioning/qgeoaddress.sip,sha256=GcQiCfGcLKAVzJf82Zdv9Juub9XcKrNuxVIx_8ux_Ww,2045
PyQt5/bindings/QtPositioning/qgeoareamonitorinfo.sip,sha256=rAhYujAre_HURjTAv-PJ5uxO-3YWCKJwv9NdZ8vQFoE,2088
PyQt5/bindings/QtPositioning/qgeoareamonitorsource.sip,sha256=aUFAWwhOYf3C5auJb2Q316ny9KJLgxltwuvJlnGctdk,2971
PyQt5/bindings/QtPositioning/qgeocircle.sip,sha256=FBsMiPzUzqI3VaQraC34xPTyNKuQnsE6VRTcjtADUew,1836
PyQt5/bindings/QtPositioning/qgeocoordinate.sip,sha256=BMrQQTRF2w1eTxnuUeoAAIQcUnKaVvPwCi87OVlTdAc,2765
PyQt5/bindings/QtPositioning/qgeolocation.sip,sha256=kUhYxAxG-U6yyZcgyvEv8A5Ci80MSWGvTv9pMgnpfS0,1748
PyQt5/bindings/QtPositioning/qgeopath.sip,sha256=b3Zg2kjXV8UgnmCzQOCKq9WgE18Tzs9MTBtzvjXznf8,2322
PyQt5/bindings/QtPositioning/qgeopolygon.sip,sha256=uQC9DD9sFwp8xXg_FrMC-7fD5rR8D9RAXSiDiLpyH10,2768
PyQt5/bindings/QtPositioning/qgeopositioninfo.sip,sha256=gu_tZSmKDDi4cLJ8hQ-HZXjwK9YcJyNFadazfnk-OUg,2318
PyQt5/bindings/QtPositioning/qgeopositioninfosource.sip,sha256=tAYqmmYuCFA7w-ogook2s9o1-CXOKjJUCiDZTT7QzoE,4504
PyQt5/bindings/QtPositioning/qgeorectangle.sip,sha256=UR3AXMubd1r2f505MWtm4eNEG2p6Zd1Nw1mYJIw8qUo,2846
PyQt5/bindings/QtPositioning/qgeosatelliteinfo.sip,sha256=bfcQnHXPZI0W-iSmQFaCBzBxkSwsMVLifOqcX6lSiuE,2321
PyQt5/bindings/QtPositioning/qgeosatelliteinfosource.sip,sha256=igCENVoKKbukSAtp8Fonybrx0r0yttSsUcX5cYXKxZI,2666
PyQt5/bindings/QtPositioning/qgeoshape.sip,sha256=6iFgwkR58mlVX5LG_6vYdlBj4zjEAlKhoU9G3AOSbzc,2684
PyQt5/bindings/QtPositioning/qnmeapositioninfosource.sip,sha256=xkE8S3ZbbzMqAkKKxa6oqpVK3LcDfi66HJHxo_GAHwI,2315
PyQt5/bindings/QtPrintSupport/QtPrintSupport.toml,sha256=iWixZb5IWcpYu_qgrwZ2R2FHnmNgMMDrzD461rpP-zg,189
PyQt5/bindings/QtPrintSupport/QtPrintSupportmod.sip,sha256=VRJQVV2K6EvSXNJQYYehWx129PEWz7U5T7VDUpknk0A,2313
PyQt5/bindings/QtPrintSupport/qabstractprintdialog.sip,sha256=IZdEiNSYzVnfyiO6N-S5uUy85ufMo25pf-DI8n4-l-Q,5150
PyQt5/bindings/QtPrintSupport/qpagesetupdialog.sip,sha256=QPQl5u0XBA1Wukn6yM8S1PEOSbwBRYcWi7kWBXSI-g4,3359
PyQt5/bindings/QtPrintSupport/qprintdialog.sip,sha256=vDtWhTyzCKIj5VongfK4zu765O9-yJ0gzwZYRFCjgUE,3748
PyQt5/bindings/QtPrintSupport/qprintengine.sip,sha256=Ggw30LWXg1dNEX9eQ4cRaYeaP_QupoQ6wTqj3SE3OhY,2501
PyQt5/bindings/QtPrintSupport/qprinter.sip,sha256=vr9OiQu5K-oBSH7Hr8_SMHmQvGo8RddShv-0POGJE7Y,5949
PyQt5/bindings/QtPrintSupport/qprinterinfo.sip,sha256=aA3nas2bF_USPxOSLKLh500lAYJzU1yMbK0IueuV5GU,2754
PyQt5/bindings/QtPrintSupport/qprintpreviewdialog.sip,sha256=lX9egB9EHx9z5S_A8tsf7ACX1eF9nqXc9IQ-FoQRoJA,2093
PyQt5/bindings/QtPrintSupport/qprintpreviewwidget.sip,sha256=wMg4p5CA83w2t6-TbteWofQK6KtZlJSi8sgnTl7P8Fg,2688
PyQt5/bindings/QtPrintSupport/qpyprintsupport_qlist.sip,sha256=4Tu3--nBj7zskiKpuLLGPj151GO44zqLVcpmBR1NWEk,7520
PyQt5/bindings/QtQml/QtQml.toml,sha256=9KKgk4W55sb4lJj74glqMD5kheHRx99tHl7o9rlj2pw,180
PyQt5/bindings/QtQml/QtQmlmod.sip,sha256=M29K3k_ydaVoP_Xdbq-BUwcdgEZGqIB4-yb4LhURZMY,2714
PyQt5/bindings/QtQml/qjsengine.sip,sha256=aqjD0SAPpJChfQ2MUZiMhH5QrJ_cNpB70M1Ts_XGFrU,4536
PyQt5/bindings/QtQml/qjsvalue.sip,sha256=jzSgkqMoM2knO1nDR7LhyMLs5XiZ9syz0AMupLd6szs,3271
PyQt5/bindings/QtQml/qjsvalueiterator.sip,sha256=dd6OEeibq4h5X_ktHEuiKnh0Rkqg_RzdJbbz54E8sgw,1306
PyQt5/bindings/QtQml/qmlattachedpropertiesobject.sip,sha256=ftoOMBAwhY_kLz7_LNRXDZiPPZuA2H9diX75luehq9A,1561
PyQt5/bindings/QtQml/qmlregistertype.sip,sha256=vSsKQbL97QcEeMtdKKFMAIzFpK-7NbEDsziFp99hbdE,3663
PyQt5/bindings/QtQml/qpyqmllistproperty.sip,sha256=tWZeDYFFWBrsqVdDlWo8O00SFb3lzs_IUVljeNAeEfo,1453
PyQt5/bindings/QtQml/qqml.sip,sha256=pF-vOQBlObsOqEpwtm81Qxavu9QE7j9NYIlnd7i5-5s,1154
PyQt5/bindings/QtQml/qqmlabstracturlinterceptor.sip,sha256=B6Owu1aKkJRMIy_SKx4Ka0dD-wWQr_Z2d1KIcBi4ROo,1423
PyQt5/bindings/QtQml/qqmlapplicationengine.sip,sha256=1mvujln5fF_r3ZoEC3Mir_lyKxD4RitMIBDWDNY9TEw,1946
PyQt5/bindings/QtQml/qqmlcomponent.sip,sha256=y2BlkORbyLXmdDZfHT6g9Zv5aDV6X3FAqL2K3XpH0fg,3092
PyQt5/bindings/QtQml/qqmlcontext.sip,sha256=LobePNezIE864DDmf2ZJmXBIdLvuozzEccDh_p5SIKA,2030
PyQt5/bindings/QtQml/qqmlengine.sip,sha256=_3d6G_ERv5gae5WmUfQkh_JhfWzp6k7zdy3gQ4vgl0I,6009
PyQt5/bindings/QtQml/qqmlerror.sip,sha256=8lWA09fIvXDQfD7K0BbJiW2qWs-emlnS3VecrGvRppY,1654
PyQt5/bindings/QtQml/qqmlexpression.sip,sha256=7EFIWXuZa1K67Cu1jeXLiDv-10MuKn6RC7dRFi6rR6k,1977
PyQt5/bindings/QtQml/qqmlextensionplugin.sip,sha256=lBBYbxNik_eNgvE-ShOg2BYwFTRjB5rfMEQCPCH9mVI,1719
PyQt5/bindings/QtQml/qqmlfileselector.sip,sha256=1e6vZddp9cUVYRCglw0Q5MrHy1dgQRTRpczZaMBslfw,1538
PyQt5/bindings/QtQml/qqmlincubator.sip,sha256=cN0LakdgAZab2FU7m0dVcUstFaSu-yIa_ofwG3ESJBQ,2442
PyQt5/bindings/QtQml/qqmllist.sip,sha256=hLJ5oFHrsFbBuIveBwQdg12ztMPtyVZrRun9aLlXNvc,1868
PyQt5/bindings/QtQml/qqmlnetworkaccessmanagerfactory.sip,sha256=9eKdl_yJJ9Xs7onZ1LO-3auU1fEooUJO5VWuXs8N8xM,1231
PyQt5/bindings/QtQml/qqmlparserstatus.sip,sha256=CYBG4_bvWyo4dTROjjRAcbIO3592euYl5ZLZlBjDM4w,1269
PyQt5/bindings/QtQml/qqmlproperty.sip,sha256=PCS9i0nE4tiLCc52WQjAm1yi8ThkMZIc0aFczu6X2KI,4127
PyQt5/bindings/QtQml/qqmlpropertymap.sip,sha256=ZS9aIxDL4VQGbI4n60WA8qSntstmkz-F8LB06_42dxM,1708
PyQt5/bindings/QtQml/qqmlpropertyvaluesource.sip,sha256=tIAKSiqnlGhmwx9ca_CP4XfSABoxqD--BlkyaxruDQw,1287
PyQt5/bindings/QtQml/qqmlscriptstring.sip,sha256=GzhFJM6rM506Cwshgp_hk9_Rjpv_dOcVOkIDKkjReWI,1546
PyQt5/bindings/QtQuick/QtQuick.toml,sha256=qrW8PJ9kpmPlRzPCmjQstxkUsx-6h8mSQZULCufama0,182
PyQt5/bindings/QtQuick/QtQuickmod.sip,sha256=bWvimTfszY9m6DNH5IaV1RipO1pwhBGZgFJOY6j5Ep0,2811
PyQt5/bindings/QtQuick/qquickframebufferobject.sip,sha256=ssXDd-f-1GLlJpuivfT06Eq-4LTpI0FvYQumXuI_Jo4,2633
PyQt5/bindings/QtQuick/qquickimageprovider.sip,sha256=RJialPboAwGm8z4dncmqCil8kXEJgwzYRlPEd5hGEU8,2982
PyQt5/bindings/QtQuick/qquickitem.sip,sha256=LWuly5yEIXWSNMHKEjTyS37Q2LgtoTSU6PeEWymawZs,10071
PyQt5/bindings/QtQuick/qquickitemgrabresult.sip,sha256=LRhTV6K1GmbqadHAqVwNsEMtpT1G8NyE4y2qIATrzAE,1487
PyQt5/bindings/QtQuick/qquickpainteditem.sip,sha256=COnWdasWdYhwTlCQsnHBIw5qQc5MoRwjSpsC56USupI,3480
PyQt5/bindings/QtQuick/qquickrendercontrol.sip,sha256=IKfwPzPT6hdTz-HaMKVY0wYC2GTVcQ19l3dsxjqPZcg,1781
PyQt5/bindings/QtQuick/qquicktextdocument.sip,sha256=isI8bSYrZvBXHfzEmidDQSIllMdkAXusXBjtbkfPnFA,1285
PyQt5/bindings/QtQuick/qquickview.sip,sha256=kXwGXENln9RCc-lHhI_BETdk1WCrFrNHQVkWF9X4dIQ,2445
PyQt5/bindings/QtQuick/qquickwindow.sip,sha256=iYHeLd2ZIvxEKIlvvvxj-MRf663VwCZM5TGWZS_Ylhw,9221
PyQt5/bindings/QtQuick/qsgabstractrenderer.sip,sha256=xyNHW0-xq2ZlqxtDDgJPP62ZL9H-oGVqEuXBdx1x5GI,2559
PyQt5/bindings/QtQuick/qsgengine.sip,sha256=6x2xRvhvUio8occUGcIAambcEi2g4ZuyLMCXA0vIQlQ,2223
PyQt5/bindings/QtQuick/qsgflatcolormaterial.sip,sha256=fIV7_aUi8fXGWUkZwZvPaAWOLczThFtUkYF5uC2Mv10,1370
PyQt5/bindings/QtQuick/qsggeometry.sip,sha256=ojO_JH5AuRmA_cZMBkEHiun-7gb0fmDrhSH-u9BcLZo,12824
PyQt5/bindings/QtQuick/qsgimagenode.sip,sha256=biVnWNPRTtmeHNvxg0X4xNMw93U0IyLmjkeoVWwZCew,2891
PyQt5/bindings/QtQuick/qsgmaterial.sip,sha256=k5gAt2v_VAR2vFVyj6P40KADblAFBXOLocTgSVTiHzo,7874
PyQt5/bindings/QtQuick/qsgmaterialrhishader.sip,sha256=PAw7-o9hV_VAOgOGQ6CVGwIwmANVPzx-DDkM3_LwUTU,4048
PyQt5/bindings/QtQuick/qsgnode.sip,sha256=93n0f8LRmWAcurBuiWrYQAx_xSgcUFcnorpkC-ZHa4g,9134
PyQt5/bindings/QtQuick/qsgrectanglenode.sip,sha256=nzePfS6AoGHzI0ZLXbmGotqfsPA_aSgBCDjtU7_U_Pk,1407
PyQt5/bindings/QtQuick/qsgrendererinterface.sip,sha256=ZX_IxafrYcA_OS6s7LRdgBhgNxNdjNW-a0uFuXeRKNg,3601
PyQt5/bindings/QtQuick/qsgrendernode.sip,sha256=QuYAEBk9w9ghLTLOAMh4lK-FrP11PJONaI51nO5n9NY,2784
PyQt5/bindings/QtQuick/qsgsimplerectnode.sip,sha256=sTSqIRYbKitzSvYSogVhedX93TEWqxDy8HryCvCmpWU,1391
PyQt5/bindings/QtQuick/qsgsimpletexturenode.sip,sha256=11dauYAwq1YzO3cJ9uxidNsISOMlJTgOTKAI03iwXNQ,2600
PyQt5/bindings/QtQuick/qsgtexture.sip,sha256=lfIYaPFxjiCBarWoMp_Oebgknt_LUqDf-WPb5NUhnQI,3108
PyQt5/bindings/QtQuick/qsgtexturematerial.sip,sha256=SsvaIrF98Qm7YbQADaTt1qkZOMHiqszafETLW3ROhJs,2226
PyQt5/bindings/QtQuick/qsgtextureprovider.sip,sha256=h6LF1CBZylWT9YQ-vtsU0cHbtJHsQPgaS7qJP8_1V9k,1186
PyQt5/bindings/QtQuick/qsgvertexcolormaterial.sip,sha256=T0l-4SKiN0TY9Pjc2VFAGc0JATINN4HXSrymrhLXrps,1317
PyQt5/bindings/QtQuick3D/QtQuick3D.toml,sha256=r6sSiNXIx7mJhRaIyWLX7VFUmpPmm7SwxBgZZwFLLRM,184
PyQt5/bindings/QtQuick3D/QtQuick3Dmod.sip,sha256=OWT3nJUNbdE8qLeXCEF0awKTZ6TZzkPpGFOwIpSQ-go,2099
PyQt5/bindings/QtQuick3D/qquick3d.sip,sha256=nqmUoX5wlzYam45KQmVdKoZS4it0SnLtbxYGlg1g93w,1146
PyQt5/bindings/QtQuick3D/qquick3dgeometry.sip,sha256=2ysmVDtI0GCPLNs_mgNLClj3aALHbSiVSshjY8E22lE,2989
PyQt5/bindings/QtQuick3D/qquick3dobject.sip,sha256=INyi2ah_yRWYeNvMdjwFTM8iIa3rWW1WtrLL0H1xOQA,2186
PyQt5/bindings/QtQuickWidgets/QtQuickWidgets.toml,sha256=zAMAGcoi9wu1gVJCYX9K-pz7EY08OuUMO_GNBM9zXsA,189
PyQt5/bindings/QtQuickWidgets/QtQuickWidgetsmod.sip,sha256=Tb_-3QDHLWOCIL4_9vL5K-pdtqKJaTd6L9wDYJgkYxM,2126
PyQt5/bindings/QtQuickWidgets/qquickwidget.sip,sha256=cdq2yg7xQsCejU1W84MhEsnijwbfIUZ1DosdHg37QjI,3740
PyQt5/bindings/QtRemoteObjects/QtRemoteObjects.toml,sha256=jxSDs2-s5qA3o5VQHPgZhABvPj963sTJs7ItLWmqTGo,190
PyQt5/bindings/QtRemoteObjects/QtRemoteObjectsmod.sip,sha256=raKGjjCUpbDpSxwNW_imU7YwSSAUnnfG1t_IAPsa7HU,2210
PyQt5/bindings/QtRemoteObjects/qremoteobjectabstractitemmodelreplica.sip,sha256=1Qj4r4qMfXRe_qy5kUeH8fHM4T0gmBE-Hc5dnUsmyvc,2383
PyQt5/bindings/QtRemoteObjects/qremoteobjectdynamicreplica.sip,sha256=NfCqr399t4JWBDutD6PkewKOBWeuXXCXCQDanEwJisY,1260
PyQt5/bindings/QtRemoteObjects/qremoteobjectnode.sip,sha256=XbN7IPa1gT2EBwvBTOs6zB5YNhWjBFsyKSj0uQcpZYY,6707
PyQt5/bindings/QtRemoteObjects/qremoteobjectregistry.sip,sha256=36AJRN0cW7rZtF3JF2qxu38WgPk8iS2IKm1r-HsAhzc,1473
PyQt5/bindings/QtRemoteObjects/qremoteobjectreplica.sip,sha256=jMc62ggI593bJ5ew9ckw59KQZXO7szm_w_DjPf5m5RU,1770
PyQt5/bindings/QtRemoteObjects/qtremoteobjectglobal.sip,sha256=F0DgO4b6N_RHKrzvmYdkFpK9ijslg1zmhyqHCR1JdMQ,2156
PyQt5/bindings/QtSensors/QtSensors.toml,sha256=fMLVjbXYpIXmjZJXZrLjx4rj0wXFEE8HdIhh6taRYoM,184
PyQt5/bindings/QtSensors/QtSensorsmod.sip,sha256=Rmmr81T7HnfhUWf3tZRaNOUURmKWkoJlx0-pk2g7Igg,2535
PyQt5/bindings/QtSensors/qaccelerometer.sip,sha256=6SbDAIfJphrB_-FiWA-fqDPk1AqrdqYRYnS1Ls4HlyI,2118
PyQt5/bindings/QtSensors/qaltimeter.sip,sha256=UCeWMLVrUyiY8GL09xaRUuFiAX-AvAI-EazEEQV28gY,1689
PyQt5/bindings/QtSensors/qambientlightsensor.sip,sha256=T_-9xarJnl3KYT2TUd4kHmRDmJ-a509WFO2XpT9vVFU,1916
PyQt5/bindings/QtSensors/qambienttemperaturesensor.sip,sha256=_lvbGAeFBRwFiFLO6yqS9F-4SDJ5A_3WBs2Sz_QA9cU,1869
PyQt5/bindings/QtSensors/qcompass.sip,sha256=wQd1FCNzZls-Jr8eaiX1tJd1wTeIZrWXlQIwz3b7cew,1752
PyQt5/bindings/QtSensors/qdistancesensor.sip,sha256=PhKmBluxDe_XVACJaYGi80Ao-pRAA4YdI5rtO4jjpvQ,1730
PyQt5/bindings/QtSensors/qgyroscope.sip,sha256=72xZ4p2A2Kus3eA0MetNV1SZOuNa2YGAezMwFsdUCUo,1762
PyQt5/bindings/QtSensors/qholstersensor.sip,sha256=ib1P96-9BWIq_iEo_-HKUbFhQdzCbBSJqsgCSxpA3no,1718
PyQt5/bindings/QtSensors/qhumiditysensor.sip,sha256=GjtKuxjeu4m5ZGUx5dqcSv6OUjwo6DKXBOrW0mt1LlY,1767
PyQt5/bindings/QtSensors/qirproximitysensor.sip,sha256=24SdBPD0dZV4ZZ40ekgAc4-BX3K6TtWJhPK0SsnYg6w,1778
PyQt5/bindings/QtSensors/qlidsensor.sip,sha256=TYFm1OmU0gaLd-1lgXAeQu7My932UScyT7eFYirdfIQ,1789
PyQt5/bindings/QtSensors/qlightsensor.sip,sha256=xNGZhDNitOeRw8lKOwnHGSjwpf4hsOlQme54ByEsBgU,1814
PyQt5/bindings/QtSensors/qmagnetometer.sip,sha256=qY4EjMPl38e4P12oOSTyy3-Oz1vR1i54Ak66rxsoYVM,2048
PyQt5/bindings/QtSensors/qorientationsensor.sip,sha256=5_vgcUi227xZTChHQEoM2nwRLW0emQkomqh96PnRBF0,1996
PyQt5/bindings/QtSensors/qpressuresensor.sip,sha256=Gw6g3m6P3FQ72--saH0fCThI27GFr-bvxOIwkDJSXrs,1855
PyQt5/bindings/QtSensors/qproximitysensor.sip,sha256=bo7DjUeKu4PGfoTnTTiKY2MMROKi0UPmfCPf1ISaQ1A,1732
PyQt5/bindings/QtSensors/qrotationsensor.sip,sha256=-_Q7HXQeE15lw5Lkhj88YAsTH5uXMyiHfrHDmHyQEDQ,1879
PyQt5/bindings/QtSensors/qsensor.sip,sha256=bmYYl59PX1CE3zFMi4BRz7B3gcfrkApcb8p9EFejZh0,8664
PyQt5/bindings/QtSensors/qtapsensor.sip,sha256=_qBaVUxcxsMubaI0_v7zaBrEyyW31b7MrqB3SBvQI6I,2216
PyQt5/bindings/QtSensors/qtiltsensor.sip,sha256=mX3Oh11m52ruJMMMAaNEmUHYxM6TKiP9vlK6_wiZM8c,1759
PyQt5/bindings/QtSerialPort/QtSerialPort.toml,sha256=ALnG-i8tunkaoiqWyfXE5zHp8YMWDHvao1sLtixdA_M,187
PyQt5/bindings/QtSerialPort/QtSerialPortmod.sip,sha256=8iO4hwxXSUZMeFxSzTqKmkOcqPNcvS_vw5s6fMLlGoE,2025
PyQt5/bindings/QtSerialPort/qserialport.sip,sha256=LI6pYsLMqqbYgW_3hYkpVTQUsZr1ecJOXAb5qdYsDdo,9761
PyQt5/bindings/QtSerialPort/qserialportinfo.sip,sha256=gjak6twHam-fPkUYGUz7sUnS9n897YUiWljIhhSCoqg,1897
PyQt5/bindings/QtSql/QtSql.toml,sha256=fCiqbX1BWdk2FHp1kW_UoC4SBGCkfMRzAI5fnpygSF8,180
PyQt5/bindings/QtSql/QtSqlmod.sip,sha256=QAFNiCAdUHCxOn0QRZST6dFStokpWM3qnWo_dywWBDM,2361
PyQt5/bindings/QtSql/qsql.sip,sha256=b5KTOQdSFsLeH2buzEGraiQ-2TfXxiSf3KxqNcJu8s4,1690
PyQt5/bindings/QtSql/qsqldatabase.sip,sha256=vt3pnnUDAb1-Duc6A6UA_GR_hydGkVrFQaePI13KXjs,3963
PyQt5/bindings/QtSql/qsqldriver.sip,sha256=0-QghNOhyXrTxlw6yD4voAfJWT0OZpRz7Hd0L9NUJZQ,5168
PyQt5/bindings/QtSql/qsqlerror.sip,sha256=I6ROhVF6ryDS6MHk-8EsMtKt4wMLaBFatewCPkXq43Q,2405
PyQt5/bindings/QtSql/qsqlfield.sip,sha256=3e6jqsB8OkYf607PoAKtSxC4UsyCMoltFWYGR4vZgqU,2569
PyQt5/bindings/QtSql/qsqlindex.sip,sha256=2FUijaK-f08O8w8bL6Ow7O3VfRtykJwrrDy9vPfr-7Y,1538
PyQt5/bindings/QtSql/qsqlquery.sip,sha256=XqSW44ExkLcUjhH-GTUj_WIXDqU84aKuCS_Vw8AG9_I,3258
PyQt5/bindings/QtSql/qsqlquerymodel.sip,sha256=EysfpNjuN-uUvRO2-fzIw7q_4y8jyyApZX9Rk685swM,3033
PyQt5/bindings/QtSql/qsqlrecord.sip,sha256=Kx4KU8m_wURxP2m8eKxmMhjUft_l6toVvT8JObV9f2E,2345
PyQt5/bindings/QtSql/qsqlrelationaldelegate.sip,sha256=C5ZGtP6eVNoBVGh04UdFl2-YwpGh8QS-8hmCjP8aEbw,1606
PyQt5/bindings/QtSql/qsqlrelationaltablemodel.sip,sha256=hTG1r9T4rGN5iXvMTL7pWucEj9dTDYAVvS1g0r77zrU,2716
PyQt5/bindings/QtSql/qsqlresult.sip,sha256=ncnUBGlHDYzNOroIesLEF8EbX_Nk5y6JHbaHqOw-qv8,3329
PyQt5/bindings/QtSql/qsqltablemodel.sip,sha256=B259SttBH63dvKpbCAKIFTO52ROzgKRPofwSV-BMIa0,3871
PyQt5/bindings/QtSql/qtsqlglobal.sip,sha256=PhAVk-wrkUXi2RxUiB-uP0p1Mcl_zz7nXpMFFQ-o6UU,1704
PyQt5/bindings/QtSvg/QtSvg.toml,sha256=KsCUFKz1wOXmxeFYTflmVwh6IAWQRs2yZT7P3KUec8U,180
PyQt5/bindings/QtSvg/QtSvgmod.sip,sha256=0lXMMSRa3rgnSej_Q5BnDdlzgAW8fe8PJgmKX3_5EhY,2123
PyQt5/bindings/QtSvg/qgraphicssvgitem.sip,sha256=D44qXo4q3LspdmVqdzk-taz8PlluSXYDuYrrjgdmzYs,2046
PyQt5/bindings/QtSvg/qsvggenerator.sip,sha256=hmBrqnvm65SYbVPPe6ASJw62aOFVx0-OFwfQJxA1C7o,1871
PyQt5/bindings/QtSvg/qsvgrenderer.sip,sha256=kWK5nc19Ii4jg3dFyTqaX40zS-3EtvHk-pSoHYuhQCw,3341
PyQt5/bindings/QtSvg/qsvgwidget.sip,sha256=Fl13Zm5UUVk2Phem72QWAkHrnqLTspETlfHybqWXOv4,1455
PyQt5/bindings/QtTest/QtTest.toml,sha256=-bZhzeQvrw9V1H8_ZKC66VvW9oI76JhWOIHmYqgRCDE,181
PyQt5/bindings/QtTest/QtTestmod.sip,sha256=nLge5gQR-_L0q17fo5QTuO7czjxWNdjkGApUxYkULug,2179
PyQt5/bindings/QtTest/qabstractitemmodeltester.sip,sha256=ATbfX942LYoKOkEJyY9dmNSmtWgiEoX-lUDZXi9G7ZA,1702
PyQt5/bindings/QtTest/qsignalspy.sip,sha256=TbdfhJ19Hy1Yk8YDLn3yPEcSvEfdhDrQIDuqmAjHdFs,3441
PyQt5/bindings/QtTest/qtestcase.sip,sha256=hjtw38CA_caUvr52xF19Sgdxl0--cJOcIylxmZkiCaU,1082
PyQt5/bindings/QtTest/qtestkeyboard.sip,sha256=TdXyc4NfrD8Uc9Bt511lnRBxxFNx-sEP6BC6e9XkTKs,3433
PyQt5/bindings/QtTest/qtestmouse.sip,sha256=oEWNH_wheTMt2RSpZljEHlCd780mDYl_nsRufPZex60,2485
PyQt5/bindings/QtTest/qtestsystem.sip,sha256=BPqO7JSrAPPTPtUCoOs2wdgnjBLF_Uz_JS6J8x066BM,1415
PyQt5/bindings/QtTest/qtesttouch.sip,sha256=NnyixpsAUahk3S62EYzMTybCidX5NgZD1QHq5HorLCU,2849
PyQt5/bindings/QtTextToSpeech/QtTextToSpeech.toml,sha256=Lj0sKos9lFrLakAZZSr6CHjSE6276ROvzBCX1eewTfo,189
PyQt5/bindings/QtTextToSpeech/QtTextToSpeechmod.sip,sha256=D4uGTLtYP0uD8Nf-SUGYh4bUdsofeM98ZDS91xfjRGw,2024
PyQt5/bindings/QtTextToSpeech/qtexttospeech.sip,sha256=Du40es_RJZ9d674frRWVP57ogyrXlBBZtGs_Xl4Iz-s,2864
PyQt5/bindings/QtTextToSpeech/qvoice.sip,sha256=OoVzdNCVcs0DW_BfISQnnCyt1FvuMYXEPGZ_ravt3q0,1624
PyQt5/bindings/QtWebChannel/QtWebChannel.toml,sha256=rPc9kebThOcxyyHGrFHHQXr0G9Nn0Kx0iafif1E9T0A,187
PyQt5/bindings/QtWebChannel/QtWebChannelmod.sip,sha256=XJt4e17sk-wmrZ0NDUItW-_wG7HFWaGOT1oxkKMbIjI,2038
PyQt5/bindings/QtWebChannel/qwebchannel.sip,sha256=LZgjJlLAzpk6xt-mZ0nNhPCjltj0U8eZVgvkmBGYvI0,2408
PyQt5/bindings/QtWebChannel/qwebchannelabstracttransport.sip,sha256=PDHjmd78dI6doBOpf4C-8GIaWj8R1ddu5IT_SwqyixM,1467
PyQt5/bindings/QtWebSockets/QtWebSockets.toml,sha256=OavowwJ7EbVhXxqaxVgivGLSFe68JQtYIw-aUflMGzg,187
PyQt5/bindings/QtWebSockets/QtWebSocketsmod.sip,sha256=G93_3bJNtJ7M8A0oQPTRcgY_N2RKMTMlwvAmRELK3wU,2165
PyQt5/bindings/QtWebSockets/qmaskgenerator.sip,sha256=tqhjnltKeESb5AW6XvnFHpn-75c7pKwkAA-zwpZWujo,1276
PyQt5/bindings/QtWebSockets/qwebsocket.sip,sha256=lr_T8PP9d387RVB00us_0WYA8CI_e4Moitcy__DXT-s,5602
PyQt5/bindings/QtWebSockets/qwebsocketcorsauthenticator.sip,sha256=_NSQuz8KXzyNXw_qjcaKTKjSbmnETTYlKh6UotKEJDY,1486
PyQt5/bindings/QtWebSockets/qwebsocketprotocol.sip,sha256=Uw-g1AhkmJigPSyKRE5yoS7CRmWo5lWbyOLca21iwnw,1803
PyQt5/bindings/QtWebSockets/qwebsocketserver.sip,sha256=izoo7TvVliP4MYIFJlbSGvSTgPJYexQfuMuJ0IPgzu0,3456
PyQt5/bindings/QtWidgets/QtWidgets.toml,sha256=jrJoxVLZuEV_IUmA6b6F0MDXFhlM38MJ4IjVSRHoro4,184
PyQt5/bindings/QtWidgets/QtWidgetsmod.sip,sha256=RzjUqU_6RLFoeecUJanEjNEHX0YT-rB_mDrHlumy5Tw,5379
PyQt5/bindings/QtWidgets/qabstractbutton.sip,sha256=zYEmjx9z99Lubg9sCkxb9dhrBlH_W4aUmqgOwRVQuRU,2829
PyQt5/bindings/QtWidgets/qabstractitemdelegate.sip,sha256=rIsM-OsthC2XxgiJVhZTcv5WeC8TXFHxOE6mVS8cSZc,2676
PyQt5/bindings/QtWidgets/qabstractitemview.sip,sha256=hIcVHZo0j3kQV6dMMWzpNyMkhg8EVlNwGFl6HmdaP_g,10870
PyQt5/bindings/QtWidgets/qabstractscrollarea.sip,sha256=7NwBP1A6rizZe5zchBgUYOpSbysg_OngYw5hf5OdWwM,3664
PyQt5/bindings/QtWidgets/qabstractslider.sip,sha256=uKBWEZv6lAy2dlEXmrJaE0rxGQWICITgfzsuBQd5OpI,3107
PyQt5/bindings/QtWidgets/qabstractspinbox.sip,sha256=NktYxCyCf-rmAEaDyzLbQwLUocfVkqVc3S5qxZZv8Fc,4336
PyQt5/bindings/QtWidgets/qaction.sip,sha256=0JbLYrEJqWVQcKfUmPKRn8jQUoTWIX8Hx2pTHYkmb4M,4454
PyQt5/bindings/QtWidgets/qactiongroup.sip,sha256=687hV-INSllEg1xGRBNtJIfFgsA7MbcDppIWT5DLuvM,2182
PyQt5/bindings/QtWidgets/qapplication.sip,sha256=xbHQIRg-F8ygZ1rkTRf1kO2zhV5fp_WsPHvrkVT7Hm8,16292
PyQt5/bindings/QtWidgets/qboxlayout.sip,sha256=dgeLVi3mf1ts9UCrpHst0Fyv-tQIpJmOaBuyLwPbdRs,4928
PyQt5/bindings/QtWidgets/qbuttongroup.sip,sha256=KyHHq4tyWDAE1OdeojD0694nEdK0clO_9MJ3bBpvlBo,2162
PyQt5/bindings/QtWidgets/qcalendarwidget.sip,sha256=BzPw-_Mxc_EKIqHFzsKg4Nj3QARTuJVl5o4SW04s6i8,4288
PyQt5/bindings/QtWidgets/qcheckbox.sip,sha256=HQ3G7mUx5KgeGsht11Z0lwUiBiiJRIy7eCe6IfzG-Ao,1842
PyQt5/bindings/QtWidgets/qcolordialog.sip,sha256=AEQTwcIwUC9EXIxM-qyhk_iYDIP05Wg4DWHFVbXH-28,3179
PyQt5/bindings/QtWidgets/qcolumnview.sip,sha256=pdOkVRCArtkm-RYDWrQDOhvpsormgYmqCTE0gx2Rnu0,2937
PyQt5/bindings/QtWidgets/qcombobox.sip,sha256=i8R9jHf-8ptIU_uXWE_W3uP0OkhPb7daIPRtHPHv2yE,6415
PyQt5/bindings/QtWidgets/qcommandlinkbutton.sip,sha256=xN-MDexaq1K08wJsf-4zsZKqgoGrzaZ0JSjtvYomuO8,1702
PyQt5/bindings/QtWidgets/qcommonstyle.sip,sha256=w8PXG8FmQTlfpF-irKHV8Z9dswWJjEZ5b_UU2LhyEVc,3191
PyQt5/bindings/QtWidgets/qcompleter.sip,sha256=JQQruF8pFjN-iQPBPr0HaK0TbjFpzJ4oxjQZqz4gtqA,3458
PyQt5/bindings/QtWidgets/qdatawidgetmapper.sip,sha256=IV_X50iSpvZ_GHj8uzOovgZCzKfpMSPhsoxztk4Sw1M,2506
PyQt5/bindings/QtWidgets/qdatetimeedit.sip,sha256=Ix48MkRD4bK6NpQCuTxaf3mH_neRnmffAaf9597BDsc,5438
PyQt5/bindings/QtWidgets/qdesktopwidget.sip,sha256=G1PISzR_FwUDfxPcjlx57cE3r_P5btKjaM-xkD93PSw,1961
PyQt5/bindings/QtWidgets/qdial.sip,sha256=pPMZZtmtazS3-JANYZaTP1VKgM5ruY04quC2oFTjAu4,1911
PyQt5/bindings/QtWidgets/qdialog.sip,sha256=rGwRwr10L7bFtDo016NJbZ7qYKDeuUH1qZO5KTUz5tA,3484
PyQt5/bindings/QtWidgets/qdialogbuttonbox.sip,sha256=TgN50DO49TdVGMp-swb4p3gh-Ve--8mkE3UjYHf1oDE,3876
PyQt5/bindings/QtWidgets/qdirmodel.sip,sha256=QLepcsp5FTySgijp1ehCQBrzPILh_OTGzYO-JBfoirg,3734
PyQt5/bindings/QtWidgets/qdockwidget.sip,sha256=kUVrUYTKq8iuibYV0Q_6Gou4nS-DrB7RIAqANK5rVI8,2875
PyQt5/bindings/QtWidgets/qdrawutil.sip,sha256=wyUqTUDjkvjL6QImtbImPy6-P9Bj6e52J568NjMGpRk,2769
PyQt5/bindings/QtWidgets/qerrormessage.sip,sha256=FC02xmsrYPiDzss2AayzfGBJaKeP5g5Ld3EUpAjtnDc,1430
PyQt5/bindings/QtWidgets/qfiledialog.sip,sha256=3C_EXERpD4Qthxv7eJvjKH6_6iQjfYkyPfmbba5VWbg,12962
PyQt5/bindings/QtWidgets/qfileiconprovider.sip,sha256=uqLjf0wV3WrnlIFqRZAUEJV1Reb6UYu8FXq50OVs0HQ,2011
PyQt5/bindings/QtWidgets/qfilesystemmodel.sip,sha256=jIT3X1ayZhBMRsDBm257Y9-_lXTiXCCffZ9IipQOJv4,5217
PyQt5/bindings/QtWidgets/qfocusframe.sip,sha256=00ZVA-Qr08-FtBsEWeNMHje_id3ah5SWjIikieEavHY,1424
PyQt5/bindings/QtWidgets/qfontcombobox.sip,sha256=6M3ybP7AwJFRp87nMv-C2i03-UVwqSXsAFndqox__Qs,1979
PyQt5/bindings/QtWidgets/qfontdialog.sip,sha256=AWQkH0_romaFPUBUsbdI1zJ-fxNFfy9X-pDvhXCUmsE,3205
PyQt5/bindings/QtWidgets/qformlayout.sip,sha256=uOQk8e2piWwwE1IH443Y9SBbfVFU7mwuGyX01Wme1DA,4846
PyQt5/bindings/QtWidgets/qframe.sip,sha256=OOxceoQiIJ8IbFHEEy2MvjRkGR2Ii1VEi7qGVa0lP6k,2219
PyQt5/bindings/QtWidgets/qgesture.sip,sha256=tsCGsa2-Y1AZ5QXZCaZzvXBr8luFmrAFBJvQuaxdeZo,5514
PyQt5/bindings/QtWidgets/qgesturerecognizer.sip,sha256=6psBPcwGe98T_0_zWWo-GDpcIxSsJIErRi720-8e4DU,1907
PyQt5/bindings/QtWidgets/qgraphicsanchorlayout.sip,sha256=nBUy8qskYytMVfhEnA_iUZNx7gBYacsoUL-SQcAlHkI,2807
PyQt5/bindings/QtWidgets/qgraphicseffect.sip,sha256=1egHsvjPlTOyV_hT8OAv36wPI_qVl5BodT4YCV970Po,5416
PyQt5/bindings/QtWidgets/qgraphicsgridlayout.sip,sha256=ihaFkxlshPOqeNB6XaUu1zIiyFAn1G_6x6dmhqyUbCQ,4307
PyQt5/bindings/QtWidgets/qgraphicsitem.sip,sha256=jONt4i5Qd7AAT7VQXIehYPimfL4P_hEpGj25t689s2I,27666
PyQt5/bindings/QtWidgets/qgraphicslayout.sip,sha256=4CdpekxyynyqDOESWStu344rt7_kCbpimYY3IfgyrsM,1775
PyQt5/bindings/QtWidgets/qgraphicslayoutitem.sip,sha256=M5ehV5TR_siNyIWGZckOWctE-LM-6sbGI_5TcoVnxHQ,3163
PyQt5/bindings/QtWidgets/qgraphicslinearlayout.sip,sha256=Hg6Dw3WA1HrNRZf8pPtPWQPljwUPRiRlfwiZ_LwAn4s,3229
PyQt5/bindings/QtWidgets/qgraphicsproxywidget.sip,sha256=euiNETDmIXLinkLaIoNmULt91_869OtXj6OHIYQTmRs,4008
PyQt5/bindings/QtWidgets/qgraphicsscene.sip,sha256=n8ms-LXklwRRbZ0ZKiTgd_4EW4IRgDsZ-vKHPT8yrk4,9311
PyQt5/bindings/QtWidgets/qgraphicssceneevent.sip,sha256=voTp58QaUiDPQ4pusi7RZwmCCVimDhqSH4YwhSbNpK8,6855
PyQt5/bindings/QtWidgets/qgraphicstransform.sip,sha256=Lsc1Mmpv11POlPu7KSt3dzEJyHOpQOLDcmvJwVN_kzs,2528
PyQt5/bindings/QtWidgets/qgraphicsview.sip,sha256=fsKe3tx9qgGLPRY0_IZJmr2ybSle4xipJ6VAgDuwUMc,8610
PyQt5/bindings/QtWidgets/qgraphicswidget.sip,sha256=GCLfvHU8Xo7Sc7T71esIY2vDbzVPPNDNwIeLEOz5AUc,5617
PyQt5/bindings/QtWidgets/qgridlayout.sip,sha256=s07rRXW1i7UXsvvcfTm5e_xJnabSqT_11hpmgFqBM_g,5681
PyQt5/bindings/QtWidgets/qgroupbox.sip,sha256=XpaL2gGTvqiMwEMHLxtY9tPZ-fHS9w0PBS-gCsXV5Mk,2176
PyQt5/bindings/QtWidgets/qheaderview.sip,sha256=G_P3UMwnsjWfJ-lFlCL7djC5gfKK2IUk1ZLoCn2LM0Y,7206
PyQt5/bindings/QtWidgets/qinputdialog.sip,sha256=6wA_fVwnp7nJlT2hGTKo9JtMC6TkQ6qulq10ETtlWOg,5919
PyQt5/bindings/QtWidgets/qitemdelegate.sip,sha256=_-tZAkddSy4UzklJpXIRnI9ayzF3IBaCEwSb8oh-IaE,2982
PyQt5/bindings/QtWidgets/qitemeditorfactory.sip,sha256=LuwhFy2wFlyg_FqmAnbt2qj0Z2p79cXjYT43kvUkmMs,1849
PyQt5/bindings/QtWidgets/qkeyeventtransition.sip,sha256=5XpBWAHNt_BXaJdVxuf8FegX74PAWcsyKv4fe08McRc,1600
PyQt5/bindings/QtWidgets/qkeysequenceedit.sip,sha256=LVXxnZId_i_VxBQu9jC_gtWEW7EdJ_LeUWaaPetQjtk,1734
PyQt5/bindings/QtWidgets/qlabel.sip,sha256=iuE7zSqc65b4r1toN4tSEaIajBvF-vKv5aHD1ZXWcq8,3275
PyQt5/bindings/QtWidgets/qlayout.sip,sha256=aAyibihpO0rdonjpc0SIoEqxaCsl4JF1UThnLO7JJSw,6040
PyQt5/bindings/QtWidgets/qlayoutitem.sip,sha256=a27U0iEX0TCVb-U1NY-g6XI5vuae4W6fq1HpKII4WiI,3769
PyQt5/bindings/QtWidgets/qlcdnumber.sip,sha256=A2UgGqnmBK8NCaE3DY7ek9pAxjoQ_iI8eSD40ZiRtSg,2460
PyQt5/bindings/QtWidgets/qlineedit.sip,sha256=nzbqp921giMPvQml8KtzTG56CQO7CnvQ4JV8Y1gkBxE,5603
PyQt5/bindings/QtWidgets/qlistview.sip,sha256=DOx8yIq1OcJrbjaLHa-McXZviMYq448c6xGFvDmdpFs,5183
PyQt5/bindings/QtWidgets/qlistwidget.sip,sha256=BPpmEXPNBQqTeHUcSt270UWD6urOC_scPGIMg_Nifeg,7456
PyQt5/bindings/QtWidgets/qmaccocoaviewcontainer.sip,sha256=JY1T8aqwiO2YSwocLOq5EhnyivvNYPVo3CT5_mrUrqQ,1467
PyQt5/bindings/QtWidgets/qmainwindow.sip,sha256=Z6Ozf1BqDFmh4khK9qWbL_rxC7-VEsNB-v2OT389wNE,5032
PyQt5/bindings/QtWidgets/qmdiarea.sip,sha256=kIhNVRYk8fQ2TqNRiqGM_5ZpaYwlImNaSMpS2npQTC4,4384
PyQt5/bindings/QtWidgets/qmdisubwindow.sip,sha256=FngU-_UbR2F5o6C3Nhj1g6FmUiriWX4elPqbzYK7DqI,4286
PyQt5/bindings/QtWidgets/qmenu.sip,sha256=mUJ5ePwaFhEWHf1QN7cu9afAPxUFNfagqY_jAE3VAiw,6226
PyQt5/bindings/QtWidgets/qmenubar.sip,sha256=1SOFmW4yisxGzy1APecYhUnGZ9O-VpQ5XFbg6CwEB0o,3626
PyQt5/bindings/QtWidgets/qmessagebox.sip,sha256=cxyE30IYijxqfu_-SpxlNwe10PQx7lAL2ZPBjE9v5_k,6668
PyQt5/bindings/QtWidgets/qmouseeventtransition.sip,sha256=GKCL8rcWXMcw4psnnYOneEr9MlE9DR7l7iYmGYwmFzs,1751
PyQt5/bindings/QtWidgets/qopenglwidget.sip,sha256=zCQy0lmo8JUk-vnUbPrz_Jg7eZ-DMHUQ30HYrgPuluw,2463
PyQt5/bindings/QtWidgets/qplaintextedit.sip,sha256=W1SZ3ytVzfieEcDR7f5hBvBeNal1O4n2AHE0GyAq24A,7961
PyQt5/bindings/QtWidgets/qprogressbar.sip,sha256=xCkjDu8D3YpzyuIIAzGgc44hwls_0Vzm9u6B7jf5gkc,2312
PyQt5/bindings/QtWidgets/qprogressdialog.sip,sha256=Mb6OdCwKySS0efTweaPWb4osJORp1sPcvARPu_dfQ90,2988
PyQt5/bindings/QtWidgets/qproxystyle.sip,sha256=RBqfwdQYLH5KJ7xMlTi-alyYF3qOmKxhabaW1EPuLfI,4008
PyQt5/bindings/QtWidgets/qpushbutton.sip,sha256=ztPT9XYx3OHTDmaBs6VcQgUTY1kaheE9vmiJuHNhfqI,2223
PyQt5/bindings/QtWidgets/qpywidgets_qlist.sip,sha256=o2tLKjHGWJ-yv7q3IXCotQOfhQ8pXUl53K6ZsQeYZck,3094
PyQt5/bindings/QtWidgets/qradiobutton.sip,sha256=bKIfim3rbJWE2qdAxcAHXks-fNrjtWf_B2wz4F71JP8,1589
PyQt5/bindings/QtWidgets/qrubberband.sip,sha256=vDIaxEMhQIt-dTvNrDzd1yNdHSWl0gDclNYqZCJRS5w,1840
PyQt5/bindings/QtWidgets/qscrollarea.sip,sha256=LIVWKsG83rIrkkxFH0zzZayaj2Tvl8pyAKNVtme2Oqc,1969
PyQt5/bindings/QtWidgets/qscrollbar.sip,sha256=2b8x2Jk2AnURv0AzgNpy08IVTbYgjhGu46I5yGZB3BI,1811
PyQt5/bindings/QtWidgets/qscroller.sip,sha256=gESVcPgA4ZJYSC_JHz9itTbu0p8z2PXygrdWnVSWzHY,3018
PyQt5/bindings/QtWidgets/qscrollerproperties.sip,sha256=0gTRmZFIytNNJkDRSO-WT1lZTGTSY7hylrqOCNWGoHw,2565
PyQt5/bindings/QtWidgets/qshortcut.sip,sha256=5VGpXvVZJX1vEZp8whieooyzMpvd7ycJ-OTCtu0lonA,3632
PyQt5/bindings/QtWidgets/qsizegrip.sip,sha256=DvLuW1LG0fg8NhXBU4UBxcQMka4FGIO0wnYEodAGpV8,1685
PyQt5/bindings/QtWidgets/qsizepolicy.sip,sha256=BKzpwawGWLeqdVq7vlDcPF1SsvroegDYRoRBu0AIKto,3563
PyQt5/bindings/QtWidgets/qslider.sip,sha256=GLDwYmTeOxhfSjnW3OEjQmr62YMrsMpfP78mXSdif4I,1970
PyQt5/bindings/QtWidgets/qspinbox.sip,sha256=sX_y8VLcDZaSVp6kISxSBc8gAmIFiez0ocVxcCsBVKc,3687
PyQt5/bindings/QtWidgets/qsplashscreen.sip,sha256=07aVnpgyJh4Yrg-Wi6vpXcUJjXq3_kBB26gEAmkdFm8,2027
PyQt5/bindings/QtWidgets/qsplitter.sip,sha256=ztz4wn_Ij9nx-2H4UuBFk8uCQ0-OXS3w0pueXQCenYs,3551
PyQt5/bindings/QtWidgets/qstackedlayout.sip,sha256=QqTA_lBM4ECwImxbYnTJLKcy_0ykbqoaJlu4a7tBQIc,3795
PyQt5/bindings/QtWidgets/qstackedwidget.sip,sha256=12niM6LrSJNPl-9NqGySdgjxmzE-9QR00UXShNOpFGc,1707
PyQt5/bindings/QtWidgets/qstatusbar.sip,sha256=7dLKCIGXhrYUVoD5NIjeEJqvwQ7F0prWajARDlH6fHA,2011
PyQt5/bindings/QtWidgets/qstyle.sip,sha256=Qr19jkmkwIYjzDFaimv7fxXcRVMOp6__x3LTDn7kftg,24187
PyQt5/bindings/QtWidgets/qstyleditemdelegate.sip,sha256=l_qK10H5i3Yfne4Ezhj7hJnrzl4EKwG9POzwcZ4Q41c,2472
PyQt5/bindings/QtWidgets/qstylefactory.sip,sha256=z2BtxJnOXo4nznKQxF5_c0lC_XyL9pVVtGW5-kJXlyM,1154
PyQt5/bindings/QtWidgets/qstyleoption.sip,sha256=RxZAm1x7a-aor0AtOrkyEfK80qDLKb-GM5j-8HpCzug,21855
PyQt5/bindings/QtWidgets/qstylepainter.sip,sha256=WgRrr-Wffr6WpppZuJ5LD3JvAhCDmWxhsJ5SnFDuZ08,1773
PyQt5/bindings/QtWidgets/qsystemtrayicon.sip,sha256=FE7wMoi4-UsiUEsSFqabfTTEd6QPzyUaEWZvZyVku1Y,2419
PyQt5/bindings/QtWidgets/qtabbar.sip,sha256=yhTg6P3ToZNoY1NUCm4zfwnsaREPZNlzcEd6kVoHmmM,5616
PyQt5/bindings/QtWidgets/qtableview.sip,sha256=6fFP4d4ZOYGcjactenyjydPAieSqrdlsCmZ16Xqj9r4,4956
PyQt5/bindings/QtWidgets/qtablewidget.sip,sha256=mAqiRcfc1y7fPG3Od-t4NFOiW7kPFin-G9OB3hPYHKg,9296
PyQt5/bindings/QtWidgets/qtabwidget.sip,sha256=6M4eYOvUR-0aczdtxrdgP6RiFu02c16ZwQ1Ys8L-eOE,4504
PyQt5/bindings/QtWidgets/qtextbrowser.sip,sha256=YSTlVffjyYk76AmKb-olWBRPhrwP6GoiCOLEE_-0kpQ,2960
PyQt5/bindings/QtWidgets/qtextedit.sip,sha256=z1oPK3Ym0bLHZv5Ql5CbPwS5br2h6GvF6GERiGky1Dc,8203
PyQt5/bindings/QtWidgets/qtoolbar.sip,sha256=gveKwnsZk34kDbu7aLZhXc7CigvHkqfyrSIUz8RruwU,4342
PyQt5/bindings/QtWidgets/qtoolbox.sip,sha256=k6QyJrkQmjfoFSsTYFKqZ8mChXsu9HE0qkNHED53Ask,2479
PyQt5/bindings/QtWidgets/qtoolbutton.sip,sha256=YnDqd194jRmsKa8jJ_AH2LTI-qE2kYj7DCMSqdGshq8,2560
PyQt5/bindings/QtWidgets/qtooltip.sip,sha256=edOP1Svlbe6PZsNdJHInN2Dz-MRU9dM_hlRk4Ug-4ws,1630
PyQt5/bindings/QtWidgets/qtreeview.sip,sha256=LKSj2hDzRRo3aGuiLMm_pC8C0K_Q7vyBH0F7bOCFjLo,6708
PyQt5/bindings/QtWidgets/qtreewidget.sip,sha256=sOT2GcIW4exbAcxcMCNo0pKxpNltbLcXc0_ub8kGXtc,10487
PyQt5/bindings/QtWidgets/qtreewidgetitemiterator.sip,sha256=3nneXd98cPAbqtIcam6dl3eNeGIy6IdNj1HRQWZEfRI,2362
PyQt5/bindings/QtWidgets/qundogroup.sip,sha256=VogjZz-NDAfaHxx6rzswTlzDO7MmoHjaSDw0-HiOtSQ,2103
PyQt5/bindings/QtWidgets/qundostack.sip,sha256=HzclBkflZIV_MvgjCmg0AChuz4xEb9gOBudOTzfPji0,3169
PyQt5/bindings/QtWidgets/qundoview.sip,sha256=u3klStEaG6iMilNJGBi0kY-ER8lhXk07fJzfocIGQ8Q,1641
PyQt5/bindings/QtWidgets/qwhatsthis.sip,sha256=yZ-YyWhA306PKvLlkdzhsNDzzpLj5RjKV6-hGIZoVCU,1391
PyQt5/bindings/QtWidgets/qwidget.sip,sha256=e8D32CYVhQu6gxcY4w298ZYEquMWmYND3rqk3Z5Spb0,15862
PyQt5/bindings/QtWidgets/qwidgetaction.sip,sha256=-Cs5u9ZfQRTNAElORHPtNk7xkujrshz12Bm4ncyfCwM,1670
PyQt5/bindings/QtWidgets/qwizard.sip,sha256=tMavTblgRtLSTJjK1-S_FqoLR8tkPjOMp4TRxd1hH4s,7984
PyQt5/bindings/QtWinExtras/QtWinExtras.toml,sha256=F4ZZzvJH6CqE6ADBUhHTEQQ581MID-Y24I3UwVcDT44,186
PyQt5/bindings/QtWinExtras/QtWinExtrasmod.sip,sha256=OE5UFQVQoEpbnZb1YD4WyifrVHYIHtpJ8RYlcHaLZOQ,2198
PyQt5/bindings/QtWinExtras/qwinfunctions.sip,sha256=ceBLC_4_vsehs80pdB_HdI-f2_6oo7byqOoXn7yMJpc,4424
PyQt5/bindings/QtWinExtras/qwinjumplist.sip,sha256=KjARRaFxV6e6JGpg18Sxq3WGUSsbpCATrJwrlfgZ0u4,2492
PyQt5/bindings/QtWinExtras/qwinjumplistcategory.sip,sha256=eZ90hUOv-Rzv1eAD3X25q5cC6viC9EyrHDLgpbMYNtE,2135
PyQt5/bindings/QtWinExtras/qwinjumplistitem.sip,sha256=Lta4TYqQLfEZosqyMmxwH96TqcvuvnPPSjlQlT8Z59c,1844
PyQt5/bindings/QtWinExtras/qwintaskbarbutton.sip,sha256=A8MUo-ktCrHxRFGOEmQvkbP7nxbNSp8tyipVMlTHutg,1644
PyQt5/bindings/QtWinExtras/qwintaskbarprogress.sip,sha256=AH0CiqmZRe50nN1sLCgiq0d0J7H75oDNuU4wQFbcAio,1923
PyQt5/bindings/QtWinExtras/qwinthumbnailtoolbar.sip,sha256=2zE9cR-YA5AhSGJap7TCoAn5rdFwvv53xMim3vw4JIM,2111
PyQt5/bindings/QtWinExtras/qwinthumbnailtoolbutton.sip,sha256=Q1ZRUMWrzxEB7vz9EAGuN5vry188ULjJAZdpO_Nf35o,1824
PyQt5/bindings/QtXml/QtXml.toml,sha256=Gc6SUYZLcIPqr8MSBJ34JS4b_GxKbG76mqWOjnIeLXA,180
PyQt5/bindings/QtXml/QtXmlmod.sip,sha256=1EhgjRofn0n8s9lTnEft9yvT5BOK-kJezFtjdjHdhqw,1986
PyQt5/bindings/QtXml/qdom.sip,sha256=2MFDudirMSMYl4y52URzs0QQJGlY0zA-LI3JDq4WwkQ,14855
PyQt5/bindings/QtXml/qxml.sip,sha256=XKzVrU5QD2N8k9YltaHwPiXBTOrZNlBn7b90vb4X4us,12460
PyQt5/bindings/QtXmlPatterns/QtXmlPatterns.toml,sha256=KSDnRoNqGwTvI39T6WqmkaT0D3BiMudfFfBwipg4WqI,188
PyQt5/bindings/QtXmlPatterns/QtXmlPatternsmod.sip,sha256=P3EWxkillGLUNK1YaiFFvmWAHZh6zW6Vb-uhCz7KlZ4,2436
PyQt5/bindings/QtXmlPatterns/qabstractmessagehandler.sip,sha256=uPv5bMRq34vR__VVjDCsgNZJsmquOmf6TQZps3pRX44,2196
PyQt5/bindings/QtXmlPatterns/qabstracturiresolver.sip,sha256=GziuKj7QZcD9rKfSOD6118WYjHmYb-nhWou5hjjrdes,1283
PyQt5/bindings/QtXmlPatterns/qabstractxmlnodemodel.sip,sha256=fYWjjn8xwA93ialA3fxQQNaT6-u6allcGLP9Oybs_zc,4353
PyQt5/bindings/QtXmlPatterns/qabstractxmlreceiver.sip,sha256=RtiTx2W_Zfjr7LLWW0RUP1-1EvE-COYnL8ohk5WnPTY,1881
PyQt5/bindings/QtXmlPatterns/qsimplexmlnodemodel.sip,sha256=OYyl26PBmiFoa_UowofkKI2QM2f7ShfsTkr7sTYDvV0,1619
PyQt5/bindings/QtXmlPatterns/qsourcelocation.sip,sha256=oTdgOzNOtA23GYV8kkTl91ViXld4JQYdU7NPRavrMi0,1659
PyQt5/bindings/QtXmlPatterns/qxmlformatter.sip,sha256=pt08qIzUoO3ls7eTaJ-kQScG4uaA48seTnN2Jqdz-Kw,1779
PyQt5/bindings/QtXmlPatterns/qxmlname.sip,sha256=ldrCZAin0Xc9gyKFchxFLheeIx9jz_olYh5CT9SJceg,1860
PyQt5/bindings/QtXmlPatterns/qxmlnamepool.sip,sha256=IbXc794HDQI1FCYBraMwprfj1ixV0gRf0FNIP-VUDvw,1157
PyQt5/bindings/QtXmlPatterns/qxmlquery.sip,sha256=5CLcwY06Cdvzm04jsKOFQAfvEH_sQtGthRG8pp53Vho,4503
PyQt5/bindings/QtXmlPatterns/qxmlresultitems.sip,sha256=0Xisjo9k8OTOKunat0MVxOWGkYYr5wJHUOInbOW5HZk,1274
PyQt5/bindings/QtXmlPatterns/qxmlschema.sip,sha256=EH1UiAmG-875fNaNRQiLivuUwF1qBR2lRMxgHUftzTc,1928
PyQt5/bindings/QtXmlPatterns/qxmlschemavalidator.sip,sha256=Qg6B8YACgW2mTuBngUd7w3Q4Dkgb5wTwMiSj4F1gAog,2485
PyQt5/bindings/QtXmlPatterns/qxmlserializer.sip,sha256=TrOe7_B5vODZBIeuLDccZs94CvjGXSpZ8f5P3nuEJSQ,1905
PyQt5/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
PyQt5/pylupdate.pyd,sha256=s_ib6_7cfVEMmzSDYqMv-GHRRW4oVYdR0ishskkYomo,118272
PyQt5/pylupdate_main.py,sha256=UNJLs4cD_O6MaiRJ3qhX5OtJo9NDNXUAitmYltIhBo4,7620
PyQt5/pyrcc.pyd,sha256=-v6eiltRbgfkAGDM0Caf_dbsNvTTY1xa04ryPnc7u44,49664
PyQt5/pyrcc_main.py,sha256=iZopJ7gIoor5QEGeCNSHfjtdytb7D6d8L-iyxTYkB6k,5558
PyQt5/sip.pyi,sha256=Dk5b_YPq4Cz0KcUp1CUwGY6nD01DkdCmzvHUSRQo36A,4061
PyQt5/uic/Compiler/__init__.py,sha256=aE4HiuHgvVn0Y2pMHZ3u_NWkceQ2nLRvbiVENSo_n6o,1024
PyQt5/uic/Compiler/__pycache__/__init__.cpython-39.pyc,,
PyQt5/uic/Compiler/__pycache__/compiler.cpython-39.pyc,,
PyQt5/uic/Compiler/__pycache__/indenter.cpython-39.pyc,,
PyQt5/uic/Compiler/__pycache__/misc.cpython-39.pyc,,
PyQt5/uic/Compiler/__pycache__/proxy_metaclass.cpython-39.pyc,,
PyQt5/uic/Compiler/__pycache__/qobjectcreator.cpython-39.pyc,,
PyQt5/uic/Compiler/__pycache__/qtproxies.cpython-39.pyc,,
PyQt5/uic/Compiler/compiler.py,sha256=THKgZNBUh198NkAh1hLHPsDEMeSLRdOiEKFNvVKfv14,4768
PyQt5/uic/Compiler/indenter.py,sha256=Z2NZ9Koezh5UjmTAsA0tw4IO3rczWYi0okT4pT4M-X8,2819
PyQt5/uic/Compiler/misc.py,sha256=Wytpj0Y0TUiLdB2JIot3-UdtOJnpo-mnKF9OWQpTCu4,2433
PyQt5/uic/Compiler/proxy_metaclass.py,sha256=ou_MjXc_yCksa7cFCVUU3ap7FuqJ2XcoWkxXuc4z90c,4424
PyQt5/uic/Compiler/qobjectcreator.py,sha256=aQjKwR_EXjAhMHR8f9xWcYniDqcgPdMTWwlV8gIBgCs,6083
PyQt5/uic/Compiler/qtproxies.py,sha256=Ie9yPzHtnzuT_0dNx8JxBJGkKb-AGzm0WVmLcLnPYBg,16785
PyQt5/uic/Loader/__init__.py,sha256=aE4HiuHgvVn0Y2pMHZ3u_NWkceQ2nLRvbiVENSo_n6o,1024
PyQt5/uic/Loader/__pycache__/__init__.cpython-39.pyc,,
PyQt5/uic/Loader/__pycache__/loader.cpython-39.pyc,,
PyQt5/uic/Loader/__pycache__/qobjectcreator.cpython-39.pyc,,
PyQt5/uic/Loader/loader.py,sha256=IafHQG6x-dNDeTlgnk1NRKYo2WolIpp2wiIWVvi2Ngc,2924
PyQt5/uic/Loader/qobjectcreator.py,sha256=AhFPTityPrbXXvE5qT80RL-1HQm_G5za8k2dIaik0s0,5172
PyQt5/uic/__init__.py,sha256=vLZ9hk0Q1xNbu_eRSMsW5Fh5MO0luSwGgNzv1-Jvmqk,9749
PyQt5/uic/__pycache__/__init__.cpython-39.pyc,,
PyQt5/uic/__pycache__/driver.cpython-39.pyc,,
PyQt5/uic/__pycache__/exceptions.cpython-39.pyc,,
PyQt5/uic/__pycache__/icon_cache.cpython-39.pyc,,
PyQt5/uic/__pycache__/objcreator.cpython-39.pyc,,
PyQt5/uic/__pycache__/properties.cpython-39.pyc,,
PyQt5/uic/__pycache__/pyuic.cpython-39.pyc,,
PyQt5/uic/__pycache__/uiparser.cpython-39.pyc,,
PyQt5/uic/driver.py,sha256=rkJDwJ6q0LmkzebDdrKXpKOjujKdYwiKmkXcMrGHG7Y,4797
PyQt5/uic/exceptions.py,sha256=UNMuvcB7CGpzo5xiscd4XkIBGDdFeVRefMAAEbnDFQI,2332
PyQt5/uic/icon_cache.py,sha256=-0uZWAMKjtFFUu7t46p0W_QWKsH3oTrfwrsQGQO05fw,5181
PyQt5/uic/objcreator.py,sha256=OBi31Sd9nUSz1N_-Zd0MVhizaBxQhVH_6HgXYW2hwKE,6133
PyQt5/uic/port_v2/__init__.py,sha256=aE4HiuHgvVn0Y2pMHZ3u_NWkceQ2nLRvbiVENSo_n6o,1024
PyQt5/uic/port_v2/__pycache__/__init__.cpython-39.pyc,,
PyQt5/uic/port_v2/__pycache__/as_string.cpython-39.pyc,,
PyQt5/uic/port_v2/__pycache__/ascii_upper.cpython-39.pyc,,
PyQt5/uic/port_v2/__pycache__/proxy_base.cpython-39.pyc,,
PyQt5/uic/port_v2/__pycache__/string_io.cpython-39.pyc,,
PyQt5/uic/port_v2/as_string.py,sha256=3IhYbMHh21r3YX6vQJdb0Tos8SpBrEE-4EH2XslLW00,1475
PyQt5/uic/port_v2/ascii_upper.py,sha256=aQXz9NOJV-N0TemZAQCEhDDbEMC1OKLvu1CrFNh7hc0,1358
PyQt5/uic/port_v2/proxy_base.py,sha256=KVreC8vsv0abQoBSD0JLk3K3cZ7Ss8L67dnaq-yB8UM,1250
PyQt5/uic/port_v2/string_io.py,sha256=SSNcCxPdS7sMp2ss02LYJH3xykSvBlHkjI1iPMIybFE,1157
PyQt5/uic/port_v3/__init__.py,sha256=aE4HiuHgvVn0Y2pMHZ3u_NWkceQ2nLRvbiVENSo_n6o,1024
PyQt5/uic/port_v3/__pycache__/__init__.cpython-39.pyc,,
PyQt5/uic/port_v3/__pycache__/as_string.cpython-39.pyc,,
PyQt5/uic/port_v3/__pycache__/ascii_upper.cpython-39.pyc,,
PyQt5/uic/port_v3/__pycache__/proxy_base.cpython-39.pyc,,
PyQt5/uic/port_v3/__pycache__/string_io.cpython-39.pyc,,
PyQt5/uic/port_v3/as_string.py,sha256=zZEiip9rho2hdR4PdXQwaDz3_kOEElVHLigkJVzgcco,1452
PyQt5/uic/port_v3/ascii_upper.py,sha256=0p8D2pJvCgV9RVQ-RYplmvYBLr6AoKyxHnB6zGd1XnY,1352
PyQt5/uic/port_v3/proxy_base.py,sha256=VNQziWGRH_RidXAYjxRE6dPnU6nUkPkATsd1DO0DeOk,1230
PyQt5/uic/port_v3/string_io.py,sha256=IsSj_y5e1A2y9RY4W-okaRBJLNjxGIy8QQoEJ4natxM,1084
PyQt5/uic/properties.py,sha256=3x91MRS8UAloXsLhXW8-_D98IhCWOe2ukyKp2UDj7T4,18284
PyQt5/uic/pyuic.py,sha256=s89Cbdt49-02VZLkDLk8ThB12oWwhVQsCo1nhXoETm0,3646
PyQt5/uic/uiparser.py,sha256=XJ_JpQr_6UrLMHT82SZ7LhioVcPDw-bEmWgqgJsKSRI,39202
PyQt5/uic/widget-plugins/__pycache__/qaxcontainer.cpython-39.pyc,,
PyQt5/uic/widget-plugins/__pycache__/qscintilla.cpython-39.pyc,,
PyQt5/uic/widget-plugins/__pycache__/qtcharts.cpython-39.pyc,,
PyQt5/uic/widget-plugins/__pycache__/qtprintsupport.cpython-39.pyc,,
PyQt5/uic/widget-plugins/__pycache__/qtquickwidgets.cpython-39.pyc,,
PyQt5/uic/widget-plugins/__pycache__/qtwebenginewidgets.cpython-39.pyc,,
PyQt5/uic/widget-plugins/__pycache__/qtwebkit.cpython-39.pyc,,
PyQt5/uic/widget-plugins/qaxcontainer.py,sha256=-WDgC3ybkhcywE_w0bN_XrgblBAwN_YxjPbARa_PGWo,1590
PyQt5/uic/widget-plugins/qscintilla.py,sha256=iJZIrvdewEA75r5Q1DzQdqz1qj4bgme2KRlIficZG5U,1586
PyQt5/uic/widget-plugins/qtcharts.py,sha256=q1uT3rWEoJQuthXBQ7kx0R6pJGGfkwS_v9E2ZvIit3c,1595
PyQt5/uic/widget-plugins/qtprintsupport.py,sha256=roTHKhHuFHwzipIysAEhMouEZ5b8KEzNJqvWfUChSqM,1621
PyQt5/uic/widget-plugins/qtquickwidgets.py,sha256=fkGfmJORCA_62t3RksL2afSUyMZwBqfVtPJzXXnydQo,1595
PyQt5/uic/widget-plugins/qtwebenginewidgets.py,sha256=0xjMUv83_8pv18GISyC2rzc3kZ4LVu-Aw9boA5SvoKs,1601
PyQt5/uic/widget-plugins/qtwebkit.py,sha256=nnByrPhnew7v8mfS502IXU5fE3XghYouMzBn0GtGXUo,2558

@ -0,0 +1,4 @@
Wheel-Version: 1.0
Generator: sip-wheel 6.6.2
Root-Is-Purelib: false
Tag: cp37-abi3-win_amd64

@ -0,0 +1,4 @@
[console_scripts]
pylupdate5=PyQt5.pylupdate_main:main
pyrcc5=PyQt5.pyrcc_main:main
pyuic5=PyQt5.uic.pyuic:main

Binary file not shown.

@ -0,0 +1,105 @@
# The PEP 484 type hints stub file for the QAxContainer module.
#
# Generated by SIP 6.6.2
#
# Copyright (c) 2022 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt5.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
import typing
import PyQt5.sip
from PyQt5 import QtWidgets
# Support for QDate, QDateTime and QTime.
import datetime
# Convenient type aliases.
PYQT_SIGNAL = typing.Union[QtCore.pyqtSignal, QtCore.pyqtBoundSignal]
PYQT_SLOT = typing.Union[typing.Callable[..., None], QtCore.pyqtBoundSignal]
# Convenient aliases for complicated OpenGL types.
PYQT_OPENGL_ARRAY = typing.Union[typing.Sequence[int], typing.Sequence[float],
PyQt5.sip.Buffer, None]
PYQT_OPENGL_BOUND_ARRAY = typing.Union[typing.Sequence[int],
typing.Sequence[float], PyQt5.sip.Buffer, int, None]
class QAxBase(PyQt5.sip.simplewrapper):
@typing.overload
def __init__(self) -> None: ...
@typing.overload
def __init__(self, a0: 'QAxBase') -> None: ...
def setClassContext(self, classContext: int) -> None: ...
def classContext(self) -> int: ...
def disableEventSink(self) -> None: ...
def disableClassInfo(self) -> None: ...
def disableMetaObject(self) -> None: ...
def setControl(self, a0: str) -> bool: ...
def clear(self) -> None: ...
def exception(self, a0: int, a1: str, a2: str, a3: str) -> None: ...
def propertyChanged(self, a0: str) -> None: ...
def signal(self, a0: str, a1: int, a2: PyQt5.sip.voidptr) -> None: ...
def asVariant(self) -> typing.Any: ...
def verbs(self) -> typing.List[str]: ...
def isNull(self) -> bool: ...
def setPropertyWritable(self, a0: str, a1: bool) -> None: ...
def propertyWritable(self, a0: str) -> bool: ...
def generateDocumentation(self) -> str: ...
def setPropertyBag(self, a0: typing.Dict[str, typing.Any]) -> None: ...
def propertyBag(self) -> typing.Dict[str, typing.Any]: ...
@typing.overload
def querySubObject(self, a0: str, a1: typing.Iterable[typing.Any]) -> 'QAxObject': ...
@typing.overload
def querySubObject(self, a0: str, value1: typing.Any = ..., value2: typing.Any = ..., value3: typing.Any = ..., value4: typing.Any = ..., value5: typing.Any = ..., value6: typing.Any = ..., value7: typing.Any = ..., value8: typing.Any = ...) -> 'QAxObject': ...
@typing.overload
def dynamicCall(self, a0: str, a1: typing.Iterable[typing.Any]) -> typing.Any: ...
@typing.overload
def dynamicCall(self, a0: str, value1: typing.Any = ..., value2: typing.Any = ..., value3: typing.Any = ..., value4: typing.Any = ..., value5: typing.Any = ..., value6: typing.Any = ..., value7: typing.Any = ..., value8: typing.Any = ...) -> typing.Any: ...
def control(self) -> str: ...
class QAxObject(QtCore.QObject, QAxBase):
@typing.overload
def __init__(self, parent: typing.Optional[QtCore.QObject] = ...) -> None: ...
@typing.overload
def __init__(self, a0: str, parent: typing.Optional[QtCore.QObject] = ...) -> None: ...
def connectNotify(self, a0: QtCore.QMetaMethod) -> None: ...
def doVerb(self, a0: str) -> bool: ...
class QAxWidget(QtWidgets.QWidget, QAxBase):
@typing.overload
def __init__(self, parent: typing.Optional[QtWidgets.QWidget] = ..., flags: typing.Union[QtCore.Qt.WindowFlags, QtCore.Qt.WindowType] = ...) -> None: ...
@typing.overload
def __init__(self, a0: str, parent: typing.Optional[QtWidgets.QWidget] = ..., flags: typing.Union[QtCore.Qt.WindowFlags, QtCore.Qt.WindowType] = ...) -> None: ...
def connectNotify(self, a0: QtCore.QMetaMethod) -> None: ...
def translateKeyEvent(self, a0: int, a1: int) -> bool: ...
def resizeEvent(self, a0: QtGui.QResizeEvent) -> None: ...
def changeEvent(self, a0: QtCore.QEvent) -> None: ...
def createHostWindow(self, a0: bool) -> bool: ...
def minimumSizeHint(self) -> QtCore.QSize: ...
def sizeHint(self) -> QtCore.QSize: ...
def doVerb(self, a0: str) -> bool: ...
def clear(self) -> None: ...

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save