From 6a19e49c7a1308e2bf57d24164f606014542d255 Mon Sep 17 00:00:00 2001 From: banjun Date: Fri, 10 Apr 2015 13:04:04 +0900 Subject: [PATCH 1/7] pod update: * As SwiftyJSON supports only Swift 1.1 on master spec repo, use xcode6.3 branch --- AsakusaSatellite.podspec | 4 ++-- Example/Podfile | 1 + Example/Podfile.lock | 33 +++++++++++++++++++++------------ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/AsakusaSatellite.podspec b/AsakusaSatellite.podspec index 7750aae..72cf29a 100644 --- a/AsakusaSatellite.podspec +++ b/AsakusaSatellite.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "AsakusaSatellite" - s.version = "0.2.1" + s.version = "0.3.0" s.summary = "AsakusaSatellite API Client for Swift" s.description = <<-DESC AsakusaSatellite is a realtime chat application for developers. @@ -17,6 +17,6 @@ Pod::Spec.new do |s| s.requires_arc = true s.dependency "Alamofire", "~> 1.1" s.dependency "SwiftyJSON", "~> 2.1" - s.dependency "Socket.IO-Client-Swift", "~> 1.1" + s.dependency "Socket.IO-Client-Swift", "~> 2.0" s.dependency "UTIKit", "~> 1.0" end diff --git a/Example/Podfile b/Example/Podfile index 28ce8e7..4aa481f 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -4,4 +4,5 @@ use_frameworks! link_with 'AsakusaSatelliteSwiftClientExample', 'AsakusaSatelliteSwiftClientExampleTests' pod 'AsakusaSatellite', :path => '../' +pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git', :branch => 'xcode6.3' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 8285dc1..420b922 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,26 +1,35 @@ PODS: - - Alamofire (1.1.4) - - AsakusaSatellite (0.2.0): + - Alamofire (1.2.0) + - AsakusaSatellite (0.3.0): - Alamofire (~> 1.1) - - Socket.IO-Client-Swift (~> 1.1) + - Socket.IO-Client-Swift (~> 2.0) - SwiftyJSON (~> 2.1) - UTIKit (~> 1.0) - - Socket.IO-Client-Swift (1.4.4) + - Socket.IO-Client-Swift (2.0.2) - SwiftyJSON (2.1.3) - - UTIKit (1.0.0) + - UTIKit (1.1.0) DEPENDENCIES: - AsakusaSatellite (from `../`) + - SwiftyJSON (from `https://github.com/SwiftyJSON/SwiftyJSON.git`, branch `xcode6.3`) EXTERNAL SOURCES: AsakusaSatellite: - :path: ../ + :path: "../" + SwiftyJSON: + :branch: xcode6.3 + :git: https://github.com/SwiftyJSON/SwiftyJSON.git + +CHECKOUT OPTIONS: + SwiftyJSON: + :commit: 008a09d7ea8b13c03fb59b35c01aad339584a5e1 + :git: https://github.com/SwiftyJSON/SwiftyJSON.git SPEC CHECKSUMS: - Alamofire: 524225da382071ee3e6d0badd0ee4b4dc36740de - AsakusaSatellite: e71efbd093a57df4bd606be4565fd079b93ae132 - Socket.IO-Client-Swift: fa8d4061cd930cc5e853ee5d25b4126692129f8c - SwiftyJSON: 48be7490a3989a58a3f511cd54167f0a2b466e76 - UTIKit: 6880d51f5d4e1242c6fb37f9e3eeae4343eb037f + Alamofire: d765c5c1713aa64106b0228aaa600a1e6851f68d + AsakusaSatellite: d42ae8b42c153ab6c85bb2985169d714cd5f4fc1 + Socket.IO-Client-Swift: 0a35d6d46ef10db390430d4df68f795adffdca03 + SwiftyJSON: a561c2a840121085bec8a2dfeac97a360fc66901 + UTIKit: 6c23dc3a08f335f14e48d4f1673dc0ee310b3fa4 -COCOAPODS: 0.36.0 +COCOAPODS: 0.36.3 From 8dbee87c1905c9ee8a635d8d72f38ffddc59d92a Mon Sep 17 00:00:00 2001 From: banjun Date: Fri, 10 Apr 2015 13:20:06 +0900 Subject: [PATCH 2/7] supports Swift 1.2 for pod --- Classes/Client.swift | 17 +- Classes/Endpoint.swift | 173 +++++++++++--------- Classes/ios/TwitterAuthViewController.swift | 2 +- 3 files changed, 107 insertions(+), 85 deletions(-) diff --git a/Classes/Client.swift b/Classes/Client.swift index fa1d5cf..21e5954 100644 --- a/Classes/Client.swift +++ b/Classes/Client.swift @@ -58,14 +58,14 @@ public class Client { } public func addDevice(deviceToken: NSData, name: String, completion: Response -> Void) { - request(Endpoint.AddDevice(deviceToken: deviceToken, name: name), {$0.validate(statusCode: [200])}, completion: completion) + request(Endpoint.AddDevice(deviceToken: deviceToken, name: name), requestModifier: {$0.validate(statusCode: [200])}, completion: completion) } public func messagePusher(roomID: String, completion: (MessagePusherClient? -> Void)) { serviceInfo { response in switch response { case .Success(let serviceInfo): - if let engine = MessagePusherClient.Engine(messagePusher: serviceInfo().messagePusher) { + if let engine = MessagePusherClient.Engine(messagePusher: serviceInfo.value.messagePusher) { completion(MessagePusherClient(engine: engine, roomID: roomID)) } else { completion(nil) @@ -84,14 +84,14 @@ public class Client { NSLog("failure in Client.request(\(endpoint)): \(error)") completion(.Failure(error)) } else { - self.completeWithResponse(response, object!, error, completion) + self.completeWithResponse(response, object!, error, completion: completion) } } } private func completeWithResponse(response: NSHTTPURLResponse?, _ jsonObject: AnyObject, _ error: NSError?, completion: Response -> Void) { if let responseItem = T(SwiftyJSON.JSON(jsonObject)) { - completion(Response.Success(responseItem)) + completion(Response.Success(Box(responseItem))) } else { NSLog("failure in completeWithResponse") completion(.Failure(error)) @@ -101,10 +101,17 @@ public class Client { public enum Response { - case Success(@autoclosure() -> T) // workaround for Swift compiler error + case Success(Box) case Failure(NSError?) } +public class Box { + public let value: T + public init(_ value: T) { + self.value = value + } +} + public enum SortOrder: String { case Asc = "asc" diff --git a/Classes/Endpoint.swift b/Classes/Endpoint.swift index 1e1e8c8..8e5a7f5 100644 --- a/Classes/Endpoint.swift +++ b/Classes/Endpoint.swift @@ -87,7 +87,7 @@ public enum Endpoint { return request }() - let request = NSMutableURLRequest(URL: urlRequestWithParams.URL) + let request = NSMutableURLRequest(URL: urlRequestWithParams.URL!) request.HTTPMethod = method.rawValue if let b = body { request.addValue("multipart/form-data; boundary=\(kBoundary)", forHTTPHeaderField: "Content-Type") @@ -130,33 +130,35 @@ public class ServiceInfo: ResponseItem { public class User: ResponseItem { - public let id = "" - public let name = "" - public let screenName = "" - public let profileImageURL = "" + public let id: String + public let name: String + public let screenName: String + public let profileImageURL: String // NOTE: user_profiles for each rooms are not yet supported public required init?(_ json: SwiftyJSON.JSON) { - let id = json["id"].string - let name = json["name"].string - let screenName = json["screen_name"].string - let profileImageURL = json["profile_image_url"].string - - if ([id, name, screenName, profileImageURL].filter{$0 == nil}).count > 0 { + if let id = json["id"].string, + name = json["name"].string, + screenName = json["screen_name"].string, + profileImageURL = json["profile_image_url"].string { + self.id = id + self.name = name + self.screenName = screenName + self.profileImageURL = profileImageURL + } else { + id = "" + name = "" + screenName = "" + profileImageURL = "" return nil } - - self.id = id! - self.name = name! - self.screenName = screenName! - self.profileImageURL = profileImageURL! } } public class Room: ResponseItem { - public let id: String = "" - public let name: String = "" + public let id: String + public let name: String public let owner: User? public let members: [User] public var ownerAndMembers: [User] { @@ -164,49 +166,56 @@ public class Room: ResponseItem { } public required init?(_ json: SwiftyJSON.JSON) { - let id = json["id"].string - let name = json["name"].string - self.owner = User(json["user"]) - self.members = compact(json["members"].arrayValue.map{User($0)}) - - if ([id, name].filter{$0 == nil}).count > 0 { + if let id = json["id"].string, + name = json["name"].string { + self.id = id + self.name = name + self.owner = User(json["user"]) + self.members = compact(json["members"].arrayValue.map{User($0)}) + } else { + id = "" + name = "" + owner = nil + members = [] return nil } - - self.id = id! - self.name = name! } } public class PostMessage: ResponseItem { - public let messageID: String = "" + public let messageID: String public required init?(_ json: SwiftyJSON.JSON) { let status = json["status"].string let error = json["error"].string - let messageID = json["message_id"].string - - if status != "ok" || error != nil || messageID == nil { + if status != "ok" || error != nil { + messageID = "" return nil } - self.messageID = messageID! + if let messageID = json["message_id"].string { + self.messageID = messageID + } else { + messageID = "" + return nil + } } } public class Many: ResponseItem { - public let items = [T]() + public let items: [T] public required init?(_ json: SwiftyJSON.JSON) { - if json.array == nil { return nil } - var items = [T]() - for a in json.array! { - if let item = T(a) { - items.append(item) - } else { - NSLog("cannot init from json: \(a)") - return nil + if let array = json.array { + for a in array { + if let item = T(a) { + items.append(item) + } else { + NSLog("cannot init from json: \(a)") + self.items = [] + return nil + } } } self.items = items @@ -222,37 +231,42 @@ private let dateFormatter: NSDateFormatter = { public class Message: ResponseItem, Printable { - public let id: String = "" - public let name: String = "" - public let screenName: String = "" - public let body: String = "" - public let htmlBody: String = "" - public let createdAt: NSDate = NSDate() - public let profileImageURL: String = "" - public let attachments: [Attachment] = [] + public let id: String + public let name: String + public let screenName: String + public let body: String + public let htmlBody: String + public let createdAt: NSDate + public let profileImageURL: String + public let attachments: [Attachment] public var imageAttachments: [Attachment] { return attachments.filter{$0.contentType.hasPrefix("image/")} } public required init?(_ json: SwiftyJSON.JSON) { - let id = json["id"].string - let name = json["name"].string - let screenName = json["screen_name"].string - let body = json["body"].string - let htmlBody = json["html_body"].string - let profileImageURL = json["profile_image_url"].string - let createdAt: NSDate? = json["created_at"].string.map{dateFormatter.dateFromString($0)} ?? nil - - let shouldBeNonNils: [Any?] = [id, name, screenName, body, htmlBody, profileImageURL, createdAt] - if (shouldBeNonNils.filter{$0 == nil}).count > 0 { + if let id = json["id"].string, + name = json["name"].string, + screenName = json["screen_name"].string, + body = json["body"].string, + htmlBody = json["html_body"].string, + profileImageURL = json["profile_image_url"].string, + createdAt = json["created_at"].string.flatMap({dateFormatter.dateFromString($0)}) { + self.id = id + self.name = name + self.screenName = screenName + self.body = body + self.htmlBody = htmlBody + self.profileImageURL = profileImageURL + self.createdAt = createdAt + } else { + id = "" + name = "" + screenName = "" + body = "" + htmlBody = "" + createdAt = NSDate() + profileImageURL = "" + attachments = [] return nil } - - self.id = id! - self.name = name! - self.screenName = screenName! - self.body = body! - self.htmlBody = htmlBody! - self.createdAt = createdAt! - self.profileImageURL = profileImageURL! self.attachments = compact(json["attachment"].arrayValue.map{Attachment($0)}) } @@ -263,22 +277,23 @@ public class Message: ResponseItem, Printable { public class Attachment: ResponseItem, Printable { - public let url: String = "" // can be relative URL - public let filename: String = "" - public let contentType: String = "" + public let url: String // can be relative URL + public let filename: String + public let contentType: String public required init?(_ json: SwiftyJSON.JSON) { - let url = json["url"].string - let filename = json["filename"].string - let contentType = json["content_type"].string - - if compact([url, filename, contentType]).count == 0 { + if let url = json["url"].string, + filename = json["filename"].string, + contentType = json["content_type"].string { + self.url = url + self.filename = filename + self.contentType = contentType + } else { + url = "" + filename = "" + contentType = "" return nil } - - self.url = url! - self.filename = filename! - self.contentType = contentType! } public var description: String { diff --git a/Classes/ios/TwitterAuthViewController.swift b/Classes/ios/TwitterAuthViewController.swift index 1c20810..7cf2295 100644 --- a/Classes/ios/TwitterAuthViewController.swift +++ b/Classes/ios/TwitterAuthViewController.swift @@ -49,7 +49,7 @@ public class TwitterAuthViewController: UIViewController, UIWebViewDelegate { // MARK: UIWebViewDelegate private func isRedirectedBackToAsakusaSatellite(request: NSURLRequest) -> Bool { - return request.URL.absoluteString == accountURL.absoluteString + return request.URL?.absoluteString == accountURL.absoluteString } public func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { From 65fa5fa46812c567fefcccdb00c8e10d763f8803 Mon Sep 17 00:00:00 2001 From: banjun Date: Fri, 10 Apr 2015 13:35:47 +0900 Subject: [PATCH 3/7] supports Swift 1.2 for example --- .../ViewController.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Example/AsakusaSatelliteSwiftClientExample/ViewController.swift b/Example/AsakusaSatelliteSwiftClientExample/ViewController.swift index 7dbcf9d..3e942a2 100644 --- a/Example/AsakusaSatelliteSwiftClientExample/ViewController.swift +++ b/Example/AsakusaSatelliteSwiftClientExample/ViewController.swift @@ -20,8 +20,8 @@ class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate let usernameLabel = UILabel() let roomIDToPostField = UITextField() let messageToPostField = UITextField() - let postButton = UIButton.buttonWithType(.System) as UIButton - let listButton = UIButton.buttonWithType(.System) as UIButton + let postButton = UIButton.buttonWithType(.System) as! UIButton + let listButton = UIButton.buttonWithType(.System) as! UIButton let messagesTextView = UITextView() var pusher: MessagePusherClient? @@ -91,7 +91,7 @@ class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate client.user() { response in switch response { case .Success(let user): - self.usernameLabel.text = "logged in as \(user().name)" + self.usernameLabel.text = "logged in as \(user.value.name)" case .Failure(let error): self.usernameLabel.text = "cannot log in: \(error)" } @@ -100,7 +100,7 @@ class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate client.roomList { response in switch response { case .Success(let many): - let rooms = many().items + let rooms = many.value.items NSLog("rooms: " + rooms.map{"\($0.name)(\($0.id))"}.description) case .Failure(let error): NSLog("failed to list rooms: \(error)") @@ -125,7 +125,7 @@ class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate client.postMessage(messageToPostField.text, roomID: roomIDToPostField.text, files: []) { response in switch response { case .Success(let postMessage): - NSLog("message posted successfully: \(postMessage().messageID)") + NSLog("message posted successfully: \(postMessage.value.messageID)") self.messageToPostField.text = "" case .Failure(let error): NSLog("failed to post message: \(error)") @@ -137,7 +137,7 @@ class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate client.messageList(roomIDToPostField.text, count: 20, sinceID: nil, untilID: nil, order: .Desc) { response in switch response { case .Success(let many): - let messages = many().items + let messages = many.value.items // NSLog("messages (\(messages.count)): \(messages)") self.messagesTextView.text = "\n".join(messages.map{"\($0.name): \($0.body)"}) case .Failure(let error): From f3a0e5ef8d7b1df28d66477af42633914cea4658 Mon Sep 17 00:00:00 2001 From: banjun Date: Sat, 18 Apr 2015 22:45:43 +0900 Subject: [PATCH 4/7] pod update, cocoapods 0.36.4 --- Example/Podfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 420b922..163cb85 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -5,7 +5,7 @@ PODS: - Socket.IO-Client-Swift (~> 2.0) - SwiftyJSON (~> 2.1) - UTIKit (~> 1.0) - - Socket.IO-Client-Swift (2.0.2) + - Socket.IO-Client-Swift (2.0.5) - SwiftyJSON (2.1.3) - UTIKit (1.1.0) @@ -28,8 +28,8 @@ CHECKOUT OPTIONS: SPEC CHECKSUMS: Alamofire: d765c5c1713aa64106b0228aaa600a1e6851f68d AsakusaSatellite: d42ae8b42c153ab6c85bb2985169d714cd5f4fc1 - Socket.IO-Client-Swift: 0a35d6d46ef10db390430d4df68f795adffdca03 + Socket.IO-Client-Swift: 8bb823fc27d947c409185a6152a6479b48e69ac6 SwiftyJSON: a561c2a840121085bec8a2dfeac97a360fc66901 UTIKit: 6c23dc3a08f335f14e48d4f1673dc0ee310b3fa4 -COCOAPODS: 0.36.3 +COCOAPODS: 0.36.4 From 3065b6b3c320e2ae5ea2b3ab5a8cb6b791302159 Mon Sep 17 00:00:00 2001 From: banjun Date: Sat, 18 Apr 2015 23:00:11 +0900 Subject: [PATCH 5/7] update pod dependencies for Swift 1.2 --- AsakusaSatellite.podspec | 6 +++--- Example/Podfile | 1 - Example/Podfile.lock | 21 ++++++--------------- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/AsakusaSatellite.podspec b/AsakusaSatellite.podspec index 72cf29a..6fb736d 100644 --- a/AsakusaSatellite.podspec +++ b/AsakusaSatellite.podspec @@ -15,8 +15,8 @@ Pod::Spec.new do |s| s.ios.source_files = 'Classes/ios/*.swift' s.osx.source_files = '' s.requires_arc = true - s.dependency "Alamofire", "~> 1.1" - s.dependency "SwiftyJSON", "~> 2.1" + s.dependency "Alamofire", "~> 1.2" + s.dependency "SwiftyJSON", "~> 2.2" s.dependency "Socket.IO-Client-Swift", "~> 2.0" - s.dependency "UTIKit", "~> 1.0" + s.dependency "UTIKit", "~> 1.1" end diff --git a/Example/Podfile b/Example/Podfile index 4aa481f..28ce8e7 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -4,5 +4,4 @@ use_frameworks! link_with 'AsakusaSatelliteSwiftClientExample', 'AsakusaSatelliteSwiftClientExampleTests' pod 'AsakusaSatellite', :path => '../' -pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git', :branch => 'xcode6.3' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 163cb85..f6b6087 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,35 +1,26 @@ PODS: - Alamofire (1.2.0) - AsakusaSatellite (0.3.0): - - Alamofire (~> 1.1) + - Alamofire (~> 1.2) - Socket.IO-Client-Swift (~> 2.0) - - SwiftyJSON (~> 2.1) - - UTIKit (~> 1.0) + - SwiftyJSON (~> 2.2) + - UTIKit (~> 1.1) - Socket.IO-Client-Swift (2.0.5) - - SwiftyJSON (2.1.3) + - SwiftyJSON (2.2.0) - UTIKit (1.1.0) DEPENDENCIES: - AsakusaSatellite (from `../`) - - SwiftyJSON (from `https://github.com/SwiftyJSON/SwiftyJSON.git`, branch `xcode6.3`) EXTERNAL SOURCES: AsakusaSatellite: :path: "../" - SwiftyJSON: - :branch: xcode6.3 - :git: https://github.com/SwiftyJSON/SwiftyJSON.git - -CHECKOUT OPTIONS: - SwiftyJSON: - :commit: 008a09d7ea8b13c03fb59b35c01aad339584a5e1 - :git: https://github.com/SwiftyJSON/SwiftyJSON.git SPEC CHECKSUMS: Alamofire: d765c5c1713aa64106b0228aaa600a1e6851f68d - AsakusaSatellite: d42ae8b42c153ab6c85bb2985169d714cd5f4fc1 + AsakusaSatellite: 92baf3bf9d89b22d2b97f509d6692e75f0261b05 Socket.IO-Client-Swift: 8bb823fc27d947c409185a6152a6479b48e69ac6 - SwiftyJSON: a561c2a840121085bec8a2dfeac97a360fc66901 + SwiftyJSON: 0b3e6c07af17ff745e77e8e9984097b55c956e5c UTIKit: 6c23dc3a08f335f14e48d4f1673dc0ee310b3fa4 COCOAPODS: 0.36.4 From 0908fc5dc3c0185dccfa593f73aef003884418ff Mon Sep 17 00:00:00 2001 From: banjun Date: Sat, 18 Apr 2015 23:11:18 +0900 Subject: [PATCH 6/7] use guard at if-let --- Classes/Endpoint.swift | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Classes/Endpoint.swift b/Classes/Endpoint.swift index 8e5a7f5..1bdad1c 100644 --- a/Classes/Endpoint.swift +++ b/Classes/Endpoint.swift @@ -188,15 +188,12 @@ public class PostMessage: ResponseItem { public required init?(_ json: SwiftyJSON.JSON) { let status = json["status"].string let error = json["error"].string - if status != "ok" || error != nil { - messageID = "" - return nil - } + let messageID = json["message_id"].string - if let messageID = json["message_id"].string { - self.messageID = messageID + if status == "ok" && error == nil, let id = messageID { + self.messageID = id } else { - messageID = "" + self.messageID = "" return nil } } From 9c776b8074a262fe2262b1d32cec7e333864fd95 Mon Sep 17 00:00:00 2001 From: banjun Date: Sun, 19 Apr 2015 00:29:55 +0900 Subject: [PATCH 7/7] fix playground for Xcode 6.3 --- Example/AsakusaSatellite.playground/section-1.swift | 8 +++++--- .../AsakusaSatellite.playground/timeline.xctimeline | 10 +++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Example/AsakusaSatellite.playground/section-1.swift b/Example/AsakusaSatellite.playground/section-1.swift index 741177a..57bd908 100644 --- a/Example/AsakusaSatellite.playground/section-1.swift +++ b/Example/AsakusaSatellite.playground/section-1.swift @@ -14,13 +14,15 @@ let c = Client(apiKey: nil) c.roomList() { r in switch r { case .Success(let many): - let rooms = many().items + let rooms = many.value.items for room in rooms { - room + room.id + room.name + room.ownerAndMembers } case .Failure(let error): error } } -XCPSetExecutionShouldContinueIndefinitely(continueIndefinitely: true) +NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 3)) diff --git a/Example/AsakusaSatellite.playground/timeline.xctimeline b/Example/AsakusaSatellite.playground/timeline.xctimeline index 7155e3c..6cbc0a2 100644 --- a/Example/AsakusaSatellite.playground/timeline.xctimeline +++ b/Example/AsakusaSatellite.playground/timeline.xctimeline @@ -3,7 +3,15 @@ version = "3.0"> + documentLocation = "#CharacterRangeLen=9&CharacterRangeLoc=527&EndingColumnNumber=22&EndingLineNumber=19&StartingColumnNumber=13&StartingLineNumber=19&Timestamp=451063689.951857" + lockedSize = "{240, 95}" + selectedRepresentationIndex = "1" + shouldTrackSuperviewWidth = "NO"> + +