J9      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~NoneOTuSAn account in the QIF file. This same structure applies for all the account types.:The type of an account; should be fairly self-explanatory.A fixed-width implementation of quantities for shares. So far, I have seen sites report share quantities to up to four decimal points, henced the value. A fixed width implementation of currency, based on the U.S. dollar. Future versions of this library that wish to support other currencies may wish to change this, or to abstract the rest of the library over a currency type. |Parse a fixed-width number. Should parse negative values, as well. This does support QIF's annoying "5." notation, as well. yRender a quantity. As opposed to the parser, this output function will always represent numbers to their full precision. 7Parse a currency. This is slightly differentiated from   in that it will happily ignore a dollar sign placed in the correct location. Note that this will support negative amounts written as either "-$500" or as "$-500". Render a currency. The boolean state whether or not to include a dollar sign. When dollar signs are included, negatives are written as "-$500" rather than "$-500"./Parse a share quantity. Currently an alias for  .0Render a share quantity. Currently an alias for  .TParse a fully-rendered account type (e.g, "!Type:Bank"), used for section headings.2Parse the short version of an account type (e.g., Bank/), which is used in a couple different places.VRender a fully-rendered account type (e.g., "!Type:Bank"), used for section headings.;Render the short version of an account type (e.g., "Bank").@Whether a category is an income category or an expense category.GInformation about a category that one might mark a transaction against.The current balance.<The date at which the balance in the next field was current. ;For accounts with limits, the credit limit for the account.!cThe description of the account; in my limited experience this can (and most likely will) be empty."The name of the account#The type of the account$A blank account. Defaults to N for the type, with the obvious zeros, empty strings, and Nothings elsewhere.%Parse an account.&Render an account.'6Parse a date, using old-school, incredibly unwise, "mmddNyy" formats. To simplify my life, this assumes that all dates start in 2000, rather than in 1970 or some other date. Thus, if you have data going back before 2000, you'll need to post-process this to the appropriate date, by subtracting 100 appropriately. Hopefully by 2100 noone will be using QIF anymore, and this won't matter.(&Render the date in QIF's silly format.)9Parse the list of accounts associated with this QIF file.*:Render the list of accounts associated with this QIF file.++A blank category. We default categories to .0TWhen a single transaction is split across a couple categories, this is your friend.1@A budget amount, if a budget has been established and published.27A description of the category in question. Often empty.32Whether or not this category might be tax-related.4The kind of category;  or 5The name of the category.60A number describing the tax schedule to look at.7Parse a category.8Render a category.9<Parse the list of categories (and the header for said list).:QRender the header for the list of categories followed by each of the categories.;VSections full of transactions start with the header demarcating what account the transactions are in regard to. This parses that header, returning the account. Note that if you were expecting to be a somewhat reasonable standard, and just reference a previously-defined account, you're in for a disappointment. This is a completely fresh U structure, and you'll have to match things up (and merge any differences) yourself.<?Render the header that should proceed any list of transactions.= An empty 0. No texts, no money. So sad.@IA normal transaction, that doesn't include an action in the stock market.A"The amount of money in this split.B(The category associated with this split.C%Any memo taken as part of this split.D^A transaction with no real data, that happened to occur on January 1st, 2000. Happy new year!G Information about a given trade.H$The total amount of the transaction.I:The category associated with the transaction, if provided.J,Whether or not this transaction has cleared.KThe date of the transaction.L&Any memos taken about the transaction.M*The check or other number, as appropriate.N#The other party to the transaction.O0Whether or not this transaction is reimbursable.P,Any splits assocaited with this transaction.QParse a transaction. Note that this function only does parsing, not consistency checking. Thus, you may end up with a transaction whose splits do not sum to the total transaction amount, or is missing a category, etc.RRender a transaction. This function assumes that you have performed any consistency checking you're going to do before writing out this transaction. It won't do any for you.SParse a split. Note that some banking programs may end up emitting empty splits, and we don't do anything about that. So you might want to check if what you get back is D, or something morally similar.TbRender a split. Please be sensible in what you emit; this function won't check your work for you.UQParse a list of bank transactions. You should probably call this directly after ; and discovering that it's a Bankm account. You should also not trust the results of this, as it does no consistency checking on your behalf.VRender a list of bank transactions. Please do any consistency checking you want before calling this. You probably also want to have called < with an appropriate Bank" account before calling this one.W)Build an empty trade made on a given day.ZInformation about a transfer into an investment account. This probably looks like a normal transaction in a non-investment account, and each one probably has a sibling that is exactly that.[The annoying commission taken out of the trade, if provided. Note that QIF does differentiate between Nothing and (Just 0.00), for some reason.\The date of the trade.],The amount of the share traded, if provided.^The security this trade was about. Note that while we probably should be doing some input validation on this, we're not. So if you're consuming this value, be a bit paranoid._>The share price of the security during the trade, if provided.`The total amount of the trade.a1An empty transfer that occurred on the given day.d+The information QIF keeps about a security.e1The kinds of securities QIF files will reference.qAn action in an investment account. These are the ones I've seen in QIF files shown to me. If you run into other ones, please file a bug or submit a patch.wsThe account with which this transaction took place ... usually. Sometimes this is empty. Make of that as you will.xThe amount of the transfer.y(Whether or not the transfer has cleared.zThe date of the transfer.{NA memo or note about the transaction. Often blank, in our limited experience.|+Any splits associated with the transaction.}qA summary of the transfer. Sometimes the other party in the transfer, or just a short name, and sometimes blank.~YThe date of an investment account action, regardless of what kind of transaction it was.=Parse an investment transaction. Like it's sister function, Q, this function doesn't do any semantic validation. So it's possible that the date in the transaction doesn't make any sense. So ... that's on you.dRender an investment transaction. As you might expect, this doesn't check your work. So be careful.CParse a list of investment entries. You probably should've called ;3 right before this and found an investment account.PRender a list of investment transactions. You should probably have just called < with an investment account.IParse a list of cash transactions. You should probably have just called ; and found a Cash account. You should probably also be a bit paranoid about checking over the date you read, as we perform no semantic checks on your behalf.ARender a list of cash transactions. You should have just called < with a Cash account.PParse a list of credit card transactions. You should probably have just called ; and found a Cash account. You should probably also be a bit paranoid about checking over the date you read, as we perform no semantic checks on your behalf.HRender a list of credit card transactions. You should have just called < with a  CreditCard account._Parse a list of transactions in an asset account. Again, you probably should have just called ; and found an Assetv account, and you should make sure to do any data validation you care about. Because this library just doesn't care.9Render a list of transactions on an asset. Did you call <4 before this with an asset account? You should have!Last one! Parse a list of transactions about a liability. Probably a loan, which you may or may not regret. You *will* regret it, however, if you didn't call ; first and find a  Liabilitym account. You will also regret it if you don't do some input validation on what you get from this function.RRender a list of transactions about a liability, probably right after you called < with a liability account.Parse a security type.Render a security type.iAn empty security, forlorn and alone, with no name, no ticker, and no goals. Definitely a stock, though.The semantic content of a QIF file. (Explicitly this: very little semantic processing has gone into this data structure, and it could contain semantic errors in the underlying file. Checking for these things is your job.)The goal for the security. I think this is for things like "Buying a house" or "Saving for college", but I've never actually seen this used in the wild.The name of the security.iThe ticker symbol for the security. If I was a better person this would do some validation on the input.The type of security.Parse a security. Performs no validation that the name makes sense, the ticker makes sense, or that the two go together. Good luck with that.Render a security. You should probably make sure that your data structure makes sense before you write it, but that's your thing. This function won't judget you./Parse a list of securities out of the QIF file.Render a list of securities.An empty QIF file.lThe accounts associated with the QIF file. We hope. You might expect that there would be an invariant that  would be the same as       3. I would, and it'd be nice if you tried to maintain that in your code. But, unfortuntely, there's nothing in the QIF file format that requires this. So you should probably be careful, and make sure you handle the case in which this item mentions accounts not seen anywhere else, and the case in which  and  suddenly invent new accounts.4The list of categories saved in this QIF file. Like +, there doesn't seem to be anything enforcing consistency in the actual QIF file. So you may find that this list mentions categories not referenced elsewhere -- which is not necessarily too surprising -- but also that there may be transactions that mention new categories unlisted in this field.cA list of investment accounts and the transactions associated with those accounts. Typically each ! should reference an account in  qifAccountl and include exactly the same date, but there's nothing in the file structure that enforces this invariant.pA list of non-investment accounts and the transactions associated with them. Again, one might expect that each & here should reference an account in  qifAccountn, and contain exactly the same data, but there's nothing in the file structure that enforces this constraint.A cached list of securities. As with the other fields, be warned, as this is not required to be complete, as far as I can tell.oParse a QIF file. This function is purely a syntactic parse, and makes no attempt to verify that the data it parses makes sense. So please be a bit paranoid with all the numbers and strings you receive, and perform any validation you need on your own. Also, this function assumes that it is parsing only a QIF file, and that it should run to the end of the input.Render out a QIF File. Because it's the order I've seen in my early example QIF files, this renders in the following order: account list, category list, investment accounts and their transactions, non-investment accounts and their transactions, and then security lists.  !"#$%&'()*+0123456789:;<=@ABCDGHIJKLMNOPQRSTUVWZ[\]^_`adefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+0123456789:;<=@ABCDGHIJKLMNOPQRSTUVWZ[\]^_`adejpfghiklmnoqrstuvwxyz{|}~)*9:UV$"#! %&;<+524316780=CABST@DKNLHMIJOPQRGW\^_][`Zaz}{xyw|qrstuv~efghijklmnopd  '(  !"#$%&'()*+0123456789:;<=@ ABCDGHIJKLMNOPQRSTUVWZ[\]^_`ade fghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~2BI\f qif-1.1.0-CJTEDHZE51kArSsDC2bOI4Data.QIFAccount AccountType BankAccount CashAccountCreditCardAccountInvestmentAccount AssetAccountLiabilityAccount ShareQuantityCurrency parseQuantityrenderQuantity parseCurrencyrenderCurrencyparseShareQuantityrenderShareQuantityparseAccountTypeparseShortAccountTyperenderAccountTyperenderShortAccountType$fHasResolutionE4$fEqAccountType$fReadAccountType$fShowAccountType $fEqAccount $fShowAccount CategoryKindIncomeExpenseCategoryaccountBalanceaccountBalanceDateaccountCreditLimitaccountDescription accountName accountType emptyAccount parseAccount renderAccount parseDate renderDateparseAccountListrenderAccountList emptyCategory$fEqCategoryKind$fShowCategoryKind $fEqCategory$fShowCategory SplitItemcatBudgetAmountcatDescriptioncatIsTaxRelatedcatKindcatNamecatTaxScheduleInfo parseCategoryrenderCategoryparseCategoryListrenderCategoryListparseAccountHeaderrenderAccountHeaderemptySplitItem $fEqSplitItem$fShowSplitItem Transaction entryAmount entryCategory entryMemoemptyTransaction$fEqTransaction$fShowTransaction TradeInfo entAmount entCategory entClearedentDateentMemo entNumberentPartyentReimbursable entSplitsparseTransactionrenderTransaction parseSplit renderSplitparseBankEntryListrenderBankEntryList emptyTrade $fEqTradeInfo$fShowTradeInfo TransferInfotradeCommission tradeDate tradeQuantity tradeSecuritytradeSharePricetradeTotalAmount emptyTransfer$fEqTransferInfo$fShowTransferInfoSecurity SecurityTypeStockBondCD MutualFundIndexETF MoneyMarket PreciousMetal Commodity StockOptionOtherInvTransactionBuySellTransferDividendInterest transAccount transAmount transCleared transDate transMemo transSplits transSummary invEntDateparseInvTransactionrenderInvTransactionparseInvestmentEntriesrenderInvestmentEntriesparseCashEntryListrenderCashEntryListparseCreditCardEntryListrenderCreditCardEntryListparseAssetEntryListrenderAssetEntryListparseLiabilityEntryListrenderLiabilityEntryListparseSecurityTyperenderSecurityType emptySecurity$fEqInvTransaction$fShowInvTransaction$fEqSecurityType$fShowSecurityType $fEqSecurity$fShowSecurityQIFsecGoalsecName secTickersecType parseSecurityrenderSecurityparseSecurityListrenderSecurityListemptyQIF$fEqQIF $fShowQIF qifAccounts qifCategoriesqifInvestmentTransactionsqifNormalTransactions qifSecuritiesparseQIF renderQIFbaseGHC.Basemap Data.Tuplefst++ _accountName _accountType_accountDescription_accountCreditLimit_accountBalanceDate_accountBalanceE4 digitToNum_catName_catDescription_catKind_catIsTaxRelated_catBudgetAmount_catTaxScheduleInfogetPgetP' parseStringputputmputm' _entryMemo _entryAmount_entryCategory_entDate _entParty_entMemo _entAmount _entNumber _entCategory _entCleared_entReimbursable _entSplits _tradeDate_tradeSecurity_tradeSharePrice_tradeQuantity_tradeCommission_tradeTotalAmount parseCleared renderClearednewline _transDate _transSummary _transMemo _transAmount _transCleared _transAccount _transSplits_secName _secTicker_secType_secGoalrenderTradeInforenderTransferInfo _qifAccounts_qifCategories_qifSecurities_qifInvestmentTransactions_qifNormalTransactions