<?xml version="1.0" ?>
<informationTable xsi:schemaLocation="http://www.sec.gov/edgar/document/thirteenf/informationtable eis_13FDocument.xsd" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:n1="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <infoTable>
    <nameOfIssuer>3M CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>88579Y101</cusip>
    <value>983</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4730</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4110</Sole>
      <Shared>0</Shared>
      <None>620</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AAON INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.004</titleOfClass>
    <cusip>000360206</cusip>
    <value>73633</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1594478</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1590921</Sole>
      <Shared>0</Shared>
      <None>3557</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBOTT LABS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>002824100</cusip>
    <value>725</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9073</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9073</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBVIE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00287Y109</cusip>
    <value>639</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7935</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7935</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ACI WORLDWIDE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>004498101</cusip>
    <value>86517</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2632106</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2610956</Sole>
      <Shared>0</Shared>
      <None>21150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ADOBE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00724F101</cusip>
    <value>354</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1070</Sole>
      <Shared>0</Shared>
      <None>260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALIGN TECHNOLOGY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>016255101</cusip>
    <value>2958</value>
    <shrsOrPrnAmt>
      <sshPrnamt>10403</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8103</Sole>
      <Shared>0</Shared>
      <None>2300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL C</titleOfClass>
    <cusip>02079K107</cusip>
    <value>264</value>
    <shrsOrPrnAmt>
      <sshPrnamt>225</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>80</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL A</titleOfClass>
    <cusip>02079K305</cusip>
    <value>265</value>
    <shrsOrPrnAmt>
      <sshPrnamt>225</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>80</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AMGEN INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>031162100</cusip>
    <value>253</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1330</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ANSYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03662Q105</cusip>
    <value>5002</value>
    <shrsOrPrnAmt>
      <sshPrnamt>27377</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>20567</Sole>
      <Shared>0</Shared>
      <None>6810</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>APPLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>037833100</cusip>
    <value>528</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2780</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1580</Sole>
      <Shared>0</Shared>
      <None>1200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AQUA AMERICA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03836W103</cusip>
    <value>222</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6087</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5387</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AQUAVENTURE HLDGS LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G0443N107</cusip>
    <value>199</value>
    <shrsOrPrnAmt>
      <sshPrnamt>10300</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10300</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AXON ENTERPRISE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>05464C101</cusip>
    <value>42758</value>
    <shrsOrPrnAmt>
      <sshPrnamt>785855</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>775305</Sole>
      <Shared>0</Shared>
      <None>10550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BALCHEM CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>057665200</cusip>
    <value>74425</value>
    <shrsOrPrnAmt>
      <sshPrnamt>801988</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>792684</Sole>
      <Shared>0</Shared>
      <None>9304</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIO TECHNE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09073M104</cusip>
    <value>63800</value>
    <shrsOrPrnAmt>
      <sshPrnamt>321328</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>315803</Sole>
      <Shared>0</Shared>
      <None>5525</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIOLIFE SOLUTIONS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>09062W204</cusip>
    <value>238</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13320</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13320</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKBAUD INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09227Q100</cusip>
    <value>80636</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1011365</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>997627</Sole>
      <Shared>0</Shared>
      <None>13738</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKLINE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09239B109</cusip>
    <value>51889</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1120227</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1117577</Sole>
      <Shared>0</Shared>
      <None>2650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BOTTOMLINE TECH DEL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>101388106</cusip>
    <value>95844</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1913436</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1899831</Sole>
      <Shared>0</Shared>
      <None>13605</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BRIGHT HORIZONS FAM SOL IN D</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>109194100</cusip>
    <value>6293</value>
    <shrsOrPrnAmt>
      <sshPrnamt>49512</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>37337</Sole>
      <Shared>0</Shared>
      <None>12175</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CANTEL MEDICAL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>138098108</cusip>
    <value>83310</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1245484</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1230890</Sole>
      <Shared>0</Shared>
      <None>14594</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CAREDX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>14167L103</cusip>
    <value>413</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13095</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13095</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEFS WHSE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>163086101</cusip>
    <value>41647</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1341304</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1318396</Sole>
      <Shared>0</Shared>
      <None>22908</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEVRON CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>166764100</cusip>
    <value>403</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3274</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3274</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CODEXIS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192005106</cusip>
    <value>373</value>
    <shrsOrPrnAmt>
      <sshPrnamt>18170</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18170</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COGNEX CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192422103</cusip>
    <value>2295</value>
    <shrsOrPrnAmt>
      <sshPrnamt>45129</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>32454</Sole>
      <Shared>0</Shared>
      <None>12675</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CONSTRUCTION PARTNERS INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>21044C107</cusip>
    <value>336</value>
    <shrsOrPrnAmt>
      <sshPrnamt>26330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>26330</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COPART INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>217204106</cusip>
    <value>6041</value>
    <shrsOrPrnAmt>
      <sshPrnamt>99699</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>75124</Sole>
      <Shared>0</Shared>
      <None>24575</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CORE LABORATORIES N V</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>N22717107</cusip>
    <value>1227</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17800</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13625</Sole>
      <Shared>0</Shared>
      <None>4175</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTAR GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160N109</cusip>
    <value>5680</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12177</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9512</Sole>
      <Shared>0</Shared>
      <None>2665</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTCO WHSL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160K105</cusip>
    <value>590</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2435</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1810</Sole>
      <Shared>0</Shared>
      <None>625</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CRYOPORT INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.001</titleOfClass>
    <cusip>229050307</cusip>
    <value>355</value>
    <shrsOrPrnAmt>
      <sshPrnamt>27485</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>27485</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DANAHER CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>235851102</cusip>
    <value>269</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2035</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1345</Sole>
      <Shared>0</Shared>
      <None>690</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DESCARTES SYS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>249906108</cusip>
    <value>125492</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3449473</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3415198</Sole>
      <Shared>0</Shared>
      <None>34275</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOLBY LABORATORIES INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>25659T107</cusip>
    <value>396</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6293</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5793</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DORMAN PRODUCTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>258278100</cusip>
    <value>69934</value>
    <shrsOrPrnAmt>
      <sshPrnamt>793888</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>792088</Sole>
      <Shared>0</Shared>
      <None>1800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOUGLAS DYNAMICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>25960R105</cusip>
    <value>73102</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1920188</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1896056</Sole>
      <Shared>0</Shared>
      <None>24132</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOWDUPONT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>26078J100</cusip>
    <value>287</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5385</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5385</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ECOLAB INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>278865100</cusip>
    <value>251</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1420</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>720</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESCO TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>296315104</cusip>
    <value>76775</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1145389</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1142763</Sole>
      <Shared>0</Shared>
      <None>2626</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVI INDUSTRIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>26929N102</cusip>
    <value>21658</value>
    <shrsOrPrnAmt>
      <sshPrnamt>567993</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>553663</Sole>
      <Shared>0</Shared>
      <None>14330</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVOLENT HEALTH INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>30050B101</cusip>
    <value>281</value>
    <shrsOrPrnAmt>
      <sshPrnamt>22320</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>22320</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXPONENT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30214U102</cusip>
    <value>133862</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2319167</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2302105</Sole>
      <Shared>0</Shared>
      <None>17062</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXXON MOBIL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30231G102</cusip>
    <value>1554</value>
    <shrsOrPrnAmt>
      <sshPrnamt>19230</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19080</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FACTSET RESH SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303075105</cusip>
    <value>528</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2126</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2126</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FAIR ISAAC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303250104</cusip>
    <value>4763</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17534</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12984</Sole>
      <Shared>0</Shared>
      <None>4550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FASTENAL CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>311900104</cusip>
    <value>901</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14009</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11469</Sole>
      <Shared>0</Shared>
      <None>2540</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIRSTSERVICE CORP NEW</nameOfIssuer>
    <titleOfClass>SUB VTG SH</titleOfClass>
    <cusip>33767E103</cusip>
    <value>44473</value>
    <shrsOrPrnAmt>
      <sshPrnamt>497798</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>496672</Sole>
      <Shared>0</Shared>
      <None>1126</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIVE9 INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>338307101</cusip>
    <value>25957</value>
    <shrsOrPrnAmt>
      <sshPrnamt>491333</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>490208</Sole>
      <Shared>0</Shared>
      <None>1125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FORTINET INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>34959E109</cusip>
    <value>513</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6113</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6113</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FOX FACTORY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>35138V102</cusip>
    <value>110182</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1576511</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1572986</Sole>
      <Shared>0</Shared>
      <None>3525</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARMIN LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>H2906T109</cusip>
    <value>395</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3870</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARTNER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>366651107</cusip>
    <value>3835</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25286</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19086</Sole>
      <Shared>0</Shared>
      <None>6200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRACO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>384109104</cusip>
    <value>3929</value>
    <shrsOrPrnAmt>
      <sshPrnamt>79351</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>61451</Sole>
      <Shared>0</Shared>
      <None>17900</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRAND CANYON ED INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>38526M106</cusip>
    <value>88228</value>
    <shrsOrPrnAmt>
      <sshPrnamt>770484</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>768709</Sole>
      <Shared>0</Shared>
      <None>1775</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GUIDEWIRE SOFTWARE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>40171V100</cusip>
    <value>4622</value>
    <shrsOrPrnAmt>
      <sshPrnamt>47569</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>35919</Sole>
      <Shared>0</Shared>
      <None>11650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEALTHCARE SVCS GRP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>421906108</cusip>
    <value>39455</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1195962</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1179936</Sole>
      <Shared>0</Shared>
      <None>16026</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEICO CORP NEW</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>422806208</cusip>
    <value>6357</value>
    <shrsOrPrnAmt>
      <sshPrnamt>75628</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>58078</Sole>
      <Shared>0</Shared>
      <None>17550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HENRY JACK &amp; ASSOC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>426281101</cusip>
    <value>4307</value>
    <shrsOrPrnAmt>
      <sshPrnamt>31045</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23170</Sole>
      <Shared>0</Shared>
      <None>7875</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HESKA CORP</nameOfIssuer>
    <titleOfClass>COM RESTRC NEW</titleOfClass>
    <cusip>42805E306</cusip>
    <value>229</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2690</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2690</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEXCEL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>428291108</cusip>
    <value>333</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4818</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4818</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HOME DEPOT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>437076102</cusip>
    <value>230</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1200</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1200</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IDEXX LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>45168D104</cusip>
    <value>3866</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17290</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12990</Sole>
      <Shared>0</Shared>
      <None>4300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IHS MARKIT LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G47567105</cusip>
    <value>1138</value>
    <shrsOrPrnAmt>
      <sshPrnamt>20926</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17958</Sole>
      <Shared>0</Shared>
      <None>2968</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEGRA LIFESCIENCES HLDGS C</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>457985208</cusip>
    <value>279</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>458140100</cusip>
    <value>371</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6900</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6400</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTERNATIONAL BUSINESS MACHS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>459200101</cusip>
    <value>315</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2235</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2235</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTRICON CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46121H109</cusip>
    <value>235</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9380</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9380</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTUIT</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>461202103</cusip>
    <value>553</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2115</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1735</Sole>
      <Shared>0</Shared>
      <None>380</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTUITIVE SURGICAL INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>46120E602</cusip>
    <value>208</value>
    <shrsOrPrnAmt>
      <sshPrnamt>365</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>175</Sole>
      <Shared>0</Shared>
      <None>190</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IPG PHOTONICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>44980X109</cusip>
    <value>473</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3115</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3115</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHN BEAN TECHNOLOGIES CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>477839104</cusip>
    <value>66549</value>
    <shrsOrPrnAmt>
      <sshPrnamt>724222</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>715420</Sole>
      <Shared>0</Shared>
      <None>8802</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHNSON &amp; JOHNSON</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>478160104</cusip>
    <value>529</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3781</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2931</Sole>
      <Shared>0</Shared>
      <None>850</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JPMORGAN CHASE &amp; CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46625H100</cusip>
    <value>277</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2741</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2341</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>KIMBERLY CLARK CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>494368103</cusip>
    <value>527</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4250</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LCI INDS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>50189K103</cusip>
    <value>1743</value>
    <shrsOrPrnAmt>
      <sshPrnamt>22690</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17095</Sole>
      <Shared>0</Shared>
      <None>5595</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LEMAITRE VASCULAR INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>525558201</cusip>
    <value>52665</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1698881</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1695056</Sole>
      <Shared>0</Shared>
      <None>3825</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LIGAND PHARMACEUTICALS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>53220K504</cusip>
    <value>78067</value>
    <shrsOrPrnAmt>
      <sshPrnamt>621006</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>613371</Sole>
      <Shared>0</Shared>
      <None>7635</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LINDE PLC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>G5494J103</cusip>
    <value>506</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2875</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2155</Sole>
      <Shared>0</Shared>
      <None>720</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MARKEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>570535104</cusip>
    <value>861</value>
    <shrsOrPrnAmt>
      <sshPrnamt>864</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>694</Sole>
      <Shared>0</Shared>
      <None>170</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MASTERCARD INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>57636Q104</cusip>
    <value>420</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1785</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1395</Sole>
      <Shared>0</Shared>
      <None>390</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MATADOR RES CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>576485205</cusip>
    <value>24439</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1264284</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1261456</Sole>
      <Shared>0</Shared>
      <None>2828</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MEDIDATA SOLUTIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58471A105</cusip>
    <value>61825</value>
    <shrsOrPrnAmt>
      <sshPrnamt>844144</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>842219</Sole>
      <Shared>0</Shared>
      <None>1925</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCK &amp; CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58933Y105</cusip>
    <value>553</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6650</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCURY SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589378108</cusip>
    <value>90313</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1409386</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1387986</Sole>
      <Shared>0</Shared>
      <None>21400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MESA LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>59064R109</cusip>
    <value>101543</value>
    <shrsOrPrnAmt>
      <sshPrnamt>440532</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>440096</Sole>
      <Shared>0</Shared>
      <None>436</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MGP INGREDIENTS INC NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>55303J106</cusip>
    <value>93220</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1208292</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1195048</Sole>
      <Shared>0</Shared>
      <None>13244</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MICROSOFT CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>594918104</cusip>
    <value>587</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4979</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4049</Sole>
      <Shared>0</Shared>
      <None>930</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NANOSTRING TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>63009R109</cusip>
    <value>375</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15680</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>15680</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NATIONAL RESH CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>637372202</cusip>
    <value>23588</value>
    <shrsOrPrnAmt>
      <sshPrnamt>611089</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>609596</Sole>
      <Shared>0</Shared>
      <None>1493</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>640491106</cusip>
    <value>88728</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1546058</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1529299</Sole>
      <Shared>0</Shared>
      <None>16759</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGENOMICS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>64049M209</cusip>
    <value>379</value>
    <shrsOrPrnAmt>
      <sshPrnamt>18500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NIKE INC</nameOfIssuer>
    <titleOfClass>CL B</titleOfClass>
    <cusip>654106103</cusip>
    <value>267</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3175</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2315</Sole>
      <Shared>0</Shared>
      <None>860</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NOVANTA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>67000B104</cusip>
    <value>57433</value>
    <shrsOrPrnAmt>
      <sshPrnamt>677832</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>676087</Sole>
      <Shared>0</Shared>
      <None>1745</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NV5 GLOBAL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>62945V109</cusip>
    <value>294</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4960</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4960</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NVE CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>629445206</cusip>
    <value>42723</value>
    <shrsOrPrnAmt>
      <sshPrnamt>436435</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>435381</Sole>
      <Shared>0</Shared>
      <None>1054</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMEGA FLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>682095104</cusip>
    <value>306</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4035</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4035</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMNICELL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68213N109</cusip>
    <value>124992</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1546168</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1526718</Sole>
      <Shared>0</Shared>
      <None>19450</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ORTHOPEDIATRICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68752L100</cusip>
    <value>440</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9955</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9955</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PAYLOCITY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>70438V106</cusip>
    <value>52501</value>
    <shrsOrPrnAmt>
      <sshPrnamt>588637</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>587287</Sole>
      <Shared>0</Shared>
      <None>1350</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PFIZER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>717081103</cusip>
    <value>727</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17108</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17108</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PLURALSIGHT INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>72941B106</cusip>
    <value>1796</value>
    <shrsOrPrnAmt>
      <sshPrnamt>56574</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>42274</Sole>
      <Shared>0</Shared>
      <None>14300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>POOL CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>73278L105</cusip>
    <value>5155</value>
    <shrsOrPrnAmt>
      <sshPrnamt>31249</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23224</Sole>
      <Shared>0</Shared>
      <None>8025</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROCTER AND GAMBLE CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>742718109</cusip>
    <value>410</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3940</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3740</Sole>
      <Shared>0</Shared>
      <None>200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROS HOLDINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74346Y103</cusip>
    <value>100105</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2369911</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2364461</Sole>
      <Shared>0</Shared>
      <None>5450</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROTO LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>743713109</cusip>
    <value>58710</value>
    <shrsOrPrnAmt>
      <sshPrnamt>558401</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>557226</Sole>
      <Shared>0</Shared>
      <None>1175</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>REPLIGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>759916109</cusip>
    <value>96739</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1637430</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1621805</Sole>
      <Shared>0</Shared>
      <None>15625</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROGERS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775133101</cusip>
    <value>87445</value>
    <shrsOrPrnAmt>
      <sshPrnamt>550387</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>549127</Sole>
      <Shared>0</Shared>
      <None>1260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROLLINS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775711104</cusip>
    <value>5894</value>
    <shrsOrPrnAmt>
      <sshPrnamt>141611</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>111424</Sole>
      <Shared>0</Shared>
      <None>30187</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROPER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>776696106</cusip>
    <value>294</value>
    <shrsOrPrnAmt>
      <sshPrnamt>860</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>700</Sole>
      <Shared>0</Shared>
      <None>160</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SHOTSPOTTER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82536T107</cusip>
    <value>315</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8170</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8170</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMPSON MANUFACTURING CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829073105</cusip>
    <value>97563</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1646072</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1633116</Sole>
      <Shared>0</Shared>
      <None>12956</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMULATIONS PLUS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829214105</cusip>
    <value>320</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15155</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>15155</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SITEONE LANDSCAPE SUPPLY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82982L103</cusip>
    <value>56613</value>
    <shrsOrPrnAmt>
      <sshPrnamt>990605</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>977890</Sole>
      <Shared>0</Shared>
      <None>12715</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMITH A O CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>831865209</cusip>
    <value>2461</value>
    <shrsOrPrnAmt>
      <sshPrnamt>46153</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>35673</Sole>
      <Shared>0</Shared>
      <None>10480</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMUCKER J M CO</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>832696405</cusip>
    <value>715</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6134</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5144</Sole>
      <Shared>0</Shared>
      <None>990</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SOTHEBYS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>835898107</cusip>
    <value>57882</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1533300</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1529775</Sole>
      <Shared>0</Shared>
      <None>3525</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPS COMMERCE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78463M107</cusip>
    <value>57529</value>
    <shrsOrPrnAmt>
      <sshPrnamt>542415</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>536208</Sole>
      <Shared>0</Shared>
      <None>6207</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SUN HYDRAULICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>866942105</cusip>
    <value>69297</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1489937</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1486633</Sole>
      <Shared>0</Shared>
      <None>3304</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TELEFLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>879369106</cusip>
    <value>4380</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14497</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11047</Sole>
      <Shared>0</Shared>
      <None>3450</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRACTOR SUPPLY CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>892356106</cusip>
    <value>690</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7055</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5755</Sole>
      <Shared>0</Shared>
      <None>1300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TREX CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89531P105</cusip>
    <value>72574</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1179679</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1165474</Sole>
      <Shared>0</Shared>
      <None>14205</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRIMBLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>896239100</cusip>
    <value>519</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12844</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12844</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TYLER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>902252105</cusip>
    <value>62244</value>
    <shrsOrPrnAmt>
      <sshPrnamt>304520</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>298225</Sole>
      <Shared>0</Shared>
      <None>6295</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>U S PHYSICAL THERAPY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90337L108</cusip>
    <value>277</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2635</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2635</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ULTIMATE SOFTWARE GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90385D107</cusip>
    <value>1968</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5962</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4462</Sole>
      <Shared>0</Shared>
      <None>1500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNIFI INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>904677200</cusip>
    <value>530</value>
    <shrsOrPrnAmt>
      <sshPrnamt>27390</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>25990</Sole>
      <Shared>0</Shared>
      <None>1400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNION PACIFIC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>907818108</cusip>
    <value>892</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5332</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5332</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VAIL RESORTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>91879Q109</cusip>
    <value>3650</value>
    <shrsOrPrnAmt>
      <sshPrnamt>16796</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>12826</Sole>
      <Shared>0</Shared>
      <None>3970</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VEEVA SYS INC</nameOfIssuer>
    <titleOfClass>CL A COM</titleOfClass>
    <cusip>922475108</cusip>
    <value>304</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2400</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2400</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERISK ANALYTICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92345Y106</cusip>
    <value>915</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6877</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6307</Sole>
      <Shared>0</Shared>
      <None>570</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERIZON COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92343V104</cusip>
    <value>211</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3573</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3573</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VOCERA COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92857F107</cusip>
    <value>56789</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1795403</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1791128</Sole>
      <Shared>0</Shared>
      <None>4275</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>W P CAREY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92936U109</cusip>
    <value>380</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4850</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3850</Sole>
      <Shared>0</Shared>
      <None>1000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WABTEC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929740108</cusip>
    <value>2750</value>
    <shrsOrPrnAmt>
      <sshPrnamt>37308</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>28708</Sole>
      <Shared>0</Shared>
      <None>8600</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WAGEWORKS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>930427109</cusip>
    <value>68842</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1823144</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1801849</Sole>
      <Shared>0</Shared>
      <None>21295</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WATSCO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>942622200</cusip>
    <value>3579</value>
    <shrsOrPrnAmt>
      <sshPrnamt>24991</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18691</Sole>
      <Shared>0</Shared>
      <None>6300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WD-40 CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929236107</cusip>
    <value>43667</value>
    <shrsOrPrnAmt>
      <sshPrnamt>257713</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>257172</Sole>
      <Shared>0</Shared>
      <None>541</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WEST PHARMACEUTICAL SVSC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>955306105</cusip>
    <value>4329</value>
    <shrsOrPrnAmt>
      <sshPrnamt>39283</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>30263</Sole>
      <Shared>0</Shared>
      <None>9020</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WESTWOOD HLDGS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>961765104</cusip>
    <value>14148</value>
    <shrsOrPrnAmt>
      <sshPrnamt>401140</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>400232</Sole>
      <Shared>0</Shared>
      <None>908</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WILLDAN GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>96924N100</cusip>
    <value>331</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8920</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8920</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>XYLEM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>98419M100</cusip>
    <value>408</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5160</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3730</Sole>
      <Shared>0</Shared>
      <None>1430</None>
    </votingAuthority>
  </infoTable>
</informationTable>
