pax_global_header00006660000000000000000000000064147514667140014531gustar00rootroot0000000000000052 comment=d73fb39fd1ec79e862859f7c6f93ac10250e3c70 beangrow-master/000077500000000000000000000000001475146671400141725ustar00rootroot00000000000000beangrow-master/.envrc000066400000000000000000000011501475146671400153050ustar00rootroot00000000000000#!/usr/bin/env bash use flake # Add venv bin to PATH so development tools can be invoked more easily PATH_add .venv/bin # Add src to PYTHONPATH so Python and tools can find imports correctly path_add PYTHONPATH src # Add venv site packages to PYTHONPATH so imports work path_add PYTHONPATH ".venv/$NIX_PYTHON_SITE_PACKAGES" # Make pip use the venv (useful for ad-hoc temporary package installation) PIP_PREFIX="$(expand_path .)/.venv" export PIP_PREFIX export PIP_IGNORE_INSTALLED=1 # These are annoying so stuff them all in one place PYTHONPYCACHEPREFIX="$(expand_path .)/.pycache" export PYTHONPYCACHEPREFIX beangrow-master/.gitignore000066400000000000000000000002111475146671400161540ustar00rootroot00000000000000# Python artifacts /.coverage /.pycache /.pytest_cache /.venv /dist /build /*.egg-info # Direnv cache /.direnv # Nix artifacts /result beangrow-master/COPYING000066400000000000000000000436471475146671400152430ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. ------------------------------------------------------------ Note: This is a GNU GPL "v2 only" license. This is not a GNU GPL "v2 or any later version" license. ---Martin Blais beangrow-master/README.md000066400000000000000000000022021475146671400154450ustar00rootroot00000000000000# Compute Returns This directory contains code which computes investment returns on a variety of assets, as recorded by Beancount, fed directly from a Beancount file. See this document for details: https://docs.google.com/document/d/1nPsMIunLnDvdsg6TSsd0PZb7jngojNpFlqnaX36WRp8/ ## Scripts There are three related scripts: - configure.py: This attempts to automatically infer and generate configuration to compute returns from an existing Beancount ledger. - compute_returns.py: This extracts data for each of the investments defined in the configuration and computes the returns and generates output for each requested returns report. - download_prices.py: The compute_returns.py script outputs a list of missing (or inadequately dated) price directives to properly do its job as a side-product. This script can read that file and fetch those missing dates, which you can insert in your ledger and then rerun compute_returns.py for a more precise calculation. ## Example To run the example: ``` cd example uv run beangrow-returns ledger.beancount config.pbtxt ./reports ``` The reports are available at `example/reports/groups`. beangrow-master/beangrow/000077500000000000000000000000001475146671400157765ustar00rootroot00000000000000beangrow-master/beangrow/Makefile000077500000000000000000000001631475146671400174410ustar00rootroot00000000000000#!/usr/bin/env make all: config_pb2.py config_pb2.py: config.proto protoc -I . --python_out . --proto_path . $< beangrow-master/beangrow/__init__.py000066400000000000000000000000001475146671400200750ustar00rootroot00000000000000beangrow-master/beangrow/compute_returns.py000077500000000000000000000077131475146671400216210ustar00rootroot00000000000000#!/usr/bin/env python3 """Calculate my true returns, including dividends and real costs. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" from os import path import argparse import datetime import logging import os from beancount import loader from beancount.core import getters from beancount.core import prices from beangrow import investments from beangrow import reports from beangrow import config as configlib def main(): """Top-level function.""" parser = argparse.ArgumentParser(description=__doc__.strip()) parser.add_argument('ledger', help="Beancount ledger file") parser.add_argument('config', action='store', help='Configuration for accounts and reports.') parser.add_argument('output', help="Output directory to write all output files to.") parser.add_argument('filter_reports', nargs='*', help="Optional names of specific subset of reports to analyze.") parser.add_argument('-v', '--verbose', action='store_true', help='Verbose mode') parser.add_argument('-d', '--days-price-threshold', action='store', type=int, default=5, help="The number of days to tolerate price latency.") parser.add_argument('-e', '--end-date', action='store', type=datetime.date.fromisoformat, help="The end date to compute returns up to.") parser.add_argument('--pdf', '--pdfs', action='store_true', help="Render as PDFs. Default is HTML directories.") parser.add_argument('-j', '--parallel', action='store_true', help="Run report generation concurrently.") parser.add_argument('-E', '--check-explicit-flows', action='store_true', help=("Enables comparison of the general categorization method " "with the explicit one with specialized explicit handlers " "per signature.")) args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s: %(message)s') logging.getLogger('matplotlib.font_manager').disabled = True # Figure out end date. end_date = args.end_date or datetime.date.today() # Load the example file. logging.info("Reading ledger: %s", args.ledger) entries, _, options_map = loader.load_file(args.ledger) accounts = getters.get_accounts(entries) dcontext = options_map['dcontext'] # Load, filter and expand the configuration. config = configlib.read_config(args.config, args.filter_reports, accounts) os.makedirs(args.output, exist_ok=True) with open(path.join(args.output, "config.pbtxt"), "w") as efile: print(config, file=efile) # Extract data from the ledger. account_data_map = investments.extract( entries, dcontext, config, end_date, args.check_explicit_flows, path.join(args.output, "investments")) # Generate output reports. output_reports = path.join(args.output, "groups") pricer = reports.generate_reports(account_data_map, config, prices.build_price_map(entries), end_date, output_reports, parallel=args.parallel, pdf=args.pdf) # Generate price reports. output_prices = path.join(args.output, "prices") reports.generate_price_pages(account_data_map, prices.build_price_map(entries), output_prices) # Output required price directives (to be filled in the source ledger by # fetching prices). reports.write_price_directives(path.join(output_prices, "prices.beancount"), pricer, args.days_price_threshold) if __name__ == '__main__': main() beangrow-master/beangrow/compute_returns_beam.py000077500000000000000000000124461475146671400226040ustar00rootroot00000000000000#!/usr/bin/env python3 """Calculate my true returns, including dividends and real costs. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" from os import path import argparse import tempfile import datetime import logging import os from typing import List, Tuple, Callable import apache_beam as beam from apache_beam.options.pipeline_options import PipelineOptions import apache_beam.io.fileio from beancount import loader from beancount.core import getters from beancount.core import prices from beangrow import investments from beangrow import reports from beangrow import config as configlib from beangrow import config_pb2 from beangrow import returns as returnslib Date = datetime.date def main(): """Top-level function.""" parser = argparse.ArgumentParser(description=__doc__.strip()) parser.add_argument('ledger', help="Beancount ledger file") parser.add_argument('config', action='store', help='Configuration for accounts and reports.') parser.add_argument('output', help="Output directory to write all output files to.") parser.add_argument('filter_reports', nargs='*', help="Optional names of specific subset of reports to analyze.") parser.add_argument('-v', '--verbose', action='store_true', help='Verbose mode') parser.add_argument('-d', '--days-price-threshold', action='store', type=int, default=5, help="The number of days to tolerate price latency.") parser.add_argument('-e', '--end-date', action='store', type=datetime.date.fromisoformat, help="The end date to compute returns up to.") parser.add_argument('--pdf', '--pdfs', action='store_true', help="Render as PDFs. Default is HTML directories.") parser.add_argument('-j', '--parallel', action='store_true', help="Run report generation concurrently.") parser.add_argument('-E', '--check-explicit-flows', action='store_true', help=("Enables comparison of the general categorization method " "with the explicit one with specialized explicit handlers " "per signature.")) args, pipeline_args = parser.parse_known_args() if args.verbose: logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s: %(message)s') logging.getLogger('matplotlib.font_manager').disabled = True # Figure out end date. end_date = args.end_date or datetime.date.today() # Load the example file. logging.info("Reading ledger: %s", args.ledger) entries, _, options_map = loader.load_file(args.ledger) accounts = getters.get_accounts(entries) dcontext = options_map['dcontext'] # Load, filter and expand the configuration. config = configlib.read_config(args.config, args.filter_reports, accounts) os.makedirs(args.output, exist_ok=True) with open(path.join(args.output, "config.pbtxt"), "w") as efile: print(config, file=efile) # Extract data from the ledger. account_data_map = investments.extract( entries, dcontext, config, end_date, args.check_explicit_flows, path.join(args.output, "investments")) # Generate output reports. output_reports = path.join(args.output, "groups") price_map = prices.build_price_map(entries) poptions = PipelineOptions(pipeline_args, runner="DirectRunner", direct_running_mode="multi_processing", direct_num_workers=8) with beam.Pipeline(options=poptions) as pipeline: report_adlist = [] for report in config.groups.group: adlist = [account_data_map[name] for name in report.investment] assert isinstance(adlist, list) assert all(isinstance(ad, investments.AccountData) for ad in adlist) report_adlist.append((report, adlist)) _ = (pipeline | beam.Create(report_adlist) | beam.Map(reports.generate_report_mapper, price_map, end_date) | beam.ParDo(WriteNamedBinary, FormatFilename)) # TODO(blais): This doesn't work as expected, need to pickled # FormatFilename properly. def FormatFilename(key: str) -> str: return path.join(args.output, "report_{}.pdf".format(key)) def WriteNamedBinary(item: Tuple[str, bytes], filename_fn: Callable[[str], str]): """Given a pcollection of (key, contents) pairs, write to unique filenames.""" key, contents = item filename = filename_fn(key) with open(filename, "wb") as outfile: outfile.write(contents) def main_saved_for_later(): # Generate price reports. output_prices = path.join(args.output, "prices") reports.generate_price_pages(account_data_map, prices.build_price_map(entries), output_prices) # Output required price directives (to be filled in the source ledger by # fetching prices). reports.write_price_directives(path.join(output_prices, "prices.beancount"), pricer, args.days_price_threshold) if __name__ == '__main__': main() beangrow-master/beangrow/config.proto000066400000000000000000000064431475146671400203370ustar00rootroot00000000000000// -*- mode: protobuf -*- // Configuration for the computation of returns. syntax = "proto2"; package beancount.returns; // Configuration for returns script. message Config { // The list of source investments which each define a series of cash flows. optional InvestmentConfig investments = 1; // A list of named groups which combine previously defined sets of // investments. Reports are produced for each of these groups. optional GroupConfig groups = 3; // A list of external benchmarks to compare some groups with. repeated Portfolio benchmark_portfolio = 2; } //------------------------------------------------------------------------------ message InvestmentConfig { // A list of investments. repeated Investment investment = 1; // Patterns to match income and expenses accounts to for categorization. // These have defaults based on the root of the account name. optional string income_regexp = 2; optional string expenses_regexp = 3; } // Configuration for extracting returns information for one investment // (typically stored in one account). message Investment { // Currency under consideration. optional string currency = 1; // Account containing assets of the investmnet. This is the key name for it. optional string asset_account = 2; // Account names allowing us to figure out this is a dividend. Typicaslly the // dividend income account. posting to this account). repeated string dividend_accounts = 3; // Other account names to include (if a transaction has at least one posting // to this account). repeated string match_accounts = 4; // Cash accounts to generate flows for. repeated string cash_accounts = 5; } //------------------------------------------------------------------------------ message GroupConfig { repeated Group group = 1; repeated SuperGroup supergroup = 2; } // Configuration for report groups. message Group { // Name of the report/group. optional string name = 1; // A list of investments (asset accounts) to include in the generated report. // This field supports a globbing pattern as well. repeated string investment = 2; // The reporting currency to convert all assets to. This is optional; by // default, this uses the unique currency of the group of investments. If // there are many, an exception is raised. optional string currency = 3; // Compare with the following list of benchmark portfolios (by name). repeated string benchmark_portfolio = 4; } //------------------------------------------------------------------------------ // Groupings of groups, to report on the relative proportions over time of the // investment groups (for various types of rebalancing). message SuperGroup { // Name of the supergroup/stacks. optional string name = 1; // Name of the groups to include. repeated string group = 2; } //------------------------------------------------------------------------------ // A position of a benchmark portfolio. message Position { // The name of the instrument. optional string instrument = 1; // The ideal fraction for new investments in the portfolio. optional float fraction = 2; } message Portfolio { optional string name = 1; // A list of positions in the portfolio. Must sum to 1. repeated Position position = 2; // TODO(blais): Add options for rebalancing. } beangrow-master/beangrow/config.py000077500000000000000000000056751475146671400176350ustar00rootroot00000000000000#!/usr/bin/env python3 """Library coded to process the input configuration. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" from typing import List import fnmatch import re from google.protobuf import text_format from beangrow.config_pb2 import Config # Basic type aliases. Account = str def is_glob(pattern): return re.compile(r"[*?]").search(pattern) def expand_globs(patterns: List[str], valid_set: List[str]) -> List[str]: out_values = [] for pattern in patterns: if is_glob(pattern): out_values.extend(fnmatch.filter(valid_set, pattern)) else: out_values.append(pattern) return out_values def read_config_from_string(config_string: str, filter_reports: List[str], accounts: List[Account]) -> Config: """Read the configuration, perform globbing expansions, and whittle down the list of reports and investments to the requested minimal.""" # Read the config from a string. config = Config() text_format.Merge(config_string, config) reports = list(config.groups.group) # Expand account names. for investment in config.investments.investment: assert not is_glob(investment.asset_account) investment.dividend_accounts[:] = expand_globs(investment.dividend_accounts, accounts) investment.match_accounts[:] = expand_globs(investment.match_accounts, accounts) investment.cash_accounts[:] = expand_globs(investment.cash_accounts, accounts) # Expand investment names. investment_names = [investment.asset_account for investment in config.investments.investment] for report in config.groups.group: report.investment[:] = expand_globs(report.investment, investment_names) # Filter down reports. if filter_reports: reports = [report for report in config.groups.group if any(fnmatch.fnmatch(report.name, pattern) for pattern in filter_reports)] del config.groups.group[:] config.groups.group.extend(reports) # Filter just the list of investments needed for the reports defined. used_investments = set(inv for report in config.groups.group for inv in report.investment) investments = [invest for invest in config.investments.investment if invest.asset_account in used_investments] del config.investments.investment[:] config.investments.investment.extend(investments) return config def read_config(config_filename: str, filter_reports: List[str], accounts: List[Account]) -> Config: # Read the file. with open(config_filename, "r") as infile: config_string = infile.read() return read_config_from_string(config_string, filter_reports, accounts) beangrow-master/beangrow/config_pb2.py000066400000000000000000000052601475146671400203630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: config.proto """Generated protocol buffer code.""" from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x63onfig.proto\x12\x11\x62\x65\x61ncount.returns\"\xad\x01\n\x06\x43onfig\x12\x38\n\x0binvestments\x18\x01 \x01(\x0b\x32#.beancount.returns.InvestmentConfig\x12.\n\x06groups\x18\x03 \x01(\x0b\x32\x1e.beancount.returns.GroupConfig\x12\x39\n\x13\x62\x65nchmark_portfolio\x18\x02 \x03(\x0b\x32\x1c.beancount.returns.Portfolio\"u\n\x10InvestmentConfig\x12\x31\n\ninvestment\x18\x01 \x03(\x0b\x32\x1d.beancount.returns.Investment\x12\x15\n\rincome_regexp\x18\x02 \x01(\t\x12\x17\n\x0f\x65xpenses_regexp\x18\x03 \x01(\t\"\x7f\n\nInvestment\x12\x10\n\x08\x63urrency\x18\x01 \x01(\t\x12\x15\n\rasset_account\x18\x02 \x01(\t\x12\x19\n\x11\x64ividend_accounts\x18\x03 \x03(\t\x12\x16\n\x0ematch_accounts\x18\x04 \x03(\t\x12\x15\n\rcash_accounts\x18\x05 \x03(\t\"i\n\x0bGroupConfig\x12\'\n\x05group\x18\x01 \x03(\x0b\x32\x18.beancount.returns.Group\x12\x31\n\nsupergroup\x18\x02 \x03(\x0b\x32\x1d.beancount.returns.SuperGroup\"X\n\x05Group\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\ninvestment\x18\x02 \x03(\t\x12\x10\n\x08\x63urrency\x18\x03 \x01(\t\x12\x1b\n\x13\x62\x65nchmark_portfolio\x18\x04 \x03(\t\")\n\nSuperGroup\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05group\x18\x02 \x03(\t\"0\n\x08Position\x12\x12\n\ninstrument\x18\x01 \x01(\t\x12\x10\n\x08\x66raction\x18\x02 \x01(\x02\"H\n\tPortfolio\x12\x0c\n\x04name\x18\x01 \x01(\t\x12-\n\x08position\x18\x02 \x03(\x0b\x32\x1b.beancount.returns.Position') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'config_pb2', globals()) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _CONFIG._serialized_start=36 _CONFIG._serialized_end=209 _INVESTMENTCONFIG._serialized_start=211 _INVESTMENTCONFIG._serialized_end=328 _INVESTMENT._serialized_start=330 _INVESTMENT._serialized_end=457 _GROUPCONFIG._serialized_start=459 _GROUPCONFIG._serialized_end=564 _GROUP._serialized_start=566 _GROUP._serialized_end=654 _SUPERGROUP._serialized_start=656 _SUPERGROUP._serialized_end=697 _POSITION._serialized_start=699 _POSITION._serialized_end=747 _PORTFOLIO._serialized_start=749 _PORTFOLIO._serialized_end=821 # @@protoc_insertion_point(module_scope) beangrow-master/beangrow/configure.py000077500000000000000000000151461475146671400203430ustar00rootroot00000000000000#!/usr/bin/env python3 """Infer a configuration automatically from a Beancount ledger. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" from typing import List, Optional import argparse import collections import datetime import sys import logging import re from beancount import loader from beancount.core import account as accountlib from beancount.core import account_types as acctypes from beancount.core import data from beancount.core import getters from beancount.parser import options from beangrow.config_pb2 import Config from beangrow.config_pb2 import InvestmentConfig from beangrow.config_pb2 import GroupConfig # Basic type aliases. Account = str Currency = str Date = datetime.date def find_accounts(entries: data.Entries, options_map: data.Options, start_date: Optional[Date]) -> List[Account]: """Return a list of account names from the balance sheet which either aren't closed or are closed now but were still open at the given start date. """ commodities = getters.get_commodity_directives(entries) open_close_map = getters.get_account_open_close(entries) atypes = options.get_account_types(options_map) return sorted( account for account, (_open, _close) in open_close_map.items() if (accountlib.leaf(account) in commodities and acctypes.is_balance_sheet_account(account, atypes) and not acctypes.is_equity_account(account, atypes) and (_close is None or (start_date and _close.date > start_date)))) def infer_configuration(entries: data.Entries, options_map: data.Options, start_date: Optional[Date]) -> Config: """Infer an input configuration from a ledger's contents.""" # Find out the list of accounts to be included. account_list = find_accounts(entries, options_map, start_date) # Figure out the available investments. config = Config() infer_investments_configuration(entries, account_list, config.investments) # Create reasonable reporting groups. infer_report_groups(entries, config.investments, config.groups) return config def infer_investments_configuration(entries: data.Entries, account_list: List[Account], out_config: InvestmentConfig): """Infer a reasonable configuration for input.""" all_accounts = set(getters.get_account_open_close(entries)) for account in account_list: aconfig = out_config.investment.add() aconfig.currency = accountlib.leaf(account) aconfig.asset_account = account regexp = re.compile(re.sub(r"^[A-Z][^:]+:", "[A-Z][A-Za-z0-9]+:", account) + ":Dividends?") for maccount in filter(regexp.match, all_accounts): aconfig.dividend_accounts.append(maccount) match_accounts = set() match_accounts.add(aconfig.asset_account) match_accounts.update(aconfig.dividend_accounts) match_accounts.update(aconfig.match_accounts) # Figure out the total set of accounts seed in those transactions. cash_accounts = set() for entry in data.filter_txns(entries): if any(posting.account in match_accounts for posting in entry.postings): for posting in entry.postings: if (posting.account == aconfig.asset_account or posting.account in aconfig.dividend_accounts or posting.account in aconfig.match_accounts): continue if (re.search(r":(Cash|Checking|Receivable|GSURefund)$", posting.account) or re.search(r"Receivable|Payable", posting.account) or re.match(r"Income:.*:(Match401k)$", posting.account)): cash_accounts.add(posting.account) aconfig.cash_accounts.extend(cash_accounts) def infer_report_groups(entries: data.Entries, investments: InvestmentConfig, out_config: GroupConfig): """Logically group accounts for reporting.""" # Create a group for each commodity. groups = collections.defaultdict(list) open_close_map = getters.get_account_open_close(entries) for investment in investments.investment: opn, unused_cls = open_close_map[investment.asset_account] assert opn, "Missing open directive for '{}'".format(investment.account) name = "currency.{}".format(investment.currency) groups[name].append(investment.asset_account) # Join commodities by metadata gropus and create a report for each. for attrname in "assetcls", "strategy": comm_map = getters.get_commodity_directives(entries) for investment in investments.investment: comm = comm_map[investment.currency] value = comm.meta.get(attrname) if value: name = "{}.{}".format(attrname, value) groups[name].append(investment.asset_account) for name, group_accounts in sorted(groups.items()): report = out_config.group.add() report.name = name report.investment.extend(group_accounts) def main(): """Top-level function.""" parser = argparse.ArgumentParser(description=__doc__.strip()) parser.add_argument('ledger', help="Beancount ledger file.") parser.add_argument('config', nargs='?', action='store', help='Output configuration for accounts and reports.') parser.add_argument('-v', '--verbose', action='store_true', help='Verbose mode.') parser.add_argument('-s', '--start-date', action='store', type=datetime.date.fromisoformat, default=None, help=("Accounts already closed before this date will not be " "included in reporting.")) args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s: %(message)s') logging.getLogger('matplotlib.font_manager').disabled = True # Load the example file. logging.info("Reading ledger: %s", args.ledger) entries, _, options_map = loader.load_file(args.ledger) # Infer configuration proto. logging.info("Inferring configuration.") config = infer_configuration(entries, options_map, args.start_date) logging.info("Done.") outfile = open(args.config) if args.config else sys.stdout print(config, file=outfile) if __name__ == '__main__': main() beangrow-master/beangrow/download_prices.py000077500000000000000000000045111475146671400215300ustar00rootroot00000000000000#!/usr/bin/env python3 """Download all prices in a particular date interval. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" import datetime import argparse import logging from decimal import Decimal from typing import List, Optional, Union from dateutil import tz import dateutil.parser from beancount import loader from beancount.core import data from beancount.core import number from beancount.core import amount from beancount.parser import printer from beanprice.sources import yahoo def main(): """Top-level function.""" today = datetime.date.today() parser = argparse.ArgumentParser(description=__doc__.strip()) parser.add_argument('instrument', help="Yahoo!Finance code for financial instrument.") parser.add_argument('start', action='store', type=lambda x: dateutil.parser.parse(x).date(), default=today.replace(year=today.year-1), help="Start date of interval. Default is one year ago.") parser.add_argument('end', action='store', type=lambda x: dateutil.parser.parse(x).date(), default=today, help="End date of interval. Default is today ago.") args = parser.parse_args() # Get the data. source = yahoo.Source() sprices = source.get_daily_prices(args.instrument, datetime.datetime.combine(args.start, datetime.time()), datetime.datetime.combine(args.end, datetime.time())) if sprices is None: raise RuntimeError("Could not fetch from {}".format(source)) # Attempt to infer the right quantization and quantize if succesfull. quant = number.infer_quantization_from_numbers([s.price for s in sprices]) if quant: sprices = [sprice._replace(price=sprice.price.quantize(quant)) for sprice in sprices] # Convert to Price entries and output. price_entries = [] for sprice in sprices: price_entries.append( data.Price({}, sprice.time.date(), args.instrument, amount.Amount(sprice.price, sprice.quote_currency))) printer.print_entries(price_entries) if __name__ == '__main__': main() beangrow-master/beangrow/download_prices_from_file.py000077500000000000000000000033221475146671400235510ustar00rootroot00000000000000#!/usr/bin/env python3 """Download required prices from Price directives given in another file. This is used to fetch missing prices identified from running the compute_returns script. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" import datetime import argparse import logging from dateutil import tz from beancount import loader from beancount.core import data from beancount.parser import printer from beanprice.sources import yahoo def main(): """Top-level function.""" parser = argparse.ArgumentParser(description=__doc__.strip()) parser.add_argument('price_ledger', help="Ledger file containing a list of prices to fetch") parser.add_argument('-v', '--verbose', action='store_true') args = parser.parse_args() if args.verbose: logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s: %(message)s') # Load the example file. logging.info("Reading ledger: %s", args.price_ledger) entries, _, _ = loader.load_file(args.price_ledger) source = yahoo.Source() new_entries = [] for price_entry in entries: assert isinstance(price_entry, data.Price) time = datetime.datetime.combine(price_entry.date, datetime.time(), tzinfo=tz.tzutc()) try: srcprice = source.get_historical_price(price_entry.currency, time) new_entry = price_entry._replace( amount=price_entry.amount._replace(number=srcprice.price)) new_entries.append(new_entry) except yahoo.YahooError as exc: print("ERROR: {}".format(exc)) printer.print_entries(new_entries) if __name__ == '__main__': main() beangrow-master/beangrow/investments.py000066400000000000000000000515061475146671400207360ustar00rootroot00000000000000"""Library code to extract time-series data for each investment. This code produces a data object for each investment from a Beancount ledger, containing the list of transactions for its asset account, a list of cash flows to compute the returns, and a bit more. Investments are defined as "one commodity in one account" and can be further combined as reports in code outside this library. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" from os import path from pprint import pprint from typing import Dict, List, Optional, Set, Tuple from functools import partial import collections import copy import datetime import enum import logging import os import re import sys import typing import pandas from beancount.core import account as accountlib from beancount.core import display_context from beancount.core import convert from beancount.core import data from beancount.core import getters from beancount.core.amount import Amount from beancount.core.inventory import Inventory from beancount.parser import printer from beangrow.config_pb2 import Config from beangrow.config_pb2 import Investment from beangrow.config_pb2 import InvestmentConfig # Basic type aliases. Account = str Currency = str Date = datetime.date class Cat(enum.Enum): """Posting categorization. This is used to produce unique templates to categorize each transaction. A template is a set of the categories below, which each of a transaction's postings are classified with. """ # The account holding the commodity. ASSET = 1 # Cash accounts, employer matches, contributions, i.e., anything external to # the investment. CASH = 2 # Dividend income account. DIVIDEND = 3 # Commissions, fees and other expenses. EXPENSES = 4 # Non-dividend income, P/L, gains, or other. INCOME = 5 # Other assets than the primary asset for this investment. OTHERASSET = 7 # Any other account. OTHER = 6 # Al list of dated cash flows. This is the unit that this program operates in, # the sanitized time-series that allows us to compute returns. CashFlow = typing.NamedTuple("CashFlow", [ ("date", Date), ("amount", Amount), # The amount of the cashflow. ("is_dividend", bool), # True if the flow is a dividend. ("source", str), # Source of this cash flow. ("account", Account), # Asset account for which this was generated. ]) # All flow information associated with an account. AccountData = typing.NamedTuple("AccountData", [ ('account', Account), ('currency', Currency), ('cost_currency', Currency), ('commodity', data.Commodity), ('open', data.Open), ('close', data.Close), ("cash_flows", List[CashFlow]), ('transactions', data.Entries), ('balance', Inventory), ('catmap', Dict[Account, Cat]), ]) def categorize_accounts(config: InvestmentConfig, investment: Investment, accounts: Set[Account]) -> Dict[Account, Cat]: """Categorize the type of accounts encountered for a particular investment's transactions. Our purpose is to make the types of postings generic, so they can be categorized and handled generically later on. """ catmap = {} for account in accounts: if account == investment.asset_account: cat = Cat.ASSET elif account in investment.dividend_accounts: cat = Cat.DIVIDEND elif account in investment.cash_accounts: cat = Cat.CASH elif re.match(config.income_regexp or "Income:", account): cat = Cat.INCOME elif re.match(config.expenses_regexp or "Expenses:", account): cat = Cat.EXPENSES else: # Note: When applied, if the corresponding postings has a cost, # OTHERASSET will be assigned; otherwise OTHER will be assigned. cat = None catmap[account] = cat return catmap def categorize_entry(catmap: Dict[Account, Cat], entry: data.Directive) -> Tuple[Cat]: """Assigns metadata to each posting.""" postings = [] for posting in entry.postings: category = catmap[posting.account] if category is None: category = Cat.OTHER if posting.cost is None else Cat.OTHERASSET meta = posting.meta.copy() if posting.meta else {} meta["category"] = category postings.append(posting._replace(meta=meta)) return entry._replace(postings=postings) def compute_transaction_signature(entry: data.Directive) -> Tuple[Cat]: """Compute a unique signature for each transaction.""" categories = set(posting.meta["category"] for posting in entry.postings) sigtuple = tuple(sorted(categories, key=lambda item: item.value)) return "_".join(s.name for s in sigtuple) _signature_registry = {} def register(categories, description): """Registers a handler for a particular template/signature transaction.""" def decorator(func): key = "_".join(c.name for c in sorted(categories, key=lambda c: c.value)) _signature_registry[key] = (func, description) return func return decorator def get_description(signature): _, description = _signature_registry.get(signature, (None, None)) return description def produce_cash_flows_general(entry: data.Directive, account: Account) -> List[CashFlow]: """Produce cash flows using a generalized rule.""" has_dividend = any(posting.meta["category"] == Cat.DIVIDEND for posting in entry.postings) flows = [] for posting in entry.postings: category = posting.meta["category"] if category == Cat.CASH: assert not posting.cost cf = CashFlow(entry.date, convert.get_weight(posting), has_dividend, "cash", account) posting.meta["flow"] = cf flows.append(cf) elif category == Cat.OTHERASSET: # If the account deposits other assets, count this as an outflow. cf = CashFlow(entry.date, convert.get_weight(posting), False, "other", account) posting.meta["flow"] = cf flows.append(cf) return flows def produce_cash_flows_explicit(entry: data.Directive, account: Account) -> List[CashFlow]: """Produce cash flows using explicit handlers from signatures.""" sig = entry.meta["signature"] try: handler, _ = _signature_registry[sig] except KeyError: epr = printer.EntryPrinter(stringify_invalid_types=True) print(epr(entry), file=sys.stderr) raise return handler(entry, account) @register([Cat.ASSET], "Stock splits, and conversions at same cost basis") def handle_no_flows(*args) -> List[CashFlow]: "Exchanges of the same asset produce no cash flows." return [] @register([Cat.ASSET, Cat.DIVIDEND], "Asset dividend reinvested") @register([Cat.ASSET, Cat.DIVIDEND, Cat.EXPENSES], "Asset dividend reinvested") def handle_dividend_reinvestments(*args) -> List[CashFlow]: """Reinvested stock dividends remains internal, the money is just moved to more of the asset. Note that because of this, it would make it difficult to remove the dividend from the performance of this asset.""" return [] @register([Cat.ASSET, Cat.EXPENSES], "Fee paid from liquidation") def handle_fee_from_liquidation(*args) -> List[CashFlow]: """Fees paid purely from sales of assets. No in or out flows, the stock value is simply reduced.""" return [] @register([Cat.ASSET, Cat.INCOME], "Cost basis adjustment") @register([Cat.ASSET, Cat.INCOME, Cat.OTHER], "Cost basis adjustment") @register([Cat.ASSET, Cat.INCOME, Cat.EXPENSES], "Fee from liquidation (with P/L)") def handle_cost_basis_adjustments(*args) -> List[CashFlow]: """No cash is disbursed for these adjustments, just a change in basis. This affects tax only. There are no associated cash flows.""" return [] @register([Cat.EXPENSES, Cat.OTHER], "Internal expense") @register([Cat.OTHER], "Movement between internal accounts") def handle_cost_basis_adjustments(*args) -> List[CashFlow]: """It's internal changes, no flows.""" return [] @register([Cat.ASSET, Cat.CASH], "Regular purchase or sale") @register([Cat.ASSET, Cat.CASH, Cat.OTHER], "Regular purchase or sale") @register([Cat.ASSET, Cat.CASH, Cat.INCOME], "Regular purchase or sale, with P/L") @register([Cat.ASSET, Cat.CASH, Cat.INCOME, Cat.OTHER], "Regular purchase or sale, with P/L") @register([Cat.ASSET, Cat.CASH, Cat.EXPENSES, Cat.INCOME], "Regular purchase or sale, with expense and P/L") @register([Cat.ASSET, Cat.CASH, Cat.EXPENSES, Cat.OTHER], "Regular purchase or sale") @register([Cat.ASSET, Cat.CASH, Cat.EXPENSES, Cat.INCOME, Cat.OTHER], "Regular purchase or sale") @register([Cat.ASSET, Cat.CASH, Cat.EXPENSES], "Regular purchase or sale, with expense") def handle_buy_sell(entry: data.Directive, account: Account) -> List[CashFlow]: "In a regular purchase or sale, use the cash component for sales and purchases." return _handle_cash(entry, account, False) @register([Cat.CASH, Cat.DIVIDEND], "Cash dividend") @register([Cat.CASH, Cat.DIVIDEND, Cat.INCOME], "Cash dividend") @register([Cat.CASH, Cat.EXPENSES, Cat.DIVIDEND], "Cash dividend, with expenses") def handle_dividends(entry: data.Directive, account: Account) -> List[CashFlow]: "Dividends received in cash." return _handle_cash(entry, account, True) @register([Cat.CASH, Cat.EXPENSES], "Cash for expense") @register([Cat.CASH, Cat.OTHER], "Cash for other internal account") @register([Cat.CASH, Cat.EXPENSES, Cat.OTHER], "Cash for expense or something else") @register([Cat.CASH, Cat.EXPENSES, Cat.INCOME], "Recoveries from P2P lending") def handle_cash_simple(entry: data.Directive, account: Account) -> List[CashFlow]: "Cash for income." return _handle_cash(entry, account, False) def _handle_cash(entry: data.Directive, account: Account, is_dividend: bool) -> List[CashFlow]: "In a regular purchase or sale, use the cash component for sales and purchases." flows = [] for posting in entry.postings: if posting.meta["category"] == Cat.CASH: assert not posting.cost cf = CashFlow(entry.date, posting.units, is_dividend, "cash", account) posting.meta["flow"] = cf flows.append(cf) return flows @register([Cat.ASSET, Cat.OTHERASSET], "Exchange of assets") def handle_stock_exchange(entry: data.Directive, account: Account) -> List[CashFlow]: """This is for a stock exchange, similar to the issuance of GOOG from GOOGL.""" flows = [] for posting in entry.postings: if posting.meta["category"] == Cat.OTHERASSET: cf = CashFlow(entry.date, convert.get_weight(posting), False, "other", account) posting.meta["flow"] = cf flows.append(cf) return flows def extract_transactions_for_account(entries: data.Entries, config: Investment) -> data.Entries: """Get the list of transactions affecting an investment account.""" match_accounts = set([config.asset_account]) match_accounts.update(config.dividend_accounts) match_accounts.update(config.match_accounts) return [entry for entry in data.filter_txns(entries) if any(posting.account in match_accounts for posting in entry.postings)] def process_account_entries(entries: data.Entries, config: InvestmentConfig, investment: Investment, check_explicit_flows: bool) -> AccountData: """Process a single account.""" account = investment.asset_account logging.debug("Processing account: %s", account) # Extract the relevant transactions. transactions = extract_transactions_for_account(entries, investment) if not transactions: logging.warning("No transactions for %s; skipping.", account) return None # Categorize the set of accounts encountered in the filtered transactions. seen_accounts = {posting.account for entry in transactions for posting in entry.postings} catmap = categorize_accounts(config, investment, seen_accounts) # Process each of the transactions, adding derived values as metadata. cash_flows = [] balance = Inventory() decorated_transactions = [] for entry in transactions: # Compute the signature of the transaction. entry = categorize_entry(catmap, entry) signature = compute_transaction_signature(entry) entry.meta["signature"] = signature # TODO(blais): Cache balance in every transaction to speed up # computation? Do this later. if False: # Update the total position in the asset we're interested in. for posting in entry.postings: if posting.meta["category"] is Cat.ASSET: balance.add_position(posting) # Compute the cash flows associated with the transaction. flows_general = produce_cash_flows_general(entry, account) if check_explicit_flows: # Attempt the explicit method. flows_explicit = produce_cash_flows_explicit(entry, account) if flows_explicit != flows_general: print("Differences found between general and explicit methods:") print("Explicit handlers:") for flow in flows_explicit: print(" ", flow) print("General handler:") for flow in flows_general: print(" ", flow) raise ValueError("Differences found between general and explicit methods:") cash_flows.extend(flows_general) decorated_transactions.append(entry) cost_currencies = set(cf.amount.currency for cf in cash_flows) #assert len(cost_currencies) == 1, str(cost_currencies) cost_currency = cost_currencies.pop() if cost_currencies else None currency = investment.currency commodity_map = getters.get_commodity_directives(entries) comm = commodity_map[currency] if currency else None open_close_map = getters.get_account_open_close(entries) opn, cls = open_close_map[account] # Compute the final balance. balance = compute_balance_at(decorated_transactions) return AccountData(account, currency, cost_currency, comm, opn, cls, cash_flows, decorated_transactions, balance, catmap) def prune_entries(entries: data.Entries, config: Config) -> data.Entries: """Prune the list of entries to exclude all transactions that include a commodity name in at least one of its postings. This speeds up the recovery process by removing the majority of non-trading transactions.""" commodities = set(aconfig.currency for aconfig in config.investments.investment) accounts = set() for aconfig in config.investments.investment: accounts.add(aconfig.asset_account) accounts.update(aconfig.dividend_accounts) accounts.update(aconfig.match_accounts) return [entry for entry in entries if ((isinstance(entry, data.Commodity) and entry.currency in commodities) or (isinstance(entry, data.Open) and entry.account in accounts) or (isinstance(entry, data.Transaction) and any(posting.account in accounts for posting in entry.postings)))] def compute_balance_at(transactions: data.Entries, date: Optional[Date] = None) -> Inventory: """Compute the balance before a specific date.""" balance = Inventory() for entry in transactions: if date is not None and entry.date >= date: break for posting in entry.postings: if posting.meta["category"] is Cat.ASSET: balance.add_position(posting) return balance def write_account_file(dcontext: display_context.DisplayContext, account_data: AccountData, filename: str): """Write out a file with details, for inspection and debugging.""" logging.info("Writing details file: %s", filename) epr = printer.EntryPrinter(dcontext=dcontext, stringify_invalid_types=True) os.makedirs(path.dirname(filename), exist_ok=True) with open(filename, "w") as outfile: fprint = partial(print, file=outfile) fprint(";; -*- mode: beancount; coding: utf-8; fill-column: 400 -*-") # Print front summary section. fprint("* Summary\n") fprint("Account: {}".format(account_data.account)) # Print the final balance of the account. units_balance = account_data.balance.reduce(convert.get_units) fprint("Balance: {}".format(units_balance)) # Print out those details. fprint("** Category map\n") fprint() pprint(account_data.catmap, stream=outfile) fprint("\n\n") fprint("** Transactions\n") for entry in account_data.transactions: fprint(epr(entry)) fprint("\n\n") # Flatten cash flows to a table. fprint("** Cash flows\n") df = cash_flows_to_table(account_data.cash_flows) fprint(df.to_string()) fprint("\n\n") def cash_flows_to_table(cash_flows: List[CashFlow]) -> pandas.DataFrame: """Flatten a list of cash flows to an HTML table string.""" header = ["date", "amount", "currency", "is_dividend", "source", "investment"] rows = [] for flow in cash_flows: rows.append((flow.date, float(flow.amount.number), flow.amount.currency, flow.is_dividend, flow.source, flow.account)) return pandas.DataFrame(columns=header, data=rows) def write_transactions_by_type(output_signatures: str, account_data: AccountData, dcontext: display_context.DisplayContext): """Write files of transactions by signature, for debugging.""" # Build signature map. signature_map = collections.defaultdict(list) for accdata in account_data: for entry in accdata.transactions: signature_map[entry.meta['signature']].append(entry) # Render them to files, for debugging. os.makedirs(output_signatures, exist_ok=True) for sig, sigentries in signature_map.items(): sigentries = data.sorted(sigentries) filename = "{}.org".format(sig) with open(path.join(output_signatures, filename), "w") as catfile: fprint = partial(print, file=catfile) fprint(";; -*- mode: beancount; coding: utf-8; fill-column: 400 -*-") description = get_description(sig) or "?" fprint("description: {}".format(description)) fprint("number_entries: {}".format(len(sigentries))) fprint() epr = printer.EntryPrinter(dcontext=dcontext, stringify_invalid_types=True) for entry in sigentries: fprint(epr(entry)) fprint() def extract(entries: data.Entries, dcontext: display_context.DisplayContext, config: Config, end_date: Date, check_explicit_flows: bool, output_dir: str) -> Dict[Account, AccountData]: """Extract data from the list of entries.""" # Note: It might be useful to have an option for "the end of its history" # for Ledger that aren't updated up to today. # Remove all data after end date, if specified. if end_date < entries[-1].date: entries = [entry for entry in entries if entry.date < end_date] # Prune the list of entries for performance. pruned_entries = prune_entries(entries, config) # Process all the accounts. account_data = [process_account_entries(pruned_entries, config.investments, aconfig, check_explicit_flows) for aconfig in config.investments.investment] account_data = list(filter(None, account_data)) account_data_map = {ad.account: ad for ad in account_data} if output_dir: # Write out a details file for each account for debugging. for ad in account_data_map.values(): basename = path.join(output_dir, ad.account.replace(":", "_")) write_account_file(dcontext, ad, basename + ".org") # Output transactions for each type (for debugging). write_transactions_by_type(path.join(output_dir, "signature"), account_data, dcontext) return account_data_map beangrow-master/beangrow/reports.py000077500000000000000000000540501475146671400200550ustar00rootroot00000000000000#!/usr/bin/env python3 """ Calculate my true returns, including dividends and real costs. """ __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" import collections import datetime import io import logging import multiprocessing import platform import subprocess import tempfile import typing from functools import partial from pathlib import Path from typing import Any, Dict, List, Optional, Tuple import matplotlib.dates as mdates import matplotlib.pyplot as plt import numpy as np import pandas as pd from beancount.core import data, prices from beancount.core.amount import Amount from beancount.parser import printer from dateutil.relativedelta import relativedelta from matplotlib.axes import Axes from pandas.plotting import register_matplotlib_converters from beangrow import investments from beangrow import returns as returnslib from beangrow.config_pb2 import Config, Group from beangrow.investments import AccountData, CashFlow from beangrow.returns import Pricer register_matplotlib_converters() # Basic type aliases. Account = str Currency = str Date = datetime.date Array = np.ndarray # The date at which we evaluate this. TODAY = Date.today() CurrencyPair = Tuple[Currency, Currency] IRR_FORMAT = "{:32}: {:6.2%} ({:6.2%} ex-div, {:6.2%} div)" STYLE = """ @media print { @page { margin: 0in; } body { margin: 0.2in; } .new-page { page-break-before: always; } } body, table { font: 9px Noto Sans, sans-serif; } p { margin: 0.2em; } table { border-collapse: collapse; } table td, table th { border: thin solid black; } table.full { width: 100%; } /* p { margin-bottom: .1em } */ """ RETURNS_TEMPLATE_PRE = """ {title}

{title}

""" RETURNS_TEMPLATE_POST = """ """ class Table(typing.NamedTuple): """ Table to be rendered to HTML. """ header: List[str] rows: List[List[Any]] def render_table( table: Table, floatfmt: Optional[str] = None, classes: Optional[List[str]] = None ) -> str: """Render a simple data table to HTML.""" oss = io.StringIO() fprint = partial(print, file=oss) fprint(''.format(" ".join(classes or []))) fprint("") for heading in table.header: fprint(f"") fprint("") for row in table.rows: fprint("") for value in row: if isinstance(value, float) and floatfmt: value = floatfmt.format(value) # noqa: PLW2901 fprint(f"") fprint("") fprint("
{heading}
{value}
") return oss.getvalue() # A named date interval: (name, start date, end date). Interval = Tuple[str, Date, Date] def compute_returns_table( pricer: Pricer, target_currency: Currency, account_data: List[AccountData], intervals: List[Interval], *, header_text: str = "Return", dietz: bool = False, ) -> Table: """Compute a table of sequential returns.""" header = [header_text] rows: List[list[str | float]] = [["Total"], ["Ex-div"], ["Div"]] for intname, date1, date2 in intervals: header.append(intname) cash_flows = returnslib.truncate_and_merge_cash_flows( pricer, account_data, date1, date2 ) returns = returnslib.compute_returns( cash_flows, pricer, target_currency, date2, dietz=dietz ) rows[0].append(returns.total) rows[1].append(returns.exdiv) rows[2].append(returns.div) return Table(header, rows) def write_returns_pdf( pdf_filename: str, *args, # noqa: ANN002 **kwargs, # noqa: ANN003 ) -> None: """Write out returns for a combined list of account account_data..""" logging.info("Writing returns file: %s", pdf_filename) with tempfile.TemporaryDirectory() as tmpdir: indexfile = write_returns_html(tmpdir, *args, **kwargs) command = [ "google-chrome", "--headless", "--disable-gpu", f"--print-to-pdf={pdf_filename}", indexfile, ] subprocess.check_call( command, # noqa: S603 stderr=open("/dev/null", "w"), # noqa: SIM115, PTH123 ) if not Path.exists(Path(pdf_filename)): msg = f"Failed to produce PDF: {pdf_filename}" raise RuntimeError(msg) logging.info("Done: file://%s", pdf_filename) def write_returns_html( # noqa: PLR0913 dirname: str, pricer: Pricer, account_data: List[AccountData], title: str, end_date: Date, target_currency: Optional[Currency] = None, ) -> str: """Write out returns report to a directory with files in it.""" logging.info("Writing returns dir for %s: %s", title, dirname) Path(dirname).mkdir(parents=True, exist_ok=True) with Path(Path(dirname) / "index.html").open("w") as indexfile: fprint = partial(print, file=indexfile) fprint(RETURNS_TEMPLATE_PRE.format(style=STYLE, title=title)) if not target_currency: cost_currencies = {r.cost_currency for r in account_data} target_currency = cost_currencies.pop() # assert ( # not cost_currencies # ), "Incompatible cost currencies {} for accounts {}".format( # cost_currencies, ",".join([r.account for r in account_data]) # ) if cost_currencies: msg = "Incompatible cost currencies {} for accounts {}".format( cost_currencies, ",".join([r.account for r in account_data]) ) raise ValueError(msg) # TOOD(blais): Prices should be plot separately, by currency. # fprint("

Prices

") # pairs = set((r.currency, r.cost_currency) for r in account_data) # plots = plot_prices(dirname, pricer.price_map, pairs) # for _, filename in sorted(plots.items()): # fprint(''.format(filename)) fprint("

Cash Flows

") cash_flows = returnslib.truncate_and_merge_cash_flows( pricer, account_data, None, end_date ) returns = returnslib.compute_returns( cash_flows, pricer, target_currency, end_date ) returns_dietz = returnslib.compute_returns( cash_flows, pricer, target_currency, end_date, dietz=True ) transactions = data.sorted( [txn for ad in account_data for txn in ad.transactions] ) # Note: This is where the vast majority of the time is spent. plots = plot_flows( dirname, pricer.price_map, target_currency, cash_flows, transactions, returns.total, ) fprint(''.format(plots["flows"])) fprint(''.format(plots["cumvalue"])) fprint("

Total returns

") fprint("

Internal Rate of Return (IRR)

") fprint( render_table( Table( ["Total", "Ex-Div", "Div"], [[returns.total, returns.exdiv, returns.div]], ), floatfmt="{:.2%}", ) ) fprint("

Modified Dietz return (MDRR)

") fprint( render_table( Table( ["Total", "Ex-Div", "Div"], [[returns_dietz.total, returns_dietz.exdiv, returns_dietz.div]], ), floatfmt="{:.2%}", ) ) fprint("

Annualized returns

") fprint("

Internal Rate of Return (IRR)

") # Compute table of returns over intervals. table = compute_returns_table( pricer, target_currency, account_data, get_calendar_intervals(TODAY) ) fprint("

", render_table(table, floatfmt="{:.1%}", classes=["full"]), "

") fprint("

Modified Dietz return (MDRR)

") table = compute_returns_table( pricer, target_currency, account_data, get_calendar_intervals(TODAY), dietz=True, ) fprint("

", render_table(table, floatfmt="{:.1%}", classes=["full"]), "

") fprint("

Cumulative returns

") fprint("

Internal Rate of Return (IRR)

") table = compute_returns_table( pricer, target_currency, account_data, get_cumulative_intervals(TODAY) ) fprint("

", render_table(table, floatfmt="{:.1%}", classes=["full"]), "

") fprint("

Modified Dietz return (MDRR)

") table = compute_returns_table( pricer, target_currency, account_data, get_cumulative_intervals(TODAY), dietz=True, ) fprint("

", render_table(table, floatfmt="{:.1%}", classes=["full"]), "

") fprint('

Accounts

') fprint(f"

Cost Currency: {target_currency}

") accounts_df = get_accounts_table(account_data) fprint(accounts_df.to_html()) fprint('

Cash Flows

') df_cash_flows = investments.cash_flows_to_table(cash_flows) fprint(df_cash_flows.to_html()) fprint(RETURNS_TEMPLATE_POST) return indexfile.name def write_returns_debugfile( filename: str, pricer: Pricer, account_data: List[AccountData], title: str, end_date: Date, _: Optional[Currency] = None, ) -> str: """Write out returns report to a directory with files in it.""" logging.info("Writing returns dir for %s: %s", title, filename) Path(filename).parent.mkdir(parents=True, exist_ok=True) with Path(filename).open("w") as indexfile: fprint = partial(print, file=indexfile) fprint(f"* {title}") fprint("** Cash Flows") fprint() cash_flows = returnslib.truncate_and_merge_cash_flows( pricer, account_data, None, end_date ) df_cash_flows = investments.cash_flows_to_table(cash_flows) fprint(df_cash_flows.to_string()) return indexfile.name def get_accounts_table(account_data: List[AccountData]) -> pd.DataFrame: """Build of table of per-account information.""" header = ["Investment", "Description", "Status"] rows = [] for ad in account_data: if ad.close is not None: status_str = "Closed" elif ad.balance.is_empty(): status_str = "Empty" else: status_str = "Active" name = ( ad.commodity.meta.get("name", ad.commodity.currency) if ad.commodity else "N/A" ) rows.append((ad.account, name, status_str)) return pd.DataFrame(data=rows, columns=header) def set_axis( ax_: Axes, date_min: Date, date_max: Date, ) -> None: """Set up X axis for dates.""" years = mdates.YearLocator() years_fmt = mdates.DateFormatter("%Y") months = mdates.MonthLocator() ax_.xaxis.set_major_locator(years) ax_.xaxis.set_major_formatter(years_fmt) ax_.xaxis.set_minor_locator(months) if date_min and date_max: datemin = np.datetime64(date_min, "Y") datemax = np.datetime64(date_max, "Y") + np.timedelta64(1, "Y") ax_.set_xlim(datemin, datemax) # type: ignore[] ax_.format_xdata = mdates.DateFormatter("%Y-%m-%d") ax_.format_ydata = "{:,}".format ax_.grid(visible=True) def plot_prices( output_dir: str, price_map: prices.PriceMap, pairs: List[CurrencyPair] ) -> Dict[str, str]: """Render one or more plots of prices.""" # Group by quote currencies. outplots = {} series = collections.defaultdict(list) for currency, quote_currency in pairs: series[quote_currency].append(currency) fig, axs = plt.subplots(len(series), 1, sharex=True, figsize=[10, 2 * len(series)]) if len(series) == 1: axs = [axs] for index, (qc, currencies) in enumerate(sorted(series.items())): ax = axs[index] for currency in currencies: price_points = prices.get_all_prices(price_map, (currency, qc)) # Render cash flows. dates = [date for date, _ in price_points] prices_ = [float(price) for _, price in price_points] set_axis(ax, dates[0] if dates else None, dates[-1] if dates else None) # type: ignore[] ax.plot(dates, prices_, linewidth=0.3) # type: ignore[] ax.scatter(dates, prices_, s=1.2) # type: ignore[] fig.autofmt_xdate() fig.tight_layout() # filename = outplots["price"] = path.join(output_dir, "price.svg") filename = outplots["price"] = Path(output_dir) / "price.svg" plt.savefig(filename) plt.close(fig) return outplots def plot_flows( # noqa: PLR0915, PLR0913 output_dir: str, price_map: prices.PriceMap, target_currency: Currency, flows: List[CashFlow], transactions: data.Entries, returns_rate: float, ) -> Dict[str, str]: """Produce plots from cash flows and returns, and more.""" # Render cash flows. outplots = {} dates = [f.date for f in flows] dates_exdiv = [f.date for f in flows if not f.is_dividend] dates_div = [f.date for f in flows if f.is_dividend] # amounts = np.array([f.amount.number for f in flows]) amounts_exdiv = np.array([f.amount.number for f in flows if not f.is_dividend]) amounts_div = np.array([f.amount.number for f in flows if f.is_dividend]) ax: Axes fig, axs = plt.subplots( 2, 1, sharex=True, figsize=[10, 4], gridspec_kw={"height_ratios": [3, 1]} ) for ax in axs: set_axis(ax, dates[0] if dates else None, dates[-1] if dates else None) # type: ignore[] ax.axhline(0, color="#000", linewidth=0.2) ax.vlines(dates_exdiv, 0, amounts_exdiv, linewidth=3, color="#000", alpha=0.7) # type: ignore[] ax.vlines(dates_div, 0, amounts_div, linewidth=3, color="#0A0", alpha=0.7) # type: ignore[] axs[1].set_yscale("symlog") axs[0].set_title("Cash Flows") axs[1].set_title("log(Cash Flows)") fig.autofmt_xdate() fig.tight_layout() filename = Path(output_dir) / "flows.svg" outplots["flows"] = "flows.svg" plt.savefig(filename) plt.close(fig) # Render cumulative cash flows, with returns growth. lw = 0.8 if dates: date_min = dates[0] - datetime.timedelta(days=1) date_max = dates[-1] num_days = (date_max - date_min).days dates_all = [dates[0] + datetime.timedelta(days=x) for x in range(num_days)] gamounts = np.zeros(num_days) rate = (1 + returns_rate) ** (1.0 / 365) for flow in flows: remaining_days = (date_max - flow.date).days amt = -float(flow.amount.number) # type: ignore[] if remaining_days > 0: gflow = amt * (rate ** np.arange(0, remaining_days)) gamounts[-remaining_days:] += gflow else: gamounts[-1] += amt fig, ax = plt.subplots(figsize=[10, 4]) ax.set_title("Cumulative value") set_axis(ax, dates[0] if dates else None, dates[-1] if dates else None) # type: ignore[] ax.axhline(0, color="#000", linewidth=lw) # ax.scatter(dates_all, gamounts, color='#000', alpha=0.2, s=1.0) ax.plot(dates_all, gamounts, color="#000", alpha=0.7, linewidth=lw) # Overlay value of assets over time. value_dates, value_values = returnslib.compute_portfolio_values( price_map, target_currency, transactions ) ax.plot(value_dates, value_values, color="#00F", alpha=0.5, linewidth=lw) ax.scatter(value_dates, value_values, color="#00F", alpha=lw, s=2) # type: ignore[] ax.legend(["Amortized value from flows", "Market value"], fontsize="xx-small") fig.autofmt_xdate() fig.tight_layout() filename = Path(output_dir) / "cumvalue.svg" outplots["cumvalue"] = "cumvalue.svg" plt.savefig(filename) plt.close(fig) return outplots def write_price_directives( filename: str, pricer: Pricer, days_price_threshold: int ) -> None: """Write a list of required price directives as a Beancount file.""" price_entries = [] for (currency, required_date), found_dates in sorted( pricer.required_prices.items() ): if len(found_dates) != 1: msg = f"Found multiple prices for {currency} on {required_date}: {found_dates}" # noqa: E501 raise ValueError(msg) cost_currency, actual_date, rate = found_dates.pop() days_late = (required_date - actual_date).days if days_late < days_price_threshold: continue price = data.Price({}, required_date, currency, Amount(rate, cost_currency)) # type: ignore[] price_entries.append(price) Path(filename).parent.mkdir(parents=True, exist_ok=True) with Path(filename).open("w") as prfile: printer.print_entries(price_entries, file=prfile) def get_calendar_intervals(date: Date) -> List[Interval]: """Return a list of date pairs for sequential intervals.""" intervals = [ (str(year), Date(year, 1, 1), Date(year + 1, 1, 1)) for year in range(date.year - 15, date.year) ] intervals.append((str(date.year), Date(date.year, 1, 1), date)) return intervals def get_cumulative_intervals(date: Date) -> List[Interval]: """Return a list of date pairs for sequential intervals.""" return [ ("15 years ago", Date(date.year - 15, 1, 1), date), ("10 years ago", Date(date.year - 10, 1, 1), date), ("5 years ago", Date(date.year - 5, 1, 1), date), ("4 years ago", Date(date.year - 4, 1, 1), date), ("3 years ago", Date(date.year - 3, 1, 1), date), ("2 years ago", Date(date.year - 2, 1, 1), date), ("1 year ago", Date(date.year - 1, 1, 1), date), ("YTD", Date(date.year, 1, 1), date), ("rolling 6 months ago", date - relativedelta(months=6), date), ("rolling 3 months ago", date - relativedelta(months=3), date), ] def generate_reports( # noqa: PLR0913 account_data_map: Dict[Account, AccountData], config: Config, # type: ignore[] price_map: prices.PriceMap, end_date: Date, output_dir: str, *, parallel: bool, pdf: bool, ) -> Pricer: """Produce the list of requested reports.""" pricer = Pricer(price_map) # Write out a returns file for every account. # os.makedirs(output_dir, exist_ok=True) multiprocessing.set_start_method( "spawn" if platform.system() == "Windows" else "fork" ) calls = [] for report in config.groups.group: adlist = [account_data_map[name] for name in report.investment] if not isinstance(adlist, list): msg = f"Expected list, got {type(adlist)}" raise TypeError(msg) if not all(isinstance(ad, AccountData) for ad in adlist): msg = f"Expected list of AccountData, got {adlist}" raise TypeError(msg) function = write_returns_pdf if pdf else write_returns_html basename = Path(output_dir) / report.name filename = f"{basename}.pdf" if pdf else basename calls.append( partial( function, filename, pricer, adlist, report.name, end_date, report.currency, ) ) calls.append( partial( write_returns_debugfile, f"{basename}.org", pricer, adlist, report.name, end_date, report.currency, ) ) if parallel: with multiprocessing.Pool(5) as pool: asyns = [pool.apply_async(func) for func in calls] for asyn in asyns: asyn.wait() if not asyn.successful(): msg = f"Failed to produce report: {asyn.get()}" raise RuntimeError(msg) else: for func in calls: func() return pricer def generate_report_mapper( item: Tuple[Group, List[AccountData]], # type: ignore[] price_map: prices.PriceMap, end_date: Date, ) -> Tuple[str, bytes]: """A mapper function that can be run from Beam to produce a PDF's bytes.""" # noqa: D401 report, adlist = item with tempfile.NamedTemporaryFile("wb") as tmpfile: pricer = Pricer(price_map) write_returns_pdf( tmpfile.name, pricer, adlist, report.name, end_date, report.currency ) tmpfile.flush() with Path(tmpfile.name).open("rb") as rfile: return (report.name, rfile.read()) def generate_price_pages( account_data_map: Dict[Account, AccountData], price_map: prices.PriceMap, output_dir: str, ) -> None: """ Produce renders of price time series for each currency. This should help us debug issues with price recording, in particulawr, with respect to stock splits. """ # Write out a returns file for every account. Path(output_dir).mkdir(parents=True, exist_ok=True) pairs = { (ad.currency, ad.cost_currency) for ad in account_data_map.values() if ad.currency and ad.cost_currency } for base_quote in sorted(pairs): logging.info("Producing price page for %s", base_quote) all_prices = prices.get_all_prices(price_map, base_quote) if not all_prices: continue dates = np.array([date for date, _ in all_prices]) prices_ = np.array([price for _, price in all_prices]) fig, ax = plt.subplots(1, 1, figsize=[10, 4]) set_axis(ax, dates[0], dates[-1]) ax.set_title("Prices for {} ({})".format(*base_quote)) ax.plot(dates, prices_, linewidth=0.5) ax.scatter(dates, prices_, s=2.0) fig.autofmt_xdate() fig.tight_layout() filename = Path(output_dir) / "{}_{}.svg".format(*base_quote) plt.savefig(filename) plt.close(fig) beangrow-master/beangrow/returns.py000077500000000000000000000306711475146671400200640ustar00rootroot00000000000000#!/usr/bin/env python3 """Library code to compute returns from series of cash flows.""" __copyright__ = "Copyright (C) 2020 Martin Blais" __license__ = "GNU GPLv2" import collections import datetime import itertools import logging import typing from typing import List, Optional, Tuple import numpy as np from beancount.core import convert, data, prices from beancount.core.amount import Amount from beancount.core.inventory import Inventory from beancount.core.number import ZERO from beancount.core.position import Position from scipy.optimize import fsolve from beangrow.investments import AccountData, CashFlow, Cat, compute_balance_at # Basic type aliases. Account = str Currency = str Date = datetime.date Array = np.ndarray ONE_DAY = datetime.timedelta(days=1) class Pricer: """A price database that remembers the queried prices and dates.""" def __init__(self, price_map: prices.PriceMap) -> None: """Create a new pricer object.""" self.price_map = price_map self.required_prices = collections.defaultdict(set) def get_value(self, pos: Position, date: Date) -> Amount: """Return the value and save the conversion rate.""" price_dates = [] price = convert.get_value(pos, self.price_map, date, price_dates) # Add prices found to the list of queried ones. for found_date, found_rate in price_dates: self.required_prices[(pos.units.currency, date)].add( (price.currency, found_date, found_rate) ) return price def convert_amount( self, amount: Amount, target_currency: Currency, date: Date ) -> Amount: """Convert an amount to a specific currency.""" # TODO(blais): Save the amount here too. return convert.convert_amount( amount, target_currency, self.price_map, date=date ) def net_present_value(irr: float, cash_flows: Array, years: Array) -> float: """Net present value; objective function for optimizer.""" # Note: We handle negative roots as per https://github.com/beancount/beangrow/issues/4. r = 1.0 + irr return np.sum(cash_flows / (np.sign(r) * (np.abs(r) ** years))) def compute_dietz( dated_flows: List[CashFlow], pricer: Pricer, target_currency: Currency, end_date: Date, ) -> float: """ Compute the Modified Dietz return. The Modified Dietz return is a method to compute the return of a series of cash flows. It's a time-weighted return that takes into account the time at which each cash flow occurs. Source: https://en.wikipedia.org/wiki/Modified_Dietz_method Formula: return = (B - A - F) / (A + sum(W_i * F_i)) Where: B = End value A = Start value F = Sum of cash flows W_i = Weight of each cash flow F_i = Cash flow amount The weight of each cash flow is computed as: W_i = (C - D_i) / C Where: C = Number of days in the period D_i = Number of days from the start of the period to the date of the cash flow Args: ---- dated_flows (List[CashFlow]): list of cash flows. pricer (Pricer): pricer object to convert amounts to target currency. target_currency (Currency): target currency. end_date (Date): end date of the period. """ # The last cash flow is a fictitious one that represents the current position. # I need to remove it to compute the Dietz return. start_date: None | Date = None days_in_period: int = 1 logging.debug("Inside Dietz. From %s to %s", start_date, end_date) # Array of cash flows, converted to target currency. usd_flows = [] usd_weights = [] start_value: float = 0.0 end_value: float = 0.0 val = 0.0 for flow in dated_flows: usd_amount = -float( pricer.convert_amount(flow.amount, target_currency, date=flow.date).number # type: ignore[] ) if flow.source == "open": start_value -= usd_amount elif flow.source == "close": end_value -= usd_amount val -= float(flow.amount.number) # type: ignore[] else: if start_date is None: logging.debug("Setting start date to %s", flow.date) start_date = flow.date days_in_period = (end_date - start_date).days # Formula: W_i = (C - D_i) / C weight = ( days_in_period - (flow.date - start_date).days + 1 ) / days_in_period usd_flows.append(usd_amount) # type: ignore[] usd_weights.append(weight) cash_flows = np.array(usd_flows) weights = np.array(usd_weights) weight_sum = 0 for i in range(len(cash_flows)): weight_sum += weights[i] * cash_flows[i] if end_value == 0 and start_value == 0: return 0.0 # Compute the Dietz return. # We use: # End as positive, because it is a cash outflow representing the end of the period. # Start as positive, because it's an inflow with a minus sign. It represents the # start of the period. pnl = end_value + start_value - np.sum(cash_flows) average_capital = -start_value + weight_sum dietz = pnl / average_capital logging.debug("Start date: %s", start_date) logging.debug("End date: %s", end_date) logging.debug( "PnL: %s + %s - %s = %s", end_value, start_value, np.sum(cash_flows), pnl ) logging.debug( "Average capital: %s + %s = %s", -start_value, weight_sum, average_capital ) logging.debug("Dietz return: %s", dietz) return dietz def compute_irr( dated_flows: List[CashFlow], pricer: Pricer, target_currency: Currency, end_date: Date, ) -> float: """Compute the irregularly spaced IRR.""" # Array of cash flows, converted to target currency. usd_flows = [] for flow in dated_flows: usd_amount = pricer.convert_amount(flow.amount, target_currency, date=flow.date) usd_flows.append(float(usd_amount.number)) # type: ignore[] cash_flows = np.array(usd_flows) # Array of time in years. years = [(flow.date - end_date).days / 365 for flow in dated_flows] years = np.array(years) # Start with something reasonably normal. estimated_irr = 0.2 * np.sign(np.sum(cash_flows)) # Solve for the root of the NPV equation. irr, *_ = fsolve( net_present_value, x0=estimated_irr, args=(cash_flows, years), full_output=True ) return np.maximum(irr.item(), -1) class Returns(typing.NamedTuple): """ A named tuple to represent the returns of a group of cash flows. groupname: The name of the group of cash flows. first_date: The first date of the cash flows. last_date: The last date of the cash flows. years: The number of years between the first and last date. total: The total return. exdiv: The total return excluding dividends. div: The total return from dividends. flows: The list of cash flows. """ groupname: str first_date: Date last_date: Date years: float total: float exdiv: float div: float flows: List[CashFlow] def compute_returns( flows: List[CashFlow], pricer: Pricer, target_currency: Currency, end_date: Date, *, dietz: bool = False, ) -> Returns: """Compute the returns from a list of cash flows.""" if not flows: return Returns("?", Date.today(), Date.today(), 0, 0, 0, 0, []) flows = sorted(flows, key=lambda cf: cf.date) if dietz: irr = compute_dietz(flows, pricer, target_currency, end_date) flows_exdiv = [flow for flow in flows if not flow.is_dividend] irr_exdiv = compute_dietz(flows_exdiv, pricer, target_currency, end_date) else: irr = compute_irr(flows, pricer, target_currency, end_date) flows_exdiv = [flow for flow in flows if not flow.is_dividend] irr_exdiv = compute_irr(flows_exdiv, pricer, target_currency, end_date) first_date = flows[0].date last_date = flows[-1].date years = (last_date - first_date).days / 365 return Returns( "?", first_date, last_date, years, irr, irr_exdiv, (irr - irr_exdiv), flows ) def truncate_cash_flows( # noqa: C901 pricer: Pricer, account_data: AccountData, date_start: Optional[Date], date_end: Optional[Date], ) -> List[CashFlow]: """Truncate the cash flows for the given account data.""" start_flows = [] end_flows = [] if date_start is not None: # Truncate before the start date. balance = compute_balance_at(account_data.transactions, date_start) if not balance.is_empty(): cost_balance = balance.reduce(pricer.get_value, date_start) cost_position = cost_balance.get_only_position() if cost_position: start_flows.append( CashFlow( date_start, -cost_position.units, False, # noqa: FBT003 "open", account_data.account, ) ) if date_end is not None: # Truncate after the end date. # Note: Avoid redundant balance iteration by computing it once and # caching it on every single transaction. balance = compute_balance_at(account_data.transactions, date_end) if not balance.is_empty(): cost_balance = balance.reduce(pricer.get_value, date_end - ONE_DAY) cost_position = cost_balance.get_only_position() if cost_position: end_flows.append( CashFlow( date_end, cost_position.units, False, # noqa: FBT003 "close", account_data.account, ) ) # Compute truncated flows. truncated_flows = [] for flow in account_data.cash_flows: if date_start and flow.date < date_start: continue if date_end and flow.date >= date_end: break truncated_flows.append(flow) cash_flows = start_flows + truncated_flows + end_flows cash_flows_dates = [cf.date for cf in cash_flows] if cash_flows_dates != sorted(cash_flows_dates): msg = "Cash flows are not sorted by date." raise ValueError(msg) return cash_flows def truncate_and_merge_cash_flows( pricer: Pricer, account_data_list: List[AccountData], date_start: Optional[Date], date_end: Optional[Date], ) -> List[CashFlow]: """Truncate and merge the cash flows for given list of account data.""" cash_flows = [] for ad in account_data_list: cash_flows.extend(truncate_cash_flows(pricer, ad, date_start, date_end)) cash_flows.sort(key=lambda item: item[0]) return cash_flows def compute_portfolio_values( price_map: prices.PriceMap, target_currency: Currency, transactions: data.Entries ) -> Tuple[List[Date], List[float]]: """Compute a serie of portfolio values over time.""" # Infer the list of required prices. currency_pairs = set() for entry in transactions: for posting in entry.postings: if posting.meta["category"] is Cat.ASSET and posting.cost: currency_pairs.add((posting.units.currency, posting.cost.currency)) first = lambda x: x[0] # noqa: E731 price_dates = sorted( itertools.chain( ( (date, None) for pair in currency_pairs for date, _ in prices.get_all_prices(price_map, pair) ), ((entry.date, entry) for entry in transactions), ), key=first, ) # Iterate computing the balance. value_dates = [] value_values = [] balance = Inventory() for date, group in itertools.groupby(price_dates, key=first): # Update balances. for _, entry in group: if entry is None: continue for posting in entry.postings: if posting.meta["category"] is Cat.ASSET: balance.add_position(posting) # Convert to market value. value_balance = balance.reduce(convert.get_value, price_map, date) cost_balance = value_balance.reduce( convert.convert_position, target_currency, price_map ) pos = cost_balance.get_only_position() value = pos.units.number if pos else ZERO # Add one data point. value_dates.append(date) value_values.append(value) return value_dates, value_values beangrow-master/beangrow/returns_test.py000066400000000000000000000076511475146671400211220ustar00rootroot00000000000000import datetime import unittest from decimal import Decimal as D from beancount import loader from beancount.core.amount import Amount from beancount.core import getters from beancount.core import prices from pytest import approx from beangrow.config import read_config_from_string from beangrow.investments import extract, CashFlow from beangrow.returns import Pricer, compute_irr, truncate_cash_flows def load(ledger: str, beangrow_cfg: str): entries, errors, options_map = loader.load_string(ledger) if errors: raise ValueError(errors) dcontext = options_map["dcontext"] accounts = getters.get_accounts(entries) price_map = prices.build_price_map(entries) pricer = Pricer(price_map) beangrow_config = read_config_from_string(beangrow_cfg, [], list(accounts)) account_data_map = extract(entries, dcontext, beangrow_config, entries[-1].date, False, "") return pricer, account_data_map TEST_CONFIG = """ investments { investment { currency: "CORP" asset_account: "Assets:CORP" dividend_accounts: "Income:CORP:Dividend" cash_accounts: "Assets:Cash" } } groups { group { name: "CORP" investment: "Assets:CORP" } } """ TEST_LEDGER = """ plugin "beancount.plugins.auto_accounts" plugin "beancount.plugins.implicit_prices" 2020-01-01 commodity CORP 2020-12-28 * "Buy 1 CORP" Assets:CORP 1 CORP {101 USD} Assets:Cash 2020-12-29 * "Buy 1 CORP" Assets:CORP 1 CORP {102 USD} Assets:Cash 2020-12-30 * "Buy 1 CORP" Assets:CORP 1 CORP {103 USD} Assets:Cash 2020-12-31 * "Buy 1 CORP" Assets:CORP 1 CORP {104 USD} Assets:Cash 2021-01-01 * "Buy 1 CORP" Assets:CORP 1 CORP {105 USD} Assets:Cash """ class ReturnsTest(unittest.TestCase): def test_truncate_cash_flows(self): pricer, account_data_map = load(TEST_LEDGER, TEST_CONFIG) cash_flows = truncate_cash_flows( pricer, account_data_map["Assets:CORP"], datetime.date(2020, 12, 30), datetime.date(2021, 1, 1) ) assert cash_flows == [ # truncate flows before 2020-12-30 # balance before 2020-12-30: 2 CORP # price on 2020-12-30: 103 USD CashFlow( date=datetime.date(2020, 12, 30), amount=Amount(D(-2 * 103), "USD"), is_dividend=False, source="open", account="Assets:CORP", ), CashFlow( date=datetime.date(2020, 12, 30), amount=Amount(D(-103), "USD"), is_dividend=False, source="cash", account="Assets:CORP", ), CashFlow( date=datetime.date(2020, 12, 31), amount=Amount(D(-104), "USD"), is_dividend=False, source="cash", account="Assets:CORP", ), # balance before 2021-01-01: 4 CORP # price on 2020-12-31: 104 USD CashFlow( date=datetime.date(2021, 1, 1), amount=Amount(D(4 * 104), "USD"), is_dividend=False, source="close", account="Assets:CORP", ), ] def test_compute_irr(self): pricer, account_data_map = load(TEST_LEDGER, TEST_CONFIG) cash_flows = truncate_cash_flows( pricer, account_data_map["Assets:CORP"], datetime.date(2020, 12, 30), datetime.date(2021, 1, 1) ) # 206 USD invested for 2 days + 103 USD invested for 2 days + 104 USD invested for 1 day = 416 USD # 206*(1+x)^(2/365) + 103*(1+x)^(2/365) + 104*(1+x)^(1/365) = 416 irr = compute_irr(cash_flows, pricer, "USD", datetime.date(2021, 1, 1)) assert irr == approx(3.530, abs=0.001) beangrow-master/example/000077500000000000000000000000001475146671400156255ustar00rootroot00000000000000beangrow-master/example/config.pbtxt000066400000000000000000000051131475146671400201550ustar00rootroot00000000000000investments { investment { currency: "GLD" asset_account: "Assets:US:ETrade:GLD" dividend_accounts: "Income:US:ETrade:GLD:Dividend" cash_accounts: "Assets:US:ETrade:Cash" } investment { currency: "ITOT" asset_account: "Assets:US:ETrade:ITOT" dividend_accounts: "Income:US:ETrade:ITOT:Dividend" cash_accounts: "Assets:US:ETrade:Cash" } investment { currency: "VEA" asset_account: "Assets:US:ETrade:VEA" dividend_accounts: "Income:US:ETrade:VEA:Dividend" cash_accounts: "Assets:US:ETrade:Cash" } investment { currency: "VHT" asset_account: "Assets:US:ETrade:VHT" dividend_accounts: "Income:US:ETrade:VHT:Dividend" cash_accounts: "Assets:US:ETrade:Cash" } investment { currency: "CORP" asset_account: "Assets:US:ETrade:CORP" dividend_accounts: "Income:US:ETrade:CORP:Dividend" cash_accounts: "Assets:US:ETrade:Cash" } investment { currency: "CORPEUR" asset_account: "Assets:US:ETrade:CORPEUR" cash_accounts: "Assets:US:ETrade:CashEUR" } investment { currency: "CORPSPL" asset_account: "Assets:US:ETrade:CORPSPL" cash_accounts: "Assets:US:ETrade:Cash" } investment { currency: "RGAGX" asset_account: "Assets:US:Vanguard:RGAGX" cash_accounts: "Assets:US:Vanguard:Cash" } investment { currency: "VBMPX" asset_account: "Assets:US:Vanguard:VBMPX" cash_accounts: "Assets:US:Vanguard:Cash" } } groups { group { name: "Gold" investment: "Assets:US:ETrade:GLD" } group { name: "iShares Core S&P Total U.S. Stock Market ETF" investment: "Assets:US:ETrade:ITOT" } group { name: "American Funds Growth Fund of America" investment: "Assets:US:Vanguard:RGAGX" } group { name: "Vanguard Total Bond Market Index Fund Institutional Plus Shares" investment: "Assets:US:Vanguard:VBMPX" } group { name: "Vanguard FTSE Developed Markets ETF" investment: "Assets:US:ETrade:VEA" } group { name: "Vanguard Health Care ETF" investment: "Assets:US:ETrade:VHT" } group { name: "CORP" investment: "Assets:US:ETrade:CORP" } group { name: "CORP (converted to EUR)" investment: "Assets:US:ETrade:CORP" currency: "EUR" } group { name: "CORPEUR" investment: "Assets:US:ETrade:CORPEUR" } group { name: "CORPSPL" investment: "Assets:US:ETrade:CORPSPL" } group { name: "CORP (all)" investment: "Assets:US:ETrade:CORP" investment: "Assets:US:ETrade:CORPEUR" currency: "USD" } group { name: "All investments" investment: "Assets:*" currency: "USD" } } beangrow-master/example/ledger.beancount000066400000000000000000007505601475146671400210040ustar00rootroot00000000000000;; -*- mode: org; mode: beancount; -*- ;; Birth: 1980-05-12 ;; Dates: 2020-01-01 - 2022-02-24 ;; THIS FILE HAS BEEN AUTO-GENERATED. * Options option "operating_currency" "USD" plugin "beancount.plugins.implicit_prices" 1980-05-12 custom "fava-option" "language" "en" 1980-05-12 custom "fava-extension" "fava_portfolio_returns" "{ 'beangrow_config': 'beangrow.pbtxt', #'beangrow_debug_dir': 'debug', }" * Commodities 1792-01-01 commodity USD export: "CASH" name: "US Dollar" 1900-01-01 commodity VMMXX export: "MUTF:VMMXX (MONEY:USD)" 1995-09-18 commodity VBMPX export: "MUTF:VBMPX" name: "Vanguard Total Bond Market Index Fund Institutional Plus Shares" price: "USD:google/MUTF:VBMPX" 2004-01-20 commodity ITOT export: "NYSEARCA:ITOT" name: "iShares Core S&P Total U.S. Stock Market ETF" price: "USD:google/NYSEARCA:ITOT" 2004-01-26 commodity VHT export: "NYSEARCA:VHT" name: "Vanguard Health Care ETF" price: "USD:google/NYSEARCA:VHT" 2004-11-01 commodity GLD export: "NYSEARCA:GLD" name: "SPDR Gold Trust (ETF)" price: "USD:google/NYSEARCA:GLD" 2007-07-20 commodity VEA export: "NYSEARCA:VEA" name: "Vanguard FTSE Developed Markets ETF" price: "USD:google/NYSEARCA:VEA" 2009-05-01 commodity RGAGX export: "MUTF:RGAGX" name: "American Funds The Growth Fund of America Class R-6" price: "USD:google/MUTF:RGAGX" * Equity Accounts 1980-05-12 open Equity:Opening-Balances 1980-05-12 open Liabilities:AccountsPayable * Banking 2020-01-01 open Assets:US:BofA address: "123 America Street, LargeTown, USA" institution: "Bank of America" phone: "+1.012.345.6789" 2020-01-01 open Assets:US:BofA:Checking USD account: "00234-48574897" 2020-01-01 * "Opening Balance for checking account" Assets:US:BofA:Checking 2863.71 USD Equity:Opening-Balances -2863.71 USD 2020-01-02 balance Assets:US:BofA:Checking 2863.71 USD 2020-01-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-01-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-01-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-01-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -57.87 USD Expenses:Home:Phone 57.87 USD 2020-01-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.99 USD Expenses:Home:Internet 79.99 USD 2020-01-25 balance Assets:US:BofA:Checking 2851.83 USD 2020-02-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-02-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-02-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-02-17 balance Assets:US:BofA:Checking 2491.46 USD 2020-02-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -60.94 USD Expenses:Home:Phone 60.94 USD 2020-02-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.13 USD Expenses:Home:Internet 80.13 USD 2020-03-03 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-03-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-03-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-03-11 balance Assets:US:BofA:Checking 689.56 USD 2020-03-19 * "Verizon Wireless" "" Assets:US:BofA:Checking -57.31 USD Expenses:Home:Phone 57.31 USD 2020-03-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.93 USD Expenses:Home:Internet 79.93 USD 2020-04-02 balance Assets:US:BofA:Checking 3253.52 USD 2020-04-03 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-04-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-04-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-04-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -55.86 USD Expenses:Home:Phone 55.86 USD 2020-04-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.88 USD Expenses:Home:Internet 79.88 USD 2020-04-30 balance Assets:US:BofA:Checking 2565.55 USD 2020-05-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-05-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-05-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-05-19 * "Verizon Wireless" "" Assets:US:BofA:Checking -49.72 USD Expenses:Home:Phone 49.72 USD 2020-05-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.92 USD Expenses:Home:Internet 79.92 USD 2020-05-27 balance Assets:US:BofA:Checking 1907.32 USD 2020-06-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-06-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-06-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-06-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -52.18 USD Expenses:Home:Phone 52.18 USD 2020-06-19 balance Assets:US:BofA:Checking 1406.63 USD 2020-06-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.78 USD Expenses:Home:Internet 79.78 USD 2020-07-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-07-06 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-07-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-07-12 balance Assets:US:BofA:Checking 0 USD 2020-07-19 * "Verizon Wireless" "" Assets:US:BofA:Checking -54.58 USD Expenses:Home:Phone 54.58 USD 2020-07-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.17 USD Expenses:Home:Internet 80.17 USD 2020-08-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-08-06 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-08-08 balance Assets:US:BofA:Checking 862.45 USD 2020-08-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-08-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -27.85 USD Expenses:Home:Phone 27.85 USD 2020-08-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.06 USD Expenses:Home:Internet 80.06 USD 2020-09-03 balance Assets:US:BofA:Checking 5232.37 USD 2020-09-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-09-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-09-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-09-11 * "Transfering accumulated savings to other account" Assets:US:BofA:Checking -3500 USD Assets:US:ETrade:Cash 3500 USD 2020-09-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -61.53 USD Expenses:Home:Phone 61.53 USD 2020-09-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.96 USD Expenses:Home:Internet 79.96 USD 2020-09-24 balance Assets:US:BofA:Checking 976.51 USD 2020-10-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-10-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-10-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-10-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -65.35 USD Expenses:Home:Phone 65.35 USD 2020-10-22 balance Assets:US:BofA:Checking 2900.73 USD 2020-10-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.13 USD Expenses:Home:Internet 80.13 USD 2020-10-23 * "Transfering accumulated savings to other account" Assets:US:BofA:Checking -4000 USD Assets:US:ETrade:Cash 4000 USD 2020-11-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-11-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-11-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-11-14 balance Assets:US:BofA:Checking 627.99 USD 2020-11-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -56.26 USD Expenses:Home:Phone 56.26 USD 2020-11-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.08 USD Expenses:Home:Internet 80.08 USD 2020-12-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2020-12-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2020-12-06 balance Assets:US:BofA:Checking 3227.31 USD 2020-12-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2020-12-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -59.07 USD Expenses:Home:Phone 59.07 USD 2020-12-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.04 USD Expenses:Home:Internet 80.04 USD 2020-12-29 balance Assets:US:BofA:Checking 5192.27 USD 2021-01-03 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-01-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-01-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-01-19 * "Verizon Wireless" "" Assets:US:BofA:Checking -54.81 USD Expenses:Home:Phone 54.81 USD 2021-01-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.85 USD Expenses:Home:Internet 79.85 USD 2021-01-24 balance Assets:US:BofA:Checking 5948.79 USD 2021-02-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-02-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-02-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-02-14 balance Assets:US:BofA:Checking 5465.26 USD 2021-02-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -56.80 USD Expenses:Home:Phone 56.80 USD 2021-02-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.97 USD Expenses:Home:Internet 79.97 USD 2021-03-03 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-03-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-03-08 balance Assets:US:BofA:Checking 4275.09 USD 2021-03-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-03-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -56.55 USD Expenses:Home:Phone 56.55 USD 2021-03-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.01 USD Expenses:Home:Internet 80.01 USD 2021-04-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-04-06 balance Assets:US:BofA:Checking 5169.88 USD 2021-04-06 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-04-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-04-19 * "Verizon Wireless" "" Assets:US:BofA:Checking -65.51 USD Expenses:Home:Phone 65.51 USD 2021-04-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.02 USD Expenses:Home:Internet 80.02 USD 2021-05-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-05-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-05-06 balance Assets:US:BofA:Checking 2271.16 USD 2021-05-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-05-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -67.10 USD Expenses:Home:Phone 67.10 USD 2021-05-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.88 USD Expenses:Home:Internet 79.88 USD 2021-06-01 balance Assets:US:BofA:Checking 3988.47 USD 2021-06-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-06-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-06-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-06-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -78.01 USD Expenses:Home:Phone 78.01 USD 2021-06-21 balance Assets:US:BofA:Checking 3261.49 USD 2021-06-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.06 USD Expenses:Home:Internet 80.06 USD 2021-07-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-07-06 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-07-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-07-14 balance Assets:US:BofA:Checking 1602.15 USD 2021-07-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -83.30 USD Expenses:Home:Phone 83.30 USD 2021-07-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.02 USD Expenses:Home:Internet 80.02 USD 2021-08-03 balance Assets:US:BofA:Checking 4140.03 USD 2021-08-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-08-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-08-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-08-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -56.04 USD Expenses:Home:Phone 56.04 USD 2021-08-23 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.86 USD Expenses:Home:Internet 79.86 USD 2021-08-24 balance Assets:US:BofA:Checking 3057.64 USD 2021-09-03 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-09-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-09-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-09-10 * "Transfering accumulated savings to other account" Assets:US:BofA:Checking -4500 USD Assets:US:ETrade:Cash 4500 USD 2021-09-20 * "Verizon Wireless" "" Assets:US:BofA:Checking -28.70 USD Expenses:Home:Phone 28.70 USD 2021-09-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.97 USD Expenses:Home:Internet 79.97 USD 2021-09-23 balance Assets:US:BofA:Checking 532.93 USD 2021-10-03 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-10-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-10-09 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-10-14 balance Assets:US:BofA:Checking 2671.54 USD 2021-10-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -41.37 USD Expenses:Home:Phone 41.37 USD 2021-10-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.00 USD Expenses:Home:Internet 80.00 USD 2021-10-22 * "Transfering accumulated savings to other account" Assets:US:BofA:Checking -4000 USD Assets:US:ETrade:Cash 4000 USD 2021-11-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-11-05 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-11-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-11-10 balance Assets:US:BofA:Checking 1182.37 USD 2021-11-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -74.51 USD Expenses:Home:Phone 74.51 USD 2021-11-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -80.11 USD Expenses:Home:Internet 80.11 USD 2021-12-03 balance Assets:US:BofA:Checking 5402.62 USD 2021-12-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2021-12-06 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2021-12-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2021-12-17 * "Transfering accumulated savings to other account" Assets:US:BofA:Checking -4000 USD Assets:US:ETrade:Cash 4000 USD 2021-12-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -61.23 USD Expenses:Home:Phone 61.23 USD 2021-12-21 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.96 USD Expenses:Home:Internet 79.96 USD 2021-12-31 balance Assets:US:BofA:Checking 3594.05 USD 2022-01-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2022-01-04 * "RiverBank Properties" "Paying the rent" Assets:US:BofA:Checking -2400.00 USD Expenses:Home:Rent 2400.00 USD 2022-01-08 * "EDISON POWER" "" Assets:US:BofA:Checking -65.00 USD Expenses:Home:Electricity 65.00 USD 2022-01-18 * "Verizon Wireless" "" Assets:US:BofA:Checking -47.33 USD Expenses:Home:Phone 47.33 USD 2022-01-22 * "Wine-Tarner Cable" "" Assets:US:BofA:Checking -79.93 USD Expenses:Home:Internet 79.93 USD 2022-01-23 balance Assets:US:BofA:Checking 1825.44 USD 2022-02-04 * "BANK FEES" "Monthly bank fee" Assets:US:BofA:Checking -4.00 USD Expenses:Financial:Fees 4.00 USD 2022-02-11 * "Transfering accumulated savings to other account" Assets:US:BofA:Checking -4000 USD Assets:US:ETrade:Cash 4000 USD 2022-02-19 balance Assets:US:BofA:Checking 522.64 USD 2022-02-20 * "Transfering ETrade to Checking" Assets:US:ETrade:Cash -3802.03 USD Assets:US:BofA:Checking 2022-02-20 * "Transfering Checking to ETrade:CashEUR" Assets:US:ETrade:CashEUR 110.00 EUR @@ 120.00 USD Assets:US:BofA:Checking 2022-02-21 balance Assets:US:ETrade:Cash 630.00 USD 2022-02-21 balance Assets:US:ETrade:CashEUR 110.00 EUR * Credit-Cards 1980-05-12 open Liabilities:US:Chase:Slate USD 2020-01-03 * "Cafe Modagor" "Eating out with work buddies" Liabilities:US:Chase:Slate -33.18 USD Expenses:Food:Restaurant 33.18 USD 2020-01-05 * "Chichipotle" "Eating out with Bill" Liabilities:US:Chase:Slate -20.97 USD Expenses:Food:Restaurant 20.97 USD 2020-01-08 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -52.07 USD Expenses:Food:Restaurant 52.07 USD 2020-01-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 106.22 USD Assets:US:BofA:Checking -106.22 USD 2020-01-11 * "Rose Flower" "Eating out alone" Liabilities:US:Chase:Slate -24.93 USD Expenses:Food:Restaurant 24.93 USD 2020-01-15 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -14.09 USD Expenses:Food:Restaurant 14.09 USD 2020-01-16 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -74.22 USD Expenses:Food:Groceries 74.22 USD 2020-01-17 * "Goba Goba" "Eating out after work" Liabilities:US:Chase:Slate -16.54 USD Expenses:Food:Restaurant 16.54 USD 2020-01-22 * "Kin Soy" "Eating out with Natasha" Liabilities:US:Chase:Slate -35.16 USD Expenses:Food:Restaurant 35.16 USD 2020-01-23 * "China Garden" "Eating out alone" Liabilities:US:Chase:Slate -21.16 USD Expenses:Food:Restaurant 21.16 USD 2020-01-27 * "Goba Goba" "Eating out with Joe" Liabilities:US:Chase:Slate -35.39 USD Expenses:Food:Restaurant 35.39 USD 2020-01-28 balance Liabilities:US:Chase:Slate -221.49 USD 2020-01-29 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -37.59 USD Expenses:Food:Restaurant 37.59 USD 2020-01-31 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-02-02 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -98.22 USD Expenses:Food:Groceries 98.22 USD 2020-02-03 * "Cafe Modagor" "Eating out with Joe" Liabilities:US:Chase:Slate -32.32 USD Expenses:Food:Restaurant 32.32 USD 2020-02-07 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -24.85 USD Expenses:Food:Restaurant 24.85 USD 2020-02-08 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -33.71 USD Expenses:Food:Restaurant 33.71 USD 2020-02-09 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 592.57 USD Assets:US:BofA:Checking -592.57 USD 2020-02-13 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -24.39 USD Expenses:Food:Restaurant 24.39 USD 2020-02-13 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -48.19 USD Expenses:Food:Groceries 48.19 USD 2020-02-17 * "China Garden" "Eating out with Bill" Liabilities:US:Chase:Slate -32.69 USD Expenses:Food:Restaurant 32.69 USD 2020-02-19 * "Cafe Modagor" "Eating out with Bill" Liabilities:US:Chase:Slate -27.20 USD Expenses:Food:Restaurant 27.20 USD 2020-02-21 * "Cafe Modagor" "Eating out alone" Liabilities:US:Chase:Slate -23.31 USD Expenses:Food:Restaurant 23.31 USD 2020-02-22 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -13.84 USD Expenses:Food:Restaurant 13.84 USD 2020-02-23 balance Liabilities:US:Chase:Slate -145.23 USD 2020-02-23 * "Uncle Boons" "Eating out " Liabilities:US:Chase:Slate -47.46 USD Expenses:Food:Restaurant 47.46 USD 2020-02-25 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -28.70 USD Expenses:Food:Restaurant 28.70 USD 2020-02-29 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -71.20 USD Expenses:Food:Groceries 71.20 USD 2020-03-01 * "Jewel of Morroco" "Eating out after work" Liabilities:US:Chase:Slate -25.66 USD Expenses:Food:Restaurant 25.66 USD 2020-03-02 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-03-03 * "Kin Soy" "Eating out with Joe" Liabilities:US:Chase:Slate -25.51 USD Expenses:Food:Restaurant 25.51 USD 2020-03-06 * "Kin Soy" "Eating out with Joe" Liabilities:US:Chase:Slate -25.94 USD Expenses:Food:Restaurant 25.94 USD 2020-03-08 * "Jewel of Morroco" "Eating out with Bill" Liabilities:US:Chase:Slate -31.56 USD Expenses:Food:Restaurant 31.56 USD 2020-03-09 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 542.43 USD Assets:US:BofA:Checking -542.43 USD 2020-03-11 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -21.17 USD Expenses:Food:Restaurant 21.17 USD 2020-03-12 * "Jewel of Morroco" "Eating out " Liabilities:US:Chase:Slate -26.10 USD Expenses:Food:Restaurant 26.10 USD 2020-03-13 * "Kin Soy" "Eating out with work buddies" Liabilities:US:Chase:Slate -32.53 USD Expenses:Food:Restaurant 32.53 USD 2020-03-16 * "Cafe Modagor" "Eating out with work buddies" Liabilities:US:Chase:Slate -93.62 USD Expenses:Food:Restaurant 93.62 USD 2020-03-17 balance Liabilities:US:Chase:Slate -152.25 USD 2020-03-18 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -39.01 USD Expenses:Food:Restaurant 39.01 USD 2020-03-19 * "Cafe Modagor" "Eating out with Julie" Liabilities:US:Chase:Slate -36.69 USD Expenses:Food:Restaurant 36.69 USD 2020-03-19 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -65.98 USD Expenses:Food:Groceries 65.98 USD 2020-03-24 * "China Garden" "Eating out " Liabilities:US:Chase:Slate -23.98 USD Expenses:Food:Restaurant 23.98 USD 2020-03-25 * "Goba Goba" "Eating out alone" Liabilities:US:Chase:Slate -36.61 USD Expenses:Food:Restaurant 36.61 USD 2020-03-28 * "Cafe Modagor" "Eating out with Joe" Liabilities:US:Chase:Slate -14.78 USD Expenses:Food:Restaurant 14.78 USD 2020-03-28 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -71.56 USD Expenses:Food:Groceries 71.56 USD 2020-03-30 * "Kin Soy" "Eating out after work" Liabilities:US:Chase:Slate -24.95 USD Expenses:Food:Restaurant 24.95 USD 2020-03-31 * "Cafe Modagor" "Eating out with Julie" Liabilities:US:Chase:Slate -49.04 USD Expenses:Food:Restaurant 49.04 USD 2020-04-01 * "Goba Goba" "Eating out with Natasha" Liabilities:US:Chase:Slate -28.35 USD Expenses:Food:Restaurant 28.35 USD 2020-04-03 * "Jewel of Morroco" "Eating out " Liabilities:US:Chase:Slate -44.05 USD Expenses:Food:Restaurant 44.05 USD 2020-04-04 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-04-07 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -37.58 USD Expenses:Food:Restaurant 37.58 USD 2020-04-09 balance Liabilities:US:Chase:Slate -744.83 USD 2020-04-09 * "China Garden" "Eating out with Bill" Liabilities:US:Chase:Slate -39.60 USD Expenses:Food:Restaurant 39.60 USD 2020-04-09 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 784.43 USD Assets:US:BofA:Checking -784.43 USD 2020-04-11 * "Uncle Boons" "Eating out alone" Liabilities:US:Chase:Slate -22.46 USD Expenses:Food:Restaurant 22.46 USD 2020-04-13 * "Kin Soy" "Eating out with Joe" Liabilities:US:Chase:Slate -38.33 USD Expenses:Food:Restaurant 38.33 USD 2020-04-13 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -84.30 USD Expenses:Food:Groceries 84.30 USD 2020-04-15 * "China Garden" "Eating out " Liabilities:US:Chase:Slate -31.83 USD Expenses:Food:Restaurant 31.83 USD 2020-04-17 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -36.39 USD Expenses:Food:Restaurant 36.39 USD 2020-04-18 * "Goba Goba" "Eating out with Natasha" Liabilities:US:Chase:Slate -32.10 USD Expenses:Food:Restaurant 32.10 USD 2020-04-20 * "Kin Soy" "Eating out after work" Liabilities:US:Chase:Slate -48.41 USD Expenses:Food:Restaurant 48.41 USD 2020-04-22 * "Rose Flower" "Eating out alone" Liabilities:US:Chase:Slate -26.61 USD Expenses:Food:Restaurant 26.61 USD 2020-04-23 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -47.31 USD Expenses:Food:Groceries 47.31 USD 2020-04-27 * "Kin Soy" "Eating out after work" Liabilities:US:Chase:Slate -20.33 USD Expenses:Food:Restaurant 20.33 USD 2020-05-02 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -33.36 USD Expenses:Food:Restaurant 33.36 USD 2020-05-03 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-05-06 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -31.40 USD Expenses:Food:Restaurant 31.40 USD 2020-05-06 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -130.02 USD Expenses:Food:Groceries 130.02 USD 2020-05-08 balance Liabilities:US:Chase:Slate -702.85 USD 2020-05-10 * "China Garden" "Eating out with Natasha" Liabilities:US:Chase:Slate -25.41 USD Expenses:Food:Restaurant 25.41 USD 2020-05-11 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 760.79 USD Assets:US:BofA:Checking -760.79 USD 2020-05-13 * "Kin Soy" "Eating out " Liabilities:US:Chase:Slate -32.53 USD Expenses:Food:Restaurant 32.53 USD 2020-05-17 * "Jewel of Morroco" "Eating out with Julie" Liabilities:US:Chase:Slate -25.42 USD Expenses:Food:Restaurant 25.42 USD 2020-05-18 * "Jewel of Morroco" "Eating out with work buddies" Liabilities:US:Chase:Slate -42.77 USD Expenses:Food:Restaurant 42.77 USD 2020-05-23 * "Kin Soy" "Eating out with work buddies" Liabilities:US:Chase:Slate -29.60 USD Expenses:Food:Restaurant 29.60 USD 2020-05-25 * "Uncle Boons" "Eating out with Julie" Liabilities:US:Chase:Slate -46.29 USD Expenses:Food:Restaurant 46.29 USD 2020-05-25 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -87.89 USD Expenses:Food:Groceries 87.89 USD 2020-05-26 * "Cafe Modagor" "Eating out " Liabilities:US:Chase:Slate -53.11 USD Expenses:Food:Restaurant 53.11 USD 2020-05-28 * "Kin Soy" "Eating out with Natasha" Liabilities:US:Chase:Slate -29.55 USD Expenses:Food:Restaurant 29.55 USD 2020-05-30 balance Liabilities:US:Chase:Slate -314.63 USD 2020-05-31 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-06-02 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -51.20 USD Expenses:Food:Restaurant 51.20 USD 2020-06-03 * "Chichipotle" "Eating out " Liabilities:US:Chase:Slate -47.66 USD Expenses:Food:Restaurant 47.66 USD 2020-06-03 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -94.54 USD Expenses:Food:Groceries 94.54 USD 2020-06-05 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -38.18 USD Expenses:Food:Restaurant 38.18 USD 2020-06-07 * "China Garden" "Eating out after work" Liabilities:US:Chase:Slate -14.50 USD Expenses:Food:Restaurant 14.50 USD 2020-06-07 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 680.71 USD Assets:US:BofA:Checking -680.71 USD 2020-06-11 * "Kin Soy" "Eating out with Natasha" Liabilities:US:Chase:Slate -34.65 USD Expenses:Food:Restaurant 34.65 USD 2020-06-11 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -100.94 USD Expenses:Food:Groceries 100.94 USD 2020-06-16 * "Jewel of Morroco" "Eating out with Julie" Liabilities:US:Chase:Slate -12.66 USD Expenses:Food:Restaurant 12.66 USD 2020-06-17 * "Chichipotle" "Eating out with Joe" Liabilities:US:Chase:Slate -23.85 USD Expenses:Food:Restaurant 23.85 USD 2020-06-21 * "Rose Flower" "Eating out with Bill" Liabilities:US:Chase:Slate -17.01 USD Expenses:Food:Restaurant 17.01 USD 2020-06-23 event "location" "San Francisco" 2020-06-24 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -74.96 USD Expenses:Food:Restaurant 74.96 USD 2020-06-25 balance Liabilities:US:Chase:Slate -264.07 USD 2020-06-26 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -68.70 USD Expenses:Food:Restaurant 68.70 USD 2020-06-26 * "Waterbar" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -52.03 USD Expenses:Food:Restaurant 52.03 USD 2020-06-27 * "Mission Chinese Food" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -16.48 USD Expenses:Food:Restaurant 16.48 USD 2020-06-28 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -58.99 USD Expenses:Food:Restaurant 58.99 USD 2020-06-28 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -6.15 USD Expenses:Food:Coffee 6.15 USD 2020-06-29 * "Pizza Delfina" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -18.61 USD Expenses:Food:Restaurant 18.61 USD 2020-06-29 * "Mission Chinese Food" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -25.21 USD Expenses:Food:Restaurant 25.21 USD 2020-06-29 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -6.28 USD Expenses:Food:Coffee 6.28 USD 2020-06-30 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -69.03 USD Expenses:Food:Restaurant 69.03 USD 2020-06-30 * "Pizza Delfina" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -17.76 USD Expenses:Food:Restaurant 17.76 USD 2020-06-30 * "Mission Chinese Food" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -31.63 USD Expenses:Food:Restaurant 31.63 USD 2020-07-01 * "Mission Chinese Food" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -31.55 USD Expenses:Food:Restaurant 31.55 USD 2020-07-01 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -6.00 USD Expenses:Food:Coffee 6.00 USD 2020-07-02 * "Waterbar" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -52.67 USD Expenses:Food:Restaurant 52.67 USD 2020-07-02 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -4.92 USD Expenses:Food:Coffee 4.92 USD 2020-07-03 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -72.30 USD Expenses:Food:Restaurant 72.30 USD 2020-07-03 * "Pizza Delfina" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -21.09 USD Expenses:Food:Restaurant 21.09 USD 2020-07-03 * "Waterbar" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -38.14 USD Expenses:Food:Restaurant 38.14 USD 2020-07-04 * "Pizza Delfina" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -19.30 USD Expenses:Food:Restaurant 19.30 USD 2020-07-05 * "Waterbar" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -47.86 USD Expenses:Food:Restaurant 47.86 USD 2020-07-05 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -5.93 USD Expenses:Food:Coffee 5.93 USD 2020-07-06 * "Mission Chinese Food" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -32.61 USD Expenses:Food:Restaurant 32.61 USD 2020-07-07 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -70.01 USD Expenses:Food:Restaurant 70.01 USD 2020-07-08 * "Waterbar" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -37.90 USD Expenses:Food:Restaurant 37.90 USD 2020-07-08 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -5.98 USD Expenses:Food:Coffee 5.98 USD 2020-07-09 * "Bar Crudo" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -64.31 USD Expenses:Food:Restaurant 64.31 USD 2020-07-09 * "Pizza Delfina" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -17.70 USD Expenses:Food:Restaurant 17.70 USD 2020-07-10 * "Pizza Delfina" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -21.24 USD Expenses:Food:Restaurant 21.24 USD 2020-07-10 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -5.88 USD Expenses:Food:Coffee 5.88 USD 2020-07-11 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 208.45 USD Assets:US:BofA:Checking -208.45 USD 2020-07-14 * "Starbucks" "" #trip-san-francisco-2020 Liabilities:US:Chase:Slate -6.53 USD Expenses:Food:Coffee 6.53 USD 2020-07-14 * "Consume vacation days" 2020-07-14 event "location" "New Metropolis" 2020-07-15 balance Liabilities:US:Chase:Slate -988.41 USD 2020-07-15 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -19.34 USD Expenses:Food:Restaurant 19.34 USD 2020-07-17 * "Chichipotle" "Eating out after work" Liabilities:US:Chase:Slate -36.76 USD Expenses:Food:Restaurant 36.76 USD 2020-07-18 * "Jewel of Morroco" "Eating out with Bill" Liabilities:US:Chase:Slate -38.07 USD Expenses:Food:Restaurant 38.07 USD 2020-07-21 * "Chichipotle" "Eating out with Bill" Liabilities:US:Chase:Slate -25.05 USD Expenses:Food:Restaurant 25.05 USD 2020-07-25 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -36.78 USD Expenses:Food:Restaurant 36.78 USD 2020-07-26 * "Chichipotle" "Eating out with Natasha" Liabilities:US:Chase:Slate -20.53 USD Expenses:Food:Restaurant 20.53 USD 2020-07-28 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-07-29 * "Rose Flower" "Eating out alone" Liabilities:US:Chase:Slate -25.97 USD Expenses:Food:Restaurant 25.97 USD 2020-07-29 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -62.70 USD Expenses:Food:Groceries 62.70 USD 2020-07-30 * "Jewel of Morroco" "Eating out with Bill" Liabilities:US:Chase:Slate -22.89 USD Expenses:Food:Restaurant 22.89 USD 2020-08-03 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -35.34 USD Expenses:Food:Restaurant 35.34 USD 2020-08-07 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -14.55 USD Expenses:Food:Restaurant 14.55 USD 2020-08-09 * "China Garden" "Eating out with work buddies" Liabilities:US:Chase:Slate -42.79 USD Expenses:Food:Restaurant 42.79 USD 2020-08-11 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -76.94 USD Expenses:Food:Groceries 76.94 USD 2020-08-11 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 558.37 USD Assets:US:BofA:Checking -558.37 USD 2020-08-13 * "Cafe Modagor" "Eating out with Julie" Liabilities:US:Chase:Slate -54.48 USD Expenses:Food:Restaurant 54.48 USD 2020-08-14 balance Liabilities:US:Chase:Slate -1062.23 USD 2020-08-18 * "Chichipotle" "Eating out " Liabilities:US:Chase:Slate -34.54 USD Expenses:Food:Restaurant 34.54 USD 2020-08-21 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -69.36 USD Expenses:Food:Groceries 69.36 USD 2020-08-23 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -71.64 USD Expenses:Food:Restaurant 71.64 USD 2020-08-24 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-08-28 * "Goba Goba" "Eating out with Julie" Liabilities:US:Chase:Slate -43.12 USD Expenses:Food:Restaurant 43.12 USD 2020-08-28 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -67.16 USD Expenses:Food:Groceries 67.16 USD 2020-08-31 * "Rose Flower" "Eating out " Liabilities:US:Chase:Slate -15.58 USD Expenses:Food:Restaurant 15.58 USD 2020-09-02 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -14.85 USD Expenses:Food:Restaurant 14.85 USD 2020-09-03 * "China Garden" "Eating out with work buddies" Liabilities:US:Chase:Slate -23.35 USD Expenses:Food:Restaurant 23.35 USD 2020-09-04 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -86.69 USD Expenses:Food:Groceries 86.69 USD 2020-09-07 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -26.72 USD Expenses:Food:Restaurant 26.72 USD 2020-09-08 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -23.00 USD Expenses:Food:Restaurant 23.00 USD 2020-09-10 * "Chichipotle" "Eating out with Natasha" Liabilities:US:Chase:Slate -14.89 USD Expenses:Food:Restaurant 14.89 USD 2020-09-11 balance Liabilities:US:Chase:Slate -1673.13 USD 2020-09-11 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 695.97 USD Assets:US:BofA:Checking -695.97 USD 2020-09-12 * "China Garden" "Eating out with Joe" Liabilities:US:Chase:Slate -30.59 USD Expenses:Food:Restaurant 30.59 USD 2020-09-16 * "Jewel of Morroco" "Eating out with Bill" Liabilities:US:Chase:Slate -33.62 USD Expenses:Food:Restaurant 33.62 USD 2020-09-17 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -52.84 USD Expenses:Food:Groceries 52.84 USD 2020-09-19 * "Cafe Modagor" "Eating out with Joe" Liabilities:US:Chase:Slate -76.98 USD Expenses:Food:Restaurant 76.98 USD 2020-09-21 * "Goba Goba" "Eating out " Liabilities:US:Chase:Slate -23.44 USD Expenses:Food:Restaurant 23.44 USD 2020-09-21 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-09-22 * "Uncle Boons" "Eating out with Julie" Liabilities:US:Chase:Slate -49.16 USD Expenses:Food:Restaurant 49.16 USD 2020-09-24 * "China Garden" "Eating out with Bill" Liabilities:US:Chase:Slate -40.49 USD Expenses:Food:Restaurant 40.49 USD 2020-09-27 * "Cafe Modagor" "Eating out after work" Liabilities:US:Chase:Slate -31.03 USD Expenses:Food:Restaurant 31.03 USD 2020-09-28 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -44.95 USD Expenses:Food:Groceries 44.95 USD 2020-10-01 * "Uncle Boons" "Eating out with Natasha" Liabilities:US:Chase:Slate -36.97 USD Expenses:Food:Restaurant 36.97 USD 2020-10-02 * "Chichipotle" "Eating out with Natasha" Liabilities:US:Chase:Slate -19.14 USD Expenses:Food:Restaurant 19.14 USD 2020-10-06 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -23.57 USD Expenses:Food:Restaurant 23.57 USD 2020-10-07 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 642.63 USD Assets:US:BofA:Checking -642.63 USD 2020-10-08 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -90.44 USD Expenses:Food:Groceries 90.44 USD 2020-10-09 balance Liabilities:US:Chase:Slate -1007.75 USD 2020-10-09 * "Goba Goba" "Eating out after work" Liabilities:US:Chase:Slate -28.97 USD Expenses:Food:Restaurant 28.97 USD 2020-10-10 * "Cafe Modagor" "Eating out " Liabilities:US:Chase:Slate -28.73 USD Expenses:Food:Restaurant 28.73 USD 2020-10-12 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -39.70 USD Expenses:Food:Restaurant 39.70 USD 2020-10-16 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -55.77 USD Expenses:Food:Restaurant 55.77 USD 2020-10-18 * "Chichipotle" "Eating out with Natasha" Liabilities:US:Chase:Slate -69.43 USD Expenses:Food:Restaurant 69.43 USD 2020-10-23 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -20.25 USD Expenses:Food:Restaurant 20.25 USD 2020-10-23 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-10-25 * "Rose Flower" "Eating out with work buddies" Liabilities:US:Chase:Slate -26.46 USD Expenses:Food:Restaurant 26.46 USD 2020-10-27 * "China Garden" "Eating out alone" Liabilities:US:Chase:Slate -41.37 USD Expenses:Food:Restaurant 41.37 USD 2020-10-28 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -71.96 USD Expenses:Food:Groceries 71.96 USD 2020-10-30 * "Goba Goba" "Eating out with Julie" Liabilities:US:Chase:Slate -60.67 USD Expenses:Food:Restaurant 60.67 USD 2020-11-04 * "Goba Goba" "Eating out with Bill" Liabilities:US:Chase:Slate -45.76 USD Expenses:Food:Restaurant 45.76 USD 2020-11-05 balance Liabilities:US:Chase:Slate -1616.82 USD 2020-11-06 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -37.76 USD Expenses:Food:Restaurant 37.76 USD 2020-11-06 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -128.07 USD Expenses:Food:Groceries 128.07 USD 2020-11-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 824.81 USD Assets:US:BofA:Checking -824.81 USD 2020-11-11 * "Jewel of Morroco" "Eating out " Liabilities:US:Chase:Slate -49.91 USD Expenses:Food:Restaurant 49.91 USD 2020-11-15 * "Rose Flower" "Eating out with Julie" Liabilities:US:Chase:Slate -45.99 USD Expenses:Food:Restaurant 45.99 USD 2020-11-15 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -124.72 USD Expenses:Food:Groceries 124.72 USD 2020-11-16 * "Uncle Boons" "Eating out with Julie" Liabilities:US:Chase:Slate -40.03 USD Expenses:Food:Restaurant 40.03 USD 2020-11-18 * "Cafe Modagor" "Eating out with Joe" Liabilities:US:Chase:Slate -21.57 USD Expenses:Food:Restaurant 21.57 USD 2020-11-23 * "Chichipotle" "Eating out after work" Liabilities:US:Chase:Slate -53.17 USD Expenses:Food:Restaurant 53.17 USD 2020-11-24 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -84.96 USD Expenses:Food:Groceries 84.96 USD 2020-11-24 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-11-25 balance Liabilities:US:Chase:Slate -1498.19 USD 2020-11-28 * "Rose Flower" "Eating out with Joe" Liabilities:US:Chase:Slate -25.49 USD Expenses:Food:Restaurant 25.49 USD 2020-12-01 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -13.72 USD Expenses:Food:Restaurant 13.72 USD 2020-12-01 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -73.84 USD Expenses:Food:Groceries 73.84 USD 2020-12-04 * "Kin Soy" "Eating out alone" Liabilities:US:Chase:Slate -23.96 USD Expenses:Food:Restaurant 23.96 USD 2020-12-08 * "Cafe Modagor" "Eating out with Joe" Liabilities:US:Chase:Slate -35.62 USD Expenses:Food:Restaurant 35.62 USD 2020-12-08 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -87.39 USD Expenses:Food:Groceries 87.39 USD 2020-12-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 663.07 USD Assets:US:BofA:Checking -663.07 USD 2020-12-10 * "Cafe Modagor" "Eating out alone" Liabilities:US:Chase:Slate -76.93 USD Expenses:Food:Restaurant 76.93 USD 2020-12-11 * "Chichipotle" "Eating out with Joe" Liabilities:US:Chase:Slate -21.31 USD Expenses:Food:Restaurant 21.31 USD 2020-12-16 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -30.32 USD Expenses:Food:Restaurant 30.32 USD 2020-12-17 * "Jewel of Morroco" "Eating out alone" Liabilities:US:Chase:Slate -71.34 USD Expenses:Food:Restaurant 71.34 USD 2020-12-18 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -130.60 USD Expenses:Food:Groceries 130.60 USD 2020-12-21 * "Cafe Modagor" "Eating out alone" Liabilities:US:Chase:Slate -27.76 USD Expenses:Food:Restaurant 27.76 USD 2020-12-22 balance Liabilities:US:Chase:Slate -1453.40 USD 2020-12-22 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -27.39 USD Expenses:Food:Restaurant 27.39 USD 2020-12-23 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2020-12-26 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -11.38 USD Expenses:Food:Restaurant 11.38 USD 2020-12-29 * "Uncle Boons" "Eating out alone" Liabilities:US:Chase:Slate -36.63 USD Expenses:Food:Restaurant 36.63 USD 2021-01-03 * "Jewel of Morroco" "Eating out after work" Liabilities:US:Chase:Slate -17.42 USD Expenses:Food:Restaurant 17.42 USD 2021-01-03 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -92.51 USD Expenses:Food:Groceries 92.51 USD 2021-01-06 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -22.70 USD Expenses:Food:Restaurant 22.70 USD 2021-01-10 * "Rose Flower" "Eating out after work" Liabilities:US:Chase:Slate -31.02 USD Expenses:Food:Restaurant 31.02 USD 2021-01-11 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 822.56 USD Assets:US:BofA:Checking -822.56 USD 2021-01-13 * "China Garden" "Eating out with Joe" Liabilities:US:Chase:Slate -17.86 USD Expenses:Food:Restaurant 17.86 USD 2021-01-17 * "Rose Flower" "Eating out with work buddies" Liabilities:US:Chase:Slate -50.72 USD Expenses:Food:Restaurant 50.72 USD 2021-01-17 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -137.79 USD Expenses:Food:Groceries 137.79 USD 2021-01-19 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-01-20 balance Liabilities:US:Chase:Slate -1316.26 USD 2021-01-20 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -42.62 USD Expenses:Food:Restaurant 42.62 USD 2021-01-24 * "Chichipotle" "Eating out with Bill" Liabilities:US:Chase:Slate -32.77 USD Expenses:Food:Restaurant 32.77 USD 2021-01-24 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -116.23 USD Expenses:Food:Groceries 116.23 USD 2021-01-28 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -16.78 USD Expenses:Food:Restaurant 16.78 USD 2021-01-31 * "Kin Soy" "Eating out with Joe" Liabilities:US:Chase:Slate -28.40 USD Expenses:Food:Restaurant 28.40 USD 2021-02-04 * "China Garden" "Eating out " Liabilities:US:Chase:Slate -27.15 USD Expenses:Food:Restaurant 27.15 USD 2021-02-05 * "Chichipotle" "Eating out with Bill" Liabilities:US:Chase:Slate -23.03 USD Expenses:Food:Restaurant 23.03 USD 2021-02-06 * "Cafe Modagor" "Eating out with Bill" Liabilities:US:Chase:Slate -25.34 USD Expenses:Food:Restaurant 25.34 USD 2021-02-07 * "Cafe Modagor" "Eating out with Bill" Liabilities:US:Chase:Slate -68.92 USD Expenses:Food:Restaurant 68.92 USD 2021-02-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 715.73 USD Assets:US:BofA:Checking -715.73 USD 2021-02-11 * "China Garden" "Eating out with Natasha" Liabilities:US:Chase:Slate -25.98 USD Expenses:Food:Restaurant 25.98 USD 2021-02-11 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -74.90 USD Expenses:Food:Groceries 74.90 USD 2021-02-12 event "location" "Chicago" 2021-02-13 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -41.06 USD Expenses:Food:Restaurant 41.06 USD 2021-02-14 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -25.08 USD Expenses:Food:Restaurant 25.08 USD 2021-02-14 * "Eataly Chicago" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -49.28 USD Expenses:Food:Restaurant 49.28 USD 2021-02-15 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -24.10 USD Expenses:Food:Restaurant 24.10 USD 2021-02-16 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -21.72 USD Expenses:Food:Restaurant 21.72 USD 2021-02-16 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.46 USD Expenses:Food:Coffee 6.46 USD 2021-02-17 balance Liabilities:US:Chase:Slate -1250.35 USD 2021-02-17 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -25.66 USD Expenses:Food:Restaurant 25.66 USD 2021-02-17 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -21.51 USD Expenses:Food:Restaurant 21.51 USD 2021-02-18 * "Another Sports Pub" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -14.37 USD Expenses:Food:Alcohol 14.37 USD 2021-02-18 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -5.90 USD Expenses:Food:Coffee 5.90 USD 2021-02-19 * "Another Sports Pub" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -11.59 USD Expenses:Food:Alcohol 11.59 USD 2021-02-20 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -13.13 USD Expenses:Food:Restaurant 13.13 USD 2021-02-20 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -37.80 USD Expenses:Food:Restaurant 37.80 USD 2021-02-20 * "Another Sports Pub" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -15.23 USD Expenses:Food:Alcohol 15.23 USD 2021-02-20 * "Consume vacation days" 2021-02-20 event "location" "New Metropolis" 2021-02-21 * "Chichipotle" "Eating out with Joe" Liabilities:US:Chase:Slate -30.24 USD Expenses:Food:Restaurant 30.24 USD 2021-02-22 * "China Garden" "Eating out after work" Liabilities:US:Chase:Slate -22.78 USD Expenses:Food:Restaurant 22.78 USD 2021-02-23 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -124.78 USD Expenses:Food:Groceries 124.78 USD 2021-02-25 * "China Garden" "Eating out with Bill" Liabilities:US:Chase:Slate -30.33 USD Expenses:Food:Restaurant 30.33 USD 2021-02-26 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -47.97 USD Expenses:Food:Restaurant 47.97 USD 2021-02-28 * "Rose Flower" "Eating out with Bill" Liabilities:US:Chase:Slate -45.50 USD Expenses:Food:Restaurant 45.50 USD 2021-03-02 * "Cafe Modagor" "Eating out with work buddies" Liabilities:US:Chase:Slate -23.88 USD Expenses:Food:Restaurant 23.88 USD 2021-03-03 * "Kin Soy" "Eating out with Natasha" Liabilities:US:Chase:Slate -51.25 USD Expenses:Food:Restaurant 51.25 USD 2021-03-08 * "Chichipotle" "Eating out with Natasha" Liabilities:US:Chase:Slate -30.85 USD Expenses:Food:Restaurant 30.85 USD 2021-03-08 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -46.52 USD Expenses:Food:Groceries 46.52 USD 2021-03-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 482.48 USD Assets:US:BofA:Checking -482.48 USD 2021-03-12 * "Chichipotle" "Eating out " Liabilities:US:Chase:Slate -77.80 USD Expenses:Food:Restaurant 77.80 USD 2021-03-14 balance Liabilities:US:Chase:Slate -1444.96 USD 2021-03-14 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -70.30 USD Expenses:Food:Groceries 70.30 USD 2021-03-16 * "Rose Flower" "Eating out alone" Liabilities:US:Chase:Slate -24.56 USD Expenses:Food:Restaurant 24.56 USD 2021-03-19 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -27.96 USD Expenses:Food:Restaurant 27.96 USD 2021-03-19 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-03-23 * "China Garden" "Eating out with Bill" Liabilities:US:Chase:Slate -14.92 USD Expenses:Food:Restaurant 14.92 USD 2021-03-27 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -66.51 USD Expenses:Food:Groceries 66.51 USD 2021-03-28 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -34.62 USD Expenses:Food:Restaurant 34.62 USD 2021-03-29 * "Uncle Boons" "Eating out with Natasha" Liabilities:US:Chase:Slate -23.67 USD Expenses:Food:Restaurant 23.67 USD 2021-03-30 * "Chichipotle" "Eating out with Joe" Liabilities:US:Chase:Slate -25.63 USD Expenses:Food:Restaurant 25.63 USD 2021-04-02 * "China Garden" "Eating out with Natasha" Liabilities:US:Chase:Slate -30.05 USD Expenses:Food:Restaurant 30.05 USD 2021-04-07 balance Liabilities:US:Chase:Slate -1883.18 USD 2021-04-07 * "Goba Goba" "Eating out " Liabilities:US:Chase:Slate -22.85 USD Expenses:Food:Restaurant 22.85 USD 2021-04-07 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 585.39 USD Assets:US:BofA:Checking -585.39 USD 2021-04-08 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -79.45 USD Expenses:Food:Groceries 79.45 USD 2021-04-12 * "Goba Goba" "Eating out with Joe" Liabilities:US:Chase:Slate -58.19 USD Expenses:Food:Restaurant 58.19 USD 2021-04-16 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -22.40 USD Expenses:Food:Restaurant 22.40 USD 2021-04-18 * "Uncle Boons" "Eating out with Julie" Liabilities:US:Chase:Slate -39.01 USD Expenses:Food:Restaurant 39.01 USD 2021-04-21 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-04-22 * "China Garden" "Eating out alone" Liabilities:US:Chase:Slate -54.88 USD Expenses:Food:Restaurant 54.88 USD 2021-04-25 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -16.11 USD Expenses:Food:Restaurant 16.11 USD 2021-04-25 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -119.86 USD Expenses:Food:Groceries 119.86 USD 2021-04-27 balance Liabilities:US:Chase:Slate -1830.54 USD 2021-04-28 * "Cafe Modagor" "Eating out with work buddies" Liabilities:US:Chase:Slate -14.04 USD Expenses:Food:Restaurant 14.04 USD 2021-04-30 * "Kin Soy" "Eating out with Natasha" Liabilities:US:Chase:Slate -49.28 USD Expenses:Food:Restaurant 49.28 USD 2021-05-04 * "China Garden" "Eating out with Natasha" Liabilities:US:Chase:Slate -21.24 USD Expenses:Food:Restaurant 21.24 USD 2021-05-07 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -56.54 USD Expenses:Food:Restaurant 56.54 USD 2021-05-07 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -98.29 USD Expenses:Food:Groceries 98.29 USD 2021-05-09 * "China Garden" "Eating out with work buddies" Liabilities:US:Chase:Slate -22.62 USD Expenses:Food:Restaurant 22.62 USD 2021-05-09 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 771.91 USD Assets:US:BofA:Checking -771.91 USD 2021-05-10 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -28.53 USD Expenses:Food:Restaurant 28.53 USD 2021-05-12 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -78.69 USD Expenses:Food:Restaurant 78.69 USD 2021-05-13 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -44.41 USD Expenses:Food:Restaurant 44.41 USD 2021-05-15 * "Goba Goba" "Eating out with Bill" Liabilities:US:Chase:Slate -27.06 USD Expenses:Food:Restaurant 27.06 USD 2021-05-17 * "Rose Flower" "Eating out " Liabilities:US:Chase:Slate -36.37 USD Expenses:Food:Restaurant 36.37 USD 2021-05-18 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -78.59 USD Expenses:Food:Groceries 78.59 USD 2021-05-20 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -26.35 USD Expenses:Food:Restaurant 26.35 USD 2021-05-20 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-05-21 balance Liabilities:US:Chase:Slate -1760.64 USD 2021-05-24 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -42.40 USD Expenses:Food:Restaurant 42.40 USD 2021-05-24 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -106.21 USD Expenses:Food:Groceries 106.21 USD 2021-05-28 * "Cafe Modagor" "Eating out with Julie" Liabilities:US:Chase:Slate -18.23 USD Expenses:Food:Restaurant 18.23 USD 2021-05-30 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -98.98 USD Expenses:Food:Groceries 98.98 USD 2021-06-01 * "Jewel of Morroco" "Eating out with Julie" Liabilities:US:Chase:Slate -27.44 USD Expenses:Food:Restaurant 27.44 USD 2021-06-05 * "Uncle Boons" "Eating out with Natasha" Liabilities:US:Chase:Slate -19.64 USD Expenses:Food:Restaurant 19.64 USD 2021-06-06 * "Jewel of Morroco" "Eating out with Bill" Liabilities:US:Chase:Slate -29.67 USD Expenses:Food:Restaurant 29.67 USD 2021-06-06 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -59.02 USD Expenses:Food:Groceries 59.02 USD 2021-06-08 * "Jewel of Morroco" "Eating out " Liabilities:US:Chase:Slate -39.58 USD Expenses:Food:Restaurant 39.58 USD 2021-06-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 881.17 USD Assets:US:BofA:Checking -881.17 USD 2021-06-13 * "Rose Flower" "Eating out with Joe" Liabilities:US:Chase:Slate -55.50 USD Expenses:Food:Restaurant 55.50 USD 2021-06-16 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-06-17 balance Liabilities:US:Chase:Slate -1496.14 USD 2021-06-17 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -28.65 USD Expenses:Food:Restaurant 28.65 USD 2021-06-21 * "China Garden" "Eating out alone" Liabilities:US:Chase:Slate -18.25 USD Expenses:Food:Restaurant 18.25 USD 2021-06-23 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -75.69 USD Expenses:Food:Groceries 75.69 USD 2021-06-25 event "location" "San Francisco" 2021-06-26 * "Pizza Delfina" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -21.15 USD Expenses:Food:Restaurant 21.15 USD 2021-06-26 * "Waterbar" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -53.92 USD Expenses:Food:Restaurant 53.92 USD 2021-06-26 * "Mission Chinese Food" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -17.63 USD Expenses:Food:Restaurant 17.63 USD 2021-06-27 * "Bar Crudo" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -59.83 USD Expenses:Food:Restaurant 59.83 USD 2021-06-27 * "Waterbar" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -52.71 USD Expenses:Food:Restaurant 52.71 USD 2021-06-28 * "Waterbar" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -56.60 USD Expenses:Food:Restaurant 56.60 USD 2021-06-29 * "Waterbar" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -51.19 USD Expenses:Food:Restaurant 51.19 USD 2021-06-30 * "Mission Chinese Food" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -36.13 USD Expenses:Food:Restaurant 36.13 USD 2021-07-01 * "Pizza Delfina" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -18.58 USD Expenses:Food:Restaurant 18.58 USD 2021-07-01 * "Starbucks" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -5.87 USD Expenses:Food:Coffee 5.87 USD 2021-07-02 * "Bar Crudo" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -86.48 USD Expenses:Food:Restaurant 86.48 USD 2021-07-02 * "Pizza Delfina" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -21.38 USD Expenses:Food:Restaurant 21.38 USD 2021-07-02 * "Mission Chinese Food" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -24.69 USD Expenses:Food:Restaurant 24.69 USD 2021-07-03 * "Pizza Delfina" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -18.72 USD Expenses:Food:Restaurant 18.72 USD 2021-07-03 * "Starbucks" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -6.28 USD Expenses:Food:Coffee 6.28 USD 2021-07-04 * "Uncle Boons" "Eating out alone" Liabilities:US:Chase:Slate -21.33 USD Expenses:Food:Restaurant 21.33 USD 2021-07-04 * "Mission Chinese Food" "" #trip-san-francisco-2021 Liabilities:US:Chase:Slate -25.34 USD Expenses:Food:Restaurant 25.34 USD 2021-07-04 * "Consume vacation days" 2021-07-04 event "location" "New Metropolis" 2021-07-06 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -84.76 USD Expenses:Food:Groceries 84.76 USD 2021-07-09 balance Liabilities:US:Chase:Slate -2281.32 USD 2021-07-09 * "Jewel of Morroco" "Eating out after work" Liabilities:US:Chase:Slate -21.86 USD Expenses:Food:Restaurant 21.86 USD 2021-07-10 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 460.88 USD Assets:US:BofA:Checking -460.88 USD 2021-07-11 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -34.84 USD Expenses:Food:Restaurant 34.84 USD 2021-07-15 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -24.93 USD Expenses:Food:Restaurant 24.93 USD 2021-07-16 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-07-19 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -48.10 USD Expenses:Food:Restaurant 48.10 USD 2021-07-20 * "Goba Goba" "Eating out after work" Liabilities:US:Chase:Slate -36.16 USD Expenses:Food:Restaurant 36.16 USD 2021-07-20 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -44.45 USD Expenses:Food:Groceries 44.45 USD 2021-07-24 * "Rose Flower" "Eating out after work" Liabilities:US:Chase:Slate -26.48 USD Expenses:Food:Restaurant 26.48 USD 2021-07-25 * "Uncle Boons" "Eating out alone" Liabilities:US:Chase:Slate -24.80 USD Expenses:Food:Restaurant 24.80 USD 2021-07-28 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -65.11 USD Expenses:Food:Restaurant 65.11 USD 2021-07-30 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -26.51 USD Expenses:Food:Restaurant 26.51 USD 2021-08-01 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -53.60 USD Expenses:Food:Groceries 53.60 USD 2021-08-04 balance Liabilities:US:Chase:Slate -2347.28 USD 2021-08-04 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -31.81 USD Expenses:Food:Restaurant 31.81 USD 2021-08-09 * "Kin Soy" "Eating out with work buddies" Liabilities:US:Chase:Slate -26.14 USD Expenses:Food:Restaurant 26.14 USD 2021-08-09 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 528.09 USD Assets:US:BofA:Checking -528.09 USD 2021-08-12 * "Kin Soy" "Eating out after work" Liabilities:US:Chase:Slate -15.19 USD Expenses:Food:Restaurant 15.19 USD 2021-08-14 * "Jewel of Morroco" "Eating out alone" Liabilities:US:Chase:Slate -21.14 USD Expenses:Food:Restaurant 21.14 USD 2021-08-15 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-08-19 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -24.88 USD Expenses:Food:Restaurant 24.88 USD 2021-08-20 * "Uncle Boons" "Eating out alone" Liabilities:US:Chase:Slate -65.06 USD Expenses:Food:Restaurant 65.06 USD 2021-08-20 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -79.26 USD Expenses:Food:Groceries 79.26 USD 2021-08-24 balance Liabilities:US:Chase:Slate -2202.67 USD 2021-08-25 * "Kin Soy" "Eating out alone" Liabilities:US:Chase:Slate -18.16 USD Expenses:Food:Restaurant 18.16 USD 2021-08-28 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -44.37 USD Expenses:Food:Restaurant 44.37 USD 2021-09-01 * "China Garden" "Eating out with Julie" Liabilities:US:Chase:Slate -21.50 USD Expenses:Food:Restaurant 21.50 USD 2021-09-06 * "Kin Soy" "Eating out with Julie" Liabilities:US:Chase:Slate -15.90 USD Expenses:Food:Restaurant 15.90 USD 2021-09-06 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -84.27 USD Expenses:Food:Groceries 84.27 USD 2021-09-08 * "Uncle Boons" "Eating out " Liabilities:US:Chase:Slate -38.51 USD Expenses:Food:Restaurant 38.51 USD 2021-09-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 548.24 USD Assets:US:BofA:Checking -548.24 USD 2021-09-09 * "Rose Flower" "Eating out with Joe" Liabilities:US:Chase:Slate -37.97 USD Expenses:Food:Restaurant 37.97 USD 2021-09-11 * "Kin Soy" "Eating out with work buddies" Liabilities:US:Chase:Slate -51.12 USD Expenses:Food:Restaurant 51.12 USD 2021-09-11 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-09-14 * "China Garden" "Eating out with Joe" Liabilities:US:Chase:Slate -51.24 USD Expenses:Food:Restaurant 51.24 USD 2021-09-16 * "Rose Flower" "Eating out after work" Liabilities:US:Chase:Slate -27.28 USD Expenses:Food:Restaurant 27.28 USD 2021-09-19 * "Goba Goba" "Eating out alone" Liabilities:US:Chase:Slate -17.68 USD Expenses:Food:Restaurant 17.68 USD 2021-09-23 balance Liabilities:US:Chase:Slate -2182.43 USD 2021-09-23 * "Kin Soy" "Eating out with Bill" Liabilities:US:Chase:Slate -34.67 USD Expenses:Food:Restaurant 34.67 USD 2021-09-26 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -50.84 USD Expenses:Food:Groceries 50.84 USD 2021-09-28 * "Chichipotle" "Eating out " Liabilities:US:Chase:Slate -21.42 USD Expenses:Food:Restaurant 21.42 USD 2021-09-30 * "Goba Goba" "Eating out alone" Liabilities:US:Chase:Slate -22.15 USD Expenses:Food:Restaurant 22.15 USD 2021-10-04 * "Kin Soy" "Eating out with Joe" Liabilities:US:Chase:Slate -37.93 USD Expenses:Food:Restaurant 37.93 USD 2021-10-08 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 493.59 USD Assets:US:BofA:Checking -493.59 USD 2021-10-09 * "Goba Goba" "Eating out alone" Liabilities:US:Chase:Slate -21.29 USD Expenses:Food:Restaurant 21.29 USD 2021-10-11 * "Goba Goba" "Eating out with Julie" Liabilities:US:Chase:Slate -41.75 USD Expenses:Food:Restaurant 41.75 USD 2021-10-11 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-10-13 * "Uncle Boons" "Eating out " Liabilities:US:Chase:Slate -26.57 USD Expenses:Food:Restaurant 26.57 USD 2021-10-14 balance Liabilities:US:Chase:Slate -2065.46 USD 2021-10-15 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -72.70 USD Expenses:Food:Groceries 72.70 USD 2021-10-17 * "Cafe Modagor" "Eating out with Natasha" Liabilities:US:Chase:Slate -24.66 USD Expenses:Food:Restaurant 24.66 USD 2021-10-18 * "Jewel of Morroco" "Eating out " Liabilities:US:Chase:Slate -18.90 USD Expenses:Food:Restaurant 18.90 USD 2021-10-23 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -61.68 USD Expenses:Food:Restaurant 61.68 USD 2021-10-26 * "Rose Flower" "Eating out with Julie" Liabilities:US:Chase:Slate -24.16 USD Expenses:Food:Restaurant 24.16 USD 2021-10-27 * "Cafe Modagor" "Eating out after work" Liabilities:US:Chase:Slate -31.09 USD Expenses:Food:Restaurant 31.09 USD 2021-10-28 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -93.09 USD Expenses:Food:Groceries 93.09 USD 2021-10-30 * "Cafe Modagor" "Eating out with Natasha" Liabilities:US:Chase:Slate -33.50 USD Expenses:Food:Restaurant 33.50 USD 2021-11-01 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -16.22 USD Expenses:Food:Restaurant 16.22 USD 2021-11-02 * "Cafe Modagor" "Eating out with Joe" Liabilities:US:Chase:Slate -51.66 USD Expenses:Food:Restaurant 51.66 USD 2021-11-05 balance Liabilities:US:Chase:Slate -2493.12 USD 2021-11-05 * "Chichipotle" "Eating out with Natasha" Liabilities:US:Chase:Slate -30.09 USD Expenses:Food:Restaurant 30.09 USD 2021-11-09 * "China Garden" "Eating out with Natasha" Liabilities:US:Chase:Slate -31.40 USD Expenses:Food:Restaurant 31.40 USD 2021-11-10 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 726.33 USD Assets:US:BofA:Checking -726.33 USD 2021-11-11 * "Chichipotle" "Eating out with Joe" Liabilities:US:Chase:Slate -48.86 USD Expenses:Food:Restaurant 48.86 USD 2021-11-11 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-11-16 * "China Garden" "Eating out alone" Liabilities:US:Chase:Slate -13.68 USD Expenses:Food:Restaurant 13.68 USD 2021-11-16 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -61.12 USD Expenses:Food:Groceries 61.12 USD 2021-11-19 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -42.61 USD Expenses:Food:Restaurant 42.61 USD 2021-11-20 * "China Garden" "Eating out alone" Liabilities:US:Chase:Slate -15.34 USD Expenses:Food:Restaurant 15.34 USD 2021-11-24 * "Rose Flower" "Eating out with Natasha" Liabilities:US:Chase:Slate -29.29 USD Expenses:Food:Restaurant 29.29 USD 2021-11-26 * "Jewel of Morroco" "Eating out with Natasha" Liabilities:US:Chase:Slate -48.47 USD Expenses:Food:Restaurant 48.47 USD 2021-11-29 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -47.82 USD Expenses:Food:Groceries 47.82 USD 2021-11-30 * "Rose Flower" "Eating out with Bill" Liabilities:US:Chase:Slate -20.79 USD Expenses:Food:Restaurant 20.79 USD 2021-12-02 balance Liabilities:US:Chase:Slate -2276.26 USD 2021-12-02 * "China Garden" "Eating out with Bill" Liabilities:US:Chase:Slate -37.73 USD Expenses:Food:Restaurant 37.73 USD 2021-12-06 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -62.73 USD Expenses:Food:Restaurant 62.73 USD 2021-12-09 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 619.58 USD Assets:US:BofA:Checking -619.58 USD 2021-12-10 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2021-12-11 * "Goba Goba" "Eating out with Bill" Liabilities:US:Chase:Slate -37.63 USD Expenses:Food:Restaurant 37.63 USD 2021-12-14 * "Chichipotle" "Eating out alone" Liabilities:US:Chase:Slate -24.95 USD Expenses:Food:Restaurant 24.95 USD 2021-12-15 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -41.14 USD Expenses:Food:Restaurant 41.14 USD 2021-12-16 * "Onion Market" "Buying groceries" Liabilities:US:Chase:Slate -54.67 USD Expenses:Food:Groceries 54.67 USD 2021-12-17 * "Chichipotle" "Eating out with work buddies" Liabilities:US:Chase:Slate -46.00 USD Expenses:Food:Restaurant 46.00 USD 2021-12-20 * "Goba Goba" "Eating out with work buddies" Liabilities:US:Chase:Slate -27.41 USD Expenses:Food:Restaurant 27.41 USD 2021-12-21 event "location" "Chicago" 2021-12-22 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -36.34 USD Expenses:Food:Restaurant 36.34 USD 2021-12-22 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.61 USD Expenses:Food:Coffee 6.61 USD 2021-12-23 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -23.32 USD Expenses:Food:Restaurant 23.32 USD 2021-12-24 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -40.92 USD Expenses:Food:Restaurant 40.92 USD 2021-12-24 * "Another Sports Pub" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -9.01 USD Expenses:Food:Alcohol 9.01 USD 2021-12-25 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -45.38 USD Expenses:Food:Restaurant 45.38 USD 2021-12-25 * "Another Sports Pub" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -14.39 USD Expenses:Food:Alcohol 14.39 USD 2021-12-26 balance Liabilities:US:Chase:Slate -2284.91 USD 2021-12-26 * "Eataly Chicago" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -51.26 USD Expenses:Food:Restaurant 51.26 USD 2021-12-26 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.83 USD Expenses:Food:Coffee 6.83 USD 2021-12-27 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -24.16 USD Expenses:Food:Restaurant 24.16 USD 2021-12-27 * "Eataly Chicago" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -41.66 USD Expenses:Food:Restaurant 41.66 USD 2021-12-28 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -25.14 USD Expenses:Food:Restaurant 25.14 USD 2021-12-28 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -47.14 USD Expenses:Food:Restaurant 47.14 USD 2021-12-28 * "Eataly Chicago" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -32.84 USD Expenses:Food:Restaurant 32.84 USD 2021-12-28 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.57 USD Expenses:Food:Coffee 6.57 USD 2021-12-29 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -28.27 USD Expenses:Food:Restaurant 28.27 USD 2021-12-29 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -23.98 USD Expenses:Food:Restaurant 23.98 USD 2021-12-29 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.90 USD Expenses:Food:Coffee 6.90 USD 2021-12-30 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -22.80 USD Expenses:Food:Restaurant 22.80 USD 2021-12-30 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -39.42 USD Expenses:Food:Restaurant 39.42 USD 2021-12-30 * "Another Sports Pub" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -10.69 USD Expenses:Food:Alcohol 10.69 USD 2021-12-30 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -5.87 USD Expenses:Food:Coffee 5.87 USD 2021-12-31 * "25 Degrees Burger Bar" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -28.67 USD Expenses:Food:Restaurant 28.67 USD 2021-12-31 * "Eataly Chicago" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -37.75 USD Expenses:Food:Restaurant 37.75 USD 2021-12-31 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.30 USD Expenses:Food:Coffee 6.30 USD 2022-01-01 * "Star of Siam" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -27.57 USD Expenses:Food:Restaurant 27.57 USD 2022-01-01 * "Eataly Chicago" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -43.21 USD Expenses:Food:Restaurant 43.21 USD 2022-01-02 * "Mercadito" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -43.82 USD Expenses:Food:Restaurant 43.82 USD 2022-01-02 * "Argo Tea" "" #trip-chicago-2021 Liabilities:US:Chase:Slate -6.23 USD Expenses:Food:Coffee 6.23 USD 2022-01-02 * "Consume vacation days" 2022-01-02 event "location" "New Metropolis" 2022-01-03 * "Corner Deli" "Buying groceries" Liabilities:US:Chase:Slate -113.32 USD Expenses:Food:Groceries 113.32 USD 2022-01-04 * "Cafe Modagor" "Eating out alone" Liabilities:US:Chase:Slate -29.09 USD Expenses:Food:Restaurant 29.09 USD 2022-01-06 * "Goba Goba" "Eating out alone" Liabilities:US:Chase:Slate -28.74 USD Expenses:Food:Restaurant 28.74 USD 2022-01-07 * "Chase:Slate" "Paying off credit card" Liabilities:US:Chase:Slate 522.95 USD Assets:US:BofA:Checking -522.95 USD 2022-01-08 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2022-01-10 * "Goba Goba" "Eating out with Bill" Liabilities:US:Chase:Slate -24.91 USD Expenses:Food:Restaurant 24.91 USD 2022-01-12 * "Uncle Boons" "Eating out alone" Liabilities:US:Chase:Slate -37.64 USD Expenses:Food:Restaurant 37.64 USD 2022-01-16 * "Jewel of Morroco" "Eating out with Joe" Liabilities:US:Chase:Slate -40.20 USD Expenses:Food:Restaurant 40.20 USD 2022-01-17 * "Cafe Modagor" "Eating out with Natasha" Liabilities:US:Chase:Slate -26.22 USD Expenses:Food:Restaurant 26.22 USD 2022-01-17 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -85.57 USD Expenses:Food:Groceries 85.57 USD 2022-01-19 * "Uncle Boons" "Eating out " Liabilities:US:Chase:Slate -21.32 USD Expenses:Food:Restaurant 21.32 USD 2022-01-22 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -48.07 USD Expenses:Food:Restaurant 48.07 USD 2022-01-24 balance Liabilities:US:Chase:Slate -2904.12 USD 2022-01-25 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -65.88 USD Expenses:Food:Groceries 65.88 USD 2022-01-26 * "Rose Flower" "Eating out with Joe" Liabilities:US:Chase:Slate -25.62 USD Expenses:Food:Restaurant 25.62 USD 2022-01-30 * "Chichipotle" "Eating out " Liabilities:US:Chase:Slate -59.72 USD Expenses:Food:Restaurant 59.72 USD 2022-01-31 * "Rose Flower" "Eating out after work" Liabilities:US:Chase:Slate -36.16 USD Expenses:Food:Restaurant 36.16 USD 2022-02-03 * "Rose Flower" "Eating out alone" Liabilities:US:Chase:Slate -22.41 USD Expenses:Food:Restaurant 22.41 USD 2022-02-07 * "Kin Soy" "Eating out with Julie" Liabilities:US:Chase:Slate -31.14 USD Expenses:Food:Restaurant 31.14 USD 2022-02-07 * "Metro Transport Authority" "Tram tickets" Liabilities:US:Chase:Slate -120.00 USD Expenses:Transport:Tram 120.00 USD 2022-02-11 * "Goba Goba" "Eating out " Liabilities:US:Chase:Slate -23.58 USD Expenses:Food:Restaurant 23.58 USD 2022-02-12 * "Uncle Boons" "Eating out after work" Liabilities:US:Chase:Slate -25.20 USD Expenses:Food:Restaurant 25.20 USD 2022-02-12 * "Good Moods Market" "Buying groceries" Liabilities:US:Chase:Slate -81.53 USD Expenses:Food:Groceries 81.53 USD 2022-02-13 balance Liabilities:US:Chase:Slate -3395.36 USD 2022-02-16 * "Chichipotle" "Eating out with Julie" Liabilities:US:Chase:Slate -24.06 USD Expenses:Food:Restaurant 24.06 USD 2022-02-20 * "Farmer Fresh" "Buying groceries" Liabilities:US:Chase:Slate -92.94 USD Expenses:Food:Groceries 92.94 USD 2022-02-21 * "Chichipotle" "Eating out after work" Liabilities:US:Chase:Slate -43.08 USD Expenses:Food:Restaurant 43.08 USD * Taxable Investments 2020-01-01 open Assets:US:ETrade:Cash USD 2020-01-01 open Assets:US:ETrade:CashEUR EUR 2020-01-01 open Assets:US:ETrade:ITOT ITOT 2020-01-01 open Assets:US:ETrade:VEA VEA 2020-01-01 open Assets:US:ETrade:VHT VHT 2020-01-01 open Assets:US:ETrade:GLD GLD 2020-01-01 open Income:US:ETrade:PnL USD 2020-01-01 open Income:US:ETrade:ITOT:Dividend USD 2020-01-01 open Income:US:ETrade:VEA:Dividend USD 2020-01-01 open Income:US:ETrade:VHT:Dividend USD 2020-01-01 open Income:US:ETrade:GLD:Dividend USD 2020-09-17 * "Dividends on portfolio" Assets:US:ETrade:Cash 0.00 USD Income:US:ETrade:ITOT:Dividend 0.00 USD 2020-10-04 * "Buy shares of ITOT" Assets:US:ETrade:Cash -1061.65 USD Assets:US:ETrade:ITOT 10 ITOT {105.27 USD, 2020-10-04} Expenses:Financial:Commissions 8.95 USD 2020-10-04 * "Buy shares of VHT" Assets:US:ETrade:Cash -971.85 USD Assets:US:ETrade:VHT 5 VHT {192.58 USD, 2020-10-04} Expenses:Financial:Commissions 8.95 USD 2020-10-04 * "Buy shares of GLD" Assets:US:ETrade:Cash -1009.11 USD Assets:US:ETrade:GLD 8 GLD {125.02 USD, 2020-10-04} Expenses:Financial:Commissions 8.95 USD 2020-12-03 * "Buy shares of VEA" Assets:US:ETrade:Cash -4393.11 USD Assets:US:ETrade:VEA 22 VEA {199.28 USD, 2020-12-03} Expenses:Financial:Commissions 8.95 USD 2020-12-17 * "Dividends on portfolio" Assets:US:ETrade:Cash 29.60 USD Income:US:ETrade:VEA:Dividend -29.60 USD 2021-03-18 * "Dividends on portfolio" Assets:US:ETrade:Cash 29.60 USD Income:US:ETrade:ITOT:Dividend -29.60 USD 2021-04-21 * "Sell shares of VEA" Assets:US:ETrade:VEA -22 VEA {199.28 USD, 2020-12-03} @ 207.53 USD Assets:US:ETrade:Cash 4556.71 USD Expenses:Financial:Commissions 8.95 USD Income:US:ETrade:PnL -181.50 USD 2021-04-22 * "Buy shares of VEA" Assets:US:ETrade:Cash -1046.60 USD Assets:US:ETrade:VEA 5 VEA {207.53 USD, 2021-04-22} Expenses:Financial:Commissions 8.95 USD 2021-04-22 * "Buy shares of GLD" Assets:US:ETrade:Cash -985.52 USD Assets:US:ETrade:GLD 7 GLD {139.51 USD, 2021-04-22} Expenses:Financial:Commissions 8.95 USD 2021-04-22 * "Buy shares of ITOT" Assets:US:ETrade:Cash -1046.15 USD Assets:US:ETrade:ITOT 10 ITOT {103.72 USD, 2021-04-22} Expenses:Financial:Commissions 8.95 USD 2021-04-22 * "Buy shares of VHT" Assets:US:ETrade:Cash -899.51 USD Assets:US:ETrade:VHT 4 VHT {222.64 USD, 2021-04-22} Expenses:Financial:Commissions 8.95 USD 2021-06-18 * "Dividends on portfolio" Assets:US:ETrade:Cash 45.37 USD Income:US:ETrade:GLD:Dividend -45.37 USD 2021-09-14 * "Buy shares of ITOT" Assets:US:ETrade:Cash -1678.18 USD Assets:US:ETrade:ITOT 17 ITOT {98.19 USD, 2021-09-14} Expenses:Financial:Commissions 8.95 USD 2021-09-14 * "Buy shares of VHT" Assets:US:ETrade:Cash -1706.24 USD Assets:US:ETrade:VHT 7 VHT {242.47 USD, 2021-09-14} Expenses:Financial:Commissions 8.95 USD 2021-09-14 * "Buy shares of VEA" Assets:US:ETrade:Cash -1543.42 USD Assets:US:ETrade:VEA 7 VEA {219.21 USD, 2021-09-14} Expenses:Financial:Commissions 8.95 USD 2021-09-18 * "Dividends on portfolio" Assets:US:ETrade:Cash 64.97 USD Income:US:ETrade:VHT:Dividend -64.97 USD 2021-09-22 * "Sell shares of VHT" Assets:US:ETrade:VHT -5 VHT {192.58 USD, 2020-10-04} @ 243.66 USD Assets:US:ETrade:Cash 1209.35 USD Expenses:Financial:Commissions 8.95 USD Income:US:ETrade:PnL -255.40 USD 2021-09-24 * "Buy shares of VEA" Assets:US:ETrade:Cash -224.22 USD Assets:US:ETrade:VEA 1 VEA {215.27 USD, 2021-09-24} Expenses:Financial:Commissions 8.95 USD 2021-09-24 * "Buy shares of VHT" Assets:US:ETrade:Cash -255.00 USD Assets:US:ETrade:VHT 1 VHT {246.05 USD, 2021-09-24} Expenses:Financial:Commissions 8.95 USD 2021-09-24 * "Buy shares of ITOT" Assets:US:ETrade:Cash -305.71 USD Assets:US:ETrade:ITOT 3 ITOT {98.92 USD, 2021-09-24} Expenses:Financial:Commissions 8.95 USD 2021-09-24 * "Buy shares of GLD" Assets:US:ETrade:Cash -287.41 USD Assets:US:ETrade:GLD 2 GLD {139.23 USD, 2021-09-24} Expenses:Financial:Commissions 8.95 USD 2021-10-24 * "Buy shares of VEA" Assets:US:ETrade:Cash -903.63 USD Assets:US:ETrade:VEA 4 VEA {223.67 USD, 2021-10-24} Expenses:Financial:Commissions 8.95 USD 2021-10-24 * "Buy shares of VHT" Assets:US:ETrade:Cash -955.79 USD Assets:US:ETrade:VHT 4 VHT {236.71 USD, 2021-10-24} Expenses:Financial:Commissions 8.95 USD 2021-10-24 * "Buy shares of ITOT" Assets:US:ETrade:Cash -919.03 USD Assets:US:ETrade:ITOT 9 ITOT {101.12 USD, 2021-10-24} Expenses:Financial:Commissions 8.95 USD 2021-10-24 * "Buy shares of GLD" Assets:US:ETrade:Cash -977.89 USD Assets:US:ETrade:GLD 7 GLD {138.42 USD, 2021-10-24} Expenses:Financial:Commissions 8.95 USD 2021-11-17 * "Sell shares of VEA" Assets:US:ETrade:VEA -5 VEA {207.53 USD, 2021-04-22} @ 230.25 USD Assets:US:ETrade:Cash 1142.30 USD Expenses:Financial:Commissions 8.95 USD Income:US:ETrade:PnL -113.60 USD 2021-12-06 * "Buy shares of VEA" Assets:US:ETrade:Cash -1553.08 USD Assets:US:ETrade:VEA 7 VEA {220.59 USD, 2021-12-06} Expenses:Financial:Commissions 8.95 USD 2021-12-17 * "Dividends on portfolio" Assets:US:ETrade:Cash 90.18 USD Income:US:ETrade:GLD:Dividend -90.18 USD 2021-12-20 * "Buy shares of GLD" Assets:US:ETrade:Cash -4012.95 USD Assets:US:ETrade:GLD 28 GLD {143.00 USD, 2021-12-20} Expenses:Financial:Commissions 8.95 USD * Vanguard Investments 2020-01-01 open Assets:US:Vanguard:VBMPX VBMPX number: "882882" 2020-01-01 open Assets:US:Vanguard:RGAGX RGAGX number: "882882" 2020-01-01 open Assets:US:Vanguard USD address: "P.O. Box 1110, Valley Forge, PA 19482-1110" institution: "Vanguard Group" phone: "+1.800.523.1188" 2020-01-01 open Income:US:Hooli:Match401k USD 2020-01-01 open Assets:US:Vanguard:Cash USD number: "882882" 2020-01-03 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-01-06 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.704 VBMPX {129.58 USD, 2020-01-06} Assets:US:Vanguard:Cash -479.96 USD 2020-01-06 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.481 RGAGX {111.09 USD, 2020-01-06} Assets:US:Vanguard:Cash -719.97 USD 2020-01-06 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.852 VBMPX {129.58 USD, 2020-01-06} Assets:US:Vanguard:Cash -239.98 USD 2020-01-06 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.241 RGAGX {111.09 USD, 2020-01-06} Assets:US:Vanguard:Cash -360.04 USD 2020-01-17 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-01-20 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.650 VBMPX {131.50 USD, 2020-01-20} Assets:US:Vanguard:Cash -479.98 USD 2020-01-20 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.513 RGAGX {110.55 USD, 2020-01-20} Assets:US:Vanguard:Cash -720.01 USD 2020-01-20 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.825 VBMPX {131.50 USD, 2020-01-20} Assets:US:Vanguard:Cash -239.99 USD 2020-01-20 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.257 RGAGX {110.55 USD, 2020-01-20} Assets:US:Vanguard:Cash -360.06 USD 2020-01-31 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-02-03 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.665 VBMPX {130.98 USD, 2020-02-03} Assets:US:Vanguard:Cash -480.04 USD 2020-02-03 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.478 RGAGX {111.15 USD, 2020-02-03} Assets:US:Vanguard:Cash -720.03 USD 2020-02-03 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.832 VBMPX {130.98 USD, 2020-02-03} Assets:US:Vanguard:Cash -239.96 USD 2020-02-03 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.239 RGAGX {111.15 USD, 2020-02-03} Assets:US:Vanguard:Cash -360.01 USD 2020-02-14 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-02-17 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.664 VBMPX {131.01 USD, 2020-02-17} Assets:US:Vanguard:Cash -480.02 USD 2020-02-17 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.499 RGAGX {110.78 USD, 2020-02-17} Assets:US:Vanguard:Cash -719.96 USD 2020-02-17 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.832 VBMPX {131.01 USD, 2020-02-17} Assets:US:Vanguard:Cash -240.01 USD 2020-02-17 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.250 RGAGX {110.78 USD, 2020-02-17} Assets:US:Vanguard:Cash -360.04 USD 2020-02-28 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-03-02 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.690 VBMPX {130.07 USD, 2020-03-02} Assets:US:Vanguard:Cash -479.96 USD 2020-03-02 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.436 RGAGX {111.86 USD, 2020-03-02} Assets:US:Vanguard:Cash -719.93 USD 2020-03-02 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.845 VBMPX {130.07 USD, 2020-03-02} Assets:US:Vanguard:Cash -239.98 USD 2020-03-02 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.219 RGAGX {111.86 USD, 2020-03-02} Assets:US:Vanguard:Cash -360.08 USD 2020-03-13 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-03-16 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.697 VBMPX {129.85 USD, 2020-03-16} Assets:US:Vanguard:Cash -480.06 USD 2020-03-16 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.423 RGAGX {112.09 USD, 2020-03-16} Assets:US:Vanguard:Cash -719.95 USD 2020-03-16 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.848 VBMPX {129.85 USD, 2020-03-16} Assets:US:Vanguard:Cash -239.96 USD 2020-03-16 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.212 RGAGX {112.09 USD, 2020-03-16} Assets:US:Vanguard:Cash -360.03 USD 2020-03-27 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-03-30 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.583 VBMPX {133.95 USD, 2020-03-30} Assets:US:Vanguard:Cash -479.94 USD 2020-03-30 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.291 RGAGX {114.44 USD, 2020-03-30} Assets:US:Vanguard:Cash -719.94 USD 2020-03-30 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.792 VBMPX {133.95 USD, 2020-03-30} Assets:US:Vanguard:Cash -240.04 USD 2020-03-30 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.146 RGAGX {114.44 USD, 2020-03-30} Assets:US:Vanguard:Cash -360.03 USD 2020-04-10 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-04-13 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.624 VBMPX {132.44 USD, 2020-04-13} Assets:US:Vanguard:Cash -479.96 USD 2020-04-13 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.218 RGAGX {115.80 USD, 2020-04-13} Assets:US:Vanguard:Cash -720.04 USD 2020-04-13 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.812 VBMPX {132.44 USD, 2020-04-13} Assets:US:Vanguard:Cash -239.98 USD 2020-04-13 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.109 RGAGX {115.80 USD, 2020-04-13} Assets:US:Vanguard:Cash -360.02 USD 2020-04-24 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-04-27 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.659 VBMPX {131.20 USD, 2020-04-27} Assets:US:Vanguard:Cash -480.06 USD 2020-04-27 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.205 RGAGX {116.03 USD, 2020-04-27} Assets:US:Vanguard:Cash -719.97 USD 2020-04-27 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.829 VBMPX {131.20 USD, 2020-04-27} Assets:US:Vanguard:Cash -239.96 USD 2020-04-27 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.103 RGAGX {116.03 USD, 2020-04-27} Assets:US:Vanguard:Cash -360.04 USD 2020-05-08 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-05-11 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.527 VBMPX {136.09 USD, 2020-05-11} Assets:US:Vanguard:Cash -479.99 USD 2020-05-11 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.218 RGAGX {115.79 USD, 2020-05-11} Assets:US:Vanguard:Cash -719.98 USD 2020-05-11 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.764 VBMPX {136.09 USD, 2020-05-11} Assets:US:Vanguard:Cash -240.06 USD 2020-05-11 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.109 RGAGX {115.79 USD, 2020-05-11} Assets:US:Vanguard:Cash -359.99 USD 2020-05-22 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-05-25 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.486 VBMPX {137.70 USD, 2020-05-25} Assets:US:Vanguard:Cash -480.02 USD 2020-05-25 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.220 RGAGX {115.75 USD, 2020-05-25} Assets:US:Vanguard:Cash -719.96 USD 2020-05-25 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.743 VBMPX {137.70 USD, 2020-05-25} Assets:US:Vanguard:Cash -240.01 USD 2020-05-25 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.110 RGAGX {115.75 USD, 2020-05-25} Assets:US:Vanguard:Cash -359.98 USD 2020-06-05 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-06-08 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.626 VBMPX {132.39 USD, 2020-06-08} Assets:US:Vanguard:Cash -480.05 USD 2020-06-08 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.240 RGAGX {115.39 USD, 2020-06-08} Assets:US:Vanguard:Cash -720.03 USD 2020-06-08 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.813 VBMPX {132.39 USD, 2020-06-08} Assets:US:Vanguard:Cash -240.02 USD 2020-06-08 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.120 RGAGX {115.39 USD, 2020-06-08} Assets:US:Vanguard:Cash -360.02 USD 2020-06-19 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-06-22 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.556 VBMPX {134.96 USD, 2020-06-22} Assets:US:Vanguard:Cash -479.92 USD 2020-06-22 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.236 RGAGX {115.44 USD, 2020-06-22} Assets:US:Vanguard:Cash -719.88 USD 2020-06-22 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.779 VBMPX {134.96 USD, 2020-06-22} Assets:US:Vanguard:Cash -240.09 USD 2020-06-22 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.119 RGAGX {115.44 USD, 2020-06-22} Assets:US:Vanguard:Cash -360.06 USD 2020-07-03 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-07-06 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.599 VBMPX {133.37 USD, 2020-07-06} Assets:US:Vanguard:Cash -480.00 USD 2020-07-06 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.168 RGAGX {116.72 USD, 2020-07-06} Assets:US:Vanguard:Cash -719.93 USD 2020-07-06 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.800 VBMPX {133.37 USD, 2020-07-06} Assets:US:Vanguard:Cash -240.07 USD 2020-07-06 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.084 RGAGX {116.72 USD, 2020-07-06} Assets:US:Vanguard:Cash -359.96 USD 2020-07-17 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2020-07-20 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.523 VBMPX {136.25 USD, 2020-07-20} Assets:US:Vanguard:Cash -480.01 USD 2020-07-20 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.122 RGAGX {117.61 USD, 2020-07-20} Assets:US:Vanguard:Cash -720.01 USD 2020-07-20 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.761 VBMPX {136.25 USD, 2020-07-20} Assets:US:Vanguard:Cash -239.94 USD 2020-07-20 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.061 RGAGX {117.61 USD, 2020-07-20} Assets:US:Vanguard:Cash -360.00 USD 2020-07-31 * "Employer match for contribution" Assets:US:Vanguard:Cash 250.00 USD Income:US:Hooli:Match401k -250.00 USD 2020-08-03 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.460 VBMPX {136.99 USD, 2020-08-03} Assets:US:Vanguard:Cash -200.01 USD 2020-08-03 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.532 RGAGX {118.51 USD, 2020-08-03} Assets:US:Vanguard:Cash -300.07 USD 2020-08-03 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 0.730 VBMPX {136.99 USD, 2020-08-03} Assets:US:Vanguard:Cash -100.00 USD 2020-08-03 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 1.265 RGAGX {118.51 USD, 2020-08-03} Assets:US:Vanguard:Cash -149.92 USD 2021-01-15 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-01-18 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.422 VBMPX {140.29 USD, 2021-01-18} Assets:US:Vanguard:Cash -480.07 USD 2021-01-18 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.165 RGAGX {116.80 USD, 2021-01-18} Assets:US:Vanguard:Cash -720.07 USD 2021-01-18 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.710 VBMPX {140.29 USD, 2021-01-18} Assets:US:Vanguard:Cash -239.90 USD 2021-01-18 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.082 RGAGX {116.80 USD, 2021-01-18} Assets:US:Vanguard:Cash -359.98 USD 2021-01-29 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-02-01 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.437 VBMPX {139.66 USD, 2021-02-01} Assets:US:Vanguard:Cash -480.01 USD 2021-02-01 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.183 RGAGX {116.44 USD, 2021-02-01} Assets:US:Vanguard:Cash -719.95 USD 2021-02-01 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.719 VBMPX {139.66 USD, 2021-02-01} Assets:US:Vanguard:Cash -240.08 USD 2021-02-01 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.092 RGAGX {116.44 USD, 2021-02-01} Assets:US:Vanguard:Cash -360.03 USD 2021-02-12 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-02-15 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.352 VBMPX {143.19 USD, 2021-02-15} Assets:US:Vanguard:Cash -479.97 USD 2021-02-15 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.184 RGAGX {116.43 USD, 2021-02-15} Assets:US:Vanguard:Cash -720.00 USD 2021-02-15 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.676 VBMPX {143.19 USD, 2021-02-15} Assets:US:Vanguard:Cash -239.99 USD 2021-02-15 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.092 RGAGX {116.43 USD, 2021-02-15} Assets:US:Vanguard:Cash -360.00 USD 2021-02-26 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-03-01 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.321 VBMPX {144.55 USD, 2021-03-01} Assets:US:Vanguard:Cash -480.05 USD 2021-03-01 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.151 RGAGX {117.05 USD, 2021-03-01} Assets:US:Vanguard:Cash -719.97 USD 2021-03-01 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.660 VBMPX {144.55 USD, 2021-03-01} Assets:US:Vanguard:Cash -239.95 USD 2021-03-01 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.075 RGAGX {117.05 USD, 2021-03-01} Assets:US:Vanguard:Cash -359.93 USD 2021-03-12 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-03-15 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.311 VBMPX {144.97 USD, 2021-03-15} Assets:US:Vanguard:Cash -480.00 USD 2021-03-15 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.093 RGAGX {118.18 USD, 2021-03-15} Assets:US:Vanguard:Cash -720.07 USD 2021-03-15 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.656 VBMPX {144.97 USD, 2021-03-15} Assets:US:Vanguard:Cash -240.07 USD 2021-03-15 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.046 RGAGX {118.18 USD, 2021-03-15} Assets:US:Vanguard:Cash -359.98 USD 2021-03-26 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-03-29 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.284 VBMPX {146.17 USD, 2021-03-29} Assets:US:Vanguard:Cash -480.02 USD 2021-03-29 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.067 RGAGX {118.67 USD, 2021-03-29} Assets:US:Vanguard:Cash -719.97 USD 2021-03-29 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.642 VBMPX {146.17 USD, 2021-03-29} Assets:US:Vanguard:Cash -240.01 USD 2021-03-29 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.033 RGAGX {118.67 USD, 2021-03-29} Assets:US:Vanguard:Cash -359.93 USD 2021-04-09 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-04-12 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.281 VBMPX {146.31 USD, 2021-04-12} Assets:US:Vanguard:Cash -480.04 USD 2021-04-12 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 6.003 RGAGX {119.94 USD, 2021-04-12} Assets:US:Vanguard:Cash -720.00 USD 2021-04-12 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.640 VBMPX {146.31 USD, 2021-04-12} Assets:US:Vanguard:Cash -239.95 USD 2021-04-12 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 3.001 RGAGX {119.94 USD, 2021-04-12} Assets:US:Vanguard:Cash -359.94 USD 2021-04-23 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-04-26 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.249 VBMPX {147.75 USD, 2021-04-26} Assets:US:Vanguard:Cash -480.04 USD 2021-04-26 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.960 RGAGX {120.82 USD, 2021-04-26} Assets:US:Vanguard:Cash -720.09 USD 2021-04-26 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.624 VBMPX {147.75 USD, 2021-04-26} Assets:US:Vanguard:Cash -239.95 USD 2021-04-26 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.979 RGAGX {120.82 USD, 2021-04-26} Assets:US:Vanguard:Cash -359.92 USD 2021-05-07 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-05-10 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.227 VBMPX {148.75 USD, 2021-05-10} Assets:US:Vanguard:Cash -480.02 USD 2021-05-10 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.946 RGAGX {121.10 USD, 2021-05-10} Assets:US:Vanguard:Cash -720.06 USD 2021-05-10 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.613 VBMPX {148.75 USD, 2021-05-10} Assets:US:Vanguard:Cash -239.93 USD 2021-05-10 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.973 RGAGX {121.10 USD, 2021-05-10} Assets:US:Vanguard:Cash -360.03 USD 2021-05-21 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-05-24 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.229 VBMPX {148.68 USD, 2021-05-24} Assets:US:Vanguard:Cash -480.09 USD 2021-05-24 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.870 RGAGX {122.66 USD, 2021-05-24} Assets:US:Vanguard:Cash -720.01 USD 2021-05-24 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.614 VBMPX {148.68 USD, 2021-05-24} Assets:US:Vanguard:Cash -239.97 USD 2021-05-24 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.935 RGAGX {122.66 USD, 2021-05-24} Assets:US:Vanguard:Cash -360.01 USD 2021-06-04 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-06-07 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.227 VBMPX {148.75 USD, 2021-06-07} Assets:US:Vanguard:Cash -480.02 USD 2021-06-07 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.851 RGAGX {123.06 USD, 2021-06-07} Assets:US:Vanguard:Cash -720.02 USD 2021-06-07 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.613 VBMPX {148.75 USD, 2021-06-07} Assets:US:Vanguard:Cash -239.93 USD 2021-06-07 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.925 RGAGX {123.06 USD, 2021-06-07} Assets:US:Vanguard:Cash -359.95 USD 2021-06-18 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-06-21 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.066 VBMPX {156.54 USD, 2021-06-21} Assets:US:Vanguard:Cash -479.95 USD 2021-06-21 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.730 RGAGX {125.65 USD, 2021-06-21} Assets:US:Vanguard:Cash -719.97 USD 2021-06-21 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.534 VBMPX {156.54 USD, 2021-06-21} Assets:US:Vanguard:Cash -240.13 USD 2021-06-21 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.866 RGAGX {125.65 USD, 2021-06-21} Assets:US:Vanguard:Cash -360.11 USD 2021-07-02 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-07-05 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 2.924 VBMPX {164.15 USD, 2021-07-05} Assets:US:Vanguard:Cash -479.97 USD 2021-07-05 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.727 RGAGX {125.71 USD, 2021-07-05} Assets:US:Vanguard:Cash -719.94 USD 2021-07-05 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.462 VBMPX {164.15 USD, 2021-07-05} Assets:US:Vanguard:Cash -239.99 USD 2021-07-05 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.864 RGAGX {125.71 USD, 2021-07-05} Assets:US:Vanguard:Cash -360.03 USD 2021-07-16 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-07-19 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 2.900 VBMPX {165.51 USD, 2021-07-19} Assets:US:Vanguard:Cash -479.98 USD 2021-07-19 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.618 RGAGX {128.15 USD, 2021-07-19} Assets:US:Vanguard:Cash -719.95 USD 2021-07-19 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.450 VBMPX {165.51 USD, 2021-07-19} Assets:US:Vanguard:Cash -239.99 USD 2021-07-19 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.809 RGAGX {128.15 USD, 2021-07-19} Assets:US:Vanguard:Cash -359.97 USD 2021-07-30 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2021-08-02 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 2.876 VBMPX {166.91 USD, 2021-08-02} Assets:US:Vanguard:Cash -480.03 USD 2021-08-02 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.649 RGAGX {127.47 USD, 2021-08-02} Assets:US:Vanguard:Cash -720.08 USD 2021-08-02 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.438 VBMPX {166.91 USD, 2021-08-02} Assets:US:Vanguard:Cash -240.02 USD 2021-08-02 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.824 RGAGX {127.47 USD, 2021-08-02} Assets:US:Vanguard:Cash -359.98 USD 2021-08-13 * "Employer match for contribution" Assets:US:Vanguard:Cash 250.00 USD Income:US:Hooli:Match401k -250.00 USD 2021-08-16 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.159 VBMPX {172.49 USD, 2021-08-16} Assets:US:Vanguard:Cash -199.92 USD 2021-08-16 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.336 RGAGX {128.44 USD, 2021-08-16} Assets:US:Vanguard:Cash -300.04 USD 2021-08-16 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 0.580 VBMPX {172.49 USD, 2021-08-16} Assets:US:Vanguard:Cash -100.04 USD 2021-08-16 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 1.168 RGAGX {128.44 USD, 2021-08-16} Assets:US:Vanguard:Cash -150.02 USD 2022-01-14 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2022-01-17 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 2.972 VBMPX {161.51 USD, 2022-01-17} Assets:US:Vanguard:Cash -480.01 USD 2022-01-17 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.048 RGAGX {142.62 USD, 2022-01-17} Assets:US:Vanguard:Cash -719.95 USD 2022-01-17 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.486 VBMPX {161.51 USD, 2022-01-17} Assets:US:Vanguard:Cash -240.00 USD 2022-01-17 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.524 RGAGX {142.62 USD, 2022-01-17} Assets:US:Vanguard:Cash -359.97 USD 2022-01-28 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2022-01-31 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 2.975 VBMPX {161.36 USD, 2022-01-31} Assets:US:Vanguard:Cash -480.05 USD 2022-01-31 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 5.054 RGAGX {142.45 USD, 2022-01-31} Assets:US:Vanguard:Cash -719.94 USD 2022-01-31 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.487 VBMPX {161.36 USD, 2022-01-31} Assets:US:Vanguard:Cash -239.94 USD 2022-01-31 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.527 RGAGX {142.45 USD, 2022-01-31} Assets:US:Vanguard:Cash -359.97 USD 2022-02-11 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2022-02-14 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.052 VBMPX {157.27 USD, 2022-02-14} Assets:US:Vanguard:Cash -479.99 USD 2022-02-14 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 4.981 RGAGX {144.57 USD, 2022-02-14} Assets:US:Vanguard:Cash -720.10 USD 2022-02-14 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.526 VBMPX {157.27 USD, 2022-02-14} Assets:US:Vanguard:Cash -239.99 USD 2022-02-14 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.490 RGAGX {144.57 USD, 2022-02-14} Assets:US:Vanguard:Cash -359.98 USD 2022-02-25 * "Employer match for contribution" Assets:US:Vanguard:Cash 600.00 USD Income:US:Hooli:Match401k -600.00 USD 2022-02-28 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 3.007 VBMPX {159.65 USD, 2022-02-28} Assets:US:Vanguard:Cash -480.07 USD 2022-02-28 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 4.916 RGAGX {146.47 USD, 2022-02-28} Assets:US:Vanguard:Cash -720.05 USD 2022-02-28 * "Investing 40% of cash in VBMPX" Assets:US:Vanguard:VBMPX 1.503 VBMPX {159.65 USD, 2022-02-28} Assets:US:Vanguard:Cash -239.95 USD 2022-02-28 * "Investing 60% of cash in RGAGX" Assets:US:Vanguard:RGAGX 2.458 RGAGX {146.47 USD, 2022-02-28} Assets:US:Vanguard:Cash -360.02 USD * Sources of Income 2020-01-01 open Income:US:Hooli:Salary USD 2020-01-01 open Income:US:Hooli:GroupTermLife USD 2020-01-01 open Expenses:Health:Life:GroupTermLife 2020-01-01 open Expenses:Health:Medical:Insurance 2020-01-01 open Expenses:Health:Dental:Insurance 2020-01-01 open Expenses:Health:Vision:Insurance 2020-01-01 event "employer" "Hooli, 1 Carloston Rd, Mountain Beer, CA" 2020-01-02 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-01-16 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-01-30 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-02-13 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-02-27 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-03-12 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-03-26 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-04-09 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-04-23 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-05-07 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-05-21 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-06-04 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-06-18 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-07-02 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-07-16 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-07-30 * "Hooli" "Payroll" Assets:US:BofA:Checking 2050.60 USD Assets:US:Vanguard:Cash 500.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-08-13 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-08-27 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-09-10 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-09-24 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-10-08 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-10-22 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-11-05 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-11-19 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 281.54 USD 2020-12-03 * "Hooli" "Payroll" Assets:US:BofA:Checking 2589.06 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 243.08 USD 2020-12-17 * "Hooli" "Payroll" Assets:US:BofA:Checking 2832.14 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 0.00 USD 2020-12-31 * "Hooli" "Payroll" Assets:US:BofA:Checking 2832.14 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2020:US:Medicare 106.62 USD Expenses:Taxes:Y2020:US:Federal 1062.92 USD Expenses:Taxes:Y2020:US:State 365.08 USD Expenses:Taxes:Y2020:US:CityNYC 174.92 USD Expenses:Taxes:Y2020:US:SDI 1.12 USD Expenses:Taxes:Y2020:US:SocSec 0.00 USD 2021-01-14 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-01-28 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-02-11 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-02-25 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-03-11 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-03-25 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-04-08 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-04-22 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-05-06 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-05-20 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-06-03 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-06-17 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-07-01 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-07-15 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-07-29 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-08-12 * "Hooli" "Payroll" Assets:US:BofA:Checking 2050.60 USD Assets:US:Vanguard:Cash 500.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-08-26 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-09-09 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-09-23 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-10-07 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-10-21 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-11-04 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-11-18 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-12-02 * "Hooli" "Payroll" Assets:US:BofA:Checking 2550.60 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 281.54 USD 2021-12-16 * "Hooli" "Payroll" Assets:US:BofA:Checking 2589.06 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 243.08 USD 2021-12-30 * "Hooli" "Payroll" Assets:US:BofA:Checking 2832.14 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2021:US:Medicare 106.62 USD Expenses:Taxes:Y2021:US:Federal 1062.92 USD Expenses:Taxes:Y2021:US:State 365.08 USD Expenses:Taxes:Y2021:US:CityNYC 174.92 USD Expenses:Taxes:Y2021:US:SDI 1.12 USD Expenses:Taxes:Y2021:US:SocSec 0.00 USD 2022-01-13 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2022:US:Medicare 106.62 USD Expenses:Taxes:Y2022:US:Federal 1062.92 USD Expenses:Taxes:Y2022:US:State 365.08 USD Expenses:Taxes:Y2022:US:CityNYC 174.92 USD Expenses:Taxes:Y2022:US:SDI 1.12 USD Expenses:Taxes:Y2022:US:SocSec 281.54 USD 2022-01-27 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2022:US:Medicare 106.62 USD Expenses:Taxes:Y2022:US:Federal 1062.92 USD Expenses:Taxes:Y2022:US:State 365.08 USD Expenses:Taxes:Y2022:US:CityNYC 174.92 USD Expenses:Taxes:Y2022:US:SDI 1.12 USD Expenses:Taxes:Y2022:US:SocSec 281.54 USD 2022-02-10 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2022:US:Medicare 106.62 USD Expenses:Taxes:Y2022:US:Federal 1062.92 USD Expenses:Taxes:Y2022:US:State 365.08 USD Expenses:Taxes:Y2022:US:CityNYC 174.92 USD Expenses:Taxes:Y2022:US:SDI 1.12 USD Expenses:Taxes:Y2022:US:SocSec 281.54 USD 2022-02-24 * "Hooli" "Payroll" Assets:US:BofA:Checking 1350.60 USD Assets:US:Vanguard:Cash 1200.00 USD Income:US:Hooli:Salary -4615.38 USD Income:US:Hooli:GroupTermLife -24.32 USD Expenses:Health:Life:GroupTermLife 24.32 USD Expenses:Health:Dental:Insurance 2.90 USD Expenses:Health:Medical:Insurance 27.38 USD Expenses:Health:Vision:Insurance 42.30 USD Expenses:Taxes:Y2022:US:Medicare 106.62 USD Expenses:Taxes:Y2022:US:Federal 1062.92 USD Expenses:Taxes:Y2022:US:State 365.08 USD Expenses:Taxes:Y2022:US:CityNYC 174.92 USD Expenses:Taxes:Y2022:US:SDI 1.12 USD Expenses:Taxes:Y2022:US:SocSec 281.54 USD * Taxes ** Tax Year 2020 2020-01-01 open Expenses:Taxes:Y2020:US:Medicare USD 2020-01-01 open Expenses:Taxes:Y2020:US:Federal USD 2020-01-01 open Expenses:Taxes:Y2020:US:CityNYC USD 2020-01-01 open Expenses:Taxes:Y2020:US:SDI USD 2020-01-01 open Expenses:Taxes:Y2020:US:State USD 2020-01-01 open Expenses:Taxes:Y2020:US:SocSec USD 2020-01-01 * "Allowed contributions for one year" 2021-03-24 * "Filing taxes for 2020" Expenses:Taxes:Y2020:US:Federal 636.21 USD Expenses:Taxes:Y2020:US:State 482.16 USD Liabilities:AccountsPayable -1118.37 USD 2021-03-26 * "STATE TAX & FINANC PYMT" Assets:US:BofA:Checking -482.16 USD Liabilities:AccountsPayable 482.16 USD 2021-03-27 * "FEDERAL TAXPYMT" Assets:US:BofA:Checking -636.21 USD Liabilities:AccountsPayable 636.21 USD ** Tax Year 2021 2021-01-01 open Expenses:Taxes:Y2021:US:Medicare USD 2021-01-01 open Expenses:Taxes:Y2021:US:Federal USD 2021-01-01 open Expenses:Taxes:Y2021:US:CityNYC USD 2021-01-01 open Expenses:Taxes:Y2021:US:SDI USD 2021-01-01 open Expenses:Taxes:Y2021:US:State USD 2021-01-01 open Expenses:Taxes:Y2021:US:SocSec USD 2021-01-01 * "Allowed contributions for one year" ** Tax Year 2022 2022-01-01 open Expenses:Taxes:Y2022:US:Medicare USD 2022-01-01 open Expenses:Taxes:Y2022:US:Federal USD 2022-01-01 open Expenses:Taxes:Y2022:US:CityNYC USD 2022-01-01 open Expenses:Taxes:Y2022:US:SDI USD 2022-01-01 open Expenses:Taxes:Y2022:US:State USD 2022-01-01 open Expenses:Taxes:Y2022:US:SocSec USD 2022-01-01 * "Allowed contributions for one year" * Expenses 1980-05-12 open Expenses:Food:Groceries 1980-05-12 open Expenses:Food:Restaurant 1980-05-12 open Expenses:Food:Coffee 1980-05-12 open Expenses:Food:Alcohol 1980-05-12 open Expenses:Transport:Tram 1980-05-12 open Expenses:Home:Rent 1980-05-12 open Expenses:Home:Electricity 1980-05-12 open Expenses:Home:Internet 1980-05-12 open Expenses:Home:Phone 1980-05-12 open Expenses:Financial:Fees 1980-05-12 open Expenses:Financial:Commissions * Prices 2020-01-03 price VBMPX 129.58 USD 2020-01-03 price RGAGX 111.09 USD 2020-01-03 price ITOT 103.36 USD 2020-01-03 price VEA 191.35 USD 2020-01-03 price VHT 177.62 USD 2020-01-03 price GLD 108.17 USD 2020-01-10 price VBMPX 130.97 USD 2020-01-10 price RGAGX 111.20 USD 2020-01-10 price ITOT 103.13 USD 2020-01-10 price VEA 188.57 USD 2020-01-10 price VHT 181.01 USD 2020-01-10 price GLD 110.58 USD 2020-01-17 price VBMPX 131.50 USD 2020-01-17 price RGAGX 110.55 USD 2020-01-17 price ITOT 101.66 USD 2020-01-17 price VEA 191.41 USD 2020-01-17 price VHT 180.91 USD 2020-01-17 price GLD 109.03 USD 2020-01-24 price VBMPX 132.43 USD 2020-01-24 price RGAGX 110.81 USD 2020-01-24 price ITOT 100.47 USD 2020-01-24 price VEA 191.56 USD 2020-01-24 price VHT 182.13 USD 2020-01-24 price GLD 108.83 USD 2020-01-31 price VBMPX 130.98 USD 2020-01-31 price RGAGX 111.15 USD 2020-01-31 price ITOT 102.11 USD 2020-01-31 price VEA 191.03 USD 2020-01-31 price VHT 182.31 USD 2020-01-31 price GLD 107.55 USD 2020-02-07 price VBMPX 130.37 USD 2020-02-07 price RGAGX 111.47 USD 2020-02-07 price ITOT 101.81 USD 2020-02-07 price VEA 190.71 USD 2020-02-07 price VHT 178.36 USD 2020-02-07 price GLD 104.92 USD 2020-02-14 price VBMPX 131.01 USD 2020-02-14 price RGAGX 110.78 USD 2020-02-14 price ITOT 100.67 USD 2020-02-14 price VEA 186.55 USD 2020-02-14 price VHT 174.52 USD 2020-02-14 price GLD 106.88 USD 2020-02-21 price VBMPX 130.29 USD 2020-02-21 price RGAGX 111.75 USD 2020-02-21 price ITOT 101.62 USD 2020-02-21 price VEA 184.17 USD 2020-02-21 price VHT 175.48 USD 2020-02-21 price GLD 110.75 USD 2020-02-28 price VBMPX 130.07 USD 2020-02-28 price RGAGX 111.86 USD 2020-02-28 price ITOT 102.63 USD 2020-02-28 price VEA 181.36 USD 2020-02-28 price VHT 177.91 USD 2020-02-28 price GLD 110.81 USD 2020-03-06 price VBMPX 130.73 USD 2020-03-06 price RGAGX 112.07 USD 2020-03-06 price ITOT 102.53 USD 2020-03-06 price VEA 177.47 USD 2020-03-06 price VHT 178.59 USD 2020-03-06 price GLD 111.79 USD 2020-03-13 price VBMPX 129.85 USD 2020-03-13 price RGAGX 112.09 USD 2020-03-13 price ITOT 101.05 USD 2020-03-13 price VEA 176.79 USD 2020-03-13 price VHT 181.94 USD 2020-03-13 price GLD 111.09 USD 2020-03-20 price VBMPX 132.78 USD 2020-03-20 price RGAGX 113.12 USD 2020-03-20 price ITOT 100.25 USD 2020-03-20 price VEA 177.57 USD 2020-03-20 price VHT 181.82 USD 2020-03-20 price GLD 113.93 USD 2020-03-27 price VBMPX 133.95 USD 2020-03-27 price RGAGX 114.44 USD 2020-03-27 price ITOT 98.34 USD 2020-03-27 price VEA 183.47 USD 2020-03-27 price VHT 177.09 USD 2020-03-27 price GLD 112.80 USD 2020-04-03 price VBMPX 132.90 USD 2020-04-03 price RGAGX 115.39 USD 2020-04-03 price ITOT 98.25 USD 2020-04-03 price VEA 184.87 USD 2020-04-03 price VHT 178.35 USD 2020-04-03 price GLD 108.97 USD 2020-04-10 price VBMPX 132.44 USD 2020-04-10 price RGAGX 115.80 USD 2020-04-10 price ITOT 99.82 USD 2020-04-10 price VEA 185.50 USD 2020-04-10 price VHT 178.94 USD 2020-04-10 price GLD 105.70 USD 2020-04-17 price VBMPX 129.64 USD 2020-04-17 price RGAGX 115.86 USD 2020-04-17 price ITOT 100.30 USD 2020-04-17 price VEA 186.60 USD 2020-04-17 price VHT 179.57 USD 2020-04-17 price GLD 102.83 USD 2020-04-24 price VBMPX 131.20 USD 2020-04-24 price RGAGX 116.03 USD 2020-04-24 price ITOT 100.58 USD 2020-04-24 price VEA 188.67 USD 2020-04-24 price VHT 176.23 USD 2020-04-24 price GLD 102.67 USD 2020-05-01 price VBMPX 136.83 USD 2020-05-01 price RGAGX 116.39 USD 2020-05-01 price ITOT 100.72 USD 2020-05-01 price VEA 187.43 USD 2020-05-01 price VHT 182.14 USD 2020-05-01 price GLD 100.51 USD 2020-05-08 price VBMPX 136.09 USD 2020-05-08 price RGAGX 115.79 USD 2020-05-08 price ITOT 103.53 USD 2020-05-08 price VEA 189.86 USD 2020-05-08 price VHT 188.61 USD 2020-05-08 price GLD 99.15 USD 2020-05-15 price VBMPX 137.25 USD 2020-05-15 price RGAGX 115.51 USD 2020-05-15 price ITOT 103.53 USD 2020-05-15 price VEA 189.45 USD 2020-05-15 price VHT 188.84 USD 2020-05-15 price GLD 100.57 USD 2020-05-22 price VBMPX 137.70 USD 2020-05-22 price RGAGX 115.75 USD 2020-05-22 price ITOT 99.86 USD 2020-05-22 price VEA 188.59 USD 2020-05-22 price VHT 194.36 USD 2020-05-22 price GLD 99.94 USD 2020-05-29 price VBMPX 134.77 USD 2020-05-29 price RGAGX 115.91 USD 2020-05-29 price ITOT 98.90 USD 2020-05-29 price VEA 184.86 USD 2020-05-29 price VHT 191.82 USD 2020-05-29 price GLD 100.42 USD 2020-06-05 price VBMPX 132.39 USD 2020-06-05 price RGAGX 115.39 USD 2020-06-05 price ITOT 98.83 USD 2020-06-05 price VEA 184.89 USD 2020-06-05 price VHT 191.00 USD 2020-06-05 price GLD 103.28 USD 2020-06-12 price VBMPX 135.55 USD 2020-06-12 price RGAGX 115.84 USD 2020-06-12 price ITOT 100.17 USD 2020-06-12 price VEA 186.82 USD 2020-06-12 price VHT 193.11 USD 2020-06-12 price GLD 104.70 USD 2020-06-19 price VBMPX 134.96 USD 2020-06-19 price RGAGX 115.44 USD 2020-06-19 price ITOT 99.99 USD 2020-06-19 price VEA 188.83 USD 2020-06-19 price VHT 194.73 USD 2020-06-19 price GLD 106.92 USD 2020-06-26 price VBMPX 133.44 USD 2020-06-26 price RGAGX 115.69 USD 2020-06-26 price ITOT 101.10 USD 2020-06-26 price VEA 189.65 USD 2020-06-26 price VHT 189.52 USD 2020-06-26 price GLD 108.02 USD 2020-07-03 price VBMPX 133.37 USD 2020-07-03 price RGAGX 116.72 USD 2020-07-03 price ITOT 100.55 USD 2020-07-03 price VEA 189.93 USD 2020-07-03 price VHT 190.21 USD 2020-07-03 price GLD 108.53 USD 2020-07-10 price VBMPX 133.99 USD 2020-07-10 price RGAGX 118.17 USD 2020-07-10 price ITOT 99.43 USD 2020-07-10 price VEA 189.42 USD 2020-07-10 price VHT 194.76 USD 2020-07-10 price GLD 108.58 USD 2020-07-17 price VBMPX 136.25 USD 2020-07-17 price RGAGX 117.61 USD 2020-07-17 price ITOT 98.58 USD 2020-07-17 price VEA 187.69 USD 2020-07-17 price VHT 196.01 USD 2020-07-17 price GLD 108.72 USD 2020-07-24 price VBMPX 137.59 USD 2020-07-24 price RGAGX 117.83 USD 2020-07-24 price ITOT 98.17 USD 2020-07-24 price VEA 189.89 USD 2020-07-24 price VHT 190.34 USD 2020-07-24 price GLD 108.10 USD 2020-07-31 price VBMPX 136.99 USD 2020-07-31 price RGAGX 118.51 USD 2020-07-31 price ITOT 99.42 USD 2020-07-31 price VEA 191.03 USD 2020-07-31 price VHT 191.41 USD 2020-07-31 price GLD 113.57 USD 2020-08-07 price VBMPX 132.27 USD 2020-08-07 price RGAGX 117.74 USD 2020-08-07 price ITOT 99.35 USD 2020-08-07 price VEA 190.86 USD 2020-08-07 price VHT 190.40 USD 2020-08-07 price GLD 114.90 USD 2020-08-14 price VBMPX 132.15 USD 2020-08-14 price RGAGX 118.08 USD 2020-08-14 price ITOT 100.15 USD 2020-08-14 price VEA 193.36 USD 2020-08-14 price VHT 191.07 USD 2020-08-14 price GLD 116.18 USD 2020-08-21 price VBMPX 128.98 USD 2020-08-21 price RGAGX 117.93 USD 2020-08-21 price ITOT 100.76 USD 2020-08-21 price VEA 196.68 USD 2020-08-21 price VHT 189.22 USD 2020-08-21 price GLD 115.49 USD 2020-08-28 price VBMPX 128.20 USD 2020-08-28 price RGAGX 118.37 USD 2020-08-28 price ITOT 100.21 USD 2020-08-28 price VEA 197.06 USD 2020-08-28 price VHT 188.73 USD 2020-08-28 price GLD 119.36 USD 2020-09-04 price VBMPX 127.14 USD 2020-09-04 price RGAGX 117.40 USD 2020-09-04 price ITOT 101.19 USD 2020-09-04 price VEA 196.91 USD 2020-09-04 price VHT 188.27 USD 2020-09-04 price GLD 120.42 USD 2020-09-11 price VBMPX 130.31 USD 2020-09-11 price RGAGX 116.92 USD 2020-09-11 price ITOT 101.44 USD 2020-09-11 price VEA 198.95 USD 2020-09-11 price VHT 192.22 USD 2020-09-11 price GLD 118.95 USD 2020-09-18 price VBMPX 131.15 USD 2020-09-18 price RGAGX 117.37 USD 2020-09-18 price ITOT 102.10 USD 2020-09-18 price VEA 198.90 USD 2020-09-18 price VHT 194.10 USD 2020-09-18 price GLD 121.40 USD 2020-09-25 price VBMPX 132.98 USD 2020-09-25 price RGAGX 119.14 USD 2020-09-25 price ITOT 102.34 USD 2020-09-25 price VEA 197.60 USD 2020-09-25 price VHT 191.54 USD 2020-09-25 price GLD 123.62 USD 2020-10-02 price VBMPX 132.87 USD 2020-10-02 price RGAGX 119.70 USD 2020-10-02 price ITOT 105.27 USD 2020-10-02 price VEA 191.52 USD 2020-10-02 price VHT 192.58 USD 2020-10-02 price GLD 125.02 USD 2020-10-09 price VBMPX 132.81 USD 2020-10-09 price RGAGX 120.33 USD 2020-10-09 price ITOT 104.36 USD 2020-10-09 price VEA 192.13 USD 2020-10-09 price VHT 193.22 USD 2020-10-09 price GLD 123.21 USD 2020-10-16 price VBMPX 133.09 USD 2020-10-16 price RGAGX 119.30 USD 2020-10-16 price ITOT 104.08 USD 2020-10-16 price VEA 196.10 USD 2020-10-16 price VHT 194.15 USD 2020-10-16 price GLD 126.00 USD 2020-10-23 price VBMPX 132.33 USD 2020-10-23 price RGAGX 119.74 USD 2020-10-23 price ITOT 102.88 USD 2020-10-23 price VEA 197.61 USD 2020-10-23 price VHT 197.92 USD 2020-10-23 price GLD 128.39 USD 2020-10-30 price VBMPX 133.68 USD 2020-10-30 price RGAGX 120.39 USD 2020-10-30 price ITOT 102.20 USD 2020-10-30 price VEA 198.50 USD 2020-10-30 price VHT 201.22 USD 2020-10-30 price GLD 131.54 USD 2020-11-06 price VBMPX 133.23 USD 2020-11-06 price RGAGX 119.67 USD 2020-11-06 price ITOT 101.14 USD 2020-11-06 price VEA 195.79 USD 2020-11-06 price VHT 197.96 USD 2020-11-06 price GLD 130.83 USD 2020-11-13 price VBMPX 130.43 USD 2020-11-13 price RGAGX 120.52 USD 2020-11-13 price ITOT 100.51 USD 2020-11-13 price VEA 196.43 USD 2020-11-13 price VHT 192.93 USD 2020-11-13 price GLD 131.49 USD 2020-11-20 price VBMPX 130.93 USD 2020-11-20 price RGAGX 119.48 USD 2020-11-20 price ITOT 99.09 USD 2020-11-20 price VEA 200.16 USD 2020-11-20 price VHT 196.34 USD 2020-11-20 price GLD 133.22 USD 2020-11-27 price VBMPX 130.21 USD 2020-11-27 price RGAGX 118.44 USD 2020-11-27 price ITOT 98.65 USD 2020-11-27 price VEA 199.28 USD 2020-11-27 price VHT 193.26 USD 2020-11-27 price GLD 135.05 USD 2020-12-04 price VBMPX 132.85 USD 2020-12-04 price RGAGX 118.30 USD 2020-12-04 price ITOT 98.47 USD 2020-12-04 price VEA 201.67 USD 2020-12-04 price VHT 194.56 USD 2020-12-04 price GLD 135.88 USD 2020-12-11 price VBMPX 134.55 USD 2020-12-11 price RGAGX 118.39 USD 2020-12-11 price ITOT 98.13 USD 2020-12-11 price VEA 200.07 USD 2020-12-11 price VHT 196.76 USD 2020-12-11 price GLD 135.08 USD 2020-12-18 price VBMPX 136.69 USD 2020-12-18 price RGAGX 117.91 USD 2020-12-18 price ITOT 98.34 USD 2020-12-18 price VEA 204.49 USD 2020-12-18 price VHT 197.20 USD 2020-12-18 price GLD 133.11 USD 2020-12-25 price VBMPX 135.52 USD 2020-12-25 price RGAGX 117.36 USD 2020-12-25 price ITOT 98.89 USD 2020-12-25 price VEA 207.44 USD 2020-12-25 price VHT 196.09 USD 2020-12-25 price GLD 130.02 USD 2021-01-01 price VBMPX 139.57 USD 2021-01-01 price RGAGX 117.60 USD 2021-01-01 price ITOT 98.06 USD 2021-01-01 price VEA 208.15 USD 2021-01-01 price VHT 196.27 USD 2021-01-01 price GLD 131.50 USD 2021-01-08 price VBMPX 137.88 USD 2021-01-08 price RGAGX 117.44 USD 2021-01-08 price ITOT 98.82 USD 2021-01-08 price VEA 207.82 USD 2021-01-08 price VHT 199.83 USD 2021-01-08 price GLD 132.21 USD 2021-01-15 price VBMPX 140.29 USD 2021-01-15 price RGAGX 116.80 USD 2021-01-15 price ITOT 101.16 USD 2021-01-15 price VEA 209.99 USD 2021-01-15 price VHT 199.73 USD 2021-01-15 price GLD 134.10 USD 2021-01-22 price VBMPX 143.65 USD 2021-01-22 price RGAGX 116.18 USD 2021-01-22 price ITOT 101.87 USD 2021-01-22 price VEA 207.92 USD 2021-01-22 price VHT 204.45 USD 2021-01-22 price GLD 131.78 USD 2021-01-29 price VBMPX 139.66 USD 2021-01-29 price RGAGX 116.44 USD 2021-01-29 price ITOT 102.47 USD 2021-01-29 price VEA 204.46 USD 2021-01-29 price VHT 208.04 USD 2021-01-29 price GLD 132.99 USD 2021-02-05 price VBMPX 141.49 USD 2021-02-05 price RGAGX 116.98 USD 2021-02-05 price ITOT 103.46 USD 2021-02-05 price VEA 202.22 USD 2021-02-05 price VHT 210.51 USD 2021-02-05 price GLD 135.25 USD 2021-02-12 price VBMPX 143.19 USD 2021-02-12 price RGAGX 116.43 USD 2021-02-12 price ITOT 103.70 USD 2021-02-12 price VEA 201.71 USD 2021-02-12 price VHT 211.08 USD 2021-02-12 price GLD 131.21 USD 2021-02-19 price VBMPX 142.70 USD 2021-02-19 price RGAGX 116.83 USD 2021-02-19 price ITOT 103.66 USD 2021-02-19 price VEA 206.62 USD 2021-02-19 price VHT 207.15 USD 2021-02-19 price GLD 130.61 USD 2021-02-26 price VBMPX 144.55 USD 2021-02-26 price RGAGX 117.05 USD 2021-02-26 price ITOT 103.59 USD 2021-02-26 price VEA 211.42 USD 2021-02-26 price VHT 205.39 USD 2021-02-26 price GLD 132.95 USD 2021-03-05 price VBMPX 145.70 USD 2021-03-05 price RGAGX 118.25 USD 2021-03-05 price ITOT 103.90 USD 2021-03-05 price VEA 210.71 USD 2021-03-05 price VHT 209.16 USD 2021-03-05 price GLD 130.72 USD 2021-03-12 price VBMPX 144.97 USD 2021-03-12 price RGAGX 118.18 USD 2021-03-12 price ITOT 103.78 USD 2021-03-12 price VEA 210.39 USD 2021-03-12 price VHT 212.56 USD 2021-03-12 price GLD 134.43 USD 2021-03-19 price VBMPX 144.29 USD 2021-03-19 price RGAGX 117.71 USD 2021-03-19 price ITOT 106.12 USD 2021-03-19 price VEA 212.03 USD 2021-03-19 price VHT 210.97 USD 2021-03-19 price GLD 133.36 USD 2021-03-26 price VBMPX 146.17 USD 2021-03-26 price RGAGX 118.67 USD 2021-03-26 price ITOT 105.52 USD 2021-03-26 price VEA 208.72 USD 2021-03-26 price VHT 213.70 USD 2021-03-26 price GLD 135.49 USD 2021-04-02 price VBMPX 146.28 USD 2021-04-02 price RGAGX 118.83 USD 2021-04-02 price ITOT 103.08 USD 2021-04-02 price VEA 206.61 USD 2021-04-02 price VHT 212.99 USD 2021-04-02 price GLD 137.31 USD 2021-04-09 price VBMPX 146.31 USD 2021-04-09 price RGAGX 119.94 USD 2021-04-09 price ITOT 103.32 USD 2021-04-09 price VEA 205.46 USD 2021-04-09 price VHT 214.02 USD 2021-04-09 price GLD 137.77 USD 2021-04-16 price VBMPX 147.58 USD 2021-04-16 price RGAGX 119.99 USD 2021-04-16 price ITOT 103.72 USD 2021-04-16 price VEA 207.53 USD 2021-04-16 price VHT 222.64 USD 2021-04-16 price GLD 139.51 USD 2021-04-23 price VBMPX 147.75 USD 2021-04-23 price RGAGX 120.82 USD 2021-04-23 price ITOT 105.01 USD 2021-04-23 price VEA 208.84 USD 2021-04-23 price VHT 222.61 USD 2021-04-23 price GLD 142.11 USD 2021-04-30 price VBMPX 147.27 USD 2021-04-30 price RGAGX 121.11 USD 2021-04-30 price ITOT 101.53 USD 2021-04-30 price VEA 208.46 USD 2021-04-30 price VHT 222.57 USD 2021-04-30 price GLD 140.40 USD 2021-05-07 price VBMPX 148.75 USD 2021-05-07 price RGAGX 121.10 USD 2021-05-07 price ITOT 102.08 USD 2021-05-07 price VEA 209.51 USD 2021-05-07 price VHT 228.70 USD 2021-05-07 price GLD 140.21 USD 2021-05-14 price VBMPX 149.11 USD 2021-05-14 price RGAGX 122.37 USD 2021-05-14 price ITOT 98.92 USD 2021-05-14 price VEA 208.44 USD 2021-05-14 price VHT 225.09 USD 2021-05-14 price GLD 140.44 USD 2021-05-21 price VBMPX 148.68 USD 2021-05-21 price RGAGX 122.66 USD 2021-05-21 price ITOT 98.65 USD 2021-05-21 price VEA 210.28 USD 2021-05-21 price VHT 232.30 USD 2021-05-21 price GLD 140.71 USD 2021-05-28 price VBMPX 148.54 USD 2021-05-28 price RGAGX 122.37 USD 2021-05-28 price ITOT 98.41 USD 2021-05-28 price VEA 211.77 USD 2021-05-28 price VHT 233.26 USD 2021-05-28 price GLD 141.02 USD 2021-06-04 price VBMPX 148.75 USD 2021-06-04 price RGAGX 123.06 USD 2021-06-04 price ITOT 96.98 USD 2021-06-04 price VEA 217.95 USD 2021-06-04 price VHT 235.75 USD 2021-06-04 price GLD 144.34 USD 2021-06-11 price VBMPX 150.95 USD 2021-06-11 price RGAGX 124.00 USD 2021-06-11 price ITOT 97.59 USD 2021-06-11 price VEA 218.93 USD 2021-06-11 price VHT 234.74 USD 2021-06-11 price GLD 141.63 USD 2021-06-18 price VBMPX 156.54 USD 2021-06-18 price RGAGX 125.65 USD 2021-06-18 price ITOT 97.21 USD 2021-06-18 price VEA 219.35 USD 2021-06-18 price VHT 236.41 USD 2021-06-18 price GLD 142.04 USD 2021-06-25 price VBMPX 157.39 USD 2021-06-25 price RGAGX 125.65 USD 2021-06-25 price ITOT 96.44 USD 2021-06-25 price VEA 217.22 USD 2021-06-25 price VHT 240.87 USD 2021-06-25 price GLD 139.04 USD 2021-07-02 price VBMPX 164.15 USD 2021-07-02 price RGAGX 125.71 USD 2021-07-02 price ITOT 96.37 USD 2021-07-02 price VEA 216.13 USD 2021-07-02 price VHT 242.50 USD 2021-07-02 price GLD 137.71 USD 2021-07-09 price VBMPX 165.15 USD 2021-07-09 price RGAGX 126.55 USD 2021-07-09 price ITOT 97.48 USD 2021-07-09 price VEA 217.60 USD 2021-07-09 price VHT 242.97 USD 2021-07-09 price GLD 137.35 USD 2021-07-16 price VBMPX 165.51 USD 2021-07-16 price RGAGX 128.15 USD 2021-07-16 price ITOT 98.21 USD 2021-07-16 price VEA 217.33 USD 2021-07-16 price VHT 242.73 USD 2021-07-16 price GLD 137.30 USD 2021-07-23 price VBMPX 168.02 USD 2021-07-23 price RGAGX 127.15 USD 2021-07-23 price ITOT 97.20 USD 2021-07-23 price VEA 214.73 USD 2021-07-23 price VHT 243.52 USD 2021-07-23 price GLD 136.61 USD 2021-07-30 price VBMPX 166.91 USD 2021-07-30 price RGAGX 127.47 USD 2021-07-30 price ITOT 95.96 USD 2021-07-30 price VEA 214.00 USD 2021-07-30 price VHT 241.52 USD 2021-07-30 price GLD 136.40 USD 2021-08-06 price VBMPX 169.62 USD 2021-08-06 price RGAGX 127.35 USD 2021-08-06 price ITOT 94.31 USD 2021-08-06 price VEA 217.02 USD 2021-08-06 price VHT 241.37 USD 2021-08-06 price GLD 135.34 USD 2021-08-13 price VBMPX 172.49 USD 2021-08-13 price RGAGX 128.44 USD 2021-08-13 price ITOT 95.51 USD 2021-08-13 price VEA 218.42 USD 2021-08-13 price VHT 240.87 USD 2021-08-13 price GLD 133.11 USD 2021-08-20 price VBMPX 172.80 USD 2021-08-20 price RGAGX 128.41 USD 2021-08-20 price ITOT 96.74 USD 2021-08-20 price VEA 222.83 USD 2021-08-20 price VHT 239.88 USD 2021-08-20 price GLD 131.96 USD 2021-08-27 price VBMPX 178.66 USD 2021-08-27 price RGAGX 129.11 USD 2021-08-27 price ITOT 97.24 USD 2021-08-27 price VEA 224.18 USD 2021-08-27 price VHT 243.14 USD 2021-08-27 price GLD 133.22 USD 2021-09-03 price VBMPX 173.99 USD 2021-09-03 price RGAGX 128.89 USD 2021-09-03 price ITOT 97.21 USD 2021-09-03 price VEA 225.11 USD 2021-09-03 price VHT 241.07 USD 2021-09-03 price GLD 137.08 USD 2021-09-10 price VBMPX 174.10 USD 2021-09-10 price RGAGX 128.98 USD 2021-09-10 price ITOT 98.19 USD 2021-09-10 price VEA 219.21 USD 2021-09-10 price VHT 242.47 USD 2021-09-10 price GLD 137.60 USD 2021-09-17 price VBMPX 175.82 USD 2021-09-17 price RGAGX 129.05 USD 2021-09-17 price ITOT 99.08 USD 2021-09-17 price VEA 219.05 USD 2021-09-17 price VHT 243.66 USD 2021-09-17 price GLD 139.81 USD 2021-09-24 price VBMPX 171.99 USD 2021-09-24 price RGAGX 130.52 USD 2021-09-24 price ITOT 98.92 USD 2021-09-24 price VEA 215.27 USD 2021-09-24 price VHT 246.05 USD 2021-09-24 price GLD 139.23 USD 2021-10-01 price VBMPX 172.34 USD 2021-10-01 price RGAGX 131.73 USD 2021-10-01 price ITOT 100.03 USD 2021-10-01 price VEA 216.72 USD 2021-10-01 price VHT 244.77 USD 2021-10-01 price GLD 136.40 USD 2021-10-08 price VBMPX 169.83 USD 2021-10-08 price RGAGX 132.76 USD 2021-10-08 price ITOT 102.19 USD 2021-10-08 price VEA 222.10 USD 2021-10-08 price VHT 240.96 USD 2021-10-08 price GLD 131.39 USD 2021-10-15 price VBMPX 168.83 USD 2021-10-15 price RGAGX 133.33 USD 2021-10-15 price ITOT 100.99 USD 2021-10-15 price VEA 220.76 USD 2021-10-15 price VHT 241.91 USD 2021-10-15 price GLD 134.01 USD 2021-10-22 price VBMPX 169.72 USD 2021-10-22 price RGAGX 132.43 USD 2021-10-22 price ITOT 101.12 USD 2021-10-22 price VEA 223.67 USD 2021-10-22 price VHT 236.71 USD 2021-10-22 price GLD 138.42 USD 2021-10-29 price VBMPX 169.15 USD 2021-10-29 price RGAGX 134.84 USD 2021-10-29 price ITOT 99.84 USD 2021-10-29 price VEA 222.11 USD 2021-10-29 price VHT 240.55 USD 2021-10-29 price GLD 136.47 USD 2021-11-05 price VBMPX 165.22 USD 2021-11-05 price RGAGX 134.29 USD 2021-11-05 price ITOT 99.72 USD 2021-11-05 price VEA 228.22 USD 2021-11-05 price VHT 241.56 USD 2021-11-05 price GLD 138.34 USD 2021-11-12 price VBMPX 166.68 USD 2021-11-12 price RGAGX 134.30 USD 2021-11-12 price ITOT 99.31 USD 2021-11-12 price VEA 230.25 USD 2021-11-12 price VHT 243.92 USD 2021-11-12 price GLD 137.84 USD 2021-11-19 price VBMPX 167.40 USD 2021-11-19 price RGAGX 134.96 USD 2021-11-19 price ITOT 99.46 USD 2021-11-19 price VEA 223.35 USD 2021-11-19 price VHT 241.03 USD 2021-11-19 price GLD 137.00 USD 2021-11-26 price VBMPX 166.34 USD 2021-11-26 price RGAGX 134.18 USD 2021-11-26 price ITOT 99.96 USD 2021-11-26 price VEA 222.66 USD 2021-11-26 price VHT 236.63 USD 2021-11-26 price GLD 136.71 USD 2021-12-03 price VBMPX 163.29 USD 2021-12-03 price RGAGX 135.71 USD 2021-12-03 price ITOT 101.80 USD 2021-12-03 price VEA 220.59 USD 2021-12-03 price VHT 241.79 USD 2021-12-03 price GLD 136.94 USD 2021-12-10 price VBMPX 167.20 USD 2021-12-10 price RGAGX 137.06 USD 2021-12-10 price ITOT 102.72 USD 2021-12-10 price VEA 218.53 USD 2021-12-10 price VHT 242.67 USD 2021-12-10 price GLD 138.22 USD 2021-12-17 price VBMPX 168.05 USD 2021-12-17 price RGAGX 137.08 USD 2021-12-17 price ITOT 101.52 USD 2021-12-17 price VEA 221.63 USD 2021-12-17 price VHT 244.95 USD 2021-12-17 price GLD 143.00 USD 2021-12-24 price VBMPX 169.17 USD 2021-12-24 price RGAGX 139.41 USD 2021-12-24 price ITOT 103.74 USD 2021-12-24 price VEA 220.85 USD 2021-12-24 price VHT 244.20 USD 2021-12-24 price GLD 142.89 USD 2021-12-31 price VBMPX 166.16 USD 2021-12-31 price RGAGX 142.50 USD 2021-12-31 price ITOT 105.05 USD 2021-12-31 price VEA 222.01 USD 2021-12-31 price VHT 241.84 USD 2021-12-31 price GLD 134.78 USD 2022-01-07 price VBMPX 164.04 USD 2022-01-07 price RGAGX 143.94 USD 2022-01-07 price ITOT 105.36 USD 2022-01-07 price VEA 222.13 USD 2022-01-07 price VHT 246.63 USD 2022-01-07 price GLD 138.92 USD 2022-01-14 price VBMPX 161.51 USD 2022-01-14 price RGAGX 142.62 USD 2022-01-14 price ITOT 105.04 USD 2022-01-14 price VEA 220.39 USD 2022-01-14 price VHT 243.09 USD 2022-01-14 price GLD 141.01 USD 2022-01-21 price VBMPX 161.74 USD 2022-01-21 price RGAGX 142.50 USD 2022-01-21 price ITOT 103.91 USD 2022-01-21 price VEA 218.78 USD 2022-01-21 price VHT 245.54 USD 2022-01-21 price GLD 141.31 USD 2022-01-28 price VBMPX 161.36 USD 2022-01-28 price RGAGX 142.45 USD 2022-01-28 price ITOT 104.27 USD 2022-01-28 price VEA 224.96 USD 2022-01-28 price VHT 245.60 USD 2022-01-28 price GLD 143.27 USD 2022-02-04 price VBMPX 158.74 USD 2022-02-04 price RGAGX 143.70 USD 2022-02-04 price ITOT 104.68 USD 2022-02-04 price VEA 226.37 USD 2022-02-04 price VHT 245.80 USD 2022-02-04 price GLD 143.39 USD 2022-02-11 price VBMPX 157.27 USD 2022-02-11 price RGAGX 144.57 USD 2022-02-11 price ITOT 102.94 USD 2022-02-11 price VEA 228.90 USD 2022-02-11 price VHT 244.42 USD 2022-02-11 price GLD 142.14 USD 2022-02-18 price VBMPX 159.65 USD 2022-02-18 price RGAGX 146.47 USD 2022-02-18 price ITOT 101.55 USD 2022-02-18 price VEA 234.60 USD 2022-02-18 price VHT 240.66 USD 2022-02-18 price GLD 144.57 USD 2023-01-01 price EUR 2.00 USD * Test Stock CORP 2023-02-01 open Assets:US:ETrade:CORP "FIFO" 2023-02-01 open Income:US:ETrade:CORP:Dividend 2023-02-01 commodity CORP name: "Example Stock" 2023-02-01 * "Buy 100 CORP" Assets:US:ETrade:Cash -110.00 USD Assets:US:ETrade:CORP 100 CORP {1 USD} Expenses:Financial:Fees ; 2023-02-01 ; 100 CORP (cost: 100 USD, worth: 100 USD) ; spent: 110 USD 2023-03-15 * "Buy 100 CORP" Assets:US:ETrade:Cash -210.00 USD Assets:US:ETrade:CORP 100 CORP {2 USD} Expenses:Financial:Fees ; 2023-03-15 ; 200 CORP (cost: 300 USD, worth: 400 USD) ; spent: 320 USD ; yield: 25% 2023-05-01 * "Buy 100 CORP" Assets:US:ETrade:Cash -310.00 USD Assets:US:ETrade:CORP 100 CORP {3 USD} Expenses:Financial:Fees ; 2023-05-01 ; 300 CORP (cost: 600 USD, worth: 900 USD) ; spent: 630 USD 2023-05-10 price CORP 2 USD ; 2023-05-10 ; 300 CORP (cost: 600 USD, worth: 600 USD) ; spent: 630 USD 2023-06-01 * "Sell 50 CORP" Assets:US:ETrade:Cash 90 USD ; 50 x 2 USD - 10 USD fees Assets:US:ETrade:CORP -50 CORP {} ; 50 CORP bought at 1 USD Income:US:ETrade:PnL ; 40 USD ; 2023-06-01 ; 250 CORP (cost: 500 USD on avg, worth: 500 USD) ; spent: 630 USD, received: 90 USD 2023-07-01 price CORP 3 USD ; 2023-07-01 ; 250 CORP (cost: 500 USD on avg, worth: 750 USD) ; spent: 630 USD, received: 90 USD 2023-07-01 balance Assets:US:ETrade:Cash 90.0 USD 2023-07-01 balance Assets:US:ETrade:CORP 250 CORP 2023-07-10 * "Dividend" Assets:US:ETrade:Cash 20 USD Income:US:ETrade:CORP:Dividend ; 2023-07-11 ; 250 CORP (cost: 500 USD on avg, worth: 750 USD) ; spent: 630 USD, received: 110 USD 2023-07-11 balance Assets:US:ETrade:Cash 110.00 USD ; beangrow will automatically close ("sell") all remaining stocks ;2023-08-01 * "Sell 250 CORP" ; Assets:US:ETrade:Cash 750 USD ; 250 x 3 USD ; Assets:US:ETrade:CORP -250 CORP {} ; 50 CORP @ 1 USD + 100 @ 2 USD + 100 @ 3 USD ; Income:US:ETrade:PnL ; 190 USD 2023-08-01 price CORP 3 USD 2023-08-01 price CORP 1.50 EUR ; 2023-08-01 ; 0 CORP ; spent: 630 USD, received: 860 USD, profit: 230 USD * Test Stock CORPEUR 2023-02-01 open Assets:US:ETrade:CORPEUR "FIFO" 2023-02-01 commodity CORPEUR name: "Example Stock in EUR" 2023-02-01 * "Buy 100 CORPEUR" Assets:US:ETrade:CashEUR -110.00 EUR Assets:US:ETrade:CORPEUR 100 CORPEUR {1.00 EUR} Expenses:Financial:Fees 10.00 EUR 2023-03-01 price CORPEUR 3.00 EUR 2023-03-01 balance Assets:US:ETrade:CashEUR 0.00 EUR 2023-03-01 balance Assets:US:ETrade:CORPEUR 100 CORPEUR 2023-06-01 * "Sell 100 CORPEUR" Assets:US:ETrade:CORPEUR -100 CORPEUR {} Assets:US:ETrade:CashEUR 90.00 EUR Expenses:Financial:Fees 10.00 EUR 2023-06-02 balance Assets:US:ETrade:CashEUR 90.00 EUR 2023-06-02 balance Assets:US:ETrade:CORPEUR 0 CORPEUR * Test Stock CORPSPL 2023-08-02 open Assets:US:ETrade:CORPSPL "FIFO" 2023-08-02 commodity CORPSPL name: "Example Stock with stock split" 2023-08-02 * "Buy 50 CORPSPL" Assets:US:ETrade:Cash -110.00 USD Assets:US:ETrade:CORPSPL 50 CORPSPL {1.00 USD} Expenses:Financial:Fees 2023-08-04 * "CORPSPL Stock split 10:1" Assets:US:ETrade:CORPSPL -50 CORPSPL {} Assets:US:ETrade:CORPSPL 500 CORPSPL {0.10 USD} 2023-08-05 price CORPSPL 0.10 USD 2023-08-06 balance Assets:US:ETrade:Cash 0.00 USD 2023-08-06 balance Assets:US:ETrade:CORPSPL 500 CORPSPL beangrow-master/flake.lock000066400000000000000000000101611475146671400161250ustar00rootroot00000000000000{ "nodes": { "flake-utils": { "inputs": { "systems": "systems" }, "locked": { "lastModified": 1710146030, "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", "owner": "numtide", "repo": "flake-utils", "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", "type": "github" }, "original": { "owner": "numtide", "ref": "main", "repo": "flake-utils", "type": "github" } }, "nix-filter": { "locked": { "lastModified": 1710156097, "narHash": "sha256-1Wvk8UP7PXdf8bCCaEoMnOT1qe5/Duqgj+rL8sRQsSM=", "owner": "numtide", "repo": "nix-filter", "rev": "3342559a24e85fc164b295c3444e8a139924675b", "type": "github" }, "original": { "owner": "numtide", "ref": "main", "repo": "nix-filter", "type": "github" } }, "nix-github-actions": { "inputs": { "nixpkgs": [ "poetry2nix", "nixpkgs" ] }, "locked": { "lastModified": 1703863825, "narHash": "sha256-rXwqjtwiGKJheXB43ybM8NwWB8rO2dSRrEqes0S7F5Y=", "owner": "nix-community", "repo": "nix-github-actions", "rev": "5163432afc817cf8bd1f031418d1869e4c9d5547", "type": "github" }, "original": { "owner": "nix-community", "repo": "nix-github-actions", "type": "github" } }, "nixpkgs": { "locked": { "lastModified": 1716509168, "narHash": "sha256-4zSIhSRRIoEBwjbPm3YiGtbd8HDWzFxJjw5DYSDy1n8=", "owner": "NixOS", "repo": "nixpkgs", "rev": "bfb7a882678e518398ce9a31a881538679f6f092", "type": "github" }, "original": { "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "poetry2nix": { "inputs": { "flake-utils": [ "flake-utils" ], "nix-github-actions": "nix-github-actions", "nixpkgs": [ "nixpkgs" ], "systems": "systems_2", "treefmt-nix": "treefmt-nix" }, "locked": { "lastModified": 1716813403, "narHash": "sha256-9+G8tEOh3QkjSUV2UMC+TpvzKOR8IUFlkJJTMpVQMkc=", "owner": "nix-community", "repo": "poetry2nix", "rev": "12599ecaa9ec641c29dc8fd07f8267b23874bf3a", "type": "github" }, "original": { "owner": "nix-community", "ref": "master", "repo": "poetry2nix", "type": "github" } }, "root": { "inputs": { "flake-utils": "flake-utils", "nix-filter": "nix-filter", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix" } }, "systems": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "owner": "nix-systems", "repo": "default", "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { "owner": "nix-systems", "repo": "default", "type": "github" } }, "systems_2": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", "owner": "nix-systems", "repo": "default", "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", "type": "github" }, "original": { "id": "systems", "type": "indirect" } }, "treefmt-nix": { "inputs": { "nixpkgs": [ "poetry2nix", "nixpkgs" ] }, "locked": { "lastModified": 1715940852, "narHash": "sha256-wJqHMg/K6X3JGAE9YLM0LsuKrKb4XiBeVaoeMNlReZg=", "owner": "numtide", "repo": "treefmt-nix", "rev": "2fba33a182602b9d49f0b2440513e5ee091d838b", "type": "github" }, "original": { "owner": "numtide", "repo": "treefmt-nix", "type": "github" } } }, "root": "root", "version": 7 } beangrow-master/flake.nix000066400000000000000000000035211475146671400157750ustar00rootroot00000000000000{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable"; flake-utils.url = "github:numtide/flake-utils?ref=main"; nix-filter.url = "github:numtide/nix-filter?ref=main"; poetry2nix = { url = "github:nix-community/poetry2nix?ref=master"; inputs.nixpkgs.follows = "nixpkgs"; inputs.flake-utils.follows = "flake-utils"; }; }; outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system: let # pkgs = inputs.nixpkgs.legacyPackages.${system}; pkgs = import inputs.nixpkgs { inherit system; config.allowUnfree = true; }; python = pkgs.python3; builder = (inputs.poetry2nix.lib.mkPoetry2Nix { inherit pkgs; }).mkPoetryApplication; in { packages.default = builder { inherit python; pyproject = ./pyproject.toml; poetrylock = ./poetry.lock; src = let filter = inputs.nix-filter.lib; in filter { root = ./.; include = [ "README.md" "poetry.lock" "pyproject.toml" "beangrow" ]; exclude = [ (filter.matchName "__pycache__") ]; }; }; devShells.default = pkgs.mkShell { packages = [ python ] ++ (with python.pkgs; [ black pip pytest pytest-cov ]) ++ (with pkgs; [ engage nixpkgs-fmt poetry pyright ruff ]) ++ (with pkgs.nodePackages; [ markdownlint-cli ]); NIX_PYTHON_SITE_PACKAGES = python.sitePackages; shellHook = '' export LD_LIBRARY_PATH="${ pkgs.lib.makeLibraryPath [ pkgs.zlib ] }:$LD_LIBRARY_PATH" export LD_LIBRARY_PATH="${pkgs.stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH" ''; }; }); } beangrow-master/poetry.lock000066400000000000000000003765521475146671400164100ustar00rootroot00000000000000# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "beancount" version = "2.3.6" description = "Command-line Double-Entry Accounting" optional = false python-versions = ">=3.7" files = [ {file = "beancount-2.3.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d82809301de412e4a41bb9fc741ff4f1da8ac65d7f31a9948d89ccc162f0598f"}, {file = "beancount-2.3.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:974c687e604a1fc164dfaf73cf5e5a3001a649da95cadd34de11d8324a150c40"}, {file = "beancount-2.3.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2d512f929ee89faae60e0cb777afd013fceff35873bf58f946af0b9777b9f5"}, {file = "beancount-2.3.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bb50339e987ef2cca6da0dec3156a1555a8b6ace3c4ad25b834c634b88d86fa"}, {file = "beancount-2.3.6-cp310-cp310-win32.whl", hash = "sha256:d883d0028e1a8d9c7c830e8f527a50229c217a417fcd3e9fb01cdb8a43c62038"}, {file = "beancount-2.3.6-cp310-cp310-win_amd64.whl", hash = "sha256:dc54ec7d0fabdb62c737e9e1e7b1c9701dfd95a444b604b74632253d06f01c29"}, {file = "beancount-2.3.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:32717b9e95f41cbd41feb5d132d330bff767015c01199be833a409c6f503f4ce"}, {file = "beancount-2.3.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eb4c916b42b5c15f2da6b6c84dd2a137221f47d84269ea12c635dbeade929e50"}, {file = "beancount-2.3.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ef8abef1a7fb7914e5e96baf927f9ef00841d3cd3b9e7f6ef5351d9a30c58b"}, {file = "beancount-2.3.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca45b3baf889789786c6daca8b2cb0cdd4a9de2451076d7750f4321cb121798"}, {file = "beancount-2.3.6-cp311-cp311-win32.whl", hash = "sha256:147beb06cb52b6cd12fa5dd2595b8d6a3f5b7212ad634256ac7dd4b84441a285"}, {file = "beancount-2.3.6-cp311-cp311-win_amd64.whl", hash = "sha256:1ed8815576f1525b362601d3bd6f526d8fb8d34f83afe0ac34e7ddc6132f9df6"}, {file = "beancount-2.3.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:989af650715fee84e0966d1b7109d2d774d2227686434bb19c1653dfbcd9b076"}, {file = "beancount-2.3.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50ef6c0f3035f44b8fc1b70b8999c12ea6ea7825e2a67c66660456aac3ed2f37"}, {file = "beancount-2.3.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f39cbb0ca36b2e764badabfbf88ff53a07dd2b60895bda621ea35facf29303d"}, {file = "beancount-2.3.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab028f40727a6348d1bb282de05e02ddef76ede5d83a67e15033371c8edaec0"}, {file = "beancount-2.3.6-cp312-cp312-win32.whl", hash = "sha256:dac48134124089f0c0c75840e69d522fb14e2a8e8e4b4950ec4d29fc55e9d48f"}, {file = "beancount-2.3.6-cp312-cp312-win_amd64.whl", hash = "sha256:f60a84cc9c730b1e8f3f7f32b5b4e21b9324256ead054f053dc480ee3da7d520"}, {file = "beancount-2.3.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8d457a9a8495d456a8c36754769ed26f45726c736c01beec69963929e7423e8f"}, {file = "beancount-2.3.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b7ac1c1656232f7bc179723f626a63e91337928cc03335fddcc9de36055f77"}, {file = "beancount-2.3.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:204db0ea166e124fd17ead37f1dab20b9eee048c01c24b9dc0bb1c342e70b9e1"}, {file = "beancount-2.3.6-cp37-cp37m-win32.whl", hash = "sha256:c99ddec92145bfb029066395ed9815833b60f5a627feb1051a19912d3c8a26d2"}, {file = "beancount-2.3.6-cp37-cp37m-win_amd64.whl", hash = "sha256:e438209f95c3bc6f277251952bf0f4cdbfd2426faed5f18962c20ad9b89fdf72"}, {file = "beancount-2.3.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fc494a82962842215dede97b32b4e1c169d19ea075be6525d05c51cdbf984ebf"}, {file = "beancount-2.3.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d23ecda2893cf295e17705ae65d04add422dffe3979cb891395fedfa1eb573d8"}, {file = "beancount-2.3.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5fcd9f3dcc5ebf8dd1c092367c24d7e12b78778492285b24902aeb92b396f6"}, {file = "beancount-2.3.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ed8540d44476272b76ecc221af0d83e913d578430cbd9a1c67b981d93513962"}, {file = "beancount-2.3.6-cp38-cp38-win32.whl", hash = "sha256:0246569208883042d14f35112af31b1ca4ac1477db2050e3e0dd0f718887cab1"}, {file = "beancount-2.3.6-cp38-cp38-win_amd64.whl", hash = "sha256:1273e97b2a642917f4dad078fd42e23fcfbb6ffc89e987f07f664103305e9df6"}, {file = "beancount-2.3.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8dc71b4b529be4034e26c16541c70a64cb43c20720776db3ff995403466108f3"}, {file = "beancount-2.3.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b8889e287674938c6ff953f77affc8e550c636e630f6b26157634fdb98ac412"}, {file = "beancount-2.3.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8300a45e0ecf2230f3f10c584bed41422db261b9421714173e2c31ece16695"}, {file = "beancount-2.3.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83108e60f697cd2b67d3b21731cf803d85a2419a54307a2ec8f20fbddb41e7c6"}, {file = "beancount-2.3.6-cp39-cp39-win32.whl", hash = "sha256:374ec294a07b8381aa34067749b145591f323da09e0f6c35685d573b23422aa6"}, {file = "beancount-2.3.6-cp39-cp39-win_amd64.whl", hash = "sha256:bf6eeacf27bb7681c28e868e4f3c99f5b738d3376519d2aab9200063d14167a7"}, {file = "beancount-2.3.6.tar.gz", hash = "sha256:801f93bed6b57d2e22436688c489d5a1bf1f76e210f3ced18680757e60d3475a"}, ] [package.dependencies] beautifulsoup4 = "*" bottle = "*" chardet = "*" google-api-python-client = "*" lxml = "*" pdfminer2 = "*" ply = "*" pytest = "*" python-dateutil = "*" python-magic = {version = ">=0.4.12", markers = "sys_platform != \"win32\""} requests = "*" [[package]] name = "beanprice" version = "1.2.0" description = "Price quotes fetcher for Beancount" optional = false python-versions = ">=3.5" files = [] develop = false [package.dependencies] beancount = ">=2.3.4" pytest = "*" python-dateutil = "*" requests = "*" [package.source] type = "git" url = "git+https://github.com/beancount/beanprice.git" reference = "HEAD" resolved_reference = "41576e2ac889e4825e4985b6f6c56aa71de28304" [[package]] name = "beautifulsoup4" version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] cchardet = ["cchardet"] chardet = ["chardet"] charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "bottle" version = "0.12.25" description = "Fast and simple WSGI-framework for small web-applications." optional = false python-versions = "*" files = [ {file = "bottle-0.12.25-py3-none-any.whl", hash = "sha256:d6f15f9d422670b7c073d63bd8d287b135388da187a0f3e3c19293626ce034ea"}, {file = "bottle-0.12.25.tar.gz", hash = "sha256:e1a9c94970ae6d710b3fb4526294dfeb86f2cb4a81eff3a4b98dc40fb0e5e021"}, ] [[package]] name = "cachetools" version = "5.3.3" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [[package]] name = "certifi" version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] name = "chardet" version = "5.2.0" description = "Universal encoding detector for Python 3" optional = false python-versions = ">=3.7" files = [ {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, ] [[package]] name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] name = "contourpy" version = "1.2.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.9" files = [ {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, ] [package.dependencies] numpy = ">=1.20" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "cycler" version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] [package.extras] docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "exceptiongroup" version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] test = ["pytest (>=6)"] [[package]] name = "fonttools" version = "4.52.4" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ {file = "fonttools-4.52.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb8cd6559f0ae3a8f5e146f80ab2a90ad0325a759be8d48ee82758a0b89fa0aa"}, {file = "fonttools-4.52.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ecb88318ff249bd2a715e7aec36774ce7ae3441128007ef72a39a60601f4a8f"}, {file = "fonttools-4.52.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9a22cf1adaae7b2ba2ed7d8651a4193a4f348744925b4b740e6b38a94599c5b"}, {file = "fonttools-4.52.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8873d6edd1dae5c088dd3d61c9fd4dd80c827c486fa224d368233e7f33dc98af"}, {file = "fonttools-4.52.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:73ba38b98c012957940a04d9eb5439b42565ac892bba8cfc32e10d88e73921fe"}, {file = "fonttools-4.52.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9725687db3c1cef13c0f40b380c3c15bea0113f4d0231b204d58edd5f2a53d90"}, {file = "fonttools-4.52.4-cp310-cp310-win32.whl", hash = "sha256:9180775c9535389a665cae7c5282f8e07754beabf59b66aeba7f6bfeb32a3652"}, {file = "fonttools-4.52.4-cp310-cp310-win_amd64.whl", hash = "sha256:46cc5d06ee05fd239c45d7935aaffd060ee773a88b97e901df50478247472643"}, {file = "fonttools-4.52.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d272c7e173c3085308345ccc7fb2ad6ce7f415d777791dd6ce4e8140e354d09c"}, {file = "fonttools-4.52.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:21921e5855c399d10ddfc373538b425cabcf8b3258720b51450909e108896450"}, {file = "fonttools-4.52.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f6001814ec5e0c961cabe89642f7e8d7e07892b565057aa526569b9ebb711c"}, {file = "fonttools-4.52.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b0b9eb0f55dce9c7278ad4175f1cbaed23b799dce5ecc20e3213da241584140"}, {file = "fonttools-4.52.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:70d87f2099006304d33438bdaa5101953b7e22e23a93b1c7b7ed0f32ff44b423"}, {file = "fonttools-4.52.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e176249292eccd89f81d39f514f2b5e8c75dfc9cef8653bdc3021d06697e9eff"}, {file = "fonttools-4.52.4-cp311-cp311-win32.whl", hash = "sha256:bb7d206fa5ba6e082ba5d5e1b7107731029fc3a55c71c48de65121710d817986"}, {file = "fonttools-4.52.4-cp311-cp311-win_amd64.whl", hash = "sha256:346d08ff92e577b2dc5a0c228487667d23fe2da35a8b9a8bba22c2b6ba8be21c"}, {file = "fonttools-4.52.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d2cc7906bc0afdd2689aaf88b910307333b1f936262d1d98f25dbf8a5eb2e829"}, {file = "fonttools-4.52.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:00d9abf4b400f98fb895566eb298f60432b4b29048e3dc02807427b09a06604e"}, {file = "fonttools-4.52.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b419207e53db1599b3d385afd4bca6692c219d53732890d0814a2593104d0e2"}, {file = "fonttools-4.52.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf694159528022daa71b1777cb6ec9e0ebbdd29859f3e9c845826cafaef4ca29"}, {file = "fonttools-4.52.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9a5d1b0475050056d2e3bc378014f2ea2230e8ae434eeac8dfb182aa8efaf642"}, {file = "fonttools-4.52.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4c3ad89204c2d7f419436f1d6fde681b070c5e20b888beb57ccf92f640628cc9"}, {file = "fonttools-4.52.4-cp312-cp312-win32.whl", hash = "sha256:1dc626de4b204d025d029e646bae8fdbf5acd9217158283a567f4b523fda3bae"}, {file = "fonttools-4.52.4-cp312-cp312-win_amd64.whl", hash = "sha256:309b617942041073ffa96090d320b99d75648ed16e0c67fb1aa7788e06c834de"}, {file = "fonttools-4.52.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8b186cd6b8844f6cf04a7e0a174bc3649d3deddbfc10dc59846a4381f796d348"}, {file = "fonttools-4.52.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9ed23a03b7d9f0e29ca0679eafe5152aeccb0580312a3fc36f0662e178b4791b"}, {file = "fonttools-4.52.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89b53386214197bd5b3e3c753895bad691de84726ced3c222a59cde1dd12d57b"}, {file = "fonttools-4.52.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7467161f1eed557dbcec152d5ee95540200b1935709fa73307da16bc0b7ca361"}, {file = "fonttools-4.52.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b4cba644e2515d685d4ee3ca2fbb5d53930a0e9ec2cf332ed704dc341b145878"}, {file = "fonttools-4.52.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:890e7a657574610330e42dd1e38d3b9e0a8cb0eff3da080f80995460a256d3dd"}, {file = "fonttools-4.52.4-cp38-cp38-win32.whl", hash = "sha256:7dccf4666f716e5e0753f0fa28dad2f4431154c87747bc781c838b8a5dca990e"}, {file = "fonttools-4.52.4-cp38-cp38-win_amd64.whl", hash = "sha256:a791f002d1b717268235cfae7e4957b7fd132e92e2c5400e521bf191f1b3a9a5"}, {file = "fonttools-4.52.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:05e4291db6af66f466a203d9922e4c1d3e18ef16868f76f10b00e2c3b9814df2"}, {file = "fonttools-4.52.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a64e72d2c144630e017ac9c1c416ddf8ac43bef9a083bf81fe08c0695f0baa95"}, {file = "fonttools-4.52.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebb183ed8b789cece0bd6363121913fb6da4034af89a2fa5408e42a1592889a8"}, {file = "fonttools-4.52.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4daf2751a98c69d9620717826ed6c5743b662ef0ae7bb33dc6c205425e48eba"}, {file = "fonttools-4.52.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:15efb2ba4b8c2d012ee0bb7a850c2e4780c530cc83ec8e843b2a97f8b3a5fd4b"}, {file = "fonttools-4.52.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:35af630404223273f1d7acd4761f399131c62820366f53eac029337069f5826a"}, {file = "fonttools-4.52.4-cp39-cp39-win32.whl", hash = "sha256:d0184aa88865339d96f7f452e8c5b621186ef7638744d78bf9b775d67e206819"}, {file = "fonttools-4.52.4-cp39-cp39-win_amd64.whl", hash = "sha256:e03dae26084bb3632b4a77b1cd0419159d2226911aff6dc4c7e3058df68648c6"}, {file = "fonttools-4.52.4-py3-none-any.whl", hash = "sha256:95e8a5975d08d0b624a14eec0f987e204ad81b480e24c5436af99170054434b8"}, {file = "fonttools-4.52.4.tar.gz", hash = "sha256:859399b7adc8ac067be8e5c80ef4bb2faddff97e9b40896a9de75606a43d0469"}, ] [package.extras] all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "google-api-core" version = "2.19.0" description = "Google API client core library" optional = false python-versions = ">=3.7" files = [ {file = "google-api-core-2.19.0.tar.gz", hash = "sha256:cf1b7c2694047886d2af1128a03ae99e391108a08804f87cfd35970e49c9cd10"}, {file = "google_api_core-2.19.0-py3-none-any.whl", hash = "sha256:8661eec4078c35428fd3f69a2c7ee29e342896b70f01d1a1cbcb334372dd6251"}, ] [package.dependencies] google-auth = ">=2.14.1,<3.0.dev0" googleapis-common-protos = ">=1.56.2,<2.0.dev0" proto-plus = ">=1.22.3,<2.0.0dev" protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" requests = ">=2.18.0,<3.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" version = "2.131.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ {file = "google-api-python-client-2.131.0.tar.gz", hash = "sha256:1c03e24af62238a8817ecc24e9d4c32ddd4cb1f323b08413652d9a9a592fc00d"}, {file = "google_api_python_client-2.131.0-py2.py3-none-any.whl", hash = "sha256:e325409bdcef4604d505d9246ce7199960a010a0569ac503b9f319db8dbdc217"}, ] [package.dependencies] google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" google-auth-httplib2 = ">=0.2.0,<1.0.0" httplib2 = ">=0.19.0,<1.dev0" uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" version = "2.29.0" description = "Google Authentication Library" optional = false python-versions = ">=3.7" files = [ {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] reauth = ["pyu2f (>=0.1.5)"] requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-auth-httplib2" version = "0.2.0" description = "Google Authentication Library: httplib2 transport" optional = false python-versions = "*" files = [ {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, ] [package.dependencies] google-auth = "*" httplib2 = ">=0.19.0" [[package]] name = "googleapis-common-protos" version = "1.63.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ {file = "googleapis-common-protos-1.63.0.tar.gz", hash = "sha256:17ad01b11d5f1d0171c06d3ba5c04c54474e883b66b949722b4938ee2694ef4e"}, {file = "googleapis_common_protos-1.63.0-py2.py3-none-any.whl", hash = "sha256:ae45f75702f7c08b541f750854a678bd8f534a1a6bace6afe975f1d0a82d6632"}, ] [package.dependencies] protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" [package.extras] grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "httplib2" version = "0.22.0" description = "A comprehensive HTTP client library." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, ] [package.dependencies] pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} [[package]] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] name = "kiwisolver" version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" files = [ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] [[package]] name = "lxml" version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" files = [ {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.10)"] [[package]] name = "matplotlib" version = "3.9.0" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ {file = "matplotlib-3.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56"}, {file = "matplotlib-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b"}, {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"}, {file = "matplotlib-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d"}, {file = "matplotlib-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4"}, {file = "matplotlib-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463"}, {file = "matplotlib-3.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38"}, {file = "matplotlib-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152"}, {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85"}, {file = "matplotlib-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb"}, {file = "matplotlib-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674"}, {file = "matplotlib-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be"}, {file = "matplotlib-3.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382"}, {file = "matplotlib-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84"}, {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5"}, {file = "matplotlib-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db"}, {file = "matplotlib-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7"}, {file = "matplotlib-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf"}, {file = "matplotlib-3.9.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956"}, {file = "matplotlib-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a"}, {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321"}, {file = "matplotlib-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89"}, {file = "matplotlib-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b"}, {file = "matplotlib-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888"}, {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0"}, {file = "matplotlib-3.9.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03"}, {file = "matplotlib-3.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd"}, {file = "matplotlib-3.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e"}, {file = "matplotlib-3.9.0.tar.gz", hash = "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [package.extras] dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"] [[package]] name = "matplotlib-stubs" version = "0.2.0" description = "Unofficial stubs for the matplotlib package." optional = false python-versions = ">=3.8" files = [ {file = "matplotlib_stubs-0.2.0-py3-none-any.whl", hash = "sha256:4758c4d05729440605f5b0618eb97711899a673bdf41a1a916a50f723b92db91"}, {file = "matplotlib_stubs-0.2.0.tar.gz", hash = "sha256:f4563b4465cc8a2f97303217caa8d830d2e253bc7f45c9041ac248ccf8d049a7"}, ] [package.dependencies] matplotlib = ">=3.0" numpy = ">=1.20,<2.0" pandas = ">=2.0,<3.0" [package.extras] build = ["hatch"] dev = ["pandas-stubs", "pip-tools", "pre-commit", "pyright", "ruff"] test = ["matplotlib-stubs[dev]", "mypy", "pytest", "pytest-mypy-plugins"] [[package]] name = "numpy" version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "packaging" version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] name = "pandas" version = "2.2.2" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, ] [package.dependencies] numpy = [ {version = ">=1.22.4", markers = "python_version < \"3.11\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" [package.extras] all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] aws = ["s3fs (>=2022.11.0)"] clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] compression = ["zstandard (>=0.19.0)"] computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] consortium-standard = ["dataframe-api-compat (>=0.1.7)"] excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] feather = ["pyarrow (>=10.0.1)"] fss = ["fsspec (>=2022.11.0)"] gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] hdf5 = ["tables (>=3.8.0)"] html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] parquet = ["pyarrow (>=10.0.1)"] performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] plot = ["matplotlib (>=3.6.3)"] postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] pyarrow = ["pyarrow (>=10.0.1)"] spss = ["pyreadstat (>=1.2.0)"] sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.9.2)"] [[package]] name = "pandas-stubs" version = "2.2.2.240514" description = "Type annotations for pandas" optional = false python-versions = ">=3.9" files = [ {file = "pandas_stubs-2.2.2.240514-py3-none-any.whl", hash = "sha256:5d6f64d45a98bc94152a0f76fa648e598cd2b9ba72302fd34602479f0c391a53"}, {file = "pandas_stubs-2.2.2.240514.tar.gz", hash = "sha256:85b20da44a62c80eb8389bcf4cbfe31cce1cafa8cca4bf1fc75ec45892e72ce8"}, ] [package.dependencies] numpy = {version = ">=1.26.0", markers = "python_version < \"3.13\""} types-pytz = ">=2022.1.1" [[package]] name = "pdfminer2" version = "20151206" description = "PDF parser and analyzer" optional = false python-versions = "*" files = [ {file = "pdfminer2-20151206-py2-none-any.whl", hash = "sha256:92fb0639d8d4619be3b87147c89c2170602a8fefc9ef1933241822d3c3aff6e7"}, {file = "pdfminer2-20151206-py2.py3-none-any.whl", hash = "sha256:e068619af33a3d323093a4dde56ae9e2b1bb344d3ecbc3110e448ba8042acc3e"}, {file = "pdfminer2-20151206.macosx-10.10-x86_64.tar.gz", hash = "sha256:9c0599bfde105a8d58e3f679c31ab84871dc9bd3debf1be6511e1abaa4db867f"}, {file = "pdfminer2-20151206.tar.gz", hash = "sha256:7d05aa3dd1e779080fef13aef454501b51a3f7649d7f18e78c640bdbd34e1e77"}, ] [package.dependencies] six = "*" [[package]] name = "pillow" version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] typing = ["typing-extensions"] xmp = ["defusedxml"] [[package]] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] [[package]] name = "ply" version = "3.11" description = "Python Lex & Yacc" optional = false python-versions = "*" files = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, ] [[package]] name = "proto-plus" version = "1.23.0" description = "Beautiful, Pythonic protocol buffers." optional = false python-versions = ">=3.6" files = [ {file = "proto-plus-1.23.0.tar.gz", hash = "sha256:89075171ef11988b3fa157f5dbd8b9cf09d65fffee97e29ce403cd8defba19d2"}, {file = "proto_plus-1.23.0-py3-none-any.whl", hash = "sha256:a829c79e619e1cf632de091013a4173deed13a55f326ef84f05af6f50ff4c82c"}, ] [package.dependencies] protobuf = ">=3.19.0,<5.0.0dev" [package.extras] testing = ["google-api-core[grpc] (>=1.31.5)"] [[package]] name = "protobuf" version = "4.25.3" description = "" optional = false python-versions = ">=3.8" files = [ {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [[package]] name = "pyasn1" version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false python-versions = ">=3.8" files = [ {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pyasn1-modules" version = "0.4.0" description = "A collection of ASN.1-based protocols modules" optional = false python-versions = ">=3.8" files = [ {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] pyasn1 = ">=0.4.6,<0.7.0" [[package]] name = "pyparsing" version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" version = "8.2.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ {file = "pytest-8.2.1-py3-none-any.whl", hash = "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1"}, {file = "pytest-8.2.1.tar.gz", hash = "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=1.5,<2.0" tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] six = ">=1.5" [[package]] name = "python-magic" version = "0.4.27" description = "File type identification using libmagic" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ {file = "python-magic-0.4.27.tar.gz", hash = "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b"}, {file = "python_magic-0.4.27-py2.py3-none-any.whl", hash = "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"}, ] [[package]] name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] name = "requests" version = "2.32.2" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" files = [ {file = "requests-2.32.2-py3-none-any.whl", hash = "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c"}, {file = "requests-2.32.2.tar.gz", hash = "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "rsa" version = "4.9" description = "Pure-Python RSA implementation" optional = false python-versions = ">=3.6,<4" files = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, ] [package.dependencies] pyasn1 = ">=0.1.3" [[package]] name = "scipy" version = "1.13.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.9" files = [ {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"}, {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"}, {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"}, {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"}, {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"}, {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"}, {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"}, {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"}, {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"}, {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"}, {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"}, {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"}, {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"}, {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"}, {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"}, {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"}, {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"}, {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"}, {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"}, {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"}, {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"}, {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"}, {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"}, {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"}, {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"}, ] [package.dependencies] numpy = ">=1.22.4,<2.3" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] name = "soupsieve" version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.8" files = [ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] [[package]] name = "types-pytz" version = "2024.1.0.20240417" description = "Typing stubs for pytz" optional = false python-versions = ">=3.8" files = [ {file = "types-pytz-2024.1.0.20240417.tar.gz", hash = "sha256:6810c8a1f68f21fdf0f4f374a432487c77645a0ac0b31de4bf4690cf21ad3981"}, {file = "types_pytz-2024.1.0.20240417-py3-none-any.whl", hash = "sha256:8335d443310e2db7b74e007414e74c4f53b67452c0cb0d228ca359ccfba59659"}, ] [[package]] name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" optional = false python-versions = ">=3.6" files = [ {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] [[package]] name = "urllib3" version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<=3.12" content-hash = "1b8395dc1e66e9b2ae6fe88751ca0fe5d08a391beb5c89a5c085e8835b544209" beangrow-master/poetry.toml000066400000000000000000000000401475146671400164030ustar00rootroot00000000000000[virtualenvs] in-project = true beangrow-master/pyproject.toml000066400000000000000000000062741475146671400171170ustar00rootroot00000000000000[build-system] requires = ['setuptools'] build-backend = 'setuptools.build_meta' [project] name = "beangrow" version = '1.0.1' description = 'Returns calculations on portfolios in Beancount Resources' authors = [ { name = 'Martin Blais', email = 'blais@furius.ca' }, ] maintainers = [ { name = 'Martin Blais', email = 'blais@furius.ca' }, ] readme = "README.md" keywords = [ 'accounting', 'ledger', 'beancount', 'returns', 'investments' ] classifiers = [ 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', 'Programming Language :: Python :: 3 :: Only', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', 'Programming Language :: SQL', 'Topic :: Office/Business :: Financial :: Accounting', ] requires-python = '>= 3.10' dependencies = [ 'numpy >= 1.26.4', 'pandas >= 2.2.2', 'matplotlib >= 3.9.0', 'beancount >= 2.3.6', 'scipy >= 1.13.1', 'beanprice >= 1.2.1', 'protobuf >= 5.29.3', ] [dependency-groups] dev = [ 'ruff >= 0.9.3', 'pandas-stubs >= 2.2.2.240514', 'matplotlib-stubs >= 0.2.0', 'mypy>=1.14.1', 'types-protobuf>=5.29.1.20241207', 'types-python-dateutil>=2.9.0.20241206', "pytest>=8.3.4", ] [tool.setuptools] license-files = [] [project.scripts] beangrow-returns = "beangrow.compute_returns:main" beangrow-prices = "beangrow.download_prices:main" beangrow-prices-file = "beangrow.download_prices_from_file:main" [tool.black] line-length = 88 [tool.pyright] exclude = [ ".venv", ".direnv", ] typeCheckingMode = "standard" useLibraryCodeForTypes = true reportMissingTypeStubs = false [tool.ruff] select = [ "ALL" ] ignore = [ # Pyright automatically infers the type of `self` "ANN101", # Pyright automatically infers the type of `cls` "ANN102", # In some cases actively detrimental; somewhat conflicts with black "COM", # In combination with D213, this results in noisy diffs and inconsistencies # See also . "D200", # This results inconsistencies between function and class docstrings # See also . "D202", # D211 is preferred since the extra blank line isn't visually useful "D203", # D213 is preferred since it's more readable and allows more characters "D212", # Covered by D401, which is more restrictive "D415", # Too many false-positives "ERA", # Just use a recent version of Python "FA", # This would just discourage documenting deficiences, not committing them "FIX", # Type-checkers interpret redundant `as` as exporting an item "PLC0414", # False-positives with chained function calls "RSE102", # Not applicable "T20", # Causes churn and awful looking import blocks for little gain "TCH", # Just look at the file history "TD002", # Not everything is worth a link "TD003", ] [tool.ruff.per-file-ignores] "tests/*" = [ "D100", "D103", "D104", "S101", ] [tool.coverage.report] skip_covered = true skip_empty = true