├── mergechance
├── __init__.py
├── test
│ ├── __init__.py
│ └── test_analysis.py
├── data_export.py
├── db.py
├── templates
│ ├── index.html
│ └── chance.html
├── gh_gql.py
├── main.py
├── analysis.py
└── blacklist.py
├── .gitignore
├── requirements.txt
├── first_config.sh
├── scripts
├── batch.sh
├── README.md
├── score.py
├── requirements.txt
├── gh-rest-api
│ └── get_pr_data.py
└── get_pr_gql.py
├── Dockerfile
├── README.md
└── LICENSE
/mergechance/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mergechance/test/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__
2 | .env
3 | envs
4 | secrets
5 | .ipynb_checkpoints
6 | .DS_STORE
7 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | Flask==1.1.2
2 | gunicorn==20.0.4
3 | requests==2.24.0
4 | firebase-admin==4.5.0
5 | python-dateutil==2.8.1
6 |
--------------------------------------------------------------------------------
/first_config.sh:
--------------------------------------------------------------------------------
1 | gcloud config set project $GCP_PROJECT
2 | gcloud config set run/region $GCP_REGION
3 | gcloud config set run/platform managed
4 |
--------------------------------------------------------------------------------
/scripts/batch.sh:
--------------------------------------------------------------------------------
1 | # pass a file with one org/repo per line (in a format as the get_pr_gql.py expects)
2 | cat $1 | tr '\n' '\0' | xargs -0 -n1 python get_pr_gql.py
3 | CSV_DIR="$1_prs"
4 | OUTSIDERS_DIR="$1_prs_outsiders"
5 | ALL_DIR="$1_prs_all"
6 | mkdir -p $CSV_DIR
7 | mkdir -p $OUTSIDERS_DIR
8 | mkdir -p $ALL_DIR
9 | mv *csv "$CSV_DIR"/
10 | for f in $(ls $CSV_DIR)
11 | do
12 | python score.py $CSV_DIR/$f --outsiders
13 | mv *png "$OUTSIDERS_DIR/"
14 | python score.py "$CSV_DIR/$f"
15 | mv *png "$ALL_DIR/"
16 | done
17 |
--------------------------------------------------------------------------------
/mergechance/data_export.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | from typing import List
4 | from typing import List
5 | from mergechance.analysis import ANALYSIS_FIELDS
6 |
7 |
8 | def prep_tsv(prs:List) -> str:
9 | """Create a tsv content with pr data."""
10 | rows = [
11 | ['author'] + ANALYSIS_FIELDS,
12 | ]
13 | for pr in prs:
14 | author_login = pr['author']['login'] if pr['author'] else ''
15 | row = [author_login]
16 | fields = [str(pr.get(field, '')) for field in ANALYSIS_FIELDS]
17 | row.extend(fields)
18 | rows.append(row)
19 | lines = ["\t".join(row) for row in rows]
20 | return "\n".join(lines)
21 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Use the official Python image.
2 | # https://hub.docker.com/_/python
3 | FROM python:3.8
4 |
5 | # Allow statements and log messages to immediately appear in the Cloud Run logs
6 | ENV PYTHONUNBUFFERED True
7 |
8 | # Copy application dependency manifests to the container image.
9 | # Copying this separately prevents re-running pip install on every code change.
10 | COPY requirements.txt ./
11 |
12 | # Install production dependencies.
13 | RUN pip install -r requirements.txt
14 |
15 | # Copy local code to the container image.
16 | ENV APP_HOME /app
17 | WORKDIR $APP_HOME
18 | COPY . ./
19 |
20 | # Run the web service on container startup.
21 | # Use gunicorn webserver with one worker process and 8 threads.
22 | # For environments with multiple CPU cores, increase the number of workers
23 | # to be equal to the cores available.
24 | CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 mergechance.main:app
25 |
--------------------------------------------------------------------------------
/scripts/README.md:
--------------------------------------------------------------------------------
1 | # How Likely Is Your OSS Contribution to Succeed
2 |
3 | __Check Merge Chance for a public GitHub Repo [here](https://merge-chance.info)__
4 |
5 | Or use `get_pr_gql.py` script from this repo for more control and data.
6 |
7 | Requires python 3.6+
8 | Prepare a venv
9 | ```shell
10 | python -m venv .env
11 | source .env/bin/activate
12 | pip install -r requirements.txt
13 | ```
14 | You will need a GitHub token, [instructions](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token).
15 |
16 | run the script
17 | ```shell
18 | GH_TOKEN=YOUR_GH_TOKEN python get_pr_gql.py ORG/REPO
19 | ```
20 | Make a score plot
21 | ```shell
22 | python score.py org_repo.csv
23 | ```
24 | or if you want to plot only outsider contributions (author affiliation other than MEMBER or OWNER) do:
25 | ```shell
26 | python score.py org_repo.csv --outsiders
27 | ```
28 | ## What is in the other directories?
29 | - `web` merge-chance.info code
30 | - `exploration` contains a simple analysis of one repository
31 | - `gh-rest-api` contains my old script for fetching the same data with REST-api (slooow)
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # merge-chance.info code
2 | This is repo for the [merge-chance](https://merge-chance.info), page where you can checks success rate for your favorite open-source project on GitHub.
3 |
4 | _if you just want to make some plots for given repo locally, use scripts from the `scripts` dir._
5 |
6 | ## Build & Setup
7 |
8 | You will need a GitHub token, in order to extract data from GitHub [instructions](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token).
9 |
10 | First setup a google cloud project and set following env vars:
11 | ```shell
12 | export GCP_PROJECT=YOUR_PROJECT
13 | export GCP_REGION=DESIRED_REGION
14 | export GH_TOKEN=YOUR_GITHUB_TOKEN
15 | ```
16 | Then create a service account with admin rights to your project's firestore. Save the json key to this service account as `key.json` in current dir.
17 | Run the app locally with
18 | ```shell
19 | gunicorn --bind :8080 --workers 1 --threads 8 --timeout 0 mergechance.main:app
20 | ```
21 | Before first deploy to GCP run
22 | ```shell
23 | ./first_config.sh
24 | ```
25 | in order to deploy it as a Cloud Run service on your GCP project run
26 | ```shell
27 | ./build.sh
28 | ```
29 | This will build the container with Cloud Build and deploy it.
30 |
--------------------------------------------------------------------------------
/scripts/score.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import os
3 | import pandas as pd
4 | import seaborn as sns
5 |
6 | STALE_THRESHOLD = 90 * 24 * 60 * 60 # 90 days in seconds
7 |
8 | if len(sys.argv) < 2:
9 | print("Path to a csv required as the first argument")
10 | sys.exit(1)
11 | OUTSIDER_ONLY = False
12 | if len(sys.argv) == 3:
13 | OUTSIDER_ONLY = sys.argv[2] == "--outsiders"
14 |
15 | path = sys.argv[1]
16 | data = pd.read_csv(path)
17 |
18 | if OUTSIDER_ONLY:
19 | data = data.drop(data[data['author'] == "MEMBER"].index)
20 | data = data.drop(data[data['author'] == "OWNER"].index)
21 |
22 | def is_stale(created, extracted):
23 | return (extracted - created) > STALE_THRESHOLD
24 |
25 |
26 | def classify_pr(pr_stats):
27 | if pr_stats["state"] == "MERGED":
28 | return "Successful"
29 | elif pr_stats["state"] == "CLOSED":
30 | return "Rejected"
31 | elif pr_stats["state"] == "OPEN" and is_stale(
32 | pr_stats["created_at"], pr_stats["extracted_at"]
33 | ):
34 | return "Stale"
35 | else:
36 | return "Active"
37 |
38 |
39 | pr_class = data.apply(classify_pr, axis=1)
40 | data = data.assign(PR=pr_class)
41 | plot_order = ["Successful", "Rejected", "Stale", "Active"]
42 | plot = sns.countplot(
43 | data=data, x="PR", palette="colorblind", order=plot_order
44 | ).get_figure()
45 |
46 | repo_name = os.path.basename(path)
47 | if repo_name.endswith(".csv"):
48 | repo_name = repo_name[:-4]
49 | plot.savefig(f"{repo_name}.png")
50 |
--------------------------------------------------------------------------------
/scripts/requirements.txt:
--------------------------------------------------------------------------------
1 | appdirs==1.4.4
2 | appnope==0.1.2
3 | argon2-cffi==20.1.0
4 | async-generator==1.10
5 | attrs==20.3.0
6 | backcall==0.2.0
7 | black==20.8b1
8 | bleach==3.2.1
9 | certifi==2020.12.5
10 | cffi==1.14.4
11 | chardet==3.0.4
12 | click==7.1.2
13 | cycler==0.10.0
14 | decorator==4.4.2
15 | defusedxml==0.6.0
16 | Deprecated==1.2.10
17 | entrypoints==0.3
18 | idna==2.10
19 | ipykernel==5.4.2
20 | ipython==7.19.0
21 | ipython-genutils==0.2.0
22 | ipywidgets==7.5.1
23 | jedi==0.17.2
24 | Jinja2==2.11.2
25 | jsonschema==3.2.0
26 | jupyter==1.0.0
27 | jupyter-client==6.1.7
28 | jupyter-console==6.2.0
29 | jupyter-core==4.7.0
30 | jupyterlab-pygments==0.1.2
31 | kiwisolver==1.3.1
32 | MarkupSafe==1.1.1
33 | matplotlib==3.3.3
34 | mistune==0.8.4
35 | mypy-extensions==0.4.3
36 | nbclient==0.5.1
37 | nbconvert==6.0.7
38 | nbformat==5.0.8
39 | nest-asyncio==1.4.3
40 | notebook==6.1.5
41 | numpy==1.19.4
42 | packaging==20.8
43 | pandas==1.1.5
44 | pandocfilters==1.4.3
45 | parso==0.7.1
46 | pathspec==0.8.1
47 | pexpect==4.8.0
48 | pickleshare==0.7.5
49 | Pillow==8.0.1
50 | prometheus-client==0.9.0
51 | prompt-toolkit==3.0.8
52 | ptyprocess==0.6.0
53 | pycparser==2.20
54 | PyGithub==1.54
55 | Pygments==2.7.3
56 | PyJWT==1.7.1
57 | pyparsing==2.4.7
58 | pyrsistent==0.17.3
59 | python-dateutil==2.8.1
60 | pytz==2020.4
61 | pyzmq==20.0.0
62 | qtconsole==5.0.1
63 | QtPy==1.9.0
64 | regex==2020.11.13
65 | requests==2.24.0
66 | scipy==1.5.4
67 | seaborn==0.11.0
68 | Send2Trash==1.5.0
69 | six==1.15.0
70 | terminado==0.9.1
71 | testpath==0.4.4
72 | toml==0.10.2
73 | tornado==6.1
74 | traitlets==5.0.5
75 | typed-ast==1.4.1
76 | typing-extensions==3.7.4.3
77 | urllib3==1.25.11
78 | wcwidth==0.2.5
79 | webencodings==0.5.1
80 | widgetsnbextension==3.5.1
81 | wrapt==1.12.1
82 |
--------------------------------------------------------------------------------
/mergechance/db.py:
--------------------------------------------------------------------------------
1 | import time
2 | from firebase_admin import credentials, firestore, initialize_app
3 | import logging
4 |
5 |
6 | TTL = 24 * 60 * 60 # A day in seconds
7 |
8 | # Initialize Firestore DB
9 | cred = credentials.Certificate("key.json")
10 | default_app = initialize_app(cred)
11 | db = firestore.client()
12 | cache_ref = db.collection("cache")
13 |
14 | log = logging.getLogger(__name__)
15 |
16 |
17 | def autocomplete_list() -> list:
18 | """return list of last used repos."""
19 | data = (
20 | cache_ref.order_by("ts", direction=firestore.Query.DESCENDING).limit(500).get()
21 | )
22 | repo_names = [repo.to_dict()["name"] for repo in data]
23 | return repo_names
24 |
25 |
26 | def escape_fb_key(repo_target):
27 | """GitHub repos contain '/' which is a path delimiter in firestore."""
28 | return repo_target.replace("/", "_")
29 |
30 |
31 | def get_from_cache(repo):
32 | repo = escape_fb_key(repo)
33 | try:
34 | cached = cache_ref.document(repo).get().to_dict()
35 | if not cached:
36 | return None
37 | median = cached.get("median")
38 | if not median:
39 | return None
40 | age = time.time() - cached["ts"]
41 | if age < TTL:
42 | return cached.get("chance"), median, cached.get("total"), cached.get("prs", [])
43 | return None
44 | except Exception as e:
45 | log.critical(f"An error occured ruing retrieving cache: {e}")
46 |
47 |
48 | def cache(repo, chance, median, total, prs):
49 | escaped_repo = escape_fb_key(repo)
50 | try:
51 | ts = time.time()
52 | cache_ref.document(escaped_repo).set(
53 | {"chance": chance, "ts": ts, "name": repo, "total": total, "median": median, "prs": prs}
54 | )
55 | except Exception as e:
56 | log.critical(f"An error occured during caching: {e}")
57 |
--------------------------------------------------------------------------------
/mergechance/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Merge Chance
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
Will your PR get merged?
15 |
16 |
17 |
21 |
22 |
23 |
(case-insensitive)
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
38 |
39 |
40 |
41 |
64 |
65 |
--------------------------------------------------------------------------------
/mergechance/gh_gql.py:
--------------------------------------------------------------------------------
1 | """Module for handling GitHub's GraphQL API."""
2 | from typing import List
3 | import os
4 | import logging
5 | import requests as rq
6 |
7 | log = logging.getLogger(__name__)
8 |
9 | TOKEN = os.getenv("GH_TOKEN")
10 | STEP_SIZE = 100 # 100 is Max
11 | GH_GQL_URL = "https://api.github.com/graphql"
12 |
13 |
14 | def get_pr_fields(org: str, repo: str, fields: List[str], page_cap=1, cursor=None) -> tuple:
15 | """Get specified GitHub PR fields.
16 |
17 | org - GitHub organization/users
18 | repo - GitHub repository
19 | fields - list of PR edge fields (See GitHub GraphQL docs)
20 | page_cap - how many pages (each 100 records) to fetch
21 | start_at - graphQl cursor to resume previous query
22 | """
23 | pages = 0
24 | has_next = True
25 | rows = []
26 | while has_next and pages < page_cap:
27 | result = _paginated_query(org, repo, cursor, fields)
28 | rows.extend(_to_rows(result))
29 | page_info = result["data"]["repository"]["pullRequests"]["pageInfo"]
30 | has_next = page_info["hasPreviousPage"]
31 | cursor = page_info["startCursor"]
32 | pages += 1
33 | return rows, cursor
34 |
35 |
36 | def _to_rows(result: dict):
37 | rows = []
38 | for edge in result["data"]["repository"]["pullRequests"]["edges"]:
39 | rows.append(edge["node"])
40 | return rows
41 |
42 |
43 | def _paginated_query(owner, repo, cursor, fields):
44 | fields = "\n".join(fields)
45 | cursor_part = f', before: "{cursor}"' if cursor else ""
46 | data = {
47 | "query": """
48 | query {
49 | repository(owner:"%s", name:"%s") {
50 | pullRequests(last: %s %s) {
51 | pageInfo {
52 | hasPreviousPage
53 | startCursor
54 | }
55 | edges {
56 | cursor
57 | node {
58 | timelineItems(last: 1 , itemTypes: CLOSED_EVENT) {
59 | edges {
60 | node {
61 | ... on ClosedEvent {
62 | actor{
63 | login
64 | }
65 | }
66 | }
67 | }
68 | }
69 | author {
70 | login
71 | }
72 | %s
73 | }
74 | }
75 | }
76 | }
77 | }
78 | """
79 | % (owner, repo, STEP_SIZE, cursor_part, fields)
80 | }
81 | return _gql_request(data)
82 |
83 |
84 | def _gql_request(data):
85 | headers = {"Authorization": f"bearer {TOKEN}"}
86 | res = rq.post(GH_GQL_URL, headers=headers, json=data)
87 | data = res.json()
88 | if "errors" in data:
89 | errs = data["errors"]
90 | log.critical(f"Failed GQL query with {errs}")
91 | raise GQLError()
92 | return data
93 |
94 |
95 | class GQLError(Exception):
96 | pass
97 |
--------------------------------------------------------------------------------
/scripts/gh-rest-api/get_pr_data.py:
--------------------------------------------------------------------------------
1 | from github import Github, PaginatedList
2 | from github.GithubException import RateLimitExceededException
3 | import os
4 | import sys
5 | import time
6 | from datetime import datetime
7 |
8 |
9 | TOKEN = os.getenv("GH_TOKEN")
10 | # REPORT_PROGRESS controls after how many PRs % of totall processed will be printed out
11 | REPORT_PROGRESS = 25
12 |
13 | def main():
14 | if not TOKEN:
15 | print("You need to set GH_TOKEN env var")
16 | sys.exit(1)
17 | if len(sys.argv) < 2:
18 | print(
19 | "Pass github repo name as first position argument.\n 'facebook/react' for example"
20 | )
21 | sys.exit(1)
22 |
23 | g = Github(TOKEN)
24 | target_repo_id = sys.argv[1]
25 | target_repo = g.get_repo(target_repo_id)
26 | csv_data = [["state", "created_at", "merged", "merge_date", "no_comments", "extracted_at"]]
27 |
28 | open_prs = target_repo.get_pulls(sort="created_at")
29 | print("Will process open PRs ..")
30 | open_prs_data = process_pr_data(open_prs)
31 | csv_data.extend(open_prs_data)
32 |
33 | closed_prs = target_repo.get_pulls(state="closed", sort="created_at")
34 | print("Will process closed PRs ..")
35 | closed_prs_data = process_pr_data(closed_prs)
36 | csv_data.extend(closed_prs_data)
37 |
38 | csv_name = f"{target_repo_id}.csv"
39 | csv_name = csv_name.replace(os.sep, "_")
40 | print(f"Will write results to {csv_name}")
41 | with open(csv_name, "w") as outfile:
42 | lines = [",".join(row) for row in csv_data]
43 | text = "\n".join(lines)
44 | outfile.write(text + "\n")
45 |
46 |
47 | def process_pr_data(paginated_gh_result: PaginatedList):
48 | rows = []
49 | while True:
50 | try:
51 | _process_pr_data(paginated_gh_result, rows, len(rows))
52 | except RateLimitExceededException:
53 | print("Rate limited. Will sleep for 5 minutes and try again...")
54 | time.sleep(3600)
55 | else:
56 | break
57 | return rows
58 |
59 | def _process_pr_data(paginated_gh_result: PaginatedList, rows, resume_ind = 0):
60 | total = paginated_gh_result.totalCount
61 | processed_prs = resume_ind
62 | print(f"{total} PRs to process...")
63 | for pr in paginated_gh_result[resume_ind:]:
64 | created_at = pr.created_at.timestamp() if pr.created_at else "N/A"
65 | merged_at = pr.merged_at.timestamp() if pr.merged_at else "N/A"
66 | extracted_at = datetime.now().timestamp()
67 | row = [
68 | pr.state,
69 | f"{created_at}",
70 | f"{pr.merged}",
71 | f"{merged_at}",
72 | f"{pr.comments}",
73 | f"{extracted_at}",
74 | ]
75 | rows.append(row)
76 | processed_prs += 1
77 | if (processed_prs % REPORT_PROGRESS) == 0:
78 | perc_progress = round(processed_prs / total * 100, 2)
79 | print(f"Processed {perc_progress} % of PRs")
80 |
81 | print("Processed 100 % of PRs")
82 |
83 | if __name__ == "__main__":
84 | main()
85 |
--------------------------------------------------------------------------------
/scripts/get_pr_gql.py:
--------------------------------------------------------------------------------
1 | import requests as rq
2 | import os
3 | import sys
4 | from datetime import datetime
5 | from dateutil import parser
6 |
7 |
8 | TOKEN = os.getenv("GH_TOKEN")
9 | STEP_SIZE = 100
10 | GH_GQL_URL = "https://api.github.com/graphql"
11 |
12 |
13 | def main():
14 | if not TOKEN:
15 | print("You need to set GH_TOKEN env var")
16 | sys.exit(1)
17 | if len(sys.argv) < 2:
18 | print(
19 | "Pass github repo name as first position argument.\n 'facebook/react' for example"
20 | )
21 | sys.exit(1)
22 | owner, repo = sys.argv[1].split('/')
23 | first_resp = first_query(owner, repo)
24 | total = first_resp["data"]["repository"]["pullRequests"]["totalCount"]
25 | has_next = first_resp["data"]["repository"]["pullRequests"]["pageInfo"][
26 | "hasNextPage"
27 | ]
28 | cursor = first_resp["data"]["repository"]["pullRequests"]["edges"][-1]["cursor"]
29 | print(f"Total PRs to process {total}.")
30 | rows = [["state", "created_at", "extracted_at", "author"]]
31 | to_csv(first_resp, rows)
32 | while has_next:
33 | progress = round(len(rows) / total * 100, 2)
34 | print(f"Processed {progress}% of the total ...")
35 | result = paginated_query(owner, repo, cursor)
36 | has_next = result["data"]["repository"]["pullRequests"]["pageInfo"][
37 | "hasNextPage"
38 | ]
39 | to_csv(result, rows)
40 | cursor = result["data"]["repository"]["pullRequests"]["edges"][-1]["cursor"]
41 | print("Done fetching")
42 | csv_name = f"{owner}_{repo}.csv"
43 | print(f"Will save results to {csv_name}")
44 | with open(csv_name, "w") as outfile:
45 | lines = [",".join(row) for row in rows]
46 | text = "\n".join(lines)
47 | outfile.write(text + "\n")
48 |
49 |
50 | def first_query(owner, repo):
51 | data = {
52 | "query": """
53 | query {
54 | repository(owner:"%s", name:"%s") {
55 | pullRequests(first: %s) {
56 | totalCount
57 | pageInfo {
58 | hasNextPage
59 | }
60 | edges {
61 | cursor
62 | node {
63 | state
64 | createdAt
65 | authorAssociation
66 | }
67 | }
68 | }
69 | }
70 | }
71 | """
72 | % (owner, repo, STEP_SIZE)
73 | }
74 | return gql_request(data)
75 |
76 |
77 | def paginated_query(owner, repo, cursor):
78 | data = {
79 | "query": """
80 | query {
81 | repository(owner:"%s", name:"%s") {
82 | pullRequests(first: %s, after: "%s") {
83 | totalCount
84 | pageInfo {
85 | hasNextPage
86 | }
87 | edges {
88 | cursor
89 | node {
90 | state
91 | createdAt
92 | authorAssociation
93 | }
94 | }
95 | }
96 | }
97 | }
98 | """
99 | % (owner, repo, STEP_SIZE, cursor)
100 | }
101 | return gql_request(data)
102 |
103 |
104 | def gql_request(data):
105 | headers = {"Authorization": f"bearer {TOKEN}"}
106 | res = rq.post(GH_GQL_URL, headers=headers, json=data)
107 | return res.json()
108 |
109 |
110 | def to_csv(gql_result, rows: list):
111 | extracted_at = datetime.now().timestamp()
112 | for edge in gql_result["data"]["repository"]["pullRequests"]["edges"]:
113 | node = edge["node"]
114 | created_at = node["createdAt"]
115 | # parse to ts
116 | created_at = parser.parse(created_at).timestamp()
117 | author = node["authorAssociation"]
118 | row = [node["state"], str(created_at), str(extracted_at), author]
119 | rows.append(row)
120 |
121 |
122 | if __name__ == "__main__":
123 | main()
124 |
--------------------------------------------------------------------------------
/mergechance/templates/chance.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | Your Merge Chance on GitHub
9 |
10 |
11 |
15 |
16 |
17 |
Merge Chance For
18 |
19 |
23 |
24 |
25 |
{{chance}}%
26 |
27 |
28 |
29 |
of the PRs made by outsiders (not owners/members) get merged.
30 |
31 |
32 |
33 |
PRs usually closed after {{median}} days (median)
34 |
35 |
36 |
37 |
38 |
* Based on most recent {{total}} outsiders' PRs
39 |
40 |
44 |
45 |
46 |
* PRs open but not merged within 90 days are also treated as rejected
47 |
48 |
49 |
50 |
* PRs closed by the author are ignored
51 |
52 |
53 |
54 |
* bot PRs and spam should be ignored (check data to validate - help welcome)
55 |
56 |
60 |
61 |
62 |
63 |
64 | Copy Markdown below to your README.md to get a Merge-Chance badge
65 |
66 |
67 |
68 |
69 |
70 |
71 | [](https://merge-chance.info/target?repo={{repo | urlencode}})
72 |
73 |
74 |
75 |
76 |
77 |
Like this one
78 |

79 |
80 |
81 |
85 |
86 |
87 |
91 |
92 |
93 |
94 |
95 |
--------------------------------------------------------------------------------
/mergechance/main.py:
--------------------------------------------------------------------------------
1 | from flask import Flask, request, render_template, jsonify, send_file
2 | import logging
3 | import os
4 | from tempfile import TemporaryDirectory
5 |
6 | from mergechance.db import autocomplete_list, get_from_cache, cache
7 | from mergechance.gh_gql import get_pr_fields, GQLError
8 | from mergechance.analysis import ANALYSIS_FIELDS, get_viable_prs, merge_chance, get_median_outsider_time, filter_prs
9 | from mergechance.data_export import prep_tsv
10 |
11 | app = Flask(__name__)
12 | log = logging.getLogger(__name__)
13 |
14 |
15 | def sanitize_repo(target: str):
16 | """Sanitize user input (repo name)."""
17 | if not target:
18 | raise ValueError("Repo cannot be empty")
19 | target = target.lower()
20 | target = target.strip()
21 | target = _strip_url(target)
22 | # sometimes people copy paste from GitHub UI, which adds spaces in between
23 | # those can be safely removed, spaces are not allowed in GitHub repo names
24 | target = target.replace(" ", "")
25 | if target.count("/") != 1:
26 | raise ValueError("Invalid repo name. Must be in format: organization/name")
27 | return target
28 |
29 |
30 | def _strip_url(target):
31 | """Target repo can be either a org/repo string or a full url."""
32 | exclude = "github.com/"
33 | if exclude in target:
34 | pos = target.find(exclude) + len(exclude)
35 | target = target[pos:]
36 | if target[-1] == "/":
37 | target = target[:-1]
38 | return target
39 |
40 |
41 | def _get_chance(target):
42 | cached_chance = get_from_cache(target)
43 | if cached_chance:
44 | chance, median, total, _ = cached_chance
45 | log.info(f"Retrieved {target} from cache")
46 | else:
47 | log.info(f"Retrieving {target} from GH API")
48 | # after sanitize_repo it is guaranteed to contain exactly one '/'
49 | owner, repo = target.split("/")
50 | try:
51 | prs = []
52 | all_prs = []
53 | cursor = None
54 | reqs = 0
55 | while len(prs) < 50 and reqs < 10:
56 | batch, cursor = get_pr_fields(owner, repo, ANALYSIS_FIELDS, page_cap=1, cursor=cursor)
57 | batch = filter_prs(batch)
58 | all_prs.extend(batch)
59 | # because of implied insider calculation it is important to recalculate
60 | # on the entire dataset, as it might uncover more information about implied insiders
61 | prs = get_viable_prs(all_prs)
62 | reqs += 1
63 | except GQLError:
64 | return None
65 | chance = merge_chance(prs)
66 | if not chance:
67 | return None
68 | chance, total = chance
69 | median = get_median_outsider_time(prs)
70 | if not median:
71 | return None
72 | cache(target, chance, median, total, prs)
73 | return chance, median, total
74 |
75 |
76 | @app.route("/autocomplete", methods=["GET"])
77 | def auto_complete():
78 | """Endpoint for target repo autocomplete."""
79 | return jsonify(autocomplete_list())
80 |
81 |
82 | @app.route("/", methods=["GET"])
83 | def index():
84 | return render_template("index.html")
85 |
86 |
87 | @app.route("/target", methods=["GET"])
88 | def target():
89 | target = request.args.get("repo")
90 | try:
91 | target = sanitize_repo(target)
92 | except ValueError:
93 | return ("Invalid repo name. Must be in format 'owner/name'.", 400)
94 | chance = _get_chance(target)
95 | if chance is None:
96 | return (
97 | f"Could not calculate merge chance for this repo. It might not exist on GitHub or have zero PRs.",
98 | 404,
99 | )
100 | chance, median, total = chance
101 | return render_template("chance.html", chance=chance, repo=target, total=total, median=median)
102 |
103 |
104 | @app.route("/badge", methods=["GET"])
105 | def badge():
106 | target = request.args.get("repo")
107 | try:
108 | target = sanitize_repo(target)
109 | except ValueError:
110 | return ("Invalid repo name. Must be in format 'owner/name'.", 400)
111 | chance = _get_chance(target)
112 | if chance is None:
113 | return (
114 | f"Could not calculate merge chance for this repo. It might not exist on GitHub or have zero PRs.",
115 | 404,
116 | )
117 | chance, median, _ = chance
118 | return jsonify(
119 | {"schemaVersion": 1, "label": "Merge Chance", "message": f"{chance}% after {median} days"}
120 | )
121 |
122 |
123 | @app.route("/data", methods=["GET"])
124 | def download_data():
125 | target = request.args.get("repo")
126 | try:
127 | target = sanitize_repo(target)
128 | except ValueError:
129 | return ("Invalid repo name. Must be in format 'owner/name'.", 400)
130 | data = get_from_cache(target)
131 | if not data:
132 | return ("Repo not found", 404)
133 | _, _, _, prs = data
134 | if not prs:
135 | return ("No data for this repo", 404)
136 | content = prep_tsv(prs)
137 | with TemporaryDirectory() as tdir:
138 | full_path = os.path.join(tdir, "prs.tsv")
139 | with open(full_path, "w") as tsv:
140 | tsv.write(content)
141 | return send_file(full_path, attachment_filename=f"{target}.tsv", as_attachment=True, cache_timeout=-600)
142 |
--------------------------------------------------------------------------------
/mergechance/analysis.py:
--------------------------------------------------------------------------------
1 | """Module for calculating stats from data provided by gh_gql.py"""
2 | from dateutil import parser
3 | import time
4 | import statistics
5 | from mergechance.blacklist import blacklist
6 |
7 |
8 | STALE_THRESHOLD = 90 * 24 * 60 * 60 # 90 days in seconds
9 |
10 | ANALYSIS_FIELDS = ["closedAt", "createdAt", "authorAssociation", "state", "permalink", "title"]
11 |
12 | # PRs a nominal outsider must merge to become an insider
13 | INSIDER_PR_THRESHOLD = 5
14 |
15 | def median_time_to_merge(prs: list) -> float:
16 | closings = [_to_ts(pr["closedAt"]) - _to_ts(pr["createdAt"]) for pr in prs ]
17 | median_seconds = statistics.median(closings)
18 | median_days = median_seconds / 60 / 60 / 24
19 | median_days = round(median_days, 2)
20 | return median_days
21 |
22 |
23 | def filter_prs(prs):
24 | """Rules based pr filtering for spam, bots etc."""
25 | prs = [pr for pr in prs if not _is_trivial(pr)]
26 | prs = [pr for pr in prs if not _is_blacklisted(pr)]
27 | prs = [pr for pr in prs if not _is_closed_by_author(pr)]
28 | return prs
29 |
30 |
31 | def get_viable_prs(prs):
32 | """return only outsider PRs that MERGED, CLOSED or stale."""
33 | outsiders = get_outsiders(prs)
34 | now = time.time()
35 | return [pr for pr in outsiders if _is_handled(pr) or _is_stale(pr, now)]
36 |
37 |
38 | def get_implied_insiders(prs: list):
39 | """Some repositories don't add contributors to their org members.
40 |
41 | Returns a list of author logins that successfully merged to
42 | the repo many times, they will be assumed to be insiders.
43 | """
44 | logins = [pr['author']['login'] for pr in prs if pr['state'] == 'MERGED']
45 | return {login for login in logins if logins.count(login) > INSIDER_PR_THRESHOLD }
46 |
47 | def get_median_outsider_time(outsiders_prs: list) -> float:
48 | """Return median closing time for closed PRs.
49 |
50 | Will return None if there are no closed prs in the input.
51 | """
52 | closed = [pr for pr in outsiders_prs if pr['state'] in {'MERGED', 'CLOSED'}]
53 | if not closed:
54 | return None
55 | return median_time_to_merge(closed)
56 |
57 |
58 | def merge_chance(outsiders_prs: list) -> tuple:
59 | """Return a tuple of proportion of successful PRs and the amount of
60 | prs that were taken into consideration among those from the input.
61 | Open and not stale PRs are not valid and are ignored."""
62 | merged = get_merged(outsiders_prs)
63 | open = get_open(outsiders_prs)
64 | stale = get_stale(open)
65 | ignored = len(open) - len(stale)
66 | total = len(outsiders_prs) - ignored
67 | if not total:
68 | return None
69 | chance = len(merged) / total
70 | chance *= 100
71 | chance = round(chance, 2)
72 | return chance, total
73 |
74 |
75 | def get_merged(prs: list) -> list:
76 | return [pr for pr in prs if pr["state"] == "MERGED"]
77 |
78 |
79 | def get_open(prs: list) -> list:
80 | return [pr for pr in prs if pr["state"] == "OPEN"]
81 |
82 |
83 | def get_outsiders(prs: list) -> list:
84 | implied_insiders = get_implied_insiders(prs)
85 | def _outsider_pr(pr):
86 | if pr['author'] is None:
87 | # author's GH user removed?
88 | return _is_outsider(pr["authorAssociation"])
89 | return _is_outsider(pr["authorAssociation"]) and pr['author']['login'] not in implied_insiders
90 | return [pr for pr in prs if _outsider_pr(pr)]
91 |
92 |
93 | def get_stale(prs: list) -> list:
94 | """Returns the PRs without stale PRs."""
95 | now = time.time()
96 | return [pr for pr in prs if _is_stale(pr, now)]
97 |
98 |
99 | def _is_outsider(author: str):
100 | return author not in {"OWNER", "MEMBER"}
101 |
102 |
103 | def _is_stale(pr, now):
104 | if pr["state"] != "OPEN":
105 | return False
106 | ts = pr["createdAt"]
107 | ts = _to_ts(ts)
108 | return (now - ts) > STALE_THRESHOLD
109 |
110 |
111 | def _is_handled(pr):
112 | """A PR is considered handled when it is CLOSED or MERGED."""
113 | return pr['state'] in {'MERGED', 'CLOSED'}
114 |
115 |
116 | def _is_blacklisted(pr):
117 | if not pr['author']:
118 | return False
119 | return pr['author']['login'] in blacklist
120 |
121 |
122 | banned_keywords = ["readme", "update", "typo"]
123 |
124 | def _is_trivial(pr):
125 | """Poor man's spam detection - based on title only for now."""
126 | title = pr.get('title', '')
127 | title = title.lower()
128 | for banned in banned_keywords:
129 | if banned in title:
130 | return True
131 | if title == 'test':
132 | return True
133 | return False
134 |
135 |
136 | def _is_closed_by_author(pr):
137 | """If the author closed the PR themselves we ignore it."""
138 | if not pr['author']:
139 | return False
140 | if pr['state'] != 'CLOSED':
141 | return False
142 | timeline = pr.get('timelineItems')
143 | if not timeline:
144 | return False
145 | open_login = pr['author'].get('login')
146 | events = timeline.get('edges', [])
147 | for event in events:
148 | node = event['node']
149 | actor = node.get('actor')
150 | if not actor:
151 | return False
152 | closed_login = actor.get('login')
153 | if closed_login == open_login:
154 | return True
155 | return False
156 |
157 |
158 |
159 | def _to_ts(ts_iso):
160 | return parser.parse(ts_iso).timestamp()
161 |
--------------------------------------------------------------------------------
/mergechance/test/test_analysis.py:
--------------------------------------------------------------------------------
1 | from mergechance.analysis import (
2 | get_merged,
3 | get_outsiders,
4 | get_stale,
5 | get_open,
6 | merge_chance,
7 | median_time_to_merge,
8 | get_implied_insiders
9 | )
10 |
11 | import datetime
12 |
13 | import pytest
14 |
15 |
16 | @pytest.fixture()
17 | def pr_open_outsider():
18 | now = datetime.datetime.now().isoformat()
19 | return {
20 | "createdAt": now,
21 | "closedAt": None,
22 | "authorAssociation": None,
23 | "state": "OPEN",
24 | "author": {
25 | "login": "author1"
26 | }
27 | }
28 |
29 |
30 | @pytest.fixture()
31 | def pr_closed_outsider():
32 | now = datetime.datetime.now().isoformat()
33 | return {
34 | "createdAt": now,
35 | "closedAt": now,
36 | "authorAssociation": None,
37 | "state": "CLOSED",
38 | "author": {
39 | "login": "author1"
40 | }
41 | }
42 |
43 |
44 | @pytest.fixture()
45 | def pr_merged_outsider():
46 | now = datetime.datetime.now().isoformat()
47 | return {
48 | "createdAt": now,
49 | "closedAt": now,
50 | "authorAssociation": None,
51 | "state": "MERGED",
52 | "author": {
53 | "login": "author1"
54 | }
55 | }
56 |
57 |
58 | @pytest.fixture()
59 | def pr_open_outsider_stale():
60 | delta = datetime.timedelta(days=91)
61 | long_time_ago = datetime.datetime.now() - delta
62 | return {
63 | "createdAt": long_time_ago.isoformat(),
64 | "closedAt": None,
65 | "authorAssociation": None,
66 | "state": "OPEN",
67 | "author": {
68 | "login": "author1"
69 | }
70 | }
71 |
72 |
73 | @pytest.fixture()
74 | def pr_open_insider():
75 | now = datetime.datetime.now().isoformat()
76 | return {
77 | "createdAt": now,
78 | "closedAt": None,
79 | "authorAssociation": "MEMBER",
80 | "state": "OPEN",
81 | "author": {
82 | "login": "author1"
83 | }
84 | }
85 |
86 |
87 | @pytest.fixture()
88 | def pr_closed_insider():
89 | now = datetime.datetime.now().isoformat()
90 | return {
91 | "createdAt": now,
92 | "closedAt": now,
93 | "authorAssociation": "MEMBER",
94 | "state": "CLOSED",
95 | "author": {
96 | "login": "author1"
97 | }
98 | }
99 |
100 |
101 | @pytest.fixture()
102 | def pr_merged_insider():
103 | now = datetime.datetime.now().isoformat()
104 | return {
105 | "createdAt": now,
106 | "closedAt": now,
107 | "authorAssociation": "MEMBER",
108 | "state": "MERGED",
109 | "author": {
110 | "login": "author1"
111 | }
112 | }
113 |
114 |
115 | @pytest.fixture()
116 | def pr_open_insider_stale():
117 | delta = datetime.timedelta(days=91)
118 | long_time_ago = datetime.datetime.now() - delta
119 | return {
120 | "createdAt": long_time_ago.isoformat(),
121 | "closedAt": None,
122 | "authorAssociation": "MEMBER",
123 | "state": "OPEN",
124 | "author": {
125 | "login": "author1"
126 | }
127 | }
128 |
129 |
130 | @pytest.fixture()
131 | def prs(
132 | pr_open_outsider,
133 | pr_closed_outsider,
134 | pr_merged_outsider,
135 | pr_open_outsider_stale,
136 | pr_open_insider,
137 | pr_closed_insider,
138 | pr_merged_insider,
139 | pr_open_insider_stale,
140 | ):
141 | return [
142 | pr_open_outsider,
143 | pr_closed_outsider,
144 | pr_merged_outsider,
145 | pr_open_outsider_stale,
146 | pr_open_insider,
147 | pr_closed_insider,
148 | pr_merged_insider,
149 | pr_open_insider_stale,
150 | ]
151 |
152 | @pytest.fixture()
153 | def pr_merged_1day():
154 | delta = datetime.timedelta(days=1)
155 | now =datetime.datetime.now()
156 | time_ago = now - delta
157 | return {
158 | "createdAt": time_ago.isoformat(),
159 | "closedAt": now.isoformat(),
160 | "authorAssociation": None,
161 | "state": "MERGED",
162 | }
163 |
164 | @pytest.fixture()
165 | def pr_merged_2day():
166 | delta = datetime.timedelta(days=2)
167 | now =datetime.datetime.now()
168 | time_ago = now - delta
169 | return {
170 | "createdAt": time_ago.isoformat(),
171 | "closedAt": now.isoformat(),
172 | "authorAssociation": None,
173 | "state": "MERGED",
174 | }
175 |
176 | @pytest.fixture()
177 | def pr_merged_3day():
178 | delta = datetime.timedelta(days=3)
179 | now =datetime.datetime.now()
180 | time_ago = now - delta
181 | return {
182 | "createdAt": time_ago.isoformat(),
183 | "closedAt": now.isoformat(),
184 | "authorAssociation": None,
185 | "state": "MERGED",
186 | }
187 |
188 |
189 | def test_get_merged(prs):
190 | merged = get_merged(prs)
191 | assert len(prs) == 8
192 | assert len(merged) == 2
193 |
194 |
195 | def test_get_stale(prs):
196 | stale = get_stale(prs)
197 | assert len(prs) == 8
198 | assert len(stale) == 2
199 |
200 |
201 | def test_get_open(prs):
202 | open = get_open(prs)
203 | assert len(prs) == 8
204 | assert len(open) == 4
205 |
206 |
207 | def test_get_outsiders(prs):
208 | out = get_outsiders(prs)
209 | assert len(prs) == 8
210 | assert len(out) == 4
211 |
212 |
213 | def test_merge_chance(prs):
214 | chance, total = merge_chance(prs)
215 | assert total == 6
216 | assert pytest.approx(chance, 0.1) == 33.3
217 |
218 |
219 | def test_merge_chance_empty():
220 | res = merge_chance([])
221 | assert res is None
222 |
223 |
224 | def test_median_time(pr_merged_1day, pr_merged_2day, pr_merged_3day):
225 | prs = [pr_merged_1day, pr_merged_1day, pr_merged_1day]
226 | med_t = median_time_to_merge(prs)
227 | assert pytest.approx(med_t, 0.1) == 1.0
228 |
229 | prs = [pr_merged_1day, pr_merged_2day, pr_merged_3day]
230 | med_t = median_time_to_merge(prs)
231 | assert pytest.approx(med_t, 0.1) == 2.0
232 |
233 |
234 | def test_implied_insider(pr_merged_outsider):
235 | prs = [pr_merged_outsider] * 6
236 | implied = get_implied_insiders(prs)
237 | assert {'author1'} == implied
238 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/mergechance/blacklist.py:
--------------------------------------------------------------------------------
1 | blacklist = [
2 | "userQED",
3 | "GGupzHH",
4 | "nodejs-ma",
5 | "linxz-coder",
6 | "teach-tian",
7 | "kevinlens",
8 | "Pabitra-26",
9 | "mangalan516",
10 | "IjtihadIslamEmon",
11 | "marcin-majewski-sonarsource",
12 | "LongTengDao",
13 | "JoinsG",
14 | "safanbd",
15 | "aly2",
16 | "aka434112"
17 | "SMAKSS",
18 | "imbereket",
19 | "takumu1011",
20 | "adityanjr",
21 | "Aa115511",
22 | "farjanaHuq",
23 | "samxcode",
24 | "HaiTing-Zhu",
25 | "gimnakatugampala",
26 | "cmc3cn",
27 | "kkkisme",
28 | "haidongwang-github",
29 | "ValueCoders",
30 | "happy-dc",
31 | "Tyorden",
32 | "SP4R0W",
33 | "q970923066",
34 | "Shivansh2407",
35 | "1o1w1",
36 | "soumyadip007",
37 | "AceTheCreator",
38 | "qianbaiduhai",
39 | "changwei0857",
40 | "CainKane",
41 | "Jajabenit250",
42 | "gouri1000",
43 | "yvettep321",
44 | "naveen8801",
45 | "HelloAny",
46 | "ShaileshDeveloper",
47 | "Jia-De",
48 | "JeffCorp",
49 | "ht1131589588",
50 | "Supsource",
51 | "coolwebrahul",
52 | "aimidy",
53 | "ishaanthakur",
54 | # bots
55 | "vue-bot",
56 | "dependabot",
57 | # below is taken from spamtoberfest
58 | "SudhanshuAGR",
59 | "pinkuchoudhury69",
60 | "brijal96",
61 | "shahbazalam07",
62 | "piyushkothari1999",
63 | "imnrb",
64 | "saksham05mathur",
65 | "Someshkale15",
66 | "xinghalok",
67 | "manpreet147",
68 | "sumitsrivastav180",
69 | "1234515",
70 | "Rachit-hooda-man",
71 | "vishal2305bug",
72 | "Ajayraj006",
73 | "pathak7838",
74 | "Kumarjatin-coder",
75 | "Narendra-Git-Hub",
76 | "Stud-dabral",
77 | "Siddhartha05",
78 | "rishi123A",
79 | "kartik71792",
80 | "kapilpatel-2001",
81 | "SapraRam",
82 | "PRESIDENT-caris",
83 | "smokkie087",
84 | "Ravikant-unzippedtechnology",
85 | "sawanch",
86 | "Saayancoder",
87 | "shubham5888",
88 | "manasvi141220002",
89 | "Asher12428",
90 | "mohdalikhan",
91 | "Paras4902",
92 | "shudhii",
93 | "Tesla9625",
94 | "web-codegrammer",
95 | "imprakashsah",
96 | "Bhagirath043",
97 | "Ankur-S1",
98 | "Deannos",
99 | "sapro-eng",
100 | "skabhi001",
101 | "AyushPathak12",
102 | "Hatif786",
103 | "adityas2124k2",
104 | "Henry-786",
105 | "abhi6418",
106 | "J-Ankit2002",
107 | "9759176595",
108 | "rajayush9944",
109 | "Kishan-Kumar-Kannaujiya",
110 | "ManavBargali",
111 | "komalsharma121",
112 | "AbhiramiTS",
113 | "mdkaif25",
114 | "shubhamsingh333",
115 | "hellosibun",
116 | "ankitbharti1998",
117 | "subhakantabhau",
118 | "shivamsri142",
119 | "sameer13899",
120 | "BhavyaTheHacker",
121 | "nehashewale",
122 | "Shashi-design",
123 | "anuppal101",
124 | "NitinRavat888",
125 | "sakrit",
126 | "Kamran-360",
127 | "satyam-dot",
128 | "Suleman3015",
129 | "amanpj15",
130 | "abhinavjha98",
131 | "Akshat-Git-Sharma",
132 | "Anuragtawaniya",
133 | "nongshaba1337",
134 | "XuHewen",
135 | "happyxhw",
136 | "ascott",
137 | "ThomasGrund",
138 | 'Abhayrai778',
139 | 'pyup-bot',
140 | 'AhemadRazaK3',
141 | 'doberoi10',
142 | 'lsmatovu',
143 | 'Lakshay7014',
144 | 'nikhilkr1402',
145 | 'arfakl99',
146 | 'Tyrrrz',
147 | 'SwagatamNanda',
148 | 'V-Soni',
149 | 'hparadiz',
150 | 'Ankurmarkam',
151 | 'shubham-01-star',
152 | 'Rajputusman',
153 | 'bharat13soni',
154 | 'przemeklal',
155 | 'p4checo',
156 | 'REDSKULL1412',
157 | 'GAURAVCHETTRI',
158 | 'DerDomml',
159 | 'Sunit25',
160 | 'divyansh123-max',
161 | 'hackerharsh007',
162 | 'Thecreativeone2001',
163 | 'nishkarshsingh-tech',
164 | 'Devyadav1994',
165 | 'Rajeshjha586',
166 | 'BoboTiG',
167 | 'nils-braun',
168 | 'DjDeveloperr',
169 | 'FreddieRidell',
170 | 'pratyxx525',
171 | 'abstergo43',
172 | 'impossibleshado1',
173 | 'Gurnoor007',
174 | '2303-kanha',
175 | 'ChaitanyaAg',
176 | 'justinjpacheco',
177 | 'shoaib5887khan',
178 | 'farhanmulla713',
179 | 'ashrafzeya',
180 | 'muke64',
181 | 'aditya08maker',
182 | 'rajbaba1',
183 | 'priyanshu-top10',
184 | 'Maharshi369',
185 | 'Deep-bhingradiya',
186 | 'shyam7e',
187 | 'shubhamsuman37',
188 | 'jastisriradheshyam',
189 | 'Harshit-10-pal',
190 | 'shivphp',
191 | 'RohanSahana',
192 | '404notfound-3',
193 | 'ritikkatiyar',
194 | 'ashishmohan0522',
195 | 'Amanisrar',
196 | 'VijyantVerma',
197 | 'Chetanchetankoli',
198 | 'Hultner',
199 | 'gongeprashant',
200 | 'psw89',
201 | 'harshilaneja',
202 | 'SLOKPATHAK',
203 | 'st1891',
204 | 'nandita853',
205 | 'ms-prob',
206 | 'Sk1llful',
207 | 'HarshKq',
208 | 'rpy9954',
209 | 'TheGunnerMan',
210 | 'AhsanKhokhar1',
211 | 'RajnishJha12',
212 | 'Adityapandey-7',
213 | 'vipulkumbhar0',
214 | 'nikhilkhetwal',
215 | 'Adityacoder99',
216 | 'arjun01-debug',
217 | 'saagargupta',
218 | 'UtCurseSingh',
219 | 'Anubhav07-pixel',
220 | 'Vinay584',
221 | 'YA7CR7',
222 | 'anirbanballav',
223 | 'mrPK',
224 | 'VibhakarYashasvi',
225 | 'ANKITMOHAPATRAPROGRAMS',
226 | 'parmar-hacky',
227 | 'zhacker1999',
228 | 'akshatjindal036',
229 | 'swarakeshrwani',
230 | 'ygajju52',
231 | 'Nick-Kr-Believe',
232 | 'adityashukl1502',
233 | 'mayank23raj',
234 | 'shauryamishra',
235 | 'swagat11',
236 | '007swayam',
237 | 'gardener-robot-ci-1',
238 | 'ARUNJAYSACHAN',
239 | 'MdUmar07',
240 | 'vermavinay8948',
241 | 'Rimjhim-Dey',
242 | 'prathamesh-jadhav-21',
243 | 'brijal96',
244 | 'siddhantparadox',
245 | 'Abhiporwal123',
246 | 'sparshbhardwaj209',
247 | 'Amit-Salunke-02',
248 | 'wwepavansharma',
249 | 'kirtisahu123',
250 | 'japsimrans13',
251 | 'wickedeagle',
252 | 'AnirbanB999',
253 | 'jayeshmishra',
254 | 'shahbazalam07',
255 | 'Samrath07',
256 | 'pinkuchoudhury69',
257 | 'moukhikgupta5',
258 | 'hih547430',
259 | 'burhankhan23',
260 | 'Rakesh0222',
261 | 'Rahatullah19',
262 | 'sanskar783',
263 | 'Eshagupta0106',
264 | 'Arpit-Tailong',
265 | 'Adityaaashu',
266 | 'rahul149',
267 | 'udit0912',
268 | 'aru5858',
269 | 'riya6361',
270 | 'vanshkhemani',
271 | 'Aditi0205',
272 | 'riteshbiswas0',
273 | '12Ayush12008039',
274 | 'Henry-786',
275 | 'ManviMaheshwari',
276 | 'SATHIYASEELAN2001',
277 | 'SuchetaPal',
278 | 'Sahil24822',
279 | 'sohamgit',
280 | 'Bhumi5599',
281 | 'anil-rathod',
282 | 'binayuchai',
283 | 'PujaMawandia123',
284 | '78601abhiyadav',
285 | 'PriiTech',
286 | 'SahilBhagtani',
287 | 'dhruv1214',
288 | 'SAURABHYAGYIK',
289 | 'farhanmansuri25',
290 | 'Chronoviser',
291 | 'airtel945',
292 | 'Swagnikdhar',
293 | 'tushar-1308',
294 | 'sameerbasha123',
295 | 'anshu15183',
296 | 'Mohit049',
297 | 'YUVRAJBHATI',
298 | 'miras143mom',
299 | 'ProPrakharSoni',
300 | 'pratikkhatana',
301 | 'Alan1857',
302 | 'AyanKrishna',
303 | 'kartikey2003jain',
304 | 'sailinkan',
305 | 'DEVELOPER06810',
306 | 'Abhijeet9274',
307 | 'Kannu12',
308 | 'Shivam-Amin',
309 | 'suraj-lpu',
310 | 'Elizah550',
311 | 'dipsylocus',
312 | 'jaydev-coding',
313 | 'IamLucif3r',
314 | 'DesignrKnight',
315 | 'PiyumalK',
316 | 'nandita853',
317 | 'mohsin529',
318 | 'ShravanBhat',
319 | 'doppelganger-test',
320 | 'smitgh',
321 | 'parasgarg123',
322 | 'Amit-Salunke-02',
323 | 'Chinmay-KB',
324 | 'sagarr1',
325 | 'Praveshrana12',
326 | 'fortrathon',
327 | 'miqbalrr',
328 | 'Ankurmarkam',
329 | 'saloni691',
330 | 'Bhuvan804',
331 | 'pra-b-hat-chauhan',
332 | 'snakesause',
333 | 'Shubhani25',
334 | 'arshad699',
335 | 'fahad-25082001',
336 | 'Chaitanya31612',
337 | 'tiwariraju',
338 | 'ritik0021',
339 | 'aakash-dhingra',
340 | 'Raunak017',
341 | 'ashrafzeya',
342 | 'priyanshu-top10',
343 | 'NikhilKumar-coder',
344 | 'ygajju52',
345 | 'shvnsh',
346 | 'abhishek7457',
347 | 'sethmcagit',
348 | 'Apurva122',
349 | 'Gurpreet-Singh-Bhupal',
350 | 'ashmit-coder',
351 | 'Rishi098',
352 | 'Xurde-glitch',
353 | 'imrohitoberoi',
354 | 'Hrushikeshsalunkhe',
355 | 'ABHI2598',
356 | 'Abhishek8-web',
357 | 'arjun01-debug',
358 | 'Shailesh12-svg',
359 | 'SachinSingh7050',
360 | 'VibhakarYashasvi',
361 | 'rajbaba1',
362 | 'yuvraj66',
363 | 'Nick-Kr-Believe',
364 | 'gongeprashant',
365 | 'sanskar783',
366 | 'infoguru19',
367 | 'Shamik225',
368 | 'Pro0131',
369 | 'soni-111',
370 | 'Rahul-bitu',
371 | 'meetshrimali',
372 | 'coolsuva',
373 | 'yogeshwaran01',
374 | 'Satyamtripathi1996',
375 | 'Rahatullah19',
376 | 'kartikey2003jain',
377 | 'rajarshi15220',
378 | 'SahilBhagtani',
379 | 'janni-03',
380 | 'Abhijit-06',
381 | 'dvlp-jrs',
382 | 'Viki3223',
383 | 'Azhad56',
384 | 'Mohit049',
385 | 'mvpsaurav',
386 | 'dvcrn',
387 | 'Deep-bhingradiya',
388 | 'shreyans2007',
389 | 'sailinkan',
390 | 'Abhijeet9274',
391 | 'riteshbiswas0',
392 | 'AhemadRazaK3',
393 | 'rishi123A',
394 | 'shivpatil',
395 | 'rikidas99',
396 | 'sohamgit',
397 | 'jheero',
398 | 'itzhv14',
399 | 'sameerbasha123',
400 | 'yatendra-dev',
401 | 'AditiGautam2000',
402 | 'sid0542',
403 | 'tushar-1308',
404 | 'dhruvil05',
405 | 'sufiyankhanz',
406 | 'Alan1857',
407 | 'siriusb79',
408 | 'PKan06',
409 | 'yagnikvadaliya',
410 | 'yogeshkun',
411 | 'Abhishekjhatech',
412 | 'jatinsharma11',
413 | 'THENNARASU-M',
414 | 'priyanshu987art',
415 | 'maulik922',
416 | 'param-de',
417 | 'nisheksharma',
418 | 'balbirsingh08',
419 | 'piyushkothari1999',
420 | 'zeeshanthedev590',
421 | 'praney-pareek',
422 | 'SUBHANGANI22',
423 | 'kartikeyaGUPTA45',
424 | 'Educatemeans',
425 | '9192939495969798',
426 | 'Amit1173',
427 | 'thetoppython',
428 | 'Saurabhsingh94',
429 | 'royalbhati',
430 | 'kardithSingh',
431 | 'kishankumar05',
432 | 'Rachit-hooda-man',
433 | 'alijng',
434 | 'patel-om',
435 | 'jahangirguru',
436 | 'Vchandan348',
437 | 'amitagarwalaa57',
438 | 'rockingrohit9639',
439 | 'Krishnapal-rajput',
440 | 'aman78954098',
441 | 'pranshuag1818',
442 | 'PIYUSH6791',
443 | 'Lachiemckelvie',
444 | 'Pragati-Gawande',
445 | 'mahesh2526',
446 | 'Aman9234',
447 | 'xMaNaSx',
448 | 'shreyanshnpanwar',
449 | 'Paravindvishwakarma',
450 | 'chandan-op',
451 | 'amit007-majhi',
452 | 'Rahul-TheHacker',
453 | 'sharmanityam252',
454 | 'iamnishan',
455 | 'codewithashu',
456 | 'mersonfufu',
457 | 'saksham05mathur',
458 | 'Krishna10798',
459 | 'rajashit14',
460 | 'aetios',
461 | 'pankajnimiwal',
462 | '132ikl',
463 | 'ghost',
464 | 'Sabyyy',
465 | '9Ankit00',
466 | 'AfreenKhan777',
467 | 'akash-bansal-02',
468 | 'regakakobigman',
469 | 'aman1750',
470 | 'irajdip99',
471 | 'mohdadil2001',
472 | 'shithinshetty',
473 | 'nikhilsawalkar',
474 | 'Brighu-Raina',
475 | 'kenkirito',
476 | 'SamueldaCostaAraujoNunes',
477 | 'codewithsaurav',
478 | 'Ashutoshvk18',
479 | 'EthicalRohit',
480 | 'ihimalaya',
481 | 'somya-max',
482 | 'themonkeyhacker',
483 | 'rammohan12345',
484 | 'JasmeetSinghWasal',
485 | 'black73',
486 | 'Rebelshiv',
487 | 'DarshanaNemane',
488 | 'Jitin20',
489 | 'Prakshal2607',
490 | 'Sourabhkale1',
491 | 'shoeb370',
492 | 'ArijitGoswami100',
493 | 'anju2408',
494 | 'ukybhaiii',
495 | 'anshulbhandari5',
496 | 'pratham1303',
497 | 'arpitdevv',
498 | 'RishabhGhildiyal',
499 | 'mohammedssab',
500 | 'deepakshisingh',
501 | 'Samshopify',
502 | 'ankitkumar827',
503 | 'anddytheone',
504 | 'Tush6571',
505 | 'pritam98-debug',
506 | 'Snehapriya9955',
507 | 'coastaldemigod',
508 | 'yogesh-1952',
509 | 'Vivekv11',
510 | 'Andrewrick1',
511 | 'DARSHIT006',
512 | 'pravar18',
513 | 'devildeep4u',
514 | '21appleceo',
515 | 'bereketsemagn',
516 | 'vandana-kotnala',
517 | 'tanya4113',
518 | 'gorkemkrdmn',
519 | 'Ashwin0512',
520 | 'prateekrathore1234',
521 | 'hash-mesh',
522 | 'pathak7838',
523 | 'sakshamdeveloper',
524 | 'ankan10',
525 | 'prafgup',
526 | 'anurag200502',
527 | 'niklifter',
528 | 'Shreeja1699',
529 | 'shivshikharsinha',
530 | 'SumanPurkait-grb',
531 | 'chiranjeevprajapat',
532 | 'TechieBoy',
533 | 'KhushiMittal',
534 | 'UtCurseSingh',
535 | 'lucastrogo',
536 | 'jarvis0302',
537 | 'ratan160',
538 | 'kgaurav123',
539 | 'dhakad17',
540 | 'Rishn99',
541 | 'codeme13',
542 | 'KINGUMS',
543 | 'sun-3',
544 | 'varunsingh251',
545 | 'thedrivingforc',
546 | 'aditya08maker',
547 | 'AkashVerma1515',
548 | 'gaurangbhavsar',
549 | 'ApurvaSharma20',
550 | 'Manmeet1999',
551 | 'Arhaans',
552 | 'Jaykitkukadiya',
553 | 'Rimjhim-Dey',
554 | 'apurv69',
555 | 'parth-lth',
556 | 'PranshuVashishtha',
557 | 'sidhantsharmaa',
558 | 'uday0001',
559 | 'iamrahul-9',
560 | 'nagpalnipun22',
561 | 'poonamp-31',
562 | 'dhananjaypatil',
563 | 'baibhavvishalpani',
564 | 'Ashish774-sol',
565 | 'sachin2490',
566 | 'Sudhanshu777871',
567 | 'mayur1234-shiwal',
568 | 'RohanWakhare',
569 | 'rishi4004',
570 | 'Amankumar019',
571 | 'Vaibhav162002',
572 | 'pratyushsrivastava500',
573 | 'AmarPaul-GiT',
574 | 'arjit-gupta',
575 | 'nitinchopade',
576 | 'imakg',
577 | 'meharshchakraborty',
578 | 'tumsabGandu',
579 | 'anurag360',
580 | '2000sanu',
581 | 'PoorviAgrawal56',
582 | 'omdhurat',
583 | 'Pawansinghla',
584 | 'thehacker-oss',
585 | 'mritu-mritu',
586 | 'AJAY07111998',
587 | 'rai12091997',
588 | 'OmShrivastava19',
589 | 'Divyanshu2109',
590 | 'adityaherowa',
591 | 'Abhishekt07',
592 | 'code-diggers-369',
593 | 'Jamesj001',
594 | 'coding-geek1711',
595 | 'govindrajpagul',
596 | 'CDP14',
597 | 'Kartik989-max',
598 | 'MaheshDoiphode',
599 | 'Pranayade777',
600 | 'er-royalprince',
601 | 'ricardoseriani',
602 | 'nowitsbalibhadra',
603 | 'navyaswarup',
604 | 'devendrathakare44',
605 | 'awaisulabdeen',
606 | 'SoumyaShree80',
607 | 'abahad7921',
608 | 'vishal0410',
609 | 'gajerachintan9',
610 | 'EBO9877',
611 | 'rohit-rksaini',
612 | 'momin786786',
613 | 'Shaurya-567',
614 | 'himanshu1079',
615 | 'AlecsFerra',
616 | 'rajvpatil5',
617 | 'Hacker-Boss',
618 | 'Rakesh0222',
619 | 'ASHMITA-DE',
620 | 'BilalSabugar',
621 | 'Anjan50',
622 | 'Vedant336',
623 | 'github2aman',
624 | 'satyamgta',
625 | 'kumar-vineet',
626 | 'uttamagrawal',
627 | 'AjaySinghPanwar',
628 | 'saieshdevidas',
629 | 'ohamshakya',
630 | 'JrZemdegs712',
631 | 'Anil404',
632 | 'Anamika1818',
633 | 'ssisodiya28',
634 | 'Vedurumudi-Priyanka',
635 | 'python1neo',
636 | 'sanketprajapati',
637 | 'InfinitelLoop',
638 | 'DarkMatter188',
639 | 'TanishqAhluwalia',
640 | 'J-yesh4939',
641 | 'sameer8991',
642 | 'ANSH-CODER-create',
643 | 'DeadShot-111',
644 | 'joydeepraina',
645 | 'Dhrupal19',
646 | 'Nikhil5511',
647 | 'lavyaKoli',
648 | 'jitu0956',
649 | 'parthika',
650 | 'digitalarunava',
651 | 'Shivamagg97',
652 | '23031999',
653 | 'Ashu-Modanwal',
654 | 'Singhichchha',
655 | 'pareekaabhi33',
656 | 'yashpatel008',
657 | 'yashwantkaushal',
658 | 'prem-smvdu',
659 | 'jains1234567890',
660 | 'Ritesh-004',
661 | 'shraddha8218',
662 | 'misbah9105',
663 | 'Tanishqpy',
664 | 'Iamtripathisatyam',
665 | 'mdnazam',
666 | 'akashkalal',
667 | 'Abhishekkumar10',
668 | 'chaitalimazumder',
669 | 'shubham1176',
670 | '866767676767',
671 | 'Priyanshu0131',
672 | 'Rajani12345678910',
673 | 'agrima84',
674 | 'DODOG98T',
675 | 'Abhishekaddu',
676 | 'ipriyanshuthakur',
677 | 'yogesh9555',
678 | 'shubham1234-os',
679 | 'abby486',
680 | 'YOGESH86400',
681 | 'jaggi-pixel',
682 | 'Utkarshdubey44',
683 | 'Mustafiz900',
684 | 'ashusaurav',
685 | 'Deepak27004',
686 | 'theHackPot',
687 | 'itsaaloksah',
688 | 'MakdiManush',
689 | 'Divyanshu09',
690 | 'codewithabhishek786',
691 | 'sumitkumar727254',
692 | 'faiz-9',
693 | 'soumyadipdaripa100',
694 | 'Prerna-eng',
695 | 'yourcodinsmas',
696 | 'akashnai',
697 | 'aryancoder4279',
698 | 'Anish-kumar7641',
699 | 'shivamkumar1999',
700 | 'Kushal34563',
701 | 'YashSinghyash',
702 | 'Alok070899',
703 | 'gautamdewasi',
704 | '5HAD0W-P1R4T3',
705 | 'rajkhatana',
706 | 'Himanshu-Sharma-java',
707 | 'yethish',
708 | 'Vikaskhurja',
709 | 'boomboom2003',
710 | 'mansigurnani',
711 | 'ansh8540',
712 | 'beingkS23',
713 | 'raksharaj1122',
714 | 'harshoswal',
715 | 'mitali-datascientist',
716 | 'daadestroyer',
717 | 'panudet-24mb',
718 | 'divy-koushik',
719 | 'Tanuj1234567',
720 | 'pattnaikp',
721 | 'Gauravsaha-97',
722 | '0x6D70',
723 | 'aptinstaller',
724 | 'SahilKhera14',
725 | 'Archie-Sharma',
726 | 'Chandan-program',
727 | 'shadowfighter2403',
728 | 'ivinodpatil2000',
729 | 'Souvik-py',
730 | 'NomanBaigA',
731 | 'UdhavKumar',
732 | 'rishabh-var123',
733 | 'NK-codeman0001',
734 | 'ritikkatiyar',
735 | 'ananey2004',
736 | 'tirth7677',
737 | 'Stud-dabral',
738 | 'dhruvsalve',
739 | 'treyssatvincent',
740 | 'AYUSHRAJ-WXYZ',
741 | 'JenisVaghasiya',
742 | 'KPRAPHULL',
743 | 'Apex-code',
744 | 'cypherrexx',
745 | 'AkilaDee',
746 | 'ankit-ec',
747 | 'darshan-10',
748 | 'Srijans01',
749 | 'Ankit00008',
750 | 'bijantitan',
751 | 'Jitendrayadav-eng',
752 | 'Tamonash-glitch',
753 | 'Ans-pro',
754 | 'yogesh8087',
755 | 'Sakshi2000-hash',
756 | 'shrbis2810',
757 | 'swagatopain6',
758 | 'mayankaryaman10',
759 | 'rajlomror',
760 | 'GauravNub',
761 | 'puru2407',
762 | 'KhushalPShah',
763 | 'aman7heaven',
764 | 'hazelvercetti',
765 | 'nil901',
766 | 'Ankitsingh6299',
767 | 'yashprasad8',
768 | 'Zapgithubexe',
769 | 'shiiivam',
770 | 'ShubhamGuptaa',
771 | 'viraj3315',
772 | 'Pratyush2005',
773 | 'jackSaluza',
774 | '03shivamkushwah',
775 | 'shahvraj20',
776 | 'manaskirad',
777 | 'Harsh08112001',
778 | 'R667180',
779 | 'PRATIKBANSDOE',
780 | 'MabtoorUlShafiq',
781 | 'dkyadav8282',
782 | 'prtk2001',
783 | 'MrDpk818',
784 | 'ParmGill00',
785 | 'kavya0116',
786 | 'gauravrai26',
787 | 'sachi9692',
788 | 'nj1902',
789 | 'akshatjindal036',
790 | 'shravanvis',
791 | 'ranjith660',
792 | 'sahemur',
793 | 'MDARBAAJ',
794 | 'Tylerdurdenn',
795 | 'hemantagrawal1808',
796 | 'luck804',
797 | 'vivekpatel09',
798 | 'ArushiGupta21',
799 | 'ray5541',
800 | 'arpitlathiya',
801 | 'Koshal67',
802 | 'harshul03',
803 | 'avinchudasama',
804 | 'PUJACHAUDHARY092',
805 | 'shaifali-555',
806 | 'coderidder',
807 | 'ravianandfbg',
808 | 'rohitnaththakur',
809 | 'KhanRohila',
810 | 'nikhilkr1402',
811 | 'abhijitk123',
812 | 'Jitendra2027',
813 | 'Roshan13046',
814 | 'satyam1316',
815 | 'shhivam005',
816 | 'V-Soni',
817 | 'iamayanofficial',
818 | 'kunaljainSgit',
819 | 'shriramsalunke-45',
820 | 'Laltu079',
821 | 'premkushwaha1',
822 | 'aryansingho7',
823 | 'rohitkalse',
824 | 'Royalsolanki',
825 | 'MAYANK25402',
826 | 'prakharlegend15',
827 | 'Ansh2831',
828 | 'aps-glitch',
829 | 'PJ-123-Prime',
830 | 'iamprathamchhabra',
831 | 'Bhargavi09',
832 | 'Shubham2443',
833 | 'YashAgarwalDev',
834 | 'ChandanDroid',
835 | 'SaurabhDev338',
836 | 'developerlives',
837 | 'Abhishek-hash',
838 | 'harshal1996',
839 | 'ritik9428',
840 | 'shadab19it',
841 | 'sarthakd999',
842 | 'Pruthviraj001',
843 | 'royalkingsava',
844 | 'manofelfin',
845 | 'vedantbirla',
846 | 'nishantkrgupta14',
847 | 'harsh1471',
848 | 'krabhi977',
849 | 'Pradipta0065',
850 | 'Ajeet2007',
851 | 'aman97703',
852 | 'Killersaint007',
853 | 'sachin8859',
854 | 'shubhamsuman37',
855 | 'rutuja2807',
856 | 'rishabh2204',
857 | 'Basal05',
858 | 'vipulkumbhar0',
859 | 'DSMalaviya',
860 | 'Mohit5700',
861 | 'pranaykrpiyush',
862 | 'Deepesh11-Code',
863 | 'yogikhandal',
864 | 'jigneshoo7',
865 | 'vishal-1264',
866 | 'RohanKap00r',
867 | 'Lokik18',
868 | 'harisharma12',
869 | 'PRESIDENT-caris',
870 | 'sandy56github',
871 | 'shreeya0505',
872 | 'Azumaxoid',
873 | 'Hagemaru69',
874 | 'sanju69',
875 | 'Roopeshrawat',
876 | 'hackersadd',
877 | 'coder0880',
878 | 'bajajtushar094',
879 | 'amitkumar8514',
880 | 'avichalsri',
881 | 'Satya-cod',
882 | 'andaugust',
883 | 'emtushar',
884 | 'snehalbiju12',
885 | 'lakshya05',
886 | 'Shaika07',
887 | 'John339',
888 | 'chetan-v',
889 | 'KrishnaAgarwal3458',
890 | 'rohit-1225',
891 | 'vaibhavjain2099',
892 | 'Pratheekb1',
893 | 'devu2000',
894 | 'Akhil88328832',
895 | 'anupam123148',
896 | 'pramod12345-design',
897 | 'Kartik192192',
898 | 'Kartik-Aggarwal',
899 | 'Ekansh5702',
900 | 'basitali97',
901 | 'TanishqKhetan',
902 | 'deecode15800',
903 | 'Vibhore-7190',
904 | 'Harsh-pj',
905 | 'vishalvishw10',
906 | 'runaljain255',
907 | 'RitikmishraRitik',
908 | 'akashtyagi0008',
909 | 'albert1800',
910 | 'Harsh1388-p',
911 | 'Omkar0104',
912 | 'Lakshitasaini8',
913 | 'vaibhav-87',
914 | 'AshimKr',
915 | 'joshi2727',
916 | 'vihariswamy',
917 | 'Sudhanshu-Srivastava',
918 | 'sameersahoo',
919 | 'YOGENDER-sharma',
920 | 'shashank06-sudo',
921 | 'irramshaiikh',
922 | 'Magnate2213',
923 | 'srishti0801',
924 | 'darshanchau',
925 | 'tanishka1745',
926 | 'Coder00sharma',
927 | 'gariya95',
928 | 'vedanttttt',
929 | 'codecpacka',
930 | 'vijay0960',
931 | 'tanya-98',
932 | 'Tarkeshwar999',
933 | 'RiderX24',
934 | 'BUNNY2210',
935 | 'yuvrajbagale',
936 | 'Pranchalkushwaha',
937 | 'Varun11940',
938 | 'khushhal213',
939 | 'Raulkumar',
940 | 'bekapish',
941 | 'shubhkr1023',
942 | 'mishrasanskriti802',
943 | 'vaibhavimekhe',
944 | 'HardikShreays',
945 | 'ab-rahman92',
946 | 'waytoheaven001',
947 | 'ambrajyaldandi',
948 | '100009224730519',
949 | 'Bikramdas04',
950 | 'mokshkant7',
951 | 'Harshcoder10',
952 | 'hvshete',
953 | 'sanmatipol',
954 | 'polankita',
955 | 'Vinit-Code04',
956 | 'Sheetal0601',
957 | 'harsh123-para',
958 | 'RitikSharma06',
959 | 'pankajmandal1996',
960 | 'AkshayNaphade',
961 | 'KaushalDevrari',
962 | 'ag3n7',
963 | 'SudershanSharma',
964 | 'naturese',
965 | 'Shubham-217',
966 | 'ateef-khan',
967 | 'sharad5987',
968 | 'anmolsahu901',
969 | 'sarkarbibrata',
970 | 'Chandramohan01',
971 | 'RAVI-SHEKHAR-SINGH',
972 | 'vinayak15-cyber',
973 | 'TheWriterSahb',
974 | 'way2dmark',
975 | 'Spramod23',
976 | 'Saurabgami977',
977 | 'doberoi10',
978 | 'Lakshya9425',
979 | 'megha1527',
980 | 'beasttiwari',
981 | 'gtg94',
982 | 'kshingala1',
983 | 'Dshivamkumar',
984 | 'smokkie087',
985 | 'RiserShaikh',
986 | 'explorerAndroid',
987 | 'Grace-Rasaily780',
988 | 'Harshacharya2020',
989 | 'SatvikVirmani',
990 | 'RishabhIshtwal',
991 | 'gargtanuj05',
992 | 'skilleddevil',
993 | 'XAFFI',
994 | 'BALAJIRAO676',
995 | 'neer007-cpu',
996 | 'JiimmyValentine',
997 | 'Dhruv8228',
998 | 'Devendranath-Maddula',
999 | 'abhishekaman3015',
1000 | 'sudhir-12',
1001 | 'Shashi-design',
1002 | 'simplilearns',
1003 | 'ThakurTulsi',
1004 | 'rahulshastryd',
1005 | 'Ankit9915',
1006 | 'afridi1706',
1007 | 'JaySingh23',
1008 | 'DevCode-shreyas',
1009 | 'Shivansh-K',
1010 | 'kikisslass',
1011 | 'swarup4544',
1012 | 'shivam22chaudhary',
1013 | 'smrn54',
1014 | '521ramborahul',
1015 | 'pretechscience',
1016 | 'rudrakj',
1017 | 'janidivy',
1018 | 'SuvarneshKM',
1019 | 'manishsuthar414',
1020 | 'raghavbansal-sys',
1021 | 'GoGi2712',
1022 | 'therikesh',
1023 | 'Anonymouslaj',
1024 | 'devs7122',
1025 | 'icmulnk77',
1026 | 'ankit4-com',
1027 | 'ansh4223',
1028 | 'shudhanshubisht08',
1029 | 'RN-01',
1030 | 'iamsandeepprasad',
1031 | 'neerajd007',
1032 | 'rrishu',
1033 | 'sameer0606',
1034 | 'kunaldhar',
1035 | 'sajal243',
1036 | 'Arsalankhan111',
1037 | 'RavindraPal2000',
1038 | 'shubham5630994',
1039 | 'ankit526',
1040 | 'codewithaniket',
1041 | 'meetpanchal017',
1042 | 'Pranjal1362',
1043 | 'ni30kp',
1044 | 'kushalsoni123',
1045 | 'Nishantcoedtu',
1046 | 'vijaygupta18',
1047 | 'Bishalsharma733',
1048 | 'AnkitaMalviya',
1049 | 'anianiket',
1050 | 'hritik6774',
1051 | 'krongreap',
1052 | 'FlyingwithCaptainSoumya',
1053 | 'himpat202',
1054 | 'mahin651',
1055 | 'mohit-jadhav-mj',
1056 | 'kaushiknyay18',
1057 | 'testinguser883',
1058 | 'MdUmar07',
1059 | 'Saumiya-Ranjan',
1060 | 'cycric',
1061 | 'mandliya456',
1062 | 'kavipss',
1063 | 'Sumit1777',
1064 | 'ankitgusain',
1065 | 'SKamal1998',
1066 | 'Pritam-hrxcoder13',
1067 | 'shruti-coder',
1068 | 'Harshit-techno',
1069 | 'Sanketpatil45',
1070 | 'poojan-26',
1071 | 'Nayan-Sinha',
1072 | 'confievil',
1073 | 'mrkishanda',
1074 | 'abhishek777777777777',
1075 | 'ankitnith99',
1076 | 'Pushkar0',
1077 | 'Sahil-Sinha',
1078 | 'Anantvasu-cyber',
1079 | 'priyanujbd23',
1080 | 'divyanshmalik22',
1081 | 'shreybhan',
1082 | 'nirupam090',
1083 | 'sohail000shaikh',
1084 | 'dhruvvats-011',
1085 | 'ATRI2107',
1086 | 'Harjot9812',
1087 | 'sougata18p',
1088 | 'Amogh6315',
1089 | 'NishanBanga',
1090 | 'SaifVeesar',
1091 | 'edipretoro',
1092 | 'Amit10538',
1093 | 'thewires2',
1094 | 'jaswalsaurabh',
1095 | 'siddh358',
1096 | 'raj074',
1097 | 'Sameer-create',
1098 | 'goderos19',
1099 | 'akash6194',
1100 | 'Ketan19479',
1101 | 'shubham-01-star',
1102 | 'avijitmondal',
1103 | 'khand420',
1104 | 'kasarpratik31',
1105 | 'jayommaniya',
1106 | 'WildCard13',
1107 | 'RishabhAgarwal345',
1108 | 'mukultwr',
1109 | 'Gauravrathi1122',
1110 | 'abhinav-bit',
1111 | 'ShivamBaishkhiyar',
1112 | 'sudip682',
1113 | 'neelshah6892',
1114 | 'archit00007',
1115 | 'Kara3',
1116 | 'Akash5523',
1117 | 'Pranshumehta',
1118 | 'karan97144',
1119 | 'parasraghav288',
1120 | 'codingmastr',
1121 | 'farzi56787',
1122 | 'SAURABHYAGYIK',
1123 | 'faizan7800',
1124 | 'TheBinitGhimire',
1125 | 'anandrathod143',
1126 | 'Jeetrughani',
1127 | 'aaditya2357',
1128 | 'ADDY-666',
1129 | 'kumarsammi3',
1130 | 'prembhatt1916',
1131 | 'Gourav5857',
1132 | 'pradnyaghuge',
1133 | 'Vishal-Aggarwal0305',
1134 | 'prashant-45',
1135 | 'abhishek18002',
1136 | 'Deadlynector',
1137 | 'ashishjangir02082001',
1138 | 'RohitSingh04',
1139 | 'Satyamtechy',
1140 | 'shreyukashid',
1141 | 'M-ux349',
1142 | 'Riya123cloud',
1143 | 'coder-beast-78',
1144 | 'mrmaxx010204',
1145 | 'npdoshi5',
1146 | 'gobar07',
1147 | 'rushi1313',
1148 | 'Akashsah312',
1149 | 'pksinghal585',
1150 | 'rockyfarhan',
1151 | 'JayeshDehankar',
1152 | 'sarap224',
1153 | 'yash752004',
1154 | 'rohan241119',
1155 | 'Nick-h4ck3r',
1156 | 'abhishekA07',
1157 | 'cjjain76',
1158 | 'CodeWithYashraj',
1159 | 'dkp888',
1160 | 'rahil003',
1161 | 'sachin694',
1162 | 'Anjali0369',
1163 | 'sumeet004',
1164 | 'aryan1256',
1165 | 'PNSuchismita',
1166 | 'shash2407',
1167 | 'Tanishk007',
1168 | 'Yugalbuddy',
1169 | 'Saurabh392',
1170 | 'Saurabh299',
1171 | 'DevanshGupta15',
1172 | 'DeltaxHamster',
1173 | 'darpan45',
1174 | 'P-cpu',
1175 | 'singhneha94',
1176 | 'Nitish-McQueen',
1177 | 'GRACEMARYMATHEW',
1178 | 'ios-shah',
1179 | 'Divanshu2402',
1180 | 'asubodh',
1181 | 'CypherAk007',
1182 | 'nethracookie',
1183 | 'guptaji609',
1184 | 'thishantj',
1185 | 'shivamsaini89',
1186 | 'AntLab04',
1187 | 'bit2u',
1188 | 'AbhishekTiwari72',
1189 | 'shreyashkharde',
1190 | 'PrabhatP2000',
1191 | 'amansahani60',
1192 | 'shubham5888',
1193 | 'Ashutoshkrs',
1194 | 'scratcher007lakshya',
1195 | 'SumitRodrigues',
1196 | 'Harishit1466',
1197 | 'Gouravbhardwaj1',
1198 | 'shraiyya',
1199 | 'SpooderManEXE',
1200 | 'thelinuxboy',
1201 | 'jamnesh',
1202 | 'Nilesh425',
1203 | 'machinegun20000',
1204 | 'Brianodroid',
1205 | 'sunnyjohari',
1206 | 'TusharThakkar13',
1207 | 'juned06',
1208 | 'bindu-07',
1209 | 'gautamsharma17',
1210 | 'sonamvlog',
1211 | 'iRajMishra',
1212 | 'ayushgupta1915',
1213 | 'Joker9050',
1214 | 'Aakash1720',
1215 | 'sakshiii-bit',
1216 | 'mpsapps',
1217 | 'deadshot9987',
1218 | 'RobinKumar5986',
1219 | 'thiszsachin',
1220 | 'karanjoshi1206',
1221 | 'sumitsisodiya',
1222 | 'akashnavale18',
1223 | 'spmhot',
1224 | 'ashutoshhack',
1225 | 'shivamupasanigg',
1226 | 'rajaramrom',
1227 | 'vksvikash85072',
1228 | 'mohitkedia-github',
1229 | 'vanshdeepcoder',
1230 | 'rkgupta95',
1231 | 'sushilmangnlae',
1232 | 'Prakashmishra25',
1233 | 'YashPatelH',
1234 | 'prakash-jayaswal-au6',
1235 | 'AnayAshishBhagat',
1236 | 'Indian-hacker',
1237 | 'ishaanbhardwaj',
1238 | 'nish235',
1239 | 'shubhampatil9125',
1240 | 'Ankush-prog',
1241 | 'Arpus87',
1242 | 'kuldeepborkarjr',
1243 | 'rajibbera',
1244 | 'kt96914',
1245 | 'nithubcode',
1246 | 'ishangoyal8055',
1247 | 'Samirbhajipale',
1248 | 'AnshKumar200',
1249 | 'salmansalim145',
1250 | 'SAWANTHMARINGANTI',
1251 | 'ankitts12',
1252 | 'ketul2912',
1253 | 'kdj309',
1254 | 'nsundriyal62',
1255 | 'manishsingh003',
1256 | 'Deepak-max800',
1257 | 'magicmasti428',
1258 | 'sidharthpunathil',
1259 | 'shyamal2411',
1260 | 'auravgv',
1261 | 'MrIconic27',
1262 | 'anku-11-11',
1263 | 'Suyashendra',
1264 | 'WarriorSdg',
1265 | 'pythoniseasy-hub',
1266 | 'Nikk-code',
1267 | 'Kutubkhan2005',
1268 | 'kunal4421',
1269 | 'apoorva1823000',
1270 | 'singharsh0',
1271 | 'sushobhitk',
1272 | 'NavidMansuri5155',
1273 | 'tanav8570',
1274 | 'Durveshpal',
1275 | 'dkishere2021',
1276 | 'shubhamraj01',
1277 | 'manthan14448',
1278 | 'sahilmandoliya',
1279 | 'Dewakarsonusingh',
1280 | 'kalpya123',
1281 | '9075yash',
1282 | 'Aditya7851-AdiStarCoders',
1283 | 'MrChau',
1284 | 'ooyeayush',
1285 | 'Vipinkumar12it',
1286 | 'ayushyadav2001',
1287 | 'akshay20105',
1288 | 'prothehero',
1289 | 'sam007143',
1290 | 'subhojit75',
1291 | 'Dhvanil25',
1292 | 'ANKUSHSINGH-PAT',
1293 | 'Apoorva-Shukla',
1294 | 'GizmoGamingIn',
1295 | 'Mahaveer173',
1296 | 'Abhayrai778',
1297 | 'adityarawat007',
1298 | 'HarshKumar2001',
1299 | 'mohitboricha',
1300 | 'deepakpate07',
1301 | 'Aish-18',
1302 | 'Sakshi-2100',
1303 | 'adarshdwivedi123',
1304 | 'shubhamprakhar',
1305 | 'Basir56',
1306 | 'zerohub23',
1307 | 'Shrish072003',
1308 | 'yash3497',
1309 | 'Alfax14910',
1310 | 'khushboo-lab',
1311 | 'Devam-Vyas',
1312 | 'PPS-H',
1313 | 'nimitshrestha',
1314 | 'sunnythepatel',
1315 | 'Tusharkumarofficial',
1316 | 'Nikhilmadduri',
1317 | 'hiddenGeeks',
1318 | 'dearyash',
1319 | 'shahvihan',
1320 | 'BlackThor555',
1321 | 'preetamsatpute555',
1322 | 'RanniePavillon',
1323 | 'dgbkn',
1324 | 'Karan-Agarwal1',
1325 | 'praanjaal-guptaa',
1326 | 'Cha7410',
1327 | 'ar2626715',
1328 | 'suhaibshaik',
1329 | 'gurkaranhub',
1330 | 'Guptaji29',
1331 | 'seekNdestory',
1332 | 'gorujr',
1333 | 'lokeshbramhe',
1334 | 'Rakesh-roy',
1335 | 'NKGupta07',
1336 | 'hacky503boy',
1337 | 'Harshit-Taneja',
1338 | 'vishal3308',
1339 | 'vibhor828',
1340 | 'rabi477',
1341 | 'ArinTyagi',
1342 | 'RaviMahile',
1343 | 'Ayushgreeshu',
1344 | 'Deepak674',
1345 | 'VikashAbhay',
1346 | 'paddu-sonu',
1347 | 'swapnil-morakhia',
1348 | 'anshu7919',
1349 | 'vickyshaw29',
1350 | 'pawan941394',
1351 | 'mayankrai123',
1352 | 'riodelord',
1353 | 'iamsmr',
1354 | 'ramkrit',
1355 | 'vijayjha15',
1356 | 'Anurag346',
1357 | 'vineetstar10',
1358 | 'Amarjeetsingh6120000',
1359 | 'ayush9000',
1360 | 'staticman-net',
1361 | 'piyush4github',
1362 | 'Neal-01',
1363 | 'sky00099',
1364 | 'cjheath',
1365 | 'pranavstar-1203',
1366 | 'sjwarner',
1367 | 'Sandeepana',
1368 | 'ritikrkx21',
1369 | 'alinasahoo',
1370 | 'tech-vin',
1371 | 'Atul-steamcoder',
1372 | 'ranchodhamala11',
1373 | 'pradnyahaval',
1374 | 'Nishant2911',
1375 | 'altaf71mansoori',
1376 | 'codex111',
1377 | 'anirbandey303',
1378 | 'kishan-kushwaha',
1379 | 'ashwinthomas28',
1380 | 'adityasunny1189',
1381 | 'sourav1122',
1382 | 'Hozefa976',
1383 | 'PratapSaren',
1384 | 'vikram-3118',
1385 | 'Deep22T',
1386 | 'sidd4999',
1387 | 'agrawalvinay699',
1388 | 'anujsingh1913',
1389 | 'SoniHariom555',
1390 | 'AyushJoshi2001',
1391 | 'barinder7',
1392 | 'shishir-m98',
1393 | 'abhishekkrdev',
1394 | 'pmanaktala',
1395 | 'Snehil101',
1396 | 'Himanshsingh0753',
1397 | 'sambhav2898',
1398 | 'niteshsharma9',
1399 | 'x-thompson3',
1400 | 'Vipul-hash',
1401 | 'MrityunjayR',
1402 | 'Abhinav7272',
1403 | 'prashant-pbh',
1404 | 'Saswat-Gewali',
1405 | 'Redcloud2020-coder',
1406 | 'priyanka-prasad1',
1407 | 'harshwardhan111',
1408 | 'Rajendra-banna',
1409 | 'Rajan24032000',
1410 | 'Mariede',
1411 | 'sakshi-jain24',
1412 | 'arron-hacker',
1413 | 'Aniket-ind',
1414 | 'Devloper-Adil',
1415 | 'Shubh2674',
1416 | 'saloninahar',
1417 | 'DipNkr',
1418 | 'princekumar6',
1419 | 'harshsingh121098',
1420 | 'Rajneesh486Git',
1421 | 'jitendragangwar',
1422 | 'Jayesh-Kumar-Yadav',
1423 | 'shudhii',
1424 | 'Bishal-bit',
1425 | 'sulemangit',
1426 | 'Kushagra767',
1427 | 'JSM2512',
1428 | 'ovs1176',
1429 | 'arfakl99',
1430 | 'Premkr1110',
1431 | 'YASH162',
1432 | 'rp-singh1994',
1433 | 'Deepu10172j',
1434 | 'raghavk911',
1435 | 'HardikN19',
1436 | 'Gari1309',
1437 | 'eklare19',
1438 | 'rohitmore1012',
1439 | 'Aabhash007',
1440 | 'mohitsaha123',
1441 | 'Bhagirath043',
1442 | 'surajphulara',
1443 | 'shaurya127',
1444 | 'shubzzz98',
1445 | 'mkarimi-coder',
1446 | 'sakshi0309-champ',
1447 | 'shivam623623',
1448 | 'cheekudeveloper',
1449 | 'Ashutosh-98765',
1450 | 'Vaibhavipadamwar',
1451 | 'shwetashrei',
1452 | 'Banashree19',
1453 | 'atharvashinde01',
1454 | 'PrashantMehta-coder',
1455 | 'kajolkumari150',
1456 | 'Aqdashashmii',
1457 | 'joyskmathew',
1458 | 'pkkushagra',
1459 | 'Rishrao09',
1460 | 'Ashutoshrastogi02',
1461 | 'JatulCodes',
1462 | 'agarwals368',
1463 | 'praveenbhardwaj',
1464 | 'hardik302001',
1465 | 'jagannathbehera444',
1466 | 'jubyer00',
1467 | 'SouravSarkar7',
1468 | 'neerajsins',
1469 | 'Rasam22',
1470 | 'pk-bits',
1471 | 'asawaronit60',
1472 | 'anupama-nicky',
1473 | 'Kishan-Kumar-Kannaujiya',
1474 | 'carrycooldude',
1475 | 'parasjain99',
1476 | 'vishwatejharer',
1477 | 'sayon-islam-23',
1478 | 'sidhu56',
1479 | 'Diwakarprasadlp',
1480 | 'hashim361',
1481 | 'Anantjoshie',
1482 | 'bankateshkr',
1483 | 'Mayank2001kh',
1484 | 'RoyNancy',
1485 | 'ayushsagar10',
1486 | 'jaymishra2002',
1487 | 'Anushka004',
1488 | 'naitik-23',
1489 | 'meraj97',
1490 | 'gagangupta07',
1491 | 'stark829',
1492 | 'Muskan761',
1493 | 'MrDeepakY',
1494 | 'NayanPrakash11',
1495 | 'shawnfrost69',
1496 | 'thor174',
1497 | 'Sumeet2442',
1498 | 'ummekulsum123',
1499 | 'akarsh2312',
1500 | 'hemantmakkar',
1501 | 'bardrock01',
1502 | 'MrunalHole',
1503 | 'chetanrakhra',
1504 | 'pratik821',
1505 | 'rahulkz',
1506 | 'Akhilesh-ingle',
1507 | 'pruthvi3007',
1508 | 'Vanshi1999',
1509 | 'sagarkb',
1510 | 'CoderRushil',
1511 | 'Shivansh2200',
1512 | 'Ronak14999',
1513 | 'srishtiaggarwal',
1514 | 'adityakumar48',
1515 | 'piyushchandana',
1516 | 'Piyussshh',
1517 | 'priyank-di',
1518 | 'Vishwajeetbamane',
1519 | 'moto-pixel',
1520 | 'madmaxakshay',
1521 | 'James-HACK',
1522 | 'vikaschamyal',
1523 | 'Arkadipta14',
1524 | 'Abhishekk2000',
1525 | 'Sushant012',
1526 | 'Quint-Anir',
1527 | 'navaloli',
1528 | 'ronitsingh1405',
1529 | 'vanshu25',
1530 | 'samueldenzil',
1531 | 'akashrajput25',
1532 | 'sidhi100',
1533 | 'ShivtechSolutions',
1534 | 'vimal365',
1535 | 'master77229',
1536 | 'Shubham-Khetan-2005',
1537 | 'vaishnavi-1',
1538 | 'AbhijithSogal',
1539 | 'Sid133',
1540 | 'white-devil123',
1541 | 'bawa2510',
1542 | 'anjanikshree12',
1543 | 'mansigupta1999',
1544 | 'hritik229',
1545 | 'engineersonal',
1546 | 'adityaadg1997',
1547 | 'mansishah20',
1548 | '2shuux',
1549 | 'Nishthajosh',
1550 | 'ParthaDe94',
1551 | 'abhi-io',
1552 | 'Neha-119',
1553 | 'Dungeonmaster07',
1554 | 'Prathu121',
1555 | 'anishloop7',
1556 | 'cwmohit',
1557 | 'shivamsri142',
1558 | 'Sahil9511',
1559 | 'NIKHILAVISHEK',
1560 | 'amitpaswan9',
1561 | 'devsharmaarihant',
1562 | 'bilal509',
1563 | 'BrahmajitMohapatra',
1564 | 'rebelpower',
1565 | 'Biswajitpradhan',
1566 | 'sudhirhacker999',
1567 | 'pydevtanya',
1568 | 'Ashutosh147',
1569 | 'jayeshmishra',
1570 | 'rahul97407',
1571 | 'athar10y2k',
1572 | 'mrvasani48',
1573 | 'raiatharva',
1574 | 'Arj09',
1575 | 'manish-109',
1576 | 'aishwarya540',
1577 | 'mohitjoshi81',
1578 | 'PrathamAditya',
1579 | 'K-Adrenaline',
1580 | 'mrvlsaf',
1581 | 'shivam9599',
1582 | 'souravnitkkr',
1583 | 'Anugya-Gogoi',
1584 | 'AdityaTiwari64',
1585 | 'yash623623',
1586 | 'anjanik807',
1587 | 'ujjwal193',
1588 | 'TusharKapoor24',
1589 | 'Ayushman278',
1590 | 'osama072',
1591 | 'aksahoo-1097',
1592 | 'kishan-31802',
1593 | 'Roshanpaswan',
1594 | 'Himanshu-Prajapati',
1595 | 'satyamraj48',
1596 | 'NEFARI0US',
1597 | 'kavitsheth',
1598 | 'kushagra-18',
1599 | 'khalane1221',
1600 | 'ravleenkaur8368',
1601 | 'Himanshu9430',
1602 | 'uttam509',
1603 | 'CmeherGit',
1604 | 'sid5566',
1605 | 'devaryan12123',
1606 | 'ishanchoudhry',
1607 | 'himanshu70043',
1608 | 'skabhi001',
1609 | 'tekkenpro',
1610 | 'sandip1911',
1611 | 'HarshvardhnMishra',
1612 | 'krunalrocky',
1613 | 'rohitkr-07',
1614 | 'anshulgarg1234',
1615 | 'hacky502boy',
1616 | 'vivek-nagre',
1617 | 'Hsm7085',
1618 | 'amazingmj',
1619 | 'Rbsingh9111',
1620 | 'ronupanchal',
1621 | 'mohitcodeshere',
1622 | '1741Rishabh',
1623 | 'Cypher2122',
1624 | 'SahilDiwakar',
1625 | 'abhigyan1000',
1626 | 'HimanshuSharma5280',
1627 | 'ProgrammerHarsh',
1628 | 'Amitamit789',
1629 | 'swapnilmutthalkar',
1630 | 'enggRahul8git',
1631 | 'BhuvnendraPratapSingh',
1632 | 'Ronak1958',
1633 | 'Knight-coder',
1634 | 'Faizu123',
1635 | 'shivansh987',
1636 | 'mrsampage',
1637 | 'AbhishikaAgarwal',
1638 | 'Souvagya-Nayak',
1639 | 'harsh287',
1640 | 'Staryking',
1641 | 'rmuliterno',
1642 | 'kunjshah0703',
1643 | 'KansaraPratham',
1644 | 'GargoyleKing2112',
1645 | 'Tanu-creater',
1646 | 'satvikmittal638',
1647 | 'gauravshinde-7',
1648 | 'saabkapoor36',
1649 | 'devangpawar',
1650 | 'RiddhiCoder',
1651 | 'Bilalrizwaan',
1652 | 'sayyamjain78',
1653 | '2606199',
1654 | 'mayuresh4700',
1655 | 'umang171',
1656 | 'kramit9',
1657 | 'surendraverma1999',
1658 | 'raviu773986',
1659 | 'Codewithzaid',
1660 | 'Souvik-Bose-199',
1661 | 'BeManas',
1662 | 'JKHAS786',
1663 | 'MrK232',
1664 | 'aaryannipane',
1665 | 'bronzegamer',
1666 | 'hardikkushwaha',
1667 | 'Anurag931999',
1668 | 'dhruvalgupta2003',
1669 | 'kaushal7806',
1670 | 'JayGupta6866',
1671 | 'mayank161001',
1672 | 'ShashankPawsekar',
1673 | '387daksh',
1674 | 'Susanta-Nayak',
1675 | 'Pratik-11',
1676 | 'Anas-S-Shaikh',
1677 | 'marginkantilal',
1678 | 'Brijbihari24',
1679 | 'Deepanshu761',
1680 | 'Aakashlifehacker',
1681 | 'SaketKaswa',
1682 | 'dhritiduttroy',
1683 | 'astitvagupta31',
1684 | 'Prakhyat-Srivastava',
1685 | 'Puneet405',
1686 | 'harsh2630',
1687 | 'sds9639',
1688 | 'Prajwal38',
1689 | 'simransharmarajni',
1690 | 'Naman195',
1691 | 'patience0721',
1692 | 'Aman6651',
1693 | 'tyagi1558',
1694 | 'kmannnish',
1695 | 'victorwpbastos',
1696 | 'sagnik403',
1697 | 'rahuly5544',
1698 | 'PrinceKumarMaurya591',
1699 | 'nakulwastaken',
1700 | 'janmejayamet',
1701 | 'HimanshuGupta11110000',
1702 | 'Akshatcodes21',
1703 | 'IRFANSARI',
1704 | 'shreya991',
1705 | 'pavan109',
1706 | 'Parth00010',
1707 | 'itzUG',
1708 | 'Mayank-choudhary-SF',
1709 | 'shubhamborse',
1710 | 'Courage04',
1711 | 'techsonu160',
1712 | 'shivamkonkar',
1713 | 'ErMapsh',
1714 | 'roshan-githubb',
1715 | 'Gourav502',
1716 | 'SauravMiah',
1717 | 'nikhil609',
1718 | 'BenzylFernandes',
1719 | 'BarnakGhosh',
1720 | 'Aanchalgarg343',
1721 | 'Madhav12345678',
1722 | 'Tirth11',
1723 | 'bhavesh1456',
1724 | 'ajeet323327',
1725 | 'AmitNayak9',
1726 | 'lalitchauhan2712',
1727 | 'raviroshan224',
1728 | 'hellmodexxx',
1729 | 'Dhruv1501',
1730 | 'Himanshu6003',
1731 | 'mystery2828',
1732 | 'waris89',
1733 | '2303-kanha',
1734 | 'Anshuk-Mishra',
1735 | 'amandeeptiwari22',
1736 | 'Shashikant9198',
1737 | 'Adityacoder99',
1738 | 'Pradeepsharma7447',
1739 | 'varunreddy57',
1740 | 'uddeshaya',
1741 | 'Priyanka0310-byte',
1742 | 'adharsidhantgupta',
1743 | 'Bhupander7',
1744 | 'NomanSubhani',
1745 | 'umeshkv2',
1746 | 'Debosmit-Neogi',
1747 | 'bhaktiagrawal088',
1748 | 'Aashishsharma99',
1749 | 'G25091998',
1750 | 'mdkaif25',
1751 | 'raj-jetani',
1752 | 'chetanpujari5105',
1753 | 'Agrawal-Rajat',
1754 | 'Parthkrishnan',
1755 | 'sameer-15',
1756 | 'HD-Harsh-Doshi',
1757 | 'Anvesha',
1758 | 'karanmankoliya',
1759 | 'armandatt',
1760 | 'DakshSinghalIMS',
1761 | 'Bhavyyadav25',
1762 | 'surya123-ctrl',
1763 | 'shubhambhawsar-5782',
1764 | 'PAWANOP',
1765 | 'mohit-singh-coder',
1766 | 'Mradul-Hub',
1767 | 'babai1999',
1768 | 'Ritesh4726',
1769 | 'Anuj-Solanki',
1770 | 'abhi04neel',
1771 | 'yashshahah',
1772 | 'yogendraN27',
1773 | 'Rishabh23-thakur',
1774 | 'Indhralochan',
1775 | 'harshvaghani',
1776 | 'dapokiya',
1777 | 'pg00019',
1778 | 'AMITPKR',
1779 | 'pawarrahul1002',
1780 | 'mrgentlemanus',
1781 | 'anurag-sonkar',
1782 | 'aalsicoder07',
1783 | 'harsh2699',
1784 | 'Rahilkaxi',
1785 | 'Jyotindra-21',
1786 | 'dhruvilmehta',
1787 | 'jacktherock',
1788 | 'helpinubcomgr8',
1789 | 'spcrze',
1790 | 'aman707f',
1791 | 'Nikkhil-J',
1792 | 'Poonam798',
1793 | 'devyansh2006',
1794 | 'amanpj15',
1795 | 'rudrcodes',
1796 | 'STREIN-max',
1797 | 'Adarsh-kushwaha',
1798 | 'adxsh',
1799 | 'Mohnish7869',
1800 | 'Mrpalash',
1801 | 'umangpincha',
1802 | 'aniket1399',
1803 | 'Sudip843',
1804 | 'Amartya-Srivastav',
1805 | 'Ananda1113',
1806 | 'nobbitaa',
1807 | 'shahmeet79',
1808 | 'AmitM56',
1809 | 'jiechencn',
1810 | 'devim-stuffs',
1811 | 'bkobl',
1812 | 'kavindyasinthasilva',
1813 | 'MochamadAhya29',
1814 | 'misbagas',
1815 | 'ksmarty',
1816 | 'vedikaag99',
1817 | 'nongshaba1337',
1818 | 'daiyi',
1819 | 'Saturia',
1820 | 'llfj',
1821 | '312494845',
1822 | 'DeadPackets',
1823 | 'Pandorax41',
1824 | 'Kritip123',
1825 | 'poburi',
1826 | 'hffkb',
1827 | 'cybrnook',
1828 | 'lichaonetuser',
1829 | 'l-k-a-m-a-z-a',
1830 | 'zhaoshengweifeng',
1831 | 'staticman-peoplesoftmods',
1832 | 'ikghx',
1833 | 'uguruyar',
1834 | '513439077',
1835 | 'f4nff',
1836 | 'samspei0l',
1837 | 'Seminlee94',
1838 | 'inflabz',
1839 | 'jack1988520',
1840 | 'lanfenglin',
1841 | 'sujalgoel',
1842 | 'foldax',
1843 | 'corejava',
1844 | 'DarkReitor',
1845 | 'amirpourastarabadi',
1846 | 'Raess-rk1',
1847 | 'ankit0183',
1848 | 'jurandy007',
1849 | 'davidbarratt',
1850 | 'bertonjulian',
1851 | 'TMFRook',
1852 | 'qhmdi',
1853 | 'QairexStudio',
1854 | 'XuHewen',
1855 | 'happyxhw',
1856 | 'Mokaz24',
1857 | 'andyteq',
1858 | 'Grommish',
1859 | 'fork-bombed',
1860 | 'AZiMiao1122',
1861 | '61569864',
1862 | 'jeemgreen234',
1863 | 'IgorKowalczykBot',
1864 | 'sirpdboy',
1865 | 'fjsnogueira',
1866 | '9000000',
1867 | 'ascott',
1868 | 'aparcar',
1869 | 'void9main',
1870 | 'gerzees',
1871 | 'javadnew5',
1872 | 'belatedluck',
1873 | 'calmsacibis995',
1874 | 'maciejSamerdak',
1875 | 'ghostsniper2018',
1876 | 'rockertinsein',
1877 | 'divarjahan',
1878 | 'skywalkerEx',
1879 | 'ehack-italy',
1880 | 'Cloufish',
1881 | 'aasoares',
1882 | 'mustyildiz',
1883 | 'Ras7',
1884 | 'philly12399',
1885 | 'cuucondiep',
1886 | 'Nomake',
1887 | 'z306334796',
1888 | 'ball144love',
1889 | 'armfc6161',
1890 | 'Alex-coffen',
1891 | 'rodrigodesouza07',
1892 | 'lss182650',
1893 | 'iphotomoto',
1894 | 'overlordsaten',
1895 | 'miaoshengwang',
1896 | 'ManiakMCPE',
1897 | 'Yazid0540570463',
1898 | 'unnamegeek',
1899 | 'brennvika',
1900 | 'ardi66',
1901 | 'Cheniour10',
1902 | 'lxc1121',
1903 | 'rfm-bot',
1904 | 'cornspig',
1905 | 'jedai47',
1906 | 'ignotus09',
1907 | 'kamal7641',
1908 | 'Dabe11',
1909 | 'dgder0',
1910 | 'Nerom',
1911 | 'luixiuno',
1912 | 'zh610902551',
1913 | 'wifimedia',
1914 | 'mjoelmendes',
1915 | 'pc2019',
1916 | 'hellodong',
1917 | 'lkfete',
1918 | 'a7raj',
1919 | 'willquirk',
1920 | 'xyudikxeon1717171717',
1921 | '420hackS',
1922 | 'mohithpokala',
1923 | 'tranglc',
1924 | 'ilyankou',
1925 | 'hhmaomao',
1926 | 'hongjuzzang',
1927 | 'Mophee-ds',
1928 | 'wetorek',
1929 | 'apktesl',
1930 | 'jaylac2000',
1931 | 'BishengSJTU',
1932 | 'elfring',
1933 | 'ThomasGrund',
1934 | 'coltonios',
1935 | 'kouhe3',
1936 | 'balaji-29',
1937 | 'demo003',
1938 | 'gfsupport',
1939 | 'AlonzoLax',
1940 | 'tazmanian-hub',
1941 | 'qwerttvv',
1942 | 'kotucocuk',
1943 | 'ajnair100',
1944 | 'jirayutza1',
1945 | 'karolsw3',
1946 | 'shenzt68',
1947 | 'xpalm',
1948 | 'adamwebrog',
1949 | 'jackmahoney',
1950 | 'chenwangnec',
1951 | 'hanlihanshaobo',
1952 | 'jannik-mohemian',
1953 | 'Pablosky12',
1954 | '95dewadew',
1955 | 'dcharbonnier',
1956 | 'chapmanvoris',
1957 | 'nishantingle999',
1958 | 'gulabraoingle',
1959 | 'kalyaniingle',
1960 | 'BoulavardDepo',
1961 | 'amingoli78',
1962 | 'daya2940',
1963 | 'roaddogg2k2',
1964 | 'AmbroseRen',
1965 | 'jayadevvasudevan',
1966 | 'pambec',
1967 | 'orditeck',
1968 | 'muhammetcan34',
1969 | 'Aman199825',
1970 | 'hyl946',
1971 | 'CyberSecurityUP',
1972 | 'kokum007',
1973 | 'shivamjaiswal64',
1974 | 'Skub123',
1975 | 'KerimG',
1976 | 'thehexmor',
1977 | 'jakaya123',
1978 | 'Ashish24788',
1979 | 'qhuy1501',
1980 | 'TranVanDinh235',
1981 | 'Thuong1998',
1982 | 'TranTheTuan',
1983 | 'anhtuyenuet',
1984 | 'tranhuongk',
1985 | 'danhquyen0109',
1986 | 'hunghv-0939',
1987 | 'dat-lq-234',
1988 | 'nguyenducviet1999',
1989 | 'Rxzzma',
1990 | 'MrRobotjs',
1991 | 'jonschlinkert',
1992 | 'awsumbill',
1993 | 'lastle',
1994 | 'gaga227',
1995 | 'maiquangminh',
1996 | 'andhie-wijaya',
1997 | 'penn5',
1998 | 'FormosaZh',
1999 | 'itz63c',
2000 | 'AvinashReddy3108',
2001 | 'ferchlam',
2002 | 'noobvishal',
2003 | 'ammarraisafti',
2004 | 'authenticatorbot',
2005 | 'SekiBetu',
2006 | 'markkap',
2007 | 'wyd6295578sk',
2008 | 'lorpus',
2009 | 'Camelsvest',
2010 | 'ben-august',
2011 | 'jackytang',
2012 | 'dominguezcelada',
2013 | 'tony1016',
2014 | 'afuerhoff420',
2015 | 'darkoverlordofdata',
2016 | 'yihanwu1024',
2017 | 'bromiao',
2018 | 'MaxEis',
2019 | 'kyf15596619',
2020 | 'Reysefyn',
2021 | 'THEROCK2512',
2022 | 'Krystool',
2023 | 'Adomix',
2024 | 'splexpe',
2025 | 'hugetiny',
2026 | 'mikeLongChen',
2027 | 'KlansyMsniv',
2028 | 'Anony1234mo',
2029 | 'Mygod',
2030 | 'chenzesam',
2031 | 'vatayes',
2032 | 'fisher134',
2033 | 'bmaurizio',
2034 | 'fire-bot',
2035 | 'kjbot-github',
2036 | 'Dcollins66',
2037 | 'dislash',
2038 | 'noraj',
2039 | 'theLSA',
2040 | 'chadyj',
2041 | 'AlbertLiu-Breeze',
2042 | 'jspspike',
2043 | 'kill5Witchd',
2044 | 'repushko',
2045 | 'ankushshekhawat',
2046 | 'karan1dhir',
2047 | 'venkatvani',
2048 | 'tracyxiong1',
2049 | 'PythxnBite',
2050 | 'vamshi0997',
2051 | 'himanshu345',
2052 | 'prabhat2001',
2053 | 'aakar345',
2054 | 'rangers9708',
2055 | 'anuragiiitm',
2056 | 'AlfieBurns12345678910',
2057 | 'marpernas',
2058 | 'jrcole2884',
2059 | 'deshanjali',
2060 | 'alekh42',
2061 | 'deepakgangore',
2062 | 'SuperBeagleDog',
2063 | 'vasiliykovalev',
2064 | 'lyin888',
2065 | 'tchainzzz',
2066 | 'Theoask',
2067 | 'jnikita356',
2068 | 'ajay1706',
2069 | 'gane5hvarma',
2070 | 'pbhavesh2807',
2071 | 'daniloeler',
2072 | 'gabrielrab',
2073 | 'djdamian210',
2074 | '1samuel411',
2075 | 'Apoorv1',
2076 | 'AnimatedAnand',
2077 | '7coil',
2078 | 'trentschnee',
2079 | 'himanshu435',
2080 | 'dialv',
2081 | 'DHRUV536',
2082 | 'pratyushraj01',
2083 | 'vedantv',
2084 | 'yusronrizki',
2085 | 'joaoguazzelli',
2086 | 'pradnyesh45',
2087 | 'aneeshaanjali',
2088 | 'iREDMe',
2089 | 'ashish010598',
2090 | 'abhi1998das',
2091 | 'keshriraj7870',
2092 | 'vishad2',
2093 | 'Navzter',
2094 | 'jagadyudha',
2095 | 'hrom405',
2096 | 'seferov',
2097 | 'umeshdhauni',
2098 | 'sakshamkhurana97',
2099 | 'ThatNerdyPikachu',
2100 | 'dishantsethi',
2101 | 'tharindumalshan1',
2102 | 'ruderbytes',
2103 | 'pr-jli',
2104 | '21RachitShukla',
2105 | 'fellipegs',
2106 | 'foolbirds',
2107 | 'hariprasetia',
2108 | 'tanyaagrawal1006',
2109 | 'Gaurav1309Goel',
2110 | 'vidurathegeek',
2111 | 'wolfsoldier47',
2112 | 'bhaskar24',
2113 | 'thedutchruben',
2114 | 'Qoyyuum',
2115 | 'msdeibel',
2116 | 'Nann',
2117 | 'bksahu',
2118 | 'sathyamoorthyrr',
2119 | 'sbenstewart',
2120 | 'supriyanta',
2121 | 'MasterKN48',
2122 | 'prkhrv',
2123 | 'Blatantz',
2124 | 'rahulgoyal911',
2125 | 'ranyejun',
2126 | 'decpr',
2127 | 'apollojoe',
2128 | 'SuperAdam47',
2129 | 'RootUp',
2130 | 'llronaldoll',
2131 | 'jayadeepgilroy',
2132 | 'Arunthomas1105',
2133 | 'zhanwenzhuo-github',
2134 | 'dennisslol006',
2135 | 'xFreshie',
2136 | 'servantthought',
2137 | 'Geilivable',
2138 | 'xushet',
2139 | 'order4adwriter',
2140 | 'dubrovka',
2141 | 'Nmeyers75',
2142 | 'p3p5170',
2143 | 'yangkun6666',
2144 | 'knight6414',
2145 | 'nailanawshaba',
2146 | 'tuhafadam',
2147 | 'stainbank',
2148 | '52fhy',
2149 | 'jiyanmizah',
2150 | 'iotsys',
2151 | 'zhangxiao921207',
2152 | 'empsmoke',
2153 | 'asugarr',
2154 | 'Amonhuz',
2155 | 'VinayaSathyanarayana',
2156 | 'html5lover',
2157 | 'peterambrozic',
2158 | 'maomaodegushi',
2159 | 'ShelbsLynn',
2160 | 'AmmarAlzoubi',
2161 | 'AlessioPellegrini',
2162 | 'tetroider',
2163 | '404-geek',
2164 | 'mohammed078',
2165 | 'sugus25',
2166 | 'mxdi9i7',
2167 | 'sahilmalhotra24',
2168 | 'furqanhaidersyed',
2169 | 'ChurchCRMBugReport',
2170 | 'shivamkapoor3198',
2171 | 'wulongji2016',
2172 | 'jjelschen',
2173 | 'bj2015',
2174 | 'tangxuelong',
2175 | 'gunther-bachmann',
2176 | 'marcos-tomaz',
2177 | 'anette68',
2178 | 'techiadarsh',
2179 | 'nishantmadu',
2180 | 'Nikhil2508',
2181 | 'anoojlal',
2182 | 'krischoi07',
2183 | 'utkarshyadavin',
2184 | 'amanPanth',
2185 | 'chinurox',
2186 | 'syedbilal5000',
2187 | 'NidPlays',
2188 | 'jirawat050',
2189 | 'RealAnishSharma',
2190 | 'bwegener',
2191 | 'whyisjacob',
2192 | 'naveenpucha8',
2193 | 'ronaksakhuja',
2194 | 'ju3tin',
2195 | 'DT9',
2196 | 'dorex22',
2197 | 'hiendinhngoc',
2198 | 'mlkorra',
2199 | 'Christensenea',
2200 | 'Mouse31',
2201 | 'VeloxDevelopment',
2202 | 'parasnarang1234',
2203 | 'beilo',
2204 | 'armagadon159753',
2205 | 'andrewducker',
2206 | 'NotMainScientist',
2207 | 'alterem',
2208 | 'MilkAndCookiz',
2209 | 'Justinshakes',
2210 | 'TheColdVoid',
2211 | 'falconxunit',
2212 | '974648183',
2213 | 'minenlink',
2214 | 'thapapinak',
2215 | 'lianghuacheng',
2216 | 'ben3726',
2217 | 'BjarniRunar',
2218 | 'Taki21',
2219 | 'zsytssk',
2220 | 'Apple240Bloom',
2221 | 'shubham436',
2222 | 'LoOnyBiker',
2223 | 'uasi',
2224 | 'wailoamrani',
2225 | 'AnimeOverlord7',
2226 | 'zzyzy',
2227 | 'ignitete',
2228 | 'vikstrous',
2229 | 's5s5',
2230 | 'tianxingvpn',
2231 | 'talib1410',
2232 | 'vinymv',
2233 | 'yerikyy',
2234 | 'Honsec',
2235 | 'chesterwang',
2236 | 'perryzou',
2237 | 'Meprels',
2238 | 'mfat',
2239 | 'mo-han',
2240 | 'roganoalien',
2241 | 'amoxicillin',
2242 | 'AbelLai',
2243 | 'whatisgravity',
2244 | 'darshankaarki',
2245 | 'Tshifhiwa84',
2246 | 'CurtainTears',
2247 | 'gaotong2055',
2248 | 'appleatiger',
2249 | 'hdstar2009',
2250 | 'TommyJerryMairo',
2251 | 'GoogleCodeExporter',
2252 | ]
2253 |
--------------------------------------------------------------------------------