{"version":3,"sources":["images/freetilt.jpg","equitycalculator/actions/types.jsx","equitycalculator/actions/creators.jsx","equitycalculator/components/buttons/bankCard.jsx","equitycalculator/components/buttons/boardButton.jsx","equitycalculator/components/buttons/boardCard.jsx","equitycalculator/components/buttons/card.jsx","equitycalculator/components/buttons/handCard.jsx","equitycalculator/components/boardModal.jsx","equitycalculator/components/breakdown-row.jsx","equitycalculator/components/cardBank.jsx","equitycalculator/components/equity.jsx","equitycalculator/components/equityCalculator.jsx","equitycalculator/components/hand.jsx","equitycalculator/components/handModal.jsx","equitycalculator/components/handRange.jsx","equitycalculator/components/rangeModal.jsx","equitycalculator/constants/handRanks.js","equitycalculator/constants/positions.js","equitycalculator/constants/suits.js","equitycalculator/constants/ranks.js","equitycalculator/containers/boardContainer.jsx","equitycalculator/components/board.jsx","equitycalculator/containers/boardButtonContainer.jsx","equitycalculator/containers/breakdownContainer.jsx","equitycalculator/components/breakdown.jsx","equitycalculator/containers/calculatorContainer.jsx","equitycalculator/containers/cardBankContainer.jsx","equitycalculator/containers/clearContainer.jsx","equitycalculator/components/buttons/clear.jsx","equitycalculator/containers/evaluateContainer.jsx","equitycalculator/containers/equityContainer.jsx","equitycalculator/components/buttons/evaluate.jsx","equitycalculator/containers/handContainer.jsx","equitycalculator/containers/handRangeContainer.jsx","equitycalculator/containers/incrementContainer.jsx","equitycalculator/components/increment.jsx","equitycalculator/helpers/general.js","equitycalculator/helpers/generateCards.js","equitycalculator/helpers/oddsCalculator.js","equitycalculator/reducers/equityReducer.js","Main.jsx","App.js","registerServiceWorker.js","reducers.js","index.js"],"names":["module","exports","__webpack_require__","p","SELECT_CARD","SELECT_POSITION","SAVE_EQUITY","CLEAR_HANDS","INCREMENT_HANDS","DECREMENT_HANDS","ADD_TO_RANGE","REMOVE_FROM_RANGE","selectPosition","hand","card","type","types","incrementHands","decrementHands","BankCard","_React$Component","Object","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","apply","arguments","inherits","createClass","key","value","_this$props","props","onSelect","rank","suit","disabled","react","card_Card","React","BoardButton","_Component","_this","call","state","showBoardModal","toggleBoardModal","bind","assertThisInitialized","setState","_this2","board","onClick","react_default","a","createElement","className","values","map","i","getSuitFromHTML","charCodeAt","boardModal_BoardModal","show","onClose","Component","BoardCard","isSelected","Card","suitClass","selectedClass","es","HandCard","BoardModal","bsSize","onHide","Header","closeButton","Body","BoardContainer","CardBankContainer","BreakdownRow","title","ranking","toLowerCase","replace","equities","equity","formatPercentage","CardBank","deadCards","unicodeSuits","xs","ranks","j","includes","bankCard_BankCard","Equity","savedEquities","hands","length","handEquities","entries","height","k","EquityCalculator","handCount","handRows","push","md","HandRangeContainer","number","id","IncrementContainer","BoardButtonContainer","EvaluateContainer","ClearContainer","BreakdownContainer","href","target","rel","Hand","position","selectedPosition","selectedCard","handCard_HandCard","HandModal","HandContainer","HandRange","showHandModal","showRangeModal","toggleHandModal","toggleRangeModal","showMinus","decrement","slots","addToRange","removeFromRange","ranges","displayEquities","removeHandTooltip","range","rangeLimit","$","window","width","getHand","getRange","placement","overlay","handModal_HandModal","rangeModal_RangeModal","RangeModal","adding","setAddingOrRemoving","toggleSelection","indexOf","undefined","rankOne","suited","rankTwo","btnClass","onMouseDown","onMouseOver","e","buttons","handRankings","BOARD","suits","getSuitFromUnicode","unicodeString","entity","connect","_state$equityReducer","equityReducer","dispatch","boardCards","_loop","boardCard_BoardCard","_savedEquities","getRangeSummary","handRanking","breakdown_row_BreakdownRow","CalculatorContainer","ownProps","slot","limit","keys","selectCard","getHandsFromSlots","saveEquity","rangeHands","forEach","rangeHand","concat","getHandsFromRangeHand","Array","isArray","getRangeEquity","showPlus","increment","tooltip","getCardStringFromObj","1","2","suitOne","suitTwo","decimalPlaces","toFixed","formattedHand","getPairSummary","pairs","sortedPairs","sort","b","pairRanges","highest","lowest","pair","currentRange","pairSummary","pairRange","getNonPairSummary","nonPairs","rangeSummary","slice","filter","firstCard","secondCard","handRanks","generateBoard","existingBoard","Math","floor","random","breakdowns","comparisons","getComparisons","index","newHands","assign","newHand","iterations","isValidComparison","getHandEquity","finalBreakdown","breakdown","rangeBreakdown","_ref","_ref2","slicedToArray","cards","JSON","stringify","hasDuplicates","isValidInput","getBoardCards","_initializeEquityVari","initializeEquityVariables","wins","tieEquities","holeCards","getHoleCards","fullBoard","_evaluateHands","evaluateHands","handCards","handStrengths","updatedBreakdowns","topHandRankIndex","getTopHandRankIndex","winningIndicies","getWinningIndicies","losingIndicies","getLosingIndicies","updatedWinningIndicies","tieEquity","_ref3","_ref4","getEquity","getCards","evaluateHandStrength","handStrength","outerIndex","innerIndex","breakTies","ties","handArray","cardRanks","getRanks","cardSuits","getSuits","isStraightFlush","isQuads","isBoat","isFlush","isStraight","isSet","checkPairs","flush","flushCards","flushRanks","setIdx","getSetIdx","ranksSplice","splice","getSuit","checkedSuits","count","returnIdx","uniqueRanks","idx","array","toString","pairCount","ranksSlice","getPairIndex","getRank","handOneRank","handTwoRank","checkKicker","handOneRanks","handTwoRanks","handOne","handTwo","handRank","handOneSetIdx","handTwoSetIdx","setRank","handOneRemaining","handTwoRemaining","pairOneIdx","pairTwoIdx","suitsSlice","flushOne","flushTwo","winner","handOneIdx","handTwoIdx","handOnePairOneIdx","handTwoPairOneIdx","pairOneCompare","handOnePairTwoIdx","handTwoPairTwoIdx","pairTwoCompare","idxOne","idxTwo","bestPair","initialHand","initialBoard","3","4","5","initialState","defineProperty","Main","Switch","Route","exact","path","component","App","src","freetilt","alt","Main_Main","isLocalhost","Boolean","location","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","console","log","catch","error","tiltApp","combineReducers","action","objectSpread","increasedCount","increasedSlots","increasedRanges","decreasedSlots","decreasedRanges","addRange","removeRange","store","createStore","ReactDOM","render","BrowserRouter","react_redux_es","src_App_0","document","getElementById","URL","process","origin","addEventListener","fetch","response","status","headers","get","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.41911433.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/freetilt.638d284c.jpg\";","export const SELECT_CARD = 'SELECT_CARD'\r\nexport const SELECT_POSITION = 'SELECT_POSITION'\r\nexport const SAVE_EQUITY = 'SAVE_EQUITY'\r\nexport const CLEAR_HANDS = 'CLEAR_HANDS'\r\nexport const INCREMENT_HANDS = 'INCREMENT_HANDS'\r\nexport const DECREMENT_HANDS = 'DECREMENT_HANDS'\r\nexport const ADD_TO_RANGE = 'ADD_TO_RANGE'\r\nexport const REMOVE_FROM_RANGE = 'REMOVE_FROM_RANGE'\r\n","import * as types from './types'\r\n\r\nexport function selectCard(rank, suit) {\r\n return {\r\n type: types.SELECT_CARD,\r\n rank: rank,\r\n suit: suit\r\n }\r\n}\r\n\r\nexport function selectPosition(hand, card) {\r\n return {\r\n type: types.SELECT_POSITION,\r\n hand: hand,\r\n card: card\r\n }\r\n}\r\n\r\nexport function saveEquity(hands, board, equities) {\r\n return {\r\n type: types.SAVE_EQUITY,\r\n hands: hands,\r\n board: board,\r\n equities: equities\r\n }\r\n}\r\n\r\nexport function clearHands() {\r\n return {\r\n type: types.CLEAR_HANDS\r\n }\r\n}\r\n\r\nexport function incrementHands() {\r\n return {\r\n type: types.INCREMENT_HANDS\r\n }\r\n}\r\n\r\nexport function decrementHands() {\r\n return {\r\n type: types.DECREMENT_HANDS\r\n }\r\n}\r\n\r\nexport function addToRange(number, hand) {\r\n return {\r\n type: types.ADD_TO_RANGE,\r\n number: number,\r\n hand: hand\r\n }\r\n}\r\n\r\nexport function removeFromRange(number, hand) {\r\n return {\r\n type: types.REMOVE_FROM_RANGE,\r\n number: number,\r\n hand: hand\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { Card } from './'\r\n\r\nexport class BankCard extends React.Component {\r\n render() {\r\n const { onSelect, rank, suit, disabled } = this.props\r\n\r\n return onSelect(rank, suit)}\r\n rank={rank}\r\n suit={suit} />\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\n\r\nimport { BoardModal } from '../'\r\nimport { getSuitFromHTML } from '../../'\r\n\r\nexport class BoardButton extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n showBoardModal: false\r\n }\r\n\r\n this.toggleBoardModal = this.toggleBoardModal.bind(this)\r\n }\r\n\r\n toggleBoardModal() {\r\n this.setState({\r\n showBoardModal: !this.state.showBoardModal\r\n })\r\n }\r\n\r\n render() {\r\n const { board, onClick } = this.props\r\n\r\n return (\r\n
\r\n \r\n  \r\n {Object.values(board).map((card, i) => {\r\n const suit = getSuitFromHTML(card.suit.charCodeAt())\r\n return (\r\n \r\n {card.rank + card.suit}\r\n \r\n )\r\n })}\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\n","import * as React from 'react'\r\nimport { Card } from './'\r\n\r\nexport class BoardCard extends React.Component {\r\n render() {\r\n const { onSelect, rank, suit, disabled, isSelected } = this.props\r\n\r\n return onSelect(rank, suit)}\r\n rank={rank}\r\n suit={suit} />\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { Button } from 'react-bootstrap'\r\nimport { getSuitFromHTML } from '../../'\r\n\r\nexport class Card extends React.Component {\r\n render() {\r\n const { rank, suit, disabled, isSelected } = this.props\r\n const suitClass = suit ? getSuitFromHTML(suit.charCodeAt()) : ''\r\n const selectedClass = isSelected ? ' selectedCard' : ''\r\n\r\n return (\r\n \r\n {rank + suit}\r\n \r\n )\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { Card } from './'\r\n\r\nexport class HandCard extends React.Component {\r\n render() {\r\n const { onSelect, rank, suit, isSelected } = this.props\r\n return \r\n }\r\n}\r\n","import React from 'react'\r\nimport { Modal } from 'react-bootstrap'\r\n\r\nimport { CardBankContainer, BoardContainer } from '../'\r\n\r\nexport const BoardModal = (props) => {\r\n return (\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { formatPercentage } from '../'\r\n\r\nexport const BreakdownRow = (props) => {\r\n const title = props.ranking.toLowerCase().replace(/_/, ' ')\r\n return (\r\n \r\n {title}\r\n {props.equities.map((equity, i) =>\r\n \r\n {formatPercentage(equity[props.ranking], 2)}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\n","import * as React from 'react'\r\nimport { Col } from 'react-bootstrap'\r\nimport { unicodeSuits, ranks } from '../'\r\nimport { BankCard } from './'\r\n\r\nexport class CardBank extends React.Component {\r\n render() {\r\n const { deadCards } = this.props\r\n return (\r\n
\r\n {unicodeSuits.map((suit, i) =>\r\n \r\n {ranks.map((rank, j) => {\r\n const disabled = deadCards.includes(rank + suit) ? true : false\r\n\r\n return [\r\n ,\r\n
\r\n ]\r\n })}\r\n \r\n )}\r\n
\r\n )\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { getSuitFromHTML, formatPercentage } from '../'\r\n\r\nexport class Equity extends React.Component {\r\n render() {\r\n const { savedEquities } = this.props\r\n const hands = savedEquities[savedEquities.length - 1].hands\r\n const board = savedEquities[savedEquities.length - 1].board\r\n const handEquities = savedEquities[savedEquities.length - 1].equities\r\n\r\n return (\r\n
\r\n

Equity

\r\n \r\n \r\n {Object.entries(hands).map((hand, i) =>\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
\r\n {Object.entries(hand[1]).map((card, j) => {\r\n let suit = getSuitFromHTML(card[1].suit.charCodeAt())\r\n return (\r\n \r\n {card[1].rank + card[1].suit}\r\n \r\n )\r\n })}\r\n
\r\n {handEquities.length > 0 && formatPercentage(handEquities[i].equity, 0)}\r\n
\r\n
\r\n {(handEquities.length > 0 && +handEquities[i].equity === 1)\r\n && }\r\n
\r\n {Object.entries(board).map((card, k) => {\r\n let suit = getSuitFromHTML(card[1].suit.charCodeAt())\r\n return (\r\n \r\n {card[1].rank + card[1].suit}\r\n \r\n )\r\n })}\r\n \r\n
\r\n
\r\n )\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { Grid, Col, Row } from 'react-bootstrap'\r\n\r\nimport {\r\n BoardButtonContainer,\r\n BreakdownContainer,\r\n ClearContainer,\r\n EvaluateContainer,\r\n HandRangeContainer,\r\n IncrementContainer\r\n} from '../'\r\n\r\nexport class EquityCalculator extends React.Component {\r\n render() {\r\n const { handCount, board } = this.props\r\n\r\n let handRows = []\r\n for (let i = 0; i < handCount; i++) {\r\n handRows.push(\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n {handRows}\r\n \r\n

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n

\r\n \r\n FreeTilt is an open source project. Please report issues\r\n \r\n  here\r\n \r\n \r\n

\r\n
\r\n
\r\n \r\n )\r\n }\r\n}\r\n\r\n","import * as React from 'react'\r\nimport { HandCard } from './'\r\n\r\nexport class Hand extends React.Component {\r\n render() {\r\n const {\r\n position,\r\n onSelect,\r\n number,\r\n selectedPosition,\r\n selectedCard\r\n } = this.props\r\n\r\n return (\r\n
\r\n onSelect(number, 1)} />\r\n onSelect(number, 2)} />\r\n
\r\n )\r\n }\r\n}\r\n","import React from 'react'\r\nimport { Modal } from 'react-bootstrap'\r\n\r\nimport { CardBankContainer, HandContainer } from '../'\r\n\r\nexport const HandModal = (props) => {\r\n const { number } = props\r\n\r\n return (\r\n \r\n \r\n

Hand {number}

\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React, { Component } from 'react'\r\nimport $ from 'jquery'\r\n\r\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap'\r\nimport { HandModal, RangeModal } from './'\r\nimport {\r\n getHand,\r\n getRange,\r\n formatPercentage,\r\n} from '../'\r\n\r\nexport class HandRange extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n showHandModal: false,\r\n showRangeModal: false\r\n }\r\n\r\n this.toggleHandModal = this.toggleHandModal.bind(this)\r\n this.toggleRangeModal = this.toggleRangeModal.bind(this)\r\n }\r\n\r\n toggleHandModal() {\r\n this.setState({\r\n showHandModal: !this.state.showHandModal\r\n })\r\n }\r\n\r\n toggleRangeModal() {\r\n this.setState({\r\n showRangeModal: !this.state.showRangeModal\r\n })\r\n }\r\n\r\n render() {\r\n const {\r\n showMinus,\r\n decrement,\r\n number,\r\n savedEquities,\r\n slots,\r\n onSelect,\r\n addToRange,\r\n removeFromRange,\r\n ranges,\r\n displayEquities\r\n } = this.props\r\n\r\n const hand = slots[number]\r\n const latestEquities = savedEquities[savedEquities.length - 1]\r\n const equity = latestEquities.equities[number - 1]\r\n const removeHandTooltip = Remove Hand\r\n const range = ranges[number]\r\n const rangeLimit = ($(window).width()) > 500 ? 45 : 5\r\n\r\n return (\r\n
\r\n \r\n \r\n   \r\n {range.length === 0 && getHand(hand)}\r\n {range.length > 0 && getRange(range, rangeLimit)}\r\n   \r\n {(typeof equity !== 'undefined' && displayEquities)\r\n && {formatPercentage(equity.equity, 0)}\r\n }\r\n  \r\n {(typeof equity !== 'undefined' && displayEquities && equity.equity === 1)\r\n && \r\n }\r\n {showMinus &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n
\r\n )\r\n }\r\n}\r\n","import React, { Component } from 'react'\r\nimport { Modal } from 'react-bootstrap'\r\n\r\nimport { ranks } from '../'\r\n\r\nexport class RangeModal extends Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this.state = {\r\n adding: true\r\n }\r\n\r\n this.setAddingOrRemoving = this.setAddingOrRemoving.bind(this)\r\n this.toggleSelection = this.toggleSelection.bind(this)\r\n }\r\n\r\n setAddingOrRemoving(hand) {\r\n let adding = false\r\n\r\n if (this.props.range.indexOf(hand) === -1) {\r\n adding = true\r\n }\r\n\r\n this.setState({\r\n adding: adding\r\n }, this.toggleSelection(hand, adding))\r\n }\r\n\r\n toggleSelection(hand, adding = this.state.adding) {\r\n if (adding) {\r\n this.props.addToRange(this.props.number, hand)\r\n } else if (this.props.range.indexOf(hand) !== -1){\r\n this.props.removeFromRange(this.props.number, hand)\r\n }\r\n }\r\n\r\n render() {\r\n const { show, onClose, number, range } = this.props\r\n\r\n return (\r\n \r\n \r\n

Range {number}

\r\n
\r\n \r\n
\r\n {ranks.map((rankOne, i) => {\r\n let suited = 'o'\r\n return (\r\n
\r\n {ranks.map(rankTwo => {\r\n if (suited.length === 0) {\r\n suited = 's'\r\n }\r\n\r\n if (rankOne === rankTwo) {\r\n suited = ''\r\n }\r\n\r\n let btnClass = ''\r\n\r\n switch (suited) {\r\n case 's':\r\n btnClass = 'suitedRangeBtn'\r\n break;\r\n case 'o':\r\n btnClass = 'offsuitRangeBtn'\r\n break;\r\n default:\r\n btnClass = 'pairRangeBtn'\r\n }\r\n\r\n let hand = rankOne + rankTwo + suited\r\n\r\n if (ranks.indexOf(rankTwo) < ranks.indexOf(rankOne)) {\r\n hand = rankTwo + rankOne + suited\r\n }\r\n\r\n if (range.indexOf(hand) !== -1) {\r\n btnClass += ' selectedRangeBtn'\r\n }\r\n\r\n return (\r\n this.setAddingOrRemoving(hand)}\r\n onMouseOver={(e) => {\r\n if (e.buttons === 1) {\r\n this.toggleSelection(hand)\r\n }\r\n }}\r\n key={rankOne + rankTwo}>\r\n {hand}\r\n \r\n )\r\n })}\r\n
\r\n )\r\n })}\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}\r\n","export const HIGH_CARD = 'HIGH_CARD'\r\nexport const PAIR = 'PAIR'\r\nexport const TWO_PAIR = 'TWO_PAIR'\r\nexport const SET = 'SET'\r\nexport const STRAIGHT = 'STRAIGHT'\r\nexport const FLUSH = 'FLUSH'\r\nexport const BOAT = 'BOAT'\r\nexport const QUADS = 'QUADS'\r\nexport const STRAIGHT_FLUSH = 'STRAIGHT_FLUSH'\r\n\r\nexport const handRankings = [\r\n HIGH_CARD,\r\n PAIR,\r\n TWO_PAIR,\r\n SET,\r\n STRAIGHT,\r\n FLUSH,\r\n BOAT,\r\n QUADS,\r\n STRAIGHT_FLUSH\r\n]\r\n","export const BOARD = 0\r\n","// suit shorthand constants for eq calculation\r\nexport const SPADES = 'S'\r\nexport const HEARTS = 'H'\r\nexport const DIAMONDS = 'D'\r\nexport const CLUBS = 'C'\r\n\r\nexport const suits = [\r\n SPADES,\r\n HEARTS,\r\n DIAMONDS,\r\n CLUBS\r\n]\r\n\r\n// unicode suits\r\nexport const UNICODE_SPADES = '\\u2660'\r\nexport const UNICODE_HEARTS = '\\u2665'\r\nexport const UNICODE_DIAMONDS = '\\u2666'\r\nexport const UNICODE_CLUBS = '\\u2663'\r\n\r\nexport const unicodeSuits = [\r\n UNICODE_SPADES,\r\n UNICODE_HEARTS,\r\n UNICODE_DIAMONDS,\r\n UNICODE_CLUBS\r\n]\r\n\r\nexport const getSuitFromUnicode = (unicodeString) => {\r\n switch (unicodeString) {\r\n case UNICODE_SPADES:\r\n return SPADES\r\n case UNICODE_HEARTS:\r\n return HEARTS\r\n case UNICODE_DIAMONDS:\r\n return DIAMONDS\r\n case UNICODE_CLUBS:\r\n return CLUBS\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\n// HTML entities\r\nconst HTML_SPADES = 9824\r\nconst HTML_HEARTS = 9829\r\nconst HTML_DIAMONDS = 9830\r\nconst HTML_CLUBS = 9827\r\n\r\nexport const getSuitFromHTML = (entity) => {\r\n switch (entity) {\r\n case HTML_SPADES:\r\n return 'spades'\r\n case HTML_HEARTS:\r\n return 'hearts'\r\n case HTML_DIAMONDS:\r\n return 'diamonds'\r\n case HTML_CLUBS:\r\n return 'clubs'\r\n default:\r\n return ''\r\n }\r\n}\r\n","export const ranks = [\r\n 'A',\r\n 'K',\r\n 'Q',\r\n 'J',\r\n 'T',\r\n '9',\r\n '8',\r\n '7',\r\n '6',\r\n '5',\r\n '4',\r\n '3',\r\n '2'\r\n]\r\n","import { connect } from 'react-redux'\r\nimport { Board, BOARD, selectPosition } from '../'\r\n\r\nconst mapStateToProps = (state) => {\r\n const { selectedCard, selectedPosition } = state.equityReducer\r\n const board = state.equityReducer.slots[BOARD]\r\n\r\n return {\r\n selectedCard,\r\n selectedPosition,\r\n board\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n onSelect: (hand, card) => {\r\n dispatch(selectPosition(hand, card))\r\n }\r\n }\r\n}\r\n\r\nexport const BoardContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(Board)\r\n","import * as React from 'react'\r\nimport { BoardCard } from './buttons'\r\nimport { BOARD } from '../'\r\n\r\nexport const Board = (props) => {\r\n const {\r\n onSelect,\r\n board,\r\n selectedPosition,\r\n selectedCard\r\n } = props\r\n let boardCards = []\r\n\r\n for (let i = 0; i < 5; i++) {\r\n boardCards.push(\r\n onSelect(BOARD, i + 1)}/>\r\n )\r\n }\r\n\r\n return (\r\n
\r\n

Board

\r\n {boardCards}\r\n
\r\n )\r\n}\r\n","import { connect } from 'react-redux'\r\nimport { BoardButton } from '../components'\r\n\r\nimport { selectPosition, BOARD } from '../'\r\n\r\nconst mapStateToProps = () => {\r\n return {}\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n onClick: () => {\r\n dispatch(selectPosition(BOARD, 1))\r\n }\r\n }\r\n}\r\n\r\nexport const BoardButtonContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(BoardButton)\r\n","import { connect } from 'react-redux'\r\nimport { Breakdown } from '../'\r\n\r\nconst mapStateToProps = (state) => {\r\n const { savedEquities } = state.equityReducer\r\n const { equities, hands } = savedEquities[savedEquities.length - 1]\r\n\r\n return {\r\n equities,\r\n hands\r\n }\r\n}\r\n\r\nexport const BreakdownContainer = connect(\r\n mapStateToProps\r\n)(Breakdown)\r\n","import * as React from 'react'\r\nimport { handRankings, getHand, getRangeSummary } from '../'\r\nimport { BreakdownRow } from './'\r\n\r\nexport const Breakdown = (props) => {\r\n const { equities, hands } = props\r\n\r\n if (equities.length === 0) {\r\n return
\r\n }\r\n\r\n return (\r\n
\r\n

Breakdown

\r\n \r\n \r\n \r\n \r\n {Object.values(hands).map((range, i) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n {handRankings.map((handRanking, i) =>\r\n \r\n )}\r\n \r\n
\r\n {range.length === 1\r\n ? getHand(range[0])\r\n : getRangeSummary(range, true)}\r\n
\r\n
\r\n )\r\n}\r\n","import { connect } from 'react-redux'\r\nimport { EquityCalculator, BOARD } from '../'\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n const { handCount } = state.equityReducer\r\n const board = state.equityReducer.slots[BOARD]\r\n\r\n return {\r\n handCount,\r\n board\r\n }\r\n}\r\n\r\nexport const CalculatorContainer = connect(mapStateToProps)(EquityCalculator)\r\n","import { connect } from 'react-redux'\r\nimport { CardBank, selectCard } from '../'\r\n\r\nconst mapStateToProps = (state) => {\r\n const { slots } = state.equityReducer\r\n let deadCards = []\r\n Object.entries(slots).map((slot) => {\r\n const limit = Object.keys(slot[1]).length + 1\r\n for (let i = 1; i < limit; i++) {\r\n if (slot[1][i].rank && slot[1][i].suit) {\r\n deadCards.push(slot[1][i].rank + slot[1][i].suit)\r\n }\r\n }\r\n return true\r\n })\r\n\r\n return {\r\n deadCards\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n onSelect: (rank, suit) => {\r\n dispatch(selectCard(rank, suit))\r\n }\r\n }\r\n}\r\n\r\nexport const CardBankContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(CardBank)\r\n","import { connect } from 'react-redux'\r\nimport { ClearButton, clearHands } from '../'\r\n\r\nconst mapStateToProps = () => {\r\n return {}\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n onClick: () => dispatch(clearHands())\r\n }\r\n}\r\n\r\nexport const ClearContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(ClearButton)\r\n","import * as React from 'react'\r\n\r\nexport const ClearButton = (props) => {\r\n return (\r\n \r\n Clear\r\n \r\n )\r\n}\r\n","import { connect } from 'react-redux'\r\nimport {\r\n EvaluateButton,\r\n saveEquity,\r\n getHandsFromSlots,\r\n getHandsFromRangeHand,\r\n getRangeEquity,\r\n BOARD\r\n} from '../'\r\n\r\nconst mapStateToProps = (state) => {\r\n const { slots, ranges, savedEquities } = state.equityReducer\r\n const hands = getHandsFromSlots(slots)\r\n let disabled = false\r\n\r\n for (let i = 1; i < 3; i++) {\r\n if (ranges[i].length === 0 &&\r\n (hands[i][1].rank.length === 0 || hands[i][2].rank.length === 0)\r\n ) {\r\n disabled = true\r\n }\r\n }\r\n\r\n return {\r\n slots,\r\n ranges,\r\n savedEquities,\r\n disabled\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n saveEquity: (slots, ranges, savedEquities) => {\r\n let hands = getHandsFromSlots(slots)\r\n //let savedEquity = []\r\n let board = {}\r\n board = slots[BOARD]\r\n\r\n //for (let i = 0; i < savedEquities.length; i++) {\r\n //if (JSON.stringify(savedEquities[i].hands) === JSON.stringify(hands)\r\n //&& JSON.stringify(savedEquities[i].board) === JSON.stringify(board)\r\n //) {\r\n //savedEquity = savedEquities[i].equities\r\n //}\r\n //}\r\n\r\n //const handEquities = savedEquity.length > 0 ? savedEquity : getHandEquity(hands, board)\r\n\r\n let rangeHands = []\r\n\r\n Object.values(ranges).forEach((range, i) => {\r\n if (range.length > 0) {\r\n rangeHands[i] = []\r\n }\r\n\r\n range.forEach(rangeHand => {\r\n rangeHands[i] = rangeHands[i].concat(getHandsFromRangeHand(rangeHand))\r\n })\r\n })\r\n\r\n rangeHands.forEach((range, i) => {\r\n if (rangeHands[i].length > 0) {\r\n hands[i + 1] = rangeHands[i]\r\n }\r\n })\r\n\r\n Object.values(hands).forEach((hand, i) => {\r\n if (!Array.isArray(hands[i + 1])) {\r\n hands[i + 1] = [hands[i + 1]]\r\n }\r\n })\r\n\r\n const handEquities = getRangeEquity(hands, board)\r\n dispatch(saveEquity(hands, board, handEquities))\r\n }\r\n }\r\n}\r\n\r\nexport const EvaluateContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(EvaluateButton)\r\n","import { connect } from 'react-redux'\r\nimport { Equity} from '../'\r\n\r\nconst mapStateToProps = (state) => {\r\n const { savedEquities } = state.equityReducer\r\n\r\n return {\r\n savedEquities\r\n }\r\n}\r\n\r\nexport const EquityContainer = connect(\r\n mapStateToProps\r\n)(Equity)\r\n","import * as React from 'react'\r\n\r\nexport const EvaluateButton = (props) => {\r\n const { slots, ranges, savedEquities } = props\r\n\r\n return (\r\n props.saveEquity(slots, ranges, savedEquities)}>\r\n Evaluate\r\n \r\n )\r\n}\r\n","import { connect } from 'react-redux'\r\nimport { Hand } from '../'\r\nimport { selectPosition, incrementHands, decrementHands } from '../'\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n const { selectedCard, selectedPosition, handCount } = state.equityReducer\r\n const { number } = ownProps\r\n const position = state.equityReducer.slots[number]\r\n const showPlus = number === handCount\r\n const showMinus = number === handCount && handCount > 2\r\n\r\n return {\r\n position,\r\n selectedCard,\r\n selectedPosition,\r\n showPlus,\r\n showMinus\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n onSelect: (hand, card) => {\r\n dispatch(selectPosition(hand, card))\r\n },\r\n increment: () => dispatch(incrementHands()),\r\n decrement: () => dispatch(decrementHands())\r\n }\r\n}\r\n\r\nexport const HandContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(Hand)\r\n","import { connect } from 'react-redux'\r\nimport { HandRange } from '../components'\r\nimport {\r\n selectPosition,\r\n decrementHands,\r\n addToRange,\r\n removeFromRange\r\n} from '../'\r\n\r\nconst mapStateToProps = (state, ownProps) => {\r\n const {\r\n selectedCard,\r\n selectedPosition,\r\n handCount,\r\n savedEquities,\r\n slots,\r\n ranges,\r\n displayEquities\r\n } = state.equityReducer\r\n const { number } = ownProps\r\n const position = state.equityReducer.slots[number]\r\n const showMinus = number === handCount && handCount > 2\r\n\r\n return {\r\n position,\r\n selectedCard,\r\n selectedPosition,\r\n showMinus,\r\n savedEquities,\r\n slots,\r\n ranges,\r\n displayEquities\r\n }\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n onSelect: (hand, card) => {\r\n dispatch(selectPosition(hand, card))\r\n },\r\n decrement: () => dispatch(decrementHands()),\r\n addToRange: (number, hand) => dispatch(addToRange(number, hand)),\r\n removeFromRange: (number, hand) => dispatch(removeFromRange(number, hand))\r\n }\r\n}\r\n\r\nexport const HandRangeContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(HandRange)\r\n","import { connect } from 'react-redux'\r\nimport { Increment } from '../components'\r\nimport { incrementHands } from '../'\r\n\r\nconst mapStateToProps = () => {\r\n return {}\r\n}\r\n\r\nconst mapDispatchToProps = (dispatch) => {\r\n return {\r\n increment: () => dispatch(incrementHands()),\r\n }\r\n}\r\n\r\nexport const IncrementContainer = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(Increment)\r\n","import React from 'react'\r\n\r\nimport { Tooltip, OverlayTrigger } from 'react-bootstrap'\r\n\r\nexport const Increment = (props) => {\r\n const { increment } = props\r\n const tooltip = Add Hand\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport {\r\n getSuitFromUnicode,\r\n getSuitFromHTML,\r\n ranks,\r\n unicodeSuits\r\n} from '../'\r\n\r\nexport const getCardStringFromObj = (card) => {\r\n return card.rank + getSuitFromUnicode(card.suit)\r\n}\r\n\r\nexport const getHandsFromRangeHand = (rangeHand) => {\r\n let hands = []\r\n\r\n if (rangeHand.indexOf('s') !== -1) { // suited\r\n unicodeSuits.forEach(suit => {\r\n hands.push({\r\n 1: {\r\n rank: rangeHand[0],\r\n suit: suit\r\n },\r\n 2: {\r\n rank: rangeHand[1],\r\n suit: suit\r\n }\r\n })\r\n })\r\n } else if (rangeHand.indexOf('o') !== -1 ) { // offsuit\r\n unicodeSuits.forEach(suitOne => {\r\n unicodeSuits.forEach(suitTwo => {\r\n if (suitOne !== suitTwo) {\r\n hands.push({\r\n 1: {\r\n rank: rangeHand[0],\r\n suit: suitOne\r\n },\r\n 2: {\r\n rank: rangeHand[1],\r\n suit: suitTwo\r\n }\r\n })\r\n }\r\n })\r\n })\r\n } else { // pair\r\n unicodeSuits.forEach((suitOne, i) => {\r\n unicodeSuits.forEach((suitTwo, j) => {\r\n if (suitOne !== suitTwo && j > i) {\r\n hands.push({\r\n 1: {\r\n rank: rangeHand[0],\r\n suit: suitOne\r\n },\r\n 2: {\r\n rank: rangeHand[1],\r\n suit: suitTwo\r\n }\r\n })\r\n }\r\n })\r\n })\r\n }\r\n\r\n return hands\r\n}\r\n\r\nexport const getHandsFromSlots = (slots) => {\r\n const handCount = Object.keys(slots).length\r\n let hands = {}\r\n\r\n for (let i = 1; i < handCount; i++) {\r\n hands[i] = slots[i]\r\n }\r\n\r\n return hands\r\n}\r\n\r\nexport const formatPercentage = (number, decimalPlaces) => {\r\n if (number > 0.99 && number !== 1) {\r\n return '>99%'\r\n }\r\n if (number < 0.01 && number !== 0) {\r\n return '<1%'\r\n }\r\n return (number * 100).toFixed(decimalPlaces) + '%'\r\n}\r\n\r\nexport const getHand = (hand) => {\r\n let formattedHand = []\r\n\r\n Object.values(hand).forEach((card, i) => {\r\n const suit = getSuitFromHTML(card.suit.charCodeAt())\r\n formattedHand.push(\r\n \r\n {card.rank + card.suit}\r\n \r\n )\r\n })\r\n\r\n return formattedHand\r\n}\r\n\r\nconst getPairSummary = (pairs) => {\r\n const sortedPairs = pairs.sort((a, b) => ranks.indexOf(a[0]) - ranks.indexOf(b[0]))\r\n let pairRanges = [{\r\n highest: '',\r\n lowest: ''\r\n }]\r\n\r\n sortedPairs.forEach((pair, i) => {\r\n const currentRange = pairRanges.length - 1\r\n\r\n if (pairRanges[currentRange].highest.length === 0) {\r\n pairRanges[currentRange].highest = pair\r\n }\r\n\r\n if ((i + 1) === sortedPairs.length) {\r\n pairRanges[currentRange].lowest = pair\r\n } else if (ranks.indexOf(sortedPairs[i + 1][0]) - ranks.indexOf(sortedPairs[i][0]) !== 1) {\r\n pairRanges[currentRange].lowest = pair\r\n pairRanges.push({\r\n highest: '',\r\n lowest: ''\r\n })\r\n }\r\n })\r\n\r\n let pairSummary = ''\r\n\r\n pairRanges.forEach((pairRange, i) => {\r\n pairSummary += pairRange.highest\r\n\r\n if (pairRange.highest !== pairRange.lowest) {\r\n pairSummary += '-' + pairRange.lowest\r\n }\r\n if (pairRanges.length === 1 && sortedPairs.indexOf('AA') !== -1 && sortedPairs.length > 1) {\r\n pairSummary = pairRange.lowest + '+'\r\n }\r\n if ((i + 1) < pairRanges.length) {\r\n pairSummary += ', '\r\n }\r\n })\r\n\r\n return pairSummary\r\n}\r\n\r\nconst getNonPairSummary = (nonPairs, pairs, rangeSummary, limit) => {\r\n nonPairs.forEach((hand, i) => {\r\n if (i === 0 && pairs.length > 0) {\r\n rangeSummary += ', '\r\n }\r\n\r\n if (rangeSummary.length < limit) {\r\n rangeSummary += hand\r\n\r\n if ((i + 1) < nonPairs.length) {\r\n rangeSummary += ', '\r\n }\r\n } else if (rangeSummary.indexOf('...') === -1) {\r\n rangeSummary = rangeSummary.slice(0, -2) + '...'\r\n }\r\n })\r\n\r\n return rangeSummary\r\n}\r\n\r\nexport const getRange = (range, limit = 45) => {\r\n const pairs = range.filter(hand => hand.length === 2)\r\n const nonPairs = range.filter(hand => hand.length === 3)\r\n let rangeSummary = getPairSummary(pairs)\r\n\r\n return getNonPairSummary(nonPairs, pairs, rangeSummary, limit)\r\n}\r\n\r\nexport const getRangeSummary = (range) => {\r\n let pairs = []\r\n let nonPairs = []\r\n\r\n range.forEach(hand => {\r\n const firstCard = hand[1].rank\r\n const secondCard = hand[2].rank\r\n const handRanks = firstCard + secondCard\r\n\r\n if (firstCard === secondCard && pairs.indexOf(handRanks) === -1) {\r\n pairs.push(handRanks)\r\n } else if (firstCard !== secondCard && nonPairs.indexOf(handRanks) === -1) {\r\n nonPairs.push(firstCard + secondCard)\r\n }\r\n })\r\n\r\n let rangeSummary = getPairSummary(pairs)\r\n\r\n return getNonPairSummary(nonPairs, pairs, rangeSummary, 5)\r\n}\r\n","import { ranks, suits, unicodeSuits } from '../'\r\nimport { getSuitFromUnicode } from '../constants'\r\n\r\nexport const generateCard = () => {\r\n const rank = ranks[Math.floor(Math.random() * ranks.length)]\r\n const suit = suits[Math.floor(Math.random() * suits.length)]\r\n\r\n return rank + suit\r\n}\r\n\r\nexport const generateCardObject = (rank, suit) => {\r\n return {\r\n rank: rank,\r\n suit: suit\r\n }\r\n}\r\n\r\nexport const getCards = () => {\r\n let cards = {}\r\n\r\n ranks.forEach((rank) => {\r\n unicodeSuits.forEach((suit) => {\r\n cards[rank + getSuitFromUnicode(suit)] = generateCardObject(rank, suit)\r\n })\r\n })\r\n\r\n return cards\r\n}\r\n\r\nexport const generateBoard = (hands, existingBoard = []) => {\r\n let board = []\r\n\r\n for (let i = 0; i < 5; i++) {\r\n if (existingBoard[i].length > 0) {\r\n board.push(existingBoard[i])\r\n continue\r\n }\r\n let card = generateCard()\r\n let decrement = false\r\n\r\n for (let i = 0; i < hands.length; i++) {\r\n if (board.indexOf(card) !== -1\r\n || hands[i].indexOf(card) !== -1\r\n ) {\r\n decrement = true\r\n }\r\n }\r\n if (decrement) {\r\n i--\r\n continue\r\n }\r\n board.push(card)\r\n }\r\n\r\n return board\r\n}\r\n","import * as handRanks from '../constants/handRanks'\r\nimport { ranks, handRankings } from '../'\r\nimport { getCardStringFromObj, generateBoard } from './'\r\n\r\nconst getComparisons = (ranges, comparisons, hands, index) => {\r\n ranges[index].forEach(hand => {\r\n const newHands = Object.assign({}, hands)\r\n const newHand = Object.assign({}, hand)\r\n newHands[index] = newHand\r\n\r\n if (Object.keys(newHands).length === Object.keys(ranges).length) {\r\n comparisons.push(newHands)\r\n }\r\n\r\n if (index + 1 <= Object.keys(ranges).length) {\r\n getComparisons(ranges, comparisons, newHands, index + 1)\r\n }\r\n })\r\n\r\n return comparisons\r\n}\r\n\r\nexport const getRangeEquity = (ranges, board) => {\r\n let breakdowns = []\r\n const comparisons = getComparisons(ranges, [], {}, 1)\r\n let iterations = 10000 - (comparisons.length * 100)\r\n\r\n if (iterations < 5) {\r\n iterations = 5\r\n }\r\n\r\n comparisons.forEach((hands, i) => {\r\n if (isValidComparison(hands, board)) {\r\n breakdowns.push(getHandEquity(hands, board, iterations))\r\n }\r\n })\r\n\r\n let finalBreakdown = []\r\n\r\n breakdowns.forEach(breakdown => {\r\n breakdown.forEach((rangeBreakdown, i) => {\r\n if (typeof finalBreakdown[i] === 'undefined') {\r\n finalBreakdown[i] = {}\r\n }\r\n\r\n Object.entries(rangeBreakdown).forEach(([key, value]) => {\r\n if (typeof finalBreakdown[i][key] === 'undefined') {\r\n finalBreakdown[i][key] = 0\r\n }\r\n finalBreakdown[i][key] += (value / breakdowns.length)\r\n })\r\n })\r\n })\r\n\r\n return finalBreakdown\r\n}\r\n\r\n/**\r\n * Validate that no cards are duplicated\r\n *\r\n * @param {object} hands\r\n * @param {object} board\r\n * @return bool\r\n */\r\nconst isValidComparison = (hands, board) => {\r\n let cards = []\r\n\r\n Object.values(hands).forEach(hand => {\r\n Object.values(hand).forEach(card => {\r\n if (card.rank.length > 0) {\r\n cards.push(JSON.stringify(card))\r\n }\r\n })\r\n })\r\n\r\n Object.values(board).forEach(card => {\r\n if (card.rank.length > 0) {\r\n cards.push(JSON.stringify(card))\r\n }\r\n })\r\n\r\n let hasDuplicates = false\r\n\r\n cards.forEach((card, i) => {\r\n if (cards.indexOf(card, (i + 1)) !== -1) {\r\n hasDuplicates = true\r\n }\r\n })\r\n\r\n return !hasDuplicates\r\n}\r\n\r\n/**\r\n * Calculate hand equities\r\n *\r\n * @param {object} hands\r\n * {\r\n * 1: {\r\n * 1: {\r\n * rank: \"q\",\r\n * suit: unicode suit string\r\n * },\r\n * 2: {\r\n * rank: \"j\",\r\n * suit: unicode suit string\r\n * }\r\n * },\r\n * 2: same structure as hand one,\r\n * n: a variable number of hands can be submitted\r\n * }\r\n *\r\n * @param {object} board\r\n * {\r\n * 1: {\r\n * rank: \"K\",\r\n * suit: unicode suit string\r\n * },\r\n * 2, 3, 4, 5 same structure as 1\r\n * Empty cards will still be passed but have empty strings for rank & suit\r\n * }\r\n */\r\nexport const getHandEquity = (hands, board, iterations = 10000) => {\r\n if (!isValidInput(hands)) {\r\n return []\r\n }\r\n\r\n const boardCards = getBoardCards(board)\r\n const handCount = Object.keys(hands).length\r\n let { breakdowns, wins, tieEquities } = initializeEquityVariables(handCount)\r\n\r\n for (let i = 0; i < iterations; i++) {\r\n const holeCards = getHoleCards(hands, handCount)\r\n const fullBoard = generateBoard(holeCards, boardCards)\r\n const { handCards, handStrengths, updatedBreakdowns } = evaluateHands(breakdowns, handCount, hands, fullBoard)\r\n breakdowns = updatedBreakdowns\r\n const topHandRankIndex = getTopHandRankIndex(handStrengths)\r\n const winningIndicies = getWinningIndicies(handStrengths, topHandRankIndex)\r\n\r\n if (winningIndicies.length === 1) {\r\n wins[winningIndicies[0]]++\r\n } else {\r\n const losingIndicies = getLosingIndicies(winningIndicies, handCards, topHandRankIndex)\r\n const updatedWinningIndicies = winningIndicies.filter(index => losingIndicies.indexOf(index) === -1)\r\n\r\n if (updatedWinningIndicies.length === 1) {\r\n wins[updatedWinningIndicies[0]]++\r\n } else {\r\n const tieEquity = ((1 / updatedWinningIndicies.length) * (1 / iterations))\r\n\r\n updatedWinningIndicies.forEach(index => {\r\n tieEquities[index] += tieEquity\r\n })\r\n }\r\n }\r\n }\r\n\r\n breakdowns.forEach((breakdown, i) => {\r\n Object.entries(breakdown).forEach(([key, value]) => {\r\n breakdowns[i][key] = value / iterations\r\n })\r\n breakdowns[i]['equity'] = getEquity(wins[i], tieEquities[i], iterations)\r\n })\r\n\r\n return breakdowns\r\n}\r\n\r\nconst isValidInput = (hands) => {\r\n if (getCards(hands[1]).indexOf('') !== -1\r\n || getCards(hands[2]).indexOf('') !== -1\r\n ) {\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nconst getBoardCards = (board) => {\r\n let boardCards = []\r\n for (let j = 1; j < 6; j++) {\r\n boardCards.push(getCardStringFromObj(board[j]))\r\n }\r\n return boardCards\r\n}\r\n\r\nconst initializeEquityVariables = (handCount) => {\r\n let wins = []\r\n let tieEquities = []\r\n let breakdowns = []\r\n for (let i = 0; i < handCount; i++) {\r\n wins.push(0)\r\n tieEquities.push(0)\r\n breakdowns.push({})\r\n for (let j = 0; j < handRankings.length; j++) {\r\n breakdowns[i][handRankings[j]] = 0\r\n }\r\n }\r\n\r\n return { breakdowns, wins, tieEquities }\r\n}\r\n\r\nconst getHoleCards = (hands, handCount) => {\r\n let holeCards = []\r\n for (let i = 0; i < handCount; i++) {\r\n holeCards.push(getCards(hands[i + 1]))\r\n }\r\n return holeCards\r\n}\r\n\r\nconst evaluateHands = (breakdowns, handCount, hands, fullBoard) => {\r\n let handCards = []\r\n let handStrengths = []\r\n for (let j = 0; j < handCount; j++) {\r\n handCards.push(getCards(hands[j + 1], fullBoard))\r\n handStrengths.push(evaluateHandStrength(handCards[j]))\r\n breakdowns[j][handStrengths[j]]++\r\n }\r\n\r\n return { handCards, handStrengths, updatedBreakdowns: breakdowns }\r\n}\r\n\r\nconst getTopHandRankIndex = (handStrengths) => {\r\n let topHandRankIndex = 0\r\n handStrengths.forEach(handStrength => {\r\n if (handRankings.indexOf(handStrength) > topHandRankIndex) {\r\n topHandRankIndex = handRankings.indexOf(handStrength)\r\n }\r\n })\r\n\r\n return topHandRankIndex\r\n}\r\n\r\nconst getWinningIndicies = (handStrengths, topHandRankIndex) => {\r\n let winningIndicies = []\r\n handStrengths.forEach((handStrength, i) => {\r\n if (handRankings.indexOf(handStrength) === topHandRankIndex) {\r\n winningIndicies.push(i)\r\n }\r\n })\r\n\r\n return winningIndicies\r\n}\r\n\r\nconst getLosingIndicies = (winningIndicies, handCards, topHandRankIndex) => {\r\n let losingIndicies = []\r\n winningIndicies.forEach((outerIndex) => {\r\n winningIndicies.forEach((innerIndex) => {\r\n if (innerIndex > outerIndex) {\r\n const tieWinner = breakTies(\r\n handCards[outerIndex],\r\n handCards[innerIndex],\r\n handRankings[topHandRankIndex]\r\n )\r\n switch (tieWinner) {\r\n case 1:\r\n if (losingIndicies.indexOf(innerIndex) === -1) {\r\n losingIndicies.push(innerIndex)\r\n }\r\n break\r\n case 2:\r\n if (losingIndicies.indexOf(outerIndex) === -1) {\r\n losingIndicies.push(outerIndex)\r\n }\r\n break\r\n default:\r\n }\r\n }\r\n })\r\n })\r\n\r\n return losingIndicies\r\n}\r\n\r\nconst getEquity = (wins, ties, iterations) => ((wins / iterations) + ties)\r\n\r\nconst getCards = (hand, board = []) => {\r\n let handArray = []\r\n\r\n Object.entries(hand).map((card) =>\r\n handArray.push(getCardStringFromObj(card[1]))\r\n )\r\n\r\n return board.length > 0 ? board.concat(handArray) : handArray\r\n}\r\n\r\n/**\r\n * Evaluate hand strength\r\n *\r\n * @param {array} cards ['JD', '8C', '2H', ...]\r\n */\r\nconst evaluateHandStrength = (cards) => {\r\n cards.sort((a, b) => {\r\n return ranks.indexOf(a[0]) - ranks.indexOf(b[0])\r\n })\r\n\r\n let cardRanks = getRanks(cards)\r\n let cardSuits = getSuits(cards)\r\n\r\n if (isStraightFlush(cards)) {\r\n return handRanks.STRAIGHT_FLUSH\r\n }\r\n\r\n if (isQuads(cardRanks)) {\r\n return handRanks.QUADS\r\n }\r\n\r\n if (isBoat(cardRanks)) {\r\n return handRanks.BOAT\r\n }\r\n\r\n if (isFlush(cardSuits)) {\r\n return handRanks.FLUSH\r\n }\r\n\r\n if (isStraight(cardRanks)) {\r\n return handRanks.STRAIGHT\r\n }\r\n\r\n if (isSet(cardRanks)) {\r\n return handRanks.SET\r\n }\r\n\r\n const pairCount = checkPairs(cardRanks)\r\n\r\n switch (pairCount) {\r\n case 2:\r\n return handRanks.TWO_PAIR\r\n case 1:\r\n return handRanks.PAIR\r\n default:\r\n return handRanks.HIGH_CARD\r\n }\r\n}\r\n\r\n/**\r\n * Check for straight flush\r\n *\r\n * @param {array} cards ['AH', 'KS', '2D', ...]\r\n * @return {bool}\r\n */\r\nconst isStraightFlush = (cards) => {\r\n const cardSuits = getSuits(cards)\r\n const flush = isFlush(cardSuits, true)\r\n\r\n if (flush) {\r\n const flushCards = cards.filter((card) => card[1] === flush)\r\n const flushRanks = getRanks(flushCards)\r\n\r\n if (isStraight(flushRanks)) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Check if a hand has four of a kind\r\n *\r\n * @param {array} ranks ['T', '7', '2', ...]\r\n * @return {bool}\r\n */\r\nconst isQuads = (ranks) => {\r\n for (let i = 0; i < ranks.length - 2; i++) {\r\n if (ranks.indexOf(ranks[i], i + 1) > 0\r\n && ranks.indexOf(ranks[i], i + 2) > 0\r\n && ranks.indexOf(ranks[i], i + 3) > 0\r\n ) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Check for full house\r\n *\r\n * @param {array} ranks ['T', '7', '2', ...]\r\n * @return {bool}\r\n */\r\nconst isBoat = (cardRanks) => {\r\n const setIdx = getSetIdx(cardRanks)\r\n\r\n if (setIdx > -1) {\r\n const ranksSplice = cardRanks.slice()\r\n ranksSplice.splice(setIdx, 3)\r\n\r\n let pairs = checkPairs(ranksSplice)\r\n\r\n if (pairs > 0) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Check for flush\r\n *\r\n * @param {array} cardSuits ['H', 'D', 'C', ...]\r\n * @return {bool}\r\n */\r\nconst isFlush = (cardSuits, getSuit = false) => {\r\n let checkedSuits = []\r\n\r\n for (let i = 0; i < cardSuits.length - 4; i++) {\r\n let count = 1\r\n\r\n if (checkedSuits.indexOf(cardSuits[i]) === -1) {\r\n for (let j = i + 1; j < cardSuits.length; j++) {\r\n if (cardSuits[j] === cardSuits[i]) {\r\n count++\r\n\r\n if (count === 5) {\r\n return getSuit ? cardSuits[i] : true\r\n }\r\n }\r\n checkedSuits.push(cardSuits[i])\r\n }\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Check for straight\r\n *\r\n * @param {array} ranks ['T', '7', '2', ...]\r\n * @return {bool} || {int}\r\n */\r\nconst isStraight = (cardRanks, returnIdx = false) => {\r\n const uniqueRanks = cardRanks.filter((rank, idx, array) => array.indexOf(rank) === idx)\r\n\r\n if (uniqueRanks.length > 4) {\r\n for (let i = 0; i < uniqueRanks.length - 4; i++) {\r\n const idx = ranks.indexOf(uniqueRanks[i])\r\n\r\n if (ranks.slice(idx, idx + 5).toString() === uniqueRanks.slice(i, i + 5).toString()) {\r\n return returnIdx ? cardRanks.indexOf(uniqueRanks[i]) : true\r\n }\r\n\r\n // check for wheel straight\r\n if (uniqueRanks[i] === 'A'\r\n && uniqueRanks.indexOf('5') > 0\r\n && uniqueRanks.indexOf('4') > 0\r\n && uniqueRanks.indexOf('3') > 0\r\n && uniqueRanks.indexOf('2') > 0\r\n ) {\r\n return returnIdx ? cardRanks.indexOf('5') : true\r\n }\r\n }\r\n }\r\n\r\n return false\r\n}\r\n\r\n/**\r\n * Check if a hand has three of a kind\r\n *\r\n * @param {array} ranks ['T', '7', '2', ...]\r\n * @return {bool}\r\n */\r\nconst isSet = (ranks) => {\r\n for (let i = 0; i < ranks.length - 2; i++) {\r\n if (ranks.indexOf(ranks[i], i + 1) > 0 && ranks.indexOf(ranks[i], i + 2) > 0) {\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * Get set index\r\n *\r\n * @param {array} ranks ['T', '7', '2', ...]\r\n * @return {integer}\r\n */\r\nconst getSetIdx = (ranks) => {\r\n for (let i = 0; i < ranks.length - 2; i++) {\r\n if (ranks.indexOf(ranks[i], i + 1) > 0 && ranks.indexOf(ranks[i], i + 2) > 0) {\r\n return i\r\n }\r\n }\r\n return -1\r\n}\r\n\r\n/**\r\n * Check for pairs\r\n *\r\n * @param {array} ranks ['T', '7', '2', ...]\r\n * @return {integer} pair count\r\n */\r\nconst checkPairs = (ranks) => {\r\n let pairCount = 0\r\n let j = 0\r\n let ranksSlice = ranks.slice()\r\n\r\n for (let i = 0; i < ranksSlice.length - 1; i++) {\r\n let index = getPairIndex(ranksSlice.slice(i - j))\r\n\r\n if (index >= 0) {\r\n pairCount++\r\n\r\n if (pairCount === 2) {\r\n return pairCount\r\n }\r\n\r\n ranksSlice.splice(index, 2)\r\n j = 2\r\n }\r\n }\r\n\r\n return pairCount\r\n}\r\n\r\n/**\r\n * Get pair index\r\n *\r\n * @param array ranks ['K', 'T', '7', ...]\r\n * @return {integer} index of first pair card\r\n */\r\nconst getPairIndex = (ranks) => {\r\n for (let i = 0; i < ranks.length - 1; i++) {\r\n if (ranks.indexOf(ranks[i], i + 1) > 0) {\r\n return i\r\n }\r\n }\r\n return -1\r\n}\r\n\r\n/**\r\n * Get array of ranks from array of cards\r\n * Useful for calculating suit ignorant hands\r\n *\r\n * @param {array} cards ['AH', 'KS', '2D', ...]\r\n * @return {array} ranks ['A', 'K', '2', ...]\r\n */\r\nconst getRanks = (cards) => {\r\n let ranks = []\r\n for (let i = 0; i < cards.length; i++) {\r\n ranks.push(cards[i][0])\r\n }\r\n return ranks\r\n}\r\n\r\n/**\r\n * Get array of suits from array of cards\r\n * Useful for calculating rank ignorant hands\r\n *\r\n * @param {array} cards ['AH', 'KS', '2D', ...]\r\n * @return {array} ranks ['H', 'S', 'D', ...]\r\n */\r\nconst getSuits = (cards) => {\r\n let suits = []\r\n for (let i = 0; i < cards.length; i++) {\r\n suits.push(cards[i][1])\r\n }\r\n return suits\r\n}\r\n\r\nconst getRank = (handOneRank, handTwoRank) => {\r\n if (ranks.indexOf(handOneRank) < ranks.indexOf(handTwoRank)) {\r\n return 1\r\n } else if (ranks.indexOf(handOneRank) > ranks.indexOf(handTwoRank)) {\r\n return 2\r\n }\r\n return 0\r\n}\r\n\r\nexport const checkKicker = (handOneRanks, handTwoRanks) => {\r\n for (let i = 0; i < 5; i++) {\r\n if (handOneRanks[i] === handTwoRanks[i]) {\r\n continue\r\n }\r\n return getRank(handOneRanks[i], handTwoRanks[i])\r\n }\r\n return 0\r\n}\r\n\r\nexport const breakTies = (handOne, handTwo, handRank) => {\r\n const handOneRanks = getRanks(handOne)\r\n const handTwoRanks = getRanks(handTwo)\r\n\r\n switch (handRank) {\r\n case handRanks.BOAT:\r\n const handOneSetIdx = getSetIdx(handOneRanks)\r\n const handTwoSetIdx = getSetIdx(handTwoRanks)\r\n const setRank = getRank(handOneRanks[handOneSetIdx], handTwoRanks[handTwoSetIdx])\r\n\r\n if (setRank > 0) {\r\n return setRank\r\n }\r\n\r\n let handOneRemaining = handOneRanks.slice()\r\n let handTwoRemaining = handTwoRanks.slice()\r\n\r\n handOneRemaining.splice(handOneSetIdx, 3)\r\n handTwoRemaining.splice(handTwoSetIdx, 3)\r\n\r\n const pairOneIdx = getPairIndex(handOneRanks)\r\n const pairTwoIdx = getPairIndex(handTwoRanks)\r\n\r\n return getRank(handOneRanks[pairOneIdx], handTwoRanks[pairTwoIdx])\r\n case handRanks.FLUSH:\r\n let suits = getSuits(handOne)\r\n let suit = ''\r\n\r\n for (let i = 0; i < suits.length; i++) {\r\n let idx = suits.indexOf(suits[i], i + 1)\r\n\r\n if (idx > -1) {\r\n let suitsSlice = suits.slice()\r\n suitsSlice.splice(idx, 1)\r\n\r\n if (suitsSlice.indexOf(suits[i], i + 1)) {\r\n suit = suits[i]\r\n break\r\n }\r\n }\r\n }\r\n\r\n const flushOne = handOne.filter((card) => card[1] === suit)\r\n const flushTwo = handTwo.filter((card) => card[1] === suit)\r\n\r\n let winner = 0\r\n for (let j = 0; j < 5; j++) {\r\n if (typeof flushOne[j] !== 'undefined' && typeof flushTwo[j] !== 'undefined') {\r\n winner = getRank(flushOne[j][0], flushTwo[j][0])\r\n }\r\n\r\n if (winner > 0) {\r\n break\r\n }\r\n }\r\n\r\n return winner\r\n case handRanks.STRAIGHT:\r\n const handOneIdx = isStraight(handOneRanks, true)\r\n const handTwoIdx = isStraight(handTwoRanks, true)\r\n\r\n return getRank(handOneRanks[handOneIdx], handTwoRanks[handTwoIdx])\r\n case handRanks.TWO_PAIR:\r\n const handOnePairOneIdx = getPairIndex(handOneRanks)\r\n const handTwoPairOneIdx = getPairIndex(handTwoRanks)\r\n const pairOneCompare = getRank(handOneRanks[handOnePairOneIdx], handTwoRanks[handTwoPairOneIdx])\r\n\r\n if (pairOneCompare > 0) {\r\n return pairOneCompare\r\n }\r\n\r\n handOneRanks.splice(handOnePairOneIdx, 2)\r\n handTwoRanks.splice(handTwoPairOneIdx, 2)\r\n\r\n const handOnePairTwoIdx = getPairIndex(handOneRanks)\r\n const handTwoPairTwoIdx = getPairIndex(handTwoRanks)\r\n const pairTwoCompare = getRank(handOneRanks[handOnePairTwoIdx], handTwoRanks[handTwoPairTwoIdx])\r\n\r\n if (pairTwoCompare > 0) {\r\n return pairTwoCompare\r\n }\r\n\r\n handOneRanks.splice(handOnePairTwoIdx, 2)\r\n handTwoRanks.splice(handTwoPairTwoIdx, 2)\r\n\r\n return getRank(handOneRanks[0], handTwoRanks[0])\r\n case handRanks.QUADS:\r\n case handRanks.SET:\r\n case handRanks.PAIR:\r\n const idxOne = getPairIndex(handOneRanks)\r\n const idxTwo = getPairIndex(handTwoRanks)\r\n const bestPair = getRank(handOneRanks[idxOne], handTwoRanks[idxTwo])\r\n\r\n if (bestPair > 0) {\r\n return bestPair\r\n }\r\n return checkKicker(handOneRanks, handTwoRanks)\r\n case handRanks.HIGH_CARD:\r\n return checkKicker(handOneRanks, handTwoRanks)\r\n default:\r\n return 0\r\n }\r\n}\r\n","import {\r\n SELECT_CARD,\r\n SELECT_POSITION,\r\n SAVE_EQUITY,\r\n CLEAR_HANDS,\r\n INCREMENT_HANDS,\r\n DECREMENT_HANDS,\r\n BOARD,\r\n ADD_TO_RANGE,\r\n REMOVE_FROM_RANGE\r\n} from '../'\r\n\r\nconst card = {\r\n rank: '',\r\n suit: ''\r\n}\r\n\r\nconst initialHand = {\r\n 1: card,\r\n 2: card\r\n}\r\n\r\nconst initialBoard = {\r\n 1: card,\r\n 2: card,\r\n 3: card,\r\n 4: card,\r\n 5: card\r\n}\r\n\r\nconst initialState = {\r\n slots: {\r\n 1: initialHand,\r\n 2: initialHand,\r\n [BOARD]: initialBoard\r\n },\r\n ranges: {\r\n 1: [],\r\n 2: []\r\n },\r\n handCount: 2,\r\n selectedPosition: 1,\r\n selectedCard: 1,\r\n savedEquities: [\r\n {\r\n equities: [],\r\n hands: {\r\n 1: initialHand,\r\n 2: initialHand\r\n },\r\n board: initialBoard\r\n }\r\n ],\r\n displayEquities: false\r\n}\r\n\r\nexport function equityReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case SELECT_CARD:\r\n let selectedCard = state.selectedCard\r\n let selectedPosition = state.selectedPosition\r\n\r\n switch (state.selectedPosition) {\r\n case BOARD:\r\n if (selectedCard < 5) {\r\n selectedCard++\r\n }\r\n break;\r\n default:\r\n if (selectedCard === 1) {\r\n selectedCard = 2\r\n }\r\n }\r\n\r\n return {\r\n ...state,\r\n slots: {\r\n ...state.slots,\r\n [state.selectedPosition]: {\r\n ...state.slots[state.selectedPosition],\r\n [state.selectedCard]: {\r\n rank: action.rank,\r\n suit: action.suit\r\n }\r\n }\r\n },\r\n selectedPosition: selectedPosition,\r\n selectedCard: selectedCard,\r\n displayEquities: false\r\n }\r\n case SELECT_POSITION:\r\n return {\r\n ...state,\r\n selectedPosition: action.hand,\r\n selectedCard: action.card\r\n }\r\n case SAVE_EQUITY:\r\n const savedEquities = state.savedEquities.slice()\r\n const equity = {\r\n equities: action.equities,\r\n hands: action.hands,\r\n board: action.board\r\n }\r\n savedEquities.push(equity)\r\n\r\n return {\r\n ...state,\r\n displayEquities: true,\r\n savedEquities\r\n }\r\n case CLEAR_HANDS:\r\n const equities = state.savedEquities\r\n\r\n return {\r\n ...initialState,\r\n displayEquities: false,\r\n savedEquities: equities\r\n }\r\n case INCREMENT_HANDS:\r\n const increasedCount = state.handCount + 1\r\n const increasedSlots = { ...state.slots, [increasedCount]: initialHand }\r\n const increasedRanges = { ...state.ranges, [increasedCount]: [] }\r\n\r\n return {\r\n ...state,\r\n handCount: increasedCount,\r\n slots: increasedSlots,\r\n ranges: increasedRanges,\r\n displayEquities: false\r\n }\r\n case DECREMENT_HANDS:\r\n const decreasedSlots = { ...state.slots }\r\n const decreasedRanges = { ...state.ranges }\r\n delete decreasedSlots[state.handCount]\r\n delete decreasedRanges[state.handCount]\r\n\r\n return {\r\n ...state,\r\n handCount: state.handCount - 1,\r\n slots: decreasedSlots,\r\n ranges: decreasedRanges,\r\n displayEquities: false\r\n }\r\n case ADD_TO_RANGE:\r\n let addRange = state.ranges[action.number].slice()\r\n\r\n if (addRange.indexOf(action.hand) === -1) {\r\n addRange.push(action.hand)\r\n }\r\n\r\n return {\r\n ...state,\r\n ranges: {\r\n ...state.ranges,\r\n [action.number]: addRange\r\n },\r\n displayEquities: false\r\n }\r\n case REMOVE_FROM_RANGE:\r\n let removeRange = state.ranges[action.number].slice()\r\n removeRange.splice(removeRange.indexOf(action.hand), 1)\r\n\r\n return {\r\n ...state,\r\n ranges: {\r\n ...state.ranges,\r\n [action.number]: removeRange\r\n },\r\n displayEquities: false\r\n }\r\n default:\r\n return state\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { Switch, Route } from 'react-router-dom'\r\nimport { CalculatorContainer } from './equitycalculator'\r\n\r\nexport const Main = () => (\r\n \r\n \r\n \r\n)\r\n","import React, { Component } from 'react';\nimport './App.css'\nimport { Main } from './Main'\nimport freetilt from './images/freetilt.jpg'\n\nclass App extends Component {\n render() {\n return (\n
\n
\n \n
\n
\n
\n )\n }\n}\n\nexport default App;\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl);\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n console.log('New content is available; please refresh.');\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import { combineReducers } from 'redux'\r\nimport { equityReducer } from './equitycalculator'\r\n\r\nexport const tiltApp = combineReducers({\r\n equityReducer\r\n})\r\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\nimport { BrowserRouter } from 'react-router-dom'\nimport { Provider } from 'react-redux'\nimport { createStore } from 'redux'\nimport { tiltApp } from './reducers'\n\nlet store = createStore(tiltApp)\n\nReactDOM.render((\n \n \n \n \n \n), document.getElementById('root'));\nregisterServiceWorker();\n"],"sourceRoot":""}