GreenFragment (int startNode, int maxWalkSize) { if (myRedNodes.value(startNode)) return new GreenFragment(null, null, Collections.emptySet()); Integer upRedNode = getNearRedNode(startNode, maxWalkSize, true); Integer downRedNode = getNearRedNode(startNode, maxWalkSize, false); Set<Integer> upPart = upRedNode != null ? getMiddleNodes(upRedNode, startNode, false) : getWalkNodes(startNode, true, createStopFunction(maxWalkSize)); Set<Integer> downPart = downRedNode != null ? getMiddleNodes(startNode, downRedNode, false) : getWalkNodes(startNode, false, createStopFunction(maxWalkSize)); Set<Integer> middleNodes = ContainerUtil.map2SetNotNull(ContainerUtil.union(upPart, downPart), i-> i.equals(upRedNode) || i.equals(downRedNode) ? null : i); return new GreenFragment(upRedNode, downRedNode, middleNodes); }