   #
   # The denormalize callback will only be called with normalized input.  The normalize callback
   # may receive any combination of normalized or denormalized input.
-  ###
-
   set_normalize: (norm, denorm) ->
     @normalize = norm
     @denormalize = denorm

    @current_hash = @parse(@get_raw_hash())
    @normalize @current_hash

    ### The last value received by the hashchange event: ###

    @last_hashchange = @current_hash.clone()
    @hashchange_event = @hashchange_event.bindAsEventListener(this)
    Element.observe window, 'hashchange', @hashchange_event

    new_hash = @construct(query_params)
    if window.location.hash != new_hash

      # If the History API is available, use it to support URL replacement.  FF4.0's pushState
      # is broken; don't use it.
      if window.history and window.history.replaceState and window.history.pushState and !navigator.userAgent.match('Firefox/[45].')
        url = window.location.protocol + '//' + window.location.host + window.location.pathname + new_hash
        if replace
