首先,源码可以在这里下载,http://download.csdn.net/detail/koflfy/3932151早几天在论坛开了一贴,现在问题终于解决了,该程序对某个网站的验证码做识别,识别率百分之百,可以拿这个程序举一反三,现在还有很多网站都是用这种验证码的,包括我刚才上传资源的页面的CSDN的验证码都可以简单修改识别之,呵呵。。 之前处理完验证码图片后,分割图片进行x,y取点阵,后来发现有几个字符点阵有重复,所以不能百分百识别,后来在一位朋友的提醒下对验证码再做y,x取点阵,终于能百分百识别了,在研究的过程中,也学会很多东西,现放出源码,同时感谢 Sandy945 大牛。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.IO;namespace 图片处理 { public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.Text = ""; } private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; GetImage(); pictureBox1.Load(@"d:/getimage.jpg"); SetImage(); } public void GetImage() { CookieContainer container = new CookieContainer(); string url = "http://www.bitscn.com/include/vdimgck.php"; byte[] bs = new byte[4096]; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.CookieContainer = container; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream resStream = response.GetResponseStream(); int len = resStream.Read(bs, 0, 4096); response.Cookies = container.GetCookies(request.RequestUri); resStream.Close(); string path = @"d:/" + "getimage" + ".jpg"; FileStream fs = File.Create(path); fs.Write(bs, 0, len); fs.Close(); } public void SetImage() { string path = @"d:/getImage.jpg"; Bitmap bm = new Bitmap(path); // 得到位图对象 int w = bm.Size.Width; int h = bm.Size.Height; Bitmap bm2 = new Bitmap(w, h); Color c = Color.Empty; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { c = bm.GetPixel(i, j); float b = c.GetBrightness(); if (b <= 0.5) { bm2.SetPixel(i, j, Color.Blue); } } } ////处理第一列的蓝色的干扰点 //for (int i = 0; i < w; i++) //{ // for (int j = 0; j < 1; j++) // { // bm2.SetPixel(i, j, Color.Black); // } //} ////处理第一行的蓝色的干扰点 //for (int i = 0; i < 1; i++) //{ // for (int j = 0; j < h; j++) // { // bm2.SetPixel(i, j, Color.Black); // } //} ////处理最后一列的蓝色的干扰点 //for (int i = w - 1; i < w; i++) //{ // for (int j = 0; j < h; j++) // { // bm2.SetPixel(i, j, Color.Black); // } //} ////处理最后一行的蓝色的干扰点 //for (int i = h - 1; i < h; i++) //{ // for (int j = 0; j < w; j++) // { // bm2.SetPixel(j, i, Color.Black); // } //} bm2.Save(@"c:/black.jpg"); //pictureBox2.Load(@"c:/black.jpg"); if (File.Exists(@"c:/black.jpg")) { File.Copy(@"c:/black.jpg",@"d:/black.jpg",true); File.Delete(@"c:/black.jpg"); } Bitmap bm3 = new Bitmap(@"d:/black.jpg"); // 得到位图对象 string a = bm3.GetPixel(10, 5).Name; w = bm3.Size.Width; h = bm3.Size.Height; int Column = 0; int[] temp = new int[12]; int[] temp2 = new int[12]; int[] temp3 = new int[12]; int[] temp4 = new int[12]; int[] Number1 = new int[12]; int[] Number2 = new int[12]; int[] Number3 = new int[12]; int[] Number4 = new int[12]; int[] SNumber = new int[8]; int[] SNumber2 = new int[8]; int[] SNumber3 = new int[8]; int[] SNumber4 = new int[8];
晕,贴子太长,不小心剪切错了。 //第一个验证码处理 for (int i = 5; i < 17; i++) { int Blue = 0; for (int j = 6; j < 14; j++) { if (bm3.GetPixel(j, i).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp[Column] = Blue; Column++; } } for (int i = 0; i < 12; i++) { Number1[i] = temp[i]; } Column = 0; for (int i = 6; i < 14; i++) { int Blue = 0; for (int j = 5; j < 17; j++) { if (bm3.GetPixel(i, j).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp[Column] = Blue; Column++; } } for (int i = 0; i < 8; i++) { SNumber[i] = temp[i]; } discern(Number1,SNumber); Column = 0; //第二个验证码处理 for (int i = 5; i < 17; i++) { int Blue = 0; for (int j = 16; j < 24; j++) { if (bm3.GetPixel(j, i).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp2[Column] = Blue; Column++; } } for (int i = 0; i < 12; i++) { Number2[i] = temp2[i]; } Column = 0;
for (int i = 16; i < 24; i++) { int Blue = 0; for (int j = 5; j < 17; j++) { if (bm3.GetPixel(i, j).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp2[Column] = Blue; Column++; } } for (int i = 0; i < 8; i++) { SNumber2[i] = temp2[i]; } discern(Number2, SNumber2); Column = 0; //第三个验证码处理 for (int i = 5; i < 17; i++) { int Blue = 0; for (int j = 26; j < 34; j++) { if (bm3.GetPixel(j, i).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp3[Column] = Blue; Column++; } } for (int i = 0; i < 12; i++) { Number3[i] = temp3[i]; } Column = 0; for (int i = 26; i < 34; i++) { int Blue = 0; for (int j = 5; j < 17; j++) { if (bm3.GetPixel(i, j).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp3[Column] = Blue; Column++; } } for (int i = 0; i < 8; i++) { SNumber3[i] = temp3[i]; } discern(Number3, SNumber3); Column = 0; //第四个验证码处理 for (int i = 5; i < 17; i++) { int Blue = 0; for (int j = 36; j < 44; j++) { if (bm3.GetPixel(j, i).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp4[Column] = Blue; Column++; } } for (int i = 0; i < 12; i++) { Number4[i] = temp4[i]; } Column = 0; for (int i = 36; i < 44; i++) { int Blue = 0; for (int j = 5; j < 17; j++) { if (bm3.GetPixel(i, j).Name == "ff0000ff") { Blue++; } } if (Blue > 0) { temp4[Column] = Blue; Column++; } } for (int i = 0; i < 8; i++) { SNumber4[i] = temp4[i]; } discern(Number4, SNumber4); Column = 0; bm.Dispose(); bm2.Dispose(); bm3.Dispose(); }
public void discern(int[] dis,int[] Sdis) { StringBuilder res = new StringBuilder(); StringBuilder Sres = new StringBuilder(); for (int i = 0; i < dis.Length; i++) { res.Append(dis[i].ToString()); } for (int i = 0; i < Sdis.Length; i++) { Sres.Append(Sdis[i].ToString()); } if(res.ToString()=="822222222200"&&Sres.ToString()=="1111010111") { textBox1.Text += "T";
} else { if (res.ToString() == "444444444400" && Sres.ToString() == "1010244442") { textBox1.Text += "K"; } else { if (res.ToString() == "444444444400" && Sres.ToString() == "89211298") { textBox1.Text += "U"; } else { switch (res.ToString()) { case "234222222600": textBox1.Text += "1"; break; case "444222222800": textBox1.Text += "2"; break; case "542232224500": textBox1.Text += "3"; break; case "234444822200": textBox1.Text += "4"; break; case "722552244400": textBox1.Text += "5"; break; case "443255444400": textBox1.Text += "6"; break; case "822222222200": textBox1.Text += "7"; break; case "444444444400": textBox1.Text += "8"; break; case "444455234400": textBox1.Text += "9"; break; case "244444844400": textBox1.Text += "A"; break; case "644464444600": textBox1.Text += "B"; break; case "543222234500": textBox1.Text += "C"; break; case "644444444600": textBox1.Text += "D"; break; case "722262222700": textBox1.Text += "E"; break; case "822262222200": textBox1.Text += "F"; break; case "542225444500": textBox1.Text += "G"; break; case "444484444400": textBox1.Text += "H"; break; case "622222222600": textBox1.Text += "I"; break; case "422222234300": textBox1.Text += "J"; break; //case "444444444400": // textBox1.Text += "K"; // break; case "222222222700": textBox1.Text += "L"; break; case "468666444400": textBox1.Text += "M"; break; case "456666655400": textBox1.Text += "N"; break; case "744472222200": textBox1.Text += "P"; break; case "444444664500": textBox1.Text += "Q"; break; case "744475444400": textBox1.Text += "R"; break; case "642262224600": textBox1.Text += "S"; break; //case "822222222200": // textBox1.Text += "T"; // break; //case "444444444400": // textBox1.Text += "U"; // break; case "444444442200": textBox1.Text += "V"; break; case "444466686400": textBox1.Text += "W"; break; case "444422444400": textBox1.Text += "X"; break; case "444422222200": textBox1.Text += "Y"; break; case "722222222700": textBox1.Text += "Z"; break; default: MessageBox.Show("验证码有异常,请重新获取"); break; } } } } } } }
public void discern(int[] dis,int[] Sdis) { StringBuilder res = new StringBuilder(); StringBuilder Sres = new StringBuilder(); for (int i = 0; i < dis.Length; i++) { res.Append(dis[i].ToString()); } for (int i = 0; i < Sdis.Length; i++) { Sres.Append(Sdis[i].ToString()); } if(res.ToString()=="822222222200"&&Sres.ToString()=="1111010111") { textBox1.Text += "T";
} else { if (res.ToString() == "444444444400" && Sres.ToString() == "1010244442") { textBox1.Text += "K"; } else { if (res.ToString() == "444444444400" && Sres.ToString() == "89211298") { textBox1.Text += "U"; } else { switch (res.ToString()) { case "234222222600": textBox1.Text += "1"; break; case "444222222800": textBox1.Text += "2"; break; case "542232224500": textBox1.Text += "3"; break; case "234444822200": textBox1.Text += "4"; break; case "722552244400": textBox1.Text += "5"; break; case "443255444400": textBox1.Text += "6"; break; case "822222222200": textBox1.Text += "7"; break; case "444444444400": textBox1.Text += "8"; break; case "444455234400": textBox1.Text += "9"; break; case "244444844400": textBox1.Text += "A"; break; case "644464444600": textBox1.Text += "B"; break; case "543222234500": textBox1.Text += "C"; break; case "644444444600": textBox1.Text += "D"; break; case "722262222700": textBox1.Text += "E"; break; case "822262222200": textBox1.Text += "F"; break; case "542225444500": textBox1.Text += "G"; break; case "444484444400": textBox1.Text += "H"; break; case "622222222600": textBox1.Text += "I"; break; case "422222234300": textBox1.Text += "J"; break; //case "444444444400": // textBox1.Text += "K"; // break; case "222222222700": textBox1.Text += "L"; break; case "468666444400": textBox1.Text += "M"; break; case "456666655400": textBox1.Text += "N"; break; case "744472222200": textBox1.Text += "P"; break; case "444444664500": textBox1.Text += "Q"; break; case "744475444400": textBox1.Text += "R"; break; case "642262224600": textBox1.Text += "S"; break; //case "822222222200": // textBox1.Text += "T"; // break; //case "444444444400": // textBox1.Text += "U"; // break; case "444444442200": textBox1.Text += "V"; break; case "444466686400": textBox1.Text += "W"; break; case "444422444400": textBox1.Text += "X"; break; case "444422222200": textBox1.Text += "Y"; break; case "722222222700": textBox1.Text += "Z"; break; default: MessageBox.Show("验证码有异常,请重新获取"); break; } } } } } } }
之前处理完验证码图片后,分割图片进行x,y取点阵,后来发现有几个字符点阵有重复,所以不能百分百识别,后来在一位朋友的提醒下对验证码再做y,x取点阵,终于能百分百识别了,在研究的过程中,也学会很多东西,现放出源码,同时感谢 Sandy945 大牛。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;namespace 图片处理
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = "";
} private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "";
GetImage();
pictureBox1.Load(@"d:/getimage.jpg");
SetImage();
} public void GetImage()
{
CookieContainer container = new CookieContainer();
string url = "http://www.bitscn.com/include/vdimgck.php";
byte[] bs = new byte[4096];
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = container;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
int len = resStream.Read(bs, 0, 4096);
response.Cookies = container.GetCookies(request.RequestUri);
resStream.Close();
string path = @"d:/" + "getimage" + ".jpg";
FileStream fs = File.Create(path);
fs.Write(bs, 0, len);
fs.Close();
} public void SetImage()
{
string path = @"d:/getImage.jpg";
Bitmap bm = new Bitmap(path); // 得到位图对象
int w = bm.Size.Width;
int h = bm.Size.Height;
Bitmap bm2 = new Bitmap(w, h);
Color c = Color.Empty;
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
c = bm.GetPixel(i, j);
float b = c.GetBrightness();
if (b <= 0.5)
{
bm2.SetPixel(i, j, Color.Blue);
}
}
} ////处理第一列的蓝色的干扰点
//for (int i = 0; i < w; i++)
//{
// for (int j = 0; j < 1; j++)
// {
// bm2.SetPixel(i, j, Color.Black);
// }
//}
////处理第一行的蓝色的干扰点
//for (int i = 0; i < 1; i++)
//{
// for (int j = 0; j < h; j++)
// {
// bm2.SetPixel(i, j, Color.Black);
// }
//} ////处理最后一列的蓝色的干扰点
//for (int i = w - 1; i < w; i++)
//{
// for (int j = 0; j < h; j++)
// {
// bm2.SetPixel(i, j, Color.Black);
// }
//}
////处理最后一行的蓝色的干扰点
//for (int i = h - 1; i < h; i++)
//{
// for (int j = 0; j < w; j++)
// {
// bm2.SetPixel(j, i, Color.Black);
// }
//} bm2.Save(@"c:/black.jpg");
//pictureBox2.Load(@"c:/black.jpg"); if (File.Exists(@"c:/black.jpg"))
{
File.Copy(@"c:/black.jpg",@"d:/black.jpg",true);
File.Delete(@"c:/black.jpg");
}
Bitmap bm3 = new Bitmap(@"d:/black.jpg"); // 得到位图对象
string a = bm3.GetPixel(10, 5).Name;
w = bm3.Size.Width;
h = bm3.Size.Height;
int Column = 0;
int[] temp = new int[12];
int[] temp2 = new int[12];
int[] temp3 = new int[12];
int[] temp4 = new int[12];
int[] Number1 = new int[12];
int[] Number2 = new int[12];
int[] Number3 = new int[12];
int[] Number4 = new int[12];
int[] SNumber = new int[8];
int[] SNumber2 = new int[8];
int[] SNumber3 = new int[8];
int[] SNumber4 = new int[8];
//第一个验证码处理
for (int i = 5; i < 17; i++)
{
int Blue = 0;
for (int j = 6; j < 14; j++)
{
if (bm3.GetPixel(j, i).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp[Column] = Blue;
Column++;
}
} for (int i = 0; i < 12; i++)
{
Number1[i] = temp[i];
} Column = 0; for (int i = 6; i < 14; i++)
{
int Blue = 0;
for (int j = 5; j < 17; j++)
{
if (bm3.GetPixel(i, j).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp[Column] = Blue;
Column++;
}
} for (int i = 0; i < 8; i++)
{
SNumber[i] = temp[i];
} discern(Number1,SNumber);
Column = 0; //第二个验证码处理
for (int i = 5; i < 17; i++)
{
int Blue = 0;
for (int j = 16; j < 24; j++)
{
if (bm3.GetPixel(j, i).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp2[Column] = Blue;
Column++;
}
} for (int i = 0; i < 12; i++)
{
Number2[i] = temp2[i];
} Column = 0;
for (int i = 16; i < 24; i++)
{
int Blue = 0;
for (int j = 5; j < 17; j++)
{
if (bm3.GetPixel(i, j).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp2[Column] = Blue;
Column++;
}
}
for (int i = 0; i < 8; i++)
{
SNumber2[i] = temp2[i];
}
discern(Number2, SNumber2);
Column = 0; //第三个验证码处理
for (int i = 5; i < 17; i++)
{
int Blue = 0;
for (int j = 26; j < 34; j++)
{
if (bm3.GetPixel(j, i).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp3[Column] = Blue;
Column++;
}
} for (int i = 0; i < 12; i++)
{
Number3[i] = temp3[i];
}
Column = 0;
for (int i = 26; i < 34; i++)
{
int Blue = 0;
for (int j = 5; j < 17; j++)
{
if (bm3.GetPixel(i, j).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp3[Column] = Blue;
Column++;
}
}
for (int i = 0; i < 8; i++)
{
SNumber3[i] = temp3[i];
}
discern(Number3, SNumber3);
Column = 0;
//第四个验证码处理
for (int i = 5; i < 17; i++)
{
int Blue = 0;
for (int j = 36; j < 44; j++)
{
if (bm3.GetPixel(j, i).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp4[Column] = Blue;
Column++;
}
}
for (int i = 0; i < 12; i++)
{
Number4[i] = temp4[i];
}
Column = 0;
for (int i = 36; i < 44; i++)
{
int Blue = 0;
for (int j = 5; j < 17; j++)
{
if (bm3.GetPixel(i, j).Name == "ff0000ff")
{
Blue++;
}
} if (Blue > 0)
{
temp4[Column] = Blue;
Column++;
}
}
for (int i = 0; i < 8; i++)
{
SNumber4[i] = temp4[i];
}
discern(Number4, SNumber4);
Column = 0; bm.Dispose();
bm2.Dispose();
bm3.Dispose();
}
{
StringBuilder res = new StringBuilder();
StringBuilder Sres = new StringBuilder();
for (int i = 0; i < dis.Length; i++)
{
res.Append(dis[i].ToString());
} for (int i = 0; i < Sdis.Length; i++)
{
Sres.Append(Sdis[i].ToString());
} if(res.ToString()=="822222222200"&&Sres.ToString()=="1111010111")
{
textBox1.Text += "T";
}
else
{
if (res.ToString() == "444444444400" && Sres.ToString() == "1010244442")
{
textBox1.Text += "K";
}
else
{
if (res.ToString() == "444444444400" && Sres.ToString() == "89211298")
{
textBox1.Text += "U";
}
else
{
switch (res.ToString())
{
case "234222222600":
textBox1.Text += "1";
break;
case "444222222800":
textBox1.Text += "2";
break;
case "542232224500":
textBox1.Text += "3";
break;
case "234444822200":
textBox1.Text += "4";
break;
case "722552244400":
textBox1.Text += "5";
break;
case "443255444400":
textBox1.Text += "6";
break;
case "822222222200":
textBox1.Text += "7";
break;
case "444444444400":
textBox1.Text += "8";
break;
case "444455234400":
textBox1.Text += "9";
break;
case "244444844400":
textBox1.Text += "A";
break;
case "644464444600":
textBox1.Text += "B";
break;
case "543222234500":
textBox1.Text += "C";
break;
case "644444444600":
textBox1.Text += "D";
break;
case "722262222700":
textBox1.Text += "E";
break;
case "822262222200":
textBox1.Text += "F";
break;
case "542225444500":
textBox1.Text += "G";
break;
case "444484444400":
textBox1.Text += "H";
break;
case "622222222600":
textBox1.Text += "I";
break;
case "422222234300":
textBox1.Text += "J";
break;
//case "444444444400":
// textBox1.Text += "K";
// break;
case "222222222700":
textBox1.Text += "L";
break;
case "468666444400":
textBox1.Text += "M";
break;
case "456666655400":
textBox1.Text += "N";
break;
case "744472222200":
textBox1.Text += "P";
break;
case "444444664500":
textBox1.Text += "Q";
break;
case "744475444400":
textBox1.Text += "R";
break;
case "642262224600":
textBox1.Text += "S";
break;
//case "822222222200":
// textBox1.Text += "T";
// break;
//case "444444444400":
// textBox1.Text += "U";
// break;
case "444444442200":
textBox1.Text += "V";
break;
case "444466686400":
textBox1.Text += "W";
break;
case "444422444400":
textBox1.Text += "X";
break;
case "444422222200":
textBox1.Text += "Y";
break;
case "722222222700":
textBox1.Text += "Z";
break;
default:
MessageBox.Show("验证码有异常,请重新获取");
break;
}
}
}
}
}
}
}
{
StringBuilder res = new StringBuilder();
StringBuilder Sres = new StringBuilder();
for (int i = 0; i < dis.Length; i++)
{
res.Append(dis[i].ToString());
} for (int i = 0; i < Sdis.Length; i++)
{
Sres.Append(Sdis[i].ToString());
} if(res.ToString()=="822222222200"&&Sres.ToString()=="1111010111")
{
textBox1.Text += "T";
}
else
{
if (res.ToString() == "444444444400" && Sres.ToString() == "1010244442")
{
textBox1.Text += "K";
}
else
{
if (res.ToString() == "444444444400" && Sres.ToString() == "89211298")
{
textBox1.Text += "U";
}
else
{
switch (res.ToString())
{
case "234222222600":
textBox1.Text += "1";
break;
case "444222222800":
textBox1.Text += "2";
break;
case "542232224500":
textBox1.Text += "3";
break;
case "234444822200":
textBox1.Text += "4";
break;
case "722552244400":
textBox1.Text += "5";
break;
case "443255444400":
textBox1.Text += "6";
break;
case "822222222200":
textBox1.Text += "7";
break;
case "444444444400":
textBox1.Text += "8";
break;
case "444455234400":
textBox1.Text += "9";
break;
case "244444844400":
textBox1.Text += "A";
break;
case "644464444600":
textBox1.Text += "B";
break;
case "543222234500":
textBox1.Text += "C";
break;
case "644444444600":
textBox1.Text += "D";
break;
case "722262222700":
textBox1.Text += "E";
break;
case "822262222200":
textBox1.Text += "F";
break;
case "542225444500":
textBox1.Text += "G";
break;
case "444484444400":
textBox1.Text += "H";
break;
case "622222222600":
textBox1.Text += "I";
break;
case "422222234300":
textBox1.Text += "J";
break;
//case "444444444400":
// textBox1.Text += "K";
// break;
case "222222222700":
textBox1.Text += "L";
break;
case "468666444400":
textBox1.Text += "M";
break;
case "456666655400":
textBox1.Text += "N";
break;
case "744472222200":
textBox1.Text += "P";
break;
case "444444664500":
textBox1.Text += "Q";
break;
case "744475444400":
textBox1.Text += "R";
break;
case "642262224600":
textBox1.Text += "S";
break;
//case "822222222200":
// textBox1.Text += "T";
// break;
//case "444444444400":
// textBox1.Text += "U";
// break;
case "444444442200":
textBox1.Text += "V";
break;
case "444466686400":
textBox1.Text += "W";
break;
case "444422444400":
textBox1.Text += "X";
break;
case "444422222200":
textBox1.Text += "Y";
break;
case "722222222700":
textBox1.Text += "Z";
break;
default:
MessageBox.Show("验证码有异常,请重新获取");
break;
}
}
}
}
}
}
}