Browse Source

【2025】【转档】图片转PDF UI处理

tangchao 4 months ago
parent
commit
d5264481a0

+ 1 - 1
PDF Office/PDF Master/Class/Batch/WindowController/Base/KMBatchOperateBaseViewController.swift

@@ -9,7 +9,7 @@ import Cocoa
 
 //var kBatchQueueOperationsChanged = "kBatchQueueOperationsChanged"
 private var kBatchQueueOperationsChanged = 0x000101
-class KMBatchOperateBaseViewController: NSViewController, KMBatchOperateProtocol{
+class KMBatchOperateBaseViewController: KMNBaseViewController, KMBatchOperateProtocol{
     var operateType: KMBatchOperationType?
     var convertType: KMConvertWithPDFType?
     var files: [KMBatchOperateFile]?

+ 8 - 6
PDF Office/PDF Master/Class/Batch/WindowController/KMBatchOperateWindowController.xib

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22155" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22155"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -13,12 +13,14 @@
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
-        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="KMBatchWindow" customModule="PDF_Master" customModuleProvider="target">
+        <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="KMBatchWindow" customModule="PDF_Reader_Pro" customModuleProvider="target">
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
-            <rect key="contentRect" x="463" y="248" width="480" height="270"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <rect key="contentRect" x="463" y="248" width="880" height="600"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
+            <value key="minSize" type="size" width="880" height="600"/>
+            <value key="minFullScreenContentSize" type="size" width="880" height="600"/>
             <view key="contentView" id="se5-gp-TjO">
-                <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
+                <rect key="frame" x="0.0" y="0.0" width="880" height="600"/>
                 <autoresizingMask key="autoresizingMask"/>
             </view>
             <connections>

+ 239 - 44
PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateImageToPDFViewController.swift

@@ -9,6 +9,9 @@ import Cocoa
 import KMComponentLibrary
 
 class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController, KMImageToPDFMethodDelegate, NSPopoverDelegate{
+    @IBOutlet weak var headerBox: NSBox!
+    @IBOutlet weak var titleLabel: NSTextField!
+    @IBOutlet weak var headerBottomLine: ComponentDivider!
     
     @IBOutlet var outputTypeLabel: NSTextField!
     @IBOutlet var createNewPDFBtn: NSButton!
@@ -34,6 +37,17 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     @IBOutlet weak var appendBox: NSBox!
     @IBOutlet weak var appendBackBox: NSBox!
     
+    @IBOutlet weak var ocrSelectBox: NSBox!
+    @IBOutlet weak var languageBox: NSBox!
+    @IBOutlet weak var ocrPlanBox: NSBox!
+    @IBOutlet weak var ocrPlan2Box: NSBox!
+    @IBOutlet weak var hLine: NSView!
+    @IBOutlet weak var extractTextBox: NSBox!
+    
+    @IBOutlet weak var bottomBox: NSBox!
+    @IBOutlet weak var bottomTopLine: ComponentDivider!
+    @IBOutlet weak var applyButton: ComponentButton!
+    
     var password: String = ""
     
     lazy var method: KMImageToPDFMethod = {
@@ -81,6 +95,72 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         return view
     }()
     
+    private lazy var ocrCheckBox_: ComponentCheckBox = {
+        let view = ComponentCheckBox()
+        view.properties = ComponentCheckBoxProperty(size: .s,
+                                                                state: .normal,
+                                                                isDisabled: false,
+                                                                showhelp: false,
+                                                                text: NSLocalizedString("Recognize text if needed", comment: ""),
+                                                                checkboxType: .normal)
+        return view
+    }()
+    
+    private lazy var languageView_: ComponentSelect = {
+        let view = ComponentSelect()
+        
+        view.properties = ComponentSelectProperties(size: .s,
+                                                                state: .normal,
+                                                                isDisabled: false,
+                                                                isError: false,
+                                                                leftIcon: false,
+                                                                placeholder: nil,
+                                                                errorText: nil,
+                                                                creatable: false,
+                                                                text: KMLocalizedString("", comment: ""))
+//        view.delegate = self
+        return view
+    }()
+    
+    private var ocrPlanRadio_: ComponentRadio = {
+        let view = ComponentRadio()
+        view.properties = ComponentCheckBoxProperty(size: .s,
+                                                               state: .normal,
+                                                               isDisabled: false,
+                                                               showhelp: true,
+                                                               text: KMLocalizedString("OCR Plan 1-Online", comment: ""),
+                                                               checkboxType: .normal)
+        return view
+    }()
+    
+    private var ocrPlanRadio2_: ComponentRadio = {
+        let view = ComponentRadio()
+        view.properties = ComponentCheckBoxProperty(size: .s,
+                                                               state: .normal,
+                                                               isDisabled: false,
+                                                               showhelp: true,
+                                                               text: KMLocalizedString("OCR Plan 2-Online", comment: ""),
+                                                               checkboxType: .normal)
+        return view
+    }()
+    
+    private var vLine_: ComponentDivider = {
+        let view = ComponentDivider()
+        view.properties = ComponentDividerProperty(type: .horizontal, dash: false)
+        return view
+    }()
+    
+    private lazy var extractTextCheckBox_: ComponentCheckBox = {
+        let view = ComponentCheckBox()
+        view.properties = ComponentCheckBoxProperty(size: .s,
+                                                                state: .normal,
+                                                                isDisabled: false,
+                                                                showhelp: false,
+                                                                text: KMLocalizedString("Extract Text (.txt)", comment: ""),
+                                                                checkboxType: .normal)
+        return view
+    }()
+    
     override var interfaceStatus: KMBatchOperateInterfaceStatus?{
         set{
             super.interfaceStatus = newValue
@@ -110,15 +190,14 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     private func _updateActionButtonEnable(_ enabled: Bool) {
         if enabled {
             self.actionButton.tag = 1
-            self.actionButton.title = NSLocalizedString("Save as PDF", comment: "")
-            self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
-            self.actionButton.isEnabled = true
-            self.actionButton.layer?.backgroundColor = KMAppearance.Interactive.m0Color().cgColor
+            
+            applyButton.properties.isDisabled = false
+            applyButton.reloadData()
         } else {
             self.actionButton.tag = 0
-            self.actionButton.layer?.backgroundColor = KMAppearance.Interactive.m0Color().cgColor
-            self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
-            self.actionButton.isEnabled = false
+            
+            applyButton.properties.isDisabled = true
+            applyButton.reloadData()
         }
     }
     
@@ -129,6 +208,30 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     
     override func viewDidLoad() {
         super.viewDidLoad()
+        
+        headerBox.borderWidth = 0
+        titleLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-m-bold")
+        createNewPDFRadio_.properties.checkboxType = .selected
+        createNewPDFRadio_.reloadData()
+        
+        ocrLabel.font = ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
+        ocrSelectBox.borderWidth = 0
+        ocrSelectBox.contentView = ocrCheckBox_
+        ocrCheckBox_.setTarget(self, action: #selector(buttonClicked_OCRSelect))
+        languageView_.properties.isDisabled = true
+        languageView_.reloadData()
+        ocrPlanRadio_.setTarget(self, action: #selector(ocrPlanAction))
+        ocrPlanRadio_.properties.isDisabled = true
+        ocrPlanRadio_.reloadData()
+        ocrPlanRadio2_.setTarget(self, action: #selector(ocrPlanAction))
+        ocrPlanRadio2_.properties.isDisabled = true
+        ocrPlanRadio2_.reloadData()
+        extractTextCheckBox_.properties.isDisabled = true
+        extractTextCheckBox_.reloadData()
+        
+        bottomBox.borderWidth = 0
+        applyButton.properties = ComponentButtonProperty(type: .primary, size: .m, onlyIcon: false, buttonText: KMLocalizedString("Apply"))
+        
         self.localizedLanguage()
         self.configuUI()
         
@@ -145,6 +248,30 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         DistributedNotificationCenter.default().addObserver(self, selector: #selector(themeChanged(notification:)), name: NSNotification.Name("AppleInterfaceThemeChangedNotification"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(batchFilesCountNotification(notification:)), name: NSNotification.Name("KMBatchFilesCountNotification"), object: nil)
     }
+    
+    
+    
+    override func updateUILanguage() {
+        super.updateUILanguage()
+        
+        KMMainThreadExecute {
+            self.titleLabel.stringValue = KMLocalizedString("Image to PDF")
+            self.ocrLabel.stringValue = KMLocalizedString("Text Recognition Settings")
+        }
+    }
+    
+    override func updateUIThemeColor() {
+        super.updateUIThemeColor()
+        
+        KMMainThreadExecute {
+            let titleColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/2")
+            self.titleLabel.textColor = titleColor
+            self.headerBottomLine.properties = ComponentDividerProperty()
+            self.ocrLabel.textColor = titleColor
+            self.bottomTopLine.properties = ComponentDividerProperty()
+        }
+    }
+    
     func localizedLanguage() {
         self.outputTypeLabel.stringValue = KMLocalizedString("Output")
         self.btnMerge.title = KMLocalizedString("Merge All")
@@ -152,7 +279,29 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         self.appendPDFBtn.title = KMLocalizedString("Append To Existing File")
         self.appendTextField.placeholderString = KMLocalizedString("Select a File")
         self.selectLanguageLabel.stringValue = KMLocalizedString("Select OCR Language:")
+        self.selectLanguageLabel.isHidden = true
         self.ocrSelectBtn.title = KMLocalizedString("OCR Plan")
+        
+        let languages = KMGOCRManager.languages() as NSArray
+        let strings = languages.value(forKeyPath: KMGOCRLanguageStringKey) as? [String]
+        var menuItemArr: [ComponentMenuitemProperty] = []
+        for language in strings ?? [] {
+            let itemProperty: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
+                                                                                    itemSelected: false,
+                                                                                    isDisabled: false,
+                                                                                    keyEquivalent: nil,
+                                                                                    text: language)
+            menuItemArr.append(itemProperty)
+        }
+
+        
+        languageView_.updateMenuItemsArr(menuItemArr)
+        
+        languageView_.selectItemAtIndex(0)
+        languageView_.properties.creatable = false
+        languageView_.properties.text = menuItemArr.first?.text
+        languageView_.reloadData()
+        
         self.updateLanguageButton((KMGOCRManager.default().selectedLanguages?.value(forKeyPath: KMGOCRLanguageStringKey) as? [String]))
         
         self.actionButton.title = KMLocalizedString("Save as PDF")
@@ -166,17 +315,9 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         appendBackView.wantsLayer = true
         appendBackView.layer?.borderWidth = 0.5
         
-        self.actionButton.wantsLayer = true
-        self.actionButton.layer?.backgroundColor = KMAppearance.Interactive.m0Color().cgColor
         self.appendOtherPDFBtn.layer?.backgroundColor = KMAppearance.Interactive.s0Color().withAlphaComponent(0.4).cgColor
-        self.actionButton.setTitleColor(KMAppearance.Layout.w0Color())
-        self.actionButton.layer?.cornerRadius = 1.0
         
         createNewPDFBtn.setTitleColor(KMAppearance.Layout.h0Color())
-        ///createNewPDFBtn.superview?.addSubview( createNewPDFRadio_)
-//        self.createNewPDFBtn.setTarget(self, action: #selector(radioAction))
-        //createNewPDFRadio_.frame = createNewPDFBtn.frame
-        //createNewPDFRadio_.autoresizingMask = [.width, .height]
         newPDFBox.borderWidth = 0
         newPDFBox.contentView = createNewPDFRadio_
         createNewPDFRadio_.setTarget(self, action: #selector(buttonClicked_CreateNewPDF))
@@ -199,20 +340,36 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         self.ocrSelectBtn.setTitleColor(KMAppearance.Layout.h0Color())
         self.saveAsButton.setTitleColor(KMAppearance.Layout.h0Color())
         self.selectLanguageLabel.textColor = KMAppearance.Layout.h0Color()
-        self.languageButton.isEnabled = false
-        self.planButton.isEnabled = false
-        self.saveAsButton.isEnabled = false
+        saveAsButton.isHidden = true
+        
+        ocrSelectBtn.isHidden = true
+        
+        languageBox.borderWidth = 0
+        languageBox.contentView = languageView_
+        
+        ocrPlanBox.borderWidth = 0
+        ocrPlanBox.contentView = ocrPlanRadio_
+        
+        ocrPlan2Box.borderWidth = 0
+        ocrPlan2Box.contentView = ocrPlanRadio2_
+        
+        hLine.addSubview(vLine_)
+        vLine_.frame = hLine.bounds
+        vLine_.autoresizingMask = [.width, .height]
+        
+        extractTextBox.borderWidth = 0
+        extractTextBox.contentView = extractTextCheckBox_
         
         appendTextField.backgroundColor = KMAppearance.Layout.l1Color()
-        planButton.wantsLayer = true
         appendTextField.wantsLayer = true
-        planButton.wantsLayer = true
         appendTextField.layer?.cornerRadius = 1.0
         languageButton.layer?.backgroundColor = NSColor.clear.cgColor
         languaeBox.borderColor = KMAppearance.Interactive.s0Color()
         planBox.borderColor = KMAppearance.Interactive.s0Color()
         languaeBox.fillColor = KMAppearance.Layout.l1Color()
         planBox.fillColor = KMAppearance.Layout.l1Color()
+        languaeBox.isHidden = true
+        
         
         self.updateViewColor()
     }
@@ -230,6 +387,9 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     func updateLanguageButton(_ languages: [String]?) {
         if languages?.count ?? 0 < 1 {
             self.languageButton.title = " " + KMLocalizedString("Auto Detection")
+            
+            self.languageView_.properties.text = " " + KMLocalizedString("Auto Detection")
+            self.languageView_.reloadData()
             return
         }
         var languageName: String = ""
@@ -247,6 +407,8 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         }
         
         self.languageButton.title = " " + languageName
+        self.languageView_.properties.text = " " + languageName
+        self.languageView_.reloadData()
     }
     func converArrType(arr: Array<KMBatchOperateFile>, keyString: String) -> [String] {
         let newArr = NSMutableArray()
@@ -283,12 +445,12 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         var isMerge = false
         var isCreatNewPDF = false
         var isOCR = false
-        if self.ocrSelectBtn.state == .on {
+        if ocrCheckBox_.properties.checkboxType == .selected {
             isOCR = true
         }
         
         var isSaveAs = false
-        if self.saveAsButton.state == .on {
+        if extractTextCheckBox_.properties.checkboxType == .selected {
             isSaveAs = true
         }
         
@@ -307,7 +469,7 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
             return
         }
         
-        if self.createNewPDFBtn.state == .on {
+        if createNewPDFRadio_.properties.checkboxType == .selected {
             if (self.choosePath.count < 1) {
                 let alert = NSAlert()
                 alert.alertStyle = .critical
@@ -319,7 +481,6 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
             path = self.choosePath
             
             if mergeAllCheckBox_.properties.checkboxType == .selected {
-//            if self.btnMerge.state == .on {
                 isMerge = true
             }
             isCreatNewPDF = true
@@ -340,7 +501,10 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         }
         
         self.languageButton.isEnabled = false
-        self.planButton.isEnabled = false
+        ocrPlanRadio_.properties.isDisabled = true
+        ocrPlanRadio_.reloadData()
+        ocrPlanRadio2_.properties.isDisabled = true
+        ocrPlanRadio2_.reloadData()
         self.method.password = self.password
         self.interfaceStatus = .Processing
         
@@ -348,7 +512,10 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         self.method.exportPDFFile(fileArray: photoArray, savePath: path, isOCR: isOCR, isCreatPDF: isCreatNewPDF, isMerge: isMerge, isSaveAsText: isSaveAs) { [weak self] savePath, errorArr, errorOCRArray in
             
             self?.languageButton.isEnabled = true
-            self?.planButton.isEnabled = true
+            self?.ocrPlanRadio_.properties.isDisabled = false
+            self?.ocrPlanRadio_.reloadData()
+            self?.ocrPlanRadio2_.properties.isDisabled = false
+            self?.ocrPlanRadio2_.reloadData()
             self?.interfaceStatus = .PrepareProcess
             if errorArr.count > 0 {
                 let dict: [String: Any] = ["isMerge": false, "isSuccess": false]
@@ -391,6 +558,19 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         workspace.activateFileViewerSelecting([url])
     }
     
+    // MARK: - Actions
+    
+    @objc func ocrPlanAction(_ sender: ComponentRadio) {
+        for radio in [ocrPlanRadio_, ocrPlanRadio2_] {
+            if radio.isEqual(to: sender) {
+                radio.properties.checkboxType = .selected
+                radio.reloadData()
+            } else {
+                radio.properties.checkboxType = .normal
+                radio.reloadData()
+            }
+        }
+    }
     
     //MARK: Notification
     @objc func OCRSelectedLanguagesChangeNotification(notification: Notification) {
@@ -408,9 +588,17 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     func OCRSelectedPlanChangeAction() {
         let plan = UserDefaults.standard.integer(forKey: "KMOCRCurrentPlanKey")
         if plan == 0 {
-            self.planButton.title = " " + KMLocalizedString("Plan 1 (Online)")
+//            self.planButton.title = " " + KMLocalizedString("Plan 1 (Online)")
+            ocrPlanRadio_.properties.checkboxType = .selected
+            ocrPlanRadio_.reloadData()
+            ocrPlanRadio2_.properties.checkboxType = .normal
+            ocrPlanRadio2_.reloadData()
         } else {
-            self.planButton.title = " " + KMLocalizedString("Plan 2 (Offline)")
+//            self.planButton.title = " " + KMLocalizedString("Plan 2 (Offline)")
+            ocrPlanRadio_.properties.checkboxType = .normal
+            ocrPlanRadio_.reloadData()
+            ocrPlanRadio2_.properties.checkboxType = .selected
+            ocrPlanRadio2_.reloadData()
         }
         KMGOCRManager.default().selectedLanguages = NSMutableArray()
         self.updateLanguageButton(KMGOCRManager.default().selectedLanguages?.value(forKeyPath: KMGOCRLanguageStringKey) as? [String])
@@ -428,11 +616,9 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     
     @IBAction func buttonClicked_CreateNewPDF(_ sender: ComponentRadio) {
         if (sender.properties.checkboxType == .selected) {
-            self.btnMerge.isEnabled = true
             mergeAllCheckBox_.properties.isDisabled = false
             mergeAllCheckBox_.reloadData()
             
-            self.appendPDFBtn.state = .off
             appendRadio_.properties.checkboxType = .normal
             appendRadio_.reloadData()
             self.appendOtherPDFBtn.isEnabled = false
@@ -441,11 +627,9 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
     
     @IBAction func buttonClicked_AppendOtherPDF(_ sender: ComponentRadio) {
         if (sender.properties.checkboxType == .selected) {
-            self.createNewPDFBtn.state = .off
             createNewPDFRadio_.properties.checkboxType = .normal
             createNewPDFRadio_.reloadData()
             
-            self.btnMerge.isEnabled = false
             mergeAllCheckBox_.properties.checkboxType = .normal
             mergeAllCheckBox_.properties.isDisabled = true
             mergeAllCheckBox_.reloadData()
@@ -454,21 +638,32 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
         }
     }
     
-    @IBAction func buttonClicked_OCRSelect(_ sender: NSButton) {
+    @IBAction func buttonClicked_OCRSelect(_ sender: ComponentCheckBox) {
         //MARK: 判断是否付费用户
         if IAPProductsManager.default().isAvailableAllFunction() == false {
             KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            self.ocrSelectBtn.state = .off
+            ocrCheckBox_.properties.checkboxType = .normal
+            ocrCheckBox_.reloadData()
             return
         }
-        if (sender.state == .on) {
-            self.languageButton.isEnabled = true
-            self.planButton.isEnabled = true
-            self.saveAsButton.isEnabled = true
+        if (sender.properties.checkboxType == .selected) {
+            languageView_.properties.isDisabled = false
+            languageView_.reloadData()
+            ocrPlanRadio_.properties.isDisabled = false
+            ocrPlanRadio_.reloadData()
+            ocrPlanRadio2_.properties.isDisabled = false
+            ocrPlanRadio2_.reloadData()
+            extractTextCheckBox_.properties.isDisabled = false
+            extractTextCheckBox_.reloadData()
         } else {
-            self.languageButton.isEnabled = false
-            self.planButton.isEnabled = false
-            self.saveAsButton.isEnabled = false
+            languageView_.properties.isDisabled = true
+            languageView_.reloadData()
+            ocrPlanRadio_.properties.isDisabled = true
+            ocrPlanRadio_.reloadData()
+            ocrPlanRadio2_.properties.isDisabled = true
+            ocrPlanRadio2_.reloadData()
+            extractTextCheckBox_.properties.isDisabled = true
+            extractTextCheckBox_.reloadData()
         }
     }
     
@@ -521,12 +716,12 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
             }
             
             var isOCR = false
-            if self.ocrSelectBtn.state == .on {
+            if ocrCheckBox_.properties.checkboxType == .selected {
                 isOCR = true
             }
             
             var isSaveAs = false
-            if self.saveAsButton.state == .on {
+            if extractTextCheckBox_.properties.checkboxType == .selected {
                 isSaveAs = true
             }
             
@@ -545,7 +740,7 @@ class KMBatchOperateImageToPDFViewController: KMBatchOperateBaseViewController,
                 return
             }
             
-            if self.createNewPDFBtn.state == .off {
+            if createNewPDFRadio_.properties.checkboxType != .selected {
                 let appenString = self.appendTextField.stringValue
                 if appenString.isEmpty {
                     let alert = NSAlert()

+ 176 - 20
PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateImageToPDFViewController.xib

@@ -15,30 +15,42 @@
                 <outlet property="appendOtherPDFBtn" destination="H4C-li-Hhm" id="kmI-0Y-YVe"/>
                 <outlet property="appendPDFBtn" destination="lwQ-xY-nsX" id="GEN-0Q-t29"/>
                 <outlet property="appendTextField" destination="AKV-3R-iGQ" id="MmJ-ov-KsS"/>
+                <outlet property="applyButton" destination="HSI-hW-pYn" id="YQY-2l-Can"/>
+                <outlet property="bottomBox" destination="dja-8H-Uup" id="udk-GK-Wkh"/>
+                <outlet property="bottomTopLine" destination="4wO-ha-sYg" id="9wl-jh-5lh"/>
                 <outlet property="btnMerge" destination="Sf1-WE-VzB" id="n9e-oY-Rpj"/>
                 <outlet property="createNewPDFBtn" destination="cYX-Yt-gnO" id="bku-Gy-hF3"/>
+                <outlet property="extractTextBox" destination="nfj-9v-ZqH" id="ErV-XO-Hur"/>
+                <outlet property="hLine" destination="wXl-jv-vC2" id="Z4J-x2-xgU"/>
+                <outlet property="headerBottomLine" destination="7MQ-kJ-8ar" id="LD2-vq-MD6"/>
+                <outlet property="headerBox" destination="yvT-Vr-HYw" id="JJC-0R-pz6"/>
                 <outlet property="languaeBox" destination="0xe-05-6j8" id="GM8-Xz-c6p"/>
+                <outlet property="languageBox" destination="6qO-Xk-6yr" id="bW6-w0-uTt"/>
                 <outlet property="languageButton" destination="Que-YG-sCE" id="Obq-iW-LWJ"/>
                 <outlet property="mergeAllBox" destination="hCw-K3-67H" id="t5s-f5-eUc"/>
                 <outlet property="newPDFBox" destination="n89-YE-ldr" id="4dT-WC-jg5"/>
                 <outlet property="ocrLabel" destination="hyp-2H-elp" id="7wX-ia-0Rp"/>
+                <outlet property="ocrPlan2Box" destination="f7o-yZ-THg" id="AE8-1e-sun"/>
+                <outlet property="ocrPlanBox" destination="f52-b5-1Ge" id="5ZG-fZ-vaS"/>
+                <outlet property="ocrSelectBox" destination="Ivj-XV-tDI" id="fgU-5z-ksd"/>
                 <outlet property="ocrSelectBtn" destination="DvB-9f-Xgt" id="UdG-6d-27f"/>
                 <outlet property="outputTypeLabel" destination="aPB-Pb-64w" id="BBp-lK-MNk"/>
                 <outlet property="planBox" destination="xu7-RV-DKR" id="ihz-bb-VhO"/>
                 <outlet property="planButton" destination="9go-Ka-u3z" id="nxW-wW-rQJ"/>
                 <outlet property="saveAsButton" destination="mXd-Rx-c3O" id="nnV-Rw-wSx"/>
                 <outlet property="selectLanguageLabel" destination="LnK-B0-rGp" id="Lb0-iZ-L6g"/>
+                <outlet property="titleLabel" destination="N3m-4e-rSU" id="X1q-p2-qWf"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
         <customObject id="-3" userLabel="Application" customClass="NSObject"/>
         <customView id="Hz6-mo-xeY">
-            <rect key="frame" x="0.0" y="0.0" width="480" height="436"/>
+            <rect key="frame" x="0.0" y="0.0" width="480" height="566"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aPB-Pb-64w">
-                    <rect key="frame" x="14" y="409" width="42" height="17"/>
+                    <rect key="frame" x="14" y="497" width="42" height="17"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="dr8-xu-eZp">
                         <font key="font" metaFont="systemBold" size="14"/>
                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -46,7 +58,7 @@
                     </textFieldCell>
                 </textField>
                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cYX-Yt-gnO">
-                    <rect key="frame" x="14" y="379" width="148" height="18"/>
+                    <rect key="frame" x="14" y="467" width="148" height="18"/>
                     <buttonCell key="cell" type="radio" title="New PDF Document" bezelStyle="regularSquare" imagePosition="left" alignment="left" state="on" inset="2" id="8NR-LX-ScR">
                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                         <font key="font" metaFont="system"/>
@@ -56,14 +68,14 @@
                     </connections>
                 </button>
                 <button translatesAutoresizingMaskIntoConstraints="NO" id="Sf1-WE-VzB">
-                    <rect key="frame" x="32" y="345" width="87" height="29"/>
+                    <rect key="frame" x="32" y="433" width="87" height="29"/>
                     <buttonCell key="cell" type="check" title="Merge  All" bezelStyle="regularSquare" imagePosition="left" inset="2" id="Gdy-u9-gi5">
                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                         <font key="font" metaFont="system"/>
                     </buttonCell>
                 </button>
                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lwQ-xY-nsX">
-                    <rect key="frame" x="14" y="306" width="225" height="18"/>
+                    <rect key="frame" x="14" y="394" width="225" height="18"/>
                     <buttonCell key="cell" type="radio" title="Append to existing fil or portfolio" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="BMo-hm-pTQ">
                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                         <font key="font" metaFont="system"/>
@@ -73,7 +85,7 @@
                     </connections>
                 </button>
                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="k0c-vv-NPP">
-                    <rect key="frame" x="34" y="279" width="430" height="24"/>
+                    <rect key="frame" x="34" y="367" width="430" height="24"/>
                     <subviews>
                         <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AKV-3R-iGQ">
                             <rect key="frame" x="-1" y="1" width="404" height="22"/>
@@ -123,7 +135,7 @@
                     </connections>
                 </button>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hyp-2H-elp">
-                    <rect key="frame" x="14" y="230" width="35" height="17"/>
+                    <rect key="frame" x="14" y="318" width="35" height="17"/>
                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="OCR" id="SLY-wg-469">
                         <font key="font" metaFont="systemBold" size="14"/>
                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -131,14 +143,14 @@
                     </textFieldCell>
                 </textField>
                 <button translatesAutoresizingMaskIntoConstraints="NO" id="mXd-Rx-c3O">
-                    <rect key="frame" x="32" y="71" width="102" height="18"/>
+                    <rect key="frame" x="32" y="159" width="102" height="18"/>
                     <buttonCell key="cell" type="check" title="Save as TXT" bezelStyle="regularSquare" imagePosition="left" inset="2" id="yMl-Im-6Oy">
                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                         <font key="font" metaFont="system"/>
                     </buttonCell>
                 </button>
-                <button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gJA-ad-BvI">
-                    <rect key="frame" x="440" y="97" width="26" height="26"/>
+                <button hidden="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gJA-ad-BvI">
+                    <rect key="frame" x="440" y="185" width="26" height="26"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="21" id="Mn0-It-ogu"/>
                         <constraint firstAttribute="height" constant="21" id="v6b-Yx-hGX"/>
@@ -152,7 +164,7 @@
                     </connections>
                 </button>
                 <box boxType="custom" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="0xe-05-6j8">
-                    <rect key="frame" x="34" y="99" width="404" height="24"/>
+                    <rect key="frame" x="34" y="187" width="404" height="24"/>
                     <view key="contentView" id="Sfo-EK-dRW">
                         <rect key="frame" x="1" y="1" width="402" height="22"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -182,7 +194,7 @@
                     </constraints>
                 </box>
                 <button translatesAutoresizingMaskIntoConstraints="NO" id="DvB-9f-Xgt">
-                    <rect key="frame" x="14" y="195" width="84" height="18"/>
+                    <rect key="frame" x="14" y="283" width="84" height="18"/>
                     <buttonCell key="cell" type="check" title="OCR Plan" bezelStyle="regularSquare" imagePosition="left" inset="2" id="nDI-6p-sba">
                         <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                         <font key="font" metaFont="system"/>
@@ -192,7 +204,7 @@
                     </connections>
                 </button>
                 <box boxType="custom" cornerRadius="1" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="xu7-RV-DKR">
-                    <rect key="frame" x="34" y="163" width="430" height="24"/>
+                    <rect key="frame" x="34" y="251" width="430" height="24"/>
                     <view key="contentView" id="U53-s6-6nW">
                         <rect key="frame" x="1" y="1" width="428" height="22"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -222,7 +234,7 @@
                     </constraints>
                 </box>
                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="LnK-B0-rGp">
-                    <rect key="frame" x="32" y="131" width="37" height="16"/>
+                    <rect key="frame" x="32" y="219" width="37" height="16"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Pba-1m-xRx">
                         <font key="font" metaFont="system"/>
                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -230,7 +242,7 @@
                     </textFieldCell>
                 </textField>
                 <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="n89-YE-ldr">
-                    <rect key="frame" x="16" y="377" width="448" height="20"/>
+                    <rect key="frame" x="16" y="465" width="448" height="20"/>
                     <view key="contentView" id="crJ-bx-eAh">
                         <rect key="frame" x="1" y="1" width="446" height="18"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -240,7 +252,7 @@
                     </constraints>
                 </box>
                 <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="hCw-K3-67H">
-                    <rect key="frame" x="40" y="349" width="424" height="20"/>
+                    <rect key="frame" x="40" y="437" width="424" height="20"/>
                     <view key="contentView" id="yiI-lc-fK0">
                         <rect key="frame" x="1" y="1" width="422" height="18"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -250,7 +262,7 @@
                     </constraints>
                 </box>
                 <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="HpT-QS-341">
-                    <rect key="frame" x="16" y="311" width="448" height="20"/>
+                    <rect key="frame" x="16" y="399" width="448" height="20"/>
                     <view key="contentView" id="R0v-fU-j7b">
                         <rect key="frame" x="1" y="1" width="446" height="18"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -260,7 +272,7 @@
                     </constraints>
                 </box>
                 <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="ivy-HJ-F2X">
-                    <rect key="frame" x="16" y="271" width="448" height="32"/>
+                    <rect key="frame" x="16" y="359" width="448" height="32"/>
                     <view key="contentView" id="hXZ-UD-kdJ">
                         <rect key="frame" x="1" y="1" width="446" height="30"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -269,54 +281,198 @@
                         <constraint firstAttribute="height" constant="32" id="mDb-QA-Oor"/>
                     </constraints>
                 </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="Ivj-XV-tDI">
+                    <rect key="frame" x="16" y="286" width="448" height="20"/>
+                    <view key="contentView" id="EXi-zS-eDm">
+                        <rect key="frame" x="1" y="1" width="446" height="18"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="axj-MY-ljb"/>
+                    </constraints>
+                </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="6qO-Xk-6yr">
+                    <rect key="frame" x="16" y="246" width="448" height="32"/>
+                    <view key="contentView" id="k0A-6r-Dwg">
+                        <rect key="frame" x="1" y="1" width="446" height="30"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="32" id="zDk-wa-gZE"/>
+                    </constraints>
+                </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="f52-b5-1Ge">
+                    <rect key="frame" x="16" y="206" width="448" height="32"/>
+                    <view key="contentView" id="0Ci-tL-ey8">
+                        <rect key="frame" x="1" y="1" width="446" height="30"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="32" id="cqS-bf-yFu"/>
+                    </constraints>
+                </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="f7o-yZ-THg">
+                    <rect key="frame" x="16" y="174" width="448" height="32"/>
+                    <view key="contentView" id="Wjc-K2-hqV">
+                        <rect key="frame" x="1" y="1" width="446" height="30"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="32" id="JSA-2Y-Xvu"/>
+                    </constraints>
+                </box>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="wXl-jv-vC2">
+                    <rect key="frame" x="16" y="165" width="448" height="1"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="1" id="fL6-p3-0Rf"/>
+                    </constraints>
+                </customView>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="nfj-9v-ZqH">
+                    <rect key="frame" x="16" y="120" width="448" height="32"/>
+                    <view key="contentView" id="uKI-2s-Sl0">
+                        <rect key="frame" x="1" y="1" width="446" height="30"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="32" id="Hfb-Gk-cjx"/>
+                    </constraints>
+                </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="dja-8H-Uup">
+                    <rect key="frame" x="0.0" y="0.0" width="480" height="72"/>
+                    <view key="contentView" id="uX6-hg-iIn">
+                        <rect key="frame" x="1" y="1" width="478" height="70"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="4wO-ha-sYg" customClass="ComponentDivider" customModule="KMComponentLibrary">
+                                <rect key="frame" x="0.0" y="69" width="478" height="1"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="1" id="nJk-GK-xd7"/>
+                                </constraints>
+                            </customView>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="HSI-hW-pYn" customClass="ComponentButton" customModule="KMComponentLibrary">
+                                <rect key="frame" x="16" y="16" width="446" height="38"/>
+                            </customView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstAttribute="trailing" secondItem="HSI-hW-pYn" secondAttribute="trailing" constant="16" id="0Rl-C2-wUp"/>
+                            <constraint firstItem="HSI-hW-pYn" firstAttribute="leading" secondItem="uX6-hg-iIn" secondAttribute="leading" constant="16" id="1qC-Q1-6tY"/>
+                            <constraint firstAttribute="trailing" secondItem="4wO-ha-sYg" secondAttribute="trailing" id="Q74-WU-Vvw"/>
+                            <constraint firstItem="4wO-ha-sYg" firstAttribute="leading" secondItem="uX6-hg-iIn" secondAttribute="leading" id="gNK-sS-DQK"/>
+                            <constraint firstItem="4wO-ha-sYg" firstAttribute="top" secondItem="uX6-hg-iIn" secondAttribute="top" id="hs1-L9-CGh"/>
+                            <constraint firstItem="HSI-hW-pYn" firstAttribute="top" secondItem="uX6-hg-iIn" secondAttribute="top" constant="16" id="l4t-Lg-Wdn"/>
+                            <constraint firstAttribute="bottom" secondItem="HSI-hW-pYn" secondAttribute="bottom" constant="16" id="rv9-Lq-usl"/>
+                        </constraints>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="72" id="L4J-pn-V8v"/>
+                    </constraints>
+                </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="yvT-Vr-HYw">
+                    <rect key="frame" x="0.0" y="526" width="480" height="40"/>
+                    <view key="contentView" id="kWL-fg-PgX">
+                        <rect key="frame" x="1" y="1" width="478" height="38"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="N3m-4e-rSU">
+                                <rect key="frame" x="221" y="11" width="37" height="16"/>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Sym-H3-uOC">
+                                    <font key="font" usesAppearanceFont="YES"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="7MQ-kJ-8ar" customClass="ComponentDivider" customModule="KMComponentLibrary">
+                                <rect key="frame" x="0.0" y="0.0" width="478" height="1"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="1" id="Sby-Oh-ryd"/>
+                                </constraints>
+                            </customView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="7MQ-kJ-8ar" firstAttribute="leading" secondItem="kWL-fg-PgX" secondAttribute="leading" id="1O0-je-ZDP"/>
+                            <constraint firstItem="N3m-4e-rSU" firstAttribute="centerY" secondItem="kWL-fg-PgX" secondAttribute="centerY" id="5d0-dl-3hC"/>
+                            <constraint firstAttribute="trailing" secondItem="7MQ-kJ-8ar" secondAttribute="trailing" id="OU7-cS-TMd"/>
+                            <constraint firstAttribute="bottom" secondItem="7MQ-kJ-8ar" secondAttribute="bottom" id="kag-NF-2g7"/>
+                            <constraint firstItem="N3m-4e-rSU" firstAttribute="centerX" secondItem="kWL-fg-PgX" secondAttribute="centerX" id="x7t-5L-61C"/>
+                        </constraints>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="x7e-jB-MYY"/>
+                    </constraints>
+                </box>
             </subviews>
             <constraints>
                 <constraint firstItem="xu7-RV-DKR" firstAttribute="top" secondItem="DvB-9f-Xgt" secondAttribute="bottom" constant="9" id="4vj-GV-hlg"/>
                 <constraint firstItem="lwQ-xY-nsX" firstAttribute="top" secondItem="Sf1-WE-VzB" secondAttribute="bottom" constant="23" id="6Ma-jA-EeT"/>
                 <constraint firstItem="HkY-4k-ShL" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="89C-67-SEc"/>
+                <constraint firstItem="f7o-yZ-THg" firstAttribute="top" secondItem="f52-b5-1Ge" secondAttribute="bottom" id="8Xt-Pa-Sgd"/>
+                <constraint firstItem="6qO-Xk-6yr" firstAttribute="top" secondItem="Ivj-XV-tDI" secondAttribute="bottom" constant="8" id="8YG-3N-WCa"/>
                 <constraint firstItem="LnK-B0-rGp" firstAttribute="leading" secondItem="xu7-RV-DKR" secondAttribute="leading" id="9x7-70-cgs"/>
+                <constraint firstAttribute="trailing" secondItem="Ivj-XV-tDI" secondAttribute="trailing" constant="16" id="AL5-lm-JS9"/>
+                <constraint firstItem="Ivj-XV-tDI" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="AZw-Ex-mSQ"/>
+                <constraint firstAttribute="trailing" secondItem="dja-8H-Uup" secondAttribute="trailing" id="DPv-In-aGx"/>
+                <constraint firstItem="f7o-yZ-THg" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="DSP-jU-5v6"/>
                 <constraint firstItem="gJA-ad-BvI" firstAttribute="leading" secondItem="0xe-05-6j8" secondAttribute="trailing" constant="5" id="F71-ii-T0z"/>
+                <constraint firstItem="wXl-jv-vC2" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="FXt-Gu-oLI"/>
                 <constraint firstItem="0xe-05-6j8" firstAttribute="leading" secondItem="Sf1-WE-VzB" secondAttribute="leading" id="Ghm-t1-ET6"/>
                 <constraint firstItem="k0c-vv-NPP" firstAttribute="leading" secondItem="Sf1-WE-VzB" secondAttribute="leading" id="INv-ai-ab9"/>
                 <constraint firstItem="0xe-05-6j8" firstAttribute="top" secondItem="LnK-B0-rGp" secondAttribute="bottom" constant="8" id="IbM-ET-fpF"/>
+                <constraint firstAttribute="trailing" secondItem="f7o-yZ-THg" secondAttribute="trailing" constant="16" id="JUv-MP-Y9l"/>
                 <constraint firstAttribute="trailing" secondItem="HpT-QS-341" secondAttribute="trailing" constant="16" id="Liv-T3-5cT"/>
                 <constraint firstItem="Sf1-WE-VzB" firstAttribute="top" secondItem="cYX-Yt-gnO" secondAttribute="bottom" constant="7" id="LkA-nk-5sh"/>
+                <constraint firstItem="nfj-9v-ZqH" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="O8F-CD-d5w"/>
                 <constraint firstItem="hCw-K3-67H" firstAttribute="top" secondItem="n89-YE-ldr" secondAttribute="bottom" constant="8" id="PSB-NV-7Vv"/>
                 <constraint firstAttribute="trailing" secondItem="ivy-HJ-F2X" secondAttribute="trailing" constant="16" id="QLZ-zy-81z"/>
                 <constraint firstItem="ivy-HJ-F2X" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="QWz-1v-vc9"/>
+                <constraint firstItem="dja-8H-Uup" firstAttribute="top" relation="greaterThanOrEqual" secondItem="nfj-9v-ZqH" secondAttribute="bottom" constant="48" id="RhM-Uu-BBI"/>
                 <constraint firstItem="cYX-Yt-gnO" firstAttribute="top" secondItem="aPB-Pb-64w" secondAttribute="bottom" constant="13" id="TeU-vK-ErS"/>
-                <constraint firstItem="aPB-Pb-64w" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="10" id="UbP-Fa-eTV"/>
+                <constraint firstItem="yvT-Vr-HYw" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="USs-od-fj8"/>
+                <constraint firstItem="aPB-Pb-64w" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="52" id="UbP-Fa-eTV"/>
+                <constraint firstAttribute="trailing" secondItem="yvT-Vr-HYw" secondAttribute="trailing" id="VAs-z3-Iqh"/>
+                <constraint firstAttribute="trailing" secondItem="f52-b5-1Ge" secondAttribute="trailing" constant="16" id="VLF-tB-JZU"/>
                 <constraint firstItem="HpT-QS-341" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="VU4-bS-vNC"/>
                 <constraint firstItem="DvB-9f-Xgt" firstAttribute="leading" secondItem="hyp-2H-elp" secondAttribute="leading" id="XyT-9R-eIO"/>
                 <constraint firstAttribute="bottom" secondItem="HkY-4k-ShL" secondAttribute="bottom" constant="20" id="YyJ-nz-wuP"/>
+                <constraint firstAttribute="trailing" secondItem="nfj-9v-ZqH" secondAttribute="trailing" constant="16" id="aOM-Mo-oU4"/>
+                <constraint firstAttribute="trailing" secondItem="wXl-jv-vC2" secondAttribute="trailing" constant="16" id="ajI-ou-mFa"/>
                 <constraint firstItem="gJA-ad-BvI" firstAttribute="centerY" secondItem="0xe-05-6j8" secondAttribute="centerY" id="b5C-zZ-uoa"/>
+                <constraint firstItem="dja-8H-Uup" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="b6T-F7-enh"/>
                 <constraint firstItem="n89-YE-ldr" firstAttribute="top" secondItem="aPB-Pb-64w" secondAttribute="bottom" constant="12" id="bk0-kf-ulW"/>
                 <constraint firstItem="aPB-Pb-64w" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="cm2-wz-AP3"/>
                 <constraint firstAttribute="trailing" secondItem="k0c-vv-NPP" secondAttribute="trailing" constant="16" id="dEN-Bs-9oC"/>
                 <constraint firstItem="xu7-RV-DKR" firstAttribute="trailing" secondItem="k0c-vv-NPP" secondAttribute="trailing" id="ePZ-m2-erM"/>
                 <constraint firstItem="mXd-Rx-c3O" firstAttribute="top" secondItem="0xe-05-6j8" secondAttribute="bottom" constant="11" id="evq-KN-Xwq"/>
+                <constraint firstItem="yvT-Vr-HYw" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="f5F-4S-nh2"/>
                 <constraint firstItem="HpT-QS-341" firstAttribute="top" secondItem="hCw-K3-67H" secondAttribute="bottom" constant="18" id="fkc-6M-xhx"/>
                 <constraint firstItem="xu7-RV-DKR" firstAttribute="leading" secondItem="Sf1-WE-VzB" secondAttribute="leading" id="fyS-0U-CJM"/>
                 <constraint firstItem="LnK-B0-rGp" firstAttribute="top" secondItem="xu7-RV-DKR" secondAttribute="bottom" constant="16" id="g6b-iG-T0X"/>
+                <constraint firstItem="nfj-9v-ZqH" firstAttribute="top" secondItem="mXd-Rx-c3O" secondAttribute="bottom" constant="8" id="gYa-8x-gff"/>
                 <constraint firstAttribute="trailing" secondItem="hCw-K3-67H" secondAttribute="trailing" constant="16" id="gew-aC-Sr2"/>
                 <constraint firstItem="n89-YE-ldr" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="hJr-kb-qE4"/>
+                <constraint firstItem="6qO-Xk-6yr" firstAttribute="top" secondItem="f52-b5-1Ge" secondAttribute="bottom" constant="-72" id="i1G-kk-ozl"/>
                 <constraint firstItem="HkY-4k-ShL" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="jIY-t3-U5D"/>
                 <constraint firstItem="k0c-vv-NPP" firstAttribute="top" secondItem="lwQ-xY-nsX" secondAttribute="bottom" constant="4" id="jUW-x8-4aX"/>
+                <constraint firstItem="wXl-jv-vC2" firstAttribute="top" secondItem="f7o-yZ-THg" secondAttribute="bottom" constant="8" id="jXt-VN-8sG"/>
+                <constraint firstItem="f52-b5-1Ge" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="jru-xm-jbV"/>
                 <constraint firstItem="lwQ-xY-nsX" firstAttribute="leading" secondItem="aPB-Pb-64w" secondAttribute="leading" id="kVr-oh-CY2"/>
                 <constraint firstItem="DvB-9f-Xgt" firstAttribute="top" secondItem="hyp-2H-elp" secondAttribute="bottom" constant="18" id="kxm-lu-bCL"/>
                 <constraint firstItem="hyp-2H-elp" firstAttribute="leading" secondItem="aPB-Pb-64w" secondAttribute="leading" id="mdU-8E-lPS"/>
                 <constraint firstItem="gJA-ad-BvI" firstAttribute="trailing" secondItem="k0c-vv-NPP" secondAttribute="trailing" id="nTH-mg-Z0g"/>
                 <constraint firstItem="hCw-K3-67H" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="40" id="pnQ-vB-MVe"/>
                 <constraint firstItem="hyp-2H-elp" firstAttribute="top" secondItem="k0c-vv-NPP" secondAttribute="bottom" constant="32" id="qP4-2t-rG9"/>
+                <constraint firstAttribute="bottom" secondItem="dja-8H-Uup" secondAttribute="bottom" id="rEm-pS-vKQ"/>
                 <constraint firstItem="mXd-Rx-c3O" firstAttribute="leading" secondItem="0xe-05-6j8" secondAttribute="leading" id="rJ4-0r-4NH"/>
                 <constraint firstItem="HkY-4k-ShL" firstAttribute="top" relation="greaterThanOrEqual" secondItem="mXd-Rx-c3O" secondAttribute="bottom" constant="20" id="rqm-ei-Qo0"/>
                 <constraint firstAttribute="trailing" secondItem="n89-YE-ldr" secondAttribute="trailing" constant="16" id="sNQ-CU-t7j"/>
                 <constraint firstItem="Sf1-WE-VzB" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="34" id="se3-wj-gNP"/>
+                <constraint firstItem="6qO-Xk-6yr" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="16" id="v0b-Qg-CLa"/>
+                <constraint firstAttribute="trailing" secondItem="6qO-Xk-6yr" secondAttribute="trailing" constant="16" id="xzz-Ta-7f4"/>
                 <constraint firstItem="cYX-Yt-gnO" firstAttribute="leading" secondItem="aPB-Pb-64w" secondAttribute="leading" id="yIs-gc-xSI"/>
                 <constraint firstItem="hyp-2H-elp" firstAttribute="top" secondItem="ivy-HJ-F2X" secondAttribute="bottom" constant="24" id="ygA-il-Zjf"/>
                 <constraint firstItem="ivy-HJ-F2X" firstAttribute="top" secondItem="HpT-QS-341" secondAttribute="bottom" constant="8" id="zMh-lw-EYt"/>
+                <constraint firstItem="Ivj-XV-tDI" firstAttribute="top" secondItem="hyp-2H-elp" secondAttribute="bottom" constant="12" id="zg4-S2-2eI"/>
             </constraints>
-            <point key="canvasLocation" x="-141" y="180.5"/>
+            <point key="canvasLocation" x="-141" y="224"/>
         </customView>
     </objects>
     <resources>