#include <iostream>
#include <istream>
#include <ostream>
#include <algorithm>
#include <cmath>

using namespace std;

template <class T>
class Vector2D
{
public:
	T x, y;
	Vector2D ( void ): x(0), y(0) {}
	Vector2D ( T v ): x(v), y(v) {}
	Vector2D ( T ix, T iy ): x(ix), y(iy) {}
	Vector2D ( const Vector2D<T> &v ): x(v.x), y(v.y) {}
	T length ( void ) { return sqrt(x*x + y*y); }
	T lengthSq ( void ) { return x*x + y*y; }
	T dot ( Vector2D<T> v ) { return (x * v.x) + (y * v.y); }
	T cross ( Vector2D<T> v ) { return (x * v.y) - (y * v.x); }
	Vector2D operator+ ( const Vector2D<T> &v ) { Vector2D t(*this); t.x += v.x; t.y += v.y; return t; }
	Vector2D operator+=( const Vector2D<T> &v ) { x += v.x; y += v.y; return *this; }
	Vector2D operator- ( const Vector2D<T> &v ) { Vector2D t(*this); t.x -= v.x; t.y -= v.y; return t; }
	Vector2D operator-=( const Vector2D<T> &v ) { x -= v.x; y -= v.y; return *this; }
	Vector2D operator* ( const T &k ) { Vector2D t(*this); t.x *= k; t.y *= k; return t; }
	Vector2D operator*=( const T &k ) { x *= k; y *= k; return *this; }

	friend std::istream& operator>>( std::istream &is, Vector2D<T> &v ) { if (is >> v.x) { is >> v.y; } return is; }
	friend std::ostream& operator<<( std::ostream &os, Vector2D<T> &v ) { os << v.x << " " << v.y; return os; }
};

const double EPS = 1e-5;

int main ( void )
{
	Vector2D<double> v1, v2, v3, v4;

	while (cin >> v1 >> v2 >> v3 >> v4) {
		Vector2D<double> t, p;
		double a;
		a = (t = v2 - v1).dot(p = v4 - v3);

		if (abs(a) <= EPS) {
			cout << "YES" << endl;
		}
		else {
			cout << "NO" << endl;
		}
	}

	return 0;
}