code: function LocationHashbangUrl(url, hashPrefix, appBaseUrl) {
    var basePath;
  
    /**
     * Parse given hashbang url into properties
     * @param {string} url Hashbang url
     * @private
     */
    this.$$parse = function(url) {
      var match = matchUrl(url, this);
  
  
      if (match.hash && match.hash.indexOf(hashPrefix) !== 0) {
        throw Error('Invalid url "' + url + '", missing hash prefix "' + hashPrefix + '" !');
      }
  
      basePath = match.path + (match.search ? '?' + match.search : '');
      match = HASH_MATCH.exec((match.hash || '').substr(hashPrefix.length));
      if (match[1]) {
        this.$$path = (match[1].charAt(0) == '/' ? '' : '/') + decodeURIComponent(match[1]);
      } else {
        this.$$path = '';
      }
  
      this.$$search = parseKeyValue(match[3]);
      this.$$hash = match[5] && decodeURIComponent(match[5]) || '';
  
      this.$$compose();
    };
  
    /**
     * Compose hashbang url and update `absUrl` property
     * @private
     */
    this.$$compose = function() {
      var search = toKeyValue(this.$$search),
          hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
  
      this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
      this.$$absUrl = composeProtocolHostPort(this.$$protocol, this.$$host, this.$$port) +
                      basePath + (this.$$url ? '#' + hashPrefix + this.$$url : '');
    };
  
    this.$$rewriteAppUrl = function(absoluteLinkUrl) {
      if(absoluteLinkUrl.indexOf(appBaseUrl) == 0) {
        return absoluteLinkUrl;
      }
    }
  
  
    this.$$parse(url);
  }
docs: LocationHashbangUrl represents url
  This object is exposed as $location service when html5 history api is disabled or not supported
  
  @constructor
  @param {string} url Legacy url
  @param {string} hashPrefix Prefix for hash part (containing path and search)