Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.04.2012, 17:31
sephira вне форума Посмотреть профиль Отправить личное сообщение для sephira Найти все сообщения от sephira
  № 21  
Ответить с цитированием
sephira

Регистрация: Apr 2012
Сообщений: 26
Цитата:
Сообщение от alatar Посмотреть сообщение
Ни одному из этих двух методов "растровая система координат" не нужна.
Впереди методы сложнее)))

Добавлено через 16 минут
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.NetStatusEvent;
	import flash.events.SecurityErrorEvent;
	import flash.geom.Rectangle;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import flash.utils.ByteArray;
	import flash.utils.Timer;
 
	public class TestVideo2 extends Sprite 
	{
		private var videoURL:String = "Deeper112.flv";
		private var connection:NetConnection;
		private var stream:NetStream;
		private var video:Video = new Video(480, 360);
		private var bitmap:Bitmap = new Bitmap();
		private var bd:BitmapData;
		public var myTimer:Timer = new Timer(50);
 
		public function TestVideo2():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
			connection = new NetConnection();
			connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			connection.connect(null);
		}
 
		private function netStatusHandler(event:NetStatusEvent):void {
			switch (event.info.code) {
				case "NetConnection.Connect.Success":
					connectStream();
					break;
				case "NetStream.Play.StreamNotFound":
					trace("Stream not found: " + videoURL);
					break;
			}
		}
 
		private function securityErrorHandler(event:SecurityErrorEvent):void {
			trace("securityErrorHandler: " + event);
		}
 
		private function connectStream():void {
			var stream:NetStream = new NetStream(connection);
			var client:Object = new Object();
			client.onMetaData = onMetaData;
			stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			stream.client = client;
			video.attachNetStream(stream);
			stream.play(videoURL);
			bd = new BitmapData(video.width, video.height, false);
			bitmap.bitmapData = bd;
			bitmap.x = video.width;
			addChild(video);
			addChild(bitmap);
		}
 
		private function onMetaData(info:Object):void {
			trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
			myTimer.addEventListener("timer", enterFrameHandler);
			myTimer.start();
		}
 
		private function enterFrameHandler(event:Event):void
		{
			bd.draw(video);
			var v:Vector.<uint> = new Vector.<uint>();
			var rct:Rectangle = new Rectangle(0,0,bd.width,bd.height);
			v = bd.getVector(rct);
			computeData(v,bd.width,bd.height);
			bd.setVector(rct,v);
		}
 
		public function computeData(v:Vector.<uint>,w:uint,h:uint):void
		{
			segmentation(v,w,h,4);
		}
 
		public function binarization(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var pixelValue:uint = getUint(v,w,i,j);
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					if (red > 127) var color:uint = 0xFFFFFF; else color = 0;
					setUint(v,i,j,w,color*256*256+color*256+color);
				}
			}
		}
 
		public function segmentation(v:Vector.<uint>,w:uint,h:uint,cnt:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var pixelValue:uint = getUint(v,w,i,j);
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					for(var k:uint=0;k<cnt;k++)
					{
						var nporog:uint = k/cnt*256;
						var vporog:uint = (k+1)/cnt*256;
						if (red>=nporog && red<vporog) 
							var color:uint = (nporog+vporog)/2;
					}
					setUint(v,i,j,w,color*256*256+color*256+color);
				}
			}
		}
 
		public function getUint (v:Vector.<uint>,width:uint,i:uint,j:uint):uint
		{
			var tmp:uint = i*width+j;
			return v[tmp];
		}
		public function setUint (v:Vector.<uint>,i:uint,j:uint,width:uint,value:uint):void
		{
			var tmp:uint = i*width+j;
			v[tmp] = value;
		}
 
	}
}
хм...почему не работает?

Добавлено через 30 минут
Собственно, проблемная строка
Код AS3:
var pixelValue:uint = getUint(v,w,i,j);
Что не так?


Последний раз редактировалось sephira; 30.04.2012 в 18:04.
Старый 30.04.2012, 18:48
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 22  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Эти два метода реализуются с помощью метода paletteMap без явных переборов.

Добавлено через 1 минуту
Цитата:
хм...почему не работает?
Для дебаггера есть соответствующая кнопка.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 30.04.2012, 19:27
sephira вне форума Посмотреть профиль Отправить личное сообщение для sephira Найти все сообщения от sephira
  № 23  
Ответить с цитированием
sephira

Регистрация: Apr 2012
Сообщений: 26
Цитата:
Сообщение от alatar Посмотреть сообщение
Эти два метода реализуются с помощью метода paletteMap без явных переборов.

Добавлено через 1 минуту

Для дебаггера есть соответствующая кнопка.
Дебаггер почему-то не пашет. Если есть мануал к нему, дайте ссылку, буду очень благодарен.

Вот еще методы.

Код AS3:
public function medianFilter(image:Array):void
		{
			for (var i:uint=0;i<image.length-1;i++)
			{
				for (var j:uint=0;j<image[i].length-1;j++)
				{
					var tmp:Array = new Array();
					for(var a:uint=0;a<2;a++)
					{
						for(var b:uint=0;b<2;b++)
						{
							tmp[a*2+b] = image[i+a][i+b];
						}
					}
					tmp.sort(Array.NUMERIC);
					image[i][j] = tmp[1];
					tmp = undefined;
				}
			}
		}
 
		public function uniformNoise(image:Array):void
		{
			for (var i:uint=0;i<image.length-1;i++)
			{
				for (var j:uint=0;j<image[i].length-1;j++)
				{
					image[i][j] = image[i][j]+(Math.random()-0.5)*10;
				}
			}
		}
 
		public function maxRGB(image:Array):void
		{
			for (var i:uint=0;i<image.length-1;i++)
			{
				for (var j:uint=0;j<image[i].length-1;j++)
				{
					var pixelValue:uint = image[i][j];
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					if(red>=green)
					{
						if(red>=blue)
						{
							image[i][j] = red*256*256;
						}
						else
						{
							image[i][j] = blue;
						}
					}
					else
					{
						if(green>=blue)
						{
							image[i][j] = green*256;
						}
						else
						{
							image[i][j] = blue;
						}
					}
				}
			}
		}
Добавлено через 2 минуты
Но это как бы все разминка перед распознаванием образов, движения, вычислением скорости и т.п.


Последний раз редактировалось sephira; 30.04.2012 в 19:51.
Старый 30.04.2012, 20:11
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 24  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Дебаггер почему-то не пашет. Если есть мануал к нему, киньте плиз.
На мануал к чему? Вы в чем код пишете?

Добавлено через 6 минут
sephira, еще раз. Забудьте вы о своем image[i][j]. Вы гоняете кучу циклов, что естественно будет тормозить (тем более в дебаг-плеере. в релизе будет быстрее). Вот пример, раз уж вы так любите решения в лоб:
Код AS3:
private function segmetize2(v:Vector.<uint>, cnt:uint):void
{
	var n:int = v.length;
 
	for (var i:int = 0; i < n; i++)
	{
		var red:uint = v[i] >> 16 & 0xFF;
 
		for(var k:uint=0; k < cnt; k++)
		{
			var nporog:uint = k / cnt * 256;
			var vporog:uint = (k + 1) / cnt * 256;
			if (red >= nporog && red < vporog) 
				var color:uint = (nporog + vporog)/2;
		}
 
		v[i] = color * 256 * 256 + color * 256 + color;
	}
}
Добавлено через 8 минут
Да и вот это:
Код AS3:
for(var k:uint=0; k < cnt; k++)
{
	var nporog:uint = k / cnt * 256;
	var vporog:uint = (k + 1) / cnt * 256;
	if (red >= nporog && red < vporog) 
		var color:uint = (nporog + vporog)/2;
}
Можно посчитать заранее, один раз, а не высчитывать для каждого пикселя.

Добавлено через 12 минут
Оффтоп. Вам когда курсач сдавать?
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 30.04.2012, 21:09
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 25  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
color * 256 * 256 + color * 256 + color
Свои 5 копеек добавлю. Как бы ну совсем нехорошая идея, особенно, принимая во внимание то, что в AS3 арифметика реализована только для чисел с плавающей запятой. Т.е. тут получится каст из целого в дробное, умножение, потом еще и сложение чисел с плавающей запятой, а потом каст обратно к целому. Это и расход памяти и медленно, но, самое главное чревато неточностью / неожиданными последствиями, если вдруг результат окажется больше чем максимальное значение канала.
__________________
Hell is the possibility of sanity

Старый 30.04.2012, 22:01
sephira вне форума Посмотреть профиль Отправить личное сообщение для sephira Найти все сообщения от sephira
  № 26  
Ответить с цитированием
sephira

Регистрация: Apr 2012
Сообщений: 26
Дебаггер Flash Builder'а
В течение мая.
wvxvw учту

Добавлено через 17 минут
Код:
Failed to connect; session timed out.
Ensure that:
  1. You compiled your Flash application with debugging on.
  2. You are running the debugger version of Flash Player.
Добавлено через 26 минут
Это из-за хрома. Разобрался.


Последний раз редактировалось sephira; 30.04.2012 в 22:05.
Старый 30.04.2012, 22:34
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 27  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
В течение мая.
Лучше сразу на осень перенести.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 01.05.2012, 00:03
sephira вне форума Посмотреть профиль Отправить личное сообщение для sephira Найти все сообщения от sephira
  № 28  
Ответить с цитированием
sephira

Регистрация: Apr 2012
Сообщений: 26
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.NetStatusEvent;
	import flash.events.SecurityErrorEvent;
	import flash.geom.Rectangle;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	import flash.utils.ByteArray;
	import flash.utils.Timer;
 
	public class TestVideo2 extends Sprite 
	{
		private var videoURL:String = "Deeper112.flv";
		private var connection:NetConnection;
		private var stream:NetStream;
		private var video:Video = new Video(480, 360);
		private var bitmap:Bitmap = new Bitmap();
		private var bd:BitmapData;
		public var myTimer:Timer = new Timer(100);
 
		public function TestVideo2():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		public function getUint (v:Vector.<uint>,width:uint,i:uint,j:uint):uint
		{
			var tmp:uint = i+j*width;
			return v[tmp];
		}
 
		public function setUint (v:Vector.<uint>,i:uint,j:uint,width:uint,value:uint):void
		{
			var tmp:uint = i+j*width;
			v[tmp] = value;
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
			connection = new NetConnection();
			connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			connection.connect(null);
		}
 
		private function netStatusHandler(event:NetStatusEvent):void {
			switch (event.info.code) {
				case "NetConnection.Connect.Success":
					connectStream();
					break;
				case "NetStream.Play.StreamNotFound":
					trace("Stream not found: " + videoURL);
					break;
			}
		}
 
		private function securityErrorHandler(event:SecurityErrorEvent):void {
			trace("securityErrorHandler: " + event);
		}
 
		private function connectStream():void {
			var stream:NetStream = new NetStream(connection);
			var client:Object = new Object();
			client.onMetaData = onMetaData;
			stream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
			stream.client = client;
			video.attachNetStream(stream);
			stream.play(videoURL);
			bd = new BitmapData(video.width, video.height, false);
			bitmap.bitmapData = bd;
			bitmap.x = video.width;
			addChild(video);
			addChild(bitmap);
		}
 
		private function onMetaData(info:Object):void {
			trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
			myTimer.addEventListener("timer", enterFrameHandler);
			myTimer.start();
		}
 
		private function enterFrameHandler(event:Event):void
		{
			bd.draw(video);
			var v:Vector.<uint> = new Vector.<uint>();
			var rct:Rectangle = new Rectangle(0,0,bd.width,bd.height);
			v = bd.getVector(rct);
			computeData(v,bd.width,bd.height);
			bd.setVector(rct,v);
		}
 
		public function computeData(v:Vector.<uint>,w:uint,h:uint):void
		{
			maxRGB(v,w,h);
		}
 
		public function binarization(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var pixelValue:uint = getUint(v,w,i,j);
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					if (red > 127) var color:uint = 0xFFFFFF; else color = 0;
					var tmp:uint = color * 256 * 256 + color * 256 + color;
					v[i] = tmp;
				}
			}
		}
 
		private function segmentation(v:Vector.<uint>,w:uint,h:uint,cnt:uint):void
		{
			var n:int = v.length;
			var levels:Array = new Array();
			for(var k:uint=0; k < cnt; k++)
			{
				levels[k] = k/cnt*256;
			}
 
			for (var i:int = 0; i < n; i++)
			{
				var red:uint = v[i] >> 16 & 0xFF;
				for(k = 0; k < cnt; k++)
				{
					if(red>=levels[k] && red<levels[k+1])
					{
						var color:uint = levels[k];
					}
				}
 
				var tmp:uint = color * 256 * 256 + color * 256 + color;
				v[i] = tmp;
			}
		}
 
		public function medianFilter(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var tmp:Array = new Array();
					for(var a:uint=0;a<3;a++)
					{
						for(var b:uint=0;b<3;b++)
						{
							tmp[a*3+b] = getUint(v,w,i+a,j+b);
						}
					}
					tmp.sort(Array.NUMERIC);
					setUint(v,i+1,j+1,w,tmp[5]);
					tmp = undefined;
				}
			}
		}
 
		public function uniformNoise(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var pixelValue:uint = getUint(v,w,i,j);
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					red = Math.min(255,red+(Math.random()-0.5)*10);
					green = Math.min(255,green+(Math.random()-0.5)*10);
					blue = Math.min(255,blue+(Math.random()-0.5)*10);
 
					var tmp:uint = red*256*256+green*256+blue;
					setUint(v,i,j,w,tmp);
				}
			}
		}
 
		public function maxRGB(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var pixelValue:uint = getUint(v,w,i,j);
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					if(red>=green)
					{
						if(red>=blue)
						{
							setUint(v,i,j,w,red*256*256);
						}
						else
						{
							setUint(v,i,j,w,blue);
						}
					}
					else
					{
						if(green>=blue)
						{
							setUint(v,i,j,w,green*256);
						}
						else
						{
							setUint(v,i,j,w,blue);
						}
					}
				}
			}
		}
 
		public function mediumRGB(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=0;i<w;i++)
			{
				for (var j:uint=0;j<h;j++)
				{
					var pixelValue:uint = getUint(v,w,i,j);
					var red:uint = pixelValue >> 16 & 0xFF;
					var green:uint = pixelValue >> 8 & 0xFF;
					var blue:uint = pixelValue & 0xFF;
 
					var color:uint = (red+green+blue)/3;
					var tmp:uint = color*256*256+color*256+color;
					setUint(v,i,j,w,tmp);
 
				}
			}
		}
 
	}
}
Вот то, что пока есть. Скорость и с getVector'ом и с getPixel'ем примерно равна.
При сегментации 128 уровней уже явные тормоза.

Цитата:
Лучше сразу на осень перенести.
Обоснуйте. Вы не знакомы с содержанием работы. Как Вы можете что-либо тогда утверждать? С чего такой скептицизм?


Последний раз редактировалось sephira; 01.05.2012 в 00:11.
Старый 01.05.2012, 01:49
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 29  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Возможно я и ошибаюсь, давно не делал курсовые. Просто вы рискуете, выбрав малознакомую платформу для довольно ограниченных сроков.
Оставьте пока попытки с видео, сосредоточьтеся на статических изображениях. Рассмотрите возможность использования AGAL или шейдеров Pixel Bender, если важна производительность (но там свои особенности). Поищите готовые решения, если не для применения, то хоть для примера. После реализации всех методов займитесь оптимизацией, это будет проще, чем пытаться сразу написать оптимально.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 01.05.2012, 02:27
sephira вне форума Посмотреть профиль Отправить личное сообщение для sephira Найти все сообщения от sephira
  № 30  
Ответить с цитированием
sephira

Регистрация: Apr 2012
Сообщений: 26
Код AS3:
public function contours(v:Vector.<uint>,w:uint,h:uint):void
		{
			for (var i:uint=1;i<w-1;i++)
			{
				for (var j:uint=1;j<h-1;j++)
				{
					var pixelValuepm1:uint = getUint(v,w,i+1,j-1); //св
					var pixelValuep1:uint = getUint(v,w,i+1,j); //в
					var pixelValuepp1:uint = getUint(v,w,i+1,j+1); //юв
 
					var pixelValue1m:uint = getUint(v,w,i,j-1); //с
					var pixelValue1:uint = getUint(v,w,i,j); //ц
					var pixelValue1p:uint = getUint(v,w,i,j+1); //ю
 
					var pixelValuemm1:uint = getUint(v,w,i-1,j-1); //сз
					var pixelValuem1:uint = getUint(v,w,i-1,j); //з
					var pixelValuemp1:uint = getUint(v,w,i-1,j+1); //юз
 
					var a:uint = pixelValuepm1 - pixelValuemm1;
					var b:uint = 2*pixelValuep1 - 2*pixelValuem1;
					var c:uint = pixelValuepp1 - pixelValuemp1;
 
					var dfdx:Number = (a+b+c)/6;
 
					var d:uint = -pixelValuemp1 + pixelValuemm1;
					var e:uint = -2*pixelValue1p + 2*pixelValue1m;
					var f:uint = -pixelValuepp1 + pixelValuepm1;
 
					var dfdy:Number = (d+e+f)/6;
 
					var ma:Number = Math.max(Math.abs(dfdx),Math.abs(dfdy));
					var tmp:uint = (ma<7.14E8) ? 0xFFFFFF : 0x000000;
 
					setUint(v,i,j,w,tmp);
 
				}
			}
		}
Да нет, потихоньку пишется. Flash из того, что как-то подходит, знакомо больше всего)

Добавлено через 2 минуты
Тем более всегда есть возможность пересесть на OpenCV. Но его также надо изучать.

Добавлено через 4 минуты
AGAL, Pixel Bender учту, спасибо)

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:35.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:35.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.