{ "info": { "author": "Raymond Ehlers", "author_email": "raymond.ehlers@cern.ch", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "\n\n# ALICE Overwatch\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1309375.svg)](https://doi.org/10.5281/zenodo.1309375)\n[![Documentation Status](https://readthedocs.org/projects/overwatch/badge/?version=latest)](https://overwatch.readthedocs.io/en/latest/?badge=latest)\n[![Build Status](https://travis-ci.org/raymondEhlers/OVERWATCH.svg?branch=master)](https://travis-ci.org/raymondEhlers/OVERWATCH)\n\nWelcome to ALICE Overwatch[\\*](#name-meaning), a project to provide real-time online data monitoring and\nquality assurance using timestamped data from the ALICE High Level Trigger (HLT) and Data Quality Monitoring\n(DQM). See the [Web App](https://aliceoverwatch.physics.yale.edu/) to access Overwatch displaying ALICE data.\n\n# Quick Start\n\n## Setup Overwatch\n\nAlong with a variety of dependencies which can be handled by pip, ROOT is required. ROOT 6 is recommended.\n\n### Local development\n\nTo setup for local development is fairly straightforward.\n\n```bash\n$ git clone https://github.com/raymondEhlers/OVERWATCH.git overwatch\n$ cd overwatch\n# Install webApp static data (Google Polymer and jsRoot)\n$ cd overwatch/webApp/static && bower install && git clone https://github.com/root-project/jsroot.git jsRoot && cd -\n# Probably best to do this in a virtualenv. The overwatch setup.py can't install this automatically.\n$ pip install git+https://github.com/SpotlightKid/flask-zodb.git\n# Install for local development\n$ pip install -e .\n```\n\n### Docker Image\n\nAs an alternative for advanced users or deployments, a docker image is available on Docker Hub under the name\n`rehlers/overwatch`. Be certain to mount a directory containing data into the image so it can be used! Note\nthat you will likely want to use this image interactively (-it) and may want to remove the container when you\nare done (--rm). If the data is in a folder called `data`, it should look something like:\n\n```bash\n$ docker run -it --rm -v data:/overwatch/data rehlers/overwatch:latest-py3.6.7 /bin/bash\n```\n\n### Installation only for running Overwatch\n\nFor just running Overwatch (ie. performing no development at all), it is also available on\n[PyPI](https://pypi.org/project/aliceOverwatch/) to install via pip.\n\n```bash\n# Required as a prerequisite since it is not available on PyPI.\n$ pip install git+https://github.com/SpotlightKid/flask-zodb.git\n# Install the final package\n$ pip install aliceOverwatch\n```\n\nNote that the Overwatch package on PyPI includes all of `JSRoot` and Polymer components so that it can run out\nof the box! While this is useful, it is important to remember that these dependencies must also be kept up to\ndate.\n\n## Using Overwatch\n\n### Retrieving test data\n\nTo use most parts of the Overwatch project, you need some data provided by the HLT. The latest five runs of data\nreceived by Overwatch can be accessed\n[here](https://aliceoverwatch.physics.yale.edu/testingDataArchive). The login credentials are available on the\n[ALICE TWiki](https://twiki.cern.ch/twiki/bin/view/ALICE/OverwatchProject). It includes at least the combined\nfile and the file from which it is built. If the run is sufficiently long, it will include an additional file\nfor testing of the time slice functionality.\n\n### Process the data with `overwatchProcessing`\n\nCreate a basic configuration file named `config.yaml` containing something like:\n\n```yaml\n# Main options\n# Enable debug settings, messages at the debug level\ndebug: true\nloggingLevel: \"DEBUG\"\n# Reprocess the data each time, even if it is not detected as needed. It can be useful\n# to test modifications to the processing\nforceReprocessing: true\n\n# The directory defaults to \"data\", which is the recommended name\ndataFolder: &dataFolder \"path/to/data\"\n```\n\nThen, start processing the data with:\n\n```bash\n$ overwatchProcessing\n```\n\n### Visualizing the data with `overwatchWebApp`\n\nFor the webApp, add something similar to the following to your `config.yaml`:\n\n```yaml\n# Define users for local usage\n_users: !bcrypt\n # The key, (below is \"username\") is the the name of your user, while the value, (below is \"password\") is your password\n username: \"password\"\n# Continue to keep debug: true . It often helps with ZODB difficulties.\n```\n\nThen, to start the webApp for data visualization, run:\n\n```bash\n$ overwatchWebApp\n```\n\nBy default, the webApp will be available at [http://127.0.0.1:8850](http://127.0.0.1:8850) using the flask\ndevelopment server (**not for production**). Login with the credentials that were specified in your\nconfiguration file.\n\n# Table of Contents\n\n1. [Overwatch Overview and Architecture](#overwatch-overview-and-architecture)\n - [Processing](#overwatch-processing)\n - [Web App](@overwatch-webapp)\n - [Data Receivers](#overwatch-receivers)\n2. [Overwatch Configuration](#overwatch-configuration)\n3. [Overwatch Executables](#overwatch-executables)\n4. [Overwatch Deployment](#overwatch-deployment)\n5. [Using Overwatch Data](#using-overwatch-data)\n6. [Citation](#citation)\n7. [Additional Resources](#additional-resources)\n\n# Overwatch Architecture\n\n![](https://cdn.rawgit.com/raymondEhlers/overwatch/f1d173dd/doc/images/overwatchArch.png)\n\nThe Overwatch architecture is as shown above. Incoming data is handled by the receivers, which then make that data\navailable to be processed by the processing module. The output of the processing is then visualized via the WebApp.\nIn terms of code, the dependencies are as follows:\n\n```\npython modules\n---\nbase <- processing <- webApp\n <- dqmReceiver\n\nc++\n---\nzmqReceiver\n```\n\nFurther information on each component is available in the sections below. More detailed technical information\nis available in the READMEs for each package, as well as in the code documentation.\n\n## Overwatch Processing\n\nThe main processing component of Overwatch is responsible for transforming the received data into a viewable\nform, while also extracting derived quantities and performing checks for alarms. The main processing module is\nwritten in python and depends heavily on PyROOT, with some functionality implemented through numpy. The module\nis located in `overwatch/processing`, with the file `processRuns.py` driving the processing.\n\nAt a high level, the processing pipeline looks like:\n\n- Extract run metadata (run number, HLT mode, detector subsystem being processed, available histograms in the particular run, etc).\n- Determine which runs need processing.\n - For example, if a new file has arrived for a particular run, then that run should be processed.\n- If the run is new, determine which objects (histograms) are included and to which groups they belong, which processing functions need to be run, etc.\n - The processing functions are implemented by each detector and called when requested by the particular detector.\n- Apply those processing functions for each object (histogram), and store the outputs.\n\nEach detector (also known as a subsystem) is given the opportunity to plug into the processing pipeline at nearly every stage. Each one is identified by the three letter detector name. The detector specific code is located in `overwatch/processing/detectors/` and can be enable through the processing configuration.\n\n## Overwatch WebApp\n\n![An Overwatch run page](https://cdn.rawgit.com/raymondEhlers/overwatch/f1d173dd/doc/images/runPage.png)\n\nThe web app visualizes the information provided by the processing. The WebApp is based on flask and serves\nthe various forms of visualization, as well as providing an interface to request on-demand processing of the\ndata with customized parameters. Note that this causes a direct dependence on the processing module. The main\nmode of visualization is via json files displayed using `JSRoot`, which provides interactivity with the data.\n\n## Overwatch Data Receivers\n\nThe receivers are responsible for receiving data from the various input sources and writing them out.\nReceivers write out ROOT files with the same filename information, thereby allowing for them to be processed\nthe same regardless of their source.\n\n_Note that these receivers need to be deployed in the production environment, but would rarely, if ever,\nneed to be used by standard Overwatch users!_\n\n### HLT Receivers\n\nData from the HLT consists of ROOT TObject-derived objects sent via ZeroMQ (ZMQ). The receiver is built in C++,\nwith dependencies on HLT files automatically downloaded, compiled, and linked with the receiver code when the\nreceiver is compiled.\n\nInstallation follows the typical CMake pattern for an out of source build. When configuring, remember to specifying\nthe location of ZMQ and ROOT as necessary. Once built, the receiver executable is named `zmqReceive`. A variety of\noptions are available - for the precise options, see the help (`-h` or `--help`).\n\nNote that if there is a ROOT version mismatch (for example, ROOT 5 on the HLT but ROOT 6 for Overwatch), it is\nimperative to request the relevant ROOT streamers with the '--requestStreamers' option. Note that this option can\npotentially trigger an internal ROOT bug, and therefore should not be used too frequently. Thus, the request is only\nsent once when the receiver is started, and it should not be frequently restarted.\n\n### DQM Receiver\n\nData from DQM consists of ROOT files sent via a rest API. The DQM receiver code is written as a flask app.\nThe web app is installed as part of the Overwatch package and can be run using the flask development server\nvia `overwatchDQMReceiver`. It is configured using the same system as the rest of the Overwatch package, as\ndescribed [here](overwatch-configuration).\n\nFor the APIs that are made available, please see the main server code in `overwatch/receiver/dqmReceiver.py`.\n\n# Overwatch Configuration\n\nOverwatch is configured via options defined in YAML configuration files. There is one configuration file each for\nthe Overwatch module (DQM receiver, processing, and webApp). Given the dependency of the various module on each\nother, the configuration files are also interconnected. For example, if the webApp is loaded, it will also load\nthe processing configuration, along with the other configurations on which the processing depends. In particular,\nbelow is the ordered precedence for configuration files.\n\n```\n./config.yaml\n~/overwatch{Module}.yaml\noverwatch/webApp/config.yaml\noverwatch/processing/config.yaml\noverwatch/receiver/config.yaml\noverwatch/base/config.yaml\n```\n\nThe ordering of the configuration files means that values can be overridden in configurations that defined\nwith a higher precedence. For example, to enable debugging, simply set `debug: true` in your `./config.yaml`\n(stored in your current working directory) - it will override the definition of `debug` as false in the base\nconfiguration.\n\nFor a list of the available configuration options, see the `config.yaml` file in the desired module.\n\n# Overwatch Executables\n\nIn addition to processing and web application, there are a number of other executables available within the\nOverwatch project. They predominately play supporting roles for those two main packages.\n\nA large number of executables are based on modules defined in `overwatch.base`. For further information, see\nthe documentation and the README in `overwatch.base`. The following executables are defined there:\n\n- `overwatchDeploy` - Handle execution of Overwatch executables in deployments. Although not recommended, it\n can also be used locally. See also [below](#overwatch-deployment)\n- `overwatchUpdateUsers` - Simple helper to update the database with the user information defined in the configuration.\n- `overwatchReceiverDataTransfer` - Transfer data received by the ZMQ and DQM receivers to other Overwatch\n sites and EOS.\n- `overwatchReplay` - Replay processed Overwatch data as if it was newly received. Allows for full trending and\n other testing of the data receiving process.\n- `overwatchReplayDataTransfer` - Replay process Overwatch data to a specified data at a high rate. It is a\n more general tool than `overwatchReplay` and is used for moving processed data via\n `overwatchReceiverDataTransfer`.\n\nThe DQM receiver is defined in `overwatch.receiver`. For further information, see the documentation and the\nREADME in `overwatch.receiver`. The following executables are defined there:\n\n- `overwatchDQMReceiver` - Receiver data from the AMORE DQM system. Usage requires coordination with the DQM project.\n- `overwatchReceiverMonitor` - Monitor the ZMQ receivers via timestamps written by the C++ executables to ensure that\n they haven't died.\n\nThe ZMQ receiver is defined in `receiver.src`. It is a small C++ code base which receives files from the HLT\nand writes them to disk. It automatically downloads and compiles a few minor AliRoot dependency classes as\nneeded, such that the only dependencies that must be install are ZMQ and ROOT. For further information, see\nthe documentation and the README in `receiver`. The following executables are defined there:\n\n- `zmqReceive` - The main executable which handles receiving QA information from the HLT.\n\n# Overwatch Deployment\n\nAll of the components of Overwatch can be configured and launched by the `overwatchDeploy` executable.\nOverwatch is intended to be deployed with a docker image. Within this image, configurations are managed by\n`supervisord`. All web apps are deployed behind `nginx`.\n\nThe Dockerfiles and additional information is available in the `docker` directory.\n\n## Configuring Deployment\n\nFor a configuration file containing all available options, see `overwatch/base/deployConfig.yaml`. Note that\nthis particular file is _not_ considered when configuring a deployment - it only considers the file that is passed\nto it.\n\n## Deployment with the docker image\n\nThe role of the image is determined by the configuration passed into the environment variable config.\nAvailable configuration options are described in the section\non [configuring Overwatch for deployment](#configuring-deployment).\n\nThe image can then be run with something like (using an external configuration file call config.yaml):\n\n```bash\n$ docker run -d -v data:/overwatch/data -e config=\"$(config.yaml)\" rehlers/overwatch\n```\n\n## Update Users in the Database\n\nThere is a simple utility to update the users in the ZODB database. It can be called via\n`overwatchUpdateUsers` (it takes no arguments). It will use the username/password values stored in the\n`config.yaml`.\n\n# Using Overwatch Data\n\nOverwatch has time-stamped, persistently stored EMCal and HLT subsystem data dating back to November 2015. The\nTPC joined around April 2016 (Note that the HLT contains some data from various subsystems, such as the V0).\nThis data is available through the end of Run 2 in December 2018, with the exception of the period between\napproximately mid-August to mid-October 2018, where some data was lost due to infrastructure issues.\n\nFor further detailed information no usage of this data, please see the [additional resources\n](#additional-resources).\n\n## Accessing the data\n\nThis data can be accessed in a few different ways:\n\n- For small data volumes, the underlying data files can be accessed directly via the Web App. Simply select\n the subsystem ROOT files from the main run list, and select the files to download.\n- For larger volumes, there are a few options:\n - The unprocessed data is also archived on EOS. It is stored in `/eos/experiment/alice/overwatch`. To access\n this data, send a request to Raymond and ALICE Offline.\n - REST API file access is also possible under certain circumstances - contact Raymond if this is needed.\n\n## Utilizing the data\n\nTo successfully use the Overwatch data, a few things must be kept in mind:\n\n- Each timestamp is in the CERN time zone. For properly handling these times, I recommend the `pendulum`\n python package. For a concrete example, see `overwatch.utilities.base.extractTimeStampFromFilename`.\n- Each data file is cumulative. To get the data received between time n and n+1, one must subtract the\n histogram, graph, or other object at time n+1 from the object at time n. From examples of and further\n information on how to do this, see `overwatch.processing.mergeFiles`.\n- The data was requested every minute, but the data is not from precisely only that minute. The HLT runs the\n QA components in a round-robin configuration through the HLT cluster. The new data that is received\n corresponds to data the components sent into the mergers within that minute. The rate at which the QA\n components send their data depends on the particular subsystem, but is often on the order of every 5\n minutes. So the precision of the data is only on the order of approximately a few minutes.\n\nIn general, Overwatch provides functionality to simplify working with this data, even if you don't want to use\nall of the overwatch processing features. A much more detailed information on how all of this is handled can\nbe found in the documentation and code in `overwatch.processing.moveFiles`.\n\n# Citation\n\nPlease cite Overwatch as:\n\n```\n@misc{raymond_ehlers_2018_1309376,\n author = {Raymond Ehlers and\n James Mulligan},\n title = {ALICE Overwatch v1.0},\n month = jul,\n year = 2018,\n doi = {10.5281/zenodo.1309376},\n url = {https://doi.org/10.5281/zenodo.1309376}\n}\n```\n\n# Additional Resources\n\n- [CHEP 2018 Presentation](https://indico.cern.ch/event/587955/contributions/2935758/)\n- [CHEP 2018 Proceedings](https://arxiv.org/abs/1812.00791)\n- [Overwatch data at ALICE QC/ML Workshop](https://indico.cern.ch/event/766450/contributions/3225214/)\n\n## Name Meaning\n\n**OVERWATCH**: **O**nline **V**isualization of **E**merging t**R**ends and **W**eb **A**ccessible de**T**ector **C**onditions using the **H**LT.\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/raymondEhlers/OVERWATCH", "keywords": "HEP ALICE", "license": "BSD 3-Clause", "maintainer": "", "maintainer_email": "", "name": "aliceoverwatch", "package_url": "https://pypi.org/project/aliceoverwatch/", "platform": "", "project_url": "https://pypi.org/project/aliceoverwatch/", "project_urls": { "Homepage": "https://github.com/raymondEhlers/OVERWATCH" }, "release_url": "https://pypi.org/project/aliceoverwatch/1.3.1/", "requires_dist": [ "aenum", "future", "pendulum", "ruamel.yaml", "numpy", "werkzeug", "flask", "Flask-Login", "Flask-Assets", "PyYAML", "Flask-RESTful", "ZODB", "zodburi", "bcrypt", "Flask-Bcrypt", "Flask-WTF", "requests", "uwsgi", "sentry-sdk[flask]", "slackclient", "flake8 ; extra == 'dev'", "sphinx ; extra == 'docs'", "recommonmark ; extra == 'docs'", "sphinx-markdown-tables ; extra == 'docs'", "pytest ; extra == 'tests'", "pytest-cov ; extra == 'tests'", "pytest-mock ; extra == 'tests'", "codecov ; extra == 'tests'" ], "requires_python": "", "summary": "ALICE OVERWATCH: Online Monitoring via the HLT", "version": "1.3.1" }, "last_serial": 4654732, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "a985fe7befaaddf3b2cbf11de5a81af1", "sha256": "ba0b3a396f6384d68ed75874142ee05eed725060152d3a76217c638244132efc" }, "downloads": -1, "filename": "aliceoverwatch-1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a985fe7befaaddf3b2cbf11de5a81af1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2709874, "upload_time": "2018-07-11T09:49:04", "url": "https://files.pythonhosted.org/packages/ff/95/eed7b365ef9eb6c216e8f7a7c4a59bbbb8873effec80b6dd01b9046db13c/aliceoverwatch-1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "74750770fcde61a811e2325f58c92464", "sha256": "472025c1c0e63008b125a9c56e988d91b3e0dd1cfcf0adf4cab63ec1fc61e2bf" }, "downloads": -1, "filename": "aliceoverwatch-1.0.tar.gz", "has_sig": false, "md5_digest": "74750770fcde61a811e2325f58c92464", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2167676, "upload_time": "2018-07-11T09:49:07", "url": "https://files.pythonhosted.org/packages/02/0c/bcc6053efdad1dae2412406212e5eaf8253fe0b854919ff98e2f7c941fce/aliceoverwatch-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "19a219841f3b7a88d0b60af97a7edc65", "sha256": "b3109de01e6873e16b084dfe5328d88dca674a7e7478bdab858d17df6446aff7" }, "downloads": -1, "filename": "aliceoverwatch-1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "19a219841f3b7a88d0b60af97a7edc65", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2752451, "upload_time": "2018-09-03T02:44:10", "url": "https://files.pythonhosted.org/packages/14/da/4e99fd88bed554b9c7e89c529e25840b62bce8537319b44c8032506e63b1/aliceoverwatch-1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9dc9b04b70f372179e9afe4866385642", "sha256": "eb4fd5a5bce7e69311a09cdf3a4670cfeb7ce5132293515b6347bb7398e9e0d3" }, "downloads": -1, "filename": "aliceoverwatch-1.1.tar.gz", "has_sig": false, "md5_digest": "9dc9b04b70f372179e9afe4866385642", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2202511, "upload_time": "2018-09-03T02:44:13", "url": "https://files.pythonhosted.org/packages/0d/a0/9b2893c46d348bf1c0df1aa96df04b76f5955b71627d22c78ac86d20e7f0/aliceoverwatch-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "d4f1213e2389a177492c49deaa79c47a", "sha256": "9bf5f4885f447b00bf7f52460ab1a45dc228f493c9457c65458b99d1523a464f" }, "downloads": -1, "filename": "aliceoverwatch-1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d4f1213e2389a177492c49deaa79c47a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2641289, "upload_time": "2018-11-12T22:30:55", "url": "https://files.pythonhosted.org/packages/dc/f3/a87823f27266071889168004862fa55405fc71521275d6e1ea6cbe37c2b2/aliceoverwatch-1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d2b691e621211f8b3351b846160a3410", "sha256": "a7f97f24e1200b7aca8c7ee32ae098d44660ebf174a5c32fc4261335ba7a04ba" }, "downloads": -1, "filename": "aliceoverwatch-1.2.tar.gz", "has_sig": false, "md5_digest": "d2b691e621211f8b3351b846160a3410", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2092530, "upload_time": "2018-11-12T22:30:58", "url": "https://files.pythonhosted.org/packages/e8/fb/4cd361d952c8a1bf18416b59bd7c1661055a597ee0bf42c4c75133fbad47/aliceoverwatch-1.2.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "834971f88c01f9850d13211343ae1192", "sha256": "b513ded6fe056fdc47a699172d3a8ad1f56c28b1420d0acf78c4a02acfbdbc93" }, "downloads": -1, "filename": "aliceoverwatch-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "834971f88c01f9850d13211343ae1192", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2641312, "upload_time": "2018-11-12T23:56:23", "url": "https://files.pythonhosted.org/packages/07/68/29a4339ab6f0cfd7fb0f7c572cdf8b5264d5bffcdb988451f3222ea5b956/aliceoverwatch-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "adea00d25fa7ad5e852d1d4b77b61cd2", "sha256": "6150db0fb3ecbc57f02dba3017896b6f35d3096022f09dde53f026a6aef3cfa6" }, "downloads": -1, "filename": "aliceoverwatch-1.2.1.tar.gz", "has_sig": false, "md5_digest": "adea00d25fa7ad5e852d1d4b77b61cd2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2094350, "upload_time": "2018-11-12T23:56:26", "url": "https://files.pythonhosted.org/packages/0a/e6/a7a2fb444bc2ab5724acbef5af32bc8eb0ff6ee08a605f1a30432286bf6b/aliceoverwatch-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "6470d0777a7330e040264b5bd3c827dd", "sha256": "c7ff4d57e2082e3bc12f208f8e5216f8a7d370bfcafd5dc902a325d006abfdc2" }, "downloads": -1, "filename": "aliceoverwatch-1.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6470d0777a7330e040264b5bd3c827dd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2641979, "upload_time": "2018-11-24T16:25:34", "url": "https://files.pythonhosted.org/packages/a7/a9/5e540e43bbadb8f0ad508037f3e35311610f9a55c61e40e5571726411f68/aliceoverwatch-1.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa24a34c03aa7008d4d34b32882c975f", "sha256": "bbb8a6cb79306a1658d9503bdb173d0d58db4f93bffeb768e2a135239637beaf" }, "downloads": -1, "filename": "aliceoverwatch-1.2.2.tar.gz", "has_sig": false, "md5_digest": "aa24a34c03aa7008d4d34b32882c975f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2095577, "upload_time": "2018-11-24T16:25:36", "url": "https://files.pythonhosted.org/packages/45/e7/722339f97fbd0166788fcf46956e7911a233c158a1f98631ee3a7c0f52f3/aliceoverwatch-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "69d2692f81287398818ac00028ab8357", "sha256": "d18ce6107a6f9ce9d7d7ffa5ad1d54d12828586780cb30ae44528b386871074f" }, "downloads": -1, "filename": "aliceoverwatch-1.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "69d2692f81287398818ac00028ab8357", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2642213, "upload_time": "2018-12-04T03:51:26", "url": "https://files.pythonhosted.org/packages/e2/b8/93d9f3c39185949c9ff37c3130110d4edcce023195853c5f8632f0de3832/aliceoverwatch-1.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eb68c814d493c75535c02d11d09e8117", "sha256": "85c5e49d41c9fe2e566c39b60b602cba07c5a3fc1a900ec969c0f6118a6459bd" }, "downloads": -1, "filename": "aliceoverwatch-1.2.3.tar.gz", "has_sig": false, "md5_digest": "eb68c814d493c75535c02d11d09e8117", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2095975, "upload_time": "2018-12-04T03:51:28", "url": "https://files.pythonhosted.org/packages/d2/cf/b713283c53f792598e834ba102308f0fd1e5dec04d7dcfd72751e908b72a/aliceoverwatch-1.2.3.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "a310e23e54209a3c886a90898b98b914", "sha256": "8b8d6fe29174618b2244af6b027fc60c61a65f8c1060cacc374e9b25a04221df" }, "downloads": -1, "filename": "aliceoverwatch-1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a310e23e54209a3c886a90898b98b914", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2661494, "upload_time": "2019-01-02T20:30:48", "url": "https://files.pythonhosted.org/packages/13/d4/a3737c411268c3c73d76c18860adf6af5696596d12c2513aaac4321ab308/aliceoverwatch-1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7150bf24a31b2e8f7e3159ee80e7434d", "sha256": "680c4f037c529a147e6c984f68e5f031b37d46605a0e4b881851ddaac5a02258" }, "downloads": -1, "filename": "aliceoverwatch-1.3.tar.gz", "has_sig": false, "md5_digest": "7150bf24a31b2e8f7e3159ee80e7434d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2097128, "upload_time": "2019-01-02T20:30:54", "url": "https://files.pythonhosted.org/packages/dd/25/9914202c3dc1eb1749800b737a3b4e502b8fcc49849d9d578fef73c40516/aliceoverwatch-1.3.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "8158f3b7ae419e02bc93b1b29c8039ca", "sha256": "1d2fdcfdf31a0dbd0aea0c11b79e838061515451da509f6926157e57eb38a080" }, "downloads": -1, "filename": "aliceoverwatch-1.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8158f3b7ae419e02bc93b1b29c8039ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2661524, "upload_time": "2019-01-03T01:25:27", "url": "https://files.pythonhosted.org/packages/b5/56/f6df33de4cdf498e95b4eef4bd99eac280d88ea66f842c9b82c6dab04cd7/aliceoverwatch-1.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f84bc2649bc5a5806430070cf4125460", "sha256": "90e645fdd56debf27e3ec4e6c0ab0c6b9128042850edb322188e7a7b424e73a8" }, "downloads": -1, "filename": "aliceoverwatch-1.3.1.tar.gz", "has_sig": false, "md5_digest": "f84bc2649bc5a5806430070cf4125460", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2101063, "upload_time": "2019-01-03T01:25:30", "url": "https://files.pythonhosted.org/packages/80/96/96727acd5832f28e1d5b81af980f95ffd1a280222a0d71b666a70cb5cdf2/aliceoverwatch-1.3.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8158f3b7ae419e02bc93b1b29c8039ca", "sha256": "1d2fdcfdf31a0dbd0aea0c11b79e838061515451da509f6926157e57eb38a080" }, "downloads": -1, "filename": "aliceoverwatch-1.3.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8158f3b7ae419e02bc93b1b29c8039ca", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 2661524, "upload_time": "2019-01-03T01:25:27", "url": "https://files.pythonhosted.org/packages/b5/56/f6df33de4cdf498e95b4eef4bd99eac280d88ea66f842c9b82c6dab04cd7/aliceoverwatch-1.3.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f84bc2649bc5a5806430070cf4125460", "sha256": "90e645fdd56debf27e3ec4e6c0ab0c6b9128042850edb322188e7a7b424e73a8" }, "downloads": -1, "filename": "aliceoverwatch-1.3.1.tar.gz", "has_sig": false, "md5_digest": "f84bc2649bc5a5806430070cf4125460", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2101063, "upload_time": "2019-01-03T01:25:30", "url": "https://files.pythonhosted.org/packages/80/96/96727acd5832f28e1d5b81af980f95ffd1a280222a0d71b666a70cb5cdf2/aliceoverwatch-1.3.1.tar.gz" } ] }