|  |  |  | import SessionUtilitiesKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public final class ClosedGroupRatchet : NSObject, NSCoding { // NSObject/NSCoding conformance is needed for YapDatabase compatibility | 
					
						
							|  |  |  |     public let chainKey: String | 
					
						
							|  |  |  |     public let keyIndex: UInt | 
					
						
							|  |  |  |     public let messageKeys: [String] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Initialization | 
					
						
							|  |  |  |     public init(chainKey: String, keyIndex: UInt, messageKeys: [String]) { | 
					
						
							|  |  |  |         self.chainKey = chainKey | 
					
						
							|  |  |  |         self.keyIndex = keyIndex | 
					
						
							|  |  |  |         self.messageKeys = messageKeys | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Coding | 
					
						
							|  |  |  |     public init?(coder: NSCoder) { | 
					
						
							|  |  |  |         guard let chainKey = coder.decodeObject(forKey: "chainKey") as? String, | 
					
						
							|  |  |  |             let keyIndex = coder.decodeObject(forKey: "keyIndex") as? UInt, | 
					
						
							|  |  |  |             let messageKeys = coder.decodeObject(forKey: "messageKeys") as? [String] else { return nil } | 
					
						
							|  |  |  |         self.chainKey = chainKey | 
					
						
							|  |  |  |         self.keyIndex = UInt(keyIndex) | 
					
						
							|  |  |  |         self.messageKeys = messageKeys | 
					
						
							|  |  |  |         super.init() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public func encode(with coder: NSCoder) { | 
					
						
							|  |  |  |         coder.encode(chainKey, forKey: "chainKey") | 
					
						
							|  |  |  |         coder.encode(keyIndex, forKey: "keyIndex") | 
					
						
							|  |  |  |         coder.encode(messageKeys, forKey: "messageKeys") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Equality | 
					
						
							|  |  |  |     override public func isEqual(_ other: Any?) -> Bool { | 
					
						
							|  |  |  |         guard let other = other as? ClosedGroupRatchet else { return false } | 
					
						
							|  |  |  |         return chainKey == other.chainKey && keyIndex == other.keyIndex && messageKeys == other.messageKeys | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Hashing | 
					
						
							|  |  |  |     override public var hash: Int { // Override NSObject.hash and not Hashable.hashValue or Hashable.hash(into:) | 
					
						
							|  |  |  |         return chainKey.hashValue ^ keyIndex.hashValue ^ messageKeys.hashValue | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // MARK: Description | 
					
						
							|  |  |  |     override public var description: String { "[ chainKey : \(chainKey), keyIndex : \(keyIndex), messageKeys : \(messageKeys.prettifiedDescription) ]" } | 
					
						
							|  |  |  | } |