```coffeescript
###
#    Copyright 2015-2017 ppy Pty. Ltd.
#
#    This file is part of osu!web. osu!web is distributed with the hope of
#    attracting more community contributions to the core ecosystem of osu!.
#
#    osu!web is free software: you can redistribute it and/or modify
#    it under the terms of the Affero GNU General Public License version 3
#    as published by the Free Software Foundation.
#
#    osu!web is distributed WITHOUT ANY WARRANTY; without even the implied
#    warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#    See the GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with osu!web.  If not, see <http://www.gnu.org/licenses/>.
###

{div,i} = ReactDOMFactories
el = React.createElement

class Contest.Voting.VoteSummary extends React.Component
  render: ->
    classes = [
      'contest__voting-star',
      'contest__voting-star--smaller',
      'contest__voting-star--float-right',
    ]
    selectedClass = [
      'contest__voting-star--selected',
    ]

    voteSummary = []
    voteSummary.push _.times Math.max(0, @props.maxVotes - @props.voteCount), ->
      div className: classes.join(' '),
        i className: 'fas fa-fw fa-star'
    voteSummary.push _.times @props.voteCount, ->
      div className: classes.concat(selectedClass).join(' '),
        i className: 'fas fa-fw fa-star'

    div {},
      voteSummary
```

Add missing key and refactor
user
```coffeescript
###
#    Copyright 2015-2018 ppy Pty. Ltd.
#
#    This file is part of osu!web. osu!web is distributed with the hope of
#    attracting more community contributions to the core ecosystem of osu!.
#
#    osu!web is free software: you can redistribute it and/or modify
#    it under the terms of the Affero GNU General Public License version 3
#    as published by the Free Software Foundation.
#
#    osu!web is distributed WITHOUT ANY WARRANTY; without even the implied
#    warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#    See the GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with osu!web.  If not, see <http://www.gnu.org/licenses/>.
###

{div, span} = ReactDOMFactories

baseClass = osu.classWithModifiers('contest__voting-star', ['smaller', 'float-right'])
selectedClass = 'contest__voting-star--selected'

Contest.Voting.VoteSummary = ({voteCount, maxVotes}) ->
  div null,
    for i in [0...maxVotes]
      className = baseClass
      className += " #{selectedClass}" if i >= voteCount

      div
        key: "vote-#{i}"
        className: className
        span className: 'fas fa-fw fa-star'
```
assistant