diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py new file mode 100644 index 0000000000000000000000000000000000000000..7054f2a88f0508a68980addd6068f95cd0ae49f2 --- /dev/null +++ b/PPOCRLabel/PPOCRLabel.py @@ -0,0 +1,2093 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# pyrcc5 -o libs/resources.py resources.qrc +import argparse +import ast +import codecs +import os.path +import platform +import subprocess +import sys +from functools import partial +from collections import defaultdict +import json + + +__dir__ = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(__dir__) +sys.path.append(os.path.abspath(os.path.join(__dir__, '../..'))) +sys.path.append("..") + +from paddleocr import PaddleOCR + +try: + from PyQt5 import QtCore, QtGui, QtWidgets + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + # needed for py3+qt4 + # Ref: + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string + if sys.version_info.major >= 3: + import sip + + sip.setapi('QVariant', 2) + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +from combobox import ComboBox +from libs.constants import * +from libs.utils import * +from libs.settings import Settings +from libs.shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR +from libs.stringBundle import StringBundle +from libs.canvas import Canvas +from libs.zoomWidget import ZoomWidget +from libs.autoDialog import AutoDialog +from libs.labelDialog import LabelDialog +from libs.colorDialog import ColorDialog +from libs.labelFile import LabelFile, LabelFileError +from libs.toolBar import ToolBar +from libs.ustr import ustr +from libs.hashableQListWidgetItem import HashableQListWidgetItem + +__appname__ = 'PPOCRLabel' + + +class WindowMixin(object): + + def menu(self, title, actions=None): + menu = self.menuBar().addMenu(title) + if actions: + addActions(menu, actions) + return menu + + def toolbar(self, title, actions=None): + toolbar = ToolBar(title) + toolbar.setObjectName(u'%sToolBar' % title) + # toolbar.setOrientation(Qt.Vertical) + toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + if actions: + addActions(toolbar, actions) + self.addToolBar(Qt.LeftToolBarArea, toolbar) + return toolbar + + +class MainWindow(QMainWindow, WindowMixin): + FIT_WINDOW, FIT_WIDTH, MANUAL_ZOOM = list(range(3)) + + def __init__(self, lang="ch", defaultFilename=None, defaultPrefdefClassFile=None, defaultSaveDir=None): + super(MainWindow, self).__init__() + self.setWindowTitle(__appname__) + + # Load setting in the main thread + self.settings = Settings() + self.settings.load() + settings = self.settings + self.lang = lang + # Load string bundle for i18n + if lang not in ['ch', 'en']: + lang = 'en' + self.stringBundle = StringBundle.getBundle(localeStr='zh-CN' if lang=='ch' else 'en') # 'en' + getStr = lambda strId: self.stringBundle.getString(strId) + + self.defaultSaveDir = defaultSaveDir + self.ocr = PaddleOCR(use_pdserving=False, use_angle_cls=True, det=True, cls=True, use_gpu=False, lang=lang) + + if os.path.exists('./data/paddle.png'): + result = self.ocr.ocr('./data/paddle.png', cls=True, det=True) + + # For loading all image under a directory + self.mImgList = [] + self.mImgList5 = [] + self.dirname = None + self.labelHist = [] + self.lastOpenDir = None + self.result_dic = [] + + self.changeFileFolder = False + self.haveAutoReced = False + self.labelFile = None + self.currIndex = 0 + + + # Whether we need to save or not. + self.dirty = False + + self._noSelectionSlot = False + self._beginner = True + self.screencastViewer = self.getAvailableScreencastViewer() + self.screencast = "https://github.com/PaddlePaddle/PaddleOCR" + + # Load predefined classes to the list + self.loadPredefinedClasses(defaultPrefdefClassFile) + + # Main widgets and related state. + self.labelDialog = LabelDialog(parent=self, listItem=self.labelHist) + self.autoDialog = AutoDialog(parent=self) + + self.itemsToShapes = {} + self.shapesToItems = {} + self.itemsToShapesbox = {} + self.shapesToItemsbox = {} + self.prevLabelText = getStr('tempLabel') + self.model = 'paddle' + self.PPreader = None + self.autoSaveNum = 10 + + ################# file list ############### + self.fileListWidget = QListWidget() + self.fileListWidget.itemClicked.connect(self.fileitemDoubleClicked) + self.fileListWidget.setIconSize(QSize(25, 25)) + filelistLayout = QVBoxLayout() + filelistLayout.setContentsMargins(0, 0, 0, 0) + filelistLayout.addWidget(self.fileListWidget) + + self.AutoRecognition = QToolButton() + self.AutoRecognition.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.AutoRecognition.setIcon(newIcon('Auto')) + # self.AutoRecognition.setIconSize(QSize(100,20)) + # self.AutoRecognition.setFixedSize(QSize(80,30)) + # self.AutoRecognition.setStyleSheet('text-align:center;')#border:none;font-size : 12pt; + autoRecLayout = QHBoxLayout() + autoRecLayout.setContentsMargins(0, 0, 0, 0) + autoRecLayout.addWidget(self.AutoRecognition) + autoRecContainer = QWidget() + autoRecContainer.setLayout(autoRecLayout) + filelistLayout.addWidget(autoRecContainer) + + fileListContainer = QWidget() + fileListContainer.setLayout(filelistLayout) + self.filedock = QDockWidget(getStr('fileList'), self) + self.filedock.setObjectName(getStr('files')) + self.filedock.setWidget(fileListContainer) + self.addDockWidget(Qt.LeftDockWidgetArea, self.filedock) + + ######## Right area ########## + listLayout = QVBoxLayout() + listLayout.setContentsMargins(0, 0, 0, 0) + + # Create a widget for edit and diffc button + self.diffcButton = QCheckBox(getStr('useDifficult')) + self.diffcButton.setChecked(False) + self.diffcButton.stateChanged.connect(self.btnstate) + self.editButton = QToolButton() + self.reRecogButton = QToolButton() + self.reRecogButton.setIcon(newIcon('reRec', 30)) + # self.reRecogButton.setFixedSize(QSize(80,30)) + self.reRecogButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + + self.newButton = QToolButton() + self.newButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + # self.newButton.setFixedSize(QSize(80, 30)) + self.SaveButton = QToolButton() + self.SaveButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + # self.SaveButton.setFixedSize(QSize(60, 30)) + self.DelButton = QToolButton() + self.DelButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + # self.DelButton.setFixedSize(QSize(80, 30)) + + + lefttoptoolbox = QHBoxLayout() + lefttoptoolbox.addWidget(self.newButton) + lefttoptoolbox.addWidget(self.reRecogButton) + lefttoptoolboxcontainer = QWidget() + lefttoptoolboxcontainer.setLayout(lefttoptoolbox) + listLayout.addWidget(lefttoptoolboxcontainer) + + + ################## label list #################### + # Create and add a widget for showing current label items + self.labelList = QListWidget() + labelListContainer = QWidget() + labelListContainer.setLayout(listLayout) + self.labelList.itemActivated.connect(self.labelSelectionChanged) + self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged) + self.labelList.itemDoubleClicked.connect(self.editLabel) + # Connect to itemChanged to detect checkbox changes. + self.labelList.itemChanged.connect(self.labelItemChanged) + self.labelListDock = QDockWidget(getStr('recognitionResult'),self) + self.labelListDock.setWidget(self.labelList) + self.labelListDock.setFeatures(QDockWidget.NoDockWidgetFeatures) + listLayout.addWidget(self.labelListDock) + + ################## detection box #################### + self.BoxList = QListWidget() + + self.BoxList.itemActivated.connect(self.boxSelectionChanged) + self.BoxList.itemSelectionChanged.connect(self.boxSelectionChanged) + self.BoxList.itemDoubleClicked.connect(self.editBox) + # Connect to itemChanged to detect checkbox changes. + self.BoxList.itemChanged.connect(self.boxItemChanged) + self.BoxListDock = QDockWidget(getStr('detectionBoxposition'), self) + self.BoxListDock.setWidget(self.BoxList) + self.BoxListDock.setFeatures(QDockWidget.NoDockWidgetFeatures) + listLayout.addWidget(self.BoxListDock) + + ############ lower right area ############ + leftbtmtoolbox = QHBoxLayout() + leftbtmtoolbox.addWidget(self.SaveButton) + leftbtmtoolbox.addWidget(self.DelButton) + leftbtmtoolboxcontainer = QWidget() + leftbtmtoolboxcontainer.setLayout(leftbtmtoolbox) + listLayout.addWidget(leftbtmtoolboxcontainer) + + self.dock = QDockWidget(getStr('boxLabelText'), self) + self.dock.setObjectName(getStr('labels')) + self.dock.setWidget(labelListContainer) + + + ########## zoom bar ######### + self.imgsplider = QSlider(Qt.Horizontal) + self.imgsplider.valueChanged.connect(self.CanvasSizeChange) + self.imgsplider.setMinimum(-150) + self.imgsplider.setMaximum(150) + self.imgsplider.setSingleStep(1) + self.imgsplider.setTickPosition(QSlider.TicksBelow) + self.imgsplider.setTickInterval(1) + op = QGraphicsOpacityEffect() + op.setOpacity(0.2) + self.imgsplider.setGraphicsEffect(op) + # self.imgsplider.setAttribute(Qt.WA_TranslucentBackground) + self.imgsplider.setStyleSheet("background-color:transparent") + self.imgsliderDock = QDockWidget(getStr('ImageResize'), self) + self.imgsliderDock.setObjectName(getStr('IR')) + self.imgsliderDock.setWidget(self.imgsplider) + self.imgsliderDock.setFeatures(QDockWidget.DockWidgetFloatable) + # op = QGraphicsOpacityEffect() + # op.setOpacity(0.2) + # self.imgsliderDock.setGraphicsEffect(op) + self.imgsliderDock.setAttribute(Qt.WA_TranslucentBackground) + self.addDockWidget(Qt.RightDockWidgetArea, self.imgsliderDock) + + self.zoomWidget = ZoomWidget() + self.colorDialog = ColorDialog(parent=self) + self.zoomWidgetValue = self.zoomWidget.value() + + ########## thumbnail ######### + hlayout = QHBoxLayout() + m = (0, 0, 0, 0) + hlayout.setSpacing(0) + hlayout.setContentsMargins(*m) + self.preButton = QToolButton() + # self.preButton.setFixedHeight(100) + # self.preButton.setText(getStr("prevImg")) + self.preButton.setIcon(newIcon("prev",40)) + self.preButton.setIconSize(QSize(40, 100)) + self.preButton.clicked.connect(self.openPrevImg) + # self.preButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + self.preButton.setStyleSheet('border: none;') + self.iconlist = QListWidget() + self.iconlist.setViewMode(QListView.IconMode) + self.iconlist.setFlow(QListView.TopToBottom) + self.iconlist.setSpacing(10) + self.iconlist.setIconSize(QSize(50, 50)) + self.iconlist.setMovement(False) + self.iconlist.setResizeMode(QListView.Adjust) + # self.iconlist.itemDoubleClicked.connect(self.iconitemDoubleClicked) + self.iconlist.itemClicked.connect(self.iconitemDoubleClicked) + self.iconlist.setStyleSheet("background-color:transparent; border: none;") + self.iconlist.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + # self.iconlist.setStyleSheet('border: none;') + self.nextButton = QToolButton() + # self.nextButton.setFixedHeight(100) + # self.nextButton.setText(getStr("nextImg")) + self.nextButton.setIcon(newIcon("next", 40)) + self.nextButton.setIconSize(QSize(40, 100)) + self.nextButton.setStyleSheet('border: none;') + self.nextButton.clicked.connect(self.openNextImg) + # self.nextButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) + + hlayout.addWidget(self.preButton) + hlayout.addWidget(self.iconlist) + hlayout.addWidget(self.nextButton) + + # self.setLayout(hlayout) + + iconListContainer = QWidget() + iconListContainer.setLayout(hlayout) + iconListContainer.setFixedHeight(100) + # iconListContainer.setFixedWidth(530) + # op = QGraphicsOpacityEffect() + # op.setOpacity(0.5) + # iconListContainer.setGraphicsEffect(op) + + ########### Canvas ########### + self.canvas = Canvas(parent=self) + self.canvas.zoomRequest.connect(self.zoomRequest) + self.canvas.setDrawingShapeToSquare(settings.get(SETTING_DRAW_SQUARE, False)) + + scroll = QScrollArea() + scroll.setWidget(self.canvas) + scroll.setWidgetResizable(True) + self.scrollBars = { + Qt.Vertical: scroll.verticalScrollBar(), + Qt.Horizontal: scroll.horizontalScrollBar() + } + self.scrollArea = scroll + self.canvas.scrollRequest.connect(self.scrollRequest) + + self.canvas.newShape.connect(self.newShape) + self.canvas.shapeMoved.connect(self.updateBoxlist) # self.setDirty + self.canvas.selectionChanged.connect(self.shapeSelectionChanged) + self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive) + + centerLayout = QVBoxLayout() + centerLayout.setContentsMargins(0, 0, 0, 0) + centerLayout.addWidget(scroll) + #centerLayout.addWidget(self.icondock) + centerLayout.addWidget(iconListContainer,0,Qt.AlignCenter) + centercontainer = QWidget() + centercontainer.setLayout(centerLayout) + + # self.scrolldock = QDockWidget('WorkSpace',self) + # self.scrolldock.setObjectName('WorkSpace') + # self.scrolldock.setWidget(centercontainer) + # self.scrolldock.setFeatures(QDockWidget.NoDockWidgetFeatures) + # orititle = self.scrolldock.titleBarWidget() + # tmpwidget = QWidget() + # self.scrolldock.setTitleBarWidget(tmpwidget) + # del orititle + self.setCentralWidget(centercontainer) #self.scrolldock + self.addDockWidget(Qt.RightDockWidgetArea, self.dock) + + + # self.filedock.setFeatures(QDockWidget.DockWidgetFloatable) + self.filedock.setFeatures(self.filedock.features() ^ QDockWidget.DockWidgetFloatable) + + self.dockFeatures = QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetFloatable + self.dock.setFeatures(self.dock.features() ^ self.dockFeatures) + + self.filedock.setFeatures(QDockWidget.NoDockWidgetFeatures) + + ###### Actions ####### + action = partial(newAction, self) + quit = action(getStr('quit'), self.close, + 'Ctrl+Q', 'quit', getStr('quitApp')) + + open = action(getStr('openFile'), self.openFile, + 'Ctrl+O', 'open', getStr('openFileDetail')) + + opendir = action(getStr('openDir'), self.openDirDialog, + 'Ctrl+u', 'open', getStr('openDir')) + + openNextImg = action(getStr('nextImg'), self.openNextImg, + 'd', 'next', getStr('nextImgDetail')) + + openPrevImg = action(getStr('prevImg'), self.openPrevImg, + 'a', 'prev', getStr('prevImgDetail')) + + verify = action(getStr('verifyImg'), self.verifyImg, + 'space', 'verify', getStr('verifyImgDetail')) + + save = action(getStr('save'), self.saveFile, + 'Ctrl+S', 'save', getStr('saveDetail'), enabled=False) + + alcm = action(getStr('choosemodel'), self.autolcm, + 'Ctrl+M', 'next', getStr('tipchoosemodel')) + + deleteImg = action(getStr('deleteImg'), self.deleteImg, 'Ctrl+D', 'close', getStr('deleteImgDetail'), + enabled=True) + + resetAll = action(getStr('resetAll'), self.resetAll, None, 'resetall', getStr('resetAllDetail')) + + color1 = action(getStr('boxLineColor'), self.chooseColor1, + 'Ctrl+L', 'color_line', getStr('boxLineColorDetail')) + + createMode = action(getStr('crtBox'), self.setCreateMode, + 'w', 'new', getStr('crtBoxDetail'), enabled=False) + editMode = action('&Edit\nRectBox', self.setEditMode, + 'Ctrl+J', 'edit', u'Move and edit Boxs', enabled=False) + + create = action(getStr('crtBox'), self.createShape, + 'w', 'new', getStr('crtBoxDetail'), enabled=False) + + delete = action(getStr('delBox'), self.deleteSelectedShape, + 'Delete', 'delete', getStr('delBoxDetail'), enabled=False) + copy = action(getStr('dupBox'), self.copySelectedShape, + 'Ctrl+D', 'copy', getStr('dupBoxDetail'), + enabled=False) + + hideAll = action(getStr('hideBox'), partial(self.togglePolygons, False), + 'Ctrl+H', 'hide', getStr('hideAllBoxDetail'), + enabled=False) + showAll = action(getStr('showBox'), partial(self.togglePolygons, True), + 'Ctrl+A', 'hide', getStr('showAllBoxDetail'), + enabled=False) + + help = action(getStr('tutorial'), self.showTutorialDialog, None, 'help', getStr('tutorialDetail')) + showInfo = action(getStr('info'), self.showInfoDialog, None, 'help', getStr('info')) + showSteps = action(getStr('steps'), self.showStepsDialog, None, 'help', getStr('steps')) + + zoom = QWidgetAction(self) + zoom.setDefaultWidget(self.zoomWidget) + self.zoomWidget.setWhatsThis( + u"Zoom in or out of the image. Also accessible with" + " %s and %s from the canvas." % (fmtShortcut("Ctrl+[-+]"), + fmtShortcut("Ctrl+Wheel"))) + self.zoomWidget.setEnabled(False) + + zoomIn = action(getStr('zoomin'), partial(self.addZoom, 10), + 'Ctrl++', 'zoom-in', getStr('zoominDetail'), enabled=False) + zoomOut = action(getStr('zoomout'), partial(self.addZoom, -10), + 'Ctrl+-', 'zoom-out', getStr('zoomoutDetail'), enabled=False) + zoomOrg = action(getStr('originalsize'), partial(self.setZoom, 100), + 'Ctrl+=', 'zoom', getStr('originalsizeDetail'), enabled=False) + fitWindow = action(getStr('fitWin'), self.setFitWindow, + 'Ctrl+F', 'fit-window', getStr('fitWinDetail'), + checkable=True, enabled=False) + fitWidth = action(getStr('fitWidth'), self.setFitWidth, + 'Ctrl+Shift+F', 'fit-width', getStr('fitWidthDetail'), + checkable=True, enabled=False) + # Group zoom controls into a list for easier toggling. + zoomActions = (self.zoomWidget, zoomIn, zoomOut, + zoomOrg, fitWindow, fitWidth) + self.zoomMode = self.MANUAL_ZOOM + self.scalers = { + self.FIT_WINDOW: self.scaleFitWindow, + self.FIT_WIDTH: self.scaleFitWidth, + # Set to one to scale to 100% when loading files. + self.MANUAL_ZOOM: lambda: 1, + } + + edit = action(getStr('editLabel'), self.editLabel, + 'Ctrl+E', 'edit', getStr('editLabelDetail'), + enabled=False) + + ######## New actions ####### + AutoRec = action(getStr('autoRecognition'), self.autoRecognition, + 'Ctrl+Shift+A', 'Auto', getStr('autoRecognition'), enabled=False) + + reRec = action(getStr('reRecognition'), self.reRecognition, + 'Ctrl+Shift+R', 'reRec', getStr('reRecognition'), enabled=False) + + createpoly = action(getStr('creatPolygon'), self.createPolygon, + 'p', 'new', 'Creat Polygon', enabled=True) + + saveRec = action(getStr('saveRec'), self.saveRecResult, + '', 'saveRec', getStr('saveRec'), enabled=False) + + self.editButton.setDefaultAction(edit) + self.newButton.setDefaultAction(create) + self.DelButton.setDefaultAction(deleteImg) + self.SaveButton.setDefaultAction(save) + self.AutoRecognition.setDefaultAction(AutoRec) + self.reRecogButton.setDefaultAction(reRec) + # self.preButton.setDefaultAction(openPrevImg) + # self.nextButton.setDefaultAction(openNextImg) + + ############# Zoom layout ############## + zoomLayout = QHBoxLayout() + zoomLayout.addStretch() + self.zoominButton = QToolButton() + self.zoominButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.zoominButton.setDefaultAction(zoomIn) + self.zoomoutButton = QToolButton() + self.zoomoutButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.zoomoutButton.setDefaultAction(zoomOut) + self.zoomorgButton = QToolButton() + self.zoomorgButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) + self.zoomorgButton.setDefaultAction(zoomOrg) + zoomLayout.addWidget(self.zoominButton) + zoomLayout.addWidget(self.zoomorgButton) + zoomLayout.addWidget(self.zoomoutButton) + + zoomContainer = QWidget() + zoomContainer.setLayout(zoomLayout) + zoomContainer.setGeometry(0, 0, 30, 150) + + shapeLineColor = action(getStr('shapeLineColor'), self.chshapeLineColor, + icon='color_line', tip=getStr('shapeLineColorDetail'), + enabled=False) + shapeFillColor = action(getStr('shapeFillColor'), self.chshapeFillColor, + icon='color', tip=getStr('shapeFillColorDetail'), + enabled=False) + + # labels = self.dock.toggleViewAction() + # labels.setText(getStr('showHide')) + # labels.setShortcut('Ctrl+Shift+L') + + # Label list context menu. + labelMenu = QMenu() + addActions(labelMenu, (edit, delete)) + + self.labelList.setContextMenuPolicy(Qt.CustomContextMenu) + self.labelList.customContextMenuRequested.connect( + self.popLabelListMenu) + + # Draw squares/rectangles + self.drawSquaresOption = QAction(getStr('drawSquares'), self) + self.drawSquaresOption.setShortcut('Ctrl+Shift+R') + self.drawSquaresOption.setCheckable(True) + self.drawSquaresOption.setChecked(settings.get(SETTING_DRAW_SQUARE, False)) + self.drawSquaresOption.triggered.connect(self.toogleDrawSquare) + + # Store actions for further handling. + self.actions = struct(save=save, open=open, resetAll=resetAll, deleteImg=deleteImg, + lineColor=color1, create=create, delete=delete, edit=edit, copy=copy, + saveRec=saveRec, + createMode=createMode, editMode=editMode, + shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor, + zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg, + fitWindow=fitWindow, fitWidth=fitWidth, + zoomActions=zoomActions, + fileMenuActions=( + open, opendir, save, resetAll, quit), + beginner=(), advanced=(), + editMenu=(createpoly, edit, copy, delete, + None, color1, self.drawSquaresOption), + beginnerContext=(create, edit, copy, delete), + advancedContext=(createMode, editMode, edit, copy, + delete, shapeLineColor, shapeFillColor), + onLoadActive=( + create, createMode, editMode), + onShapesPresent=(hideAll, showAll)) + + # menus + self.menus = struct( + file=self.menu('&'+getStr('mfile')), + edit=self.menu('&'+getStr('medit')), + view=self.menu('&'+getStr('mview')), + autolabel=self.menu('&PaddleOCR'), + help=self.menu('&'+getStr('mhelp')), + recentFiles=QMenu('Open &Recent'), + labelList=labelMenu) + + + # Sync single class mode from PR#106 + self.singleClassMode = QAction(getStr('singleClsMode'), self) + self.singleClassMode.setShortcut("Ctrl+Shift+S") + self.singleClassMode.setCheckable(True) + self.singleClassMode.setChecked(settings.get(SETTING_SINGLE_CLASS, False)) + self.lastLabel = None + # Add option to enable/disable labels being displayed at the top of bounding boxes + self.displayLabelOption = QAction(getStr('displayLabel'), self) + self.displayLabelOption.setShortcut("Ctrl+Shift+P") + self.displayLabelOption.setCheckable(True) + self.displayLabelOption.setChecked(settings.get(SETTING_PAINT_LABEL, False)) + self.displayLabelOption.triggered.connect(self.togglePaintLabelsOption) + + addActions(self.menus.file, + (opendir, None, save, resetAll, deleteImg, quit)) + + addActions(self.menus.help, (showSteps, showInfo)) + addActions(self.menus.view, ( + self.displayLabelOption, # labels, + None, + hideAll, showAll, None, + zoomIn, zoomOut, zoomOrg, None, + fitWindow, fitWidth)) + + addActions(self.menus.autolabel, (alcm, saveRec, None, help)) # + + self.menus.file.aboutToShow.connect(self.updateFileMenu) + + # Custom context menu for the canvas widget: + addActions(self.canvas.menus[0], self.actions.beginnerContext) + addActions(self.canvas.menus[1], ( + action('&Copy here', self.copyShape), + action('&Move here', self.moveShape))) + + # self.tools = self.toolbar('Tools') + + self.actions.beginner = ( + open, opendir, openNextImg, openPrevImg, verify, save, None, create, copy, delete, None, + zoomIn, zoom, zoomOut, fitWindow, fitWidth) + + self.actions.advanced = ( + open, opendir, openNextImg, openPrevImg, save, None, + createMode, editMode, None, + hideAll, showAll) + + self.statusBar().showMessage('%s started.' % __appname__) + self.statusBar().show() + + # Application state. + self.image = QImage() + self.filePath = ustr(defaultFilename) + self.lastOpenDir = None + self.recentFiles = [] + self.maxRecent = 7 + self.lineColor = None + self.fillColor = None + self.zoom_level = 100 + self.fit_window = False + # Add Chris + self.difficult = False + + ## Fix the compatible issue for qt4 and qt5. Convert the QStringList to python list + if settings.get(SETTING_RECENT_FILES): + if have_qstring(): + recentFileQStringList = settings.get(SETTING_RECENT_FILES) + self.recentFiles = [ustr(i) for i in recentFileQStringList] + else: + self.recentFiles = recentFileQStringList = settings.get(SETTING_RECENT_FILES) + + size = settings.get(SETTING_WIN_SIZE, QSize(1200, 800)) + + position = QPoint(0, 0) + saved_position = settings.get(SETTING_WIN_POSE, position) + # Fix the multiple monitors issue + for i in range(QApplication.desktop().screenCount()): + if QApplication.desktop().availableGeometry(i).contains(saved_position): + position = saved_position + break + self.resize(size) + self.move(position) + saveDir = ustr(settings.get(SETTING_SAVE_DIR, None)) + self.lastOpenDir = ustr(settings.get(SETTING_LAST_OPEN_DIR, None)) + + self.restoreState(settings.get(SETTING_WIN_STATE, QByteArray())) + Shape.line_color = self.lineColor = QColor(settings.get(SETTING_LINE_COLOR, DEFAULT_LINE_COLOR)) + Shape.fill_color = self.fillColor = QColor(settings.get(SETTING_FILL_COLOR, DEFAULT_FILL_COLOR)) + self.canvas.setDrawingColor(self.lineColor) + # Add chris + Shape.difficult = self.difficult + + + # ADD: + # Populate the File menu dynamically. + self.updateFileMenu() + + # Since loading the file may take some time, make sure it runs in the background. + if self.filePath and os.path.isdir(self.filePath): + self.queueEvent(partial(self.importDirImages, self.filePath or "")) + elif self.filePath: + self.queueEvent(partial(self.loadFile, self.filePath or "")) + + # Callbacks: + self.zoomWidget.valueChanged.connect(self.paintCanvas) + + self.populateModeActions() + + # Display cursor coordinates at the right of status bar + self.labelCoordinates = QLabel('') + self.statusBar().addPermanentWidget(self.labelCoordinates) + + # Open Dir if deafult file + if self.filePath and os.path.isdir(self.filePath): + self.openDirDialog(dirpath=self.filePath, silent=True) + + def keyReleaseEvent(self, event): + if event.key() == Qt.Key_Control: + self.canvas.setDrawingShapeToSquare(False) + + def keyPressEvent(self, event): + if event.key() == Qt.Key_Control: + # Draw rectangle if Ctrl is pressed + self.canvas.setDrawingShapeToSquare(True) + + + def noShapes(self): + return not self.itemsToShapes + + + def populateModeActions(self): + self.canvas.menus[0].clear() + addActions(self.canvas.menus[0], self.actions.beginnerContext) + self.menus.edit.clear() + actions = (self.actions.create,) # if self.beginner() else (self.actions.createMode, self.actions.editMode) + addActions(self.menus.edit, actions + self.actions.editMenu) + + + def setDirty(self): + self.dirty = True + self.actions.save.setEnabled(True) + + def setClean(self): + self.dirty = False + self.actions.save.setEnabled(False) + self.actions.create.setEnabled(True) + + def toggleActions(self, value=True): + """Enable/Disable widgets which depend on an opened image.""" + for z in self.actions.zoomActions: + z.setEnabled(value) + for action in self.actions.onLoadActive: + action.setEnabled(value) + + def queueEvent(self, function): + QTimer.singleShot(0, function) + + def status(self, message, delay=5000): + self.statusBar().showMessage(message, delay) + + def resetState(self): + self.itemsToShapes.clear() + self.shapesToItems.clear() + self.itemsToShapesbox.clear() # ADD + self.shapesToItemsbox.clear() + self.labelList.clear() + self.BoxList.clear() + self.filePath = None + self.imageData = None + self.labelFile = None + self.canvas.resetState() + self.labelCoordinates.clear() + # self.comboBox.cb.clear() + self.result_dic = [] + + def currentItem(self): + items = self.labelList.selectedItems() + if items: + return items[0] + return None + + def currentBox(self): + items = self.BoxList.selectedItems() + if items: + return items[0] + return None + + def addRecentFile(self, filePath): + if filePath in self.recentFiles: + self.recentFiles.remove(filePath) + elif len(self.recentFiles) >= self.maxRecent: + self.recentFiles.pop() + self.recentFiles.insert(0, filePath) + + def beginner(self): + return self._beginner + + def advanced(self): + return not self.beginner() + + def getAvailableScreencastViewer(self): + osName = platform.system() + + if osName == 'Windows': + return ['C:\\Program Files\\Internet Explorer\\iexplore.exe'] + elif osName == 'Linux': + return ['xdg-open'] + elif osName == 'Darwin': + return ['open'] + + ## Callbacks ## + def showTutorialDialog(self): + subprocess.Popen(self.screencastViewer + [self.screencast]) + + def showInfoDialog(self): + from libs.__init__ import __version__ + msg = u'Name:{0} \nApp Version:{1} \n{2} '.format(__appname__, __version__, sys.version_info) + QMessageBox.information(self, u'Information', msg) + + def showStepsDialog(self): + msg = stepsInfo(self.lang) + QMessageBox.information(self, u'Information', msg) + + def createShape(self): + assert self.beginner() + self.canvas.setEditing(False) + self.actions.create.setEnabled(False) + self.canvas.fourpoint = False + + def createPolygon(self): + assert self.beginner() + self.canvas.setEditing(False) + self.canvas.fourpoint = True + self.actions.create.setEnabled(False) + + def toggleDrawingSensitive(self, drawing=True): + """In the middle of drawing, toggling between modes should be disabled.""" + self.actions.editMode.setEnabled(not drawing) + if not drawing and self.beginner(): + # Cancel creation. + print('Cancel creation.') + self.canvas.setEditing(True) + self.canvas.restoreCursor() + self.actions.create.setEnabled(True) + + def toggleDrawMode(self, edit=True): + self.canvas.setEditing(edit) + self.actions.createMode.setEnabled(edit) + self.actions.editMode.setEnabled(not edit) + + def setCreateMode(self): + assert self.advanced() + self.toggleDrawMode(False) + + def setEditMode(self): + assert self.advanced() + self.toggleDrawMode(True) + self.labelSelectionChanged() + + def updateFileMenu(self): + currFilePath = self.filePath + + def exists(filename): + return os.path.exists(filename) + + menu = self.menus.recentFiles + menu.clear() + files = [f for f in self.recentFiles if f != + currFilePath and exists(f)] + for i, f in enumerate(files): + icon = newIcon('labels') + action = QAction( + icon, '&%d %s' % (i + 1, QFileInfo(f).fileName()), self) + action.triggered.connect(partial(self.loadRecent, f)) + menu.addAction(action) + + def popLabelListMenu(self, point): + self.menus.labelList.exec_(self.labelList.mapToGlobal(point)) + + def editLabel(self): + if not self.canvas.editing(): + return + item = self.currentItem() + if not item: + return + text = self.labelDialog.popUp(item.text()) + if text is not None: + item.setText(text) + # item.setBackground(generateColorByText(text)) + self.setDirty() + self.updateComboBox() + + ######## detection box related functions ####### + + def boxItemChanged(self, item): + shape = self.itemsToShapesbox[item] + + box = ast.literal_eval(item.text()) + # print('shape in labelItemChanged is',shape.points) + if box != [(p.x(), p.y()) for p in shape.points]: + # shape.points = box + shape.points = [QPointF(p[0], p[1]) for p in box] + + # QPointF(x,y) + # shape.line_color = generateColorByText(shape.label) + self.setDirty() + else: # User probably changed item visibility + self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked) + + def editBox(self): # ADD + if not self.canvas.editing(): + return + item = self.currentBox() + if not item: + return + text = self.labelDialog.popUp(item.text()) + + imageSize = str(self.image.size()) + width, height = self.image.width(), self.image.height() + if text: + try: + text_list = eval(text) + except: + msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Please enter the correct format') + msg_box.exec_() + return + if len(text_list) < 4: + msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Please enter the coordinates of 4 points') + msg_box.exec_() + return + for box in text_list: + if box[0] > width or box[0] < 0 or box[1] > height or box[1] < 0: + msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Out of picture size') + msg_box.exec_() + return + + item.setText(text) + # item.setBackground(generateColorByText(text)) + self.setDirty() + self.updateComboBox() + + def updateBoxlist(self): + shape = self.canvas.selectedShape + item = self.shapesToItemsbox[shape] # listitem + text = [(int(p.x()), int(p.y())) for p in shape.points] + item.setText(str(text)) + self.setDirty() + + def indexTo5Files(self, currIndex): + if currIndex < 2: + return self.mImgList[:5] + elif currIndex > len(self.mImgList)-3: + return self.mImgList[-5:] + else: + return self.mImgList[currIndex - 2 : currIndex + 3] + + + # Tzutalin 20160906 : Add file list and dock to move faster + def fileitemDoubleClicked(self, item=None): + self.currIndex = self.mImgList.index(ustr(os.path.join(os.path.abspath(self.dirname), item.text()))) + filename = self.mImgList[self.currIndex] + if filename: + self.mImgList5 = self.indexTo5Files(self.currIndex) + # self.additems5(None) + self.loadFile(filename) + + def iconitemDoubleClicked(self, item=None): + self.currIndex = self.mImgList.index(ustr(os.path.join(item.toolTip()))) + filename = self.mImgList[self.currIndex] + if filename: + self.mImgList5 = self.indexTo5Files(self.currIndex) + # self.additems5(None) + self.loadFile(filename) + + def CanvasSizeChange(self): + if len(self.mImgList) > 0: + self.zoomWidget.setValue(self.zoomWidgetValue + self.imgsplider.value()) + + # Add chris + def btnstate(self, item=None): + """ Function to handle difficult examples + Update on each object """ + if not self.canvas.editing(): + return + + item = self.currentItem() + if not item: # If not selected Item, take the first one + item = self.labelList.item(self.labelList.count() - 1) + + difficult = self.diffcButton.isChecked() + + try: + shape = self.itemsToShapes[item] + except: + pass + # Checked and Update + try: + if difficult != shape.difficult: + shape.difficult = difficult + self.setDirty() + else: # User probably changed item visibility + self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked) + except: + pass + + # React to canvas signals. + def shapeSelectionChanged(self, selected=False): + if self._noSelectionSlot: + self._noSelectionSlot = False + else: + shape = self.canvas.selectedShape + if shape: + self.shapesToItems[shape].setSelected(True) + self.shapesToItemsbox[shape].setSelected(True) # ADD + else: + self.labelList.clearSelection() + self.actions.delete.setEnabled(selected) + self.actions.copy.setEnabled(selected) + self.actions.edit.setEnabled(selected) + self.actions.shapeLineColor.setEnabled(selected) + self.actions.shapeFillColor.setEnabled(selected) + + def addLabel(self, shape): + shape.paintLabel = self.displayLabelOption.isChecked() + item = HashableQListWidgetItem(shape.label) + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked) + # item.setBackground(generateColorByText(shape.label)) + self.itemsToShapes[item] = shape + self.shapesToItems[shape] = item + self.labelList.addItem(item) + # print('item in add label is ',[(p.x(), p.y()) for p in shape.points], shape.label) + + # ADD for box + item = HashableQListWidgetItem(str([(int(p.x()), int(p.y())) for p in shape.points])) + # item = QListWidgetItem(str([(p.x(), p.y()) for p in shape.points])) + item.setFlags(item.flags() | Qt.ItemIsUserCheckable) + item.setCheckState(Qt.Checked) + # item.setBackground(generateColorByText(shape.label)) + self.itemsToShapesbox[item] = shape + self.shapesToItemsbox[shape] = item + self.BoxList.addItem(item) + for action in self.actions.onShapesPresent: + action.setEnabled(True) + self.updateComboBox() + + def remLabel(self, shape): + if shape is None: + # print('rm empty label') + return + item = self.shapesToItems[shape] + self.labelList.takeItem(self.labelList.row(item)) + del self.shapesToItems[shape] + del self.itemsToShapes[item] + self.updateComboBox() + + # ADD: + item = self.shapesToItemsbox[shape] + self.BoxList.takeItem(self.BoxList.row(item)) + del self.shapesToItemsbox[shape] + del self.itemsToShapesbox[item] + self.updateComboBox() + + def loadLabels(self, shapes): + s = [] + for label, points, line_color, fill_color, difficult in shapes: + shape = Shape(label=label) + for x, y in points: + + # Ensure the labels are within the bounds of the image. If not, fix them. + x, y, snapped = self.canvas.snapPointToCanvas(x, y) + if snapped: + self.setDirty() + + shape.addPoint(QPointF(x, y)) + shape.difficult = difficult + shape.close() + s.append(shape) + + # if line_color: + # shape.line_color = QColor(*line_color) + # else: + # shape.line_color = generateColorByText(label) + # + # if fill_color: + # shape.fill_color = QColor(*fill_color) + # else: + # shape.fill_color = generateColorByText(label) + + self.addLabel(shape) + self.updateComboBox() + self.canvas.loadShapes(s) + + def updateComboBox(self): + # Get the unique labels and add them to the Combobox. + itemsTextList = [str(self.labelList.item(i).text()) for i in range(self.labelList.count())] + + uniqueTextList = list(set(itemsTextList)) + # Add a null row for showing all the labels + uniqueTextList.append("") + uniqueTextList.sort() + + # self.comboBox.update_items(uniqueTextList) + + def saveLabels(self, annotationFilePath, mode='Auto'): + annotationFilePath = ustr(annotationFilePath) + if self.labelFile is None: + self.labelFile = LabelFile() + self.labelFile.verified = self.canvas.verified + + def format_shape(s): + # print('s in saveLabels is ',s) + return dict(label=s.label, # str + line_color=s.line_color.getRgb(), + fill_color=s.fill_color.getRgb(), + points=[(p.x(), p.y()) for p in s.points], # QPonitF + # add chris + difficult=s.difficult) # bool + + shapes = [] if mode == 'Auto' else \ + [format_shape(shape) for shape in self.canvas.shapes] + # Can add differrent annotation formats here + + if self.model == 'paddle': + for box in self.result_dic: + trans_dic = {"label": box[1][0], "points": box[0], 'difficult': False} + if trans_dic["label"] is "" and mode == 'Auto': + continue + shapes.append(trans_dic) + + try: + trans_dic = [] + for box in shapes: + trans_dic.append({"transcription": box['label'], "points": box['points'], 'difficult': False}) + self.PPlabel[annotationFilePath] = trans_dic + + if mode == 'Auto': + self.Cachelabel[annotationFilePath] = trans_dic + + # else: + # self.labelFile.save(annotationFilePath, shapes, self.filePath, self.imageData, + # self.lineColor.getRgb(), self.fillColor.getRgb()) + # print('Image:{0} -> Annotation:{1}'.format(self.filePath, annotationFilePath)) + return True + except LabelFileError as e: + self.errorMessage(u'Error saving label data', u'%s' % e) + return False + + def copySelectedShape(self): + self.addLabel(self.canvas.copySelectedShape()) + # fix copy and delete + self.shapeSelectionChanged(True) + + + def labelSelectionChanged(self): + item = self.currentItem() + if item and self.canvas.editing(): + self._noSelectionSlot = True + self.canvas.selectShape(self.itemsToShapes[item]) + shape = self.itemsToShapes[item] + # Add Chris + self.diffcButton.setChecked(shape.difficult) + + def boxSelectionChanged(self): + item = self.currentBox() + if item and self.canvas.editing(): + self._noSelectionSlot = True + self.canvas.selectShape(self.itemsToShapesbox[item]) + shape = self.itemsToShapesbox[item] + # Add Chris + self.diffcButton.setChecked(shape.difficult) + + def labelItemChanged(self, item): + shape = self.itemsToShapes[item] + label = item.text() + if label != shape.label: + shape.label = item.text() + # shape.line_color = generateColorByText(shape.label) + self.setDirty() + else: # User probably changed item visibility + self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked) + + # Callback functions: + def newShape(self): + """Pop-up and give focus to the label editor. + + position MUST be in global coordinates. + """ + if len(self.labelHist) > 0: + self.labelDialog = LabelDialog( + parent=self, listItem=self.labelHist) + + # Sync single class mode from PR#106 + if self.singleClassMode.isChecked() and self.lastLabel: + text = self.lastLabel + else: + text = self.labelDialog.popUp(text=self.prevLabelText) + self.lastLabel = text + + # Add Chris + self.diffcButton.setChecked(False) + if text is not None: + self.prevLabelText = self.stringBundle.getString('tempLabel') + # generate_color = generateColorByText(text) + shape = self.canvas.setLastLabel(text, None, None)#generate_color, generate_color + self.addLabel(shape) + if self.beginner(): # Switch to edit mode. + self.canvas.setEditing(True) + self.actions.create.setEnabled(True) + else: + self.actions.editMode.setEnabled(True) + self.setDirty() + + else: + # self.canvas.undoLastLine() + self.canvas.resetAllLines() + + def scrollRequest(self, delta, orientation): + units = - delta / (8 * 15) + bar = self.scrollBars[orientation] + bar.setValue(bar.value() + bar.singleStep() * units) + + def setZoom(self, value): + self.actions.fitWidth.setChecked(False) + self.actions.fitWindow.setChecked(False) + self.zoomMode = self.MANUAL_ZOOM + self.zoomWidget.setValue(value) + + def addZoom(self, increment=10): + self.setZoom(self.zoomWidget.value() + increment) + + def zoomRequest(self, delta): + # get the current scrollbar positions + # calculate the percentages ~ coordinates + h_bar = self.scrollBars[Qt.Horizontal] + v_bar = self.scrollBars[Qt.Vertical] + + # get the current maximum, to know the difference after zooming + h_bar_max = h_bar.maximum() + v_bar_max = v_bar.maximum() + + # get the cursor position and canvas size + # calculate the desired movement from 0 to 1 + # where 0 = move left + # 1 = move right + # up and down analogous + cursor = QCursor() + pos = cursor.pos() + relative_pos = QWidget.mapFromGlobal(self, pos) + + cursor_x = relative_pos.x() + cursor_y = relative_pos.y() + + w = self.scrollArea.width() + h = self.scrollArea.height() + + # the scaling from 0 to 1 has some padding + # you don't have to hit the very leftmost pixel for a maximum-left movement + margin = 0.1 + move_x = (cursor_x - margin * w) / (w - 2 * margin * w) + move_y = (cursor_y - margin * h) / (h - 2 * margin * h) + + # clamp the values from 0 to 1 + move_x = min(max(move_x, 0), 1) + move_y = min(max(move_y, 0), 1) + + # zoom in + units = delta / (8 * 15) + scale = 10 + self.addZoom(scale * units) + + # get the difference in scrollbar values + # this is how far we can move + d_h_bar_max = h_bar.maximum() - h_bar_max + d_v_bar_max = v_bar.maximum() - v_bar_max + + # get the new scrollbar values + new_h_bar_value = h_bar.value() + move_x * d_h_bar_max + new_v_bar_value = v_bar.value() + move_y * d_v_bar_max + + h_bar.setValue(new_h_bar_value) + v_bar.setValue(new_v_bar_value) + + def setFitWindow(self, value=True): + if value: + self.actions.fitWidth.setChecked(False) + self.zoomMode = self.FIT_WINDOW if value else self.MANUAL_ZOOM + self.adjustScale() + + def setFitWidth(self, value=True): + if value: + self.actions.fitWindow.setChecked(False) + self.zoomMode = self.FIT_WIDTH if value else self.MANUAL_ZOOM + self.adjustScale() + + def togglePolygons(self, value): + for item, shape in self.itemsToShapes.items(): + item.setCheckState(Qt.Checked if value else Qt.Unchecked) + + def loadFile(self, filePath=None): + """Load the specified file, or the last opened file if None.""" + self.resetState() + self.canvas.setEnabled(False) + if filePath is None: + filePath = self.settings.get(SETTING_FILENAME) + + # Make sure that filePath is a regular python string, rather than QString + filePath = ustr(filePath) + # Fix bug: An index error after select a directory when open a new file. + unicodeFilePath = ustr(filePath) + # unicodeFilePath = os.path.abspath(unicodeFilePath) + # Tzutalin 20160906 : Add file list and dock to move faster + # Highlight the file item + if unicodeFilePath and self.fileListWidget.count() > 0: + if unicodeFilePath in self.mImgList: + index = self.mImgList.index(unicodeFilePath) + fileWidgetItem = self.fileListWidget.item(index) + print('unicodeFilePath is', unicodeFilePath) + fileWidgetItem.setSelected(True) + ### + self.iconlist.clear() + self.additems5(None) + for i in range(5): + item_tooltip = self.iconlist.item(i).toolTip() + # print(i,"---",item_tooltip) + if item_tooltip == ustr(filePath): + titem = self.iconlist.item(i) + titem.setSelected(True) + self.iconlist.scrollToItem(titem) + break + else: + self.fileListWidget.clear() + self.mImgList.clear() + self.iconlist.clear() + + # if unicodeFilePath and self.iconList.count() > 0: + # if unicodeFilePath in self.mImgList: + + if unicodeFilePath and os.path.exists(unicodeFilePath): + if LabelFile.isLabelFile(unicodeFilePath): + try: + self.labelFile = LabelFile(unicodeFilePath) + except LabelFileError as e: + self.errorMessage(u'Error opening file', + (u"

%s

" + u"

Make sure %s is a valid label file.") + % (e, unicodeFilePath)) + self.status("Error reading %s" % unicodeFilePath) + return False + self.imageData = self.labelFile.imageData + self.lineColor = QColor(*self.labelFile.lineColor) + self.fillColor = QColor(*self.labelFile.fillColor) + self.canvas.verified = self.labelFile.verified + else: + # Load image: + # read data first and store for saving into label file. + self.imageData = read(unicodeFilePath, None) + self.labelFile = None + self.canvas.verified = False + + image = QImage.fromData(self.imageData) + if image.isNull(): + self.errorMessage(u'Error opening file', + u"

Make sure %s is a valid image file." % unicodeFilePath) + self.status("Error reading %s" % unicodeFilePath) + return False + self.status("Loaded %s" % os.path.basename(unicodeFilePath)) + self.image = image + self.filePath = unicodeFilePath + self.canvas.loadPixmap(QPixmap.fromImage(image)) + if self.labelFile: + self.loadLabels(self.labelFile.shapes) + if self.validFilestate(filePath) is True: + self.setClean() + else: + self.dirty = False + self.actions.save.setEnabled(True) + + self.canvas.setEnabled(True) + self.adjustScale(initial=True) + self.paintCanvas() + self.addRecentFile(self.filePath) + self.toggleActions(True) + self.showBoundingBoxFromPPlabel(filePath) + + self.setWindowTitle(__appname__ + ' ' + filePath) + + # Default : select last item if there is at least one item + if self.labelList.count(): + self.labelList.setCurrentItem(self.labelList.item(self.labelList.count() - 1)) + self.labelList.item(self.labelList.count() - 1).setSelected(True) + + self.canvas.setFocus(True) + return True + return False + + + def showBoundingBoxFromPPlabel(self, filePath): + imgidx = self.getImglabelidx(filePath) + if imgidx not in self.PPlabel.keys(): + return + shapes = [] + for box in self.PPlabel[imgidx]: + shapes.append((box['transcription'], box['points'], None, None, box['difficult'])) + + print(shapes) + self.loadLabels(shapes) + self.canvas.verified = False + + + def validFilestate(self, filePath): + if filePath not in self.fileStatedict.keys(): + return None + elif self.fileStatedict[filePath] == 1: + return True + else: + return False + + def resizeEvent(self, event): + if self.canvas and not self.image.isNull() \ + and self.zoomMode != self.MANUAL_ZOOM: + self.adjustScale() + super(MainWindow, self).resizeEvent(event) + + def paintCanvas(self): + assert not self.image.isNull(), "cannot paint null image" + self.canvas.scale = 0.01 * self.zoomWidget.value() + self.canvas.adjustSize() + self.canvas.update() + + def adjustScale(self, initial=False): + value = self.scalers[self.FIT_WINDOW if initial else self.zoomMode]() + self.zoomWidget.setValue(int(100 * value)) + + def scaleFitWindow(self): + """Figure out the size of the pixmap in order to fit the main widget.""" + e = 2.0 # So that no scrollbars are generated. + w1 = self.centralWidget().width() - e + h1 = self.centralWidget().height() - e -110 + a1 = w1 / h1 + # Calculate a new scale value based on the pixmap's aspect ratio. + w2 = self.canvas.pixmap.width() - 0.0 + h2 = self.canvas.pixmap.height() - 0.0 + a2 = w2 / h2 + return w1 / w2 if a2 >= a1 else h1 / h2 + + def scaleFitWidth(self): + # The epsilon does not seem to work too well here. + w = self.centralWidget().width() - 2.0 + return w / self.canvas.pixmap.width() + + def closeEvent(self, event): + if not self.mayContinue(): + event.ignore() + else: + settings = self.settings + # If it loads images from dir, don't load it at the begining + if self.dirname is None: + settings[SETTING_FILENAME] = self.filePath if self.filePath else '' + else: + settings[SETTING_FILENAME] = '' + + settings[SETTING_WIN_SIZE] = self.size() + settings[SETTING_WIN_POSE] = self.pos() + settings[SETTING_WIN_STATE] = self.saveState() + settings[SETTING_LINE_COLOR] = self.lineColor + settings[SETTING_FILL_COLOR] = self.fillColor + settings[SETTING_RECENT_FILES] = self.recentFiles + settings[SETTING_ADVANCE_MODE] = not self._beginner + if self.defaultSaveDir and os.path.exists(self.defaultSaveDir): + settings[SETTING_SAVE_DIR] = ustr(self.defaultSaveDir) + else: + settings[SETTING_SAVE_DIR] = '' + + if self.lastOpenDir and os.path.exists(self.lastOpenDir): + settings[SETTING_LAST_OPEN_DIR] = self.lastOpenDir + else: + settings[SETTING_LAST_OPEN_DIR] = '' + + settings[SETTING_SINGLE_CLASS] = self.singleClassMode.isChecked() + settings[SETTING_PAINT_LABEL] = self.displayLabelOption.isChecked() + settings[SETTING_DRAW_SQUARE] = self.drawSquaresOption.isChecked() + settings.save() + try: + self.saveFilestate() + self.savePPlabel() + except: + pass + + def loadRecent(self, filename): + if self.mayContinue(): + self.loadFile(filename) + + def scanAllImages(self, folderPath): + extensions = ['.%s' % fmt.data().decode("ascii").lower() for fmt in QImageReader.supportedImageFormats()] + images = [] + + for file in os.listdir(folderPath): + if file.lower().endswith(tuple(extensions)): + relativePath = os.path.join(folderPath, file) + path = ustr(os.path.abspath(relativePath)) + images.append(path) + natural_sort(images, key=lambda x: x.lower()) + return images + + + + def openDirDialog(self, _value=False, dirpath=None, silent=False): + if not self.mayContinue(): + return + + defaultOpenDirPath = dirpath if dirpath else '.' + if self.lastOpenDir and os.path.exists(self.lastOpenDir): + defaultOpenDirPath = self.lastOpenDir + else: + defaultOpenDirPath = os.path.dirname(self.filePath) if self.filePath else '.' + if silent != True: + targetDirPath = ustr(QFileDialog.getExistingDirectory(self, + '%s - Open Directory' % __appname__, + defaultOpenDirPath, + QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)) + else: + targetDirPath = ustr(defaultOpenDirPath) + self.lastOpenDir = targetDirPath + self.importDirImages(targetDirPath) + + def importDirImages(self, dirpath, isDelete = False): + if not self.mayContinue() or not dirpath: + return + if self.defaultSaveDir and self.defaultSaveDir != dirpath: + self.saveFilestate() + self.savePPlabel() + + if not isDelete: + self.loadFilestate(dirpath) + self.PPlabelpath = dirpath+ '/Label.txt' + self.PPlabel = self.loadLabelFile(self.PPlabelpath) + self.Cachelabelpath = dirpath + '/Cache.cach' + self.Cachelabel = self.loadLabelFile(self.Cachelabelpath) + if self.Cachelabel: + self.PPlabel = dict(self.Cachelabel, **self.PPlabel) + self.lastOpenDir = dirpath + self.dirname = dirpath + + + self.defaultSaveDir = dirpath + self.statusBar().showMessage('%s started. Annotation will be saved to %s' % + (__appname__, self.defaultSaveDir)) + self.statusBar().show() + + self.filePath = None + self.fileListWidget.clear() + self.mImgList = self.scanAllImages(dirpath) + self.mImgList5 = self.mImgList[:5] + self.openNextImg() + doneicon = newIcon('done') + closeicon = newIcon('close') + for imgPath in self.mImgList: + filename = os.path.basename(imgPath) + if self.validFilestate(imgPath) is True: + item = QListWidgetItem(doneicon, filename) + else: + item = QListWidgetItem(closeicon, filename) + self.fileListWidget.addItem(item) + + print('dirPath in importDirImages is', dirpath) + self.iconlist.clear() + self.additems5(dirpath) + self.changeFileFolder = True + self.haveAutoReced = False + self.AutoRecognition.setEnabled(True) + self.reRecogButton.setEnabled(True) + + def verifyImg(self, _value=False): + # Proceding next image without dialog if having any label + if self.filePath is not None: + try: + self.labelFile.toggleVerify() + except AttributeError: + # If the labelling file does not exist yet, create if and + # re-save it with the verified attribute. + self.saveFile() + if self.labelFile != None: + self.labelFile.toggleVerify() + else: + return + + self.canvas.verified = self.labelFile.verified + self.paintCanvas() + self.saveFile() + + def openPrevImg(self, _value=False): + if len(self.mImgList) <= 0: + return + + if self.filePath is None: + return + + currIndex = self.mImgList.index(self.filePath) + self.mImgList5 = self.mImgList[:5] + if currIndex - 1 >= 0: + filename = self.mImgList[currIndex - 1] + self.mImgList5 = self.indexTo5Files(currIndex - 1) + if filename: + self.loadFile(filename) + + def openNextImg(self, _value=False): + if not self.mayContinue(): + return + + if len(self.mImgList) <= 0: + return + + filename = None + if self.filePath is None: + filename = self.mImgList[0] + self.mImgList5 = self.mImgList[:5] + else: + currIndex = self.mImgList.index(self.filePath) + if currIndex + 1 < len(self.mImgList): + filename = self.mImgList[currIndex + 1] + self.mImgList5 = self.indexTo5Files(currIndex + 1) + else: + self.mImgList5 = self.indexTo5Files(currIndex) + if filename: + print('file name in openNext is ',filename) + self.loadFile(filename) + + def openFile(self, _value=False): + if not self.mayContinue(): + return + path = os.path.dirname(ustr(self.filePath)) if self.filePath else '.' + formats = ['*.%s' % fmt.data().decode("ascii").lower() for fmt in QImageReader.supportedImageFormats()] + filters = "Image & Label files (%s)" % ' '.join(formats + ['*%s' % LabelFile.suffix]) + filename = QFileDialog.getOpenFileName(self, '%s - Choose Image or Label file' % __appname__, path, filters) + if filename: + if isinstance(filename, (tuple, list)): + filename = filename[0] + self.loadFile(filename) + # print('filename in openfile is ', self.filePath) + self.filePath = None + self.fileListWidget.clear() + self.iconlist.clear() + self.mImgList = [filename] + self.openNextImg() + if self.validFilestate(filename) is True: + item = QListWidgetItem(newIcon('done'), filename) + self.setClean() + elif self.validFilestate(filename) is None: + item = QListWidgetItem(newIcon('close'), filename) + else: + item = QListWidgetItem(newIcon('close'), filename) + self.setDirty() + self.fileListWidget.addItem(filename) + self.additems5(None) + print('opened image is', filename) + + def updateFileListIcon(self, filename): + pass + + def saveFile(self, _value=False, mode='Manual'): + if self.defaultSaveDir is not None and len(ustr(self.defaultSaveDir)): + if self.filePath: + imgidx = self.getImglabelidx(self.filePath) + self._saveFile(imgidx, mode=mode) + + else: + imgFileDir = os.path.dirname(self.filePath) + imgFileName = os.path.basename(self.filePath) + savedFileName = os.path.splitext(imgFileName)[0] + savedPath = os.path.join(imgFileDir, savedFileName) + self._saveFile(savedPath if self.labelFile + else self.saveFileDialog(removeExt=False), mode=mode) + + def saveFileAs(self, _value=False): + assert not self.image.isNull(), "cannot save empty image" + self._saveFile(self.saveFileDialog()) + + def saveFileDialog(self, removeExt=True): + caption = '%s - Choose File' % __appname__ + filters = 'File (*%s)' % LabelFile.suffix + openDialogPath = self.currentPath() + dlg = QFileDialog(self, caption, openDialogPath, filters) + dlg.setDefaultSuffix(LabelFile.suffix[1:]) + dlg.setAcceptMode(QFileDialog.AcceptSave) + filenameWithoutExtension = os.path.splitext(self.filePath)[0] + dlg.selectFile(filenameWithoutExtension) + dlg.setOption(QFileDialog.DontUseNativeDialog, False) + if dlg.exec_(): + fullFilePath = ustr(dlg.selectedFiles()[0]) + if removeExt: + return os.path.splitext(fullFilePath)[0] # Return file path without the extension. + else: + return fullFilePath + return '' + + def _saveFile(self, annotationFilePath, mode='Manual'): + if mode == 'Manual': + if annotationFilePath and self.saveLabels(annotationFilePath, mode=mode): + self.setClean() + self.statusBar().showMessage('Saved to %s' % annotationFilePath) + self.statusBar().show() + currIndex = self.mImgList.index(self.filePath) + item = self.fileListWidget.item(currIndex) + item.setIcon(newIcon('done')) + + self.fileStatedict[self.filePath] = 1 + if len(self.fileStatedict)%self.autoSaveNum ==0: + self.saveFilestate() + self.savePPlabel(mode='Auto') + + self.fileListWidget.insertItem(int(currIndex), item) + self.openNextImg() + self.actions.saveRec.setEnabled(True) + + elif mode == 'Auto': + if annotationFilePath and self.saveLabels(annotationFilePath, mode=mode): + + self.setClean() + self.statusBar().showMessage('Saved to %s' % annotationFilePath) + self.statusBar().show() + + def closeFile(self, _value=False): + if not self.mayContinue(): + return + self.resetState() + self.setClean() + self.toggleActions(False) + self.canvas.setEnabled(False) + self.actions.saveAs.setEnabled(False) + + def deleteImg(self): + deletePath = self.filePath + if deletePath is not None: + deleteInfo = self.deleteImgDialog() + if deleteInfo == QMessageBox.Yes: + if platform.system() == 'Windows': + from win32com.shell import shell, shellcon + shell.SHFileOperation((0, shellcon.FO_DELETE, deletePath, None, + shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION, + None, None)) + # linux + elif platform.system() == 'Linux': + cmd = 'trash ' + deletePath + os.system(cmd) + # macOS + elif platform.system() == 'Darwin': + import subprocess + absPath = os.path.abspath(deletePath).replace('\\', '\\\\').replace('"', '\\"') + cmd = ['osascript', '-e', + 'tell app "Finder" to move {the POSIX file "' + absPath + '"} to trash'] + print(cmd) + subprocess.call(cmd, stdout=open(os.devnull, 'w')) + + if self.filePath in self.fileStatedict.keys(): + self.fileStatedict.pop(self.filePath) + imgidx = self.getImglabelidx(self.filePath) + if imgidx in self.PPlabel.keys(): + self.PPlabel.pop(imgidx) + self.openNextImg() + self.importDirImages(self.lastOpenDir, isDelete=True) + + def deleteImgDialog(self): + yes, cancel = QMessageBox.Yes, QMessageBox.Cancel + msg = u'The image will be deleted to the recycle bin' + return QMessageBox.warning(self, u'Attention', msg, yes | cancel) + + def resetAll(self): + self.settings.reset() + self.close() + proc = QProcess() + proc.startDetached(os.path.abspath(__file__)) + + def mayContinue(self): # + if not self.dirty: + return True + else: + discardChanges = self.discardChangesDialog() + if discardChanges == QMessageBox.No: + return True + elif discardChanges == QMessageBox.Yes: + self.saveFile() + return True + else: + return False + + def discardChangesDialog(self): + yes, no, cancel = QMessageBox.Yes, QMessageBox.No, QMessageBox.Cancel + msg = u'You have unsaved changes, would you like to save them and proceed?\nClick "No" to undo all changes.' + return QMessageBox.warning(self, u'Attention', msg, yes | no | cancel) + + def errorMessage(self, title, message): + return QMessageBox.critical(self, title, + '

%s

%s' % (title, message)) + + def currentPath(self): + return os.path.dirname(self.filePath) if self.filePath else '.' + + def chooseColor1(self): + color = self.colorDialog.getColor(self.lineColor, u'Choose line color', + default=DEFAULT_LINE_COLOR) + if color: + self.lineColor = color + Shape.line_color = color + self.canvas.setDrawingColor(color) + self.canvas.update() + self.setDirty() + + def deleteSelectedShape(self): + self.remLabel(self.canvas.deleteSelected()) + self.setDirty() + if self.noShapes(): + for action in self.actions.onShapesPresent: + action.setEnabled(False) + + def chshapeLineColor(self): + color = self.colorDialog.getColor(self.lineColor, u'Choose line color', + default=DEFAULT_LINE_COLOR) + if color: + self.canvas.selectedShape.line_color = color + self.canvas.update() + self.setDirty() + + def chshapeFillColor(self): + color = self.colorDialog.getColor(self.fillColor, u'Choose fill color', + default=DEFAULT_FILL_COLOR) + if color: + self.canvas.selectedShape.fill_color = color + self.canvas.update() + self.setDirty() + + def copyShape(self): + self.canvas.endMove(copy=True) + self.addLabel(self.canvas.selectedShape) + self.setDirty() + + def moveShape(self): + self.canvas.endMove(copy=False) + self.setDirty() + + def loadPredefinedClasses(self, predefClassesFile): + if os.path.exists(predefClassesFile) is True: + with codecs.open(predefClassesFile, 'r', 'utf8') as f: + for line in f: + line = line.strip() + if self.labelHist is None: + self.labelHist = [line] + else: + self.labelHist.append(line) + + + def togglePaintLabelsOption(self): + for shape in self.canvas.shapes: + shape.paintLabel = self.displayLabelOption.isChecked() + + def toogleDrawSquare(self): + self.canvas.setDrawingShapeToSquare(self.drawSquaresOption.isChecked()) + + def additems(self, dirpath): + for file in self.mImgList: + pix = QPixmap(file) + _, filename = os.path.split(file) + filename, _ = os.path.splitext(filename) + item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.IgnoreAspectRatio, Qt.FastTransformation)), + filename[:10]) + item.setToolTip(file) + self.iconlist.addItem(item) + + def additems5(self, dirpath): + for file in self.mImgList5: + pix = QPixmap(file) + _, filename = os.path.split(file) + filename, _ = os.path.splitext(filename) + pfilename = filename[:10] + if len(pfilename) < 10: + lentoken = 12 - len(pfilename) + prelen = lentoken // 2 + bfilename = prelen * " " + pfilename + (lentoken - prelen) * " " + # item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation)),filename[:10]) + item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.IgnoreAspectRatio, Qt.FastTransformation)),pfilename) + # item.setForeground(QBrush(Qt.white)) + item.setToolTip(file) + self.iconlist.addItem(item) + owidth = 0 + for index in range(len(self.mImgList5)): + item = self.iconlist.item(index) + itemwidget = self.iconlist.visualItemRect(item) + owidth += itemwidget.width() + self.iconlist.setMinimumWidth(owidth + 50) + + def getImglabelidx(self, filePath): + if platform.system()=='Windows': + spliter = '\\' + else: + spliter = '/' + filepathsplit = filePath.split(spliter)[-2:] + return filepathsplit[0] + '/' + filepathsplit[1] + + def autoRecognition(self): + assert self.mImgList is not None + print('Using model from ', self.model) + + uncheckedList = [i for i in self.mImgList if i not in self.fileStatedict.keys()] + self.autoDialog = AutoDialog(parent=self, ocr=self.ocr, mImgList=uncheckedList, lenbar=len(uncheckedList)) + self.autoDialog.popUp() + self.currIndex=len(self.mImgList) + self.loadFile(self.filePath) # ADD + self.haveAutoReced = True + self.AutoRecognition.setEnabled(False) + self.setDirty() + self.saveCacheLabel() + + + def reRecognition(self): + img = cv2.imread(self.filePath) + # org_box = [dic['points'] for dic in self.PPlabel[self.getImglabelidx(self.filePath)]] + if self.canvas.shapes: + self.result_dic = [] + rec_flag = 0 + for shape in self.canvas.shapes: + box = [[int(p.x()), int(p.y())] for p in shape.points] + assert len(box) == 4 + img_crop = get_rotate_crop_image(img, np.array(box, np.float32)) + if img_crop is None: + msg = 'Can not recognise the detection box in ' + self.filePath + '. Please change manually' + QMessageBox.information(self, "Information", msg) + return + result = self.ocr.ocr(img_crop, cls=True, det=False) + if result[0][0] is not '': + result.insert(0, box) + print('result in reRec is ', result) + self.result_dic.append(result) + if result[1][0] == shape.label: + print('label no change') + else: + rec_flag += 1 + + if len(self.result_dic) > 0 and rec_flag > 0: + self.saveFile(mode='Auto') + self.loadFile(self.filePath) + self.setDirty() + elif len(self.result_dic) == len(self.canvas.shapes) and rec_flag == 0: + QMessageBox.information(self, "Information", "The recognition result remains unchanged!") + else: + print('Can not recgonise in ', self.filePath) + else: + QMessageBox.information(self, "Information", "Draw a box!") + + + def autolcm(self): + vbox = QVBoxLayout() + hbox = QHBoxLayout() + self.panel = QLabel() + self.panel.setText(self.stringBundle.getString('choseModelLg')) + self.panel.setAlignment(Qt.AlignLeft) + self.comboBox = QComboBox() + self.comboBox.setObjectName("comboBox") + self.comboBox.addItems(['Chinese & English', 'English', 'French', 'German', 'Korean', 'Japanese']) + # self.comboBox_lg = QComboBox() + # self.comboBox_lg.setObjectName("comboBox_language") + vbox.addWidget(self.panel) + vbox.addWidget(self.comboBox) + self.dialog = QDialog() + self.dialog.resize(300, 100) + self.okBtn = QPushButton(self.stringBundle.getString('ok')) + self.cancelBtn = QPushButton(self.stringBundle.getString('cancel')) + + self.okBtn.clicked.connect(self.modelChoose) + self.cancelBtn.clicked.connect(self.cancel) + self.dialog.setWindowTitle(self.stringBundle.getString('choseModelLg')) + + hbox.addWidget(self.okBtn) + hbox.addWidget(self.cancelBtn) + + vbox.addWidget(self.panel) + vbox.addLayout(hbox) + self.dialog.setLayout(vbox) + self.dialog.setWindowModality(Qt.ApplicationModal) + self.dialog.exec_() + if self.filePath: + self.AutoRecognition.setEnabled(True) + + + def modelChoose(self): + print(self.comboBox.currentText()) + lg_idx = {'Chinese & English': 'ch', 'English': 'en', 'French': 'french', 'German': 'german', + 'Korean': 'korean', 'Japanese': 'japan'} + del self.ocr + self.ocr = PaddleOCR(use_pdserving=False, use_angle_cls=True, det=True, cls=True, use_gpu=False, + lang=lg_idx[self.comboBox.currentText()]) + self.dialog.close() + + def cancel(self): + self.dialog.close() + + def loadFilestate(self, saveDir): + self.fileStatepath = saveDir + '/fileState.txt' + self.fileStatedict = {} + if not os.path.exists(self.fileStatepath): + f = open(self.fileStatepath, 'w', encoding='utf-8') + else: + with open(self.fileStatepath, 'r', encoding='utf-8') as f: + states = f.readlines() + for each in states: + file, state = each.split('\t') + self.fileStatedict[file] = 1 + + + def saveFilestate(self): + with open(self.fileStatepath, 'w', encoding='utf-8') as f: + for key in self.fileStatedict: + f.write(key + '\t') + f.write(str(self.fileStatedict[key]) + '\n') + + + def loadLabelFile(self, labelpath): + labeldict = {} + if not os.path.exists(labelpath): + f = open(labelpath, 'w', encoding='utf-8') + + else: + with open(labelpath, 'r', encoding='utf-8') as f: + data = f.readlines() + for each in data: + file, label = each.split('\t') + if label: + label = label.replace('false', 'False') + labeldict[file] = eval(label) + else: + labeldict[file] = [] + return labeldict + + + def savePPlabel(self,mode='Manual'): + savedfile = [self.getImglabelidx(i) for i in self.fileStatedict.keys()] + with open(self.PPlabelpath, 'w', encoding='utf-8') as f: + for key in self.PPlabel: + if key in savedfile: + f.write(key + '\t') + f.write(json.dumps(self.PPlabel[key], ensure_ascii=False) + '\n') + + if mode=='Manual': + msg = 'Images that have been checked are saved in '+ self.PPlabelpath + QMessageBox.information(self, "Information", msg) + + def saveCacheLabel(self): + with open(self.Cachelabelpath, 'w', encoding='utf-8') as f: + for key in self.Cachelabel: + f.write(key + '\t') + f.write(json.dumps(self.Cachelabel[key], ensure_ascii=False) + '\n') + + def saveRecResult(self): + if None in [self.PPlabelpath, self.PPlabel, self.fileStatedict]: + QMessageBox.information(self, "Information", "Save file first") + return + + rec_gt_dir = os.path.dirname(self.PPlabelpath) + '/rec_gt.txt' + crop_img_dir = os.path.dirname(self.PPlabelpath) + '/crop_img/' + if not os.path.exists(crop_img_dir): + os.mkdir(crop_img_dir) + + with open(rec_gt_dir, 'w', encoding='utf-8') as f: + for key in self.fileStatedict: + idx = self.getImglabelidx(key) + for i, label in enumerate(self.PPlabel[idx]): + img = cv2.imread(key) + img_crop = get_rotate_crop_image(img, np.array(label['points'], np.float32)) + img_name = os.path.splitext(os.path.basename(idx))[0] + '_crop_'+str(i)+'.jpg' + cv2.imwrite(crop_img_dir+img_name, img_crop) + f.write('crop_img/'+ img_name + '\t') + f.write(label['transcription'] + '\n') + + QMessageBox.information(self, "Information", "Cropped images has been saved in "+str(crop_img_dir)) + +def inverted(color): + return QColor(*[255 - v for v in color.getRgb()]) + + +def read(filename, default=None): + try: + with open(filename, 'rb') as f: + return f.read() + except: + return default + + +def get_main_app(argv=[]): + """ + Standard boilerplate Qt application code. + Do everything but app.exec_() -- so that we can test the application in one thread + """ + app = QApplication(argv) + app.setApplicationName(__appname__) + app.setWindowIcon(newIcon("app")) + # Tzutalin 201705+: Accept extra agruments to change predefined class file + argparser = argparse.ArgumentParser() + argparser.add_argument("--lang", default='ch', nargs="?") + argparser.add_argument("--predefined_classes_file", + default=os.path.join(os.path.dirname(__file__), "data", "predefined_classes.txt"), + nargs="?") + args = argparser.parse_args(argv[1:]) + # Usage : labelImg.py image predefClassFile saveDir + win = MainWindow(lang=args.lang, + defaultPrefdefClassFile=args.predefined_classes_file, + ) + win.show() + return app, win + + +def main(): + '''construct main app and run it''' + app, _win = get_main_app(sys.argv) + return app.exec_() + + +if __name__ == '__main__': + + resource_file = './libs/resources.py' + if not os.path.exists(resource_file): + output = os.system('pyrcc5 -o libs/resources.py resources.qrc') + assert output is 0, "operate the cmd have some problems ,please check whether there is a in the lib " \ + "directory resources.py " + import libs.resources + sys.exit(main()) diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md new file mode 100644 index 0000000000000000000000000000000000000000..93fd64ffe1d0923d3e754e3964fa7c62509d0df0 --- /dev/null +++ b/PPOCRLabel/README.md @@ -0,0 +1,80 @@ +# PPOCRLabel + +PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,使用python3和pyqt5编写,支持矩形框标注和四点标注模式,导出格式可直接用于PPOCR检测和识别模型的训练。 + + + +## 安装 + +### 1. 安装PaddleOCR +参考[PaddleOCR安装文档](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/installation.md)准备好PaddleOCR + +### 2. 安装PPOCRLabel +#### Windows + Anaconda + +下载安装[Anaconda](https://www.anaconda.com/download/#download) (Python 3+) + +``` +conda install pyqt=5 +cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 +pyrcc5 -o libs/resources.py resources.qrc +python PPOCRLabel.py +``` + +#### Ubuntu Linux + +``` +sudo apt-get install pyqt5-dev-tools +sudo apt-get install trash-cli +cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 +sudo pip3 install -r requirements/requirements-linux-python3.txt +make qt5py3 +python3 PPOCRLabel.py +``` + +#### macOS +``` +pip3 install pyqt5 +pip3 uninstall opencv-python # 由于mac版本的opencv与pyqt有冲突,需先手动卸载opencv +pip3 install opencv-contrib-python-headless # 安装headless版本的open-cv +cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下 +make qt5py3 +python3 PPOCRLabel.py +``` + +## 使用 + +### 操作步骤 + +1. 安装与运行:使用上述命令安装与运行程序。 +2. 打开文件夹:在菜单栏点击 “文件” - "打开目录" 选择待标记图片的文件夹[1]. +3. 自动标注:点击 ”自动标注“,使用PPOCR超轻量模型对图片文件名前图片状态[2]为 “X” 的图片进行自动标注。 +4. 手动标注:点击 “矩形标注”(推荐直接在英文模式下点击键盘中的 “W”),用户可对当前图片中模型未检出的部分进行手动绘制标记框。点击键盘P,则使用四点标注模式(或点击“编辑” - “四点标注”),用户依次点击4个点后,双击左键表示标注完成。 +5. 标记框绘制完成后,用户点击 “确认”,检测框会先被预分配一个 “待识别” 标签。 +6. 重新识别:将图片中的所有检测画绘制/调整完成后,点击 “重新识别”,PPOCR模型会对当前图片中的**所有检测框**重新识别[3]。 +7. 内容更改:双击识别结果,对不准确的识别结果进行手动更改。 +8. 保存:点击 “保存”,图片状态切换为 “√”,跳转至下一张。 +9. 删除:点击 “删除图像”,图片将会被删除至回收站。 +10. 标注结果:关闭应用程序或切换文件路径后,手动保存过的标签将会被存放在所打开图片文件夹下的*Label.txt*中。在菜单栏点击 “PaddleOCR” - "保存识别结果"后,会将此类图片的识别训练数据保存在*crop_img*文件夹下,识别标签保存在*rec_gt.txt*中[4]。 + +### 注意 + +[1] PPOCRLabel以文件夹为基本标记单位,打开待标记的图片文件夹后,不会在窗口栏中显示图片,而是在点击 "选择文件夹" 之后直接将文件夹下的图片导入到程序中。 + +[2] 图片状态表示本张图片用户是否手动保存过,未手动保存过即为 “X”,手动保存过为 “√”。点击 “自动标注”按钮后,PPOCRLabel不会对状态为 “√” 的图片重新标注。 + +[3] 点击“重新识别”后,模型会对图片中的识别结果进行覆盖。因此如果在此之前手动更改过识别结果,有可能在重新识别后产生变动。 + +[4] PPOCRLabel产生的文件包括一下几种,请勿手动更改其中内容,否则会引起程序出现异常。 + +| 文件名 | 说明 | +| :-----------: | :----------------------------------------------------------: | +| Label.txt | 检测标签,可直接用于PPOCR检测模型训练。用户每保存10张检测结果后,程序会进行自动写入。当用户关闭应用程序或切换文件路径后同样会进行写入。 | +| fileState.txt | 图片状态标记文件,保存当前文件夹下已经被用户手动确认过的图片名称。 | +| Cache.cach | 缓存文件,保存模型自动识别的结果。 | +| rec_gt.txt | 识别标签。可直接用于PPOCR识别模型训练。需用户手动点击菜单栏“PaddleOCR” - "保存识别结果"后产生。 | +| crop_img | 识别数据。按照检测框切割后的图片。与rec_gt.txt同时产生。 | + +### 参考资料 + +1.[Tzutalin. LabelImg. Git code (2015)](https://github.com/tzutalin/labelImg) diff --git a/PPOCRLabel/README_en.md b/PPOCRLabel/README_en.md new file mode 100644 index 0000000000000000000000000000000000000000..7ebbb97c1f2693942f5949a17c68f54b5d6a6cbe --- /dev/null +++ b/PPOCRLabel/README_en.md @@ -0,0 +1,97 @@ +# PPOCRLabel + +PPOCRLabel is a semi-automatic graphic annotation tool suitable for OCR field. It is written in python3 and pyqt5. Support rectangular frame labeling and four-point labeling mode. Annotations can be directly used for the training of PPOCR detection and recognition models. + + + +## Installation + +### 1. Install PaddleOCR + +Refer to [PaddleOCR installation document](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/installation.md) to prepare PaddleOCR + +### 2. Install PPOCRLabel + +#### Windows + Anaconda + +Download and install [Anaconda](https://www.anaconda.com/download/#download) (Python 3+) + +``` +conda install pyqt=5 +cd ./PPOCRLabel # Change the directory to the PPOCRLabel folder +pyrcc5 -o libs/resources.py resources.qrc +python PPOCRLabel.py --lang en +``` + +#### Ubuntu Linux + +``` +sudo apt-get install pyqt5-dev-tools +sudo apt-get install trash-cli +cd ./PPOCRLabel # Change the directory to the PPOCRLabel folder +sudo pip3 install -r requirements/requirements-linux-python3.txt +make qt5py3 +python3 PPOCRLabel.py --lang en +``` + +#### macOS +``` +pip3 install pyqt5 +pip3 uninstall opencv-python # Uninstall opencv manually as it conflicts with pyqt +pip3 install opencv-contrib-python-headless # Install the headless version of opencv +cd ./PPOCRLabel # Change the directory to the PPOCRLabel folder +make qt5py3 +python3 PPOCRLabel.py --lang en +``` + +## Usage + +### Steps + +1. Build and launch using the instructions above. + +2. Click 'Open Dir' in Menu/File to select the folder of the picture.[1] + +3. Click 'Auto recognition', use PPOCR model to automatically annotate images which marked with 'X' [2]before the file name. + +4. Create Box: + + 4.1 Click 'Create RectBox' or press 'W' in English keyboard mode to draw a new rectangle detection box. Click and release left mouse to select a region to annotate the text area. + + 4.2 Press 'P' to enter four-point labeling mode which enables you to create any four-point shape by clicking four points with the left mouse button in succession and DOUBLE CLICK the left mouse as the signal of labeling completion. + +5. After the marking frame is drawn, the user clicks "OK", and the detection frame will be pre-assigned a "TEMPORARY" label. + +6. Click 're-Recognition', model will rewrite ALL recognition results in ALL detection box[3]. + +7. Double click the result in 'recognition result' list to manually change inaccurate recognition results. + +8. Click "Save", the image status will switch to "√",then the program automatically jump to the next. + +9. Click "Delete Image" and the image will be deleted to the recycle bin. + +10. Labeling result: After closing the application or switching the file path, the manually saved label will be stored in *Label.txt* under the opened picture folder. + Click "PaddleOCR"-"Save Recognition Results" in the menu bar, the recognition training data of such pictures will be saved in the *crop_img* folder, and the recognition label will be saved in *rec_gt.txt*[4]. + +### Note + +[1] PPOCRLabel uses the opened folder as the project. After opening the image folder, the picture will not be displayed in the dialog. Instead, the pictures under the folder will be directly imported into the program after clicking "Open Dir". + +[2] The image status indicates whether the user has saved the image manually. If it has not been saved manually it is "X", otherwise it is "√", PPOCRLabel will not relabel pictures with a status of "√". + +[3] After clicking "Re-recognize", the model will overwrite ALL recognition results in the picture. +Therefore, if the recognition result has been manually changed before, it may change after re-recognition. + +[4] The files produced by PPOCRLabel include the following, please do not manually change the contents, otherwise it will cause the program to be abnormal. + +| File name | Description | +| :-----------: | :----------------------------------------------------------: | +| Label.txt | The detection label file can be directly used for PPOCR detection model training. After the user saves 10 label results, the file will be automatically saved. It will also be written when the user closes the application or changes the file folder. | +| fileState.txt | The picture status file save the image in the current folder that has been manually confirmed by the user. | +| Cache.cach | Cache files to save the results of model recognition. | +| rec_gt.txt | The recognition label file, which can be directly used for PPOCR identification model training, is generated after the user clicks on the menu bar "PaddleOCR"-"Save recognition result". | +| crop_img | The recognition data, generated at the same time with *rec_gt.txt* | + +## Related + +1.[Tzutalin. LabelImg. Git code (2015)](https://github.com/tzutalin/labelImg) diff --git a/PPOCRLabel/__init__.py b/PPOCRLabel/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/PPOCRLabel/build-tools/.gitignore b/PPOCRLabel/build-tools/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e05bf6bf57739a813c00bad0c045b224ff37705f --- /dev/null +++ b/PPOCRLabel/build-tools/.gitignore @@ -0,0 +1,12 @@ +*.spec +build +dist +pyinstaller +python-2.* +pywin32* +virtual-wine +venv_wine +PyQt4-* +lxml-* +windows_v* +linux_v* diff --git a/PPOCRLabel/build-tools/README.md b/PPOCRLabel/build-tools/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8e4cc5dae4af9a75416cd3595de480f72a7bb305 --- /dev/null +++ b/PPOCRLabel/build-tools/README.md @@ -0,0 +1,35 @@ +### Deploy to PyPI + +``` +cd [ROOT] +sh build-tools/build-for-pypi.sh +``` + +### Build for Ubuntu + +``` +cd build-tools +sh run-in-container.sh +sh envsetup.sh +sh build-ubuntu-binary.sh +``` + +### Build for Windows + +``` +cd build-tools +sh run-in-container.sh +sh envsetup.sh +sh build-windows-binary.sh +``` + +### Build for macOS High Sierra +``` +cd build-tools +./build-for-macos.sh +``` + +Note: If there are some problems, try to +``` +sudo rm -rf virtual-wne venv_wine +``` diff --git a/PPOCRLabel/build-tools/build-for-macos.sh b/PPOCRLabel/build-tools/build-for-macos.sh new file mode 100644 index 0000000000000000000000000000000000000000..dfe926b72a0df1f939301a18be641a2a5adcbad8 --- /dev/null +++ b/PPOCRLabel/build-tools/build-for-macos.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +brew install python@2 +pip install --upgrade virtualenv + +# clone labelimg source +rm -rf /tmp/labelImgSetup +mkdir /tmp/labelImgSetup +cd /tmp/labelImgSetup +curl https://codeload.github.com/tzutalin/labelImg/zip/master --output labelImg.zip +unzip labelImg.zip +rm labelImg.zip + +# setup python3 space +virtualenv --system-site-packages -p python3 /tmp/labelImgSetup/labelImg-py3 +source /tmp/labelImgSetup/labelImg-py3/bin/activate +cd labelImg-master + +# build labelImg app +pip install py2app +pip install PyQt5 lxml +make qt5py3 +rm -rf build dist +python setup.py py2app -A +mv "/tmp/labelImgSetup/labelImg-master/dist/labelImg.app" /Applications +# deactivate python3 +deactivate +cd ../ +rm -rf /tmp/labelImgSetup +echo 'DONE' diff --git a/PPOCRLabel/build-tools/build-for-pypi.sh b/PPOCRLabel/build-tools/build-for-pypi.sh new file mode 100644 index 0000000000000000000000000000000000000000..d5ad5c7c4b638e68114a477a6342a718ffb878a8 --- /dev/null +++ b/PPOCRLabel/build-tools/build-for-pypi.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Packaging and Release +docker run --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4 /bin/sh -c 'make qt4py2; make test;sudo python setup.py sdist;sudo python setup.py install' + +while true; do + read -p "Do you wish to deploy this to PyPI(twine upload dist/* or pip install dist/*)?" yn + case $yn in + [Yy]* ) docker run -it --rm --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4; break;; + [Nn]* ) exit;; + * ) echo "Please answer yes or no.";; + esac +done +# python setup.py register +# python setup.py sdist upload +# Net pypi: twine upload dist/* + +# Test before upladoing: pip install dist/labelImg.tar.gz diff --git a/PPOCRLabel/build-tools/build-ubuntu-binary.sh b/PPOCRLabel/build-tools/build-ubuntu-binary.sh new file mode 100644 index 0000000000000000000000000000000000000000..dbe530287bfe9afe730f00252e414e3728e0b746 --- /dev/null +++ b/PPOCRLabel/build-tools/build-ubuntu-binary.sh @@ -0,0 +1,24 @@ +#!/bin/bash +### Ubuntu use pyinstall v3.0 +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` +cd pyinstaller +git checkout v3.2 +cd ${THIS_SCRIPT_DIR} + +rm -r build +rm -r dist +rm labelImg.spec +python pyinstaller/pyinstaller.py --hidden-import=xml \ + --hidden-import=xml.etree \ + --hidden-import=xml.etree.ElementTree \ + --hidden-import=lxml.etree \ + -D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../ + +FOLDER=$(git describe --abbrev=0 --tags) +FOLDER="linux_"$FOLDER +rm -rf "$FOLDER" +mkdir "$FOLDER" +cp dist/labelImg $FOLDER +cp -rf ../data $FOLDER/data +zip "$FOLDER.zip" -r $FOLDER diff --git a/PPOCRLabel/build-tools/build-windows-binary.sh b/PPOCRLabel/build-tools/build-windows-binary.sh new file mode 100644 index 0000000000000000000000000000000000000000..566e88f9db0865da793486c78cc234b85b16c484 --- /dev/null +++ b/PPOCRLabel/build-tools/build-windows-binary.sh @@ -0,0 +1,32 @@ +#!/bin/bash +### Window requires pyinstall v2.1 +wine msiexec -i python-2.7.8.msi +wine pywin32-218.win32-py2.7.exe +wine PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe +wine lxml-3.7.3.win32-py2.7.exe + +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` +cd pyinstaller +git checkout v2.1 +cd ${THIS_SCRIPT_DIR} +echo ${THIS_SCRIPT_DIR} + +#. venv_wine/bin/activate +rm -r build +rm -r dist +rm labelImg.spec + +wine c:/Python27/python.exe pyinstaller/pyinstaller.py --hidden-import=xml \ + --hidden-import=xml.etree \ + --hidden-import=xml.etree.ElementTree \ + --hidden-import=lxml.etree \ + -D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../ + +FOLDER=$(git describe --abbrev=0 --tags) +FOLDER="windows_"$FOLDER +rm -rf "$FOLDER" +mkdir "$FOLDER" +cp dist/labelImg.exe $FOLDER +cp -rf ../data $FOLDER/data +zip "$FOLDER.zip" -r $FOLDER diff --git a/PPOCRLabel/build-tools/envsetup.sh b/PPOCRLabel/build-tools/envsetup.sh new file mode 100644 index 0000000000000000000000000000000000000000..242b0c569f5738caad415f34a7f16a620157f6ee --- /dev/null +++ b/PPOCRLabel/build-tools/envsetup.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +THIS_SCRIPT_PATH=`readlink -f $0` +THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}` +#OS Ubuntu 14.04 +### Common packages for linux/windows +if [ ! -e "pyinstaller" ]; then + git clone https://github.com/pyinstaller/pyinstaller + cd pyinstaller + git checkout v2.1 -b v2.1 + cd ${THIS_SCRIPT_DIR} +fi + +echo "Going to clone and download packages for building windows" +#Pacakges +#> pyinstaller (2.1) +#> wine (1.6.2) +#> virtual-wine (0.1) +#> python-2.7.8.msi +#> pywin32-218.win32-py2.7.exe + +## tool to install on Ubuntu +#$ sudo apt-get install wine + +### Clone a repo to create virtual wine env +if [ ! -e "virtual-wine" ]; then + git clone https://github.com/htgoebel/virtual-wine.git +fi + +apt-get install scons +### Create virtual env +rm -rf venv_wine +./virtual-wine/vwine-setup venv_wine +#### Active virutal env +. venv_wine/bin/activate + +### Use wine to install packages to virtual env +if [ ! -e "python-2.7.8.msi" ]; then + wget "https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi" +fi + +if [ ! -e "pywin32-218.win32-py2.7.exe" ]; then + wget "http://nchc.dl.sourceforge.net/project/pywin32/pywin32/Build%20218/pywin32-218.win32-py2.7.exe" +fi + +if [ ! -e "PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe" ]; then + wget "http://nchc.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe" +fi + +if [ ! -e "lxml-3.7.3.win32-py2.7.exe" ]; then + wget "https://pypi.python.org/packages/a3/f6/a28c5cf63873f6c55a3eb7857b736379229b85ba918261d2e88cf886905e/lxml-3.7.3.win32-py2.7.exe#md5=a0f746355876aca4ca5371cb0f1d13ce" +fi + diff --git a/PPOCRLabel/build-tools/run-in-container.sh b/PPOCRLabel/build-tools/run-in-container.sh new file mode 100644 index 0000000000000000000000000000000000000000..980699d67753a291616c576d723dc4ff898a1e41 --- /dev/null +++ b/PPOCRLabel/build-tools/run-in-container.sh @@ -0,0 +1,13 @@ +#!/bin/sh +docker run -it \ + --user $(id -u) \ + -e DISPLAY=unix$DISPLAY \ + --workdir=$(pwd) \ + --volume="/home/$USER:/home/$USER" \ + --volume="/etc/group:/etc/group:ro" \ + --volume="/etc/passwd:/etc/passwd:ro" \ + --volume="/etc/shadow:/etc/shadow:ro" \ + --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + tzutalin/py2qt4 + diff --git a/PPOCRLabel/combobox.py b/PPOCRLabel/combobox.py new file mode 100644 index 0000000000000000000000000000000000000000..8526b45392902e564364be27948517377217bbeb --- /dev/null +++ b/PPOCRLabel/combobox.py @@ -0,0 +1,46 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import sys +try: + from PyQt5.QtWidgets import QWidget, QHBoxLayout, QComboBox +except ImportError: + # needed for py3+qt4 + # Ref: + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string + if sys.version_info.major >= 3: + import sip + sip.setapi('QVariant', 2) + from PyQt4.QtGui import QWidget, QHBoxLayout, QComboBox + + +class ComboBox(QWidget): + def __init__(self, parent=None, items=[]): + super(ComboBox, self).__init__(parent) + + layout = QHBoxLayout() + self.cb = QComboBox() + self.items = items + self.cb.addItems(self.items) + + self.cb.currentIndexChanged.connect(parent.comboSelectionChanged) + + layout.addWidget(self.cb) + self.setLayout(layout) + + def update_items(self, items): + self.items = items + + self.cb.clear() + self.cb.addItems(self.items) diff --git a/PPOCRLabel/data/gif/steps.gif b/PPOCRLabel/data/gif/steps.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ea998500b4ce5c2f3c3861ce5c9a71c99ae83cb Binary files /dev/null and b/PPOCRLabel/data/gif/steps.gif differ diff --git a/PPOCRLabel/data/paddle.png b/PPOCRLabel/data/paddle.png new file mode 100644 index 0000000000000000000000000000000000000000..b1099c73b54c4a8510fc55f4409b053c8884694c Binary files /dev/null and b/PPOCRLabel/data/paddle.png differ diff --git a/PPOCRLabel/data/predefined_classes.txt b/PPOCRLabel/data/predefined_classes.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/PPOCRLabel/libs/__init__.py b/PPOCRLabel/libs/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..0df0cc8460debf585efa11043004ef8838a1da3f --- /dev/null +++ b/PPOCRLabel/libs/__init__.py @@ -0,0 +1,2 @@ +__version_info__ = ('1', '0', '0') +__version__ = '.'.join(__version_info__) diff --git a/PPOCRLabel/libs/autoDialog.py b/PPOCRLabel/libs/autoDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..e1b8e7947e67a7c5a4f2cae02134fdb6f7b067ae --- /dev/null +++ b/PPOCRLabel/libs/autoDialog.py @@ -0,0 +1,150 @@ +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +import json + +from libs.utils import newIcon + +BB = QDialogButtonBox + + +class Worker(QThread): + progressBarValue = pyqtSignal(int) + listValue = pyqtSignal(str) + endsignal = pyqtSignal(int, str) + handle = 0 + + def __init__(self, ocr, mImgList, mainThread, model): + super(Worker, self).__init__() + self.ocr = ocr + self.mImgList = mImgList + self.mainThread = mainThread + self.model = model + + def run(self): + try: + findex = 0 + for Imgpath in self.mImgList: + if self.handle == 0: + self.listValue.emit(Imgpath) + if self.model == 'paddle': + self.result_dic = self.ocr.ocr(Imgpath, cls=True, det=True) + + # 结果保存 + if self.result_dic is None or len(self.result_dic) == 0: + print('Can not recognise file is : ', Imgpath) + pass + else: + for res in self.result_dic: + chars = res[1][0] + cond = res[1][1] + posi = res[0] + self.listValue.emit("文字:" + chars + " 置信度:" + str(cond) + " 坐标:" + json.dumps(posi)) + self.mainThread.result_dic = self.result_dic + self.mainThread.filePath = Imgpath + # 保存 + self.mainThread.saveFile(mode='Auto') + findex += 1 + self.progressBarValue.emit(findex) + else: + break + self.endsignal.emit(0, "readAll") + self.exec() + except Exception as e: + print(e) + raise + + +class AutoDialog(QDialog): + + def __init__(self, text="Enter object label", parent=None, ocr=None, mImgList=None, lenbar=0): + super(AutoDialog, self).__init__(parent) + self.setFixedWidth(1000) + self.parent = parent + self.ocr = ocr + self.mImgList = mImgList + self.pb = QProgressBar() + self.pb.setRange(0, lenbar) + self.pb.setValue(0) + + layout = QVBoxLayout() + layout.addWidget(self.pb) + self.model = 'paddle' + self.listWidget = QListWidget(self) + layout.addWidget(self.listWidget) + + self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self) + bb.button(BB.Ok).setIcon(newIcon('done')) + bb.button(BB.Cancel).setIcon(newIcon('undo')) + bb.accepted.connect(self.validate) + bb.rejected.connect(self.reject) + layout.addWidget(bb) + bb.button(BB.Ok).setEnabled(False) + + self.setLayout(layout) + self.setWindowTitle("自动标注中") + self.setWindowModality(Qt.ApplicationModal) + + # self.setWindowFlags(Qt.WindowCloseButtonHint) + + self.thread_1 = Worker(self.ocr, self.mImgList, self.parent, 'paddle') + self.thread_1.progressBarValue.connect(self.handleProgressBarSingal) + self.thread_1.listValue.connect(self.handleListWidgetSingal) + self.thread_1.endsignal.connect(self.handleEndsignalSignal) + + def handleProgressBarSingal(self, i): + self.pb.setValue(i) + + def handleListWidgetSingal(self, i): + self.listWidget.addItem(i) + titem = self.listWidget.item(self.listWidget.count() - 1) + self.listWidget.scrollToItem(titem) + + def handleEndsignalSignal(self, i, str): + if i == 0 and str == "readAll": + self.buttonBox.button(BB.Ok).setEnabled(True) + self.buttonBox.button(BB.Cancel).setEnabled(False) + + def reject(self): + print("reject") + self.thread_1.handle = -1 + self.thread_1.quit() + # del self.thread_1 + # if self.thread_1.isRunning(): + # self.thread_1.terminate() + # self.thread_1.quit() + # super(AutoDialog,self).reject() + while not self.thread_1.isFinished(): + pass + self.accept() + + def validate(self): + self.accept() + + def postProcess(self): + try: + self.edit.setText(self.edit.text().trimmed()) + # print(self.edit.text()) + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + self.edit.setText(self.edit.text()) + print(self.edit.text()) + + def popUp(self): + self.thread_1.start() + return 1 if self.exec_() else None + + def closeEvent(self, event): + print("???") + # if self.thread_1.isRunning(): + # self.thread_1.quit() + # + # # self._thread.terminate() + # # del self.thread_1 + # super(AutoDialog, self).closeEvent(event) + self.reject() diff --git a/PPOCRLabel/libs/canvas.py b/PPOCRLabel/libs/canvas.py new file mode 100644 index 0000000000000000000000000000000000000000..bb166baca6c900dcb04cf305e8bb8b658a70ab08 --- /dev/null +++ b/PPOCRLabel/libs/canvas.py @@ -0,0 +1,798 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +#from PyQt4.QtOpenGL import * + +from libs.shape import Shape +from libs.utils import distance + +CURSOR_DEFAULT = Qt.ArrowCursor +CURSOR_POINT = Qt.PointingHandCursor +CURSOR_DRAW = Qt.CrossCursor +CURSOR_MOVE = Qt.ClosedHandCursor +CURSOR_GRAB = Qt.OpenHandCursor + +# class Canvas(QGLWidget): + + +class Canvas(QWidget): + zoomRequest = pyqtSignal(int) + scrollRequest = pyqtSignal(int, int) + newShape = pyqtSignal() + selectionChanged = pyqtSignal(bool) + shapeMoved = pyqtSignal() + drawingPolygon = pyqtSignal(bool) + + CREATE, EDIT = list(range(2)) + _fill_drawing = False # draw shadows + + epsilon = 11.0 + + def __init__(self, *args, **kwargs): + super(Canvas, self).__init__(*args, **kwargs) + # Initialise local state. + self.mode = self.EDIT + self.shapes = [] + self.current = None + self.selectedShape = None # save the selected shape here + self.selectedShapeCopy = None + self.drawingLineColor = QColor(0, 0, 255) + self.drawingRectColor = QColor(0, 0, 255) + self.line = Shape(line_color=self.drawingLineColor) + self.prevPoint = QPointF() + self.offsets = QPointF(), QPointF() + self.scale = 1.0 + self.pixmap = QPixmap() + self.visible = {} + self._hideBackround = False + self.hideBackround = False + self.hShape = None + self.hVertex = None + self._painter = QPainter() + self._cursor = CURSOR_DEFAULT + # Menus: + self.menus = (QMenu(), QMenu()) + # Set widget options. + self.setMouseTracking(True) + self.setFocusPolicy(Qt.WheelFocus) + self.verified = False + self.drawSquare = False + self.fourpoint = True # ADD + self.pointnum = 0 + + #initialisation for panning + self.pan_initial_pos = QPoint() + + def setDrawingColor(self, qColor): + self.drawingLineColor = qColor + self.drawingRectColor = qColor + + def enterEvent(self, ev): + self.overrideCursor(self._cursor) + + def leaveEvent(self, ev): + self.restoreCursor() + + def focusOutEvent(self, ev): + self.restoreCursor() + + def isVisible(self, shape): + return self.visible.get(shape, True) + + def drawing(self): + return self.mode == self.CREATE + + def editing(self): + return self.mode == self.EDIT + + def setEditing(self, value=True): + self.mode = self.EDIT if value else self.CREATE + if not value: # Create + self.unHighlight() + self.deSelectShape() + self.prevPoint = QPointF() + self.repaint() + + def unHighlight(self): + if self.hShape: + self.hShape.highlightClear() + self.hVertex = self.hShape = None + + def selectedVertex(self): + return self.hVertex is not None + + + def mouseMoveEvent(self, ev): + """Update line with last point and current coordinates.""" + pos = self.transformPos(ev.pos()) + + # Update coordinates in status bar if image is opened + window = self.parent().window() + if window.filePath is not None: + self.parent().window().labelCoordinates.setText( + 'X: %d; Y: %d' % (pos.x(), pos.y())) + + # Polygon drawing. + if self.drawing(): + self.overrideCursor(CURSOR_DRAW) # ? + if self.current: + # Display annotation width and height while drawing + currentWidth = abs(self.current[0].x() - pos.x()) + currentHeight = abs(self.current[0].y() - pos.y()) + self.parent().window().labelCoordinates.setText( + 'Width: %d, Height: %d / X: %d; Y: %d' % (currentWidth, currentHeight, pos.x(), pos.y())) + + color = self.drawingLineColor + if self.outOfPixmap(pos): + # Don't allow the user to draw outside the pixmap. + # Clip the coordinates to 0 or max, + # if they are outside the range [0, max] + size = self.pixmap.size() + clipped_x = min(max(0, pos.x()), size.width()) + clipped_y = min(max(0, pos.y()), size.height()) + pos = QPointF(clipped_x, clipped_y) + elif len(self.current) > 1 and self.closeEnough(pos, self.current[0]) and not self.fourpoint: + # Attract line to starting point and colorise to alert the + # user: + pos = self.current[0] + color = self.current.line_color + self.overrideCursor(CURSOR_POINT) + self.current.highlightVertex(0, Shape.NEAR_VERTEX) + elif ( # ADD + len(self.current) > 1 + and self.fourpoint + and self.closeEnough(pos, self.current[0]) + ): + # Attract line to starting point and + # colorise to alert the user. + pos = self.current[0] + self.overrideCursor(CURSOR_POINT) + self.current.highlightVertex(0, Shape.NEAR_VERTEX) + + + if self.drawSquare: + initPos = self.current[0] + minX = initPos.x() + minY = initPos.y() + min_size = min(abs(pos.x() - minX), abs(pos.y() - minY)) + directionX = -1 if pos.x() - minX < 0 else 1 + directionY = -1 if pos.y() - minY < 0 else 1 + self.line[1] = QPointF(minX + directionX * min_size, minY + directionY * min_size) + + elif self.fourpoint: + # self.line[self.pointnum] = pos # OLD + + self.line[0] = self.current[-1] + self.line[1] = pos + + else: + self.line[1] = pos # pos is the mouse's current position + + self.line.line_color = color + self.prevPoint = QPointF() # ? + self.current.highlightClear() + else: + self.prevPoint = pos + self.repaint() + return + + # Polygon copy moving. + if Qt.RightButton & ev.buttons(): + if self.selectedShapeCopy and self.prevPoint: + self.overrideCursor(CURSOR_MOVE) + self.boundedMoveShape(self.selectedShapeCopy, pos) + self.repaint() + elif self.selectedShape: + self.selectedShapeCopy = self.selectedShape.copy() + self.repaint() + return + + # Polygon/Vertex moving. + if Qt.LeftButton & ev.buttons(): + if self.selectedVertex(): + self.boundedMoveVertex(pos) + self.shapeMoved.emit() + self.repaint() + elif self.selectedShape and self.prevPoint: + self.overrideCursor(CURSOR_MOVE) + self.boundedMoveShape(self.selectedShape, pos) + self.shapeMoved.emit() + self.repaint() + else: + #pan + delta_x = pos.x() - self.pan_initial_pos.x() + delta_y = pos.y() - self.pan_initial_pos.y() + self.scrollRequest.emit(delta_x, Qt.Horizontal) + self.scrollRequest.emit(delta_y, Qt.Vertical) + self.update() + return + + # Just hovering over the canvas, 2 posibilities: + # - Highlight shapes + # - Highlight vertex + # Update shape/vertex fill and tooltip value accordingly. + self.setToolTip("Image") + for shape in reversed([s for s in self.shapes if self.isVisible(s)]): + # Look for a nearby vertex to highlight. If that fails, + # check if we happen to be inside a shape. + index = shape.nearestVertex(pos, self.epsilon) + if index is not None: + if self.selectedVertex(): + self.hShape.highlightClear() + self.hVertex, self.hShape = index, shape + shape.highlightVertex(index, shape.MOVE_VERTEX) + self.overrideCursor(CURSOR_POINT) + self.setToolTip("Click & drag to move point") + self.setStatusTip(self.toolTip()) + self.update() + break + elif shape.containsPoint(pos): + if self.selectedVertex(): + self.hShape.highlightClear() + self.hVertex, self.hShape = None, shape + self.setToolTip( + "Click & drag to move shape '%s'" % shape.label) + self.setStatusTip(self.toolTip()) + self.overrideCursor(CURSOR_GRAB) + self.update() + break + else: # Nothing found, clear highlights, reset state. + if self.hShape: + self.hShape.highlightClear() + self.update() + self.hVertex, self.hShape = None, None + self.overrideCursor(CURSOR_DEFAULT) + + def mousePressEvent(self, ev): + pos = self.transformPos(ev.pos()) + + if ev.button() == Qt.LeftButton: + if self.drawing(): + # self.handleDrawing(pos) # OLD + + + if self.current and self.fourpoint: # ADD IF + # Add point to existing shape. + print('Adding points in mousePressEvent is ', self.line[1]) + self.current.addPoint(self.line[1]) + self.line[0] = self.current[-1] + if self.current.isClosed(): + # print('1111') + self.finalise() + elif not self.outOfPixmap(pos): + # Create new shape. + self.current = Shape()# self.current = Shape(shape_type=self.createMode) + self.current.addPoint(pos) + # if self.createMode == "point": + # self.finalise() + # else: + # if self.createMode == "circle": + # self.current.shape_type = "circle" + self.line.points = [pos, pos] + self.setHiding() + self.drawingPolygon.emit(True) + self.update() + + + else: + selection = self.selectShapePoint(pos) + self.prevPoint = pos + + if selection is None: + #pan + QApplication.setOverrideCursor(QCursor(Qt.OpenHandCursor)) + self.pan_initial_pos = pos + + elif ev.button() == Qt.RightButton and self.editing(): + self.selectShapePoint(pos) + self.prevPoint = pos + self.update() + + def mouseReleaseEvent(self, ev): + if ev.button() == Qt.RightButton: + menu = self.menus[bool(self.selectedShapeCopy)] + self.restoreCursor() + if not menu.exec_(self.mapToGlobal(ev.pos()))\ + and self.selectedShapeCopy: + # Cancel the move by deleting the shadow copy. + self.selectedShapeCopy = None + self.repaint() + elif ev.button() == Qt.LeftButton and self.selectedShape: # OLD + if self.selectedVertex(): + self.overrideCursor(CURSOR_POINT) + else: + self.overrideCursor(CURSOR_GRAB) + + + elif ev.button() == Qt.LeftButton and not self.fourpoint: + pos = self.transformPos(ev.pos()) + if self.drawing(): + self.handleDrawing(pos) + else: + #pan + QApplication.restoreOverrideCursor() # ? + + + def endMove(self, copy=False): + assert self.selectedShape and self.selectedShapeCopy + shape = self.selectedShapeCopy + #del shape.fill_color + #del shape.line_color + if copy: + self.shapes.append(shape) + self.selectedShape.selected = False + self.selectedShape = shape + self.repaint() + else: + self.selectedShape.points = [p for p in shape.points] + self.selectedShapeCopy = None + + def hideBackroundShapes(self, value): + self.hideBackround = value + if self.selectedShape: + # Only hide other shapes if there is a current selection. + # Otherwise the user will not be able to select a shape. + self.setHiding(True) + self.repaint() + + def handleDrawing(self, pos): + if self.current and self.current.reachMaxPoints() is False: + if self.fourpoint: + targetPos = self.line[self.pointnum] + self.current.addPoint(targetPos) + print('current points in handleDrawing is ', self.line[self.pointnum]) + self.update() + if self.pointnum == 3: + self.finalise() + + else: # 按住送掉后跳到这里 + initPos = self.current[0] + print('initPos', self.current[0]) + minX = initPos.x() + minY = initPos.y() + targetPos = self.line[1] + maxX = targetPos.x() + maxY = targetPos.y() + self.current.addPoint(QPointF(maxX, minY)) + self.current.addPoint(targetPos) + self.current.addPoint(QPointF(minX, maxY)) + self.finalise() + + elif not self.outOfPixmap(pos): + print('release') + self.current = Shape() + self.current.addPoint(pos) + self.line.points = [pos, pos] + self.setHiding() + self.drawingPolygon.emit(True) + self.update() + + def setHiding(self, enable=True): + self._hideBackround = self.hideBackround if enable else False + + def canCloseShape(self): + return self.drawing() and self.current and len(self.current) > 2 + + def mouseDoubleClickEvent(self, ev): + # We need at least 4 points here, since the mousePress handler + # adds an extra one before this handler is called. + if self.canCloseShape() and len(self.current) > 3: + if not self.fourpoint: + self.current.popPoint() + self.finalise() + + def selectShape(self, shape): + self.deSelectShape() + shape.selected = True + self.selectedShape = shape + self.setHiding() + self.selectionChanged.emit(True) + self.update() + + def selectShapePoint(self, point): + """Select the first shape created which contains this point.""" + self.deSelectShape() + if self.selectedVertex(): # A vertex is marked for selection. + index, shape = self.hVertex, self.hShape + shape.highlightVertex(index, shape.MOVE_VERTEX) + self.selectShape(shape) + return self.hVertex + for shape in reversed(self.shapes): + if self.isVisible(shape) and shape.containsPoint(point): + self.selectShape(shape) + self.calculateOffsets(shape, point) + return self.selectedShape + return None + + def calculateOffsets(self, shape, point): + rect = shape.boundingRect() + x1 = rect.x() - point.x() + y1 = rect.y() - point.y() + x2 = (rect.x() + rect.width()) - point.x() + y2 = (rect.y() + rect.height()) - point.y() + self.offsets = QPointF(x1, y1), QPointF(x2, y2) + + def snapPointToCanvas(self, x, y): + """ + Moves a point x,y to within the boundaries of the canvas. + :return: (x,y,snapped) where snapped is True if x or y were changed, False if not. + """ + if x < 0 or x > self.pixmap.width() or y < 0 or y > self.pixmap.height(): + x = max(x, 0) + y = max(y, 0) + x = min(x, self.pixmap.width()) + y = min(y, self.pixmap.height()) + return x, y, True + + return x, y, False + + def boundedMoveVertex(self, pos): + index, shape = self.hVertex, self.hShape + point = shape[index] + if self.outOfPixmap(pos): + size = self.pixmap.size() + clipped_x = min(max(0, pos.x()), size.width()) + clipped_y = min(max(0, pos.y()), size.height()) + pos = QPointF(clipped_x, clipped_y) + + if self.drawSquare: + opposite_point_index = (index + 2) % 4 + opposite_point = shape[opposite_point_index] + + min_size = min(abs(pos.x() - opposite_point.x()), abs(pos.y() - opposite_point.y())) + directionX = -1 if pos.x() - opposite_point.x() < 0 else 1 + directionY = -1 if pos.y() - opposite_point.y() < 0 else 1 + shiftPos = QPointF(opposite_point.x() + directionX * min_size - point.x(), + opposite_point.y() + directionY * min_size - point.y()) + else: + shiftPos = pos - point + + shape.moveVertexBy(index, shiftPos) + + lindex = (index + 1) % 4 + rindex = (index + 3) % 4 + lshift = None + rshift = None + if index % 2 == 0: + rshift = QPointF(shiftPos.x(), 0) + lshift = QPointF(0, shiftPos.y()) + else: + lshift = QPointF(shiftPos.x(), 0) + rshift = QPointF(0, shiftPos.y()) + shape.moveVertexBy(rindex, rshift) + shape.moveVertexBy(lindex, lshift) + + def boundedMoveShape(self, shape, pos): + if self.outOfPixmap(pos): + return False # No need to move + o1 = pos + self.offsets[0] + if self.outOfPixmap(o1): + pos -= QPointF(min(0, o1.x()), min(0, o1.y())) + o2 = pos + self.offsets[1] + if self.outOfPixmap(o2): + pos += QPointF(min(0, self.pixmap.width() - o2.x()), + min(0, self.pixmap.height() - o2.y())) + # The next line tracks the new position of the cursor + # relative to the shape, but also results in making it + # a bit "shaky" when nearing the border and allows it to + # go outside of the shape's area for some reason. XXX + #self.calculateOffsets(self.selectedShape, pos) + dp = pos - self.prevPoint + if dp: + shape.moveBy(dp) + self.prevPoint = pos + return True + return False + + def deSelectShape(self): + if self.selectedShape: + self.selectedShape.selected = False + self.selectedShape = None + self.setHiding(False) + self.selectionChanged.emit(False) + self.update() + + def deleteSelected(self): + if self.selectedShape: + shape = self.selectedShape + self.shapes.remove(self.selectedShape) + self.selectedShape = None + self.update() + return shape + + def copySelectedShape(self): + if self.selectedShape: + shape = self.selectedShape.copy() + self.deSelectShape() + self.shapes.append(shape) + shape.selected = True + self.selectedShape = shape + self.boundedShiftShape(shape) + return shape + + def boundedShiftShape(self, shape): + # Try to move in one direction, and if it fails in another. + # Give up if both fail. + point = shape[0] + offset = QPointF(2.0, 2.0) + self.calculateOffsets(shape, point) + self.prevPoint = point + if not self.boundedMoveShape(shape, point - offset): + self.boundedMoveShape(shape, point + offset) + + def paintEvent(self, event): + if not self.pixmap: + return super(Canvas, self).paintEvent(event) + + p = self._painter + p.begin(self) + p.setRenderHint(QPainter.Antialiasing) + p.setRenderHint(QPainter.HighQualityAntialiasing) + p.setRenderHint(QPainter.SmoothPixmapTransform) + + p.scale(self.scale, self.scale) + p.translate(self.offsetToCenter()) + + p.drawPixmap(0, 0, self.pixmap) + Shape.scale = self.scale + for shape in self.shapes: + if (shape.selected or not self._hideBackround) and self.isVisible(shape): + shape.fill = shape.selected or shape == self.hShape + shape.paint(p) + if self.current: + self.current.paint(p) + self.line.paint(p) + if self.selectedShapeCopy: + self.selectedShapeCopy.paint(p) + + # Paint rect + if self.current is not None and len(self.line) == 2 and not self.fourpoint: + # print('Drawing rect') + leftTop = self.line[0] + rightBottom = self.line[1] + rectWidth = rightBottom.x() - leftTop.x() + rectHeight = rightBottom.y() - leftTop.y() + p.setPen(self.drawingRectColor) + brush = QBrush(Qt.BDiagPattern) + p.setBrush(brush) + p.drawRect(leftTop.x(), leftTop.y(), rectWidth, rectHeight) + + + # ADD: + if ( + self.fillDrawing() + and self.fourpoint + and self.current is not None + and len(self.current.points) >= 2 + ): + print('paint event') + drawing_shape = self.current.copy() + drawing_shape.addPoint(self.line[1]) + drawing_shape.fill = True + drawing_shape.paint(p) + + if self.drawing() and not self.prevPoint.isNull() and not self.outOfPixmap(self.prevPoint): + p.setPen(QColor(0, 0, 0)) + p.drawLine(self.prevPoint.x(), 0, self.prevPoint.x(), self.pixmap.height()) + p.drawLine(0, self.prevPoint.y(), self.pixmap.width(), self.prevPoint.y()) + + self.setAutoFillBackground(True) + if self.verified: + pal = self.palette() + pal.setColor(self.backgroundRole(), QColor(184, 239, 38, 128)) + self.setPalette(pal) + else: + pal = self.palette() + pal.setColor(self.backgroundRole(), QColor(232, 232, 232, 255)) + self.setPalette(pal) + + p.end() + + def fillDrawing(self): + return self._fill_drawing + + def transformPos(self, point): + """Convert from widget-logical coordinates to painter-logical coordinates.""" + return point / self.scale - self.offsetToCenter() + + def offsetToCenter(self): + s = self.scale + area = super(Canvas, self).size() + w, h = self.pixmap.width() * s, self.pixmap.height() * s + aw, ah = area.width(), area.height() + x = (aw - w) / (2 * s) if aw > w else 0 + y = (ah - h) / (2 * s) if ah > h else 0 + return QPointF(x, y) + + def outOfPixmap(self, p): + w, h = self.pixmap.width(), self.pixmap.height() + return not (0 <= p.x() <= w and 0 <= p.y() <= h) + + def finalise(self): + assert self.current + if self.current.points[0] == self.current.points[-1]: + # print('finalse') + self.current = None + self.drawingPolygon.emit(False) + self.update() + return + + self.current.close() + self.shapes.append(self.current) + self.current = None + self.setHiding(False) + self.newShape.emit() + self.update() + + def closeEnough(self, p1, p2): + #d = distance(p1 - p2) + #m = (p1-p2).manhattanLength() + # print "d %.2f, m %d, %.2f" % (d, m, d - m) + return distance(p1 - p2) < self.epsilon + + # These two, along with a call to adjustSize are required for the + # scroll area. + def sizeHint(self): + return self.minimumSizeHint() + + def minimumSizeHint(self): + if self.pixmap: + return self.scale * self.pixmap.size() + return super(Canvas, self).minimumSizeHint() + + def wheelEvent(self, ev): + qt_version = 4 if hasattr(ev, "delta") else 5 + if qt_version == 4: + if ev.orientation() == Qt.Vertical: + v_delta = ev.delta() + h_delta = 0 + else: + h_delta = ev.delta() + v_delta = 0 + else: + delta = ev.angleDelta() + h_delta = delta.x() + v_delta = delta.y() + + mods = ev.modifiers() + if Qt.ControlModifier == int(mods) and v_delta: + self.zoomRequest.emit(v_delta) + else: + v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical) + h_delta and self.scrollRequest.emit(h_delta, Qt.Horizontal) + ev.accept() + + def keyPressEvent(self, ev): + key = ev.key() + if key == Qt.Key_Escape and self.current: + print('ESC press') + self.current = None + self.drawingPolygon.emit(False) + self.update() + elif key == Qt.Key_Return and self.canCloseShape(): + self.finalise() + elif key == Qt.Key_Left and self.selectedShape: + self.moveOnePixel('Left') + elif key == Qt.Key_Right and self.selectedShape: + self.moveOnePixel('Right') + elif key == Qt.Key_Up and self.selectedShape: + self.moveOnePixel('Up') + elif key == Qt.Key_Down and self.selectedShape: + self.moveOnePixel('Down') + + def moveOnePixel(self, direction): + # print(self.selectedShape.points) + if direction == 'Left' and not self.moveOutOfBound(QPointF(-1.0, 0)): + # print("move Left one pixel") + self.selectedShape.points[0] += QPointF(-1.0, 0) + self.selectedShape.points[1] += QPointF(-1.0, 0) + self.selectedShape.points[2] += QPointF(-1.0, 0) + self.selectedShape.points[3] += QPointF(-1.0, 0) + elif direction == 'Right' and not self.moveOutOfBound(QPointF(1.0, 0)): + # print("move Right one pixel") + self.selectedShape.points[0] += QPointF(1.0, 0) + self.selectedShape.points[1] += QPointF(1.0, 0) + self.selectedShape.points[2] += QPointF(1.0, 0) + self.selectedShape.points[3] += QPointF(1.0, 0) + elif direction == 'Up' and not self.moveOutOfBound(QPointF(0, -1.0)): + # print("move Up one pixel") + self.selectedShape.points[0] += QPointF(0, -1.0) + self.selectedShape.points[1] += QPointF(0, -1.0) + self.selectedShape.points[2] += QPointF(0, -1.0) + self.selectedShape.points[3] += QPointF(0, -1.0) + elif direction == 'Down' and not self.moveOutOfBound(QPointF(0, 1.0)): + # print("move Down one pixel") + self.selectedShape.points[0] += QPointF(0, 1.0) + self.selectedShape.points[1] += QPointF(0, 1.0) + self.selectedShape.points[2] += QPointF(0, 1.0) + self.selectedShape.points[3] += QPointF(0, 1.0) + self.shapeMoved.emit() + self.repaint() + + def moveOutOfBound(self, step): + points = [p1+p2 for p1, p2 in zip(self.selectedShape.points, [step]*4)] + return True in map(self.outOfPixmap, points) + + def setLastLabel(self, text, line_color = None, fill_color = None): + assert text + self.shapes[-1].label = text + if line_color: + self.shapes[-1].line_color = line_color + + if fill_color: + self.shapes[-1].fill_color = fill_color + + return self.shapes[-1] + + def undoLastLine(self): + assert self.shapes + self.current = self.shapes.pop() + self.current.setOpen() + self.line.points = [self.current[-1], self.current[0]] + self.drawingPolygon.emit(True) + + def resetAllLines(self): + assert self.shapes + self.current = self.shapes.pop() + self.current.setOpen() + self.line.points = [self.current[-1], self.current[0]] + self.drawingPolygon.emit(True) + self.current = None + self.drawingPolygon.emit(False) + self.update() + + def loadPixmap(self, pixmap): + self.pixmap = pixmap + self.shapes = [] + self.repaint() # 这函数在哪 + + def loadShapes(self, shapes): + self.shapes = list(shapes) + self.current = None + self.repaint() + + def setShapeVisible(self, shape, value): + self.visible[shape] = value + self.repaint() + + def currentCursor(self): + cursor = QApplication.overrideCursor() + if cursor is not None: + cursor = cursor.shape() + return cursor + + def overrideCursor(self, cursor): + self._cursor = cursor + if self.currentCursor() is None: + QApplication.setOverrideCursor(cursor) + else: + QApplication.changeOverrideCursor(cursor) + + def restoreCursor(self): + QApplication.restoreOverrideCursor() + + def resetState(self): + self.restoreCursor() + self.pixmap = None + self.update() + + def setDrawingShapeToSquare(self, status): + self.drawSquare = status diff --git a/PPOCRLabel/libs/colorDialog.py b/PPOCRLabel/libs/colorDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..c70ff76549318ed9e05cc50a5a41483ad986cc83 --- /dev/null +++ b/PPOCRLabel/libs/colorDialog.py @@ -0,0 +1,49 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import QColorDialog, QDialogButtonBox +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +BB = QDialogButtonBox + + +class ColorDialog(QColorDialog): + + def __init__(self, parent=None): + super(ColorDialog, self).__init__(parent) + self.setOption(QColorDialog.ShowAlphaChannel) + # The Mac native dialog does not support our restore button. + self.setOption(QColorDialog.DontUseNativeDialog) + # Add a restore defaults button. + # The default is set at invocation time, so that it + # works across dialogs for different elements. + self.default = None + self.bb = self.layout().itemAt(1).widget() + self.bb.addButton(BB.RestoreDefaults) + self.bb.clicked.connect(self.checkRestore) + + def getColor(self, value=None, title=None, default=None): + self.default = default + if title: + self.setWindowTitle(title) + if value: + self.setCurrentColor(value) + return self.currentColor() if self.exec_() else None + + def checkRestore(self, button): + if self.bb.buttonRole(button) & BB.ResetRole and self.default: + self.setCurrentColor(self.default) diff --git a/PPOCRLabel/libs/constants.py b/PPOCRLabel/libs/constants.py new file mode 100644 index 0000000000000000000000000000000000000000..58c8222ec52dcdbff7ddda04911f6703a2bdedc7 --- /dev/null +++ b/PPOCRLabel/libs/constants.py @@ -0,0 +1,31 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +SETTING_FILENAME = 'filename' +SETTING_RECENT_FILES = 'recentFiles' +SETTING_WIN_SIZE = 'window/size' +SETTING_WIN_POSE = 'window/position' +SETTING_WIN_GEOMETRY = 'window/geometry' +SETTING_LINE_COLOR = 'line/color' +SETTING_FILL_COLOR = 'fill/color' +SETTING_ADVANCE_MODE = 'advanced' +SETTING_WIN_STATE = 'window/state' +SETTING_SAVE_DIR = 'savedir' +SETTING_PAINT_LABEL = 'paintlabel' +SETTING_LAST_OPEN_DIR = 'lastOpenDir' +SETTING_AUTO_SAVE = 'autosave' +SETTING_SINGLE_CLASS = 'singleclass' +FORMAT_PASCALVOC='PascalVOC' +FORMAT_YOLO='YOLO' +SETTING_DRAW_SQUARE = 'draw/square' +SETTING_LABEL_FILE_FORMAT= 'labelFileFormat' +DEFAULT_ENCODING = 'utf-8' diff --git a/PPOCRLabel/libs/create_ml_io.py b/PPOCRLabel/libs/create_ml_io.py new file mode 100644 index 0000000000000000000000000000000000000000..a2123b265b8f0f5000de43949ecf77169a574325 --- /dev/null +++ b/PPOCRLabel/libs/create_ml_io.py @@ -0,0 +1,143 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/env python +# -*- coding: utf8 -*- +import json +from pathlib import Path + +from libs.constants import DEFAULT_ENCODING +import os + +JSON_EXT = '.json' +ENCODE_METHOD = DEFAULT_ENCODING + + +class CreateMLWriter: + def __init__(self, foldername, filename, imgsize, shapes, outputfile, databasesrc='Unknown', localimgpath=None): + self.foldername = foldername + self.filename = filename + self.databasesrc = databasesrc + self.imgsize = imgsize + self.boxlist = [] + self.localimgpath = localimgpath + self.verified = False + self.shapes = shapes + self.outputfile = outputfile + + def write(self): + if os.path.isfile(self.outputfile): + with open(self.outputfile, "r") as file: + input_data = file.read() + outputdict = json.loads(input_data) + else: + outputdict = [] + + outputimagedict = { + "image": self.filename, + "annotations": [] + } + + for shape in self.shapes: + points = shape["points"] + + x1 = points[0][0] + y1 = points[0][1] + x2 = points[1][0] + y2 = points[2][1] + + height, width, x, y = self.calculate_coordinates(x1, x2, y1, y2) + + shapedict = { + "label": shape["label"], + "coordinates": { + "x": x, + "y": y, + "width": width, + "height": height + } + } + outputimagedict["annotations"].append(shapedict) + + # check if image already in output + exists = False + for i in range(0, len(outputdict)): + if outputdict[i]["image"] == outputimagedict["image"]: + exists = True + outputdict[i] = outputimagedict + break + + if not exists: + outputdict.append(outputimagedict) + + Path(self.outputfile).write_text(json.dumps(outputdict), ENCODE_METHOD) + + def calculate_coordinates(self, x1, x2, y1, y2): + if x1 < x2: + xmin = x1 + xmax = x2 + else: + xmin = x2 + xmax = x1 + if y1 < y2: + ymin = y1 + ymax = y2 + else: + ymin = y2 + ymax = y1 + width = xmax - xmin + if width < 0: + width = width * -1 + height = ymax - ymin + # x and y from center of rect + x = xmin + width / 2 + y = ymin + height / 2 + return height, width, x, y + + +class CreateMLReader: + def __init__(self, jsonpath, filepath): + self.jsonpath = jsonpath + self.shapes = [] + self.verified = False + self.filename = filepath.split("/")[-1:][0] + try: + self.parse_json() + except ValueError: + print("JSON decoding failed") + + def parse_json(self): + with open(self.jsonpath, "r") as file: + inputdata = file.read() + + outputdict = json.loads(inputdata) + self.verified = True + + if len(self.shapes) > 0: + self.shapes = [] + for image in outputdict: + if image["image"] == self.filename: + for shape in image["annotations"]: + self.add_shape(shape["label"], shape["coordinates"]) + + def add_shape(self, label, bndbox): + xmin = bndbox["x"] - (bndbox["width"] / 2) + ymin = bndbox["y"] - (bndbox["height"] / 2) + + xmax = bndbox["x"] + (bndbox["width"] / 2) + ymax = bndbox["y"] + (bndbox["height"] / 2) + + points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] + self.shapes.append((label, points, None, None, True)) + + def get_shapes(self): + return self.shapes diff --git a/PPOCRLabel/libs/hashableQListWidgetItem.py b/PPOCRLabel/libs/hashableQListWidgetItem.py new file mode 100644 index 0000000000000000000000000000000000000000..95c496ff56048f85acc798a79db43cd0d52546b7 --- /dev/null +++ b/PPOCRLabel/libs/hashableQListWidgetItem.py @@ -0,0 +1,40 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import sys +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + # needed for py3+qt4 + # Ref: + # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html + # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string + if sys.version_info.major >= 3: + import sip + sip.setapi('QVariant', 2) + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +# PyQt5: TypeError: unhashable type: 'QListWidgetItem' + + +class HashableQListWidgetItem(QListWidgetItem): + + def __init__(self, *args): + super(HashableQListWidgetItem, self).__init__(*args) + + def __hash__(self): + return hash(id(self)) diff --git a/PPOCRLabel/libs/labelDialog.py b/PPOCRLabel/libs/labelDialog.py new file mode 100644 index 0000000000000000000000000000000000000000..57071d77b5de0ed70a437734913fe1330edc5162 --- /dev/null +++ b/PPOCRLabel/libs/labelDialog.py @@ -0,0 +1,107 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +from libs.utils import newIcon, labelValidator + +BB = QDialogButtonBox + + +class LabelDialog(QDialog): + + def __init__(self, text="Enter object label", parent=None, listItem=None): + super(LabelDialog, self).__init__(parent) + + self.edit = QLineEdit() # OLD + # self.edit = QTextEdit() + self.edit.setText(text) + # self.edit.setValidator(labelValidator()) # 验证有效性 + self.edit.editingFinished.connect(self.postProcess) + + model = QStringListModel() + model.setStringList(listItem) + completer = QCompleter() + completer.setModel(model) + self.edit.setCompleter(completer) + + layout = QVBoxLayout() + layout.addWidget(self.edit) + self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self) + bb.button(BB.Ok).setIcon(newIcon('done')) + bb.button(BB.Cancel).setIcon(newIcon('undo')) + bb.accepted.connect(self.validate) + bb.rejected.connect(self.reject) + layout.addWidget(bb) + + # if listItem is not None and len(listItem) > 0: + # self.listWidget = QListWidget(self) + # for item in listItem: + # self.listWidget.addItem(item) + # self.listWidget.itemClicked.connect(self.listItemClick) + # self.listWidget.itemDoubleClicked.connect(self.listItemDoubleClick) + # layout.addWidget(self.listWidget) + + self.setLayout(layout) + + def validate(self): + try: + if self.edit.text().trimmed(): + self.accept() + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + if self.edit.text().strip(): + self.accept() + + def postProcess(self): + try: + self.edit.setText(self.edit.text().trimmed()) + # print(self.edit.text()) + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + self.edit.setText(self.edit.text()) + print(self.edit.text()) + + def popUp(self, text='', move=True): + self.edit.setText(text) + self.edit.setSelection(0, len(text)) + self.edit.setFocus(Qt.PopupFocusReason) + if move: + cursor_pos = QCursor.pos() + parent_bottomRight = self.parentWidget().geometry() + max_x = parent_bottomRight.x() + parent_bottomRight.width() - self.sizeHint().width() + max_y = parent_bottomRight.y() + parent_bottomRight.height() - self.sizeHint().height() + max_global = self.parentWidget().mapToGlobal(QPoint(max_x, max_y)) + if cursor_pos.x() > max_global.x(): + cursor_pos.setX(max_global.x()) + if cursor_pos.y() > max_global.y(): + cursor_pos.setY(max_global.y()) + self.move(cursor_pos) + return self.edit.text() if self.exec_() else None + + def listItemClick(self, tQListWidgetItem): + try: + text = tQListWidgetItem.text().trimmed() + except AttributeError: + # PyQt5: AttributeError: 'str' object has no attribute 'trimmed' + text = tQListWidgetItem.text().strip() + self.edit.setText(text) + + def listItemDoubleClick(self, tQListWidgetItem): + self.listItemClick(tQListWidgetItem) + self.validate() diff --git a/PPOCRLabel/libs/labelFile.py b/PPOCRLabel/libs/labelFile.py new file mode 100644 index 0000000000000000000000000000000000000000..ebcca26698ba6ca38152b37c653aff842c11ff97 --- /dev/null +++ b/PPOCRLabel/libs/labelFile.py @@ -0,0 +1,152 @@ +# Copyright (c) 2016 Tzutalin +# Create by TzuTaLin + +try: + from PyQt5.QtGui import QImage +except ImportError: + from PyQt4.QtGui import QImage + +from base64 import b64encode, b64decode +from libs.pascal_voc_io import PascalVocWriter +from libs.yolo_io import YOLOWriter +from libs.pascal_voc_io import XML_EXT +from enum import Enum +import os.path +import sys + + +class LabelFileFormat(Enum): + PASCAL_VOC= 1 + YOLO = 2 + + +class LabelFileError(Exception): + pass + + +class LabelFile(object): + # It might be changed as window creates. By default, using XML ext + # suffix = '.lif' + suffix = XML_EXT + + def __init__(self, filename=None): + self.shapes = () + self.imagePath = None + self.imageData = None + self.verified = False + + def savePascalVocFormat(self, filename, shapes, imagePath, imageData, + lineColor=None, fillColor=None, databaseSrc=None): + imgFolderPath = os.path.dirname(imagePath) + imgFolderName = os.path.split(imgFolderPath)[-1] + imgFileName = os.path.basename(imagePath) + #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0] + # Read from file path because self.imageData might be empty if saving to + # Pascal format + image = QImage() + image.load(imagePath) + imageShape = [image.height(), image.width(), + 1 if image.isGrayscale() else 3] + writer = PascalVocWriter(imgFolderName, imgFileName, + imageShape, localImgPath=imagePath) + writer.verified = self.verified + + for shape in shapes: + points = shape['points'] + label = shape['label'] + # Add Chris + difficult = int(shape['difficult']) + bndbox = LabelFile.convertPoints2BndBox(points) + writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult) + + writer.save(targetFile=filename) + return + + def saveYoloFormat(self, filename, shapes, imagePath, imageData, classList, + lineColor=None, fillColor=None, databaseSrc=None): + imgFolderPath = os.path.dirname(imagePath) + imgFolderName = os.path.split(imgFolderPath)[-1] + imgFileName = os.path.basename(imagePath) + #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0] + # Read from file path because self.imageData might be empty if saving to + # Pascal format + image = QImage() + image.load(imagePath) + imageShape = [image.height(), image.width(), + 1 if image.isGrayscale() else 3] + writer = YOLOWriter(imgFolderName, imgFileName, + imageShape, localImgPath=imagePath) + writer.verified = self.verified + + for shape in shapes: + points = shape['points'] + label = shape['label'] + # Add Chris + difficult = int(shape['difficult']) + bndbox = LabelFile.convertPoints2BndBox(points) + writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult) + + writer.save(targetFile=filename, classList=classList) + return + + def toggleVerify(self): + self.verified = not self.verified + + ''' ttf is disable + def load(self, filename): + import json + with open(filename, 'rb') as f: + data = json.load(f) + imagePath = data['imagePath'] + imageData = b64decode(data['imageData']) + lineColor = data['lineColor'] + fillColor = data['fillColor'] + shapes = ((s['label'], s['points'], s['line_color'], s['fill_color'])\ + for s in data['shapes']) + # Only replace data after everything is loaded. + self.shapes = shapes + self.imagePath = imagePath + self.imageData = imageData + self.lineColor = lineColor + self.fillColor = fillColor + + def save(self, filename, shapes, imagePath, imageData, lineColor=None, fillColor=None): + import json + with open(filename, 'wb') as f: + json.dump(dict( + shapes=shapes, + lineColor=lineColor, fillColor=fillColor, + imagePath=imagePath, + imageData=b64encode(imageData)), + f, ensure_ascii=True, indent=2) + ''' + + @staticmethod + def isLabelFile(filename): + fileSuffix = os.path.splitext(filename)[1].lower() + return fileSuffix == LabelFile.suffix + + @staticmethod + def convertPoints2BndBox(points): + xmin = float('inf') + ymin = float('inf') + xmax = float('-inf') + ymax = float('-inf') + for p in points: + x = p[0] + y = p[1] + xmin = min(x, xmin) + ymin = min(y, ymin) + xmax = max(x, xmax) + ymax = max(y, ymax) + + # Martin Kersner, 2015/11/12 + # 0-valued coordinates of BB caused an error while + # training faster-rcnn object detector. + if xmin < 1: + xmin = 1 + + if ymin < 1: + ymin = 1 + + return (int(xmin), int(ymin), int(xmax), int(ymax)) diff --git a/PPOCRLabel/libs/pascal_voc_io.py b/PPOCRLabel/libs/pascal_voc_io.py new file mode 100644 index 0000000000000000000000000000000000000000..6c58239764de56644d033a6d175740495e0fb917 --- /dev/null +++ b/PPOCRLabel/libs/pascal_voc_io.py @@ -0,0 +1,183 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/env python +# -*- coding: utf8 -*- +import sys +from xml.etree import ElementTree +from xml.etree.ElementTree import Element, SubElement +from lxml import etree +import codecs +from libs.constants import DEFAULT_ENCODING +from libs.ustr import ustr + + +XML_EXT = '.xml' +ENCODE_METHOD = DEFAULT_ENCODING + +class PascalVocWriter: + + def __init__(self, foldername, filename, imgSize,databaseSrc='Unknown', localImgPath=None): + self.foldername = foldername + self.filename = filename + self.databaseSrc = databaseSrc + self.imgSize = imgSize + self.boxlist = [] + self.localImgPath = localImgPath + self.verified = False + + def prettify(self, elem): + """ + Return a pretty-printed XML string for the Element. + """ + rough_string = ElementTree.tostring(elem, 'utf8') + root = etree.fromstring(rough_string) + return etree.tostring(root, pretty_print=True, encoding=ENCODE_METHOD).replace(" ".encode(), "\t".encode()) + # minidom does not support UTF-8 + '''reparsed = minidom.parseString(rough_string) + return reparsed.toprettyxml(indent="\t", encoding=ENCODE_METHOD)''' + + def genXML(self): + """ + Return XML root + """ + # Check conditions + if self.filename is None or \ + self.foldername is None or \ + self.imgSize is None: + return None + + top = Element('annotation') + if self.verified: + top.set('verified', 'yes') + + folder = SubElement(top, 'folder') + folder.text = self.foldername + + filename = SubElement(top, 'filename') + filename.text = self.filename + + if self.localImgPath is not None: + localImgPath = SubElement(top, 'path') + localImgPath.text = self.localImgPath + + source = SubElement(top, 'source') + database = SubElement(source, 'database') + database.text = self.databaseSrc + + size_part = SubElement(top, 'size') + width = SubElement(size_part, 'width') + height = SubElement(size_part, 'height') + depth = SubElement(size_part, 'depth') + width.text = str(self.imgSize[1]) + height.text = str(self.imgSize[0]) + if len(self.imgSize) == 3: + depth.text = str(self.imgSize[2]) + else: + depth.text = '1' + + segmented = SubElement(top, 'segmented') + segmented.text = '0' + return top + + def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult): + bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax} + bndbox['name'] = name + bndbox['difficult'] = difficult + self.boxlist.append(bndbox) + + def appendObjects(self, top): + for each_object in self.boxlist: + object_item = SubElement(top, 'object') + name = SubElement(object_item, 'name') + name.text = ustr(each_object['name']) + pose = SubElement(object_item, 'pose') + pose.text = "Unspecified" + truncated = SubElement(object_item, 'truncated') + if int(float(each_object['ymax'])) == int(float(self.imgSize[0])) or (int(float(each_object['ymin']))== 1): + truncated.text = "1" # max == height or min + elif (int(float(each_object['xmax']))==int(float(self.imgSize[1]))) or (int(float(each_object['xmin']))== 1): + truncated.text = "1" # max == width or min + else: + truncated.text = "0" + difficult = SubElement(object_item, 'difficult') + difficult.text = str( bool(each_object['difficult']) & 1 ) + bndbox = SubElement(object_item, 'bndbox') + xmin = SubElement(bndbox, 'xmin') + xmin.text = str(each_object['xmin']) + ymin = SubElement(bndbox, 'ymin') + ymin.text = str(each_object['ymin']) + xmax = SubElement(bndbox, 'xmax') + xmax.text = str(each_object['xmax']) + ymax = SubElement(bndbox, 'ymax') + ymax.text = str(each_object['ymax']) + + def save(self, targetFile=None): + root = self.genXML() + self.appendObjects(root) + out_file = None + if targetFile is None: + out_file = codecs.open( + self.filename + XML_EXT, 'w', encoding=ENCODE_METHOD) + else: + out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD) + + prettifyResult = self.prettify(root) + out_file.write(prettifyResult.decode('utf8')) + out_file.close() + + +class PascalVocReader: + + def __init__(self, filepath): + # shapes type: + # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult] + self.shapes = [] + self.filepath = filepath + self.verified = False + try: + self.parseXML() + except: + pass + + def getShapes(self): + return self.shapes + + def addShape(self, label, bndbox, difficult): + xmin = int(float(bndbox.find('xmin').text)) + ymin = int(float(bndbox.find('ymin').text)) + xmax = int(float(bndbox.find('xmax').text)) + ymax = int(float(bndbox.find('ymax').text)) + points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] + self.shapes.append((label, points, None, None, difficult)) + + def parseXML(self): + assert self.filepath.endswith(XML_EXT), "Unsupport file format" + parser = etree.XMLParser(encoding=ENCODE_METHOD) + xmltree = ElementTree.parse(self.filepath, parser=parser).getroot() + filename = xmltree.find('filename').text + try: + verified = xmltree.attrib['verified'] + if verified == 'yes': + self.verified = True + except KeyError: + self.verified = False + + for object_iter in xmltree.findall('object'): + bndbox = object_iter.find("bndbox") + label = object_iter.find('name').text + # Add chris + difficult = False + if object_iter.find('difficult') is not None: + difficult = bool(int(object_iter.find('difficult').text)) + self.addShape(label, bndbox, difficult) + return True diff --git a/PPOCRLabel/libs/resources.py b/PPOCRLabel/libs/resources.py new file mode 100644 index 0000000000000000000000000000000000000000..6dfa6075cc9d95f370a4a652c4ce88dc706ee1ae --- /dev/null +++ b/PPOCRLabel/libs/resources.py @@ -0,0 +1,8537 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.15.1) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x0c\x27\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x0b\xb9\x49\x44\x41\x54\x78\xda\xed\ +\x9a\x69\x6c\x55\x75\x1a\xc6\xdf\xee\xfb\x42\xb9\x2d\x16\x68\xb1\ +\x55\xa9\xa5\x55\x06\x64\x71\xc0\x01\x15\x41\x59\x15\x70\x45\x27\ +\x63\x70\xe2\x18\xcd\x64\xf8\x30\x93\x99\x2f\x66\x26\x99\x0f\x33\ +\xc9\x4c\x32\x93\xcc\x17\x27\x31\x66\x12\x0c\x6a\x94\x2d\x58\xf6\ +\x22\x4b\x51\xd9\x97\x0e\xa5\x28\xfb\xda\xd2\x52\x0a\x5d\x6e\xdb\ +\xbb\x74\x7e\xcf\x7f\xee\xb9\xb9\x69\x30\xd3\x6b\xd0\xc4\x0c\x37\ +\x79\x73\xee\x39\xf7\x9c\xff\xff\x79\xde\xf7\x79\x97\x53\x48\xe8\ +\xef\xef\xb7\x1f\xf2\x27\x11\xbb\x43\xe0\x0e\x81\xff\x67\x02\xc9\ +\xb7\xba\x38\x67\xce\x9c\x41\x2f\x40\x11\xf0\x6c\x08\x36\x2e\x1c\ +\x0e\x57\x61\x95\x7c\x2f\x0f\x87\x43\x39\xe1\x70\xbf\x0a\x85\x1f\ +\x3b\x8b\x1d\x8f\xd8\x01\xee\x69\xc2\x2c\x14\x0a\xe9\x59\x77\xf4\ +\xce\xbd\xef\x03\x0b\xcc\xe9\xd3\xa7\x07\x41\x20\xfe\xcf\x78\x68\ +\x3c\x17\x0a\x05\x97\x04\x02\x81\xd2\x84\x84\x44\x36\x4e\xb0\x84\ +\x84\x04\x4b\x4e\x4e\x37\x7d\xfa\xfa\x7a\x8d\xdf\x1d\xb0\x60\xb0\ +\xcf\x12\x13\x13\x5b\xb9\x6f\x15\x3f\x7d\xc4\x7d\x3b\x00\x1a\xba\ +\x0d\x11\x88\xfb\x33\x81\x8d\xdf\x06\xdc\x93\xa1\x50\x38\x2d\x3b\ +\x3b\xdf\xaa\xab\xab\xec\xee\xbb\xcb\xb0\x51\x36\x74\x68\x81\xa5\ +\xa4\xa4\x38\x4f\xf6\xf6\xf6\xd9\xb5\x6b\xd7\xec\xec\xd9\x73\x78\ +\xf1\x94\x9d\x3c\xd9\xe0\x6b\x6e\xbe\xf4\x7a\x28\x14\x78\x3d\x39\ +\x39\xa5\x8e\xb5\xfe\x84\xad\xff\xbe\x08\xc8\xad\xbf\x0b\x06\x03\ +\xbf\x0a\x85\xfa\xf3\x4b\x4a\x2a\x6c\xca\x94\xa9\x36\x69\xd2\x44\ +\x80\x97\x58\x76\x76\x06\x1e\x4e\x20\x0a\x61\xbc\x2d\x39\x84\x3d\ +\x23\x12\x41\xeb\xec\xf4\xdb\x85\x0b\x97\xed\xf0\xe1\x43\xf6\xc5\ +\x17\x75\xd6\xd8\x78\xf8\x91\xde\x5e\xff\x5a\x88\xfc\x8b\x75\xdf\ +\xc6\x9a\xe2\x01\x23\x7d\xc6\x93\x03\x23\xb9\xff\x9d\x40\xa0\x6f\ +\x6e\x6e\xae\xcf\x66\xcc\x98\x6b\x0b\x16\xcc\xb1\x92\x12\x9f\xe9\ +\x83\xde\x23\xa0\x43\x3a\x0e\xf8\x1e\x56\x34\x94\x35\x10\x94\xcc\ +\x12\xad\xb5\xb5\xdd\x3e\xfb\x6c\xbb\xd5\xd4\xac\x84\xd4\x49\x4b\ +\x4a\x4a\xae\xe7\x86\x9f\x05\x83\xc1\x43\x83\xc8\x81\xb8\x09\xdc\ +\xc3\xbd\xab\x91\xcc\x03\x15\x15\xe3\x6d\xe9\xd2\xa5\x36\x61\xc2\ +\x18\xef\xb7\x48\x02\x3a\xaf\x7f\x23\x89\x40\xc0\xfb\x2e\x70\x61\ +\x01\x96\x01\xec\xbc\x7d\xf4\xd1\x0a\xab\xab\xdb\x28\x82\x4d\xc0\ +\xfa\x29\xeb\x6d\xbd\x9d\x49\x5c\xcc\x86\x6b\xd8\xb8\x7a\xf2\xe4\ +\x19\xf6\xe6\x9b\xbf\xb0\x91\x23\x7d\xb1\xbf\x0b\xe0\xff\x20\xe0\ +\x11\xf4\xaa\x8c\x29\xa1\xf9\xde\x63\x23\x46\x0c\xb3\xd7\x5e\x7b\ +\xdd\x72\x73\xf3\x6c\xe3\xc6\x95\x77\x05\x02\x3d\x1f\x90\xe4\x4f\ +\xb1\xec\x81\xdb\xd1\x07\xb2\xf0\xc4\x7b\x7d\x7d\x81\xea\x89\x13\ +\xa7\xd9\xb2\x65\xbf\x8c\x82\xe7\x1a\xe1\xaf\xb5\x86\x86\xaf\x5d\ +\xc2\x12\xfa\x6f\x00\xef\x59\xd0\x9d\x03\xce\x9a\x9b\x5b\x6c\xd7\ +\xae\x2f\xec\xea\xd5\x56\xbb\x79\xb3\xcb\xd2\xd2\x92\xed\xc5\x17\ +\x97\xd8\xac\x59\x8b\x24\x45\x1f\xf7\x7d\x48\x14\x4a\x30\xf3\xec\ +\xdb\x12\xf8\x0d\x9a\x7f\x4a\xb2\x79\xeb\xad\x37\xac\xa8\x28\xd7\ +\x5d\xf4\xfb\x7b\xec\xdd\x77\x57\x38\x60\xb5\xb5\x75\xb6\x7b\xf7\ +\x7e\x91\x18\x00\x58\x16\x8e\x78\x5f\xe4\x1c\x78\x97\xc4\x87\x0e\ +\x1d\xb1\xd1\xa3\x4b\x6d\xef\xde\x7d\x76\xe5\x4a\x33\x24\xba\xdd\ +\xb3\x4f\x3f\xbd\xd0\xa6\x4d\x9b\x63\x94\xe4\x7b\x89\xfa\x5f\x06\ +\x10\x88\x5b\x42\xe3\x58\x68\x59\x6e\xee\x50\x69\x9e\x50\xfb\xa2\ +\xe0\x57\xac\x58\x6b\xe5\xe5\xa3\x48\xe4\x29\xd6\xd4\xd4\x6a\x9f\ +\x7c\xe2\xaa\xa0\x55\x55\x55\x58\x4f\x4f\xdf\xc0\x08\xe8\xe8\x92\ +\xf7\xe2\xc5\x26\xc0\x1f\xb5\x85\x0b\x67\xda\x7d\xf7\xdd\x6d\xc3\ +\x86\xf9\xec\xd3\x4f\xb7\xb3\xd6\x3d\x96\x9f\x9f\x67\x59\x59\x99\ +\x36\x7f\xfe\x22\x3b\x75\xea\x38\xd6\xf0\x3c\xd5\x69\x2d\x0a\xf8\ +\xe0\x5b\x49\x88\x07\xff\x88\xe5\x51\x6d\x48\xd8\xca\x28\xf8\xe5\ +\xcb\x57\x21\xa3\x62\x7b\xfc\xf1\x1f\xe3\xbd\x26\x36\x4d\xb3\x57\ +\x5e\x59\x68\x9f\x7f\xbe\x8f\xf2\xd8\x40\x03\x4b\x1e\x08\xde\x79\ +\xfe\xd2\xa5\x26\x3b\x70\xe0\x20\x52\x99\x6b\xa5\xa5\xc5\x9c\x5f\ +\xb6\xfb\xef\x2f\xa7\x92\xcd\xa0\x9c\x36\xd2\x2b\xda\xad\xbd\xbd\ +\xc3\x7c\x3e\x9f\xcd\x9e\xbd\xd8\x32\x32\xb2\x12\x90\xdd\x1f\xc0\ +\x90\x89\x0d\x9a\x80\x80\xcb\xc6\xaa\x49\x95\x96\xde\x67\xcf\x3c\ +\x33\x2f\xfa\xdb\xce\x9d\x7b\x1d\xf8\x99\x33\xa7\xa2\xe3\xab\xce\ +\xab\x5d\x5d\xdd\x54\x13\x23\x11\x5f\xb0\xfa\xfa\xe3\x80\xac\xe7\ +\x3c\x29\x1a\x05\x33\x07\x1e\x72\xf5\xf6\xd2\x4b\x0b\xac\xb0\xb0\ +\xc0\xae\x5f\x6f\x17\x51\xe5\x00\x24\xca\xb8\x3e\x4f\x4d\x8e\x3e\ +\xd1\x85\x9c\x3a\x6c\xec\xd8\x71\x34\xc6\x09\x06\x86\xd1\xc8\x67\ +\x0e\x16\x2f\x81\xf0\x12\x1e\x4a\x1e\x3f\x7e\x32\xd2\x19\x1a\xfd\ +\x6d\xd4\xa8\x11\xc8\xe0\x0a\xb2\x69\xb1\x9c\x9c\x6c\x5d\x72\x60\ +\xbb\xbb\xfd\x00\x4a\xb4\xe7\x9e\x9b\x0d\x90\xb3\x24\xf6\x57\xf2\ +\xba\xb3\xcb\x97\x9b\xed\xe8\xd1\x63\xb6\x68\xd1\x4c\x2b\x2e\xf6\ +\x01\xf0\xa6\x9e\x71\xe3\x46\x66\x66\x06\x51\xed\x85\xf4\x31\xd6\ +\xcb\x73\xf9\x72\xe3\x46\x87\x2b\xaf\x0f\x3e\x38\xd1\x52\x53\xd3\ +\x95\x3f\x6f\x80\x25\x29\x1e\x02\x79\x84\x6e\x49\x5e\x9e\x8f\xea\ +\x90\x8f\x4c\xda\x74\x99\xc4\x0a\x92\x78\xe5\x2c\x3c\xc6\xd6\xac\ +\xa9\x65\x61\xa3\xf3\x3a\x12\xf2\xa6\x22\x81\x9c\xd2\xed\xe5\x97\ +\x17\xd8\x89\x13\x27\x19\x19\xce\x38\xa2\x47\x8e\xd4\x8b\x18\x0d\ +\xaf\x18\x89\xdc\xd0\xbd\x02\xcf\xda\xa9\x3c\x9f\x63\x6b\xd7\xd6\ +\xda\xb9\x73\xcd\x44\xa6\x48\x95\x8a\xd1\x23\x80\x9c\xda\x34\x4b\ +\x21\xb5\x7b\x94\xd0\x8f\x69\x48\x8c\x87\xc0\x43\x2c\x34\xb2\xb4\ +\x74\x34\x67\x29\x94\xbb\x83\x9a\x67\x54\xde\x00\xe9\x27\xbc\x63\ +\x6c\xdc\xb8\x2a\x7b\xff\xfd\x35\x5c\x33\x3c\x17\x25\x11\x8d\xc4\ +\xab\xaf\x2e\xa6\xda\x5c\xc2\xb3\x87\xed\x85\x17\xe6\x92\xac\x05\ +\x78\xd6\x79\xde\xf4\x49\x4f\x4f\xe3\xb9\x5c\xd6\x58\x0b\xc9\x76\ +\x22\x3b\x4a\x40\x23\xbd\x22\x48\x4e\x34\x10\x19\x3f\x72\x2d\x17\ +\xd9\x44\x08\x4c\x89\x83\x40\xb8\x3a\x31\x31\xc9\x86\x0c\x29\x34\ +\x24\x2e\xc9\x50\x26\x0f\x45\xbb\xad\x3c\x5d\x51\x51\x0e\x89\x07\ +\xec\xe3\x8f\x37\x00\xba\x17\x4f\x66\x79\x72\xa2\x0a\xf5\x12\xfa\ +\x24\x24\x33\x8b\x68\xcc\xb7\xbb\xee\x1a\x2a\x6d\x7b\xb2\x01\x7c\ +\x3a\x25\x37\x8d\xca\xb5\x89\x5c\xe8\x46\x56\xc5\xf2\x3a\xc0\x5d\ +\x83\x23\xb7\x2e\x42\xea\x34\x7b\x05\xa8\x4c\x3e\x1c\xa2\xa1\x30\ +\x54\x3d\x68\x02\x80\xac\x44\x83\xc8\x21\x57\xfa\x13\x25\xea\xf5\ +\x51\xe9\x54\x00\xf4\x3b\xa0\x7b\x28\x83\x9a\x3c\x4b\x25\x01\xbc\ +\x17\x76\x7a\xd6\x47\x89\xad\x6a\x25\x39\x15\x14\xe4\x5a\x47\x47\ +\xa7\xbb\xc6\x47\xb2\xa1\xba\x64\xda\xba\x75\xdb\x88\x50\x0b\xe4\ +\x8a\x35\xe4\x45\xde\x0b\x12\x90\x4e\x93\x9d\x3f\x7f\x1c\x32\x22\ +\xd4\xa7\x4a\x04\xd9\x54\xed\x59\x16\x4f\x04\xca\xfe\xab\xd1\x0c\ +\x11\x70\x9e\xe7\x94\x59\x65\xbf\xed\xdb\x77\x94\x3b\x34\x6d\x3a\ +\x39\x29\x27\xd0\x69\x09\x7d\xe1\x53\x36\xec\x57\x1d\xd7\xef\xf2\ +\xb6\x24\x21\xe9\x79\x9e\x67\xbd\x34\x07\xfe\xc3\x0f\x6b\x48\xec\ +\x36\x8a\xc3\x70\xdd\x13\x05\xdf\xd2\x72\xc9\xce\x9c\xa9\x97\x84\ +\x34\x5d\x89\x84\x88\xf3\x5c\xa6\xee\x29\x1c\x34\x01\x00\xe7\x78\ +\x15\x44\xe0\x79\xdf\xf0\xae\x33\x02\x1f\x20\x27\xf6\x20\x89\x6e\ +\xcf\xd3\x10\x18\x8e\x86\x4b\x24\x09\xbc\xed\x07\x64\x9a\x00\x0b\ +\xb8\x4c\xf7\x29\x3f\xdc\x7a\x2b\x57\x6e\xc6\xcb\x9d\x74\xf4\x22\ +\x15\x05\xe5\x95\x00\x23\xd3\x53\x54\xaf\x7a\xae\xf5\x6a\x2b\x01\ +\x96\x6c\x3c\x59\xca\xa9\x19\x83\xee\xc4\xfd\xb8\x23\xa6\x9c\xea\ +\xe8\x45\x41\x46\x55\x69\x50\x5d\x57\x35\xa2\x72\x38\xc7\x00\x3a\ +\x5d\xb3\x3e\x00\xd4\x71\xe5\xf1\x20\xe6\x96\xf1\x40\x08\x2c\x89\ +\xdc\x29\x32\x00\xd4\x9a\xc6\xf9\x75\xc0\x9f\xb4\xb6\xb6\x26\x6f\ +\x40\x96\xc3\xb4\xaf\xf7\x5a\xe9\xed\x9f\x30\x68\x02\x6c\xe4\x27\ +\xb4\x92\x0f\x60\x52\xe5\x89\x98\xc5\x0c\x00\x49\x84\xbb\xd5\xb6\ +\x6d\xdb\x89\xf7\x47\xa0\x73\x1f\x0d\xa9\xcd\x9e\x7d\x76\x16\x9a\ +\x2e\x50\x92\x0b\xb0\xee\x8f\x8d\xaa\xf4\xaf\xa4\x46\x6e\x35\x94\ +\xe6\xcb\x10\xbe\xc6\x73\x17\x20\xdd\x27\xb2\x1e\x50\x6f\xaf\x68\ +\x24\xf4\x3b\xa7\xbd\x71\x8c\x12\xfd\xe7\xd0\x1f\xd5\xa4\x5b\x1e\ +\x89\x89\x84\x16\xf7\x66\xf9\x44\x47\xec\xf8\xf1\xaf\xd1\xed\x79\ +\xc6\x81\xc7\xd4\xa4\x54\x81\x3c\xcd\x93\x7c\xc9\x58\x8a\x24\x24\ +\xd3\xf4\x0a\x89\x14\x48\xcc\xe3\x95\x33\x87\x3c\xb8\xa0\x4e\xab\ +\xa8\x0e\x00\xaf\x63\x3f\xd7\x93\x24\x2f\x0a\x46\x97\x40\xb5\xc6\ +\xd3\x07\x1a\x61\x8d\x9e\xdb\xbd\x6e\xea\x85\x35\x72\x74\xba\x55\ +\x65\xa0\x39\x8d\x62\xb6\x99\x67\xc3\x87\x17\x0a\xbc\x80\x0a\xbc\ +\x80\x2b\x31\x25\x15\x40\x2b\x27\xa2\x89\x4d\x19\x4d\x75\xbd\xe1\ +\x91\x47\x1e\x25\x9a\x19\xba\x26\x67\xc4\x38\x29\x24\xc7\x49\x8a\ +\x80\xef\x24\xcf\xba\x85\xea\x7c\x1c\x49\xdc\x7f\x0c\xcf\xa0\xcb\ +\x66\x6d\xec\x25\x33\xe6\xbd\xe3\x3a\xf0\x34\xa7\xe1\xb6\x64\xc9\ +\x3c\x9a\x4d\x11\xe0\x7b\x62\xc1\x3b\x9d\x6f\xd8\x50\xc7\x9b\xd6\ +\x46\x2a\x51\xd0\x23\x11\x89\x44\x1f\x4d\x2c\x83\xf9\x67\xbe\x4d\ +\x9e\xfc\x13\xee\xcf\x54\xc5\xf1\x0a\x86\xf6\xe1\x5a\x3a\x84\x53\ +\xc0\x70\x55\x51\x92\x84\x1a\xe2\x89\xc0\x7e\x36\x6b\x3f\x77\xee\ +\x2b\xc9\x88\x4d\x93\xb5\x80\xb7\x81\x12\x95\x12\x38\x12\xf0\xf3\ +\xd5\x61\xe5\x79\x81\x8b\x01\x9f\xc2\xa8\xb1\x9d\xc1\x6f\x27\xbd\ +\x63\x0f\x65\x73\x03\x20\x42\x78\x3e\x96\x84\x22\x91\xcc\x14\x3b\ +\xdf\xa6\x4f\x7f\x82\xe7\xb2\x54\x81\x3c\xfd\x73\x9e\x21\x47\x52\ +\x2c\xce\x46\xca\xaa\xed\x89\x87\x40\x33\x5e\x5f\xd9\xd2\x72\x85\ +\x24\xbb\xe8\x00\x71\x2e\xcf\x3b\x59\x94\x95\x95\xdb\xe2\xc5\x4f\ +\x0a\xbc\x80\x78\xa5\x92\xee\x9b\xe2\x36\x5d\xbf\x7e\x27\x3d\x63\ +\x17\x9e\xef\x60\xf3\x6e\x48\x7c\xa9\x12\x4b\xd2\xf6\x28\x91\x75\ +\xaf\x37\xad\xd2\xfc\xd2\xb4\x16\x6f\x62\x73\x89\x4a\x81\x22\xc1\ +\x5e\x29\xac\x95\x49\x97\x6e\xa1\xb4\x36\x8a\xb4\x5e\xf2\x0f\xc6\ +\xd1\x89\x9d\xce\x97\xe3\x91\xfe\x33\x67\x1a\x05\x5e\xad\x5f\xde\ +\xd1\x11\x8f\x4d\x96\xe6\xe5\x99\xa8\x6c\x24\x19\x91\xdb\xb2\x65\ +\x0f\x6f\x68\x9f\xa1\xdd\x76\x6f\x0b\x48\x76\x40\x68\x07\x1d\x7b\ +\x1b\x7a\x0e\x8a\xa8\x17\x09\x91\x00\x78\x26\xf3\xff\xa3\xac\x59\ +\xce\xb9\x22\x95\xc3\x7a\xa9\x14\x87\x13\x54\xb4\x4e\xdd\xfb\x4f\ +\x16\xea\x89\xa7\x91\xc9\xea\x48\xa2\xbd\xa7\x4e\x1d\x63\x2e\x39\ +\xcf\xa6\x19\xd2\x25\x72\xe9\xb0\xad\x5b\x77\x33\x06\x5c\x15\x68\ +\x40\x38\xf0\x0e\x50\x4d\xcd\x6e\x4a\xeb\x36\xc0\x5f\xe7\x3c\xda\ +\x47\x94\x90\x44\xe3\x26\x92\xaa\x55\x24\x58\x23\xe0\x3d\xa3\x23\ +\xbd\xa0\x1b\xc9\x6d\xc1\xdb\xff\x56\xd7\xa5\xa7\x0c\x21\x5a\x37\ +\x18\xe8\x8e\x08\x4e\x33\xeb\x7c\x8c\x59\xbc\x04\x42\x6c\xfc\x7b\ +\xbf\xbf\xab\x6f\xff\xfe\x1d\xaa\xc5\x2c\x9e\xa5\x47\xf0\xcc\x57\ +\x6c\xb8\x95\x06\xd4\x62\x90\x74\x1d\x75\xd3\xa6\x2f\x01\xb8\xdd\ +\xd5\x76\xb3\x68\x4d\xf7\x1a\xa1\xc0\xe2\xcd\xeb\xdc\xb3\xd5\x56\ +\xad\xaa\x55\xd3\x93\x8c\x04\x9e\xee\xbc\x91\xa8\xad\x23\x3a\x9d\ +\x44\xa3\x50\x4e\x61\x64\xd9\xc5\xe8\xad\xb5\xec\xaf\x3c\xdf\x16\ +\x0f\x81\xd8\x3f\xb0\x6e\x62\xa8\x5b\xae\x36\xdf\xd0\x70\x40\xb9\ +\x80\x77\x72\x05\x46\xef\xab\xb6\x7a\xf5\x16\xa2\x23\x50\x87\x90\ +\xce\x56\xca\x6e\xab\x7e\x8b\x05\xcf\x3a\x72\x86\xac\x5f\x92\x11\ +\x41\x22\x58\xe3\x2a\x54\x6b\x6b\x87\x1c\xc1\xf9\x3a\xae\x5f\xb7\ +\xbc\xbc\xe1\xc8\x27\x9b\x48\x9c\xa0\xbf\x1c\x16\x94\x3a\xec\xef\ +\x71\xff\x65\xae\xaa\x2a\xfa\xee\x20\x40\xc3\x20\xb3\x8d\xfb\xc6\ +\x4c\x9d\x3a\x9b\x09\xf4\x41\x24\x72\x53\x40\x94\xd4\xe8\xb6\x0c\ +\x4f\xb5\x6a\x14\xb8\x45\x37\xbd\xd5\xd1\x75\x56\xc0\x16\x32\x3f\ +\x8d\xe6\xc5\xe7\x20\x91\xe9\x10\x78\x06\xc1\x7c\xa2\x7a\xda\x36\ +\x6f\x5e\x85\xcc\xfc\x1d\x6c\x3f\x0d\x3b\x1c\x53\x5c\x06\x47\xa0\ +\xb2\xb2\x72\xe0\xa5\xb1\x54\x87\xcd\x24\x70\xd1\xc3\x0f\xcf\xb4\ +\xf2\xf2\x4a\x12\xd3\x0f\x89\x76\x91\x51\x69\xd5\x52\x58\x2c\x78\ +\x67\x03\xc8\x78\xe6\xfe\x4a\xad\xef\xaa\x36\xbc\x4b\x14\xca\xf3\ +\xae\x64\xee\xd8\xb1\x1e\x59\xb5\x05\x58\xec\x79\x6c\x0d\x66\xb7\ +\x83\x80\x36\x9b\x81\xe7\x56\xe0\xe5\xa2\x49\x93\x1e\x67\x8c\x1e\ +\xab\xde\x20\x02\x68\xf7\x06\x5e\xed\x11\xb0\x58\xf9\xdc\xf2\x28\ +\x69\x9a\xb9\x31\x01\xd0\xb9\x48\x32\x5f\xd2\x52\xc5\x01\xfc\x06\ +\xf5\x1d\xcd\x3c\xcb\xb0\x77\x30\xbb\x9d\x04\xb4\xf9\x44\x4a\xe7\ +\x72\x8e\x15\xa5\xa5\xf7\xda\x43\x0f\x4d\xe7\xad\xcd\xa7\x06\xc4\ +\xc6\x5d\x54\x9a\x6e\xac\x33\xd2\x55\x43\xb1\xe0\x23\x9b\xab\xea\ +\xa4\xab\xf3\xca\xf3\xca\x29\x8d\x2b\xf4\x89\x3a\x69\x5e\xf7\xaa\ +\xf6\x2e\xc5\x56\x63\xf6\x5d\x10\x90\x95\x62\x7f\xa6\xbd\xbf\xc4\ +\x1b\x1b\x39\x51\x2d\x2d\xeb\xf5\x53\x39\x20\x32\xb2\x58\x12\x98\ +\xa9\x97\xa8\xa3\x6b\x3c\x10\x10\x35\x29\x79\x5d\xa5\x92\xef\xae\ +\xda\x6c\xc7\x7e\xed\xfd\x3d\xf4\xbb\x24\xe0\x35\xba\x57\x18\xc2\ +\x7e\x0b\xd0\x6a\xde\xdc\x18\x2d\xca\x98\x89\xca\x78\x87\x1d\x8a\ +\x2c\xb2\x25\x0b\x6f\xd3\xc8\x33\x41\x25\x2b\xc9\xde\x42\xa2\x9e\ +\x35\x35\x48\x35\x29\x3e\x17\xb0\x7f\x60\x7f\xc3\x82\x98\x7d\x5f\ +\x04\x74\xcc\xe2\xfa\x5c\x8e\x3f\x27\x3f\xa6\x13\x81\x54\x3c\xac\ +\x77\x58\xf4\x9d\x19\x7d\x27\x80\xa8\x46\xe2\x88\xcc\x7a\xd4\x6d\ +\x43\x1a\x0f\x58\xf6\x3d\xec\x13\xee\x69\xf1\xf6\xf9\xbe\x09\xe8\ +\xba\x67\x3f\xc2\x1e\xe6\x5a\x15\xc7\x32\x8e\x45\x7a\x0d\x8c\xfc\ +\x23\x5f\x1f\x4b\x5c\xd5\x7b\x06\x8f\x35\x6a\x30\x8b\xfc\x43\x5f\ +\xaf\x07\xec\xdb\x12\xb8\xf3\x5f\x0d\xee\x10\xb8\x43\xe0\x07\xfe\ +\xf9\x0f\x4e\x33\x44\x96\xd0\x41\x78\x46\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\x4f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd7\x09\x08\x0c\x24\x01\x84\xbe\xe4\xfd\x00\x00\x00\x0f\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x69\x64\x20\x6c\x6f\x67\ +\x6f\x86\xc6\x77\xb9\x00\x00\x03\xc1\x49\x44\x41\x54\x38\xcb\xad\ +\x95\x4b\x68\x5c\x55\x18\xc7\x7f\xe7\xcc\xcd\x4c\x26\x89\xd5\x98\ +\x92\x96\x36\x4e\xd3\x18\xd1\xb6\x98\xfa\x98\x26\xa8\xf8\xc0\x42\ +\xa5\x49\x4b\x7d\x60\x75\xa3\x28\x2a\xa5\x10\x1f\x50\x95\x6e\x14\ +\xba\x91\x2e\x04\x17\x8a\xee\x7c\xe0\x83\x2a\x42\xab\xd0\x04\x52\ +\x92\x58\x8a\x8b\xf4\x11\xfb\x48\x66\x48\x86\x56\xdb\x8a\x64\xd3\ +\x36\x36\x93\xcc\xbd\x33\x77\xce\xdf\xc5\xcc\x24\x69\x1a\x5c\x68\ +\xff\xf0\x71\xee\xe2\xf0\x3f\xbf\xef\x3b\xdf\x77\x2e\x80\xfa\xfa\ +\x7b\x74\x23\x56\xe6\xab\xaf\xbf\x47\x37\x42\x65\xf3\x59\x19\x40\ +\x92\x18\x4d\x9f\x7e\x45\xc2\x97\x54\x90\x08\x24\x85\xc2\x15\x91\ +\x9c\x04\xc6\x60\x9d\xa3\x0a\xc9\x93\x51\x54\x52\x14\x88\x4b\x8a\ +\x6d\xb8\xaf\xe3\x63\x63\x4c\xc5\x0f\x00\xaf\xaf\xbf\x07\x4a\xee\ +\x01\x98\x40\x92\x2f\x91\x07\x15\x40\x61\xf0\xe7\x87\x5b\x9c\xff\ +\xfb\xb3\xb8\x20\x81\xad\xbd\x60\xe2\x77\xfe\xec\x2d\xdf\x31\x08\ +\x08\xc9\x48\x32\xe5\xcc\xd9\xb4\xb1\xf3\x7a\xe2\x33\xa3\x27\xb7\ +\x83\xc9\x39\xa7\x1c\x28\x90\x94\x0f\xce\xef\xd9\x12\x8f\x4e\xbc\ +\xd7\xbc\xfe\x25\x30\x11\x9c\x73\x9c\x3f\xf3\x3d\x33\xe1\xea\x8f\ +\xbc\xe5\x3b\x7e\x41\x8a\x3b\x29\xde\x91\x7c\xe0\x8b\x85\xc4\xb6\ +\x42\x0c\x26\x00\x05\x40\x20\xf0\x81\x5c\x71\x26\xf5\x5c\xcb\x3d\ +\x2f\xf0\x6b\xda\x27\x12\x0e\x11\x71\xc3\xac\x5a\xfb\x18\xca\xa5\ +\xb7\xc9\x29\x28\x65\x46\xa1\x42\x3c\x5f\xde\xa6\x8d\x9d\x48\x42\ +\x28\x3c\xf7\xf2\xab\x7d\x2e\xe7\xe3\xfc\x00\xe5\x03\x5c\xbe\xc0\ +\xc5\xe2\x1e\x7a\x5f\xdb\x45\xd3\x2d\xb5\xb4\x34\x66\x91\x35\x50\ +\x9c\x4e\x08\x42\x20\x94\x08\x81\x6b\xca\xb0\xb0\xc6\xa1\xc2\x22\ +\x0f\x25\x12\x98\x20\xc0\x06\x79\x4c\x21\xcf\x13\x4b\x37\x53\x18\ +\x8f\xf0\xc6\x27\x2b\x38\xf8\xc1\x34\x84\x79\x30\xf6\x0f\x4a\xc6\ +\x45\x49\x6e\xb1\x1a\xcf\x12\x1b\x21\x24\x70\x8e\x8b\x99\x0c\xe4\ +\x72\xa4\xee\x78\x90\xab\x26\x46\xc3\xd2\x95\x5c\xbe\xf4\x17\x83\ +\xa3\xb7\xd1\x14\x7c\x06\xd1\xc4\x3e\x24\x01\x32\xa6\x64\xbc\x90\ +\xd8\xce\x11\x97\x3a\xfc\xea\xe4\x64\xf9\x0e\x0c\x87\xe2\x09\x1a\ +\x9a\x56\x11\x4c\x4f\x51\xbf\x6c\x25\xdf\x1e\x48\x4d\x4f\xfb\xf5\ +\xef\x47\x56\xec\x3e\x50\xe2\x50\xd9\xff\xfa\x1a\xdb\xca\x49\x0e\ +\x45\x8c\xb1\xc8\x18\x96\x2c\x6d\x60\x6c\xfd\xe3\x9c\xae\x6f\x26\ +\xea\x19\xac\x42\x22\x11\xc3\xd9\xcb\xcd\xb1\x6f\x32\x6f\xe6\x05\ +\x11\x49\x16\x64\xe4\xb0\xff\x4a\x0c\x78\x78\x11\x46\xb2\x59\x4e\ +\x4d\x4d\x71\x30\xb6\x9c\x65\x89\x26\x94\x9f\x21\x56\x65\x71\xc1\ +\x0c\xb7\x36\x36\x7a\x63\x99\x8b\xef\x20\x3c\xc0\x13\x78\x47\x8f\ +\x9f\x48\x2c\x46\x3c\xdb\xc7\xbf\x9d\x3a\xf1\x24\xe0\x3b\xe7\x66\ +\x06\xcf\x5c\x59\x7d\xf0\xf0\xf8\xe7\xf1\x25\xf5\x91\xca\x9c\x1a\ +\x03\x9e\x35\xf8\x53\x57\xc2\xae\x47\x5a\xbb\xdb\x5b\xeb\x2e\x08\ +\xd5\xec\xec\xde\xf5\xe3\xfe\x1f\xf6\x71\x7b\x4b\xcb\xe2\x7d\x2c\ +\xb9\x98\x93\x62\x82\xea\x73\x13\xfe\xd3\xd1\x2a\x1b\xc9\x4f\x4f\ +\x12\x4c\x5d\x99\x8b\xec\x24\x9e\x67\xbd\xb3\x13\xfe\x56\x49\x31\ +\xa0\x0a\xe0\xa9\xed\xcf\xf3\xf5\x77\x5f\x2d\x4e\x7c\xe2\xe4\xb1\ +\x17\x4b\x23\xed\x7c\xa4\x40\xa8\xd4\xa3\xc2\x49\x32\x42\x16\xc9\ +\x93\xa8\x12\x8a\x22\x55\x03\xd5\x3b\x5f\x7f\xfb\xcb\xa1\x23\x87\ +\xe9\x78\xf8\x51\x9c\x73\xeb\x46\x86\x8f\x8f\x01\xc5\xf9\x93\x17\ +\x2b\x6f\x8e\x03\x35\x88\x1a\x50\xad\x50\x9d\xa4\x1a\xa0\x12\x71\ +\x20\x2e\xa8\xa6\x14\xa4\xd3\x69\x86\x8e\x1c\xc6\x5a\x3b\xda\xba\ +\x66\xed\xbd\x15\xea\xff\xf5\x5c\xb6\x25\xdb\x25\x49\xe3\xe3\x63\ +\xca\x66\xb3\x6a\x4b\xb6\xab\x2d\xd9\xbe\xc6\xf6\xf5\xf7\x60\x8c\ +\xe1\xd0\x40\xef\x7f\x5a\x2b\xaa\xab\xbb\x89\x4c\x66\x8c\xde\x9f\ +\xf6\x03\xa4\x0c\x50\x0f\xdc\x5c\x8e\x5a\xe6\x52\x8c\x02\x16\x70\ +\xb3\x13\x33\xa7\x22\x10\x00\xf9\xb6\x64\x7b\xff\xa9\x63\x43\x00\ +\x0c\x0c\x0c\xf0\xd6\xbb\xbb\x33\xc6\x98\x6d\x1e\x70\x15\xc8\x01\ +\x97\x00\xaf\x7c\xd3\xd1\xf2\xb7\x2d\xff\x72\xae\xfd\xed\x94\x0e\ +\x2b\x56\x5e\xb6\xf5\x1b\x3a\x78\x66\x6b\x17\xdd\xdd\xdd\x7f\xdf\ +\x7f\xf7\xba\xf4\xf0\x48\x6a\xaf\x57\xde\x50\xa4\xf4\x54\x32\x8f\ +\xce\x56\xee\xa0\xd2\x3d\x0b\x8c\x2b\xd9\x70\xfa\xf8\x51\x0b\x1c\ +\x48\x26\x93\x5b\x3a\x3b\x3b\xef\x1a\x1e\x49\x35\x18\x6e\x90\xda\ +\x92\xed\x5d\xc0\xa7\x65\xc0\xbd\xff\x00\x7c\x02\xcd\x92\x88\x3c\ +\x0a\x8c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\x12\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xe2\x03\x02\x04\x32\x2f\x3b\x59\x63\x86\x00\x00\x00\x19\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ +\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\ +\x00\x02\x7a\x49\x44\x41\x54\x68\xde\xed\xd8\x4b\xa8\x8d\x6b\x1c\ +\xc7\xf1\xcf\xc6\xce\xe6\xd8\x25\xb9\x0d\x44\x88\x72\xa2\x30\xc1\ +\x84\x5c\x42\x71\x9c\x11\x29\x45\x06\x88\x94\x5c\x06\xe4\x32\x31\ +\x33\x32\xa0\x64\xe2\x96\x08\x21\x85\x93\xd2\x49\x92\x94\x5b\x29\ +\xb9\x76\x8a\x48\x31\x71\x89\xe3\xb2\x2d\x93\x47\xbd\xad\xde\x77\ +\xaf\xb5\x77\x6b\x6f\x7b\x6f\xff\x6f\xad\xc9\xfb\xfe\xff\xbf\xe7\ +\xf9\x3d\x97\xff\xf3\xac\x97\x20\x08\x82\x20\x08\x82\x20\x08\x82\ +\x20\x08\x82\xa0\x6d\x18\x8b\x26\x94\xb0\xfc\x77\x30\xfc\x4f\x32\ +\x7b\x17\xdd\xbb\xba\xd9\x39\xc9\x6c\x09\xb3\xba\xba\xd9\xee\xb8\ +\x97\xcc\x9e\xef\xcc\x46\x86\x60\x0b\xea\x2a\xc4\xad\x48\x66\x9b\ +\xf0\x67\xe6\xf9\x06\x8c\xec\xe8\x26\xbb\x61\x36\x4e\xe3\x1b\xee\ +\x54\x88\x6f\xc4\xab\x64\x78\x5f\x99\xce\x87\xa4\x71\x18\x63\x3a\ +\x9a\xd1\xfe\xd8\x84\x27\x99\xbd\x58\xc2\xa1\x0a\x79\x3b\x53\xdc\ +\x7b\x0c\xca\x3c\x1f\x55\xa6\xf3\x1d\x27\x30\xfe\x57\x9a\xac\xc3\ +\x94\x34\x03\xff\x97\x75\xb0\x84\xd7\xf8\xbb\xc2\x92\xff\x98\x62\ +\xb7\x96\xbd\x1b\x8a\x2b\x39\x9a\x25\x9c\xc3\xa4\xf6\x34\xda\x88\ +\x55\xe9\xf8\xc8\xeb\xd0\x4d\x2c\x43\x43\x05\x9d\x43\x29\xfe\x39\ +\x7a\x17\x0c\xe8\x4c\x5c\x2b\x68\xe7\x12\xa6\xb6\xa5\xd1\x71\xd8\ +\x8b\x77\x39\x8d\x7f\xc1\x51\x4c\xae\xa2\x48\xc1\xc4\xb4\x4c\x4b\ +\x58\x5a\xc5\x4a\x9a\x83\x1b\x05\xc6\xaf\xa6\xba\x51\x57\x4b\xb3\ +\x97\x0a\x1a\x7b\x89\x1d\x18\xdc\xc2\xad\xf0\x6f\xca\xbf\x9d\x0a\ +\x54\xb5\x79\xf3\x70\xab\xa0\x2f\x67\x6a\x65\x76\x40\x8e\xf8\x63\ +\x2c\x46\x7d\x2b\xf4\x16\x64\x74\xa6\xb7\xb2\x76\xac\xcb\xe9\xd3\ +\xa9\x5a\x19\x9e\x95\x23\xfe\x1d\xc7\x5a\x71\x5c\xd4\xe3\x41\xa6\ +\xf8\xb4\xd4\xe8\x4c\x9c\xcd\xdc\xb9\xb3\xbf\xed\xb5\x32\xfc\x07\ +\x36\xa6\xe5\x5b\xde\x48\x13\x8e\xa4\x63\xa4\x1a\xd6\xa6\xbc\x6f\ +\x2d\x18\xac\x46\xac\xc1\xfd\x82\xa5\x7c\x1b\x2b\xd1\xa7\xd6\x45\ +\xab\x01\xab\xf1\x5f\x81\xf1\x03\x18\xd1\x4c\x7e\x5f\xbc\x49\xf1\ +\x7b\xab\x68\x6f\x34\x76\xe3\x6d\x4e\x7b\x9f\x70\x30\x1d\x4f\x75\ +\xda\x98\xfa\x74\xec\x3c\xc8\xe9\xc8\x57\xec\xc7\xb0\x9c\xbc\x5d\ +\x29\xe6\x1d\x06\x36\xa3\x3f\x17\x17\x0b\x66\xf3\x21\xd6\xa3\xdf\ +\xaf\xba\xf4\x2f\x2a\x38\x8f\xaf\x96\xc5\x0e\xc7\xe7\xf4\x6e\x73\ +\x33\x9a\x3d\xd3\xa0\x95\x0f\xe2\x49\xcc\x68\x8f\xd9\xac\xb6\x98\ +\xcc\xc7\xf5\x4c\x27\xf7\x94\xc5\x1c\x4f\xcf\x9f\xa1\x57\x33\x5a\ +\x13\x32\x1a\xcf\xb0\xad\x85\x47\x5e\xbb\x1b\x9f\x81\xcb\xe9\x1f\ +\xd0\x4f\x26\x67\x4c\x2c\xa9\xa0\xb1\x14\x17\xf0\x57\x67\xfb\x08\ +\xd0\x23\x33\x08\xd7\x32\x57\xce\x6e\x55\xe6\x75\x5a\x16\x66\x66\ +\x77\x5a\x57\xff\x92\xd1\x13\x4f\x6b\x7d\xed\xeb\xc8\x6c\xcc\x54\ +\xd9\xd1\x1d\x71\xbf\xd5\x9a\x17\xe9\xa2\xf2\x02\x8f\x04\x41\x10\ +\x04\x41\x10\x04\x41\x10\x04\x41\x10\x04\x6d\xc8\x0f\xf0\x6b\xdf\ +\x7c\xd8\x29\x0f\xa9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x1e\xc4\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xca\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xa9\xad\x7e\xa3\ +\x00\x00\x1e\x8b\x49\x44\x41\x54\x78\x5e\xed\x5d\x09\x98\x24\x45\ +\x95\x7e\x2f\xbb\xe7\x00\x04\x39\x46\xf0\xc0\x15\xd6\x71\xec\xae\ +\x78\x59\xc3\xd8\xa2\xce\x02\xae\x80\x8a\x22\x2a\x2a\x88\xe2\x2a\ +\x20\xae\xb8\x82\x3a\xb2\x1c\xab\xc0\x2a\x82\x17\x28\x78\xc1\xee\ +\xb2\x2b\x03\xa2\x78\x20\xa8\xdc\x28\x2a\x2e\x22\x2a\x0c\x34\x95\ +\x2f\xaa\x67\x70\x64\xd9\x15\x16\xd0\x05\xc1\xf1\x98\x69\xbb\xf2\ +\xed\x17\x6d\xf5\x7c\x3d\xd3\x47\x65\x64\x66\x64\x66\x55\x45\x7c\ +\x5f\x7f\xa3\xf4\x7b\xff\x7b\xf1\xbf\xfa\xbb\xf2\x88\x78\x81\x50\ +\xd1\x51\xaf\xd7\x77\x17\x91\x95\x71\x1c\xbf\x14\x11\x9f\x07\x00\ +\xbb\xb5\x7f\x7e\x05\x00\x0d\x44\xfc\x85\x88\xdc\xc0\xcc\xb7\x54\ +\x74\x0a\x3e\xad\x59\x18\xd8\xaa\xae\x2b\x44\xe4\x29\x88\x68\x7e\ +\x9e\x10\x91\x35\x88\x38\x26\x22\x37\x33\xf3\xf7\xaa\x44\x20\x56\ +\x29\x19\x93\xcb\xb2\x65\xcb\x96\x2c\x5a\xb4\xe8\x64\x11\x39\x25\ +\x61\x6e\x46\x28\x97\x31\xf3\xc5\x09\xed\xbd\x59\x09\x0c\xd8\xd6\ +\x55\x44\xee\x46\xc4\xef\x30\xf3\x99\x25\xa4\x3b\x23\x64\xa5\x84\ +\xa2\x94\x7a\x33\x22\x7e\x08\x00\x9e\x6b\x4b\x8e\x88\x7c\x07\x00\ +\xce\xd5\x5a\xdf\x66\xeb\xeb\xed\xdd\x32\x10\x86\xe1\xe1\x22\x72\ +\x56\x9a\xba\x02\x80\xf9\x43\x78\x66\xd9\x57\x0e\x95\x11\x0a\x11\ +\xbd\x07\x00\x3e\x97\xb5\x64\x88\xf8\xc6\x28\x8a\xae\xc8\x8a\xe3\ +\xfd\xf3\x61\xa0\x2d\x92\x6f\xe4\x80\x76\x10\x33\x7f\x37\x07\x9c\ +\x54\x10\x95\x10\x0a\x11\x99\x6f\x91\x0f\xa7\x9a\xc1\x2c\x4e\x5e\ +\x2c\x79\x31\x99\x0d\x87\x88\x5e\x0f\x00\x57\x66\x43\xd9\xec\xfd\ +\x88\x88\xbc\x5a\x6b\x7d\x47\x4e\x78\x56\x30\xa5\x0b\x85\x88\x5e\ +\x02\x00\x3f\xb4\xca\xba\xb3\xf1\xff\x05\x41\xb0\x6f\xa3\xd1\x58\ +\xd7\xd9\xd4\x5b\xb8\x60\x80\x88\x86\x01\xe0\x06\x00\x78\x56\x8e\ +\xf8\xa3\x83\x83\x83\xfb\x8f\x8e\x8e\x3e\x9e\x23\x66\x22\xa8\x2a\ +\x08\xc5\x88\xc4\x88\x25\xef\x71\x31\x33\x1f\x9b\x37\xa8\xc7\x4b\ +\xc6\x00\x11\xdd\x08\x00\x07\x25\xb3\x4e\x6e\x85\x88\x9f\x89\xa2\ +\xe8\xfd\xc9\x3d\xf2\xb1\x2c\x55\x28\x61\x18\xbe\x53\x44\xfe\x2d\ +\x9f\xa9\xcc\x44\x41\xc4\x57\x45\x51\x74\xbd\x2b\x7c\x8f\x3b\x3b\ +\x03\x39\xde\x97\xcc\x1a\x00\x11\x0f\x8e\xa2\xc8\x7c\x5b\x15\x36\ +\x4a\x15\x0a\x11\xdd\x09\x00\x23\xae\x66\x2b\x22\x97\x68\xad\x8f\ +\x71\x85\xef\x71\x67\x67\x80\x88\xcc\xcd\xfb\xe1\x0e\xf9\xf9\x3c\ +\x33\xbf\xd7\x21\xfe\x0c\xe8\x52\x84\x52\xaf\xd7\xf7\x8c\xe3\xf8\ +\x90\x3c\x9e\x72\x75\x20\xeb\x0f\xcc\xfc\xa4\x22\x09\xed\xf7\x58\ +\x44\xf4\x4c\x00\xf8\x1f\xc7\x3c\xac\x1f\x18\x18\x78\xc9\x3d\xf7\ +\xdc\xf3\xa0\xe3\x38\x9b\xe1\x0b\x13\x4a\xad\x56\x7b\x6a\x10\x04\ +\xaf\x02\x00\x23\x10\xf3\xef\x82\x82\x26\x59\xea\x63\xc5\x82\xe6\ +\x58\x99\x30\x4a\xa9\x37\x21\xe2\x57\x0b\x48\xe8\x62\x11\xf9\x7e\ +\x10\x04\x37\x44\x51\xf4\x5b\xd7\xf1\x9c\x0a\x65\xe9\xd2\xa5\x3b\ +\x2c\x5a\xb4\xe8\x10\x23\x10\x11\x31\x02\xd9\xc1\xf5\x84\x66\xc1\ +\x7f\x1b\x33\x5f\x56\x42\xdc\xbe\x0c\xa9\x94\xfa\x3c\x22\x9e\x50\ +\xe0\xe4\x1b\x6d\xc1\x5c\x1f\x45\xd1\xcd\xae\xe2\xe6\x2e\x94\x91\ +\x91\x91\x05\xe3\xe3\xe3\x53\xc2\x30\xdf\x1c\x4f\x75\x95\x7c\x42\ +\xdc\x93\x99\xf9\x53\x09\x6d\xbd\x59\x46\x06\x88\xe8\x26\x00\x78\ +\x79\x46\x98\x54\xee\x22\x72\x2b\x00\x5c\x0b\x00\x57\x69\xad\xd7\ +\xa7\x02\x99\xc3\x29\x37\xa1\x84\x61\x38\x22\x22\x47\xb5\x2f\xad\ +\xf6\xcc\x33\xc9\x8c\x58\xa7\x30\xf3\xb9\x19\x31\xbc\x7b\x42\x06\ +\x88\xe8\x4b\x00\xf0\xd6\x84\xe6\xae\xcc\xfe\x04\x00\x57\x9b\x4b\ +\xc0\x28\x8a\xcc\xd2\xa6\xcc\x23\xb3\x50\x8c\x40\xe2\x38\x7e\x27\ +\x22\xbe\x33\x73\x36\x0e\x00\xe2\x38\x3e\xa6\xd9\x6c\x5e\xe2\x00\ +\xda\x43\xce\xc2\x00\x11\x99\x3f\x4a\x27\x55\x88\x1c\xf3\x9e\x6e\ +\x75\xd6\xcb\xef\xd4\x42\x19\x1a\x1a\xda\x63\x60\x60\xe0\x03\x55\ +\x15\xc8\x54\xa1\xfc\xbb\x94\x62\x3f\xb2\xae\xdf\x8d\x65\x98\xcd\ +\x9d\x22\x72\xba\xd6\xda\x5c\x1a\x5a\x8f\x54\x42\xa9\xd5\x6a\x47\ +\x9b\x55\xbe\x88\xb8\x87\x75\xc4\x82\x1d\x82\x20\x78\x66\xa3\xd1\ +\x78\xa0\xe0\xb0\x7d\x1b\x4e\x29\xb5\x0f\x22\xfe\xb8\xc2\x04\x7c\ +\x90\x99\x3f\x6e\x9b\x9f\x95\x50\xda\xdf\x22\x46\x20\x47\xdb\x06\ +\x2a\xc9\x7e\x0d\x33\x3f\xbf\xa4\xd8\x7d\x19\xd6\xec\x3b\x59\xb8\ +\x70\xe1\x6f\xaa\x3c\x79\x44\xfc\x26\x00\x9c\x1a\x45\xd1\x7d\x49\ +\xf3\x4c\x2c\x14\xb3\x78\xd1\x2c\x37\x41\xc4\x65\x49\xc1\xcb\xb6\ +\x13\x91\xf3\xb5\xd6\x27\x96\x9d\x47\xbf\xc5\x0f\xc3\xf0\x93\x16\ +\x1b\xef\x4a\xa1\x47\x44\xee\x45\xc4\xe3\x92\xee\x73\x49\x24\x94\ +\xf6\x0a\xdf\xeb\x00\x60\xdb\x52\x66\x95\x22\xa8\x88\xdc\xdf\x6a\ +\xb5\xf6\x5f\xbb\x76\xed\xfd\x29\xdc\xbd\x4b\x06\x06\xda\xdf\x2a\ +\xe6\xf2\xcb\x7a\x03\x5e\x86\xb0\x69\x5c\xff\x68\x5e\x7e\x27\x11\ +\x4b\x47\xa1\x38\x5a\x06\x9f\x66\x52\x56\x3e\xfe\x69\x97\x15\x5d\ +\xb9\x1b\x9b\xfb\xd8\x20\x08\x56\xe7\x0e\xec\x06\x70\xff\x4e\x62\ +\x99\x57\x28\xed\x35\x59\x89\xaf\xe3\xdc\xcc\x21\x15\xea\xa7\x98\ +\xf9\xe4\x54\x9e\xde\x29\x37\x06\x94\x52\xab\xbb\xe5\x7e\x56\x44\ +\x76\xd1\x5a\x3f\x36\xd7\xe4\xe7\x14\x4a\xfb\xeb\xd3\x5c\xb6\x6c\ +\x97\x1b\x73\xb3\x03\x99\x4b\xba\xcb\x44\xe4\x23\x79\xdc\xff\xf8\ +\x15\xc3\x8e\xab\x65\x09\x4f\x44\x57\x03\xc0\xab\x2d\xdd\xca\x30\ +\x9f\xf7\xc1\xcf\xac\x42\x59\xba\x74\xe9\xa2\xc5\x8b\x17\x5f\x05\ +\x00\x07\x3b\xca\xf8\x2e\x11\xb9\x2c\x8e\xe3\xaf\x8f\x8d\x8d\x3d\ +\x34\x15\x23\xeb\xf2\xec\xb2\x36\xf5\x38\xe2\xa8\x67\x60\xc3\x30\ +\x3c\x4e\x44\xfe\x35\xc3\x84\x4e\x0a\x82\xe0\xb2\x56\xab\x75\x24\ +\x22\x1e\x09\x00\x7b\x67\xc0\x9a\xcf\xf5\xc3\x73\x75\x7d\x99\x55\ +\x28\x44\xf4\x45\x00\x78\x7b\xce\xc9\x18\x41\x5c\x6e\xd6\xe1\x30\ +\xf3\x4f\xe6\xc2\x36\xfb\xe7\xcd\x4b\x4c\x11\x79\xba\x45\xfc\x3b\ +\x11\xf1\xa3\x51\x14\x7d\xdb\xc2\xc7\x9b\x16\xc8\x00\x11\x99\x45\ +\xb1\x66\xf5\x86\xcd\xb7\xcb\x35\x00\xf0\x89\xad\x3f\x2f\x4a\xa9\ +\xe5\x88\x78\xa8\x88\x18\xe1\xe4\xfa\x14\x16\x11\xff\x2e\x8a\xa2\ +\xaf\x6c\x4d\xcd\x0c\xa1\xd4\xeb\xf5\xd7\xc4\x71\x9c\xcb\xfa\x98\ +\x76\xb0\xab\x10\xf1\xca\x0d\x1b\x36\x5c\x75\xff\xfd\xf7\x6f\x4c\ +\x52\x9b\xe1\xe1\xe1\xa7\x0d\x0c\x0c\x18\xb1\x1c\x88\x88\xfb\xcd\ +\xe3\x73\x93\x88\x7c\x49\x6b\x6d\x04\xe8\x47\x17\x30\xd0\x16\x8c\ +\xd9\xd4\x75\x00\x00\xec\x3e\x4b\xca\x66\x8f\xc9\x5d\x00\x70\x11\ +\x33\x9b\x05\x8e\xf3\x8e\x30\x0c\xcd\x55\xcf\xa1\x71\x1c\xbf\x0e\ +\x11\x97\x74\xb2\x4f\xf0\x7b\x8e\xe3\x78\x65\xb3\xd9\xfc\xfd\x74\ +\xdb\x19\x42\x21\x22\xf3\x58\x6f\x9f\x04\x80\xf3\x9a\x20\xe2\xa5\ +\x71\x1c\x5f\x90\xb5\x6b\xc6\x5e\x7b\xed\xb5\xe3\xc4\xc4\xc4\xde\ +\xa6\x9b\x60\x1c\xc7\xbb\x22\xe2\x02\x44\xd4\x7f\xfe\xf3\x9f\x9b\ +\xfe\xd1\x6f\xd6\x2a\x95\xeb\x5f\xab\xd5\xf6\x0a\x82\x60\xc7\xa9\ +\x2c\xe2\x38\x5e\xdb\x6c\x36\x1f\x4e\x93\x95\xe9\x40\x19\xc7\xf1\ +\x2a\x00\x30\x3f\x03\x69\x30\xa6\x7c\x44\xe4\x0c\xad\xf5\xd9\x73\ +\x0a\x45\x29\x75\x0a\x22\x7e\x32\x4b\x10\xd3\x9e\x46\x44\x8c\x40\ +\xf2\xee\xac\x92\x31\x2d\xef\xde\x0f\x0c\x28\xa5\xcc\xfd\xcb\xaa\ +\xf6\xbd\x4c\xda\x29\x3f\xda\x6a\xb5\x56\x8e\x8d\x8d\xfd\x62\x0a\ +\x60\xf3\x37\x4a\xad\x56\x7b\x52\x10\x04\x9c\xb1\xbd\xcc\x11\xcc\ +\x9c\x47\xb3\xb3\xb4\x13\xf4\x7e\x9e\x81\x49\x06\x88\xe8\x08\x00\ +\xf8\x5a\x06\x3a\x2e\x64\xe6\xe3\x67\x08\x85\x88\x4c\x6b\x9f\xff\ +\xc8\x00\x7c\xac\xef\xff\x9b\x81\x3d\xef\x9a\x3b\x03\x61\x18\x9e\ +\x20\x22\x9f\x4f\x09\xfc\xfb\x38\x8e\x55\xb3\xd9\x9c\xdc\xff\xbf\ +\xf9\x1b\x85\x88\x4c\xf7\xf0\x97\xa6\x04\x5d\xc5\xcc\x9f\x4d\xe9\ +\xeb\xdd\x3c\x03\xce\x18\x50\x4a\x99\xf7\x73\x67\xa4\x09\x20\x22\ +\x27\x6a\xad\xcf\xdf\x2c\x94\x30\x0c\x5f\x2c\x22\x3f\x4a\x09\x36\ +\xe3\xc6\x27\x0d\x8e\xf7\xf1\x0c\xb8\x62\x20\x0c\xc3\x8b\x44\xe4\ +\xef\x53\xe0\xdf\xc6\xcc\xfb\x6e\x16\x8a\x52\xea\x3c\x44\x4c\xd3\ +\x7d\xef\xa7\xcc\xbc\x32\x45\x02\xde\xc5\x33\x50\x28\x03\x61\x18\ +\x9a\x97\xdc\x2b\x6c\x83\x8a\xc8\x01\xe6\xc1\xd4\xe4\xa5\x17\x11\ +\x99\x17\x80\x69\x3e\xf0\x6f\x65\xe6\x2f\xdb\x06\xf7\xf6\x9e\x81\ +\xa2\x19\xc8\x70\xbf\xf2\x59\x66\x5e\x85\xa6\xa5\xd0\xe2\xc5\x8b\ +\x9f\x48\x91\xb8\x39\x15\xe9\x65\x29\xfc\xbc\x8b\x67\xa0\x70\x06\ +\xea\xf5\xfa\x76\xad\x56\xeb\xae\x14\x6f\xf2\x1b\xcc\xbc\x1c\x95\ +\x52\x07\x21\xa2\x69\xa8\x6c\x35\x10\xf1\x75\x7e\xc9\x88\x15\x65\ +\xde\xb8\x64\x06\xc2\x30\x3c\x55\x44\x3e\x61\x9b\x06\x22\x0e\x63\ +\xca\xb3\x49\x7e\xc9\xcc\x4b\x6d\x03\x7a\x7b\xcf\x40\x99\x0c\xd4\ +\xeb\xf5\x5d\xe3\x38\x36\xcb\x63\x9e\x61\x93\x87\x88\x9c\x60\x84\ +\x92\x66\x01\xe4\xb7\x98\xd9\x1c\x12\xe3\x87\x67\xa0\xab\x18\x50\ +\x4a\x5d\x81\x88\x87\x59\x26\xfd\x2d\x23\x94\x34\xef\x4f\xe6\x5c\ +\x8e\x6c\x99\x80\x37\xf7\x0c\x14\xca\x00\x11\x9d\x03\x00\xb6\x9b\ +\xfa\xee\x30\xf7\x28\xeb\x6c\x6f\x70\x44\xe4\x15\x69\xfb\x23\x15\ +\xca\x8a\x0f\xe6\x19\xd8\x8a\x01\x22\xfa\x07\x00\xb8\xd0\x92\x98\ +\x75\xe6\x1b\xc5\xb4\x9f\x5c\x6c\xe3\xb8\x71\xe3\xc6\x27\xaf\x5f\ +\xbf\xfe\x77\x36\x3e\xde\xd6\x33\x50\x05\x06\xea\xf5\xfa\x81\x71\ +\x1c\xdb\x36\xf3\x7e\xc8\x08\x45\x6c\x27\xc0\xcc\x1d\x9b\x52\xd8\ +\x62\xf6\xba\x3d\x11\x99\x63\xa0\xcd\xf2\x6f\xf3\x33\x38\xf5\x2f\ +\x22\x0e\x88\xc8\xd4\xff\x9f\xfc\xdd\x56\xff\x6d\xf2\x77\x5b\xfd\ +\xb7\xd3\xd3\x34\x71\xeb\x75\x8e\x93\xcc\x2f\xe5\xf9\x2d\x7f\xf0\ +\x42\x49\xc2\x6e\x46\x9b\x94\x7f\xc5\xe6\x8b\xba\x81\x99\xcb\x38\ +\x42\x23\x23\x13\xd5\x70\x4f\xf3\xe5\xe0\x85\x52\x40\xed\x5c\x1c\ +\xfc\x29\x22\x47\x6b\xad\x2f\x2d\x20\xfd\x9e\x0b\xe1\x85\x52\xc1\ +\x92\xb6\xb7\x35\xff\xaf\x83\xd4\xd6\x31\xf3\x90\x03\xdc\x9e\x87\ +\xf4\x42\xa9\x60\x89\x33\x2c\x38\xed\x38\x1b\x44\x7c\x99\xcb\x53\ +\xa6\x3a\x26\xd0\xa5\x06\x5e\x28\x15\x2c\x5c\x9a\xa2\x24\x9d\x06\ +\x22\xfe\x20\x8a\xa2\x03\x93\xda\x7b\xbb\xbf\x30\x90\xa6\x26\xfe\ +\x1e\xc5\xe1\xa7\x47\x29\xf5\x0e\x44\xfc\x77\x87\x21\x40\x44\x94\ +\xd6\xba\xe9\x32\x46\xaf\x61\x7b\xa1\x54\xac\xa2\x69\x5e\xe6\xa6\ +\x98\xc2\x97\x99\xb9\xec\xa3\xe0\x52\xa4\x5d\x9e\x8b\x17\x4a\x79\ +\xdc\xcf\x88\x4c\x44\x7f\x03\x00\xb7\x15\x91\xd2\xe0\xe0\xe0\x4e\ +\xa3\xa3\xa3\x8f\x17\x11\xab\x17\x62\x78\xa1\x54\xa8\x8a\x44\xf4\ +\x2d\xd3\x98\xad\x88\x94\x10\xf1\x9c\x28\x8a\x4e\x2d\x22\x56\x2f\ +\xc4\xf0\x42\xa9\x48\x15\xdb\x4d\xfb\x7e\x5b\x64\x3a\x7e\xb5\x44\ +\x72\xb6\xbd\x50\x92\x73\xe5\xd4\x92\x88\x3e\x0a\x00\x1f\x74\x1a\ +\x64\x26\xf8\xfb\x98\xf9\x73\x05\xc7\xec\xca\x70\x5e\x28\x15\x29\ +\x5b\x9a\x85\xa6\x39\xa4\xfe\x30\x33\x3f\x2d\x07\x9c\x9e\x87\xf0\ +\x42\xa9\x40\x89\xc3\x30\x7c\x8b\x88\x94\xd2\x70\x23\x08\x82\xc3\ +\x1b\x8d\x86\x39\xc8\xd3\x8f\x79\x18\xf0\x42\xa9\xc0\xc7\x83\x88\ +\x46\x01\x60\x79\x49\xa9\xdc\xc5\xcc\x23\x25\xc5\xee\x9a\xb0\x5e\ +\x28\x25\x97\xaa\x56\xab\xad\x08\x82\xc0\xec\xc9\x2e\x73\xec\x33\ +\xdf\xf9\x33\x65\x26\x56\x95\xd8\x5e\x28\x25\x57\x22\x0c\xc3\xcb\ +\x45\xe4\xcd\x25\xa7\x71\x2d\x33\xdb\x1c\xd6\x53\x72\xba\xc5\x87\ +\xf7\x42\x29\x9e\xf3\xcd\x11\xdb\xc7\xf9\x25\x3a\x28\xc9\x75\x9a\ +\x83\x83\x83\x7b\x8e\x8e\x8e\xfa\x63\xc3\xe7\x20\xda\x0b\xc5\xf5\ +\x27\x70\x1e\x7c\xa5\xd4\xe9\x88\x78\x56\x89\x29\x4c\x0f\xfd\x6f\ +\xcc\xfc\xae\x8a\xe4\x52\xb9\x34\xbc\x50\x4a\x2c\x09\x11\x3d\x0a\ +\x00\x3b\x97\x98\xc2\x16\xa1\x1f\x7f\xfc\xf1\x6d\x1f\x78\xe0\x01\ +\xd3\x0f\xc1\x8f\xad\x18\xf0\x42\x29\xe9\x23\x41\x44\xa6\xc7\xd9\ +\x95\x25\x85\x9f\x35\x2c\x22\x7e\x28\x8a\xa2\x8f\x54\x29\xa7\xaa\ +\xe4\xe2\x85\x52\x52\x25\x88\xe8\x76\x00\x78\x51\x49\xe1\xe7\x0a\ +\xbb\x91\x99\xb7\xa9\x58\x4e\x95\x48\xc7\x0b\xa5\x84\x32\x84\x61\ +\x38\x24\x22\x63\x25\x84\xee\x18\xd2\x9c\x09\xa2\xb5\xce\x72\x8a\ +\x5a\xc7\x18\xdd\x68\xe0\x85\x52\x42\xd5\x52\xb6\xa4\x2d\x2a\xd3\ +\xfb\x98\xf9\xd9\x45\x05\xeb\x96\x38\x5e\x28\x25\x54\x2a\x0d\xe9\ +\x45\xa6\x89\x88\xaf\x8a\xa2\xe8\xfa\x22\x63\x56\x3d\x56\x9a\x9a\ +\xf9\xad\xc0\x19\xaa\x4a\x44\xff\x08\x00\x9f\xca\x00\xe1\xdc\x15\ +\x11\x6f\x8d\xa2\xe8\xc5\xce\x03\x75\x51\x00\x2f\x94\x82\x8b\x45\ +\x44\xbf\x02\x80\xdd\x0b\x0e\x6b\x1d\x2e\x8e\xe3\x15\xcd\x66\xd3\ +\xac\x41\xf3\xc3\x37\x97\x28\xf6\x33\x10\x86\xe1\x2b\x45\xa4\x5b\ +\x2e\x69\xbe\xce\xcc\x6f\x2a\x96\xa1\xea\x46\xf3\xdf\x28\x05\xd6\ +\x86\x88\x7e\x00\x00\xfb\x17\x18\x32\x53\xa8\x56\xab\xf5\xf4\xb1\ +\xb1\xb1\x87\x32\x81\xf4\x88\xb3\x17\x4a\x41\x85\x1c\x1e\x1e\x7e\ +\xd6\xc0\xc0\x40\x57\xad\xa5\x12\x91\xf3\xb5\xd6\x27\x16\x44\x51\ +\xa5\xc3\x78\xa1\x14\x54\x9e\x30\x0c\xbf\x20\x22\xc7\x17\x14\x2e\ +\xb7\x30\xcc\x6c\xba\xe5\xc7\xb9\x01\x76\x29\x90\x17\x4a\x41\x85\ +\x23\x22\xf3\x61\xcb\xfd\xe8\x0b\x44\xfc\x66\x1c\xc7\xe3\x88\x78\ +\xa4\xa3\xa9\x9c\xcc\xcc\x95\x7e\x4a\xe7\x68\xde\x5b\xc0\x7a\xa1\ +\x14\xc0\xb2\x52\xea\xdd\x88\x78\x81\xa3\x50\x2f\x47\xc4\x71\x11\ +\x31\x67\xa9\xb8\x18\x8f\x31\xf3\x2e\x2e\x80\xbb\x09\xd3\x0b\xa5\ +\x80\x6a\x11\xd1\xbd\x00\xf0\x1c\x07\xa1\x46\x99\x79\x85\xc1\x55\ +\x4a\xdd\x8c\x88\x4e\x7a\x0a\x8b\xc8\x91\x5a\xeb\xaf\x3a\xc8\xbf\ +\x6b\x20\xbd\x50\x1c\x97\x8a\x88\x5e\x02\x00\x3f\x74\x14\xe6\xdd\ +\xcc\xfc\x2f\x06\x9b\x88\xde\x08\x00\x5f\x77\x14\x27\x62\xe6\xba\ +\x23\xec\xae\x80\xf5\x42\x71\x5c\x26\x22\xba\x0e\x00\x0e\x76\x10\ +\xe6\xf7\xcc\xbc\x23\x00\xb4\xa6\xb0\x89\x28\x32\x9a\x71\x10\xcb\ +\x34\xf6\x3e\x40\x6b\xed\x4a\xf0\x2e\x52\xce\x15\xd3\x0b\x25\x57\ +\x3a\xb7\x04\xab\xd7\xeb\xbb\xc6\x71\xfc\x88\x8b\x10\x22\x72\x9e\ +\xd6\xda\x2c\x87\xd9\x3c\x88\xe8\x3d\x00\xe0\xaa\xa1\xdd\x4d\xcc\ +\xfc\x0a\x17\x73\xe9\x06\x4c\x2f\x14\x87\x55\x22\xa2\x73\x01\xe0\ +\x24\x17\x21\x82\x20\x18\x6a\x34\x1a\xeb\xa6\x63\x8f\x8c\x8c\x2c\ +\xd8\xb4\x69\xd3\x83\x00\xf0\x14\x17\x31\x01\xa0\xc6\xcc\x95\xdc\ +\x1e\xe0\x68\xbe\xd3\xff\x08\x59\x1f\xf0\xeb\x17\x45\x26\xac\x0a\ +\x11\xfd\x1e\x00\xb6\x4b\x68\x9e\xd8\x0c\x11\xaf\x8e\xa2\xe8\xb5\ +\xb3\x39\x10\xd1\xd9\x00\x70\x5a\x62\x30\x3b\xc3\xd5\xcc\xfc\x76\ +\x3b\x97\xde\xb0\xf6\xdf\x28\x8e\xea\x18\x86\xe1\x31\x22\x72\xb1\ +\x23\xf8\x43\x98\xd9\xdc\xfb\xcc\x18\x29\x8f\x7a\x4e\x9c\xa6\x88\ +\xec\xa2\xb5\x7e\x2c\xb1\x43\x8f\x18\x7a\xa1\x38\x2a\xa4\xc3\xee\ +\x8f\x4d\x66\x56\xf3\xa5\x4d\x44\xe6\xc4\xae\x77\xb8\x98\x1a\x22\ +\x9e\x1d\x45\xd1\x19\x2e\xb0\xab\x8c\xe9\x85\xe2\xa0\x3a\xf5\x7a\ +\xfd\x45\x71\x1c\x9b\x3d\xf1\x2e\xc6\x2a\x66\xfe\x6c\x07\xa1\x3c\ +\x1f\x00\xee\x70\x11\x1c\x11\x5b\x51\x14\x0d\xba\xc0\xae\x32\xa6\ +\x17\x8a\x83\xea\x84\x61\x78\x85\x88\x1c\xe6\x00\x7a\x7c\xfb\xed\ +\xb7\xdf\xf1\xf6\xdb\x6f\xef\xd8\x52\x88\x88\xae\x06\x00\x57\xdd\ +\x1f\x37\xbf\xbf\x71\x30\xc7\x4a\x42\x7a\xa1\xe4\x5c\x96\xa5\x4b\ +\x97\xee\xb0\x78\xf1\xe2\x27\x72\x86\x9d\x84\x13\x91\x2f\x68\xad\ +\xcd\x23\xe0\x8e\x83\x88\x0e\x01\x80\x6b\x3a\x1a\xa6\x33\xf8\x15\ +\x33\xff\x55\x3a\xd7\xee\xf4\xf2\x42\xc9\xb9\x6e\x4a\xa9\xb3\x10\ +\xf1\xf4\x9c\x61\x27\xe1\x10\xb1\x1e\x45\x91\x79\xa9\x98\x68\x10\ +\xd1\xcf\x00\xe0\x05\x89\x8c\xed\x8d\x5e\xcf\xcc\xe6\x28\xbd\xbe\ +\x18\x5e\x28\x39\x97\x59\x29\xf5\x1b\x44\x5c\x92\x33\xac\x11\xc9\ +\x8d\x51\x14\xbd\xd2\x06\x97\x88\x8e\x05\x00\x27\xad\x87\x44\xe4\ +\x67\x5a\xeb\xaa\xf5\x25\xb3\xa1\xc7\xca\xd6\x0b\xc5\x8a\xae\xf9\ +\x8d\x95\x52\x6f\x46\xc4\xcb\x73\x84\x9c\x0e\xf5\x06\x66\xbe\xca\ +\x16\x9b\x88\xcc\x66\xb1\x67\xd9\xfa\x25\xb1\x47\xc4\xbf\x89\xa2\ +\xc8\xd5\x43\x8b\x24\x29\x14\x66\xe3\x85\x92\x23\xd5\x44\xf4\x13\ +\x00\x58\x99\x23\xe4\x14\xd4\x7a\x66\x4e\xb5\xfa\x98\x88\xcc\xb9\ +\x90\xe6\x7c\x48\x17\xe3\x2a\x66\x7e\x83\x0b\xe0\xaa\x61\x7a\xa1\ +\xe4\x54\x11\xa5\xd4\x72\x44\x74\xd2\xb5\x44\x44\x4e\xd5\x5a\x9f\ +\x93\x26\xd5\xf6\xc3\x05\xb3\xde\x6c\x71\x1a\xff\x4e\x3e\x88\xf8\ +\xec\x28\x8a\xee\xeb\x64\xd7\xed\xbf\xf7\x42\xc9\xa9\x82\x44\x74\ +\x29\x00\xbc\x2d\x27\xb8\xe9\x30\x32\x38\x38\xb8\xf3\xe8\xe8\xe8\ +\xe3\x69\xb1\x89\xc8\xbc\x77\x79\x6f\x5a\xff\xf9\xfc\x6c\x9e\xc4\ +\xb9\x88\x5f\x14\xa6\x17\x4a\x0e\x4c\xb7\x17\x23\x8e\xe7\x00\x35\ +\x03\x42\x44\x2e\xd2\x5a\x1f\x97\x05\x7b\xf9\xf2\xe5\xcb\x5a\xad\ +\xd6\x16\x0b\x28\xb3\xe0\x6d\xed\xbb\x68\xd1\xa2\xed\xd6\xac\x59\ +\xf3\xc7\x3c\x31\xab\x86\xe5\x85\x92\x43\x45\x1c\xdf\x07\xec\xcd\ +\xcc\x77\x66\x4d\x93\x88\xcc\xa6\x2e\xb3\xb9\xcb\xc5\xf8\x20\x33\ +\x7f\xdc\x05\x70\x55\x30\xbd\x50\x72\xa8\x04\x11\xfd\x37\x00\xe4\ +\xfe\x02\x0e\x11\x7f\x10\x45\x51\x2e\xdb\x7b\xc3\x30\x7c\xb1\x88\ +\xfc\x28\x87\xe9\xce\x06\xb1\x81\x99\x77\x70\x84\x5d\x09\x58\x2f\ +\x94\x8c\x65\x08\xc3\xf0\x50\x11\x71\xf2\xe2\xcd\x1c\x82\xaa\xb5\ +\xfe\x5a\xc6\x14\x37\xbb\x13\x91\x69\x40\xf1\xb7\x79\xe1\x4d\xc7\ +\x41\xc4\xb7\x47\x51\xb4\xda\x05\x76\x15\x30\xbd\x50\x32\x56\xc1\ +\x61\x53\x87\xff\x66\xe6\x3d\x32\xa6\xb7\x85\xbb\xe3\x7d\xf5\xeb\ +\x98\x79\x28\xcf\x7c\xab\x84\xe5\x85\x92\xa1\x1a\x43\x43\x43\xcb\ +\x06\x07\x07\x9d\xdc\x24\x8b\xc8\x19\x5a\x6b\xb3\x09\x2b\xd7\x41\ +\x44\x66\x87\xa2\x93\x0f\x34\x22\x1e\x1c\x45\xd1\x0d\xb9\x26\x5c\ +\x11\x30\x2f\x94\x0c\x85\x20\xa2\x7f\x05\x80\x4c\x4f\xa4\xe6\x0a\ +\x1f\x04\xc1\x6e\x8d\x46\xe3\xd7\x19\xd2\x9b\xd5\x95\x88\xcc\x63\ +\xe2\x79\x97\xe9\xa7\x8d\x99\xe7\x3d\x55\xda\x1c\x5c\xf9\x79\xa1\ +\x64\x60\x96\x88\x26\x00\xc0\xb4\x1c\xcd\x75\x88\xc8\x25\x5a\xeb\ +\x63\x72\x05\x9d\x06\x46\x44\x66\x87\xe2\x4e\x2e\xf0\x83\x20\x18\ +\x69\x34\x1a\x77\xb9\xc0\x2e\x13\xd3\x0b\x25\x25\xfb\x4a\xa9\xf7\ +\x23\xe2\x79\x29\xdd\x3b\xb9\xed\xc3\xcc\x66\x39\x8c\x93\x41\x44\ +\x66\x49\x8b\x59\xda\xe2\x62\x7c\x99\x99\xdf\xea\x02\xb8\x4c\x4c\ +\x2f\x94\x94\xec\x3b\xbc\xd6\xff\x31\x33\xef\x97\x32\xad\x44\x6e\ +\xb5\x5a\xed\xa9\x41\x10\x38\x3b\xce\x61\x60\x60\x60\xf7\x7b\xee\ +\xb9\xc7\x74\x83\xe9\x99\xe1\x85\x92\xa2\x94\x4a\xa9\x83\xcc\xb2\ +\xf7\x14\xae\x1d\x5d\x44\xe4\x28\xad\xf5\x97\x3a\x1a\x66\x34\x70\ +\x79\xe0\x2a\x22\x9e\x13\x45\xd1\xa9\x19\x53\xac\x94\xbb\x17\x4a\ +\x8a\x72\x38\xdc\x66\xfb\x10\x33\x3f\x3d\x45\x4a\xd6\x2e\xb5\x5a\ +\x6d\xaf\x20\x08\xee\xb6\x76\x4c\xe8\xc0\xcc\x66\x5f\xfd\xe6\x2e\ +\x96\x09\xdd\x2a\x6b\xe6\x85\x62\x59\x1a\x97\xed\x80\x44\xe4\x23\ +\x5a\xeb\x0f\x59\xa6\x94\xda\xdc\x61\xbb\x57\xb3\x6d\xf9\x44\xad\ +\xf5\xf9\xa9\x93\xab\x98\xa3\x17\x8a\x65\x41\x94\x52\xe7\x21\xe2\ +\xfb\x2d\xdd\x12\x99\x07\x41\xf0\xcc\x46\xa3\xf1\x40\x22\xe3\x1c\ +\x8c\x5c\x5e\x42\x02\xc0\xc3\xcc\xfc\xb4\x1c\xd2\xac\x04\x84\x17\ +\x8a\x65\x19\x88\xe8\x77\x00\xb0\xbd\xa5\x5b\x47\x73\x11\xb9\x5c\ +\x6b\xfd\x96\x8e\x86\x39\x1b\x10\xd1\x1a\x00\x78\x5e\xce\xb0\x93\ +\x70\x22\xf2\x16\xad\xb5\xab\x1d\x9f\x2e\x52\x9e\x13\xd3\x0b\xc5\ +\x82\x6e\x22\x7a\x17\x00\x4c\x1e\xb3\xe0\x60\xec\xcf\xcc\xae\x0e\ +\x03\x9a\x33\x5d\xa5\xd4\x51\x88\x78\x89\x83\xf9\x18\xc8\xbb\x98\ +\x79\xc4\x11\x76\xa1\xb0\x5e\x28\x16\x74\xbb\xfa\xeb\x8b\x88\x3f\ +\x8b\xa2\xa8\xb4\x46\x0d\x44\x64\x2e\xf7\x9e\x61\x41\x45\x62\x53\ +\x11\x39\x50\x6b\x6d\x4e\x43\xee\xea\xe1\x85\x92\xb0\x7c\x8e\x97\ +\xa9\xbf\x83\x99\xbf\x98\x30\x95\xdc\xcd\xc2\x30\x3c\x55\x44\x3e\ +\x91\x3b\xf0\x5f\x00\xaf\x65\x66\x57\x8d\xf8\x1c\xa5\x3c\x13\xd6\ +\x0b\x25\x21\xd5\x0e\x37\x3e\x3d\xca\xcc\xb9\xb7\x37\x4a\x38\xad\ +\x49\xb3\x91\x91\x91\x6d\x37\x6d\xda\x64\xee\xbd\x72\x5f\x8e\x63\ +\xf0\xe3\x38\xa6\x66\xb3\xa9\x6d\x72\xaa\x9a\xad\x17\x4a\x82\x8a\ +\x2c\x5b\xb6\x6c\xc9\xc2\x85\x0b\x7f\x93\xc0\xd4\xda\xc4\xfc\x25\ +\xd7\x5a\x7f\xc0\xda\x31\x67\x87\x30\x0c\xcf\x17\x91\x55\x39\xc3\ +\x4e\xc2\xe5\xb1\x9d\xd9\x45\x5e\x36\x98\x5e\x28\x09\xd8\x72\x7c\ +\xe6\xc8\xfe\x09\x52\x28\xca\xc4\xd9\xd1\x73\x13\x13\x13\x4b\xd6\ +\xae\x5d\xfb\x68\x51\x13\xc9\x3b\x8e\x17\x4a\x02\x46\x89\xe8\x61\ +\x00\xd8\x2d\x81\xa9\x37\x99\x83\x81\xa2\x5f\xa6\xe6\x5d\x08\x2f\ +\x94\x0e\x8c\x3a\x7e\x7c\x9a\x77\x3d\xab\x8c\xb7\x91\x99\xb7\xa9\ +\x72\x82\xf3\xe5\xe6\x85\xd2\xa1\x72\x44\x74\x2b\x00\xec\xdb\xad\ +\x05\xae\x52\xde\x22\x72\xbc\xd6\xfa\xc2\x2a\xe5\x94\x34\x17\x2f\ +\x94\x79\x98\x52\x4a\xed\x8d\x88\x3f\x4f\x4a\xa6\xb7\xeb\xc8\xc0\ +\x7d\xcc\xfc\xec\x8e\x56\x15\x34\xf0\x42\x99\x5f\x28\xab\x11\xf1\ +\xe8\x0a\xd6\xad\x9b\x53\x4a\xd5\x6c\xbc\xec\x09\x7b\xa1\xcc\x51\ +\x81\x7a\xbd\xbe\x5d\x1c\xc7\xe6\x54\x5f\x3f\x72\x64\x00\x11\x6f\ +\x8d\xa2\xe8\xc5\x39\x42\x16\x02\xe5\x85\x32\x07\xcd\x8e\xbb\x3f\ +\x16\x52\xdc\xaa\x06\x11\x91\x7d\xb5\xd6\xb7\x55\x35\xbf\xd9\xf2\ +\xf2\x42\x99\x5b\x28\xa6\x43\xfb\x9e\xdd\x54\xcc\x2e\xca\xf5\x1b\ +\xcc\x7c\x44\x17\xe5\x0b\x5e\x28\xb3\x54\xcb\x71\xa3\xb8\x6e\xfa\ +\x7c\xb8\xcc\x75\x29\x33\xff\xd2\x65\x80\x3c\xb1\xbd\x50\x66\x17\ +\xca\x77\x01\xe0\x65\x79\x12\xed\xb1\x66\x30\xf0\x39\x66\x7e\x5f\ +\xb7\xf0\xe2\x85\xb2\x55\xa5\xea\xf5\x3a\xc5\x71\x9c\xf8\x40\xd1\ +\x6e\x29\x74\x15\xf3\x8c\xe3\x78\xfb\x66\xb3\xd9\x15\x0f\x4c\xbc\ +\x50\xb6\xfa\x04\x11\xd1\x05\x00\xf0\xee\x2a\x7e\xb0\x7a\x30\xa7\ +\xd3\x98\xf9\x63\xdd\x30\x2f\x2f\x94\x2d\xab\x14\x10\xd1\x9f\x00\ +\x60\x61\x37\x14\xaf\x07\x72\x7c\x8c\x99\x77\xe9\x86\x79\x78\xa1\ +\x4c\xab\x92\x52\x6a\x15\x22\xf6\x4c\xe7\x90\x6e\xf8\x00\x02\xc0\ +\xb1\xcc\x7c\x71\xd5\x73\xf5\x42\x99\x56\xa1\x30\x0c\x59\x44\x54\ +\xd5\x8b\xd6\x63\xf9\x45\xcc\x5c\xaf\xfa\x9c\xbc\x50\xda\x15\x22\ +\xa2\x43\x00\xe0\x9a\xaa\x17\xac\x47\xf3\x3b\x84\x99\xaf\xab\xf2\ +\xdc\xbc\x50\xda\xd5\x51\x4a\x7d\x1b\x11\x5f\x5b\xe5\x62\xf5\x70\ +\x6e\xdf\x65\xe6\x83\xaa\x3c\x3f\x2f\x14\x00\xf3\xd6\xd5\xac\x68\ +\x5d\x5f\xe5\x42\xf5\x41\x6e\xb9\x1c\xea\xea\x8a\x27\x2f\x94\xbf\ +\x08\xe5\x5c\x00\x38\xc9\x15\xc9\x1e\x37\x11\x03\x5f\x62\xe6\xa3\ +\x12\x59\x96\x60\xe4\x85\xf2\x17\xa1\xfc\x16\x00\x76\x2c\x81\x7f\ +\x1f\x72\x1a\x03\x45\xb7\x94\xb5\x21\xbf\xef\x85\x12\x86\xe1\x71\ +\x22\x62\x8e\x98\x73\x31\x0a\xef\xfc\xe8\x62\x12\x5b\x61\xfe\xb5\ +\x8b\xa3\xc2\xdb\x31\xce\x65\xe6\x53\x0a\x98\x83\x75\x88\xbe\x17\ +\x0a\x11\xdd\x01\x00\xcf\xb7\x66\xae\xb3\xc3\x38\x33\x2f\xea\x6c\ +\xd6\x5d\x16\x2e\xdb\xca\x22\x62\x6b\xe1\xc2\x85\xdb\xac\x59\xb3\ +\xe6\xcf\x55\x63\xa5\xaf\x85\xa2\x94\x3a\x00\x11\xbf\xef\xa8\x28\ +\x1f\x63\xe6\xd3\x1c\x61\x97\x0a\x4b\x44\xe6\xdc\x93\xc0\x51\x12\ +\x27\x31\xf3\xa7\x1d\x61\xa7\x86\xed\x6b\xa1\x84\x61\x78\xb9\x88\ +\xbc\x39\x35\x7b\xf3\x38\x22\xe2\xce\x51\x14\x99\x7b\x9f\x9e\x1b\ +\x8e\xfb\x9c\xfd\x8a\x99\xff\xaa\x6a\xa4\xf5\xad\x50\x96\x2f\x5f\ +\xfe\x8c\x56\xab\xe5\xea\x2c\x92\xeb\x98\xd9\xbc\xc0\xec\xc9\x51\ +\xab\xd5\x9e\x14\x04\xc1\x06\x57\x93\x43\xc4\xbf\x8b\xa2\xe8\x2b\ +\xae\xf0\xd3\xe0\xf6\xad\x50\x94\x52\x67\x22\xe2\x3f\xa7\x21\x2d\ +\x81\x4f\x29\x47\x38\x24\xc8\x2b\x37\x93\x30\x0c\x2f\x31\xe7\x4d\ +\xe6\x06\xb8\x25\xd0\xcf\x99\xf9\x85\x8e\xb0\x53\xc1\xf6\xad\x50\ +\xc2\x30\x7c\x50\x44\x5c\x9c\x97\x58\xc9\x4b\x87\x54\x9f\x8e\x79\ +\x9c\xc2\x30\x1c\x12\x91\xb1\xbc\x71\xa7\xf0\x10\xf1\x65\x51\x14\ +\xdd\xec\x0a\xdf\x16\xb7\x2f\x85\x42\x44\xe6\x1c\x74\x57\x27\xef\ +\xbe\x8f\x99\x3f\x67\x5b\x88\x6e\xb4\x57\x4a\xdd\x8c\x88\x07\x3a\ +\xca\xfd\x1a\x66\x7e\x8d\x23\x6c\x6b\xd8\x7e\x15\xca\x8f\x00\xc0\ +\x49\xcb\x1c\x66\x46\xeb\x2a\x74\xa9\x43\x18\x86\x2f\x15\x91\xef\ +\xb9\x4a\x3f\x08\x82\xb0\xd1\x68\xb0\x2b\x7c\x1b\xdc\xbe\x13\x4a\ +\xbd\x5e\x7f\x51\x1c\xc7\xb7\xdb\x90\x64\x61\xfb\x45\x66\x7e\x87\ +\x85\x7d\xd7\x9b\x12\xd1\x5a\x00\x78\xae\x8b\x89\x20\xe2\xbf\x47\ +\x51\xf4\x4e\x17\xd8\xb6\x98\x7d\x27\x14\x22\xfa\x0f\xb3\x59\xc8\ +\x96\xa8\x84\xf6\x35\x66\x76\x76\xdd\x9e\x30\x87\x42\xcd\xc2\x30\ +\x3c\x5a\x44\x56\xbb\x0a\xba\x60\xc1\x82\x5d\xef\xbe\xfb\x6e\x27\ +\x67\xd3\xd8\xe4\xdc\x57\x42\x51\x4a\xed\x8c\x88\xae\xce\xe8\xb8\ +\x93\x99\xf7\xb6\x21\xbf\x57\x6c\x89\xc8\x34\x88\xd8\xce\xc5\x7c\ +\x10\xf1\xec\x28\x8a\xce\x70\x81\x6d\x83\xd9\x57\x42\x09\xc3\xf0\ +\x9f\x44\xe4\xe3\x36\x04\x59\xd8\xbe\x89\x99\xbf\x6e\x61\xdf\x33\ +\xa6\x4a\xa9\xd3\x11\xf1\x2c\x47\x13\xda\xc0\xcc\x3b\x38\xc2\x4e\ +\x0c\xdb\x57\x42\x21\x22\xb3\xe7\xc4\x45\x37\xf5\x9e\x5c\xd7\x95\ +\xf4\x53\x74\xf8\xe1\x87\x0f\x8c\x8d\x8d\x4d\x24\xb5\xb7\xb5\x13\ +\x91\x13\xb4\xd6\xa6\x3b\x4e\x69\xa3\x6f\x84\xa2\x94\x7a\x03\x22\ +\x7e\xd3\x11\xd3\x3d\xbb\xae\x2b\x29\x5f\x44\x64\x56\x60\x1f\x97\ +\xd4\xde\xc6\x4e\x44\xee\xd5\x5a\x3b\x79\x60\x90\x34\x8f\xbe\x11\ +\x4a\x18\x86\x37\x88\xc8\x2b\x92\x12\x63\x63\xd7\xcb\xeb\xba\x92\ +\xf2\x30\x34\x34\xb4\xc7\xe0\xe0\xe0\x7f\x25\xb5\xb7\xb5\x13\x91\ +\xc3\xb5\xd6\xae\xfe\xd0\x75\x4c\xa7\x2f\x84\x42\x44\xa6\xcb\xc7\ +\x3d\x1d\xd9\x48\x67\xd0\xd3\xeb\xba\x6c\x28\x21\xa2\x6b\x01\xe0\ +\x55\x36\x3e\x49\x6d\x45\xe4\x56\xad\xb5\x93\x77\x5f\x49\x72\xe8\ +\x17\xa1\x98\x37\xe5\xef\x49\x42\x48\x0a\x9b\x9e\x5f\xd7\x95\x94\ +\x93\x5a\xad\xb6\x6f\x10\x04\xe6\x28\x3f\x27\x23\x8e\xe3\xfd\x9a\ +\xcd\xe6\x8f\x9d\x80\x77\x00\xed\x79\xa1\xec\xbe\xfb\xee\xdb\xec\ +\xb4\xd3\x4e\x8f\x8a\x88\x8b\x83\x36\xfb\x62\x5d\x97\xcd\x07\x93\ +\x88\x46\x01\x60\xb9\x8d\x8f\x85\xed\x15\xcc\xfc\x46\x0b\xfb\xdc\ +\x4c\x7b\x5e\x28\x44\xf4\x5e\x00\xf8\x6c\x6e\x8c\x6d\x09\xd4\x37\ +\xeb\xba\x92\xf2\xa7\x94\x7a\x13\x22\x7e\x35\xa9\xbd\xad\x5d\xab\ +\xd5\x5a\x36\x36\x36\xf6\x0b\x5b\xbf\xac\xf6\xfd\x20\x94\x06\x00\ +\x84\x59\x89\x9a\xcd\xbf\x9f\xd6\x75\xd9\xf0\x47\x44\xff\x07\x00\ +\x4e\x7a\x0a\x8b\xc8\x17\xb4\xd6\xae\x2e\xa3\xe7\x9c\x66\x4f\x0b\ +\x25\x0c\xc3\x57\x8a\xc8\xf5\x36\x45\xb6\xb0\xed\xbb\x75\x5d\x49\ +\xb9\x21\x22\xd3\xfa\xc9\xb4\x80\x72\x32\x36\x6e\xdc\xf8\xe4\xf5\ +\xeb\xd7\xff\xce\x09\xf8\x1c\xa0\x3d\x2d\x14\x22\xba\x12\x00\x5e\ +\xef\x88\xd0\xbe\x5b\xd7\x65\xc3\x63\x9a\x0f\x96\x05\xfe\xe9\xcc\ +\xfc\x51\x0b\xfb\xcc\xa6\x69\xe6\x83\x69\x9c\x8a\xbe\x4c\x19\x1e\ +\x1e\x7e\xce\xc0\xc0\xc0\xbd\x99\x19\x9a\x1d\xa0\x6f\xd7\x75\x25\ +\xe5\x93\x88\x3e\x03\x00\xae\x4e\xd4\xfa\x35\x33\xef\x96\x34\x97\ +\x3c\xec\xd2\x7c\xe6\xbb\x42\x28\x61\x18\x7e\x52\x44\x4e\x06\x00\ +\xd3\x31\xc4\xea\xc7\xb4\xcd\x11\x91\xd6\xd4\xbf\x00\x10\x4f\xc3\ +\x30\xff\xfb\xc2\x7e\x5d\xd7\x95\xf4\x43\x47\x44\xe6\x83\xfc\xb5\ +\xa4\xf6\xb6\x76\x22\xf2\x15\xad\xb5\x59\x09\x5e\xc8\xe8\x59\xa1\ +\x14\xc2\x9e\x0f\xd2\x37\x0c\x78\xa1\xf4\x4d\xa9\xfd\x44\xb3\x30\ +\xe0\x85\x92\x85\x3d\xef\xdb\x17\x0c\xac\x5c\xb9\x72\x9b\x0d\x1b\ +\x36\xfc\xd1\x72\xb2\x13\x5d\x71\x8f\x62\x39\x29\x6f\xee\x19\x98\ +\x93\x01\xa5\xd4\x72\x44\x34\x2b\x0e\x6c\xc6\x63\x46\x28\x0f\x03\ +\x80\xd5\x53\x07\x44\x1c\x8e\xa2\xc8\xec\xaf\xf6\xc3\x33\xd0\x55\ +\x0c\x28\xa5\x0e\x43\xc4\x2b\x6c\x92\x16\x91\xfb\x8d\x50\x7e\x0e\ +\x00\x56\xdb\x5e\x4d\xb3\x34\xad\xb5\xab\x16\x41\x36\x73\xf0\xb6\ +\x9e\x01\x2b\x06\x88\xe8\x03\x00\x60\x7b\xcc\x77\xc3\x08\xc5\xec\ +\x0b\x78\x83\x4d\x34\x11\xb9\x40\x6b\x7d\x82\x8d\x8f\xb7\xf5\x0c\ +\x54\x81\x01\xa5\xd4\x6a\x44\x3c\xda\x32\x97\x1f\x63\x18\x86\xe7\ +\x89\xc8\xfb\x2d\x1d\x2b\xd7\x26\xd3\x32\x7f\x6f\xde\xa7\x0c\xa4\ +\x39\x1a\x44\x44\x3e\x81\x69\x57\x88\x8a\xc8\x0b\xb4\xd6\xe6\x3c\ +\x12\x3f\x3c\x03\x5d\xc1\x80\x52\xea\x28\x44\xbc\xc4\x36\x59\x11\ +\x39\x00\x87\x86\x86\x76\x19\x1c\x1c\x34\x2b\x44\xad\x06\x22\x5e\ +\x1a\x45\x91\xed\x57\x98\x55\x0c\x6f\xec\x19\xc8\x93\x01\x22\x4a\ +\xd3\x55\xf4\x89\x38\x8e\x77\x9d\x6c\x19\x9a\x76\x0f\xba\x51\x9a\ +\xd6\xfa\x87\x79\x4e\xc6\x63\x79\x06\x5c\x30\x50\xaf\xd7\x0f\x8b\ +\xe3\xd8\xea\x69\x57\x3b\x8f\x2b\x99\xf9\xb0\x49\xa1\x28\xa5\x4e\ +\x41\xc4\x4f\xa6\x48\x70\x12\x24\x85\x9f\x77\xf1\x0c\x14\xca\x80\ +\x52\xea\x7a\x44\x7c\xa5\x6d\x50\x11\x39\x5e\x6b\x7d\xe1\xa4\x50\ +\x88\xc8\x9c\x7b\x98\xea\x7e\xa3\xec\x8e\x1a\xb6\x13\xf7\xf6\xfd\ +\xc7\x00\x11\x99\x05\xb5\xe7\xa4\x98\xf9\x43\x13\x13\x13\xe1\xda\ +\xb5\x6b\x1f\xdd\xdc\xad\x9d\x88\xbe\x01\x00\x87\xa7\x00\xfb\x93\ +\x88\xbc\x5e\x6b\x7d\x63\x0a\x5f\xef\xe2\x19\x70\xca\x40\x96\x7e\ +\xca\x88\xf8\x99\x28\x8a\x26\x9f\x08\x6f\x16\x4a\xbd\x5e\x7f\x4d\ +\x1c\xc7\xdf\x49\x93\xb5\x88\x98\x87\x01\x87\x6a\xad\x6f\x4b\xe3\ +\xef\x7d\x3c\x03\x2e\x18\x50\x4a\x1d\x14\x04\xc1\x75\x22\x32\x90\ +\x06\x3f\x08\x82\x95\x8d\x46\xe3\xa7\x5b\x08\xa5\x7d\x09\x66\xda\ +\xc7\xec\x93\x06\xd4\xbc\xe6\x0f\x82\xe0\x35\x51\x14\x45\x69\xfc\ +\xbd\x8f\x67\x20\x4f\x06\xda\x6b\xba\x6e\xb2\x5d\x9e\x35\x2d\x87\ +\x2d\x0e\x3f\xda\xe2\xa0\x1c\x22\x7a\x3b\x00\x7c\x31\x43\xc2\x0f\ +\x9a\x8d\x50\x8b\x16\x2d\xba\x60\xcd\x9a\x35\x4f\x64\xc0\xd9\xc2\ +\xb5\xbd\x71\x68\x37\x11\x59\xb4\x78\xf1\xe2\x7b\xf3\xc4\xce\x2b\ +\x47\x8f\x63\xc7\xc0\xd2\xa5\x4b\x77\xd8\x76\xdb\x6d\x77\x89\xe3\ +\x78\xaa\x71\xc5\x23\x71\x1c\x3f\xd2\x6c\x36\xc7\xed\x90\x66\x58\ +\x0f\x10\xd1\x2a\x00\x30\x3f\xbb\xa7\xc5\x32\x9d\x48\xb5\xd6\x46\ +\x68\x93\x63\xc6\x89\x52\x4a\xa9\x6f\x23\xe2\x6b\xd3\x06\x68\xfb\ +\xad\x6b\xef\x1c\x34\xcd\x98\xcd\x8e\x44\xab\x61\xfe\x1a\x04\x41\ +\x70\x80\x88\xec\x0f\x00\xaf\xde\xda\x79\x72\x91\x1a\x62\x13\x00\ +\xd6\x07\x41\x70\x75\xa3\xd1\x70\x75\xbe\xbc\x55\xde\xde\xb8\x33\ +\x03\x44\x64\x4e\x58\x36\x07\x0a\xcd\xa8\x6b\xdb\xdb\x1c\x0c\x75\ +\x93\x88\xfc\x74\xfa\x07\xb5\x33\xf2\xe4\x6b\x8e\x23\x45\xc4\x08\ +\xc4\x6a\xed\xe2\xd6\xd8\xa6\x45\x53\x14\x45\x47\x4e\xff\xef\xb3\ +\x09\x65\x1f\x44\xcc\xab\x83\xdf\x5d\x22\x72\x2d\x22\xde\xc4\xcc\ +\x3f\x49\x32\x59\x22\x7a\x17\x00\x9c\x6d\xd9\x22\xe7\xd3\x22\xf2\ +\x31\xad\xf5\x63\x49\x62\x78\x9b\xe2\x19\x50\x4a\x99\x4b\xfa\x93\ +\x2d\xff\x08\x5f\x03\x00\x17\x31\xb3\x69\xef\x3a\xeb\x58\xb6\x6c\ +\xd9\x92\x05\x0b\x16\x1c\x61\xda\xbf\xa6\x79\xfc\x3b\x1b\xa8\x88\ +\xec\xbb\xf5\xfd\xf6\xac\x67\x14\xb6\xf7\xa8\x9f\x92\x27\x9d\x22\ +\x72\x37\x22\xde\x18\x04\xc1\xa5\x8d\x46\xc3\x7c\xe3\xcc\x18\x59\ +\x8e\x71\x46\x44\x0d\x00\x1f\xaf\xda\x99\xe6\x79\x72\xd8\xad\x58\ +\x39\x7c\x9e\x3e\xcc\xcc\x67\x4e\x9f\x7f\x7b\xe9\xd5\xa4\x40\x00\ +\x60\x41\x5e\xdc\xcc\x75\x84\xde\xac\x42\x19\x19\x19\xd9\x76\xd3\ +\xa6\x4d\xe6\x8d\xfb\x0b\xf2\x4a\x60\x2b\x1c\x46\xc4\x6f\x8c\x8f\ +\x8f\x7f\x66\xdd\xba\x75\x1b\xcc\xef\x32\x3c\x9e\xde\x02\x5a\x44\ +\x4e\xd4\x5a\x9f\xef\x28\x6f\x0f\x6b\xc9\x40\x5e\x75\x05\x80\x0f\ +\xb7\x5a\xad\x4b\x06\x06\x06\xcc\x89\x5d\x46\x20\x4f\xb2\x4c\x25\ +\x89\xf9\xda\xf1\xf1\xf1\xfd\xee\xbd\xf7\xde\x19\x4b\xba\xe6\x3c\ +\xf5\xb6\x56\xab\xad\x08\x82\xe0\xae\x24\xe8\x59\x6c\x44\x44\xb7\ +\xef\x37\xd2\xbc\xc3\x99\x2b\xf4\x11\xcc\x6c\xde\x0b\xf9\x51\x22\ +\x03\x39\x8a\xa4\x90\x59\xcc\x76\xc9\x35\x15\x78\xde\xe3\xa1\xd3\ +\xae\x2c\x2e\x64\x56\xf3\x07\xf9\x03\x22\x1e\x1c\x45\xd1\x7f\x56\ +\x20\x97\xbe\x4c\x21\xc3\xb2\xa8\xb2\xf8\x3a\x96\x99\x2f\x9e\x2b\ +\x78\xc7\x73\xd4\x89\xe8\x43\xe6\x6b\xaf\xac\xec\x33\xc4\x5d\x37\ +\x38\x38\xf8\xa2\xd1\xd1\xd1\xc7\x33\x60\x78\xd7\x14\x0c\xd4\xeb\ +\xf5\xe7\xc6\x71\x6c\x1e\x08\x2d\x49\xe1\x5e\x86\xcb\x69\xcc\x3c\ +\xef\xae\xc7\x8e\x42\x69\xdf\x3f\xbc\xdc\x3c\xb2\x2b\x63\x06\x59\ +\x62\x8a\xc8\x6b\xb5\xd6\x57\x67\xc1\xf0\xbe\xf6\x0c\x10\x91\xcb\ +\x33\x6c\xec\x13\x9a\xc7\x03\x11\x8f\x8b\xa2\xe8\xa2\x4e\xa0\x89\ +\x84\x62\x40\xc2\x30\x5c\x29\x22\x97\x02\xc0\x73\x3a\x81\x56\xe8\ +\xf7\x9f\x66\x66\xd3\x64\xda\x8f\x02\x19\x20\x22\x73\x94\xc3\xd2\ +\x02\x43\xa6\x0d\x75\x12\x33\x7f\x3a\x89\x73\x62\xa1\x18\xb0\xe1\ +\xe1\x61\x1a\x18\x18\x30\x47\x2b\x1f\x9a\x04\xbc\x02\x36\x77\x30\ +\xb3\xab\x27\x77\x15\x98\x5e\xf5\x52\x70\x7c\x74\x60\x9e\x13\x9e\ +\xf1\xc8\x79\x3e\x70\x2b\xa1\x4c\x01\x29\xa5\x56\x21\xa2\xb9\x77\ +\xd9\x31\xcf\xcc\x5d\x60\x0d\x0e\x0e\xee\xe4\xef\x53\x5c\x30\x3b\ +\x3b\x66\xad\x56\x3b\x3a\x08\x82\xd5\xc5\x45\xb4\x8e\x74\x0b\x00\ +\x9c\xc9\xcc\xe6\xdf\xc4\x23\x95\x50\x0c\x7a\xad\x56\xdb\x2b\x08\ +\x02\x23\x96\x4a\x7f\xbb\x94\x79\x56\x60\xe2\x2a\xf4\x90\x21\x11\ +\x99\x7d\x1f\x66\xff\x47\x15\x87\xd5\xb7\xc8\xf4\x09\xa4\x16\xca\ +\xb4\x6f\x17\xd3\x50\xec\x78\x00\x78\x49\x15\x99\x31\x67\x10\x32\ +\xb3\x39\xa9\xcb\x8f\x02\x18\x20\xa2\xeb\x00\xe0\xe0\x02\x42\x25\ +\x0d\x61\x0e\x29\xba\x24\x8e\xe3\xd5\xcd\x66\xd3\xb6\x43\xe4\xe6\ +\x18\x99\x85\x32\x85\x14\x86\xe1\x31\x00\x70\x9c\x88\xbc\x30\xe9\ +\x0c\x8a\xb0\x9b\x98\x98\xd8\x73\xed\xda\xb5\xf7\x17\x11\xcb\xc7\ +\x98\x5c\x61\x71\x15\x00\xbc\xae\x02\x5c\xac\x47\x44\x73\x54\xc5\ +\xea\x28\x8a\xee\xcb\x9a\x4f\x6e\x42\x99\x26\x98\x95\xe6\x2f\x8a\ +\x88\x98\xbf\x2a\xcf\xcb\x9a\x60\x56\x7f\x11\xd9\xc5\x2f\x96\xcc\ +\xca\x62\x72\x7f\x22\xfa\x17\x00\x30\x0b\x5b\xcb\x18\xff\x03\x00\ +\xe6\x1b\xed\xfa\x25\x4b\x96\xdc\x78\xcb\x2d\xb7\x4c\xe4\x95\x44\ +\xee\x42\x99\x9e\x58\xbd\x5e\xdf\xaf\xd5\x6a\x99\x55\x9d\x46\x34\ +\x4e\x0e\x29\xed\x44\xc4\xf0\xf0\xf0\xe0\x15\x57\x5c\x61\xbd\xd4\ +\xbf\x13\xae\xff\xfd\xec\x0c\x94\xf0\x82\xda\xf4\xce\x36\xe2\xf8\ +\xde\xc4\xc4\xc4\xcd\x66\x7f\xbb\x8b\xda\x38\x15\xca\xf4\x84\x95\ +\x52\x07\xb4\x05\x63\x44\x33\xec\x62\x32\x5b\x63\x8a\xc8\x77\xb4\ +\xd6\x95\x7e\xd8\x50\x04\x0f\x45\xc6\x50\x4a\x2d\x45\x44\xd7\x47\ +\x62\xff\x16\x00\x6e\x46\xc4\xef\x8b\xc8\xcd\xcc\xfc\x4b\xd7\x73\ +\x2c\x4c\x28\x5b\x89\xe6\xa0\xb6\x68\xcc\xb9\xf1\x2e\xc7\xab\xe7\ +\xdb\xcb\xe0\x32\x70\x3f\x63\xa7\x6d\x0d\x64\xc1\x59\xe1\x2f\x92\ +\x4b\x11\xca\xb4\xfb\x99\xb3\x44\xe4\x74\x0b\x82\x6c\x4c\xef\x63\ +\xe6\x67\xdb\x38\x78\xdb\x7c\x18\xc8\x61\x4b\x79\xa7\x44\xf6\xb7\ +\x7d\x0f\xd2\x09\xb0\xd3\xef\x4b\x15\x8a\x49\x8e\x88\xee\x01\x80\ +\x7a\xa7\x44\x53\xfc\xfe\x63\xcc\x7c\x5a\x0a\x3f\xef\x92\x03\x03\ +\x39\x6d\x29\x9f\x2d\x93\x6f\x33\x73\xe1\x4f\xd5\xaa\x20\x94\x67\ +\x02\x80\x79\x5a\x91\xdb\x30\xbb\x1d\xe3\x38\x7e\xa3\xd6\xda\xec\ +\xab\xf7\xa3\x04\x06\xcc\xd6\xdf\x1c\xb7\x94\x4f\xcd\xe0\xf1\x20\ +\x08\x9e\xdb\x68\x34\x7e\x5d\xf4\x94\x4a\x17\x8a\x99\x70\x18\x86\ +\x27\x88\xc8\xe7\xf3\x98\xbc\x17\x49\x1e\x2c\xe6\x83\x41\x44\x66\ +\x41\xea\xb9\xf9\xa0\x4d\xa2\xec\xcd\xcc\x77\xe6\x88\x97\x18\xaa\ +\x12\x42\x31\xd9\xd6\x6a\xb5\x17\x06\x41\x30\xd9\x6c\x2c\xed\xf0\ +\x22\x49\xcb\x9c\x3b\xbf\x9c\x1e\x17\x6f\x14\x91\x91\x32\xaf\x10\ +\x2a\x23\x14\x53\x2a\xa5\xd4\xce\x88\x68\xf6\x32\xbc\xc5\xb6\x74\ +\xe6\x51\x30\x00\x7c\xb0\x4c\x32\x6d\x73\xee\x17\x7b\xf3\x47\xd0\ +\xbc\x25\x47\xc4\x3d\x52\xcc\x79\x8d\x88\xbc\xad\xec\xba\x56\x4a\ +\x28\x53\x24\xb6\xff\x0a\x99\xbe\x4f\x23\x09\x88\xfd\x8a\x59\xad\ +\xea\x7b\x7b\x25\x60\xaa\x44\x93\xf6\x1f\x41\xb3\x45\xc3\xf4\x46\ +\x78\x4a\x82\x54\xd6\x20\xe2\x45\x49\x36\x55\x25\xc0\xca\x6c\x52\ +\x49\xa1\x4c\xcd\xaa\x56\xab\xbd\x20\x08\x02\xf3\xc2\xd0\x3c\xe5\ +\x78\x06\x00\x3c\x28\x22\x0f\x22\xa2\xe9\x48\xf9\xa0\xe9\x95\xdc\ +\x6c\x36\x7f\x96\x99\x05\x0f\x50\x18\x03\x2b\x56\xac\x78\xca\xf8\ +\xf8\xb8\x11\xcb\xde\x88\xa8\xcc\x55\x37\x00\x98\xee\x90\xe6\x0d\ +\xfb\x23\x00\x60\x96\xbf\xff\xa8\xe8\xc7\xbf\x9d\x08\xf8\x7f\xee\ +\x74\x9e\xef\xc9\x63\x4f\x81\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x07\x7b\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\ +\x67\x9b\xee\x3c\x1a\x00\x00\x07\x0d\x49\x44\x41\x54\x58\x85\xc5\ +\x97\x49\x6c\x1c\x65\x16\xc7\x7f\xef\xab\xea\xcd\x6e\xdb\xe9\xb6\ +\xe3\x71\x1c\xdb\x31\x31\x6d\x07\x05\xc5\x09\x4b\x34\xc9\x44\x80\ +\x66\xc4\xa2\x44\x42\x39\x70\xe4\x80\x10\x20\x84\x10\x52\x0e\x13\ +\x0e\x20\x61\x09\x44\x16\x89\x1c\xb8\xc0\x81\x2b\x42\x82\x03\x17\ +\x92\x81\x64\x32\x08\x65\x63\x11\x0e\x26\x13\x5b\x4a\x3c\xce\x82\ +\xdb\x59\xec\x76\xa7\xbb\xdd\x5d\xd5\xdd\xb5\xcc\xa1\xaa\xab\x17\ +\x5b\x73\x8b\xe6\x93\x4a\x5f\x2d\xaf\xde\xff\x5f\xff\xf7\xbe\xf7\ +\xbd\x12\xd7\x75\x39\x28\xb2\x17\x98\x00\xc6\x81\x30\xf7\x77\x54\ +\x80\x29\x60\xe2\xa8\xeb\x9e\x90\xbf\xc3\xde\xae\x58\xec\xf8\xdf\ +\x1e\x7a\x88\x1d\x43\x43\x44\x74\xfd\xbe\xa2\x97\x2d\x8b\x8b\x37\ +\x6f\x72\x7a\x66\x86\x9c\x61\xec\xd3\x81\x89\xbf\x6e\xd9\xc2\xf8\ +\xc6\x8d\x5c\x99\x9f\x67\x3e\x93\xa1\x6a\x59\x6b\xbe\x2c\x22\x68\ +\x22\x28\xa5\xd0\xfc\x43\x29\x85\x26\x12\x9c\x2b\xa5\x50\xbe\x4d\ +\xeb\xac\x2b\x45\x22\x1e\xe7\xd1\xa1\x21\x5c\xd7\xe5\xeb\x8b\x17\ +\x27\x74\x60\x7c\x7c\x70\x90\xab\xe9\x34\xf9\xe1\x61\x52\xaf\xbe\ +\x8a\x16\x89\xac\x85\x8e\x00\x4a\x04\x44\x50\xfe\x3d\x25\x82\xf8\ +\xcf\xa4\xe5\x9c\xc6\xfb\x00\xd5\x2a\xa5\x33\x67\xc8\xcd\xce\x32\ +\x3e\x38\xc8\xd7\x17\x2f\x8e\xeb\x40\x38\xac\x69\xa4\x33\x19\x52\ +\xaf\xbd\x86\x1e\x8f\xaf\xc6\x6e\x70\x12\xea\xea\x22\xdc\xdd\x4d\ +\x28\x91\x40\xeb\xea\xc2\xb2\x6d\xcc\x4c\x06\x29\x14\xd0\x56\x56\ +\x70\x56\x56\x02\xb5\xa4\x75\x0e\x85\x88\x3f\xf1\x04\xf9\xcb\x97\ +\x59\xe7\xe1\x84\x75\x00\xd7\x75\xa9\xda\x36\xae\x6d\x63\xf9\x0e\ +\x5a\xc1\xe3\x23\x23\x24\x77\xed\x42\x8f\xc5\x56\x11\xec\xec\xef\ +\xaf\xc7\xb8\x58\xe4\xc6\xe9\xd3\x24\x0b\x05\x10\x09\xd4\x0b\x66\ +\xc7\x01\x11\x5c\xd7\x05\x20\x20\x00\x60\x15\x8b\x88\xa6\x35\xc7\ +\x3c\x16\xa3\xf7\xa9\xa7\xe8\x18\x1d\x5d\x33\x2f\x5a\x47\xa4\xbd\ +\x9d\xd1\xe7\x9f\xe7\xc6\xe4\x24\x32\x39\x49\xbb\x52\x75\x70\x11\ +\xc4\x71\x50\xad\x04\x1c\xff\xc2\x2e\x16\xc1\x27\x20\x40\x7c\x78\ +\x98\xfe\xfd\xfb\x09\x35\x84\xc5\xb1\x6d\x96\xe6\xe7\xb9\x33\x37\ +\xc7\xdd\xb9\x39\xda\x22\x11\x12\x43\x43\x74\x0f\x0f\xd3\x3d\x30\ +\x80\xf2\x01\x37\x3d\xf2\x08\xc5\xcd\x9b\xb9\xf6\xd5\x57\xf4\x57\ +\x2a\x01\x01\xd7\x71\x50\x4a\x05\x98\x1e\x01\xc7\x01\xa0\x9a\xcf\ +\x23\xa1\x10\x4a\x04\x3d\x1e\x5f\x05\x7e\xed\xb7\xdf\xf8\xd7\xa7\ +\x9f\xb2\x29\x14\x62\x7d\x3c\xce\x48\x2c\x86\x52\x0a\xb9\x71\x83\ +\xdc\xf7\xdf\x73\x2b\x12\xa1\x6f\xff\x7e\x7a\xb7\x6c\x01\xa0\x7d\ +\xdd\x3a\x1e\x78\xe1\x05\xa6\x3e\xfa\x88\x2d\x89\x84\xa7\x80\xeb\ +\xa2\x44\x02\x4c\x05\x60\xfb\x17\xb7\x4e\x9e\xa4\xba\xbc\x8c\x5d\ +\x2a\xd1\xbf\x6f\x5f\x00\x5e\x35\x4d\xfe\xf1\xf1\xc7\x9c\x3b\x72\ +\x84\x3f\xb7\xb7\xf3\x40\x7b\x3b\x1d\x80\x6b\x9a\xb8\x86\x81\x6b\ +\x18\x44\x2c\x8b\x64\xa9\x84\xf5\xc5\x17\x5c\xff\xf2\x4b\xaa\xe5\ +\xb2\x47\x22\x91\x60\xfd\x73\xcf\x91\xcb\x66\xc1\x34\x11\xd3\x44\ +\x44\x02\x4c\xd5\x14\x82\x5c\x8e\xa5\x1f\x7e\xa0\x63\x64\x84\x75\ +\xdb\xb7\x07\x5f\x7e\xea\x93\x4f\xa8\x5e\xb8\xc0\x63\x3d\x3d\x84\ +\x2c\xcb\x03\x35\x4d\x22\x03\x03\x44\x06\x07\x71\x0d\xc3\x73\xee\ +\xcf\x91\xc9\x49\xf2\xdf\x7c\x13\xbc\x9f\xda\xb3\x87\x74\x77\x37\ +\xf8\x64\x95\x48\x80\x19\x28\xa0\xc0\x93\xb3\x5a\x65\xe8\xc5\x17\ +\xeb\xb2\xff\xfa\x2b\x37\x4f\x9c\x60\x24\x16\xf3\x80\x4b\x25\x1c\ +\xc3\x20\xf9\xec\xb3\xf4\xbf\xf1\x06\x7d\xaf\xbf\x4e\x61\xd7\x2e\ +\x8c\x5c\x0e\xd7\x34\xa1\x54\x02\xc3\xc0\x3a\x73\x86\xc2\xcc\x4c\ +\xe0\xe7\xd1\x97\x5f\xe6\xf2\xfc\xbc\xa7\x40\x83\xea\xaa\x96\x03\ +\xb5\x8a\xd6\x91\x4a\x11\x4e\x26\x83\x84\x3b\xfe\xc1\x07\xec\xe8\ +\xec\xf4\xd8\x97\x4a\x01\x89\xf8\xce\x9d\x81\xf3\x4d\x4f\x3e\xc9\ +\xd5\x3b\x77\xa0\x54\xf2\x48\x18\x06\x18\x06\xe5\xcf\x3f\xc7\xb5\ +\x6d\x00\x62\x5d\x5d\x64\xc3\x61\x9c\x4c\x06\x59\x95\x03\xae\x1b\ +\x94\xd3\x75\xdb\xb6\x05\x8e\xef\x5e\xb9\x42\x78\x66\x86\x68\x0b\ +\x38\xa6\x89\x34\x54\xcb\x70\x2c\x46\xae\x50\x80\x1a\xb8\x69\x82\ +\x69\xe2\xcc\xcf\x53\x4d\xa7\x03\xbb\xe8\x86\x0d\x54\xd3\x69\x94\ +\x08\x76\x63\x08\x1c\xc7\x09\x6a\x79\x57\x03\x81\xf4\xd4\x14\x5d\ +\x8e\x43\x35\x9d\xc6\x5a\x5a\xf2\xe4\xad\x81\x34\x0e\xd7\x85\x4a\ +\x05\xca\x65\xa4\x5c\x0e\x08\x88\x69\xe2\xcc\xcd\x05\x66\xbd\xa9\ +\x14\xf7\x2c\x6b\x0d\x05\x6a\x21\x50\x8a\x8e\x87\x1f\x0e\x5e\x58\ +\xf8\xfd\x77\x92\xa1\x90\xb7\xb6\x0d\x03\x7b\x79\x19\xf7\xde\x3d\ +\xdc\x62\xd1\x03\x6d\x1c\x95\x4a\xf0\xf5\x52\x2a\x41\x3e\x8f\x9b\ +\xcd\x62\x5d\xba\x14\x98\xfc\x69\xeb\x56\x32\xd5\x2a\x4a\xa9\x20\ +\x07\x74\x00\xdb\xb6\xd1\x94\x42\x6a\x55\xcb\x1f\x22\x42\x5c\xd7\ +\x83\xdd\x4c\x03\xc4\xb6\xbd\xaf\x6c\x19\x52\x2e\x23\x86\x51\xdf\ +\x90\xfc\x8d\xaa\xc5\x21\x2b\xb6\xed\x2d\x43\x3f\x37\x14\x80\xe5\ +\x87\x40\x53\x0a\x63\x7a\x3a\xb0\xdf\x38\x3e\x4e\xb1\x41\x9d\xc6\ +\xed\xb6\x75\x28\x1f\x50\x35\x80\x8b\x08\xa1\xb1\xb1\xc0\x66\xf1\ +\xf2\x65\x12\xe1\x30\x4a\x04\xab\x29\x04\xb6\x8d\xf8\xab\xa0\xd8\ +\x40\xa0\x7f\xdb\x36\x0a\xb5\xfc\x68\xd9\xdb\x57\x29\xb0\x06\xb8\ +\x12\x41\x4f\xa5\xea\x04\xa6\xa7\x59\x1f\x89\xac\x56\xc0\x76\x9c\ +\xa0\xd1\x30\x1a\xd6\xee\xfa\x54\x0a\xab\xaf\x6f\xcd\x06\xa3\x55\ +\x83\x46\xd0\xda\xa1\xf5\xf5\xa1\x86\x86\x02\x9b\xcc\xcc\x4c\x9d\ +\x40\x6b\x12\x8a\x2f\x6f\xe5\xfa\x75\x2a\xd9\xac\xf7\x50\xd3\x78\ +\xfc\xfd\xf7\x29\xf8\x3b\x58\x23\x89\x46\xa2\x77\x2e\x5d\x22\xa2\ +\x69\xcd\x21\x50\x8a\xb6\x03\x07\x82\xdd\xd5\xc8\x66\x51\xe9\x34\ +\xba\x52\xab\x0b\x91\x65\xdb\x75\xe7\x22\xa4\x8f\x1e\x0d\x9c\x0f\ +\xef\xde\x8d\xb1\x6f\x5f\xd0\xfd\xd4\xec\x4a\x9f\x7d\xc6\xad\x1f\ +\x7f\xe4\xe6\xf9\xf3\x9c\x3f\x76\x8c\x91\xb6\xb6\x26\xf0\xf0\xde\ +\xbd\xe8\xe3\xe3\x81\x9f\x73\x87\x0e\x31\x16\x8f\x7b\xca\x89\x60\ +\xf9\x21\xd0\x6b\x0a\xa8\x5a\x5f\x27\x42\xe9\xf4\x69\x16\x4f\x9d\ +\x62\xfd\xd3\x4f\x03\xb0\xfb\xed\xb7\xf9\xb7\xae\x93\x38\x79\x32\ +\x20\x61\xcf\xce\x22\xef\xbc\x43\xbe\x5a\x65\x4f\x28\x44\x5b\x34\ +\xda\x04\x1e\x79\xe5\x95\x00\x7c\xf6\xdb\x6f\x29\x9f\x3d\xcb\x58\ +\x6f\x6f\xd0\xa6\xad\x0a\x41\x6b\xa2\xe5\x8e\x1d\xc3\xcc\x64\x00\ +\x08\xc5\x62\xec\x78\xf7\x5d\xc2\x87\x0f\x53\xee\xe9\xa9\xc7\x59\ +\x29\xfa\xa2\x51\xda\x74\xdd\x6b\x5e\x36\x6c\xa0\xfd\xc3\x0f\x89\ +\xbd\xf9\x26\x2a\x1a\x05\xa0\xb4\xb8\xc8\xcf\x47\x8e\xf0\x97\x64\ +\xd2\x03\x6f\x21\xa0\xd7\x42\x10\x0d\x87\x9b\x62\xec\xe6\x72\xdc\ +\x7d\xef\x3d\x7a\x26\x26\x68\xeb\xe9\x01\xa0\x7f\xf7\x6e\x9c\x9d\ +\x3b\x29\x5e\xbb\x46\xe5\xca\x15\xe4\xea\x55\x22\x9a\x86\x36\x3a\ +\x8a\x4a\xa5\x08\x6d\xda\xd4\xd4\x51\x95\x16\x17\xf9\xe7\xc1\x83\ +\x6c\xd7\x34\xda\x43\xa1\x00\xdc\x6d\x0d\x41\x53\x0e\x34\xcc\xf6\ +\xd4\x14\x0b\x2f\xbd\x44\xe4\xad\xb7\x18\x7c\xe6\x19\x4f\x32\x5d\ +\xa7\x23\x95\x82\x86\xe5\xb5\xd6\xf8\xcf\x77\xdf\x31\x79\xf4\x28\ +\x8f\xe9\x3a\x03\x1d\x1d\xf5\xce\xd8\x6f\x4a\x56\x13\x80\xb5\x7b\ +\xf9\x95\x15\xd4\xe1\xc3\xcc\x9e\x3d\xcb\xc6\x03\x07\x88\x25\x12\ +\xff\x13\xd8\xc8\x66\x39\x77\xe8\x10\xea\xc2\x05\xf6\x26\x12\x84\ +\x35\xad\x19\xdc\xb7\x6b\x26\xe0\x38\xb8\xb0\xe6\x7a\xd7\x94\x42\ +\x44\xe8\x38\x7f\x9e\xc5\x73\xe7\xb8\xdd\xdb\x8b\x1a\x1d\x25\x36\ +\x36\x46\xf7\xd6\xad\x80\x57\xe1\x32\xd3\xd3\x54\x66\x67\x89\x2e\ +\x2c\x30\x12\x8b\x31\xd0\xdd\xdd\x14\xf3\xc6\x7f\x84\xaa\x6d\x07\ +\x95\x50\x07\x2a\xa6\x65\x85\x8b\xa6\x49\xb4\xb3\x73\x4d\xf0\x5a\ +\xd2\xb5\x29\xc5\x83\xcb\xcb\xc8\x4f\x3f\xa1\x7e\xf9\x05\xd3\x71\ +\xc8\x59\x16\x09\x4d\x63\x73\x38\xec\xad\xf1\x64\xb2\x0e\xb8\x06\ +\xb8\x88\x90\x5e\x5a\xc2\xf4\xfe\xbe\x2a\x3a\x30\x75\xbb\x50\x78\ +\x5c\xc3\xeb\x84\x93\x9d\x9d\x28\xd7\x45\xfc\xd6\xb9\x26\x59\x6d\ +\xef\x73\xfc\xbf\x22\xc7\x75\x89\x2a\x45\x9b\x5f\xd9\xc4\xbf\x27\ +\xae\x5b\x07\xac\x9d\xfb\xfe\x6c\xdb\x66\x7e\x71\x91\xab\x0b\x0b\ +\xdc\x2e\x14\x00\xa6\x74\x60\xe2\x66\x3e\x7f\xdc\x05\xca\xb6\xcd\ +\x82\x5f\x05\xef\xd7\xb0\x5d\x97\xc5\x52\x89\x3f\xf2\x79\x80\x09\ +\xf9\x7f\xff\x9e\xff\x17\xc5\xd6\x3d\x9a\xb0\xf3\x6b\xe8\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0a\xfb\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x0a\x8d\x49\x44\x41\x54\x78\xda\xed\ +\x9a\x5d\x88\x5d\x57\x15\xc7\x7f\x6b\xef\x73\xee\xbd\x93\x3b\x33\ +\x99\xc9\x57\x9b\x8f\x36\x4d\x93\xd2\x54\x6d\x5a\x8a\x6d\xb5\x05\ +\x5b\x29\x05\x5f\x0c\x54\x2a\x88\x2f\x16\x41\x6c\xc5\x22\x14\xd1\ +\x17\x1f\x7d\xb1\x42\xc5\x52\xf0\x31\x42\x5f\xaa\xd0\xaa\xd5\x46\ +\xb0\x54\x90\x52\xa5\x82\x6d\xac\xd4\xa4\x24\x4d\xd3\x4c\xcd\xe4\ +\xab\x99\x4e\x3a\xf7\xfb\x9c\xbd\xbc\x73\xcf\x3e\xb3\xe6\xce\x4c\ +\x26\x93\x20\x82\xe0\x86\x35\x7b\xdf\x7d\xf6\x39\x67\xfd\xd7\xfa\ +\xff\xd7\xde\x07\x26\x51\x55\xfe\x97\x5b\x02\xfc\xef\x03\x10\x79\ +\x8a\xb5\xb5\xfc\xa1\xc4\xcb\x63\xd5\x6a\xba\x03\xc8\x89\x2d\x68\ +\x61\x00\x22\x50\x49\x33\xfe\x33\x99\x4d\xc9\x73\x59\xfc\x2c\xdf\ +\x69\x77\x8f\x06\xe5\x19\xf0\x2f\xab\x3e\x71\x25\x19\xc8\x1f\xdf\ +\x7d\xcb\xe6\xa7\x1f\xf8\xfa\xbd\x8c\x6c\xdb\x04\x79\x00\x20\x00\ +\x93\x23\x30\x5e\x53\xb2\xe0\x09\xb3\x67\xd8\x5b\x3f\xc7\xf8\xfa\ +\x3a\x21\x5c\x1d\x08\x11\x41\xb3\x2e\x7f\x39\x1a\x98\x9d\xd8\xcb\ +\xba\x11\x45\x15\xbc\x17\x4e\xbf\x33\x7d\xcb\x6f\x7f\xf6\xda\xfe\ +\xe9\xa9\xd9\x87\x81\xe7\xd7\x08\x20\x4c\x8e\x8f\xd5\xbe\xbf\xff\ +\x07\x5f\xe4\xaf\xcd\x8d\xcc\x4e\x83\x77\x20\x02\x59\x80\xfb\x6f\ +\x84\x5d\x9b\x61\xb6\x05\xa2\x4d\x76\xef\xf2\x6c\xd9\xb2\x91\x3c\ +\x0f\x57\x0d\xc0\xd3\xe6\xc5\xd7\xcf\xf1\xf7\xc6\x04\xbb\x6e\x76\ +\x68\x0e\x12\x60\xd3\x67\x36\xf0\x8d\x1b\x37\xf0\xe4\x23\xbf\xfc\ +\xce\x95\x00\xd8\xba\xf3\xe6\x8d\x1b\x3f\x4c\x27\xf9\x60\x1a\xd6\ +\xa5\x10\x04\x5c\x04\xd0\x6a\x06\x2e\xce\xf6\xad\xe5\x48\xfb\xe3\ +\xe3\xc7\xa7\x39\x75\x6a\x06\xd5\xb5\x3b\xbc\xb8\xa9\x2a\xd5\xa4\ +\x47\xb3\x51\xa1\xa7\x4a\xde\xa5\x00\x20\x30\x7d\x1a\xee\xb8\x61\ +\x33\xdb\x77\xad\xdf\x7d\x25\x22\x76\xce\x3b\x51\x15\xd2\x04\x12\ +\x0f\x02\x88\x14\x96\xe7\xd0\x6a\x43\xb3\x6f\xa3\x99\x50\xab\xa5\ +\x7d\xab\xac\x49\x07\xaa\x90\xb8\x1c\xe7\x14\x80\x4e\xcf\x01\x8e\ +\x4a\x02\x3e\xf5\x88\x53\x9c\x03\x55\x7b\x67\xde\x13\x5c\xbf\x5d\ +\x02\x80\xae\xf8\x1a\x45\x0b\x87\x89\x4d\xcc\xba\x19\xcc\x35\xa1\ +\xd1\xb7\x8a\x08\xa3\xa3\x23\xd4\xeb\x97\xd7\x80\x77\x42\xb3\xd9\ +\xe2\xd5\x37\xdb\x9c\x9d\xad\xe2\x7d\xe0\xbe\xdb\x33\xb6\x5d\x33\ +\x89\xa7\x4b\x92\xe4\x08\x45\xa6\x03\x0c\x80\x10\x83\xa6\xfd\xb6\ +\x04\x40\xb8\x1e\xc2\x23\x95\x24\xdd\x87\x10\xcc\xf5\x3e\xe0\x2c\ +\x9d\x9c\x3a\xfe\x51\xda\x78\xfa\x20\x1f\xce\x05\x44\x73\x44\x0c\ +\xee\xc5\x54\x79\xd3\x05\x7a\xb9\x50\x91\x36\x7f\x5e\xdf\x23\x49\ +\xfc\xaa\x14\xf2\x3e\xe9\x9b\xa3\xd7\x47\x7f\xe8\x58\xc2\xe9\x8f\ +\x2a\x90\x2b\x9d\xaf\x55\x78\xf4\x9b\x5b\x48\x05\xbc\xef\x40\xa4\ +\x2a\xae\xe8\x15\x08\x5a\xf4\x18\x80\xb0\xaf\x3e\x9a\xbe\xf4\xa5\ +\x6f\xdd\xb3\x63\xfd\x9e\x6d\xe4\x99\xc2\x00\x25\xd4\x52\xd8\x54\ +\x87\x2c\x53\x5a\xb3\x0d\x76\x57\xa6\xd8\xbb\x7b\x23\xbd\xdc\xbc\ +\x53\x04\x0b\xb6\x90\x05\x59\x95\x3e\x89\x87\x43\x6f\x9f\xe7\xad\ +\xb9\xeb\x19\xdf\x38\xc2\xcd\x5e\x49\x12\x08\x9d\x0e\xbf\x3f\xf0\ +\x37\xce\x9d\x3e\xc4\x8f\x7f\x74\x7b\x7f\xae\x87\x8b\xdc\x77\x62\ +\x94\x55\x2d\x0c\x03\xa0\xdf\xdb\xff\xd8\xbd\x3b\xf2\x7b\x3e\xcd\ +\xab\xef\x81\x8f\x68\x73\x85\x1b\x46\xe1\xd6\x3d\xd0\xed\xc1\xdc\ +\xc5\x16\x7b\xea\x19\xfb\x6e\xbd\x9e\x5e\x16\xb8\xda\x56\x4d\x85\ +\x33\x33\xf0\xdc\xeb\x5b\xb9\xed\xb6\x71\x5a\xf1\x51\xa3\x75\xf8\ +\xea\x0f\xb7\xf2\xec\x77\x5f\xe0\xf0\xe1\x8f\x18\xa9\xd5\x91\x66\ +\x41\x9d\x10\x0c\xc0\xfc\x38\x2c\x06\x30\x3e\x56\xbd\x77\xc7\xdd\ +\x37\xf1\xe2\x3b\x40\x66\x25\x52\x81\x46\xaa\xcc\x5c\xc8\xe9\x76\ +\x85\x4e\x2b\x70\x6a\x76\x86\x6e\xa3\x49\x50\xae\xba\xa5\x89\x72\ +\xe6\x4c\x9b\x76\x03\xda\x2d\x90\xe8\xdc\xb9\x26\x4c\xec\x1c\x63\ +\xef\x5d\x3b\x78\xf7\xe8\x2c\xd5\xea\xfa\x02\x00\x0c\x51\x29\x2c\ +\xcd\x80\x38\xf1\x01\x47\xea\x20\xf8\x32\x03\x86\xb2\xdd\x86\x4e\ +\x57\xe9\x76\x20\xa9\x27\x54\xab\x09\x6b\x29\xf1\x0a\x78\x09\xa4\ +\x3e\x80\x40\x2f\x73\x04\x75\x03\x00\xe9\xa0\xc2\x14\xef\x02\x70\ +\xa5\x83\x01\x10\x8f\x13\x87\x4f\x04\x11\x5d\x46\xa1\x65\x00\x50\ +\x14\x8d\x0f\xb0\x85\xb8\xe8\x45\xb3\xad\x74\x3a\xd0\x6b\x07\xaa\ +\x1b\x52\xc6\xc6\x46\xc9\x83\x5e\x7e\x37\x0d\x3d\x0e\x1d\x99\xe1\ +\xd8\xe9\x75\x84\x1c\xf6\x6c\x6d\x72\xc7\x27\x26\xa9\x54\x52\xaa\ +\xb5\x1c\x89\x95\xad\x34\xca\x4a\xa3\x90\x24\x0e\xef\xbd\x55\x21\ +\x03\xb1\x1c\x80\x52\x4c\x98\xe3\x51\xf1\xf3\x16\x94\x76\x7b\xde\ +\xa0\xd7\x81\x4a\x9a\x32\x32\x92\x92\xe5\x97\x07\x90\x48\xce\x3f\ +\x4e\x8c\xf2\xcc\xef\x76\x41\x57\x79\x74\xff\x09\xee\xbf\xcb\x23\ +\x2e\x25\x4d\x93\x62\xc7\xb5\xa0\x45\x3f\x0a\x07\x7d\xe2\x48\xbc\ +\x8b\xd1\x37\x0a\x89\xb3\x35\x43\x65\x34\xa8\x21\x74\x0e\x9c\x3d\ +\x90\x56\x4b\x69\x77\x20\xeb\xea\xfc\x83\x63\xfa\x2f\x0f\x20\x75\ +\x09\xe2\x7a\xd0\x53\x00\x92\xf2\x5e\xef\x49\x13\xb7\xe0\x38\x62\ +\xef\x93\xe8\x4b\xe2\xdc\xe0\x5d\xc2\x30\x33\x5c\x14\xb1\x95\xd1\ +\xe8\x64\x1e\x86\x1f\x26\x18\xda\x66\x04\x90\x77\x75\x50\xdf\x2b\ +\x15\x8f\x64\x6b\x01\xe0\x71\x25\x27\xa4\x88\xea\xfc\xbd\x38\x4f\ +\x92\xfa\x21\xe7\x1c\x31\xe3\x14\xbe\x78\x97\x91\x38\xf3\x43\x82\ +\xe9\x64\x45\x0a\xe5\xc1\x68\x23\x25\x17\xc5\x32\xd0\x6a\x43\x18\ +\x54\x28\x5f\x6c\x52\xac\x01\x80\xf7\xf8\x52\xa5\x30\x18\x27\x49\ +\x01\x20\xf2\xdb\xa2\x8b\x05\x50\x81\x67\x9e\x0f\xf4\xb6\xd4\xd8\ +\x70\x8b\xd1\xcc\x00\xac\x40\x21\x8d\x4e\x6b\x18\xf4\xc6\xb7\x8c\ +\xbe\xf3\x05\x00\x72\xe6\x1d\x18\xd0\x00\x59\x1b\x00\xa7\x0e\xda\ +\x02\x30\x18\xa7\x15\x0f\x32\x4f\x21\x8f\x08\x98\xd9\x79\x47\x83\ +\x32\x53\xdf\xc0\xbe\xfb\x36\x30\x31\xaa\xe4\x19\xb8\xa5\x14\xd2\ +\xa5\x14\xca\x41\x18\x46\x2a\x51\xc4\x65\x06\xc8\x75\xc0\xe3\x6a\ +\x65\x6d\x1a\x70\x24\x6c\xbf\x36\xe7\xee\x3b\x2f\x02\x0c\xc6\xce\ +\x25\x83\x00\xf4\x6d\x58\xa0\x50\xfc\x89\x74\xde\xbc\x05\xb6\x6e\ +\x87\x6e\x53\x08\x6a\x41\x9d\xef\x43\x0e\xba\x5c\xc4\x31\x12\x6e\ +\x58\xcc\xaa\x45\x06\x9a\x2d\x10\x55\x7c\x92\x0c\xa2\xa8\xb2\x96\ +\x93\x66\x95\x87\x1f\x9c\xe0\xcb\x0f\x6a\xcc\xf2\x04\xe2\xab\x24\ +\xa9\x2b\x34\x20\x82\x49\x04\xc4\xce\x3a\x5c\x3b\x02\xbb\xc6\xa0\ +\x9b\x2a\x4e\x84\x56\x06\x17\xda\xf1\x08\xaf\x10\x96\x6b\xc0\x28\ +\x24\x60\x7c\x0b\x46\x21\xa7\x8a\x73\xd2\x37\xd7\x37\x65\x2d\x6d\ +\x62\x62\xdc\x0e\x7e\x0a\x21\x68\xf1\x6c\xef\x10\x86\xb3\x4e\xe4\ +\x77\x96\xc3\x67\xb7\x35\xf8\xca\xde\x39\x5a\xad\x0c\x27\x8e\x57\ +\xde\xaf\x73\xa1\xe5\x57\x16\x31\x6a\x22\x66\xa1\x8c\xda\x79\xa8\ +\xd9\x54\x1a\x7d\x4b\x45\x19\xa9\x40\xad\x92\x91\x88\x72\xb5\x2d\ +\xa9\xc0\x68\x75\x21\xea\x66\xa5\x2f\x0a\x1b\xc7\xab\x6c\x1a\x5f\ +\x47\x3e\xd2\xa5\xd1\x68\x01\x0a\x97\xd4\x40\x34\x27\xa0\x4b\x28\ +\x04\xd0\xcd\x21\x0b\xd0\x0b\x9e\x9f\xfe\x2a\xe1\x9a\xc9\x16\x59\ +\x86\xf1\x1d\xac\xc9\x2a\xba\xc0\x4e\xa3\xc7\xa7\x52\xf0\xbe\x3f\ +\x1e\xde\x44\x89\x0e\xce\x53\x15\x5c\xbf\xaf\x92\x85\x26\x79\x50\ +\x9c\xc3\xaa\x10\x4b\x34\x60\xa7\x3d\x33\x02\xd4\xd6\x7b\x6e\xfc\ +\xdc\xd8\x42\xb4\x0e\x77\x26\xf8\x67\x0b\xa3\x99\x23\x8a\x31\xce\ +\x11\xc7\x8b\x37\x45\xb0\x35\xb1\xb6\x27\x37\xc1\x9d\x63\x10\xb2\ +\xe1\xe3\x32\x91\xdf\xd6\x74\x40\x3b\x0d\xf6\x3e\x5d\xb6\x0f\x0c\ +\x53\xc8\x8e\x16\xe5\x8b\x53\x59\x40\x3f\x5e\x03\x6f\xce\x61\xe5\ +\x6d\xc9\x98\xe5\xd7\xc5\x0d\x5f\x93\xf8\x1e\x5b\x63\x7a\x04\xb0\ +\xe0\x86\xb8\xd1\x1a\xad\x55\x57\xc8\x80\xf3\xd0\x53\xd8\x35\x09\ +\x37\x6c\xb0\x07\x89\x58\x2f\x0c\x8f\x05\xe3\x86\xb3\x75\x36\x1f\ +\x3b\x9b\xb3\xdf\x10\x41\x00\xe7\xdb\x16\xf9\x10\xec\x3d\x1a\x01\ +\xa8\xea\x50\x06\xc2\xb2\x0c\xa8\x3d\x74\x53\x5d\x79\x60\xf3\x71\ +\x5c\x68\xa3\x08\x22\xf3\xe6\x70\xae\x18\x23\x71\x0e\x87\xb8\x72\ +\x2c\x88\x2b\x7b\x17\x29\xe4\x90\xb8\xd6\x95\xf7\x39\x37\x18\x4b\ +\xb4\x4a\x22\x1c\x39\x5f\xe3\x95\xa9\x0a\x4e\xac\xa4\x23\xc3\x5f\ +\xe4\x41\x2f\x71\x9c\x36\x94\x46\x83\x2c\x57\x7c\xf6\x31\x9b\x27\ +\xc6\x49\x6b\x63\x20\x1a\x69\x23\x0b\x20\xc4\x81\x17\x89\x7b\x87\ +\xe0\x88\x34\x2b\x1d\xf6\xa5\x0f\xe6\x2c\x10\x03\x00\x12\xe7\x43\ +\xaf\xc5\xbb\x17\x72\x3b\x4a\x5b\x74\x97\x01\x70\x52\xd0\x57\xc3\ +\xca\x1b\x59\x04\x60\x9a\xa8\x8d\x4e\x52\xed\x9b\x86\xf8\x95\xe6\ +\x30\xfe\x4a\x61\x5e\x2e\x39\xbf\xa6\xd6\xee\x76\xe8\xe5\x8a\x60\ +\x1a\x08\xcb\x34\xa0\xf3\x66\x7b\xd3\x6a\x14\x32\x00\x3a\x40\x8e\ +\xda\x37\xa8\x0f\xa0\xb2\x04\xec\x7c\xaf\xe5\xbc\x39\xaf\x26\xf2\ +\x55\x9b\x6a\x18\x38\x07\x31\xfb\x40\xae\xcb\x44\x5c\xe8\xc2\x19\ +\x00\x65\xb9\x88\x63\x14\x4d\x38\xe5\xe7\x9c\x94\xa0\x88\x62\x0d\ +\x10\x5c\x1c\x97\x11\x73\x10\xa7\x08\xd8\xbc\xc4\xac\x5c\xa2\x59\ +\xd5\x11\x03\x6b\x1c\x8f\xbf\x8d\x42\xab\x1c\xa7\x15\x2a\x2e\x02\ +\x08\x45\x06\x04\x4c\xf5\x21\xf6\xab\x80\x10\x57\x02\xb0\xf9\xbc\ +\xa4\x9f\xac\x9e\x81\x32\x78\x30\xbc\xd3\x6a\x28\x35\xa0\x45\x76\ +\xdd\x0a\x3b\x31\x6a\x1b\x99\xf1\x50\xb1\xf2\x17\x91\x63\x99\x50\ +\xc0\x1b\x88\x62\x6d\x19\x71\xac\xd9\x7c\x19\xe1\xe5\xfc\xce\x83\ +\x5a\x06\x22\x5d\x75\x71\xf4\x43\xb0\x2f\xc6\x15\x35\x80\xf1\xd7\ +\x89\xdd\x04\x5a\x7e\x29\x19\x2d\xb0\x4c\x88\x65\xa2\x88\xf6\xe0\ +\xb7\x1d\x49\x82\x1a\x20\x29\x69\xe2\x96\x55\x98\xb8\xdf\x58\xb6\ +\x8d\x22\x71\x1c\xd4\x02\xec\x20\xac\xbc\x91\x99\xf8\x54\x25\x46\ +\x45\x71\xce\xf4\x11\xb0\xc3\xd4\x72\x4d\xd8\x1a\x00\x62\xc4\x88\ +\xeb\x3c\x10\xb0\x79\x6b\x45\x06\x9c\x60\xeb\x43\xd1\xdb\x29\x21\ +\xd2\xcc\x18\x82\x22\x2b\x7f\x13\x7b\x57\x44\xc5\x28\x54\x18\x98\ +\x80\x9c\x5b\x19\x84\x2e\xd6\x80\x09\x9b\x82\x19\x96\x09\x35\x4d\ +\xc4\xe8\x2a\x56\x7a\x87\x0f\x6b\x8a\xed\x03\x89\x40\xea\xb1\x33\ +\xc8\x4a\x1b\x19\x02\xaa\xa6\x01\x43\x6d\xe5\x33\xb0\x32\x08\x82\ +\xed\x09\x6a\xc2\x2e\x9d\x37\x0a\x9a\xb0\x23\x85\x14\x00\x11\x63\ +\x43\x45\x7a\x40\xe8\xf7\x6d\xea\xd5\xc0\xba\xaa\x52\x19\x81\x86\ +\xc2\xb1\x23\x17\x60\xf6\xe2\xc9\x21\x0a\xe5\x5a\x02\xb0\xb4\x21\ +\x3a\x9c\x81\xc5\x20\x74\x15\x61\x0b\x50\x8a\x39\x98\xf8\x70\xa0\ +\x45\x07\xa1\xe4\xb3\x92\xc7\x8d\xcc\x3b\xdb\xbd\x9f\xfd\xd3\x0c\ +\x6f\x25\xa7\xe8\x75\x32\x54\x2b\x9c\x68\xf5\x68\x4b\x8b\xf7\x8e\ +\xcd\x72\xf8\xb9\x57\x20\x6f\x1d\xc0\x28\x64\xd1\x22\x8a\x68\x25\ +\x0a\xc1\x62\x2d\x2c\xd7\x84\x62\xd1\x46\x6d\xed\xe2\x52\xeb\x2c\ +\x23\xb1\x44\x86\x72\x1f\x30\x90\x22\x1c\x3c\xf0\xc6\xf9\x83\x07\ +\x8e\x34\x58\xc0\xa4\x80\x7a\xb4\xf7\x1e\x64\x3f\x81\xe4\x05\x2c\ +\x03\x42\xae\xca\xfb\x53\x27\x98\x6b\x34\xd8\xb7\x73\x37\x20\xe5\ +\x3e\x60\x14\x92\xe8\x98\x46\xd1\xea\xca\x9a\xf0\x80\x9a\x26\x50\ +\x93\x04\xaa\x20\xc5\xfd\xa6\x01\xb5\x0c\xb0\x50\x61\x3a\x8f\x03\ +\xcf\x01\x75\x30\x51\x83\x74\xc0\x67\x30\x5c\x85\x24\x04\xe8\x4c\ +\xbf\x4d\x6b\xe6\x2c\xf9\xd6\xed\x28\x0e\x19\x3a\xfa\x46\x87\x17\ +\x8f\x31\x70\x5c\x42\x13\x16\x71\x0c\x8d\xd8\xfd\x01\x25\x37\xed\ +\x40\x3c\xef\x83\xeb\xc4\x99\x06\xab\xb4\x84\xc8\x21\x15\xf8\xd4\ +\x9d\x5f\x20\x64\x39\x89\x3a\xf2\x3c\x47\x5c\xac\x4a\x56\x9f\x11\ +\xb5\x7d\x01\x35\xea\x40\x14\xac\x62\x6b\x25\xf6\x98\xb0\x8b\xdf\ +\x96\x11\x82\x12\x72\x8d\xef\xb2\x7d\x68\x2d\xcd\x00\x64\xdd\xa3\ +\x1f\xbe\x7b\xf6\xba\x7c\xdf\x1e\xd6\xe1\x09\xad\x9c\x5a\x1a\xa8\ +\x4a\x17\x2f\x19\xce\xe5\x84\xc8\x03\x2d\xab\x94\x13\x94\x62\x8c\ +\x9a\x73\xaa\x71\xde\x36\x2e\x3b\x76\x0f\x7e\x47\x93\xc2\xba\x69\ +\x4e\x25\x55\xaa\x15\x48\xab\x70\xf2\x78\x60\xee\xe4\xd9\x1c\xdc\ +\xf4\xda\x01\x10\x9e\xfa\xe0\xd7\x7f\xfc\xfc\xab\x49\x2a\xd7\x7e\ +\xf2\x3a\x5c\x1e\x68\x9e\xdd\xc9\xc1\x13\x6d\x90\x93\x58\x93\x28\ +\x36\xc1\xbe\xae\x5c\xbc\x24\x46\x37\x71\x71\x2c\xf1\x52\x79\x5d\ +\x6c\xce\x95\xeb\x6b\xfc\xab\x51\xe5\x22\x4a\x73\xae\xcd\x1b\xbf\ +\x78\x8d\xec\xe4\xfb\x2f\x43\xfa\xfa\x15\x00\xf0\x2f\x85\x8b\xb3\ +\x0f\x4d\xfd\xfc\x85\x6f\x4f\xd5\xc7\x77\x23\xe8\xeb\x9a\x98\x6a\ +\x57\x6d\x0a\x5c\xcd\x12\xc5\x82\xa2\xe0\xd4\xd1\xe9\x34\xe8\x7e\ +\xfc\x07\x48\x9e\x04\x74\xcd\x00\x54\x9f\x00\xf8\xcd\xbc\xfd\xff\ +\xbf\x55\xfe\xcb\xed\xdf\x99\xd5\xe1\x33\x6b\x2f\x52\xdc\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\x4b\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x04\x27\xfe\xa6\x99\x03\x00\x00\x03\xc8\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xc1\x4b\x1c\x67\x14\xc0\x7f\xdf\xb7\x3a\ +\x8b\xee\xae\x6e\xdd\x55\x10\xa3\x2b\x9a\x43\x2f\x5a\x0d\x7a\x70\ +\x84\x28\xe8\x65\x23\xae\x04\xeb\x51\x3d\xd4\xc3\x5e\x52\x30\x37\ +\xff\x02\x0f\x42\xc0\xff\xa0\x3d\x84\x1e\x96\x88\x94\x56\xd0\x9e\ +\x84\x44\xa3\xd2\x9a\x88\x20\xba\x4a\x52\xc1\x48\x58\x11\x5a\x75\ +\x67\x66\x67\xbe\x99\x5e\xdc\xa9\x6d\xa3\x96\x62\x3f\x78\xf0\x78\ +\xf3\x78\xbf\xef\xbd\xc7\x7b\xdf\xc0\xff\x7c\xc4\x75\x1f\x92\xc9\ +\x64\x2a\x97\xcb\x8d\x58\x96\xa5\x3b\x8e\xd3\xa0\x94\x02\x38\x04\ +\x56\x2a\x2b\x2b\x33\x1b\x1b\x1b\xdf\xff\x27\xc0\xe8\xe8\xe8\x83\ +\xb7\x6f\xdf\x3e\x93\x52\xf6\xf4\xf5\xf5\xd1\xda\xda\x4a\x2c\x16\ +\xc3\x75\x5d\x72\xb9\x1c\xeb\xeb\xeb\x2c\x2e\x2e\xe2\x38\xce\x72\ +\x5d\x5d\xdd\xd3\xb5\xb5\xb5\x5f\xfe\x35\xa0\xb7\xb7\x37\x75\x7c\ +\x7c\xfc\x42\xd7\xf5\x92\xe1\xe1\x61\x6a\x6a\x6a\x28\x2d\x2d\x45\ +\x08\x81\xeb\xba\xd8\xb6\x8d\x69\x9a\x7c\xf8\xf0\x81\xe7\xcf\x9f\ +\xb3\xba\xba\xea\x44\xa3\xd1\xe1\x83\x83\x83\x6b\xb3\x09\x14\x95\ +\xa1\xa1\xa1\x07\xd9\x6c\xf6\xa7\xc7\x8f\x1f\x97\x8c\x8f\x8f\x13\ +\x8f\xc7\x89\x44\x22\x54\x55\x55\x11\x8f\xc7\xa9\xae\xae\x26\x16\ +\x8b\x11\x0e\x87\x09\x87\xc3\xb4\xb4\xb4\x60\x18\x86\x7c\xf3\xe6\ +\xcd\xc8\xbd\x7b\xf7\x7e\x3c\x3d\x3d\x3d\xbe\x11\x50\x28\x14\xbe\ +\xd3\x75\xbd\x69\x62\x62\x82\x70\x38\x4c\x34\x1a\xa5\xba\xba\x9a\ +\x70\x38\x4c\x30\x18\x24\x10\x08\x10\x08\x04\x08\x06\x83\x44\x22\ +\x11\x42\xa1\x10\xcd\xcd\xcd\xec\xed\xed\xc9\xfd\xfd\xfd\xcf\x2d\ +\xcb\xfa\xe6\x53\x00\x09\xd0\xd6\xd6\x96\x72\x5d\xb7\x67\x6c\x6c\ +\x8c\xf2\xf2\x72\xa2\xd1\x28\xf1\x78\x1c\x4d\xd3\x08\x04\x02\x3c\ +\x7a\xf4\x88\x81\x81\x01\x1f\x22\xa5\x24\x14\x0a\xd1\xd4\xd4\x44\ +\x3a\x9d\xc6\xf3\xbc\x9e\xaa\xaa\xaa\xd4\xb5\x80\x5c\x2e\x37\x92\ +\x4a\xa5\xa8\xad\xad\x25\x14\x0a\x51\x51\x51\x81\x10\x02\x29\x25\ +\x42\xfc\xd9\x26\x21\x04\x42\x08\x1f\x22\xa5\xa4\xad\xad\x8d\x64\ +\x32\x89\x61\x18\x23\xd7\x02\x2c\xcb\xd2\xbb\xbb\xbb\xd1\x34\x8d\ +\x48\x24\x82\x10\x02\xcf\xf3\xf0\x3c\xef\x2f\xce\x45\xdb\x55\xbb\ +\x10\x82\xfe\xfe\x7e\x94\x52\xfa\xa7\x00\x25\x00\x4a\xa9\x86\xfa\ +\xfa\x7a\x82\xc1\xa0\x1f\x7c\x60\x60\xc0\x0f\x70\x65\x36\x7c\x40\ +\x26\x93\xf1\xf5\xfb\xf7\xef\x03\x34\xdc\x04\x40\x08\x41\x49\x49\ +\x09\x4a\x29\x94\x52\x78\x9e\xe7\xc3\x3e\x95\x81\x52\x0a\xdb\xb6\ +\x71\x1c\x07\xdb\xb6\xff\x91\xed\xdf\x01\x87\xef\xde\xbd\x6b\xaa\ +\xab\xab\xc3\xb6\x6d\x84\x10\xcc\xcd\xcd\xf9\xb5\x1e\x1c\x1c\x04\ +\x60\x7e\x7e\x1e\xc7\x71\x50\x4a\x61\x9a\x26\xb6\x6d\x53\x28\x14\ +\xd8\xdd\xdd\x45\x29\x75\x78\x6d\x0f\x3c\xcf\x5b\x59\x5a\x5a\xc2\ +\x34\x4d\x0a\x85\x02\x96\x65\x51\x28\x14\x7c\xdd\x75\x5d\x5c\xd7\ +\xf5\x6d\xa6\x69\x62\x18\x06\x96\x65\x61\x59\x16\x8b\x8b\x8b\xb8\ +\xae\xbb\x72\x2d\x40\x4a\x99\xc9\x64\x32\x64\xb3\x59\x0c\xc3\x20\ +\x9f\xcf\x63\x18\x86\x2f\x45\x40\x3e\x9f\xf7\xc5\xb2\x2c\x0c\xc3\ +\x60\x67\x67\x87\x85\x85\x05\x80\xcc\x4d\xab\x22\xa1\x69\xda\xb7\ +\x9d\x9d\x9d\x3d\xb3\xb3\xb3\x68\x9a\x86\x94\x12\x4d\xd3\xfc\x3e\ +\x08\x21\xfc\xfe\x14\x57\xc6\xc5\xc5\x05\x93\x93\x93\x6c\x6d\x6d\ +\x2d\x03\xbd\x37\x4d\xf2\x6f\x52\xca\xad\xa3\xa3\xa3\xaf\x3e\x7e\ +\xfc\x28\xdb\xdb\xdb\xfd\xe6\x15\xcb\x65\x18\x86\x5f\x9e\x7c\x3e\ +\xcf\xd9\xd9\x19\x33\x33\x33\xac\xae\xae\x3a\xc0\xd7\x40\xf6\xc6\ +\x55\xe1\xba\xae\x26\x84\x58\xde\xdd\xdd\x1d\xd9\xdc\xdc\x94\xf5\ +\xf5\xf5\x94\x95\x95\xf9\xc1\x8b\xf5\x3e\x3f\x3f\x67\x7b\x7b\x9b\ +\xe9\xe9\x69\x5e\xbf\x7e\xed\x00\x79\xe0\x4b\xe0\x14\xf8\xf9\xb6\ +\x75\x9d\x00\x62\x42\x88\x67\x52\xca\x9e\x87\x0f\x1f\xd2\xd5\xd5\ +\x45\x63\x63\x23\x00\x07\x07\x07\xbc\x7a\xf5\x8a\x97\x2f\x5f\x02\ +\x2c\x03\x4f\x81\x17\xc0\x67\x97\x97\x3d\x01\x9e\x00\x3f\xdc\xf6\ +\xe0\x24\x80\x2f\x80\x11\x40\xbf\x32\x44\x87\xc0\xca\x65\x43\x4f\ +\x80\x23\x80\xc6\xc6\xc6\x6d\x40\xbc\x7f\xff\x5e\x02\x36\x90\xbc\ +\xf4\xbb\xf5\x24\x6e\x90\xab\x3e\x27\xe9\x74\xda\xee\xe8\xe8\x30\ +\x80\xdf\x2f\xcb\x96\xb8\xcb\xa7\x37\x01\x9c\x4d\x4d\x4d\x29\x5d\ +\xd7\x1d\xe0\x0c\x38\xbf\x4b\x48\x31\x2b\x33\x9d\x4e\xdb\x89\x44\ +\xc2\xbe\x6b\xc0\x55\xc8\x31\xa0\x80\x1e\x20\x21\xee\xf8\x2f\xe5\ +\xea\x8d\x7f\x05\xf8\x03\xd8\xcb\xf0\xd4\x8e\x80\x5e\x37\x00\x00\ +\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0e\x35\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\ +\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\ +\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x07\x74\x49\x4d\x45\x07\xe1\x0a\x0d\x0f\x2b\x18\xc7\x56\x80\ +\xf9\x00\x00\x0d\x39\x49\x44\x41\x54\x68\xde\xc5\x5a\x7b\x78\x54\ +\xd5\xb5\xff\xad\xbd\xcf\xcc\x99\xcc\xe4\x01\x12\x20\x0f\x0a\x21\ +\x10\x5a\x79\xa3\x20\x05\x4b\x79\x84\x14\x10\x3e\xe4\xa5\x55\xf4\ +\x16\xea\x15\x42\x91\x54\x7c\xf5\xbb\xe5\xbb\xdc\xeb\x47\x51\x1e\ +\x1f\xca\x45\x81\xe2\xb5\x80\x82\xa0\x48\xa1\x48\x23\x85\x0b\x0a\ +\x52\xaa\x28\x04\x81\x12\x08\x31\x10\x9e\x81\xbc\x33\x79\xcd\x9c\ +\x39\xe7\xec\x75\xff\x98\x09\x86\x90\x4c\x48\xe4\xfb\xba\xfe\x59\ +\xf3\x9d\xb3\x67\xad\xdf\x7a\xec\xbd\xd7\xda\xfb\xd0\xe8\xd1\x23\ +\x04\x6e\x27\x02\xc0\x21\xae\x00\x88\x46\x38\x03\xa0\x03\x07\x0e\ +\xd9\x42\x88\x87\x99\xf9\x1d\x66\xee\x45\x44\x60\x66\x84\xe1\xd5\ +\x00\xde\x88\x8f\x8f\x5b\x32\x74\xe8\x43\x66\x45\x85\xb7\x55\x7a\ +\x43\x1c\x00\x58\xd4\xfb\xb3\x08\xf1\xfa\xbf\x65\xe8\xfd\x1d\xdc\ +\xe1\x70\xa0\x57\xaf\xfb\x75\x66\x9e\x0d\xa0\x17\x11\x05\x05\x85\ +\xe7\x91\x00\xd2\x8b\x8a\x8a\x7f\x32\x7d\xfa\x63\xad\xd2\x1b\xe2\ +\x75\xe3\x44\x7d\x03\xea\xf3\xa6\x3c\xc3\x75\x1e\x89\x8c\xf4\xd0\ +\x95\x2b\x57\x3d\x44\xb8\x1f\x2d\xa3\x58\x80\xbb\x4f\x99\xf2\xb4\ +\x6a\x8d\xde\x86\xcf\xeb\x0c\xe0\x30\x0a\x1b\x15\xf2\xe4\x93\xd3\ +\x6c\xd3\xb4\xee\x63\x46\x87\x16\x1a\xa0\x29\xc5\x9d\x99\xb9\xb9\ +\x71\xcd\x82\x07\x40\xf5\xc3\xd7\x22\x21\x93\x27\x4f\x83\x65\x59\ +\xb1\x00\xda\xb6\xd0\x00\x00\xe8\xb2\x6a\xd5\x32\x11\xe6\x7d\x73\ +\xe0\x6f\x45\xa8\x6e\x62\xdc\x46\x9d\x3b\x77\xe2\xf4\xf4\x7f\xb7\ +\x9e\x7f\xfe\x37\x2a\x25\xa5\x9b\x6a\x4c\x08\x91\x8b\x99\xb9\x13\ +\x00\x77\x4b\xd1\x33\x73\x97\x35\x6b\xde\x75\x3a\x1c\xda\x1d\xef\ +\x22\x22\x5c\x9c\x9a\x3a\x82\xd7\xaf\x7f\xc7\x4a\x4b\x1b\xc5\xba\ +\xee\x6c\x38\x81\xeb\x13\xd1\xe8\xd1\x23\x64\xdd\x0b\x66\x46\xd7\ +\xae\x5d\xf8\x83\x0f\x3e\x8e\xb3\x2c\xf3\x61\x66\x54\x46\x46\x7a\ +\xb2\x7e\xf9\xcb\xa9\x25\x1d\x3b\xb6\xa7\xac\xac\x93\x64\x18\x06\ +\x0d\x1a\xf4\x80\x5a\xba\x74\xa5\x12\x42\xfc\x8e\x99\x97\xb5\x22\ +\x02\x59\x1e\x8f\x67\x5c\x55\x55\x55\xf1\x98\x31\xa9\x9a\x52\x8a\ +\x3b\x76\xec\x80\x19\x33\x9e\x52\xb3\x66\xcd\x73\x15\x14\xdc\xe8\ +\xa1\x14\xf7\x21\xa2\x8b\xbd\x7b\xdf\x7f\x3c\x31\x31\xde\x36\x8c\ +\x40\x63\x59\xa2\x68\xf4\xe8\x11\xb7\x66\x7d\x4a\x4a\x37\xde\xb0\ +\xe1\x83\x0e\xa6\x69\x6e\x64\xe6\x5f\x00\xf0\x03\x38\x29\x04\xed\ +\x12\x42\x66\x26\x25\x75\xbe\x90\x9b\x9b\x67\x78\x3c\x9e\x04\xbf\ +\xdf\x3f\x9d\x99\x9f\x03\x90\xd4\x0a\x03\x0c\x22\xfc\x45\x4a\x6d\ +\x75\xa7\x4e\x89\x5f\x4f\x98\x30\x46\x6d\xd8\xb0\xb9\x9d\x61\x18\ +\x3f\xb7\x6d\x35\x15\xc0\x48\x00\x1d\x01\x94\x08\x41\xcf\x9d\x39\ +\xf3\xf5\x9f\x33\x32\x5e\x91\x8d\xc8\xe1\xba\x08\x40\x08\x41\xb1\ +\xb1\xed\xd4\x47\x1f\xed\xf8\x3d\x33\xff\xa1\x41\xb8\x18\x40\x01\ +\x11\xf6\x11\xd1\x09\xa5\xf8\x09\x00\x43\x43\xa1\xfd\x21\x54\x48\ +\x44\x1b\x00\xd4\x00\x3c\x91\x19\xfd\x00\xe8\xb7\xe7\x08\x8e\x3b\ +\x1c\xce\xc9\x19\x19\xb3\x0b\x4e\x9e\xfc\x67\x7d\x7d\x5c\x67\x00\ +\x01\x90\xfb\xf7\x1f\xb4\x75\xdd\xd9\xcf\x34\xad\x4f\x00\x74\x0e\ +\xa3\xb4\x2e\x27\xef\x15\xd5\xcd\xc1\x26\x17\x12\x22\xfa\xaf\x89\ +\x13\xc7\x2d\xf1\xf9\x7c\x64\xdb\xea\x36\x2c\x02\x80\xf0\x78\xdc\ +\x9c\x92\xd2\x4d\x37\x4d\xeb\xb9\x66\xc0\xe3\x1e\x83\xaf\x03\x4e\ +\xe1\xde\x33\xf3\xb3\x9f\x7e\xba\xaf\xcf\x6f\x7f\x3b\xc7\x6e\x60\ +\x38\x09\x66\xe6\x5d\xbb\x3e\x52\xf9\xf9\x97\x86\x03\x98\x76\x8f\ +\xc1\xdd\x2b\xea\x62\xdb\x6a\xde\xac\x59\xcf\x3b\x5d\x2e\xfd\x16\ +\x78\x00\x2c\xfa\xf5\xeb\x03\x8f\x27\x2e\x86\x19\xf3\x01\xb4\xf9\ +\x57\x23\x6d\x8a\x98\x79\x5a\x51\x51\xf1\xa8\xcc\xcc\x7d\x16\xea\ +\x2d\xab\xf2\xab\xaf\xbe\x61\xa5\xd4\xaf\x98\x79\x1e\xbe\xaf\x35\ +\x7e\x08\x59\x00\xbc\x00\xca\x01\xf8\x42\x9e\x72\xdc\x03\xb9\x2e\ +\x66\x8e\x6d\xdb\xb6\xcd\x9e\x61\xc3\x86\xf8\xca\xcb\x2b\x24\x00\ +\xa5\x69\x9a\x96\x62\xdb\xf6\xdc\x7b\xa0\xe4\x26\x11\x7d\x4a\x44\ +\x9f\x09\x21\xbe\x13\x82\xaa\x98\xa1\x29\xa5\x12\x94\x52\x83\x00\ +\x7e\x94\x19\x03\x7e\xa0\x9e\x51\x5e\x6f\xe5\xb4\x3e\x7d\x7a\xfd\ +\xe9\xe2\xc5\x4b\x8a\x99\x89\x88\x68\x39\x80\x97\xd0\xfa\xc9\x69\ +\x02\xf8\xc4\xe1\xd0\x96\xf7\xed\xdb\xfb\xe4\xb1\x63\x27\xcc\x25\ +\x4b\x5e\x25\x22\xa2\xc8\x48\x0f\x12\x12\xe2\x39\x27\x27\x97\x5e\ +\x7b\x6d\x45\xac\x61\x18\x4f\x29\xa5\x5e\x02\x90\xd8\x5a\x0b\x88\ +\x70\x42\xd7\xf5\xf1\x4f\x3e\x39\xad\xf8\xca\x95\x6b\x4c\x44\xb4\ +\x07\xc0\xb8\x56\xca\x0b\x10\xd1\xaa\xa8\xa8\xc8\xd7\xd7\xac\x79\ +\xc3\xbb\x65\xcb\x36\x69\x9a\x56\x63\xe3\xb8\x63\xc7\x0e\xa8\xac\ +\xac\xe2\xbf\xfd\x6d\x7f\xaa\x6d\xdb\x6b\x00\xa4\xb4\x52\x67\xa1\ +\xd3\xe9\x1c\xed\xf7\xfb\xb3\xd3\xd2\x46\x0a\x41\x84\x9d\x00\x2a\ +\x5a\x29\x6c\x53\x4c\x4c\xf4\x1f\x1e\x7f\x7c\x72\xe5\x7b\xef\x6d\ +\x69\x12\x3c\x00\x2a\x2c\x2c\x82\x61\x18\xc2\x34\xcd\xfd\x52\xca\ +\x97\x00\x94\xb4\x2e\x02\xf4\x45\x44\x84\xeb\xca\xd4\xa9\x13\x25\ +\x00\x16\x51\x51\xd1\x9b\x84\xa0\x0c\x00\x97\x5b\x28\x2b\xdb\xe9\ +\x74\x2c\xdb\xbd\xfb\xa3\xea\xfc\xfc\xcb\x4d\xa5\xdf\x6d\x55\xa5\ +\x52\x8a\x1f\x79\x24\x4d\xeb\xd9\xf3\xc7\x7b\x88\xe8\x4f\x2d\xd4\ +\x67\x10\xd1\xbb\x4e\xa7\xe3\xc5\x69\xd3\x1e\xad\xa9\xac\xac\x0a\ +\xee\x03\x63\xc7\xa6\x5a\xf3\xe6\xa5\x6f\x95\x52\x4e\x07\x70\xa4\ +\x05\x9e\x78\xdf\xef\x37\x2e\x2c\x5a\xb4\xac\xa9\x95\xab\xd1\x92\ +\xd8\x34\x2d\x4e\x4f\xff\x35\x4b\x29\x37\xb5\xc0\x69\x25\x42\x88\ +\x05\x51\x51\x91\x2f\x64\x64\xa4\xdf\xc8\xcf\xbf\x5c\xb7\xf9\xb1\ +\x28\x2d\x2d\xc3\xb9\x73\xe7\xc5\xda\xb5\x6f\x7c\xa5\xeb\xfa\xd3\ +\x44\xd8\x08\x20\xd0\x8c\xc0\x22\x21\xc4\xfe\x9c\x9c\xe3\x68\xa2\ +\x31\x09\x5b\xcf\x67\x66\xee\xa3\xe4\xe4\xa4\x0b\x44\x77\xe5\xb0\ +\x6c\x29\xe5\x33\xbd\x7a\xfd\x64\x55\x6a\xea\x70\xff\x89\x13\xa7\ +\x45\x5d\x9b\x0a\x80\x64\x72\x72\x92\x60\x66\xca\xce\xce\x11\x93\ +\x26\x8d\xf7\x9e\x3a\x75\xe6\x70\x20\x60\x0e\x45\xf8\x2a\xf3\x6c\ +\x54\x54\xe4\x9a\x82\x82\x9b\x81\xda\xda\xda\x86\x65\x40\xb3\xcd\ +\x88\x52\x8a\x8e\x1d\x3b\x61\x12\x89\x2e\x00\xc6\x84\xd1\xe3\x93\ +\x52\xce\xb1\x2c\xeb\xaf\x03\x06\xf4\x93\x3e\x9f\xbf\x1e\xf6\xa0\ +\xae\x3a\x05\x41\x53\xb3\x73\x44\x44\x84\xcb\x4f\x44\x66\x38\x97\ +\x10\xa1\x30\x3a\x3a\xda\xe7\xf5\x56\xb6\xc8\xf3\x77\xca\xa1\xeb\ +\x00\xec\x30\xaa\x98\x99\xab\x99\x99\x2c\xab\xd1\x05\x82\x34\xd4\ +\xdf\x96\xa5\x60\x87\xc3\x41\xcc\x1c\xae\xb8\x02\x33\x20\xa5\xe0\ +\x06\xe3\x5a\x04\x3e\x44\x06\xbe\xaf\x6e\x6b\x01\x54\x85\x9e\x69\ +\x00\xa2\x00\x94\x4a\x29\xcb\x9a\x68\xd9\xb9\x7e\x04\x08\x00\xf7\ +\xe9\xd3\x8b\xcb\xcb\x2b\x1c\x44\xa4\x21\x3c\xb5\xab\xa8\xf0\x46\ +\xc4\xc4\x44\x73\x3d\x61\x2d\x02\x3f\x77\xee\xb3\xc2\xe5\x72\x1d\ +\x23\xa2\x45\x42\x88\xf9\x52\x8a\x47\x74\xdd\x39\xca\xe9\x74\x0e\ +\xd7\x75\x7d\xa4\x94\xf2\x17\x0e\x87\x63\x6a\xb7\x6e\x49\xe7\xc6\ +\x8e\x4d\x6b\x6c\xa1\x20\x84\x94\x09\x21\x04\xaf\x5a\xb5\x5c\xad\ +\x58\xf1\x76\xa2\xdf\x6f\xbc\xc9\xcc\x43\x9b\x31\xa0\x6b\x4d\x4d\ +\x6d\xc2\x84\x09\x63\xb9\x95\x9e\x47\x6e\x6e\x9e\xf8\xd9\xcf\x7e\ +\x7a\x53\x29\xb5\x78\xc1\x82\x97\xdf\x4a\x4c\x4c\x38\x2e\x84\x28\ +\x15\x42\x10\x11\x6a\xdb\xb6\x8d\x39\x37\x73\xe6\xd3\x27\xcf\x9e\ +\x3d\x6f\x4a\x29\x1b\x0b\x41\xb0\x37\x7f\xf1\xc5\xe7\xa8\x7d\xfb\ +\xf6\xb4\x70\xe1\xe2\xc1\x4a\xa9\x65\xcc\x3c\x0c\xcd\x13\x0b\x21\ +\xe6\xdb\xb6\xfd\xd6\xe8\xd1\x23\xb4\x96\x82\x17\x42\xa0\x77\xef\ +\x9e\xf6\x96\x2d\x1f\x7b\x4a\x4b\x4b\x07\x28\xc5\x8f\x30\xf3\x20\ +\x22\x74\x62\x46\x04\x82\x05\x61\x11\x11\x9d\x24\xa2\x3d\x1e\x8f\ +\xfb\xef\x19\x19\xe9\x95\x59\x59\xdf\x92\x65\xd9\x24\x84\xe0\xf8\ +\xf8\x38\xd8\xb6\xcd\x14\x1b\xdb\x4e\x2f\x2b\x2b\x7f\x2c\xd4\x46\ +\x26\xdd\x05\xf8\x3a\xca\x72\xbb\x23\x26\x67\x66\x7e\x7c\xed\xb5\ +\xd7\x56\x68\x77\x0b\xde\xe9\x74\xc2\xe7\xf3\xa9\x23\x47\x8e\x0e\ +\xb2\x2c\xeb\x05\x04\xcb\x98\x68\x04\x27\x73\x25\x82\x73\xc1\x01\ +\x20\x06\xc1\xf6\xd2\x4f\x84\xcf\x85\x90\x4b\x1f\x7d\x74\xc2\x97\ +\x4a\x59\xb8\x76\xad\x40\x9e\x39\x73\xae\xad\xae\x3b\xab\xa5\xcf\ +\xe7\xff\x35\x80\x95\x00\xe2\x5a\x00\x1e\x00\xe2\x2d\xcb\xc2\x91\ +\x23\x47\x0f\x0f\x1e\x3c\xd0\x2c\x2d\x2d\x93\xcd\x81\x77\xb9\x74\ +\x9c\x3b\x97\x4b\xa7\x4f\x67\xff\x9b\x6d\xdb\xeb\x10\xec\xab\x8b\ +\x89\x68\xb3\x10\x62\xb9\xa6\x69\x2b\x35\x4d\xfe\xaf\x94\x72\x33\ +\x80\x3d\x00\xae\x02\xe8\x04\xe0\xa7\xcc\x3c\x26\x27\x27\xb7\x78\ +\xc6\x8c\xe9\xa7\xb6\x6e\xdd\x3e\xc0\xb2\xcc\x0f\xfd\x7e\x23\x5e\ +\x12\xd1\x22\x00\x7d\x5b\x08\x1e\x21\xa0\xfd\x2b\x2a\xbc\x81\xcb\ +\x97\xaf\x9e\x78\xec\xb1\x49\xc6\xd5\xab\xd7\x45\x53\x27\x6e\x52\ +\x4a\x94\x97\x57\xf0\xd9\xb3\xe7\x9f\x51\x4a\xbd\x19\xf2\xf0\x16\ +\xa7\xd3\x91\xf1\xe0\x83\x03\x36\x5d\xb9\x72\xf5\xac\x65\xd5\x14\ +\x0d\x1e\x3c\xb0\xe2\xf1\xc7\xa7\x94\xcc\x99\xf3\xec\x45\xaf\xd7\ +\x7b\xe8\xd2\xa5\x2b\x7b\x99\xd9\x03\x60\x08\x80\x51\x9f\x7f\xfe\ +\x45\x3e\x80\xfb\x98\x39\x03\x80\x4d\x44\xb4\x0c\xc0\xcb\x68\x7d\ +\x39\xed\x27\xc2\x26\x87\xc3\xb9\x72\xfc\xf8\xb1\xb9\x3b\x76\xec\ +\xe2\xf9\xf3\xe7\x12\x33\xa3\xb4\xb4\x8c\x8a\x8b\x4b\xa0\x94\xa2\ +\xfd\xfb\x0f\x5a\x0e\x87\x63\x8c\x6d\xdb\x9b\x01\x44\x13\xd1\x92\ +\xb6\x6d\xdb\xbc\xf9\xfa\xeb\xff\x5d\xbd\x73\xe7\x6e\x69\xdb\x77\ +\x6e\x07\x44\xc4\x4f\x3c\x31\x95\xe7\xcf\xff\x0f\x77\x4d\x4d\xed\ +\x7f\x32\xf3\xcb\x00\x2e\x11\x61\x17\x33\x5e\x00\xf0\x77\xd2\x34\ +\xd9\xdd\xb6\xd5\x76\x00\xfd\x5b\x69\x00\x42\xa9\x73\x81\x88\x76\ +\x09\x41\x07\xa4\x94\xf9\x52\x4a\x1f\x80\x40\xdf\xbe\xbd\xcb\x86\ +\x0c\x19\x64\xaf\x5f\xbf\x39\xb6\xaa\xaa\x7a\x3b\x80\x9f\x13\xe1\ +\xad\xb8\xb8\xb8\xdf\x4f\x9a\x34\xde\x9f\x9b\x9b\xd7\x9c\xe3\xb8\ +\x53\xa7\x04\x6c\xdf\xfe\x89\xc7\xe7\xf3\xad\x65\xe6\xa7\x00\x94\ +\x01\xb8\x0f\xc0\x17\x14\x0a\xef\x2c\xa5\xd4\x6a\x00\xce\x1f\x60\ +\x44\x1d\xf9\x42\x0a\xfc\x44\x28\x91\x52\x9b\x6d\x9a\xe6\x69\x21\ +\xc4\x4c\x66\x5e\x0f\xe0\x94\xcb\xa5\x4f\xda\xbd\x7b\xdb\xd5\x65\ +\xcb\x56\x86\x6d\x61\x85\x10\xfc\xa3\x1f\x25\x22\x39\x39\x59\x2d\ +\x58\xf0\x2a\x3b\x1c\x5a\x2f\xdb\x56\x7f\x05\xd0\x35\x34\xe4\x0b\ +\xb1\x7d\xfb\xfb\xe4\x72\xe9\x7f\x26\xc2\xc1\x7b\x00\x1e\x00\x22\ +\x10\xec\xb8\xba\x31\xa3\x27\x80\x98\xae\x5d\xbb\x38\x01\x4c\x09\ +\x62\xa2\x8d\x3e\x9f\xff\xca\xdd\x80\xaf\xa8\xf0\xca\xad\x5b\xb7\ +\x77\x58\xbc\x78\x59\x37\x97\x4b\xef\xea\x70\x38\xfc\x00\x0e\xdf\ +\x36\xee\x9d\x77\x36\x8a\xea\xea\x9a\x0a\x22\xf1\x3f\x08\x36\xe3\ +\xf7\x92\xae\x69\x9a\xfc\xee\xc6\x8d\xc2\x24\x66\x7e\x00\xc0\x0d\ +\x21\xc4\x67\xeb\xd7\xaf\x6e\x36\x6d\xe6\xcf\x9f\xcb\x27\x4e\x9c\ +\xea\x6f\x18\xc6\x5e\xbf\xdf\x38\x14\x08\x98\x87\xfd\x7e\xe3\x20\ +\x80\x89\xf5\xc7\x09\x00\x3c\x71\xe2\x38\x11\x1f\xdf\xf1\x10\x11\ +\x7d\x7c\x8f\x0d\x28\x88\x8f\x8f\xf3\x9a\xa6\xd9\x09\x40\x7b\x00\ +\xf9\xd1\xd1\xd1\x05\x7b\xf7\x1e\x08\x57\x6b\x31\x00\x1a\x37\x6e\ +\xaa\x12\x82\x88\xf9\xb6\x2b\x25\x00\xa8\x06\x70\x05\xc1\xc9\x7c\ +\x44\x00\x20\x9f\xcf\x4f\x3b\x76\x7c\x60\x08\x21\xd6\xa0\xf9\x26\ +\x43\xe1\x2e\x89\x88\xbc\x73\xe6\x3c\x63\x10\x21\x16\x80\x93\x88\ +\x0a\xdb\xb4\x89\xf1\x55\x55\x55\x37\x7b\x1f\x31\x66\xcc\x28\xad\ +\x47\x8f\x94\x2c\xb7\xdb\x3d\xd6\xe9\x74\x0c\x77\xb9\xf4\xe1\x4e\ +\xa7\x73\x84\xae\xeb\x23\x74\xdd\x39\x52\xd7\xf5\x11\x11\x11\xee\ +\x25\x75\x3b\xa8\x5c\xb8\x70\xb1\x48\x4f\x9f\x79\xe6\x8f\x7f\xdc\ +\xf0\x6e\xd3\x87\xbb\xb4\x17\xc0\x09\x66\x9e\x8e\xe0\xba\x1c\x36\ +\x15\x98\x19\xdf\x7d\x77\x81\x98\x83\x46\x33\x33\x49\xd9\x64\xea\ +\x37\x68\x3f\x59\xc5\xc7\x77\xa4\xd4\xd4\xe1\x37\x1d\x0e\x0d\xba\ +\xee\x42\x20\x10\x80\x10\x02\x42\x10\xaa\xab\x6b\x70\xf3\x66\x21\ +\x6e\x95\xd3\x4a\x29\x4a\x48\x88\x57\x6e\x77\xc4\xc6\x9a\x9a\xda\ +\xe1\x00\x46\x03\xf0\x13\xd1\xb7\x00\x76\x39\x1c\xda\x9e\x1e\x3d\ +\xba\xe7\x9e\x3e\x9d\x6d\xba\xdd\x11\xbb\x0c\x23\xf0\x34\x33\xff\ +\x06\x61\xca\x0f\x22\x8a\xd9\xb7\xef\x33\x8d\x88\x2a\x10\xec\xf2\ +\xda\x17\x15\x15\xbb\xfa\xf6\xed\x55\x5d\x51\xe1\x6d\xb6\x14\x67\ +\x66\xce\xce\x3e\x17\xae\xdf\xe6\xfa\xf7\x03\x0c\x40\xa4\xa4\x74\ +\xb7\xdf\x7f\x7f\x4b\x27\xc3\x30\x86\x10\x09\xaf\xcb\xa5\x1f\x9b\ +\x3d\xfb\x99\xf2\xb2\xb2\x52\x14\x16\x16\x0b\xd3\x34\x11\x19\xe9\ +\xe1\x5d\xbb\x3e\xb5\xef\xe2\x82\xe3\x9c\xc7\xe3\x1e\x65\x9a\x66\ +\x64\x20\x60\x1e\x02\x20\x35\x4d\x4b\xfd\xf0\xc3\xf5\x39\xeb\xd6\ +\x6d\x10\xe1\xc0\xa3\x99\xb2\x24\x44\x4a\x26\x27\x27\xd5\xc5\x94\ +\x00\x70\x59\x59\x99\x4c\x4b\x4b\xf5\x1e\x3d\x7a\x2c\xdb\xb6\x6b\ +\x2f\xb4\x6b\x77\x9f\x91\x9f\x7f\x89\x2a\x2b\xab\x84\x52\xc1\xf4\ +\x0f\x04\x4c\xba\x78\xf1\x92\x92\x52\xc4\x31\xf3\x94\x30\xa9\xe4\ +\xb2\x6d\x7b\x5f\x97\x2e\x9d\xcf\x96\x97\x57\x0c\x03\xf0\x20\xc0\ +\xb9\xdb\xb6\xed\x3c\x9a\x9c\x9c\xd4\xf0\xde\xb7\xa5\xe0\x6f\x5d\ +\xf2\xa9\x86\x42\x72\x72\xce\x8b\xb4\xb4\x91\xe2\xcb\x2f\xbf\x96\ +\x25\x25\xa5\x8d\x1e\x7f\x33\x2b\x02\xe8\x3a\x80\x9a\x30\x4a\xa2\ +\x98\x79\x54\x5e\xde\x45\x43\x08\xb1\x13\x80\x52\x8a\x67\xb8\xdd\ +\x11\x9d\x17\x2e\xfc\x9d\x8d\xef\xbb\xc1\x56\x81\x47\x68\x19\x6d\ +\x95\x90\x6d\xdb\xde\x83\xc3\xa1\x15\xa3\x99\x43\x31\x66\x9e\xe4\ +\x72\xe9\x89\x6e\xb7\x3b\x13\xc1\x4d\xe8\x01\xbf\xdf\xff\xd2\x8c\ +\x19\x73\x22\xfa\xf7\xef\x63\x33\x73\xab\xc1\x23\x74\x2a\x51\x37\ +\x07\x5a\x24\x24\x3f\xff\xb2\xb8\x70\xe1\x92\xb2\x2c\x73\x0a\xc2\ +\x9f\x75\x76\x50\x4a\x15\x19\x86\xb1\x5f\xd3\xb4\x02\x66\x1e\x03\ +\xe0\xe1\xca\xca\x2a\x75\xfe\x7c\x5e\xd6\xd2\xa5\xaf\xfa\x8f\x1f\ +\xff\x56\x70\xb0\x8c\x6d\x09\x78\x81\xd0\x1c\x68\x98\x8b\x77\x25\ +\xc4\xb6\x2d\x96\x52\xda\x45\x45\xc5\x43\x01\xf4\x0b\x33\x9e\x00\ +\x74\xd7\x75\xfd\xff\xd6\xad\x5b\xf9\x4d\x66\xe6\x3e\x2f\x33\x8f\ +\x04\x90\xea\xf3\xf9\x3a\xef\xd8\xf1\xc9\x05\xb7\xdb\x53\xf4\x8f\ +\x7f\x1c\x55\x97\x2f\xe7\x71\x5c\x5c\x1c\x4a\x4a\x4a\x60\xdb\xf6\ +\x5d\x1d\xd7\xd4\x6f\x07\x5b\xe4\x01\xd3\xb4\xc4\xea\xd5\xcb\x03\ +\x69\x69\x93\xde\x36\x4d\x2b\x1e\xc1\xc3\xda\x3b\x6e\xd2\x11\xfc\ +\x4c\xe2\x06\x33\xdb\x9a\xa6\x51\x62\x62\xc2\xc6\xeb\xd7\x0b\x0c\ +\xa5\xd4\x22\x00\xbf\x0a\x04\xcc\x91\xa7\x4e\xfd\x33\x53\xd3\xb4\ +\x03\x52\x8a\x8b\x42\x08\x6f\x54\x54\x54\xd1\x43\x0f\x3d\x68\x18\ +\x86\x11\x0e\xbc\x00\x60\x53\xe8\x6b\x15\x42\xd3\x11\xe0\x46\x80\ +\xdd\x12\x12\x1b\xdb\xce\xde\xb7\xef\xb3\xe8\xda\x5a\x5f\x5b\x22\ +\xa2\xe0\x57\x29\xa1\x3f\x32\x98\x88\x84\x10\x54\x35\x70\xe0\x80\ +\x72\x5d\xd7\x95\x94\x92\xbc\xde\x4a\x95\x95\xf5\xed\x40\xd3\xb4\ +\xe6\x23\xd8\x52\xb6\xc1\xf7\x17\x23\x3e\x22\x7a\x3b\x3d\x7d\xe6\ +\x8a\xbc\xbc\xfc\xfa\xa9\xd5\x10\xbc\x02\x82\xe7\x2f\xf5\x3f\x71\ +\xa9\xcf\xeb\xff\xb1\xe1\x18\xbb\x8e\x97\x94\x94\xd2\xa4\x49\x13\ +\xbc\x7d\xfa\xf4\xf4\xba\xdd\x6e\xd4\xd6\xd6\xc2\xe9\x74\xc2\x34\ +\x2d\x08\x21\xe0\x70\x68\x38\x78\xf0\x30\x55\x56\x56\xc1\xb6\x6d\ +\xb2\x2c\x4b\x45\x46\x7a\x68\xed\xda\x37\xbf\x79\xe5\x95\x85\xb3\ +\xbc\xde\xca\x21\xcc\x3c\x15\xc0\x30\x00\x49\x00\xb7\x63\x46\x4c\ +\xff\xfe\x7d\x39\x2f\x2f\x5f\x35\xa5\xb7\xee\xf9\xff\x03\x78\x8c\ +\x5f\x99\x77\x2f\x9e\x77\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ +\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x37\x2d\x31\ +\x30\x2d\x31\x33\x54\x32\x33\x3a\x34\x33\x3a\x30\x33\x2b\x30\x38\ +\x3a\x30\x30\x27\xbf\x77\xe8\x00\x00\x00\x25\x74\x45\x58\x74\x64\ +\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x37\x2d\ +\x31\x30\x2d\x31\x33\x54\x32\x33\x3a\x34\x32\x3a\x35\x30\x2b\x30\ +\x38\x3a\x30\x30\xc0\x28\xb0\x93\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x02\xfd\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\ +\x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x7a\x49\x44\ +\x41\x54\x38\x8d\xd5\x95\x4b\x48\x55\x41\x1c\xc6\x7f\x73\x3c\x5e\ +\x6e\x47\xc3\x67\x56\x54\x84\x49\x50\x9b\x5a\x48\xad\xdc\x44\x48\ +\x19\x29\x2d\xad\x36\xb9\x68\x55\xd1\x26\x6a\x11\x81\x1b\x17\x9a\ +\xe8\xa2\x27\x44\xed\x6a\x13\x14\x14\x24\x5a\xbb\x5c\xb9\x90\x6a\ +\x51\x1a\x59\x54\xa2\x5d\xef\xfb\xde\x73\xee\xe3\xdc\x73\xe6\xdf\ +\x42\xf2\x51\x72\xcd\x2e\x2e\xfa\x60\x60\x1e\xdf\x7c\xf3\xcd\x7f\ +\x66\xfe\xa3\x44\x84\xf5\x80\xb1\x2e\xaa\x80\xf9\xab\xd2\xd4\xd6\ +\xdb\x82\xa9\x86\xb5\xd6\xd6\xb2\x95\x0d\x23\x83\x27\x47\xa6\x86\ +\xae\x8c\xae\x45\x58\x89\x08\x4d\x6d\xbd\x2d\xc1\x8a\xf2\xa1\xcb\ +\x67\x8f\x55\x6e\xdf\x5a\xb3\x8c\x30\x3d\x1b\xa7\xef\xde\x0b\x3b\ +\xe7\x14\xda\xd6\x22\x3e\x2f\xdc\xde\xe7\x5c\x3b\xdf\x6e\x05\x2d\ +\x8b\xd9\x58\x76\x19\x61\x6b\xed\x06\x72\x99\x0c\x83\xf7\x87\xdd\ +\x94\x93\x0b\x14\x13\x33\x94\xf2\xcc\xf2\xb2\x9e\xc9\xa7\x97\xba\ +\x4d\x00\xad\xb5\x55\x51\x61\xf1\xfe\x5b\xe2\x0f\x72\xca\xc9\xd3\ +\x50\x1d\xe4\xea\x85\x13\x01\xa5\x54\x51\x97\xb9\xbc\x6b\x76\x0f\ +\x3e\xb9\x0a\x74\x2f\xc4\x38\x96\xca\xa0\x67\x46\xf1\x92\xdf\xd1\ +\x5a\x10\xd1\x68\x3d\x5f\x92\x5a\x33\xa9\x35\xbe\xbf\xd8\xa7\xb5\ +\xbf\xac\x6d\xd5\xed\x64\xff\xa1\x53\x68\x11\x13\x96\x1c\x5e\x38\ +\x9e\xc5\x0e\x7d\xa2\xbf\x6f\x80\xd5\x9c\xfd\x0e\xad\x7d\x4e\x9e\ +\xee\x24\x1c\x5f\x0c\xe3\x82\xf0\x5c\xcc\x26\x67\x67\x50\x4a\xe1\ +\xba\x2e\x22\xc2\xfc\x1d\x17\xbe\xfd\x48\x70\xe5\xc6\x4b\xde\x4c\ +\xcc\x14\x91\x6f\x66\xec\xd1\x08\x86\x61\xd0\xd4\xde\xd7\xb5\x20\ +\x3c\x1b\xb5\x09\x38\x36\x00\xbf\x0c\x8b\xc0\xc3\xa1\xb7\xdc\x7a\ +\x3c\x46\x47\x6b\x33\x5d\x9d\x87\x59\x6d\x2f\xe1\x58\x9a\x9e\x9b\ +\xcf\xee\xa8\x5d\xc7\x7b\xbb\x80\x07\x5a\xeb\x15\x89\xfb\xf6\xee\ +\xa0\xa3\xf5\x00\x62\x98\x84\x53\x79\x74\x91\x97\x1a\x30\x0d\xaa\ +\x83\x8a\xeb\x77\x9f\x87\x4c\xe0\xf6\xb9\xae\xa3\x6c\xae\xaf\x5a\ +\x91\xec\x7a\x9a\x70\x2a\x4f\xd6\xcd\xae\x38\xbe\x14\xe5\x40\x24\ +\xe1\x60\x18\xc6\xb4\x69\x9a\x65\xb3\x6e\xc1\x6f\xfc\x32\x67\x93\ +\x2f\xac\xec\xfa\x6f\x21\x62\x10\x89\xdb\x88\xc8\x67\x13\x98\x08\ +\x45\xd2\x8d\xb5\x0d\x75\x78\x7e\x69\x09\x49\x6b\x88\xc6\xd3\x14\ +\x0a\xde\x84\x59\x28\x78\xe3\xa1\x48\xa2\xad\x66\x53\x2d\x9e\x5f\ +\x9a\x63\x5f\x6b\x22\xd1\x14\x22\xf2\xd5\x10\x91\x0f\xa1\x70\xd2\ +\xd5\xa2\xd0\x42\x49\xc5\x17\x88\x27\xec\x3c\xf0\xdd\x00\x26\xa3\ +\xd1\x44\x01\x4a\xcf\xcb\x22\x42\x32\x9d\x26\xfe\x71\x64\xa3\x09\ +\x4c\xda\x76\x36\xe8\x38\x59\xaa\x2a\xad\x55\x27\x17\x43\xda\xce\ +\x90\xcd\xba\xe5\xce\xf4\x78\x40\x89\x08\x5b\x0e\x9e\xe9\xb7\x1a\ +\xf6\x5c\x14\x59\x7c\x89\xff\x02\xa5\xc4\x4b\x4e\xbd\x7e\x15\x9b\ +\x18\x1a\x50\x22\x82\x52\xaa\x1e\xd8\x0d\x44\x4b\xb2\x0c\xdb\x00\ +\x05\xbc\x53\xff\xdd\x9f\xf7\x13\x77\x5b\x6b\x82\x49\x2e\xb3\xc2\ +\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x08\x96\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x08\x4b\x49\x44\x41\x54\x68\x81\xed\x99\x59\x6c\ +\x5c\xd5\x1d\x87\xbf\xbb\xcc\xea\x59\x3c\xbb\x97\xc4\x4b\xbc\x11\ +\x27\x26\x09\x01\x15\x2a\x14\xd4\x96\x50\xa9\x0b\x11\x09\xa8\x55\ +\x91\x20\x2f\x54\x95\xda\xbe\x54\x7d\xaa\x5a\x35\x20\x2a\xf1\x90\ +\x87\x2a\x40\xa1\x2a\x05\x4a\x68\x1a\x22\x91\x92\x86\xe0\x42\xd2\ +\x34\x24\x61\xb1\xe3\x38\xb6\x63\x3b\xc1\x8e\x67\xbc\x3b\x33\xe3\ +\x75\x3c\xcb\x9d\x99\xbb\xf4\xc1\xa4\x35\x59\x88\x1d\x4c\xcd\x83\ +\x3f\xe9\x3c\xcd\x3d\x67\xbe\xdf\x3d\x77\xce\xcc\xff\x3f\xb0\xc2\ +\x0a\x2b\xac\xb0\xc2\x17\x40\x58\x6e\x81\x9b\xb2\x0b\x91\x20\x15\ +\x38\x88\xf2\x18\xa9\xab\x5f\x16\x97\xc3\x69\xc1\xbc\x48\x0d\x21\ +\x3e\x10\x4c\x42\x1f\x09\x22\x3c\xce\xba\xab\x2f\x91\x96\xc3\xeb\ +\xa6\x18\x08\x04\xf9\x19\x08\x07\x03\x45\xc1\xca\xfa\xda\x3a\xd2\ +\x8a\x52\xa0\x8c\x2a\xe5\xb4\x70\x04\xc8\x5e\xb9\x54\x5e\x46\xcd\ +\xeb\xf3\xbc\x6d\xb5\xf0\xac\xfa\x8a\xc5\x6a\xfa\x56\x79\xd5\x2a\ +\xbe\x53\xbd\x86\x98\xa2\x70\x49\x17\x11\xf2\x92\xd5\x40\x0b\x01\ +\x33\x57\x2e\xff\x4a\x05\x90\xf6\x58\x1f\x13\x54\xfd\x59\x7f\x49\ +\xd0\xb5\xb1\xae\x8c\x9d\x95\x95\x1c\x8b\x46\x79\xbf\x3b\xcc\xec\ +\xe5\x64\xc6\x38\x66\x9c\x02\x94\xf9\x73\xbe\x12\x01\x6c\x7b\x6c\ +\xab\x54\x55\x7c\xc5\x24\x99\xee\x5f\x5d\x5b\xc4\xb6\xba\x4a\xb6\ +\x95\x96\xb2\x6f\x70\x90\xf7\x3a\xc3\x44\x7b\xc7\x33\xfa\x5f\xb5\ +\x17\xe9\xd7\x4f\x00\xa3\xf3\xe7\x2e\x7b\x00\xeb\x6e\xf7\x8f\xf5\ +\x1c\xbb\x7d\xa5\x2e\xe7\xda\xba\x12\x76\x56\x95\x53\xe3\x32\x73\ +\x70\x70\x84\x77\x3a\xc3\x44\x7b\x26\xb2\xfa\x81\xfc\xcb\x7a\xbb\ +\x7a\x18\xf8\x08\x50\xe7\xcf\x5f\xb6\x00\xce\xdd\x4e\xbf\xaa\x99\ +\xfe\x28\x49\xd2\xf6\xe2\x3a\x1f\x5b\xd7\xae\xe6\xc1\x32\x1b\x79\ +\x71\x98\xc6\x51\x0f\x6f\x75\x86\xb9\xdc\x3d\xa1\xaa\x87\x73\xaf\ +\x69\x2d\xf9\x43\xc0\x87\x40\xee\xea\x75\x96\x25\x80\xfd\x99\xd0\ +\x36\x2d\xaf\xbf\xe4\x0a\xd8\xfc\x55\xeb\x82\x3c\x5a\x53\x46\xd0\ +\xdb\xc7\x34\x59\x7a\x46\x6b\x38\xd0\xd6\xc7\x58\xc7\xa4\xaa\x1e\ +\xc9\xbe\xa6\x9d\x56\xfe\x0e\x9c\x66\xde\xc9\x33\x9f\xeb\x07\xd8\ +\x55\x61\xb5\xca\xd9\x90\xf2\xeb\xb1\x81\x25\x35\xdf\x55\x62\x77\ +\x48\xfa\x6e\x51\x10\x7f\x52\xb4\xd6\x2f\xdc\x53\x5b\xc4\xf6\x4a\ +\x3b\x31\xf3\x09\x14\xdc\x0c\x8c\xae\x67\x5f\x7b\x3f\xa3\x1d\x93\ +\x46\xfe\xb4\xf2\x56\xfe\x74\xfa\x2d\xe0\x24\x90\xb9\xd1\x92\xd7\ +\x7c\x13\x17\x3e\x5d\x5c\xae\x6b\xe2\x49\x41\x14\xca\xf4\xa4\xfe\ +\xb1\x31\xaa\x6d\x4b\xee\x8d\xc6\xbe\xa8\xbb\xf3\xa9\xd2\x7b\x04\ +\x43\xd8\x6b\x2d\x34\x57\x95\x37\x78\xf9\xc1\x6d\xa5\x54\x06\xe2\ +\x8c\xc9\x2d\x14\xe8\x41\x62\x97\x37\xf1\xfa\xf9\x61\x86\x5a\xc7\ +\xc9\x36\x25\x0f\x67\x0e\x4d\xfd\x05\x38\xc6\xbc\x23\xf3\x7a\x5c\ +\xb3\x03\x86\x6a\x7e\xc2\x19\xb4\x96\x15\xd7\xbb\x18\x39\x3f\x73\ +\x77\x4a\x4d\x35\x59\xb7\xb8\xbf\xa9\x9c\x9c\x89\xdc\x92\xf9\x9e\ +\x6a\x8b\x7b\x32\xf7\xa4\x80\xf0\x4b\xef\x1a\xa7\xd4\x50\xef\xe5\ +\xe1\x2a\x0f\x82\xf3\x13\xe2\xe2\x28\x36\xdd\x47\x32\xbe\x99\xbf\ +\x75\x8e\x30\x72\x76\x9a\x5c\xab\xf2\x5e\xe6\xd0\xd4\x3e\xe0\xf8\ +\xcd\xe4\xaf\x1b\x40\xcc\x4a\x26\x51\x17\x59\xef\x75\xe1\xdd\x6c\ +\xa5\x4b\x8b\x57\x24\x75\xf9\x38\xb0\xe8\x10\x85\xbf\xa9\xdc\x20\ +\x44\xf5\xd7\xcd\x2e\xeb\xfa\xe2\xf5\x6e\xb6\xd6\xf8\xb9\xbb\x4c\ +\x27\x65\xb9\x40\x96\x04\x66\xdd\x4d\x26\xb6\x91\x57\xce\x8f\x31\ +\x7c\x66\x86\x5c\x47\xe6\xfd\xf4\x9b\xf1\xd7\x80\x7f\x01\x53\x0b\ +\x79\x8f\x6b\x7e\x4a\x38\xbe\x5e\x38\x94\x4f\xf3\x53\xd5\x2b\x0b\ +\x8f\xd7\x17\x33\x61\x17\x99\x49\xa9\x85\x86\xcd\xb4\xc3\x70\xcb\ +\x87\xb5\xbe\xf4\xe4\x4d\x57\xdd\xb5\xce\xec\xbb\xd7\xf3\x3b\x11\ +\xf1\x55\x4f\x95\xa3\xe8\xf6\x3b\x03\xec\x6c\x08\xb1\xa6\x78\x96\ +\xac\x39\x8a\x86\x82\xa0\x59\x98\x8d\x35\xf0\x6a\x7b\x9c\xa1\xe6\ +\x69\xb2\x9d\xc9\x53\xc9\x03\x63\x7f\x66\xee\xb1\x59\xf0\x23\x7b\ +\x4d\x80\xf4\x07\xd3\x13\xf6\x3b\xfc\x5b\x74\x49\xaa\xf4\x15\x59\ +\xf8\xf6\x6a\x3f\x63\x26\x83\x44\x52\x77\x21\xcb\x3b\x64\x93\xf0\ +\x76\x6e\x30\x3d\x71\xa3\x05\x03\xbf\x5a\xb7\xd1\x96\xd3\xdf\xb5\ +\x14\x98\x1e\x2a\xd9\xe4\x11\xbf\xbb\x21\xc8\x83\x35\x2e\xac\xee\ +\x69\x54\x29\x85\x4e\x0e\x43\x17\x48\xc6\x6b\x78\xbd\x7d\x9a\xe1\ +\x33\x09\xb2\x17\x53\xcd\x89\xfd\xc3\x7f\x02\xde\x03\x2e\x2f\x54\ +\xfe\xba\x01\x00\x0a\xee\x0a\x0c\x6a\x0a\x3b\x33\x1e\x91\xfb\xcb\ +\xaa\xd9\xe8\xf7\x32\x20\x27\x99\x4d\xea\x2e\xdd\x6e\x79\x44\x74\ +\xca\x8d\xb9\x48\x32\xfe\x99\x49\x8f\x3c\x22\x05\xbf\x27\xfe\x56\ +\x34\x84\xbd\xee\x32\x5b\x51\xcd\xe6\x42\x7e\xb8\xce\x47\xc3\x6a\ +\x13\xa2\x2d\x8d\x26\x28\xe8\x64\xd1\x75\x9d\xd9\x68\x25\xfb\xce\ +\x27\x19\x6a\x4e\x90\xb9\x98\x6e\x9d\xd9\xd7\xff\x02\x73\x77\x7e\ +\x64\x31\xf2\x37\x0c\x90\x6e\x1e\xef\xb7\x6f\x0c\xee\xd0\x4c\x52\ +\xc8\xe1\xcb\x70\x5f\xc9\x03\xac\x72\xa6\x19\x92\x52\x24\x53\x38\ +\x0c\x93\x69\x87\xe8\x92\xfe\x1b\xc2\xff\x8b\x0d\xb5\x4e\xf7\xc4\ +\x11\x93\x55\x7e\x34\xb0\xc1\x29\x6e\xd9\x58\xc8\xf6\xb5\x5e\x8a\ +\xfd\x32\x82\x9c\x43\x63\x4e\x5e\xd3\x35\x66\x62\x25\xbc\xd1\x91\ +\x66\xe0\xa3\x24\xe9\x4b\xe9\xce\xa9\xfd\xfd\x7f\xc0\x30\x8e\x02\ +\x83\x8b\x95\xbf\x61\x00\x80\x82\x0d\xa1\x84\x96\x93\xb6\xe7\xfc\ +\x02\xf5\x01\x99\x3a\xcf\xd7\x08\x16\x4c\x31\x24\x65\x48\xa5\x05\ +\x07\xa2\xf5\x61\xc1\x69\x69\xf4\x3d\x54\xfd\x23\x49\x10\xdf\x74\ +\xac\xb2\x94\x97\xdf\xe1\x60\x5b\x83\x9b\x7b\xd7\xf8\x71\x3a\x44\ +\x34\x21\x8b\x86\x82\x46\x16\x55\xcf\x33\x19\xf5\x71\xa0\x5d\xa1\ +\xbf\x49\x41\x89\x64\x7a\xa6\x0e\xf4\x3e\x67\xe4\xf5\x63\xc0\xad\ +\x9d\x70\x9f\x17\x20\x55\x75\x5f\xb7\x53\x9a\x7a\x22\x6f\x11\x9d\ +\x85\x81\x24\xb5\xde\x0a\x8a\xec\xab\xf0\x17\x4c\x33\x2c\x2a\x64\ +\x52\x82\x43\xb4\xda\x76\x9a\xac\xf2\xf7\x3d\xeb\xac\xf2\x9d\x9b\ +\xec\x6c\xaf\xf7\x71\x5b\x89\x0f\xd9\xac\xa3\x31\x4f\xde\xc8\x31\ +\x11\x73\x71\xb0\x3d\xcf\x60\x53\x0e\x65\x40\x19\x1e\x3f\xd8\xfb\ +\xbc\x9e\x56\x8f\x01\x3d\xb7\x2a\xff\xb9\x01\xe8\xee\x36\x9c\xeb\ +\x8b\x44\x43\x95\xb6\xaa\x7e\x81\xea\x80\x80\xcb\xea\xc2\x6f\xf7\ +\xe3\xb3\x27\x18\x11\x73\x64\x55\xd1\x14\x6c\xb0\xf0\xc0\xed\x76\ +\xb6\xd6\x95\x12\xf2\x38\xd0\xc5\xdc\x55\xf2\x59\x62\x51\x3b\x87\ +\xda\x35\x06\x5a\x54\xd2\x61\x65\x64\xfc\xcd\x0b\xbf\xd7\x66\xb3\ +\x8d\xc0\x05\xc0\xf8\x72\x02\x00\xee\x6f\x54\x9c\x23\x21\xfc\x5c\ +\xb1\x89\x96\x50\x28\x45\xb9\x27\x00\xa2\x86\xb7\xc0\x85\xcb\x96\ +\x44\x76\xeb\xdc\x5f\xe7\x60\x73\x45\x09\x76\xab\x34\x4f\xfc\x53\ +\x79\x14\xe2\x71\x99\x77\x3a\x04\x22\x4d\x2a\xa9\x4b\xd9\xcb\xf1\ +\x43\x5d\x7b\xd4\x84\xf2\x4f\xa0\xfb\x8b\xca\xdf\x34\x40\xe2\xe3\ +\x61\xd5\x75\xdb\xaa\x10\xba\xe9\x6e\xd5\xab\xb3\x26\x20\x61\xb3\ +\xc8\x20\x68\xf8\x9d\x4e\x6a\x43\x05\x94\x7a\x5c\x88\x92\x3a\xf7\ +\x21\x9d\x27\xae\x91\x25\x1a\x13\x38\xd2\x2a\x13\x3e\xa3\x93\xee\ +\x55\xc7\xe3\xef\x74\x3e\x9b\x9f\x4a\x1f\x05\x3a\x96\x42\x1e\x16\ +\x50\xd4\xeb\x92\xfd\x69\x35\x2e\x64\x23\xfd\x70\x21\x3a\x4c\x8e\ +\x14\x79\x52\x18\x42\x1a\xb3\x59\x43\x15\x32\xa8\xa4\xc9\x93\x46\ +\x25\x83\x4a\x06\x8d\x2c\xc3\x51\x9d\xc6\x73\x12\x91\x56\x83\x4c\ +\x8f\x3e\x1d\x7f\xb7\xeb\x85\xdc\x44\xf2\x28\x70\x0e\xd0\x97\x42\ +\x1e\x16\x50\xd4\xcf\xb6\x47\x32\x85\x75\x65\xf5\x82\x61\x6a\xd0\ +\xbd\x79\x2a\x82\x60\x31\x1b\xe8\x7c\xf6\x59\xff\xdf\x50\x18\x89\ +\xea\x1c\x6f\x33\x13\x39\x2b\xa2\x5c\xd0\x67\xa3\xc7\xcf\xbf\xa8\ +\x5c\x9e\x6a\x04\xce\x00\xda\x52\xc9\xc3\x02\xdb\x2a\x82\x6c\x7b\ +\x52\x1d\x95\x8c\xc8\x80\x44\x5f\x2c\x4e\xfe\xd3\x5d\x98\x1b\x57\ +\xee\xfe\xdc\x18\x89\xab\xfc\xbb\xcd\x42\xf8\xac\x89\x4c\x97\x94\ +\x89\x9f\xea\x7a\x29\x33\x3a\xd1\x08\x34\x71\x55\x35\xb5\x14\x2c\ +\xa8\xad\x32\xdd\x71\x69\xc2\x53\x5b\xbd\x45\x10\xe5\x4a\xbd\x30\ +\x4f\x59\x71\x1e\xd9\x94\x9f\xb7\x0b\x73\x63\x6c\x5c\xe7\x44\xab\ +\x83\x70\xab\x05\xa5\x4b\xcc\xc6\x3e\x3a\xff\xd2\x6c\xff\xd8\x95\ +\x6a\x2a\xbf\xd4\xf2\xb0\x88\xc6\x96\xa0\x0a\x4f\x69\x03\x26\x06\ +\x86\x4d\xf4\x47\x53\x9f\xd9\x05\x95\x34\x23\xe3\x79\x4e\xb5\x16\ +\x10\x3e\x67\x25\xd7\x61\xca\xc5\x9a\xbb\x5e\x4e\x44\x86\xdf\x66\ +\xae\x8e\xbd\xa6\x14\x5c\x2a\x16\xdc\xd8\x9a\xbc\x78\x69\xc0\x57\ +\x55\xb7\x03\x59\x0a\x19\x85\x39\xca\x4a\x52\x88\x72\x16\x8d\x1c\ +\xd1\x49\xf8\xb0\xc5\xc3\xa5\x36\x27\xf9\x76\x8b\x1a\x3d\xd7\xb9\ +\x77\xba\x37\xfc\x0f\xe0\x04\x57\xb5\x41\x96\x9a\x45\xb5\x16\x05\ +\x95\x67\xb4\x88\x95\xa1\x21\x1b\x03\x51\x8d\x3c\x29\xa2\x53\x2a\ +\x1f\x9e\x75\xd1\xd7\xee\x24\xdf\x6a\xd7\xc7\x3b\x3e\x79\x63\xf2\ +\x93\xde\x2b\xf2\x37\x2c\x05\x97\x8a\x45\x05\xb8\xb8\x79\xd3\x7e\ +\x63\x96\xc1\x74\xd8\x4e\x4f\xd8\x4a\x74\x4a\xa3\xe9\xac\x8f\x70\ +\x9b\x17\xad\xa5\xc0\x98\xbc\xd0\x73\x30\xd6\xdd\x79\x90\x39\xf9\ +\x6b\x1a\xb1\x5f\x06\x8b\xeb\x8d\x9e\x38\x61\x04\xca\xd7\xca\x62\ +\xd6\xfa\x40\xce\xaf\x33\x99\x30\x13\x69\x0b\xa1\x35\x3b\x99\xe8\ +\x0d\xbf\x3d\xda\xd1\xf2\x06\x73\xd5\xd4\xf4\x97\x62\x7b\x1d\x16\ +\xdd\x9d\x0e\xe6\x1c\xcf\x19\x53\xf2\x54\xb2\xcf\xc5\x40\x47\x08\ +\xbd\xd9\xcd\x4c\xdf\xd0\xd1\x91\xf6\x8f\xf7\xb3\x88\x52\x70\xa9\ +\x58\x74\x77\xba\xbf\xbf\x4d\xf5\x97\x54\xe7\xa4\x89\xc2\xad\x44\ +\xec\x24\x86\x86\x4f\x46\xce\x1d\xdf\xcb\x9c\x7c\x74\xe9\x15\x3f\ +\x9f\x5b\xfe\x83\xc3\x13\x28\xbb\x37\x97\xcf\xde\x95\x9a\x8e\x0e\ +\x30\x77\x54\x8e\x2d\x9d\xd6\x0a\x2b\xac\xb0\xc2\x0a\xff\x27\xfe\ +\x03\x72\x48\xe3\xb0\x1d\x11\x42\x9d\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x0a\xc2\ +\x73\ +\x61\x76\x65\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\ +\xa0\x87\xe7\xad\xbe\xe4\xbf\x9d\xe5\xad\x98\xe5\x88\xb0\xe5\x85\ +\xb6\xe4\xbb\x96\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x63\x68\x61\x6e\ +\x67\x65\x53\x61\x76\x65\x44\x69\x72\x3d\xe6\x94\xb9\xe5\x8f\x98\ +\xe5\xad\x98\xe6\x94\xbe\xe7\x9b\xae\xe5\xbd\x95\x0d\x0a\x6f\x70\ +\x65\x6e\x46\x69\x6c\x65\x3d\xe6\x89\x93\xe5\xbc\x80\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\ +\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\ +\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x72\x65\ +\x73\x65\x74\x41\x6c\x6c\x3d\xe9\x87\x8d\xe7\xbd\xae\xe7\x95\x8c\ +\xe9\x9d\xa2\xe4\xb8\x8e\xe4\xbf\x9d\xe5\xad\x98\xe5\x9c\xb0\xe5\ +\x9d\x80\x0d\x0a\x63\x72\x74\x42\x6f\x78\x3d\xe7\x9f\xa9\xe5\xbd\ +\xa2\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x63\x72\x74\x42\x6f\x78\x44\ +\x65\x74\x61\x69\x6c\x3d\xe5\x88\x9b\xe5\xbb\xba\xe4\xb8\x80\xe4\ +\xb8\xaa\xe6\x96\xb0\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\ +\x64\x75\x70\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\xe5\xa4\x8d\ +\xe5\x88\xb6\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x76\x65\x72\x69\x66\ +\x79\x49\x6d\x67\x3d\xe9\xaa\x8c\xe8\xaf\x81\xe5\x9b\xbe\xe5\x83\ +\x8f\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x94\xbe\xe5\xa4\xa7\x0d\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\ +\x67\x44\x65\x74\x61\x69\x6c\x3d\xe9\xaa\x8c\xe8\xaf\x81\xe5\x9b\ +\xbe\xe5\x83\x8f\x0d\x0a\x73\x61\x76\x65\x44\x65\x74\x61\x69\x6c\ +\x3d\xe4\xbf\x9d\xe5\xad\x98\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x6f\x70\x65\x6e\x46\x69\x6c\x65\x44\x65\x74\ +\x61\x69\x6c\x3d\xe6\x89\x93\xe5\xbc\x80\xe5\x9b\xbe\xe5\x83\x8f\ +\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x66\x69\x74\x57\x69\x64\x74\x68\ +\x44\x65\x74\x61\x69\x6c\x3d\xe8\xb0\x83\xe6\x95\xb4\xe5\xae\xbd\ +\xe5\xba\xa6\xe9\x80\x82\xe5\xba\x94\xe5\x88\xb0\xe7\xaa\x97\xe5\ +\x8f\xa3\xe5\xae\xbd\xe5\xba\xa6\x0d\x0a\x74\x75\x74\x6f\x72\x69\ +\x61\x6c\x3d\x50\x61\x64\x64\x6c\x65\x4f\x43\x52\xe5\x9c\xb0\xe5\ +\x9d\x80\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x3d\xe7\xbc\ +\x96\xe8\xbe\x91\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x6f\x70\x65\x6e\ +\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x65\x74\x61\x69\x6c\ +\x3d\xe6\x89\x93\xe5\xbc\x80\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x71\x75\x69\x74\x3d\xe9\x80\x80\xe5\x87\xba\ +\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\ +\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe5\xa1\xab\ +\xe5\x85\x85\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x63\x6c\x6f\x73\x65\ +\x43\x75\x72\x44\x65\x74\x61\x69\x6c\x3d\xe5\x85\xb3\xe9\x97\xad\ +\xe5\xbd\x93\xe5\x89\x8d\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x63\x6c\ +\x6f\x73\x65\x43\x75\x72\x3d\xe5\x85\xb3\xe9\x97\xad\xe6\x96\x87\ +\xe4\xbb\xb6\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\xe5\ +\x88\xa0\xe9\x99\xa4\xe5\x9b\xbe\xe5\x83\x8f\x0d\x0a\x64\x65\x6c\ +\x65\x74\x65\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\xa0\ +\xe9\x99\xa4\xe5\xbd\x93\xe5\x89\x8d\xe5\x9b\xbe\xe5\x83\x8f\x0d\ +\x0a\x66\x69\x74\x57\x69\x6e\x3d\xe8\xb0\x83\xe6\x95\xb4\xe5\x88\ +\xb0\xe7\xaa\x97\xe5\x8f\xa3\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x64\ +\x65\x6c\x42\x6f\x78\x3d\xe5\x88\xa0\xe9\x99\xa4\xe9\x80\x89\xe6\ +\x8b\xa9\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x62\x6f\x78\ +\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\ +\xe9\x80\x89\xe6\x8b\xa9\xe7\xba\xbf\xe6\xa1\x86\xe9\xa2\x9c\xe8\ +\x89\xb2\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\x65\ +\x3d\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x72\ +\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\x87\ +\x8d\xe7\xbd\xae\xe6\x89\x80\xe6\x9c\x89\xe8\xae\xbe\xe5\xae\x9a\ +\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x94\xbe\xe5\xa4\xa7\xe7\x94\xbb\xe9\x9d\xa2\x0d\x0a\x73\x61\ +\x76\x65\x3d\xe4\xbf\x9d\xe5\xad\x98\x0d\x0a\x73\x61\x76\x65\x41\ +\x73\x3d\xe5\x8f\xa6\xe5\xad\x98\xe4\xb8\xba\x0d\x0a\x66\x69\x74\ +\x57\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe7\xbc\xa9\xe6\x94\xbe\ +\xe5\x88\xb0\xe5\xbd\x93\xe5\x89\x8d\xe7\xaa\x97\xe5\x8f\xa3\xe5\ +\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x6f\x70\x65\x6e\x44\x69\x72\x3d\xe6\ +\x89\x93\xe5\xbc\x80\xe7\x9b\xae\xe5\xbd\x95\x0d\x0a\x63\x6f\x70\ +\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\x67\x3d\xe5\xa4\ +\x8d\xe5\x88\xb6\xe5\xbd\x93\xe5\x89\x8d\xe5\x9b\xbe\xe5\x83\x8f\ +\xe4\xb8\xad\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\xe4\xb8\xaa\xe8\ +\xbe\xb9\xe7\x95\x8c\xe6\xa1\x86\x0d\x0a\x73\x68\x6f\x77\x48\x69\ +\x64\x65\x3d\xe6\x98\xbe\xe7\xa4\xba\x2f\xe9\x9a\x90\xe8\x97\x8f\ +\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\ +\x76\x65\x46\x6f\x72\x6d\x61\x74\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe5\ +\xad\x98\xe5\x82\xa8\xe6\xa0\xbc\xe5\xbc\x8f\x0d\x0a\x73\x68\x61\ +\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x3d\xe5\xa1\xab\xe5\ +\x85\x85\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x71\x75\x69\x74\x41\x70\ +\x70\x3d\xe9\x80\x80\xe5\x87\xba\xe7\xa8\x8b\xe5\xba\x8f\x0d\x0a\ +\x64\x75\x70\x42\x6f\x78\x3d\xe5\xa4\x8d\xe5\x88\xb6\xe5\x8c\xba\ +\xe5\x9d\x97\x0d\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\ +\x6c\x3d\xe5\x88\xa0\xe9\x99\xa4\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\ +\x7a\x6f\x6f\x6d\x69\x6e\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe7\x94\xbb\ +\xe9\x9d\xa2\x0d\x0a\x69\x6e\x66\x6f\x3d\xe4\xbf\xa1\xe6\x81\xaf\ +\x0d\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\ +\x3d\xe5\xbc\x80\xe5\x90\xaf\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x70\ +\x72\x65\x76\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8a\ +\xe4\xb8\x80\xe4\xb8\xaa\xe5\x9b\xbe\xe5\x83\x8f\x0d\x0a\x66\x69\ +\x74\x57\x69\x64\x74\x68\x3d\xe7\xbc\xa9\xe6\x94\xbe\xe5\x88\xb0\ +\xe8\xb7\x9f\xe5\xbd\x93\xe5\x89\x8d\xe7\x94\xbb\xe9\x9d\xa2\xe4\ +\xb8\x80\xe6\xa0\xb7\xe5\xae\xbd\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\ +\x74\x3d\xe7\xbc\xa9\xe5\xb0\x8f\xe7\x94\xbb\xe9\x9d\xa2\x0d\x0a\ +\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\x6e\x6e\x6f\x74\ +\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe4\ +\xbf\x9d\xe5\xad\x98\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\xe4\xbb\ +\xb6\xe7\x9a\x84\xe9\xa2\x84\xe8\xae\xbe\xe7\x9b\xae\xe5\xbd\x95\ +\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\ +\xe4\xb8\x8b\xe4\xb8\x80\xe4\xb8\xaa\xe5\x9b\xbe\xe5\x83\x8f\x0d\ +\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\x65\x44\x65\x74\ +\x61\x69\x6c\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe5\x88\xb0\xe5\x8e\x9f\ +\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x70\x72\x65\x76\x49\ +\x6d\x67\x3d\xe4\xb8\x8a\xe4\xb8\x80\xe5\xbc\xa0\x0d\x0a\x74\x75\ +\x74\x6f\x72\x69\x61\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe6\x98\xbe\ +\xe7\xa4\xba\xe7\xa4\xba\xe8\x8c\x83\xe5\x86\x85\xe5\xae\xb9\x0d\ +\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\ +\xe5\xbd\xa2\xe7\x8a\xb6\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\xe8\ +\x89\xb2\x0d\x0a\x62\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\ +\x3d\xe5\x8c\xba\xe5\x9d\x97\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\ +\xe8\x89\xb2\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x44\x65\ +\x74\x61\x69\x6c\x3d\xe4\xbf\xae\xe6\x94\xb9\xe5\xbd\x93\xe5\x89\ +\x8d\xe6\x89\x80\xe9\x80\x89\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\ +\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x3d\ +\xe4\xb8\x8b\xe4\xb8\x80\xe5\xbc\xa0\x0d\x0a\x75\x73\x65\x44\x65\ +\x66\x61\x75\x6c\x74\x4c\x61\x62\x65\x6c\x3d\xe4\xbd\xbf\xe7\x94\ +\xa8\xe9\xa2\x84\xe8\xae\xbe\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x75\ +\x73\x65\x44\x69\x66\x66\x69\x63\x75\x6c\x74\x3d\xe6\x9c\x89\xe9\ +\x9a\xbe\xe5\xba\xa6\xe7\x9a\x84\x0d\x0a\x62\x6f\x78\x4c\x61\x62\ +\x65\x6c\x54\x65\x78\x74\x3d\xe5\x8c\xba\xe5\x9d\x97\xe7\x9a\x84\ +\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x6c\x61\x62\x65\x6c\x73\x3d\xe6\ +\xa0\x87\xe7\xad\xbe\x0d\x0a\x61\x75\x74\x6f\x53\x61\x76\x65\x4d\ +\x6f\x64\x65\x3d\xe8\x87\xaa\xe5\x8a\xa8\xe4\xbf\x9d\xe5\xad\x98\ +\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x73\x69\x6e\x67\x6c\x65\x43\x6c\ +\x73\x4d\x6f\x64\x65\x3d\xe5\x8d\x95\xe4\xb8\x80\xe7\xb1\xbb\xe5\ +\x88\xab\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x64\x69\x73\x70\x6c\x61\ +\x79\x4c\x61\x62\x65\x6c\x3d\xe6\x98\xbe\xe7\xa4\xba\xe7\xb1\xbb\ +\xe5\x88\xab\x0d\x0a\x66\x69\x6c\x65\x4c\x69\x73\x74\x3d\xe6\x96\ +\x87\xe4\xbb\xb6\xe5\x88\x97\xe8\xa1\xa8\x0d\x0a\x66\x69\x6c\x65\ +\x73\x3d\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x61\x64\x76\x61\x6e\x63\ +\x65\x64\x4d\x6f\x64\x65\x3d\xe4\xb8\x93\xe5\xae\xb6\xe6\xa8\xa1\ +\xe5\xbc\x8f\x0d\x0a\x61\x64\x76\x61\x6e\x63\x65\x64\x4d\x6f\x64\ +\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\x87\xe6\x8d\xa2\xe5\x88\ +\xb0\xe4\xb8\x93\xe5\xae\xb6\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x73\ +\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x98\xbe\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe5\x8c\xba\xe5\ +\x9d\x97\x0d\x0a\x68\x69\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\ +\x74\x61\x69\x6c\x3d\xe9\x9a\x90\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\ +\x89\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x61\x6e\x6e\x6f\x50\x61\x6e\ +\x65\x6c\x3d\xe6\xa0\x87\xe6\xb3\xa8\xe9\x9d\xa2\xe6\x9d\xbf\x0d\ +\x0a\x61\x6e\x6e\x6f\x3d\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x61\x64\ +\x64\x4e\x65\x77\x42\x62\x6f\x78\x3d\xe6\x96\xb0\xe6\xa1\x86\x0d\ +\x0a\x72\x65\x4c\x61\x62\x65\x6c\x3d\xe9\x87\x8d\xe6\xa0\x87\xe6\ +\xb3\xa8\x0d\x0a\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\ +\xe9\x80\x89\xe6\x8b\xa9\xe6\xa8\xa1\xe5\x9e\x8b\x0d\x0a\x74\x69\ +\x70\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\xe9\x80\x89\ +\xe6\x8b\xa9\x4f\x43\x52\xe6\xa8\xa1\xe5\x9e\x8b\x0d\x0a\x49\x6d\ +\x61\x67\x65\x52\x65\x73\x69\x7a\x65\x3d\xe5\x9b\xbe\xe7\x89\x87\ +\xe7\xbc\xa9\xe6\x94\xbe\x0d\x0a\x49\x52\x3d\xe5\x9b\xbe\xe7\x89\ +\x87\xe7\xbc\xa9\xe6\x94\xbe\x0d\x0a\x61\x75\x74\x6f\x52\x65\x63\ +\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x3d\xe8\x87\xaa\xe5\x8a\xa8\xe6\ +\xa0\x87\xe6\xb3\xa8\x0d\x0a\x72\x65\x52\x65\x63\x6f\x67\x6e\x69\ +\x74\x69\x6f\x6e\x3d\xe9\x87\x8d\xe6\x96\xb0\xe8\xaf\x86\xe5\x88\ +\xab\x0d\x0a\x6d\x66\x69\x6c\x65\x3d\xe6\x96\x87\xe4\xbb\xb6\x0d\ +\x0a\x6d\x65\x64\x69\x74\x3d\xe7\xbc\x96\xe8\xbe\x91\x0d\x0a\x6d\ +\x76\x69\x65\x77\x3d\xe8\xa7\x86\xe5\x9b\xbe\x0d\x0a\x6d\x68\x65\ +\x6c\x70\x3d\xe5\xb8\xae\xe5\x8a\xa9\x0d\x0a\x69\x63\x6f\x6e\x4c\ +\x69\x73\x74\x3d\xe7\xbc\xa9\xe7\x95\xa5\xe5\x9b\xbe\x0d\x0a\x64\ +\x65\x74\x65\x63\x74\x69\x6f\x6e\x42\x6f\x78\x70\x6f\x73\x69\x74\ +\x69\x6f\x6e\x3d\xe6\xa3\x80\xe6\xb5\x8b\xe6\xa1\x86\xe4\xbd\x8d\ +\xe7\xbd\xae\x0d\x0a\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\ +\x52\x65\x73\x75\x6c\x74\x3d\xe8\xaf\x86\xe5\x88\xab\xe7\xbb\x93\ +\xe6\x9e\x9c\x0d\x0a\x63\x72\x65\x61\x74\x50\x6f\x6c\x79\x67\x6f\ +\x6e\x3d\xe5\x9b\x9b\xe7\x82\xb9\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\ +\x64\x72\x61\x77\x53\x71\x75\x61\x72\x65\x73\x3d\xe6\xad\xa3\xe6\ +\x96\xb9\xe5\xbd\xa2\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x73\x61\x76\ +\x65\x52\x65\x63\x3d\xe4\xbf\x9d\xe5\xad\x98\xe8\xaf\x86\xe5\x88\ +\xab\xe7\xbb\x93\xe6\x9e\x9c\x0d\x0a\x74\x65\x6d\x70\x4c\x61\x62\ +\x65\x6c\x3d\xe5\xbe\x85\xe8\xaf\x86\xe5\x88\xab\x0d\x0a\x73\x74\ +\x65\x70\x73\x3d\xe6\x93\x8d\xe4\xbd\x9c\xe6\xad\xa5\xe9\xaa\xa4\ +\x0d\x0a\x63\x68\x6f\x73\x65\x4d\x6f\x64\x65\x6c\x4c\x67\x3d\xe9\ +\x80\x89\xe6\x8b\xa9\xe6\xa8\xa1\xe5\x9e\x8b\xe8\xaf\xad\xe8\xa8\ +\x80\x0d\x0a\x63\x61\x6e\x63\x65\x6c\x3d\xe5\x8f\x96\xe6\xb6\x88\ +\x0d\x0a\x6f\x6b\x3d\xe7\xa1\xae\xe8\xae\xa4\x0d\x0a\x61\x75\x74\ +\x6f\x6c\x61\x62\x65\x6c\x69\x6e\x67\x3d\xe8\x87\xaa\xe5\x8a\xa8\ +\xe6\xa0\x87\xe6\xb3\xa8\xe4\xb8\xad\x0d\x0a\x68\x69\x64\x65\x42\ +\x6f\x78\x3d\xe9\x9a\x90\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\x89\xe6\ +\xa0\x87\xe6\xb3\xa8\x0d\x0a\x73\x68\x6f\x77\x42\x6f\x78\x3d\xe6\ +\x98\xbe\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe6\xa0\x87\xe6\xb3\ +\xa8\ +\x00\x00\x0b\xe1\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\ +\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\ +\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x07\x74\x49\x4d\x45\x07\xe1\x0a\x1f\x04\x05\x06\xc0\x1b\xc4\ +\x43\x00\x00\x0a\xe5\x49\x44\x41\x54\x68\xde\xcd\x5a\x6b\x90\x54\ +\xc5\x15\xfe\x4e\xdf\x3b\x77\x66\x76\x96\x9d\x65\x67\x71\x51\x79\ +\x49\x10\xe5\x21\x28\x02\x0a\x18\x5c\x65\x92\xd2\x98\x94\x86\x94\ +\x92\x68\x48\x7e\x04\x1f\x10\x30\xbb\x1b\x2b\x65\xa5\x7c\x96\x29\ +\xab\xcc\x43\x17\xe5\x51\x25\x8f\xca\x8f\x18\x63\x02\x3e\x10\x9f\ +\x59\x17\x6a\x85\x22\x20\x2a\x06\x70\x05\x04\x91\xa7\x60\xf6\x31\ +\x3b\xbb\x3b\x33\xf7\xde\xee\x93\x1f\x73\x67\xf6\xce\x9d\x3b\x0b\ +\x05\x04\x73\xfe\xf4\xd6\xdc\x73\xba\x4f\x9f\xaf\xcf\xe9\xaf\xbb\ +\x97\xe2\xf1\x5a\x81\x42\x21\x00\xec\xb4\x0a\x80\xf0\x69\xd9\xa5\ +\xf7\x4d\xda\xb2\x70\x19\x0b\xa7\x75\xff\xad\x39\xdf\x4b\xb5\xe2\ +\x9b\xb6\x75\x4f\xc0\xdd\x96\x8a\x0c\xbb\x22\xe2\xfe\xfd\x9b\xb2\ +\x65\x3d\x07\x45\x89\x4e\x70\x1a\x9d\xf4\x27\x67\x6c\x9b\x4a\xa5\ +\x78\xf3\xe6\xad\x2a\xa7\x3b\x71\xe2\x38\x15\x8b\xc5\x34\x21\x84\ +\xbb\x4f\xd2\x5d\xf0\xfd\x5f\x38\xcf\xcc\xf8\xe2\x8b\xfd\x32\x1e\ +\xbf\x79\xc0\xd4\xa9\xd3\x26\x03\x18\x0a\xd0\x7f\x6c\xdb\xda\xd3\ +\xd9\xd9\x79\x70\xc7\x8e\xed\x5c\x53\x33\x38\xe7\xb3\x22\x27\x89\ +\xc5\xb9\x72\xe0\x6c\x6c\x2d\xcb\x42\x4f\x4f\xb7\x9a\x31\xe3\xfa\ +\x09\x9a\xa6\x3f\x08\xe0\x16\x00\x11\x00\x16\x80\xa3\xcc\xfc\x9a\ +\x94\xf2\xd9\x0d\x1b\xde\x39\x54\x53\x73\x21\x01\x60\x8a\xc7\x6b\ +\x35\x9f\x4e\xf3\x0e\x30\x33\x1d\x3b\x76\x4c\xb6\xb6\xee\xf3\x3a\ +\xe6\x75\xa8\xd4\xb7\xfe\x5a\xcc\x9c\x39\x5d\x33\x0c\x83\x3a\x3b\ +\x3b\x78\xe2\xc4\xab\xf5\x8a\x8a\xe8\x1c\x22\x7a\x14\xc0\xc8\x12\ +\xf3\x7c\xb5\xbb\x3b\xf9\xf3\x5d\xbb\x76\xf4\x94\x95\x45\x58\x77\ +\xa2\xa3\xf9\x39\x9f\x48\x74\x62\xd4\xa8\xcb\x30\x76\xec\x15\x97\ +\xdc\x74\xd3\xf7\xc7\x02\x18\x0e\x40\x47\x71\x89\x23\x00\x20\x02\ +\x98\x01\x22\x02\x33\x83\x88\x98\x99\x05\x11\x14\xb3\x6f\x59\x24\ +\x66\xfe\xf0\xbd\xf7\xde\xde\x34\x73\xe6\xac\x01\x86\x61\xfc\x86\ +\x88\xee\x77\xa2\xee\x27\x12\x40\x92\x59\x29\x91\xad\x3f\x94\x73\ +\xc6\x13\x1d\xe6\xcf\x3e\x6b\xe5\xd9\xb3\x7f\x7c\xb1\xa6\x69\xbf\ +\x24\xa2\x1f\x01\x18\x06\xc0\x38\xc5\xd2\x01\x51\xae\x25\x4f\xeb\ +\xab\xbe\x49\x29\xf9\x4e\x6d\xed\x77\x06\xe9\xba\xfe\x14\x11\xdd\ +\xe5\x09\xa6\x5b\x0e\x33\xf3\xe2\x4c\x26\xfd\xe7\x9d\x3b\x77\xa4\ +\xca\xcb\x07\x10\x00\xe5\x46\x20\x3f\x89\x4f\x3f\xdd\xc5\x77\xdc\ +\x31\x77\x82\x10\x62\x09\x80\x19\xa7\x72\xfa\x0c\x65\xab\x94\xf2\ +\x1e\x80\x12\x81\x80\xbe\x0c\xc0\x6d\xf0\xcf\x0f\x06\xf0\x9e\x52\ +\xf2\x91\x3d\x7b\x5a\xb7\xf5\xf4\x24\xe1\x38\x0f\x38\xd1\x2f\x40\ +\xe0\xc8\x91\x2f\x71\xfb\xed\x77\x0d\x15\x42\x2c\xfd\x1f\x3a\xdf\ +\xaa\x94\x5c\x08\xa0\x4d\xd3\xb4\x25\x00\x7e\x58\xc2\xf9\x0c\x80\ +\xe5\xa6\x69\xfe\xac\xb1\x71\xf1\xbf\x4c\x33\x43\x86\x11\x2c\xc8\ +\xb9\x02\x04\x94\x52\x34\x7a\xf4\x58\x08\xa1\x2d\x02\x30\xdd\x27\ +\x12\x49\xa7\x53\xaf\x9c\x6e\xd2\x0a\x00\x1d\x4a\xa9\x07\x6c\x5b\ +\xee\x35\x0c\xe3\x39\xc7\x79\x3f\x49\x32\xf3\x93\xdd\xdd\xc9\xe7\ +\x5e\x7f\xfd\xe5\x94\x53\x6c\xdc\xbe\xe4\x97\x50\x0e\x01\xd1\xdc\ +\xdc\x62\xdf\x7f\xff\xa2\x4b\x89\x68\xb6\xa7\xb3\x2e\x00\xcb\x95\ +\x92\xaf\x33\xa3\x2b\x9b\x98\xa4\x7c\x5a\x72\x12\x97\xb2\x6b\xbf\ +\xaf\x98\x65\xff\x20\x30\xab\x94\x69\x5a\x47\xc3\xe1\xf0\x23\x00\ +\xee\x2a\xe1\x7c\x82\x99\x7f\xdb\xdd\xdd\xbd\xaa\xab\x2b\xa1\xc6\ +\x8e\x1d\x2f\x7c\x9c\xcf\x23\xc0\x0e\x02\x0a\x00\x6b\x9a\x3e\x01\ +\xc0\x50\x4f\x87\xcf\x1d\x3a\xf4\xe5\xe3\x6b\xd6\xac\xb5\x2e\xb8\ +\xa0\x52\x58\x96\xc5\x81\x80\x4e\xa6\x69\xb1\x61\x04\xc8\x34\x6d\ +\x36\x0c\x9d\x6c\x5b\xb2\xa6\x69\xa4\x94\xca\xcf\x80\x99\x21\x84\ +\x20\x29\x25\x4b\x69\x53\x22\x91\x56\xf5\xf5\xf5\xf3\x88\x68\x11\ +\xfc\x13\xb6\x8b\x99\x1f\x4c\x24\x3a\x57\x47\xa3\x95\x73\x22\x91\ +\x48\xc7\x4b\x2f\xfd\x63\x7d\x3c\x5e\xab\xa3\x18\x4d\x99\xdb\x89\ +\x15\xb2\x25\x0d\x0d\x0d\x0d\x97\x20\x5b\x2a\x73\xd2\xae\x94\x7c\ +\x75\xcd\x9a\xb5\x96\xab\x13\xe1\x99\xb8\x70\xfd\x5e\x52\x9a\x9a\ +\x36\xda\x75\x75\x75\xd3\x88\xe8\x61\x00\x65\x3e\x2a\x69\x66\x7e\ +\xa2\xab\x2b\xb1\x3a\x1a\xad\xbc\x93\x88\x9e\x21\xa2\x46\x00\x6f\ +\xa0\xc4\xe6\x58\x90\xc0\x4e\xd4\x02\x9e\x4e\x53\xcc\x9c\x88\xc5\ +\x22\x02\x67\xb1\x3b\x1f\x3c\xb8\x5f\x2d\x58\x30\x7f\x90\x10\xe2\ +\x51\x64\x4b\xb2\x57\x14\x33\x2f\x4d\xa5\x7a\x97\x54\x54\x44\x6f\ +\x25\xa2\xdf\x03\xa8\x64\xe6\xb2\x12\xe3\x0a\xb8\xe8\x34\x3b\x08\ +\xf8\x46\x91\x99\x45\x5b\x5b\xcf\x19\x3b\xaf\x94\xe2\x9a\x9a\x0b\ +\x45\x28\x14\x9e\x07\x20\x5e\x42\x6d\x5d\x26\x93\x79\x32\x14\x0a\ +\x5f\x43\x44\x7f\x00\x30\x08\x00\x88\xc8\x8b\x70\x6e\xdc\x3c\x02\ +\x40\x7e\x27\x25\x38\x1f\x0a\x84\x88\xb8\xa6\x26\x7a\xc6\xbc\xa8\ +\xb9\xb9\x85\xa7\x4c\x99\x7e\x15\x80\x05\xf0\x5f\xf7\xbb\xa5\x94\ +\x0f\x29\xa5\x58\x08\xf1\x38\xb2\x3b\x7e\x3e\x78\x28\xde\xf5\xf3\ +\xc1\x74\x23\x80\x2c\x00\xbe\x08\xd0\x89\x13\x09\x06\x20\x52\xa9\ +\x5e\xb5\x77\xef\x67\xdc\xd4\xb4\xd1\x6e\x6a\xda\xa8\x7a\x7a\xba\ +\x15\xb3\x42\x09\xe1\x4c\x26\x4d\xf7\xde\x7b\x4f\x58\x08\x51\x0f\ +\x60\x88\x8f\x4e\x92\x99\x7f\xd7\xd8\xd8\xb8\x5b\xd7\xf5\x0a\x78\ +\x0a\x08\x11\x95\x3c\x0b\xe4\x10\xc8\xd3\xe9\xd2\x08\x08\x35\x78\ +\x70\x25\x25\x93\x49\x79\xe9\xa5\x63\x82\xb3\x67\xcf\x99\x50\x57\ +\x57\x77\x5b\x5d\x5d\xdd\x77\x27\x4f\x9e\x36\x3c\x14\x2a\x63\xdb\ +\xb6\xbc\x47\x44\x06\x20\x5a\x5a\xb6\xd8\x65\x65\x65\x37\x03\xb8\ +\xb5\xc4\x24\xff\xd2\xd9\xd9\xf1\x4a\x24\x22\x84\xe3\x6c\x41\x3f\ +\x4e\x50\x4b\x1d\x82\x58\x78\x0d\x88\x8a\x97\x84\x52\x4a\x7c\xf5\ +\x55\xa7\x1a\x33\x66\x7c\xb8\xaa\x2a\xf6\x98\x10\x5a\x93\x10\xe2\ +\xef\x42\x88\xd7\x02\x81\xc0\x9b\xa3\x47\x8f\xb9\x73\xe0\xc0\x18\ +\x99\xa6\x99\x3f\xab\x02\xa0\xe3\xc7\x8f\xc8\xf9\xf3\xe7\x57\x13\ +\x89\x05\xf0\xaf\x3a\xbb\xa4\x94\x4f\xaf\x5f\xbf\xd6\x1a\x30\x20\ +\x0a\x66\x2e\x3a\x9b\x38\x41\x75\x17\x90\x82\xcf\xc2\xfd\x23\x33\ +\x67\xb7\x1c\x8f\xe4\x4e\x41\x91\x48\x79\x19\x80\x1b\x01\xc4\x90\ +\xad\x56\x41\x00\x97\x13\xd1\x33\x23\x46\x7c\xeb\x8e\x4c\x26\x03\ +\x29\x65\x1e\xe2\xdd\xbb\x3f\xe7\x70\x38\xfc\x3d\xf8\x53\x12\x93\ +\x99\x9f\x5e\xbc\x78\xf1\xfe\x09\x13\x26\x51\x45\x45\x05\x09\x71\ +\x4a\x04\xbc\x92\x4f\x90\xdc\x6c\x89\x8a\x69\x23\x29\xa5\x08\x00\ +\x3e\xfa\x68\x6b\x07\x33\x2f\x06\xd0\xe1\xd1\x89\x11\xd1\x1f\xa6\ +\x4f\x9f\x19\x6f\x69\x79\x9f\x99\x99\x13\x89\x0e\x2c\x5c\xb8\x30\ +\x46\x44\x77\xc3\x9f\xc5\x36\xa5\xd3\xa9\x57\x26\x4d\x1a\x2f\x88\ +\x88\xbe\xfe\xfa\x24\x3b\xe3\xf8\x21\xe0\x77\x8b\x91\x47\x20\xbf\ +\x8c\x38\x2b\xc5\xb3\x14\xc4\x55\x55\x65\x14\x08\x18\x7c\xe8\xd0\ +\xc1\xbf\x31\xf3\xc3\x00\xba\x3d\x7a\x17\x11\xd1\x1f\x17\x2d\xaa\ +\x1b\xbb\x7d\xfb\x16\xde\xb6\x6d\x87\x0c\x04\x02\xb7\x00\xb8\xc6\ +\x67\xe0\xa4\x52\x6a\xf9\xb2\x65\xcb\x3b\xab\xaa\xaa\x09\x00\xd7\ +\xd4\x5c\x48\x0e\xd2\x7e\x08\xe4\x26\x51\xf0\xc9\x8d\x40\x7e\x23\ +\xf3\x43\x80\x99\xa9\xbd\xbd\x97\x0d\xc3\xa0\xe3\xc7\x8f\xa8\xf6\ +\xf6\xb6\x95\xcc\xfc\x0c\x00\xdb\xa3\x3b\x5e\x08\xf1\xc4\xdc\xb9\ +\x77\x47\xef\xbb\xef\xde\x4a\x22\xfa\x29\x8a\x37\x46\x00\x78\xa7\ +\xb7\xb7\xa7\x79\xe6\xcc\x69\x79\x7a\x70\xf4\xe8\x21\xd5\x0f\x02\ +\x7e\x92\x4f\x8e\x7c\x82\x94\x42\x80\x88\x38\x12\x11\x04\x00\x65\ +\x65\x11\xfa\xe4\x93\xed\xb6\x69\x66\xfe\x04\x60\xad\x4f\xc7\x3f\ +\x08\x04\x8c\x79\x65\x65\x91\xeb\x50\xcc\x68\x81\x2c\xd7\x79\xfe\ +\xf9\xe7\x57\xa4\x82\xc1\x50\x3e\x5f\x86\x0c\x19\x26\x4a\x20\xe0\ +\xb7\x74\x72\x08\x90\x1f\x02\x45\x37\x66\xcc\x40\x2a\xd5\x57\x5d\ +\xab\xab\x2f\xa0\xa5\x4b\x97\x25\x95\x52\x8f\x01\xd8\xed\xd1\xd7\ +\x88\xe8\x57\x44\xf4\x18\xfc\x2b\x4f\x73\x32\xd9\xb5\x65\xda\xb4\ +\xc9\xb9\x02\xc2\x00\xc4\xe1\xc3\x25\x11\xe8\xf7\xc2\xc1\x8d\x80\ +\x70\x10\x10\x7e\xca\xca\xb3\x3b\xc4\xe3\xb5\xd4\xd8\xd8\xb8\x87\ +\x99\x9f\x02\x90\xf2\xd8\x5c\x0c\xe0\x6a\x9f\x81\x33\xcc\xea\xaf\ +\x2b\x56\xac\xec\x8e\x44\xca\x0b\xe8\xc1\x90\x21\xc3\x04\x91\xf0\ +\x8b\x76\x6e\xe4\x82\x12\xed\x46\x20\xdf\x89\x83\x80\x77\x23\x23\ +\x00\x5c\x5e\x5e\xc0\x00\x18\x00\x4d\x99\x72\x25\x75\x75\x25\x5e\ +\x45\x96\x2d\x9e\x8e\x7c\x68\x59\x76\xf3\xd4\xa9\x57\xb9\x59\xac\ +\x02\x40\x27\x4e\x1c\x63\x67\x1f\xf0\x4c\xa2\xe0\xfa\xd3\xcb\xc7\ +\x38\x07\x63\x8e\x4e\x97\x44\xa0\xbb\x5b\x16\x45\x20\x1a\xad\xd4\ +\x56\xae\x5c\x95\x54\x4a\x2d\x03\xd0\x7e\x1a\x13\x58\xb3\x64\xc9\ +\x92\xf6\x68\xb4\x12\xf0\xd0\x83\x41\x83\x06\xe7\x96\xaf\x27\x6b\ +\x49\x79\xc7\xc5\x29\xe8\xb4\x1f\xb1\xe1\x58\x2c\xe2\x7b\x57\x59\ +\x5b\x7b\x9d\x9e\x4c\x76\x6d\x01\xf0\xf6\x29\x9c\x3f\x6c\xdb\xf6\ +\xbb\xce\xdf\x45\xdc\x26\x91\xe8\x60\xa0\x18\x01\x27\xa0\x67\x47\ +\xa7\x01\xa6\x52\x74\x3a\x10\x08\xf0\xaa\x55\xab\x33\xcc\xfc\x02\ +\x80\xde\x7e\x26\xb0\xb1\xad\xed\xeb\x7d\x37\xdc\xf0\xed\xdc\xf2\ +\x29\xe0\x36\xe5\xe5\x03\xdc\x51\xee\x8b\xff\xf9\xa0\xd3\x93\x26\ +\x8d\x17\x99\x4c\x7a\x2b\x80\x8f\x4b\x38\x6f\x32\xf3\xba\x17\x5e\ +\x78\xd1\xd2\x34\xcd\xef\x56\x0f\xa6\x69\x02\x3e\x3b\xee\x39\xa7\ +\xd3\x7e\xd1\xab\xaa\xaa\xa6\x65\xcb\x96\xb7\x33\xf3\xbb\xf0\x97\ +\xfd\x96\x65\x6e\x1b\x38\x30\x4c\x80\xff\x39\x22\x7b\x9b\xd7\x17\ +\x4c\x77\xf0\x70\xae\xe8\x34\x4e\x71\x90\x51\x4a\xad\x03\x70\xa0\ +\xd8\x7f\xde\xf0\xf9\xe7\x7b\x8f\x4e\x9a\x34\xa5\x14\xab\x84\xae\ +\xeb\x38\x57\x74\xba\x08\x01\x87\x4e\xfb\x42\x9f\x93\x59\xb3\xae\ +\xd7\x5a\x5b\x77\xee\x54\x4a\xdd\x03\xe0\x4d\x00\xc7\x01\xb4\x01\ +\xf8\xa7\x52\xbc\x7c\xf7\xee\x1d\xec\xd4\x79\x5f\x6e\x90\x4a\xf5\ +\x9e\x33\x3a\x6d\x7a\x94\x0c\x4d\xd3\x82\xfd\x39\x9f\x1b\x48\x4a\ +\x49\xef\xbf\xdf\xbc\x21\x99\x4c\xfc\x44\x4a\x79\xa3\x6d\xdb\xf1\ +\x74\x3a\x3d\xa7\xa5\xa5\xb9\xf5\xb2\xcb\xc6\xf5\xf7\x0e\x81\xde\ +\xde\x1e\xe8\xba\x66\xc0\xc3\x5c\x99\xd9\xe2\xec\x91\xcf\x97\x4e\ +\x17\xdc\x4e\x13\x11\xea\xeb\xeb\x8f\xa2\x2f\x69\x80\x2c\x55\x8e\ +\x03\xd8\xb9\x6f\xdf\x1e\x94\x97\x0f\xe0\x40\x40\x27\x29\x15\x13\ +\x01\x44\x82\xa4\xb4\x39\x10\x08\x50\x3a\x9d\xe1\x70\x38\x44\xcd\ +\xcd\x4d\xc9\xfd\xfb\xbf\xdc\x53\x51\x11\xe6\xea\xea\x98\x08\x06\ +\x83\x68\x6b\x53\x64\x9a\xa6\xf2\xb3\xed\xed\xed\x45\x22\x61\xaa\ +\x86\x86\x86\x1b\x01\x0c\xf6\x38\x79\x94\x88\x10\x8f\xd7\xfa\xc6\ +\xcd\x7b\x3b\x4d\x52\xca\x7f\xeb\xba\xfe\x15\x80\x8b\x1c\x25\x41\ +\x44\x0f\xd4\xd7\xd7\xa7\xa5\xb4\xdf\x92\x52\xa5\x89\x72\x65\x17\ +\xce\x15\xba\x22\x22\xc1\xcc\x8a\x84\x10\x2c\xa5\x22\x4d\x13\xac\ +\x54\xdf\xef\x59\xbd\x6c\xae\x7a\x6d\x35\x4d\x37\x1a\x1a\x1a\xe2\ +\x44\xf4\x10\x0a\xef\xa4\xda\x94\x52\x1f\x95\x8a\x3e\x9c\x07\x8e\ +\xdc\xab\x20\xdb\xb6\x4d\xc3\x87\x5f\xa2\xc5\x62\x83\x96\x02\xf8\ +\x85\xc7\xc0\x74\xd6\x75\x0f\x7c\xaa\x01\xfc\x0f\x1c\xbe\x51\xf3\ +\xb1\x09\x21\xcb\x9f\x82\x1e\xdd\x17\x13\x89\xce\x79\xfb\xf6\xb5\ +\x9a\x86\x11\xf4\xeb\xab\xe0\x6e\x94\x74\x5d\xe7\xf5\xeb\x5f\xb6\ +\xe6\xce\xbd\xfb\x59\x21\xc4\x0c\x00\x97\xbb\x94\x0d\xb8\xae\x3b\ +\xce\x83\x1c\x50\x4a\x35\xae\x5a\xb5\xda\x7b\xb1\xeb\x46\x80\xb4\ +\x91\x23\x47\xc0\x35\x09\x31\x78\xf0\x45\xf8\xe0\x83\x2d\x27\x47\ +\x8f\x1e\xb3\x97\x88\xae\x45\xf6\xfc\x7b\xbe\xe5\x20\x33\xd7\xbf\ +\xf5\xd6\xba\x8d\x57\x5e\x39\x41\xf3\x39\xd4\xe4\x11\xd4\x46\x8e\ +\x1c\xe1\x7e\x3c\x56\x44\x44\x15\x15\x51\xb4\xb6\xee\x3c\x30\x7c\ +\xf8\xc8\x4d\x44\x14\x45\x16\xde\xf0\x79\x70\x3c\x01\xe0\x0d\xa5\ +\xd4\xaf\x37\x6f\x6e\xd9\x50\x5d\x1d\x13\x42\x14\xef\xab\x70\x2d\ +\xc3\xdc\x2b\x65\x11\x3f\x61\x66\x3e\x79\xf2\x04\x5f\x7b\xed\x75\ +\xe1\x48\x24\x72\x05\x91\xb8\x86\x88\x86\x02\x1c\x02\xf2\x57\xea\ +\x9c\xcf\xcc\xc2\x96\x00\x56\x7d\x07\x26\x16\x2e\x1b\x3f\x5b\x93\ +\x08\x47\x94\x52\x1f\xf4\xf4\xf4\x7c\xbc\x62\xc5\xca\xde\x59\xb3\ +\xae\xef\x37\xf2\x4e\xc0\x25\xb9\xd6\x97\x6f\x9d\xb7\x6d\x9b\x37\ +\x6e\xdc\xa4\x00\xf0\xa8\x51\xc3\x84\x65\x59\x1c\x0e\x87\x45\x3a\ +\x9d\x56\xa1\x50\x48\xa4\xd3\x69\x15\x0c\x06\x85\x65\x59\x2a\x10\ +\x08\x90\x94\x12\x44\x04\x22\x82\x52\x0a\x9a\xa6\xc1\xb2\x2c\x18\ +\x86\x81\x74\x3a\xc3\xa1\x50\xb0\xc0\x36\x14\x0a\x89\x03\x07\x0e\ +\x2b\xd3\xb4\x30\x6e\xdc\x68\x0c\x1c\x38\x50\x84\x42\xe1\x52\x55\ +\xc7\xcb\xc7\xe0\x7e\x27\x3e\x17\xef\xbf\x7e\x7d\x94\x7a\xa9\x39\ +\xdb\x77\x67\x01\x40\x0a\x1f\x05\x3f\xe3\xfe\x3a\x39\x53\xe7\xc5\ +\x59\x8e\x5b\x70\xa0\x01\xfa\x48\x5c\xee\xff\x13\x72\x2d\x7b\xbe\ +\x01\xd9\xf7\x5a\x77\xfb\x8d\xd9\xfe\x17\x5a\x62\x2e\xda\x22\x1b\ +\xb0\x80\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\ +\x72\x65\x61\x74\x65\x00\x32\x30\x31\x37\x2d\x31\x30\x2d\x33\x31\ +\x54\x31\x32\x3a\x30\x35\x3a\x30\x31\x2b\x30\x38\x3a\x30\x30\xff\ +\x8c\x2c\xfe\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\ +\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x37\x2d\x31\x30\x2d\x33\ +\x31\x54\x31\x32\x3a\x30\x35\x3a\x30\x31\x2b\x30\x38\x3a\x30\x30\ +\x8e\xd1\x94\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\ +\x00\x00\x04\x32\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x05\x06\xab\xd4\xb8\x1c\x00\x00\x03\xaf\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xcd\x4b\x63\x57\x14\xc0\x7f\xf7\x46\x13\ +\x34\x89\x93\x9a\x28\x88\x1f\x09\x8e\x8b\x6e\x9c\xea\xe0\xc6\x27\ +\xe8\x80\x6e\x82\x10\x19\xac\x4b\x75\xd1\x59\x64\xd3\x2e\x66\xe7\ +\x6a\x96\xb3\x18\x98\xbf\xa1\x9b\xa1\x8b\x30\x2e\x4a\x2b\x68\x57\ +\x82\xdf\xd2\x8e\x16\x41\x34\x7e\x4c\x05\xbf\x88\x08\xad\x21\xef\ +\xf3\xbe\xd7\x8d\x79\x38\x1d\xa3\xa5\xd8\x0b\x07\x0e\xe7\x1d\xce\ +\xef\x9e\x73\x38\xe7\x3e\xf8\x9f\x8f\xa8\xf4\x21\x9d\x4e\x67\x0a\ +\x85\xc2\x98\x69\x9a\x9a\xe3\x38\x6d\x4a\x29\x80\x23\x60\xe9\xd1\ +\xa3\x47\xb9\xf5\xf5\xf5\x1f\xff\x13\x60\x7c\x7c\xfc\xe9\xe6\xe6\ +\xe6\x5b\x29\xe5\xc0\xe0\xe0\x20\x4f\x9e\x3c\x21\x1e\x8f\xe3\xba\ +\x2e\x85\x42\x81\xb5\xb5\x35\x66\x67\x67\x71\x1c\x67\xbe\xb9\xb9\ +\xf9\xe5\xea\xea\xea\x6f\xff\x1a\xf0\xec\xd9\xb3\xcc\xe9\xe9\xe9\ +\x7b\x4d\xd3\xaa\x46\x47\x47\x69\x6c\x6c\xa4\xba\xba\x1a\x21\x04\ +\xae\xeb\x62\xdb\x36\x86\x61\x70\x72\x72\xc2\xbb\x77\xef\x58\x5e\ +\x5e\x76\x62\xb1\xd8\xe8\xfe\xfe\x7e\xc5\x6c\x02\x65\x65\x64\x64\ +\xe4\x69\x3e\x9f\xff\xe5\xf9\xf3\xe7\x55\x93\x93\x93\x24\x12\x09\ +\xa2\xd1\x28\xf5\xf5\xf5\x24\x12\x09\x1a\x1a\x1a\x88\xc7\xe3\x44\ +\x22\x11\x22\x91\x08\x9d\x9d\x9d\xe8\xba\x2e\x37\x36\x36\xc6\x5a\ +\x5a\x5a\x7e\xbe\xbc\xbc\x3c\xbd\x13\x60\x59\xd6\x0f\x9a\xa6\xb5\ +\xbf\x78\xf1\x82\x48\x24\x42\x2c\x16\xa3\xa1\xa1\x81\x48\x24\x42\ +\x28\x14\x22\x10\x08\x10\x08\x04\x08\x85\x42\x44\xa3\x51\xc2\xe1\ +\x30\x8f\x1f\x3f\x66\x77\x77\x57\xee\xed\xed\x7d\x69\x9a\xe6\xf7\ +\xb7\x01\x24\x40\x57\x57\x57\xc6\x75\xdd\x81\x89\x89\x09\x6a\x6b\ +\x6b\x89\xc5\x62\x24\x12\x09\x82\xc1\x20\x81\x40\x00\x29\x25\x52\ +\x4a\x1f\x22\xa5\x24\x1c\x0e\xd3\xde\xde\x4e\x36\x9b\xc5\xf3\xbc\ +\x81\xfa\xfa\xfa\x4c\x45\x40\xa1\x50\x18\xcb\x64\x32\x34\x35\x35\ +\x11\x0e\x87\xa9\xab\xab\x43\x08\x81\x94\x12\x21\xc4\x67\x72\x13\ +\xda\xd5\xd5\x45\x3a\x9d\x46\xd7\xf5\xb1\x8a\x00\xd3\x34\xb5\xbe\ +\xbe\x3e\x82\xc1\x20\xd1\x68\x14\x21\x04\x9e\xe7\xe1\x79\xde\x27\ +\xce\x65\xdb\x4d\xbb\x10\x82\xa1\xa1\x21\x94\x52\xda\x6d\x80\x2a\ +\x00\xa5\x54\x5b\x6b\x6b\x2b\xa1\x50\xc8\x0f\x3e\x3c\x3c\xec\x07\ +\xb8\x0d\x90\xcb\xe5\x7c\xbd\xa3\xa3\x03\xa0\xed\x2e\x00\x42\x08\ +\xaa\xaa\xaa\x50\x4a\xa1\x94\xc2\xf3\x3c\x1f\x76\x1b\x40\x29\x85\ +\x6d\xdb\x38\x8e\x83\x6d\xdb\x9f\x65\xfb\x4f\xc0\xd1\xe1\xe1\x61\ +\x7b\x73\x73\x33\xb6\x6d\x23\x84\x60\x7a\x7a\xda\xaf\x75\x39\xb8\ +\xeb\xba\x38\x8e\x83\x52\x0a\xc3\x30\xb0\x6d\x1b\xcb\xb2\xd8\xd9\ +\xd9\x41\x29\x75\x54\xb1\x07\x9e\xe7\x2d\xcd\xcd\xcd\x61\x18\x06\ +\x96\x65\x61\x9a\x26\x96\x65\xf9\x7a\x59\xca\x36\xc3\x30\xd0\x75\ +\xdd\xb7\xcf\xce\xce\xe2\xba\xee\x52\x45\x80\x94\x32\x97\xcb\xe5\ +\xc8\xe7\xf3\xe8\xba\x4e\xa9\x54\x42\xd7\xf5\x4f\xc4\x34\x4d\x4a\ +\xa5\x92\x2f\xa6\x69\xa2\xeb\x3a\xdb\xdb\xdb\xcc\xcc\xcc\x00\xe4\ +\x2a\x0e\x9a\x65\x59\x86\x10\xa2\xfb\xe0\xe0\x20\x35\x38\x38\x88\ +\xeb\xba\x58\x96\xe5\xaf\x07\xcb\xb2\xb0\x6d\xdb\xcf\xa2\x0c\x2b\ +\x16\x8b\xbc\x7a\xf5\x8a\xb3\xb3\xb3\x79\x60\xea\xae\x49\xfe\x53\ +\x4a\xf9\xfb\xf1\xf1\xf1\x37\xe7\xe7\xe7\xb2\xbb\xbb\xdb\x6f\x5e\ +\x39\xa8\xae\xeb\x7e\x79\x4a\xa5\x12\x57\x57\x57\xbc\x79\xf3\x86\ +\xe5\xe5\x65\x07\xf8\x0e\xc8\xdf\xb9\x2a\x5c\xd7\x0d\x0a\x21\xe6\ +\x77\x76\x76\xc6\x3e\x7c\xf8\x20\x5b\x5b\x5b\xa9\xa9\xa9\xf1\x83\ +\x97\xeb\x5d\x2c\x16\xd9\xda\xda\xe2\xf5\xeb\xd7\xac\xac\xac\x38\ +\x40\x09\xf8\x1a\xb8\x04\x7e\xbd\x6f\x5d\x27\x81\xb8\x10\xe2\xad\ +\x94\x72\xa0\xbf\xbf\x9f\xde\xde\x5e\x52\xa9\x14\x00\xfb\xfb\xfb\ +\x2c\x2e\x2e\xb2\xb0\xb0\x00\x30\x0f\xbc\x04\xde\x03\x5f\x5c\x5f\ +\xf6\x02\xf8\x16\xf8\xe9\xbe\x07\x27\x09\x7c\x05\x8c\x01\xda\x8d\ +\x21\x3a\x02\x96\xae\x1b\x7a\x01\x1c\x03\xa4\x52\xa9\x2d\x40\x7c\ +\xfc\xf8\x51\x02\x36\x90\xbe\xf6\xbb\xf7\x24\xef\x90\x9b\x3e\x17\ +\xd9\x6c\xd6\xee\xe9\xe9\xd1\x81\xbf\xae\xcb\x96\x7c\xc8\xa7\x37\ +\x09\x5c\x4d\x4d\x4d\x29\x4d\xd3\x1c\xe0\x0a\x28\x3e\x24\xa4\x9c\ +\x95\x91\xcd\x66\xed\x64\x32\x69\x3f\x34\xe0\x26\xe4\x14\x50\xc0\ +\x00\x90\x14\x0f\xfc\x97\x72\xf3\xc6\x7f\x00\xfc\x0d\x91\xe4\x07\ +\x58\x63\x81\xe3\x00\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x05\x55\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\ +\xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd3\x01\x09\x0a\x09\x03\x5d\x4a\xcd\x3e\x00\x00\x04\xd2\x49\x44\ +\x41\x54\x78\xda\xbd\x94\x6f\x48\x95\x57\x1c\xc7\x3f\xcf\xf3\xdc\ +\xeb\x9d\xde\xeb\xbc\x7a\xef\x75\xa0\xd9\x35\xbd\xb0\x69\xea\xa2\ +\x49\x84\x5b\x28\x1a\x43\x73\x68\x21\xad\x26\xfd\x31\x26\x24\x1b\ +\xad\x16\xc4\x10\xc6\x20\x88\xb9\x37\x0e\xdf\xd5\x5e\x8c\xc5\x20\ +\x46\x6b\x25\x73\xf6\x42\x25\xb6\x4c\x2c\xff\x34\x72\x7a\x85\xea\ +\x8a\x9a\x7f\xe1\xfa\x87\xf2\xa6\xf7\xde\xe7\x79\xce\xb3\x17\x99\ +\x69\xf3\x4a\xbd\xd9\x0f\x0e\xe7\x70\x7e\xf0\xfb\x9c\xef\x39\xbf\ +\xf3\x95\x88\x10\x25\x25\x25\x65\x7e\xbf\x7f\x7f\x28\x14\xca\xd3\ +\x34\x6d\xb3\xae\xeb\x00\x8f\x80\xce\xb8\xb8\xb8\x2b\x3d\x3d\x3d\ +\x4d\xbc\x42\x48\x2f\x6f\x1c\x3e\x7c\x78\x7b\x5f\x5f\xdf\xf7\xb2\ +\x2c\xe7\x17\x15\x15\x91\x93\x93\x83\xc3\xe1\x40\x08\x81\xdf\xef\ +\xa7\xbb\xbb\x9b\x96\x96\x16\x34\x4d\xbb\x99\x9c\x9c\x7c\xba\xab\ +\xab\xeb\xef\x57\x06\x14\x14\x14\x94\x4d\x4d\x4d\x5d\xcd\xcb\xcb\ +\x33\x55\x54\x54\x90\x98\x98\x88\xd9\x6c\x46\x92\x24\x84\x10\xa8\ +\xaa\x4a\x30\x18\x64\x72\x72\x92\x4b\x97\x2e\x71\xfb\xf6\x6d\xcd\ +\x6e\xb7\x57\x0c\x0d\x0d\x45\x54\xa3\x3c\x5f\x94\x97\x97\x6f\x7f\ +\xf8\xf0\x61\xdb\xbe\x7d\xfb\x4c\x47\x8f\x1e\xc5\xe9\x74\x12\x1b\ +\x1b\x4b\x42\x42\x02\x4e\xa7\x13\x97\xcb\x85\xc3\xe1\xc0\x66\xb3\ +\x61\xb3\xd9\xc8\xce\xce\x66\x69\x69\x49\xbe\x77\xef\xde\xfe\x4d\ +\x9b\x36\x5d\x9f\x9b\x9b\x9b\xda\x10\x10\x0e\x87\x7f\xc9\xcb\xcb\ +\x4b\xab\xae\xae\xc6\x66\xb3\x61\xb7\xdb\x71\xb9\x5c\xd8\x6c\x36\ +\x2c\x16\x0b\x8a\xa2\xa0\x28\x0a\x16\x8b\x85\xd8\xd8\x58\xac\x56\ +\x2b\xe9\xe9\xe9\x3c\x78\xf0\x40\xf6\xf9\x7c\xef\x84\x42\xa1\x8b\ +\xeb\x01\x64\x80\x6d\xdb\xb6\x95\x09\x21\xf2\x8f\x1c\x39\x42\x4c\ +\x4c\x0c\x76\xbb\x1d\xa7\xd3\x49\x54\x54\x14\x8a\xa2\x20\xcb\x32\ +\xb2\x2c\xaf\x40\x64\x59\xc6\x6a\xb5\x92\x96\x96\x46\x4d\x4d\x0d\ +\x86\x61\xe4\x27\x24\x24\x94\x45\x54\x60\x18\xc6\xd7\x85\x85\x85\ +\x39\x19\x19\x19\x68\x9a\x86\x10\x82\xc7\x8f\x1f\xa3\x28\x0a\x31\ +\x31\x31\x48\xd2\x8b\xa7\x32\x0c\x03\x00\x21\x04\xba\xae\xe3\x70\ +\x38\x18\x1b\x1b\xc3\xeb\xf5\xea\x9a\xa6\x35\xae\xa7\xa0\x22\x1c\ +\x0e\x1f\x2a\x2d\x2d\xc5\xe3\xf1\x90\x9d\x9d\x4d\x7a\x7a\x3a\x6d\ +\xdd\xf7\x39\x74\xa6\x81\x89\x89\x89\x95\xa2\x86\x61\xb0\xf7\xb3\ +\x73\xfc\x78\xa5\xf5\x45\x97\x48\x12\xbb\x77\xef\x46\xd7\xf5\xbc\ +\x48\x57\xf4\x9b\xa2\x28\xa4\xa4\xa4\x60\xb1\x58\xb8\x3f\x3c\xc1\ +\x07\x9f\x7c\xc5\xc5\x6b\x37\x78\x3b\x2d\x19\xa7\xd3\x89\xcf\xe7\ +\x43\x08\x81\x61\x18\xec\xc9\xcf\xe5\xa7\x6b\x37\x28\xaa\xfa\x86\ +\xfb\xc3\xcf\xe0\x1e\x8f\x07\x60\x73\xa4\x36\x35\xe2\xe3\xe3\x69\ +\x6e\x6e\xe6\xfc\xd5\x0e\xbc\xbe\x31\x5e\x27\x72\x33\xb7\xb0\xbf\ +\x30\x9b\xd2\xd2\x52\x4d\x55\x55\xf3\xcb\x79\x13\x40\x52\x52\x12\ +\xc3\xc3\xc3\x9c\xfb\xe2\x00\x23\x93\x33\x7c\xf9\xdd\xb3\x86\xf8\ +\xa8\x20\x97\xda\x9a\x8f\x51\x55\x95\x40\x20\x80\xdf\xef\xe7\xcf\ +\xbb\x3e\x7e\xfe\xfd\x2f\x00\xbe\x3d\x79\x80\x24\xe7\x9b\xb4\xb7\ +\xb7\xa3\xeb\xfa\xa3\x88\x5d\xb4\x63\xc7\x0e\x5a\x5b\x5b\x09\x06\ +\x83\xa4\x26\x39\x69\x3e\x5f\xcb\x89\xca\x62\x7a\xfa\x7d\x84\x42\ +\x21\x34\x4d\x43\x96\x65\xec\x76\x3b\xbf\xdf\xe8\xe6\xc3\xf7\xdf\ +\xe5\xd7\xfa\x93\xa4\xbc\x15\x4f\x28\x14\xa2\xa5\xa5\x05\x21\x44\ +\x67\xc4\x2b\x6a\x6a\x6a\xe2\xe0\xc1\x83\x5c\xbe\x7c\x19\x8f\xc7\ +\x83\xc9\xa4\x10\x0e\xab\xcc\xcf\xcf\xaf\x74\x90\x24\x49\x68\x9a\ +\x86\xae\xeb\x58\xad\x56\xa2\xa3\xa3\x09\x06\x83\x0c\x0e\x0e\x72\ +\xec\xd8\x31\x84\x10\xe5\x40\xd3\xba\x0a\xb2\xb2\xb6\x92\x9b\x9b\ +\x4b\x5d\x5d\x1d\x81\xc0\x02\x8b\x8b\x8b\xe8\xba\x4e\x42\x7c\x3c\ +\x76\xbb\x1d\x9b\xcd\x46\x74\x74\x34\x26\x93\x09\x45\x91\x99\x9e\ +\x9e\x66\x61\x61\x81\x27\x4f\x9e\x50\x5f\x5f\x8f\x10\xe2\xe6\x7a\ +\xc5\x57\x14\xa8\xaa\xca\xad\x5b\xb7\xd8\xb3\x67\x0f\xc5\xc5\xc5\ +\x9c\x3a\x75\x0a\xb3\xd9\x8c\xa2\xc8\x18\xc6\xb3\xd3\xeb\xba\x8e\ +\xa6\x69\x84\x42\x41\x66\x66\x66\x89\x8b\x8b\xa3\xa1\xa1\x81\xb6\ +\xb6\x36\x0d\xd8\x0b\x5c\xdf\x10\xd0\xdf\xdf\x8f\x77\x60\x80\x4f\ +\xab\xab\xc9\xcc\xcc\xe4\xf8\xf1\xe3\xa4\xa5\x6d\x41\x96\x65\x84\ +\x30\x10\x42\x20\x84\xe0\xe9\xd3\x00\x7d\x7d\xff\xd0\xd8\xd8\xc8\ +\xe0\xe0\xa0\x06\x2c\x2e\xd7\x39\x03\xfc\x10\x01\x10\x66\x6e\x6e\ +\x8e\x91\x91\x51\xe6\xe7\xe7\x39\x7b\xf6\x2c\xdd\xdd\xdd\xec\xda\ +\xb5\x8b\x9d\x3b\x77\xe2\x76\xbb\x01\x18\x1a\xf2\xd1\xd1\xd1\xc1\ +\x9d\x3b\x5d\x00\x37\x81\xd3\xc0\x55\x20\x7e\xd9\x15\x66\x80\x13\ +\x40\xf3\x5a\x40\x38\xcc\xec\xec\x2c\x48\x60\x08\x83\xb1\xf1\x31\ +\xbc\xde\x41\xfe\x68\x6a\xa2\xa7\xb7\x97\xc9\xc9\x49\x00\x5c\x2e\ +\x17\xd3\xd3\xd3\x00\xe5\xcb\xc5\x26\x00\x52\x53\x53\x07\x00\x69\ +\x64\x64\x44\x06\x54\xa0\x04\xe8\x5c\x01\xe8\xba\x8e\xdf\xef\x47\ +\x08\xb1\x46\xde\xf8\xf8\xf8\x1a\x0f\x1a\x1a\x1a\xa2\xb2\xb2\x12\ +\x20\x15\x18\x5d\x4e\xb9\x81\xbb\x35\x35\x35\x71\xbd\xbd\xbd\x5a\ +\x6f\x6f\xaf\xba\xfc\xbf\x32\x80\x51\xd3\xea\x02\x92\x24\xad\xf8\ +\x0e\x40\x72\x72\xf2\x1a\x83\x0b\x04\x02\xcf\x53\xa3\xab\xce\x31\ +\x0a\xbc\x77\xe1\xc2\x85\x81\xda\xda\xda\x98\xa8\xa8\x28\x73\x67\ +\x67\xe7\x12\xe0\x05\xb6\xca\xab\x01\xcf\xfd\x66\xf5\xfa\xe5\xbd\ +\x0d\x22\xab\xae\xae\x4e\xcd\xc9\xc9\x31\xdc\x6e\xf7\x1b\x6b\xde\ +\xa0\xbd\xbd\x1d\x55\x55\xff\x63\xc9\xab\xd5\x00\x4c\x4c\x4c\x50\ +\x55\x55\xe5\x05\xb2\xd6\x01\xb8\x97\xe7\x3b\x40\x22\x50\x08\x8c\ +\x00\x7c\x0e\x18\xaf\x31\xaa\x37\x50\xe1\x5e\x35\xfe\x9f\xf8\x17\ +\xc1\x08\x40\x3b\x9d\x7d\xa8\x8b\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x01\x4f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x04\x00\x00\x00\xfd\x0b\x31\x0c\ +\x00\x00\x01\x16\x49\x44\x41\x54\x78\x01\xed\x96\x4b\x4a\x03\x41\ +\x14\x45\xcf\x20\x66\x1a\x14\x5d\x81\x26\xad\x7b\x08\x82\x38\xd0\ +\x6d\x88\xe0\x46\x14\x07\xe2\x36\x32\x51\x83\x9a\x55\x28\x22\xb8\ +\x03\x23\x22\x0e\x84\x56\xb4\x03\x7e\xba\x53\x4a\xf3\x28\x32\x10\ +\x2c\x0b\xee\x24\xd4\x39\xe3\xcb\x85\xa2\xea\xbd\x22\x31\x85\x24\ +\x12\x1d\x4e\xc8\x29\xa9\xbc\xe3\x09\xdd\x2f\x8e\x18\xb0\x4c\x20\ +\x19\xcf\xb8\x08\x5f\x58\x21\x88\x33\x5c\xa4\x37\x34\x09\xe0\x15\ +\x17\xed\x21\x01\x38\xf3\x3f\xf4\x2c\x33\x66\x5d\x53\xd0\x62\x68\ +\xa9\x07\xe6\x14\x05\xb0\x4a\x65\xb9\xbe\xa6\x00\xf6\x7d\x72\x5b\ +\x53\x30\xc3\x95\x25\x0b\x96\x14\x05\xd0\xa1\xb0\xec\x25\x0d\x45\ +\x01\xec\xf8\xf4\x9e\xa6\x00\xff\x4c\x2b\xba\x9a\x82\x79\x1e\x2d\ +\x3f\xa4\xa5\x28\x80\x0d\x3f\x10\x7b\x9a\x82\x4d\x6d\xc1\x82\x3f\ +\xa2\x5b\xcd\x11\x9d\x5b\xba\xa4\xab\xbd\xa6\xbb\x9a\x87\x36\xb2\ +\xec\x05\x0d\xe5\xa8\x78\x63\x51\x3b\xec\xb6\xb4\xe3\xfa\x58\xb3\ +\x70\xee\x2c\x75\xcf\xac\x72\x65\x56\xac\xf1\x27\x05\x2e\xda\x03\ +\x02\x18\xe0\x22\xbd\xa6\x49\x00\x19\x39\x2e\xc2\x9c\x8c\x40\xda\ +\x1c\xf1\xc4\x7b\xed\x47\xed\x67\xed\xd7\x8f\x65\xed\xc4\x87\xd2\ +\x6e\xfe\x29\x6d\x12\x89\xc4\x54\xf3\x0d\x0a\x7f\x93\xd6\xf9\xe7\ +\x0c\x36\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\x73\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x02\x2b\xa1\x4a\x72\xae\x00\x00\x03\xf0\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xcf\x6b\x54\x57\x14\xc7\x3f\xf7\xcd\xf8\ +\x06\x99\x49\x4c\x33\x89\x20\x1a\x5f\x68\xb2\xe8\x46\x1b\x45\x17\ +\x3e\xc1\x04\x0c\xc2\xb8\x98\x89\xa4\x83\x9b\x8a\x90\x46\xc8\xa6\ +\x05\xdd\xf9\x17\xb8\x10\x04\xff\x02\xdb\x85\x14\x19\x14\x0c\xad\ +\x30\x76\x15\xd0\xfc\x92\x56\x0d\x41\xc9\x2f\x92\x86\xc4\x41\x26\ +\x04\x9a\xc4\x79\xbf\xee\x8f\x2e\x9a\x0c\x49\xeb\xc4\x52\xd2\x03\ +\x17\x2e\xf7\x1c\xce\xe7\x9e\xef\x7d\xf7\xdc\x07\xff\xb3\x89\x5a\ +\x8e\x4c\x26\x93\x2d\x97\xcb\xf9\x20\x08\x5c\x29\xe5\x51\xa5\x14\ +\xc0\x22\x30\x7c\xe0\xc0\x81\xc2\x8b\x17\x2f\x06\xff\x13\xe0\xca\ +\x95\x2b\x27\x5f\xbf\x7e\x7d\xc7\xb2\xac\xce\xf3\xe7\xcf\x73\xfc\ +\xf8\x71\xd2\xe9\x34\x5a\x6b\xca\xe5\x32\xe3\xe3\xe3\x14\x8b\x45\ +\xa4\x94\x43\x87\x0f\x1f\xbe\x31\x36\x36\xf6\xdb\xbf\x06\x74\x75\ +\x75\x65\x4b\xa5\xd2\x43\xd7\x75\xe3\xbd\xbd\xbd\x1c\x3c\x78\x90\ +\x7d\xfb\xf6\x21\x84\x40\x6b\x4d\x14\x45\xf8\xbe\xcf\xbb\x77\xef\ +\xb8\x7f\xff\x3e\x23\x23\x23\xb2\xa1\xa1\xa1\x77\x6e\x6e\xae\x66\ +\x35\xb1\xad\x49\x2e\x97\x3b\x39\x33\x33\xf3\xcb\xa5\x4b\x97\xe2\ +\x57\xaf\x5e\xa5\xa9\xa9\x89\xba\xba\x3a\x1a\x1b\x1b\x69\x6a\x6a\ +\xa2\xb9\xb9\x99\x74\x3a\x4d\x2a\x95\x22\x95\x4a\x71\xec\xd8\x31\ +\x3c\xcf\xb3\x5e\xbd\x7a\x95\x3f\x72\xe4\xc8\xcf\xab\xab\xab\xa5\ +\x5d\x01\x61\x18\xfe\xe8\xba\xee\xe7\xfd\xfd\xfd\xa4\x52\x29\x1a\ +\x1a\x1a\x68\x6e\x6e\x26\x95\x4a\x91\x48\x24\x88\xc5\x62\xc4\x62\ +\x31\x12\x89\x04\x75\x75\x75\x24\x93\x49\xda\xda\xda\x98\x9e\x9e\ +\xb6\x66\x67\x67\xbf\x08\x82\xe0\xfb\x9a\x3a\x75\x74\x74\x64\x1d\ +\xc7\x31\xc5\x62\xd1\xbc\x79\xf3\xc6\x94\x4a\x25\x73\xf1\xe2\x45\ +\x13\x45\x91\x51\x4a\x19\xa5\x94\x91\x52\x9a\x28\x8a\x8c\xef\xfb\ +\x66\x6d\x6d\xcd\x5c\xb8\x70\xc1\x2c\x2d\x2d\x99\x42\xa1\x60\xea\ +\xeb\xeb\x4d\x63\x63\x63\xf6\x63\xb9\x2d\x80\x72\xb9\x9c\xcf\x66\ +\xb3\x1c\x3a\x74\x88\x64\x32\x49\x5f\x5f\xdf\x5f\x4e\xcb\x42\x08\ +\x41\x36\x9b\x25\x97\xcb\x21\x84\x40\x08\xc1\xe5\xcb\x97\xab\xfe\ +\x8e\x8e\x0e\x32\x99\x0c\x9e\xe7\xe5\x6b\x02\x82\x20\x70\xcf\x9e\ +\x3d\x8b\x6d\xdb\x5c\xbb\x76\xad\xea\x34\xc6\xec\x08\x36\xc6\xd0\ +\xd3\xd3\xb3\x63\x5d\x08\x41\x77\x77\x37\x4a\x29\xb7\x26\x40\x29\ +\x75\xb4\xa5\xa5\x85\x44\x22\xc1\x83\x07\x0f\xaa\xc9\xb6\xc6\xe0\ +\xe0\x20\x8f\x1f\x3f\xc6\x18\xc3\xa3\x47\x8f\x76\x00\x8d\x31\xb4\ +\xb7\xb7\x03\x1c\xfd\x18\x20\xbe\x09\x40\x08\x41\x3c\x1e\x47\x29\ +\x85\x31\x06\x21\x44\x75\xbe\x65\x4a\xa9\xea\x9a\x31\x86\x28\x8a\ +\x90\x52\x12\x45\xd1\x3f\xaa\xfd\x7b\x05\x8b\xf3\xf3\xf3\xd5\x6f\ +\x5d\x6b\x8d\xd6\x1a\x29\x25\x52\x4a\x72\xb9\x1c\xb9\x5c\x6e\x47\ +\xb2\xad\xd8\x30\x0c\x99\x9a\x9a\x42\x29\xb5\x58\x13\x60\x8c\x19\ +\x7e\xfa\xf4\x29\xbe\xef\x13\x86\x21\x5a\x6b\x8c\x31\x84\x61\x48\ +\x10\x04\x68\xad\x51\x4a\x11\x86\x21\x61\x18\xa2\x94\x42\x6b\x4d\ +\x10\x04\x04\x41\x40\xb1\x58\x44\x6b\x3d\x5c\x53\x22\xcb\xb2\x0a\ +\x85\x42\xe1\xeb\x7c\x3e\x4f\x7b\x7b\x7b\x55\x06\xcf\xf3\x10\x42\ +\x70\xef\xde\x3d\x84\x10\x54\x2a\x15\xa4\x94\x3b\xfc\x6f\xdf\xbe\ +\xe5\xc9\x93\x27\x00\x85\xdd\x5a\x85\x63\xdb\xf6\x0f\xa7\x4f\x9f\ +\xee\xbc\x7b\xf7\x2e\xb6\x6d\x63\x59\x16\xb6\x6d\x23\x84\xd8\x71\ +\x26\x4a\xa9\x6a\xcb\xf8\xf0\xe1\x03\xd7\xaf\x5f\x67\x62\x62\x62\ +\x08\xe8\xda\xed\x26\xff\x61\x59\xd6\xc4\xf2\xf2\xf2\x37\xef\xdf\ +\xbf\xb7\x4e\x9c\x38\x51\xd5\x3b\x08\x02\xc2\x30\xc4\xf3\x3c\xc2\ +\x30\xc4\xf7\x7d\x2a\x95\x0a\xeb\xeb\xeb\xdc\xbe\x7d\x9b\x91\x91\ +\x11\x09\x7c\x07\xcc\xec\xda\x2a\xb4\xd6\xb6\x10\x62\x68\x6a\x6a\ +\x2a\xff\xf2\xe5\x4b\xab\xa5\xa5\x85\xfd\xfb\xf7\x57\x93\x6f\xe9\ +\xbd\xb1\xb1\xc1\xe4\xe4\x24\xb7\x6e\xdd\x62\x74\x74\x54\x02\x15\ +\xe0\x2b\x60\x15\xf8\xf5\x53\xed\xda\x01\xd2\x42\x88\x3b\x96\x65\ +\x75\x9e\x3b\x77\x8e\x33\x67\xce\xd0\xda\xda\x0a\xc0\xdc\xdc\x1c\ +\xcf\x9f\x3f\xe7\xd9\xb3\x67\x00\x43\xc0\x0d\xe0\x21\xf0\xd9\xe6\ +\x66\x57\x80\x6f\x81\x9f\x3e\xf5\xe0\x38\xc0\x97\x40\x1e\x70\xb7\ +\x5d\xa2\x45\x60\x78\xf3\x40\x57\x80\x65\x80\xd6\xd6\xd6\x49\x40\ +\x2c\x2c\x2c\x58\x40\x04\x64\x36\xe3\x3e\x69\xce\x2e\x63\x7b\xcc\ +\xca\xc0\xc0\x40\x74\xea\xd4\x29\x0f\x58\xdb\x94\xcd\xd9\xcb\xa7\ +\xd7\x01\xd6\x6f\xde\xbc\xa9\x5c\xd7\x95\xc0\x3a\xb0\xb1\x97\x90\ +\xad\xaa\xfc\x81\x81\x81\xc8\x71\x9c\x68\xaf\x01\xdb\x21\x25\x40\ +\x01\x9d\x80\x23\xf6\xf8\x2f\x65\xfb\x8e\x7f\x07\xf8\x13\x7f\x10\ +\x23\x23\x63\x99\xf1\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x04\xf0\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x14\x00\x00\x00\x14\x08\x03\x00\x00\x00\xba\x57\xed\x3f\ +\x00\x00\x03\x00\x50\x4c\x54\x45\x09\x16\x28\x09\x16\x28\x09\x14\ +\x25\x09\x15\x27\x09\x14\x25\x08\x13\x23\x07\x11\x20\x07\x0f\x1c\ +\x06\x0d\x18\x04\x0a\x13\x03\x07\x0d\x02\x04\x07\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x01\x01\x01\x02\x02\x02\x03\x03\x03\x06\x06\x06\x0a\x0a\x0a\ +\x10\x10\x10\x17\x17\x17\x21\x21\x21\x28\x28\x28\x2c\x2c\x2c\x2d\ +\x2d\x2d\x2e\x2e\x2e\x2f\x2f\x2f\x30\x30\x30\x31\x31\x31\x32\x32\ +\x32\x33\x33\x33\x34\x34\x34\x35\x35\x35\x36\x36\x36\x37\x37\x37\ +\x38\x38\x38\x39\x39\x39\x3a\x3a\x3a\x3b\x3b\x3b\x3c\x3c\x3c\x3d\ +\x3d\x3d\x3e\x3e\x3e\x3f\x3f\x3f\x40\x40\x40\x41\x41\x41\x42\x42\ +\x42\x43\x43\x43\x44\x44\x44\x45\x45\x45\x46\x46\x46\x47\x47\x47\ +\x48\x48\x48\x49\x49\x49\x4a\x4a\x4a\x4b\x4b\x4b\x4c\x4c\x4c\x4d\ +\x4d\x4d\x4e\x4e\x4e\x4f\x4f\x4f\x50\x50\x50\x51\x51\x51\x52\x52\ +\x52\x53\x53\x53\x54\x54\x54\x55\x55\x55\x56\x56\x56\x57\x57\x57\ +\x58\x58\x58\x59\x59\x59\x5a\x5a\x5a\x5b\x5b\x5b\x5c\x5c\x5c\x5d\ +\x5d\x5d\x5e\x5e\x5e\x5f\x5f\x5f\x60\x60\x60\x61\x61\x61\x62\x62\ +\x62\x63\x63\x63\x64\x64\x64\x65\x65\x65\x66\x66\x66\x67\x67\x67\ +\x68\x68\x68\x69\x69\x69\x6a\x6a\x6a\x6b\x6b\x6b\x6c\x6c\x6c\x6d\ +\x6d\x6d\x6e\x6e\x6e\x6f\x6f\x6f\x70\x70\x70\x71\x71\x71\x72\x72\ +\x72\x73\x73\x73\x75\x75\x75\x77\x77\x77\x79\x79\x78\x7a\x7b\x7a\ +\x7c\x7d\x7c\x7f\x7f\x7e\x81\x82\x7f\x84\x85\x81\x84\x85\x82\x85\ +\x86\x83\x86\x87\x83\x86\x88\x84\x87\x88\x84\x87\x89\x84\x87\x89\ +\x85\x87\x89\x85\x88\x89\x85\x83\x86\x85\x7f\x84\x85\x7c\x82\x85\ +\x7a\x81\x85\x76\x81\x8b\x76\x82\x8e\x77\x84\x90\x79\x85\x90\x7d\ +\x87\x8e\x83\x89\x8c\x85\x8b\x8c\x89\x8c\x8c\x8a\x8d\x8b\x8c\x8d\ +\x8a\x8e\x8f\x8d\x90\x91\x8f\x92\x92\x91\x94\x94\x93\x95\x95\x95\ +\x97\x97\x97\x99\x99\x99\x9a\x9a\x9a\x9b\x9b\x9b\x9c\x9c\x9c\x9d\ +\x9d\x9d\x9e\x9e\x9e\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa2\xa2\ +\xa2\xa3\xa3\xa3\xa4\xa4\xa4\xa5\xa5\xa5\xa7\xa7\xa6\xa8\xa8\xa8\ +\xa9\xaa\xa9\xaa\xab\xaa\xab\xac\xab\xac\xad\xac\xad\xad\xad\xae\ +\xae\xad\xae\xaf\xae\xaf\xb0\xaf\xb0\xb0\xaf\xb1\xb1\xb0\xb1\xb2\ +\xb1\xb2\xb3\xb2\xb3\xb4\xb3\xb4\xb5\xb4\xb6\xb6\xb6\xb7\xb7\xb7\ +\xb8\xb8\xb8\xb9\xb9\xb9\xba\xba\xba\xbb\xbb\xbb\xbc\xbc\xbc\xbd\ +\xbe\xbd\xbe\xbf\xbe\xbf\xc0\xbf\xc0\xc0\xc0\xc1\xc1\xc1\xc2\xc2\ +\xc1\xc3\xc3\xc2\xc4\xc4\xc3\xc6\xc6\xc6\xc9\xc9\xc9\xcd\xcd\xcd\ +\xcf\xcf\xcf\xd1\xd1\xd1\xd3\xd3\xd3\xd5\xd5\xd4\xd6\xd6\xd5\xd8\ +\xd8\xd8\xda\xda\xda\xdc\xdc\xdc\xde\xde\xdd\xdf\xdf\xdf\xe0\xe0\ +\xe0\xe2\xe2\xe2\xe3\xe3\xe3\xe5\xe5\xe4\xe6\xe6\xe6\xe8\xe8\xe7\ +\xe9\xe9\xe9\xeb\xeb\xea\xeb\xeb\xeb\xec\xec\xec\xec\xec\xec\xee\ +\xee\xed\xef\xef\xef\xf1\xf1\xf1\xef\xef\xef\xef\xef\xee\xef\xef\ +\xee\xef\xef\xef\xf0\xf0\xf0\xf0\xf0\xf0\xf1\xf1\xf1\xf2\xf2\xf2\ +\xf3\xf3\xf3\xf4\xf4\xf4\xf5\xf5\xf5\xf6\xf6\xf6\xf7\xf7\xf6\xf7\ +\xf7\xf7\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xfa\xfb\xfb\xfb\xfc\xfc\ +\xfb\xfc\xfc\xfc\xfd\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\ +\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\x7e\xee\x29\x02\x00\x00\x01\x00\ +\x74\x52\x4e\x53\xd1\xd2\xd3\xc8\xb9\xa9\x93\x78\x5d\x43\x2c\x17\ +\x03\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x06\x0a\x10\x17\x21\x28\ +\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\ +\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\ +\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\ +\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\ +\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x71\x6f\x6e\x6d\x6d\x68\x68\x62\ +\x6f\x7c\x8a\x95\x9e\xa6\xae\xb6\xbf\xcd\xd2\xd7\xdb\xe1\xe7\xea\ +\xeb\xeb\xe8\xe6\xdc\xd1\xbe\xac\xa1\x9c\x96\x97\x98\x99\x9a\x9b\ +\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa2\xa2\xa1\xa1\xa1\xa3\xa2\xa2\ +\xa2\xa3\xa3\xa4\xa5\xa6\xa8\xaa\xad\xb0\xb3\xb7\xb8\xb9\xba\xbb\ +\xc0\xc5\xc8\xcb\xcd\xce\xcf\xce\xce\xcf\xd3\xd6\xdc\xe0\xe4\xe8\ +\xea\xee\xf1\xf3\xf5\xf6\xf7\xf8\xf9\xfa\xfa\xfb\xfb\xfb\xfc\xfc\ +\xfc\xfd\xfd\xfd\xfd\xfa\xf6\xf3\xef\xeb\xe7\xe0\xd8\xd0\xc8\xbf\ +\xb6\xae\xa5\x9c\x92\x88\x7d\x72\x68\x66\x64\x63\x62\x5b\x55\x51\ +\x4d\x4a\x46\x48\xa6\xfd\x00\x6d\x00\x00\x00\x9f\x49\x44\x41\x54\ +\x18\xd3\xb5\xd0\x31\x0e\x82\x40\x10\x85\x61\xe0\x12\x1e\x76\x54\ +\x54\xa0\xd9\x1d\xf3\xe2\x11\xd4\xc4\xd6\x58\xd3\x10\x0b\x3b\x02\ +\xd1\x42\xa9\xc6\x53\x50\x8e\xee\x02\x31\x9a\xd8\xf2\x17\x53\x7c\ +\xc9\x6e\x26\x13\x4c\xfe\x14\x8c\x87\x34\xf4\x85\x44\xb3\x0c\x40\ +\x1a\x0f\xea\x91\xa6\x40\xc1\xc6\xf0\x1e\x2b\xea\xd1\x3d\xc2\xae\ +\x62\x91\xd0\xf2\x15\xa9\xd7\x80\x28\xc6\xf6\x26\x46\x24\xb2\xa6\ +\xa9\xb1\xa4\x0e\x53\x3c\x45\x4c\x18\x39\x7c\x48\x83\x39\xf9\x3f\ +\x4f\x09\x44\xd8\xba\x58\x4a\xe0\xa0\x1e\x35\xcf\x50\x56\x58\x73\ +\x71\x3f\x63\x91\xab\xf6\x2b\xe9\x71\x83\xae\xe4\xe2\xe8\xb3\xbc\ +\xaa\xb6\xed\xcb\x4d\x1d\xf9\x4a\xbf\xbd\x01\x0c\x0e\x70\x72\x00\ +\x75\x19\xc2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x0b\x0f\ +\x6f\ +\x70\x65\x6e\x46\x69\x6c\x65\x3d\x4f\x70\x65\x6e\x0d\x0a\x6f\x70\ +\x65\x6e\x46\x69\x6c\x65\x44\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\ +\x6e\x20\x69\x6d\x61\x67\x65\x20\x6f\x72\x20\x6c\x61\x62\x65\x6c\ +\x20\x66\x69\x6c\x65\x0d\x0a\x71\x75\x69\x74\x3d\x51\x75\x69\x74\ +\x0d\x0a\x71\x75\x69\x74\x41\x70\x70\x3d\x51\x75\x69\x74\x20\x61\ +\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x0d\x0a\x6f\x70\x65\x6e\ +\x44\x69\x72\x3d\x4f\x70\x65\x6e\x20\x44\x69\x72\x0d\x0a\x63\x6f\ +\x70\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\x67\x3d\x43\ +\x6f\x70\x79\x20\x70\x72\x65\x76\x69\x6f\x75\x73\x20\x42\x6f\x75\ +\x6e\x64\x69\x6e\x67\x20\x42\x6f\x78\x65\x73\x20\x69\x6e\x20\x74\ +\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\x61\x67\x65\ +\x20\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\x6e\ +\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\x43\x68\x61\x6e\ +\x67\x65\x20\x64\x65\x66\x61\x75\x6c\x74\x20\x73\x61\x76\x65\x64\ +\x20\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x20\x64\x69\x72\x0d\ +\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x3d\ +\x4f\x70\x65\x6e\x20\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x0d\ +\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\ +\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\x6e\x20\x61\x6e\x20\x61\x6e\ +\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\x0d\x0a\x63\ +\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x44\x69\x72\x3d\x43\x68\x61\ +\x6e\x67\x65\x20\x53\x61\x76\x65\x20\x44\x69\x72\x0d\x0a\x6e\x65\ +\x78\x74\x49\x6d\x67\x3d\x4e\x65\x78\x74\x20\x49\x6d\x61\x67\x65\ +\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\ +\x4f\x70\x65\x6e\x20\x74\x68\x65\x20\x6e\x65\x78\x74\x20\x49\x6d\ +\x61\x67\x65\x0d\x0a\x70\x72\x65\x76\x49\x6d\x67\x3d\x50\x72\x65\ +\x76\x20\x49\x6d\x61\x67\x65\x0d\x0a\x70\x72\x65\x76\x49\x6d\x67\ +\x44\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\x6e\x20\x74\x68\x65\x20\ +\x70\x72\x65\x76\x69\x6f\x75\x73\x20\x49\x6d\x61\x67\x65\x0d\x0a\ +\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x3d\x56\x65\x72\x69\x66\x79\ +\x20\x49\x6d\x61\x67\x65\x0d\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\ +\x67\x44\x65\x74\x61\x69\x6c\x3d\x56\x65\x72\x69\x66\x79\x20\x49\ +\x6d\x61\x67\x65\x0d\x0a\x73\x61\x76\x65\x3d\x53\x61\x76\x65\x0d\ +\x0a\x73\x61\x76\x65\x44\x65\x74\x61\x69\x6c\x3d\x53\x61\x76\x65\ +\x20\x74\x68\x65\x20\x6c\x61\x62\x65\x6c\x73\x20\x74\x6f\x20\x61\ +\x20\x66\x69\x6c\x65\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\ +\x65\x46\x6f\x72\x6d\x61\x74\x3d\x43\x68\x61\x6e\x67\x65\x20\x73\ +\x61\x76\x65\x20\x66\x6f\x72\x6d\x61\x74\x0d\x0a\x73\x61\x76\x65\ +\x41\x73\x3d\x53\x61\x76\x65\x20\x41\x73\x0d\x0a\x73\x61\x76\x65\ +\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\x53\x61\x76\x65\x20\x74\x68\ +\x65\x20\x6c\x61\x62\x65\x6c\x73\x20\x74\x6f\x20\x61\x20\x64\x69\ +\x66\x66\x65\x72\x65\x6e\x74\x20\x66\x69\x6c\x65\x0d\x0a\x63\x6c\ +\x6f\x73\x65\x43\x75\x72\x3d\x43\x6c\x6f\x73\x65\x0d\x0a\x63\x6c\ +\x6f\x73\x65\x43\x75\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x6c\x6f\ +\x73\x65\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x66\ +\x69\x6c\x65\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\x44\ +\x65\x6c\x65\x74\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\ +\x61\x67\x65\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x44\x65\ +\x74\x61\x69\x6c\x3d\x44\x65\x6c\x65\x74\x65\x20\x74\x68\x65\x20\ +\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\x61\x67\x65\x0d\x0a\x72\ +\x65\x73\x65\x74\x41\x6c\x6c\x3d\x52\x65\x73\x65\x74\x20\x49\x6e\ +\x74\x65\x72\x66\x61\x63\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x65\ +\x20\x44\x69\x72\x0d\x0a\x72\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\ +\x74\x61\x69\x6c\x3d\x52\x65\x73\x65\x74\x20\x41\x6c\x6c\x0d\x0a\ +\x62\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\x42\x6f\x78\ +\x20\x4c\x69\x6e\x65\x20\x43\x6f\x6c\x6f\x72\x0d\x0a\x62\x6f\x78\ +\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\ +\x43\x68\x6f\x6f\x73\x65\x20\x42\x6f\x78\x20\x6c\x69\x6e\x65\x20\ +\x63\x6f\x6c\x6f\x72\x0d\x0a\x63\x72\x74\x42\x6f\x78\x3d\x43\x72\ +\x65\x61\x74\x65\x20\x52\x65\x63\x74\x42\x6f\x78\x0d\x0a\x63\x72\ +\x74\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x44\x72\x61\x77\x20\ +\x61\x20\x6e\x65\x77\x20\x62\x6f\x78\x0d\x0a\x64\x65\x6c\x42\x6f\ +\x78\x3d\x44\x65\x6c\x65\x74\x65\x20\x52\x65\x63\x74\x42\x6f\x78\ +\x0d\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x52\ +\x65\x6d\x6f\x76\x65\x20\x74\x68\x65\x20\x62\x6f\x78\x0d\x0a\x64\ +\x75\x70\x42\x6f\x78\x3d\x44\x75\x70\x6c\x69\x63\x61\x74\x65\x20\ +\x52\x65\x63\x74\x42\x6f\x78\x0d\x0a\x64\x75\x70\x42\x6f\x78\x44\ +\x65\x74\x61\x69\x6c\x3d\x43\x72\x65\x61\x74\x65\x20\x61\x20\x64\ +\x75\x70\x6c\x69\x63\x61\x74\x65\x20\x6f\x66\x20\x74\x68\x65\x20\ +\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x62\x6f\x78\x0d\x0a\x74\x75\ +\x74\x6f\x72\x69\x61\x6c\x3d\x50\x61\x64\x64\x6c\x65\x4f\x43\x52\ +\x20\x75\x72\x6c\x0d\x0a\x74\x75\x74\x6f\x72\x69\x61\x6c\x44\x65\ +\x74\x61\x69\x6c\x3d\x53\x68\x6f\x77\x20\x64\x65\x6d\x6f\x0d\x0a\ +\x69\x6e\x66\x6f\x3d\x49\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\ +\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x3d\x5a\x6f\x6f\x6d\x20\x49\x6e\ +\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\x49\ +\x6e\x63\x72\x65\x61\x73\x65\x20\x7a\x6f\x6f\x6d\x20\x6c\x65\x76\ +\x65\x6c\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x3d\x5a\x6f\x6f\x6d\ +\x20\x4f\x75\x74\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\ +\x61\x69\x6c\x3d\x44\x65\x63\x72\x65\x61\x73\x65\x20\x7a\x6f\x6f\ +\x6d\x20\x6c\x65\x76\x65\x6c\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\ +\x6c\x73\x69\x7a\x65\x3d\x4f\x72\x69\x67\x69\x6e\x61\x6c\x20\x73\ +\x69\x7a\x65\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\ +\x65\x44\x65\x74\x61\x69\x6c\x3d\x5a\x6f\x6f\x6d\x20\x74\x6f\x20\ +\x6f\x72\x69\x67\x69\x6e\x61\x6c\x20\x73\x69\x7a\x65\x0d\x0a\x66\ +\x69\x74\x57\x69\x6e\x3d\x46\x69\x74\x20\x57\x69\x6e\x64\x6f\x77\ +\x0d\x0a\x66\x69\x74\x57\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\x5a\ +\x6f\x6f\x6d\x20\x66\x6f\x6c\x6c\x6f\x77\x73\x20\x77\x69\x6e\x64\ +\x6f\x77\x20\x73\x69\x7a\x65\x0d\x0a\x66\x69\x74\x57\x69\x64\x74\ +\x68\x3d\x46\x69\x74\x20\x57\x69\x64\x74\x68\x0d\x0a\x66\x69\x74\ +\x57\x69\x64\x74\x68\x44\x65\x74\x61\x69\x6c\x3d\x5a\x6f\x6f\x6d\ +\x20\x66\x6f\x6c\x6c\x6f\x77\x73\x20\x77\x69\x6e\x64\x6f\x77\x20\ +\x77\x69\x64\x74\x68\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\ +\x3d\x45\x64\x69\x74\x20\x4c\x61\x62\x65\x6c\x0d\x0a\x65\x64\x69\ +\x74\x4c\x61\x62\x65\x6c\x44\x65\x74\x61\x69\x6c\x3d\x4d\x6f\x64\ +\x69\x66\x79\x20\x74\x68\x65\x20\x6c\x61\x62\x65\x6c\x20\x6f\x66\ +\x20\x74\x68\x65\x20\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x42\x6f\ +\x78\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\ +\x72\x3d\x53\x68\x61\x70\x65\x20\x4c\x69\x6e\x65\x20\x43\x6f\x6c\ +\x6f\x72\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\ +\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x68\x61\x6e\x67\x65\x20\ +\x74\x68\x65\x20\x6c\x69\x6e\x65\x20\x63\x6f\x6c\x6f\x72\x20\x66\ +\x6f\x72\x20\x74\x68\x69\x73\x20\x73\x70\x65\x63\x69\x66\x69\x63\ +\x20\x73\x68\x61\x70\x65\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\x6c\ +\x6c\x43\x6f\x6c\x6f\x72\x3d\x53\x68\x61\x70\x65\x20\x46\x69\x6c\ +\x6c\x20\x43\x6f\x6c\x6f\x72\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\ +\x6c\x6c\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x68\ +\x61\x6e\x67\x65\x20\x74\x68\x65\x20\x66\x69\x6c\x6c\x20\x63\x6f\ +\x6c\x6f\x72\x20\x66\x6f\x72\x20\x74\x68\x69\x73\x20\x73\x70\x65\ +\x63\x69\x66\x69\x63\x20\x73\x68\x61\x70\x65\x0d\x0a\x73\x68\x6f\ +\x77\x48\x69\x64\x65\x3d\x53\x68\x6f\x77\x2f\x48\x69\x64\x65\x20\ +\x4c\x61\x62\x65\x6c\x20\x50\x61\x6e\x65\x6c\x0d\x0a\x75\x73\x65\ +\x44\x65\x66\x61\x75\x6c\x74\x4c\x61\x62\x65\x6c\x3d\x55\x73\x65\ +\x20\x64\x65\x66\x61\x75\x6c\x74\x20\x6c\x61\x62\x65\x6c\x0d\x0a\ +\x75\x73\x65\x44\x69\x66\x66\x69\x63\x75\x6c\x74\x3d\x44\x69\x66\ +\x66\x69\x63\x75\x6c\x74\x0d\x0a\x62\x6f\x78\x4c\x61\x62\x65\x6c\ +\x54\x65\x78\x74\x3d\x42\x6f\x78\x20\x4c\x61\x62\x65\x6c\x73\x0d\ +\x0a\x6c\x61\x62\x65\x6c\x73\x3d\x4c\x61\x62\x65\x6c\x73\x0d\x0a\ +\x61\x75\x74\x6f\x53\x61\x76\x65\x4d\x6f\x64\x65\x3d\x41\x75\x74\ +\x6f\x20\x53\x61\x76\x65\x20\x6d\x6f\x64\x65\x0d\x0a\x73\x69\x6e\ +\x67\x6c\x65\x43\x6c\x73\x4d\x6f\x64\x65\x3d\x53\x69\x6e\x67\x6c\ +\x65\x20\x43\x6c\x61\x73\x73\x20\x4d\x6f\x64\x65\x0d\x0a\x64\x69\ +\x73\x70\x6c\x61\x79\x4c\x61\x62\x65\x6c\x3d\x44\x69\x73\x70\x6c\ +\x61\x79\x20\x4c\x61\x62\x65\x6c\x73\x0d\x0a\x66\x69\x6c\x65\x4c\ +\x69\x73\x74\x3d\x46\x69\x6c\x65\x20\x4c\x69\x73\x74\x0d\x0a\x66\ +\x69\x6c\x65\x73\x3d\x46\x69\x6c\x65\x73\x0d\x0a\x61\x64\x76\x61\ +\x6e\x63\x65\x64\x4d\x6f\x64\x65\x3d\x41\x64\x76\x61\x6e\x63\x65\ +\x64\x20\x4d\x6f\x64\x65\x0d\x0a\x61\x64\x76\x61\x6e\x63\x65\x64\ +\x4d\x6f\x64\x65\x44\x65\x74\x61\x69\x6c\x3d\x53\x77\x74\x69\x63\ +\x68\x20\x74\x6f\x20\x61\x64\x76\x61\x6e\x63\x65\x64\x20\x6d\x6f\ +\x64\x65\x0d\x0a\x73\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\ +\x74\x61\x69\x6c\x3d\x53\x68\x6f\x77\x20\x61\x6c\x6c\x20\x62\x6f\ +\x75\x6e\x64\x69\x6e\x67\x20\x62\x6f\x78\x65\x73\x0d\x0a\x68\x69\ +\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x48\ +\x69\x64\x65\x20\x61\x6c\x6c\x20\x62\x6f\x75\x6e\x64\x69\x6e\x67\ +\x20\x62\x6f\x78\x65\x73\x0d\x0a\x61\x6e\x6e\x6f\x50\x61\x6e\x65\ +\x6c\x3d\x61\x6e\x6e\x6f\x20\x50\x61\x6e\x65\x6c\x0d\x0a\x61\x6e\ +\x6e\x6f\x3d\x61\x6e\x6e\x6f\x0d\x0a\x61\x64\x64\x4e\x65\x77\x42\ +\x62\x6f\x78\x3d\x6e\x65\x77\x20\x62\x62\x6f\x78\x0d\x0a\x72\x65\ +\x4c\x61\x62\x65\x6c\x3d\x72\x65\x4c\x61\x62\x65\x6c\x0d\x0a\x63\ +\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\x43\x68\x6f\x6f\x73\ +\x65\x20\x4f\x43\x52\x20\x6d\x6f\x64\x65\x6c\x0d\x0a\x74\x69\x70\ +\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\x43\x68\x6f\x6f\ +\x73\x65\x20\x4f\x43\x52\x20\x6d\x6f\x64\x65\x6c\x20\x66\x72\x6f\ +\x6d\x20\x64\x69\x72\x0d\x0a\x49\x6d\x61\x67\x65\x52\x65\x73\x69\ +\x7a\x65\x3d\x49\x6d\x61\x67\x65\x20\x52\x65\x73\x69\x7a\x65\x0d\ +\x0a\x49\x52\x3d\x49\x6d\x61\x67\x65\x20\x52\x65\x73\x69\x7a\x65\ +\x0d\x0a\x61\x75\x74\x6f\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\ +\x6e\x3d\x41\x75\x74\x6f\x20\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\ +\x6f\x6e\x0d\x0a\x72\x65\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\ +\x6e\x3d\x52\x65\x2d\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\ +\x0d\x0a\x6d\x66\x69\x6c\x65\x3d\x46\x69\x6c\x65\x0d\x0a\x6d\x65\ +\x64\x69\x74\x3d\x45\x69\x64\x74\x0d\x0a\x6d\x76\x69\x65\x77\x3d\ +\x56\x69\x65\x77\x0d\x0a\x6d\x68\x65\x6c\x70\x3d\x48\x65\x6c\x70\ +\x0d\x0a\x69\x63\x6f\x6e\x4c\x69\x73\x74\x3d\x49\x63\x6f\x6e\x20\ +\x4c\x69\x73\x74\x0d\x0a\x64\x65\x74\x65\x63\x74\x69\x6f\x6e\x42\ +\x6f\x78\x70\x6f\x73\x69\x74\x69\x6f\x6e\x3d\x44\x65\x74\x65\x63\ +\x74\x69\x6f\x6e\x20\x62\x6f\x78\x20\x70\x6f\x73\x69\x74\x69\x6f\ +\x6e\x0d\x0a\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x52\x65\ +\x73\x75\x6c\x74\x3d\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\ +\x20\x72\x65\x73\x75\x6c\x74\x0d\x0a\x63\x72\x65\x61\x74\x50\x6f\ +\x6c\x79\x67\x6f\x6e\x3d\x43\x72\x65\x61\x74\x65\x20\x51\x75\x61\ +\x64\x72\x69\x6c\x61\x74\x65\x72\x61\x6c\x0d\x0a\x64\x72\x61\x77\ +\x53\x71\x75\x61\x72\x65\x73\x3d\x44\x72\x61\x77\x20\x53\x71\x75\ +\x61\x72\x65\x73\x0d\x0a\x73\x61\x76\x65\x52\x65\x63\x3d\x53\x61\ +\x76\x65\x20\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x20\x52\ +\x65\x73\x75\x6c\x74\x0d\x0a\x74\x65\x6d\x70\x4c\x61\x62\x65\x6c\ +\x3d\x54\x45\x4d\x50\x4f\x52\x41\x52\x59\x0d\x0a\x73\x74\x65\x70\ +\x73\x3d\x53\x74\x65\x70\x73\x0d\x0a\x63\x68\x6f\x73\x65\x4d\x6f\ +\x64\x65\x6c\x4c\x67\x3d\x43\x68\x6f\x6f\x73\x65\x20\x4d\x6f\x64\ +\x65\x6c\x20\x4c\x61\x6e\x67\x75\x61\x67\x65\x0d\x0a\x63\x61\x6e\ +\x63\x65\x6c\x3d\x43\x61\x6e\x63\x65\x6c\x0d\x0a\x6f\x6b\x3d\x4f\ +\x4b\x0d\x0a\x61\x75\x74\x6f\x6c\x61\x62\x65\x6c\x69\x6e\x67\x3d\ +\x41\x75\x74\x6f\x6d\x61\x74\x69\x63\x20\x4c\x61\x62\x65\x6c\x69\ +\x6e\x67\x0d\x0a\x68\x69\x64\x65\x42\x6f\x78\x3d\x48\x69\x64\x65\ +\x20\x41\x6c\x6c\x20\x42\x6f\x78\x0d\x0a\x73\x68\x6f\x77\x42\x6f\ +\x78\x3d\x53\x68\x6f\x77\x20\x41\x6c\x6c\x20\x42\x6f\x78\ +\x00\x00\x04\xa3\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x04\x35\x49\x44\x41\x54\x58\xc3\xe5\ +\x97\xcd\x8f\x54\x45\x14\xc5\x7f\xb7\xea\xd6\x7b\xaf\xdb\x6e\xc7\ +\xf9\x40\x9d\x89\x46\x4d\x34\x99\x44\x8d\x1a\x48\x98\xc4\x8c\x1f\ +\x1b\xfe\x02\x4c\x5c\xf1\x07\x18\x16\x2e\x4d\x5c\x6b\x58\xc3\x8e\ +\xc4\x8d\x1b\x17\xce\x82\x68\x74\x41\x5c\x18\x0d\xe2\xc4\xc6\x00\ +\x3d\x60\x50\x51\x19\x60\x02\xa2\x0e\x0c\x83\xd3\xfd\x5e\xf7\x94\ +\x8b\xaa\xee\xf9\x60\xe6\x0d\x84\x51\x16\x56\x52\xa9\xce\x7b\xb7\ +\xeb\x9e\x3a\xf7\xd4\xa9\x7a\xea\xbd\xe7\x7e\x36\xe5\x3e\xb7\x3e\ +\x80\x5d\xbb\x76\xbd\x03\xec\xfd\x8f\xf2\x4e\x35\x1a\x8d\x03\xeb\ +\x19\xd8\xbb\xef\xbd\xa3\x3b\x1f\x1f\x76\x00\x9c\x3c\x3a\xcf\xcc\ +\x97\x37\x58\x9c\xef\xdc\x53\xa6\xda\xa0\xf2\xdc\x6b\x03\xbc\xb8\ +\x67\x10\x80\x8b\x7f\x16\x7c\xf8\xee\x1e\x80\xdb\x00\x70\xfc\xec\ +\x1c\xdf\x3f\x30\x04\x78\x2e\xfd\xb8\xc0\xfe\xb7\xce\x6f\xcb\x72\ +\x0f\x1d\x79\x9a\x0b\x23\x96\xd3\x9f\x1f\x64\xfc\xd5\x7d\x9b\x6b\ +\x40\x45\xb0\x16\x40\x78\x70\x2c\x23\xcb\xb2\x6d\x01\x30\x30\x96\ +\x61\x8d\x50\x1b\x7c\x14\x23\x25\x22\x14\x2b\xd8\x18\x91\xd5\x95\ +\x73\xe7\xce\x83\x2a\xb8\x04\xd2\x14\xb2\x0c\xd2\x2c\x8c\x49\x0a\ +\x49\x12\xde\x77\x3a\x90\xe7\x90\xb7\xa1\xd5\x82\x76\x2b\x8e\x6d\ +\x28\x72\xb2\xfa\x38\xd6\x0a\xe3\xaf\xbc\x49\x6b\xf1\xfa\xe6\x00\ +\xac\x15\xac\x15\x04\xb0\x46\xd8\xbd\x7b\xe7\x16\x6b\xeb\x86\xae\ +\x80\x5a\xa8\x56\x81\xea\x6d\x51\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\ +\x84\x01\x67\x05\x35\x82\x08\xa8\x0a\x95\x2c\xc3\x23\x20\x1e\x08\ +\xc0\xf0\x1e\x2f\x02\xde\x23\x12\x26\x15\x7c\x88\x23\xc4\x21\x1e\ +\x3c\x21\x5e\x40\x4d\x58\x18\x40\xd7\x4a\x89\x06\xac\xa0\xda\x63\ +\x00\x9a\x33\xbf\x05\x8a\x53\x07\x69\x02\x95\x04\xb2\x34\xf6\x04\ +\x12\x07\x4e\xa1\xe8\x40\x5e\x40\x2b\x8f\xbd\x05\x4b\x39\xb4\x73\ +\xc8\x0b\x54\x87\x71\x3d\x00\x2a\xe5\x25\x70\x31\x40\xd5\x30\x39\ +\xf9\xd2\xd6\x0a\xf3\x3e\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8\x27\x61\ +\x61\xbd\x1c\x25\x25\x20\x00\xf0\x81\x8d\x34\x4d\xa3\x3a\xc3\xb3\ +\x98\x11\x89\x6c\x07\xda\x63\x09\x56\x98\x5f\x29\x46\xfc\x61\xcd\ +\x72\x7f\x61\x1d\x2d\xd1\x80\x3a\x09\x54\x49\x18\x4f\x34\x2f\xe0\ +\x9d\x85\xc4\x21\x89\xc3\x67\x09\x92\x69\xd8\x11\x89\xe2\x13\x87\ +\x58\x8b\xef\x76\x91\xbc\x80\xbc\x03\xed\x02\xdf\x6a\x23\xed\x02\ +\xf2\x02\x9f\x77\x50\x1d\x45\xd5\x20\x78\x3a\xeb\x54\x78\x9b\x06\ +\x9c\x33\x78\x0f\x03\x8f\x24\xbc\xfe\xf2\xf3\x77\x68\xe8\x36\x68\ +\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04\x52\x5e\x82\x44\x4d\x5f\x84\ +\x8f\x0d\xa5\x38\xe7\xb6\xc5\x88\x9e\x18\x4b\xb9\x76\xb3\x03\x08\ +\x9d\x52\x11\xaa\x90\xb8\x50\xef\x5a\xc5\x30\x7d\xb1\xcb\x40\xc5\ +\xb0\x0e\xf4\x26\xad\x57\xf9\x55\x2e\xe1\xe1\xc6\xd2\x32\xf5\xcc\ +\x70\x7d\xc9\x84\x2d\xe9\x4a\x19\x10\x9c\x1a\xc0\x73\xe5\x66\x97\ +\x2b\x37\xbb\xac\x51\x57\x3f\xd7\xaa\x64\x7e\xc5\x27\xa2\x29\xac\ +\x05\x15\xc3\x9c\x0b\xb5\x77\xa6\x6c\x17\xa8\xc1\xa9\x20\xc8\x1a\ +\x35\xaf\x9b\x35\x1a\x8f\x59\x31\x9e\xfe\x7b\xe9\xef\x14\x00\xf1\ +\x82\xef\x9b\x58\x30\x2b\x57\x56\x02\x55\x21\xd1\x90\xfc\xe7\x53\ +\xdf\xf2\xeb\x99\x13\x2c\x2d\xde\xb8\xa7\xfa\x57\x6a\x03\x3c\xf5\ +\xec\x4e\x9e\x79\x61\x02\x0f\xa8\x33\x5b\x31\x10\x03\x7c\x87\xf7\ +\xf7\xbf\xc1\xc2\xc2\x02\xb7\x6e\xdd\xa2\x28\x0a\x44\x04\x6b\x2d\ +\xd6\x5a\x54\x15\x55\xc5\x39\x87\xaa\x62\xad\xc5\x98\xf0\xdf\xe5\ +\xe5\x65\xf2\x3c\xef\xf7\x23\xcd\xf9\xb8\xf2\x2d\x18\x70\x56\x50\ +\x17\x18\xdc\x31\x3a\xb6\x72\x4f\x38\x7e\x9c\xe9\xe9\x69\x8c\x31\ +\x78\xef\x99\x98\x98\x60\x72\x72\xf2\x8e\x59\xd8\x31\x3a\xd6\xdf\ +\x86\xae\xd4\x09\x55\x70\x36\xac\xa2\x56\xaf\xf7\x6b\x39\x33\x33\ +\xc3\xd0\xd0\x10\xd6\x5a\xbc\xf7\x34\x9b\xcd\xbb\x02\x50\xab\xd7\ +\x70\xd1\x88\xb4\xd4\x88\x14\x9c\x0b\x27\x5c\xa0\x2a\x00\xa8\x56\ +\xab\x64\x59\xd6\xa7\xb8\x37\xde\x69\x73\x1a\xa9\x17\x41\x4b\xad\ +\x38\x1e\xc7\xbd\x23\xb4\xd7\x8c\x31\x88\x44\xdf\x8f\x3a\xb8\xab\ +\x9b\xaf\x35\xa8\x0d\xf3\xf6\x18\x2e\x3d\x8e\x83\x29\x6d\xe3\xd5\ +\xdb\x12\xa9\xf7\xe5\x56\x6c\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\ +\xdb\x02\xe0\xa1\x91\x61\xd4\xc2\xb5\x2b\x97\x59\x9c\xbf\xbe\x05\ +\x03\x36\xf8\xc0\x60\xad\x02\x0b\xdb\xc3\xc0\x50\xad\xc2\xec\xc5\ +\x4b\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa6\x36\x04\x60\x24\x5e\ +\x4a\x05\x12\x0b\xed\x91\x27\xa9\x3d\x0c\x6f\x1f\x38\xc8\x66\xc7\ +\x81\x27\x3a\xf1\x2a\xe7\x35\x1e\x32\x81\x14\x28\xba\x70\xf9\xea\ +\x55\xce\x34\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1f\x4e\x1d\x02\x0e\x6f\ +\x08\xe0\xb3\x8f\x3e\xe0\xa7\xd3\x27\x57\x99\xe9\xda\xa3\x86\x55\ +\xe6\xbb\x1e\x04\x1b\x3c\x5f\x1d\x6f\x7c\x77\xee\x8f\xd9\x5f\x0e\ +\x01\x87\x1b\x8d\xc6\x5f\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5\x73\ +\x6c\x7d\xf2\x35\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1\x3f\x4d\xf0\ +\x4b\xb9\xe8\x46\x89\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x05\xb5\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\ +\x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\ +\x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\ +\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\ +\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\ +\x46\x00\x00\x05\x2b\x49\x44\x41\x54\x78\xda\x62\xf8\xff\xff\x3f\ +\x03\x2d\x30\x40\x00\x96\xc4\x20\x05\x80\x18\x84\x81\x01\xad\x2c\ +\x78\x2e\xd5\x47\x2c\x1e\xbc\x95\xfe\xc2\xff\xff\x65\xdb\xb2\x03\ +\x09\x64\x72\xcb\xdd\x61\x66\xe8\xbd\x23\x33\x31\xe7\xc4\xa1\xaa\ +\xf0\x23\xcc\xfc\xaa\xea\x22\xa2\xd8\xfb\x39\x32\x22\xee\x39\xc6\ +\xc0\xf6\x68\xad\x41\x44\x6e\x3e\x01\x84\x62\xb0\x88\x88\x08\x83\ +\x81\x81\x01\x83\x91\x91\x11\x48\x3d\x9f\xb5\xb5\x75\x47\x67\x67\ +\xe7\xcb\x0d\x1b\x36\xfc\x3f\x70\xe0\xc0\xff\x43\x87\x0e\xfd\x5f\ +\xb3\x66\xcd\x7f\xa0\xd8\xff\x98\x98\x98\x67\xf2\xf2\xf2\x25\x20\ +\x85\xc2\xc2\xc2\x0c\x4c\x4c\x4c\x28\x06\x03\x04\x10\xdc\x60\x90\ +\xad\x42\x42\x42\x0c\x1a\x1a\x1a\x0c\x40\x0d\xd1\xdb\xb6\x6d\xfb\ +\xff\xfb\xf7\xef\xff\xd8\xc0\xfb\xf7\xef\xff\xef\xde\xbd\xfb\x7f\ +\x73\x73\xf3\xff\xc8\xc8\xc8\xff\x9c\x9c\x9c\x66\x20\x0b\x80\xbe\ +\x82\x1b\x0c\x10\x40\x60\x83\xc1\xc1\x20\x26\xc6\x00\xf4\x2a\x88\ +\x1d\x7c\xea\xd4\xa9\xff\xb8\xc0\xaf\x5f\xbf\xfe\x7f\xfb\xf6\xed\ +\xff\x9b\x37\x6f\xfe\xaf\x5c\xb9\xf2\x7f\x4d\x4d\xcd\xff\xb0\xb0\ +\xb0\xff\x40\x73\x79\x41\xae\x86\x19\x0c\x10\x40\x70\x83\x05\x05\ +\x05\x41\x96\x2a\xce\x99\x33\xe7\xff\x9f\x3f\x7f\x70\x1a\x0c\x33\ +\xf4\xd5\xab\x57\xff\x2f\x5c\xb8\xf0\xbf\xad\xad\xed\x7f\x49\x49\ +\xc9\x7f\x19\x19\x99\x4e\x58\x84\x30\x32\x32\x32\x00\x04\x10\xd8\ +\x60\x11\x60\x10\x70\x00\x6d\x89\x8d\x8b\x3b\x7a\xfb\xce\x9d\xff\ +\xf8\xc0\xe7\x2f\x5f\xfe\xbf\x78\xf1\xe2\xff\xd3\xa7\x4f\xff\x1f\ +\x3f\x7e\xfc\xff\xa4\x49\x93\xc0\x61\xee\xe3\xe3\xf3\x0d\x68\xa6\ +\x00\xcc\x60\x80\x00\x02\x1b\x2c\x0c\x72\x2d\x23\xa3\xec\xcc\x25\ +\x4b\xfe\xff\x05\x0a\xfc\xc1\x63\xf0\xc7\x9f\x3f\xff\x3f\x7b\xfe\ +\xfc\xff\xdd\xbb\x77\xff\xcf\x9a\x35\xeb\xff\xbc\x79\xf3\xfe\x4f\ +\x9f\x3e\xfd\x7f\x5e\x5e\xde\x7f\x31\x31\xb1\x6a\x98\xab\x01\x02\ +\x08\x92\xe6\x80\x40\xcd\xca\xaa\xfc\xc4\xb5\x6b\xff\x3f\x00\x23\ +\xe5\x4c\x61\xe1\xff\xf3\xd9\xd9\xff\xaf\xe6\xe6\xfe\xbf\x03\xd4\ +\x70\x0f\x88\xef\x26\x25\xfd\x3f\xe6\xef\xff\xff\xdc\x9e\x3d\xff\ +\x5f\x00\x23\x6f\xe9\xd2\xa5\xff\x67\xcc\x98\xf1\x7f\xc1\x82\x05\ +\xff\x67\xcf\x9e\xfd\xbf\xae\xae\xee\xbf\xa5\xa5\xe5\x35\x98\xb9\ +\x00\x01\x04\x37\x38\x3b\x21\xe1\xe6\x2b\x1b\x9b\xff\x1f\x95\x94\ +\xfe\xbf\x96\x93\xfb\xff\x16\x88\x5f\x88\x89\xfd\xbf\xc2\xc0\xf0\ +\x7f\x13\x10\xf7\x03\x71\x85\xac\xec\xff\xc5\xcb\x97\xff\x5f\xb6\ +\x7a\x35\xd8\xa5\x0b\x81\x86\x82\xe2\x04\xe4\xf2\xd6\xd6\xd6\xff\ +\xe1\xe1\xe1\x20\xc3\x64\x40\x91\x08\x10\x40\x10\x83\xb9\xb9\x59\ +\x4f\x02\x0d\x3a\xc3\xc4\xf4\xff\x84\xa0\xe0\xff\xeb\xca\xca\xff\ +\x8f\x00\x0d\x59\xa6\xa0\xf0\xbf\xc7\xd8\xf8\x7f\x63\x5c\xdc\xff\ +\xce\x89\x13\xff\xcf\x06\xa6\xe7\xc5\xab\x56\xfd\x5f\x01\x4c\x0d\ +\xcb\x81\x16\xcc\x9f\x3f\x1f\xec\xea\xa9\x53\xa7\xfe\xef\xea\xea\ +\xfa\x9f\x0b\xf4\x21\x2f\x2f\x6f\x06\x28\xf9\x02\x04\x10\xd8\x60\ +\x71\x06\x06\x8d\x7b\xbc\xbc\xff\x73\x81\x36\xe6\x66\x64\xfc\xcf\ +\x0c\x09\xf9\x9f\x01\x0c\x8a\xd2\xf6\xf6\xff\x5d\xc0\x70\x9f\xb7\ +\x75\xeb\xff\x95\x5b\xb6\xfc\x5f\xbf\x69\xd3\xff\xf5\x40\xc3\x57\ +\xac\x58\xf1\x7f\xf1\xe2\xc5\xe0\x20\x98\x32\x65\xca\xff\x09\x13\ +\x26\x80\x23\xb0\xb2\xb2\xf2\xbf\x8a\x8a\xca\x4a\x50\x08\x00\x04\ +\x10\xd8\x60\x59\x06\x06\xed\xf3\xdc\xdc\xff\x73\x81\x12\xb3\x81\ +\x19\x63\xf9\xce\x9d\xff\x37\x00\xc3\x7a\x1d\x90\xbd\x6e\xe3\xc6\ +\xff\x1b\x81\x06\xae\x5b\xbf\x1e\x9c\xeb\x40\x2e\x5d\x02\xb4\x0c\ +\xe4\x5a\x50\xa4\x81\x0c\xed\xee\xee\xfe\xdf\x0e\x74\x44\x6d\x6d\ +\xed\x7f\x60\x71\x70\x15\x64\x2e\x40\x00\x81\x0d\x66\x03\x66\x9a\ +\xbd\xc0\x30\x14\xe3\xe3\x9b\x27\xac\xa4\xd4\xea\xed\xeb\xfb\xb0\ +\xa7\xa7\xe7\xff\xda\xb5\x6b\xff\x83\xb2\x33\x28\x23\x2c\x5b\xb6\ +\x0c\x6c\xe0\xc2\x85\x0b\xc1\xe1\x0a\x32\x74\x22\x30\x78\x40\x86\ +\x82\xc2\xb7\xa1\xa1\x01\x6c\xb0\xaf\xaf\xef\x2f\x50\x71\x00\x10\ +\x40\x60\x83\xb9\x81\xac\x76\x06\x86\x63\xf6\x0c\x0c\x1d\xca\x90\ +\x72\x02\x04\x02\xec\xec\xec\xae\x80\x32\x00\x28\x05\x2c\x5a\xb4\ +\xe8\xff\xdc\xb9\x73\xc1\x11\x05\x0a\x53\x98\x4b\x41\xf2\xf5\xf5\ +\xf5\xff\xab\xab\xab\xff\x57\x55\x55\xfd\x0f\x08\x08\x00\x45\xa0\ +\x24\x40\x00\x81\x0d\x36\x07\xb2\x8c\x81\x06\x05\x30\x30\x6c\x86\ +\x99\xca\x0b\xc9\x89\x0c\xc2\x22\x22\x4d\xb9\xc0\xe4\x36\x79\xf2\ +\x64\xb0\x2b\x61\x86\x82\x22\x0b\xe6\x52\x98\xa1\x15\x15\x15\xff\ +\x6d\x6c\x6c\x1e\x00\xb5\x71\x02\x04\x10\x3c\xb9\x21\x03\x61\x20\ +\x36\x80\xb2\x15\x95\x95\x41\x45\xa2\x7b\x54\x54\x14\x38\x82\xfa\ +\xfb\xfb\xe1\xde\x07\xb9\x14\x54\x56\x80\x0c\x2d\x2b\x2b\xfb\x9f\ +\x04\x4c\xeb\xc0\xf2\xa6\x16\xa4\x0f\x20\x80\xc0\x06\xfb\x00\x19\ +\x7e\x0c\x0c\xbe\xbd\x40\x17\x27\x32\x30\x4c\x04\x72\x45\x34\xa0\ +\x06\x6b\x6a\x6b\x33\x08\x08\x80\x73\xaa\xaa\xb7\xb7\xf7\x27\x90\ +\xeb\x1a\x1b\x1b\xe1\x86\x82\x5c\x59\x54\x54\xf4\x3f\x28\x28\xe8\ +\x3f\x3f\x3f\x7f\x1f\x50\x1d\x3b\x48\x31\x40\x00\x81\x0d\xb6\x64\ +\x60\x70\xff\x9f\x93\xf3\x1f\xa8\xf2\xff\x7f\x5d\xdd\xff\xa7\x80\ +\x11\x09\x4c\x29\xbe\x30\x1f\x88\x03\x0b\x29\x0e\x0e\x70\xd9\xce\ +\x20\x2b\x2b\x3b\x21\x30\x30\xf0\x7f\x5a\x5a\xda\xff\xac\xac\xac\ +\xff\xa9\xa9\xa9\xff\x4d\x4d\x4d\x9f\x00\xa5\xfc\x91\x7d\x0d\x10\ +\x40\x60\x83\xe7\x30\x30\xf4\x01\xa3\xf4\x3f\x30\xba\xff\x03\x53\ +\xfc\x7f\x60\x0c\xfc\xcf\x67\x60\x78\x88\xac\x8e\x8f\x8f\x0f\x25\ +\xb4\x80\x65\x70\x34\xb0\xfc\x6e\x66\x67\x67\xcf\x06\xf2\xe5\xd1\ +\x83\x13\x20\x80\xc0\x06\xcb\x31\x30\xd8\xce\x05\xba\xf2\x88\xb0\ +\xf0\xff\x43\xc0\x5c\xd7\x28\x24\xf4\x93\x87\x81\x21\x1d\x59\x1d\ +\x28\x38\xc0\xa5\x16\x14\x80\x2a\x05\x69\x69\x69\x58\x30\x61\x00\ +\x80\x00\x02\x1b\x6c\x80\xe0\x6a\x03\xb1\x1e\x3c\x9c\xd0\x0c\x06\ +\x97\x01\x50\x00\xaa\xc6\x80\xc1\x02\xb6\x00\x1b\x00\x08\x30\x00\ +\x69\x36\x5f\x67\xcd\x5c\xcb\xcb\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x04\x4e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x01\x07\x0b\x01\x15\x4b\x06\x3c\xc6\x00\x00\x03\xcb\x49\x44\ +\x41\x54\x78\xda\xb5\x96\xcf\x4b\x1c\x49\x14\xc7\x3f\x5d\xd3\x3d\ +\x62\xa2\xf8\x63\x8c\x60\x12\x33\x92\xbb\xae\x88\x17\x5b\x50\xc1\ +\x40\x18\x08\xe3\x06\x57\x84\xe0\x68\xbc\xcd\x25\x07\x73\x8a\xf9\ +\x07\x3c\xe9\x7f\x21\xa8\x43\x2e\xc1\x04\x8c\x27\x41\x4d\x34\xd9\ +\x55\x83\x10\x44\x44\x57\x34\x1e\x46\x3c\x98\x66\x7a\xba\xbb\xaa\ +\x7b\x0f\x71\x1a\x25\x8e\x2e\x8b\x5b\xf0\xa0\xba\xaa\x78\x9f\xf7\ +\xbe\xf5\xba\xaa\xe0\x7f\x6e\x5a\xb1\x89\x44\x22\x91\xcc\x66\xb3\ +\x7d\x8e\xe3\x98\x52\xca\x07\x4a\x29\x80\x7d\x60\xb9\xa2\xa2\x22\ +\xf3\xf9\xf3\xe7\xb7\xff\x09\x90\x4a\xa5\x5a\x36\x36\x36\x26\x84\ +\x10\x9d\xdd\xdd\xdd\x34\x35\x35\x11\x8b\xc5\xf0\x7d\x9f\x6c\x36\ +\xcb\xea\xea\x2a\x73\x73\x73\x48\x29\x17\xee\xdd\xbb\xf7\x72\x65\ +\x65\xe5\xaf\x7f\x0d\xe8\xea\xea\x4a\x1e\x1d\x1d\xbd\x31\x4d\x53\ +\xef\xed\xed\xa5\xb6\xb6\x16\xc3\x30\xd0\x34\x0d\xdf\xf7\xf1\x3c\ +\x8f\x7c\x3e\xcf\xf7\xef\xdf\x99\x9c\x9c\xe4\xe3\xc7\x8f\xb2\xb2\ +\xb2\xb2\x77\x67\x67\xa7\x68\x36\x91\x42\xa7\xa7\xa7\xa7\x65\x7b\ +\x7b\x7b\xfe\xe9\xd3\xa7\xfa\xd0\xd0\x10\x35\x35\x35\x94\x97\x97\ +\x53\x5d\x5d\x4d\x4d\x4d\x0d\x77\xee\xdc\x21\x16\x8b\x51\x56\x56\ +\x46\x59\x59\x19\x8d\x8d\x8d\xd8\xb6\x2d\xd6\xd7\xd7\xfb\xee\xdf\ +\xbf\xff\xee\xe4\xe4\xe4\xe8\x32\x80\x5e\xe8\x7c\xfd\xfa\x75\xc2\ +\x34\x4d\xbd\xbf\xbf\x9f\xd7\xaf\x5f\x63\x18\x06\x86\x61\x20\x84\ +\x60\x7a\x7a\x9a\x20\x08\xe8\xef\xef\x27\x08\x02\x82\x20\xc0\xf3\ +\x3c\x5e\xbd\x7a\xc5\xe1\xe1\xa1\xfe\xe5\xcb\x97\x09\xa0\xeb\x32\ +\x80\x00\x68\x6e\x6e\x4e\xfa\xbe\xdf\x39\x38\x38\xc8\xad\x5b\xb7\ +\x88\x46\xa3\x94\x94\x94\x20\x84\x40\xd3\x34\x84\x10\x61\x5f\xd3\ +\x7e\xaa\x1a\x89\x44\x78\xf8\xf0\x21\xe9\x74\x9a\x20\x08\x3a\xab\ +\xab\xab\x93\x45\x01\xd9\x6c\xb6\x2f\x99\x4c\x52\x57\x57\xc7\xed\ +\xdb\xb7\xd1\xf5\x9f\x89\x65\x32\x19\x32\x99\x4c\xe8\x78\x66\x66\ +\x86\xa9\xa9\xa9\xf0\x5b\x08\x41\x73\x73\x33\x89\x44\x02\xdb\xb6\ +\xfb\x8a\x02\x1c\xc7\x31\xdb\xdb\xdb\x89\x46\xa3\x94\x97\x97\x87\ +\x51\x06\x41\x70\x61\x71\x41\x9e\x0b\x55\xa2\x69\x3c\x7a\xf4\x08\ +\xa5\x94\x59\xb4\x8a\xaa\xaa\xaa\xbc\xd9\xd9\x59\xfd\xee\xdd\xbb\ +\x54\x56\x56\x12\x8d\x46\x89\x44\x22\x44\x22\x11\x84\x10\xa1\x73\ +\xdf\xf7\x51\x4a\xe1\x79\x5e\x58\x51\xb9\x5c\x8e\x83\x83\x03\x1e\ +\x3f\x7e\x2c\x5d\xd7\x35\x2e\xdd\x64\xa5\x14\x9a\xa6\xa1\xeb\x3a\ +\x4a\x29\xce\x7e\xaa\x5f\xb2\x28\xcc\x9d\x07\x49\x29\xf1\x3c\xef\ +\x97\xcc\x2e\x48\xa4\x94\xda\xdf\xdd\xdd\x0d\x6b\x7d\x60\x60\x80\ +\x67\xcf\x9e\x21\xa5\x0c\xed\xbc\xb3\x54\x2a\xc5\xf0\xf0\x30\x9e\ +\xe7\xe1\xba\x2e\x5b\x5b\x5b\x28\xa5\xf6\x8b\x02\x82\x20\x58\xfe\ +\xf0\xe1\x03\xf9\x7c\x1e\xd7\x75\xc3\x28\x5d\xd7\xc5\x71\x9c\xd0\ +\x5c\xd7\xc5\x75\xdd\x30\x83\xc2\xf8\xdc\xdc\x1c\xbe\xef\x2f\x17\ +\x05\x08\x21\x32\x99\x4c\x86\xed\xed\x6d\x6c\xdb\x0e\xa5\x48\xa5\ +\x52\x0c\x0c\x0c\x60\xdb\x36\x8e\xe3\x90\x4a\xa5\x78\xfe\xfc\x39\ +\x52\x4a\x94\x52\xd8\xb6\xcd\xb7\x6f\xdf\x78\xff\xfe\x3d\x40\xa6\ +\x28\xc0\xb2\xac\x0d\x29\xe5\xc2\xd8\xd8\x18\x96\x65\x5d\xd0\x57\ +\x29\x85\x65\x59\xe1\x78\xc1\xa4\x94\x9c\x9e\x9e\x32\x3e\x3e\x8e\ +\xef\xfb\x0b\xc0\xdb\x2b\xcf\x22\xc3\x30\x5a\x80\x95\x27\x4f\x9e\ +\xe8\x23\x23\x23\x18\x86\x81\xae\xeb\x61\xcd\xfb\xbe\x1f\x6e\xb4\ +\xeb\xba\xe4\x72\x39\xc6\xc7\xc7\x99\x9f\x9f\x97\xc0\xef\xc0\xbb\ +\x2b\xcf\x22\xdf\xf7\xa3\x9a\xa6\x2d\x6c\x6d\x6d\xf5\xad\xad\xad\ +\x89\xfa\xfa\x7a\x4a\x4b\x4b\x71\x5d\x37\x94\xc8\x71\x1c\x2c\xcb\ +\x62\x73\x73\x93\xb1\xb1\x31\x3e\x7d\xfa\x24\x81\x1c\xf0\x07\x70\ +\x02\xfc\x79\xdd\x71\x1d\x07\x62\x9a\xa6\x4d\x08\x21\x3a\x3b\x3a\ +\x3a\x68\x6b\x6b\xa3\xa1\xa1\x01\x80\x9d\x9d\x1d\x96\x96\x96\x58\ +\x5c\x5c\x04\x58\x00\x5e\x02\x6f\x80\xaa\xb3\x60\x8f\x81\x17\xc0\ +\xec\x75\x17\x4e\x1c\xf8\x0d\xe8\x03\x4c\xe0\xc1\xd9\xf8\x3e\xb0\ +\x7c\xb6\xa1\xc7\xc0\x21\x40\x43\x43\xc3\x26\xa0\xed\xed\xed\x09\ +\xc0\x03\x12\x67\xeb\xae\x6d\xf1\x2b\xec\xfc\x9a\xe3\x74\x3a\xed\ +\xb5\xb6\xb6\xda\xc0\xe9\x99\x6c\xf1\x9b\xbc\x7a\xe3\xc0\x8f\xd1\ +\xd1\x51\x65\x9a\xa6\x04\x7e\x00\xd6\x4d\x42\x0a\x59\xe5\xd3\xe9\ +\xb4\x17\x8f\xc7\xbd\x9b\x06\x9c\x87\x1c\x01\x0a\xe8\x04\xe2\xda\ +\x0d\xbf\x52\xce\x47\xfc\x37\xc0\x3f\x72\x9e\x0b\x66\xc1\xc5\x97\ +\x96\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x07\x66\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xc8\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xad\x58\xae\x9e\ +\x00\x00\x07\x2d\x49\x44\x41\x54\x78\x5e\xed\xdd\x41\x6e\x1c\x47\ +\x10\x44\xd1\xf1\x7d\xfa\x0e\xb2\x4e\x26\xe9\x64\xa6\xef\xd0\xf7\ +\xb1\x41\x40\xf0\x4e\x46\xf5\x00\x91\x08\x28\x1f\xd7\x39\x31\x59\ +\x3f\xea\xa3\x36\x04\xf9\xc7\xcb\x0f\x02\x08\xfc\x92\xc0\x1f\xd8\ +\x20\x80\xc0\xaf\x09\x10\xc4\xed\x40\xe0\x7f\x08\x10\xc4\xf5\x40\ +\x80\x20\xee\x00\x02\xef\x11\xf0\x82\xbc\xc7\xcd\xa7\x96\x10\x20\ +\xc8\x92\xa2\x1d\xf3\x3d\x02\x04\x79\x8f\x9b\x4f\x2d\x21\x40\x90\ +\x25\x45\x3b\xe6\x7b\x04\x08\xf2\x1e\x37\x9f\x5a\x42\x80\x20\x4b\ +\x8a\x76\xcc\xf7\x08\x10\xe4\x3d\x6e\x3e\xb5\x84\xc0\x63\x41\xae\ +\xeb\xfa\xd6\xc8\xe6\xbe\xef\x1f\x8d\x7b\x6d\xdc\xe9\xba\xae\x3f\ +\x5f\xaf\xd7\x97\xc2\xb3\xff\x7d\xdf\xf7\xc7\x93\xbd\xde\x11\xe4\ +\xaf\xd7\xeb\xf5\x09\xa0\xe9\xe7\xe3\xbe\xef\xaf\x4d\x0b\x6d\xde\ +\xe5\xa7\x20\x9f\xf7\xa4\xed\xe7\x2b\x41\xda\x2a\x59\xb8\x0f\x41\ +\xbc\x20\x0b\xaf\xfd\xf9\x91\x09\x42\x90\xf3\xdb\xb2\x70\x92\x20\ +\x04\x59\x78\xed\xcf\x8f\x4c\x10\x82\x9c\xdf\x96\x85\x93\x04\x21\ +\xc8\xc2\x6b\x7f\x7e\x64\x82\x10\xe4\xfc\xb6\x2c\x9c\x24\x08\x41\ +\x16\x5e\xfb\xf3\x23\x13\x84\x20\xe7\xb7\x65\xe1\x24\x41\x08\xb2\ +\xf0\xda\x9f\x1f\x99\x20\x04\x39\xbf\x2d\x0b\x27\x09\xf2\x4c\x10\ +\xbf\x27\xb5\x50\x92\xf4\x91\xdf\x94\xb0\xf2\x77\xb1\x08\x92\xbe\ +\x2d\x0b\xf3\x09\xb2\xb0\x74\x47\x3e\x27\x40\x90\x73\x56\x26\x17\ +\x12\x20\xc8\xc2\xd2\x1d\xf9\x9c\x00\x41\xce\x59\x99\x5c\x48\x80\ +\x20\x0b\x4b\x77\xe4\x73\x02\x04\x39\x67\x65\x72\x21\x01\x82\x2c\ +\x2c\xdd\x91\xcf\x09\x10\xe4\x9c\x95\xc9\x85\x04\x08\xb2\xb0\x74\ +\x47\x3e\x27\x40\x90\x73\x56\x26\x17\x12\x20\xc8\xc2\xd2\x1d\xf9\ +\x9c\x00\x41\xce\x59\x99\x5c\x48\x80\x20\x0b\x4b\x77\xe4\x73\x02\ +\x04\x39\x67\x65\x72\x21\x01\x82\x2c\x2c\xdd\x91\xcf\x09\x10\xe4\ +\x9c\x95\xc9\x85\x04\x08\xb2\xb0\x74\x47\x3e\x27\x40\x90\x73\x56\ +\x26\x17\x12\x20\xc8\xc2\xd2\x1d\xf9\x9c\x00\x41\xce\x59\x99\x5c\ +\x48\x80\x20\x0b\x4b\x77\xe4\x73\x02\x04\x39\x67\x65\x72\x21\x01\ +\x82\x2c\x2c\xdd\x91\xcf\x09\xd4\x0a\x72\x7e\x84\xd9\xc9\xeb\xba\ +\xfe\x99\xfd\x46\xdf\xf6\x7f\x04\xee\xfb\x7e\xfc\x0f\x62\x1b\x89\ +\xfe\x16\x87\xf8\x04\x4b\x90\xae\xeb\x45\x90\xae\x3e\x08\x52\xd6\ +\x07\x41\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\ +\x10\xa4\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\ +\x41\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\ +\xa4\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\ +\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\ +\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\ +\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\ +\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\x0a\ +\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\x10\ +\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\x0a\xf1\ +\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\x90\xc6\ +\x75\xae\xeb\xfa\xf6\x7a\xbd\xbe\x87\x77\xfb\x7e\xdf\xf7\x8f\xf0\ +\x77\xac\x8d\xff\x6d\xfe\x70\x5c\x63\x83\x04\x69\x6c\xe5\xd9\x4e\ +\x04\x79\xc6\xeb\xd1\x34\x41\x1e\xe1\xaa\x1c\x26\x48\xb0\x16\x82\ +\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\ +\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\ +\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\ +\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\ +\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\ +\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\ +\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\ +\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\ +\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\ +\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\ +\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\ +\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\ +\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\ +\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\ +\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\ +\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\ +\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\ +\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\ +\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\ +\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\ +\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\ +\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\ +\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\ +\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\ +\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\ +\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\ +\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\ +\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\ +\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\ +\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\ +\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\ +\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\ +\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\ +\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\ +\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\ +\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\ +\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\ +\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\ +\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\ +\x14\xfd\x58\x90\xeb\xba\xfe\x7a\xbd\x5e\x7f\x3e\xd8\xef\xe3\xbe\ +\xef\xaf\x0f\xe6\x7f\x9b\x51\x82\xe4\xaa\xbc\xae\xeb\xf3\x0e\x7e\ +\xde\xc5\x27\x3f\x5f\xef\xfb\xfe\x78\xf2\x01\x82\x3c\xa1\xf5\x70\ +\x96\x20\x0f\x81\x3d\x18\x27\xc8\x03\x58\xad\xa3\x04\xc9\x35\x43\ +\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\xc7\x76\x2c\x99\x20\x39\ +\xd4\x04\xc9\xb1\x1d\x4b\x26\x48\x0e\x35\x41\x72\x6c\xc7\x92\x09\ +\x92\x43\x4d\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\xc7\x76\x2c\ +\x99\x20\x39\xd4\x04\xc9\xb1\x1d\x4b\x26\x48\x0e\x35\x41\x72\x6c\ +\xc7\x92\x09\x92\x43\x4d\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\ +\xc7\x76\x2c\xf9\xa7\x20\xf1\xef\xbb\xef\xfb\x47\xfc\x4b\xca\xbe\ +\x80\x20\x65\x85\x58\xa7\x8b\x00\x41\xba\xfa\xb0\x4d\x19\x01\x82\ +\x94\x15\x62\x9d\x2e\x02\x04\xe9\xea\xc3\x36\x65\x04\x08\x52\x56\ +\x88\x75\xba\x08\x10\xa4\xab\x0f\xdb\x94\x11\x20\x48\x59\x21\xd6\ +\xe9\x22\x40\x90\xae\x3e\x6c\x53\x46\x80\x20\x65\x85\x58\xa7\x8b\ +\x00\x41\xba\xfa\xb0\x4d\x19\x01\x82\x94\x15\x62\x9d\x2e\x02\x04\ +\xe9\xea\xc3\x36\x65\x04\x7e\x27\x41\x26\xd0\xae\xfd\xe3\x74\x13\ +\x70\x9f\x7e\xc7\x9b\x97\xf7\xe9\xd7\xbc\x33\x5f\xf9\x87\xe3\xde\ +\x39\xc8\xd3\xcf\x10\xe4\x29\xb1\xe0\x3c\x41\x9e\xfd\xe9\xd1\x60\ +\x15\xff\x45\x13\x64\x82\xf2\xe1\x77\x10\x84\x20\x87\x57\x65\xe7\ +\x18\x41\x08\xb2\xf3\xe6\x1f\x9e\x9a\x20\x04\x39\xbc\x2a\x3b\xc7\ +\x08\x42\x90\x9d\x37\xff\xf0\xd4\x04\x21\xc8\xe1\x55\xd9\x39\x46\ +\x10\x82\xec\xbc\xf9\x87\xa7\x26\x08\x41\x0e\xaf\xca\xce\x31\x82\ +\x10\x64\xe7\xcd\x3f\x3c\x35\x41\x08\x72\x78\x55\x76\x8e\x6d\x17\ +\xe4\x5b\x63\xed\x1b\xff\x78\x5a\x63\x0f\x9f\x3b\xfd\x14\xe4\x4b\ +\xe1\x7e\x7f\xc7\xff\x89\x67\xe1\xa1\xad\x84\x40\x8c\xc0\xe3\xff\ +\x72\x1b\xdb\x44\x30\x02\x85\x04\x08\x52\x58\x8a\x95\x7a\x08\x10\ +\xa4\xa7\x0b\x9b\x14\x12\x20\x48\x61\x29\x56\xea\x21\x40\x90\x9e\ +\x2e\x6c\x52\x48\x80\x20\x85\xa5\x58\xa9\x87\x00\x41\x7a\xba\xb0\ +\x49\x21\x01\x82\x14\x96\x62\xa5\x1e\x02\x04\xe9\xe9\xc2\x26\x85\ +\x04\x08\x52\x58\x8a\x95\x7a\x08\x10\xa4\xa7\x0b\x9b\x14\x12\xf8\ +\x17\xc5\x5a\x12\x14\xba\xe4\x5b\x22\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x77\xc9\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x01\x2a\x00\x00\x01\x08\x08\x06\x00\x00\x00\xe8\x5e\xb9\x12\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\x00\x00\xfa\ +\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\ +\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\x62\x4b\x47\ +\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x00\x09\x70\ +\x48\x59\x73\x00\x00\xd0\xcb\x00\x00\xd0\xcb\x01\x9f\x0e\xc0\x23\ +\x00\x00\x75\xde\x49\x44\x41\x54\x78\xda\xed\xbd\x67\xb4\x24\xd7\ +\x75\xdf\xfb\x3f\xd5\xf1\xe6\x1c\x26\x03\x18\x60\x30\x18\x0c\x66\ +\x10\x07\x83\x9c\x01\x82\x14\x49\x91\x22\x29\x3d\x2a\xd9\xb2\x6c\ +\x53\x92\x6d\xc9\xb2\xad\x67\x39\x2b\x58\x8e\x1f\xfc\xd6\xfb\x60\ +\xd9\x7e\x5e\x96\xc3\xf2\x32\x2d\x4a\xcc\x49\x94\x45\x52\x24\x45\ +\x10\x04\x88\x8c\xc1\x00\x83\xc9\x37\xe7\x7b\xfb\x76\xee\x3a\xef\ +\x43\xa5\x93\xab\xaa\xc3\x0d\x83\xda\xc0\x9d\xee\x3a\x67\x9f\x50\ +\xe9\xd7\xfb\xec\x93\x08\x12\x49\x64\x9b\x64\xf2\xf4\xa7\xbc\xaf\ +\x07\x00\xfc\x2c\x80\x4f\x02\xe8\x02\xf0\x1a\x80\x7f\x07\xe0\x5b\ +\x00\x30\xfb\xdc\xef\x6f\x77\x55\x13\xd9\x66\x21\xdb\x5d\x81\x44\ +\xde\x9b\xc2\x40\xea\x24\x80\x7f\x09\xe0\x09\x00\x19\x46\xe5\x55\ +\x00\x7f\x1d\xc0\x73\x40\x02\xab\xf7\xba\x58\xdb\x5d\x81\x44\xde\ +\x7b\xe2\x42\x8a\x00\x78\x0a\xc0\x1f\x00\x78\x1f\x78\x48\x01\xc0\ +\x09\x38\xa0\xca\xc4\xc9\x3b\x91\x6b\x53\x12\x50\x25\xb2\xa5\xe2\ +\x42\x2a\x03\xe0\x67\x00\xfc\x27\x00\xb7\x1b\xd4\x6f\x07\x30\xb0\ +\xdd\x75\x4e\x64\xfb\x25\x01\x55\x22\x5b\x26\x2e\xa4\xfa\x00\xfc\ +\x3a\x80\xff\x07\xc0\xa1\x90\x24\x3d\xee\x5f\x22\xef\x71\x49\x6f\ +\x77\x05\x12\x79\x6f\x88\x0b\xa9\x71\x00\xff\x08\xc0\x2f\xc2\x71\ +\x9a\x27\x92\x48\x24\x49\x40\x95\x48\x47\x85\x71\x9a\xdf\x04\xc7\ +\x69\xfe\x21\x24\xcf\x5d\x22\x31\x25\x79\x60\x12\xe9\x98\x30\x90\ +\x3a\x0d\xe0\xdf\x02\x78\x60\xbb\xeb\x94\xc8\xee\x94\xc4\x47\x95\ +\x48\x47\xc4\x85\x94\x05\xe0\xc3\x00\xfe\x0b\x12\x48\x25\xd2\x82\ +\x24\xa0\x4a\xa4\xed\xe2\x42\x2a\x0f\xe0\xaf\x01\xf8\x7d\x00\x47\ +\xb7\xbb\x4e\x89\xec\x6e\x49\x9a\x7e\x89\xb4\x55\x5c\x48\x0d\x02\ +\xf8\x3b\x00\x7e\x15\x4e\x2f\x5f\x22\x89\xb4\x24\x09\xa8\x12\x69\ +\x8b\x30\xfe\xa8\xfd\x00\x7e\x1b\xc0\x4f\x03\xc8\x9a\xd2\x50\x00\ +\x29\x2b\x05\xdb\x6e\x6c\x77\xf5\x13\xd9\xe1\x92\x34\xfd\x12\x69\ +\x59\x18\x48\xdd\x06\x67\x10\xe7\xcf\xc3\x00\x29\x4a\x29\x52\xa9\ +\x14\xee\xb9\xf3\x38\xf6\xee\xdf\x0f\x4a\xe9\x76\x9f\x42\x22\x3b\ +\x5c\x12\x50\x25\xd2\x92\x30\xd3\x61\x1e\x47\x30\x1d\x46\xfb\x5c\ +\x51\x4a\xd1\xd5\x95\xc7\x47\xdf\xff\x20\xfe\xd2\xc7\x9f\x42\x7f\ +\x5f\x0f\x12\x4e\x25\x12\x26\x49\xd3\x2f\x91\xa6\xc5\x85\x54\x1a\ +\xc0\xc7\x01\xfc\x73\x00\xd7\x9b\xf4\x6d\x9b\x62\x68\xb0\x0f\x3f\ +\xf5\xe1\x47\xf1\xf4\xc3\xb7\x63\xa3\x54\x4f\xac\xa9\x44\x22\x49\ +\x02\xaa\x44\x9a\x12\x17\x52\x3d\x00\x7e\x09\xc0\xdf\x07\x30\x62\ +\xd2\xb7\x6d\x8a\x7d\x7b\xc6\xf0\xf3\x9f\x78\x0a\xa7\x6f\xbf\x09\ +\x29\xcb\x02\xa5\xb5\xed\x3e\x8d\x44\x76\x89\x24\xa0\x4a\x24\xb6\ +\xb8\x90\x1a\x05\xf0\x0f\xe1\x0c\x41\xe8\x36\xe9\x53\x4a\x71\xcb\ +\x91\x43\xf8\x4b\x9f\x78\x0a\xc7\x6e\x3a\x00\x50\x8a\xc4\x8e\x4a\ +\x24\x8e\x24\xa0\x4a\x24\xb2\x30\x4e\xf3\xc3\x00\x7e\x0f\xc0\x47\ +\x61\x78\x86\x28\xa5\x20\xc4\xc2\xe9\xbb\x8e\xe1\xe7\x3e\xf6\x04\ +\x0e\xec\x19\x86\x4d\x69\xb2\x08\x5a\x22\xb1\x25\x01\x55\x22\x91\ +\x84\x81\xd4\x3d\x70\xa6\xc3\x3c\x6c\xd2\xa7\x94\x22\x93\xc9\xe0\ +\x89\x87\xee\xc4\x4f\x7d\xe8\x61\x8c\x0c\xf4\xc0\xb6\x29\x40\x00\ +\x0a\xe2\xc0\xca\x33\xab\x12\x72\x25\x12\x22\x09\xa8\x12\x09\x15\ +\x66\x3a\xcc\xb3\x00\xfe\x35\x80\x63\x26\x7d\x9b\x52\xf4\xf6\x74\ +\xe1\xc3\xcf\x3c\x80\x0f\x3d\x75\x0a\xdd\xf9\x2c\x6c\xcf\x69\x4e\ +\x01\x10\xa7\xe9\x97\x34\xff\x12\x89\x2a\x09\xa8\x12\x31\x8a\x0b\ +\xa9\x1c\x9c\x35\xcd\x7f\x0b\xc0\x5e\x93\xbe\x6d\x53\x8c\x8e\x0c\ +\xe2\x93\x1f\x79\x1c\x8f\x9c\xbe\x15\x99\x74\x4a\x6e\xee\x51\xff\ +\x9f\x44\x12\x89\x24\x09\xa8\x12\xd1\x8a\x0b\xa9\x01\x00\xbf\x06\ +\x67\xb1\xbb\x7e\x93\xbe\x4d\x29\x0e\x1d\x98\xc4\xcf\x7f\xfc\x29\ +\xdc\x75\xfc\x06\x10\x02\x7f\xf8\x01\x85\xba\x85\x97\xe0\x2a\x91\ +\x28\x92\x80\x2a\x11\x49\x18\x7f\xd4\x5e\x00\xff\x0c\xc0\xcf\xc1\ +\xb1\xaa\xb4\x42\x29\x70\xe2\x96\xc3\xf8\xb9\x8f\x3f\x89\x23\xd7\ +\xed\x01\xa5\xd4\x19\xc8\xc9\xd0\x29\x71\x49\x25\xd2\xac\x24\xa0\ +\x4a\x84\x13\x06\x52\xc7\xe0\xf8\xa3\x9e\x45\xc8\x48\x73\x2b\x95\ +\xc2\x83\xf7\x1c\xc7\x4f\x7f\xe4\x31\xec\x19\x1b\xf4\xfd\x51\x3a\ +\x87\xb9\x17\x9b\x58\x53\x89\x44\x95\x04\x54\x89\xf8\xc2\x40\xea\ +\x61\x38\x3d\x7b\xf7\x98\xf4\x29\xa5\xc8\xe5\xb2\x78\xe6\xd1\x7b\ +\xf0\xb1\x0f\x3c\x80\xfe\xde\x2e\xd8\xd4\x86\x47\x25\xce\xa0\x52\ +\xb5\xfd\x12\x5f\x55\x22\x11\x25\x01\x55\x22\x00\xb8\xe9\x30\x1f\ +\x85\x33\x46\xea\xb0\x49\xdf\xb6\x29\x06\xfa\x7b\xf1\xd1\x0f\x3c\ +\x84\xf7\x3d\x72\x07\xf2\xb9\x0c\x33\x1d\x26\xa0\x12\x67\x50\x49\ +\xd6\x55\x02\xa9\x44\xa2\x49\x02\xaa\x44\x3c\x48\x75\xc3\x19\x65\ +\xfe\x0f\xe1\x8c\x3a\xd7\x8a\x6d\x53\x4c\x4e\x8c\xe0\xa7\x3f\xfa\ +\x04\xee\xbf\xf3\x66\xa4\x52\x04\xb6\x4d\x41\xe4\xae\x3d\x18\x81\ +\x95\x48\x22\x11\x25\x01\xd5\x7b\x58\x98\xa6\xde\x30\x80\xdf\x04\ +\xf0\xcb\x88\x30\x1d\xe6\xc6\x1b\xf6\xe3\xe7\x3f\xf6\x14\x8e\xdf\ +\x7c\x10\x00\xf5\x57\x3f\xf0\x3e\x23\x03\x2b\x91\x44\x22\x4a\x02\ +\xaa\xf7\xa8\x30\x90\xba\x0e\x4e\x53\xef\xe3\x88\xf0\x3c\xdc\x79\ +\xe2\x66\xfc\xec\x4f\x3c\x81\xeb\xf6\x8d\xf1\x2b\x1f\xb0\xce\x72\ +\xea\xc0\xaa\xd1\xa0\xb0\x29\x45\x26\x6d\x41\x05\xac\xc4\x45\x95\ +\x48\x54\x49\x40\xf5\x1e\x14\x06\x52\x77\xc2\x71\x9a\x3f\x0a\x83\ +\x91\x43\x29\x45\x3a\x9d\xc6\x23\xf7\x9d\xc4\x4f\x7e\xe8\x11\x8c\ +\x0e\xf5\xf1\x3d\x7b\x00\xe7\x2c\x27\x00\x2a\xd5\x06\xa6\x16\x0b\ +\xe8\xef\xc9\x61\x6c\x20\xcf\xf0\x28\x21\x53\x22\xf1\x25\x01\xd5\ +\x7b\x4c\x98\x85\xee\x9e\x81\x33\xfc\xe0\x36\x93\x3e\xa5\x14\xdd\ +\x5d\x79\xbc\xff\xc9\xd3\xf8\xd0\x53\xf7\xa2\xa7\x3b\xc7\x8d\x34\ +\x57\xf5\xec\x6d\x96\x6b\xb8\x3c\xbf\x81\x8d\x62\x0d\x7d\xdd\x59\ +\x0d\x9a\xa8\xf7\x7f\x22\x89\x84\x4a\x02\xaa\xf7\x90\xb8\x90\xca\ +\xc2\x59\xcf\xfc\xb7\xe1\xac\x6f\xae\x15\x9b\x52\x0c\x0f\xf6\xe3\ +\xe3\x1f\x7c\x14\x8f\xdd\x77\x1c\xd9\x4c\x9a\x19\x69\xee\xe0\x89\ +\x80\x6f\xd4\xad\x15\x2a\xb8\x3c\xb7\x8e\x62\xa5\x0e\xcb\x0a\x8c\ +\x34\xae\x95\x98\x38\xa8\x12\x89\x29\x09\xa8\xde\x03\xc2\x34\xf5\ +\xfa\xe0\xec\x0c\xf3\x77\xe1\x4c\x8d\xd1\x0a\xa5\x14\x07\xf6\x8e\ +\xe3\xa7\x3f\xfa\x24\xee\xba\xed\x30\x2c\x66\x3a\x0c\xdb\x75\xe7\ +\xad\x84\x40\x29\xb0\xb0\x5e\xc4\xd5\x85\x02\xaa\xb5\x86\x1f\xa6\ +\x9a\x7d\xcc\xce\x4f\x4e\x24\x91\x28\x92\x80\xea\x1a\x17\x06\x52\ +\x93\x00\xfe\x29\x80\xbf\x8c\x08\xd3\x61\x6e\x39\x72\x3d\x7e\xe6\ +\x27\x9e\xc0\xcd\x37\xec\x75\xa6\xc3\x40\x37\x78\x93\xa2\x61\x53\ +\xcc\x2e\x17\x31\xb3\x54\x40\xbd\xe1\x0c\x53\xf0\x54\xa8\x32\x0d\ +\xe0\xae\xf7\x92\x48\x22\x91\x24\x01\xd5\x35\x2c\x0c\xa4\x6e\x06\ +\xf0\xaf\x00\xfc\x18\x80\x94\x4e\x9f\x52\x20\x95\x22\xb8\xe7\x8e\ +\x63\xf8\xe4\x8f\x3f\x86\x7d\x13\x43\xc1\xf2\x2c\x90\xc7\x42\x11\ +\x02\x54\xeb\x36\xa6\x16\x36\x30\xbf\x5a\x02\x37\xde\x13\x00\x25\ +\x7c\xba\x04\x4c\x89\x34\x2b\x09\xa8\xae\x51\x61\x20\xf5\x00\x9c\ +\x9e\xbd\xd3\x26\x7d\x4a\x29\xb2\xd9\x2c\x9e\x78\xe8\x2e\x7c\xf4\ +\xfd\x0f\x60\xa8\xaf\xdb\x5f\xe8\x4e\xd2\x85\x13\x5c\xac\xd4\x71\ +\x79\x6e\x03\xab\x85\xb2\x14\x0f\x10\x10\xa6\xd9\xa7\x1a\x3f\x95\ +\x2c\x48\x9c\x48\x54\x49\x40\x75\x0d\x8a\x0b\xa9\x14\x80\x0f\x03\ +\xf8\x97\x00\x6e\x32\xe9\x53\x4a\xd1\xd7\xdb\x83\x0f\x3e\x73\x3f\ +\xde\xf7\xc8\x5d\xe8\x62\x16\xba\x23\x9a\xf5\x59\xd6\x8b\x55\x5c\ +\x9e\x5b\xc7\x46\xa9\xc6\x45\x13\xa6\x49\x48\xdd\x7f\x59\x1c\x25\ +\x68\x4a\xa4\x19\x49\x40\x75\x8d\x89\x0b\xa9\x3c\x80\x5f\x04\xf0\ +\x8f\x01\x8c\x9b\xf4\x29\xa5\x18\x1b\x1d\xc6\x4f\x7e\xf8\x51\x3c\ +\x70\xd7\x51\xa4\xd3\x29\x50\x71\x62\xb1\x60\x0e\x2d\xaf\x97\x70\ +\x79\x6e\x03\xa5\x6a\x83\xf3\x47\x39\xf9\xb9\xaa\x02\xdc\x04\x2f\ +\x57\x32\x32\x3d\x91\x58\x92\x80\xea\x1a\x11\xa6\xa9\x37\x04\xe0\ +\x37\x00\xfc\x4d\x38\xdb\x59\x69\x85\x52\x8a\xeb\x0f\xed\xc3\x27\ +\x3f\xf2\x38\x4e\x1c\x3d\xc4\x2d\x74\xc7\x36\xd6\x3c\xc4\xd8\x36\ +\xc5\xdc\x4a\x11\x53\x0b\x1b\xa8\x35\x6c\xd7\x57\xe5\x02\x8d\x19\ +\xec\xe9\xe4\xcd\xe4\x22\xe5\xe9\x76\x06\x26\xe3\xa8\x12\x89\x28\ +\x09\xa8\xae\x01\x61\x20\x75\x10\xc0\xef\x02\xf8\x29\x00\x99\xb0\ +\x74\x27\x8f\xdf\x84\x4f\xfe\xf8\xe3\xb8\xfe\xc0\x78\xb0\xd0\x1d\ +\x54\x73\xf5\x08\x6a\x0d\x1b\x53\x8b\x05\xcc\x2d\x6f\xa2\x61\xb3\ +\x3d\x7b\xbc\xe7\x9c\x32\x69\xb9\x09\xc8\xca\x95\x13\x12\x52\x25\ +\x12\x4d\x12\x50\xed\x72\x61\x20\x75\x12\x8e\xd3\xfc\x09\x44\x98\ +\x0e\xf3\xc0\xa9\xdb\xf0\xf1\x1f\x7b\x18\xe3\x23\xfd\xd2\x6e\xc5\ +\xde\x5c\x3d\xb8\x19\x95\xab\x75\x5c\x9e\x5f\xc7\xd2\x5a\x59\xea\ +\xc1\x0b\x2c\x29\xd6\x84\xe2\xa1\xc5\xe5\xee\x1f\x24\x8d\xbf\x44\ +\xa2\x4b\x02\xaa\x5d\x2c\xcc\x74\x98\x27\xe0\x40\xea\xa4\x49\x9f\ +\x52\x8a\xae\xae\x3c\x9e\x79\xf4\x14\x7e\xec\xa9\x53\xe8\xef\xe9\ +\xd2\x6e\xa9\xee\xc1\x6a\xa3\x54\xc3\xa5\xd9\x75\xac\x6d\x56\x02\ +\xb4\x10\xc2\x01\xcb\x1f\x2f\xa5\x80\x96\xdc\xe8\xf3\x74\x12\x63\ +\x2a\x91\xe8\x92\x80\x6a\x97\x8a\x0b\xa9\x0c\x9c\x66\xde\xef\xc2\ +\x69\xf6\x69\x85\x52\x8a\xc1\xc1\x7e\x7c\xe4\xd9\x87\xf0\xd8\x7d\ +\x27\x90\xcb\xa5\xe5\x89\xc5\x82\x2c\x6f\x94\x71\x69\x76\x1d\xc5\ +\x72\xdd\x6f\xea\x01\x00\x11\xda\x88\x41\xb8\x5b\x16\x07\x2c\xed\ +\x4c\xbf\x44\x12\x89\x2c\x09\xa8\x76\xa1\xb8\x90\xea\x05\xf0\x37\ +\xe0\x38\xce\x87\x4c\xfa\x94\x52\xec\xdd\x33\x86\x9f\xfc\xf0\xe3\ +\xb8\xe7\xc4\x61\xa4\x2c\x0b\xd4\x0e\xa6\xc3\x88\xee\x23\x4a\x29\ +\xe6\x57\x4b\xb8\x32\xbf\x81\x8a\xd7\xb3\xc7\x34\x07\xc3\x80\xc5\ +\x59\x59\x5c\x84\x58\xb1\xed\xbe\x92\x89\xec\x16\x49\x40\xb5\xcb\ +\xc4\x85\xd4\x38\x9c\xa1\x07\xbf\x08\x67\x28\x82\x51\x6e\xbe\xe9\ +\x10\x7e\xea\xc7\x1f\xc7\xd1\x1b\xf6\x81\x80\x32\xcd\x3d\x61\x6c\ +\x01\x80\x86\x4d\x31\xbd\x58\xc0\xd4\x62\x01\x0d\xdb\x06\x61\x3c\ +\xeb\xa2\xb3\x5d\x02\x16\x13\xe9\x6f\xe0\xa0\x75\xa6\x27\x92\x48\ +\x74\x49\x40\xb5\x4b\x84\x71\x9a\xdf\x04\x67\x10\xe7\x87\x11\x3a\ +\x1d\xc6\xc2\x5d\x27\x8f\xe2\x13\x1f\x7a\x04\xfb\x27\x87\xfd\x39\ +\x7b\x80\xb0\xde\x26\x25\x20\x04\xa8\xd4\x1a\xb8\x32\xbf\x81\xf9\ +\x95\xa2\xbf\x94\x0b\x25\xfe\x06\xec\x5c\xde\x80\x0c\x2c\x40\x84\ +\x56\x10\x2f\x5a\x5b\x62\xba\x44\x12\x31\x49\x02\xaa\x5d\x20\x0c\ +\xa4\x4e\xc3\x71\x9a\x3f\x60\xd2\xf7\x76\x87\x79\xe4\xbe\x3b\xf0\ +\xe3\xef\xbb\x0f\xc3\x03\xbd\x4e\x53\x4f\xd8\xb2\x8a\xb1\x95\xb0\ +\x59\xae\xe3\xe2\xec\x3a\x56\x36\xca\xbc\x0e\x75\x60\x05\x40\x0b\ +\x2c\x40\x07\x2d\x31\x84\xd5\x49\x86\x26\x24\x12\x5d\x12\x50\xed\ +\x70\x71\x21\x65\x01\xf8\x20\x1c\x4b\xea\xa8\x49\x9f\x52\x8a\xde\ +\xde\x6e\xbc\xff\xc9\xfb\xf0\xcc\xc3\x77\xa2\xbb\x2b\xeb\x8e\x34\ +\x87\xe3\xe5\x56\x6c\x08\xba\xbe\x59\xc1\x85\x99\x75\x14\x4a\x55\ +\xf8\x38\x62\xc1\xe3\xfb\x9c\x28\xd3\xb3\x17\x05\x5a\x34\x80\x92\ +\x24\x44\x1b\x93\x48\x22\xa2\x24\xa0\xda\xc1\xe2\x42\x2a\x07\xe0\ +\x17\x00\xfc\x13\x38\x4b\xb5\x68\xc5\x99\x0e\x33\x84\x8f\x7e\xe0\ +\x11\xdc\x7f\xd7\x51\x64\x33\x29\xdf\x1f\xe5\x63\x81\x19\x42\x4e\ +\x01\x2c\xad\x96\x70\x71\x76\x1d\xe5\x6a\xdd\x05\x8c\x3b\xd9\x45\ +\x18\x6a\x2e\xf7\xec\xa9\xad\x2c\xa7\x1e\xec\x01\x34\x34\xa2\xa6\ +\xc8\x44\x12\xe1\x24\x01\xd5\x0e\x15\x17\x52\x83\x70\x16\xb9\xfb\ +\x55\x38\xbd\x7c\x5a\xa1\x94\xe2\xba\x83\x7b\xf1\x89\x0f\x3d\x86\ +\x93\xb7\x1c\xe2\x17\xba\x83\x3c\x21\xc6\xb6\x29\x66\x96\x36\x71\ +\x65\x3e\x98\x0e\xc3\xf7\xec\x79\x93\x92\xa3\x01\xcb\x51\x11\xa1\ +\x15\x0c\x50\x90\x2c\x2e\x4a\x92\xcd\x1d\x12\x89\x2c\x09\xa8\x76\ +\xa0\xb8\x90\xda\x0f\xe0\x77\x00\x7c\x12\xce\xf2\xc1\x5a\x21\x00\ +\x6e\xbb\xf5\x26\x7c\xfc\x83\x8f\xe0\xf0\xc1\x09\x84\x2d\xa0\x52\ +\xab\x37\x70\x65\x61\x03\x33\x4b\x45\x69\x3f\x3e\xd9\x51\x6e\x06\ +\x16\xe7\x1c\x27\x9c\x87\x4a\xbb\x69\x3b\x15\x56\xd5\x4b\x3a\x02\ +\x13\x09\x93\x04\x54\x3b\x48\x18\xa7\xf9\x6d\x00\xfe\x0d\x80\xa7\ +\xe0\xf8\xa7\x94\x42\x29\x45\x26\x93\xc6\xe9\xbb\x8e\xe3\x23\xef\ +\x7f\x10\x93\xa3\x03\x9c\x15\x25\xae\x60\x40\x00\x94\xaa\x0d\x5c\ +\x9c\x5d\xc3\xe2\x6a\x29\x58\x85\xd3\x85\x50\x2c\x60\x79\x19\x42\ +\x0d\x2d\x80\x72\xf3\xfe\x12\x49\xa4\x15\x49\x40\xb5\x43\x84\x99\ +\x0e\xf3\x18\x1c\x48\xdd\x69\xd2\xf7\x76\x87\x79\xe2\xe1\xbb\xf1\ +\xfe\x27\x4e\x61\xa0\xb7\xcb\x38\x67\x0f\x00\xd6\x8b\x35\x9c\x9f\ +\x5e\x73\xa6\xc3\x30\x90\xf1\x2c\x1f\xea\x0e\x53\x10\xf3\x00\x64\ +\x60\x01\x21\xd0\x02\xb8\x85\xf3\x12\x49\xa4\x15\x49\x40\xb5\x03\ +\xc4\x85\x54\x1a\xc0\x27\x00\xfc\x73\x38\x9b\x82\x6a\xc5\x9b\x0e\ +\xf3\xc1\xa7\x1f\xc0\xa3\xa7\x8f\x23\x9f\xcf\x18\xe7\xec\x01\xce\ +\x74\x98\x0b\x33\x6b\xd8\x2c\xd7\x9c\x46\x99\x6a\xa4\xb9\xbf\xeb\ +\xb1\xde\xc2\x62\xc3\xa3\x40\x4b\xe5\x32\x4f\xc6\x51\x25\x12\x57\ +\x12\x50\x6d\xb3\xb8\x90\xea\x01\xf0\x4b\x70\xb6\x55\x1f\x36\xe9\ +\x7b\xd3\x61\x7e\xe2\x03\x8f\xe0\xee\xdb\x6e\x44\x3a\x4d\xb8\x31\ +\x52\xf2\xb0\x01\x67\xe3\x85\x4b\x73\xeb\xce\xee\x30\xc6\xe6\x9d\ +\x97\x47\x60\x61\xb1\xf1\x62\x3a\x3e\x2d\x13\x48\x85\x9a\x88\xbb\ +\xd0\xa8\x83\x13\x49\x44\x2b\x09\xa8\xb6\x51\x5c\x48\x8d\x01\xf8\ +\x07\x00\xfe\x1a\x80\xee\xb0\x34\x37\xdf\x78\x08\x1f\xfb\xe0\x23\ +\x38\x7a\x78\x5f\xb0\x25\x15\xc0\x0c\x32\x0f\x46\x92\xd7\x1b\x36\ +\xae\x2e\x14\x70\x75\x61\xc3\x59\x43\x0a\x5e\x73\x50\x18\x9f\xde\ +\x24\xb0\xd8\xb4\x72\x3c\x75\xf6\xfe\xd3\xee\x8d\x95\x60\x2a\x91\ +\xe8\x92\x80\x6a\x1b\x84\x71\x9a\x1f\x06\xf0\x2f\x00\x7c\x04\x86\ +\x7b\x41\x29\x45\x2a\x95\xc2\x9d\x27\x6e\xc6\x47\x3e\xf0\x10\x0e\ +\xee\x19\xd1\x36\xf5\xbc\xe1\xe4\x95\x5a\x03\x17\x67\x36\x30\xb7\ +\xb2\xe9\xf7\xb2\x05\xce\x73\x47\x35\x2a\xb0\xbc\xed\x46\x75\xcd\ +\xc2\xa0\x9e\xfc\x71\xd0\xb1\xa7\x19\xf0\x99\x0c\x4e\x4f\x24\xa2\ +\x24\xa0\xda\x62\x61\x20\x75\x0a\xce\x74\x98\x87\x4c\xfa\xde\x74\ +\x98\x87\x4e\xdf\x8e\x1f\x7b\xea\x34\x46\x87\x7a\x99\xdd\x8a\x1d\ +\x11\x99\x51\x28\x39\x4e\xf3\x65\x77\x3a\x0c\x61\x96\x48\x60\x47\ +\x19\x84\x01\xcb\x89\x83\x50\x16\x65\x74\xf4\xd0\x62\xd3\x50\xa8\ +\xea\x9a\x78\xda\x13\x89\x2e\x09\xa8\xb6\x50\x98\xe9\x30\xef\x87\ +\xb3\xcf\xde\x31\x93\xbe\xb7\x3b\xcc\x33\x8f\xdf\x8b\x27\x1f\xbc\ +\x03\xbd\xdd\x39\x69\xce\x1e\xc0\xcf\xdb\x5b\x29\x54\xf0\xee\xd4\ +\x1a\x0a\xa5\x2a\x37\xbe\x89\x08\xdd\x72\x2a\x60\x01\xec\x98\xaa\ +\x30\x2b\x4b\x0d\x2d\x4f\x57\xec\x71\x64\xeb\xca\xa7\x4e\x24\x91\ +\x70\x49\x40\xb5\x45\xc2\x4c\x87\xf9\x39\x00\xff\x0c\xc0\x5e\x93\ +\xbe\x37\x1d\xe6\xc3\xcf\x3e\x84\xd3\x77\xdc\x8c\x5c\x36\x1d\x34\ +\xf7\x14\xa6\x94\x4d\x81\x85\xd5\x22\x2e\xcc\xac\xa1\x54\x69\x08\ +\x0b\xdd\x29\xa6\xbc\x28\x80\xe5\x94\xeb\x1e\xc7\xb0\xb2\xbc\x23\ +\x69\x63\x07\xca\x6c\xeb\x9e\x48\x22\x2d\x48\x02\xaa\x2d\x10\x17\ +\x52\x03\x00\xfe\xb6\xfb\xd7\x6f\xd2\xf7\xa6\xc3\x7c\xf4\x03\x8f\ +\xe0\xb6\xa3\x07\x91\xb6\x88\x0b\x29\xb7\xa9\xe5\x2b\x3a\x07\x0d\ +\x9b\x62\x6a\xa1\x80\xcb\x73\xeb\xa8\x37\xf8\x35\xa4\x3c\x35\x7f\ +\x62\x71\x4c\x60\x99\xac\x2c\x40\x18\xc2\x20\x9c\x07\xbf\x94\x8c\ +\xb8\x41\x60\xe2\xa0\x4a\x24\xba\x24\xa0\xea\xb0\xb8\x90\xda\x0b\ +\xe0\xb7\x00\xfc\x2c\x1c\xab\x4a\x29\x94\x02\x96\x45\x70\xfc\x96\ +\xc3\xf8\xe8\x07\x1e\xc6\x0d\x07\xc6\x39\xcb\x28\x70\x4d\x3b\x98\ +\x21\x00\x2a\x35\x1b\x97\x66\xd7\x30\xbd\xb4\x19\xac\x21\xe5\x4d\ +\x44\x6e\x06\x58\x00\x33\xd4\x21\xa8\x97\x17\x6b\x82\x96\x53\x26\ +\x5f\x9e\xf3\xc7\xaf\xa2\x10\xe0\x36\x12\xac\x12\x9c\x25\x92\x80\ +\xaa\x53\xc2\x38\xcd\x6f\x85\xe3\x8f\x7a\x16\x11\xa6\xc3\xdc\x7b\ +\xd7\xad\xf8\xd0\xd3\x0f\x60\x62\x6c\x80\xdf\xf8\x4e\xb1\x85\xd5\ +\x66\xa5\x8e\xf3\xd3\x6b\x58\x58\x2d\x06\x31\x84\x05\x4c\x04\x60\ +\xa9\x96\x6e\xd1\x58\x59\x4e\x9e\x41\x2e\x7c\xb6\x6a\x70\x29\xcf\ +\xd5\xfd\x57\x70\x6d\xa9\x24\x07\xe0\x38\x80\xe1\xc9\xd3\x9f\x8a\ +\x3a\x21\xa7\xd5\x89\x3b\xcd\xa4\x6f\xc7\x64\xa1\xb8\x79\x88\xfa\ +\xb4\x0d\x79\x00\x40\x05\xc0\x55\x00\x2b\x00\x1a\xb3\xcf\xfd\x7e\ +\x1b\x4e\xad\x75\x49\x40\xd5\x01\x61\xa6\xc3\x3c\x0c\x67\x3a\xcc\ +\x3d\x26\x7d\x4a\x29\xba\xbb\xf3\x78\xec\xc1\xbb\xf0\xcc\x23\x77\ +\x63\xb0\xbf\x5b\xee\xd9\x13\x1e\xc3\xd5\xcd\x0a\xde\x9d\x5a\xc5\ +\xda\x66\x15\x00\xdf\x1c\x94\x9b\x71\x06\x60\x79\x79\x23\x9e\x95\ +\xe5\xe4\x1b\x7c\x27\x44\x43\x28\x2d\xb8\x48\x48\x3c\x00\x60\x1f\ +\x80\xff\x06\xa0\xd1\xca\xfd\x88\x29\xbb\x61\x86\x62\x27\xeb\x68\ +\x03\xb8\x04\xe0\xcb\x00\xfe\xdf\xc9\xd3\x9f\x5a\xde\x09\xb0\x4a\ +\x40\xd5\x66\x61\xa6\xc3\xfc\x04\x9c\xe9\x30\x87\x4d\xfa\x94\x52\ +\x0c\x0d\xf6\xe3\xfd\x4f\xdd\x8f\x07\x4f\xdd\x8a\x9e\x7c\x56\x39\ +\x46\xca\x5b\x6d\x13\x00\x16\xd6\x4a\x78\x77\x7a\x15\xc5\x92\xbb\ +\x86\x14\x21\xfc\xcf\xa9\xd6\xef\x14\x0f\x58\x4e\x5a\x3d\xb4\xf8\ +\xbc\xe5\x73\x6b\xc3\xdb\x94\x02\x30\xd2\x7a\x36\x89\xc4\x94\x71\ +\x00\xb7\xc3\x59\xb5\xe3\xb7\x27\x4f\x7f\xaa\xb2\xdd\xb0\x4a\x40\ +\xd5\x46\x71\x21\xd5\x0d\xe0\xaf\xc3\x19\x6d\x3e\x6a\xd2\xa7\x94\ +\x62\xdf\x9e\x71\x7c\xf8\xd9\x87\x70\xc7\xf1\xc3\xc8\xa6\x2d\xdf\ +\xcf\xa4\x92\x06\xa5\x98\x59\xdc\xc4\xc5\xd9\x75\x54\x6a\x41\xcf\ +\x9e\xb7\x4e\x39\x25\x0a\x67\x3b\xe2\x03\x4b\xb7\x74\x0b\x51\x58\ +\x41\xaa\x15\x12\xd8\xb9\x7c\xde\x5a\x54\xf2\x7a\x54\x52\x56\x89\ +\xec\x2c\xc9\xc0\x99\x2d\xf1\x39\x00\x3f\xdc\xee\xca\x24\xa0\x6a\ +\x93\xb8\x90\x1a\x05\xf0\xf7\x01\x7c\x0a\xce\xfc\x3d\xa3\xdc\x7c\ +\xe3\x21\xfc\xf8\xfb\x1f\xc2\xcd\x37\xec\x73\x17\xba\x73\xc2\x85\ +\x15\x83\x41\x00\xd4\x1a\x36\x2e\xcd\xad\xe3\xea\x7c\xc1\x9f\x0e\ +\xe3\x99\x51\x81\x45\xd4\x1e\x60\x31\x49\x40\x38\x28\x99\xa1\x15\ +\xe8\x31\xe5\xa8\xe2\xbd\x7a\x53\x75\xd9\x89\xec\x18\x19\x86\xd3\ +\x22\x48\x40\xb5\xdb\x85\x71\x9a\x5f\x0f\xa7\xa9\xf7\x31\x38\xbf\ +\x46\x4a\xf1\xa6\xc3\xdc\x71\xe2\x66\x7c\xe8\x99\x07\x70\x60\xcf\ +\xb0\x30\x5a\x1b\xce\xea\x97\x6e\xa0\x45\x80\x52\xa5\x81\xf3\xd3\ +\xab\x98\x75\xa7\xc3\x38\x06\x89\x0b\x23\xc6\xd9\x1e\x17\x58\x5e\ +\x1c\xbf\x86\x95\xc6\xca\x72\x0f\x02\x6b\x89\x0a\x4d\x40\x79\x9c\ +\x42\x14\x6b\x29\x9d\xcd\x03\xc4\x8a\xa8\x9d\xc8\x36\x48\xe8\xfc\ +\xd3\xad\x90\x04\x54\x2d\x08\x03\xa9\xbb\x01\xfc\x6b\x00\x8f\xc2\ +\xe0\x9a\xa1\x94\x22\x9f\xcb\xe2\x81\xd3\x27\xf1\xbe\xc7\x4e\x61\ +\x74\xa8\x0f\xec\xba\x03\x1c\xb0\xdc\xb5\xa1\xd6\x37\xab\x38\x37\ +\xb5\x8a\xe5\x75\x66\x77\x18\xc2\x8c\x0a\x67\x81\xa5\xd9\x6f\x4f\ +\x07\x2c\x2f\x2f\x36\xce\x04\x2d\x21\xa9\x11\x5c\x5e\x9e\x34\x04\ +\x40\xb9\xde\x01\xe4\x7a\xfa\x51\x2d\xac\xea\xe7\xe2\x24\xf2\x9e\ +\x97\x04\x54\x4d\x0a\xd3\xb3\xf7\x3e\x38\x90\x3a\x6e\xd2\xa7\x94\ +\xa2\xbf\xaf\x07\x4f\x3d\x7a\x0a\x8f\xdc\x77\x12\x7d\x3d\x79\x50\ +\x4a\xa5\x71\x47\x2c\xac\x96\xd6\xca\x78\x67\x6a\x15\x85\x62\x0d\ +\x20\xd0\xf4\xec\x31\xc0\xf2\x58\x11\x15\x58\x8c\x92\x7a\xfc\x94\ +\x19\x5a\x6c\x19\xde\x01\x51\xc4\x39\xa3\x2c\x78\x60\x79\x96\x1c\ +\x49\x67\xd1\x37\x71\x08\xeb\x14\xa8\x95\x0b\xb0\x1b\x0d\xa8\xad\ +\xab\x04\x62\xed\x16\xef\x8a\xee\x86\xdf\x87\x04\x54\x4d\x88\x0b\ +\xa9\x2c\x80\x9f\x81\x33\x90\x73\xbf\x49\x9f\x52\x8a\xf1\xb1\x61\ +\xfc\xd8\xd3\x0f\xe0\x9e\x93\x47\x90\xcf\x05\xd3\x61\xc4\x39\x71\ +\x9e\xf3\x79\x76\x79\x13\xe7\xa7\x57\x51\xaa\x34\x60\xb9\x5e\x73\ +\x95\xef\x27\x0e\xb0\xe0\x0d\x08\x05\xfc\x42\x95\xd0\x52\xf6\xea\ +\x09\xa0\x89\x00\xae\x60\x1e\xa1\x3c\xb0\x93\x82\x22\x9b\x49\xe1\ +\xd6\xeb\x46\x70\x70\xbc\x0f\xd4\xbe\x1e\xb5\xf2\x26\xea\x95\x92\ +\xb2\xd7\x53\xfb\x2e\x91\x48\x5a\xd7\x86\x28\xc6\xd4\x29\x7b\x5b\ +\x09\x37\xa1\xc9\x98\xe5\xd2\xf2\x3a\xce\x9c\x39\x8b\x4a\xa5\xba\ +\xdd\x67\x67\x94\x04\x54\x31\xc5\x85\x54\x3f\x9c\x9d\x61\xfe\x0e\ +\x9c\xa9\x31\x5a\xa1\x94\xe2\xfa\x43\x7b\xf1\xa1\xf7\x3d\x84\x5b\ +\x8f\x1c\x44\x26\x65\x49\x0f\x17\x3b\xf1\xb7\x61\x53\x5c\x9e\xdb\ +\xc0\xa5\x59\x6f\x3a\x4c\x60\x8d\x78\xab\x68\x52\x02\x83\xa3\x5c\ +\x01\x2c\x27\x82\x55\x97\xac\x2c\x46\x85\x6f\x1a\x72\x11\xf1\xc0\ +\x65\x7a\x45\x28\x05\x7a\xbb\x32\x78\xea\xee\x43\x10\x32\x52\xe2\ +\xa6\x9d\x36\x56\x2c\x6f\x58\xa4\xe1\x61\x66\xa5\xa8\xe5\x51\x49\ +\x99\x2a\xbe\x31\xb1\x34\x42\x7e\x9a\xd1\xff\x5e\xd0\xd9\x77\xa7\ +\x71\xe9\xe2\x25\x94\xcb\x95\x1d\xdd\xb1\x91\x80\x2a\xa2\x30\xfe\ +\xa8\x49\x38\x93\x8a\x7f\x1e\x40\x5e\xa7\xef\x4d\x87\xb9\xed\xd8\ +\x61\x7c\xf0\x99\x07\x71\xfd\x81\x71\x10\xa2\x5f\x31\x80\x10\xa0\ +\x52\x6d\xe0\xc2\xcc\x1a\xa6\x17\x9d\xe9\x30\x5e\x3e\xaa\x0d\x16\ +\xa4\x51\xe3\x26\x60\x81\x77\xba\x33\xea\xbe\x95\xe5\xa4\x55\x40\ +\x8b\x53\x56\x5b\x5b\x4e\x36\x0a\x2b\x28\xe4\xb9\x27\x00\x52\xd6\ +\xd6\xbe\x1c\xb1\x86\x6f\x6b\x94\x83\x60\x1a\x29\x6d\x14\x50\x89\ +\xcd\xfe\xb0\x6a\xe8\x56\xa7\x60\x53\x13\x0f\x52\xda\xd5\x36\x08\ +\x2c\x8b\x24\x4d\xbf\x6b\x45\x18\x48\x1d\x85\x33\x1d\xe6\x03\x70\ +\x06\x23\x2a\x85\x52\x8a\x6c\x26\x8d\x53\x77\xdd\x8a\x67\x9f\x38\ +\x8d\xc9\x51\xcf\xe8\xa2\x01\x38\x18\x7d\x42\x80\xcd\x52\x0d\xef\ +\x5c\x5d\xf5\xa7\xc3\xb0\xbf\x6e\xaa\x0d\x16\x58\xeb\x8a\xcb\x2f\ +\x2a\xb0\x98\x44\xa2\x95\xe5\xa4\x8f\x00\x2d\x29\x52\x1e\xb9\xee\ +\xcd\xf3\xd3\x02\xba\x0d\xf7\xa7\x2d\xfd\x85\x34\x6a\x54\xb8\x62\ +\x2c\x0b\x4a\xfd\x45\x9b\x4f\x64\x2b\x4a\x91\x81\x6a\x18\xf1\x6e\ +\xe9\x6b\x4d\x40\x15\x22\x8c\xd3\xfc\x41\x38\xd3\x61\xee\x35\xe9\ +\x53\x4a\xd1\xd3\x9d\xc7\xa3\x0f\xdc\x85\xc7\x1f\xba\x13\x83\x7d\ +\x5d\x4c\x24\x7c\x52\x30\x2b\x44\x61\x65\xa3\x82\xb7\xaf\xac\x38\ +\xbb\xc3\x30\xf9\x00\x7a\x60\xa9\x9a\x83\x5e\x45\xfd\xb2\xa0\x02\ +\x56\xa0\xa5\xb5\xb2\xdc\xc2\x54\x96\x16\x57\x86\x94\x48\x3f\xdd\ +\x46\x7b\xbd\x5a\xbb\x3d\xcd\x49\xa4\x97\x3d\x46\x0d\x77\x0c\xa0\ +\xdc\x6f\xd4\x14\x1f\xfd\xb4\x76\x92\x24\xa0\x32\x88\x0b\xa9\x14\ +\x9c\xa5\x82\x7f\x0f\xc0\x4d\x26\x7d\x4a\x29\x86\x87\xfa\xf1\xbe\ +\xc7\xef\xc3\xe9\xbb\x8f\xa1\x3b\x9f\x91\x2d\x6f\x66\x24\x25\x05\ +\x30\xbf\x52\xc2\xb9\x2b\x2b\xd8\xac\xd4\xf9\x35\xa4\x98\x3c\xa5\ +\xb1\x4d\xcd\x00\x8b\x09\x14\xad\x2c\x95\x2f\x8b\xad\x2a\x84\xd1\ +\xf2\x46\x70\x89\x65\x52\xe6\x4f\x9b\xa0\xcd\x12\xf3\x25\xa4\xcd\ +\x64\xd0\xc4\xc8\xfa\x4e\x00\x2a\x48\x17\xd5\x8a\x12\x02\x77\x09\ +\xb0\x12\x50\x69\x84\x99\x0e\xf3\x57\x00\xfc\x63\x38\x9b\x30\x68\ +\x85\x52\x8a\xfd\x7b\xc7\xf1\x81\xa7\x1f\xc0\xc9\x63\x37\x20\x9b\ +\x09\x5a\x86\x8a\xce\x1a\xd8\x0d\x8a\xab\x8b\x05\x5c\x98\x5e\x43\ +\xa5\xde\x08\x96\x0b\x26\x72\x1a\xed\x94\x17\x13\xb0\x98\x02\xf5\ +\x03\x3e\xd9\xbe\x21\x05\xb4\x98\xc4\x3a\x6b\x2b\x28\x4b\xa6\x0f\ +\xdf\x78\x14\xdb\x8c\x0a\x89\x0b\xb0\x16\x5e\xb2\xd8\x56\x93\xa0\ +\x1a\xb7\xe8\xed\x80\x54\xc8\x49\xef\x16\x46\x01\x48\x40\xa5\x14\ +\x17\x52\xc3\x00\xfe\x6f\x00\xbf\x0c\xa0\x37\x2c\xcd\xd1\x9b\x0e\ +\xe1\xc7\x9e\x79\x10\x37\x5e\xb7\x17\x69\x8b\x28\xe9\x44\xe1\xbc\ +\xcf\xb5\x9a\x8d\x0b\x33\x6b\xb8\x32\xef\xee\x0e\xe3\x8e\x37\xa0\ +\x20\xca\xe6\x58\xe8\x1c\x3d\x05\xb0\x80\x70\x2b\x8b\x8d\x53\x42\ +\x0b\x6a\x9f\x96\x90\x85\x5f\x09\xd5\xba\x23\x0d\x9b\xa2\xde\xb0\ +\xf5\x9b\x51\x74\x50\x68\x13\x31\x2a\x95\xa6\xa1\xe4\x1e\x28\xfb\ +\xee\x42\xd8\x12\xcb\x17\xa5\xc8\x88\x3d\x4c\x59\xc4\x19\xe2\xd2\ +\xe4\xf9\xec\x04\x49\x40\xc5\x08\xe3\x34\x3f\x04\xe0\x77\x01\xfc\ +\x24\x42\xa6\xc3\xa4\xd3\x29\xdc\x71\xdb\xcd\x78\xf6\xc9\xfb\xb0\ +\x7f\x72\x24\x98\x28\xec\x2b\x05\x07\x84\x00\xc5\x72\x1d\xe7\xae\ +\xae\x62\x6e\x79\x93\x1b\x10\xe9\xc4\x33\xce\x76\x06\x58\xaa\xe6\ +\xa0\xa3\xaf\x07\x96\x53\xb4\xba\x59\xc8\xe6\x15\x0e\x2d\x46\x9b\ +\x2a\x8c\x9e\x10\x78\x5d\x5d\xd8\xe0\xd6\xcb\xd2\x4b\xb3\x6b\xa8\ +\x47\x23\x4a\x68\xde\x5a\xbf\x8e\xa6\x61\x18\x36\x6c\x81\xf9\xa2\ +\xf2\x0f\x29\x73\x55\x84\xab\x0d\x30\xb5\x13\x9c\x0a\xca\xde\x98\ +\xbc\x7d\xa3\xbd\xd8\x37\xda\x1b\xed\x3a\xec\x50\x49\x40\xe5\x0a\ +\x03\xa9\x3b\xe0\x8c\x34\x7f\x02\x61\xd3\x61\xf2\x59\x3c\x70\xea\ +\x24\x9e\x7c\xe4\x6e\x8c\x0e\xf5\x42\xec\xb8\x66\x61\x40\x08\xb0\ +\x56\xa8\xe2\xed\x2b\xcb\xee\x74\x18\xdd\xf6\xe9\x94\x1b\xb0\xd7\ +\x4e\x60\x39\xa0\x89\x0b\x2d\x1e\x21\x94\x4f\x61\x84\x17\x05\xb0\ +\x51\xac\x61\x03\x35\x68\x54\xda\x2a\x4d\xbd\x84\x26\xa0\xe8\xf2\ +\x35\x3a\xab\xa9\x06\x44\x2a\x2b\x89\x41\xa1\x89\xb7\x54\x86\xa6\ +\xca\xe2\x62\xad\x56\xd6\xbf\x38\xd4\x9b\xd7\x34\x34\x77\xc1\xb8\ +\x04\x57\x12\x50\x81\xeb\xd9\x7b\x0a\x0e\xa4\x4e\x9a\xf4\xbd\xe9\ +\x30\x4f\x3e\x72\x0a\x0f\x9c\xba\x0d\xfd\xbd\xec\xea\xc2\xdc\x28\ +\x16\xff\x51\x58\x58\x2d\xe1\xec\xe5\x65\x14\x4a\xde\x74\x18\x6a\ +\xdc\x89\x98\x30\xbd\x83\x40\x6b\xc0\x62\xcb\x68\x0a\x5a\x5c\x04\ +\x5b\x2b\x56\x55\x0d\x2f\xe5\xab\xd0\xa1\xf7\x43\x55\x77\x51\xa4\ +\x28\x6e\x45\x08\xb9\xd9\xa6\xac\x2e\x81\x64\xe9\x70\xf3\x1a\x09\ +\x7b\x6f\x98\x64\xdc\x88\x72\xa1\x5c\xf1\x1e\x08\x9d\x20\xfc\x8e\ +\x3f\x62\x5e\x8e\xa6\xb8\xa1\x07\xe0\x74\x7c\x88\x1b\xc3\xf2\xdf\ +\x77\x87\x8d\xf5\x9e\x07\x15\x33\x1d\xe6\xff\x02\xf0\x3b\x00\x0e\ +\x98\xf4\x29\xa5\x98\x18\x1b\xc6\xb3\x4f\xde\x8f\x3b\x4f\xdc\x84\ +\x7c\x36\xad\x7c\x78\x3c\x9b\xca\xa6\x14\xd3\x8b\x9b\x38\x37\xb5\ +\x82\xb2\xbb\x3b\x0c\x28\xf8\x89\xc5\x0a\x60\x89\xbb\xc1\xc4\x01\ +\x96\x93\xce\x6c\x65\x39\x79\x46\x84\x96\x77\x3a\xec\xa1\xa2\xab\ +\x8f\x28\xd5\x35\x23\x26\xd1\x7e\x5e\xd1\x98\xb1\x71\xba\xec\xa9\ +\xe6\x40\x65\x87\x99\xfc\x4b\xa2\xaf\x4e\x57\x07\xd1\x36\x52\x5b\ +\x50\x8a\x5a\x08\x3f\x30\x01\x8a\x9a\xea\xdb\xdc\x31\xf2\x9e\x06\ +\x95\x0b\xa9\x3e\x00\x7f\x03\xc0\xdf\x03\x30\x14\x96\xe6\x86\x43\ +\x7b\xf1\x81\xa7\x1f\xc4\xd1\x1b\x0f\x20\x93\xe6\x97\x40\x67\x47\ +\x0b\x13\x00\xb5\x46\x03\x97\x66\x37\x70\x71\x76\x1d\x35\x77\x3a\ +\x4c\xa0\x0c\x79\x8c\x53\x5c\x60\x29\x7a\xe4\x9a\xb1\xb2\x9c\x3c\ +\x14\xd0\x62\x33\x84\x01\x5c\x86\x7a\x44\x77\x69\x77\x6e\x42\x4c\ +\x68\x17\x7d\x58\x74\x08\x98\x80\x78\x70\x52\x16\xdf\x24\xa0\xfc\ +\x7f\x75\xce\x74\x71\xd5\xc2\x08\xf5\xdd\x89\xf2\x9e\x04\x15\xe3\ +\x8f\x9a\x80\x33\xf4\xe0\xaf\x20\xc2\x74\x98\xe3\xb7\xdc\x80\xf7\ +\x3f\x79\x3f\x0e\xed\x1b\x77\xa6\x7e\xa8\x7a\xf6\x5c\x58\x95\x6b\ +\x0d\x9c\xbb\xba\x8a\xa9\x85\x82\xb3\x6a\x27\xe1\x27\x5d\x18\x27\ +\x16\x47\x05\x16\xeb\x1f\x52\x0c\x6b\x70\xd2\x85\x5b\x59\x41\xbc\ +\x97\x07\xdb\x73\xe8\xe6\xa6\x3e\x5d\xe5\x41\x34\xe4\x68\xdd\xc6\ +\xed\xfb\xa5\x8f\x98\x51\x98\x65\xd5\x0c\x9c\x9c\xf8\x08\x83\x20\ +\x5a\x05\x94\x90\x31\xd7\xb0\xa3\x72\xcd\x77\x1b\xa0\x3c\x79\xcf\ +\x81\x8a\x81\xd4\x11\x00\xff\x12\xc0\x87\x10\x36\x1d\x26\x9b\xc1\ +\xa9\x3b\x8f\xe1\xa9\x47\xef\xc5\xc4\xc8\x40\x68\xcf\x5e\xa1\x58\ +\xc3\xd9\x2b\x2b\xfc\xee\x30\x82\x85\x23\xa5\x87\x1a\x58\x6a\x87\ +\xbb\xb9\x49\xc8\x64\xc9\x06\x85\xaf\x35\x45\x79\x38\xfa\x63\xe7\ +\x15\x73\xc5\x7c\x1d\x85\xe9\x41\xbd\x0b\x21\x48\xc8\x30\x51\x21\ +\x56\xff\x32\x36\x2b\x51\x2c\x2b\xd3\xa4\x92\x48\xe3\x9a\x9a\xb2\ +\x9e\x82\xa3\x76\x00\x4a\x5b\x8f\x5d\x0a\x29\xe0\x3d\x06\x2a\x06\ +\x52\xf7\xc3\x99\x0e\x73\xbf\x49\x9f\x52\x8a\xde\x9e\x2e\x3c\x72\ +\xff\x9d\x78\xf8\xbe\xdb\x31\xd8\xdf\xc5\xc7\xbb\x9f\xbe\x75\x44\ +\x80\xa5\xb5\x32\xce\x5e\x5e\xf6\x77\x87\x01\xd4\x4e\x54\x76\x82\ +\xb2\x09\x58\xec\x76\xe9\x2a\x0b\x8b\x77\xa2\x9a\xad\x2c\xb6\x2c\ +\xfd\x32\xc4\x72\xa3\x4d\x37\x96\x4a\x2b\xac\xb9\xa8\xb8\x5e\xba\ +\xf2\x78\x5d\x12\x9a\x32\x3c\x6f\xb3\x42\xd8\x4c\xb7\xa8\x2f\x76\ +\x24\x38\x31\x81\x51\xac\x27\x3e\xdc\x0c\x6d\xd1\x8a\x12\x23\x29\ +\x14\x65\xec\x32\x68\xbd\x67\x40\xc5\x4c\x87\xf9\x20\x1c\x4b\xea\ +\x66\x93\x3e\xa5\x14\x23\x43\x03\x78\xfa\xb1\x7b\x71\xf7\x1d\x47\ +\xd1\xdb\x95\xf5\x62\xa0\x7a\xb9\x28\x80\xd9\xc5\x4d\xbc\x7d\x65\ +\xd9\x9f\x0e\xe3\xfb\x7a\x28\x14\x96\x51\x3c\x60\x39\x69\xf4\xbd\ +\x84\x4e\x38\x6f\x65\xe9\xa0\xe5\xa4\xd7\x2c\xa7\xe2\x0d\xdc\x0c\ +\xfe\x09\xea\xa7\xf7\x8b\xf3\xf9\x89\x2f\x01\xd1\xa7\xd2\xbe\x31\ +\x4d\xfa\x90\x64\xbd\xe8\x6f\x64\x2b\x60\xd2\x56\x23\xa6\xf5\xc4\ +\x87\xb7\x00\x28\x37\x1f\xc9\x7f\xb5\xcb\x00\xe5\xc9\x7b\x02\x54\ +\x2e\xa4\xf2\x00\x7e\x01\xc0\x3f\x81\xe3\x9b\xd2\x0a\xa5\x14\x07\ +\xf6\x8e\xe3\xd9\xa7\xee\xc7\xad\x37\x5f\x8f\x5c\x26\x25\xf4\x9a\ +\x05\x68\x21\xf0\xd6\x90\x5a\xc7\xbb\xd3\xab\xa8\xd6\x6d\xdf\xa0\ +\x60\xf7\xc9\x53\xf7\x0c\x82\x9b\xcb\xd7\x6e\x60\x39\x59\x28\x80\ +\xa4\x1b\xb1\x2e\x1d\x68\xf2\x57\xea\x69\xcc\x2e\xa5\x61\x24\x14\ +\x1c\xa3\xfb\x4d\x19\xe3\xf5\xa4\x46\x7c\x0b\xe3\x36\x81\x4c\xa3\ +\xea\xc3\x9a\x93\x51\xad\x27\x3e\x2e\x3a\xa0\x74\xf5\x8b\xd2\x23\ +\xb8\x9b\xe4\x9a\x07\x95\x0b\xa9\x41\x38\xbd\x7a\x7f\x0b\x21\xd3\ +\x61\x08\x80\x9b\x6f\x3a\x84\x67\x9f\x7a\x00\x87\x0f\xee\x41\x3a\ +\x25\x3b\xa0\xfd\x9e\x3d\x42\x51\xa9\xd9\x78\x77\x6a\x0d\x97\xe7\ +\xd6\x61\xdb\x54\xf9\x62\x52\x42\x39\xeb\xca\x49\xcb\xe6\x29\xfb\ +\xaf\xbc\xba\xf0\xf9\x78\xe1\xe1\xc0\x22\x2a\x08\x89\x15\x53\x0e\ +\x4e\x25\xd2\x2e\x38\xdc\xc5\x31\x48\x90\x6b\xc8\x1b\x11\xba\x00\ +\x12\x7f\x11\x8d\x2f\x15\xdb\x8b\xe9\x34\x96\xb9\xeb\xd0\x8c\xc4\ +\x06\x93\x10\xa1\xea\x16\xd8\x7a\x40\x39\x57\x4e\x5c\x61\x75\xb7\ +\x01\xca\x93\x6b\x16\x54\x8c\x3f\xea\x00\x9c\xf1\x51\x9f\x44\xc4\ +\xe9\x30\x4f\x3f\x7e\x1a\x7b\xc7\x87\x60\x59\xc2\xc6\x9e\xbe\x2e\ +\xdc\x35\xa4\xea\x38\x7b\x65\x19\xb3\xcb\x45\xf7\xa1\x71\xe6\xea\ +\xa9\xe6\xd6\x89\xbb\x10\xb7\x17\x58\x6e\xce\x0a\xd3\x88\xf3\x33\ +\x89\xf3\x07\x95\xad\x58\x65\xdf\x9e\x21\x4a\xdd\x0c\x16\x47\x4f\ +\xf2\x43\x1b\xda\xf8\xba\x10\x31\x3b\xad\x99\x26\xd7\x33\x42\x3d\ +\xe2\x81\x89\x3f\x8a\x03\x27\xee\x5b\x1b\x00\xc5\x25\xdc\xe5\x90\ +\x02\xae\x51\x50\x31\x90\x3a\x01\x67\xa4\xf9\xd3\x08\x99\x0e\xd3\ +\x95\xcf\xe1\xfe\x53\x27\xf0\xe8\x83\x77\x62\x64\xb0\x4f\x32\x8c\ +\xd8\x63\x02\x60\xb5\x50\xc1\x99\x4b\xce\x74\x18\xc2\x90\x84\x9d\ +\x58\xac\x5e\xe3\xbc\x8d\xc0\x72\x03\x9d\xa6\x18\x5f\x4b\xd5\x5a\ +\xec\xc1\xa1\x06\x2e\x4c\x5d\xbd\x5d\x65\x88\x46\x57\x3d\x4e\x4a\ +\x33\xf1\x8f\x88\x2f\x89\xe6\x56\x48\x0e\x15\x68\xf5\x8c\xee\x6b\ +\xaa\xc9\x85\x9a\xad\xb3\x38\x0e\xf9\xd6\xe0\x14\xa4\x31\xf5\x6a\ +\x36\xd3\x93\x47\x35\x27\xaf\xbe\x5e\xc9\x14\x9a\x6d\x13\x66\x3a\ +\xcc\x63\x00\xfe\x2d\x9c\xb9\x7b\x5a\xa1\x94\x62\xa0\xbf\x17\x4f\ +\x3c\x7c\x37\xee\xbd\xeb\x38\xfa\x7a\xf2\xb2\x53\x58\x18\x8e\x30\ +\xb7\x52\xc4\x19\x77\x3a\x0c\x81\x08\x05\x79\x62\xb1\x7a\x8d\xf3\ +\xe8\xc0\x72\xc2\x89\x12\x09\xec\xc8\x25\xee\xd1\x23\x12\xde\x04\ +\x53\x4a\x3e\x31\x0e\x4a\xa6\x41\x9c\x94\x49\x66\x1a\xbe\x2e\x05\ +\x47\xee\x32\xd4\x65\x10\x58\x6b\x52\x71\x4c\xa0\xce\xa8\xf2\xa7\ +\x05\xc4\xef\x25\x6c\x06\x4c\xb2\x4e\x7b\xac\x27\x55\xb9\x2a\x40\ +\x79\xbd\x7d\xba\xba\xab\xca\xdb\xa9\x72\x4d\x81\xca\x85\x54\x06\ +\xc0\x27\xe0\x6c\x06\x7a\xc8\xa4\x4f\x29\xc5\xe4\xf8\x30\x9e\x79\ +\xe2\x3e\x9c\x38\x76\x23\xba\x72\x69\x28\x7f\x69\xdc\xa0\x06\xa5\ +\xb8\x3a\xbf\x81\x77\xae\xae\xa0\x5c\x6d\x18\x96\x0b\xe6\x7b\xdf\ +\x74\xcd\x41\x20\x1a\xb0\xbc\xba\x3a\xe1\x7c\x46\xe2\x48\xf5\x80\ +\x45\x82\xaf\x49\x80\xad\xaa\x27\xcf\x5f\x6d\x41\x31\xba\x53\x89\ +\x0f\x15\xe0\x42\xa5\xb5\x57\xc3\x6f\x51\x6a\x99\x48\x24\x0a\xf0\ +\x87\x04\x61\x74\x30\x5a\x6b\x68\x3f\x9c\x54\x41\xb1\x00\x25\x64\ +\xa0\x2f\xa7\x75\xff\xdd\x76\xc9\x35\x03\x2a\x17\x52\x3d\x70\xd6\ +\x8f\xfa\xfb\x70\xd6\x93\x32\xca\xe1\xeb\xf6\xe1\x7d\x4f\xde\x8f\ +\x23\x37\xec\xe7\xa6\xc3\x70\x2f\x2c\xdc\xe9\x30\x75\x1b\xe7\x67\ +\xd6\x70\x61\x66\xcd\x99\x0e\x03\x38\x4d\x09\x61\xdb\x29\xd1\xba\ +\x72\xfe\x0d\xc6\x37\xb5\x0a\x2c\x1f\x37\x8c\xf3\x49\x1e\x0f\x6e\ +\xf2\x2f\x11\x55\x6e\x42\x4a\x2a\x99\x4b\x4a\xf7\x14\x65\xf5\xa3\ +\xc2\x2a\x4c\x8f\x46\x0b\x15\x78\x43\xc3\xf1\xc2\xf4\x0e\x9a\xf2\ +\x8f\x0f\x25\x59\xaf\x39\x38\x39\xf9\xb4\x0f\x50\xd4\xd5\x63\x71\ +\xbd\xdb\x00\xe5\xc9\xae\x07\x15\xe3\x8f\x1a\x03\xf0\x8f\x00\xfc\ +\x55\x00\x5d\x3a\x7d\x4a\x81\x54\x8a\xe0\xf8\xd1\xc3\x78\xe6\xf1\ +\xfb\xb0\x7f\xef\xa8\xb3\xd0\x9d\x4a\x17\xce\xd0\x81\x52\xa5\x8e\ +\xb3\x57\x56\x30\xb5\x50\xe0\x36\x0d\xa5\x80\x72\x73\x4f\x19\x32\ +\x01\xb0\x94\xfe\xab\x40\x45\x09\x2c\xc2\x9a\x45\x8c\x3a\x61\xac\ +\x2a\xde\x39\xae\x6a\x73\xc2\xe5\x9b\x30\x60\x41\x20\x95\x9c\x17\ +\x97\x5c\x3a\xa0\x5c\x4a\x9d\xc4\xb1\xb8\x84\x73\x84\xfa\xa5\x94\ +\x0f\x65\x0a\xf1\xd6\x57\x98\x25\x45\x63\xbf\xc4\x9d\x86\x93\x58\ +\x46\xe8\x75\x90\xa2\x03\x6f\xba\xba\x88\xdd\x43\xad\x5d\x0d\x2a\ +\x06\x52\x87\xe1\x0c\xe2\xfc\x08\x42\xa6\xc3\xe4\xdc\xe9\x30\x8f\ +\x3d\x7c\x0f\xc6\x86\x07\xe0\x4d\xd9\x53\xb9\x74\x9c\x2d\xd5\x1d\ +\xa7\xf9\xc2\x6a\x29\x08\x17\x5c\x3c\x4e\x58\x00\x2c\xd6\xba\xf2\ +\xf2\x71\x43\x02\x5b\x2d\x06\xb0\x28\x98\xe6\x15\xdb\x7b\x47\xdd\ +\x70\xde\x61\x15\xe8\x4b\xdd\x95\xac\xe3\x3d\x48\x10\xd5\xad\x2a\ +\x3a\xdc\x45\x72\x49\x2e\x21\x6d\x0e\xd1\x84\xc4\x7e\x8f\x34\xc3\ +\x1a\x7c\x46\x49\x13\x73\x98\x6f\x4e\xaf\x69\x54\x8b\x46\x6b\x83\ +\x85\xb9\xe9\xb8\x3c\x9b\xb7\x9e\xb8\x43\x2d\xa0\xe0\x99\x55\xbb\ +\x5e\x76\x2d\xa8\x18\x48\x9d\x82\xe3\x34\x7f\xc8\xa4\xcf\x4e\x87\ +\xb9\xff\xde\x13\x18\xe8\xed\x96\x7a\xc5\x00\xbe\xf3\x6c\x71\xb5\ +\x84\x37\x2f\x2d\x63\xb5\xe0\xec\x0e\x23\xf5\xc2\xb1\xd0\xf0\xc3\ +\xd4\xcd\x41\x20\xdc\xe1\xce\xa6\x71\xbe\x73\xa6\x9b\x0b\x46\xc1\ +\x23\xe4\x56\x82\x87\x6d\x90\xce\x33\x26\xbc\x96\x1c\x6f\xaf\xc9\ +\xe7\xc1\xbe\xe0\x44\x31\xa0\x4a\xf2\x9d\xab\x47\x7f\x72\xd7\x44\ +\x95\x5a\x39\x0e\x54\x4c\x41\xf4\x99\xa9\xb9\x41\x61\xe0\x09\xf7\ +\xc2\xab\xf4\xd8\xb0\x4e\x80\xc9\xc9\x37\x9a\xf5\x24\xd6\x57\x99\ +\xb7\x09\x50\x50\x39\xd2\xc3\xeb\xb7\x53\x65\x57\x82\xca\x85\x94\ +\x05\x67\x7f\xbd\x7f\x05\xe0\x16\x93\x3e\xa5\x14\xa3\xc3\x03\x78\ +\xf2\xd1\x7b\x71\xc7\x89\x9b\xd1\x93\xcf\x9a\x37\x6f\xa4\xc0\xf4\ +\x62\x01\x6f\x5d\x5e\x46\xb1\x5c\x0f\xde\x7b\xd5\xc4\x62\xc1\x12\ +\xd3\x35\x07\x9d\xf4\xae\x2a\xe7\x70\x77\x34\xb8\x1e\x42\xf7\xe5\ +\x67\x39\xe0\xe4\x2b\xd0\xcc\x77\x90\x53\xc1\x82\xa2\x92\x55\xe5\ +\xd7\x55\xdc\x89\x58\xf2\x9b\x9b\xfd\x52\x94\x4f\x1a\x5c\x30\xad\ +\x49\x16\x15\x62\x3a\x5d\xca\x47\x31\x87\x54\x91\x94\x50\x75\x38\ +\x15\x2a\x4e\xa4\x30\xa1\xd9\x48\x82\x9e\xb4\x28\x60\x32\x45\x35\ +\x05\x27\x45\x86\x71\x00\xa5\xab\xd7\x6e\x03\x94\x27\xbb\x0e\x54\ +\x2e\xa4\x72\x70\x76\x2a\xfe\x67\x00\xf6\x98\xf4\x29\xa5\x38\xb0\ +\x6f\x1c\xef\x7b\xe2\x7e\x1c\xbd\xe9\x10\x72\xee\xee\x30\xaa\xf9\ +\x77\x04\x40\xdd\xa6\xb8\x38\xbb\x86\x73\x57\xdd\xe9\x30\x42\x6f\ +\x99\x97\x27\xc0\x0f\x19\x08\x6b\x0e\x02\x08\xb1\xb0\x18\x00\x52\ +\x17\x3e\x84\x08\xb5\x83\x44\x0d\xce\xca\x13\xcf\x89\xa8\xbe\x32\ +\x16\x93\x44\x29\x65\x02\xa5\x48\xb6\x51\x78\xbb\x0f\xbc\x62\xf4\ +\x81\x99\x86\x77\x57\x88\x50\x34\xed\x14\xd4\x52\x77\xe5\x13\x1f\ +\x56\x94\xd3\x57\x5b\x35\xa6\xba\x84\x0d\x24\x55\xae\x90\x10\xa5\ +\x9c\x26\x00\x45\xa9\x02\xb6\x5e\xe4\xee\x19\x46\xb5\x7b\x40\xc5\ +\x34\xf5\x06\x00\xfc\x3a\x80\xbf\x0d\x67\xd1\x3b\xad\x10\x02\x1c\ +\xbd\xe9\x3a\x3c\xf3\xf8\x7d\x38\x74\x60\x02\x99\x94\xd7\xb3\xe7\ +\xf5\x80\x10\x66\x3a\x8c\xb3\xa5\xfa\xdb\x57\x57\x70\xc9\x9b\x0e\ +\x03\x80\x9d\x17\x27\xb9\x7c\x54\xf3\xf4\x9a\x06\x96\x4c\x4d\xdf\ +\x2e\x0a\xcc\x21\xa9\xb9\x25\x41\x14\x42\x93\x51\xaa\x0b\x94\x56\ +\x95\xa3\xce\x38\xc4\x99\x25\x3c\xa9\x9a\x91\x3e\x15\xe3\x3d\xef\ +\x24\xe4\x98\xc6\x82\x82\x2a\x77\xca\xba\xe0\x49\xc4\xc4\x3e\xe8\ +\x78\x2a\x7a\x79\xc9\x23\xe0\x85\xe4\xad\xc0\x49\x71\x82\x7a\x38\ +\x29\x8e\x54\x69\xa9\x06\x67\xbb\xd4\xa4\xda\x15\xa0\x62\x20\xb5\ +\x0f\xc0\x6f\x01\xf8\x59\x38\xcb\x07\x2b\x85\x52\x8a\x4c\x3a\x8d\ +\x3b\x4e\x1c\xc1\x13\x8f\x9c\xc2\xe4\xd8\x90\xb3\xd0\x9d\xac\xe9\ +\xc3\xaa\x50\xaa\xe1\xcc\xc5\x65\xcc\x2c\x15\x84\x1e\x35\xd7\x7a\ +\x72\xc7\x25\x01\x7a\xeb\xca\xd1\x77\x75\x34\xfe\x2b\x40\x06\x96\ +\x0f\x1d\xc6\x22\xf2\xea\x25\xba\x87\x03\xe7\x3a\xdb\x56\xe4\x94\ +\xf8\xe6\x1e\xd3\x63\xa8\x6a\xc2\x11\xe9\xc0\xe4\x94\x92\x2e\xb4\ +\x41\xb7\xd9\x9f\x6b\x22\x18\x5b\xd4\xcf\x4d\xd7\x71\x25\x5a\x51\ +\xaa\xc3\xe0\xc7\x49\x75\x1a\x3a\x32\xf2\x20\x61\xeb\x10\x69\xfa\ +\x8d\xa6\xc2\x22\x84\x94\xd5\x6e\xb6\x79\x47\xf9\xab\x61\x2a\x6b\ +\x37\x39\xda\x77\x3c\xa8\x18\x48\xdd\x0a\x67\x3a\xcc\xfb\xe0\xf8\ +\xa7\x94\xe2\x4d\x87\x79\xe0\xde\x13\x78\xf0\xbe\x3b\x30\xd4\xdf\ +\x0b\xcb\x52\xfb\x5b\xdc\x14\x58\x5e\xaf\xe0\x8d\x8b\x4b\xfc\x74\ +\x18\xc9\xf7\x44\xf5\xfb\xe4\x21\xba\xff\x0a\x08\x80\x05\xa2\xb6\ +\x8a\x58\xa8\xf8\x71\x94\x7f\x81\xfd\x43\xb1\x69\xea\x0f\x41\x60\ +\x22\x9d\x42\xa1\x1a\x7a\x10\xc0\x4c\x53\x17\x95\x55\x26\x5d\x41\ +\x12\x8b\x6f\x62\x6a\x5d\x2a\xca\x82\x53\x04\x87\x77\x44\x38\x65\ +\x3f\x86\x8a\xf7\xd1\x43\xbb\xe0\x8b\x62\x31\x28\xbe\xb3\x54\xc0\ +\x63\x14\x48\x69\x97\x6e\x89\xd1\xb4\xe3\xbf\x36\x07\x28\x4e\x41\ +\x6b\xcd\xed\x9e\xb6\xdf\x8e\x06\x15\x33\x1d\xe6\x61\x38\x3d\x7b\ +\x77\x9b\xf4\x29\xa5\x18\xec\xef\xc5\xe3\x0f\xdf\x8d\xbb\x6f\x3f\ +\x86\x5e\x6f\x3a\x8c\xf8\x62\x32\x69\x66\x97\x37\xf1\xe6\xc5\x65\ +\x6c\x14\xab\x8e\xcf\x89\xc2\xf7\x4b\x01\x62\x53\x2e\xb0\xae\x80\ +\x70\x60\xa9\xf2\xf0\xeb\x40\x34\xf6\x8d\x4b\x38\x76\x98\x83\xae\ +\xb5\xe4\x8d\xcb\x92\x7d\x6d\x7c\xb3\xcd\xec\x1e\x87\x40\x55\xa1\ +\xf9\x68\xc8\x5b\xca\x43\x7f\x68\x18\x0f\xaa\x19\x52\x10\xd5\x69\ +\xad\xd4\x23\x1a\xf4\xb8\xe5\x79\xbe\xa8\x50\xaf\xbb\x73\x01\xe5\ +\x15\x19\x02\x80\x85\x82\x49\x53\xc7\x38\x70\x52\x56\x4b\x88\xd0\ +\x18\x90\xe6\x7a\xed\x22\xd9\xb1\xa0\x72\x21\x95\x06\xf0\x13\x00\ +\x7e\x0f\xc0\x0d\x26\x7d\x4a\x29\xf6\x8c\x8f\xe0\xe9\xc7\x4f\xe3\ +\xd8\xd1\x1b\xd0\x95\xcb\x68\xba\xd2\x03\x27\xe3\xe5\xd9\x0d\xbc\ +\x75\x65\x19\x95\x6a\x83\xef\x89\x63\x96\x4f\x69\x27\xb0\x02\x67\ +\x37\x09\xac\x22\x16\x3a\x6c\x26\x4c\x3b\x50\xdc\x3e\x8b\x1b\x36\ +\x25\x5a\x3a\xc2\xd4\x99\xa0\x09\x6a\xa8\x2b\xc4\x30\xa2\x8d\xe4\ +\xd6\x53\x8f\xe1\x7c\xa7\x91\x02\x49\xd4\x94\x5a\x3d\x1d\xc4\x44\ +\x8b\x86\xb7\xc6\x98\xd4\x44\x7d\x2c\x8b\x00\xb0\xd0\xa6\x67\x18\ +\x9c\x14\x47\xc6\x3c\xcc\x80\xa2\x8c\x1a\x05\xdd\xb5\x80\xf2\x64\ +\xc7\x81\x8a\x69\xea\x75\x03\xf8\xeb\x00\xfe\x01\x80\xd1\xb0\x74\ +\x37\x5e\xbf\x0f\x4f\x3f\x7e\x1f\x6e\xb8\x6e\x1f\xb2\x69\xb7\x67\ +\x0f\x72\x33\x86\x10\xa0\x5a\xb7\x71\x6e\x6a\x15\xe7\xa7\xd7\x50\ +\x77\xa7\xc3\x28\xa7\xbe\x30\xce\x76\xb5\xef\x29\x1e\xb0\x94\x4e\ +\x73\xf7\x8d\xe1\x46\xbb\x0b\xcd\x30\x65\x0f\x1b\xd3\x7d\x4e\x98\ +\xf4\xe2\xba\xc1\x12\x84\xa8\xc6\x15\x25\x54\x5e\x6c\x4e\x8a\xc2\ +\x7b\xe4\x20\xbc\xf9\x08\x05\x97\x51\x87\xaa\x95\xb8\x57\x53\x01\ +\x39\xf1\x25\x96\x0a\xd3\xac\x9e\x20\x85\x6a\x3a\xfb\xd8\xa6\xa3\ +\x34\x62\x3c\xac\x03\x20\x22\x9c\x54\xd5\x57\x9d\x57\x18\xa0\x4c\ +\xf9\xef\x46\xd9\x51\xa0\x62\x20\x35\x02\x07\x50\x9f\x82\x03\x2c\ +\xa5\x50\x00\x29\x8b\xe0\xb6\x5b\x0e\xe3\xc9\x47\xef\xc5\xde\x89\ +\x51\x77\xa1\xbb\xe0\xf5\x64\x5f\x54\x6f\x4b\xf5\x33\x97\x97\x71\ +\x75\x61\xc3\x5f\x43\xca\x7b\x29\x95\xc3\x06\x84\xc5\xe9\xd4\xbe\ +\xa7\x70\x60\x01\xbc\x65\xc4\xef\xa2\x20\x4d\x6c\x61\x0a\x0b\x9a\ +\x78\xbc\x29\xe5\x7c\x91\xfc\x54\xbe\x8f\x9d\x5f\x1a\x98\x12\xca\ +\xe8\xca\x65\x99\x96\x75\xe1\x20\xa4\x18\x8d\x20\xa5\x88\xe3\xfa\ +\xd0\x30\x45\x15\xcf\xf6\xe8\x99\x06\x83\xba\x43\xcc\x15\x51\x8a\ +\x26\xa1\x60\x5a\x49\xcd\x41\x71\xa3\x50\xca\x94\xcf\xf8\xbf\xe4\ +\xa1\x0d\x68\x09\x4e\x9c\x56\x84\xe6\x9d\xe4\x5f\xd3\xa5\x61\x03\ +\x77\x8f\x8b\x6a\x67\x81\xca\x95\xeb\xe1\x34\xf5\x3e\x66\xaa\x1f\ +\x3b\x1d\xe6\x91\x07\xef\xc6\xc8\x60\x5f\xd0\xb3\xc7\xbd\xb5\xc1\ +\xdd\x58\x2d\x54\xf1\xc6\xc5\x45\xcc\xaf\x38\xbb\xc3\x38\x2f\xae\ +\xdc\xa4\x52\x0e\xcc\x0c\x69\x0e\x3a\x9a\x32\xb0\x48\x90\x91\x50\ +\x7f\xf0\x8e\x7b\x86\x44\xbe\x33\x9c\x30\x10\x65\xcf\x24\xf0\x80\ +\x0b\x67\x48\xd4\x0f\x9f\xe0\xd3\x62\xc3\xe4\xa4\x6c\x3d\xe4\xeb\ +\x20\x65\xaa\xbc\x39\x9a\x70\xd3\x8b\xc1\x75\xa9\xc9\x19\x85\xf9\ +\x60\xc4\xd7\x92\x2a\xf2\x13\x90\x23\x81\x45\xed\x3c\x67\x20\x26\ +\xea\x09\xb0\x62\x2d\xab\x30\x30\x01\xd1\xe0\x64\x3a\x77\x1d\x9c\ +\xf4\x79\xea\xcb\xd8\xe9\xb2\x23\x40\xc5\x58\x52\x77\xc1\x71\x9a\ +\x3f\x02\xc3\x63\x4d\x29\x45\x5f\x4f\x17\x1e\x7e\xe0\x4e\xdc\x7b\ +\xd7\x6d\xe8\xef\xed\xe2\x01\x02\x48\x34\x99\x5f\x2d\xe1\xf5\x0b\ +\x4b\x58\x2b\x54\x34\xd6\x11\xd7\x57\xe6\x96\xa3\x6e\x0e\x02\x31\ +\x80\x25\x52\xc6\x83\x8c\xae\xa9\xc7\xfa\xb1\xc0\x20\x83\xb1\x84\ +\xd8\x5d\x96\x59\x73\x4a\xe0\x1d\x53\xac\xdc\x25\x27\x01\xce\x7b\ +\xc7\x14\xac\x53\x0d\x8e\xe5\x5f\x68\xa1\xcf\x52\x67\xed\x98\xde\ +\x0b\xad\x1f\x48\xa3\xa8\xf4\x1d\x31\xf6\x12\x95\x82\xc5\x51\x52\ +\x72\x9e\x54\x15\xcc\x9b\x2d\xb2\xaf\x4b\x70\xaa\xfb\x46\x58\x13\ +\x70\x62\x14\x4c\x96\x50\x1c\x40\x51\xea\x7d\xd9\xdd\x8d\xc0\x6d\ +\x07\x15\x33\x1d\xe6\x19\x38\xc3\x0f\x8e\x9b\xf4\x29\xa5\x18\x1b\ +\x19\xc0\x93\x8f\xdc\x8b\xdb\x6e\xbd\x09\xdd\x8a\xe9\x30\x1c\x17\ +\x6c\xe0\xea\xc2\x06\xde\xbc\xb4\xe4\x4e\x87\x21\xdc\x8b\xc7\xfb\ +\x9e\x02\xeb\x0a\xd0\x37\x07\x9d\x7a\x68\xfc\x57\x6e\x42\xde\x0f\ +\xa4\x68\xda\xb1\x4e\x6e\xb6\x55\xc5\x36\xcd\x3c\x87\x3b\x00\x71\ +\x78\x02\xe7\xef\xe6\xac\x21\xf8\x95\x08\x8a\x67\x9b\x4a\x01\x61\ +\xa9\xd8\xd4\xd3\x18\x64\xec\x35\xe1\x4e\x4b\x21\xfc\x8f\x44\x88\ +\xb2\x78\x3d\x22\xe9\xa9\x87\x0c\x04\x07\xea\x1e\x3f\xea\x11\x9e\ +\x49\x15\x64\x45\xfc\xa6\xaf\xe4\x6c\xa7\x22\xaf\x44\x42\xaa\x88\ +\xc9\xd4\x4f\x73\x5e\xad\xc2\xc9\x49\x16\xc5\x82\xa2\x1e\xa7\x76\ +\xb5\x6c\x2b\xa8\x5c\x48\x65\x01\xfc\x0c\x80\xdf\x86\x33\xa0\x53\ +\x2b\x94\x52\x1c\xda\x3f\x81\xa7\x1f\xbf\x0f\x37\xde\x70\x10\xb9\ +\x4c\xca\xb8\x0c\x52\xbd\x61\xe3\xfc\xf4\x1a\xde\xbe\xba\x82\x5a\ +\xdd\x66\x9a\x30\xf2\xae\x30\xa2\x75\xe5\x84\x85\xac\x84\xa0\xf0\ +\x5f\x01\x81\x2f\xc5\xb7\x6e\x24\xa8\xf0\x26\x96\x07\x3d\xd1\x22\ +\x0a\x44\x26\x08\x07\x3e\xce\x8a\x12\x56\x66\x20\xbc\xe5\xc4\xf2\ +\x91\xaf\xb5\x93\x40\x67\x55\x81\xe9\x14\x30\xde\x23\xc5\x41\x5c\ +\x57\x88\xa1\xd1\xa3\x1d\x45\x10\x58\x9d\x72\x32\x39\x8c\xf7\x3d\ +\x51\x21\x8c\x7d\xd1\xd9\xe6\x60\x10\xce\xa3\x90\x32\xf0\x64\xf7\ +\x61\xd4\xee\x94\x4c\x8d\x67\x18\xc9\xf7\x64\x4c\xc6\x58\x7b\x06\ +\x04\x86\xc4\xec\x2c\xd9\x36\x50\xb9\x90\xea\x07\xf0\xab\x00\xfe\ +\x0e\x9c\xa9\x31\x5a\x21\x84\xe0\x96\x23\x87\xf0\xd4\xa3\xa7\xb1\ +\x7f\x5f\x30\x1d\x46\x39\x67\x8f\x00\xe5\x6a\x03\x6f\x5d\x5a\xc6\ +\x45\x77\x3a\x0c\x6f\x1d\x31\x7e\x18\x06\x40\xb2\x65\xa4\x6e\x0e\ +\x7a\xfa\xaa\xe6\x20\xd7\xb3\xe7\xc3\x47\xb4\x86\xc4\x5e\x3d\x91\ +\x4e\xcc\xa4\x62\xf0\xf6\x18\x85\x02\x16\xa2\x73\x9d\xad\x82\x96\ +\x3c\x4c\x75\x04\x47\xb9\x09\x2c\xc1\x42\x35\x52\xe1\xaa\x16\xa6\ +\x21\x9f\xc0\xfa\xd2\xbf\x2c\x8a\x1e\x3f\x6a\xd2\x55\x37\x0b\x7d\ +\x63\x8a\x05\x11\xa7\x13\xe1\x75\x0d\xfc\xe5\x90\x66\x3e\x07\x05\ +\x48\xb9\xb5\x03\x4e\x4e\xf2\x10\xeb\x89\x39\x90\x3a\x0b\xa2\x58\ +\x75\x3b\x5c\xb6\x05\x54\x2e\xa4\xf6\x00\xf8\xa7\x00\xfe\x12\x9c\ +\x49\xc6\x4a\xa1\x94\x22\x93\x49\xe3\xae\x13\x47\xf0\xc8\x43\xa7\ +\x30\x36\x32\x80\x94\xb0\x3b\x0c\x0b\x0f\x42\x80\x8d\x62\x15\xaf\ +\x5f\x58\xc2\xcc\xe2\xa6\x1b\x01\x49\x9f\x08\x8e\xa5\x38\xcd\x41\ +\xb1\x4c\xd6\x96\x92\xc1\xc9\xbf\x6c\xaa\xe6\x1f\x6b\x7d\x05\x4c\ +\x0b\xc6\x43\x11\xa9\x82\xbc\xcf\x8a\x7d\xeb\x45\x90\x51\x76\xe8\ +\x02\x5b\xac\x0b\x4c\xa9\x3e\x80\xba\xd7\x92\x37\xc3\xe4\x73\x61\ +\x2f\x83\xfa\x90\x93\x60\x38\x05\xc3\x8c\xd0\x37\x87\x6f\xba\xc9\ +\x65\x11\x09\x3e\xfc\x21\xef\xf0\xf6\x83\x55\x90\x11\xfc\x51\x1c\ +\x66\xa8\x98\xaf\xe0\xa7\x62\x14\x1c\x3e\xd2\xb6\xc2\x49\x3e\x2f\ +\xb9\xa9\x6b\xba\x01\x94\x7f\xf4\x77\x85\x6c\x29\xa8\x18\xa7\xf9\ +\x51\x38\xfe\xa8\xf7\x23\x64\xa1\xbb\xee\xae\x1c\x1e\x38\x75\x02\ +\xf7\xdd\x7b\x3b\x06\xfa\x7a\x60\xf9\x93\x67\x64\x6b\x07\x14\x58\ +\x5c\x2f\xe3\xb5\xf3\x0b\x58\x5a\x2f\x07\xbd\xf9\x8a\x89\xc5\xf2\ +\x66\x9d\xd1\x9b\x83\x6c\x99\x3e\x3f\xd4\x04\xe2\xac\x37\x55\x8b\ +\x4e\x32\x63\x14\xbe\x28\xe5\xd0\x05\xc8\x73\xf7\xb4\x9d\x00\xfe\ +\x39\x28\x7a\x1f\x15\x55\x51\x54\x52\xb6\x20\xa0\x81\x55\x98\x68\ +\x9b\x6e\x2a\x09\x1f\xa9\xae\x07\x9c\xec\x3b\xf2\x61\xc6\x9a\xd7\ +\xec\xc9\xb3\x56\x0f\x6b\x25\xb1\xd6\x94\xd8\x14\x64\x8b\x61\x7c\ +\x5e\xfc\x70\x05\xd1\xf9\xa5\x3f\xa5\xc8\x7b\x0a\xea\x00\x25\x14\ +\xe3\xad\x49\x45\x95\x17\x72\xf7\x90\x6a\xcb\x40\xc5\x40\xea\x21\ +\x38\x3d\x7b\xa7\x4c\xfa\x94\x52\x0c\x0d\xf4\xe2\xf1\x87\xee\xc6\ +\xc9\x13\xb7\xa0\xa7\x2b\x07\x4b\xf3\x13\xee\xc1\x63\x7a\xb1\x80\ +\xd7\x2f\x2c\x62\xa3\x54\xe3\x74\x4d\x13\x8b\xa3\x34\x07\x3d\xab\ +\xc5\x5f\xa3\x08\x80\x4d\xf9\x87\x8f\xba\x75\x66\x97\xd5\x60\x9b\ +\x82\xc4\xcd\x90\x10\x67\xec\x57\xca\x22\xee\x20\x50\x0f\x43\x84\ +\xd1\x87\x5f\x49\xb5\x2f\xca\xed\xa5\xe3\x9c\xf6\xfa\x26\x98\xd6\ +\xaa\xf2\x5f\x23\xf5\x03\xcb\x5d\x5d\xa2\xce\x5c\xfd\xe3\xac\xeb\ +\xf6\x83\x16\x38\xea\xb2\xc5\x73\x92\x5f\x76\xe6\x72\x48\xf4\xe3\ +\x21\x26\x13\x42\xb6\x4a\x54\x40\x11\xfd\x51\x41\x18\xaf\x23\x94\ +\x4f\x83\x4f\xd6\x07\x16\x17\x4e\xea\x7a\xea\xad\x27\xbd\xe5\xb6\ +\x9b\x1a\x7a\xb2\x6c\x09\xa8\x5c\x48\xa5\xe0\x2c\x15\xfc\x2f\x00\ +\xdc\x68\xd2\xa7\x94\x62\xef\xe4\x08\x9e\x7a\xf4\x34\x6e\xbe\xe9\ +\x3a\xe4\xdc\xe9\x30\xbc\x85\x13\xe8\xdb\xb6\x8d\x8b\xb3\xeb\x38\ +\x73\x29\x98\x0e\xa3\xf2\x5d\x99\x26\x16\xab\x9a\x83\xb6\x4d\x61\ +\x53\x8a\x86\xed\xfc\xd9\x0d\x1b\x75\x9b\xa2\xd1\xb0\x51\x6f\x50\ +\xd4\x6d\xdb\x85\x53\xf0\x8c\x52\xcf\x39\xce\x64\xee\x35\xc5\x08\ +\x3c\x78\x11\x58\x84\xc0\xb2\x9c\xbf\x94\x45\x90\x4e\xa5\x90\x49\ +\x5b\xc8\xa4\x09\xd2\x96\x85\x54\xca\x42\x3a\x6d\x39\x03\x58\x09\ +\x11\x9a\x73\x94\xf7\x85\x05\x06\x9c\xd0\x5b\x68\xf8\xc5\x64\xd2\ +\xf3\x4d\x5d\xdd\x4d\xd1\x3b\xb0\xb4\x76\x9a\xca\x84\x54\x99\x05\ +\xba\xea\x41\x7c\xc7\x64\x00\xf2\x3e\x72\xb9\xe9\x17\x30\x84\xc9\ +\x51\xd9\x71\x17\x60\x8a\x6a\xca\xa0\x8c\x6e\x90\xce\xbb\x23\x72\ +\x0a\xbd\xc5\x15\x1f\x4e\x7c\x29\xaa\x38\x21\x8a\x83\xda\xee\x77\ +\x52\x75\x1c\x54\x2e\xa4\xba\xe0\x6c\xba\xf0\x8f\xe0\x6c\xc2\x60\ +\x94\x9b\xae\xdf\x8f\xa7\x1e\x3b\x8d\x83\x07\xf7\xf8\xd3\x61\x3c\ +\x61\x5f\x2a\x42\x80\x4a\xdd\xc6\xdb\x57\x56\xf0\xee\xd4\xaa\x33\ +\x1d\x46\xbb\x85\x95\x97\x3e\xb0\xae\xbc\xf7\xc6\x01\x0d\x45\xbd\ +\x61\xfb\x7f\xb5\xba\x8d\x6a\xdd\xf9\xee\x01\xcb\x83\x12\x27\x8c\ +\x9f\x27\xb0\x9e\x28\xd3\xa2\x23\x3e\x5d\x89\xaf\x44\x85\x7a\x11\ +\x10\x52\xf3\x75\x2c\xcb\xf2\x01\x96\x49\x5b\xc8\x66\x52\xc8\x65\ +\x52\xc8\xa6\x53\xc8\xa6\x2d\x64\xd2\x4e\x3c\x6f\x61\x32\x6f\x83\ +\xc2\x77\x2e\xfb\xc7\x08\xeb\xd7\x57\x28\xea\x2d\x34\x28\x92\x70\ +\x97\x44\x17\x21\x06\x08\xc0\x30\xfa\xc9\x25\x25\x73\x62\xaa\xb2\ +\x72\xbc\x74\x54\x6e\x52\x52\xc9\x4a\x0a\x74\xb9\x12\xc3\x06\x42\ +\x89\xf5\x50\xf8\xb0\xa2\x0e\xcc\x74\xbe\xc6\xb3\x9e\xa8\x7c\x62\ +\x6a\x3d\xec\x2e\xe9\x28\xa8\x5c\x48\x0d\x03\xf8\xbf\x01\xfc\x0a\ +\x9c\xed\xac\x94\x42\x29\x90\x4e\x59\xb8\xed\xd8\x61\x3c\xfe\xf0\ +\x29\x8c\x8f\x0f\x23\x9d\xb2\xf4\x99\x13\x60\xb3\x5c\xc7\x1b\x17\ +\x96\x70\x65\x61\x3d\x18\x2a\x14\xba\x85\x15\x1c\x2b\xa9\xe1\x80\ +\xa8\x5a\x6b\xa0\x5a\x6f\xa0\x56\x77\x80\xd4\xb0\x69\xa4\xb5\x86\ +\x00\xc6\x52\xe2\x80\x83\xa0\x6c\xb6\x1e\x5c\x13\xd0\xd7\x16\x5c\ +\x54\x2e\x3c\x29\x45\xa3\x41\xd1\x68\x00\xd5\x7a\x03\x9b\xe5\xba\ +\x0b\xb0\x00\x5e\x5d\xb9\x0c\xba\xb2\x29\xe4\xb3\x69\x64\x5d\x70\ +\x11\x61\x20\x29\xdf\x6c\x13\xbb\xe4\x64\x5f\x85\xce\xa0\xd2\x6f\ +\xdd\x25\xdd\x92\x58\xa2\x5b\xce\xca\xf8\x1a\xab\x78\x22\x24\x36\ +\x70\x83\xb9\x2a\xa2\x55\xe4\x1c\x50\x71\x19\x18\x22\x36\xd9\x98\ +\xa6\x20\x55\xe8\xb8\xbe\x2d\x1e\x30\xaa\x6e\x48\xa1\x7e\xed\x84\ +\x93\xe9\x9a\x87\x6a\xec\x4c\xe9\x08\xa8\x18\x7f\xd4\x21\x38\x1b\ +\x81\x7e\x02\xce\xc6\xa0\x4a\xa1\x94\x22\x9f\xcb\xe2\xde\xbb\x8e\ +\xe1\x81\xd3\x77\x62\x70\x20\x98\x0e\xa3\x7a\x79\x08\x80\x95\x8d\ +\x0a\x5e\x3b\xef\x4c\x87\x61\xfd\x14\x7e\x0f\x19\x00\x6f\x0a\x8a\ +\x6d\xd3\xc0\x4a\xaa\x35\x50\xa9\x35\x50\x6f\xd8\x68\xd8\x76\xd3\ +\xb3\x08\x3a\x05\x29\xd6\x15\x24\x0e\xc6\x74\xac\x3e\xa0\xde\x68\ +\xa0\x54\x6d\x80\xc0\x81\x7b\x36\x93\x42\x57\x2e\x8d\x7c\x36\x8d\ +\x7c\x26\x85\x4c\xc6\x72\x7c\x60\xba\xa6\xa1\x1f\x26\x0f\x8c\x50\ +\x9b\x43\xe1\x08\x32\x6a\xa8\x08\x47\xf9\xf1\xec\x86\x06\x0a\x73\ +\x01\x94\x0d\x3e\xb9\xba\xba\xb7\x3a\xca\x02\x79\xda\xb3\x0b\xc0\ +\x46\x29\x41\xf8\x83\xa3\x5a\x1e\xc6\x2b\xce\x85\x5d\x44\x38\xe9\ +\x6a\xa8\x03\x94\xc6\x55\x26\xe7\xbd\x7b\x7c\xe9\xed\x07\x15\x03\ +\xa9\x3b\x00\xfc\x1b\x00\x8f\x9b\x2e\x09\xa5\x14\xfd\xbd\xdd\x78\ +\xf8\xfe\x3b\x70\xf7\x1d\xc7\xd1\xd3\x93\x77\x9b\x34\x14\xba\x65\ +\x80\x67\x97\x37\xf1\xda\xf9\x45\x67\x77\x18\xcf\xe1\xcc\xbc\x8c\ +\x9e\x45\x52\xad\x3b\x50\xaa\x54\x3d\x30\xb5\xe7\xf7\x84\x08\x16\ +\x5b\xcb\x90\x12\xf3\x63\x21\x45\x18\x90\x71\xc7\x8e\xd4\x6d\x8a\ +\x7a\xa5\x8e\x62\xa5\x0e\x8b\xb8\xe0\x4a\x07\xe0\xea\xca\x39\xbe\ +\x2f\x2b\x68\xa0\x82\x2f\x4c\xbc\x1f\x7c\x9d\xc4\x38\x4d\x94\xc6\ +\xa9\x2e\x24\x34\x5d\x53\x21\x1f\xad\x12\x65\xb5\xf9\x14\x54\xcc\ +\x4d\x1a\xef\x44\x24\xa7\x3b\xdb\xbb\x27\x32\x4b\xb9\x2a\x82\xe4\ +\xb0\x97\x4d\x38\x7e\x9a\x8d\x94\x01\x53\x1f\x85\x2b\xa1\x49\x38\ +\xa9\x2e\x33\x75\xeb\x17\xc3\xe0\xda\xb1\xd2\x56\x50\x31\x0b\xdd\ +\x3d\x0d\x67\xf8\xc1\x09\x93\x3e\xa5\x14\xe3\x23\x83\x78\xe2\xd1\ +\x53\x38\x76\xf4\x46\xe4\x73\x19\xb5\xdf\xc5\xed\xad\xa3\x94\xe2\ +\xf2\xdc\x3a\xde\xb8\xe0\x4c\x87\xb1\x98\x5f\xff\x86\x0d\xd4\xea\ +\x4e\x33\xae\x5c\x75\x9a\x72\xad\x58\x4c\x3a\x21\x2a\x08\xb5\x0b\ +\x52\xac\xbe\x7b\xac\xb4\xb6\xdc\x74\x2a\x4b\xa8\xde\xa0\xa8\x37\ +\x5c\x70\x59\x40\x26\xe5\x40\xab\x3b\x9f\x41\x77\x2e\xed\xfb\xb7\ +\xc4\xab\xac\x83\x93\x74\xfe\x21\xf1\xcd\xfe\x50\x87\xdd\x26\xfd\ +\x7d\x54\x5b\x37\xe2\x02\x77\x7c\x41\x8a\x70\x25\xdc\xe4\x35\xd4\ +\xfd\xa6\x1f\x03\x4d\xb1\xb9\xc8\x9f\x4f\x90\x07\xc7\x33\x65\xef\ +\x61\x7b\xe0\xc4\x1d\x79\xa6\xaa\xb6\x3b\x70\x77\xd0\xab\x6d\xa0\ +\x72\x21\x95\x01\xf0\x49\x00\xbf\x03\xe0\x40\x58\x9a\xeb\x0e\x4c\ +\xe2\xa9\x47\xef\xc5\xf5\xd7\x1d\x40\xc6\x9d\x0e\xa3\xfa\x65\x26\ +\x70\xb6\x54\x7f\xe7\xea\x0a\x37\x1d\xa6\x6e\x53\xbf\x29\xe7\x35\ +\xe7\xec\x36\x59\x4d\x2a\xe1\x81\xe4\xfc\x43\x14\x0a\x61\x90\x22\ +\x8c\xbe\xce\x8a\x0a\x3e\x0c\x69\x82\x68\xee\x8a\xb1\xe3\x42\xab\ +\x75\x1b\xd5\x7a\x15\xeb\xc5\x2a\x32\x69\x0b\xf9\x6c\x1a\x3d\xf9\ +\x34\xba\x73\x69\x64\xd3\x29\x1e\x5a\xcc\xc8\x6d\xe5\x54\x19\xa2\ +\x7a\xbd\xb5\x7d\x7e\x62\x52\x43\x7c\x04\x8b\x8b\x18\x5e\x58\x89\ +\x55\x41\x67\x86\x1e\x02\x9a\xd5\x0e\x04\x63\x88\x28\xf5\x84\x02\ +\xa9\x08\x1c\x39\x9e\xb2\x3f\xba\x6e\xfd\x3c\x58\xd1\x50\x00\xc5\ +\x01\x94\xc1\x99\x15\xf9\x6a\xef\x3c\x69\x0b\xa8\x5c\x48\xf5\x01\ +\xf8\x9b\x00\xfe\x1e\x80\x41\x9d\x2e\x05\x60\x11\x82\x63\x47\x0e\ +\xe1\x89\x47\xee\xc5\xe4\xe4\x58\xb0\x3b\x0c\xf3\x73\xec\x7d\x25\ +\x04\x28\x55\x6a\x78\xf3\xe2\x32\x2e\xce\xac\xa1\xe6\x3a\xc1\x2b\ +\xd5\xba\x0f\xa7\xad\x58\xad\x42\x9c\x1a\x23\x41\xa8\x8d\x90\x62\ +\xc1\xc3\x8f\xab\x12\x36\x0e\x15\x9c\xe4\xe2\x88\x78\x91\x35\xb5\ +\xba\x8d\x5a\xbd\x8a\x42\xa9\x86\x74\xca\x42\x3e\x9b\x42\x8f\x6b\ +\x69\x65\x33\xbc\xa5\xa5\x5c\x21\x4b\x70\x5b\x11\x29\xd0\x78\x05\ +\x63\xc6\xf1\x84\xa1\x3a\x7d\xc5\xd8\x24\xaa\xa0\x94\xae\x81\x18\ +\xb8\x9b\x14\xe7\xc1\x36\xcd\x18\xf6\x68\x8d\x35\x36\x4c\x60\x17\ +\x91\x4b\x0e\x8e\x88\xd7\xf3\xac\xba\xd0\xdc\xa9\xea\xae\x10\x44\ +\x40\x51\x26\x0d\xd5\xe9\x53\xb2\x6b\xa8\xd5\x32\xa8\x5c\x48\x4d\ +\x00\xf8\x27\x00\xfe\x32\x9c\xa1\x08\x4a\xa1\x94\x22\x9b\x49\xe3\ +\xae\x93\x37\xe3\xe1\x07\xee\xc6\xd0\xd0\x80\xbc\x3b\x0c\xdb\x76\ +\x20\xc0\x5a\xa1\x8a\x97\xcf\xcd\xe3\xd2\xec\x3a\xca\x55\xa7\x69\ +\xb7\x55\x70\xf2\x84\x5b\x76\x65\xab\x20\x25\x34\xf5\x38\x0b\xc7\ +\xe8\xb7\x52\x00\xce\xaf\x56\x10\x58\x6f\xd8\x28\x94\x6c\x6c\x96\ +\x05\x68\xe5\x33\x4e\x2f\xa2\xc6\xa2\xd2\xdd\xaa\x30\x69\x66\x29\ +\x5c\xdd\x48\x04\xc5\xcd\xd1\x38\xca\x85\x84\x8c\x7f\x4b\xf6\x3f\ +\x05\x24\xf2\xb8\xa5\x36\x6a\xf8\x79\xa3\x54\xf2\x5c\xcb\xa4\x60\ +\xf9\xc3\x2f\x0b\x43\x85\x72\x9a\x68\xda\x09\x81\xba\x16\x1e\x35\ +\x6b\xec\x78\x69\x1a\x54\x8c\xd3\xfc\x08\x9c\xdd\x8a\x3f\x88\x90\ +\xe9\x30\x3d\xdd\x79\x3c\x70\xef\x09\x9c\xba\xeb\x04\xfa\x7a\xbb\ +\xfd\x5f\x70\xe9\x81\x77\xaf\xe5\xd4\x62\x01\x3f\x78\x63\x06\xd3\ +\x4b\x9b\x1d\xf1\x37\x45\x17\x95\x75\xe3\x7e\xc4\x82\x94\xa1\x67\ +\x4f\xab\x13\xd5\x8a\xd2\x00\x4a\x01\x1c\x3e\x0b\x82\x7a\x83\xa2\ +\x50\xaa\x63\xb3\x5c\x47\x3a\x55\x41\x57\xce\x6b\x1e\x66\x90\x4e\ +\x59\x81\x2f\x90\xf2\x3e\xb6\xf6\x08\x6d\x3a\x3a\x00\x80\xe9\x35\ +\x64\x9a\x56\x9c\x95\x43\x64\x67\x36\x21\x01\x78\x7c\x27\xbb\x93\ +\xab\xb4\x24\x8c\x7f\xc8\x98\x5a\x6e\x1a\x31\x9e\x70\x43\x17\xc4\ +\x3b\xa1\xf3\x5f\xe9\x2e\x41\x38\x9c\x38\x76\xfa\xf0\x54\x34\x09\ +\xdb\x7a\x1f\x3b\x2b\x4d\x81\x8a\x81\xd4\xfd\x70\xa6\xc3\xdc\x67\ +\xd2\xa7\x94\x62\x78\xb0\x0f\x8f\x3f\x74\x37\x6e\xbb\xf5\x66\xe4\ +\xf3\x59\x66\xce\x9e\xab\xc3\xe8\xd6\xea\x36\xde\x9d\x5a\xc5\x0f\ +\xce\xcc\xb8\x0b\xdd\x6d\xdf\x15\x35\xf7\xf0\xf1\x56\x4e\x3c\x48\ +\x45\x70\x9a\x9b\x20\x45\xd4\x75\xe2\xab\x43\x14\x61\xe2\xd9\x70\ +\x87\xa8\x37\x6c\x6c\x14\x9d\xe6\x61\xc6\x83\x56\x57\x06\xdd\xd9\ +\x94\x33\xae\x8d\x50\xc5\xb3\xde\xca\xfd\x51\xf9\xb8\xa8\x3a\x5a\ +\x7a\xd7\xa8\x32\x37\xb1\x67\x8f\x57\xd7\x0d\x5d\x90\x72\x50\x0b\ +\xeb\xb7\xf2\xd3\x09\xc0\x51\x4c\xaf\x0a\xaa\xc4\xc0\x90\xfa\xf6\ +\x99\x3a\x1f\xd5\x79\x1a\x5c\x50\xca\xa5\x6f\x84\xd3\xd6\x5f\xb9\ +\x9d\x2d\xb1\x41\xc5\x2c\x74\xf7\x61\x38\xd3\x61\x6e\x36\xe9\x53\ +\x4a\xb1\x6f\xcf\x28\x9e\x7a\xf4\x5e\x1c\xbe\xe1\x10\xb2\x99\xb4\ +\xf3\x0b\x4d\x01\x7f\xa2\x2f\x85\x33\x4d\xa5\x61\xa3\x52\x6b\xe0\ +\xcc\xa5\x65\xbc\x72\x6e\x1e\xa5\x4a\x63\x9b\x21\xe5\x7e\x32\xff\ +\x10\x01\x42\x81\x5e\x07\x21\x45\x78\x28\x9a\xac\x28\x25\xa0\x04\ +\x7d\xfe\x9c\x84\x73\x66\x02\x6b\x0d\x1b\xb5\x62\x15\x1b\xa5\x2a\ +\xb2\xe9\x14\xba\x5d\x4b\x2b\x9f\x4d\x23\x95\x22\x0c\xa4\x14\x3f\ +\xd3\x0a\x67\x76\xe4\xeb\xce\xf9\xa0\xe4\x66\x63\x50\xa2\xc1\x17\ +\xe5\xf6\xcc\x48\x0b\xe8\x79\xa9\x45\x07\x3c\x11\xc7\x35\x09\xff\ +\xba\xff\x50\x0d\xc7\x38\x18\x68\x74\x18\xa3\x2c\x68\x46\x08\x3e\ +\x36\x0a\x05\xaa\x62\xc1\x89\xa9\x37\x35\xb3\x79\x37\x49\x2c\x50\ +\x31\xd3\x61\x7e\x01\xc0\x3f\x86\xe3\x9b\xd2\x0a\x01\x70\xe4\xf0\ +\x01\x3c\xf1\xe8\xbd\xd8\xb7\x77\x12\x99\xb4\xbb\x86\x94\xfb\x8f\ +\x6d\x3b\xf3\xe5\x1a\x0d\xe7\x21\x29\x57\xea\x78\xf5\xfc\x02\xce\ +\x5c\x5a\x66\x16\xba\xdb\x1e\xd1\x3a\xcf\x01\x48\x51\xa1\x3e\xa9\ +\x70\x00\x71\xb0\x21\x44\x5d\x0f\xf0\xd0\x09\x6b\xe6\x49\x40\xe3\ +\xb3\x62\xee\x93\xbe\x39\x47\x00\x80\xc2\x19\xc1\x5f\x6b\xb8\xbd\ +\x87\x29\x74\xbb\x3d\x87\xf9\x6c\xda\x1d\x5c\x2a\x48\xac\xb7\xc2\ +\xd0\x0f\xa8\x00\x9e\xec\x3b\x12\x94\x38\x9f\x0c\x11\x03\xe0\x58\ +\x35\x62\x4e\x2a\x77\x37\xd1\xea\xb0\x68\xe4\x7d\x5a\x7c\x3c\xe5\ +\x76\xad\x11\x46\xb4\x8b\x5d\x8c\x5c\x42\xfd\x65\x34\xc1\x49\x17\ +\xbf\x9b\x21\x05\xc4\x00\x95\x0b\xa9\x21\x38\xbd\x7a\x7f\x03\x4e\ +\x2f\x9f\x52\x28\xa5\x48\xa7\x53\x38\x79\xeb\x8d\x78\xf4\xc1\xbb\ +\x31\x32\x32\xec\xee\x0e\xe3\xc4\x35\xdc\x91\xe2\xb6\x4d\xfd\xe9\ +\x2d\x1b\xc5\x2a\x5e\x38\x3b\x87\x0b\x33\x6b\x9a\x35\xba\xb7\x5a\ +\x78\x80\x70\x2f\x39\xe7\x97\x8a\xe3\x38\x6f\x1e\x52\x46\x2b\x2a\ +\xa4\x89\xa7\x02\x94\x7e\x83\x51\xf6\x40\xbe\x09\x36\x85\x3f\x1c\ +\x64\x7d\xb3\x8a\x6c\xda\x42\xb7\x3b\x4e\x2b\x97\x49\x39\x9d\x23\ +\x21\xad\x27\xdd\xb5\x0e\xc4\x64\x8e\x88\xe1\x0a\x38\x39\xee\x27\ +\x1e\x3b\x82\xc5\xc4\x0f\x77\x80\x34\xee\x2a\x68\x9d\x89\x4e\x76\ +\xbe\x59\xa7\xb4\x28\x29\x9f\x47\xa0\x25\x3b\xf7\x83\x2c\xe4\x61\ +\x0a\x26\xbf\x95\xa8\xa1\x83\x13\xa5\xe6\x5b\xb1\x5b\x00\x16\x09\ +\x54\x2e\xa4\x7a\x01\xfc\x2e\x80\x5f\x84\xb3\x7c\xb0\xfa\xc4\xdd\ +\xe9\x30\xa7\xef\xbe\x15\xf7\x9d\xba\x1d\xfd\xfd\xbd\xb0\x08\xf1\ +\xa7\xb1\x34\x6c\xca\x8d\x75\x22\x04\x58\x58\x2d\xe1\x87\x6f\xcd\ +\x62\x66\x69\x73\xbb\xaf\x87\x5b\x27\xd9\x2f\xa5\x77\x9e\x33\xe9\ +\xe4\xae\xba\xe8\x90\x32\xf8\xa3\xa2\x5a\x51\x91\x01\xa5\x83\x93\ +\xce\xf1\xae\x09\xb0\x29\x45\xb9\xd6\x40\xb9\xd6\xc0\x6a\x31\x68\ +\x1e\x76\xe7\xd2\x3c\xb4\x3c\xa1\x8a\xbc\x94\xbe\x13\xa1\x54\xe3\ +\x9a\xe2\x8a\x71\x48\x54\x61\xf7\xa8\xbb\xf0\x82\x23\x9d\xb3\xdc\ +\xbb\x2e\x8c\xc3\x5c\xde\x32\x4b\xdc\x8c\x94\x8d\x57\xcf\xfb\xd3\ +\x2d\x17\x43\x79\x7a\x69\xfd\x4e\xf2\x39\x09\xb1\x9c\x63\x4c\x83\ +\xa3\xdd\x42\x29\x44\x00\x15\xe3\x38\xff\x38\x9c\xd5\x38\x8d\x90\ +\xea\xef\xeb\xc6\xa3\xf7\xdf\x89\xdb\x4f\xde\x82\xae\x7c\x1e\x94\ +\x52\x54\x0d\xa3\xc4\x2f\xcf\x6d\xe0\x87\x6f\xcd\x62\x65\xa3\xb2\ +\x03\xac\x28\xe1\x5d\x55\xf9\xa5\xc0\x03\xc1\xfb\xae\x1a\x71\xae\ +\x6e\xfa\xb5\x07\x52\xa2\x2f\x2a\xb4\xf7\x4f\x07\x28\x95\x35\xa6\ +\x3c\x10\xf2\x17\x42\xa9\xed\x2c\xff\x5c\xa9\x36\xb0\xe6\x59\x5a\ +\x79\xc7\x09\x9f\xf5\xa0\x25\x0a\x8d\xf6\xae\x50\xbf\x8e\x54\x03\ +\x3b\xa1\xe9\xc7\x39\x83\x98\x70\x26\x11\x55\x76\xad\x89\xd3\x68\ +\x82\xf2\x54\x3d\x8c\xbe\x0f\x4c\x61\xfa\x70\xf9\x28\x5a\x78\x62\ +\xad\x44\x1f\x97\x0e\xac\xe1\xbb\xd8\x78\x1f\x41\x3d\xb4\xbd\x82\ +\x3b\xe0\x7d\x8b\x2a\x51\x9b\x7e\x3d\x70\x9c\xe7\xc6\xcd\x40\x27\ +\x46\x9d\xe9\x30\x47\x6e\xbc\x01\xa9\x74\x0a\xb5\x7a\x43\x3b\xbf\ +\xce\xb6\x29\xde\x99\x5a\xc5\x4b\xef\xcc\x63\xb3\x54\xdb\x11\x90\ +\x72\x84\x7d\xd1\xd5\x7e\x29\x25\xa4\xb8\x28\xd3\x38\x29\x03\xa4\ +\x0c\x4e\x73\x6d\xf3\x50\xa8\x9c\x68\x45\x89\x80\x52\x59\x4f\x7a\ +\x38\xa9\xa1\xa4\xd6\x0d\x0e\x39\x4b\xcb\x22\xc8\xba\x23\xe2\xf3\ +\xd9\x14\xf2\x99\x14\x52\xcc\x90\x07\xa2\x84\x95\xe0\x3c\x37\xf9\ +\x6b\xc4\x1a\x98\x1c\xe8\x9c\x2a\xe1\x1d\xd9\x3e\xf0\x58\x47\xbb\ +\xd4\x86\x94\xe1\xc2\x24\x13\xbf\xfb\x5a\x7e\x18\x03\x31\xe9\xc4\ +\xa9\x04\x43\xef\xdf\xb8\x70\xd2\x89\xc9\x3a\xdb\xe9\x12\x15\x54\ +\x29\x00\xf9\xb0\xab\x30\x3e\x36\x84\xfd\xfb\xf6\x80\x58\x16\xea\ +\x75\xdb\xa8\x5e\x6b\xd8\x98\x5e\x2c\x60\xb3\xbc\x73\x20\x25\xaf\ +\x88\x00\xb5\x5f\x4a\x70\x9e\x7b\x11\x92\x85\xd2\x2c\xa4\x08\x8f\ +\x08\xb3\x0f\x4b\x5d\x9f\x58\x80\x12\xe0\x64\x6a\xee\x79\x87\x54\ +\x0a\x56\x3b\x91\xa8\x4d\x51\xae\x3a\xf3\x2f\x2d\x42\x90\x4e\x11\ +\xe4\x32\x29\x1f\x5c\x19\x6f\x70\x29\x97\x5c\x2c\x50\x4d\x2a\x45\ +\x5f\x9f\xc4\x16\xc7\xe2\xe1\xf3\xa3\x3c\x9d\xf8\x2c\x24\xd2\x68\ +\x8e\x15\x3e\x2c\x2f\xbd\x34\xe5\xc6\x3f\x0c\xd2\x52\xee\x3b\x04\ +\x18\xb2\x65\xa8\x1c\xf8\x88\x0c\x27\x4f\x57\xb5\xa2\xc2\x0e\x79\ +\xed\x22\x49\x54\x50\x95\x00\x9c\x37\x29\x10\x42\x70\xe6\xed\xcb\ +\x20\xd6\x77\xf1\xd8\x43\xa7\x30\x34\x34\x64\x5c\xd7\x29\x97\x49\ +\xe1\xd4\x2d\x93\x48\xa7\x2c\xbc\x3b\xb5\x8a\x06\xa5\xdb\x7a\xe1\ +\x88\xe2\xed\x54\x37\xf9\x42\x86\x21\xf8\x7a\x2a\xf0\xc4\x83\x54\ +\x78\x53\x4f\x01\xb2\xa6\x00\xa5\x9e\xe0\x2c\x1f\x0a\xe5\x4b\xb4\ +\x52\xdf\x41\xb6\x01\x56\xab\x53\x54\xeb\x75\x14\xca\x75\xa4\x18\ +\x6b\xab\x8b\x69\x22\x72\x68\xf0\x7d\x40\x80\x48\xaa\xa0\x85\x27\ +\x38\xbc\xa5\x0a\x08\x0e\x77\xc5\xf6\xeb\x2c\xbb\x74\x4e\x76\x16\ +\x70\x4a\xbf\x93\x5c\x33\x88\x30\x14\xfd\x61\x3e\x84\x04\xef\x3e\ +\xd7\x6a\xf4\x06\xa2\x36\x61\x39\xf9\x6b\xa6\xcb\x67\x8a\xdd\x84\ +\xaa\x54\x98\x42\xe1\xea\x0b\xe8\xdd\x7f\xb7\x0d\xe0\x0a\x80\xc7\ +\x00\x8c\xea\x2f\x10\xc5\xfc\xc2\x0a\xe6\x17\x96\x30\x36\x32\x80\ +\xfe\xfe\x5e\x63\xde\xb9\x4c\x0a\x93\x23\x3d\x20\x84\x60\x79\xbd\ +\x84\x46\x83\x6e\x9b\x75\xc5\x5b\x53\x6c\xb3\xce\x0f\x54\xc4\x09\ +\x90\x22\x26\x48\x91\xe6\x21\xc5\x2c\xa6\x4e\x84\x7a\x84\x42\x4a\ +\x4c\x2b\x7c\x21\xcc\xf9\x78\x7f\xc1\x57\x37\xd6\xcb\x43\xd4\xe1\ +\x83\xa2\xfd\x05\xd5\x01\xa5\xce\x6a\x0f\xe5\xaa\xb3\x38\xe0\x66\ +\xb9\xe6\xfa\x33\xa9\x7f\xde\xc4\x22\xcc\xe6\x19\xce\x17\xee\x27\ +\x8d\xb3\x8e\x04\xcb\xc9\x0b\xf7\x96\x0b\xe2\xaf\x8c\xf3\x2f\x65\ +\x43\x64\x57\x3e\x21\x62\x2a\x11\x96\x94\x23\x31\xef\x54\x17\x86\ +\x2a\x28\x06\x30\x04\xee\x35\x21\x8e\xf2\xe1\x6c\x7a\x9d\xe8\xec\ +\x82\xb1\xc1\x2e\x8c\x0d\xaa\x66\xb6\x11\xac\x6d\x6c\xe2\x95\xd7\ +\xdf\x46\xa9\xa4\x1c\x58\x4d\x01\x7c\x11\xc0\x4b\x85\xab\x2f\x60\ +\x3b\xc5\x8a\xa1\xfb\x1a\x80\xdf\x00\x70\x36\x4c\xf1\xfc\xa5\x69\ +\x7c\xfe\x2b\xdf\xc2\x3b\xe7\x2e\x98\x77\xd5\xa0\x40\x2e\x9d\xc2\ +\xed\x37\x8e\xe1\x9e\xa3\x93\xe8\xce\xa7\xb7\x65\x9a\x0c\x37\x04\ +\xc1\x0f\xe4\x23\xc5\x26\x9f\xdc\xc3\x17\x11\x52\x6c\x39\x42\x73\ +\x50\x0b\x29\x36\x9d\x00\x4b\xef\x88\x5d\xdd\x93\x78\xe9\x34\x80\ +\x22\x90\x01\xc5\xc2\x09\x3e\x9c\xc4\x38\x05\x0e\x44\x02\x69\xff\ +\xf8\x84\x62\x7e\xb6\xdb\xe9\xb2\x5e\xac\x62\x61\xad\x84\x99\xe5\ +\x22\x66\x97\x8b\x58\x5c\x2b\x63\xbd\x58\x45\xa5\xd6\x70\x3a\x64\ +\x5c\x4c\x71\xc3\x2b\x3c\xf0\xf9\x17\x55\x65\x12\x8a\x2f\xa1\x0b\ +\x3c\x31\xad\xda\x37\xae\x63\x87\xdf\xa9\xa6\xed\x54\x64\xd2\x13\ +\x45\x98\xe4\x53\x63\xac\x2e\xee\x53\x23\xde\x64\x66\x76\xc2\xb4\ +\xff\x47\xdd\xd5\xa8\x5a\x1c\x58\x65\xa5\xf3\xd1\x95\x3b\x24\xa1\ +\x16\x15\xe0\x5b\x55\x00\xf0\x36\x80\x1f\x01\xb8\x05\x86\x65\x5c\ +\x08\x21\x28\x6c\x96\x70\xf9\xca\x0c\xba\x72\x19\x8c\x8d\x8d\x20\ +\x95\xd2\x17\x45\x08\xc1\xe8\x40\x17\x06\x7a\x72\x58\xde\x28\xa3\ +\x5c\x69\x6c\xa9\x65\x25\x59\x53\xaa\x66\x9d\xa9\xc9\xa7\x1a\x86\ +\xa0\xb2\xb4\x98\xb2\x44\x48\xf9\xb9\xea\x20\xe5\x9b\x4f\xac\x85\ +\xc1\x03\x33\x00\x92\x19\x50\xe0\xc2\xd8\x7a\xaa\xe1\x14\x54\x02\ +\x3e\x78\x88\xf7\xc7\xe4\x6a\xfe\x23\x3e\x50\x89\x02\x62\x62\x79\ +\x36\x75\x96\xf1\xa9\x54\x1b\x28\x55\xea\xd8\x2c\x39\x6b\x6c\x55\ +\x6a\x36\x6a\x0d\x1b\x36\xe5\x37\x99\xf7\xad\x1d\xa5\xc7\x5d\x61\ +\x8b\xf8\x96\x0c\xe1\xe3\x88\xda\xfa\x0a\x80\x26\xfe\x40\x11\x65\ +\xde\x01\x34\xfd\x62\x84\xbc\x88\x54\x06\x15\x00\xc7\x5d\x7b\xca\ +\x9c\xa5\xd6\x57\xa7\x8e\x1c\x1d\xec\xc2\xd8\x60\x37\xa7\x4c\xdd\ +\xe7\x2b\xd4\xa2\xa2\xf4\x4b\x5d\x93\xb7\xbe\xb4\xf2\xd6\x97\xb1\ +\x9d\x12\x09\x54\x00\x07\xab\x2b\x00\xbe\x0b\x60\x3f\x9c\x09\xc9\ +\x4a\xab\x8c\x10\x82\x72\xa5\x8a\xcb\x57\x67\x00\xbb\x81\xc9\x89\ +\x51\xa4\x33\x19\x63\x19\x83\xbd\x39\x8c\x0e\x74\x63\xad\x58\xc5\ +\x66\xa9\xb6\x25\x17\x20\xac\xc9\xa7\xb2\x62\x44\x48\x31\x2a\xfa\ +\xe6\x20\x53\x16\xf7\x3d\x8a\x25\xa5\x6b\xea\x09\x56\x94\x0f\x11\ +\xa6\x3e\x6c\x13\x0f\x4c\x98\xca\x7a\x92\xe0\x24\x82\x89\x01\x92\ +\xfa\x62\x1a\xfe\x8c\xaa\x02\xbc\xd8\x38\x12\x58\x08\x8d\x06\x45\ +\xa5\xd6\x40\xb9\x52\x77\x9b\x8a\x75\x94\x2a\xce\x88\x79\x6f\x45\ +\x0d\xaa\xba\x9e\x02\x5b\x54\xe3\xac\xfc\x28\x8d\xe3\x8a\x0f\x67\ +\x60\x26\x99\x3d\xbc\x09\xe4\xef\xa2\x2d\xe6\x2b\x0d\x59\x90\x1b\ +\x9f\x94\x49\x2f\xd6\xd6\x08\x27\xf0\x46\xdb\xd8\x60\x17\xc6\x06\ +\xba\xe5\x41\x1a\x51\x40\x05\x7c\xb1\xff\x86\x87\x5f\x5a\x78\xf1\ +\xbf\x6d\xa1\xe9\x20\x4b\xac\x29\x34\xb3\xcf\xfd\x3e\x00\x60\xf2\ +\xf4\xa7\xde\x06\xf0\x4b\x00\xa6\xe1\x4c\xa7\x51\x2e\xed\x42\x08\ +\x41\xa9\x5c\xc5\x9f\x3f\xf7\x32\xd6\x0b\x9b\x78\xe4\xc1\x7b\xd0\ +\xd7\xd7\x67\xdc\x85\x63\x7c\xa8\x0b\x0f\x9d\xd8\x87\x17\xce\xce\ +\xe1\xd2\xec\x5a\x47\x9b\x82\x51\x9a\x7c\x46\x48\xb1\xff\xb2\x4d\ +\x3e\xf8\x01\x1a\x48\x71\x2a\x88\x0a\x29\x95\x15\x15\x94\xcf\xd7\ +\x85\xd1\xe4\xce\x8b\xf0\x05\x6b\xce\x9f\x98\x61\xa4\x3d\xd4\xa5\ +\xe2\xcd\x03\x5d\x33\x89\xb5\x4a\xd9\xae\x7a\xfe\x1c\x02\xab\xa2\ +\xde\x70\xac\xab\x52\xd5\x83\x9a\x73\x1d\xd3\x29\x67\x9b\xb1\x4c\ +\xca\x72\xbf\xbb\x6b\xc8\x13\xc0\x22\xae\x9e\xe7\x64\x26\x42\x3d\ +\x0c\xc3\x06\x64\x0f\x13\x13\x4b\xe0\x3f\xd7\xa2\xe3\x5a\xe5\x65\ +\x12\xd7\xae\xa2\xde\x1a\xd0\x21\x43\x08\x82\xf9\x7b\x21\x83\x3a\ +\x4c\x56\x57\x4c\x39\xf0\xd4\x13\x78\xe3\x3f\x72\xb7\x68\xcb\x1d\ +\x34\x4d\xad\x9e\x30\xfb\xdc\xef\x63\xf2\xf4\xa7\xe6\x00\xfc\x26\ +\x80\x29\x38\xd3\x6a\x86\x54\xba\x84\x10\x34\x1a\x36\x7e\xf4\xca\ +\x59\x6c\x14\x8a\x78\xf2\xd1\xd3\x18\x1b\x1b\xd5\xc3\x8a\x02\x03\ +\x3d\x59\xdc\x7f\xeb\x1e\xf4\xe4\xd2\x78\xeb\xf2\x32\xea\x76\xa7\ +\x7a\x04\x05\x18\xb1\x20\x00\x03\x11\x46\x55\x4c\x2e\x41\x8a\x85\ +\x53\x70\x11\xc0\x7f\x15\xf2\x6f\x12\x52\x12\xa0\x44\x3d\xf1\x14\ +\x8d\x80\x22\x72\x98\x10\xa0\xd1\x88\x7e\x9d\x95\xe5\x0a\x2f\x33\ +\x15\x74\x08\xd3\xe3\xc7\xfa\xad\xbd\x6b\xe3\x9a\x24\x9e\x4f\x06\ +\xb6\xb3\xf9\x05\x6b\x9b\x78\xcd\xcd\xb4\xbb\x8b\x8f\x95\x72\xf7\ +\x4e\x74\x8f\x53\x29\xe2\xac\x29\xcf\xdd\x4f\x68\x76\x4b\x16\x68\ +\xe2\x1d\x2a\x9b\x9c\xac\x0a\x55\x46\x12\x30\x80\x63\xc6\x32\x70\ +\x30\x12\xfc\x58\xea\x35\x41\xc1\xe8\xc2\xdf\xda\xcd\xa6\x14\xf5\ +\x46\xb0\xbb\x92\xb7\x35\x9c\x07\xbc\xf0\x15\x71\x29\xf9\xf2\xc7\ +\x80\x14\x8f\x51\x25\x52\x3b\x29\x4d\xaf\x47\xe5\xc2\x6a\x03\xce\ +\x32\x2f\x53\x70\x96\x1f\x3e\x68\xb8\x7e\x38\x7b\xee\x32\x36\x8b\ +\x25\x3c\xf5\xe8\x69\x1c\x3c\xb8\x5f\x7f\x69\x28\xd0\x95\x4d\xe3\ +\xae\x9b\x27\xd0\x9d\xcf\xe0\xd5\x77\x17\x50\xae\xb6\xd7\x6f\x25\ +\x5a\x53\x6a\xab\x4a\x48\x23\x34\xf9\x88\x98\x40\xd9\xec\x90\xf7\ +\xfd\x63\xbf\xb7\x1f\x52\x62\x1a\xae\x62\x7a\x7d\xc5\xf9\x6b\xc1\ +\xa4\x83\x5d\x04\x91\x7f\xf5\xc5\x73\xa0\x1a\x68\x11\xae\x87\x4c\ +\x0b\x2c\xef\x54\xfd\xe6\x99\xbb\xfd\x99\xed\xec\xe0\xe3\x24\xf7\ +\x7a\x15\x83\x46\xb1\x65\x39\x2b\xcf\x12\xcb\xd9\x1c\x36\x45\xe0\ +\xee\x9d\x48\xfc\x3d\x14\x9d\xf5\xd3\xfc\xda\x20\x58\x03\x55\x7e\ +\x7f\xd9\x71\x53\x54\x88\x83\x10\xc7\x8e\xa3\x0a\x9c\xf3\x1e\x4c\ +\x78\xb8\xd8\xde\xa7\xed\xed\x37\xe9\x86\xb9\x7b\x4f\xda\xd4\xdb\ +\x38\x37\xd8\xfe\x6d\x65\xa3\xc7\x75\xa5\xf0\xc3\x32\x08\x21\xb0\ +\x23\x6c\x84\x9a\x12\x67\xc6\x07\x03\x53\xb6\x0c\x56\x2d\xad\xf0\ +\xe9\xc2\xaa\x06\xe0\xbf\x03\x98\x81\xb3\xeb\xcc\x49\x9d\x3e\x21\ +\x04\x57\xa7\x17\xf0\x85\xaf\x7e\x1b\x8f\x3f\x7c\x0f\x6e\xb9\xf9\ +\x46\x58\xa9\x94\xd2\xba\xa2\x70\x4c\xf8\xe3\xd7\x8f\xa0\x3b\x9f\ +\xc6\x8b\x67\xe7\xb0\x51\xac\xb6\x71\xd9\x17\xde\x9a\xf2\x0f\x43\ +\x7a\xf9\xa4\x97\x97\x88\x59\x70\xed\xbd\xd6\x20\xc5\x15\x63\x80\ +\x54\x44\x2b\xca\x08\x28\x13\x9c\x54\x4d\x64\xdd\xf5\xd4\x8a\xdc\ +\xf5\x2f\x35\x07\xa9\x50\x2f\x01\x5a\x01\x9c\xdc\x6f\x21\xc0\x72\ +\xb2\x20\xfe\xd8\xa9\x60\x23\x6c\xaf\xf9\xe8\xf5\x8a\x39\x8e\x7b\ +\x37\x4b\xb7\x38\xaa\xdc\x95\x9b\xbd\x9f\xec\x33\xc1\x1e\x4b\x23\ +\x38\xdd\xc3\x00\x61\x2e\xa4\x18\x0b\xc7\x76\xcc\x20\xd8\x34\x80\ +\x6b\x00\x28\x0a\xdb\x76\x80\xe4\x6d\x86\x0b\xc6\x2a\xe2\xc7\x78\ +\x05\x25\x78\xe7\x13\x67\xaf\x4a\xcd\x7d\x63\x7f\xba\xa9\xf0\xa9\ +\x38\xd9\xf6\x4b\xcb\x4b\x11\xbb\xb0\xa2\x00\xbe\x01\x67\x2e\xe0\ +\xbf\x01\xf0\x04\x34\x4f\x2e\x21\x04\x4b\x2b\xeb\xf8\xea\x37\xbe\ +\x87\x8d\xc2\x26\xee\xba\xe3\x38\x32\x99\xac\xf6\x42\x12\x42\x70\ +\x78\xef\x20\xba\x73\x19\x3c\x7f\x66\x16\x8b\x6b\xa5\x96\x2d\x2b\ +\xdf\x9a\x32\x5a\x55\x31\x9b\x7c\x4c\x84\xdc\xf4\x0b\x8e\xc4\xb2\ +\xbd\x73\xe4\xeb\x16\x36\x44\x41\x84\x94\xd9\x8a\x8a\x06\x28\x19\ +\x4e\xea\xcb\x2c\x53\x2b\xda\xed\x20\x0a\x6b\x2a\x38\x60\xeb\x1f\ +\xc0\x49\x01\x2d\x09\x58\x41\x93\xd0\x7f\xa5\x28\xb3\xb4\x1d\xf1\ +\x5a\x97\xee\x6e\x31\x08\xdc\x50\xc4\x9b\x46\xe3\xdd\x47\x0a\x04\ +\x83\x43\xfd\xb6\x9e\x72\xd9\x61\xe7\xab\xcd\x81\x2d\x68\xb2\x31\ +\x63\xa6\x14\xcd\xb9\x60\x98\x83\x46\x87\x2d\x8b\x0a\x79\x33\x50\ +\xd2\xbe\x33\x91\xee\x47\x44\xa1\x46\x48\x6d\x59\x53\x30\xce\x38\ +\x2a\xad\x78\x4e\x76\x00\x2f\x03\xf8\x2b\x00\xfe\x07\x80\xaa\x4e\ +\x9f\x10\x82\x42\xb1\x8c\x3f\xfb\xce\x8b\xf8\xd6\x9f\x3f\x8f\x62\ +\xb1\x18\x6a\x29\xed\x1d\xed\xc1\xc3\x27\xf7\xe1\xc0\xb8\x79\x10\ +\x69\x34\x91\xe1\xe2\x56\x8c\xfd\x60\x34\xa2\x36\xf9\x34\x7e\x29\ +\x88\xf9\xb2\x60\x8a\x06\x29\xef\x57\x5b\xea\xd5\x33\x40\x8a\x80\ +\xaf\x0f\x01\xef\x5c\x0f\x9a\x3e\x84\x0f\xe3\x20\x45\xfc\x08\xcf\ +\x59\x2d\x0e\xf4\x8c\x73\xd5\xfd\x3f\xa6\x2c\xe6\x0b\xaf\xc7\x9f\ +\x80\xf3\x1f\x13\x46\xfc\x7b\x23\x9c\xaf\x7f\x9d\x14\x4d\x67\xe1\ +\x7e\x99\x57\xb5\x10\x7e\x78\x0c\xf7\xca\xab\x5b\x70\x3a\x41\x2f\ +\x2d\x1f\x27\x7c\x67\x74\xbc\x53\xe1\x9e\x15\xc9\x62\x57\xff\xd8\ +\x75\x58\x88\xe2\x53\xbc\xfd\x1d\xad\x4d\xe4\xe1\x09\x61\x52\xb8\ +\xfa\x82\x3b\x84\xe1\xae\x35\x50\xfa\x6d\x10\x92\x02\x70\x3b\x34\ +\xab\x2d\x78\x4e\xf6\xe9\xd9\x05\xac\xaf\xad\x63\x72\x62\x04\x5d\ +\x5d\x5d\xc6\x32\xba\xf3\x69\xec\x19\xee\x41\xa5\x66\x63\x75\xa3\ +\x02\xbb\x89\xab\xa3\x1f\x8e\xa0\x80\x11\x6b\xce\x43\xd4\x91\x9b\ +\x83\x26\xbf\x94\x6a\xac\x54\xa8\x4f\x8a\xb3\x9c\x08\x1f\xef\x43\ +\x06\x7e\x1d\xc4\x97\xd6\x4b\x4c\x88\x1a\x50\x1c\x68\x45\x38\xf9\ +\xc3\x12\xc4\x38\xf1\x82\xb2\xd0\x21\x86\x3f\xfd\xcd\xe2\xe1\xc5\ +\xbf\x03\x32\xc7\x42\x80\xc5\xa6\x16\xaf\x29\x7b\xde\x1d\x80\x95\ +\xca\x8a\x65\xeb\x21\x02\x53\xf9\xac\x31\x67\x2e\xfd\xe8\xb1\x0f\ +\x07\xc4\xef\x7a\xd9\x33\xd2\x83\x3d\x23\x3d\xf2\x75\x27\x04\xa5\ +\x52\x19\xaf\xbd\xf9\x8e\x71\x1c\xd5\xe6\xd4\x8f\x5e\x42\x60\xd4\ +\xb0\x77\x52\x4c\xd0\x31\x58\xb5\xc5\xa2\x62\x65\xf6\xb9\xff\x80\ +\x67\xfe\xfb\x7f\x58\xb6\xeb\xe5\xdf\x02\xe8\x3f\x00\x30\xaf\xd3\ +\x25\xc4\x71\xfc\xbd\x76\xe6\x3c\xbe\xf8\xd5\x6f\x63\x7a\x7a\xd6\ +\xf8\x2b\x41\x29\xd0\xd3\x95\xc1\xbd\xc7\x26\x71\xe2\xf0\x28\xb2\ +\x69\xab\xf5\xe1\x0b\x44\xf3\xa9\x52\x13\x21\xc5\xc6\x1a\x20\xc5\ +\xea\xa9\x86\x44\x44\x83\x14\xff\x9c\x2a\x27\x30\x6b\xac\x28\x3f\ +\x3a\x22\xa0\x14\x03\xc9\x99\x68\x01\x40\x91\x6d\x2b\x7e\xc0\x27\ +\x07\x30\x51\x93\x01\x9f\x64\x69\x85\x01\x4b\x1a\x5b\xc6\xdf\x13\ +\xd5\xf5\x12\xef\x5b\x1c\x58\xf1\xf7\x50\x78\x2e\x84\xce\x0e\x22\ +\x1d\xb0\xd7\x86\x29\x57\x65\x45\x89\x10\xdb\x32\xab\x8a\xea\xc0\ +\xa4\xb3\xae\x3a\x52\xa3\xb6\x83\x0a\x00\xf9\xaf\x47\x08\x99\x7f\ +\xe1\x0f\xca\xd5\xb5\xe9\x7f\x0f\x6a\xff\x0a\x80\x77\xc2\x12\x39\ +\xd3\x6e\xbe\x89\x73\xe7\x2e\xc0\xd4\xdc\xa5\x14\xc8\xa6\x53\xb8\ +\xfd\xc6\xf1\xd8\xd3\x6e\x94\xd6\x14\x14\x0f\x81\x7b\xa0\x1a\xd8\ +\x09\x46\x93\x7f\x90\xf8\x4f\xf6\xa9\x54\x35\xe9\xa0\xaa\x8b\xe6\ +\x17\x97\xcf\x8e\xf8\xf5\xd2\xbf\x74\x0a\x2b\x4a\xac\x37\x17\xc6\ +\x34\xeb\x14\xd7\x8c\x87\x92\xee\xe2\xb2\x80\xe1\xff\xcc\x8f\x2e\ +\x0f\x2e\x51\x37\x80\x53\x04\x60\xb1\xf7\x53\xea\x11\xe5\x9b\x82\ +\xcd\xc2\x4a\xf7\x2c\x71\x97\x97\x03\x25\x4f\x4d\xee\x99\x63\x80\ +\xa4\xbf\xa8\xe0\xf2\x56\xfe\x7a\x74\x5e\xa2\xc0\xca\x58\xcb\x56\ +\xa5\xdd\xa0\xe2\x28\xbb\x7c\xe6\x8b\xf6\xd2\xeb\x7f\xf4\xc7\xb4\ +\x51\xfb\x45\x00\x3f\x30\x26\x24\x04\x73\x0b\x2b\xf8\xe2\xd7\xbe\ +\x83\x97\x5f\x79\x13\x76\xc3\xbc\xb1\x83\x65\x11\x1c\x3d\x38\x8c\ +\x07\x8e\xef\xc3\x60\x5f\xae\x39\xcb\x2a\xe6\x65\x96\xad\x2a\xe7\ +\x0b\xdb\xe4\x0b\x74\x09\x17\x44\x0c\x0f\xb9\x04\x29\x01\x8e\x3c\ +\xa4\xc0\xbf\x17\x44\xf5\xb2\x69\xac\x28\x11\x50\x4c\xd3\x8e\xbf\ +\x17\x01\xa0\x54\x17\x41\x09\x24\xee\x2a\xf1\x7f\x04\xd0\x43\x4c\ +\xca\x5e\x0d\x2d\x1d\xb0\x58\xb2\x88\xd6\x95\xd2\x77\x25\xc0\x8a\ +\x6f\xbe\x7b\xd7\x8f\x39\x57\xc3\x8f\x0d\x7f\xdb\x79\xdf\xa5\xb2\ +\xa3\x46\x02\x1e\xff\x83\xa4\xfc\x81\x34\xfd\xa0\x6e\x99\x55\x25\ +\x9f\xb2\x21\xac\x23\xb0\x6a\x27\xa8\x54\x15\x25\xb5\xcd\x25\x6b\ +\xee\x87\xff\xf9\xbb\x76\xad\xfc\x0b\x00\xfd\x02\x80\x86\x36\x03\ +\xe2\x0c\xe9\xff\x93\x6f\x3e\x87\xef\x7d\xff\x45\x54\x2a\xe5\x50\ +\x27\xfb\xc1\x89\x3e\x3c\x7c\x62\x3f\x26\x47\xba\x8d\xdd\x0e\xb1\ +\xac\x29\x08\x0f\x0b\x91\xf5\xfd\x53\x64\x9e\x56\x89\x57\xc2\x03\ +\xc9\xd5\x83\x0d\x17\x20\x25\x45\x69\x81\xa6\xb2\x1a\xc4\xaa\x89\ +\x80\x72\x53\x1b\xac\x27\x91\x10\x32\x90\x88\xf6\x4f\x0c\x41\x98\ +\xbe\x01\x5c\x01\xb4\xc0\xe7\xc4\x00\x4b\x6b\x5d\x71\x20\x0a\x03\ +\xbe\x19\x56\xfc\x57\xcd\x0f\x93\x04\x32\xfe\xd9\x60\xb3\x12\x7f\ +\xf0\xb4\x12\x19\x01\x1d\x24\x55\x30\x87\xc7\x54\x8b\x8e\xc3\xaa\ +\x5d\xa0\x0a\xab\xa8\x35\xff\xe2\x1f\x9c\x6d\x94\xd7\x7f\x05\xd4\ +\xfe\xff\x00\x94\xb5\x19\x11\x82\x52\xb9\x86\x3f\x7f\xee\x65\xfc\ +\xe9\x9f\xfd\x05\x36\x36\x36\x42\x61\xe5\x4c\xbb\xd9\x8f\xeb\xf7\ +\x0c\x44\xff\x75\x61\x6a\xa8\x7c\x70\xf4\x4f\x2a\xff\x0c\x2a\xd5\ +\x75\xbf\x7c\xb2\x25\x40\x84\x97\x25\x08\x23\x91\x5e\x2c\xbf\xee\ +\x4a\x4b\x40\x78\x01\x19\x2b\x8a\x0f\x92\xad\x27\x13\x98\x74\xd6\ +\x11\x21\x92\xaa\x51\x57\xce\x5b\x07\x2d\x03\xb0\xd8\x5c\x58\xeb\ +\x8a\xbb\x5e\x41\x64\x33\xb0\x52\xf9\x03\x03\x06\xc9\x0f\x9c\xda\ +\x9a\x92\x7e\x79\xe4\x72\x23\x38\xd6\xb7\xc9\xaa\xda\x76\x58\xb5\ +\xa3\xd7\x2f\xea\x49\x90\xe2\xec\xeb\x85\x4c\xdf\xe4\x77\x53\xd9\ +\xde\x2a\x21\xd6\x9d\xd0\xac\x1a\x4a\x88\x33\x46\x64\x66\x7e\x09\ +\xcb\xcb\x2b\x98\x18\x1b\x46\x4f\x4f\x0f\x4c\x92\xcf\xa6\xb0\x67\ +\xb8\x07\xb6\x4d\xb1\xbc\x5e\x86\x6d\x43\xb8\x89\x44\x02\x40\x58\ +\x4f\x9f\xf6\xe1\x61\xc8\xc6\xe9\x80\x81\x91\x00\x27\x39\x4e\xd7\ +\xb3\xc8\x97\xc9\xeb\xe9\x5e\x28\xe6\x45\x12\xea\xc9\xe9\x09\x56\ +\x94\xe4\x77\xe2\x20\x21\x58\x49\x1a\xab\x47\xff\x48\x44\x50\x94\ +\xac\x29\x35\xb4\xd8\x04\x12\xb0\x78\x93\x4a\xb2\xae\xe2\xc0\x0a\ +\xca\x6b\xcb\xdf\x7b\xe5\x8f\x95\xca\x5f\xe5\xd7\x57\x4a\x26\xd4\ +\xc1\x70\x09\xa3\x7c\x4a\x09\x64\x69\xad\xd7\xcf\xfe\xf2\xe6\xf4\ +\x4b\x62\xaf\x9f\xae\x26\x1d\x83\x55\xab\xa0\x8a\x4b\x5a\x52\x5e\ +\x7c\xa7\x0a\xbb\xf1\x83\x6c\xdf\xe4\x0c\xb1\x52\x77\x02\xe8\x37\ +\x15\xb0\xb8\xb4\x86\x99\xd9\x79\x8c\x0c\xf5\x63\x60\xc0\xa8\x8a\ +\x4c\xca\xc2\xc4\x70\x0f\x32\xe9\x14\x96\xd6\x4b\xa8\xbb\x0b\xf1\ +\x69\x97\x71\x21\x1a\x58\xf8\x0f\x74\x04\x90\x41\x9f\xbf\xd2\x9a\ +\x52\xfd\x9a\x0b\x3d\x7c\x92\x65\x14\xe1\x57\x9f\xfd\xb5\xf7\x00\ +\x10\x44\x08\x0d\x56\xc1\x82\x52\x59\x38\x2c\x9c\x54\x2f\x45\xd8\ +\x50\x04\xd6\xcf\xa5\xfc\x53\x3c\xbb\x3a\x68\xe9\x80\xc5\xb2\x23\ +\x00\x16\x0f\x81\x38\xb0\xe2\xae\x9f\xe2\xe9\x35\x39\xd7\xd9\x73\ +\x10\x9f\x01\x21\x52\xed\x7e\x50\xfd\xe8\x45\xb2\xaa\xc4\x1f\x64\ +\x59\x5a\x03\x55\xe3\xcb\x9b\xd3\x2f\xbd\xcc\xdc\x10\x18\x3e\x11\ +\x51\x27\xb6\xb4\xd2\xf4\x6b\xb6\xd2\x64\x73\xe6\x95\xfa\xf2\x9b\ +\x9f\xfb\x1f\x76\xad\xf4\xcb\x00\x7d\xdd\x58\x08\x09\xa6\xdd\xbc\ +\xf9\xd6\x3b\xa0\xd4\xd6\x36\x05\xd9\x69\x37\xa7\x6f\xdd\x83\xbe\ +\xee\x0c\x93\x8f\x58\x11\x55\x35\x85\x87\x80\x08\x9f\xaa\x93\xd4\ +\x98\xf4\x4a\x48\x29\xae\x9e\xaa\x87\xcf\x0b\x88\x07\x29\xe2\x57\ +\x94\x08\x75\xe0\x99\x25\x5b\x50\xcc\xad\xd1\xc2\x29\x6c\x48\x41\ +\x6c\x11\x41\x26\x14\xa8\x84\x27\x11\x2f\x91\x00\x5c\xff\x1a\x32\ +\xbe\x2b\x5f\x4f\xd4\x89\x0a\x2b\x8d\x73\x5d\x73\x8f\xc5\x73\xe0\ +\x3e\xa5\xfb\xaf\x22\x22\xf3\x3d\x92\x55\xa5\x7e\x8e\xdb\x28\x51\ +\x6d\xbb\x8e\xc2\xaa\x59\x50\x11\xcd\x71\xd4\xca\x92\xda\xe6\x12\ +\xe6\x5f\xfc\xaf\x7f\xd2\x28\x6f\xfc\x55\x50\xfa\x2d\x18\xc6\x24\ +\xb0\xd3\x6e\x9e\x7f\xe1\x55\xd4\x6a\xe6\x39\x7f\xde\xb4\x9b\x87\ +\x4e\xec\xc7\xe8\x40\x17\xbf\x56\x90\xa2\x36\x44\x38\xd6\x9e\x8a\ +\x44\x2d\x22\x67\x17\xe1\xe1\x54\xf9\xa5\xc4\x97\x27\x3e\xa4\x20\ +\xeb\x70\x3f\xe6\x3c\x0c\xc2\x20\xe0\xa7\xd1\xf4\xfe\xf9\xf6\x0e\ +\x89\xf9\x27\x5e\x13\xf6\x3c\x4c\xce\x7c\x43\x5d\x95\xd6\x15\x6b\ +\xfd\x48\xd7\x5d\xbe\xde\x46\x58\xa9\x9c\xeb\x0a\x90\x99\x9a\x80\ +\xca\xfb\x2c\x7e\x2a\x7f\x18\x75\x56\x95\xe6\xb3\x23\xac\x6a\x0b\ +\xac\xa0\x39\x8e\x24\xcd\x80\x2a\x0a\xc2\xc3\x48\xea\x3d\x3e\xa9\ +\x85\x97\xff\xe7\xcb\xb5\xcd\xf9\x4f\x81\xda\x9f\x06\xa0\x5d\x2d\ +\xcf\x5b\x35\xf4\xcf\xbe\xf3\x42\xac\x69\x37\x0f\x9d\xdc\x8f\xfd\ +\xc2\xb4\x1b\xf1\xe6\x2b\xc3\x89\xe9\xe1\x11\x3e\x4d\xbf\x8e\x21\ +\xe6\xbe\x94\x1f\x0b\x1e\xc8\x65\x87\x43\x8a\xc8\x3a\x8a\x66\x9e\ +\x1e\x50\x6a\x38\x89\x60\xd2\x7a\xcf\xc3\xfe\xdc\x74\xe2\x74\x1c\ +\xfe\x5e\x43\xae\x03\x57\x4f\xf6\x9a\x06\xd7\x53\xbb\xcb\x34\xf3\ +\x4f\x3c\x58\xf1\x95\x12\xe1\xa1\x7a\xba\xc5\x67\x82\xfb\x51\x12\ +\xca\x6d\xcd\xaa\x8a\x92\x47\x5b\x25\x0c\x3c\x61\x56\x53\x14\x6e\ +\x68\xa5\x19\x1f\x55\x5c\xba\xea\x28\xeb\x7f\x2f\xcd\xbf\xb5\x96\ +\xee\x1e\xfa\x4e\x2a\xdf\x9f\x26\xc4\x3a\x09\x40\xb9\x14\x28\x21\ +\x04\xb6\x6d\x63\xca\x9f\x76\x33\x6a\x9e\x76\x43\x9c\x69\x37\x93\ +\xc3\xbd\xa8\xd6\x6d\xac\x16\x2a\x7e\x3e\xce\xa7\xa3\x24\x37\xd1\ +\x14\xbf\xa6\x44\x13\x1e\x29\xbf\xe0\x1f\x75\x9c\xde\x79\x0e\x95\ +\x1e\x5b\x1f\xf0\x16\x07\xfb\xe2\xb3\x8e\x75\xb6\x7e\x5e\x68\xd4\ +\x9e\x35\x35\x98\x14\x18\x22\x86\x3f\xe1\xa6\x73\x8f\x81\x11\x5a\ +\x6a\x7f\x9a\x0e\xb4\xea\xe5\x9b\xe3\xc1\x8a\xbb\xbe\xc2\x8f\x84\ +\x74\xed\xc1\xe7\xa9\x34\x69\x88\x94\x5c\xfe\x34\xfe\x30\x0a\x65\ +\x09\xe9\xa1\x39\xf6\xa4\x25\x1f\x95\xdd\xf8\x8a\xeb\xa3\xb2\x84\ +\x22\x4c\xd6\x53\x14\x16\xc4\x92\xb8\xa0\x8a\x0a\xa3\x30\x48\x89\ +\x9f\xa4\xbc\x7c\xbe\x04\xbb\xf1\x5c\xb6\x6f\x7c\x95\x58\xe9\x3b\ +\xe0\x6c\x7a\xaa\x14\x4a\x81\xf9\x45\x67\xb7\x9b\xf1\xd1\x41\xf4\ +\xf5\xf5\x19\x6b\x9b\xcb\xa4\x30\x39\xdc\x03\xcb\x22\x58\x5e\xaf\ +\xa0\x61\x53\x67\x03\xcc\x30\x08\x49\x0f\xab\xc1\x39\x2e\x84\x1b\ +\x75\x84\xb2\xfc\xaa\x2a\xca\xe3\x1f\x5c\xc5\x8b\xc2\x90\x4b\x7e\ +\x61\x19\x90\xb1\x16\x06\x47\x8c\xf0\xb1\x4a\x12\x98\x44\x66\x49\ +\x04\x92\x91\xa4\x30\xaa\x04\x2d\x19\x5a\x5c\x72\x15\xb0\x98\x9b\ +\xac\x85\x95\xe2\x1a\x87\xc1\x4a\x35\x56\x4e\x7a\xa0\x15\x01\xda\ +\x1f\x2e\xf1\x81\x64\x2b\x4c\x84\xf0\x38\x86\x87\xd8\xd4\x14\x80\ +\xe8\x49\x6b\xa0\xaa\x7f\x75\x73\xfa\xe5\x97\x35\x15\x0b\x0b\x53\ +\x85\x37\x05\xad\x38\x4d\xbf\xb0\x0a\x98\x0a\x8f\x42\x5a\x6b\x73\ +\xe6\x95\xf2\xf2\x99\xaf\xfc\x27\xbb\x56\xfc\x75\x80\xbe\x1b\x56\ +\xa1\xf3\x97\xa6\xf1\xb9\x2f\x6b\xa6\xdd\x30\xcf\x01\xa5\x40\x36\ +\x93\xc2\xc9\xc3\x63\xb8\xe7\xe8\x84\x33\xed\x26\xd2\x69\xca\x0f\ +\xac\xf3\x35\xfc\x21\x33\x0e\x30\x15\xce\xbe\x33\x90\x82\xac\x03\ +\x48\x7a\x66\x40\xf1\x70\xe2\xc9\xe2\x5a\x34\xca\xff\xa2\xc5\xaa\ +\xc0\xc5\xe5\xad\x70\xdc\x73\x3e\x2c\x85\x75\xc5\xe9\x85\x58\x4e\ +\x66\x58\x41\x73\x2f\x14\xbd\x6f\x86\x57\x4f\xf2\x59\x9a\xac\x2a\ +\x5d\xf9\xd2\x0f\x69\xd8\x5b\xde\xb4\xe1\x22\x89\x62\xa5\xe8\xa8\ +\xc0\x89\x03\xb1\x50\x89\x0a\xaa\x76\xc1\x28\x2c\x3d\xa9\x15\xe6\ +\xec\xf9\x1f\xfd\x8f\xcf\xd7\x4b\x6b\xbf\x0c\x6a\x1b\x37\x13\xf3\ +\xa7\xdd\x7c\xfd\xcf\xf1\xf2\xab\xe1\xd3\x6e\x52\x16\xc1\xcd\x07\ +\x86\x70\xff\xad\x7b\x30\xd8\x9b\xf3\x57\xd5\x51\x3e\x04\x8a\x87\ +\x42\xfb\xa9\x79\x08\x4d\x57\xc7\xb7\xd0\xfc\x03\xd3\xaf\x78\x2b\ +\x90\x62\x5e\x62\x12\xe4\x27\x5a\x1d\x4a\x40\x71\x70\x12\x70\xa3\ +\xb3\xaa\x22\xfc\x05\x60\x62\xc1\xc5\xc4\x71\x57\x43\x3d\x76\x4a\ +\x0b\x63\xe9\x3c\x99\xeb\xad\x6a\xe6\x29\xe2\xbd\x4c\xb5\x50\x88\ +\xd0\x04\xe4\x9f\x43\xcd\xf7\xa6\xfd\x4c\xdc\xd5\xe1\x42\xc4\x67\ +\xb2\x0d\xc2\xdf\x0e\xa1\x98\x88\x9f\xfa\x13\x88\x08\xab\xb8\xce\ +\xf4\x66\x2b\x18\xcf\x54\xa4\x36\x59\x7c\xe5\x7f\x7d\xbf\x5a\x98\ +\xfb\x25\x6a\x37\xbe\x0a\x40\xbb\x3f\x3c\x21\x04\x6b\xeb\x9b\xf8\ +\x93\x3f\x7b\x0e\xdf\x7b\xee\x45\x54\x2a\x15\x10\x8b\x28\x33\xf6\ +\xe4\xe0\x44\x1f\x1e\xba\x6d\x1f\x26\x86\xbb\x23\x9c\xaa\xfb\x3d\ +\x86\x35\x65\x74\xa0\x43\xf1\x52\x40\x78\x29\xb8\x67\x96\x7d\x29\ +\xc4\xa2\xa2\x40\x0a\x46\x4b\xc3\x08\x28\x01\x4c\x1c\x70\x84\x33\ +\x8f\xfa\xa7\x4a\x28\x41\x8b\x0b\xe7\xcf\x95\xbb\x6a\x9a\xe6\xad\ +\x7f\x0e\xc2\x35\x92\x60\xe5\x69\xeb\x78\x21\x02\x41\xf1\xa3\x65\ +\x7a\x25\xb5\x3f\x64\xb1\xac\x2a\x9d\x7b\xc2\x94\x48\x53\xa1\xd6\ +\x25\x8e\x95\xd4\x2c\xc4\x94\x12\x05\x54\x51\xa0\x13\x35\x6d\x9c\ +\x93\xb1\x96\xdf\xf8\xfc\xd9\xca\xf2\xbb\xbf\x46\xed\xda\x7f\x05\ +\x50\xd1\x16\x42\xdc\x69\x37\xdf\x57\x4d\xbb\x21\xca\x5a\x8c\x0d\ +\x75\xe1\xc1\xdb\xf6\xe2\xba\xc9\x7e\xce\x11\x1a\xd9\x8a\x0a\x92\ +\xf0\x9f\xaa\x13\xd7\x24\x56\xc2\x49\xf5\xab\xee\x27\x61\x5f\x96\ +\x26\x21\xc5\xe6\x17\x0a\x28\x2f\x82\x3f\x15\xe2\x69\x78\x7e\xa3\ +\x18\x7f\xda\x6d\xb7\x04\x68\xa9\xac\x2c\xef\x20\xdc\xba\x12\xcf\ +\x5d\x03\x2b\xc6\xf2\x62\xad\x30\xfe\xde\x08\x2f\xbf\x08\x10\x31\ +\x0d\x7b\x5f\x5a\xb2\xaa\xc2\x44\x3f\x00\xb4\xbd\xe2\xaf\x9b\x1a\ +\xc7\x4a\x42\x88\x0e\x89\x9b\x36\x8a\x33\x3d\x2e\x21\x9b\xfd\x54\ +\x85\x59\xe5\xe5\x0b\x05\x50\xfa\x17\x99\x9e\xb1\x2a\xb1\xd2\xb7\ +\x03\xc8\x29\x2b\x49\xbc\x69\x37\x8b\x58\x5e\x5e\xc5\xe4\x38\x33\ +\xed\x46\x04\x8f\xfb\x70\xe4\xb3\x29\x4c\x0e\xf5\xa0\x41\x29\x56\ +\x37\x2a\xa0\x34\x78\x59\x83\x5f\x2f\xc5\xc3\x49\x98\x87\xc3\x7b\ +\xb1\x7d\x60\x69\xc2\x35\xf9\xe8\x75\x98\x47\x51\xac\x47\x04\x48\ +\xb1\x56\x85\xb2\xeb\x9e\xb1\x2c\x24\x40\x09\x26\x90\x7f\x28\x76\ +\xe3\x41\x88\x0f\xf9\xe3\x13\xc8\xe0\x62\xe3\x95\xc0\x62\x14\xd4\ +\xd6\x15\x7f\x0d\x98\x5b\x2d\x5c\x67\x39\x9e\xb7\x52\x44\x58\x89\ +\xe5\x6b\x9e\x56\x62\x88\x22\x9a\x4f\x6d\x56\x02\xfc\xcc\xca\xdc\ +\x49\xb0\x65\x50\xda\x9a\x33\x9d\xf2\xce\xf4\x76\xbc\xe3\xaa\x2b\ +\x18\x2a\x61\xa0\x8a\x0a\x97\xb8\xe1\x62\xbc\xa9\x0c\xab\xb6\x31\ +\x5b\xad\x6d\x2e\xbc\x90\x1b\xd8\x3f\x47\xac\xcc\xed\x20\x44\xd3\ +\xcd\xe7\xc8\xe2\xd2\x2a\x66\x66\x17\x30\x32\xd4\x8f\xc1\xc1\x7e\ +\x3e\x53\xee\x8e\x03\xd9\xb4\x85\x89\xa1\x6e\x64\xd2\x29\x2c\x6f\ +\x94\x51\xb7\x29\xac\x90\x1e\x3d\x7d\x38\xfb\x80\xcb\x26\xbb\x59\ +\x87\x39\x66\xf4\x64\x48\x69\xf4\xd8\x7a\x31\xa7\x68\x1c\x0c\xc9\ +\xea\x89\x2f\x83\x7f\x83\x18\x38\x09\x37\x8e\xb0\x79\x44\xf8\xd3\ +\xc2\xcb\xad\x98\xbf\x34\x2f\x13\xce\x01\x8b\x63\xa4\x07\x3a\xa6\ +\xbe\x11\x60\x15\x5c\x17\xee\xe4\x83\xeb\xc6\xdc\x1b\xfe\x4a\x04\ +\xd7\x89\xfb\xc1\x60\xc3\xd9\x7c\x45\x42\x09\xf9\xf0\x17\x3a\x94\ +\x5a\x7c\xf9\x50\x95\xaf\x12\x67\x9d\xfa\x36\x81\x4a\xd7\xfa\xd2\ +\x55\x21\x6a\x78\x18\xcc\x00\xb4\xbe\x7a\x42\x5c\x52\xc6\x3d\x29\ +\xbf\x9e\xd5\xb5\xa9\xda\xe2\x6b\x9f\xf9\x9f\xf5\xf2\xea\xaf\x81\ +\xda\x67\x8c\x95\x22\x04\x57\xa6\xe7\xf1\xf9\xaf\x7c\x0b\x6f\x9c\ +\xf1\xa6\xdd\xc8\x55\x23\x08\xa6\xdd\x1c\x3b\x34\x8c\x53\x47\x27\ +\xd1\xd7\x95\x71\xd6\xb6\xd2\xfd\x24\x4a\xd5\x54\x54\x59\x73\x36\ +\xc2\x0f\x9f\x16\x52\x7a\x67\x2d\xaf\x17\x75\x29\xe3\xa0\x4c\x1f\ +\x3d\x92\x15\x25\x59\x50\x82\xe5\xa4\x06\x13\x61\xf2\x34\xff\x17\ +\x50\x86\xc9\x57\x80\x97\x7f\x22\xa2\x95\xc5\x01\x8b\xb9\x66\xee\ +\x41\x1c\x58\xa9\xc6\x95\x05\x6a\xfc\xf9\xf2\xf7\x88\xfb\xa5\x80\ +\x90\x89\xf2\x5e\x35\x67\x55\x85\x3c\x5b\x5a\x31\x97\xdd\xa2\x98\ +\x0c\x0a\x93\x6e\x94\xf0\x48\x62\x02\x55\x54\xf2\xc5\x35\xfb\xa2\ +\x5c\x43\xa5\x25\x66\xd7\x4a\x58\x7c\xe5\xd3\x7f\x5a\xdd\x98\xfb\ +\x15\x4a\x1b\xdf\x45\x84\x69\x37\x5f\xf9\xfa\x77\xf1\xc3\x1f\xbe\ +\x82\x5a\xad\xe6\x5b\x4a\xca\x0b\x41\x08\x6e\xd8\xd3\x8f\xfb\x8f\ +\xef\xc5\xc8\x40\x5e\xda\xba\x29\xf4\x61\xe3\x9c\xb4\xba\xe1\x08\ +\xc2\x5b\x20\x9d\x2e\x78\x10\x41\xfe\xd2\x14\xa4\x02\x53\x4a\xb6\ +\xa2\x74\x80\xf2\x8e\xd9\x34\x1c\x44\x08\x1f\x2f\x26\x08\xb5\xa6\ +\x58\x78\xf1\x3a\x4c\x65\xf8\x87\x44\x61\x5d\xf9\x67\xc2\x5d\xe6\ +\x10\x58\x71\x64\x13\xee\xaf\x02\x48\xea\x1f\x16\xc3\x83\xdc\x8c\ +\x55\xa5\x4b\x2e\xfe\x90\x31\xd0\xe4\x1e\x23\xa2\x29\xbb\x55\xa1\ +\xca\x0a\xb7\x9b\x01\xa1\x4c\x68\xc7\xa4\xe4\x56\xf5\xe3\x9c\x24\ +\x01\x90\x5a\x7e\xf3\xf3\xaf\x94\x97\xce\xff\x2d\x6a\xd7\x3f\x0b\ +\xa0\xae\x2d\x90\x10\x14\x8a\x25\xfc\xe9\x9f\xbf\x80\x6f\x7e\xfb\ +\x07\xf2\xb4\x1b\x91\x04\xc4\x31\x93\x1f\x38\xbe\x17\xfb\x46\x7b\ +\x15\x7a\xaa\xea\x84\x9c\x8d\xe9\xa4\x4c\x0f\x3d\x13\xe1\xc3\x4f\ +\x91\x77\x24\x48\x09\x2f\x1c\x67\x45\x81\x01\x87\x00\x28\xd6\x72\ +\x92\x1c\xe0\x91\x60\xa4\xca\x4b\xa5\xcf\x43\x4b\xb4\xb0\xf4\x9b\ +\x53\x80\x01\x14\xe1\xaf\xa3\xe6\x1a\x88\xd7\x88\x04\x0a\x6a\x0b\ +\xc7\x04\x19\xc5\x0f\x50\x58\xd3\x4c\xf7\x43\xa7\xff\x11\x0b\x93\ +\xb0\xe6\x5f\xab\xcc\x32\x2e\x9d\xdb\x2e\x06\x84\x8a\xce\x47\x15\ +\x15\x1a\x51\x21\x13\x35\x1f\x51\x47\x1b\x5e\x59\xbe\xb0\x46\x08\ +\xf9\x5e\xba\x7b\x34\x4d\xac\xf4\x6d\x30\x4c\xbb\x69\xd8\x36\xa6\ +\x66\x16\xb0\xb6\xb6\x81\x3d\x93\xce\xb4\x1b\xfe\x79\xe0\xcd\xff\ +\xae\x5c\x1a\x93\xc3\x3d\xa8\xd6\x1b\x58\x2d\x54\x9d\x7d\xe2\x48\ +\xf0\xc0\x13\xcd\xc3\x6e\xfe\xe5\xd3\x8f\x76\xd7\xea\x40\x6d\x05\ +\xa8\x26\xbf\xaa\xf5\x84\x78\x15\xd4\xbc\x48\x16\x10\x24\x48\x20\ +\xf5\xfe\x71\x90\xd1\x0c\xe4\x54\xda\x4f\xb2\xa6\x16\x5a\x3a\x60\ +\x41\x00\x16\x73\x12\x51\x61\xc5\x3d\x50\x82\x15\xcc\x5c\x10\xf5\ +\xa1\xe1\x87\x45\x7a\x03\x75\x84\x52\x6b\x1b\x5e\x94\x90\x1f\x46\ +\x2e\x13\x22\xe5\x41\x41\x5a\xf7\x51\xcd\xbc\xf2\xb2\xb1\x8a\xf1\ +\x3e\xc3\x4f\x59\x21\xcd\x82\x2a\xca\x27\x69\x73\x7e\x52\xfe\xd5\ +\xf5\x99\x52\xa3\xbc\xf6\x7c\xb6\x6f\xcf\x3a\x49\x65\x4e\x02\x44\ +\x39\x30\x8a\xc0\xe9\xfd\x98\x5b\x58\xc1\xfc\xfc\x12\xc6\x47\x87\ +\xd0\xdf\xdf\xcb\x65\xc9\xfd\xb2\x02\xc8\x66\x2c\x4c\x0e\xf7\x80\ +\x10\x82\x95\x8d\x0a\x1a\x94\x46\x70\xa6\x0b\xe1\xa1\xa0\x62\xe3\ +\x45\x38\xf1\xdd\xdc\xe2\xcb\xa7\xec\xcd\x8a\xe0\x9f\xe1\x9b\x7a\ +\x04\xe2\xc3\xcd\xc2\x8c\x83\x89\xff\x55\x1e\xef\xc4\x01\x47\xf8\ +\x53\x73\x4b\x84\x97\xba\x1c\x1d\x40\x65\x58\x69\xc0\xaf\xb9\x26\ +\x2a\x66\x88\x96\xa9\xd6\x27\xc5\xa1\x83\x2b\x48\xa8\x93\x54\x84\ +\x50\x0f\xe6\xa4\x14\x79\x88\x9f\x32\x28\xf9\x67\x47\x2e\xd0\x89\ +\x6c\x4b\xaf\xdf\xcc\x2b\xaf\xa0\xb9\xa1\x4c\xcd\xea\x48\xa2\x2a\ +\x3c\x8c\x7c\xba\xf0\x66\xf5\x74\x15\x8f\x12\x6e\x95\x97\x2f\x94\ +\x97\xdf\xfc\xc2\x7f\xae\x97\xd6\x7e\x13\xd4\xbe\x18\x76\xc2\xef\ +\x5e\x9c\xc2\x67\xbf\xf4\x67\x78\x87\x99\x76\xa3\xba\xd9\x14\x40\ +\x26\x6d\xe1\xb6\xeb\x47\x71\xe7\x4d\x63\xe8\xce\xa5\x9d\x9d\x69\ +\xb9\x07\xdb\x74\x92\x61\x90\x02\xf7\x8c\xea\x7e\xd1\xd9\xc7\x5e\ +\x7e\x90\x04\x28\xfa\x7a\x41\x7e\xea\xb1\x42\xf0\x7b\x03\x65\x08\ +\xf0\xe0\xd0\xc1\x89\x71\x2d\x71\x7f\xaa\x9b\xa5\xd4\x13\x0e\x74\ +\xc0\x92\xac\x1b\xf6\x7a\x72\xd1\xd1\x60\x65\xba\x6e\x62\x39\x4a\ +\x9e\x88\xf0\x50\xe8\x4b\xf7\x41\xf1\x43\xc2\xdd\x57\xe5\xa7\xea\ +\x77\x5e\x27\x24\xa4\x0e\x6d\x93\x76\xbd\xf3\x88\x18\xee\x4b\x14\ +\x67\x7a\xd4\xf0\x76\x5f\x84\xc8\xe1\xf5\xf2\x9a\xbd\xf8\xea\xa7\ +\xbf\x50\x2d\xcc\xff\x1a\xa5\x8d\x97\x8c\x85\x10\x82\xd9\xf9\x65\ +\x7c\xee\x2b\xdf\xc6\x4b\x2f\x47\x9b\x76\x73\x64\xff\x10\xee\xbd\ +\x65\x12\x03\xde\xb4\x1b\x0e\x0a\x3a\xc0\x84\x5d\x3a\xf6\x05\x31\ +\x0c\x34\x25\x4a\x75\xf0\x96\x01\xfb\x32\x04\xca\x3a\x48\x99\xac\ +\x28\x11\x50\x3a\x38\x05\xe5\xc6\xfc\x63\x5e\x43\x09\x5a\xd0\x83\ +\x92\xb5\xae\x82\x6b\xc6\x5a\x31\xc1\x17\x11\x70\xec\x7d\x22\xd2\ +\x75\x64\xe2\xd8\xab\xa2\xf8\xc1\x60\xaf\x5f\x98\x55\x15\x4f\x88\ +\x31\x94\xaf\x4a\x38\xb4\x9a\xaa\xc2\xd6\x4a\x6c\xb6\x58\x2d\x66\ +\xd0\xac\xf5\xd5\xae\xf2\x02\xa1\x94\x2c\xbf\xf1\xb9\xef\x57\x96\ +\x2f\xfe\x2a\xb5\xeb\xdf\x40\x84\x69\x37\x5f\xfd\xd3\xef\xe3\x3b\ +\x7f\xf1\x82\xbb\xdb\x8d\x65\x2c\xe0\xc0\x58\x2f\xee\xbf\x75\x0f\ +\xc6\x87\xcc\xbb\x39\x3b\x79\xf0\x0f\xaf\xf8\x8b\xac\x83\x92\x7f\ +\x24\x51\x2a\xf8\xcd\x54\xfb\x5a\xd8\x7c\x62\x40\x4a\x61\x45\x29\ +\x01\xc5\xd6\x91\x1d\xa8\xa9\xb1\xaa\x8c\x7f\xc4\xb3\xe6\x08\x57\ +\x97\x28\xc0\x62\x41\x14\xd4\xd7\x0c\x2b\xbe\xef\x84\xbf\x86\xe2\ +\x65\x57\x5d\x5f\xd1\x32\x16\xef\x93\xde\x74\x10\xee\x97\x08\x45\ +\xae\x3c\x36\x61\xc8\x0f\x1f\x11\xce\x5d\x61\xe9\xf1\x37\x98\xbd\ +\xae\x2d\xc9\xb6\xbe\xeb\x29\x4d\xe4\x6e\xfd\xb4\xca\xcb\xe7\x17\ +\x49\x2a\xfd\x5c\xba\x6b\xb8\x8f\x58\xe9\xa3\xd0\xf8\xe1\x08\x21\ +\xa8\xd5\xeb\xb8\x32\x35\x87\xe2\x66\x11\x7b\x27\xc7\x90\xcb\xe7\ +\x84\x4b\xc4\x3b\x9e\x7b\xf2\x69\x8c\x0f\x76\xa3\x54\x6d\x60\x63\ +\xb3\x0a\xef\x01\xd4\xf9\x37\xb8\x5f\x5f\x2e\xdc\x10\x0f\xfd\xc3\ +\xad\x7a\x01\x4d\x3b\x2a\x87\x42\xca\x00\x03\x15\xa0\xa4\x01\x99\ +\xec\x53\x13\xf5\x4f\x4c\xc2\x8d\xc5\x52\x03\x8b\xaf\x96\x78\x4e\ +\x31\x60\xc5\x96\x2f\x5e\x63\xb1\x72\x82\xbe\x14\xcc\x31\x44\xf1\ +\xe3\x12\x09\x0c\x44\x9d\xb7\x32\x79\x58\x86\xfa\xe6\xdf\x64\x7b\ +\x7d\x54\xad\x1a\x17\x71\x01\x07\xa0\x33\xa0\x22\x9a\xfc\x74\xe1\ +\xed\xfe\x24\xd5\xb5\xa9\x82\x5d\x2d\xfe\x20\xdb\x3b\x51\x27\xa9\ +\xf4\x6d\x00\xd1\x4c\xbb\x21\xb0\x29\xc5\xf4\xec\x22\x96\x96\x57\ +\xb0\x67\x7c\x18\xbd\xbd\xc1\x0d\x65\x5f\x00\x47\x1f\xc8\x67\xd3\ +\x98\x18\xea\x46\xc3\xa6\x58\xdb\x64\xa6\xdd\x28\x7f\x35\x03\xf0\ +\x28\xe1\x24\xe8\xf0\x2f\x55\xb8\x0e\x3f\xe2\x9d\xa9\x71\x5c\x48\ +\xf9\x47\x82\xc5\x02\xc2\x01\x8a\xbb\x7b\x04\x60\xd7\x3b\x8f\xfc\ +\x9f\x68\x86\x79\x5f\x89\x77\x9e\x32\xb0\x88\xaa\xae\x2a\x28\xfb\ +\xdf\x85\xa7\x02\xf2\xb5\xe4\x9f\x03\xe1\x3a\x8b\x69\x54\x20\x62\ +\xca\xd0\x3f\x8c\xba\xfc\x54\x59\xa9\xdf\x73\x75\xde\xe1\xd0\x62\ +\x65\xcf\x48\x0f\x26\x9b\x07\xd5\xd7\x5c\x50\x91\xd0\x82\xc2\xc3\ +\x9b\x16\x16\x54\x71\x01\x23\x86\x37\x0b\x17\x5d\xfa\x56\xc2\x49\ +\xbd\xb8\x54\xad\x6e\x4c\xbf\x98\xeb\xdf\xb7\x60\xa5\x72\x27\x40\ +\x08\xbf\x1e\xb1\x20\x0b\x4b\xab\x98\x9e\x99\xc7\xe8\x48\x3f\x06\ +\x07\x07\xc0\xfd\xc6\x0a\x30\xc8\xa4\x2c\x8c\x0f\x75\x21\x9d\xb2\ +\xb0\xb2\x51\x41\xbd\xe1\x4e\xbb\x69\xd5\x9a\x32\x59\x4c\x2a\xb8\ +\x68\xe3\x88\xd0\x82\xd0\x43\x8a\xb3\x52\xb8\x97\x9c\x1f\x44\xc9\ +\xc1\x89\xb5\x74\x58\x09\xb1\xa2\x02\x35\x26\x0f\xd1\xd2\x22\xfe\ +\x3f\x3c\xb0\x24\x58\xc9\xe7\xc5\xc3\x8a\xbd\x36\xcc\xb5\x56\x5c\ +\x37\xa5\x70\xf7\x5c\x0f\x0c\xb6\x7e\xfc\x49\x68\x13\x09\x84\x62\ +\xef\xb5\x2a\xbd\x9a\x84\xaa\x1f\x24\xf1\x93\x00\xfe\x14\x9a\xc9\ +\x91\x1e\xe9\x54\x9b\x00\x55\x5c\x6b\x28\xec\x38\x72\x78\x1c\x67\ +\x7a\xd4\xca\xc4\x95\xa6\x2b\x1f\x56\xdf\x5a\x61\xa1\xb6\xf8\xda\ +\x1f\x7d\xba\xb6\x39\xff\x1b\x94\xda\x67\x8d\x95\x20\x04\x97\xa7\ +\xe6\xf1\xc7\x5f\xfc\x26\xde\x78\xe3\x6d\x50\xdb\xe6\x7f\xf5\x99\ +\x87\xd1\x9b\x76\x73\xcb\xc1\x61\xdc\x75\x64\x1c\xbd\x5d\x19\x6e\ +\xff\x08\x26\x01\xf7\x10\x1b\x9e\x3b\xfe\x04\x74\x57\x9a\x09\x33\ +\x39\x80\xb9\xe4\x21\x90\x92\xac\x28\xcf\x07\xc5\x96\xe7\x5b\x35\ +\x84\xaf\x07\xf1\xd5\xcd\xfe\x2a\x41\x8f\xcf\x46\xb0\xb4\x98\x34\ +\xea\xba\x0b\x50\x25\xea\x6b\xcb\xc1\x4a\xf9\x84\x08\x90\x8f\x70\ +\x5d\xd5\xf7\x56\xa3\xc2\x9c\x9f\xee\x56\xea\x44\x7f\xfb\x49\x68\ +\x9a\x88\xea\x5b\x2d\x2d\xb3\x24\xca\xf0\x84\x4e\x54\xb4\x5d\xe9\ +\xc3\xc2\x09\x6d\x54\xb1\xf4\xfa\x67\xff\xac\xba\x7a\xf9\xd7\xa9\ +\x5d\xff\x3e\x42\xa6\xdd\x2c\x2e\xaf\xe1\x0b\x5f\xfb\x73\x3c\xf7\ +\xfc\xcb\xa8\x55\x6b\xc6\x1e\x41\x42\x80\xeb\x26\xfb\x71\xef\x2d\ +\x93\x18\xee\xcb\xc9\x85\xb3\x9f\x44\x91\x98\x8d\x64\xde\x26\xe9\ +\x21\x97\xac\x24\xf9\xd7\x5b\x39\xb0\x39\x06\xa4\x3c\x7d\x8e\x23\ +\x22\xa0\x14\x50\xd2\xe2\x49\x3f\x88\x8a\x83\x97\x04\x2d\x01\x58\ +\xb2\xf3\x5f\xb4\x9c\x44\x1d\xd1\x12\x26\xdc\xf9\x2a\x8d\x1a\xed\ +\xd3\xc3\x1f\x8a\xd1\xf2\x91\x21\x53\xf1\x47\x44\xd1\x0b\xa9\x4b\ +\xaf\x7e\xab\xd5\xbf\x62\xb2\xf1\xd6\x71\x5a\x6d\x09\x2f\xda\xb5\ +\xa5\xbb\xae\x80\xc8\xd6\x4f\x8b\xe9\xc3\xf2\xb5\x56\xce\x7e\xed\ +\x95\xd2\xdc\x99\xbf\x4b\x1b\xd5\x2f\x22\x6c\xda\xcd\x66\x09\xdf\ +\xf8\xd6\x0f\xf0\x7f\xbe\xf5\x7d\x14\x37\xe5\xdd\x6e\xc4\x42\x26\ +\x87\xbb\x71\xfa\xd8\xa4\xd2\x61\xa9\x7b\x90\xc3\x5a\x05\x44\x77\ +\x45\x98\x30\xb9\x85\xc1\xbe\xe4\xcd\x41\xca\x8f\x22\x0a\x40\x71\ +\x15\x70\x2d\x2f\xd1\xaa\x62\x41\xa6\x08\x67\xcc\x25\xbf\x4e\x2a\ +\x60\xf1\xd6\x15\x61\xce\xc8\xab\xba\x1a\x56\xe2\xb9\xc8\x56\x6a\ +\xf4\x1f\x02\xd1\xaa\x12\x9b\x59\xc4\xf8\x19\x89\x72\x41\x4d\xa4\ +\xfb\x2e\xdd\x5c\x6d\xb9\x6a\x89\x08\xd0\x50\x91\x7e\xd7\xe3\xbe\ +\x7b\x6d\x11\xcf\x47\xa5\x3a\x2b\x12\x23\x5c\xfb\xde\xed\xa0\x4f\ +\x52\x59\xbb\xb2\x46\x1b\x95\xe7\x32\xbd\xe3\x59\x92\xca\x1c\x83\ +\x61\xda\x4d\xbd\x61\xe3\xea\xcc\x3c\xd6\xd6\xd6\xb1\x77\x72\x14\ +\xdd\xdd\x5d\x4c\x3c\x7f\x3f\x08\x01\xba\x72\x4e\x8f\x60\xad\x6e\ +\x63\xad\x58\xf5\xf5\x62\xf9\xac\x54\x4d\x10\xa2\x09\x67\x2a\x22\ +\xbf\x68\x7c\x59\xb1\x21\xc5\x22\x89\x4d\x23\xc2\x09\xf1\x45\x62\ +\x95\x06\x58\x92\x75\x45\x42\xea\xc9\x9d\x1f\x73\x93\x18\x3d\x19\ +\x5a\x21\x15\x35\xea\x84\x83\x40\x02\x22\x77\x14\x7e\x9d\xd8\x34\ +\x66\x5d\x22\xd7\x97\x49\x32\x39\xdc\x4a\xaf\x5f\xed\x6b\x9a\x91\ +\xe9\xcd\x02\xab\x29\xe3\x43\x07\x2a\x12\x31\x7c\x37\x7d\x12\x00\ +\xa4\xb6\xb9\x50\xaa\x15\x97\x5e\xc8\xf6\x4f\x16\xac\x54\xf6\x36\ +\x10\xa2\x1c\x18\x45\x88\x33\xfd\x60\x76\x7e\x19\x73\xf3\x8b\x98\ +\x18\x1d\x42\xff\x40\x9f\x1f\x17\x5c\x94\xe0\x21\xc9\x66\x2c\x8c\ +\x0f\x76\xc3\x22\x04\xab\x85\x0a\x6c\x9b\x22\x18\x01\x1e\x06\xac\ +\x20\x9c\x1d\xd1\x1c\x19\x60\x42\x3e\xfe\xc9\x93\x26\x21\x45\xd8\ +\xf3\x24\xfe\xb1\xf4\x34\xf9\x63\xaa\xa2\xfd\x71\x49\xc1\x58\x5a\ +\x22\xb0\x14\xd7\x97\xe8\xea\x2b\xd6\x93\x4d\x1b\x24\xe4\xaf\xa7\ +\x5f\xfd\x68\x56\x95\xf2\xc1\x12\xad\x1b\x08\x07\x21\x9f\xcd\x34\ +\xff\x4c\xd0\xd2\xc5\x70\xa0\x62\xaf\x6d\x74\x50\xbd\x6a\x2c\x38\ +\x9a\xb4\x04\xac\x66\x36\x77\xd8\x29\xd2\x34\xd1\xab\x6b\x57\x4b\ +\xcb\x6f\x7c\xe1\x0f\x6a\xc5\xa5\x7f\x0a\x6a\x5f\x0e\x2b\xe8\xdc\ +\x85\x29\x7c\xe6\x0b\xff\x07\x67\xdf\x3e\x0f\xde\x14\xe6\xdf\x5c\ +\x6f\xb7\x9b\x5b\xaf\x1b\xc6\xc9\xc3\xa3\xc8\xe7\xd2\xf0\x97\xb6\ +\x52\x3c\xd4\xe2\xaf\xa6\xf8\x30\x6a\x21\x25\xe8\xab\xba\xcf\x5b\ +\x81\x14\x67\x45\x89\xbd\x7f\x6e\x3d\x82\xa1\x09\x31\x6f\x9a\x0e\ +\x5a\x9c\x85\x25\x5b\x57\x5a\x58\x31\xf1\xd2\x39\x2a\xae\x75\x24\ +\x6b\x4a\xa7\x2b\x9b\x6d\x92\xbe\xfe\x9e\x86\x17\x66\x1e\xfc\xa9\ +\x2a\x91\xa8\xf3\x89\x71\x8a\x3b\x40\x22\x55\x33\xaa\x39\xd7\xf1\ +\x8a\x18\xf4\x5a\x35\x1d\x55\x7a\xa4\x51\x2d\x34\x96\x5e\xff\xe3\ +\x2f\x56\xd6\xa6\x7e\x83\xda\x8d\x57\x8d\x09\x08\xc1\xcc\xdc\x12\ +\x3e\xfb\xa5\x6f\xe2\x47\x2f\xbd\x8e\x46\xc8\xb4\x1b\xcb\x22\xb8\ +\x71\xdf\x00\xee\x39\x32\x8e\xfe\x1e\x77\x21\x3e\xb1\x9a\x66\x6a\ +\x85\x34\x4b\xd4\x79\xe8\x7e\xed\xfd\x50\x0d\xa4\x58\x7f\x14\x6b\ +\x45\xe9\x00\xa5\xab\x52\xd8\x9f\xea\xba\x4a\xeb\x5f\x05\xff\x70\ +\xf5\xd7\xc2\x4a\x79\x29\x08\x5f\x31\x3f\x4e\x03\xfa\x56\xac\x2a\ +\xf1\xbe\xea\x6e\x99\x26\x2f\xb5\xae\x26\x94\x08\x5f\xa5\x7b\xac\ +\xce\xa9\xf3\xfe\xf4\xce\x73\xa3\x9d\xce\xf4\x56\x81\xd4\x6e\xbd\ +\xb0\xf4\x04\xd4\x26\x2b\x6f\x7d\xf9\xb9\xf2\xe2\xdb\x7f\x97\x36\ +\x6a\xdf\x44\xc8\xb4\x9b\xd5\xb5\x02\xbe\xf4\xf5\xef\xe1\xdb\xdf\ +\x79\x1e\xe5\x72\x39\xd4\xc9\xbe\x7f\xac\x07\xf7\x1e\x9d\xc0\xd8\ +\x60\x97\xa4\xa3\xfb\xe5\x95\x1e\x68\x4d\x33\x41\xfd\x63\xcf\xdb\ +\x19\x60\xf3\x34\x40\x8a\x09\x06\x6b\x45\xb1\xe7\xae\xb2\x80\x82\ +\x3f\xcf\xfc\x31\xff\xb1\xdb\xb8\x8b\xd7\x4d\x5e\x8d\x94\xb9\x1a\ +\x3a\x58\x71\xf1\x2c\x90\x00\xfe\xbd\x0e\xf9\x71\x88\x22\x3a\xab\ +\x4a\x09\x0d\xd9\xc2\xd5\x95\x19\x05\x58\xd1\x8c\x3f\xc3\x8f\x5e\ +\x13\xa7\x1b\xf1\x6a\xb4\x4b\x2f\x54\x44\x1f\x55\x2b\x9f\xaa\xb7\ +\x44\x15\xae\x3b\x0e\x0b\xef\xd4\xa7\x55\x59\xb9\xb4\x08\xd0\xe7\ +\x33\xdd\xa3\xfd\x24\x95\x3e\x82\x90\x69\x37\x97\xaf\xce\x62\x73\ +\xb3\x88\x7d\x7b\xc6\x90\xcf\xe7\x99\x78\xe1\x34\x08\xd0\x93\xcf\ +\x60\x6c\xa0\x0b\xe5\x4a\x03\x1b\xa5\x9a\xd3\x14\x24\xc1\x83\x65\ +\x06\x92\x79\xb4\xbb\xf4\xeb\xef\xbf\x2c\x86\x26\x5f\x28\xa4\x64\ +\x2b\x8a\xbf\x06\xec\x79\x06\xb7\x89\x30\x71\x26\x2b\x8a\x7a\x69\ +\x08\x1b\xc6\x3f\x36\x54\xd2\x67\xf4\x28\x11\xe2\x9d\x7f\x28\x13\ +\xc0\xe9\x31\x71\x9e\x65\x1b\x7c\x12\x4d\x38\x5f\x2f\x2e\x1f\xf6\ +\x93\xd1\xd3\xe6\xe1\x7e\x61\xc3\xf5\xba\xf2\xa7\xb6\x6c\x49\x9f\ +\x3a\x9f\x5c\x9c\x13\x30\x39\xd2\x83\x3d\xc3\xf2\x78\xe7\x98\xce\ +\xf4\xce\xdb\x65\x06\x49\x37\x91\x66\xcb\x69\xba\x05\x62\x6d\x4e\ +\xbf\x3c\xdb\x28\xaf\xff\x5e\xdf\xa1\xfb\xe6\x52\xb9\xde\xbf\x0c\ +\xa8\x37\x90\x20\x84\xa0\xd6\xb0\xf1\xfc\x8b\x6f\x62\xa3\x50\xc4\ +\xfb\x9e\x7c\x00\x13\x13\x63\xe0\x17\x5a\x0f\xbe\x51\x4a\xd1\xd7\ +\x9d\xc1\x5d\x47\xc6\xd0\x75\x39\x8d\xf3\x33\xeb\xb0\x6d\xca\xf3\ +\x2c\x2a\xa4\x84\xbc\x8d\x4d\xbd\x10\x48\xc9\xe5\xcb\x56\x14\x7f\ +\xde\x42\x22\x20\xb4\x49\x41\x40\xd0\x9d\x4f\x21\x9d\x62\x60\xa3\ +\x18\xc5\x46\x15\x81\x6c\x58\x00\x84\x80\x3a\xdc\x77\xea\x87\xa8\ +\xc3\xd8\xfc\x68\x90\x96\xba\x8a\xa2\x0e\xf7\xe2\x2b\xc2\xbd\xef\ +\xd4\xff\xce\xe6\x6d\x28\x83\xd2\x90\x78\x27\x9c\x06\x85\x19\xea\ +\x22\x9e\xaf\x3a\x6f\x4a\x29\xba\x73\xc2\x6b\x4e\x82\x74\x6d\x96\ +\xa8\x39\xc7\xae\x41\x33\xa0\xea\xb4\x6c\x17\xe0\xac\xf2\xf2\xf9\ +\x8d\x7a\x79\xf5\xdf\x0f\xde\xf8\xe4\x6c\xba\x6b\xf0\x57\x41\xac\ +\x09\x5d\x05\x29\x80\x37\xde\xba\x80\x42\xa1\x88\xf7\x3f\xfd\x20\ +\xae\xbf\xee\x80\xf6\x74\x28\x75\xb6\xe6\x3a\x71\xfd\x08\xba\x72\ +\x69\x9c\xbd\xb2\x8a\x6a\xdd\x86\x79\xbd\x06\xc3\x95\x11\x9b\x17\ +\x82\x31\xca\xe1\x92\xb5\xda\xb8\x60\x35\x14\x9d\x30\xd1\xd2\x0a\ +\xca\x50\xfb\x44\x78\x90\x7a\x92\x4a\x11\x1c\xd9\xd7\x8f\xd1\xfe\ +\x9c\x12\x50\x00\xb8\x97\x4d\x7c\x76\xa9\x14\x44\xa5\x30\x2a\xa6\ +\xa5\x7c\x12\x0e\x08\x42\xc6\x94\xc9\x84\x4a\x65\x52\xe9\x98\xf2\ +\x19\xb3\x39\x30\x65\xf0\x16\x54\x50\x04\x35\xe6\xcf\x60\x39\x48\ +\xab\x04\x34\x9f\xb9\x0c\x6c\xbe\x0e\x14\x14\x99\x74\x94\x5d\xf1\ +\x76\xb6\xec\x44\x50\x6d\xa7\x90\x7a\x71\xb9\xba\xf4\xfa\x67\xff\ +\xf7\xd0\xd1\x67\x17\x32\xbd\x13\xbf\x41\xac\xd4\x4d\x5a\x65\x42\ +\x70\xe9\xea\x1c\xfe\xf0\xf3\x7f\x8a\x67\x9f\xbc\x1f\xb7\x1e\x3b\ +\x82\x54\x2a\xc5\x2d\xb0\x07\x04\x60\x4b\xa5\x08\x6e\xde\x3f\x88\ +\xee\x5c\x1a\x6f\x5c\x5c\xc6\x66\xb9\x0e\x22\xce\x49\x67\x7d\x33\ +\x10\xad\xa9\x88\xdd\xe4\x2a\x37\x0c\x67\x69\xf1\x90\x82\x11\x52\ +\x3a\x40\x11\x0d\xb4\xc0\xa5\xcf\xa6\x53\xe8\xca\xa6\x95\x56\x93\ +\x27\xfc\xfb\x45\x35\xe1\xc1\x41\x28\xac\x20\x82\x82\x2a\xc0\xa1\ +\x28\x4b\x80\x4f\x78\x1e\x94\xb3\x0d\x7c\xa3\x9a\x52\x09\x8c\xd1\ +\xa1\xa6\x02\x55\xa0\x24\x5e\x2b\xca\x64\xc8\x67\x13\x94\x68\x53\ +\xf1\x1a\xee\x3e\x69\xc6\x47\x15\xd7\x17\xb5\xd3\x7d\x54\xf2\x27\ +\xb5\x51\x5a\x38\x7b\x21\xd3\x3d\xfc\x5a\x2a\xd7\x77\x3d\xb1\x52\ +\xfb\x74\x17\x90\x10\x82\x62\xb1\x8c\x0b\x17\xa7\x90\x49\x11\x4c\ +\x4e\x8e\x21\x9d\x66\xf9\x2f\x4e\x24\x06\x06\x7b\x72\x18\xe8\xcd\ +\x61\xbd\x58\x45\xb9\xda\x60\x1c\xd2\x26\xdf\x14\x1b\x1e\xc5\x37\ +\x65\xf6\x4b\xb1\x23\xa0\x8d\x3e\x2b\xef\x3b\x43\x3c\xcf\x29\xae\ +\x82\x14\xeb\xb9\x4a\x59\x16\x26\x87\xba\xd0\x93\x4f\x45\x7a\x4f\ +\x98\xf5\x56\x15\xe1\x6c\x09\xea\xf7\x4e\x61\x5c\x19\xf2\x81\x02\ +\x26\x8c\x4f\x8c\x86\xe4\xa9\x38\x56\xe5\xa7\x3b\x56\x83\x53\xf8\ +\xce\x5a\x54\x6d\x28\x43\xbc\xba\xbb\xc9\x47\x95\x38\xd3\x0d\x4e\ +\xf6\xf2\xf2\xf9\x59\x92\xca\xbc\x98\xee\x1e\x1e\x23\x56\xfa\x7a\ +\x68\x7a\x49\x09\x21\xa8\x54\x6b\xb8\x78\x79\x06\xd5\x4a\x15\xfb\ +\xf7\x8e\x23\x9b\xcb\xfa\x59\x71\xa0\x72\xff\xed\xed\xce\x60\xa4\ +\x3f\x8f\x62\xa5\xe6\x58\x56\x06\x20\x45\x82\x90\x18\xae\x80\x5d\ +\x24\x1d\xa6\x0e\xc1\x77\x57\x57\x68\x22\xfa\x37\x8a\x1d\x1b\xc5\ +\xfc\x59\x16\xc1\x9e\xe1\x2e\xf4\x76\x65\xe0\x01\xdb\xf4\xb4\xcb\ +\x8e\x7a\x08\x75\x60\xea\xa2\x7a\xda\xf8\x8b\xac\x52\xd0\x07\x91\ +\x90\xac\x94\xfa\xbc\xd9\x1c\xe7\x4d\x26\x51\x22\x15\x85\x37\x4d\ +\x0b\xa5\x8f\xb1\xed\xa0\x8a\x6a\xb7\xc5\xb6\xef\x76\x02\xa8\xc2\ +\xf4\xb6\x13\x60\xa4\xba\x3e\xb5\x6a\xd7\x4a\xcf\x67\x9d\x69\x37\ +\x47\x01\x62\x98\x76\xd3\xc0\x95\xe9\x39\xac\xae\xae\x63\xef\x9e\ +\x31\x74\x77\x77\x2b\x1e\xfc\xe0\x89\xee\xca\xa5\x30\x3e\xd0\x85\ +\x5a\xc3\xc6\x7a\xb1\xe6\xe7\xa3\xb5\xa6\xdc\x7c\x62\x2d\x19\x23\ +\x86\xb3\xf9\xc5\x81\x14\x61\xcf\x01\x10\xc7\x40\xa9\xc4\xb2\x08\ +\xf6\x0c\x75\xa1\x27\x9f\x0e\x32\x8f\x30\x50\x54\xf4\x8b\xf1\x61\ +\xc2\xd3\xa0\x3f\x14\x5b\xaa\x8a\xf8\xf8\x68\x89\x9c\x42\x2c\x2f\ +\xf2\x60\x26\x43\xad\x62\x51\x8a\x84\x46\x13\xbc\x37\x2d\x2a\xdd\ +\xa7\x0e\x4c\x51\xf5\x9a\x05\x98\x2e\x3c\xae\x9e\x55\x2f\x2e\x95\ +\x6a\x85\x85\x17\x33\xfd\x93\x9b\x56\x2a\x77\x1c\x84\xe4\xa1\x10\ +\x42\x88\x3b\xed\x66\x09\xb3\x73\x0b\x98\x1c\x1f\x76\xa6\xdd\x70\ +\x3f\xbc\xc1\x13\x4c\xe0\x4c\xbb\x19\x1b\x70\x80\xb6\x56\xac\xc2\ +\xa6\xd0\x83\x4a\x01\x18\xb3\x35\xa5\x87\x1e\xfb\x22\x19\xb7\xdf\ +\x12\xac\x17\xc2\x46\x32\x17\x4e\x35\x34\x21\x68\xfa\x29\x5c\xa1\ +\x21\xc0\x52\x0f\x10\xe5\x8e\x78\x23\x81\x70\xa1\x0a\xe3\x4a\x49\ +\x2a\x5e\x43\x93\x87\x49\x48\xb3\xa1\x9a\xb2\xa3\xe7\x06\xee\x7e\ +\xab\x4e\x91\x84\x9c\x86\x03\xaa\x4a\x33\xa0\xea\x98\xe5\xa4\x93\ +\xa8\x73\xfd\xb6\xf3\x33\x2a\xc0\xe2\x86\xc7\x01\x1d\x69\x54\x0b\ +\xf5\xf2\xf2\xf9\x57\xb3\xfd\x7b\xa6\xad\x4c\xf7\x31\x42\xc8\x80\ +\xe9\xc2\x2e\xad\xac\xe3\xf2\x95\x19\x0c\x0d\xf4\x61\x64\x64\x88\ +\x71\x8a\x13\xe9\x25\x4a\xa7\x2c\x8c\x0c\xe4\x91\x4b\xa7\xb0\xba\ +\x59\x45\xbd\x41\x83\xc1\x91\x40\x04\x6b\xa9\xf5\x66\xa1\x0e\x52\ +\xa2\x15\x25\x8f\x22\xf7\x92\x11\xe9\xcf\xb1\xa8\xba\xd1\x93\xcf\ +\x08\x97\x95\xbd\xc2\xc4\x05\x3c\x85\x6d\xdb\x4e\x37\xbb\xf7\x67\ +\x53\xd8\x94\x82\xd2\x20\xdc\xb6\x99\x78\x37\xdc\x0f\x73\x3f\x6d\ +\x4f\xdf\x3f\x66\xf4\x6d\xf6\xd8\x2b\xc3\xd6\x97\x29\x96\xc7\x1d\ +\x7b\x65\xf3\xe9\xa9\x26\xbd\x4d\x29\xa8\x74\x8e\xc2\xb1\x70\x6e\ +\xd1\xe2\xa2\xd5\xd5\xd3\x83\x7b\x4c\x28\x50\x2c\x16\xf1\xfa\x99\ +\x73\xad\x5a\x54\x9d\x70\xd5\x73\x79\xee\x86\x5e\x3f\x7e\x80\x52\ +\xf3\xe1\x61\x7a\x61\xf9\x11\xbb\x5a\x6c\x2c\xbf\xf1\xf9\x2f\x0d\ +\x1e\x79\x7a\x31\x3b\xb0\xff\x37\x88\x95\x3e\xae\xcb\x9c\x10\x82\ +\xe9\xb9\x25\x7c\xe6\x0b\xff\x07\xcf\x3c\xbe\x89\x3b\xef\xb8\xd5\ +\x71\xb2\x53\x75\x01\x29\xe2\x6c\x29\xdf\x95\x4b\xe3\xf5\x8b\xcb\ +\xd8\x28\xd5\xc0\x9b\x3d\x10\x8e\xe5\xaa\xf2\x2a\xd1\x47\xbb\x83\ +\x8d\xd5\x40\x8a\x9f\x43\x28\xa4\x91\x2a\xa1\xae\x32\x40\xfc\x5e\ +\x2a\xc7\x82\xac\x61\x6a\x69\x13\x73\xd3\xd3\x98\x9f\xba\x8a\x4a\ +\xb9\xe2\xbc\x40\xc2\xb5\x89\xf5\x1e\x50\xe3\xa1\x3a\x01\x0d\xcd\ +\x26\x96\x88\x43\x08\xa2\xd6\x37\x52\x5d\xc3\x42\x43\x33\x09\x7a\ +\x1a\x09\x21\x28\x57\xaa\x28\x16\x4b\xc6\x29\x61\x3b\x41\x3c\x50\ +\x85\xbd\xb4\xad\x42\x41\x27\xad\xa6\xef\x44\x59\xc6\x73\xa5\xd4\ +\xc6\xca\xd9\xaf\x3d\xd7\x7f\xdd\x83\xbf\xd9\x35\x76\xe4\xef\x91\ +\x54\xf6\x41\x18\x9c\xec\xab\x6b\x05\x7c\xf1\x6b\xdf\xc1\xda\x7a\ +\x01\x0f\xdd\x7f\x17\xba\xba\xbb\xf8\xae\x7a\xa1\xa4\xbd\x23\xdd\ +\xc8\x65\x53\x78\xfd\xe2\x0a\x96\xd6\xcb\x7c\x7e\xaa\x4f\xc2\xc2\ +\x83\x84\x28\xab\xcf\x2c\x00\x17\x93\xd8\x08\x29\xf5\xc0\x51\x39\ +\x63\x59\x87\xd0\x20\xff\x42\xb9\x86\x6f\x7f\xef\x25\xbc\xf9\xd2\ +\x4b\x28\x97\x8a\x11\x6e\xcd\x7b\x45\xb6\x10\x1a\x04\xce\x32\xda\ +\x66\x69\xc7\x00\x07\x1a\x31\x5c\x79\xac\x5a\x33\xbd\x9d\xcd\xb1\ +\x30\x7f\x50\xdc\xf4\x3b\xe6\xb3\xb2\x7a\x79\x91\xda\xf5\x1f\x66\ +\x7a\xc6\xfa\x49\x2a\x73\x23\x4c\xd3\x6e\x6a\x75\x5c\xba\x32\x83\ +\xcd\x62\x11\xfb\xf6\x8e\x23\x9f\xcf\x33\x2f\xba\x60\x95\x10\xa0\ +\x3b\x9f\xc1\x68\x7f\x1e\xe5\x6a\x03\x85\x52\xdd\x57\x33\x35\xfb\ +\x62\x4f\xb9\xd1\x36\xf9\xe4\x75\xad\x82\xef\x6e\xbc\x70\x77\x88\ +\x1b\x2a\xfe\x97\xb2\x88\xec\xa3\x72\xd3\x59\x84\x60\x61\x71\x0d\ +\xdf\xf8\x93\x6f\x61\xb3\xb0\x01\xcb\xb2\xf8\x55\x19\x92\xbf\x2d\ +\xfb\x33\x88\xa9\xe9\xd7\x2c\x78\xe2\xea\x01\x68\x1e\x54\x71\x3f\ +\x75\x60\x8a\xaa\xd7\xe9\xf0\x66\xd2\x5b\xb5\xc2\xfc\x46\xbd\xbc\ +\xfa\x42\xb6\x6f\x82\x5a\xe9\xec\x2d\x00\xc9\xaa\x2e\x32\x21\x04\ +\x0d\x4a\x31\x35\x3d\x8f\xc5\xa5\x15\xec\x99\x18\x41\x5f\x5f\xaf\ +\x17\xc9\x15\xe2\xf9\x93\x72\x99\x14\xc6\x06\xf3\x68\xd8\xc0\x7a\ +\xb1\xea\xce\x11\x94\xe1\xd3\x54\x0f\xa0\x90\x87\x12\x60\x6c\xdd\ +\x18\x3f\x14\x6b\xb8\x79\x80\xf2\x9d\x69\xc2\x5f\xe0\xa3\x92\x3d\ +\x0c\xc4\xb2\x70\xf9\xca\x34\x9e\xff\xe1\x2b\xb0\x6d\xed\x5c\xf0\ +\x44\xb6\x57\x28\xb5\x6b\x5f\x16\xd6\xa3\x6a\x37\xa0\x22\x89\x69\ +\x17\x9a\x6d\xb7\x5a\x76\xc1\x27\x69\x94\xd7\x2a\xd5\xb5\xab\x2f\ +\x67\xfa\x26\x97\x53\x99\xfc\xad\x20\x44\xb5\x1e\xb1\x9f\x68\x7e\ +\x61\x05\x57\xa7\xe7\x30\x36\x32\x80\xa1\xa1\x01\xa5\xef\xc7\xc3\ +\x49\x26\x65\x61\x74\x20\x8f\x54\x8a\x60\x6d\xb3\x86\x86\x4d\x61\ +\xb9\xe6\x93\x0c\x22\x3d\xa8\xa2\x0d\x22\xd5\xe8\x88\xf9\xb0\x75\ +\xf4\xbd\xfd\x4a\x4e\xf9\x16\x55\xaf\x0a\x54\x84\xe0\xf2\x95\x69\ +\xbc\xfc\xea\xdb\x09\xa8\x76\xae\x14\x1a\xd5\xcd\xff\x52\x9c\x7b\ +\xfd\x12\xf4\xed\xd1\x8e\x3b\xd2\x81\x78\xa0\x6a\x57\x78\xb3\x7a\ +\xcd\x7e\x46\xad\x9f\x98\x36\x72\x7a\xbb\x5e\x6e\x94\x97\xde\x39\ +\x93\xe9\x1d\xbf\x98\xca\xf6\x1e\x25\xc4\x1a\xd6\xdd\x01\xcf\x6f\ +\x75\xe1\xd2\x34\xfa\xfb\xba\x31\x3e\x36\x02\xcb\xb2\xb8\x9c\xd9\ +\xee\x71\x8b\x10\x0c\xf7\xe5\xd1\x9d\x4b\x63\xad\x58\x45\xad\x61\ +\x33\xc3\x12\x54\x40\x8a\xdf\xec\xd3\x35\xf9\xb8\xe6\x9e\x64\x45\ +\x09\x17\x46\x31\x3e\xc1\xf2\x9a\x7e\xb9\x8c\x0f\x51\xd6\xa2\x9b\ +\x9a\x9e\xc7\xcb\xaf\x25\xa0\xda\xb1\x42\xed\x57\x2a\x2b\x97\xfe\ +\x53\x65\xe5\xe2\x26\xf4\xa0\xe2\x52\xb4\x29\x5c\x92\x9d\xb8\x01\ +\x69\xa7\x9a\x73\x9d\xfd\xa4\x36\xca\x8b\xe7\x2e\xa4\xf3\xfd\x6f\ +\xa4\xf3\x03\xd7\x13\x2b\xb5\x57\x77\xd1\x09\x21\xd8\x2c\x96\x71\ +\xde\x9d\x76\xb3\x77\x0f\x3f\xed\x86\x88\x4d\x2c\x02\x0c\xf4\xe4\ +\x30\xd0\x93\xc5\x7a\xb1\x86\x4a\xad\xe1\x9c\x38\x51\x59\x51\xe6\ +\x66\x5f\xac\xa5\x8c\x85\xe6\x5e\x00\x24\x19\x50\x7a\x8b\xca\x6b\ +\xfa\x11\x3e\x6d\x02\xaa\x9d\x2d\xd4\x7e\xbd\x51\xd9\xf8\x9d\xe5\ +\x33\x5f\x7a\x83\x0d\x15\x3e\xa1\x39\x46\x88\x5e\xdc\xf0\x8e\x0c\ +\x4f\x68\xf7\xb0\x81\x76\xe5\x1b\xa5\x2c\x7f\x5a\x69\x73\x9f\x94\ +\xac\xbd\xfb\xcd\x57\x1a\x95\x8d\x7f\xd8\x3d\x79\xfc\x6f\x5b\xe9\ +\xfc\x93\xba\x6b\x4c\x08\xc1\x46\xa1\x88\xaf\x7c\xe3\x2f\xb0\xb6\ +\x5e\xc0\x13\x8f\xde\x8b\x9e\xde\x1e\x7d\xaf\x36\x01\xc6\x07\xf3\ +\xb8\xeb\xa6\x51\xbc\x71\x69\x05\xf3\x6b\x25\xa6\xf2\xfa\xd3\xf7\ +\xe2\xcd\x17\x88\x30\xc8\x25\x72\x3a\xc2\x97\xc3\x59\x5a\x72\x61\ +\x21\x42\xb8\xe2\xf4\x77\x86\x56\xec\x7a\xe9\x79\x6a\xd7\xd7\x0c\ +\xda\xaa\xd9\x6c\x72\x18\x31\xe9\x1b\xd2\x09\x69\x18\x4b\xd7\x38\ +\xd5\x50\x28\x54\x93\x2f\x11\xa7\x36\x1a\xca\x27\x9a\x70\xe1\xfe\ +\x13\x13\x40\x88\x26\x9c\xad\x12\x01\x28\xad\x51\x6a\x5f\xa9\x17\ +\x97\xbf\xba\xfc\xe6\xe7\xdf\x84\x59\xda\xea\x87\x32\x89\x0e\x54\ +\xe2\x8b\x28\x86\xeb\xf4\x9b\x0d\x6f\xb6\xbc\x56\x41\x13\x56\x4e\ +\x9c\x73\xf1\xc7\x5b\x15\xae\xbe\x70\xa9\x51\x5e\xff\x9d\xde\x83\ +\xa7\xe6\x53\xd9\x9e\x4f\x00\xfa\x91\xec\x95\x6a\x0d\xdf\xfe\x8b\ +\x97\xb0\xbe\xb1\x89\x67\x9f\x7e\x10\xa3\x23\xc3\xd2\xea\x0b\xde\ +\x01\xa5\xc0\x40\x4f\x06\x77\x1c\x1e\xc1\x99\x2b\xab\xb8\xba\x58\ +\xe4\x67\xe5\x33\x15\x0c\x9f\x1e\x42\x14\x69\x98\x4f\xc2\x02\x29\ +\x08\x50\x42\x4a\x6c\xb2\x32\xe7\xe7\x59\x57\xd2\x93\x1b\x52\x3d\ +\x0a\xbb\x50\x5a\x78\xfb\xbf\x17\xae\xfe\xf0\x0c\xb1\xd2\x96\x1f\ +\xac\x7e\xe1\x54\xbf\xc8\xd4\xa0\xe7\xbe\xd4\x24\x4c\x4f\x11\x47\ +\xa8\x51\x97\x98\x75\x09\x7f\x1e\x62\x1a\x31\x9d\x90\x3f\x97\x46\ +\x2a\x83\x78\xf1\x7c\x1d\xdc\x30\xb1\x2e\x41\x5e\xc4\x89\xa3\x00\ +\x81\xdd\xa8\xd9\x8d\xf2\x6a\xd5\xd5\xb5\x14\xb7\xae\x5d\xcd\xbb\ +\xa8\x56\x15\x00\x19\x54\xed\x02\x4b\xbb\x40\x14\x96\x3e\x2c\x9f\ +\x38\xe7\x16\x17\x6a\x6c\xb8\xa8\x63\x95\x16\xdf\x5e\x6a\x54\xd6\ +\xff\x5d\xff\x0d\x8f\xcc\xa7\xf3\x83\xbf\x08\x42\x06\x55\x95\x22\ +\x84\xc0\xb6\x29\x5e\x7c\xe5\x2c\xd6\x37\x36\xf1\xa1\x67\x1f\xc6\ +\x81\x03\x7c\xab\x91\x2b\x9c\x02\xdd\xb9\x14\x6e\xbb\x6e\x18\x5d\ +\xb9\x34\xce\xcf\x6e\x38\x5b\xca\xb3\x9a\x9a\x06\xaa\xb4\x9c\xb1\ +\xa4\xc7\x39\xa9\x98\xf2\x35\x90\x52\xf8\xd4\x74\xc2\x5e\x28\x3f\ +\x84\x28\x11\xc6\x9c\xac\x5d\xa7\x76\xa3\x4e\xed\x86\xf8\xc2\x44\ +\x07\x52\x6c\x10\x45\x8a\xf3\xbe\xc7\xc9\x27\xee\xa7\x58\x46\x3b\ +\xf3\x0e\xfb\x4c\x41\xbe\x31\xed\x6a\xc6\x35\x05\x3e\xd5\xd8\x1f\ +\xc9\x59\x2c\x84\xb7\xeb\x53\xcc\x5f\xd4\x09\xab\x47\x98\x7e\x3b\ +\xea\xd6\xca\xa7\xd5\xa8\x16\x6a\xe5\xe5\xf3\xaf\x65\xfa\x26\x67\ +\xad\x6c\xf7\x2d\x84\x90\x7e\x18\x64\x69\x79\x0d\x17\x2f\xcf\x60\ +\x64\xb0\x1f\xa3\xa3\xea\x69\x37\x9e\xa4\x52\x16\x46\xfa\x73\xc8\ +\xa5\x2d\xac\x15\x6b\xce\xb4\x1b\x4b\xdd\x1b\x18\x67\xee\xa0\x17\ +\xcf\x39\xcc\x85\x21\x0b\x6c\x19\xbe\x1e\xe3\xb7\xf2\xfe\x2c\x22\ +\x8f\xa3\x0a\x98\xe8\xfa\xa8\x5e\x3d\xeb\xac\x78\x2a\x4b\xa9\xb6\ +\x31\xf7\x8d\xea\xfa\xd4\xa2\x10\x1e\x05\x58\xa6\xf8\x08\xcd\x36\ +\x65\x5c\x58\x59\x9d\x92\x66\xdd\x1a\xa6\xb4\x44\x13\x2f\xfe\x9e\ +\xc4\x1a\xeb\xd4\x06\xd1\xe6\xaf\x5b\xfa\x4f\xf5\xf2\x6d\x05\x20\ +\x3a\xfd\xb9\xe5\x79\x50\xbb\x6e\x97\x17\xdf\x79\x27\xdd\x3d\xfc\ +\x76\x2a\xd7\x77\x13\x21\xd6\xb8\xee\x66\x78\x7e\xab\x77\x2f\x5c\ +\x45\x77\x3e\x8b\x3d\x93\x63\x48\xa5\x52\x52\xe9\x3e\x30\x08\xc1\ +\x60\x6f\x0e\x7d\xf9\x0c\xd6\x4b\x35\x54\x6b\x0d\xc6\xc1\x6e\x02\ +\x91\x0c\x24\x1e\x42\xd1\x57\x62\x60\x01\x15\x10\xcb\xf9\x4c\x59\ +\x04\x13\x83\x79\x77\xae\x5f\x70\x0e\x04\x51\x40\x45\x4b\xb5\xc2\ +\xdc\x9f\x54\xd7\xa6\x16\xc4\x08\xc3\x71\xfc\x26\x60\x73\x96\x54\ +\xdc\x38\x53\x1a\x9d\xb4\x33\x8f\xb0\xbc\xa3\xea\xb7\x7a\x9e\x51\ +\xcb\x35\x0e\x4f\x60\x65\xab\xc1\xb1\x95\x10\x14\xf3\x6e\xa6\x8c\ +\x98\xe5\x52\x94\x97\xde\xbd\x92\xca\x74\xbd\x9a\xee\x1a\xda\x47\ +\xac\xd4\x01\x21\xaf\x20\x53\x42\x50\x2a\x57\xf0\xee\xc5\xab\xa0\ +\xb6\x8d\xfd\x7b\xc7\x91\xc9\x66\x04\x9d\x20\x7b\x02\xa0\xb7\x3b\ +\x83\xc1\xde\x1c\x36\xcb\x75\x94\xaa\x0d\x84\x0f\x4b\x68\x61\x28\ +\x83\x5b\xa8\x38\xc9\x19\xde\x24\x6a\x0f\x5c\xc4\xb1\xa8\x26\x06\ +\xbb\x82\x5e\x3f\xe6\xaa\x58\x84\xe0\x6a\x38\xa8\xbe\xae\x00\x15\ +\x10\xdd\xaa\x6a\x67\x53\x30\xae\x7e\xd4\xa6\x5d\x54\xdd\xb0\xf3\ +\x6f\x47\x53\x33\x4a\x78\x33\xd2\xb2\xd3\x3d\x0c\x54\xec\xf7\x9d\ +\x6a\x55\x89\x75\x68\xa5\x2e\x9d\xd2\x25\x00\x48\x65\xf5\xca\x02\ +\xb5\x6b\x2f\x64\x7a\x46\x07\x48\x2a\x73\x18\x21\xd3\x6e\x2e\x5e\ +\x9e\xc6\xe6\x66\x11\x07\xf6\x4d\xf8\xbb\xdd\x10\xfe\x1f\xff\x6b\ +\x77\x2e\x8d\x91\xbe\x3c\xca\xb5\x06\x0a\xe5\x60\xda\x8d\x79\x58\ +\x82\xb9\xd9\x17\x75\x25\x06\x45\xcb\x14\x80\x3b\x3c\x61\x90\x6d\ +\xfa\x31\x56\x98\x6f\x51\xe9\x86\x27\xd0\x62\xad\x30\xff\x27\xd5\ +\xb5\xab\x0b\xcc\x75\x8c\x0b\x28\xf6\xfb\x56\x5a\x5e\xed\x86\x54\ +\x54\xa8\xb4\x02\x84\xed\xb6\xa6\x8c\x75\x34\xad\xfa\xbe\x93\x81\ +\xd2\x2c\x4c\xda\x0d\xa4\xb8\x75\x22\xb5\xc2\xfc\x46\xbd\xb4\xfa\ +\x42\xb6\x77\x02\x51\xa6\xdd\x5c\x9d\x9e\xc7\xfc\xc2\x32\xf6\xee\ +\x19\x95\xa6\xdd\xf8\x99\xbb\x87\xd9\x4c\x0a\xa3\xfd\x39\xd8\x94\ +\x62\xa3\x58\x83\xed\xe6\x13\x06\xaa\xa6\x9a\x7d\x62\xb8\x17\xc7\ +\xcc\x21\xb3\x08\xc1\xc4\x50\x1e\x3d\xee\x2e\x28\x84\xfd\xd7\x8a\ +\x02\xaa\xb9\xaf\x47\x04\x95\x29\xae\x5d\x8e\xf7\xa8\x61\xad\x40\ +\x4a\x25\xcd\x00\x20\x2e\xd8\xda\x61\xd9\x85\xd5\xbf\xa5\xf0\x28\ +\xa0\x62\xbf\x6f\x95\xf5\x24\x96\xd5\xc9\x26\x60\xab\xba\x61\x71\ +\xa2\x58\xce\xb4\x9b\x2b\x2f\x67\xfa\xf6\xac\x44\x99\x76\x33\xb7\ +\xb0\x8c\x2b\x53\xb3\x18\x1f\x1d\xc2\xf0\xf0\x00\x97\x3d\x6b\x61\ +\x11\x38\xd3\x6e\x46\xfa\xf3\x48\xa7\x1c\x27\xbb\x6d\x53\xb7\x49\ +\x26\x83\x4a\x02\x8e\xc2\xca\x92\xe1\xc4\x5b\x53\x41\xcf\xa1\x3f\ +\x4c\xd5\x97\xc0\x47\x25\x2f\x6f\x13\xcd\xa2\x32\x82\x0a\x8a\xb0\ +\x76\x36\x03\x55\x61\xdb\x15\x17\xc7\xa1\xdf\x49\xf8\xb4\x0b\x80\ +\x61\xf9\x49\x12\xb6\x8f\xce\x4e\x04\x8d\x18\xb6\x13\x9a\x7a\xb1\ +\xe3\xec\x7a\xb9\x5e\x5e\x7a\xe7\xcd\x4c\xef\xc4\xc5\x54\xb6\x27\ +\xd2\xb4\x9b\xf3\x17\xaf\xa2\xbf\xb7\x1b\x13\xe3\xc1\xb4\x1b\x11\ +\x54\x70\x7d\x43\x43\x7d\x39\x74\x65\x53\x58\x2f\x56\x51\x73\x17\ +\xe2\xf3\xf2\x72\x3e\x19\xe8\x28\x21\x86\x18\x56\x16\x3b\xd9\x39\ +\xf8\x73\x7c\x54\x79\x45\xaf\x1f\x89\xda\xf4\xfb\x7a\x75\xed\xea\ +\xbc\x70\x2d\x81\xd6\x9a\x80\xba\xef\x71\x9a\x55\x3b\x05\x52\xed\ +\x00\x43\xab\xf0\x81\x26\x9d\x49\x62\xa7\x8d\x0a\x2a\xf6\xfb\x56\ +\x35\xd3\x5a\xc9\xa3\x53\xcd\xb7\xf6\xc6\x51\x1b\xe5\xc5\xb7\x2f\ +\xa4\xf3\x03\x91\xa7\xdd\x9c\xbb\x70\x15\xe9\x94\x85\x7d\x7b\xc7\ +\x91\x49\xa7\x99\x12\xf8\xb1\x4d\x16\x01\xfa\xbb\xb3\xe8\xef\xce\ +\xa0\x50\xaa\xa3\x5c\xb3\xfd\x26\xa0\x0f\x9d\x98\xab\x31\x44\x5f\ +\x32\xc6\xf9\x4b\xb9\x4d\x3f\x7f\x03\x4c\xc2\x9f\x4f\x28\xa8\x36\ +\xe7\xbf\xe6\x5a\x54\x52\x64\x8c\xe3\x56\x9b\x84\xdb\x09\xb0\x56\ +\x9a\x8d\xed\xb4\xbe\x4c\xd2\x6e\x2b\x4b\x29\x51\x76\x26\x8c\x0b\ +\x81\x4e\x5a\x4f\x9d\xca\xab\x93\xf9\x88\xdf\xa5\xeb\x5b\x59\xb9\ +\x38\x43\xac\xd4\x8b\xe9\xee\xe1\xf1\x28\xbb\xdd\x9c\xbf\x38\x85\ +\x6a\xa5\x82\x03\xfb\x26\x90\xcb\x65\xfd\x22\x58\x50\x79\xd0\xe8\ +\xc9\xa5\x31\xd4\x97\x43\xa9\xd2\x40\xb1\x52\x0f\xed\xf1\x0b\x05\ +\x95\xc6\x9a\xe2\x7a\x22\xdd\xa7\xc0\xb2\xdc\x5e\xbf\x1c\xbf\x5d\ +\x96\x97\x57\xb8\x45\xb5\xf0\xf5\xea\xda\x95\x79\x55\x64\x48\x58\ +\x27\xac\xac\xa8\xcd\xb0\xed\x82\x54\x27\x81\xd1\xa9\xa6\x5d\x14\ +\x98\x02\x88\x06\x2a\x60\x7b\x9b\x69\xad\x94\xdf\x09\x5f\x53\x94\ +\xb8\x30\x7d\x51\x8f\x54\xd7\xa7\x57\xed\x6a\xf1\x87\x99\xde\xb1\ +\x9c\x95\xca\xdc\x0c\x10\xed\x1c\xc1\x7a\xc3\xc6\xa5\xab\xb3\x58\ +\x59\x5d\xc7\xfe\xbd\xe3\xe8\xe9\xe9\x0e\x32\x15\x40\x05\x38\xbb\ +\x34\x8f\xf4\xe7\x50\x6f\x50\x6c\x94\x6a\xee\x32\xb4\x31\x41\x15\ +\xd7\xca\x02\xd3\xf4\xcb\xa5\xa5\xa7\x30\x62\xd3\xef\x6b\x1a\x50\ +\xf9\x4a\x9a\xef\x61\xc7\xed\x72\xa0\xab\xe2\x77\x92\xdf\xab\x9d\ +\x8e\xfe\x66\x9a\x93\x88\xa0\x6b\xd2\xf7\x25\x2e\xa8\xd8\xef\x5b\ +\x69\x2d\x79\xdf\xdb\x01\xb1\x76\xc6\xb5\xa2\x2f\xc6\x93\x7a\x71\ +\xa9\x58\x2b\xcc\xbf\x98\xed\x9b\x2c\x59\xe9\xfc\xad\xd0\xee\x76\ +\x03\x50\x0a\x4c\xcf\x2e\x62\x7a\x66\x01\x7b\x26\x86\x31\x38\xd8\ +\xcf\xe5\xc8\x82\x0a\x00\xb2\x69\x0b\xc3\xfd\x39\x10\x42\xb0\x5e\ +\xac\xb9\xbb\xdd\x44\x03\x15\x3b\x88\x34\x1a\xa8\x82\xa6\xdf\x78\ +\x2b\xa0\xda\x5c\xf8\x6a\x75\xf5\x0a\xeb\xa3\x8a\x03\x23\xf1\x38\ +\x4a\x5c\x33\xcd\xbc\xb0\xf8\xed\x02\x58\x2b\x4d\xc4\xed\x74\xe6\ +\x2b\x25\xce\xa6\xf4\x3b\xc5\xf2\xd9\x0d\xb0\x12\xbf\x9b\xf4\xb8\ +\x78\xbb\x5a\xa8\x95\x97\x2f\xbc\x9a\xed\xdb\x33\x9b\xca\x76\x1f\ +\x43\xc8\xb4\x9b\xc5\xe5\x35\x5c\xbc\x34\x8d\xe1\xa1\x3e\x8c\x8f\ +\x0d\x7b\xc4\x90\x40\x05\xe2\xf4\xc2\x0d\xf7\xe5\x90\xcb\x58\x58\ +\xf7\xa6\xdd\x10\xc1\x6f\xd5\x02\xa8\x58\xe7\xbc\xe7\x4c\xdf\x62\ +\x50\x45\xd1\x69\x15\x50\x61\xf1\xad\x58\x68\x5b\x01\xa9\x66\x9b\ +\x69\x51\xce\xbf\x15\x1f\x97\x51\xe2\x80\x0a\xd8\x39\x96\xcf\x4e\ +\x81\x95\xf8\x1d\x11\xd3\x98\xc2\x40\xed\x9a\x5d\x5e\x7c\xe7\x6c\ +\xa6\x67\xf4\x9d\x54\xae\xf7\x08\x21\xd6\x18\x34\x42\x08\xc1\x7a\ +\xa1\x88\x73\x17\xae\xa2\x2b\x97\xc5\x5e\x76\xda\x0d\x93\x3d\xeb\ +\x97\x1a\xe8\xcd\xa2\xd7\x9d\x76\x53\xab\xdb\x1d\xb2\xa8\x1c\x87\ +\x7e\x87\x41\x05\x4d\x78\x33\xcd\x3e\xf6\xb8\xd9\x66\x4e\x5c\x80\ +\x45\x4d\xd3\x29\x48\xed\x14\x4b\x2d\x54\x9a\x05\x15\xfb\x7d\xbb\ +\x60\xd2\xee\xfc\x11\x12\x16\xe5\x1a\x44\x29\x23\x4a\x79\x04\xa0\ +\x28\x2f\x9d\xbb\x92\xca\x74\xbf\x92\xee\x1a\x3c\x40\xac\xd4\x7e\ +\x5d\xbd\xbc\x69\x37\xe7\x2e\x5c\x81\x6d\x37\xb0\x7f\xdf\x04\xb2\ +\xca\x69\x37\x4e\xd6\x84\x00\xbd\xf9\x34\x06\x7b\xb2\xd8\x2c\x3b\ +\x3d\x82\x9e\x4e\x5c\x1f\x95\xe8\x4c\x67\xc6\xa2\x82\xb4\xe0\xa3\ +\x22\xa0\xc5\xfa\xe6\xe2\x57\x2a\xab\x97\xc3\x86\x27\xa8\x8e\xc5\ +\xb0\x76\x37\x01\xa3\x7c\xef\x54\xd3\xd0\x94\x76\x3b\x21\xd5\xac\ +\x75\x1a\x49\xe2\x82\x0a\x68\x2f\x78\x5a\xb5\x6e\xe2\x5a\x42\xba\ +\x73\x69\x87\x1f\x4a\x57\x56\x14\xff\x94\x2e\x3d\xa9\xac\x5e\x5e\ +\x00\xb5\x7f\x98\xe9\x19\x1d\x8c\xb2\xdb\xcd\x85\x4b\x33\x28\x14\ +\x36\x71\x60\xff\x04\xba\xba\xf2\x4c\x7c\x50\x84\xf7\xbd\x2b\x9b\ +\xc2\x70\x5f\x0e\x95\x9a\x8d\xcd\x72\x5d\xdb\xf4\x33\xf7\xfa\x09\ +\xba\xc1\x17\xc6\x99\x9e\x92\x9e\xe8\x48\x16\x55\x31\x32\xa8\x54\ +\xe1\x51\xad\xac\x56\x20\xd6\x4c\xbc\x4a\xb7\x59\xa8\xb5\xdb\xfa\ +\x0a\x8b\x6b\x35\xff\x28\x3e\x2e\xa5\x34\x03\x2a\x60\xeb\x9b\x7a\ +\x5b\x91\x4f\xd4\x38\xd3\x75\xd0\xe9\x45\x89\xd7\xe6\x5b\x2b\xcc\ +\x6d\xd4\xcb\x6b\x3f\x74\x77\xbb\x39\x06\xc3\xb4\x1b\x9b\x52\x5c\ +\x99\x9e\xc3\xfc\xc2\x12\xf6\xef\x19\xf3\xa7\xdd\x70\xa0\x62\x4a\ +\xc8\x66\x2c\x8c\xf4\xe5\x9d\x69\x37\xa5\xba\x0b\x11\x9d\xf5\xe4\ +\x84\x9b\xc7\x51\x05\x99\x3b\xa0\xca\x05\xe3\xa8\x84\xba\x86\x80\ +\x6a\xb3\xa6\xb7\xa8\x7c\xa5\x16\x8e\xe3\x34\x01\xa3\xe8\x34\xf3\ +\x42\x87\xc5\x6f\x65\x13\x31\x6a\x9c\x28\xad\x34\x05\x23\x4b\xb3\ +\xa0\x02\x76\x96\xdf\xa8\x5d\x3a\xe2\x77\xc4\x4c\x1b\x96\x06\x86\ +\x30\x53\x3e\xa4\x51\x5e\x2d\x57\xd7\xae\xbe\x94\xed\xdf\xb3\xe2\ +\xf6\x08\xf6\xc0\x20\x73\xf3\xcb\xb8\x7c\xc5\x99\x76\x33\x32\x32\ +\x28\x15\xc3\x36\xd1\xd2\x29\x0b\xc3\x7d\x39\xa4\x2c\x82\xf5\x62\ +\x1d\x0d\x77\xda\x4d\xb3\xcb\xbe\x78\x62\x11\x60\x7c\x80\x19\x99\ +\xce\x3c\x9e\xd1\x7c\x54\x1c\xa8\x9a\x71\x9c\x8b\x61\x71\xad\x27\ +\x93\x5e\x1c\xcb\x4a\x15\xde\x69\x80\x6d\x87\x45\x16\xe7\x3a\xc4\ +\x92\x56\x40\x05\xec\x0c\x58\x45\xa9\x4f\x54\x9d\x76\xc3\x2c\x4a\ +\xba\xc8\x69\xed\x7a\xb9\x5e\x5a\x7a\xf7\x8d\x6c\xdf\xe4\x25\x67\ +\x21\x3e\x6b\x08\xba\x0c\x09\xc1\xca\xda\x06\xde\xbd\x70\x15\x03\ +\x7d\xdd\x98\x98\xf0\xa6\xdd\x50\x48\xbe\x24\x38\x83\x33\x07\x7b\ +\x72\xe8\xca\xa5\xb0\x51\xaa\xa1\x56\xa7\x4d\xcc\xf5\xe3\x85\x1d\ +\x47\xe5\x3d\x9e\xd4\xfd\x37\x1a\xa8\x96\xbe\x5c\x59\xbd\x14\x07\ +\x54\xaa\xf0\xb0\x5f\xf2\x38\x4d\xb5\x56\xbe\xb7\xcb\x01\xdf\x6e\ +\x20\xb5\x9a\x67\xb3\xf5\x88\x25\xad\x82\x0a\xd8\x39\xb0\x6a\xd5\ +\x6f\xd5\xae\xe6\x5e\xbb\xbe\xab\xc5\x6e\xd0\xd2\xc2\xd9\x77\x33\ +\xdd\xc3\x6f\xa4\xf2\x7d\x37\x10\x12\x36\xed\xa6\x84\x77\xde\xbd\ +\x82\x74\xca\xc2\xfe\xbd\xe3\xfe\x6e\x37\x22\xa8\x3c\x87\x79\x5f\ +\x57\x06\xfd\x5d\x59\x6c\x94\x9d\xdd\x6e\x22\x5b\x55\x41\xa1\x3e\ +\x55\x38\x50\x81\x7f\x4a\x09\xc2\x41\x55\x2f\x2e\x7d\xb9\xb2\x62\ +\x04\x15\x10\x0f\x3e\x61\xf1\xcd\x58\x59\x9d\x70\xb0\xab\xe2\x3b\ +\x11\xd7\x6c\x5e\x5b\x0a\x29\xa0\xbd\xa0\x62\xbf\xef\x36\x58\xb5\ +\x0a\x24\x84\xc4\xb7\x62\x55\x29\x75\xcb\xcb\xe7\xa7\xad\x54\xf6\ +\xc5\x74\xd7\xf0\x44\x94\x69\x37\xef\x5e\xbc\x8a\x4a\xb9\x82\x83\ +\xfb\x27\x91\xcb\xe5\x94\x7a\x9e\x74\xe7\xd2\x18\xea\xcd\x3a\xd3\ +\x6e\xaa\x8d\x48\xce\x73\x55\x85\x2d\x0b\x98\x18\x70\xd6\xa3\x0a\ +\x9e\x52\xea\x97\x17\xb2\x70\x9e\x07\xaa\x39\xe1\x7a\xc4\xf5\x4b\ +\xa9\xc2\x9b\x01\x59\x2b\x10\xdb\x89\x00\x6b\x36\xaf\x56\x1c\xf1\ +\x4d\x4b\x3b\x40\x05\xb4\xd7\xc7\xd4\x4a\x3e\x51\xe3\x5a\xa9\x7b\ +\x58\xbd\xa3\xa4\x33\xa5\x35\xe5\xc5\x85\x57\xd7\xa6\x96\xed\x7a\ +\xe5\xf9\x6c\xef\x78\x9e\xa4\x32\x47\x61\xd8\x9a\xab\x5e\xb7\x71\ +\xe9\xca\x0c\x56\x56\xd6\x71\x60\xdf\x84\x3f\xed\x86\xd5\x61\x8b\ +\xcc\x67\x9c\x1e\xc1\x5a\x83\x62\xa3\x5c\x83\xe7\x65\x57\xc3\xca\ +\x0f\xf4\x8f\x03\x8b\xaa\x0b\xdd\xfe\xea\x09\x41\xfb\x2f\x1a\xa8\ +\x96\xbf\x54\x59\xb9\x18\x06\xaa\xa8\x61\xdb\x61\x65\xb5\xea\xdf\ +\xda\x4e\x0b\xac\x13\x3e\xae\xa6\xa5\x5d\xa0\x02\xda\x0b\x92\xb8\ +\x4d\xb4\x38\x71\x71\xeb\x60\xfa\x6e\x0a\x8b\x92\x2e\x4a\x9c\x49\ +\x8f\xd4\x37\x17\x37\x6b\x9b\x0b\x2f\x64\xfb\x26\xcb\x56\x2a\x77\ +\x3c\xda\xb4\x9b\x39\xec\x99\x18\xc5\xd0\x60\x3f\x9f\xb1\xb0\x2d\ +\x4d\x26\x6d\x61\xb8\x2f\x0b\x02\x6f\xda\x4d\xb0\x5c\x0c\x0b\x2b\ +\xbe\x62\xc1\x37\xcb\x5f\x8f\x8a\x79\xcc\x68\x50\xa1\xa9\x30\x50\ +\x95\x96\x44\x50\x99\x1e\xf8\x66\x2c\xad\x56\xe1\xa4\x8b\x6b\x16\ +\x50\x61\xba\x9d\xb4\x94\x3a\x1d\xd7\x92\xb4\x13\x54\x40\xe7\x61\ +\xd5\x89\xa6\x20\x62\x84\x75\x02\x58\x51\xe3\x74\x79\x92\x46\x65\ +\xa3\x5a\x59\xb9\xf4\x72\xb6\x7f\xcf\x4c\x2a\xd3\x75\x3c\x74\xda\ +\xcd\xd2\x1a\x2e\x5c\xbc\x8a\x91\xa1\x7e\x67\xda\x8d\xd7\x88\x13\ +\xac\x2a\x10\x07\x36\x43\xbd\x59\x64\x33\x16\x36\x8a\xb5\x60\x6d\ +\x2b\x1f\x50\x3c\xa9\x78\x8b\x0a\xfc\x2e\x34\x8c\x43\x3d\xc2\xe6\ +\x0e\xc5\x7a\x71\xf9\x8b\x0a\x8b\x8a\xc9\xc9\x18\x16\xb7\x09\x18\ +\x76\xbc\x13\x00\x15\x16\xbf\x53\x01\xd6\xb2\xb4\x1b\x54\xc0\xce\ +\x87\x55\x9c\xfc\x10\x92\x8f\x4e\xbf\xd5\x66\x5d\x9c\x3c\x00\x00\ +\xb4\x51\xb5\xcb\x8b\x6f\xbf\x95\xe9\x9b\x78\x3b\x95\xed\xbd\x39\ +\x74\xda\xcd\x46\x11\xef\xbc\x7b\x05\xdd\xf9\x2c\xf6\xee\x19\x67\ +\xa6\xdd\x04\xc5\xfb\xcd\x3c\x42\x30\xd0\x9d\x45\x77\x3e\x8d\x8d\ +\x52\x0d\x95\x3a\x0d\x2a\x47\x18\x58\x09\xb5\xb6\x88\xbb\x66\xba\ +\xdb\xeb\x47\x85\x3a\x44\x00\xd5\x97\x5a\x00\x95\x2e\xbc\xd9\x26\ +\xa0\x29\x2e\x2e\xa0\x54\x3a\x71\xe2\x5b\x01\xdc\xae\x83\x14\xd0\ +\x19\x50\x79\xd2\x6e\x67\x79\xab\xd6\x90\x2e\xdf\x28\x69\xa3\xe4\ +\xdd\x49\x7f\x55\x14\x68\x11\x50\x8a\xf2\xe2\x3b\x97\xd3\xf9\xfe\ +\x97\xd2\xf9\x81\x83\xc4\x4a\x1d\xd4\xa5\xf5\xa6\xdd\xbc\xf3\xee\ +\x55\xd0\x46\x03\x07\xf6\x4f\x22\x9b\x49\x4b\x59\xb2\x46\x56\x4f\ +\x3e\x8d\x81\xee\x0c\x8a\x95\x3a\x4a\xee\x42\x7c\x6c\xed\x58\x60\ +\x51\x04\xeb\x51\x75\xe7\x55\x53\x68\x80\xa9\xa9\x39\xbc\xfc\xda\ +\x3b\x86\x5e\xbf\x95\x2f\x56\x56\x2e\x44\x05\x95\x2e\xae\x95\x26\ +\x60\x58\x7c\xdc\xef\xec\x71\xbb\x1c\xf0\x3b\xc5\x39\xdf\x76\x07\ +\x3a\x2b\x9d\x04\x15\x10\xdf\xfa\x89\x13\xd7\x4c\xfe\xad\x02\x29\ +\x2e\xb0\xda\xe9\x3c\x8f\x9c\x4f\x65\xe5\xe2\x3c\xb1\xac\xe7\xd3\ +\xdd\x23\x83\xc4\x4a\xdf\x84\x90\x69\x37\xe7\x2f\x4e\xa3\x50\xd8\ +\xc4\xc1\x03\x93\xdc\xb4\x1b\xa7\x30\xbe\x4b\xaf\x2b\x9b\xc2\x50\ +\x6f\x16\x95\xaa\x8d\x42\xa5\xce\x57\x48\xa8\x99\xd4\xf4\xf3\x85\ +\xc2\x1f\x9e\xf0\x9a\x61\x78\x42\x69\xe5\x0b\x95\x65\x25\xa8\x82\ +\x8c\xc2\xc3\x9a\x69\x02\x9a\xe2\x3b\x65\x65\x75\x32\xbe\x13\x56\ +\x57\x98\x7e\x5b\xa5\xd3\xa0\x02\xe2\x5b\x35\xed\x6c\xee\xe9\xea\ +\xd1\x4c\xaf\x5e\x2b\x43\x0c\x9a\x01\x56\x54\x5d\xe5\xb9\x56\xd7\ +\x67\xd6\xed\xea\xe6\x0f\xb2\xbd\x13\x84\xa4\x32\xb7\x02\x24\xa3\ +\x4c\xec\x4d\xbb\x99\x9a\xc3\xdc\xbc\x33\xed\xa6\xbf\xbf\x97\xcb\ +\x9e\x08\xa5\x64\xd3\xce\x48\x76\x6a\xbb\x0b\xf1\x29\x2a\xe2\x59\ +\x54\x12\xa8\x28\xf5\x0a\x8e\x02\xaa\x2f\x56\x96\x2f\xcc\xa2\x35\ +\x50\xe9\xc2\x5b\x81\x53\x54\xdd\x66\xbf\x77\xd2\x8f\xa5\x0a\xdb\ +\x71\x4d\x3d\x51\xb6\x02\x54\xc0\xf6\x00\xa9\x19\x27\x78\xbb\x00\ +\xd4\x2e\xeb\xa9\x19\x7d\xff\x5c\xea\xc5\xe5\x72\x75\x7d\xe6\x85\ +\xdc\xc0\xde\x15\x2b\x95\x3b\x01\x42\xba\x4d\x09\x67\xe7\x97\x71\ +\xf9\xca\x0c\xc6\xc7\x86\x30\x3a\x3c\xc8\x65\x29\xc2\x2a\x6d\x39\ +\x1b\x48\x38\xd3\x6e\x6a\x68\x38\x2b\xf1\x71\xf9\xf9\xbd\x7e\xb9\ +\xb4\x0f\xa8\xa0\xd3\x2f\x0c\x54\xd8\x6c\x94\x57\xbe\x50\x5e\x3e\ +\x1f\x17\x54\xba\xb8\xb8\xd6\x57\xa7\xad\xac\x66\x9c\xf1\xcd\xe4\ +\xb5\x95\x00\xeb\x98\x6c\x15\xa8\x80\xad\x07\x52\x94\x72\xa3\xd4\ +\x35\x2c\xaf\x38\x3a\xad\x38\xcf\xe3\xe4\xe5\x8b\x5d\x2b\x36\xca\ +\x4b\xef\xbe\x96\xed\xdf\x7b\xd1\xca\x74\xdd\x4a\x08\x19\xd2\x16\ +\x40\x08\x56\x56\x37\x70\xee\xfc\x55\x0c\xf4\x77\x63\x62\x62\x94\ +\x9f\x76\x23\x94\x6a\x11\x82\xc1\x9e\x2c\xf2\xd9\x14\xd6\x8b\xee\ +\xda\x56\x60\xe3\xbd\xa6\x5f\x4a\x7a\x92\xa3\x80\xaa\x5e\x5a\x0d\ +\x03\x15\x10\xdd\x82\xd2\x85\xb7\xcb\xb9\xae\xd3\x6d\x47\x6f\x61\ +\x9c\x66\xe4\x76\x01\xac\xa3\xb2\x95\xa0\xf2\x24\xaa\xff\xc9\xa4\ +\xdf\x6a\xd3\xcd\x14\x16\x25\xbe\x1d\xd6\x53\xdb\x7a\xfc\xc2\xd2\ +\x51\xbb\x4e\x4b\xf3\x67\xce\x65\x7b\xc7\x5f\x4b\xe5\xfa\x6e\x22\ +\xc4\x8a\x30\xed\xe6\x32\x32\x29\x0b\xfb\xf7\x4e\xb8\xd3\x6e\xd4\ +\xb0\xf2\xa6\xdd\xf4\x75\x65\xb0\x51\xaa\xa3\x52\x0f\xa0\x63\x59\ +\x04\x13\x4a\x1f\x55\x54\x50\xad\x7c\xde\x05\x95\x47\x4b\xe5\xe9\ +\x19\xae\x47\xb3\x3e\xac\x56\xe1\x14\x55\xaf\x9d\x80\x6a\x35\xbe\ +\x15\xe7\x7c\xc7\x65\x3b\x40\x05\x6c\x8d\x75\xd5\x4c\x7c\x94\xfa\ +\xc6\x3d\xaf\x28\xf9\xb5\xab\x7c\xe3\xb9\x97\x97\xce\x4d\xa5\xb2\ +\xbd\xcf\xa7\xbb\x06\xf6\x10\x2b\x75\x3d\x4c\xd3\x6e\x2a\x35\x9c\ +\xbb\x70\x15\xd5\x72\x05\x07\x0f\x4c\xba\xbb\xdd\x30\xb0\x12\x6a\ +\xd5\x93\x4b\x63\xd0\x9b\x76\x53\x69\x80\x02\x48\x11\x82\x49\x61\ +\x5f\xbf\x20\xa9\x07\x2a\xdd\xf0\x04\x6c\xd6\xcb\xab\x9f\x2f\x2f\ +\xbd\xeb\x59\x54\x61\x2f\x46\x54\x7f\x55\x33\xf0\x8a\x63\x85\xb5\ +\xa3\x27\x30\x0a\xa0\x9a\x49\xb7\xab\xac\x28\x56\xb6\x0b\x54\xc0\ +\xd6\x37\xf7\x10\x12\x66\x0a\x8f\x12\xdf\xae\x41\x9d\xcd\x3a\xd0\ +\xa3\x08\xa9\xac\x5e\x5a\x06\xe8\xf7\x33\x3d\xa3\xdd\xc4\x4a\xdf\ +\x82\x90\x69\x37\x17\xaf\xcc\x60\x65\x65\x0d\x07\xf7\x7b\xd3\x6e\ +\x02\xd7\xb9\x08\xac\x60\xda\x8d\x8d\x8d\x52\x0d\xc4\x38\xe0\x13\ +\x98\x9a\x9e\xc7\x2b\xaf\xbd\x1d\x06\xaa\x28\x53\x68\x74\xe1\xed\ +\x72\xac\x87\x1d\x37\x63\x3d\xa9\xe2\x9a\x05\x54\x94\x32\xdb\xdd\ +\x0c\xdc\x52\xd9\x4e\x50\x79\xb2\x55\xcd\xbd\x76\x02\x2b\xaa\x4e\ +\x98\x5e\x33\x83\x47\x5b\x19\x60\x0a\x00\xa4\xb6\x31\xbb\x59\x2f\ +\xad\xfe\x20\xdb\x3f\x59\xb6\x52\x99\xdb\x00\xf3\xb4\x9b\xa9\x99\ +\x45\x4c\x4f\xcf\x63\xef\xe4\x68\xb0\xdb\x0d\x53\x34\x5b\x78\x26\ +\x6d\x61\xa8\x2f\x07\x02\x82\x42\xa9\xe6\x4f\x4a\x06\x65\x9f\x70\ +\x6f\x99\x97\xb9\x10\x50\xad\x7d\x8e\xb1\xa8\x82\xc4\x6a\xe9\x74\ +\x13\x50\x3c\xde\xca\x26\xa0\x29\x7c\xab\x9b\x81\xdb\x22\x3b\x01\ +\x54\x40\x67\x9b\x7b\xcd\xe6\x6f\x0a\x37\xe9\x34\xeb\x4c\x6f\xa6\ +\xec\xa6\xd3\x37\xca\xab\xb5\xea\xea\x95\x1f\x65\x07\xf6\xcf\x5a\ +\xe9\xdc\x6d\x61\xd3\x6e\x16\x96\x56\x71\xe1\xe2\x14\x46\x86\xf9\ +\x69\x37\x62\x91\x5e\x93\x6f\xb0\x37\x8b\x5c\x26\x85\xae\x6c\x0a\ +\xf9\x4c\x0a\x54\x78\xce\x3d\x1f\x95\x09\x54\x8d\xca\xda\xe7\xca\ +\x4b\xe7\x66\x10\x0d\x54\xa6\xf8\x66\xad\xad\x4e\x34\x09\xe3\xea\ +\xe8\xd2\x74\xba\x07\x71\xc7\x40\x0a\xd8\x39\xa0\xf2\xa4\x13\xcd\ +\xbd\xa8\x3d\x7d\x61\x3a\xad\x82\xad\xd5\x26\x5f\x2b\x30\x55\xea\ +\xdb\xf5\x72\xa3\xb4\xf0\xd6\x9b\xb9\xc1\xfd\x67\xad\x4c\xf7\x31\ +\x42\x48\xc8\xb4\x9b\x4d\x67\xda\x4d\x97\x6e\xda\x0d\xab\x0f\xf4\ +\x77\x67\x90\xcb\xa4\x94\x35\x8c\xd2\xf4\x6b\x94\xd7\x3f\x5b\x5e\ +\x3a\xa7\x1b\xf0\xd9\x6a\x6f\x9f\x2e\x7c\x3b\xfd\x55\xed\x82\x5b\ +\x27\x9a\x81\xdb\x2a\x3b\x0d\x54\xc0\xf6\x8e\x24\x8f\xa2\xb3\x55\ +\x4d\xbe\x56\xcb\x88\x26\xd4\x46\x69\xfe\xad\x0b\xd9\xde\xb1\x1f\ +\xa5\x72\xbd\xd7\x11\x62\x45\x98\x76\x73\x05\xd4\x76\xa6\xdd\x64\ +\x32\x19\x63\xf6\x44\x89\x18\x0a\x10\x82\xe9\x99\x30\x8b\x6a\xfd\ +\x73\xe5\xc5\x77\x74\xc3\x13\xae\xc5\x26\xa0\x78\xbc\x95\x80\x0a\ +\x2b\x6f\x5b\x65\x27\x82\xca\x93\xed\x1c\x49\x1e\x45\xa7\x93\xc3\ +\x0d\xda\xd1\xcb\x17\x2b\x4d\x79\xe9\xdc\x5c\x2a\xd3\xfd\xfd\x74\ +\xd7\xe0\x08\xb1\x52\x47\x60\xe8\x11\xe4\xa6\xdd\xec\x9f\x44\x57\ +\x57\x2e\xbc\x04\xc5\x80\xcf\x08\xa0\xfa\x6c\x13\xa0\x32\xc5\x6f\ +\x77\x2f\xa0\x49\xb7\x93\xdf\x77\x55\x33\x4f\x25\x3b\x19\x54\x40\ +\x7b\x86\x1b\x74\xe2\x7b\x58\x3d\x5b\xe9\xe5\x6b\x97\xb5\x15\x56\ +\x47\x29\xbe\xb2\x7a\x79\x8d\xda\xf5\xef\x67\x7a\xc7\x09\xb1\xd2\ +\xc7\x01\x68\x77\xbb\x69\x50\x8a\x2b\x53\xb3\x98\x9f\x5f\xc6\xbe\ +\x3d\x63\xe8\xef\xeb\x01\x75\x61\xe4\x15\x64\x7a\xe2\x23\x80\xaa\ +\xd0\xa8\x6c\x98\x40\xe5\x49\x3b\x7a\x01\x55\x71\x5b\xd1\x04\x34\ +\xc5\xb5\x1b\x50\xaa\xf0\x28\xd6\xe4\x8e\x90\x9d\x0e\x2a\x4f\xda\ +\xd1\x7b\xb7\x55\x53\x5f\x76\x47\x93\x4f\x9d\x27\xa9\x15\xe6\x4b\ +\xf5\xe2\xf2\xf3\xd9\xfe\x3d\xab\x56\x2a\x73\x12\x50\x4f\xbb\xf1\ +\x2a\x30\x3b\xbf\xe4\xec\x76\x33\x36\x84\x61\x6e\xda\x4d\x48\x61\ +\x51\x2c\xaa\xea\xc6\x67\xcb\x8b\x6f\x8b\xce\x74\x51\x76\x5b\x13\ +\xd0\x14\xd7\x2e\x88\xb5\xd2\x5b\xb8\x23\x65\xb7\x80\xca\x93\x76\ +\x03\x2b\xaa\x4e\xb3\xcd\xbf\x9d\xde\xe4\x53\xe6\xd3\x28\xaf\xd5\ +\x2b\xcb\xe7\x5f\xc9\x0d\x1e\xbc\xe8\xf6\x08\x86\x4e\xbb\x79\xf7\ +\xc2\x55\x0c\xf6\xf7\x60\x62\x7c\x04\x96\x15\x5e\x15\x42\x08\xa6\ +\x42\x40\x65\x57\x0a\x7f\x5c\x6a\x1e\x54\xa6\xf8\xad\x68\x02\x86\ +\x1d\xb7\x6b\x08\x43\x14\x9d\x5d\x0b\x28\x4f\x76\x1b\xa8\x3c\xe9\ +\x24\xb0\xa2\xe6\x15\x57\x6f\x2b\x07\x76\x36\x93\x07\xf7\xd0\xd2\ +\x46\xd5\x2e\xce\xbf\x79\x36\x37\x78\xf0\x35\x2b\xd3\x7d\x84\x10\ +\x62\x9c\x76\x53\xd8\x74\xa7\xdd\xa4\x53\xd8\xc7\xec\x76\xa3\x2c\ +\x88\xba\x16\xd5\xf4\x3c\x5e\x79\xdd\x64\x51\x15\xfe\xb8\xb4\x70\ +\x36\x0c\x54\xca\xfa\x87\x84\x77\x6a\x20\x68\x98\xfe\x76\x8e\xc3\ +\xda\x95\x80\xf2\x64\xb7\x82\xca\x93\x56\xe7\xf2\xa9\x74\xb6\xc2\ +\x79\xde\xae\xba\xb6\x43\x8c\xe7\x51\x9a\x7f\xeb\x4a\xb6\x77\xec\ +\x07\xa9\x5c\xef\x3e\x42\xac\xc3\x3a\x7d\x6e\xda\x4d\xa5\x8a\x03\ +\xfb\xdd\x69\x37\x54\xfd\x56\x10\x02\x4c\xcf\x2c\xe8\x41\x45\xb0\ +\xd9\xa8\x14\xfe\xc8\x05\x95\x69\xae\x9f\x27\xed\x68\x02\x36\x63\ +\x69\xc5\x8d\x6f\x15\x50\xed\xe8\x09\xdc\x75\xb2\xdb\x41\xe5\x49\ +\x3b\x86\x24\x98\xc2\x9b\xcd\x2f\x6a\x9e\xad\x8c\x36\xef\x04\xbc\ +\xb8\xfc\xcb\x4b\xe7\x16\xad\x74\xd7\xf7\x32\xdd\xc3\xdd\xc4\x4a\ +\x1d\x83\x71\xda\x4d\x03\x17\x2f\xcf\x60\x75\xd5\xd9\xed\xa6\xbb\ +\xbb\x8b\xd1\xa0\x9c\xee\xf4\xcc\x02\x5e\x36\x5a\x54\xc5\x3f\x2a\ +\x2d\xbc\xe5\x59\x54\xcd\x82\xca\x14\xdf\xae\x26\xa0\x18\xd6\xc9\ +\x26\xa0\x49\xef\x9a\x03\x94\x27\xd7\x0a\xa8\x3c\x69\x65\x50\x66\ +\xbb\xac\xa7\x76\x4c\x30\xde\xb6\x26\x9f\x2e\xaf\xea\xda\x95\x0d\ +\x38\x3d\x82\x15\x62\xa5\x4f\x02\xd0\x4c\xbb\x21\xee\xb4\x9b\x05\ +\x4c\xcf\xcc\x63\xef\xc4\x08\x06\x07\xfb\xa4\x62\x3c\x50\x99\x9a\ +\x7e\x76\x75\xd3\x03\x55\x1c\xd9\x09\x4d\xc0\xb0\xe3\x66\x74\x5b\ +\x75\xb4\xef\x6a\xb9\xd6\x40\xe5\x49\x27\x7b\xf8\xda\xd9\xe4\xdb\ +\xca\x29\x35\xad\xe6\x47\x6a\x85\xf9\x4a\xad\x30\xff\x42\x6e\x60\ +\xff\x0c\xb1\x32\xb7\x47\x9a\x76\x73\x69\x0a\x23\x43\x03\x18\x1b\ +\x1d\x12\x46\x7f\x12\x4c\x85\x81\xaa\x56\xfc\x4c\x69\xfe\x2d\xaf\ +\xe9\xe7\x49\xbb\x9b\x80\xed\x02\xd8\x4e\xb2\xb2\xae\x19\x40\x79\ +\x72\xad\x82\xca\x93\x4e\x3b\xcc\xdb\x39\xc8\xb3\x99\x34\x9d\x6e\ +\xf6\x89\x65\x91\x46\x65\xa3\x51\x9c\x7f\xeb\xf5\xfc\xf0\x0d\x67\ +\xad\x74\xf6\x56\x10\x32\xae\x4d\x40\x08\xd6\x36\x36\x71\xee\xfc\ +\x15\xf4\x74\xe5\x30\x39\x39\x06\xcb\x4a\x05\xce\xf4\x50\x8b\xaa\ +\xf8\x99\xd2\xfc\x99\x76\xcc\xf5\x33\xc5\xb5\x73\x6c\x95\x18\xb6\ +\x5d\x4d\xc0\x6b\x4e\xae\x75\x50\x79\xd2\x0e\x87\x79\xa7\xe6\xea\ +\xc5\xad\x7b\x94\xfc\x5a\xe9\x25\x0b\xd7\xa7\x0d\x5a\x9c\x7b\xfd\ +\x7c\x6e\xe8\xd0\x8b\xa9\x4c\xd7\x0d\x20\xe4\x90\xae\x4c\x42\x08\ +\x4a\xa5\x0a\xce\x9d\xbf\x02\x50\x1b\xfb\xf7\x4d\x20\x93\xc9\x44\ +\x03\x55\xad\xf4\x87\x02\xa8\xa2\xd6\x39\x2e\xac\x74\xe1\x9d\x6e\ +\x02\x8a\xc7\x09\xa0\x34\xf2\x5e\x01\x15\x2b\x3b\x65\xae\xde\x76\ +\x8d\x99\x6a\x25\x2d\xfb\x42\x90\xd2\xfc\x99\xe9\x4c\xef\xf8\x5f\ +\xa4\x72\x7d\xa3\x84\x58\x47\x60\xd8\xed\xa6\x5a\xab\xe3\xfc\xa5\ +\x69\x6c\x16\x8a\x38\xb0\x7f\x02\x5d\x5d\x79\x67\x52\xf2\xeb\xef\ +\x68\x47\xa6\x3b\xa0\x7a\xb3\x99\x29\x34\x3b\x69\x6c\x55\x98\x4e\ +\x02\xa7\x08\xf2\x5e\x04\x95\x27\x5b\xb9\x3c\x4b\xbb\xd7\x94\x8a\ +\x53\x76\x27\xf3\x24\xe5\xa5\x73\x2b\xa9\x6c\xcf\xf7\xd2\x5d\x43\ +\x29\x62\xa5\x6e\x83\x69\xda\x4d\xc3\x99\x76\xb3\xb0\xb0\x82\xfd\ +\xfb\xc6\xb1\xb1\x51\x74\x41\xa5\x5c\x8a\xb8\x60\xd7\xcb\x9f\x29\ +\xcd\xbd\xa9\x1b\x47\x15\xe5\x45\xed\x84\x5f\x4a\x15\xd6\xce\x26\ +\x60\xdc\xb4\xef\x09\x79\x2f\x83\x8a\x95\xed\x58\x9e\x25\x4c\x67\ +\xbb\x9d\xe7\x91\xf3\xad\xac\x5e\x2e\x82\x36\x9e\xcb\xf6\x8e\xaf\ +\x11\x2b\x7d\x3b\x80\x1e\xa5\xa2\x5b\x83\xd9\xf9\x25\x5c\x9d\x9a\ +\x43\xc3\x6e\xe0\xca\xd5\x39\x2d\xa8\x68\xbd\xfc\x87\xc5\xb9\x37\ +\x5a\x19\x99\xbe\x53\xa6\xd7\xc4\x3d\x4e\xe0\x24\x48\x02\x2a\x59\ +\xae\xd5\x26\x5f\x9c\x87\xbd\x89\x1e\xc1\xb9\x5a\x75\x6d\xea\x47\ +\xf9\xe1\xeb\x2e\x92\x54\xfa\x24\x40\x86\xb5\xca\x84\x60\x79\x65\ +\x1d\xd3\x33\x0b\xa8\x37\x6c\x9d\x5a\xc1\xae\x57\xfe\x77\x08\xa8\ +\x76\xf2\xd8\xaa\x76\x36\x01\xdf\xf3\x92\x80\xca\x2c\xd7\x52\x93\ +\xaf\xe3\x3d\x84\x76\xad\x48\x8b\xf3\x67\xce\x74\x8d\xde\xf4\xaa\ +\x95\xca\x1e\x05\x21\xfb\xb4\x95\x21\x44\xe7\x9b\xf2\x34\x0a\xb4\ +\x51\xfd\xc3\xe2\xec\xeb\xd3\x68\xde\xa2\x0a\xd3\xd9\xe9\x4d\xc0\ +\x44\x5c\x49\x40\x15\x5d\xb6\xbb\x97\xaf\x5d\xf5\xee\xac\xd0\x06\ +\x8a\xb3\xaf\x5d\xca\x8f\xdc\xf0\x9c\x95\xce\xef\x07\x21\x87\xa1\ +\x59\xdb\x2a\x44\x0a\xb4\x5e\xfd\xdf\xc5\xd9\xd7\xc2\x40\xe5\x97\ +\xdc\x44\x5c\xa7\xa7\xd7\x34\x73\x9c\x88\x42\x12\x50\x35\x27\xd7\ +\x62\x93\xaf\x9d\x40\x23\xc5\xb9\x37\x17\xb2\xfd\x7b\xbe\x63\xe5\ +\x7a\xfa\x08\xb1\xb4\xd3\x6e\x0c\x52\xa0\x8d\xca\xa7\x23\x82\x6a\ +\x2b\x9a\x80\xcd\x8e\x62\x8f\x3b\x76\x2b\x11\x85\x24\xa0\x6a\x5d\ +\xb6\x73\x82\x71\x3b\xe1\xd2\xee\x97\x87\x94\x16\xdf\x5e\xcf\x74\ +\x8f\x7c\x37\x95\xef\xaf\x12\x62\xdd\x01\xcd\xb4\x1b\x8d\x14\xa8\ +\x5d\xfb\x74\x71\xe6\xd5\x76\x80\x2a\x4c\xaf\xd3\xd3\x6b\xe2\xd4\ +\x31\x11\x85\x24\xa0\x6a\xbf\x74\x62\x82\x71\x33\x0f\xf9\xd6\x36\ +\xf9\x34\x75\x28\x2f\x9f\xaf\x80\xd2\x1f\x64\x7b\x27\x66\x89\x95\ +\xba\x03\x40\x7f\xc4\xb4\x05\xda\xa8\xfd\xaf\x88\xa0\x62\xa5\x93\ +\x23\xd3\x5b\x0d\x4b\xa4\x49\x49\x40\xd5\x79\x69\x15\x52\xed\xee\ +\x9a\x6f\xb6\x7e\x4d\x4b\x6d\x63\xb6\x51\x5d\x9f\x7a\xa5\x6b\xf8\ +\x86\xb7\x88\x95\x3a\x0e\x90\x89\x08\xc9\x0a\xb0\xeb\x9f\xde\x9c\ +\x79\x65\x1a\xd1\x96\x79\x69\xf5\x7a\xb4\x62\x41\x45\xc9\x3f\x91\ +\x16\xa4\x19\x27\x67\x22\xf1\x84\x0a\x7f\xba\xf0\xb8\x7f\xed\xca\ +\x67\x2b\xfe\x50\x2b\xcc\xd3\xb9\x17\xfe\xcb\x57\xed\x5a\xf9\x17\ +\x01\xfa\x4d\x84\xbf\xd8\x14\x20\x8d\x76\xd6\xa1\xc3\xd7\x3d\x91\ +\x0e\x4a\x62\x51\xed\x0c\xd9\xce\x9e\xbe\xad\x7c\xc9\xc8\xe6\xcc\ +\x2b\x53\x5d\xe3\xb7\x7c\xd7\xb2\x32\x63\x20\xe4\x28\xf4\xcf\xe0\ +\xf9\x46\x6d\xf3\x3f\x16\x67\x5f\x2f\x34\x51\xce\x56\x0c\x02\x4d\ +\x64\x0b\x25\x01\xd5\xce\x95\x8e\x2f\x88\xb7\x5d\xe7\x55\x9c\x79\ +\x75\xb9\x6b\xfc\x96\x6f\x5b\xa9\x4c\x06\x84\x9c\x84\x6a\xda\x0d\ +\xa5\x9f\x29\xcd\xbf\xf5\xd9\xea\xfa\x14\x15\xea\xba\x5d\x4d\xc0\ +\x44\xb6\x51\x12\x50\xed\x3e\xd9\x09\x4e\xf2\xb8\x75\x12\x5f\x7e\ +\x52\x9c\x7d\x75\x33\x3f\x76\xe4\x7b\x56\x2a\xbb\xe2\x5a\x56\x03\ +\x6e\x3e\x35\x00\x5f\xa4\x76\xed\x9f\x2f\x9f\xf9\xd2\x82\x22\xef\ +\x56\x41\x15\x47\x27\x91\x1d\x22\x3b\xf1\xa1\x4f\xa4\x79\xd9\xc9\ +\xeb\x59\xa9\x84\x0e\xde\xf4\x54\x2a\x37\x74\xdd\x31\x62\x59\x1f\ +\x00\x90\x07\xc5\x25\x6a\xd7\xbf\x3c\xf7\xc3\xff\xec\x6d\xe5\x1e\ +\xd7\x9a\x42\x0b\xfa\x89\xec\x50\xd9\xee\x07\x35\x91\xad\x17\x71\ +\xfd\xf1\x9d\xf0\x0c\xa8\x80\x62\xb2\xa4\xa2\xac\xa1\x9e\xc8\x35\ +\x24\x3b\xe1\x21\x4d\x64\x77\x48\xa7\x9e\x95\x04\x38\x89\x84\xca\ +\xff\x0f\x54\x62\xd6\x8a\x59\xb9\x9c\x52\x00\x00\x00\x14\x74\x45\ +\x58\x74\x41\x75\x74\x68\x6f\x72\x00\x4a\x61\x6b\x75\x62\x20\x53\ +\x74\x65\x69\x6e\x65\x72\xe6\xfb\xf7\x2f\x00\x00\x00\x49\x74\x45\ +\x58\x74\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x00\x50\x75\x62\x6c\ +\x69\x63\x20\x44\x6f\x6d\x61\x69\x6e\x20\x68\x74\x74\x70\x3a\x2f\ +\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\ +\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\x6e\x73\x65\x73\x2f\x70\x75\ +\x62\x6c\x69\x63\x64\x6f\x6d\x61\x69\x6e\x2f\x59\xc3\xfe\xca\x00\ +\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\ +\x74\x65\x00\x32\x30\x31\x35\x2d\x31\x30\x2d\x31\x33\x54\x31\x35\ +\x3a\x30\x33\x3a\x33\x32\x2b\x30\x39\x3a\x30\x30\xf5\xf6\x5c\xde\ +\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\ +\x69\x66\x79\x00\x32\x30\x31\x35\x2d\x31\x30\x2d\x31\x33\x54\x31\ +\x35\x3a\x30\x33\x3a\x33\x32\x2b\x30\x39\x3a\x30\x30\x84\xab\xe4\ +\x62\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\ +\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\ +\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\x21\x74\x45\x58\x74\x53\x6f\ +\x75\x72\x63\x65\x00\x68\x74\x74\x70\x3a\x2f\x2f\x6a\x69\x6d\x6d\ +\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\x61\x6c\x6c\x2e\x63\x7a\x69\ +\x66\xe3\x5e\x00\x00\x00\x0d\x74\x45\x58\x74\x54\x69\x74\x6c\x65\ +\x00\x47\x6f\x20\x44\x6f\x77\x6e\xf3\xfd\x14\x79\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x08\x58\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x07\xea\x49\x44\x41\x54\x78\xda\xed\ +\x57\x6b\x6c\x14\xd7\x15\x3e\xf7\xce\xec\x7a\xd7\x76\x36\x7e\xcb\ +\x4e\x00\x97\x85\x04\x27\x04\x28\xe0\xda\x78\xcd\x8a\x26\x31\x76\ +\x6c\x13\x27\x8e\xb0\x1b\xa2\x18\xc5\xb4\x34\x22\x52\x15\x4a\xca\ +\x8f\xa8\xf4\x47\x9b\x56\xaa\xd2\x87\xaa\x3a\xa1\x52\x10\xa2\x55\ +\xdd\x28\x8a\xa5\x22\x12\x22\xa7\x34\xb1\x1d\xdb\x3c\x6d\x8c\xa1\ +\xf1\x0f\xc0\x8f\xf8\x0d\xc6\x6b\xf0\xae\x3d\xbb\x3b\x3b\x8f\x7e\ +\x33\xf6\x76\x65\x66\x41\xfc\xcb\x9f\x5e\xe9\x6a\x76\x66\xee\x9c\ +\xef\x3b\xdf\x39\xe7\x9e\xbb\x4c\xd7\x75\xfa\x36\x07\xa7\x6f\x79\ +\x88\xd1\x1f\xbf\xcc\xcd\x25\x55\x51\x88\x18\x23\xa8\x92\xc8\x38\ +\x3f\xe4\x4a\x49\x79\x31\x18\x08\x9c\x51\x65\xf9\x67\x58\x78\x87\ +\x43\x2d\xae\x69\x26\x6b\x86\xdf\xc2\xe2\x6f\xba\x5b\x45\xdc\xc3\ +\x46\x12\x63\xec\x37\xc9\xc9\xc9\x2f\x48\x81\x40\x1b\xbe\x3b\x20\ +\x32\x76\xdb\xfc\x1e\xf3\x47\x73\x73\x51\x02\x4b\x87\xa6\x69\x5c\ +\x13\x84\xdf\x7d\x7f\xed\xda\x37\xf2\x67\x67\xe9\x9a\xcb\xf5\xc4\ +\xbf\xc6\xc6\xb2\x35\x59\xde\x0d\xb0\x19\x7a\x80\xa1\xe9\x7a\x02\ +\x28\x35\x14\xaf\x5b\x57\x9f\xb7\x6c\x19\x0d\x4a\xd2\x6b\xa7\x5b\ +\x5b\x5d\x6a\x24\xb2\x9b\x0b\xc2\xfc\x3d\x43\xa0\xa9\x2a\x8f\x30\ +\xf6\x7b\xef\x86\x0d\x6f\x94\x80\xa1\x0b\xaa\xe4\x87\x42\x54\x9a\ +\x99\x59\xc9\x44\xf1\x98\xaa\xeb\xae\x07\x00\xb7\xa9\x9a\xd6\x50\ +\xe8\x76\xd7\x6f\xca\xc9\xa1\xa4\xf5\xeb\x69\xa3\xdb\x4d\x9e\xed\ +\xdb\x5f\xc2\xf3\x0f\x40\xc2\x01\x95\x2d\x04\x4c\xc9\x34\x51\x7c\ +\x6f\x5b\x51\xd1\x4f\xb7\xdf\xbe\x4d\x7a\x59\x19\x89\x1f\x7d\x44\ +\xda\x81\x03\xf4\x5d\x9f\x8f\x9e\x4b\x4d\xad\x12\x6d\xb6\x26\x8d\ +\x28\xe7\x3e\xe0\x2e\x78\x7e\xd4\x93\x9b\xbb\x77\x63\x7a\x3a\xe9\ +\xd5\xd5\x64\x3b\x78\x90\xb4\x92\x12\xda\xb8\x72\x25\x6d\xdd\xb9\ +\xf3\x15\xe2\xfc\x43\x4d\x51\xb2\x2c\x04\x60\xf8\xe7\xdb\xbc\xde\ +\x7d\x15\xf0\x5c\x7c\xfa\x69\x12\xf6\xef\x27\x1a\x1b\x23\x7b\x55\ +\x15\xb1\x43\x87\x68\xed\xcc\x0c\x95\x3b\x1c\xa5\x82\x28\x1e\x85\ +\x12\x29\x77\x83\xc3\x01\x51\x67\xac\x61\x6b\x56\x56\xdd\x06\xa7\ +\x93\x58\x6d\x2d\x25\x94\x96\x12\x8d\x8f\x93\x50\x58\x48\xac\xb8\ +\x98\x36\xe5\xe5\x51\x71\x5d\x5d\x35\x13\x84\xdf\x5a\x08\x3c\x94\ +\x99\x59\xe3\x31\xa4\xe1\x78\xf4\xe6\x9b\x44\x13\x13\x44\x7e\xbf\ +\x69\xc0\x51\x51\x41\xec\xed\xb7\x69\x15\xee\x9f\x15\x84\x72\xc4\ +\xb1\x11\xde\xa6\x51\x8c\xbc\x43\x65\xec\xf0\x16\x97\x6b\xf7\x13\ +\xa2\x48\x6c\xd7\x2e\x4a\x34\xc0\x6f\xde\x24\x0a\x04\xcc\x2b\xcb\ +\xcf\x27\x4a\x4b\xa3\x75\x20\x91\x91\x97\x57\x66\x21\x10\x9a\x99\ +\x69\xef\x33\xc0\x51\x09\xfa\xb1\x63\x64\xc6\x29\x18\x5c\x30\x00\ +\x25\x9c\x30\xc8\x41\xc2\x1d\x0e\xd3\x33\x8a\x52\x29\x72\xde\xa8\ +\xc1\x24\xa6\x91\x70\x87\x0b\x45\x71\x6f\x1e\xc0\xa9\xae\x8e\x92\ +\x10\x3e\xba\x75\x6b\xe1\x5b\x49\x22\x52\x55\xd2\xbb\xba\x4c\x87\ +\x86\xe0\x90\x7f\x68\xa8\xdb\x52\x86\x5a\x28\x74\xf0\xf3\x8e\x8e\ +\x2c\xf2\x78\x76\x14\x7e\xfc\x31\x29\x00\x17\x77\xec\x20\x9a\x5f\ +\x4c\x5a\x18\x4a\x42\x68\x28\x12\x21\xf7\x3b\xef\x90\x9d\xa8\xbc\ +\x35\x21\xe1\x84\xa2\xeb\x92\x57\xd3\x4a\x57\xa3\xb4\x6c\x00\x77\ +\x81\xa8\x09\x8e\x7b\x73\x38\x1c\xa4\x5e\xbe\x4c\xbc\xb7\x97\xfa\ +\x61\xa3\xbd\xb1\xf1\x82\x2a\x49\xfb\xa3\xb8\xff\xdb\x09\x7f\xf5\ +\xe8\xa3\xa4\x45\x22\xe9\xdc\x6e\xff\x5b\x45\x41\x41\x65\x7e\x7f\ +\x3f\x29\x95\x95\x24\x96\x97\x9b\x24\x60\x70\x41\x95\xe4\x64\xf2\ +\xb7\xb6\x52\xf0\xdd\x77\x69\x14\x9e\xc9\x82\x40\x6e\x82\x0c\xfb\ +\xf6\x51\xea\xf3\xcf\x2f\xac\x85\x4d\x73\x6d\x42\x02\x29\x43\x43\ +\xc4\x2f\x5d\xa2\x61\x54\x53\x6b\x53\xd3\x05\x45\x92\x6a\xc4\x84\ +\x84\x91\x3d\x58\x67\x29\x43\xce\xb9\x8f\x42\xa1\x57\xff\xdd\xdd\ +\xdd\x7c\x65\xc5\x0a\x62\x27\x4e\x90\xfc\xe9\xa7\xa6\x31\x53\x4a\ +\x24\xa8\x11\x4f\x57\x51\x11\x39\x90\xa4\xd9\x00\x5a\x01\xa5\x6c\ +\xf5\xf5\x94\x8a\x4c\xa7\xe9\x69\x73\x4d\x54\xf6\x48\x5f\x1f\xe9\ +\x9d\x9d\x34\x8a\x50\x7c\x75\xfc\x78\x8f\x32\x3f\x5f\x2b\xda\xed\ +\x23\x06\xc1\xb8\x0a\xe0\xa3\x05\x46\x8a\x92\x63\x73\x3a\xff\x5a\ +\xf2\xf8\xe3\xa5\x4f\x21\x19\x19\x64\xb5\x7b\x3c\x04\x72\x31\xef\ +\x12\x13\xe9\x4e\x7b\x3b\xc1\x28\x65\x20\xe6\xd1\x77\x98\xa6\xe7\ +\xf2\xe8\x28\xa9\xdd\xdd\x34\x81\x9c\xea\x68\x6b\xbb\x24\x07\x02\ +\x3f\x80\xe7\xd7\xa3\xe0\x7b\x24\xe9\xde\x04\x04\x3c\xd3\x15\xc5\ +\xc5\x6d\xb6\xbf\x97\xb8\xdd\x55\x4f\x4d\x4e\x92\x0e\x0f\x9d\x20\ +\x01\xef\x62\x24\xec\x76\x43\xb6\x18\xf8\x62\xcc\xc3\x23\x23\xa4\ +\xf4\xf4\xd0\xa4\x2c\x53\xfb\xd9\xb3\xe7\x91\x4f\xb5\x00\x5f\xe2\ +\x39\x08\x2c\x4d\x42\x3d\x76\x35\xa7\xc0\xb9\x1f\xdb\x6f\x7d\xdb\ +\xe0\xe0\x3f\xec\xcb\x97\x3f\xe7\x6e\x6e\x26\x09\x06\x13\x37\x6f\ +\x36\x01\xa3\x89\x89\x11\x03\x07\xa1\xd0\xd5\xab\x24\x23\xe3\xa7\ +\x91\x33\x1d\xbd\xbd\x5d\x6a\x38\xbc\x2b\x2a\xfb\x7d\x9b\x51\x32\ +\xa4\x8a\x2e\x62\xb8\x32\xc2\x10\x84\x19\x34\xa2\x5d\x5f\x0e\x0f\ +\x7f\xa2\x64\x66\x7a\xbf\x73\xea\x14\x31\xa8\xe4\xc4\xf6\x4a\xb2\ +\x1c\x03\x66\xcc\x58\x4b\xe1\xc1\x41\x92\xce\x9d\xa3\x69\xd8\x3a\ +\xd3\xdf\x7f\x45\x09\x85\x5e\xc0\xc6\x35\xf9\x40\xdd\x50\x84\x41\ +\xdd\x00\x66\x6c\xc1\x29\x5c\x99\x71\x45\x99\x29\x91\x88\x24\xdb\ +\x6c\xa4\xa3\x04\x6f\xb7\xb4\x98\x57\x8e\x1c\x40\x7f\x30\xc0\xcd\ +\x7b\x10\xa5\x59\x78\x6f\x83\x2a\x6a\x52\x12\x45\x64\x39\xcc\x34\ +\xcd\xcf\xf1\xdc\xec\x80\xb0\x6d\x76\x51\x4c\x81\xc8\x9a\x84\x7f\ +\x4a\x4d\x5d\x42\x00\x3f\x16\xba\x1a\xe7\x7f\xf1\xae\x5a\x55\xff\ +\xe4\xd4\x14\xf9\x86\x87\x29\x62\xe4\x28\xa6\x8e\x44\x43\xef\x30\ +\x89\x72\x63\x72\x4e\x22\xb6\x60\x01\x33\xed\x91\x47\xc8\x70\xfb\ +\x74\x57\xd7\x67\x0c\x1d\x10\x34\x67\xee\x26\x50\x8b\xfb\xa5\x65\ +\x68\x6d\xcb\x36\x6c\x32\x0d\x85\x6b\xd6\xd4\xaf\x43\x5b\xf6\x03\ +\x5c\x37\x0c\x44\xdf\x63\x47\x94\x51\x01\x11\x94\x9d\x06\x05\x18\ +\x08\x80\x85\x79\xf5\xa3\x79\x2d\xc3\x7e\x51\x54\x5c\x5c\x89\xfb\ +\x63\xda\x7d\xba\x28\xbf\x07\xb8\x0b\x9e\x1f\x2d\xde\xb4\x69\xef\ +\x66\xd4\xb0\xff\xda\xb5\x25\xe0\x2c\x36\xcd\xd8\x33\x4c\x28\x16\ +\x7b\x07\x12\x81\x1b\x37\x68\x25\x54\x2d\x2a\x2b\xab\x12\xec\x76\ +\xb3\x8b\x3e\x10\x01\x5d\xd3\x44\x8d\xf3\x06\x6f\x51\x51\x5d\x21\ +\xf6\x6e\xe9\xeb\xaf\x01\x1e\x1b\x51\x10\x15\x33\x05\x33\x1d\x53\ +\xb3\xda\x35\x49\xcc\xa1\x87\xb8\xd1\x96\x3d\xd5\xd5\xa5\x28\xe9\ +\xa3\x1a\x3e\xb9\x2f\x01\x80\x3b\x20\xfb\x61\x8f\xd7\xbb\x3b\x1f\ +\xed\x57\xba\x78\x31\xea\x79\x6c\x44\xc1\x11\xff\x08\x6a\x7e\x1e\ +\xa5\x97\x0e\x05\x20\xf3\x92\x75\xa6\x22\x58\x33\x8f\xd0\xe5\x42\ +\x89\x82\x9a\x9a\x72\x24\x6d\x23\xec\xa5\xc5\x25\x80\x04\x4c\xc6\ +\x51\xec\xfd\x2d\xa5\xa5\x7b\xb7\x20\xe6\x41\x94\x93\x1a\x2f\x3c\ +\x06\x38\x80\x65\xc4\xf8\x0c\xe7\xff\x39\x4d\x74\x61\x16\xde\xa6\ +\xe3\x59\x3c\x25\x08\xe4\xa4\x81\x01\x5a\x9d\x9d\x4d\xf9\x75\x75\ +\x95\xe8\x35\x06\x89\x6c\x0b\x01\x48\xf6\xeb\xe2\xb2\xb2\x3d\x5e\ +\x80\x2b\xed\xed\xa6\x31\x16\x07\xfc\x61\x00\xcf\xc1\xa3\x8e\x48\ +\xa4\x2b\xac\xeb\x15\x78\xb6\xfd\x6c\x30\x78\xf2\x16\x14\x48\x45\ +\x69\xaa\x66\x17\xb4\x2a\x11\xbe\x7e\x9d\xd6\xe0\x88\xf7\xbd\xd7\ +\x5f\x2f\xe7\x4e\xe7\x1f\x2d\x04\x92\xb2\xb2\x76\xac\x77\x21\x59\ +\xbf\xf8\x22\xae\xe7\xba\x01\x8e\xf7\x81\xcc\x4c\xea\xf4\xfb\x2f\ +\xc8\xaa\xba\x53\x24\x1a\x83\x01\x3f\xd4\x7b\xad\xcb\xe7\xfb\xec\ +\x96\xaa\x52\x2a\xd6\x20\x94\x96\xbc\xd1\xa1\x84\x8a\xe6\xb4\x0a\ +\x07\x92\x94\xd5\xab\xb7\x59\x08\x04\xa7\xa6\xbe\xbc\x66\xb4\x48\ +\xaf\x37\xae\xe7\x0f\x21\x99\x02\x38\xe1\x76\xfa\x7c\x3d\xb2\xa2\ +\xd4\x8a\x8c\x8d\xc4\x9c\x64\x3e\x54\xce\xab\x17\xc7\xc6\x9a\x7d\ +\x8a\x42\x0f\xe3\xe4\xa3\xdf\xad\x04\x9e\x0b\x8f\x3d\x46\x23\xd8\ +\x2d\x67\x87\x86\xba\x2c\x04\xb8\xaa\xfe\xa2\xb3\xb9\xf9\x78\x0f\ +\x36\x11\x7b\x41\x41\xec\x85\x01\x8e\xf8\xf9\x96\x2f\xa7\xb6\xf1\ +\xf1\x4b\xe1\x70\xf8\x65\x1b\xe7\xc3\x96\x6c\xe6\xfc\x8e\xaa\x28\ +\x3f\x3c\x7f\xf5\xea\xa9\x1b\x92\x44\x2e\x10\x26\x90\x40\x72\x99\ +\x87\x98\x04\x9c\x8c\xbf\x41\x78\xcf\x1f\x39\x72\x46\x99\x9b\x7b\ +\xcb\x42\x00\xb5\x3c\xc5\x64\xf9\x95\xce\x93\x27\x3f\xbc\x0c\x12\ +\x4e\x34\x1d\xe3\x65\x32\xbc\xbe\x81\x8f\xbf\x1a\x18\x38\x1f\x0e\ +\x06\x5f\x14\x39\xbf\x1e\x83\xb5\x90\x98\x04\x89\x9a\xee\x2b\x57\ +\x3e\x19\x87\x9a\x06\x71\x06\x12\x49\x38\x11\x8f\xa0\xa4\xcf\x1d\ +\x39\xd2\xa2\xfa\xfd\x2f\x09\x44\x03\x71\xcb\x50\xb0\xd9\x42\xa2\ +\xae\xff\xf8\x5c\x4b\xcb\x3f\xfb\x32\x32\xc8\xb1\x75\x2b\x4d\x20\ +\x71\xda\xfb\xfa\xba\x14\xa3\xab\x09\xc2\x88\x25\x37\x18\x33\xe3\ +\x1d\x9d\x9c\x31\x3f\xc2\x51\xdf\xdb\xdd\xfd\xf9\x04\x40\x9d\x90\ +\x7d\x1c\xbb\xe5\xc5\xa6\xa6\xd3\x68\x60\x75\x00\xbf\x49\xf1\x7a\ +\xc1\xfb\x88\x5b\xb4\x69\x20\x5e\xa9\x30\xf4\x87\x8c\x9c\x9c\x67\ +\x66\xa7\xa7\x7b\x71\x8c\xfa\x09\x17\x84\x51\x8a\x33\x9c\x0b\x5d\ +\x31\xd6\x41\x17\xaf\xb0\x92\xc1\x45\xf1\xcf\x29\x39\x39\xc5\xfe\ +\xa9\xa9\x6e\x38\xf0\x16\xbc\xfd\x26\xfa\x5d\xcd\x22\xee\xff\xff\ +\x1d\xff\x17\xef\xd2\xfe\x9f\xb7\x3d\x84\x48\x00\x00\x00\x00\x49\ +\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x1e\xc4\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\xca\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xa9\xad\x7e\xa3\ +\x00\x00\x1e\x8b\x49\x44\x41\x54\x78\x5e\xed\x5d\x09\x98\x24\x45\ +\x95\x7e\x2f\xbb\xe7\x00\x04\x39\x46\xf0\xc0\x15\xd6\x71\xec\xae\ +\x78\x59\xc3\xd8\xa2\xce\x02\xae\x80\x8a\x22\x2a\x2a\x88\xe2\x2a\ +\x20\xae\xb8\x82\x3a\xb2\x1c\xab\xc0\x2a\x82\x17\x28\x78\xc1\xee\ +\xb2\x2b\x03\xa2\x78\x20\xa8\xdc\x28\x2a\x2e\x22\x2a\x0c\x34\x95\ +\x2f\xaa\x67\x70\x64\xd9\x15\x16\xd0\x05\xc1\xf1\x98\x69\xbb\xf2\ +\xed\x17\x6d\xf5\x7c\x3d\xd3\x47\x65\x64\x66\x64\x66\x55\x45\x7c\ +\x5f\x7f\xa3\xf4\x7b\xff\x7b\xf1\xbf\xfa\xbb\xf2\x88\x78\x81\x50\ +\xd1\x51\xaf\xd7\x77\x17\x91\x95\x71\x1c\xbf\x14\x11\x9f\x07\x00\ +\xbb\xb5\x7f\x7e\x05\x00\x0d\x44\xfc\x85\x88\xdc\xc0\xcc\xb7\x54\ +\x74\x0a\x3e\xad\x59\x18\xd8\xaa\xae\x2b\x44\xe4\x29\x88\x68\x7e\ +\x9e\x10\x91\x35\x88\x38\x26\x22\x37\x33\xf3\xf7\xaa\x44\x20\x56\ +\x29\x19\x93\xcb\xb2\x65\xcb\x96\x2c\x5a\xb4\xe8\x64\x11\x39\x25\ +\x61\x6e\x46\x28\x97\x31\xf3\xc5\x09\xed\xbd\x59\x09\x0c\xd8\xd6\ +\x55\x44\xee\x46\xc4\xef\x30\xf3\x99\x25\xa4\x3b\x23\x64\xa5\x84\ +\xa2\x94\x7a\x33\x22\x7e\x08\x00\x9e\x6b\x4b\x8e\x88\x7c\x07\x00\ +\xce\xd5\x5a\xdf\x66\xeb\xeb\xed\xdd\x32\x10\x86\xe1\xe1\x22\x72\ +\x56\x9a\xba\x02\x80\xf9\x43\x78\x66\xd9\x57\x0e\x95\x11\x0a\x11\ +\xbd\x07\x00\x3e\x97\xb5\x64\x88\xf8\xc6\x28\x8a\xae\xc8\x8a\xe3\ +\xfd\xf3\x61\xa0\x2d\x92\x6f\xe4\x80\x76\x10\x33\x7f\x37\x07\x9c\ +\x54\x10\x95\x10\x0a\x11\x99\x6f\x91\x0f\xa7\x9a\xc1\x2c\x4e\x5e\ +\x2c\x79\x31\x99\x0d\x87\x88\x5e\x0f\x00\x57\x66\x43\xd9\xec\xfd\ +\x88\x88\xbc\x5a\x6b\x7d\x47\x4e\x78\x56\x30\xa5\x0b\x85\x88\x5e\ +\x02\x00\x3f\xb4\xca\xba\xb3\xf1\xff\x05\x41\xb0\x6f\xa3\xd1\x58\ +\xd7\xd9\xd4\x5b\xb8\x60\x80\x88\x86\x01\xe0\x06\x00\x78\x56\x8e\ +\xf8\xa3\x83\x83\x83\xfb\x8f\x8e\x8e\x3e\x9e\x23\x66\x22\xa8\x2a\ +\x08\xc5\x88\xc4\x88\x25\xef\x71\x31\x33\x1f\x9b\x37\xa8\xc7\x4b\ +\xc6\x00\x11\xdd\x08\x00\x07\x25\xb3\x4e\x6e\x85\x88\x9f\x89\xa2\ +\xe8\xfd\xc9\x3d\xf2\xb1\x2c\x55\x28\x61\x18\xbe\x53\x44\xfe\x2d\ +\x9f\xa9\xcc\x44\x41\xc4\x57\x45\x51\x74\xbd\x2b\x7c\x8f\x3b\x3b\ +\x03\x39\xde\x97\xcc\x1a\x00\x11\x0f\x8e\xa2\xc8\x7c\x5b\x15\x36\ +\x4a\x15\x0a\x11\xdd\x09\x00\x23\xae\x66\x2b\x22\x97\x68\xad\x8f\ +\x71\x85\xef\x71\x67\x67\x80\x88\xcc\xcd\xfb\xe1\x0e\xf9\xf9\x3c\ +\x33\xbf\xd7\x21\xfe\x0c\xe8\x52\x84\x52\xaf\xd7\xf7\x8c\xe3\xf8\ +\x90\x3c\x9e\x72\x75\x20\xeb\x0f\xcc\xfc\xa4\x22\x09\xed\xf7\x58\ +\x44\xf4\x4c\x00\xf8\x1f\xc7\x3c\xac\x1f\x18\x18\x78\xc9\x3d\xf7\ +\xdc\xf3\xa0\xe3\x38\x9b\xe1\x0b\x13\x4a\xad\x56\x7b\x6a\x10\x04\ +\xaf\x02\x00\x23\x10\xf3\xef\x82\x82\x26\x59\xea\x63\xc5\x82\xe6\ +\x58\x99\x30\x4a\xa9\x37\x21\xe2\x57\x0b\x48\xe8\x62\x11\xf9\x7e\ +\x10\x04\x37\x44\x51\xf4\x5b\xd7\xf1\x9c\x0a\x65\xe9\xd2\xa5\x3b\ +\x2c\x5a\xb4\xe8\x10\x23\x10\x11\x31\x02\xd9\xc1\xf5\x84\x66\xc1\ +\x7f\x1b\x33\x5f\x56\x42\xdc\xbe\x0c\xa9\x94\xfa\x3c\x22\x9e\x50\ +\xe0\xe4\x1b\x6d\xc1\x5c\x1f\x45\xd1\xcd\xae\xe2\xe6\x2e\x94\x91\ +\x91\x91\x05\xe3\xe3\xe3\x53\xc2\x30\xdf\x1c\x4f\x75\x95\x7c\x42\ +\xdc\x93\x99\xf9\x53\x09\x6d\xbd\x59\x46\x06\x88\xe8\x26\x00\x78\ +\x79\x46\x98\x54\xee\x22\x72\x2b\x00\x5c\x0b\x00\x57\x69\xad\xd7\ +\xa7\x02\x99\xc3\x29\x37\xa1\x84\x61\x38\x22\x22\x47\xb5\x2f\xad\ +\xf6\xcc\x33\xc9\x8c\x58\xa7\x30\xf3\xb9\x19\x31\xbc\x7b\x42\x06\ +\x88\xe8\x4b\x00\xf0\xd6\x84\xe6\xae\xcc\xfe\x04\x00\x57\x9b\x4b\ +\xc0\x28\x8a\xcc\xd2\xa6\xcc\x23\xb3\x50\x8c\x40\xe2\x38\x7e\x27\ +\x22\xbe\x33\x73\x36\x0e\x00\xe2\x38\x3e\xa6\xd9\x6c\x5e\xe2\x00\ +\xda\x43\xce\xc2\x00\x11\x99\x3f\x4a\x27\x55\x88\x1c\xf3\x9e\x6e\ +\x75\xd6\xcb\xef\xd4\x42\x19\x1a\x1a\xda\x63\x60\x60\xe0\x03\x55\ +\x15\xc8\x54\xa1\xfc\xbb\x94\x62\x3f\xb2\xae\xdf\x8d\x65\x98\xcd\ +\x9d\x22\x72\xba\xd6\xda\x5c\x1a\x5a\x8f\x54\x42\xa9\xd5\x6a\x47\ +\x9b\x55\xbe\x88\xb8\x87\x75\xc4\x82\x1d\x82\x20\x78\x66\xa3\xd1\ +\x78\xa0\xe0\xb0\x7d\x1b\x4e\x29\xb5\x0f\x22\xfe\xb8\xc2\x04\x7c\ +\x90\x99\x3f\x6e\x9b\x9f\x95\x50\xda\xdf\x22\x46\x20\x47\xdb\x06\ +\x2a\xc9\x7e\x0d\x33\x3f\xbf\xa4\xd8\x7d\x19\xd6\xec\x3b\x59\xb8\ +\x70\xe1\x6f\xaa\x3c\x79\x44\xfc\x26\x00\x9c\x1a\x45\xd1\x7d\x49\ +\xf3\x4c\x2c\x14\xb3\x78\xd1\x2c\x37\x41\xc4\x65\x49\xc1\xcb\xb6\ +\x13\x91\xf3\xb5\xd6\x27\x96\x9d\x47\xbf\xc5\x0f\xc3\xf0\x93\x16\ +\x1b\xef\x4a\xa1\x47\x44\xee\x45\xc4\xe3\x92\xee\x73\x49\x24\x94\ +\xf6\x0a\xdf\xeb\x00\x60\xdb\x52\x66\x95\x22\xa8\x88\xdc\xdf\x6a\ +\xb5\xf6\x5f\xbb\x76\xed\xfd\x29\xdc\xbd\x4b\x06\x06\xda\xdf\x2a\ +\xe6\xf2\xcb\x7a\x03\x5e\x86\xb0\x69\x5c\xff\x68\x5e\x7e\x27\x11\ +\x4b\x47\xa1\x38\x5a\x06\x9f\x66\x52\x56\x3e\xfe\x69\x97\x15\x5d\ +\xb9\x1b\x9b\xfb\xd8\x20\x08\x56\xe7\x0e\xec\x06\x70\xff\x4e\x62\ +\x99\x57\x28\xed\x35\x59\x89\xaf\xe3\xdc\xcc\x21\x15\xea\xa7\x98\ +\xf9\xe4\x54\x9e\xde\x29\x37\x06\x94\x52\xab\xbb\xe5\x7e\x56\x44\ +\x76\xd1\x5a\x3f\x36\xd7\xe4\xe7\x14\x4a\xfb\xeb\xd3\x5c\xb6\x6c\ +\x97\x1b\x73\xb3\x03\x99\x4b\xba\xcb\x44\xe4\x23\x79\xdc\xff\xf8\ +\x15\xc3\x8e\xab\x65\x09\x4f\x44\x57\x03\xc0\xab\x2d\xdd\xca\x30\ +\x9f\xf7\xc1\xcf\xac\x42\x59\xba\x74\xe9\xa2\xc5\x8b\x17\x5f\x05\ +\x00\x07\x3b\xca\xf8\x2e\x11\xb9\x2c\x8e\xe3\xaf\x8f\x8d\x8d\x3d\ +\x34\x15\x23\xeb\xf2\xec\xb2\x36\xf5\x38\xe2\xa8\x67\x60\xc3\x30\ +\x3c\x4e\x44\xfe\x35\xc3\x84\x4e\x0a\x82\xe0\xb2\x56\xab\x75\x24\ +\x22\x1e\x09\x00\x7b\x67\xc0\x9a\xcf\xf5\xc3\x73\x75\x7d\x99\x55\ +\x28\x44\xf4\x45\x00\x78\x7b\xce\xc9\x18\x41\x5c\x6e\xd6\xe1\x30\ +\xf3\x4f\xe6\xc2\x36\xfb\xe7\xcd\x4b\x4c\x11\x79\xba\x45\xfc\x3b\ +\x11\xf1\xa3\x51\x14\x7d\xdb\xc2\xc7\x9b\x16\xc8\x00\x11\x99\x45\ +\xb1\x66\xf5\x86\xcd\xb7\xcb\x35\x00\xf0\x89\xad\x3f\x2f\x4a\xa9\ +\xe5\x88\x78\xa8\x88\x18\xe1\xe4\xfa\x14\x16\x11\xff\x2e\x8a\xa2\ +\xaf\x6c\x4d\xcd\x0c\xa1\xd4\xeb\xf5\xd7\xc4\x71\x9c\xcb\xfa\x98\ +\x76\xb0\xab\x10\xf1\xca\x0d\x1b\x36\x5c\x75\xff\xfd\xf7\x6f\x4c\ +\x52\x9b\xe1\xe1\xe1\xa7\x0d\x0c\x0c\x18\xb1\x1c\x88\x88\xfb\xcd\ +\xe3\x73\x93\x88\x7c\x49\x6b\x6d\x04\xe8\x47\x17\x30\xd0\x16\x8c\ +\xd9\xd4\x75\x00\x00\xec\x3e\x4b\xca\x66\x8f\xc9\x5d\x00\x70\x11\ +\x33\x9b\x05\x8e\xf3\x8e\x30\x0c\xcd\x55\xcf\xa1\x71\x1c\xbf\x0e\ +\x11\x97\x74\xb2\x4f\xf0\x7b\x8e\xe3\x78\x65\xb3\xd9\xfc\xfd\x74\ +\xdb\x19\x42\x21\x22\xf3\x58\x6f\x9f\x04\x80\xf3\x9a\x20\xe2\xa5\ +\x71\x1c\x5f\x90\xb5\x6b\xc6\x5e\x7b\xed\xb5\xe3\xc4\xc4\xc4\xde\ +\xa6\x9b\x60\x1c\xc7\xbb\x22\xe2\x02\x44\xd4\x7f\xfe\xf3\x9f\x9b\ +\xfe\xd1\x6f\xd6\x2a\x95\xeb\x5f\xab\xd5\xf6\x0a\x82\x60\xc7\xa9\ +\x2c\xe2\x38\x5e\xdb\x6c\x36\x1f\x4e\x93\x95\xe9\x40\x19\xc7\xf1\ +\x2a\x00\x30\x3f\x03\x69\x30\xa6\x7c\x44\xe4\x0c\xad\xf5\xd9\x73\ +\x0a\x45\x29\x75\x0a\x22\x7e\x32\x4b\x10\xd3\x9e\x46\x44\x8c\x40\ +\xf2\xee\xac\x92\x31\x2d\xef\xde\x0f\x0c\x28\xa5\xcc\xfd\xcb\xaa\ +\xf6\xbd\x4c\xda\x29\x3f\xda\x6a\xb5\x56\x8e\x8d\x8d\xfd\x62\x0a\ +\x60\xf3\x37\x4a\xad\x56\x7b\x52\x10\x04\x9c\xb1\xbd\xcc\x11\xcc\ +\x9c\x47\xb3\xb3\xb4\x13\xf4\x7e\x9e\x81\x49\x06\x88\xe8\x08\x00\ +\xf8\x5a\x06\x3a\x2e\x64\xe6\xe3\x67\x08\x85\x88\x4c\x6b\x9f\xff\ +\xc8\x00\x7c\xac\xef\xff\x9b\x81\x3d\xef\x9a\x3b\x03\x61\x18\x9e\ +\x20\x22\x9f\x4f\x09\xfc\xfb\x38\x8e\x55\xb3\xd9\x9c\xdc\xff\xbf\ +\xf9\x1b\x85\x88\x4c\xf7\xf0\x97\xa6\x04\x5d\xc5\xcc\x9f\x4d\xe9\ +\xeb\xdd\x3c\x03\xce\x18\x50\x4a\x99\xf7\x73\x67\xa4\x09\x20\x22\ +\x27\x6a\xad\xcf\xdf\x2c\x94\x30\x0c\x5f\x2c\x22\x3f\x4a\x09\x36\ +\xe3\xc6\x27\x0d\x8e\xf7\xf1\x0c\xb8\x62\x20\x0c\xc3\x8b\x44\xe4\ +\xef\x53\xe0\xdf\xc6\xcc\xfb\x6e\x16\x8a\x52\xea\x3c\x44\x4c\xd3\ +\x7d\xef\xa7\xcc\xbc\x32\x45\x02\xde\xc5\x33\x50\x28\x03\x61\x18\ +\x9a\x97\xdc\x2b\x6c\x83\x8a\xc8\x01\xe6\xc1\xd4\xe4\xa5\x17\x11\ +\x99\x17\x80\x69\x3e\xf0\x6f\x65\xe6\x2f\xdb\x06\xf7\xf6\x9e\x81\ +\xa2\x19\xc8\x70\xbf\xf2\x59\x66\x5e\x85\xa6\xa5\xd0\xe2\xc5\x8b\ +\x9f\x48\x91\xb8\x39\x15\xe9\x65\x29\xfc\xbc\x8b\x67\xa0\x70\x06\ +\xea\xf5\xfa\x76\xad\x56\xeb\xae\x14\x6f\xf2\x1b\xcc\xbc\x1c\x95\ +\x52\x07\x21\xa2\x69\xa8\x6c\x35\x10\xf1\x75\x7e\xc9\x88\x15\x65\ +\xde\xb8\x64\x06\xc2\x30\x3c\x55\x44\x3e\x61\x9b\x06\x22\x0e\x63\ +\xca\xb3\x49\x7e\xc9\xcc\x4b\x6d\x03\x7a\x7b\xcf\x40\x99\x0c\xd4\ +\xeb\xf5\x5d\xe3\x38\x36\xcb\x63\x9e\x61\x93\x87\x88\x9c\x60\x84\ +\x92\x66\x01\xe4\xb7\x98\xd9\x1c\x12\xe3\x87\x67\xa0\xab\x18\x50\ +\x4a\x5d\x81\x88\x87\x59\x26\xfd\x2d\x23\x94\x34\xef\x4f\xe6\x5c\ +\x8e\x6c\x99\x80\x37\xf7\x0c\x14\xca\x00\x11\x9d\x03\x00\xb6\x9b\ +\xfa\xee\x30\xf7\x28\xeb\x6c\x6f\x70\x44\xe4\x15\x69\xfb\x23\x15\ +\xca\x8a\x0f\xe6\x19\xd8\x8a\x01\x22\xfa\x07\x00\xb8\xd0\x92\x98\ +\x75\xe6\x1b\xc5\xb4\x9f\x5c\x6c\xe3\xb8\x71\xe3\xc6\x27\xaf\x5f\ +\xbf\xfe\x77\x36\x3e\xde\xd6\x33\x50\x05\x06\xea\xf5\xfa\x81\x71\ +\x1c\xdb\x36\xf3\x7e\xc8\x08\x45\x6c\x27\xc0\xcc\x1d\x9b\x52\xd8\ +\x62\xf6\xba\x3d\x11\x99\x63\xa0\xcd\xf2\x6f\xf3\x33\x38\xf5\x2f\ +\x22\x0e\x88\xc8\xd4\xff\x9f\xfc\xdd\x56\xff\x6d\xf2\x77\x5b\xfd\ +\xb7\xd3\xd3\x34\x71\xeb\x75\x8e\x93\xcc\x2f\xe5\xf9\x2d\x7f\xf0\ +\x42\x49\xc2\x6e\x46\x9b\x94\x7f\xc5\xe6\x8b\xba\x81\x99\xcb\x38\ +\x42\x23\x23\x13\xd5\x70\x4f\xf3\xe5\xe0\x85\x52\x40\xed\x5c\x1c\ +\xfc\x29\x22\x47\x6b\xad\x2f\x2d\x20\xfd\x9e\x0b\xe1\x85\x52\xc1\ +\x92\xb6\xb7\x35\xff\xaf\x83\xd4\xd6\x31\xf3\x90\x03\xdc\x9e\x87\ +\xf4\x42\xa9\x60\x89\x33\x2c\x38\xed\x38\x1b\x44\x7c\x99\xcb\x53\ +\xa6\x3a\x26\xd0\xa5\x06\x5e\x28\x15\x2c\x5c\x9a\xa2\x24\x9d\x06\ +\x22\xfe\x20\x8a\xa2\x03\x93\xda\x7b\xbb\xbf\x30\x90\xa6\x26\xfe\ +\x1e\xc5\xe1\xa7\x47\x29\xf5\x0e\x44\xfc\x77\x87\x21\x40\x44\x94\ +\xd6\xba\xe9\x32\x46\xaf\x61\x7b\xa1\x54\xac\xa2\x69\x5e\xe6\xa6\ +\x98\xc2\x97\x99\xb9\xec\xa3\xe0\x52\xa4\x5d\x9e\x8b\x17\x4a\x79\ +\xdc\xcf\x88\x4c\x44\x7f\x03\x00\xb7\x15\x91\xd2\xe0\xe0\xe0\x4e\ +\xa3\xa3\xa3\x8f\x17\x11\xab\x17\x62\x78\xa1\x54\xa8\x8a\x44\xf4\ +\x2d\xd3\x98\xad\x88\x94\x10\xf1\x9c\x28\x8a\x4e\x2d\x22\x56\x2f\ +\xc4\xf0\x42\xa9\x48\x15\xdb\x4d\xfb\x7e\x5b\x64\x3a\x7e\xb5\x44\ +\x72\xb6\xbd\x50\x92\x73\xe5\xd4\x92\x88\x3e\x0a\x00\x1f\x74\x1a\ +\x64\x26\xf8\xfb\x98\xf9\x73\x05\xc7\xec\xca\x70\x5e\x28\x15\x29\ +\x5b\x9a\x85\xa6\x39\xa4\xfe\x30\x33\x3f\x2d\x07\x9c\x9e\x87\xf0\ +\x42\xa9\x40\x89\xc3\x30\x7c\x8b\x88\x94\xd2\x70\x23\x08\x82\xc3\ +\x1b\x8d\x86\x39\xc8\xd3\x8f\x79\x18\xf0\x42\xa9\xc0\xc7\x83\x88\ +\x46\x01\x60\x79\x49\xa9\xdc\xc5\xcc\x23\x25\xc5\xee\x9a\xb0\x5e\ +\x28\x25\x97\xaa\x56\xab\xad\x08\x82\xc0\xec\xc9\x2e\x73\xec\x33\ +\xdf\xf9\x33\x65\x26\x56\x95\xd8\x5e\x28\x25\x57\x22\x0c\xc3\xcb\ +\x45\xe4\xcd\x25\xa7\x71\x2d\x33\xdb\x1c\xd6\x53\x72\xba\xc5\x87\ +\xf7\x42\x29\x9e\xf3\xcd\x11\xdb\xc7\xf9\x25\x3a\x28\xc9\x75\x9a\ +\x83\x83\x83\x7b\x8e\x8e\x8e\xfa\x63\xc3\xe7\x20\xda\x0b\xc5\xf5\ +\x27\x70\x1e\x7c\xa5\xd4\xe9\x88\x78\x56\x89\x29\x4c\x0f\xfd\x6f\ +\xcc\xfc\xae\x8a\xe4\x52\xb9\x34\xbc\x50\x4a\x2c\x09\x11\x3d\x0a\ +\x00\x3b\x97\x98\xc2\x16\xa1\x1f\x7f\xfc\xf1\x6d\x1f\x78\xe0\x01\ +\xd3\x0f\xc1\x8f\xad\x18\xf0\x42\x29\xe9\x23\x41\x44\xa6\xc7\xd9\ +\x95\x25\x85\x9f\x35\x2c\x22\x7e\x28\x8a\xa2\x8f\x54\x29\xa7\xaa\ +\xe4\xe2\x85\x52\x52\x25\x88\xe8\x76\x00\x78\x51\x49\xe1\xe7\x0a\ +\xbb\x91\x99\xb7\xa9\x58\x4e\x95\x48\xc7\x0b\xa5\x84\x32\x84\x61\ +\x38\x24\x22\x63\x25\x84\xee\x18\xd2\x9c\x09\xa2\xb5\xce\x72\x8a\ +\x5a\xc7\x18\xdd\x68\xe0\x85\x52\x42\xd5\x52\xb6\xa4\x2d\x2a\xd3\ +\xfb\x98\xf9\xd9\x45\x05\xeb\x96\x38\x5e\x28\x25\x54\x2a\x0d\xe9\ +\x45\xa6\x89\x88\xaf\x8a\xa2\xe8\xfa\x22\x63\x56\x3d\x56\x9a\x9a\ +\xf9\xad\xc0\x19\xaa\x4a\x44\xff\x08\x00\x9f\xca\x00\xe1\xdc\x15\ +\x11\x6f\x8d\xa2\xe8\xc5\xce\x03\x75\x51\x00\x2f\x94\x82\x8b\x45\ +\x44\xbf\x02\x80\xdd\x0b\x0e\x6b\x1d\x2e\x8e\xe3\x15\xcd\x66\xd3\ +\xac\x41\xf3\xc3\x37\x97\x28\xf6\x33\x10\x86\xe1\x2b\x45\xa4\x5b\ +\x2e\x69\xbe\xce\xcc\x6f\x2a\x96\xa1\xea\x46\xf3\xdf\x28\x05\xd6\ +\x86\x88\x7e\x00\x00\xfb\x17\x18\x32\x53\xa8\x56\xab\xf5\xf4\xb1\ +\xb1\xb1\x87\x32\x81\xf4\x88\xb3\x17\x4a\x41\x85\x1c\x1e\x1e\x7e\ +\xd6\xc0\xc0\x40\x57\xad\xa5\x12\x91\xf3\xb5\xd6\x27\x16\x44\x51\ +\xa5\xc3\x78\xa1\x14\x54\x9e\x30\x0c\xbf\x20\x22\xc7\x17\x14\x2e\ +\xb7\x30\xcc\x6c\xba\xe5\xc7\xb9\x01\x76\x29\x90\x17\x4a\x41\x85\ +\x23\x22\xf3\x61\xcb\xfd\xe8\x0b\x44\xfc\x66\x1c\xc7\xe3\x88\x78\ +\xa4\xa3\xa9\x9c\xcc\xcc\x95\x7e\x4a\xe7\x68\xde\x5b\xc0\x7a\xa1\ +\x14\xc0\xb2\x52\xea\xdd\x88\x78\x81\xa3\x50\x2f\x47\xc4\x71\x11\ +\x31\x67\xa9\xb8\x18\x8f\x31\xf3\x2e\x2e\x80\xbb\x09\xd3\x0b\xa5\ +\x80\x6a\x11\xd1\xbd\x00\xf0\x1c\x07\xa1\x46\x99\x79\x85\xc1\x55\ +\x4a\xdd\x8c\x88\x4e\x7a\x0a\x8b\xc8\x91\x5a\xeb\xaf\x3a\xc8\xbf\ +\x6b\x20\xbd\x50\x1c\x97\x8a\x88\x5e\x02\x00\x3f\x74\x14\xe6\xdd\ +\xcc\xfc\x2f\x06\x9b\x88\xde\x08\x00\x5f\x77\x14\x27\x62\xe6\xba\ +\x23\xec\xae\x80\xf5\x42\x71\x5c\x26\x22\xba\x0e\x00\x0e\x76\x10\ +\xe6\xf7\xcc\xbc\x23\x00\xb4\xa6\xb0\x89\x28\x32\x9a\x71\x10\xcb\ +\x34\xf6\x3e\x40\x6b\xed\x4a\xf0\x2e\x52\xce\x15\xd3\x0b\x25\x57\ +\x3a\xb7\x04\xab\xd7\xeb\xbb\xc6\x71\xfc\x88\x8b\x10\x22\x72\x9e\ +\xd6\xda\x2c\x87\xd9\x3c\x88\xe8\x3d\x00\xe0\xaa\xa1\xdd\x4d\xcc\ +\xfc\x0a\x17\x73\xe9\x06\x4c\x2f\x14\x87\x55\x22\xa2\x73\x01\xe0\ +\x24\x17\x21\x82\x20\x18\x6a\x34\x1a\xeb\xa6\x63\x8f\x8c\x8c\x2c\ +\xd8\xb4\x69\xd3\x83\x00\xf0\x14\x17\x31\x01\xa0\xc6\xcc\x95\xdc\ +\x1e\xe0\x68\xbe\xd3\xff\x08\x59\x1f\xf0\xeb\x17\x45\x26\xac\x0a\ +\x11\xfd\x1e\x00\xb6\x4b\x68\x9e\xd8\x0c\x11\xaf\x8e\xa2\xe8\xb5\ +\xb3\x39\x10\xd1\xd9\x00\x70\x5a\x62\x30\x3b\xc3\xd5\xcc\xfc\x76\ +\x3b\x97\xde\xb0\xf6\xdf\x28\x8e\xea\x18\x86\xe1\x31\x22\x72\xb1\ +\x23\xf8\x43\x98\xd9\xdc\xfb\xcc\x18\x29\x8f\x7a\x4e\x9c\xa6\x88\ +\xec\xa2\xb5\x7e\x2c\xb1\x43\x8f\x18\x7a\xa1\x38\x2a\xa4\xc3\xee\ +\x8f\x4d\x66\x56\xf3\xa5\x4d\x44\xe6\xc4\xae\x77\xb8\x98\x1a\x22\ +\x9e\x1d\x45\xd1\x19\x2e\xb0\xab\x8c\xe9\x85\xe2\xa0\x3a\xf5\x7a\ +\xfd\x45\x71\x1c\x9b\x3d\xf1\x2e\xc6\x2a\x66\xfe\x6c\x07\xa1\x3c\ +\x1f\x00\xee\x70\x11\x1c\x11\x5b\x51\x14\x0d\xba\xc0\xae\x32\xa6\ +\x17\x8a\x83\xea\x84\x61\x78\x85\x88\x1c\xe6\x00\x7a\x7c\xfb\xed\ +\xb7\xdf\xf1\xf6\xdb\x6f\xef\xd8\x52\x88\x88\xae\x06\x00\x57\xdd\ +\x1f\x37\xbf\xbf\x71\x30\xc7\x4a\x42\x7a\xa1\xe4\x5c\x96\xa5\x4b\ +\x97\xee\xb0\x78\xf1\xe2\x27\x72\x86\x9d\x84\x13\x91\x2f\x68\xad\ +\xcd\x23\xe0\x8e\x83\x88\x0e\x01\x80\x6b\x3a\x1a\xa6\x33\xf8\x15\ +\x33\xff\x55\x3a\xd7\xee\xf4\xf2\x42\xc9\xb9\x6e\x4a\xa9\xb3\x10\ +\xf1\xf4\x9c\x61\x27\xe1\x10\xb1\x1e\x45\x91\x79\xa9\x98\x68\x10\ +\xd1\xcf\x00\xe0\x05\x89\x8c\xed\x8d\x5e\xcf\xcc\xe6\x28\xbd\xbe\ +\x18\x5e\x28\x39\x97\x59\x29\xf5\x1b\x44\x5c\x92\x33\xac\x11\xc9\ +\x8d\x51\x14\xbd\xd2\x06\x97\x88\x8e\x05\x00\x27\xad\x87\x44\xe4\ +\x67\x5a\xeb\xaa\xf5\x25\xb3\xa1\xc7\xca\xd6\x0b\xc5\x8a\xae\xf9\ +\x8d\x95\x52\x6f\x46\xc4\xcb\x73\x84\x9c\x0e\xf5\x06\x66\xbe\xca\ +\x16\x9b\x88\xcc\x66\xb1\x67\xd9\xfa\x25\xb1\x47\xc4\xbf\x89\xa2\ +\xc8\xd5\x43\x8b\x24\x29\x14\x66\xe3\x85\x92\x23\xd5\x44\xf4\x13\ +\x00\x58\x99\x23\xe4\x14\xd4\x7a\x66\x4e\xb5\xfa\x98\x88\xcc\xb9\ +\x90\xe6\x7c\x48\x17\xe3\x2a\x66\x7e\x83\x0b\xe0\xaa\x61\x7a\xa1\ +\xe4\x54\x11\xa5\xd4\x72\x44\x74\xd2\xb5\x44\x44\x4e\xd5\x5a\x9f\ +\x93\x26\xd5\xf6\xc3\x05\xb3\xde\x6c\x71\x1a\xff\x4e\x3e\x88\xf8\ +\xec\x28\x8a\xee\xeb\x64\xd7\xed\xbf\xf7\x42\xc9\xa9\x82\x44\x74\ +\x29\x00\xbc\x2d\x27\xb8\xe9\x30\x32\x38\x38\xb8\xf3\xe8\xe8\xe8\ +\xe3\x69\xb1\x89\xc8\xbc\x77\x79\x6f\x5a\xff\xf9\xfc\x6c\x9e\xc4\ +\xb9\x88\x5f\x14\xa6\x17\x4a\x0e\x4c\xb7\x17\x23\x8e\xe7\x00\x35\ +\x03\x42\x44\x2e\xd2\x5a\x1f\x97\x05\x7b\xf9\xf2\xe5\xcb\x5a\xad\ +\xd6\x16\x0b\x28\xb3\xe0\x6d\xed\xbb\x68\xd1\xa2\xed\xd6\xac\x59\ +\xf3\xc7\x3c\x31\xab\x86\xe5\x85\x92\x43\x45\x1c\xdf\x07\xec\xcd\ +\xcc\x77\x66\x4d\x93\x88\xcc\xa6\x2e\xb3\xb9\xcb\xc5\xf8\x20\x33\ +\x7f\xdc\x05\x70\x55\x30\xbd\x50\x72\xa8\x04\x11\xfd\x37\x00\xe4\ +\xfe\x02\x0e\x11\x7f\x10\x45\x51\x2e\xdb\x7b\xc3\x30\x7c\xb1\x88\ +\xfc\x28\x87\xe9\xce\x06\xb1\x81\x99\x77\x70\x84\x5d\x09\x58\x2f\ +\x94\x8c\x65\x08\xc3\xf0\x50\x11\x71\xf2\xe2\xcd\x1c\x82\xaa\xb5\ +\xfe\x5a\xc6\x14\x37\xbb\x13\x91\x69\x40\xf1\xb7\x79\xe1\x4d\xc7\ +\x41\xc4\xb7\x47\x51\xb4\xda\x05\x76\x15\x30\xbd\x50\x32\x56\xc1\ +\x61\x53\x87\xff\x66\xe6\x3d\x32\xa6\xb7\x85\xbb\xe3\x7d\xf5\xeb\ +\x98\x79\x28\xcf\x7c\xab\x84\xe5\x85\x92\xa1\x1a\x43\x43\x43\xcb\ +\x06\x07\x07\x9d\xdc\x24\x8b\xc8\x19\x5a\x6b\xb3\x09\x2b\xd7\x41\ +\x44\x66\x87\xa2\x93\x0f\x34\x22\x1e\x1c\x45\xd1\x0d\xb9\x26\x5c\ +\x11\x30\x2f\x94\x0c\x85\x20\xa2\x7f\x05\x80\x4c\x4f\xa4\xe6\x0a\ +\x1f\x04\xc1\x6e\x8d\x46\xe3\xd7\x19\xd2\x9b\xd5\x95\x88\xcc\x63\ +\xe2\x79\x97\xe9\xa7\x8d\x99\xe7\x3d\x55\xda\x1c\x5c\xf9\x79\xa1\ +\x64\x60\x96\x88\x26\x00\xc0\xb4\x1c\xcd\x75\x88\xc8\x25\x5a\xeb\ +\x63\x72\x05\x9d\x06\x46\x44\x66\x87\xe2\x4e\x2e\xf0\x83\x20\x18\ +\x69\x34\x1a\x77\xb9\xc0\x2e\x13\xd3\x0b\x25\x25\xfb\x4a\xa9\xf7\ +\x23\xe2\x79\x29\xdd\x3b\xb9\xed\xc3\xcc\x66\x39\x8c\x93\x41\x44\ +\x66\x49\x8b\x59\xda\xe2\x62\x7c\x99\x99\xdf\xea\x02\xb8\x4c\x4c\ +\x2f\x94\x94\xec\x3b\xbc\xd6\xff\x31\x33\xef\x97\x32\xad\x44\x6e\ +\xb5\x5a\xed\xa9\x41\x10\x38\x3b\xce\x61\x60\x60\x60\xf7\x7b\xee\ +\xb9\xc7\x74\x83\xe9\x99\xe1\x85\x92\xa2\x94\x4a\xa9\x83\xcc\xb2\ +\xf7\x14\xae\x1d\x5d\x44\xe4\x28\xad\xf5\x97\x3a\x1a\x66\x34\x70\ +\x79\xe0\x2a\x22\x9e\x13\x45\xd1\xa9\x19\x53\xac\x94\xbb\x17\x4a\ +\x8a\x72\x38\xdc\x66\xfb\x10\x33\x3f\x3d\x45\x4a\xd6\x2e\xb5\x5a\ +\x6d\xaf\x20\x08\xee\xb6\x76\x4c\xe8\xc0\xcc\x66\x5f\xfd\xe6\x2e\ +\x96\x09\xdd\x2a\x6b\xe6\x85\x62\x59\x1a\x97\xed\x80\x44\xe4\x23\ +\x5a\xeb\x0f\x59\xa6\x94\xda\xdc\x61\xbb\x57\xb3\x6d\xf9\x44\xad\ +\xf5\xf9\xa9\x93\xab\x98\xa3\x17\x8a\x65\x41\x94\x52\xe7\x21\xe2\ +\xfb\x2d\xdd\x12\x99\x07\x41\xf0\xcc\x46\xa3\xf1\x40\x22\xe3\x1c\ +\x8c\x5c\x5e\x42\x02\xc0\xc3\xcc\xfc\xb4\x1c\xd2\xac\x04\x84\x17\ +\x8a\x65\x19\x88\xe8\x77\x00\xb0\xbd\xa5\x5b\x47\x73\x11\xb9\x5c\ +\x6b\xfd\x96\x8e\x86\x39\x1b\x10\xd1\x1a\x00\x78\x5e\xce\xb0\x93\ +\x70\x22\xf2\x16\xad\xb5\xab\x1d\x9f\x2e\x52\x9e\x13\xd3\x0b\xc5\ +\x82\x6e\x22\x7a\x17\x00\x4c\x1e\xb3\xe0\x60\xec\xcf\xcc\xae\x0e\ +\x03\x9a\x33\x5d\xa5\xd4\x51\x88\x78\x89\x83\xf9\x18\xc8\xbb\x98\ +\x79\xc4\x11\x76\xa1\xb0\x5e\x28\x16\x74\xbb\xfa\xeb\x8b\x88\x3f\ +\x8b\xa2\xa8\xb4\x46\x0d\x44\x64\x2e\xf7\x9e\x61\x41\x45\x62\x53\ +\x11\x39\x50\x6b\x6d\x4e\x43\xee\xea\xe1\x85\x92\xb0\x7c\x8e\x97\ +\xa9\xbf\x83\x99\xbf\x98\x30\x95\xdc\xcd\xc2\x30\x3c\x55\x44\x3e\ +\x91\x3b\xf0\x5f\x00\xaf\x65\x66\x57\x8d\xf8\x1c\xa5\x3c\x13\xd6\ +\x0b\x25\x21\xd5\x0e\x37\x3e\x3d\xca\xcc\xb9\xb7\x37\x4a\x38\xad\ +\x49\xb3\x91\x91\x91\x6d\x37\x6d\xda\x64\xee\xbd\x72\x5f\x8e\x63\ +\xf0\xe3\x38\xa6\x66\xb3\xa9\x6d\x72\xaa\x9a\xad\x17\x4a\x82\x8a\ +\x2c\x5b\xb6\x6c\xc9\xc2\x85\x0b\x7f\x93\xc0\xd4\xda\xc4\xfc\x25\ +\xd7\x5a\x7f\xc0\xda\x31\x67\x87\x30\x0c\xcf\x17\x91\x55\x39\xc3\ +\x4e\xc2\xe5\xb1\x9d\xd9\x45\x5e\x36\x98\x5e\x28\x09\xd8\x72\x7c\ +\xe6\xc8\xfe\x09\x52\x28\xca\xc4\xd9\xd1\x73\x13\x13\x13\x4b\xd6\ +\xae\x5d\xfb\x68\x51\x13\xc9\x3b\x8e\x17\x4a\x02\x46\x89\xe8\x61\ +\x00\xd8\x2d\x81\xa9\x37\x99\x83\x81\xa2\x5f\xa6\xe6\x5d\x08\x2f\ +\x94\x0e\x8c\x3a\x7e\x7c\x9a\x77\x3d\xab\x8c\xb7\x91\x99\xb7\xa9\ +\x72\x82\xf3\xe5\xe6\x85\xd2\xa1\x72\x44\x74\x2b\x00\xec\xdb\xad\ +\x05\xae\x52\xde\x22\x72\xbc\xd6\xfa\xc2\x2a\xe5\x94\x34\x17\x2f\ +\x94\x79\x98\x52\x4a\xed\x8d\x88\x3f\x4f\x4a\xa6\xb7\xeb\xc8\xc0\ +\x7d\xcc\xfc\xec\x8e\x56\x15\x34\xf0\x42\x99\x5f\x28\xab\x11\xf1\ +\xe8\x0a\xd6\xad\x9b\x53\x4a\xd5\x6c\xbc\xec\x09\x7b\xa1\xcc\x51\ +\x81\x7a\xbd\xbe\x5d\x1c\xc7\xe6\x54\x5f\x3f\x72\x64\x00\x11\x6f\ +\x8d\xa2\xe8\xc5\x39\x42\x16\x02\xe5\x85\x32\x07\xcd\x8e\xbb\x3f\ +\x16\x52\xdc\xaa\x06\x11\x91\x7d\xb5\xd6\xb7\x55\x35\xbf\xd9\xf2\ +\xf2\x42\x99\x5b\x28\xa6\x43\xfb\x9e\xdd\x54\xcc\x2e\xca\xf5\x1b\ +\xcc\x7c\x44\x17\xe5\x0b\x5e\x28\xb3\x54\xcb\x71\xa3\xb8\x6e\xfa\ +\x7c\xb8\xcc\x75\x29\x33\xff\xd2\x65\x80\x3c\xb1\xbd\x50\x66\x17\ +\xca\x77\x01\xe0\x65\x79\x12\xed\xb1\x66\x30\xf0\x39\x66\x7e\x5f\ +\xb7\xf0\xe2\x85\xb2\x55\xa5\xea\xf5\x3a\xc5\x71\x9c\xf8\x40\xd1\ +\x6e\x29\x74\x15\xf3\x8c\xe3\x78\xfb\x66\xb3\xd9\x15\x0f\x4c\xbc\ +\x50\xb6\xfa\x04\x11\xd1\x05\x00\xf0\xee\x2a\x7e\xb0\x7a\x30\xa7\ +\xd3\x98\xf9\x63\xdd\x30\x2f\x2f\x94\x2d\xab\x14\x10\xd1\x9f\x00\ +\x60\x61\x37\x14\xaf\x07\x72\x7c\x8c\x99\x77\xe9\x86\x79\x78\xa1\ +\x4c\xab\x92\x52\x6a\x15\x22\xf6\x4c\xe7\x90\x6e\xf8\x00\x02\xc0\ +\xb1\xcc\x7c\x71\xd5\x73\xf5\x42\x99\x56\xa1\x30\x0c\x59\x44\x54\ +\xd5\x8b\xd6\x63\xf9\x45\xcc\x5c\xaf\xfa\x9c\xbc\x50\xda\x15\x22\ +\xa2\x43\x00\xe0\x9a\xaa\x17\xac\x47\xf3\x3b\x84\x99\xaf\xab\xf2\ +\xdc\xbc\x50\xda\xd5\x51\x4a\x7d\x1b\x11\x5f\x5b\xe5\x62\xf5\x70\ +\x6e\xdf\x65\xe6\x83\xaa\x3c\x3f\x2f\x14\x00\xf3\xd6\xd5\xac\x68\ +\x5d\x5f\xe5\x42\xf5\x41\x6e\xb9\x1c\xea\xea\x8a\x27\x2f\x94\xbf\ +\x08\xe5\x5c\x00\x38\xc9\x15\xc9\x1e\x37\x11\x03\x5f\x62\xe6\xa3\ +\x12\x59\x96\x60\xe4\x85\xf2\x17\xa1\xfc\x16\x00\x76\x2c\x81\x7f\ +\x1f\x72\x1a\x03\x45\xb7\x94\xb5\x21\xbf\xef\x85\x12\x86\xe1\x71\ +\x22\x62\x8e\x98\x73\x31\x0a\xef\xfc\xe8\x62\x12\x5b\x61\xfe\xb5\ +\x8b\xa3\xc2\xdb\x31\xce\x65\xe6\x53\x0a\x98\x83\x75\x88\xbe\x17\ +\x0a\x11\xdd\x01\x00\xcf\xb7\x66\xae\xb3\xc3\x38\x33\x2f\xea\x6c\ +\xd6\x5d\x16\x2e\xdb\xca\x22\x62\x6b\xe1\xc2\x85\xdb\xac\x59\xb3\ +\xe6\xcf\x55\x63\xa5\xaf\x85\xa2\x94\x3a\x00\x11\xbf\xef\xa8\x28\ +\x1f\x63\xe6\xd3\x1c\x61\x97\x0a\x4b\x44\xe6\xdc\x93\xc0\x51\x12\ +\x27\x31\xf3\xa7\x1d\x61\xa7\x86\xed\x6b\xa1\x84\x61\x78\xb9\x88\ +\xbc\x39\x35\x7b\xf3\x38\x22\xe2\xce\x51\x14\x99\x7b\x9f\x9e\x1b\ +\x8e\xfb\x9c\xfd\x8a\x99\xff\xaa\x6a\xa4\xf5\xad\x50\x96\x2f\x5f\ +\xfe\x8c\x56\xab\xe5\xea\x2c\x92\xeb\x98\xd9\xbc\xc0\xec\xc9\x51\ +\xab\xd5\x9e\x14\x04\xc1\x06\x57\x93\x43\xc4\xbf\x8b\xa2\xe8\x2b\ +\xae\xf0\xd3\xe0\xf6\xad\x50\x94\x52\x67\x22\xe2\x3f\xa7\x21\x2d\ +\x81\x4f\x29\x47\x38\x24\xc8\x2b\x37\x93\x30\x0c\x2f\x31\xe7\x4d\ +\xe6\x06\xb8\x25\xd0\xcf\x99\xf9\x85\x8e\xb0\x53\xc1\xf6\xad\x50\ +\xc2\x30\x7c\x50\x44\x5c\x9c\x97\x58\xc9\x4b\x87\x54\x9f\x8e\x79\ +\x9c\xc2\x30\x1c\x12\x91\xb1\xbc\x71\xa7\xf0\x10\xf1\x65\x51\x14\ +\xdd\xec\x0a\xdf\x16\xb7\x2f\x85\x42\x44\xe6\x1c\x74\x57\x27\xef\ +\xbe\x8f\x99\x3f\x67\x5b\x88\x6e\xb4\x57\x4a\xdd\x8c\x88\x07\x3a\ +\xca\xfd\x1a\x66\x7e\x8d\x23\x6c\x6b\xd8\x7e\x15\xca\x8f\x00\xc0\ +\x49\xcb\x1c\x66\x46\xeb\x2a\x74\xa9\x43\x18\x86\x2f\x15\x91\xef\ +\xb9\x4a\x3f\x08\x82\xb0\xd1\x68\xb0\x2b\x7c\x1b\xdc\xbe\x13\x4a\ +\xbd\x5e\x7f\x51\x1c\xc7\xb7\xdb\x90\x64\x61\xfb\x45\x66\x7e\x87\ +\x85\x7d\xd7\x9b\x12\xd1\x5a\x00\x78\xae\x8b\x89\x20\xe2\xbf\x47\ +\x51\xf4\x4e\x17\xd8\xb6\x98\x7d\x27\x14\x22\xfa\x0f\xb3\x59\xc8\ +\x96\xa8\x84\xf6\x35\x66\x76\x76\xdd\x9e\x30\x87\x42\xcd\xc2\x30\ +\x3c\x5a\x44\x56\xbb\x0a\xba\x60\xc1\x82\x5d\xef\xbe\xfb\x6e\x27\ +\x67\xd3\xd8\xe4\xdc\x57\x42\x51\x4a\xed\x8c\x88\xae\xce\xe8\xb8\ +\x93\x99\xf7\xb6\x21\xbf\x57\x6c\x89\xc8\x34\x88\xd8\xce\xc5\x7c\ +\x10\xf1\xec\x28\x8a\xce\x70\x81\x6d\x83\xd9\x57\x42\x09\xc3\xf0\ +\x9f\x44\xe4\xe3\x36\x04\x59\xd8\xbe\x89\x99\xbf\x6e\x61\xdf\x33\ +\xa6\x4a\xa9\xd3\x11\xf1\x2c\x47\x13\xda\xc0\xcc\x3b\x38\xc2\x4e\ +\x0c\xdb\x57\x42\x21\x22\xb3\xe7\xc4\x45\x37\xf5\x9e\x5c\xd7\x95\ +\xf4\x53\x74\xf8\xe1\x87\x0f\x8c\x8d\x8d\x4d\x24\xb5\xb7\xb5\x13\ +\x91\x13\xb4\xd6\xa6\x3b\x4e\x69\xa3\x6f\x84\xa2\x94\x7a\x03\x22\ +\x7e\xd3\x11\xd3\x3d\xbb\xae\x2b\x29\x5f\x44\x64\x56\x60\x1f\x97\ +\xd4\xde\xc6\x4e\x44\xee\xd5\x5a\x3b\x79\x60\x90\x34\x8f\xbe\x11\ +\x4a\x18\x86\x37\x88\xc8\x2b\x92\x12\x63\x63\xd7\xcb\xeb\xba\x92\ +\xf2\x30\x34\x34\xb4\xc7\xe0\xe0\xe0\x7f\x25\xb5\xb7\xb5\x13\x91\ +\xc3\xb5\xd6\xae\xfe\xd0\x75\x4c\xa7\x2f\x84\x42\x44\xa6\xcb\xc7\ +\x3d\x1d\xd9\x48\x67\xd0\xd3\xeb\xba\x6c\x28\x21\xa2\x6b\x01\xe0\ +\x55\x36\x3e\x49\x6d\x45\xe4\x56\xad\xb5\x93\x77\x5f\x49\x72\xe8\ +\x17\xa1\x98\x37\xe5\xef\x49\x42\x48\x0a\x9b\x9e\x5f\xd7\x95\x94\ +\x93\x5a\xad\xb6\x6f\x10\x04\xe6\x28\x3f\x27\x23\x8e\xe3\xfd\x9a\ +\xcd\xe6\x8f\x9d\x80\x77\x00\xed\x79\xa1\xec\xbe\xfb\xee\xdb\xec\ +\xb4\xd3\x4e\x8f\x8a\x88\x8b\x83\x36\xfb\x62\x5d\x97\xcd\x07\x93\ +\x88\x46\x01\x60\xb9\x8d\x8f\x85\xed\x15\xcc\xfc\x46\x0b\xfb\xdc\ +\x4c\x7b\x5e\x28\x44\xf4\x5e\x00\xf8\x6c\x6e\x8c\x6d\x09\xd4\x37\ +\xeb\xba\x92\xf2\xa7\x94\x7a\x13\x22\x7e\x35\xa9\xbd\xad\x5d\xab\ +\xd5\x5a\x36\x36\x36\xf6\x0b\x5b\xbf\xac\xf6\xfd\x20\x94\x06\x00\ +\x84\x59\x89\x9a\xcd\xbf\x9f\xd6\x75\xd9\xf0\x47\x44\xff\x07\x00\ +\x4e\x7a\x0a\x8b\xc8\x17\xb4\xd6\xae\x2e\xa3\xe7\x9c\x66\x4f\x0b\ +\x25\x0c\xc3\x57\x8a\xc8\xf5\x36\x45\xb6\xb0\xed\xbb\x75\x5d\x49\ +\xb9\x21\x22\xd3\xfa\xc9\xb4\x80\x72\x32\x36\x6e\xdc\xf8\xe4\xf5\ +\xeb\xd7\xff\xce\x09\xf8\x1c\xa0\x3d\x2d\x14\x22\xba\x12\x00\x5e\ +\xef\x88\xd0\xbe\x5b\xd7\x65\xc3\x63\x9a\x0f\x96\x05\xfe\xe9\xcc\ +\xfc\x51\x0b\xfb\xcc\xa6\x69\xe6\x83\x69\x9c\x8a\xbe\x4c\x19\x1e\ +\x1e\x7e\xce\xc0\xc0\xc0\xbd\x99\x19\x9a\x1d\xa0\x6f\xd7\x75\x25\ +\xe5\x93\x88\x3e\x03\x00\xae\x4e\xd4\xfa\x35\x33\xef\x96\x34\x97\ +\x3c\xec\xd2\x7c\xe6\xbb\x42\x28\x61\x18\x7e\x52\x44\x4e\x06\x00\ +\xd3\x31\xc4\xea\xc7\xb4\xcd\x11\x91\xd6\xd4\xbf\x00\x10\x4f\xc3\ +\x30\xff\xfb\xc2\x7e\x5d\xd7\x95\xf4\x43\x47\x44\xe6\x83\xfc\xb5\ +\xa4\xf6\xb6\x76\x22\xf2\x15\xad\xb5\x59\x09\x5e\xc8\xe8\x59\xa1\ +\x14\xc2\x9e\x0f\xd2\x37\x0c\x78\xa1\xf4\x4d\xa9\xfd\x44\xb3\x30\ +\xe0\x85\x92\x85\x3d\xef\xdb\x17\x0c\xac\x5c\xb9\x72\x9b\x0d\x1b\ +\x36\xfc\xd1\x72\xb2\x13\x5d\x71\x8f\x62\x39\x29\x6f\xee\x19\x98\ +\x93\x01\xa5\xd4\x72\x44\x34\x2b\x0e\x6c\xc6\x63\x46\x28\x0f\x03\ +\x80\xd5\x53\x07\x44\x1c\x8e\xa2\xc8\xec\xaf\xf6\xc3\x33\xd0\x55\ +\x0c\x28\xa5\x0e\x43\xc4\x2b\x6c\x92\x16\x91\xfb\x8d\x50\x7e\x0e\ +\x00\x56\xdb\x5e\x4d\xb3\x34\xad\xb5\xab\x16\x41\x36\x73\xf0\xb6\ +\x9e\x01\x2b\x06\x88\xe8\x03\x00\x60\x7b\xcc\x77\xc3\x08\xc5\xec\ +\x0b\x78\x83\x4d\x34\x11\xb9\x40\x6b\x7d\x82\x8d\x8f\xb7\xf5\x0c\ +\x54\x81\x01\xa5\xd4\x6a\x44\x3c\xda\x32\x97\x1f\x63\x18\x86\xe7\ +\x89\xc8\xfb\x2d\x1d\x2b\xd7\x26\xd3\x32\x7f\x6f\xde\xa7\x0c\xa4\ +\x39\x1a\x44\x44\x3e\x81\x69\x57\x88\x8a\xc8\x0b\xb4\xd6\xe6\x3c\ +\x12\x3f\x3c\x03\x5d\xc1\x80\x52\xea\x28\x44\xbc\xc4\x36\x59\x11\ +\x39\x00\x87\x86\x86\x76\x19\x1c\x1c\x34\x2b\x44\xad\x06\x22\x5e\ +\x1a\x45\x91\xed\x57\x98\x55\x0c\x6f\xec\x19\xc8\x93\x01\x22\x4a\ +\xd3\x55\xf4\x89\x38\x8e\x77\x9d\x6c\x19\x9a\x76\x0f\xba\x51\x9a\ +\xd6\xfa\x87\x79\x4e\xc6\x63\x79\x06\x5c\x30\x50\xaf\xd7\x0f\x8b\ +\xe3\xd8\xea\x69\x57\x3b\x8f\x2b\x99\xf9\xb0\x49\xa1\x28\xa5\x4e\ +\x41\xc4\x4f\xa6\x48\x70\x12\x24\x85\x9f\x77\xf1\x0c\x14\xca\x80\ +\x52\xea\x7a\x44\x7c\xa5\x6d\x50\x11\x39\x5e\x6b\x7d\xe1\xa4\x50\ +\x88\xc8\x9c\x7b\x98\xea\x7e\xa3\xec\x8e\x1a\xb6\x13\xf7\xf6\xfd\ +\xc7\x00\x11\x99\x05\xb5\xe7\xa4\x98\xf9\x43\x13\x13\x13\xe1\xda\ +\xb5\x6b\x1f\xdd\xdc\xad\x9d\x88\xbe\x01\x00\x87\xa7\x00\xfb\x93\ +\x88\xbc\x5e\x6b\x7d\x63\x0a\x5f\xef\xe2\x19\x70\xca\x40\x96\x7e\ +\xca\x88\xf8\x99\x28\x8a\x26\x9f\x08\x6f\x16\x4a\xbd\x5e\x7f\x4d\ +\x1c\xc7\xdf\x49\x93\xb5\x88\x98\x87\x01\x87\x6a\xad\x6f\x4b\xe3\ +\xef\x7d\x3c\x03\x2e\x18\x50\x4a\x1d\x14\x04\xc1\x75\x22\x32\x90\ +\x06\x3f\x08\x82\x95\x8d\x46\xe3\xa7\x5b\x08\xa5\x7d\x09\x66\xda\ +\xc7\xec\x93\x06\xd4\xbc\xe6\x0f\x82\xe0\x35\x51\x14\x45\x69\xfc\ +\xbd\x8f\x67\x20\x4f\x06\xda\x6b\xba\x6e\xb2\x5d\x9e\x35\x2d\x87\ +\x2d\x0e\x3f\xda\xe2\xa0\x1c\x22\x7a\x3b\x00\x7c\x31\x43\xc2\x0f\ +\x9a\x8d\x50\x8b\x16\x2d\xba\x60\xcd\x9a\x35\x4f\x64\xc0\xd9\xc2\ +\xb5\xbd\x71\x68\x37\x11\x59\xb4\x78\xf1\xe2\x7b\xf3\xc4\xce\x2b\ +\x47\x8f\x63\xc7\xc0\xd2\xa5\x4b\x77\xd8\x76\xdb\x6d\x77\x89\xe3\ +\x78\xaa\x71\xc5\x23\x71\x1c\x3f\xd2\x6c\x36\xc7\xed\x90\x66\x58\ +\x0f\x10\xd1\x2a\x00\x30\x3f\xbb\xa7\xc5\x32\x9d\x48\xb5\xd6\x46\ +\x68\x93\x63\xc6\x89\x52\x4a\xa9\x6f\x23\xe2\x6b\xd3\x06\x68\xfb\ +\xad\x6b\xef\x1c\x34\xcd\x98\xcd\x8e\x44\xab\x61\xfe\x1a\x04\x41\ +\x70\x80\x88\xec\x0f\x00\xaf\xde\xda\x79\x72\x91\x1a\x62\x13\x00\ +\xd6\x07\x41\x70\x75\xa3\xd1\x70\x75\xbe\xbc\x55\xde\xde\xb8\x33\ +\x03\x44\x64\x4e\x58\x36\x07\x0a\xcd\xa8\x6b\xdb\xdb\x1c\x0c\x75\ +\x93\x88\xfc\x74\xfa\x07\xb5\x33\xf2\xe4\x6b\x8e\x23\x45\xc4\x08\ +\xc4\x6a\xed\xe2\xd6\xd8\xa6\x45\x53\x14\x45\x47\x4e\xff\xef\xb3\ +\x09\x65\x1f\x44\xcc\xab\x83\xdf\x5d\x22\x72\x2d\x22\xde\xc4\xcc\ +\x3f\x49\x32\x59\x22\x7a\x17\x00\x9c\x6d\xd9\x22\xe7\xd3\x22\xf2\ +\x31\xad\xf5\x63\x49\x62\x78\x9b\xe2\x19\x50\x4a\x99\x4b\xfa\x93\ +\x2d\xff\x08\x5f\x03\x00\x17\x31\xb3\x69\xef\x3a\xeb\x58\xb6\x6c\ +\xd9\x92\x05\x0b\x16\x1c\x61\xda\xbf\xa6\x79\xfc\x3b\x1b\xa8\x88\ +\xec\xbb\xf5\xfd\xf6\xac\x67\x14\xb6\xf7\xa8\x9f\x92\x27\x9d\x22\ +\x72\x37\x22\xde\x18\x04\xc1\xa5\x8d\x46\xc3\x7c\xe3\xcc\x18\x59\ +\x8e\x71\x46\x44\x0d\x00\x1f\xaf\xda\x99\xe6\x79\x72\xd8\xad\x58\ +\x39\x7c\x9e\x3e\xcc\xcc\x67\x4e\x9f\x7f\x7b\xe9\xd5\xa4\x40\x00\ +\x60\x41\x5e\xdc\xcc\x75\x84\xde\xac\x42\x19\x19\x19\xd9\x76\xd3\ +\xa6\x4d\xe6\x8d\xfb\x0b\xf2\x4a\x60\x2b\x1c\x46\xc4\x6f\x8c\x8f\ +\x8f\x7f\x66\xdd\xba\x75\x1b\xcc\xef\x32\x3c\x9e\xde\x02\x5a\x44\ +\x4e\xd4\x5a\x9f\xef\x28\x6f\x0f\x6b\xc9\x40\x5e\x75\x05\x80\x0f\ +\xb7\x5a\xad\x4b\x06\x06\x06\xcc\x89\x5d\x46\x20\x4f\xb2\x4c\x25\ +\x89\xf9\xda\xf1\xf1\xf1\xfd\xee\xbd\xf7\xde\x19\x4b\xba\xe6\x3c\ +\xf5\xb6\x56\xab\xad\x08\x82\xe0\xae\x24\xe8\x59\x6c\x44\x44\xb7\ +\xef\x37\xd2\xbc\xc3\x99\x2b\xf4\x11\xcc\x6c\xde\x0b\xf9\x51\x22\ +\x03\x39\x8a\xa4\x90\x59\xcc\x76\xc9\x35\x15\x78\xde\xe3\xa1\xd3\ +\xae\x2c\x2e\x64\x56\xf3\x07\xf9\x03\x22\x1e\x1c\x45\xd1\x7f\x56\ +\x20\x97\xbe\x4c\x21\xc3\xb2\xa8\xb2\xf8\x3a\x96\x99\x2f\x9e\x2b\ +\x78\xc7\x73\xd4\x89\xe8\x43\xe6\x6b\xaf\xac\xec\x33\xc4\x5d\x37\ +\x38\x38\xf8\xa2\xd1\xd1\xd1\xc7\x33\x60\x78\xd7\x14\x0c\xd4\xeb\ +\xf5\xe7\xc6\x71\x6c\x1e\x08\x2d\x49\xe1\x5e\x86\xcb\x69\xcc\x3c\ +\xef\xae\xc7\x8e\x42\x69\xdf\x3f\xbc\xdc\x3c\xb2\x2b\x63\x06\x59\ +\x62\x8a\xc8\x6b\xb5\xd6\x57\x67\xc1\xf0\xbe\xf6\x0c\x10\x91\xcb\ +\x33\x6c\xec\x13\x9a\xc7\x03\x11\x8f\x8b\xa2\xe8\xa2\x4e\xa0\x89\ +\x84\x62\x40\xc2\x30\x5c\x29\x22\x97\x02\xc0\x73\x3a\x81\x56\xe8\ +\xf7\x9f\x66\x66\xd3\x64\xda\x8f\x02\x19\x20\x22\x73\x94\xc3\xd2\ +\x02\x43\xa6\x0d\x75\x12\x33\x7f\x3a\x89\x73\x62\xa1\x18\xb0\xe1\ +\xe1\x61\x1a\x18\x18\x30\x47\x2b\x1f\x9a\x04\xbc\x02\x36\x77\x30\ +\xb3\xab\x27\x77\x15\x98\x5e\xf5\x52\x70\x7c\x74\x60\x9e\x13\x9e\ +\xf1\xc8\x79\x3e\x70\x2b\xa1\x4c\x01\x29\xa5\x56\x21\xa2\xb9\x77\ +\xd9\x31\xcf\xcc\x5d\x60\x0d\x0e\x0e\xee\xe4\xef\x53\x5c\x30\x3b\ +\x3b\x66\xad\x56\x3b\x3a\x08\x82\xd5\xc5\x45\xb4\x8e\x74\x0b\x00\ +\x9c\xc9\xcc\xe6\xdf\xc4\x23\x95\x50\x0c\x7a\xad\x56\xdb\x2b\x08\ +\x02\x23\x96\x4a\x7f\xbb\x94\x79\x56\x60\xe2\x2a\xf4\x90\x21\x11\ +\x99\x7d\x1f\x66\xff\x47\x15\x87\xd5\xb7\xc8\xf4\x09\xa4\x16\xca\ +\xb4\x6f\x17\xd3\x50\xec\x78\x00\x78\x49\x15\x99\x31\x67\x10\x32\ +\xb3\x39\xa9\xcb\x8f\x02\x18\x20\xa2\xeb\x00\xe0\xe0\x02\x42\x25\ +\x0d\x61\x0e\x29\xba\x24\x8e\xe3\xd5\xcd\x66\xd3\xb6\x43\xe4\xe6\ +\x18\x99\x85\x32\x85\x14\x86\xe1\x31\x00\x70\x9c\x88\xbc\x30\xe9\ +\x0c\x8a\xb0\x9b\x98\x98\xd8\x73\xed\xda\xb5\xf7\x17\x11\xcb\xc7\ +\x98\x5c\x61\x71\x15\x00\xbc\xae\x02\x5c\xac\x47\x44\x73\x54\xc5\ +\xea\x28\x8a\xee\xcb\x9a\x4f\x6e\x42\x99\x26\x98\x95\xe6\x2f\x8a\ +\x88\x98\xbf\x2a\xcf\xcb\x9a\x60\x56\x7f\x11\xd9\xc5\x2f\x96\xcc\ +\xca\x62\x72\x7f\x22\xfa\x17\x00\x30\x0b\x5b\xcb\x18\xff\x03\x00\ +\xe6\x1b\xed\xfa\x25\x4b\x96\xdc\x78\xcb\x2d\xb7\x4c\xe4\x95\x44\ +\xee\x42\x99\x9e\x58\xbd\x5e\xdf\xaf\xd5\x6a\x99\x55\x9d\x46\x34\ +\x4e\x0e\x29\xed\x44\xc4\xf0\xf0\xf0\xe0\x15\x57\x5c\x61\xbd\xd4\ +\xbf\x13\xae\xff\xfd\xec\x0c\x94\xf0\x82\xda\xf4\xce\x36\xe2\xf8\ +\xde\xc4\xc4\xc4\xcd\x66\x7f\xbb\x8b\xda\x38\x15\xca\xf4\x84\x95\ +\x52\x07\xb4\x05\x63\x44\x33\xec\x62\x32\x5b\x63\x8a\xc8\x77\xb4\ +\xd6\x95\x7e\xd8\x50\x04\x0f\x45\xc6\x50\x4a\x2d\x45\x44\xd7\x47\ +\x62\xff\x16\x00\x6e\x46\xc4\xef\x8b\xc8\xcd\xcc\xfc\x4b\xd7\x73\ +\x2c\x4c\x28\x5b\x89\xe6\xa0\xb6\x68\xcc\xb9\xf1\x2e\xc7\xab\xe7\ +\xdb\xcb\xe0\x32\x70\x3f\x63\xa7\x6d\x0d\x64\xc1\x59\xe1\x2f\x92\ +\x4b\x11\xca\xb4\xfb\x99\xb3\x44\xe4\x74\x0b\x82\x6c\x4c\xef\x63\ +\xe6\x67\xdb\x38\x78\xdb\x7c\x18\xc8\x61\x4b\x79\xa7\x44\xf6\xb7\ +\x7d\x0f\xd2\x09\xb0\xd3\xef\x4b\x15\x8a\x49\x8e\x88\xee\x01\x80\ +\x7a\xa7\x44\x53\xfc\xfe\x63\xcc\x7c\x5a\x0a\x3f\xef\x92\x03\x03\ +\x39\x6d\x29\x9f\x2d\x93\x6f\x33\x73\xe1\x4f\xd5\xaa\x20\x94\x67\ +\x02\x80\x79\x5a\x91\xdb\x30\xbb\x1d\xe3\x38\x7e\xa3\xd6\xda\xec\ +\xab\xf7\xa3\x04\x06\xcc\xd6\xdf\x1c\xb7\x94\x4f\xcd\xe0\xf1\x20\ +\x08\x9e\xdb\x68\x34\x7e\x5d\xf4\x94\x4a\x17\x8a\x99\x70\x18\x86\ +\x27\x88\xc8\xe7\xf3\x98\xbc\x17\x49\x1e\x2c\xe6\x83\x41\x44\x66\ +\x41\xea\xb9\xf9\xa0\x4d\xa2\xec\xcd\xcc\x77\xe6\x88\x97\x18\xaa\ +\x12\x42\x31\xd9\xd6\x6a\xb5\x17\x06\x41\x30\xd9\x6c\x2c\xed\xf0\ +\x22\x49\xcb\x9c\x3b\xbf\x9c\x1e\x17\x6f\x14\x91\x91\x32\xaf\x10\ +\x2a\x23\x14\x53\x2a\xa5\xd4\xce\x88\x68\xf6\x32\xbc\xc5\xb6\x74\ +\xe6\x51\x30\x00\x7c\xb0\x4c\x32\x6d\x73\xee\x17\x7b\xf3\x47\xd0\ +\xbc\x25\x47\xc4\x3d\x52\xcc\x79\x8d\x88\xbc\xad\xec\xba\x56\x4a\ +\x28\x53\x24\xb6\xff\x0a\x99\xbe\x4f\x23\x09\x88\xfd\x8a\x59\xad\ +\xea\x7b\x7b\x25\x60\xaa\x44\x93\xf6\x1f\x41\xb3\x45\xc3\xf4\x46\ +\x78\x4a\x82\x54\xd6\x20\xe2\x45\x49\x36\x55\x25\xc0\xca\x6c\x52\ +\x49\xa1\x4c\xcd\xaa\x56\xab\xbd\x20\x08\x02\xf3\xc2\xd0\x3c\xe5\ +\x78\x06\x00\x3c\x28\x22\x0f\x22\xa2\xe9\x48\xf9\xa0\xe9\x95\xdc\ +\x6c\x36\x7f\x96\x99\x05\x0f\x50\x18\x03\x2b\x56\xac\x78\xca\xf8\ +\xf8\xb8\x11\xcb\xde\x88\xa8\xcc\x55\x37\x00\x98\xee\x90\xe6\x0d\ +\xfb\x23\x00\x60\x96\xbf\xff\xa8\xe8\xc7\xbf\x9d\x08\xf8\x7f\xee\ +\x74\x9e\xef\xc9\x63\x4f\x81\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x02\xa3\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\ +\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xe2\x03\x02\x04\x34\x31\x97\x0c\xf9\x63\x00\x00\x00\x19\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ +\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\ +\x00\x02\x0b\x49\x44\x41\x54\x68\xde\xed\x98\xcd\x4b\x94\x51\x14\ +\xc6\x7f\x16\x96\x7d\x2c\xa2\x55\x1b\x3f\x90\xc0\x45\x60\x21\x6e\ +\x5b\x04\x15\x45\x14\x06\x23\xae\x5a\xbb\x90\x72\x21\x6d\x4a\xa5\ +\x76\x41\x7f\x41\xae\xda\x88\x91\xd2\x22\x17\x66\x10\xa2\x92\x50\ +\x18\x45\x05\x81\x04\xd9\x2a\x22\xa5\x60\x48\xc4\x84\x69\x73\x16\ +\x0f\x2f\x33\x13\xfa\x5e\x21\xc6\xe7\x07\x97\xfb\xce\x73\xce\x7d\ +\xee\xdc\x97\x73\xef\x65\x06\x8c\x31\xc6\x18\x63\x8c\x31\xc6\x18\ +\x63\x8c\x49\x4e\x0f\x50\x8a\x76\x26\xb5\xf9\x9e\xff\x70\xc1\xed\ +\xf2\xfc\x61\x37\x2d\xf8\x1b\xb0\xb2\x9b\x16\xfc\x7e\x27\xcc\xb7\ +\xb2\xe0\x59\xd9\x5b\xa7\x32\xb1\xe3\xc0\x9f\x88\x7d\x02\xf6\x49\ +\xac\x1e\xb8\x01\xbc\x04\x7e\x46\x9b\x03\x7a\xcb\xcc\x7f\x04\x68\ +\xaa\x50\xce\x5b\xf1\x49\xc2\x7d\x59\x70\x4f\x26\xf6\x48\x62\x67\ +\x45\xef\x00\xde\x4a\x2c\xdb\x9e\x03\x7b\x25\xff\xb4\xc4\xae\xe5\ +\xf0\x49\x42\xb7\x4c\x30\x2c\x7a\xa7\xe8\xe3\xa2\x9f\x00\xd6\x24\ +\x36\x0d\xdc\x01\x1e\x02\x9b\xa2\xdf\x94\x31\x7d\xa2\x9f\xcc\xe1\ +\x93\x84\x66\x31\x1f\x0d\xad\x0e\x78\x11\xda\x9a\x94\xe3\x81\x28\ +\xc9\x12\xb0\x01\x5c\xce\x78\x15\xc4\xeb\xb5\xe8\x0f\x42\xdb\x04\ +\xf6\xe7\xf0\x49\x42\x1d\xf0\x3d\xcc\x17\x43\xbb\x20\x13\xde\x92\ +\xdc\xeb\xa2\xdf\xae\xe0\xb5\x1a\xf1\xdf\xa2\x2f\x84\xf6\x31\xa7\ +\x4f\x32\x26\xc3\xbc\x18\x7b\xe6\x5d\x7c\xfe\x0c\x34\x48\xde\x94\ +\x7c\xd1\xd6\x32\x3e\xf5\x52\xa6\x5f\xe5\x00\x2d\x86\x36\x96\xc3\ +\x27\xe9\xb5\xf4\x2a\xfa\xc3\xc0\x80\xec\xb3\x7e\x60\x5d\xf2\x8e\ +\xc9\x73\xb1\x8c\xcf\x95\x28\x57\x80\x67\xd1\xb7\x84\xaf\x5e\x49\ +\xdb\xf1\x49\xca\x79\x79\xe3\x1b\xd1\x3f\x2d\x93\x37\x56\xa5\x14\ +\x3b\x81\x1f\x11\x5b\x05\x1a\x43\xef\x92\x31\x97\x72\xf8\x24\xe5\ +\x68\xe6\x3a\x58\xaf\x50\x6a\x85\x4c\xde\x13\x60\x08\x78\x2c\xf7\ +\x75\x09\xb8\x28\x63\x86\x45\x6f\xca\xe1\x93\x9c\x25\x99\xe8\x6e\ +\x95\xbc\x91\x2a\xf7\xe6\x97\x38\xf0\x94\x89\x88\xfd\x8a\xc3\x68\ +\xbb\x3e\x49\x69\x00\x96\x63\xb2\x65\xe0\xe0\x3f\x4e\xf5\x02\x30\ +\x13\x25\x57\x04\xde\x00\x83\xc0\xa1\x2a\x2f\x72\x3e\xa7\x4f\x52\ +\x06\xe5\xed\x5e\xad\xf5\xdf\xa9\xcd\x72\x05\x4c\x67\xca\xae\x26\ +\x99\x90\xd3\xb9\xad\xd6\x17\x7b\x4e\x4a\xf9\x9e\xff\x94\x31\xc6\ +\x18\x63\x8c\x31\xc6\x18\x63\x8c\x31\xc6\x98\x54\xfc\x05\x94\x34\ +\xe4\xeb\x87\xd7\x3b\x14\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x02\x86\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd2\x02\x01\x0b\x00\x03\xc4\x02\x9d\xda\x00\x00\x02\x03\x49\x44\ +\x41\x54\x78\xda\xbd\x95\xbf\xab\xda\x50\x14\xc7\x3f\x79\x7d\x2d\ +\x0a\xa5\x94\x82\x98\x74\x2b\x05\x41\xfa\x63\x08\x8a\xbc\xff\xc1\ +\xff\xc1\x31\x05\x41\xb2\xb9\x14\xb4\x0e\xdd\x8a\x6e\x25\x20\xd4\ +\xd1\xcd\x41\xe7\x2e\x19\x44\x04\x47\xfd\x0b\x1e\xa8\x9b\xa0\x49\ +\x90\x36\xb7\x4b\xae\xcd\x8b\xfa\x12\x2d\xf4\xc0\x81\x5c\xc8\x3d\ +\x9f\x73\xee\xf7\xdc\x73\xe1\x3f\xd9\x17\x40\x5c\xe8\x9f\x81\xa7\ +\x80\x92\x04\x20\x46\xa3\x91\xf0\x3c\x2f\xd6\x1d\xc7\x11\xb6\x6d\ +\x4b\xc8\xab\x00\x72\xd6\x24\x5d\x78\x9e\xc7\x66\xb3\x49\x5c\x72\ +\x36\x9b\x05\x78\x0b\xac\x81\x5d\x00\x3c\xb2\xdb\xf0\x62\x30\x18\ +\xb0\x5e\xaf\x01\x48\xa5\x52\x54\x2a\x15\xa6\xd3\x29\xb3\xd9\x0c\ +\xc3\x30\xb0\x2c\x0b\x5d\xd7\x29\x16\x8b\x72\x4b\x2a\x88\xa1\x9c\ +\x03\x5c\x54\x81\x10\x7f\x63\xa8\xaa\x0a\xf0\x11\xb8\x07\x36\x80\ +\x7f\x6a\xcb\x03\x40\xb5\x5a\xc5\x75\x5d\xda\xed\x36\xad\x56\x8b\ +\x6c\x36\x8b\xae\xeb\x14\x0a\x05\x19\xf0\x12\x33\x80\x1f\x84\x00\ +\x62\xb5\x5a\x9d\x74\x40\x0c\x87\x43\x91\xd4\xe6\xf3\xf9\xa1\x09\ +\xce\x6a\x20\xcf\x5c\x1e\x4b\xb9\x5c\x4e\x9c\x7a\x3e\x9f\x97\x9f\ +\x2f\x63\x35\x10\x42\xa0\xaa\x2a\x42\x08\xfa\xfd\x3e\xcb\xe5\x12\ +\x80\x74\x3a\x8d\x61\x18\x8c\xc7\x63\x26\x93\x09\xa6\x69\xd2\xe9\ +\x74\x28\x95\x4a\xdc\xdd\xdd\xa1\x28\x0a\xc0\xbb\x93\x1a\x00\x07\ +\x1d\x32\x99\x0c\xcd\x66\xf3\x81\xc0\x49\x2c\x00\x7c\x88\xad\xc0\ +\xf7\x7d\x34\x4d\x43\x08\x41\xad\x56\xc3\x71\x1c\xba\xdd\x2e\xf5\ +\x7a\x1d\x4d\xd3\x0e\x19\x87\x2b\x39\x0b\xe8\xf5\x7a\x27\x35\x68\ +\x34\x1a\xd7\x56\xf0\xfe\x00\xd8\xed\x76\x6c\xb7\xdb\xc4\x1a\xc8\ +\x33\x07\x0e\x55\x58\x96\x85\xeb\xba\x98\xa6\x79\x0c\xb0\x6d\x9b\ +\x5c\x2e\xf7\x28\xe0\x5f\x2a\xf8\x04\x7c\x8f\xbb\xc5\x52\x03\x20\ +\x56\x87\x28\xe0\x16\x78\x0e\xbc\x00\x9e\x05\x23\x44\xfa\x6b\xe0\ +\xe7\xb5\x5d\x24\x2f\xda\x6f\x60\x0b\xec\x81\x9b\xd0\x8c\x52\x80\ +\x95\xdc\x74\x89\x06\xd1\x59\x14\x1d\x7e\xe1\xb5\x02\xfc\xba\x56\ +\x83\x9b\xe8\x51\x47\xdc\x97\x53\x72\xb1\x58\x24\x0e\x1e\xfa\xd7\ +\x4f\x94\x0c\xf0\xf5\x8a\x27\xf5\x1b\xf0\x46\x49\x98\xd4\x63\x4d\ +\xa0\x44\xdf\x96\xc0\xf7\xc0\x26\x29\x40\x01\x9e\x04\xc1\xa3\x4d\ +\x70\x2a\x86\x08\x1a\x67\xaf\x5c\xf8\x88\xc4\x35\xc5\x91\x9e\x7f\ +\x00\xb7\xae\x9e\x43\x7d\xb2\x82\x67\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x08\x19\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x07\xab\x49\x44\x41\x54\x58\xc3\xad\ +\x57\x5b\x50\x93\x67\x1a\xf6\xca\xce\xec\xcc\xf6\x62\x2f\xbc\xd9\ +\xe9\xce\xec\x6e\xbd\xda\xd9\x9b\xb5\xce\xba\x3b\x7b\xb0\xad\xcc\ +\x7a\xb1\xce\xce\x3a\xb3\x76\x54\x70\x75\xdb\xe2\x81\xd6\xb6\x54\ +\x04\xbb\xa5\x20\x6d\xc1\x82\x06\x08\x07\x51\x42\x80\x80\x80\x02\ +\x21\x81\x10\x92\x40\x48\x10\x73\x24\x21\x67\x72\x80\x04\x42\x20\ +\x9c\x09\x47\xb5\x54\x78\xf6\xfb\x7e\x13\x16\x30\x58\x8b\x7d\x67\ +\x9e\xf9\x2f\x92\xfc\xcf\xfb\x3e\xcf\xfb\xbe\xdf\x97\x5d\x00\x76\ +\xfd\x98\x20\xf1\x0b\x82\x14\x02\x03\xc1\x75\x82\x03\xcf\xfd\xfe\ +\x8f\x48\xbc\x9b\x20\xe1\x57\xaf\xef\xb5\x2a\x8c\xd6\x65\xdb\x02\ +\x60\x19\x1e\x5b\x09\x27\xf1\x33\xfa\x19\x81\x22\xfc\xdc\x3e\x76\ +\x48\x7e\x8a\xa0\xb9\xb6\x59\x1c\x32\xcf\xad\x42\x39\xfe\x1d\x44\ +\xf6\x51\xd8\xc7\xe6\xe8\x87\x86\x3d\x7b\xf6\x58\x53\x52\xae\x2c\ +\xca\x3a\x3a\x10\x4e\xe2\xe5\x49\xc3\xc4\x31\x04\xb7\x3e\x49\xf9\ +\x2c\x60\x9b\x5d\x59\x53\x4d\x03\x4d\xb6\x11\x34\xeb\xfb\x20\x31\ +\x79\x60\x19\x9d\xc5\xbb\xef\xbe\x3f\xc5\xab\xbe\x83\xf1\x89\x29\ +\x4c\x4f\xcf\xae\x92\xef\xd7\xbc\x74\x02\x11\x9f\x0f\xbe\x1d\xe3\ +\xb2\x04\x43\x4f\xb4\x33\x40\x8b\x7b\x06\xcd\x3d\x2e\x34\xeb\xec\ +\xa8\x57\xf6\x20\x87\x53\x85\x32\x5e\x35\x43\xbc\xb0\xf4\x90\x81\ +\xc1\x60\x5c\x26\xbf\x4b\x7c\xe1\x04\x48\x1c\x24\x38\x41\xfd\xdd\ +\xea\x73\x27\xf1\xb9\x27\x04\x48\x87\x97\xc1\xd7\xbb\x20\x22\x55\ +\x37\xdc\x37\xa2\xb8\x4e\x88\x2c\x56\x3e\xcc\x56\xdb\x3a\x71\x04\ +\x2c\x16\x6b\x2c\xfc\xce\xe7\x27\x10\x91\x36\x93\x95\x3f\x46\x7d\ +\xa5\xfe\x12\xc4\x6f\xf4\x59\x31\xb6\x02\x7e\xef\x20\x5a\x7b\x9c\ +\xe0\x3f\x30\xa1\x4c\x28\x43\x46\x0e\x1b\xb2\x0e\xf9\x26\xd2\xf9\ +\xc5\x65\xcc\x2d\x2c\x21\x34\xbf\x88\xbd\x7b\xf7\x5a\xc9\x3b\x7e\ +\xba\x6d\x02\x24\x7e\x43\x90\x46\x3d\x35\x13\x69\x75\xb3\x80\xd2\ +\x3f\x0f\xcb\xc4\xe2\x9a\x50\xa1\x5a\xb4\x6c\xf1\x59\xa0\xb6\xa0\ +\xa6\x5d\x8d\x2f\xb2\x73\x71\xb7\x9e\xff\x0c\x31\x25\x9d\x09\xcd\ +\x63\x62\x6a\x06\x83\x43\x81\x27\xe4\xdd\xbc\x2d\xd3\xb0\x3b\x92\ +\x03\x33\x26\xd4\x53\xb5\xd3\xfb\x58\x4f\x88\xc5\x03\x21\x88\x2c\ +\x43\x50\xba\x46\xd0\xed\x09\x42\xe5\x9b\x42\x9b\x73\xfc\xa9\xcf\ +\x5a\x1b\xee\x2a\x74\xc8\xbc\xc9\x45\x09\xa7\x6c\x93\xcf\x9b\x88\ +\x27\xa7\x11\x18\x1d\xc3\x80\x6f\x08\xa2\xd6\xd6\x25\xc2\x51\xdb\ +\x28\x12\x87\xc6\x1f\xaf\x82\x2f\x62\x94\x4d\x89\x24\x90\x22\xea\ +\x52\x2d\x9a\x42\xab\xe8\x18\x79\x04\xa1\xc5\xcf\x10\x53\x74\xf6\ +\x0d\xa3\xd3\xe1\x87\xd4\x3c\x80\x16\xbd\x03\x0d\x5d\x06\x14\xd5\ +\x0a\x90\x91\x95\x0d\x2f\x79\xf1\xc6\xaa\xa9\xd4\xb3\x73\x0b\x4c\ +\xc5\x94\xd8\xdd\xef\x85\xc9\x62\x05\xb7\xbc\x12\xa5\xe5\x95\x4b\ +\x13\xf3\xcb\xab\x23\x0f\x01\x37\xd9\x11\xe6\xd9\x15\x84\x97\x15\ +\x13\x06\xcb\x3c\xd0\x68\xf2\xa3\xdd\xee\x5f\x27\x96\x3b\x86\x20\ +\xb3\x78\xd7\x7d\xe6\x08\xa4\xf8\x3c\x33\x1b\x2a\x8d\x36\xaa\xdc\ +\x53\x33\x21\x8c\x8e\x8d\x33\x15\xd3\x26\xe4\x37\x09\xf1\xc1\xc5\ +\x8f\x51\x73\xaf\x01\xbe\x65\x60\xfc\x11\xa0\x23\x13\x23\xf2\xce\ +\xa1\xbe\x5d\xb9\xb8\x51\x01\x83\x81\x74\x74\x4d\xa7\x1e\x0a\x67\ +\x80\xa9\xb8\xdd\xea\x83\xd8\xe8\x42\x93\xca\xcc\xf8\x7c\xe5\xcb\ +\x2c\x88\xda\x24\x51\x89\xa7\x67\xe7\x18\x1b\x86\x86\x47\x60\x77\ +\x38\x49\x82\x3a\x24\x7c\xf8\x21\xae\xb3\x0b\xe1\x99\x5c\x80\x6f\ +\x09\xd0\x90\xde\xe1\x0f\x2c\x81\xab\x1f\xc4\x7d\xef\x04\xdd\x07\ +\x1d\x61\xeb\xff\x9f\xc0\x1d\xb9\x16\x1d\xf6\x21\x48\xcc\xfd\x4f\ +\x7d\xee\xd4\x22\x9d\x55\x84\xaa\x9a\xba\x4d\x3e\x47\xe4\x8e\xf8\ +\x3c\x3c\x12\x84\xd3\xdd\x0f\xbd\xc1\x88\xc2\xe2\x62\x9c\x7e\x2f\ +\x1e\x3d\x03\x01\xf4\x2f\x02\x83\x84\xbc\xc5\xff\x2d\xee\x3a\x43\ +\x28\x51\x91\xf7\xf6\x05\xf1\x4e\xdc\xbf\x7d\x84\x33\x69\xe3\x20\ +\x18\xf4\x33\xab\xe0\xc9\x54\x68\x35\x38\xd1\xd8\xdd\x0b\x9e\x58\ +\x89\xac\x5c\xf6\x33\x3e\x47\xaa\x9e\x9c\x9e\x65\xe4\xee\xf7\x0e\ +\xa2\xd7\x6c\x41\x43\x03\x1f\x27\x62\xe3\x20\xe9\xd6\xc0\x45\xcf\ +\x01\x52\x90\x24\xb8\x86\xb2\x9e\x00\x6e\xb4\xdb\x50\xd1\x1b\x44\ +\x85\xce\x8b\x4a\x7e\x0b\x6d\xbe\x9b\x5b\x27\xd1\xa0\x99\xf8\x16\ +\x65\x22\x05\xee\x29\xf4\x28\x13\xc8\x90\x78\x35\x0b\x1a\xad\x3e\ +\xaa\xdc\x63\x13\x93\xf0\x0d\x0d\xc3\x66\xef\x83\xb4\x5d\x8e\xc4\ +\x4b\x97\x90\xc3\xca\xc3\xd4\x63\xc0\x4e\x7a\x49\x31\x4e\xfa\x89\ +\x94\x7f\x5b\x3b\x84\x7c\x85\x13\x25\x6a\x1f\x4a\xd5\x03\xe8\xf2\ +\x30\xa3\x28\x22\xf8\xf9\x33\x09\x74\x8f\x2e\xa1\xa8\xbe\x15\xa5\ +\x7c\x09\xb2\x4a\x2a\xf0\xcf\xe3\x71\x51\xe5\xf6\x07\x46\xd1\xe7\ +\xf2\x40\xab\x37\x20\xfd\x6a\x06\x92\xbf\x48\x83\xcd\x37\x02\x27\ +\xa9\xda\x40\x1a\x4c\xe0\x7b\x88\x52\x9d\x1f\x45\xdd\xfd\x0c\x71\ +\x41\x97\x1b\xc5\xdd\x1e\x88\x9c\x41\xfc\xf9\xcd\xb7\x5d\x84\xeb\ +\x6c\xb4\x43\xd0\x28\xf7\x4e\x23\xa7\xfc\x1e\xb2\x4b\xab\xf1\x51\ +\xea\x57\x48\xfe\x6f\xea\xfa\x58\x51\xb9\x47\x82\xe3\xf0\x0c\xf8\ +\x60\x34\x99\x51\xc9\xab\xc2\xfb\x67\xcf\x41\xfe\x40\x03\x3f\xe9\ +\x6e\xb2\x8d\x19\xb9\x6f\x69\x06\x19\xd2\x9b\x2a\x2f\x72\xe5\x0e\ +\xe4\x75\xf6\xa1\xf0\xbe\x1b\x1c\x95\x1b\xf9\x9c\xca\x29\xc2\x53\ +\xb8\xdd\x29\xdc\x2b\x76\x04\x90\x51\xc8\xc5\x95\x6b\x79\x38\x11\ +\x9f\x80\x9b\xb7\x6e\x33\x63\x15\x91\xdb\x6a\x73\x40\x22\x6d\xc7\ +\x85\x84\x0f\x50\x74\xbb\x0c\xf3\x2b\x80\x9f\x34\x58\xf7\x24\x20\ +\x1c\x7c\x84\x4a\xd3\x18\x38\xfa\x61\x86\x9c\x56\xfd\x55\xb3\x1e\ +\xac\x0e\x3b\xb8\x3a\x1f\xd9\x21\x1e\x7a\x2f\xe0\x13\xbc\xba\x5d\ +\x02\x26\xbe\xc1\x83\x94\x6f\xd8\x38\x9f\x9c\x8a\x03\x7f\x3d\x04\ +\x63\xaf\x99\xe9\x6e\x2a\xb7\x46\xd7\x83\xa4\xcb\xc9\x48\xff\x3a\ +\x8b\x8c\xd5\x3c\x53\xb5\x71\xf6\xa9\xdc\x35\xf6\x69\x5c\x97\x59\ +\x19\xd9\xbf\x6e\x21\xa7\xa0\xd4\x82\x74\xbe\x1a\x57\x9b\x34\x60\ +\xc9\xcc\x10\xbb\x82\xf8\xe5\xaf\x5f\xa7\x67\xc0\x3b\xe1\x75\x1f\ +\x35\xcc\x35\xdd\x66\x7c\x94\x96\x85\xb8\x73\x17\xf1\x97\x43\x31\ +\x4c\xd5\x74\x99\xf0\xaa\xaa\x71\xfa\xf4\x19\x68\xcc\x0e\x8c\x92\ +\x2d\x36\x14\x1e\xab\x5a\xc7\x0c\x78\xe6\x71\x70\x0d\x23\x4c\xa3\ +\x65\x8a\x0c\x8c\xec\xb4\xfa\x9c\xb6\x5e\x94\x74\x39\xd0\x66\xf7\ +\xaf\x1e\x3d\x11\x4b\x47\x2e\x6f\xc3\x79\x13\x35\x2c\x5c\x99\x1a\ +\xf1\x97\x3e\xc7\xd1\xd8\x33\xf8\x38\x31\x09\x86\x5e\x13\x1a\x9b\ +\x04\xf8\xdd\x1b\xfb\x51\x4f\xd4\xf1\x90\x99\xee\x9a\x00\xaa\xad\ +\x93\x60\x2b\x5d\x0c\x39\xf5\xbc\xf0\xbe\x67\xbd\xea\xcc\x16\x3d\ +\x4a\x55\x1e\x08\x6d\x01\x94\xd4\xf1\x43\xe1\x65\x53\x40\xf0\xca\ +\xf7\x25\x60\x2b\x6e\x6a\xc7\xa9\x84\x44\xc4\x1c\x39\x8a\xdc\x7c\ +\x36\x5a\x5a\xc5\x38\x14\x13\x83\x2f\x39\x35\xc8\x14\x6a\x98\xe6\ +\xa2\xd5\xd2\x27\xf5\x9a\x7a\x4c\x13\xa1\x49\x64\xb7\x99\x90\xdb\ +\x6e\x46\xb9\xda\x8d\x06\xa5\x76\x39\x2c\x39\x3d\xf9\x4e\x13\xec\ +\xd9\x72\xd4\x47\x0d\x3b\xab\x46\x88\x63\xff\x39\x8f\xdf\xee\xfb\ +\x3d\x1a\xf9\x02\x9c\xbf\x90\x80\x93\xf1\x17\x70\xa3\xad\x07\x19\ +\xc4\x4f\x4a\x14\xe9\x6e\xba\x58\xa8\xef\x2c\xfa\x94\x98\x50\x28\ +\xb7\x40\xe9\x0e\x3c\xf9\x57\xec\x29\x2a\x77\x2d\xc1\x67\x04\xfb\ +\xb6\xb9\xe4\x44\x8d\xbe\xcc\xb2\x5a\xfc\xe3\xe4\x19\x1c\x3c\xf4\ +\x37\xb0\x72\xf3\xb0\xef\xc0\x1f\x50\x20\xd1\x21\x89\x27\x65\x2a\ +\xa6\x4b\x85\x3e\xbf\x21\xd5\x46\xe4\x2e\x90\x5b\x21\xb0\x0c\xae\ +\xe5\xdc\xe2\xd2\x11\x13\x13\xe4\x87\x6f\x3c\xaf\x3c\xe7\x96\x15\ +\x35\x9c\x69\x45\xe5\xf8\xfb\xb1\x58\x1c\x3f\x19\x87\x37\xf6\xef\ +\xc7\x8d\x3a\x11\x92\xab\xa4\x0c\x21\xed\x70\xea\x35\x55\x21\x8b\ +\x34\x5b\xc9\x03\x37\x2a\x34\x6e\xd4\x49\x3a\x17\xc3\x72\x73\x08\ +\x8e\x6d\x95\xfb\x87\x24\xe0\x4a\x65\x73\x70\xe4\xf8\x29\x1c\x3e\ +\x7c\x98\x8c\x63\x2e\x32\x05\x2a\x5c\x22\xd5\xd3\x5d\x7e\x4d\xdc\ +\x0b\x36\xe9\x74\x76\xa7\x1d\x77\x8c\xe4\x88\xb6\xf9\x9e\x84\xb7\ +\x1a\x95\xfb\x22\xbd\x49\xfd\x80\x0b\x6d\xf4\x04\x32\x4a\x78\x4c\ +\x0f\x9c\x4b\x49\xc3\xb5\xa6\x2e\x7c\xc2\x6d\x65\x36\x59\xf1\x83\ +\x01\x5c\x97\x9a\xc1\x51\x7b\x20\xf3\x04\xd7\xce\x25\x26\x05\x36\ +\xc8\xfd\xc7\x9d\xc8\x1d\xd5\x82\xdc\x1a\x01\xce\x5e\x4e\x45\x81\ +\x58\x85\x78\xf6\x5d\x5c\xa9\x55\x90\xaa\xfb\xc0\x96\xdb\x50\xad\ +\x75\xe3\xae\x54\x41\x2f\x10\xca\x0d\x72\xbf\xba\xd3\x6a\xa3\x05\ +\xb7\xa2\x51\xf8\x1d\xaf\x43\x8d\x4f\xb9\x2d\x88\xcb\xe6\xe1\x9a\ +\x48\x8f\xaa\x1e\x2f\x9a\x35\xe6\xc7\x7f\x7a\xf3\x2d\x57\x78\xac\ +\xa8\xdc\xaf\xbd\xac\xdc\xd1\xe2\x08\xdd\x05\x5c\x75\x1f\xde\xcb\ +\xaf\x45\xb9\x76\x00\x32\x67\x60\xf5\xc2\xa7\x97\xa9\xdc\xf7\x08\ +\xd2\xa9\xdc\x3b\xf8\x03\xf3\xc2\xf1\x13\x82\xca\x1c\xee\x9d\x50\ +\x0b\x39\x94\xb8\x0d\xc2\xc8\x16\xa3\x17\x87\xc3\x2f\x22\xf7\x0e\ +\xff\xda\x6d\x8a\xdd\x61\x99\xd5\x1b\xb6\xd8\x6b\xbb\x5e\x32\xbe\ +\x2f\x89\xff\x01\x66\xb9\x5f\xfc\x11\x80\x3d\xcf\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x09\x40\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x08\xd2\x49\x44\x41\x54\x78\xda\xed\ +\x99\x79\x70\x95\xd5\x19\x87\x9f\xf3\x6d\x77\xc9\xbe\x6f\x04\xb3\ +\x10\x43\x88\x44\xc4\x20\x8a\x20\xc5\x36\x18\x0a\x62\x15\xaa\x23\ +\xa8\x6d\xc5\x76\xb4\x5a\xa7\xa3\x4e\x3b\xb6\xce\xb4\x9d\xb1\x8e\ +\xfd\xc3\xa9\x8e\xb5\x55\x2b\x6e\x80\x20\x19\xb1\x08\x26\xb2\x88\ +\xa0\x20\xa2\x48\x58\x22\xa1\x2c\x22\x89\x82\x59\x09\x49\xee\xfe\ +\x7d\xdf\xe9\x31\x89\x93\xb1\xf8\x67\xb9\x89\x53\xde\x99\xdf\xdc\ +\x33\x73\xef\x9d\x79\x7e\xef\xf7\x9e\xf9\xde\xf3\x1e\x43\x4a\xc9\ +\x77\x39\x0c\xe0\xbc\x81\xf3\x06\xfe\x57\x06\xc4\xcd\x29\x7c\x6b\ +\x48\x94\x84\x92\x0e\xae\x18\x5c\xbb\xda\x80\x86\xd7\x02\xa4\x36\ +\x28\x47\xfc\xd7\xef\x07\xbf\x1f\x5a\x9f\xfd\xdf\xe1\xc8\x43\xf2\ +\x07\xe0\x72\x04\xcb\x60\x40\xed\x67\xe1\xec\xde\x3d\x2a\x9f\xc0\ +\x58\x5c\xb1\x1c\x87\x19\xe8\x12\x6c\xed\x62\x0c\xf7\x0e\x04\x3f\ +\x07\xb6\x8f\xf6\x12\xaa\xc4\x16\xaf\x5b\x1e\xb7\x6c\xec\xf5\xdd\ +\xb4\xf9\x63\x84\xf7\xfb\x88\x1d\x48\x1d\x8f\x64\x23\x9a\xbc\x17\ +\x78\x6e\xb4\x1a\x98\x4a\x4c\x5b\xa5\x99\x6e\xd1\xec\x25\x9f\xa3\ +\x55\x47\x38\xdd\xe6\xc5\x28\xe9\x20\x58\x14\x20\xd2\x90\xa7\x9c\ +\x68\x7f\x43\x97\x67\x80\xba\xd1\x66\x60\x0e\x51\xf1\x8c\x37\x25\ +\x56\x38\xfb\x17\xad\x8c\x9f\xd2\xcb\xc9\x3e\x3f\x09\xc2\x43\x58\ +\x97\xf8\x2e\xe9\x07\xb3\x95\x48\x7d\x81\x87\x90\xf1\x0c\xba\x6c\ +\x06\x9a\x46\x89\x01\x39\x9f\x88\xbe\x32\x31\x3b\xe2\x9f\x73\x57\ +\x2b\x45\x13\xfb\x09\x07\x0d\xd2\x4d\x9b\x7c\xbf\xe4\x84\xeb\xc3\ +\x13\x05\xaa\x02\xc8\x40\x1b\xd1\xfa\x31\x69\xe8\xf2\x69\xe0\x1a\ +\x20\x30\xd2\x06\x16\x13\xd5\x96\x26\xe7\x85\x3d\x73\xee\x6a\x61\ +\x6c\x45\x88\x88\x82\x97\x52\x43\x13\x50\x99\xd0\x47\x77\x2c\x91\ +\x5e\x69\x62\xc5\xfc\xb8\xea\x49\x38\xc7\x7b\x70\x9a\x53\xaf\xc4\ +\x74\x6f\x04\x5e\x18\x21\x03\x02\xe0\x37\x84\xb5\x87\xb3\x4a\x02\ +\xe6\xbc\x7b\x5a\x49\xcf\x8b\x0e\xc1\x0b\x40\xe0\x48\x48\xd4\xa3\ +\xcc\xcf\x29\xa1\xbe\xa3\x93\xce\x40\x17\x96\x6e\xe1\x4c\xeb\x21\ +\x70\x2c\x09\x5c\x6d\xf1\x08\x1a\xe0\x41\x82\xfa\x23\xf9\x13\xfa\ +\x98\x7b\x67\x2b\xc9\x99\x36\xb1\xb0\xf1\xb5\x31\x24\x2e\xae\x94\ +\x94\x25\x5e\x4d\x55\x4a\x0d\x53\xd2\x74\x1e\x3f\xb6\x82\x23\x7d\ +\x2d\x58\xf9\x31\x42\xc9\x36\x6e\xb7\x35\x69\x24\xf6\x80\x8e\xe4\ +\x51\xa2\xe2\x81\xe2\xcb\x7a\xa8\xb9\xf5\x24\x49\xe9\x0a\x3e\x32\ +\x0c\xaf\xd0\xd1\x30\xa9\x48\xbe\x9a\xf2\xa4\xef\x91\xee\x29\xe3\ +\x82\x84\x14\xee\x2e\x6e\xa3\xae\x73\x05\xcd\x07\x34\xce\x84\x74\ +\x10\xf4\xc5\xdb\x80\x89\x94\x4b\x89\xea\xb7\x96\x28\xf8\x79\x4b\ +\xbe\xc0\xb4\x24\xb1\xa8\x01\x00\x08\x5c\xe9\x20\x30\xa8\x4c\xa9\ +\x65\x5c\xe2\x55\xe4\x7a\xcb\xd1\x30\xf8\xa4\x77\x1b\x27\xec\xf5\ +\xf8\x5a\x22\x74\x2c\xcb\xc1\x0d\xea\x41\x0c\xf9\x60\x1c\x0d\xc8\ +\x64\xa4\x78\x8a\xa8\x76\xcb\xb8\xe9\x5d\xd4\x2c\xfe\x12\xc3\x00\ +\x3b\xa6\x33\x0c\x6f\x23\xb0\xa8\x4a\x9d\x4f\x49\xe2\x15\x64\x7b\ +\xc6\x21\xd0\x39\x12\xd8\xce\xde\x40\x1d\x7b\x1a\xdb\x79\xfb\xe9\ +\x7c\xfa\xdb\x8d\x5e\x3c\xf2\x36\x60\x6d\x9c\x0c\x88\x4c\x5c\x56\ +\x61\x8b\xef\x57\xd6\xb6\x33\xf5\x87\x5d\x58\x06\x38\x8e\x40\x22\ +\x00\x0d\x47\x3a\x58\x22\x91\x8b\x53\xaf\x67\x6c\xc2\x64\x72\x3d\ +\x15\x38\xd2\xa6\xb9\x7f\x33\xfb\x82\x75\xec\xda\xde\xcf\xd6\x67\ +\xc7\x10\x0d\x68\x2d\x0a\x7e\x11\xb0\x23\x3e\x2f\x32\x41\x2e\x0e\ +\x6b\x71\xc5\x65\xe5\xb3\x3b\x98\x54\xdb\x8d\xa9\x03\x2e\x80\x18\ +\xca\x7c\x0c\x4b\x4b\x64\xd2\x57\xf0\xfe\x29\xaa\x6c\x2a\xb0\xdd\ +\x10\xff\xee\xdf\xc6\xde\xd0\x4a\xde\xdf\x12\xe3\xdd\xa5\x05\xd8\ +\x11\xed\x04\x96\x5c\x08\xec\x8e\x53\x2b\x21\x27\xe2\x68\xcf\x0b\ +\x5d\x56\x97\x5f\xd3\xce\x45\x33\xce\xa0\x4b\x94\x86\xe1\x1d\x05\ +\xef\xd7\x33\x54\xe6\x6f\xa0\xd0\x7f\xe9\x40\xd9\x44\x9c\x3e\x95\ +\xf9\x4d\xec\xeb\xff\x17\xef\xd5\x3b\xec\xaa\xcb\xc5\xb6\x69\x54\ +\xf0\x8b\x91\x34\xc7\xab\x99\xab\xc6\x16\xab\x84\xe1\x96\x8e\x9f\ +\xdb\x41\xe9\xe4\x00\xba\x0b\xa6\x01\x86\x0e\x20\x88\x49\x87\x24\ +\x23\x9b\xc9\xa9\x37\x92\xef\x9b\xa8\xe0\x2f\x24\xe0\x9c\xe6\x60\ +\x5f\x03\x7b\x7b\xd7\xf2\xee\x3a\x9d\x0f\x57\x67\x83\xc6\x76\x0c\ +\x95\x79\x57\xb4\xc5\xe7\x40\x23\x98\x8a\xea\x28\x75\xaf\x93\x57\ +\x5c\xd3\x45\xfe\xc4\x20\x9a\x0d\xba\x05\xa6\x0e\x02\xb0\xa5\x4b\ +\xb2\x99\xc3\xe4\x94\x85\x83\xf0\xde\x72\x7a\x63\x1d\x34\x07\x36\ +\xd0\x78\x66\x0d\xef\xbc\xe6\xa5\xf1\x8d\x2c\x30\xe5\x66\x04\xb7\ +\x7c\x0d\x1f\x0f\x03\x0b\x14\xfc\x73\x7a\x82\x9d\x7a\x41\x6d\x27\ +\x39\x25\x11\x74\x07\xcc\x21\x78\x53\x80\x23\x21\xdd\x1a\xc3\x25\ +\xa9\x37\x91\xe7\xad\x24\x53\x95\x4d\x77\xb4\x85\xa6\xc0\x3a\xf6\ +\x76\x35\xf0\xd6\x4b\x29\x1c\xd9\x91\x0a\x96\xb3\x12\x21\x96\x28\ +\xf8\x50\xbc\x8e\x94\x8b\x15\xfc\x3f\xf4\x64\x3b\x29\xbf\xa6\x93\ +\xd4\xc2\x18\x9a\x03\x86\x05\xa6\x06\x96\x92\x03\xaa\x54\x8a\x54\ +\xcd\xff\x98\x3c\xcf\x04\x32\x3c\xc5\x74\x45\x4f\x28\xf8\xd7\x69\ +\x6c\xdf\xc4\x86\x97\x53\x38\xba\x33\x19\x2c\xf7\x59\xa4\xb8\x07\ +\x49\x2c\x5e\x67\xe2\xbb\x88\x89\x27\x8c\xac\x88\x99\x31\xfd\x34\ +\x49\xb9\x36\x86\x03\x96\xa5\xa4\x83\xa1\xa4\x09\x28\xf0\x8d\xa7\ +\x32\x65\xbe\xca\xfc\x45\xa4\x99\x85\xb4\x47\x8e\x29\xf8\x35\x7c\ +\xd4\xba\x8d\x4d\xcb\x53\x39\xf1\x71\x32\x78\xdd\x47\x90\xe2\x8f\ +\x4a\xb1\x38\x1c\xea\x05\x4a\xbf\xc7\xe6\x61\x2d\x27\x42\xd2\x95\ +\x3d\xf8\x33\x9c\x01\x78\xd3\x1c\x2a\x1b\x0d\x34\xa5\xc2\x84\xf1\ +\x4c\x4a\x5d\x48\xb6\xa7\x82\x54\xab\x90\xb6\x70\x33\xfb\x02\xaf\ +\xb2\xbb\x65\x07\x6f\xfe\x33\x87\xf6\xc3\x7e\x07\xbf\xf3\x10\x52\ +\x3c\xaa\x14\xaf\xa9\x84\xfc\x33\x8e\xfc\x1d\x39\x51\xbc\x57\x9c\ +\xc1\x93\xec\x62\xb8\xc3\x65\x63\x28\x21\xa0\x34\xb1\x8a\x4b\xd3\ +\xae\x57\xf5\x5e\x46\x8a\x91\xcf\xa9\x70\x13\xfb\x83\xab\xd8\x75\ +\xec\x43\xde\x7a\x31\x9b\x8e\x63\x5e\x1b\x9f\x7b\x1f\x52\x3c\x19\ +\xaf\xb1\x8a\x07\xf8\x3b\xb6\xb8\x9d\xc2\x10\xfa\xc5\xfd\x58\x3e\ +\x89\x29\x87\xb2\xae\x0f\xc2\x6b\x02\x26\xa6\x4d\xa3\x3a\x7d\xf6\ +\xc0\x0b\xca\xaf\x67\xf2\x79\x68\x0f\xfb\x82\xaf\xb0\xa3\xa9\x89\ +\x8d\x2f\x67\xd3\x7b\xca\x13\xc4\xeb\x2e\x42\x6a\x6b\x91\x10\x0f\ +\x03\xd6\x40\x53\xe6\x68\x8b\x29\x0a\xc1\x84\x00\xa6\x22\xb7\x00\ +\x4b\x53\x1a\x82\xd7\x05\x54\x29\xf8\xc9\x69\xb5\xe4\xf9\x2a\x48\ +\x30\x32\x68\x0d\xee\x61\x7f\x68\x39\xdb\x0f\x34\xd1\xf0\x7c\x1e\ +\xc1\xd3\x66\x97\x82\xbf\x15\x57\x34\xc4\x67\xb0\x25\xc8\xc2\xe5\ +\x79\x60\x1e\xa5\x41\x28\x0f\x22\x04\x98\x62\x38\xf3\xba\x18\x2c\ +\x9f\xea\xac\x59\x4c\xc9\xac\xa1\xc0\x3f\x1e\x9f\x9e\xc0\x67\xc1\ +\x9d\x2a\xf3\xcb\x78\x67\xe7\x71\xde\x59\x9d\x4b\xa8\x57\x3f\x8e\ +\x47\xde\x8e\x23\xb6\xc6\x6b\x32\x67\x02\x2f\x83\xa8\xa5\x2c\x08\ +\xe3\x22\xe0\x80\xc1\x37\x37\xab\xa9\x0b\x66\xe4\xcc\xe1\xd2\x8c\ +\x99\x14\xfa\xcb\xf1\xea\x7e\x8e\x07\xb7\xd3\xd8\xbf\x9c\x2d\x3b\ +\x5a\xd9\xba\x3a\x07\x3b\xac\x1f\xc5\x94\xf3\x91\xa2\xf9\xdc\x8c\ +\x16\x85\xcb\x59\x21\xc4\x4c\x6c\x6a\xc9\x0d\x43\xc9\x20\x3c\xf2\ +\x9b\xf0\x3e\xc3\x54\xf0\x3f\x60\x92\x82\x1f\xa3\x32\xef\xd1\x7d\ +\x0a\x7e\x1b\x8d\xbd\x2b\xd8\xfc\xde\xe7\x6c\x7d\x2d\x07\x69\x8b\ +\xbd\x58\xf2\x26\x5c\x71\xf8\xdc\xcd\x46\x35\xc9\x59\x21\xb9\x03\ +\x03\xac\x62\x97\xa8\x00\xdc\xc1\x72\xb1\xf4\x41\x78\xbf\x61\x31\ +\xbb\xe0\x3a\x95\xf9\xcb\x29\x4e\xac\x44\x10\xe5\x70\xa0\x81\x7d\ +\x7d\xcb\x78\xb3\xbe\x8f\x8f\x36\x64\x83\x60\x23\x86\xfc\xa9\x82\ +\x3f\x75\x6e\x87\xbb\xe2\x2c\x03\x13\x88\x45\xe7\xce\x2a\xbd\x88\ +\x84\x42\xc9\xfa\xce\xbd\xa0\x0d\x35\x66\x02\x12\x15\xfc\xbc\xb1\ +\x0b\x54\xe6\x2f\xa3\x28\xa9\x62\xa0\x45\xfe\x34\xb4\x99\x03\x7d\ +\xcb\x59\xbf\x2e\x40\xe3\xd6\x74\xd0\xe5\x06\x04\x5f\x65\xfe\x0c\ +\x40\x7c\x0d\x48\xf9\x80\x61\xea\x89\xbf\xbe\x7c\x36\x49\xf9\x89\ +\xbc\x7d\xfa\x20\x21\x37\x0a\x40\xa6\x37\x85\x1f\x15\x5d\xcb\xa4\ +\x74\x05\x9f\x58\x46\xcc\x0d\x71\x28\x50\xcf\xfe\xae\xd7\xd8\xf4\ +\x56\x3f\x4d\xef\x0f\xc0\xbf\x08\xe2\x57\x48\xfa\x61\x38\xe2\x55\ +\x42\x05\x44\x22\x0b\x66\x5e\x38\x99\x59\x65\x55\xf8\xbd\xe9\xdc\ +\x3e\x76\x1e\x4f\x1d\x5d\xc3\x98\xb4\x2c\x16\x14\x5f\xc7\xa4\xcc\ +\x4b\x28\x4d\x1e\x4f\xc8\xe9\xe6\x60\x7f\x3d\xbb\x3b\x57\xb2\xe5\ +\x0d\xf8\x74\x4f\x2a\x58\xee\x13\x20\xee\xc3\xfd\xb6\x8d\x05\xe7\ +\x7e\x13\x4b\x16\xa1\x91\xbc\xa8\x6a\x3a\x1e\x6f\x32\x61\xcd\xe0\ +\xa1\x8a\x3b\x39\x10\x38\x81\xe1\xf5\x52\x9d\xa5\x6a\x3e\xa9\x94\ +\xde\x58\x3b\xfb\xfb\xd6\xb3\xeb\xcb\x3a\xd5\xcb\x0b\xbe\x68\x4e\ +\x00\x9f\xfb\x18\x52\x3c\xa0\xe0\xf9\x46\xc4\xb1\x84\xf2\xb0\xed\ +\xfb\xa7\x97\x4d\xe4\xda\xca\x69\x84\x85\x01\x86\x45\x96\x37\x83\ +\x35\x33\x97\x72\xdb\xce\xfb\x79\xe5\xe8\x5a\x6e\x2e\x9b\xcb\x91\ +\xd0\x46\x76\x1c\x5f\xcf\x07\x0d\x3a\xdd\x2d\x7e\xf0\xca\x7b\x71\ +\x87\x5b\x83\x91\x32\x70\x03\x8e\xcc\xb9\x2a\x77\x0a\x59\x69\xb9\ +\xf4\xc5\x24\x9a\x95\x40\x4c\x37\xc8\xf0\xa4\xf3\x66\xcd\x4b\x3c\ +\x79\x68\x29\x7f\xd9\xf5\x24\x9d\x27\x0f\xd3\x79\xc8\x20\xd0\xe6\ +\x75\xb1\xdc\x25\x48\xed\x45\x80\x91\x34\x60\xa8\xcf\x9f\xe0\xf8\ +\x79\xfa\x95\x83\xcc\x28\x3e\x46\xed\xf4\xa9\x80\x1f\x2c\x1f\x5d\ +\x3d\xed\xbc\x7f\x74\x0f\x2d\xcd\x1d\x9c\xfa\x38\xc0\xc9\x2f\x0d\ +\x94\xbb\x56\x3c\xee\x6f\x91\x62\x25\x12\x46\xda\xc0\x42\x34\x77\ +\x0a\x3d\x39\x74\x77\x84\xf9\xe5\x5f\xeb\x78\x35\xb3\x00\x33\x05\ +\xd6\x36\x6e\x62\xc5\x07\xeb\x38\x72\xf2\x18\xc4\x6c\x1b\xd3\xf7\ +\x31\x1e\xbd\x1e\x29\x5f\x40\x8a\x56\x00\x18\x59\x03\x3a\x9a\xbc\ +\x9b\xde\x24\xe8\xcc\x80\x94\x18\xc7\xc3\x9f\x30\xeb\xf1\x9f\xe1\ +\xf8\x7b\x09\xf7\xf6\xc7\x10\xda\x61\x0c\x6b\xb3\xd2\x6a\xa4\xf8\ +\x50\xc9\x1e\xce\xfa\xc8\x1b\xa8\x06\xa6\xe1\xe8\x50\xf4\x19\x24\ +\xf7\x82\x61\x3b\x01\xc7\x3d\x40\x58\x5b\x85\xc7\xb3\x19\x29\x9a\ +\x94\x22\x48\x40\x8e\xbe\x6b\xd6\xb9\x48\x34\xd2\x7a\x24\x82\x43\ +\x38\xda\x4a\x5c\xb1\x19\x61\xee\x41\x43\x41\x8f\xfe\x7b\xe2\x04\ +\xe0\x4f\x48\xb6\x28\xf0\xdd\x48\x82\xdf\xa9\x7b\x62\xf9\x8c\xbc\ +\xff\xfc\x4d\xfd\x79\x03\xff\x67\x06\xfe\x03\x1b\x85\x94\x1a\x1f\ +\xbe\x73\xb2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x07\xc9\ +\x73\ +\x61\x76\x65\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\ +\xa8\x99\xe7\xb1\xa4\xe4\xbf\x9d\xe5\xad\x98\xe5\x88\xb0\xe5\x85\ +\xb6\xe4\xbb\x96\xe6\x96\x87\xe4\xbb\xb6\x0a\x63\x68\x61\x6e\x67\ +\x65\x53\x61\x76\x65\x44\x69\x72\x3d\xe6\x94\xb9\xe8\xae\x8a\xe5\ +\xad\x98\xe6\x94\xbe\xe7\x9b\xae\xe9\x8c\x84\x0a\x6f\x70\x65\x6e\ +\x46\x69\x6c\x65\x3d\xe9\x96\x8b\xe5\x95\x9f\xe6\xaa\x94\xe6\xa1\ +\x88\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\ +\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe7\xb7\x9a\ +\xe6\xa2\x9d\xe9\xa1\x8f\xe8\x89\xb2\x0a\x72\x65\x73\x65\x74\x41\ +\x6c\x6c\x3d\xe9\x87\x8d\xe7\xbd\xae\x0a\x63\x72\x74\x42\x6f\x78\ +\x3d\xe5\x89\xb5\xe5\xbb\xba\xe5\x8d\x80\xe5\xa1\x8a\x0a\x63\x72\ +\x74\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\xe7\x95\xab\xe4\xb8\ +\x80\xe5\x80\x8b\xe5\x8d\x80\xe5\xa1\x8a\x0a\x64\x75\x70\x42\x6f\ +\x78\x44\x65\x74\x61\x69\x6c\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe5\x8d\ +\x80\xe5\xa1\x8a\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x3d\xe9\ +\xa9\x97\xe8\xad\x89\xe5\x9c\x96\xe5\x83\x8f\x0a\x7a\x6f\x6f\x6d\ +\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe6\x94\xbe\xe5\xa4\xa7\x0a\ +\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\ +\xe9\xa9\x97\xe8\xad\x89\xe5\x9c\x96\xe5\x83\x8f\x0a\x73\x61\x76\ +\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\xa8\x99\xe7\xb1\ +\xa4\xe5\xad\x98\xe5\x88\xb0\x0a\x6f\x70\x65\x6e\x46\x69\x6c\x65\ +\x44\x65\x74\x61\x69\x6c\x3d\xe6\x89\x93\xe9\x96\x8b\xe5\x9c\x96\ +\xe5\x83\x8f\x0a\x66\x69\x74\x57\x69\x64\x74\x68\x44\x65\x74\x61\ +\x69\x6c\x3d\xe8\xaa\xbf\xe6\x95\xb4\xe5\x88\xb0\xe7\xaa\x97\xe5\ +\x8f\xa3\xe5\xaf\xac\xe5\xba\xa6\x0a\x74\x75\x74\x6f\x72\x69\x61\ +\x6c\x3d\x59\x6f\x75\x54\x75\x62\x65\xe6\x95\x99\xe5\xad\xb8\x0a\ +\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x3d\xe7\xb7\xa8\xe8\xbc\xaf\ +\xe6\xa8\x99\xe7\xb1\xa4\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\ +\x61\x74\x69\x6f\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe6\x89\x93\xe9\ +\x96\x8b\xe6\xa8\x99\xe7\xb1\xa4\xe6\x96\x87\xe4\xbb\xb6\x0a\x71\ +\x75\x69\x74\x3d\xe7\xb5\x90\xe6\x9d\x9f\x0a\x73\x68\x61\x70\x65\ +\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\ +\xe6\x9b\xb4\xe6\x94\xb9\xe5\xa1\xab\xe5\x85\x85\xe9\xa1\x8f\xe8\ +\x89\xb2\x0a\x63\x6c\x6f\x73\x65\x43\x75\x72\x44\x65\x74\x61\x69\ +\x6c\x3d\xe9\x97\x9c\xe9\x96\x89\xe7\x9b\xae\xe5\x89\x8d\xe6\xaa\ +\x94\xe6\xa1\x88\x0a\x63\x6c\x6f\x73\x65\x43\x75\x72\x3d\xe9\x97\ +\x9c\xe9\x96\x89\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\xe5\ +\x88\xaa\xe9\x99\xa4\xe5\x9c\x96\xe5\x83\x8f\x0a\x64\x65\x6c\x65\ +\x74\x65\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\xaa\xe9\ +\x99\xa4\xe7\x9b\xae\xe5\x89\x8d\xe5\x9c\x96\xe5\x83\x8f\x0a\x66\ +\x69\x74\x57\x69\x6e\x3d\xe8\xaa\xbf\xe6\x95\xb4\xe5\x88\xb0\xe8\ +\xb7\x9f\xe7\xaa\x97\xe5\x8f\xa3\xe4\xb8\x80\xe6\xa8\xa3\xe5\xa4\ +\xa7\xe5\xb0\x8f\x0a\x64\x65\x6c\x42\x6f\x78\x3d\xe5\x88\xaa\xe9\ +\x99\xa4\xe9\x81\xb8\xe5\x8f\x96\xe5\x8d\x80\xe5\xa1\x8a\x0a\x62\ +\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\ +\x6c\x3d\xe9\x81\xb8\xe6\x93\x87\xe6\xa1\x86\xe7\xb7\x9a\xe9\xa1\ +\x8f\xe8\x89\xb2\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\ +\x65\x3d\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0a\x72\ +\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\x87\ +\x8d\xe8\xa8\xad\xe6\x89\x80\xe6\x9c\x89\xe8\xa8\xad\xe5\xae\x9a\ +\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\x61\x69\x6c\x3d\xe7\ +\x95\xab\xe9\x9d\xa2\xe6\x94\xbe\xe5\xa4\xa7\x0a\x73\x61\x76\x65\ +\x3d\xe5\x84\xb2\xe5\xad\x98\x0a\x73\x61\x76\x65\x41\x73\x3d\xe5\ +\x8f\xa6\xe5\xad\x98\xe7\x82\xba\x0a\x66\x69\x74\x57\x69\x6e\x44\ +\x65\x74\x61\x69\x6c\x3d\xe7\xb8\xae\xe6\x94\xbe\xe5\x88\xb0\xe7\ +\xaa\x97\xe5\x8f\xa3\xe4\xb8\x80\xe6\xa8\xa3\x0a\x6f\x70\x65\x6e\ +\x44\x69\x72\x3d\xe9\x96\x8b\xe5\x95\x9f\xe7\x9b\xae\xe9\x8c\x84\ +\x0a\x63\x6f\x70\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\ +\x67\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe7\x95\xb6\xe5\x89\x8d\xe5\x9c\ +\x96\xe5\x83\x8f\xe4\xb8\xad\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\ +\xe5\x80\x8b\xe9\x82\x8a\xe7\x95\x8c\xe6\xa1\x86\x0a\x73\x68\x6f\ +\x77\x48\x69\x64\x65\x3d\xe9\xa1\xaf\xe7\xa4\xba\x2f\xe9\x9a\xb1\ +\xe8\x97\x8f\xe6\xa8\x99\xe7\xb1\xa4\x0a\x63\x68\x61\x6e\x67\x65\ +\x53\x61\x76\x65\x46\x6f\x72\x6d\x61\x74\x3d\xe6\x9b\xb4\xe6\x94\ +\xb9\xe5\x84\xb2\xe5\xad\x98\xe6\xa0\xbc\xe5\xbc\x8f\x0a\x73\x68\ +\x61\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x3d\xe5\xa1\xab\ +\xe5\x85\x85\xe9\xa1\x8f\xe8\x89\xb2\x0a\x71\x75\x69\x74\x41\x70\ +\x70\x3d\xe9\x9b\xa2\xe9\x96\x8b\xe6\x9c\xac\xe7\xa8\x8b\xe5\xbc\ +\x8f\x0a\x64\x75\x70\x42\x6f\x78\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe5\ +\x8d\x80\xe5\xa1\x8a\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\ +\x69\x6c\x3d\xe5\x88\xaa\xe9\x99\xa4\xe5\x8d\x80\xe5\xa1\x8a\x0a\ +\x7a\x6f\x6f\x6d\x69\x6e\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe7\x95\xab\ +\xe9\x9d\xa2\x0a\x69\x6e\x66\x6f\x3d\xe8\xb3\x87\xe8\xa8\x8a\x0a\ +\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x3d\xe9\ +\x96\x8b\xe5\x95\x9f\xe6\xa8\x99\xe7\xb1\xa4\x0a\x70\x72\x65\x76\ +\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8a\xe4\xb8\x80\ +\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x66\x69\x74\x57\x69\x64\ +\x74\x68\x3d\xe7\xb8\xae\xe6\x94\xbe\xe5\x88\xb0\xe8\xb7\x9f\xe7\ +\x95\xab\xe9\x9d\xa2\xe4\xb8\x80\xe6\xa8\xa3\xe5\xaf\xac\x0a\x7a\ +\x6f\x6f\x6d\x6f\x75\x74\x3d\xe7\xb8\xae\xe5\xb0\x8f\xe7\x95\xab\ +\xe9\x9d\xa2\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\ +\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\xe6\x9b\xb4\ +\xe6\x94\xb9\xe9\xa0\x90\xe8\xa8\xad\xe6\xa8\x99\xe7\xb1\xa4\xe5\ +\xad\x98\xe7\x9a\x84\xe7\x9b\xae\xe9\x8c\x84\x0a\x6e\x65\x78\x74\ +\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8b\xe4\xb8\x80\ +\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x6f\x72\x69\x67\x69\x6e\ +\x61\x6c\x73\x69\x7a\x65\x44\x65\x74\x61\x69\x6c\x3d\xe6\x94\xbe\ +\xe5\xa4\xa7\xe5\x88\xb0\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\ +\xb0\x8f\x0a\x70\x72\x65\x76\x49\x6d\x67\x3d\xe4\xb8\x8a\xe4\xb8\ +\x80\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x74\x75\x74\x6f\x72\ +\x69\x61\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\xa1\xaf\xe7\xa4\xba\ +\xe7\xa4\xba\xe7\xaf\x84\xe5\x85\xa7\xe5\xae\xb9\x0a\x73\x68\x61\ +\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\xe5\xbd\xa2\xe7\ +\x8b\x80\xe7\xb7\x9a\xe6\xa2\x9d\xe9\xa1\x8f\xe8\x89\xb2\x0a\x62\ +\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\xe6\x97\xa5\xe6\ +\x9c\x9f\xe5\x88\x86\xe9\x9a\x94\xe7\xb7\x9a\xe9\xa1\x8f\xe8\x89\ +\xb2\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x44\x65\x74\x61\x69\ +\x6c\x3d\xe4\xbf\xae\xe6\x94\xb9\xe6\x89\x80\xe9\x81\xb8\xe5\x8d\ +\x80\xe5\xa1\x8a\xe7\x9a\x84\xe6\xa8\x99\xe7\xb1\xa4\x0a\x6e\x65\ +\x78\x74\x49\x6d\x67\x3d\xe4\xb8\x8b\xe4\xb8\x80\xe5\xbc\xb5\xe5\ +\x9c\x96\xe7\x89\x87\x0a\x75\x73\x65\x44\x65\x66\x61\x75\x6c\x74\ +\x4c\x61\x62\x65\x6c\x3d\xe4\xbd\xbf\xe7\x94\xa8\xe9\xa0\x90\xe8\ +\xa8\xad\xe6\xa8\x99\xe7\xb1\xa4\x0a\x75\x73\x65\x44\x69\x66\x66\ +\x69\x63\x75\x6c\x74\x3d\xe6\x9c\x89\xe9\x9b\xa3\xe5\xba\xa6\xe7\ +\x9a\x84\x0a\x62\x6f\x78\x4c\x61\x62\x65\x6c\x54\x65\x78\x74\x3d\ +\xe5\x8d\x80\xe5\xa1\x8a\xe7\x9a\x84\xe6\xa8\x99\xe7\xb1\xa4\x0a\ +\x6c\x61\x62\x65\x6c\x73\x3d\xe6\xa8\x99\xe7\xb1\xa4\x0a\x61\x75\ +\x74\x6f\x53\x61\x76\x65\x4d\x6f\x64\x65\x3d\xe8\x87\xaa\xe5\x8b\ +\x95\xe5\x84\xb2\xe5\xad\x98\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x73\x69\ +\x6e\x67\x6c\x65\x43\x6c\x73\x4d\x6f\x64\x65\x3d\xe5\x96\xae\xe4\ +\xb8\x80\xe9\xa1\x9e\xe5\x88\xa5\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x64\ +\x69\x73\x70\x6c\x61\x79\x4c\x61\x62\x65\x6c\x3d\xe9\xa1\xaf\xe7\ +\xa4\xba\xe9\xa1\x9e\xe5\x88\xa5\x0a\x66\x69\x6c\x65\x4c\x69\x73\ +\x74\x3d\xe6\xaa\x94\xe6\xa1\x88\xe6\xb8\x85\xe5\x96\xae\x0a\x66\ +\x69\x6c\x65\x73\x3d\xe6\xaa\x94\xe6\xa1\x88\x0a\x69\x63\x6f\x6e\ +\x4c\x69\x73\x74\x3d\x58\x58\x0a\x69\x63\x6f\x6e\x3d\x58\x58\x0a\ +\x61\x64\x76\x61\x6e\x63\x65\x64\x4d\x6f\x64\x65\x3d\xe9\x80\xb2\ +\xe9\x9a\x8e\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x61\x64\x76\x61\x6e\x63\ +\x65\x64\x4d\x6f\x64\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\x87\ +\xe5\x88\xb0\xe9\x80\xb2\xe9\x9a\x8e\xe6\xa8\xa1\xe5\xbc\x8f\x0a\ +\x73\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\ +\x3d\xe9\xa1\xaf\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe5\x8d\x80\ +\xe5\xa1\x8a\x0a\x68\x69\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\ +\x74\x61\x69\x6c\x3d\xe9\x9a\xb1\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\ +\x89\xe5\x8d\x80\xe5\xa1\x8a\x0a\ +\x00\x00\x09\x4d\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x09\x02\x49\x44\x41\x54\x68\x81\xed\x9a\x7b\x54\ +\x93\xf7\x19\xc7\x3f\x6f\x02\x04\x84\x70\xf1\x08\x82\x17\x44\x10\ +\xc1\x8a\xab\xb4\x38\xb1\xd5\xf5\x88\x99\x52\x56\x95\x7a\xc6\x2c\ +\x9d\xb5\x30\xd6\x33\xa7\xa7\xdd\xe9\x6d\x2d\x3b\x6e\x6d\x57\xb7\ +\xb5\xb5\xad\xae\xb6\xdb\xa9\xb6\xd4\x56\x5d\xab\x5d\x77\x4a\x71\ +\x30\x10\x5b\x6a\x5b\xea\x44\x04\x05\xa3\xf5\x16\xa1\x48\x02\x28\ +\x97\x24\xe4\x9e\xbc\xfb\x83\x06\xd3\x98\x40\x02\xa8\xff\xec\x39\ +\x27\xe7\x79\x79\xf3\xfb\x3d\xf9\x7c\x7f\xcf\xf3\xbb\xbc\x09\xf0\ +\x7f\xbb\xb9\x26\x78\xba\xa9\x50\x28\x12\x81\x6d\x52\xa9\xf4\x4e\ +\x41\x10\x22\x6e\x30\x93\xbb\xd9\xec\x76\xfb\x29\x51\x14\x37\x55\ +\x57\x57\xef\x1b\xb6\xb5\x42\xa1\x88\xc8\xcb\xcb\xeb\xac\xab\xab\ +\x13\x4d\x26\x93\x38\x52\x73\x38\x1c\x63\xf2\x32\x1a\x8d\x62\x5d\ +\x5d\x9d\x98\x97\x97\x27\x2e\x5c\xb8\xf0\x01\x77\xde\x00\xf7\x1b\ +\xfd\xfd\xfd\x6b\x36\x6c\xd8\x10\x9d\x91\x91\x81\x28\x8a\x38\x1c\ +\x0e\x00\x44\x51\xfc\x9e\xf7\x74\x6f\x24\xde\x97\x78\xb3\x67\xcf\ +\x26\x3f\x3f\x9f\x2d\x5b\xb6\x3c\x01\xfc\x03\xb0\x3b\xfb\x48\xdc\ +\x05\x88\xa2\x78\x4b\x42\x42\xc2\xf7\x82\x7b\x83\x77\x58\xad\xf4\ +\x2a\x95\x58\xf5\xfa\xeb\x06\x2f\x8a\x22\x16\x8b\x85\xe9\xd3\xa7\ +\x23\x08\xc2\x14\x20\xdc\x95\xd7\x93\x00\xe9\x50\x01\x9d\xd7\xa7\ +\xb7\x6f\xe7\xc3\x19\x33\xa8\x5c\xba\x98\x0a\x85\x82\x2b\x97\x2e\ +\x5d\x17\x78\x37\x36\x80\x60\xd7\x7b\xd7\x94\xd0\x50\x81\x01\x1c\ +\x76\x3b\x5f\xad\x5b\x87\x55\xd5\xc8\xfd\x7f\x9e\x87\xc4\x78\x86\ +\xb6\xb4\x55\x1c\x2e\x28\x20\x63\xe7\x4e\xa2\xe3\xe2\xc6\x14\xde\ +\x53\x5b\x57\xbb\x26\x03\xce\x9a\xf7\x26\xa8\xae\xb8\x98\x10\x73\ +\x2b\x4b\x57\x9a\x90\x98\xcf\x72\x79\xee\x1a\xda\x02\x57\xb0\xf8\ +\xd5\x1f\xd1\xf8\xd8\x63\xf4\xf6\xf4\x8c\x39\xbc\xd3\xbb\xb3\x79\ +\x15\xe0\x4d\x7d\xf7\x89\x13\xa8\x76\x95\x90\xb9\x48\x0f\x61\x12\ +\xfa\xa6\xcc\x42\x1f\xbb\x86\x84\xf8\xf1\x84\x4b\x0e\x90\xf5\xdb\ +\x78\xea\x37\x6e\x44\xef\x65\x4e\x8c\x76\x01\xf0\x49\x80\xfb\x07\ +\xb8\x5e\xb7\x56\x56\x92\x56\xa0\xa0\x3f\xc4\x41\x73\xf4\x22\xbe\ +\x74\x6c\xa0\x5d\x7d\x85\x28\xe1\x6b\xa4\x53\x1e\x22\x2c\xa4\x9a\ +\xdb\x73\x64\x1c\xdb\xbc\x19\xa3\xd1\x38\xa6\xf0\xde\xcc\xd3\x24\ +\xf6\xfa\x61\x53\x72\x73\xf9\x66\x7f\x23\xff\x11\x57\x52\xdf\x97\ +\x4b\x88\xb4\x83\x59\x92\x42\x64\xda\xd7\x41\x10\x61\xf2\x23\xc4\ +\x25\x1f\x62\xf2\xf8\x16\x1a\x76\xec\xc0\x62\xb1\x8c\x19\xbc\xcf\ +\x19\x70\x6d\xe4\x1e\x64\x7c\x52\x12\xb7\xfe\x6d\x07\x92\xb7\x3f\ +\x64\x55\xda\x46\xb2\x26\xdd\x4f\x94\xec\x04\xf4\x1f\x82\xde\x8f\ +\x40\x12\x0c\xb1\x45\xcc\x59\x7e\x86\x30\xf5\x67\x34\xec\xd9\x83\ +\xd5\x6a\x1d\x13\x78\x77\xb6\x61\x05\x78\x0b\x92\xb0\x60\x01\xd3\ +\x1f\x7f\x96\x23\x2f\x06\x22\x4a\x62\x41\xca\xc0\xab\xbf\x0a\xb4\ +\xa5\x10\x18\x0d\x13\x56\xb3\x60\xbd\x16\x73\xd5\x4e\x4e\x94\x96\ +\x62\xb7\xdb\x47\x0d\xef\x7e\xed\x55\xc0\x50\x1b\x98\xd3\xa7\x64\ +\x67\x33\x4e\x51\xc8\xb1\x0f\xe7\xe3\x10\xc6\x0f\x08\x90\x88\xd0\ +\x5f\x06\xba\x2a\x08\x8a\x87\xf0\x65\xe4\xbc\x22\xa7\x6b\xc7\xcb\ +\x28\x6b\x6a\x7c\x8a\x3b\xdc\xea\x65\xb7\x0f\x6e\xc0\xde\x05\x0c\ +\x97\x01\xa7\xbf\x75\xcd\x1a\x74\xf2\x3b\xb8\xd8\x90\x8b\x28\x91\ +\x0f\x88\x10\xec\xa0\xdb\x0b\x86\x1a\x18\x37\x0b\x42\x6f\x27\x6f\ +\xd7\x74\x2e\x3c\x53\xcc\xd9\xfa\xfa\x11\xc3\xbb\x0e\xee\xb0\x02\ +\xfc\x09\x9a\xb1\x7e\x3d\xe7\x1a\x23\x38\x7f\x64\x05\xa2\x24\xe2\ +\xbb\x4c\x58\x41\xbb\x1b\x8c\x5f\x42\xd8\x7c\x08\x9e\xca\x9a\x4f\ +\x32\x38\xf1\xf0\xc3\xb4\x7e\xf3\xcd\xa8\xe0\xfd\xda\xc8\x7c\x09\ +\x2e\x08\x02\x99\xcf\x3e\xcb\xa9\xcf\x03\xd1\xb4\xfc\x1c\xd1\x18\ +\x04\x36\x40\x30\x41\xdf\x7b\x60\xaa\x87\xb0\xc5\x08\x52\x28\xd8\ +\x7f\x17\x8d\x8f\x3e\x8a\xa6\xad\x6d\xc4\x22\x7c\x9a\xc4\xfe\xd6\ +\xaa\x44\x22\x61\xc1\x4b\x2f\x51\xfb\x7a\x0b\x5a\xd3\x3a\xd0\x49\ +\x41\x07\x98\x74\xd0\xf3\x16\x58\x9a\x20\x62\x05\xd2\x40\x35\xab\ +\xdf\xce\xa0\xa1\xb8\x98\xcb\x5d\x5d\x7e\x8b\x18\xd1\x32\xea\x6b\ +\xf0\x20\x99\x8c\x3b\xdf\x7c\x93\xf2\xe2\x46\x8c\x21\xeb\x07\x04\ +\x68\x81\xde\x6e\x50\x97\x80\xf1\x0c\x44\xe4\x23\x1b\xa7\xe4\xee\ +\xdf\x25\xd3\xf0\xdc\x73\x68\xb5\x5a\xbf\x44\xb8\x5f\xfb\x24\xc0\ +\xd7\x91\x01\x18\x27\x97\x73\xc7\xf6\xed\xec\x2b\xa8\xc1\x1a\xfe\ +\xcb\xab\x22\xba\xdb\xa1\xad\x04\xfa\x5b\x21\xbc\x88\xa8\xb8\x7a\ +\xee\xfc\x59\x14\x0d\xaf\xbd\x86\xc1\x60\xf0\x4b\x84\x5f\xcb\xa8\ +\x3f\xf0\xce\xbf\x23\x63\x63\x59\x50\x52\xc2\xae\xb5\x87\xb0\x44\ +\xe4\x5f\x15\xd1\xa9\x82\x96\x12\x30\x74\x80\xfc\x21\xa6\xa4\xd6\ +\x33\x73\x5a\x0f\x8d\x25\x25\x98\xcd\x66\x9f\xe1\xfd\x3a\x0b\xf9\ +\x0b\xef\xf4\x31\x33\x66\x90\xbe\xe5\xaf\x7c\xb0\xa1\x0e\x7b\x48\ +\xd6\x80\x08\x1d\xa0\x39\x0d\xaa\x3d\x60\xd4\x43\xc4\x43\xa4\x2d\ +\xb9\x80\xd0\xfc\x29\xcd\x07\x0f\x62\xb1\x58\x7c\x16\x31\xac\x00\ +\xe7\x69\x74\x24\xf0\x4e\x9f\x30\x7f\x3e\x33\x7f\xff\x17\xca\xb6\ +\x6a\xb1\xc9\x32\xaf\x66\xa2\xed\x28\xa8\xf6\x82\x55\x80\x88\x7c\ +\x32\x73\x17\xd2\x59\x56\x46\x5b\x5b\x9b\x4f\xf0\x7e\x6d\x64\x23\ +\x85\x77\xfa\x99\x59\x59\x44\xe6\x16\xf2\xd9\x47\x21\x38\x82\x52\ +\xae\x8a\x38\x7f\x08\x2e\x7c\x0c\xd6\x60\x82\xa6\xdf\x4e\x47\x4d\ +\x0d\xad\x2a\x95\x5f\xc7\x8d\x21\x05\x8c\x66\xe4\xdd\xfd\x9c\xd5\ +\xab\xb1\xcf\x5d\xc6\xd1\xa6\x74\xec\x21\xf1\x60\x06\xf4\x22\xf4\ +\x3b\xb0\x7d\xeb\x20\x78\xce\x5c\xa2\x6f\x49\xc6\x72\xfa\x34\x7d\ +\x7d\x7d\xc3\x42\xfb\x55\x42\xa3\x85\x77\xfa\x8c\xa2\x22\xd4\x8e\ +\xc9\x5c\xd0\xe5\xc0\xd4\x1c\xc4\x99\x4f\xa3\x0f\xcd\xc1\x38\x73\ +\x16\x0e\xbb\x85\x5b\xf2\x96\x63\x6d\x6a\x42\xa3\xd1\x8c\xed\x3e\ +\x30\x16\xf0\x4e\x9f\xf9\xe4\x93\x34\x36\xdb\x78\xf1\xfe\x83\xec\ +\xd9\x5c\x41\xbb\x4e\x8b\xcd\x70\x19\x9b\xb1\x9b\xbe\x94\x44\xba\ +\x8e\xd5\xa3\x51\xab\xbd\x0e\x9e\x3b\x9b\xab\x5d\xf3\x50\x3f\xd6\ +\xf0\x00\x82\x20\xb0\xe8\xf9\xe7\x09\x5b\xb6\x8c\xcb\xe5\xe5\x7c\ +\x5c\xb8\x99\x98\xb4\x78\xc8\xfd\x31\x8f\xfc\xab\x96\x5f\xa4\x26\ +\x31\xf1\xdc\x39\x74\xb7\xdd\x46\x78\x78\xb8\xd7\xf2\xf1\x54\x42\ +\xd7\x08\x70\xcd\xc0\x58\xc0\xbb\x8a\xb8\x6d\xd1\x22\xf4\xe9\xe9\ +\x9c\xbb\xf7\x5e\x3a\x2b\x2b\x51\x6f\xd9\x4b\x7e\xca\x54\x34\x61\ +\x21\xd8\x95\x4a\x3a\x3a\x3a\x90\xcb\xe5\x1e\xfb\xbb\x5f\x7b\x15\ +\xe0\x49\xe9\x68\xe1\x5d\x7d\x68\x68\x28\x3f\xc8\xc8\xc0\x94\x96\ +\xc6\xc5\x95\x2b\x99\x54\x51\x41\x47\x69\x29\x97\xcd\x66\x64\x2b\ +\x56\x90\x98\x98\x88\x20\x08\xd7\xf4\xf3\x36\x07\x9c\x02\x96\x00\ +\x49\x00\x3a\x9d\x6e\x56\x69\x69\x29\xf5\xf5\xf5\x1e\xf7\x03\x6f\ +\xa3\xe1\x6f\xbb\x79\xf3\xe6\x91\x32\x7b\x36\xf1\x89\x89\xa8\x72\ +\x72\xb8\x74\xe4\x08\x66\xbd\x1e\xbd\x5e\x8f\x5c\x2e\xf7\x2f\x03\ +\xf1\xf1\xf1\xc5\x45\x45\x45\x77\xc5\xc4\xc4\x88\x0e\x87\x43\x2a\ +\x95\x4a\x07\x47\xc1\x5b\xc7\xd1\x58\x6d\x6d\x2d\x36\x9b\x8d\xe4\ +\xe4\x64\x82\x83\x83\x49\x4d\x4d\x25\x29\x29\x89\xde\xde\x5e\x82\ +\x83\x83\xbd\x66\xd0\xd3\x46\x16\x00\x20\x08\x82\x90\x9f\x9f\x1f\ +\x90\x9c\x9c\x3c\xf8\x46\xc7\xc9\x46\x9a\x5b\xd5\x04\x8d\x8f\x25\ +\x29\xfd\x56\x26\x05\x0d\x79\xea\xf0\xcb\x02\x03\x03\xd1\x68\x34\ +\xdf\x83\x0b\x08\x08\x60\xc2\x84\x09\x43\x96\x9f\x5f\x67\x21\x73\ +\xe7\xbf\x51\xe4\xe4\x50\x7a\xbe\x13\xb9\xf4\xbb\x9a\xb4\xf7\x71\ +\xf8\x9c\x76\xb0\xcd\xc5\xa3\x27\xe9\xeb\xfd\x96\x4f\x2b\x3f\xe5\ +\x4c\xef\xc0\x79\xc6\x66\xd0\xf0\x79\x79\x19\x15\x07\x6a\x38\xda\ +\xd8\x44\xf3\x89\xa3\x54\x57\x7e\x81\x5a\x6f\x1b\x88\xdb\xd3\xca\ +\xa9\xe3\x8d\x28\x95\x4a\xaa\x3f\x3f\xeb\x15\xd6\x93\xf7\x64\x5e\ +\x05\xc8\x42\x1b\x91\x04\x44\xf2\xc7\xfb\x96\x0e\x0a\xd8\xff\xf0\ +\x3d\xfc\x64\xf9\x07\x83\x6d\xfa\x9a\x7e\xcd\xf8\xe8\x39\x68\x8e\ +\x3c\xc1\xdc\xe4\xd5\x00\x34\xec\xfe\x29\x59\x2b\xee\xe3\x6c\xc3\ +\xd7\x3c\x7d\x77\x36\xbd\xb5\xbf\x61\xd9\xf2\x5c\x8e\x2b\x3b\xd1\ +\xb5\x6c\x67\x72\x6c\x2a\x5a\x6c\x5c\xfc\xba\x8c\x5f\xad\xff\x83\ +\x5f\x0b\x80\x5f\x19\x50\xbd\xab\x24\x74\x62\x21\xe3\x24\x03\xf0\ +\xbd\xa7\xdf\xa0\xe8\x58\x02\x01\x5d\xef\x0f\xb6\x31\x1f\xef\x41\ +\x1a\x18\xc3\x3f\xf7\x99\x79\x6a\xdb\x0b\x00\xd8\x9b\x7a\x70\xd8\ +\x0d\x6c\xdc\x76\x85\x2a\xd5\x45\x02\x9a\x7b\x09\x9d\x58\x48\xf6\ +\x0f\x27\x61\xed\x57\xa3\xb7\x99\xf8\xef\x29\x2d\x77\x3d\xb0\x8e\ +\xea\x8a\xad\x3e\xc3\x83\x8f\x8f\x94\x4e\xab\xa9\xb8\x44\x74\xe6\ +\xf2\x81\x8e\xb6\x4e\xa2\x67\x9d\xa5\xf3\xf0\x2e\x9e\x8a\x38\x4e\ +\x8b\x79\x60\x32\x7d\xb9\xbf\x8d\xa9\x39\x6f\x32\xb9\xbb\x95\xd2\ +\xd3\x03\x0f\x27\x5f\x94\xb7\x33\x6e\xc2\x2a\x9e\x2a\x2e\xa4\xba\ +\xa2\x8c\x67\xde\x50\x12\xb3\xe0\x1e\x40\x64\xfb\xbe\xf9\xa8\xbe\ +\xda\x4d\x5b\xcd\xfb\xbc\x57\x67\x62\xda\x94\x68\xbf\xca\xc7\xa7\ +\x7d\x00\xe0\xe8\x2b\x8f\xf2\x6a\x9b\x1e\x71\xc2\x56\x0a\x0a\x76\ +\xf2\xee\xbb\xef\x41\xd2\x3b\x98\xba\x3f\xa1\xbc\xdb\xc8\xe1\xb7\ +\xce\xb0\x25\xa9\x9c\x17\x5a\x75\x48\xa7\xbe\xc6\x91\x99\x4b\xf8\ +\xd3\xba\x14\x2e\x55\xbe\xcc\x4b\xdf\xea\x08\x9b\x67\xe5\xb3\x9d\ +\xcb\xd8\x58\x77\x09\x80\xb8\x2b\x6f\xb1\x76\xf9\xe3\xec\xda\x7f\ +\x0c\x75\xdf\x23\x84\x4f\x4d\x25\x33\x2d\xd2\x6f\x78\x4f\x19\x10\ +\x00\xa6\x4d\x9b\x76\xf0\xc0\x81\x03\x59\xae\xab\xd0\xf5\xb4\x92\ +\x92\x12\xda\xdb\xdb\x59\xbb\x76\xad\x4f\x22\x64\x32\x19\x2a\x95\ +\x8a\xec\xec\xec\x6e\x83\xc1\x90\x06\xa8\x9d\xb1\x06\x33\x50\x5b\ +\x5b\x4b\x4b\x4b\xcb\x0d\x11\xa0\x54\x2a\x89\x8c\xf4\x3d\x03\xce\ +\x0d\xd5\x6b\x09\x19\x0c\x86\xdd\x9b\x36\x6d\x6a\x01\x30\x99\x4c\ +\x77\x28\x14\x8a\x94\xa8\xa8\xa8\x21\xeb\xcf\xdb\xd2\xe6\x6b\xbb\ +\xb4\xb4\x34\x9f\xe1\x9d\xe6\x75\x23\xeb\xea\xea\x7a\xa7\xab\xab\ +\xeb\x1d\x00\xa9\x54\xfa\xf7\x07\x1f\x7c\x30\x25\x3d\x3d\x7d\xf0\ +\x9b\xe5\xb1\x3c\x0b\x8d\xd4\x3b\x1c\x0e\x9f\xbf\xd8\x3a\x7f\xf2\ +\xe4\x49\x02\x03\x03\x6f\x3a\xb4\xd3\x87\x85\x85\xd1\xd4\xd4\x04\ +\xd0\x81\xcb\x4f\xac\xde\x6c\x62\x5c\x5c\x5c\x67\x55\x55\x95\x68\ +\xb5\x5a\xc5\x9b\x6d\x56\xab\x55\xac\xac\xac\x14\x63\x62\x62\x1c\ +\x12\x89\xe4\x79\x20\xcc\x15\xd6\xe3\xbf\x1a\x00\x39\xc0\x8b\xc0\ +\x34\xbc\x2c\xb5\x37\xd8\xae\x00\xfb\x81\x6d\x80\xd2\xf5\x0d\x6f\ +\x02\x00\x22\x81\x14\x40\x76\xfd\xb8\x7c\x36\x3d\xd0\xce\x40\x09\ +\x8d\xed\xd1\xf8\x66\xdb\xff\x00\x0b\x62\x0d\xcf\xef\xd6\x72\x27\ +\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x04\x44\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\ +\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd3\x0a\x17\x0a\x12\x16\x5e\xb7\xf3\xf2\x00\x00\x00\x1d\x74\x45\ +\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\ +\x64\x20\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\ +\x64\x25\x6e\x00\x00\x03\xa8\x49\x44\x41\x54\x78\xda\xad\x96\x5f\ +\x68\x1c\x55\x18\xc5\x7f\x77\x76\x36\x9b\x34\xe9\xda\x6e\xda\xb2\ +\x2a\x98\x27\x31\x55\xfa\x66\xdb\x6d\x82\x42\x5e\x35\x45\xf0\x29\ +\x46\x10\x82\xe0\x83\xa2\x82\xb5\x11\x04\x8b\xcf\xea\x8b\x0f\xe2\ +\x9f\x60\x7c\x08\x41\x6a\x71\x5b\xcd\xa3\x88\x6d\xd3\xc4\x9a\x36\ +\x69\x35\x14\x2a\xad\x94\xe2\x96\x4d\x28\x49\x48\xc8\xee\xce\xec\ +\xcc\xbd\x9f\x0f\x33\x3b\xfb\x67\x92\xda\xa2\x1f\x5c\x66\x19\x66\ +\xce\x39\xdf\xf9\xee\x3d\xb3\xf0\x3f\xd4\xd0\xd0\x90\x75\x3f\xcf\ +\xbd\x04\xc8\x03\xac\x32\xb0\x91\x4e\xa7\xa5\xb7\xb7\x57\x46\x46\ +\x46\x6e\x00\xed\x80\xda\x8e\x40\x16\x17\x17\xa5\x5c\x2e\xcb\xbf\ +\x95\xeb\xba\xe2\xba\x8e\xb8\xae\x23\xc5\x62\x51\x0a\x85\x82\xcc\ +\xcf\xcf\x4b\x4f\x4f\x4f\x01\xd8\x03\x6c\xd9\xd1\x7d\x81\xd7\x49\ +\x1c\x59\x5b\x5b\x95\xd3\xa7\xf3\xb2\xbc\xbc\x2c\x22\x22\x53\x53\ +\x53\x92\xcb\xe5\x34\x90\xae\x91\xd8\x8d\x0c\x1d\x1d\x1d\x00\x4c\ +\x4f\x4f\xc7\xd9\x45\x50\x4a\x21\x22\x88\x08\x5a\xfb\x38\x8e\x4b\ +\xa9\x54\x22\x95\x4a\x01\x30\x30\x30\x80\xe3\x38\xd6\xf0\xf0\xf0\ +\xc7\x9e\xe7\xbd\x13\xda\xd8\x88\x11\x2f\x63\x8c\x68\xad\xc5\xf7\ +\xbd\xe8\xea\x79\x9e\xb8\xae\x23\x1b\x1b\x1b\x32\x3e\x3e\xbe\xdd\ +\x8c\x46\x80\xa4\x6a\x21\x88\x3a\xa8\x29\x15\x31\x04\xb7\x25\x9c\ +\x5f\x70\x1f\xc0\xf7\x35\x4b\x4b\x45\xb2\xfb\xf6\xf1\xdb\xa5\x39\ +\x4e\x9c\xf8\x10\xaf\xd8\x4f\xe5\x4a\x86\xf4\x73\x53\x00\x9d\x31\ +\x82\x56\xe0\xe0\x2a\x4d\x16\x21\x82\xb2\x2c\xaa\xae\xcb\xca\xea\ +\x2a\x9e\xeb\xf0\xf8\x13\xfb\xf1\xef\x3e\x83\x37\x97\xe2\xb5\xb1\ +\xa2\x4c\x9c\xb9\xa6\x80\xbd\x76\xab\xd7\xc6\x68\xce\x9f\x9f\x8e\ +\x94\x06\x80\x20\x08\x0a\x85\x84\x0e\x18\x2d\x18\xa3\x31\xc6\xf0\ +\xfc\xe0\x51\xfc\xe5\x7e\xbc\xb9\x76\x8e\x7f\xb7\x46\x08\xfe\x3e\ +\xd0\x1e\xeb\xc0\xf3\xaa\x0d\xc0\x21\x09\x82\x18\x41\x59\x0a\x31\ +\x75\x8b\x44\x84\x9d\xe9\x87\xa8\x16\xfa\xa8\x2e\xec\xe0\xcd\xc9\ +\x4d\xbe\x39\x79\xb1\x86\xf7\x32\x70\x6e\x8b\x0e\x0c\x17\xa6\x2f\ +\x44\x4a\x03\xc0\x78\x07\xbe\xaf\x19\x1c\x3c\x8a\x7b\xeb\x08\xee\ +\xa5\x76\x5e\x9f\x58\x65\x22\xbf\xc0\xdb\x6f\xbc\xca\xa7\x9f\x7d\ +\x0d\xb0\x0e\x38\x71\x02\xad\x39\xd2\x97\x43\x4c\xa8\xb2\xc1\xaa\ +\x68\x9b\x1a\xc3\xae\xdd\xdd\xb8\x37\x73\x94\xaf\xed\xe1\xbd\x53\ +\x77\x98\xc8\x2f\x30\xf6\xe5\xe7\xdc\xbe\x75\xbd\x06\xb5\x06\xb8\ +\x5b\x77\x30\x33\x13\xf8\x1c\xda\x61\x85\xc0\x4a\xa9\xc8\x73\xe7\ +\xfa\x61\x2a\xf3\x29\x46\xcf\xfc\xcd\xd8\xb7\x57\x19\x1d\x3d\x46\ +\xa6\x3b\x43\x69\x3d\x53\x83\xaa\x00\xda\xde\xea\x48\xf7\xf7\xf5\ +\x21\x08\xc6\x98\x26\x02\x80\x5d\xbb\xbb\x29\xff\x71\x88\xd2\xe5\ +\x14\x6f\xe5\xd7\x99\xcc\x5f\x65\xec\xab\x2f\xc8\x64\x32\x3c\x9c\ +\xcd\xb2\xbe\x72\x27\xd2\x1a\x3b\xc9\x00\xbe\xf6\x99\x99\x99\xad\ +\xcd\x3d\x1c\x74\x30\x50\xcf\xf3\x00\xb8\x7d\xf3\x59\x3e\xfa\xf1\ +\x27\x26\xf3\xbf\x73\xfc\xdd\x63\x14\x97\x96\x10\x84\x03\x07\x9e\ +\x42\xb5\x44\x5d\x8c\x40\x6b\x4d\xee\xf0\xa1\x48\x71\x6d\xb7\x78\ +\x5e\x95\x47\x1e\x7d\x8c\x17\x06\xf6\xb2\xff\xc5\x4f\x00\xf8\xfe\ +\xd4\x49\xba\x76\x76\x91\xcd\x66\x49\xa5\xda\x50\x4a\x61\x29\xeb\ +\xde\x04\x46\x6b\x66\x67\x67\x43\x60\xa2\xf3\xe0\xba\x2e\x00\x3f\ +\xfc\x72\x97\x73\x67\x7f\x46\x59\x8a\xae\xce\x4e\x6c\x3b\x49\x5b\ +\x5b\x92\x44\x22\x81\x52\xf1\xa4\x8e\x5b\xe4\x7b\x1c\x3c\xf8\x74\ +\x93\x7a\x31\x06\x5f\xfb\xfc\x75\xe3\x4f\x94\x05\x95\x8a\x43\x32\ +\x69\x07\xf3\xb1\xac\xe8\xcc\x68\xad\x31\x46\x6f\x4f\x50\xad\x56\ +\xd1\x5a\x87\xf6\x04\xfb\x1e\x15\xcc\xc5\x18\x83\x36\x3e\xc6\x37\ +\x24\x93\x36\x89\x44\xa2\x1e\x1b\x4a\x45\xef\x35\x38\x1b\x27\xd8\ +\xdc\xdc\x44\x6b\x1d\x78\xa3\x68\x52\xa8\x94\x42\x29\x85\x6d\xdb\ +\xc1\xef\xb0\xbb\xda\xdc\x1a\xb3\xab\xb1\x9a\x26\x52\x28\x14\x40\ +\x0c\x22\x06\x63\xea\xab\x51\xa9\xa5\x14\xad\x32\x83\x38\x21\xcc\ +\x26\xd9\xbe\x83\x8b\xbf\x9e\x65\x47\x9b\x0a\x22\x41\x24\x8a\x68\ +\x23\x26\x0c\x6a\x1a\x94\xab\xc8\xef\x1a\xa8\x11\xc3\xe5\x85\x2b\ +\xd4\xf7\x78\x73\xbd\xf2\x80\x1f\xfd\x7b\xad\x0f\x80\x27\x5b\xd3\ +\xd4\x06\xba\xc3\x95\xfc\x8f\xff\x64\x3c\x60\x05\x58\xf9\x07\xbb\ +\x78\x04\xf0\x58\x0d\x4c\x09\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ +\x42\x60\x82\ +\x00\x00\x06\x33\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x10\x00\x00\ +\x0b\x10\x01\xad\x23\xbd\x75\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ +\xd3\x09\x09\x14\x30\x03\x75\x06\x85\x3f\x00\x00\x05\xc0\x49\x44\ +\x41\x54\x78\xda\xc5\x97\x4d\x6c\x1b\xd7\x11\xc7\x7f\xbb\x5c\x7e\ +\x73\xad\x95\xe4\xc8\x72\x9c\x2a\x52\x80\x26\x46\x9a\xda\x54\x84\ +\xd4\x69\x9b\x16\x16\x20\x07\x69\x51\x24\x05\x9a\x22\x40\x0e\x59\ +\x03\x86\x7b\xe8\xc5\xe8\xb9\x28\x24\xf4\xd2\xab\xdd\x1e\x7b\xf1\ +\xa2\x97\xa2\x48\x51\xb4\x75\x5a\xc4\x68\x2b\xa1\x89\x03\x3b\x85\ +\x62\x26\x76\x52\x35\x82\x2d\xda\xaa\xf5\x41\x52\x21\x25\x92\xbb\ +\xfc\x58\xbe\xd7\xc3\x92\x14\x29\x92\x26\x9b\x4b\x1e\x30\xc4\xf2\ +\xbd\x99\xf7\xff\xef\xbc\xd9\x99\x79\x8a\x94\x92\x2f\x72\x68\x00\ +\xa6\x69\x0e\x6c\xb0\xfa\x98\x35\x09\x4c\x4a\xc9\xe9\xc6\x9c\x90\ +\x20\x04\x4b\x02\x92\xcf\x6c\x99\xc9\x41\xf7\xb2\x2c\xcb\x23\xd0\ +\x6f\xdc\x99\xb0\x0c\xe0\x2c\x60\x22\x88\xb7\x3a\xad\x0e\x8e\x80\ +\x79\x80\xdb\xe3\x56\x42\x48\x2c\x29\xb8\x7c\x32\x6d\xe6\x06\xf2\ +\x40\x1f\xf0\x05\xe0\x02\x60\xa8\x0a\x44\xc3\x10\xf4\xc3\x89\x47\ +\xf3\x44\xc3\x41\x00\xa4\x28\xf3\xde\x5d\x1d\xbb\x04\xc5\x32\xf1\ +\x72\x95\x38\x30\x7f\xf3\xb0\x75\x69\x3a\x63\x2e\x7c\x2e\x02\x6b\ +\x8f\x5b\x86\x90\x2c\x02\x71\x4d\x85\x58\x18\xbe\x7b\xb2\x4a\x7c\ +\x4a\x65\xfa\x09\x1f\xa0\xb7\x68\x07\xf8\x09\xb0\x9e\x11\x7c\xb8\ +\x26\x78\xe7\xd6\x2e\xd7\xd6\x46\x0d\xe1\x32\xbf\x3c\x6a\xbd\x02\ +\xcc\xce\xec\x74\xf7\x86\xd6\x03\x3c\x5e\x07\x37\xf4\x10\xcc\x3e\ +\x5d\xe1\xfb\xa7\x34\x46\x74\x3f\x00\x99\x3d\xc1\xda\x86\x4d\xc5\ +\x15\x08\xa9\x34\xed\x9e\x7d\x52\x67\xf6\x84\xca\xec\x89\x51\xde\ +\xfe\xc0\xe5\x8f\x37\x4a\x7c\xb2\x15\x8b\x0b\xc1\xda\x0d\xc3\x9a\ +\x3d\x95\x33\x13\x7d\x09\xb4\xbc\xb9\xf1\xc4\x61\x87\x1f\x7c\xdd\ +\x4f\x7c\x2a\x00\xc0\xc6\x8e\xcb\xd6\x8e\x03\xc0\x8b\x33\x7a\x07\ +\xf1\xab\xcb\x79\x00\x9e\x9a\xd0\x79\xe1\x69\x8d\x2f\x3f\x1a\xe1\ +\xcd\xa5\x6d\xfe\x74\xfb\x88\x01\x2c\x5e\x1f\xb2\xa6\x9e\xdf\x6d\ +\xf7\x44\x07\x81\x06\xb8\x11\x85\x73\x73\x41\x8e\x0c\xab\x38\x55\ +\x48\x65\x2b\x14\x8b\x0e\xdf\xf9\xda\x50\xcf\xf3\x6c\x90\xba\xba\ +\x9c\x67\xe2\xa8\xce\xa1\xa8\xca\xeb\x67\xc6\xa8\xc9\x14\x57\x6e\ +\x8f\x19\xc0\x22\x30\xdd\x6a\xa3\x76\x09\xb8\xb8\x1e\x82\xd7\x9e\ +\x77\x89\x86\x54\x0a\x0e\x64\xf3\xa2\x2f\xf8\x41\x22\xf7\x37\xf3\ +\x14\x1c\x70\x6b\x0a\x67\x9e\x3b\xcc\xf1\x71\x1b\x21\x89\xbf\x77\ +\xc8\x5a\xe8\x4a\xa0\xfe\xa9\x5d\x50\x15\x78\x6e\xaa\xc2\xe4\xb8\ +\x86\x53\x05\xa7\x0a\x77\x1e\x14\x3b\xc0\x37\xb3\x70\x6d\x05\xde\ +\x59\x81\xeb\xab\x90\x2f\xb5\x93\xf8\xd6\x57\xf5\xa6\x7d\x34\xac\ +\xf2\xf2\xa9\x00\x7e\x1f\x08\xc9\x85\x77\x75\xcb\xe8\xe6\x81\xb3\ +\x80\x71\x28\x02\x27\xa6\x34\xf2\x0e\x4d\x19\x1f\x6e\x73\x14\x4e\ +\x05\x6e\x26\x61\xb7\xbe\xfe\x59\x01\xfe\x9e\xa8\x50\x2c\xb9\x4d\ +\x9d\x70\x00\xca\x95\xfd\x3d\x8e\x8e\x68\x3c\xfb\xa5\x3c\x80\x21\ +\x24\x67\xbb\x11\x30\x55\x05\xa6\x27\xaa\x80\x8a\x5d\xa2\x29\x41\ +\x7f\x3b\x81\x8f\xd7\x69\x5b\xb7\x4b\x9e\x07\xd6\xb7\x9d\x36\x3d\ +\xbf\xe6\xad\xad\x6d\xd5\xf8\xd7\xaa\x8b\x1e\x0b\xa0\xa9\x20\x04\ +\x66\x5b\x10\xae\x3e\x66\x4d\x22\x88\x87\x43\x30\x14\x53\x29\x96\ +\xdb\xdd\x69\x87\x02\xcd\xe7\xb2\x0b\x9f\x6e\x42\xd5\x6d\xd7\xd9\ +\xdd\x49\x73\xfc\xf4\xb1\xb6\xb9\x7f\x7c\x58\x25\x99\x56\xb0\x5d\ +\xad\x09\x37\x12\x83\x8d\x2c\xf1\xa5\x88\x35\x09\x24\x1b\x2b\x93\ +\x52\x7a\x6e\x0b\xf8\x3a\x09\xdc\x49\xf9\xf8\xcb\x4d\x18\x89\xc1\ +\xea\x46\xe7\x79\xbb\xf6\x36\xaf\x7c\xd3\x68\x9b\xfb\xf7\x7f\x05\ +\x9f\x6c\xfa\x3b\x02\x34\x16\x06\xb2\x20\x25\xfb\x04\x1a\x85\x25\ +\xa4\xd5\x28\xd7\x7c\x94\x6b\x9d\x91\xfd\xf1\x7a\x8f\x54\x5a\xd9\ +\xe6\x47\xdf\x1b\x25\x1a\xda\xff\xa2\xed\xb2\xe4\xd7\x57\xab\x40\ +\xb0\x43\x3f\xe8\x07\x29\x41\x78\x98\x4b\x5a\x6b\x51\x31\x22\x35\ +\x8a\x65\xdf\xc0\x95\x31\x50\xbe\xc7\x8f\x5f\x3d\xd6\x01\xfe\x8b\ +\xdf\x57\x58\xcf\x05\xbb\xda\x84\x03\x1e\x96\xd7\x06\x28\x5e\x0c\ +\x88\x7a\x75\x13\x42\xa1\xe0\x0c\x06\x2e\x4b\x29\x7e\xfe\x46\x77\ +\xf0\x95\xad\xe0\xc3\x6d\x5b\xca\xa9\x47\x40\x78\x7f\xb2\xb6\x86\ +\xcf\xdf\x1f\x5c\x41\xf2\xd2\x71\xd1\x06\x9e\xde\x93\xfc\xea\x4a\ +\x95\x4f\xb7\x83\xa8\x4a\x6f\xdb\x83\xf1\xd5\xd8\x61\x49\xc0\x7c\ +\x55\x28\x94\xab\x0f\x67\xee\xd5\x7e\x85\xa7\x26\x22\x6d\x6b\xbf\ +\x7c\xab\xc6\xdd\x4c\x00\xad\xcf\x09\x96\xab\x80\x14\x00\x4b\xe0\ +\xab\x7b\x00\x92\x8d\x04\xe3\xd6\xc0\xa7\xca\x16\x50\xa5\x79\x44\ +\xa0\x34\x7f\x15\xf6\x75\xee\x67\x24\x6b\x69\x0d\x65\x80\xa3\xcb\ +\x15\x00\xcf\x36\xd9\x4c\x44\xcf\x6c\x99\x49\x21\x49\xec\xd9\xa0\ +\x2a\x1e\x68\x43\xc0\x9b\x3b\x28\x99\xc2\xfe\xab\x2e\xdf\x55\xba\ +\xea\x74\x93\xd4\x1e\x00\x89\xb9\xca\xb9\x64\x5b\x35\x94\x02\xab\ +\x2c\x88\xdb\x25\x17\x23\xd6\xbf\x53\xfb\xdd\xfb\x31\x36\xf2\x50\ +\x2c\x79\x35\x21\x30\x40\x73\xb7\x99\x75\x71\xbd\x04\x66\x75\x2b\ +\xc7\x97\x81\xf9\xf5\x1d\xd5\x38\x32\xdc\x7f\x33\xbb\xf0\x19\x46\ +\xc0\x4f\x48\xba\x8c\x0f\xe9\x64\xed\xfe\x0c\xfe\xb3\xa1\x00\x32\ +\x57\xc7\x6a\xaf\x05\x27\xd3\x66\x4e\x48\x2e\x15\x2b\x2a\xd9\xdd\ +\x02\xe1\x00\x3d\xc5\x27\xf2\xfc\xec\x87\x7e\x5e\x9c\xd1\x79\xf9\ +\x1b\xc3\xfc\xf4\x55\x0d\x23\xca\x43\x6d\xb6\x32\x79\x9c\xb2\x04\ +\xc4\xa5\xb9\xca\xb9\x5c\xd7\x7e\xa0\xde\x40\x26\x3e\x7a\x10\xa3\ +\x54\xcc\xe2\xd7\xe8\x2e\x8a\xcb\xe3\x47\xf5\xb6\xe4\x32\x39\x46\ +\x4f\xfd\xbd\xdc\x0e\xd7\xef\x84\x01\x91\x98\xab\x9c\x5f\xe8\xd9\ +\x90\xd4\xc7\xac\x10\xe4\xfe\xb6\x32\x4c\xa5\x90\x26\xe8\xa7\x43\ +\xc2\x91\x30\x4e\xe5\xc0\x91\x94\xe8\xaa\x6b\xef\xa5\x78\xeb\xd6\ +\x10\x20\x72\xc0\xec\x41\xb0\x0e\x02\x33\x3b\x66\x4e\x48\x66\xa5\ +\x24\x77\xe5\xf6\x23\x64\x52\xa9\x0e\x77\xea\xb1\x10\xbf\xbd\xe6\ +\x55\xc5\x7b\x69\xf8\xc3\xfb\x50\x72\x3b\xdd\xbe\xb9\xb9\xc9\x9b\ +\xcb\x23\x4d\xf0\xb9\xca\xf9\xdc\x40\x5d\xf1\xa9\x9c\x99\xb8\x3e\ +\x64\x4d\x09\xc9\xe2\xdb\x2b\x63\xf1\xc3\xf7\x6d\xce\x7c\xa5\xc0\ +\xe8\xe8\x58\x53\x67\xcf\x86\xbf\x7e\xb0\x6f\xd3\x92\x14\xc9\xa4\ +\x1e\xf0\xe7\x8f\x86\x48\x17\x1e\x01\x44\xa2\x17\xf8\x43\xef\x05\ +\xf5\xee\x75\xfa\x5d\xdd\x5a\x48\x15\x23\x17\x7e\x73\x23\x62\x1c\ +\xd3\xf3\xcc\x4c\xec\x32\x36\x1c\x24\x14\x0c\x11\x8d\x79\x71\x50\ +\x2c\xe6\x71\x1c\x87\xad\x4c\x89\x1b\xf7\x0c\x36\xf6\x8e\x00\xe4\ +\xbc\x80\x3b\xff\xf9\x2e\x26\x8d\xf1\x42\xde\x5c\xf8\x67\xcc\xba\ +\x08\x9c\x5d\xdf\xd5\xcd\xf5\x5b\x7a\xbc\x5e\x4e\x5b\x0a\x4b\x0c\ +\x64\xa4\x91\xe1\x12\xde\x77\x2e\x2e\xf7\x7a\xeb\xff\x8b\x00\xc0\ +\xb7\x0b\x66\x0e\xb8\x08\x5c\x5c\x0c\x7b\x97\x53\xe0\x74\xb3\xaa\ +\x35\x73\x3b\xc9\x46\x86\x1b\x74\x28\x5f\xf4\xf5\xfc\x7f\x92\x93\ +\xb2\xba\x6d\x79\x43\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x76\x50\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x01\x2a\x00\x00\x01\x08\x08\x06\x00\x00\x00\xe8\x5e\xb9\x12\ +\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ +\xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\xd0\xcb\x00\x00\ +\xd0\xcb\x01\x9f\x0e\xc0\x23\x00\x00\x00\x09\x76\x70\x41\x67\x00\ +\x00\x01\x2a\x00\x00\x01\x08\x00\xdc\x89\x70\xd2\x00\x00\x74\x99\ +\x49\x44\x41\x54\x78\xda\xed\xbd\x67\x98\x5d\xd7\x79\x1e\xfa\xae\ +\x73\xce\xcc\x99\x72\xa6\x62\x66\x30\x00\x06\x04\x2b\xc0\xde\x04\ +\x52\x50\xa5\x2c\x51\x85\x12\x65\x39\xb2\x64\xcb\x45\x91\xcb\x75\ +\x42\xdf\x9b\x9b\xe7\x96\x27\xbe\x6e\x71\xb9\x56\x6c\xc5\x92\x15\ +\xeb\xda\x4a\x64\x3b\x91\xe4\xc4\x91\x13\x3b\x11\x25\xf6\x02\x12\ +\x20\x08\x90\x60\x01\x09\x90\x00\x89\x4e\xf4\x36\xfd\xcc\xcc\xe9\ +\x7b\xaf\xfb\x63\xb7\x55\xf7\x5e\xfb\x94\x29\xc4\xfe\xf0\x0c\xce\ +\xde\xab\xaf\x5d\xde\xfd\x7e\xdf\x5a\xdf\x5a\x04\x89\x5c\xf6\x32\ +\xba\xe5\x01\xef\xf0\x23\x00\xfe\x0f\x00\xb7\x00\x28\x02\xf8\x01\ +\x80\xff\x02\xe0\x34\x00\x5c\xd8\xfd\x9d\xa5\x6e\x6a\x22\x97\xa9\ +\xa4\x97\xba\x01\x89\x2c\xad\x30\x20\xb5\x05\xc0\xb7\x01\xdc\x03\ +\x60\x00\xc0\x08\x80\x0f\x03\xb8\x19\xc0\x7e\x00\x17\x73\x63\x9b\ +\x31\x7f\xe6\xd5\xa5\x6e\x72\x22\x97\xa1\xa4\x96\xba\x01\x89\x2c\ +\x0b\x69\x03\xf0\xcf\x01\xdc\xaa\x08\xff\x14\x80\xef\x03\xf8\x38\ +\x00\xc2\x00\x5b\x22\x89\x2c\x9a\x24\x40\x95\x08\x00\xf4\x01\xb8\ +\x3d\x24\xfe\x76\x00\x7f\x03\xe0\x17\x01\xb4\x25\x60\x95\xc8\x62\ +\x4b\x02\x54\x89\x00\x40\xb7\xfb\x17\x26\x1b\x00\x7c\x0b\xc0\xff\ +\x05\xa0\x27\x01\xab\x44\x16\x53\x12\xa0\x4a\x24\x8e\x0c\x00\xf8\ +\x7d\x00\xff\x06\xc0\x48\x02\x56\x89\x2c\x96\x24\x40\x95\x48\x5c\ +\xe9\x04\xf0\xeb\x00\xfe\x03\x80\xeb\x46\xb7\x3c\x80\x04\xb0\x12\ +\x69\xb5\x24\x40\x95\x48\x3d\x92\x01\xf0\x79\x00\xdf\x83\x33\x5a\ +\x98\x80\x55\x22\x2d\x95\x04\xa8\x12\x69\x44\x3e\x00\x07\xac\x3e\ +\x07\x20\x95\x80\x55\x22\xad\x92\x04\xa8\x12\x69\x54\xae\x07\xf0\ +\x1d\x00\xff\x0c\x40\x47\x02\x56\x89\xb4\x42\x12\xa0\x4a\xa4\x19\ +\x32\x0a\xe0\x4f\x01\xfc\x0e\x80\xfe\x04\xac\x12\x69\xb6\x24\x40\ +\x95\x48\xa4\xa4\x52\x69\xd0\xe8\x64\x3d\x00\x7e\x03\xc0\x37\x01\ +\x8c\x25\x46\xf6\x44\x9a\x29\x09\x50\x25\x12\x2a\x94\x52\xac\x1d\ +\x1b\xc3\x5d\x77\xde\x8c\x74\x3a\x0d\x4a\x43\x21\xab\x1d\xc0\x57\ +\xe0\x4c\x0e\xbd\x05\x48\x8c\xec\x89\x34\x47\x12\xa0\x4a\x24\x54\ +\x28\x05\x7a\x7b\xba\xf1\x4b\x5f\xfc\x38\x3e\xff\xe9\x0f\xa2\xb3\ +\xb3\x23\x0a\xac\x52\x08\xdc\x6e\x3e\x8a\xc4\xed\x26\x91\x26\x48\ +\x02\x54\x89\x44\x0a\xa5\x14\xb9\xee\x2c\xbe\xf4\x93\x1f\xc2\x57\ +\xbe\xf8\x71\xf4\xf7\xf5\xc0\xb6\x23\x95\xc1\x3b\x01\xfc\x47\x00\ +\x5f\x02\x90\x49\xc0\x2a\x91\x46\x24\x01\xaa\x44\x8c\x84\x52\x8a\ +\xf6\x4c\x06\xf7\x7d\xe4\x4e\xfc\xfa\x57\x3e\x8b\x75\x6b\x86\x4d\ +\xc0\xea\x2a\x00\x7f\x01\x67\xe9\x98\xee\x04\xac\x12\xa9\x57\x12\ +\xa0\x4a\xc4\x58\x28\x00\x42\x08\xde\x77\xe7\x26\xfc\xcb\x5f\xfd\ +\x1c\x6e\xd8\xb8\x21\x4a\x0d\x04\x80\x55\x00\xfe\x10\xc0\x57\x01\ +\x0c\x25\x60\x95\x48\x3d\x92\x00\x55\x22\xb1\x85\x52\x8a\x9b\xae\ +\x1b\xc3\xbf\xfc\x95\xcf\x61\xcb\x7b\x6e\x02\x40\xa2\x00\xab\x0b\ +\xc0\xbf\x80\xb3\xde\xd5\x35\xc9\x88\x60\x22\x71\x25\x01\xaa\x44\ +\xc2\x85\xb8\xbf\x94\xfd\xa1\xb0\x6d\x8a\xf5\xa3\x83\x78\xe0\xcb\ +\x9f\xc6\x27\x7f\xe2\x2e\xb4\xb5\xb5\x45\x81\x55\x06\xc0\xcf\x00\ +\xf8\x2e\x80\xbb\x80\x64\x44\x30\x11\x73\x49\x80\x2a\x11\x23\xa1\ +\x00\xa8\xfb\xbf\x07\x5a\x36\xa5\x18\xec\xeb\xc6\x2f\x7d\xf1\x63\ +\xf8\xe2\x67\xef\x41\x77\x77\x27\xec\x68\x55\xf0\xc3\x70\x46\x04\ +\x3f\x83\xc4\xed\x26\x11\x43\x49\x80\x2a\x11\x73\xa1\x01\x48\x79\ +\x62\x53\x8a\xce\x8e\x76\x7c\xfe\xbe\xf7\xe1\x57\xbe\x74\x1f\x86\ +\x06\xfb\x4d\x8c\xec\x37\x02\xf8\x6b\x00\xbf\x02\x20\x9b\x80\x55\ +\x22\x51\x92\x00\x55\x22\x91\x42\x23\xc2\x29\xa5\x68\x4b\xa7\xf0\ +\xb1\xf7\xdf\x82\xff\xf5\x2b\x9f\xc5\x86\xf5\xa3\x26\xcc\x6a\x2d\ +\x80\x3f\x03\xf0\x9b\x00\xfa\x12\xb0\x4a\x24\x4c\x92\xcd\x1d\x2e\ +\x73\xc9\x8d\x6d\x06\x80\x7e\x00\xff\x14\xce\x08\x1d\x27\x14\xc0\ +\xf0\xc8\x30\x3e\xf0\x9e\x4d\xe8\xca\x66\xfc\x30\xa8\x12\x02\x58\ +\xb7\x7a\x10\xd7\x5e\xb5\x0e\x17\x2e\xcd\xe0\xe2\xf8\x34\x08\x41\ +\x98\x64\x01\xbc\x0f\xc0\x6a\x00\x7b\x72\x63\x9b\xe7\x92\x0d\x24\ +\x12\x51\x49\xc2\xa8\x12\x31\x12\xc7\x3a\x45\x64\x90\x72\xcd\x56\ +\xde\xa1\x4d\x29\x36\x5e\xb9\x06\xff\xdb\x2f\x7d\x16\x1f\xda\x72\ +\x2b\x48\x2a\x15\x65\x64\xcf\x02\xf8\x55\x38\xaa\xe0\x8d\x40\x62\ +\x64\x4f\x44\x96\x04\xa8\x12\x31\x10\xaa\xa6\x51\x54\x79\x08\x9b\ +\xda\x18\x1d\xee\xc3\xaf\xfd\xfc\x27\x71\xff\xbd\x5b\x90\xcd\xb6\ +\x9b\xb8\xdd\x7c\x06\x8e\x91\xfd\xc3\x40\x02\x56\x89\xf0\x92\x00\ +\x55\x22\x86\x22\xa0\x12\x95\x0e\xb9\x74\x94\x52\xf4\xe6\x3a\xf1\ +\xf3\x3f\x75\x0f\x7e\xee\x9f\x7c\x0c\xbd\x3d\x39\x13\x23\xfb\x5d\ +\x70\xa6\x2f\xfc\x0c\x12\xb7\x9b\x44\x18\x49\x80\x2a\x11\x73\x89\ +\x04\x28\x3e\xc4\xb6\x29\xb2\xed\x19\xdc\xff\xd1\xcd\xf8\x5f\x7e\ +\xe1\xd3\x18\x5d\xbd\xca\x04\xac\xae\x81\x33\x31\xf4\x5f\x00\xe8\ +\x4a\xc0\x2a\x11\x20\x31\xa6\x5f\xf6\x12\xcf\x98\xde\xa6\xd0\x00\ +\x15\x21\x42\x10\x21\x04\x57\xac\x1d\xc6\x95\x63\xa3\x38\x7d\x7e\ +\x02\x53\xd3\x79\x90\x70\x2b\x7b\x17\x1c\x15\x30\x07\xc7\xc8\x5e\ +\x4c\x8c\xec\x97\xb7\x24\x8c\x2a\x91\x68\xa1\xe1\x0c\xaa\x5a\xb3\ +\x61\x59\x9e\xca\x27\xe7\x75\xfe\x28\x6e\xd9\x74\x05\xfe\xc5\x2f\ +\xfd\x24\xee\xbc\x75\x93\x49\xad\x5d\x70\x9c\x99\xff\x12\xc0\x95\ +\x40\x62\xb7\xba\x9c\x25\x01\xaa\x44\x62\x08\x85\x08\x59\x04\xc0\ +\xec\x42\x05\x27\x2f\xe6\x51\xae\x58\x20\x62\x72\xe6\xd0\xa6\x14\ +\x1b\xd6\x0d\xe3\x81\x2f\x7f\x06\x1f\xfd\xe0\x9d\x26\x0b\xf1\x65\ +\xe0\x2c\x13\xf3\x5d\x38\xcb\xc6\x24\x60\x75\x99\x4a\x02\x54\x89\ +\x44\x0a\xe5\xff\x93\xe2\x28\xa5\x98\x98\x2d\xe1\xf8\xf9\x59\x2c\ +\x94\xaa\x4c\x26\xe9\x10\x36\xa5\x58\x35\x90\xc3\x57\xbe\x78\x2f\ +\x7e\xea\xbe\x0f\xa2\x2b\x7a\x21\x3e\x02\xe0\x27\xe0\x8c\x08\x7e\ +\x0a\xc9\x42\x7c\x97\xa5\x24\x40\x95\x48\x6c\xa1\x34\xf8\x63\x42\ +\x31\x3b\x5f\xc6\xb1\xb3\x33\x98\x9d\x2f\xbb\x21\xcc\xec\x75\xff\ +\x98\x82\x52\x8a\xee\xce\x2c\x7e\xfa\xbe\xf7\xe3\x17\xbf\xf0\x09\ +\x0c\xf4\xf7\x9a\xcc\x64\xbf\x05\xce\x12\xc7\xbf\x04\xa0\x3d\x01\ +\xab\xcb\x4b\x12\x63\xfa\x65\x2e\x46\xc6\xf4\xe1\x61\xbc\xff\x3d\ +\x9b\xd0\x99\xcd\xc8\x86\x72\x00\x85\x52\x0d\xd3\x73\x0e\x38\x55\ +\x2c\x1b\xf9\x42\x05\xe9\x34\x41\x57\xb6\x0d\x84\x04\x00\xc5\x15\ +\x0a\x20\x9d\x4a\xe1\xaa\x2b\x46\xb1\x76\x74\x18\x27\xcf\x5c\x44\ +\x7e\x6e\x21\xca\xc8\xde\x0b\xe0\x23\x6e\xb5\xaf\xe7\xc6\x36\x57\ +\x12\x23\xfb\xe5\x21\x09\xa3\x4a\xc4\x4c\x28\x00\x10\x45\x18\xcf\ +\x9a\x00\xa0\x5c\xb1\x70\xf2\x42\x1e\xe7\x26\xe7\x61\xd9\x36\x74\ +\x7a\xa0\xb3\x10\x1f\x70\xd7\x6d\xd7\xe2\xd7\xbf\xf2\x93\xb8\x61\ +\xe3\x55\x88\x26\x56\xe8\x03\xf0\xbb\x70\xb6\xe7\x1a\x05\x12\xbb\ +\xd5\xe5\x20\x09\x50\x25\x62\x2e\x14\x92\x3d\x9d\x03\x29\x26\xbc\ +\x66\x51\x9c\x19\x9f\xc3\xa9\x8b\x79\x54\x6b\xb6\x03\x71\x9a\x39\ +\x58\x94\x52\x5c\x7f\xf5\x5a\xfc\xfa\x3f\xbd\x1f\x5b\x36\xdf\x84\ +\x54\x8a\x44\x01\x56\x16\xc0\xaf\xc1\xd9\xf8\x74\x13\x90\x80\xd5\ +\xbb\x5d\x12\xa0\x4a\xc4\x48\x68\xd8\xf4\x4e\x66\x99\x2a\xca\x20\ +\x19\xa5\x14\x17\xa7\x0b\x38\x7e\x6e\x16\x85\x72\xcd\x4f\xaa\x12\ +\xdb\xa6\x58\x3b\x32\x80\x5f\xfd\xb9\x4f\xe1\x13\x1f\x79\x2f\xda\ +\xdb\x23\x17\xe2\x4b\xc3\xd9\x4a\xfe\xfb\x70\xb6\x96\x4f\xc0\xea\ +\x5d\x2c\x09\x50\x25\x62\x2c\xf2\xe4\x84\x00\x9c\xa8\x10\xc3\x1a\ +\xdc\xa7\xe6\x4a\x38\x76\x76\x06\xf9\x42\x45\x5b\xb0\x37\x7d\xa1\ +\xbf\xa7\x0b\x3f\xf7\xb9\x7b\xf0\x85\xcf\xde\x83\x9e\x5c\xb7\xc9\ +\x9a\xec\x5b\x00\x7c\x0f\xc0\xe7\x01\xa4\x13\xb0\x7a\x77\x4a\x02\ +\x54\x89\xc4\x12\x5e\xfb\x53\xcf\x4a\xa7\x0a\x93\x54\xbe\x50\xc5\ +\xb1\xb3\x33\x98\xca\x17\xa5\xc2\x78\x35\xd0\x46\x67\x47\x1b\x3e\ +\xfb\xb1\xbb\xf0\x95\x9f\xfd\x24\x86\x87\x06\x4d\xc0\xea\x3a\x00\ +\xff\x01\xc0\xaf\x03\xe8\x48\xc0\xea\xdd\x27\xc9\xa8\xdf\x65\x2e\ +\x26\xa3\x7e\x43\xc3\xc3\x78\xdf\x1d\x9b\xd0\xd9\x91\x81\xa8\xbc\ +\x11\x00\x0b\xee\xa8\x9f\x0a\xa0\xbc\x03\x02\x8a\xaa\x65\x23\xbf\ +\x50\x01\x21\x04\xdd\x1d\x6d\x20\x84\x5d\x36\x86\x2f\x37\x95\x72\ +\xdc\x6e\xc6\xd6\x8e\xe0\xcc\xf9\x49\x4c\xcf\x44\xba\xdd\x74\x03\ +\xb8\x07\x40\x27\x80\xd7\x72\x63\x9b\x4b\xc9\x88\xe0\xbb\x47\x12\ +\x46\x95\x48\xb4\x88\x96\x72\xf1\x54\x30\x92\xf3\xc9\x79\xee\x55\ +\xa9\xd9\x38\x75\x31\x8f\x53\x97\xe6\x50\xb5\x6c\xbe\x00\xef\x8c\ +\x61\x65\xb7\xdd\x70\x25\x1e\xf8\xf2\xfd\xb8\xed\xe6\xeb\x4c\x5a\ +\xda\x0d\xe0\xff\x06\xf0\x2d\x00\x57\x00\x89\xdd\xea\xdd\x22\x09\ +\x50\x25\x62\x2e\x94\x28\xf1\xca\xff\x65\xfc\xfa\x44\xd3\x3a\x9b\ +\xcf\xb2\x29\xce\x4f\xcc\xe3\x9d\xf3\x33\x28\x57\x6a\xdc\xa4\x07\ +\x51\xcb\xa3\x94\xe2\xaa\xf5\x23\xf8\xb5\x9f\xff\x34\x3e\xfc\xbe\ +\xdb\x4d\xdc\x6e\xda\x00\xfc\x22\x80\xff\x04\xe0\x36\x20\x01\xab\ +\x77\x83\x24\x40\x95\x88\x91\x88\x33\xcc\x25\x42\xa5\x00\x27\x2f\ +\xc8\xdb\x13\x22\x50\x07\x9d\x11\xc1\xf1\x99\x22\x8e\x9e\x9d\xc1\ +\x5c\xb1\x0a\xbf\x08\x55\xdd\x94\x62\x64\x55\x2f\xbe\xfc\x85\x8f\ +\xe1\xfe\x8f\xbf\x1f\x9d\x66\x6e\x37\xf7\x02\xf8\x5b\xf7\x37\x71\ +\xbb\x59\xe1\x92\x00\x55\x22\xc6\x42\x43\x63\x64\xf6\x24\xad\xb8\ +\xe0\xea\x74\x6c\xf8\xcc\x7c\x19\x47\xce\x4c\x63\x6a\xae\x14\x5a\ +\xba\x4d\x29\x7a\xba\x3b\xf1\xf9\xfb\x3e\x80\x2f\xfd\xd4\xc7\xd0\ +\xdf\xdf\x6b\x62\x64\xbf\x0d\x0e\xb3\xfa\x45\x00\x6d\x09\x58\xad\ +\x5c\x49\x80\x2a\x11\x33\x89\xd8\x8a\x46\xcb\x9e\xbc\x48\x4a\xa5\ +\x70\x0f\x67\x16\x8a\x35\x1c\x3b\x3b\x8b\x8b\xd3\x05\x0e\x7c\xc4\ +\xb9\x5a\xd4\xa6\xc8\xb6\xa7\xf1\xf1\x0f\xdd\x86\x5f\xfe\xd2\x7d\ +\x58\xbb\x66\xd8\x04\xac\xae\x80\x63\xb3\xfa\xbf\x01\xe4\x12\xb0\ +\x5a\x99\x92\x00\x55\x22\xf5\x09\x3b\x3b\x9d\x2a\x36\x7e\x60\x26\ +\x52\xa9\x00\x8a\xc5\x17\x42\x80\x72\xb5\x86\x77\xce\xcf\xe2\xcc\ +\xf8\x3c\x2c\x71\x15\x50\x06\xad\x28\xa5\x48\x11\x82\xbb\x6f\xbb\ +\x0e\xbf\xf6\x8b\xf7\x63\xd3\x75\x1b\x4c\x5a\x3b\x00\xe0\xf7\x01\ +\xfc\x09\x80\x91\x04\xac\x56\x9e\x24\xd3\x13\x2e\x73\x31\x9d\x9e\ +\xb0\xe5\xce\x8d\xe8\xca\xb6\xc9\xfb\x3c\x10\x60\xa1\x54\xc5\xf4\ +\x5c\x89\x43\x1f\xe5\x5e\x10\x3a\x1b\x94\x5b\xa8\x4d\x29\xe6\x0a\ +\x15\x54\x6b\x36\xba\x3b\xdb\x90\x49\xa7\xa4\xe5\x65\xd8\x22\x86\ +\x07\x7b\x71\xdd\xd5\xeb\x31\x93\x2f\xe0\xc2\xa5\x49\xd8\x36\x0d\ +\xdb\x9e\x2b\x03\xe0\x3d\x00\xae\x85\xe3\xd0\x3c\x95\x4c\x5f\x58\ +\x39\x92\x30\xaa\x44\xcc\x84\x7a\x33\xd0\xb5\x91\xea\x99\xeb\xca\ +\x25\x61\xbc\x5c\xd4\x07\x29\x2f\xda\xa6\x14\x17\xa6\x16\x70\xf4\ +\xec\x8c\xbb\xb6\x95\x1e\xfc\xa8\x4d\x31\xb6\x7a\x10\xbf\xf4\x33\ +\x1f\xc7\xc7\x3e\xb4\x19\xd9\xac\x91\xdb\xcd\xe7\xe1\xcc\x64\xdf\ +\x02\x24\x23\x82\x2b\x45\x12\xa0\x4a\x24\x52\xd4\x5e\x7e\xe2\x28\ +\x9f\xda\x7d\x46\x2e\xcb\xfd\xe7\x1a\xb3\xa4\x5d\xe2\x3d\xb7\x9b\ +\x7c\x11\x87\x4f\x4f\x63\x76\xa1\xac\x58\x06\x19\x3e\xd3\xa2\xd4\ +\xc6\x40\x5f\x37\x7e\xf6\x27\x3f\x8c\xcf\xdd\xf7\x21\xe4\x72\x5d\ +\x26\x76\xab\x0f\xc0\x01\xab\xcf\x01\x48\x25\x60\xb5\xfc\x25\x01\ +\xaa\x44\x0c\x44\xc5\x95\xf8\xa8\x30\x70\x72\x92\x05\xec\x49\x3d\ +\x22\x08\x9f\xb5\x79\x31\x73\x85\x0a\x0e\x9f\x9e\xc1\xc4\x4c\x51\ +\x72\x80\x66\x57\xb9\xa2\x94\xa2\xab\xb3\x1d\x9f\xf9\xe8\x5d\xf8\ +\x85\x9f\xfe\x04\x86\x87\x06\x4c\xc0\xea\x7a\x38\xab\x2f\xfc\x73\ +\x00\xd9\x04\xac\x96\xb7\x24\x40\x95\x48\xb4\x78\xac\x87\x3a\x06\ +\x20\x16\x94\x02\x58\x21\x8a\x6c\x34\x16\x40\x89\xac\x0c\x00\x8a\ +\x95\x1a\x8e\x9e\x9d\xc1\xb9\xf1\x79\x66\xab\x2d\x95\x81\x9e\xa2\ +\x3d\x93\xc2\x87\xef\xbe\x11\xbf\xfc\xa5\x4f\xe3\xca\x2b\xd6\x9a\ +\x80\xd5\x28\x9c\x75\xad\xfe\x35\x80\xfe\x04\xac\x96\xaf\x24\x40\ +\x95\x48\xa8\xf8\xf0\xe3\x81\x8c\xf6\xdd\x0f\x54\x40\x09\x9c\x62\ +\x02\x14\x37\x22\x08\x67\x97\x9b\x13\x17\xf2\x38\x71\x61\x16\xd5\ +\x9a\x05\x7d\x0b\x9c\x11\xc4\xdb\x6f\xbc\x12\xbf\xfa\xf3\x9f\xc6\ +\xad\x37\x5d\x87\x50\xef\x40\x47\x72\x00\xfe\x15\x80\x7f\x07\x60\ +\x2c\x01\xab\xe5\x29\xc9\xa8\xdf\x65\x2e\x51\xa3\x7e\x00\xb0\x6a\ +\x68\x08\xef\xbb\x63\x23\xba\x3a\xda\xa4\x38\xe2\x8e\xfa\x4d\xcd\ +\x15\x75\x0b\x79\x2a\x03\xa5\xf5\xad\x54\x5a\x25\xa3\xef\x79\x23\ +\x82\xa5\xaa\x85\x5c\x67\x3b\xda\xd2\xa9\x90\xf4\xc0\x60\x7f\x0e\ +\xd7\x5e\x3d\x86\x85\x62\x05\xe7\x2e\x4e\xc0\xb2\xec\x30\xa7\xe6\ +\x34\x80\x5b\x01\xdc\x0c\x60\x5f\x6e\x6c\xf3\xa5\x64\x44\x70\x79\ +\x49\xc2\xa8\x12\x69\x5c\x04\xb5\x4e\xc5\x9c\x58\xf6\x14\xc6\xa0\ +\xd8\x70\xd1\xa1\x99\x02\xb8\x34\x5d\xc4\xa1\x53\xd3\xc8\x17\xaa\ +\x8a\xf4\xec\x39\xc5\xe8\x50\x1f\x7e\xfe\xf3\x1f\xc5\xa7\x3e\xba\ +\xc5\x64\xb7\x9b\x14\x80\x4f\xc2\x59\x88\xef\xa3\x48\xdc\x6e\x96\ +\x95\x24\x40\x95\x88\x91\xc8\x8b\xe5\xa9\xfd\xfe\xc4\x04\x61\xe0\ +\x24\x83\x8b\xf7\x27\xb8\xe4\x30\xf1\x00\x30\xb3\x50\xc2\xa1\xd3\ +\x53\x98\xcc\x97\xc2\x0d\xf8\x94\xa2\x37\xd7\x81\x9f\xfa\xe4\xfb\ +\xf0\xd3\x9f\xfd\x09\x53\xb7\x9b\x3b\xe1\xb8\xdd\xfc\x1c\x80\x4c\ +\x02\x56\xcb\x43\x12\xa0\x4a\xc4\x48\xb4\xe3\x7e\x0c\xdd\xf1\x40\ +\x26\x0e\x38\xb1\x71\x92\xcf\xa0\x14\xef\x08\x01\xb0\x50\xac\xe2\ +\xf0\xe9\x69\x9c\x9f\x5c\x50\x82\x8f\xdf\x02\x9b\xa2\x23\x9b\xc1\ +\xbd\x1f\xb8\x0d\x5f\xfe\xc2\x27\x4c\xdd\x6e\xae\x04\xf0\x17\x70\ +\x76\x6a\xee\x4e\xc0\x6a\xe9\x25\x01\xaa\x44\xcc\x85\x52\x35\x8d\ +\xa2\x1e\x24\xc9\x76\xa7\x70\xc6\x13\x0f\xa0\xfc\x74\x6e\x58\xb9\ +\x6a\xe1\xd8\xb9\x19\x9c\xbc\x38\x87\x9a\xbf\xb6\x55\x30\xd3\x9d\ +\x75\xf1\x49\xa7\x09\xee\xbe\xfd\x3a\xfc\xf2\x97\xee\xc3\xa6\x6b\ +\x8d\xdc\x6e\x06\x01\xfc\x21\x80\xaf\x02\x18\x4e\xc0\x6a\x69\x25\ +\x31\xa6\x5f\xe6\x62\x62\x4c\x1f\x1c\x1a\xc2\x96\xdb\x37\xa2\x4b\ +\xb5\xc2\x27\x01\xe6\x8b\x55\x4c\xb9\x6a\x58\x94\xb0\x06\x72\x40\ +\xc1\xd0\xa0\x02\x36\x2a\x85\xfb\x18\x69\x03\xf9\x85\x32\x2a\x55\ +\x1b\x3d\x5d\x6d\xc8\xa4\x89\xba\x50\x57\x86\x57\xf5\xe1\xaa\x2b\ +\xd7\x21\x3f\x57\xc0\x85\x4b\x53\xb0\xed\x50\x23\x7b\x1b\x80\xcd\ +\x00\xae\x86\xb3\x6a\xe8\x74\x62\x64\x5f\x1a\x49\x18\x55\x22\x86\ +\xc2\xf3\x1d\x89\x54\x85\xe5\x14\x6c\x4f\x61\xec\x49\xc7\xa0\xbc\ +\x70\x6e\xbe\xa7\x1b\x66\x53\x8a\xf3\x53\xf3\x38\x74\x6a\x1a\xf3\ +\xc5\xaa\x5c\x3f\xdb\x4e\x4a\x71\xc5\x9a\x55\xf8\x85\x9f\xbe\x17\ +\x3f\xf1\xc1\xf7\x20\x9b\x6d\x8f\x52\x05\x33\x00\xbe\x08\x67\x26\ +\xfb\xdd\x40\xe2\x76\xb3\x14\x92\x00\x55\x22\x46\xe2\xbc\xec\x44\ +\x37\x3f\xdd\x49\xc3\xae\xa6\x10\x02\x4e\x66\xea\x5d\x34\x40\x01\ +\xbc\x9a\x37\x99\x2f\xe1\xed\x93\xd3\x98\x76\xb7\x94\x07\x34\x8c\ +\xcd\xa6\x18\xea\xcf\xe1\x0b\x9f\xf9\x10\x3e\xfb\xc9\x0f\x9a\xee\ +\x76\xf3\x21\x38\x60\x75\x3f\x12\xb7\x9b\x45\x97\x04\xa8\x12\x69\ +\x4c\xc4\x91\x3a\x0e\x98\xc2\xc1\x29\x8a\x3d\x01\xe1\x00\xc5\x3a\ +\x34\x7b\x51\x73\x85\x0a\x0e\x9d\x9a\xc2\xc5\xe9\x02\xc4\xd5\x62\ +\x78\xbb\x15\x45\x77\x57\x3b\x3e\xf5\x91\xf7\xe0\x67\xff\xc9\xc7\ +\x4c\xdd\x6e\x6e\x04\xf0\x57\x00\x7e\x15\x89\xdb\xcd\xa2\x4a\x02\ +\x54\x89\x98\x89\x37\x2d\x9d\x33\xa6\xf3\x8a\x9f\x76\xba\x02\xa2\ +\xc0\xa9\x4e\x80\xa2\x72\x3d\x84\x00\xc5\x72\x0d\x87\x4f\x4f\xe3\ +\xf4\xa5\xb9\x60\x6d\x2b\x45\xd9\x94\x52\x64\xdb\xd2\xf8\xc0\xe6\ +\x1b\xf0\xe5\x2f\x7e\xca\xd4\xed\x66\x2d\x80\x6f\x00\xf8\x2d\x00\ +\x7d\x09\x58\x2d\x8e\x24\x40\x95\x08\x10\x6e\x62\xe2\x9c\x80\xc5\ +\x99\x51\xf2\xd6\xa3\x6e\x2a\x5a\x3f\x38\x51\x05\xda\x45\x01\x94\ +\x53\x27\xf5\x81\xa6\x6a\xd9\x78\xe7\xfc\x2c\x8e\x9f\x9d\x41\xa5\ +\x6a\xfb\xae\x34\x3c\xa4\x3a\xff\xa7\x53\x04\xb7\xdd\xb0\x01\x5f\ +\xf9\xd9\x4f\xe1\x96\x1b\xaf\x75\xb6\xf1\x0a\xbf\x22\xbd\x00\x7e\ +\x13\x0e\x60\xad\x4d\xc0\xaa\xf5\x92\x59\xea\x06\x78\xe2\xde\xec\ +\x34\x9c\xd5\x18\xc7\x00\x64\x15\xc9\x0c\xc6\x95\xa4\xf4\xa4\x09\ +\x65\x34\x2a\xf5\x94\xd1\x68\xbd\xa6\xf9\x29\x1c\x96\x90\xd5\xa6\ +\xf0\x37\x9f\xa1\xda\x42\xf5\xd3\x10\xf8\xb9\x54\xa1\x29\xc4\x09\ +\xa0\xe0\xd9\x90\xbe\x6e\x2a\x97\x47\x1d\x23\xfb\x99\xf1\x79\x94\ +\xab\x36\xae\x5e\xdb\x87\xae\x6c\x46\x55\x89\x2f\x57\x5f\xb1\x1a\ +\x5f\xfe\xc2\x27\xf0\xd0\x53\xbb\xf0\xd2\x9e\x03\xa8\x56\x6b\x61\ +\x23\x82\x59\x00\xbf\x02\x60\x0d\x80\xff\x67\x74\xcb\x03\x07\x00\ +\xe0\xc2\xee\xef\x18\x5e\xf6\x44\xe2\xc8\xb2\x00\x2a\x17\xa4\x06\ +\x01\xfc\xef\x00\x3e\x03\x60\x03\x5a\xcb\xf6\x9a\x01\x3e\xad\x96\ +\xc5\x6c\x63\x1a\xce\x14\x85\x88\x96\x10\x75\xb3\x54\x3a\x9a\x17\ +\x15\x13\x9c\x9c\xa0\x06\x00\x4a\xc8\x40\x01\x5c\x9a\x29\xa0\x5c\ +\xad\xe1\x9a\x75\xfd\xe8\xeb\x6e\xe7\x22\x79\xb2\x47\x31\x3a\xdc\ +\x87\x9f\xf9\xec\x47\xd0\xd7\x9b\xc3\xb6\x9d\x7b\x50\x28\x94\xc2\ +\xc0\x2a\x05\xe7\x79\x1d\x81\xe3\xd8\xbc\x63\x74\xcb\x03\x34\x01\ +\xab\xe6\xcb\x92\x03\x95\x0b\x52\x59\x38\x8b\xef\xff\x2b\x38\x73\ +\x57\x12\x59\x69\x12\x32\xb1\xd3\x8d\xd6\x9c\x78\x41\xf2\x24\xa9\ +\x46\x00\x8a\x0f\xa7\x98\x99\x2b\xe3\xed\x93\x93\xb8\x66\x6d\x3f\ +\x86\xfb\x3a\xb5\xe5\x53\x4a\xd1\xdf\xdb\x85\xfb\x3f\xbe\x05\xfd\ +\x7d\x3d\x78\xec\xe9\x17\x4c\x76\x69\xbe\x0b\x8e\xdb\xcd\xef\x00\ +\xf8\x9f\xa3\x5b\x1e\xa8\x25\x60\xd5\x5c\x59\xf2\x09\x9f\xee\x84\ +\xc3\x3b\x01\x7c\x13\x40\xcf\x52\xb7\x27\x11\x59\x06\x87\x86\xb0\ +\xe5\x8e\xeb\x9c\x35\xd3\x21\x03\xd2\x7c\xb1\x8a\xc9\x7c\xb0\xdd\ +\x55\x84\x06\xc8\x04\x99\x83\x93\x53\x6f\x7c\x80\xf2\xcf\x09\x50\ +\xa9\xda\x98\x99\x2f\x23\x95\x22\xe8\xee\x6a\xd3\x82\x0f\x05\xd0\ +\x9e\x49\x63\xfd\xba\x11\x0c\xad\x1a\xc0\xb9\x0b\x93\xc8\xcf\x2d\ +\x44\x81\xd5\x20\x80\x8f\x00\xa8\x00\x78\x23\x37\xb6\xb9\x9a\x4c\ +\x0c\x6d\x9e\x2c\x17\xa0\xfa\x30\x9c\xbd\xd7\x0c\x96\x0f\x4a\x64\ +\xb1\x65\xd5\xf0\x30\xee\xbe\xed\x3a\x74\x75\xb4\x49\x20\x45\x08\ +\x30\x5f\x70\x80\x2a\x4c\x9d\x0b\xa2\x14\xd3\xcb\xd1\x42\x80\x62\ +\x22\x09\x80\x9a\x4d\x31\x33\x5f\x86\x4d\x29\x7a\xbb\xda\x91\x4e\ +\x11\xb9\x0c\x37\x63\x3a\x05\xac\x59\x3d\x88\x75\x6b\x47\x30\x31\ +\x39\x8b\xc9\xe9\xd9\xa8\x4b\xd5\x05\xe0\x83\x70\x3e\xb8\xaf\xe5\ +\xc6\x36\x17\x12\xb0\x6a\x8e\x2c\x17\xa0\xba\x1b\xc0\x4f\x22\x01\ +\xaa\xe5\x27\x24\x85\xd5\x6b\xc7\x70\xd7\x2d\x57\x69\xd7\xa3\x9a\ +\x2f\x56\x31\x31\x5b\x32\x66\x4d\xc2\xa1\x52\xb4\xe0\xa4\xc8\x1c\ +\x05\x50\x7c\x98\xb3\xb6\xd5\xec\x42\x19\xe5\x8a\x85\x9e\xae\x2c\ +\xda\x32\x29\x01\xfc\x82\xd4\x84\x00\x43\x83\xbd\xd8\x70\xc5\x5a\ +\xcc\x2d\x14\x71\x31\xda\xed\xa6\x1d\x8e\x2a\xb8\x01\x0e\x58\xcd\ +\x24\x6e\x37\x8d\xcb\x72\x01\xaa\x3b\x90\x00\xd5\xf2\x13\x4a\x91\ +\xcd\xf5\x61\x74\xfd\x95\xb8\x63\xd3\x1a\x2d\x50\xcd\x15\x2b\x98\ +\xcc\x17\xe5\x31\xc1\x18\xc0\xe4\x54\xa7\x30\xc6\x87\x14\x10\x0a\ +\x50\x6e\x00\x15\x52\xb3\x76\xff\xf9\x62\x15\x0b\xa5\x2a\xba\x3b\ +\xda\x90\x6d\x4b\x4b\x20\xc5\x96\xd7\xd7\xd3\x85\xab\x37\xac\x45\ +\xcd\xb6\x71\xfe\xc2\x04\x6a\x35\x2b\x6a\x21\xbe\x9b\xe1\xec\xd4\ +\x7c\x00\xc0\xb9\x04\xac\x1a\x93\x15\x01\x54\xa2\x1b\x45\xf2\xd7\ +\xcc\x3f\xaa\x08\x23\x20\xe9\x34\xda\xba\x7a\xd1\x3b\xba\x01\x7d\ +\xfd\x7d\xb8\xfd\xda\x61\x74\x77\x64\x14\x13\x14\x88\x92\x51\x19\ +\xcf\x8d\x88\x09\x4e\x7c\x7c\x4c\x80\x12\x12\x53\x00\xc5\x52\x0d\ +\xb3\x0b\x65\x74\xb6\x67\xd0\x99\xcd\x40\x91\xcc\xaf\xaa\xbb\x33\ +\x8b\xab\xae\x58\x8b\xf6\x6c\x3b\xce\x9e\x1f\x47\xb9\x5c\x09\x03\ +\x2b\x02\xe0\x2a\x00\xef\x07\x70\x02\xc0\xb1\x04\xac\xea\x97\x25\ +\x1f\xf5\x8b\x92\x6c\xb6\x1d\x37\xdc\xb0\x09\xab\x06\x7b\x23\x52\ +\x12\xf7\x7f\xaa\x1c\x7d\xe2\x9e\x27\xca\x65\x79\x17\x4b\x34\x72\ +\xa8\x82\x09\x21\xc8\x64\x3b\xd1\xd6\xd1\x0d\x92\x4a\xa3\xa7\xab\ +\x1d\xed\x6d\x69\x7f\x8b\x2b\x3e\x31\xe5\x3e\x24\x91\x2d\xd2\x0c\ +\x0d\x46\x8f\x0a\xfa\x05\xe8\xeb\x8a\x01\x50\xec\x41\x7e\xa1\x82\ +\xb7\x4e\x4e\xe2\xea\xb5\xfd\x18\x1d\xec\x96\x36\x31\x0d\x7c\x18\ +\x29\x7a\xba\xb3\xb8\xf7\x43\x77\xa2\xaf\x37\x87\x47\x9e\xda\x85\ +\x4b\xe3\x53\x51\x46\xf6\x9b\x01\xfc\x35\x9c\x9d\x9a\xff\x6e\x74\ +\xcb\x03\x95\x64\x44\x30\xbe\x2c\x6b\xa0\x72\xb6\x41\xea\xc0\x47\ +\xdf\x7f\x2b\x36\x5d\xb3\x16\x80\x06\x5b\x88\xf3\x5f\x14\xee\xa8\ +\x9e\x27\xa2\x3b\x23\xe6\x38\x46\xd4\x85\x29\xcb\x35\x48\x62\x5e\ +\x5f\x4c\x51\x82\x92\x2e\x9d\x00\x28\xa9\x14\x31\x9f\x7e\xc0\x86\ +\xd7\x09\x4c\x72\x1a\x3d\x7b\xe2\xc3\xf5\x00\x15\xf4\xcd\x3b\x76\ +\x0e\x1c\xb7\x1b\x0b\x87\x4e\x4d\xa3\x54\xb1\x70\xc5\xea\x1e\xa4\ +\x35\xfd\xa5\x14\xe8\x68\xcf\x60\xcb\x9d\xd7\xa3\x27\xd7\x85\x87\ +\x9e\x78\x1e\xef\x9c\x3c\x17\x05\x56\x63\x70\x46\xb5\xd7\x01\xf8\ +\xd6\xe8\x96\x07\xf2\x09\x58\xc5\x93\x65\x0d\x54\x80\xf3\x10\xa5\ +\x52\x04\x29\x12\x4c\x36\x54\x83\x15\x45\xc0\xaa\xc2\xcb\x93\xc2\ +\xfc\x23\x86\x6a\x11\x44\x96\x25\xe7\xd7\x65\xe0\x29\xdc\x52\x82\ +\x95\x79\x05\x71\x6b\xa0\x91\x7e\x72\x4d\x03\x27\x26\x30\x16\x40\ +\xb9\x07\xba\x8d\x25\x6a\x96\x8d\x77\xce\xcd\xa2\x5c\xa9\xe1\xaa\ +\x35\x7d\xc8\xb6\xa7\x35\x9b\xa8\x02\xe9\x74\x0a\xb7\x5c\xbf\x01\ +\xb9\xee\x4e\x3c\xfc\xe4\x4e\xec\x7f\xfb\x78\xd4\x96\xf2\x7d\x00\ +\x7e\x1b\x0e\x58\xfd\xc1\xe8\x96\x07\x2e\x00\xc9\x4c\x76\x53\x59\ +\xf6\x36\xaa\xae\xce\x0e\xdc\x7e\xeb\x26\x0c\x0d\xe4\xa4\xbc\x44\ +\x1b\xd0\x0c\x76\xc5\x84\xc4\x00\x2d\xa1\x19\x26\xa9\x4c\x93\xd5\ +\x2d\xcd\x00\x35\x2d\x04\xb9\xc6\xf4\x89\xd9\x52\x78\x7a\xe3\xc9\ +\xa0\xd4\xa8\x8c\x7a\x00\xca\xf9\x61\x72\x2a\xda\x64\x53\x8a\xfc\ +\x42\x05\x85\x72\xcd\x57\x79\xd5\x4d\xa0\x20\x00\x06\xfa\xba\x71\ +\xe5\x15\x6b\x51\xae\x54\x71\x21\x7a\xb7\x9b\x0c\x9c\x67\x7d\x13\ +\x80\xbd\x00\x26\x12\xbb\x95\x99\xac\x08\xa0\xba\xe3\xd6\x4d\x18\ +\xea\x77\xe7\x82\x0a\x29\xc2\x54\x41\x6d\x3c\x9b\x74\xc9\x01\x4b\ +\x4e\x14\x99\x7c\x19\xd9\xd6\xbc\xe9\x09\x93\xb3\x66\xf3\xa8\x94\ +\xd1\x61\xcc\x89\x89\x50\x41\x58\xb3\x00\x4a\x64\x83\x0b\xa5\x2a\ +\xf2\x0b\x15\x74\x77\xb4\xa1\xa3\x3d\xc3\x14\x25\x1b\xe4\x72\x5d\ +\x1d\xb8\x6a\xc3\x3a\xa4\x52\x69\x9c\xbb\x30\x8e\x4a\xb8\x8f\x60\ +\x0a\x0e\x50\xdd\x05\xe0\x10\x80\xd3\x09\x58\x45\xcb\xca\x58\x3d\ +\x81\x6a\x8e\x11\x8c\x54\xc9\xe9\xbd\x31\xad\x88\xa2\xa9\xfc\xe0\ +\xca\x65\xba\x21\xfc\x8f\x51\xb3\xa9\x5b\x47\x74\x26\x76\x1c\x8e\ +\x1f\x85\x0b\x49\xaa\xfe\x6b\xb5\x28\xea\x0c\xeb\xa3\xd4\x3c\x66\ +\x59\x05\x4a\xa9\xfe\x1e\x7a\xc9\xc0\x82\x04\x0d\xbd\xae\x41\x1d\ +\xde\xbd\x0a\x5c\xa9\xf5\x9b\x4b\x50\x39\x3f\x80\x99\xf9\x32\x0e\ +\x1c\x9f\xc0\xc5\xe9\x42\x50\xab\xa2\xb1\x14\x40\x5f\x4f\x27\x3e\ +\xf9\xd1\xbb\xf1\xb9\xfb\xee\xc1\xe0\x80\xd1\x6e\x37\xef\x85\xe3\ +\x76\xf3\xd3\x00\xd2\xc9\x0a\x0c\xe1\xb2\x32\x18\xd5\x2d\x9b\xb0\ +\x6a\xa0\x27\x44\xd5\x0b\x63\x56\xce\x81\x91\xad\xa9\x85\xec\x4a\ +\xd1\xa4\x7a\x72\x35\x46\xa6\xe2\x9b\x9d\xa2\x8b\x24\x04\xf3\xae\ +\xea\xa7\x06\x55\x6a\x56\xa4\x76\x80\x52\xc1\xb6\x22\xd8\x93\x73\ +\x18\xce\xa0\x9c\xf0\x68\x35\xb3\x62\x59\x98\xce\x97\x90\x4a\x11\ +\xf4\x74\xb6\x73\x4c\x49\xcc\xd3\x96\x49\x63\xdd\x9a\x61\xac\x5a\ +\x35\x80\x8b\x97\xa6\x4c\xdc\x6e\x56\x01\xf8\x09\x00\x45\x00\xfb\ +\x13\xb7\x1b\xbd\x2c\x7b\x63\x3a\x2b\xd2\xac\x02\xea\xd8\x14\x2c\ +\x66\x29\xc7\x30\x30\xab\xd7\x76\xc5\x15\xa3\xb0\x9c\x13\x21\xbc\ +\x6e\xf0\x32\xce\x4c\x62\x84\xb6\x56\x08\x21\xb0\x6c\xd7\x90\x6e\ +\x0a\x4a\x8a\x04\x71\xc1\x89\x0b\x52\xa8\x77\x80\x19\x40\xe9\xea\ +\xf1\x5a\x40\xe0\xec\x76\x73\xe4\xf4\x34\x4a\x65\xc7\xc8\xde\xd6\ +\x96\x92\xcb\x76\xcf\xdb\x33\x69\xdc\x71\xf3\xb5\xe8\xc9\x75\xe1\ +\x91\x27\x77\xe2\xd0\xd1\x53\x51\x57\x61\x18\xc0\x1f\xc3\x19\x19\ +\xfc\xb7\xa3\x5b\x1e\x98\x4a\x0c\xec\xb2\xac\x28\xa0\xf2\x24\x18\ +\xdf\x03\xce\x4f\x2e\xe0\xec\xc4\x3c\x08\x91\x79\x87\x9e\x21\xc9\ +\xa8\x42\x54\xe9\x88\x1c\xa3\x08\xe2\xcb\x8c\x62\x5a\x44\x0f\x33\ +\xe1\xac\x50\x5b\x9c\x61\x64\x7c\x18\x73\x72\x44\xd3\xaa\x72\xd5\ +\xf2\x55\x38\xad\xd0\xb0\x53\x0d\xb3\xa1\x11\xc5\xb4\x0c\xa0\xdc\ +\x52\x99\x04\x96\x4d\x71\xf2\x42\x1e\xa5\x8a\x85\x6b\xc7\xfa\xd1\ +\xd5\x91\x11\x17\x38\xf5\x0f\xd3\x29\x82\x8d\x57\xad\xc3\xcf\xfc\ +\xd4\xbd\x78\x7c\xeb\x8b\x78\xfd\xcd\x43\x51\x33\xd9\x73\x00\xfe\ +\x4f\x38\xeb\x82\xfd\xee\xe8\x96\x07\x4e\x02\xc9\x88\x20\x2b\x2b\ +\x0c\xa8\x02\x4e\xe5\x1d\x15\x4a\x35\x4c\xcd\x16\x7d\x54\x62\x1f\ +\x05\xd5\x83\x41\x54\x0c\x2b\xcc\x40\x4f\xf4\x8a\x97\x16\x08\xa3\ +\x8c\xf9\x26\x03\x02\x50\x03\x60\x1c\x69\x05\xc3\xd2\x81\x91\x72\ +\x42\xad\x36\x4f\x34\x60\x44\xc5\xab\x60\xb1\x15\x00\xc5\x8a\x4d\ +\x81\xf3\x93\xf3\x28\x57\x6b\xd8\xb8\x7e\x10\x7d\xdd\xed\xca\x2d\ +\xbc\x9c\xeb\x41\xb1\x7e\xcd\x20\x3e\x7f\xff\x3d\xe8\xed\xe9\xc6\ +\xae\x97\xf7\xa1\x54\xaa\x44\x6d\xcd\xf5\x0b\x00\x46\x01\xfc\x06\ +\x80\xd7\x47\xb7\x3c\x90\x80\x95\x2b\x2b\xc3\x98\x2e\x59\x30\x19\ +\x55\x8f\x38\xff\x11\x30\xf8\x40\xbc\x17\x27\x98\xd0\x47\x08\xff\ +\x32\x39\xe7\x94\xc3\x01\xe2\x97\xc7\x94\x23\xb4\x43\x55\x16\x5b\ +\x07\xab\x97\x4a\x84\xc6\xcb\xcb\x57\x21\xa5\x01\x5b\x16\xa1\xee\ +\x1c\x31\xa1\xbe\xb0\x3f\x22\xf7\xa3\x59\x7f\xaa\xf6\xfb\x97\x5a\ +\x30\x7e\xab\x86\x06\x24\x97\x1d\xcd\x40\x00\x6f\x7c\xf7\xca\x8e\ +\xbb\x03\x33\xd5\x1a\xca\x65\xdb\xb8\xdb\x3e\xcd\x24\x4f\x6f\xa3\ +\x54\x0a\x60\x72\xb6\x84\x37\x8f\x8d\x63\x7c\xa6\xa8\x78\x22\xf9\ +\x8e\x0c\x0d\xe4\xf0\xe9\x7b\xdf\x87\x4f\xdf\xfb\x01\xf4\xf6\x44\ +\xee\x76\x43\x00\xdc\x0b\x67\xb7\x9b\x4f\x00\x20\x89\x91\xdd\x91\ +\x95\x6d\x4c\x07\x30\x35\x57\xc6\xd4\x9c\x33\x87\x47\xa5\xe9\xb0\ +\xac\x44\xc9\x80\x04\xe3\x93\xce\xd8\x2d\xa9\x86\x21\x46\x52\x35\ +\xd3\x52\x1b\xb1\xe2\xcc\xa1\x8a\x6b\x99\x6a\x36\xa3\xa2\x31\x63\ +\x69\xcc\x42\x4c\x99\x13\x60\xce\x9e\xf4\xe5\xf2\x01\x3a\x80\xe2\ +\xd2\x30\x19\xcb\x55\x1b\x53\x73\x25\x64\xd2\x69\xe4\xfc\xb5\xad\ +\xd4\x2a\x68\xb6\x3d\x83\xb1\x75\x23\xe8\xef\xeb\xc5\xf9\x8b\x13\ +\x98\x5f\x28\x46\x19\xd9\x47\xe1\xac\x6d\x35\x05\xe0\xed\xdc\xd8\ +\x66\xeb\x72\x37\xb2\xaf\x1c\xa0\x72\xe7\x51\x89\xf7\x77\x2a\x5f\ +\xc2\x54\x3e\x58\x2e\x56\x65\x4c\x37\xb2\x5d\xd5\x09\x58\x4e\xde\ +\x78\xa0\xe5\x94\x53\x07\x70\x69\x12\x98\x01\x52\xbd\xb0\x15\x6f\ +\xbe\x43\x1c\x70\xd2\xa9\x7c\x71\xc1\xc9\x89\x33\x30\xe4\xd3\x06\ +\x00\x4a\x2c\x94\x00\x55\x8b\x62\x7a\xce\xd9\x21\xba\xb7\xbb\x8d\ +\x5b\xdb\x4a\x2c\x37\x93\x4e\x61\x74\x64\x15\x56\x8f\x0c\x61\x62\ +\x72\x1a\x33\xb3\xf3\x51\x97\xb2\x0f\xc0\x3d\x6e\xad\xfb\x72\x63\ +\x9b\x2b\x97\x33\x58\xad\x1c\xa0\x1a\xe0\x17\xff\xf4\x00\x60\x2a\ +\x5f\xc2\xa4\xc7\xa8\x88\x08\x49\xfc\x49\x33\x01\x4b\x15\x14\xf1\ +\x95\x34\x03\x2d\x45\xc1\xc6\x10\xd3\x24\x0a\x45\x22\x63\xf5\x7f\ +\x84\x57\x08\x95\x05\xca\x00\xa5\x86\xa6\xa8\xa9\x48\x91\xec\x89\ +\x09\x68\x16\x40\x09\x58\x05\xcb\xb6\x31\x33\x57\x46\xa5\x66\xa3\ +\x37\x97\x45\x26\xad\x1f\x11\x4c\xa7\x08\x86\x06\xfb\x30\xb6\x6e\ +\x35\xf2\x73\x0b\x18\x9f\x98\x01\xa5\x08\x73\xbb\xe9\x04\xf0\x01\ +\x38\xab\x87\xee\xc9\x8d\x6d\x5e\xb8\x5c\x27\x87\xae\x58\xa0\x02\ +\x9c\x1b\x3c\x95\x2f\x61\x6a\xae\xe4\x67\x14\xc1\xa2\x59\x80\xc5\ +\x1d\x35\xc8\xb2\xe4\x3a\x14\x71\x06\x95\x34\x05\x97\x04\x1b\x9d\ +\x0c\x36\x5a\x8b\x9a\xd1\xbc\xa9\xd0\xb4\x7e\xfd\x44\xea\x6f\xdd\ +\xaa\x9d\x10\x68\x02\x50\x41\x78\x08\x83\x12\x4e\x45\xdb\x57\x7e\ +\xa1\x82\x85\x62\x0d\xbd\x5d\xed\xc8\xb6\xa7\x95\x99\x28\x9c\xe7\ +\xa2\xbf\x37\x87\x2b\xd6\xaf\x45\xb5\x5a\xc5\x85\x4b\x93\xb0\xac\ +\xd0\x11\xc1\x0c\x80\xf7\x00\xb8\x0e\xc0\xeb\x00\x26\x2f\x47\xb0\ +\x5a\x39\x40\xa5\x71\xa1\x99\x9a\xf3\x54\x3f\x3e\x5c\xcb\xae\x98\ +\x00\x13\xc0\xe2\xc3\xe3\xb3\x2c\xb1\x2d\x61\x12\x95\x8c\xd4\x81\ +\x56\x66\xaa\xa4\x1a\x88\x78\x31\x54\x01\x4d\xd1\x53\xc9\x52\xf4\ +\xed\x30\x55\xed\xf8\x38\x13\x70\x62\xd2\x69\x0a\xd7\x01\x94\x58\ +\xce\x42\xa9\x8a\xd9\xf9\x32\xba\x3a\xda\x9c\xb5\xad\xa8\xb2\x38\ +\x10\x02\xe4\xba\xb2\xd8\x30\xb6\x16\x99\x74\x1a\xe7\x2f\x4e\xa0\ +\x52\xa9\x46\xb9\xdd\xdc\x00\x07\xb0\x0e\xe2\x32\x74\xbb\x59\x79\ +\x40\xe5\x89\x52\xf5\x93\xcb\x6f\x25\x60\x71\x47\x31\x30\xa4\x59\ +\xc0\xc5\xd7\x15\x4a\xcf\x22\xdb\x64\x9e\xc0\x4b\xc4\xfc\x51\x35\ +\xfb\xa2\x11\x6d\x52\x72\x23\xaa\x06\x21\xe2\x0f\xb7\x46\x19\xc7\ +\x83\xb3\x56\x03\x94\x58\x07\x05\x45\xb1\xe2\xcc\x64\xcf\xb6\x65\ +\x90\xeb\x6a\xd7\x5c\x01\x27\x53\x47\xb6\x0d\xeb\xd6\xad\x46\x4f\ +\x77\x37\xce\x5f\x98\x40\xa1\x58\x8a\x7a\x36\xd6\xc3\x59\x93\xfd\ +\x0c\x80\x23\xb9\xb1\xcd\xf4\x72\x01\xab\x15\x03\x54\x83\x9e\x31\ +\x9d\x8d\x24\xc0\x64\xbe\x84\xa9\xb9\xa2\xff\xa2\x46\x81\x15\xd0\ +\x38\x60\xf1\x71\x0a\x23\x7e\x4c\xe2\x63\x0a\x5c\x72\xdd\x11\xe9\ +\xf4\xb3\x4b\xe3\xd9\xa1\x88\x08\x48\x42\x21\x52\x61\xe1\x43\x7b\ +\x91\x03\xf4\x3a\x9b\x16\x55\xb7\x5c\x9c\xc7\xde\x4c\x80\x72\xf2\ +\x85\xcf\xd9\x62\xf7\x21\x24\x00\x2a\x96\x8d\xa9\x7c\x11\x29\x42\ +\xd0\xdb\x9d\x75\x97\x28\x52\xb7\xb1\x3d\x93\xc6\x9a\xd1\x21\x0c\ +\x0d\xf5\xe3\xd2\xf8\x14\x66\xa3\xdd\x6e\x86\xe0\xb8\xdd\x2c\x00\ +\x78\x33\x37\xb6\xb9\x76\x39\x80\xd5\x8a\x01\x2a\x91\x51\x79\x09\ +\xa7\xe6\x8a\xce\x56\x4d\x84\x67\x15\x8b\x0f\x58\x4c\xfa\xd0\x4a\ +\x42\x83\x95\xed\x34\x15\x6e\x9e\x58\x0c\x8b\x7c\xd0\x6a\x8d\xfa\ +\xc7\x02\x92\x3f\x69\x4a\x2f\x46\x40\x44\xd4\x91\xd4\x07\x44\x55\ +\x59\x54\x5b\xa4\x9f\xa2\xde\x51\x3c\xc4\x07\x28\x27\x8f\x1a\x79\ +\x2d\x8b\x62\x6a\xae\x84\x9a\x45\xd1\x9b\x6b\x47\x26\x1d\x3e\x22\ +\x38\xbc\x6a\x00\x6b\xd6\x8c\x60\x66\x26\x8f\xa9\xa9\x59\x44\x48\ +\x0e\xce\x88\x60\x07\x9c\x0d\x24\x4a\xef\x76\xb0\x5a\xb1\x40\x05\ +\x37\x31\x67\x4c\xf7\x81\xa6\xd9\x80\x15\x9c\xc5\x05\x2d\xa9\x9c\ +\xba\x18\x8e\xba\xdd\xea\xfa\x65\x14\x88\xb6\x7d\xc5\x15\x51\xbd\ +\x13\x98\x57\x84\x11\x3e\x96\xaf\x8d\x10\x2c\xaa\x7d\xb2\x7d\x8b\ +\x89\xa6\x7c\x8e\xa6\x03\x94\x90\x99\x2d\x9f\xba\xe5\xcc\x2e\x94\ +\x51\x2c\x57\xd1\xeb\xed\x76\xa3\x99\x79\x9f\x4a\x11\x0c\xf4\xe5\ +\xb0\x7e\x6c\x0d\x8a\xc5\x32\x2e\x8e\x1b\xed\x76\xb3\x05\xce\x42\ +\x7c\x7b\x72\x63\x9b\xf3\xef\x66\xbb\xd5\x0a\x03\x2a\x2a\x25\x11\ +\x47\xfd\x00\x48\xec\x0a\xa8\x13\xb0\x98\x40\x15\xec\xb4\x0a\xb4\ +\x4c\xa2\x89\xa6\x01\x44\xca\x48\x22\xe2\x43\x6a\x20\xba\x3f\x98\ +\xd9\xdf\x4d\x27\x81\x42\x66\x26\x7a\xee\x44\xb4\x69\x24\x10\x20\ +\xf2\x44\xcd\xb0\xb6\x34\x03\xa0\x82\x9f\x20\xc1\x5c\xa1\x8a\x7c\ +\xa1\x82\x9e\xae\x76\x74\xb6\x67\x84\xf2\xd8\xde\x11\xf4\xe4\x3a\ +\x71\xc5\xfa\x51\x80\x02\x17\x2e\x4e\xa2\x5a\x0b\x5d\xdb\x2a\x0d\ +\x67\xa7\x9b\x9b\x00\xbc\x01\xe0\xe2\xbb\x15\xac\x56\x84\x0b\x8d\ +\x4c\xff\x05\x87\x05\xaa\xf8\xd2\x52\xb5\xab\x05\x97\xcc\x5b\x0f\ +\x89\x59\xb8\x4d\x74\xd6\xd1\xb9\x5a\x78\xee\x16\x61\xf6\x90\xe0\ +\x4f\xe3\x42\x22\xba\x8f\x28\xbe\xf4\xca\x68\x02\x0d\xf2\x42\xb0\ +\xee\xcb\xea\x1f\x55\x1a\xb1\x35\x0c\x88\x46\xfd\x51\x4d\x27\xd4\ +\x9d\xa1\x42\x30\x9f\x92\x67\x64\xdc\x87\x86\x8a\x39\xa0\xe8\x04\ +\x05\xeb\x6a\xe4\x97\x29\x7c\xb2\xc4\xd6\x89\xcf\x80\x78\xff\x82\ +\x7c\x34\x00\x53\x11\xa4\x94\xcf\x48\x50\x0e\xe0\xd8\x52\xf7\x1e\ +\x1d\xc7\xc5\xe9\x42\x68\xb7\x08\x80\x55\xfd\x3d\xf8\xc4\x4f\xbc\ +\x17\xf7\xdd\xfb\x3e\xf4\xf5\xe6\x4c\xdc\x6e\x3e\x09\xe0\xfb\x00\ +\x3e\x0a\xbc\x3b\xdd\x6e\x56\x04\xa3\xba\xfd\x96\x4d\x18\xec\x53\ +\xcd\x4c\x27\xc1\xcc\x74\x40\xc1\x7e\xd8\x30\x33\x75\xa8\x3e\x96\ +\x15\x9c\x99\x98\x97\xe4\x34\x66\xaa\x28\x53\x8b\xa6\x1d\x81\x0a\ +\xa6\x6d\x06\x31\x24\x54\xd1\xbd\x30\xfe\xd3\xd8\xc0\xf9\x20\x95\ +\x71\x9a\x49\x28\xb1\x1f\x01\x87\x59\xdb\x96\xa8\x82\xf9\x9d\x66\ +\xd3\x1b\x8c\xe2\x71\x6d\xd1\xa9\x8b\xdc\x47\x32\xdc\xa0\x5f\xae\ +\x5a\x98\xcc\x17\x91\x4e\xa7\xd0\xd3\xed\xae\x6d\xa5\x99\x67\x91\ +\x6d\xcf\x60\xcd\xe8\x08\x06\x06\x7a\x71\xf1\xd2\xa4\x89\xdb\xcd\ +\x1a\x00\x1f\x01\x30\x0e\xe0\x60\x6e\x6c\xb3\xfd\x6e\x62\x56\x2b\ +\x06\xa8\x24\x63\xba\x9b\x72\x32\x5f\xc2\x64\xbe\x08\x0e\x8a\x5a\ +\x00\x58\x52\x79\x61\x75\x19\xaa\x87\xe1\xed\x60\x20\x49\x65\x17\ +\x17\x3b\xab\x0e\x82\xce\x55\x27\xb4\x4f\x7e\x8c\xa1\xcd\x29\x4c\ +\xa8\x7a\x92\x82\xf4\x7e\x12\xf8\x8c\x88\x68\xd3\x32\xf5\x87\xcf\ +\x20\x65\xce\x34\xc6\x2d\xb9\x99\x42\x9d\xf5\x01\x94\x58\x16\x15\ +\x02\xab\x16\xc5\x54\xde\x71\xbb\xe9\xeb\xce\xf2\x6e\x37\x42\x39\ +\x6d\x99\x14\x56\x0f\x0f\x62\xf5\xc8\x10\xa6\xa6\x66\x31\x3d\x3b\ +\x17\x75\xb5\xfb\xe1\x80\x55\x0d\x8e\xdb\xcd\xbb\x66\x21\xbe\x15\ +\x04\x54\x39\x65\xfe\xa9\xb9\x62\xc0\xa8\xc4\x51\x37\x25\x88\x40\ +\x09\x5a\xe1\xf6\xa6\xc5\x05\x2d\x36\xbd\x0a\x68\x88\x22\x40\xdd\ +\x47\xd3\x41\x03\xc7\x28\x4e\xea\x01\x22\x00\x3a\xd4\xf0\x99\x94\ +\xa2\x58\x65\x0d\x94\x35\xd0\xeb\x8b\xa7\xde\x3c\x00\x29\x8d\x8c\ +\x10\x94\xb9\x46\x3a\xc3\xbb\x6e\xaa\x81\xb2\x09\x1a\x3b\x94\x5c\ +\x0e\x1f\xe8\x9d\x13\x00\xb6\x4d\x31\x3d\x57\x46\xa9\x6a\xa1\x2f\ +\x97\x45\x26\x93\x82\xce\xbf\x31\x4d\x08\x06\x07\x7a\x31\xb6\x76\ +\x14\xf3\xf3\x05\x8c\x4f\x4e\xc3\xb6\x43\x9f\xa5\x4e\x38\x73\xad\ +\x06\xe0\x18\xd9\x0b\xef\x06\xbb\xd5\xca\x07\xaa\xbc\x6a\x66\x7a\ +\xfd\x80\x05\x34\x81\x65\x09\x11\x61\x70\x11\x5e\x97\x00\x49\x4c\ +\x87\x88\xa2\x53\x41\xaf\x09\x10\xa3\xad\x04\x4a\x5c\x33\x10\xc2\ +\x95\x40\x25\x54\x52\x03\x0e\x35\x2d\x5e\x4a\xeb\x32\x2e\xe5\x8c\ +\x50\x80\xe1\x4f\x7c\xd5\x94\x68\x08\x55\x10\xde\x2c\x80\xf2\x63\ +\x55\x1b\x56\x30\x65\x50\x38\x6e\x37\x73\xc5\x0a\x7a\xbb\xda\xd1\ +\xd1\x9e\x56\x14\xe2\x8e\x08\x12\x82\xde\x9e\x6e\xac\x5f\x3f\x0a\ +\xab\x56\xc3\xc5\x4b\x93\xa8\x85\xbb\xdd\xb4\x01\xd8\x0c\xe0\x1a\ +\x00\xaf\x01\x98\x5e\xe9\x60\xb5\x22\x8c\xe9\x80\xd2\x3c\xcb\xc7\ +\x29\x2c\xe0\x7e\x1e\xc9\xd8\xc9\x17\xaa\x5b\xe3\x48\xaa\x47\x61\ +\x78\xd5\x9a\x8f\x99\x40\x7e\x8d\x26\x3e\x07\x6f\x74\x07\xd7\x06\ +\xc9\xf0\xcc\x74\x88\x8a\x4f\x3d\x53\x3e\x65\x2b\x15\x9a\x24\x89\ +\x67\x60\x27\x2a\x73\xb8\x0c\x3e\x94\xfb\xd3\x9a\xce\xf9\x0a\x84\ +\xca\xd5\x6c\x4a\x1c\x6a\x70\xd3\x52\xbe\x2c\x0a\xc2\xd9\xa7\xf8\ +\xeb\xe2\x75\x28\xb8\xdf\x8a\x42\xdc\xfc\x7c\x22\xc9\xd7\x50\xfb\ +\xec\xe8\x9f\x93\x20\x0f\x55\x3e\x0f\x62\x18\xa5\x14\x17\xa7\x0b\ +\xd8\x7b\x74\x1c\x13\xcc\xda\x56\xaa\xb4\x29\x02\x8c\x0c\xf6\xe1\ +\x53\xf7\xbe\x1f\xf7\xde\x73\x37\x72\xdd\x9d\x51\x46\xf6\x34\x80\ +\x2f\xc0\x59\xdb\xea\x6e\x00\x58\xc9\x46\xf6\x15\x03\x54\x9e\x48\ +\x37\x9b\x3d\x96\x00\xa6\x3e\xc0\x12\x77\x2d\x31\x05\x2d\xb6\x7d\ +\xaa\x41\xa9\x50\xe0\x22\xe2\xe6\x95\x54\x7a\xc1\x04\x92\xc5\xab\ +\x56\x6c\xba\xb0\x70\xf6\x44\x19\x20\xb3\xa1\x68\x30\x12\x53\x29\ +\x3a\x1b\x52\x0e\x37\xf2\xc7\xd4\x4d\x01\xcd\x64\x78\x22\x00\x91\ +\x57\x8e\x77\x2d\xc1\xa8\xc3\x54\x36\xe6\xbb\x05\x53\x2e\x2f\xfc\ +\x4c\xf2\xb3\xc2\xb7\x3c\x0c\xa0\x3c\x90\x12\x23\x45\x80\xf2\x9e\ +\x1b\x02\x60\x66\xae\x8c\xbd\x47\xc7\x71\x76\x7c\x5e\xf5\x7d\xe1\ +\xee\x7f\x5f\xae\x0b\x1f\xfe\xc0\x9d\xb8\xff\x93\x1f\xc2\xd0\x60\ +\x9f\xc9\x6e\x37\x1f\x82\x33\x22\xf8\x59\x00\xa9\x95\x0a\x56\x2b\ +\x46\xf5\x1b\xec\xcf\x39\x77\x50\x48\x31\x35\xeb\x1a\xd3\x15\x23\ +\x5d\xa1\x06\x6a\xe6\x20\xdc\xde\xa4\x50\xa1\x22\x54\x24\x1d\x25\ +\xd7\xd5\x43\x84\x42\x09\xf3\x1f\x51\xa6\x97\x51\x48\x5e\x62\x39\ +\xac\x73\xea\x81\x86\x88\x5e\xb9\xbf\x54\x93\xc9\x33\x72\xeb\x8d\ +\xef\x24\xaa\x78\x55\xa3\x42\x46\x03\xc3\xfa\x40\x19\x14\x23\xa2\ +\xf1\x5d\x37\x10\xc1\x82\x0c\x91\xeb\x53\xaa\x78\x4c\x84\x4e\xcd\ +\x0b\x92\x29\x8c\xf8\x6e\x5d\x95\x9a\x8d\xc9\xd9\xa2\x03\x46\xdd\ +\x59\xa4\x15\xcf\x50\xe0\x76\x93\xc2\xea\x91\x55\x18\x1e\x1a\xc0\ +\xf8\xc4\x14\x66\xf3\x91\x6e\x37\xc3\x70\x8c\xec\x79\x38\xbb\xdd\ +\xac\xb8\x85\xf8\x56\x16\x50\xb1\xc2\x8c\xfa\x05\xc6\x74\xc4\x02\ +\x2c\xee\x28\xc2\x8e\xe5\x1c\x36\x0f\xb4\xf8\xbc\xf2\xda\xed\x5a\ +\xdf\x45\xa2\x68\x07\xd7\x76\x12\x0b\x84\xf4\x20\xad\xb3\x35\x45\ +\x18\xdb\x15\x18\xe5\x60\x97\xe2\xc5\x93\x0e\x82\x13\x95\xad\xc9\ +\x07\x68\xaa\x06\x85\x40\x3d\x55\xd5\x23\xe8\x8b\xde\x01\x65\x6a\ +\xd4\xdc\xfc\x46\x01\xca\x49\xaa\x01\x29\xa6\x2d\x96\x4d\x31\x99\ +\x2f\xa1\x5a\xb3\xd1\xef\x1a\xd9\xf9\xaa\x82\x32\x32\xe9\x14\x56\ +\x0d\xf6\x61\xed\xe8\x08\x66\xf3\xf3\x98\x9c\x9e\x45\x84\xf4\xc0\ +\x01\xab\x36\x00\xaf\xe7\xc6\x36\x97\x57\x92\xdd\x6a\x65\x00\xd5\ +\xcd\x9b\x30\xd8\xa7\x36\xa6\x3b\xd3\x13\x82\xed\xc4\x59\xc0\x82\ +\xa2\xc0\xe6\xb0\x2c\x75\x0a\xb3\x39\x54\x61\xf5\x11\x65\xfd\xe1\ +\x9b\x54\xe8\x0c\xee\x41\xa8\xce\x50\x2e\x19\xf9\xe5\x85\xdf\xeb\ +\x10\xaa\x3c\x0c\xbf\x28\xe2\x09\x89\x28\x8a\x1d\xa1\x84\x30\xa2\ +\xa7\xa8\x97\x79\xc9\x25\xe3\x39\x82\x6b\x4f\x59\x1f\x43\x05\x52\ +\x86\x02\x94\x1b\x60\x0c\x50\x7e\x7a\x3e\xde\xb6\x1d\x55\xb0\x50\ +\xaa\xa1\x2f\x97\x45\x7b\x26\x2d\x81\x94\x27\xe9\x14\x41\x5f\x6f\ +\x0e\x63\xeb\x46\x51\x2e\x57\x70\x69\x7c\x1a\x56\xb8\xdb\x4d\x16\ +\xc0\xfb\xe0\x2c\x75\xbc\x07\xc0\xdc\x4a\x01\xab\x15\x63\xa3\x0a\ +\x6c\x05\xca\x08\xf9\x94\xb1\x17\xd4\x65\xc7\x0a\xb3\x65\x29\x0c\ +\xf0\x6c\xd9\x26\x4b\xe6\xca\xef\x92\x6c\xcc\x75\x44\x66\x08\xce\ +\x8b\x29\x1b\x6f\x28\x07\x5e\x81\xa1\x46\x3d\x1b\xdd\x35\x96\x13\ +\xef\x4f\x7f\xd5\xcd\x11\x27\x30\xc0\xfb\x65\x2b\x40\x8f\x2b\x51\ +\x51\x7c\x60\x2f\x22\x5a\x10\xf2\xaf\xa2\x50\x98\x38\x75\x41\xb2\ +\x43\x71\xba\x1d\x61\x8b\x54\x7e\x80\xf8\xba\xd5\xcf\x54\x94\x1d\ +\x4a\xea\x2a\x63\x13\x55\x5d\x14\x0a\xe0\xec\xc4\x3c\x5e\x3b\x7c\ +\x09\x53\xf9\x92\xf2\xfa\x7b\xc9\x53\x29\x82\xd1\xe1\x41\x7c\xfa\ +\x13\x1f\xc4\x3d\x1f\xb8\x03\x9d\x1d\xd9\x28\xbb\x55\x3b\x80\x5f\ +\x06\xf0\xd7\x70\x5c\x6f\x56\x84\x91\x7d\xc5\x00\x95\x27\x2a\x80\ +\x70\x23\x9a\x04\x58\x71\x41\x8b\x35\xc1\xcb\x23\x42\x72\x3d\xc4\ +\x3f\xa7\x6e\x3a\x0e\x25\xfc\x8a\x78\x66\x41\xb9\xb7\x49\x67\x03\ +\xd3\x4c\x09\xa0\xd2\x21\xb8\x82\xb9\xed\xd5\xd9\x2b\xa0\x99\x66\ +\xa0\xb8\x8e\x5a\x6f\x1a\xbf\xd1\xc1\x9f\x34\x37\x8c\xeb\xbe\x68\ +\x8c\x57\x3f\x05\x7e\x84\x00\xd0\x44\xe6\x89\x6e\x31\x2a\xaa\x2a\ +\xd4\x1d\x24\x96\xeb\x01\x00\x42\xd4\xcf\x00\x93\xca\x14\xa0\xc4\ +\x51\x5b\xbe\x0c\xe7\x77\x72\xb6\x88\xd7\x8f\x5c\xc2\x85\xa9\x05\ +\xa9\x3c\xf6\x24\x45\x80\xc1\xbe\x1c\x3e\xfa\xa1\xbb\x70\xdf\xbd\ +\xef\x43\x7f\xb4\xdb\x4d\x0a\xc0\xa7\xe1\x18\xd9\xef\x01\x96\xbf\ +\xdb\xcd\x8a\x03\x2a\x4f\x38\x78\xa0\xf2\xc3\x10\xa4\x33\x03\xac\ +\x30\x96\x65\x0a\x5a\xec\x43\x28\x01\x17\x00\xbd\x65\x5b\xe0\x8b\ +\x04\xf2\x39\x37\x1a\x15\x80\x2a\x5b\x01\x5f\x6f\x3c\x26\xc4\x19\ +\x94\xa8\xa3\x06\x89\x20\xa4\xc4\x21\x12\xf1\xa7\xb9\x67\xf2\x0d\ +\xe2\x3a\xaf\x8e\x82\xd7\x3c\xc1\x48\x2f\xaa\x88\x0c\x53\xf2\xda\ +\x28\x0e\xfa\xf9\xf7\x58\x7c\x18\x98\x26\x48\x93\x45\x19\x7a\x26\ +\x3e\x07\xcd\x02\x28\xca\x64\x20\x04\x98\x2b\x54\xb0\xf7\xe8\x38\ +\x4e\x9c\xcf\xc3\x56\x8d\x28\x32\x57\x2d\xd7\xdd\x81\xf7\x6e\xbe\ +\x05\x9f\xfb\xf4\x3d\x58\x33\xb2\xca\x64\x44\x70\x33\x80\xef\x02\ +\xf8\x19\x00\x99\xe5\x0c\x56\x2b\xc3\x46\xa5\x32\xa6\xbb\xe2\xb9\ +\xd0\x68\x7d\xf4\x42\x87\xe8\x4d\xed\x58\x7c\x2a\x9d\xb1\x5a\x3f\ +\xaa\xc7\xe4\xf5\xdf\x2f\xde\xe5\xc7\x37\x84\xab\x6c\x49\xda\x55\ +\x12\x74\xbb\x2b\x2b\x98\x8b\xe2\xc2\x68\x67\xa2\x1b\x80\x8e\x56\ +\x42\x8c\x45\x11\x97\x95\x53\x77\x41\xd5\xed\x17\x27\x7b\x52\xd5\ +\x19\x4b\x9e\x54\x2a\x16\x93\x88\x1f\xcb\xe4\x8d\xf1\x4e\x7e\x55\ +\xab\x83\xfb\x14\x65\x83\x72\x7e\xe4\x46\xcb\xb6\x2c\x45\x6f\xdc\ +\xd3\x9a\x45\x31\x91\x2f\xc1\xb2\xa9\x63\x64\x4f\xc9\xba\xbc\x77\ +\xda\x96\x49\x63\x68\x68\x00\xa3\xab\x57\x61\x7a\x66\x16\xd3\x33\ +\x91\x6e\x37\x03\x70\x8c\xec\x15\x00\x6f\xe4\xc6\x36\x57\x97\xa3\ +\xdd\x6a\x65\x01\x15\x6f\x4c\x00\xe0\x00\xd5\x04\x6b\x4c\x37\xd8\ +\xdc\x41\x3a\xd5\x6d\xb5\x85\x06\x41\x2b\x06\x20\x49\xed\x66\x46\ +\xde\xd4\x23\x82\x44\x0d\x92\xaa\xa5\x97\x25\xb0\x51\x4f\x7b\xf0\ +\xff\x54\x1f\x62\x53\xa0\x52\x18\xc6\x95\x33\xd6\x69\x38\xfa\x51\ +\x42\x35\xe1\x80\x6e\xf9\x16\x2a\x18\xb4\x02\x36\xc5\x1b\xde\xd9\ +\xc2\x7c\xd6\xa4\xb1\x26\x70\xc8\x48\x82\x84\xba\x75\xa5\xd8\x03\ +\xaa\x41\x13\x15\x89\x63\x43\x55\xae\x38\x36\x75\xf6\x11\x2c\x55\ +\x2c\xf4\x77\x67\xd1\xde\x96\x52\x34\xdb\x39\x4b\x13\x82\xfe\xbe\ +\x5e\xac\x5b\xbb\x1a\x85\x42\xd1\x71\xbb\xa1\xa1\xb7\xb0\x0b\xce\ +\x7c\xab\x5e\x38\x46\xf6\xe2\x72\x03\xab\x15\xa3\xfa\x51\x2a\xdb\ +\x8e\x00\xd5\x97\x29\x64\xe9\x96\x28\xb5\x30\xa6\x6a\x28\xda\xb4\ +\x58\x1b\x8d\xa4\xea\x09\xea\x04\xc7\x1e\x94\x43\xea\xc2\x68\x13\ +\xc3\x04\x74\xd7\xc1\xb7\xb1\x30\xaa\xab\x7c\x11\xc0\xb4\x9b\x6d\ +\xb0\x42\xa7\x8d\x02\x27\xaa\xf9\x33\xc9\xe4\xed\x00\x4d\xd4\xb6\ +\x33\xad\x29\xce\xed\xa8\xd2\xe6\x04\x28\x47\x2e\x79\xa6\x06\x29\ +\x3c\xd0\xe8\x44\xfb\x27\x4f\x7d\x94\x9a\x14\x61\xee\xa7\x4a\xc5\ +\xe3\xc2\xf5\x6a\x1e\x1f\xc6\xb6\x2f\xc8\x6c\xdb\x14\xa7\x2e\xe6\ +\xf1\xfa\xd1\x4b\x98\x99\xaf\x28\x2e\x4c\xf0\x93\x49\x13\xac\x1b\ +\x1d\xc2\xfd\x9f\xfa\x30\xde\x7f\xd7\x2d\xc8\xb6\x65\xa2\x54\xc1\ +\x2e\x00\xff\x12\xc0\x5f\x02\xb8\x2a\xea\x2e\x2e\xb6\xac\x18\x46\ +\x35\xa0\x98\x9e\x40\xe0\x6c\xaf\x3d\x31\x5b\x12\x09\x06\x9f\xce\ +\x50\x2d\xe4\xe3\x34\xac\x49\x8e\x96\x4a\x10\xb7\x8e\x77\x43\xb9\ +\xc2\x88\xc4\xaa\x54\x2c\x8b\x89\x13\x1a\x22\x4e\x67\x60\x23\x08\ +\x9f\x42\xd1\x39\xef\x44\x63\xe0\xae\x47\x58\xb2\x24\x45\xea\x5f\ +\x10\x35\x33\x61\x19\x97\x00\x38\x9a\xa9\x0c\xe2\x77\x44\x26\x2a\ +\xee\x6b\xcf\x12\x28\x69\xb5\x06\xc2\xa8\x8b\x41\xf9\xbc\xb6\x28\ +\x74\x90\xb2\x75\xd6\xc7\xa0\xc4\xeb\xc0\x59\x36\x15\x65\xcc\x17\ +\xab\x98\x9a\x2b\xa1\xbb\xb3\x0d\xdd\x1d\x19\x29\x81\xaf\x78\x10\ +\x82\xae\x8e\x2c\xc6\xd6\x8d\x22\x9b\x6d\xc3\x85\x0b\x13\x28\x47\ +\xef\x76\x73\x13\x80\xdb\xe1\x4c\x0c\x3d\xbf\x5c\x98\xd5\x8a\x61\ +\x54\x2a\x61\xbe\x45\xd2\x17\x8b\x4b\xa7\xf3\xcf\x53\xb0\x80\x20\ +\x2e\xa0\x52\x2a\xb2\xa0\x1f\xd5\x33\xd1\x9b\x78\x83\xac\x17\x24\ +\xda\x94\xd9\xd7\x88\x0a\x2f\xa8\xef\xf3\x26\x96\xcc\x3a\xee\x89\ +\xed\xf6\x3b\x12\x03\x94\xa2\x8c\xe5\x2c\x96\x78\x64\x29\xa2\x10\ +\x76\x0a\x83\xae\x4a\x48\xfd\xd5\x74\x86\x8a\x60\xc3\xdf\x2d\xa9\ +\xab\xdc\x4d\x14\xd8\x10\x5c\x90\x64\xf1\x9f\x6d\x8c\x12\x87\x02\ +\xbb\x18\x61\x23\xa8\xfa\x99\x11\x43\xd9\xe7\x87\x7b\x9e\x35\xcf\ +\xb4\x97\x76\x66\xae\x84\xd7\x0e\x5f\xc4\xe9\x8b\x73\xa0\xb6\xba\ +\x7b\x80\xf3\xb1\xeb\xcd\x75\xe2\x03\xef\xbd\x1d\xf7\x7f\xf2\x43\ +\x18\x5e\x15\xe9\x76\x43\xe0\xd8\xac\xbe\x0f\xe0\x3e\x2c\x13\xb7\ +\x9b\x15\xc1\xa8\x6e\xbb\x25\x6c\xc2\x67\xd1\xb7\x51\xc9\xac\x45\ +\x2f\x71\x6c\x59\x72\xbc\xce\x08\xcf\x8c\x44\xb1\x6c\x88\x6b\x0f\ +\xe1\xdb\xc7\xda\xb1\xc4\x76\x0b\xf5\x10\xbe\x60\x08\xc5\xf1\x61\ +\x1a\xda\x18\x3e\x9f\x53\x6f\xab\x0b\x93\x48\x6d\x4f\x55\x4b\xd8\ +\x46\xa5\x1a\xd6\xc1\xe3\x45\x70\xb1\x28\x0b\x94\x22\x00\x72\x2a\ +\xb3\xca\x48\xa9\xe8\x2d\xf3\x01\x91\x8d\xdc\x94\x07\x3f\xc2\xe6\ +\x51\xb0\x3b\xae\xab\x6a\x3b\x54\x10\xc3\xd3\x27\x35\x13\x73\x62\ +\x08\x01\xaa\x35\x1b\xe3\xb3\x45\x10\x00\x7d\xb9\x2c\x52\x29\xf5\ +\x9d\x23\xc4\x31\xb2\x0f\x0f\xaf\xc2\xc8\xf0\x20\x26\x27\xa7\x31\ +\x93\x9f\x8f\x72\xbb\x19\x81\x03\x58\xd3\x00\x0e\x2c\xb5\xdb\xcd\ +\x8a\x00\x2a\x4f\xf5\x53\x5d\xd6\xc9\xd9\x22\x26\x67\xf9\x65\x5e\ +\xf4\x4b\xa0\xc8\x12\xb9\x74\x4b\x1c\xd0\x62\x8e\x7d\x63\x38\x11\ +\x81\x86\x69\xa1\x46\xb5\x13\x31\x46\x0b\xc0\x44\x63\x14\x87\x01\ +\xe4\xf8\xed\x90\x55\x2c\x4d\x52\x50\xd6\xfc\xc3\xfc\x11\x4d\x38\ +\x2f\xdc\xab\x18\x59\x17\x7b\x40\xc3\x52\x53\xdd\x82\x89\x7a\x1b\ +\x96\x00\x3b\xca\xe3\xa0\x48\xb1\xdd\x44\x62\x65\xbc\x4a\xca\x8e\ +\x08\xf2\x7d\xe7\xc3\xa4\x18\x03\x80\x72\x5b\xc9\x84\x59\xb6\x33\ +\x22\x58\xa9\xda\xe8\xef\xe9\x40\x5b\x46\x56\x92\xbc\xf4\x99\x74\ +\x0a\x03\x03\x7d\x58\x3b\x3a\x8c\xb9\xf9\x79\x4c\x4e\xe5\x23\xee\ +\x06\x7a\xe1\x80\x55\x0a\xc0\xde\xdc\xd8\xe6\xf2\x52\x81\xd5\x8a\ +\x02\x2a\x9f\x65\x33\xa9\x26\x67\x9d\xed\xb2\x74\x1f\xc7\x46\x58\ +\x96\x94\x5e\x03\x5a\x84\x47\x49\x88\x7e\x7a\xec\xfe\x7a\x84\xff\ +\x4f\x00\x28\xa2\x68\xa7\xa0\x8a\x08\x75\x28\xd3\x33\x94\x4a\xab\ +\x5c\x85\xc6\x0b\xc9\x98\x3a\xa2\xa7\xe6\xe8\x0b\x93\x76\xac\x11\ +\x2a\xd7\x13\xa9\xc0\xf8\x45\xe5\x62\x79\xa6\x44\x04\xc0\xe1\x5e\ +\x7e\x2a\xa1\x80\x4f\x88\x98\x1b\xc1\x32\x34\xdd\xa8\x20\x7f\xca\ +\x77\x24\x36\x40\x29\x9a\x26\xe7\xa1\x52\x98\xcf\xfa\x6c\x60\x7a\ +\xae\x8c\xf9\x52\x15\xfd\xb9\xac\xbf\xa5\xbc\xaa\xce\x54\x0a\xe8\ +\xe9\xe9\xc6\xd8\xba\x35\xa8\x55\xca\xb8\x38\x3e\x0d\xcb\x0a\x75\ +\xbb\xe9\x00\xf0\x7e\x38\x8e\xcd\x7b\x72\x63\x9b\xe7\x97\x02\xac\ +\x56\x16\x50\x29\x86\xa4\x26\xf2\x45\xdf\x98\x0e\x70\x1f\x36\x4e\ +\xe2\xb0\x2c\xc0\x1c\xb4\x08\x0b\x24\x02\x5b\x52\xa9\x70\x22\xf3\ +\xe2\x1a\x2c\xb1\x2f\x05\x70\xb1\xea\x25\xd7\x8e\x90\x1e\x91\x90\ +\xbe\x9a\x32\x30\x36\x7d\x5c\xdd\x10\xb2\xb1\x9b\x2f\x4c\xa1\x92\ +\xa9\xf1\x41\x28\x94\x86\x06\xc9\x4f\x8b\x44\xaf\x14\x40\xc4\xe8\ +\x92\xc2\xbd\x51\x5c\x36\xbf\x14\x25\xca\x4a\xcc\x4a\x0d\x50\x62\ +\x5b\xa3\x00\xca\x0f\xf5\xf3\x3a\x07\xf9\x42\x05\x33\xf3\x65\xf4\ +\x74\x65\xd1\xc5\xec\x76\x23\xd6\x99\x22\x04\x5d\x9d\x1d\x18\x5b\ +\x37\x8a\x4c\x8a\xe0\xc2\xa5\x49\x54\xab\xa1\xbb\xdd\x64\xe0\xbc\ +\xa3\xd7\xc3\x71\x68\x9e\x58\x6c\x23\xfb\x0a\x03\x2a\x59\x26\x67\ +\x1d\xa7\x64\xa2\x7b\x90\x1a\x64\x59\x00\x42\x27\x5c\x7a\xc7\x7e\ +\x12\x46\x1d\x93\x56\xe9\x64\x99\x14\x91\xc3\xd8\x70\xa6\x95\x21\ +\x2a\x21\x7f\x22\xab\x81\x44\x45\x5c\x18\x7c\x90\x75\xb5\x3a\x30\ +\x48\x2c\x94\x0b\xa5\xda\xa4\xd4\x08\x8c\x58\xab\x8f\xcc\xa6\xc2\ +\xec\x4e\x1e\x73\x63\xea\x60\x75\x34\x0e\x3c\xf8\x8b\xc4\xaa\x6e\ +\xbe\x5b\x11\x05\x6c\x4a\x51\xb3\x6c\x54\x2d\x1b\x55\x8b\xa2\x56\ +\x73\x8e\xfd\xb0\x9a\x0d\xcb\x72\x56\x41\xb0\xd9\xc1\x16\x78\x7f\ +\x04\x84\x1d\x69\x14\x40\x2a\x4a\xcd\xe3\x9a\xad\x18\x65\x24\x00\ +\x16\x4a\x35\x4c\xce\x16\xd1\x99\x75\xb6\x94\xd7\x5d\x61\x02\x20\ +\xdb\xde\x8e\x35\x6b\x56\xa3\xa7\xbb\x03\x17\x2e\x4e\xa0\x58\xaa\ +\x44\x8d\x08\x6e\x82\xb3\x08\xdf\x21\x00\xa7\x16\x13\xac\x32\x8d\ +\x17\xb1\x48\x42\xf5\x11\xce\x8a\x96\x3c\x00\xf8\x43\xb4\xf2\x67\ +\xd5\xbf\xc1\x84\x1d\xf5\x09\x01\x2d\x76\x94\x84\x10\x45\x42\xd7\ +\x6c\x41\xfc\xd2\x1d\x90\xa1\xfe\x6b\xc4\xbe\x08\xd4\xb7\x93\x10\ +\x78\xf9\xfc\xd6\xfa\xe1\x7e\x58\x08\x02\x53\x45\xb4\xd8\x11\x2a\ +\x66\x13\x6d\x2c\x62\xf3\x42\x45\xa4\xa3\xc2\x38\x3d\x55\xe7\x50\ +\xde\x3a\xde\x02\xae\x88\x17\xec\x42\x80\x73\x33\xb5\xc8\xe7\xde\ +\x57\x91\xa1\x70\xf7\x9f\x79\xf1\x7d\x30\x72\x46\x84\x6b\x2e\xf0\ +\x58\x96\x8d\x9a\x6d\xa3\x5a\xa3\xa8\xd6\x6c\xd4\x2c\xcb\x01\x1e\ +\xef\xcf\x9f\xa7\xc7\x02\x0c\xaf\xbe\x11\xe2\x3d\x01\x81\xfd\x8e\ +\x10\x82\x4c\x2a\x85\x4c\x9a\x20\x9d\x4e\x21\x93\x22\x48\xa5\x53\ +\x48\xa7\x08\xd2\x29\x82\x14\x21\x0c\x48\xe8\xd5\x3c\x91\x45\x71\ +\x97\xcc\xc5\xfe\xb9\x42\x15\xaf\x1d\xb9\x84\x1b\x2a\x35\x5c\x39\ +\xda\xcb\x1b\xd9\x99\xeb\x43\x08\xd0\xdd\x95\xc5\x7b\xee\xb8\x09\ +\xb9\x5c\x37\x9e\xde\xbe\x1b\xe7\x2e\x4c\x46\x19\xd9\xef\x86\xe3\ +\x76\xf3\x5b\x00\x1e\x1c\xdd\xf2\x80\x75\x61\xf7\x77\xd0\x6a\x59\ +\x31\x40\x25\xbf\x70\x4c\x38\x85\x8f\x48\x54\x03\x58\x00\x03\x5a\ +\x02\x60\x39\x71\xe6\xa0\x45\x88\xe3\x07\x47\x98\x3a\x89\xf8\xde\ +\x11\x84\x34\x9a\x06\x0f\x43\x30\xe9\x85\x3b\xf7\x6c\x26\x6c\x9b\ +\xfd\x6e\x12\xf9\xc1\x63\xc1\x4f\x7f\xc1\xf4\x7a\x6f\xe4\xa4\x0a\ +\xd1\x40\x15\x42\x83\x8c\xcc\x58\x2c\x3d\x14\x55\x1d\x45\x01\xd4\ +\xbf\x31\x92\xf2\xc4\x37\xd1\x4f\x22\xb3\x0d\x9b\x3a\x93\x26\xab\ +\x35\x1b\x95\x9a\x8d\x4a\xcd\x42\xb9\x6a\xa1\x52\xb5\x1c\x36\xe4\ +\x03\x92\xad\x1c\xf5\x13\xfd\x02\x95\xec\xc6\x6f\xbe\xcd\x4d\x3b\ +\x10\xa9\x91\x07\x5e\x29\x42\x90\x4a\x11\x64\xd2\x29\xb4\x67\x52\ +\x68\xcb\xa4\x90\x49\x07\x7f\x84\xf0\xcf\x96\x0e\xa0\xc4\xce\x96\ +\x2a\x35\xbc\x79\x7c\x02\x85\x72\x0d\x1b\xd7\x0f\x20\xeb\xee\xd2\ +\xac\xba\x66\x1d\xd9\x36\xdc\x70\xfd\xd5\xe8\xee\xea\xc4\xd3\xdb\ +\x76\xe3\xe8\x89\xb3\x51\x77\xef\x5a\x00\xff\x1e\xc0\x5a\x00\x7f\ +\x33\xba\xe5\x81\x62\xab\xc1\x6a\xc5\xaa\x7e\x5e\xc2\x09\xc5\xa8\ +\x9f\x98\x4a\xb7\x57\x27\x7f\xc0\xc6\xc9\x2f\x34\x6f\xae\x60\xcb\ +\x8d\x32\x9c\xab\x5d\x68\xb4\x69\xc4\x3a\xa4\x36\x46\xfb\x03\x72\ +\xda\x8f\xaa\xdf\x3a\xf0\x62\x42\x54\x4c\xc8\x54\x2d\x34\x35\x63\ +\x51\x63\xb0\xa3\xfa\x42\x59\x77\x1a\xf1\xfa\xb9\xc0\x54\xae\xda\ +\x98\x2f\x56\x31\xb3\x50\xc1\x64\xbe\x88\xe9\xb9\x32\x66\x17\x2a\ +\x98\x2f\x54\x51\xac\x58\xa8\xd6\x2c\x58\x16\x33\xd7\x8e\x38\xa3\ +\xa1\xbe\xad\xd1\x3d\xe7\xc6\x00\x58\xb5\xda\x4f\x03\x3f\x8d\x77\ +\x9f\x02\x15\x5f\x6e\xbc\xa7\x4e\x5a\x2e\x78\x96\x2a\x16\x0a\xa5\ +\x1a\x16\x4a\x35\x2c\x94\xaa\x98\x2f\x56\x51\xac\xd4\x50\xa9\x3a\ +\x20\xea\x56\xcb\x95\xa5\xdb\xf9\xc6\x01\x66\x8a\xa9\x7c\x11\xc5\ +\x92\xe5\x8c\x08\xb6\xe9\xa7\x4d\xa6\x52\x29\xf4\xf6\xe6\x30\xb6\ +\x76\x35\x8a\xc5\x12\xc6\x27\x66\x60\xdb\x14\x21\xe4\xaa\x1b\xc0\ +\x87\xdd\xdf\xd7\x72\x63\x9b\x8b\xad\x54\x03\x57\x16\x50\x51\x39\ +\xc5\xe4\xac\x6b\x4c\x67\x44\xbb\x38\x5e\x18\x60\x49\x27\x5e\x90\ +\xc2\xc6\xc4\x1a\xbd\x19\x55\x90\x7d\xb8\xfd\x1f\x09\x84\x84\x99\ +\xeb\x42\x79\x41\x59\x5c\xcb\xd5\x64\x48\xb9\x7c\xb1\x1a\x68\xe5\ +\x5e\x11\x80\x44\xc3\x89\x64\x79\x52\x6d\xf1\x1e\x92\xd7\x4c\x68\ +\x68\x46\x7f\xb4\x50\xf9\x52\x12\x30\x57\x1e\x96\x4d\x51\xa9\xd8\ +\x98\x2f\xd5\x30\xbb\x50\x71\x56\x80\x9d\x2b\x61\x76\xa1\x82\x62\ +\xa5\x86\x5a\xcd\xb1\x1f\x79\xe0\xe7\xe7\x16\x07\x2e\x3c\xb0\xe1\ +\xee\x89\x68\x0f\x14\xee\x1d\x67\x9f\x64\xee\x5e\x08\x58\xe9\x84\ +\x07\xb0\x1a\x0a\xa5\x2a\x16\x4a\x35\x14\x4a\x01\x70\x39\xac\x9e\ +\x04\x20\x49\x15\x6c\x93\x02\x33\x0b\x0e\x30\xf7\x76\x67\xa5\x2d\ +\xe5\xd9\xb4\x29\x42\xd0\xd5\xd5\x89\xf5\xeb\x46\x01\xd8\xb8\x78\ +\x69\x0a\xb5\x5a\xe8\x6e\x37\xed\x70\x54\xc1\x2b\xe0\x8c\x08\xce\ +\xb6\xca\x6e\xb5\xb2\x80\x4a\x14\xe2\x30\xaa\x89\x59\x61\x03\x52\ +\x2f\xba\x5e\x96\x25\x9d\x78\x5f\x52\x1e\x94\xf8\x72\x88\xc4\xaa\ +\x42\x1f\x72\xc5\x4a\x9f\x22\xc0\x28\x5f\x06\x37\x6f\x98\x13\x33\ +\xd7\x05\x8e\x3a\x06\xf1\x91\x4b\x28\xab\x6e\x46\x0c\x09\x53\xff\ +\x64\x26\xc5\xb4\x8d\x86\xe4\xe5\xb6\x7c\xf7\x58\x9f\xf3\x32\xcf\ +\x17\x1d\x60\x9a\xca\x97\x30\x3d\x5f\x42\x7e\xa1\x8c\x42\xb9\x86\ +\xaa\x65\xbb\xc0\x04\x7e\xfc\xc0\x05\x37\x7e\xfa\x85\x02\xac\x48\ +\x93\xc0\xca\x0f\xab\xff\xaa\x7a\xc6\xfc\x72\xd5\x42\xa1\x54\x45\ +\xa1\x54\x45\xb1\x5c\x43\xb5\x66\x39\xec\xc7\xef\x4f\x60\x46\xf0\ +\xf8\xe6\x7c\xb1\x8a\xa9\x7c\x09\xdd\x1d\x6d\xc8\x75\xb6\xfb\x65\ +\x8a\x13\x6c\x53\x04\xe8\xe8\xc8\x62\xdd\x9a\x51\x74\x64\xdb\x70\ +\xe1\xe2\x64\x94\xdb\x4d\x1a\xc0\x2d\x00\x6e\x05\xf0\x26\x80\x0b\ +\xad\x00\xab\x15\x02\x54\x1b\x31\xd0\xd7\xad\xcc\xef\x01\x95\x34\ +\x7a\x26\xa4\x6b\x14\xb4\x38\x60\x62\xbf\xb6\x8a\x87\x97\x7d\xe0\ +\xb5\xf1\x42\x25\x44\x78\x21\x58\x96\xc0\x03\x95\xae\xcd\x72\xb8\ +\x8a\x79\x49\xb9\x0c\x00\x2b\xae\x18\x4d\xea\x0c\x6b\x10\xc3\xd4\ +\x54\x98\x66\x53\x8a\x4a\xcd\xc6\x5c\xb1\x8a\xe9\xb9\x32\x26\xf3\ +\x25\xcc\x16\x9c\xe5\x7b\x59\x60\x0a\xae\xb7\x0b\x10\xe2\x28\xad\ +\x70\x1f\xfd\x33\xa2\x07\x9f\xba\xc1\x4a\xc5\xc2\x1b\x14\x4a\x1d\ +\x06\x59\xae\x5a\x28\x96\x6b\x28\x94\x6b\x28\x55\x2c\x58\xb6\xcd\ +\xb0\xad\xe0\x9a\x17\xcb\x16\xc6\x67\x8b\x68\x6f\x4b\xa1\xb7\x3b\ +\xeb\x34\x4e\x65\xcf\x23\x40\x5b\x5b\x06\xa3\xab\x87\x31\xd0\x9f\ +\xc3\xa5\x4b\x93\x58\x28\x94\xc2\xda\x4d\x00\x5c\x0d\x67\x99\xe3\ +\x77\x00\x1c\x6f\x36\x58\xad\x18\xa0\xea\x67\x18\x15\x9b\xc8\x07\ +\x2a\x29\x92\x48\x69\x81\x70\xc0\xd2\xc5\xfb\xeb\x9c\x2b\xbf\xbc\ +\xa2\x13\xb2\x02\x70\x88\xa2\x2c\x26\x8d\x12\x90\x8c\x19\x17\x53\ +\x17\x91\x7b\x1d\x17\xa0\xd5\x42\xb8\x3f\x76\x36\xbb\x7a\xd3\x51\ +\xf9\x8f\xaa\x8a\x53\x88\xe8\x87\xe6\x33\x27\x9b\xa2\x52\xb5\x30\ +\x57\xa8\x60\x6a\xae\x8c\xa9\xb9\x12\xf2\x0b\x15\xf7\xc5\x64\xed\ +\x37\x41\x4e\x99\x31\xc9\x80\x25\x81\x95\xf0\xb1\x09\xf0\x8c\x59\ +\x2c\xc6\x10\xac\x84\xab\x2d\x80\x95\xe9\xb5\x37\x17\x8f\x71\x95\ +\x2a\x16\x8a\x95\x1a\x8a\x95\x1a\xaa\x35\x17\xb4\x52\x8e\xd1\xbe\ +\x6a\xd9\x18\x9f\x29\x82\x52\x60\x20\xd7\xc1\x6d\x29\x0f\xf0\x63\ +\x3b\x99\x74\x1a\x43\xab\x06\xb1\x7a\x78\x00\x53\xd3\xb3\x98\xcd\ +\x2f\x44\x35\x61\x35\x9c\x15\x43\xa7\x00\xbc\x95\x1b\xdb\x6c\x37\ +\x0b\xac\x56\x06\x50\xdd\xbc\x11\xfd\xbd\xde\x84\x4f\xfe\x01\x18\ +\x9f\x2d\x3a\x9b\x37\x8a\x24\x45\x3e\x30\x04\xad\x20\x65\xf0\x4c\ +\xb3\x2f\xb6\x38\xa1\x93\x79\x00\x35\x0f\x70\x30\xc7\x8a\xc9\x2f\ +\xd4\x4f\x84\x38\xf6\x40\x3d\x17\x4a\x06\x32\x81\xaf\xf1\xbd\x11\ +\x56\xc5\x94\xb2\x71\x21\xe2\x9f\xea\xea\x78\x62\x36\x55\x9d\x18\ +\x24\xa7\xac\xd1\xdc\x65\x4e\xe5\xaa\x8d\x7c\xa1\x8a\xc9\xb9\x12\ +\xa6\xe6\xca\x98\x2b\x54\x51\xae\x3a\xaa\x0e\x7b\x8f\x44\x3f\x4b\ +\x25\x60\x49\xd7\x83\x61\x57\x5e\x3a\xa6\xb1\xaa\x81\x11\xf6\x9a\ +\x45\x81\x15\x6f\xbf\xe4\x0e\x00\xa1\x4d\xcd\x16\x8f\x6d\x55\xaa\ +\x0e\x68\x95\x3c\xd0\x82\xf3\x31\x98\xca\x97\x50\xae\x5a\x18\xe8\ +\xc9\xfa\x6e\x37\xe2\xe0\x2b\x01\x90\x4e\xa7\xd0\xd7\xdf\x8b\xb1\ +\x35\x23\x98\x9f\x5f\xc0\xc4\xd4\xac\xca\x54\xcc\x4a\x1f\x80\x8f\ +\xb8\xc7\x7b\x73\x63\x9b\x2b\xcd\x00\xab\x95\x03\x54\x92\x8d\xca\ +\x49\x3a\x31\xc3\xaa\x7e\x62\xac\x78\x12\x0f\xb4\x88\xea\xcb\xab\ +\x79\x88\x45\xd6\xa5\x65\x52\xdc\x0b\xc4\x37\x44\xb6\x6d\xe9\x58\ +\x95\x82\x81\x89\x2f\x15\x53\x46\xa8\xaa\x41\x94\x87\x4d\x97\xa8\ +\xc9\xe8\x5e\xff\x29\x75\xf6\xb8\x73\x98\x93\x0b\x4e\xc5\x0a\x2a\ +\x55\x1b\xb6\xb7\x52\x02\x6b\x40\xe6\xbb\xca\x15\xce\xcf\xb7\xd5\ +\xb0\x2b\x36\xaf\xc8\xae\x20\xdf\xe7\x66\x80\x95\xee\x19\x69\xa5\ +\xd8\xb6\xa3\x2e\x97\x2a\x8e\x7a\x58\xa9\xda\x98\x9e\x2b\x61\xa1\ +\x54\xc5\x40\xae\x03\xd9\x2c\x03\x05\xc2\xc7\x24\x95\x22\xe8\xce\ +\x75\x63\xfd\xba\x51\x58\xb5\x2a\x2e\x8d\x4f\x99\xba\xdd\x0c\xc1\ +\x31\xb2\x2f\x34\x0a\x56\x2b\x0b\xa8\x14\x93\x37\x27\x66\x8b\x18\ +\x9f\x09\x1f\xf5\xab\x1b\xb4\x38\xba\x2f\xa8\x7f\x1a\x67\x64\xff\ +\xe1\xd5\x01\x8e\xee\xe1\xd6\x00\x1b\x5f\x84\x08\x9c\x5e\x31\x32\ +\x42\x11\x39\x73\x38\x10\x91\x88\x78\x43\x15\x4f\xf7\xc7\xfd\x13\ +\xd6\x5e\xb1\x29\x50\xb5\x6c\xcc\x15\x5d\xb5\x2e\x5f\xc2\x5c\xb1\ +\xea\x82\x13\xfc\x6b\x23\x31\x4b\x0f\xb0\x04\xc0\x61\x01\x2b\x60\ +\x4c\x08\xda\x21\x5e\xe7\x30\x55\x10\xc1\xfd\xe4\xef\x37\x09\xbf\ +\x9f\x1a\xb0\x12\x6e\x49\xd4\x5d\x69\x89\xd8\xcc\x68\xe2\xf8\x4c\ +\x11\xe3\x33\x05\xf4\x76\x67\xd1\xc3\x18\xd9\x3d\x61\x47\x04\x3b\ +\x3a\xb2\x58\xb7\x76\x14\x6d\x6d\x29\x5c\xb8\x34\x89\x4a\xb8\xdb\ +\x4d\x1b\x80\x3b\x01\x6c\x84\xe3\x76\x33\xd9\x88\xdd\x6a\xc5\x00\ +\x55\x9f\xcb\xa8\xc4\x04\xe3\x1a\x63\x3a\xa0\x61\x49\xd2\x01\x7f\ +\xc2\xaa\x02\x60\x8e\xb9\x07\x57\x63\xb3\xe2\x1e\x52\x0e\x84\xfc\ +\x60\x1e\x54\x84\x34\xa6\xee\x33\xa2\x1a\x21\xbd\xbc\x11\x9d\xe6\ +\x4e\x15\xec\x86\x5f\x51\x41\x43\x7f\x62\x09\x3f\x4d\xd1\xeb\x67\ +\xcd\xb2\x31\x5f\xae\x61\xda\x05\xa7\xbc\xa7\xd6\x51\x41\xad\xe3\ +\x2e\x98\x5a\x15\x16\x19\x96\x52\x6d\xd7\xb1\x5d\xa6\x51\xe1\x60\ +\xa5\x4f\xa3\x03\x2b\xf1\x8e\x36\x7b\x24\xb0\x51\xb1\x29\xc5\xcc\ +\x7c\x19\x67\xc6\xe7\x91\x6d\x4b\xa3\xb7\xdb\x5d\x2e\x46\xe5\x36\ +\x46\x80\xf6\xb6\x36\xac\x1d\x1d\x41\x6f\xae\x13\x17\x2e\x4d\xa2\ +\x58\x2a\x47\xb9\xdd\x5c\x0f\x67\x13\x89\xb7\x01\x9c\xae\x17\xac\ +\x56\x0c\x50\xf5\x6b\x56\xf8\x9c\x98\x29\x62\x7c\xb6\xe8\x5f\xc8\ +\x20\x46\x48\x1b\x07\xb4\x14\x0f\x5e\xf8\x7c\x29\x06\xa8\x22\xd9\ +\x13\xa4\x87\x99\x65\x5e\xe2\xcb\xc6\x81\xa8\x08\x64\xe2\x8b\x20\ +\x19\x70\xd9\x8c\x7a\x56\xe5\xcd\x23\x62\xac\x34\xf1\x45\xc2\x33\ +\x9e\xfe\x7a\x51\x96\x45\x51\x28\xd7\x30\x33\x5f\xc1\xe4\x5c\x19\ +\xb3\x0b\x65\x1e\x9c\x54\x6d\x90\xd8\x14\x03\x58\xc2\x05\x23\xda\ +\x6b\xa8\x60\x57\xd2\xdc\xa9\x28\xb0\x0a\x4f\x13\x65\x9f\x94\xc0\ +\x8a\x63\x5d\xf5\x5d\xf6\x66\x08\x21\x04\xa5\x8a\x85\x73\x93\xf3\ +\xa0\x00\x7a\xbb\xdb\x99\x38\xa6\x6d\x8e\xf7\x17\xd2\xde\xda\x56\ +\x43\xfd\x18\x9f\x9c\x46\x7e\xae\x10\x05\xb6\xeb\x01\x7c\x10\xc0\ +\x59\x00\x87\x73\x63\x9b\x69\x5c\xb0\x5a\xd1\x40\x05\x28\x46\xfd\ +\x20\xde\xf4\xb8\xa0\xa5\x7a\xa0\x21\x3d\x88\xba\x38\x15\x98\x98\ +\x01\x58\xf4\x86\x0f\xfe\xcb\xc5\x37\x81\xeb\x23\x11\xca\x54\xd1\ +\x2e\xe9\xf2\xe8\xe2\x22\x42\xc3\xc5\x29\x98\x82\xc0\xb2\x1d\x70\ +\x72\x26\x60\x3a\x93\x0f\x8b\xe5\x5a\x30\x5a\xa7\x68\x4f\x60\x87\ +\xe2\x1b\xa7\x62\x59\x3a\xc0\x62\x4e\x95\x13\x30\xbd\xbb\xc4\x6a\ +\x66\xec\xf5\x65\x8d\xec\xe1\x60\x15\x71\x5f\xd9\xf6\x73\x57\x94\ +\xff\x7a\x2d\x2d\x58\x01\xd5\x1a\xc5\xc5\xe9\x02\xaa\x35\x1b\x03\ +\xb9\x0e\x10\x42\x50\xb3\x1c\xdb\x20\x61\xae\x83\x33\x22\x98\x42\ +\x7f\x7f\x3f\xd6\x8e\x0e\x21\x9f\x9f\xc3\xd4\x74\xe4\xda\x56\x43\ +\x00\x3e\x02\xa0\x00\x67\x99\xe3\x5a\x1c\xb0\x5a\x11\x40\x75\x5b\ +\x08\x50\x8d\xcf\x16\x31\xee\x8e\xfa\x29\xd9\x42\x0c\xd0\xf2\x1e\ +\x42\xee\xa1\x53\x3c\xc4\x2a\x56\xe5\xbf\x30\x4c\xa1\x51\x6a\x81\ +\x8a\x49\x89\xac\xd0\xd4\x6e\xc5\xd6\x27\x9d\xab\xd2\xa9\x2f\x87\ +\x00\x70\x44\x9d\x28\x4c\xdc\xe4\x96\x4d\x51\xaa\x58\xc8\x2f\x94\ +\xfd\x99\xe1\x05\x17\x9c\xa8\xd7\x78\xe6\xcf\x63\x42\x52\x8d\x1e\ +\x68\x41\x03\x5a\x4c\x7b\x45\x95\x50\x65\xbf\x52\x83\x9b\xde\x3e\ +\xa8\x1b\x3c\xe1\xef\x71\xc4\xfd\xe6\xa6\xac\xc8\x0c\x7b\x29\xed\ +\x55\xdc\xa5\x26\x8e\x2a\x38\x3e\x53\xc0\x7c\xa9\x8a\xa1\xbe\x0e\ +\xb4\xb7\xa5\xdd\x15\x21\x6c\x58\x9c\x4a\xee\x38\x53\xe7\x72\x39\ +\xac\x5f\x37\x82\x72\xb9\x8c\x4b\x13\xd3\xb0\xc3\xb7\x94\xcf\xc1\ +\xd9\xed\xa6\x13\x8e\xdb\x4d\xc9\x14\xac\x56\x0e\x50\xf5\xea\x18\ +\x55\x01\x13\x33\x45\x89\xed\xc4\x05\x2d\x22\x3e\x60\x9a\x49\x7e\ +\xde\xcc\x5f\x29\x4e\xc3\x8c\x58\x1f\x30\x08\xf1\xec\x43\x1e\x9c\ +\x43\xdb\x17\xd5\x03\x2d\xf6\x49\x04\x2b\x3f\x34\x82\x45\x8a\xc0\ +\x44\xb4\x89\x85\x30\x06\x59\x3c\x70\x9a\x75\xe7\x3a\xcd\xb8\xb3\ +\xc3\x6b\x2e\x38\x71\xd8\x24\x67\xd7\x02\x17\x5b\x97\x96\x65\x31\ +\x27\x2a\xc0\x12\xab\x90\x3f\x04\x21\x46\xf6\x18\x60\x25\x3e\x2f\ +\x7c\x98\xd0\x1e\xb6\x1d\x8a\xb6\x2e\xa5\x4c\xbb\x73\xd5\xfa\x73\ +\x1d\xe8\xee\x6c\xf3\x97\xac\xf1\x96\xb1\xf1\x9c\xf3\x53\x29\x82\ +\xce\xae\x4e\x8c\xad\x5d\x8d\x14\xa1\xb8\x10\xed\x76\x93\x05\xf0\ +\x5e\x00\xfd\x00\x76\x98\x4e\x5f\x58\x31\x40\xd5\xd7\xab\x5e\xe1\ +\x93\x65\x54\x80\xfc\x92\x03\x9a\x77\x4c\x7c\xc1\x09\xfb\x2b\x80\ +\x0f\x09\x4a\x56\xdb\x17\xf8\xaf\xa4\xf6\x2b\xab\x7b\xc8\xd9\x34\ +\x4c\x39\x12\xf3\x82\xfc\x20\x2b\x87\xe4\xb9\x9e\x6b\x54\x0a\xaf\ +\x33\x2a\xe3\xbb\x26\xb9\x4a\x2c\x9b\xa2\x5c\xb1\x90\x77\x77\x46\ +\xf1\xd4\xba\x9a\x45\xdd\xb9\x38\xfc\xbf\x00\x71\xc0\xfd\x89\xe0\ +\xe5\x77\x46\x35\x15\x21\x04\xb0\xd8\x0b\xa8\xfc\x60\x48\xd7\x2d\ +\x04\xac\xd8\xfb\xa4\x05\x2b\x3e\x6d\xd8\x07\x8c\x57\xfd\x08\xdf\ +\x0e\xae\xad\x06\x37\x64\x11\x64\xae\x50\xc5\xa5\xe9\x02\x72\x9d\ +\xed\xe8\xeb\xce\xfa\xe1\xd4\x75\xf6\x0e\x66\xc0\x03\x1d\xd9\x2c\ +\xd6\xad\x1d\x41\x77\x67\x16\xe7\x2f\x4d\xa0\x5c\x8e\x74\xbb\xb9\ +\x09\xc0\x49\x38\x73\xad\x22\x0d\xec\x2b\x68\x17\x1a\x7e\x59\x57\ +\x9d\xe7\x7d\xb0\xcd\x7b\xb0\x62\x59\xb0\x70\x19\xa4\x32\xbc\x65\ +\x3c\x82\xa5\x6a\x29\x82\x10\x61\xbd\x25\xc2\xa4\xf3\x51\x13\x10\ +\x27\x9e\xb0\xa3\xef\xdc\xf6\x4c\x90\x8f\x83\x32\xe4\xb5\xb7\x21\ +\xe6\x55\xdc\x78\x71\xe1\x38\x67\x67\x1d\x5e\x81\x52\xaf\x07\x05\ +\x10\x4a\x41\xb8\xad\x78\xa8\x32\x35\x8b\x85\x36\xdc\xa9\x04\xa5\ +\x2a\xc6\xf3\x25\x9c\x9b\x5a\xc0\xb9\xe9\x82\xb3\x39\xa6\x67\x14\ +\xf7\x40\x42\x41\x9b\x82\xd3\x70\xf0\x52\x81\x96\x8a\x65\x89\x80\ +\x15\xaa\x0e\x6a\x55\x41\x11\xac\x34\x1f\x15\x25\x58\xc9\x69\x39\ +\x40\x54\x80\x95\xe2\xd0\x6f\x2b\x1b\xb2\xd4\x42\x88\xc3\xac\x76\ +\xed\x3f\x87\x43\xa7\xa7\xfd\x49\xb6\x9e\x50\xea\x8c\xdc\x96\xdd\ +\x15\x28\xda\xda\xdb\x71\xe7\x1d\x37\xe3\xfe\x4f\x7e\x10\xab\x87\ +\xfa\xa3\xa6\x02\x77\x01\xf8\x1c\x9c\xd5\x17\x22\x65\xc5\xac\x47\ +\x05\xc8\x4b\x2c\x51\xf5\x7b\xc5\xa4\x0f\x16\x04\xf2\x1e\x1f\x16\ +\x44\x38\xa5\x8b\x7a\x3f\xcc\x83\xe6\xae\xc7\x47\xbc\x38\xca\xaa\ +\x56\xc4\x5f\x1f\x8a\x7a\x0f\x9d\x9f\x9e\x79\x0a\x29\x40\xbd\x87\ +\x97\x06\x79\x79\x61\x91\xcd\x3d\x27\x6c\xfa\xa0\x8d\xd2\x62\x79\ +\x14\xa0\xec\x42\x6d\x70\x1b\x25\x94\xaf\x9c\x4d\x1c\xf5\x62\xb8\ +\x6d\xb0\x28\x45\xb5\xea\xb8\x66\x94\x2a\x35\x94\xab\x16\x6a\x16\ +\x65\x46\xea\x74\x25\x78\x9d\x80\x7f\xed\xf9\x10\x37\x15\x37\x1b\ +\xd4\xbb\x04\x54\x8a\xf7\x6d\x5b\x80\x0b\xb0\xec\xe5\xf2\xae\x4f\ +\xb0\x2a\x82\xbf\xe6\x39\x71\xe0\x3c\x58\xc5\x85\xf8\xae\x3a\x84\ +\xb0\x6b\x98\x51\xdf\xf5\x8d\x80\x38\xbb\x35\xbb\x33\xb4\xa9\x93\ +\xd0\x4d\x2f\xc6\x07\xc7\x5e\xa1\x84\x52\x66\x6d\x2c\xb7\x8d\xd4\ +\x7b\xbe\x18\x3b\x9d\xb7\xda\x1d\xa3\x2d\x78\x7e\x7a\x11\xdb\x5a\ +\x2d\x8a\x10\x02\x2c\x94\xaa\x38\x37\x31\x8f\x2b\x47\x7b\x91\x4d\ +\xa9\x95\x30\xcb\xa6\x80\x4d\x91\x4a\xa5\x30\xb6\x6e\x0d\x46\x86\ +\x07\x70\x71\x62\x26\x8a\x1e\x76\xc0\x50\xab\x5b\x51\x40\xc5\x2f\ +\x49\x1b\x3c\xd4\xe2\xfd\x54\x5d\x1b\x1d\x68\x11\x22\xae\xb6\xc9\ +\xe4\xe1\xbe\x8e\xc1\x67\x33\x58\xc0\x4e\x88\x13\xda\x25\x28\x77\ +\x6e\x98\x1b\xef\x52\x66\x6f\x1b\x72\xaf\xcd\x1e\x10\x49\xa0\x8c\ +\x60\xf7\x60\x1f\x96\x54\x6c\x4e\x6c\x51\xc8\x64\x4f\xaa\xd9\xc1\ +\x85\x82\x75\xbf\x70\xc0\xa9\x52\x63\x96\x16\x71\x13\x9a\xd9\x53\ +\x82\x8e\x11\x02\xff\xc5\xe7\xee\xa7\x50\x0c\x61\xa8\x25\x0b\x5a\ +\xf5\x02\x16\x07\x44\x0c\x58\x79\x8b\xdf\xf9\xd7\x9e\xba\x20\xe2\ +\xb7\x33\x0a\xac\x20\xa5\x0d\xf0\x2a\x28\x8b\x50\x12\xb4\xc7\xfb\ +\x70\x79\x75\xbb\xb0\x15\x00\x26\x03\xd0\x24\x7c\xcd\xae\x56\x0b\ +\x85\xb3\x3d\xfc\x35\xeb\xfa\x71\xe7\xc6\x11\x64\xdb\xc2\x31\x85\ +\x10\x82\xa9\xa9\x69\x6c\x7b\xfe\x65\xbc\x7d\xf8\x94\xc9\xf3\x71\ +\x1c\x40\xd1\xa4\x2d\x2b\x06\xa8\x54\xeb\x49\x47\xa5\xd5\x5d\x27\ +\xca\x3c\x4a\x5c\x62\x17\x81\x7c\x20\x70\xd1\xc4\x61\x02\xde\x0b\ +\x41\xdc\x97\xd9\xfb\x36\xc2\xff\x42\x06\x31\x0c\xab\x22\x54\x00\ +\x2c\xa6\x6e\xaf\x44\x56\x05\x11\xd3\x48\x7d\x61\x80\x90\x61\x5f\ +\x32\x63\xe2\xf5\x46\xca\xe4\x27\x8a\x24\xb6\xed\x38\xb4\x56\xaa\ +\x36\x4a\x55\x07\x9c\x58\xd6\xe4\x49\xca\x04\x9b\x54\xe2\xd5\x45\ +\xe4\xc0\x80\x3c\xc9\xc0\xe5\xf5\xd1\x04\xb0\x58\x62\xe6\x83\x03\ +\x02\x80\xf4\xd7\x2c\xa7\x41\x5e\x07\xc8\x78\x76\x65\x0e\x56\xea\ +\xb4\x1e\xcb\x06\x55\x80\x15\xdb\x75\x8a\x00\xbc\xfc\x20\xc2\x00\ +\xaa\x8a\x7f\x2e\x8e\x50\x0a\xb4\xb7\xa5\x70\xd3\x95\x43\xb8\xf9\ +\xea\x55\xc8\xb6\xa5\x43\x41\x93\x10\xe0\xdc\xb9\xf3\xd8\xba\xfd\ +\x25\xbc\x73\xea\xbc\x49\x15\x07\x01\x7c\x07\x40\xd5\x64\x75\xd0\ +\x25\x07\xaa\x54\xa6\x03\x76\xad\x64\x96\x58\xa5\xbf\x50\x6f\xcd\ +\x74\x70\xc8\xc4\x52\x7d\x20\x0c\xb4\x18\x8c\x52\xb0\x25\x0a\x1a\ +\xb8\x7c\xb0\x0f\x17\xdb\x1e\xb6\x5d\x5c\x5e\xe6\x21\xf4\xbf\xda\ +\x72\x3d\x5e\x18\x9b\x07\x0c\xd3\x93\x54\x52\xb6\x97\x92\x16\x29\ +\x30\x3a\x4e\xd5\xf5\xe2\x9c\x25\x77\x6b\x2e\x6b\x2a\x57\x6d\x67\ +\x39\x5e\xcb\x86\x6d\x0b\xb3\xc8\x75\xf7\xc2\xd8\x9e\x42\xb9\x1f\ +\x25\xb3\x13\xd4\x5b\x16\xac\xfd\x4b\xcf\xb2\x2c\x0d\x60\x79\x1f\ +\x17\x2d\xbb\x62\x55\x41\x4e\x53\x23\x4a\xb0\xf2\xef\x8d\x08\x56\ +\xcc\xa5\x8e\x06\x2b\xe6\x56\x51\x96\x75\x45\xa8\x80\xec\xb3\xb9\ +\xc8\x58\x45\x29\xd0\xd5\x91\xc1\x1d\xd7\x8d\x60\xe3\xd8\x00\xd2\ +\x29\x12\xbe\x1a\x2b\xa5\x38\x7a\xec\x04\xb6\x6e\x7f\x09\x17\xc7\ +\xa7\x4d\x98\xd4\x21\x00\xbf\x01\x67\xfd\x2a\x23\x59\x72\xa0\xea\ +\x18\xde\x88\xc2\xb9\x7d\x46\xb3\xdd\x02\x16\x01\x9e\x30\xf8\x80\ +\xc1\xda\x43\xc2\x41\xcb\x67\x2b\xac\x21\x94\x05\x19\x1f\x3c\xd8\ +\x17\x9f\x30\xf5\x32\x46\x52\xd6\x66\x25\x74\xc3\x09\xe3\x0d\x63\ +\xbc\xea\x16\xe4\x0d\x8a\x12\xd4\x45\x9f\x9d\x89\x65\x53\xc5\x1a\ +\xea\x2c\x22\x10\x7f\x27\x15\xdb\xa6\xa8\x5a\xce\x5a\xe1\xd5\x9a\ +\x03\x4c\x1e\x63\xa2\xc2\x75\x90\x49\x8f\xa4\x00\xc7\x10\xc2\xfd\ +\x30\x77\x48\x09\x5e\x32\x68\x09\x2c\x8b\x53\xdd\x35\x80\x25\xaa\ +\x83\xac\xea\x05\x57\xc5\x72\x59\x72\xb8\xdd\x4a\x63\x93\x62\xed\ +\x47\x02\x73\x0a\x46\x44\xa8\xcf\xc0\x38\xb6\xe7\xb7\x29\x42\x05\ +\xf4\x91\x74\x71\x59\x15\xa5\x40\x7f\x4f\x16\x77\x6d\x1a\xc5\x15\ +\xab\x7b\x84\x7b\x26\xdc\x59\x42\x50\xab\xd5\xf0\xe6\xfe\x83\xd8\ +\xbe\x73\x0f\x66\xe7\x16\x4c\x40\xea\x05\x00\xff\xca\xfd\x85\xe9\ +\x5a\xeb\x4b\x0d\x54\xa4\x73\x78\x23\x2d\x9c\xdb\x67\x9c\x81\xd5\ +\x12\x88\x18\x06\xe6\xa1\x0f\x01\x2d\x2f\x8f\x7f\x4c\x19\xd0\xe1\ +\x0c\xcf\x24\x30\x90\xb3\x15\xb1\x5f\x79\xef\xab\xca\x15\x2c\x1b\ +\x9c\x82\x32\x18\xb0\xa3\x0c\x88\x29\x41\x92\xef\x35\x6f\xcc\x87\ +\x74\x4c\x5d\xf6\x60\x51\x0a\xcb\x72\x1c\x4f\xbd\x8d\x0c\x6a\x96\ +\xed\xcf\x7f\x11\x41\x57\x9e\x00\xaf\xb7\x6b\xc9\x77\xd0\xe4\x66\ +\xa9\x92\x07\x2a\xab\x9f\x98\xaa\x40\x8b\x67\x59\x22\x60\x29\x55\ +\x42\x51\x1d\x74\x3f\x4c\x2c\x10\xb1\xaa\x60\x14\x58\x81\xb0\xf5\ +\x51\x2e\x6d\x60\xa7\x62\xd5\x3c\x91\x4d\x05\xc6\x75\x95\x0a\xe8\ +\x0f\xc8\x68\x54\xc0\xc5\x34\xac\x8f\xae\xea\xc6\xdd\xd7\x8f\x62\ +\xa4\xbf\x33\x14\x1e\x09\x21\x28\x97\x4a\x78\xe9\x95\x7d\x78\xf1\ +\xd5\x37\xa3\xb6\xda\x02\x00\x0b\xc0\x43\x00\x7e\x13\xc0\x61\xc0\ +\x1c\xa4\x80\xa5\x03\x2a\xbf\x47\xeb\x3f\xfe\x31\x4c\xee\xfb\xc7\ +\xba\x0a\xa1\x8a\x13\xe5\xa8\x9e\x08\x5a\x4a\x20\x10\x2d\xba\x2e\ +\x63\x61\xd9\x0d\xf1\x9f\x59\xef\xfb\xe7\x26\x0d\x10\x8c\xb3\x59\ +\x11\xc6\x66\xc5\xc4\x39\x35\xb2\xb6\x2e\xf0\xf5\xb3\xba\x27\x43\ +\xfc\xfc\xf7\x96\x06\xfb\xc6\x59\xae\x6d\xc9\xdb\x5b\xae\x66\x39\ +\xe7\xc1\x9e\x74\xec\xb5\x20\xbe\x8a\x24\x3d\x52\x51\xe0\x44\x94\ +\x87\xda\x90\xa0\x1f\x8a\x7b\xc5\x04\xa8\x81\x8b\x07\x2d\xce\xbe\ +\xe6\x52\x68\x51\x25\x14\x01\x8b\x65\x57\xac\x8a\xa7\x52\x05\xa3\ +\xc0\x8a\x53\xed\x18\x55\x4c\x05\x56\x9c\x29\x3d\xcc\xb8\xce\xa8\ +\x80\x9c\x7d\x60\x89\x54\x40\x42\x80\x0d\xa3\x7d\xd8\xbc\x69\x35\ +\xfa\xba\xdb\x23\xec\x51\x04\x73\x73\x73\x78\x6e\xe7\x2b\xd8\xbb\ +\xff\x48\xd4\x04\x4f\xc0\x31\x98\x7f\x17\xc0\x1f\x01\xb8\x58\xcf\ +\x8e\x35\x4b\x01\x54\x6c\x8f\xc8\xa3\x5f\x00\x5d\xf7\x0d\x76\x3c\ +\x5f\x16\xdb\xa6\x28\x96\x6b\xce\x0b\x46\x00\x6f\x89\x55\xc7\x17\ +\xc9\x79\x31\x53\xfe\x8c\x64\xf5\xec\xec\xa0\xf2\xe0\x9b\xc5\xa9\ +\x55\x94\xfa\x54\x9c\x63\x49\xec\xd6\x56\xf2\xb8\x60\x60\x39\x52\ +\xda\xcf\x00\x0d\x2a\x48\xaa\x9f\xaf\x96\x00\x80\x0d\xd8\xee\xcb\ +\x6a\x83\xfa\xb3\x81\x2d\x9b\xa2\x66\xdb\xb0\x2d\xef\xd8\xdb\x63\ +\x8e\xdb\xf8\x4b\x66\x5d\x2c\x7b\x92\xee\x84\x66\xc2\xa7\x94\x3e\ +\xbe\xd2\x17\x9a\x9b\x50\xe5\x87\xc6\x87\xfe\x80\xee\xf2\xcc\xd9\ +\x6b\xb3\x16\xb0\x02\x10\x02\xc0\x4c\x0d\x61\xd8\x95\x38\x0a\x67\ +\x0a\x56\xde\xf5\xe5\xf6\x07\x24\x7e\x1b\xfd\x27\x2b\xca\x5e\xc5\ +\xde\x76\xc1\x5e\xb5\xd8\x2a\x20\x05\x90\x49\x11\x5c\x7f\xc5\x20\ +\x6e\xbb\x76\x18\x9d\xd9\x4c\x24\x48\x8d\x8f\x4f\x60\xeb\xf6\xdd\ +\x38\x72\xec\xb4\x6c\xda\x90\x65\x1a\xc0\xd7\x01\xfc\x25\x80\xb9\ +\x7a\xb7\xd5\x5a\x6c\xa0\x22\xe2\x6f\x9a\x10\xac\x7e\xef\x3f\x0b\ +\x7d\x0d\x6c\xea\x18\x7d\xfd\x87\x87\xf9\x6f\x7a\xae\x84\xf1\x99\ +\x82\xb3\x89\x63\x8a\x20\x45\x52\xee\xaf\xb3\x86\x0e\x71\x37\x77\ +\x4c\x11\x67\x01\xb0\x54\x2a\x05\x42\x68\x00\x6c\xbe\xf9\x87\x80\ +\x53\xfa\x3c\xf5\x40\x7c\xe1\x85\xee\xb0\x54\xdd\x4b\x41\xd9\x97\ +\x86\x39\x0e\x58\x18\x05\xe0\x6d\x68\x09\x7f\x63\x4b\xdb\xa6\xb0\ +\xa8\xd3\x5f\xea\x87\x79\xa9\x85\xa1\x75\xee\x3a\x30\x70\x63\x04\ +\x50\x1a\xf6\x14\xda\x57\x3e\x28\x2e\x6c\xc9\xa0\x24\xce\x36\xe7\ +\xf7\xc9\x0b\x30\x9c\xe1\xa0\x9c\x2d\xca\x2d\x43\x02\x2c\x86\x5d\ +\xb1\xe4\x84\x65\x57\xf5\x82\x15\x33\x1a\xe7\xab\x65\x08\x1f\x09\ +\x54\xda\xab\x34\x2a\x20\x37\x38\xa3\x08\x6a\x36\xab\xa2\x14\xe8\ +\x68\x4f\xe3\xd6\x6b\x86\x71\xc3\x86\x41\xb4\xa5\x53\x91\xe5\x9f\ +\x3c\x79\x1a\x4f\x6f\xdf\x8d\x33\xe7\xc6\x4d\xec\x51\xa7\x00\xfc\ +\x6b\x00\x7f\x0f\xc3\xd1\x3d\x9d\x2c\x16\x50\x11\xc5\x31\xf3\x1b\ +\xef\xea\x53\xe6\x3f\x67\xbe\x8f\x0d\x85\xa9\xc7\x29\x9c\x61\x0d\ +\x9e\x9f\x9e\xb7\xe9\xa3\xf3\xeb\x31\xb4\x80\xa5\x11\x38\xc0\x06\ +\x17\xe0\xd8\x38\xf6\xf1\x51\x33\xb7\x80\x1a\x79\xe0\xe2\xb5\x97\ +\x05\x1b\x9d\xda\x2a\xae\xc2\xc0\xdb\x92\x04\x08\x61\x19\x51\xbd\ +\x00\x15\x06\x4e\xc4\x04\x90\xa2\x52\x50\x39\x15\x61\x63\x20\x03\ +\x97\x12\xb4\x3c\x96\xa5\x00\x2c\x96\xf1\xf8\x6c\x8a\x70\xc6\xf6\ +\x48\xb0\x82\x08\x46\xf5\x81\x15\xd7\x1e\x95\xbd\x2a\x44\x05\x64\ +\x4d\x06\x94\x9d\xa8\xd5\x02\x56\x45\x29\x45\x4f\x57\x3b\xde\xb3\ +\x69\x35\xae\x5e\xd3\xe7\xcf\x27\x54\xde\x61\x42\x60\x5b\x16\xde\ +\x3e\x74\x14\xcf\xee\x78\x05\x93\xd3\x79\x13\x90\xda\x07\xc7\x68\ +\xbe\x15\x00\x6d\x74\x83\xd2\xc5\x00\xaa\x08\x90\x82\x6e\xec\xbd\ +\xe1\xca\x00\xef\x0b\xc4\x18\x90\x29\x05\x25\x14\x96\xad\x59\x25\ +\x41\x62\x2b\x8c\xff\x9f\xe0\x84\xaa\x4c\xc3\xa8\x71\x7e\xd9\x60\ +\x00\x93\x65\x25\x0a\x7f\x40\x33\x07\x58\x26\x0d\x77\xee\x17\xc4\ +\x5f\x0b\x95\x8a\x47\x98\xf4\xc2\xc5\x0b\xb5\x41\xc5\x66\x55\x44\ +\x09\xca\x01\x07\x0d\x0a\x0a\x3e\x40\xcc\x2c\x33\x06\x95\xb4\x80\ +\x65\xc0\xae\xb4\x60\x85\x30\x30\x52\x81\x15\xcb\x6c\x02\x10\x91\ +\x55\x3f\x8d\xbd\x2a\x4c\x05\x64\x28\x93\x8e\x4d\x35\x83\x55\x51\ +\x0a\x0c\xf5\x75\xe1\xee\x1b\x46\xb1\x66\x55\xb8\x07\x0b\x21\x04\ +\xd5\x6a\x05\x7b\x5e\xdf\x8f\x9d\x2f\xee\xc5\x7c\xf8\x6e\x34\xde\ +\x1d\x7c\x06\x0e\x48\xed\x05\xe2\x19\xcd\x75\xd2\x6a\xa0\x12\x41\ +\x2a\x0c\xb4\x5a\xdb\x10\x22\xfc\xba\xff\x71\x2f\xbe\x94\x86\x05\ +\x1d\x01\xd8\xfc\x74\x8a\x34\x6c\x1c\x73\x1c\x06\x52\x2a\xb0\x0b\ +\xa2\xc2\x41\xaa\x19\x00\xa5\x04\x27\x2d\x70\xc5\xbc\xf6\xca\x13\ +\xc2\x00\x93\x73\xc0\xf6\xcf\x8b\x0b\xfa\xc9\xba\xb7\xb8\xf9\x5d\ +\x3d\x3b\x00\x35\x28\xd9\x15\x3b\x77\xca\x49\xe7\xaa\xf9\xbe\x0d\ +\xdb\x1c\xac\x7c\x55\xce\x27\x50\x8c\x0a\x17\x62\xaf\x32\x55\x01\ +\x7d\x20\x52\x4d\x7f\x67\xea\x6f\x44\xd6\x8f\xe4\x70\xd7\xf5\xa3\ +\x18\xec\xed\x88\xb4\x47\x15\x0a\x05\xec\x7a\xf1\x35\xbc\xb2\xf7\ +\x6d\x54\xc2\xf7\xf7\x03\x80\x0a\x80\xff\x0e\xe0\x77\xe1\xa8\x7d\ +\x4d\x01\x29\xa0\xb5\x40\xa5\x03\x29\xa2\x49\xd3\x62\x11\xaa\xe5\ +\x11\xc5\x7f\xf8\x83\x46\x6a\x00\x88\x47\x10\xbe\x28\xae\xaa\x56\ +\x81\x94\x5e\xd5\x13\xd5\xbc\x50\x80\xd2\x81\x53\x50\x65\xe4\xe5\ +\x54\xaa\x8b\x9c\xd0\xe0\x7f\xdd\x54\x05\x1f\x98\x78\x84\xf2\xe2\ +\x24\x96\x25\x02\x16\x09\x6c\x81\xfe\x3b\x2d\xb0\x2b\xb5\x2a\xe8\ +\x5e\x33\x4a\x65\xb0\x82\xde\x66\xa5\x9c\x63\xc5\x61\x0a\x51\xda\ +\xab\x54\x2a\xa0\xd7\x68\xad\x0a\x08\xd6\xaa\xd9\xd8\x74\x05\x8a\ +\xc0\x1d\xe6\x3d\x1b\x47\xfc\xa5\x5b\xb4\xb7\x97\x10\x4c\x4f\x4f\ +\x63\xdb\x8e\x97\x71\xe0\xd0\x3b\xb0\x2c\x1a\x05\x52\xf3\x00\xbe\ +\x0d\x6a\xff\x29\x08\x99\xba\xb0\xfb\xaf\x62\xb5\x2f\x4a\x5a\x05\ +\x54\x24\xe2\x57\x08\xa3\x26\xaf\x46\xfd\x8d\xe1\x98\x92\x0c\x3a\ +\x22\xbb\x92\x3c\xde\x15\x2d\x96\xc1\x89\x30\xc9\xf4\x2f\x7c\xd3\ +\x41\x4a\x61\xb7\x92\x96\x3f\x01\x9f\x89\x6f\x96\x02\xe4\x94\xd7\ +\xaf\x9e\x5b\x24\x33\x41\x4f\x82\x81\x06\xf1\x3a\xba\x20\x12\x0b\ +\xb0\x22\xd8\x15\x61\xd2\x71\x06\x74\x70\xaa\x20\x6b\x1b\x52\x1a\ +\xd8\xc1\xaa\x61\x3c\xcb\x09\xb3\x57\xe9\x54\x40\x42\x35\xdc\x48\ +\xd2\xfb\xd0\x10\x89\x0a\xdc\x61\x56\xe1\xe6\xab\x87\x0c\xdd\x61\ +\x2e\x60\xeb\xf6\xdd\xbe\x3b\x4c\xc4\xc7\xeb\x12\x40\xbf\x6a\xd7\ +\xca\xff\xf1\xbe\x1f\x7c\xaf\xf8\xb7\x1b\x9b\xff\x3a\xb7\x02\xa8\ +\x62\x82\xd4\x62\xb0\x2a\xa2\x3e\xe5\x7e\x89\x36\xab\xa4\xf2\x71\ +\x11\x50\xa8\x7c\xe0\xde\x3c\xd1\xc6\xc5\xd6\x59\x0f\x48\xe9\x55\ +\x3d\xfd\x9a\x4b\xb1\x00\x4a\x04\xbb\x88\x4b\xab\x4b\xa9\x63\x52\ +\x62\x7f\x01\x70\x0c\x81\xed\x73\x00\x12\x54\x01\x58\x2c\x08\x41\ +\xcd\xae\x58\xb0\x02\x22\xed\x56\x32\x98\x31\x60\xc5\xda\x90\x24\ +\x15\x31\x40\x1e\x25\xce\x08\x2a\x20\xd8\x7a\x5b\xc8\xaa\x44\x77\ +\x98\x54\x84\x3b\x0c\x40\x71\xf4\xe8\x09\x3c\x6d\xee\x0e\x73\x04\ +\xd4\xfe\xed\x4a\xfe\xfc\x8f\xa6\xde\x7e\xd8\xfa\xdb\x8d\xdf\xf7\ +\xbf\x15\x66\x0f\x90\x99\x34\x1b\xa8\xe2\x82\x54\xcb\xc5\x88\x4d\ +\x71\x20\xa0\x56\xf9\x04\x14\x51\xb2\x2a\xd9\xb9\x98\x05\x22\xb1\ +\x4d\xe6\x20\xa5\xb3\x47\x89\xaa\x26\xcf\xaa\xf8\x36\x73\xfd\x50\ +\x81\x4b\x04\x38\x85\x3f\xaf\xaa\x48\xde\xe6\xc4\xc7\x40\x7a\x8c\ +\xd9\xb9\x6a\x2a\x1f\x4d\x7f\x95\x09\x0e\xb0\xa2\xd9\x55\xa0\x0a\ +\xea\xed\x56\x1c\x58\x79\xa0\xa1\x01\xab\x30\xe3\xba\xd2\x5e\xa5\ +\x51\x01\x63\xb3\xa9\x3a\x58\x95\xca\x1d\x46\x7f\x7f\x09\xac\x5a\ +\x0d\x6f\xc4\x73\x87\x79\x89\x5a\xd5\xdf\x98\x7a\xeb\x47\x3b\xab\ +\x0b\x93\xec\xdd\x6e\x02\x0f\xe4\xa5\x99\x40\x55\x0f\x48\x11\xf7\ +\x8a\xb6\x10\xb4\x4c\xd8\x14\x00\x12\x5e\x04\xcf\x66\x14\x2a\x1f\ +\x0b\x52\x02\x10\xb1\xe9\x44\xc0\x64\x0b\xab\x0f\xa4\x1a\x03\x28\ +\x9d\x5a\x27\x3f\xa3\xe1\xb7\x48\x8c\xa5\x21\xe9\x89\x4f\x81\xbc\ +\xb4\x60\x1e\xe9\xe0\xba\xa9\x58\x96\x6f\x1f\xf2\xce\x01\x85\x8a\ +\xc7\xd8\x8a\xc0\x02\x11\x24\x00\xe2\xc1\x0a\xfe\x2b\xc6\x82\x15\ +\xc7\xe0\x20\xb2\x19\xb6\x52\x16\xb4\x22\x54\xc0\x10\xc3\xba\xcf\ +\x9e\x1a\x60\x55\x14\xc0\xe8\xaa\x2e\xdc\x7d\xfd\x1a\x0c\xf7\x77\ +\x86\xdf\x3b\x42\x50\x2e\x97\xf0\xd2\xcb\x71\xdc\x61\xe8\xa3\x76\ +\xb5\xfc\x5b\x97\xf6\x7c\xff\x20\x9c\x05\x38\x29\x53\x75\x93\x94\ +\xd6\x40\x9a\x05\x54\xf5\x83\x54\x0b\x99\x55\x2c\x36\xe5\x1d\x89\ +\x6c\x4a\x62\x1a\x1a\x95\x4f\xa8\x93\x6f\x87\x9a\xbd\x49\x6d\x69\ +\x22\x48\xf1\xed\x90\x7d\xbe\x55\x00\x15\x06\x4e\x3a\x76\xa4\xbd\ +\xf6\x21\x71\xe2\x77\x89\x05\x2e\x9e\x4d\xb9\xdf\x31\xc6\x9e\xe5\ +\x78\xc1\x04\x3a\x20\xaf\xe2\x81\x5b\xe5\xc0\x53\x05\xd9\x69\x0c\ +\x2a\xb6\x04\x56\xe5\xf2\xd5\x3c\x06\x38\x3c\x8d\x8f\x61\x42\xa2\ +\x71\x9d\x9d\xb9\x6e\xa4\x02\x72\xaf\x30\x0f\x76\x7e\x11\xcc\x6f\ +\x9c\xd7\x9e\x10\xe0\xca\x98\xee\x30\x3b\x76\xbe\x82\xd7\xf7\x1f\ +\x41\xad\x66\x47\x81\x54\x09\xd4\xfe\x5b\xab\x3c\xf7\xd5\xf1\xbd\ +\x7f\x7f\x1e\xc1\x2a\xc1\x4d\xe4\x82\xb2\x34\x03\xa8\x96\x25\x48\ +\x29\x8b\x8f\x6a\x85\x09\xab\x52\x65\x93\xde\x62\xdd\xdc\x2b\x3e\ +\xa3\x08\x8c\x7c\xba\xb8\x20\x65\xc6\xa2\xa2\x01\x8a\x68\xc2\xe3\ +\x5c\xef\xf0\xe7\x92\x2b\x97\xfa\xfc\xc8\x8d\x93\x47\x0a\xbd\xeb\ +\x24\x7a\x26\x38\x80\xc5\xb0\x2b\x6f\x3a\x43\x84\x2a\x48\xdc\x37\ +\x3f\x50\xc1\x04\xb0\xe2\xa6\x37\xf0\x6c\x46\xa5\xb3\x99\xa8\x80\ +\x5e\xe5\x1c\x4b\x52\x18\xd6\xb9\xbc\xcc\x3b\xae\x67\x55\x01\xb8\ +\x53\x0a\x64\xd2\xf1\xdd\x61\x9e\x79\x6e\x37\x0e\x1f\x3b\xad\x70\ +\x86\x97\x64\x96\xda\xd6\x37\x2b\xf9\x73\x7f\x39\x7d\xf0\xd1\x3c\ +\x02\x90\x12\x1b\xdc\x74\xb0\x6a\x14\xa8\x9a\x01\x52\xa4\x09\x80\ +\x2b\x37\x8c\x08\xbf\x7e\x65\x21\x6c\xca\x0b\x57\xcd\x99\xf2\x52\ +\x29\xa9\x53\x88\xca\xc7\x25\x51\xdb\xa5\x78\xd5\x8f\x69\x4d\x23\ +\x20\xa5\x9c\x9e\xa0\x03\x28\x33\x70\x12\x0d\xe0\x61\x29\x75\x42\ +\x59\x04\x12\xdb\xcc\x80\x96\x8a\x65\xf9\x0c\x8b\x9d\x46\x40\x18\ +\x76\x65\xaa\x0a\xb2\xd4\x46\xc0\x1e\x4e\x1d\xf3\x03\xc0\x31\x30\ +\xb5\xea\x45\x82\x36\x88\x2a\xa0\x5f\x2e\x04\x03\x15\xfb\xfe\xd6\ +\xcb\xaa\x5c\xd0\xa5\x2d\x77\x87\x39\x43\xad\xea\x1f\xce\x9f\x79\ +\xf5\xef\x17\xce\xef\xab\x82\x07\x29\x45\x47\x9a\x0b\x56\x8d\x00\ +\x55\x93\x40\x4a\xca\xd3\x24\xd1\xa9\x6b\x51\x2d\x50\x34\x9f\x08\ +\x65\xb0\xd9\x04\x40\xe4\x5a\xa0\xb1\x4b\x49\xc6\x73\x4e\x1d\x34\ +\x07\x29\x79\x52\xa9\x22\x3d\xd3\x0e\x70\xf9\xd8\xda\xd5\x77\xc0\ +\x1c\x98\x62\xdc\x15\xa1\x32\xce\xc6\xc2\x54\x17\xa8\x87\x2c\x00\ +\x05\xfd\x61\x47\xf7\x40\x78\xdb\x95\x4e\x15\x14\xc1\x8a\x57\x03\ +\x35\xeb\x9e\x83\x61\x39\xcc\xab\xe6\xbf\x7d\x8a\xf9\x55\x41\x67\ +\x7c\x3d\x91\xb3\x97\x89\xe0\x55\x1f\xab\xe2\xd9\x54\x4f\x57\x9b\ +\xb9\x3b\x8c\x6d\xe1\xed\x43\xc7\xf0\xec\x73\x2f\x1b\xba\xc3\xd0\ +\xfd\x76\xb5\xf4\xdb\xd3\x07\x1f\x79\xba\xba\x30\xe9\x35\xdd\xbb\ +\x23\x2a\x20\x6a\x3a\x58\xd5\x0b\x54\x44\x73\xbe\x2c\x40\x4a\x66\ +\x51\xaa\x5f\x93\xf9\x54\x9a\x86\x2a\x0c\xe8\x7e\x49\x3e\x70\x29\ +\x98\x9b\x92\x41\x35\x08\x52\x1c\x96\x10\x89\xe8\x71\xe3\x96\x46\ +\x00\x45\x22\x58\x95\x78\x60\x28\x94\xfb\x61\xda\xa4\x06\xad\xc0\ +\xa0\xce\x33\xac\x60\xba\x02\x71\xcf\x99\x11\x38\x88\xac\x29\x50\ +\xb1\xe2\x80\x15\x3b\x12\xe8\xd1\x22\xde\x5e\xc5\xd3\x30\x11\x38\ +\xd4\x6c\x8a\x0d\x8c\xcf\xaa\xb4\xc6\x2e\x0a\x0c\xf5\x75\xe2\xae\ +\xeb\xe3\xb8\xc3\x1c\xc0\xce\xdd\x7b\x31\xbf\x50\x8c\x76\x87\xa1\ +\xf4\x39\xab\x3c\xf7\x5b\xe3\x7b\x7f\xf0\xba\x5b\x73\x18\x48\x85\ +\x81\x15\x84\xf0\x58\x52\x0f\x50\x11\xcd\xb1\x2a\x8d\x0e\x8c\x5a\ +\xc8\xa4\x98\x62\x25\xc4\x89\x40\x30\x13\x36\xa5\x98\xa5\x2e\x4f\ +\x37\xd0\xf7\x54\x65\x3c\xe7\x92\x36\x09\xa4\x22\x59\x94\x70\xe5\ +\x75\x0f\x2c\x0f\x66\x0d\xdc\x2e\xbf\xff\x3c\x62\x71\x4f\xb0\xaf\ +\xda\x05\x31\x12\x60\x79\x36\x2c\x0d\xbb\xf2\xd7\x1b\x03\x8d\x01\ +\x56\xec\xdb\xc5\x83\x95\xff\x56\xb1\x60\x05\xd1\xf0\xce\x20\x28\ +\x07\x36\xc2\x44\x50\x08\xbf\x22\x9b\x0a\x61\x55\xe2\x08\xa0\x27\ +\x63\x23\x39\x6c\xbe\x7e\x14\x83\x3d\xd9\x66\xbb\xc3\x54\x41\xed\ +\xff\x59\x5d\x18\xff\x83\xc9\xfd\x0f\x9e\x84\xb3\x5b\x0c\x3b\xb2\ +\xc7\xde\x59\x13\xd6\xa4\x02\x31\x63\x69\xa5\xea\x17\xc6\xb2\xf8\ +\xe3\xe6\x9b\xa8\x22\x90\xd1\x90\x4d\x85\xb0\x2a\x42\x34\x15\x31\ +\x91\x61\x2a\x9f\x72\x84\x8f\x05\x84\x38\x20\x25\x4d\xf4\x0c\x61\ +\x51\x06\x00\x15\x05\x4e\x44\x7b\x22\x08\x55\x9d\xf2\x68\xce\x02\ +\x17\xa3\x75\x39\x31\x22\x60\xb1\x36\x2c\x6e\xc6\xb8\xf3\x86\xb3\ +\x3b\xe4\x44\xae\x7b\xce\x82\x0b\x33\x45\x80\x41\x25\x69\xb9\x60\ +\xd5\xab\x18\xb0\xa9\x90\x51\x40\x8d\x61\x5d\xfd\xde\xca\xac\x4a\ +\xf5\x9b\x4a\x11\x5c\xb3\xb6\x1f\x77\x5c\x37\x82\xee\xce\x68\xa3\ +\xf9\xf4\xf4\x0c\xb6\xed\x78\x09\x07\x0e\xbd\x03\xdb\x8e\x74\x87\ +\x29\x50\xbb\xf6\x57\xe5\xe9\x13\x7f\x36\x73\x64\xeb\x14\xe4\x91\ +\x3d\xdd\xb1\xe9\x6f\x6c\x89\x0b\x54\x26\x60\xa4\x0b\x0f\x49\xdb\ +\xbc\x79\x54\x3c\x80\xe8\x8c\xdf\x61\x5d\x53\x1c\x2b\xcb\x20\xdc\ +\xff\x3a\x95\x4f\xd5\x73\xa1\x89\x5c\x7d\xbc\xfb\x0e\x9a\x06\x52\ +\x42\x35\x6a\x80\xd2\x80\x93\x39\xa1\x62\xb5\x02\x39\xbd\x7f\xca\ +\xb1\xa9\xe0\xa2\xb0\x8e\xc2\x6c\x7f\x7d\xc0\x72\xfb\xcd\x2e\xb3\ +\x02\xee\x5c\x50\x05\xc3\xd6\x3d\x87\xc8\xa6\x84\x49\x99\xc2\x85\ +\x89\x5e\xdb\x9c\xbf\x8e\x9c\x0a\xc8\xe2\x13\xe2\xb3\x2a\x9f\xc1\ +\xc1\x59\xbf\xac\x2d\x93\xc6\x8d\x57\x0e\xe2\xa6\x2b\x9d\xdd\x61\ +\xec\x10\x94\x22\x84\xe0\xfc\xf9\x0b\x78\x7a\xdb\x6e\xd3\xdd\x61\ +\xc6\xa9\x55\xfe\xd3\xf9\x33\xaf\x7d\x7f\xe1\xfc\xbe\x02\xe4\x91\ +\x3d\xef\xa6\xc5\x55\xf5\x1a\x02\xad\x38\x40\x15\x07\x8c\x10\x91\ +\x96\xfb\xa5\x30\x78\x07\xea\x6e\xa6\x10\xc3\xb1\x25\x22\x9c\x33\ +\xbf\x61\x8d\x26\xea\x5f\x55\x33\xb8\x51\x3e\xbf\x0d\x21\x76\xa9\ +\x7a\x41\x8a\x04\x75\x70\xe9\xa5\xf6\x19\xce\xa9\x52\x5e\x4a\x0e\ +\x7e\x63\xdd\x03\xca\x1e\xb1\x80\x2d\x82\x56\x28\x60\xa9\xd8\x15\ +\x05\x4f\x8e\x62\x6c\xd2\x00\x7e\x8a\x80\xb4\xbd\x55\xc4\x64\x50\ +\x1f\x40\x42\x46\x01\x83\x9b\xc3\x1b\xd6\x8d\x58\x95\xe2\x1a\x76\ +\x75\x64\x70\xfb\xb5\xc3\xb8\x76\x5d\xbf\xef\x0e\xc3\x12\x41\x3e\ +\x9b\xe7\x0e\xb3\xdb\xd0\x1d\x86\x1e\xb3\xab\xc5\x3f\x98\x3e\xf4\ +\xe4\xc3\xd5\xf9\x8b\x16\xd4\x23\x7b\xa6\x80\x13\x07\xc4\x22\xc5\ +\x14\xa8\x1a\x06\x23\xc5\x2f\x9b\xaf\x29\x38\xa5\x37\x41\x99\x34\ +\x5f\x88\x97\x50\x2b\x84\x71\xf9\x49\x58\x60\x08\x57\xf9\xb8\xdc\ +\x3e\x48\x71\x94\x47\x60\x32\x06\x4c\x8b\x6b\xb2\x0c\x52\x6a\xbb\ +\x15\xcb\xe6\x54\x97\x88\x68\xc2\xe3\x49\xc0\xa6\x82\x42\x9c\x97\ +\x8b\xe1\x55\x34\x0a\xb0\x88\x7b\xce\xb2\x2b\xaf\x9f\x75\xee\x28\ +\xc3\xb2\x16\x15\x78\x68\xe6\x57\xe9\x5e\x51\x3f\xca\x84\x4d\x79\ +\xbf\x3a\x56\xc5\x00\x26\x6c\xa0\x3f\x97\xc5\x7b\x36\x8e\x60\xfd\ +\x48\xf4\xee\x30\x56\xad\x86\x37\x0e\xb8\xee\x30\x79\x03\x77\x18\ +\x6a\xbf\x5a\x2b\xe5\x7f\x67\xe2\x8d\x7f\x78\x11\xd4\x66\x6f\x59\ +\x18\x08\x99\xfe\xea\xf2\x23\x24\x0d\x27\xcd\x56\xfd\xc2\xc0\x48\ +\x0c\x6f\x1e\x89\x12\x8b\x0c\xa1\x46\x6a\x36\x45\xc2\xb2\xf0\xbf\ +\x1a\x36\xa5\xec\x8c\x90\x99\x3b\x15\x18\x10\x07\x2f\x1c\x20\x09\ +\x6c\x8c\x6d\xaf\x5f\xbf\x08\x4a\x24\x94\x45\x11\xfe\x3f\x05\x7b\ +\x8a\x06\xa7\x38\x37\x8f\x6a\x32\x3a\xe0\x44\x82\x34\xde\x66\xad\ +\x61\x80\xe5\x5e\x0f\xd1\xdf\x0e\x0c\xb3\x71\xc2\xa3\x76\x94\x61\ +\x47\xd3\x88\x6c\x5c\xf7\x49\x10\xf3\x1e\xa9\x54\x40\x18\x18\xd6\ +\xfd\xbe\xc4\x61\x55\xbc\xac\x1e\xec\xc2\x5d\x9b\x56\x63\xa8\x5f\ +\xbd\x86\x94\xdf\x95\x14\x41\xb9\x54\xc6\x4b\xaf\xec\xc5\x8b\xaf\ +\x18\xb9\xc3\xd8\xd4\xb6\x9e\xac\x2e\x5c\xfa\xbd\xa9\x03\x3f\x3e\ +\xc4\xdc\xa1\x56\xa9\x7a\x51\x20\xa6\x14\x13\xa0\x32\x01\x1d\xd3\ +\xbc\xaa\x32\x48\x2b\xac\xe9\x22\x9b\x32\x55\x5a\x82\x64\xf1\xd8\ +\x54\xa8\x01\xdd\x2f\x92\x57\xf9\xe0\x57\xc3\xb3\x25\x22\xc6\xb1\ +\x4d\x88\x09\x52\x61\x2c\x4a\x0b\x50\x8a\xcb\xc4\xf1\xae\x98\x9f\ +\x98\x80\x4d\xf9\xff\x05\x77\xdc\xeb\xaa\x0b\x36\xa1\x80\x25\xec\ +\x28\x53\x0f\x58\x05\xa3\x81\xec\x48\x9a\xde\xb8\x2e\x39\x11\x87\ +\xbc\x6e\x52\x54\x1c\x56\xe5\xb7\x03\xbe\x11\xdf\x73\x6a\xde\xb0\ +\xba\x17\x77\x5e\x37\x82\xde\xee\x76\xd9\xb7\x8f\x01\x3b\xdf\x1d\ +\xe6\xf9\x57\xf1\xfa\xfe\xc3\x26\xee\x30\x65\x6a\x57\x7f\x50\x9e\ +\x7a\xe7\x6b\x33\x47\x9f\x65\xdd\x61\x1a\x65\x49\x61\x8f\x42\x5d\ +\x2a\x60\x23\x36\x2a\x31\xbc\xde\xdf\xa6\x88\xe8\xd7\x67\x52\xbb\ +\xf7\xba\xaa\x41\x2d\x3e\x9b\x12\xde\xf9\xd0\xde\x72\xcd\xe4\x18\ +\x14\x0b\x52\x7c\x10\xd7\xd6\x98\x20\x15\xce\xa2\xd4\x00\xe5\xa7\ +\x6c\x90\x55\xf1\xa0\xc4\xd4\x2f\x6c\x14\x1a\x84\x6b\x00\x8b\xb8\ +\xe0\xc2\x00\x91\xa7\x0a\xb2\x76\xab\x38\x60\x85\x10\xe3\xba\x18\ +\x61\xbc\x63\x4c\x3d\xac\x4a\x34\xca\x53\x20\x93\x4a\xe1\xba\xf5\ +\xfd\xb8\xf5\xaa\x21\x74\x64\xd3\x01\x18\xb3\x00\xcb\xdc\x6b\x67\ +\x77\x98\x97\x70\xf8\xd8\x29\x13\x77\x98\xbc\x5d\x2b\xff\xc5\xc2\ +\xb9\xd7\xbf\xb3\x70\x6e\xef\x1c\xf8\xe9\x07\xaa\x5b\x1d\x87\x25\ +\x35\x13\xdc\x00\x44\x03\x95\x29\xc8\xc4\x0d\x47\x44\x78\x3c\xd1\ +\xd0\x00\xbe\x72\xc5\x2a\x9d\x26\x3d\x8c\xc1\xa6\xbc\x76\x28\x0d\ +\xe8\x60\xd5\x4b\x7d\x39\x62\x9b\x39\x30\xe1\x22\x63\x80\x54\x0c\ +\x80\x92\x00\x53\xd1\xf3\xf0\x40\x45\x32\xe1\x51\x0c\x80\x8b\x30\ +\xf1\x94\x03\x34\xd5\xf6\x57\xfe\xe8\x1c\xd1\xa8\x82\x7e\x3a\x3d\ +\x58\xc9\xf8\xa3\xb7\x57\x89\x1b\x82\xb2\x2a\xa0\x34\x11\x14\x02\ +\x88\x71\xd3\x15\xe2\xb0\x2a\x02\x1b\x14\xd9\xf6\x34\x6e\xbe\x6a\ +\x15\x36\xad\xef\x47\x5b\x3a\x05\x3b\x84\x7f\x10\x02\x9c\x3c\x79\ +\x06\x4f\x6f\xdb\x8d\xd3\xe7\x2e\x19\xd8\xa3\xe8\x39\xbb\x5a\xf8\ +\x93\x99\x63\xcf\xfe\x43\x65\xf6\x6c\x05\xc1\xea\x07\x61\x00\x13\ +\x05\x36\x3a\x96\x14\x15\x1e\x05\x66\x00\x9a\xe7\xeb\x17\x37\x9c\ +\x18\xa4\x8d\xdd\x08\xb9\xf0\x38\x45\xf3\x4d\xaa\x97\x4d\x71\x60\ +\x18\x06\x76\x24\x48\x23\xb3\xaa\x20\xc0\x07\x39\x0e\x4c\x1a\x07\ +\x29\xd1\x3d\x46\xc5\x9e\x94\x0c\x51\xb8\xa6\x51\x57\x98\x72\x89\ +\x5c\xa8\xa1\xaa\x78\xe2\xb3\x2c\x8e\x61\x29\xd9\x95\x7b\x6d\x54\ +\xaa\x60\x04\x58\x39\x20\x44\x02\x9b\x94\x5b\x33\x15\x98\x8e\x97\ +\x4e\xa7\x02\x4a\x6f\x55\xe8\xeb\xa6\x79\xdf\x15\xe8\x45\x6d\xa0\ +\xa7\xb3\x0d\xb7\x5f\x3b\x82\x2b\x47\x7b\x7c\xf7\x21\xbe\x58\x17\ +\x16\x09\x60\xdb\x36\xde\x3a\x78\x0c\xcf\x6c\x7f\xc9\xcc\x1d\x86\ +\xda\x6f\xd7\x4a\xb3\xbf\x3f\xf5\xd6\x43\xcf\xd8\xd5\x22\x05\xbf\ +\x44\x8b\x49\x8f\xea\x65\x49\xc6\xec\x49\x25\x61\x40\x55\x2f\x9b\ +\x8a\xcf\xbe\x68\xe4\xf3\x6e\x26\xe2\x1b\xcf\xfc\x72\x6c\xc6\x3f\ +\x0f\x99\x1a\xa0\xbd\x1c\xc2\xb1\xe8\x4e\x43\xd4\xb9\x94\xf5\x70\ +\xc9\x05\x00\x63\x6b\x51\x80\x50\x14\x48\x11\xfe\xbf\xf0\x39\x55\ +\x7c\x02\x45\xbd\x42\x7b\x74\x97\x45\x14\xaa\x86\xb5\x60\xe0\x8f\ +\x2a\x40\x4b\x06\x2c\xe2\x66\x52\x2e\x23\x0c\x05\x73\x32\x01\x2b\ +\x8e\x5a\x09\x6f\x5f\x4c\xd5\x2d\x36\xab\x52\xb2\x2b\x27\x70\x55\ +\x5f\x07\xde\xb3\x71\x04\xa3\x03\x5d\xee\x35\x51\xbf\xdb\x29\x42\ +\x50\xa9\x56\xb0\xe7\xb5\xfd\xd8\xf1\xc2\x5e\xcc\x17\xa2\xdd\x61\ +\x28\xb5\x76\x55\xe7\x2e\xfd\xde\xd4\x5b\x3f\xde\xeb\x56\x2b\x3e\ +\xd4\x51\xcc\xa6\x5e\x96\xd4\x30\xab\x6a\xc6\xcc\xf4\x26\xa4\xaf\ +\xdf\x98\x6e\x46\xdd\x62\x32\x2b\x81\x09\x99\xb1\xa9\x88\xe9\x08\ +\x22\x3a\x84\xaa\x7c\x0c\x6e\x70\xc6\x73\xa1\x62\x03\x90\x8a\x64\ +\x51\x5a\x80\x52\x5c\x39\xc5\x65\x0c\xc5\x29\x55\x24\x07\x5e\xc1\ +\xd6\x57\x40\xc0\xb4\x7c\x10\x62\x55\x42\x1f\x10\x9c\x84\xa2\x2a\ +\x68\x0a\x56\x3e\x30\x91\x08\x7b\x95\x97\x34\x84\x4d\x35\x87\x55\ +\x05\x87\xeb\x86\x72\xb8\x73\xe3\x08\x06\x7a\xb2\x4e\x1f\x58\xeb\ +\x3d\x47\xc4\x08\x0a\x0b\x0b\x78\xfe\x85\x3d\x78\xf9\x75\x23\x77\ +\x98\x1a\xb5\x6b\x0f\x95\xa6\xde\xf9\xea\xec\xd1\x67\x4e\x22\xb0\ +\x47\xe9\x46\xf0\x4c\x01\x24\x2e\x4b\xaa\x9b\x55\xe9\x80\xaa\xd9\ +\x6c\x2a\xaa\x9c\x06\x45\x7e\xd1\xe3\xcc\x44\x8f\x32\xa2\xeb\xf2\ +\x85\x5b\xd3\x35\xe5\x85\xb1\x2a\x45\x80\x04\x52\x7e\x79\xf5\x83\ +\x94\x9f\x52\xc6\x3d\xae\x4e\xa9\xbb\xaa\x40\xa3\x2b\xec\x09\x95\ +\xc0\x8b\x1f\xed\x73\xd2\xc8\xfb\xf5\x69\x96\x11\x46\xc4\x68\x9f\ +\xff\x5a\xb0\x3e\x77\x8c\x73\x8b\xc4\x6c\x64\x15\x30\xb8\x7a\x8a\ +\x89\xa0\x9c\x6a\xa8\x5b\x9d\x53\x33\x02\xe8\x15\x4f\x9d\xfb\x78\ +\xf5\xda\x5e\xdc\x7e\xcd\x30\xba\x3a\xf4\xee\x30\xde\x87\x65\x7a\ +\x7a\x06\xcf\x6c\xdf\x8d\xfd\x07\x8f\xc3\x8a\x76\x87\x29\xda\xb5\ +\xf2\x77\x0b\x17\xde\xf8\xd6\xfc\x99\x3d\xac\x3b\x0c\x98\xe6\x89\ +\xc7\xd0\xa4\x61\xcf\xeb\xfd\x35\x2d\x87\x93\x66\xad\x9e\xd0\x48\ +\x9a\xe6\x80\x96\x4e\x77\xe3\x00\x81\x28\x81\x02\xca\x5f\xa2\x2c\ +\x57\x9a\xd5\x2d\x55\x17\xce\xa6\x64\x9e\x12\xa4\xe1\xa7\x29\x88\ +\xc6\x73\xb6\xc8\x38\x20\x25\x02\x56\xd0\x2e\x13\x80\x92\xda\xab\ +\xb9\x5b\x62\xb0\xf2\x5d\xa3\x6c\x1d\xa2\x2d\xca\x0b\x95\x99\x8d\ +\xc7\xae\xd8\x89\x9e\x9e\x2a\x18\x35\x35\x41\x98\x75\x20\xcf\x20\ +\x67\xa6\x01\xa8\xd6\x8f\x62\x67\xad\x1b\x91\x01\xe9\xb5\xe3\x01\ +\x8f\xc5\x05\x0a\x8a\xb6\x4c\x0a\xd7\x5f\x31\x80\x1b\x37\x0c\xa2\ +\x3d\xc3\xae\x21\x25\x63\x08\x21\xc0\xd9\x73\x17\xf0\xd4\xb3\x2f\ +\xe2\xf8\xc9\x73\x61\xb7\xc3\xbb\xc6\x93\x76\xa5\xf0\xe7\xf9\x13\ +\x3b\xff\x73\x69\xea\x1d\xd1\x1d\xc6\x14\x40\x54\x0d\x8a\xea\x7d\ +\xa3\x69\x24\xc9\x68\x0a\x52\x9d\xc7\x65\x53\x71\xd3\xd5\x2d\x3a\ +\xf0\x50\x28\x2f\x11\xdd\x25\x11\x8d\x65\x38\x85\x66\xa4\x2f\xb4\ +\xd3\xcc\x89\x88\xab\x32\x23\x94\x5b\xa5\x74\x75\x69\x36\x48\xa9\ +\x00\x2a\x1a\xa7\x42\xaf\x2a\x1b\xe8\x3f\xa1\x22\x68\x71\x80\xa5\ +\xde\x0d\x99\x80\xf0\xb6\xab\x28\xb0\x82\x30\x7d\x80\x35\x47\x6b\ +\xed\x55\x01\x50\x82\x8d\x65\x40\xcb\x8c\x55\x29\xde\x74\xaf\x9d\ +\x04\xa0\x36\x45\x57\x36\x83\x5b\xae\x5a\x85\x6b\xd6\xf6\x23\x95\ +\x52\x6b\x8b\x81\x8a\x4b\x71\xe4\xe8\x09\x3c\xf9\xec\x6e\x5c\xb8\ +\x34\x65\x62\x34\x3f\x51\x2b\xe5\xff\x78\xe6\xd0\xe3\x8f\xd4\x4a\ +\xb3\x9e\x3b\x4c\x5c\xf6\x24\x86\x37\x9b\x2d\x19\x83\xa2\x89\x31\ +\xdd\x34\x7c\xc9\xc5\x5c\x35\xd1\xcf\x44\x6f\xb8\xbb\x51\x6c\x8a\ +\x73\x22\x56\xb3\x36\x0e\x30\x25\xe3\x39\x53\xb4\x62\xba\xb9\x1e\ +\xa4\x88\x54\x9d\x29\x40\xc9\x57\x80\xc4\x7f\x0a\x5c\x7b\x13\x5b\ +\x9f\x0c\x5a\x3c\x60\xe9\xd9\x95\x21\x58\x31\x4c\xc8\xb7\x49\x69\ +\xed\x55\x3a\x36\xa5\x67\x44\x5a\x62\x20\x00\x9e\xe4\x03\x48\x29\ +\xfa\x72\x59\xdc\x71\xed\x30\xc6\x86\x72\x5e\xcf\xd5\x45\xb9\xee\ +\x30\xfb\xde\x7c\x1b\xcf\xec\x78\xc5\xc8\x1d\x86\x52\xeb\xf5\xea\ +\xfc\xf8\x1f\x4e\xbd\xf5\xe3\xdd\xc1\x5e\x5e\x0d\x4d\x21\x68\xb6\ +\xc4\x05\x4a\x09\xa8\xe2\x82\x53\xbd\xec\x2b\xaa\x5c\xf3\xee\xb2\ +\x4f\xbe\x82\x9e\x04\x18\x40\xb8\x73\xb9\x15\x3a\x95\x8d\x05\x06\ +\xef\x97\x67\x38\xea\x79\x53\x2a\x36\xc5\xa3\x0d\xd7\x36\x3f\x56\ +\xad\xf2\x01\xea\xba\xb8\x76\x30\xf5\xa8\x40\x4a\xc9\xa2\x4c\x01\ +\x4a\x64\x62\xf5\xdc\x2b\x30\x2b\x4f\x8a\x9b\x85\xba\x07\x2c\x60\ +\xa9\xd8\x95\x31\x58\xf9\x23\x6f\x8c\xea\x07\xde\xb8\xce\xad\xed\ +\xa4\x71\x6b\x51\x83\x97\xf8\x1b\xe4\x15\xb7\x68\x57\xc9\xc8\x40\ +\x27\xee\xbc\x6e\x04\x43\xbd\x11\xee\x30\x24\x85\x72\xa9\x88\x17\ +\x5e\xda\x8b\x5d\x2f\xbd\x81\x62\xa9\x6c\xe0\x0e\x53\x7b\xa6\x3c\ +\x7d\xf2\x8f\x66\x8e\x3c\x7d\x08\xfa\xa9\x07\x6c\x35\xf5\x86\x37\ +\xcc\x92\xe2\x84\x9b\x1a\xd3\x4d\xc3\xd1\x60\x78\xc3\x52\xbf\xda\ +\x17\xa5\x9b\x1a\x34\x39\x92\x4d\x85\x30\x38\x45\x84\x6e\x61\x3e\ +\x36\x5d\x3d\x20\xc5\xba\xe8\xb0\xf5\xc8\x00\x25\xe4\x8d\x79\x39\ +\x7c\xa1\x8a\x6c\xc4\x05\x2d\x2d\x60\xa9\xd9\x55\x24\x58\x41\x8e\ +\x97\x8d\xeb\x60\xd8\x14\xaf\x02\x8a\x9b\x2f\x84\xdb\x99\xf8\x7e\ +\xc9\x6f\x25\xcb\xe0\x9c\xb2\xd7\xaf\xee\xc1\xed\xd7\x0c\xa1\xa7\ +\xab\x8d\x61\x7d\x6c\x83\x82\x76\xcd\xe5\xe7\xb0\x6d\xc7\x4b\x78\ +\xed\x8d\x43\xa8\xd6\xac\x28\x90\xaa\xd8\xb5\xf2\x3f\x14\x2e\x1d\ +\xf8\xb3\xf9\x53\x2f\x9f\x47\x30\xb2\xd7\xa8\xfa\xd5\x54\xc0\xa9\ +\xa3\x3e\x00\xad\xdd\x29\x39\x4e\x78\x63\x1f\x6a\xa3\x6a\x82\xf8\ +\x70\x40\x52\x97\x65\x34\x25\x41\x51\xa6\x9a\xc1\x05\x85\x29\x67\ +\xaf\x43\xad\xf2\x41\x8c\x63\x6b\x92\xb1\x51\x01\x52\xe2\xb2\x30\ +\xdc\x01\x07\x50\x52\xbd\x0a\x00\x35\x16\x37\xb9\xcf\x34\x18\x86\ +\x13\x00\x56\xc0\xb7\xb8\x35\xcf\x3d\x03\xba\x29\x58\xa9\x96\x66\ +\x41\xc0\x9e\xb8\x69\x09\xaa\x76\xea\x54\x41\xef\x97\x63\x53\x0a\ +\x30\xd3\xbc\x6e\x99\xb4\xb3\xd0\xdd\xcd\x57\xad\x42\x47\x7b\x5a\ +\xf2\xd9\xe3\x30\x94\x10\x5c\xba\x34\x8e\xa7\x9e\x7d\x11\x07\x8f\ +\x9c\xf4\xc1\x56\x2f\x74\xce\xae\x14\xff\x6a\xee\xd4\xee\xbf\x29\ +\x4e\x1c\x66\x77\x87\x69\xb5\xc4\x56\xe1\xea\x15\x16\xa8\x9a\xa5\ +\xf6\x89\xe7\xa6\xe1\xf1\x2f\x91\xea\x54\xa9\xfe\x29\xd4\x3e\x11\ +\x49\x04\x36\x24\xf9\x0e\x82\x8f\xd7\xa2\x9d\x48\x7b\x18\x40\x88\ +\xcc\xa2\xbd\x22\x9a\x85\xf9\xc4\xb6\x72\xa0\x63\x0e\x52\xa1\x0c\ +\x4a\xa1\x6a\x46\xdd\x0b\x5f\xa8\x98\x2c\xb8\x76\x2c\x68\x11\x3f\ +\x8c\xf8\x0c\x8b\xdd\x82\x9d\x55\x05\xa3\xc0\x4a\xf2\xcb\xe3\xec\ +\x55\x41\x73\x55\xeb\x48\x79\xe1\x4a\xc3\x7a\x08\xab\x92\x01\x2d\ +\x60\x77\x36\x05\xb2\x6d\x69\xdc\xb0\x61\x00\x1b\xc7\xfa\x91\x49\ +\x85\xed\x0e\xe3\x94\x70\xe2\xe4\x29\x3c\xb1\xf5\x05\x9c\x3a\x6b\ +\xe4\x0e\x73\xc1\x2a\xe7\xbf\x31\x73\x74\xeb\xff\xa8\xce\x8f\x8b\ +\xbb\xc3\xe8\x9a\xb8\xd8\xe1\xba\x73\xe3\xf0\x38\xc6\xf4\xb8\x6a\ +\xdf\xe2\x0a\x31\x0a\xd2\xc6\xd6\x83\x9e\xa1\x6c\x4a\xf3\xc2\xeb\ +\x67\xb2\xeb\xd8\x14\xcb\x6e\x88\x54\x1e\xd7\x06\x6d\xd1\x0a\x75\ +\x50\x97\x86\x29\x9f\x68\x2e\xaa\xf1\x35\x62\x12\x52\xe1\xc0\xb7\ +\x46\x11\x1e\xb0\xa8\xef\xff\x27\xb2\x2b\x33\xb0\xf2\xc1\x86\xa1\ +\x55\xd2\x0e\xc7\xaa\xd7\x42\x78\xd5\x74\xfa\x92\x88\x5f\x60\xeb\ +\x12\x58\x15\x05\x90\xeb\x6c\xc3\xad\x57\x0f\x61\xc3\xea\x1e\x1e\ +\xeb\x44\x10\x05\x40\x2d\x1b\x6f\xbd\x7d\x04\x4f\x6d\xdb\x8d\x89\ +\xa9\x59\x03\xa3\xb9\x7d\xa8\xb6\x30\xfe\x6f\xa6\xde\x7e\x74\x1b\ +\xb5\x2a\x36\xe4\x9e\x35\xaa\xa6\x45\x85\xc7\x79\x12\x1a\x9a\x02\ +\x61\x32\x3d\xa1\x19\xd2\x52\x30\x23\x82\xa1\x97\x3f\x53\x37\xa3\ +\x2e\xb5\x4f\x54\xb9\x42\x7b\x45\xd4\x65\xe9\x52\x19\x20\x25\x4f\ +\xe6\x84\x25\x63\x38\x90\x22\x32\x00\x29\x59\x97\x90\xc6\x2f\x4a\ +\xa6\xab\x6a\x58\x57\x74\x46\x3b\x10\x46\xb9\xac\x81\xba\xc7\x00\ +\x16\x0d\x4a\x56\xed\xc3\x17\x05\x56\x81\x41\x5b\x20\x41\x0c\x42\ +\x48\x2a\xa0\x60\x58\x37\x67\x55\xe0\xeb\x82\xfc\xe6\x0d\xf6\x64\ +\x71\xfb\xb5\xc3\x58\x3d\xd0\x85\xb0\xf7\x9c\x10\x82\x4a\xb9\x82\ +\x57\xf6\xbc\x89\xed\xbb\xf6\x18\xed\x0e\x43\xed\xda\xee\xca\xec\ +\x99\xaf\x4e\x1f\x7a\x62\x9f\x5b\x2d\xfb\x04\x2d\x25\x08\x35\x43\ +\xa4\x32\x9b\x6d\xa3\x32\x65\x5b\x42\x78\xa3\xd7\x29\xa2\x3a\x22\ +\xbc\xcf\x11\x3a\x98\x56\xed\x8b\xea\xa5\xce\x77\x50\x51\x2f\xef\ +\xce\xa2\xb0\x75\x09\x6c\x4a\x5c\xd7\x8a\xad\x97\x67\x72\x2c\xeb\ +\x8a\x9e\x9d\x2e\x6b\xaa\x44\x38\x17\x3a\x29\x82\x5c\xd4\xb5\x71\ +\x25\xd8\x86\xdd\x3f\x83\x1f\x44\x83\xb6\xc9\x3b\xca\x98\x83\x95\ +\xcf\x9d\x08\xe4\x39\x4d\x3e\x68\x41\xcb\xa6\x4c\x57\x3a\xe0\x32\ +\x49\xc7\x8e\xac\x59\xd5\x8d\xdb\xaf\x19\x42\x7f\x2e\x2b\x62\x9b\ +\x30\xb7\x8a\xa0\xb0\x50\xc0\x73\x3b\x5f\xc1\x4b\x7b\x0e\xa0\x6c\ +\xe2\x0e\x63\x55\x1e\x2b\x5e\x3a\xf4\x6f\xf3\x27\x77\x9d\x84\xbc\ +\xf2\x81\xae\xaa\xb8\xe1\x71\x59\x8f\x31\x3b\xaa\x47\x3c\xa0\x32\ +\x04\x14\x6d\x78\x9d\x00\xd5\x18\xd3\x22\xba\x00\x11\x10\x22\x4a\ +\x89\xa3\xf6\x11\x29\x0f\x89\xc8\x6b\x06\xa4\x91\x0d\x10\xd2\xa8\ +\x54\x3e\x6e\x0a\x01\x11\x6b\x0e\x63\x5d\x66\x00\xd5\xc8\xcd\x62\ +\x01\x93\x05\x2d\xd5\x7e\x7d\x61\x5b\x5b\x85\x82\x15\xaf\xf1\x49\ +\x01\x6a\x67\x61\xce\xa9\x06\xf2\xb0\xa0\x50\x8e\x77\xa8\xf8\x05\ +\x05\x48\x8a\xe0\xaa\xd5\x3d\xb8\xf9\xaa\x55\xe8\x56\xb9\xc3\x30\ +\x55\x10\x42\x30\x35\x39\x8d\xa7\xb7\xbd\x88\x37\xde\x3a\x06\xcb\ +\x32\x70\x87\xa9\x16\xff\x6e\xfe\xcc\x2b\x7f\x59\xb8\xf8\x96\xe8\ +\x0e\x13\x76\xe9\x5b\xa1\xfe\xd5\x9b\xae\xae\x7a\xa3\xa6\x27\x44\ +\x85\x37\x43\xa5\x8b\x5f\x86\x41\x0e\x62\x10\x5b\x8f\xda\xa7\x67\ +\x63\xec\xaf\x02\x30\x88\x2e\x8b\x01\x9b\x12\x54\x4e\xb5\xca\x47\ +\x84\xea\x59\x80\x31\x07\x29\xd1\x1e\xa6\x7b\x6f\x0c\xb6\x00\xf7\ +\xc5\x9b\x86\xc0\x95\xec\xb3\x29\x57\xd9\x12\xd8\x55\x6c\xb0\x62\ +\xe6\x43\xf1\xf6\xaa\x08\x36\xc5\x36\x8a\x9a\xa4\xd5\x30\x29\x0a\ +\xb4\xa5\x53\xd8\x38\xd6\x8f\x4d\xeb\xfb\xd1\xde\x96\x12\xe6\x6f\ +\x89\xd7\x0f\x38\x7b\xe6\x3c\x1e\xdf\xba\x0b\xc7\x4e\x9c\x0b\xbd\ +\xd6\x4e\xf9\x74\xca\xaa\xcc\x7d\x7b\xf6\xf8\x8e\xff\x5a\x99\x3d\ +\xa3\xdb\x1d\x66\x39\x4b\x43\x80\x55\xcf\xe6\x0e\xcb\x52\xc4\x97\ +\x3f\xac\x0b\x44\x99\x51\x50\x6d\x74\x6a\x9f\xb6\x64\x81\x99\xe9\ +\xe8\x5e\x38\x6a\xc5\xe9\xa4\x54\x1f\x0b\x52\x41\x98\xd0\x6f\x1d\ +\x48\x89\x2c\x4a\xc1\xa0\xe2\x80\x93\xd4\x6c\x26\xaf\xbf\xe2\xa6\ +\xfb\x9f\xc7\xb0\x4c\xf6\xe1\xd3\x82\x15\x37\xfa\x17\xe8\x6e\x66\ +\x4b\xb0\xc8\xac\x4a\x4a\x0f\xdd\x14\x05\xc0\x06\xd0\x91\xcd\xe0\ +\xa6\x0d\x83\xb8\x7a\x4d\xaf\xbb\x3b\x8c\xa8\xef\xb1\xef\x1f\xc5\ +\xa1\xc3\xef\xe0\x89\xad\x2f\xe0\xfc\xc5\x49\x13\x77\x98\x53\xd5\ +\xc2\xd4\xd7\x67\x0e\x3d\xf1\x98\x55\x99\xaf\x29\x9e\x96\x46\x59\ +\xcb\x52\x8a\x51\x9b\x4c\x67\xa6\x37\xda\x90\xd6\xf5\x52\x60\x00\ +\xaa\xda\xe5\x17\x19\x3a\x34\x31\xd0\xbe\x34\x2b\x85\x46\x74\xbd\ +\xa9\x6c\xca\x3b\x12\x41\x96\x4d\xc3\x02\x0d\x09\xc0\x22\x1c\xa4\ +\x14\x00\x45\xf4\xbd\x34\xc1\x2d\xe5\xcc\x6b\x37\xa3\x04\x58\x8a\ +\xdd\x62\x9c\x70\xc5\x82\x77\xec\xcb\x2f\xaa\x61\x60\x9e\x7e\x49\ +\x75\x23\xd0\xce\x0f\xe0\xd0\x48\xfc\x95\xf4\x4a\xbf\x7f\xbd\xdd\ +\x6d\xb8\xed\xaa\x21\xac\x1d\x8a\xde\x52\xbd\x56\xab\x61\xef\xbe\ +\xb7\xf0\xf4\xf6\x97\x31\x33\x3b\x1f\x3d\xb2\x67\x5b\x6f\x54\xf2\ +\xe7\xfe\x78\xfa\xd0\xe3\xbb\x0d\x76\x87\xd1\xf5\x28\x2a\xbc\x51\ +\x60\x6b\x05\x00\x72\x65\x36\xd3\x98\x6e\x0a\x48\x4d\x01\x2e\x1d\ +\x61\x61\x7f\x4d\x26\x26\x9a\x10\x9a\xe8\xba\x64\xb6\x14\x0a\x8e\ +\x71\x58\x94\xb2\x4e\xbd\xca\xc7\xe3\x2f\x0b\x3c\xf1\x41\x2a\xce\ +\x26\xa5\xda\x66\x13\x80\x7d\x86\x39\xa2\x21\x02\x16\xcb\xae\x4c\ +\x56\xe7\x64\x18\x53\xd0\xa6\x10\x15\x10\x3c\x56\xe9\x58\x95\x38\ +\x02\xa8\x64\x55\x6e\x8d\xc3\xfd\x9d\xb8\xed\x9a\x55\x18\xea\xed\ +\xe0\x96\x0b\x96\x90\x80\x10\x94\x4a\x45\xec\x7a\xf1\x35\x3c\xff\ +\xe2\x3e\x33\x77\x18\xab\xfa\x5c\x69\xf2\xe8\x9f\xcc\x1e\x7f\xee\ +\x30\x73\xc1\xc3\x00\x61\xb1\x00\x67\xd1\x01\xac\x15\x33\xd3\x17\ +\x51\xfc\xb9\xcc\x8c\xef\x25\xfb\x35\xf5\x3e\xb3\xd0\x1a\x42\xb9\ +\xb9\x33\xfe\x03\xcc\xff\xaa\x9e\x50\x3e\x0d\x75\x1f\x7a\x75\x1e\ +\xee\x2b\xaf\x68\x03\x57\xbc\xb6\x1d\x44\x1d\xce\x76\x93\x92\xc0\ +\x47\x4e\x8c\x0b\x9a\x1e\xa4\x73\xcf\x29\x03\x62\x94\xb9\x8a\xec\ +\xeb\xef\x1d\x50\x16\x18\xd9\x3b\xa1\x7a\xe7\xd8\xb9\x46\x7e\xba\ +\x80\x89\x04\x61\x84\x63\x57\xbe\x6a\x17\x01\x56\x4c\xb3\xd4\x2a\ +\xa0\x7f\x63\xd9\x04\xdc\x13\x12\xe7\x51\xf3\xcb\xf0\x40\x6e\x6c\ +\x55\x37\x6e\xb9\x7a\x95\xeb\x0e\x43\x15\xe9\x83\xb6\xcf\xce\xe6\ +\xf1\xcc\xf6\xdd\xd8\xb3\xf7\xa0\x99\x3b\x4c\xb5\xf4\xe0\xc2\xf9\ +\xbd\x7f\xbe\x70\x6e\xaf\xb7\x3b\x4c\x2b\x54\xb6\xa5\x64\x4c\xb1\ +\xa4\x1e\xa0\x5a\x54\xe6\x14\x55\x6a\x57\x36\x83\xc1\xde\x4e\x10\ +\xd1\xc9\xd7\x7d\x11\x59\x23\x38\x7b\xae\x9d\x54\xe9\x96\xa3\x5f\ +\xb2\x58\x15\xae\x8b\x07\x5f\x17\x5b\x8f\x4a\xbd\x0b\x53\xfb\x14\ +\x75\x48\x69\xb8\x7e\xe8\xc2\x88\x74\xac\x5a\xdb\x8a\xbb\xe4\xa1\ +\xcc\x0a\xa8\x59\x14\xc5\xb2\x05\xc9\x29\x45\x60\x68\xdc\xc7\xc4\ +\x65\x5a\xdc\x8e\x32\x08\xd4\x3c\x4f\x15\x54\xae\x76\x00\x06\x90\ +\x3c\x50\x03\xe5\x3e\x3c\x51\xab\x72\x06\xec\x4a\x60\x55\xe2\x6c\ +\x75\x51\x53\xa4\x40\x3a\x45\x70\xf5\x9a\x5e\xdc\x78\xc5\x00\xb2\ +\x8c\x3b\x0c\xff\x36\x3b\x6d\x02\x21\xb8\x78\x71\x1c\x4f\x6c\xdd\ +\x85\xb7\x0f\x9d\x80\xad\xb9\x9e\x4c\x05\x73\x56\x79\xfe\x7b\x73\ +\x27\x5f\xfc\x4f\xa5\xa9\xe3\x8b\xe9\x0e\xd3\x0c\x69\x19\xf0\xad\ +\x70\x46\x05\x5c\xbd\xb6\x1f\xeb\x47\x7a\x24\x10\x00\xa0\x7e\x41\ +\xdd\x08\x9d\x1a\x14\xe4\x53\xa8\x54\x41\x06\x46\xeb\xe3\x1f\x3a\ +\x0e\x88\x98\x32\xfd\x10\x22\xa6\x25\xe1\xe5\x33\x85\xb2\x2a\x1a\ +\xd7\x53\xa1\x7f\x92\xfa\x07\x1e\x58\x38\x75\x4f\x0a\x03\x84\xd2\ +\x35\x71\x41\x1f\x26\xf2\x65\xec\x3f\x39\x03\xcb\xe2\xe3\xa8\x70\ +\xe4\xb7\x81\x61\x5a\x22\xc3\x52\x6e\x6f\xc5\x4e\xca\xe4\x96\x7d\ +\x11\x96\x12\x16\x27\x6c\xfa\x7d\x50\x4f\x33\x30\x7f\x55\x9c\x7a\ +\x6c\x00\xed\x6d\x69\x6c\x5a\xdf\x8f\xeb\xd6\xf6\x21\x93\x26\xae\ +\xba\xa7\x2f\xec\x9d\x77\x4e\xe1\xb1\xa7\x76\xe2\xe4\x99\x8b\xc1\ +\xc7\x54\x27\xd4\xbe\x58\x2b\xce\x7c\x6b\xe6\xe8\xd6\x07\x6b\x85\ +\xa9\x32\x5a\xc7\xa4\xa2\x3b\xbc\xcc\x8c\xee\x2b\x1e\xa8\xda\x32\ +\x29\x64\xdb\x9c\x8f\x0e\xfb\x52\x07\xe7\xce\x7f\xe2\x4b\x1e\xbc\ +\xc7\x8a\x35\x99\x04\x84\x89\x05\x3e\x5e\x06\xca\x03\x25\xa8\x0e\ +\xd4\x54\xf5\x08\xcc\x8c\x0d\x15\x9e\xf4\xb0\x32\xe2\x80\x94\x10\ +\xa2\xbe\x56\x0a\x21\x84\xa0\x3d\x53\x73\xea\x10\xdb\xc6\x1e\xf9\ +\xe0\x44\x83\xa2\xfd\xa9\x05\x40\xf8\xf6\x56\x6a\xb0\xe2\x30\x08\ +\x02\x16\x45\xb2\x2a\xc5\x08\x20\x82\x79\x59\x62\x06\x6a\x03\xb9\ +\x8e\x0c\x6e\xba\x72\x10\xeb\x87\x73\x81\xda\x0d\xe6\x8d\x66\xee\ +\xb3\x65\x59\x38\xf0\xd6\x61\x3c\xbe\xf5\x05\x4c\x4c\x1a\xb8\xc3\ +\xd8\xd6\x91\xea\xfc\xc5\x3f\x9d\x3e\xf8\xf8\x36\x6a\x57\x03\x0d\ +\x3c\x11\x00\x2b\x14\xa8\xc4\x3b\xa8\xf2\x15\x65\x3e\xb2\x7c\x46\ +\xe9\x3c\xfc\x99\x90\xa8\x7f\x48\x1d\x52\x9d\xe2\xcb\xc4\x54\x15\ +\x7e\xee\xbe\xbc\x9e\x1d\x2d\xac\xf9\x21\xdd\x61\x08\x8c\x90\x47\ +\x82\x24\x21\x1d\xd1\xe6\x97\xc5\xe7\x46\x8c\x55\x4b\x91\x87\x01\ +\x48\x1a\x4c\x98\x0a\xda\x8c\x30\x9b\x14\x78\x1b\x22\xd8\xfd\xf7\ +\xfc\x40\xe1\xe2\xd7\xc1\xaa\x24\xe0\x23\xfe\x4c\xf9\x81\x9e\x2c\ +\x6e\xbd\x7a\x15\x46\xfa\x3a\x41\x43\xae\x08\x21\x04\x95\x4a\x05\ +\x2f\xbf\xb2\x0f\xcf\xee\x78\x15\x73\xd1\xee\x30\xa0\x56\xf5\xe5\ +\xf2\xcc\xc9\xaf\xcd\x1c\xd9\xba\xcf\x6d\xc5\x52\x33\x9a\x65\xc5\ +\xa6\x80\xfa\x80\xca\x14\xed\x5b\xfc\x55\x20\x75\x97\xae\x7c\x4d\ +\x89\x32\x32\x24\x9f\x41\x1d\x22\xbb\x21\xaa\x44\x92\x96\x26\x9d\ +\x87\x37\x40\x47\x63\x64\x3a\xa4\x9a\x1b\x16\xc9\xc0\xc2\x6a\x24\ +\x0e\xc3\xf3\xd9\x94\xc8\x66\x3d\xa1\xfc\xab\x4d\x5c\xc0\xf0\x18\ +\x16\xb7\xe0\x9d\xe1\xf6\x56\x9a\xd3\xba\x59\x55\x18\x36\x8c\x0e\ +\x76\xe2\x96\xab\x56\xa1\x3f\xd7\x0e\x6a\xeb\x52\x3a\xd7\x62\x61\ +\xbe\x80\x6d\x3b\x5e\xc6\x8b\xaf\xbc\x69\xe4\x0e\x63\xd7\xca\x4f\ +\x15\x2e\x1e\xf8\xb3\xf9\xd3\x2f\x9f\xc0\xd2\xa9\x7a\xcd\x12\xd3\ +\xb6\xc7\xee\xe3\xca\x62\x54\x91\x48\x11\x03\x4a\x48\x58\xb0\x61\ +\x39\x4a\x35\x33\x4e\xd5\xe6\xed\x25\x2a\x78\x95\xb5\x37\x7d\xc9\ +\x8a\xaa\xe2\x82\x14\x89\x4a\x10\x72\x9d\xfc\x5c\xc2\x7e\x7d\xe2\ +\xdc\x29\x2d\x58\x79\xf6\x2a\x76\x0a\x81\x6e\x7b\xf4\x30\x56\xa5\ +\xea\x94\x62\x84\xd5\x69\x13\xc1\x86\xd5\x39\xdc\x74\xc5\x00\x3a\ +\x3d\x77\x18\x05\x55\xf7\xae\xcb\xe4\xe4\x14\x9e\xdc\xfa\x02\xf6\ +\x1d\x38\x02\xcb\xb2\xa3\x8c\xe6\x45\xbb\x52\xf8\x6f\x73\xa7\x5f\ +\xfe\x4e\x71\xfc\xd0\x24\x96\xc6\x68\xde\x32\x60\x69\xb6\x34\x13\ +\xa8\x5a\xc8\xb4\x48\x64\x0c\x11\x5f\xda\x10\xbb\x92\x59\xc9\x8a\ +\x17\x99\x98\xe4\x23\x06\x21\xfa\x6c\x44\x09\x18\x3a\x36\x26\xc0\ +\xaa\x50\x06\xcb\x12\x45\x00\x26\x91\xc0\x25\x56\x15\xde\x0b\x42\ +\x02\xc3\x38\x27\x94\xfb\x01\xb7\x7e\x94\x57\x6c\xc4\x26\x0d\x5c\ +\x43\x42\x56\x3c\xe0\xe6\x3b\x29\x58\x95\x7a\xf2\xa6\x5a\xda\x32\ +\x29\x5c\xb3\xa6\x17\x1b\xc7\xfa\xd1\x9e\x21\x72\x5b\x84\x6b\x7e\ +\xe6\xcc\x39\x3c\xfa\xe4\xf3\x38\xfa\xce\x59\xff\x7a\x68\x85\xd2\ +\x99\x5a\x79\xf6\x3b\xf9\x63\xcf\xfd\x7d\x65\xee\xbc\xe7\x0e\x13\ +\x06\x06\x8d\x02\x4a\xb3\x01\x69\xd1\x01\x4e\x04\xaa\x56\xa8\x6b\ +\x0d\x97\x49\x6d\x0b\xd4\xb6\x61\x0b\xe3\x39\xec\x97\x9a\x30\xff\ +\x29\x5f\x5c\x8d\x01\x5c\x4a\xab\x53\x5f\xa4\xf5\x9a\xf8\xf3\x70\ +\x1f\x39\xa2\x01\x52\x22\x9c\x33\xed\xd7\xb4\x57\x9b\x5f\xec\x2f\ +\xd7\x27\xb9\x47\x52\xfb\xa4\x0e\x03\xa9\x54\x0a\xa9\x54\xd8\x87\ +\x9e\xb0\xb9\xa1\xbc\xcd\x84\x99\x49\xe5\x4f\x63\x72\x73\x18\x6e\ +\xd2\xc0\xab\x80\x4c\x55\xda\x79\x07\x6a\x26\xa5\xce\xc2\xab\x7f\ +\x94\x52\x74\xb4\xa7\x71\xc3\xfa\x7e\x6c\x18\xed\x41\x9a\x10\x79\ +\x8e\x14\x23\x94\x52\x1c\x3a\x74\x1c\x8f\x3d\xb5\x13\xe7\x0c\xdc\ +\x61\x28\xb5\x4f\xd7\x16\xc6\xff\xdd\xf4\xe1\x27\x1f\xb7\x2b\x05\ +\x4b\xb8\x68\xf5\x02\x40\x5c\x80\x5a\xb6\x80\xa4\x2b\x73\x59\xab\ +\x7e\x84\x10\x14\x0a\x45\xec\xd8\xf5\x2a\x3a\xb2\xed\xbe\x0a\xe0\ +\xc6\x46\x64\x56\x1e\xea\x13\x45\xc5\x9a\x42\x6d\xd4\x10\x74\x54\ +\x76\x6d\x60\x8c\xb6\xc6\x69\xaf\x9b\x58\x7c\x5b\x08\x21\xc8\x76\ +\x64\x31\xb2\x6e\x0c\xab\xd7\xae\xc5\xba\x55\xdd\xe8\xeb\x6a\x63\ +\x4c\xe7\x7c\xd3\x04\x13\x15\x87\x28\xc1\x21\x95\x01\x2b\x02\xac\ +\x82\xa9\x0d\x31\x66\x91\xeb\x08\x93\xa8\x22\x4a\x46\x75\x8a\xde\ +\xae\x36\xdc\x7c\xe5\x20\xd6\x0c\x76\xf1\xdd\x90\x8a\x72\xdc\x61\ +\x5e\x7b\xfd\x00\x9e\x7c\x76\xb7\xa1\x3b\x4c\x6d\x7f\x65\xf6\xcc\ +\x9f\xce\x1c\x7e\x6a\x37\x0d\xdc\x61\x28\xcc\x01\xa5\x55\xcc\x6a\ +\xc9\x55\xbb\x28\xf1\x80\x4a\x64\x3d\x51\xe7\x51\xe1\xa6\x12\x76\ +\x93\x00\x00\xa5\x72\x15\xfb\xde\x3a\xb6\xc8\x97\x72\xd9\xdf\xb7\ +\x45\x93\x8e\xce\xfd\xb8\xf1\x8e\x3b\xf0\x93\x9f\x78\x2f\xfa\xba\ +\xdb\xfd\x7d\xf6\x24\x12\x15\x62\x24\xf3\xc0\xc9\x07\xad\xa8\xa5\ +\x84\x19\xb0\x52\xba\xe6\x85\xb2\x29\x26\x91\x62\xf9\x17\x65\x52\ +\x57\x86\xfa\x3a\x71\xf3\x95\x03\x58\xd5\x93\xd5\x8e\xf4\x02\x00\ +\x49\x11\x14\x0b\x45\x3c\xff\xc2\x1e\xec\x78\xe1\x75\x14\x8a\x26\ +\xee\x30\x95\x9d\xc5\xf1\xc3\x5f\xcf\x9f\xd8\x79\x88\xb9\x3a\x8b\ +\xc5\x78\x9a\x21\x8d\xd6\x55\x2f\x18\x53\x20\x9a\x51\xd5\x0b\x58\ +\x4d\x05\xb6\x14\x21\x8d\xc1\x61\x6c\x59\xd4\xca\x96\xb5\x94\x4b\ +\x45\x1c\x3f\xf8\x36\xca\x1f\xbc\x15\xa9\xa1\x1c\x6c\xcd\xf3\x46\ +\xa0\x63\x92\xf2\x8e\xc8\xa1\x4b\x09\x33\xc6\x6c\xbf\x64\xcd\xda\ +\xe6\x6a\x56\xa5\x02\x23\xfd\x88\x9e\xd7\xf6\xb5\xab\xba\x70\xd3\ +\x95\x03\xc8\x75\x2a\xdc\x61\x98\x71\x47\xb8\xee\x30\x4f\x3f\xfb\ +\x22\x5e\x79\xed\x2d\x43\x77\x98\xe2\x43\xf3\x67\x5f\xfb\x8b\xc2\ +\x85\x37\xcf\x63\xf9\x3f\x5c\xcd\x56\x2b\x9b\xc2\x16\xeb\x55\xfd\ +\x9a\x0d\x58\x16\x12\x59\x96\x42\x08\x41\xa9\xb0\x80\xf9\xfc\x2c\ +\x40\x46\xa0\xb2\x2a\x13\xef\x43\xa2\xd1\x5b\x89\xab\x56\x05\x2a\ +\x1e\x03\x56\xf0\xe6\x7e\x89\x60\xa5\x61\x53\x41\xb1\x1a\x56\x25\ +\xab\x77\xbc\x31\x9d\x8d\x77\xdc\x61\xae\x5c\xdd\x83\xeb\xd7\xf7\ +\x21\xdb\x96\x0e\xd9\x78\xc1\xe9\xe7\xf9\x0b\x97\xf0\xd8\x53\x3b\ +\xf1\xd6\xc1\x77\x4c\xdc\x61\xe6\xad\xf2\xdc\x7f\xce\x9f\xd8\xf5\ +\xbd\xf2\xf4\xc9\x59\xa8\x8d\xe6\x54\xf8\xd5\x85\x9b\xa6\x6b\x34\ +\x3c\x4a\x9a\x0d\x50\x46\xa2\x02\xaa\x45\x37\xa8\xdb\xb5\xca\xe9\ +\x54\x5b\xd7\x02\x80\x9e\x26\xd7\x9b\x48\x13\x84\xda\x14\x95\x72\ +\x49\x0a\x67\xb1\x49\x87\x53\x01\x9b\x22\x2e\x40\x05\x13\x3d\xfd\ +\xd1\x3e\x04\xcc\x4a\x9c\xbd\xab\xf5\xc1\x83\x68\x08\x8f\x16\x16\ +\xd3\x6c\x0a\xb4\x67\xd2\xb8\x6e\x5d\x2f\xae\x59\xd3\x8b\x4c\x8a\ +\x70\xab\x1f\xa8\x48\xd8\xb1\xe3\x27\xf1\xf0\x13\xcf\xe3\xe4\xe9\ +\x0b\x26\xee\x30\x97\xaa\x85\xa9\x6f\xcf\x1e\x7d\xe6\xc1\x5a\x71\ +\xda\x73\x87\x91\x2e\x8d\xee\x92\x99\xdc\x96\x25\x0a\xaf\x37\x5d\ +\x1c\x91\xca\x8c\xc3\xa8\xe2\xaa\x73\xa6\x80\x47\xaa\x73\x17\x0e\ +\x65\x3a\x7a\xdf\x06\x49\xdd\xdd\x82\x4e\x27\xd2\x64\xe1\xc7\x33\ +\x18\x4b\xba\x72\xd0\xcf\x9b\xd6\x09\xdf\x60\xce\xa9\x83\xdc\xf6\ +\x56\x22\x31\x0a\x57\xd9\xf8\x36\xa9\xd5\x3f\xbe\xd5\x41\x5b\xba\ +\x3b\x32\xb8\x71\x7d\x3f\xd6\x0d\x75\x07\xab\x8b\xaa\xca\x75\xdd\ +\x61\xde\xdc\x7f\x08\x8f\x3d\xb5\x0b\xe3\x93\x33\x26\xee\x30\xc7\ +\x2a\x73\xe7\xfe\x6c\xe6\xf0\x53\xdb\xa9\x55\xf5\x76\x87\xf1\x2f\ +\x83\x2a\x8b\xe6\xbc\xa5\x2c\x25\x86\x2c\xb9\x11\x3f\x15\x92\xa9\ +\x59\xd4\x31\x2a\x3f\x99\x3d\xbe\x7d\xdc\x2a\xcf\x7d\x0d\xd4\xde\ +\x6f\xda\xf0\x44\x96\x46\xfc\x01\x48\x6f\x3a\x3a\x09\xec\x53\xaa\ +\x3f\x6f\xea\x3a\x11\xf2\xf2\x36\x78\x06\xe4\x88\x3c\xd9\x41\xb7\ +\xaa\x84\xd6\xa0\x2f\xac\x98\x21\x4e\x43\xeb\xef\xce\xe2\xce\x6b\ +\x87\x7c\x9f\x3d\x08\xd9\xfd\x73\x42\x50\xad\x54\xb0\xeb\x85\x3d\ +\xf8\xe1\xc3\xdb\xcc\x40\xca\xaa\xbe\x5a\x9a\x3c\xfa\xdb\xd3\x6f\ +\x3f\xf6\x2c\xb5\xaa\x61\x1f\x71\xf6\x17\x9a\x73\x44\xa4\x33\x55\ +\x17\xe3\xe6\xab\xb7\xde\x66\xb5\x5b\xca\xdf\x8a\xe9\x09\xf5\x30\ +\x2c\x3a\xbe\xf7\xef\x9f\x1d\xbc\xf1\x73\x17\x32\x5d\x83\xf7\x11\ +\x92\x5a\x0f\x42\xda\x22\x76\x6a\x54\xf5\x8d\x2f\xdf\x77\x6a\xe3\ +\xd4\x03\x45\x1b\xa8\x26\x9c\x49\xef\x17\x40\xc3\xd3\x29\x06\xc5\ +\x15\xd5\x11\xa9\x55\xda\xfa\x69\xd8\x9b\x21\xb4\x2d\x32\x9f\xae\ +\x0e\x90\x54\xa6\x2f\x95\xe9\xbc\x1b\x84\x64\xc3\x2a\xa3\x61\x2f\ +\x2a\x91\x8a\x0d\xa8\x04\x71\x95\x35\x7f\xda\x80\xbc\xee\xb9\xaf\ +\xc6\x69\x67\x9a\x2b\xda\x13\xa9\xfe\xf1\x0c\x6e\x75\x5f\x27\x6e\ +\xda\x30\x80\xbe\x6e\xf7\xf1\xa2\xea\x3c\x8e\x3b\xcc\x02\x9e\xd9\ +\xfe\x12\x76\xbd\xf4\x86\xa1\x3b\x4c\x69\x6b\xe1\xc2\xfe\x7f\x37\ +\x7f\xe6\xd5\x93\x90\x59\x54\xbd\xbf\xd0\x9c\xc7\x91\xc5\x56\xfb\ +\x9a\xce\xf0\x74\x40\x25\x9a\x29\xc5\x70\x5d\xfa\x46\xc2\xc9\xd4\ +\x5b\x3f\x3e\x00\xe0\x40\xba\xa3\xbf\x3d\x95\x6e\x4b\x79\x00\x42\ +\x29\x65\xbe\x99\xec\xf8\x33\x3c\xfd\x80\x0f\x77\xdf\x04\x7e\xbc\ +\x89\x7a\x2f\xb5\x58\x96\x62\x80\x9d\xad\x8f\x9d\x08\x14\xe4\xa1\ +\x7c\x1e\x22\xe5\xe3\xf2\x44\xa4\x45\x54\x5a\xa6\x6e\x1a\x9a\x3e\ +\x46\x79\x41\xdf\xa9\x5d\xb3\x73\x63\x77\xdd\xd0\xb5\xe6\x96\x1b\ +\x09\xd2\x5a\xa0\x52\xd9\x6d\x7c\xf6\xa4\xb0\xd9\x48\x9b\x8b\x0a\ +\x53\x06\x4c\x96\x12\xe6\xab\x8c\x1e\xbd\xe3\x6c\x5e\x8c\xa4\x08\ +\xc1\xd8\x50\x37\x6e\x58\xdf\x8f\xce\x2c\x6b\x34\x67\x52\xbb\x87\ +\x29\x42\x30\x31\x39\x85\xc7\x9f\xda\x89\xd7\xdf\x3c\x6c\xe2\x0e\ +\x53\xb2\x2a\x0b\xff\x30\x7f\xea\xe5\xbf\x2a\x4e\x1c\x9e\x84\x1e\ +\xa4\xa4\x8c\x88\x96\xb8\x46\xf6\xb8\xac\xc5\xb4\x9e\xa8\x36\x37\ +\x6b\x74\x50\x99\xde\x74\x66\xba\x0e\xb0\x9a\x15\xee\x49\x0a\x00\ +\xb1\x4a\x33\x96\xe5\x8c\x04\x6a\xc9\x7d\x93\x7f\xbd\x63\x93\x97\ +\xbc\xde\xb2\x4d\xea\x88\x53\x8e\x2e\x2e\x4e\xbc\x77\x6c\x83\xda\ +\x35\x68\x85\x06\xaa\x1e\x33\xe0\x2f\x89\x10\x48\xbc\x6f\x03\xf1\ +\xbf\x1c\x12\x58\x49\x4b\x09\x6b\x76\x1d\x96\x57\x37\x15\x76\x3d\ +\x96\x90\x2d\x58\x43\x2a\x93\x4e\xe1\xea\xd1\x1e\x5c\xbb\xa6\x17\ +\xed\x19\x12\xb1\x64\x30\x70\xfa\xf4\x59\x3c\xf4\xf8\x0e\x1c\x39\ +\x7e\xc6\x0d\x0b\x01\x29\x4a\x67\x6a\xa5\x99\xff\x98\x3f\xfe\xdc\ +\x0f\x2a\x73\x17\x54\xee\x30\xaa\xe3\x7a\xc1\x07\x9a\x7c\x61\x12\ +\x95\x77\xb1\xd5\xb8\xba\xea\x0b\x53\xfd\x5a\x31\xfa\x17\x56\xbe\ +\xf8\xb8\x49\x8c\x4b\xf8\x85\x26\xbe\x1e\x69\x65\x3f\xc3\xfa\xad\ +\x03\xf0\xb0\xeb\xa4\xcb\x17\x96\x2e\xea\x18\xfa\x71\xbb\x90\x8b\ +\x45\xf8\x6c\x32\xa3\x72\xc3\x19\xc0\x92\xb7\xb7\x0a\x5a\xa3\x77\ +\xbf\x8b\x56\xff\x54\x54\x8f\xda\x40\x47\x7b\x1a\x9b\xd6\xf5\xe2\ +\x8a\x91\x1c\x52\x06\xee\x30\x07\x0f\x1e\xc7\x43\x4f\xec\xc0\xb9\ +\x0b\x13\x26\xee\x30\x67\xaa\xf3\x97\xfe\xbf\x99\xc3\x4f\x3e\x6e\ +\x57\x8b\x35\xf0\x20\xd5\x2c\x26\x14\x56\x46\x54\xd9\x51\xf9\x10\ +\x33\xfd\x92\x19\xed\x4d\xa6\x27\xd4\xcb\x9a\xa2\x7e\x75\xe5\xc7\ +\xad\x37\xaa\x1c\x84\x94\x11\xd5\xb6\x46\xca\x08\x03\xa4\xa8\x38\ +\x56\x54\x71\x61\x61\xaa\xbc\xba\xf8\xa0\x4f\xc4\xec\x21\x24\x9a\ +\x03\xce\xc0\xed\x63\x90\x73\x10\x68\x78\x24\x00\x2b\x6e\xf3\x05\ +\x9e\x55\x85\x6d\xa6\xa0\xeb\x86\x14\x4a\x29\x7a\xba\xda\x70\xe3\ +\xfa\x7e\xac\x1e\xe8\x0c\xef\x93\xeb\x0e\xf3\xea\x9e\xfd\x78\x7c\ +\xeb\x8b\x98\x9e\x9d\x33\x71\x87\x39\x50\x9e\x39\xf5\x8d\xd9\x23\ +\xcf\xbc\x44\xa9\x25\x36\xb3\x11\x30\x42\x0b\xca\x88\x2a\xdb\x34\ +\x7d\xdc\xb6\xd5\x0b\x80\x52\x3b\x5a\x39\x3d\xa1\x9e\x32\x9b\x05\ +\x82\x26\xc0\xa0\x6b\x4b\x23\xc0\xd3\x2c\xb0\x8a\x93\x1e\x9a\xf8\ +\x30\x11\xdf\x6b\x6a\x90\x87\xd5\xaa\x98\x90\xe0\x97\xf0\xa7\x60\ +\xf7\xeb\xa3\x61\x30\xaa\xfd\x55\xab\x7f\xe1\x6d\x74\x60\x6e\x55\ +\x6f\x07\x6e\xbc\xa2\x1f\x03\xb9\x76\x80\x65\x6a\x42\x3b\x3c\x77\ +\x98\xe7\x76\xbe\x8a\x6d\x3b\xf7\x98\xba\xc3\xec\x2a\x8e\x1f\xfa\ +\xb3\xfc\x89\x5d\x07\xe1\x9a\x2b\x60\xfe\xd2\x86\xa9\x82\xf5\xa8\ +\x7c\x71\xeb\x6d\x16\x98\xc4\x91\x46\x54\x57\x00\xe6\x2e\x34\xcb\ +\x85\x55\x21\x46\x1a\xd3\x3a\xeb\x01\xa0\x7a\xfb\xda\x08\x58\xb1\ +\x62\xc2\xae\xa0\x48\x03\x7d\x3a\x02\x68\x1f\x1c\x79\x45\x0a\x2f\ +\xcc\xff\x23\xaa\x5c\xf0\x8d\xe6\xc1\x08\x1f\xe1\x54\x40\x9d\x1b\ +\x8c\xa6\x34\xe7\x48\x67\xa7\x72\x65\xcd\x60\x17\x6e\x5c\xdf\x8f\ +\xee\xce\x8c\x52\xd5\x0b\x70\xd0\x71\x87\x79\xe2\xe9\x5d\x78\x69\ +\xcf\x01\x43\x77\x98\xc2\x23\x8e\x3b\xcc\x7e\x6f\x77\x18\xf6\xba\ +\xb5\x0a\xa4\xea\x55\xf9\x10\x11\x6e\x92\x66\xb1\xd8\x54\x68\x1b\ +\xa3\x46\xfd\x1a\x0d\x8f\x93\xb7\x11\x96\x04\x98\xbf\xfc\x30\x28\ +\xcb\xa4\x7d\xf5\xb4\x5d\x97\x07\x11\x61\x26\xf1\x3a\x31\x49\x63\ +\xc4\xa8\x78\x43\xb5\x10\x0e\x7e\x29\x1b\x6f\x09\xdf\x00\xac\x22\ +\x4b\xe7\x0a\x14\xd5\xbf\x28\xa1\x70\xdc\x61\xae\x18\xe9\xc6\x75\ +\x6b\x7b\x5d\x77\x18\xaa\x2c\x1b\xa0\xbe\x3b\xcc\xc3\x8f\xef\xc0\ +\x81\x83\xc7\x61\x53\x44\x8d\xec\x2d\x58\xa5\xb9\xff\x92\x3f\xb1\ +\xeb\x7b\xe5\x19\xdf\x1d\xc6\xab\x3a\xce\x6f\x54\x9c\xaa\x6b\x61\ +\x69\x9b\x01\x6c\xcd\x60\x76\x51\xed\x6f\x28\xdc\x44\xf5\x6b\x15\ +\x7b\x32\x01\x87\xa8\xb6\x98\xd6\xa9\x2a\xb7\x55\x4c\x28\xea\xfd\ +\xaa\xc7\x0e\x05\xc3\x78\x20\x1c\xe8\x00\x75\xbb\xcc\x80\x4a\xd7\ +\x1b\xc8\x8c\xca\xb1\x47\x01\xa0\xaa\x25\x58\x58\x5b\x15\x94\x7b\ +\x2c\x4a\x2a\x5a\x58\x03\xa9\xe3\x0e\x73\xed\x9a\x1e\x5c\xb9\x3a\ +\x87\x4c\x8a\x48\xcb\xc4\x88\x6d\x3e\x7a\xec\x24\x7e\xfc\xd8\x76\ +\x9c\x38\x65\xe4\x0e\x33\x5e\x2d\x4c\xfd\xfb\xd9\xa3\x5b\x1f\xac\ +\x15\x67\xc4\xdd\x61\xe2\x02\x51\xb3\x59\x96\xe2\x6a\xc4\x2e\x4b\ +\x95\xdf\xa4\xec\x46\xeb\x34\x62\x53\x40\x7d\xa3\x7e\x8b\xc1\x9e\ +\x74\xe9\x11\x23\x6d\x33\xd5\x37\x2c\x51\x1c\x2b\x26\x4c\xca\x94\ +\x80\x88\x75\xd0\xe8\x5b\x1a\x64\x95\xd5\x40\xf7\x94\x65\x54\x3e\ +\x9b\xe2\xed\x4c\x61\x4d\x56\x26\x09\x5d\xe7\xc5\xf9\xbf\x2b\x9b\ +\xc6\xa6\xb1\x3e\xac\x5d\xd5\x15\xfe\x85\x70\xdd\x61\xf6\xbd\x71\ +\x10\x0f\x3f\xf9\x3c\xc6\x27\x66\x0c\xdd\x61\xce\x7f\x73\xe6\xf0\ +\x93\xac\x3b\xcc\x72\x01\xa9\x66\x00\x43\xa3\xe0\x03\x4d\xbe\xd0\ +\xcb\x1a\x37\xaf\xa9\x31\xbd\x95\xec\x29\x6e\x1d\xba\x7c\x30\x48\ +\xb3\x5c\xc1\x4a\x25\x51\x4c\x2a\xea\x18\x9a\x38\x5d\x6d\xf1\x18\ +\x15\x73\x95\x1d\x37\x3f\xfe\xb2\x07\xcb\x05\xb3\x1d\x90\x6d\x52\ +\x72\xa1\x1a\x3b\x95\x1b\x28\xa2\x44\x7f\x77\x3b\x6e\x58\xdf\x87\ +\xa1\xde\x0e\x00\x14\x3a\x6d\x2f\x05\x82\x72\xa5\x82\x5d\x2f\xbe\ +\x8e\xa7\xb6\xbd\x84\xb9\xf9\x82\x89\x3b\xcc\x9e\xd2\xd4\xf1\xaf\ +\xcf\x1e\xdb\xb6\x0f\x81\x39\x6e\xb9\x82\x94\xd4\x7c\xcd\x31\x0c\ +\xca\x32\x66\x3a\x21\x69\x1b\x65\x76\x9c\xc4\x59\x8f\xca\x14\x04\ +\x74\xe1\x71\x01\xa8\x91\x32\x9a\xa9\xbe\x35\x5a\x0e\x10\x0e\x14\ +\x71\xf2\xc6\xb5\x4f\x99\xa6\x33\x66\x54\x44\x79\x4e\xfc\xd7\xd8\ +\xd5\xf6\xe0\xd8\xac\xa8\xbf\x84\x0b\x54\x93\x33\xeb\x11\x26\xef\ +\x48\x5f\x07\x6e\x58\xdf\x87\xde\xce\xb6\xd0\xe2\x08\x21\x98\x9f\ +\x5b\xc0\xd3\xdb\x5e\xc4\xf3\x2f\xee\x33\x71\x87\xb1\x5c\x77\x98\ +\x6f\xba\xee\x30\xa6\xaa\x5e\x54\x7c\x2b\x41\xaa\x95\x80\xd1\x2a\ +\xd5\xce\x04\x4c\x01\xc4\xb3\x51\x89\xe7\x71\x18\x4e\xbd\x20\x16\ +\x27\x6d\xab\x18\x91\x4e\xef\x08\x8b\xd3\xa5\x47\x9d\x79\xa3\x8e\ +\xa1\x89\x83\xa2\x3c\x40\xfd\x40\xd5\x09\x1d\x44\x3a\x12\xb5\x35\ +\x03\xad\xcf\x58\xbc\xd9\xe9\x63\x43\xdd\xd8\xb8\xae\x17\x9d\xed\ +\xd1\x6b\x48\x4d\x4c\x4c\xe1\x91\x27\x9e\xc7\x6b\x6f\x1c\x82\x65\ +\x51\x13\x77\x98\x7f\x9c\x3f\xf5\xf2\x77\x18\x77\x18\xf1\xfa\x34\ +\x02\x1e\x4b\xc9\xc8\x9a\xa9\x56\x9a\xf4\x11\x06\x69\xc3\xd2\xfb\ +\x12\xd7\x29\xb9\x51\x96\xd4\x28\x8b\x69\x46\x7b\x5a\xc5\x96\xea\ +\x61\x57\xcd\xb4\x4f\xa9\xe2\xa2\xa0\x20\xa8\x4f\xb9\x85\x8c\xb9\ +\xc8\xab\xae\x9b\xe6\x33\x4f\x4d\x01\x64\xd2\x04\x57\xae\xce\xe1\ +\xea\xd1\x1c\xda\xd3\x29\x7e\x0d\x29\xb1\x6c\x02\x9c\x3a\x75\x16\ +\x3f\x7a\xf4\x39\x1c\x3e\x76\xda\x0f\xd3\x57\x40\x67\x6b\xa5\x99\ +\xbf\x99\x3d\xfe\xdc\x0f\xaa\x8e\x3b\x8c\xc2\x96\xa7\xec\x64\x33\ +\xd8\xcf\x62\x81\x94\xea\xb2\xc6\x2d\xcb\xa4\xbc\xa6\xa8\x7c\x9e\ +\xc4\xb5\x51\x99\xa4\x69\x44\xd5\xd3\x95\x15\x16\xbe\x94\x60\xa5\ +\x4b\x0f\xa8\xdf\xc1\x7a\xec\x53\xaa\xfc\xaa\x34\x71\x41\x4a\xbc\ +\xde\x0d\x01\x15\x10\x80\x40\xa8\xed\x3c\x4e\x79\x4c\x19\x94\x02\ +\x1d\x6d\x69\x5c\xb7\xb6\x07\x63\x43\xdd\x48\x91\xa8\xf2\x29\x0e\ +\xbc\x75\x14\x3f\x7e\xf4\x39\x9c\x35\x70\x87\x01\xb5\xcf\x56\xe7\ +\xc7\xbf\x35\x7d\xf8\xc9\xc7\xec\x6a\xa1\x26\x56\xaf\xb8\x5e\x40\ +\xf4\x0b\xbc\x1c\x41\xaa\x5e\x35\xcd\xa4\xff\xf5\x80\x91\xd1\x63\ +\x52\xcf\xcc\xf4\xa5\x66\x3e\xcb\x09\xac\x00\x73\x40\xd2\xa5\x0b\ +\xbb\x59\x51\xf1\x62\x7d\x61\xe7\x61\xe5\x34\x0c\x52\x00\x6f\xc8\ +\x6e\x42\x81\x5c\x19\xb9\xce\x0c\xae\x1f\xeb\xc3\x48\x7f\x87\x1b\ +\xa1\xae\x81\x10\x82\x5a\xb5\x86\x97\x5f\x7d\x13\x8f\x3e\xbd\x0b\ +\xd3\x33\x46\xee\x30\x6f\x55\x66\xcf\x7c\x7d\xe6\xf0\xd3\x2f\x52\ +\x6a\xb1\xd5\xc7\x55\x73\xe2\x02\x98\x69\x9e\x56\x81\xd4\x72\x61\ +\x6a\x91\xd2\xe8\x9a\xe9\x4b\xc5\x7c\x5a\x51\x3e\x2b\xa6\xea\x55\ +\x23\xea\x9e\x58\x66\xd4\x8d\x6b\xa6\xf1\x5c\x52\x69\x88\xef\x3a\ +\x5c\x9f\xd0\x90\xe6\xd3\xc8\x7c\xe1\x32\x98\x6b\xc7\xf5\xeb\xfb\ +\xd0\xdf\xdd\x1e\x9a\xc7\xd9\x5e\xad\x84\x6d\x3b\x5e\xc6\xb3\x3b\ +\x5e\x35\x75\x87\x79\xc1\xdd\x1d\xe6\x20\xf4\xf7\xa1\x11\xe0\x31\ +\x0d\x33\x4d\x1f\x96\x77\x29\x41\xaa\x1e\xf6\x69\x2c\xf5\xda\xa8\ +\xd8\xe3\x46\xc0\x04\x11\x65\xc5\xa9\x27\x2a\xad\x4a\xea\x55\xed\ +\xea\x61\x57\xba\xe3\x30\x75\x4e\xd7\x66\x20\xbc\x4e\xc4\x28\xcf\ +\x89\x37\xb4\x51\xc9\x94\x99\xca\x47\x2e\xe3\x51\xc4\x40\x93\x55\ +\xdb\xf8\xd5\x03\x9d\xd8\xb4\xae\x07\xdd\xd9\x4c\xf8\x45\x21\x04\ +\x33\x33\xb3\x78\xec\xc9\x9d\xd8\xfd\xea\x01\x54\x6b\xb5\x28\x90\ +\xaa\xda\xd5\xe2\x23\x0b\xe7\xf6\x7e\x6b\xe1\xfc\xbe\x73\x08\xdf\ +\x78\x81\x3d\xae\x07\xa0\xa2\xd2\xd6\x0b\x6a\xcd\x66\x5f\x51\x71\ +\x8d\x96\xaf\xbb\x1e\x91\x52\x0f\xa3\x6a\x44\xd5\x33\x29\xab\x55\ +\x60\x15\x55\x0e\x0c\xf3\xb1\x12\xc5\xae\x54\x69\x9b\x09\x46\xf5\ +\x1b\xcf\xe5\xfb\x40\x11\xf3\xe1\x09\x0a\xa2\x42\x6e\xca\xd7\xa2\ +\xf8\x0d\x5b\x93\x93\xc2\x59\xbc\x6e\xfd\x70\x97\xb3\x86\x54\x1b\ +\xb3\xa5\xba\x22\x1b\x21\x04\xe7\xcf\x5f\xc4\x8f\x1e\xdd\x8e\xfd\ +\x6f\x1f\xf7\xfd\x00\x43\x5a\xbd\x60\x95\xe7\xff\x73\xfe\xc4\xae\ +\xef\x96\xa7\x4f\xcc\x2a\xae\x9b\xc9\x8b\xd5\x8c\x17\x3a\x2a\xbe\ +\x95\x71\xf5\x96\x23\x5d\xcc\x88\xeb\x80\x18\x65\x69\xa5\x59\xdb\ +\x65\xb5\x5a\xd5\x33\x2d\x0f\x4d\xac\x83\x95\x7a\x47\xea\xa2\xca\ +\x84\xa2\x5c\x28\xd2\x35\x4b\xe5\xd3\xe5\x8b\x2f\x4c\xcf\xa9\x0b\ +\x3c\x1c\xf8\xf8\x58\xc5\x2a\x85\x51\x3b\xc6\x38\x76\xae\xb6\x74\ +\x0a\x57\x8f\x76\x63\xc3\x48\x0e\xe9\x14\xbf\x86\x94\x74\x11\x09\ +\x70\xe4\xc8\x09\x3c\xf8\xc8\x36\xbc\x73\xea\xbc\x89\xd1\x7c\xbc\ +\x56\x9c\xfe\xf6\xcc\x91\xad\xff\xd3\xdd\x1d\x46\x75\xff\xe2\x00\ +\x94\xee\x38\x0e\xb0\xb5\x02\xc0\x96\x82\x91\xc5\xb9\x0e\xb1\xa4\ +\x91\x35\xd3\x1b\x55\xc5\x9a\x05\x56\xac\x98\xa8\x7d\x26\x20\x07\ +\xc3\x36\x88\xe5\xc2\xb0\x4c\x28\xf2\x46\xa5\x37\x55\xe3\xe2\xa6\ +\x75\xd3\x99\x4e\x4f\x70\xd6\x38\x20\x62\xe9\x0a\x3e\x46\xd9\x34\ +\x54\x5f\x9e\x7f\x44\x1d\x77\x98\xeb\xd6\xf6\x62\xcd\x40\xa7\x33\ +\x8a\xa8\x9c\x24\x45\x7d\x77\x98\xbd\xfb\x0e\xe2\xc7\x8f\xed\xc0\ +\xa5\x89\x69\x83\x85\xee\xac\xe3\xd5\xb9\x8b\xdf\x98\x3e\xfc\xe4\ +\xb3\xb4\x56\x16\xdd\x61\xd0\xe2\xe3\x46\x40\x28\x2c\x5d\xa3\x69\ +\x1a\x2d\xb3\xde\x76\xc4\x92\x46\x37\x77\x58\x0e\x60\x15\x55\x07\ +\x10\x1f\xc0\x60\x90\x0e\x30\x07\xbb\x7a\x8e\xc3\x24\x2e\x10\x45\ +\x95\x4d\x89\x89\x8d\x4a\x20\x4c\x22\xa5\xe6\x2e\x84\xc4\x82\xa8\ +\x0f\x5c\xde\xca\x0a\xc1\x39\x40\x29\x45\x6f\x77\x1b\xae\x5f\xd7\ +\x87\xc1\x9e\xf6\xf0\x8e\x10\x82\x4a\xb9\x82\xe7\x5f\x78\x0d\x4f\ +\x3c\xb3\xdb\xcc\x1d\xc6\xae\xee\x29\x4f\x9f\xfc\xb7\x33\x47\xb6\ +\xbe\x2e\x5c\x3f\x13\xf6\xd4\xac\xe3\xe5\xa6\x06\xd6\x5b\xd6\xa2\ +\x82\x14\xd0\xdc\x5d\x68\x96\x2b\x58\xc5\x89\x63\x25\x0e\x20\x85\ +\xe5\x81\x41\x3e\x55\x1a\xc0\xec\xe6\xea\x54\x97\x28\x95\x4e\xf7\ +\xb2\x2a\x44\x54\xd9\x9c\xe2\xfd\x4a\x7c\xc4\x91\x55\x3b\x8e\x55\ +\x85\xc8\x70\x6f\x07\x36\x8d\xf5\xa2\xa7\xa3\x0d\x61\x66\x78\x42\ +\x08\xe6\xe7\xe7\xf1\xe4\xd6\x17\xb0\xe3\xc5\xbd\x28\x97\x4d\xdc\ +\x61\xca\x5b\x8b\x97\xde\xfa\xc6\xdc\xa9\x97\xde\x41\xf8\x9a\xe6\ +\xaa\x30\x13\x15\xa6\x59\x6c\xaa\x9e\x3c\x2b\x01\xa4\x1a\x96\x66\ +\x00\x55\xa3\x60\xd1\x88\x8a\xb6\x98\xf6\xa7\x7a\x0c\xe7\x51\xc7\ +\xaa\xbc\x50\x94\x65\x92\x2e\x2c\x7d\x14\x53\x33\x57\xfd\x38\x74\ +\x22\x3e\xca\x51\xaa\xb8\x20\x0c\x4a\xa9\xd9\x14\x05\x08\xb0\x6e\ +\xb0\x0b\xd7\xad\xe9\x41\x67\x7b\x3a\x62\xa6\x39\xc1\xf8\xf8\x14\ +\x1e\x7a\xec\x39\xec\xd9\x77\xd0\xc0\x1d\x06\x65\xbb\x5a\xf8\xef\ +\x73\xa7\x5f\xf9\xf7\xc5\x4b\x6f\x8f\x23\x00\x29\x53\x70\x52\x5d\ +\xf7\x7a\x01\x4a\x17\xde\x0c\xa0\x89\x9b\x37\x2e\x03\x6a\x14\xa4\ +\x1a\x06\xac\x66\x31\xaa\x66\x80\x15\x50\x1f\x80\xc5\x8d\xd3\xd5\ +\x03\x44\xb7\x0b\x21\x65\xc3\xb0\x4e\x95\x2c\x85\xca\xc7\xf7\xdb\ +\x60\xf5\x04\x2a\xe5\x14\x9e\x49\xca\x56\x44\xa5\x3c\x94\x49\x40\ +\x29\x45\x26\x45\xb0\x61\x24\x87\xab\x56\x77\xa3\x2d\x9d\x92\xcd\ +\x51\x4c\x00\x21\x04\x27\x4e\x9e\xc5\x83\x0f\x3f\x8b\x43\x47\xcd\ +\xdc\x61\xac\x72\xfe\xaf\x67\x8f\x3f\xf7\x5f\x2a\xf9\x73\x0b\x9a\ +\xeb\xd0\x28\x38\xe9\xe2\xea\x05\xa8\xa8\xb4\xad\x64\x4a\xad\x8e\ +\x6b\x48\x5a\xa1\xfa\xb1\xc7\xad\x52\xd1\xe2\x02\x4c\x3d\xec\x4a\ +\x15\xd6\x2c\xc0\x42\x48\x99\x88\xa8\x23\xaa\x2e\x13\x11\xf3\x1a\ +\x33\x2a\x81\x50\x05\xe1\xd4\x19\xf5\x93\x1a\xe5\x63\x58\x50\xbc\ +\x4d\x29\x3a\xda\x52\xb8\x66\x4d\x0f\xd6\xad\xea\x72\x76\x87\xf1\ +\x93\xaa\xd4\x3e\x8a\xfd\x07\x8e\xe0\x87\x0f\x6f\xc3\xd9\xf3\x86\ +\xee\x30\x85\xc9\x6f\xce\x1c\x7e\xea\x11\xab\x3c\xe7\xb9\xc3\xc8\ +\xc5\x86\x83\x4e\x9c\xb4\x8b\x05\x50\x51\xf1\xcb\x15\xc0\x1a\x96\ +\x66\xef\x94\xbc\x9c\xc0\x4a\x97\x1e\x30\x07\x33\x56\x74\xf1\x71\ +\x00\x0b\x9a\x32\xe3\xc6\xe9\xd2\x9b\xd4\xa9\x92\x58\x79\xfc\x8e\ +\x2b\x1e\x4d\x0a\x55\x58\xc0\xa4\x6c\x0a\xe4\x3a\x32\xd8\xb8\xae\ +\x17\x23\x7d\x1d\xa1\x2d\xf0\x76\x87\x79\xe9\x95\x37\xf0\xf0\x13\ +\x3b\x0d\xdd\x61\xac\xb7\x2a\x73\xe7\xbe\x36\x73\xe8\x89\x5d\xd4\ +\xb6\x54\xa5\x47\xbd\x48\x8d\xaa\x7d\xec\x79\x9c\x34\x71\xe2\x1b\ +\x01\xb8\x15\x07\x52\x40\xeb\xb6\x74\x07\x9a\x3f\x0d\xa1\x51\x36\ +\x24\x86\xd5\x3b\xdd\x40\x15\xaf\xab\x4b\x0c\xaf\xd7\x5e\x55\xaf\ +\xca\x67\x9a\x27\x82\x51\x11\xa8\xf6\x3f\x67\x9f\x4e\x0a\xf8\xce\ +\xc8\x41\x3c\xe5\x12\x52\x00\x83\xb9\x36\x6c\x5a\xd7\x8b\xbe\xee\ +\x76\x45\x59\x94\xad\x11\x85\x62\x09\xcf\x6e\x7f\x09\x5b\x9f\x7b\ +\x15\x85\x62\x29\x0a\xa4\x28\xb5\xaa\x3b\x4b\x53\xc7\xbe\x36\x7b\ +\x6c\xfb\xdb\x21\xfd\x8f\x0b\x4e\x61\xf1\x71\x8f\xc5\xcb\x16\x96\ +\xbe\x55\x2c\xaa\x91\xf2\x4c\xe2\x9a\x0a\x50\x9e\xb4\x02\xa8\xd8\ +\x8e\xc4\xb1\x47\xb1\xd2\x6c\x5b\x13\x62\x96\x17\x37\x1e\x9a\x34\ +\xad\x98\x7a\xd0\x4c\x95\x0f\xfe\xb9\xf1\xf4\x04\x41\xe7\xf3\xe3\ +\x1c\xb8\xa2\x52\xfa\xa0\xb2\xd5\x7d\x1d\xd8\xa8\x72\x87\xa1\x6c\ +\x2a\xf8\xee\x30\x8f\x3c\xf1\x3c\x5e\x7c\x79\xbf\x99\x3b\x4c\xad\ +\xf4\x50\xe1\xc2\x9b\xdf\x9c\x3f\xb3\xe7\x2c\xc2\x37\x02\x85\x22\ +\xbc\x5e\x70\xaa\x27\x5d\xb3\x00\x2a\x4e\x7c\x2b\x58\x57\x54\xfa\ +\xa6\x4a\x2b\x81\xca\x6b\xb8\x29\x10\x35\x6b\x94\x0f\x88\x0f\x70\ +\xf5\xc6\xc3\xa0\x0e\xd5\x31\x60\x76\x53\x4d\xd2\x36\x02\x5c\x88\ +\x93\x97\xb2\xff\x09\xc0\xa1\x66\x54\x8e\xa4\x08\xb0\x7e\x55\x17\ +\xae\x5e\xd3\x83\x6c\x26\x25\x81\x14\x7b\x4e\x08\xc1\xb9\x73\x17\ +\xf1\xe0\x23\xdb\xf0\xe6\x5b\xc7\x4c\xdc\x61\x0a\x76\xa5\xf0\xfd\ +\xb9\x53\xbb\xff\xaa\x38\x71\x64\x16\xfa\x7b\xd3\x08\xb3\x6a\x25\ +\xcb\x6a\x36\x18\xd5\x93\x67\xd9\xa9\x7a\xa2\xb4\x1a\xa8\xbc\x0e\ +\xb4\xda\x58\xce\x8a\xe9\xd4\x82\xa8\x3c\xaa\xf8\x7a\x8e\xc3\xa4\ +\x9e\xa9\x07\x51\x69\xeb\x01\x2e\x77\xc2\x67\x34\xab\xf2\x3b\x48\ +\x83\xae\xea\x5c\x5c\x28\xa5\x68\xcf\xa4\x70\xd5\xea\x1c\xae\x18\ +\xee\x76\x76\x87\x11\x0a\x63\x55\x3e\x02\xe0\xf0\x91\x77\xf0\xc3\ +\x87\x9e\xc5\xf1\x93\x26\xee\x30\x74\xc2\x2a\xcf\x7e\x6b\xe6\xc8\ +\x33\xff\x50\x5d\x18\x67\xdd\x61\x54\xfd\x8f\x0b\x5e\xad\x66\x59\ +\x51\x60\xa2\x0a\xaf\xa7\xac\xc5\x04\xb0\x96\xc9\x62\x00\x95\xd7\ +\x91\xc5\x06\x24\x28\xf2\x46\x01\x12\x9b\x07\x86\x65\x21\x22\x0d\ +\x0c\xf2\x84\xd5\x09\x4d\xde\x66\x82\x9c\x11\x48\x09\x19\xdc\x42\ +\x3d\xfd\x8e\x82\x9b\x8d\x4e\x81\x4e\xc1\x1d\x46\x07\x52\x81\x3b\ +\xcc\xdb\x78\xf0\x91\xe7\x0c\xdd\x61\xec\xe3\xb5\x85\x89\xaf\x4d\ +\x1f\x7a\xfc\x69\xbb\x5a\x8c\xf3\xf2\x34\x0b\x9c\x4c\xcb\x6a\x24\ +\x8d\x69\x7c\x54\x58\x54\x99\xcd\x00\xb0\x96\xca\x62\x01\x15\xdb\ +\x21\x53\xfb\x13\x14\xe9\x21\xe4\xad\x57\x75\x63\xcb\x06\xe2\x83\ +\x47\x3d\xaa\x9c\x0a\x68\xea\x05\x2d\xd3\x3a\xe2\xe4\xa9\xeb\x81\ +\xa3\xc2\x9f\x27\x3d\x5d\x6d\xb8\x7e\xac\x17\xab\x7a\xb2\xca\x4c\ +\x2c\x48\x39\xee\x30\x7b\xf0\xf8\xd6\x17\x91\x9f\x33\x71\x87\xb1\ +\xf6\x54\x66\xcf\x7c\x75\xfa\xd0\xe3\x7b\xc0\xb3\x28\x55\xf3\xa2\ +\xc2\x5a\x01\x4e\xa6\xe9\x9a\x09\x50\x8d\xc6\xc7\x05\xbf\x45\x01\ +\x28\x4f\x16\x13\xa8\xd8\x8e\xb6\xca\xfe\x14\x77\x6a\x01\x1b\xaf\ +\x0a\x37\x8d\x17\xeb\xd1\xb5\x13\x9a\xb8\x28\x80\xa9\x07\x80\xe2\ +\xb4\x3d\xc2\x98\x4e\xc3\xa1\xcc\x9d\x96\xee\xd9\xa8\x86\x7a\xb3\ +\xd8\x34\xd6\x2b\xef\x0e\x43\xd9\x1f\xea\xba\xc3\x2c\xe0\xc9\xa7\ +\x77\x61\xfb\x0b\xaf\x1b\xb9\xc3\x50\xab\xf2\x74\x71\xe2\xe8\x9f\ +\xe4\xdf\xd9\x71\x1c\xc1\x6e\xc5\xba\xfe\xd5\x1b\x56\x2f\x38\x85\ +\xc5\x99\xe4\x89\x03\x50\xf5\xe4\x5b\x51\x2c\x8a\x95\xa5\x00\x2a\ +\xaf\xa3\xad\x56\xf7\x4c\xe3\x4d\xc2\x4d\xe2\xc3\xda\x6e\x1a\xa7\ +\xeb\x77\x58\x5d\xf5\x4a\x2c\xd6\xe6\xe0\x14\xe5\x0d\xe6\xc2\x84\ +\x4f\x02\x8a\x75\xab\xba\x70\xdd\x5a\x77\x77\x18\xf0\x35\x70\xf6\ +\x28\x77\x77\x98\x1f\x3f\xba\x1d\xaf\xee\x35\x74\x87\xa9\x95\xfe\ +\xdb\xc2\xb9\xbd\x7f\xbe\x70\x6e\x2f\xeb\x0e\x23\xd4\x22\x35\x1b\ +\x06\xe1\x8d\x82\x57\x3d\xec\x49\x15\x57\x2f\x40\x99\xd4\xd9\x6c\ +\x35\x70\x51\x65\xa9\x80\x8a\xed\xf0\x62\xa9\x7b\xcd\x04\x2c\xd3\ +\x34\xba\x7a\x75\x71\x26\xea\x70\x23\x13\x4c\x75\x62\x60\xa3\x0a\ +\x9e\x59\x6f\xfe\x39\x3b\xe1\x33\xed\xb9\xc3\xb8\xbb\xc3\xc8\xeb\ +\xa7\x07\x01\x84\x10\x9c\x3c\x79\x16\x3f\x7c\xe8\x59\x1c\x3c\x7a\ +\xca\x0d\x0b\xad\x7b\xd6\xaa\x2c\xfc\x87\xfc\x3b\x3b\xbf\x57\x9e\ +\x3e\x61\xe2\x0e\x03\x83\xb8\x46\xc1\x6a\x31\x55\xc0\xb0\xf0\xc5\ +\x56\x03\x97\x44\x96\x12\xa8\xd8\x0b\xd0\x4a\x75\x4f\x77\x6c\x62\ +\x67\xaa\x07\xb0\xe2\xb0\x27\xc4\x28\x37\xae\xc4\xc9\x6f\x1b\x2d\ +\xf3\xe2\x0b\x03\x3d\x94\xa0\x2d\x93\xc2\xc6\x75\x7d\x58\x33\xd8\ +\x89\x34\x21\x8c\x63\xb1\xfa\xdd\xdf\x7f\xe0\x08\x7e\xf8\xd0\x36\ +\x9c\x39\x3f\x6e\x32\xb2\x77\xb6\x56\x9a\xfd\xfa\xcc\xe1\x27\x7f\ +\x54\x2b\x4e\xd7\x0c\xfa\xd4\x88\x0a\x28\x86\xb7\x42\x25\x8c\x9b\ +\x46\x97\x27\x0e\x00\xa9\xc2\x97\x3d\x8b\x62\x65\x39\x00\x15\xd0\ +\x5a\x75\xcf\x74\xa4\x0f\xa8\x5f\xb5\x43\x44\xb8\x2a\xae\x1e\x3b\ +\x95\xaa\x6d\x71\xd5\x40\x4d\x39\x26\x40\x45\x15\x21\x14\xbd\x5d\ +\x6d\xe8\xeb\x6e\xf3\xcf\x95\x95\xb2\xee\x30\x8f\xef\xc4\xd4\x4c\ +\xde\x64\x64\xef\xad\xda\xc2\xf8\x1f\x4d\xbd\xf5\xf0\x0e\x6a\xd7\ +\xd8\xb6\xab\x1b\xd3\x9c\xf0\xa5\xb4\x57\x35\x0b\xdc\x5a\xa1\x06\ +\x2e\xa9\x2c\x17\xa0\xf2\xc4\x14\x90\x4c\x80\x2d\x2c\x1e\x0d\xa4\ +\x89\x33\x47\xaa\x11\x95\xcf\x44\x9a\x61\xab\x72\xfa\x19\xc5\x6c\ +\x00\x77\xf2\x39\x95\xf4\xb4\xa8\xac\x84\x10\x14\x5d\x77\x98\xa7\ +\xb7\xbf\x62\xe6\x0e\x63\xd7\x9e\xaf\xcc\x9e\xf9\xa3\xe9\x43\x4f\ +\xec\x47\x60\x34\x37\x79\x89\x56\xb2\x0a\x28\x9e\x2f\x26\x40\x45\ +\xd5\xb7\xa4\xb2\xdc\x80\x0a\x68\xcc\xfe\xd4\xac\x99\xe4\x26\x69\ +\xe2\xce\x91\x8a\xcb\x7a\x16\x43\xe5\x03\x93\xd6\x28\xbd\xa3\xee\ +\x05\xab\x24\x44\xa1\x14\x21\xc0\xcc\x4c\x1e\x8f\x3e\xf1\x3c\x5e\ +\x78\xf9\x4d\x13\x77\x98\x1a\xb5\x2a\x3f\x2a\x8e\x1f\xfe\x5a\xfe\ +\xc4\xce\x33\x50\xef\x0e\x63\xd2\xbf\x46\x54\xc0\x56\xb1\xaa\xb0\ +\xb4\xad\x3c\x5e\x51\x6a\x9e\x4a\x96\x23\x50\x79\x62\x62\x7f\x6a\ +\xc5\x4c\xf2\x7a\x66\x9b\x37\x73\x94\xaf\xd1\x89\x9d\x3a\x09\x2b\ +\xc7\x33\xa6\x1b\xd7\x11\x98\xa1\x18\x23\xb9\x10\x97\x22\x04\xe7\ +\xce\x5d\xc2\x8f\x1e\xd9\x8e\x37\xde\x3a\x0a\x9b\x46\xb9\xc3\x60\ +\xc1\xae\x95\xbe\x3b\x7f\x66\xcf\xb7\x0b\x17\xde\x9c\x86\x1e\xa4\ +\x94\x4d\x31\x08\x8f\xc3\xb6\x16\x43\x05\x0c\x8b\x6b\x36\x40\xa9\ +\xc2\x4d\xd8\xe4\xb2\x90\xe5\x0c\x54\x80\x9a\xbd\xc4\x1d\xbd\x6b\ +\x16\x18\xe9\xca\x6d\x24\xae\x11\x95\x0f\x75\xe6\x55\x89\x91\xea\ +\x17\x5d\x08\x2f\x87\x8f\x9e\xc0\x0f\x1f\xda\x86\xe3\x27\xcf\x81\ +\x10\x82\xf0\x1a\xe8\x84\x55\x59\xf8\x66\xfe\xf8\x8e\xff\x5a\x9e\ +\x39\x55\x82\x5a\xdd\x33\xa9\x36\x2a\x5c\x17\xb7\x58\x2a\x60\x58\ +\x5c\xb3\x40\xac\x5e\x35\x71\xd9\xca\x72\x07\x2a\x4f\x4c\x41\x65\ +\x31\x5c\x5f\xe2\xa8\x7f\xcb\x5d\xe5\xf3\x84\x92\x08\x63\xba\x69\ +\xa1\x84\x00\x96\x65\x63\xdf\x1b\x07\xf1\xa3\x47\x9f\xc3\xc5\xf1\ +\x68\x77\x18\x50\xfb\x78\xad\x34\xfb\xd5\xe9\x83\x8f\x3e\x6e\x95\ +\xe7\xc5\xdd\x61\xea\x05\xaa\xb0\xf8\xc5\x50\x01\xa3\xce\xe3\x02\ +\x54\x23\x69\x56\x2c\x40\x79\xb2\x52\x80\xca\x93\x66\x03\x96\x2a\ +\x0d\x42\xf2\x34\x92\x6e\x39\x4f\xec\x8c\x5e\xe6\x85\xc2\x77\xe7\ +\xd3\xe1\x0e\x21\x04\x95\x4a\x05\x3b\x5f\x78\x1d\x8f\x6f\x7d\xc1\ +\xcc\x1d\x86\xda\xaf\xd6\x16\xc6\xff\x60\xf2\xc0\x8f\x5e\x02\xa5\ +\x04\xf1\x40\x4a\x68\xa1\x71\xb8\x69\xda\x46\x59\x55\x58\xfc\x62\ +\x80\xd8\x8a\x07\x28\x4f\x56\x1a\x50\x79\xd2\x28\x60\x85\xa5\x69\ +\x96\xf1\x1c\x11\xf1\xd4\x20\x2c\x6e\xb9\xf5\x48\xe0\xeb\x17\xa9\ +\xfd\x39\xd5\x8a\x6b\x9b\x13\x00\x24\x45\x30\x3f\x5f\xc0\x53\xcf\ +\xbc\x80\xed\xbb\x5e\x47\xb9\x5c\x89\x02\x29\x9b\xda\xb5\x27\x2b\ +\xb3\x67\xfe\xdf\xe9\x43\x4f\x1c\x41\xb4\xaa\xb7\x18\x2a\x60\x3d\ +\x4c\x2b\x6e\x7c\xa3\x00\xd5\x48\x9a\x15\x07\x50\x9e\xac\x54\xa0\ +\xf2\xa4\x5e\xc0\xaa\x67\x1e\x54\x58\xba\x46\x1d\x8c\xeb\x05\x2e\ +\xd3\xf2\xa3\x84\x82\xa4\xa8\x3e\x52\x77\xe6\x56\x4d\x08\x26\x26\ +\xa6\xf1\xf0\xe3\xcf\xe1\x95\xd7\xdf\x86\x65\xd9\x91\xee\x30\xd4\ +\xaa\xfe\xd7\xc2\xa5\x83\xdf\x98\x3b\xb9\xeb\x22\x1a\x33\x9a\x37\ +\x12\xdf\x2c\x15\x50\x0c\x6b\xa5\x0a\x18\x96\xee\x5d\x07\x50\x9e\ +\xac\x74\xa0\xf2\x24\x8e\x61\xbc\x51\x1b\x55\x54\x79\xcd\x70\x30\ +\x5e\x4c\x5f\x3e\x0a\x80\xd6\x67\x4a\x77\xfc\xf3\x4e\x9d\x3a\x8b\ +\x07\x1f\xd9\x86\x83\x47\x3c\x77\x98\xd0\xd2\x66\xed\x5a\xe9\x2f\ +\x17\xce\xec\xf9\xeb\x85\x0b\x6f\xce\xa1\x39\x20\x65\x92\x76\x31\ +\x55\xc0\xa8\xf3\x7a\xd2\x36\x6a\x68\x5f\xd1\xf2\x6e\x01\x2a\x4f\ +\xe2\x8e\xf0\xb1\x79\x74\x12\x97\x3d\xc5\xb5\x53\x99\xb4\xc1\xa4\ +\xec\xb8\xc2\xcf\xf2\x26\xd1\xc6\x74\xd5\x76\x56\x07\xde\x3e\x86\ +\x07\x1f\xd9\x86\x33\xe7\xcc\xdc\x61\xec\x6a\xe1\x8f\x67\x8e\x3e\ +\xf3\x3f\x2a\xf9\x73\xd5\x3a\xfb\xd4\x6c\x15\xb0\x59\x00\xb6\x9c\ +\x58\xd6\xbb\x06\xa0\x3c\x79\xb7\x01\x95\x27\xcd\x9c\x6e\x10\x96\ +\xae\x51\x95\xaf\xd1\x3c\xcd\x9b\x99\x6e\xba\x5d\x16\x0d\xdc\x61\ +\x5e\xdd\xb3\x1f\x0f\x3f\xb9\x13\x93\xd3\x79\xa4\xa2\x47\xf6\x0e\ +\xd4\x4a\xf9\xdf\x9f\xdc\xff\xc3\x67\xa9\x55\xa9\xf7\xfa\x98\xa4\ +\x6f\x74\x5a\x42\x58\xdc\x4a\x51\x01\xdf\x75\xf2\x6e\x05\x2a\x4f\ +\x9a\x39\xdd\xa0\x19\xbe\x7a\xf5\x3c\x48\xf5\xf8\xf8\x99\xd4\x45\ +\xb9\xb2\x0d\x9d\x92\x09\x21\x28\x95\x4a\xd8\xbe\xe3\x15\x6c\x7d\ +\xee\x15\x2c\x14\x4a\x51\x20\x45\x41\xed\x1d\xd5\x85\x89\xdf\x9b\ +\xdc\xff\xc3\x7d\x6e\x9d\x81\x01\x3f\x9e\x98\xa6\x8f\x0b\x56\xba\ +\xf0\x56\xab\x80\xe2\x79\x02\x50\x1a\x79\xb7\x03\x95\x27\x71\xa7\ +\x05\x44\xa5\x6b\xc6\xc4\xcd\x46\xe7\x4c\x35\x92\x57\x71\x5d\x22\ +\x66\xa6\x53\xea\xbb\xc3\x3c\xfe\xd4\x2e\xbc\xf0\xca\x9b\xa8\x56\ +\xa3\x77\x87\xa1\xb6\xf5\xa0\xe3\xb3\xf7\xf8\x49\x00\x69\xa6\xde\ +\x46\x5f\xae\x7a\xc0\x28\x2c\xbe\x59\x86\xf5\x46\xa7\x34\x24\xe0\ +\xa4\x90\xcb\x05\xa8\x58\x69\x06\x7b\x0a\x13\x15\x03\xaa\x67\xdd\ +\xa9\x7a\xa4\x7e\x75\x2a\x14\x70\x08\x08\x21\x38\x7f\x61\x1c\x3f\ +\x7a\x78\x9b\xe3\x0e\x63\x47\xbb\xc3\x50\xab\xfa\x37\xc5\x89\xc3\ +\x7f\x9e\x7f\xe7\xf9\x49\x38\x20\xd5\x08\xb8\xd4\x93\xbe\x15\x76\ +\x29\x55\x58\x33\x55\xc0\xb8\x79\x2f\x0b\xb9\x1c\x81\xca\x93\x7a\ +\x0d\xe4\x8b\x35\xca\xd7\xec\x39\x53\xa1\xbe\x7e\x61\xeb\x51\x11\ +\x00\xc7\xde\x39\x8d\xed\xcf\xbf\x8a\xa3\xef\x9c\x71\xdc\x61\xc2\ +\x4d\x52\xe3\xb4\x56\xfe\xfa\xfc\xd9\x3d\xdf\x5f\x38\xff\x46\x11\ +\xcd\x1f\xd9\x33\xcd\xd7\x8c\xb9\x55\xaa\xb0\xa5\x54\x01\x2f\x4b\ +\xb9\x9c\x81\x8a\x95\x66\x81\x96\x89\x2c\x99\x9b\x0c\x78\xb5\x4f\ +\x88\xd3\x03\x55\xcd\xb2\xb0\x6b\xf7\x3e\x54\xa2\x55\x3d\x00\xf4\ +\x98\x5d\x2d\xfe\xc1\xf4\xc1\xc7\x1f\xaa\x2e\x8c\x8b\xee\x30\x71\ +\xda\xda\x8c\x74\xef\x16\x15\xf0\xb2\x97\x04\xa8\x64\x79\xb7\xaa\ +\x7c\x61\xf5\x50\x42\x52\xd0\xe1\x18\xa5\x14\xd5\x9a\x65\x32\xfd\ +\xe0\x15\xab\x32\xff\x3b\x13\x6f\xfc\xe3\x0b\xd4\xaa\x34\x0a\xaa\ +\xcd\x4c\xbb\x52\x55\xc0\x44\x5c\x49\x80\x2a\x5c\x96\xd3\x28\x5f\ +\xbd\x62\xe6\xeb\x17\x73\x5f\x3f\x41\x2c\x50\xfb\x89\x5a\x71\xfa\ +\x5f\x4f\xbc\xf1\x8f\x07\x61\xa6\xea\x85\x49\xb3\xc1\xad\x19\x2a\ +\x60\xab\x98\x56\x02\x4e\x06\x92\x00\x95\xb9\xbc\x1b\x55\xbe\x20\ +\x0d\xa9\xbb\x6d\x25\x4a\xad\xbf\xab\xe6\xcf\xff\xf1\xd4\xdb\x8f\ +\x9c\x47\xe3\x20\xa5\x6a\x7f\xa3\x69\x9a\xa1\x02\xd6\x33\x09\xd4\ +\xb4\xec\x44\x22\x24\x01\xaa\xfa\x24\x6a\x76\xf9\x62\x39\x18\x37\ +\x8b\x7d\x85\xfa\xfa\x85\xc8\x2c\xb5\x6b\x7f\x5e\x9e\x3e\xf9\xed\ +\x99\x23\x4f\xe7\xb1\x34\x20\xd5\x8c\x74\xcd\x9a\x9d\x5e\x4f\x79\ +\x89\x18\x48\x02\x54\x8d\x8b\x89\xcd\xa9\xd1\xb9\x5b\x26\xac\x48\ +\x55\x96\xae\x8d\x8a\xf2\x63\xab\x7e\x67\xa8\x55\xfd\xa3\xf9\xb3\ +\xaf\xfd\x60\xe1\xdc\xeb\xf5\xba\xc3\x44\xc9\x62\xa8\x80\xcd\x48\ +\x9f\x00\x53\x8b\x25\x01\xaa\xe6\x4b\xb3\x41\x2a\x62\x09\xe1\xb0\ +\x91\x3c\x23\x70\x23\x70\xa6\x27\xc4\xe9\xe2\x9b\xb4\x56\xf9\x9d\ +\xa9\x83\x8f\x3e\x55\x9d\xbf\xe4\xd5\xd3\xea\x17\xb3\x51\x15\xb0\ +\x5e\xf5\xb0\x5e\x15\x30\x91\x26\x4a\x02\x54\xad\x97\x56\xcd\x8f\ +\x6a\xa6\xd1\x9d\x02\xc4\x32\x28\x8b\x02\x74\xbb\x5d\x2d\xfd\xe6\ +\xa5\x3d\x7f\xfb\x1a\xcc\x97\x0b\x6e\x86\x34\xc3\x56\x15\x96\xa6\ +\x59\xe1\x89\xb4\x40\x12\xa0\x5a\x7c\xd1\xb1\xa6\x66\x3e\xf8\x71\ +\x40\x8c\x02\x80\x6d\x95\xcf\xa7\xda\x3a\x2f\x01\x58\xa3\x49\x57\ +\x05\xa5\xff\xc3\xaa\x2e\xfc\xde\xf8\x6b\x7f\x77\x1c\xd1\x33\xcd\ +\x5b\x7d\xcd\xea\x4d\xdf\xac\x49\xa0\x89\x2c\xa2\xa4\x1b\x2f\x22\ +\x91\x16\x49\xe3\xbb\x2d\xc4\x28\x3f\xdd\xd6\x5d\x6c\xef\x19\xbd\ +\x1e\x84\xdc\xad\x48\xbb\x00\x4a\xbf\x6d\x55\x16\x7e\x77\xfc\xf5\ +\xbf\x3b\x87\x80\x49\x2d\x85\x2c\x95\x0a\x98\xc8\x12\x4a\x02\x54\ +\x2b\x4f\x5a\x02\x60\x95\xfc\x59\xab\x7b\xed\x6d\x47\x49\x2a\xbd\ +\x1e\xc0\x35\x70\x9e\x0d\x1b\xc0\x09\x50\xfb\xdf\xd4\xca\x73\xdf\ +\x9c\xd8\xfb\x83\x59\xa8\x41\x2a\x7a\xfa\x43\xf3\xa4\xd5\x2a\x60\ +\x22\xcb\x50\x5a\xfd\xd5\x4e\x64\x71\xa5\xd1\x91\x41\xba\xfa\xae\ +\x5f\x5d\x4d\x52\x99\xcf\x80\x60\x03\x80\x12\xb5\xed\x47\xcb\xd3\ +\x27\xde\x9a\x39\xf2\xb4\x55\x47\xf9\xcd\x96\x56\xb9\xe2\x24\xb2\ +\xcc\x65\xa9\x1f\xbc\x44\x16\x5f\x74\xab\x8c\x7a\x12\x36\xf2\xb8\ +\x94\xd2\xe8\x84\xdb\x44\x56\xb0\x2c\x87\x07\x30\x91\x95\x21\xad\ +\x7a\x56\x12\xc0\x49\x24\x52\xfe\x7f\x90\xbe\xf8\xd8\xd4\xeb\x70\ +\x25\x00\x00\x00\x14\x74\x45\x58\x74\x41\x75\x74\x68\x6f\x72\x00\ +\x4a\x61\x6b\x75\x62\x20\x53\x74\x65\x69\x6e\x65\x72\xe6\xfb\xf7\ +\x2f\x00\x00\x00\x49\x74\x45\x58\x74\x43\x6f\x70\x79\x72\x69\x67\ +\x68\x74\x00\x50\x75\x62\x6c\x69\x63\x20\x44\x6f\x6d\x61\x69\x6e\ +\x20\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\ +\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\ +\x6e\x73\x65\x73\x2f\x70\x75\x62\x6c\x69\x63\x64\x6f\x6d\x61\x69\ +\x6e\x2f\x59\xc3\xfe\xca\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\ +\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x30\x2d\x30\ +\x36\x2d\x32\x30\x54\x32\x33\x3a\x32\x34\x3a\x32\x35\x2d\x30\x34\ +\x3a\x30\x30\x77\x9c\x29\x53\x00\x00\x00\x25\x74\x45\x58\x74\x64\ +\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x30\x2d\ +\x30\x36\x2d\x32\x30\x54\x32\x33\x3a\x32\x34\x3a\x32\x35\x2d\x30\ +\x34\x3a\x30\x30\x06\xc1\x91\xef\x00\x00\x00\x19\x74\x45\x58\x74\ +\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\ +\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\ +\x21\x74\x45\x58\x74\x53\x6f\x75\x72\x63\x65\x00\x68\x74\x74\x70\ +\x3a\x2f\x2f\x6a\x69\x6d\x6d\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\ +\x61\x6c\x6c\x2e\x63\x7a\x69\x66\xe3\x5e\x00\x00\x00\x0d\x74\x45\ +\x58\x74\x54\x69\x74\x6c\x65\x00\x47\x6f\x20\x44\x6f\x77\x6e\xf3\ +\xfd\x14\x79\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x07\xe2\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\ +\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\ +\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\x52\x65\x61\x64\ +\x79\x71\xc9\x65\x3c\x00\x00\x07\x74\x49\x44\x41\x54\x78\xda\xd5\ +\x59\x69\x4c\x54\x57\x18\x35\x21\xe2\x8a\xfc\x20\x10\x11\xca\xa8\ +\xd8\x61\x70\x60\x06\x4a\x91\xaa\x58\x94\x68\x54\xa4\x2e\x35\x26\ +\x60\x63\xa8\x68\x30\x06\xe2\xb8\x47\x62\x0d\xee\x8a\x8e\xe2\x86\ +\xbb\x8e\xbb\xb8\xa2\xe3\x2e\x28\x6e\xe3\x8a\x8e\xbb\xb8\x27\x28\ +\x7f\xc4\xa4\x09\x86\x5f\xfe\x38\xbd\xe7\xbe\xe2\x65\x22\x10\x41\ +\x68\x99\x97\x7c\x2c\x61\xde\x7b\xe7\x7c\xdf\xf9\xce\xfd\xee\xa5\ +\x05\x80\x16\x8d\x75\xf5\x8a\x8a\xf2\x16\x61\x13\x51\x24\x22\xa5\ +\x45\x13\x5f\x00\xe4\x97\xc6\x02\x6f\xee\x63\x36\xbf\x1d\xd3\xa6\ +\x0d\x2c\x9e\x9e\x18\xa0\xd7\xe3\x07\x7f\x7f\x9d\x3b\x10\x20\x78\ +\x0b\x01\x67\xb4\x6d\x0b\xc7\xd0\xa1\xb0\xf7\xe8\x81\xe1\xfe\xfe\ +\xe8\xa6\xd3\xa5\x35\x5f\x02\x4a\x32\xf9\x04\x9b\xd9\xa1\x03\x4a\ +\x4f\x9e\x04\x4e\x9f\x76\x03\x02\x4a\x32\xce\x3f\xda\xb7\x47\x6e\ +\x74\x34\x2a\x5f\xbf\x06\x00\xf7\x20\xc0\x06\x8d\x37\x18\xfe\xfe\ +\x53\x68\xbd\x30\x3d\x1d\xa8\xa8\x00\x3e\x7f\xd6\x42\x54\xa1\x99\ +\x12\x50\x2e\xf3\x5b\x60\x20\x2c\xad\x5a\xa1\x74\xff\x7e\xe0\xd3\ +\x27\xd7\x38\x76\xac\x59\x12\x20\x78\x1d\x25\x93\xe4\xed\x0d\xab\ +\x68\xd8\xca\x9b\x37\x81\x8f\x1f\x81\xf2\x72\x15\x1f\x3e\x00\x87\ +\x0f\x7f\x21\x10\xd1\xbd\xfb\x26\xde\xf7\x7f\x13\x20\xf8\x61\x94\ +\x0c\x2d\xd2\x9e\x9c\x0c\xbc\x79\x03\x94\x95\x01\xef\xdf\x6b\xf1\ +\xee\x9d\x16\xa5\xa5\x40\x5e\x9e\x24\x40\x79\xfd\xee\xe7\x87\x04\ +\x9d\x0e\x24\x2e\x9e\x91\x45\x32\xff\x35\x01\x82\xcf\x21\x88\x8c\ +\x76\xed\x50\xb2\x6a\x95\x06\x9e\x0d\xcb\x78\xf5\x4a\x8b\x97\x2f\ +\x81\x17\x2f\xb4\x78\xfe\x1c\x28\x29\x41\x69\x7e\x3e\x1c\x8b\x16\ +\xc1\x36\x68\x10\x2c\x5e\x5e\x60\xe5\x06\x06\x07\x83\xae\x25\x22\ +\xae\x89\x09\x28\xc9\x8c\xf2\xf1\xc1\xfc\xa0\x20\x94\x9f\x38\x21\ +\x81\xe1\xd9\x33\xe0\xe9\x53\x2d\x9e\x3c\x01\x1e\x3f\x06\x1e\x3d\ +\x02\x1e\x3e\xd4\xe2\xc1\x03\xe0\xfe\x7d\xc0\xe9\x04\xee\xdd\xd3\ +\xe2\xee\x5d\x38\x17\x2e\x84\xd5\x68\x64\x65\x64\x55\xd8\x4b\x7c\ +\x47\x93\x10\x60\x86\xe2\xc2\xc2\xa4\x64\xf2\x12\x12\x80\x5b\xb7\ +\x6a\x04\x47\x60\x28\x2e\x06\xee\xdc\x01\x6e\xdf\xd6\x3e\xc7\xde\ +\xb8\x71\x03\xb8\x7e\x5d\x0b\x87\x03\xb8\x76\x0d\xb8\x7a\x15\xb8\ +\x72\x45\x56\xd1\xda\xb5\x2b\x68\xbf\x94\x25\x1d\xad\x51\x09\x50\ +\xab\x2c\x75\x86\x78\x81\x73\xce\x9c\xda\x40\xd6\x08\x0e\x97\x2f\ +\x03\x97\x2e\x01\x45\x45\xc0\xc5\x8b\xc0\x85\x0b\x40\x61\x21\x70\ +\xfe\xbc\x16\x67\xcf\x02\x67\xce\xc8\xb5\xc2\x39\x71\x22\x2c\x2d\ +\x5b\x82\x8e\xc6\x6a\x7c\x1f\x01\x65\x91\x45\x6c\x3c\x4a\xa6\x74\ +\xeb\xd6\x9a\x80\xd6\x0c\xb2\xa0\x40\x03\x78\xee\x9c\x02\x79\xea\ +\x94\x5c\x13\x40\xe9\xd9\xed\xd2\x5e\x21\xfa\x02\x47\x8f\x02\x47\ +\x8e\x00\x87\x0e\xa1\x72\xdd\x3a\x58\x85\x5b\x51\xa6\x94\x2b\x31\ +\x34\x88\x00\xb5\x18\x6b\x36\x4b\xc9\xd8\xfa\xf4\x41\xe5\xf1\xe3\ +\x35\x81\x65\x36\x6b\x07\x4a\x90\xbc\x8f\x40\x35\x90\xd2\x52\x71\ +\xf0\x20\x70\xe0\x80\x74\x27\xec\xdb\x07\xec\xdd\x0b\xec\xde\x0d\ +\xec\xda\x05\xec\xdc\x09\x6c\xde\x0c\x9b\xe8\x0d\xbe\x5b\x91\xa8\ +\x3f\x01\x0b\x5d\xa2\xd0\x62\xd1\x40\xec\xd9\x43\x70\x5a\x66\x5d\ +\xc1\x32\xa3\x0a\xac\x96\x51\x02\x65\x46\xab\x03\xe5\x33\x14\xd0\ +\x1d\x3b\x80\xed\xdb\x81\x6d\xdb\x80\x2d\x5b\x24\x68\x6c\xdc\x08\ +\x6c\xd8\x00\xac\x5f\x0f\xe4\xe4\xc0\x11\x1b\xeb\x42\xa2\xbe\x04\ +\xe2\xe8\x0c\x16\xa1\xfb\x92\x4d\x9b\x98\x79\xbe\x80\x2f\xd4\xc0\ +\xa9\xcc\xba\x66\x95\x2b\xb1\x06\x56\x65\xd4\x66\xd3\xee\xa3\x04\ +\xab\x03\xcd\xcd\x05\xd6\xae\x05\xd6\xac\x01\x68\xc7\x2b\x57\x02\ +\x2b\x56\x00\xcb\x97\x03\xd9\xd9\x80\x70\xa9\x3c\xa3\x51\x36\x77\ +\x4c\x64\xe4\x29\x81\xcf\xa3\xbe\x3d\x90\xd2\xcf\x60\xa8\x90\xf3\ +\xcd\xd4\xa9\xd4\xbf\x06\xc8\x6a\xd5\x5e\x46\x62\xfc\x5d\x49\x40\ +\x65\x56\x03\xcb\xcf\xb8\x82\x5d\xbd\x5a\x81\xe5\x73\x96\x2d\x03\ +\x96\x2e\x05\x16\x2f\x06\xc4\x1a\x81\x05\x0b\x80\x79\xf3\x80\xac\ +\x2c\x80\x86\x21\xde\x6b\xeb\xd4\x09\xec\xc3\x68\xb3\x39\xbb\xde\ +\x2e\x24\x96\xfe\x9e\xbd\xc3\xc3\x9f\xc8\x09\x33\x2e\x0e\x95\xd4\ +\x3e\x25\x43\x00\x4b\x96\xf0\xa5\xcc\x14\x7f\x66\xf6\x08\x4e\x03\ +\x29\x9a\x51\x65\x56\x81\x65\x66\xf9\x59\xde\xf3\x15\xd8\xd9\xb3\ +\x81\x19\x33\x80\x49\x93\x80\x71\xe3\x00\xae\xf0\x62\x2f\x51\x19\ +\x1f\x8f\xf9\xe2\xfd\x74\x42\x81\x27\xb1\xde\x36\x1a\xda\xad\x9b\ +\x1f\x4b\x28\x67\x7c\x11\xa5\xcc\x38\x1b\x9a\x20\x49\x60\xfe\x7c\ +\x60\xee\x5c\x05\x62\xd6\x2c\x60\xe6\x4c\x60\xda\x34\xfe\xac\x81\ +\x62\x05\x27\x4f\xd6\xc0\x65\x64\x00\xc2\x32\x31\x61\x02\x30\x7e\ +\x3c\x90\x9a\xaa\x81\x1d\x35\x0a\x18\x39\x12\x18\x3e\x5c\x02\xc7\ +\x90\x21\xc0\xe0\xc1\xc0\xc0\x81\x28\x8d\x89\xc1\x38\x0f\x0f\xf4\ +\x36\x99\xca\x04\xa4\x36\x0d\x59\x89\x3d\xa2\x4d\xa6\x4c\xee\xb2\ +\xf8\x20\x07\xb3\x56\x5c\xcc\x06\xad\x9b\xc0\x94\x29\xb5\x83\x4e\ +\x49\x01\xc6\x8c\x01\x46\x8f\x06\x92\x92\xea\x24\x80\xfe\xfd\x61\ +\xef\xd2\x45\xda\x6b\x54\x78\x78\x4e\x83\x67\xa1\x70\x83\x21\x96\ +\x59\xa0\xa4\x6c\x89\x89\x94\x14\x5d\x89\xd2\xa8\x8b\x00\x6d\x95\ +\x84\x55\xd0\x04\xd8\x27\xd4\xfe\xd8\xb1\xdf\x44\xa0\x52\xd8\x79\ +\x66\xeb\xd6\x60\x5f\x76\xf4\xf5\xd5\x37\x80\x80\x92\xd4\x2f\x91\ +\x91\x0e\xb9\xc0\xe9\xf5\x94\x14\x47\x05\xda\x5f\xad\x04\x4a\x84\ +\x8c\xec\x69\x69\x55\x41\x67\x23\x79\x45\x88\xee\xc5\xcf\xd7\x41\ +\x00\xfd\xfa\xc1\x11\x12\x22\x5d\x29\xd2\x68\xcc\xa5\x2a\xbe\x67\ +\x3f\xe0\x41\x57\x90\x23\x86\xb7\xb7\xab\xa4\x58\x09\x57\x02\x1c\ +\xa7\x59\x7e\x39\x26\xb0\x97\xb8\xc6\x08\x77\x63\x02\xe8\x70\x8a\ +\x0c\x17\x3b\xca\xac\x16\x02\x10\x46\x92\xd9\xaa\x95\xaa\xc2\xf7\ +\xee\xc8\x7e\x0a\x0b\x1b\x1c\x67\x34\x56\xc8\x21\x8f\x8d\x48\x10\ +\x85\x85\x94\xc6\x57\x04\x08\xdc\x64\x30\x58\xb9\x2b\xe3\x77\xd1\ +\x53\x45\x04\x22\x2a\xc9\xbe\xa2\x24\x15\x11\x1a\x44\x2d\x04\x1c\ +\x82\x34\x93\x61\x0e\x0d\xcd\x66\x22\xbf\x7b\x4f\x2c\x00\xf9\xc7\ +\x44\x44\xdc\xe4\x43\x99\xd1\x72\xbb\x9d\x20\xb8\x0e\x28\x02\x5f\ +\x6f\x29\xdb\x8b\xf0\x11\xa1\x0b\x0b\x09\xf9\xab\xa7\xd1\x58\xcc\ +\xbf\xb3\x9a\xac\x08\xef\x97\x76\x3d\x62\xc4\x57\x04\x2a\x7b\xf6\ +\x84\x45\x39\x92\x4f\x63\x9d\x4a\x78\xf4\x30\x9b\x37\x71\xf5\x26\ +\x08\x27\x7d\x9f\x20\x38\x6a\x4c\x9f\xfe\x2d\x7b\x62\xef\xf0\x90\ +\x90\xb4\x5f\xbb\x77\x2f\x73\x59\x73\x0a\x0a\xe8\x56\x2e\x04\x20\ +\x9a\xd9\xa6\xed\xec\xd0\x35\x28\x68\x58\xa3\x9e\x0b\x09\x8b\x4b\ +\xa6\x2c\x28\x29\x36\x2b\x49\x70\x7a\xb5\x8b\x5d\x98\x22\x50\x77\ +\x35\x45\x6f\x1d\x66\xaf\xb0\x9a\x24\x21\xd7\x9c\xc4\x44\x17\x02\ +\x4e\x83\x41\xf6\x91\x90\xf0\x5e\x71\x9b\x67\xa3\x9e\xcc\x09\x49\ +\x84\x72\xf5\xa6\xa4\xac\x51\x51\x04\x41\x32\xb5\x11\xa8\x75\xcd\ +\x11\x19\x56\x24\x28\xcb\x84\x84\x2f\x04\xd0\xab\x57\x75\x19\xf9\ +\x35\xc5\xd9\xa8\x67\x8f\x88\x88\x3c\x66\x92\x03\x21\x89\x10\x90\ +\x2e\x20\x20\xf9\x5b\x1f\x20\xac\x3a\xd5\x85\x04\x67\x2a\x45\x00\ +\x36\x5f\x5f\xf9\xcc\x80\x8e\x1d\xe3\x1b\x99\x80\xba\x7e\x36\x99\ +\x26\x52\x52\x72\x97\x15\x1e\x5e\x42\x95\xd5\xf7\x8c\x95\x95\x63\ +\x4f\x48\x39\xa6\xa7\x7f\x21\xe0\x10\x16\xce\x2a\x1b\xf5\xfa\x2c\ +\x56\xad\x49\x08\xf0\xe2\x89\xf4\x8f\x9d\x3b\xa7\xfe\x0b\x5e\xd7\ +\x80\x53\x3f\x5b\x52\x95\x3b\xb1\x1f\x06\x0c\x90\x04\xca\x23\x22\ +\xb8\x5f\xe0\x68\x61\xa7\x09\x34\x11\x01\xa5\x6b\x0e\x61\x0d\x3d\ +\x30\xe6\x31\x3d\xdd\x8d\x16\xcd\xa9\x97\x04\x10\x13\xc3\x3e\xa8\ +\xaa\x6c\xa0\x0b\x81\x66\x76\x55\x6d\xb0\x94\x94\x84\x2b\x91\x80\ +\xd5\xcb\x8b\xff\x77\x20\x60\x7d\xf3\x25\xa0\x48\xe4\x53\x32\x9c\ +\xa3\xb8\x41\x22\x01\x7b\x40\x00\xd8\x5f\x34\x07\x77\x20\xa0\x63\ +\xb6\xe9\x68\xf2\xc8\xa6\x6f\x5f\x38\xc4\x88\xcd\x26\x37\x04\x07\ +\x4f\xa5\xf3\x35\x63\x02\xaa\xa1\x59\x05\x4e\xc0\x9c\x7a\x4b\x0c\ +\x06\x4e\xa7\xf2\xd0\x98\xe3\x89\x3b\x10\x30\xb3\x17\x38\xf8\xf1\ +\x50\xa1\xdc\x64\xaa\x4e\xc0\xaf\x79\x13\x50\x24\x9c\x9c\x5e\xe5\ +\xe2\x26\x46\x94\x34\x01\x59\xcc\x61\xc5\xe2\x4f\xfe\xee\x42\x20\ +\x85\x0b\x18\xf7\x20\xdc\x77\x54\x23\x10\xe8\x2e\x04\xbc\xb9\x91\ +\xa2\xa5\xf2\x0c\x2a\xd3\xd3\xb3\x8a\x80\xde\x0d\x08\x28\x4b\xad\ +\x92\x11\xd7\x02\x8e\xe1\xee\x46\xc0\x42\x19\x71\xdf\x41\x5b\xa5\ +\xbd\xba\x1b\x01\x1d\xdd\x88\xdb\x58\xb7\x24\xc0\xab\xaf\xd1\xf8\ +\x96\xa3\x76\x35\x02\x61\x6e\x45\x80\x7d\xc0\x93\x0d\xee\x37\x38\ +\xb2\x73\xda\x75\x37\x02\x66\xfe\xdb\x2b\x3e\x34\x54\xee\x09\xdc\ +\xab\x02\xea\x6a\x43\xe0\x22\xcc\x22\x7c\x88\xfd\x1f\xf9\x92\x41\ +\x48\x3f\x71\x1a\xd8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +" + +qt_resource_name = b"\ +\x00\x05\ +\x00\x6a\x36\x95\ +\x00\x63\ +\x00\x6c\x00\x6f\x00\x73\x00\x65\ +\x00\x03\ +\x00\x00\x74\xc7\ +\x00\x6e\ +\x00\x65\x00\x77\ +\x00\x0a\ +\x03\x87\xc0\x73\ +\x00\x66\ +\x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x5f\x00\x76\x00\x6f\x00\x63\ +\x00\x04\ +\x00\x04\x8c\xaf\ +\x00\x41\ +\x00\x75\x00\x74\x00\x6f\ +\x00\x04\ +\x00\x07\x8c\x04\ +\x00\x71\ +\x00\x75\x00\x69\x00\x74\ +\x00\x07\ +\x09\x8c\x83\x63\ +\x00\x73\ +\x00\x61\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x73\ +\x00\x07\ +\x01\x66\x02\xfe\ +\x00\x7a\ +\x00\x6f\x00\x6f\x00\x6d\x00\x2d\x00\x69\x00\x6e\ +\x00\x08\ +\x0c\x9c\xab\x2c\ +\x00\x72\ +\x00\x65\x00\x73\x00\x65\x00\x74\x00\x61\x00\x6c\x00\x6c\ +\x00\x04\ +\x00\x06\xd0\x25\ +\x00\x66\ +\x00\x69\x00\x6c\x00\x65\ +\x00\x04\ +\x00\x06\xb6\x45\ +\x00\x64\ +\x00\x6f\x00\x6e\x00\x65\ +\x00\x0d\ +\x03\x22\xb9\x5e\ +\x00\x73\ +\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2d\x00\x7a\x00\x68\x00\x2d\x00\x43\x00\x4e\ +\x00\x06\ +\x07\xcc\x8f\xd9\ +\x00\x76\ +\x00\x65\x00\x72\x00\x69\x00\x66\x00\x79\ +\x00\x08\ +\x06\x60\x56\xe4\ +\x00\x7a\ +\x00\x6f\x00\x6f\x00\x6d\x00\x2d\x00\x6f\x00\x75\x00\x74\ +\x00\x09\ +\x07\x4d\x21\xa8\ +\x00\x66\ +\x00\x69\x00\x74\x00\x2d\x00\x77\x00\x69\x00\x64\x00\x74\x00\x68\ +\x00\x06\ +\x06\xcf\x6c\x94\ +\x00\x65\ +\x00\x78\x00\x70\x00\x65\x00\x72\x00\x74\ +\x00\x04\ +\x00\x08\x16\x5d\ +\x00\x7a\ +\x00\x6f\x00\x6f\x00\x6d\ +\x00\x04\ +\x00\x06\xef\xa5\ +\x00\x68\ +\x00\x69\x00\x64\x00\x65\ +\x00\x07\ +\x0a\xb9\x04\x03\ +\x00\x73\ +\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\ +\x00\x04\ +\x00\x07\x98\xc5\ +\x00\x73\ +\x00\x61\x00\x76\x00\x65\ +\x00\x05\ +\x00\x6a\x63\x62\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6f\x00\x72\ +\x00\x0a\ +\x04\xd5\xeb\x87\ +\x00\x66\ +\x00\x69\x00\x74\x00\x2d\x00\x77\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\ +\x00\x05\ +\x00\x78\xa8\xb3\ +\x00\x72\ +\x00\x65\x00\x52\x00\x65\x00\x63\ +\x00\x04\ +\x00\x07\x78\xc6\ +\x00\x70\ +\x00\x72\x00\x65\x00\x76\ +\x00\x06\ +\x06\xac\x2c\xa5\ +\x00\x64\ +\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\ +\x00\x03\ +\x00\x00\x68\x70\ +\x00\x61\ +\x00\x70\x00\x70\ +\x00\x0b\ +\x08\x7c\x58\x4f\ +\x00\x66\ +\x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x5f\x00\x79\x00\x6f\x00\x6c\x00\x6f\ +\x00\x04\ +\x00\x06\xa6\x79\ +\x00\x63\ +\x00\x6f\x00\x70\x00\x79\ +\x00\x04\ +\x00\x07\x66\xbe\ +\x00\x6f\ +\x00\x70\x00\x65\x00\x6e\ +\x00\x0a\ +\x06\x8b\x64\x25\ +\x00\x63\ +\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x5f\x00\x6c\x00\x69\x00\x6e\x00\x65\ +\x00\x0d\ +\x03\x22\xba\xb7\ +\x00\x73\ +\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2d\x00\x7a\x00\x68\x00\x2d\x00\x54\x00\x57\ +\x00\x06\ +\x07\x27\x8c\x33\ +\x00\x6c\ +\x00\x61\x00\x62\x00\x65\x00\x6c\x00\x73\ +\x00\x04\ +\x00\x06\xbb\x04\ +\x00\x65\ +\x00\x64\x00\x69\x00\x74\ +\x00\x04\ +\x00\x06\xec\x30\ +\x00\x68\ +\x00\x65\x00\x6c\x00\x70\ +\x00\x04\ +\x00\x07\x4c\xf4\ +\x00\x6e\ +\x00\x65\x00\x78\x00\x74\ +\x00\x04\ +\x00\x07\xc4\xaf\ +\x00\x75\ +\x00\x6e\x00\x64\x00\x6f\ +" + +qt_resource_struct_v1 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x01\ +\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x01\x2f\x4d\ +\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x2b\ +\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x13\x94\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x01\x50\xbc\ +\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x5a\x63\ +\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x01\x75\xc5\ +\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x57\x62\ +\x00\x00\x02\x54\x00\x00\x00\x00\x00\x01\x00\x01\x7a\x0d\ +\x00\x00\x01\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x89\x01\ +\x00\x00\x02\x62\x00\x00\x00\x00\x00\x01\x00\x01\x80\x44\ +\x00\x00\x01\xec\x00\x00\x00\x00\x00\x01\x00\x01\x53\x46\ +\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\xaf\x24\ +\x00\x00\x00\x44\x00\x00\x00\x00\x00\x01\x00\x00\x32\x5c\ +\x00\x00\x01\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x99\x08\ +\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x01\xf6\x98\ +\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x84\x8a\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x9d\xaf\ +\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\xa7\xba\ +\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x44\xda\ +\x00\x00\x00\xac\x00\x00\x00\x00\x00\x01\x00\x00\x62\xfd\ +\x00\x00\x02\x14\x00\x00\x00\x00\x00\x01\x00\x01\x64\xa7\ +\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x10\x7e\ +\x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x68\ +\x00\x00\x00\xde\x00\x00\x00\x00\x00\x01\x00\x00\x79\xa8\ +\x00\x00\x01\xfa\x00\x00\x00\x00\x00\x01\x00\x01\x5b\x63\ +\x00\x00\x01\xa4\x00\x00\x00\x00\x00\x01\x00\x01\x26\xf1\ +\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x83\x37\ +\x00\x00\x02\x34\x00\x00\x00\x00\x00\x01\x00\x01\x6c\x74\ +\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x7d\xde\ +\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x6d\xc3\ +\x00\x00\x01\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x4e\x15\ +\x00\x00\x00\x52\x00\x00\x00\x00\x00\x01\x00\x00\x39\xdb\ +\x00\x00\x01\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x8d\xf5\ +\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x49\x29\ +" + +qt_resource_struct_v2 = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x01\x2f\x4d\ +\x00\x00\x01\x75\xf3\xca\x7e\xa3\ +\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x0c\x2b\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x13\x94\ +\x00\x00\x01\x75\xe3\x7f\xf9\x6b\ +\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x01\x50\xbc\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x5a\x63\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x01\x75\xc5\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x57\x62\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x54\x00\x00\x00\x00\x00\x01\x00\x01\x7a\x0d\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x2c\x00\x00\x00\x00\x00\x01\x00\x00\x89\x01\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x62\x00\x00\x00\x00\x00\x01\x00\x01\x80\x44\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xec\x00\x00\x00\x00\x00\x01\x00\x01\x53\x46\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x96\x00\x00\x00\x00\x00\x01\x00\x00\xaf\x24\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x44\x00\x00\x00\x00\x00\x01\x00\x00\x32\x5c\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x4e\x00\x00\x00\x00\x00\x01\x00\x00\x99\x08\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x01\xf6\x98\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x84\x8a\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x9d\xaf\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\xa7\xba\ +\x00\x00\x01\x75\xe3\x7f\xf9\x6b\ +\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x44\xda\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xac\x00\x00\x00\x00\x00\x01\x00\x00\x62\xfd\ +\x00\x00\x01\x76\x08\x76\xda\x5f\ +\x00\x00\x02\x14\x00\x00\x00\x00\x00\x01\x00\x01\x64\xa7\ +\x00\x00\x01\x74\xde\xd2\xc1\x11\ +\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x10\x7e\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x6c\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x68\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xde\x00\x00\x00\x00\x00\x01\x00\x00\x79\xa8\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xfa\x00\x00\x00\x00\x00\x01\x00\x01\x5b\x63\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xa4\x00\x00\x00\x00\x00\x01\x00\x01\x26\xf1\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x0c\x00\x00\x00\x00\x00\x01\x00\x00\x83\x37\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x02\x34\x00\x00\x00\x00\x00\x01\x00\x01\x6c\x74\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x7d\xde\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x01\x00\x00\x6d\xc3\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x4e\x15\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x00\x52\x00\x00\x00\x00\x00\x01\x00\x00\x39\xdb\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +\x00\x00\x01\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x8d\xf5\ +\x00\x00\x01\x76\x08\x76\xda\x83\ +\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x49\x29\ +\x00\x00\x01\x74\x83\x79\x45\x48\ +" + +qt_version = [int(v) for v in QtCore.qVersion().split('.')] +if qt_version < [5, 8, 0]: + rcc_version = 1 + qt_resource_struct = qt_resource_struct_v1 +else: + rcc_version = 2 + qt_resource_struct = qt_resource_struct_v2 + + +def qInitResources(): + QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, + qt_resource_name, qt_resource_data) + + +def qCleanupResources(): + QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, + qt_resource_name, qt_resource_data) + + +qInitResources() diff --git a/PPOCRLabel/libs/settings.py b/PPOCRLabel/libs/settings.py new file mode 100644 index 0000000000000000000000000000000000000000..7f9a4fdda63bf3564abb3b281b9602560b6893fd --- /dev/null +++ b/PPOCRLabel/libs/settings.py @@ -0,0 +1,60 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import pickle +import os +import sys + + +class Settings(object): + def __init__(self): + # Be default, the home will be in the same folder as labelImg + home = os.path.expanduser("~") + self.data = {} + # self.path = os.path.join(home, '.labelImgSettings.pkl') + self.path = os.path.join(home, '.autoOCRSettings.pkl') + + def __setitem__(self, key, value): + self.data[key] = value + + def __getitem__(self, key): + return self.data[key] + + def get(self, key, default=None): + if key in self.data: + return self.data[key] + return default + + def save(self): + if self.path: + with open(self.path, 'wb') as f: + pickle.dump(self.data, f, pickle.HIGHEST_PROTOCOL) + return True + return False + + def load(self): + try: + if os.path.exists(self.path): + with open(self.path, 'rb') as f: + self.data = pickle.load(f) + return True + except: + print('Loading setting failed') + return False + + def reset(self): + if os.path.exists(self.path): + os.remove(self.path) + print('Remove setting pkl file ${0}'.format(self.path)) + self.data = {} + self.path = None diff --git a/PPOCRLabel/libs/shape.py b/PPOCRLabel/libs/shape.py new file mode 100644 index 0000000000000000000000000000000000000000..2770bac1df9b62c3023ca10be0da1c2cec0a5002 --- /dev/null +++ b/PPOCRLabel/libs/shape.py @@ -0,0 +1,217 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +#!/usr/bin/python +# -*- coding: utf-8 -*- + + +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + +from libs.utils import distance +import sys + +DEFAULT_LINE_COLOR = QColor(0, 255, 0, 128) +DEFAULT_FILL_COLOR = QColor(255, 0, 0, 128) +DEFAULT_SELECT_LINE_COLOR = QColor(255, 255, 255) +DEFAULT_SELECT_FILL_COLOR = QColor(0, 128, 255, 155) +DEFAULT_VERTEX_FILL_COLOR = QColor(0, 255, 0, 255) +DEFAULT_HVERTEX_FILL_COLOR = QColor(255, 0, 0) +MIN_Y_LABEL = 10 + + +class Shape(object): + P_SQUARE, P_ROUND = range(2) + + MOVE_VERTEX, NEAR_VERTEX = range(2) + + # The following class variables influence the drawing + # of _all_ shape objects. + line_color = DEFAULT_LINE_COLOR + fill_color = DEFAULT_FILL_COLOR + select_line_color = DEFAULT_SELECT_LINE_COLOR + select_fill_color = DEFAULT_SELECT_FILL_COLOR + vertex_fill_color = DEFAULT_VERTEX_FILL_COLOR + hvertex_fill_color = DEFAULT_HVERTEX_FILL_COLOR + point_type = P_ROUND + point_size = 8 + scale = 1.0 + + def __init__(self, label=None, line_color=None, difficult=False, paintLabel=False): + self.label = label + self.points = [] + self.fill = False + self.selected = False + self.difficult = difficult + self.paintLabel = paintLabel + + self._highlightIndex = None + self._highlightMode = self.NEAR_VERTEX + self._highlightSettings = { + self.NEAR_VERTEX: (4, self.P_ROUND), + self.MOVE_VERTEX: (1.5, self.P_SQUARE), + } + + self._closed = False + + if line_color is not None: + # Override the class line_color attribute + # with an object attribute. Currently this + # is used for drawing the pending line a different color. + self.line_color = line_color + + def close(self): + self._closed = True + + def reachMaxPoints(self): + if len(self.points) >= 4: + return True + return False + + def addPoint(self, point): + if not self.reachMaxPoints(): + self.points.append(point) + + def popPoint(self): + if self.points: + return self.points.pop() + return None + + def isClosed(self): + return self._closed + + def setOpen(self): + self._closed = False + + def paint(self, painter): + if self.points: + color = self.select_line_color if self.selected else self.line_color + pen = QPen(color) + # Try using integer sizes for smoother drawing(?) + pen.setWidth(max(1, int(round(2.0 / self.scale)))) + painter.setPen(pen) + + line_path = QPainterPath() + vrtx_path = QPainterPath() + + line_path.moveTo(self.points[0]) + # Uncommenting the following line will draw 2 paths + # for the 1st vertex, and make it non-filled, which + # may be desirable. + #self.drawVertex(vrtx_path, 0) + + for i, p in enumerate(self.points): + line_path.lineTo(p) + self.drawVertex(vrtx_path, i) + if self.isClosed(): + line_path.lineTo(self.points[0]) + + painter.drawPath(line_path) + painter.drawPath(vrtx_path) + painter.fillPath(vrtx_path, self.vertex_fill_color) + + # Draw text at the top-left + if self.paintLabel: + min_x = sys.maxsize + min_y = sys.maxsize + for point in self.points: + min_x = min(min_x, point.x()) + min_y = min(min_y, point.y()) + if min_x != sys.maxsize and min_y != sys.maxsize: + font = QFont() + font.setPointSize(8) + font.setBold(True) + painter.setFont(font) + if(self.label == None): + self.label = "" + if(min_y < MIN_Y_LABEL): + min_y += MIN_Y_LABEL + painter.drawText(min_x, min_y, self.label) + + if self.fill: + color = self.select_fill_color if self.selected else self.fill_color + painter.fillPath(line_path, color) + + def drawVertex(self, path, i): + d = self.point_size / self.scale + shape = self.point_type + point = self.points[i] + if i == self._highlightIndex: + size, shape = self._highlightSettings[self._highlightMode] + d *= size + if self._highlightIndex is not None: + self.vertex_fill_color = self.hvertex_fill_color + else: + self.vertex_fill_color = Shape.vertex_fill_color + if shape == self.P_SQUARE: + path.addRect(point.x() - d / 2, point.y() - d / 2, d, d) + elif shape == self.P_ROUND: + path.addEllipse(point, d / 2.0, d / 2.0) + else: + assert False, "unsupported vertex shape" + + def nearestVertex(self, point, epsilon): + for i, p in enumerate(self.points): + if distance(p - point) <= epsilon: + return i + return None + + def containsPoint(self, point): + return self.makePath().contains(point) + + def makePath(self): + path = QPainterPath(self.points[0]) + for p in self.points[1:]: + path.lineTo(p) + return path + + def boundingRect(self): + return self.makePath().boundingRect() + + def moveBy(self, offset): + self.points = [p + offset for p in self.points] + + def moveVertexBy(self, i, offset): + self.points[i] = self.points[i] + offset + + def highlightVertex(self, i, action): + self._highlightIndex = i + self._highlightMode = action + + def highlightClear(self): + self._highlightIndex = None + + def copy(self): + shape = Shape("%s" % self.label) + shape.points = [p for p in self.points] + shape.fill = self.fill + shape.selected = self.selected + shape._closed = self._closed + if self.line_color != Shape.line_color: + shape.line_color = self.line_color + if self.fill_color != Shape.fill_color: + shape.fill_color = self.fill_color + shape.difficult = self.difficult + return shape + + def __len__(self): + return len(self.points) + + def __getitem__(self, key): + return self.points[key] + + def __setitem__(self, key, value): + self.points[key] = value diff --git a/PPOCRLabel/libs/stringBundle.py b/PPOCRLabel/libs/stringBundle.py new file mode 100644 index 0000000000000000000000000000000000000000..2417104425323357e3ef49feaabfcfa35fefaf00 --- /dev/null +++ b/PPOCRLabel/libs/stringBundle.py @@ -0,0 +1,86 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import re +import os +import sys +import locale +from libs.ustr import ustr + +try: + from PyQt5.QtCore import * +except ImportError: + if sys.version_info.major >= 3: + import sip + sip.setapi('QVariant', 2) + from PyQt4.QtCore import * + + +class StringBundle: + + __create_key = object() + + def __init__(self, create_key, localeStr): + assert(create_key == StringBundle.__create_key), "StringBundle must be created using StringBundle.getBundle" + self.idToMessage = {} + paths = self.__createLookupFallbackList(localeStr) + for path in paths: + self.__loadBundle(path) + + @classmethod + def getBundle(cls, localeStr=None): + if localeStr is None: + try: + localeStr = locale.getlocale()[0] if locale.getlocale() and len( + locale.getlocale()) > 0 else os.getenv('LANG') + except: + print('Invalid locale') + localeStr = 'en' + + return StringBundle(cls.__create_key, localeStr) + + def getString(self, stringId): + assert(stringId in self.idToMessage), "Missing string id : " + stringId + return self.idToMessage[stringId] + + def __createLookupFallbackList(self, localeStr): + resultPaths = [] + basePath = ":/strings" + resultPaths.append(basePath) + if localeStr is not None: + # Don't follow standard BCP47. Simple fallback + tags = re.split('[^a-zA-Z]', localeStr) + for tag in tags: + lastPath = resultPaths[-1] + resultPaths.append(lastPath + '-' + tag) + + return resultPaths + + def __loadBundle(self, path): + PROP_SEPERATOR = '=' + f = QFile(path) + if f.exists(): + if f.open(QIODevice.ReadOnly | QFile.Text): + text = QTextStream(f) + text.setCodec("UTF-8") + + while not text.atEnd(): + line = ustr(text.readLine()) + key_value = line.split(PROP_SEPERATOR) + key = key_value[0].strip() + value = PROP_SEPERATOR.join(key_value[1:]).strip().strip('"') + self.idToMessage[key] = value + + f.close() diff --git a/PPOCRLabel/libs/toolBar.py b/PPOCRLabel/libs/toolBar.py new file mode 100644 index 0000000000000000000000000000000000000000..9a63929ae966ae02715f10868f9980230d064ccd --- /dev/null +++ b/PPOCRLabel/libs/toolBar.py @@ -0,0 +1,51 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + + +class ToolBar(QToolBar): + + def __init__(self, title): + super(ToolBar, self).__init__(title) + layout = self.layout() + m = (0, 0, 0, 0) + layout.setSpacing(0) + layout.setContentsMargins(*m) + self.setContentsMargins(*m) + self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint) + + def addAction(self, action): + if isinstance(action, QWidgetAction): + return super(ToolBar, self).addAction(action) + btn = ToolButton() + btn.setDefaultAction(action) + btn.setToolButtonStyle(self.toolButtonStyle()) + self.addWidget(btn) + + +class ToolButton(QToolButton): + """ToolBar companion class which ensures all buttons have the same size.""" + minSize = (60, 60) + + def minimumSizeHint(self): + ms = super(ToolButton, self).minimumSizeHint() + w1, h1 = ms.width(), ms.height() + w2, h2 = self.minSize + ToolButton.minSize = max(w1, w2), max(h1, h2) + return QSize(*ToolButton.minSize) diff --git a/PPOCRLabel/libs/ustr.py b/PPOCRLabel/libs/ustr.py new file mode 100644 index 0000000000000000000000000000000000000000..b35cf5d3ff707b11d658efd6e585bb9de74d27cb --- /dev/null +++ b/PPOCRLabel/libs/ustr.py @@ -0,0 +1,29 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import sys +from libs.constants import DEFAULT_ENCODING + +def ustr(x): + '''py2/py3 unicode helper''' + + if sys.version_info < (3, 0, 0): + from PyQt4.QtCore import QString + if type(x) == str: + return x.decode(DEFAULT_ENCODING) + if type(x) == QString: + #https://blog.csdn.net/friendan/article/details/51088476 + #https://blog.csdn.net/xxm524/article/details/74937308 + return unicode(x.toUtf8(), DEFAULT_ENCODING, 'ignore') + return x + else: + return x diff --git a/PPOCRLabel/libs/utils.py b/PPOCRLabel/libs/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..cb1c92e7a9cf21c3fca289e50c48e6db580777ec --- /dev/null +++ b/PPOCRLabel/libs/utils.py @@ -0,0 +1,182 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +from math import sqrt +from libs.ustr import ustr +import hashlib +import re +import sys +import cv2 +import numpy as np + +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + + +def newIcon(icon, iconSize=None): + if iconSize is not None: + return QIcon(QIcon(':/' + icon).pixmap(iconSize,iconSize)) + else: + return QIcon(':/' + icon) + + +def newButton(text, icon=None, slot=None): + b = QPushButton(text) + if icon is not None: + b.setIcon(newIcon(icon)) + if slot is not None: + b.clicked.connect(slot) + return b + + +def newAction(parent, text, slot=None, shortcut=None, icon=None, + tip=None, checkable=False, enabled=True, iconSize=None): + """Create a new action and assign callbacks, shortcuts, etc.""" + a = QAction(text, parent) + if icon is not None: + if iconSize is not None: + a.setIcon(newIcon(icon, iconSize)) + else: + a.setIcon(newIcon(icon)) + if shortcut is not None: + if isinstance(shortcut, (list, tuple)): + a.setShortcuts(shortcut) + else: + a.setShortcut(shortcut) + if tip is not None: + a.setToolTip(tip) + a.setStatusTip(tip) + if slot is not None: + a.triggered.connect(slot) + if checkable: + a.setCheckable(True) + a.setEnabled(enabled) + return a + + +def addActions(widget, actions): + for action in actions: + if action is None: + widget.addSeparator() + elif isinstance(action, QMenu): + widget.addMenu(action) + else: + widget.addAction(action) + + +def labelValidator(): + return QRegExpValidator(QRegExp(r'^[^ \t].+'), None) + + +class struct(object): + + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +def distance(p): + return sqrt(p.x() * p.x() + p.y() * p.y()) + + +def fmtShortcut(text): + mod, key = text.split('+', 1) + return '%s+%s' % (mod, key) + + +def generateColorByText(text): + s = ustr(text) + hashCode = int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16) + r = int((hashCode / 255) % 255) + g = int((hashCode / 65025) % 255) + b = int((hashCode / 16581375) % 255) + return QColor(r, g, b, 100) + +def have_qstring(): + '''p3/qt5 get rid of QString wrapper as py3 has native unicode str type''' + return not (sys.version_info.major >= 3 or QT_VERSION_STR.startswith('5.')) + +def util_qt_strlistclass(): + return QStringList if have_qstring() else list + +def natural_sort(list, key=lambda s:s): + """ + Sort the list into natural alphanumeric order. + """ + def get_alphanum_key_func(key): + convert = lambda text: int(text) if text.isdigit() else text + return lambda s: [convert(c) for c in re.split('([0-9]+)', key(s))] + sort_key = get_alphanum_key_func(key) + list.sort(key=sort_key) + + +def get_rotate_crop_image(img, points): + + try: + img_crop_width = int( + max( + np.linalg.norm(points[0] - points[1]), + np.linalg.norm(points[2] - points[3]))) + img_crop_height = int( + max( + np.linalg.norm(points[0] - points[3]), + np.linalg.norm(points[1] - points[2]))) + pts_std = np.float32([[0, 0], [img_crop_width, 0], + [img_crop_width, img_crop_height], + [0, img_crop_height]]) + M = cv2.getPerspectiveTransform(points, pts_std) + dst_img = cv2.warpPerspective( + img, + M, (img_crop_width, img_crop_height), + borderMode=cv2.BORDER_REPLICATE, + flags=cv2.INTER_CUBIC) + dst_img_height, dst_img_width = dst_img.shape[0:2] + if dst_img_height * 1.0 / dst_img_width >= 1.5: + dst_img = np.rot90(dst_img) + return dst_img + except Exception as e: + print(e) + +def stepsInfo(lang='en'): + if lang == 'ch': + msg = "1. 安装与运行:使用上述命令安装与运行程序。\n" \ + "2. 打开文件夹:在菜单栏点击 “文件” - 打开目录 选择待标记图片的文件夹.\n"\ + "3. 自动标注:点击 ”自动标注“,使用PPOCR超轻量模型对图片文件名前图片状态为 “X” 的图片进行自动标注。\n" \ + "4. 手动标注:点击 “矩形标注”(推荐直接在英文模式下点击键盘中的 “W”),用户可对当前图片中模型未检出的部分进行手动" \ + "绘制标记框。点击键盘P,则使用四点标注模式(或点击“编辑” - “四点标注”),用户依次点击4个点后,双击左键表示标注完成。\n" \ + "5. 标记框绘制完成后,用户点击 “确认”,检测框会先被预分配一个 “待识别” 标签。\n" \ + "6. 重新识别:将图片中的所有检测画绘制/调整完成后,点击 “重新识别”,PPOCR模型会对当前图片中的**所有检测框**重新识别。\n" \ + "7. 内容更改:双击识别结果,对不准确的识别结果进行手动更改。\n" \ + "8. 保存:点击 “保存”,图片状态切换为 “√”,跳转至下一张。\n" \ + "9. 删除:点击 “删除图像”,图片将会被删除至回收站。\n" \ + "10. 标注结果:关闭应用程序或切换文件路径后,手动保存过的标签将会被存放在所打开图片文件夹下的" \ + "*Label.txt*中。在菜单栏点击 “PaddleOCR” - 保存识别结果后,会将此类图片的识别训练数据保存在*crop_img*文件夹下," \ + "识别标签保存在*rec_gt.txt*中。\n" + else: + msg = "1. Build and launch using the instructions above.\n" \ + "2. Click 'Open Dir' in Menu/File to select the folder of the picture.\n"\ + "3. Click 'Auto recognition', use PPOCR model to automatically annotate images which marked with 'X' before the file name."\ + "4. Create Box:\n"\ + "4.1 Click 'Create RectBox' or press 'W' in English keyboard mode to draw a new rectangle detection box. Click and release left mouse to select a region to annotate the text area.\n"\ + "4.2 Press 'P' to enter four-point labeling mode which enables you to create any four-point shape by clicking four points with the left mouse button in succession and DOUBLE CLICK the left mouse as the signal of labeling completion.\n"\ + "5. After the marking frame is drawn, the user clicks 'OK', and the detection frame will be pre-assigned a TEMPORARY label.\n"\ + "6. Click re-Recognition, model will rewrite ALL recognition results in ALL detection box.\n"\ + "7. Double click the result in 'recognition result' list to manually change inaccurate recognition results.\n"\ + "8. Click 'Save', the image status will switch to '√',then the program automatically jump to the next.\n"\ + "9. Click 'Delete Image' and the image will be deleted to the recycle bin.\n"\ + "10. Labeling result: After closing the application or switching the file path, the manually saved label will be stored in *Label.txt* under the opened picture folder.\n"\ + " Click PaddleOCR-Save Recognition Results in the menu bar, the recognition training data of such pictures will be saved in the *crop_img* folder, and the recognition label will be saved in *rec_gt.txt*.\n" + return msg \ No newline at end of file diff --git a/PPOCRLabel/libs/yolo_io.py b/PPOCRLabel/libs/yolo_io.py new file mode 100644 index 0000000000000000000000000000000000000000..216fba388cabec6705718771b80b549577bf4e78 --- /dev/null +++ b/PPOCRLabel/libs/yolo_io.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python +# -*- coding: utf8 -*- +import sys +import os +from xml.etree import ElementTree +from xml.etree.ElementTree import Element, SubElement +from lxml import etree +import codecs +from libs.constants import DEFAULT_ENCODING + +TXT_EXT = '.txt' +ENCODE_METHOD = DEFAULT_ENCODING + +class YOLOWriter: + + def __init__(self, foldername, filename, imgSize, databaseSrc='Unknown', localImgPath=None): + self.foldername = foldername + self.filename = filename + self.databaseSrc = databaseSrc + self.imgSize = imgSize + self.boxlist = [] + self.localImgPath = localImgPath + self.verified = False + + def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult): + bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax} + bndbox['name'] = name + bndbox['difficult'] = difficult + self.boxlist.append(bndbox) + + def BndBox2YoloLine(self, box, classList=[]): + xmin = box['xmin'] + xmax = box['xmax'] + ymin = box['ymin'] + ymax = box['ymax'] + + xcen = float((xmin + xmax)) / 2 / self.imgSize[1] + ycen = float((ymin + ymax)) / 2 / self.imgSize[0] + + w = float((xmax - xmin)) / self.imgSize[1] + h = float((ymax - ymin)) / self.imgSize[0] + + # PR387 + boxName = box['name'] + if boxName not in classList: + classList.append(boxName) + + classIndex = classList.index(boxName) + + return classIndex, xcen, ycen, w, h + + def save(self, classList=[], targetFile=None): + + out_file = None #Update yolo .txt + out_class_file = None #Update class list .txt + + if targetFile is None: + out_file = open( + self.filename + TXT_EXT, 'w', encoding=ENCODE_METHOD) + classesFile = os.path.join(os.path.dirname(os.path.abspath(self.filename)), "classes.txt") + out_class_file = open(classesFile, 'w') + + else: + out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD) + classesFile = os.path.join(os.path.dirname(os.path.abspath(targetFile)), "classes.txt") + out_class_file = open(classesFile, 'w') + + + for box in self.boxlist: + classIndex, xcen, ycen, w, h = self.BndBox2YoloLine(box, classList) + # print (classIndex, xcen, ycen, w, h) + out_file.write("%d %.6f %.6f %.6f %.6f\n" % (classIndex, xcen, ycen, w, h)) + + # print (classList) + # print (out_class_file) + for c in classList: + out_class_file.write(c+'\n') + + out_class_file.close() + out_file.close() + + + +class YoloReader: + + def __init__(self, filepath, image, classListPath=None): + # shapes type: + # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult] + self.shapes = [] + self.filepath = filepath + + if classListPath is None: + dir_path = os.path.dirname(os.path.realpath(self.filepath)) + self.classListPath = os.path.join(dir_path, "classes.txt") + else: + self.classListPath = classListPath + + # print (filepath, self.classListPath) + + classesFile = open(self.classListPath, 'r') + self.classes = classesFile.read().strip('\n').split('\n') + + # print (self.classes) + + imgSize = [image.height(), image.width(), + 1 if image.isGrayscale() else 3] + + self.imgSize = imgSize + + self.verified = False + # try: + self.parseYoloFormat() + # except: + # pass + + def getShapes(self): + return self.shapes + + def addShape(self, label, xmin, ymin, xmax, ymax, difficult): + + points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)] + self.shapes.append((label, points, None, None, difficult)) + + def yoloLine2Shape(self, classIndex, xcen, ycen, w, h): + label = self.classes[int(classIndex)] + + xmin = max(float(xcen) - float(w) / 2, 0) + xmax = min(float(xcen) + float(w) / 2, 1) + ymin = max(float(ycen) - float(h) / 2, 0) + ymax = min(float(ycen) + float(h) / 2, 1) + + xmin = int(self.imgSize[1] * xmin) + xmax = int(self.imgSize[1] * xmax) + ymin = int(self.imgSize[0] * ymin) + ymax = int(self.imgSize[0] * ymax) + + return label, xmin, ymin, xmax, ymax + + def parseYoloFormat(self): + bndBoxFile = open(self.filepath, 'r') + for bndBox in bndBoxFile: + classIndex, xcen, ycen, w, h = bndBox.strip().split(' ') + label, xmin, ymin, xmax, ymax = self.yoloLine2Shape(classIndex, xcen, ycen, w, h) + + # Caveat: difficult flag is discarded when saved as yolo format. + self.addShape(label, xmin, ymin, xmax, ymax, False) diff --git a/PPOCRLabel/libs/zoomWidget.py b/PPOCRLabel/libs/zoomWidget.py new file mode 100644 index 0000000000000000000000000000000000000000..4512d2ab4f582399798307d86fbedee1221cfd46 --- /dev/null +++ b/PPOCRLabel/libs/zoomWidget.py @@ -0,0 +1,38 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +try: + from PyQt5.QtGui import * + from PyQt5.QtCore import * + from PyQt5.QtWidgets import * +except ImportError: + from PyQt4.QtGui import * + from PyQt4.QtCore import * + + +class ZoomWidget(QSpinBox): + + def __init__(self, value=100): + super(ZoomWidget, self).__init__() + self.setButtonSymbols(QAbstractSpinBox.NoButtons) + self.setRange(1, 500) + self.setSuffix(' %') + self.setValue(value) + self.setToolTip(u'Zoom Level') + self.setStatusTip(self.toolTip()) + self.setAlignment(Qt.AlignCenter) + + def minimumSizeHint(self): + height = super(ZoomWidget, self).minimumSizeHint().height() + fm = QFontMetrics(self.font()) + width = fm.width(str(self.maximum())) + return QSize(width, height) diff --git a/PPOCRLabel/requirements/requirements-linux-python3.txt b/PPOCRLabel/requirements/requirements-linux-python3.txt new file mode 100644 index 0000000000000000000000000000000000000000..787a7fda11ade96de811381d158f2742298b0632 --- /dev/null +++ b/PPOCRLabel/requirements/requirements-linux-python3.txt @@ -0,0 +1,2 @@ +pyqt5==5.10.1 +lxml==4.2.4 diff --git a/PPOCRLabel/resources.qrc b/PPOCRLabel/resources.qrc new file mode 100644 index 0000000000000000000000000000000000000000..3ec50bce36369993a4b12f8886eea366c35b5733 --- /dev/null +++ b/PPOCRLabel/resources.qrc @@ -0,0 +1,40 @@ + + + +resources/icons/help.png +resources/icons/app.png +resources/icons/Auto.png +resources/icons/reRec.png +resources/icons/expert2.png +resources/icons/done.png +resources/icons/file.png +resources/icons/labels.png +resources/icons/objects.png +resources/icons/close.png +resources/icons/fit-width.png +resources/icons/fit-window.png +resources/icons/undo.png +resources/icons/eye.png +resources/icons/quit.png +resources/icons/copy.png +resources/icons/edit.png +resources/icons/open.png +resources/icons/save.png +resources/icons/format_voc.png +resources/icons/format_yolo.png +resources/icons/save-as.png +resources/icons/color.png +resources/icons/color_line.png +resources/icons/zoom.png +resources/icons/zoom-in.png +resources/icons/zoom-out.png +resources/icons/cancel.png +resources/icons/next.png +resources/icons/prev.png +resources/icons/resetall.png +resources/icons/verify.png +resources/strings/strings.properties +resources/strings/strings-zh-TW.properties +resources/strings/strings-zh-CN.properties + + diff --git a/PPOCRLabel/resources/icons/Auto.png b/PPOCRLabel/resources/icons/Auto.png new file mode 100644 index 0000000000000000000000000000000000000000..267f2e1d9dc3a44431b27679d8654063f77f20dc Binary files /dev/null and b/PPOCRLabel/resources/icons/Auto.png differ diff --git a/PPOCRLabel/resources/icons/app.icns b/PPOCRLabel/resources/icons/app.icns new file mode 100644 index 0000000000000000000000000000000000000000..9409991b4c47986568db5fa594f4522a6130976c Binary files /dev/null and b/PPOCRLabel/resources/icons/app.icns differ diff --git a/PPOCRLabel/resources/icons/app.png b/PPOCRLabel/resources/icons/app.png new file mode 100644 index 0000000000000000000000000000000000000000..267f2e1d9dc3a44431b27679d8654063f77f20dc Binary files /dev/null and b/PPOCRLabel/resources/icons/app.png differ diff --git a/PPOCRLabel/resources/icons/app.svg b/PPOCRLabel/resources/icons/app.svg new file mode 100644 index 0000000000000000000000000000000000000000..bf4a252c61df76d8563beb309820265a6c67922d --- /dev/null +++ b/PPOCRLabel/resources/icons/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/PPOCRLabel/resources/icons/cancel.png b/PPOCRLabel/resources/icons/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbfab89d036a18e8b38c2156ca2636baf78d16f Binary files /dev/null and b/PPOCRLabel/resources/icons/cancel.png differ diff --git a/PPOCRLabel/resources/icons/close.png b/PPOCRLabel/resources/icons/close.png new file mode 100644 index 0000000000000000000000000000000000000000..aa52a8d67a2567a142c89ed68843291ba43ff480 Binary files /dev/null and b/PPOCRLabel/resources/icons/close.png differ diff --git a/PPOCRLabel/resources/icons/color.png b/PPOCRLabel/resources/icons/color.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1e1ad03b799acb31b1ace1c68c48ca0635b2ef Binary files /dev/null and b/PPOCRLabel/resources/icons/color.png differ diff --git a/PPOCRLabel/resources/icons/color_line.png b/PPOCRLabel/resources/icons/color_line.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef10bfc47505002aa3d06f67a4b6a6c6434f72f Binary files /dev/null and b/PPOCRLabel/resources/icons/color_line.png differ diff --git a/PPOCRLabel/resources/icons/copy.png b/PPOCRLabel/resources/icons/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c9bddc74e0e365fc448b8e61d760b1d179537f Binary files /dev/null and b/PPOCRLabel/resources/icons/copy.png differ diff --git a/PPOCRLabel/resources/icons/delete.png b/PPOCRLabel/resources/icons/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a4074f08042ab12ef344a8d79adbd6c44fd2f8 Binary files /dev/null and b/PPOCRLabel/resources/icons/delete.png differ diff --git a/PPOCRLabel/resources/icons/done.png b/PPOCRLabel/resources/icons/done.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a03f4f479f3496e72cab5a60c61c4bf1217582 Binary files /dev/null and b/PPOCRLabel/resources/icons/done.png differ diff --git a/PPOCRLabel/resources/icons/done.svg b/PPOCRLabel/resources/icons/done.svg new file mode 100644 index 0000000000000000000000000000000000000000..aa8fd28843e6281cade711282d748a3cd4e61a6c --- /dev/null +++ b/PPOCRLabel/resources/icons/done.svg @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2003-12-22T22:34:35+02:00 + +2004-04-17T21:25:50Z + +Adobe Illustrator 10.0 + +2004-01-19T17:51:02+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq +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 + + + + + + +uuid:4b4d592f-95b8-4bcd-a892-74a536c5e52f + + + +image/svg+xml + + + +test.ai + + + + + + end='w' + + + + + + + + + + diff --git a/PPOCRLabel/resources/icons/edit.png b/PPOCRLabel/resources/icons/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..36775390f1e8e89e7007e4978a003751acab855d Binary files /dev/null and b/PPOCRLabel/resources/icons/edit.png differ diff --git a/PPOCRLabel/resources/icons/expert1.png b/PPOCRLabel/resources/icons/expert1.png new file mode 100644 index 0000000000000000000000000000000000000000..281364540cb28396ff70aa411ef806842695d18e Binary files /dev/null and b/PPOCRLabel/resources/icons/expert1.png differ diff --git a/PPOCRLabel/resources/icons/expert2.png b/PPOCRLabel/resources/icons/expert2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c470b6a564bcfbe423e6ff0aa4a055485cf5d0c Binary files /dev/null and b/PPOCRLabel/resources/icons/expert2.png differ diff --git a/PPOCRLabel/resources/icons/eye.png b/PPOCRLabel/resources/icons/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b65505acc1538d6a2fcc79604702f563fa16b8 Binary files /dev/null and b/PPOCRLabel/resources/icons/eye.png differ diff --git a/PPOCRLabel/resources/icons/feBlend-icon.png b/PPOCRLabel/resources/icons/feBlend-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1aca8497817ec07f2ab55216df32cb74d138af Binary files /dev/null and b/PPOCRLabel/resources/icons/feBlend-icon.png differ diff --git a/PPOCRLabel/resources/icons/file.png b/PPOCRLabel/resources/icons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec0515a25dc982de92c4f84105c32c5b8e38d01 Binary files /dev/null and b/PPOCRLabel/resources/icons/file.png differ diff --git a/PPOCRLabel/resources/icons/fit-width.png b/PPOCRLabel/resources/icons/fit-width.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5490748b44ed1ab49cfc355bf853cd9837e492 Binary files /dev/null and b/PPOCRLabel/resources/icons/fit-width.png differ diff --git a/PPOCRLabel/resources/icons/fit-window.png b/PPOCRLabel/resources/icons/fit-window.png new file mode 100644 index 0000000000000000000000000000000000000000..585e970773e3fcd327874e6b1c95f194e25db04b Binary files /dev/null and b/PPOCRLabel/resources/icons/fit-window.png differ diff --git a/PPOCRLabel/resources/icons/fit.png b/PPOCRLabel/resources/icons/fit.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0e817be2ac2e29799aeb5f0752224c1996e73a Binary files /dev/null and b/PPOCRLabel/resources/icons/fit.png differ diff --git a/PPOCRLabel/resources/icons/format_createml.png b/PPOCRLabel/resources/icons/format_createml.png new file mode 100644 index 0000000000000000000000000000000000000000..c08af9426e7888aa05f57c58c6f680442b80339b Binary files /dev/null and b/PPOCRLabel/resources/icons/format_createml.png differ diff --git a/PPOCRLabel/resources/icons/format_voc.png b/PPOCRLabel/resources/icons/format_voc.png new file mode 100644 index 0000000000000000000000000000000000000000..cb15e43974b065d73b7776b8e11559b2a0baf995 Binary files /dev/null and b/PPOCRLabel/resources/icons/format_voc.png differ diff --git a/PPOCRLabel/resources/icons/format_yolo.png b/PPOCRLabel/resources/icons/format_yolo.png new file mode 100644 index 0000000000000000000000000000000000000000..ca9acc71c97f8cded4b8111b87f09b29e6276e3b Binary files /dev/null and b/PPOCRLabel/resources/icons/format_yolo.png differ diff --git a/PPOCRLabel/resources/icons/help.png b/PPOCRLabel/resources/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..93bf094a114d46d3f2c0236badc2914c04fd2e89 Binary files /dev/null and b/PPOCRLabel/resources/icons/help.png differ diff --git a/PPOCRLabel/resources/icons/labels.png b/PPOCRLabel/resources/icons/labels.png new file mode 100644 index 0000000000000000000000000000000000000000..c82ffb7b6fa64c44f97559c8ac954eae1e73da85 Binary files /dev/null and b/PPOCRLabel/resources/icons/labels.png differ diff --git a/PPOCRLabel/resources/icons/labels.svg b/PPOCRLabel/resources/icons/labels.svg new file mode 100644 index 0000000000000000000000000000000000000000..652cef3f4676512d174665884059e031e75d0fc6 --- /dev/null +++ b/PPOCRLabel/resources/icons/labels.svg @@ -0,0 +1,819 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + + +Adobe PDF library 5.00 + + + + + +2004-01-26T11:58:28+02:00 + +2004-03-28T20:41:40Z + +Adobe Illustrator 10.0 + +2004-02-16T23:58:32+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmDzFo +3l7TJdT1e5W1tItuTbszHoiKN2Y+AxV4j5g/5ydvTcMnl/SYlgU0Se/LOzDxMcTIF/4M4qk//QzP +nv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8 +sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5F +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 +f//Z + + + + + + +uuid:4ee3f24b-6ed2-4a2e-8f7a-50b762c8da8b + + + +image/svg+xml + + + +mime.ai + + + + image/svg+xml + end='w' + + +Labels + \ No newline at end of file diff --git a/PPOCRLabel/resources/icons/new.png b/PPOCRLabel/resources/icons/new.png new file mode 100644 index 0000000000000000000000000000000000000000..dd795cfffc5c1ce273b3afedb5ed01da3fc5668c Binary files /dev/null and b/PPOCRLabel/resources/icons/new.png differ diff --git a/PPOCRLabel/resources/icons/next.png b/PPOCRLabel/resources/icons/next.png new file mode 100644 index 0000000000000000000000000000000000000000..163a343cb44010ea43ae8216396e8db82080ce04 Binary files /dev/null and b/PPOCRLabel/resources/icons/next.png differ diff --git a/PPOCRLabel/resources/icons/objects.png b/PPOCRLabel/resources/icons/objects.png new file mode 100644 index 0000000000000000000000000000000000000000..593bb6d8a63ad8dbde0ec664d3fbae9e2ceb18cb Binary files /dev/null and b/PPOCRLabel/resources/icons/objects.png differ diff --git a/PPOCRLabel/resources/icons/open.png b/PPOCRLabel/resources/icons/open.png new file mode 100644 index 0000000000000000000000000000000000000000..45fa2883a71fcb891f1ef7c0c217d71eeae284bc Binary files /dev/null and b/PPOCRLabel/resources/icons/open.png differ diff --git a/PPOCRLabel/resources/icons/open.svg b/PPOCRLabel/resources/icons/open.svg new file mode 100644 index 0000000000000000000000000000000000000000..48e7a34376746d3a18326cdaf80889eea61a9e18 --- /dev/null +++ b/PPOCRLabel/resources/icons/open.svg @@ -0,0 +1,577 @@ + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PPOCRLabel/resources/icons/prev.png b/PPOCRLabel/resources/icons/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..31b454519354679289cd809d42e052c024908e6c Binary files /dev/null and b/PPOCRLabel/resources/icons/prev.png differ diff --git a/PPOCRLabel/resources/icons/quit.png b/PPOCRLabel/resources/icons/quit.png new file mode 100644 index 0000000000000000000000000000000000000000..7445887949c3b817d3fd5a223747264e7a5d2ac9 Binary files /dev/null and b/PPOCRLabel/resources/icons/quit.png differ diff --git a/PPOCRLabel/resources/icons/reRec.png b/PPOCRLabel/resources/icons/reRec.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d0d5c0c021735b0ae8f6ff034c107e045f2855 Binary files /dev/null and b/PPOCRLabel/resources/icons/reRec.png differ diff --git a/PPOCRLabel/resources/icons/resetall.png b/PPOCRLabel/resources/icons/resetall.png new file mode 100644 index 0000000000000000000000000000000000000000..acc12c332879ad5eeeb54c7b8a3d5df8244123ec Binary files /dev/null and b/PPOCRLabel/resources/icons/resetall.png differ diff --git a/PPOCRLabel/resources/icons/save-as.png b/PPOCRLabel/resources/icons/save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..1b5d900064c79dac15ee24d0a33b22f3245aa222 Binary files /dev/null and b/PPOCRLabel/resources/icons/save-as.png differ diff --git a/PPOCRLabel/resources/icons/save-as.svg b/PPOCRLabel/resources/icons/save-as.svg new file mode 100644 index 0000000000000000000000000000000000000000..c8441a1f5491f8f0fd0ca6f54bd31c04be65d514 --- /dev/null +++ b/PPOCRLabel/resources/icons/save-as.svg @@ -0,0 +1,1358 @@ + + + + + + + + + + + + + + + + + + + + +begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2004-01-26T11:58:28+02:00 + +2004-03-28T20:41:40Z + +Adobe Illustrator 10.0 + +2004-02-16T23:58:32+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqlvmDzFo +3l7TJdT1e5W1tItuTbszHoiKN2Y+AxV4j5g/5ydvTcMnl/SYlgU0Se/LOzDxMcTIF/4M4qk//QzP +nv8A5YNL/wCRVx/2UYq7/oZnz3/ywaX/AMirj/soxV3/AEMz57/5YNL/AORVx/2UYq7/AKGZ89/8 +sGl/8irj/soxV3/QzPnv/lg0v/kVcf8AZRirv+hmfPf/ACwaX/yKuP8AsoxV3/QzPnv/AJYNL/5F +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 +f//Z + + + + + + +uuid:4ee3f24b-6ed2-4a2e-8f7a-50b762c8da8b + + + +image/svg+xml + + + +mime.ai + + + + + + +end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2004-02-04T02:08:51+02:00 + +2004-03-29T09:20:16Z + +Adobe Illustrator 10.0 + +2004-02-29T14:54:28+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXzd+b/wDzlWum3k+h+QxFc3EJMdzrkoEkKuNiLZPsyU/nb4fAEb50vZ/YXEBPLsP5v62meXue +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 + + + + + + +uuid:f3c53255-be8a-4b04-817b-695bf2c54c8b + + + +image/svg+xml + + + +filesave.ai + + + + + + +end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PPOCRLabel/resources/icons/save.png b/PPOCRLabel/resources/icons/save.png new file mode 100644 index 0000000000000000000000000000000000000000..daba865fafd22fa18e7c0488eb699b79d3554170 Binary files /dev/null and b/PPOCRLabel/resources/icons/save.png differ diff --git a/PPOCRLabel/resources/icons/save.svg b/PPOCRLabel/resources/icons/save.svg new file mode 100644 index 0000000000000000000000000000000000000000..5533e489925c35102834a23074cad3c36ad1c8a5 --- /dev/null +++ b/PPOCRLabel/resources/icons/save.svg @@ -0,0 +1,679 @@ + + + + + + + + begin='' id='W5M0MpCehiHzreSzNTczkc9d' + + + + +Adobe PDF library 5.00 + + + + + +2004-02-04T02:08:51+02:00 + +2004-03-29T09:20:16Z + +Adobe Illustrator 10.0 + +2004-02-29T14:54:28+01:00 + + + + +JPEG + +256 + +256 + +/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX +Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY +q7FXzd+b/wDzlWum3k+h+QxFc3EJMdzrkoEkKuNiLZPsyU/nb4fAEb50vZ/YXEBPLsP5v62meXue +A3v5mfmprl080vmLVriXdjHBcTIi17rFCVRfoXOghocEBQhH5NJmepUf8Tfmj/1dtb/6SLv/AJqy +f5fD/Nj8gjxPN3+JvzR/6u2t/wDSRd/81Y/l8P8ANj8gviebv8Tfmj/1dtb/AOki7/5qx/L4f5sf +kF8Tzd/ib80f+rtrf/SRd/8ANWP5fD/Nj8gviebv8Tfmj/1dtb/6SLv/AJqx/L4f5sfkF8Tzd/ib +80f+rtrf/SRd/wDNWP5fD/Nj8gviebv8Tfmj/wBXbW/+ki7/AOasfy+H+bH5BfE83f4m/NH/AKu2 +t/8ASRd/81Y/l8P82PyC+J5u/wATfmj/ANXbW/8ApIu/+asfy+H+bH5BfE83f4m/NH/q7a3/ANJF +3/zVj+Xw/wA2PyC+J5u/xN+aP/V21v8A6SLv/mrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/wA1Y/l8 +P82PyC+J5u/xN+aP/V21v/pIu/8AmrH8vh/mx+QXxPN3+JvzR/6u2t/9JF3/AM1Y/l8P82PyC+J5 +u/xN+aP/AFdtb/6SLv8A5qx/L4f5sfkF8Tzd/ib80f8Aq7a3/wBJF3/zVj+Xw/zY/IL4nm7/ABN+ +aP8A1dtb/wCki7/5qx/L4f5sfkF8Tzd/ib80f+rtrf8A0kXf/NWP5fD/ADY/IL4nm7/E35o/9XbW +/wDpIu/+asfy+H+bH5BfE82j5t/M+Aes2ta3EI/i9U3N2vGnfly2x/LYT/DH5BePzZ15C/5yh/Mb +y7cxRaxcHzDpQIEsF2f9IC9zHc058v8AX5D9ea/VdiYcg9I4JeXL5NkchD688jeefLvnby/DrmhT ++rayEpLE4CywygAtFKtTxYV+RG4qDnH6nTTwT4JjdyIytkGY6XYq7FXYq7FXYq7FXjX/ADlH+YV1 +5W8hppunymHU/MMj2qSqaMltGoNwynxPNE/2WbrsPSDLl4pfTDf49GvJKg+VPy+8lP5ivecqM9rG +4jWFaqZpTvw57cVUULGvcfMdtYFk7Ac3Ua3VHGAI/XLk+jNK/LfSLS0SK4JYqDSGCkUCV3PBVAPX +vtXwzWT7TlfoAA+11f5Xi3mTIo608meV/wBL2lnLbSSLcc/92sB8Kk70IOU5+0s4xSmCPT5NuDRY +pZBEjmyu2/KnydcFgliF4ip5TT/wY5ov5f1f877B+p2/8kaf+b9pVv8AlT3lL/lkT/kdcf1w/wAv +az+d9kf1I/kjTfzftLR/J/yl/wAsif8AI65/rj/L2s/nfZH9S/yRpv5v2lafyg8p/wDLKn/I65/r +h/l3Wfzvsj+pf5J03837S0fyh8p/8sqf8jrn+uP8u6z+d9kf1L/JOm/m/aWj+UXlP/llj/5HXP8A +XH+XdZ/O+yP6l/knTfzftLX/ACqPyn/yzR/8jrn+uH+XNb/O+yP6l/knTd32lr/lUflX/lmj/wCR +1z/XB/Lmt/nfZH9S/wAk6bu+0u/5VD5W/wCWaP8A5HXP9cf5d1n877I/qX+SdN/N+0u/5VB5Y/5Z +ov8Akdc/1x/l3Wfzvsj+pf5J03837S7/AJU/5a/5Zov+R1z/AFx/l3Wfzvsj+pf5J03837S7/lT3 +lv8A5Zov+R1z/XB/L2s/nfZH9S/yRpv5v2l3/KnfLv8AyzRf8jrn+uP8vaz+d9kf1L/JGm/m/aXf +8qc8v/8ALNF/yOuf64/y9rP532R/Uv8AJGm/m/aXf8qb0H/lmh/5HXP9cf5f1n877I/qX+SNN/N+ +0u/5U1oP/LND/wAjrn+uD+X9Z/O+wfqT/JGn/m/aVk/5P6BDBJM1rEVjUswE1xWg8KnH/RBq/wCd +9g/Uv8kaf+b9pYp5i8oeXLOGBoLQo0j8SRJIe3+Uxza9ldq6jNKQnLkO4Ov1/Z2HGAYj7SkreXdK +IoEZD/Mrmo+Vaj8M3I1eR1fgRee/mD+W8NxE91ZIPrhq0UygL6rbt6ctNubfssevy6XwmJjbYjo5 +ml1csUhGRuB+xJP+cfvzGvfJvny1T1T+iNXdLTUbcn4SWNIpPZkduvgTmq7Z0gy4Sf4obj9L0WOV +F93xSJLGsiGqOAyn2O+cK5K7FXYq7FXYq7FXYq+R/wDnM65lbzjoFsT+6i05pEG/2pJ2VvbpGM6/ +2cH7uR/pfocfNzb/ACCs7caXZzBAJPQuJS3fn9ZMXL/gNs2uvkRirvl+h0GffUm+kfx972EnNKyU +LXfzNpZ/4y/8QOOo/wAWn8PvbdN/fRei6SPjl/1R+vOWDvyjyMsQsIwoWkYVWEYULSMKFhGSVrFV +wOBVwOBVwOBK4HFVwOBK4HAq4HAlcDgVQ1I/7jrn/jE36siUh5X5uH+j23tL/DN52F9U/c6vtX6Q +x0nOidEgNZodNmBAP2aE9jzG4+jL9P8AWGrL9JfNGuSmDzPqEsICGK9maNRsF4ykgCnhmRKArhel +08iccT5B+iHk+4afQbcsalBx+8Bv+Ns8wdknWKuxV2KuxV2KuxV8hf8AOZn/ACneif8AbLH/AFES +52Hs7/dS/rfoDj5uaO/IUf7gbI/8ulx/1GnNlr/7v/O/Q6DN/jEv6v6nqxOahksshXzJpv8Az0/4 +gcjqf8Xn8PvbdL/exei6SPjk/wBUfrzlw9AmBGTYrSMKrCMKFpGFVhGFC0jChYRklaxVcDgVcDgV +cDgSuBxVcDgSuBwKuBwJUdRP+4+5/wCMTfqyJSHlvmwf6Lb+0n8M3XYX1S9zq+1fpDwzzXoX1nzD +eT8a82U1/wBgBm1y6fikS6qGfhFJt5T076lomoJSnOSM/dTMzQYuCTj6rJxh4h5k/wCUi1T/AJjJ +/wDk62bM83fab+6j/VH3P0N8jf8AHBj+Y/5NpnlztGQYq7FXYq7FXYq7FXyF/wA5mf8AKd6J/wBs +sf8AURLnYezv91L+t+gOPm5ph+Q4/wCddsj/AMutx/1Gtmx1/wBH+d+h0Gb/ABiX9X9T1InNUl2n +b+Y9P/56f8QOQ1X+Lz+H3t+l/vYvRtJH7yT/AFR+vOWDv0xIySFhGSQtIwqsIwoWkYVWEYULSMKF +hGSVrFVwOBVwOBVwOBK4HFVwOBK4HAqjf/8AHPuf+MTfqyEkh5j5rH+iQ/65/Uc3XYf1y9zre1Pp +DDpbGzkcu8QZ26k50weeMQoXVvDDZyrEgQNQkD5jLMX1BhMbPmrzN/ykmrf8xlx/ydbMp6XTf3cf +6o+5+hnkb/jgx/Mf8m0zy52bIMVdirsVdirsVdir5C/5zM/5TvRP+2WP+oiXOw9nf7qX9b9AcfNz +TL8iR/zrFif+Xa4/6jWzYa76f879Doc/9/L3fqenE5rEL9KFfMNh85P+IHK9X/cT+H3uRpP72L0f +SR+8k/1f45yzv0xIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4FXA4FXA4ErgcVXA4EqV +9/vBc/8AGJv1ZCXJIea+ah/ocfsx/wCInNx2H9cvcHW9qfQGIE507z6HvN7dx8v1jLMfNhPk+Z/N +H/KTav8A8xtx/wAnWzJek0/93H+qPufoX5G/44MfzH/JtM8vdmyDFXYq7FXYq7FXYq+Qv+czP+U7 +0T/tlj/qIlzsPZ3+6l/W/QHHzc0z/Isf86nYH/l3uP8AqNbM/W8v879Doc/9/L3fqelk5rkK2j76 +/ZfN/wDiBynWf3Evx1cjSf3oej6UP3r/AOr/ABzl3fpliq0jCq0jChYRkkLSMKrCMKFpGFVhGFC0 +jChYRklaxVcDgVcDgVcDgSuBxVTvP94rn/jE36shPkyDzjzUP9BX5n/iJzbdifXL4Ou7U+gfFhhO +dS86pXG8TD5frycebGXJ8z+av+Un1j/mNuf+TrZkh6TT/wB3H+qPufoV5G/44MfzH/JtM8vdmyDF +XYq7FXYq7FXYq+Qv+czP+U70T/tlj/qIlzsPZ3+6l/W/QHHzc01/I0f86fp5/wCKLj/qNbM7W8v8 +79Dos/8AfH3fqejE5gMEVoe+u2fzf/iByjW/3Evx1cnR/wB4Ho+l/wB4/wAv45y7v0xxV2KrSMKr +SMKFhGSQtIwqsIwoWkYVWEYULSMKFhGSVrFVwOBVwOBVwOBKy6P+h3H/ABib9WQnySHnnmkf6APY +t/xE5texPrPwdf2n9A+LByc6t5xTfcEZIIL5p82f8pTrP/Mdc/8AJ5syRyek0/8Adx9w+5+hPkb/ +AI4MfzH/ACbTPL3ZsgxV2KuxV2KuxV2KvkL/AJzM/wCU70T/ALZY/wCoiXOw9nf7qX9b9AcfNzTf +8jx/zpWnH/im4/6jHzO1n6f0Oi1H98fd+p6ETmE1o3y/vrdr82/4gcxtd/cycrR/3gej6b/eP8v4 +5y7v0wxV2KuxVaRhVaRhQsIySFpGFVhGFC0jCqwjChaRhQsIyStYquBwKuBwKtuT/olx/wAYm/Vk +J8mUXn/mkf7jj/sv+InNp2L/AHh+Dr+0/oHxYGTnWvONDdgMUPmnzb/yletf8x9z/wAnmzIjyelw +f3cfcH6EeRv+ODH8x/ybTPMHZMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0Bx8 +3NOPyRH/ADo2mn/im4/6jHzN1fP4/odHqP70+5n5OYjUmHlzfWrb5t/xA5ia7+5k5Wi/vA9H07+8 +f5fxzmHfo/FXYq7FXYqtIwqtIwoWEZJC0jCqwjChaRhVYRhQtIwoWEZJWsVXA4Fan/3luP8AjE36 +shk5MosD80D/AHGt8m/4gc2XY394fg4Haf0fN56TnXvNLod5VHz/AFYJclD5p83/APKWa3/zH3X/ +ACebMiPIPS4P7uPuD9CPI3/HBj+Y/wCTaZ5g7JkGKuxV2KuxV2KuxV8hf85mf8p3on/bLH/URLnY +ezv91L+t+gOPm5p1+SYp5B0w/wDFVx/1GPmZq/q+P6HR6n+9PuZ0TmM0pr5Y31iD5t/xA5h6/wDu +i5mi/vA9G0/7b/LOYd8jsVdirsVdirsVWkYVWkYULCMkhaRhVYRhQtIwqsIwoWkYULCMkrWKul/3 +mn/4xt+rK8nJMebB/NA/3Fyf6r/8QObHsb+8Pw+9we0/o+bzgnOxeZVLXe4QfP8AUcjPkmPN81ec +f+Uu1z/toXX/ACebL4fSHpcH0R9wfoP5G/44MfzH/JtM8xdkyDFXYq7FXYq7FXYq+Qv+czP+U70T +/tlj/qIlzsPZ3+6l/W/QHHzc08/JUf8AIPNLP/Fdx/1GSZl6r6z7/wBDpNT/AHh9zNicocdOPKu+ +rQ/M/wDEGzB7Q/ui5uh+sPRbEhXappt3zmXfI3mn8w+/FXeon8w+/FWvUj/mH3jFXepH/MPvGKu9 +WP8AnH3jFXepF/Ov3jFVpeP+dfvGG1Wl4/51+8YbQtLJ/Mv3jDa0tJT+ZfvGHiCKWnj/ADL/AMEP +64eILS08f5l/4If1w8QRS0qP5l/4If1w8YWlpUfzL/wS/wBceMIorCn+Uv8AwS/1w8YXhKyai289 +WXeNgPiB3I+eRnIEJiGFeZx/uKm/1H/4gc2PY/8AefL73B7S+j5vNCc7N5dWsN7uMfP/AIichl+k +so83zX5z/wCUw13/ALaF1/yffL8f0j3PS4foj7g/QbyN/wAcGP5j/k2meYuyZBirsVdirsVdirsV +fIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmnv5Lj/AJBxpZ/yLj/qMkzK1X1n3/odJqv7 +w+5mZOVOOmvly5jtrwTyAlIzuFpXdSO9Mw9bjM4cI6uVpJiMrLK/8T2H++5fuX/mrNL/ACdk7x+P +g7b85DuLX+JbD/fcv3L/AM1Y/wAnZO8fj4L+ch3Fr/Elj/vuX7l/5qx/k7J3j8fBfzkO4tf4jsf9 +9y/cv/NWP8nZO8fj4L+ch3Fo+YrH/fcv3L/zVj/J2TvH4+C/nIdxW/4hsv5JPuX/AJqx/k7J3j8f +BfzkO4tfp+y/kk+5f+asf5Oyd4/HwX85DuLX6es/5JPuX/mrH+TsnePx8F/OQ7i1+nbP+ST7l/5q +x/k7J3j8fBfzkO4tfpy0/kk+5f64/wAnZO8fj4L+ch3Fr9N2n8kn3L/XH+TsnePx8F/OQ7i0datf +5JPuX+uP8nZO8fj4L+ch3Fb+mLX+R/uH9cf5Oyd4/HwX85DuLX6Xtv5H+4f1x/k7J3j8fBfzkO4t +fpa2/lf7h/XH+TsnePx8F/OQ7i0dVt/5X+4f1x/k7J3j8fBfzkO4tHVLf+V/uH9cf5Oyd4/HwX85 +DuKW6/dxz6XcKgYFY5DvT+Q++bDs7TSx5Bdbkfe4etzicNvN5sTnWPOojTN7+If63/ETleb6Cyhz +fNnnX/lMte/7aN3/AMn3y/H9I9z02H6B7g/QXyN/xwY/mP8Ak2meYuxZBirsVdirsVdirsVfIX/O +Zn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5uaf/kyP+QZ6Uf8m4/6jJMytT/eH8dHS6r6z7mXk5W4rSyy +JXgxWvWhIxMQVEiOTjdXH+/X/wCCOPAO5eM9603Vz/v1/wDgjh4I9y8Z71pu7n/fz/8ABHDwR7kc +Z71pu7r/AH8//BH+uHw49y8cu9aby6/39J/wR/rh8OPcEccu9ab27/3/ACf8E39cPhx7gjjl3rTe +3f8Av+T/AINv64fDj3BfEl3rTfXn+/5P+Db+uHw49wR4ku8rTfXv/LRJ/wAG39cPhR7gviS7ytN/ +e/8ALRJ/wbf1w+FHuCPEl3ladQvv+WiX/g2/rh8KPcEeJLvK06hff8tMv/Bt/XD4Ue4L4ku8rTqN +/wD8tMv/AAbf1w+FDuCPEl3ladRv/wDlpl/4Nv64fBh3D5L4ku8rTqWof8tUv/Bt/XD4MO4fJHiy +7ytOp6h/y1Tf8jG/rh8GHcPkjxZd5aOp6j/y1Tf8jG/rh8GHcPkviy7ypvqN+6lWuZWVhRlLsQQe +xFcIwwHQfJByS7yhScta0Xo++pQj/W/4icq1H0Fnj+p82+d/+Uz1/wD7aN3/AMn3y7F9I9z02H6B +7g/QTyN/xwY/mP8Ak2meZOxZBirsVdirsVdirsVfIX/OZn/Kd6J/2yx/1ES52Hs7/dS/rfoDj5ub +IfybH/ILtJPtcf8AUZLmTqP70/jo6XVfWWVE5FxFpOFVpOFDCLz82fLtrdz2slteGSCRonKpFQlC +VNKyDbbLRjLLgKgfzh8tf8s17/wEX/VXD4ZXwytP5weWv+Wa9/4CL/qrjwFHhlo/m95b/wCWa8/4 +CL/qrh4Cvhlo/m75b/5Zrz/gIv8Aqrh4V8Mrf+Vt+XD/AMe15/wEX/VXCIFHhF3/ACtjy6f+Pa8/ +4CL/AKqZMYijwy1/ytXy8f8Aj3u/+Ai/6qZYNPJHhl3/ACtPy+f+Pe7/AOAj/wCqmTGll5I8Mtf8 +rQ0A/wDHvd/8BH/1UywaKfkjwy7/AJWboR/497r/AICP/qpkx2fPvCOAtf8AKytDP+6Lr/gI/wDq +pkx2bk7x+PgjgLY/MXRT0guf+Bj/AOa8P8nZO8fj4LwFseftIPSG4/4FP+a8f5Pn3j8fBHAUTY+b +dOvbqO2iimWSQkKXVQNhXejHwyGTSSiLNIMSE4JzGYLCcKFpOFCN0PfVYB/rf8QOU6n+7LZi+oPm +7zx/ymvmD/tpXn/J98uxfQPcHpsX0D3B+gfkb/jgx/Mf8m0zzJ2LIMVdirsVdirsVdir5C/5zM/5 +TvRP+2WP+oiXOw9nf7qX9b9AcfNzZF+To/5BVpB9rj/qMlzI1H98fx0dNq/qLJycXDWk4ULScKEq +/IbT7OTVvMty0S/Wm1BoRPQcxHVmKqT0BPXNL25M3EdKd52bEUS9s/RNv/O/3j+maC3Zu/RNv/O/ +3j+mNq79E2/87/eP6Y2rv0Tb/wA7/eP6Y2rv0Tb/AM7/AHj+mNq79E2/87/eP6Y2rv0Tb/zv94/p +jau/RNv/ADv94/pjau/RNv8Azv8AeP6Y2rv0Tb/zv94/pjau/RNv/O/3j+mNq80/PXTbMeUJmaMP +LbyQvBKwBZC8gRqEU6qc6L2YyyjqwAdpA38nA7RiDiJ7nzykeekEvOpz5cSmsWx9z/xE5jak+gsZ +cmeE5qWhaThQtJwqj/L2+sW4/wBf/iDZRq/7s/jq2YfqD5v89f8AKb+Yf+2nef8AUQ+W4foHuD02 +L6R7n6BeRv8Ajgx/Mf8AJtM8zdiyDFXYq7FXYq7FXYq+Qv8AnMz/AJTvRP8Atlj/AKiJc7D2d/up +f1v0Bx83Nkn5Pj/kEujn/mI/6jJcvz/35/HR02r+osjJyThLScKFhOSQgvyCamo+YR46o3/G2aHt +z6o+533Zv0l7pmhdk7FXYq7FXYq7FXYq7FXYq7FXYq8w/PPfytdr7wf8nRm/9m/8bj7pfc4PaP8A +cn4PntI89IJebTXQUpqlufc/8ROY+c+gsZcmZk5rWhaThVaThQmPlrfW7Yf6/wDybbMfWf3R/HVt +wfWHzh58/wCU58xf9tO8/wCoh8twfRH3B6fH9I9z9AfI3/HBj+Y/5NpnmbsGQYq7FXYq7FXYq7FX +yF/zmZ/yneif9ssf9REudh7O/wB1L+t+gOPm5sm/KEf8gh0Y+9x/1GTZdm/vz+OgdPrOZT8nLHAW +E5JC0nCqX/kO9NT8wf8AbUb/AI2zQ9ufVH3O+7N+kvdPUzQ07Jg/5n+a7ny3o9zq0CGY20cREHMx +hvUnEfUA9OVemZmh03jZRC6u/utpz5eCBl3PIv8AoY3V/wDq1j/pKf8A5ozoR7NxP8f2ftdf/KR/ +m/ay/wDLf81dQ826lcW0tsbQWypJyWZpOXJuNKELmu7U7JGliJCXFZ7nJ0ur8UkVVPZvUzR05rvU +xpXepjSu9TGld6mNK71MaV3qY0rzP8625eXrlf8AjB/ydGb32c/xuPul9zg9o/3J+DwdI89FJebT +PRkpqEJ9z+o5RmPpLCXJlJOYLStJwoWE4UJp5V31+1H/ABk/5NtmNrf7o/D727T/AFh84efv+U68 +x/8AbUvf+oh8swf3cfcHp8f0j3P0B8jf8cGP5j/k2meaOwZBirsVdirsVdirsVfIX/OZn/Kd6J/2 +yx/1ES52Hs7/AHUv636A4+bmyf8AKMf8gc0U/wCVcf8AUZNl2b/GD+OgdPrOZTsnLnXrScKrScKE +s/I1qanr3/bTb/jbND22PVH3O/7N+kvb/UzROyeYfny9fJmoj/iu2/6i0zbdiD/CofH/AHJcTW/3 +R+H3vmQDPQ4wefep/kEeOuah/wAYov8Ak5nOe1Eaxw/rH7nZdmfUfc+l/UziXcu9TFXepirvUxV3 +qYq71MVd6mKvOPzhblolwPaH/k5m79nv8aj7j9zgdo/3J+DxdI89BJebTDTEpeRH3P6jlOQ7MZck +/JzFaFhOFC0nCqbeUd/MVoP+Mn/Jpsxdf/cy+H3hu031h84/mB/ynnmT/tqXv/UQ+Waf+7j/AFR9 +z0+P6R7n6AeRv+ODH8x/ybTPNHYMgxV2KuxV2KuxV2KvkL/nMz/lO9E/7ZY/6iJc7D2d/upf1v0B +x83NlP5TD/kC+iH/AC7n/qMmy3L/AIzL8dA6jWcym5OZDrlpOFC0nChKfyUbjqmue+pN/wAbZpO3 +h6of1Xf9m/SXtXqZz9Oyeafnm9fKOoD/AIrt/wDqKXNz2CP8Lh/nf7kuJrv7o/D73zaFz0mMHnre +nfkWeOt33/GKP/k5nMe1kaxQ/rH7nZ9l/Ufc+j/UzhKdy71MaV3qY0rvUxpXepjSu9TGld6mNK8/ +/NduWlzL7Rf8nM3XYH+NR+P3OD2l/cn4PJEjzvSXmkbYpS4Q/wCfTKpnZjLkmpOUtC0nCq0nJITj +ybv5lsx/xk/5NPmH2h/cy+H3hv0394Hzl+YP/KfeZf8Atq3v/US+Waf+7j/VH3PTw+kPv/yN/wAc +GP5j/k2meaOwZBirsVdirsVdirsVfIX/ADmZ/wAp3on/AGyx/wBREudh7O/3Uv636A4+bmyv8qB/ +yBPRD/xZc/8AUZNlmT/GpfjoHUa1MycynWrScKFhOFUn/JxuOqa1/wBtJv8AjbNR7QD1Q/qu+7M+ +kvZfUznKdm83/Ox+XlW/H/Fdv/1Erm69nh/hkP8AO/3JcTXf3J+H3vncLnp8YvOPSvyUHDWL0+Mc +f/E85P2u/uof1j9ztOy/qPufQ3qZwVO6d6mNK71MaV3qY0rvUxpXepjSu9TGlYJ+ZjcrGUe0X/E8 +3HYX+Mx+P3OB2l/cn4PNEjzuSXmkVbpSRTlZLGXJFk5FpWk5JC0nChOvJG/miyH/ABl/5MvmF2l/ +cS+H3hyNL/eD8dHzn+Yf/Kf+Zv8AtrX3/US+T0391H+qPueoh9Iff3kb/jgx/Mf8m0zzVz2QYq7F +XYq7FXYq7FXyF/zmZ/yneif9ssf9REudh7O/3Uv636A4+bmyz8qv/JHaGf8Aiy5/6jJ8nk/xuXu/ +QHUa1MCczHWLCcKrScKEk/KN+Gqaz/20W/42zV+0Y3x/1Xfdl/SXr31gZzVO0Yv520E+YLSSwbms +EyIHkjKhgUk9Tbl8hmXodXLTZRliATG+fmKas2IZImJ6sFH5J2Q/3ddffF/TOh/0W5/5kPt/W4P8 +lw7ynvlX8v18vXbz25mkMoVX9QpQBWrtxAzV9pdsZNXERkAOHutyNPpI4iSDzei/WBmnpy3fWBjS +u+sDGld9YGNK76wMaV31gY0rvrAxpWGfmA4kt5B/kx/8Tzbdi/4wPj9zgdpf3J+DAkjztCXmldEp +vkbYy5Licm0LScKFhOFU98ib+a7H/nr/AMmXzB7T/wAXl8PvDkaT+8H46PnT8xf/ACYPmf8A7a19 +/wBRL5PTf3Uf6o+56iHIPv3yN/xwY/mP+TaZ5q57IMVdirsVdirsVdir5C/5zMB/x1oh7fosf9RE +udh7O/3Uv636A4+bmyz8qv8AyRuh07S3Ffb/AEyfJz/xuXu/QHUa3kjSczXWLScKFpOFDH/ywfhq +OsH/AJf2/W2a72lG+P8AqO+7L+kvT/rXvnMU7R31r3xpXfWvfGld9a98aV31r3xpXfWvfGld9a98 +aV31r3xpXfWvfGld9a98aV31r3xpWM+bpPUiYeyf8Szadj/4wPj9zg9pf3J+DFUjzsCXmVVkpGTg +id2MuSHJy9oWE4VWk4UJ95CqfNljQbD1a/8AIl8wO1P8Xl8PvDkaP+8H46PnX8xf/Jg+Z/8AtrX3 +/US+T0v91H+qPuephyD798jf8cGP5j/k2meaueyDFXYq7FXYq7FXYq+b/wDnMvyrcXGj6F5ngQtH +YSSWV6QK8VuOLxMfBQ8bLXxYZ0vs7nAlLGeu4+DTmHVif/OOXm+xvdGvfImoTiO5LvdaSXbZlIDS +RINt0ZfUp1ILeGbPtDGYTGUfF12pxcQZ/fafeWUhjuIytDQPT4W+Ry3FljMWC6acDHmhCcta1hOF +Uo/KW39fzBf2/X1dQYU/4LNf7UHfH/Ud92V9Je4/4U/yPwzkuN2tO/wp/kfhjxrTv8Kf5H4Y8a07 +/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GPGtO/wp/kfhjxrTv8Kf5H4Y8a07/Cn+R+GP +GtO/wp/kfhjxrTz78wrH6lf/AFelKxI1Pmx/pm27GN5x8fucDtP+5PwYmkedcS8wuuEpbufb+OMD +6mMuSWE5ltK0nChyJJK4jjUu7bKqgkk+wGJIAsqBfJldi1p5F0G982+Yf3BjjMdlZsQsskjbqig/ +tvxoB2FSds0Wu1H5iQxY9+8u20OlINl82eV7HUPNvny1WWs1zqF4bm8cDqC5lmb2rvT3zK1mUYMB +PdGh9wd/AWafoD5TtzBo6L2LEj5ABf8AjXPPHLTjFXYq7FXYq7FXYql/mDQdL8waLeaLqsIuNPv4 +mhuIj3Vu4PZlO6nsd8sxZZY5CUeYQRb4V/NL8oPNv5a656pEs2kiX1NL1uDko+FqpzZf7qVdtvHd +Sc7vQ9o49TGuUusfxzDjTgQmOjf85K/mRp1klrMbLUymy3F5C5loBQAtDJCG+ZFfE4z7KxSN7j3O +OcUSj/8Aoaf8wf8Aq36T/wAibn/soyH8kYu+X2fqR4Ad/wBDT/mD/wBW/Sf+RNz/ANlGP8kYu+X2 +fqXwAoN/zkl5puryK6v9OtRJACIHsXmtXUk9SzvcfgBlObsSEuUiPfv+puxejkjP+hnPMn++bz/u +JS/9U8xv9Dw/n/7H9rd4rv8AoZzzJ/vm8/7iUv8A1Tx/0PD+f/sf2r4rv+hnPMn++bz/ALiUv/VP +H/Q8P5/+x/aviu/6Gc8yf75vP+4lL/1Tx/0PD+f/ALH9q+K7/oZzzJ/vm8/7iUv/AFTx/wBDw/n/ +AOx/aviu/wChnPMn++bz/uJS/wDVPH/Q8P5/+x/aviu/6Gc8yf75vP8AuJS/9U8f9Dw/n/7H9q+K +7/oZzzJ/vm8/7iUv/VPH/Q8P5/8Asf2r4rv+hnPMn++bz/uJS/8AVPH/AEPD+f8A7H9q+K7/AKGc +8yf75vP+4lL/ANU8f9Dw/n/7H9q+K7/oZzzJ/vm8/wC4lL/1Tx/0PD+f/sf2r4qEm/5yR8yi8jvr +awikvEBQyahNLdjgRSg4mBh1/mPyy7D2FCJ3kT7hX62vJLjFK3/Q0/5g/wDVv0n/AJE3P/ZRmT/J +GLvl9n6nH8AO/wChp/zB/wCrfpP/ACJuf+yjH+SMXfL7P1L4Ad/0NP8AmD/1b9J/5E3P/ZRj/JGL +vl9n6l8AO/6Gn/MH/q36T/yJuf8Asox/kjF3y+z9S+AGj/zlP+YJH/HP0ke/o3P/AGUY/wAkYu+X +2fqXwQwPXvM/nfz/AKxF9emm1O7qRa2cS0jiDHf040AVR0qx32+I5lxhi08L2iO9tjCtg+ifyJ/J +ubQF+u36q+tXajmRusEXXiD+vxNPAE8f2r2l+YlUfoH2+f6nKhCn0XBCkEKQxiiRgKv0ZqGxfirs +VdirsVdirsVdiqhfWFlf2slpewpcW0o4yQyKGVh7g4QSNwryzXP+cZ/yy1G4a4i0xIGY1McTyQrX +5RMo/wCFzYY+1tTAUJn40fvYHGEp/wChVPy+/wCWAf8ASXdf1yf8tar+f9kf1L4cXf8AQqn5ff8A +LAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/ +rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n +/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF +3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff +8sA/6S7r+uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r ++uP8tar+f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+ +f9kf1L4cXf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4c +Xf8AQqn5ff8ALAP+ku6/rj/LWq/n/ZH9S+HF3/Qqn5ff8sA/6S7r+uP8tar+f9kf1L4cW1/5xW/L +9WDCwWo33urkj7icT2zqv5/2R/UvhxZl5Z/KLy9oKcLG1t7RduRgT42p4sQN/c5g5tRkym5yMmQA +DNrOytrSL04E4j9o9ST7nKUq+KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K +uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku +xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux +V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q== + + + + + + +uuid:f3c53255-be8a-4b04-817b-695bf2c54c8b + + + +image/svg+xml + + + +filesave.ai + + + + + + end='w' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PPOCRLabel/resources/icons/undo-cross.png b/PPOCRLabel/resources/icons/undo-cross.png new file mode 100644 index 0000000000000000000000000000000000000000..7d57dcbd0f63427cd0de28a6108660e366b984e5 Binary files /dev/null and b/PPOCRLabel/resources/icons/undo-cross.png differ diff --git a/PPOCRLabel/resources/icons/undo.png b/PPOCRLabel/resources/icons/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ac62bc03f106a5c6bac3a43d51e45c9a1402f4 Binary files /dev/null and b/PPOCRLabel/resources/icons/undo.png differ diff --git a/PPOCRLabel/resources/icons/verify.png b/PPOCRLabel/resources/icons/verify.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4a3b5fd827e4211c8f471aa04834301c71f141 Binary files /dev/null and b/PPOCRLabel/resources/icons/verify.png differ diff --git a/PPOCRLabel/resources/icons/zoom-in.png b/PPOCRLabel/resources/icons/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac4864d4a0c95a022e19ef38b4544711de39f1e Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom-in.png differ diff --git a/PPOCRLabel/resources/icons/zoom-out.png b/PPOCRLabel/resources/icons/zoom-out.png new file mode 100644 index 0000000000000000000000000000000000000000..d67a87de533e307cb0e95ab2623259d98eb1adae Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom-out.png differ diff --git a/PPOCRLabel/resources/icons/zoom.png b/PPOCRLabel/resources/icons/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..8265f27840a14b4b275086df67af01c73a3a8420 Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom.png differ diff --git a/PPOCRLabel/resources/strings/strings-zh-CN.properties b/PPOCRLabel/resources/strings/strings-zh-CN.properties new file mode 100644 index 0000000000000000000000000000000000000000..f30de87579a5d7903c9a989c5ff97c560587e278 --- /dev/null +++ b/PPOCRLabel/resources/strings/strings-zh-CN.properties @@ -0,0 +1,96 @@ +saveAsDetail=將标签保存到其他文件 +changeSaveDir=改变存放目录 +openFile=打开文件 +shapeLineColorDetail=更改线条颜色 +resetAll=重置界面与保存地址 +crtBox=矩形标注 +crtBoxDetail=创建一个新的区块 +dupBoxDetail=复制区块 +verifyImg=验证图像 +zoominDetail=放大 +verifyImgDetail=验证图像 +saveDetail=保存标签文件 +openFileDetail=打开图像文件 +fitWidthDetail=调整宽度适应到窗口宽度 +tutorial=PaddleOCR地址 +editLabel=编辑标签 +openAnnotationDetail=打开标签文件 +quit=退出 +shapeFillColorDetail=更改填充颜色 +closeCurDetail=关闭当前文件 +closeCur=关闭文件 +deleteImg=删除图像 +deleteImgDetail=删除当前图像 +fitWin=调整到窗口大小 +delBox=删除选择的区块 +boxLineColorDetail=选择线框颜色 +originalsize=原始大小 +resetAllDetail=重置所有设定 +zoomoutDetail=放大画面 +save=保存 +saveAs=另存为 +fitWinDetail=缩放到当前窗口大小 +openDir=打开目录 +copyPrevBounding=复制当前图像中的上一个边界框 +showHide=显示/隐藏标签 +changeSaveFormat=更改存储格式 +shapeFillColor=填充颜色 +quitApp=退出程序 +dupBox=复制区块 +delBoxDetail=删除区块 +zoomin=放大画面 +info=信息 +openAnnotation=开启标签 +prevImgDetail=上一个图像 +fitWidth=缩放到跟当前画面一样宽 +zoomout=缩小画面 +changeSavedAnnotationDir=更改保存标签文件的预设目录 +nextImgDetail=下一个图像 +originalsizeDetail=放大到原始大小 +prevImg=上一张 +tutorialDetail=显示示范内容 +shapeLineColor=形状线条颜色 +boxLineColor=区块线条颜色 +editLabelDetail=修改当前所选的区块颜色 +nextImg=下一张 +useDefaultLabel=使用预设标签 +useDifficult=有难度的 +boxLabelText=区块的标签 +labels=标签 +autoSaveMode=自动保存模式 +singleClsMode=单一类别模式 +displayLabel=显示类别 +fileList=文件列表 +files=文件 +advancedMode=专家模式 +advancedModeDetail=切换到专家模式 +showAllBoxDetail=显示所有区块 +hideAllBoxDetail=隐藏所有区块 +annoPanel=标注面板 +anno=标注 +addNewBbox=新框 +reLabel=重标注 +choosemodel=选择模型 +tipchoosemodel=选择OCR模型 +ImageResize=图片缩放 +IR=图片缩放 +autoRecognition=自动标注 +reRecognition=重新识别 +mfile=文件 +medit=编辑 +mview=视图 +mhelp=帮助 +iconList=缩略图 +detectionBoxposition=检测框位置 +recognitionResult=识别结果 +creatPolygon=四点标注 +drawSquares=正方形标注 +saveRec=保存识别结果 +tempLabel=待识别 +steps=操作步骤 +choseModelLg=选择模型语言 +cancel=取消 +ok=确认 +autolabeling=自动标注中 +hideBox=隐藏所有标注 +showBox=显示所有标注 \ No newline at end of file diff --git a/PPOCRLabel/resources/strings/strings-zh-TW.properties b/PPOCRLabel/resources/strings/strings-zh-TW.properties new file mode 100644 index 0000000000000000000000000000000000000000..c14eeb9b22b25adfd6a163a520f29410834e3a4d --- /dev/null +++ b/PPOCRLabel/resources/strings/strings-zh-TW.properties @@ -0,0 +1,70 @@ +saveAsDetail=將標籤保存到其他文件 +changeSaveDir=改變存放目錄 +openFile=開啟檔案 +shapeLineColorDetail=更改線條顏色 +resetAll=重置 +crtBox=創建區塊 +crtBoxDetail=畫一個區塊 +dupBoxDetail=複製區塊 +verifyImg=驗證圖像 +zoominDetail=放大 +verifyImgDetail=驗證圖像 +saveDetail=將標籤存到 +openFileDetail=打開圖像 +fitWidthDetail=調整到窗口寬度 +tutorial=YouTube教學 +editLabel=編輯標籤 +openAnnotationDetail=打開標籤文件 +quit=結束 +shapeFillColorDetail=更改填充顏色 +closeCurDetail=關閉目前檔案 +closeCur=關閉 +deleteImg=刪除圖像 +deleteImgDetail=刪除目前圖像 +fitWin=調整到跟窗口一樣大小 +delBox=刪除選取區塊 +boxLineColorDetail=選擇框線顏色 +originalsize=原始大小 +resetAllDetail=重設所有設定 +zoomoutDetail=畫面放大 +save=儲存 +saveAs=另存為 +fitWinDetail=縮放到窗口一樣 +openDir=開啟目錄 +copyPrevBounding=複製當前圖像中的上一個邊界框 +showHide=顯示/隱藏標籤 +changeSaveFormat=更改儲存格式 +shapeFillColor=填充顏色 +quitApp=離開本程式 +dupBox=複製區塊 +delBoxDetail=刪除區塊 +zoomin=放大畫面 +info=資訊 +openAnnotation=開啟標籤 +prevImgDetail=上一個圖像 +fitWidth=縮放到跟畫面一樣寬 +zoomout=縮小畫面 +changeSavedAnnotationDir=更改預設標籤存的目錄 +nextImgDetail=下一個圖像 +originalsizeDetail=放大到原始大小 +prevImg=上一個圖像 +tutorialDetail=顯示示範內容 +shapeLineColor=形狀線條顏色 +boxLineColor=日期分隔線顏色 +editLabelDetail=修改所選區塊的標籤 +nextImg=下一張圖片 +useDefaultLabel=使用預設標籤 +useDifficult=有難度的 +boxLabelText=區塊的標籤 +labels=標籤 +autoSaveMode=自動儲存模式 +singleClsMode=單一類別模式 +displayLabel=顯示類別 +fileList=檔案清單 +files=檔案 +iconList=XX +icon=XX +advancedMode=進階模式 +advancedModeDetail=切到進階模式 +showAllBoxDetail=顯示所有區塊 +hideAllBoxDetail=隱藏所有區塊 diff --git a/PPOCRLabel/resources/strings/strings.properties b/PPOCRLabel/resources/strings/strings.properties new file mode 100644 index 0000000000000000000000000000000000000000..55ae9fe26174ccf30b9f39d1c4ac4c1e11436db3 --- /dev/null +++ b/PPOCRLabel/resources/strings/strings.properties @@ -0,0 +1,96 @@ +openFile=Open +openFileDetail=Open image or label file +quit=Quit +quitApp=Quit application +openDir=Open Dir +copyPrevBounding=Copy previous Bounding Boxes in the current image +changeSavedAnnotationDir=Change default saved Annotation dir +openAnnotation=Open Annotation +openAnnotationDetail=Open an annotation file +changeSaveDir=Change Save Dir +nextImg=Next Image +nextImgDetail=Open the next Image +prevImg=Prev Image +prevImgDetail=Open the previous Image +verifyImg=Verify Image +verifyImgDetail=Verify Image +save=Save +saveDetail=Save the labels to a file +changeSaveFormat=Change save format +saveAs=Save As +saveAsDetail=Save the labels to a different file +closeCur=Close +closeCurDetail=Close the current file +deleteImg=Delete current image +deleteImgDetail=Delete the current image +resetAll=Reset Interface and Save Dir +resetAllDetail=Reset All +boxLineColor=Box Line Color +boxLineColorDetail=Choose Box line color +crtBox=Create RectBox +crtBoxDetail=Draw a new box +delBox=Delete RectBox +delBoxDetail=Remove the box +dupBox=Duplicate RectBox +dupBoxDetail=Create a duplicate of the selected box +tutorial=PaddleOCR url +tutorialDetail=Show demo +info=Information +zoomin=Zoom In +zoominDetail=Increase zoom level +zoomout=Zoom Out +zoomoutDetail=Decrease zoom level +originalsize=Original size +originalsizeDetail=Zoom to original size +fitWin=Fit Window +fitWinDetail=Zoom follows window size +fitWidth=Fit Width +fitWidthDetail=Zoom follows window width +editLabel=Edit Label +editLabelDetail=Modify the label of the selected Box +shapeLineColor=Shape Line Color +shapeLineColorDetail=Change the line color for this specific shape +shapeFillColor=Shape Fill Color +shapeFillColorDetail=Change the fill color for this specific shape +showHide=Show/Hide Label Panel +useDefaultLabel=Use default label +useDifficult=Difficult +boxLabelText=Box Labels +labels=Labels +autoSaveMode=Auto Save mode +singleClsMode=Single Class Mode +displayLabel=Display Labels +fileList=File List +files=Files +advancedMode=Advanced Mode +advancedModeDetail=Swtich to advanced mode +showAllBoxDetail=Show all bounding boxes +hideAllBoxDetail=Hide all bounding boxes +annoPanel=anno Panel +anno=anno +addNewBbox=new bbox +reLabel=reLabel +choosemodel=Choose OCR model +tipchoosemodel=Choose OCR model from dir +ImageResize=Image Resize +IR=Image Resize +autoRecognition=Auto Recognition +reRecognition=Re-recognition +mfile=File +medit=Eidt +mview=View +mhelp=Help +iconList=Icon List +detectionBoxposition=Detection box position +recognitionResult=Recognition result +creatPolygon=Create Quadrilateral +drawSquares=Draw Squares +saveRec=Save Recognition Result +tempLabel=TEMPORARY +steps=Steps +choseModelLg=Choose Model Language +cancel=Cancel +ok=OK +autolabeling=Automatic Labeling +hideBox=Hide All Box +showBox=Show All Box \ No newline at end of file diff --git a/PPOCRLabel/setup.cfg b/PPOCRLabel/setup.cfg new file mode 100644 index 0000000000000000000000000000000000000000..3b273b63db2b4485f8a0c33df53004f0d960b87b --- /dev/null +++ b/PPOCRLabel/setup.cfg @@ -0,0 +1,8 @@ +[bumpversion] +commit = True +tag = True + +[bumpversion:file:setup.py] + +[bdist_wheel] +universal = 1 diff --git a/PPOCRLabel/setup.py b/PPOCRLabel/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..008514fd7777713eb76f900f5ea15a4366517dd8 --- /dev/null +++ b/PPOCRLabel/setup.py @@ -0,0 +1,139 @@ +# Copyright (c) <2015-Present> Tzutalin +# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba, +# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +# associated documentation files (the "Software"), to deal in the Software without restriction, including without +# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of +# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT +# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from setuptools import setup, find_packages, Command +from sys import platform as _platform +from shutil import rmtree +import sys +import os + +here = os.path.abspath(os.path.dirname(__file__)) +NAME = 'labelImg' +REQUIRES_PYTHON = '>=3.0.0' +REQUIRED_DEP = ['pyqt5', 'lxml'] +about = {} + +with open(os.path.join(here, 'libs', '__init__.py')) as f: + exec(f.read(), about) + +with open('README.rst') as readme_file: + readme = readme_file.read() + +with open('HISTORY.rst') as history_file: + history = history_file.read() + + +# OS specific settings +SET_REQUIRES = [] +if _platform == "linux" or _platform == "linux2": + # linux + print('linux') +elif _platform == "darwin": + # MAC OS X + SET_REQUIRES.append('py2app') + +required_packages = find_packages() +required_packages.append('labelImg') + +APP = [NAME + '.py'] +OPTIONS = { + 'argv_emulation': True, + 'iconfile': 'resources/icons/app.icns' +} + +class UploadCommand(Command): + """Support setup.py upload.""" + + description=readme + '\n\n' + history, + + user_options = [] + + @staticmethod + def status(s): + """Prints things in bold.""" + print('\033[1m{0}\033[0m'.format(s)) + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + try: + self.status('Removing previous builds…') + rmtree(os.path.join(here, 'dist')) + except OSError: + self.status('Fail to remove previous builds..') + pass + + self.status('Building Source and Wheel (universal) distribution…') + os.system( + '{0} setup.py sdist bdist_wheel --universal'.format(sys.executable)) + + self.status('Uploading the package to PyPI via Twine…') + os.system('twine upload dist/*') + + self.status('Pushing git tags…') + os.system('git tag -d v{0}'.format(about['__version__'])) + os.system('git tag v{0}'.format(about['__version__'])) + # os.system('git push --tags') + + sys.exit() + + +setup( + app=APP, + name=NAME, + version=about['__version__'], + description="LabelImg is a graphical image annotation tool and label object bounding boxes in images", + long_description=readme + '\n\n' + history, + author="TzuTa Lin", + author_email='tzu.ta.lin@gmail.com', + url='https://github.com/tzutalin/labelImg', + python_requires=REQUIRES_PYTHON, + package_dir={'labelImg': '.'}, + packages=required_packages, + entry_points={ + 'console_scripts': [ + 'labelImg=labelImg.labelImg:main' + ] + }, + include_package_data=True, + install_requires=REQUIRED_DEP, + license="MIT license", + zip_safe=False, + keywords='labelImg labelTool development annotation deeplearning', + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Natural Language :: English', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + ], + package_data={'data/predefined_classes.txt': ['data/predefined_classes.txt']}, + options={'py2app': OPTIONS}, + setup_requires=SET_REQUIRES, + # $ setup.py publish support. + cmdclass={ + 'upload': UploadCommand, + } +) diff --git a/README.md b/README.md index 831bb70913457fbeeb5bee868a31ff937e71f3c9..758f1a49c12499d17e38674be20aac90e46c8967 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ English | [简体中文](README_ch.md) ## Introduction -PaddleOCR aims to create rich, leading, and practical OCR tools that help users train better models and apply them into practice. +PaddleOCR aims to create multilingual, awesome, leading, and practical OCR tools that help users train better models and apply them into practice. **Recent updates** +- 2020.11.25 Update a new data annotation tool, i.e., [PPOCRLabel](./PPOCRLabel/README_en.md), which is helpful to improve the labeling efficiency. Moreover, the labeling results can be used in training of the PP-OCR system directly. - 2020.9.22 Update the PP-OCR technical article, https://arxiv.org/abs/2009.09941 - 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipeline](#PP-OCR-Pipeline)), suitable for mobile deployment. [Model Downloads](#Supported-Chinese-model-list) - 2020.9.17 Update the ultra lightweight ppocr_mobile series and general ppocr_server series Chinese and English ocr models, which are comparable to commercial effects. [Model Downloads](#Supported-Chinese-model-list) -- 2020.9.17 update [English recognition model](./doc/doc_en/models_list_en.md#english-recognition-model) and [Multilingual recognition model](doc/doc_en/models_list_en.md#english-recognition-model), `German`, `French`, `Japanese` and `Korean` have been supported. Models for more languages will continue to be updated. +- 2020.9.17 update [English recognition model](./doc/doc_en/models_list_en.md#english-recognition-model) and [Multilingual recognition model](doc/doc_en/models_list_en.md#english-recognition-model), `English`, `Chinese`, `German`, `French`, `Japanese` and `Korean` have been supported. Models for more languages will continue to be updated. - 2020.8.24 Support the use of PaddleOCR through whl package installation,please refer [PaddleOCR Package](./doc/doc_en/whl_en.md) - 2020.8.21 Update the replay and PPT of the live lesson at Bilibili on August 18, lesson 2, easy to learn and use OCR tool spree. [Get Address](https://aistudio.baidu.com/aistudio/education/group/info/1519) - [more](./doc/doc_en/update_en.md) @@ -64,39 +65,47 @@ Mobile DEMO experience (based on EasyEdge and Paddle-Lite, supports iOS and Andr | Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | | Chinese and English general OCR model (155.1M) | ch_ppocr_server_v1.1_xx | Server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | | Chinese and English ultra-lightweight compressed OCR model (3.5M) | ch_ppocr_mobile_slim_v1.1_xx | Mobile | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | +| French ultra-lightweight OCR model (4.6M) | french_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar) | +| German ultra-lightweight OCR model (4.6M) | german_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar) | +| Korean ultra-lightweight OCR model (5.9M) | korean_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)| +| Japan ultra-lightweight OCR model (6.2M) | japan_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar) | -For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md) +For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md). +For a new language request, please refer to [Guideline for new language_requests](#language_requests). ## Tutorials - [Installation](./doc/doc_en/installation_en.md) - [Quick Start](./doc/doc_en/quickstart_en.md) - [Code Structure](./doc/doc_en/tree_en.md) -- Algorithm introduction +- Algorithm Introduction - [Text Detection Algorithm](./doc/doc_en/algorithm_overview_en.md) - [Text Recognition Algorithm](./doc/doc_en/algorithm_overview_en.md) - [PP-OCR Pipeline](#PP-OCR-Pipeline) -- Model training/evaluation +- Model Training/Evaluation - [Text Detection](./doc/doc_en/detection_en.md) - [Text Recognition](./doc/doc_en/recognition_en.md) - [Direction Classification](./doc/doc_en/angle_class_en.md) - [Yml Configuration](./doc/doc_en/config_en.md) - Inference and Deployment - - [Quick inference based on pip](./doc/doc_en/whl_en.md) + - [Quick Inference Based on PIP](./doc/doc_en/whl_en.md) - [Python Inference](./doc/doc_en/inference_en.md) - [C++ Inference](./deploy/cpp_infer/readme_en.md) - [Serving](./deploy/hubserving/readme_en.md) - [Mobile](./deploy/lite/readme_en.md) - [Model Quantization](./deploy/slim/quantization/README_en.md) - [Model Compression](./deploy/slim/prune/README_en.md) - - [Benchmark](./doc/doc_en/benchmark_en.md) + - [Benchmark](./doc/doc_en/benchmark_en.md) +- Data Annotation and Synthesis + - [Semi-automatic Annotation Tool](./PPOCRLabel/README_en.md) + - [Data Annotation Tools](./doc/doc_en/data_annotation_en.md) + - [Data Synthesis Tools](./doc/doc_en/data_synthesis_en.md) - Datasets - [General OCR Datasets(Chinese/English)](./doc/doc_en/datasets_en.md) - [HandWritten_OCR_Datasets(Chinese)](./doc/doc_en/handwritten_datasets_en.md) - [Various OCR Datasets(multilingual)](./doc/doc_en/vertical_and_multilingual_datasets_en.md) - - [Data Annotation Tools](./doc/doc_en/data_annotation_en.md) - - [Data Synthesis Tools](./doc/doc_en/data_synthesis_en.md) - [Visualization](#Visualization) +- [New language requests](#language_requests) - [FAQ](./doc/doc_en/FAQ_en.md) - [Community](#Community) - [References](./doc/doc_en/reference_en.md) @@ -136,6 +145,23 @@ PP-OCR is a practical ultra-lightweight OCR system. It is mainly composed of thr + +## Guideline for new language requests + +If you want to request a new language support, a PR with 2 following files are needed: + +1. In folder [ppocr/utils/dict](https://github.com/PaddlePaddle/PaddleOCR/tree/develop/ppocr/utils/dict), +it is necessary to submit the dict text to this path and name it with `{language}_dict.txt` that contains a list of all characters. Please see the format example from other files in that folder. + +2. In folder [ppocr/utils/corpus](https://github.com/PaddlePaddle/PaddleOCR/tree/develop/ppocr/utils/corpus), +it is necessary to submit the corpus to this path and name it with `{language}_corpus.txt` that contains a list of words in your language. +Maybe, 50000 words per language is necessary at least. +Of course, the more, the better. + +If your language has unique elements, please tell me in advance within any way, such as useful links, wikipedia and so on. + +More details, please refer to [Multilingual OCR Development Plan](https://github.com/PaddlePaddle/PaddleOCR/issues/1048). + ## License @@ -152,3 +178,7 @@ We welcome all the contributions to PaddleOCR and appreciate for your feedback v - Thanks [authorfu](https://github.com/authorfu) for contributing Android demo and [xiadeye](https://github.com/xiadeye) contributing iOS demo, respectively. - Thanks [BeyondYourself](https://github.com/BeyondYourself) for contributing many great suggestions and simplifying part of the code style. - Thanks [tangmq](https://gitee.com/tangmq) for contributing Dockerized deployment services to PaddleOCR and supporting the rapid release of callable Restful API services. +- Thanks [lijinhan](https://github.com/lijinhan) for contributing a new way, i.e., java SpringBoot, to achieve the request for the Hubserving deployment. +- Thanks [Mejans](https://github.com/Mejans) for contributing the Occitan corpus and character set. +- Thanks [LKKlein](https://github.com/LKKlein) for contributing a new deploying package with the Golang program language. +- Thanks [Evezerest](https://github.com/Evezerest), [ninetailskim](https://github.com/ninetailskim), [edencfc](https://github.com/edencfc), [BeyondYourself](https://github.com/BeyondYourself) and [1084667371](https://github.com/1084667371) for contributing a new data annotation tool, i.e., PPOCRLabel。 diff --git a/README_ch.md b/README_ch.md index 92f82c59939449e88df55efb4fa4d3e92350d225..36478e62cc74eb5060b9ead62860751095b13bcc 100644 --- a/README_ch.md +++ b/README_ch.md @@ -4,8 +4,8 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 **近期更新** -- 2020.11.2 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,共计99个常见问题及解答,并且计划以后每周一都会更新,欢迎大家持续关注。 -- 2020.10.26 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,共计94个常见问题及解答,并且计划以后每周一都会更新,欢迎大家持续关注。 +- 2020.11.30 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,共计119个常见问题及解答,并且计划以后每周一都会更新,欢迎大家持续关注。 +- 2020.11.25 更新半自动标注工具[PPOCRLabel](./PPOCRLabel/README.md),辅助开发者高效完成标注任务,输出格式与PP-OCR训练任务完美衔接。 - 2020.9.22 更新PP-OCR技术文章,https://arxiv.org/abs/2009.09941 - 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipeline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载) - 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型,媲美商业效果。[模型下载](#模型下载) @@ -14,7 +14,6 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 - 2020.8.21 更新8月18日B站直播课回放和PPT,课节2,易学易用的OCR工具大礼包,[获取地址](https://aistudio.baidu.com/aistudio/education/group/info/1519) - [More](./doc/doc_ch/update.md) - ## 特性 - PPOCR系列高质量预训练模型,准确的识别效果 @@ -55,7 +54,7 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 -- 代码体验:从[快速安装](./doc/doc_ch/installation.md) 开始 +- 代码体验:[中文OCR模型快速使用](./doc/doc_ch/quickstart.md) ## PP-OCR 1.1系列模型列表(9月17日更新) @@ -85,22 +84,24 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力 - [基于pip安装whl包快速推理](./doc/doc_ch/whl.md) - [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md) - [基于C++预测引擎推理](./deploy/cpp_infer/readme.md) - - [服务化部署](./doc/doc_ch/serving_inference.md) + - [服务化部署](./deploy/hubserving/readme.md) - [端侧部署](./deploy/lite/readme.md) - [模型量化](./deploy/slim/quantization/README.md) - [模型裁剪](./deploy/slim/prune/README.md) - [Benchmark](./doc/doc_ch/benchmark.md) +- 数据标注与合成 + - [半自动标注工具 PPOCRLabel](./PPOCRLabel/README.md) + - [常用数据标注工具](./doc/doc_ch/data_annotation.md) + - [常用数据合成工具](./doc/doc_ch/data_synthesis.md) - 数据集 - [通用中英文OCR数据集](./doc/doc_ch/datasets.md) - [手写中文OCR数据集](./doc/doc_ch/handwritten_datasets.md) - - [垂类多语言OCR数据集](./doc/doc_ch/vertical_and_multilingual_datasets.md) - - [常用数据标注工具](./doc/doc_ch/data_annotation.md) - - [常用数据合成工具](./doc/doc_ch/data_synthesis.md) + - [垂类多语言OCR数据集](./doc/doc_ch/vertical_and_multilingual_datasets.md) - [效果展示](#效果展示) - FAQ - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) - - [【理论篇】OCR通用24个问题](./doc/doc_ch/FAQ.md) - - [【实战篇】PaddleOCR实战65个问题](./doc/doc_ch/FAQ.md) + - [【理论篇】OCR通用29个问题](./doc/doc_ch/FAQ.md) + - [【实战篇】PaddleOCR实战80个问题](./doc/doc_ch/FAQ.md) - [技术交流群](#欢迎加入PaddleOCR技术交流群) - [参考文献](./doc/doc_ch/reference.md) - [许可证书](#许可证书) @@ -152,3 +153,6 @@ PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测、检测框 - 非常感谢 [authorfu](https://github.com/authorfu) 贡献Android和[xiadeye](https://github.com/xiadeye) 贡献IOS的demo代码 - 非常感谢 [BeyondYourself](https://github.com/BeyondYourself) 给PaddleOCR提了很多非常棒的建议,并简化了PaddleOCR的部分代码风格。 - 非常感谢 [tangmq](https://gitee.com/tangmq) 给PaddleOCR增加Docker化部署服务,支持快速发布可调用的Restful API服务。 +- 非常感谢 [lijinhan](https://github.com/lijinhan) 给PaddleOCR增加java SpringBoot 调用OCR Hubserving接口完成对OCR服务化部署的使用。 +- 非常感谢 [Mejans](https://github.com/Mejans) 给PaddleOCR增加新语言奥克西坦语Occitan的字典和语料。 +- 非常感谢 [Evezerest](https://github.com/Evezerest), [ninetailskim](https://github.com/ninetailskim), [edencfc](https://github.com/edencfc), [BeyondYourself](https://github.com/BeyondYourself), [1084667371](https://github.com/1084667371) 贡献了PPOCRLabel的完整代码。 diff --git a/configs/rec/rec_mv3_none_bilstm_ctc.yml b/configs/rec/rec_mv3_none_bilstm_ctc.yml index d2e096fb1c51588a6bd2c7ca8321cf817d435f23..55feaaf883e18791bc76430a7afaaacb7f5812b6 100755 --- a/configs/rec/rec_mv3_none_bilstm_ctc.yml +++ b/configs/rec/rec_mv3_none_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_mv3_none_none_ctc.yml b/configs/rec/rec_mv3_none_none_ctc.yml index ceec09ce6f3b6cb2238d6fb2e15f510cb31e0fd8..0cf377834e733756b356525896ba57a242fa3f62 100755 --- a/configs/rec/rec_mv3_none_none_ctc.yml +++ b/configs/rec/rec_mv3_none_none_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_mv3_tps_bilstm_attn.yml b/configs/rec/rec_mv3_tps_bilstm_attn.yml index 7fc4f6799459bf9fbcd25e1609aeca5e3fd12a74..d02edaba238af701a8b81b240ee9a89cbc1ed995 100755 --- a/configs/rec/rec_mv3_tps_bilstm_attn.yml +++ b/configs/rec/rec_mv3_tps_bilstm_attn.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: attention tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_mv3_tps_bilstm_ctc.yml b/configs/rec/rec_mv3_tps_bilstm_ctc.yml index 4b9660bcdec60989a6d9b9926c40814a83db6f39..509d616bc0e9456c1fb86c94e5eef1c2f9515aad 100755 --- a/configs/rec/rec_mv3_tps_bilstm_ctc.yml +++ b/configs/rec/rec_mv3_tps_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_r34_vd_none_bilstm_ctc.yml b/configs/rec/rec_r34_vd_none_bilstm_ctc.yml index b71e8feae7ac8f235bf471101efd4383c61bfab2..7332f0f8679c32afd4435dbddef29f651c994b26 100755 --- a/configs/rec/rec_r34_vd_none_bilstm_ctc.yml +++ b/configs/rec/rec_r34_vd_none_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_r34_vd_none_none_ctc.yml b/configs/rec/rec_r34_vd_none_none_ctc.yml index d9c9458d6d8fcdb9df590b0093d54b71e3e53fcc..b42b5535471f078b79002b8ea930a7c846207a86 100755 --- a/configs/rec/rec_r34_vd_none_none_ctc.yml +++ b/configs/rec/rec_r34_vd_none_none_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc reader_yml: ./configs/rec/rec_benchmark_reader.yml pretrain_weights: diff --git a/configs/rec/rec_r34_vd_tps_bilstm_attn.yml b/configs/rec/rec_r34_vd_tps_bilstm_attn.yml index dfcd97fad67081a7ed04ad1d67ff298c9f553b0c..73ed68481f8ca189491375321c3848998b74410f 100755 --- a/configs/rec/rec_r34_vd_tps_bilstm_attn.yml +++ b/configs/rec/rec_r34_vd_tps_bilstm_attn.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: attention tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml b/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml index 574a088cc024541e086bedc0bc0a52082e9e7eb2..9a621a1462df156272938740ceddef1aa850f95a 100755 --- a/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml +++ b/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml @@ -12,6 +12,7 @@ Global: image_shape: [3, 32, 100] max_text_length: 25 character_type: en + character_dict_path: loss_type: ctc tps: true reader_yml: ./configs/rec/rec_benchmark_reader.yml diff --git a/configs/rec/rec_r50fpn_vd_none_srn.yml b/configs/rec/rec_r50fpn_vd_none_srn.yml index 30709e479f8da56b6bd7fe9ebf817a27bff9cc38..e7040d9a1d6a311d61fe3f8b6396ccfdfd8c0b95 100755 --- a/configs/rec/rec_r50fpn_vd_none_srn.yml +++ b/configs/rec/rec_r50fpn_vd_none_srn.yml @@ -12,6 +12,7 @@ Global: image_shape: [1, 64, 256] max_text_length: 25 character_type: en + character_dict_path: loss_type: srn num_heads: 8 average_window: 0.15 diff --git a/deploy/android_demo/app/build.gradle b/deploy/android_demo/app/build.gradle index 5ecb11692c2a66f941dc41425761519607bad39e..494247a3792814ab8373f150c5f7b35b1b821971 100644 --- a/deploy/android_demo/app/build.gradle +++ b/deploy/android_demo/app/build.gradle @@ -57,7 +57,7 @@ def archives = [ ], [ 'src' : 'https://paddleocr.bj.bcebos.com/deploy/lite/ocr_v1_for_cpu.tar.gz', - 'dest' : 'src/main/assets/models/ocr_v1_for_cpu' + 'dest' : 'src/main/assets/models' ] ] diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java index 3bb7e06d2f33a0ed8bf08e7edc8b1866ac564ce6..1fa419e32a4cbefc27fc687b376ecc7e6a1e8a2f 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java @@ -53,11 +53,18 @@ public class OCRPredictorNative { } + public void destory(){ + if (nativePointer > 0) { + release(nativePointer); + nativePointer = 0; + } + } + protected native long init(String detModelPath, String recModelPath,String clsModelPath, int threadNum, String cpuMode); protected native float[] forward(long pointer, float[] buf, float[] ddims, Bitmap originalImage); - public native void release(long pointer); + protected native void release(long pointer); private ArrayList postprocess(float[] raw) { ArrayList results = new ArrayList(); diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java index ddf69ab481618696189a7d0d45264791267e5631..572d0b22deada648d1291091d05130d5ecf270a8 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java @@ -135,7 +135,7 @@ public class Predictor { public void releaseModel() { if (paddlePredictor != null) { - paddlePredictor.release(); + paddlePredictor.destory(); paddlePredictor = null; } isLoaded = false; diff --git a/deploy/cpp_infer/src/preprocess_op.cpp b/deploy/cpp_infer/src/preprocess_op.cpp index 494b774ad0b2ecf73e555b2c31c250b7b0730c65..1d3e31a14888969b0b56398bdcb9925d03e91cfe 100644 --- a/deploy/cpp_infer/src/preprocess_op.cpp +++ b/deploy/cpp_infer/src/preprocess_op.cpp @@ -88,7 +88,7 @@ void ResizeImgType0::Run(const cv::Mat &img, cv::Mat &resize_img, else if (resize_w / 32 < 1 + 1e-5) resize_w = 32; else - resize_w = (resize_w / 32 - 1) * 32; + resize_w = resize_w / 32 * 32; cv::resize(img, resize_img, cv::Size(resize_w, resize_h)); diff --git a/deploy/docker/hubserving/README.md b/deploy/docker/hubserving/README.md index 62381073d4c7448f9a238ca4dda4b294ce864f7a..c4bb1413db42ff40c9c99d76b86364e73a71e561 100644 --- a/deploy/docker/hubserving/README.md +++ b/deploy/docker/hubserving/README.md @@ -20,7 +20,7 @@ git clone https://github.com/PaddlePaddle/PaddleOCR.git ``` b. Goto Dockerfile directory(ps:Need to distinguish between cpu and gpu version, the following takes cpu as an example, gpu version needs to replace the keyword) ``` -cd deploy/docker/cpu +cd deploy/docker/hubserving/cpu ``` c. Build image ``` diff --git a/deploy/docker/hubserving/README_cn.md b/deploy/docker/hubserving/README_cn.md index f117a0ab4186fea0cb94881c65b2b353bee37ff7..d13dab6b15ec283a328b67c6cbe716d75b42ce8d 100644 --- a/deploy/docker/hubserving/README_cn.md +++ b/deploy/docker/hubserving/README_cn.md @@ -20,7 +20,7 @@ git clone https://github.com/PaddlePaddle/PaddleOCR.git ``` b.切换至Dockerfile目录(注:需要区分cpu或gpu版本,下文以cpu为例,gpu版本需要替换一下关键字即可) ``` -cd deploy/docker/cpu +cd deploy/docker/hubserving/cpu ``` c.生成镜像 ``` diff --git a/deploy/docker/hubserving/cpu/Dockerfile b/deploy/docker/hubserving/cpu/Dockerfile index 8404b4c007731fa02816aecfefc2fe3cd7da7c73..21bb41d38f2ddc60da85ee2ad39e8a500334ec6f 100755 --- a/deploy/docker/hubserving/cpu/Dockerfile +++ b/deploy/docker/hubserving/cpu/Dockerfile @@ -8,21 +8,25 @@ RUN python3.7 -m pip install paddlepaddle==1.7.2 -i https://pypi.tuna.tsinghua.e RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR +RUN git clone https://gitee.com/paddlepaddle/PaddleOCR.git /PaddleOCR WORKDIR /PaddleOCR -RUN pip3.7 install -r requirments.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN pip3.7 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN mkdir -p /PaddleOCR/inference -# Download orc detect model(light version). if you want to change normal version, you can change ch_det_mv3_db_infer to ch_det_r50_vd_db_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_det_mv3_db_infer.tar -C /PaddleOCR/inference +RUN mkdir -p /PaddleOCR/inference/ +# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v1.1_det_infer to ch_ppocr_server_v1.1_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_det_infer.tar -C /PaddleOCR/inference/ -# Download orc recognition model(light version). If you want to change normal version, you can change ch_rec_mv3_crnn_infer to ch_rec_r34_vd_crnn_enhance_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_rec_mv3_crnn_infer.tar -C /PaddleOCR/inference +# Download direction classifier(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_cls_infer to ch_ppocr_mobile_v1.1_cls_infer, also remember change cls_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_cls_infer.tar -C /PaddleOCR/inference/ + +# Download orc recognition model(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_rec_infer to ch_ppocr_server_v1.1_rec_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_rec_infer.tar -C /PaddleOCR/inference/ EXPOSE 8866 -CMD ["/bin/bash","-c","export PYTHONPATH=. && hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file +CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file diff --git a/deploy/docker/hubserving/gpu/Dockerfile b/deploy/docker/hubserving/gpu/Dockerfile index 1320a7f34b05ee470fa2bcf30548295f11427237..f0c81140732145d371dc638a7b00ee22d38b59f7 100755 --- a/deploy/docker/hubserving/gpu/Dockerfile +++ b/deploy/docker/hubserving/gpu/Dockerfile @@ -8,21 +8,25 @@ RUN python3.7 -m pip install paddlepaddle-gpu==1.7.2.post107 -i https://pypi.tun RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR +RUN git clone https://gitee.com/paddlepaddle/PaddleOCR.git /PaddleOCR -WORKDIR /home/PaddleOCR +WORKDIR /PaddleOCR -RUN pip3.7 install -r requirments.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +RUN pip3.7 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple -RUN mkdir -p /PaddleOCR/inference -# Download orc detect model(light version). if you want to change normal version, you can change ch_det_mv3_db_infer to ch_det_r50_vd_db_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_det_mv3_db_infer.tar -C /PaddleOCR/inference +RUN mkdir -p /PaddleOCR/inference/ +# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v1.1_det_infer to ch_ppocr_server_v1.1_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_det_infer.tar -C /PaddleOCR/inference/ -# Download orc recognition model(light version). If you want to change normal version, you can change ch_rec_mv3_crnn_infer to ch_rec_r34_vd_crnn_enhance_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) -ADD https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar /PaddleOCR/inference -RUN tar xf /PaddleOCR/inference/ch_rec_mv3_crnn_infer.tar -C /PaddleOCR/inference +# Download direction classifier(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_cls_infer to ch_ppocr_mobile_v1.1_cls_infer, also remember change cls_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_cls_infer.tar -C /PaddleOCR/inference/ + +# Download orc recognition model(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_rec_infer to ch_ppocr_server_v1.1_rec_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py) +ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar /PaddleOCR/inference/ +RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_rec_infer.tar -C /PaddleOCR/inference/ EXPOSE 8866 -CMD ["/bin/bash","-c","export PYTHONPATH=. && hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file +CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"] \ No newline at end of file diff --git a/deploy/hubserving/readme.md b/deploy/hubserving/readme.md index 44d2af86826fe6c77734c6a9d5b0c3d098cac44e..9e87dd135256546f223492cbc7ab7ab8cde83d58 100644 --- a/deploy/hubserving/readme.md +++ b/deploy/hubserving/readme.md @@ -2,7 +2,7 @@ PaddleOCR提供2种服务部署方式: - 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",按照本教程使用; -- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",使用方法参考[文档](../../doc/doc_ch/serving_inference.md)。 +- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",使用方法参考[文档](../../deploy/pdserving/readme.md)。 # 基于PaddleHub Serving的服务部署 diff --git a/deploy/hubserving/readme_en.md b/deploy/hubserving/readme_en.md index c7ffb69a398f8463a4b94b46ea39d840c3d6de36..6a8da865a1bcb5564a4a8694bbbff0f4a4f75850 100644 --- a/deploy/hubserving/readme_en.md +++ b/deploy/hubserving/readme_en.md @@ -2,7 +2,7 @@ English | [简体中文](readme.md) PaddleOCR provides 2 service deployment methods: - Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial. -- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../../doc/doc_ch/serving_inference.md) for usage. +- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../../deploy/pdserving/readme.md) for usage. # Service deployment based on PaddleHub Serving diff --git a/deploy/lite/readme_en.md b/deploy/lite/readme_en.md index 63a5d73d191f561752c6629605639f031bf03509..d72e0b9ce9c71fab72e8cc7042cc0338a5fabcde 100644 --- a/deploy/lite/readme_en.md +++ b/deploy/lite/readme_en.md @@ -1,10 +1,10 @@ # Tutorial of PaddleOCR Mobile deployment -This tutorial will introduce how to use paddle-lite to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones. +This tutorial will introduce how to use [paddle-lite](https://github.com/PaddlePaddle/Paddle-Lite) to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones. paddle-lite is a lightweight inference engine for PaddlePaddle. -It provides efficient inference capabilities for mobile phones and IOTs, +It provides efficient inference capabilities for mobile phones and IoTs, and extensively integrates cross-platform hardware to provide lightweight deployment solutions for end-side deployment issues. diff --git a/deploy/pdserving/clas_local_server.py b/deploy/pdserving/clas_local_server.py index 22f0c27460945ddbe1942b329051aec3165527fa..f823ae5a1f1a2e0afd5d10a94e55ee34292089f6 100644 --- a/deploy/pdserving/clas_local_server.py +++ b/deploy/pdserving/clas_local_server.py @@ -107,16 +107,18 @@ class OCRService(WebService): if ".lod" in x: self.tmp_args[x] = fetch_map[x] _, rec_res = self.text_classifier.postprocess(outputs, self.tmp_args) - res = { - "pred_text": [x[0] for x in rec_res], - "score": [str(x[1]) for x in rec_res] - } + res = [] + for i in range(len(rec_res)): + res.append({ + "direction": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) return res if __name__ == "__main__": ocr_service = OCRService(name="ocr") - ocr_service.load_model_config(global_args.cls_model_dir) + ocr_service.load_model_config(global_args.cls_server_dir) ocr_service.init_rec() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/clas_rpc_server.py b/deploy/pdserving/clas_rpc_server.py index 96d5ff3c5ca098e832b12ceebdc345a836109f72..cd480031a893d50ee795937533467ca1eba026e7 100644 --- a/deploy/pdserving/clas_rpc_server.py +++ b/deploy/pdserving/clas_rpc_server.py @@ -113,16 +113,18 @@ class OCRService(WebService): if ".lod" in x: self.tmp_args[x] = fetch_map[x] _, rec_res = self.text_classifier.postprocess(outputs, self.tmp_args) - res = { - "direction": [x[0] for x in rec_res], - "score": [str(x[1]) for x in rec_res] - } + res = [] + for i in range(len(rec_res)): + res.append({ + "direction": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) return res if __name__ == "__main__": ocr_service = OCRService(name="ocr") - ocr_service.load_model_config(global_args.cls_model_dir) + ocr_service.load_model_config(global_args.cls_server_dir) ocr_service.init_rec() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/clas_web_client.py b/deploy/pdserving/clas_web_client.py deleted file mode 100644 index 576e073b837281e84f1c5094aa1ff20037c45427..0000000000000000000000000000000000000000 --- a/deploy/pdserving/clas_web_client.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -*- coding: utf-8 -*- - -import requests -import json -import cv2 -import base64 -import os, sys -import time - - -def cv2_to_base64(image): - #data = cv2.imencode('.jpg', image)[1] - return base64.b64encode(image).decode( - 'utf8') #data.tostring()).decode('utf8') - - -headers = {"Content-type": "application/json"} -url = "http://127.0.0.1:9292/ocr/prediction" -test_img_dir = "../../doc/imgs_words/ch/" -for img_file in os.listdir(test_img_dir): - with open(os.path.join(test_img_dir, img_file), 'rb') as file: - image_data1 = file.read() - image = cv2_to_base64(image_data1) - data = {"feed": [{"image": image}], "fetch": ["res"]} - r = requests.post(url=url, headers=headers, data=json.dumps(data)) - print(r.json()) diff --git a/deploy/pdserving/det_local_server.py b/deploy/pdserving/det_local_server.py index 8659dd5b295b3889c803ef96510dd2c6a250033f..1ddb2d9a70f1304d2c3eaf047f7de986b730c86d 100644 --- a/deploy/pdserving/det_local_server.py +++ b/deploy/pdserving/det_local_server.py @@ -90,13 +90,15 @@ class DetService(WebService): def postprocess(self, feed={}, fetch=[], fetch_map=None): outputs = [fetch_map[x] for x in fetch] - res = self.text_detector.postprocess(outputs, self.tmp_args) - return {"boxes": res.tolist()} - + det_res = self.text_detector.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(det_res)): + res.append({"text_region": det_res[i].tolist()}) + return res if __name__ == "__main__": ocr_service = DetService(name="ocr") - ocr_service.load_model_config(global_args.det_model_dir) + ocr_service.load_model_config(global_args.det_server_dir) ocr_service.init_det() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/det_rpc_server.py b/deploy/pdserving/det_rpc_server.py index 3bc0579dcebedfd8d7e267fed2b6aa4d9fe03843..96b9493eaad7417172b84af60a6b8fe6deb7c5e2 100644 --- a/deploy/pdserving/det_rpc_server.py +++ b/deploy/pdserving/det_rpc_server.py @@ -89,13 +89,15 @@ class DetService(WebService): def postprocess(self, feed={}, fetch=[], fetch_map=None): outputs = [fetch_map[x] for x in fetch] - res = self.text_detector.postprocess(outputs, self.tmp_args) - return {"boxes": res.tolist()} - + det_res = self.text_detector.postprocess(outputs, self.tmp_args) + res = [] + for i in range(len(det_res)): + res.append({"text_region": det_res[i].tolist()}) + return res if __name__ == "__main__": ocr_service = DetService(name="ocr") - ocr_service.load_model_config(global_args.det_model_dir) + ocr_service.load_model_config(global_args.det_server_dir) ocr_service.init_det() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/det_web_client.py b/deploy/pdserving/det_web_client.py deleted file mode 100644 index 4324406bc5d17124b208e6064f53562850799980..0000000000000000000000000000000000000000 --- a/deploy/pdserving/det_web_client.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -*- coding: utf-8 -*- - -import requests -import json -import cv2 -import base64 -import os, sys -import time - - -def cv2_to_base64(image): - #data = cv2.imencode('.jpg', image)[1] - return base64.b64encode(image).decode( - 'utf8') #data.tostring()).decode('utf8') - - -headers = {"Content-type": "application/json"} -url = "http://127.0.0.1:9292/ocr/prediction" -test_img_dir = "../../doc/imgs/" -for img_file in os.listdir(test_img_dir): - with open(os.path.join(test_img_dir, img_file), 'rb') as file: - image_data1 = file.read() - image = cv2_to_base64(image_data1) - data = {"feed": [{"image": image}], "fetch": ["res"]} - r = requests.post(url=url, headers=headers, data=json.dumps(data)) - rjson = r.json() - print(rjson) diff --git a/deploy/pdserving/inference_to_serving.py b/deploy/pdserving/inference_to_serving.py new file mode 100644 index 0000000000000000000000000000000000000000..76efca14d4320336b0ee6060af98ed4a1acfb5d8 --- /dev/null +++ b/deploy/pdserving/inference_to_serving.py @@ -0,0 +1,32 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import argparse +from paddle_serving_client.io import inference_model_to_serving +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument("--model_dir", type=str) + parser.add_argument("--server_dir", type=str, default="serving_server_dir") + parser.add_argument("--client_dir", type=str, default="serving_client_dir") + return parser.parse_args() + +args = parse_args() +inference_model_dir = args.model_dir +serving_server_dir = os.path.join(args.model_dir, args.server_dir) +serving_client_dir = os.path.join(args.model_dir, args.client_dir) +feed_var_names, fetch_var_names = inference_model_to_serving( + inference_model_dir, serving_server_dir, serving_client_dir, model_filename="model", params_filename="params") + +print("success!") diff --git a/deploy/pdserving/ocr_local_server.py b/deploy/pdserving/ocr_local_server.py index 8761d1832319f39e89abd562b3fa67f345f4dd76..e838f71a6bb5470678b6d4a4839105698cab5d1b 100644 --- a/deploy/pdserving/ocr_local_server.py +++ b/deploy/pdserving/ocr_local_server.py @@ -44,11 +44,11 @@ class TextSystemHelper(TextSystem): if self.use_angle_cls: self.clas_client = Debugger() self.clas_client.load_model_config( - global_args.cls_model_dir, gpu=True, profile=False) + global_args.cls_server_dir, gpu=True, profile=False) self.text_classifier = TextClassifierHelper(args) self.det_client = Debugger() self.det_client.load_model_config( - global_args.det_model_dir, gpu=True, profile=False) + global_args.det_server_dir, gpu=True, profile=False) self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"] def preprocess(self, img): @@ -60,6 +60,7 @@ class TextSystemHelper(TextSystem): return None, None img_crop_list = [] dt_boxes = sorted_boxes(dt_boxes) + self.dt_boxes = dt_boxes for bno in range(len(dt_boxes)): tmp_box = copy.deepcopy(dt_boxes[bno]) img_crop = self.get_rotate_crop_image(img, tmp_box) @@ -100,16 +101,20 @@ class OCRService(WebService): if ".lod" in x: self.tmp_args[x] = fetch_map[x] rec_res = self.text_system.postprocess(outputs, self.tmp_args) - res = { - "pred_text": [x[0] for x in rec_res], - "score": [str(x[1]) for x in rec_res] - } + res = [] + for i in range(len(rec_res)): + tmp_res = { + "text_region": self.text_system.dt_boxes[i].tolist(), + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + } + res.append(tmp_res) return res if __name__ == "__main__": ocr_service = OCRService(name="ocr") - ocr_service.load_model_config(global_args.rec_model_dir) + ocr_service.load_model_config(global_args.rec_server_dir) ocr_service.init_rec() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/ocr_rpc_server.py b/deploy/pdserving/ocr_rpc_server.py index 199ea1f0a554e9eb6b7a451aa82e93a13b4d5698..8fa60b8e234636b3de1bec0cc7a9e0ec4c3b962f 100644 --- a/deploy/pdserving/ocr_rpc_server.py +++ b/deploy/pdserving/ocr_rpc_server.py @@ -42,12 +42,14 @@ class TextSystemHelper(TextSystem): if self.use_angle_cls: self.clas_client = Client() self.clas_client.load_client_config( - "cls_infer_client/serving_client_conf.prototxt") + os.path.join(args.cls_client_dir, "serving_client_conf.prototxt") + ) self.clas_client.connect(["127.0.0.1:9294"]) self.text_classifier = TextClassifierHelper(args) self.det_client = Client() self.det_client.load_client_config( - "det_infer_client/serving_client_conf.prototxt") + os.path.join(args.det_client_dir, "serving_client_conf.prototxt") + ) self.det_client.connect(["127.0.0.1:9293"]) self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"] @@ -56,11 +58,11 @@ class TextSystemHelper(TextSystem): fetch_map = self.det_client.predict(feed, fetch) outputs = [fetch_map[x] for x in fetch] dt_boxes = self.text_detector.postprocess(outputs, self.tmp_args) - print(dt_boxes) if dt_boxes is None: return None, None img_crop_list = [] dt_boxes = sorted_boxes(dt_boxes) + self.dt_boxes = dt_boxes for bno in range(len(dt_boxes)): tmp_box = copy.deepcopy(dt_boxes[bno]) img_crop = self.get_rotate_crop_image(img, tmp_box) @@ -69,7 +71,6 @@ class TextSystemHelper(TextSystem): feed, fetch, self.tmp_args = self.text_classifier.preprocess( img_crop_list) fetch_map = self.clas_client.predict(feed, fetch) - print(fetch_map) outputs = [fetch_map[x] for x in self.text_classifier.fetch] for x in fetch_map.keys(): if ".lod" in x: @@ -102,16 +103,20 @@ class OCRService(WebService): if ".lod" in x: self.tmp_args[x] = fetch_map[x] rec_res = self.text_system.postprocess(outputs, self.tmp_args) - res = { - "pred_text": [x[0] for x in rec_res], - "score": [str(x[1]) for x in rec_res] - } + res = [] + for i in range(len(rec_res)): + tmp_res = { + "text_region": self.text_system.dt_boxes[i].tolist(), + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + } + res.append(tmp_res) return res if __name__ == "__main__": ocr_service = OCRService(name="ocr") - ocr_service.load_model_config(global_args.rec_model_dir) + ocr_service.load_model_config(global_args.rec_server_dir) ocr_service.init_rec() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/ocr_web_client.py b/deploy/pdserving/ocr_web_client.py deleted file mode 100644 index 4324406bc5d17124b208e6064f53562850799980..0000000000000000000000000000000000000000 --- a/deploy/pdserving/ocr_web_client.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -*- coding: utf-8 -*- - -import requests -import json -import cv2 -import base64 -import os, sys -import time - - -def cv2_to_base64(image): - #data = cv2.imencode('.jpg', image)[1] - return base64.b64encode(image).decode( - 'utf8') #data.tostring()).decode('utf8') - - -headers = {"Content-type": "application/json"} -url = "http://127.0.0.1:9292/ocr/prediction" -test_img_dir = "../../doc/imgs/" -for img_file in os.listdir(test_img_dir): - with open(os.path.join(test_img_dir, img_file), 'rb') as file: - image_data1 = file.read() - image = cv2_to_base64(image_data1) - data = {"feed": [{"image": image}], "fetch": ["res"]} - r = requests.post(url=url, headers=headers, data=json.dumps(data)) - rjson = r.json() - print(rjson) diff --git a/deploy/pdserving/params.py b/deploy/pdserving/params.py index 9d0b082fb983776053619353ca8736e8c3dc8d79..60273ba6ca579391f0521256af11b33a39fdd6d6 100644 --- a/deploy/pdserving/params.py +++ b/deploy/pdserving/params.py @@ -14,7 +14,8 @@ def read_params(): #params for text detector cfg.det_algorithm = "DB" - cfg.det_model_dir = "./det_infer_server/" + cfg.det_server_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir" + cfg.det_client_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_client_dir" cfg.det_max_side_len = 960 #DB parmas @@ -29,19 +30,21 @@ def read_params(): #params for text recognizer cfg.rec_algorithm = "CRNN" - cfg.rec_model_dir = "./rec_infer_server/" + cfg.rec_server_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_server_dir" + cfg.rec_client_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_client_dir" cfg.rec_image_shape = "3, 32, 320" cfg.rec_char_type = 'ch' cfg.rec_batch_num = 30 cfg.max_text_length = 25 - cfg.rec_char_dict_path = "./ppocr_keys_v1.txt" + cfg.rec_char_dict_path = "../../ppocr/utils/ppocr_keys_v1.txt" cfg.use_space_char = True #params for text classifier cfg.use_angle_cls = True - cfg.cls_model_dir = "./cls_infer_server/" + cfg.cls_server_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir" + cfg.cls_client_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_client_dir" cfg.cls_image_shape = "3, 48, 192" cfg.label_list = ['0', '180'] cfg.cls_batch_num = 30 diff --git a/deploy/pdserving/pdserving_client.py b/deploy/pdserving/pdserving_client.py new file mode 100644 index 0000000000000000000000000000000000000000..f3effb950255c1e71b5ccc8063811733d7679ab6 --- /dev/null +++ b/deploy/pdserving/pdserving_client.py @@ -0,0 +1,117 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys +__dir__ = os.path.dirname(os.path.abspath(__file__)) +sys.path.append(__dir__) +sys.path.append(os.path.abspath(os.path.join(__dir__, '..'))) +sys.path.append(os.path.abspath(os.path.join(__dir__, '../../'))) + +from ppocr.utils.utility import initial_logger +logger = initial_logger() +import cv2 +import numpy as np +import time +from PIL import Image +from ppocr.utils.utility import get_image_file_list +from tools.infer.utility import draw_ocr, draw_boxes + +import requests +import json +import base64 + + +def cv2_to_base64(image): + return base64.b64encode(image).decode('utf8') + + +def draw_server_result(image_file, res): + img = cv2.imread(image_file) + image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) + if len(res) == 0: + return np.array(image) + keys = res[0].keys() + if 'text_region' not in keys: # for rec or clas, draw function is invalid + logger.info("draw function is invalid for rec or clas!") + return None + elif 'text' not in keys: # for ocr_det + logger.info("draw text boxes only!") + boxes = [] + for dno in range(len(res)): + boxes.append(res[dno]['text_region']) + boxes = np.array(boxes) + draw_img = draw_boxes(image, boxes) + return draw_img + else: # for ocr_system + logger.info("draw boxes and texts!") + boxes = [] + texts = [] + scores = [] + for dno in range(len(res)): + boxes.append(res[dno]['text_region']) + texts.append(res[dno]['text']) + scores.append(res[dno]['confidence']) + boxes = np.array(boxes) + scores = np.array(scores) + draw_img = draw_ocr(image, boxes, texts, scores, drop_score=0.5, font_path="../../doc/simfang.ttf") + return draw_img + + +def main(image_path): + image_file_list = get_image_file_list(image_path) + is_visualize = True + headers = {"Content-type": "application/json"} + url = "http://127.0.0.1:9292/ocr/prediction" + cnt = 0 + total_time = 0 + for image_file in image_file_list: + img = open(image_file, 'rb').read() + if img is None: + logger.info("error in loading image:{}".format(image_file)) + continue + + # 发送HTTP请求 + starttime = time.time() + data = {"feed": [{"image": cv2_to_base64(img)}], "fetch": ["res"]} + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + elapse = time.time() - starttime + total_time += elapse + logger.info("Predict time of %s: %.3fs" % (image_file, elapse)) + res = r.json()['result'] + logger.info(res) + + if is_visualize: + draw_img = draw_server_result(image_file, res) + if draw_img is not None: + draw_img_save = "./server_results/" + if not os.path.exists(draw_img_save): + os.makedirs(draw_img_save) + cv2.imwrite( + os.path.join(draw_img_save, os.path.basename(image_file)), + draw_img[:, :, ::-1]) + logger.info("The visualized image saved in {}".format( + os.path.join(draw_img_save, os.path.basename(image_file)))) + cnt += 1 + if cnt % 100 == 0: + logger.info("{} processed".format(cnt)) + logger.info("avg time cost: {}".format(float(total_time) / cnt)) + + +if __name__ == '__main__': + if len(sys.argv) != 2: + logger.info("Usage: %s image_path" % sys.argv[0]) + else: + image_path = sys.argv[1] + main(image_path) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..b488a9df055a8687c7360a03c5eb75bb83beb404 --- /dev/null +++ b/deploy/pdserving/readme.md @@ -0,0 +1,197 @@ +[English](readme_en.md) | 简体中文 + +PaddleOCR提供2种服务部署方式: +- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../hubserving/readme.md)。 +- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",按照本教程使用。 + +# Paddle Serving 服务部署 +本教程将介绍基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)部署PaddleOCR在线预测服务的详细步骤。 +- [快速启动服务](#快速启动服务) + - [1. 准备环境](#准备环境) + - [2. 转换模型](#转换模型) + - [3. 启动服务](#启动服务) +- [发送预测请求](#发送预测请求) + +pdserving服务部署目录下包括`检测`、`方向分类器`、`识别`、`串联`四种服务部署工具,请根据需求选择相应的服务。目录结构如下: +``` +deploy/pdserving/ + └─ det_local_server.py 快速版 检测 服务端 + └─ det_rpc_server.py 标准版 检测 服务端 + └─ clas_local_server.py 快速版 方向分类器 服务端 + └─ clas_rpc_server.py 标准版 方向分类器 服务端 + └─ rec_local_server.py 快速版 识别 服务端 + └─ rec_rpc_server.py 标准版 识别 服务端 + └─ ocr_local_server.py 快速版 串联 服务端 + └─ ocr_rpc_server.py 标准版 串联 服务端 + └─ pdserving_client.py 客户端 + └─ params.py 配置文件 +``` + + +## 快速启动服务 + + +### 1. 准备环境 +环境版本要求: +- **CUDA版本:9.X/10.X** +- **CUDNN版本:7.X** +- **操作系统版本:Linux/Windows** +- **Python版本: 2.7/3.5/3.6/3.7** + +**Python操作指南:** + +目前Serving用于OCR的部分功能还在测试当中,因此在这里我们给出[Servnig latest package](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md) +大家根据自己的环境选择需要安装的whl包即可,例如以Python 3.5为例,执行下列命令: +``` +# 安装服务端,CPU/GPU版本选择一个 +# GPU版本服务端 +# CUDA 9 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post9-py3-none-any.whl +# CUDA 10 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post10-py3-none-any.whl +# CPU版本服务端 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server-0.0.0-py3-none-any.whl + +# 安装客户端和App包,CPU、GPU通用 +python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_client-0.0.0-cp35-none-any.whl https://paddle-serving.bj.bcebos.com/whl/paddle_serving_app-0.0.0-py3-none-any.whl + +# 安装其他依赖 +pip3.5 install func-timeout +``` + + +## 2. 转换模型 + +Paddle Serving无法直接用训练模型(checkpoints 模型)或推理模型(inference 模型)进行部署。Serving模型由两个文件夹构成,用于存放客户端和服务端的配置。本节介绍如何将推理模型转换为Paddle Serving可部署的模型。 + +**以文本检测模型`ch_ppocr_mobile_v1.1_det_infer`为例,文本识别模型和方向分类器的转换同理。** + +首先下载推理模型: +```shell +wget -P ./inference/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar && tar xf ./inference/ch_ppocr_mobile_v1.1_det_infer.tar -C ./inference/ +``` +然后运行如下python脚本进行转换,其中,使用参数`model_dir`指定待转换的推理模型路径: +``` +python deploy/pdserving/inference_to_serving.py --model_dir ./inference/ch_ppocr_mobile_v1.1_det_infer +``` +最终会在`ch_ppocr_mobile_v1.1_det_infer`目录下生成客户端和服务端的模型配置,结构如下: +``` +/ch_ppocr_mobile_v1.1_det_infer/ +├── serving_client_dir # 客户端配置文件夹 +└── serving_server_dir # 服务端配置文件夹 +``` + + +## 3. 启动服务 + +启动服务可以根据实际需求选择启动`标准版`或者`快速版`,两种方式的对比如下表: + +|版本|特点|适用场景| +|-|-|-| +|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况,只能用于Linux平台| +|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景,可以支持Linux/Windows| + + +**step 1. 配置环境变量** + +``` +# 以下两步的顺序不能反 +export PYTHONPATH=$PWD:$PYTHONPATH +cd deploy/pdserving +``` + +**step 2. 修改配置参数** + +配置参数在`params.py`中,具体内容如下所示,可根据需要修改相关参数,如修改模型路径、修改后处理参数等。 + +``` +def read_params(): + cfg = Config() + #use gpu + cfg.use_gpu = False #是否使用GPU,False代表使用CPU + cfg.use_pdserving = True #使用paddle serving部署时必须为True + + #params for text detector + cfg.det_algorithm = "DB" + cfg.det_server_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir" + cfg.det_client_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_client_dir" + cfg.det_max_side_len = 960 + + #DB parmas + cfg.det_db_thresh =0.3 + cfg.det_db_box_thresh =0.5 + cfg.det_db_unclip_ratio =2.0 + + #EAST parmas + cfg.det_east_score_thresh = 0.8 + cfg.det_east_cover_thresh = 0.1 + cfg.det_east_nms_thresh = 0.2 + + #params for text recognizer + cfg.rec_algorithm = "CRNN" + cfg.rec_server_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_server_dir" + cfg.rec_client_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_client_dir" + + cfg.rec_image_shape = "3, 32, 320" + cfg.rec_char_type = 'ch' + cfg.rec_batch_num = 30 + cfg.max_text_length = 25 + + cfg.rec_char_dict_path = "../../ppocr/utils/ppocr_keys_v1.txt" + cfg.use_space_char = True + + #params for text classifier + cfg.use_angle_cls = True + cfg.cls_server_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir" + cfg.cls_client_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_client_dir" + cfg.cls_image_shape = "3, 48, 192" + cfg.label_list = ['0', '180'] + cfg.cls_batch_num = 30 + cfg.cls_thresh = 0.9 + + return cfg +``` + +**step 3_1. 启动独立的检测服务或识别服务** + +如果只需要搭建检测服务或识别服务,一行命令即可,检测服务的启动方式如下,识别同理。检测+识别的串联服务请直接跳至step 3_2。 + +``` +# 启动文本检测服务,标准版/快速版 二选一 +python det_rpc_server.py #标准版,Linux用户 +python det_local_server.py #快速版,Windows/Linux用户 +``` + +**step 3_2. 启动文本检测、识别串联的服务** + +如果需要搭建检测+识别的串联服务,快速版与step 3_1中的独立服务启动方式相同,但标准版略有不同,具体步骤如下: + +``` +# 标准版,Linux用户 +# GPU用户 +# 启动检测服务 +python -m paddle_serving_server_gpu.serve --model ../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir/ --port 9293 --gpu_id 0 +# 启动方向分类器服务 +python -m paddle_serving_server_gpu.serve --model ../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir/ --port 9294 --gpu_id 0 +# 启动串联服务 +python ocr_rpc_server.py + +# CPU用户 +# 启动检测服务 +python -m paddle_serving_server.serve --model ../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir/ --port 9293 +# 启动方向分类器服务 +python -m paddle_serving_server.serve --model ../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir/ --port 9294 +# 启动串联服务 +python ocr_rpc_server.py + +# 快速版,Windows/Linux用户 +python ocr_local_server.py +``` + + +## 发送预测请求 +以上所有单独或串联的服务均可使用如下客户端进行访问: +``` +python pdserving_client.py image_path +``` + diff --git a/deploy/pdserving/rec_local_server.py b/deploy/pdserving/rec_local_server.py index f8b0e56bafd5d8a94469179697dc823f7185282d..72a40f3aad01d87a2cb173d0fdfaec50cce9a064 100644 --- a/deploy/pdserving/rec_local_server.py +++ b/deploy/pdserving/rec_local_server.py @@ -153,16 +153,18 @@ class OCRService(WebService): if ".lod" in x: self.tmp_args[x] = fetch_map[x] rec_res = self.text_recognizer.postprocess(outputs, self.tmp_args) - res = { - "pred_text": [x[0] for x in rec_res], - "score": [str(x[1]) for x in rec_res] - } + res = [] + for i in range(len(rec_res)): + res.append({ + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) return res if __name__ == "__main__": ocr_service = OCRService(name="ocr") - ocr_service.load_model_config(global_args.rec_model_dir) + ocr_service.load_model_config(global_args.rec_server_dir) ocr_service.init_rec() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/rec_rpc_server.py b/deploy/pdserving/rec_rpc_server.py index 21966941d1fd40dba2cea749cf6bc878143d6ed5..63bbee3ca3a58e4610a97095afc7c13cea9adc5c 100644 --- a/deploy/pdserving/rec_rpc_server.py +++ b/deploy/pdserving/rec_rpc_server.py @@ -158,16 +158,18 @@ class OCRService(WebService): if ".lod" in x: self.tmp_args[x] = fetch_map[x] rec_res = self.text_recognizer.postprocess(outputs, self.tmp_args) - res = { - "pred_text": [x[0] for x in rec_res], - "score": [str(x[1]) for x in rec_res] - } + res = [] + for i in range(len(rec_res)): + res.append({ + "text": rec_res[i][0], + "confidence": float(rec_res[i][1]) + }) return res if __name__ == "__main__": ocr_service = OCRService(name="ocr") - ocr_service.load_model_config(global_args.rec_model_dir) + ocr_service.load_model_config(global_args.rec_server_dir) ocr_service.init_rec() if global_args.use_gpu: ocr_service.prepare_server( diff --git a/deploy/pdserving/rec_web_client.py b/deploy/pdserving/rec_web_client.py deleted file mode 100644 index 576e073b837281e84f1c5094aa1ff20037c45427..0000000000000000000000000000000000000000 --- a/deploy/pdserving/rec_web_client.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -*- coding: utf-8 -*- - -import requests -import json -import cv2 -import base64 -import os, sys -import time - - -def cv2_to_base64(image): - #data = cv2.imencode('.jpg', image)[1] - return base64.b64encode(image).decode( - 'utf8') #data.tostring()).decode('utf8') - - -headers = {"Content-type": "application/json"} -url = "http://127.0.0.1:9292/ocr/prediction" -test_img_dir = "../../doc/imgs_words/ch/" -for img_file in os.listdir(test_img_dir): - with open(os.path.join(test_img_dir, img_file), 'rb') as file: - image_data1 = file.read() - image = cv2_to_base64(image_data1) - data = {"feed": [{"image": image}], "fetch": ["res"]} - r = requests.post(url=url, headers=headers, data=json.dumps(data)) - print(r.json()) diff --git a/deploy/slim/prune/README.md b/deploy/slim/prune/README.md index 20d8c1e928cbc20c4bd891656e39f9d2bee0dc68..9dc53f2cc6bb65925247f7ddc5887b54c5f7e0e5 100644 --- a/deploy/slim/prune/README.md +++ b/deploy/slim/prune/README.md @@ -30,7 +30,7 @@ python setup.py install ``` ### 2. 获取预训练模型 -模型裁剪需要加载事先训练好的模型,PaddleOCR也提供了一系列模型[../../../doc/doc_ch/models_list.md],开发者可根据需要自行选择模型或使用自己的模型。 +模型裁剪需要加载事先训练好的模型,PaddleOCR也提供了一系列(模型)[../../../doc/doc_ch/models_list.md],开发者可根据需要自行选择模型或使用自己的模型。 ### 3. 敏感度分析训练 diff --git a/deploy/slim/prune/export_prune_model.py b/deploy/slim/prune/export_prune_model.py index 0603966f8eeb9a59fa8c4494bf47de9cdaf53774..2ffcf1d8fa5a8847a720fde3e500d03c8117314d 100644 --- a/deploy/slim/prune/export_prune_model.py +++ b/deploy/slim/prune/export_prune_model.py @@ -24,6 +24,7 @@ sys.path.append(os.path.join(__dir__, '..', '..', '..')) sys.path.append(os.path.join(__dir__, '..', '..', '..', 'tools')) import program +import paddle from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() @@ -32,6 +33,12 @@ from paddleslim.prune import load_model def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + startup_prog, eval_program, place, config, _ = program.preprocess() feeded_var_names, target_vars, fetches_var_name = program.build_export( diff --git a/deploy/slim/prune/pruning_and_finetune.py b/deploy/slim/prune/pruning_and_finetune.py index 77ba604ad40a6f219a16d63fbdae6cd8946bdec2..b066b73682f649c58104a93eb46f99a4d610ad2d 100644 --- a/deploy/slim/prune/pruning_and_finetune.py +++ b/deploy/slim/prune/pruning_and_finetune.py @@ -19,6 +19,7 @@ from __future__ import print_function import os import sys import numpy as np +import paddle __dir__ = os.path.dirname(__file__) sys.path.append(__dir__) sys.path.append(os.path.join(__dir__, '..', '..', '..')) @@ -49,6 +50,12 @@ skip_list = [ def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + config = program.load_config(FLAGS.config) program.merge_config(FLAGS.opt) logger.info(config) diff --git a/deploy/slim/prune/sensitivity_anal.py b/deploy/slim/prune/sensitivity_anal.py index b416f09a3a17527eccbd131917ca257b39bc7884..1eebd61408a0890957e2fdf9761eb938fb53d476 100644 --- a/deploy/slim/prune/sensitivity_anal.py +++ b/deploy/slim/prune/sensitivity_anal.py @@ -25,6 +25,7 @@ sys.path.append(os.path.join(__dir__, '..', '..', '..', 'tools')) import json import cv2 +import paddle from paddle import fluid import paddleslim as slim from copy import deepcopy @@ -60,6 +61,12 @@ def eval_function(eval_args, mode='eval'): def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + config = program.load_config(FLAGS.config) program.merge_config(FLAGS.opt) logger.info(config) diff --git a/deploy/slim/quantization/export_model.py b/deploy/slim/quantization/export_model.py index 5f4d91a8eea2d4f63334be571620aa0e1c00fabd..9741f2a2a9a5e42b8c757efbc5b095586f4eb55c 100644 --- a/deploy/slim/quantization/export_model.py +++ b/deploy/slim/quantization/export_model.py @@ -39,6 +39,7 @@ set_paddle_flags( ) import program +import paddle from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() @@ -76,6 +77,11 @@ def main(): # The decay coefficient of moving average, default is 0.9 'moving_rate': 0.9, } + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass startup_prog, eval_program, place, config, alg_type = program.preprocess() diff --git a/deploy/slim/quantization/quant.py b/deploy/slim/quantization/quant.py index e75e84be86867274368b6a0427b3d02d2524e020..1af76f1ed8a154f389265294656e8deaa941b052 100755 --- a/deploy/slim/quantization/quant.py +++ b/deploy/slim/quantization/quant.py @@ -85,6 +85,12 @@ def get_optimizer(): def main(): + # Run code with static graph mode. + try: + paddle.enable_static() + except: + pass + train_build_outputs = program.build( config, train_program, startup_program, mode='train') train_loader = train_build_outputs[0] diff --git a/doc/doc_ch/FAQ.md b/doc/doc_ch/FAQ.md index d55426351c809fd6b0eadf7b6df87217f32cdc41..8453a58a52f4ed3913fe4dff092d50e63bccaf16 100644 --- a/doc/doc_ch/FAQ.md +++ b/doc/doc_ch/FAQ.md @@ -9,48 +9,42 @@ ## PaddleOCR常见问题汇总(持续更新) -* [近期更新(2020.10.26)](#近期更新) +* [近期更新(2020.11.30)](#近期更新) * [【精选】OCR精选10个问题](#OCR精选10个问题) -* [【理论篇】OCR通用24个问题](#OCR通用问题) - * [基础知识6题](#基础知识) - * [数据集4题](#数据集) - * [模型训练调优6题](#模型训练调优) - * [预测部署8题](#预测部署) -* [【实战篇】PaddleOCR实战65个问题](#PaddleOCR实战问题) +* [【理论篇】OCR通用29个问题](#OCR通用问题) + * [基础知识7题](#基础知识) + * [数据集7题](#数据集2) + * [模型训练调优7题](#模型训练调优2) + * [预测部署8题](#预测部署2) +* [【实战篇】PaddleOCR实战80个问题](#PaddleOCR实战问题) * [使用咨询20题](#使用咨询) - * [数据集10题](#数据集) - * [模型训练调优18题](#模型训练调优) - * [预测部署17题](#预测部署) + * [数据集17题](#数据集3) + * [模型训练调优21题](#模型训练调优3) + * [预测部署22题](#预测部署3) -## 近期更新(2020.10.26) +## 近期更新(2020.11.30) -#### Q3.4.17: 预测内存泄漏问题 +#### Q3.2.15: 文本标注工具PPOCRLabel有什么特色? -**A**:1. 使用hubserving出现内存泄漏,该问题为已知问题,预计在paddle2.0正式版中解决。相关讨论见[issue](https://github.com/PaddlePaddle/PaddleHub/issues/682) +**A**: PPOCRLabel是一个半自动文本标注工具,它使用基于PPOCR的中英文OCR模型,预先预测文本检测和识别结果,然后用户对上述结果进行校验和修正就行,大大提高用户的标注效率。同时导出的标注结果直接适配PPOCR训练所需要的数据格式, -**A**:2. C++ 预测出现内存泄漏,该问题已经在paddle2.0rc版本中解决,建议安装paddle2.0rc版本,并更新PaddleOCR代码到最新。 +#### Q3.2.16: 文本标注工具PPOCRLabel,可以更换模型吗? -#### Q3.3.18: cpp_infer 在Windows下使用vs2015编译不通过 +**A**: PPOCRLabel中OCR部署方式采用的基于pip安装whl包快速推理,可以参考相关文档更换模型路径,进行特定任务的标注适配。基于pip安装whl包快速推理的文档如下,https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/whl.md。 -**A**:1. windows上建议使用VS2019工具编译,具体编译细节参考[链接](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/cpp_infer/docs/windows_vs2019_build.md) +#### Q3.2.17: 文本标注工具PPOCRLabel支持的运行环境有哪些? -**A**:2. 在release模式下而不是debug模式下编译,参考[issue](https://github.com/PaddlePaddle/PaddleOCR/issues/1023) +**A**: PPOCRLabel可运行于Linux、Windows、MacOS等多种系统。操作步骤可以参考文档,https://github.com/PaddlePaddle/PaddleOCR/blob/develop/PPOCRLabel/README.md -#### Q3.3.19: No module named 'tools.infer' +#### Q2.2.6: 当训练数据量少时,如何获取更多的数据? -**A**:1. 确保在PaddleOCR/目录下执行的指令,执行'export PYTHONPATH=.' +**A**: 当训练数据量少时,可以尝试以下三种方式获取更多的数据:(1)人工采集更多的训练数据,最直接也是最有效的方式。(2)基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。(3)利用数据生成算法合成数据,例如pix2pix等算法。 -**A**:2. 拉取github上最新代码,这个问题在10月底已修复。 - -#### Q3.3.20: 训练模型和测试模型的检测结果差距较大 +#### Q2.2.7: 论文《Editing Text in the Wild》中文本合成方法SRNet有什么特点? -**A**:1. 检查两个模型使用的后处理参数是否是一样的,训练的后处理参数在配置文件中的[PostProcess](https://github.com/PaddlePaddle/PaddleOCR/blob/e9d533fc1fdf7bbce79947dde54b05011bb1e135/configs/det/det_mv3_db_v1.1.yml#L54)部分,测试模型的后处理参数在[tools/infer/utility.py](https://github.com/PaddlePaddle/PaddleOCR/blob/e9d533fc1fdf7bbce79947dde54b05011bb1e135/tools/infer/utility.py#L47)中,最新代码中两个后处理参数已保持一致。 - -#### Q2.2.5: 文本行较紧密的情况下如何准确检测? - -**A**:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的[shrink_ratio](https://github.com/PaddlePaddle/PaddleOCR/blob/e9d533fc1fdf7bbce79947dde54b05011bb1e135/ppocr/data/det/make_shrink_map.py#L46)参数调小一些; +**A**: SRNet是借鉴GAN中图像到图像转换、风格迁移的想法合成文本数据。不同于通用GAN的方法只选择一个分支,SRNet将文本合成任务分解为三个简单的子模块,提升合成数据的效果。这三个子模块为不带背景的文本风格迁移模块、背景抽取模块和融合模块。PaddleOCR计划将在2020年12月中旬开源基于SRNet的实用模型。 @@ -142,6 +136,8 @@ ## 【理论篇】OCR通用问题 + + ### 基础知识 #### Q2.1.1:CRNN能否识别两行的文字?还是说必须一行? @@ -163,6 +159,14 @@ #### Q2.1.5 多语言的字典里是混合了不同的语种,这个是有什么讲究吗?统一到一个字典里会对精度造成多大的损失? **A**:统一到一个字典里,会造成最后一层FC过大,增加模型大小。如果有特殊需求的话,可以把需要的几种语言合并字典训练模型,合并字典之后如果引入过多的形近字,可能会造成精度损失,字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。 +#### Q2.1.6 预处理部分,图片的长和宽为什么要处理成32的倍数? +**A**:以检测中的resnet骨干网络为例,图像输入网络之后,需要经过5次2倍降采样,共32倍,因此建议输入的图像尺寸为32的倍数。 + +#### Q2.1.7:类似泰语这样的小语种,部分字会占用两个字符甚至三个字符,请问如何制作字典。 + +**A**:处理字符的时候,把多字符的当作一个字就行,字典中每行是一个字。 + + ### 数据集 #### Q2.2.1:支持空格的模型,标注数据的时候是不是要标注空格?中间几个空格都要标注出来么? @@ -183,9 +187,17 @@ #### Q2.2.5: 文本行较紧密的情况下如何准确检测? -**A**:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的shrink_ratio参数调小一些; +**A**:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的shrink_ratio参数调小一些。 + +#### Q2.2.6: 当训练数据量少时,如何获取更多的数据? +**A**: 当训练数据量少时,可以尝试以下三种方式获取更多的数据:(1)人工采集更多的训练数据,最直接也是最有效的方式。(2)基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。(3)利用数据生成算法合成数据,例如pix2pix等算法。 +#### Q2.2.7: 论文《Editing Text in the Wild》中文本合成方法SRNet有什么特点? + +**A**: SRNet是借鉴GAN中图像到图像转换、风格迁移的想法合成文本数据。不同于通用GAN的方法只选择一个分支,SRNet将文本合成任务分解为三个简单的子模块,提升合成数据的效果。这三个子模块为不带背景的文本风格迁移模块、背景抽取模块和融合模块。PaddleOCR计划将在2020年12月中旬开源基于SRNet的实用模型。 + + ### 模型训练调优 #### Q2.3.1:如何更换文本检测/识别的backbone? @@ -219,6 +231,15 @@ **A**:在中文识别模型训练时,并不是采用直接将训练样本缩放到[3,32,320]进行训练,而是先等比例缩放图像,保证图像高度为32,宽度不足320的部分补0,宽高比大于10的样本直接丢弃。预测时,如果是单张图像预测,则按上述操作直接对图像缩放,不做宽度320的限制。如果是多张图预测,则采用batch方式预测,每个batch的宽度动态变换,采用这个batch中最长宽度。 +#### Q2.3.7:识别训练时,训练集精度已经到达90了,但验证集精度一直在70,涨不上去怎么办? + +**A**:训练集精度90,测试集70多的话,应该是过拟合了,有两个可尝试的方法: + +(1)加入更多的增广方式或者调大增广prob的[概率](https://github.com/PaddlePaddle/PaddleOCR/blob/a501603d54ff5513fc4fc760319472e59da25424/ppocr/data/rec/img_tools.py#L307),默认为0.4。 + +(2)调大系统的[l2 dcay值](https://github.com/PaddlePaddle/PaddleOCR/blob/a501603d54ff5513fc4fc760319472e59da25424/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml#L47) + + ### 预测部署 #### Q2.4.1:请问对于图片中的密集文字,有什么好的处理办法吗? @@ -262,9 +283,11 @@ **A**:表格目前学术界比较成熟的解决方案不多 ,可以尝试下分割的论文方案。 + ## 【实战篇】PaddleOCR实战问题 + ### 使用咨询 #### Q3.1.1:OSError: [WinError 126] 找不到指定的模块。mac pro python 3.4 shapely import 问题 @@ -309,7 +332,7 @@ #### Q3.1.11:PaddleOCR如何做到横排和竖排同时支持的? -**A**:合成了一批竖排文字,逆时针旋转90度后加入训练集与横排一起训练。预测时根据图片长款比判断是否为竖排,若为竖排则将crop出的文本逆时针旋转90度后送入识别网络。 +**A**:合成了一批竖排文字,逆时针旋转90度后加入训练集与横排一起训练。预测时根据图片长宽比判断是否为竖排,若为竖排则将crop出的文本逆时针旋转90度后送入识别网络。 #### Q3.1.12:如何获取检测文本框的坐标? @@ -345,7 +368,7 @@ |8.6M超轻量中文OCR模型|MobileNetV3+MobileNetV3|det_mv3_db.yml|rec_chinese_lite_train.yml| |通用中文OCR模型|Resnet50_vd+Resnet34_vd|det_r50_vd_db.yml|rec_chinese_common_train.yml| -#### 3.1.18:如何加入自己的检测算法? +#### Q3.1.18:如何加入自己的检测算法? **A**:1. 在ppocr/modeling对应目录下分别选择backbone,head。如果没有可用的可以新建文件并添加 2. 在ppocr/data下选择对应的数据处理处理方式,如果没有可用的可以新建文件并添加 3. 在ppocr/losses下新建文件并编写loss @@ -353,6 +376,16 @@ 5. 将上面四个步骤里新添加的类或函数参照yml文件写到配置中 +#### Q3.1.19:训练的时候报错`reader raised an exception`,但是具体不知道是啥问题? + +**A**:这个一般是因为标注文件格式有问题或者是标注文件中的图片路径有问题导致的,在[tools/train.py](../../tools/train.py)文件中有一个`test_reader`的函数,基于这个去检查一下数据的格式以及标注,确认没问题之后再进行模型训练。 + +#### Q3.1.20:PaddleOCR与百度的其他OCR产品有什么区别? + +**A**:PaddleOCR主要聚焦通用ocr,如果有垂类需求,您可以用PaddleOCR+垂类数据自己训练; +如果缺少带标注的数据,或者不想投入研发成本,建议直接调用开放的API,开放的API覆盖了目前比较常见的一些垂类。 + + ### 数据集 #### Q3.2.1:如何制作PaddleOCR支持的数据格式 @@ -407,11 +440,43 @@ **A**:可以主要参考可视化效果,通用模型更倾向于检测一整行文字,轻量级可能会有一行文字被分成两段检测的情况,不是数量越多,效果就越好。 -#### Q3.2.10: crnn+ctc模型训练所用的垂直文本(旋转至水平方向)是如何生成的? +#### Q3.2.10:crnn+ctc模型训练所用的垂直文本(旋转至水平方向)是如何生成的? **A**:方法与合成水平方向文字一致,只是将字体替换成了垂直字体。 +#### Q3.2.11:有哪些标注工具可以标注OCR数据集? +**A**:您可以参考:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/data_annotation_en.md。 +我们计划推出高效标注OCR数据的标注工具,请您持续关注PaddleOCR的近期更新。 + +#### Q3.2.12:一些特殊场景的数据识别效果差,但是数据量很少,不够用来finetune怎么办? + +**A**:您可以合成一些接近使用场景的数据用于训练。 +我们计划推出基于特定场景的文本数据合成工具,请您持续关注PaddleOCR的近期更新。 + +#### Q3.2.13:特殊字符(例如一些标点符号)识别效果不好怎么办? + +**A**:首先请您确认要识别的特殊字符是否在字典中。 +如果字符在已经字典中但效果依然不好,可能是由于识别数据较少导致的,您可以增加相应数据finetune模型。 + +#### Q3.2.14:PaddleOCR可以识别灰度图吗? + +**A**:PaddleOCR的模型均为三通道输入。如果您想使用灰度图作为输入,建议直接用3通道的模式读入灰度图, +或者将单通道图像转换为三通道图像再识别。例如,opencv的cvtColor函数就可以将灰度图转换为RGB三通道模式。 + +#### Q3.2.15: 文本标注工具PPOCRLabel有什么特色? + +**A**: PPOCRLabel是一个半自动文本标注工具,它使用基于PPOCR的中英文OCR模型,预先预测文本检测和识别结果,然后用户对上述结果进行校验和修正就行,大大提高用户的标注效率。同时导出的标注结果直接适配PPOCR训练所需要的数据格式, + +#### Q3.2.16: 文本标注工具PPOCRLabel,可以更换模型吗? + +**A**: PPOCRLabel中OCR部署方式采用的基于pip安装whl包快速推理,可以参考相关文档更换模型路径,进行特定任务的标注适配。基于pip安装whl包快速推理的文档如下,https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/whl.md。 + +#### Q3.2.17: 文本标注工具PPOCRLabel支持的运行环境有哪些? + +**A**: PPOCRLabel可运行于Linux、Windows、MacOS等多种系统。操作步骤可以参考文档,https://github.com/PaddlePaddle/PaddleOCR/blob/develop/PPOCRLabel/README.md + + ### 模型训练调优 #### Q3.3.1:文本长度超过25,应该怎么处理? @@ -436,7 +501,7 @@ unclip_ratio: 文本框扩张的系数,关系到文本框的大小`` **A**:可以通过下面的脚本终止所有包含train.py字段的进程, -``` +```shell ps -axu | grep train.py | awk '{print $2}' | xargs kill -9 ``` @@ -487,7 +552,8 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) #### Q3.3.15: 训练中使用的字典需要与加载的预训练模型使用的字典一样吗? -**A**:是的,训练的字典与你使用该模型进行预测的字典需要保持一致的。 +**A**:分情况,1. 不改变识别字符,训练的字典与你使用该模型进行预测的字典需要保持一致的。 + 2. 改变识别的字符,这种情况可以不一样,最后一层会重新训练 #### Q3.3.16: 如何对检测模型finetune,比如冻结前面的层或某些层使用小的学习率学习? **A**: @@ -518,6 +584,17 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) **A**:1. 检查两个模型使用的后处理参数是否是一样的,训练的后处理参数在配置文件中的PostProcess部分,测试模型的后处理参数在tools/infer/utility.py中,最新代码中两个后处理参数已保持一致。 +#### Q3.3.21: 使用合成数据精调小模型后,效果可以,但是还没开源的小infer模型效果好,这是为什么呢? + +**A**: + +(1)要保证使用的配置文件和pretrain weights是对应的; + +(2)在微调时,一般都需要真实数据,如果使用合成数据,效果反而可能会有下降,PaddleOCR中放出的识别inference模型也是基于预训练模型在真实数据上微调得到的,效果提升比较明显; + +(3)在训练的时候,文本长度超过25的训练图像都会被丢弃,因此需要看下真正参与训练的图像有多少,太少的话也容易过拟合。 + + ### 预测部署 #### Q3.4.1:如何pip安装opt模型转换工具? @@ -597,3 +674,25 @@ return paddle.reader.multiprocess_reader(readers, False, queue_size=320) **A**:1. 使用hubserving出现内存泄漏,该问题为已知问题,预计在paddle2.0正式版中解决。相关讨论见[issue](https://github.com/PaddlePaddle/PaddleHub/issues/682) **A**:2. C++ 预测出现内存泄漏,该问题已经在paddle2.0rc版本中解决,建议安装paddle2.0rc版本,并更新PaddleOCR代码到最新。 + +#### Q3.4.18:对于一些尺寸较大的文档类图片,在检测时会有较多的漏检,怎么避免这种漏检的问题呢? + +**A**:PaddleOCR中在图像最长边大于960时,将图像等比例缩放为长边960的图像再进行预测,对于这种图像,可以通过修改det_max_side_len,增大检测的最长边:[tools/infer/utility.py#L45](../../tools/infer/utility.py#L45) + +#### Q3.4.19:在使用训练好的识别模型进行预测的时候,发现有很多重复的字,这个怎么解决呢? + +**A**:可以看下训练的尺度和预测的尺度是否相同,如果训练的尺度为`[3, 32, 320]`,预测的尺度为`[3, 64, 640]`,则会有比较多的重复识别现象。 + +#### Q3.4.20:文档场景中,使用DB模型会出现整行漏检的情况应该怎么解决? + +**A**:可以在预测时调小 det_db_box_thresh 阈值,默认为0.5, 可调小至0.3观察效果。 + +#### Q3.4.21:自己训练的det模型,在同一张图片上,inference模型与eval模型结果差别很大,为什么? + +**A**:这是由于图片预处理不同造成的。如果训练的det模型图片输入并不是默认的shape[600, 600],eval的程序中图片预处理方式与train时一致 +(由xxx_reader.yml中的test_image_shape参数决定缩放大小,但predict_eval.py中的图片预处理方式由程序里的preprocess_params决定, +最好不要传入max_side_len,而是传入和训练时一样大小的test_image_shape。 + +#### Q3.4.22:训练ccpd车牌数据集,训练集准确率高,测试均是错误的,这是什么原因? + +**A**:这是因为训练时将shape修改为[3, 70, 220], 预测时对图片resize,会把高度压缩至32,影响测试结果。注释掉[resize代码](https://github.com/PaddlePaddle/PaddleOCR/blob/ed4313d611b7708a7763d4612f00cb7f318a0e1f/tools/infer/predict_rec.py#L54-L55)可以解决问题。 diff --git a/doc/doc_ch/installation.md b/doc/doc_ch/installation.md index d4b0a67f3cbdcb7d4f3efa6ea44ff881f7598a38..5d8e5db0b19a6c8169b141f00c98291d0aec9f93 100644 --- a/doc/doc_ch/installation.md +++ b/doc/doc_ch/installation.md @@ -47,9 +47,9 @@ docker images hub.baidubce.com/paddlepaddle/paddle latest-gpu-cuda9.0-cudnn7-dev f56310dcc829 ``` -**2. 安装PaddlePaddle Fluid v2.0** +**2. 安装PaddlePaddle v2.0** ``` -pip3 install --upgrade pip +python3 -m pip install --upgrade pip 如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装 python3 -m pip install paddlepaddle-gpu==2.0.0b0 -i https://mirror.baidu.com/pypi/simple @@ -75,7 +75,7 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR **4. 安装第三方库** ``` cd PaddleOCR -pip3 install -r requirments.txt +python3 -m pip install -r requirements.txt ``` 注意,windows环境下,建议从[这里](https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely)下载shapely安装包完成安装, diff --git a/doc/doc_ch/quickstart.md b/doc/doc_ch/quickstart.md index 95b5306fde4a1ee362c88e509a673337feac0f22..ea3e2e6d73a1811d4f0c63d3f7d2b5f03a28e5a2 100644 --- a/doc/doc_ch/quickstart.md +++ b/doc/doc_ch/quickstart.md @@ -95,5 +95,5 @@ python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_mode 此外,文档教程中也提供了中文OCR模型的其他预测部署方式: - [基于C++预测引擎推理](../../deploy/cpp_infer/readme.md) -- [服务部署](./serving_inference.md) +- [服务部署](../../deploy/hubserving/readme.md) - [端侧部署](../../deploy/lite/readme.md) diff --git a/doc/doc_ch/recognition.md b/doc/doc_ch/recognition.md index 939fe6e7eedbaec7a16337bb5c35868958f4e5db..84c6f0e304983e4130bc21c7c425e0e83338a8db 100644 --- a/doc/doc_ch/recognition.md +++ b/doc/doc_ch/recognition.md @@ -122,11 +122,11 @@ word_dict.txt 每行有一个单字,将字符与数字索引映射在一起, `ppocr/utils/dict/french_dict.txt` 是一个包含118个字符的法文字典 -`ppocr/utils/dict/japan_dict.txt` 是一个包含4399个字符的法文字典 +`ppocr/utils/dict/japan_dict.txt` 是一个包含4399个字符的日文字典 -`ppocr/utils/dict/korean_dict.txt` 是一个包含3636个字符的法文字典 +`ppocr/utils/dict/korean_dict.txt` 是一个包含3636个字符的韩文字典 -`ppocr/utils/dict/german_dict.txt` 是一个包含131个字符的法文字典 +`ppocr/utils/dict/german_dict.txt` 是一个包含131个字符的德文字典 您可以按需使用。 diff --git a/doc/doc_ch/serving_inference.md b/doc/doc_ch/serving_inference.md deleted file mode 100644 index f8dd7ae423d545963b3d03ee488579d5ac566902..0000000000000000000000000000000000000000 --- a/doc/doc_ch/serving_inference.md +++ /dev/null @@ -1,243 +0,0 @@ -PaddleOCR提供2种服务部署方式: -- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",按照本教程使用。。 -- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../../deploy/hubserving/readme.md) - -# 使用Paddle Serving预测推理 - -阅读本文档之前,请先阅读文档 [基于Python预测引擎推理](./inference.md) - -同本地执行预测一样,我们需要保存一份可以用于Paddle Serving的模型。 - -接下来首先介绍如何将训练的模型转换成Paddle Serving模型,然后将依次介绍文本检测、文本识别以及两者串联基于预测引擎推理。 - -### 一、 准备环境 -我们先安装Paddle Serving相关组件 -我们推荐用户使用GPU来做Paddle Serving的OCR服务部署 - -**CUDA版本:9.X/10.X** - -**CUDNN版本:7.X** - -**操作系统版本:Linux/Windows** - -**Python版本: 2.7/3.5/3.6/3.7** - -**Python操作指南:** - -目前Serving用于OCR的部分功能还在测试当中,因此在这里我们给出[Servnig latest package](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md) -大家根据自己的环境选择需要安装的whl包即可,例如以Python 3.5为例,执行下列命令 -``` -#CPU/GPU版本选择一个 -#GPU版本服务端 -#CUDA 9 -python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post9-py3-none-any.whl -#CUDA 10 -python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post10-py3-none-any.whl -#CPU版本服务端 -python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server-0.0.0-py3-none-any.whl -#客户端和App包使用以下链接(CPU,GPU通用) -python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_client-0.0.0-cp36-none-any.whl https://paddle-serving.bj.bcebos.com/whl/paddle_serving_app-0.0.0-py3-none-any.whl -``` - -## 二、训练模型转Serving模型 - -在前序文档 [基于Python预测引擎推理](./inference.md) 中,我们提供了如何把训练的checkpoint转换成Paddle模型。Paddle模型通常由一个文件夹构成,内含模型结构描述文件`model`和模型参数文件`params`。Serving模型由两个文件夹构成,用于存放客户端和服务端的配置。 - -我们以`ch_rec_r34_vd_crnn`模型作为例子,下载链接在: - -``` -wget --no-check-certificate https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar -tar xf ch_rec_r34_vd_crnn_infer.tar -``` -因此我们按照Serving模型转换教程,运行下列python文件。 -``` -python tools/inference_to_serving.py --model_dir ch_rec_r34_vd_crnn -``` -最终会在`serving_client_dir`和`serving_server_dir`生成客户端和服务端的模型配置。其中`serving_server_dir`和`serving_client_dir`的名字可以自定义。最终文件结构如下 - -``` -/ch_rec_r34_vd_crnn/ -├── serving_client_dir # 客户端配置文件夹 -└── serving_server_dir # 服务端配置文件夹 -``` - -## 三、文本检测模型Serving推理 - -启动服务可以根据实际需求选择启动`标准版`或者`快速版`,两种方式的对比如下表: - -|版本|特点|适用场景| -|-|-|-| -|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况| -|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景,Windows用户只能选择快速版| - -接下来的命令中,我们会指定快速版和标准版的命令。需要说明的是,标准版只能用Linux平台,快速版可以支持Linux/Windows。 -文本检测模型推理,默认使用DB模型的配置参数,识别默认为CRNN。 - -配置文件在`params.py`中,我们贴出配置部分,如果需要做改动,也在这个文件内部进行修改。 - -``` -def read_params(): - cfg = Config() - #use gpu - cfg.use_gpu = False # 是否使用GPU - cfg.use_pdserving = True # 是否使用paddleserving,必须为True - - #params for text detector - cfg.det_algorithm = "DB" # 检测算法, DB/EAST等 - cfg.det_model_dir = "./det_mv_server/" # 检测算法模型路径 - cfg.det_max_side_len = 960 - - #DB params - cfg.det_db_thresh =0.3 - cfg.det_db_box_thresh =0.5 - cfg.det_db_unclip_ratio =2.0 - - #EAST params - cfg.det_east_score_thresh = 0.8 - cfg.det_east_cover_thresh = 0.1 - cfg.det_east_nms_thresh = 0.2 - - #params for text recognizer - cfg.rec_algorithm = "CRNN" # 识别算法, CRNN/RARE等 - cfg.rec_model_dir = "./ocr_rec_server/" # 识别算法模型路径 - - cfg.rec_image_shape = "3, 32, 320" - cfg.rec_char_type = 'ch' - cfg.rec_batch_num = 30 - cfg.max_text_length = 25 - - cfg.rec_char_dict_path = "./ppocr_keys_v1.txt" # 识别算法字典文件 - cfg.use_space_char = True - - #params for text classifier - cfg.use_angle_cls = True # 是否启用分类算法 - cfg.cls_model_dir = "./ocr_clas_server/" # 分类算法模型路径 - cfg.cls_image_shape = "3, 48, 192" - cfg.label_list = ['0', '180'] - cfg.cls_batch_num = 30 - cfg.cls_thresh = 0.9 - - return cfg -``` -与本地预测不同的是,Serving预测需要一个客户端和一个服务端,因此接下来的教程都是两行代码。 - -在正式执行服务端启动命令之前,先export PYTHONPATH到工程主目录下。 -``` -export PYTHONPATH=$PWD:$PYTHONPATH -cd deploy/pdserving -``` -为了方便用户复现Demo程序,我们提供了Chinese and English ultra-lightweight OCR model (8.1M)版本的Serving模型 -``` -wget --no-check-certificate https://paddleocr.bj.bcebos.com/deploy/pdserving/ocr_pdserving_suite.tar.gz -tar xf ocr_pdserving_suite.tar.gz -``` - -### 1. 超轻量中文检测模型推理 - -超轻量中文检测模型推理,可以执行如下命令启动服务端: - -``` -#根据环境只需要启动其中一个就可以 -python det_rpc_server.py #标准版,Linux用户 -python det_local_server.py #快速版,Windows/Linux用户 -``` - -客户端 - -``` -python det_web_client.py -``` - - -Serving的推测和本地预测不同点在于,客户端发送请求到服务端,服务端需要检测到文字框之后返回框的坐标,此处没有后处理的图片,只能看到坐标值。 - -## 四、文本识别模型Serving推理 - -下面将介绍超轻量中文识别模型推理、基于CTC损失的识别模型推理和基于Attention损失的识别模型推理。对于中文文本识别,建议优先选择基于CTC损失的识别模型,实践中也发现基于Attention损失的效果不如基于CTC损失的识别模型。此外,如果训练时修改了文本的字典,请参考下面的自定义文本识别字典的推理。 - -### 1. 超轻量中文识别模型推理 - -超轻量中文识别模型推理,可以执行如下命令启动服务端: -需要注意params.py中的`--use_gpu`的值 -``` -#根据环境只需要启动其中一个就可以 -python rec_rpc_server.py #标准版,Linux用户 -python rec_local_server.py #快速版,Windows/Linux用户 -``` -如果需要使用CPU版本,还需增加 `--use_gpu False`。 - -客户端 - -``` -python rec_web_client.py -``` - -![](../imgs_words/ch/word_4.jpg) - -执行命令后,上面图像的预测结果(识别的文本和得分)会打印到屏幕上,示例如下: - -``` -{u'result': {u'score': [u'0.89547354'], u'pred_text': ['实力活力']}} -``` - - - -## 五、方向分类模型推理 - -下面将介绍方向分类模型推理。 - - - -### 1. 方向分类模型推理 - -方向分类模型推理, 可以执行如下命令启动服务端: -需要注意params.py中的`--use_gpu`的值 -``` -#根据环境只需要启动其中一个就可以 -python clas_rpc_server.py #标准版,Linux用户 -python clas_local_server.py #快速版,Windows/Linux用户 -``` - -客户端 - -``` -python rec_web_client.py -``` - -![](../imgs_words/ch/word_4.jpg) - -执行命令后,上面图像的预测结果(分类的方向和得分)会打印到屏幕上,示例如下: - -``` -{u'result': {u'direction': [u'0'], u'score': [u'0.9999963']}} -``` - - -## 六、文本检测、方向分类和文字识别串联Serving推理 - -### 1. 超轻量中文OCR模型推理 - -在执行预测时,需要通过参数`image_dir`指定单张图像或者图像集合的路径、参数`det_model_dir`,`cls_model_dir`和`rec_model_dir`分别指定检测,方向分类和识别的inference模型路径。参数`use_angle_cls`用于控制是否启用方向分类模型。与本地预测不同的是,为了减少网络传输耗时,可视化识别结果目前不做处理,用户收到的是推理得到的文字字段。 - -执行如下命令启动服务端: -需要注意params.py中的`--use_gpu`的值 -``` -#标准版,Linux用户 -#GPU用户 -python -m paddle_serving_server_gpu.serve --model det_infer_server --port 9293 --gpu_id 0 -python -m paddle_serving_server_gpu.serve --model cls_infer_server --port 9294 --gpu_id 0 -python ocr_rpc_server.py -#CPU用户 -python -m paddle_serving_server.serve --model det_infer_server --port 9293 -python -m paddle_serving_server.serve --model cls_infer_server --port 9294 -python ocr_rpc_server.py - -#快速版,Windows/Linux用户 -python ocr_local_server.py -``` - -客户端 - -``` -python rec_web_client.py -``` diff --git a/doc/doc_en/installation_en.md b/doc/doc_en/installation_en.md index 17d629c1a316652293149c73225ad086f83079cc..12af13c0b33e72f9cfd412e1990ebcddb167c54c 100644 --- a/doc/doc_en/installation_en.md +++ b/doc/doc_en/installation_en.md @@ -18,7 +18,7 @@ cd /home/Projects # You need to create a docker container for the first run, and do not need to run the current command when you run it again # Create a docker container named ppocr and map the current directory to the /paddle directory of the container -#If using CPU, use docker instead of nvidia-docker to create docker +# If using CPU, use docker instead of nvidia-docker to create docker sudo docker run --name ppocr -v $PWD:/paddle --network=host -it hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda9.0-cudnn7-dev /bin/bash ``` If using CUDA9, please run the following command to create a container: @@ -49,9 +49,9 @@ docker images hub.baidubce.com/paddlepaddle/paddle latest-gpu-cuda9.0-cudnn7-dev f56310dcc829 ``` -**2. Install PaddlePaddle Fluid v2.0** +**2. Install PaddlePaddle v2.0** ``` -pip3 install --upgrade pip +python3 -m pip install --upgrade pip # If you have cuda9 or cuda10 installed on your machine, please run the following command to install python3 -m pip install paddlepaddle-gpu==2.0.0b0 -i https://mirror.baidu.com/pypi/simple @@ -77,7 +77,7 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR **4. Install third-party libraries** ``` cd PaddleOCR -pip3 install -r requirments.txt +python3 -m pip install -r requirements.txt ``` If you getting this error `OSError: [WinError 126] The specified module could not be found` when you install shapely on windows. diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md index 1f1195c24b7ebd49f1f767a6561e30ab7f98fe95..f162b377e0ed226490279735b20f5a78f74ba8fb 100644 --- a/doc/doc_en/recognition_en.md +++ b/doc/doc_en/recognition_en.md @@ -114,11 +114,11 @@ In `word_dict.txt`, there is a single word in each line, which maps characters a `ppocr/utils/dict/french_dict.txt` is a French dictionary with 118 characters -`ppocr/utils/dict/japan_dict.txt` is a French dictionary with 4399 characters +`ppocr/utils/dict/japan_dict.txt` is a Japan dictionary with 4399 characters -`ppocr/utils/dict/korean_dict.txt` is a French dictionary with 3636 characters +`ppocr/utils/dict/korean_dict.txt` is a Korean dictionary with 3636 characters -`ppocr/utils/dict/german_dict.txt` is a French dictionary with 131 characters +`ppocr/utils/dict/german_dict.txt` is a German dictionary with 131 characters You can use it on demand. diff --git a/doc/joinus.PNG b/doc/joinus.PNG index 351d97a5c7152263445bd835b20ad7c638142b42..148dd9b72d0492474cdcec4f2196c6980f917ded 100644 Binary files a/doc/joinus.PNG and b/doc/joinus.PNG differ diff --git a/paddleocr.py b/paddleocr.py index 7e9b2402ad792b4d690b1147f042203df46872a5..3958f7ad5727e52f405cd189cb5d5a1da911cbdf 100644 --- a/paddleocr.py +++ b/paddleocr.py @@ -50,22 +50,22 @@ model_urls = { 'french': { 'url': 'https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar', - 'dict_path': './ppocr/utils/french_dict.txt' + 'dict_path': './ppocr/utils/dict/french_dict.txt' }, 'german': { 'url': 'https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar', - 'dict_path': './ppocr/utils/german_dict.txt' + 'dict_path': './ppocr/utils/dict/german_dict.txt' }, 'korean': { 'url': 'https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar', - 'dict_path': './ppocr/utils/korean_dict.txt' + 'dict_path': './ppocr/utils/dict/korean_dict.txt' }, 'japan': { 'url': 'https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar', - 'dict_path': './ppocr/utils/japan_dict.txt' + 'dict_path': './ppocr/utils/dict/japan_dict.txt' } }, 'cls': @@ -87,8 +87,8 @@ def download_with_progressbar(url, save_path): progress_bar.update(len(data)) file.write(data) progress_bar.close() - if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes: - logger.error("ERROR, something went wrong") + if total_size_in_bytes == 0 or progress_bar.n != total_size_in_bytes: + logger.error("Something went wrong while downloading models") sys.exit(0) @@ -157,7 +157,6 @@ def parse_args(): parser.add_argument("--use_space_char", type=bool, default=True) # params for text classifier - parser.add_argument("--use_angle_cls", type=str2bool, default=False) parser.add_argument("--cls_model_dir", type=str, default=None) parser.add_argument("--cls_image_shape", type=str, default="3, 48, 192") parser.add_argument("--label_list", type=list, default=['0', '180']) @@ -166,11 +165,12 @@ def parse_args(): parser.add_argument("--enable_mkldnn", type=bool, default=False) parser.add_argument("--use_zero_copy_run", type=bool, default=False) + parser.add_argument("--use_pdserving", type=str2bool, default=False) parser.add_argument("--lang", type=str, default='ch') parser.add_argument("--det", type=str2bool, default=True) parser.add_argument("--rec", type=str2bool, default=True) - parser.add_argument("--cls", type=str2bool, default=False) + parser.add_argument("--use_angle_cls", type=str2bool, default=True) return parser.parse_args() @@ -205,8 +205,7 @@ class PaddleOCR(predict_system.TextSystem): maybe_download(postprocess_params.det_model_dir, model_urls['det']) maybe_download(postprocess_params.rec_model_dir, model_urls['rec'][lang]['url']) - if self.use_angle_cls: - maybe_download(postprocess_params.cls_model_dir, model_urls['cls']) + maybe_download(postprocess_params.cls_model_dir, model_urls['cls']) if postprocess_params.det_algorithm not in SUPPORT_DET_MODEL: logger.error('det_algorithm must in {}'.format(SUPPORT_DET_MODEL)) @@ -230,9 +229,6 @@ class PaddleOCR(predict_system.TextSystem): rec: use text recognition or not, if false, only det will be exec. default is True """ assert isinstance(img, (np.ndarray, list, str)) - if cls and not self.use_angle_cls: - print('cls should be false when use_angle_cls is false') - exit(-1) self.use_angle_cls = cls if isinstance(img, str): image_file = img @@ -274,6 +270,7 @@ def main(): result = ocr_engine.ocr(img_path, det=args.det, rec=args.rec, - cls=args.cls) - for line in result: - print(line) + cls=args.use_angle_cls) + if result is not None: + for line in result: + print(line) diff --git a/ppocr/data/cls/dataset_traversal.py b/ppocr/data/cls/dataset_traversal.py index 01f8c89c839f0c8f6d07ca6ad9676947ce25f6ab..ea05b859cf6047fa54ae1f5af154b7443d2d26eb 100755 --- a/ppocr/data/cls/dataset_traversal.py +++ b/ppocr/data/cls/dataset_traversal.py @@ -74,7 +74,7 @@ class SimpleReader(object): def get_device_num(): if self.use_gpu: - gpus = os.environ.get("CUDA_VISIBLE_DEVICES", 1) + gpus = os.environ.get("CUDA_VISIBLE_DEVICES", "1") gpu_num = len(gpus.split(',')) return gpu_num else: diff --git a/ppocr/modeling/heads/cls_head.py b/ppocr/modeling/heads/cls_head.py index 4567adcbaef3ddb14f3b46b27f772e3836db6793..729561f9c486567e7ffd0eb4c4e55d56ce8a74e6 100644 --- a/ppocr/modeling/heads/cls_head.py +++ b/ppocr/modeling/heads/cls_head.py @@ -23,6 +23,14 @@ import paddle.fluid as fluid class ClsHead(object): + """ + Class orientation + + Args: + + params(dict): super parameters for build Class network + """ + def __init__(self, params): super(ClsHead, self).__init__() self.class_dim = params['class_dim'] diff --git a/ppocr/modeling/heads/det_east_head.py b/ppocr/modeling/heads/det_east_head.py index de6ed51db72aee297e5cec7b89b49b9a0f55cd30..e2d9176e9146ee3f4738dcf1cda962ff6bb3f749 100755 --- a/ppocr/modeling/heads/det_east_head.py +++ b/ppocr/modeling/heads/det_east_head.py @@ -109,6 +109,12 @@ class EASTHead(object): return f_score, f_geo def __call__(self, inputs): + """ + Fuse different levels of feature map from backbone and predict results + Args: + inputs(list): feature maps from backbone + Return: predicts + """ f_common = self.unet_fusion(inputs) f_score, f_geo = self.detector_header(f_common) predicts = OrderedDict() diff --git a/ppocr/modeling/heads/det_sast_head.py b/ppocr/modeling/heads/det_sast_head.py index 0097913dd7e08c76c45064940416e7c9ffc32f26..7b9520e57fea76e05b9009c1ca56e77c0e7a6fc4 100644 --- a/ppocr/modeling/heads/det_sast_head.py +++ b/ppocr/modeling/heads/det_sast_head.py @@ -38,35 +38,66 @@ class SASTHead(object): blocks{}: contain block_2, block_3, block_4, block_5, block_6, block_7 with 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 resolution. """ - f = [blocks['block_6'], blocks['block_5'], blocks['block_4'], blocks['block_3'], blocks['block_2']] + f = [ + blocks['block_6'], blocks['block_5'], blocks['block_4'], + blocks['block_3'], blocks['block_2'] + ] num_outputs = [256, 256, 192, 192, 128] g = [None, None, None, None, None] - h = [None, None, None, None, None] + h = [None, None, None, None, None] for i in range(5): - h[i] = conv_bn_layer(input=f[i], num_filters=num_outputs[i], - filter_size=1, stride=1, act=None, name='fpn_up_h'+str(i)) + h[i] = conv_bn_layer( + input=f[i], + num_filters=num_outputs[i], + filter_size=1, + stride=1, + act=None, + name='fpn_up_h' + str(i)) for i in range(4): if i == 0: - g[i] = deconv_bn_layer(input=h[i], num_filters=num_outputs[i + 1], act=None, name='fpn_up_g0') + g[i] = deconv_bn_layer( + input=h[i], + num_filters=num_outputs[i + 1], + act=None, + name='fpn_up_g0') #print("g[{}] shape: {}".format(i, g[i].shape)) else: g[i] = fluid.layers.elementwise_add(x=g[i - 1], y=h[i]) g[i] = fluid.layers.relu(g[i]) #g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i], # filter_size=1, stride=1, act='relu') - g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i], - filter_size=3, stride=1, act='relu', name='fpn_up_g%d_1'%i) - g[i] = deconv_bn_layer(input=g[i], num_filters=num_outputs[i + 1], act=None, name='fpn_up_g%d_2'%i) + g[i] = conv_bn_layer( + input=g[i], + num_filters=num_outputs[i], + filter_size=3, + stride=1, + act='relu', + name='fpn_up_g%d_1' % i) + g[i] = deconv_bn_layer( + input=g[i], + num_filters=num_outputs[i + 1], + act=None, + name='fpn_up_g%d_2' % i) #print("g[{}] shape: {}".format(i, g[i].shape)) g[4] = fluid.layers.elementwise_add(x=g[3], y=h[4]) g[4] = fluid.layers.relu(g[4]) - g[4] = conv_bn_layer(input=g[4], num_filters=num_outputs[4], - filter_size=3, stride=1, act='relu', name='fpn_up_fusion_1') - g[4] = conv_bn_layer(input=g[4], num_filters=num_outputs[4], - filter_size=1, stride=1, act=None, name='fpn_up_fusion_2') - + g[4] = conv_bn_layer( + input=g[4], + num_filters=num_outputs[4], + filter_size=3, + stride=1, + act='relu', + name='fpn_up_fusion_1') + g[4] = conv_bn_layer( + input=g[4], + num_filters=num_outputs[4], + filter_size=1, + stride=1, + act=None, + name='fpn_up_fusion_2') + return g[4] def FPN_Down_Fusion(self, blocks): @@ -77,95 +108,245 @@ class SASTHead(object): f = [blocks['block_0'], blocks['block_1'], blocks['block_2']] num_outputs = [32, 64, 128] g = [None, None, None] - h = [None, None, None] + h = [None, None, None] for i in range(3): - h[i] = conv_bn_layer(input=f[i], num_filters=num_outputs[i], - filter_size=3, stride=1, act=None, name='fpn_down_h'+str(i)) + h[i] = conv_bn_layer( + input=f[i], + num_filters=num_outputs[i], + filter_size=3, + stride=1, + act=None, + name='fpn_down_h' + str(i)) for i in range(2): if i == 0: - g[i] = conv_bn_layer(input=h[i], num_filters=num_outputs[i+1], filter_size=3, stride=2, act=None, name='fpn_down_g0') + g[i] = conv_bn_layer( + input=h[i], + num_filters=num_outputs[i + 1], + filter_size=3, + stride=2, + act=None, + name='fpn_down_g0') else: g[i] = fluid.layers.elementwise_add(x=g[i - 1], y=h[i]) g[i] = fluid.layers.relu(g[i]) - g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i], filter_size=3, stride=1, act='relu', name='fpn_down_g%d_1'%i) - g[i] = conv_bn_layer(input=g[i], num_filters=num_outputs[i+1], filter_size=3, stride=2, act=None, name='fpn_down_g%d_2'%i) + g[i] = conv_bn_layer( + input=g[i], + num_filters=num_outputs[i], + filter_size=3, + stride=1, + act='relu', + name='fpn_down_g%d_1' % i) + g[i] = conv_bn_layer( + input=g[i], + num_filters=num_outputs[i + 1], + filter_size=3, + stride=2, + act=None, + name='fpn_down_g%d_2' % i) # print("g[{}] shape: {}".format(i, g[i].shape)) g[2] = fluid.layers.elementwise_add(x=g[1], y=h[2]) g[2] = fluid.layers.relu(g[2]) - g[2] = conv_bn_layer(input=g[2], num_filters=num_outputs[2], - filter_size=3, stride=1, act='relu', name='fpn_down_fusion_1') - g[2] = conv_bn_layer(input=g[2], num_filters=num_outputs[2], - filter_size=1, stride=1, act=None, name='fpn_down_fusion_2') + g[2] = conv_bn_layer( + input=g[2], + num_filters=num_outputs[2], + filter_size=3, + stride=1, + act='relu', + name='fpn_down_fusion_1') + g[2] = conv_bn_layer( + input=g[2], + num_filters=num_outputs[2], + filter_size=1, + stride=1, + act=None, + name='fpn_down_fusion_2') return g[2] def SAST_Header1(self, f_common): """Detector header.""" #f_score - f_score = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_score1') - f_score = conv_bn_layer(input=f_score, num_filters=64, filter_size=3, stride=1, act='relu', name='f_score2') - f_score = conv_bn_layer(input=f_score, num_filters=128, filter_size=1, stride=1, act='relu', name='f_score3') - f_score = conv_bn_layer(input=f_score, num_filters=1, filter_size=3, stride=1, name='f_score4') + f_score = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_score1') + f_score = conv_bn_layer( + input=f_score, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_score2') + f_score = conv_bn_layer( + input=f_score, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_score3') + f_score = conv_bn_layer( + input=f_score, + num_filters=1, + filter_size=3, + stride=1, + name='f_score4') f_score = fluid.layers.sigmoid(f_score) # print("f_score shape: {}".format(f_score.shape)) #f_boder - f_border = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_border1') - f_border = conv_bn_layer(input=f_border, num_filters=64, filter_size=3, stride=1, act='relu', name='f_border2') - f_border = conv_bn_layer(input=f_border, num_filters=128, filter_size=1, stride=1, act='relu', name='f_border3') - f_border = conv_bn_layer(input=f_border, num_filters=4, filter_size=3, stride=1, name='f_border4') + f_border = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_border1') + f_border = conv_bn_layer( + input=f_border, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_border2') + f_border = conv_bn_layer( + input=f_border, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_border3') + f_border = conv_bn_layer( + input=f_border, + num_filters=4, + filter_size=3, + stride=1, + name='f_border4') # print("f_border shape: {}".format(f_border.shape)) - + return f_score, f_border def SAST_Header2(self, f_common): - """Detector header.""" + """Detector header.""" #f_tvo - f_tvo = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_tvo1') - f_tvo = conv_bn_layer(input=f_tvo, num_filters=64, filter_size=3, stride=1, act='relu', name='f_tvo2') - f_tvo = conv_bn_layer(input=f_tvo, num_filters=128, filter_size=1, stride=1, act='relu', name='f_tvo3') - f_tvo = conv_bn_layer(input=f_tvo, num_filters=8, filter_size=3, stride=1, name='f_tvo4') + f_tvo = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_tvo1') + f_tvo = conv_bn_layer( + input=f_tvo, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_tvo2') + f_tvo = conv_bn_layer( + input=f_tvo, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_tvo3') + f_tvo = conv_bn_layer( + input=f_tvo, num_filters=8, filter_size=3, stride=1, name='f_tvo4') # print("f_tvo shape: {}".format(f_tvo.shape)) #f_tco - f_tco = conv_bn_layer(input=f_common, num_filters=64, filter_size=1, stride=1, act='relu', name='f_tco1') - f_tco = conv_bn_layer(input=f_tco, num_filters=64, filter_size=3, stride=1, act='relu', name='f_tco2') - f_tco = conv_bn_layer(input=f_tco, num_filters=128, filter_size=1, stride=1, act='relu', name='f_tco3') - f_tco = conv_bn_layer(input=f_tco, num_filters=2, filter_size=3, stride=1, name='f_tco4') + f_tco = conv_bn_layer( + input=f_common, + num_filters=64, + filter_size=1, + stride=1, + act='relu', + name='f_tco1') + f_tco = conv_bn_layer( + input=f_tco, + num_filters=64, + filter_size=3, + stride=1, + act='relu', + name='f_tco2') + f_tco = conv_bn_layer( + input=f_tco, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_tco3') + f_tco = conv_bn_layer( + input=f_tco, num_filters=2, filter_size=3, stride=1, name='f_tco4') # print("f_tco shape: {}".format(f_tco.shape)) - + return f_tvo, f_tco def cross_attention(self, f_common): """ """ f_shape = fluid.layers.shape(f_common) - f_theta = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, act='relu', name='f_theta') - f_phi = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, act='relu', name='f_phi') - f_g = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, act='relu', name='f_g') + f_theta = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_theta') + f_phi = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_phi') + f_g = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_g') ### horizon fh_theta = f_theta fh_phi = f_phi fh_g = f_g #flatten fh_theta = fluid.layers.transpose(fh_theta, [0, 2, 3, 1]) - fh_theta = fluid.layers.reshape(fh_theta, [f_shape[0] * f_shape[2], f_shape[3], 128]) + fh_theta = fluid.layers.reshape( + fh_theta, [f_shape[0] * f_shape[2], f_shape[3], 128]) fh_phi = fluid.layers.transpose(fh_phi, [0, 2, 3, 1]) - fh_phi = fluid.layers.reshape(fh_phi, [f_shape[0] * f_shape[2], f_shape[3], 128]) + fh_phi = fluid.layers.reshape( + fh_phi, [f_shape[0] * f_shape[2], f_shape[3], 128]) fh_g = fluid.layers.transpose(fh_g, [0, 2, 3, 1]) - fh_g = fluid.layers.reshape(fh_g, [f_shape[0] * f_shape[2], f_shape[3], 128]) + fh_g = fluid.layers.reshape(fh_g, + [f_shape[0] * f_shape[2], f_shape[3], 128]) #correlation - fh_attn = fluid.layers.matmul(fh_theta, fluid.layers.transpose(fh_phi, [0, 2, 1])) + fh_attn = fluid.layers.matmul(fh_theta, + fluid.layers.transpose(fh_phi, [0, 2, 1])) #scale - fh_attn = fh_attn / (128 ** 0.5) + fh_attn = fh_attn / (128**0.5) fh_attn = fluid.layers.softmax(fh_attn) #weighted sum fh_weight = fluid.layers.matmul(fh_attn, fh_g) - fh_weight = fluid.layers.reshape(fh_weight, [f_shape[0], f_shape[2], f_shape[3], 128]) + fh_weight = fluid.layers.reshape( + fh_weight, [f_shape[0], f_shape[2], f_shape[3], 128]) # print("fh_weight: {}".format(fh_weight.shape)) fh_weight = fluid.layers.transpose(fh_weight, [0, 3, 1, 2]) - fh_weight = conv_bn_layer(input=fh_weight, num_filters=128, filter_size=1, stride=1, name='fh_weight') + fh_weight = conv_bn_layer( + input=fh_weight, + num_filters=128, + filter_size=1, + stride=1, + name='fh_weight') #short cut - fh_sc = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, name='fh_sc') + fh_sc = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + name='fh_sc') f_h = fluid.layers.relu(fh_weight + fh_sc) ###### #vertical @@ -174,31 +355,60 @@ class SASTHead(object): fv_g = fluid.layers.transpose(f_g, [0, 1, 3, 2]) #flatten fv_theta = fluid.layers.transpose(fv_theta, [0, 2, 3, 1]) - fv_theta = fluid.layers.reshape(fv_theta, [f_shape[0] * f_shape[3], f_shape[2], 128]) + fv_theta = fluid.layers.reshape( + fv_theta, [f_shape[0] * f_shape[3], f_shape[2], 128]) fv_phi = fluid.layers.transpose(fv_phi, [0, 2, 3, 1]) - fv_phi = fluid.layers.reshape(fv_phi, [f_shape[0] * f_shape[3], f_shape[2], 128]) + fv_phi = fluid.layers.reshape( + fv_phi, [f_shape[0] * f_shape[3], f_shape[2], 128]) fv_g = fluid.layers.transpose(fv_g, [0, 2, 3, 1]) - fv_g = fluid.layers.reshape(fv_g, [f_shape[0] * f_shape[3], f_shape[2], 128]) + fv_g = fluid.layers.reshape(fv_g, + [f_shape[0] * f_shape[3], f_shape[2], 128]) #correlation - fv_attn = fluid.layers.matmul(fv_theta, fluid.layers.transpose(fv_phi, [0, 2, 1])) + fv_attn = fluid.layers.matmul(fv_theta, + fluid.layers.transpose(fv_phi, [0, 2, 1])) #scale - fv_attn = fv_attn / (128 ** 0.5) + fv_attn = fv_attn / (128**0.5) fv_attn = fluid.layers.softmax(fv_attn) #weighted sum fv_weight = fluid.layers.matmul(fv_attn, fv_g) - fv_weight = fluid.layers.reshape(fv_weight, [f_shape[0], f_shape[3], f_shape[2], 128]) + fv_weight = fluid.layers.reshape( + fv_weight, [f_shape[0], f_shape[3], f_shape[2], 128]) # print("fv_weight: {}".format(fv_weight.shape)) fv_weight = fluid.layers.transpose(fv_weight, [0, 3, 2, 1]) - fv_weight = conv_bn_layer(input=fv_weight, num_filters=128, filter_size=1, stride=1, name='fv_weight') + fv_weight = conv_bn_layer( + input=fv_weight, + num_filters=128, + filter_size=1, + stride=1, + name='fv_weight') #short cut - fv_sc = conv_bn_layer(input=f_common, num_filters=128, filter_size=1, stride=1, name='fv_sc') + fv_sc = conv_bn_layer( + input=f_common, + num_filters=128, + filter_size=1, + stride=1, + name='fv_sc') f_v = fluid.layers.relu(fv_weight + fv_sc) ###### f_attn = fluid.layers.concat([f_h, f_v], axis=1) - f_attn = conv_bn_layer(input=f_attn, num_filters=128, filter_size=1, stride=1, act='relu', name='f_attn') + f_attn = conv_bn_layer( + input=f_attn, + num_filters=128, + filter_size=1, + stride=1, + act='relu', + name='f_attn') return f_attn - + def __call__(self, blocks, with_cab=False): + """ + Fuse different levels of feature map from backbone and predict results + Args: + blocks(list): feature maps from backbone + with_cab(bool): whether use cross_attention + Return: predicts + """ + # for k, v in blocks.items(): # print(k, v.shape) @@ -212,12 +422,12 @@ class SASTHead(object): f_common = fluid.layers.elementwise_add(x=f_down, y=f_up) f_common = fluid.layers.relu(f_common) # print("f_common: {}".format(f_common.shape)) - + if self.with_cab: # print('enhence f_common with CAB.') f_common = self.cross_attention(f_common) - - f_score, f_border= self.SAST_Header1(f_common) + + f_score, f_border = self.SAST_Header1(f_common) f_tvo, f_tco = self.SAST_Header2(f_common) predicts = OrderedDict() @@ -225,4 +435,4 @@ class SASTHead(object): predicts['f_border'] = f_border predicts['f_tvo'] = f_tvo predicts['f_tco'] = f_tco - return predicts \ No newline at end of file + return predicts diff --git a/ppocr/modeling/heads/rec_srn_all_head.py b/ppocr/modeling/heads/rec_srn_all_head.py index e1bb955d437faca243e3768e24b47f4328218624..c2a701159aae3e1238b2de698ddf11ede661d09e 100755 --- a/ppocr/modeling/heads/rec_srn_all_head.py +++ b/ppocr/modeling/heads/rec_srn_all_head.py @@ -28,6 +28,13 @@ gradient_clip = 10 class SRNPredict(object): + """ + SRN: + see arxiv: https://arxiv.org/abs/2003.12294 + args: + params(dict): the super parameters for network build + """ + def __init__(self, params): super(SRNPredict, self).__init__() self.char_num = params['char_num'] @@ -39,7 +46,15 @@ class SRNPredict(object): self.hidden_dims = params['hidden_dims'] def pvam(self, inputs, others): + """ + Parallel visual attention module model + + args: + inputs(variable): Feature map extracted from backbone network + others(list): Other location information variables + return: pvam_features + """ b, c, h, w = inputs.shape conv_features = fluid.layers.reshape(x=inputs, shape=[-1, c, h * w]) conv_features = fluid.layers.transpose(x=conv_features, perm=[0, 2, 1]) @@ -98,6 +113,15 @@ class SRNPredict(object): return pvam_features def gsrm(self, pvam_features, others): + """ + Global Semantic Reasonging Module + + args: + pvam_features(variable): Feature map extracted from pvam + others(list): Other location information variables + + return: gsrm_features, word_out, gsrm_out + """ #===== GSRM Visual-to-semantic embedding block ===== b, t, c = pvam_features.shape @@ -190,7 +214,15 @@ class SRNPredict(object): return gsrm_features, word_out, gsrm_out def vsfd(self, pvam_features, gsrm_features): + """ + Visual-Semantic Fusion Decoder Module + args: + pvam_features(variable): Feature map extracted from pvam + gsrm_features(list): Feature map extracted from gsrm + + return: fc_out + """ #===== Visual-Semantic Fusion Decoder Module ===== b, t, c1 = pvam_features.shape b, t, c2 = gsrm_features.shape diff --git a/ppocr/modeling/stns/tps.py b/ppocr/modeling/stns/tps.py old mode 100755 new mode 100644 index 24c6448d2dc85442e85aff977727ecd4af6a439e..18d0225d119800bbbf05c6b24bebd40de5bd5ca2 --- a/ppocr/modeling/stns/tps.py +++ b/ppocr/modeling/stns/tps.py @@ -70,6 +70,13 @@ class LocalizationNetwork(object): return initial_bias def __call__(self, image): + """ + Estimating parameters of geometric transformation + Args: + image: input + Return: + batch_C_prime: the matrix of the geometric transformation + """ F = self.F loc_lr = self.loc_lr if self.model_name == "large": @@ -215,6 +222,14 @@ class GridGenerator(object): return batch_C_ex_part_tensor def __call__(self, batch_C_prime, I_r_size): + """ + Generate the grid for the grid_sampler. + Args: + batch_C_prime: the matrix of the geometric transformation + I_r_size: the shape of the input image + Return: + batch_P_prime: the grid for the grid_sampler + """ C = self.build_C() P = self.build_P(I_r_size) inv_delta_C = self.build_inv_delta_C(C).astype('float32') diff --git a/ppocr/optimizer.py b/ppocr/optimizer.py index fd315cd1319d4925e893705957a42f931a39076e..90d402a6da9bc3942f1c0118f43ed7d8dd1e3597 100644 --- a/ppocr/optimizer.py +++ b/ppocr/optimizer.py @@ -29,9 +29,17 @@ def cosine_decay_with_warmup(learning_rate, step_each_epoch, epochs=500, warmup_minibatch=1000): - """Applies cosine decay to the learning rate. + """ + Applies cosine decay to the learning rate. lr = 0.05 * (math.cos(epoch * (math.pi / 120)) + 1) decrease lr for every mini-batch and start with warmup. + args: + learning_rate(float): initial learning rate + step_each_epoch (int): number of step for each epoch in training process + epochs(int): number of training epochs + warmup_minibatch(int): number of minibatch for warmup + return: + lr(tensor): learning rate tensor """ global_step = _decay_step_counter() lr = fluid.layers.tensor.create_global_var( @@ -65,6 +73,7 @@ def AdamDecay(params, parameter_list=None): params(dict): the super parameters parameter_list (list): list of Variable names to update to minimize loss return: + optimizer: a Adam optimizer instance """ base_lr = params['base_lr'] beta1 = params['beta1'] @@ -121,6 +130,7 @@ def RMSProp(params, parameter_list=None): params(dict): the super parameters parameter_list (list): list of Variable names to update to minimize loss return: + optimizer: a RMSProp optimizer instance """ base_lr = params.get("base_lr", 0.001) l2_decay = params.get("l2_decay", 0.00005) diff --git a/ppocr/utils/utility.py b/ppocr/utils/utility.py index e27dd1d8738a25c6a6669b99ad2b6eed4a9f25d0..831b8eff97d4d3c158b0d5a6fc93d6153d000740 100755 --- a/ppocr/utils/utility.py +++ b/ppocr/utils/utility.py @@ -16,6 +16,7 @@ import logging import os import imghdr import cv2 +import paddle from paddle import fluid @@ -102,3 +103,10 @@ def create_multi_devices_program(program, loss_var_name): build_strategy=build_strategy, exec_strategy=exec_strategy) return compile_program + + +def enable_static_mode(): + try: + paddle.enable_static() + except: + pass diff --git a/requirments.txt b/requirements.txt similarity index 100% rename from requirments.txt rename to requirements.txt diff --git a/setup.py b/setup.py index eb6f2d65edd75b97489d61e0d39798e13f71c52b..d831a3a34f81357c5807127d763ffeb18974c0ff 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ setup( package_dir={'paddleocr': ''}, include_package_data=True, entry_points={"console_scripts": ["paddleocr= paddleocr.paddleocr:main"]}, - version='1.0.0', + version='1.1.1', install_requires=requirements, license='Apache License 2.0', description='Awesome OCR toolkits based on PaddlePaddle (8.6M ultra-lightweight pre-trained model, support training and deployment among server, mobile, embeded and IoT devices', diff --git a/thirdparty/README.md b/thirdparty/README.md new file mode 100644 index 0000000000000000000000000000000000000000..cb026718ee24150825c7a285322cda51a9e9e64b --- /dev/null +++ b/thirdparty/README.md @@ -0,0 +1,60 @@ +## 第三方贡献说明 + + +- 首先感谢大家对于PaddleOCR的支持,我们也希望大家共同建设,共同分享,形成良好的开源社区氛围:) +- 如果您也有意愿贡献,可以快速查看[贡献说明](#贡献说明): + +## 一、近期更新(截至2020.11.5) + + +- 非常感谢 [zhangxin](https://github.com/ZhangXinNan)([Blog](https://blog.csdn.net/sdlypyzq)) 贡献新的可视化方式、添加.gitgnore、处理手动设置PYTHONPATH环境变量的问题([#210](https://github.com/PaddlePaddle/PaddleOCR/pull/210)) +- 非常感谢 [lyl120117](https://github.com/lyl120117) 贡献打印网络结构的代码([#304](https://github.com/PaddlePaddle/PaddleOCR/pull/304)) +- 非常感谢 [BeyondYourself](https://github.com/BeyondYourself) 给PaddleOCR提了很多非常棒的建议,并简化了PaddleOCR的部分代码风格([so many commits)](https://github.com/PaddlePaddle/PaddleOCR/commits?author=BeyondYourself)。 + +### 2、新增需求类 +- 非常感谢 [xiangyubo](https://github.com/xiangyubo) 贡献手写中文OCR数据集([#321](https://github.com/PaddlePaddle/PaddleOCR/pull/321)) +- 非常感谢 [Mejans](https://github.com/Mejans) 给PaddleOCR增加新语言奥克西坦语Occitan的字典和语料([#954](https://github.com/PaddlePaddle/PaddleOCR/pull/954))。 + +### 3、新增功能类 +- 非常感谢 [authorfu](https://github.com/authorfu) 贡献Android([#340](https://github.com/PaddlePaddle/PaddleOCR/pull/340))和[xiadeye](https://github.com/xiadeye) 贡献IOS的demo代码([#325](https://github.com/PaddlePaddle/PaddleOCR/pull/325)) +- 非常感谢 [tangmq](https://gitee.com/tangmq) 给PaddleOCR增加Docker化部署服务,支持快速发布可调用的Restful API服务([#507](https://github.com/PaddlePaddle/PaddleOCR/pull/507))。 +- 非常感谢 [lijinhan](https://github.com/lijinhan) 给PaddleOCR增加java SpringBoot 调用OCR Hubserving接口完成对OCR服务化部署的使用([#1027](https://github.com/PaddlePaddle/PaddleOCR/pull/1027))。 + + + +## 二、贡献说明 +### 1、修复建议类 + - 如果是bug改动和修复,直接提在官方代码对应位置修改,PR提交,review后合入即可。 + + +### 2、新增需求类 + - 如果目前提供的功能不能满足需求,可以在新需求中增加,注明【需求】xxx,可以提到[新需求](./requests.md)里面。 + +### 3、新增功能类 + + - 新增功能也可以在本文件夹中新建文件夹,按照功能命名,文件夹内需包含完整代码和readme文档,在文档中描述清楚具体如何使用(也可以在个人repo中完成,通过新增requirements文件,增加一行 `paddleocr` 可以通过usedby 收录) + - 新增部署方式支持,可以在本文件夹新增 + - 新增多种编程语言支持功能,可以在本文件夹新增 + + +## 三、代码要求 + - **文档、文档、文档**,重要的事情说三遍 + - 简单高效,直观明了,功能完善,没有bug + - 提交之前需要使用 pre-commit 工具来自动检查一些基本事宜(如每个文件只有一个 EOL,Git 中不要添加大文件等)。pre-commit测试是 Travis-CI 中单元测试的一部分,首先安装并在当前目录运行它: + +``` +pip install pre-commit +pre-commit install +``` + + - 目前默认使用 clang-format 来调整 C/C++ 源代码格式,请确保 clang-format 版本在 3.8 以上。注:通过pip install pre-commit和conda install -c conda-forge pre-commit安装的yapf稍有不同的,Paddle 开发人员使用的是pip install pre-commit。 + + + +## 四、联系我们 + - PR之前如果有任何的不确定,欢迎先通过issue或者微信群联系我们,提前沟通pr位置,减少comment和反复修改。 + + +## 五、致谢与后续 + - 合入代码之后,首页README末尾新增感谢贡献,默认链接为github名字及主页,如果有需要更换主页,也可以联系我们 + - 新增重要功能类,会在用户群广而告之,享受开源社区荣誉时刻。 diff --git a/thirdparty/paddleOcrSpringBoot/mvnw b/thirdparty/paddleOcrSpringBoot/mvnw new file mode 100644 index 0000000000000000000000000000000000000000..a16b5431b4c3cab50323a3f558003fd0abd87dad --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/thirdparty/paddleOcrSpringBoot/mvnw.cmd b/thirdparty/paddleOcrSpringBoot/mvnw.cmd new file mode 100644 index 0000000000000000000000000000000000000000..c8d43372c986d97911cdc21bd87e0cbe3d83bdda --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/thirdparty/paddleOcrSpringBoot/paddleOcrSpringBoot.iml b/thirdparty/paddleOcrSpringBoot/paddleOcrSpringBoot.iml new file mode 100644 index 0000000000000000000000000000000000000000..e7675c8d2b2f776403c2559ead8035ddb5dad596 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/paddleOcrSpringBoot.iml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/thirdparty/paddleOcrSpringBoot/pom.xml b/thirdparty/paddleOcrSpringBoot/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..76eb7be0b45e4d3c2d5407392f84e30c92bb7eb8 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.4.RELEASE + + + com.paddelOcr_springBoot + demo + 0.0.1-SNAPSHOT + demo + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + org.apache.httpcomponents + httpclient + + + com.vaadin.external.google + android-json + 0.0.20131108.vaadin1 + compile + + + com.google.code.gson + gson + 2.8.6 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/thirdparty/paddleOcrSpringBoot/readme.md b/thirdparty/paddleOcrSpringBoot/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..154a52bd1f4eacae51943a98e5ca2a40f017bea0 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/readme.md @@ -0,0 +1,37 @@ +简体中文 + +- 使用本教程前请先基于PaddleHub Serving的部署. + +# 基于PaddleHub Serving的Java SpringBoot调用 + +paddleOcrSpringBoot服务部署目录下包括全部SpringBoot代码。目录结构如下: +``` +deploy/paddleOcrSpringBoot/ + └─ src 代码文件 + └─ main 主函数代码 + └─ java\com\paddelocr_springboot\demo + └─ DemoApplication.java SpringBoot启动代码 + └─ Controller + └─ OCR.java 控制器代码 + └─ test 测试代码 +``` + +- Hub Serving启动后的APi端口如下: +`http://[ip_address]:[port]/predict/[module_name]` + +## 返回结果格式说明 +返回结果为列表(list),列表中的每一项为词典(dict),词典一共可能包含3种字段,信息如下: + +|字段名称|数据类型|意义| +|-|-|-| +|text|str|文本内容| +|confidence|float| 文本识别置信度| +|text_region|list|文本位置坐标| + +不同模块返回的字段不同,如,文本识别服务模块返回结果不含`text_region`字段,具体信息如下: + +|字段名/模块名|ocr_det|ocr_rec|ocr_system| +|-|-|-|-| +|text||✔|✔| +|confidence||✔|✔| +|text_region|✔||✔| diff --git a/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/Controller/OCR.java b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/Controller/OCR.java new file mode 100644 index 0000000000000000000000000000000000000000..a4b6ce0b6600998175515996e3d6c8abf8ff9495 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/Controller/OCR.java @@ -0,0 +1,61 @@ +package com.paddelocr_springboot.demo.Controller; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.json.JSONObject; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.ResourceUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.*; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import sun.misc.BASE64Encoder; +import java.util.Objects; + +@RestController +public class OCR { +@RequestMapping("/") + public ResponseEntity hi(){ + //创建请求头 + HttpHeaders headers = new HttpHeaders(); + //设置请求头格式 + headers.setContentType(MediaType.APPLICATION_JSON); + //读入静态资源文件1.png + InputStream imagePath = this.getClass().getResourceAsStream("/1.png"); + //构建请求参数 + MultiValueMap map= new LinkedMultiValueMap(); + //添加请求参数images,并将Base64编码的图片传入 + map.add("images", ImageToBase64(imagePath)); + //构建请求 + HttpEntity> request = new HttpEntity>(map, headers); + RestTemplate restTemplate = new RestTemplate(); + //发送请求 + ResponseEntity response = restTemplate.postForEntity("http://127.0.0.1:8866/predict/ocr_system", request, String.class); + //打印请求返回值 + return response; + } + private String ImageToBase64(InputStream imgPath) { + byte[] data = null; + // 读取图片字节数组 + try { + InputStream in = imgPath; + System.out.println(imgPath); + data = new byte[in.available()]; + in.read(data); + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + // 对字节数组Base64编码 + BASE64Encoder encoder = new BASE64Encoder(); + // 返回Base64编码过的字节数组字符串 + //System.out.println("图片转换Base64:" + encoder.encode(Objects.requireNonNull(data))); + return encoder.encode(Objects.requireNonNull(data)); + } + +} diff --git a/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/DemoApplication.java b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/DemoApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..3834d02b432e0f34e65b558116fa5db2607a87b8 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/main/java/com/paddelocr_springboot/demo/DemoApplication.java @@ -0,0 +1,13 @@ +package com.paddelocr_springboot.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/thirdparty/paddleOcrSpringBoot/src/main/resources/1.png b/thirdparty/paddleOcrSpringBoot/src/main/resources/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f14534821e97c72185273c2d5f4f914e96548346 Binary files /dev/null and b/thirdparty/paddleOcrSpringBoot/src/main/resources/1.png differ diff --git a/thirdparty/paddleOcrSpringBoot/src/main/resources/application.properties b/thirdparty/paddleOcrSpringBoot/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..b3a58e21f2ebfc4b6a6e468a0612adcdd52c81d2 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/main/resources/application.properties @@ -0,0 +1,7 @@ +server.port=8081 +http_pool.max_total: 200 +http_pool.default_max_per_route: 100 +http_pool.connect_timeout: 5000 +http_pool.connection_request_timeout: 1000 +http_pool.socket_timeout: 65000 +http_pool.validate_after_inactivity: 2000 \ No newline at end of file diff --git a/thirdparty/paddleOcrSpringBoot/src/test/java/com/paddelocr_springboot/demo/DemoApplicationTests.java b/thirdparty/paddleOcrSpringBoot/src/test/java/com/paddelocr_springboot/demo/DemoApplicationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..c844d58f632da71c3b17b84404107eb05bb2f4b6 --- /dev/null +++ b/thirdparty/paddleOcrSpringBoot/src/test/java/com/paddelocr_springboot/demo/DemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.paddelocr_springboot.demo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DemoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/thirdparty/paddleocr-go/README.md b/thirdparty/paddleocr-go/README.md new file mode 100644 index 0000000000000000000000000000000000000000..718981e8bc76350b4acfcb530bac527e06269e0f --- /dev/null +++ b/thirdparty/paddleocr-go/README.md @@ -0,0 +1,337 @@ +# PaddleOCR-GO + +本服务是[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)的golang部署版本。 + +## 1. 环境准备 + +### 运行环境 + +- go: 1.14 +- OpenCV: 4.3.0 +- PaddlePaddle: 1.8.4 +- 编译环境:cmake 3.15.4 | gcc 4.8.5 +- 基于Centos 7.4运行环境编译,Windows请自行解决`OpenCV`和`PaddlePaddle`的编译问题 + +*另外,以下编译以`.bashrc`个人环境变量配置文件,如果使用`zsh`,请自行更换为`.zshrc`* + +### 1.1 安装golang + +从官网下载[golang](https://golang.org/dl/),建议选择1.13版本以上进行安装。下载完成后,直接解压你需要的安装目录,并配置相关环境变量,此处以1.14版本为例。 + +```shell +# 下载golang +wget https://golang.org/dl/go1.14.10.linux-amd64.tar.gz + +# 解压到 /usr/local 目录下 +tar -xzvf go1.14.10.linux-amd64.tar.gz -C /usr/local + +# 配置GOROOT,即go的安装目录 +echo "export GOROOT=/usr/local/go" >> ~/.bashrc +echo "export PATH=$PATH:$GOROOT/bin" >> ~/.bashrc +# 配置GOPATH,即go相关package的安装目录,可自定义一个目录 +echo "export GOPATH=$HOME/golang" >> ~/.bashrc +echo "export PATH=$PATH:$GOPATH/bin" >> ~/.bashrc +# 配置GOPROXY,即go mod包管理器的下载代理,同时打开mod模式 +echo "export GO111MODULE=on" >> ~/.bashrc +echo "export GOPROXY=https://mirrors.aliyun.com/goproxy/" >> ~/.bashrc +source ~/.bashrc +``` + +### 1.2 编译OpenCV库 + +go语言中,OpenCV的使用主要以[gocv](https://github.com/hybridgroup/gocv)包为主,gocv使用cgo调用OpenCV提供接口,因此还是需要编译OpenCV库。 + +**踩坑指南之一:[gocv官方实现](https://github.com/hybridgroup/gocv)中,部分接口并没有与原版C++的OpenCV的API保持一致,导致图片处理结果会出现一定的数值偏差。为处理这种偏差,[该仓库](https://github.com/LKKlein/gocv)fork了一份gocv官方源码,并对部分这些不一致的API进行了修正,保证结果与其他语言的一致性。** + +对于OpenCV的编译,gocv官方提供了[Makefile](https://github.com/LKKlein/gocv/blob/lk/Makefile),可以一键进行安装,具体安装步骤详见[官方指南](https://github.com/LKKlein/gocv/blob/lk/README_ORIGIN.md#ubuntulinux)。 + +这里提供逐步安装的方式,方便排查错误。 + +- 下载并解压OpenCV-4.3.0和OpenCV-Contrib-4.3.0 + +```shell +# 创建opencv安装目录 +mkdir -p ~/opencv + +# 下载OpenCV +cd ~/opencv +curl -sL https://github.com/opencv/opencv/archive/4.3.0.zip > opencv.zip +unzip -q opencv.zip +rm -rf opencv.zip + +# 下载OpenCV-Contrib +curl -sL https://github.com/opencv/opencv_contrib/archive/4.3.0.zip > opencv-contrib.zip +unzip -q opencv-contrib.zip +rm -rf opencv-contrib.zip +``` + +- 安装相关依赖 + +```shell +sudo yum -y install pkgconfig cmake git gtk2-devel libpng-devel libjpeg-devel libtiff-devel tbb tbb-devel libdc1394-devel +``` + +- 编译安装 + +```shell +mkdir -p ~/.local/opencv-4.3.0 +cd ~/opencv/opencv-4.3.0 +mkdir build +cd build +cmake -D WITH_IPP=OFF \ + -D WITH_OPENGL=OFF \ + -D WITH_QT=OFF \ + -D BUILD_EXAMPLES=OFF \ + -D BUILD_TESTS=OFF \ + -D BUILD_PERF_TESTS=OFF \ + -D BUILD_opencv_java=OFF \ + -D BUILD_opencv_python=OFF \ + -D BUILD_opencv_python2=OFF \ + -D BUILD_opencv_python3=OFF \ + -D OPENCV_GENERATE_PKGCONFIG=ON \ + -D CMAKE_INSTALL_PREFIX=$HOME/.local/opencv-4.3.0 \ + -D OPENCV_ENABLE_NONFREE=ON \ + -D OPENCV_EXTRA_MODULES_PATH=$HOME/opencv/opencv_contrib-4.3.0/modules .. +make -j8 +make install +sudo ldconfig +``` + +make进行编译时,可能出现因`xfeatures2d`的两个模块下载失败导致的编译失败,这里只需要手动下载这部分文件到`$HOME/opencv/opencv_contrib-4.3.0/modules/xfeatures2d/src`目录下,然后重新执行`make -j8`即可。这部分文件地址可参考[这里](https://github.com/opencv/opencv_contrib/issues/1301#issuecomment-447181426)给出的链接。 + +- 配置环境变量 + +```shell +echo "export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$HOME/.local/opencv-4.3.0/lib64/pkgconfig" >> ~/.bashrc +echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/.local/opencv-4.3.0/lib64" >> ~/.bashrc +source ~/.bashrc +``` + +- 验证安装 + +```shell +# 安装gocv包,先mod init +go mod init opencv +go get -u github.com/LKKlein/gocv + +# 验证安装结果 +cd $GOPATH/pkg/mod/github.com/!l!k!klein/gocv@v0.28.0 +go run ./cmd/version/main.go + +# 输出 +# gocv version: 0.28.0 +# opencv lib version: 4.3.0 +``` + +### 1.3 编译PaddlePaddle的C语言API + +go语言只能通过cgo调用C语言API,而不能直接与C++进行交互,因此需要编译PaddlePaddle的C语言API。当然,也可以自己写C语言调用C++的代码和头文件,这样就可以直接使用PaddlePaddle提供的已编译的C++推理库,无需自己手动编译,详见[该仓库](https://github.com/LKKlein/paddleocr-go/tree/dev_cxx)。 + +- 获取PaddlePaddle源代码 + +```shell +cd ~ +git clone --recurse-submodules https://github.com/paddlepaddle/paddle + +# 切换到v1.8.4版本 +cd paddle +git checkout v1.8.4 + +# 目前版本无论单卡还是多卡都需要先安装nccl +git clone https://github.com/NVIDIA/nccl.git +make -j8 +make install +``` + +- 编译Paddle源代码 + +**踩坑指南之二:PaddlePaddle的C语言API实现有一个bug,即获取输入输出变量名时只能获取到第一个模型的变量名,后续模型都无法获取输入输出变量名,进而无法获取到模型输出,详情见[issue](https://github.com/PaddlePaddle/Paddle/issues/28309)。因此,编译前需要手动将`paddle/fluid/inference/capi/pd_predictor.cc`文件中`210行`与`215行`的`static`删除。** + +在处理完该bug之后,才能进行后续编译。相关编译参数见[官方文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12),注意部分参数需要相关依赖,请确保依赖完整再启用。 + +```shell +# 创建c++推理库文件夹 +mkdir -p ~/paddle_inference +export PADDLE_INFER=`$HOME/paddle_inference` + +# 执行编译 +export PADDLE_ROOT=`pwd` +mkdir build +cd build +cmake -DFLUID_INFERENCE_INSTALL_DIR=$PADDLE_INFER \ + -DWITH_CONTRIB=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_PYTHON=OFF \ + -DWITH_MKL=ON \ + -DWITH_GPU=ON \ + -DON_INFER=ON \ + --WITH_MKLDNN=ON \ + --WITH_XBYAK=ON \ + --WITH_DSO=OFF .. +make +make inference_lib_dist +``` + +编译完成后,可以在`build/fluid_inference_c_install_dir`目录下,看到以下生成的文件 + +``` +build/fluid_inference_c_install_dir +├── paddle +├── third_party +└── version.txt +``` + +其中`paddle`就是Paddle库的C语言预测API,`version.txt`中包含当前预测库的版本信息。最后,将C推理库配置到环境变量。 + +```shell +echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PADDLE_ROOT/build/fluid_inference_c_install_dir/paddle/lib" >> ~/.bashrc +echo "export LIBRARY_PATH=$LIBRARY_PATH:$PADDLE_ROOT/build/fluid_inference_c_install_dir/paddle/lib" >> ~/.bashrc + +souce ~/.bashrc +``` + +## 2. paddleocr-go预测库 + +### 2.1 安装paddleocr-go + +确保C推理库已配置到环境变量,然后直接执行安装命令 + +```shell +go get -u github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go +``` + +### 2.2 相关使用API + +在go中使用import引入包 + +```go +import github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go/ocr +``` + +- 预测结果结构体 + +```go +type OCRText struct { + BBox [][]int `json:"bbox"` + Text string `json:"text"` + Score float64 `json:"score"` +} +``` + +一张图的OCR结果包含多个`OCRText`结果,每个结果包含预测框、预测文本、预测文本得分。 + +- OCR预测类 + + +```go +func NewOCRSystem(confFile string, a map[string]interface{}) *OCRSystem +``` + +`OCRSystem`是主要对外提供API的结构; + +`confFile`是yaml配置文件的路径,可在配置文件中修改相关预测参数,也可以传空字符串,这时会全部使用默认配置; + +`a`是可以在代码中直接定义的配置参数,优先级高于配置文件,会覆盖配置文件和默认配置的参数。 + +- 单张图预测API + +```go  +func (ocr *OCRSystem) PredictOneImage(img gocv.Mat) []OCRText +``` + + +- 图片文件夹预测API + +```go +func (ocr *OCRSystem) PredictDirImages(dirname string) map[string][]OCRText +``` + +`dirname`图片文件夹的目录,默认会预测改目录下所有`jpg`和`png`图片,并返回每张图的预测结果。 + +- OCR Server + +```go +func (ocr *OCRSystem) StartServer(port string) +``` + +开启OCR预测Server,开启后,使用`post`请求上传需要识别的图片至`http://$ip:$port/ocr`即可直接获取该图片上所有文本的识别结果。其中,`$ip`是开启服务的主机`ip`或`127.0.0.1`的本地ip, `$port`是传入的端口参数。 + + +## 3. 预测demo + +### 3.1 生成预测demo + +以下两种方式均可生成预测demo文件,任选其一即可 + +- 通过下载`paddleocr-go`代码并编译 + +```shell +git clone https://github.com/PaddlePaddle/PaddleOCR +cd PaddleOCR/thirdparty/paddleocr-go + +# 确保C动态库路径已在环境变量中,执行以下命令生成ppocr-go文件 +go build ppocr-go.go +``` + +- 通过go package自动安装 + +```shell +# 执行后会自动在$GOPATH/bin下生成ppocr-go文件,如果配置了PATH=$PATH:$GOPATH/bin,以下预测命令可以去掉`./`,直接执行ppocr-go +go get -u github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go +``` + +### 3.2 修改预测配置 + +当前给定的配置文件`config/conf.yaml`中,包含了默认的OCR预测配置参数,可根据个人需要更改相关参数。 + +比如,将`use_gpu`改为`false`,使用CPU执行预测;将`det_model_dir`, `rec_model_dir`, `cls_model_dir`都更改为自己的本地模型路径,也或者是更改字典`rec_char_dict_path`的路径,这四个路径如果配置http链接,会自动下载到本地目录。另外,配置参数包含了预测引擎、检测模型、检测阈值、方向分类模型、识别模型及阈值的相关参数,具体参数的意义可参见[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/whl.md#%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E)。 + +### 3.3 执行预测demo + +预测demo提供了三种预测方式,分别是单张图预测、文件夹批量预测、OCR Server预测。三者命令行优先级依次降低。 + +#### 3.3.1 单张图预测 + +```shell +./ppocr-go --config config/conf.yaml --image images/test.jpg +``` + +执行完成,会输出以下内容: + + + +#### 3.3.2 文件夹批量预测 + +```shell +./ppocr-go --config config/conf.yaml --image_dir ./images +``` + +执行完成,会输出以下内容: + + + +#### 3.3.3 开启OCR Server + +```shell +./ppocr-go --use_servering --port=18600 +``` + +开启服务后,可以在其他客户端中通过`post`请求进行ocr预测。此处以`Python`客户端为例,如下所示 + +```python +import requests + +files = {'image': open('images/test.jpg','rb')} +url = "http://127.0.0.1:18600/ocr" + +r = requests.post(url, files=files) +print(r.text) +``` + +执行完成可以得到以下结果 + +![](./images/result/python_client_result.jpg) + +最后,在Python中将上述结果可视化可以得到以下结果 + +![](./images/result/python_vis_result.jpg) diff --git a/thirdparty/paddleocr-go/config/conf.yaml b/thirdparty/paddleocr-go/config/conf.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d2892defcf5989a1abcff1240b5e6da31c7a3ba9 --- /dev/null +++ b/thirdparty/paddleocr-go/config/conf.yaml @@ -0,0 +1,47 @@ +# params for prediction engine +use_gpu: true +ir_optim: true +enable_mkldnn: false +# use_zero_copy_run: true +use_tensorrt: false +num_cpu_threads: 6 +gpu_id: 0 +gpu_mem: 2000 + +# params for text detector +det_algorithm: "DB" +det_model_dir: "https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar" +det_max_side_len: 960 + +# DB parmas +det_db_thresh: 0.3 +det_db_box_thresh: 0.5 +det_db_unclip_ratio: 2.0 + +# EAST parmas +det_east_score_thresh: 0.8 +det_east_cover_thresh: 0.1 +det_east_nms_thresh: 0.2 + +# params for text recognizer +rec_algorithm: "CRNN" +rec_model_dir: "https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar" +rec_image_shape: [3, 32, 320] +rec_char_type: "ch" +rec_batch_num: 30 +max_text_length: 25 +rec_char_dict_path: "https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/develop/ppocr/utils/ppocr_keys_v1.txt" +use_space_char: true + +# params for text classifier +use_angle_cls: false +cls_model_dir: "https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar" +cls_image_shape: [3, 48, 192] +label_list: ["0", "180"] +cls_batch_num: 30 +cls_thresh: 0.9 + +lang: ch +det: true +rec: true +cls: false \ No newline at end of file diff --git a/thirdparty/paddleocr-go/go.mod b/thirdparty/paddleocr-go/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..e0ae4b652c64a62bd0f9ed43049942d0ebf40b41 --- /dev/null +++ b/thirdparty/paddleocr-go/go.mod @@ -0,0 +1,9 @@ +module github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go + +go 1.14 + +require ( + github.com/LKKlein/gocv v0.28.0 + github.com/ctessum/go.clipper v0.0.0-20200522184404-9c744fa3e86c + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 +) diff --git a/thirdparty/paddleocr-go/go.sum b/thirdparty/paddleocr-go/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..930b2a665cc49146addba93de93e2012249cd213 --- /dev/null +++ b/thirdparty/paddleocr-go/go.sum @@ -0,0 +1,8 @@ +github.com/LKKlein/gocv v0.28.0 h1:1MMvs9uYf+QGPi86it2pUmN8RRoyMnPLUefKB/Jf1Q0= +github.com/LKKlein/gocv v0.28.0/go.mod h1:MP408EL7eakRU3vzjsozzfELSX7HDDGdMpWANV1IOHY= +github.com/PaddlePaddle/PaddleOCR v1.1.0 h1:zmPevInTs5P+ctSokI9sWQLTThmJBUCo/JCLbB5xbps= +github.com/ctessum/go.clipper v0.0.0-20200522184404-9c744fa3e86c h1:VXCsVlam0R2Yl7VET2GxZBPdOa7gFRexyhfWb9v9QtM= +github.com/ctessum/go.clipper v0.0.0-20200522184404-9c744fa3e86c/go.mod h1:KRMo3PCsooJP3LmCwKI76dkd7f3ki3zwYLHR7Iwbi5k= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/thirdparty/paddleocr-go/images/0.jpg b/thirdparty/paddleocr-go/images/0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b417220d9a6ebf0ed4d5c5578eb0128f8701ab6e Binary files /dev/null and b/thirdparty/paddleocr-go/images/0.jpg differ diff --git a/thirdparty/paddleocr-go/images/result/img_dir_result.jpg b/thirdparty/paddleocr-go/images/result/img_dir_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5341f81648d568dc0b844b7779d6cd8a7a4b870f Binary files /dev/null and b/thirdparty/paddleocr-go/images/result/img_dir_result.jpg differ diff --git a/thirdparty/paddleocr-go/images/result/python_client_result.jpg b/thirdparty/paddleocr-go/images/result/python_client_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..556573a99850552d2859219773ab70589d9ac065 Binary files /dev/null and b/thirdparty/paddleocr-go/images/result/python_client_result.jpg differ diff --git a/thirdparty/paddleocr-go/images/result/python_vis_result.jpg b/thirdparty/paddleocr-go/images/result/python_vis_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af26bdd117bf21adba3b80a6d73c7ff54b46b2bc Binary files /dev/null and b/thirdparty/paddleocr-go/images/result/python_vis_result.jpg differ diff --git a/thirdparty/paddleocr-go/images/result/single_img_result.jpg b/thirdparty/paddleocr-go/images/result/single_img_result.jpg new file mode 100644 index 0000000000000000000000000000000000000000..686841d71e12a6142c32288fc41bbc03a9edf177 Binary files /dev/null and b/thirdparty/paddleocr-go/images/result/single_img_result.jpg differ diff --git a/thirdparty/paddleocr-go/images/test.jpg b/thirdparty/paddleocr-go/images/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed91b8c5ca2a348fe7b138e83114ff81ecb107de Binary files /dev/null and b/thirdparty/paddleocr-go/images/test.jpg differ diff --git a/thirdparty/paddleocr-go/ocr/core.go b/thirdparty/paddleocr-go/ocr/core.go new file mode 100644 index 0000000000000000000000000000000000000000..dadb08d7fb66c9672af5dad180b323443e868532 --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/core.go @@ -0,0 +1,262 @@ +package ocr + +import ( + "bytes" + "encoding/json" + "errors" + "image" + "image/color" + "io" + "log" + "math" + "net/http" + "path" + "path/filepath" + "sort" + "strings" + + "github.com/LKKlein/gocv" + "github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go/paddle" +) + +type PaddleModel struct { + predictor *paddle.Predictor + input *paddle.ZeroCopyTensor + outputs []*paddle.ZeroCopyTensor + + useGPU bool + deviceID int + initGPUMem int + numThreads int + useMKLDNN bool + useTensorRT bool + useIROptim bool +} + +func NewPaddleModel(args map[string]interface{}) *PaddleModel { + return &PaddleModel{ + useGPU: getBool(args, "use_gpu", false), + deviceID: getInt(args, "gpu_id", 0), + initGPUMem: getInt(args, "gpu_mem", 1000), + numThreads: getInt(args, "num_cpu_threads", 6), + useMKLDNN: getBool(args, "enable_mkldnn", false), + useTensorRT: getBool(args, "use_tensorrt", false), + useIROptim: getBool(args, "ir_optim", true), + } +} + +func (model *PaddleModel) LoadModel(modelDir string) { + config := paddle.NewAnalysisConfig() + config.DisableGlogInfo() + + config.SetModel(modelDir+"/model", modelDir+"/params") + if model.useGPU { + config.EnableUseGpu(model.initGPUMem, model.deviceID) + } else { + config.DisableGpu() + config.SetCpuMathLibraryNumThreads(model.numThreads) + if model.useMKLDNN { + config.EnableMkldnn() + } + } + + // config.EnableMemoryOptim() + if model.useIROptim { + config.SwitchIrOptim(true) + } + + // false for zero copy tensor + config.SwitchUseFeedFetchOps(false) + config.SwitchSpecifyInputNames(true) + + model.predictor = paddle.NewPredictor(config) + model.input = model.predictor.GetInputTensors()[0] + model.outputs = model.predictor.GetOutputTensors() +} + +type OCRText struct { + BBox [][]int `json:"bbox"` + Text string `json:"text"` + Score float64 `json:"score"` +} + +type TextPredictSystem struct { + detector *DBDetector + cls *TextClassifier + rec *TextRecognizer +} + +func NewTextPredictSystem(args map[string]interface{}) *TextPredictSystem { + sys := &TextPredictSystem{ + detector: NewDBDetector(getString(args, "det_model_dir", ""), args), + rec: NewTextRecognizer(getString(args, "rec_model_dir", ""), args), + } + if getBool(args, "use_angle_cls", false) { + sys.cls = NewTextClassifier(getString(args, "cls_model_dir", ""), args) + } + return sys +} + +func (sys *TextPredictSystem) sortBoxes(boxes [][][]int) [][][]int { + sort.Slice(boxes, func(i, j int) bool { + if boxes[i][0][1] < boxes[j][0][1] { + return true + } + if boxes[i][0][1] > boxes[j][0][1] { + return false + } + return boxes[i][0][0] < boxes[j][0][0] + }) + + for i := 0; i < len(boxes)-1; i++ { + if math.Abs(float64(boxes[i+1][0][1]-boxes[i][0][1])) < 10 && boxes[i+1][0][0] < boxes[i][0][0] { + boxes[i], boxes[i+1] = boxes[i+1], boxes[i] + } + } + return boxes +} + +func (sys *TextPredictSystem) getRotateCropImage(img gocv.Mat, box [][]int) gocv.Mat { + cropW := int(math.Sqrt(math.Pow(float64(box[0][0]-box[1][0]), 2) + math.Pow(float64(box[0][1]-box[1][1]), 2))) + cropH := int(math.Sqrt(math.Pow(float64(box[0][0]-box[3][0]), 2) + math.Pow(float64(box[0][1]-box[3][1]), 2))) + ptsstd := make([]image.Point, 4) + ptsstd[0] = image.Pt(0, 0) + ptsstd[1] = image.Pt(cropW, 0) + ptsstd[2] = image.Pt(cropW, cropH) + ptsstd[3] = image.Pt(0, cropH) + + points := make([]image.Point, 4) + points[0] = image.Pt(box[0][0], box[0][1]) + points[1] = image.Pt(box[1][0], box[1][1]) + points[2] = image.Pt(box[2][0], box[2][1]) + points[3] = image.Pt(box[3][0], box[3][1]) + + M := gocv.GetPerspectiveTransform(points, ptsstd) + defer M.Close() + dstimg := gocv.NewMat() + gocv.WarpPerspectiveWithParams(img, &dstimg, M, image.Pt(cropW, cropH), + gocv.InterpolationCubic, gocv.BorderReplicate, color.RGBA{0, 0, 0, 0}) + + if float64(dstimg.Rows()) >= float64(dstimg.Cols())*1.5 { + srcCopy := gocv.NewMat() + gocv.Transpose(dstimg, &srcCopy) + defer dstimg.Close() + gocv.Flip(srcCopy, &srcCopy, 0) + return srcCopy + } + return dstimg +} + +func (sys *TextPredictSystem) Run(img gocv.Mat) []OCRText { + srcimg := gocv.NewMat() + defer srcimg.Close() + img.CopyTo(&srcimg) + boxes := sys.detector.Run(img) + if len(boxes) == 0 { + return nil + } + + boxes = sys.sortBoxes(boxes) + cropimages := make([]gocv.Mat, len(boxes)) + for i := 0; i < len(boxes); i++ { + tmpbox := make([][]int, len(boxes[i])) + for j := 0; j < len(tmpbox); j++ { + tmpbox[j] = make([]int, len(boxes[i][j])) + copy(tmpbox[j], boxes[i][j]) + } + cropimg := sys.getRotateCropImage(srcimg, tmpbox) + cropimages[i] = cropimg + } + if sys.cls != nil { + cropimages = sys.cls.Run(cropimages) + } + recResult := sys.rec.Run(cropimages, boxes) + return recResult +} + +type OCRSystem struct { + args map[string]interface{} + tps *TextPredictSystem +} + +func NewOCRSystem(confFile string, a map[string]interface{}) *OCRSystem { + args, err := ReadYaml(confFile) + if err != nil { + log.Printf("Read config file %v failed! Please check. err: %v\n", confFile, err) + log.Println("Program will use default config.") + args = defaultArgs + } + for k, v := range a { + args[k] = v + } + return &OCRSystem{ + args: args, + tps: NewTextPredictSystem(args), + } +} + +func (ocr *OCRSystem) StartServer(port string) { + http.HandleFunc("/ocr", ocr.predictHandler) + log.Println("OCR Server has been started on port :", port) + err := http.ListenAndServe(":"+port, nil) + if err != nil { + log.Panicf("http error! error: %v\n", err) + } +} + +func (ocr *OCRSystem) predictHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + w.Write([]byte(errors.New("post method only").Error())) + return + } + r.ParseMultipartForm(32 << 20) + var buf bytes.Buffer + file, header, err := r.FormFile("image") + if err != nil { + w.Write([]byte(err.Error())) + return + } + defer file.Close() + ext := strings.ToLower(path.Ext(header.Filename)) + if ext != ".jpg" && ext != ".png" { + w.Write([]byte(errors.New("only support image endswith jpg/png").Error())) + return + } + + io.Copy(&buf, file) + img, err2 := gocv.IMDecode(buf.Bytes(), gocv.IMReadColor) + defer img.Close() + if err2 != nil { + w.Write([]byte(err2.Error())) + return + } + result := ocr.PredictOneImage(img) + if output, err3 := json.Marshal(result); err3 != nil { + w.Write([]byte(err3.Error())) + } else { + w.Write(output) + } +} + +func (ocr *OCRSystem) PredictOneImage(img gocv.Mat) []OCRText { + return ocr.tps.Run(img) +} + +func (ocr *OCRSystem) PredictDirImages(dirname string) map[string][]OCRText { + if dirname == "" { + return nil + } + + imgs, _ := filepath.Glob(dirname + "/*.jpg") + tmpimgs, _ := filepath.Glob(dirname + "/*.png") + imgs = append(imgs, tmpimgs...) + results := make(map[string][]OCRText, len(imgs)) + for i := 0; i < len(imgs); i++ { + imgname := imgs[i] + img := ReadImage(imgname) + defer img.Close() + res := ocr.PredictOneImage(img) + results[imgname] = res + } + return results +} diff --git a/thirdparty/paddleocr-go/ocr/default_args.go b/thirdparty/paddleocr-go/ocr/default_args.go new file mode 100644 index 0000000000000000000000000000000000000000..5ccad4558975b907f71011bd58715c8ed06d0c05 --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/default_args.go @@ -0,0 +1,46 @@ +package ocr + +var ( + defaultArgs = map[string]interface{}{ + "use_gpu": true, + "ir_optim": true, + "enable_mkldnn": false, + "use_tensorrt": false, + "num_cpu_threads": 6, + "gpu_id": 0, + "gpu_mem": 2000, + + "det_algorithm": "DB", + "det_model_dir": "https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar", + "det_max_side_len": 960, + + "det_db_thresh": 0.3, + "det_db_box_thresh": 0.5, + "det_db_unclip_ratio": 2.0, + + "det_east_score_thresh": 0.8, + "det_east_cover_thresh": 0.1, + "det_east_nms_thresh": 0.2, + + "rec_algorithm": "CRNN", + "rec_model_dir": "https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar", + "rec_image_shape": []interface{}{3, 32, 320}, + "rec_char_type": "ch", + "rec_batch_num": 30, + "max_text_length": 25, + "rec_char_dict_path": "https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/develop/ppocr/utils/ppocr_keys_v1.txt", + "use_space_char": true, + + "use_angle_cls": false, + "cls_model_dir": "https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar", + "cls_image_shape": []interface{}{3, 48, 192}, + "label_list": []interface{}{"0", "180"}, + "cls_batch_num": 30, + "cls_thresh": 0.9, + + "lang": "ch", + "det": true, + "rec": true, + "cls": false, + } +) diff --git a/thirdparty/paddleocr-go/ocr/ocr_cls.go b/thirdparty/paddleocr-go/ocr/ocr_cls.go new file mode 100644 index 0000000000000000000000000000000000000000..24c9427bc1a7e19ffb2a50f9099c9d11dfef689b --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/ocr_cls.go @@ -0,0 +1,107 @@ +package ocr + +import ( + "log" + "os" + "time" + + "github.com/LKKlein/gocv" +) + +type TextClassifier struct { + *PaddleModel + batchNum int + thresh float64 + shape []int + labels []string +} + +type ClsResult struct { + Score float32 + Label int64 +} + +func NewTextClassifier(modelDir string, args map[string]interface{}) *TextClassifier { + shapes := []int{3, 48, 192} + if v, ok := args["cls_image_shape"]; ok { + for i, s := range v.([]interface{}) { + shapes[i] = s.(int) + } + } + cls := &TextClassifier{ + PaddleModel: NewPaddleModel(args), + batchNum: getInt(args, "cls_batch_num", 30), + thresh: getFloat64(args, "cls_thresh", 0.9), + shape: shapes, + } + if checkModelExists(modelDir) { + home, _ := os.UserHomeDir() + modelDir, _ = downloadModel(home+"/.paddleocr/cls", modelDir) + } else { + log.Panicf("cls model path: %v not exist! Please check!", modelDir) + } + cls.LoadModel(modelDir) + return cls +} + +func (cls *TextClassifier) Run(imgs []gocv.Mat) []gocv.Mat { + batch := cls.batchNum + var clsTime int64 = 0 + clsout := make([]ClsResult, len(imgs)) + srcimgs := make([]gocv.Mat, len(imgs)) + c, h, w := cls.shape[0], cls.shape[1], cls.shape[2] + for i := 0; i < len(imgs); i += batch { + j := i + batch + if len(imgs) < j { + j = len(imgs) + } + + normImgs := make([]float32, (j-i)*c*h*w) + for k := i; k < j; k++ { + tmp := gocv.NewMat() + imgs[k].CopyTo(&tmp) + srcimgs[k] = tmp + img := clsResize(imgs[k], cls.shape) + data := normPermute(img, []float32{0.5, 0.5, 0.5}, []float32{0.5, 0.5, 0.5}, 255.0) + copy(normImgs[(k-i)*c*h*w:], data) + } + + st := time.Now() + cls.input.SetValue(normImgs) + cls.input.Reshape([]int32{int32(j - i), int32(c), int32(h), int32(w)}) + + cls.predictor.SetZeroCopyInput(cls.input) + cls.predictor.ZeroCopyRun() + cls.predictor.GetZeroCopyOutput(cls.outputs[0]) + cls.predictor.GetZeroCopyOutput(cls.outputs[1]) + + var probout [][]float32 + var labelout []int64 + if len(cls.outputs[0].Shape()) == 2 { + probout = cls.outputs[0].Value().([][]float32) + } else { + labelout = cls.outputs[0].Value().([]int64) + } + + if len(cls.outputs[1].Shape()) == 2 { + probout = cls.outputs[1].Value().([][]float32) + } else { + labelout = cls.outputs[1].Value().([]int64) + } + clsTime += int64(time.Since(st).Milliseconds()) + + for no, label := range labelout { + score := probout[no][label] + clsout[i+no] = ClsResult{ + Score: score, + Label: label, + } + + if label%2 == 1 && float64(score) > cls.thresh { + gocv.Rotate(srcimgs[i+no], &srcimgs[i+no], gocv.Rotate180Clockwise) + } + } + } + log.Println("cls num: ", len(clsout), ", cls time elapse: ", clsTime, "ms") + return srcimgs +} diff --git a/thirdparty/paddleocr-go/ocr/ocr_det.go b/thirdparty/paddleocr-go/ocr/ocr_det.go new file mode 100644 index 0000000000000000000000000000000000000000..e6f6656104881054a9f4adc385b4cbca76d5a17e --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/ocr_det.go @@ -0,0 +1,54 @@ +package ocr + +import ( + "log" + "os" + "time" + + "github.com/LKKlein/gocv" +) + +type DBDetector struct { + *PaddleModel + preProcess DetPreProcess + postProcess DetPostProcess +} + +func NewDBDetector(modelDir string, args map[string]interface{}) *DBDetector { + maxSideLen := getInt(args, "det_max_side_len", 960) + thresh := getFloat64(args, "det_db_thresh", 0.3) + boxThresh := getFloat64(args, "det_db_box_thresh", 0.5) + unClipRatio := getFloat64(args, "det_db_unclip_ratio", 2.0) + + detector := &DBDetector{ + PaddleModel: NewPaddleModel(args), + preProcess: NewDBProcess(make([]int, 0), maxSideLen), + postProcess: NewDBPostProcess(thresh, boxThresh, unClipRatio), + } + if checkModelExists(modelDir) { + home, _ := os.UserHomeDir() + modelDir, _ = downloadModel(home+"/.paddleocr/det", modelDir) + } else { + log.Panicf("det model path: %v not exist! Please check!", modelDir) + } + detector.LoadModel(modelDir) + return detector +} + +func (det *DBDetector) Run(img gocv.Mat) [][][]int { + oriH := img.Rows() + oriW := img.Cols() + data, resizeH, resizeW := det.preProcess.Run(img) + st := time.Now() + det.input.SetValue(data) + det.input.Reshape([]int32{1, 3, int32(resizeH), int32(resizeW)}) + + det.predictor.SetZeroCopyInput(det.input) + det.predictor.ZeroCopyRun() + det.predictor.GetZeroCopyOutput(det.outputs[0]) + + ratioH, ratioW := float64(resizeH)/float64(oriH), float64(resizeW)/float64(oriW) + boxes := det.postProcess.Run(det.outputs[0], oriH, oriW, ratioH, ratioW) + log.Println("det_box num: ", len(boxes), ", time elapse: ", time.Since(st)) + return boxes +} diff --git a/thirdparty/paddleocr-go/ocr/ocr_rec.go b/thirdparty/paddleocr-go/ocr/ocr_rec.go new file mode 100644 index 0000000000000000000000000000000000000000..4a62cf077bc9f38db742e0cdafb536700eae605e --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/ocr_rec.go @@ -0,0 +1,131 @@ +package ocr + +import ( + "log" + "os" + "time" + + "github.com/LKKlein/gocv" +) + +type TextRecognizer struct { + *PaddleModel + batchNum int + textLen int + shape []int + charType string + labels []string +} + +func NewTextRecognizer(modelDir string, args map[string]interface{}) *TextRecognizer { + shapes := []int{3, 32, 320} + if v, ok := args["rec_image_shape"]; ok { + for i, s := range v.([]interface{}) { + shapes[i] = s.(int) + } + } + home, _ := os.UserHomeDir() + labelpath := getString(args, "rec_char_dict_path", home+"/.paddleocr/rec/ppocr_keys_v1.txt") + labels := readLines2StringSlice(labelpath) + if getBool(args, "use_space_char", true) { + labels = append(labels, " ") + } + rec := &TextRecognizer{ + PaddleModel: NewPaddleModel(args), + batchNum: getInt(args, "rec_batch_num", 30), + textLen: getInt(args, "max_text_length", 25), + charType: getString(args, "rec_char_type", "ch"), + shape: shapes, + labels: labels, + } + if checkModelExists(modelDir) { + modelDir, _ = downloadModel(home+"/.paddleocr/rec/ch", modelDir) + } else { + log.Panicf("rec model path: %v not exist! Please check!", modelDir) + } + rec.LoadModel(modelDir) + return rec +} + +func (rec *TextRecognizer) Run(imgs []gocv.Mat, bboxes [][][]int) []OCRText { + recResult := make([]OCRText, 0, len(imgs)) + batch := rec.batchNum + var recTime int64 = 0 + c, h, w := rec.shape[0], rec.shape[1], rec.shape[2] + for i := 0; i < len(imgs); i += batch { + j := i + batch + if len(imgs) < j { + j = len(imgs) + } + + maxwhratio := 0.0 + for k := i; k < j; k++ { + h, w := imgs[k].Rows(), imgs[k].Cols() + ratio := float64(w) / float64(h) + if ratio > maxwhratio { + maxwhratio = ratio + } + } + + if rec.charType == "ch" { + w = int(32 * maxwhratio) + } + normimgs := make([]float32, (j-i)*c*h*w) + + for k := i; k < j; k++ { + data := crnnPreprocess(imgs[k], rec.shape, []float32{0.5, 0.5, 0.5}, + []float32{0.5, 0.5, 0.5}, 255.0, maxwhratio, rec.charType) + defer imgs[k].Close() + copy(normimgs[(k-i)*c*h*w:], data) + } + + st := time.Now() + rec.input.SetValue(normimgs) + rec.input.Reshape([]int32{int32(j - i), int32(c), int32(h), int32(w)}) + + rec.predictor.SetZeroCopyInput(rec.input) + rec.predictor.ZeroCopyRun() + rec.predictor.GetZeroCopyOutput(rec.outputs[0]) + rec.predictor.GetZeroCopyOutput(rec.outputs[1]) + + recIdxBatch := rec.outputs[0].Value().([][]int64) + recIdxLod := rec.outputs[0].Lod() + + predictBatch := rec.outputs[1].Value().([][]float32) + predictLod := rec.outputs[1].Lod() + recTime += int64(time.Since(st).Milliseconds()) + + for rno := 0; rno < len(recIdxLod)-1; rno++ { + predIdx := make([]int, 0, 2) + for beg := recIdxLod[rno]; beg < recIdxLod[rno+1]; beg++ { + predIdx = append(predIdx, int(recIdxBatch[beg][0])) + } + if len(predIdx) == 0 { + continue + } + words := "" + for n := 0; n < len(predIdx); n++ { + words += rec.labels[predIdx[n]] + } + + score := 0.0 + count := 0 + blankPosition := int(rec.outputs[1].Shape()[1]) + for beg := predictLod[rno]; beg < predictLod[rno+1]; beg++ { + argMaxID, maxVal := argmax(predictBatch[beg]) + if blankPosition-1-argMaxID > 0 { + score += float64(maxVal) + count++ + } + } + score = score / float64(count) + recResult = append(recResult, OCRText{ + BBox: bboxes[i+rno], + Text: words, + Score: score, + }) + } + } + log.Println("rec num: ", len(recResult), ", rec time elapse: ", recTime, "ms") + return recResult +} diff --git a/thirdparty/paddleocr-go/ocr/postprocess.go b/thirdparty/paddleocr-go/ocr/postprocess.go new file mode 100644 index 0000000000000000000000000000000000000000..88bd6887a656f3fe4f1a112891f24dc575793b40 --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/postprocess.go @@ -0,0 +1,265 @@ +package ocr + +import ( + "image" + "image/color" + "math" + "sort" + + "github.com/LKKlein/gocv" + "github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go/paddle" + clipper "github.com/ctessum/go.clipper" +) + +type xFloatSortBy [][]float32 + +func (a xFloatSortBy) Len() int { return len(a) } +func (a xFloatSortBy) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a xFloatSortBy) Less(i, j int) bool { return a[i][0] < a[j][0] } + +type xIntSortBy [][]int + +func (a xIntSortBy) Len() int { return len(a) } +func (a xIntSortBy) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a xIntSortBy) Less(i, j int) bool { return a[i][0] < a[j][0] } + +type DetPostProcess interface { + Run(output *paddle.ZeroCopyTensor, oriH, oriW int, ratioH, ratioW float64) [][][]int +} + +type DBPostProcess struct { + thresh float64 + boxThresh float64 + maxCandidates int + unClipRatio float64 + minSize int +} + +func NewDBPostProcess(thresh, boxThresh, unClipRatio float64) *DBPostProcess { + return &DBPostProcess{ + thresh: thresh, + boxThresh: boxThresh, + unClipRatio: unClipRatio, + maxCandidates: 1000, + minSize: 3, + } +} + +func (d *DBPostProcess) getMinBoxes(rect gocv.RotatedRect) [][]float32 { + points := gocv.NewMat() + gocv.BoxPoints(rect, &points) + defer points.Close() + array := d.mat2slice(points) + sort.Sort(xFloatSortBy(array)) + + point1, point2, point3, point4 := array[0], array[1], array[2], array[3] + if array[3][1] <= array[2][1] { + point2, point3 = array[3], array[2] + } else { + point2, point3 = array[2], array[3] + } + + if array[1][1] <= array[0][1] { + point1, point4 = array[1], array[0] + } else { + point1, point4 = array[0], array[1] + } + + array = [][]float32{point1, point2, point3, point4} + return array +} + +func (d *DBPostProcess) mat2slice(mat gocv.Mat) [][]float32 { + array := make([][]float32, mat.Rows()) + for i := 0; i < mat.Rows(); i++ { + tmp := make([]float32, mat.Cols()) + for j := 0; j < mat.Cols(); j++ { + tmp[j] = mat.GetFloatAt(i, j) + } + array[i] = tmp + } + return array +} + +func (d *DBPostProcess) boxScoreFast(array [][]float32, pred gocv.Mat) float64 { + height, width := pred.Rows(), pred.Cols() + boxX := []float32{array[0][0], array[1][0], array[2][0], array[3][0]} + boxY := []float32{array[0][1], array[1][1], array[2][1], array[3][1]} + + xmin := clip(int(math.Floor(float64(minf(boxX)))), 0, width-1) + xmax := clip(int(math.Ceil(float64(maxf(boxX)))), 0, width-1) + ymin := clip(int(math.Floor(float64(minf(boxY)))), 0, height-1) + ymax := clip(int(math.Ceil(float64(maxf(boxY)))), 0, height-1) + + mask := gocv.NewMatWithSize(ymax-ymin+1, xmax-xmin+1, gocv.MatTypeCV8UC1) + defer mask.Close() + ppt := make([][]image.Point, 1) + ppt[0] = make([]image.Point, 4) + ppt[0][0] = image.Point{int(array[0][0]) - xmin, int(array[0][1]) - ymin} + ppt[0][1] = image.Point{int(array[1][0]) - xmin, int(array[1][1]) - ymin} + ppt[0][2] = image.Point{int(array[2][0]) - xmin, int(array[2][1]) - ymin} + ppt[0][3] = image.Point{int(array[3][0]) - xmin, int(array[3][1]) - ymin} + gocv.FillPoly(&mask, ppt, color.RGBA{0, 0, 1, 0}) + croppedImg := pred.Region(image.Rect(xmin, ymin, xmax+1, ymax+1)) + s := croppedImg.MeanWithMask(mask) + return s.Val1 +} + +func (d *DBPostProcess) unClip(box [][]float32) gocv.RotatedRect { + var area, dist float64 + for i := 0; i < 4; i++ { + area += float64(box[i][0]*box[(i+1)%4][1] - box[i][1]*box[(i+1)%4][0]) + dist += math.Sqrt(float64( + (box[i][0]-box[(i+1)%4][0])*(box[i][0]-box[(i+1)%4][0]) + + (box[i][1]-box[(i+1)%4][1])*(box[i][1]-box[(i+1)%4][1]), + )) + } + area = math.Abs(area / 2.0) + distance := area * d.unClipRatio / dist + offset := clipper.NewClipperOffset() + path := make([]*clipper.IntPoint, 4) + path[0] = &clipper.IntPoint{X: clipper.CInt(box[0][0]), Y: clipper.CInt(box[0][1])} + path[1] = &clipper.IntPoint{X: clipper.CInt(box[1][0]), Y: clipper.CInt(box[1][1])} + path[2] = &clipper.IntPoint{X: clipper.CInt(box[2][0]), Y: clipper.CInt(box[2][1])} + path[3] = &clipper.IntPoint{X: clipper.CInt(box[3][0]), Y: clipper.CInt(box[3][1])} + offset.AddPath(clipper.Path(path), clipper.JtRound, clipper.EtClosedPolygon) + soln := offset.Execute(distance) + + points := make([]image.Point, 0, 4) + for i := 0; i < len(soln); i++ { + for j := 0; j < len(soln[i]); j++ { + points = append(points, image.Point{int(soln[i][j].X), int(soln[i][j].Y)}) + } + } + + var res gocv.RotatedRect + if len(points) <= 0 { + points = make([]image.Point, 4) + points[0] = image.Pt(0, 0) + points[1] = image.Pt(1, 0) + points[2] = image.Pt(1, 1) + points[3] = image.Pt(0, 1) + res = gocv.RotatedRect{ + Contour: points, + BoundingRect: image.Rect(0, 0, 1, 1), + Center: gocv.Point2f{X: 0.5, Y: 0.5}, + Width: 1, + Height: 1, + Angle: 0, + } + } else { + res = gocv.MinAreaRect(points) + } + return res +} + +func (d *DBPostProcess) boxesFromBitmap(pred gocv.Mat, mask gocv.Mat, ratioH float64, ratioW float64) [][][]int { + height, width := mask.Rows(), mask.Cols() + mask.MultiplyUChar(255) + contours := gocv.FindContours(mask, gocv.RetrievalList, gocv.ChainApproxSimple) + numContours := len(contours) + if numContours > d.maxCandidates { + numContours = d.maxCandidates + } + + boxes := make([][][]int, 0, numContours) + for i := 0; i < numContours; i++ { + contour := contours[i] + boundingbox := gocv.MinAreaRect(contour) + if boundingbox.Width < float32(d.minSize) || boundingbox.Height < float32(d.minSize) { + continue + } + points := d.getMinBoxes(boundingbox) + score := d.boxScoreFast(points, pred) + if score < d.boxThresh { + continue + } + + box := d.unClip(points) + if box.Width < float32(d.minSize+2) || box.Height < float32(d.minSize+2) { + continue + } + + cliparray := d.getMinBoxes(box) + dstHeight, dstWidth := pred.Rows(), pred.Cols() + intcliparray := make([][]int, 4) + for i := 0; i < 4; i++ { + p := []int{ + int(float64(clip(int(math.Round( + float64(cliparray[i][0]/float32(width)*float32(dstWidth)))), 0, dstWidth)) / ratioW), + int(float64(clip(int(math.Round( + float64(cliparray[i][1]/float32(height)*float32(dstHeight)))), 0, dstHeight)) / ratioH), + } + intcliparray[i] = p + } + boxes = append(boxes, intcliparray) + } + return boxes +} + +func (d *DBPostProcess) orderPointsClockwise(box [][]int) [][]int { + sort.Sort(xIntSortBy(box)) + leftmost := [][]int{box[0], box[1]} + rightmost := [][]int{box[2], box[3]} + + if leftmost[0][1] > leftmost[1][1] { + leftmost[0], leftmost[1] = leftmost[1], leftmost[0] + } + + if rightmost[0][1] > rightmost[1][1] { + rightmost[0], rightmost[1] = rightmost[1], rightmost[0] + } + + return [][]int{leftmost[0], rightmost[0], rightmost[1], leftmost[1]} +} + +func (d *DBPostProcess) filterTagDetRes(boxes [][][]int, oriH, oriW int) [][][]int { + points := make([][][]int, 0, len(boxes)) + for i := 0; i < len(boxes); i++ { + boxes[i] = d.orderPointsClockwise(boxes[i]) + for j := 0; j < len(boxes[i]); j++ { + boxes[i][j][0] = clip(boxes[i][j][0], 0, oriW-1) + boxes[i][j][1] = clip(boxes[i][j][1], 0, oriH-1) + } + } + + for i := 0; i < len(boxes); i++ { + rectW := int(math.Sqrt(math.Pow(float64(boxes[i][0][0]-boxes[i][1][0]), 2.0) + + math.Pow(float64(boxes[i][0][1]-boxes[i][1][1]), 2.0))) + rectH := int(math.Sqrt(math.Pow(float64(boxes[i][0][0]-boxes[i][3][0]), 2.0) + + math.Pow(float64(boxes[i][0][1]-boxes[i][3][1]), 2.0))) + if rectW <= 4 || rectH <= 4 { + continue + } + points = append(points, boxes[i]) + } + return points +} + +func (d *DBPostProcess) Run(output *paddle.ZeroCopyTensor, oriH, oriW int, ratioH, ratioW float64) [][][]int { + v := output.Value().([][][][]float32) + + shape := output.Shape() + height, width := int(shape[2]), int(shape[3]) + + pred := gocv.NewMatWithSize(height, width, gocv.MatTypeCV32F) + bitmap := gocv.NewMatWithSize(height, width, gocv.MatTypeCV8UC1) + thresh := float32(d.thresh) + for i := 0; i < height; i++ { + for j := 0; j < width; j++ { + pred.SetFloatAt(i, j, v[0][0][i][j]) + if v[0][0][i][j] > thresh { + bitmap.SetUCharAt(i, j, 1) + } else { + bitmap.SetUCharAt(i, j, 0) + } + } + } + + mask := gocv.NewMat() + kernel := gocv.GetStructuringElement(gocv.MorphRect, image.Point{2, 2}) + gocv.Dilate(bitmap, &mask, kernel) + boxes := d.boxesFromBitmap(pred, mask, ratioH, ratioW) + dtboxes := d.filterTagDetRes(boxes, oriH, oriW) + return dtboxes +} diff --git a/thirdparty/paddleocr-go/ocr/preprocess.go b/thirdparty/paddleocr-go/ocr/preprocess.go new file mode 100644 index 0000000000000000000000000000000000000000..19b335b5aa4205ad27c71673543076c652abde20 --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/preprocess.go @@ -0,0 +1,169 @@ +package ocr + +import ( + "image" + "image/color" + "math" + + "github.com/LKKlein/gocv" +) + +func resizeByShape(img gocv.Mat, resizeShape []int) (gocv.Mat, int, int) { + resizeH := resizeShape[0] + resizeW := resizeShape[1] + gocv.Resize(img, &img, image.Pt(resizeW, resizeH), 0, 0, gocv.InterpolationLinear) + return img, resizeH, resizeW +} + +func resizeByMaxLen(img gocv.Mat, maxLen int) (gocv.Mat, int, int) { + oriH := img.Rows() + oriW := img.Cols() + var resizeH, resizeW int = oriH, oriW + + var ratio float64 = 1.0 + if resizeH > maxLen || resizeW > maxLen { + if resizeH > resizeW { + ratio = float64(maxLen) / float64(resizeH) + } else { + ratio = float64(maxLen) / float64(resizeW) + } + } + + resizeH = int(float64(resizeH) * ratio) + resizeW = int(float64(resizeW) * ratio) + + if resizeH%32 == 0 { + resizeH = resizeH + } else if resizeH/32 <= 1 { + resizeH = 32 + } else { + resizeH = (resizeH/32 - 1) * 32 + } + + if resizeW%32 == 0 { + resizeW = resizeW + } else if resizeW/32 <= 1 { + resizeW = 32 + } else { + resizeW = (resizeW/32 - 1) * 32 + } + + if resizeW <= 0 || resizeH <= 0 { + return gocv.NewMat(), 0, 0 + } + + gocv.Resize(img, &img, image.Pt(resizeW, resizeH), 0, 0, gocv.InterpolationLinear) + return img, resizeH, resizeW +} + +func normPermute(img gocv.Mat, mean []float32, std []float32, scaleFactor float32) []float32 { + img.ConvertTo(&img, gocv.MatTypeCV32F) + img.DivideFloat(scaleFactor) + + c := gocv.Split(img) + data := make([]float32, img.Rows()*img.Cols()*img.Channels()) + for i := 0; i < 3; i++ { + c[i].SubtractFloat(mean[i]) + c[i].DivideFloat(std[i]) + defer c[i].Close() + x, _ := c[i].DataPtrFloat32() + copy(data[i*img.Rows()*img.Cols():], x) + } + return data +} + +type DetPreProcess interface { + Run(gocv.Mat) ([]float32, int, int) +} + +type DBPreProcess struct { + resizeType int + imageShape []int + maxSideLen int + mean []float32 + std []float32 + scaleFactor float32 +} + +func NewDBProcess(shape []int, sideLen int) *DBPreProcess { + db := &DBPreProcess{ + resizeType: 0, + imageShape: shape, + maxSideLen: sideLen, + mean: []float32{0.485, 0.456, 0.406}, + std: []float32{0.229, 0.224, 0.225}, + scaleFactor: 255.0, + } + if len(shape) > 0 { + db.resizeType = 1 + } + if sideLen == 0 { + db.maxSideLen = 2400 + } + return db +} + +func (d *DBPreProcess) Run(img gocv.Mat) ([]float32, int, int) { + var resizeH, resizeW int + if d.resizeType == 0 { + img, resizeH, resizeW = resizeByMaxLen(img, d.maxSideLen) + } else { + img, resizeH, resizeW = resizeByShape(img, d.imageShape) + } + + im := normPermute(img, d.mean, d.std, d.scaleFactor) + return im, resizeH, resizeW +} + +func clsResize(img gocv.Mat, resizeShape []int) gocv.Mat { + imgH, imgW := resizeShape[1], resizeShape[2] + h, w := img.Rows(), img.Cols() + ratio := float64(w) / float64(h) + var resizeW int + if math.Ceil(float64(imgH)*ratio) > float64(imgW) { + resizeW = imgW + } else { + resizeW = int(math.Ceil(float64(imgH) * ratio)) + } + gocv.Resize(img, &img, image.Pt(resizeW, imgH), 0, 0, gocv.InterpolationLinear) + if resizeW < imgW { + gocv.CopyMakeBorder(img, &img, 0, 0, 0, imgW-resizeW, gocv.BorderConstant, color.RGBA{0, 0, 0, 0}) + } + return img +} + +func crnnPreprocess(img gocv.Mat, resizeShape []int, mean []float32, std []float32, + scaleFactor float32, whRatio float64, charType string) []float32 { + imgH := resizeShape[1] + imgW := resizeShape[2] + if charType == "ch" { + imgW = int(32 * whRatio) + } + h, w := img.Rows(), img.Cols() + ratio := float64(w) / float64(h) + var resizeW int + if math.Ceil(float64(imgH)*ratio) > float64(imgW) { + resizeW = imgW + } else { + resizeW = int(math.Ceil(float64(imgH) * ratio)) + } + gocv.Resize(img, &img, image.Pt(resizeW, imgH), 0, 0, gocv.InterpolationLinear) + + img.ConvertTo(&img, gocv.MatTypeCV32F) + img.DivideFloat(scaleFactor) + img.SubtractScalar(gocv.NewScalar(float64(mean[0]), float64(mean[1]), float64(mean[2]), 0)) + img.DivideScalar(gocv.NewScalar(float64(std[0]), float64(std[1]), float64(std[2]), 0)) + + if resizeW < imgW { + gocv.CopyMakeBorder(img, &img, 0, 0, 0, imgW-resizeW, gocv.BorderConstant, color.RGBA{0, 0, 0, 0}) + } + + c := gocv.Split(img) + data := make([]float32, img.Rows()*img.Cols()*img.Channels()) + for i := 0; i < 3; i++ { + defer c[i].Close() + x, _ := c[i].DataPtrFloat32() + copy(data[i*img.Rows()*img.Cols():], x) + } + return data +} diff --git a/thirdparty/paddleocr-go/ocr/utils.go b/thirdparty/paddleocr-go/ocr/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..4bf8106e40f8b2046b2aaa6bee2735c6d0d7a2f3 --- /dev/null +++ b/thirdparty/paddleocr-go/ocr/utils.go @@ -0,0 +1,281 @@ +package ocr + +import ( + "archive/tar" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "path/filepath" + "strings" + + "github.com/LKKlein/gocv" + "gopkg.in/yaml.v3" +) + +func getString(args map[string]interface{}, key string, dv string) string { + if f, ok := args[key]; ok { + return f.(string) + } + return dv +} + +func getFloat64(args map[string]interface{}, key string, dv float64) float64 { + if f, ok := args[key]; ok { + return f.(float64) + } + return dv +} + +func getInt(args map[string]interface{}, key string, dv int) int { + if i, ok := args[key]; ok { + return i.(int) + } + return dv +} + +func getBool(args map[string]interface{}, key string, dv bool) bool { + if b, ok := args[key]; ok { + return b.(bool) + } + return dv +} + +func ReadImage(image_path string) gocv.Mat { + img := gocv.IMRead(image_path, gocv.IMReadColor) + if img.Empty() { + log.Printf("Could not read image %s\n", image_path) + os.Exit(1) + } + return img +} + +func clip(value, min, max int) int { + if value <= min { + return min + } else if value >= max { + return max + } + return value +} + +func minf(data []float32) float32 { + v := data[0] + for _, val := range data { + if val < v { + v = val + } + } + return v +} + +func maxf(data []float32) float32 { + v := data[0] + for _, val := range data { + if val > v { + v = val + } + } + return v +} + +func mini(data []int) int { + v := data[0] + for _, val := range data { + if val < v { + v = val + } + } + return v +} + +func maxi(data []int) int { + v := data[0] + for _, val := range data { + if val > v { + v = val + } + } + return v +} + +func argmax(arr []float32) (int, float32) { + max_value, index := arr[0], 0 + for i, item := range arr { + if item > max_value { + max_value = item + index = i + } + } + return index, max_value +} + +func checkModelExists(modelPath string) bool { + if isPathExist(modelPath+"/model") && isPathExist(modelPath+"/params") { + return true + } + if strings.HasPrefix(modelPath, "http://") || + strings.HasPrefix(modelPath, "ftp://") || strings.HasPrefix(modelPath, "https://") { + return true + } + return false +} + +func downloadFile(filepath, url string) error { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + out, err := os.Create(filepath) + if err != nil { + return err + } + defer out.Close() + + _, err = io.Copy(out, resp.Body) + log.Println("[download_file] from:", url, " to:", filepath) + return err +} + +func isPathExist(path string) bool { + if _, err := os.Stat(path); err == nil { + return true + } else if os.IsNotExist(err) { + return false + } + return false +} + +func downloadModel(modelDir, modelPath string) (string, error) { + if modelPath != "" && (strings.HasPrefix(modelPath, "http://") || + strings.HasPrefix(modelPath, "ftp://") || strings.HasPrefix(modelPath, "https://")) { + if checkModelExists(modelDir) { + return modelDir, nil + } + _, suffix := path.Split(modelPath) + outPath := filepath.Join(modelDir, suffix) + outDir := filepath.Dir(outPath) + if !isPathExist(outDir) { + os.MkdirAll(outDir, os.ModePerm) + } + + if !isPathExist(outPath) { + err := downloadFile(outPath, modelPath) + if err != nil { + return "", err + } + } + + if strings.HasSuffix(outPath, ".tar") && !checkModelExists(modelDir) { + unTar(modelDir, outPath) + os.Remove(outPath) + return modelDir, nil + } + return modelDir, nil + } + return modelPath, nil +} + +func unTar(dst, src string) (err error) { + fr, err := os.Open(src) + if err != nil { + return err + } + defer fr.Close() + + tr := tar.NewReader(fr) + for { + hdr, err := tr.Next() + + switch { + case err == io.EOF: + return nil + case err != nil: + return err + case hdr == nil: + continue + } + + var dstFileDir string + if strings.Contains(hdr.Name, "model") { + dstFileDir = filepath.Join(dst, "model") + } else if strings.Contains(hdr.Name, "params") { + dstFileDir = filepath.Join(dst, "params") + } + + switch hdr.Typeflag { + case tar.TypeDir: + continue + case tar.TypeReg: + file, err := os.OpenFile(dstFileDir, os.O_CREATE|os.O_RDWR, os.FileMode(hdr.Mode)) + if err != nil { + return err + } + _, err2 := io.Copy(file, tr) + if err2 != nil { + return err2 + } + file.Close() + } + } + + return nil +} + +func readLines2StringSlice(filepath string) []string { + if strings.HasPrefix(filepath, "http://") || strings.HasPrefix(filepath, "https://") { + home, _ := os.UserHomeDir() + dir := home + "/.paddleocr/rec/" + _, suffix := path.Split(filepath) + f := dir + suffix + if !isPathExist(f) { + err := downloadFile(f, filepath) + if err != nil { + log.Println("download ppocr key file error! You can specify your local dict path by conf.yaml.") + return nil + } + } + filepath = f + } + content, err := ioutil.ReadFile(filepath) + if err != nil { + log.Println("read ppocr key file error!") + return nil + } + lines := strings.Split(string(content), "\n") + return lines +} + +func ReadYaml(yamlPath string) (map[string]interface{}, error) { + data, err := ioutil.ReadFile(yamlPath) + if err != nil { + return nil, err + } + var body interface{} + if err := yaml.Unmarshal(data, &body); err != nil { + return nil, err + } + + body = convertYaml2Map(body) + return body.(map[string]interface{}), nil +} + +func convertYaml2Map(i interface{}) interface{} { + switch x := i.(type) { + case map[interface{}]interface{}: + m2 := map[string]interface{}{} + for k, v := range x { + m2[k.(string)] = convertYaml2Map(v) + } + return m2 + case []interface{}: + for i, v := range x { + x[i] = convertYaml2Map(v) + } + } + return i +} diff --git a/thirdparty/paddleocr-go/paddle/common.go b/thirdparty/paddleocr-go/paddle/common.go new file mode 100644 index 0000000000000000000000000000000000000000..28aaeeed571bb4efe6ec0ad64c62197b72962204 --- /dev/null +++ b/thirdparty/paddleocr-go/paddle/common.go @@ -0,0 +1,27 @@ +package paddle + +// #cgo CFLAGS: -I../paddle_c/include +// #cgo LDFLAGS: -lpaddle_fluid_c +// #include +import "C" +import "fmt" + +func ConvertCBooleanToGo(b C.bool) bool { + var c_false C.bool + if b != c_false { + return true + } + return false +} + +func numel(shape []int32) int32 { + n := int32(1) + for _, d := range shape { + n *= d + } + return n +} + +func bug(format string, args ...interface{}) error { + return fmt.Errorf("Bug %v", fmt.Sprintf(format, args...)) +} diff --git a/thirdparty/paddleocr-go/paddle/config.go b/thirdparty/paddleocr-go/paddle/config.go new file mode 100644 index 0000000000000000000000000000000000000000..70f6d33b9092693ce9d8c087ff1f2467d5316be1 --- /dev/null +++ b/thirdparty/paddleocr-go/paddle/config.go @@ -0,0 +1,181 @@ +package paddle + +// #include +// #include +// #include +import "C" + +import ( + "runtime" + "unsafe" +) + +type Precision C.Precision + +const ( + Precision_FLOAT32 Precision = C.kFloat32 + Precision_INT8 Precision = C.kInt8 + Precision_HALF Precision = C.kHalf +) + +type AnalysisConfig struct { + c *C.PD_AnalysisConfig +} + +func NewAnalysisConfig() *AnalysisConfig { + c_config := C.PD_NewAnalysisConfig() + config := &AnalysisConfig{c: c_config} + runtime.SetFinalizer(config, (*AnalysisConfig).finalize) + return config +} + +func (config *AnalysisConfig) finalize() { + C.PD_DeleteAnalysisConfig(config.c) +} + +func (config *AnalysisConfig) SetModel(model, params string) { + c_model := C.CString(model) + defer C.free(unsafe.Pointer(c_model)) + var c_params *C.char + if params == "" { + c_params = nil + } else { + c_params = C.CString(params) + defer C.free(unsafe.Pointer(c_params)) + } + + C.PD_SetModel(config.c, c_model, c_params) +} + +func (config *AnalysisConfig) ModelDir() string { + return C.GoString(C.PD_ModelDir(config.c)) +} + +func (config *AnalysisConfig) ProgFile() string { + return C.GoString(C.PD_ProgFile(config.c)) +} + +func (config *AnalysisConfig) ParamsFile() string { + return C.GoString(C.PD_ParamsFile(config.c)) +} + +func (config *AnalysisConfig) EnableUseGpu(memory_pool_init_size_mb int, device_id int) { + C.PD_EnableUseGpu(config.c, C.int(memory_pool_init_size_mb), C.int(device_id)) +} + +func (config *AnalysisConfig) DisableGpu() { + C.PD_DisableGpu(config.c) +} + +func (config *AnalysisConfig) UseGpu() bool { + return ConvertCBooleanToGo(C.PD_UseGpu(config.c)) +} + +func (config *AnalysisConfig) GpuDeviceId() int { + return int(C.PD_GpuDeviceId(config.c)) +} + +func (config *AnalysisConfig) MemoryPoolInitSizeMb() int { + return int(C.PD_MemoryPoolInitSizeMb(config.c)) +} + +func (config *AnalysisConfig) EnableCudnn() { + C.PD_EnableCUDNN(config.c) +} + +func (config *AnalysisConfig) CudnnEnabled() bool { + return ConvertCBooleanToGo(C.PD_CudnnEnabled(config.c)) +} + +func (config *AnalysisConfig) SwitchIrOptim(x bool) { + C.PD_SwitchIrOptim(config.c, C.bool(x)) +} + +func (config *AnalysisConfig) IrOptim() bool { + return ConvertCBooleanToGo(C.PD_IrOptim(config.c)) +} + +func (config *AnalysisConfig) SwitchUseFeedFetchOps(x bool) { + C.PD_SwitchUseFeedFetchOps(config.c, C.bool(x)) +} + +func (config *AnalysisConfig) UseFeedFetchOpsEnabled() bool { + return ConvertCBooleanToGo(C.PD_UseFeedFetchOpsEnabled(config.c)) +} + +func (config *AnalysisConfig) SwitchSpecifyInputNames(x bool) { + C.PD_SwitchSpecifyInputNames(config.c, C.bool(x)) +} + +func (config *AnalysisConfig) SpecifyInputName() bool { + return ConvertCBooleanToGo(C.PD_SpecifyInputName(config.c)) +} + +func (config *AnalysisConfig) EnableTensorRtEngine(workspace_size int, max_batch_size int, min_subgraph_size int, precision Precision, use_static bool, use_calib_mode bool) { + C.PD_EnableTensorRtEngine(config.c, C.int(workspace_size), C.int(max_batch_size), C.int(min_subgraph_size), C.Precision(precision), C.bool(use_static), C.bool(use_calib_mode)) +} + +func (config *AnalysisConfig) TensorrtEngineEnabled() bool { + return ConvertCBooleanToGo(C.PD_TensorrtEngineEnabled(config.c)) +} + +func (config *AnalysisConfig) SwitchIrDebug(x bool) { + C.PD_SwitchIrDebug(config.c, C.bool(x)) +} + +func (config *AnalysisConfig) EnableMkldnn() { + C.PD_EnableMKLDNN(config.c) +} + +func (config *AnalysisConfig) SetCpuMathLibraryNumThreads(n int) { + C.PD_SetCpuMathLibraryNumThreads(config.c, C.int(n)) +} + +func (config *AnalysisConfig) CpuMathLibraryNumThreads() int { + return int(C.PD_CpuMathLibraryNumThreads(config.c)) +} + +func (config *AnalysisConfig) EnableMkldnnQuantizer() { + C.PD_EnableMkldnnQuantizer(config.c) +} + +func (config *AnalysisConfig) MkldnnQuantizerEnabled() bool { + return ConvertCBooleanToGo(C.PD_MkldnnQuantizerEnabled(config.c)) +} + +// SetModelBuffer +// ModelFromMemory + +func (config *AnalysisConfig) EnableMemoryOptim() { + C.PD_EnableMemoryOptim(config.c) +} + +func (config *AnalysisConfig) MemoryOptimEnabled() bool { + return ConvertCBooleanToGo(C.PD_MemoryOptimEnabled(config.c)) +} + +func (config *AnalysisConfig) EnableProfile() { + C.PD_EnableProfile(config.c) +} + +func (config *AnalysisConfig) ProfileEnabled() bool { + return ConvertCBooleanToGo(C.PD_ProfileEnabled(config.c)) +} + +func (config *AnalysisConfig) DisableGlogInfo() { + C.PD_DisableGlogInfo(config.c) +} + +func (config *AnalysisConfig) DeletePass(pass string) { + c_pass := C.CString(pass) + defer C.free(unsafe.Pointer(c_pass)) + C.PD_DeletePass(config.c, c_pass) +} + +func (config *AnalysisConfig) SetInValid() { + C.PD_SetInValid(config.c) +} + +func (config *AnalysisConfig) IsValid() bool { + return ConvertCBooleanToGo(C.PD_IsValid(config.c)) +} diff --git a/thirdparty/paddleocr-go/paddle/predictor.go b/thirdparty/paddleocr-go/paddle/predictor.go new file mode 100644 index 0000000000000000000000000000000000000000..9a69c9ee477ad09c202616cdf1f008df66568365 --- /dev/null +++ b/thirdparty/paddleocr-go/paddle/predictor.go @@ -0,0 +1,101 @@ +package paddle + +// #include +// #include "paddle_c_api.h" +import "C" + +import ( + "reflect" + "runtime" + "unsafe" +) + +type Predictor struct { + c *C.PD_Predictor +} + +func NewPredictor(config *AnalysisConfig) *Predictor { + c_predictor := C.PD_NewPredictor((*config).c) + predictor := &Predictor{c: c_predictor} + runtime.SetFinalizer(predictor, (*Predictor).finalize) + return predictor +} + +func (predictor *Predictor) finalize() { + C.PD_DeletePredictor(predictor.c) +} + +func DeletePredictor(predictor *Predictor) { + C.PD_DeletePredictor(predictor.c) +} + +func (predictor *Predictor) GetInputNum() int { + return int(C.PD_GetInputNum(predictor.c)) +} + +func (predictor *Predictor) GetOutputNum() int { + return int(C.PD_GetOutputNum(predictor.c)) +} + +func (predictor *Predictor) GetInputName(n int) string { + return C.GoString(C.PD_GetInputName(predictor.c, C.int(n))) +} + +func (predictor *Predictor) GetOutputName(n int) string { + return C.GoString(C.PD_GetOutputName(predictor.c, C.int(n))) +} + +func (predictor *Predictor) GetInputTensors() [](*ZeroCopyTensor) { + var result [](*ZeroCopyTensor) + for i := 0; i < predictor.GetInputNum(); i++ { + tensor := NewZeroCopyTensor() + tensor.c.name = C.PD_GetInputName(predictor.c, C.int(i)) + result = append(result, tensor) + } + return result +} + +func (predictor *Predictor) GetOutputTensors() [](*ZeroCopyTensor) { + var result [](*ZeroCopyTensor) + for i := 0; i < predictor.GetOutputNum(); i++ { + tensor := NewZeroCopyTensor() + tensor.c.name = C.PD_GetOutputName(predictor.c, C.int(i)) + result = append(result, tensor) + } + return result +} + +func (predictor *Predictor) GetInputNames() []string { + names := make([]string, predictor.GetInputNum()) + for i := 0; i < len(names); i++ { + names[i] = predictor.GetInputName(i) + } + return names +} + +func (predictor *Predictor) GetOutputNames() []string { + names := make([]string, predictor.GetOutputNum()) + for i := 0; i < len(names); i++ { + names[i] = predictor.GetOutputName(i) + } + return names +} + +func (predictor *Predictor) SetZeroCopyInput(tensor *ZeroCopyTensor) { + C.PD_SetZeroCopyInput(predictor.c, tensor.c) +} + +func (predictor *Predictor) GetZeroCopyOutput(tensor *ZeroCopyTensor) { + C.PD_GetZeroCopyOutput(predictor.c, tensor.c) + tensor.name = C.GoString(tensor.c.name) + var shape []int32 + shape_hdr := (*reflect.SliceHeader)(unsafe.Pointer(&shape)) + shape_hdr.Data = uintptr(unsafe.Pointer(tensor.c.shape.data)) + shape_hdr.Len = int(tensor.c.shape.length / C.sizeof_int) + shape_hdr.Cap = int(tensor.c.shape.length / C.sizeof_int) + tensor.Reshape(shape) +} + +func (predictor *Predictor) ZeroCopyRun() { + C.PD_ZeroCopyRun(predictor.c) +} diff --git a/thirdparty/paddleocr-go/paddle/tensor.go b/thirdparty/paddleocr-go/paddle/tensor.go new file mode 100644 index 0000000000000000000000000000000000000000..9de388436dd1909fab9fc53c3b0909ef217d994d --- /dev/null +++ b/thirdparty/paddleocr-go/paddle/tensor.go @@ -0,0 +1,250 @@ +package paddle + +// #include +// #include +// #include +// #include +import "C" + +import ( + "reflect" + "runtime" + "unsafe" +) + +type PaddleDType C.PD_DataType + +const ( + FLOAT32 PaddleDType = C.PD_FLOAT32 + INT32 PaddleDType = C.PD_INT32 + INT64 PaddleDType = C.PD_INT64 + UINT8 PaddleDType = C.PD_UINT8 + UNKDTYPE PaddleDType = C.PD_UNKDTYPE +) + +var types = []struct { + gotype reflect.Type + dtype PaddleDType +}{ + {reflect.TypeOf(float32(0)), FLOAT32}, + {reflect.TypeOf(int32(0)), INT32}, + {reflect.TypeOf(int64(0)), INT64}, + {reflect.TypeOf(uint8(0)), UINT8}, +} + +func typeOfDataType(dtype PaddleDType) reflect.Type { + var ret reflect.Type + for _, t := range types { + if t.dtype == dtype { + ret = t.gotype + } + } + return ret +} + +func sizeofDataType(dtype PaddleDType) int32 { + switch dtype { + case UINT8: + return int32(C.sizeof_uchar) + case INT32: + return int32(C.sizeof_int) + case INT64: + return int32(C.sizeof_longlong) + case FLOAT32: + return int32(C.sizeof_float) + } + return -1 +} + +func shapeAndTypeOf(val reflect.Value) (shape []int32, dt PaddleDType) { + gotype := val.Type() + for gotype.Kind() == reflect.Array || gotype.Kind() == reflect.Slice { + shape = append(shape, int32(val.Len())) + if val.Len() > 0 { + val = val.Index(0) + } + gotype = gotype.Elem() + } + + for _, t := range types { + if gotype.Kind() == t.gotype.Kind() { + return shape, PaddleDType(t.dtype) + } + } + return shape, dt +} + +type ZeroCopyTensor struct { + c *C.PD_ZeroCopyTensor + name string + shape []int32 +} + +func NewZeroCopyTensor() *ZeroCopyTensor { + c_tensor := C.PD_NewZeroCopyTensor() + + tensor := &ZeroCopyTensor{c: c_tensor} + runtime.SetFinalizer(tensor, (*ZeroCopyTensor).finalize) + return tensor +} + +func (tensor *ZeroCopyTensor) finalize() { + C.PD_DeleteZeroCopyTensor(tensor.c) +} + +func (tensor *ZeroCopyTensor) Shape() []int32 { + return tensor.shape +} + +func (tensor *ZeroCopyTensor) Name() string { + return C.GoString(tensor.c.name) +} + +func (tensor *ZeroCopyTensor) Rename(name string) { + tensor.name = name + tensor.c.name = (*C.char)(unsafe.Pointer(tensor.c.name)) +} + +func (tensor *ZeroCopyTensor) Reshape(shape []int32) { + tensor.shape = make([]int32, len(shape)) + copy(tensor.shape, shape) + length := C.sizeof_int * C.size_t(len(shape)) + if tensor.c.shape.capacity < C.size_t(length) { + if tensor.c.shape.capacity != C.size_t(0) { + C.free(tensor.c.shape.data) + } + tensor.c.shape.data = C.malloc(length) + tensor.c.shape.capacity = length + } + tensor.c.shape.length = length + C.memcpy(tensor.c.shape.data, unsafe.Pointer(&shape[0]), length) +} + +func (tensor *ZeroCopyTensor) DataType() PaddleDType { + return PaddleDType(tensor.c.dtype) +} + +func (tensor *ZeroCopyTensor) SetValue(value interface{}) { + val := reflect.ValueOf(value) + shape, dtype := shapeAndTypeOf(val) + num := numel(shape) + length := C.size_t(sizeofDataType(dtype) * num) + if tensor.c.data.capacity < length { + if tensor.c.data.capacity != C.size_t(0) { + C.free(tensor.c.data.data) + } + tensor.c.data.data = C.malloc(length) + tensor.c.data.capacity = length + } + tensor.c.data.length = length + + switch dtype { + case PaddleDType(UINT8): + data := val.Interface().([]uint8) + C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length) + case PaddleDType(INT32): + data := val.Interface().([]int32) + C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length) + case PaddleDType(INT64): + data := val.Interface().([]int64) + C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length) + case PaddleDType(FLOAT32): + data := val.Interface().([]float32) + C.memcpy(tensor.c.data.data, unsafe.Pointer(&data[0]), length) + } + tensor.c.dtype = C.PD_DataType(dtype) +} + +func (tensor *ZeroCopyTensor) tensorData() []byte { + cbytes := tensor.c.data.data + length := tensor.c.data.length + var slice []byte + if unsafe.Sizeof(unsafe.Pointer(nil)) == 8 { + slice = (*[1<<50 - 1]byte)(unsafe.Pointer(cbytes))[:length:length] + } else { + slice = (*[1 << 30]byte)(unsafe.Pointer(cbytes))[:length:length] + } + return slice +} + +func (tensor *ZeroCopyTensor) Value() interface{} { + t := typeOfDataType(PaddleDType(tensor.c.dtype)) + data := tensor.tensorData() + return decodeTensor(data, tensor.Shape(), t).Interface() +} + +// It isn't safe to use reflect.SliceHeader as it uses a uintptr for Data and +// this is not inspected by the garbage collector +type sliceHeader struct { + Data unsafe.Pointer + Len int + Cap int +} + +func decodeTensor(raw []byte, shape []int32, t reflect.Type) reflect.Value { + // Create a 1-dimensional slice of the base large enough for the data and + // copy the data in. + n := int(numel(shape)) + + l := n * int(t.Size()) + typ := reflect.SliceOf(t) + slice := reflect.MakeSlice(typ, n, n) + baseBytes := *(*[]byte)(unsafe.Pointer(&sliceHeader{ + Data: unsafe.Pointer(slice.Pointer()), + Len: l, + Cap: l, + })) + copy(baseBytes, raw) + + if len(shape) == 0 { + // for n + return slice.Index(0) + } + if len(shape) == 1 { + // for {} + return slice + } + // for {{} {}} {{} {}} {{} {}} + if n == 0 { + n = int(numel(shape[:len(shape)-1])) + } + for i := len(shape) - 2; i >= 0; i-- { + underlyingSize := typ.Elem().Size() + typ = reflect.SliceOf(typ) + subsliceLen := int(shape[i+1]) + if subsliceLen != 0 { + n = n / subsliceLen + } + data := unsafe.Pointer(slice.Pointer()) + nextSlice := reflect.MakeSlice(typ, n, n) + + for j := 0; j < n; j++ { + // This is equivalent to nSlice[j] = slice[j*subsliceLen: (j+1)*subsliceLen] + setSliceInSlice(nextSlice, j, sliceHeader{ + Data: unsafe.Pointer(uintptr(data) + (uintptr(j*subsliceLen) * underlyingSize)), + Len: subsliceLen, + Cap: subsliceLen, + }) + } + + slice = nextSlice + } + return slice +} + +// setSliceInSlice sets slice[index] = content. +func setSliceInSlice(slice reflect.Value, index int, content sliceHeader) { + const sliceSize = unsafe.Sizeof(sliceHeader{}) + // We must cast slice.Pointer to uninptr & back again to avoid GC issues. + // See https://github.com/google/go-cmp/issues/167#issuecomment-546093202 + *(*sliceHeader)(unsafe.Pointer(uintptr(unsafe.Pointer(slice.Pointer())) + (uintptr(index) * sliceSize))) = content +} + +func (tensor *ZeroCopyTensor) Lod() []uint { + var val []uint + valHdr := (*reflect.SliceHeader)(unsafe.Pointer(&val)) + valHdr.Data = uintptr(unsafe.Pointer(tensor.c.lod.data)) + valHdr.Len = int(tensor.c.lod.length / C.sizeof_size_t) + valHdr.Cap = int(tensor.c.lod.length / C.sizeof_size_t) + return val +} diff --git a/thirdparty/paddleocr-go/paddle_c/include/paddle_c_api.h b/thirdparty/paddleocr-go/paddle_c/include/paddle_c_api.h new file mode 100644 index 0000000000000000000000000000000000000000..e26f6b1f2b7f5c4d8b6a749a24d8f7de5e275ec8 --- /dev/null +++ b/thirdparty/paddleocr-go/paddle_c/include/paddle_c_api.h @@ -0,0 +1,290 @@ +// Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include +#include +#include + +#if defined(_WIN32) +#ifdef PADDLE_ON_INFERENCE +#define PADDLE_CAPI_EXPORT __declspec(dllexport) +#else +#define PADDLE_CAPI_EXPORT __declspec(dllimport) +#endif // PADDLE_ON_INFERENCE +#else +#define PADDLE_CAPI_EXPORT __attribute__((visibility("default"))) +#endif // _WIN32 + +#ifdef __cplusplus +extern "C" { +#endif + +enum PD_DataType { PD_FLOAT32, PD_INT32, PD_INT64, PD_UINT8, PD_UNKDTYPE }; + +typedef enum PD_DataType PD_DataType; + +typedef struct PD_PaddleBuf PD_PaddleBuf; +typedef struct PD_AnalysisConfig PD_AnalysisConfig; +typedef struct PD_Predictor PD_Predictor; + +typedef struct PD_Buffer { + void* data; + size_t length; + size_t capacity; +} PD_Buffer; + +typedef struct PD_ZeroCopyTensor { + PD_Buffer data; + PD_Buffer shape; + PD_Buffer lod; + PD_DataType dtype; + char* name; +} PD_ZeroCopyTensor; + +PADDLE_CAPI_EXPORT extern PD_ZeroCopyTensor* PD_NewZeroCopyTensor(); +PADDLE_CAPI_EXPORT extern void PD_DeleteZeroCopyTensor(PD_ZeroCopyTensor*); +PADDLE_CAPI_EXPORT extern void PD_InitZeroCopyTensor(PD_ZeroCopyTensor*); +PADDLE_CAPI_EXPORT extern void PD_DestroyZeroCopyTensor(PD_ZeroCopyTensor*); +PADDLE_CAPI_EXPORT extern void PD_DeleteZeroCopyTensor(PD_ZeroCopyTensor*); + +typedef struct PD_ZeroCopyData { + char* name; + void* data; + PD_DataType dtype; + int* shape; + int shape_size; +} PD_ZeroCopyData; +typedef struct InTensorShape { + char* name; + int* tensor_shape; + int shape_size; +} InTensorShape; + +PADDLE_CAPI_EXPORT extern PD_PaddleBuf* PD_NewPaddleBuf(); + +PADDLE_CAPI_EXPORT extern void PD_DeletePaddleBuf(PD_PaddleBuf* buf); + +PADDLE_CAPI_EXPORT extern void PD_PaddleBufResize(PD_PaddleBuf* buf, + size_t length); + +PADDLE_CAPI_EXPORT extern void PD_PaddleBufReset(PD_PaddleBuf* buf, void* data, + size_t length); + +PADDLE_CAPI_EXPORT extern bool PD_PaddleBufEmpty(PD_PaddleBuf* buf); + +PADDLE_CAPI_EXPORT extern void* PD_PaddleBufData(PD_PaddleBuf* buf); + +PADDLE_CAPI_EXPORT extern size_t PD_PaddleBufLength(PD_PaddleBuf* buf); + +// PaddleTensor +typedef struct PD_Tensor PD_Tensor; + +PADDLE_CAPI_EXPORT extern PD_Tensor* PD_NewPaddleTensor(); + +PADDLE_CAPI_EXPORT extern void PD_DeletePaddleTensor(PD_Tensor* tensor); + +PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorName(PD_Tensor* tensor, + char* name); + +PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorDType(PD_Tensor* tensor, + PD_DataType dtype); + +PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorData(PD_Tensor* tensor, + PD_PaddleBuf* buf); + +PADDLE_CAPI_EXPORT extern void PD_SetPaddleTensorShape(PD_Tensor* tensor, + int* shape, int size); + +PADDLE_CAPI_EXPORT extern const char* PD_GetPaddleTensorName( + const PD_Tensor* tensor); + +PADDLE_CAPI_EXPORT extern PD_DataType PD_GetPaddleTensorDType( + const PD_Tensor* tensor); + +PADDLE_CAPI_EXPORT extern PD_PaddleBuf* PD_GetPaddleTensorData( + const PD_Tensor* tensor); + +PADDLE_CAPI_EXPORT extern const int* PD_GetPaddleTensorShape( + const PD_Tensor* tensor, int* size); + +// AnalysisPredictor +PADDLE_CAPI_EXPORT extern bool PD_PredictorRun(const PD_AnalysisConfig* config, + PD_Tensor* inputs, int in_size, + PD_Tensor** output_data, + int* out_size, int batch_size); + +PADDLE_CAPI_EXPORT extern bool PD_PredictorZeroCopyRun( + const PD_AnalysisConfig* config, PD_ZeroCopyData* inputs, int in_size, + PD_ZeroCopyData** output, int* out_size); + +// AnalysisConfig +enum Precision { kFloat32 = 0, kInt8, kHalf }; +typedef enum Precision Precision; + +PADDLE_CAPI_EXPORT extern PD_AnalysisConfig* PD_NewAnalysisConfig(); + +PADDLE_CAPI_EXPORT extern void PD_DeleteAnalysisConfig( + PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SetModel(PD_AnalysisConfig* config, + const char* model_dir, + const char* params_path); + +PADDLE_CAPI_EXPORT +extern void PD_SetProgFile(PD_AnalysisConfig* config, const char* x); + +PADDLE_CAPI_EXPORT extern void PD_SetParamsFile(PD_AnalysisConfig* config, + const char* x); + +PADDLE_CAPI_EXPORT extern void PD_SetOptimCacheDir(PD_AnalysisConfig* config, + const char* opt_cache_dir); + +PADDLE_CAPI_EXPORT extern const char* PD_ModelDir( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern const char* PD_ProgFile( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern const char* PD_ParamsFile( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_EnableUseGpu(PD_AnalysisConfig* config, + int memory_pool_init_size_mb, + int device_id); + +PADDLE_CAPI_EXPORT extern void PD_DisableGpu(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern bool PD_UseGpu(const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern int PD_GpuDeviceId(const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern int PD_MemoryPoolInitSizeMb( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern float PD_FractionOfGpuMemoryForPool( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_EnableCUDNN(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern bool PD_CudnnEnabled(const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SwitchIrOptim(PD_AnalysisConfig* config, + bool x); + +PADDLE_CAPI_EXPORT extern bool PD_IrOptim(const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SwitchUseFeedFetchOps( + PD_AnalysisConfig* config, bool x); + +PADDLE_CAPI_EXPORT extern bool PD_UseFeedFetchOpsEnabled( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SwitchSpecifyInputNames( + PD_AnalysisConfig* config, bool x); + +PADDLE_CAPI_EXPORT extern bool PD_SpecifyInputName( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_EnableTensorRtEngine( + PD_AnalysisConfig* config, int workspace_size, int max_batch_size, + int min_subgraph_size, Precision precision, bool use_static, + bool use_calib_mode); + +PADDLE_CAPI_EXPORT extern bool PD_TensorrtEngineEnabled( + const PD_AnalysisConfig* config); + +typedef struct PD_MaxInputShape { + char* name; + int* shape; + int shape_size; +} PD_MaxInputShape; + +PADDLE_CAPI_EXPORT extern void PD_SwitchIrDebug(PD_AnalysisConfig* config, + bool x); + +PADDLE_CAPI_EXPORT extern void PD_EnableMKLDNN(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SetMkldnnCacheCapacity( + PD_AnalysisConfig* config, int capacity); + +PADDLE_CAPI_EXPORT extern bool PD_MkldnnEnabled( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SetCpuMathLibraryNumThreads( + PD_AnalysisConfig* config, int cpu_math_library_num_threads); + +PADDLE_CAPI_EXPORT extern int PD_CpuMathLibraryNumThreads( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_EnableMkldnnQuantizer( + PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern bool PD_MkldnnQuantizerEnabled( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SetModelBuffer(PD_AnalysisConfig* config, + const char* prog_buffer, + size_t prog_buffer_size, + const char* params_buffer, + size_t params_buffer_size); + +PADDLE_CAPI_EXPORT extern bool PD_ModelFromMemory( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_EnableMemoryOptim(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern bool PD_MemoryOptimEnabled( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_EnableProfile(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern bool PD_ProfileEnabled( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_SetInValid(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern bool PD_IsValid(const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_DisableGlogInfo(PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_DeletePass(PD_AnalysisConfig* config, + char* pass_name); + +PADDLE_CAPI_EXPORT extern PD_Predictor* PD_NewPredictor( + const PD_AnalysisConfig* config); + +PADDLE_CAPI_EXPORT extern void PD_DeletePredictor(PD_Predictor* predictor); + +PADDLE_CAPI_EXPORT extern int PD_GetInputNum(const PD_Predictor*); + +PADDLE_CAPI_EXPORT extern int PD_GetOutputNum(const PD_Predictor*); + +PADDLE_CAPI_EXPORT extern const char* PD_GetInputName(const PD_Predictor*, int); + +PADDLE_CAPI_EXPORT extern const char* PD_GetOutputName(const PD_Predictor*, + int); + +PADDLE_CAPI_EXPORT extern void PD_SetZeroCopyInput( + PD_Predictor* predictor, const PD_ZeroCopyTensor* tensor); + +PADDLE_CAPI_EXPORT extern void PD_GetZeroCopyOutput(PD_Predictor* predictor, + PD_ZeroCopyTensor* tensor); + +PADDLE_CAPI_EXPORT extern void PD_ZeroCopyRun(PD_Predictor* predictor); + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/thirdparty/paddleocr-go/ppocr-go.go b/thirdparty/paddleocr-go/ppocr-go.go new file mode 100644 index 0000000000000000000000000000000000000000..7fba63f080f96f723a00c735948fe2caa1b6ae46 --- /dev/null +++ b/thirdparty/paddleocr-go/ppocr-go.go @@ -0,0 +1,52 @@ +package main + +import ( + "flag" + "log" + "github.com/PaddlePaddle/PaddleOCR/thirdparty/paddleocr-go/ocr" +) + +var ( + confFile string + image string + imageDir string + useServering bool + port string +) + +func init() { + flag.StringVar(&confFile, "config", "config/conf.yaml", "config from ocr system. If not given, will use default config.") + flag.StringVar(&image, "image", "", "image to predict. if not given, will use image_dir") + flag.StringVar(&imageDir, "image_dir", "", "imgs in dir to be predicted. if not given, will check servering") + flag.BoolVar(&useServering, "use_servering", false, "whether to use ocr server. [default: false]") + flag.StringVar(&port, "port", "18600", "which port to serve ocr server. [default: 18600].") +} + +func main() { + flag.Parse() + sys := ocr.NewOCRSystem(confFile, nil) + + if image != "" { + img := ocr.ReadImage(image) + defer img.Close() + results := sys.PredictOneImage(img) + for _, res := range results { + log.Println(res) + } + return + } + + if imageDir != "" { + results := sys.PredictDirImages(imageDir) + for k, vs := range results { + log.Printf("======== image: %v =======\n", k) + for _, res := range vs { + log.Println(res) + } + } + } + + if useServering { + sys.StartServer(port) + } +} diff --git a/thirdparty/requests.md b/thirdparty/requests.md new file mode 100644 index 0000000000000000000000000000000000000000..6f78fddc5769ddfcc7bb48dde36e9021255ff567 --- /dev/null +++ b/thirdparty/requests.md @@ -0,0 +1,16 @@ +## 第三方新需求 + + +### 1、开发 - 多语言支持需求 + + + +### 2、模型 - 多语言支持需求 + + - 格式:需要提交对应的语言字典dict和语料文件corpus,建议以链接形式提供。 + + +### 3、部署 - 性能提升需求 + + +### 4、其他需求 diff --git a/tools/eval.py b/tools/eval.py index aff5fc7111a062c9b4346e9c2dcbc8f9225fe8da..a687bb6b33cca2e60e3b674c72a8765740286790 100755 --- a/tools/eval.py +++ b/tools/eval.py @@ -39,6 +39,7 @@ set_paddle_flags( import program from paddle import fluid from ppocr.utils.utility import initial_logger +from ppocr.utils.utility import enable_static_mode logger = initial_logger() from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model @@ -95,4 +96,5 @@ def main(): if __name__ == '__main__': + enable_static_mode() main() diff --git a/tools/infer/predict_det.py b/tools/infer/predict_det.py index dabce38e55c4dda4e3d311bc0d63c08f3cfad01d..21f9bf90b9546dfb86266a07683d4af1200d53fa 100755 --- a/tools/infer/predict_det.py +++ b/tools/infer/predict_det.py @@ -177,7 +177,7 @@ if __name__ == "__main__": text_detector = TextDetector(args) count = 0 total_time = 0 - draw_img_save = "./inference_results" + draw_img_save = os.path.join(".", "inference_results") if not os.path.exists(draw_img_save): os.makedirs(draw_img_save) for image_file in image_file_list: diff --git a/tools/infer_cls.py b/tools/infer_cls.py index aebdc0761b7ec48f81143ecbb758ce0e4da2edf7..739925f8cfcb97ee584f1e00c081634ca131a0e7 100755 --- a/tools/infer_cls.py +++ b/tools/infer_cls.py @@ -41,6 +41,7 @@ set_paddle_flags( import tools.program as program from paddle import fluid from ppocr.utils.utility import initial_logger +from ppocr.utils.utility import enable_static_mode logger = initial_logger() from ppocr.data.reader_main import reader_main @@ -109,6 +110,7 @@ def main(): if __name__ == '__main__': + enable_static_mode() parser = program.ArgsParser() FLAGS = parser.parse_args() main() diff --git a/tools/infer_det.py b/tools/infer_det.py index 4ac441a4edc60db87097d45a47e77ece4b55a8f7..79eb638dc2c61af3bd0c7a3c3c14b4a769650f45 100755 --- a/tools/infer_det.py +++ b/tools/infer_det.py @@ -49,6 +49,7 @@ import cv2 from ppocr.utils.utility import initial_logger logger = initial_logger() +from ppocr.utils.utility import enable_static_mode def draw_det_res(dt_boxes, config, img, img_name): @@ -162,6 +163,7 @@ def main(): if __name__ == '__main__': + enable_static_mode() parser = program.ArgsParser() FLAGS = parser.parse_args() main() diff --git a/tools/infer_rec.py b/tools/infer_rec.py index 29fc5b40a890cd6e8fa3ca7d3f0999835555d9bd..389453a4117550b00772970feb4262d14eab4256 100755 --- a/tools/infer_rec.py +++ b/tools/infer_rec.py @@ -41,6 +41,7 @@ import tools.program as program from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() +from ppocr.utils.utility import enable_static_mode from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model from ppocr.utils.character import CharacterOps @@ -171,6 +172,7 @@ def main(): if __name__ == '__main__': + enable_static_mode() parser = program.ArgsParser() FLAGS = parser.parse_args() main() diff --git a/tools/train.py b/tools/train.py index cf0171b340f8cebb6251d2ef12efb14d3cdb709e..d552f2152b91e0a01f1fc377ac0f90a02a2a0571 100755 --- a/tools/train.py +++ b/tools/train.py @@ -39,6 +39,7 @@ set_paddle_flags( import tools.program as program from paddle import fluid from ppocr.utils.utility import initial_logger +from ppocr.utils.utility import enable_static_mode logger = initial_logger() from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model @@ -119,14 +120,18 @@ def test_reader(): if count % 1 == 0: batch_time = time.time() - starttime starttime = time.time() - logger.info("reader:", count, len(data), batch_time) + logger.info("[reader]count: {}, data length: {}, time: {}". + format(count, len(data), batch_time)) except Exception as e: logger.info(e) logger.info("finish reader: {}, Success!".format(count)) if __name__ == '__main__': + enable_static_mode() startup_program, train_program, place, config, train_alg_type = program.preprocess( ) + # run the train process main() -# test_reader() + # if you want to check the reader, you can comment `main` and run test_reader + # test_reader()