anchor.diff:      member val Progress: UIActivityIndicatorView = null with get, set
   
       override this.ViewDidLoad () =
  +        this.WebView.BackgroundColor <- UIColor.White
  +        this.WebView.Delegate <- webViewDelegate
  +
           this.NavigationItem.Title <- room.Label
           this.NavigationItem.LeftItemsSupplementBackButton <- true
   
           // Prevents a 64px offset on a webviews scrollview
           this.AutomaticallyAdjustsScrollViewInsets <- false
  -        this.WebView.BackgroundColor <- UIColor.White
   
           this.NavigationItem.RightBarButtonItems <- barButtons()
   
  
positive.code:         ()
  
  [<Register ("ChatRoomViewController")>]
  type ChatRoomViewController (room:Entity) as this =
      inherit UIViewController ("PrivateChatSessionViewController", null)
  
      let identity = match Api.userIdentity with | Some id -> id | None -> failwith "User must be logged in"
  
negative.code:     let userFeedbackLine payload user  = line (nameplate user) payload
  
      let addLine line forceScroll =
          controller.WebView.EvaluateJavascript(sprintf "wireclub.Mobile.addLine(%s)" (Newtonsoft.Json.JsonConvert.SerializeObject { Line = line })) |> ignore
          controller.WebView.EvaluateJavascript (sprintf "wireclub.Mobile.scrollToEnd(%b);" forceScroll) |> ignore
  
      let addLines lines =
          controller.WebView.EvaluateJavascript(sprintf "wireclub.Mobile.addLines(%s)" (Newtonsoft.Json.JsonConvert.SerializeObject (lines |> Array.map (fun e -> { Line = e })))) |> ignore
          controller.WebView.EvaluateJavascript "wireclub.Mobile.scrollToEnd(true);" |> ignore
  
      let placeKeyboard (sender:obj) (args:UIKeyboardEventArgs) =
          controller.ResizeViewToKeyboard args
          controller.WebView.EvaluateJavascript "wireclub.Mobile.scrollToEnd(true);" |> ignore
  
      let mutable showObserver:NSObject = null
      let mutable hideObserver:NSObject = null
  
  
      let sendMessage (identity:Models.User) text =
          match text with
          | "" -> ()
          | _ ->
              controller.SendButton.Enabled <- false
              Async.startNetworkWithContinuation
                  (Chat.send room.Slug text)
                  (controller.HandleApiResult >> fun result ->
                      controller.SendButton.Enabled <- true
                      match result with 
                      | Api.ApiOk response -> 
                          controller.Text.Text <- ""
                          match users.TryGetValue identity.Id with
                          | true, user ->
                              addLine (userFeedbackLine response.Payload user) true
                          | _ -> ()
                      | error -> controller.HandleApiFailure error
                  )
  
      let addUser = (fun (user:UserProfile) -> users.AddOrUpdate (user.Id, user, System.Func<string,UserProfile,UserProfile>(fun _ _ -> user)) |> ignore)
  