ParlAI
ParlAI copied to clipboard
Unable to execute display_data for task self_feeding due to AttributeError of missing attribute DefaultTeacher
Bug description
I wanted to try out the dataset described in id : SelfFeedingChatbot
but I ran into an error when I tried to run the display_data
script.
detatils from /parlai/tasks/task_list.py
https://github.com/facebookresearch/ParlAI/blob/ac2ac9b66b9b8afe022ba8482899c95334b5023d/parlai/tasks/task_list.py#L462-L473
Reproduction steps
I ran this script
python3 -m parlai.scripts.display_data -t self_feeding
Then I got this error:
$ ~/ParlAI$ sudo python3 -m parlai.scripts.display_data -t self_feeding
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/home/mfekadu/ParlAI/parlai/scripts/display_data.py", line 113, in <module>
DisplayData.main()
File "/home/mfekadu/ParlAI/parlai/scripts/script.py", line 79, in main
return cls._run_args(None)
File "/home/mfekadu/ParlAI/parlai/scripts/script.py", line 63, in _run_args
opt = parser.parse_args(args=args, print_args=False)
File "/home/mfekadu/ParlAI/parlai/core/params.py", line 1009, in parse_args
self.add_extra_args(args)
File "/home/mfekadu/ParlAI/parlai/core/params.py", line 841, in add_extra_args
self.add_task_args(task)
File "/home/mfekadu/ParlAI/parlai/core/params.py", line 777, in add_task_args
agent = load_teacher_module(t)
File "/home/mfekadu/ParlAI/parlai/core/loader.py", line 290, in load_teacher_module
teacher_class = getattr(task_module, teacher)
AttributeError: module 'parlai.tasks.self_feeding.agents' has no attribute 'DefaultTeacher'
Expected behavior
A clean download and display of data, just like the squad example in the readme
Additional context
I noticed the same AttributeError
show up in #2100
here is my full history
from clone 🧬 to bug 🐛
494 git clone https://github.com/facebookresearch/ParlAI.git ~/ParlAI
495 cd ~/ParlAI; python setup.py develop
496 ls
497 python3 setup.py develop
498 sudo python3 setup.py develop
499 python -m parlai.scripts.display_data -t squad
500 python3 -m parlai.scripts.display_data -t squad
501 python3 -m parlai.scripts.display_data -t personachat
502 python3 -m parlai.scripts.display_data -t personachat -n 100
503 cat /home/mfekadu/ParlAI/data/Persona-Chat/personachat/train_self_original.txt
504 python3 -m parlai.scripts.display_data -t SelfFeedingChatbot
505 python3 -m parlai.scripts.display_data -t self_feeding
506* python3 -m parlai.scripts.
507 python3 -m parlai.scripts.display_data -t self_feeding
508 python3 -m parlai.scripts.display_data --help
509 python3 -m parlai.scripts.display_data -t self_feeding
510 sudo python3 -m parlai.scripts.display_data -t self_feeding
511 history
squad
worked just fine by the way, thanks for that!
$ ~/ParlAI$ python3 -m parlai.scripts.display_data -t squad
16:23:54 INFO | creating task(s): squad
loading: /home/mfekadu/ParlAI/data/SQuAD/train-v1.1.json
- - - NEW EPISODE: squad - - -
Architecturally, the school has a Catholic character. Atop the Main Building's gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.
To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?
Saint Bernadette Soubirous
- - - NEW EPISODE: squad - - -
Architecturally, the school has a Catholic character. Atop the Main Building's gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.
What is in front of the Notre Dame Main Building?
a copper statue of Christ
- - - NEW EPISODE: squad - - -
Architecturally, the school has a Catholic character. Atop the Main Building's gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.
The Basilica of the Sacred heart at Notre Dame is beside to which structure?
the Main Building
- - - NEW EPISODE: squad - - -
Architecturally, the school has a Catholic character. Atop the Main Building's gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.
What is the Grotto at Notre Dame?
a Marian place of prayer and reflection
- - - NEW EPISODE: squad - - -
Architecturally, the school has a Catholic character. Atop the Main Building's gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.
What sits on top of the Main Building at Notre Dame?
a golden statue of the Virgin Mary
- - - NEW EPISODE: squad - - -
As at most other universities, Notre Dame's students run a number of news media outlets. The nine student-run outlets include three newspapers, both a radio and television station, and several magazines and journals. Begun as a one-page journal in September 1876, the Scholastic magazine is issued twice monthly and claims to be the oldest continuous collegiate publication in the United States. The other magazine, The Juggler, is released twice a year and focuses on student literature and artwork. The Dome yearbook is published annually. The newspapers have varying publication interests, with The Observer published daily and mainly reporting university and other news, and staffed by students from both Notre Dame and Saint Mary's College. Unlike Scholastic and The Dome, The Observer is an independent publication and does not have a faculty advisor or any editorial oversight from the University. In 1987, when some students believed that The Observer began to show a conservative bias, a liberal newspaper, Common Sense was published. Likewise, in 2003, when other students believed that the paper showed a liberal bias, the conservative paper Irish Rover went into production. Neither paper is published as often as The Observer; however, all three are distributed to all students. Finally, in Spring 2008 an undergraduate journal for political science research, Beyond Politics, made its debut.
When did the Scholastic Magazine of Notre dame begin publishing?
September 1876
- - - NEW EPISODE: squad - - -
As at most other universities, Notre Dame's students run a number of news media outlets. The nine student-run outlets include three newspapers, both a radio and television station, and several magazines and journals. Begun as a one-page journal in September 1876, the Scholastic magazine is issued twice monthly and claims to be the oldest continuous collegiate publication in the United States. The other magazine, The Juggler, is released twice a year and focuses on student literature and artwork. The Dome yearbook is published annually. The newspapers have varying publication interests, with The Observer published daily and mainly reporting university and other news, and staffed by students from both Notre Dame and Saint Mary's College. Unlike Scholastic and The Dome, The Observer is an independent publication and does not have a faculty advisor or any editorial oversight from the University. In 1987, when some students believed that The Observer began to show a conservative bias, a liberal newspaper, Common Sense was published. Likewise, in 2003, when other students believed that the paper showed a liberal bias, the conservative paper Irish Rover went into production. Neither paper is published as often as The Observer; however, all three are distributed to all students. Finally, in Spring 2008 an undergraduate journal for political science research, Beyond Politics, made its debut.
How often is Notre Dame's the Juggler published?
twice
- - - NEW EPISODE: squad - - -
As at most other universities, Notre Dame's students run a number of news media outlets. The nine student-run outlets include three newspapers, both a radio and television station, and several magazines and journals. Begun as a one-page journal in September 1876, the Scholastic magazine is issued twice monthly and claims to be the oldest continuous collegiate publication in the United States. The other magazine, The Juggler, is released twice a year and focuses on student literature and artwork. The Dome yearbook is published annually. The newspapers have varying publication interests, with The Observer published daily and mainly reporting university and other news, and staffed by students from both Notre Dame and Saint Mary's College. Unlike Scholastic and The Dome, The Observer is an independent publication and does not have a faculty advisor or any editorial oversight from the University. In 1987, when some students believed that The Observer began to show a conservative bias, a liberal newspaper, Common Sense was published. Likewise, in 2003, when other students believed that the paper showed a liberal bias, the conservative paper Irish Rover went into production. Neither paper is published as often as The Observer; however, all three are distributed to all students. Finally, in Spring 2008 an undergraduate journal for political science research, Beyond Politics, made its debut.
What is the daily student paper at Notre Dame called?
The Observer
- - - NEW EPISODE: squad - - -
As at most other universities, Notre Dame's students run a number of news media outlets. The nine student-run outlets include three newspapers, both a radio and television station, and several magazines and journals. Begun as a one-page journal in September 1876, the Scholastic magazine is issued twice monthly and claims to be the oldest continuous collegiate publication in the United States. The other magazine, The Juggler, is released twice a year and focuses on student literature and artwork. The Dome yearbook is published annually. The newspapers have varying publication interests, with The Observer published daily and mainly reporting university and other news, and staffed by students from both Notre Dame and Saint Mary's College. Unlike Scholastic and The Dome, The Observer is an independent publication and does not have a faculty advisor or any editorial oversight from the University. In 1987, when some students believed that The Observer began to show a conservative bias, a liberal newspaper, Common Sense was published. Likewise, in 2003, when other students believed that the paper showed a liberal bias, the conservative paper Irish Rover went into production. Neither paper is published as often as The Observer; however, all three are distributed to all students. Finally, in Spring 2008 an undergraduate journal for political science research, Beyond Politics, made its debut.
How many student news papers are found at Notre Dame?
three
- - - NEW EPISODE: squad - - -
As at most other universities, Notre Dame's students run a number of news media outlets. The nine student-run outlets include three newspapers, both a radio and television station, and several magazines and journals. Begun as a one-page journal in September 1876, the Scholastic magazine is issued twice monthly and claims to be the oldest continuous collegiate publication in the United States. The other magazine, The Juggler, is released twice a year and focuses on student literature and artwork. The Dome yearbook is published annually. The newspapers have varying publication interests, with The Observer published daily and mainly reporting university and other news, and staffed by students from both Notre Dame and Saint Mary's College. Unlike Scholastic and The Dome, The Observer is an independent publication and does not have a faculty advisor or any editorial oversight from the University. In 1987, when some students believed that The Observer began to show a conservative bias, a liberal newspaper, Common Sense was published. Likewise, in 2003, when other students believed that the paper showed a liberal bias, the conservative paper Irish Rover went into production. Neither paper is published as often as The Observer; however, all three are distributed to all students. Finally, in Spring 2008 an undergraduate journal for political science research, Beyond Politics, made its debut.
In what year did the student paper Common Sense begin publication at Notre Dame?
1987
16:23:55 INFO | loaded 87599 episodes with a total of 87599 examples
$ ~/ParlAI$
same bug occurs when running script directly (rather than module)
$ python3 scripts/display_data.py --task self_feeding
Traceback (most recent call last):
File "scripts/display_data.py", line 113, in <module>
DisplayData.main()
File "/home/mfekadu/ParlAI/parlai/scripts/script.py", line 79, in main
return cls._run_args(None)
File "/home/mfekadu/ParlAI/parlai/scripts/script.py", line 63, in _run_args
opt = parser.parse_args(args=args, print_args=False)
File "/home/mfekadu/ParlAI/parlai/core/params.py", line 1009, in parse_args
self.add_extra_args(args)
File "/home/mfekadu/ParlAI/parlai/core/params.py", line 841, in add_extra_args
self.add_task_args(task)
File "/home/mfekadu/ParlAI/parlai/core/params.py", line 777, in add_task_args
agent = load_teacher_module(t)
File "/home/mfekadu/ParlAI/parlai/core/loader.py", line 290, in load_teacher_module
teacher_class = getattr(task_module, teacher)
AttributeError: module 'parlai.tasks.self_feeding.agents' has no attribute 'DefaultTeacher'
Questions
- Why is a "Teacher" needed for a download script? Does
display_data
do more than download?
Workaround
Since I really just wanted to download the data, I found the ParlAI/projects/self_feeding/README.md
to be super helpful!
the download seems to have just worked!
(~/ParlAI) $ python3 projects/self_feeding/download_data.py
[building data: /home/mfekadu/ParlAI/data/self_feeding]
16:41:58 INFO | Downloading http://parl.ai/downloads/self_feeding/self_feeding_v031.tar.gz to /home/mfekadu/ParlAI/data/self_feeding/self_feeding_v031.tar.gz
Downloading self_feeding_v031.tar.gz: 100%|██████████████████████████| 214M/214M [00:04<00:00, 52.5MB/s]
interactive pre-trained model works too
https://github.com/facebookresearch/ParlAI/blob/master/projects/self_feeding/README.md#chat-with-a-pretrained-model
$ ~/ParlAI$ python3 projects/self_feeding/interactive.py --model-file zoo:self_feeding/hh131k_hb60k_fb60k_st1k/model --no-cuda
17:50:17 WARN | overriding opt['subtasks'] to ['dialog', 'satisfaction'] (previously: ['dialog', 'feedback', 'satisfaction'])
17:50:17 WARN | overriding opt['interactive'] to True (previously: False)
17:50:17 WARN | overriding opt['prev_response_filter'] to True (previously: False)
17:50:17 WARN | overriding opt['partial_load'] to True (previously: False)
17:50:17 WARN | overriding opt['eval_candidates'] to fixed (previously: inline)
17:50:17 WARN | overriding opt['encode_candidate_vecs'] to True (previously: False)
17:50:17 WARN | overriding opt['fixed_candidates_path'] to /home/mfekadu/ParlAI/data/self_feeding/convai2_cands.txt (previously: None)
17:50:17 WARN | overriding opt['no_cuda'] to True (previously: False)
17:50:17 WARN | Old model: overriding `add_double_person_tokens` to True.
[ Setting interactive mode defaults... ]
17:50:17 INFO | loading dictionary from /home/mfekadu/ParlAI/data/models/self_feeding/hh131k_hb60k_fb60k_st1k/model.dict
17:50:17 INFO | num words = 23617
17:50:17 INFO | SelfFeeding: full interactive mode on.
17:50:19 INFO | Total parameters: 17,383,693 (16,462,093 trainable)
17:50:19 INFO | Loading existing model parameters from /home/mfekadu/ParlAI/data/models/self_feeding/hh131k_hb60k_fb60k_st1k/model
WARNING: could not load entire --init-model; loading partially instead.
17:50:19 INFO | Loading fixed candidate set from /home/mfekadu/ParlAI/data/self_feeding/convai2_cands.txt
17:50:19 INFO | Loading fixed candidate set vectors from /home/mfekadu/ParlAI/data/models/self_feeding/hh131k_hb60k_fb60k_st1k/model.convai2_cands.vecs
17:50:19 INFO | Loading fixed candidate set encodings from /home/mfekadu/ParlAI/data/models/self_feeding/hh131k_hb60k_fb60k_st1k/model.convai2_cands.encs
/usr/local/lib/python3.6/dist-packages/torch-1.4.0-py3.6-linux-x86_64.egg/torch/nn/_reduction.py:43: UserWarning: size_average and reduce args will be deprecated, please use reduction='sum' instead.
warnings.warn(warning.format(ret))
17:50:19 INFO | creating task(s): parlai.agents.local_human.local_human:LocalHumanAgent
Enter [DONE] if you want to end the episode, [EXIT] to quit.
[ optional arguments: ]
[ share_word_embeddings: True ]
[ Main ParlAI Arguments: ]
[ batchsize: 128 ]
[ datapath: /home/mfekadu/ParlAI/data ]
[ datatype: train ]
[ download_path: /home/mfekadu/ParlAI/downloads ]
[ dynamic_batching: None ]
[ hide_labels: False ]
[ image_mode: raw ]
[ init_opt: None ]
[ loglevel: info ]
[ multitask_weights: [1] ]
[ numthreads: 1 ]
[ show_advanced_args: False ]
[ task: self_feeding:all:train ]
[ ParlAI Model Arguments: ]
[ dict_class: parlai.core.dict:DictionaryAgent ]
[ init_model: None ]
[ model: projects.self_feeding.self_feeding_agent:SelfFeedingAgent ]
[ model_file: /home/mfekadu/ParlAI/data/models/self_feeding/hh131k_hb60k_fb60k_st1k/model ]
[ Local Human Arguments: ]
[ local_human_candidates_file: None ]
[ single_turn: False ]
[ ParlAI Image Preprocessing Arguments: ]
[ image_cropsize: 224 ]
[ image_size: 256 ]
[ TorchAgent Arguments: ]
[ add_p1_after_newln: False ]
[ delimiter:
]
[ embedding_projection: random ]
[ embedding_type: fasttext_cc ]
[ force_fp16_tokens: False ]
[ fp16: False ]
[ fp16_impl: apex ]
[ gpu: -1 ]
[ history_add_global_end_token: None ]
[ history_size: 2 ]
[ interactive_mode: True ]
[ label_truncate: None ]
[ no_cuda: True ]
[ person_tokens: False ]
[ rank_candidates: True ]
[ split_lines: False ]
[ text_truncate: None ]
[ truncate: 1024 ]
[ use_reply: label ]
[ Optimizer Arguments: ]
[ adafactor_eps: (1e-30, 0.001) ]
[ adam_eps: 1e-08 ]
[ betas: [0.9, 0.999] ]
[ gradient_clip: 0.1 ]
[ learningrate: 0.0025 ]
[ momentum: 0 ]
[ nesterov: True ]
[ nus: [0.7] ]
[ optimizer: adamax ]
[ weight_decay: None ]
[ Learning Rate Scheduler: ]
[ invsqrt_lr_decay_gamma: -1 ]
[ lr_scheduler: invsqrt ]
[ lr_scheduler_decay: 0.5 ]
[ lr_scheduler_patience: 3 ]
[ max_lr_steps: -1 ]
[ update_freq: -1 ]
[ warmup_rate: 0.0001 ]
[ warmup_updates: 500 ]
[ TorchRankerAgent: ]
[ candidates: batch ]
[ cap_num_predictions: 100 ]
[ encode_candidate_vecs: True ]
[ encode_candidate_vecs_batchsize: 256 ]
[ eval_candidates: fixed ]
[ fixed_candidate_vecs: reuse ]
[ fixed_candidates_path: /home/mfekadu/ParlAI/data/self_feeding/convai2_cands.txt ]
[ ignore_bad_candidates: False ]
[ inference: max ]
[ init_model: None ]
[ interactive_candidates: fixed ]
[ rank_top_k: -1 ]
[ repeat_blocking_heuristic: True ]
[ return_cand_scores: False ]
[ topk: 5 ]
[ train_predict: False ]
[ Transformer Arguments: ]
[ activation: relu ]
[ attention_dropout: 0.0 ]
[ data_parallel: False ]
[ dropout: 0.0 ]
[ embedding_size: 300 ]
[ embeddings_scale: False ]
[ ffn_size: 32 ]
[ learn_embeddings: True ]
[ learn_positional_embeddings: False ]
[ memory_attention: sqrt ]
[ model_parallel: False ]
[ n_decoder_layers: -1 ]
[ n_encoder_layers: -1 ]
[ n_heads: 2 ]
[ n_layers: 2 ]
[ n_positions: None ]
[ n_segments: 0 ]
[ normalize_sent_emb: False ]
[ output_scaling: 1.0 ]
[ reduction_type: mean ]
[ relu_dropout: 0.0 ]
[ share_encoders: True ]
[ use_memories: False ]
[ variant: aiayn ]
[ wrap_memory_encoder: False ]
[ Dictionary Arguments: ]
[ bpe_debug: False ]
[ dict_endtoken: __end__ ]
[ dict_file: /home/mfekadu/ParlAI/data/models/self_feeding/hh131k_hb60k_fb60k_st1k/model.dict ]
[ dict_initpath: None ]
[ dict_language: english ]
[ dict_lower: False ]
[ dict_max_ngram_size: -1 ]
[ dict_maxtokens: 250000 ]
[ dict_minfreq: 0 ]
[ dict_nulltoken: __null__ ]
[ dict_starttoken: __start__ ]
[ dict_textfields: text,labels ]
[ dict_tokenizer: re ]
[ dict_unktoken: __unk__ ]
[ BPEHelper Arguments: ]
[ bpe_add_prefix_space: None ]
[ bpe_merge: None ]
[ bpe_vocab: None ]
[ Self Feeding Model: ]
[ sat_head_layers: 1 ]
[ share_fee_embeddings: True ]
[ share_fee_x_encoder: True ]
[ share_fee_y_encoder: True ]
[ share_sat_embeddings: False ]
[ share_sat_encoder: False ]
[ Self-feeding Agent: ]
[ add_double_person_tokens: True ]
[ dia_weight: 1.0 ]
[ display_sat_estimate: False ]
[ fee_weight: 1.0 ]
[ freeze_base: False ]
[ interactive: True ]
[ partial_load: True ]
[ prev_response_filter: True ]
[ prev_response_negatives: False ]
[ rating_frequency: 0.01 ]
[ rating_gap: 0.05 ]
[ rating_threshold: 0.5 ]
[ request_feedback: False ]
[ request_rating: False ]
[ sat_weight: 1.0 ]
[ subtasks: ['dialog', 'satisfaction'] ]
[ target_class: 0 ]
[ Self-feeding Variants: ]
[ regex: False ]
[ uncertainty_predictor: False ]
[ uncertainty_style: gap ]
[ uncertainty_threshold: 0.5 ]
Enter Your Message: Hello, Friend!
17:50:27 WARN | [ Executing eval mode with a common set of fixed candidates (n = 127712). ]
[SelfFeeding]: helloooo ! !
Enter Your Message: how are you?
[SelfFeeding]: i am doing better now . just had a mild asthma attack
Enter Your Message: omg! scary! glad you're feeling better :)
[SelfFeeding]: i am scared too ! we can face our fears together .
Enter Your Message: 💪✌️☮️🕊
[SelfFeeding]: how you doing my names ted
Enter Your Message: lol
[SelfFeeding]: lol
Enter Your Message:
Thanks for the really thorough bug report, so nice.
It looks like that paper assumed that you were always providing the specific teacher. In the other datasets, we designate one of the variations to be the DefaultTeacher
A potential patch I can submit later:
diff --git a/parlai/tasks/self_feeding/agents.py b/parlai/tasks/self_feeding/agents.py
index 1a0a6196..287d276e 100644
--- a/parlai/tasks/self_feeding/agents.py
+++ b/parlai/tasks/self_feeding/agents.py
@@ -352,3 +352,7 @@ class AllTeacher(SelfFeedingMTLTeacher):
@staticmethod
def add_cmdline_args(argparser):
SelfFeedingTeacher.add_cmdline_args(argparser)
+
+
+class DefaultTeacher(AllTeacher):
+ pass
This issue has not had activity in 30 days. Please feel free to reopen if you have more issues. You may apply the "never-stale" tag to prevent this from happening.
I still need to submit this pr
This issue has not had activity in 30 days. Please feel free to reopen if you have more issues. You may apply the "never-stale" tag to prevent this from happening.
Ugh
Bad bot
closing as this project is archived