[APP] ThereTV . Streaming player compatible with the LocationFree protocol

Search This thread

mgschwan

Senior Member
Dec 13, 2011
59
17
since locationfree is getting some action here

anyone have any idea how i can download the B10's 4.0 firmware?
sony's support site isn't very responsive
this page on the support site is pretty useless
http://esupport.sony.com/US/perl/swu-download.pl?mdl=LFB10&upd_id=2440&os_group_id=18
the download button just gives me an Installation Alert!
(unless AVC support isnt going to improve anything with the android client?)

also couldn't figure out how to extract rcd files for my directv remote
the folder for the LF client doesn't have anything other than dll and ax files
maybe the remote files from psp could help? http://remote.locationfree.sony.net/psp/en/index.html

oh and very nice work on the android client

First of all, (H.264) AVC won't do you any good, the normal MPEG4 Stream works much better since it requires less processing power. If you have a fast enough device you can try using AVC.

This can be done by selecting the basestation LF-V30 (yeah that's all this option does actually switching from MPEG4-ES to H.264 ;) )
Once the video recording functionality is integrated, the H.264 may however become more attractive because then you can view the recordings in higher quality with native H.264 decoding in the android video player.


Cocnerning the remote codes. I can extract the remote codes from the windows program itself, you just need to tell me which remote you selected in the Windows Player. However this requires you to buy the donation version, because it takes some time to extract them and i can't do that for everyone. Once it is extracted it will however be added to the free version too. So for every new remote someone has to "sacrifice" himself so everyone can enjoy their remote.

Alternatively you can record a session with tcpdump and send me the pcap file along with the order the buttons were pressed. That wont require you to buy the donation version.

Greetings
Michael
 
Last edited:

insanenyc

Senior Member
Aug 12, 2006
271
53
Some remotes codes work for other remotes for instance I have the scientfific Atlanta dc1 but the scientific Atlanta at8560 works with my reciever.

Sent from my Inspire 4G using XDA App
 
Last edited:

KentM

Member
Feb 28, 2008
34
0
Chicago, IL
I have an LF-V30. I purchase the donation version this evening and test on my Photon and my CyanogenMod TouchPad. If I can provide and specific feedback to help the cause please let me know and I will do so.
 

mgschwan

Senior Member
Dec 13, 2011
59
17
Hey Michael, can you help out the Iphone users with a version?

Hi nastywindbreaker,

there are several reasons why i won't do that, the two major ones would be:

1. I've written this software already twice. The first time during the reverse engineering in python, and a second time for androind in java and c.
2. I hate the development policy of apple. I don't want to spend $1000+ just to buy a computer to be able to develop for IOS.

In my opinion google/android do it exactly right. They provide the tools for everyone to download, you can develop on any major platform. And you just need to plug your device into your pc and are ready to go. I don't want to pay $99 a year to be able to develop on my own device.

Sorry, but that is my opinion
 
May 18, 2007
29
0
Very well put Michael. Thanks for the honest reply. I am a true android fan. My wife has iphone and she was envying my Nexus S.

Your opinion is truly justified.
 

nee_vak

Senior Member
Oct 14, 2009
144
18
looks like if you haven't updated the firmware on your device, you probably never will be able to. only way to update is through the device's page (ip address) and from there you will get "Were sorry, it appears that our database is having problems or is not responding to requests. Please try your request again. If the problem persists you may need to try again later. We will have the issue corrected as soon as possible."
emailing technical support, I was told that email support is not available and to call it in, calling it in will cost you 49.99 (I got this on clearance for 35 from staples, so support would basically cost more than I paid for the device)
 

mgschwan

Senior Member
Dec 13, 2011
59
17
emailing technical support, I was told that email support is not available and to call it in, calling it in will cost you 49.99 (I got this on clearance for 35 from staples, so support would basically cost more than I paid for the device)

If it's not too much of an issue i would stick with the firmware you have. My box does not provide H.264 either but i'm quite happy with it. Besides my device would not be able to decode fast enough anyway.

Michael
 

ChpStcksRlz

Senior Member
Jul 12, 2011
57
4
Houston, TX
Can I actually use the TV Tuner? It seems like I can only use AV1 and AV2 on ThereTV.

-EDIT-
I pulled out my old VCR and I got the RCA cables to connect to the base station, anyways :) Great job! After a bunch of tweaking and lowering video/audio, it seems to work flawlessly!

Anyways, now comes the question. Can we watch TV while away from the home network?

My device is an HTC T-Mobile G2 (Desire Z, G2, Vision), and I put stock rom (no overclock) back on it just to test it for you, and I can say it works flawlessly (with a couple tweaking of course), LF-PK1
 
Last edited:

mgschwan

Senior Member
Dec 13, 2011
59
17
Can I actually use the TV Tuner? It seems like I can only use AV1 and AV2 on ThereTV.

-EDIT-
Anyways, now comes the question. Can we watch TV while away from the home network?

My device is an HTC T-Mobile G2 (Desire Z, G2, Vision), and I put stock rom (no overclock) back on it just to test it for you, and I can say it works flawlessly (with a couple tweaking of course), LF-PK1
I did not even know there were base stations out there that have an integrated tuner. Do you have such a base station? If yes, could you give me remote access to it.

And yes, you should be able to watch while not at home. If you've already registered you can simply change the address to your MyNetAV.com address or your public IP and make sure that your LocationFree port is forwarded.

I've have people who are succesfully watching it over a 4G Network.

Michael
 

ChpStcksRlz

Senior Member
Jul 12, 2011
57
4
Houston, TX
I did not even know there were base stations out there that have an integrated tuner. Do you have such a base station? If yes, could you give me remote access to it.

And yes, you should be able to watch while not at home. If you've already registered you can simply change the address to your MyNetAV.com address or your public IP and make sure that your LocationFree port is forwarded.

I've have people who are succesfully watching it over a 4G Network.

Michael

Yes I do have a basestation with an integrated tuner, I'd be more than happy to give you access to it, but you must know, only channel 3 works as my cable company relies on DVR's. and also the DVR does NOT have remote codes at all on the Sony website even with the PC locationfree or the PSP. Just send me a PM and let me know how to give you access.

img20120225152300.jpg

Note: It's a LF-PK1 (B1 from what I've heard), lol look at that cable on the left



I'll try accessing my locationfree using my public IP

This would probably explain why, from wikipedia
"Only model in the North American market to ever come equipped with an RF coaxial input. However the European model did not have an RF coaxial input."

-EDIT-

I tried it with a Verizon HTC Thunderbolt running on LTE, and it works flawlessly as well
 
Last edited:

gvece

Member
Apr 12, 2009
9
0
problem accessing while away

Getting a blank screen when trying to connect on a different network or via 3g.

Using my HTC desire over 3g I changed the base station address in preferences. I used the dns address I.e B****lfb1-eu.mynetav.com. did not change anything else, apart from choose the lowest quality settings. Getting a blank screen. Tried the same using my HTC tethered to my tablet via portable wifi hotspot. Same result, blank screen and things freeze up a bit.

Not sure if its a data speed thing or not but I don't think it has connected. I'm probably making an obvious mistake somewhere but help any would be appreciated.
 

mgschwan

Senior Member
Dec 13, 2011
59
17
Getting a blank screen when trying to connect on a different network or via 3g.

Using my HTC desire over 3g I changed the base station address in preferences. I used the dns address I.e B****lfb1-eu.mynetav.com. did not change anything else, apart from choose the lowest quality settings. Getting a blank screen. Tried the same using my HTC tethered to my tablet via portable wifi hotspot. Same result, blank screen and things freeze up a bit.

Not sure if its a data speed thing or not but I don't think it has connected. I'm probably making an obvious mistake somewhere but help any would be appreciated.

It is theoretically possible that you are behind a proxy, which won't work.

One thing a user told me is that the Server address seems to be case sensitive. I know that this should not be the case but just to humor me, could you enter the address exactly as it is show in the basestation (i think the TLD is MyNetAV.com)

And does the app write Could not connect to .... . When the app freezes up, don't hit the back key but wait for approx. 40 seconds for a timeout to occur.

If this still does not work, could you send me your base station address by PM so that i can try to connect.

greetings
Michael
 

mgschwan

Senior Member
Dec 13, 2011
59
17
Ok, TV Tuner support works now.

It's currently in testing and will be added in the next version.

Could anyone with a BaseStation that has a TV Tuner and is located in Europe contact me. I want to know if there is an issue with PAL/NTSC signals.

Michael
 

insanenyc

Senior Member
Aug 12, 2006
271
53
Getting a blank screen when trying to connect on a different network or via 3g.

Using my HTC desire over 3g I changed the base station address in preferences. I used the dns address I.e B****lfb1-eu.mynetav.com. did not change anything else, apart from choose the lowest quality settings. Getting a blank screen. Tried the same using my HTC tethered to my tablet via portable wifi hotspot. Same result, blank screen and things freeze up a bit.

Not sure if its a data speed thing or not but I don't think it has connected. I'm probably making an obvious mistake somewhere but help any would be appreciated.

Change settings to fast but ugly median quality fps 25 and slow device see if you can get a picture after u change these settings
And check your letters they are case sensitive I believe


Sent from my Inspire 4G using XDA App
 
Last edited:

ice0901

Senior Member
Oct 19, 2009
378
48
First great job on the app. I have been searching for this since the HTC hero days...your app runs great on my HTC thunderbolt and stock ics on the Asus transformer. The problem I have now is that I'm running cm9 w/cornerstone (onskreen) and your app does not launch. I receive an error "this app does not support all sizes/resolutions". I'm hoping you can add compatibility in a future build. I've posted a link to my YouTube video incase your not familiar with it. Cornerstone allows you to split you screen into 3 independent windows

http://www.youtube.com/watch?v=a-tUeOkboB8&list=HL1330496099&feature=mh_lolz
 
Last edited:

mgschwan

Senior Member
Dec 13, 2011
59
17
The problem I have now is that I'm running cm9 w/cornerstone (onskreen) and your app does not launch. I receive an error "this app does not support all sizes/resolutions".

Hi,

can you send me your email address by PM or mail. I'll send you a debug build that helps me determine the error.

Michael
 

Top Liked Posts

  • There are no posts matching your filters.
  • 9
    Hi,

    This software is still in beta status. You have to expect problems.
    If you experience any bugs or glitches please look in the Known Issues section of this post. If the problem is not there send me a message.


    • This app is developed by me and Sony did not contribute to the development of this software
    • A personal note from me: I will not use the trademark LocationFree or the brand name Sony in the App (especially in the title)

    I do however want to thank the people at Sony (and sonyericsson). They were very active to find a solution so i can distribute this app. Their recent opensource engagement seems to pay out, for people like me.


    News:
    Today the 1.0.4 Version was released. It includes support for Japanese Basestation, different color systems (NTSC/...), experimental recording functionality...


    ----

    The official site of this app is theretv.zero997.com. I have also added a commenting system to the site. You can now put your feature requests and bug reports directly in the comments.



    The current status of the software is (as of 02/12/2012):
    • Compatible to all known BaseStations (LF-B1, LF-B10, LF-PK1, LF-B20, LF-V30)
    • Support for EU, US and JP models
    • Switch between MPEG4 and H.264(on supported BaseStations)
    • Recording of streams to MKV files (EXPERIMENTAL)
    • Remote control support
    • Registration works from within the app
    • Fullscreen playback
    • Works over Wifi/3G/4G
    • Selectable stream quality
    • Advanced performance settings (adjustable scaling filter/adjustable frame dropping)
    • Change the encoder settings of the BaseStation (framerate/videosize)
    • Change the video source
    • Support for the integrated tuner
    Here is a video showing the App in action http://youtu.be/R1uaKrfdAoc

    Upcoming features
    • Recording of shows directly on the device (like a DVR)
    • Timed recordings


    Thanks to my testers: insanenyc, Tommyboy_65_98, Mister_Mxyzptlk, Jim_IT

    Just on a side note, for all those people asking in other threads why no one made a LocationFree player even though Sony put the source code online:
    The code released from sony is just an excerpt of an opensource library they used to stream the data everything else is closed source.

    List of tested devices:
    • HTC Thunderbolt
    • HTC G2
    • HTC HD2
    • Nexus S
    • Glaxy Tab 10.1
    • HTC Inspire (overclocked to 1,5Ghz) : works
    • Motorola XOOM : works
    • Toshiba Thrive : works
    • Droid X : works
    • HP Touchpad : works
    • HTC Desire (not overclocked) : works although it is a bit too slow
    • HTC Wildfire: works but very very slow


    First message 02/03/2012
    Over the last month i've reverse engineered the Sony LocationFree Protocol and started the development of an Android client.


    Update 02/05/2012:
    The current release improves the frame dropping mechanism. This should result in better picture quality on slower devices. If the user sets a frame dropping factor the frames are only dropped at the end of a GOP. Thus the dropped frames are immediatly followed by an IFrame. This means that the frames following a dropped frame can be decoded without any errors.

    The synchronization between audio/video has been improved. The audio decoder can tell the video decoder to drop frames if the delay becomes too big, this means that video frames are dropped before the audio decoder has to drop anything, which should result in better audio quality.

    The remote control can now be shown/hidden.

    Update 02/07/2012:
    The encoded video size can now be set. The framerate of the encoder can be set.

    Update 02/07/2012:
    The support for LF-B10 BaseStations is now included

    Update 02/08/2012:
    Preliminary support for LF-V30 BaseStations. Video still has problems.
    Added support for the second video source

    Update 02/10/2012:
    The display problems of the remote control that some testers experienced are fixed now.
    The support for the LF-V30 BaseStations has been improved. But it's still H264 only


    Documentation:

    Once the app is installed. It's called ALF Player (Android LocationFree Player)

    1. When started it presents you with a play icon. Don't just hit it yet, you need to first hit the Menu key and got to preferences (enter Server address/port). You can also enter a hostname. If it does not work try it by directly conecting to the wireless network of the basestation first.
    2. Choose your remote (The remotes of all testers should be integrated already). If your remote is not listed i haven't extracted it yet.
    3. Go back to the play button and hit the menu key again.
    4. Got to registration.
    5. Set the Registration on the Base Station via the web interface to enabled. You should get a registration which is 8 characters long.
      Enter the password exactly as it is displayed (i guess it is always lowercase)
    6. Press "register". It should display Registration sucessful within a second. If registration does not work look at your base station anyway, it may
      have registered but did not detect it correctly.
      If that is the case, press back to get to the Play button and press it.
    7. It should take a few seconds for the stream to start (hopefully).

    To activate the remote just touch the screen
    To deactivate the remote touch anything except a button

    If you have performance problems you have the following options:
    • Reduce the Picture size
    • Set the scaling filter to fast
    • Lower the stream quality
    • Activate frame dropping (i.e 50 percent)
    • Lower the encoder framerate
    • Set the encoded video size to low

    Known issues
    • FIXED in 1.0.1 On some devices the player crashes before showing any video at all.
    • FIXED On some devices the remote control is not displayed correctly
    • FIXED The stream from LF-V30 BaseStations may cause trouble and not resync after dropped frames
    • PARTIALLY FIXED If the program can't connect it will hang until it crashes :)
    Donations:

    The following people have donated to this project (If you don't want to be listed here send me a message).
    If you consider donating more than the 4 Euros of the donation version, please use paypal, otherwise most of your money will end up with google (30% fees)

    Direct donations
    dzapme; Stefan Zimmermann; Joe Lo

    Donation version
    Tommyboy_65_98; Arthur Fernandez; ersd999; Dominic Zapletal; Ruben C De Jesus; Alvin Kelsey; gvece; M J Elvin; echardcore; Jeremy Carter; Wayne C Corby; Brian Metzger; Brian Ellerbusch; Mark De Jong; Thomas Pruss; Duane Leichtamer; James Smith, rallyraiden; Ghassen Mahfoudhi; Kenneth Dupre; hockeygoalie; the292
    Greetings


    How to get the program:

    You can download it from the android market

    or you can scan one of the following codes:

    Donation version (4 Euros)
    theretv_donate.png


    Free version
    theretv_free.png



    Michael
    2
    Hi,
    I want to thank the author for this amazing app.
    I've bought the donated version and it worked OK for me. But I wanted to use my remote (for Globo Opticum 4060cx SAT decoder). So I've done some research based on author's hints and managed to get the codes :) This has encouraged me to dig deeper :) I've reworked some classes in such way that:
    1. I've now got 16-button remote :)
    2. buttons are showing on my son's Asus TF300T running JB (with original version there was only black rectangle)
    Here is a screenshot form the TF:

    TherTVScreenshotSmall.jpg


    I've dropped voulume buttons because volume control is already on android device. I've added digits (to avoid using up/down buttons many times), EPG, EXIT and P/N buttons. P/N button is rather less universal - it switches my decoder from PAL to NTSC (in Poland we have PAL system but I've got NTSC LF version)

    Here is the actual buttons png image:

    buttons_alpha.png


    and the coresponding LFXGLPlayer class code change (onTouchEvent method):

    Code:
            float xf = motionevent.getX() / (float)getWidth();
            float yf = motionevent.getY() / (float)getHeight();
            if(motionevent.getAction() == 1)
                if((double)xf > 0.5D && (double)xf < 0.5D+0.12D && (double)yf < 0.22D && (double)yf > 0.02D)
                    lfclient.sendButton("d1");
                else
                if((double)xf > 0.5D+0.132D && (double)xf < 0.5D+0.24D && (double)yf < 0.22D && (double)yf > 0.02D)
                    lfclient.sendButton("d2");
                else
                if((double)xf > 0.5D+0.26D && (double)xf < 0.5D+0.366D && (double)yf < 0.22D && (double)yf > 0.02D)
                    lfclient.sendButton("d3");
                else
                if((double)xf > 0.5D+0.38D && (double)xf < 0.5D+0.49D && (double)yf < 0.22D && (double)yf > 0.02D)
                    lfclient.sendButton("power");
                else
                if((double)xf > 0.5D && (double)xf < 0.5D+0.12D && (double)yf < 0.48D && (double)yf > 0.26D)
                    lfclient.sendButton("d4");
                else
                if((double)xf > 0.5D+0.132D && (double)xf < 0.5D+0.24D && (double)yf < 0.48D && (double)yf > 0.26D)
                    lfclient.sendButton("d5");
                else
                if((double)xf > 0.5D+0.26D && (double)xf < 0.5D+0.366D && (double)yf < 0.48D && (double)yf > 0.26D)
                    lfclient.sendButton("d6");
                else
                if((double)xf > 0.5D+0.38D && (double)xf < 0.5D+0.49D && (double)yf < 0.48D && (double)yf > 0.26D)
                    lfclient.sendButton("pn");
                else
                if((double)xf > 0.5D && (double)xf < 0.5D+0.12D && (double)yf < 0.72D && (double)yf > 0.52D)
                    lfclient.sendButton("d7");
                else
                if((double)xf > 0.5D+0.132D && (double)xf < 0.5D+0.24D && (double)yf < 0.72D && (double)yf > 0.52D)
                    lfclient.sendButton("d8");
                else
                if((double)xf > 0.5D+0.26D && (double)xf < 0.5D+0.366D && (double)yf < 0.72D && (double)yf > 0.52D)
                    lfclient.sendButton("d9");
                else
                if((double)xf > 0.5D+0.38D && (double)xf < 0.5D+0.49D && (double)yf < 0.72D && (double)yf > 0.25D)
                    lfclient.sendButton("epg");
                else
                if((double)xf > 0.5D && (double)xf < 0.5D+0.12D && (double)yf < 0.98D && (double)yf > 0.77D)
                    lfclient.sendButton("channeldown");
                else
                if((double)xf > 0.5D+0.132D && (double)xf < 0.5D+0.24D && (double)yf < 0.98D && (double)yf > 0.77D)
                    lfclient.sendButton("d0");
                else
                if((double)xf > 0.5D+0.26D && (double)xf < 0.5D+0.366D && (double)yf < 0.98D && (double)yf > 0.77D)
                    lfclient.sendButton("channelup");
                else
                if((double)xf > 0.5D+0.38D && (double)xf < 0.5D+0.49D && (double)yf < 0.98D && (double)yf > 0.77D)
                    lfclient.sendButton("exit");
                else
                {
                    renderer.showUI(false);
                    requestRender();
                }

    and the arrays.xml change:

    Code:
        <string-array name="remotes">
                     ...
            <item>SV 360 elite</item>
            <item>Globo Opticum 4060cx</item>
        </string-array>
        <string-array name="remotenames">
                     ...
            <item>SV 360 elite</item>
            <item>4060cx</item>
        </string-array>

    and finally remotecodes.xml changes:

    Code:
    	<set name="4060cx">
    		<power>
    			<on>AQAJCgEBBQAIQEAKAJk=</on>
    			<off>AQABAgIC</off>
    		</power>
    		<channelup>
    			<on>AQAJCgEBBQAIQEALAJo=</on>
    			<off>AQABAgIC</off>
    		</channelup>	
    		<channeldown>
    			<on>AQAJCgEBBQAIQEAOAJ0=</on>
    			<off>AQABAgIC</off>
    		</channeldown>	
    		<volumedown>
    			<on>AQAJCgEBBQAIQEAQAJ8=</on>
    			<off>AQABAgIC</off>
    		</volumedown>	
    		<volumeup>
    			<on>AQAJCgEBBQAIQEARAKA=</on>
    			<off>AQABAgIC</off>
    		</volumeup>	
    		<d1>
    			<on>AQAJCgEBBQAIQEABAJA=</on>
    			<off>AQABAgIC</off>
    		</d1>	
    		<d2>
    			<on>AQAJCgEBBQAIQEACAJE=</on>
    			<off>AQABAgIC</off>
    		</d2>	
    		<d3>
    			<on>AQAJCgEBBQAIQEADAJI=</on>
    			<off>AQABAgIC</off>
    		</d3>	
    		<d4>
    			<on>AQAJCgEBBQAIQEAEAJM=</on>
    			<off>AQABAgIC</off>
    		</d4>	
    		<d5>
    			<on>AQAJCgEBBQAIQEAFAJQ=</on>
    			<off>AQABAgIC</off>
    		</d5>	
    		<d6>
    			<on>AQAJCgEBBQAIQEAGAJU=</on>
    			<off>AQABAgIC</off>
    		</d6>	
    		<d7>
    			<on>AQAJCgEBBQAIQEAHAJY=</on>
    			<off>AQABAgIC</off>
    		</d7>	
    		<d8>
    			<on>AQAJCgEBBQAIQEAIAJc=</on>
    			<off>AQABAgIC</off>
    		</d8>	
    		<d9>
    			<on>AQAJCgEBBQAIQEAJAJg=</on>
    			<off>AQABAgIC</off>
    		</d9>	
    		<d0>
    			<on>AQAJCgEBBQAIQEAAAI8=</on>
    			<off>AQABAgIC</off>
    		</d0>	
    		<pn>
    			<on>AQAJCgEBBQAIQEAYAKc=</on>
    			<off>AQABAgIC</off>
    		</pn>	
    		<epg>
    			<on>AQAJCgEBBQAIQEBCANE=</on>
    			<off>AQABAgIC</off>
    		</epg>	
    		<exit>
    			<on>AQAJCgEBBQAIQEBBANA=</on>
    			<off>AQABAgIC</off>
    		</exit>	
    	</set>

    These changes allow us to have 16 buttons instead of 5.

    The last change fixes (at least on the Asus tablet) black rectangle problem. It's done in OverlayImage class (loadTexture method):

    Code:
    //    Bitmap localBitmap = BitmapFactory.decodeResource(paramContext.getResources(), this.resourceID);
          Bitmap localBitmap = null;
          InputStream is = paramContext.getResources().openRawResource(this.resourceID);
          try {
        	  localBitmap = BitmapFactory.decodeStream(is);
          } finally {
              try {
                  is.close();
                  is = null;
              } catch(IOException e) {
    
              }
          }

    I hope that the author won't blame me for this post and maybe will be so kind to use my findings in next versions :)

    Sorry for my poor english

    Regards
    Kuba
    1
    Maybe try going a different route, trying thru development for their Xperia channel (they do use Android of course!)

    Natasha Dutta
    Senior Communications Manager,
    Sony Ericsson Mobile Communications AB
    Email: sedwpress@sonyericsson.com
    http://developer.sonyericsson.com/wp/contact/
    1
    With the latest update this app is clearer and sounds better then the offical pc software made by Sony. It also looks and sounds better on my thrive and inspire then it does on my PSP.
    Fantastic work Michael !
    Tested the app all day yesterday with a 4g connection and it only dropped a few times and that was due to poor data service areas .This is a screenshot of the picture quality of the app on inspire it is so clear
    208b71cb-7c1d-b868.jpg


    Sent from my Inspire 4G using XDA App
    1
    Just picked up one of the Sony LocationFree base stations. Looking to try out ThereTV on my android tablet. But I can't access Google Play. Is there another way to get a hold of the APK for this app ? If it works, I will be more than happy to donate - this sounds like it's going to be great if I can get it up and running.