update Shape
This commit is contained in:
		
							parent
							
								
									dee2010e7c
								
							
						
					
					
						commit
						486ca4f848
					
				|  | @ -1,12 +1,12 @@ | |||
| #include "..\eactions.h" | ||||
| 
 | ||||
| e2d::ActionSequence::ActionSequence() : | ||||
| 	m_nActionIndex(0) | ||||
| e2d::ActionSequence::ActionSequence() | ||||
| 	: m_nActionIndex(0) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::ActionSequence::ActionSequence(const std::initializer_list<Action*>& vActions) : | ||||
| 	m_nActionIndex(0) | ||||
| e2d::ActionSequence::ActionSequence(const std::initializer_list<Action*>& vActions) | ||||
| 	: m_nActionIndex(0) | ||||
| { | ||||
| 	this->add(vActions); | ||||
| } | ||||
|  |  | |||
|  | @ -13,6 +13,15 @@ e2d::Animation::Animation(double interval) | |||
| } | ||||
| 
 | ||||
| e2d::Animation::Animation(const std::initializer_list<Image*>& vImages) | ||||
| 	: m_nFrameIndex(0) | ||||
| 	, m_fInterval(1) | ||||
| { | ||||
| 	this->add(vImages); | ||||
| } | ||||
| 
 | ||||
| e2d::Animation::Animation(double interval, const std::initializer_list<Image*>& vImages) | ||||
| 	: m_nFrameIndex(0) | ||||
| 	, m_fInterval(interval) | ||||
| { | ||||
| 	this->add(vImages); | ||||
| } | ||||
|  |  | |||
|  | @ -53,6 +53,14 @@ void e2d::Scene::add(Node * child, int order /* = 0 */) | |||
| 	m_pRoot->addChild(child, order); | ||||
| } | ||||
| 
 | ||||
| void e2d::Scene::add(const std::initializer_list<Node*>& vNodes, int order) | ||||
| { | ||||
| 	for (const auto &node : vNodes) | ||||
| 	{ | ||||
| 		this->add(node, order); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| bool e2d::Scene::remove(Node * child) | ||||
| { | ||||
| 	return m_pRoot->removeChild(child); | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
| #include "..\etools.h" | ||||
| 
 | ||||
| // 形状集合
 | ||||
| static std::vector<e2d::Shape*> s_vShapes; | ||||
| static std::vector<e2d::ShapeBase*> s_vShapes; | ||||
| // 监听器容器
 | ||||
| static std::vector<e2d::CollisionListener*> s_vListeners; | ||||
| // 碰撞触发状态
 | ||||
|  | @ -40,7 +40,7 @@ void e2d::CollisionManager::__update() | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::__updateShape(e2d::Shape * pActiveShape) | ||||
| void e2d::CollisionManager::__updateShape(e2d::ShapeBase * pActiveShape) | ||||
| { | ||||
| 	// 判断碰撞触发是否打开
 | ||||
| 	if (!s_bCollisionEnable) | ||||
|  | @ -206,17 +206,25 @@ std::vector<e2d::CollisionListener*> e2d::CollisionManager::getAll() | |||
| 	return s_vListeners; | ||||
| } | ||||
| 
 | ||||
| e2d::Node * e2d::CollisionManager::getNode1() | ||||
| { | ||||
| 	return s_pActiveNode; | ||||
| } | ||||
| 
 | ||||
| e2d::Node * e2d::CollisionManager::getNode2() | ||||
| e2d::Node* e2d::CollisionManager::isCausedBy(Node * pNode) | ||||
| { | ||||
| 	if (s_pActiveNode == pNode) | ||||
| 		return s_pPassiveNode; | ||||
| 	if (s_pPassiveNode == pNode) | ||||
| 		return s_pActiveNode; | ||||
| 	return nullptr; | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::__addShape(Shape * pShape) | ||||
| e2d::Node* e2d::CollisionManager::isCausedBy(String name) | ||||
| { | ||||
| 	if (s_pActiveNode->getName() == name) | ||||
| 		return s_pActiveNode; | ||||
| 	if (s_pPassiveNode->getName() == name) | ||||
| 		return s_pPassiveNode; | ||||
| 	return nullptr; | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::__addShape(ShapeBase * pShape) | ||||
| { | ||||
| 	if (pShape) | ||||
| 	{ | ||||
|  | @ -230,7 +238,7 @@ void e2d::CollisionManager::__addShape(Shape * pShape) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::CollisionManager::__removeShape(Shape * pShape) | ||||
| void e2d::CollisionManager::__removeShape(ShapeBase * pShape) | ||||
| { | ||||
| 	if (pShape) | ||||
| 	{ | ||||
|  |  | |||
|  | @ -378,7 +378,7 @@ double e2d::Node::getOpacity() const | |||
| 	return m_fRealOpacity; | ||||
| } | ||||
| 
 | ||||
| e2d::Shape * e2d::Node::getShape() const | ||||
| e2d::ShapeBase * e2d::Node::getShape() const | ||||
| { | ||||
| 	return m_pShape; | ||||
| } | ||||
|  | @ -547,25 +547,25 @@ void e2d::Node::setSize(Size size) | |||
| 	this->setSize(size.width, size.height); | ||||
| } | ||||
| 
 | ||||
| void e2d::Node::setShape(Shape::TYPE type) | ||||
| void e2d::Node::setShape(Shape type) | ||||
| { | ||||
| 	switch (type) | ||||
| 	{ | ||||
| 	case Shape::TYPE::RECTANGLE: | ||||
| 	case Shape::RECTANGLE: | ||||
| 	{ | ||||
| 		auto rect = new ShapeRectangle(this); | ||||
| 		this->setShape(rect); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	case Shape::TYPE::CIRCLE: | ||||
| 	case Shape::CIRCLE: | ||||
| 	{ | ||||
| 		auto rect = new ShapeCircle(this); | ||||
| 		this->setShape(rect); | ||||
| 		break; | ||||
| 	} | ||||
| 
 | ||||
| 	case Shape::TYPE::ELLIPSE: | ||||
| 	case Shape::ELLIPSE: | ||||
| 	{ | ||||
| 		auto rect = new ShapeEllipse(this); | ||||
| 		this->setShape(rect); | ||||
|  | @ -577,7 +577,7 @@ void e2d::Node::setShape(Shape::TYPE type) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::Node::setShape(Shape * pShape) | ||||
| void e2d::Node::setShape(ShapeBase * pShape) | ||||
| { | ||||
| 	// 删除旧的形状
 | ||||
| 	CollisionManager::__removeShape(m_pShape); | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| #include "..\emanagers.h" | ||||
| #include "..\enodes.h" | ||||
| 
 | ||||
| e2d::Shape::Shape() | ||||
| e2d::ShapeBase::ShapeBase() | ||||
| 	: m_bIsVisiable(true) | ||||
| 	, m_nColor(Color::RED) | ||||
| 	, m_fOpacity(1) | ||||
|  | @ -13,42 +13,42 @@ e2d::Shape::Shape() | |||
| { | ||||
| } | ||||
| 
 | ||||
| e2d::Shape::~Shape() | ||||
| e2d::ShapeBase::~ShapeBase() | ||||
| { | ||||
| 	SafeReleaseInterface(&m_pTransformedShape); | ||||
| } | ||||
| 
 | ||||
| e2d::Node * e2d::Shape::getParentNode() const | ||||
| e2d::Node * e2d::ShapeBase::getParentNode() const | ||||
| { | ||||
| 	return m_pParentNode; | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::setEnable(bool bEnable) | ||||
| void e2d::ShapeBase::setEnable(bool bEnable) | ||||
| { | ||||
| 	m_bEnable = bEnable; | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::setVisiable(bool bVisiable) | ||||
| void e2d::ShapeBase::setVisiable(bool bVisiable) | ||||
| { | ||||
| 	m_bIsVisiable = bVisiable; | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::setColor(UINT32 color) | ||||
| void e2d::ShapeBase::setColor(UINT32 color) | ||||
| { | ||||
| 	m_nColor = color; | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::setOpacity(double opacity) | ||||
| void e2d::ShapeBase::setOpacity(double opacity) | ||||
| { | ||||
| 	m_fOpacity = min(max(static_cast<float>(opacity), 0), 1); | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::setAutoResize(bool bEnable) | ||||
| void e2d::ShapeBase::setAutoResize(bool bEnable) | ||||
| { | ||||
| 	m_bAutoResize = bEnable; | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::_render() | ||||
| void e2d::ShapeBase::_render() | ||||
| { | ||||
| 	if (m_pTransformedShape && m_bEnable) | ||||
| 	{ | ||||
|  | @ -65,7 +65,7 @@ void e2d::Shape::_render() | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| e2d::Relation e2d::Shape::getRelationWith(Shape * pShape) const | ||||
| e2d::Relation e2d::ShapeBase::getRelationWith(ShapeBase * pShape) const | ||||
| { | ||||
| 	if (m_pTransformedShape && pShape->m_pTransformedShape) | ||||
| 	{ | ||||
|  | @ -85,7 +85,7 @@ e2d::Relation e2d::Shape::getRelationWith(Shape * pShape) const | |||
| 	return Relation::UNKNOWN; | ||||
| } | ||||
| 
 | ||||
| void e2d::Shape::_transform() | ||||
| void e2d::ShapeBase::_transform() | ||||
| { | ||||
| 	if (m_pParentNode && m_bEnable) | ||||
| 	{ | ||||
|  |  | |||
|  | @ -517,7 +517,13 @@ public: | |||
| 
 | ||||
| 	// ´´½¨Ö¡¶¯»
 | ||||
| 	Animation( | ||||
| 		const std::initializer_list<Image*>& vImages | ||||
| 		const std::initializer_list<Image*>& vImages	/* 关键帧数组 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 创建特定帧间隔的帧动画
 | ||||
| 	Animation( | ||||
| 		double interval,	/* 帧间隔(秒) */ | ||||
| 		const std::initializer_list<Image*>& vImages	/* 关键帧数组 */ | ||||
| 	); | ||||
| 
 | ||||
| 	virtual ~Animation(); | ||||
|  | @ -763,12 +769,7 @@ namespace e2d | |||
| 
 | ||||
| 	inline e2d::ActionSequence * e2d::action::Sequence(const std::initializer_list<Action*>& vActions) | ||||
| 	{ | ||||
| 		auto action = new (std::nothrow) ActionSequence(); | ||||
| 		if (action) | ||||
| 		{ | ||||
| 			action->add(vActions); | ||||
| 		} | ||||
| 		return action; | ||||
| 		return new (std::nothrow) ActionSequence(vActions); | ||||
| 	} | ||||
| 
 | ||||
| 	inline e2d::ActionDelay * e2d::action::Delay(double duration) | ||||
|  | @ -783,12 +784,7 @@ namespace e2d | |||
| 
 | ||||
| 	inline e2d::Animation * e2d::action::Animate(double interval, const std::initializer_list<Image*>& vFrames) | ||||
| 	{ | ||||
| 		auto animation = new (std::nothrow) Animation(interval); | ||||
| 		if (animation) | ||||
| 		{ | ||||
| 			animation->add(vFrames); | ||||
| 		} | ||||
| 		return animation; | ||||
| 		return new (std::nothrow) Animation(interval, vFrames); | ||||
| 	} | ||||
| 
 | ||||
| 	inline e2d::ActionFunc * e2d::action::Func(Function func) | ||||
|  |  | |||
|  | @ -372,6 +372,15 @@ enum class Relation : int | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 形状类别
 | ||||
| enum class Shape : int | ||||
| { | ||||
| 	RECTANGLE,	/* 矩形 */ | ||||
| 	CIRCLE,		/* 圆形 */ | ||||
| 	ELLIPSE		/* 椭圆形 */ | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 文本样式
 | ||||
| struct Font | ||||
| { | ||||
|  | @ -545,8 +554,14 @@ public: | |||
| 
 | ||||
| 	// 添加节点到场景
 | ||||
| 	void add( | ||||
| 		Node * child, | ||||
| 		int zOrder = 0 | ||||
| 		Node * child,	/* 要添加的节点 */ | ||||
| 		int zOrder = 0	/* 渲染顺序 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 添加节点到场景
 | ||||
| 	virtual void add( | ||||
| 		const std::initializer_list<Node*>& vNodes,	/* 节点数组 */ | ||||
| 		int order = 0								/* 渲染顺序 */ | ||||
| 	); | ||||
| 
 | ||||
| 	// 删除子节点
 | ||||
|  | @ -578,86 +593,6 @@ protected: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| class CollisionManager; | ||||
| 
 | ||||
| // 形状
 | ||||
| class Shape : | ||||
| 	public Object | ||||
| { | ||||
| 	friend CollisionManager; | ||||
| 	friend Node; | ||||
| 
 | ||||
| public: | ||||
| 	// 形状类别
 | ||||
| 	enum class TYPE : int | ||||
| 	{ | ||||
| 		RECTANGLE,	/* 矩形 */ | ||||
| 		CIRCLE,		/* 圆形 */ | ||||
| 		ELLIPSE		/* 椭圆形 */ | ||||
| 	}; | ||||
| 
 | ||||
| public: | ||||
| 	Shape(); | ||||
| 
 | ||||
| 	virtual ~Shape(); | ||||
| 
 | ||||
| 	// 判断两形状的交集关系
 | ||||
| 	virtual Relation getRelationWith( | ||||
| 		Shape * pShape | ||||
| 	) const; | ||||
| 
 | ||||
| 	// 获取父节点
 | ||||
| 	Node * getParentNode() const; | ||||
| 
 | ||||
| 	// 启用或关闭该形状
 | ||||
| 	virtual void setEnable( | ||||
| 		bool bEnable | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置形状的可见性
 | ||||
| 	void setVisiable( | ||||
| 		bool bVisiable | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置绘制颜色
 | ||||
| 	void setColor( | ||||
| 		UINT32 color | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置绘制透明度
 | ||||
| 	void setOpacity( | ||||
| 		double opacity | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置大小跟随
 | ||||
| 	void setAutoResize( | ||||
| 		bool bEnable | ||||
| 	); | ||||
| 
 | ||||
| 	// 获取 ID2D1Geometry 对象
 | ||||
| 	virtual ID2D1Geometry * getD2dGeometry() const = 0; | ||||
| 
 | ||||
| protected: | ||||
| 	// 转换形状
 | ||||
| 	virtual void _transform(); | ||||
| 
 | ||||
| 	// 重设大小
 | ||||
| 	virtual void _resize() = 0; | ||||
| 
 | ||||
| 	// 渲染形状
 | ||||
| 	virtual void _render(); | ||||
| 
 | ||||
| protected: | ||||
| 	bool	m_bEnable; | ||||
| 	bool	m_bIsVisiable; | ||||
| 	bool	m_bAutoResize; | ||||
| 	UINT32	m_nColor; | ||||
| 	float	m_fOpacity; | ||||
| 	Node *	m_pParentNode; | ||||
| 	ID2D1TransformedGeometry * m_pTransformedShape; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // String 类模板函数定义
 | ||||
| template<typename T> | ||||
| inline e2d::String e2d::String::toString(T value) | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ class Node; | |||
| class Timer; | ||||
| class Action; | ||||
| class Music; | ||||
| class ShapeBase; | ||||
| class Transition; | ||||
| class InputListener; | ||||
| class CollisionListener; | ||||
|  | @ -354,7 +355,7 @@ private: | |||
| class CollisionManager | ||||
| { | ||||
| 	friend Node; | ||||
| 	friend Shape; | ||||
| 	friend ShapeBase; | ||||
| 	friend CollisionListener; | ||||
| 
 | ||||
| public: | ||||
|  | @ -401,11 +402,15 @@ public: | |||
| 	// 获取全部监听器
 | ||||
| 	static std::vector<CollisionListener*> getAll(); | ||||
| 
 | ||||
| 	// 获取发生碰撞的节点 1
 | ||||
| 	static Node* getNode1(); | ||||
| 	// 判断碰撞是否由该节点引发(如果是,返回与其相撞的节点指针,否则返回空)
 | ||||
| 	static Node* isCausedBy( | ||||
| 		Node * pNode | ||||
| 	); | ||||
| 
 | ||||
| 	// 获取发生碰撞的节点 2
 | ||||
| 	static Node* getNode2(); | ||||
| 	// 判断发生碰撞的节点名称是否相同(若相同返回其指针,否则返回空)
 | ||||
| 	static Node* isCausedBy( | ||||
| 		String name | ||||
| 	); | ||||
| 
 | ||||
| private: | ||||
| 	// 添加碰撞监听
 | ||||
|  | @ -418,17 +423,17 @@ private: | |||
| 
 | ||||
| 	// 更新形状
 | ||||
| 	static void __updateShape( | ||||
| 		Shape * pActiveShape | ||||
| 		ShapeBase * pActiveShape | ||||
| 	); | ||||
| 
 | ||||
| 	// 添加形状
 | ||||
| 	static void __addShape( | ||||
| 		Shape * pShape | ||||
| 		ShapeBase * pShape | ||||
| 	); | ||||
| 
 | ||||
| 	// 删除已绑定的形状
 | ||||
| 	static void __removeShape( | ||||
| 		Shape * pShape | ||||
| 		ShapeBase * pShape | ||||
| 	); | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,13 +7,14 @@ namespace e2d | |||
| 
 | ||||
| class Action; | ||||
| class Transition; | ||||
| class ShapeBase; | ||||
| class CollisionManager; | ||||
| 
 | ||||
| class Node : | ||||
| 	public Object | ||||
| { | ||||
| 	friend Scene; | ||||
| 	friend Shape; | ||||
| 	friend ShapeBase; | ||||
| 	friend Transition; | ||||
| 	friend CollisionManager; | ||||
| 
 | ||||
|  | @ -116,7 +117,7 @@ public: | |||
| 	virtual double getOpacity() const; | ||||
| 
 | ||||
| 	// 获取节点形状
 | ||||
| 	virtual Shape * getShape() const; | ||||
| 	virtual ShapeBase * getShape() const; | ||||
| 
 | ||||
| 	// 获取父节点
 | ||||
| 	virtual Node * getParent() const; | ||||
|  | @ -312,12 +313,12 @@ public: | |||
| 
 | ||||
| 	// 设置节点形状
 | ||||
| 	virtual void setShape( | ||||
| 		Shape::TYPE type | ||||
| 		Shape type | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置节点形状
 | ||||
| 	virtual void setShape( | ||||
| 		Shape * pShape | ||||
| 		ShapeBase * pShape | ||||
| 	); | ||||
| 
 | ||||
| 	// 添加可碰撞节点的名称
 | ||||
|  | @ -455,7 +456,7 @@ protected: | |||
| 	bool		m_bDisplayedInScene; | ||||
| 	bool		m_bSortChildrenNeeded; | ||||
| 	bool		m_bTransformNeeded; | ||||
| 	Shape *		m_pShape; | ||||
| 	ShapeBase *	m_pShape; | ||||
| 	Scene *		m_pParentScene; | ||||
| 	Node *		m_pParent; | ||||
| 	D2D1::Matrix3x2F		m_MatriInitial; | ||||
|  |  | |||
|  | @ -6,9 +6,80 @@ namespace e2d | |||
| { | ||||
| 
 | ||||
| 
 | ||||
| class CollisionManager; | ||||
| 
 | ||||
| // 形状
 | ||||
| class ShapeBase : | ||||
| 	public Object | ||||
| { | ||||
| 	friend CollisionManager; | ||||
| 	friend Node; | ||||
| 
 | ||||
| public: | ||||
| 	ShapeBase(); | ||||
| 
 | ||||
| 	virtual ~ShapeBase(); | ||||
| 
 | ||||
| 	// 判断两形状的交集关系
 | ||||
| 	virtual Relation getRelationWith( | ||||
| 		ShapeBase * pShape | ||||
| 	) const; | ||||
| 
 | ||||
| 	// 获取父节点
 | ||||
| 	Node * getParentNode() const; | ||||
| 
 | ||||
| 	// 启用或关闭该形状
 | ||||
| 	virtual void setEnable( | ||||
| 		bool bEnable | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置形状的可见性
 | ||||
| 	void setVisiable( | ||||
| 		bool bVisiable | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置绘制颜色
 | ||||
| 	void setColor( | ||||
| 		UINT32 color | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置绘制透明度
 | ||||
| 	void setOpacity( | ||||
| 		double opacity | ||||
| 	); | ||||
| 
 | ||||
| 	// 设置大小跟随
 | ||||
| 	void setAutoResize( | ||||
| 		bool bEnable | ||||
| 	); | ||||
| 
 | ||||
| 	// 获取 ID2D1Geometry 对象
 | ||||
| 	virtual ID2D1Geometry * getD2dGeometry() const = 0; | ||||
| 
 | ||||
| protected: | ||||
| 	// 转换形状
 | ||||
| 	virtual void _transform(); | ||||
| 
 | ||||
| 	// 重设大小
 | ||||
| 	virtual void _resize() = 0; | ||||
| 
 | ||||
| 	// 渲染形状
 | ||||
| 	virtual void _render(); | ||||
| 
 | ||||
| protected: | ||||
| 	bool	m_bEnable; | ||||
| 	bool	m_bIsVisiable; | ||||
| 	bool	m_bAutoResize; | ||||
| 	UINT32	m_nColor; | ||||
| 	float	m_fOpacity; | ||||
| 	Node *	m_pParentNode; | ||||
| 	ID2D1TransformedGeometry * m_pTransformedShape; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 矩形
 | ||||
| class ShapeRectangle : | ||||
| 	public Shape | ||||
| 	public ShapeBase | ||||
| { | ||||
| public: | ||||
| 	// 创建一个默认矩形
 | ||||
|  | @ -51,7 +122,7 @@ protected: | |||
| 
 | ||||
| // 圆形
 | ||||
| class ShapeCircle : | ||||
| 	public Shape | ||||
| 	public ShapeBase | ||||
| { | ||||
| public: | ||||
| 	// 创建一个默认圆形
 | ||||
|  | @ -90,7 +161,7 @@ protected: | |||
| 
 | ||||
| // 椭圆形
 | ||||
| class ShapeEllipse : | ||||
| 	public Shape | ||||
| 	public ShapeBase | ||||
| { | ||||
| public: | ||||
| 	// 创建一个默认椭圆
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ namespace e2d | |||
| class TimerManager; | ||||
| class MusicManager; | ||||
| class InputManager; | ||||
| class CollisionManager; | ||||
| 
 | ||||
| // 随机数产生器
 | ||||
| class Random | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue