     internal var calendar: Calendar = .current
     internal var dates: [Date]! = []
     internal var components: DateComponents! {
+        // add 24 to hour and 60 to minute, because datasource now has buffer at top and bottom.
         didSet {
             if let hour = components.hour {
-                hourTableView.selectRow(at: IndexPath(row: hour, section: 0), animated: true, scrollPosition: .middle)
+                hourTableView.selectRow(at: IndexPath(row: hour + 24, section: 0), animated: true, scrollPosition: .middle)
             }
             
             if let minute = components.minute {
-                minuteTableView.selectRow(at: IndexPath(row: minute, section: 0), animated: true, scrollPosition: .middle)
+                minuteTableView.selectRow(at: IndexPath(row: minute + 60, section: 0), animated: true, scrollPosition: .middle)
             }
         }
     }

        cell.textLabel?.font = UIFont.boldSystemFont(ofSize: 18)
        cell.textLabel?.textColor = darkColor.withAlphaComponent(0.4)
        cell.textLabel?.highlightedTextColor = highlightColor
        cell.textLabel?.text = String(format: "%02i", indexPath.row)
        
        return cell
    }
    
    public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.selectRow(at: indexPath, animated: true, scrollPosition: .middle)
        if tableView == hourTableView {
            components.hour = indexPath.row
        } else if tableView == minuteTableView {
            components.minute = indexPath.row
        }
        
        if let selected = calendar.date(from: components) {
            selectedDate = selected
        }
    }
}

                }
            }
        } else if let tableView = scrollView as? UITableView {
            let relativeOffset = CGPoint(x: 0, y: tableView.contentOffset.y + tableView.contentInset.top )
            // change row from var to let.
            let row = round(relativeOffset.y / tableView.rowHeight)
            // table view became infinite, so do not need this code anymore.
//            if tableView == hourTableView {
//                row = max(min(row, 23), 0)
//            } else if tableView == minuteTableView {
//                row = max(min(row, 59), 0)
//            }
            tableView.selectRow(at: IndexPath(row: Int(row), section: 0), animated: true, scrollPosition: .middle)
            
            // add 24 to hour and 60 to minute, because datasource now has buffer at top and bottom.
            if tableView == hourTableView {
                components.hour = Int(row - 24)
            } else if tableView == minuteTableView {
                components.minute = Int(row - 60)
            }
            
            if let selected = calendar.date(from: components) {
