eqlim=200
eqs=!trim $eqs
eqs=!nonempty lines $eqs
!if $eqs=$empty
 error=empty_data
 !exit
!endif
eqcnt=!linecnt $eqs

diagnostics=good
Eq=
eqlist=
!for i=1 to $eqcnt
 eq$i=!line $i of $eqs
 e_=!trim $(eq$i)
 e_=!char 1 to $eqlim of $e_
 e_=!lower $e_
 e_=!rawmath $e_
 e_=!translate , to . in $e_
 e_=!translate = to , in $e_
 n_=!itemcnt $e_
 !if $n_!=2
  error=not_equation
  !exit
 !endif
 !distribute items $e_ into f_,g_
 !default g_=0
 eq$i=$f_-($g_)
 Eq=$Eq+($(eq$i))
 eqlist=!append item $(eq$i) to $eqlist
!next i

!if . isin $Eq or / isin $Eq or ^ isin $Eq
 error=not_integer
 !exit
!endif
v_=!varlist $Eq
v_=!listunion $vars and $v_
n_=!itemcnt $v_
!if $n_>$cols
  error=illegal_var
  !exit
!endif

Eqlist=$eqlist
!for v in $vars
 Eq=!mathsubst $v=t in $Eq
 Eqlist=!mathsubst $v=t in $Eqlist
!next v
A=!translate $\
$ to ; in $sys
B=!translate $\
$ to ; in $colb
pari_header=eqlist=[$eqlist];varlist=[$vars];\
	eqcoeff=matrix($eqcnt,$cols,m,n,polcoeff(eqlist[m],1,varlist[n]));\
	Eqlist=[$Eqlist]; col=subst(Eqlist,t,0);\
	eqcoeff=concat(eqcoeff,col~);\
	eqrank=matrank(eqcoeff);\
	orig=concat(Mat([$A]),Mat(-[$B]));

r=!random -10,10
lintest=!exec pari print(poldegree($Eq))\
	print(subst($Eq-Pol($Eq,t),t,$r))\
	print(eqrank)\
	print(matrank(concat(orig~,eqcoeff~)))\
	for(n=1,$eqcnt,print(matrank(concat(orig~,eqcoeff[n,]~)),","))\
	for(n=1,$eqcnt,t=2;for(m=1,$rows,t=min(t,matrank(concat(Mat(eqcoeff[n,])~,Mat(orig[m,])~))));if(t>1,print(n,","));)
	
!distribute lines $lintest into deg,rest,eqrank,totrank,ranklist,notprecise
notprecise=!trim $notprecise
notprecise=!char 1 to -2 of $notprecise
rest=!trim $rest
!if $rest=$empty or rank isin $eqrank or $eqrank=$empty or $totrank=$empty
 error=bad_data
 !exit
!endif
!ifval $rest!=0 or $deg>1
 error=non_linear
 !exit
!endif
!ifval $eqrank<$rank
 diagnostics=bigdim
 !exit
!endif
!ifval $totrank>$rank
 diagnostics=bad
 !for i=1 to $eqcnt
  l=!item $i of $ranklist
  !if $l>$rank
   diagnostics=bad $i
   !exit
  !endif
 !next i
 !exit
!endif
