SoccerNet


NameSoccerNet JSON
Version 0.1.46 PyPI version JSON
download
home_pagehttps://github.com/SilvioGiancola/SoccerNetv2
SummarySoccerNet SDK
upload_time2023-02-06 21:53:39
maintainer
docs_urlNone
authorSilvio Giancola
requires_python
licenseMIT
keywords soccernet sdk spotting football soccer video
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # SOCCERNETV2

```bash
conda create -n SoccerNet python pip
pip install SoccerNet
```

## Structure of the data data for each game

- SoccerNet main folder
  - Leagues (england_epl/europe_uefa-champions-league/france_ligue-1/...)
    - Seasons (2014-2015/2015-2016/2016-2017)
      - Games (format: "{Date} - {Time} - {HomeTeam} {Score} {AwayTeam}")
        - SoccerNet-v2 - Labels / Manual Annotations
          - **video.ini**: information on start/duration for each half of the game in the HQ video, in second
          - **Labels-v2.json**: Labels from SoccerNet-v2 - action spotting
          - **Labels-cameras.json**: Labels from SoccerNet-v1 - camera shot segmentation

        - SoccerNet-v2 - Videos / Automatically Extracted Features
          - **1_224p.mkv**: 224p video 1st half - timmed with start/duration from HQ video - resolution 224*398 - 25 fps
          - **2_224p.mkv**: 224p video 2nd half - timmed with start/duration from HQ video - resolution 224*398 - 25 fps
          - **1_720p.mkv**: 720p video 1st half - timmed with start/duration from HQ video - resolution 720*1280 - 25 fps
          - **2_720p.mkv**: 720p video 2nd half - timmed with start/duration from HQ video - resolution 720*1280 - 25 fps
          - **1_ResNET_TF2.npy**: ResNET features @2fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)
          - **2_ResNET_TF2.npy**: ResNET features @2fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)
          - **1_ResNET_TF2_PCA512.npy**: ResNET features @2fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA
          - **2_ResNET_TF2_PCA512.npy**: ResNET features @2fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA
          - **1_ResNET_5fps_TF2.npy**: ResNET features @5fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)
          - **2_ResNET_5fps_TF2.npy**: ResNET features @5fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)
          - **1_ResNET_5fps_TF2_PCA512.npy**: ResNET features @5fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA
          - **2_ResNET_5fps_TF2_PCA512.npy**: ResNET features @5fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA
          - **1_ResNET_25fps_TF2.npy**: ResNET features @25fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)
          - **2_ResNET_25fps_TF2.npy**: ResNET features @25fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)
          - **1_player_boundingbox_maskrcnn.json**: Player Bounding Boxes @2fps for 1st half, extracted with MaskRCNN
          - **2_player_boundingbox_maskrcnn.json**: Player Bounding Boxes @2fps for 2nd half, extracted with MaskRCNN
          - **1_field_calib_ccbv.json**: Field Camera Calibration @2fps for 1st half, extracted with CCBV
          - **2_field_calib_ccbv.json**: Field Camera Calibration @2fps for 2nd half, extracted with CCBV
          - **1_baidu_soccer_embeddings.npy**: Frame Embeddings for 1st half from [https://github.com/baidu-research/vidpress-sports](https://github.com/baidu-research/vidpress-sports)
          - **2_baidu_soccer_embeddings.npy**: Frame Embeddings for 2nd half from [https://github.com/baidu-research/vidpress-sports](https://github.com/baidu-research/vidpress-sports)

        - Legacy from SoccerNet-v1
          - **Labels.json**: Labels from SoccerNet-v1 - action spotting for goals/cards/subs only
          - **1_C3D.npy**: C3D features @2fps for 1st half from SoccerNet-v1
          - **2_C3D.npy**: C3D features @2fps for 2nd half from SoccerNet-v1
          - **1_C3D_PCA512.npy**: C3D features @2fps for 1st half from SoccerNet-v1, with dimensionality reduced to 512 using PCA
          - **2_C3D_PCA512.npy**: C3D features @2fps for 2nd half from SoccerNet-v1, with dimensionality reduced to 512 using PCA
          - **1_I3D.npy**: I3D features @2fps for 1st half from SoccerNet-v1
          - **2_I3D.npy**: I3D features @2fps for 2nd half from SoccerNet-v1
          - **1_I3D_PCA512.npy**: I3D features @2fps for 1st half from SoccerNet-v1, with dimensionality reduced to 512 using PCA
          - **2_I3D_PCA512.npy**: I3D features @2fps for 2nd half from SoccerNet-v1, with dimensionality reduced to 512 using PCA
          - **1_ResNET.npy**: ResNET features @2fps for 1st half from SoccerNet-v1
          - **2_ResNET.npy**: ResNET features @2fps for 2nd half from SoccerNet-v1
          - **1_ResNET_PCA512.npy**: ResNET features @2fps for 1st half from SoccerNet-v1, with dimensionality reduced to 512 using PCA
          - **2_ResNET_PCA512.npy**: ResNET features @2fps for 2nd half from SoccerNet-v1, with dimensionality reduced to 512 using PCA


## How to Download Games (Python)

```python
from SoccerNet.Downloader import SoccerNetDownloader

mySoccerNetDownloader = SoccerNetDownloader(LocalDirectory="path/to/soccernet")

# Download SoccerNet labels
mySoccerNetDownloader.downloadGames(files=["Labels.json"], split=["train","valid","test"]) # download labels
mySoccerNetDownloader.downloadGames(files=["Labels-v2.json"], split=["train","valid","test"]) # download labels SN v2
mySoccerNetDownloader.downloadGames(files=["Labels-cameras.json"], split=["train","valid","test"]) # download labels for camera shot

# Download SoccerNet features
mySoccerNetDownloader.downloadGames(files=["1_ResNET_TF2.npy", "2_ResNET_TF2.npy"], split=["train","valid","test"]) # download Features
mySoccerNetDownloader.downloadGames(files=["1_ResNET_TF2_PCA512.npy", "2_ResNET_TF2_PCA512.npy"], split=["train","valid","test"]) # download Features reduced with PCA
mySoccerNetDownloader.downloadGames(files=["1_player_boundingbox_maskrcnn.json", "2_player_boundingbox_maskrcnn.json"], split=["train","valid","test"]) # download Player Bounding Boxes inferred with MaskRCNN
mySoccerNetDownloader.downloadGames(files=["1_field_calib_ccbv.json", "2_field_calib_ccbv.json"], split=["train","valid","test"]) # download Field Calibration inferred with CCBV
mySoccerNetDownloader.downloadGames(files=["1_baidu_soccer_embeddings.npy","2_baidu_soccer_embeddings.npy"], split=["train","valid","test"]) # download Frame Embeddings from https://github.com/baidu-research/vidpress-sports

# Download SoccerNet videos (require password from NDA to download videos)
mySoccerNetDownloader.password = input("Password for videos? (contact the author):\n")
mySoccerNetDownloader.downloadGames(files=["1_224p.mkv", "2_224p.mkv"], split=["train","valid","test"]) # download 224p Videos
mySoccerNetDownloader.downloadGames(files=["1_720p.mkv", "2_720p.mkv"], split=["train","valid","test"]) # download 720p Videos 

# Download SoccerNet Challenge set (require password from NDA to download videos)
mySoccerNetDownloader.downloadGames(files=["1_ResNET_TF2.npy", "2_ResNET_TF2.npy"], split=["challenge"]) # download ResNET Features
mySoccerNetDownloader.downloadGames(files=["1_ResNET_TF2_PCA512.npy", "2_ResNET_TF2_PCA512.npy"], split=["challenge"]) # download ResNET Features reduced with PCA
mySoccerNetDownloader.downloadGames(files=["1_224p.mkv", "2_224p.mkv"], split=["challenge"]) # download 224p Videos (require password from NDA)
mySoccerNetDownloader.downloadGames(files=["1_720p.mkv", "2_720p.mkv"], split=["challenge"]) # download 720p Videos (require password from NDA)
mySoccerNetDownloader.downloadGames(files=["1_player_boundingbox_maskrcnn.json", "2_player_boundingbox_maskrcnn.json"], split=["challenge"]) # download Player Bounding Boxes inferred with MaskRCNN 
mySoccerNetDownloader.downloadGames(files=["1_field_calib_ccbv.json", "2_field_calib_ccbv.json"], split=["challenge"]) # download Field Calibration inferred with CCBV 
mySoccerNetDownloader.downloadGames(files=["1_baidu_soccer_embeddings.npy","2_baidu_soccer_embeddings.npy"], split=["challenge"]) # download Frame Embeddings from https://github.com/baidu-research/vidpress-sports

```

## How to read the list Games (Python)

```python
from SoccerNet.utils import getListGames
print(getListGames(split="train")) # return list of games recommended for training
print(getListGames(split="valid")) # return list of games recommended for validation
print(getListGames(split="test")) # return list of games recommended for testing
print(getListGames(split="challenge")) # return list of games recommended for challenge
print(getListGames(split=["train", "valid", "test", "challenge"])) # return list of games for training, validation and testing
print(getListGames(split="v1")) # return list of games from SoccerNetv1 (train/valid/test)
```



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/SilvioGiancola/SoccerNetv2",
    "name": "SoccerNet",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "SoccerNet,SDK,Spotting,Football,Soccer,Video",
    "author": "Silvio Giancola",
    "author_email": "silvio.giancola@kaust.edu.sa",
    "download_url": "https://files.pythonhosted.org/packages/2d/04/3845b296e379c79fc2daa6d28563c82cd46c9ca84606086cfdbe9704f130/SoccerNet-0.1.46.tar.gz",
    "platform": null,
    "description": "# SOCCERNETV2\n\n```bash\nconda create -n SoccerNet python pip\npip install SoccerNet\n```\n\n## Structure of the data data for each game\n\n- SoccerNet main folder\n  - Leagues (england_epl/europe_uefa-champions-league/france_ligue-1/...)\n    - Seasons (2014-2015/2015-2016/2016-2017)\n      - Games (format: \"{Date} - {Time} - {HomeTeam} {Score} {AwayTeam}\")\n        - SoccerNet-v2 - Labels / Manual Annotations\n          - **video.ini**: information on start/duration for each half of the game in the HQ video, in second\n          - **Labels-v2.json**: Labels from SoccerNet-v2 - action spotting\n          - **Labels-cameras.json**: Labels from SoccerNet-v1 - camera shot segmentation\n\n        - SoccerNet-v2 - Videos / Automatically Extracted Features\n          - **1_224p.mkv**: 224p video 1st half - timmed with start/duration from HQ video - resolution 224*398 - 25 fps\n          - **2_224p.mkv**: 224p video 2nd half - timmed with start/duration from HQ video - resolution 224*398 - 25 fps\n          - **1_720p.mkv**: 720p video 1st half - timmed with start/duration from HQ video - resolution 720*1280 - 25 fps\n          - **2_720p.mkv**: 720p video 2nd half - timmed with start/duration from HQ video - resolution 720*1280 - 25 fps\n          - **1_ResNET_TF2.npy**: ResNET features @2fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)\n          - **2_ResNET_TF2.npy**: ResNET features @2fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)\n          - **1_ResNET_TF2_PCA512.npy**: ResNET features @2fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA\n          - **2_ResNET_TF2_PCA512.npy**: ResNET features @2fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA\n          - **1_ResNET_5fps_TF2.npy**: ResNET features @5fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)\n          - **2_ResNET_5fps_TF2.npy**: ResNET features @5fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)\n          - **1_ResNET_5fps_TF2_PCA512.npy**: ResNET features @5fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA\n          - **2_ResNET_5fps_TF2_PCA512.npy**: ResNET features @5fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit), with dimensionality reduced to 512 using PCA\n          - **1_ResNET_25fps_TF2.npy**: ResNET features @25fps for 1st half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)\n          - **2_ResNET_25fps_TF2.npy**: ResNET features @25fps for 2nd half from SoccerNet-v2, [extracted using TF2](https://github.com/SilvioGiancola/SoccerNetv2-DevKit)\n          - **1_player_boundingbox_maskrcnn.json**: Player Bounding Boxes @2fps for 1st half, extracted with MaskRCNN\n          - **2_player_boundingbox_maskrcnn.json**: Player Bounding Boxes @2fps for 2nd half, extracted with MaskRCNN\n          - **1_field_calib_ccbv.json**: Field Camera Calibration @2fps for 1st half, extracted with CCBV\n          - **2_field_calib_ccbv.json**: Field Camera Calibration @2fps for 2nd half, extracted with CCBV\n          - **1_baidu_soccer_embeddings.npy**: Frame Embeddings for 1st half from [https://github.com/baidu-research/vidpress-sports](https://github.com/baidu-research/vidpress-sports)\n          - **2_baidu_soccer_embeddings.npy**: Frame Embeddings for 2nd half from [https://github.com/baidu-research/vidpress-sports](https://github.com/baidu-research/vidpress-sports)\n\n        - Legacy from SoccerNet-v1\n          - **Labels.json**: Labels from SoccerNet-v1 - action spotting for goals/cards/subs only\n          - **1_C3D.npy**: C3D features @2fps for 1st half from SoccerNet-v1\n          - **2_C3D.npy**: C3D features @2fps for 2nd half from SoccerNet-v1\n          - **1_C3D_PCA512.npy**: C3D features @2fps for 1st half from SoccerNet-v1, with dimensionality reduced to 512 using PCA\n          - **2_C3D_PCA512.npy**: C3D features @2fps for 2nd half from SoccerNet-v1, with dimensionality reduced to 512 using PCA\n          - **1_I3D.npy**: I3D features @2fps for 1st half from SoccerNet-v1\n          - **2_I3D.npy**: I3D features @2fps for 2nd half from SoccerNet-v1\n          - **1_I3D_PCA512.npy**: I3D features @2fps for 1st half from SoccerNet-v1, with dimensionality reduced to 512 using PCA\n          - **2_I3D_PCA512.npy**: I3D features @2fps for 2nd half from SoccerNet-v1, with dimensionality reduced to 512 using PCA\n          - **1_ResNET.npy**: ResNET features @2fps for 1st half from SoccerNet-v1\n          - **2_ResNET.npy**: ResNET features @2fps for 2nd half from SoccerNet-v1\n          - **1_ResNET_PCA512.npy**: ResNET features @2fps for 1st half from SoccerNet-v1, with dimensionality reduced to 512 using PCA\n          - **2_ResNET_PCA512.npy**: ResNET features @2fps for 2nd half from SoccerNet-v1, with dimensionality reduced to 512 using PCA\n\n\n## How to Download Games (Python)\n\n```python\nfrom SoccerNet.Downloader import SoccerNetDownloader\n\nmySoccerNetDownloader = SoccerNetDownloader(LocalDirectory=\"path/to/soccernet\")\n\n# Download SoccerNet labels\nmySoccerNetDownloader.downloadGames(files=[\"Labels.json\"], split=[\"train\",\"valid\",\"test\"]) # download labels\nmySoccerNetDownloader.downloadGames(files=[\"Labels-v2.json\"], split=[\"train\",\"valid\",\"test\"]) # download labels SN v2\nmySoccerNetDownloader.downloadGames(files=[\"Labels-cameras.json\"], split=[\"train\",\"valid\",\"test\"]) # download labels for camera shot\n\n# Download SoccerNet features\nmySoccerNetDownloader.downloadGames(files=[\"1_ResNET_TF2.npy\", \"2_ResNET_TF2.npy\"], split=[\"train\",\"valid\",\"test\"]) # download Features\nmySoccerNetDownloader.downloadGames(files=[\"1_ResNET_TF2_PCA512.npy\", \"2_ResNET_TF2_PCA512.npy\"], split=[\"train\",\"valid\",\"test\"]) # download Features reduced with PCA\nmySoccerNetDownloader.downloadGames(files=[\"1_player_boundingbox_maskrcnn.json\", \"2_player_boundingbox_maskrcnn.json\"], split=[\"train\",\"valid\",\"test\"]) # download Player Bounding Boxes inferred with MaskRCNN\nmySoccerNetDownloader.downloadGames(files=[\"1_field_calib_ccbv.json\", \"2_field_calib_ccbv.json\"], split=[\"train\",\"valid\",\"test\"]) # download Field Calibration inferred with CCBV\nmySoccerNetDownloader.downloadGames(files=[\"1_baidu_soccer_embeddings.npy\",\"2_baidu_soccer_embeddings.npy\"], split=[\"train\",\"valid\",\"test\"]) # download Frame Embeddings from https://github.com/baidu-research/vidpress-sports\n\n# Download SoccerNet videos (require password from NDA to download videos)\nmySoccerNetDownloader.password = input(\"Password for videos? (contact the author):\\n\")\nmySoccerNetDownloader.downloadGames(files=[\"1_224p.mkv\", \"2_224p.mkv\"], split=[\"train\",\"valid\",\"test\"]) # download 224p Videos\nmySoccerNetDownloader.downloadGames(files=[\"1_720p.mkv\", \"2_720p.mkv\"], split=[\"train\",\"valid\",\"test\"]) # download 720p Videos \n\n# Download SoccerNet Challenge set (require password from NDA to download videos)\nmySoccerNetDownloader.downloadGames(files=[\"1_ResNET_TF2.npy\", \"2_ResNET_TF2.npy\"], split=[\"challenge\"]) # download ResNET Features\nmySoccerNetDownloader.downloadGames(files=[\"1_ResNET_TF2_PCA512.npy\", \"2_ResNET_TF2_PCA512.npy\"], split=[\"challenge\"]) # download ResNET Features reduced with PCA\nmySoccerNetDownloader.downloadGames(files=[\"1_224p.mkv\", \"2_224p.mkv\"], split=[\"challenge\"]) # download 224p Videos (require password from NDA)\nmySoccerNetDownloader.downloadGames(files=[\"1_720p.mkv\", \"2_720p.mkv\"], split=[\"challenge\"]) # download 720p Videos (require password from NDA)\nmySoccerNetDownloader.downloadGames(files=[\"1_player_boundingbox_maskrcnn.json\", \"2_player_boundingbox_maskrcnn.json\"], split=[\"challenge\"]) # download Player Bounding Boxes inferred with MaskRCNN \nmySoccerNetDownloader.downloadGames(files=[\"1_field_calib_ccbv.json\", \"2_field_calib_ccbv.json\"], split=[\"challenge\"]) # download Field Calibration inferred with CCBV \nmySoccerNetDownloader.downloadGames(files=[\"1_baidu_soccer_embeddings.npy\",\"2_baidu_soccer_embeddings.npy\"], split=[\"challenge\"]) # download Frame Embeddings from https://github.com/baidu-research/vidpress-sports\n\n```\n\n## How to read the list Games (Python)\n\n```python\nfrom SoccerNet.utils import getListGames\nprint(getListGames(split=\"train\")) # return list of games recommended for training\nprint(getListGames(split=\"valid\")) # return list of games recommended for validation\nprint(getListGames(split=\"test\")) # return list of games recommended for testing\nprint(getListGames(split=\"challenge\")) # return list of games recommended for challenge\nprint(getListGames(split=[\"train\", \"valid\", \"test\", \"challenge\"])) # return list of games for training, validation and testing\nprint(getListGames(split=\"v1\")) # return list of games from SoccerNetv1 (train/valid/test)\n```\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "SoccerNet SDK",
    "version": "0.1.46",
    "split_keywords": [
        "soccernet",
        "sdk",
        "spotting",
        "football",
        "soccer",
        "video"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e5f37622e25c613cc9e717de23a27cc15a575ee5c21400c0f01f4d549968a427",
                "md5": "b5bee481aec962751f89990c27b43faa",
                "sha256": "6129d14961800e8c9e9eec2f8d3595380c9afe51c0acac09c95eea2c407e6c05"
            },
            "downloads": -1,
            "filename": "SoccerNet-0.1.46-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b5bee481aec962751f89990c27b43faa",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 79395,
            "upload_time": "2023-02-06T21:53:37",
            "upload_time_iso_8601": "2023-02-06T21:53:37.508357Z",
            "url": "https://files.pythonhosted.org/packages/e5/f3/7622e25c613cc9e717de23a27cc15a575ee5c21400c0f01f4d549968a427/SoccerNet-0.1.46-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2d043845b296e379c79fc2daa6d28563c82cd46c9ca84606086cfdbe9704f130",
                "md5": "ffa1187758a87134bca9ba6d5ebfcb68",
                "sha256": "1fd1ea7437a65da70a9c9432b4272dcba8ab085f8e48d784e781d41e39598349"
            },
            "downloads": -1,
            "filename": "SoccerNet-0.1.46.tar.gz",
            "has_sig": false,
            "md5_digest": "ffa1187758a87134bca9ba6d5ebfcb68",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 63457,
            "upload_time": "2023-02-06T21:53:39",
            "upload_time_iso_8601": "2023-02-06T21:53:39.494945Z",
            "url": "https://files.pythonhosted.org/packages/2d/04/3845b296e379c79fc2daa6d28563c82cd46c9ca84606086cfdbe9704f130/SoccerNet-0.1.46.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-02-06 21:53:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "SilvioGiancola",
    "github_project": "SoccerNetv2",
    "lcname": "soccernet"
}
        
Elapsed time: 0.08289s