Consolidated Statements of Shareholders' Equity (Unaudited) - USD ($) $ in Thousands | Common Stock [Member] | Additional Paid-in Capital [Member] | Retained Earnings [Member] | AOCI Attributable to Parent [Member] | Total |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | |
Balance at Dec. 31, 2019 | $ 27 | $ 268,059 | $ 324,722 | $ (7,018) | $ 585,790 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 23,525 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (902) | 0 | 0 | (902) |
Stock-based compensation expense | $ 0 | 3,033 | 0 | 0 | 3,033 |
Repurchases of common stock (in shares) | (161,460) | | | | |
Repurchases of common stock | $ 0 | (1,616) | (9,569) | 0 | (11,185) |
Net income | 0 | 0 | 13,984 | 0 | 13,984 |
Other comprehensive loss | | | | | |
Foreign currency translation adjustment | $ 0 | 0 | 0 | (2,980) | (2,980) |
Comprehensive income | | | | | 11,004 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 23,525 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (902) | 0 | 0 | (902) |
Stock-based compensation expense | $ 0 | 3,033 | 0 | 0 | 3,033 |
Repurchases of common stock (in shares) | (161,460) | | | | |
Repurchases of common stock | $ 0 | (1,616) | (9,569) | 0 | (11,185) |
Net income | $ 0 | 0 | 13,984 | 0 | 13,984 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | 585,790 |
Balance (in shares) at Mar. 31, 2020 | 26,648,524 | | | | |
Balance at Mar. 31, 2020 | $ 27 | 268,574 | 329,137 | (9,998) | 587,740 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | 585,790 |
Net income | | | | | 26,591 |
Other comprehensive loss | | | | | |
Comprehensive income | | | | | 23,975 |
Net income | | | | | 26,591 |
Balance (in shares) at Dec. 31, 2019 | 26,786,459 | | | | |
Balance at Dec. 31, 2019 | $ 27 | 268,059 | 324,722 | (7,018) | 585,790 |
Balance (in shares) at Jun. 30, 2020 | 26,706,556 | | | | |
Balance at Jun. 30, 2020 | $ 27 | 272,231 | 338,625 | (9,634) | 601,249 |
Balance (in shares) at Mar. 31, 2020 | 26,648,524 | | | | |
Balance at Mar. 31, 2020 | $ 27 | 268,574 | 329,137 | (9,998) | 587,740 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 96,186 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 400 | 0 | 0 | 400 |
Stock-based compensation expense | $ 0 | 3,639 | 0 | 0 | 3,639 |
Repurchases of common stock (in shares) | (38,154) | | | | |
Repurchases of common stock | $ 0 | (382) | (3,119) | 0 | (3,501) |
Net income | 0 | 0 | 12,607 | 0 | 12,607 |
Other comprehensive loss | | | | | |
Foreign currency translation adjustment | | 0 | 0 | 364 | 364 |
Comprehensive income | | | | | 12,971 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 96,186 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | 400 | 0 | 0 | 400 |
Stock-based compensation expense | $ 0 | 3,639 | 0 | 0 | 3,639 |
Repurchases of common stock (in shares) | (38,154) | | | | |
Repurchases of common stock | $ 0 | (382) | (3,119) | 0 | (3,501) |
Net income | $ 0 | 0 | 12,607 | 0 | 12,607 |
Balance (in shares) at Mar. 31, 2020 | 26,648,524 | | | | |
Balance at Mar. 31, 2020 | $ 27 | 268,574 | 329,137 | (9,998) | 587,740 |
Balance (in shares) at Jun. 30, 2020 | 26,706,556 | | | | |
Balance at Jun. 30, 2020 | $ 27 | 272,231 | 338,625 | (9,634) | $ 601,249 |
Balance (in shares) at Dec. 31, 2020 | 26,776,796 | | | | 26,776,796 |
Balance at Dec. 31, 2020 | $ 27 | 284,848 | 362,901 | (3,420) | $ 644,356 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 48,955 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (290) | 0 | 0 | (290) |
Common shares issued for Hubs acquisition (in shares) | 863,995 | | | | |
Common shares issued for Hubs acquisition | $ 1 | 166,708 | 0 | 0 | 166,709 |
Stock-based compensation expense | $ 0 | 5,620 | 0 | 0 | 5,620 |
Repurchases of common stock (in shares) | 0 | | | | |
Repurchases of common stock | $ 0 | 0 | 0 | 0 | 0 |
Net income | 0 | 0 | 3,712 | 0 | 3,712 |
Other comprehensive loss | | | | | |
Foreign currency translation adjustment | 0 | 0 | 0 | (6,842) | (6,842) |
Net unrealized gains (losses) on investments in securities | $ 0 | 0 | 0 | 166 | 166 |
Comprehensive income | | | | | (2,964) |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 48,955 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (290) | 0 | 0 | (290) |
Stock-based compensation expense | $ 0 | 5,620 | 0 | 0 | 5,620 |
Repurchases of common stock (in shares) | 0 | | | | |
Repurchases of common stock | $ 0 | 0 | 0 | 0 | 0 |
Net income | $ 0 | 0 | 3,712 | 0 | $ 3,712 |
Balance (in shares) at Dec. 31, 2020 | 26,776,796 | | | | 26,776,796 |
Balance at Dec. 31, 2020 | $ 27 | 284,848 | 362,901 | (3,420) | $ 644,356 |
Balance (in shares) at Mar. 31, 2021 | 27,689,746 | | | | |
Balance at Mar. 31, 2021 | $ 28 | 456,886 | 366,613 | (10,096) | $ 813,431 |
Balance (in shares) at Dec. 31, 2020 | 26,776,796 | | | | 26,776,796 |
Balance at Dec. 31, 2020 | $ 27 | 284,848 | 362,901 | (3,420) | $ 644,356 |
Net income | | | | | 16,627 |
Other comprehensive loss | | | | | |
Comprehensive income | | | | | 11,932 |
Net income | | | | | $ 16,627 |
Balance (in shares) at Dec. 31, 2020 | 26,776,796 | | | | 26,776,796 |
Balance at Dec. 31, 2020 | $ 27 | 284,848 | 362,901 | (3,420) | $ 644,356 |
Balance (in shares) at Jun. 30, 2021 | 27,761,063 | | | | 27,761,063 |
Balance at Jun. 30, 2021 | $ 28 | 461,597 | 378,467 | (8,115) | $ 831,977 |
Balance (in shares) at Mar. 31, 2021 | 27,689,746 | | | | |
Balance at Mar. 31, 2021 | $ 28 | 456,886 | 366,613 | (10,096) | 813,431 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 85,317 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (81) | 0 | 0 | (81) |
Stock-based compensation expense | $ 0 | 4,941 | 0 | 0 | 4,941 |
Repurchases of common stock (in shares) | (14,000) | | | | |
Repurchases of common stock | $ 0 | (149) | (1,061) | 0 | (1,210) |
Net income | 0 | 0 | 12,915 | 0 | 12,915 |
Other comprehensive loss | | | | | |
Foreign currency translation adjustment | 0 | 0 | 0 | 2,030 | 2,030 |
Net unrealized gains (losses) on investments in securities | $ 0 | 0 | 0 | (49) | (49) |
Comprehensive income | | | | | 14,896 |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations (in shares) | 85,317 | | | | |
Common shares issued on exercise of options and other, net of shares withheld for tax obligations | $ 0 | (81) | 0 | 0 | (81) |
Stock-based compensation expense | $ 0 | 4,941 | 0 | 0 | 4,941 |
Repurchases of common stock (in shares) | (14,000) | | | | |
Repurchases of common stock | $ 0 | (149) | (1,061) | 0 | (1,210) |
Net income | $ 0 | 0 | 12,915 | 0 | 12,915 |
Balance (in shares) at Mar. 31, 2021 | 27,689,746 | | | | |
Balance at Mar. 31, 2021 | $ 28 | 456,886 | 366,613 | (10,096) | $ 813,431 |
Balance (in shares) at Jun. 30, 2021 | 27,761,063 | | | | 27,761,063 |
Balance at Jun. 30, 2021 | $ 28 | $ 461,597 | $ 378,467 | $ (8,115) | $ 831,977 |