netbeans ‘de utf-8 desteği

http://m3rlinez.blogspot.com/2007/01/utf-8-in-netbeans-55.html

netbeans kategorisinde yayınlandı. » yorum bırak;

nokia 3650 : “file is corrupted”

3650′de internetten j2me uygulama install ederken beliren bu hatanin sebebi, jad dosyasindaki MIDlet-Icon parametresinin eksikliğinden kaynaklanmaktadir.

MIDlet-Icon: /res/icon2.png

formatinda icon tanimlasini yapabilirsiniz.

j2me kategorisinde yayınlandı. » yorum bırak;

msnp13 `te ADL / RML

msnp13 protokolünde contact eklemek ve çıkarmak için, soap requestlerinin dışında, ns’ye ADL ve RML komutlarını da gondermeniz gerekmektedir. soap request’i sadece addressbook uzerinde kalıcı değişiklik yapar, ADL ve RML ise bu değişikliğinizi msn protokolüne o anda iletmek içindir.

xxxx@hotmail.com kullanicisini, blocklamak için gonderilmesi gereken komutlar şunlardır.

<< ADL 0 62
<ml><d n=”hotmail.com”><c n=”xxxx” l=”4″ t=”1″ /></d></ml>

>>ADL 0 OK

<< RML 1 62
<ml><d n=”hotmail.com”><c n=”xxxx” t=”1″ l=”2″ /></d></ml>

>>RML 1 OK

msnp kategorisinde yayınlandı. 1 Yorum »

xml string fixer

- The entity name must immediately follow the ‘&’ in the entity reference

gibi hatalarda aşağıdaki xml fixer’ı kullanabilirsiniz. Bu tarz hatalar xml’e çevirmeye çalıştığınız stringdeki yapısal bozukluklardan kaynaklanmaktadır.

private String xmlFixer(String xmlString) {
xmlString = xmlString.replaceAll(“&([^; ]*);”, “||VALIDXMLTAG||$1;”);
xmlString = xmlString.replaceAll(“&”,”&amp;”);
xmlString = xmlString.replaceAll(“\\|\\|VALIDXMLTAG\\|\\|([^; ]*);”, “&$1;”);
return (xmlString);
}

 

java genel kategorisinde yayınlandı. » yorum bırak;

SoapClient Http / Https

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
public class SoapClient {
String SOAPUrl = null;
String SOAPPage = null;
String SOAPAction = null;
String cookie = null;

public SoapClient(String SOAPUrl,String SOAPPage, String SOAPAction, String cookie) {
this.SOAPUrl = SOAPUrl;
this.SOAPPage = SOAPPage;
this.SOAPAction = SOAPAction;
this.cookie = cookie;
}

public Document getResponse(String request) throws IOException, ParserConfigurationException, SAXException, KeyStoreException, NoSuchAlgorithmException, CertificateException, KeyManagementException {
Document doc = null;
if (SOAPUrl.startsWith(“http://”)) {
doc = getResponseWithHTTP(request);
} else {
doc = getResponseWithHTTPS(request);
}

return doc;
}
private Document getResponseWithHTTPS(String request) throws IOException, ParserConfigurationException, SAXException, KeyStoreException, NoSuchAlgorithmException, CertificateException, KeyManagementException {
String ReturnVal = null;
SSLSocket socket = getSecureSocket();

//SSLSocketFactory ssl = (SSLSocketFactory) SSLSocketFactory.getDefault();
//SSLSocket socket = (SSLSocket) ssl.createSocket(SOAPUrl, 443);

InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);

OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
PrintWriter pw = new PrintWriter(osw);

StringBuffer buf = new StringBuffer();
StringBuffer buf2 = new StringBuffer(request);

buf.append(“POST ” + SOAPPage + ” HTTP/1.1″ + “\r\n”);
buf.append(“Accept: */*” + “\r\n”);
if (SOAPAction!= null && !SOAPAction.equals(“”)) {
buf.append(“SOAPAction: “+ SOAPAction + “\r\n”);
}
buf.append(“Content-Type: text/xml; charset=utf-8″ + “\r\n”);
buf.append(“Content-Length: ” + buf2.length() + “\r\n”);
buf.append(“User-Agent: tJOPtJOPProxy/3.0″ + “\r\n”);
buf.append(“Host: ” + SOAPUrl + “\r\n”);
buf.append(“Connection: Keep-Alive” + “\r\n”);
buf.append(“Cache-Control: no-cache” + “\r\n”);
buf.append(“\r\n”);
buf.append(buf2.toString());

System.out.println(“———–”);
System.out.println(buf.toString());
System.out.println(“———–”);

pw.print(buf.toString());
pw.flush();

buf = new StringBuffer();
buf2 = null;

boolean DoLoop = true;
int Length = 0;

while(DoLoop) {
String str = br.readLine();
if(str.startsWith(“Content-Length:”)) {
String[] DataArray = str.split(” “);
Length = Integer.parseInt(DataArray[1]) + 2;
for(int i = 0; i < Length; i++) {
int c = br.read();
buf.append((char) c);
}
String data = buf.toString();
data = data.replaceAll(“&”, “&”);
ReturnVal = data;
DoLoop = false;
}
}

if (ReturnVal.startsWith(“\r\n”)) {
ReturnVal = ReturnVal.substring(“\r\n”.length());
}

System.out.println(“SOAP >> “+ReturnVal);
Document XMLDoc = XmlHelper.getXMLFromString(ReturnVal);

return XMLDoc;
}
private Document getResponseWithHTTP(String request) throws IOException, ParserConfigurationException, SAXException {
// Create the connection where we’re going to send the file.
System.setProperty(“java.protocol.handler.pkgs”, “com.sun.net.ssl.internal.www.protocol”);
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

URL url = new URL(SOAPUrl);
URLConnection connection = url.openConnection();

HttpURLConnection httpConn = (HttpURLConnection) connection;

byte[] b = request.getBytes();

/*
POST /abservice/SharingService.asmx HTTP/1.1
SOAPAction: http://www.msn.com/webservices/AddressBook/FindMembership
Content-Type: text/xml; charset=utf-8
Cookie: MSPAuth=Removed
Host: contacts.msn.com
Content-Length: Variable
*/

// Set the appropriate HTTP parameters.
httpConn.setRequestProperty(“SOAPAction”,SOAPAction);
httpConn.setRequestProperty(“Content-Type”,”text/xml; charset=utf-8″);
httpConn.setRequestProperty(“Cookie”,”MSPAuth=”+cookie);
httpConn.setRequestProperty( “Content-Length”, String.valueOf( b.length ) );
httpConn.setRequestMethod( “POST” );
httpConn.setDoOutput(true);
httpConn.setDoInput(true);

// Everything’s set up; send the XML that was read in to b.
OutputStream out = httpConn.getOutputStream();
out.write( b );
out.close();

// Read the response and write it to standard out.
InputStreamReader isr = new InputStreamReader(httpConn.getInputStream());
BufferedReader in = new BufferedReader(isr);

String inputLine = “”;
String input = null;
while ((input = in.readLine()) != null) inputLine+=input+”\r\n”;
in.close();

Document XMLDoc = XmlHelper.getXMLFromString(inputLine);

return XMLDoc;
}

private SSLSocket getSecureSocket() throws FileNotFoundException, KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, KeyManagementException {
String host= SOAPUrl;
int port = 443;
char[] passphrase;
String p = “changeit”;
passphrase = p.toCharArray();

File file = new File(“jssecacerts”);
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty(“java.home”) + SEP
+ “lib” + SEP + “security”);
file = new File(dir, “jssecacerts”);
if (file.isFile() == false) {
file = new File(dir, “cacerts”);
}
}
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
in.close();

SSLContext context = SSLContext.getInstance(“TLS”);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] {tm}, null);
SSLSocketFactory factory = context.getSocketFactory();

SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
socket.setSoTimeout(10000);
// try {
// System.out.println(“Starting SSL handshake…”);
// socket.startHandshake();
// socket.close();
// System.out.println();
// System.out.println(“No errors, certificate is already trusted”);
// } catch (SSLException e) {
// System.out.println();
// e.printStackTrace(System.out);
// }
//
// X509Certificate[] chain = tm.chain;
// if (chain == null) {
// System.out.println(“Could not obtain server certificate chain”);
// return null;
// }
//
// BufferedReader reader =
// new BufferedReader(new InputStreamReader(System.in));
//
// System.out.println();
// System.out.println(“Server sent ” + chain.length + ” certificate(s):”);
// System.out.println();
// MessageDigest sha1 = MessageDigest.getInstance(“SHA1″);
// MessageDigest md5 = MessageDigest.getInstance(“MD5″);
// for (int i = 0; i < chain.length; i++) {
// X509Certificate cert = chain[i];
// System.out.println
// (” ” + (i + 1) + ” Subject ” + cert.getSubjectDN());
// System.out.println(” Issuer ” + cert.getIssuerDN());
// sha1.update(cert.getEncoded());
// System.out.println(” sha1 ” + toHexString(sha1.digest()));
// md5.update(cert.getEncoded());
// System.out.println(” md5 ” + toHexString(md5.digest()));
// System.out.println();
// }
//
// System.out.println(“Enter certificate to add to trusted keystore or ‘q’ to quit: [1]“);
// String line = “1″;
// int k;
// try {
// k = (line.length() == 0) ? 0 : Integer.parseInt(line) – 1;
// } catch (NumberFormatException e) {
// System.out.println(“KeyStore not changed”);
// return null;
// }
//
// X509Certificate cert = chain[k];
// String alias = host + “-” + (k + 1);
// ks.setCertificateEntry(alias, cert);
//
// OutputStream out = new FileOutputStream(“jssecacerts”);
// ks.store(out, passphrase);
// out.close();
//
// System.out.println();
// System.out.println(cert);
// System.out.println();
// System.out.println
// (“Added certificate to keystore ‘jssecacerts’ using alias ‘”
// + alias + “‘”);

return socket;
}
private static final char[] HEXDIGITS = “0123456789abcdef”.toCharArray();
private static String toHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 3);
for (int b : bytes) {
b &= 0xff;
sb.append(HEXDIGITS[b >> 4]);
sb.append(HEXDIGITS[b & 15]);
sb.append(‘ ‘);
}
return sb.toString();
}
private static class SavingTrustManager implements X509TrustManager {

private final X509TrustManager tm;
private X509Certificate[] chain;

SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}

public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}

public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}

public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}
}

j2se kategorisinde yayınlandı. » yorum bırak;

base64 encoder/decoder

/*
* Base64Coder.java
*
* Created on February 2, 2007, 3:55 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package tool;
/**
* A Base64 Encoder/Decoder.
*
* <p>
* This class is used to encode and decode data in Base64 format as described in RFC 1521.
*
* <p>
* This is “Open Source” software and released under the <a href=”http://www.gnu.org/licenses/lgpl.html”>GNU/LGPL</a> license.<br>
* It is provided “as is” without warranty of any kind.<br>
* Copyright 2003: Christian d’Heureuse, Inventec Informatik AG, Switzerland.<br>
* Home page: <a href=”http://www.source-code.biz”>www.source-code.biz</a><br>
*
* <p>
* Version history:<br>
* 2003-07-22 Christian d’Heureuse (chdh): Module created.<br>
* 2005-08-11 chdh: Lincense changed from GPL to LGPL.<br>
* 2006-11-21 chdh:<br>
*   Method encode(String) renamed to encodeString(String).<br>
*   Method decode(String) renamed to decodeString(String).<br>
*   New method encode(byte[],int) added.<br>
*   New method decode(String) added.<br>
*/

public class Base64Coder {

// Mapping table from 6-bit nibbles to Base64 characters.
private static char[] map1 = new char[64];
static {
int i=0;
for (char c=’A'; c<=’Z'; c++) map1[i++] = c;
for (char c=’a'; c<=’z'; c++) map1[i++] = c;
for (char c=’0′; c<=’9′; c++) map1[i++] = c;
map1[i++] = ‘+’; map1[i++] = ‘/’; }

// Mapping table from Base64 characters to 6-bit nibbles.
private static byte[] map2 = new byte[128];
static {
for (int i=0; i<map2.length; i++) map2[i] = -1;
for (int i=0; i<64; i++) map2[map1[i]] = (byte)i; }

/**
* Encodes a string into Base64 format.
* No blanks or line breaks are inserted.
* @param s a String to be encoded.
* @return A String with the Base64 encoded data.
*/
public static String encodeString(String s) {
return new String(encode(s.getBytes())); }

/**
* Encodes a byte array into Base64 format.
* No blanks or line breaks are inserted.
* @param in an array containing the data bytes to be encoded.
* @return A character array with the Base64 encoded data.
*/
public static char[] encode(byte[] in) {
return encode(in,in.length); }

/**
* Encodes a byte array into Base64 format.
* No blanks or line breaks are inserted.
* @param in an array containing the data bytes to be encoded.
* @param iLen number of bytes to process in <code>in</code>.
* @return A character array with the Base64 encoded data.
*/
public static char[] encode(byte[] in, int iLen) {
int oDataLen = (iLen*4+2)/3; // output length without padding
int oLen = ((iLen+2)/3)*4; // output length including padding
char[] out = new char[oLen];
int ip = 0;
int op = 0;
while (ip < iLen) {
int i0 = in[ip++] & 0xff;
int i1 = ip < iLen ? in[ip++] & 0xff : 0;
int i2 = ip < iLen ? in[ip++] & 0xff : 0;
int o0 = i0 >>> 2;
int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
int o3 = i2 & 0x3F;
out[op++] = map1[o0];
out[op++] = map1[o1];
out[op] = op < oDataLen ? map1[o2] : ‘=’; op++;
out[op] = op < oDataLen ? map1[o3] : ‘=’; op++; }
return out; }

/**
* Decodes a string from Base64 format.
* @param s a Base64 String to be decoded.
* @return A String containing the decoded data.
* @throws IllegalArgumentException if the input is not valid Base64 encoded data.
*/
public static String decodeString(String s) {
return new String(decode(s)); }

/**
* Decodes a byte array from Base64 format.
* @param s a Base64 String to be decoded.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException if the input is not valid Base64 encoded data.
*/
public static byte[] decode(String s) {
return decode(s.toCharArray()); }

/**
* Decodes a byte array from Base64 format.
* No blanks or line breaks are allowed within the Base64 encoded data.
* @param in a character array containing the Base64 encoded data.
* @return An array containing the decoded data bytes.
* @throws IllegalArgumentException if the input is not valid Base64 encoded data.
*/
public static byte[] decode(char[] in) {
int iLen = in.length;
if (iLen%4 != 0) throw new IllegalArgumentException(“Length of Base64 encoded input string is not a multiple of 4.”);
while (iLen > 0 && in[iLen-1] == ‘=’) iLen–;
int oLen = (iLen*3) / 4;
byte[] out = new byte[oLen];
int ip = 0;
int op = 0;
while (ip < iLen) {
int i0 = in[ip++];
int i1 = in[ip++];
int i2 = ip < iLen ? in[ip++] : ‘A’;
int i3 = ip < iLen ? in[ip++] : ‘A’;
if (i0 > 127 || i1 > 127 || i2 > 127 || i3 > 127)
throw new IllegalArgumentException(“Illegal character in Base64 encoded data.”);
int b0 = map2[i0];
int b1 = map2[i1];
int b2 = map2[i2];
int b3 = map2[i3];
if (b0 < 0 || b1 < 0 || b2 < 0 || b3 < 0)
throw new IllegalArgumentException(“Illegal character in Base64 encoded data.”);
int o0 = ( b0 <<2) | (b1>>>4);
int o1 = ((b1 & 0xf)<<4) | (b2>>>2);
int o2 = ((b2 & 3)<<6) | b3;
out[op++] = (byte)o0;
if (op<oLen) out[op++] = (byte)o1;
if (op<oLen) out[op++] = (byte)o2; }
return out; }

// Dummy constructor.
private Base64Coder() {}

} // end class Base64Coder

java genel kategorisinde yayınlandı. » yorum bırak;

Netweaver’da Custom Login Kütüphaneleri

Custom login kütüphaneleri şunlardır:
1. com.sap.portal.runtime.logon_api.jar
2. umelogonbase.jar

Bu kütüphaneleri temin edebilmek için;

1) Application server’in kurulu oldugu server’da aşağıdaki dizinin altında name com.sap.portal.runtime.logon.par.bak dosyasını bulacaksınız. Bu dosyayı bilgisarınıza sonundaki .bak uzantısını silerek kaydedin.

.bak Dizini: <sapmnt>\<SID>\<Instance>\j2ee\cluster\server<#>\apps\sap.com\irj\servlet_jsp\irj\root\WEB-INF\deployment\pcd\

2) Daha sonra bu dosyanın .par olan uzantısını .rar olarak değiştirin ve winrar ile açın.

3) PORTAL-INF/lib ‘in içinde gerekli jarları bulacaksınız.

netweaver kategorisinde yayınlandı. 1 Yorum »

sun java wtk 2.5 beta yayınlandı.

wtk 2.5 beta sürümünü aşağıdaki adresten indirebilirsiniz.

http://java.sun.com/products/sjwtoolkit/download-2_5.html

j2me kategorisinde yayınlandı. » yorum bırak;

tarih formatlama

import java.util.*;
import java.text.*;
public class TarihFormatlama {
   public static void main(String args[]) {
      TarihFormatlama tarih = new TarihFormatlama ();
      tarih.goster();
      }
   public void goster() {
      System.out.println(formatla("dd MMMMM yyyy"));
      System.out.println(formatla("yyyyMMdd"));
      System.out.println(formatla("dd.MM.yy"));
      System.out.println(formatla("MM/dd/yy"));
      System.out.println(formatla("yyyy.MM.dd G 'at' hh:mm:ss z"));
      System.out.println(formatla("EEE, MMM d, ''yy"));
      System.out.println(formatla("h:mm a"));
      System.out.println(formatla("H:mm:ss:SSS"));
      System.out.println(formatla("K:mm a,z"));
      System.out.println(formatla("yyyy.MMMMM.dd GGG hh:mm aaa"));
      }
    public String formatla (String format) {
     Date today = new Date();
     SimpleDateFormat formatter = new SimpleDateFormat(format);
     String datenewformat = formatter.format(today);
     return  datenewformat;
     }
   }
java genel kategorisinde yayınlandı. » yorum bırak;

Web uzerinden xml okuma

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.w3c.dom.Document;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class streamread {
    public static void main (String argv []){
        try {
            //kurulacak baglanti için ortam hazirlniyor
            DocumentBuilderFactory docBuilderFactory =
DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder =
docBuilderFactory.newDocumentBuilder();

            //XML dokumanina dönüstürülecek URL veriliyor
            Document doc = connecttodocument(docBuilder,”http://www.radikal.com.tr/radikal.xml“);
          //radikal.xml için yapilmis spesifik inceleme
            NodeList listofitems= doc.getElementsByTagName(“item”);
            for(int i=0;i<listofitems.getLength();i++){
                Node itemnode= listofitems.item(i);
                if(itemnode.getNodeType()==Node.ELEMENT_NODE){
                    Element itemelement= (Element)itemnode;
                    NodeList childList= itemelement.getChildNodes();
                    System.out.println(“HABER NO : “+ (i+1));
                    for(int j=0;j<childList.getLength();j++)
                        if(childList.item(j).getNodeType()!=3){
                            Node
icerik=childList.item(j).getChildNodes().item(0);
                            String nodename=childList.item(j).getNodeName();
                            if(nodename.equals(“category”))
                                System.out.print(“Kategori : “);
                            else if(nodename.equals(“title”))
                                System.out.print(“Ba?l?k   : “);
                            else if(nodename.equals(“editor1″))
                                System.out.print(“Yazar 1  : “);
                            else if(nodename.equals(“editor2″))
                                System.out.print(“Yazar 2  : “);
                            else if(nodename.equals(“description”))
                                System.out.print(“Aç?klama : “);
                            else if(nodename.equals(“link”))
                                System.out.print(“Link     : “);
                            else
                                System.out.print(“Unknown  : “);

                            System.out.println(icerik.getNodeValue());
                        }
                    System.out.println(” “);
                }
            }
        }
        catch (Exception e) {
            System.out.println(“hata”);
        }

    }

        //verilen URL’ye baglaniliyor
        public static Document connecttodocument(DocumentBuilder db, String
urlString){
        try {

     //yeni url olusturuluyor
            URL url = new URL( urlString );
            try {
                URLConnection URLconnection =url.openConnection ( ) ;
                HttpURLConnection httpConnection
=(HttpURLConnection)URLconnection;

                //gelen cevaba bakiliyor
                int responseCode =httpConnection.getResponseCode ( ) ;
                //baglanti kuruldyusa isleme baslaniyor
                if ( responseCode == HttpURLConnection.HTTP_OK) {
                    InputStream in = httpConnection.getInputStream ( ) ;
                    try {
                        //gelen stream XML dokumanina cevriliyor
                        Document doc = db.parse( in );
                        return doc;
                    }
                    catch(org.xml.sax.SAXException e){
                        System.out.println(“hata”);
                        e.printStackTrace ( ) ;
                    }
                }
                else{
                    System.out.println( “HTTP connection response !=
HTTP_OK” );
                }
            }
            catch ( IOException e ) {
                System.out.println(“hata”);
                e.printStackTrace ( ) ;
            }
        }
        catch ( MalformedURLException e ) {
            System.out.println(“hata”);
            e.printStackTrace ( ) ;
        }
        return null;
    }
}

java genel kategorisinde yayınlandı. » yorum bırak;
Follow

Get every new post delivered to your Inbox.