Prechádzať zdrojové kódy

【用户反馈】补充用户反馈代码

tangchao 7 mesiacov pred
rodič
commit
beb31b58ce
22 zmenil súbory, kde vykonal 2072 pridanie a 0 odobranie
  1. 16 0
      PDF Office/PDF Master/Class/Common/Category/NSView+KMExtension.swift
  2. 6 0
      PDF Office/PDF Master/Class/Common/KMCommonDefine.swift
  3. 33 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Controller/KMUserFbHelpPopController.swift
  4. 70 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Controller/KMUserFbHelpPopController.xib
  5. 17 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Model/KMUserFbListModel.swift
  6. 21 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.h
  7. 90 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.m
  8. 73 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbDespItemView.swift
  9. 94 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbDespItemView.xib
  10. 80 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbEmailItemView.swift
  11. 77 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbEmailItemView.xib
  12. 50 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbListHeaderItemView.swift
  13. 72 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbListHeaderItemView.xib
  14. 34 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbTypeItemView.swift
  15. 52 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbTypeItemView.xib
  16. 74 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemCellView.swift
  17. 79 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemCellView.xib
  18. 143 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemView.swift
  19. 144 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemView.xib
  20. 492 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Window/KMUserFeekbackWindowController.swift
  21. 153 0
      PDF Office/PDF Master/Class/Tools/UserFeekback/Window/KMUserFeekbackWindowController.xib
  22. 202 0
      PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

+ 16 - 0
PDF Office/PDF Master/Class/Common/Category/NSView+KMExtension.swift

@@ -156,6 +156,22 @@ extension NSView {
         frame.origin = self.window?.convertPoint(toScreen: frame.origin) ?? rect.origin
         return frame
     }
+    
+    func horShakeAnimation() {
+        let ani = CAKeyframeAnimation(keyPath: "position.x")
+        ani.isAdditive = true
+        ani.values = [-15, 15, -10, 10, -8, 8, -6, 6, -4, 4]
+        ani.duration = 1
+        self.layer?.add(ani, forKey: "KMViewHorShakeAnimation")
+    }
+    
+    func horLightShakeAnimation() {
+        let ani = CAKeyframeAnimation(keyPath: "position.x")
+        ani.isAdditive = true
+        ani.values = [-10, 10, -6, 6, -4, 4, -2, 2]
+        ani.duration = 1
+        self.layer?.add(ani, forKey: "KMViewHorShakeAnimation")
+    }
 }
 
 

+ 6 - 0
PDF Office/PDF Master/Class/Common/KMCommonDefine.swift

@@ -75,6 +75,12 @@ public func KMColorPanelCloseIfNeed() {
     }
 }
 
+public func KMValidateEmail(email: String) -> Bool {
+    let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
+    let pred = NSPredicate(format: "SELF MATCHES %@", regex)
+    return pred.evaluate(with: email)
+}
+
 // ColumnID
 
 let kPageColumnId = NSUserInterfaceItemIdentifier(rawValue: "page")

+ 33 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Controller/KMUserFbHelpPopController.swift

@@ -0,0 +1,33 @@
+//
+//  KMUserFbHelpPopController.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/12.
+//
+
+import Cocoa
+
+class KMUserFbHelpPopController: NSViewController {
+    @IBOutlet weak var point1: NSView!
+    @IBOutlet weak var tipLabel1: NSTextField!
+    @IBOutlet weak var point2: NSView!
+    @IBOutlet weak var tipLabel2: NSTextField!
+    
+    convenience init() {
+        self.init(nibName: "KMUserFbHelpPopController", bundle: nil)
+    }
+    
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        
+        for pointV in [self.point1, self.point2] {
+            pointV?.wantsLayer = true
+            pointV?.layer?.cornerRadius = 1.5
+            pointV?.layer?.backgroundColor = .black
+        }
+        
+        self.tipLabel1.stringValue = NSLocalizedString("限制文件大小20M,最高上传10份文件", comment: "")
+        self.tipLabel2.stringValue = NSLocalizedString("不限制文件格式(图片+PDF+Office(Excel/Word/Powerpoint)+TXT+HTML+MP4…)", comment: "")
+    }
+    
+}

+ 70 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Controller/KMUserFbHelpPopController.xib

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMUserFbHelpPopController" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="point1" destination="mJG-Vg-BUf" id="9xr-ZE-rLh"/>
+                <outlet property="point2" destination="AV8-AC-ncz" id="wCK-JG-d1X"/>
+                <outlet property="tipLabel1" destination="atb-Gs-O0X" id="RoE-RD-Ue4"/>
+                <outlet property="tipLabel2" destination="MAv-jZ-qvs" id="GUN-SH-nyf"/>
+                <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="80"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <customView translatesAutoresizingMaskIntoConstraints="NO" id="mJG-Vg-BUf">
+                    <rect key="frame" x="24" y="57" width="3" height="3"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="3" id="Tp9-f0-Mso"/>
+                        <constraint firstAttribute="width" constant="3" id="cxO-Wj-qQ0"/>
+                    </constraints>
+                </customView>
+                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="atb-Gs-O0X">
+                    <rect key="frame" x="31" y="52" width="443" height="16"/>
+                    <textFieldCell key="cell" selectable="YES" title="Multiline Label" id="zmf-qT-fLK">
+                        <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="AV8-AC-ncz">
+                    <rect key="frame" x="24" y="37" width="3" height="3"/>
+                    <constraints>
+                        <constraint firstAttribute="width" constant="3" id="0YU-It-Ue5"/>
+                        <constraint firstAttribute="height" constant="3" id="t0H-oV-l6v"/>
+                    </constraints>
+                </customView>
+                <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="MAv-jZ-qvs">
+                    <rect key="frame" x="31" y="32" width="443" height="16"/>
+                    <textFieldCell key="cell" selectable="YES" title="Multiline Label" id="8Hp-SM-9GW">
+                        <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>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="atb-Gs-O0X" secondAttribute="trailing" constant="8" id="104-No-NxP"/>
+                <constraint firstItem="MAv-jZ-qvs" firstAttribute="top" secondItem="atb-Gs-O0X" secondAttribute="bottom" constant="4" id="1ji-tI-xu2"/>
+                <constraint firstItem="mJG-Vg-BUf" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="3RL-MT-NEE"/>
+                <constraint firstItem="MAv-jZ-qvs" firstAttribute="leading" secondItem="AV8-AC-ncz" secondAttribute="trailing" constant="6" id="3m9-EW-Gqy"/>
+                <constraint firstItem="mJG-Vg-BUf" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="24" id="IaP-v5-ABT"/>
+                <constraint firstItem="AV8-AC-ncz" firstAttribute="top" secondItem="atb-Gs-O0X" secondAttribute="bottom" constant="12" id="Wmg-Ys-r65"/>
+                <constraint firstItem="AV8-AC-ncz" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="24" id="Yic-7U-M9l"/>
+                <constraint firstItem="atb-Gs-O0X" firstAttribute="leading" secondItem="mJG-Vg-BUf" secondAttribute="trailing" constant="6" id="dw7-uu-sT9"/>
+                <constraint firstItem="atb-Gs-O0X" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="12" id="m2x-Cj-orv"/>
+                <constraint firstAttribute="trailing" secondItem="MAv-jZ-qvs" secondAttribute="trailing" constant="8" id="uhU-u0-7yx"/>
+            </constraints>
+            <point key="canvasLocation" x="202" y="99"/>
+        </customView>
+    </objects>
+</document>

+ 17 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Model/KMUserFbListModel.swift

@@ -0,0 +1,17 @@
+//
+//  KMUserFbListModel.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/12.
+//
+
+import Cocoa
+
+class KMUserFbListModel: NSObject {
+    var filePath: String?
+    
+    var fileName: String?
+    var fileSize: Float = 0
+    
+    var fileSizeString: String?
+}

+ 21 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.h

@@ -0,0 +1,21 @@
+//
+//  KMUserFeekbackHanddler.h
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+//@class SKMainWindowController;
+@interface KMUserFeekbackHanddler : NSObject
+
+//@property (nonatomic, weak) SKMainWindowController *mainWindowC;
+
+- (void)addButton;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 90 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Tools/KMUserFeekbackHanddler.m

@@ -0,0 +1,90 @@
+//
+//  KMUserFeekbackHanddler.m
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+#import "KMUserFeekbackHanddler.h"
+//#import "KMHoverButton.h"
+//#import "SKMainWindowController.h"
+//#import "SKApplicationController.h"
+//#import "NSWindow+PopOver.h"
+#import <PDF_Reader_Pro-Swift.h>
+
+@interface KMUserFeekbackHanddler ()
+
+@property (nonatomic, strong) NSPopover *popover_;
+
+@end
+
+@implementation KMUserFeekbackHanddler
+
+- (void)addButton {
+//    KMHoverButton *btn = [[KMHoverButton alloc] init];
+//    CGFloat btnWH = 16;
+//    CGFloat btnMargin = 8;
+//    CGFloat btnX = self.mainWindowC.window.contentView.frame.size.width-btnWH-btnMargin;
+//    CGFloat btnY = self.mainWindowC.window.contentView.frame.size.height-btnWH-btnMargin;
+//    btn.frame = NSMakeRect(btnX, btnY, btnWH, btnWH);
+//    [self.mainWindowC.window.contentView addSubview:btn];
+//    btn.autoresizingMask = NSViewMinXMargin | NSViewMinYMargin;
+//    btn.bordered = false;
+//    btn.title = @"";
+//    btn.image = [NSImage imageNamed:@"KMImageNameUserFeekbackIcon"];
+//
+//    __weak typeof (self) weakSelf = self;
+//    btn.hoverAction = ^(KMHoverButton * _Nonnull button, KMHoverAction action) {
+//        if (action == KMHoverActionEnter) {
+//            [weakSelf showUserFackBackPopView:button];
+//        } else if (action == KMHoverActionExit) {
+////            [weakSelf.popover_ close];
+//        }
+//    };
+}
+
+- (void)showUserFackBackPopView:(NSButton *)sender {
+//    NSArray *datas = @[NSLocalizedString(@"Report a Bug", @""), NSLocalizedString(@"Propose a New Feature", @""), @"KMHorizontalLine", NSLocalizedString(@"Quick Start Guide", @"")];
+//    KMNewHomePopViewController *vc = [[KMNewHomePopViewController alloc] initWithNibName:@"KMNewHomePopViewController" bundle:nil];
+//    [vc initWithPopViewDataArr:datas];
+//
+//    __weak typeof (self) weakSelf = self;
+//    vc.downCallback = ^(BOOL result, NSString * _Nonnull data) {
+//        [weakSelf.popover_ close];
+//
+//        NSInteger idx = [datas indexOfObject:data];
+//        if (idx == 3) {
+//            SKApplicationController *delegate = NSApplication.sharedApplication.delegate;
+//            [delegate quickStartGuide:nil];
+//            return;
+//        } else if (idx == 1) {
+//            [weakSelf showFeekbackWindowWithType:NSLocalizedString(@"Propose a New Feature", @"")];
+//        } else if (idx == 0) {
+//            [weakSelf showFeekbackWindowWithType:NSLocalizedString(@"Report a Bug", @"")];
+//        }
+//    };
+//
+//    NSPopover *popover = [[NSPopover alloc] init];
+//    popover.contentViewController = vc;
+//    popover.animates = YES;
+//    popover.behavior = NSPopoverBehaviorSemitransient;
+//    [popover setValue:@(true) forKey:@"shouldHideAnchor"];
+//
+//    CGRect sourcesRect = sender.bounds;
+//    sourcesRect = [sender convertRect:sourcesRect toView:nil];
+//    sourcesRect.origin.y-= 20;
+//    sourcesRect.size.height+=20;
+//    self.mainWindowC.window.popover = popover;
+//    self.mainWindowC.window.sourcesRect = sourcesRect;
+//
+//    [popover showRelativeToRect:sender.bounds ofView:sender preferredEdge:CGRectMaxYEdge];
+//    self.popover_ = popover;
+}
+
+- (void)showFeekbackWindowWithType:(NSString *)type {
+    KMUserFeekbackWindowController *winC = [KMUserFeekbackWindowController shared];
+    winC.typeString = type;
+    [winC showWindow:nil];
+}
+
+@end

+ 73 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbDespItemView.swift

@@ -0,0 +1,73 @@
+//
+//  KMUserFbDespItemView.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+import Cocoa
+
+class KMUserFbDespItemView: NSView, NibLoadable {
+    @IBOutlet weak var titleLabel: NSTextField!
+    @IBOutlet weak var box: NSBox!
+    @IBOutlet weak var scrollView: NSScrollView!
+    @IBOutlet var textView: NSTextView!
+    @IBOutlet weak var tipLabel: NSTextField!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        let title = NSLocalizedString("Describe Problem", comment: "")
+        let attri = NSMutableAttributedString(string: title)
+        attri.addAttribute(.font, value: NSFont.systemFont(ofSize: 13), range: NSMakeRange(0, title.count))
+        
+        attri.append(.init(string: "*", attributes: [NSAttributedString.Key.font : NSFont.systemFont(ofSize: 13), NSAttributedString.Key.foregroundColor : NSColor(red: 250/255.0, green: 31/255.0, blue: 93/255.0, alpha: 1.0)]))
+        
+        self.titleLabel.attributedStringValue = attri
+        
+        self.textView.textContainerInset = NSSize(width: 6, height: 6)
+        self.textView.km_placeholderString = NSLocalizedString("Please tell us the details so that we can help you faster", comment: "")
+        self.textView.delegate = self
+        
+        self.box.borderWidth = 0.5
+        self.box.cornerRadius = 5
+        self.box.borderColor = NSColor(white: 0, alpha: 0.08)
+//        self.textView.font = [NSFont systemFontOfSize:12];
+//        self.textView.textColor = [NSColor colorWithRed:81/255.f green:91/255.f blue:117/255.f alpha:1.f];
+        self.textView.enclosingScrollView?.wantsLayer = true
+        self.textView.enclosingScrollView?.borderType = .noBorder
+        self.textView.enclosingScrollView?.layer?.cornerRadius = 5
+        self.textView.enclosingScrollView?.layer?.masksToBounds = true
+        self.textView.isRichText = false
+        
+        self.tipLabel.stringValue = NSLocalizedString("请填写详情", comment: "")
+        self.tipLabel.textColor = NSColor.km_init(hex: "#FA1E5D")
+        self.tipLabel.font = NSFont(name: "SFProText-Regular", size: 11)
+        self.tipLabel.isHidden = true
+    }
+    
+    func string() -> String {
+        return self.textView.string
+    }
+    
+    func showTip() {
+        self.window?.makeFirstResponder(self.textView)
+        self.box.horLightShakeAnimation()
+        
+        self.tipLabel.isHidden = false
+    }
+    
+    func hiddenTip() {
+        self.tipLabel.isHidden = true
+    }
+}
+
+extension KMUserFbDespItemView: NSTextViewDelegate {
+    func textDidChange(_ notification: Notification) {
+        if self.textView.isEqual(to: notification.object) {
+            self.hiddenTip()
+            
+            self.textView.placeholderLabel.isHidden = self.textView.string.count > 0
+        }
+    }
+}

+ 94 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbDespItemView.xib

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMUserFbDespItemView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="140"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pYn-0E-l1i">
+                    <rect key="frame" x="28" y="124" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="7wX-ft-usP">
+                        <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>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="RkF-02-STa">
+                    <rect key="frame" x="30" y="16" width="420" height="102"/>
+                    <view key="contentView" id="OZl-38-fQA">
+                        <rect key="frame" x="1" y="1" width="418" height="100"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <scrollView borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Q4J-wz-Cdf">
+                                <rect key="frame" x="0.0" y="0.0" width="418" height="100"/>
+                                <clipView key="contentView" drawsBackground="NO" id="wVR-pl-eKK">
+                                    <rect key="frame" x="0.0" y="0.0" width="418" height="100"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <textView importsGraphics="NO" richText="NO" verticallyResizable="YES" spellingCorrection="YES" smartInsertDelete="YES" id="m9b-g4-lPH">
+                                            <rect key="frame" x="0.0" y="0.0" width="418" height="100"/>
+                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            <size key="minSize" width="418" height="100"/>
+                                            <size key="maxSize" width="478" height="10000000"/>
+                                            <color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
+                                        </textView>
+                                    </subviews>
+                                </clipView>
+                                <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Xvo-fW-bc7">
+                                    <rect key="frame" x="-100" y="-100" width="240" height="16"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                </scroller>
+                                <scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="TcD-S5-VmA">
+                                    <rect key="frame" x="402" y="0.0" width="16" height="100"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                </scroller>
+                            </scrollView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstAttribute="bottom" secondItem="Q4J-wz-Cdf" secondAttribute="bottom" id="QmK-H7-DNJ"/>
+                            <constraint firstItem="Q4J-wz-Cdf" firstAttribute="top" secondItem="OZl-38-fQA" secondAttribute="top" id="a8f-5Z-heP"/>
+                            <constraint firstAttribute="trailing" secondItem="Q4J-wz-Cdf" secondAttribute="trailing" id="dzg-Gm-2xx"/>
+                            <constraint firstItem="Q4J-wz-Cdf" firstAttribute="leading" secondItem="OZl-38-fQA" secondAttribute="leading" id="vO2-rW-c5c"/>
+                        </constraints>
+                    </view>
+                </box>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6UM-AH-hc8">
+                    <rect key="frame" x="28" y="0.0" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="QAJ-ir-eWQ">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="RkF-02-STa" secondAttribute="bottom" constant="16" id="54o-VG-GuU"/>
+                <constraint firstItem="RkF-02-STa" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="30" id="7mH-IP-utT"/>
+                <constraint firstItem="pYn-0E-l1i" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="30" id="WD0-IL-wUb"/>
+                <constraint firstItem="pYn-0E-l1i" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="duQ-fK-o5c"/>
+                <constraint firstAttribute="trailing" secondItem="RkF-02-STa" secondAttribute="trailing" constant="30" id="hSH-sZ-0iO"/>
+                <constraint firstItem="6UM-AH-hc8" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="30" id="kY1-9x-qWN"/>
+                <constraint firstItem="6UM-AH-hc8" firstAttribute="top" secondItem="RkF-02-STa" secondAttribute="bottom" id="qFS-qQ-ZKH"/>
+                <constraint firstItem="RkF-02-STa" firstAttribute="top" secondItem="pYn-0E-l1i" secondAttribute="bottom" constant="6" id="y7a-iJ-7M8"/>
+            </constraints>
+            <connections>
+                <outlet property="box" destination="RkF-02-STa" id="569-Gw-h78"/>
+                <outlet property="scrollView" destination="Q4J-wz-Cdf" id="hXN-WG-d4n"/>
+                <outlet property="textView" destination="m9b-g4-lPH" id="7sF-JF-Dz2"/>
+                <outlet property="tipLabel" destination="6UM-AH-hc8" id="Fnc-4n-85m"/>
+                <outlet property="titleLabel" destination="pYn-0E-l1i" id="0Xs-Vq-UMn"/>
+            </connections>
+            <point key="canvasLocation" x="121" y="130"/>
+        </customView>
+    </objects>
+</document>

+ 80 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbEmailItemView.swift

@@ -0,0 +1,80 @@
+//
+//  KMUserFbEmailItemView.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+import Cocoa
+
+class KMUserFbEmailItemView: NSView, NibLoadable {
+    @IBOutlet weak var titleLabel: NSTextField!
+    @IBOutlet weak var box: NSBox!
+    @IBOutlet weak var textfiled: KMTextField!
+    @IBOutlet weak var tipLabel: NSTextField!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        let title = NSLocalizedString("Email", comment: "")
+        let attri = NSMutableAttributedString(string: title)
+        attri.addAttribute(.font, value: NSFont.systemFont(ofSize: 13), range: NSMakeRange(0, title.count))
+        
+        attri.append(.init(string: "*", attributes: [NSAttributedString.Key.font : NSFont.systemFont(ofSize: 13), NSAttributedString.Key.foregroundColor : NSColor(red: 250/255.0, green: 31/255.0, blue: 93/255.0, alpha: 1.0)]))
+        
+        self.titleLabel.attributedStringValue = attri
+        
+        self.box.borderWidth = 0
+//        self.box.borderColor = NSColor(white: 0, alpha: 0.2)
+//        self.box.fillColor = .white
+        self.textfiled.drawsBackground = false
+//        self.textfiled.isBordered = false
+//        self.textfiled.focusRingType = .none
+        self.textfiled.placeholderString = NSLocalizedString("Your email", comment: "")
+        self.textfiled.delegate = self
+        self.textfiled.wantsLayer = true
+        self.textfiled.layer?.cornerRadius = 4
+        self.textfiled.layer?.masksToBounds = true
+        
+//        self.textfiled.firstResponderHandler = { [weak self] result in
+//            self?.box.borderColor = NSColor(red: 140/255.0, green: 131/255.0, blue: 1.0, alpha: 1.0)
+//        }
+        
+        
+        self.tipLabel.textColor = NSColor.km_init(hex: "#FA1E5D")
+        self.tipLabel.font = NSFont(name: "SFProText-Regular", size: 11)
+        self.tipLabel.isHidden = true
+    }
+    
+    func string() -> String {
+        return self.textfiled.stringValue
+    }
+    
+    func showTip(label: String) {
+        self.window?.makeFirstResponder(self.textfiled)
+        self.box.horLightShakeAnimation()
+        
+        self.tipLabel.stringValue = label
+        self.tipLabel.isHidden = false
+    }
+    
+    func hiddenTip() {
+        self.tipLabel.isHidden = true
+    }
+}
+
+extension KMUserFbEmailItemView: NSTextFieldDelegate {
+    
+    func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool {
+        return true
+    }
+    
+    func controlTextDidBeginEditing(_ obj: Notification) {
+        
+    }
+    func controlTextDidChange(_ obj: Notification) {
+        if self.textfiled.isEqual(to: obj.object) {
+            self.hiddenTip()
+        }
+    }
+}

+ 77 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbEmailItemView.xib

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMUserFbEmailItemView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="60"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fFX-d7-VWw">
+                    <rect key="frame" x="28" y="44" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="8Tc-g1-9Gi">
+                        <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>
+                <box boxType="custom" cornerRadius="4" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="fMn-26-xu3">
+                    <rect key="frame" x="30" y="20" width="420" height="20"/>
+                    <view key="contentView" id="m9Z-kC-ctb">
+                        <rect key="frame" x="1" y="1" width="418" height="18"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mmN-9S-e4l" customClass="KMTextField" customModule="PDF_Reader_Pro" customModuleProvider="target">
+                                <rect key="frame" x="0.0" y="0.0" width="418" height="18"/>
+                                <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" id="OPr-CN-yat">
+                                    <font key="font" usesAppearanceFont="YES"/>
+                                    <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                        </subviews>
+                        <constraints>
+                            <constraint firstAttribute="trailing" secondItem="mmN-9S-e4l" secondAttribute="trailing" id="Lik-7D-jyS"/>
+                            <constraint firstItem="mmN-9S-e4l" firstAttribute="top" secondItem="m9Z-kC-ctb" secondAttribute="top" id="ay3-00-F4e"/>
+                            <constraint firstAttribute="bottom" secondItem="mmN-9S-e4l" secondAttribute="bottom" id="gGM-oi-dRq"/>
+                            <constraint firstItem="mmN-9S-e4l" firstAttribute="leading" secondItem="m9Z-kC-ctb" secondAttribute="leading" id="hAe-x8-ryr"/>
+                        </constraints>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="20" id="Irp-qF-OUU"/>
+                    </constraints>
+                </box>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qTt-uh-SiE">
+                    <rect key="frame" x="28" y="4" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="0Od-37-fVG">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+            </subviews>
+            <constraints>
+                <constraint firstItem="fFX-d7-VWw" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="9Ip-IM-mQV"/>
+                <constraint firstItem="fMn-26-xu3" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="30" id="BJ7-k9-SKw"/>
+                <constraint firstItem="fMn-26-xu3" firstAttribute="top" secondItem="fFX-d7-VWw" secondAttribute="bottom" constant="4" id="MOQ-2a-4o0"/>
+                <constraint firstAttribute="trailing" secondItem="fMn-26-xu3" secondAttribute="trailing" constant="30" id="ZuU-3s-R9E"/>
+                <constraint firstItem="fFX-d7-VWw" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="30" id="awp-2U-Tel"/>
+                <constraint firstItem="qTt-uh-SiE" firstAttribute="top" secondItem="fMn-26-xu3" secondAttribute="bottom" id="dOD-Vx-kGX"/>
+                <constraint firstItem="qTt-uh-SiE" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="30" id="qsi-cQ-t2R"/>
+            </constraints>
+            <connections>
+                <outlet property="box" destination="fMn-26-xu3" id="8yN-Dc-YKW"/>
+                <outlet property="textfiled" destination="mmN-9S-e4l" id="S8r-Sp-49R"/>
+                <outlet property="tipLabel" destination="qTt-uh-SiE" id="K0o-f8-BIZ"/>
+                <outlet property="titleLabel" destination="fFX-d7-VWw" id="cpv-XC-F8h"/>
+            </connections>
+            <point key="canvasLocation" x="-24" y="-52"/>
+        </customView>
+    </objects>
+</document>

+ 50 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbListHeaderItemView.swift

@@ -0,0 +1,50 @@
+//
+//  KMUserFbListHeaderItemView.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+import Cocoa
+
+class KMUserFbListHeaderItemView: NSView, NibLoadable {
+    @IBOutlet weak var checkButton: NSButton!
+    @IBOutlet weak var lineView: NSBox!
+    @IBOutlet weak var label: NSTextField!
+    @IBOutlet weak var helpButton: KMCoverButton!
+    @IBOutlet weak var addButton: NSButton!
+    
+    var itemClick: ((_ idx: Int)->Void)?
+    var helpHoverCallback: ((_ action: KMCoverAction)->Void)?
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.checkButton.title = NSLocalizedString("With the log file", comment: "")
+        self.checkButton.target = self
+        self.checkButton.action = #selector(_checkButtonAction)
+        
+        self.label.stringValue = NSLocalizedString("添加或删除文档", comment: "")
+        self.helpButton.target = self
+        self.helpButton.action = #selector(_helpButtonAction)
+        self.helpButton.coverAction = {[weak self] button, action in
+            self?.helpHoverCallback?(action)
+        }
+        
+        self.addButton.title = NSLocalizedString("+ Add Files...", comment: "")
+        self.addButton.target = self
+        self.addButton.action = #selector(_addButtonAction)
+    }
+    
+    @objc private func _checkButtonAction() {
+        self.itemClick?(1)
+    }
+    
+    @objc private func _helpButtonAction() {
+        self.itemClick?(2)
+    }
+    
+    @objc private func _addButtonAction() {
+        self.itemClick?(3)
+    }
+}

+ 72 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbListHeaderItemView.xib

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMUserFbListHeaderItemView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="70"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RKA-wn-mvX">
+                    <rect key="frame" x="-2" y="53" width="65" height="18"/>
+                    <buttonCell key="cell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="iKV-6n-n2e">
+                        <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="8HF-ce-Fcd">
+                    <rect key="frame" x="0.0" y="33" width="480" height="5"/>
+                </box>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oFe-Ma-UNb">
+                    <rect key="frame" x="-2" y="4" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Vmr-ld-t6V">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                    </textFieldCell>
+                </textField>
+                <button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cfe-1a-esp" customClass="KMHoverButton">
+                    <rect key="frame" x="36" y="-2" width="25" height="25"/>
+                    <buttonCell key="cell" type="help" bezelStyle="helpButton" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="D1C-Za-1Nd">
+                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="crE-40-uN2">
+                    <rect key="frame" x="410" y="-5" width="75" height="32"/>
+                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="gyi-kg-Zlm">
+                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                        <font key="font" metaFont="system"/>
+                    </buttonCell>
+                </button>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="bottom" secondItem="oFe-Ma-UNb" secondAttribute="bottom" constant="4" id="10j-RN-9e5"/>
+                <constraint firstItem="oFe-Ma-UNb" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="1Fj-92-On9"/>
+                <constraint firstItem="8HF-ce-Fcd" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="69f-Ii-g6E"/>
+                <constraint firstItem="RKA-wn-mvX" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="EUN-pI-YaN"/>
+                <constraint firstAttribute="trailing" secondItem="crE-40-uN2" secondAttribute="trailing" constant="2" id="JWn-rf-yhZ"/>
+                <constraint firstAttribute="bottom" secondItem="crE-40-uN2" secondAttribute="bottom" constant="2" id="Jea-En-OkG"/>
+                <constraint firstItem="RKA-wn-mvX" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="L4U-m1-YOM"/>
+                <constraint firstItem="cfe-1a-esp" firstAttribute="leading" secondItem="oFe-Ma-UNb" secondAttribute="trailing" constant="6" id="cSX-LP-8jl"/>
+                <constraint firstItem="8HF-ce-Fcd" firstAttribute="top" secondItem="RKA-wn-mvX" secondAttribute="bottom" constant="18" id="cf8-tp-2JV"/>
+                <constraint firstItem="cfe-1a-esp" firstAttribute="centerY" secondItem="oFe-Ma-UNb" secondAttribute="centerY" id="dYm-KG-DSW"/>
+                <constraint firstAttribute="trailing" secondItem="8HF-ce-Fcd" secondAttribute="trailing" id="egl-bT-EwN"/>
+            </constraints>
+            <connections>
+                <outlet property="addButton" destination="crE-40-uN2" id="isN-Cc-UXU"/>
+                <outlet property="checkButton" destination="RKA-wn-mvX" id="7gg-UM-I1l"/>
+                <outlet property="helpButton" destination="cfe-1a-esp" id="bE6-8v-gcj"/>
+                <outlet property="label" destination="oFe-Ma-UNb" id="pii-cQ-I9a"/>
+                <outlet property="lineView" destination="8HF-ce-Fcd" id="SHl-ek-iwx"/>
+            </connections>
+            <point key="canvasLocation" x="116" y="114"/>
+        </customView>
+    </objects>
+</document>

+ 34 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbTypeItemView.swift

@@ -0,0 +1,34 @@
+//
+//  KMUserFbTypeItemView.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+import Cocoa
+
+class KMUserFbTypeItemView: NSView, NibLoadable {
+    @IBOutlet weak var titleLabel: NSTextField!
+    @IBOutlet weak var comBoBox: NSComboBox!
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        let title = NSLocalizedString("Problem Type", comment: "")
+        let attri = NSMutableAttributedString(string: title)
+        attri.addAttribute(.font, value: NSFont.systemFont(ofSize: 13), range: NSMakeRange(0, title.count))
+        
+        attri.append(.init(string: "*", attributes: [NSAttributedString.Key.font : NSFont.systemFont(ofSize: 13), NSAttributedString.Key.foregroundColor : NSColor(red: 250/255.0, green: 31/255.0, blue: 93/255.0, alpha: 1.0)]))
+        
+        self.titleLabel.attributedStringValue = attri
+        
+        self.comBoBox.isEditable = false
+        self.comBoBox.removeAllItems()
+        self.comBoBox.addItems(withObjectValues: [NSLocalizedString("Feedback", comment: ""), NSLocalizedString("Report a Bug", comment: ""), NSLocalizedString("Propose a New Feature", comment: ""), NSLocalizedString("General Questions", comment: ""), NSLocalizedString("Other", comment: "")])
+    }
+    
+    func string() -> String {
+        return self.comBoBox.stringValue
+    }
+    
+}

+ 52 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserFbTypeItemView.xib

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMUserFbTypeItemView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="44"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3No-Wu-yWQ">
+                    <rect key="frame" x="-2" y="28" width="37" height="16"/>
+                    <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Qxr-OI-yhy">
+                        <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>
+                <comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="29f-Ge-jzM">
+                    <rect key="frame" x="0.0" y="-4" width="483" height="25"/>
+                    <comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" numberOfVisibleItems="5" id="Nz9-PX-pKI">
+                        <font key="font" metaFont="system"/>
+                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                        <objectValues>
+                            <string>Item 1</string>
+                            <string>Item 2</string>
+                            <string>Item 3</string>
+                        </objectValues>
+                    </comboBoxCell>
+                </comboBox>
+            </subviews>
+            <constraints>
+                <constraint firstItem="29f-Ge-jzM" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="Ln4-VI-Zu5"/>
+                <constraint firstAttribute="trailing" secondItem="29f-Ge-jzM" secondAttribute="trailing" id="gF3-JT-H6q"/>
+                <constraint firstAttribute="bottom" secondItem="29f-Ge-jzM" secondAttribute="bottom" id="hnl-h7-ua8"/>
+                <constraint firstItem="3No-Wu-yWQ" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="qTu-ud-gwx"/>
+                <constraint firstItem="3No-Wu-yWQ" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="vjw-O8-9ry"/>
+            </constraints>
+            <connections>
+                <outlet property="comBoBox" destination="29f-Ge-jzM" id="FlL-Fq-ZfB"/>
+                <outlet property="titleLabel" destination="3No-Wu-yWQ" id="Df8-Qh-YFX"/>
+            </connections>
+            <point key="canvasLocation" x="27" y="-36"/>
+        </customView>
+    </objects>
+</document>

+ 74 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemCellView.swift

@@ -0,0 +1,74 @@
+//
+//  KMUserListItemCellView.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/12.
+//
+
+import Cocoa
+
+class KMUserListItemCellView: NSTableCellView, NibLoadable {
+    @IBOutlet weak var box: NSBox!
+    @IBOutlet weak var button: KMCoverButton!
+    @IBOutlet weak var fileNameLabel: NSTextField!
+    @IBOutlet weak var fileSizeLabel: NSTextField!
+    
+    var itemClick: ((_ idx: Int)->Void)?
+    
+    private var area_: NSTrackingArea?
+    
+    deinit {
+        Swift.debugPrint("KMUserListItemCellView deinit.")
+        
+        if let data = self.area_ {
+            self.removeTrackingArea(data)
+        }
+    }
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.box.borderWidth = 0
+        
+        self.button.imagePosition = .imageOnly
+        self.button.image = NSImage(named: "KMImageNameUserFbDeleteIcon")
+        
+        self.button.target = self
+        self.button.action = #selector(_buttonClick)
+        self.button.coverAction = { button, action in
+            if action.rawValue == 0 {
+                button.image = NSImage(named: "KMImageNameUserFbDeleteHoverIcon")
+            } else if action.rawValue == 2 {
+                button.image = NSImage(named: "KMImageNameUserFbDeleteIcon")
+            }
+        }
+    }
+    
+    @objc private func _buttonClick() {
+        self.itemClick?(1)
+    }
+    
+    override func updateTrackingAreas() {
+        super.updateTrackingAreas()
+        
+        if let _area = self.area_, _area.rect.isEmpty == false {
+            if (_area.rect.equalTo(self.bounds)) {
+                return
+            }
+        }
+        
+        if let data = self.area_ {
+            self.removeTrackingArea(data)
+        }
+        self.area_ = NSTrackingArea(rect: self.bounds, options: [.mouseEnteredAndExited, .mouseMoved, .activeAlways], owner: self)
+        self.addTrackingArea(self.area_!)
+    }
+    
+    override func mouseEntered(with event: NSEvent) {
+        self.box.fillColor = NSColor(white: 0, alpha: 0.05)
+    }
+    
+    override func mouseExited(with event: NSEvent) {
+        self.box.fillColor = .clear
+    }
+}

+ 79 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemCellView.xib

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMUserListItemCellView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="20"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="YpN-4P-cMt">
+                    <rect key="frame" x="0.0" y="0.0" width="480" height="20"/>
+                    <view key="contentView" id="PZV-qg-vjB">
+                        <rect key="frame" x="1" y="1" width="478" height="18"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6tI-QJ-kgI" customClass="KMHoverButton">
+                                <rect key="frame" x="4" y="1" width="16" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="16" id="evS-Jq-L2V"/>
+                                    <constraint firstAttribute="height" constant="16" id="tMk-gj-Ts5"/>
+                                </constraints>
+                                <buttonCell key="cell" type="bevel" title="Button" bezelStyle="regularSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="S0f-hu-NjV">
+                                    <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                    <font key="font" metaFont="system"/>
+                                </buttonCell>
+                            </button>
+                            <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="A6a-NW-Hba">
+                                <rect key="frame" x="22" y="1" width="204" height="16"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="200" id="idK-82-EDV"/>
+                                </constraints>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="U0w-kk-6zo">
+                                    <font key="font" metaFont="system"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                            <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UAn-th-cPB">
+                                <rect key="frame" x="431" y="1" width="37" height="16"/>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="DLd-A3-3vf">
+                                    <font key="font" metaFont="system"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="6tI-QJ-kgI" firstAttribute="leading" secondItem="PZV-qg-vjB" secondAttribute="leading" constant="4" id="CJs-MW-aK8"/>
+                            <constraint firstItem="UAn-th-cPB" firstAttribute="centerY" secondItem="PZV-qg-vjB" secondAttribute="centerY" id="CVf-1D-2GC"/>
+                            <constraint firstItem="A6a-NW-Hba" firstAttribute="centerY" secondItem="6tI-QJ-kgI" secondAttribute="centerY" id="SA8-2x-d64"/>
+                            <constraint firstAttribute="trailing" secondItem="UAn-th-cPB" secondAttribute="trailing" constant="12" id="fHw-6d-XoI"/>
+                            <constraint firstItem="A6a-NW-Hba" firstAttribute="leading" secondItem="6tI-QJ-kgI" secondAttribute="trailing" constant="4" id="fKn-nA-yiE"/>
+                            <constraint firstItem="6tI-QJ-kgI" firstAttribute="centerY" secondItem="PZV-qg-vjB" secondAttribute="centerY" id="lJ7-7A-VUA"/>
+                        </constraints>
+                    </view>
+                </box>
+            </subviews>
+            <constraints>
+                <constraint firstItem="YpN-4P-cMt" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="Jwl-DM-xWU"/>
+                <constraint firstAttribute="trailing" secondItem="YpN-4P-cMt" secondAttribute="trailing" id="Ub2-h2-bWB"/>
+                <constraint firstAttribute="bottom" secondItem="YpN-4P-cMt" secondAttribute="bottom" id="fnm-Wh-A5W"/>
+                <constraint firstItem="YpN-4P-cMt" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="z5w-uO-nEo"/>
+            </constraints>
+            <connections>
+                <outlet property="box" destination="YpN-4P-cMt" id="hpg-8Q-NPP"/>
+                <outlet property="button" destination="6tI-QJ-kgI" id="g8v-Iv-pez"/>
+                <outlet property="fileNameLabel" destination="A6a-NW-Hba" id="NwV-F8-Dl1"/>
+                <outlet property="fileSizeLabel" destination="UAn-th-cPB" id="gn4-ay-gRi"/>
+            </connections>
+            <point key="canvasLocation" x="39" y="154"/>
+        </customView>
+    </objects>
+</document>

+ 143 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemView.swift

@@ -0,0 +1,143 @@
+//
+//  KMUserListItemView.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+import Cocoa
+
+class KMUserListItemView: NSView, NibLoadable {
+    @IBOutlet weak var box: NSBox!
+    @IBOutlet weak var scrollView: NSScrollView!
+    @IBOutlet weak var tableView: NSTableView!
+    
+    @IBOutlet weak var boxTopConst: NSLayoutConstraint!
+
+    @IBOutlet weak var tipBox: NSBox!
+    @IBOutlet weak var tipIv: NSImageView!
+    @IBOutlet weak var tipLabel: NSTextField!
+    
+    var validateDropCallback: ((_ info: NSDraggingInfo, _ row: Int, _ dropOperation: NSTableView.DropOperation)->NSDragOperation)?
+    var acceptDropCallback: ((_ info: NSDraggingInfo, _ row: Int, _ dropOperation: NSTableView.DropOperation)->Bool)?
+    
+    var datas: [KMUserFbListModel] = [] {
+        didSet {
+            self.wantsLayer = true
+            self.layer?.borderWidth = 1
+            if self.datas.isEmpty {
+                self.layer?.backgroundColor = .clear
+                self.layer?.borderColor = .clear
+                self.layer?.cornerRadius = 0
+            } else {
+                self.layer?.backgroundColor = NSColor(white: 0, alpha: 0.05).cgColor
+                self.layer?.borderColor = NSColor(white: 0, alpha: 0.05).cgColor
+                self.layer?.cornerRadius = 4
+            }
+            
+            self.tableView.reloadData()
+        }
+    }
+    
+    var itemClick: ((_ idx: Int, _ param: Any?)->Void)?
+    
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        
+        self.box.borderWidth = 0
+        
+        self.tableView.delegate = self
+        self.tableView.dataSource = self
+        self.tableView.rowHeight = 20
+        self.tableView.register(.init(nibNamed: "KMUserListItemCellView", bundle: nil), forIdentifier: .init("KMUserListItemCellView"))
+//        self.tableView.enclosingScrollView.
+        self.tableView.enclosingScrollView?.wantsLayer = true
+        self.tableView.enclosingScrollView?.borderType = .noBorder
+//        self.tableView.enclosingScrollView?.layer?.cornerRadius = 5
+//        self.tableView.enclosingScrollView?.layer?.masksToBounds = true
+        self.tableView.enclosingScrollView?.drawsBackground = false
+        self.tableView.enclosingScrollView?.backgroundColor = .clear
+        self.tableView.enclosingScrollView?.layer?.backgroundColor = .clear
+        self.tableView.backgroundColor = .clear
+        self.tableView.registerForDraggedTypes([.fileURL])
+        
+        self.tipBox.borderWidth = 0
+        self.tipBox.cornerRadius = 0
+        self.tipBox.fillColor = NSColor.km_init(hex: "#FEE4EC")
+        self.tipIv.image = NSImage(named: "KMImageNameUserFbFileSizeTipIcon")
+        self.tipLabel.stringValue = NSLocalizedString("添加失败:附件大小不能超过20M", comment: "")
+        self.tipBox.isHidden = true
+    }
+    
+    func showTip() {
+        self.boxTopConst.animator().constant = 30
+        DispatchQueue.main.async {
+            self.tipBox.isHidden = false
+        }
+    }
+    
+    func hiddenTip() {
+        self.boxTopConst.animator().constant = 0
+        DispatchQueue.main.async {
+            self.tipBox.isHidden = true
+        }
+    }
+}
+
+extension KMUserListItemView: NSTableViewDelegate, NSTableViewDataSource {
+    func numberOfRows(in tableView: NSTableView) -> Int {
+        return self.datas.count
+    }
+    
+    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
+        var cell = tableView.makeView(withIdentifier: .init("KMUserListItemCellView"), owner: self)
+        if cell == nil {
+            cell = KMUserListItemCellView.createFromNib()
+//            cell?.wantsLayer = true
+//            cell?.layer?.backgroundColor = NSColor.red.cgColor
+        }
+        
+        let cellView = cell as? KMUserListItemCellView
+        let model = self.datas[row]
+        cellView?.fileNameLabel.stringValue = model.fileName ?? ""
+        cellView?.fileSizeLabel.stringValue = model.fileSizeString ?? ""
+        cellView?.button.image = NSImage(named: "KMImageNameUserFbDeleteIcon")
+        cellView?.box.fillColor = .clear
+        
+        cellView?.itemClick = { [weak self] idx in
+            if idx == 1 { // remove
+                self?.itemClick?(row, nil)
+            }
+        }
+        
+        return cell
+    }
+    
+    func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
+        if let block = self.validateDropCallback {
+            return block(info, row, dropOperation)
+        }
+        return .generic
+    }
+    
+    func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
+        if let block = self.acceptDropCallback {
+            return block(info, row, dropOperation)
+        }
+        
+        let pborad = info.draggingPasteboard
+        guard let _ = pborad.availableType(from: [.fileURL]) else {
+            return false
+        }
+        guard let items = pborad.pasteboardItems else {
+            return false
+        }
+        var fileNames: [String] = []
+        for item in items {
+            let string = item.propertyList(forType: .fileURL) as? String ?? ""
+            fileNames.append(string)
+        }
+        
+        return true
+    }
+}

+ 144 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/View/KMUserListItemView.xib

@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner"/>
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
+        <customView id="c22-O7-iKe" customClass="KMUserListItemView" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
+            <subviews>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="zr8-Cz-fps">
+                    <rect key="frame" x="0.0" y="242" width="480" height="30"/>
+                    <view key="contentView" id="tCe-tf-qqc">
+                        <rect key="frame" x="1" y="1" width="478" height="28"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="GDZ-c6-mqD">
+                                <rect key="frame" x="6" y="7" width="14" height="14"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="14" id="4Yh-eg-deX"/>
+                                    <constraint firstAttribute="height" constant="14" id="rJo-qW-M8E"/>
+                                </constraints>
+                                <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="qBj-KG-b8E"/>
+                            </imageView>
+                            <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mM9-6z-ImJ">
+                                <rect key="frame" x="24" y="6" width="37" height="16"/>
+                                <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="JlU-B6-CW7">
+                                    <font key="font" metaFont="system"/>
+                                    <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+                                    <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                </textFieldCell>
+                            </textField>
+                        </subviews>
+                        <constraints>
+                            <constraint firstItem="mM9-6z-ImJ" firstAttribute="leading" secondItem="GDZ-c6-mqD" secondAttribute="trailing" constant="6" id="661-Ja-8Rc"/>
+                            <constraint firstItem="mM9-6z-ImJ" firstAttribute="centerY" secondItem="GDZ-c6-mqD" secondAttribute="centerY" id="ETh-FT-3vX"/>
+                            <constraint firstItem="GDZ-c6-mqD" firstAttribute="centerY" secondItem="tCe-tf-qqc" secondAttribute="centerY" id="KHu-UF-aMp"/>
+                            <constraint firstItem="GDZ-c6-mqD" firstAttribute="leading" secondItem="tCe-tf-qqc" secondAttribute="leading" constant="6" id="cNy-cw-7uE"/>
+                        </constraints>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="30" id="mCd-50-8cp"/>
+                    </constraints>
+                </box>
+                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="2bk-kb-mdG">
+                    <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
+                    <view key="contentView" id="OCs-af-Hmo">
+                        <rect key="frame" x="1" y="1" width="478" height="270"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <scrollView autohidesScrollers="YES" horizontalLineScroll="24" horizontalPageScroll="10" verticalLineScroll="24" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="n7d-Y9-inU">
+                                <rect key="frame" x="0.0" y="0.0" width="478" height="270"/>
+                                <clipView key="contentView" id="cJ3-V7-2Px">
+                                    <rect key="frame" x="1" y="1" width="476" height="268"/>
+                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    <subviews>
+                                        <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="plain" multipleSelection="NO" autosaveColumns="NO" rowHeight="24" rowSizeStyle="automatic" viewBased="YES" id="aYC-XP-waL">
+                                            <rect key="frame" x="0.0" y="0.0" width="476" height="268"/>
+                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                            <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                            <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
+                                            <tableColumns>
+                                                <tableColumn identifier="AutomaticTableColumnIdentifier.0" width="476" minWidth="40" maxWidth="1000" id="eDA-h6-MI8">
+                                                    <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
+                                                        <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
+                                                        <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
+                                                    </tableHeaderCell>
+                                                    <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="MGq-1g-hN4">
+                                                        <font key="font" metaFont="system"/>
+                                                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                        <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                    </textFieldCell>
+                                                    <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
+                                                    <prototypeCellViews>
+                                                        <tableCellView id="9EW-fN-aP8">
+                                                            <rect key="frame" x="0.0" y="0.0" width="476" height="24"/>
+                                                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                            <subviews>
+                                                                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ce1-tC-fg6">
+                                                                    <rect key="frame" x="0.0" y="4" width="476" height="16"/>
+                                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+                                                                    <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="Nlc-OV-wnN">
+                                                                        <font key="font" usesAppearanceFont="YES"/>
+                                                                        <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
+                                                                        <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                                                                    </textFieldCell>
+                                                                </textField>
+                                                            </subviews>
+                                                            <connections>
+                                                                <outlet property="textField" destination="ce1-tC-fg6" id="UYw-E1-xMI"/>
+                                                            </connections>
+                                                        </tableCellView>
+                                                    </prototypeCellViews>
+                                                </tableColumn>
+                                            </tableColumns>
+                                        </tableView>
+                                    </subviews>
+                                </clipView>
+                                <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Fnc-sp-eyc">
+                                    <rect key="frame" x="1" y="253" width="476" height="16"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                </scroller>
+                                <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="SZ9-T9-KfP">
+                                    <rect key="frame" x="224" y="17" width="15" height="102"/>
+                                    <autoresizingMask key="autoresizingMask"/>
+                                </scroller>
+                            </scrollView>
+                        </subviews>
+                        <constraints>
+                            <constraint firstAttribute="bottom" secondItem="n7d-Y9-inU" secondAttribute="bottom" id="C0E-0N-idU"/>
+                            <constraint firstAttribute="trailing" secondItem="n7d-Y9-inU" secondAttribute="trailing" id="Wz1-x1-rem"/>
+                            <constraint firstItem="n7d-Y9-inU" firstAttribute="leading" secondItem="OCs-af-Hmo" secondAttribute="leading" id="u6p-eT-zqU"/>
+                            <constraint firstItem="n7d-Y9-inU" firstAttribute="top" secondItem="OCs-af-Hmo" secondAttribute="top" id="vFj-h6-yJb"/>
+                        </constraints>
+                    </view>
+                </box>
+            </subviews>
+            <constraints>
+                <constraint firstAttribute="trailing" secondItem="zr8-Cz-fps" secondAttribute="trailing" id="3eI-RU-DRb"/>
+                <constraint firstItem="zr8-Cz-fps" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="7YC-Vv-tLo"/>
+                <constraint firstItem="zr8-Cz-fps" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="XfB-ER-OoY"/>
+                <constraint firstAttribute="bottom" secondItem="2bk-kb-mdG" secondAttribute="bottom" id="f0o-Tw-Ryk"/>
+                <constraint firstItem="2bk-kb-mdG" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" id="iK1-jy-vDQ"/>
+                <constraint firstItem="2bk-kb-mdG" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="jLQ-1M-9qg"/>
+                <constraint firstAttribute="trailing" secondItem="2bk-kb-mdG" secondAttribute="trailing" id="vds-rk-F8v"/>
+            </constraints>
+            <connections>
+                <outlet property="box" destination="2bk-kb-mdG" id="W1P-cq-G0I"/>
+                <outlet property="boxTopConst" destination="jLQ-1M-9qg" id="631-wv-cGB"/>
+                <outlet property="scrollView" destination="n7d-Y9-inU" id="hpR-jA-TcN"/>
+                <outlet property="tableView" destination="aYC-XP-waL" id="ND5-qq-Ax1"/>
+                <outlet property="tipBox" destination="zr8-Cz-fps" id="1Ou-Gf-d0P"/>
+                <outlet property="tipIv" destination="GDZ-c6-mqD" id="vlG-wX-Mjf"/>
+                <outlet property="tipLabel" destination="mM9-6z-ImJ" id="Cyh-Rb-Dgd"/>
+            </connections>
+            <point key="canvasLocation" x="139" y="131"/>
+        </customView>
+    </objects>
+</document>

+ 492 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Window/KMUserFeekbackWindowController.swift

@@ -0,0 +1,492 @@
+//
+//  KMUserFeekbackWindowController.swift
+//  PDF Reader Pro Edition
+//
+//  Created by tangchao on 2024/7/11.
+//
+
+import Cocoa
+
+@objcMembers class KMUserFeekbackWindowController: NSWindowController {
+    static let shared = KMUserFeekbackWindowController(windowNibName: "KMUserFeekbackWindowController")
+
+    @IBOutlet weak var emailBox: NSBox!
+    @IBOutlet weak var typeBox: NSBox!
+    @IBOutlet weak var despBox: NSBox!
+    @IBOutlet weak var listHeaderBox: NSBox!
+    @IBOutlet weak var listBox: NSBox!
+    @IBOutlet weak var comfirmButton: NSButton!
+    @IBOutlet weak var cancelButton: NSButton!
+    
+    private var emailItemView_: KMUserFbEmailItemView?
+    private var typeItemView_: KMUserFbTypeItemView?
+    private var despItemView_: KMUserFbDespItemView?
+    private var listHeaderItemView_: KMUserFbListHeaderItemView?
+    private var listItemView_: KMUserListItemView?
+    
+    typealias KMRequestServerComplete = (_ wrapper: ResultWrapper) -> Void
+    
+    private var filePaths_: [String] = []
+    
+    private var logPath_: String?
+    
+    private var popover_: NSPopover?
+    
+    var typeString: String = ""
+    
+    deinit {
+        Swift.debugPrint("KMUserFeekbackWindowController deinit.")
+    }
+    
+    override func windowDidLoad() {
+        super.windowDidLoad()
+
+        self._initDefaultValue()
+        self._initSubViews()
+        
+        self.typeItemView_?.comBoBox.selectItem(at: 0)
+    }
+    
+    private func _initDefaultValue() {
+        if let btn = self.window?.standardWindowButton(.miniaturizeButton) {
+            btn.isHidden = true
+        }
+        if let btn = self.window?.standardWindowButton(.zoomButton) {
+            btn.isHidden = true
+        }
+        self.window?.title = NSLocalizedString("Feedback for PDF Reader Pro", comment: "")
+        self.window?.backgroundColor = NSColor.white
+        
+        self.emailBox.borderWidth = 0
+        self.typeBox.borderWidth = 0
+        self.despBox.borderWidth = 0
+        self.listHeaderBox.borderWidth = 0
+        self.listBox.borderWidth = 0
+        
+        let email = VerificationManager.default()?.email ?? ""
+        self.emailItemView_?.textfiled.stringValue = email
+        
+        self.emailItemView_?.textfiled.nextResponder = self.despItemView_?.textView
+        
+        self.cancelButton.title = NSLocalizedString("Cancel", comment: "")
+        self.comfirmButton.title = NSLocalizedString("Submit", comment: "")
+        
+        self.cancelButton.target = self
+        self.cancelButton.action = #selector(_cancelButtonAction)
+        self.comfirmButton.target = self
+        self.comfirmButton.action = #selector(_comfirmButtonAction)
+    }
+    
+    private func _initSubViews() {
+        self.emailItemView_ = KMUserFbEmailItemView.createFromNib()
+        self.emailBox.contentView = self.emailItemView_
+        
+        self.typeItemView_ = KMUserFbTypeItemView.createFromNib()
+        self.typeBox.contentView = self.typeItemView_
+        
+        self.despItemView_ = KMUserFbDespItemView.createFromNib()
+        self.despBox.contentView = self.despItemView_
+        
+        self.listHeaderItemView_ = KMUserFbListHeaderItemView.createFromNib()
+        self.listHeaderBox.contentView = self.listHeaderItemView_
+        
+        self.listItemView_ = KMUserListItemView.createFromNib()
+        self.listBox.contentView = self.listItemView_
+        
+        self.listItemView_?.hiddenTip()
+        
+        self.listHeaderItemView_?.helpHoverCallback = { [weak self] action in
+            if action.rawValue == 0 { // enter
+                self?._showHelpPopover((self?.listHeaderItemView_?.helpButton)!)
+            } else if action.rawValue == 2 { // exit
+                self?._hiddenHelpPopover()
+            }
+        }
+        self.listHeaderItemView_?.itemClick = { [weak self] idx in
+            if idx == 1 { // 获取日志文件
+                
+            } else if idx == 3 { // 新增文件
+                let panel = NSOpenPanel()
+                panel.allowsMultipleSelection = true
+                panel.beginSheetModal(for: self!.window!) { resp in
+                    if resp == .cancel {
+                        return
+                    }
+                    
+                    for url in panel.urls {
+                        self?.filePaths_.append(url.path)
+                    }
+                    
+                    self?._updateListData()
+                }
+            }
+        }
+        
+        self.listItemView_?.itemClick = { [weak self] idx, param in
+            if let cnt = self?.filePaths_.count, idx < cnt {
+                self?.filePaths_.remove(at: idx)
+                
+                self?._updateListData()
+            }
+        }
+        
+        self.listItemView_?.validateDropCallback = { [weak self] info, row, dropOperation in
+            let datas = self?.filePaths_.count ?? 0
+            if datas >= 10 {
+                return NSDragOperation(rawValue: 0)
+            }
+            return .generic
+        }
+        
+        self.listItemView_?.acceptDropCallback = { [weak self] info, row, dropOperation in 
+            let pborad = info.draggingPasteboard
+            guard let _ = pborad.availableType(from: [.fileURL]) else {
+                return false
+            }
+            guard let items = pborad.pasteboardItems else {
+                return false
+            }
+            for item in items {
+                let string = item.propertyList(forType: .fileURL) as? String ?? ""
+                if let path = URL(string: string)?.path {
+                    self?.filePaths_.append(path)
+                }
+            }
+            self?._updateListData()
+            return true
+        }
+    }
+    
+    override func showWindow(_ sender: Any?) {
+        super.showWindow(sender)
+        
+        self.typeItemView_?.comBoBox.stringValue = self.typeString
+    }
+    
+    // MARK: - Private Methods
+    
+    @objc private func _cancelButtonAction() {
+        self.window?.orderOut(nil)
+    }
+    
+    @objc private func _comfirmButtonAction() {
+        if let data = self.listHeaderItemView_?.checkButton.state, data == .on {
+            let fileaccess = AppSandboxFileAccess()
+            // /Users/kdanmobile/Library/Logs/DiagnosticReports
+            let url = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first
+            let coms = url?.pathComponents ?? []
+            var filePath: String = ""
+            for (i, com) in coms.enumerated() {
+                if i > 2 {
+                    break
+                } else {
+                    filePath.append("/\(com)")
+                }
+            }
+            let cmd = filePath.appending("/Library/Logs/DiagnosticReports/")
+            // /Library/Logs/DiagnosticReports/
+            fileaccess?.accessFilePath(cmd, persistPermission: true, with: {
+                
+            })
+            
+            let logString = self._getLog()
+            if logString.isEmpty == false {
+                let bundleIdentifier = Bundle.main.bundleIdentifier ?? "PDF Reader Pro"
+                if let url = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first?.appendingPathComponent(bundleIdentifier) {
+                    if FileManager.default.fileExists(atPath: url.path) == false {
+                        try?FileManager.default.createDirectory(at: url, withIntermediateDirectories: false)
+                    }
+                    
+                    let fileUrl = url.appendingPathComponent("Log.txt")
+                    
+                    try?logString.write(to: fileUrl, atomically: true, encoding: .utf8)
+                    
+                    self.logPath_ = fileUrl.path
+                }
+            }
+        } else {
+            self.logPath_ = nil
+        }
+        
+        self.window?.makeFirstResponder(nil)
+        let state = self._isConnectionAvailable()
+        if !state {
+            self._showHud(msg: NSLocalizedString("Please make sure your internet connection is available.", comment: ""))
+            return
+        }
+        
+        guard let emailString = self.emailItemView_?.string(), emailString.isEmpty == false else {
+            // 邮箱为空
+            self.emailItemView_?.showTip(label: NSLocalizedString("请填写Email", comment: ""))
+            return
+        }
+        
+        if KMValidateEmail(email: emailString) == false {
+            self.emailItemView_?.showTip(label: NSLocalizedString("Please enter valid email", comment: ""))
+            return
+        }
+        
+        guard let despString = self.despItemView_?.string(), despString.isEmpty == false else {
+            // 描述信息为空
+            self.despItemView_?.showTip()
+            return
+        }
+        
+        self.window?.contentView?.beginLoading()
+        self.comfirmButton.isEnabled = false
+        var filePaths: [String] = self.filePaths_
+        if let data = self.listHeaderItemView_?.checkButton.state, data == .on {
+            if let filePath = self.logPath_, filePath.isEmpty == false {
+                filePaths.append(filePath)
+            }
+        }
+        
+        self._feekbackAction(filePaths: filePaths) { [weak self] wrapper in
+            self?.window?.contentView?.endLoading()
+            self?.comfirmButton.isEnabled = true
+            if wrapper.success {
+                self?._showHud(msg: NSLocalizedString("感谢您的反馈!\n客服将在1个工作日内反馈至您的邮箱", comment: ""))
+                
+                DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
+                    self?.despItemView_?.textView.string = ""
+                    self?.despItemView_?.textView.placeholderLabel.isHidden = false;
+                    self?.filePaths_.removeAll()
+                    self?._updateListData()
+                    
+                    if let data = self?.logPath_, data.isEmpty == false {
+                        if FileManager.default.fileExists(atPath: data) {
+                            try?FileManager.default.removeItem(atPath: data)
+                        }
+                    }
+                    
+                    self?.logPath_ = nil
+                    self?.window?.orderOut(nil)
+                }
+            } else {
+                self?._showHud(msg: wrapper.content)
+            }
+        }
+    }
+    
+    private func _showHelpPopover(_ sender: NSButton) {
+        if self.popover_ != nil {
+            return
+        }
+        let vc = KMUserFbHelpPopController()
+        let popover = NSPopover()
+        popover.contentViewController = vc
+        popover.animates = true
+        popover.behavior = .semitransient
+        popover.delegate = self
+        popover.setValue(true, forKey: "shouldHideAnchor")
+        self.popover_ = popover
+        
+        popover.show(relativeTo: sender.bounds, of: sender, preferredEdge: .maxX)
+    }
+    
+    private func _hiddenHelpPopover() {
+        self.popover_?.close()
+    }
+    
+    private func _updateListData() {
+        self.listItemView_?.hiddenTip()
+        
+        var datas: [KMUserFbListModel] = []
+        let maxSize: Float = 20 * 1024 * 1024
+        var fileSize: Float = 0
+        var filePaths: [String] = []
+        for (i, fileP) in self.filePaths_.enumerated() {
+            let model = KMUserFbListModel()
+            model.filePath = fileP
+            let url = URL(fileURLWithPath: fileP)
+            model.fileName = url.lastPathComponent
+            let attri = try?FileManager.default.attributesOfItem(atPath: fileP)
+            model.fileSize = attri?[FileAttributeKey.size] as? Float ?? 0
+            
+            fileSize += model.fileSize
+            
+            if fileSize >= maxSize {
+                self.listItemView_?.showTip()
+                break
+            }
+            if i >= 10 {
+                break
+            }
+            
+            model.fileSizeString = self.fileSizeString(model.fileSize) ?? ""
+            datas.append(model)
+            
+            filePaths.append(fileP)
+        }
+        self.filePaths_ = filePaths
+        
+        if datas.count >= 10 {
+            self.listHeaderItemView_?.addButton.isEnabled = false
+        } else {
+            self.listHeaderItemView_?.addButton.isEnabled = true
+        }
+        
+        self.listItemView_?.datas = datas
+    }
+    
+    private func _showHud(msg: String) {
+        if let data = self.window?.contentView {
+//            _ = CustomAlertView(message: msg, from: data, with: .black)
+            CustomAlertView.alertView(message: msg, fromView: data, withStyle: .black)
+        }
+    }
+    
+    private func _getLog() -> String {
+        let url = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first
+        let coms = url?.pathComponents ?? []
+        var filePath: String = ""
+        for (i, com) in coms.enumerated() {
+            if i > 2 {
+                break
+            } else {
+                filePath.append("/\(com)")
+            }
+        }
+        // ls /Library/Logs/DiagnosticReports/PDF*
+        let cmd = "ls \(filePath)/Library/Logs/DiagnosticReports/PDF*"
+        let filestrings = _runShellCommand(cmd)
+        let files = filestrings.components(separatedBy: "\n")
+        var results: [String] = []
+        for string in files {
+            if string.contains("PDF Reader Pro") {
+                var tempS = string
+//                tempS.replace(" ", with: "\\ ")
+//                tempS.replacingCharacters(in: " ", with: "\\ ")
+//                let ss = tempS.replacing(" ", with: "\\ ")
+                let ss = tempS.replacingOccurrences(of: " ", with: "\\ ")
+                results.append(ss)
+            }
+        }
+        
+        if let file = results.last {
+            let cmd = "cat \(file)"
+            // cat /Library/Logs/DiagnosticReports/PDF*
+            let logs = _runShellCommand(cmd)
+            return logs
+        }
+        return ""
+    }
+    
+    private func _runShellCommand(_ command: String) -> String {
+        let task = Process()
+        let pipe = Pipe()
+        
+        task.standardOutput = pipe
+        task.standardError = pipe
+        task.arguments = ["-c", command]
+        task.launchPath = "/bin/bash"
+        
+        do {
+            try task.run()
+        } catch {
+            return "Error running command: \(error)"
+        }
+        
+        let data = pipe.fileHandleForReading.readDataToEndOfFile()
+        let output = String(data: data, encoding: .utf8) ?? ""
+        return output
+    }
+    
+    func test() {
+        var convertString = "TARGET_BUNDLE_IDENTIFIER=\"com.brother.pdfreaderprofree.mac\"\n"
+        convertString = convertString.appendingFormat("SANDBOX_ROOT=$(osascript -e 'tell application \"System Events\" to get the path of the home folder of (system info)')\n")
+        convertString = convertString.appendingFormat("CONTAINER_LOG_PATH=$(osascript <<EOF\n")
+        convertString.append("tell application \"System Events\"\n")
+//        convertString.append("set isRun to running\n")
+        convertString.append("set container_path to POSIX path of (the home folder as text) & \"Library:Containers:\" & \"$TARGET_BUNDLE_IDENTIFIER\"\n")
+        convertString.append("set log_path to container_path & \":Logs:\" & \"Console.app-History\"\n")
+        convertString.append("return log_path\n")
+        convertString.append("end tell\n")
+        convertString.append("EOF)\n")
+        
+        convertString.append("echo \"日志文件路径: $CONTAINER_LOG_PATH\"\n")
+
+        var dic: NSDictionary?
+        let docScript = NSAppleScript(source: convertString)
+        docScript?.executeAndReturnError(&dic)
+    }
+    
+    func fileSizeString(_ fSize: Float) -> String {
+        let fileSize = fSize / 1024
+        let size = fileSize >= 1024 ? (fileSize < 1048576 ? fileSize/1024 : fileSize/1048576.0) : fileSize
+        let unit = fileSize >= 1024 ? (fileSize < 1048576 ? "M" : "G") : "K"
+        return String(format: "%0.1f %@", size, unit)
+    }
+    
+    private func _feekbackAction(filePaths: [String], complete: @escaping KMRequestServerComplete) {
+        let urlString = kVerificationServer + "/api/feedback/feedback"
+        var fileDatas: [Data] = []
+        for filePath in filePaths {
+            if let fileData = FileManager.default.contents(atPath: filePath) {
+                fileDatas.append(fileData)
+            }
+        }
+        
+        let uuid = GetHardwareUUID()
+        let params: [String: Any] = ["email": self.emailItemView_?.string() ?? "",
+                                     "title": self.typeItemView_?.string() ?? "",
+                                     "content": self.despItemView_?.string() ?? "",
+                                     "unique_sn" : uuid!,
+                                     "files[]" : fileDatas]
+        KMAIRequestServer.requestServer.uploadFile(urlString: urlString, params: params) { formData in
+            for i in 0 ..< fileDatas.count {
+                let path = filePaths[i]
+                let fileURL = URL(fileURLWithPath: path)
+                try? formData.appendPart(withFileURL: fileURL, name: "files[]", fileName: fileURL.lastPathComponent, mimeType: "application/octet-stream")
+            }
+        } requestSerializer: { requestSerializer in
+            requestSerializer.setValue("Apifox/1.0.0 (https://www.apifox.cn)", forHTTPHeaderField: "User-Agent")
+        } completion: { task, responseObject, error in
+            if responseObject != nil {
+                let data: NSDictionary = responseObject as? NSDictionary ?? [:]
+//                var code: String = responseObject!["code"] as? String ?? "06005"
+                let code = data["code"] as? Int ?? 06005
+                if code == 06005 {
+//                    let tempCode: Int = responseObject!["code"] as? Int ?? 0
+//                    if tempCode == 501 {
+//                        code = "501"
+//                    }
+                }
+                
+                let message: String = data["message"] as? String ?? "unknown error"
+                let error = NSError(domain: message, code: code)
+                if code == 200 {
+                    let wrapper = ResultWrapper(success: true, resultData: data)
+//                    wrapper.content = data["fileKey"] as! String
+                    complete(wrapper)
+                } else {
+                    let wrapper = ResultWrapper(success: false, resultData: data)
+                    if code == 501 {
+                        wrapper.content = "501"
+                    } else {
+                        wrapper.content = message
+                    }
+                    complete(wrapper)
+                }
+            } else {
+                complete(ResultWrapper(success: false, content: "unknown error"))
+            }
+        }
+    }
+    
+    private func _isConnectionAvailable() -> Bool {
+        if Reachability.forInternetConnection().currentReachabilityStatus().rawValue == 0 {
+            return false
+        }
+        return true
+    }
+    
+}
+
+extension KMUserFeekbackWindowController: NSPopoverDelegate {
+    func popoverWillClose(_ notification: Notification) {
+        if let data = self.popover_?.isEqual(to: notification.object), data {
+            self.popover_ = nil
+        }
+    }
+}

+ 153 - 0
PDF Office/PDF Master/Class/Tools/UserFeekback/Window/KMUserFeekbackWindowController.xib

@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="21507"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <customObject id="-2" userLabel="File's Owner" customClass="KMUserFeekbackWindowController" customModule="PDF_Reader_Pro" customModuleProvider="target">
+            <connections>
+                <outlet property="cancelButton" destination="u0z-8O-Jvu" id="0tZ-X7-fiH"/>
+                <outlet property="comfirmButton" destination="F8d-uO-ord" id="E5K-Pc-n9D"/>
+                <outlet property="despBox" destination="UpN-5h-41j" id="3bG-Pu-7r8"/>
+                <outlet property="emailBox" destination="gZm-XF-OMc" id="xfl-3t-4jH"/>
+                <outlet property="listBox" destination="DGL-Rr-yAO" id="8LA-aZ-PxD"/>
+                <outlet property="listHeaderBox" destination="0oo-D2-BNd" id="WWb-or-WZU"/>
+                <outlet property="typeBox" destination="mxl-ba-YzD" id="MI9-W9-ors"/>
+                <outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
+            </connections>
+        </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">
+            <windowStyleMask key="styleMask" titled="YES" closable="YES"/>
+            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
+            <rect key="contentRect" x="196" y="240" width="380" height="518"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
+            <value key="minSize" type="size" width="380" height="518"/>
+            <value key="maxSize" type="size" width="380" height="518"/>
+            <value key="minFullScreenContentSize" type="size" width="380" height="518"/>
+            <value key="maxFullScreenContentSize" type="size" width="380" height="518"/>
+            <view key="contentView" id="se5-gp-TjO">
+                <rect key="frame" x="0.0" y="0.0" width="380" height="518"/>
+                <autoresizingMask key="autoresizingMask"/>
+                <subviews>
+                    <box borderType="line" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="JOu-6K-NJo">
+                        <rect key="frame" x="-3" y="-4" width="386" height="524"/>
+                        <view key="contentView" id="r4s-Kk-eVS">
+                            <rect key="frame" x="3" y="3" width="380" height="518"/>
+                            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                            <subviews>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="gZm-XF-OMc">
+                                    <rect key="frame" x="0.0" y="438" width="380" height="60"/>
+                                    <view key="contentView" id="bdm-Bl-XiT">
+                                        <rect key="frame" x="1" y="1" width="378" height="58"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="60" id="OZf-Z6-yFT"/>
+                                    </constraints>
+                                </box>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="mxl-ba-YzD">
+                                    <rect key="frame" x="30" y="394" width="320" height="44"/>
+                                    <view key="contentView" id="cEX-8W-izR">
+                                        <rect key="frame" x="1" y="1" width="318" height="42"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="44" id="JIs-nJ-h5N"/>
+                                    </constraints>
+                                </box>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="UpN-5h-41j">
+                                    <rect key="frame" x="0.0" y="222" width="380" height="156"/>
+                                    <view key="contentView" id="8TU-mF-OwZ">
+                                        <rect key="frame" x="1" y="1" width="378" height="154"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="156" id="V8Q-kR-7tu"/>
+                                    </constraints>
+                                </box>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="0oo-D2-BNd">
+                                    <rect key="frame" x="30" y="142" width="320" height="80"/>
+                                    <view key="contentView" id="iSM-Ac-7pQ">
+                                        <rect key="frame" x="1" y="1" width="318" height="78"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="80" id="i8e-QC-6ZU"/>
+                                    </constraints>
+                                </box>
+                                <box boxType="custom" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="DGL-Rr-yAO">
+                                    <rect key="frame" x="30" y="60" width="320" height="70"/>
+                                    <view key="contentView" id="509-Wa-5hS">
+                                        <rect key="frame" x="1" y="1" width="318" height="68"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                    </view>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="70" id="rne-GH-z0K"/>
+                                    </constraints>
+                                </box>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="F8d-uO-ord">
+                                    <rect key="frame" x="281" y="13" width="86" height="32"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="72" id="huS-oq-Rfd"/>
+                                    </constraints>
+                                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ul0-cf-SlZ">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                        <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
+                                    </buttonCell>
+                                </button>
+                                <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="u0z-8O-Jvu">
+                                    <rect key="frame" x="215" y="13" width="72" height="32"/>
+                                    <constraints>
+                                        <constraint firstAttribute="width" constant="58" id="Xrz-Mn-Jb3"/>
+                                    </constraints>
+                                    <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="abu-h9-OsG">
+                                        <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
+                                        <font key="font" metaFont="system"/>
+                                    </buttonCell>
+                                </button>
+                            </subviews>
+                            <constraints>
+                                <constraint firstAttribute="trailing" secondItem="gZm-XF-OMc" secondAttribute="trailing" id="1Zd-M3-20h"/>
+                                <constraint firstAttribute="trailing" secondItem="mxl-ba-YzD" secondAttribute="trailing" constant="30" id="1lZ-6J-Jyh"/>
+                                <constraint firstAttribute="bottom" secondItem="u0z-8O-Jvu" secondAttribute="bottom" constant="20" id="3Os-ba-hVO"/>
+                                <constraint firstAttribute="trailing" secondItem="DGL-Rr-yAO" secondAttribute="trailing" constant="30" id="3lh-zF-aJK"/>
+                                <constraint firstItem="gZm-XF-OMc" firstAttribute="top" secondItem="r4s-Kk-eVS" secondAttribute="top" constant="20" id="BJS-wD-NRv"/>
+                                <constraint firstItem="mxl-ba-YzD" firstAttribute="leading" secondItem="r4s-Kk-eVS" secondAttribute="leading" constant="30" id="CHS-A4-NpE"/>
+                                <constraint firstItem="UpN-5h-41j" firstAttribute="top" secondItem="mxl-ba-YzD" secondAttribute="bottom" constant="16" id="CpK-DE-pnU"/>
+                                <constraint firstAttribute="trailing" secondItem="0oo-D2-BNd" secondAttribute="trailing" constant="30" id="D1T-nV-oOD"/>
+                                <constraint firstItem="mxl-ba-YzD" firstAttribute="top" secondItem="gZm-XF-OMc" secondAttribute="bottom" id="FYN-JH-BQ3"/>
+                                <constraint firstAttribute="bottom" secondItem="F8d-uO-ord" secondAttribute="bottom" constant="20" id="LR8-3g-Sn0"/>
+                                <constraint firstItem="DGL-Rr-yAO" firstAttribute="leading" secondItem="r4s-Kk-eVS" secondAttribute="leading" constant="30" id="RWH-9o-1Tg"/>
+                                <constraint firstItem="0oo-D2-BNd" firstAttribute="leading" secondItem="r4s-Kk-eVS" secondAttribute="leading" constant="30" id="T9j-g3-m4k"/>
+                                <constraint firstItem="0oo-D2-BNd" firstAttribute="top" secondItem="UpN-5h-41j" secondAttribute="bottom" id="YOf-SN-1we"/>
+                                <constraint firstAttribute="trailing" secondItem="F8d-uO-ord" secondAttribute="trailing" constant="20" id="Yya-Ep-sk6"/>
+                                <constraint firstItem="DGL-Rr-yAO" firstAttribute="top" secondItem="0oo-D2-BNd" secondAttribute="bottom" constant="12" id="eb5-Rq-tF9"/>
+                                <constraint firstItem="UpN-5h-41j" firstAttribute="leading" secondItem="r4s-Kk-eVS" secondAttribute="leading" id="erl-Wj-tCT"/>
+                                <constraint firstItem="F8d-uO-ord" firstAttribute="leading" secondItem="u0z-8O-Jvu" secondAttribute="trailing" constant="8" id="l53-oa-SNq"/>
+                                <constraint firstItem="gZm-XF-OMc" firstAttribute="leading" secondItem="r4s-Kk-eVS" secondAttribute="leading" id="rkS-88-qRm"/>
+                                <constraint firstAttribute="trailing" secondItem="UpN-5h-41j" secondAttribute="trailing" id="suz-PV-z9B"/>
+                            </constraints>
+                        </view>
+                    </box>
+                </subviews>
+                <constraints>
+                    <constraint firstItem="JOu-6K-NJo" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="H3x-bK-Nxu"/>
+                    <constraint firstAttribute="trailing" secondItem="JOu-6K-NJo" secondAttribute="trailing" id="X44-DQ-rJw"/>
+                    <constraint firstAttribute="bottom" secondItem="JOu-6K-NJo" secondAttribute="bottom" id="tXr-de-JZH"/>
+                    <constraint firstItem="JOu-6K-NJo" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="vsc-CY-BmL"/>
+                </constraints>
+            </view>
+            <connections>
+                <outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
+            </connections>
+            <point key="canvasLocation" x="110" y="144"/>
+        </window>
+    </objects>
+</document>

+ 202 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -2656,6 +2656,60 @@
 		BB003035298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */; };
 		BB003036298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */; };
 		BB003037298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */; };
+		BB031B572C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */ = {isa = PBXBuildFile; fileRef = BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */; };
+		BB031B582C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */ = {isa = PBXBuildFile; fileRef = BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */; };
+		BB031B592C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */ = {isa = PBXBuildFile; fileRef = BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */; };
+		BB031B5A2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */; };
+		BB031B5B2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */; };
+		BB031B5C2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */; };
+		BB031B5D2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B442C47BB070099F7AD /* KMUserFbHelpPopController.swift */; };
+		BB031B5E2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B442C47BB070099F7AD /* KMUserFbHelpPopController.swift */; };
+		BB031B5F2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B442C47BB070099F7AD /* KMUserFbHelpPopController.swift */; };
+		BB031B602C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B462C47BB070099F7AD /* KMUserFeekbackWindowController.swift */; };
+		BB031B612C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B462C47BB070099F7AD /* KMUserFeekbackWindowController.swift */; };
+		BB031B622C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B462C47BB070099F7AD /* KMUserFeekbackWindowController.swift */; };
+		BB031B632C47BB080099F7AD /* KMUserFeekbackWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B472C47BB070099F7AD /* KMUserFeekbackWindowController.xib */; };
+		BB031B642C47BB080099F7AD /* KMUserFeekbackWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B472C47BB070099F7AD /* KMUserFeekbackWindowController.xib */; };
+		BB031B652C47BB080099F7AD /* KMUserFeekbackWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B472C47BB070099F7AD /* KMUserFeekbackWindowController.xib */; };
+		BB031B662C47BB080099F7AD /* KMUserFbListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B492C47BB070099F7AD /* KMUserFbListModel.swift */; };
+		BB031B672C47BB080099F7AD /* KMUserFbListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B492C47BB070099F7AD /* KMUserFbListModel.swift */; };
+		BB031B682C47BB080099F7AD /* KMUserFbListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B492C47BB070099F7AD /* KMUserFbListModel.swift */; };
+		BB031B692C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B4B2C47BB070099F7AD /* KMUserFbEmailItemView.xib */; };
+		BB031B6A2C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B4B2C47BB070099F7AD /* KMUserFbEmailItemView.xib */; };
+		BB031B6B2C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B4B2C47BB070099F7AD /* KMUserFbEmailItemView.xib */; };
+		BB031B6C2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4C2C47BB070099F7AD /* KMUserFbDespItemView.swift */; };
+		BB031B6D2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4C2C47BB070099F7AD /* KMUserFbDespItemView.swift */; };
+		BB031B6E2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4C2C47BB070099F7AD /* KMUserFbDespItemView.swift */; };
+		BB031B6F2C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4D2C47BB070099F7AD /* KMUserFbTypeItemView.swift */; };
+		BB031B702C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4D2C47BB070099F7AD /* KMUserFbTypeItemView.swift */; };
+		BB031B712C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4D2C47BB070099F7AD /* KMUserFbTypeItemView.swift */; };
+		BB031B722C47BB080099F7AD /* KMUserFbEmailItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4E2C47BB070099F7AD /* KMUserFbEmailItemView.swift */; };
+		BB031B732C47BB080099F7AD /* KMUserFbEmailItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4E2C47BB070099F7AD /* KMUserFbEmailItemView.swift */; };
+		BB031B742C47BB090099F7AD /* KMUserFbEmailItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4E2C47BB070099F7AD /* KMUserFbEmailItemView.swift */; };
+		BB031B752C47BB090099F7AD /* KMUserListItemCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4F2C47BB070099F7AD /* KMUserListItemCellView.swift */; };
+		BB031B762C47BB090099F7AD /* KMUserListItemCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4F2C47BB070099F7AD /* KMUserListItemCellView.swift */; };
+		BB031B772C47BB090099F7AD /* KMUserListItemCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B4F2C47BB070099F7AD /* KMUserListItemCellView.swift */; };
+		BB031B782C47BB090099F7AD /* KMUserListItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B502C47BB070099F7AD /* KMUserListItemView.xib */; };
+		BB031B792C47BB090099F7AD /* KMUserListItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B502C47BB070099F7AD /* KMUserListItemView.xib */; };
+		BB031B7A2C47BB090099F7AD /* KMUserListItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B502C47BB070099F7AD /* KMUserListItemView.xib */; };
+		BB031B7B2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B512C47BB070099F7AD /* KMUserFbListHeaderItemView.swift */; };
+		BB031B7C2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B512C47BB070099F7AD /* KMUserFbListHeaderItemView.swift */; };
+		BB031B7D2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B512C47BB070099F7AD /* KMUserFbListHeaderItemView.swift */; };
+		BB031B7E2C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B522C47BB070099F7AD /* KMUserListItemCellView.xib */; };
+		BB031B7F2C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B522C47BB070099F7AD /* KMUserListItemCellView.xib */; };
+		BB031B802C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B522C47BB070099F7AD /* KMUserListItemCellView.xib */; };
+		BB031B812C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B532C47BB070099F7AD /* KMUserFbListHeaderItemView.xib */; };
+		BB031B822C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B532C47BB070099F7AD /* KMUserFbListHeaderItemView.xib */; };
+		BB031B832C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B532C47BB070099F7AD /* KMUserFbListHeaderItemView.xib */; };
+		BB031B842C47BB090099F7AD /* KMUserListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B542C47BB070099F7AD /* KMUserListItemView.swift */; };
+		BB031B852C47BB090099F7AD /* KMUserListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B542C47BB070099F7AD /* KMUserListItemView.swift */; };
+		BB031B862C47BB090099F7AD /* KMUserListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB031B542C47BB070099F7AD /* KMUserListItemView.swift */; };
+		BB031B872C47BB090099F7AD /* KMUserFbTypeItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B552C47BB070099F7AD /* KMUserFbTypeItemView.xib */; };
+		BB031B882C47BB090099F7AD /* KMUserFbTypeItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B552C47BB070099F7AD /* KMUserFbTypeItemView.xib */; };
+		BB031B892C47BB090099F7AD /* KMUserFbTypeItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B552C47BB070099F7AD /* KMUserFbTypeItemView.xib */; };
+		BB031B8A2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */; };
+		BB031B8B2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */; };
+		BB031B8C2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */; };
 		BB0353C82B2987C40048A16C /* KMSnapshotWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */; };
 		BB0353C92B2987C40048A16C /* KMSnapshotWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */; };
 		BB0353CA2B2987C40048A16C /* KMSnapshotWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */; };
@@ -6375,6 +6429,25 @@
 		BB00301C298CB799002DD1A0 /* KMPreferenceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceManager.swift; sourceTree = "<group>"; };
 		BB003020298CEBED002DD1A0 /* KMPreferenceStepper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceStepper.swift; sourceTree = "<group>"; };
 		BB003034298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceMarkupColorView.swift; sourceTree = "<group>"; };
+		BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMUserFeekbackHanddler.m; sourceTree = "<group>"; };
+		BB031B412C47BB070099F7AD /* KMUserFeekbackHanddler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMUserFeekbackHanddler.h; sourceTree = "<group>"; };
+		BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbHelpPopController.xib; sourceTree = "<group>"; };
+		BB031B442C47BB070099F7AD /* KMUserFbHelpPopController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbHelpPopController.swift; sourceTree = "<group>"; };
+		BB031B462C47BB070099F7AD /* KMUserFeekbackWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFeekbackWindowController.swift; sourceTree = "<group>"; };
+		BB031B472C47BB070099F7AD /* KMUserFeekbackWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFeekbackWindowController.xib; sourceTree = "<group>"; };
+		BB031B492C47BB070099F7AD /* KMUserFbListModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbListModel.swift; sourceTree = "<group>"; };
+		BB031B4B2C47BB070099F7AD /* KMUserFbEmailItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbEmailItemView.xib; sourceTree = "<group>"; };
+		BB031B4C2C47BB070099F7AD /* KMUserFbDespItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbDespItemView.swift; sourceTree = "<group>"; };
+		BB031B4D2C47BB070099F7AD /* KMUserFbTypeItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbTypeItemView.swift; sourceTree = "<group>"; };
+		BB031B4E2C47BB070099F7AD /* KMUserFbEmailItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbEmailItemView.swift; sourceTree = "<group>"; };
+		BB031B4F2C47BB070099F7AD /* KMUserListItemCellView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserListItemCellView.swift; sourceTree = "<group>"; };
+		BB031B502C47BB070099F7AD /* KMUserListItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserListItemView.xib; sourceTree = "<group>"; };
+		BB031B512C47BB070099F7AD /* KMUserFbListHeaderItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserFbListHeaderItemView.swift; sourceTree = "<group>"; };
+		BB031B522C47BB070099F7AD /* KMUserListItemCellView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserListItemCellView.xib; sourceTree = "<group>"; };
+		BB031B532C47BB070099F7AD /* KMUserFbListHeaderItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbListHeaderItemView.xib; sourceTree = "<group>"; };
+		BB031B542C47BB070099F7AD /* KMUserListItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMUserListItemView.swift; sourceTree = "<group>"; };
+		BB031B552C47BB070099F7AD /* KMUserFbTypeItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbTypeItemView.xib; sourceTree = "<group>"; };
+		BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMUserFbDespItemView.xib; sourceTree = "<group>"; };
 		BB0353C72B2987C40048A16C /* KMSnapshotWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSnapshotWindow.swift; sourceTree = "<group>"; };
 		BB03D68B2B01C782008C9976 /* KMPDFEditInsertBlankPageWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFEditInsertBlankPageWindow.swift; sourceTree = "<group>"; };
 		BB03D68F2B01C7AA008C9976 /* KMPDFEditInsertBlankPageWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMPDFEditInsertBlankPageWindow.xib; sourceTree = "<group>"; };
@@ -10877,6 +10950,80 @@
 			path = CPDFDocumentExtensions;
 			sourceTree = "<group>";
 		};
+		BB031B3D2C47BB070099F7AD /* Tools */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B3E2C47BB070099F7AD /* UserFeekback */,
+			);
+			path = Tools;
+			sourceTree = "<group>";
+		};
+		BB031B3E2C47BB070099F7AD /* UserFeekback */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B3F2C47BB070099F7AD /* Tools */,
+				BB031B422C47BB070099F7AD /* Controller */,
+				BB031B452C47BB070099F7AD /* Window */,
+				BB031B482C47BB070099F7AD /* Model */,
+				BB031B4A2C47BB070099F7AD /* View */,
+			);
+			path = UserFeekback;
+			sourceTree = "<group>";
+		};
+		BB031B3F2C47BB070099F7AD /* Tools */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B402C47BB070099F7AD /* KMUserFeekbackHanddler.m */,
+				BB031B412C47BB070099F7AD /* KMUserFeekbackHanddler.h */,
+			);
+			path = Tools;
+			sourceTree = "<group>";
+		};
+		BB031B422C47BB070099F7AD /* Controller */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B432C47BB070099F7AD /* KMUserFbHelpPopController.xib */,
+				BB031B442C47BB070099F7AD /* KMUserFbHelpPopController.swift */,
+			);
+			path = Controller;
+			sourceTree = "<group>";
+		};
+		BB031B452C47BB070099F7AD /* Window */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B462C47BB070099F7AD /* KMUserFeekbackWindowController.swift */,
+				BB031B472C47BB070099F7AD /* KMUserFeekbackWindowController.xib */,
+			);
+			path = Window;
+			sourceTree = "<group>";
+		};
+		BB031B482C47BB070099F7AD /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B492C47BB070099F7AD /* KMUserFbListModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		BB031B4A2C47BB070099F7AD /* View */ = {
+			isa = PBXGroup;
+			children = (
+				BB031B4B2C47BB070099F7AD /* KMUserFbEmailItemView.xib */,
+				BB031B4C2C47BB070099F7AD /* KMUserFbDespItemView.swift */,
+				BB031B4D2C47BB070099F7AD /* KMUserFbTypeItemView.swift */,
+				BB031B4E2C47BB070099F7AD /* KMUserFbEmailItemView.swift */,
+				BB031B4F2C47BB070099F7AD /* KMUserListItemCellView.swift */,
+				BB031B502C47BB070099F7AD /* KMUserListItemView.xib */,
+				BB031B512C47BB070099F7AD /* KMUserFbListHeaderItemView.swift */,
+				BB031B522C47BB070099F7AD /* KMUserListItemCellView.xib */,
+				BB031B532C47BB070099F7AD /* KMUserFbListHeaderItemView.xib */,
+				BB031B542C47BB070099F7AD /* KMUserListItemView.swift */,
+				BB031B552C47BB070099F7AD /* KMUserFbTypeItemView.xib */,
+				BB031B562C47BB070099F7AD /* KMUserFbDespItemView.xib */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		BB072D532C057B7F00779B45 /* Window */ = {
 			isa = PBXGroup;
 			children = (
@@ -11493,6 +11640,7 @@
 		BB2C6A7128F2652500478A33 /* Class */ = {
 			isa = PBXGroup;
 			children = (
+				BB031B3D2C47BB070099F7AD /* Tools */,
 				AD7D5C7F2B8ECC74006562CD /* Parsers */,
 				BB0FE01F2B734DD1001E0F88 /* AIInfo */,
 				ADFCEB582B4FBFC50001EBAF /* AD */,
@@ -14255,6 +14403,7 @@
 				AD3AAD5F2B0DA3D400DE5FE7 /* KMCompareTextViewItem.xib in Resources */,
 				AD85D1BD2AF0D2DD000F4D28 /* KMHomeQuickToolsCollectionView.xib in Resources */,
 				ADAFD9F72AE68A8500F084BC /* KMCreatPDFView.xib in Resources */,
+				BB031B8A2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */,
 				89E4E77C2967B370002DBA6F /* KMDynamicStampViewController.xib in Resources */,
 				9FDCD8192B6CC88000E22166 /* KMFormActionButtonPopWindowController.xib in Resources */,
 				89316855296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */,
@@ -14276,6 +14425,7 @@
 				BBB2ACE02B5943F800098854 /* Quick Start Guide.pdf in Resources */,
 				9F1FE4E729406E4700E952CA /* COPYING in Resources */,
 				AD7D5CDF2B957693006562CD /* KMBookmarkOutlineFileCellView.xib in Resources */,
+				BB031B7E2C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */,
 				BB897237294B38DC0045787C /* KMWatermarkAdjectivePropertyBaseController.xib in Resources */,
 				BB2EDF4F296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.xib in Resources */,
 				89E4E7412964160F002DBA6F /* KMAnnotationLinkViewController.xib in Resources */,
@@ -14295,6 +14445,7 @@
 				ADBC2D15299CCD10006280C8 /* KMTextfieldButton.xib in Resources */,
 				ADFCEB4B2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */,
 				BB0FE0342B734DD1001E0F88 /* AIConfigWindowController.xib in Resources */,
+				BB031B632C47BB080099F7AD /* KMUserFeekbackWindowController.xib in Resources */,
 				BBD1F77F296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */,
 				BBB3769E2B10A7FD009539CC /* a_4a.png in Resources */,
 				BB24D4AA2977BE6700041659 /* KMRedactConfirmWindowController.xib in Resources */,
@@ -14359,6 +14510,7 @@
 				ADDF83712B391A5C00A81A4E /* DSignatureCreateViewController.xib in Resources */,
 				9F1F82CD292F6CF90092C4B4 /* KMPDFInsertPageWindow.xib in Resources */,
 				8997011928F40898009AF911 /* KMThumbnailViewController.xib in Resources */,
+				BB031B782C47BB090099F7AD /* KMUserListItemView.xib in Resources */,
 				BBAFC83F2985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				9FE0BBE72B0EFBA300CD1CAC /* KMAnnotationFontWindowController.xib in Resources */,
 				BB4F7E852B0C4E820077EC8C /* KMNoteFilterCollevtionViewItem.xib in Resources */,
@@ -14430,6 +14582,7 @@
 				BB46CF482AFB7E5C00281EDF /* InitialUserDefaults.plist in Resources */,
 				ADD5AE592A64DD2600C14249 /* KMPurchaseAlertView.xib in Resources */,
 				BBD8EE902B8EC86900EB05FE /* AutoSavePopController.xib in Resources */,
+				BB031B812C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */,
 				BB7F7C0029AA586800A3E4E7 /* signAdd.png in Resources */,
 				AD58F4052B14954B00299EE0 /* KMCompareTextHeaderView.xib in Resources */,
 				BBBE208F2B2164CD00509C4E /* KMPDFEditWindowController.xib in Resources */,
@@ -14476,6 +14629,7 @@
 				BB03D6902B01C7AB008C9976 /* KMPDFEditInsertBlankPageWindow.xib in Resources */,
 				9FDD0FBA295D5230000C4DAD /* KMToolbarController.xib in Resources */,
 				BB9599CF2B3184440062D346 /* KMRedactSelectPagesWindowController.xib in Resources */,
+				BB031B692C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */,
 				BB6347B02AF1F0BB00F5438E /* KMBatchOperateConvertViewController.xib in Resources */,
 				9F0201912A1DDAA500C9B673 /* KMAITranslationWindowController.xib in Resources */,
 				BB183DDA2B4EBE1B00F99C7E /* KMTrialSuccessController.xib in Resources */,
@@ -14485,6 +14639,7 @@
 				BB6347C82AF24F6C00F5438E /* KMBatchoperateConvertCollectionViewItem.xib in Resources */,
 				BB183DD42B4EAD5400F99C7E /* Ubuntu-Bold.ttf in Resources */,
 				9FB220DA2B0F4ED400A5B208 /* KMAnnotationSelectLinkViewController.xib in Resources */,
+				BB031B5A2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */,
 				89752DED293875FC003FF08E /* KMMainToolbarController.xib in Resources */,
 				9FAAA335290BD0A20046FFCE /* KMHistoryFileCollectionViewItem.xib in Resources */,
 				ADD1B6CB2942E85300C3FFF7 /* KMPrintBottomView.xib in Resources */,
@@ -14684,6 +14839,7 @@
 				ADFCEB612B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */,
 				9FBA0F0129015A82001117AF /* KMFastToolCollectionViewItem.xib in Resources */,
 				ADAFDA4C2AEA7F2700F084BC /* KMAdvertisementShowView.xib in Resources */,
+				BB031B872C47BB090099F7AD /* KMUserFbTypeItemView.xib in Resources */,
 				BB8810612B4F74DD00AFA63E /* KMRepeatTrialAlertController.xib in Resources */,
 				ADE787A52AA5A833002EC85A /* KMAccountExceptionWindowController.xib in Resources */,
 				BBFBE6C528DD7B98008B2335 /* Main.storyboard in Resources */,
@@ -14833,6 +14989,7 @@
 				BB65A0832AF8FEA1003A27A0 /* KMBatchOperateRemoveHeaderFooterViewController.xib in Resources */,
 				BB4F7E9A2B0C858D0077EC8C /* KMNoteTypeCollectionViewItem.xib in Resources */,
 				ADDF83842B391A5D00A81A4E /* DSignatureSaveTypeViewController.xib in Resources */,
+				BB031B5B2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */,
 				ADE86AA92B031FFA00414DFA /* KMCompareView.xib in Resources */,
 				9FF94F1D29A770B500B1EF69 /* KMFillSignShapePanel.xib in Resources */,
 				BB49ECFA293F44DC00C82CA2 /* KMConvertExcelWindowController.xib in Resources */,
@@ -14847,6 +15004,7 @@
 				BB072D622C05AC8F00779B45 /* KMToolbarConfigViewItem.xib in Resources */,
 				AD2BF2322B5620110029F03F /* SF-Pro-Text-Regular.otf in Resources */,
 				BB8F455B295AA1270037EA22 /* KMHeaderFooterPropertyInfoController.xib in Resources */,
+				BB031B792C47BB090099F7AD /* KMUserListItemView.xib in Resources */,
 				BB7F7BFB29AA469F00A3E4E7 /* KMSigntureViewItem.xib in Resources */,
 				BBC70EAA2AEA6EF800AC1585 /* KMToolbarCustomWindowController.xib in Resources */,
 				AD0FA51729A9FA8F00EDEB50 /* KMResetPasswordView.xib in Resources */,
@@ -14855,6 +15013,7 @@
 				9FAAA336290BD0A20046FFCE /* KMHistoryFileCollectionViewItem.xib in Resources */,
 				BBAFC8402985194800D0648E /* KMPDFEditAppendWindow.xib in Resources */,
 				BBFDFAA32AF3815C00E08AA2 /* KMTextHintWindowController.xib in Resources */,
+				BB031B7F2C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */,
 				F3B7DF9E2948565000333201 /* CPDFListHoverAnnotationViewController.xib in Resources */,
 				BBADCF592AF3C7B3004ECE0C /* KMBatchOperateAddWatermarkViewController.xib in Resources */,
 				BB1B0AF02B4FC6E900889528 /* KMFunctionGuideNameItemView.xib in Resources */,
@@ -14887,6 +15046,7 @@
 				BBFE6E69293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
 				89752DB12936F505003FF08E /* KMCustomButtonPopMenuViewController.xib in Resources */,
 				9F705F7A291A3A84005199AD /* KMHistoryFileDeleteWindowController.xib in Resources */,
+				BB031B6A2C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */,
 				89D9897028FD50EF003A3E87 /* KMAnnotationCollectionViewItem.xib in Resources */,
 				BB1B0B052B4FC6E900889528 /* KMCustomColorGuideView.xib in Resources */,
 				9FBA0EEA28FFC2FE001117AF /* Image.xcassets in Resources */,
@@ -15023,6 +15183,7 @@
 				9F1F82DE292F84D60092C4B4 /* KMHomeInsertActionViewController.xib in Resources */,
 				BBEC00C3295C306400A26C98 /* KMBatesPropertyController.xib in Resources */,
 				BB897262294C5DDA0045787C /* KMWatermarkPropertyInfoController.xib in Resources */,
+				BB031B642C47BB080099F7AD /* KMUserFeekbackWindowController.xib in Resources */,
 				9FDD0F68294AB645000C4DAD /* KMMainViewController.xib in Resources */,
 				BB5EC3662C2BDC9D0090EF27 /* KMTextAlignmentController.xib in Resources */,
 				BBB3769F2B10A7FD009539CC /* a_4a.png in Resources */,
@@ -15041,6 +15202,7 @@
 				9F0CB4B92977BC1000007028 /* KMPropertiesPanelPreviewSubVC.xib in Resources */,
 				BBF62C752B0347D1007B7E86 /* SplitWindowController.xib in Resources */,
 				BB1B0B022B4FC6E900889528 /* KMConvertGuideView.xib in Resources */,
+				BB031B8B2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */,
 				BBC8A7762B0640C200FA9377 /* KMBotaSearchViewController.xib in Resources */,
 				BBE66D0A2B55467C009343FA /* repeatTrialAlert_icon.png in Resources */,
 				BB8810BC2B4F872500AFA63E /* KMVerificationWindowController.xib in Resources */,
@@ -15102,6 +15264,7 @@
 				ADDF83722B391A5D00A81A4E /* DSignatureCreateViewController.xib in Resources */,
 				ADE86A7C2B0221E100414DFA /* KMSecurityWindowController.xib in Resources */,
 				BBBE20982B21B1DF00509C4E /* KMPDFInsertWindowController.xib in Resources */,
+				BB031B822C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */,
 				BB51074329A61B4100978662 /* ProgressSheet.xib in Resources */,
 				BBBE20902B2164CD00509C4E /* KMPDFEditWindowController.xib in Resources */,
 				ADE3C1C529A4C13700793B13 /* KMPrintAccessoryController_OC.xib in Resources */,
@@ -15149,6 +15312,7 @@
 				BBB789972BE8BF2400F7E09C /* AIInfoInputView.xib in Resources */,
 				AD3AAD602B0DA3D400DE5FE7 /* KMCompareTextViewItem.xib in Resources */,
 				ADD1B6F52946C07800C3FFF7 /* KMPrintChoosePageSizePosterView.xib in Resources */,
+				BB031B882C47BB090099F7AD /* KMUserFbTypeItemView.xib in Resources */,
 				BB9007042B8DDCE400623B78 /* SyncPreferences.xib in Resources */,
 				9F1FE3F5293F4F0F00E952CA /* Info.plist in Resources */,
 				BB7648E929ECECBF00931039 /* Color.xcassets in Resources */,
@@ -15330,6 +15494,7 @@
 				BB1A91702AFB7871005E5FD8 /* KMConvertWindowController.xib in Resources */,
 				BB03D6A22B024AC8008C9976 /* KMPDFEditInsertPageWindow.xib in Resources */,
 				ADAFDA122AE8DD6600F084BC /* KMAdvertisementCollectionHeadView.xib in Resources */,
+				BB031B8C2C47BB090099F7AD /* KMUserFbDespItemView.xib in Resources */,
 				ADAFDA1E2AE8DD6600F084BC /* KMAdvertisementTableView.xib in Resources */,
 				BBB789B92BE8BF2400F7E09C /* AIChatDefaultTIpItem.xib in Resources */,
 				ADAFDA0F2AE8DD6600F084BC /* KMAdvertisementCollectionViewItem.xib in Resources */,
@@ -15351,6 +15516,7 @@
 				BB9599C92B3164B40062D346 /* KMRedactPropertiesWindowController.xib in Resources */,
 				ADB2D6FF294882B70029D2B3 /* KMTextFieldStepperView.xib in Resources */,
 				9FB221042B18866E00A5B208 /* KMAnnotationSelfSignViewController.xib in Resources */,
+				BB031B802C47BB090099F7AD /* KMUserListItemCellView.xib in Resources */,
 				BB7648EA29ECECBF00931039 /* Color.xcassets in Resources */,
 				BBB2ACE22B5943F800098854 /* Quick Start Guide.pdf in Resources */,
 				ADD1B6F22946C06C00C3FFF7 /* KMPrintChoosePageSizeSizeView.xib in Resources */,
@@ -15370,6 +15536,7 @@
 				BBFE6E722930D9C600142C01 /* KMMergeSettingWindowController.xib in Resources */,
 				ADDF83762B391A5D00A81A4E /* CDSignatureDrawViewController.xib in Resources */,
 				BBF62C762B0347D1007B7E86 /* SplitWindowController.xib in Resources */,
+				BB031B652C47BB080099F7AD /* KMUserFeekbackWindowController.xib in Resources */,
 				ADFCEB4D2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */,
 				ADC63E4D2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib in Resources */,
 				BB0FE0362B734DD1001E0F88 /* AIConfigWindowController.xib in Resources */,
@@ -15434,6 +15601,7 @@
 				AD3AAD472B0B7B7B00DE5FE7 /* KMCompareThumbView.xib in Resources */,
 				ADB5E5202A3711DF007110A8 /* KMSubscribeWaterMarkView.xib in Resources */,
 				9F8DDF322924B855006CDC73 /* KMPDFToolsViewController.xib in Resources */,
+				BB031B7A2C47BB090099F7AD /* KMUserListItemView.xib in Resources */,
 				BBEC00BC295C2C1600A26C98 /* KMBatesPropertyHomeController.xib in Resources */,
 				ADDF83522B391A5C00A81A4E /* CDSignatureCertificateCustomViewController.xib in Resources */,
 				9F0CB5472986953A00007028 /* KMURLToPDFWindowController.xib in Resources */,
@@ -15505,6 +15673,7 @@
 				BBBE20912B2164CD00509C4E /* KMPDFEditWindowController.xib in Resources */,
 				ADDF83642B391A5C00A81A4E /* DSignatureFromFileViewController.xib in Resources */,
 				BB4EEF3229763EE7003A3537 /* KMRedactBaseWindowController.xib in Resources */,
+				BB031B832C47BB090099F7AD /* KMUserFbListHeaderItemView.xib in Resources */,
 				9F853A0A2947137500DF644E /* newtab.pdf in Resources */,
 				AD85D1892AEF46DF000F4D28 /* KMHomeNOFileView.xib in Resources */,
 				8997011328F40842009AF911 /* KMOutlineViewController.xib in Resources */,
@@ -15551,6 +15720,7 @@
 				BB9599D12B3184440062D346 /* KMRedactSelectPagesWindowController.xib in Resources */,
 				ADF6B87B2A48155E0090CB78 /* KMComparativeViewCollectionItem.xib in Resources */,
 				BBB789952BE8BF2400F7E09C /* AITypeItemChooseView.xib in Resources */,
+				BB031B6B2C47BB080099F7AD /* KMUserFbEmailItemView.xib in Resources */,
 				BBB789C22BE8BF2400F7E09C /* AIChatView.xib in Resources */,
 				BB183DDC2B4EBE1B00F99C7E /* KMTrialSuccessController.xib in Resources */,
 				9F56648C2988B16F00020985 /* KMTextfieldVC.xib in Resources */,
@@ -15560,6 +15730,7 @@
 				BB183DD62B4EAD5400F99C7E /* Ubuntu-Bold.ttf in Resources */,
 				BBB789832BE8BF2300F7E09C /* AINewConfigWindowController.xib in Resources */,
 				BB7F7C0529AA586900A3E4E7 /* signAddBack.png in Resources */,
+				BB031B5C2C47BB080099F7AD /* KMUserFbHelpPopController.xib in Resources */,
 				BB4BD9D12909026500A66A65 /* KMRightSideViewController.xib in Resources */,
 				9F0CB49429683DEE00007028 /* KMPropertiesPanelLineSubVC.xib in Resources */,
 				BBC348072955403D008D2CD1 /* KMWatermarkFilePropertyInfoController.xib in Resources */,
@@ -15759,6 +15930,7 @@
 				ADBC2D3C299F0A5A006280C8 /* KMPrintHelpViewController.xib in Resources */,
 				AD1D481E2AFB6B96007AC1F0 /* KMMergeWindowController.xib in Resources */,
 				ADB2D6F4294741720029D2B3 /* KMPrintPaperSetView.xib in Resources */,
+				BB031B892C47BB090099F7AD /* KMUserFbTypeItemView.xib in Resources */,
 				ADFCEB632B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */,
 				ADAFDA4E2AEA7F2700F084BC /* KMAdvertisementShowView.xib in Resources */,
 				BB65A0842AF8FEA1003A27A0 /* KMBatchOperateRemoveHeaderFooterViewController.xib in Resources */,
@@ -15857,7 +16029,9 @@
 				BB60138C2AD3A94200A76FB2 /* CPDFSignatureAnnotation+PDFListView.swift in Sources */,
 				9F53D54B2AD6696B00CCF9D8 /* ComPDFUIConfig.swift in Sources */,
 				BB003021298CEBED002DD1A0 /* KMPreferenceStepper.swift in Sources */,
+				BB031B6C2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */,
 				9FB220D72B0F4ED400A5B208 /* KMAnnotationSelectLinkViewController.swift in Sources */,
+				BB031B7B2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */,
 				9FDD0FA629533494000C4DAD /* KMJSONParser.swift in Sources */,
 				BB3D1EB22C3EAE5B001D1BBE /* KMAlignmentController.swift in Sources */,
 				BB83B8EC2BA8415A00EFF584 /* KMPageEditExtractWindowController.swift in Sources */,
@@ -15901,6 +16075,7 @@
 				BB7289E02B8838D8004B53B5 /* KMDataManager.swift in Sources */,
 				BB6347B42AF224D600F5438E /* KMConvertCollectionViewHeader.swift in Sources */,
 				AD055E7E2B88294F0035F824 /* SKBookmarkSheetController.m in Sources */,
+				BB031B6F2C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */,
 				BB897246294C19980045787C /* KMWatermarkAdjectiveListController.swift in Sources */,
 				BBA8B66F2B9027D700CB07B0 /* SKFileUpdateChecker.m in Sources */,
 				BBC347FD295448DE008D2CD1 /* KMWatermarkTemplateModel.swift in Sources */,
@@ -15929,6 +16104,7 @@
 				BB42A5D62B8ED77B0092C524 /* KMTabbingHintWindowController.swift in Sources */,
 				BBC28F4E2B0F58DD00D73206 /* KMImageToolTipWindow.swift in Sources */,
 				BB6DD80C29347F77001F0544 /* KMSecureEncryptWindowController.swift in Sources */,
+				BB031B602C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */,
 				BBB14A572978E75D00936EDB /* KMRedactMutilPageFlagWindowController.swift in Sources */,
 				ADAFDA132AE8DD6600F084BC /* KMAdvertisementCollectionViewItem.swift in Sources */,
 				899E0B092919244500B13D34 /* KMCustomTableRowView.swift in Sources */,
@@ -16022,6 +16198,7 @@
 				ADBC372929CA950500D93208 /* KMComparativeOutlineView.swift in Sources */,
 				9FDD0F64294AB645000C4DAD /* KMMainViewController.swift in Sources */,
 				BBD4267F2B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */,
+				BB031B842C47BB090099F7AD /* KMUserListItemView.swift in Sources */,
 				89D2D2FB294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				BB9599CB2B3184230062D346 /* KMRedactSelectPagesWindowController.swift in Sources */,
 				BBEF0F9A2B84A4C200A3E102 /* KMBrowserWindowController+Actions.swift in Sources */,
@@ -16343,6 +16520,7 @@
 				9FAAA325290A69920046FFCE /* KMToolSetScroller.swift in Sources */,
 				BBBE208B2B21649100509C4E /* KMPDFEditWindowController.swift in Sources */,
 				AD0FA51229A9FA8600EDEB50 /* KMResetPasswordView.swift in Sources */,
+				BB031B572C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */,
 				AD3AAD632B0DA3F600DE5FE7 /* KMCompareTextHeaderView.swift in Sources */,
 				BB3A668C2B06FD0100575343 /* KMBotaEnum.swift in Sources */,
 				BBFEF7172B3A77E700C28AC0 /* KMSystemFileMenu.swift in Sources */,
@@ -16546,6 +16724,7 @@
 				9F1FE4E129406E4700E952CA /* GTMNSAnimation+Duration.m in Sources */,
 				AD3AAD882B10349600DE5FE7 /* KMHeaderFooterWindowController.swift in Sources */,
 				9F0CB51D2986569B00007028 /* KMDesignToken+BorderRadiusBottomRight.swift in Sources */,
+				BB031B752C47BB090099F7AD /* KMUserListItemCellView.swift in Sources */,
 				ADDF83292B391A5C00A81A4E /* CPDFSelection+PDFListView.m in Sources */,
 				AD8DD2A32A9C35B2007CC9D0 /* KMThumbnailManager.swift in Sources */,
 				ADAC0DE12AC273D600FD4F52 /* KMOCToolClass.swift in Sources */,
@@ -16657,6 +16836,7 @@
 				9FCFEC8C2AD10A4400EAD2CB /* KMTextFieldSheetController.swift in Sources */,
 				BB00300F298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */,
 				ADD1B7062946CBB600C3FFF7 /* KMBaseTextFormatter.swift in Sources */,
+				BB031B722C47BB080099F7AD /* KMUserFbEmailItemView.swift in Sources */,
 				BB853C822AF8BAF0009C20C1 /* KMSetPasswordObject.swift in Sources */,
 				ADE86A8A2B02269400414DFA /* KMRemovePasswordWindowController.swift in Sources */,
 				89D2D2C129495D2100BFF5FE /* KMFormModel.swift in Sources */,
@@ -16806,6 +16986,7 @@
 				BBB14A532978DD5400936EDB /* KMRedactTools.swift in Sources */,
 				BB5F8A1129BB04F000365ADB /* GBDeviceInfo_Common.m in Sources */,
 				BBAFC83C2985194800D0648E /* KMPDFEditAppendWindow.m in Sources */,
+				BB031B5D2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */,
 				9F0201722A1B488C00C9B673 /* KMAITranslationVC.swift in Sources */,
 				9FF816F32AFB18290087EFC5 /* NSGeometry_KMExtensions.swift in Sources */,
 				9FDD0F8C2952FCE0000C4DAD /* KMGlobalParser.swift in Sources */,
@@ -16869,6 +17050,7 @@
 				9F0CB4FD298655F600007028 /* KMDesignToken+BorderColor.swift in Sources */,
 				BB0FE0432B734DD1001E0F88 /* AITypeChooseView.swift in Sources */,
 				BBB1A3A629F6B66400E54E47 /* NSPanel+KMExtension.swift in Sources */,
+				BB031B662C47BB080099F7AD /* KMUserFbListModel.swift in Sources */,
 				BB3A81AC2AC2A4E4006FC66C /* NSTextView+KMExtension.swift in Sources */,
 				BB65A0802AF8FE7A003A27A0 /* KMBatchOperateRemoveHeaderFooterViewController.swift in Sources */,
 				ADFCEB322B4F78150001EBAF /* KMFileManager.swift in Sources */,
@@ -17047,6 +17229,7 @@
 				BB3D971B2B3060B5007094C8 /* KMPDFAnnotationRedactConfig.swift in Sources */,
 				BBB7899D2BE8BF2400F7E09C /* CustomCornerView.swift in Sources */,
 				BB8B9A022B355EFB00A066EC /* KMLeftSideViewController+Outline.swift in Sources */,
+				BB031B5E2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */,
 				BBA9222C2B4E96450061057A /* KMPurchaseCompareWindowController.m in Sources */,
 				BB8F4540295A98960037EA22 /* KMHeaderFooterPropertyController.swift in Sources */,
 				ADBC373D29CA9AE100D93208 /* KMComparativeManager.swift in Sources */,
@@ -17072,6 +17255,7 @@
 				9F5752EA2B58FF73005DC303 /* KMAnnotationFromViewController.swift in Sources */,
 				9F8810962B56877C00F69815 /* KMAnnotationChoiceWidgetOptionsViewController.swift in Sources */,
 				9F78EFC728F7E965001E66F4 /* KMHomeViewController+UI.swift in Sources */,
+				BB031B732C47BB080099F7AD /* KMUserFbEmailItemView.swift in Sources */,
 				9FBA0EFA2900188F001117AF /* KMFastToolCollectionView.swift in Sources */,
 				9FBA0EFF29015A82001117AF /* KMFastToolCollectionViewItem.swift in Sources */,
 				BB003036298D356E002DD1A0 /* KMPreferenceMarkupColorView.swift in Sources */,
@@ -17488,6 +17672,7 @@
 				9F0CB4702967E63100007028 /* KMPropertiesPanelNameSubVC.swift in Sources */,
 				9FD0FA3229CD947000F2AB0D /* KMOpacityPanel.swift in Sources */,
 				BB71854B2C2B0DC500C1156B /* KMEditPDFModel.swift in Sources */,
+				BB031B852C47BB090099F7AD /* KMUserListItemView.swift in Sources */,
 				BB89722A294B08720045787C /* KMWatermarkAdjectiveTopBarItemModel.swift in Sources */,
 				BB146FCD299DC0D100784A6A /* GTMSessionUploadFetcher.m in Sources */,
 				BB14701E299DC0D100784A6A /* OIDIDToken.m in Sources */,
@@ -17681,6 +17866,7 @@
 				AD867F9529D955BF00F00440 /* KMBOTAOutlineCellView.swift in Sources */,
 				AD58F40F2B1DAAA800299EE0 /* KMPrintDefaultView.swift in Sources */,
 				BB03D68D2B01C782008C9976 /* KMPDFEditInsertBlankPageWindow.swift in Sources */,
+				BB031B612C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */,
 				9F0CB5432986953A00007028 /* KMURLToPDFWindowController.swift in Sources */,
 				BBA8B7B0293600D70097D183 /* KMPasswordInputWindow.swift in Sources */,
 				ADC63E382A49813E00854E02 /* KMSubscribeSuccessWindowController.swift in Sources */,
@@ -17729,6 +17915,7 @@
 				899700E928F3E4D3009AF911 /* MainWindowController.swift in Sources */,
 				BBBE209C2B21E5F100509C4E /* KMAlertTool.swift in Sources */,
 				ADDF839F2B391A5D00A81A4E /* CDSignatureDrawViewController.swift in Sources */,
+				BB031B762C47BB090099F7AD /* KMUserListItemCellView.swift in Sources */,
 				ADD1B6E02946BFD500C3FFF7 /* KMPrintChoosePageSizeSizeView.swift in Sources */,
 				9F512CC82B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift in Sources */,
 				BBFE6E5E2930809A00142C01 /* KMMergeCollectionPageViewItem.swift in Sources */,
@@ -17736,6 +17923,7 @@
 				BB8F457F295B00130037EA22 /* KMWatermarkAdjectiveTools.swift in Sources */,
 				9FF816F42AFB18290087EFC5 /* NSGeometry_KMExtensions.swift in Sources */,
 				BB332D542995D8B500CABB58 /* KMCloudDocumentTools.swift in Sources */,
+				BB031B582C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */,
 				BBA93D3429BF0ECE0044E0DD /* SKKeychain.m in Sources */,
 				9FCFEC752AC56ECE00EAD2CB /* CPDFListStampAnnotation.swift in Sources */,
 				BBB789AC2BE8BF2400F7E09C /* AIChatDefaultTIpItem.swift in Sources */,
@@ -17912,6 +18100,7 @@
 				9FCFEC9D2AD152FA00EAD2CB /* CustomAlertView.swift in Sources */,
 				BB42A5D92B8F0F840092C524 /* KMTabbingHintWindowController.swift in Sources */,
 				BB67EE1B2B54FFEF00573BF0 /* ASIHTTPRequest.m in Sources */,
+				BB031B7C2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */,
 				BB147000299DC0D100784A6A /* OIDRedirectHTTPHandler.m in Sources */,
 				AD055E672B872FB50035F824 /* SKAlias.m in Sources */,
 				BB147003299DC0D100784A6A /* OIDScopeUtilities.m in Sources */,
@@ -17985,6 +18174,7 @@
 				BB2C84672BAE716600AF6142 /* KMPopupMenuObject.swift in Sources */,
 				BBA8B6702B9027D700CB07B0 /* SKFileUpdateChecker.m in Sources */,
 				BB897225294B07960045787C /* KMWatermarkAdjectiveTopBarItemView.swift in Sources */,
+				BB031B702C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */,
 				ADDEEA6F2AD3E16100EF675D /* KMSigntureViewItem.swift in Sources */,
 				BB14703F299DC0D200784A6A /* OIDEndSessionResponse.m in Sources */,
 				BB2F9AB42AFCC2F800F9DD93 /* KMProfileInfoWindowController.swift in Sources */,
@@ -18062,7 +18252,9 @@
 				BB3A81B12AC2B82A006FC66C /* KMPageSizeTool.swift in Sources */,
 				ADAFDA352AE8EE9300F084BC /* KMAdvertisementImage.swift in Sources */,
 				9F1F82CB292F6CF90092C4B4 /* KMPDFInsertPageWindow.swift in Sources */,
+				BB031B6D2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */,
 				AD1FE8182BD7C98300AA4A9B /* KMPDFMultiplePrintWindowController.m in Sources */,
+				BB031B672C47BB080099F7AD /* KMUserFbListModel.swift in Sources */,
 				BBF729BC2B19717200576AC5 /* KMBatchRemoveBackgroundOperation.swift in Sources */,
 				ADB5E51A2A3711CB007110A8 /* KMSubscribeWaterMarkView.swift in Sources */,
 				BB8F456E295AC1220037EA22 /* KMHeaderFooterAdjectiveModel.swift in Sources */,
@@ -18291,7 +18483,9 @@
 				BB146FD1299DC0D100784A6A /* GTMMIMEDocument.m in Sources */,
 				9FCFECA62AD237B500EAD2CB /* KMBatchTableRowView.swift in Sources */,
 				AD055E832B88294F0035F824 /* SKBookmarkController.m in Sources */,
+				BB031B6E2C47BB080099F7AD /* KMUserFbDespItemView.swift in Sources */,
 				BBAC26A62AFE134300563A08 /* KMToolbarItemPopViewController.swift in Sources */,
+				BB031B7D2C47BB090099F7AD /* KMUserFbListHeaderItemView.swift in Sources */,
 				BB93CDEB2AE7B6E100B29C57 /* KMToolbarView.swift in Sources */,
 				BB3D1EB42C3EAE5B001D1BBE /* KMAlignmentController.swift in Sources */,
 				BB83B8EE2BA8415A00EFF584 /* KMPageEditExtractWindowController.swift in Sources */,
@@ -18335,6 +18529,7 @@
 				BBFE6E5F2930809A00142C01 /* KMMergeCollectionPageViewItem.swift in Sources */,
 				AD1CA4232A061D190070541F /* KMAnnotationScreenAuthorViewItem.swift in Sources */,
 				BB897243294C028A0045787C /* KMWatermarkAdjectiveSegementControl.swift in Sources */,
+				BB031B712C47BB080099F7AD /* KMUserFbTypeItemView.swift in Sources */,
 				ADE3C1EF29A5AFB100793B13 /* KMRequestServerManager.swift in Sources */,
 				BBC70EB22AEA80EC00AC1585 /* KMToolbarCustomWindowController.swift in Sources */,
 				9F1FE4B629406E4700E952CA /* CTBrowser.m in Sources */,
@@ -18363,6 +18558,7 @@
 				BBBB6CDC2AD15B900035AA66 /* CPDFFreeTextAnnotation+PDFListView.swift in Sources */,
 				9FE0BBF22B0F2FB000CD1CAC /* KMAnnotationLineWindowController.swift in Sources */,
 				F37322F5292DF9410013862C /* CSelfSignAnnotationFreeText.m in Sources */,
+				BB031B622C47BB080099F7AD /* KMUserFeekbackWindowController.swift in Sources */,
 				AD5999382AD7D9C200412F8B /* KMPropertiesViewPopController.swift in Sources */,
 				BB147034299DC0D200784A6A /* OIDTokenResponse.m in Sources */,
 				ADDF83372B391A5C00A81A4E /* CPDFListViewConfig.m in Sources */,
@@ -18456,6 +18652,7 @@
 				9FDD0F71294AD13C000C4DAD /* KMMainViewController+Action.swift in Sources */,
 				ADF1569529A62D1D001D1018 /* KMLoginLeftImageView.swift in Sources */,
 				9F1F82E52934D5240092C4B4 /* KMHomeExtractActionViewController.swift in Sources */,
+				BB031B862C47BB090099F7AD /* KMUserListItemView.swift in Sources */,
 				9FB220E12B10850400A5B208 /* KMAnnotationStampViewController.swift in Sources */,
 				ADBC375F29CC61E100D93208 /* KMReadModelView.swift in Sources */,
 				AD867F8829D94F5100F00440 /* KMBOTAOutlineView.swift in Sources */,
@@ -18777,6 +18974,7 @@
 				AD055E802B88294F0035F824 /* SKBookmarkSheetController.m in Sources */,
 				ADDF835B2B391A5C00A81A4E /* CDSignatureCertificateStateViewController.swift in Sources */,
 				ADE86AB82B0343E600414DFA /* KMWatermarkView.swift in Sources */,
+				BB031B592C47BB080099F7AD /* KMUserFeekbackHanddler.m in Sources */,
 				BB897277294DC04F0045787C /* KMWatermartAdjectivePageRangeView.swift in Sources */,
 				BB3A66A02B0752A800575343 /* KMTocOutlineView.swift in Sources */,
 				AD7D5CD12B9573FF006562CD /* KMBookmarkOutlinePageCellView.swift in Sources */,
@@ -18980,6 +19178,7 @@
 				AD1D483C2AFB81ED007AC1F0 /* KMMergeBlankView.swift in Sources */,
 				9F3D818929A0A9A60087B5AD /* KMDesignButton.swift in Sources */,
 				BB3AD6FB29935483004FC1AE /* Reachability.m in Sources */,
+				BB031B772C47BB090099F7AD /* KMUserListItemCellView.swift in Sources */,
 				AD0FA50C29A9E74200EDEB50 /* KMLoginInputPasswordView.swift in Sources */,
 				BB146FB3299DC0D100784A6A /* GTLRErrorObject.m in Sources */,
 				ADAFDA842AEB804B00F084BC /* KMQucikToolCollectionViewItem.swift in Sources */,
@@ -19091,6 +19290,7 @@
 				BB1BFF7B2AEA0B8E003EB179 /* KMBatchOperateRightViewController.swift in Sources */,
 				F37322F8292DF9410013862C /* CSelfSignAnnotation.m in Sources */,
 				ADAC0DE32AC273D600FD4F52 /* KMOCToolClass.swift in Sources */,
+				BB031B742C47BB090099F7AD /* KMUserFbEmailItemView.swift in Sources */,
 				BB8F457C295AFB330037EA22 /* KMHeaderFooterFontInfoView.swift in Sources */,
 				ADDF83A32B391A5D00A81A4E /* DSignatureFileListViewController.swift in Sources */,
 				AD68782329A5FADC005B5210 /* KMLightMemberCache.swift in Sources */,
@@ -19240,6 +19440,7 @@
 				BB2EDF4E296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.swift in Sources */,
 				AD85D1AF2AF09C79000F4D28 /* KMHomeQuickToolsWindowCollectionViewItem.swift in Sources */,
 				BBB7B48B2A033F6200B58A5A /* KMThumbnailView.swift in Sources */,
+				BB031B5F2C47BB080099F7AD /* KMUserFbHelpPopController.swift in Sources */,
 				ADDDCE292B43A32A005B4AB5 /* AppSandboxFileAccessOpenSavePanelDelegate.m in Sources */,
 				BBE9D0942AF0A85C002E83CE /* KMBatchOperation.swift in Sources */,
 				9FBA0EF728FFC8A0001117AF /* KMCollectionView.swift in Sources */,
@@ -19303,6 +19504,7 @@
 				BBBC08802B2A93DB009B237F /* KMToolbarMainItemView.swift in Sources */,
 				ADAFDA4A2AEA7F1300F084BC /* KMAdvertisementShowView.swift in Sources */,
 				AD85D1B72AF0CCFC000F4D28 /* KMHomeHistoryListViewModel.swift in Sources */,
+				BB031B682C47BB080099F7AD /* KMUserFbListModel.swift in Sources */,
 				AD8F06192999DB5900D93CBC /* KMPrintDrawPage.swift in Sources */,
 				BB3A42A02B4BF03A006D0642 /* KMSystemPDFMenu.swift in Sources */,
 				9F512CC92B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.swift in Sources */,