docs: private List<int[]> getPairPositionList(byte[] fingerprint) {
  
          int numFrames = FingerprintManager.getNumFrames(fingerprint);
  
          // table for paired frames
          byte[] pairedFrameTable = new byte[numFrames / anchorPointsIntervalLength + 1]; // each second has numAnchorPointsPerSecond pairs only
          // end table for paired frames
  
          List<int[]> pairList = new LinkedList<>();
          List<int[]> sortedCoordinateList = getSortedCoordinateList(fingerprint);
  
          for (int[] anchorPoint : sortedCoordinateList) {
              int anchorX = anchorPoint[0];
              int anchorY = anchorPoint[1];
              int numPairs = 0;
  
              for (int[] aSortedCoordinateList : sortedCoordinateList) {
  
                  if (numPairs >= maxPairs) {
                      break;
                  }
  
                  if (isReferencePairing && pairedFrameTable[anchorX
                                  / anchorPointsIntervalLength] >= numAnchorPointsPerInterval) {
                      break;
                  }
  
                  int targetX = aSortedCoordinateList[0];
                  int targetY = aSortedCoordinateList[1];
  
                  if (anchorX == targetX && anchorY == targetY) {
                      continue;
                  }
  
                  // pair up the points
                  int x1, y1, x2, y2; // x2 always >= x1
                  if (targetX >= anchorX) {
                      x2 = targetX;
                      y2 = targetY;
                      x1 = anchorX;
                      y1 = anchorY;
                  } else {
                      x2 = anchorX;
                      y2 = anchorY;
                      x1 = targetX;
                      y1 = targetY;
                  }
  
                  // check target zone
                  if ((x2 - x1) > maxTargetZoneDistance) {
                      continue;
                  }
                  // end check target zone
  
                  // check filter bank zone
                  if (!(y1 / bandwidthPerBank == y2 / bandwidthPerBank)) {
                      continue; // same filter bank should have equal value
                  }
                  // end check filter bank zone
  
                  int pairHashcode = (x2 - x1) * numFrequencyUnits * numFrequencyUnits + y2 * numFrequencyUnits + y1;
  
                  // stop list applied on sample pairing only
                  if (!isReferencePairing && stopPairTable.containsKey(pairHashcode)) {
                      numPairs++; // no reservation
                      continue; // escape this point only
                  }
                  // end stop list applied on sample pairing only
  
                  // pass all rules
                  pairList.add(new int[] {pairHashcode, anchorX});
                  pairedFrameTable[anchorX / anchorPointsIntervalLength]++;
                  numPairs++;
                  // end pair up the points
              }
          }
  
          return pairList;
      }