public static <T extends DC> Set<Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>>> getAllPhis(Set<Pair<T,PT<Integer>>> baseSetA, 
                                                                                                 Set<Pair<T,PT<Integer>>> baseSetB)
  { Set<Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>>> allPhis=null;
    if(baseSetA==null || baseSetB==null)
    { return allPhis;  
    }
    else//baseSetA!=null && baseSetB!=null
    { Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>> allPairs=getAllPairs(baseSetA,baseSetB);
      if(allPairs.size()==1)
      { return new Set(allPairs,null);
      }
      else//allPairs.size()!=1
      { for(Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>> p=allPairs;p!=null;p=p.getNext())
        { Set<Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>>> onePairSets=despatch(p.getFst(),getAllPhis(baseSetA.del(p.getFst().fst()),baseSetB.del(p.getFst().snd())));
          if(allPhis==null)
          { allPhis=new Set(onePairSets.getFst(),null);
            for(Set<Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>>> t=onePairSets;t!=null;t=t.getNext())
            { allPhis=allPhis.ins(t.getFst());}
          }
          else
          { for(Set<Set<Pair<Pair<T,PT<Integer>>,Pair<T,PT<Integer>>>>> t=onePairSets;t!=null;t=t.getNext())
            { allPhis=allPhis.ins(t.getFst());}
          }    
        }
        //System.out.println("\nallPhis="+allPhis);
        return allPhis;
      } 
    }  
  }