|
@@ -108,7 +108,7 @@ import Cocoa
|
|
|
} else if self.configType == .proofreading {
|
|
|
tipString = NSLocalizedString("No more than 2000 characters.", comment: "")
|
|
|
} else if self.configType == .translate {
|
|
|
- tipString = NSLocalizedString("No more than 30 pages of a document.", comment: "")
|
|
|
+ tipString = NSLocalizedString("1 credit for every 10,000 characters", comment: "")
|
|
|
}
|
|
|
let popViewController = KMToolbarItemPopViewController.init()
|
|
|
if self.popOver == nil {
|
|
@@ -336,6 +336,8 @@ import Cocoa
|
|
|
|
|
|
self.translateFinish = false
|
|
|
self.translateFile = false
|
|
|
+
|
|
|
+ self.cancelBtn.isEnabled = true
|
|
|
}
|
|
|
|
|
|
func reloadData() -> Void {
|
|
@@ -421,7 +423,9 @@ import Cocoa
|
|
|
|
|
|
if self.aiResultTextView.string.count > 0 && (self.fileEmptyTextView.string.count > 0 || self.filePath.count > 0){
|
|
|
self.fileActionLabel.stringValue = NSLocalizedString("Redo (1 credit)", comment: "")
|
|
|
- self.fileActionLabel.stringValue = NSLocalizedString("Redo (1 credit)", comment: "")
|
|
|
+ if self.configType == .translate && self.filePath.isEmpty == false {
|
|
|
+ self.fileActionLabel.stringValue = NSLocalizedString("Redo", comment: "")
|
|
|
+ }
|
|
|
} else {
|
|
|
if self.configType == .summarize {
|
|
|
self.fileActionLabel.stringValue = NSLocalizedString("Summarize", comment: "") + NSLocalizedString("(1 credit)", comment: "")
|
|
@@ -431,6 +435,9 @@ import Cocoa
|
|
|
self.fileActionLabel.stringValue = NSLocalizedString("Proofread", comment: "") + NSLocalizedString("(1 credit)", comment: "")
|
|
|
} else if self.configType == .translate {
|
|
|
self.fileActionLabel.stringValue = NSLocalizedString("Translate", comment: "") + NSLocalizedString("(1 credit)", comment: "")
|
|
|
+ if self.filePath.isEmpty == false {
|
|
|
+ self.fileActionLabel.stringValue = NSLocalizedString("Translate", comment: "")
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -485,6 +492,7 @@ import Cocoa
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //MARK: WaitingView
|
|
|
func addWaingView(_ view: NSView) -> Void {
|
|
|
self.removeWaitingView(view)
|
|
|
|
|
@@ -503,8 +511,131 @@ import Cocoa
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ func aiTranslateFinish() -> Void {
|
|
|
+ self.aiConvertFinish = true
|
|
|
+ self.removePDFBtn.isEnabled = true
|
|
|
+ self.removeWaitingView(self.resultBGView)
|
|
|
+ self.updateActionViewUI()
|
|
|
+ }
|
|
|
+
|
|
|
+ //MARK: AI-Action
|
|
|
+ func aiSummarize() -> Void {
|
|
|
+ if FileManager.default.fileExists(atPath: self.filePath) {
|
|
|
+ self.aiResultTextView.string = ""
|
|
|
+ self.addWaingView(self.resultBGView)
|
|
|
+ self.enableActionView(false)
|
|
|
+ self.removePDFBtn.isEnabled = false
|
|
|
+ self.aiConvertFinish = false
|
|
|
+ self.updateResultViewUI()
|
|
|
+// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
+ KMAIRequestServerManager.defaultManager.aiAction(content: self.filePath, state: .extractSummaryFile) { wrapper in
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ self.aiConvertFinish = true
|
|
|
+ self.removePDFBtn.isEnabled = true
|
|
|
+ self.removeWaitingView(self.resultBGView)
|
|
|
+ self.updateActionViewUI()
|
|
|
+
|
|
|
+ let success = wrapper.success
|
|
|
+ if success {
|
|
|
+ let resultStr = wrapper.content
|
|
|
+ self.aiResultTextView.string = resultStr
|
|
|
+ self.updateActionViewUI()
|
|
|
+ self.updateResultViewUI()
|
|
|
+ } else {
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = wrapper.content
|
|
|
+ alert.runModal()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func aiReWriting() -> Void {
|
|
|
+ self.aiResultTextView.string = ""
|
|
|
+ self.addWaingView(self.resultBGView)
|
|
|
+ self.enableActionView(false)
|
|
|
+ self.removePDFBtn.isEnabled = false
|
|
|
+ self.aiConvertFinish = false
|
|
|
+ self.updateResultViewUI()
|
|
|
+// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
+ KMAIRequestServerManager.defaultManager.aiAction(content: self.fileEmptyTextView.string,
|
|
|
+ state: .rewrite) { wrapper in
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ self.aiConvertFinish = true
|
|
|
+ self.removePDFBtn.isEnabled = true
|
|
|
+ self.removeWaitingView(self.resultBGView)
|
|
|
+ self.updateActionViewUI()
|
|
|
+
|
|
|
+ let success = wrapper.success
|
|
|
+ if success {
|
|
|
+ let resultStr = wrapper.content
|
|
|
+ self.aiResultTextView.string = resultStr
|
|
|
+ self.updateActionViewUI()
|
|
|
+ self.updateResultViewUI()
|
|
|
+ } else {
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = wrapper.content
|
|
|
+ alert.runModal()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func aiProofreading() -> Void {
|
|
|
+ self.aiResultTextView.string = ""
|
|
|
+ self.addWaingView(self.resultBGView)
|
|
|
+ self.enableActionView(false)
|
|
|
+ self.removePDFBtn.isEnabled = false
|
|
|
+ self.aiConvertFinish = false
|
|
|
+ self.updateResultViewUI()
|
|
|
+// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
+ KMAIRequestServerManager.defaultManager.aiAction(content: self.fileEmptyTextView.string,
|
|
|
+ state: .correctTypos) { wrapper in
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ self.aiConvertFinish = true
|
|
|
+ self.removePDFBtn.isEnabled = true
|
|
|
+ self.removeWaitingView(self.resultBGView)
|
|
|
+ self.updateActionViewUI()
|
|
|
+
|
|
|
+ let success = wrapper.success
|
|
|
+ if success {
|
|
|
+ let resultStr = wrapper.content
|
|
|
+ self.aiResultTextView.string = resultStr
|
|
|
+ self.updateActionViewUI()
|
|
|
+ self.updateResultViewUI()
|
|
|
+ } else {
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = wrapper.content
|
|
|
+ alert.runModal()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func aiTranslate() -> Void {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func menuItemClick(_ item: NSMenuItem) {
|
|
|
+ if item.tag < 2000 {
|
|
|
+ self.fromLanguage = item.title
|
|
|
+ } else {
|
|
|
+ self.toLanguage = item.title
|
|
|
+ }
|
|
|
+ self.fromLanguageLabel.stringValue = self.fromLanguage
|
|
|
+ self.toLanguageLabel.stringValue = self.toLanguage
|
|
|
+ }
|
|
|
+
|
|
|
//MARK: - IBAction
|
|
|
@IBAction func chooseFileAction(_ sender: KMButton) {
|
|
|
+
|
|
|
let openPanel = NSOpenPanel()
|
|
|
openPanel.canChooseDirectories = true
|
|
|
openPanel.canChooseFiles = true
|
|
@@ -515,15 +646,21 @@ import Cocoa
|
|
|
let fileURL = openPanel.urls.first
|
|
|
let fileSize = self.getFileSize(atPath: fileURL!.path)
|
|
|
|
|
|
- if fileSize/(1024*1024) > 10 {
|
|
|
- self.fileSizeTipView.isHidden = false
|
|
|
- DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
|
|
|
- self.fileSizeTipView.isHidden = true
|
|
|
- }
|
|
|
- } else {
|
|
|
+ if self.configType == .translate {
|
|
|
self.filePath = fileURL!.path
|
|
|
self.fileEmptyTextView.string = ""
|
|
|
self.updateActionViewUI()
|
|
|
+ } else {
|
|
|
+ if fileSize/(1024*1024) > 10 {
|
|
|
+ self.fileSizeTipView.isHidden = false
|
|
|
+ DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5) {
|
|
|
+ self.fileSizeTipView.isHidden = true
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ self.filePath = fileURL!.path
|
|
|
+ self.fileEmptyTextView.string = ""
|
|
|
+ self.updateActionViewUI()
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -539,24 +676,12 @@ import Cocoa
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- @objc func menuItemClick(_ item: NSMenuItem) {
|
|
|
- if item.tag < 2000 {
|
|
|
- self.fromLanguage = item.title
|
|
|
- } else {
|
|
|
- self.toLanguage = item.title
|
|
|
- }
|
|
|
- self.fromLanguageLabel.stringValue = self.fromLanguage
|
|
|
- self.toLanguageLabel.stringValue = self.toLanguage
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
@IBAction func removePDFAction(_ sender: NSButton) {
|
|
|
self.filePath = ""
|
|
|
self.updateActionViewUI()
|
|
|
self.updateResultViewUI()
|
|
|
}
|
|
|
|
|
|
-
|
|
|
@IBAction func startAIFunction(_ sender: KMButton) {
|
|
|
|
|
|
let newStatus: Bool = KMCloudServer.isConnectionAvailable()
|
|
@@ -569,27 +694,109 @@ import Cocoa
|
|
|
}
|
|
|
|
|
|
if self.configType == .summarize {
|
|
|
- if FileManager.default.fileExists(atPath: self.filePath) {
|
|
|
- self.aiResultTextView.string = ""
|
|
|
- self.addWaingView(self.resultBGView)
|
|
|
- self.enableActionView(false)
|
|
|
+ self.aiSummarize()
|
|
|
+
|
|
|
+ } else if self.configType == .reWriting {
|
|
|
+ self.aiReWriting()
|
|
|
+
|
|
|
+ } else if self.configType == .proofreading {
|
|
|
+ self.aiProofreading()
|
|
|
+
|
|
|
+ } else if self.configType == .translate {
|
|
|
+ self.aiResultTextView.string = ""
|
|
|
+ self.addWaingView(self.resultBGView)
|
|
|
+ self.enableActionView(false)
|
|
|
+ self.translateFinish = false
|
|
|
+ self.translateResultView.isHidden = true
|
|
|
+ self.updateResultViewUI()
|
|
|
+
|
|
|
+ if self.filePath.count > 0 {
|
|
|
+ self.translateFile = true
|
|
|
self.removePDFBtn.isEnabled = false
|
|
|
self.aiConvertFinish = false
|
|
|
-// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
- KMAIRequestServerManager.defaultManager.aiAction(content: self.filePath, state: .extractSummaryFile) { wrapper in
|
|
|
+ self.cancelBtn.isEnabled = false
|
|
|
+
|
|
|
+ KMAIRequestServerManager.defaultManager.aiAction(content: self.filePath,
|
|
|
+ state: .fileTranslate,
|
|
|
+ from: self.fromLanguage,
|
|
|
+ to: self.toLanguage) { wrapper in
|
|
|
DispatchQueue.main.async {
|
|
|
- self.aiConvertFinish = true
|
|
|
- self.removePDFBtn.isEnabled = true
|
|
|
- self.removeWaitingView(self.resultBGView)
|
|
|
- self.updateActionViewUI()
|
|
|
|
|
|
- let success = wrapper.success
|
|
|
+ var success = wrapper.success
|
|
|
+ let resultStr = wrapper.content
|
|
|
+ if success == false && resultStr == "501" {
|
|
|
+ success = true
|
|
|
+ }
|
|
|
if success {
|
|
|
- let resultStr = wrapper.content
|
|
|
- self.aiResultTextView.string = resultStr
|
|
|
- self.updateActionViewUI()
|
|
|
- self.updateResultViewUI()
|
|
|
+ let translateTipWC = AITranslateTipWindowController.currentWC()
|
|
|
+
|
|
|
+ let infoDict: NSDictionary = wrapper.result
|
|
|
+ var credit: Int = 0
|
|
|
+ if infoDict["credit"] != nil {
|
|
|
+ credit = (infoDict["credit"] ?? "0") as! Int
|
|
|
+ }
|
|
|
+
|
|
|
+ var charCount: Int = 0
|
|
|
+ if infoDict["charCount"] != nil {
|
|
|
+ charCount = (infoDict["charCount"] ?? "0") as! Int
|
|
|
+ }
|
|
|
+
|
|
|
+ translateTipWC.creditValid = true
|
|
|
+ if resultStr == "501" {
|
|
|
+ translateTipWC.creditValid = false
|
|
|
+ }
|
|
|
+ translateTipWC.spendCredits = credit
|
|
|
+ translateTipWC.totalChart = charCount
|
|
|
+ translateTipWC.actionHandle = {[weak self] wc, result in
|
|
|
+ if result == true {
|
|
|
+ self?.window?.endSheet(wc.window!)
|
|
|
+ KMAIRequestServerManager.defaultManager.aiTranslationFileTranslateHandle(fileKey: resultStr,
|
|
|
+ from: self!.fromLanguage,
|
|
|
+ to: self!.toLanguage) { wrapper in
|
|
|
+ let success = wrapper.success
|
|
|
+
|
|
|
+ if success {
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ self?.aiTranslateFinish()
|
|
|
+ self?.cancelBtn.isEnabled = true
|
|
|
+
|
|
|
+ self!.translateFinish = true
|
|
|
+ self!.translateResultView.isHidden = false
|
|
|
+
|
|
|
+
|
|
|
+ let resultStr = wrapper.content
|
|
|
+ self!.translateResultPath = resultStr
|
|
|
+ self!.updateActionViewUI()
|
|
|
+ self!.updateResultViewUI()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ self?.aiTranslateFinish()
|
|
|
+ self?.cancelBtn.isEnabled = true
|
|
|
+
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = wrapper.content
|
|
|
+ alert.runModal()
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ self?.cancelBtn.isEnabled = true
|
|
|
+ self?.aiTranslateFinish()
|
|
|
+ self?.window?.endSheet(wc.window!)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ self.window?.beginSheet(translateTipWC.window!)
|
|
|
+ translateTipWC.reloadData()
|
|
|
} else {
|
|
|
+ self.cancelBtn.isEnabled = true
|
|
|
+ self.aiConvertFinish = true
|
|
|
+ self.removePDFBtn.isEnabled = true
|
|
|
+ self.removeWaitingView(self.resultBGView)
|
|
|
+ self.updateActionViewUI()
|
|
|
+
|
|
|
let alert = NSAlert()
|
|
|
alert.alertStyle = .critical
|
|
|
alert.messageText = wrapper.content
|
|
@@ -597,145 +804,44 @@ import Cocoa
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- }
|
|
|
- } else if self.configType == .reWriting {
|
|
|
- self.aiResultTextView.string = ""
|
|
|
- self.addWaingView(self.resultBGView)
|
|
|
- self.enableActionView(false)
|
|
|
- self.removePDFBtn.isEnabled = false
|
|
|
- self.aiConvertFinish = false
|
|
|
-// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
- KMAIRequestServerManager.defaultManager.aiAction(content: self.fileEmptyTextView.string,
|
|
|
- state: .rewrite) { wrapper in
|
|
|
- DispatchQueue.main.async {
|
|
|
- self.aiConvertFinish = true
|
|
|
- self.removePDFBtn.isEnabled = true
|
|
|
- self.removeWaitingView(self.resultBGView)
|
|
|
- self.updateActionViewUI()
|
|
|
-
|
|
|
- let success = wrapper.success
|
|
|
- if success {
|
|
|
- let resultStr = wrapper.content
|
|
|
- self.aiResultTextView.string = resultStr
|
|
|
- self.updateActionViewUI()
|
|
|
- self.updateResultViewUI()
|
|
|
- } else {
|
|
|
- let alert = NSAlert()
|
|
|
- alert.alertStyle = .critical
|
|
|
- alert.messageText = wrapper.content
|
|
|
- alert.runModal()
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } else if self.configType == .proofreading {
|
|
|
- self.aiResultTextView.string = ""
|
|
|
- self.addWaingView(self.resultBGView)
|
|
|
- self.enableActionView(false)
|
|
|
- self.removePDFBtn.isEnabled = false
|
|
|
- self.aiConvertFinish = false
|
|
|
-// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
- KMAIRequestServerManager.defaultManager.aiAction(content: self.fileEmptyTextView.string,
|
|
|
- state: .correctTypos) { wrapper in
|
|
|
- DispatchQueue.main.async {
|
|
|
- self.aiConvertFinish = true
|
|
|
- self.removePDFBtn.isEnabled = true
|
|
|
- self.removeWaitingView(self.resultBGView)
|
|
|
- self.updateActionViewUI()
|
|
|
-
|
|
|
- let success = wrapper.success
|
|
|
- if success {
|
|
|
- let resultStr = wrapper.content
|
|
|
- self.aiResultTextView.string = resultStr
|
|
|
- self.updateActionViewUI()
|
|
|
- self.updateResultViewUI()
|
|
|
- } else {
|
|
|
- let alert = NSAlert()
|
|
|
- alert.alertStyle = .critical
|
|
|
- alert.messageText = wrapper.content
|
|
|
- alert.runModal()
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } else if self.configType == .translate {
|
|
|
- self.aiResultTextView.string = ""
|
|
|
- self.addWaingView(self.resultBGView)
|
|
|
- self.enableActionView(false)
|
|
|
- self.translateFinish = false
|
|
|
- self.translateResultView.isHidden = true
|
|
|
-// if self.filePath.count > 0 {
|
|
|
- self.translateFile = true
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ self.translateFile = false
|
|
|
self.removePDFBtn.isEnabled = false
|
|
|
self.aiConvertFinish = false
|
|
|
- DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
-// KMAIRequestServerManager.defaultManager.aiAction(content: self.filePath,
|
|
|
-// state: .fileTranslate,
|
|
|
-// from: self.fromLanguage,
|
|
|
-// to: self.toLanguage) { wrapper in
|
|
|
+// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
+ KMAIRequestServerManager.defaultManager.aiAction(content: self.fileEmptyTextView.string,
|
|
|
+ state: .textTranslate,
|
|
|
+ from: self.fromLanguage,
|
|
|
+ to: self.toLanguage) { wrapper in
|
|
|
DispatchQueue.main.async {
|
|
|
self.aiConvertFinish = true
|
|
|
self.removePDFBtn.isEnabled = true
|
|
|
self.removeWaitingView(self.resultBGView)
|
|
|
self.updateActionViewUI()
|
|
|
|
|
|
-// let success = wrapper.success
|
|
|
-// if success {
|
|
|
+ let success = wrapper.success
|
|
|
+ if success {
|
|
|
self.translateFinish = true
|
|
|
self.translateResultView.isHidden = false
|
|
|
-// let resultStr = wrapper.content
|
|
|
- let resultStr = "wrapper.content"
|
|
|
-
|
|
|
- self.translateResultPath = resultStr
|
|
|
+
|
|
|
+ let resultStr = wrapper.content
|
|
|
+ self.aiResultTextView.string = resultStr
|
|
|
+
|
|
|
self.updateActionViewUI()
|
|
|
self.updateResultViewUI()
|
|
|
-// } else {
|
|
|
-// let alert = NSAlert()
|
|
|
-// alert.alertStyle = .critical
|
|
|
-// alert.messageText = wrapper.content
|
|
|
-// alert.runModal()
|
|
|
-// return
|
|
|
-// }
|
|
|
+ } else {
|
|
|
+ let alert = NSAlert()
|
|
|
+ alert.alertStyle = .critical
|
|
|
+ alert.messageText = wrapper.content
|
|
|
+ alert.runModal()
|
|
|
+
|
|
|
+ self.updateResultViewUI()
|
|
|
+ return
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
-// } else {
|
|
|
-// self.translateFile = false
|
|
|
-// self.removePDFBtn.isEnabled = false
|
|
|
-// self.aiConvertFinish = false
|
|
|
-//// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
|
|
|
-// KMAIRequestServerManager.defaultManager.aiAction(content: self.fileEmptyTextView.string,
|
|
|
-// state: .textTranslate,
|
|
|
-// from: self.fromLanguage,
|
|
|
-// to: self.toLanguage) { wrapper in
|
|
|
-// DispatchQueue.main.async {
|
|
|
-// self.aiConvertFinish = true
|
|
|
-// self.removePDFBtn.isEnabled = true
|
|
|
-// self.removeWaitingView(self.resultBGView)
|
|
|
-// self.updateActionViewUI()
|
|
|
-//
|
|
|
-// let success = wrapper.success
|
|
|
-// if success {
|
|
|
-// self.translateFinish = true
|
|
|
-// self.translateResultView.isHidden = false
|
|
|
-//
|
|
|
-// let resultStr = wrapper.content
|
|
|
-// self.aiResultTextView.string = resultStr
|
|
|
-//
|
|
|
-// self.updateActionViewUI()
|
|
|
-// self.updateResultViewUI()
|
|
|
-// } else {
|
|
|
-// let alert = NSAlert()
|
|
|
-// alert.alertStyle = .critical
|
|
|
-// alert.messageText = wrapper.content
|
|
|
-// alert.runModal()
|
|
|
-//
|
|
|
-// self.updateResultViewUI()
|
|
|
-// return
|
|
|
-// }
|
|
|
-// }
|
|
|
-// };
|
|
|
-// }
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
}
|