From 3467e1523e2394f7782219a33a90616c18352702 Mon Sep 17 00:00:00 2001 From: Bill Chen Date: Thu, 8 Mar 2018 21:20:22 +0900 Subject: [PATCH] Fixed #1, and created wheel and source files. --- README.md | 63 ++- build/lib/pyprog/ProgressBar.py | 39 +- build/lib/pyprog/ProgressIndicatorFraction.py | 2 +- dist/pyprog-1.0.2-py2.py3-none-any.whl | Bin 7131 -> 0 bytes dist/pyprog-1.0.2.tar.gz | Bin 4343 -> 0 bytes dist/pyprog-1.1.0.post0-py2.py3-none-any.whl | Bin 0 -> 7326 bytes dist/pyprog-1.1.0.post0.tar.gz | Bin 0 -> 4529 bytes pyprog.egg-info/PKG-INFO | 384 +++++++++--------- pyprog/ProgressBar.py | 1 + pyprog/ProgressBar.pyc | Bin 6532 -> 7459 bytes pyprog/ProgressIndicatorFraction.py | 2 +- pyprog/ProgressIndicatorFraction.pyc | Bin 2588 -> 2634 bytes pyprog/__pycache__/ProgressBar.cpython-35.pyc | Bin 6448 -> 6448 bytes setup.py | 4 +- 14 files changed, 282 insertions(+), 213 deletions(-) delete mode 100644 dist/pyprog-1.0.2-py2.py3-none-any.whl delete mode 100644 dist/pyprog-1.0.2.tar.gz create mode 100644 dist/pyprog-1.1.0.post0-py2.py3-none-any.whl create mode 100644 dist/pyprog-1.1.0.post0.tar.gz diff --git a/README.md b/README.md index 19fdbe3..89eacfa 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,13 @@ prog.end() Output: ``` -Initial State: +Initial State: :-) Progress: 0% -------------------------------------------------- OK! -When progress is 50: +When progress is 50: :-) Progress: 50% #########################------------------------- OK! -Final State: +Final State: :-) Progress: 100% ################################################## OK! ``` @@ -89,13 +89,13 @@ You can also add more options to make it look good. Adding options `complete_symbol="█", not_complete_symbol="-"` will change the original output to: ``` -Initial State: +Initial State: :-) Progress: 0% -------------------------------------------------- OK! -When progress is 50: +When progress is 50: :-) Progress: 50% █████████████████████████------------------------- OK! -Final State: +Final State: :-) Progress: 100% ██████████████████████████████████████████████████ OK! ``` @@ -164,13 +164,13 @@ prog.end() Output: ``` -Initial State: +Initial State: :-) 0/56 OK! -When half done: +When half done: :-) 28/56 OK! -Final State: +Final State: :-) 56/56 OK! ``` @@ -294,12 +294,30 @@ Initial status to show on the indicator. #### set_stat() +Available on: PyProg 1.0.0 ~ Params: current Set the current progress. +#### stat() + +Available on: PyProg 1.1.0-0 ~ +Params: current +Note: This function is currently only available on the ProgressBar. Support for ProgressIndicatorFraction will come soon. + +Set the current progress and update the progress bar. + +#### progress() + +Available on: PyProg 1.1.0-0 ~ +Params: progress +Note: This function is currently only available on the ProgressBar. Support for ProgressIndicatorFraction will come soon. + +Increase the progress by the given amount. + #### update() +Available on: PyProg 1.0.0 ~ Params: (none) Update the progress bar so that it shows the current progress.
@@ -307,54 +325,71 @@ Note: Also call this to initiate the bar. #### end() +Available on: PyProg 1.0.0 ~ Params: (none) End the progress bar. +#### end_m() + +Available on: PyProg 1.1.0-0 ~ +Params: msg +Note: This function is currently only available on the ProgressBar. Support for ProgressIndicatorFraction will come soon. + +End the progress bar with a message. + #### set_prefix() +Available on: PyProg 1.0.0 ~ Params: prefix Set the prefix #### set_suffix() +Available on: PyProg 1.0.0 ~ Params: suffix Set the suffix #### set_total() +Available on: PyProg 1.0.0 ~ Params: total Set the total #### set_bar_length() +Available on: PyProg 1.0.0 ~ Params: bar_length Set the length of the bar #### set_decimals() +Available on: PyProg 1.0.0 ~ Params: decimals Set the number of decimals for the percent #### set_symbols() +Available on: PyProg 1.0.0 ~ Params: symbols Set the complete symbol and the not complete symbol. `symbols` has to be a tuple: (complete symbol, not complete symbol) #### set_progress_loc() +Available on: PyProg 1.0.0 ~ Params: progress_loc Set the progress explanation (prefix) and the progress text location. See [the progress_loc parameter](#user-content-progress_loc-default-is-0 "progress_loc") section for the possible values. #### set_progress_explain() +Available on: PyProg 1.0.0 ~ Params: progress_explain Set the progress explanation (prefix). @@ -365,12 +400,14 @@ Examples:
#### set_wrap_bar_text() +Available on: PyProg 1.0.0 ~ Params: prefix, suffix Set the wrap bar text (the prefix and the suffix of the bar). #### set_progress_format() +Available on: PyProg 1.0.0 ~ Params: progress_format Set the format for the progress text. PyProg replaces special characters with actual values. Here is a list of special characters: @@ -382,12 +419,14 @@ Set the format for the progress text. PyProg replaces special characters with ac #### set_stat() +Available on: PyProg 1.0.0 ~ Params: current Set the current progress. #### update() +Available on: PyProg 1.0.0 ~ Params: (none) Update the progress indicator so that it shows the current progress. @@ -395,24 +434,28 @@ Note: Also call this to initiate the indicator. #### end() +Available on: PyProg 1.0.0 ~ Params: (none) End the progress indicator. #### set_prefix() +Available on: PyProg 1.0.0 ~ Params: prefix Set the prefix #### set_suffix() +Available on: PyProg 1.0.0 ~ Params: suffix Set the suffix #### set_total() +Available on: PyProg 1.0.0 ~ Params: total Set the total @@ -422,5 +465,3 @@ Set the total If you want to support me, please contact me at kudoshiko@gmail.com. My website is at [http://www.WhatsYourIdea.com/](http://www.WhatsYourIdea.com/ "Website") - - diff --git a/build/lib/pyprog/ProgressBar.py b/build/lib/pyprog/ProgressBar.py index dd30672..ae86b43 100644 --- a/build/lib/pyprog/ProgressBar.py +++ b/build/lib/pyprog/ProgressBar.py @@ -10,6 +10,7 @@ class ProgressBar: PROGRESS_LOC_EXP_END_PROGRESS_MID = 4 def __init__(self, prefix, suffix, total=100, bar_length=50, initial=0, decimals=0, complete_symbol="#", not_complete_symbol="-", progress_loc=0, progress_format="+p%", progress_explain="Progress: ", wrap_bar_prefix=" ", wrap_bar_suffix=" "): + self.__end_m = False self.p = prefix self.s = suffix self.length = bar_length @@ -26,6 +27,7 @@ def __init__(self, prefix, suffix, total=100, bar_length=50, initial=0, decimals def __print(self, data, start="", end=""): sys.stdout.write(start + data + end) + sys.stdout.flush() def set_prefix(self, prefix): ''' @@ -105,10 +107,24 @@ def set_progress_format(self, progress_format): def set_stat(self, current): ''' - Set the current progress. Only accept integers. + Set the current progress. ''' self.current_stat = current + def stat(self, current): + ''' + Set the current progress and showing the progress bar. + ''' + self.current_stat = current + self.update() + + def progress(self, progress=1): + ''' + Progress forward by an amount. + ''' + self.current_stat += progress + self.update() + def update(self): ''' Update the progress bar so that it shows the current progress. @@ -120,11 +136,15 @@ def update(self): final = self.complete_sym * blocks_to_fill + self.not_complete_sym * blocks_not_to_fill final = self.wrap_bar_prefix + final + self.wrap_bar_suffix percent = round(round(decimal, self.decimals + 2) * 100, self.decimals + 2) - if percent.is_integer(): - progress_str = self.progress_format.replace("+p", str(int(percent))) + if self.__end_m: + progress_str = "" + self.progress_explain = self.__end_m else: - progress_str = self.progress_format.replace("+p", str(percent)) - progress_str = progress_str.replace("+c", str(self.current_stat)) + if percent.is_integer(): + progress_str = self.progress_format.replace("+p", str(int(percent))) + else: + progress_str = self.progress_format.replace("+p", str(percent)) + progress_str = progress_str.replace("+c", str(self.current_stat)) if self.progress_loc == ProgressBar.PROGRESS_LOC_START: final = self.progress_explain + progress_str + final elif self.progress_loc == ProgressBar.PROGRESS_LOC_MIDDLE: @@ -161,9 +181,16 @@ def update(self): final = self.p + final + self.s self.__print(final, start="\r") + def end_m(self, msg): + ''' + End the progress bar with a message. + ''' + self.__end_m = msg + self.update() + self.end() + def end(self): ''' End the progress bar. ''' self.__print("", end="\n") - diff --git a/build/lib/pyprog/ProgressIndicatorFraction.py b/build/lib/pyprog/ProgressIndicatorFraction.py index 0afa178..0a0c479 100644 --- a/build/lib/pyprog/ProgressIndicatorFraction.py +++ b/build/lib/pyprog/ProgressIndicatorFraction.py @@ -10,6 +10,7 @@ def __init__(self, prefix, suffix, total, initial=0): def __print(self, data, start="", end=""): sys.stdout.write(start + data + end) + sys.stdout.flush() def set_prefix(self, prefix): ''' @@ -49,4 +50,3 @@ def end(self): End the progress indicator. ''' self.__print("", end="\n") - diff --git a/dist/pyprog-1.0.2-py2.py3-none-any.whl b/dist/pyprog-1.0.2-py2.py3-none-any.whl deleted file mode 100644 index 7dcc8c85f910c72a28b6220b526efc85a62d6f21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7131 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 diff --git a/dist/pyprog-1.0.2.tar.gz b/dist/pyprog-1.0.2.tar.gz deleted file mode 100644 index 79a1961fda6a2f45eb9ebfc9e01b8387afff56c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4343 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 literal 0 HcmV?d00001 diff --git a/dist/pyprog-1.1.0.post0.tar.gz b/dist/pyprog-1.1.0.post0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b954bfd7a36a518d3c95f8e179355c2d41c8948 GIT binary patch literal 4529 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 literal 0 HcmV?d00001 diff --git a/pyprog.egg-info/PKG-INFO b/pyprog.egg-info/PKG-INFO index 96787cb..c0cec83 100644 --- a/pyprog.egg-info/PKG-INFO +++ b/pyprog.egg-info/PKG-INFO @@ -1,192 +1,192 @@ -Metadata-Version: 1.0 -Name: pyprog -Version: 1.0.2 -Summary: A library for creating super customizable progress indicators. -Home-page: https://github.com/Bill13579/pyprog -Author: Bill Kudo -Author-email: bluesky42624@gmail.com -License: GNU AGPLv3 -Description: PyProg is an Open-Source library for creating progress indicators (e.g. progress bars). It helps you create customizable progress indicators. This library is for Python. It does not have any dependencies. - - ============= - Compatibility - ============= - - PyProg is compatible with both Python 3 and Python 2. - - ============ - Installation - ============ - - Latest build: ``pip install pyprog`` - - Latest development build: ``pip install git+https://github.com/Bill13579/pyprog.git@develop`` - - After you have installed PyProg, you can test if it has been successfully installed by running ``import pyprog`` in python. If PyProg was installed successfully, it should show no errors. - - ================================== - How to use the PyProg Progress Bar - ================================== - - To create a progress bar, follow these steps: - - 1. Import PyProg: ``import pyprog`` - 2. Create a ``ProgressBar`` object: ``prog = pyprog.ProgressBar("", "")`` - 3. Show the bar: ``prog.update()`` - 4. To update the status, use ``prog.set_stat()`` to set the status and then use ``prog.update()`` to actually show the change - 5. When finished, use ``prog.end()`` to make the Progress Bar last - - Example Code with Fake For loop: - - .. code-block:: python - - import pyprog - from time import sleep - - # Create a PyProg ProgressBar Object - prog = pyprog.ProgressBar(":-) ", " OK!") - - # Show the initial status - prog.update() - - # Fake for loop - for i in range(0, 100): - - # Sleep for a while (This is just to slow down the for loop so that it won't end in an instant) - sleep(0.1) - - # Update status - prog.set_stat(i + 1) - - # Show (Update) the current status - prog.update() - - # Make the Progress Bar final - prog.end() - - Output: - - .. code-block:: - - Initial State: - :-) Progress: 0% -------------------------------------------------- OK! - - When progress is 50: - :-) Progress: 50% #########################------------------------- OK! - - Final State: - :-) Progress: 100% ################################################## OK! - - Pretty Progress Bar - =================== - - You can also add more options to make it look good. - - Adding options ``complete_symbol="â–ˆ", not_complete_symbol="-"`` will change the original output to: - - .. code-block:: - - Initial State: - :-) Progress: 0% -------------------------------------------------- OK! - - When progress is 50: - :-) Progress: 50% █████████████████████████------------------------- OK! - - Final State: - :-) Progress: 100% ██████████████████████████████████████████████████ OK! - - Auto calculate the percentage - ============================= - - PyProg can also auto calculate the current percentage. You just need to tell PyProg the total number of things you need to process. - - Change the line ``prog = pyprog.ProgressBar("", "")`` to ``prog = pyprog.ProgressBar("", "", )``, and PyProg will calculate the percentage for you based on the status that you give it. - - To use it in our simple progress bar code, if we have 37 tasks to do, we can change this: - - .. code-block:: python - - # Create a PyProg ProgressBar Object - prog = pyprog.ProgressBar(":-) ", " OK!") - - to this: - - .. code-block:: python - - # Create a PyProg ProgressBar Object - prog = pyprog.ProgressBar(":-) ", " OK!", 37) - - And also change the fake for loop from ``for i in range(0, 100):`` to ``for i in range(0, 37):``, and it will auto calculate the percentage and show it to the user. - - =================================================== - How to use the PyProg Progress Indicator (Fraction) - =================================================== - - To create a basic progress indicator (fraction), follow these steps: - - 1. Import PyProg: ``import pyprog`` - 2. Create a ``ProgressIndicatorFraction`` object: ``prog = pyprog.ProgressIndicatorFraction("", "", )`` (Replace "" with the total number of tasks or things you need to process) - 3. Show the indicator: ``prog.update()`` - 4. To update the status, use ``prog.set_stat()`` to set the status and then use ``prog.update()`` to actually show the change - 5. When finished, use ``prog.end()`` to make the Progress Indicator (Fraction) last - - Example Code with Fake For loop (We are using 56 as the total in this example): - - .. code-block:: python - - import pyprog - from time import sleep - - # Create a PyProg ProgressIndicatorFraction Object - prog = pyprog.ProgressIndicatorFraction(":-) ", " OK!", 56) - - # Show the initial status - prog.update() - - # Fake for loop - for i in range(0, 56): - - # Sleep for a while (This is just to slow down the for loop so that it won't end in an instant) - sleep(0.1) - - # Update status - prog.set_stat(i + 1) - - # Show (Update) the current status - prog.update() - - # Make the Progress Indicator (Fraction) final - prog.end() - - Output: - - .. code-block:: - - Initial State: - :-) 0/56 OK! - - When half done: - :-) 28/56 OK! - - Final State: - :-) 56/56 OK! - - ============= - Documentation - ============= - - The documentation is at the Github page for this project. - - Github page: ``_ - - ======= - Contact - ======= - - If you want to support me, please contact me at kudoshiko@gmail.com. - - My website is at ``_ - - -Keywords: progress bar indicator pyprog -Platform: UNKNOWN +Metadata-Version: 1.0 +Name: pyprog +Version: 1.1.0.post0 +Summary: A library for creating super customizable progress indicators. +Home-page: https://github.com/Bill13579/pyprog +Author: Bill Kudo +Author-email: bluesky42624@gmail.com +License: GNU AGPLv3 +Description: PyProg is an Open-Source library for creating progress indicators (e.g. progress bars). It helps you create customizable progress indicators. This library is for Python. It does not have any dependencies. + + ============= + Compatibility + ============= + + PyProg is compatible with both Python 3 and Python 2, and will also work on Qt Console. + + ============ + Installation + ============ + + Latest build: ``pip install pyprog`` + + Latest development build: ``pip install git+https://github.com/Bill13579/pyprog.git@develop`` + + After you have installed PyProg, you can test if it has been successfully installed by running ``import pyprog`` in python. If PyProg was installed successfully, it should show no errors. + + ================================== + How to use the PyProg Progress Bar + ================================== + + To create a progress bar, follow these steps: + + 1. Import PyProg: ``import pyprog`` + 2. Create a ``ProgressBar`` object: ``prog = pyprog.ProgressBar("", "")`` + 3. Show the bar: ``prog.update()`` + 4. To update the status, use ``prog.set_stat()`` to set the status and then use ``prog.update()`` to actually show the change + 5. When finished, use ``prog.end()`` to make the Progress Bar last + + Example Code with Fake For loop: + + .. code-block:: python + + import pyprog + from time import sleep + + # Create a PyProg ProgressBar Object + prog = pyprog.ProgressBar(":-) ", " OK!") + + # Show the initial status + prog.update() + + # Fake for loop + for i in range(0, 100): + + # Sleep for a while (This is just to slow down the for loop so that it won't end in an instant) + sleep(0.1) + + # Update status + prog.set_stat(i + 1) + + # Show (Update) the current status + prog.update() + + # Make the Progress Bar final + prog.end() + + Output: + + .. code-block:: + + Initial State: + :-) Progress: 0% -------------------------------------------------- OK! + + When progress is 50: + :-) Progress: 50% #########################------------------------- OK! + + Final State: + :-) Progress: 100% ################################################## OK! + + Pretty Progress Bar + =================== + + You can also add more options to make it look good. + + Adding options ``complete_symbol="█", not_complete_symbol="-"`` will change the original output to: + + .. code-block:: + + Initial State: + :-) Progress: 0% -------------------------------------------------- OK! + + When progress is 50: + :-) Progress: 50% █████████████████████████------------------------- OK! + + Final State: + :-) Progress: 100% ██████████████████████████████████████████████████ OK! + + Auto calculate the percentage + ============================= + + PyProg can also auto calculate the current percentage. You just need to tell PyProg the total number of things you need to process. + + Change the line ``prog = pyprog.ProgressBar("", "")`` to ``prog = pyprog.ProgressBar("", "", )``, and PyProg will calculate the percentage for you based on the status that you give it. + + To use it in our simple progress bar code, if we have 37 tasks to do, we can change this: + + .. code-block:: python + + # Create a PyProg ProgressBar Object + prog = pyprog.ProgressBar(":-) ", " OK!") + + to this: + + .. code-block:: python + + # Create a PyProg ProgressBar Object + prog = pyprog.ProgressBar(":-) ", " OK!", 37) + + And also change the fake for loop from ``for i in range(0, 100):`` to ``for i in range(0, 37):``, and it will auto calculate the percentage and show it to the user. + + =================================================== + How to use the PyProg Progress Indicator (Fraction) + =================================================== + + To create a basic progress indicator (fraction), follow these steps: + + 1. Import PyProg: ``import pyprog`` + 2. Create a ``ProgressIndicatorFraction`` object: ``prog = pyprog.ProgressIndicatorFraction("", "", )`` (Replace "" with the total number of tasks or things you need to process) + 3. Show the indicator: ``prog.update()`` + 4. To update the status, use ``prog.set_stat()`` to set the status and then use ``prog.update()`` to actually show the change + 5. When finished, use ``prog.end()`` to make the Progress Indicator (Fraction) last + + Example Code with Fake For loop (We are using 56 as the total in this example): + + .. code-block:: python + + import pyprog + from time import sleep + + # Create a PyProg ProgressIndicatorFraction Object + prog = pyprog.ProgressIndicatorFraction(":-) ", " OK!", 56) + + # Show the initial status + prog.update() + + # Fake for loop + for i in range(0, 56): + + # Sleep for a while (This is just to slow down the for loop so that it won't end in an instant) + sleep(0.1) + + # Update status + prog.set_stat(i + 1) + + # Show (Update) the current status + prog.update() + + # Make the Progress Indicator (Fraction) final + prog.end() + + Output: + + .. code-block:: + + Initial State: + :-) 0/56 OK! + + When half done: + :-) 28/56 OK! + + Final State: + :-) 56/56 OK! + + ============= + Documentation + ============= + + The documentation is at the Github page for this project. + + Github page: ``_ + + ======= + Contact + ======= + + If you want to support me, please contact me at kudoshiko@gmail.com. + + My website is at ``_ + + +Keywords: progress bar indicator pyprog +Platform: UNKNOWN diff --git a/pyprog/ProgressBar.py b/pyprog/ProgressBar.py index 39557b7..ae86b43 100644 --- a/pyprog/ProgressBar.py +++ b/pyprog/ProgressBar.py @@ -27,6 +27,7 @@ def __init__(self, prefix, suffix, total=100, bar_length=50, initial=0, decimals def __print(self, data, start="", end=""): sys.stdout.write(start + data + end) + sys.stdout.flush() def set_prefix(self, prefix): ''' diff --git a/pyprog/ProgressBar.pyc b/pyprog/ProgressBar.pyc index fa2c1f02824d9de6033481e9f861cded5fd054cf..77233e6ff983fcfe0c5187df16f0992174a87ce9 100644 GIT binary patch literal 7459 zcmd5>UvnEt5ucT1*|Oz7aqQUnbGgNL2fBpB{HwaF5JGZ};jZd%!YXj!mt~_}TdPP~ z)$XVqSIJcr$vf}7QFR}HM;`ecJWzZF_yF+x^~_4E*r6OsRAKMV_Vo13bocc1^t5LF zxwP=Nn}0lLD*HEs??b%V4vG+uqdH0*j9^C{I4Ufuu&lxv^;)S{O8xo(bw@Sov*;85 z3xE515#ZA_IZC4}`z%ODT zrF=&X@c<~PAszrTYFHKk<(vSsYB(=IMGXOi26&JG03JvHRW-x|U_lM>09aH*JOFBH zhzG!u8sY%}9V*xY1=z2zkQtiAPl8Ss>C1rpTm+bf??=7R?}{jWDKlLGO(*Id>6WIk zG?Q+>6Y0p$PP%#(h+d-o38YXB(lqL6KhuGh`E;U#j-Cg77&YTAW|z_W)+GH-($r*b zgg8vnF8XqY5iWY!?*wsA2#?dC?>`62{WLm^Uryq(!69&Uu7l=6W>M!*1hK@F$IZDjYT?Y6SlVb%2AHR&(NVb1qT<#x^n?CIhp`$7!r1 zS?(Rz!5h$=U!YEQLW5C*`s1`1p4|{-xP$3zoSI(Bxr6`;AT%!t_(7n2bi7t@aXfK~Bm<)w>zwBO^{w{jo1qLe<(oFuM} zUTQaMC4)}rK9Afm&TzJ#L?NaAWzZQ!**!qjr{0sFdV7tA|K*cizwzvm_sqTXz_eUII9(HQ9 zl4I+t-JrmitmmY-@rC)pY~bl4bAj1+o5`Lf+^b_7lBi*d#>3FVoF!(t8DH%YCq8ZA z!Y9gC=!3Orj7~&rJrara0v#tk8qD6yfKj0_ne9AUx#wtLKD;}VF-<*{XfVKW*94?Zjah%~z`LO0ZRLm%hrU1BBS|3xXUfjq0 zVXThPb~DjCrET;P?*|=sw-uy8Q%7m$*5h8YGYBKPgDi6Gt~6a-o#ejAjrGUkgSKz? zx4F}wL5EFiOZ_Nq;(~!#8FN&(Z#U0S@aiFY<;_O|@`9N$KA+-tV~jgtW=5DM(bmfN z$zQRux5S{lkWy`S$BpE*ew!+_JBJ6vSR^@xEcFy6o2Ljog`mw2VG-w?kaQD`<4q%% zidVcjFb}~#*?koMK`?QmIFF9w-jR*It*^1$#%>TwEmyfg9~X*ftN?EZEmM?S;s!{a zl6iCR7B&TUr!3=p01$eV+amraCB`7C~lmhj{JlqHri#i z4&13EH&B7|+&Y!yMH{({l3J%~ki(c!>zk*N_-G@$QO2zk_<2Q~uJW74L|-pIE>tyH5Vf~dxMs1bUZQF?=UBDCcs3u6>gL0hNL0D1um=THM9(B&dV zM=l8C)Rc?vn8+Ew? z^sx)!IesDT?u=)2vjjNAy|F~|$C*%^duk*)y5~OXphGi2SfX1oh!Y&YOmt~Ejq?!2 z|IA8PXBh_e3~A-fk~Ho-(Vx%#nOKL20k|TlLXo$?km%CUQIyIVF2`IN;jYq*Od3k3Cgp}++=xiYp1HC}u5JQt z?kF+MT18&Q*(Dp1`to4ecB$r{s72 zoM4$&aZWtMt&VeZA~L!KQta?O+$4ET$j^9gM%*BD%MIKvezrlZYob4HD6>l_qqmKs z5GJs-n;lJ0ld?Z?&Gox~#?Tp)psHMjlA7H4d>I|>;>{!ogoKh*<*!mmAJdtY;ml~B z8IA8PqEa^THX@LCl?5B=K145*fn}gQJ;`LIzhFr5Y^q#m3eRTOdqFqyeKAkp?EBCTRO|o% literal 6532 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 XAt%I0P|6PCo_v;5f}Bt?;*tOWs^sSH diff --git a/pyprog/__pycache__/ProgressBar.cpython-35.pyc b/pyprog/__pycache__/ProgressBar.cpython-35.pyc index 1db4ee2dbea29a65a61915ede4e7426cc34eb8ee..ce67b7e5b03688dd04ff148cd4ef7283629ef2f7 100644 GIT binary patch delta 119 zcmdmBw84l?jF*?|^}mg5SNS*35(s2tte^ZwtakE39?{7k_}dw`Pp%Nqnp`Lz!RR*m zlz5W70|Ns?kt2w31`#eG!WBd)fe5$B-V&|?W+0{~h|mNP3X?C23s2rGVZm&{!!h}t GgcAU8Z6E;v delta 119 zcmdmBw84l?jF*>7`RhiutNfD}@`z5}FV@ajKiOSeYx84%Pd3K($+}{-lQYE=7(FJR z5>JwMVqjn>at0BuAi@nqxPu5K5aBV|Tf$Yq3dA%65t<-EVe&