All in one preferences window.

This commit is contained in:
Qiu Yuzhou
2017-03-17 23:11:12 +08:00
parent 24836d203a
commit fd0971d88d
29 changed files with 932 additions and 1486 deletions

View File

@ -1,27 +0,0 @@
//
// AdvPreferencesWindowController.swift
// ShadowsocksX-NG
//
// Created by on 16/6/6.
// Copyright © 2016 qiuyuzhou. All rights reserved.
//
import Cocoa
class AdvPreferencesWindowController: NSWindowController, NSWindowDelegate {
override func windowDidLoad() {
super.windowDidLoad()
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
self.window?.delegate = self
}
//------------------------------------------------------------
// NSWindowDelegate
func windowWillClose(_ notification: Notification) {
NotificationCenter.default
.post(name: Notification.Name(rawValue: NOTIFY_ADV_CONF_CHANGED), object: nil)
}
}

View File

@ -8,22 +8,16 @@
import Cocoa
import Carbon
import RxCocoa
import RxSwift
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {
var qrcodeWinCtrl: SWBQRCodeWindowController!
var preferencesWinCtrl: PreferencesWindowController!
var advPreferencesWinCtrl: AdvPreferencesWindowController!
var proxyPreferencesWinCtrl: ProxyPreferencesController!
var editUserRulesWinCtrl: UserRulesController!
var httpPreferencesWinCtrl : HTTPPreferencesWindowController!
var shortcutsPreferencesWinCtrl: ShortcutsPreferencesWindowController!
let keyCodeP = kVK_ANSI_P
let keyCodeS = kVK_ANSI_S
let modifierKeys = cmdKey+controlKey
var hotKeyRef: EventHotKeyRef?
var allInOnePreferencesWinCtrl: PreferencesWinController!
var launchAtLoginController: LaunchAtLoginController = LaunchAtLoginController()
@ -35,7 +29,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
@IBOutlet weak var autoModeMenuItem: NSMenuItem!
@IBOutlet weak var globalModeMenuItem: NSMenuItem!
@IBOutlet weak var manualModeMenuItem: NSMenuItem!
@IBOutlet weak var showRunningModeMenuItem: NSMenuItem!
@IBOutlet weak var serversMenuItem: NSMenuItem!
@IBOutlet var showQRCodeMenuItem: NSMenuItem!
@ -100,6 +93,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
"Kcptun.LocalHost": "127.0.0.1",
"Kcptun.LocalPort": NSNumber(value: 8388),
"Kcptun.Conn": NSNumber(value: 1),
"ShowRunningModeOnStatusBar": true,
])
statusItem = NSStatusBar.system().statusItem(withLength: AppDelegate.StatusItemIconWidth)
@ -109,13 +103,23 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
statusItem.menu = statusMenu
_ = defaults.rx.observe(Bool.self, "ShowRunningModeOnStatusBar")
// .distinctUntilChanged()
.subscribe(onNext: { value in
if let enabled = value {
self.updateStatusItemUI(isShownnRunningMode: enabled)
}
})
let notifyCenter = NotificationCenter.default
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_ADV_PROXY_CONF_CHANGED), object: nil, queue: nil
, using: {
(note) in
_ = notifyCenter.rx.notification(NOTIFY_CONF_CHANGED)
.subscribe(onNext: { noti in
SyncSSLocal()
self.applyConfig()
}
)
self.updateCopyHttpProxyExportMenu()
})
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_SERVER_PROFILES_CHANGED), object: nil, queue: nil
, using: {
(note) in
@ -131,106 +135,34 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
SyncSSLocal()
}
)
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_ADV_CONF_CHANGED), object: nil, queue: nil
, using: {
(note) in
SyncSSLocal()
self.applyConfig()
}
)
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: NOTIFY_HTTP_CONF_CHANGED), object: nil, queue: nil
, using: {
(note) in
SyncPrivoxy()
self.applyConfig()
self.updateCopyHttpProxyExportMenu()
}
)
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: "NOTIFY_TOGGLE_RUNNING"), object: nil, queue: nil
, using: {
(note) in
var isOn = UserDefaults.standard.bool(forKey: "ShadowsocksOn")
isOn = !isOn
if isOn {
self.isNameTextField.stringValue = "Shadowsocks: On".localized
}
else {
self.isNameTextField.stringValue = "Shadowsocks: Off".localized
}
UserDefaults.standard.set(isOn, forKey: "ShadowsocksOn")
self.updateMainMenu()
self.applyConfig()
self.fadeInHud()
}
)
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: "NOTIFY_SWITCH_PROXY_MODE"), object: nil, queue: nil
, using: {
(note) in
switch Globals.proxyType {
case .pac:
Globals.proxyType = .global
UserDefaults.standard.setValue("global", forKey: "ShadowsocksRunningMode")
_ = notifyCenter.rx.notification(NOTIFY_TOGGLE_RUNNING_SHORTCUT)
.subscribe(onNext: { noti in
self.doToggleRunning(showToast: true)
})
_ = notifyCenter.rx.notification(NOTIFY_SWITCH_PROXY_MODE_SHORTCUT)
.subscribe(onNext: { noti in
let mode = defaults.string(forKey: "ShadowsocksRunningMode")!
switch mode {
case "auto":
defaults.setValue("global", forKey: "ShadowsocksRunningMode")
self.isNameTextField.stringValue = "Global Mode".localized
case .global:
Globals.proxyType = .pac
UserDefaults.standard.setValue("auto", forKey: "ShadowsocksRunningMode")
case "global":
defaults.setValue("auto", forKey: "ShadowsocksRunningMode")
self.isNameTextField.stringValue = "Auto Mode By PAC".localized
default:
defaults.setValue("auto", forKey: "ShadowsocksRunningMode")
self.isNameTextField.stringValue = "Auto Mode By PAC".localized
}
self.updateRunningModeMenu()
self.applyConfig()
self.fadeInHud()
}
)
notifyCenter.addObserver(forName: NSNotification.Name(rawValue: "NOTIFY_FOUND_SS_URL"), object: nil, queue: nil) {
(note: Notification) in
let sendNotify = {
(title: String, subtitle: String, infoText: String) in
let userNote = NSUserNotification()
userNote.title = title
userNote.subtitle = subtitle
userNote.informativeText = infoText
userNote.soundName = NSUserNotificationDefaultSoundName
NSUserNotificationCenter.default
.deliver(userNote);
}
if let userInfo = (note as NSNotification).userInfo {
let urls: [URL] = userInfo["urls"] as! [URL]
let mgr = ServerProfileManager.instance
var isChanged = false
for url in urls {
if let profile = ServerProfile(url: url) {
mgr.profiles.append(profile)
isChanged = true
var subtitle: String = ""
if userInfo["source"] as! String == "qrcode" {
subtitle = "By scan QR Code".localized
} else if userInfo["source"] as! String == "url" {
subtitle = "By Handle SS URL".localized
}
sendNotify("Add Shadowsocks Server Profile".localized, subtitle, "Host: \(profile.serverHost)")
}
}
if isChanged {
mgr.save()
self.updateServersMenu()
} else {
sendNotify("Not found valid qrcode of shadowsocks profile.", "", "")
}
}
}
})
_ = notifyCenter.rx.notification(NOTIFY_FOUND_SS_URL)
.subscribe(onNext: { noti in
self.handleFoundSSURL(noti)
})
// Handle ss url scheme
NSAppleEventManager.shared().setEventHandler(self
@ -241,7 +173,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
updateCopyHttpProxyExportMenu()
updateServersMenu()
updateRunningModeMenu()
updateLaunchAtLoginMenu()
ProxyConfHelper.install()
ProxyConfHelper.startMonitorPAC()
@ -258,7 +189,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
StopKcptun()
StopPrivoxy()
ProxyConfHelper.disableProxy()
if let ref = hotKeyRef { UnregisterEventHotKey(ref) }
}
func applyConfig() {
@ -287,14 +217,27 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
// MARK: - UI Methods
@IBAction func toggleRunning(_ sender: NSMenuItem) {
self.doToggleRunning(showToast: false)
}
func doToggleRunning(showToast: Bool) {
let defaults = UserDefaults.standard
var isOn = defaults.bool(forKey: "ShadowsocksOn")
var isOn = UserDefaults.standard.bool(forKey: "ShadowsocksOn")
isOn = !isOn
defaults.set(isOn, forKey: "ShadowsocksOn")
updateMainMenu()
self.updateMainMenu()
self.applyConfig()
applyConfig()
if showToast {
if isOn {
self.isNameTextField.stringValue = "Shadowsocks: On".localized
}
else {
self.isNameTextField.stringValue = "Shadowsocks: Off".localized
}
self.fadeInHud()
}
}
@IBAction func updateGFWList(_ sender: NSMenuItem) {
@ -359,11 +302,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
ServerProfileManager.instance.exportConfigFile()
}
@IBAction func toggleLaunghAtLogin(sender: NSMenuItem) {
launchAtLoginController.launchAtLogin = !launchAtLoginController.launchAtLogin;
updateLaunchAtLoginMenu()
}
@IBAction func selectPACMode(_ sender: NSMenuItem) {
let defaults = UserDefaults.standard
defaults.setValue("auto", forKey: "ShadowsocksRunningMode")
@ -397,51 +335,16 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
ctrl.window?.makeKeyAndOrderFront(self)
}
@IBAction func editAdvPreferences(_ sender: NSMenuItem) {
if advPreferencesWinCtrl != nil {
advPreferencesWinCtrl.close()
}
let ctrl = AdvPreferencesWindowController(windowNibName: "AdvPreferencesWindowController")
advPreferencesWinCtrl = ctrl
ctrl.showWindow(self)
NSApp.activate(ignoringOtherApps: true)
ctrl.window?.makeKeyAndOrderFront(self)
}
@IBAction func editHTTPPreferences(_ sender: NSMenuItem) {
if httpPreferencesWinCtrl != nil {
httpPreferencesWinCtrl.close()
}
let ctrl = HTTPPreferencesWindowController(windowNibName: "HTTPPreferencesWindowController")
httpPreferencesWinCtrl = ctrl
ctrl.showWindow(self)
NSApp.activate(ignoringOtherApps: true)
ctrl.window?.makeKeyAndOrderFront(self)
}
@IBAction func editProxyPreferences(_ sender: NSObject) {
if proxyPreferencesWinCtrl != nil {
proxyPreferencesWinCtrl.close()
}
proxyPreferencesWinCtrl = ProxyPreferencesController(windowNibName: "ProxyPreferencesController")
proxyPreferencesWinCtrl.showWindow(self)
NSApp.activate(ignoringOtherApps: true)
proxyPreferencesWinCtrl.window?.makeKeyAndOrderFront(self)
}
@IBAction func editShortcutsPreferences(_ sender: NSMenuItem) {
if shortcutsPreferencesWinCtrl != nil {
shortcutsPreferencesWinCtrl.close()
@IBAction func showAllInOnePreferences(_ sender: NSMenuItem) {
if allInOnePreferencesWinCtrl != nil {
allInOnePreferencesWinCtrl.close()
}
shortcutsPreferencesWinCtrl = ShortcutsPreferencesWindowController(
windowNibName: "ShortcutsPreferencesWindowController")
allInOnePreferencesWinCtrl = PreferencesWinController(windowNibName: "PreferencesWinController")
shortcutsPreferencesWinCtrl.showWindow(self)
allInOnePreferencesWinCtrl.showWindow(self)
NSApp.activate(ignoringOtherApps: true)
shortcutsPreferencesWinCtrl.window?.makeKeyAndOrderFront(self)
allInOnePreferencesWinCtrl.window?.makeKeyAndOrderFront(self)
}
@IBAction func selectServer(_ sender: NSMenuItem) {
@ -495,29 +398,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
NSApp.activate(ignoringOtherApps: true)
}
@IBAction func showRunningMode(_ sender: NSMenuItem) {
sender.state = sender.state == 1 ? 0 : 1
let defaults = UserDefaults.standard
let isShown = (sender.state == 1)
defaults.set(isShown, forKey: "ShowRunningModeOnStatusBar")
updateStatusItemUI(isShownnRunningMode: isShown)
}
func updateLaunchAtLoginMenu() {
if launchAtLoginController.launchAtLogin {
lanchAtLoginMenuItem.state = 1
} else {
lanchAtLoginMenuItem.state = 0
}
}
func updateRunningModeMenu() {
let defaults = UserDefaults.standard
let mode = defaults.string(forKey: "ShadowsocksRunningMode")
showRunningModeMenuItem.title = "Show Running Mode On Status Bar".localized
showRunningModeMenuItem.state = defaults.bool(forKey: "ShowRunningModeOnStatusBar") ? 1 : 0
var serverMenuText = "Servers".localized
let mgr = ServerProfileManager.instance
@ -645,6 +529,51 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
}
}
func handleFoundSSURL(_ note: Notification) {
let sendNotify = {
(title: String, subtitle: String, infoText: String) in
let userNote = NSUserNotification()
userNote.title = title
userNote.subtitle = subtitle
userNote.informativeText = infoText
userNote.soundName = NSUserNotificationDefaultSoundName
NSUserNotificationCenter.default
.deliver(userNote);
}
if let userInfo = (note as NSNotification).userInfo {
let urls: [URL] = userInfo["urls"] as! [URL]
let mgr = ServerProfileManager.instance
var isChanged = false
for url in urls {
if let profile = ServerProfile(url: url) {
mgr.profiles.append(profile)
isChanged = true
var subtitle: String = ""
if userInfo["source"] as! String == "qrcode" {
subtitle = "By scan QR Code".localized
} else if userInfo["source"] as! String == "url" {
subtitle = "By Handle SS URL".localized
}
sendNotify("Add Shadowsocks Server Profile".localized, subtitle, "Host: \(profile.serverHost)")
}
}
if isChanged {
mgr.save()
self.updateServersMenu()
} else {
sendNotify("Not found valid qrcode of shadowsocks profile.", "", "")
}
}
}
//------------------------------------------------------------
// NSUserNotificationCenterDelegate

View File

@ -1,298 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16C67" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="AdvPreferencesWindowController" customModule="ShadowsocksX_NG" customModuleProvider="target">
<connections>
<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="Advanced Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="562" y="415" width="480" height="415"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="480" height="415"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wCp-nB-dda">
<rect key="frame" x="18" y="378" width="439" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Don't change these preferences if you have no idea what they are." id="8wL-qv-5nD">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box verticalHuggingPriority="750" fixedFrame="YES" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="JBW-8M-eHP">
<rect key="frame" x="36" y="367" width="403" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</box>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="S5h-Xx-HUG">
<rect key="frame" x="27" y="309" width="201" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Socks5 Listen Port:" id="qRs-ow-vVB">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xWv-tc-lQe">
<rect key="frame" x="27" y="342" width="201" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Socks5 Listen Address:" id="cwr-n0-zwn">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Q2L-Fh-TW1">
<rect key="frame" x="234" y="339" width="163" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="iRm-V5-3gu">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.LocalSocks5.ListenAddress" id="lWm-tS-Zgn">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="e3S-m6-k5Y">
<rect key="frame" x="27" y="245" width="201" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Timeout:" id="i4l-2S-gOQ">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sRP-xs-alR">
<rect key="frame" x="234" y="243" width="60" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="wjv-Nc-tjX">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.LocalSocks5.Timeout" id="h0q-50-04x">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="YkP-l0-oah" id="BzU-cu-104"/>
</connections>
</textField>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DiD-K0-Y43">
<rect key="frame" x="232" y="219" width="222" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable Udp Replay" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="1C3-4s-Apd">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.LocalSocks5.EnableUDPRelay" id="fuM-ii-maJ"/>
</connections>
</button>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="XQ5-fw-o8t">
<rect key="frame" x="234" y="307" width="60" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="rfR-7k-cS8">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.LocalSocks5.ListenPort" id="7vW-S9-ejr">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="uE9-0u-CJW" id="QsO-5H-MYE"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eoD-7r-Q85">
<rect key="frame" x="300" y="245" width="99" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Seconds" id="Gd3-Fm-sWh">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qVQ-tJ-cO6">
<rect key="frame" x="232" y="199" width="222" height="18"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<buttonCell key="cell" type="check" title="Enable Verbose Mode" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="dCD-gg-I2i">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.LocalSocks5.EnableVerboseMode" id="Nu9-zu-vUE"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Wsf-gl-dkY">
<rect key="frame" x="90" y="277" width="138" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local PAC Listen Port:" id="DiO-6B-ALO">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FoE-i9-Rfb">
<rect key="frame" x="234" y="275" width="60" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="XhZ-XN-MoS">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.PacServer.ListenPort" id="zY2-id-Gtj">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="uE9-0u-CJW" id="YNn-yx-cWk"/>
</connections>
</textField>
<box verticalHuggingPriority="750" fixedFrame="YES" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="ayu-Tb-kmf">
<rect key="frame" x="38" y="96" width="405" height="5"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</box>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="I4a-N9-Tkv">
<rect key="frame" x="49" y="73" width="192" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="GFW List URL:" id="dg0-gS-z5V">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6EM-r3-Ahv">
<rect key="frame" x="27" y="141" width="201" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Kcptun Listen Port:" id="lsO-IF-yJ9">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="RxZ-l7-doS">
<rect key="frame" x="27" y="174" width="201" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Kcptun Listen Address:" id="DZS-7O-reK">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j6w-ss-DoL">
<rect key="frame" x="234" y="171" width="163" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="rSB-FH-keB">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.Kcptun.LocalHost" id="VG4-u1-Ofk">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5XI-ff-D9c">
<rect key="frame" x="234" y="139" width="60" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="aI6-Jb-z17">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.Kcptun.LocalPort" id="RD2-Ch-hEH">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="uE9-0u-CJW" id="o0Q-8F-IUh"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GWE-Qq-VNc">
<rect key="frame" x="234" y="107" width="60" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="RDJ-yB-jFl">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.Kcptun.Conn" id="Zpb-zx-Js3">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="csm-xs-6ky" id="lFa-Y8-Wnv"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wiv-S7-leb">
<rect key="frame" x="52" y="110" width="176" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Num of Kcptun connections:" id="hTG-Za-OhM">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6MD-Ry-R5P">
<rect key="frame" x="48" y="20" width="378" height="45"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="fS7-It-ERD">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="pR1-Bo-AWz" name="value" keyPath="values.GFWListURL" id="49j-JU-amO">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="346" y="327.5"/>
</window>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="uE9-0u-CJW" userLabel="Port Number Formatter">
<real key="minimum" value="128"/>
<real key="maximum" value="65535"/>
</numberFormatter>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="YkP-l0-oah" userLabel="Timeout Number Formatter">
<real key="minimum" value="10"/>
<real key="maximum" value="600"/>
</numberFormatter>
<userDefaultsController representsSharedInstance="YES" id="pR1-Bo-AWz"/>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="csm-xs-6ky">
<real key="minimum" value="1"/>
<real key="maximum" value="16"/>
</numberFormatter>
</objects>
</document>

View File

@ -1,123 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="HTTPPreferencesWindowController" customModule="ShadowsocksX_NG" customModuleProvider="target">
<connections>
<outlet property="address" destination="vsw-6L-eh3" id="YNa-u9-iPl"/>
<outlet property="port" destination="lD1-xm-Qy3" id="paP-xD-EgP"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="HTTP Proxy Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" frameAutosaveName="" animationBehavior="default" id="vS3-DL-Nq3">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="109" y="131" width="253" height="190"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1057"/>
<view key="contentView" id="Qef-Mj-9z1">
<rect key="frame" x="0.0" y="0.0" width="253" height="190"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="hgn-81-fsH">
<rect key="frame" x="18" y="154" width="138" height="18"/>
<buttonCell key="cell" type="check" title="HTTP Proxy Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="dqU-MG-Sum">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="Adn-6l-wm4" name="value" keyPath="values.LocalHTTPOn" id="Oey-LL-A84"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="P4f-0N-7JI">
<rect key="frame" x="18" y="126" width="141" height="18"/>
<buttonCell key="cell" type="check" title="Follow Global Mode" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ofk-Pc-c8f">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="Adn-6l-wm4" name="value" keyPath="values.LocalHTTP.FollowGlobal" id="mwB-AA-WgF"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CKF-K9-m8X">
<rect key="frame" x="18" y="103" width="217" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="HTTP Proxy Listen Address:" id="qd0-kc-ttB">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ecd-cS-zUI">
<rect key="frame" x="18" y="50" width="217" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="HTTP Proxy Listen Port:" id="2Sd-yn-gdY">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vsw-6L-eh3">
<rect key="frame" x="20" y="73" width="213" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="chf-Id-e5F">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="Adn-6l-wm4" name="value" keyPath="values.LocalHTTP.ListenAddress" id="TLb-4n-tsg">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lD1-xm-Qy3">
<rect key="frame" x="20" y="20" width="213" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="KR0-Ey-wq8">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="Adn-6l-wm4" name="value" keyPath="values.LocalHTTP.ListenPort" id="bVc-jE-7Ve">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="ji3-e7-HNW" id="xWV-vJ-7eq"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="CKF-K9-m8X" firstAttribute="top" secondItem="P4f-0N-7JI" secondAttribute="bottom" constant="8" symbolic="YES" id="3JQ-SJ-TSN"/>
<constraint firstItem="Ecd-cS-zUI" firstAttribute="trailing" secondItem="lD1-xm-Qy3" secondAttribute="trailing" id="7gU-3r-116"/>
<constraint firstItem="hgn-81-fsH" firstAttribute="leading" secondItem="P4f-0N-7JI" secondAttribute="leading" id="9a5-Oj-c36"/>
<constraint firstItem="P4f-0N-7JI" firstAttribute="leading" secondItem="CKF-K9-m8X" secondAttribute="leading" id="FNT-X2-Wjy"/>
<constraint firstItem="hgn-81-fsH" firstAttribute="top" secondItem="Qef-Mj-9z1" secondAttribute="top" constant="20" symbolic="YES" id="G6a-3j-ZVI"/>
<constraint firstItem="vsw-6L-eh3" firstAttribute="trailing" secondItem="Ecd-cS-zUI" secondAttribute="trailing" id="Imt-lq-XHl"/>
<constraint firstItem="CKF-K9-m8X" firstAttribute="trailing" secondItem="vsw-6L-eh3" secondAttribute="trailing" id="V0q-XV-Mui"/>
<constraint firstAttribute="trailing" secondItem="CKF-K9-m8X" secondAttribute="trailing" constant="20" symbolic="YES" id="WhC-Dm-ETJ"/>
<constraint firstItem="hgn-81-fsH" firstAttribute="leading" secondItem="Qef-Mj-9z1" secondAttribute="leading" constant="20" symbolic="YES" id="XKp-Ug-dvt"/>
<constraint firstItem="vsw-6L-eh3" firstAttribute="leading" secondItem="Ecd-cS-zUI" secondAttribute="leading" id="bep-WS-ThG"/>
<constraint firstItem="lD1-xm-Qy3" firstAttribute="top" secondItem="Ecd-cS-zUI" secondAttribute="bottom" constant="8" symbolic="YES" id="fap-29-XS4"/>
<constraint firstAttribute="bottom" secondItem="lD1-xm-Qy3" secondAttribute="bottom" constant="20" symbolic="YES" id="nDF-aL-c9J"/>
<constraint firstItem="CKF-K9-m8X" firstAttribute="leading" secondItem="vsw-6L-eh3" secondAttribute="leading" id="o6R-dQ-3gq"/>
<constraint firstItem="Ecd-cS-zUI" firstAttribute="leading" secondItem="lD1-xm-Qy3" secondAttribute="leading" id="oWo-gR-cua"/>
<constraint firstItem="vsw-6L-eh3" firstAttribute="top" secondItem="CKF-K9-m8X" secondAttribute="bottom" constant="8" symbolic="YES" id="q8d-OA-Ea2"/>
<constraint firstItem="Ecd-cS-zUI" firstAttribute="top" secondItem="vsw-6L-eh3" secondAttribute="bottom" constant="6" id="zdB-fb-Nth"/>
</constraints>
</view>
<connections>
<outlet property="delegate" destination="-2" id="mD3-X9-VEN"/>
</connections>
<point key="canvasLocation" x="2.5" y="106"/>
</window>
<userDefaultsController representsSharedInstance="YES" id="Adn-6l-wm4"/>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="ji3-e7-HNW" userLabel="Port Number Formatter">
<real key="minimum" value="128"/>
<real key="maximum" value="65535"/>
</numberFormatter>
</objects>
</document>

View File

@ -22,7 +22,6 @@
<outlet property="hudWindow" destination="QWV-F6-ac1" id="K6D-a4-oqE"/>
<outlet property="importBunchJsonFileItem" destination="T9g-gy-gvv" id="vua-jg-YWe"/>
<outlet property="isNameTextField" destination="rUN-Nq-HDb" id="ayK-aM-rSa"/>
<outlet property="lanchAtLoginMenuItem" destination="eUq-p7-ICK" id="q3D-7x-0db"/>
<outlet property="manualModeMenuItem" destination="8PR-gs-c5N" id="9qz-mU-5kt"/>
<outlet property="panelView" destination="rai-SH-9tZ" id="5aU-ld-rWb"/>
<outlet property="runningStatusMenuItem" destination="fzk-mE-CEV" id="Vwm-Rg-Ykn"/>
@ -31,7 +30,6 @@
<outlet property="serversPreferencesMenuItem" destination="M5r-E7-44f" id="voe-SX-k6a"/>
<outlet property="showBunchJsonExampleFileItem" destination="pdy-JE-50Q" id="xcZ-ep-mON"/>
<outlet property="showQRCodeMenuItem" destination="R6A-96-Zcb" id="XHz-pz-nCz"/>
<outlet property="showRunningModeMenuItem" destination="CCV-hX-fVA" id="AU2-hH-w8F"/>
<outlet property="statusMenu" destination="Hob-KD-bx9" id="clA-ZW-0pT"/>
<outlet property="toggleRunningMenuItem" destination="GSu-Tf-StS" id="XHw-pU-nCa"/>
</connections>
@ -100,13 +98,6 @@
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="vwY-hQ-ZIz"/>
<menuItem title="Copy HTTP Proxy Shell Export Line" id="lg6-To-GZA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="copyExportCommand:" target="Voe-Tx-rLC" id="2U4-3M-sAK"/>
</connections>
</menuItem>
<menuItem title="Scan QR Code From Screen ..." id="Qe6-bF-paT">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
@ -119,63 +110,29 @@
<action selector="showQRCodeForCurrentServer:" target="Voe-Tx-rLC" id="t45-Zk-cai"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="u7F-RD-aTA"/>
<menuItem title="Preferences" id="iVn-LD-Ynd">
<menuItem isSeparatorItem="YES" id="vwY-hQ-ZIz"/>
<menuItem title="Preferences ..." keyEquivalent="," id="4CS-qD-zW5">
<connections>
<action selector="showAllInOnePreferences:" target="Voe-Tx-rLC" id="2of-nZ-atc"/>
</connections>
</menuItem>
<menuItem title="Copy HTTP Proxy Shell Export Line" id="lg6-To-GZA">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Preferences" id="kXL-sZ-jT9">
<items>
<menuItem title="Update PAC from GFW List" id="TFc-Ec-duM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="updateGFWList:" target="Voe-Tx-rLC" id="Ztt-PS-F3T"/>
</connections>
</menuItem>
<menuItem title="Edit User Rules For PAC..." id="rms-p0-CvB">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="editUserRulesForPAC:" target="Voe-Tx-rLC" id="ZtK-2d-Pcl"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bMX-qn-Qwi"/>
<menuItem title="Advanced Preferences ..." id="bZ3-fy-34d">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="editAdvPreferences:" target="Voe-Tx-rLC" id="mEF-XS-HJE"/>
</connections>
</menuItem>
<menuItem title="HTTP Proxy Preferences ..." id="uEp-Gz-cu0">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="editHTTPPreferences:" target="Voe-Tx-rLC" id="tkC-e3-PH9"/>
</connections>
</menuItem>
<menuItem title="Advanced PAC Proxy Preferences ..." id="sbx-yz-3lO">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="editProxyPreferences:" target="Voe-Tx-rLC" id="Jji-Ea-Sy8"/>
</connections>
</menuItem>
<menuItem title="Shortcuts Preferences ..." id="waZ-9G-2Xw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="editShortcutsPreferences:" target="Voe-Tx-rLC" id="dMl-t6-50N"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="ZrT-7B-OmN"/>
<menuItem title="Launch At Login" id="eUq-p7-ICK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleLaunghAtLoginWithSender:" target="Voe-Tx-rLC" id="eFB-1Q-AOT"/>
</connections>
</menuItem>
<menuItem title="Show Running Mode In Status Bar" id="CCV-hX-fVA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="showRunningMode:" target="Voe-Tx-rLC" id="PxO-ut-PEx"/>
</connections>
</menuItem>
</items>
</menu>
<connections>
<action selector="copyExportCommand:" target="Voe-Tx-rLC" id="2U4-3M-sAK"/>
</connections>
</menuItem>
<menuItem title="Update PAC from GFW List" id="TFc-Ec-duM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="updateGFWList:" target="Voe-Tx-rLC" id="Ztt-PS-F3T"/>
</connections>
</menuItem>
<menuItem title="Edit User Rules For PAC..." id="rms-p0-CvB">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="editUserRulesForPAC:" target="Voe-Tx-rLC" id="ZtK-2d-Pcl"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="DTJ-NF-Wxr"/>
<menuItem title="Show Logs..." id="Jfy-sf-Fhl">

View File

@ -1,139 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="ProxyPreferencesController" customModule="ShadowsocksX_NG" customModuleProvider="target">
<connections>
<outlet property="autoConfigCheckBox" destination="al4-wo-BVS" id="y3x-oN-Wn7"/>
<outlet property="tableView" destination="tdp-Lr-L64" id="yJ0-tP-gVw"/>
<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="Advanced Proxy Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<rect key="contentRect" x="503" y="308" width="298" height="311"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<view key="contentView" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="298" height="311"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="al4-wo-BVS">
<rect key="frame" x="18" y="275" width="262" height="18"/>
<buttonCell key="cell" type="check" title="Auto Configure" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="FLv-D9-CRw">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="-2" name="value" keyPath="autoConfigureNetworkServices" id="SgV-RH-wUe"/>
</connections>
</button>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="657-dv-Val">
<rect key="frame" x="20" y="61" width="258" height="199"/>
<clipView key="contentView" id="i6C-d3-Rpb">
<rect key="frame" x="1" y="1" width="256" height="197"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" id="tdp-Lr-L64">
<rect key="frame" x="0.0" y="0.0" width="256" height="197"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="253" minWidth="40" maxWidth="1000" id="26S-Kb-zSc">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<buttonCell key="dataCell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" inset="2" id="ucF-02-bm8">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<connections>
<binding destination="-2" name="enabled" keyPath="autoConfigureNetworkServices" id="XkV-FH-93a">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="e18-9E-A4F"/>
<outlet property="delegate" destination="-2" id="8UX-DB-agU"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="3sC-hI-IvB">
<rect key="frame" x="-7" y="-14" width="0.0" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="6OR-N8-MXx">
<rect key="frame" x="-14" y="-7" width="15" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ulk-V7-E4w">
<rect key="frame" x="203" y="13" width="81" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="69" id="pKr-lK-BZO"/>
</constraints>
<buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="rWE-M6-TvV">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="ok:" target="-2" id="GTx-sb-ino"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NVO-zo-7QI">
<rect key="frame" x="122" y="13" width="81" height="32"/>
<constraints>
<constraint firstAttribute="width" constant="69" id="tMt-LA-r5K"/>
</constraints>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lsQ-1C-OhG">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw
</string>
</buttonCell>
<connections>
<action selector="cancel:" target="-2" id="bId-aB-i6V"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="657-dv-Val" firstAttribute="trailing" secondItem="ulk-V7-E4w" secondAttribute="trailing" id="CY9-DO-bdj"/>
<constraint firstItem="NVO-zo-7QI" firstAttribute="baseline" secondItem="ulk-V7-E4w" secondAttribute="baseline" id="Eyr-b9-ZtL"/>
<constraint firstAttribute="bottom" secondItem="NVO-zo-7QI" secondAttribute="bottom" constant="20" symbolic="YES" id="FlW-Sa-FEZ"/>
<constraint firstItem="NVO-zo-7QI" firstAttribute="top" secondItem="657-dv-Val" secondAttribute="bottom" constant="20" symbolic="YES" id="Rmy-NH-TYr"/>
<constraint firstItem="al4-wo-BVS" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="20" symbolic="YES" id="VgE-Fh-JP4"/>
<constraint firstItem="657-dv-Val" firstAttribute="top" secondItem="al4-wo-BVS" secondAttribute="bottom" constant="17" id="YZs-QN-ABC"/>
<constraint firstItem="ulk-V7-E4w" firstAttribute="leading" secondItem="NVO-zo-7QI" secondAttribute="trailing" constant="12" symbolic="YES" id="YdW-u1-0yB"/>
<constraint firstItem="al4-wo-BVS" firstAttribute="leading" secondItem="657-dv-Val" secondAttribute="leading" id="de4-mH-svX"/>
<constraint firstItem="al4-wo-BVS" firstAttribute="trailing" secondItem="657-dv-Val" secondAttribute="trailing" id="fnP-5p-dPB"/>
<constraint firstAttribute="trailing" secondItem="al4-wo-BVS" secondAttribute="trailing" constant="20" symbolic="YES" id="nxt-Hr-6YP"/>
<constraint firstItem="al4-wo-BVS" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="20" symbolic="YES" id="tBQ-Gd-Hhr"/>
</constraints>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="360" y="335.5"/>
</window>
<userDefaultsController representsSharedInstance="YES" id="vMm-BK-U3M"/>
</objects>
</document>

View File

@ -1,30 +0,0 @@
//
// HTTPPreferencesWindowController.swift
// ShadowsocksX-NG
//
// Created by on 2016/10/7.
// Copyright © 2016 qiuyuzhou. All rights reserved.
//
import Cocoa
class HTTPPreferencesWindowController: NSWindowController, NSWindowDelegate {
@IBOutlet weak var address: NSTextField!
@IBOutlet weak var port: NSTextField!
override func windowDidLoad() {
super.windowDidLoad()
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
self.window?.delegate = self
}
//------------------------------------------------------------
// NSWindowDelegate
func windowWillClose(_ notification: Notification) {
NotificationCenter.default
.post(name: Notification.Name(rawValue: NOTIFY_HTTP_CONF_CHANGED), object: nil)
}
}

View File

@ -27,5 +27,6 @@
@property(assign) BOOL launchAtLogin;
+ (instancetype) shared;
@end

View File

@ -44,15 +44,26 @@
{
self = [super init];
if (self) {
_enabled = [[NSUserDefaults standardUserDefaults] boolForKey: @"LaunchAtLogin"];
_enabled = NO;
BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey: @"LaunchAtLogin"];
[self setLaunchAtLogin:enabled];
}
return self;
}
- (void) dealloc
{
}
+ (instancetype) shared {
static LaunchAtLoginController* ctrl = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ctrl = [[self alloc]init];
});
return ctrl;
}
- (void) setLaunchAtLogin: (BOOL) enabled
{
if (SMLoginItemSetEnabled(
@ -61,6 +72,10 @@
_enabled = enabled;
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool: enabled forKey: @"LaunchAtLogin"];
NSLog(@"Call SMLoginItemSetEnabled with [%hhd] success", enabled);
} else {
NSLog(@"Call SMLoginItemSetEnabled with [%hhd] failed", enabled);
}
}

View File

@ -11,5 +11,16 @@ import Foundation
let NOTIFY_SERVER_PROFILES_CHANGED = "NOTIFY_SERVER_PROFILES_CHANGED"
let NOTIFY_ADV_PROXY_CONF_CHANGED = "NOTIFY_ADV_PROXY_CONF_CHANGED"
let NOTIFY_ADV_CONF_CHANGED = "NOTIFY_ADV_CONF_CHANGED"
let NOTIFY_HTTP_CONF_CHANGED = "NOTIFY_HTTP_CONF_CHANGED"
let NOTIFY_INVALIDE_QR = "NOTIFY_INVALIDE_QR"
let NOTIFY_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_CONF_CHANGED")
//let NOTIFY_SS_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_SS_CONF_CHANGED")
let NOTIFY_HTTP_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_HTTP_CONF_CHANGED")
//let NOTIFY_KCPTUN_CONF_CHANGED = Notification.Name(rawValue: "NOTIFY_KCPTUN_CONF_CHANGED")
let NOTIFY_TOGGLE_RUNNING_SHORTCUT = Notification.Name(rawValue: "NOTIFY_TOGGLE_RUNNING_SHORTCUT")
let NOTIFY_SWITCH_PROXY_MODE_SHORTCUT = Notification.Name(rawValue: "NOTIFY_SWITCH_PROXY_MODE_SHORTCUT")
let NOTIFY_FOUND_SS_URL = Notification.Name(rawValue: "NOTIFY_FOUND_SS_URL")

View File

@ -0,0 +1,34 @@
//
// PreferencesWinController.swift
// ShadowsocksX-NG
//
// Created by on 2017/3/11.
// Copyright © 2017 qiuyuzhou. All rights reserved.
//
import Cocoa
import RxCocoa
import RxSwift
class PreferencesWinController: NSWindowController {
@IBOutlet weak var toolbar: NSToolbar!
@IBOutlet weak var tabView: NSTabView!
override func windowDidLoad() {
super.windowDidLoad()
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
toolbar.selectedItemIdentifier = "general"
}
func windowWillClose(_ notification: Notification) {
NotificationCenter.default
.post(name: NOTIFY_CONF_CHANGED, object: nil)
}
@IBAction func toolbarAction(sender: NSToolbarItem) {
tabView.selectTabViewItem(withIdentifier: sender.itemIdentifier)
}
}

View File

@ -0,0 +1,697 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PreferencesWinController" customModule="ShadowsocksX_NG" customModuleProvider="target">
<connections>
<outlet property="tabView" destination="h22-uy-K1x" id="yH1-8m-Qpe"/>
<outlet property="toolbar" destination="D9u-IW-4jN" id="Q34-fm-M45"/>
<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="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="609" y="533" width="480" height="270"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<tabView type="noTabsNoBorder" translatesAutoresizingMaskIntoConstraints="NO" id="h22-uy-K1x">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<font key="font" metaFont="system"/>
<tabViewItems>
<tabViewItem label="General" identifier="general" id="xbG-eW-Prj">
<view key="view" id="78E-rb-Ecu">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Q6E-ur-aIL">
<rect key="frame" x="18" y="234" width="120" height="18"/>
<buttonCell key="cell" type="check" title="Launch At Login" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="XJx-j4-bBr">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="YAC-3k-qMR" name="value" keyPath="launchAtLogin" id="lF3-G5-F0w"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="oI8-ye-kyt">
<rect key="frame" x="18" y="204" width="227" height="18"/>
<buttonCell key="cell" type="check" title="Show Running Mode In Status Bar" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="wXO-Qz-yDg">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.ShowRunningModeOnStatusBar" id="Ba7-pB-dlD"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Jbe-9l-xF4">
<rect key="frame" x="18" y="165" width="192" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="188" id="O19-ow-J2E"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="GFW List URL:" id="v7a-wf-aEm">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="71I-66-7Vm">
<rect key="frame" x="20" y="112" width="440" height="45"/>
<constraints>
<constraint firstAttribute="height" constant="45" id="h4c-V0-L4X"/>
</constraints>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="left" drawsBackground="YES" id="YqN-0f-ODA">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.GFWListURL" id="Rqt-XM-aCE">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="71I-66-7Vm" firstAttribute="top" secondItem="Jbe-9l-xF4" secondAttribute="bottom" constant="8" symbolic="YES" id="2WE-UP-2z6"/>
<constraint firstItem="Jbe-9l-xF4" firstAttribute="leading" secondItem="71I-66-7Vm" secondAttribute="leading" id="BiR-FL-V4Z"/>
<constraint firstItem="oI8-ye-kyt" firstAttribute="top" secondItem="Q6E-ur-aIL" secondAttribute="bottom" constant="16" id="L2Q-NE-joq"/>
<constraint firstItem="Q6E-ur-aIL" firstAttribute="leading" secondItem="78E-rb-Ecu" secondAttribute="leading" constant="20" symbolic="YES" id="VBW-pa-frq"/>
<constraint firstItem="71I-66-7Vm" firstAttribute="centerY" secondItem="78E-rb-Ecu" secondAttribute="centerY" id="WNa-6p-XbG"/>
<constraint firstItem="Jbe-9l-xF4" firstAttribute="leading" secondItem="oI8-ye-kyt" secondAttribute="leading" id="aVD-J5-1ii"/>
<constraint firstAttribute="trailing" secondItem="71I-66-7Vm" secondAttribute="trailing" constant="20" symbolic="YES" id="cvT-wO-98l"/>
<constraint firstItem="Q6E-ur-aIL" firstAttribute="leading" secondItem="oI8-ye-kyt" secondAttribute="leading" id="dIj-cv-xuB"/>
<constraint firstItem="Q6E-ur-aIL" firstAttribute="top" secondItem="78E-rb-Ecu" secondAttribute="top" constant="20" symbolic="YES" id="dYm-8k-t7L"/>
</constraints>
</view>
</tabViewItem>
<tabViewItem label="Servers" identifier="servers" id="Dsu-Ba-zYR">
<view key="view" id="87v-B0-0YY">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
</tabViewItem>
<tabViewItem label="Advance" identifier="adv" id="ksf-9b-qoz">
<view key="view" id="Pc1-f7-0zA">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="r8z-mM-M0X">
<rect key="frame" x="35" y="198" width="201" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Socks5 Listen Port:" id="8fk-fw-Tsx">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="c8B-qf-UNK">
<rect key="frame" x="35" y="231" width="201" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Socks5 Listen Address:" id="jkc-e3-4O0">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="cd8-PU-OwG">
<rect key="frame" x="242" y="228" width="163" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="LBl-2M-X7O">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalSocks5.ListenAddress" id="UR8-Hk-Nyh">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MvY-R0-1FU">
<rect key="frame" x="35" y="134" width="201" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Timeout:" id="sQ9-bj-V0I">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Zfl-10-Wdk">
<rect key="frame" x="242" y="132" width="60" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="Ity-ir-Fyi">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalSocks5.Timeout" id="gut-fs-P9y">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="2LX-ic-DJh" id="xUL-JA-BJu"/>
</connections>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="tGd-pe-2xJ">
<rect key="frame" x="240" y="108" width="222" height="18"/>
<buttonCell key="cell" type="check" title="Enable Udp Replay" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="R3v-iN-zu8">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalSocks5.EnableUDPRelay" id="aYQ-xT-BcZ"/>
</connections>
</button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2rw-0u-LXJ">
<rect key="frame" x="242" y="196" width="60" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="60" id="FWr-dm-ysF"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="MV1-4D-sap">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalSocks5.ListenPort" id="m5T-YP-Pyp">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="C7t-aU-bub" id="ANT-yN-RZL"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="a60-LH-adV">
<rect key="frame" x="308" y="134" width="99" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="95" id="eAo-vP-NxC"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Seconds" id="4R2-UO-qs7">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="RcT-mn-xqK">
<rect key="frame" x="240" y="88" width="222" height="18"/>
<buttonCell key="cell" type="check" title="Enable Verbose Mode" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="cIS-Wb-Rzg">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalSocks5.EnableVerboseMode" id="iOb-fx-G7F"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RYj-h6-uAT">
<rect key="frame" x="98" y="166" width="138" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local PAC Listen Port:" id="IMQ-c4-gmc">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KXG-O0-ake">
<rect key="frame" x="242" y="164" width="60" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="T9o-Og-neF">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.PacServer.ListenPort" id="EkJ-YG-WZk">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="C7t-aU-bub" id="3M6-FE-SDQ"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="r8z-mM-M0X" firstAttribute="centerY" secondItem="2rw-0u-LXJ" secondAttribute="centerY" id="5fA-ZQ-ZjQ"/>
<constraint firstItem="r8z-mM-M0X" firstAttribute="leading" secondItem="MvY-R0-1FU" secondAttribute="leading" id="6eA-0g-irI"/>
<constraint firstItem="KXG-O0-ake" firstAttribute="leading" secondItem="RYj-h6-uAT" secondAttribute="trailing" constant="8" symbolic="YES" id="81I-2P-HK4"/>
<constraint firstItem="2rw-0u-LXJ" firstAttribute="leading" secondItem="KXG-O0-ake" secondAttribute="leading" id="BmQ-43-oEu"/>
<constraint firstItem="tGd-pe-2xJ" firstAttribute="top" secondItem="Zfl-10-Wdk" secondAttribute="bottom" constant="8" symbolic="YES" id="D9d-1I-YcC"/>
<constraint firstItem="RYj-h6-uAT" firstAttribute="centerY" secondItem="KXG-O0-ake" secondAttribute="centerY" id="Dgd-fs-WV1"/>
<constraint firstItem="2rw-0u-LXJ" firstAttribute="trailing" secondItem="KXG-O0-ake" secondAttribute="trailing" id="Dlo-y8-pDH"/>
<constraint firstItem="Zfl-10-Wdk" firstAttribute="leading" secondItem="tGd-pe-2xJ" secondAttribute="leading" id="ERU-7y-65C"/>
<constraint firstAttribute="trailing" secondItem="tGd-pe-2xJ" secondAttribute="trailing" constant="20" symbolic="YES" id="Hu7-bS-L8S"/>
<constraint firstItem="KXG-O0-ake" firstAttribute="leading" secondItem="Zfl-10-Wdk" secondAttribute="leading" id="JAW-8x-8Ec"/>
<constraint firstItem="cd8-PU-OwG" firstAttribute="top" secondItem="Pc1-f7-0zA" secondAttribute="top" constant="20" symbolic="YES" id="Kgn-0j-CLQ"/>
<constraint firstItem="c8B-qf-UNK" firstAttribute="baseline" secondItem="cd8-PU-OwG" secondAttribute="baseline" id="MKo-Cq-dg7"/>
<constraint firstItem="c8B-qf-UNK" firstAttribute="leading" secondItem="Pc1-f7-0zA" secondAttribute="leading" constant="37" id="O7u-jq-IpO"/>
<constraint firstItem="Zfl-10-Wdk" firstAttribute="leading" secondItem="MvY-R0-1FU" secondAttribute="trailing" constant="8" symbolic="YES" id="OMl-E5-RNK"/>
<constraint firstItem="cd8-PU-OwG" firstAttribute="trailing" secondItem="a60-LH-adV" secondAttribute="trailing" id="PVl-Og-tdF"/>
<constraint firstItem="a60-LH-adV" firstAttribute="leading" secondItem="Zfl-10-Wdk" secondAttribute="trailing" constant="8" symbolic="YES" id="W19-Vm-mO0"/>
<constraint firstItem="2rw-0u-LXJ" firstAttribute="leading" secondItem="r8z-mM-M0X" secondAttribute="trailing" constant="8" symbolic="YES" id="Ysf-HF-2KD"/>
<constraint firstItem="tGd-pe-2xJ" firstAttribute="trailing" secondItem="RcT-mn-xqK" secondAttribute="trailing" id="agb-Xy-AfZ"/>
<constraint firstItem="2rw-0u-LXJ" firstAttribute="top" secondItem="cd8-PU-OwG" secondAttribute="bottom" constant="10" symbolic="YES" id="asF-SN-6qK"/>
<constraint firstItem="Zfl-10-Wdk" firstAttribute="centerY" secondItem="a60-LH-adV" secondAttribute="centerY" id="cqe-kg-5MV"/>
<constraint firstItem="cd8-PU-OwG" firstAttribute="leading" secondItem="c8B-qf-UNK" secondAttribute="trailing" constant="8" symbolic="YES" id="eAj-w3-62X"/>
<constraint firstItem="MvY-R0-1FU" firstAttribute="baseline" secondItem="a60-LH-adV" secondAttribute="baseline" id="eUT-gJ-nfA"/>
<constraint firstItem="Zfl-10-Wdk" firstAttribute="top" secondItem="KXG-O0-ake" secondAttribute="bottom" constant="10" symbolic="YES" id="mgU-8h-vo1"/>
<constraint firstItem="KXG-O0-ake" firstAttribute="top" secondItem="2rw-0u-LXJ" secondAttribute="bottom" constant="10" symbolic="YES" id="nQG-MA-bW1"/>
<constraint firstItem="tGd-pe-2xJ" firstAttribute="leading" secondItem="RcT-mn-xqK" secondAttribute="leading" id="oCa-3p-Nbm"/>
<constraint firstAttribute="trailing" secondItem="cd8-PU-OwG" secondAttribute="trailing" constant="75" id="oTW-Py-JGm"/>
<constraint firstItem="RcT-mn-xqK" firstAttribute="top" secondItem="tGd-pe-2xJ" secondAttribute="bottom" constant="6" symbolic="YES" id="qWE-ve-msF"/>
<constraint firstItem="cd8-PU-OwG" firstAttribute="leading" secondItem="2rw-0u-LXJ" secondAttribute="leading" id="rRF-Mo-I8o"/>
<constraint firstItem="KXG-O0-ake" firstAttribute="trailing" secondItem="Zfl-10-Wdk" secondAttribute="trailing" id="s8J-cx-cKI"/>
<constraint firstItem="c8B-qf-UNK" firstAttribute="leading" secondItem="r8z-mM-M0X" secondAttribute="leading" id="tTG-qx-4ET"/>
</constraints>
</view>
</tabViewItem>
<tabViewItem label="HTTP" identifier="http" id="F5Q-Ce-JJN">
<view key="view" id="kK3-29-KeI">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XI2-x3-9ie">
<rect key="frame" x="18" y="230" width="217" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="HTTP Proxy Listen Address:" id="6W4-TY-Bw5">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="URa-Z3-BgW">
<rect key="frame" x="18" y="198" width="217" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="HTTP Proxy Listen Port:" id="Ww9-j9-WYR">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="A8G-1x-YxA">
<rect key="frame" x="247" y="228" width="213" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="p6k-oG-17u">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalHTTP.ListenAddress" id="OWW-xe-Axa">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OoG-C4-oji">
<rect key="frame" x="247" y="196" width="70" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="0bX-LS-7QW">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalHTTP.ListenPort" id="ehW-40-ivo">
<dictionary key="options">
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
</dictionary>
</binding>
<outlet property="formatter" destination="C7t-aU-bub" id="I35-3e-hTk"/>
</connections>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="xWf-Bw-9V9">
<rect key="frame" x="245" y="172" width="138" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="134" id="Wbt-ig-Mcv"/>
</constraints>
<buttonCell key="cell" type="check" title="HTTP Proxy Enable" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="jr6-x7-WJD">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalHTTPOn" id="Be3-2x-hs4"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="xki-Xv-wgd">
<rect key="frame" x="245" y="146" width="141" height="18"/>
<buttonCell key="cell" type="check" title="Follow Global Mode" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="hqM-ym-1oZ">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.LocalHTTP.FollowGlobal" id="lhA-r0-vBt"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="A8G-1x-YxA" firstAttribute="top" secondItem="kK3-29-KeI" secondAttribute="top" constant="20" symbolic="YES" id="02x-RO-tGC"/>
<constraint firstItem="URa-Z3-BgW" firstAttribute="centerY" secondItem="OoG-C4-oji" secondAttribute="centerY" id="0uL-he-BqO"/>
<constraint firstItem="XI2-x3-9ie" firstAttribute="leading" secondItem="URa-Z3-BgW" secondAttribute="leading" id="34E-fy-3Lj"/>
<constraint firstItem="xWf-Bw-9V9" firstAttribute="leading" secondItem="xki-Xv-wgd" secondAttribute="leading" id="3dK-Hu-pL1"/>
<constraint firstAttribute="trailing" secondItem="xWf-Bw-9V9" secondAttribute="trailing" constant="99" id="FRw-X4-zTm"/>
<constraint firstItem="OoG-C4-oji" firstAttribute="leading" secondItem="xWf-Bw-9V9" secondAttribute="leading" id="Kmn-zZ-K3R"/>
<constraint firstItem="XI2-x3-9ie" firstAttribute="leading" secondItem="kK3-29-KeI" secondAttribute="leading" constant="20" symbolic="YES" id="LgM-ig-Rik"/>
<constraint firstItem="A8G-1x-YxA" firstAttribute="leading" secondItem="XI2-x3-9ie" secondAttribute="trailing" constant="14" id="NLO-Id-IsN"/>
<constraint firstItem="xWf-Bw-9V9" firstAttribute="top" secondItem="OoG-C4-oji" secondAttribute="bottom" constant="8" symbolic="YES" id="ORb-2x-au5"/>
<constraint firstAttribute="trailing" secondItem="A8G-1x-YxA" secondAttribute="trailing" constant="20" symbolic="YES" id="OUP-Ip-QJc"/>
<constraint firstItem="A8G-1x-YxA" firstAttribute="leading" secondItem="OoG-C4-oji" secondAttribute="leading" id="SdK-j6-hDp"/>
<constraint firstItem="OoG-C4-oji" firstAttribute="top" secondItem="A8G-1x-YxA" secondAttribute="bottom" constant="10" symbolic="YES" id="U3H-rt-7Xd"/>
<constraint firstItem="XI2-x3-9ie" firstAttribute="trailing" secondItem="URa-Z3-BgW" secondAttribute="trailing" id="aDF-tw-Xjq"/>
<constraint firstItem="XI2-x3-9ie" firstAttribute="centerY" secondItem="A8G-1x-YxA" secondAttribute="centerY" id="bc0-WT-4zf"/>
<constraint firstItem="xki-Xv-wgd" firstAttribute="top" secondItem="xWf-Bw-9V9" secondAttribute="bottom" constant="12" id="g8b-LP-IHH"/>
<constraint firstItem="A8G-1x-YxA" firstAttribute="trailing" secondItem="OoG-C4-oji" secondAttribute="trailing" constant="143" id="mSz-1z-FKy"/>
</constraints>
</view>
</tabViewItem>
<tabViewItem label="Kcptun" identifier="kcptun" id="n2m-5k-0Ws">
<view key="view" id="gw2-in-3dl">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dyc-qt-SSc">
<rect key="frame" x="18" y="198" width="223" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Kcptun Listen Port:" id="pdk-mh-FAj">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xK4-Po-1CN">
<rect key="frame" x="18" y="231" width="223" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Local Kcptun Listen Address:" id="ejW-7L-9bP">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jK6-0O-O8H">
<rect key="frame" x="247" y="228" width="163" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="163" id="nae-H0-Mxk"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="pD7-87-JCB">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.Kcptun.LocalHost" id="q8c-ct-vnN"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sfN-cK-7R8">
<rect key="frame" x="247" y="196" width="60" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="60" id="0nA-C5-ILL"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="HXm-3x-Tre">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.Kcptun.LocalPort" id="wFe-W7-zZK"/>
<outlet property="formatter" destination="C7t-aU-bub" id="iNv-bX-XNl"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Gjd-0g-WMg">
<rect key="frame" x="247" y="164" width="60" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" alignment="right" drawsBackground="YES" id="wRJ-eh-wsG">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.Kcptun.Conn" id="1BX-t0-d3c"/>
<outlet property="formatter" destination="1En-Ey-GAr" id="j7y-xH-T4M"/>
</connections>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="AlK-Cr-J8p">
<rect key="frame" x="18" y="167" width="223" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Num of Kcptun connections:" id="FSi-9j-QBe">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Gjd-0g-WMg" firstAttribute="leading" secondItem="AlK-Cr-J8p" secondAttribute="trailing" constant="8" symbolic="YES" id="1Ik-7U-fOC"/>
<constraint firstItem="sfN-cK-7R8" firstAttribute="leading" secondItem="Dyc-qt-SSc" secondAttribute="trailing" constant="8" symbolic="YES" id="4Cq-Xv-Iw0"/>
<constraint firstItem="sfN-cK-7R8" firstAttribute="trailing" secondItem="Gjd-0g-WMg" secondAttribute="trailing" id="4Ih-25-Jcr"/>
<constraint firstItem="xK4-Po-1CN" firstAttribute="leading" secondItem="gw2-in-3dl" secondAttribute="leading" constant="20" symbolic="YES" id="EVQ-0K-ba0"/>
<constraint firstItem="sfN-cK-7R8" firstAttribute="leading" secondItem="Gjd-0g-WMg" secondAttribute="leading" id="FgI-RP-3qN"/>
<constraint firstItem="jK6-0O-O8H" firstAttribute="leading" secondItem="xK4-Po-1CN" secondAttribute="trailing" constant="8" symbolic="YES" id="bpQ-Rc-mZA"/>
<constraint firstItem="Gjd-0g-WMg" firstAttribute="top" secondItem="sfN-cK-7R8" secondAttribute="bottom" constant="10" symbolic="YES" id="dhe-rt-i5y"/>
<constraint firstItem="AlK-Cr-J8p" firstAttribute="baseline" secondItem="Gjd-0g-WMg" secondAttribute="baseline" id="gLR-wc-8Ty"/>
<constraint firstItem="jK6-0O-O8H" firstAttribute="top" secondItem="gw2-in-3dl" secondAttribute="top" constant="20" symbolic="YES" id="nQz-hC-lsV"/>
<constraint firstItem="xK4-Po-1CN" firstAttribute="baseline" secondItem="jK6-0O-O8H" secondAttribute="baseline" id="nVi-Hx-fA6"/>
<constraint firstItem="xK4-Po-1CN" firstAttribute="leading" secondItem="Dyc-qt-SSc" secondAttribute="leading" id="nox-TS-dVW"/>
<constraint firstAttribute="trailing" secondItem="jK6-0O-O8H" secondAttribute="trailing" constant="70" id="pHp-9M-UVn"/>
<constraint firstItem="Dyc-qt-SSc" firstAttribute="leading" secondItem="AlK-Cr-J8p" secondAttribute="leading" id="q3V-cG-Lmq"/>
<constraint firstItem="sfN-cK-7R8" firstAttribute="top" secondItem="jK6-0O-O8H" secondAttribute="bottom" constant="10" symbolic="YES" id="uTV-uK-wqG"/>
<constraint firstItem="Dyc-qt-SSc" firstAttribute="centerY" secondItem="sfN-cK-7R8" secondAttribute="centerY" id="wti-lk-lbk"/>
<constraint firstItem="jK6-0O-O8H" firstAttribute="leading" secondItem="sfN-cK-7R8" secondAttribute="leading" id="x37-sl-y3z"/>
</constraints>
</view>
</tabViewItem>
<tabViewItem label="Interfaces" identifier="interfaces" id="eDR-CZ-P4p">
<view key="view" id="Ati-LQ-RB7">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="x9X-2w-cOy">
<rect key="frame" x="18" y="234" width="262" height="18"/>
<buttonCell key="cell" type="check" title="Auto Configure" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="bu3-s5-bYM">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<binding destination="uQz-5y-ZL2" name="value" keyPath="values.AutoConfigureNetworkServices" id="lqW-ja-MOj"/>
</connections>
</button>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dGc-zC-AYJ">
<rect key="frame" x="20" y="20" width="258" height="199"/>
<clipView key="contentView" id="9Wy-0J-wQ8">
<rect key="frame" x="1" y="1" width="256" height="197"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" id="Vp3-dp-iqv">
<rect key="frame" x="0.0" y="0.0" width="256" height="197"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="253" minWidth="40" maxWidth="1000" id="4CL-dk-HUu">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<buttonCell key="dataCell" type="check" title="Check" bezelStyle="regularSquare" imagePosition="left" inset="2" id="8Ku-VV-ZaY">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
</tableColumn>
</tableColumns>
<connections>
<binding destination="uQz-5y-ZL2" name="enabled" keyPath="values.AutoConfigureNetworkServices" id="h72-DX-clT">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<outlet property="dataSource" destination="2Fn-b8-1pQ" id="Ri8-L6-adR"/>
<outlet property="delegate" destination="2Fn-b8-1pQ" id="w7K-z3-I2P"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="FHm-ib-d94">
<rect key="frame" x="-7" y="-14" width="0.0" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="sEE-Wn-Fcs">
<rect key="frame" x="94" y="1" width="15" height="0.0"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fMc-SG-EDy">
<rect key="frame" x="294" y="124" width="168" height="127"/>
<constraints>
<constraint firstAttribute="height" constant="127" id="7RX-Tv-NgE"/>
<constraint firstAttribute="width" constant="164" id="w3F-1W-4Xf"/>
</constraints>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Proxy mode of which network interfaces would be controlled." id="t0I-6n-gnu">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="dGc-zC-AYJ" secondAttribute="bottom" constant="20" symbolic="YES" id="08z-SE-Kyo"/>
<constraint firstItem="fMc-SG-EDy" firstAttribute="leading" secondItem="x9X-2w-cOy" secondAttribute="trailing" constant="18" id="HF3-TE-DEP"/>
<constraint firstAttribute="trailing" secondItem="fMc-SG-EDy" secondAttribute="trailing" constant="20" symbolic="YES" id="LHq-gI-4f5"/>
<constraint firstItem="x9X-2w-cOy" firstAttribute="top" secondItem="Ati-LQ-RB7" secondAttribute="top" constant="20" symbolic="YES" id="MjV-4U-Uvd"/>
<constraint firstItem="x9X-2w-cOy" firstAttribute="leading" secondItem="dGc-zC-AYJ" secondAttribute="leading" id="Prz-C0-ZQW"/>
<constraint firstItem="x9X-2w-cOy" firstAttribute="leading" secondItem="Ati-LQ-RB7" secondAttribute="leading" constant="20" symbolic="YES" id="W2K-E3-S0k"/>
<constraint firstItem="fMc-SG-EDy" firstAttribute="top" secondItem="Ati-LQ-RB7" secondAttribute="top" constant="19" id="bzT-Yv-aYZ"/>
<constraint firstItem="dGc-zC-AYJ" firstAttribute="top" secondItem="x9X-2w-cOy" secondAttribute="bottom" constant="17" id="jcx-J7-sYt"/>
<constraint firstItem="x9X-2w-cOy" firstAttribute="trailing" secondItem="dGc-zC-AYJ" secondAttribute="trailing" id="lPR-ex-Jc9"/>
</constraints>
</view>
</tabViewItem>
<tabViewItem label="Shortcuts" identifier="shortcuts" id="gpA-k4-fiw">
<view key="view" id="B6N-zy-SRg">
<rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="3eT-fn-moA" customClass="MASShortcutView">
<rect key="frame" x="240" y="204" width="163" height="19"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="associatedUserDefaultsKey" value="SwitchProxyMode"/>
</userDefinedRuntimeAttributes>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="pbX-DJ-7mU" customClass="MASShortcutView">
<rect key="frame" x="240" y="231" width="163" height="19"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="associatedUserDefaultsKey" value="ToggleRunning"/>
</userDefinedRuntimeAttributes>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="q90-qj-BXy">
<rect key="frame" x="76" y="205" width="158" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Switch mode:" id="BaL-cn-m8v">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hbS-Ox-rTR">
<rect key="frame" x="76" y="233" width="158" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="154" id="Cfg-ba-QCN"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Toggle On/Off:" id="95S-ma-8Q7">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="pbX-DJ-7mU" firstAttribute="trailing" secondItem="3eT-fn-moA" secondAttribute="trailing" id="2ju-jN-JWT"/>
<constraint firstItem="q90-qj-BXy" firstAttribute="top" secondItem="hbS-Ox-rTR" secondAttribute="bottom" constant="11" id="8B1-rf-lUm"/>
<constraint firstItem="hbS-Ox-rTR" firstAttribute="top" secondItem="B6N-zy-SRg" secondAttribute="top" constant="20" symbolic="YES" id="GwV-Dx-31a"/>
<constraint firstItem="3eT-fn-moA" firstAttribute="top" secondItem="B6N-zy-SRg" secondAttribute="top" constant="47" id="I65-QH-LP2"/>
<constraint firstItem="3eT-fn-moA" firstAttribute="top" secondItem="pbX-DJ-7mU" secondAttribute="bottom" constant="8" symbolic="YES" id="b5q-tC-PRf"/>
<constraint firstItem="hbS-Ox-rTR" firstAttribute="leading" secondItem="q90-qj-BXy" secondAttribute="leading" id="edI-pM-3gs"/>
<constraint firstAttribute="trailing" secondItem="pbX-DJ-7mU" secondAttribute="trailing" constant="77" id="iNX-Gy-TNd"/>
<constraint firstItem="pbX-DJ-7mU" firstAttribute="leading" secondItem="3eT-fn-moA" secondAttribute="leading" id="mPI-lq-sbb"/>
<constraint firstItem="hbS-Ox-rTR" firstAttribute="top" secondItem="pbX-DJ-7mU" secondAttribute="top" id="qYH-iZ-1GR"/>
<constraint firstItem="q90-qj-BXy" firstAttribute="centerY" secondItem="3eT-fn-moA" secondAttribute="centerY" id="xJ8-08-8Fu"/>
<constraint firstItem="3eT-fn-moA" firstAttribute="leading" secondItem="q90-qj-BXy" secondAttribute="trailing" constant="8" symbolic="YES" id="xK5-Lh-wlE"/>
<constraint firstItem="pbX-DJ-7mU" firstAttribute="leading" secondItem="hbS-Ox-rTR" secondAttribute="trailing" constant="8" symbolic="YES" id="xcI-TM-JBb"/>
<constraint firstItem="hbS-Ox-rTR" firstAttribute="leading" secondItem="B6N-zy-SRg" secondAttribute="leading" constant="78" id="ykb-e3-DvG"/>
</constraints>
</view>
</tabViewItem>
</tabViewItems>
</tabView>
</subviews>
<constraints>
<constraint firstItem="h22-uy-K1x" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="0QH-tN-yRQ"/>
<constraint firstAttribute="bottom" secondItem="h22-uy-K1x" secondAttribute="bottom" id="gl3-hq-ori"/>
<constraint firstAttribute="trailing" secondItem="h22-uy-K1x" secondAttribute="trailing" id="xuy-k3-WXX"/>
<constraint firstItem="h22-uy-K1x" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="yaf-oE-t8j"/>
</constraints>
</view>
<toolbar key="toolbar" implicitIdentifier="8C4EF182-55FF-4325-A88F-2B007115CF4C" autosavesConfiguration="NO" allowsUserCustomization="NO" displayMode="iconAndLabel" sizeMode="regular" id="D9u-IW-4jN">
<allowedToolbarItems>
<toolbarItem implicitItemIdentifier="0F065718-7F7B-4558-84B0-7A74B8F8AF88" explicitItemIdentifier="general" label="General" paletteLabel="General" tag="-1" image="NSPreferencesGeneral" selectable="YES" id="Mp8-cF-kQ7">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="dFv-Bx-jbl"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" id="hn4-gj-wF1"/>
<toolbarItem implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="hy4-IW-j13"/>
<toolbarItem implicitItemIdentifier="9C0ECA12-7B4E-4726-BBF8-2778E4A47812" explicitItemIdentifier="servers" label="Servers" paletteLabel="Servers" tag="-1" image="virtual-server-icon-3" selectable="YES" id="8Nu-gG-5rY">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="vgX-Ex-tTg"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="20667A16-FBAB-459E-9094-87ABC9B66795" explicitItemIdentifier="adv" label="Advanced" paletteLabel="Advanced" tag="-1" image="NSAdvanced" selectable="YES" id="kuN-wm-bl5">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="W2m-K9-R3F"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="606CACB6-02E1-4472-B422-0D19BE6A4D7C" explicitItemIdentifier="kcptun" label="Kcptun" paletteLabel="Kcptun" tag="-1" image="kcptun_1" selectable="YES" id="CIc-BO-xjN">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="aAq-xr-Teq"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="6CA73D5D-9BB2-495A-8658-D0A96900A764" explicitItemIdentifier="http" label="HTTP" paletteLabel="HTTP" tag="-1" image="http" selectable="YES" id="D0F-6S-Ztu">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="tnS-2P-ws4"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="E4909835-8791-41EE-919B-0DC2AECD6F26" explicitItemIdentifier="interfaces" label="Interfaces" paletteLabel="Interfaces" tag="-1" image="NSNetwork" selectable="YES" id="Bdm-pj-Ckd">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="X6O-F1-Axw"/>
</connections>
</toolbarItem>
<toolbarItem implicitItemIdentifier="D89D546C-0FED-46F9-AB50-6D504E105419" explicitItemIdentifier="shortcuts" label="Shortcuts" paletteLabel="Shortcuts" tag="-1" image="command-512" selectable="YES" id="kzb-T5-CPp">
<connections>
<action selector="toolbarActionWithSender:" target="-2" id="02b-iE-ZWw"/>
</connections>
</toolbarItem>
</allowedToolbarItems>
<defaultToolbarItems>
<toolbarItem reference="Mp8-cF-kQ7"/>
<toolbarItem reference="kuN-wm-bl5"/>
<toolbarItem reference="D0F-6S-Ztu"/>
<toolbarItem reference="CIc-BO-xjN"/>
<toolbarItem reference="Bdm-pj-Ckd"/>
<toolbarItem reference="kzb-T5-CPp"/>
<toolbarItem reference="hy4-IW-j13"/>
</defaultToolbarItems>
</toolbar>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
</window>
<userDefaultsController representsSharedInstance="YES" id="uQz-5y-ZL2"/>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="C7t-aU-bub" userLabel="Port Number Formatter">
<real key="minimum" value="128"/>
<real key="maximum" value="65535"/>
</numberFormatter>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="2LX-ic-DJh" userLabel="Timeout Number Formatter">
<real key="minimum" value="10"/>
<real key="maximum" value="600"/>
</numberFormatter>
<numberFormatter formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="1En-Ey-GAr" userLabel="Num of Kcptun Conn Formatter">
<real key="minimum" value="1"/>
<real key="maximum" value="16"/>
</numberFormatter>
<customObject id="YAC-3k-qMR" customClass="LaunchAtLoginController"/>
<customObject id="2Fn-b8-1pQ" customClass="ProxyInterfacesViewCtrl" customModule="ShadowsocksX_NG" customModuleProvider="target">
<connections>
<outlet property="tableView" destination="Vp3-dp-iqv" id="e8T-To-sCx"/>
<outlet property="view" destination="Ati-LQ-RB7" id="KcW-Hq-Jmh"/>
</connections>
</customObject>
</objects>
<resources>
<image name="NSAdvanced" width="32" height="32"/>
<image name="NSNetwork" width="32" height="32"/>
<image name="NSPreferencesGeneral" width="32" height="32"/>
<image name="command-512" width="512" height="512"/>
<image name="http" width="512" height="512"/>
<image name="kcptun_1" width="136" height="136"/>
<image name="virtual-server-icon-3" width="682.10528564453125" height="682.10528564453125"/>
</resources>
</document>

View File

@ -1,31 +1,27 @@
//
// ProxyPreferencesController.swift
// ProxyInterfacesTableViewCtrl.swift
// ShadowsocksX-NG
//
// Created by on 16/6/29.
// Copyright © 2016 qiuyuzhou. All rights reserved.
// Created by on 2017/3/17.
// Copyright © 2017 qiuyuzhou. All rights reserved.
//
import Cocoa
import RxCocoa
import RxSwift
class ProxyPreferencesController: NSWindowController, NSTableViewDataSource, NSTableViewDelegate {
class ProxyInterfacesViewCtrl: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
var networkServices: NSArray!
var selectedNetworkServices: NSMutableSet!
var autoConfigureNetworkServices: Bool = true
@IBOutlet weak var tableView: NSTableView!
@IBOutlet weak var autoConfigCheckBox: NSButton!
@IBOutlet var autoConfigCheckBox: NSButton!
@IBOutlet var tableView: NSTableView!
override func windowDidLoad() {
super.windowDidLoad()
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
let defaults = UserDefaults.standard
self.setValue(defaults.bool(forKey: "AutoConfigureNetworkServices"), forKey: "autoConfigureNetworkServices")
override func viewDidLoad() {
super.viewDidLoad()
let defaults = UserDefaults.standard
if let services = defaults.array(forKey: "Proxy4NetworkServices") {
selectedNetworkServices = NSMutableSet(array: services)
} else {
@ -35,26 +31,7 @@ class ProxyPreferencesController: NSWindowController, NSTableViewDataSource, NST
networkServices = ProxyConfTool.networkServicesList() as NSArray!
tableView.reloadData()
}
@IBAction func ok(_ sender: NSObject){
ProxyConfHelper.disableProxy()
let defaults = UserDefaults.standard
defaults.setValue(selectedNetworkServices.allObjects, forKeyPath: "Proxy4NetworkServices")
defaults.set(autoConfigureNetworkServices, forKey: "AutoConfigureNetworkServices")
defaults.synchronize()
window?.performClose(self)
NotificationCenter.default
.post(name: Notification.Name(rawValue: NOTIFY_ADV_PROXY_CONF_CHANGED), object: nil)
}
@IBAction func cancel(_ sender: NSObject){
window?.performClose(self)
}
//--------------------------------------------------
// For NSTableViewDataSource
func numberOfRows(in tableView: NSTableView) -> Int {

View File

@ -6,7 +6,6 @@
#import "LaunchAtLoginController.h"
#import "SWBQRCodeWindowController.h"
#import "ShortcutsPreferencesWindowController.h"
#import "ShortcutsController.h"
#import "Utils.h"
#import "ProxyConfHelper.h"

View File

@ -10,20 +10,18 @@
#import <MASShortcut/Shortcut.h>
#import "ShortcutsPreferencesWindowController.h"
@implementation ShortcutsController
+ (void)bindShortcuts {
MASShortcutBinder* binder = [MASShortcutBinder sharedBinder];
[binder
bindShortcutWithDefaultsKey:kGlobalShortcutToggleRunning
bindShortcutWithDefaultsKey: @"ToggleRunning"
toAction:^{
[[NSNotificationCenter defaultCenter] postNotificationName: @"NOTIFY_TOGGLE_RUNNING" object: nil];
}];
[binder
bindShortcutWithDefaultsKey:kGlobalShortcutSwitchProxyMode
bindShortcutWithDefaultsKey: @"SwitchProxyMode"
toAction:^{
[[NSNotificationCenter defaultCenter] postNotificationName: @"NOTIFY_SWITCH_PROXY_MODE" object: nil];
}];

View File

@ -1,22 +0,0 @@
//
// ShortcutsPreferencesWindowController.h
// ShadowsocksX-NG
//
// Created by 邱宇舟 on 2017/3/10.
// Copyright © 2017年 qiuyuzhou. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import <MASShortcut/Shortcut.h>
static NSString *const kGlobalShortcutToggleRunning = @"ToggleRunning";
static NSString *const kGlobalShortcutSwitchProxyMode= @"SwitchProxyMode";
@interface ShortcutsPreferencesWindowController : NSWindowController
@property(nonatomic, weak) IBOutlet MASShortcutView* toggleRunningShortcutCtrl;
@property(nonatomic, weak) IBOutlet MASShortcutView* switchModeShortcutCtrl;
@end

View File

@ -1,26 +0,0 @@
//
// ShortcutsPreferencesWindowController.m
// ShadowsocksX-NG
//
// Created by on 2017/3/10.
// Copyright © 2017 qiuyuzhou. All rights reserved.
//
#import "ShortcutsPreferencesWindowController.h"
@interface ShortcutsPreferencesWindowController ()
@end
@implementation ShortcutsPreferencesWindowController
- (void)windowDidLoad {
[super windowDidLoad];
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
self.toggleRunningShortcutCtrl.associatedUserDefaultsKey = kGlobalShortcutToggleRunning;
self.switchModeShortcutCtrl.associatedUserDefaultsKey = kGlobalShortcutSwitchProxyMode;
}
@end

View File

@ -1,75 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16D32" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="ShortcutsPreferencesWindowController" customModule="ShadowsocksX_NG" customModuleProvider="target">
<connections>
<outlet property="switchModeShortcutCtrl" destination="nZn-Ee-h8z" id="2iw-P1-htd"/>
<outlet property="toggleRunningShortcutCtrl" destination="zcO-rg-gXN" id="5dF-Ls-4DH"/>
<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="Shortcuts Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowPositionMask key="initialPositionMask" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="526" y="581" width="365" height="86"/>
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="877"/>
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="365" height="86"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="nZn-Ee-h8z" customClass="MASShortcutView">
<rect key="frame" x="182" y="20" width="163" height="19"/>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="zcO-rg-gXN" customClass="MASShortcutView">
<rect key="frame" x="182" y="47" width="163" height="19"/>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bme-MP-1H3">
<rect key="frame" x="18" y="21" width="158" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Switch mode:" id="MJQ-KA-SGa">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="b8A-hd-VRY">
<rect key="frame" x="18" y="49" width="158" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="154" id="O8A-ky-ag4"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Toggle On/Off:" id="7OS-YI-YRe">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="nZn-Ee-h8z" firstAttribute="leading" secondItem="Bme-MP-1H3" secondAttribute="trailing" constant="8" symbolic="YES" id="58f-cT-PLi"/>
<constraint firstItem="Bme-MP-1H3" firstAttribute="centerY" secondItem="nZn-Ee-h8z" secondAttribute="centerY" id="5WG-IQ-8Wm"/>
<constraint firstAttribute="trailing" secondItem="zcO-rg-gXN" secondAttribute="trailing" constant="20" symbolic="YES" id="7nF-aU-3ON"/>
<constraint firstAttribute="bottom" secondItem="nZn-Ee-h8z" secondAttribute="bottom" constant="20" symbolic="YES" id="8IS-fc-KM9"/>
<constraint firstItem="zcO-rg-gXN" firstAttribute="leading" secondItem="b8A-hd-VRY" secondAttribute="trailing" constant="8" symbolic="YES" id="JZG-83-he7"/>
<constraint firstItem="nZn-Ee-h8z" firstAttribute="top" secondItem="zcO-rg-gXN" secondAttribute="bottom" constant="8" symbolic="YES" id="Mw8-bt-BB0"/>
<constraint firstItem="Bme-MP-1H3" firstAttribute="top" secondItem="b8A-hd-VRY" secondAttribute="bottom" constant="11" id="cgI-f5-9dC"/>
<constraint firstItem="b8A-hd-VRY" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" constant="20" symbolic="YES" id="cge-69-H4S"/>
<constraint firstItem="b8A-hd-VRY" firstAttribute="top" secondItem="zcO-rg-gXN" secondAttribute="top" id="qUk-wA-oid"/>
<constraint firstItem="zcO-rg-gXN" firstAttribute="trailing" secondItem="nZn-Ee-h8z" secondAttribute="trailing" id="qUp-IB-sst"/>
<constraint firstItem="b8A-hd-VRY" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="20" symbolic="YES" id="ugI-XY-drL"/>
<constraint firstItem="b8A-hd-VRY" firstAttribute="leading" secondItem="Bme-MP-1H3" secondAttribute="leading" id="usZ-yb-Sy2"/>
<constraint firstItem="zcO-rg-gXN" firstAttribute="leading" secondItem="nZn-Ee-h8z" secondAttribute="leading" id="v2G-eN-Shm"/>
</constraints>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="74.5" y="54"/>
</window>
</objects>
</document>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
ShadowsocksX-NG/http.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

View File

@ -1,39 +0,0 @@
/* Class = "NSButtonCell"; title = "启用 Udp Relay"; ObjectID = "1C3-4s-Apd"; */
"1C3-4s-Apd.title" = "启用 Udp Relay";
/* Class = "NSTextFieldCell"; title = "Don't change these preferences if you have no idea what are they."; ObjectID = "8wL-qv-5nD"; */
"8wL-qv-5nD.title" = "如果你不明白这些选项是什么,请不要修改";
/* Class = "NSWindow"; title = "高级设置"; ObjectID = "F0z-JX-Cv5"; */
"F0z-JX-Cv5.title" = "高级设置";
/* Class = "NSTextFieldCell"; title = "Seconds"; ObjectID = "Gd3-Fm-sWh"; */
"Gd3-Fm-sWh.title" = "秒";
/* Class = "NSBox"; title = "Box"; ObjectID = "ayu-Tb-kmf"; */
"ayu-Tb-kmf.title" = "Box";
/* Class = "NSTextFieldCell"; title = "本地 Socks5 监听地址:"; ObjectID = "cwr-n0-zwn"; */
"cwr-n0-zwn.title" = "本地 Socks5 监听地址:";
/* Class = "NSTextFieldCell"; title = "GFW List URL:"; ObjectID = "dg0-gS-z5V"; */
"dg0-gS-z5V.title" = "GFW LIST URL:";
/* Class = "NSTextFieldCell"; title = "Timeout:"; ObjectID = "i4l-2S-gOQ"; */
"i4l-2S-gOQ.title" = "超时:";
/* Class = "NSTextFieldCell"; title = "本地 Socks5 监听端口:"; ObjectID = "qRs-ow-vVB"; */
"qRs-ow-vVB.title" = "本地 Socks5 监听端口:";
/* Class = "NSTextFieldCell"; title = "Local PAC Listen Address:"; ObjectID = "dvL-Ic-Wae"; */
"dvL-Ic-Wae.title" = "本地 PAC 监听地址:";
/* Class = "NSTextFieldCell"; title = "Local PAC Listen Port:"; ObjectID = "PSg-XK-qhl"; */
"PSg-XK-qhl.title" = "本地 PAC 监听端口:";
/* Class = "NSTextFieldCell"; title = "White List URL:"; ObjectID = "aif-uV-Lxk"; */
"aif-uV-Lxk.title" = "白名单列表 URL:";
/* Class = "NSTextFieldCell"; title = "White IP List URL:"; ObjectID = "qhu-d1-qgq"; */
"qhu-d1-qgq.title" = "白名单IP列表 URL:";

View File

@ -1,18 +0,0 @@
/* Class = "NSTextFieldCell"; title = "HTTP Proxy Listen Port:"; ObjectID = "2Sd-yn-gdY"; */
"2Sd-yn-gdY.title" = "HTTP 代理 监听端口:";
/* Class = "NSButtonCell"; title = "HTTP Proxy Enable"; ObjectID = "dqU-MG-Sum"; */
"dqU-MG-Sum.title" = "HTTP 代理 开启";
/* Class = "NSTextFieldCell"; title = "HTTP Proxy Listen Address:"; ObjectID = "qd0-kc-ttB"; */
"qd0-kc-ttB.title" = "HTTP 代理 监听地址:";
/* Class = "NSWindow"; title = "HTTP Proxy Preferences"; ObjectID = "vS3-DL-Nq3"; */
"vS3-DL-Nq3.title" = "HTTP 代理 设置";
/* Class = "NSButtonCell"; title = "Follow Global Mode"; ObjectID = "ofk-Pc-c8f"; */
"ofk-Pc-c8f.title" = "跟随全局模式";
/* Class = "NSButton"; title = "Copy Shell Export Command"; ObjectID = "ySG-BC-5r0"; */
"ySG-BC-5r0.title" = "复制终端 Export 命令";

View File

@ -1,13 +0,0 @@
/* Class = "NSWindow"; title = "Advanced Proxy Preferences"; ObjectID = "F0z-JX-Cv5"; */
"F0z-JX-Cv5.title" = "高级代理设置";
/* Class = "NSButtonCell"; title = "Auto Configure"; ObjectID = "FLv-D9-CRw"; */
"FLv-D9-CRw.title" = "自动设置";
/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "lsQ-1C-OhG"; */
"lsQ-1C-OhG.title" = "取消";
/* Class = "NSButtonCell"; title = "OK"; ObjectID = "rWE-M6-TvV"; */
"rWE-M6-TvV.title" = "确定";