diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
index 837e02cb4..cf0540a4f
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,14 @@ venv
*.pyc
__pycache__
+### VisualStudioCode ###
+.vscode/*
+.vscode/**
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
diff --git a/Day01-15/Day01/hello.py b/Day01-15/Day01/hello.py
deleted file mode 100644
index b91e9d6fd..000000000
--- a/Day01-15/Day01/hello.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-第一个Python程序 - hello, world!
-向伟大的Dennis M. Ritchie先生致敬
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-26
-
-请将该文件命名为hello.py并在终端中通过下面的命令运行它
-python hello.py
-
-"""
-
-print('hello, world!')
-# print("你好,世界!")
-print('你好', '世界')
-print('hello', 'world', sep=', ', end='!')
-print('goodbye, world', end='!\n')
diff --git a/Day01-15/Day01/peppa_pig.py b/Day01-15/Day01/peppa_pig.py
deleted file mode 100644
index d33858a22..000000000
--- a/Day01-15/Day01/peppa_pig.py
+++ /dev/null
@@ -1,193 +0,0 @@
-from turtle import*
-
-
-def nose(x,y):#鼻子
- penup()#提起笔
- goto(x,y)#定位
- pendown()#落笔,开始画
- setheading(-30)#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南)
- begin_fill()#准备开始填充图形
- a=0.4
- for i in range(120):
- if 0<=i<30 or 60<=i<90:
- a=a+0.08
- left(3) #向左转3度
- forward(a) #向前走a的步长
- else:
- a=a-0.08
- left(3)
- forward(a)
- end_fill()#填充完成
-
- penup()
- setheading(90)
- forward(25)
- setheading(0)
- forward(10)
- pendown()
- pencolor(255,155,192)#画笔颜色
- setheading(10)
- begin_fill()
- circle(5)
- color(160,82,45)#返回或设置pencolor和fillcolor
- end_fill()
-
- penup()
- setheading(0)
- forward(20)
- pendown()
- pencolor(255,155,192)
- setheading(10)
- begin_fill()
- circle(5)
- color(160,82,45)
- end_fill()
-
-
-def head(x,y):#头
- color((255,155,192),"pink")
- penup()
- goto(x,y)
- setheading(0)
- pendown()
- begin_fill()
- setheading(180)
- circle(300,-30)
- circle(100,-60)
- circle(80,-100)
- circle(150,-20)
- circle(60,-95)
- setheading(161)
- circle(-300,15)
- penup()
- goto(-100,100)
- pendown()
- setheading(-30)
- a=0.4
- for i in range(60):
- if 0<=i<30 or 60<=i<90:
- a=a+0.08
- lt(3) #向左转3度
- fd(a) #向前走a的步长
- else:
- a=a-0.08
- lt(3)
- fd(a)
- end_fill()
-
-
-def ears(x,y): #耳朵
- color((255,155,192),"pink")
- penup()
- goto(x,y)
- pendown()
- begin_fill()
- setheading(100)
- circle(-50,50)
- circle(-10,120)
- circle(-50,54)
- end_fill()
-
- penup()
- setheading(90)
- forward(-12)
- setheading(0)
- forward(30)
- pendown()
- begin_fill()
- setheading(100)
- circle(-50,50)
- circle(-10,120)
- circle(-50,56)
- end_fill()
-
-
-def eyes(x,y):#眼睛
- color((255,155,192),"white")
- penup()
- setheading(90)
- forward(-20)
- setheading(0)
- forward(-95)
- pendown()
- begin_fill()
- circle(15)
- end_fill()
-
- color("black")
- penup()
- setheading(90)
- forward(12)
- setheading(0)
- forward(-3)
- pendown()
- begin_fill()
- circle(3)
- end_fill()
-
- color((255,155,192),"white")
- penup()
- seth(90)
- forward(-25)
- seth(0)
- forward(40)
- pendown()
- begin_fill()
- circle(15)
- end_fill()
-
- color("black")
- penup()
- setheading(90)
- forward(12)
- setheading(0)
- forward(-3)
- pendown()
- begin_fill()
- circle(3)
- end_fill()
-
-
-def cheek(x,y):#腮
- color((255,155,192))
- penup()
- goto(x,y)
- pendown()
- setheading(0)
- begin_fill()
- circle(30)
- end_fill()
-
-
-def mouth(x,y): #嘴
- color(239,69,19)
- penup()
- goto(x,y)
- pendown()
- setheading(-80)
- circle(30,40)
- circle(40,80)
-
-
-def setting(): #参数设置
- pensize(4)
- hideturtle() #使乌龟无形(隐藏)
- colormode(255) #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
- color((255,155,192),"pink")
- setup(840,500)
- speed(10)
-
-
-def main():
- setting() #画布、画笔设置
- nose(-100,100) #鼻子
- head(-69,167) #头
- ears(0,160) #耳朵
- eyes(0,140) #眼睛
- cheek(80,10) #腮
- mouth(-20,30) #嘴
- done()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day01/res/python-idle.png b/Day01-15/Day01/res/python-idle.png
deleted file mode 100644
index 1e90598fc..000000000
Binary files a/Day01-15/Day01/res/python-idle.png and /dev/null differ
diff --git a/Day01-15/Day01/res/python-ipython.png b/Day01-15/Day01/res/python-ipython.png
deleted file mode 100644
index c3a9054fb..000000000
Binary files a/Day01-15/Day01/res/python-ipython.png and /dev/null differ
diff --git a/Day01-15/Day01/res/python-jupyter-1.png b/Day01-15/Day01/res/python-jupyter-1.png
deleted file mode 100644
index 58cedc50e..000000000
Binary files a/Day01-15/Day01/res/python-jupyter-1.png and /dev/null differ
diff --git a/Day01-15/Day01/res/python-jupyter-2.png b/Day01-15/Day01/res/python-jupyter-2.png
deleted file mode 100644
index 27249889e..000000000
Binary files a/Day01-15/Day01/res/python-jupyter-2.png and /dev/null differ
diff --git a/Day01-15/Day01/res/python-pycharm.png b/Day01-15/Day01/res/python-pycharm.png
deleted file mode 100644
index ffae8c3f4..000000000
Binary files a/Day01-15/Day01/res/python-pycharm.png and /dev/null differ
diff --git a/Day01-15/Day01/res/python-sublime.png b/Day01-15/Day01/res/python-sublime.png
deleted file mode 100644
index c786d13c1..000000000
Binary files a/Day01-15/Day01/res/python-sublime.png and /dev/null differ
diff --git "a/Day01-15/Day01/\345\210\235\350\257\206Python.md" "b/Day01-15/Day01/\345\210\235\350\257\206Python.md"
deleted file mode 100644
index 44f048b8f..000000000
--- "a/Day01-15/Day01/\345\210\235\350\257\206Python.md"
+++ /dev/null
@@ -1,253 +0,0 @@
-## Day01 - 初识Python
-
-### Python简介
-
-#### Python的历史
-
-1. 1989年圣诞节:Guido von Rossum开始写Python语言的编译器。
-2. 1991年2月:第一个Python编译器(同时也是解释器)诞生,它是用C语言实现的(后面又出现了Java和C#实现的版本Jython和IronPython,以及PyPy、Brython、Pyston等其他实现),可以调用C语言的库函数。在最早的版本中,Python已经提供了对“类”,“函数”,“异常处理”等构造块的支持,同时提供了“列表”和“字典”等核心数据类型,同时支持以模块为基础的拓展系统。
-3. 1994年1月:Python 1.0正式发布。
-4. 2000年10月16日:Python 2.0发布,增加了实现完整的[垃圾回收](https://zh.wikipedia.org/wiki/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8)),并且支持[Unicode](https://zh.wikipedia.org/wiki/Unicode)。与此同时,Python的整个开发过程更加透明,社区对开发进度的影响逐渐扩大,生态圈开始慢慢形成。
-5. 2008年12月3日:Python 3.0发布,此版不完全兼容之前的Python代码,不过很多新特性后来也被移植到旧的Python 2.6/2.7版本,因为目前还有公司在项目和运维中使用Python 2.x版本的代码。
-
-目前我们使用的Python 3.6.x的版本是在2016年的12月23日发布的,Python的版本号分为三段,形如A.B.C。其中A表示大版本号,一般当整体重写,或出现不向后兼容的改变时,增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(如修复了某个Bug),只要有修改就增加C。如果对Python的历史感兴趣,可以查看一篇名为[《Python简史》](http://www.cnblogs.com/vamei/archive/2013/02/06/2892628.html)的博文。
-
-#### Python的优缺点
-
-Python的优点很多,简单的可以总结为以下几点。
-
-1. 简单和明确,做一件事只有一种方法。
-2. 学习曲线低,与其他很多语言比上手更容易。
-3. 开放源代码,拥有强大的社区和生态圈。
-4. 解释型语言,完美的平台可移植性。
-5. 支持两种主流的编程范式,可以使用面向对象和函数式编程。
-6. 可扩展性和可嵌入性,可以调用C/C++代码也可以在C/C++中调用。
-7. 代码规范程度高,可读性强,适合有代码洁癖和强迫症的人群。
-
-Python的缺点主要集中在以下几点。
-
-1. 执行效率低下,因此计算密集型任务可以由C/C++编写。
-2. 代码无法加密,但是现在的公司很多都不是卖软件而是卖服务,这个问题慢慢会淡化。
-3. 在开发时可以选择的框架太多,有选择的地方就有错误。
-
-#### Python的应用领域
-
-目前Python在云基础设施、DevOps、网络爬虫开发、数据分析挖掘、机器学习等领域都有着广泛的应用,因此也产生了服务器开发、数据接口开发、自动化运维、科学计算和数据可视化、聊天机器人开发、图像识别和处理等一系列的职位。
-
-### 搭建编程环境
-
-#### Windows环境
-
-可以在[Python的官方网站](https://www.python.org)下载到Python的Windows安装程序(exe文件),需要注意的是如果在Windows 7环境下安装需要先安装Service Pack 1补丁包(可以通过一些工具软件自动安装系统补丁的功能来安装),安装过程建议勾选“Add Python 3.6 to PATH”(将Python 3.6添加到PATH环境变量)并选择自定义安装,在设置“Optional Features”界面最好将“pip”、“tcl/tk”、“Python test suite”等项全部勾选上。强烈建议使用自定义的安装路径并保证路径中没有中文。安装完成会看到“Setup was successful”的提示,但是在启动Python环境时可能会因为缺失一些动态链接库文件而导致Python解释器无法运行,常见的问题主要是api-ms-win-crt\*.dll缺失以及更新DirectX之后导致某些动态链接库文件缺失,前者可以参照[《api-ms-win-crt\*.dll缺失原因分析和解决方法》]()一文讲解的方法进行处理或者直接在[微软官网](https://www.microsoft.com/zh-cn/download/details.aspx?id=48145)下载Visual C++ Redistributable for Visual Studio 2015文件进行修复,后者可以下载一个DirectX修复工具进行修复。
-
-#### Linux环境
-
-Linux环境自带了Python 2.x版本,但是如果要更新到3.x的版本,可以在[Python的官方网站](https://www.python.org)下载Python的源代码并通过源代码构建安装的方式进行安装,具体的步骤如下所示。
-
-安装依赖库(因为没有这些依赖库可能在源代码构件安装时因为缺失底层依赖库而失败)。
-
-```Shell
-yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
-```
-
-下载Python源代码并解压缩到指定目录。
-
-```Shell
-wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
-xz -d Python-3.6.1.tar.xz
-tar -xvf Python-3.6.1.tar
-```
-
-切换至Python源代码目录并执行下面的命令进行配置和安装。
-
-```Shell
-cd Python-3.6.1
-./configure --prefix=/usr/local/python3.6 --enable-optimizations
-make && make install
-```
-
-创建软链接,这样就可以直接通过python3直接启动Python解释器。
-
-```Shell
-ln -s /usr/local/python3.6/bin/python3 /usr/bin/python3
-```
-
-
-#### MacOS环境
-
-MacOS也是自带了Python 2.x版本的,可以通过[Python的官方网站](https://www.python.org)提供的安装文件(pkg文件)安装3.x的版本。默认安装完成后,可以通过在终端执行python命令来启动2.x版本的Python解释器,可以通过执行python3命令来启动3.x版本的Python解释器,当然也可以通过重新设置软链接来修改启动Python解释器的命令。
-
-### 从终端运行Python程序
-
-#### 确认Python的版本
-
-在终端或命令行提示符中键入下面的命令。
-
-```Shell
-python --version
-```
-当然也可以先输入python进入交互式环境,再执行以下的代码检查Python的版本。
-
-```Python
-import sys
-
-print(sys.version_info)
-print(sys.version)
-```
-
-#### 编写Python源代码
-
-可以用文本编辑工具(推荐使用Sublime、Atom、TextMate、VSCode等高级文本编辑工具)编写Python源代码并将其命名为hello.py保存起来,代码内容如下所示。
-
-```Python
-print('hello, world!')
-```
-
-#### 运行程序
-
-切换到源代码所在的目录并执行下面的命令,看看屏幕上是否输出了"hello, world!"。
-
-```Shell
-python hello.py
-```
-
-### 代码中的注释
-
-注释是编程语言的一个重要组成部分,用于在源代码中解释代码的作用从而增强程序的可读性和可维护性,当然也可以将源代码中不需要参与运行的代码段通过注释来去掉,这一点在调试程序的时候经常用到。注释在随源代码进入预处理器或编译时会被移除,不会在目标代码中保留也不会影响程序的执行结果。
-
-1. 单行注释 - 以#和空格开头的部分
-2. 多行注释 - 三个引号开头,三个引号结尾
-
-```Python
-"""
-
-第一个Python程序 - hello, world!
-向伟大的Dennis M. Ritchie先生致敬
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-26
-
-"""
-
-print('hello, world!')
-# print("你好,世界!")
-print('你好', '世界')
-print('hello', 'world', sep=', ', end='!')
-print('goodbye, world', end='!\n')
-```
-
-### 其他工具介绍
-
-#### IDLE - 自带的集成开发工具
-
-IDLE是安装Python环境时自带的集成开发工具,如下图所示。但是由于IDLE的用户体验并不是那么好所以很少在实际开发中被采用。
-
-
-
-#### IPython - 更好的交互式编程工具
-
-IPython是一种基于Python的交互式解释器。相较于原生的Python Shell,IPython提供了更为强大的编辑和交互功能。可以通过Python的包管理工具pip安装IPython和Jupyter,具体的操作如下所示。
-
-```Shell
-pip install ipython jupyter
-```
-
-或者
-
-```Shell
-python -m pip install ipython jupyter
-```
-
-安装成功后,可以通过下面的ipython命令启动IPython,如下图所示。
-
-
-
-当然我们也可以通过Jupyter运行名为notebook的项目在浏览器窗口中进行交互式操作。
-
-```Shell
-jupyter notebook
-```
-
-
-
-
-
-#### Sublime - 文本编辑神器
-
-
-
-- 首先可以通过[官方网站](https://www.sublimetext.com/)下载安装程序安装Sublime 3或Sublime 2。
-
-- 安装包管理工具。通过快捷键Ctrl+`或者在View菜单中选择Show Console打开控制台,输入下面的代码。
-
- - Sublime 3
-
- ```Python
- import urllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
- ```
-
- - Sublime 2
-
- ```Python
- import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());print('Please restart Sublime Text to finish installation')
- ```
-
-- 安装插件。通过Preference菜单的Package Control或快捷键Ctrl+Shift+P打开命令面板,在面板中输入Install Package就可以找到安装插件的工具,然后再查找需要的插件。我们推荐大家安装以下几个插件。
-
- - SublimeCodeIntel - 代码自动补全工具插件
- - Emmet - 前端开发代码模板插件
- - Git - 版本控制工具插件
- - Python PEP8 Autoformat - PEP8规范自动格式化插件
- - ConvertToUTF8 - 将本地编码转换为UTF-8
-
-#### PyCharm - Python开发神器
-
-PyCharm的安装、配置和使用我们在后面会进行介绍。
-
-
-
-### 练习
-
-1. 在Python交互环境中下面的代码查看结果并将内容翻译成中文。
-
- ```Python
- import this
-
- Beautiful is better than ugly.
- Explicit is better than implicit.
- Simple is better than complex.
- Complex is better than complicated.
- Flat is better than nested.
- Sparse is better than dense.
- Readability counts.
- Special cases aren't special enough to break the rules.
- Although practicality beats purity.
- Errors should never pass silently.
- Unless explicitly silenced.
- In the face of ambiguity, refuse the temptation to guess.
- There should be one-- and preferably only one --obvious way to do it.
- Although that way may not be obvious at first unless you're Dutch.
- Now is better than never.
- Although never is often better than *right* now.
- If the implementation is hard to explain, it's a bad idea.
- If the implementation is easy to explain, it may be a good idea.
- Namespaces are one honking great idea -- let's do more of those!
- ```
-
-2. 学习使用turtle在屏幕上绘制图形。
-
- ```Python
- import turtle
-
- turtle.pensize(4)
- turtle.pencolor('red')
- turtle.forward(100)
- turtle.right(90)
- turtle.forward(100)
- turtle.right(90)
- turtle.forward(100)
- turtle.right(90)
- turtle.forward(100)
- turtle.mainloop()
- ```
diff --git a/Day01-15/Day02/centigrade.py b/Day01-15/Day02/centigrade.py
deleted file mode 100644
index e6d5f55a6..000000000
--- a/Day01-15/Day02/centigrade.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""
-
-将华氏温度转换为摄氏温度
-F = 1.8C + 32
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-f = float(input('请输入华氏温度: '))
-c = (f - 32) / 1.8
-print('%.1f华氏度 = %.1f摄氏度' % (f, c))
diff --git a/Day01-15/Day02/circle.py b/Day01-15/Day02/circle.py
deleted file mode 100644
index 020bf65e8..000000000
--- a/Day01-15/Day02/circle.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-
-输入半径计算圆的周长和面积
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-import math
-
-radius = float(input('请输入圆的半径: '))
-perimeter = 2 * math.pi * radius
-area = math.pi * radius * radius
-print('周长: %.2f' % perimeter)
-print('面积: %.2f' % area)
diff --git a/Day01-15/Day02/leap.py b/Day01-15/Day02/leap.py
deleted file mode 100644
index d83cc74eb..000000000
--- a/Day01-15/Day02/leap.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-
-输入年份 如果是闰年输出True 否则输出False
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-year = int(input('请输入年份: '))
-# 如果代码太长写成一行不便于阅读 可以使用\或()折行
-is_leap = (year % 4 == 0 and year % 100 != 0 or
- year % 400 == 0)
-print(is_leap)
diff --git a/Day01-15/Day02/operator.py b/Day01-15/Day02/operator.py
deleted file mode 100644
index 0bbd9fc99..000000000
--- a/Day01-15/Day02/operator.py
+++ /dev/null
@@ -1,33 +0,0 @@
-"""
-
-运算符的使用
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 5
-b = 10
-c = 3
-d = 4
-e = 5
-a += b
-a -= c
-a *= d
-a /= e
-print("a = ", a)
-
-flag1 = 3 > 2
-flag2 = 2 < 1
-flag3 = flag1 and flag2
-flag4 = flag1 or flag2
-flag5 = not flag1
-print("flag1 = ", flag1)
-print("flag2 = ", flag2)
-print("flag3 = ", flag3)
-print("flag4 = ", flag4)
-print("flag5 = ", flag5)
-print(flag1 is True)
-print(flag2 is not False)
diff --git a/Day01-15/Day02/string.py b/Day01-15/Day02/string.py
deleted file mode 100644
index bc60550c2..000000000
--- a/Day01-15/Day02/string.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-
-字符串常用操作
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-str1 = 'hello, world!'
-print('字符串的长度是:', len(str1))
-print('单词首字母大写: ', str1.title())
-print('字符串变大写: ', str1.upper())
-# str1 = str1.upper()
-print('字符串是不是大写: ', str1.isupper())
-print('字符串是不是以hello开头: ', str1.startswith('hello'))
-print('字符串是不是以hello结尾: ', str1.endswith('hello'))
-print('字符串是不是以感叹号开头: ', str1.startswith('!'))
-print('字符串是不是一感叹号结尾: ', str1.endswith('!'))
-str2 = '- \u9a86\u660a'
-str3 = str1.title() + ' ' + str2.lower()
-print(str3)
diff --git a/Day01-15/Day02/variable1.py b/Day01-15/Day02/variable1.py
deleted file mode 100644
index f2c5fe379..000000000
--- a/Day01-15/Day02/variable1.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-使用变量保存数据并进行操作
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 321
-b = 123
-print(a + b)
-print(a - b)
-print(a * b)
-print(a / b)
-print(a // b)
-print(a % b)
-print(a ** b)
diff --git a/Day01-15/Day02/variable2.py b/Day01-15/Day02/variable2.py
deleted file mode 100644
index 398cc69f2..000000000
--- a/Day01-15/Day02/variable2.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-将input函数输入的数据保存在变量中并进行操作
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = int(input('a = '))
-b = int(input('b = '))
-print(a + b)
-print(a - b)
-print(a * b)
-print(a / b)
-print(a // b)
-print(a % b)
-print(a ** b)
diff --git a/Day01-15/Day02/variable3.py b/Day01-15/Day02/variable3.py
deleted file mode 100644
index 4e4b4e175..000000000
--- a/Day01-15/Day02/variable3.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-格式化输出
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = int(input('a = '))
-b = int(input('b = '))
-print('%d + %d = %d' % (a, b, a + b))
-print('%d - %d = %d' % (a, b, a - b))
-print('%d * %d = %d' % (a, b, a * b))
-print('%d / %d = %f' % (a, b, a / b))
-print('%d // %d = %d' % (a, b, a // b))
-print('%d %% %d = %d' % (a, b, a % b))
-print('%d ** %d = %d' % (a, b, a ** b))
diff --git a/Day01-15/Day02/variable4.py b/Day01-15/Day02/variable4.py
deleted file mode 100644
index 62a08233f..000000000
--- a/Day01-15/Day02/variable4.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""
-
-检查变量的类型
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 100
-b = 1000000000000000000
-c = 12.345
-d = 1 + 5j
-e = 'A'
-f = 'hello, world'
-g = True
-print(type(a))
-print(type(b))
-print(type(c))
-print(type(d))
-print(type(e))
-print(type(f))
-print(type(g))
diff --git a/Day01-15/Day02/variable5.py b/Day01-15/Day02/variable5.py
deleted file mode 100644
index 6560f2dc7..000000000
--- a/Day01-15/Day02/variable5.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-
-类型转换
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 100
-b = str(a)
-c = 12.345
-d = str(c)
-e = '123'
-f = int(e)
-g = '123.456'
-h = float(g)
-i = False
-j = str(i)
-k = 'hello'
-m = bool(k)
-print(a)
-print(type(a))
-print(b)
-print(type(b))
-print(c)
-print(type(c))
-print(d)
-print(type(d))
-print(e)
-print(type(e))
-print(f)
-print(type(f))
-print(g)
-print(type(g))
-print(h)
-print(type(h))
-print(i)
-print(type(i))
-print(j)
-print(type(j))
-print(k)
-print(type(k))
-print(m)
-print(type(m))
diff --git "a/Day01-15/Day02/\350\257\255\350\250\200\345\205\203\347\264\240.md" "b/Day01-15/Day02/\350\257\255\350\250\200\345\205\203\347\264\240.md"
deleted file mode 100644
index 87a3af640..000000000
--- "a/Day01-15/Day02/\350\257\255\350\250\200\345\205\203\347\264\240.md"
+++ /dev/null
@@ -1,242 +0,0 @@
-## Day02 - 语言元素
-
-#### 指令和程序
-
-计算机的硬件系统通常由五大部件构成,包括:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器放在一起就是我们通常所说的中央处理器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据。我们通常所说的程序实际上就是指令的集合,我们程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。今天我们使用的计算机虽然器件做工越来越精密,处理能力越来越强大,但究其本质来说仍然属于[“冯·诺依曼结构”](https://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84)的计算机。“冯·诺依曼结构”有两个关键点,一是提出了将存储设备与中央处理器分开,二是提出了将数据以二进制方式编码。二进制是一种“逢二进一”的计数法,跟我们人类使用的“逢十进一”的计数法没有实质性的区别,人类因为有十根手指所以使用了十进制(因为在数数时十根手指用完之后就只能进位了,当然凡事都有例外,玛雅人可能是因为长年光着脚的原因把脚趾头也算上了,于是他们使用了二十进制的计数法,在这种计数法的指导下玛雅人的历法就与我们的不太一致,而按照玛雅人的历法,2012年是上一个所谓的“太阳纪”的最后一年,而2013年则是新的“太阳纪”的开始,后来这件事情被以讹传讹的方式误传为2012年就是玛雅人预言的世界末日这种荒诞的说法,今天我们可以大胆的猜测,玛雅文明之所以发展缓慢估计也与使用了二十进制有关),对于计算机来说,二进制在物理器件上来说是最容易实现的(高电压表示1,低电压表示0),于是在“冯·诺依曼结构”的计算机都使用了二进制。虽然我们并不需要每个程序员都能够使用二进制的思维方式来工作,但是了解二进制以及它与我们生活中的十进制之间的转换关系,以及二进制与八进制和十六进制的转换关系还是有必要的。如果你对这一点不熟悉,可以自行使用[维基百科](https://zh.wikipedia.org/wiki/%E4%BA%8C%E8%BF%9B%E5%88%B6)或者[度娘](https://www.baidu.com)科普一下。
-
-### 变量和类型
-
-在程序设计中,变量是一种存储数据的载体。计算机中的变量是实际存在的数据或者说是存储器中存储数据的一块内存空间,变量的值可以被读取和修改,这是所有计算和控制的基础。计算机能处理的数据有很多中类型,除了数值之外还可以处理文本、图形、音频、视频等各种各样的数据,那么不同的数据就需要定义不同的存储类型。Python中的数据类型很多,而且也允许我们自定义新的数据类型(这一点在后面会讲到),我们先介绍几种常用的数据类型。
-
-- 整型:Python中可以处理任意大小的整数(Python 2.x中有int和long两种类型的整数,但这种区分对Python来说意义不大,因此在Python 3.x中整数只有int这一种了),而且支持二进制(如`0b100`,换算成十进制是4)、八进制(如`0o100`,换算成十进制是64)、十进制(`100`)和十六进制(`0x100`,换算成十进制是256)的表示法。
-- 浮点型:浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如`123.456`)之外还支持科学计数法(如`1.23456e2`)。
-- 字符串型:字符串是以单引号或双引号括起来的任意文本,比如`'hello'`和`"hello"`,字符串还有原始字符串表示法、字节字符串表示法、Unicode字符串表示法,而且可以书写成多行的形式(用三个单引号或三个双引号开头,三个单引号或三个双引号结尾)。
-- 布尔型:布尔值只有`True`、`False`两种值,要么是`True`,要么是`False`,在Python中,可以直接用`True`、`False`表示布尔值(请注意大小写),也可以通过布尔运算计算出来(例如`3 < 5`会产生布尔值`True`,而`2 == 1`会产生布尔值`False`)。
-- 复数型:形如`3+5j`,跟数学上的复数表示一样,唯一不同的是虚部的i换成了j。
-
-#### 变量命名
-
-对于每个变量我们需要给它取一个名字,就如同我们每个人都有属于自己的响亮的名字一样。在Python中,变量命名需要遵循以下这些必须遵守硬性规则和强烈建议遵守的非硬性规则。
-
-- 硬性规则:
- - 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。
- - 大小写敏感(大写的`a`和小写的`A`是两个不同的变量)。
- - 不要跟关键字(有特殊含义的单词,后面会讲到)和系统保留字(如函数、模块等的名字)冲突。
-- PEP 8要求:
- - 用小写字母拼写,多个单词用下划线连接。
- - 受保护的实例属性用单个下划线开头(后面会讲到)。
- - 私有的实例属性用两个下划线开头(后面会讲到)。
-
-当然,作为一个专业的程序员,给变量(事实上应该是所有的标识符)命名做到见名知意也是非常重要的。
-
-#### 变量的使用
-
-下面通过几个例子来说明变量的类型和变量使用。
-
-```Python
-"""
-
-使用变量保存数据并进行算术运算
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 321
-b = 123
-print(a + b)
-print(a - b)
-print(a * b)
-print(a / b)
-print(a // b)
-print(a % b)
-print(a ** b)
-
-```
-
-```Python
-"""
-
-使用input函数输入
-使用int()进行类型转换
-用占位符格式化输出的字符串
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = int(input('a = '))
-b = int(input('b = '))
-print('%d + %d = %d' % (a, b, a + b))
-print('%d - %d = %d' % (a, b, a - b))
-print('%d * %d = %d' % (a, b, a * b))
-print('%d / %d = %f' % (a, b, a / b))
-print('%d // %d = %d' % (a, b, a // b))
-print('%d %% %d = %d' % (a, b, a % b))
-print('%d ** %d = %d' % (a, b, a ** b))
-
-```
-
-```Python
-"""
-
-使用type()检查变量的类型
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 100
-b = 12.345
-c = 1 + 5j
-d = 'hello, world'
-e = True
-print(type(a))
-print(type(b))
-print(type(c))
-print(type(d))
-print(type(e))
-
-```
-
-在对变量类型进行转换时可以使用Python的内置函数(准确的说下面列出的并不是真正意义上的函数,而是后面我们要讲到的创建对象的构造方法)。
-
-- int():将一个数值或字符串转换成整数,可以指定进制。
-- float():将一个字符串转换成浮点数。
-- str():将指定的对象转换成字符串形式,可以指定编码。
-- chr():将整数转换成该编码对应的字符串(一个字符)。
-- ord():将字符串(一个字符)转换成对应的编码(整数)。
-
-### 运算符
-
-Python支持多种运算符,下表大致按照优先级从高到低的顺序列出了所有的运算符,我们会陆续使用到它们。
-
-| 运算符 | 描述 |
-| ------------------------------------------------------------ | ------------------------------ |
-| `[]` `[:]` | 下标,切片 |
-| `**` | 指数 |
-| `~` `+` `-` | 按位取反, 正负号 |
-| `*` `/` `%` `//` | 乘,除,模,整除 |
-| `+` `-` | 加,减 |
-| `>>` `<<` | 右移,左移 |
-| `&` | 按位与 |
-| `^` `|` | 按位异或,按位或 |
-| `<=` `<` `>` `>=` | 小于等于,小于,大于,大于等于 |
-| `==` `!=` | 等于,不等于 |
-| `is` `is not` | 身份运算符 |
-| `in` `not in` | 成员运算符 |
-| `not` `or` `and` | 逻辑运算符 |
-| `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` | (复合)赋值运算符 |
-
->**说明:**在实际开发中,如果搞不清楚优先级可以使用括号来确保运算的执行顺序。
-
-下面的例子演示了运算符的使用。
-
-```Python
-"""
-
-运算符的使用
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-a = 5
-b = 10
-c = 3
-d = 4
-e = 5
-a += b
-a -= c
-a *= d
-a /= e
-print("a = ", a)
-
-flag1 = 3 > 2
-flag2 = 2 < 1
-flag3 = flag1 and flag2
-flag4 = flag1 or flag2
-flag5 = not flag1
-print("flag1 = ", flag1)
-print("flag2 = ", flag2)
-print("flag3 = ", flag3)
-print("flag4 = ", flag4)
-print("flag5 = ", flag5)
-print(flag1 is True)
-print(flag2 is not False)
-
-```
-
-### 练习
-
-#### 练习1:华氏温度转摄氏温度。
-
-```Python
-"""
-
-将华氏温度转换为摄氏温度
-F = 1.8C + 32
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-f = float(input('请输入华氏温度: '))
-c = (f - 32) / 1.8
-print('%.1f华氏度 = %.1f摄氏度' % (f, c))
-
-```
-
-#### 练习2:输入圆的半径计算计算周长和面积。
-
-```Python
-"""
-
-输入半径计算圆的周长和面积
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-import math
-
-radius = float(input('请输入圆的半径: '))
-perimeter = 2 * math.pi * radius
-area = math.pi * radius * radius
-print('周长: %.2f' % perimeter)
-print('面积: %.2f' % area)
-
-```
-
-#### 练习3:输入年份判断是不是闰年。
-
-```Python
-"""
-
-输入年份 如果是闰年输出True 否则输出False
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-27
-
-"""
-
-year = int(input('请输入年份: '))
-# 如果代码太长写成一行不便于阅读 可以使用\或()折行
-is_leap = (year % 4 == 0 and year % 100 != 0 or
- year % 400 == 0)
-print(is_leap)
-```
-
diff --git a/Day01-15/Day03/.py b/Day01-15/Day03/.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/Day01-15/Day03/convert.py b/Day01-15/Day03/convert.py
deleted file mode 100644
index 2e2f587f9..000000000
--- a/Day01-15/Day03/convert.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-
-英制单位英寸和公制单位厘米互换
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-value = float(input('请输入长度: '))
-unit = input('请输入单位: ')
-if unit == 'in' or unit == '英寸':
- print('%f英寸 = %f厘米' % (value, value * 2.54))
-elif unit == 'cm' or unit == '厘米':
- print('%f厘米 = %f英寸' % (value, value / 2.54))
-else:
- print('请输入有效的单位')
diff --git a/Day01-15/Day03/grade.py b/Day01-15/Day03/grade.py
deleted file mode 100644
index a48ecedba..000000000
--- a/Day01-15/Day03/grade.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-
-百分制成绩转等级制成绩
-90分以上 --> A
-80分~89分 --> B
-70分~79分 --> C
-60分~69分 --> D
-60分以下 --> E
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-score = float(input('请输入成绩: '))
-if score >= 90:
- grade = 'A'
-elif score >= 80:
- grade = 'B'
-elif score >= 70:
- grade = 'C'
-elif score >= 60:
- grade = 'D'
-else:
- grade = 'E'
-print('对应的等级是:', grade)
diff --git a/Day01-15/Day03/piecewise.py b/Day01-15/Day03/piecewise.py
deleted file mode 100644
index fc6bfbd9b..000000000
--- a/Day01-15/Day03/piecewise.py
+++ /dev/null
@@ -1,21 +0,0 @@
-"""
-
-分段函数求值
- 3x - 5 (x > 1)
-f(x) = x + 2 (-1 <= x <= 1)
- 5x + 3 (x < -1)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-x = float(input('x = '))
-if x > 1:
- y = 3 * x - 5
-elif x >= -1:
- y = x + 2
-else:
- y = 5 * x + 3
-print('f(%.2f) = %.2f' % (x, y))
diff --git a/Day01-15/Day03/rolldice.py b/Day01-15/Day03/rolldice.py
deleted file mode 100644
index 76373d0e8..000000000
--- a/Day01-15/Day03/rolldice.py
+++ /dev/null
@@ -1,26 +0,0 @@
-"""
-
-掷骰子决定做什么事情
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-from random import randint
-
-face = randint(1, 6)
-if face == 1:
- result = '唱首歌'
-elif face == 2:
- result = '跳个舞'
-elif face == 3:
- result = '学狗叫'
-elif face == 4:
- result = '做俯卧撑'
-elif face == 5:
- result = '念绕口令'
-else:
- result = '讲冷笑话'
-print(result)
diff --git a/Day01-15/Day03/tax.py b/Day01-15/Day03/tax.py
deleted file mode 100644
index d404bff64..000000000
--- a/Day01-15/Day03/tax.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""
-
-输入月收入和五险一金计算个人所得税
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-salary = float(input('本月收入: '))
-insurance = float(input('五险一金: '))
-diff = salary - insurance - 3500
-if diff <= 0:
- rate = 0
- deduction = 0
-elif diff < 1500:
- rate = 0.03
- deduction = 0
-elif diff < 4500:
- rate = 0.1
- deduction = 105
-elif diff < 9000:
- rate = 0.2
- deduction = 555
-elif diff < 35000:
- rate = 0.25
- deduction = 1005
-elif diff < 55000:
- rate = 0.3
- deduction = 2755
-elif diff < 80000:
- rate = 0.35
- deduction = 5505
-else:
- rate = 0.45
- deduction = 13505
-tax = abs(diff * rate - deduction)
-print('个人所得税: ¥%.2f元' % tax)
-print('实际到手收入: ¥%.2f元' % (diff + 3500 - tax))
diff --git a/Day01-15/Day03/triangle.py b/Day01-15/Day03/triangle.py
deleted file mode 100644
index 4c4c7a437..000000000
--- a/Day01-15/Day03/triangle.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-
-判断输入的边长能否构成三角形
-如果能则计算出三角形的周长和面积
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-import math
-
-a = float(input('a = '))
-b = float(input('b = '))
-c = float(input('c = '))
-if a + b > c and a + c > b and b + c > a:
- print('周长: %f' % (a + b + c))
- p = (a + b + c) / 2
- area = math.sqrt(p * (p - a) * (p - b) * (p - c))
- print('面积: %f' % (area))
-else:
- print('不能构成三角形')
diff --git a/Day01-15/Day03/verify.py b/Day01-15/Day03/verify.py
deleted file mode 100644
index e2587dc44..000000000
--- a/Day01-15/Day03/verify.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""
-
-用户身份验证
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-# import getpass
-# from getpass import getpass
-# from getpass import *
-
-username = input('请输入用户名: ')
-password = input('请输入口令: ')
-# 输入口令的时候终端中没有回显
-# password = getpass.getpass('请输入口令: ')
-if username == 'admin' and password == '123456':
- print('身份验证成功!')
-else:
- print('身份验证失败!')
diff --git "a/Day01-15/Day03/\345\210\206\346\224\257\347\273\223\346\236\204.md" "b/Day01-15/Day03/\345\210\206\346\224\257\347\273\223\346\236\204.md"
deleted file mode 100644
index 23da1e84d..000000000
--- "a/Day01-15/Day03/\345\210\206\346\224\257\347\273\223\346\236\204.md"
+++ /dev/null
@@ -1,262 +0,0 @@
-## Day03 - 分支结构
-
-### 分支结构的应用场景
-
-迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种结构的代码我们称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后我们要根据玩家得到分数来决定究竟是进入第二关还是告诉玩家“Game Over”,这里就会产生两个分支,而且这两个分支只有一个会被执行,这就是程序中分支结构。类似的场景还有很多,给大家一分钟的时间,你应该可以想到至少5个以上这样的例子,赶紧试一试。
-
-### if语句的使用
-
-在Python中,要构造分支结构可以使用`if`、`elif`和`else`关键字。所谓关键字就是有特殊含义的单词,像`if`和`else`就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他的标识符也是不可以)。下面的例子中演示了如何构造一个分支结构。
-
-```Python
-"""
-
-用户身份验证
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-username = input('请输入用户名: ')
-password = input('请输入口令: ')
-# 如果希望输入口令时 终端中没有回显 可以使用getpass模块的getpass函数
-# import getpass
-# password = getpass.getpass('请输入口令: ')
-if username == 'admin' and password == '123456':
- print('身份验证成功!')
-else:
- print('身份验证失败!')
-
-```
-
-唯一需要说明的是和C/C++、Java等语言不同,Python中没有用花括号来构造代码块而是使用了缩进的方式来设置代码的层次结构,如果`if`条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了,换句话说连续的代码如果又保持了相同的缩进那么它们属于同一个代码块,相当于是一个执行的整体。
-
-当然如果要构造出更多的分支,可以使用`if…elif…else…`结构,例如下面的分段函数求值。
-
-$$f(x)=\begin{cases} 3x-5&\text{(x>1)}\\x+2&\text{(-1}\leq\text{x}\leq\text{1)}\\5x+3&\text {(x<-1)}\end{cases}$$
-
-```Python
-"""
-
-分段函数求值
-
- 3x - 5 (x > 1)
-f(x) = x + 2 (-1 <= x <= 1)
- 5x + 3 (x < -1)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-x = float(input('x = '))
-if x > 1:
- y = 3 * x - 5
-elif x >= -1:
- y = x + 2
-else:
- y = 5 * x + 3
-print('f(%.2f) = %.2f' % (x, y))
-
-```
-
-当然根据实际开发的需要,分支结构是可以嵌套的,例如判断是否通关以后还要根据你获得的宝物或者道具的数量对你的表现给出等级(比如点亮两颗或三颗星星),那么我们就需要在`if`的内部构造出一个新的分支结构,同理`elif`和`else`中也可以再构造新的分支,我们称之为嵌套的分支结构,也就是说上面的代码也可以写成下面的样子。
-
-```Python
-"""
-
-分段函数求值
- 3x - 5 (x > 1)
-f(x) = x + 2 (-1 <= x <= 1)
- 5x + 3 (x < -1)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-x = float(input('x = '))
-if x > 1:
- y = 3 * x - 5
-else:
- if x >= -1:
- y = x + 2
- else:
- y = 5 * x + 3
-print('f(%.2f) = %.2f' % (x, y))
-```
-
-> **说明:**大家可以自己感受一下这两种写法到底是哪一种更好。在之前我们提到的Python之禅中有这么一句话“Flat is bettern than nested.”,之所以提出这个观点是因为嵌套结构的嵌套层次多了之后会严重的影响代码的可读性,如果可以使用扁平化的结构就不要去用嵌套,因此之前的写法是更好的做法。
-
-### 练习
-
-#### 练习1:英制单位与公制单位互换
-
-```Python
-"""
-
-英制单位英寸和公制单位厘米互换
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-value = float(input('请输入长度: '))
-unit = input('请输入单位: ')
-if unit == 'in' or unit == '英寸':
- print('%f英寸 = %f厘米' % (value, value * 2.54))
-elif unit == 'cm' or unit == '厘米':
- print('%f厘米 = %f英寸' % (value, value / 2.54))
-else:
- print('请输入有效的单位')
-
-```
-
-#### 练习2:掷骰子决定做什么
-
-```Python
-"""
-
-掷骰子决定做什么事情
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-from random import randint
-
-face = randint(1, 6)
-if face == 1:
- result = '唱首歌'
-elif face == 2:
- result = '跳个舞'
-elif face == 3:
- result = '学狗叫'
-elif face == 4:
- result = '做俯卧撑'
-elif face == 5:
- result = '念绕口令'
-else:
- result = '讲冷笑话'
-print(result)
-
-```
-> **说明:**上面的代码中使用了random模块的randint函数生成指定范围的随机数来模拟掷骰子。
-
-#### 练习3:百分制成绩转等级制
-
-```Python
-"""
-
-百分制成绩转等级制成绩
-90分以上 --> A
-80分~89分 --> B
-70分~79分 --> C
-60分~69分 --> D
-60分以下 --> E
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-score = float(input('请输入成绩: '))
-if score >= 90:
- grade = 'A'
-elif score >= 80:
- grade = 'B'
-elif score >= 70:
- grade = 'C'
-elif score >= 60:
- grade = 'D'
-else:
- grade = 'E'
-print('对应的等级是:', grade)
-
-```
-#### 练习4:输入三条边长如果能构成三角形就计算周长和面积
-
-```Python
-"""
-
-判断输入的边长能否构成三角形
-如果能则计算出三角形的周长和面积
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-import math
-
-a = float(input('a = '))
-b = float(input('b = '))
-c = float(input('c = '))
-if a + b > c and a + c > b and b + c > a:
- print('周长: %f' % (a + b + c))
- p = (a + b + c) / 2
- area = math.sqrt(p * (p - a) * (p - b) * (p - c))
- print('面积: %f' % (area))
-else:
- print('不能构成三角形')
-
-```
-> **说明:**上面的代码中使用了`math`模块的`sqrt`函数来计算平方根。用边长计算三角形面积的公式叫做[海伦公式](https://zh.wikipedia.org/zh-hans/海伦公式)。
-
-#### 练习5:实现一个个人所得税计算器。
-
-```Python
-"""
-
-输入月收入和五险一金计算个人所得税
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-02-28
-
-"""
-
-salary = float(input('本月收入: '))
-insurance = float(input('五险一金: '))
-diff = salary - insurance - 3500
-if diff <= 0:
- rate = 0
- deduction = 0
-elif diff < 1500:
- rate = 0.03
- deduction = 0
-elif diff < 4500:
- rate = 0.1
- deduction = 105
-elif diff < 9000:
- rate = 0.2
- deduction = 555
-elif diff < 35000:
- rate = 0.25
- deduction = 1005
-elif diff < 55000:
- rate = 0.3
- deduction = 2755
-elif diff < 80000:
- rate = 0.35
- deduction = 5505
-else:
- rate = 0.45
- deduction = 13505
-tax = abs(diff * rate - deduction)
-print('个人所得税: ¥%.2f元' % tax)
-print('实际到手收入: ¥%.2f元' % (diff + 3500 - tax))
-
-```
->**说明:**上面的代码中使用了Python内置的`abs()`函数取绝对值来处理`-0`的问题。
-
diff --git a/Day01-15/Day04/for1.py b/Day01-15/Day04/for1.py
deleted file mode 100644
index e2a0783ec..000000000
--- a/Day01-15/Day04/for1.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-
-用for循环实现1~100求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-for x in range(1, 101):
- if x % 2 == 0:
- sum += x
-print(sum)
diff --git a/Day01-15/Day04/for2.py b/Day01-15/Day04/for2.py
deleted file mode 100644
index 65bd932b6..000000000
--- a/Day01-15/Day04/for2.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""
-
-用for循环实现1~100之间的偶数求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-for x in range(2, 101, 2):
- sum += x
-print(sum)
diff --git a/Day01-15/Day04/for3.py b/Day01-15/Day04/for3.py
deleted file mode 100644
index bfc9d8533..000000000
--- a/Day01-15/Day04/for3.py
+++ /dev/null
@@ -1,15 +0,0 @@
-"""
-
-输入非负整数n计算n!
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-n = int(input('n = '))
-result = 1
-for x in range(1, n + 1):
- result *= x
-print('%d! = %d' % (n, result))
diff --git a/Day01-15/Day04/for4.py b/Day01-15/Day04/for4.py
deleted file mode 100644
index 0cd4e548f..000000000
--- a/Day01-15/Day04/for4.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-
-输入一个正整数判断它是不是素数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-from math import sqrt
-
-num = int(input('请输入一个正整数: '))
-end = int(sqrt(num))
-is_prime = True
-for x in range(2, end + 1):
- if num % x == 0:
- is_prime = False
- break
-if is_prime and num != 1:
- print('%d是素数' % num)
-else:
- print('%d不是素数' % num)
diff --git a/Day01-15/Day04/for5.py b/Day01-15/Day04/for5.py
deleted file mode 100644
index b4683fa09..000000000
--- a/Day01-15/Day04/for5.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-输入两个正整数计算最大公约数和最小公倍数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-x = int(input('x = '))
-y = int(input('y = '))
-if x > y:
- (x, y) = (y, x)
-for factor in range(x, 0, -1):
- if x % factor == 0 and y % factor == 0:
- print('%d和%d的最大公约数是%d' % (x, y, factor))
- print('%d和%d的最小公倍数是%d' % (x, y, x * y // factor))
- break
diff --git a/Day01-15/Day04/for6.py b/Day01-15/Day04/for6.py
deleted file mode 100644
index ed3c0fc73..000000000
--- a/Day01-15/Day04/for6.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""
-
-打印各种三角形图案
-
-*
-**
-***
-****
-*****
-
- *
- **
- ***
- ****
-*****
-
- *
- ***
- *****
- *******
-*********
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-row = int(input('请输入行数: '))
-for i in range(row):
- for _ in range(i + 1):
- print('*', end='')
- print()
-
-for i in range(row):
- for j in range(row):
- if j < row - i - 1:
- print(' ', end='')
- else:
- print('*', end='')
- print()
-
-for i in range(row):
- for _ in range(row - i - 1):
- print(' ', end='')
- for _ in range(2 * i + 1):
- print('*', end='')
- print()
diff --git a/Day01-15/Day04/while1.py b/Day01-15/Day04/while1.py
deleted file mode 100644
index 3a3d6e6cc..000000000
--- a/Day01-15/Day04/while1.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-
-用while循环实现1~100求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-num = 1
-while num <= 100:
- sum += num
- num += 1
-print(sum)
diff --git a/Day01-15/Day04/while2.py b/Day01-15/Day04/while2.py
deleted file mode 100644
index 1e7066cc8..000000000
--- a/Day01-15/Day04/while2.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-
-用while循环实现1~100之间的偶数求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-num = 2
-while num <= 100:
- sum += num
- num += 2
-print(sum)
diff --git "a/Day01-15/Day04/\345\276\252\347\216\257\347\273\223\346\236\204.md" "b/Day01-15/Day04/\345\276\252\347\216\257\347\273\223\346\236\204.md"
deleted file mode 100644
index af5ab166d..000000000
--- "a/Day01-15/Day04/\345\276\252\347\216\257\347\273\223\346\236\204.md"
+++ /dev/null
@@ -1,243 +0,0 @@
-## Day04 - 循环结构
-
-### 循环结构的应用场景
-
-如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向奔跑的指令。当然你可能已经注意到了,刚才的描述中其实不仅仅有需要重复的动作,还有我们上一个章节讲到的分支结构。再举一个简单的例子,比如在我们的程序中要实现每隔1秒中在屏幕上打印一个"hello, world"这样的字符串并持续一个小时,我们肯定不能够将`print('hello, world')`这句代码写上3600遍,如果真的需要这样做那么我们的工作就太无聊了。因此,我们需要循环结构,使用循环结构我们就可以轻松的控制某件事或者某些事重复、重复、再重复的发生。在Python中构造循环结构有两种做法,一种是`for-in`循环,一种是`while`循环。
-
-### for-in循环
-
-如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用`for-in`循环,例如下面代码中计算$\sum_{n=1}^{100}n$。
-
-```Python
-"""
-
-用for循环实现1~100求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-for x in range(101):
- sum += x
-print(sum)
-```
-
-需要说明的是上面代码中的`range`类型,`range`可以用来产生一个不变的数值序列,而且这个序列通常都是用在循环中的,例如:
-
-- `range(101)`可以产生一个0到100的整数序列。
-- `range(1, 100)`可以产生一个1到99的整数序列。
-- `range(1, 100, 2)`可以产生一个1到99的奇数序列,其中的2是步长,即数值序列的增量。
-
-知道了这一点,我们可以用下面的代码来实现1~100之间的偶数求和。
-
-```Python
-"""
-
-用for循环实现1~100之间的偶数求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-for x in range(2, 101, 2):
- sum += x
-print(sum)
-```
-
-也可以通过在循环中使用分支结构的方式来实现相同的功能,代码如下所示。
-
-```Python
-"""
-
-用for循环实现1~100之间的偶数求和
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-sum = 0
-for x in range(1, 101):
- if x % 2 == 0:
- sum += x
-print(sum)
-
-```
-
-### while循环
-
-如果要构造不知道具体循环次数的循环结构,我们推荐使用`while`循环,`while`循环通过一个能够产生或转换出`bool`值的表达式来控制循环,表达式的值为`True`循环继续,表达式的值为`False`循环结束。下面我们通过一个“猜数字”的小游戏(计算机出一个1~100之间的随机数,人输入自己猜的数字,计算机给出对应的提示信息,直到人猜出计算机出的数字)来看看如何使用`while`循环。
-
-```Python
-"""
-
-猜数字游戏
-计算机出一个1~100之间的随机数由人来猜
-计算机根据人猜的数字分别给出提示大一点/小一点/猜对了
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-import random
-
-answer = random.randint(1, 100)
-counter = 0
-while True:
- counter += 1
- number = int(input('请输入: '))
- if number < answer:
- print('大一点')
- elif number > answer:
- print('小一点')
- else:
- print('恭喜你猜对了!')
- break
-print('你总共猜了%d次' % counter)
-if counter > 7:
- print('你的智商余额明显不足')
-
-```
-
-> **说明:**上面的代码中使用了`break`关键字来提前终止循环,需要注意的是`break`只能终止它所在的那个循环,这一点在使用嵌套的循环结构(下面会讲到)需要引起注意。除了`break`之外,还有另一个关键字是`continue`,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。
-
-和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个九九乘法表。
-
-```Python
-"""
-
-输出乘法口诀表(九九表)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-for i in range(1, 10):
- for j in range(1, i + 1):
- print('%d*%d=%d' % (i, j, i * j), end='\t')
- print()
-
-```
-
-### 练习
-
-#### 练习1:输入一个数判断是不是素数。
-
-```Python
-"""
-
-输入一个正整数判断它是不是素数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-from math import sqrt
-
-num = int(input('请输入一个正整数: '))
-end = int(sqrt(num))
-is_prime = True
-for x in range(2, end + 1):
- if num % x == 0:
- is_prime = False
- break
-if is_prime and num != 1:
- print('%d是素数' % num)
-else:
- print('%d不是素数' % num)
-
-```
-
-#### 练习2:输入两个正整数,计算最大公约数和最小公倍数。
-
-```Python
-"""
-
-输入两个正整数计算最大公约数和最小公倍数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-x = int(input('x = '))
-y = int(input('y = '))
-if x > y:
- (x, y) = (y, x)
-for factor in range(x, 0, -1):
- if x % factor == 0 and y % factor == 0:
- print('%d和%d的最大公约数是%d' % (x, y, factor))
- print('%d和%d的最小公倍数是%d' % (x, y, x * y // factor))
- break
-
-```
-
-#### 练习3:打印三角形图案。
-
-```Python
-"""
-
-打印各种三角形图案
-
-*
-**
-***
-****
-*****
-
- *
- **
- ***
- ****
-*****
-
- *
- ***
- *****
- *******
-*********
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-01
-
-"""
-
-row = int(input('请输入行数: '))
-for i in range(row):
- for _ in range(i + 1):
- print('*', end='')
- print()
-
-
-for i in range(row):
- for j in range(row):
- if j < row - i - 1:
- print(' ', end='')
- else:
- print('*', end='')
- print()
-
-for i in range(row):
- for _ in range(row - i - 1):
- print(' ', end='')
- for _ in range(2 * i + 1):
- print('*', end='')
- print()
-
-```
-
diff --git a/Day01-15/Day05/chicken.py b/Day01-15/Day05/chicken.py
deleted file mode 100644
index 639cb0078..000000000
--- a/Day01-15/Day05/chicken.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-求解《百钱百鸡》问题
-1只公鸡5元 1只母鸡3元 3只小鸡1元 用100元买100只鸡
-问公鸡 母鸡 小鸡各有多少只
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-for x in range(0, 20):
- for y in range(0, 33):
- z = 100 - x - y
- if 5 * x + 3 * y + z / 3 == 100:
- print('公鸡: %d只, 母鸡: %d只, 小鸡: %d只' % (x, y, z))
-
-# 要理解程序背后的算法 - 穷举法
diff --git a/Day01-15/Day05/craps.py b/Day01-15/Day05/craps.py
deleted file mode 100644
index d0b66b897..000000000
--- a/Day01-15/Day05/craps.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""
-
-Craps赌博游戏
-玩家摇两颗色子 如果第一次摇出7点或11点 玩家胜
-如果摇出2点 3点 12点 庄家胜 其他情况游戏继续
-玩家再次要色子 如果摇出7点 庄家胜
-如果摇出第一次摇的点数 玩家胜
-否则游戏继续 玩家继续摇色子
-玩家进入游戏时有1000元的赌注 全部输光游戏结束
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-from random import randint
-
-money = 1000
-while money > 0:
- print('你的总资产为:', money)
- needs_go_on = False
- while True:
- debt = int(input('请下注: '))
- if debt > 0 and debt <= money:
- break
- first = randint(1, 6) + randint(1, 6)
- print('玩家摇出了%d点' % first)
- if first == 7 or first == 11:
- print('玩家胜!')
- money += debt
- elif first == 2 or first == 3 or first == 12:
- print('庄家胜!')
- money -= debt
- else:
- needs_go_on = True
-
- while needs_go_on:
- current = randint(1, 6) + randint(1, 6)
- print('玩家摇出了%d点' % current)
- if current == 7:
- print('庄家胜')
- money -= debt
- needs_go_on = False
- elif current == first:
- print('玩家胜')
- money += debt
- needs_go_on = False
-
-print('你破产了, 游戏结束!')
diff --git a/Day01-15/Day05/fibonacci.py b/Day01-15/Day05/fibonacci.py
deleted file mode 100644
index c6a72b9b6..000000000
--- a/Day01-15/Day05/fibonacci.py
+++ /dev/null
@@ -1,16 +0,0 @@
-"""
-
-输出斐波那契数列的前20个数
-1 1 2 3 5 8 13 21 ...
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-a = 0
-b = 1
-for _ in range(20):
- (a, b) = (b, a + b)
- print(a, end=' ')
diff --git a/Day01-15/Day05/guess.py b/Day01-15/Day05/guess.py
deleted file mode 100644
index cd8880b60..000000000
--- a/Day01-15/Day05/guess.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""
-
-猜数字游戏
-计算机出一个1~100之间的随机数由人来猜
-计算机根据人猜的数字分别给出提示大一点/小一点/猜对了
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-import random
-
-answer = random.randint(1, 100)
-counter = 0
-while True:
- counter += 1
- number = int(input('请输入: '))
- if number < answer:
- print('大一点')
- elif number > answer:
- print('小一点')
- else:
- print('恭喜你猜对了!')
- break
-print('你总共猜了%d次' % counter)
-if counter > 7:
- print('你的智商余额明显不足')
diff --git a/Day01-15/Day05/lily.py b/Day01-15/Day05/lily.py
deleted file mode 100644
index a33361919..000000000
--- a/Day01-15/Day05/lily.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-
-找出100~999之间的所有水仙花数
-水仙花数是各位立方和等于这个数本身的数
-如: 153 = 1**3 + 5**3 + 3**3
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-for num in range(100, 1000):
- low = num % 10
- mid = num // 10 % 10
- high = num // 100
- if num == low ** 3 + mid ** 3 + high ** 3:
- print(num)
diff --git a/Day01-15/Day05/palindrome.py b/Day01-15/Day05/palindrome.py
deleted file mode 100644
index 02768f580..000000000
--- a/Day01-15/Day05/palindrome.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""
-
-判断输入的正整数是不是回文数
-回文数是指将一个正整数从左往右排列和从右往左排列值一样的数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-num = int(input('请输入一个正整数: '))
-temp = num
-num2 = 0
-while temp > 0:
- num2 *= 10
- num2 += temp % 10
- temp //= 10
-if num == num2:
- print('%d是回文数' % num)
-else:
- print('%d不是回文数' % num)
diff --git a/Day01-15/Day05/perfect.py b/Day01-15/Day05/perfect.py
deleted file mode 100644
index b778e94eb..000000000
--- a/Day01-15/Day05/perfect.py
+++ /dev/null
@@ -1,28 +0,0 @@
-"""
-
-找出1~9999之间的所有完美数
-完美数是除自身外其他所有因子的和正好等于这个数本身的数
-例如: 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-import time
-import math
-
-start = time.clock()
-for num in range(1, 10000):
- sum = 0
- for factor in range(1, int(math.sqrt(num)) + 1):
- if num % factor == 0:
- sum += factor
- if factor > 1 and num / factor != factor:
- sum += num / factor
- if sum == num:
- print(num)
-end = time.clock()
-print("执行时间:", (end - start), "秒")
-
-# 通过比较上面两种不同的解决方案的执行时间 意识到优化程序的重要性
diff --git a/Day01-15/Day05/prime.py b/Day01-15/Day05/prime.py
deleted file mode 100644
index b6d49a6ef..000000000
--- a/Day01-15/Day05/prime.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""
-
-输出2~99之间的素数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-import math
-
-for num in range(2, 100):
- is_prime = True
- for factor in range(2, int(math.sqrt(num)) + 1):
- if num % factor == 0:
- is_prime = False
- break
- if is_prime:
- print(num, end=' ')
diff --git a/Day01-15/Day05/table.py b/Day01-15/Day05/table.py
deleted file mode 100644
index 470caf1ed..000000000
--- a/Day01-15/Day05/table.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""
-
-输出乘法口诀表(九九表)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-02
-
-"""
-
-for i in range(1, 10):
- for j in range(1, i + 1):
- print('%d*%d=%d' % (i, j, i * j), end='\t')
- print()
diff --git "a/Day01-15/Day05/\346\200\273\347\273\223\345\222\214\347\273\203\344\271\240.md" "b/Day01-15/Day05/\346\200\273\347\273\223\345\222\214\347\273\203\344\271\240.md"
deleted file mode 100644
index e8f7ba89c..000000000
--- "a/Day01-15/Day05/\346\200\273\347\273\223\345\222\214\347\273\203\344\271\240.md"
+++ /dev/null
@@ -1 +0,0 @@
-## 总结和练习
diff --git a/Day01-15/Day06/function1.py b/Day01-15/Day06/function1.py
deleted file mode 100644
index d1c92f4cb..000000000
--- a/Day01-15/Day06/function1.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""
-
-函数的定义和使用 - 计算组合数C(7,3)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-05
-
-"""
-
-
-# 将求阶乘的功能封装成一个函数
-def factorial(n):
- result = 1
- for num in range(1, n + 1):
- result *= num
- return result
-
-
-print(factorial(7) // factorial(3) // factorial(4))
diff --git a/Day01-15/Day06/function2.py b/Day01-15/Day06/function2.py
deleted file mode 100644
index b2ed2838c..000000000
--- a/Day01-15/Day06/function2.py
+++ /dev/null
@@ -1,26 +0,0 @@
-"""
-
-函数的定义和使用 - 求最大公约数和最小公倍数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-05
-
-"""
-
-
-def gcd(x, y):
- if x > y:
- (x, y) = (y, x)
- for factor in range(x, 1, -1):
- if x % factor == 0 and y % factor == 0:
- return factor
- return 1
-
-
-def lcm(x, y):
- return x * y // gcd(x, y)
-
-
-print(gcd(15, 27))
-print(lcm(15, 27))
diff --git a/Day01-15/Day06/function3.py b/Day01-15/Day06/function3.py
deleted file mode 100644
index 16a980fee..000000000
--- a/Day01-15/Day06/function3.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""
-
-Python的内置函数
- - 数学相关: abs / divmod / pow / round / min / max / sum
- - 序列相关: len / range / next / filter / map / sorted / slice / reversed
- - 类型转换: chr / ord / str / bool / int / float / complex / bin / oct / hex
- - 数据结构: dict / list / set / tuple
- - 其他函数: all / any / id / input / open / print / type
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-05
-
-"""
-
-
-def myfilter(mystr):
- return len(mystr) == 6
-
-
-# help()
-print(chr(0x9a86))
-print(hex(ord('骆')))
-print(abs(-1.2345))
-print(round(-1.2345))
-print(pow(1.2345, 5))
-fruits = ['orange', 'peach', 'durian', 'watermelon']
-print(fruits[slice(1, 3)])
-fruits2 = list(filter(myfilter, fruits))
-print(fruits)
-print(fruits2)
diff --git a/Day01-15/Day06/function4.py b/Day01-15/Day06/function4.py
deleted file mode 100644
index 22d076fbb..000000000
--- a/Day01-15/Day06/function4.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-
-Python常用模块
- - 运行时服务相关模块: copy / pickle / sys / ...
- - 数学相关模块: decimal / math / random / ...
- - 字符串处理模块: codecs / re / ...
- - 文件处理相关模块: shutil / gzip / ...
- - 操作系统服务相关模块: datetime / os / time / logging / io / ...
- - 进程和线程相关模块: multiprocessing / threading / queue
- - 网络应用相关模块: ftplib / http / smtplib / urllib / ...
- - Web编程相关模块: cgi / webbrowser
- - 数据处理和编码模块: base64 / csv / html.parser / json / xml / ...
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-05
-
-"""
-
-import time
-import shutil
-import os
-
-seconds = time.time()
-print(seconds)
-localtime = time.localtime(seconds)
-print(localtime)
-print(localtime.tm_year)
-print(localtime.tm_mon)
-print(localtime.tm_mday)
-asctime = time.asctime(localtime)
-print(asctime)
-strtime = time.strftime('%Y-%m-%d %H:%M:%S', localtime)
-print(strtime)
-mydate = time.strptime('2018-1-1', '%Y-%m-%d')
-print(mydate)
-
-shutil.copy('/Users/Hao/hello.py', '/Users/Hao/Desktop/first.py')
-os.system('ls -l')
-os.chdir('/Users/Hao')
-os.system('ls -l')
-os.mkdir('test')
diff --git a/Day01-15/Day06/function5.py b/Day01-15/Day06/function5.py
deleted file mode 100644
index 90b618747..000000000
--- a/Day01-15/Day06/function5.py
+++ /dev/null
@@ -1,54 +0,0 @@
-"""
-
-函数的参数
- - 默认参数
- - 可变参数
- - 关键字参数
- - 命名关键字参数
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-05
-
-"""
-
-
-# 参数默认值
-def f1(a, b=5, c=10):
- return a + b * 2 + c * 3
-
-
-print(f1(1, 2, 3))
-print(f1(100, 200))
-print(f1(100))
-print(f1(c=2, b=3, a=1))
-
-
-# 可变参数
-def f2(*args):
- sum = 0
- for num in args:
- sum += num
- return sum
-
-
-print(f2(1, 2, 3))
-print(f2(1, 2, 3, 4, 5))
-print(f2())
-
-
-# 关键字参数
-def f3(**kw):
- if 'name' in kw:
- print('欢迎你%s!' % kw['name'])
- elif 'tel' in kw:
- print('你的联系电话是: %s!' % kw['tel'])
- else:
- print('没找到你的个人信息!')
-
-
-param = {'name': '骆昊', 'age': 38}
-f3(**param)
-f3(name='骆昊', age=38, tel='13866778899')
-f3(user='骆昊', age=38, tel='13866778899')
-f3(user='骆昊', age=38, mobile='13866778899')
diff --git a/Day01-15/Day06/function6.py b/Day01-15/Day06/function6.py
deleted file mode 100644
index 9ad898771..000000000
--- a/Day01-15/Day06/function6.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""
-
-作用域问题
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-05
-
-"""
-
-
-# 局部作用域
-def foo1():
- a = 5
-
-
-foo1()
-# print(a) # NameError
-
-# 全局作用域
-b = 10
-
-
-def foo2():
- print(b)
-
-
-foo2()
-
-
-def foo3():
- b = 100 # 局部变量
- print(b)
-
-
-foo3()
-print(b)
-
-
-def foo4():
- global b
- b = 200 # 全局变量
- print(b)
-
-
-foo4()
-print(b)
diff --git "a/Day01-15/Day06/\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227\347\232\204\344\275\277\347\224\250.md" "b/Day01-15/Day06/\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227\347\232\204\344\275\277\347\224\250.md"
deleted file mode 100644
index a3550de63..000000000
--- "a/Day01-15/Day06/\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227\347\232\204\344\275\277\347\224\250.md"
+++ /dev/null
@@ -1,368 +0,0 @@
-## 函数和模块的使用
-
-在讲解本章节的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。
-
-$$x_1 + x_2 + x_3 + x_4 = 8$$
-
-事实上,上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。
-
-$$C_M^N =\frac{M!}{N!(M-N)!}, \text{(M=7, N=3)} $$
-
-可以用Python的程序来计算出这个值,代码如下所示。
-
-```Python
-"""
-
-输入M和N计算C(M,N)
-
-"""
-
-m = int(input('m = '))
-n = int(input('n = '))
-fm = 1
-for num in range(1, m + 1):
- fm *= num
-fn = 1
-for num in range(1, n + 1):
- fn *= num
-fmn = 1
-for num in range(1, m - n + 1):
- fmn *= num
-print(fm // fn // fmn)
-
-```
-
-### 函数的作用
-
-不知道大家是否注意到,在上面的代码中,我们做了3次求阶乘,这样的代码实际上就是重复代码。编程大师Martin Fowler先生曾经说过:“代码有很多种坏味道,重复是最坏的一种!”,要写出高质量的代码首先要解决的就是重复代码的问题。对于上面的代码来说,我们可以将计算阶乘的功能封装到一个称之为“函数”的功能模块中,在需要计算阶乘的地方,我们只需要“调用”这个“函数”就可以了。
-
-### 定义函数
-
-在Python中可以使用`def`关键字来定义函数,和变量一样每个函数也有一个响亮的名字,而且命名规则跟变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数,这一点和数学上的函数非常相似,程序中函数的参数就相当于是数学上说的函数的自变量,而函数执行完成后我们可以通过`return`关键字来返回一个值,这相当于数学上说的函数的因变量。
-
-在了解了如何定义函数后,我们可以对上面的代码进行重构,所谓重构就是在不影响代码执行结果的前提下对代码的结构进行调整,重构之后的代码如下所示。
-
-```Python
-def factorial(num):
- """
- 求阶乘
-
- :param num: 非负整数
-
- :return: num的阶乘
- """
- result = 1
- for n in range(1, num + 1):
- result *= n
- return result
-
-
-m = int(input('m = '))
-n = int(input('n = '))
-# 当需要计算阶乘的时候不用再写循环求阶乘而是直接调用已经定义好的函数
-print(factorial(m) // factorial(n) // factorial(m - n))
-
-```
-
-> **说明:**Python的math模块中其实已经有一个factorial函数了,事实上要计算阶乘可以直接使用这个现成的函数而不用自己定义。下面例子中的某些函数其实Python中也是内置了,我们这里是为了讲解函数的定义和使用才把它们又实现了一遍,实际开发中不建议做这种低级的重复性的工作。
-
-
-### 函数的参数
-
-函数是绝大多数编程语言中都支持的一个代码的“构建块”,但是Python中的函数与其他语言中的函数还是有很多不太相同的地方,其中一个显著的区别就是Python对函数参数的处理。在Python中,函数的参数可以有默认值,也支持使用可变参数,所以Python并不需要像其他语言一样支持[函数的重载](https://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0%E9%87%8D%E8%BD%BD),因为我们在定义一个函数的时候可以让它有多种不同的使用方式,下面是两个小例子。
-
-```Python
-from random import randint
-
-
-def roll_dice(n=2):
- """
- 摇色子
-
- :param n: 色子的个数
-
- :return: n颗色子点数之和
- """
- total = 0
- for _ in range(n):
- total += randint(1, 6)
- return total
-
-
-def add(a=0, b=0, c=0):
- return a + b + c
-
-
-# 如果没有指定参数那么使用默认值摇两颗色子
-print(roll_dice())
-# 摇三颗色子
-print(roll_dice(3))
-print(add())
-print(add(1))
-print(add(1, 2))
-print(add(1, 2, 3))
-# 传递参数时可以不按照设定的顺序进行传递
-print(add(c=50, a=100, b=200))
-
-```
-
-我们给上面两个函数的参数都设定了默认值,这也就意味着如果在调用函数的时候如果没有传入对应参数的值时将使用该参数的默认值,所以在上面的代码中我们可以用各种不同的方式去调用`add`函数,这跟其他很多语言中函数重载的效果是一致的。
-
-其实上面的`add`函数还有更好的实现方案,因为我们可能会对0个或多个参数进行加法运算,而具体有多少个参数是由调用者来决定,我们作为函数的设计者对这一点是一无所知的,因此在不确定参数个数的时候,我们可以使用可变参数,代码如下所示。
-
-```Python
-# 在参数前使用*表示args是可变参数
-# 也就是说调用add函数时传入的参数个数可以是0个或多个
-def add(*args):
- total = 0
- for val in args:
- total += val
- return total
-
-
-print(add())
-print(add(1))
-print(add(1, 2))
-print(add(1, 2, 3))
-print(add(1, 3, 5, 7, 9))
-
-```
-
-### 用模块管理函数
-
-对于任何一种编程语言来说,给变量、函数这样的标识符起名字都是一个让人头疼的问题,因为我们会遇到命名冲突这种尴尬的情况。最简单的场景就是在同一个.py文件中定义了两个同名函数,由于Python没有函数重载的概念,那么后面的定义会覆盖之前的定义,也就意味着两个函数同名函数实际上只有一个是存在的。
-
-```Python
-def foo():
- print('hello, world!')
-
-
-def foo():
- print('goodbye, world!')
-
-
-foo() # 输出goodbye, world!
-
-```
-
-当然上面的这种情况我们很容易就能避免,但是如果项目是由多人协作进行团队开发的时候,团队中可能有多个程序员都定义了名为`foo`的函数,那么怎么解决这种命名冲突呢?答案其实很简单,Python中每个文件就代表了一个模块(module),我们在不同的模块中可以有同名的函数,在使用函数的时候我们通过`import`关键字导入指定的模块就可以区分到底要使用的是哪个模块中的`foo`函数,代码如下所示。
-
-module1.py
-
-```Python
-def foo():
- print('hello, world!')
-```
-
-module2.py
-
-```Python
-def foo():
- print('goodbye, world!')
-```
-
-test.py
-
-```Python
-from module1 import foo
-
-foo() # 输出hello, world!
-
-from module2 import foo
-
-foo() # 输出goodbye, world!
-
-```
-
-也可以按照如下所示的方式来区分到底要使用哪一个`foo`函数。
-
-test.py
-
-```Python
-import module1 as m1
-import module2 as m2
-
-m1.foo()
-m2.foo()
-
-```
-
-但是如果将代码写成了下面的样子,那么程序中调用的是最后导入的那个`foo`,因为后导入的foo覆盖了之前导入的`foo`。
-
-test.py
-
-```Python
-from module1 import foo
-from module2 import foo
-
-foo() # 输出goodbye, world!
-
-```
-
-test.py
-
-```Python
-from module2 import foo
-from module1 import foo
-
-foo() # 输出hello, world!
-
-```
-
-需要说明的是,如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是“\_\_main\_\_”。
-
-module3.py
-
-```Python
-def foo():
- pass
-
-
-def bar():
- pass
-
-
-# __name__是Python中一个隐含的变量它代表了模块的名字
-# 只有被Python解释器直接执行的模块的名字才是__main__
-if __name__ == '__main__':
- print('call foo()')
- foo()
- print('call bar()')
- bar()
-
-```
-
-test.py
-
-```Python
-import module3
-
-# 导入module3时 不会执行模块中if条件成立时的代码 因为模块的名字是module3而不是__main__
-
-```
-
-### 练习
-
-#### 练习1:实现计算求最大公约数和最小公倍数的函数。
-
-```Python
-def gcd(x, y):
- (x, y) = (y, x) if x > y else (x, y)
- for factor in range(x, 0, -1):
- if x % factor == 0 and y % factor == 0:
- return factor
-
-
-def lcm(x, y):
- return x * y // gcd(x, y)
-```
-
-#### 练习2:实现判断一个数是不是回文数的函数。
-
-```Python
-def is_palindrome(num):
- temp = num
- total = 0
- while temp > 0:
- total = total * 10 + temp % 10
- temp //= 10
- return total == num
-```
-
-#### 练习3:实现判断一个数是不是素数的函数。
-
-```Python
-def is_prime(num):
- for factor in range(2, num):
- if num % factor == 0:
- return False
- return True if num != 1 else False
-```
-
-#### 练习4:写一个程序判断输入的正整数是不是回文素数。
-
-```Python
-if __name__ == '__main__':
- num = int(input('请输入正整数: '))
- if is_palindrome(num) and is_prime(num):
- print('%d是回文素数' % num)
-
-```
-
-通过上面的程序可以看出,当我们将代码中重复出现的和相对独立的功能抽取成函数后,我们可以组合使用这些函数来解决更为复杂的问题,这也是我们为什么要定义和使用函数的一个非常重要的原因。
-
-最后,我们来讨论一下Python中有关变量作用域的问题。
-
-```Python
-def foo():
- b = 'hello'
-
- def bar(): # Python中可以在函数内部再定义函数
- c = True
- print(a)
- print(b)
- print(c)
-
- bar()
- # print(c) # NameError: name 'c' is not defined
-
-
-if __name__ == '__main__':
- a = 100
- # print(b) # NameError: name 'b' is not defined
- foo()
-
-```
-
-上面的代码能够顺利的执行并且打印出100和“hello”,但我们注意到了,在`bar`函数的内部并没有定义`a`和`b`两个变量,那么`a`和`b`是从哪里来的。我们在上面代码的`if`分支中定义了一个变量`a`,这是一个全局变量(global variable),属于全局作用域,因为它没有定义在任何一个函数中。在上面的`foo`函数中我们定义了变量`b`,这是一个定义在函数中的局部变量(local variable),属于局部作用域,在`foo`函数的外部并不能访问到它;但对于`foo`函数内部的`bar`函数来说,变量`b`属于嵌套作用域,在`bar`函数中我们是可以访问到它的。`bar`函数中的变量`c`属于局部作用域,在`bar`函数之外是无法访问的。事实上,Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些隐含标识符`min`、`len`等都属于内置作用域)。
-
-再看看下面这段代码,我们希望通过函数调用修改全局变量`a`的值,但实际上下面的代码是做不到的。
-
-```Python
-def foo():
- a = 200
- print(a) # 200
-
-
-if __name__ == '__main__':
- a = 100
- foo()
- print(a) # 100
-
-```
-
-在调用`foo`函数后,我们发现`a`的值仍然是100,这是因为当我们在函数`foo`中写`a = 200`的时候,是重新定义了一个名字为`a`的局部变量,它跟全局作用域的`a`并不是同一个变量,因为局部作用域中有了自己的变量`a`,因此`foo`函数不再搜索全局作用域中的`a`。如果我们希望在`foo`函数中修改全局作用域中的`a`,代码如下所示。
-
-```Python
-def foo():
- global a
- a = 200
- print(a) # 200
-
-
-if __name__ == '__main__':
- a = 100
- foo()
- print(a) # 200
-
-```
-
-我们可以使用`global`关键字来指示`foo`函数中的变量`a`来自于全局作用域,如果全局作用域中没有`a`,那么下面一行的代码就会定义变量`a`并将其置于全局作用域。同理,如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用`nonlocal`关键字来指示变量来自于嵌套作用域,请大家自行试验。
-
-在实际开发中,我们应该尽量减少对全局变量的使用,因为全局变量的作用域和影响过于广泛,可能会发生意料之外的修改和使用,除此之外全局变量比局部变量拥有更长的生命周期,可能导致对象占用的内存长时间无法被[垃圾回收](https://zh.wikipedia.org/wiki/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%B8))。事实上,减少对全局变量的使用,也是降低代码之间耦合度的一个重要举措,同时也是对[迪米特法则](https://zh.wikipedia.org/zh-hans/%E5%BE%97%E5%A2%A8%E5%BF%92%E8%80%B3%E5%AE%9A%E5%BE%8B)的践行。减少全局变量的使用就意味着我们应该尽量让变量的作用域在函数的内部,但是如果我们希望将一个局部变量的生命周期延长,使其在函数调用结束后依然可以访问,这时候就需要使用[闭包](https://zh.wikipedia.org/wiki/%E9%97%AD%E5%8C%85_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)),这个我们在后续的内容中进行讲解。
-
-> **说明**:很多人经常会将“闭包”一词和[“匿名函数”](https://zh.wikipedia.org/wiki/%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0)混为一谈,但实际上它们是不同的概念,如果想提前了解这个概念,推荐看看[维基百科](https://zh.wikipedia.org/wiki/)或者[知乎](https://www.zhihu.com/)上对这个概念的讨论。
-
-说了那么多,其实结论很简单,从现在开始我们可以将Python代码按照下面的格式进行书写,这一点点的改进其实就是在我们理解了函数和作用域的基础上跨出的巨大的一步。
-
-```Python
-def main():
- # Todo: Add your code here
- pass
-
-
-if __name__ == '__main__':
- main()
-
-```
-
diff --git a/Day01-15/Day07/avgscore.py b/Day01-15/Day07/avgscore.py
deleted file mode 100644
index 7c525ccc6..000000000
--- a/Day01-15/Day07/avgscore.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-
-输入学生考试成绩计算平均分
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- number = int(input('请输入学生人数: '))
- names = [None] * number
- scores = [None] * number
- for index in range(len(names)):
- names[index] = input('请输入第%d个学生的名字: ' % (index + 1))
- scores[index] = float(input('请输入第%d个学生的成绩: ' % (index + 1)))
- total = 0
- for index in range(len(names)):
- print('%s: %.1f分' % (names[index], scores[index]))
- total += scores[index]
- print('平均成绩是: %.1f分' % (total / number))
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/dict1.py b/Day01-15/Day07/dict1.py
deleted file mode 100644
index 6d7b62a3b..000000000
--- a/Day01-15/Day07/dict1.py
+++ /dev/null
@@ -1,34 +0,0 @@
-"""
-
-定义和使用字典
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
- print(scores['骆昊'])
- print(scores['狄仁杰'])
- for elem in scores:
- print('%s\t--->\t%d' % (elem, scores[elem]))
- scores['白元芳'] = 65
- scores['诸葛王朗'] = 71
- scores.update(冷面=67, 方启鹤=85)
- print(scores)
- if '武则天' in scores:
- print(scores['武则天'])
- print(scores.get('武则天'))
- print(scores.get('武则天', 60))
- print(scores.popitem())
- print(scores.popitem())
- print(scores.pop('骆昊', 100))
- scores.clear()
- print(scores)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/dict2.py b/Day01-15/Day07/dict2.py
deleted file mode 100644
index 9b3dea9fe..000000000
--- a/Day01-15/Day07/dict2.py
+++ /dev/null
@@ -1,33 +0,0 @@
-"""
-
-字典的常用操作
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- stu = {'name': '骆昊', 'age': 38, 'gender': True}
- print(stu)
- print(stu.keys())
- print(stu.values())
- print(stu.items())
- for elem in stu.items():
- print(elem)
- print(elem[0], elem[1])
- if 'age' in stu:
- stu['age'] = 20
- print(stu)
- stu.setdefault('score', 60)
- print(stu)
- stu.setdefault('score', 100)
- print(stu)
- stu['score'] = 100
- print(stu)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/fibonacci.py b/Day01-15/Day07/fibonacci.py
deleted file mode 100644
index 9dba36a53..000000000
--- a/Day01-15/Day07/fibonacci.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""
-
-生成斐波拉切数列
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- f = [1 , 1]
- for i in range(2, 20):
- f += [f[i - 1] + f[i - 2]]
- # f.append(f[i - 1] + f[i - 2])
- for val in f:
- print(val, end=' ')
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/findmax.py b/Day01-15/Day07/findmax.py
deleted file mode 100644
index 30e59b0cd..000000000
--- a/Day01-15/Day07/findmax.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""
-
-找出列表中最大或最小的元素
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- fruits = ['grape', 'apple', 'strawberry', 'waxberry', 'pitaya']
- # 直接使用内置的max和min函数找出列表中最大和最小元素
- # print(max(fruits))
- # print(min(fruits))
- max_value = min_value = fruits[0]
- for index in range(1, len(fruits)):
- if fruits[index] > max_value:
- max_value = fruits[index]
- elif fruits[index] < min_value:
- min_value = fruits[index]
- print('Max:', max_value)
- print('Min:', min_value)
-
-
-if __name__ == '__main__':
- main()
-# 想一想如果最大的元素有两个要找出第二大的又该怎么做
diff --git a/Day01-15/Day07/list1.py b/Day01-15/Day07/list1.py
deleted file mode 100644
index be7cdbc37..000000000
--- a/Day01-15/Day07/list1.py
+++ /dev/null
@@ -1,40 +0,0 @@
-"""
-
-定义和使用列表
- - 用下标访问元素
- - 添加元素
- - 删除元素
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- fruits = ['grape', '@pple', 'strawberry', 'waxberry']
- print(fruits)
- # 通过下标访问元素
- print(fruits[0])
- print(fruits[1])
- print(fruits[-1])
- print(fruits[-2])
- # print(fruits[-5]) # IndexError
- # print(fruits[4]) # IndexError
- fruits[1] = 'apple'
- print(fruits)
- # 添加元素
- fruits.append('pitaya')
- fruits.insert(0, 'banana')
- print(fruits)
- # 删除元素
- del fruits[1]
- fruits.pop()
- fruits.pop(0)
- fruits.remove('apple')
- print(fruits)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/list2.py b/Day01-15/Day07/list2.py
deleted file mode 100644
index 049afa488..000000000
--- a/Day01-15/Day07/list2.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""
-
-列表常用操作
- - 列表连接
- - 获取长度
- - 遍历列表
- - 列表切片
- - 列表排序
- - 列表反转
- - 查找元素
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- fruits = ['grape', 'apple', 'strawberry', 'waxberry']
- fruits += ['pitaya', 'pear', 'mango']
- # 循环遍历列表元素
- for fruit in fruits:
- print(fruit.title(), end=' ')
- print()
- # 列表切片
- fruits2 = fruits[1:4]
- print(fruits2)
- # fruit3 = fruits # 没有复制列表只创建了新的引用
- fruits3 = fruits[:]
- print(fruits3)
- fruits4 = fruits[-3:-1]
- print(fruits4)
- fruits5 = fruits[::-1]
- print(fruits5)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/list3.py b/Day01-15/Day07/list3.py
deleted file mode 100644
index 74713486f..000000000
--- a/Day01-15/Day07/list3.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""
-
-生成列表
- - 用range创建数字列表
- - 生成表达式
- - 生成器
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-# 生成Fibonacci序列的生成器
-def fib(n):
- a, b = 0, 1
- for _ in range(n):
- a, b = b, a + b
- yield a
-
-
-def main():
- # 用range创建数值列表
- list1 = list(range(1, 11))
- print(list1)
- # 生成表达式
- list2 = [x * x for x in range(1, 11)]
- print(list2)
- list3 = [m + n for m in 'ABCDEFG' for n in '12345']
- print(list3)
- print(len(list3))
- # 生成器(节省空间但生成下一个元素时需要花费时间)
- gen = (m + n for m in 'ABCDEFG' for n in '12345')
- print(gen)
- for elem in gen:
- print(elem, end=' ')
- print()
- gen = fib(20)
- print(gen)
- for elem in gen:
- print(elem, end=' ')
- print()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/lottery.py b/Day01-15/Day07/lottery.py
deleted file mode 100644
index 192051c55..000000000
--- a/Day01-15/Day07/lottery.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""
-
-双色球随机选号程序
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-from random import randrange, randint, sample
-
-
-def display(balls):
- """
- 输出列表中的双色球号码
- """
- for index, ball in enumerate(balls):
- if index == len(balls) - 1:
- print('|', end=' ')
- print('%02d' % ball, end=' ')
- print()
-
-
-def random_select():
- """
- 随机选择一组号码
- """
- red_balls = [x for x in range(1, 34)]
- selected_balls = []
- for _ in range(6):
- index = randrange(len(red_balls))
- selected_balls.append(red_balls[index])
- del red_balls[index]
- # 上面的for循环也可以写成下面这行代码
- # sample函数是random模块下的函数
- # selected_balls = sample(red_balls, 6)
- selected_balls.sort()
- selected_balls.append(randint(1, 16))
- return selected_balls
-
-
-def main():
- n = int(input('机选几注: '))
- for _ in range(n):
- display(random_select())
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/marquee.py b/Day01-15/Day07/marquee.py
deleted file mode 100644
index dc9750dd2..000000000
--- a/Day01-15/Day07/marquee.py
+++ /dev/null
@@ -1,26 +0,0 @@
-"""
-
-输入学生考试成绩计算平均分
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-import os
-import time
-
-
-def main():
- str = 'Welcome to 1000 Phone Chengdu Campus '
- while True:
- print(str)
- time.sleep(0.2)
- str = str[1:] + str[0:1]
- # for Windows use os.system('cls') instead
- os.system('clear')
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/res/fibonacci-blocks.png b/Day01-15/Day07/res/fibonacci-blocks.png
deleted file mode 100644
index a638bf123..000000000
Binary files a/Day01-15/Day07/res/fibonacci-blocks.png and /dev/null differ
diff --git a/Day01-15/Day07/res/ipython-timeit.png b/Day01-15/Day07/res/ipython-timeit.png
deleted file mode 100644
index 5b5238225..000000000
Binary files a/Day01-15/Day07/res/ipython-timeit.png and /dev/null differ
diff --git a/Day01-15/Day07/res/python-set.png b/Day01-15/Day07/res/python-set.png
deleted file mode 100644
index 2110598f3..000000000
Binary files a/Day01-15/Day07/res/python-set.png and /dev/null differ
diff --git a/Day01-15/Day07/scoretable.py b/Day01-15/Day07/scoretable.py
deleted file mode 100644
index 63fded25b..000000000
--- a/Day01-15/Day07/scoretable.py
+++ /dev/null
@@ -1,30 +0,0 @@
-"""
-
-学生考试成绩表
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- names = ['关羽', '张飞', '赵云', '马超', '黄忠']
- subjs = ['语文', '数学', '英语']
- scores = [[0] * 3] * 5
- for row, name in enumerate(names):
- print('请输入%s的成绩' % name)
- for col, subj in enumerate(subjs):
- scores[row][col] = float(input(subj + ': '))
- print(scores)
-# for row, name in enumerate(names):
-# print('请输入%s的成绩' % name)
-# scores[row] = [None] * len(subjs)
-# for col, subj in enumerate(subjs):
-# score = float(input(subj + ': '))
-# scores[row][col] = score
-# print(scores)
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/set1.py b/Day01-15/Day07/set1.py
deleted file mode 100644
index 9b2f0f535..000000000
--- a/Day01-15/Day07/set1.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""
-
-定义和使用集合
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- set1 = {1, 2, 3, 3, 3, 2}
- print(set1)
- print('Length =', len(set1))
- set2 = set(range(1, 10))
- print(set2)
- set1.add(4)
- set1.add(5)
- set2.update([11, 12])
- print(set1)
- print(set2)
- set2.discard(5)
- # remove的元素如果不存在会引发KeyError
- if 4 in set2:
- set2.remove(4)
- print(set2)
- # 遍历集合容器
- for elem in set2:
- print(elem ** 2, end=' ')
- print()
- # 将元组转换成集合
- set3 = set((1, 2, 3, 3, 2, 1))
- print(set3.pop())
- print(set3)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/set2.py b/Day01-15/Day07/set2.py
deleted file mode 100644
index 506588765..000000000
--- a/Day01-15/Day07/set2.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-
-集合的常用操作
- - 交集
- - 并集
- - 差集
- - 子集
- - 超集
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- set1 = set(range(1, 7))
- print(set1)
- set2 = set(range(2, 11, 2))
- print(set2)
- set3 = set(range(1, 5))
- print(set1 & set2)
- # print(set1.intersection(set2))
- print(set1 | set2)
- # print(set1.union(set2))
- print(set1 - set2)
- # print(set1.difference(set2))
- print(set1 ^ set2)
- # print(set1.symmetric_difference(set2))
- print(set2 <= set1)
- # print(set2.issubset(set1))
- print(set3 <= set1)
- # print(set3.issubset(set1))
- print(set1 >= set2)
- # print(set1.issuperset(set2))
- print(set1 >= set3)
- # print(set1.issuperset(set3))
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/tic-tac-toe.py b/Day01-15/Day07/tic-tac-toe.py
deleted file mode 100644
index 0db6620ed..000000000
--- a/Day01-15/Day07/tic-tac-toe.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-
-井字棋游戏
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-import os
-
-
-
-def print_board(board):
- print(board['TL'] + '|' + board['TM'] + '|' + board['TR'])
- print('-+-+-')
- print(board['ML'] + '|' + board['MM'] + '|' + board['MR'])
- print('-+-+-')
- print(board['BL'] + '|' + board['BM'] + '|' + board['BR'])
-
-
-def main():
- init_board = {
- 'TL': ' ', 'TM': ' ', 'TR': ' ',
- 'ML': ' ', 'MM': ' ', 'MR': ' ',
- 'BL': ' ', 'BM': ' ', 'BR': ' '
- }
- begin = True
- while begin:
- curr_board = init_board.copy()
- begin = False
- turn = 'x'
- counter = 0
- os.system('clear')
- print_board(curr_board)
- while counter < 9:
- move = input('轮到%s走棋, 请输入位置: ' % turn)
- if curr_board[move] == ' ':
- counter += 1
- curr_board[move] = turn
- if turn == 'x':
- turn = 'o'
- else:
- turn = 'x'
- os.system('clear')
- print_board(curr_board)
- choice = input('再玩一局?(yes|no)')
- begin = choice == 'yes'
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day07/tuple.py b/Day01-15/Day07/tuple.py
deleted file mode 100644
index dcfaf2ffb..000000000
--- a/Day01-15/Day07/tuple.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-
-元组的定义和使用
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- # 定义元组
- t = ('骆昊', 38, True, '四川成都')
- print(t)
- # 获取元组中的元素
- print(t[0])
- print(t[1])
- print(t[2])
- print(t[3])
- # 遍历元组中的值
- for member in t:
- print(member)
- # 重新给元组赋值
- # t[0] = '王大锤' # TypeError
- # 变量t重新引用了新的元组 原来的元组被垃圾回收
- t = ('王大锤', 20, True, '云南昆明')
- print(t)
- # 元组和列表的转换
- person = list(t)
- print(person)
- person[0] = '李小龙'
- person[1] = 25
- print(person)
- fruits_list = ['apple', 'banana', 'orange']
- fruits_tuple = tuple(fruits_list)
- print(fruits_tuple)
- print(fruits_tuple[1])
-
-
-if __name__ == '__main__':
- main()
\ No newline at end of file
diff --git a/Day01-15/Day07/yanghui.py b/Day01-15/Day07/yanghui.py
deleted file mode 100644
index 4be882a5c..000000000
--- a/Day01-15/Day07/yanghui.py
+++ /dev/null
@@ -1,34 +0,0 @@
-"""
-
-输出10行的杨辉三角 - 二项式的n次方展开系数
-1
-1 1
-1 2 1
-1 3 3 1
-1 4 6 4 1
-... ... ...
-
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-06
-
-"""
-
-
-def main():
- num = int(input('Number of rows: '))
- yh = [[]] * num
- for row in range(len(yh)):
- yh[row] = [None] * (row + 1)
- for col in range(len(yh[row])):
- if col == 0 or col == row:
- yh[row][col] = 1
- else:
- yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
- print(yh[row][col], end='\t')
- print()
-
-
-if __name__ == '__main__':
- main()
diff --git "a/Day01-15/Day07/\345\255\227\347\254\246\344\270\262\345\222\214\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/Day01-15/Day07/\345\255\227\347\254\246\344\270\262\345\222\214\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204.md"
deleted file mode 100644
index d1e176a83..000000000
--- "a/Day01-15/Day07/\345\255\227\347\254\246\344\270\262\345\222\214\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204.md"
+++ /dev/null
@@ -1,637 +0,0 @@
-## 字符串和常用数据结构
-
-### 使用字符串
-
-第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移,虽然对数值运算仍然是计算机日常工作中最为重要的事情之一,但是今天的计算机处理得更多的数据都是以文本信息的方式存在的,而Python表示文本信息的方式我们在很早以前就说过了,那就是字符串类型。所谓**字符串**,就是由零个或多个字符组成的有限序列,一般记为[$${\displaystyle s=a_{1}a_{2}\dots a_{n}(0\leq n \leq \infty)}$$](https://wikimedia.org/api/rest_v1/media/math/render/svg/e29bf631b090323edd6889f810e6cff29538b161)。
-
-我们可以通过下面的代码来了解字符串的使用。
-
-```Python
-def main():
- str1 = 'hello, world!'
- # 通过len函数计算字符串的长度
- print(len(str1)) # 13
- # 获得字符串首字母大写的拷贝
- print(str1.capitalize()) # Hello, world!
- # 获得字符串变大写后的拷贝
- print(str1.upper()) # HELLO, WORLD!
- # 从字符串中查找子串所在位置
- print(str1.find('or')) # 8
- print(str1.find('shit')) # -1
- # 与find类似但找不到子串时会引发异常
- # print(str1.index('or'))
- # print(str1.index('shit'))
- # 检查字符串是否以指定的字符串开头
- print(str1.startswith('He')) # False
- print(str1.startswith('hel')) # True
- # 检查字符串是否以指定的字符串结尾
- print(str1.endswith('!')) # True
- # 将字符串以指定的宽度居中并在两侧填充指定的字符
- print(str1.center(50, '*'))
- # 将字符串以指定的宽度靠右放置左侧填充指定的字符
- print(str1.rjust(50, ' '))
- str2 = 'abc123456'
- # 从字符串中取出指定位置的字符(下标运算)
- print(str2[2]) # c
- # 字符串切片(从指定的开始索引到指定的结束索引)
- print(str2[2:5]) # c12
- print(str2[2:]) # c123456
- print(str2[2::2]) # c246
- print(str2[::2]) # ac246
- print(str2[::-1]) # 654321cba
- print(str2[-3:-1]) # 45
- # 检查字符串是否由数字构成
- print(str2.isdigit()) # False
- # 检查字符串是否以字母构成
- print(str2.isalpha()) # False
- # 检查字符串是否以数字和字母构成
- print(str2.isalnum()) # True
- str3 = ' jackfrued@126.com '
- print(str3)
- # 获得字符串修剪左右两侧空格的拷贝
- print(str3.strip())
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-除了字符串,Python还内置了多种类型的数据结构,如果要在程序中保存和操作数据,绝大多数时候可以利用现有的数据结构来实现,最常用的包括列表、元组、集合和字典。
-
-### 使用列表
-
-下面的代码演示了如何定义列表、使用下标访问列表元素以及添加和删除元素的操作。
-
-```Python
-def main():
- list1 = [1, 3, 5, 7, 100]
- print(list1)
- list2 = ['hello'] * 5
- print(list2)
- # 计算列表长度(元素个数)
- print(len(list1))
- # 下标(索引)运算
- print(list1[0])
- print(list1[4])
- # print(list1[5]) # IndexError: list index out of range
- print(list1[-1])
- print(list1[-3])
- list1[2] = 300
- print(list1)
- # 添加元素
- list1.append(200)
- list1.insert(1, 400)
- list1 += [1000, 2000]
- print(list1)
- print(len(list1))
- # 删除元素
- list1.remove(3)
- if 1234 in list1:
- list1.remove(1234)
- del list1[0]
- print(list1)
- # 清空列表元素
- list1.clear()
- print(list1)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-和字符串一样,列表也可以做切片操作,通过切片操作我们可以实现对列表的复制或者将列表中的一部分取出来创建出新的列表,代码如下所示。
-
-```Python
-def main():
- fruits = ['grape', 'apple', 'strawberry', 'waxberry']
- fruits += ['pitaya', 'pear', 'mango']
- # 循环遍历列表元素
- for fruit in fruits:
- print(fruit.title(), end=' ')
- print()
- # 列表切片
- fruits2 = fruits[1:4]
- print(fruits2)
- # fruit3 = fruits # 没有复制列表只创建了新的引用
- # 可以通过完整切片操作来复制列表
- fruits3 = fruits[:]
- print(fruits3)
- fruits4 = fruits[-3:-1]
- print(fruits4)
- # 可以通过反向切片操作来获得倒转后的列表的拷贝
- fruits5 = fruits[::-1]
- print(fruits5)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-下面的代码实现了对列表的排序操作。
-
-```Python
-def main():
- list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
- list2 = sorted(list1)
- # sorted函数返回列表排序后的拷贝不会修改传入的列表
- # 函数的设计就应该像sorted函数一样尽可能不产生副作用
- list3 = sorted(list1, reverse=True)
- # 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
- list4 = sorted(list1, key=len)
- print(list1)
- print(list2)
- print(list3)
- print(list4)
- # 给列表对象发出排序消息直接在列表对象上进行排序
- list1.sort(reverse=True)
- print(list1)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-我们还可以使用列表的生成式语法来创建列表,代码如下所示。
-
-```Python
-import sys
-
-
-def main():
- f = [x for x in range(1, 10)]
- print(f)
- f = [x + y for x in 'ABCDE' for y in '1234567']
- print(f)
- # 用列表的生成表达式语法创建列表容器
- # 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
- f = [x ** 2 for x in range(1, 1000)]
- print(sys.getsizeof(f)) # 查看对象占用内存的字节数
- print(f)
- # 请注意下面的代码创建的不是一个列表而是一个生成器对象
- # 通过生成器可以获取到数据但它不占用额外的空间存储数据
- # 每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)
- f = (x ** 2 for x in range(1, 1000))
- print(sys.getsizeof(f)) # 相比生成式生成器不占用存储数据的空间
- print(f)
- for val in f:
- print(val)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-除了上面提到的生成器语法,Python中还有另外一种定义生成器的方式,就是通过`yield`关键字将一个普通函数改造成生成器函数。下面的代码演示了如何实现一个生成[斐波拉切数列](https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97)的生成器。所谓斐波拉切数列可以通过下面[递归](https://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92)的方法来进行定义:
-
-$${\displaystyle F_{0}=0}$$
-
-$${\displaystyle F_{1}=1}$$
-
-$${\displaystyle F_{n}=F_{n-1}+F_{n-2}}({n}\geq{2})$$
-
-
-
-```Python
-def fib(n):
- a, b = 0, 1
- for _ in range(n):
- a, b = b, a + b
- yield a
-
-
-def main():
- for val in fib(20):
- print(val)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 使用元组
-
-Python 的元组与列表类似,不同之处在于元组的元素不能修改,在前面的代码中我们已经不止一次使用过元组了。顾名思义,我们把多个元素组合到一起就形成了一个元组,所以它和列表一样可以保存多条数据。下面的代码演示了如何定义和使用元组。
-
-```Python
-def main():
- # 定义元组
- t = ('骆昊', 38, True, '四川成都')
- print(t)
- # 获取元组中的元素
- print(t[0])
- print(t[3])
- # 遍历元组中的值
- for member in t:
- print(member)
- # 重新给元组赋值
- # t[0] = '王大锤' # TypeError
- # 变量t重新引用了新的元组原来的元组将被垃圾回收
- t = ('王大锤', 20, True, '云南昆明')
- print(t)
- # 将元组转换成列表
- person = list(t)
- print(person)
- # 列表是可以修改它的元素的
- person[0] = '李小龙'
- person[1] = 25
- print(person)
- # 将列表转换成元组
- fruits_list = ['apple', 'banana', 'orange']
- fruits_tuple = tuple(fruits_list)
- print(fruits_tuple)
-
-
-if __name__ == '__main__':
- main()
-```
-
-这里有一个非常值得探讨的问题,我们已经有了列表这种数据结构,为什么还需要元组这样的类型呢?
-
-1. 元组中的元素是无法修改的,事实上我们在项目中尤其是[多线程](https://zh.wikipedia.org/zh-hans/%E5%A4%9A%E7%BA%BF%E7%A8%8B)环境(后面会讲到)中可能更喜欢使用的是那些不变对象(一方面因为对象状态不能修改,所以可以避免由此引起的不必要的程序错误,简单的说就是一个不变的对象要比可变的对象更加容易维护;另一方面因为没有任何一个线程能够修改不变对象的内部状态,一个不变对象自动就是线程安全的,这样就可以省掉处理同步化的开销。一个不变对象可以方便的被共享访问)。所以结论就是:如果不需要对元素进行添加、删除、修改的时候,可以考虑使用元组,当然如果一个方法要返回多个值,使用元组也是不错的选择。
-2. 元组在创建时间和占用的空间上面都优于列表。我们可以使用sys模块的getsizeof函数来检查存储同样的元素的元组和列表各自占用了多少内存空间,这个很容易做到。我们也可以在ipython中使用魔法指令%timeit来分析创建同样内容的元组和列表所花费的时间,下图是我的macOS系统上测试的结果。
-
-
-
-### 使用集合
-
-Python中的集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算。
-
-
-
-```Python
-def main():
- set1 = {1, 2, 3, 3, 3, 2}
- print(set1)
- print('Length =', len(set1))
- set2 = set(range(1, 10))
- print(set2)
- set1.add(4)
- set1.add(5)
- set2.update([11, 12])
- print(set1)
- print(set2)
- set2.discard(5)
- # remove的元素如果不存在会引发KeyError
- if 4 in set2:
- set2.remove(4)
- print(set2)
- # 遍历集合容器
- for elem in set2:
- print(elem ** 2, end=' ')
- print()
- # 将元组转换成集合
- set3 = set((1, 2, 3, 3, 2, 1))
- print(set3.pop())
- print(set3)
- # 集合的交集、并集、差集、对称差运算
- print(set1 & set2)
- # print(set1.intersection(set2))
- print(set1 | set2)
- # print(set1.union(set2))
- print(set1 - set2)
- # print(set1.difference(set2))
- print(set1 ^ set2)
- # print(set1.symmetric_difference(set2))
- # 判断子集和超集
- print(set2 <= set1)
- # print(set2.issubset(set1))
- print(set3 <= set1)
- # print(set3.issubset(set1))
- print(set1 >= set2)
- # print(set1.issuperset(set2))
- print(set1 >= set3)
- # print(set1.issuperset(set3))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-> **说明**:Python中允许通过一些特殊的方法来为某种类型或数据结构自定义运算符(后面的章节中会讲到),上面的代码中我们对集合进行运算的时候可以调用集合对象的方法,也可以直接使用对应的运算符,例如`&`运算符跟intersection方法的作用就是一样的,但是使用运算符让代码更加直观。
-
-### 使用字典
-
-字典是另一种可变容器模型,类似于我们生活中使用的字典,它可以存储任意类型对象,与列表、集合不同的是,字典的每个元素都是由一个键和一个值组成的“键值对”,键和值通过冒号分开。下面的代码演示了如何定义和使用字典。
-
-```Python
-def main():
- scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
- # 通过键可以获取字典中对应的值
- print(scores['骆昊'])
- print(scores['狄仁杰'])
- # 对字典进行遍历(遍历的其实是键再通过键取对应的值)
- for elem in scores:
- print('%s\t--->\t%d' % (elem, scores[elem]))
- # 更新字典中的元素
- scores['白元芳'] = 65
- scores['诸葛王朗'] = 71
- scores.update(冷面=67, 方启鹤=85)
- print(scores)
- if '武则天' in scores:
- print(scores['武则天'])
- print(scores.get('武则天'))
- # get方法也是通过键获取对应的值但是可以设置默认值
- print(scores.get('武则天', 60))
- # 删除字典中的元素
- print(scores.popitem())
- print(scores.popitem())
- print(scores.pop('骆昊', 100))
- # 清空字典
- scores.clear()
- print(scores)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 练习
-
-#### 练习1:在屏幕上显示跑马灯文字
-
-```Python
-import os
-import time
-
-
-def main():
- content = '北京欢迎你为你开天辟地…………'
- while True:
- # 清理屏幕上的输出
- os.system('cls') # os.system('clear')
- print(content)
- # 休眠200毫秒
- time.sleep(0.2)
- content = content[1:] + content[0]
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 练习2:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。
-
-```Python
-import random
-
-
-def generate_code(code_len=4):
- """
- 生成指定长度的验证码
-
- :param code_len: 验证码的长度(默认4个字符)
-
- :return: 由大小写英文字母和数字构成的随机验证码
- """
- all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
- last_pos = len(all_chars) - 1
- code = ''
- for _ in range(code_len):
- index = random.randint(0, last_pos)
- code += all_chars[index]
- return code
-```
-
-#### 练习3:设计一个函数返回给定文件名的后缀名。
-
-```Python
-def get_suffix(filename, has_dot=False):
- """
- 获取文件名的后缀名
-
- :param filename: 文件名
- :param has_dot: 返回的后缀名是否需要带点
-
- :return: 文件的后缀名
- """
- pos = filename.rfind('.')
- if 0 < pos < len(filename) - 1:
- index = pos if has_dot else pos + 1
- return filename[index:]
- else:
- return ''
-
-```
-
-#### 练习4:设计一个函数返回传入的列表中最大和第二大的元素的值。
-
-```Python
-def max2(x):
- m1, m2 = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
- for index in range(2, len(x)):
- if x[index] > m1:
- m2 = m1
- m1 = x[index]
- elif x[index] > m2:
- m2 = x[index]
- return m1, m2
-```
-
-#### 练习5:计算指定的年月日是这一年的第几天
-
-```Python
-def is_leap_year(year):
- """
- 判断指定的年份是不是闰年
-
- :param year: 年份
-
- :return: 闰年返回True平年返回False
- """
- return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
-
-
-def which_day(year, month, date):
- """
- 计算传入的日期是这一年的第几天
-
- :param year: 年
- :param month: 月
- :param date: 日
-
- :return: 第几天
- """
- days_of_month = [
- [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
- [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
- ][is_leap_year(year)]
- total = 0
- for index in range(month - 1):
- total += days_of_month[index]
- return total + date
-
-
-def main():
- print(which_day(1980, 11, 28))
- print(which_day(1981, 12, 31))
- print(which_day(2018, 1, 1))
- print(which_day(2016, 3, 1))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 练习6:打印[杨辉三角](https://zh.wikipedia.org/wiki/%E6%9D%A8%E8%BE%89%E4%B8%89%E8%A7%92%E5%BD%A2)。
-
-```Python
-def main():
- num = int(input('Number of rows: '))
- yh = [[]] * num
- for row in range(len(yh)):
- yh[row] = [None] * (row + 1)
- for col in range(len(yh[row])):
- if col == 0 or col == row:
- yh[row][col] = 1
- else:
- yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
- print(yh[row][col], end='\t')
- print()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 综合案例
-
-#### 案例1:双色球选号
-
-```Python
-from random import randrange, randint, sample
-
-
-def display(balls):
- """
- 输出列表中的双色球号码
- """
- for index, ball in enumerate(balls):
- if index == len(balls) - 1:
- print('|', end=' ')
- print('%02d' % ball, end=' ')
- print()
-
-
-def random_select():
- """
- 随机选择一组号码
- """
- red_balls = [x for x in range(1, 34)]
- selected_balls = []
- for _ in range(6):
- index = randrange(len(red_balls))
- selected_balls.append(red_balls[index])
- del red_balls[index]
- # 上面的for循环也可以写成下面这行代码
- # sample函数是random模块下的函数
- # selected_balls = sample(red_balls, 6)
- selected_balls.sort()
- selected_balls.append(randint(1, 16))
- return selected_balls
-
-
-def main():
- n = int(input('机选几注: '))
- for _ in range(n):
- display(random_select())
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-> **说明**:可以使用random模块的sample函数来实现从列表中选择不重复的n个元素。
-
-#### 综合案例2:[约瑟夫环问题](https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98)
-
-```Python
-"""
-
-《幸运的基督徒》
-有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。
-
-"""
-
-
-def main():
- persons = [True] * 30
- counter, index, number = 0, 0, 0
- while counter < 15:
- if persons[index]:
- number += 1
- if number == 9:
- persons[index] = False
- counter += 1
- number = 0
- index += 1
- index %= 30
- for person in persons:
- print('基' if person else '非', end='')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 综合案例3:[井字棋](https://zh.wikipedia.org/wiki/%E4%BA%95%E5%AD%97%E6%A3%8B)游戏
-
-```Python
-import os
-
-
-def print_board(board):
- print(board['TL'] + '|' + board['TM'] + '|' + board['TR'])
- print('-+-+-')
- print(board['ML'] + '|' + board['MM'] + '|' + board['MR'])
- print('-+-+-')
- print(board['BL'] + '|' + board['BM'] + '|' + board['BR'])
-
-
-def main():
- init_board = {
- 'TL': ' ', 'TM': ' ', 'TR': ' ',
- 'ML': ' ', 'MM': ' ', 'MR': ' ',
- 'BL': ' ', 'BM': ' ', 'BR': ' '
- }
- begin = True
- while begin:
- curr_board = init_board.copy()
- begin = False
- turn = 'x'
- counter = 0
- os.system('clear')
- print_board(curr_board)
- while counter < 9:
- move = input('轮到%s走棋, 请输入位置: ' % turn)
- if curr_board[move] == ' ':
- counter += 1
- curr_board[move] = turn
- if turn == 'x':
- turn = 'o'
- else:
- turn = 'x'
- os.system('clear')
- print_board(curr_board)
- choice = input('再玩一局?(yes|no)')
- begin = choice == 'yes'
-
-
-if __name__ == '__main__':
- main()
-
-```
-
->**说明**:最后这个案例来自[《Python编程快速上手:让繁琐工作自动化》](https://item.jd.com/11943853.html)一书(这本书对有编程基础想迅速使用Python将日常工作自动化的人来说还是不错的教材),对代码做了一点点的调整。
\ No newline at end of file
diff --git a/Day01-15/Day08/access.py b/Day01-15/Day08/access.py
deleted file mode 100644
index 8ed1558a9..000000000
--- a/Day01-15/Day08/access.py
+++ /dev/null
@@ -1,18 +0,0 @@
-class Test:
-
- def __init__(self, foo):
- self.__foo = foo
-
- def __bar(self):
- print(self.__foo)
- print('__bar')
-
-
-def main():
- test = Test('hello')
- test._Test__bar()
- print(test._Test__foo)
-
-
-if __name__ == "__main__":
- main()
diff --git a/Day01-15/Day08/circle.py b/Day01-15/Day08/circle.py
deleted file mode 100644
index 7e0ddc02c..000000000
--- a/Day01-15/Day08/circle.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""
-
-练习
-修一个游泳池 半径(以米为单位)在程序运行时输入 游泳池外修一条3米宽的过道
-过道的外侧修一圈围墙 已知过道的造价为25元每平米 围墙的造价为32.5元每米
-输出围墙和过道的总造价分别是多少钱(精确到小数点后2位)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-08
-
-"""
-
-import math
-
-
-class Circle(object):
-
- def __init__(self, radius):
- self._radius = radius
-
- @property
- def radius(self):
- return self._radius
-
- @radius.setter
- def radius(self, radius):
- self._radius = radius if radius > 0 else 0
-
- @property
- def perimeter(self):
- return 2 * math.pi * self._radius
-
- @property
- def area(self):
- return math.pi * self._radius * self._radius
-
-
-if __name__ == '__main__':
- radius = float(input('请输入游泳池的半径: '))
- small = Circle(radius)
- big = Circle(radius + 3)
- print('围墙的造价为: ¥%.1f元' % (big.perimeter * 115))
- print('过道的造价为: ¥%.1f元' % ((big.area - small.area) * 65))
diff --git a/Day01-15/Day08/clock.py b/Day01-15/Day08/clock.py
deleted file mode 100644
index ffdb7923b..000000000
--- a/Day01-15/Day08/clock.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-
-定义和使用时钟类
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-08
-
-"""
-
-import time
-import os
-
-
-class Clock(object):
-
- # Python中的函数是没有重载的概念的
- # 因为Python中函数的参数没有类型而且支持缺省参数和可变参数
- # 用关键字参数让构造器可以传入任意多个参数来实现其他语言中的构造器重载
- def __init__(self, **kw):
- if 'hour' in kw and 'minute' in kw and 'second' in kw:
- self._hour = kw['hour']
- self._minute = kw['minute']
- self._second = kw['second']
- else:
- tm = time.localtime(time.time())
- self._hour = tm.tm_hour
- self._minute = tm.tm_min
- self._second = tm.tm_sec
-
- def run(self):
- self._second += 1
- if self._second == 60:
- self._second = 0
- self._minute += 1
- if self._minute == 60:
- self._minute = 0
- self._hour += 1
- if self._hour == 24:
- self._hour = 0
-
- def show(self):
- return '%02d:%02d:%02d' % (self._hour, self._minute, self._second)
-
-
-if __name__ == '__main__':
- # clock = Clock(hour=10, minute=5, second=58)
- clock = Clock()
- while True:
- os.system('clear')
- print(clock.show())
- time.sleep(1)
- clock.run()
diff --git a/Day01-15/Day08/guess.py b/Day01-15/Day08/guess.py
deleted file mode 100644
index 095c52824..000000000
--- a/Day01-15/Day08/guess.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""
-
-面向对象版本的猜数字游戏
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-08
-
-"""
-
-from random import randint
-
-
-class GuessMachine(object):
-
- def __init__(self):
- self._answer = None
- self._counter = None
- self._hint = None
-
- def reset(self):
- self._answer = randint(1, 100)
- self._counter = 0
- self._hint = None
-
- def guess(self, your_answer):
- self._counter += 1
- if your_answer > self._answer:
- self._hint = '小一点'
- elif your_answer < self._answer:
- self._hint = '大一点'
- else:
- self._hint = '恭喜你猜对了'
- return True
- return False
-
- @property
- def counter(self):
- return self._counter
-
- @property
- def hint(self):
- return self._hint
-
-
-if __name__ == '__main__':
- gm = GuessMachine()
- play_again = True
- while play_again:
- game_over = False
- gm.reset()
- while not game_over:
- your_answer = int(input('请输入: '))
- game_over = gm.guess(your_answer)
- print(gm.hint)
- if gm.counter > 7:
- print('智商余额不足!')
- play_again = input('再玩一次?(yes|no)') == 'yes'
diff --git a/Day01-15/Day08/hack.py b/Day01-15/Day08/hack.py
deleted file mode 100644
index 701f3a034..000000000
--- a/Day01-15/Day08/hack.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-
-另一种创建类的方式
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-08
-
-"""
-
-
-def bar(self, name):
- self._name = name
-
-
-def foo(self, course_name):
- print('%s正在学习%s.' % (self._name, course_name))
-
-
-def main():
- Student = type('Student', (object,), dict(__init__=bar, study=foo))
- stu1 = Student('骆昊')
- stu1.study('Python程序设计')
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day08/rect.py b/Day01-15/Day08/rect.py
deleted file mode 100644
index 3698b2589..000000000
--- a/Day01-15/Day08/rect.py
+++ /dev/null
@@ -1,45 +0,0 @@
-"""
-
-定义和使用矩形类
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-08
-
-"""
-
-
-class Rect(object):
- """矩形类"""
-
- def __init__(self, width=0, height=0):
- """构造器"""
- self.__width = width
- self.__height = height
-
- def perimeter(self):
- """计算周长"""
- return (self.__width + self.__height) * 2
-
- def area(self):
- """计算面积"""
- return self.__width * self.__height
-
- def __str__(self):
- """矩形对象的字符串表达式"""
- return '矩形[%f,%f]' % (self.__width, self.__height)
-
- def __del__(self):
- """析构器"""
- print('销毁矩形对象')
-
-
-if __name__ == '__main__':
- rect1 = Rect()
- print(rect1)
- print(rect1.perimeter())
- print(rect1.area())
- rect2 = Rect(3.5, 4.5)
- print(rect2)
- print(rect2.perimeter())
- print(rect2.area())
diff --git a/Day01-15/Day08/res/object-feature.png b/Day01-15/Day08/res/object-feature.png
deleted file mode 100644
index 62c605762..000000000
Binary files a/Day01-15/Day08/res/object-feature.png and /dev/null differ
diff --git a/Day01-15/Day08/res/oop-zhihu.png b/Day01-15/Day08/res/oop-zhihu.png
deleted file mode 100644
index c473984a0..000000000
Binary files a/Day01-15/Day08/res/oop-zhihu.png and /dev/null differ
diff --git a/Day01-15/Day08/student.py b/Day01-15/Day08/student.py
deleted file mode 100644
index f5ac8552f..000000000
--- a/Day01-15/Day08/student.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-
-定义和使用学生类
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-08
-
-"""
-
-
-def _foo():
- print('test')
-
-
-class Student(object):
-
- # __init__是一个特殊方法用于在创建对象时进行初始化操作
- # 通过这个方法我们可以为学生对象绑定name和age两个属性
- def __init__(self, name, age):
- self.name = name
- self.age = age
-
- def study(self, course_name):
- print('%s正在学习%s.' % (self.name, course_name))
-
- # PEP 8要求标识符的名字用全小写多个单词用下划线连接
- # 但是很多程序员和公司更倾向于使用驼峰命名法(驼峰标识)
- def watch_av(self):
- if self.age < 18:
- print('%s只能观看《熊出没》.' % self.name)
- else:
- print('%s正在观看岛国爱情动作片.' % self.name)
-
-
-def main():
- stu1 = Student('骆昊', 38)
- stu1.study('Python程序设计')
- stu1.watch_av()
- stu2 = Student('王大锤', 15)
- stu2.study('思想品德')
- stu2.watch_av()
-
-
-if __name__ == '__main__':
- main()
\ No newline at end of file
diff --git a/Day01-15/Day08/test.py b/Day01-15/Day08/test.py
deleted file mode 100644
index e69de29bb..000000000
diff --git "a/Day01-15/Day08/\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\237\272\347\241\200.md" "b/Day01-15/Day08/\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\237\272\347\241\200.md"
deleted file mode 100644
index 880db4514..000000000
--- "a/Day01-15/Day08/\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\237\272\347\241\200.md"
+++ /dev/null
@@ -1,252 +0,0 @@
-## 面向对象编程基础
-
-活在当下的程序员应该都听过“面向对象编程”一词,也经常有人问能不能用一句话解释下什么是“面向对象编程”,我们先来看看比较正式的说法。
-
-> 把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。
-
-这样一说是不是更不明白了。所以我们还是看看更通俗易懂的说法,下面这段内容来自于[知乎](https://www.zhihu.com/)。
-
-
-
-> **说明**:以上的内容来自于网络,不代表作者本人的观点和看法,与作者本人立场无关,相关责任不由作者承担。(终于有机会享受一下把这段话反过来说的乐趣了,乐得牙都快碎了。)
-
-之前我们说过“程序是指令的集合”,我们在程序中书写的语句在执行时会变成一条或多条指令然后由CPU去执行。当然为了简化程序的设计,我们引入了函数的概念,把相对独立且经常重复使用的代码放置到函数中,在需要使用这些功能的时候只要调用函数即可;如果一个函数的功能过于复杂和臃肿,我们又可以进一步将函数继续切分为子函数来降低系统的复杂性。但是说了这么多,不知道大家是否发现,所谓编程就是程序员按照计算机的工作方式控制计算机完成各种任务。但是,计算机的工作方式与正常人类的思维模式是不同的,如果编程就必须得抛弃人类正常的思维方式去迎合计算机,编程的乐趣就少了很多,“每个人都应该学习编程”这样的豪言壮语就只能说说而已。当然,这些还不是最重要的,最重要的是当我们需要开发一个复杂的系统时,代码的复杂性会让开发和维护工作都变得举步维艰,所以在上世纪60年代末期,“[软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)”、“[软件工程](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B)”等一系列的概念开始在行业中出现。
-
-当然,程序员圈子内的人都知道,现实中并没有解决上面所说的这些问题的“[银弹](https://zh.wikipedia.org/wiki/%E6%B2%A1%E6%9C%89%E9%93%B6%E5%BC%B9)”,真正让软件开发者看到希望的是上世纪70年代诞生的[Smalltalk](https://zh.wikipedia.org/wiki/Smalltalk)编程语言中引入的面向对象的编程思想(面向对象编程的雏形可以追溯到更早期的[Simula](https://zh.wikipedia.org/wiki/Simula)语言)。按照这种编程理念,程序中的数据和操作数据的函数是一个逻辑上的整体,我们称之为“对象”,而我们解决问题的方式就是创建出需要的对象并向对象发出各种各样的消息,多个对象的协同工作最终可以让我们构造出复杂的系统来解决现实中的问题。
-
-> **说明**:当然面向对象也不是解决软件开发中所有问题的最后的“银弹”,所以今天的高级程序设计语言几乎都提供了对多种编程范式的支持,Python也不例外。
-
-### 类和对象
-
-简单的说,类是对象的蓝图和模板,而对象是类的实例。这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。
-
-
-
-### 定义类
-
-在Python中可以使用`class`关键字定义类,然后在类中通过之前学习过的函数来定义方法,这样就可以将对象的动态特征描述出来,代码如下所示。
-
-```Python
-class Student(object):
-
- # __init__是一个特殊方法用于在创建对象时进行初始化操作
- # 通过这个方法我们可以为学生对象绑定name和age两个属性
- def __init__(self, name, age):
- self.name = name
- self.age = age
-
- def study(self, course_name):
- print('%s正在学习%s.' % (self.name, course_name))
-
- # PEP 8要求标识符的名字用全小写多个单词用下划线连接
- # 但是很多程序员和公司更倾向于使用驼峰命名法(驼峰标识)
- def watch_av(self):
- if self.age < 18:
- print('%s只能观看《熊出没》.' % self.name)
- else:
- print('%s正在观看岛国爱情动作片.' % self.name)
-```
-
-> **说明**:写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息。
-
-### 创建和使用对象
-
-当我们定义好一个类之后,可以通过下面的方式来创建对象并给对象发消息。
-
-```Python
-def main():
- # 创建学生对象并指定姓名和年龄
- stu1 = Student('骆昊', 38)
- # 给对象发study消息
- stu1.study('Python程序设计')
- # 给对象发watch_av消息
- stu1.watch_av()
- stu2 = Student('王大锤', 15)
- stu2.study('思想品德')
- stu2.watch_av()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 访问可见性问题
-
-对于上面的代码,有C++、Java、C#等编程经验的程序员可能会问,我们给`Student`对象绑定的`name`和`age`属性到底具有怎样的访问权限(也称为可见性)。因为在很多面向对象编程语言中,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头,下面的代码可以验证这一点。
-
-```Python
-class Test:
-
- def __init__(self, foo):
- self.__foo = foo
-
- def __bar(self):
- print(self.__foo)
- print('__bar')
-
-
-def main():
- test = Test('hello')
- # AttributeError: 'Test' object has no attribute '__bar'
- test.__bar()
- # AttributeError: 'Test' object has no attribute '__foo'
- print(test.__foo)
-
-
-if __name__ == "__main__":
- main()
-
-```
-
-但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,下面的代码就可以验证这一点。之所以这样设定,可以用这样一句名言加以解释,就是“We are all consenting adults here”。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。
-
-```Python
-class Test:
-
- def __init__(self, foo):
- self.__foo = foo
-
- def __bar(self):
- print(self.__foo)
- print('__bar')
-
-
-def main():
- test = Test('hello')
- test._Test__bar()
- print(test._Test__foo)
-
-
-if __name__ == "__main__":
- main()
-
-```
-
-在实际开发中,我们并不建议将属性设置为私有的,因为这会导致子类无法访问(后面会讲到)。所以大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的,本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则,单下划线开头的属性和方法外界仍然是可以访问的,所以更多的时候它是一种暗示或隐喻,关于这一点可以看看我的[《Python - 那些年我们踩过的那些坑》](http://blog.csdn.net/jackfrued/article/details/79521404)文章中的讲解。
-
-### 面向对象的支柱
-
-面向对象有三大支柱:封装、继承和多态。后面两个概念在下一个章节中进行详细的说明,这里我们先说一下什么是封装。我自己对封装的理解是“隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口”。我们在类中定义的方法其实就是把数据和对数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。
-
-### 练习
-
-#### 练习1:定义一个类描述数字时钟
-
-```Python
-class Clock(object):
- """
- 数字时钟
- """
-
- def __init__(self, hour=0, minute=0, second=0):
- """
- 构造器
-
- :param hour: 时
- :param minute: 分
- :param second: 秒
- """
- self._hour = hour
- self._minute = minute
- self._second = second
-
- def run(self):
- """走字"""
- self._second += 1
- if self._second == 60:
- self._second = 0
- self._minute += 1
- if self._minute == 60:
- self._minute = 0
- self._hour += 1
- if self._hour == 24:
- self._hour = 0
-
- def __str__(self):
- """显示时间"""
- return '%02d:%02d:%02d' % \
- (self._hour, self._minute, self._second)
-
-
-def main():
- clock = Clock(23, 59, 58)
- while True:
- print(clock)
- sleep(1)
- clock.run()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 练习2:定义一个类描述平面上的点并提供移动点和计算到另一个点距离的方法。
-
-```Python
-from math import sqrt
-
-
-class Point(object):
-
- def __init__(self, x=0, y=0):
- """
- 构造器
-
- :param x: 横坐标
- :param y: 纵坐标
- """
- self.x = x
- self.y = y
-
- def move_to(self, x, y):
- """
- 移动到指定位置
-
- :param x: 新的横坐标
- "param y: 新的纵坐标
- """
- self.x = x
- self.y = y
-
- def move_by(self, dx, dy):
- """
- 移动指定的增量
-
- :param dx: 横坐标的增量
- "param dy: 纵坐标的增量
- """
- self.x += dx
- self.y += dy
-
- def distance_to(self, other):
- """
- 计算与另一个点的距离
-
- :param other: 另一个点
- """
- dx = self.x - other.x
- dy = self.y - other.y
- return sqrt(dx ** 2 + dy ** 2)
-
- def __str__(self):
- return '(%s, %s)' % (str(self.x), str(self.y))
-
-
-def main():
- p1 = Point(3, 5)
- p2 = Point()
- print(p1)
- print(p2)
- p2.move_by(-1, 2)
- print(p2)
- print(p1.distance_to(p2))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-> **说明**:本章中的插图来自于Grady Booch等著作的[《面向对象分析与设计》](https://item.jd.com/20476561918.html)一书,该书是讲解面向对象编程的经典著作,有兴趣的读者可以购买和阅读这本书来了解更多的面向对象的相关知识。
\ No newline at end of file
diff --git a/Day01-15/Day09/association.py b/Day01-15/Day09/association.py
deleted file mode 100644
index d614abe9d..000000000
--- a/Day01-15/Day09/association.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""
-
-对象之间的关联关系
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-from math import sqrt
-
-
-class Point(object):
-
- def __init__(self, x=0, y=0):
- self._x = x
- self._y = y
-
- def move_to(self, x, y):
- self._x = x
- self._y = y
-
- def move_by(self, dx, dy):
- self._x += dx
- self._y += dy
-
- def distance_to(self, other):
- dx = self._x - other._x
- dy = self._y - other._y
- return sqrt(dx ** 2 + dy ** 2)
-
- def __str__(self):
- return '(%s, %s)' % (str(self._x), str(self._y))
-
-
-class Line(object):
-
- def __init__(self, start=Point(0, 0), end=Point(0, 0)):
- self._start = start
- self._end = end
-
- @property
- def start(self):
- return self._start
-
- @start.setter
- def start(self, start):
- self._start = start
-
- @property
- def end(self):
- return self.end
-
- @end.setter
- def end(self, end):
- self._end = end
-
- @property
- def length(self):
- return self._start.distance_to(self._end)
-
-
-if __name__ == '__main__':
- p1 = Point(3, 5)
- print(p1)
- p2 = Point(-2, -1.5)
- print(p2)
- line = Line(p1, p2)
- print(line.length)
- line.start.move_to(2, 1)
- line.end = Point(1, 2)
- print(line.length)
diff --git a/Day01-15/Day09/car1.py b/Day01-15/Day09/car1.py
deleted file mode 100644
index 813b4a89b..000000000
--- a/Day01-15/Day09/car1.py
+++ /dev/null
@@ -1,65 +0,0 @@
-"""
-
-属性的使用
- - 访问器/修改器/删除器
- - 使用__slots__对属性加以限制
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-
-class Car(object):
-
- __slots__ = ('_brand', '_max_speed')
-
- def __init__(self, brand, max_speed):
- self._brand = brand
- self._max_speed = max_speed
-
- @property
- def brand(self):
- return self._brand
-
- @brand.setter
- def brand(self, brand):
- self._brand = brand
-
- @brand.deleter
- def brand(self):
- del self._brand
-
- @property
- def max_speed(self):
- return self._max_speed
-
- @max_speed.setter
- def max_speed(self, max_speed):
- if max_speed < 0:
- raise ValueError('Invalid max speed for car')
- self._max_speed = max_speed
-
- def __str__(self):
- return 'Car: [品牌=%s, 最高时速=%d]' % (self._brand, self._max_speed)
-
-
-car = Car('QQ', 120)
-print(car)
-# ValueError
-# car.max_speed = -100
-car.max_speed = 320
-car.brand = "Benz"
-# 使用__slots__属性限制后下面的代码将产生异常
-# car.current_speed = 80
-print(car)
-# 如果提供了删除器可以执行下面的代码
-# del car.brand
-# 属性的实现
-print(Car.brand)
-print(Car.brand.fget)
-print(Car.brand.fset)
-print(Car.brand.fdel)
-# 通过上面的代码帮助学生理解之前提到的包装器的概念
-# Python中有很多类似的语法糖后面还会出现这样的东西
diff --git a/Day01-15/Day09/car2.py b/Day01-15/Day09/car2.py
deleted file mode 100644
index c8d2b4b37..000000000
--- a/Day01-15/Day09/car2.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""
-
-属性的使用
- - 使用已有方法定义访问器/修改器/删除器
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-
-class Car(object):
-
- def __init__(self, brand, max_speed):
- self.set_brand(brand)
- self.set_max_speed(max_speed)
-
- def get_brand(self):
- return self._brand
-
- def set_brand(self, brand):
- self._brand = brand
-
- def get_max_speed(self):
- return self._max_speed
-
- def set_max_speed(self, max_speed):
- if max_speed < 0:
- raise ValueError('Invalid max speed for car')
- self._max_speed = max_speed
-
- def __str__(self):
- return 'Car: [品牌=%s, 最高时速=%d]' % (self._brand, self._max_speed)
-
- # 用已有的修改器和访问器定义属性
- brand = property(get_brand, set_brand)
- max_speed = property(get_max_speed, set_max_speed)
-
-
-car = Car('QQ', 120)
-print(car)
-# ValueError
-# car.max_speed = -100
-car.max_speed = 320
-car.brand = "Benz"
-print(car)
-print(Car.brand)
-print(Car.brand.fget)
-print(Car.brand.fset)
diff --git a/Day01-15/Day09/clock.py b/Day01-15/Day09/clock.py
deleted file mode 100644
index 136c93fe9..000000000
--- a/Day01-15/Day09/clock.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from time import time, localtime, sleep
-
-
-class Clock(object):
- """数字时钟"""
-
- def __init__(self, hour=0, minute=0, second=0):
- self._hour = hour
- self._minute = minute
- self._second = second
-
- @classmethod
- def now(cls):
- ctime = localtime(time())
- return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)
-
- def run(self):
- """走字"""
- self._second += 1
- if self._second == 60:
- self._second = 0
- self._minute += 1
- if self._minute == 60:
- self._minute = 0
- self._hour += 1
- if self._hour == 24:
- self._hour = 0
-
- def show(self):
- """显示时间"""
- return '%02d:%02d:%02d' % \
- (self._hour, self._minute, self._second)
-
-
-def main():
- clock = Clock.now()
- while True:
- print(clock.show())
- sleep(1)
- clock.run()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day09/dependency.py b/Day01-15/Day09/dependency.py
deleted file mode 100644
index b315fb296..000000000
--- a/Day01-15/Day09/dependency.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""
-
-对象之间的依赖关系和运算符重载
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-
-class Car(object):
-
- def __init__(self, brand, max_speed):
- self._brand = brand
- self._max_speed = max_speed
- self._current_speed = 0
-
- @property
- def brand(self):
- return self._brand
-
- def accelerate(self, delta):
- self._current_speed += delta
- if self._current_speed > self._max_speed:
- self._current_speed = self._max_speed
-
- def brake(self):
- self._current_speed = 0
-
- def __str__(self):
- return '%s当前时速%d' % (self._brand, self._current_speed)
-
-
-class Student(object):
-
- def __init__(self, name, age):
- self._name = name
- self._age = age
-
- @property
- def name(self):
- return self._name
-
- # 学生和车之间存在依赖关系 - 学生使用了汽车
- def drive(self, car):
- print('%s驾驶着%s欢快的行驶在去西天的路上' % (self._name, car._brand))
- car.accelerate(30)
- print(car)
- car.accelerate(50)
- print(car)
- car.accelerate(50)
- print(car)
-
- def study(self, course_name):
- print('%s正在学习%s.' % (self._name, course_name))
-
- def watch_av(self):
- if self._age < 18:
- print('%s只能观看《熊出没》.' % self._name)
- else:
- print('%s正在观看岛国爱情动作片.' % self._name)
-
- # 重载大于(>)运算符
- def __gt__(self, other):
- return self._age > other._age
-
- # 重载小于(<)运算符
- def __lt__(self, other):
- return self._age < other._age
-
-
-if __name__ == '__main__':
- stu1 = Student('骆昊', 38)
- stu1.study('Python程序设计')
- stu1.watch_av()
- stu2 = Student('王大锤', 15)
- stu2.study('思想品德')
- stu2.watch_av()
- car = Car('QQ', 120)
- stu2.drive(car)
- print(stu1 > stu2)
- print(stu1 < stu2)
diff --git a/Day01-15/Day09/diamond.py b/Day01-15/Day09/diamond.py
deleted file mode 100644
index 97479203f..000000000
--- a/Day01-15/Day09/diamond.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""
-
-多重继承
- - 菱形继承(钻石继承)
- - C3算法(替代DFS的算法)
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-
-class A(object):
-
- def foo(self):
- print('foo of A')
-
-
-class B(A):
- pass
-
-
-class C(A):
-
- def foo(self):
- print('foo fo C')
-
-
-class D(B, C):
- pass
-
-
-class E(D):
-
- def foo(self):
- print('foo in E')
- super().foo()
- super(B, self).foo()
- super(C, self).foo()
-
-
-if __name__ == '__main__':
- d = D()
- d.foo()
- e = E()
- e.foo()
diff --git a/Day01-15/Day09/employee.py b/Day01-15/Day09/employee.py
deleted file mode 100644
index 8e8628b85..000000000
--- a/Day01-15/Day09/employee.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""
-
-抽象类 / 方法重写 / 多态
-实现一个工资结算系统 公司有三种类型的员工
- - 部门经理固定月薪12000元/月
- - 程序员按本月工作小时数每小时100元
- - 销售员1500元/月的底薪加上本月销售额5%的提成
-输入员工的信息 输出每位员工的月薪信息
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-from abc import ABCMeta, abstractmethod
-
-
-class Employee(object, metaclass=ABCMeta):
-
- def __init__(self, name):
- self._name = name
-
- @property
- def name(self):
- return self._name
-
- @abstractmethod
- def get_salary(self):
- pass
-
-
-class Manager(Employee):
-
- # 想一想: 如果不定义构造方法会怎么样
- def __init__(self, name):
- # 想一想: 如果不调用父类构造器会怎么样
- super().__init__(name)
-
- def get_salary(self):
- return 12000
-
-
-class Programmer(Employee):
-
- def __init__(self, name):
- super().__init__(name)
-
- def set_working_hour(self, working_hour):
- self._working_hour = working_hour
-
- def get_salary(self):
- return 100 * self._working_hour
-
-
-class Salesman(Employee):
-
- def __init__(self, name):
- super().__init__(name)
-
- def set_sales(self, sales):
- self._sales = sales
-
- def get_salary(self):
- return 1500 + self._sales * 0.05
-
-
-if __name__ == '__main__':
- emps = [Manager('武则天'), Programmer('狄仁杰'), Salesman('白元芳')]
- for emp in emps:
- if isinstance(emp, Programmer):
- working_hour = int(input('请输入%s本月工作时间: ' % emp.name))
- emp.set_working_hour(working_hour)
- elif isinstance(emp, Salesman):
- sales = float(input('请输入%s本月销售额: ' % emp.name))
- emp.set_sales(sales)
- print('%s本月月薪为: ¥%.2f元' % (emp.name, emp.get_salary()))
diff --git a/Day01-15/Day09/multi.py b/Day01-15/Day09/multi.py
deleted file mode 100644
index d24eb9ab8..000000000
--- a/Day01-15/Day09/multi.py
+++ /dev/null
@@ -1,68 +0,0 @@
-"""
-
-多重继承
- - 通过多重继承可以给一个类的对象具备多方面的能力
- - 这样在设计类的时候可以避免设计太多层次的复杂的继承关系
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-
-class Father(object):
-
- def __init__(self, name):
- self._name = name
-
- def gamble(self):
- print('%s在打麻将.' % self._name)
-
- def eat(self):
- print('%s在大吃大喝.' % self._name)
-
-
-class Monk(object):
-
- def __init__(self, name):
- self._name = name
-
- def eat(self):
- print('%s在吃斋.' % self._name)
-
- def chant(self):
- print('%s在念经.' % self._name)
-
-
-class Musician(object):
-
- def __init__(self, name):
- self._name = name
-
- def eat(self):
- print('%s在细嚼慢咽.' % self._name)
-
- def play_piano(self):
- print('%s在弹钢琴.' % self._name)
-
-
-# 试一试下面的代码看看有什么区别
-# class Son(Monk, Father, Musician):
-# class Son(Musician, Father, Monk):
-
-
-class Son(Father, Monk, Musician):
-
- def __init__(self, name):
- Father.__init__(self, name)
- Monk.__init__(self, name)
- Musician.__init__(self, name)
-
-
-son = Son('王大锤')
-son.gamble()
-# 调用继承自Father的eat方法
-son.eat()
-son.chant()
-son.play_piano()
diff --git a/Day01-15/Day09/pet.py b/Day01-15/Day09/pet.py
deleted file mode 100644
index 06035849e..000000000
--- a/Day01-15/Day09/pet.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from abc import ABCMeta, abstractmethod
-
-
-class Pet(object, metaclass=ABCMeta):
-
- def __init__(self, nickname):
- self._nickname = nickname
-
- @abstractmethod
- def make_voice(self):
- pass
-
-
-class Dog(Pet):
-
- def make_voice(self):
- print('%s: 汪汪汪...' % self._nickname)
-
-
-class Cat(Pet):
-
- def make_voice(self):
- print('%s: 喵...喵...' % self._nickname)
-
-
-def main():
- pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
- for pet in pets:
- pet.make_voice()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day09/rational.py b/Day01-15/Day09/rational.py
deleted file mode 100644
index 4ff859638..000000000
--- a/Day01-15/Day09/rational.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-
-运算符重载 - 自定义分数类
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-from math import gcd
-
-
-class Rational(object):
-
- def __init__(self, num, den=1):
- if den == 0:
- raise ValueError('分母不能为0')
- self._num = num
- self._den = den
- self.normalize()
-
- def simplify(self):
- x = abs(self._num)
- y = abs(self._den)
- factor = gcd(x, y)
- if factor > 1:
- self._num //= factor
- self._den //= factor
- return self
-
- def normalize(self):
- if self._den < 0:
- self._den = -self._den
- self._num = -self._num
- return self
-
- def __add__(self, other):
- new_num = self._num * other._den + other._num * self._den
- new_den = self._den * other._den
- return Rational(new_num, new_den).simplify().normalize()
-
- def __sub__(self, other):
- new_num = self._num * other._den - other._num * self._den
- new_den = self._den * other._den
- return Rational(new_num, new_den).simplify().normalize()
-
- def __mul__(self, other):
- new_num = self._num * other._num
- new_den = self._den * other._den
- return Rational(new_num, new_den).simplify().normalize()
-
- def __truediv__(self, other):
- new_num = self._num * other._den
- new_den = self._den * other._num
- return Rational(new_num, new_den).simplify().normalize()
-
- def __str__(self):
- if self._num == 0:
- return '0'
- elif self._den == 1:
- return str(self._num)
- else:
- return '(%d/%d)' % (self._num, self._den)
-
-
-if __name__ == '__main__':
- r1 = Rational(2, 3)
- print(r1)
- r2 = Rational(6, -8)
- print(r2)
- print(r2.simplify())
- print('%s + %s = %s' % (r1, r2, r1 + r2))
- print('%s - %s = %s' % (r1, r2, r1 - r2))
- print('%s * %s = %s' % (r1, r2, r1 * r2))
- print('%s / %s = %s' % (r1, r2, r1 / r2))
diff --git a/Day01-15/Day09/res/uml-components.png b/Day01-15/Day09/res/uml-components.png
deleted file mode 100644
index 0394cd7f2..000000000
Binary files a/Day01-15/Day09/res/uml-components.png and /dev/null differ
diff --git a/Day01-15/Day09/res/uml-example.gliffy b/Day01-15/Day09/res/uml-example.gliffy
deleted file mode 100644
index 015163a2f..000000000
--- a/Day01-15/Day09/res/uml-example.gliffy
+++ /dev/null
@@ -1 +0,0 @@
-{"contentType":"application/gliffy+json","version":"1.1","metadata":{"title":"untitled","revision":0,"exportBorder":false},"embeddedResources":{"index":0,"resources":[]},"stage":{"objects":[{"x":211,"y":179.5,"rotation":0,"id":79,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":60,"height":28,"lockAspectRatio":false,"lockShape":false,"order":71,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"
继承关系
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":702,"y":249,"rotation":0,"id":78,"uid":"com.gliffy.shape.uml.uml_v1.default.generalization","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":70,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":4,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[82,-4],[50,-4],[50,-69.32485578727801],[18,-69.32485578727801]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":70,"px":0,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":32,"px":0.9999999999999998,"py":0.7071067811865475}}},"linkMap":[]},{"x":615,"y":70,"rotation":0,"id":77,"uid":"com.gliffy.shape.uml.uml_v1.default.generalization","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":69,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":4,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[169,6.75],[137,6.75],[137,70.32485578727798],[105,70.32485578727798]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":63,"px":0,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":32,"px":1,"py":0.29289321881345237}}},"linkMap":[]},{"x":228,"y":356,"rotation":0,"id":55,"uid":"com.gliffy.shape.uml.uml_v1.default.association","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":0,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[202,-46],[202,-22.666666666666686],[202,0.6666666666666856],[202,24]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":24,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":48,"px":0.5,"py":0}}},"linkMap":[]},{"x":667,"y":225,"rotation":0,"id":47,"uid":"com.gliffy.shape.uml.uml_v1.default.aggregation","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":40,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":5,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-17,-17.5],[-17,8.333333333333343],[-17,34.166666666666686],[-17,60]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":32,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":56,"px":0.5,"py":0}}},"linkMap":[]},{"x":403,"y":390,"rotation":0,"id":39,"uid":"com.gliffy.shape.uml.uml_v1.default.dependency","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":39,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"8.0,2.0","startArrow":0,"endArrow":6,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[97,-125],[137,-125],[137,-230],[177,-230]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":24,"px":1,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":32,"px":0,"py":0.5}}},"linkMap":[]},{"x":289,"y":219,"rotation":0,"id":31,"uid":"com.gliffy.shape.uml.uml_v1.default.generalization","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":31,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":4,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[141,1],[141,-124],[51,-124]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":24,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":0,"px":1,"py":0.5}}},"linkMap":[]},{"x":325,"y":185,"rotation":0,"id":22,"uid":"com.gliffy.shape.uml.uml_v1.default.generalization","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":23,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":4,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-55,35],[-55,11.666666666666657],[-55,-11.666666666666657],[-55,-35]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":14,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":0,"px":0.5,"py":1}}},"linkMap":[]},{"x":98,"y":173,"rotation":0,"id":21,"uid":"com.gliffy.shape.uml.uml_v1.default.generalization","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":22,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":null,"startArrow":0,"endArrow":4,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":null,"controlPath":[[12,47],[12,-78],[102,-78]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":7,"px":0.5,"py":0}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":0,"px":0,"py":0.5}}},"linkMap":[]},{"x":200,"y":220,"rotation":0,"id":14,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":75,"lockAspectRatio":false,"lockShape":false,"order":15,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":15,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":16,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Teacher
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":16,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":17,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":18,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"title
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":15,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":18,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":36,"rotation":0,"id":19,"uid":null,"width":140,"height":39,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":20,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"teach
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":14,"magnitude":1},{"id":15,"magnitude":-1},{"id":17,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":17,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":15,"magnitude":1},{"id":17,"magnitude":1},{"id":20,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":40,"y":220,"rotation":0,"id":7,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":75,"lockAspectRatio":false,"lockShape":false,"order":8,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":8,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":9,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Student
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":9,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":10,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":11,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"grade
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":8,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":11,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":36,"rotation":0,"id":12,"uid":null,"width":140,"height":39,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":13,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"study
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":7,"magnitude":1},{"id":8,"magnitude":-1},{"id":10,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":10,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":8,"magnitude":1},{"id":10,"magnitude":1},{"id":13,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":200,"y":40,"rotation":0,"id":0,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":110,"lockAspectRatio":false,"lockShape":false,"order":1,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":1,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":2,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Person
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":2,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":3,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":4,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"name\n
age
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":1,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":4,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":50,"rotation":0,"id":5,"uid":null,"width":140,"height":60,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":6,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"eat\n
play
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":0,"magnitude":1},{"id":1,"magnitude":-1},{"id":3,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":3,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":1,"magnitude":1},{"id":3,"magnitude":1},{"id":6,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":360,"y":220,"rotation":0,"id":24,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":90,"lockAspectRatio":false,"lockShape":false,"order":24,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":25,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":26,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Driver
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":26,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":27,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":28,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"work_experience\n
license
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":25,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":28,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":50,"rotation":0,"id":29,"uid":null,"width":140,"height":40,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":30,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"drive
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":24,"magnitude":1},{"id":25,"magnitude":-1},{"id":27,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":27,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":25,"magnitude":1},{"id":27,"magnitude":1},{"id":30,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":580,"y":112.5,"rotation":0,"id":32,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":95,"lockAspectRatio":false,"lockShape":false,"order":32,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":33,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":34,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Vehicle
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":34,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":35,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":36,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"brand\n
engine
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":33,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":36,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":50,"rotation":0,"id":37,"uid":null,"width":140,"height":45,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":38,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"accelerate\n
slow_down
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":32,"magnitude":1},{"id":33,"magnitude":-1},{"id":35,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":35,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":33,"magnitude":1},{"id":35,"magnitude":1},{"id":38,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":360,"y":380,"rotation":0,"id":48,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":75,"lockAspectRatio":false,"lockShape":false,"order":41,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":49,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":50,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"License
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":50,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":51,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":52,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Attribute
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":49,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":52,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":36,"rotation":0,"id":53,"uid":null,"width":140,"height":39,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":54,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Method
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":48,"magnitude":1},{"id":49,"magnitude":-1},{"id":51,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":51,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":49,"magnitude":1},{"id":51,"magnitude":1},{"id":54,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":580,"y":285,"rotation":0,"id":56,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":75,"lockAspectRatio":false,"lockShape":false,"order":48,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":57,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":58,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Engine
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":58,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":59,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":60,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"number
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":57,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":60,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":36,"rotation":0,"id":61,"uid":null,"width":140,"height":39,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":62,"uid":null,"width":140,"height":4,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":56,"magnitude":1},{"id":57,"magnitude":-1},{"id":59,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":59,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":57,"magnitude":1},{"id":59,"magnitude":1},{"id":62,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":784,"y":41,"rotation":0,"id":63,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":71.5,"lockAspectRatio":false,"lockShape":false,"order":55,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":64,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":65,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Car
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":65,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":66,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":67,"uid":null,"width":140,"height":32,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"seats\n
displacement
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":64,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":67,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":50,"rotation":0,"id":68,"uid":null,"width":140,"height":21.5,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":69,"uid":null,"width":140,"height":4,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":63,"magnitude":1},{"id":64,"magnitude":-1},{"id":66,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":66,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":64,"magnitude":1},{"id":66,"magnitude":1},{"id":69,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":784,"y":207.5,"rotation":0,"id":70,"uid":"com.gliffy.shape.uml.uml_v1.default.class","width":140,"height":75,"lockAspectRatio":false,"lockShape":false,"order":62,"graphic":null,"children":[{"x":0,"y":0,"rotation":0,"id":71,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":72,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"Truck
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":72,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":18,"rotation":0,"id":73,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":74,"uid":null,"width":140,"height":18,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"capacity
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"PositionConstraint","PositionConstraint":{"nodeId":71,"px":0,"py":1}},{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":74,"magnitude":1}],"growParent":true,"padding":0}}]}},{"x":0,"y":36,"rotation":0,"id":75,"uid":null,"width":140,"height":39,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#FFFFFF","gradient":false,"dropShadow":true,"state":0,"shadowX":4,"shadowY":4,"opacity":1}},"children":[{"x":0,"y":0,"rotation":0,"id":76,"uid":null,"width":140,"height":4,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"top","overflow":"none","vposition":"none","hposition":"none","html":"
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":false,"heightInfo":[{"id":70,"magnitude":1},{"id":71,"magnitude":-1},{"id":73,"magnitude":-1}],"growParent":false,"padding":0}},{"type":"PositionConstraint","PositionConstraint":{"nodeId":73,"px":0,"py":1}}]}}],"constraints":{"constraints":[{"type":"HeightConstraint","HeightConstraint":{"isMin":true,"heightInfo":[{"id":71,"magnitude":1},{"id":73,"magnitude":1},{"id":76,"magnitude":1}],"growParent":false,"padding":0}}]},"linkMap":[]},{"x":371,"y":346,"rotation":0,"id":81,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":60,"height":14,"lockAspectRatio":false,"lockShape":false,"order":72,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"关联关系
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":490,"y":186.5,"rotation":0,"id":82,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":60,"height":14,"lockAspectRatio":false,"lockShape":false,"order":73,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"依赖关系
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":591,"y":238,"rotation":0,"id":83,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":60,"height":14,"lockAspectRatio":false,"lockShape":false,"order":74,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"聚合关系
","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]}],"background":"#FFFFFF","width":926,"height":455,"maxWidth":5000,"maxHeight":5000,"nodeIndex":84,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"shapeStyles":{},"lineStyles":{},"textStyles":{},"themeData":null}}
\ No newline at end of file
diff --git a/Day01-15/Day09/res/uml-example.png b/Day01-15/Day09/res/uml-example.png
deleted file mode 100644
index 14e8e9c37..000000000
Binary files a/Day01-15/Day09/res/uml-example.png and /dev/null differ
diff --git a/Day01-15/Day09/shape.py b/Day01-15/Day09/shape.py
deleted file mode 100644
index 8bd292c26..000000000
--- a/Day01-15/Day09/shape.py
+++ /dev/null
@@ -1,66 +0,0 @@
-"""
-
-继承的应用
- - 抽象类
- - 抽象方法
- - 方法重写
- - 多态
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-from abc import ABCMeta, abstractmethod
-from math import pi
-
-
-class Shape(object, metaclass=ABCMeta):
-
- @abstractmethod
- def perimeter(self):
- pass
-
- @abstractmethod
- def area(self):
- pass
-
-
-class Circle(Shape):
-
- def __init__(self, radius):
- self._radius = radius
-
- def perimeter(self):
- return 2 * pi * self._radius
-
- def area(self):
- return pi * self._radius ** 2
-
- def __str__(self):
- return '我是一个圆'
-
-
-class Rect(Shape):
-
- def __init__(self, width, height):
- self._width = width
- self._height = height
-
- def perimeter(self):
- return 2 * (self._width + self._height)
-
- def area(self):
- return self._width * self._height
-
- def __str__(self):
- return '我是一个矩形'
-
-
-if __name__ == '__main__':
- shapes = [Circle(5), Circle(3.2), Rect(3.2, 6.3)]
- for shape in shapes:
- print(shape)
- print('周长:', shape.perimeter())
- print('面积:', shape.area())
diff --git a/Day01-15/Day09/triangle.py b/Day01-15/Day09/triangle.py
deleted file mode 100644
index d6feb762d..000000000
--- a/Day01-15/Day09/triangle.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-
-实例方法和类方法的应用
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-12
-
-"""
-
-from math import sqrt
-
-
-class Triangle(object):
-
- def __init__(self, a, b, c):
- self._a = a
- self._b = b
- self._c = c
-
- # 静态方法
- @staticmethod
- def is_valid(a, b, c):
- return a + b > c and b + c > a and c + a > b
-
- # 实例方法
- def perimeter(self):
- return self._a + self._b + self._c
-
- # 实例方法
- def area(self):
- p = self.perimeter() / 2
- return sqrt(p * (p - self._a) * (p - self._b) * (p - self._c))
-
-
-if __name__ == '__main__':
- # 用字符串的split方法将字符串拆分成一个列表
- # 再通过map函数对列表中的每个字符串进行映射处理成小数
- a, b, c = map(float, input('请输入三条边: ').split())
- # 先判断给定长度的三条边能否构成三角形
- # 如果能才创建三角形对象
- if Triangle.is_valid(a, b, c):
- tri = Triangle(a, b, c)
- print('周长:', tri.perimeter())
- print('面积:', tri.area())
- # 如果传入对象作为方法参数也可以通过类调用实例方法
- # print('周长:', Triangle.perimeter(tri))
- # print('面积:', Triangle.area(tri))
- # 看看下面的代码就知道其实二者本质上是一致的
- # print(type(tri.perimeter))
- # print(type(Triangle.perimeter))
- else:
- print('不能构成三角形.')
diff --git "a/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md" "b/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md"
deleted file mode 100644
index 836f22bad..000000000
--- "a/Day01-15/Day09/\351\235\242\345\220\221\345\257\271\350\261\241\350\277\233\351\230\266.md"
+++ /dev/null
@@ -1,766 +0,0 @@
-## 面向对象进阶
-
-在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。
-
-### @property装饰器
-
-之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。
-
-```Python
-class Person(object):
-
- def __init__(self, name, age):
- self._name = name
- self._age = age
-
- # 访问器 - getter方法
- @property
- def name(self):
- return self._name
-
- # 访问器 - getter方法
- @property
- def age(self):
- return self._age
-
- # 修改器 - setter方法
- @age.setter
- def age(self, age):
- self._age = age
-
- def play(self):
- if self._age <= 16:
- print('%s正在玩飞行棋.' % self._name)
- else:
- print('%s正在玩斗地主.' % self._name)
-
-
-def main():
- person = Person('王大锤', 12)
- person.play()
- person.age = 22
- person.play()
- # person.name = '白元芳' # AttributeError: can't set attribute
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### \_\_slots\_\_魔法
-
-我们讲到这里,不知道大家是否已经意识到,Python是一门[动态语言](https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%AF%AD%E8%A8%80)。通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义\_\_slots\_\_变量来进行限定。需要注意的是\_\_slots\_\_的限定只对当前类的对象生效,对子类并不起任何作用。
-
-```Python
-class Person(object):
-
- # 限定Person对象只能绑定_name, _age和_gender属性
- __slots__ = ('_name', '_age', '_gender')
-
- def __init__(self, name, age):
- self._name = name
- self._age = age
-
- @property
- def name(self):
- return self._name
-
- @property
- def age(self):
- return self._age
-
- @age.setter
- def age(self, age):
- self._age = age
-
- def play(self):
- if self._age <= 16:
- print('%s正在玩飞行棋.' % self._name)
- else:
- print('%s正在玩斗地主.' % self._name)
-
-
-def main():
- person = Person('王大锤', 22)
- person.play()
- person._gender = '男'
- # AttributeError: 'Person' object has no attribute '_is_gay'
- # person._is_gay = True
-
-```
-
-### 静态方法和类方法
-
-之前,我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息。实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题,代码如下所示。
-
-```Python
-from math import sqrt
-
-
-class Triangle(object):
-
- def __init__(self, a, b, c):
- self._a = a
- self._b = b
- self._c = c
-
- @staticmethod
- def is_valid(a, b, c):
- return a + b > c and b + c > a and a + c > b
-
- def perimeter(self):
- return self._a + self._b + self._c
-
- def area(self):
- half = self.perimeter() / 2
- return sqrt(half * (half - self._a) *
- (half - self._b) * (half - self._c))
-
-
-def main():
- a, b, c = 3, 4, 5
- # 静态方法和类方法都是通过给类发消息来调用的
- if Triangle.is_valid(a, b, c):
- t = Triangle(a, b, c)
- print(t.perimeter())
- # 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
- # print(Triangle.perimeter(t))
- print(t.area())
- # print(Triangle.area(t))
- else:
- print('无法构成三角形.')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-和静态方法比较类似,Python还可以在类中定义类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象(类本身也是一个对象,有的地方也称之为类的元数据对象),通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象,代码如下所示。
-
-```Python
-from time import time, localtime, sleep
-
-
-class Clock(object):
- """数字时钟"""
-
- def __init__(self, hour=0, minute=0, second=0):
- self._hour = hour
- self._minute = minute
- self._second = second
-
- @classmethod
- def now(cls):
- ctime = localtime(time())
- return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)
-
- def run(self):
- """走字"""
- self._second += 1
- if self._second == 60:
- self._second = 0
- self._minute += 1
- if self._minute == 60:
- self._minute = 0
- self._hour += 1
- if self._hour == 24:
- self._hour = 0
-
- def show(self):
- """显示时间"""
- return '%02d:%02d:%02d' % \
- (self._hour, self._minute, self._second)
-
-
-def main():
- # 通过类方法创建对象并获取系统时间
- clock = Clock.now()
- while True:
- print(clock.show())
- sleep(1)
- clock.run()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 类之间的关系
-
-简单的说,类和类之间的关系有三种:is-a、has-a和use-a关系。
-
-- is-a关系也叫继承或泛化,比如学生和人的关系、手机和电子产品的关系都属于继承关系。
-- has-a关系通常称之为关联,比如部门和员工的关系,汽车和引擎的关系都属于关联关系;关联关系如果是整体和部分的关联,那么我们称之为聚合关系;如果整体进一步负责了部分的生命周期(整体和部分是不可分割的,同时同在也同时消亡),那么这种就是最强的关联关系,我们称之为合成关系。
-- use-a关系通常称之为依赖,比如司机有一个驾驶的行为(方法),其中(的参数)使用到了汽车,那么司机和汽车的关系就是依赖关系。
-
-我们可以使用一种叫做[UML](https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E5%BB%BA%E6%A8%A1%E8%AF%AD%E8%A8%80)(统一建模语言)的东西来进行面向对象建模,其中一项重要的工作就是把类和类之间的关系用标准化的图形符号描述出来。关于UML我们在这里不做详细的介绍,有兴趣的读者可以自行阅读[《UML面向对象设计基础》](https://e.jd.com/30392949.html)一书。
-
-
-
-
-
-利用类之间的这些关系,我们可以在已有类的基础上来完成某些操作,也可以在已有类的基础上创建新的类,这些都是实现代码复用的重要手段。复用现有的代码不仅可以减少开发的工作量,也有利于代码的管理和维护,这是我们在日常工作中都会使用到的技术手段。
-
-### 继承和多态
-
-刚才我们提到了,可以在已有类的基础上创建新类,这其中的一种做法就是让一个类从另一个类那里将属性和方法直接继承下来,从而减少重复代码的编写。提供继承信息的我们称之为父类,也叫超类或基类;得到继承信息的我们称之为子类,也叫派生类或衍生类。子类除了继承父类提供的属性和方法,还可以定义自己特有的属性和方法,所以子类比父类拥有的更多的能力,在实际开发中,我们经常会用子类对象去替换掉一个父类对象,这是面向对象编程中一个常见的行为,对应的原则称之为[里氏替换原则](https://zh.wikipedia.org/wiki/%E9%87%8C%E6%B0%8F%E6%9B%BF%E6%8D%A2%E5%8E%9F%E5%88%99)。下面我们先看一个继承的例子。
-
-```Python
-class Person(object):
- """人"""
-
- def __init__(self, name, age):
- self._name = name
- self._age = age
-
- @property
- def name(self):
- return self._name
-
- @property
- def age(self):
- return self._age
-
- @age.setter
- def age(self, age):
- self._age = age
-
- def play(self):
- print('%s正在愉快的玩耍.' % self._name)
-
- def watch_av(self):
- if self._age >= 18:
- print('%s正在观看爱情动作片.' % self._name)
- else:
- print('%s只能观看《熊出没》.' % self._name)
-
-
-class Student(Person):
- """学生"""
-
- def __init__(self, name, age, grade):
- super().__init__(name, age)
- self._grade = grade
-
- @property
- def grade(self):
- return self._grade
-
- @grade.setter
- def grade(self, grade):
- self._grade = grade
-
- def study(self, course):
- print('%s的%s正在学习%s.' % (self._grade, self._name, course))
-
-
-class Teacher(Person):
- """老师"""
-
- def __init__(self, name, age, title):
- super().__init__(name, age)
- self._title = title
-
- @property
- def title(self):
- return self._title
-
- @title.setter
- def title(self, title):
- self._title = title
-
- def teach(self, course):
- print('%s%s正在讲%s.' % (self._name, self._title, course))
-
-
-def main():
- stu = Student('王大锤', 15, '初三')
- stu.study('数学')
- stu.watch_av()
- t = Teacher('骆昊', 38, '老叫兽')
- t.teach('Python程序设计')
- t.watch_av()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-子类在继承了父类的方法后,可以对父类已有的方法给出新的实现版本,这个动作称之为方法重写(override)。通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本,当我们调用这个经过子类重写的方法时,不同的子类对象会表现出不同的行为,这个就是多态(poly-morphism)。
-
-```Python
-from abc import ABCMeta, abstractmethod
-
-
-class Pet(object, metaclass=ABCMeta):
- """宠物"""
-
- def __init__(self, nickname):
- self._nickname = nickname
-
- @abstractmethod
- def make_voice(self):
- """发出声音"""
- pass
-
-
-class Dog(Pet):
- """狗"""
-
- def make_voice(self):
- print('%s: 汪汪汪...' % self._nickname)
-
-
-class Cat(Pet):
- """猫"""
-
- def make_voice(self):
- print('%s: 喵...喵...' % self._nickname)
-
-
-def main():
- pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
- for pet in pets:
- pet.make_voice()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-在上面的代码中,我们将`Pet`类处理成了一个抽象类,所谓抽象类就是不能够创建对象的类,这种类的存在就是专门为了让其他类去继承它。Python从语法层面并没有像Java或C#那样提供对抽象类的支持,但是我们可以通过`abc`模块的`ABCMeta`元类和`abstractmethod`包装器来达到抽象类的效果,如果一个类中存在抽象方法那么这个类就不能够实例化(创建对象)。上面的代码中,`Dog`和`Cat`两个子类分别对`Pet`类中的`make_voice`抽象方法进行了重写并给出了不同的实现版本,当我们在`main`函数中调用该方法时,这个方法就表现出了多态行为(同样的方法做了不同的事情)。
-
-### 综合案例
-
-#### 案例1:奥特曼打小怪兽
-
-```Python
-from abc import ABCMeta, abstractmethod
-from random import randint, randrange
-
-
-class Fighter(object, metaclass=ABCMeta):
- """战斗者"""
-
- # 通过__slots__魔法限定对象可以绑定的成员变量
- __slots__ = ('_name', '_hp')
-
- def __init__(self, name, hp):
- """
- 初始化方法
-
- :param name: 名字
- :param hp: 生命值
- """
- self._name = name
- self._hp = hp
-
- @property
- def name(self):
- return self._name
-
- @property
- def hp(self):
- return self._hp
-
- @hp.setter
- def hp(self, hp):
- self._hp = hp if hp >= 0 else 0
-
- @property
- def alive(self):
- return self._hp > 0
-
- @abstractmethod
- def attack(self, other):
- """
- 攻击
-
- :param other: 被攻击的对象
- """
- pass
-
-
-class Ultraman(Fighter):
- """奥特曼"""
-
- __slots__ = ('_name', '_hp', '_mp')
-
- def __init__(self, name, hp, mp):
- """
- 初始化方法
-
- :param name: 名字
- :param hp: 生命值
- :param mp: 魔法值
- """
- super().__init__(name, hp)
- self._mp = mp
-
- def attack(self, other):
- other.hp -= randint(15, 25)
-
- def huge_attack(self, other):
- """
- 究极必杀技(打掉对方至少50点或四分之三的血)
-
- :param other: 被攻击的对象
-
- :return: 使用成功返回True否则返回False
- """
- if self._mp >= 50:
- self._mp -= 50
- injury = other.hp * 3 // 4
- injury = injury if injury >= 50 else 50
- other.hp -= injury
- return True
- else:
- self.attack(other)
- return False
-
- def magic_attack(self, others):
- """
- 魔法攻击
-
- :param others: 被攻击的群体
-
- :return: 使用魔法成功返回True否则返回False
- """
- if self._mp >= 20:
- self._mp -= 20
- for temp in others:
- if temp.alive:
- temp.hp -= randint(10, 15)
- return True
- else:
- return False
-
- def resume(self):
- """恢复魔法值"""
- incr_point = randint(1, 10)
- self._mp += incr_point
- return incr_point
-
- def __str__(self):
- return '~~~%s奥特曼~~~\n' % self._name + \
- '生命值: %d\n' % self._hp + \
- '魔法值: %d\n' % self._mp
-
-
-class Monster(Fighter):
- """小怪兽"""
-
- __slots__ = ('_name', '_hp')
-
- def attack(self, other):
- other.hp -= randint(10, 20)
-
- def __str__(self):
- return '~~~%s小怪兽~~~\n' % self._name + \
- '生命值: %d\n' % self._hp
-
-
-def is_any_alive(monsters):
- """判断有没有小怪兽是活着的"""
- for monster in monsters:
- if monster.alive > 0:
- return True
- return False
-
-
-def select_alive_one(monsters):
- """选中一只活着的小怪兽"""
- monsters_len = len(monsters)
- while True:
- index = randrange(monsters_len)
- monster = monsters[index]
- if monster.alive > 0:
- return monster
-
-
-def display_info(ultraman, monsters):
- """显示奥特曼和小怪兽的信息"""
- print(ultraman)
- for monster in monsters:
- print(monster, end='')
-
-
-def main():
- u = Ultraman('骆昊', 1000, 120)
- m1 = Monster('舒小玲', 250)
- m2 = Monster('白元芳', 500)
- m3 = Monster('王大锤', 750)
- ms = [m1, m2, m3]
- fight_round = 1
- while u.alive and is_any_alive(ms):
- print('========第%02d回合========' % fight_round)
- m = select_alive_one(ms) # 选中一只小怪兽
- skill = randint(1, 10) # 通过随机数选择使用哪种技能
- if skill <= 6: # 60%的概率使用普通攻击
- print('%s使用普通攻击打了%s.' % (u.name, m.name))
- u.attack(m)
- print('%s的魔法值恢复了%d点.' % (u.name, u.resume()))
- elif skill <= 9: # 30%的概率使用魔法攻击(可能因魔法值不足而失败)
- if u.magic_attack(ms):
- print('%s使用了魔法攻击.' % u.name)
- else:
- print('%s使用魔法失败.' % u.name)
- else: # 10%的概率使用究极必杀技(如果魔法值不足则使用普通攻击)
- if u.huge_attack(m):
- print('%s使用究极必杀技虐了%s.' % (u.name, m.name))
- else:
- print('%s使用普通攻击打了%s.' % (u.name, m.name))
- print('%s的魔法值恢复了%d点.' % (u.name, u.resume()))
- if m.alive > 0: # 如果选中的小怪兽没有死就回击奥特曼
- print('%s回击了%s.' % (m.name, u.name))
- m.attack(u)
- display_info(u, ms) # 每个回合结束后显示奥特曼和小怪兽的信息
- fight_round += 1
- print('\n========战斗结束!========\n')
- if u.alive > 0:
- print('%s奥特曼胜利!' % u.name)
- else:
- print('小怪兽胜利!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 案例2:扑克游戏
-
-```Python
-from random import randrange
-
-
-class Card(object):
- """一张牌"""
-
- def __init__(self, suite, face):
- self._suite = suite
- self._face = face
-
- @property
- def face(self):
- return self._face
-
- @property
- def suite(self):
- return self._suite
-
- def __str__(self):
- all_suites = ('♠', '♥', '♣', '♦')
- if self._face == 1:
- face_str = 'A'
- elif self._face == 11:
- face_str = 'J'
- elif self._face == 12:
- face_str = 'Q'
- elif self._face == 13:
- face_str = 'K'
- else:
- face_str = str(self._face)
- return '%s%s' % (all_suites[self._suite], face_str)
-
-
-class Poker(object):
- """一副牌"""
-
- def __init__(self):
- self._cards = []
- self._current = 0
- for suite in range(4):
- for face in range(1, 14):
- card = Card(suite, face)
- self._cards.append(card)
-
- @property
- def cards(self):
- return self._cards
-
- def shuffle(self):
- """洗牌(随机乱序)"""
- self._current = 0
- cards_len = len(self._cards)
- for index in range(cards_len):
- pos = randrange(cards_len)
- self._cards[index], self._cards[pos] = \
- self._cards[pos], self._cards[index]
-
- @property
- def next(self):
- """发牌"""
- card = self._cards[self._current]
- self._current += 1
- return card
-
- @property
- def has_next(self):
- """还有没有牌"""
- return self._current < len(self._cards)
-
-
-class Player(object):
- """玩家"""
-
- def __init__(self, name):
- self._name = name
- self._cards_on_hand = []
-
- @property
- def name(self):
- return self._name
-
- @property
- def cards_on_hand(self):
- return self._cards_on_hand
-
- def get(self, card):
- """摸牌"""
- self._cards_on_hand.append(card)
-
- def arrange(self, card_key):
- """玩家整理手上的牌"""
- self._cards_on_hand.sort(key=card_key)
-
-
-# 排序规则-先根据花色再根据点数排序
-def get_key(card):
- return (card.suite, card.face)
-
-
-def main():
- p = Poker()
- p.shuffle()
- players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
- for _ in range(13):
- for player in players:
- player.get(p.next)
- for player in players:
- print(player.name + ':', end=' ')
- player.arrange(get_key)
- for card in player.cards_on_hand:
- print(card, end=' ')
- print()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
->**说明**:大家可以自己尝试在上面代码的基础上写一个简单的扑克游戏,例如21点(Black Jack),游戏的规则可以自己在网上找一找。
-
-#### 案例3:工资结算系统
-
-```Python
-"""
-
-某公司有三种类型的员工 分别是部门经理、程序员和销售员
-需要设计一个工资结算系统 根据提供的员工信息来计算月薪
-部门经理的月薪是每月固定15000元
-程序员的月薪按本月工作时间计算 每小时150元
-销售员的月薪是1200元的底薪加上销售额5%的提成
-
-"""
-from abc import ABCMeta, abstractmethod
-
-
-class Employee(object, metaclass=ABCMeta):
- """员工"""
-
- def __init__(self, name):
- """
- 初始化方法
-
- :param name: 姓名
- """
- self._name = name
-
- @property
- def name(self):
- return self._name
-
- @abstractmethod
- def get_salary(self):
- """
- 获得月薪
-
- :return: 月薪
- """
- pass
-
-
-class Manager(Employee):
- """部门经理"""
-
- def get_salary(self):
- return 15000.0
-
-
-class Programmer(Employee):
- """程序员"""
-
- def __init__(self, name, working_hour=0):
- super().__init__(name)
- self._working_hour = working_hour
-
- @property
- def working_hour(self):
- return self._working_hour
-
- @working_hour.setter
- def working_hour(self, working_hour):
- self._working_hour = working_hour if working_hour > 0 else 0
-
- def get_salary(self):
- return 150.0 * self._working_hour
-
-
-class Salesman(Employee):
- """销售员"""
-
- def __init__(self, name, sales=0):
- super().__init__(name)
- self._sales = sales
-
- @property
- def sales(self):
- return self._sales
-
- @sales.setter
- def sales(self, sales):
- self._sales = sales if sales > 0 else 0
-
- def get_salary(self):
- return 1200.0 + self._sales * 0.05
-
-
-def main():
- emps = [
- Manager('刘备'), Programmer('诸葛亮'),
- Manager('曹操'), Salesman('荀彧'),
- Salesman('吕布'), Programmer('张辽'),
- Programmer('赵云')
- ]
- for emp in emps:
- if isinstance(emp, Programmer):
- emp.working_hour = int(input('请输入%s本月工作时间: ' % emp.name))
- elif isinstance(emp, Salesman):
- emp.sales = float(input('请输入%s本月销售额: ' % emp.name))
- # 同样是接收get_salary这个消息但是不同的员工表现出了不同的行为(多态)
- print('%s本月工资为: ¥%s元' %
- (emp.name, emp.get_salary()))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
diff --git a/Day01-15/Day10/ball.py b/Day01-15/Day10/ball.py
deleted file mode 100644
index 3d5369561..000000000
--- a/Day01-15/Day10/ball.py
+++ /dev/null
@@ -1,109 +0,0 @@
-from enum import Enum, unique
-from math import sqrt
-from random import randint
-
-import pygame
-
-
-@unique
-class Color(Enum):
- """颜色"""
-
- RED = (255, 0, 0)
- GREEN = (0, 255, 0)
- BLUE = (0, 0, 255)
- BLACK = (0, 0, 0)
- WHITE = (255, 255, 255)
- GRAY = (242, 242, 242)
-
- @staticmethod
- def random_color():
- """获得随机颜色"""
- r = randint(0, 255)
- g = randint(0, 255)
- b = randint(0, 255)
- return (r, g, b)
-
-
-class Ball(object):
- """球"""
-
- def __init__(self, x, y, radius, sx, sy, color=Color.RED):
- """初始化方法"""
- self.x = x
- self.y = y
- self.radius = radius
- self.sx = sx
- self.sy = sy
- self.color = color
- self.alive = True
-
- def move(self, screen):
- """移动"""
- self.x += self.sx
- self.y += self.sy
- if self.x - self.radius <= 0 or self.x + self.radius >= screen.get_width():
- self.sx = -self.sx
- if self.y - self.radius <= 0 or self.y + self.radius >= screen.get_height():
- self.sy = -self.sy
-
- def eat(self, other):
- """吃其他球"""
- if self.alive and other.alive and self != other:
- dx, dy = self.x - other.x, self.y - other.y
- distance = sqrt(dx ** 2 + dy ** 2)
- if distance < self.radius + other.radius \
- and self.radius > other.radius:
- other.alive = False
- self.radius = self.radius + int(other.radius * 0.146)
-
- def draw(self, screen):
- """在窗口上绘制球"""
- pygame.draw.circle(screen, self.color,
- (self.x, self.y), self.radius, 0)
-
-
-def main():
- # 定义用来装所有球的容器
- balls = []
- # 初始化导入的pygame中的模块
- pygame.init()
- # 初始化用于显示的窗口并设置窗口尺寸
- screen = pygame.display.set_mode((800, 600))
- print(screen.get_width())
- print(screen.get_height())
- # 设置当前窗口的标题
- pygame.display.set_caption('大球吃小球')
- # 定义变量来表示小球在屏幕上的位置
- x, y = 50, 50
- running = True
- # 开启一个事件循环处理发生的事件
- while running:
- # 从消息队列中获取事件并对事件进行处理
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
- x, y = event.pos
- radius = randint(10, 100)
- sx, sy = randint(-10, 10), randint(-10, 10)
- color = Color.random_color()
- ball = Ball(x, y, radius, sx, sy, color)
- balls.append(ball)
- screen.fill((255, 255, 255))
- for ball in balls:
- if ball.alive:
- ball.draw(screen)
- else:
- balls.remove(ball)
- pygame.display.flip()
- # 每隔50毫秒就改变小球的位置再刷新窗口
- pygame.time.delay(50)
- for ball in balls:
- ball.move(screen)
- for other in balls:
- ball.eat(other)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day10/gui1.py b/Day01-15/Day10/gui1.py
deleted file mode 100644
index 6eb747bd8..000000000
--- a/Day01-15/Day10/gui1.py
+++ /dev/null
@@ -1,57 +0,0 @@
-"""
-
-使用tkinter创建GUI
- - 顶层窗口
- - 控件
- - 布局
- - 事件回调
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-14
-
-"""
-
-import tkinter
-import tkinter.messagebox
-
-
-def main():
- flag = True
-
- # 修改标签上的文字
- def change_label_text():
- nonlocal flag
- flag = not flag
- color, msg = ('red', 'Hello, world!')\
- if flag else ('blue', 'Goodbye, world!')
- label.config(text=msg, fg=color)
-
- # 确认退出
- def confirm_to_quit():
- if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
- top.quit()
-
- # 创建顶层窗口
- top = tkinter.Tk()
- # 设置窗口大小
- top.geometry('240x160')
- # 设置窗口标题
- top.title('小游戏')
- # 创建标签对象
- label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
- label.pack(expand=1)
- # 创建一个装按钮的容器
- panel = tkinter.Frame(top)
- # 创建按钮对象
- button1 = tkinter.Button(panel, text='修改', command=change_label_text)
- button1.pack(side='left')
- button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
- button2.pack(side='right')
- panel.pack(side='bottom')
- # 开启主事件循环
- tkinter.mainloop()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day10/gui2.py b/Day01-15/Day10/gui2.py
deleted file mode 100644
index 69c81d0da..000000000
--- a/Day01-15/Day10/gui2.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-
-使用tkinter创建GUI
- - 使用画布绘图
- - 处理鼠标事件
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-14
-
-"""
-
-import tkinter
-
-
-def mouse_evt_handler(evt=None):
- row = round((evt.y - 20) / 40)
- col = round((evt.x - 20) / 40)
- pos_x = 40 * col
- pos_y = 40 * row
- canvas.create_oval(pos_x, pos_y, 40 + pos_x, 40 + pos_y, fill='black')
-
-
-top = tkinter.Tk()
-# 设置窗口尺寸
-top.geometry('620x620')
-# 设置窗口标题
-top.title('五子棋')
-# 设置窗口大小不可改变
-top.resizable(False, False)
-# 设置窗口置顶
-top.wm_attributes('-topmost', 1)
-canvas = tkinter.Canvas(top, width=600, height=600, bd=0, highlightthickness=0)
-canvas.bind('', mouse_evt_handler)
-canvas.create_rectangle(0, 0, 600, 600, fill='yellow', outline='white')
-for index in range(15):
- canvas.create_line(20, 20 + 40 * index, 580, 20 + 40 * index, fill='black')
- canvas.create_line(20 + 40 * index, 20, 20 + 40 * index, 580, fill='black')
-canvas.create_rectangle(15, 15, 585, 585, outline='black', width=4)
-canvas.pack()
-tkinter.mainloop()
-
-# 请思考如何用面向对象的编程思想对上面的代码进行封装
diff --git a/Day01-15/Day10/gui3.py b/Day01-15/Day10/gui3.py
deleted file mode 100644
index 1cda3bff5..000000000
--- a/Day01-15/Day10/gui3.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""
-
-使用tkinter创建GUI
- - 在窗口上制作动画
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-14
-
-"""
-
-import tkinter
-import time
-
-
-# 播放动画效果的函数
-def play_animation():
- canvas.move(oval, 2, 2)
- canvas.update()
- top.after(50, play_animation)
-
-
-x = 10
-y = 10
-top = tkinter.Tk()
-top.geometry('600x600')
-top.title('动画效果')
-top.resizable(False, False)
-top.wm_attributes('-topmost', 1)
-canvas = tkinter.Canvas(top, width=600, height=600, bd=0, highlightthickness=0)
-canvas.create_rectangle(0, 0, 600, 600, fill='gray')
-oval = canvas.create_oval(10, 10, 60, 60, fill='red')
-canvas.pack()
-top.update()
-play_animation()
-tkinter.mainloop()
-
-# 请思考如何让小球碰到屏幕的边界就弹回
-# 请思考如何用面向对象的编程思想对上面的代码进行封装
diff --git a/Day01-15/Day10/res/ball-game.png b/Day01-15/Day10/res/ball-game.png
deleted file mode 100644
index 37b9f890d..000000000
Binary files a/Day01-15/Day10/res/ball-game.png and /dev/null differ
diff --git a/Day01-15/Day10/res/ball.png b/Day01-15/Day10/res/ball.png
deleted file mode 100644
index 0a63bdcb4..000000000
Binary files a/Day01-15/Day10/res/ball.png and /dev/null differ
diff --git a/Day01-15/Day10/turtle1.py b/Day01-15/Day10/turtle1.py
deleted file mode 100644
index fe0c4f721..000000000
--- a/Day01-15/Day10/turtle1.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""
-
-用turtle模块绘图
-这是一个非常有趣的模块 它模拟一只乌龟在窗口上爬行的方式来进行绘图
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-14
-
-"""
-
-import turtle
-
-turtle.pensize(3)
-turtle.penup()
-turtle.goto(-180, 150)
-turtle.pencolor('red')
-turtle.fillcolor('yellow')
-turtle.pendown()
-turtle.begin_fill()
-for _ in range(36):
- turtle.forward(200)
- turtle.right(170)
-turtle.end_fill()
-turtle.mainloop()
diff --git "a/Day01-15/Day10/\345\233\276\345\275\242\347\224\250\346\210\267\347\225\214\351\235\242\345\222\214\346\270\270\346\210\217\345\274\200\345\217\221.md" "b/Day01-15/Day10/\345\233\276\345\275\242\347\224\250\346\210\267\347\225\214\351\235\242\345\222\214\346\270\270\346\210\217\345\274\200\345\217\221.md"
deleted file mode 100644
index 729753331..000000000
--- "a/Day01-15/Day10/\345\233\276\345\275\242\347\224\250\346\210\267\347\225\214\351\235\242\345\222\214\346\270\270\346\210\217\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,338 +0,0 @@
-## 图形用户界面和游戏开发
-
-### 基于tkinter模块的GUI
-
-GUI是图形用户界面的缩写,图形化的用户界面对使用过计算机的人来说应该都不陌生,在此也无需进行赘述。Python默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter),从这个名字就可以看出它是基于Tk的,Tk是一个工具包,最初是为Tcl设计的,后来被移植到很多其他的脚本语言中,它提供了跨平台的GUI控件。当然Tk并不是最新和最好的选择,也没有功能特别强大的GUI控件,事实上,开发GUI应用并不是Python最擅长的工作,如果真的需要使用Python开发GUI应用,wxPython、PyQt、PyGTK等模块都是不错的选择。
-
-基本上使用tkinter来开发GUI应用需要以下5个步骤:
-
-1. 导入tkinter模块中我们需要的东西。
-2. 创建一个顶层窗口对象并用它来承载整个GUI应用。
-3. 在顶层窗口对象上添加GUI组件。
-4. 通过代码将这些GUI组件的功能组织起来。
-5. 进入主事件循环(main loop)。
-
-下面的代码演示了如何使用tkinter做一个简单的GUI应用。
-
-```Python
-import tkinter
-import tkinter.messagebox
-
-
-def main():
- flag = True
-
- # 修改标签上的文字
- def change_label_text():
- nonlocal flag
- flag = not flag
- color, msg = ('red', 'Hello, world!')\
- if flag else ('blue', 'Goodbye, world!')
- label.config(text=msg, fg=color)
-
- # 确认退出
- def confirm_to_quit():
- if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
- top.quit()
-
- # 创建顶层窗口
- top = tkinter.Tk()
- # 设置窗口大小
- top.geometry('240x160')
- # 设置窗口标题
- top.title('小游戏')
- # 创建标签对象并添加到顶层窗口
- label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
- label.pack(expand=1)
- # 创建一个装按钮的容器
- panel = tkinter.Frame(top)
- # 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
- button1 = tkinter.Button(panel, text='修改', command=change_label_text)
- button1.pack(side='left')
- button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
- button2.pack(side='right')
- panel.pack(side='bottom')
- # 开启主事件循环
- tkinter.mainloop()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-需要说明的是,GUI应用通常是事件驱动式的,之所以要进入主事件循环就是要监听鼠标、键盘等各种事件的发生并执行对应的代码对事件进行处理,因为事件会持续的发生,所以需要这样的一个循环一直运行着等待下一个事件的发生。另一方面,Tk为控件的摆放提供了三种布局管理器,通过布局管理器可以对控件进行定位,这三种布局管理器分别是:Placer(开发者提供控件的大小和摆放位置)、Packer(自动将控件填充到合适的位置)和Grid(基于网格坐标来摆放控件),此处不进行赘述。
-
-### 使用Pygame进行游戏开发
-
-Pygame是一个开源的Python模块,专门用于多媒体应用(如电子游戏)的开发,其中包含对图像、声音、视频、事件、碰撞等的支持。Pygame建立在[SDL](https://zh.wikipedia.org/wiki/SDL)的基础上,SDL是一套跨平台的多媒体开发库,用C语言实现,被广泛的应用于游戏、模拟器、播放器等的开发。而Pygame让游戏开发者不再被底层语言束缚,可以更多的关注游戏的功能和逻辑。
-
-下面我们来完成一个简单的小游戏,游戏的名字叫“大球吃小球”,当然完成这个游戏并不是重点,学会使用Pygame也不是重点,最重要的我们要在这个过程中体会如何使用前面讲解的面向对象程序设计,学会用这种编程思想去解决现实中的问题。
-
-#### 制作游戏窗口
-
-```Python
-import pygame
-
-
-def main():
- # 初始化导入的pygame中的模块
- pygame.init()
- # 初始化用于显示的窗口并设置窗口尺寸
- screen = pygame.display.set_mode((800, 600))
- # 设置当前窗口的标题
- pygame.display.set_caption('大球吃小球')
- running = True
- # 开启一个事件循环处理发生的事件
- while running:
- # 从消息队列中获取事件并对事件进行处理
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 在窗口中绘图
-
-可以通过pygame中draw模块的函数在窗口上绘图,可以绘制的图形包括:线条、矩形、多边形、圆、椭圆、圆弧等。需要说明的是,屏幕坐标系是将屏幕左上角设置为坐标原点`(0, 0)`,向右是x轴的正向,向下是y轴的正向,在表示位置或者设置尺寸的时候,我们默认的单位都是[像素](https://zh.wikipedia.org/wiki/%E5%83%8F%E7%B4%A0)。所谓像素就是屏幕上的一个点,你可以用浏览图片的软件试着将一张图片放大若干倍,就可以看到这些点。pygame中表示颜色用的是色光[三原色](https://zh.wikipedia.org/wiki/%E5%8E%9F%E8%89%B2)表示法,即通过一个元组或列表来指定颜色的RGB值,每个值都在0~255之间,因为是每种原色都用一个8位(bit)的值来表示,三种颜色相当于一共由24位构成,这也就是常说的“24位颜色表示法”。
-
-```Python
-import pygame
-
-
-def main():
- # 初始化导入的pygame中的模块
- pygame.init()
- # 初始化用于显示的窗口并设置窗口尺寸
- screen = pygame.display.set_mode((800, 600))
- # 设置当前窗口的标题
- pygame.display.set_caption('大球吃小球')
- # 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
- screen.fill((242, 242, 242))
- # 绘制一个圆(参数分别是: 屏幕, 颜色, 圆心位置, 半径, 0表示填充圆)
- pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
- # 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
- pygame.display.flip()
- running = True
- # 开启一个事件循环处理发生的事件
- while running:
- # 从消息队列中获取事件并对事件进行处理
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-####加载图像
-
-如果需要直接加载图像到窗口上,可以使用pygame中image模块的函数来加载图像,再通过之前获得的窗口对象的`blit`方法渲染图像,代码如下所示。
-
-```Python
-import pygame
-
-
-def main():
- # 初始化导入的pygame中的模块
- pygame.init()
- # 初始化用于显示的窗口并设置窗口尺寸
- screen = pygame.display.set_mode((800, 600))
- # 设置当前窗口的标题
- pygame.display.set_caption('大球吃小球')
- # 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
- screen.fill((255, 255, 255))
- # 通过指定的文件名加载图像
- ball_image = pygame.image.load('./res/ball.png')
- # 在窗口上渲染图像
- screen.blit(ball_image, (50, 50))
- # 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
- pygame.display.flip()
- running = True
- # 开启一个事件循环处理发生的事件
- while running:
- # 从消息队列中获取事件并对事件进行处理
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-####实现动画效果
-
-说到[动画](https://zh.wikipedia.org/wiki/%E5%8A%A8%E7%94%BB)这个词大家都不会陌生,事实上要实现动画效果,本身的原理也非常简单,就是将不连续的图片连续的播放,只要每秒钟达到了一定的帧数,那么就可以做出比较流畅的动画效果。如果要让上面代码中的小球动起来,可以将小球的位置用变量来表示,并在循环中修改小球的位置再刷新整个窗口即可。
-
-```Python
-import pygame
-
-
-def main():
- # 初始化导入的pygame中的模块
- pygame.init()
- # 初始化用于显示的窗口并设置窗口尺寸
- screen = pygame.display.set_mode((800, 600))
- # 设置当前窗口的标题
- pygame.display.set_caption('大球吃小球')
- # 定义变量来表示小球在屏幕上的位置
- x, y = 50, 50
- running = True
- # 开启一个事件循环处理发生的事件
- while running:
- # 从消息队列中获取事件并对事件进行处理
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- screen.fill((255, 255, 255))
- pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)
- pygame.display.flip()
- # 每隔50毫秒就改变小球的位置再刷新窗口
- pygame.time.delay(50)
- x, y = x + 5, y + 5
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 碰撞检测
-
-通常一个游戏中会有很多对象出现,而这些对象之间的“碰撞”在所难免,比如炮弹击中了飞机、箱子撞到了地面等。碰撞检测在绝大多数的游戏中都是一个必须得处理的至关重要的问题,pygame的sprite(动画精灵)模块就提供了对碰撞检测的支持,这里我们暂时不介绍sprite模块提供的功能,因为要检测两个小球有没有碰撞其实非常简单,只需要检查球心的距离有没有小于两个球的半径之和。为了制造出更多的小球,我们可以通过对鼠标事件的处理,在点击鼠标的位置创建颜色、大小和移动速度都随机的小球,当然要做到这一点,我们可以把之前学习到的面向对象的知识应用起来。
-
-```Python
-from enum import Enum, unique
-from math import sqrt
-from random import randint
-
-import pygame
-
-
-@unique
-class Color(Enum):
- """颜色"""
-
- RED = (255, 0, 0)
- GREEN = (0, 255, 0)
- BLUE = (0, 0, 255)
- BLACK = (0, 0, 0)
- WHITE = (255, 255, 255)
- GRAY = (242, 242, 242)
-
- @staticmethod
- def random_color():
- """获得随机颜色"""
- r = randint(0, 255)
- g = randint(0, 255)
- b = randint(0, 255)
- return (r, g, b)
-
-
-class Ball(object):
- """球"""
-
- def __init__(self, x, y, radius, sx, sy, color=Color.RED):
- """初始化方法"""
- self.x = x
- self.y = y
- self.radius = radius
- self.sx = sx
- self.sy = sy
- self.color = color
- self.alive = True
-
- def move(self, screen):
- """移动"""
- self.x += self.sx
- self.y += self.sy
- if self.x - self.radius <= 0 or \
- self.x + self.radius >= screen.get_width():
- self.sx = -self.sx
- if self.y - self.radius <= 0 or \
- self.y + self.radius >= screen.get_height():
- self.sy = -self.sy
-
- def eat(self, other):
- """吃其他球"""
- if self.alive and other.alive and self != other:
- dx, dy = self.x - other.x, self.y - other.y
- distance = sqrt(dx ** 2 + dy ** 2)
- if distance < self.radius + other.radius \
- and self.radius > other.radius:
- other.alive = False
- a self.radius = self.radius + int(other.radius * 0.146)
-
- def draw(self, screen):
- """在窗口上绘制球"""
- pygame.draw.circle(screen, self.color,
- (self.x, self.y), self.radius, 0)
-
-```
-
-#### 事件处理
-
-可以在事件循环中对鼠标事件进行处理,通过事件对象的`type`属性可以判定事件类型,再通过`pos`属性就可以获得鼠标点击的位置。如果要处理键盘事件也是在这个地方,做法与处理鼠标事件类似。
-
-```Python
-def main():
- # 定义用来装所有球的容器
- balls = []
- # 初始化导入的pygame中的模块
- pygame.init()
- # 初始化用于显示的窗口并设置窗口尺寸
- screen = pygame.display.set_mode((800, 600))
- # 设置当前窗口的标题
- pygame.display.set_caption('大球吃小球')
- running = True
- # 开启一个事件循环处理发生的事件
- while running:
- # 从消息队列中获取事件并对事件进行处理
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- # 处理鼠标事件的代码
- if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
- # 获得点击鼠标的位置
- x, y = event.pos
- radius = randint(10, 100)
- sx, sy = randint(-10, 10), randint(-10, 10)
- color = Color.random_color()
- # 在点击鼠标的位置创建一个球(大小、速度和颜色随机)
- ball = Ball(x, y, radius, sx, sy, color)
- # 将球添加到列表容器中
- balls.append(ball)
- screen.fill((255, 255, 255))
- # 取出容器中的球 如果没被吃掉就绘制 被吃掉了就移除
- for ball in balls:
- if ball.alive:
- ball.draw(screen)
- else:
- balls.remove(ball)
- pygame.display.flip()
- # 每隔50毫秒就改变球的位置再刷新窗口
- pygame.time.delay(50)
- for ball in balls:
- ball.move(screen)
- # 检查球有没有吃到其他的球
- for other in balls:
- ball.eat(other)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-上面的两段代码合在一起,我们就完成了“大球吃小球”的游戏(如下图所示),准确的说它算不上一个游戏,但是做一个小游戏的基本知识我们已经通过这个例子告诉大家了,有了这些知识已经可以开始你的小游戏开发之旅了。其实上面的代码中还有很多值得改进的地方,比如刷新窗口以及让球移动起来的代码并不应该放在事件循环中,等学习了多线程的知识后,用一个后台线程来处理这些事可能是更好的选择。如果希望获得更好的用户体验,我们还可以在游戏中加入背景音乐以及在球与球发生碰撞时播放音效,利用pygame的mixer和music模块,我们可以很容易的做到这一点,大家可以自行了解这方面的知识。事实上,想了解更多的关于pygame的知识,最好的教程是[pygame的官方网站](https://www.pygame.org/news),如果英语没毛病就可以赶紧去看看啦。 如果想开发[3D游戏](https://zh.wikipedia.org/wiki/3D%E6%B8%B8%E6%88%8F),pygame就显得力不从心了,对3D游戏开发如果有兴趣的读者不妨看看[Panda3D](https://www.panda3d.org/)。
-
-
-
diff --git a/Day01-15/Day11/.py b/Day01-15/Day11/.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/Day01-15/Day11/csv1.py b/Day01-15/Day11/csv1.py
deleted file mode 100644
index 585e42477..000000000
--- a/Day01-15/Day11/csv1.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-
-读取CSV文件
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import csv
-
-filename = 'example.csv'
-
-try:
- with open(filename) as f:
- reader = csv.reader(f)
- data = list(reader)
-except FileNotFoundError:
- print('无法打开文件:', filename)
-else:
- for item in data:
- print('%-30s%-20s%-10s' % (item[0], item[1], item[2]))
diff --git a/Day01-15/Day11/csv2.py b/Day01-15/Day11/csv2.py
deleted file mode 100644
index 7a5a55568..000000000
--- a/Day01-15/Day11/csv2.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-
-写入CSV文件
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import csv
-
-
-class Teacher(object):
-
- def __init__(self, name, age, title):
- self.__name = name
- self.__age = age
- self.__title = title
- self.__index = -1
-
- @property
- def name(self):
- return self.__name
-
- @property
- def age(self):
- return self.__age
-
- @property
- def title(self):
- return self.__title
-
-
-filename = 'teacher.csv'
-teachers = [Teacher('骆昊', 38, '叫兽'), Teacher('狄仁杰', 25, '砖家')]
-
-try:
- with open(filename, 'w') as f:
- writer = csv.writer(f)
- for teacher in teachers:
- writer.writerow([teacher.name, teacher.age, teacher.title])
-except BaseException as e:
- print('无法写入文件:', filename)
-else:
- print('保存数据完成!')
diff --git a/Day01-15/Day11/ex1.py b/Day01-15/Day11/ex1.py
deleted file mode 100644
index 71c1cb58e..000000000
--- a/Day01-15/Day11/ex1.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-
-异常机制 - 处理程序在运行时可能发生的状态
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-input_again = True
-while input_again:
- try:
- a = int(input('a = '))
- b = int(input('b = '))
- print('%d / %d = %f' % (a, b, a / b))
- input_again = False
- except ValueError:
- print('请输入整数')
- except ZeroDivisionError:
- print('除数不能为0')
-# 处理异常让代码不因异常而崩溃是一方面
-# 更重要的是可以通过对异常的处理让代码从异常中恢复过来
diff --git a/Day01-15/Day11/ex2.py b/Day01-15/Day11/ex2.py
deleted file mode 100644
index 6f1e9841d..000000000
--- a/Day01-15/Day11/ex2.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-异常机制 - 处理程序在运行时可能发生的状态
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-input_again = True
-while input_again:
- try:
- a = int(input('a = '))
- b = int(input('b = '))
- print('%d / %d = %f' % (a, b, a / b))
- input_again = False
- except (ValueError, ZeroDivisionError) as msg:
- print(msg)
diff --git a/Day01-15/Day11/ex3.py b/Day01-15/Day11/ex3.py
deleted file mode 100644
index 34b3f609b..000000000
--- a/Day01-15/Day11/ex3.py
+++ /dev/null
@@ -1,30 +0,0 @@
-"""
-
-异常机制 - 处理程序在运行时可能发生的状态
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import time
-import sys
-
-filename = input('请输入文件名: ')
-try:
- with open(filename) as f:
- lines = f.readlines()
-except FileNotFoundError as msg:
- print('无法打开文件:', filename)
- print(msg)
-except UnicodeDecodeError as msg:
- print('非文本文件无法解码')
- sys.exit()
-else:
- for line in lines:
- print(line.rstrip())
- time.sleep(0.5)
-finally:
- # 此处最适合做善后工作
- print('不管发生什么我都会执行')
diff --git a/Day01-15/Day11/ex4.py b/Day01-15/Day11/ex4.py
deleted file mode 100644
index 532626971..000000000
--- a/Day01-15/Day11/ex4.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""
-
-引发异常和异常栈
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-
-def f1():
- raise AssertionError('发生异常')
-
-
-def f2():
- f1()
-
-
-def f3():
- f2()
-
-
-f3()
diff --git a/Day01-15/Day11/example.csv b/Day01-15/Day11/example.csv
deleted file mode 100755
index 19ed00c97..000000000
--- a/Day01-15/Day11/example.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-4/5/2014 13:34,Apples,73
-4/5/2014 3:41,Cherries,85
-4/6/2014 12:46,Pears,14
-4/8/2014 8:59,Oranges,52
-4/10/2014 2:07,Apples,152
-4/10/2014 18:10,Bananas,23
-4/10/2014 2:40,Strawberries,98
diff --git a/Day01-15/Day11/file1.py b/Day01-15/Day11/file1.py
deleted file mode 100644
index 3e57a6398..000000000
--- a/Day01-15/Day11/file1.py
+++ /dev/null
@@ -1,33 +0,0 @@
-"""
-
-从文本文件中读取数据
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import time
-
-
-def main():
- # 一次性读取整个文件内容
- with open('致橡树.txt', 'r', encoding='utf-8') as f:
- print(f.read())
-
- # 通过for-in循环逐行读取
- with open('致橡树.txt', mode='r') as f:
- for line in f:
- print(line, end='')
- time.sleep(0.5)
- print()
-
- # 读取文件按行读取到列表中
- with open('致橡树.txt') as f:
- lines = f.readlines()
- print(lines)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day11/file2.py b/Day01-15/Day11/file2.py
deleted file mode 100644
index e3a2d0ab1..000000000
--- a/Day01-15/Day11/file2.py
+++ /dev/null
@@ -1,18 +0,0 @@
-"""
-
-读取圆周率文件判断其中是否包含自己的生日
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-birth = input('请输入你的生日: ')
-with open('pi_million_digits.txt') as f:
- lines = f.readlines()
- pi_string = ''
- for line in lines:
- pi_string += line.strip()
- if birth in pi_string:
- print('Bingo!!!')
diff --git a/Day01-15/Day11/file3.py b/Day01-15/Day11/file3.py
deleted file mode 100644
index 0c1cb03d2..000000000
--- a/Day01-15/Day11/file3.py
+++ /dev/null
@@ -1,28 +0,0 @@
-"""
-
-写文本文件
-将100以内的素数写入到文件中
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-from math import sqrt
-
-
-def is_prime(n):
- for factor in range(2, int(sqrt(n)) + 1):
- if n % factor == 0:
- return False
- return True
-
-
-# 试一试有什么不一样
-# with open('prime.txt', 'a') as f:
-with open('prime.txt', 'w') as f:
- for num in range(2, 100):
- if is_prime(num):
- f.write(str(num) + '\n')
-print('写入完成!')
diff --git a/Day01-15/Day11/file4.py b/Day01-15/Day11/file4.py
deleted file mode 100644
index dc7096ca9..000000000
--- a/Day01-15/Day11/file4.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""
-
-读写二进制文件
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import base64
-
-with open('mm.jpg', 'rb') as f:
- data = f.read()
- # print(type(data))
- # print(data)
- print('字节数:', len(data))
- # 将图片处理成BASE-64编码
- print(base64.b64encode(data))
-
-with open('girl.jpg', 'wb') as f:
- f.write(data)
-print('写入完成!')
diff --git a/Day01-15/Day11/json1.py b/Day01-15/Day11/json1.py
deleted file mode 100644
index 6223bc0ed..000000000
--- a/Day01-15/Day11/json1.py
+++ /dev/null
@@ -1,87 +0,0 @@
-"""
-
-读取JSON数据
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import json
-import csv2
-
-json_str = '{"name": "骆昊", "age": 38, "title": "叫兽"}'
-result = json.loads(json_str)
-print(result)
-print(type(result))
-print(result['name'])
-print(result['age'])
-
-# 把转换得到的字典作为关键字参数传入Teacher的构造器
-teacher = csv2.Teacher(**result)
-print(teacher)
-print(teacher.name)
-print(teacher.age)
-print(teacher.title)
-
-# 请思考如何将下面JSON格式的天气数据转换成对象并获取我们需要的信息
-# 稍后我们会讲解如何通过网络API获取我们需要的JSON格式的数据
-"""
- {
- "wendu": "29",
- "ganmao": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。",
- "forecast": [
- {
- "fengxiang": "南风",
- "fengli": "3-4级",
- "high": "高温 32℃",
- "type": "多云",
- "low": "低温 17℃",
- "date": "16日星期二"
- },
- {
- "fengxiang": "南风",
- "fengli": "微风级",
- "high": "高温 34℃",
- "type": "晴",
- "low": "低温 19℃",
- "date": "17日星期三"
- },
- {
- "fengxiang": "南风",
- "fengli": "微风级",
- "high": "高温 35℃",
- "type": "晴",
- "low": "低温 22℃",
- "date": "18日星期四"
- },
- {
- "fengxiang": "南风",
- "fengli": "微风级",
- "high": "高温 35℃",
- "type": "多云",
- "low": "低温 22℃",
- "date": "19日星期五"
- },
- {
- "fengxiang": "南风",
- "fengli": "3-4级",
- "high": "高温 34℃",
- "type": "晴",
- "low": "低温 21℃",
- "date": "20日星期六"
- }
- ],
- "yesterday": {
- "fl": "微风",
- "fx": "南风",
- "high": "高温 28℃",
- "type": "晴",
- "low": "低温 15℃",
- "date": "15日星期一"
- },
- "aqi": "72",
- "city": "北京"
- }
-"""
diff --git a/Day01-15/Day11/json2.py b/Day01-15/Day11/json2.py
deleted file mode 100644
index ddbbcae69..000000000
--- a/Day01-15/Day11/json2.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""
-
-写入JSON文件
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-13
-
-"""
-
-import json
-
-teacher_dict = {'name': '白元芳', 'age': 25, 'title': '讲师'}
-json_str = json.dumps(teacher_dict)
-print(json_str)
-print(type(json_str))
-fruits_list = ['apple', 'orange', 'strawberry', 'banana', 'pitaya']
-json_str = json.dumps(fruits_list)
-print(json_str)
-print(type(json_str))
diff --git a/Day01-15/Day11/mm.jpg b/Day01-15/Day11/mm.jpg
deleted file mode 100644
index 882abf2f0..000000000
Binary files a/Day01-15/Day11/mm.jpg and /dev/null differ
diff --git a/Day01-15/Day11/pi_million_digits.txt b/Day01-15/Day11/pi_million_digits.txt
deleted file mode 100644
index cd73dc3aa..000000000
--- a/Day01-15/Day11/pi_million_digits.txt
+++ /dev/null
@@ -1,10000 +0,0 @@
-3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
- 8214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196
- 4428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273
- 7245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094
- 3305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912
- 9833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132
- 0005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235
- 4201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859
- 5024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303
- 5982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989
- 3809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151
- 5574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012
- 8583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912
- 9331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279
- 6782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955
- 3211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000
- 8164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333
- 4547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383
- 8279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863
- 0674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009
- 9465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203
- 4962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382
- 6868386894277415599185592524595395943104997252468084598727364469584865383673622262609912460805124388
- 4390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506
- 0168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125
- 1507606947945109659609402522887971089314566913686722874894056010150330861792868092087476091782493858
- 9009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364
- 5428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344
- 0374200731057853906219838744780847848968332144571386875194350643021845319104848100537061468067491927
- 8191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961
- 5679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215
- 0306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856
- 1005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007
- 2305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116
- 7229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412
- 6711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535
- 8932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923
- 2332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656
- 1809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658
- 2131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396
- 6655730925471105578537634668206531098965269186205647693125705863566201855810072936065987648611791045
- 3348850346113657686753249441668039626579787718556084552965412665408530614344431858676975145661406800
- 7002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830
- 6343285878569830523580893306575740679545716377525420211495576158140025012622859413021647155097925923
- 0990796547376125517656751357517829666454779174501129961489030463994713296210734043751895735961458901
- 9389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571
- 8530614228813758504306332175182979866223717215916077166925474873898665494945011465406284336639379003
- 9769265672146385306736096571209180763832716641627488880078692560290228472104031721186082041900042296
- 6171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513
- 6222247715891504953098444893330963408780769325993978054193414473774418426312986080998886874132604721
- 5695162396586457302163159819319516735381297416772947867242292465436680098067692823828068996400482435
- 4037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617
- 5578297352334460428151262720373431465319777741603199066554187639792933441952154134189948544473456738
- 3162499341913181480927777103863877343177207545654532207770921201905166096280490926360197598828161332
- 3166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267
- 9456127531813407833033625423278394497538243720583531147711992606381334677687969597030983391307710987
- 0408591337464144282277263465947047458784778720192771528073176790770715721344473060570073349243693113
- 8350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415
- 9562586586557055269049652098580338507224264829397285847831630577775606888764462482468579260395352773
- 4803048029005876075825104747091643961362676044925627420420832085661190625454337213153595845068772460
- 2901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455
- 2540790914513571113694109119393251910760208252026187985318877058429725916778131496990090192116971737
- 2784768472686084900337702424291651300500516832336435038951702989392233451722013812806965011784408745
- 1960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510
- 2283345085048608250393021332197155184306354550076682829493041377655279397517546139539846833936383047
- 4611996653858153842056853386218672523340283087112328278921250771262946322956398989893582116745627010
- 2183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501
- 9567302292191393391856803449039820595510022635353619204199474553859381023439554495977837790237421617
- 2711172364343543947822181852862408514006660443325888569867054315470696574745855033232334210730154594
- 0516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867
- 4460477464915995054973742562690104903778198683593814657412680492564879855614537234786733039046883834
- 3634655379498641927056387293174872332083760112302991136793862708943879936201629515413371424892830722
- 0126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605
- 2772190055614842555187925303435139844253223415762336106425063904975008656271095359194658975141310348
- 2276930624743536325691607815478181152843667957061108615331504452127473924544945423682886061340841486
- 3776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862
- 9164219399490723623464684411739403265918404437805133389452574239950829659122850855582157250310712570
- 1266830240292952522011872676756220415420516184163484756516999811614101002996078386909291603028840026
- 9104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157
- 9598470356222629348600341587229805349896502262917487882027342092222453398562647669149055628425039127
- 5771028402799806636582548892648802545661017296702664076559042909945681506526530537182941270336931378
- 5178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291
- 6161528813843790990423174733639480457593149314052976347574811935670911013775172100803155902485309066
- 9203767192203322909433467685142214477379393751703443661991040337511173547191855046449026365512816228
- 8244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968
- 3408005355984917541738188399944697486762655165827658483588453142775687900290951702835297163445621296
- 4043523117600665101241200659755851276178583829204197484423608007193045761893234922927965019875187212
- 7267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522
- 7429958180724716259166854513331239480494707911915326734302824418604142636395480004480026704962482017
- 9289647669758318327131425170296923488962766844032326092752496035799646925650493681836090032380929345
- 9588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885
- 6909411303150952617937800297412076651479394259029896959469955657612186561967337862362561252163208628
- 6922210327488921865436480229678070576561514463204692790682120738837781423356282360896320806822246801
- 2248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417
- 2543709069793961225714298946715435784687886144458123145935719849225284716050492212424701412147805734
- 5510500801908699603302763478708108175450119307141223390866393833952942578690507643100638351983438934
- 1596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848
- 3084076118301305279320542746286540360367453286510570658748822569815793678976697422057505968344086973
- 5020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001
- 2645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678
- 5667227966198857827948488558343975187445455129656344348039664205579829368043522027709842942325330225
- 7634180703947699415979159453006975214829336655566156787364005366656416547321704390352132954352916941
- 4599041608753201868379370234888689479151071637852902345292440773659495630510074210871426134974595615
- 1384987137570471017879573104229690666702144986374645952808243694457897723300487647652413390759204340
- 1963403911473202338071509522201068256342747164602433544005152126693249341967397704159568375355516673
- 0273900749729736354964533288869844061196496162773449518273695588220757355176651589855190986665393549
- 4810688732068599075407923424023009259007017319603622547564789406475483466477604114632339056513433068
- 4495397907090302346046147096169688688501408347040546074295869913829668246818571031887906528703665083
- 2431974404771855678934823089431068287027228097362480939962706074726455399253994428081137369433887294
- 0630792615959954626246297070625948455690347119729964090894180595343932512362355081349490043642785271
- 3831591256898929519642728757394691427253436694153236100453730488198551706594121735246258954873016760
- 0298865925786628561249665523533829428785425340483083307016537228563559152534784459818313411290019992
- 0598135220511733658564078264849427644113763938669248031183644536985891754426473998822846218449008777
- 6977631279572267265556259628254276531830013407092233436577916012809317940171859859993384923549564005
- 7099558561134980252499066984233017350358044081168552653117099570899427328709258487894436460050410892
- 2669178352587078595129834417295351953788553457374260859029081765155780390594640873506123226112009373
- 1080485485263572282576820341605048466277504500312620080079980492548534694146977516493270950493463938
- 2432227188515974054702148289711177792376122578873477188196825462981268685817050740272550263329044976
- 2778944236216741191862694396506715157795867564823993917604260176338704549901761436412046921823707648
- 8783419689686118155815873606293860381017121585527266830082383404656475880405138080163363887421637140
- 6435495561868964112282140753302655100424104896783528588290243670904887118190909494533144218287661810
- 3100735477054981596807720094746961343609286148494178501718077930681085469000944589952794243981392135
- 0558642219648349151263901280383200109773868066287792397180146134324457264009737425700735921003154150
- 8936793008169980536520276007277496745840028362405346037263416554259027601834840306811381855105979705
- 6640075094260878857357960373245141467867036880988060971642584975951380693094494015154222219432913021
- 7391253835591503100333032511174915696917450271494331515588540392216409722910112903552181576282328318
- 2342548326111912800928252561902052630163911477247331485739107775874425387611746578671169414776421441
- 1112635835538713610110232679877564102468240322648346417663698066378576813492045302240819727856471983
- 9630878154322116691224641591177673225326433568614618654522268126887268445968442416107854016768142080
- 8850280054143613146230821025941737562389942075713627516745731891894562835257044133543758575342698699
- 4725470316566139919996826282472706413362221789239031760854289437339356188916512504244040089527198378
- 7386480584726895462438823437517885201439560057104811949884239060613695734231559079670346149143447886
- 3604103182350736502778590897578272731305048893989009923913503373250855982655867089242612429473670193
- 9077271307068691709264625484232407485503660801360466895118400936686095463250021458529309500009071510
- 5823626729326453738210493872499669933942468551648326113414611068026744663733437534076429402668297386
- 5220935701626384648528514903629320199199688285171839536691345222444708045923966028171565515656661113
- 5982311225062890585491450971575539002439315351909021071194573002438801766150352708626025378817975194
- 7806101371500448991721002220133501310601639154158957803711779277522597874289191791552241718958536168
- 0594741234193398420218745649256443462392531953135103311476394911995072858430658361935369329699289837
- 9149419394060857248639688369032655643642166442576079147108699843157337496488352927693282207629472823
- 8153740996154559879825989109371712621828302584811238901196822142945766758071865380650648702613389282
- 2994972574530332838963818439447707794022843598834100358385423897354243956475556840952248445541392394
- 1000162076936368467764130178196593799715574685419463348937484391297423914336593604100352343777065888
- 6778113949861647874714079326385873862473288964564359877466763847946650407411182565837887845485814896
- 2961273998413442726086061872455452360643153710112746809778704464094758280348769758948328241239292960
- 5829486191966709189580898332012103184303401284951162035342801441276172858302435598300320420245120728
- 7253558119584014918096925339507577840006746552603144616705082768277222353419110263416315714740612385
- 0425845988419907611287258059113935689601431668283176323567325417073420817332230462987992804908514094
- 7903688786878949305469557030726190095020764334933591060245450864536289354568629585313153371838682656
- 1786227363716975774183023986006591481616404944965011732131389574706208847480236537103115089842799275
- 4426853277974311395143574172219759799359685252285745263796289612691572357986620573408375766873884266
- 4059909935050008133754324546359675048442352848747014435454195762584735642161981340734685411176688311
- 8654489377697956651727966232671481033864391375186594673002443450054499539974237232871249483470604406
- 3471606325830649829795510109541836235030309453097335834462839476304775645015008507578949548931393944
- 8992161255255977014368589435858775263796255970816776438001254365023714127834679261019955852247172201
- 7772370041780841942394872540680155603599839054898572354674564239058585021671903139526294455439131663
- 1345308939062046784387785054239390524731362012947691874975191011472315289326772533918146607300089027
- 7689631148109022097245207591672970078505807171863810549679731001678708506942070922329080703832634534
- 5203802786099055690013413718236837099194951648960075504934126787643674638490206396401976668559233565
- 4639138363185745698147196210841080961884605456039038455343729141446513474940784884423772175154334260
- 3066988317683310011331086904219390310801437843341513709243530136776310849135161564226984750743032971
- 6746964066653152703532546711266752246055119958183196376370761799191920357958200759560530234626775794
- 3936307463056901080114942714100939136913810725813781357894005599500183542511841721360557275221035268
- 0373572652792241737360575112788721819084490061780138897107708229310027976659358387589093956881485602
- 6322439372656247277603789081445883785501970284377936240782505270487581647032458129087839523245323789
- 6029841669225489649715606981192186584926770403956481278102179913217416305810554598801300484562997651
- 1212415363745150056350701278159267142413421033015661653560247338078430286552572227530499988370153487
- 9300806260180962381516136690334111138653851091936739383522934588832255088706450753947395204396807906
- 7086806445096986548801682874343786126453815834280753061845485903798217994599681154419742536344399602
- 9025100158882721647450068207041937615845471231834600726293395505482395571372568402322682130124767945
- 2264482091023564775272308208106351889915269288910845557112660396503439789627825001611015323516051965
- 5904211844949907789992007329476905868577878720982901352956613978884860509786085957017731298155314951
- 6814671769597609942100361835591387778176984587581044662839988060061622984861693533738657877359833616
- 1338413385368421197893890018529569196780455448285848370117096721253533875862158231013310387766827211
- 5726949518179589754693992642197915523385766231676275475703546994148929041301863861194391962838870543
- 6777432242768091323654494853667680000010652624854730558615989991401707698385483188750142938908995068
- 5453076511680333732226517566220752695179144225280816517166776672793035485154204023817460892328391703
- 2754257508676551178593950027933895920576682789677644531840404185540104351348389531201326378369283580
- 8271937831265496174599705674507183320650345566440344904536275600112501843356073612227659492783937064
- 7842645676338818807565612168960504161139039063960162022153684941092605387688714837989559999112099164
- 6464411918568277004574243434021672276445589330127781586869525069499364610175685060167145354315814801
- 0545886056455013320375864548584032402987170934809105562116715468484778039447569798042631809917564228
- 0987399876697323769573701580806822904599212366168902596273043067931653114940176473769387351409336183
- 3216142802149763399189835484875625298752423873077559555955465196394401821840998412489826236737714672
- 2606163364329640633572810707887581640438148501884114318859882769449011932129682715888413386943468285
- 9006664080631407775772570563072940049294030242049841656547973670548558044586572022763784046682337985
- 2827105784319753541795011347273625774080213476826045022851579795797647467022840999561601569108903845
- 8245026792659420555039587922981852648007068376504183656209455543461351341525700659748819163413595567
- 1964965403218727160264859304903978748958906612725079482827693895352175362185079629778514618843271922
- 3223810158744450528665238022532843891375273845892384422535472653098171578447834215822327020690287232
- 3300538621634798850946954720047952311201504329322662827276321779088400878614802214753765781058197022
- 2630971749507212724847947816957296142365859578209083073323356034846531873029302665964501371837542889
- 7557971449924654038681799213893469244741985097334626793321072686870768062639919361965044099542167627
- 8409146698569257150743157407938053239252394775574415918458215625181921552337096074833292349210345146
- 2643744980559610330799414534778457469999212859999939961228161521931488876938802228108300198601654941
- 6542616968586788372609587745676182507275992950893180521872924610867639958916145855058397274209809097
- 8172932393010676638682404011130402470073508578287246271349463685318154696904669686939254725194139929
- 1465242385776255004748529547681479546700705034799958886769501612497228204030399546327883069597624936
- 1510102436555352230690612949388599015734661023712235478911292547696176005047974928060721268039226911
- 0277722610254414922157650450812067717357120271802429681062037765788371669091094180744878140490755178
- 2038565390991047759414132154328440625030180275716965082096427348414695726397884256008453121406593580
- 9041271135920041975985136254796160632288736181367373244506079244117639975974619383584574915988097667
- 4470930065463424234606342374746660804317012600520559284936959414340814685298150539471789004518357551
- 5412522359059068726487863575254191128887737176637486027660634960353679470269232297186832771739323619
- 2007774522126247518698334951510198642698878471719396649769070825217423365662725928440620430214113719
- 9227852699846988477023238238400556555178890876613601304770984386116870523105531491625172837327286760
- 0724817298763756981633541507460883866364069347043720668865127568826614973078865701568501691864748854
- 1679154596507234287730699853713904300266530783987763850323818215535597323530686043010675760838908627
- 0498418885951380910304235957824951439885901131858358406674723702971497850841458530857813391562707603
- 5639076394731145549583226694570249413983163433237897595568085683629725386791327505554252449194358912
- 8405045226953812179131914513500993846311774017971512283785460116035955402864405902496466930707769055
- 4810288502080858008781157738171917417760173307385547580060560143377432990127286772530431825197579167
- 9296996504146070664571258883469797964293162296552016879730003564630457930884032748077181155533090988
- 7025505207680463034608658165394876951960044084820659673794731680864156456505300498816164905788311543
- 4548505266006982309315777650037807046612647060214575057932709620478256152471459189652236083966456241
- 0519551052235723973951288181640597859142791481654263289200428160913693777372229998332708208296995573
- 7727375667615527113922588055201898876201141680054687365580633471603734291703907986396522961312801782
- 6797172898229360702880690877686605932527463784053976918480820410219447197138692560841624511239806201
- 1318454124478205011079876071715568315407886543904121087303240201068534194723047666672174986986854707
- 6781205124736792479193150856444775379853799732234456122785843296846647513336573692387201464723679427
- 8700425032555899268843495928761240075587569464137056251400117971331662071537154360068764773186755871
- 4878398908107429530941060596944315847753970094398839491443235366853920994687964506653398573888786614
- 7629443414010498889931600512076781035886116602029611936396821349607501116498327856353161451684576956
- 8710900299976984126326650234771672865737857908574664607722834154031144152941880478254387617707904300
- 0156698677679576090996693607559496515273634981189641304331166277471233881740603731743970540670310967
- 6765748695358789670031925866259410510533584384656023391796749267844763708474978333655579007384191473
- 1988627135259546251816043422537299628632674968240580602964211463864368642247248872834341704415734824
- 8183330164056695966886676956349141632842641497453334999948000266998758881593507357815195889900539512
- 0853510357261373640343675347141048360175464883004078464167452167371904831096767113443494819262681110
- 7399482506073949507350316901973185211955263563258433909982249862406703107683184466072912487475403161
- 7969941139738776589986855417031884778867592902607004321266617919223520938227878880988633599116081923
- 5355570464634911320859189796132791319756490976000139962344455350143464268604644958624769094347048293
- 2941404111465409239883444351591332010773944111840741076849810663472410482393582740194493566516108846
- 3125678529776973468430306146241803585293315973458303845541033701091676776374276210213701354854450926
- 3071901147318485749233181672072137279355679528443925481560913728128406333039373562420016045664557414
- 5881660521666087387480472433912129558777639069690370788285277538940524607584962315743691711317613478
- 3882719416860662572103685132156647800147675231039357860689611125996028183930954870905907386135191459
- 1819510297327875571049729011487171897180046961697770017913919613791417162707018958469214343696762927
- 4591099400600849835684252019155937037010110497473394938778859894174330317853487076032219829705797511
- 9144051099423588303454635349234982688362404332726741554030161950568065418093940998202060999414021689
- 0900708213307230896621197755306659188141191577836272927461561857103721724710095214236964830864102592
- 8874579993223749551912219519034244523075351338068568073544649951272031744871954039761073080602699062
- 5807602029273145525207807991418429063884437349968145827337207266391767020118300464819000241308350884
- 6584152148991276106513741539435657211390328574918769094413702090517031487773461652879848235338297260
- 1361109845148418238081205409961252745808810994869722161285248974255555160763716750548961730168096138
- 0381191436114399210638005083214098760459930932485102516829446726066613815174571255975495358023998314
- 6982203613380828499356705575524712902745397762140493182014658008021566536067765508783804304134310591
- 8046068008345911366408348874080057412725867047922583191274157390809143831384564241509408491339180968
- 4025116399193685322555733896695374902662092326131885589158083245557194845387562878612885900410600607
- 3746501402627824027346962528217174941582331749239683530136178653673760642166778137739951006589528877
- 4276626368418306801908046098498094697636673356622829151323527888061577682781595886691802389403330764
- 4191240341202231636857786035727694154177882643523813190502808701857504704631293335375728538660588890
- 4583111450773942935201994321971171642235005644042979892081594307167019857469273848653833436145794634
- 1759225738985880016980147574205429958012429581054565108310462972829375841611625325625165724980784920
- 9989799062003593650993472158296517413579849104711166079158743698654122234834188772292944633517865385
- 6731962559852026072947674072616767145573649812105677716893484917660771705277187601199908144113058645
- 5779105256843048114402619384023224709392498029335507318458903553971330884461741079591625117148648744
- 6861124760542867343670904667846867027409188101424971114965781772427934707021668829561087779440504843
- 7528443375108828264771978540006509704033021862556147332117771174413350281608840351781452541964320309
- 5760186946490886815452856213469883554445602495566684366029221951248309106053772019802183101032704178
- 3866544718126039719068846237085751808003532704718565949947612424811099928867915896904956394762460842
- 4065930948621507690314987020673533848349550836366017848771060809804269247132410009464014373603265645
- 1845667924566695510015022983307984960799498824970617236744936122622296179081431141466094123415935930
- 9585407913908720832273354957208075716517187659944985693795623875551617575438091780528029464200447215
- 3962807463602113294255916002570735628126387331060058910652457080244749375431841494014821199962764531
- 0680066311838237616396631809314446712986155275982014514102756006892975024630401735148919457636078935
- 2855505317331416457050499644389093630843874484783961684051845273288403234520247056851646571647713932
- 3775517294795126132398229602394548579754586517458787713318138752959809412174227300352296508089177705
- 0682592488223221549380483714547816472139768209633205083056479204820859204754998573203888763916019952
- 4091893894557676874973085695595801065952650303626615975066222508406742889826590751063756356996821151
- 0949669744580547288693631020367823250182323708459790111548472087618212477813266330412076216587312970
- 8112307581598212486398072124078688781145016558251361789030708608701989758898074566439551574153631931
- 9198107057533663373803827215279884935039748001589051942087971130805123393322190346624991716915094854
- 1401871060354603794643379005890957721180804465743962806186717861017156740967662080295766577051291209
- 9079443046328929473061595104309022214393718495606340561893425130572682914657832933405246350289291754
- 7087256484260034962961165413823007731332729830500160256724014185152041890701154288579920812198449315
- 6999059182011819733500126187728036812481995877070207532406361259313438595542547781961142935163561223
- 4966615226147353996740515849986035529533292457523888101362023476246690558164389678630976273655047243
- 4864307121849437348530060638764456627218666170123812771562137974614986132874411771455244470899714452
- 2885662942440230184791205478498574521634696448973892062401943518310088283480249249085403077863875165
- 9113028739587870981007727182718745290139728366148421428717055317965430765045343246005363614726181809
- 6997693348626407743519992868632383508875668359509726557481543194019557685043724800102041374983187225
- 9677387154958399718444907279141965845930083942637020875635398216962055324803212267498911402678528599
- 6734052420310917978999057188219493913207534317079800237365909853755202389116434671855829068537118979
- 5262623449248339249634244971465684659124891855662958932990903523923333364743520370770101084388003290
- 7598342170185542283861617210417603011645918780539367447472059985023582891833692922337323999480437108
- 4196594731626548257480994825099918330069765693671596893644933488647442135008407006608835972350395323
- 4017958255703601693699098867113210979889707051728075585519126993067309925070407024556850778679069476
- 6126298082251633136399521170984528092630375922426742575599892892783704744452189363203489415521044597
- 2618838003006776179313813991620580627016510244588692476492468919246121253102757313908404700071435613
- 6231699237169484813255420091453041037135453296620639210547982439212517254013231490274058589206321758
- 9494345489068463993137570910346332714153162232805522972979538018801628590735729554162788676498274186
- 1642187898857410716490691918511628152854867941736389066538857642291583425006736124538491606741373401
- 7357277995634104332688356950781493137800736235418007061918026732855119194267609122103598746924117283
- 7493126163395001239599240508454375698507957046222664619000103500490183034153545842833764378111988556
- 3187777925372011667185395418359844383052037628194407615941068207169703022851522505731260930468984234
- 3315273213136121658280807521263154773060442377475350595228717440266638914881717308643611138906942027
- 9088143119448799417154042103412190847094080254023932942945493878640230512927119097513536000921971105
- 4120966831115163287054230284700731206580326264171161659576132723515666625366727189985341998952368848
- 3099930275741991646384142707798870887422927705389122717248632202889842512528721782603050099451082478
- 3572905691988555467886079462805371227042466543192145281760741482403827835829719301017888345674167811
- 3989547504483393146896307633966572267270433932167454218245570625247972199786685427989779923395790575
- 8189062252547358220523642485078340711014498047872669199018643882293230538231855973286978092225352959
- 1017341407334884761005564018242392192695062083183814546983923664613639891012102177095976704908305081
- 8547041946643713122996923588953849301363565761861060622287055994233716310212784574464639897381885667
- 4626087948201864748767272722206267646533809980196688368099415907577685263986514625333631245053640261
- 0569605513183813174261184420189088853196356986962795036738424313011331753305329802016688817481342988
- 6815855778103432317530647849832106297184251843855344276201282345707169885305183261796411785796088881
- 5032960229070561447622091509473903594664691623539680920139457817589108893199211226007392814916948161
- 5273842736264298098234063200244024495894456129167049508235812487391799648641133480324757775219708932
- 7722623494860150466526814398770516153170266969297049283162855042128981467061953319702695072143782304
- 7687528028735412616639170824592517001071418085480063692325946201900227808740985977192180515853214739
- 2653251559035410209284665925299914353791825314545290598415817637058927906909896911164381187809435371
- 5213322614436253144901274547726957393934815469163116249288735747188240715039950094467319543161938554
- 8520766573882513963916357672315100555603726339486720820780865373494244011579966750736071115935133195
- 9197120948964717553024531364770942094635696982226673775209945168450643623824211853534887989395673187
- 8066061078854400055082765703055874485418057788917192078814233511386629296671796434687600770479995378
- 8338787034871802184243734211227394025571769081960309201824018842705704609262256417837526526335832424
- 0661253311529423457965569502506810018310900411245379015332966156970522379210325706937051090830789479
- 9990049993953221536227484766036136776979785673865846709366795885837887956259464648913766521995882869
- 3380183601193236857855855819555604215625088365020332202451376215820461810670519533065306060650105488
- 7167245377942831338871631395596905832083416898476065607118347136218123246227258841990286142087284956
- 8796393254642853430753011052857138296437099903569488852851904029560473461311382638788975517885604249
- 9874831638280404684861893818959054203988987265069762020199554841265000539442820393012748163815853039
- 6439925470201672759328574366661644110962566337305409219519675148328734808957477775278344221091073111
- 3518280460363471981856555729571447476825528578633493428584231187494400032296906977583159038580393535
- 2135886007960034209754739229673331064939560181223781285458431760556173386112673478074585067606304822
- 9409653041118306671081893031108871728167519579675347188537229309616143204006381322465841111157758358
- 5811350185690478153689381377184728147519983505047812977185990847076219746058874232569958288925350419
- 3795826061621184236876851141831606831586799460165205774052942305360178031335726326705479033840125730
- 5912339601880137825421927094767337191987287385248057421248921183470876629667207272325650565129333126
- 0595057777275424712416483128329820723617505746738701282095755443059683955556868611883971355220844528
- 5264008125202766555767749596962661260456524568408613923826576858338469849977872670655519185446869846
- 9478495734622606294219624557085371272776523098955450193037732166649182578154677292005212667143463209
- 6378918523232150189761260343736840671941930377468809992968775824410478781232662531818459604538535438
- 3911449677531286426092521153767325886672260404252349108702695809964759580579466397341906401003636190
- 4042033113579336542426303561457009011244800890020801478056603710154122328891465722393145076071670643
- 5568274377439657890679726874384730763464516775621030986040927170909512808630902973850445271828927496
- 8921210667008164858339553773591913695015316201890888748421079870689911480466927065094076204650277252
- 8650728905328548561433160812693005693785417861096969202538865034577183176686885923681488475276498468
- 8219497397297077371871884004143231276365048145311228509900207424092558592529261030210673681543470152
- 5234878635164397623586041919412969769040526483234700991115424260127343802208933109668636789869497799
- 4001260164227609260823493041180643829138347354679725399262338791582998486459271734059225620749105308
- 5315371829116816372193951887009577881815868504645076993439409874335144316263303172477474868979182092
- 3948083314397084067308407958935810896656477585990556376952523265361442478023082681183103773588708924
- 0613031336477371011628214614661679404090518615260360092521947218890918107335871964142144478654899528
- 5823439470500798303885388608310357193060027711945580219119428999227223534587075662469261776631788551
- 4435021828702668561066500353105021631820601760921798468493686316129372795187307897263735371715025637
- 8733579771808184878458866504335824377004147710414934927438457587107159731559439426412570270965125108
- 1155482479394035976811881172824721582501094960966253933953809221955919181885526780621499231727631632
- 1833989693807561685591175299845013206712939240414459386239880938124045219148483164621014738918251010
- 9096773869066404158973610476436500068077105656718486281496371118832192445663945814491486165500495676
- 9826903089111856879869294705135248160917432430153836847072928989828460222373014526556798986277679680
- 9146979837826876431159883210904371561129976652153963546442086919756737000573876497843768628768179249
- 7469438427465256316323005551304174227341646455127812784577772457520386543754282825671412885834544435
- 1325620544642410110379554641905811686230596447695870540721419852121067343324107567675758184569906930
- 4604752277016700568454396923404171108988899341635058515788735343081552081177207188037910404698306957
- 8685473937656433631979786803671873079693924236321448450354776315670255390065423117920153464977929066
- 2415083288583952905426376876689688050333172278001858850697362324038947004718976193473443084374437599
- 2503417880797223585913424581314404984770173236169471976571535319775499716278566311904691260918259124
- 9890367654176979903623755286526375733763526969344354400473067198868901968147428767790866979688522501
- 6369498567302175231325292653758964151714795595387842784998664563028788319620998304945198743963690706
- 8276265748581043911223261879405994155406327013198989570376110532360629867480377915376751158304320849
- 8720920280929752649812569163425000522908872646925284666104665392171482080130502298052637836426959733
- 7070539227891535105688839381132497570713310295044303467159894487868471164383280506925077662745001220
- 0352620370946602341464899839025258883014867816219677519458316771876275720050543979441245990077115205
- 1546199305098386982542846407255540927403132571632640792934183342147090412542533523248021932277075355
- 5467958716383587501815933871742360615511710131235256334858203651461418700492057043720182617331947157
- 0086757853933607862273955818579758725874410254207710547536129404746010009409544495966288148691590389
- 9071865980563617137692227290764197755177720104276496949611056220592502420217704269622154958726453989
- 2276976603105249808557594716310758701332088614632664125911486338812202844406941694882615295776253250
- 1987035987067438046982194205638125583343642194923227593722128905642094308235254408411086454536940496
- 9271494003319782861318186188811118408257865928757426384450059944229568586460481033015388911499486935
- 4360302218109434667640000223625505736312946262960961987605642599639461386923308371962659547392346241
- 3459779574852464783798079569319865081597767535055391899115133525229873611277918274854200868953965835
- 9421963331502869561192012298889887006079992795411188269023078913107603617634779489432032102773359416
- 9086500719328040171638406449878717537567811853213284082165711075495282949749362146082155832056872321
- 8557406516109627487437509809223021160998263303391546949464449100451528092508974507489676032409076898
- 3652940657920198315265410658136823791984090645712468948470209357761193139980246813405200394781949866
- 2026240089021501661638135383815150377350229660746279529103840686855690701575166241929872444827194293
- 3100485482445458071889763300323252582158128032746796200281476243182862217105435289834820827345168018
- 6131719593324711074662228508710666117703465352839577625997744672185715816126411143271794347885990892
- 8084866949141390977167369002777585026866465405659503948678411107901161040085727445629384254941675946
- 0548711723594642910585090995021495879311219613590831588262068233215615308683373083817327932819698387
- 5087083483880463884784418840031847126974543709373298362402875197920802321878744882872843727378017827
- 0080587824107493575148899789117397461293203510814327032514090304874622629423443275712600866425083331
- 8768865075642927160552528954492153765175149219636718104943531785838345386525565664065725136357506435
- 3236508936790431702597878177190314867963840828810209461490079715137717099061954969640070867667102330
- 0486726314755105372317571143223174114116806228642063889062101923552235467116621374996932693217370431
- 0598722503945657492461697826097025335947502091383667377289443869640002811034402608471289900074680776
- 4844088711341352503367877316797709372778682166117865344231732264637847697875144332095340001650692130
- 5464768909850502030150448808342618452087305309731894929164253229336124315143065782640702838984098416
- 0295030924189712097160164926561341343342229882790992178604267981245728534580133826099587717811310216
- 7340256562744007296834066198480676615805021691833723680399027931606420436812079900316264449146190219
- 4582296909921227885539487835383056468648816555622943156731282743908264506116289428035016613366978240
- 5177015521962652272545585073864058529983037918035043287670380925216790757120406123759632768567484507
- 9151147313440001832570344920909712435809447900462494313455028900680648704293534037436032625820535790
- 1183956490893543451013429696175452495739606214902887289327925206965353863964432253883275224996059869
- 7475988232991626354597332444516375533437749292899058117578635555562693742691094711700216541171821975
- 0519831787137106051063795558588905568852887989084750915764639074693619881507814685262133252473837651
- 1929901561091897779220087057933964638274906806987691681974923656242260871541761004306089043779766785
- 1966189140414492527048088197149880154205778700652159400928977760133075684796699295543365613984773806
- 0394368895887646054983871478968482805384701730871117761159663505039979343869339119789887109156541709
- 1330826076474063057114110988393880954814378284745288383680794188843426662220704387228874139478010177
- 2139228191199236540551639589347426395382482960903690028835932774585506080131798840716244656399794827
- 5783650195514221551339281978226984278638391679715091262410548725700924070045488485692950448110738087
- 9965474815689139353809434745569721289198271770207666136024895814681191336141212587838955773571949863
- 1721084439890142394849665925173138817160266326193106536653504147307080441493916936326237376777709585
- 0313255990095762731957308648042467701212327020533742667053142448208168130306397378736642483672539837
- 4876909806021827857862165127385635132901489035098832706172589325753639939790557291751600976154590447
- 7169226580631511102803843601737474215247608515209901615858231257159073342173657626714239047827958728
- 1505095633092802668458937649649770232973641319060982740633531089792464242134583740901169391964250459
- 1288134034988106354008875968200544083643865166178805576089568967275315380819420773325979172784376256
- 6118431989102500749182908647514979400316070384554946538594602745244746681231468794344161099333890899
- 2638411847425257044572517459325738989565185716575961481266020310797628254165590506042479114016957900
- 3383565748692528007430256234194982864679144763227740055294609039401775363356554719310001754300475047
- 1914489984104001586794617924161001645471655133707407395026044276953855383439755054887109978520540117
- 5169747581344926079433689543783221172450687344231989878844128542064742809735625807066983106979935260
- 6933921356858813912148073547284632277849080870024677763036055512323866562951788537196730346347012229
- 3958160679250915321748903084088651606111901149844341235012464692802880599613428351188471544977127847
- 3361766285062169778717743824362565711779450064477718370221999106695021656757644044997940765037999954
- 8450027106659878136038023141268369057831904607927652972776940436130230517870805465115424693952651271
- 0105292707030667302444712597393995051462840476743136373997825918454117641332790646063658415292701903
- 0276017339474866960348694976541752429306040727005059039503148522921392575594845078867977925253931765
- 1564161971684435243697944473559642606333910551268260615957262170366985064732812667245219890605498802
- 8078288142979633669674412480598219214633956574572210229867759974673812606936706913408155941201611596
- 0190237753525556300606247983261249881288192937343476862689219239777833910733106588256813777172328315
- 3290825250927330478507249771394483338925520811756084529665905539409655685417060011798572938139982583
- 1929367910039184409928657560599359891000296986446097471471847010153128376263114677420914557404181590
- 8800064943237855839308530828305476076799524357391631221886057549673832243195650655460852881201902363
- 6447127037486344217272578795034284863129449163184753475314350413920961087960577309872013524840750576
- 3719925365047090858251393686346386336804289176710760211115982887553994012007601394703366179371539630
- 6139863655492213741597905119083588290097656647300733879314678913181465109316761575821351424860442292
- 4453041131606527009743300884990346754055186406773426035834096086055337473627609356588531097609942383
- 4738222208729246449768456057956251676557408841032173134562773585605235823638953203853402484227337163
- 9123973215995440828421666636023296545694703577184873442034227706653837387506169212768015766181095420
- 0977083636043611105924091178895403380214265239489296864398089261146354145715351943428507213534530183
- 1587562827573389826889852355779929572764522939156747756667605108788764845349363606827805056462281359
- 8885879259940946446041705204470046315137975431737187756039815962647501410906658866162180038266989961
- 9655805872086397211769952194667898570117983324406018115756580742841829106151939176300591943144346051
- 5404771057005433900018245311773371895585760360718286050635647997900413976180895536366960316219311325
- 0223851791672055180659263518036251214575926238369348222665895576994660491938112486609099798128571823
- 4940066155521961122072030922776462009993152442735894887105766238946938894464950939603304543408421024
- 6240104872332875008174917987554387938738143989423801176270083719605309438394006375611645856094312951
- 7597713935396074322792489221267045808183313764165818269562105872892447740035947009268662659651422050
- 6300785920024882918608397437323538490839643261470005324235406470420894992102504047267810590836440074
- 6638002087012666420945718170294675227854007450855237772089058168391844659282941701828823301497155423
- 5235911774818628592967605048203864343108779562892925405638946621948268711042828163893975711757786915
- 4301650586029652174595819888786804081103284327398671986213062055598552660364050462821523061545944744
- 8990883908199973874745296981077620148713400012253552224669540931521311533791579802697955571050850747
- 3874750758068765376445782524432638046143042889235934852961058269382103498000405248407084403561167817
- 1705128133788057056434506161193304244407982603779511985486945591520519600930412710072778493015550388
- 9536033826192934379708187432094991415959339636811062755729527800425486306005452383915106899891357882
- 0019411786535682149118528207852130125518518493711503422159542244511900207393539627400208110465530207
- 9328672547405436527175958935007163360763216147258154076420530200453401835723382926619153083540951202
- 2632916505442612361919705161383935732669376015691442994494374485680977569630312958871916112929468188
- 4936338647392747601226964158848900965717086160598147204467428664208765334799858222090619802173211614
- 2304194777549907387385679411898246609130916917722742072333676350326783405863019301932429963972044451
- 7928812285447821195353089891012534297552472763573022628138209180743974867145359077863353016082155991
- 1314144205091447293535022230817193663509346865858656314855575862447818620108711889760652969899269328
- 1787055764351433820601410773292610634315253371822433852635202177354407152818981376987551575745469397
- 2715048846979361950047772097056179391382898984532742622728864710888327017372325881824465843624958059
- 2560338105215606206155713299156084892064340303395262263451454283678698288074251422567451806184149564
- 6861116354049718976821542277224794740335715274368194098920501136534001238467142965518673441537416150
- 4256325671343024765512521921803578016924032669954174608759240920700466934039651017813485783569444076
- 0470232540755557764728450751826890418293966113310160131119077398632462778219023650660374041606724962
- 4901374332172464540974129955705291424382080760983648234659738866913499197840131080155813439791948528
- 3043673901248208244481412809544377389832005986490915950532285791457688496257866588599917986752055455
- 8099004556461178755249370124553217170194282884617402736649978475508294228020232901221630102309772151
- 5694464279098021908266898688342630716092079140851976952355534886577434252775311972474308730436195113
- 9611908003025587838764420608504473063129927788894272918972716989057592524467966018970748296094919064
- 8764693702750773866432391919042254290235318923377293166736086996228032557185308919284403805071030064
- 7768478632431910002239297852553723755662136447400967605394398382357646069924652600890906241059042154
- 5392790441152958034533450025624410100635953003959886446616959562635187806068851372346270799732723313
- 4693971456285542615467650632465676620279245208581347717608521691340946520307673391841147504140168924
- 1213198268815686645614853802875393311602322925556189410429953356400957864953409351152664540244187759
- 4931693056044868642086275720117231952640502309977456764783848897346431721598062678767183800524769688
- 4084989185086149003432403476742686245952395890358582135006450998178244636087317754378859677672919526
- 1112138591947254514003011805034378752776644027626189410175768726804281766238606804778852428874302591
- 4524707395054652513533945959878961977891104189029294381856720507096460626354173294464957661265195349
- 5701860015412623962286413897796733329070567376962156498184506842263690367849555970026079867996261019
- 0393312637685569687670292953711625280055431007864087289392257145124811357786276649024251619902774710
- 9033593330930494838059785662884478744146984149906712376478958226329490467981208998485716357108783119
- 1848630254501620929805829208334813638405421720056121989353669371336733392464416125223196943471206417
- 3754912163570085736943973059797097197266666422674311177621764030686813103518991122713397240368870009
- 9686292254646500638528862039380050477827691283560337254825579391298525150682996910775425764748832534
- 1412132800626717094009098223529657957997803018282428490221470748111124018607613415150387569830918652
- 7806588966823625239378452726345304204188025084423631903833183845505223679923577529291069250432614469
- 5010986108889991465855188187358252816430252093928525807796973762084563748211443398816271003170315133
- 4402309526351929588680690821355853680161000213740851154484912685841268695899174149133820578492800698
- 2551957402018181056412972508360703568510553317878408290000415525118657794539633175385320921497205266
- 0783126028196116485809868458752512999740409279768317663991465538610893758795221497173172813151793290
- 4431121815871023518740757222100123768721944747209349312324107065080618562372526732540733324875754482
- 9675734500193219021991199607979893733836732425761039389853492787774739805080800155447640610535222023
- 2540944356771879456543040673589649101761077594836454082348613025471847648518957583667439979150851285
- 8020607820554462991723202028222914886959399729974297471155371858924238493855858595407438104882624648
- 7880533042714630119415898963287926783273224561038521970111304665871005000832851773117764897352309266
- 6123458887310288351562644602367199664455472760831011878838915114934093934475007302585581475619088139
- 8752357812331342279866503522725367171230756861045004548970360079569827626392344107146584895780241408
- 1584052295369374997106655948944592462866199635563506526234053394391421112718106910522900246574236041
- 3009369188925586578466846121567955425660541600507127664176605687427420032957716064344860620123982169
- 8271723197826816628249938714995449137302051843669076723577400053932662622760323659751718925901801104
- 2903842741855078948874388327030632832799630072006980122443651163940869222207453202446241211558043545
- 4206421512158505689615735641431306888344318528085397592773443365538418834030351782294625370201578215
- 7373265523185763554098954033236382319219892171177449469403678296185920803403867575834111518824177439
- 1450773663840718804893582568685420116450313576333555094403192367203486510105610498727264721319865434
- 3545040913185951314518127643731043897250700498198705217627249406521461995923214231443977654670835171
- 4749367986186552791715824080651063799500184295938799158350171580759883784962257398512129810326379376
- 2183224565942366853767991131401080431397323354490908249104991433258432988210339846981417157560108297
- 0658306521134707680368069532297199059990445120908727577622535104090239288877942463048328031913271049
- 5478599180196967835321464441189260631526618167443193550817081875477050802654025294109218264858213857
- 5266881555841131985600221351588872103656960875150631875330029421186822218937755460272272912905042922
- 5978771066787384000061677215463844129237119352182849982435092089180168557279815642185819119749098573
- 0570332667646460728757430565372602768982373259745084479649545648030771598153955827779139373601717422
- 9960273531027687194494449179397851446315973144353518504914139415573293820485421235081739125497498193
- 0871439661513294204591938010623142177419918406018034794988769105155790555480695387854006645337598186
- 2846419905220452803306263695626490910827627115903856995051246529996062855443838330327638599800792922
- 8466595035512112452840875162290602620118577753137479493620554964010730013488531507354873539056029089
- 3352640071327473262196031177343394367338575912450814933573691166454128178817145402305475066713651825
- 8284898099512139193995633241336556777098003081910272040997148687418134667006094051021462690280449159
- 6465453301077546954130887141653125448130611924078211886900560277818242350226961893443525476335735364
- 8561936325441775661398170393063287216690572225974520919291726219984440964615826945638023950283712168
- 6446561785235565164127712826918688615572716201474934052276946595712198314943381622114006936307430444
- 1732847861017777438379770372317952554341072234455125555899986461838767649039724611679590181000350989
- 2864120419516355110876320426761297982652942588295114127584126273279079880755975185157684126474220947
- 9721843309352972665210015662514552994745127631550917636730259462132930190402837954246323258550301096
- 7069227202270748634190054383026506812141421350571541750575086399076739463351462090828889349383764393
- 9925690060406731142209331219593620298297235116325938677224147791162957278075239505625158160313335938
- 2311500518626890530658368129988108663263271980611271548858798093487912913707498230575929091862939195
- 0147211975860672700925477180257503377307993971345395326461952699965963856549175904583335857991020127
- 1320458390320085387888163363768518208372788513117522776960978796214237216254521459128183179821604411
- 1311671406914827170981015457781939202311563871950805024679725792497605772625913328559726371211201905
- 7207714091486450740949267180358151575715140503976109638467555692989703835473141002238025834687673501
- 2977541327953206097115450648421218593649099791776687477448188287063231551586503289816422828823274686
- 6106592732197907162384642153489852476216789050260998045266483929542357287343977680495774091449538391
- 5755654854590589764951985138010079580107837599457752991967005476022525520344539887125387801719607181
- 6407812484784725791240782454436168234523957068951427226975043187363326301110305342333582160933319121
- 8806608268341428910415173247216053355849993224548730778822905252324234861531520976938461042582849714
- 9634753418375620030149157032796853018686315724884015266398356895636346574353217834931998255421173084
- 6774529708583950761645822963032442432823773745051702856069806788952176819815671078163340526675953942
- 4926280756968326107495323390536223090807081455919837355377748742029039018142937311529334644468151212
- 9450975965343062842153194457271186149000176505581770953024688752632501197052094761594167687277844720
- 0019278913725184162285778379228443908430118112149636642465903363419454065718354477191244662125939265
- 6620306888520055599121235363718226922531781458792593750441448933981608657900876165024635197045828895
- 4817937566810464746141051424988702521399368705093723054477341126413548928068410591077166778212383328
- 1026218558775131272117934444820144042574508306394473836379390628300897330624138061458941422769474793
- 1665717623182472168350678076487573420491557628217583972975134478990696589532548940335615613167403276
- 4724692125057591162515296545685446334981143176702572956618447754874693784642337372389819206620485118
- 9437886822480727935202250179654534375727416391079197295295081294292220534771730418447791567399173841
- 8311710362524395716152714669005814700002633010452643547865903290733205468338872078735444762647925297
- 6901709120078741837367350877133769776834963442524199499513883150748775374338494582597655609965559543
- 1804092017849718468549737069621208852437701385375768141663272241263442398215294164537800049250726276
- 5150789085071265997036708726692764308377229685985169122305037462744310852934305273078865283977335246
- 0174635277032059381791253969156210636376258829375713738407544064689647831007045806134467312715911946
- 0843593582598778283526653115106504162329532904777217408355934972375855213804830509000964667608830154
- 0612824308740645594431853413755220166305812111033453120745086824339432159043594430312431227471385842
- 0303901060709403152355561727679941600203939750998976293353258555756248089966918298642226775023601932
- 5797472674257821111973470940235745722227121252685238429587427350156366009318804549333898974157149054
- 4182559738080871565281430102670460284316819230392535297795765862414392701549740879273131051636119137
- 5770089295648233236482982630246079758757677453771601024908046243018565241617566556001608591215345562
- 6760219268998285537787258314514408265458348440947846317877737479465358016996077940556870119232860804
- 1130904629350871827125934668712766694873899824598527786499569165464029458935064964335809824765965165
- 1420909867552038083092032304873427034682887516040715466538346196112230137594515792526967436425319273
- 9003603860823645076269882749761872357547676288995075211480485252795084503395857083813047693788132112
- 3674281319487950228066320170022460331989671970649163741175854851878484012054844672588851401562725019
- 8217190669608126277854859648183696214107217142149863619187747545096503089570994709343378569816744658
- 2826791194061195603784539785583924076127634410576675102430755981455278616781594965706255975507430652
- 1085301597908073343736079432866757890533483669555486803913433720156498834220893399971641479746938696
- 9054800891930671380571715058573071488156499207140867582596028760564597824237702424698053280566327870
- 4192676846711626687946348695046450742021937394525926266861355294062478136120620263649819999949840514
- 3868285258956342264328707663299304891723400725471764188685351372332667877921738347541480022803392997
- 3579361524127558295692768372312347989894462743304545667900620324205163962825884430854383072014956721
- 0646053323853720314324211260742448584509458049408182092763914000854042202355626021856434899414543995
- 0410980591817948882628052066441086319001688568155169229486203010738897181007709290590480749092427141
- 0189335428184299959881696609938369616443815288772140852680887574882932587358099056707558170179491619
- 0611400190855374488272620093668560447559655747648567400817738170330738030547697360978654385938218722
- 0583902344443508867499866506040645874346005331827436296177862518081893144363251205107094690813586440
- 5192295129324500788333987884293393424351263433652043858129128343452973086529097833006712617981303167
- 9438553572629699874035957045845223085639009891317947594875212639707837594486113945196028675121056163
- 8976008880092746115860800207803341591451797073036835196977766076373785333012024120112046988609209339
- 0853657732223924124490515327809509558664594776344822699860748132973026309750288121035177231244650953
- 4965369309001863776409409434983731325132186208021480992268550294845466181471555744470966953017769043
- 4272031892770604717784527939160472281534379803539679861424370956683221491465438014593829277393396032
- 7540480095522318166673803571839327570771420467238386246178039762923771312095807893638414479298025880
- 6552212926209362393063731349664018661951081158347117331202580586672763999276357907806381881306915636
- 6274125431259589936119647626101405563503399523140323113819656236327198961837254845333702062563464223
- 9527669435683767613687119629218187545760816170530315907288287007123136663087227549186613957737305460
- 6599743781098764980241401124214277366808275139095931340415582626678951084677611866595766016599817808
- 9414985754976284387856100263796543178313634025135814161151902096499133548733131115022700681930135929
- 5959716401971960536250335584799809634887180391116128135959685654788683258564378961731597620024196215
- 5289629790481982219946226948713746244472909345647002853769495885959160678928249105441251599630078136
- 8367490209374915732896270028656829344431342347351239298259166739503425995868970697267332582735903121
- 2887466604514614878503461428277659916080903986525757172630818334944418201935333850712923457743755793
- 4406217871133006310600332405399169368260374617663856575887758020122936635327026710068126182517291460
- 8202541892885935244491070138206211553827793565296914576502048643282865557934707209634807372692141186
- 8954673227677513356901901537236690368653891612916888878764075254934942497334271811788927599315967193
- 5475898809792452526236365903632007085444078454479734829180208204492667063442043755532505052752283377
- 8887040804033531923407685630109347772125639088640413101073817853338316038135280828119040832564401842
- 0537467929926220376987180180611226244909092426419858208617511771137890516091403815750033664241560952
- 1632819712233502316742260056794128140621721964184270578432895980288233505982820819666624903585778994
- 0333152274817776952843681630088531769694783690580671064828083598046698841098135158654906933319522394
- 3632879239905348109878302745001720654336990661177845543646877236318444647680691428280045510746866453
- 9280539940910875493916609573161971503316696830992946634914279878084225722069714887558063748030886299
- 5118473187124777291910070227588893486939456289515802965372150409603107761289831263589964893410247036
- 0366450586872875890514068412381242473863854279082827338279733268855049358743031602747490631295723497
- 4261122151741715313361862241091386950068883589896234927631731647834007746088665559873338211382992877
- 6911495492184192087771606068472874673681886167507221017261103830671787856694812948785048943063086169
- 9487987031605158841082823512741535385133658953329486294944950618685147791058046960390693726626703865
- 1290520113781085861618888694795760741358553458515176805197333443349523012039577073962377131603024288
- 7200537320998253008977618973129817881944671731160647231476248457551928732782825127182446807824215216
- 4695678192940982389262849437602488522790036202193866964822156280936053731780408637272684266964219299
- 4681921490870170753336109479138180406328738759384826953558307739576144799727000347288018278528138950
- 3217986345216111066608839314053226944905455527867894417579202440021450780192099804461382547805858048
- 4424164047750315360549065914300781583724301231375115622840158386442708907182848167575271238467824595
- 3433444962201009607105137060846180118754312072549133499424761711563332140893460915656155060031738421
- 8701570226103101916603887064661438897736318780940711527528174689576401581047016965247557740891644568
- 6777171585005832699434016772021567677240681283665652641229824394651331973591997094032759385026695574
- 7023181320324371642058614103360652453693916005064495306016126782264894243739716671766123104897503188
- 5732165554988342121802846912529086101485527815277625623750456375769497734336846015607727035509629049
- 3924870884062810679436224187047470083688426710225583024035998416459511224852726336326451140173952480
- 8619463584078375355688562231711552094722306543709260679735100056554938122457548372854571179739361575
- 6167641692895805257297522338558611388322171107362265816218842443178857488798109026653793426664216990
- 9140565364322493013348679881548866286650523469972355747384248305904236771432787923164224038777643301
- 9260019228477831383763253612102533693581262408686669973827597736568222790721583247888864236934639616
- 4363308730139814211430306008730666164803678984091335926293402304324974926887831643602681011309570716
- 1419128306865773235326396536773903176613613159655535849993986005651559219367599777179330197446881483
- 7110320650369319289452140265091546518430993655349333718342529843367991593941746622390038952767381333
- 0617747629574943868716978453767219493506590875711917720875477107189937960894774512654757501871194870
- 7387367858902006173733210756933022163206284320656711920969505857611739616323262177089454262146098584
- 1023781321581772760222273813349541048100307327510779994899197796388353073444345753297591426376840544
- 2264784216063122769646967156473999043715903323906560726644116438605404838847161912109008701019130726
- 0710441141432419767968285478855247794764818029597360494397004795960402927462992035720997619501403483
- 1538094771460105633344699882082212058728151072918297121191787642488035467231691654185225672923442918
- 7128163232596965413548589577133208339911288775917226115273379010341362085614577992398778325083550730
- 1998184590259583559892605532996737704917224549353296833000022301815172265757875240588322490858212800
- 8974790932610076257877042865600699617621217684547899644070506624171021332748679623743022915535820078
- 0141165348065647488230615003392068983794766255036549822805329662862117930628430170492402301985719978
- 9488368971830438051821744191476604297524372516834354112170386313794114220952958857980601529387527537
- 9903093887168357209576071522190027937929278630363726876582268124199338480816602160372215471014300737
- 7537792699069587121289288019052031601285861825494413353820784883465311632650407642428390870121015194
- 2319616522684220037112304643006734420647477180213530701240988603533991526679238711017062218658835737
- 8121093517977560442563469499978725112544085452227481091487430725986960204027594117894258128188215995
- 2359658979181144077653354321757595255536158128001163846720319346507296807990793963714961774312119402
- 0212975731251652537680173591015573381537720019524445436200718484756634154074423286210609976132434875
- 4884743453966598133871746609302053507027195298394327142537115576660002578442303107342955153394506048
- 6222764966687624079324353192992639253731076892135352572321080889819339168668278948281170472624501948
- 4097009757609209837240900747179733407881418251958425980962417476101382526439551352593118850456362641
- 8830033853965243599741693132289471987830842760040136807470390409723847394583489618653979059411859931
- 0356168436869219485382055780395773881360679549900085123259442529724486666766834641402189915944565309
- 4234406506678519484177667794704720419588220432953803263105374948831221803912796784461001397267538921
- 9511911783658766252808369005324900459741094706877291232821430463533728351995364827432583311914445901
- 7809607782883583730111857543659958982724531925310588115026307542571493943024453931870179923608166611
- 3054262539958338979429716020703387678150330102801200959972522222808014235710947603519255444349299867
- 6781789104555906301595380976187592035893734197896235893112598390259831026719330418921510968915622506
- 9659119828323455503059081730735195503721665870288053992138576037035377105178021280129566841984140362
- 8727256232144287543022109094727210734741349755141907370433182766261772759968888260272252471336833534
- 5281669277959132886138176634985772893690096574956228710302436259077241221909430087175569262575806570
- 9912016659622436080242870024547362036394841255954881727272473653467783647201918303998717627037515724
- 6499222894679323226936191776416146187956139566995677830682903165896994307673335082349907906241002025
- 0613405734430069574547468217569044165154063658468046369262127421107539904218871612761778701425886482
- 5775223889184599523376292377915585744549477361295525952226578636462118377598473700347971408206994145
- 5807190802135907322692331008317595106590191212947954086036407573587502058902087045796700070552625058
- 1142066390745921527330940682364944159089100922029668052332526619891131184201629163107689408472356436
- 6808182168657219688268358402785500782804043453710183651096951782335743030504852653738073531074185917
- 7056103973950626403554422751561011072617793706347238049906669221619711942591204450846417463835899382
- 3994651739550900085947999013602667426149429006646711506717542217703877450767356374215478290591101261
- 9157555870238957001405117822646989944917908301795475876760168094100135837613578591356924455647764464
- 1786671153919513576961048649224900834467154863830544779143300976804868783481846727337584368927243104
- 4740680768527862558516509208826381323362314873333671476452045087662761495038994950480956046098960432
- 9123358348859990294526400284994280878624039811814884767301216754161106629995553668193123287425702063
- 7383520200868636913117334697317412191536332467453256308713473027921749562270146873258678917345583799
- 6435135880095935087755635624881049385299900767513551352779241242927748856588856651324730251471021057
- 5352516511814850902750476845518252096331899068527614435138213662152368890578786699432288816028377482
- 0355060160298940091197138501798716836337441392759736440170070147637066557035043381211135764150184518
- 2141361982349515960106475271257593518530433287553778305750956742544268471221961870917856078393614451
- 1383335649103256405733898667178123972237519316430617013859539474367843392670986712452211189690840236
- 3274114966012434830989299417380305884171666130730400675883804321115553794406054977217059428215148861
- 6567277124090338772774562909711013488518437411869565544974573684521806698291104505800429988795389902
- 7804383596282409421860556287788428802127553884803728640019441614257499904272009595204654170598104989
- 9675045119364711727722204361026140797508096869751766002371877483480161203102346805671126447661237476
- 2785219024120256994353471622666089367521983311181351114650385489502512065577263614547360442685949807
- 4396932331297127377157347099713952291182653485155587137336629120242714302503763269501350911612952993
- 7858646813072264860082708813335381937036825988678933212383270532976258573827900978264605455985551318
- 3668884462826513379849166783940976135376625179825824966345877195012438404035914084920973375464247448
- 8176184070023569580177410177696925077814893386672557898564589851056891960924398841569280696983352240
- 2256345704973122452693541938370048431833571965166267215755241934019330990183193091965829209696562476
- 6768365964701959575473934551433741370876151732367720422738567427917069820454995309591887243493952409
- 4441678998846319845504852393662972079777452814399418256789457795712552426826089940863317371538896262
- 8896294021121088844273765686245276121303710173007851357154045330415079594477761435974378037424366469
- 7324713841049212431413890357909241603640631403814983148190525172093710396402680899483257229795456404
- 2701757722904173234796073618787889913318305843069394825961318713816423467218730845133877219086975104
- 9428437693250249816566738162606159417682525099937416728839517440669325496534031014522253161890092353
- 7648637848288134420987004809622717122640748957193900291857330746010436072919094576799461492929042798
- 1687729426487729952858434647775386906950148984133924540394144680263625402118614317031251117577642829
- 9146445334089209769616990983726523617687456058947049681701369749095230720826828878907301900182534258
- 0534342170592871393173799314241085264739094828459641809361413847583113613057610846236683723769591349
- 2615824516221552134879244145041756848064120636520170386330129532777699023118648020067556905682295016
- 3549319923059142463962170253297475731140942201801993680350264956369558664259067626856873721103391567
- 9383989576556519317788300024161353956243777784080174881937309502069990089089932808839743036773659552
- 4891300156633294077907139615464534088791510300651321934486673248275907946807879819425019582622320395
- 1312520141099605312606965554042486705499867869230217469890095478507256729787947698888310934874644264
- 0071818316033165551153427615562240547447337804924621495213325852769884733626918264917433898782478927
- 8468918828054669982303689939783413747587025805716349413568433929396068192061773331791738208562436433
- 6353598634944968907810640196740744365836670715869245211829978938040771375012908586465789057714268335
- 8276897855471768718442772612050926648610205153564284063236848180728794071712796682006072755955590404
- 0233178749447346454760628189541512139162918444297651066947969354016866010055196077687335396511614930
- 9375709685545593815137895690392510149532656281470119983269922000663928753747131352364215892651262040
- 7288771657835840521964605410543544364216656224456504299901025658692727914275293117208279393775132610
- 6052881235373451068372939893580871243869385934389175713376300720319760816604464683937725806909237297
- 5234867029169104263692620901996052041210240776481903160140858635584276095370865581642739953493465463
- 1450404019952853725200495780525465625115410925243799132626271360909940290226206283675213230506518393
- 4057450112099341464918433323646569371725914489324159006242020612885732926133596808726500045628284557
- 5745965921205303413101118275013069615098355156320043107846019065654938065425252291619918199596027523
- 2770224985573882489988270746593635576858256051806896428537685077201222034792099393617926820659014216
- 5615925306737944568949070853263568196831861772268249911472615732035807646298116244013316737892788689
- 2290325933498617970219949819257396176730758344170985592221701718257127775344915082052784309046194608
- 3521740200583867284970941102326695392144546106621500641067474020700918991195137646690448126725369153
- 7162290791385403937560077835153374167747942100384002308951850994548779039346122220865060160500351776
- 2648316111533255877050735412792499098593734737870811942530551214369797499149518605359204038302357163
- 5272763087469321962219006426088618367610334600225547747781364101269190656968649501268837629690723396
- 1276287223041141813610060264044030035996988919945827397624114613744804059697062576764723766065541618
- 5746905272292382282751867991569833907476711461030227766060200612468764777288190967916133540198814027
- 5799217416767879923160396356949285151363364721954061117176738737255572852294005436178517650230754469
- 3869307873499110352182532929726044553210797887711449898870911511237250604238753734841257086064069052
- 0584521227545338480082053024504565176695185769132000428167580549248117805198326460324457928297301291
- 0531838563682120621553128866856495651261389226136706409395333457052698695969235035309422454386527867
- 7673027540402702246384483553239914751363441044050092330361271496081355490531539021002299595756583705
- 3812619656831442860579566966221547216956208700137277685369608407048333251327931122325071486302069512
- 4539500373572334680709465648308920980153487870563349109236605755405086411152144148143463043727327104
- 5027768661953107858323334857840297160925215326092558932655600672124359464255065996771770388445396181
- 6328796144608177892721718369088801267782074301064225246348074543004764928855534090621851536543554741
- 2547615276977266776977277705831580141218568801170502836527554321480348800444297999806215790456416195
- 7212784508928489806426497427090579129069217807298769477975112447305991406050629946894280931034216416
- 6299356148281309988707452927160484336308184041264696379258430941854422163590845761460785585624738149
- 3142707826621518554160387020687698046174740080832434366538235455510944949843109349475994467267366535
- 2517662706772194183191977196378015702169933675083760057163454643671776723387588643405644871566964321
- 0412825956453498413884128904206820470076155969168430389993483667935425492103281133631847225923055543
- 8305820694167562999201337317548912203723034907268106853445403599356182357631283776764063101312533521
- 2141994611869350833176587852047112364331226765129964171325217513553261867681942338790365468908001827
- 1352835848884441117612341011799187092365071848578562210211040097769944531217950224795780695065329659
- 4038398736990724079767904082679400761872954783596349279390457697366164340535979221928587057495748169
- 6694062334272619733518136626063735982575552496509807260123668283605928341855848026958413772558970883
- 7899429105498003311138846034019391661221866960584915714857335682861495000190975911252188003964197621
- 6355937574371801148055944229873041819680808564726571354761283162920044988031540210553059707666636274
- 9328308916880932359290081787411985738317192616728834918402429721290434965526942726402559641463525914
- 3484006758676903503823205729341329815935330444464968294413673234421583807616948312193331198190610961
- 4295220153617029857510559432646146850545268497576480780800922133581137819774927176854507553832876887
- 4474591593731162470601091244609829424841287520224462594477638749491997840446829257360968534549843266
- 5368628444893657041118177938064416165312236002149187687694673984075171763075168498563592014868929431
- 0594020245796962292456664488196757629434953532638217161339575779076637076456957025973880043841580589
- 4336137106551859987600754924187211714889295221737721146081154344982665479872580056674724051122007383
- 4592715757277152185899469481179406444663994323700442911407472181802248258377360173466853007449855647
- 1542003612359339731291445859152288740871950870863221883728826282288463184371726190330577714765156414
- 3822306791847386039147683108141358275755853643597721650028277803713422869688787349795096031108899196
- 1433866640684506974207877002805093672033872326296378560386532164323488155575570184690890746478791224
- 3637555666867806761054495501726079114293083128576125448194444947324481909379536900820638463167822506
- 4809531810406570254327604385703505922818919878065865412184299217273720955103242251079718077833042609
- 0867942734289557355592527238055114404380012390416877164451802264916816419274011064516224311017000566
- 9112173318942340054795968466980429801736257040673328212996215368488140410219446342464622074557564396
- 0452985313071409084608499653767803793201899140865814662175319337665970114330608625009829566917638846
- 0567629729314649114937046244693519840395344491351411936679333019366176636525551491749823079870722808
- 6085962611266050428929696653565251668888557211227680277274370891738963977225756489053340103885593112
- 5679991516589025016486961427207005916056166159702451989051832969278935550303934681219761582183980483
- 9605625230914626384473862960398489243861872985077759287927220685548072104978176532862101874767668972
- 4884113956034948037672703631692100735083407386526168450748249644859742813493648037242611670426687083
- 1925040997615319076855770327421785010006441984124207396400139603601583810565928413684574119102736420
- 2741637234882145241013477165296031284086584197879511165115298278146203791398550063999603265912485253
- 0849369031313010079997719136223086601109992914287124938854161203802041134018888721969347790449752745
- 4288072803509305828754420755134816660927879353566521255620139988249628478726214432362853676502591450
- 4683776352825876521391564809721419296755493843755826002531685363567313792624758780494459441834291727
- 5698837622626184636545274349766241113845130548144983631178978448973207671950878415861887969295581973
- 3250699951402601511675529750575437810242238957925786562128432731202200716730574069286869363930186765
- 9582513264991459502609170693475194089753574640168308117988464524736189560564794263580705625632811892
- 6966302647953595109712765913623318086692153578860781275991053717140220450618607537486630635059148391
- 6467656723205714516886170790984695932236724946737583099607042589220481550799132752088583781117685214
- 2693347869218952406226579210436203488529262679840139532164587911515790504605797108389833718640380244
- 1751134722647254701079479399695355466961972676325522991465493349966323418595145036098034409221220671
- 2567698723427940708857070474293173329188523896721971353924492426178641188637790962814486917869468177
- 5917171506691114800207594320120619696377951032270890295660855622254526026104607361313688690092817210
- 6819861855378098201847115416363032626569928342415502360097804641710852553761272890533504550613568414
- 3775854429677977014660294387687225115363801191758154028120818255606485410787933598921064427244898618
- 9616294134180012951306836386092941000831366733721530083526962357371753307386533382048421903081864491
- 8409372394403340524490955455801640646076158101030176748847501766190869294609876920169120218168829104
- 0870709560951470416921147027413390052253340834812870353031023919699978597413908593605433599697075604
- 4601342424536824960987725813110247327985620721265724990034682938868723048955622532044636026398542252
- 5841646432427161141981780248259556354490721922658386366266375083594431487763515614571074552801615967
- 7048442714194435183275698407552677926411261765250615965235457187956673170913319358761628255920783080
- 1852068901515047133403861003100559148178521103847545429333891884441205179439699701941126951195265649
- 1959418997541839323464742429070271887522353439367363366320030723274703740712398256202466265197409019
- 9762452056198557625760008708173083288344381831070054514493545885422678578551915372292379555494333410
- 1744201696000906964156127322977702212179518683763590822551288164700219923488640439591530184640047143
- 2118636062252701154112228380277853891109849020134274101412155976996543887719748537643115822983853312
- 3071751132961904559007938064276695819014842627991221792947987348901868471676503827328552059082984529
- 8062592503521284519259279865935061329619467962523739725655841578537445675589980324054921869628884903
- 3256085145534439166022625777551291620077279685262938793753045418108072928589198971538179734349618723
- 2927614747850192611450413274873242970583408471112333746274617274626582415324271059322506255302314738
- 7592517247873228814914559156050363345754242337791603749525024930223514819613811625639114156103268449
- 5807250827343176594405409826976526934457986347970974312449827193311386387315963636121862349726140955
- 6079920628316999420072054811525353393946076850019909886553861433495781650089961649079678142901148387
- 6456821749140756237676184537751440314754112067601607264605568592577993220703373333989163695043466906
- 9482843662998003741452762771654762382554617088318981086880684785370553648046935095881802536052974079
- 3538676511195079373282083146268960071075175520614433784114549950136432446328193346389050936545714506
- 9008644834401804283633905135781572739733345372842633721740657757710798305175557210367959769018899584
- 9413019599957301790124019390868135658553966194137179448763207986880037160730322054742357226689680188
- 2123424391885984168972277652194032493227314793669234004848976059037958094696041754279613782553781223
- 9476461478329269765451622902817011004378460387565441517394339600489153188175766505009516974024156447
- 7129365661425394936888423051740012992055685428985389794266995677702708914651373689220610441548166215
- 6804219838476730871787590279209175900695273456682026513373111518000181434120962601658629821076663523
- 3617740078377834237091526440630540718078433580610729611055500204151316963730468492133568372654003075
- 0982908936461204789111475303704989395283345782408281738644132271000296831194020332345642082647327623
- 3830294639378998375836554559919340866235090967961134004867027123176526663710778725111860354037554487
- 4186935197336566217723592293967764632515620234875701137957120962377234313702120310049651521119760131
- 7641940820343734851285260291333491512508311980285017785571072537314913921570910513096505988599993156
- 0863655477403551898166733535880048214665099741433761182777723351910741217572841592580872591315074606
- 0256349037772633739144613770380213183474473011130326702969173350477016321066162278300272692833655840
- 1179141944780874825336071440329625228577500980859960904093631263562132816207145340610422411208301000
- 8587264252112262480142647519426184325853386753874054743491072710049754281159466017136122590440158991
- 6002298278017960351940800465135347526987776095278399843680869089891978396935321799801391354425527179
- 1022539701081063214304851137829149851138196914304349750018998068164441212327332830719282436240673319
- 6554692677851193152775113446468905504248113361434984604849051258345683266441528489713972376040328212
- 6602535166939140820499473204860216277597917712347510975024030789357599377150950217516935558270725339
- 1189233407022383207758580213717477837877839101523413209848942345961369234049799827930414446316270721
- 4796117456975719681239291913740982925805561955207434243295982898980529233366415419256367380689494201
- 4712413405250722040617943552525552250087487900865683145428351677505422948032747830440564385815919526
- 6675828292970522612762871104013480178722480178968405240792436058274246744307672164527031345135416764
- 9668901274786801010295133862698649748212118629040337691568576240699296372493097201628707200189835423
- 6903641492702369619385473724803298550451120891928798298744678641291594175316756025334353106267452545
- 0711418148323988060729714023472552071349079839898235526872395090936566787899238371257897624875599044
- 3228895388377317348941122757071410959790047919301046740750411435381782464630795989555638991884773781
- 3413470702467473621120489862269918885174562517325193413520381158633501239130544419100736284475675141
- 6105041097350585276204448919097890198431548528053398577784431393388399431044446566924455088594631408
- 1751220331390681596592510546858013133838152176418210433429788826119630443111388796258746090226130900
- 8499754303957712432306169062629194039214397402708947776637024881554993224588259790206312574369109463
- 9325280624164247686849545532493801763937161563684785982371590238542126584061536722860713170267474013
- 1145261063765383390315921943469817605358380310612887852051546933639241088467632009567089718367490578
- 1630851581381619668822220475704375906143380407258538620835651769984267745231958241826836982701602374
- 1493836349662935157685406139734274647089968561817016055110488097155485911861718966802597354170542398
- 5135560018720335079060946421271143993196046527424050882225359773481519135438571253258540493946010865
- 7937980586201433660788252197178090258173708709164604527279771535099103407364250203863867182205228796
- 9445838765294795104866071739022932745542678566977686593992341683412227466301506215532050265534146099
- 5249356050854921756549134830958906536175693817637473644183378974229700703545206663170929607591989627
- 7324230902523974438610142630986877339138825186843165010279649114977375828889134503411488659486702154
- 9210108432808078342808941729800898329753694064496990312539986391958160146899522088066228540841486427
- 4786281975546629278814621607171381880180840572084715868906836919393381864278454537956719272397972364
- 6516675920110579956639625985355127635587681402134098290162968734298507924718460568748283313812591619
- 6247615690287590107273310329914062386460833337863825792630239159000355760903247728133888733917809696
- 6601469615031754226751125993315529674213336300222964906480934582008181061802100227664580400278213336
- 7585730190113717546727630590443531313190360924890972464279284555499134900051802957070829190525567818
- 8991389962513866231938005361134622429461024895407240485712325662888893172211643294781619055486805494
- 3441034090680716088028227959686950133643814268252170472870863010137301155236861416908375675747637239
- 7631857570381094433905645644685241830281481079983769185121272019350440418046047216269394457883770901
- 0597469321972055811407877598977207200968938224930323683051586265728111463799698313751793762321511125
- 2349734305240622105244234353732905655163406669506165892878218707756794176080712973781335187117931650
- 0331555238224877306534441794534153952024244497034101208740721881093882681675120422994049481794494727
- 3289477011157413944122845552182842492224065875268917227278060711675404697300803703961878779669488255
- 5614674384392570115829546661358678671897661297311267200072971553613027503556167817765442287442114729
- 8816148027052438068176535732755786025058470840132088379328160087690813004924914736825170353822196190
- 3901499952349538710599735114347829233949918793660869230137559636853237380670359114424326856151210940
- 4259582639301678017128669239283231057658851714020211196957064799814031505633045141564414623163763809
- 9044028162569175764891425697141635984393174332702378123369380430128926263753826677950341693343236075
- 0024817574180875038847509493945489620974048544263563716499594992098088429479036366629752600324385635
- 2945844728944547166209297495496616877414120882130477022816116456044007236351581149729739218966737382
- 6472047226422212420165601502849713063327958143025160136948255670147809357908896571349261581613469018
- 0696508955631012121849180584792272069187169631633004485802010286065785859126997463766174146393415956
- 9539554203314628026518951167938074573315759846086173702687867602943677780500244673391332431669880354
- 0732323882818475010516413311895370364884226902704780527424906034920829547550540034571601840725745369
- 3814553117535421072655783561549987444748042732345788006187314934156604635297977945507535930479568720
- 9316724536547208381685855606043801977030764246083489876101345709394877002946175792061952549255757109
- 0385251714885252656710453498134198033906415298763436954202560802776144219143189213939088345431317696
- 8510184010384447234894886952098194353190650655535461733581404554483788475252625394966586999205841765
- 2780125341033896469818642430034146791380619028059607854888010789705516946215228773090104467462497979
- 9926271209516847795684825833414022664772108433624375937416105367340419547389641978954253350363018614
- 0095153476696147625565187382329246854735693580289601153679178730355315937836308224861517777054157757
- 6561759358512016692943111138863582159667618830326104164651714846979385422621687161400122378213779774
- 1312689772667129920259220174087700769562834739322010881593562862819285635718933849588506038531581797
- 6067947984087836097596014973342057270460352179060564760328556927627349518220323614411258418242624771
- 2012035776388895974318232827871314608053533574494297621796789034568169889553518504478325616380709476
- 9516990862471000197488092050095219436323787197648703392238115403634754886268459561597551937654101150
- 1406700122692747439388858994385973024541480106123590803627458528849356325158538438324249325266608758
- 8908318700709100237377106576985056433928854337658342596750653715005333514489908293887737352051459333
- 0496265314151413861244379358850709446880454869753581702129084907873478068143663233228194158273456713
- 5644317153796781805819585246484008403290998194378171817730231700398973305049538735611626102399943325
- 9780126893432605584710278764901070923443884634011735556865903585244919370181041626208504299258697435
- 8170981338940459344719374938776242324098528327622666049423851297094532455862521036008292866497241749
- 1914198896612955807677097959479530601311915901177394310420904907942444886851308684449370590902600612
- 0649425744710353547657859242708130410618546219881830090634588187038755856274911587375421064667951346
- 4875867715438380185213482819158124625993351601989355951679689328522058247994210345127158771633452229
- 9541883968044883552975336128683722593539007920166694133909116875880398882886921600237325736158820716
- 3516271332810518187602104852180675526648673908900907195138058626735124312215691637902277328705410842
- 0378415256832887180469879525130732663402785190594173389203585403956770356113293544825856282876106106
- 9822972142096199350933131217118789107876687204454887608941017479864713788246215395593333327556200943
- 9580434537919782280590395959927436913793778664940964048777841748336432684026282932406260081908081804
- 3909145563519368560630450891422896452199877988493474777291327972660276584016678901364905087411421268
- 6196986204412696528298108704547986155954533802120115564697997678573892018624359932677768945406050821
- 8838227909833627167124490026761178498264377033002081844590009717235204331994708242098771514449751017
- 0556430295428218196700092025156158441742059336581481349026931115170938722600264586305613256057925609
- 2733226557934628080568344392137368840565043430739657406101777937014142461549307074136080544210029560
- 0095663588977899267630517718781943706761498217564186590116160865408635391513039201316805769034172596
- 4536923508064174465623515239290504094799531840748621512105618338545661766526063937136588025216662235
- 7613220194170137266496607325201077194793126528276330241380516490717456596485374835466919452358031530
- 1969160480994606814904037819829732360930087135760798621425422096419004367905479049930078372421581954
- 5354183711293686584305538427176280352791288211293083515756565999447417884383815651484342298587042455
- 9243469329523282180350833372628379183021659183618155421715744846577842013432998259456688455826617197
- 9012180849480332448787258183774805522268151011371745368417870280274452442905474518234674919564188551
- 2444213377835214238659799259882032870851093383868299065719946149062902574276860388505110326385445404
- 1918495886653854504057132362968106914681484786965916686184275679846004186876229805556296304595322792
- 3051616721591968675849523635298935788507746081537321454642984792310511676357749494622952569497660359
- 4739624309953433104049942096778838270027144784940690370732491064441516960532565605867787574174721108
- 2743577431519406075798356362914332639781221894628744779811980722564671466405485013100965678631488009
- 0303749338875364183165134982546694673316118123364854397649325026179549357204305402182974871251107404
- 0116114058999110930624923128131163405492625713567218186289327861388337180285350565035919527414008695
- 1092616754147679266803210923746708721360627833292238641361959412133927803611827632410600474097111104
- 8140003623342714514483334641675466354699731494756643423659493496845884551524150756376605086632827424
- 7941360628760412906449138285194564026431532258586240431418386695906332450630003922131926476259626915
- 1090445769530144405461803785750303668621246227863975274666787012100339298487337501447560032210062235
- 8029343774955032037012738468163061026570300872275462966796880890587127676361066225722352229739206443
- 0935243272281008599730951325286306011054979156447918450046180467624089289256809129305929606423570210
- 6152464620502324896659398732493396737695202399176089847457184353193664652912584806448019652016283879
- 5189499336759241485626136995945307287254532463291529110128763770605570609531377527751867923292134955
- 2451330898679691651290738413021675732386375758200803635757280027544903279530799007994425411087256931
- 8801466793559583467643286887696661009739574996783659339784634695994895061049038364740950469522606385
- 8046758073069912290474089879166872117147527644711604401952718169508289733537148530928937046384420893
- 2997711258568408466083399340456890267875160087754612679880154658565220612109534907967073655397025761
- 9943137663996060606110640695933082817187642604357342536175694378484849525010826648839515970049059838
- 0812105221111091943323951136051446459834210799058082093716464523127704023160072138543723461267260997
- 8703856570919985075956346132484601884098501942876879022687345565005191215465440638292538512763176639
- 2205093834520430077301702994036261543400132276391091298832786392041230044555168405488980908077917463
- 6092439334912641164240093880746356607262336695842764583698268734815881961058571835767462009650526065
- 9292635482914990457683072108932458570737016607173981944850288426039636607460311847862258310565808708
- 7030556759586134170074540296568763477417643105175103673286924555858208237203860178173940517513043799
- 4868822320044378043103170921034261674998000073016094814586374488778522273076330495383944345382770608
- 7607635420984450083062476302535727810327834617669705442871553153400164970766571959850417481990872014
- 9087568603778359199471934335277294728553792578768483230110185936580071729118696761765505377503029303
- 3830706448912811412025506150896411007623824574488655182581058140345320124754723269087547507078577659
- 7325428444593530449920700145387489482265564422236963655441942254413382122254774975354946248276805333
- 3698328415613869236344335855386847111143049824839899180316545863828935379913053522283343013795337295
- 4016257623228081138499491876144141322933767106563492528814528239506209022357876684650116660097382753
- 6604054469416534222390521083145858470355293522199282727605748212660652913855303455497445514703449394
- 8686342945965843102419078592368022456076393678416627051855517870290407355730462063969245330779578224
- 5949710420188043000183881429008173039450507342787013124466860092778581811040911511729374873627887874
- 9074652855654347488868310641100510230208751077689187815256227352515503795324448577872776170019648537
- 0355516765520911933934376286628461984402629525218367852236747510880978150709897841308624588152266096
- 3551401874495836926917799047120726494905737264286005211403581231076006699518536124862746756375896225
- 2991164960668765082617341784847893372950567390078786179253514406210453662506404637288156982323175005
- 9626108092195521115085930295565496753886261297233991462835847604862762702730973920200143224870758233
- 7354915246085608210328882974183906478869923273691360048837436615223517058437705545210815513361262142
- 9118156153017588825735948925071088792621286413924433093837973338678061317952373152667738208580247014
- 3352700924380326695174211950767088432634644274912755890774686358216216604274131517021245858605623363
- 1493164646913946562497471741958354218607748711057338458433689939645913740603382159352243594751626239
- 1886853078228217639832373061802042465604775279431047961897242995330297924974816840528937910449470045
- 9086499187272734541350810198388186467360939257193051196864560185578245021823106588943798652243205067
- 7379966196955472440585922417953006820451795370043472451762893566770508490213107736625751697335527462
- 3029430312035962609534235743972496592110106578178261087453188748031874308235736991951563409571627009
- 9244492974910548985151965866474014822510633536794973714251022934188258511737199449911509758374613010
- 5505064197721531929354875371191630262030328588658528480193509225875775597425276584011721342323648084
- 0271433563675420463751825525249443296570438613878659019657388028684018940876728167141370336617326501
- 2057865391578070308871426151907500149257611292767519309672845397116021360630309054224396632067432358
- 2797889332324405779199278484633339777737655901870574806828678347965624146102899508487399692970750432
- 7530299728722973279344429886464127253481606037797072982991730292963086958019963124133049393504933254
- 1235507105446118259114111645453471032988104784406778013807713146540009938630648126661433085820681139
- 5838319169545558259426895769841428893743467084107946318932539106963955780706021245974898293564613560
- 7889834724199794785643620420946134123876131988653523583129968622689486084084566556068769545012744866
- 3140505473535174687300980632278046891224682146080672762770840240226615548502400895289165711761743902
- 0337584877842911289623247059191874691042005848326140677333751027195653994697162517248312230633919328
- 7079838007484857265161234349332733566644733585564302352808839243482787608861649432893991663992104883
- 0784777704804572849145630335326507002958890626591549850940797276756712979501009822947622896189159144
- 1520032283878773485130979081019129267227103778898053964156362364169154985768408398468861684375407065
- 1210390625061281076637990479088796747780697384731704752534421563903872012388063236880370179493089549
- 0077633152306354837425681665336160664198003018828712376748189833024683637148830925928337590227894258
- 8060087286038859168849730693948020511221766359138251524278670094406942355120201568377778851824670025
- 6517085092496237477268136942843500629388144299879053010562173754591826799732177350293689280652100253
- 9626880749809264345801165571588670044350397650532347828732736884086354000274067678382196352222653929
- 0939807367391364082898722017776747168118195856133721583119054682936083236976113450281757830202934845
- 9829250008956826302712632958662921476531422333517930933879513570953463771836840924444220963193312956
- 2030557551734006797374061416210792363342380564685009203716715264255637185388957141641977238742261059
- 6667396997173168169415435095283193556417705668622215217991151355639707143312893657553844648326201206
- 4243380169558626985610224606460693307938478588143674070005997697036490192733288261353293631124036506
- 9865216063898725026723808740339674439783025829689425689674186433613497947524552629142652284241924308
- 3388103580053787023999542172113686550275341362211693140694669513186928102574795985605145005021715913
- 3177516099578655519818861932112821107094422872404424811534060558959583558152320121846058205635926993
- 0347885113206862662758877144603599665610843072569650056306448918759946659677284717153957361210818084
- 1547273142661748933134174632662354222072600146012701206934639520564445543291662986660783089068118790
- 0908152950636267820756143888157813511346953663038784120923469428687308393204323338727754968052103028
- 2154432472338884521534372725012858974769146080831440412586818154004918777228786980185345453700652665
- 5649170915429522756709222217474112062720656622989806032891672068743654948246108697367225547404812889
- 2424718543236057534116728507575520571311566979545848873987422281358879858407831350605482905514827852
- 9489112190538319562422871948475940785939804790109419407067176443903273071213588738504999363883820550
- 1683402777496070276844880281912220636888636811043569529300652195528261526991271637277388418993287130
- 5634646882273982887631986457098363089177864870866761854856800476725526754147428510281458074031529921
- 9781455775684368111018531749816701642664788409026268282444825802753209454991510451851771654631180490
- 4567985713257528117913656278158111288816562285876030875974963849435275676612168959261485030785362045
- 2745077529506310124803418045840594329260798544356200937080918215239203717906781219922804960697382387
- 4331262673030679594396095495718957721791559730058869364684557667609245090608820221223571925453671519
- 1834872587423919410890444115959932760044506556206461164655665487594247369252336955993030355095817626
- 1762318495619064948396730020377638743693439998294302091470736189479326927624451865602395590537051289
- 7816345542332011497599489627842432748378803270141867695262118097500640514975588965029300486760520801
- 0491537885413909424531691719987628941277221129464568294860281493181560249677887949813777216229359437
- 8110044480607976724292762495107841534464291508427645200020427694706980417758322090970202916573472515
- 8290463091035903784297757265172087724474095226716630600546971638794317119687348468873818665675127929
- 8575016363411314627530499019135646823804329970695770150789337728658035712790913767420805655493624646
- 4126002437968454377733902647251281941632007684873625176406596754069362175887930785591647877727473927
- 2002910342949562447661308200729250734529170764226621047673037863169954237455117456522022783324096803
- 5246676631908610112067458562873174135111622920788651329412448154716281820798771683463413223622341177
- 8823102765982510935889235916205510876329808799316517252893800123781743489683215159056249334737020683
- 2232100118637395770567473867102173212375224325241626358034376253606808669163571594551527817803921774
- 3228234366337728111863905118930759016666507429527583840085446354193171905313636597249051584091065822
- 0181473479902235906713814690511605192230126948231611341743994471483304086248426913950233671341242512
- 3864026657258130943967621939655407386524229897879782198637918299709557924747320303239116410445906907
- 9778623155183495930353059237898175158914576504080251094791234217584828418819501385461656803017550355
- 8005494489488487135160537559340234574897951660244233832140603009593710558845705251570426628460035440
- 2823678768550982678161765520375795655481677896038927498355608791541177749423573400764161093294003899
- 9821992672570869573260687749742248020233075251876502559684207606932299885875798988964607443817881700
- 8154889522651672283404527721910699141576463948523112679473086580319507645519767562895742888179681209
- 0026387145257858315277615109088631740243695680567873015235427804793414266495223833707117511265375503
- 9423720987846680491394734465307140796225972871305030772587148755705025825734668666138023514260561161
- 9740554343654869800544487929597028759035225840978268359866644658604569424139072909526624993290297344
- 0568160683805726626057277088407073471496060064561454070734432782514087474275506722304845357006092214
- 3900029929816082117170479176145051910081326703752149307405678533111060583529127810073917499491978451
- 1291591368110739405517520801963053935074024850955377250036705466516233043042508744232426240463211507
- 8997336929985407041656261041976700202415094892411856092409637604429612002364590706449770627207919019
- 2359648070489236369798601982830872842285647523531628827913242955248144475055219096720460806895451817
- 1220493032185374062724742151974030576904360268636078079200477623242955182947352202724437633902772139
- 2087767065716241639751785859254426923428535274328856336850789651962072519416556061870370550218462845
- 4342578503830000953745182929584404649188386857934839611512971605816657450967036774958366666931218817
- 6367964494361713041603724305065848513174926405585519401800518090847521186822461697614924323831948643
- 4415908558011073070311201502243416073157929528752936835820397003389112114170685219366589789459503154
- 3895890153038271430019295890741499435928940830970770783628759144840370450386189669758112018523192318
- 6865996803858381237032915620757883594878094168820553160512819015264759280757495815456422134145937816
- 7056992868299895611982353837157880480478704584175394665497690173220310890070303362911767308448450372
- 1456696444014695451738574341578101586187838392785526093991305702555755590609470514980934877733200727
- 9757303824598946680968082222134848587382299928179409082566520958165547247524456674369759447468637633
- 2428904269776106791933910983300422310293728298798903209391092682836306173610173878123679898645149311
- 7024371282858826304862988844922074156406071470591374055246657569718702173552872454394277148091793644
- 3765063786186132434863579741125852086345992780368879249835436329845768765016506511534500869572123950
- 7544785683173631557153527046524235259737513408825461609661440746675514226836031959801072152463551069
- 1718713357316854856312808578344356236709596509499469688206611851180860342028213318012494109915026014
- 3545001743273079362511307029825049941799428445114647932915459955590958780762163666859179106543596606
- 5253525320273650725989121255686842802077246487722010996631829559552903393312284364864475973560859840
- 7609472983895424339326231532399189818522641808312963335463568748288634656185048106322888055967378445
- 6200094146560349928087940511531005758712955257196411150685034077371060438037125957559698594936205847
- 7512026354947347534748189262254190352671614429284899857536740692165271630086060654373736823556588626
- 4863436891532180955722044567771373683104580755845296128328326063196297285279666743629748008213186279
- 2186904428434263073576070399966943078950814726973025381737569492275179535432615691204059483286094999
- 2366412287881226419148504856328072066418557059520375030322916894489427578306090910852410601400683274
- 2055839697738231507349961087587637042555649640868550719422563449667324306562592504745817627332818160
- 1701969816654242637876360145303594653845032547667499973734083566513818602515652028363738917101654541
- 4882674448009105704186162626837971120886141357279611099088292970229692128180978798951391504270936786
- 4449831964201345668339087759430064424856230121246145116979219396344095080832292812942704365991464827
- 4998437594211302041829730841717881309037955854560324717081919530277146579455547554475428443440813938
- 8908609776017857389307518661906505018077165001840744325854024184360501118242990702323417243674525365
- 3495947990633345407543718126993998337192184854187359798453489345922685150681826624900780293350126588
- 2497422624188535252663670282766249934982948874833106176420842901692305289960897860413006510902817980
- 5040587107671179041130217482796682353001960220253185576789843317586806378359968791601538922220236575
- 7655815866114091993948615992091599175533417830333476431316350127053906970793265678124159064342847213
- 6023521823674121473312449994433415591527431593168747788253315509277033620290122259779480985539220006
- 4527162280855398278906584233447552821276517650572663267691141075034845871896996434875775138479148183
- 6351006214668185850963488870814569767220201679911994624177766889079171368659459607264685388107787830
- 0216136827669702622345941873747673353799888440342704680304255169412715873932039844437460454781611305
- 6625176412759821181939661101850562880555942566060032312116180994622129301002470913347150682268430458
- 6803009042428616820255621409460879000651910994955708158165058289833407394660844575657806366902728434
- 6201858732825292479650528668140850353851983752363745192562279549029055790703028395010485483592983454
- 2814487304358047053315081510503001521428117175393649133166172621235405527863308002083177055630294963
- 5942016543330940941771963262341193871051615701017980535516793708602913667569860971241203685838129576
- 9530779814136570017476135696698614606849143969957383763169582460251334210807262171360194301808720988
- 8551415024163818325975259593165531865833117126857941527206612218422661411825154657484878312610347834
- 5467492583087299854474212064450952332450508774314961665552517971680209917200264093749219075699368963
- 3028139164720896358177173555584859270652450486251641954055080134351032338981337830249770182275490638
- 1499964723334079613041469739476372650869273347108415685608430921316240434629863920841660055904598506
- 4912435052647660676003444416181864036700837741141010943205889555986586700778636718969440896223213740
- 3411359719913313594655368544669236765258901210841377743248219181274784789228726489297003237187345615
- 7981599834839100412601050746964599430331978810634913923812490503061433407918328004063907098672596197
- 0983112659601474737253305268537177421465540058739246237276173649051987133680677239525707813606866832
- 6139501432950947485159472466752720168431658660880751276858475554118438116901162200555211348448896066
- 8259227431319007963011587084670117654935393046563356225311244727796669005831190616101972663073970542
- 5314398184573794494867801346182178759390769996020290839656772878469057364015640150476964489939475414
- 7460833991869688927115694234549265124664550779255402810503762203596753055860185649205606287909076945
- 3339208808849477828894851122154743230191383245562993881020614490266876010207753210915684977830740859
- 6498579671526170100394754945399176987913235465501064073558169994097562481499674432784292027626441897
- 9391815839456270817330158216022551965989876937616401986120746675504886111085572676450705262244613022
- 2335852072273620485057289238815884938754535229186399714380884061757286220950122506515863104258884134
- 3554319737298562177530720226294755524830444453404348888785811703413453425223543194078779728467601815
- 8322709774518092934219318981581248283265895004070485520609989378390034191416304463916388054965878650
- 1375046341695655156618298878630705842306967660254053024811471007899784211830489010464056896539702885
- 5955309255586360521589573751140895649058441567749371058596480143158746144912505492531911646538215851
- 9737009328019453032057262845265804604633781663142993307664664653076059054896288872418971606022588261
- 7577539922055131509377200624863085562820493575752724995567089221634233983602565328731029194007041176
- 9192208500151167356701019589710017970195781208929109694177543699043682025630240548226254019056965077
- 1058157424072149633956036527028333440730575007367456226058464988611510168961218111905847171446106871
- 9761017456587373796740697137423238753839030317200200207205928488785123911746471673743737923283881966
- 2016876221913462338937625995270256721386221124589802121305014072889043003225355040958668187241393699
- 3819306914874471718664618311194260316166407037731648700186479960024304400324224180940227853330901150
- 9880870678268835317200767522553138008818780431690190072804831799287414125476123089606833095828377667
- 6882875786886830929760010119745338983319525886196301329170943858166153741717944963191771543125069598
- 5348128568461937766989427745917091880252001274990555940728969659479333167224362156789677696670803522
- 9039018485730806275670867658627104769409203565593025352743418965927002227049233186829991560936413757
- 0049885373045963961527346293969749517480626964517930187199867885375814159757993148066085572325683743
- 0528276417567005028804048942989958094810353483393414492788592526219241554723199714338508663732092663
- 2728243514933640704589683852345624744361175256766987767597223439206357507471552918102762614012992480
- 4228839902978799254185174991296302839907296355885798905933177959087690739056460256235335672215522594
- 6883829845288292296627513716242217295467867071584092418408414755758253938524096330205134970474069539
- 9567897981727860920462286839735779815111868152659884606949758965481314651150392626377749513761557248
- 1951161198772503445647107385134359273555387124623755981938132142384415819290700463897716838872079163
- 6174143249707910965816274642971707287172514274589835689709553462682016908535610894489840710058192030
- 2176945120771774588795519510473384184739980796306767885845167575729904306971542642383498009870869933
- 6709121083944535062459224323123482785496603746571880148929379451478705406079245759006012196221239287
- 2001721558866634573497140953372115165598575794172441988902616701610161155783431502546032878119842402
- 7484608510722406676778760855247617773833089502610064388350550205456324346167859451941795669874968515
- 2448838475136181806671083161655642093692705206118985172926171417144346555087063060635510129494003097
- 5916779915842604919712095432270267843265429657240327208871432199964531320258710967716512854966996255
- 2698607311763718207498827399770601991362093083230736838206455732563765982912578131492224220427971241
- 4416299512659456397927593803838047826231604243253991328511230322470375619423217330478540785762440132
- 9171799297924078339071575798142681686465538294684739920588863165593491986789696284044734496802407709
- 2831376408103352255242717404107673565424441004483347440101726441052954787296345898640501203608024451
- 1903509949744939736171815752770937802092366681358416362683192634067141827974213425462207054156000509
- 5967404561684045177174795279035325493258912048338574659009678173041600052108893461076875400424197780
- 3082885181200173369559127137714195011361304409753279190504891583246399143483531648681548579178632935
- 1239255525102111827885736960602769313014696614334496423021143824837056335327938588952676720766889712
- 7443581563208810665014956814355879657690985776590276870745365927636497555344961730807816098710324801
- 3795136170367763457594975686208013996374551762425147780628722265971455482906769295713643572152674468
- 9878894188207512922257565091435528288746141950978624275278815715664007637210378031940430958442725492
- 6998716923433189002214150311399876526068876156674021019720171960239086108297492763956954115303227546
- 0173870795625993579785302443476716399591462317931239989986928437975702492369551587297683854005227651
- 4956144471059719628898881571094151717015181147435136438540051162462021311748007919837497001004713634
- 3252328157891135545045337190527506822915618500332846956792622620819044247334036250389279207158596003
- 9363153368842724375366799698647934741133198328619441460653922784099903143840354565047056789552024827
- 1760118743356436902435030856313095590552503904927316133117349225846446090245350791901844112993216997
- 7045183285358648042855682220873721361649058630325636891308410376021567992702000532235543980465311933
- 9775459044045078568021398465009693429547310269249947586466058091669984160684646087293943808274308285
- 8174796941728729903110131926755738979840913642534796949434803777033646349584768629825901034707278612
- 1862300198660798778268424593383563891957020685352160321163523006498874460020017041305698536515466875
- 2023859375183280372851143274811699683692849220447380570633496618711240947835915869626858643589141359
- 8542535776887749327436345147544886408688180303696524317556883002058607732569597160864854158344684324
- 8996307701137134467515693024488548207712413355773230694945806726784523594363150787272815790157307003
- 3178796854436279525719023623274614262868732738009497741122856237663214904653294072026197539071740422
- 2595392428881645597965700309571413891069368450362682310539867437532400527015347458933256795149418545
- 3780882706345729596216908538353537038141811557381637820903256151986974535764641212549807600515614170
- 7298046994813593483150568116642793219335279822714715767340186088721518799669350252700757556099719882
- 8630642854481282751392806947027501481632897273143473485285295046048832716739789815636788047804436021
- 0900732072736974934463049973144257156043313369038761810094887312071348271081588985748326585420751007
- 7953118326861708037070935927614936782530858340482351003632166378957426202550350116861543407379504516
- 4828967556983589355220201736795480757819095026979812711487034311903631122461282953038205128704309294
- 7197459469082102563478899543177152437969621128122450342606639926885213307919637027778044885792057304
- 6990800923440186638113252097123096476059989947925759851008173039606822219975327301606582628527582576
- 6950785472603493829813358252817867060851265600226887178112535978293373477914127362841886561759208328
- 7944741096970387985473698402545806329483502235939354358748022398976091629625011047393116944910066690
- 7230634693130169711820632535269244043840093724284428209709364856909468920087371753252557030543539828
- 7278123011398080938670154748858034456318713196026785487938933162050076752641120443902375833427242986
- 9965478636853410284885737025472550236566341868091903838867078790720840361940216467012153483797815183
- 2826472578628815207101081499558980338118961569441756761340717046538512170902123777884333649651872119
- 9054075818773943975283641439530442459139031788130041887918871145531482674699870555879310402403888840
- 8385068734162507165727418513495208496367095554245043948394804597915622828248378793415272036226336956
- 1805556371076814888893619275742659935823559431530887933052767558747512365065843969475604297192002319
- 8680243517199378681003611023125683642560795974105741536282971800464977485737183786390370390153973749
- 1165468549971645394161121641761071714540176519056505252066227788312904571969320599024137539598386198
- 2603205495839501675552509644137118222561496014003023035407899209698677507867200038074267970530307167
- 9322960156486228085184033523501706085895129122232461178302531636289439460736527713365116316464461990
- 9902122492241231516899276785586373631552600250348848781323300191018939961670273141699962651194574263
- 6761965002434737172729028462209798394871065982270009954918877696188505432653211802219444282228425152
- 5561411874340180419461413945147128725275923912559644373568339728963312676782349103563329612947191015
- 1571431157954909339032614119186547523762472153110207936911584874220582274734320173558507712243796985
- 7965491580627950274097716886114807616315161855306856692457171769220443668433127398933794111629722451
- 6999854685622157024175947117699529165502116855001089857619346394559088262707753114657752238846343519
- 3765397349848024549760760244030808448901068387869726123709783578245166801171485983679405529046198262
- 1656691720274262854823933960018254599409254308169691032978411234022885600190549342750223185294712829
- 6096939768137341977042781213001473286776057194059699792755124617184349569856417128724811834654206423
- 1871455182415286763056751311626771773506175112454633879942652912701057899567180572143655791835069177
- 7930704075732904397494995822410623810514917650238504182730096620171750940590805408957283755406355152
- 2199658207573513157075923615398639459211155864000988097552610538382568992721584785041746065161511337
- 8833609760121148487005560165812492470682568442720454728963094203066504452986462235942260085549915891
- 4995360649842803457949275700949795945060237877501947062463239495495782308228306684081880252107663907
- 4230973720916285337176806216446935432317917855305833171420847988630340846572642693955700268576057539
- 3478885870946005827232305191081175142349126873365859607998917329289158960018150918163374008060354752
- 0005151175102901229924870961545928026206076169827218102916731554892942374085196743307916607849905578
- 2101935713662435990883613859808516156417476946054785540081953530670803089697630452946868233210532878
- 2374389441156851762717116363094014799096494563545929501307390036268210073263700823561506912696431833
- 5171625439030469898931426154426359511363466057378654951244574752621678954703628904830484996804037722
- 5134319373734412366185869445880640185840731476337929403863404359194198723552630156546080518686760680
- 4316084512845916042441326987912538560299159967278766195195053176488313469325736689464438255813910848
- 6209663742674579831301222343872583124422033094571457541470479293875858238997738515213523723895596643
- 1223564326262860114748908681715928106687270840082033771869215352352692634722680908259898898400262081
- 5217828261122931311820866007099686036540981832680755824776706950410997586143624355216194535302920025
- 4667367996485043373133495208210751199258926638995647569858707901856123791578864374469037871509500112
- 5502100388453119236529655994619004748466206423479423296700605290037091755781887081935221468714272352
- 7763255989808694872111384598001412384216382782441273654244674883338167971620112886191415401936712909
- 4789902646664431560983729615019686242282506723061667209435465714251493086424887785986827595887490650
- 7726025095182953676518118236861694472436078376429476246922631949892196464406831692876616150605081384
- 6319415116202577907863071801231159458603896562526554223346234454507394788690268159497513116885143694
- 5210216883190446168629763325229863851818850049286935727647668238555646365544964006317648285575785866
- 6102285515648599088209586894443625469867952382268611596991005636608292679153375381606611224786953132
- 6158531871763885989377929188902998793879810003697307848959270625410484859315854323395683104239029907
- 0263443797875691855434089764407601308444819786265079476440830134942435834281885915259293471436317533
- 7495897010728735012707889804816350456766676932075530518404324461007403216764718360837084750651269307
- 0766084982529900031785030585368213951273503863824605642510337775580986464339801718620814266307417259
- 2226000511091342681074670129014301654101064933212283790827515001003530015654597508323772965439697382
- 0477416265710657408216499606262274961879533479070659889748717795643340648417456457479069251701494998
- 1009535341354890875483632757952240720698629102467170357925144176670388660990698572626058124082533622
- 5218992000418975745765315123000064445715931701771688635483333051921582055946117357716321132233931965
- 3203861990051161781713340010705766526899197081692022194647043237953564118660639205586090344570641517
- 9778214505472227885298721019785884607004742002846887379584422894997433365627187799172113791616449254
- 1329715652879529532639759538535920950138633380507561369530899547584883024261962758985941513780515805
- 0257675404017857958524488311721050892770892272734319738238846873071682302487886885855101080735227814
- 0537140652075810727084816726397709873145516264691142328610303693298433030032367616271426406758780673
- 1883971515002798163374779078775038307986759404591073921034587404219617034925808189907205961291586420
- 2028857340091149552388651079113714953346397639881839488045300750747403722809368205354304949519483328
- 3347007516197900868728543996298157560589163762472306916287111113767608648032375245966493041175394613
- 6464337804671165055504670671836221285795048067165630427626711429999113487698447050370637900181096888
- 6297217579517324338027806174704963020424929166191718862433555992820932439194457118863215563201616542
- 4705537593869662465633412154101403228699093015913288580883124124288287637387274283803859071029274863
- 3351503090445328052597795658920554562434297982794134891756382400771612173324736428540160610044337641
- 4572207859217155914010378320201321338330963807789040957238105588293927963743816606868351950592770195
- 1536160172215890428785678482068291944169871819286273082704441630396254713053284388337913374768735826
- 1221162583602728961624559041896770247453827583966522993712351630489833012421417455788591594256059792
- 4277218199085562798486056174536844789237969079755945551546468531630244623256740348958454622567448582
- 0204245739199425309426422450420268903815015268360241255980759752364816280930489127461511962315461140
- 0822056396780658535407668688227542650381225999162076017089556747446524234452017661650325945665912966
- 7863246213799192229614586714224824928806476803210864779941004100600339067927523736254602774296007347
- 8803835668752200348245769490845686269605771570191917489226063520812973879744383548328613693956245039
- 2976805783223402171676555917766840375723484409461762931288492689936871389838822271060279037990019045
- 5833600797392774109266557392331470259092338906543884223513241153880185592349561399302239196450504503
- 6935292701156630515335191864186482344249991927202729534595990630487236080415957600296681211168317236
- 6038110542803591445720248256456105714055462420821343520948108417158289572445072063546816002305120140
- 8480543587425261710176818538835575587174154247754497722214192613155252691091755633319323222432185254
- 2218272914915981058368970250352281300214119248601424806807975369964777193949068046835528083473276103
- 0604940973309169031678309793463661183278453186871646268073883365670456601042376850580139507443647963
- 9222841126979451347730049249878649656367949099291327125289776519181754279628060849323755208153611132
- 4033971316550439188796019838213858500077324246177884918758145964264233788979333081948816004011312652
- 5635693244659398400636890315254722923991414474377069633893576192603918924793631780083102611419548543
- 6051577871600495578865657970665885510428824663630572077789022667770425126815719795332251076389036819
- 7628440286102588053923393294746720240885412764923864476021611626208242129916603622991849237822363009
- 8347811952291382184732634228575912097980547828525059183798336801787411242644746002256241498069140074
- 0979721023278539575615128345806165411117926710427990579394497134946328950456512868847841871758020504
- 5832838748531373691135102550620102775345809439105001021833973245650472889476879298925945019875076712
- 2363791875864720121496606115128048709648863056228440839369443872169212084920085155838125107074195518
- 7208093746942459731172811721051928903896370394235776862127668210931827636649840421249381440979598631
- 1422543648396549998347908430702176438555435125743682822815303222238083476795111355701480631820045322
- 0723794891863572149106242526993994671015366846234105153338142684770627585203524099207972086991453730
- 1095516415033176282001969164115460268207236692552751418429969920539853433073068057372380504167197221
- 1273740507892726634063885068673445856077326664838457802771891147580132310551987841336521851907146068
- 1389868867103147598264611293795439526672867275994833590259744587868768496462683484434414135917714587
- 7660880778453571839329371937393236408356337576688468211117993505541020855618849010201600505639541687
- 4510822060355541081766646052412496622442280454524321603203601946413560979200195902404979292367329892
- 4553990101980112140290868699920575891777188074146122205024728585715367530747814389730571787268366360
- 1576136100772286319638852646235125538077319459563567965382362499926551804330796359621106745528521429
- 0262949826567553352731004687886573104724664933265679273313451229550591862329373933260860774513507753
- 0901574443829487339779605322849358301361837958626480321297368474817516476913662110360369509106666505
- 1717115082782009327883587225983940463068376318118089044236262199881236826807857952621972166872017455
- 1747262781803268305854880397097704793483103543985590784355277667603313988460527150313885633246768892
- 7104595851932895139167823857735772658100479825639355193520055204080028705967824973937478860528356493
- 5914978380377964960005212445834779001756042465866651998077028839438516380955043049219603244360903400
- 8517466042962743097683871519459826447359402342482110447572911177795877313415536095275957089861258677
- 1456252399450075938020609355024892008476733229308574222255020645569023912654366357852427242905605320
- 5754030821014512382090217466975797653475172501465837478848080537735150422224042957603613754324861996
- 5589193922050469998210629316096756517907513229607778575533102658584257608668676453552092774827556754
- 5177169950878941180593630524994496701237598006553499873966639539441701705969810151271933311840767923
- 2718539539809764048527846743872316432910029065495308612833302664007580129618499207022002555972156957
- 5883761687843643467927558635739722535648841330601192895746428093578580811323314331152874821797660397
- 1257952890036407198923328131611640416937736628013259738222237426818917648959642270338039059295964969
- 6482133114473166765041976781108490966469425717069457007871264014486522428469488976172567465352205061
- 6210730010192624831468212035516995015220073163840041320303332423121670826854689317584366304307843507
- 8592810447849266395265239871864417338008568169232134742975458326940216125333283790096064862778549412
- 6679513674045877416945596140762656625029900692267267876036587137932796041848839393393469263543415480
- 9518362332331752293703521029146413312752037117166754872063473892329378510729029514462927415467619479
- 4274716691603049782928896147458702649979707920638724082502300642554499590401197410853516784440901880
- 6462937483544396144003535233103040411784572289029581805810321237438258987027473704010683777715925126
- 4535706508300921479258349892475127453622006105854575997369313529707814374284134055195444672148941505
- 7452839171603715453082525558343202512542416624457524562964457910769717152147095185055003550543906316
- 8825810578507463565620479146676805569843845520277099697198898072337148695635670317768776378974327349
- 2829343905145567060744607970476931646278121417138182743785614621970880870210642110573778514713588373
- 7738824076528045191427137488110559744718310093937519765980210024101251123081368260338474491087716132
- 2857660263938849284959898236565727204263572026374825649494912629141917130646280595669825493603261320
- 1925280434617043902892602799314043613702658201213128514881585731117821041310335728887181729526271120
- 0081475064026830464189887697478791731737038139991888242416994212152776045185956711909418073734793310
- 9970928315546816563952710104611376254066449586183854638982208996778329550111431499593680398222303713
- 6329574232173574464734210974149174364199473195884005263872695923183642325491845595504534377846709470
- 4509594201202114220864191279049359945213739248711074323149511380429379365543637217263481907571135312
- 7093079527295221124795314989699080894665747695565124360561142008663990560990003803025061242360775032
- 9341347289050131677280971316268349596340929224303119508487886710353352002371273020291659297525265703
- 9210421496349523857085605723434621576956985134068304548331545907536471146996824209102321431171769227
- 7385347704177940764410013010485960927072113205231853822274448702433271039878114791275460808361156877
- 9215131131045008366363100751751102590028086427715020962713662397401075288445468331618211502789264307
- 2976355761055112462033248005310599511150543148482955343295983057427245173788652719300073232173623758
- 7327314890910945537402704811855571990516839387453520679708592118964078548950410940569965988715988633
- 6207795504521932156336124685303174705443940294182926355240155452316098682553138970188015397045962501
- 6917966481250155593231148267300563383579726032860177847414960045697257834956205873287301245145557634
- 5230298648149544100907883529801207012654109525184606662017674204525736799469077190845378748206080290
- 4825167017661982073061833123921935356900407052154989390344659388090475077241695436518580750664904594
- 4318886297872357160302248135220460109063521450828063974927551284769435499620339916448879197437902095
- 7188863200247502079102379073072963746326336674594275563784535691367345524014897125909480368566282321
- 0050039400731066320752572831471151926332892852069672393471750982952602125494764330195357438350925828
- 3111339115390633766173730772363027988986998579945016592376906754883798892940060516282614004815046948
- 2814033083916434248650939635458909132805951116334550365634824519150583179498083182728134795050772717
- 3359496633718821491928378711646390356692577994245739435547304493555939684803279020861419681508260648
- 1092468854338332986639074547805263629161562798803187828270745163032786390756653362197506322424864576
- 9459753596673200603898262930000761251494798008956712452569559827585485769012463686594942242277271771
- 5184964175107159841635720724122437196806720392706478942789421712842641334271183184794413346064724314
- 1150155098551171241466824331235206284065722692606904747919644729752832274956981963277872816259540120
- 2053807329582500497445930809782409529912965423318498798800771681631986086512088315867256506594414061
- 8446837496318929137459934216034848228831582897309421614736892558516992715531155888876007217034102445
- 8744020844342827300467309795555666811501300338889583802314643138290026007632285034758307808788951803
- 1398102076278898517435347822512084675949743002443789584289568075266320362769629946018083494199491270
- 6559130840005862656399639110406851041282007153246256426371456355757694528492711263557719632506589654
- 5536482125459263355257292595281499341587877651569223119151023373440716991656476398200089698462984399
- 7759385398112133218103281989699457926176493582974837338775235285946403513823823062694536345810031936
- 7250206982807384333411752831573143426398964163471270530347756991558003118159180911378802688385475769
- 7292339888286032302997704306662886955301210272705763395989768941024996847949816842011992561348075644
- 0406559462383708723688812548949148794873480861416810552114001845517008444484294847550732736642827222
- 0633658240174549880829130188391401568090500008495465737300032747797209917507461785951579953202237285
- 2359204007425152256386166756203188398117618611960221628474319079702503674592828046781785366473935600
- 3540382782818457669478233745711382212193261672950104270694095202650280522898590935002394490874562620
- 5345221731194095778301953605185038549614062182530618203651827337062111989390244889753863581809944918
- 1578487833652886543654224830202789241704968965110417275947501781226785814391748649424357300909171264
- 8771605959209744581146295542231002200851205225897647781148270394267766642782746259395117438071986187
- 2226558650403002846914692786468003183603463817264057027074226203429718755580993868712404656223338914
- 6465830554301315509528510972630050805188265272685335372937338569182693717167730316118647494810424215
- 1279159101460656979533313377409593674932644146370242752453933503013099283364854070698403439912124524
- 9275580299798824092066446404258596620088874191649877302754037292042158109378147131362262886666945474
- 2124495528490914921933719362340294337125575569988652966236450353519202677763794248208286056893623152
- 1523178850145213132149146986854835944706865850109813142058926764161151621094053567807368100897342458
- 7293270521085357267638056422884092966588447779527954671073519329547471301507922084032823220442894467
- 8218396547110902117340725139724757357008555312743219996751259582568063235880883884366203262266191414
- 9347404364980002473983320924118386674296092694607014183881781107142824396577963884398647823137154249
- 8947258304114514952687242361899676305881682084632743744121039055276521871073556452571336011455804558
- 5684558650432859917676519619327114349866540777451450047307271171479571222757201812886446440777517460
- 3282423173385337652989810442322404677246320479517980971576025800885768975134059480548268772884776293
- 8464549604027037050853941909276993706680455171941604037635118018551365754510952470346022600207417428
- 2384948178225490636599208474903758320574467795910675566064077500934712981700581876940802799269046059
- 4987211763415191488225186704395573100179371000466572921803728487979715692278888397041982545657064289
- 0898582795862565990137596875007856985342094439959715236676735599115570900614130188539560069330508261
- 1578831597901882912877765396964067539208084858229047556190518637549059417647208090848523929966365377
- 7468709856801423613707637046742361802921867959247697776529262929041798392750534329433844765333985012
- 2828362798515026374542796671771484197573390657287154305432157523544932053465375423820484485088463459
- 0853386677292538520444984413136863751894117684862613603681937363513393254080685226921474307329134467
- 6252932264084533084493864715156181394136343503648177947550976339255988278690369632386330342579445292
- 2923775203287448902004053266813935475285501746453171721459950814556136469252665022711533738181759785
- 5795041988075485811336289154900903908060775415757361373755988018757307536248737001291223826113438103
- 9234372313536898891533749493786324984941764281417045284082969399172432328677256415048376577311449335
- 2155385230017811082761636303709020525950377909253411047057004656525197792567933141088663264059262317
- 8893126031528575871642421190333798725775874290129037593626972723431489357257241883794186276864566775
- 8686920276014398050163871435204776738809005789283633817797388457344100149966433235822257925351711059
- 4856078918240152199828522694650958763149247127952016446764740270468954543510306982617999140223407285
- 4891546806842095743207506621154487626644675798636443880232586360886918759442271521429650664161384963
- 8150279721730712659205782660027847181400342092656930703090445702459646757649018527813931481315092036
- 4104984596906022531447482294570702527043630406111445514222766936650125425237207439401827752508941432
- 9152151705997454593125946821214351062276330331850433948895127672063729151249368193570319104693572905
- 2762887687825004850548005973230753265227792552419913159617911522069419685479187341566997810967025629
- 9399320816450717417349056433986521998663905570935211985243906798615021448623928438739820187602285471
- 2303949459661572587509650320071247665759381372124801134153550616754720369579105597461067112541711745
- 3695430147191419937319722797169021161357262524311647228936664414262124385498136236949635712821160368
- 5441607108231775107801298304253814190892249208595364610821395648113205316073707772076055993498150342
- 4064077512331512158999246297497845474385785595227089267102479199199645043040166005621762962340149282
- 1816115205046438140512010176327979026932712227012592708163045794086959388503088585777767698805771202
- 7746185837281858599701772111603710982739324147197937663864843160008415792725306116408501515001652030
- 0200142743376390418788622635274702258984849469077694747613276391052599405660382382371636943555470658
- 1748273071824741827263627240462399440284444736424586444751046902997652674973443569857085390578191599
- 5859960967506128309101947488656507512613971363292764158349130420830095085110041407455744378492789857
- 6072610576974181963369679075518838322017344376439805368296268732851893953081597213840998753657746635
- 4932531139362559789543000911914267407538592549690157973419183710401699917900945678359628573224471479
- 0732045696471978631549086284123332517481278482880984876102210097427834751646279055393851966889569651
- 0876062872957459088920170238672074010602453894151954739328142466223126892362650272056402643021776903
- 1895555206112711463146717038915773390065452869232720808111578757374991035324446693616535175221246886
- 6080593973805468948675560258870687103081189892202421749529345821953530099156135536073159095673469906
- 9924874268001953821752462105349862701061321590757260240804300827868356293198384271052198354727511764
- 2330279958926872730531183558056875276124091974244476335680956874844410454670283523651415276562700804
- 3630974774537678098208734980384982599248810670297754949535228299516546559850687428317628520857196139
- 3797828505779014996232139220462341524168238038894466242673730018965433764765036341251828509512088864
- 8562947143987795665592807491648962562185926715414692176768396054500821642162605610642314443579823069
- 1965780470574714846007296818237228797756049608915817868672936323790241579204728364697021031397518009
- 7841598550007055364938753212574961674875872583259925957615074339186228437988301346044540880817809685
- 4911945411934702689650599198604109976532111965810629665500511618365170620292880877609149846167316442
- 6864197089230648463056754573887202476016525776085293772109335844538710740272925919152462676235381797
- 8693064215340131633701135735635111098141821129662210736726269615672674830775248874448416766573702400
- 4850839370255838591012266948358068391545479166016456914863052393597793244672558867174160485503871149
- 0317607553732194472830582219155807880752453696932744601747360524205864696869757706121867761972058749
- 1045165142715495423853920232526975123495465463090613294600566507283098728033873735155375223563183570
- 2537006494092638080317374634854036114660004846876242310894723791650074517970524862846727663375517303
- 6873683856440370498066179092008317107882104981833155261485053735407503510822393924744563010969204227
- 8844737169688950911185736926890336659718522537770329622016708106551812675800940852515068477579219138
- 9321380928696119531220905038018107658748836831788278142527862618796676068219770390932600672961512755
- 7125278643706989835444409613917379035454851804039733313748052358791095558304048153480453918785403824
- 3236907304310274062641777762657301034703384021129669084818046162496487394734584412155302581522214994
- 5822249941941954725641031750211442280865230280221342409319393272767819599060811259862396733945898961
- 9071679777780259511631477576264028588262514815821643994413506196081175890461951158539082613354960388
- 0323713522245169681180597512189590028591797390866524495280407827130270045377437267855532504850397463
- 7573946460984085658930184822341614986583150346608218622360580194811455490351547426626606129502687840
- 9754779814072682395693147248760982803450811893834040961534314863011248676465315478758454946522227531
- 8773560890835043837081120882441759938586466309397048117253004020305813409044745051156377054103501416
- 6861912485252694933482978510181114723298740453961275402222190958440508723066232688884970422345670001
- 1949751859796494099148971385362279458874076099043285422812773058183040249451087063369869468674008948
- 1097539710090849476830410711529550638887652490545659994260773886347394552511448972036104793757254472
- 3966023547748127494160698351013147640236419491461059805563757044651556671236525682827015744528476022
- 0781753972337164096986264920557668761564457744644664925477346729725557053882859078923175970676863982
- 4966294555601938731527103627201242931201764252246448031819544683337639946131383614457041608883422253
- 7155878358070161156027177541424723331527813566940098980044458238998420064074895892389238927522891473
- 2945531240424775520838052379510123938435858775454999001272068286659998579098429303846007329623842629
- 0797218233372747669464015269204881430422739438838386988072365034008809524512726001361525704157749789
- 5464274592866962164154275190720789657656762047087629102592988877128340580613171820688795096273552308
- 0228036658853093027046194006144644918627856642449420816210203832761116962244213863973115713011899185
- 3169915158165025834281284874149275360507355014927516496556894986881445782807241540090116176936589862
- 8113745927903225784890933976881608670857002995345721579420980997220532145751427154112209398869874562
- 8011653320792545519698519103842815726835120109236799524290686799545683083885930136672185211353641724
- 4228370492060364815444971779988618739061970126506684370640425124459951909006226082179845415139874086
- 1561892465930844027470147101672547160166860173976919976620111199893015535406281778132823867987398831
- 8548093651417526904050273992326953229393103604569842520594710877602232101677467927935625307683377220
- 6929809952133275493410764068293696256538097982992215020076190656713323330719175311095376967431445827
- 0474521918565656173056185321660425946455385616883759934532767382788781222315372811134173554517073553
- 2082760440774525442307854537481125966546355745960432703685421573869622444796092593675008309891400068
- 5383635881778748642710688257878740799283418251977140842230489497915517987678274684754084928993864763
- 4983917539244593293129138080738765005052200666662727343844540498968011834325534999762501192176787558
- 0980672332416782617825708911630179808819558379107540118050962160109308042257018054929764678411538769
- 1430708824753121723137940372365928771043455446962665999926233933298641137100126804081160276969402287
- 1365072981064452520165517338604686504062129245789271472274267638614268236764085164119476626514371013
- 9385568064270077829659680486077517949221215629173867163546498898538357515324974315835413991322136505
- 1551384109030902755433236441202253007704282111471419181475709618331378229434207254341031555828186693
- 2838668366072691638369677932010214202904681337049153438059246547114970835401227241006503949742164188
- 6692274473689950625289450277718989469132963467585879264235211633546474686426054856131577840361143149
- 0269544275056480384788879432956556048443391840602027045146827824231514065070221048519592072312004933
- 7176738352370930885652643448419467734538241329688543063024778255435028195957175433268735831728279337
- 7410102634717252580005510899808792042744778385364274972065430922479605721400330661597939815697061366
- 0983964055202876699917225472402063960609642994542705915460007353673154988077390830015813351603573011
- 1114109280154122806666705878555092703338500983115676285161649242550929283039087709889349460723490286
- 5856020542206703715680463500382605276371082398659793184830936764165636079070660523343411137793121612
- 0205880951461437739476835388395047212945283498654808648378850194676769456232670199871331845545348373
- 6084512767180056787542358871951058956527978045378344846504681469516775381369518451030832390374965716
- 2143307963860154481614495523935111212189443023826954057860116467373664795652065872508159275305713134
- 3835699200489996180432549502052195550206179277993056424583665872167535192817503344992391833256236162
- 6502081490355786124405183440403815991358271738433734045297449996405991865666415356124243080016261793
- 3750921429658088283221957057843171697946284551330968382460003698996180592987950660376071243272559753
- 6508820386360958809040038001760475078669744332587723215438325998399864395011449541507700972822653695
- 8394380850912841104162909663701274249881761634410166742340050683616764823271038894223948202530869672
- 2292524340750602651298857635878137500851005688687432827471873232428984773354258150416258955023854489
- 0684967676489282970728115843511676077617260489135585109814789508429849836055936593710532020599790443
- 6973534016628764532063718869382189780157321907629981036125683876483872698536012944816073176186580668
- 0596837338941198265008732624266960024090883207622611783999157440210584278984506303601419933928362455
- 4027683509989720421859620902016210156519223584211948820209123783927557185605541656205455347196978661
- 2350583489628212860820840349731199881077259045458633766108505095823850307512842596428597494715967542
- 5924034955860979643401966466721757237237070785184646638370671702995416983298869124728187680273812549
- 6293898760722340846570950989432016548760479339467946851343732630392230933179068730316994180074048000
- 6872513659785795859947801994965234272868898871781351617155057783915871386404057895659182321370814005
- 8713808836523047167127182200601860881125726033986240354206752127690892108155226032930044410189063723
- 6591957119530302882485868478256488300525181260810354213518122471584004627510592444870583709540835318
- 9752152361034204084507641376742347300588220343231604746330435062814232108294872409025947644118910322
- 3374049794740857827762204826182195142821798112437267662584689519510699867374022732300260261505970642
- 1527460232699949700615823592828222978328684019972903653781681600288411730673324496628384032435365041
- 3975362055091052197490957998605957269413840242675559674863774293085831406648031844531532908153215494
- 3458288044293735568005276670180009478873358860913649494583852689279136559434288174186455594102961792
- 9958126080970645474650902342618403450108124033539000610734694120978386716277216137083614515110500772
- 0117042140575102955114913702554533502068141165244769178458694354034118791350719472868333896624761011
- 8301700497261895611839898160539092008911727724528273299586808380107378131400187606725012692645464509
- 7673374700236767820135235673242624788804823436290099963301097657305710745086213218779682807434398964
- 8355242714487573058303218024945210923199120417862983211064561898234504950543971618030395685126538014
- 9225169487847955472418638278627582327821299397820742867554710924982182446861479580814083550046687559
- 6261579061717590219271869723784547241129855757317937479535182955842991336928140588480421571538074685
- 3113023354946272141844005632397445875377275180714660165706503537500007800054761003678636991113239858
- 6213221822462464343501036322398596701728992842523411315434326293039073595342914413933874282187214841
- 8613127907162685826684720595466403565113327927292836704215333378156489787872434723165771081189058811
- 5922053413447767521297746355065511098018114547089217012441063492394924242267383494394078654658363868
- 5970026019915416838558615578967012722002322003168619541970289247574216667668015248082402211115619098
- 2909528829342278406490395339672008649956965447075211846134340977857777364263165869169876274954188683
- 1332475145315900233544095171491408135927319114619200677579215856331076125470709339611644150880072729
- 3945636849253271858915516881472096011415405664003892102811864854595041190055800792839471619967600301
- 8770007299166134878103899189799277933082603333383340579193386012599266354350647100912606346252385743
- 4635268474929790657800172876659682562194685410779874218445504710482511389936542799445932024438989851
- 3442567266932786132950485170204267041681042398878776628283501931254549510108703766963812060312761799
- 6218893187778305204501948120474270520457321254873390393028668085392898551453951830701677372533915679
- 2769039073362485903433514761178705177976647101075024507681616557253954820094809110586317329891753118
- 4160364021950346357321959475586008320829267512378849551667250649220720609741203129313574353745218554
- 5498302580415651798622780164689374817239713381123695363735811057393910536917973929343197751880325243
- 5258608082755374099972101540080046979927943422345447689707580313149065499764572719969962803326920908
- 9155838176032139892644880237691008274209066808004373992504541223684971940977467046731673788785204941
- 6564473707132543728313954096231813376473848894121827756876058275472115348406411192866091980614228229
- 5524907588525871140721341401635238119989127477891313975746828093424728231102189843007024439996429064
- 4450844788027668653946357835978633014357430738552248011805785516300305948035170230529176193766804489
- 7455190062298141740225468793859809142285837449414294668405678447862996873037366863397510139100798455
- 8831971893984042058517831262556099075164256666091448576606836793744806529724037099333962928343483326
- 6104136871344725962944171536616832569298746075193490043675487124501251738822895942643220617183770595
- 1665664903889623415903428365924676238921543162109473965009869257089507504114157819718945799485168292
- 3997676852605909408476925555603209473017988926182294738346886884787742147478211246290050487616242097
- 5722951786073395988696418605399569127426110537996486482728821472986544793727051143103641539950430249
- 2489038987190473804812173705725663713465147154131222056319569952971074484542325785409319607037480624
- 3288730574037414313238215835562671427568755755136182019176330108628379725855115674172305047190608736
- 1627708326296442958048279756363082376436161545554061698004581964467066781024334784598806924847727489
- 5298262045169437003711201912953531129197138017595577974532179706899810786979967116140647258355731385
- 2803781447946186458216347452039855897512317136407974683851455920414500521772122914466992786476520100
- 3653978899709419567795422900041438454871434885285565176308029925167644424768218649062151219172342568
- 6851600605859780896623668832012839653122703074654818211999482253881430040168114450362116720244462048
- 2829677761601656378975763497955487255108091057813394203472774484748769898419218280856304164926029917
- 6230362632250441829629652154385628760703742186814004738630945015910913254210303256135110757558287347
- 8656260809325645074346337233422408558581633853715306945878269202052395067272475369001398011496431659
- 4582971648686322048417952196424498327948806313464620108913932870531345561503788769211459272685051467
- 7135599589063223865076477828269016803601306170856982886336353398216641166133554804037038210034458380
- 8150558303401797120822493909503856609585571395374634762832404217519342656686392559177433783255482070
- 3861056330126237628769817347282242509461531890702150820504218103977489407657214990832478528545951002
- 4679597393084110627252254156964938923682735814346077275980334626431259827888944181849173802687044960
- 3886707186477083156478758911780354308201318656582034354073422928347455769651498683915039761412613360
- 7894809975591648249062551685536794824740509846496085681889172036998737579643980011652952702772372260
- 1935755572023263101476869284762636285189304849269092640985472493648181412831689383283125795662135988
- 3554452066740895840923148625755911051962200050308020425737002899660124136355648802803399956946560958
- 8576321992603000468539755980287655583171070639975066604761486777635632261161271522426710967361840252
- 9108255244615388577666027796080898302837068778139849238125451717898757790676916513246031087551814796
- 0012167620168554361388753511114464644596594898628685003842938167759796191272999045913439604283622782
- 1457438491080662673720398159683311458313277557371939647621394703694871344837965336720886507609494431
- 0674893862810166860809354876204062953142683679016223243442162500961919886528250184780750093092989616
- 8789351440485278448521019497293149122933664283836109583591179266973210503286586371961913064985733208
- 6615243198917751756133072533690606289440140362467357916861241907679730721538960992609147780039218290
- 9660567805157424539481270515827865608617662808876754852826435345792975109103743243148049050997201340
- 0938712099679922667327456972199757397498352955663444532434557032626027829313689388962967691490051117
- 9164157396415162234596241438799849972397210625910452426655628296014596790128617641535247864330478558
- 1496257111395603251503631837450619425879073297479906540337812932343549647709599415970216918103681473
- 3833330641513877132215173398409381746568333237521245212042635149480179573706485748255881296241114146
- 4692661774781738601561556967768080635428081339262222680573586043957391627387714350848477018662653169
- 7488864738682430941960189287589120213872770961538488095065653207344205898497856821448109934432714379
- 4129234072975479326476182962040361443641127465240436917542835856614059594332610091323144864164204976
- 4947955201717108651706981224160848217072171016494824798077491801666631807604571639525183860958271832
- 7208657052982558926649231274050673123487720349779982956094106360305165816819038480111470304239018204
- 5758372731652085922539947510938900121122194266654459086779269137115495078966657667654609628827777519
- 9570554507297923666208523507816894340032047543740400762179909188135109499396694313427985992158062927
- 0421382675621435340592467202350206425854109685955128295988801679474853488276232260898821426027966949
- 4883399735380911531026157275260615166467574723112673113045630210164427562827821914879246698975320978
- 3265292168258433047908547833654269758433077955719520001012078724019881349498443843676382704117421003
- 6951169011180168326999466120100860532094157901928897613978403516511159934642044414827682054550634184
- 8306161979946027048964895243897025843417177319031533093214798054202089619512507592936490162781474077
- 3224772573220191350456805599978569277543054657879842859468408586784134114538241240720656755982648262
- 5761903033834174251848538540384703710069087650808535086402176210101567282914356736771103511643978363
- 4404283023478073545669143817704745089458721178783915416653092472697951952686392823300371685067876207
- 8775481783910819732182904787993291396078874176833081865318199940659792678221322713459632471409529463
- 0761973967499846349363609758067253661551807859814534953582160148026023317625201506366399391351428775
- 1153532124112251505706572311520853765028432210158406189825700470439171864907241208917145612024917300
- 4379934999420658663798578734606048061922811946433156292568671087969712349623640619373881121802073791
- 5981801097590801132722578430025011137880349579204391899288300516242921760033764107933719681331920675
- 8299182607848524757117752420168349348194140053916463935218273710489150036580479259761583436513553494
- 3843191509214629308199501835916709425302654032980324967615843963471143532471437039221486178438282611
- 3866885521598461344505803302636914394174355991753787166688140045296893435198765272300845846550156565
- 9895211301104852881693941568670635178319221855955305000298648325444774777199550165082658896713964088
- 9880567958066916065806094048513928010222769761561382608319076033245484652866146494294839667733008070
- 7320067510426251414296244714536875097068785066005939402651877861032765470280632572990619689759188738
- 6672305110123794932925976495748262551959273944717640092556185211857724430888945893130457097527258670
- 7145565142360341819890315195457218862114917103453059657845082618680743649773583175770086475879964322
- 7445489500780966711961621513676950853089233612386662834811029398046074355342727244281049032807567670
- 0337727112094912843448745081356882215603305043883517541081483037534434208412208168360581326234576775
- 4279316198604543050444851055580041167943376713205581470587272088253604731064967931847963735278844788
- 5205873182866006563349325602359088898353777250797020050541440210559461072076492440913633722789739946
- 6397512341178836631250900614162322765702854104850679744981271814676430841410300237525653730495276727
- 5484545999787163325331050619024021518146810014651262851039759839412882369862113183152477649679577744
- 1913323947985528716530231998698023983984731981788171333103443398908379580000513196534523383390109097
- 0444714347942650262857403151815203546507282311838519865802936213522437975431938019834329143125027577
- 6675431686988860286567701350037258969644586868341764738783906654442181923585773107870023191744542871
- 4160030268283724049464360347876903573326188114310108132188552798589730345053440330372276915140453182
- 3618783217199889890550829089662419765855980578341428737306480985290782145941126494992196511361256777
- 3076994605802064072391808669002017569564175955272113593375897911604759823155872535644568257143746585
- 6688982037370549704529071584697376355587060928012017697805329357967838079502279220010520167689887325
- 4108389319250907174288810810708623207551018480041769696826290392399839381162366384787130819320185559
- 2678658980709850229537394942175424696253547043954732413392476485210376117773112313850016187130471064
- 7783932487585006361991196778775326807139246898440388265936051085465236922261927240349912103831622629
- 7241144083556868049980746048371359252075390170144693739164092864863919053757393294556536775435632948
- 9530854791973561811689434694434436430308714442549106098294828815811595635629933779473922097851104067
- 2166448032053106709130375948843457873439847370765374740479308090343824433970583053269585629984793830
- 4808177975089019323978819644747281348548648563997367907690393025212859195095945330313797518529818662
- 6201176126095321392633918271825632758305911893721069157764383887227842285290091226125140805231508120
- 2726247737066716153729796236517171183091817152280526537593373755812823486429693226678471338695988769
- 1580950811504993633735690590084289200705482525461768954164710778011758607143286624044830552364259377
- 5798552448696080726730590765024885140814761891799989629290795406069165098627507033091008866119931836
- 5347811068950055323212323104099431566975712843211058927290756266529830683461268817435027634457348731
- 3081278785396682594804502445089945385062622281565720665625908071060090719474158064342896173131515706
- 0558113998960765684277239548120624654927922466441086739301705267840652247504105360432350868815254382
- 1884057815229519878956064995606982745328922732703853758452092709242946673468959337778965806769512859
- 0449057399130794876253979899894685344867084276328476440980465348855120943606428893738371053515595879
- 5075103681999586009247940522051548807777499830613137902641282737157571061281736249783647450207227756
- 1952126743273581685496119698882583112616695052224021881146693062574953847086995865745998878927868473
- 8719864383790480463746222816126871276345113094783166175997075950853325746028493740010436450345565804
- 4944295034531833812907850888333858378697710849820665102062795707669833445177934527180376911410207557
- 4774315429329032629532114978826203515987412546422884395277795499289564754347105898585159005508490056
- 9690369399463805412744078272079588120610950182666750528291004286440115969091560260245872117456045510
- 9407684697973682748145979040455219048418011545663478335343808815341403723981788190775763064723383684
- 8076617187887525444073186583050118647563203017139833900789875424411026277749259455787263151608748702
- 5048062038162606284156754299711008457236079436838831775697116071774760197736299860847092256124190334
- 4303868060751607783650278916662836093176759695530149368127979354666523938986549220821261327763789820
- 2946799581624398705936239170511750705049392442937122875207210047900369520353054174702688100313142753
- 1174456246407354520013033515441611612845306363822062031827141203471057333057060956104199977441294378
- 9723336195293680711629464974174674606161944284195771506421244911540670731221384206414126967154566438
- 9159471777969493519583468433678322141303743107342917437343763544159073773807768335545452204160755832
- 4500141271289974101494705488647243415899129609228298624074551605891496310210005958713471920979723983
- 6831280110175264318686111835170173586754064926579151374058216297242018837510297720276922807801732353
- 6585248661037355246360519741758718234908738197745199604135160468808608272559061048282225757674635819
- 1662903439070547597034809044004304333317413461423454127456779872589232409091510873059202427900149673
- 7015134772151425714802387818972789099319232118851804003049762893873119886876339770569031907414517629
- 7505582950790551571289772603435467222518751947227775034780629888158027640883058588732114089935625654
- 4526325626293042854399332825503295028936990777054902947079622008390293221444112657382089568543447852
- 2535584373126933754793765994306991005699082156031450819886494389488679597736520237763805269495558714
- 5427065851747444596468235269410568519337370049144862376065979574374294931376284954237476962984236204
- 0406990322328625482822335420165228291288443421575127060202153831784521856484115066939436436446339032
- 9462869215001200331737223159459937024404665464401070954637786273667690456425997758603414233762759258
- 5363126437089730757955269968503132069091830679132654203064003148245598623926575975731775912862530894
- 6541251662284071633701497902673843253016190101372978864695403425694557263052203876294232648064996238
- 1630855003126516805447885568199731089679575544268392204851309190268824033771201778639860463980025603
- 7206069295346015367351300935166490475996904153484422840649464357839627395979697011999599689705500713
- 9802671431539123914611613581834068087605346672553050422397928096566221091111847789650335190031281930
- 8140470647874036715555211403407030398907223233915942351265297171121449159128746969645445570922804347
- 3384101385887428050725149320183676549865442619068767503039795693902421343747525920284449370703219824
- 0950852874392941278159586475430366953365464650438122955385696018708146303600068102231935356775884221
- 7066271778752289539374973944984606881958992605790426632428181883297682570878308901643540546417536779
- 7521401491698161349930449104204274172990731837969851312455958606399199659668996108005049400729639709
- 8959517574634950113152395405436384247715767305796899780935112310127000606831560134705616884208186210
- 5906584385468535226530994080955068645181964310455005698528640369722726449640722091072805065651759005
- 3633194257188261901685209110944462304938727622601300966509801815021611618931499175544866484510193964
- 0892424535185862966853588072370252086290396375135442408416767961062540774535439718720220389829258815
- 0488174626321440193245912638467764538782149003218736052884016158146769340972434249669596797455129521
- 5247541300383824175967755422515486890349846758461066315941988121179713345250927530701408561426350301
- 5271473708797902296635683001787990288084193893922491884489117670080380387588878016977011134533491153
- 4802106585087570025517363256882009759552748712253571825516978753150955690868985464837948430351870614
- 9231357340296313652791276152623061043140923956535229749326101802357414494002010757529248895892932458
- 0351889348336232266211070472227951789643113533222151331112813026996570565423666607124273606758337678
- 3519101251099443703046290763466149644955996730321258522840068128863206013843915352393209115790604734
- 1393629732349275918089423365652609394831336481029064358631183082596587859784715023449078747678799566
- 7424852051040103999757103940220630691734742020896991756005288898736759396629367401720982195418337128
- 2339328624773171964386256653145512699222367766777081986434967998415260451946404590163957896049279139
- 2910434902756838172684047052298140890671314915262504417545271011235786801298936828493391396383366078
- 1422917945543449168097066491318845378120257962155232128839888294830960254154515830155645623132845031
- 7418576979979910789556567996082529165537586122338380700692195796394198374261176767691005073575014710
- 4127391778359634794411592416074096491892386416231443150984337999995741238608455687906501796604659040
- 1190093106491459764550874416917093615978054671746589930170413753904682544419849306977396303361433004
- 0322637044138842456485319600091024035914860434195671889198585615655465775089014431777128616456862190
- 0128459460742160742957104583140046201246390110210193236887462318746390639051846090824746612222586831
- 7169890636064025404893508750600193538323584777977777184156692711224004455167705419310730388369438797
- 8890462421759004666609104016362270064506716725632981356191695775856133339039827759965225099040387093
- 2789862215954943799706306480709649417708005812270559330916211844004635893785632435864191061540068204
- 7879016214044578771739810295260717300099121797113754243334882266618671805934535003597940626101694558
- 9487985287382394619259273830058657862369012719296382659263937819596877763449192781383915273468510317
- 1283501167754128969634017633688033476132425006547944835516002423125664608010786702586037609939080045
- 1756260090655554130984042735743005006687743313528206170729903389370532225467004205889640465239361428
- 3079185404169666783240709559587709423200941561095553433443491385438840861082486242898596197412565717
- 0424006787671236859353722710915670406062194347260204099413954720131755244915834594427491919291350235
- 5834404187206974345886053833701858976572062254668638991474061713844091114054244489241812528058737844
- 4375990337027144323207852046419314755947583142919416971906297697904498821308019258759048587570102804
- 9890092764667431817419312738798791908667056460174141045183654736392112018312726421352990750753167418
- 6041139085079174044172658009288966400350856182993724721368434131495692957040198130016060875412795746
- 6419031797332593924021074167670242353517422118285715161832976814222607309029636948713308807785556663
- 2397283342252706565073072518903090395022975145545081413444428165414364410492175062270643628610175717
- 1120483665814970582463578007550456264537446280525932841567885798506901058045279756262857220830478354
- 3668131330317233238135264707525779523301528916639528654318999573174578016782672814602226403818995669
- 3799484242109824897420088233111400134104409516093083130905465503159555154739774802214624067611052716
- 1375799862835439696657835524567007936049751876795850043478594444834874734552599963239258820104452878
- 9576723339110852081379948423471531895261281875108905121354654969246066557673451857177405113980900507
- 4932280070940569206554428799289768091385328823923127426496379071979978524909030460958502032813011881
- 9189798753861277050983112679686721178100609428860334160740802044853244141445794547210546989291664998
- 1941599750811708399758552531253479307072377194823738336760655418502113337357535711604984088630696264
- 9890151155629827792230433349844936783915198562685043252008447985546296912629978831302936306463370450
- 3315526375204047392241570728577799880296353289006984007678189697563540217661942944247537256498457226
- 5506787359093405723897937819146080319827113924804979411004922981431759499199310328089795747253376814
- 6061745433132644892480370134626426692631734244357427051774756506755634133360059178313763737592038902
- 0426517169186542244841360946598636267754333221729097280677212181229450177664232716733109192752337724
- 2450590808589275655643441154844388895321327028560540600643524034011774394263831492694203667677312492
- 3344604615279222871174737320682073795040775380702487513973697487220807941836272457926715860587568437
- 3825696601528845015936360579976487955466689796317276414458267140983930260584443731183219527357824299
- 2380530460979253217595294376466967178599565547975260104811160900192559877031603692890535464219693617
- 9009854720785512572597532576878034184282394193011676471278020013244905417068719406087486425099249004
- 1243777990256723623875213448754686801805700267716590457174167509358537466327846614717022291277538164
- 8935814037542041316317966204626016830058358402780842508470610285632146763492164415596565399512441115
- 2722520988557631807880862837444395373363866289139439904591869356297993169132074310849123878269670817
- 3798380276007328352371305703835388120192178074557053921312504821976693406394280234533509698054521919
- 6416496966420519223222933252249809906809438298608239338686773954452673632194440159865904066528670206
- 5100494097867130245089605063631147497897543186327376379320227953001087717684402618218003859090607702
- 9345978640932969511233853261494565585967711754424619462086741789881434778027023789183865475073672507
- 0123164595421042303682530154992729230497065006887445529088936646551481938480563745544703197171864227
- 2096587063004983436657183030945852528562989254613260790172374623360138208947640472176710210783635306
- 3283918528942630970835241842688066639724543519498745949527236882351106475938370531361494523326299006
- 0613544202079008007844359185142381095406246359288007491747232601428291506647356469491490753130404119
- 4874612758425172542299337656191322834413615968845123050979229080934778061000120243079336754606956718
- 8678475890291671628151047910984819968795053757476103438392892981834755913533728342888492285393965950
- 1645942296849021635769846036566677068849790614937895866238978513950301955252071159479162430380571339
- 1044123512797717425894997181320899397240945763050438176542023774937292923666640858263563047018894284
- 7136621796280779475814106472039686900573358837832383938515643676929109532126309530237234188776377595
- 1325585719886841563511434654449213461836258200177391119635659736209174802895107119119312161615049356
- 6140019891540677191474060450200848900785210448984071558724913181424123745314739095859285491926195512
- 7528154045555489486053043951830551638652963511435855426789578843322470303223984629694037003638667059
- 7551896228216684947215516799401023726052761920617504560496637170762638459530053344438789944328543663
- 0146414207515026765299871484148385924204684351505285892648354129599964190638362225500616202985179080
- 7999551716142892743322162806963512162902965050345455980024292038066113122499875748777814543334957813
- 6558008300458790545565523759643089947282941565846898062943112725975546930218879127310353002168642276
- 3366103189051108633596398607097473741955293417850780136533786877679115147383325251300237191023587588
- 6798039385529704998321830389985333735331510345804434025730422758682609723983422315017640803327317622
- 6319675659897729718394229716522776196734085734441374759147793179333989243599405813960322813465924785
- 5875655057515942861161317673955283481508085185207154795143926672875105744138676971890208777611959245
- 9359290863839696200576865099629303818145491280734180972040320363366766499443919936264145227145073503
- 7059076093857524400009474822971362377215926308360221391588559094614074069763012970865696906676244218
- 6183635520472790353317530936077977879847080239021859587448789607452374905628374741893102680628048174
- 3381300198221277706092184700815252327145986723437854310497839043649305860764535756025983828162540984
- 9639983181129718814386395426544082800861930572917995688879881825724409230860777086263513136094630976
- 7740997028472766829666854290845405202291900303432247189820499382480607516387279456689408497366651622
- 8133694882858339531350502170536111817502101016960937372882174683892618068718872117122032067336498312
- 8125457269276310564825879010685752080806339287513648175837581096955969933848419910626922411365611711
- 2954796777812386239349341400854705378458378285151232798730884093735721100458603654544945301868107329
- 3761108679782828034366133339780538614863594371635008771193119559848021828992677797694091393084926892
- 3971610875162598136464279519116303391796129190017609532216557349110374712094579004186028992215511759
- 1568303624947160865051863227974295613651983035189714287602237507160599904685227028482420257009629938
- 2791478180154066416917925969650230616749677247841947414200924297729713888325116655222730338964447305
- 2704902414772756471540923768066416528226112216605519035104953216953829995701741146510299848982516439
- 0569909394598682049855258312876445683898434210936589431051140755583849278936997409501389198821247991
- 6209888392435587365554523753623890641072663136573386887150143766765743928298320734613140394952617095
- 3084489658005655846309523296318712451836616630427749852736202349067859155769362205347242611125326389
- 1430252893766737392628606460991664258399987464743414163952677732246933313408989228213523671609562825
- 1349234859268040735518153607196567395027069135357634343767443117249084553776703266698841449114808884
- 8013249302584381770118785666357293539878114064658836941728387365708433757510447991235973659724344557
- 4271838473362051640986039310219592121122572034365100139638906494529671420560890861769828831638828382
- 5229707658189611895457298258107339454017277497834540687764110778004407429296639807958026689312946890
- 8915006186184189218530416433221694927821339211827719021675202080596726274946300280538877794596218568
- 3074384298925646302408906336676064738970496873626773471431934643782695278376028614658389278933623236
- 1603686965888599440717090143857650085623703570747288123004277647474703779463200055437274736584724026
- 1839025081850203994131095039708124812210776128324595639956407303784228294941790417991353653370609295
- 3580412844901956771743632655873343028440148149907546510328181387821090721433983745415095721808723321
- 6393141184885404882476133156499354030311313197143885666833802176668360829503236040595136775927155165
- 6796802958597338036134406930781375730116130026579702426559178634319436264662301868725879630575563660
- 7828996953634981452238866007301477187919864160661439080577725519244870708291097673554991120061231753
- 6184781317654395572950385452923653669413348562178789261547404561504523088531184389783350748069944802
- 0815830478029291395027421867886919801765554681814454430741911022927219318644407497903172599397713621
- 8099711176146890001377240700923484996330832030429732196758278940008466523507115511183481032014483529
- 4744885188632413303960676395857662392727435386476553325926113916010589720694912160419438436276922502
- 0408360183481182715855343925553745823628255237262533143596996463666782559338210091759874444027185225
- 1290642515745359479613052718959948884782435317225627541310959985044277475352638887118926497707170550
- 2201056823253071154389564758303122551162876396883514326272862981524075588799596209804394659688932951
- 9044901057419141998149858790000533489612069163111754682534858290076839537662641452052739360786513805
- 7224150689718558277653895215135856589764073014881111337386924588890982276022973395124413507510038725
- 8948206647854453929055116049254655683017922363526377554626840904947800372684716102649508826206935748
- 4631643968978962700833763037430175619457389078848104243092855236310298355174517454466065297670819947
- 4320599516529159600871565211546129673541395732775167844348486459833913758485625055460175079220988358
- 7719338601394896751483376380213903415290428362645376374580878281537904708544575967614210377236123296
- 1964022920228951469688114470582893098035700150410369484170547286922751970446946972920349519697662176
- 6414362032109874971729908144000371573928189152840831974229437336774778258709218717225298406930555693
- 5225836786253877699037108329877979505169169629957607026624877256111532102452287179703093738005633540
- 5929310890187400495751330564575546864588192534437227170484110760458345052572429176844235610013945668
- 2456604288000474072926191657544095336500054458333133334866581972749276001242323822517184689306940857
- 2324615542392813887422027661693797935663441045037115598236757714312491279623141150164528880440942390
- 0517346456378036293953277878016360441042759186420251677118235910812494784489548807258551257454960799
- 5691801297131720540384249096087363621351310975286209862242624187424357837677291264179188013767520032
- 0563326189241018616513034810244006856808606110481129427409009375274857858586840922973157793668860861
- 9964429073615749053303451074679213921393573414693782678405331319923544330346071951552057006610011693
- 0106114645564891680500914500556137849404543693134859106184193301895454863852198600808200402863322268
- 5779286594749900693607510578023474201503531773730083649498916728935090935421209752074727250436661880
- 0613349590930611407110464599244759717542401996540730654084169735239250415635500390264400292275155191
- 0862941367236000269412071278113087636531615224433516226691901231017136295013316980770097670312259233
- 4099542352764898442089109243902756481617004072173927256602429583715571067168541418713003571310230544
- 7259377064542064373028381478419102186882184665671383261282637806975309886082906633039669846839624674
- 7688511450649131518615524629479248111598731109079771152980588092092858162277065275677719539311203573
- 1943345934347337295189941572147227619036780043087959047999266424281962016300988837148845043980122446
- 2455602660408616133199723284978761593171268140040450561896686909847082394137085518132619963768897021
- 2415231378187331300156011219956570354141065353563845243965564267272174345053170897086203476547586741
- 2814640719792280574469540684927959945904582090187317658661625178733129693572624876301827480530656002
- 9462418101514313186902408749384112421582150837307412833731003222668395769073506988176827548481773049
- 9539131031846532783838656267174760018062788758049254008878403927985646496451552789273450200154100313
- 1905096271080962889523768982872651391408194511671959166631818853373127982279478096384186330812324934
- 3682732708847168484082306510680498401989966141848682192923712432262932844248302361017983910042699040
- 7744799190837610211112396067250719299793136517706731645047986232255197970299256653151015966045966901
- 5088706888298252728640598951425047655646438613971390930202571945855825271392719811327758886955446292
- 0605202687675221367966827468775874528760778634491382699563480082544144131825347204948014212654329829
- 6784668605437790613389102060765389746783799090419822642829171356980043472466696993015751149537152043
- 7403191810795486894324062290945862326245220966757449528566016465787368842465402656045769732900129583
- 7874201711510057426597492533286825866257024583781152182201277576078722787536254417678516818491979949
- 4976491000369349095508194502055638112249647967662496507858023271236894462286697963197153902499010991
- 1767205329659201024327415836646285103519400541457190714863882469446903822456883885007824410392501635
- 9715374849056945245605312540379176033101653477500199864958058355366142071699741173310552540420552110
- 7731858104589461046273558070947146683528783522244243951951095964801933997282254412372911975335233397
- 8820050032094830778066283364606324667100180087066628897715761318039445308517785997967916175623642457
- 9913187479952951873675602067243360786278316446550471333425577456220329705837065208461481461803279556
- 5723112891379150610787823672417063157427908602758268048328204825305959448653553053355736089436683787
- 7887790883577331658156656404633363117896557755386745135965474379288244327761776652997753788443212262
- 6758789612663833068438490058005776137309460432457331415978761655537226301616423353451002374635368298
- 9424782425580648076643361805237741563140378933712699900811546084081424058692844640874238912457751936
- 6466994637359158441193177950085848065280520451386178972329910964611770976297169880547414864040358883
- 9279500405680966882682526783325875358351600505794585314848377702967618326360649136605647118508049163
- 5911181680573568625676757483627962595423144408426869444178084654590010983008324701273276732518629652
- 8101198756674251237185471917419644610996381436922527648768652429643328488026710488044888015591064476
- 9829183364432563837983478922499242473473474925585572931518611034534137335672274625782767187551285229
- 6157193501863251721759999422779441251276949166596411764533113076783943587557015112683397880778230893
- 2767292196739065650167909884959899971836201837724669791646815888400401508326413390170244028639070088
- 3106649068349767628800880971315772643341647052515364717730661392722405632571001397299899095593747730
- 5596363485600615984961253518310745042828059910113561527646137187323074054864438709510376239129317441
- 3926799644747323618213633118585804069936583777606558414953328326602877854696894300229268531019343019
- 8737058717358218098006693891250766257084746595062899184683469499119620505628810062352434005024075121
- 2565976218356834552257668404916525157075841461441328952097009306872902271637056385906105921696945735
- 1312296992925835675318834452109537570173563261816644245918307191732592805373518481830987229456262172
- 5404441898640397503845136061110062107180886892905388556538032123197766450079788089229139071971832155
- 3376607146881588861466593708021811848640949124415780158696473723909595858031173549396393423239812188
- 3858322269062273043691547964773290362031023158462282118660828589608169094090006189644213461734468252
- 1433863060864107649130309630386061561226947756727056616419832266128295594054185267009938944181452669
- 9815121965396719051384313536550321313806824245173488947592503124192484175255740381823511390261635537
- 0936864688471015259866820062966604332671588470284672528273675136369158934985721514957696957393793129
- 3333878685870155864384721219088131194713370873382327500056239923744771721034792168999587001504698058
- 9562365188542682939856667127230583317473946798938791798447572639669972565150933504944962393298941183
- 8095115220273859361991620893155937352131938012702984818829682456924664015891024522408334073529472376
- 7660187190835662573439468354704836224454619937129219945521607705226537983475106667694632555115664949
- 1168070523052817308690882682380129412541814673058459343581273433407463471098101697337845113700036146
- 6614777973756676762211878253942360370654923722566475192700250824888860406223409811545113334223901773
- 6841135991533723731846766340507156896681938103585480799073996134538888268575672435045918997400691044
- 7041116287865267920106161324719998448237152334997836375230143135132826955395290108649420581860439615
- 9053058259754001573475299749827230953870577210005396418869704874528973591568792707994416581049442687
- 9390222782002617388424638959221139263874954114195943300270846714237068128137782298487438922580196067
- 3229557664622256072650083204373463689206974257310148877783281459700550621125297094395513482069706780
- 9204578900900556359931930300746710425701791847467995201645098538151015396961735455277804306267757948
- 7710979913625936622349370648370598168419144090086928384175813696077026265263739842179275186558553400
- 1802494738842479507635936962516581598005490110797072695324488613743499388440836614685920902013874629
- 2972909384539568930915524703254564948483425584353927500268398089195124385714727889228818004727979105
- 9416493716641756765094433746540972890144063281301891438633928063344349424002602288104716999725533939
- 5707641070678950590524163290221291761570720281337963064985988232242671029826426454822793271548045876
- 4992124132126818276723090347559579303115848248948301417317193431046635619982934226608452419772743000
- 8947575190644364250704011573813177948095995339269155798840054782895365239563674165729648804634630573
- 6737117215809990209894453733255406649244555657047977207914581230450618880669347731611549213528598081
- 1109640356420103206503138783298144430856387206579389407056232795868744608528406980628390128319940403
- 1753698172910119302742164874460186196321594468453807557098722129647584261058043710144144891074881337
- 6672138354541424787136666538718207128484761707002802307713986200152328528467498051716009417700848306
- 0781630740674129158570458579809143541609290613494597096889257105679100556752900747504379946338211192
- 1199900912215396556317263329873593583866650018970210376810565539125811274256503658921429101919356774
- 0079666127138230714081882841864932545670050478902357998346296652053903452672297367971122296475763842
- 7953370703079415632893117466348996286910518604722726888778758797953654811330971852577488362549950780
- 8962383116823946505116854708626136402178204452762262185094687714584666765889994793710284570278582886
- 4945578192102470884098054884049428920275863251351203276836916550933375756877423110361610668383215808
- 0256433346454271722024956218060593586057783683982546182236449833541991908181754923962168710528049514
- 2246375891201136159799843803455389874368637941643003051303788958312792484549868399065860064078993352
- 8127851940984016719729727069932213390718420955178247520680268463616539771651234574340304432466147817
- 7119961085537282430917112635195011915381033226170096078197922946035526018787669236212486362488512903
- 5442839737923251389555064014239130766546753811452440247068376528064142487208913451379638599944935160
- 8677107460143274772385102847494666363346194172301607736297628897725128300258084687726530151682029250
- 8730013462199231565387199041060550741930363390184442397874423384998260696760570205353684564642727270
- 3489439236648459002459794947394860416671133571702812092268052781568833531326433175902994653857485218
- 4710972047718248056721561923131996627637828206706279778643822558087274035538875576372258299905067359
- 1541471494743726498397870576633115053342116121745340896541521554977462478886291183035260403687328220
- 2507089353084352345808150719569588924126052875718396496305507662860091116726175300728173888458812373
- 5985372692992626426660021729769040932291664578008028615731050138340599605215180202337467493294109576
- 9139999676638521753746488507214642276836486091831973323639215924903900069678881210112974635837340525
- 8687854457022214620873685872796641453017626335415588794059073212225394670737826546756081074649604180
- 4339579538721133064646799286122948571393385632976161785089115582766119790233799986635770474963796822
- 3993509579545082055051118930347793570244303528304428347024105904612246808113753997074287434351207241
- 7982710008293319137141928877140989863705462711361421706031603887715873410756266034626034693205757463
- 6326530612059614741096786436632812848924621727699060440035648313727017184326110762869070629628767824
- 8337252181678495208701873888835266818806885615538210291793846881259759223871757568737766365217279182
- 9359888912481290484999654764459655545951531923019867342143962690524533746344986037179272054279681688
- 9295558794575534131465881283310245574792805020086669571693957780153414390677074688444371997229473142
- 0962430984645053185396521906026711006056621714505652396167629158214100393073338929186256703337144724
- 1709240794482208195793496981155249255732540880883164819519948492518859797181791650718864975353694319
- 5763660262426172292425480056059572174815355934092538283243334477794234508946594682954801561640088402
- 3550373234965498786621710766801062510274472340547773872282337063244223465713099833535636179045129664
- 5359207727938793927009546601461050918027326975551357136549094051709869143338343735386223956625316705
- 0813221234673687814427618547883058500581078515556788076939732421220873066182620090830504150607987867
- 2078008638748314710467962218043947575563099086244244382809070751636039213609739671934940819820051893
- 0846341841851377586942138597002519235721035235978147565628370064989358061942774783767367165686044012
- 4253539425460837473462224960829827247240218753734151044388427140893032903966317059852727435757224919
- 8043964068936908330704606903363403761135669272008017206016525870166209246565318321783590348318466849
- 6336231773544630393379348923795838233801483524662070768884177564682572717136191483552894403611579624
- 6825347099957785414816484667357356113380319206582213549678296294583794899259090657150858589924036877
- 7247095602252060304105945472235734307619920200387034244022234909496718095119479811812317662161328126
- 5741888792671780402385780055985292325615688246765163590483405880044838458230241998417624203975028214
- 4203323781364695612918160908807052269274478502357943715614285496103309997013947721460617450078824754
- 1700679178188133730735538786796010124219243417398732897632280986762293745343728998117259300822232462
- 4375985400183726608738326471207255449130643364499510019478254452554256119854446896338619233410886119
- 0236636252006167177340726844487670870786339928851878574886890695595205756080655359723625548665768065
- 9973002696144997913863949137643343951178186561697245750119555271398766633102419936496159367342333676
- 5935189951082105085455865902404524395014958657097516880177298008199222597252891615283264328713301912
- 0720262250559930210552005936427206720674365808195919838946862415075380275165662282604255844872369634
- 2315273704964736012472937470582351894637772876085862713952359990692232587035991070927536077178731275
- 4815094035127013817079487040027946364336884277169240128264044475383002168060555973991115327567430425
- 0791689664936534610664903033926454798262450752752970355117029389549392605026116732805080636191135041
- 5038722553548052495030725922083212991676993938578960521919040226593296893201528053855848832676736575
- 6858379942868554314884845987804319937107848408933741977908003386369665963270004800753410733130286958
- 2860135928766135088569413072689527062211944465709013500028507817008173296936069944780801165089977469
- 8383275335446223117890041424456125659236190671377822188309901262050387138637461107547138243333426066
- 1119112499604311974873003557846753855809319405365641438724087159307028002233620240342092669248410365
- 4139246032528151391060258069008679246947846415137742530490811333748592565903252108437870583690180305
- 9338532970010969600087425044814184589259856965345569808272371276255400483792707641017020870006758524
- 4432577526457903618268036052623878996687562686845758711349482617027872642077405327791783966059302468
- 0537612528783622421631814764204764333456586924291561946174147929303267274533198796275905105825564390
- 6412796059960516294105583577003536563242856713972433093599861784854409718181725544777914093209591840
- 5016499843861280737887188167547887565056631963197673047058648946240459492697664532851091987443373512
- 1566448881451325097829979985682830183029271812658757997491525942142606638449347618236694361301000778
- 3474504544383940594638253164174696216796375403949152116008355340458730070341674476885386353724175911
- 9191257302962875769986698306028450551254255778130491965735370810975388980514498281958517209632887924
- 9759668785855762687283638577142823352346656795892694854891954487424195222854027581013272572588484604
- 6549518516222527214858969727263289515266100741919597178328836594559768570577262847855954488372407579
- 1628836314849064779145534872657558501119422648699624391090095948421950501182854570218987410345718389
- 8179048636464908296777315083677699733551507417008122025805388524519536398345318761778123182923384516
- 1492018946787202174802452815919012422558651698747259021550762497491226737659456330761660211943484032
- 3979914407024881734343302927257109286573898942406495618109097976549851184247711339007288092990163018
- 6941142126117034372249667476682598881833777489153001358002314602426047205527579931989940964316114429
- 8528316114869897317486423082626493416316845278016222869452176524878906995560991510960158794169103884
- 5956359668529361259912457292837693574949960006374540510293312523537194211565013315475373628090714281
- 5773185118592763310014484781157730515727741163632176299555971064374278716404082983071046305419155993
- 7148153916125547811264374389039745212073575767777507421150508298100857375238351838357539933202975989
- 1578248805041207059046440732276884830874353451226454706269409754445136975725708915057302324257356727
- 2108516847067390111372101828058046032247916600738326914541593198292432543374648604963396534224817293
- 8325475111403759384377805581002679023593384798958654860787419414168840730434173496904240691742895829
- 1133881573943227710156196247763551902402171274686278247219799676266290091917695564381053856926401859
- 1476166954319407769348965559060313034157909445519756029662487545487909111753269937093712638067225675
- 1463060740233445983148205780778552538169343648053568079452045386888722145805202281371652698201162506
- 1657297379748075002972339219097501220494749417006593929672960287387671952225506308643850360228641843
- 7662400917471903283390839953674746861310109327545085370103248816456357548955860367991893611297876190
- 8356737312274823781827018531064263096134724871436054931890377026133291202074118570203965492336859086
- 3272900347872223765989418631895233975752644826232284678147416783941758787792841341122301988055483719
- 1966208599311296978303388651675854462279134053844760839423555344903316330001247579965276168526319453
- 2930959627313146726192661819832194566480048912724042165730413638330422266489785155626456553219711447
- 2973260582132148615280100972768015104029896520206386068600459816142852374999120852093472923079773503
- 0153390597764783428907474877815173481573626882872884730960864188664530329476007533093585380277049260
- 0732884329411952086482971131759375253443889588142555483851732952836011377915329011335759811747590808
- 2955904750657658456860498951986993050662506017097078329876063046816009521097297787513601863205458955
- 7818005958757171911723235091578713751539912551505260695947605933157635090917977332083361368071945515
- 6407495330357188422563693171183439732516057365037747321453500563595638262474936382247058368475214260
- 7279199552510745513042443383364054939700333371348800299785946575449427651830341211197021029987336199
- 1177647930047649326491521909917772362558052712725779928418622127220259472957836424156951838904261862
- 9319498502398088279018227708670870719353980183576382804721762702614902491846340252361295645126001797
- 5449613122087284837388331938574020189082817678502985052621563352750833939410145554721256376368546407
- 9094647653816550805001796737374314099089474841691430065081182103990094191714290554428743486917780828
- 4127163283349333738760189805192382363730219765007029919984095395364081929393544844337867252570777295
- 9596138710071579214721837075804150054413498600492907499698937903488102082792506930057423601746771263
- 9825044479879477551383688753888207757212063531958650030083910654471490754927971155721846090155394573
- 3251863898128582468776959800827417655549925565263787184749887063291494390803074172603675896802548718
- 3739999619682932661224121706771339713788092520170262301471782080063916213598205297385505558209594033
- 3264708915619555223566380626412574791346382537492599128801431261443620117181006104722585841850028634
- 1562115688441856620282727660065536243416531861727054704601829523329536489605733307453064730077394581
- 7405562218010296586954554296232136268085193584500258735730586665195617446371811134477563610293164229
- 2999771284847399247914997524697574616765240133398871189935029199507259403541776788784275863173386202
- 1231433122324549995210226464191705902063721563648704410426983363333138216958848319812093693683591904
- 1149316234787276366275921545684107024174052979256942981914981740639527144786905118423433719559261231
- 9193757906211785809093205884794836305795612156010565182075216489529364750499783642596878804760925999
- 7018653611113136048448104343137267327149325176406779591282704180928409930214809574578663493779227121
- 3755371254949836461321910547901195080548163778231755318805404834474568234829552821306383035954647975
- 5313386037131657640783340885935945737671967408625251809781817880369860116613883471299915377112383415
- 4528740489956469028260300688542763451896235735546181582222140719678668431026826557381151949371316182
- 3492530436547791887277303957729166760359890682984979275326445793020562500419821581783367975832458201
- 6703344016375194361307936066877060596155074581873007405885541857077712937653954611123552017737452675
- 3650277123601026263711408502493754519972388118497200485295407605375755048633498517603934340365895296
- 0860734480553122955335688214567118057604758841942058349633845421653770202262887320328142627192419113
- 4698071535062364060488010610176139643065506664667145977479275127501313346596764639606994405703118605
- 6087812280632896781657653727506296728357626397482838464729501891798560482491985007991609232399766719
- 6476783301263846508088042831110985025546612968618556503500123610685297435664465619849209211012663758
- 3119546240112661948930083828438659999992833337948765982135588393330975965394351687477025420380520337
- 3382317893878282543047736859273772357478886566858736092568691056377446851131559478673651648492178603
- 8920469205739213739659762934266179938759886105571384739015869538001440033773942596352486926368960908
- 7053952625109612729088737679822241074767848829902625921417206513544327199164599833303338205097023670
- 3791891297771139000217964645568170138089418258462959876893635924393798037012604370001954537532094758
- 5656686261869137769323655538553373664018114260401171263453205372512446880839250455380642547662809345
- 0603910861511948831424647739359453611346263253979030531061551540475704318358069888911685088278357540
- 6260470081334894277564198811046150339108196697436038560732670871560877665885891060896072087471582697
- 0169056266871992681584833517410241095060497613332210304683200931629481966641786641089259633540386292
- 4130152476404151953276182470723527897727695774543149145720405417995318578837498108505057157671110581
- 5852167055220110024031214717157984645854332489073410987610992956496761565447188062442849337194222747
- 4044983798596475584133489410742608333615212077501929801512946567208421155076388164598896617646436976
- 0328924324510530298250512242680703731212808393512202255408415132029479998057513768649336556761678499
- 4713349269562577390784837182482831556792981972877868629036310560685800990722240215387661471364480196
- 5614811245388627165423342887561979792048557301929997500417588186220355084352693742241834775423575605
- 3467255495615418988381785602926769085061313659528803917355560245687971772310603217457604975950232256
- 2941963790630937955810449095876213591677865829539303065765309230704398675706257606714270638526055475
- 9595253213047800632610710768083216210014579464097769268006913907193727253192285262742895738950413768
- 5477459296033592272625266668352170703189496282724565284582414254606303728040777479798854129463539799
- 9246474691335524337231830453538489080808931525181357684852728589173285917464503656120068829470503204
- 7169041537686780019293050636695778550885505423698901222980877912670610523562973580602220182943158073
- 5552190937586577473626473699288881279782933393499869773523241375993155463631192982070653727478607258
- 9973120693062721040157239438426087560393263870639290221903085890987772201985593853726881479322882922
- 3698259046430933978816522998597111438879191681125563749831316110931906115632552892612058651598514939
- 7612705562408767671406059062759367897286320465589407531927159129511701844375575853523697820603460308
- 1114085616222042904289052870934871938753668199421196787160344751165632170440416053513413901731366894
- 6388738555313863682433699759859706164570626704130459126437284989148356890455609093481011580923180730
- 1845998408799090461574931098614313315919784060635683188419505707596210326850840753951104607136774315
- 0631865568117504568429109859360948634686959367227758077306072883798814246810034268587441953320342225
- 9222591131568718551298843839977181848177575276528687274786799756095598144332697980232246925174800848
- 0437354026738684446482509456837198696619833088985878352579323281004784980000165924072903146602815056
- 4724110345203157652765771714505108046030512975963903369048782270839013310400538514937353749729516134
- 8972263979021198896344486620188190295769295043464723057845265200580679906453900495542748739603331115
- 1334342323939281539285755241892542753368993670767360327076953407153977831769329985800290247380912222
- 7024700301497321483099349332418808211182569586232946518575636897541635746895986602665172871063731782
- 1154407328308409582293717686280368564515915257032902756903685712988312781187473459607417310097884731
- 5628386494861931043501661812266303769593726764588538380943049453023030268014210975502503890721484246
- 0093398754399153838421377545972464098687379266027941662047086632843876627366087827215003598927765170
- 7445477065383961960283431028523840913387237856397953682578837058304894726634813482131719088833963367
- 2412315363972952037995614054202652355733182260536030151610767270161366775347202108995240601901907310
- 7167115721315313139910873460499485588793055573290748667569249917791477776275257215331530591915437576
- 4020855624311494453725459568097025647576424442309047407014493872009314855661267386418994254949313631
- 0475961893303490949930728432409009866042964776416063621289476951726567416922104126791976202629175585
- 3059616058835981509438139888155464739539002210859787185924059647802767889239242804773232416801150880
- 9942907513006728614972737850416001553809727869101165381637602995600199875677105287434179648634948759
- 0228434508102484523242850619456464928288338024674531436007665393932531690693471534111025909155950980
- 9996077710819240434008174019090499522416945936708415512633504468374235408291264653803549416953846871
- 9159478644821690719718827904537417589786565396354364174964211383323912726608538295677462642204374861
- 3750869656038144115446781746318241578012548976258024056722181651902552564665510417840313993155273497
- 0128274640783796773431039575001167643501232392187217369395615725612096294658612581792259971229360156
- 0483252932466059000746753828911358876966050230432754644157727204135535343106923020990409588280284249
- 2545660922550473678663353597767011475477937895122163950391748837006069208321431310565114032165914971
- 6054503315260875624430397512016270444756654974450829108449142753286512578843201433719161950742434585
- 4267127681102600799697732731091087404071388839859302056854770568128370032410609948808912037233751569
- 1677129447677010573628517526922673867332490411057618836343343739931740573619353690777058069918700110
- 3875506825865123396341929847330966787573203290483700569033536216837286915868224849316458641309955612
- 8076135431583947979650364579844225293998032521346097286226953626724707628997177963276334614112070415
- 4148305304401967545816235986063466572733057403342467568253998855700384203956509771995410026837628297
- 5119707156928778058823190261710147580089737378346499210043057076158595322507336108729570271507431229
- 7920313721103151205786945818242017418320565151175338128457998173296130009722859113082820909053314760
- 1196781850383675303470470005787483609975909091296303441827655051198429426117421250174531088376152772
- 1032091623308833571020857721625950992529864364182068943965690856477512431829030183533951091146751371
- 8534246305851770744343216131691304544562072955779149889048547850294942518699230156420482367299678208
- 5432770817139937297136472855162369102809439490498095711147987353263361086154490921362107195786271826
- 5898464545958700906924924882052343511286873862691252933569556562440153334475671624094781182657115595
- 4756699368423562499979227723332856784786245269498130382957671588368253903484616714968014138599194055
- 5979179178582819757848123724780229627342713273807017121315934540225441686146416206418549556220175802
- 7171741932960403072428557591403748752412558364868478265305790211293015046009300979113289391102092842
- 2212628874397239879299987221712680244269570436408269175123947288580976631735219034774020783010825008
- 2306867481659929162142043785596907008396343174915704007049111330970230468766158574831350801444759928
- 5202072786040624690986245818371056631825492066663392868941642231681397853741745589835502398141347627
- 5686616221186367561134540185061230145050641464766200254793727370169115091057005880583855287751553568
- 3461355508881431374498563637773694334730779223692023281951260198833485319308413912969210345115664615
- 5817184516091865304897119538011024852574989315864723399926745372521914878779978880756267375063872378
- 0564697643526861306774761161564030889810722990061362029138553864683684245835443420724906526943131926
- 3630645579191032817462246523050868114539223790346999357618192283841178311127342660931717160547230274
- 8587000104786605983536876204234909356314679354437007086760444160809343038896416912293846293502166110
- 0210761640546614532826133025098992955391927596299462782632632116565874319551733594278724799548287227
- 8107931497771103534255438166350502182004755984571947076429678271587726848362361118065924451595282915
- 2301818089716722717634965228375068073131741445335093301055862157197336759105167204885674541572816321
- 7259397927018267765927879072697595865244447986278487669539491461017760577603607110750866034557555712
- 9623454066377584487731406580502181444145701216138894429425430127261439960397515488096841753887787099
- 7710531568960577955363596700780699856501195536169958191091853337403661999066186774586536593782895158
- 6192168358385372055171819669900290622524429719647760765792120834997981483108425338006646056465462844
- 1059597587010538378376695134144117115765801529197239328318237419072418270556211429248125950086219348
- 2545185655397012584064777459094161077898448667987879836035943067050826469850650965071424287984166501
- 3303364759597132945835690587596970583659840237526455951428415274309347600284805973744511548230400857
- 7453819441423549187838092922978318441402238443611232216885056243354185884325115447206432849620845632
- 8119410827058831893542884543650548453563300884266856935636428902027669230848663361182991429872638798
- 8068299808612394976329510463591338269125251879466945089415396493327345497299448983629947399175474416
- 4719717317798726839436024010521661014981526554162540385451779521584002495879879741049524800475355816
- 4544116079649674374767184221183581573767370489681657618646684473995745738638952849566518957447866597
- 7781950752258882987024789009640653185204742376952389335501218478599660074089650383859514701804072345
- 7768783856075809561645339216884897542598305991753761013232063543253442404886000030908226190037306341
- 8486886143876373649417887401204826095051275986339050977024247252980175882639229387079367325221116705
- 7926441409085437401485304590250371696374774586071914054256943815611701443788844188830915922927192035
- 8412987162286685053246038943565002307341670837518645953680252758240520923744676573351270601601170349
- 0806822232723412140846959667332516156575806659024310130320641153751168740775678740603592587886171973
- 6349367711142654304847081133303231866339855094943143974804840787647767832770534880159671410169844356
- 6978084548780518231995756407397883177027113564392420445203330076097643679699900409585495562013135848
- 0587537494725693403309091728323941836921932491518687235477393921275611794664018511800138075010277721
- 7130642042532655536114323907882035094537707508434889230102069364851728497612938332579316328040240236
- 6224770735848850558619602148189507568896146498647108584644537329496552333726418838326212711782724069
- 3226571570786417557289614533829164489186520495527295263300281049823109857339430816022566981711150564
- 2180307494361107813613896822048773651856670209197871094272276503470633850855008421170940405082569924
- 5756282826278137513327080529455232216084540576543785400717990812768836695374975228640671461534564901
- 1269387426711403621513820477587549428565722785336658487290869174951010237587497660723016951857365090
- 5794918186915420495148189506331367232336001791924439759401641677198359451069342721729348371331527082
- 5228587814764495406616826606632817385906468170848098019563095401910023030383772107483227813901168208
- 2582389277936139561206216213391578640790409627777430623945887116813593241244337109448308742299489657
- 2704969668919097678729567856837491826622807594707308763909429179184646728989350381665716032383413004
- 8221490735573101147560439107642307049971417179272249889362511853771844565361124353668033415834710999
- 9781275045931072949201640040438736891084890000220658968949509883554543303448063469068362642692622526
- 0480503822296566585644546381725787202422393060316745016053977551655424603074325691453841406677000933
- 4817262533785783695496880181971420758304790250454493294344080654706966709208196687180957451822379033
- 3116866601065885464616222513680755807281783990499382032540352222147912787357337924050581704793436111
- 6046575203509649920300943063385151557010396543615600425020917540836802510756962724054007061307391483
- 9978215497526962006777174612537517747408077042146949807246566921031380365590139144631933785249560765
- 1289588470395683600524056037732266484889767598647222236870457260025131465330278949073668317542852793
- 0436416844913090148229779444145397767000504764545394419974425340090220649707950657786676256257904167
- 8795171932282160484279042228145745555525850110505111853205128248170449340850065111058596796611348054
- 3157990100271163704146255884514695315016137653098634679351398306442172125391421048484018069955555893
- 3864698447097220729204416001744645744857898852191332549713302548209802199209468670551308850411232159
- 8940306060776407088621530225283963061061498449297470451281206439250952683933163016535406892928056518
- 7157265787411940217478091727995418741181137373534823204924028544437285424144786673531720397284099921
- 0753385213768521899202754763751550880323820345141044903368786105511397455564453441335280589331495072
- 4154536504253686358765114645577638528618422250037354433860841945720257808362467051613544121936052124
- 9265478557979011265815919933225542147336102522035640035827908575507305278835431594674179374264974074
- 0947948944779573166096230217323972884026016215508990745102462967183685916037890598163574392667278295
- 0299181795702806863651012454451544131814296541845245197887305202002880204338955209521262425068207362
- 5164648296888315050959701000226437213534878582602533578984284992642598493826986555915745522772230447
- 8367004512926203259072844700707182646394299397105796504924027215130909020163225789293646620690791141
- 8909170955485858170999693984582418886230434638646853709469201908664425001423704907060547944016363622
- 4484204946141454073340772056136753779947174346418696144163556429471591970959124572988939233815001041
- 2294395852881242903163818939118293640475674801320054837776422413083227337901680551345611878652637873
- 9084602983248449677767652671446090984272409221944208729050777247422712849199862752884095453612244260
- 8122367302636241666463676956582340509347865011435452230172110431829674611812712477267475584183473918
- 2964689242439083589830410778612221646674139274580844109344670914076889081154804269904644766179037069
- 1318643164487293481162475314270947951218371189543080160613686742330865206856839261480478445664749457
- 4832329837112783484945756818482357381296729860250944563100213870768049043011088410435606595632913551
- 3636595379057745086346584183793785502138550730660620323618920265343796554240913886678051764866023556
- 8680102444381998217408186830806326579344501366069588311635276590196371091221683021799431781781159756
- 2569334811817590163704539548800254386919502939484296333878802324540268683115920771472660964081472974
- 2564135237707132655865672926093521313563269738633451392323794912727416044071653328372766636069920782
- 8988515818900740681788356003383955024910544219136949438402592897576804164798738875441907101007388250
- 2600250529371571205988217997519052515481351289265070350312953887973951968071463129797393988552240677
- 1074781329661125142444094254620586560563864841176973765093222320058137389888598930223363080952193426
- 5228150675306773116834992003074978449533317392356287724988901104982913538099432346738706479293918382
- 9847365091741599344224180136090702185376839482371972551488138816352825082378087561773037185933102376
- 9015518148956680264510669556676356270331637550428218469355260793128677171630081522970525013994404111
- 0995237587821689870722832415540437859493648816597106019417011177530819779600610206107580954184382263
- 7717441589308934402454807763589859838646004481913063291821212522007280634089056273136156282514259729
- 1169096962116740824716314518917473600695966991423080878338378686590159867022321428691570141424807045
- 8972191054200479042072618389456591675766243374816523343101319777787506264814478962379685449183339325
- 4452263282389839955214350864723998824618234678333412034969696346523102970980070312729811300298748758
- 8451556284431013156099089461587840584003836145430627502838434516836793994311551940672336880332618381
- 3019065159316862019183963643881182869704116494587694221136576981495173186043944768192239400670145512
- 7928254056530324642352419083789115209165207534501147751337617613160303463500158304324119830345045973
- 1115480235291472675565285396154982517322187028118914755821925109751881474996270183201238664665544709
- 6270322119673520668256883487375964507251207969145168739639987295089292861505745093918352489864171151
- 5633710772070437194298978525854106512202087219851152011968200668515495090775699216193168057612255084
- 1079956447357236211513844260591187852361111576674624616760589490884732188251188189165372941301847563
- 6508362290409687727075906307595173734465381235816720569986154493374413551158082859997972507000542569
- 5844829042157032963296954183720611253277818507824353239187267379753901060421898213335680014917629276
- 3589739749151033610294485487554126594588308262730872974158135998785058970815642932415956520572243886
- 0158420781047504262811290442552635054829661343198347557885193222267186930364566727102649599400511663
- 0866373172740445456949737487485211033177549364625380611334474310806832630846622039370773105244279995
- 1374501935266142352255141868055104005021438767785929901108592518674991313145000872583711669369824976
- 9940841616062428406308332897997161870505765196240492431659995151896649754750390011473989031896878326
- 4557847453725180452235972687766876242850753816616792488000823409032034807146522890222308061496574270
- 4477221250266192371423562609291226018250583731811971039075175338577137807762131772452879479158317148
- 4322731473506837177881579852023035280059999869776669370082267088042043304271761036044360211957405318
- 3239775082537624353359925874480669523131409508267297420082719591871616960153406545781475710124329470
- 3404989011724031456270700708589135551306594748305010926753310504767668510068727953244323689649387243
- 4914018868580217669706551588502561741520703150927265145873588577166907411895667629416813405784240677
- 3388665298433582820992092796000256053731611957486517297171140435836830233310269244755634963018267857
- 3511105639749473357081758063298707668034213096682726128479506043615265442170363554065832901954741126
- 3216179414368623878244681088510060879820657196947315316887276558292548410060026288708470726414636981
- 4546760230690648480001950891529208834752002948330118357071474860460032318036646630113783461481020801
- 0408241624643986285802753525405414811787725784498244012153580883263111576793883443994167425526718127
- 0687048579050017001882766115402598966456382269528408612570000031201513414621462743588188113752159623
- 5509096186934825303819680850849675713080265221001754452150438824469635391354522294838227521939781610
- 0630815713947347571643310028857201156174719192266771954369283128266043960699254637219602914253777973
- 9831674438120809721881883123622660338707532678942538559169182977283327312615508417484951235989157986
- 0193104630204088365812328283393282877527485978705364732951561411429853246103430255531301949643011670
- 3792865637669569854796374437404695144047524862747673802558967408496302725388581738320957777270442659
- 6764502346241958872573593386155268081204775136402786059671489936812371201186212349054817129245481543
- 0238041036501487535674543111800604500426130787682215885144267302962084048226136949742620817609999350
- 0334461976884187903041595951539264111965464774820849603536188945761220485718626461432327497191880858
- 4172165024925561228486704440794528091825391444698761813663319439606463782245081613817787292827839764
- 8591104634556227172221781769229741153867862146057242015889821754945547494863631767227436470898021546
- 2007325013023705721216266625220053039613516788310130085680167987713860080874414496085961030410411974
- 8536983111367107082479747419717080824301691666177077131276333136381545315891337525416839840847864317
- 7506675039488466367772146792112185361223631672188803806610698593702379096318692240259119146345846149
- 7417121925501992547479600484600633459818646080115937447037316631953518908792056481072811877724020397
- 4402460212973911013499269664898978223364655365129497329341543406894694337381826637786050347493433270
- 2908375618011054934690179339428739905663796976347810695528961987646189850722086345874757753558684468
- 7233572491790476548077510392373639618546675333495970891747050103139694380902363404579903070724852963
- 2851430888786688074249816358563633931419476252306615252056589630703714209157446786673768335155822444
- 2263717555290549395328823666896153326331493583928128224584932540555941071950713799703563742340097316
- 1309864621393795308709471653612565080331578504457300009414139460014745254414038169209933604115965838
- 0050630368254566308062825009488020034180021455841755463480187653567764411516477104384366900853706116
- 9050325303146835437133581809292400768050958188888031319229966049866511923553334427159951307690820852
- 6629677403102594730225917768201325910777315857844773120758864509339877561872662539383623575762515880
- 5620309231213866578072162611618127003756053446226349498386252566652422923443651396972082378259957626
- 1080998493754227356751224109232447930724282802917623537533863708763873518155274821112448002459124640
- 5111511149966446261984339005792546353949622888924362325218640252481049059595540836502868935748905420
- 0091253386743431340734226519599814488762644831855273277494122878561306225821878120011628573521338086
- 0436525201235079083015059632454682818922475989132871694359851422675732581509249821248990518465907278
- 2376396492321190420564384917255643187344162296200604471901611612786080691597050723383179902400106211
- 6474775843902375746789131695701182264621770289457119136412685871868635824932717465627067280751367431
- 5975075657747583764063380449448206683521783321333278967763836574467462017288395723672110981540162132
- 7006816874023136619483325010446485646460364125317413333237960756729373305212297457933352566168558920
- 0437596251342030638342943060971584740953801974115495300102821650559592594591948533482273271554448735
- 2136534472942394955964530478805317945586293418901077793490276022180849918514125716531651374508750314
- 0146677425197647620461669311332604538789645165729084386151944311401615142307022471639399010043790686
- 4103416236790741850646376825660389550334773489673113343136294285431488760312473133541967098000845264
- 2740142097631369587622585910093111299737936001355335292074829853672042761269847640066766986610534552
- 0728721873818067910581629074870107673696521668734487874382771997327186492554248066842383302741069609
- 1855007115354892417444079433704231825456068386702420523393305803173064778859332292996554662168705712
- 8180663158107596988037954190286710515896821839986172264565237272159212726998561668843085968396028717
- 1538526694147931732893545844953150218593008668911797136649492410539530174013607858891547134085003976
- 8036453811115720861295639470964557427082387312687498873097059005337318346168969341709300000861680278
- 0058956741522844366300229652650701385626568435888629758589271228973122504501939753988019599295859466
- 7444885279234641037247334135338390259480773955176406741476465801453303755125878391520600273054598058
- 2800834158675087820218298029124179773152353857706406771166845213368665010906443991846647291438415228
- 4355957780524178692213439026209703590303502527032839798676548711129716415065768915393509094042163002
- 9212623423471285210839542166491175188768489016016350794990872514594428409076951969961803771282792923
- 3063139463215096579366488528671853658985428232404638733828178481530209203088315697267343925583364321
- 6320660898884580711362776399966495706481333243008044307069228179629683286131639498341581788714262196
- 6549905140449994905132275832902039733890285425751366407428377198389513758460356859331967636542297879
- 5979675682839983101815254236665985727858888680648518945970716203467370351680456789741083210206877691
- 5310505668766877329334920023893505744369544516023429794578060306718931576795190895808112827048686785
- 6517949494253179898985455846351101662924150670161176221975729255773222299579570269514273134125870360
- 2132593747642947677233855393949608034943296308145907993381594311461023743648260905274892609114997817
- 5992425233969728695252416687315009238204121285426136163532491366251378662874417287369277732668533899
- 9050914428805931696176825772855927778554889122488088669629022220090710531986727332035012560832761865
- 4686069004612176551141034532831271204435229510016794790313350534253556783869192234312490521332794361
- 2569046803304540642593143348598935298788225495318574248810376413754148449982952274890279695089814986
- 4690761644389575234356650649798259415250324263255294411659694055989586650761215339929748641052808309
- 8879197123728761697290730295301586338095431940182026691046931393035266362835832196293419502205582156
- 2811510082783702191422318615775289443074012512069822362570413511621279344747937375070858534490402518
- 9467769147420649139024731524047392237570356833125539744473636977591310167248556425227049855871329918
- 4758438211851524915321086608709389477465558909768150090915524531843711016797043942272006065934727864
- 9237655946958471716429025786327183436043870606152679931992517807196060181997889618914413296815327355
- 3656553178278789877045484925656831540484336866358934827911537849960146294330178535918922268713560211
- 5638066888736024524286151770771110671285143971739462566840777072585891951865720028302687827488064624
- 8625804514333344541330861637868233257296257953800673509106053396523255759682415048279519619749459051
- 0082179623656701477056459027478980181006309518889621379037693653372987268128208847887010630825541585
- 0421334101495828542771806949463381388168245190344480504922435510003314142920894225768313480195104195
- 3956483428383168994699706893612395299336477360596737956301617803184226182619920816348676196602758664
- 4711808760325300708745350853575490894833166708013253482497118067652281580236070823339041428117022941
- 3525360033063302611245516864922753389765333275088373087354659141118979834197708121109080471374423563
- 2419974361958142327674056004446749156949455787149355479222541764298223075736651596039395678729520830
- 7621299572905646333279790560873601966838068415216005340982287176820543030494829640714377958967789178
- 5265134420901479656996958603321761028398322325242090918749756952825023624449423568735010347018741990
- 5300293809698609087614945672871126806871959924240064653277115700461234695506725963015667229090544556
- 8896694903638197937468465866534067955971944629775631645824343862403793489804730057570983951582161392
- 1444041889422681665534895414328206155392681993338132341431398790872065564411761005197910307921159446
- 4124822986954039586697896296360224807663263111856093817090755322596581714925458095004864281930723758
- 6533109347410268460883510176552329792792588642969057722571390829119090719641708538459454433599189629
- 6182581379576619525337770939593093755869597915058546959060081600343557079220572841848585599616477156
- 1906337685043293655454747429793082284034010421477940049481806545729224483426104801520489332597893682
- 3575947758489390796539861320097773887838900230664965067318652650568283958219625803380702097089887141
- 4621585654426237525431393842532127573407453319116295517118791369927035391723508149986623779442841884
- 3345714929271033322663099327159181177798427378975014789433268497205154307237560639987729616687253234
- 7099071746405402407398765307649992827255557333971022446852281974406356741544233989522404042548339769
- 5537147315990391151995816094959851210374536599442439645586621895120731402017735567818531957450015913
- 8619106408997869328313648390096137571062723478005228242118426427552831612858697601566046431833533610
- 3972337460199915388931573028588269160920494884541300922625883777140487965516015543593745110789847180
- 8847009606077890762206936840737849633609634250958470825725633681267006429102982227999157619394123050
- 1066561932438529131227088307156747196820218627201948474469147750995873774866029631262112393626268432
- 3153391719356913789891966066712770973432280825198475061954062034493330703784267983799417718823847785
- 7304923986255856611633528615279571343531452481039163835170550778772229762397920840708871158662399192
- 3319336495574109949375410066796880142650207310666332190372968824698040807054186317885193804782714122
- 5654179999425208472883282034768584897255257471819411411100417415667999996419753284032409331190631921
- 0471346702337851518168229866134384617955922289227272479295126971190232496391380440439957405009271208
- 1861325429437494680803495274028786638624393417108857657456509859476694892184500640546563007857601863
- 3790396114271309657046386091763460387568116961674247700175701209622415995297606038534885700148140313
- 7001128029694543163723511250880211913858542622105689948995183018091417190615926369347364953071541759
- 0666788072282014882919882051557077635832956721911220357704249516850618829530889889133774280092605574
- 8231190883191031319392993345592313428229082449525800523923120354684095918118037670041104124295206004
- 1674976055582275384027855722899442909707922037347988086735001702235402887074872415687791506214652489
- 1733255247701844863336042379174274985534336281951376593862764032817426362481472009657057617273393219
- 7137016249943760722325613278742493777785892693303359640162133441364984027113913384274707577695437786
- 0117566491086194270718291744124265444598136378594344020432286589754638643482729148367579090612462084
- 3234390391923443343496772773556111421320014394443227320381369085729795736326744778943865774890385918
- 0992598862969779258913747052857795461303205433036775220335508550526418524683519492934683524328602941
- 6899457532838210307005971426445390140901802991823336647440778847072021623062385605597582213448377296
- 2995988321194341336945834461478359693702832682714104848145288290526166403281494081840243768279808314
- 9452046334013147931875223737780641449565756210605303373736314667499714281990742397055859815350366620
- 9046505844835829037062788217951701095497639603291046554060692645863021268740270333376287090086360775
- 7172312759161950765391337763291958221560239574342934468871298084612180268971042434170908330991098588
- 8888352540859422769177682881207561794396901190756634524170061632008101418475332908113003093109758677
- 0730363184254529334530976661529175236632365647421690422806169751560533305992507917682502236464599957
- 0337747610841475018859988302655204068322532391058724489413214920420150763661972890004060592720424962
- 7607199929997651568985047882085190980357331157415446555005241314901243989950767377911479714212766615
- 5536570002998064352235855946334029151965574477372577452551736846772411482287637268001963584486242603
- 7986498657582130805125486775367180449618700159104473879342430418785461787045785436649442843850304116
- 4819266671849752526707365839930254006188659463004425934986421887367466779140102899219351903419847325
- 7602258531948483933820611464807036489978670865314053173481514324651853400564085301928990763601600914
- 0767076874864987866144724164384262549228598167910812920521882291519447434704103619261982249688650183
- 2878812286552614944872433559864067055348866764216076996015355082328241827071561819631434310929628040
- 5256938017210064387456093585636653375409615209936844109006423455594967899258652717374982980371763864
- 4155408339933247328130954900909116944267647099606051366703401744118303662250489910202822410449800530
- 6393922465176432819632004447864310710645181829249015547074663013665850277505079676669447092311169507
- 4284579269198646547968976985744247120250261993627690491868938537969774824130205607630433892247367574
- 7538314713417546782974962447706654093819818294053395278667728983884828299114239277363245716014373375
- 2630480263249421654556576719767519347205464994425160098915085265375080025107560543265537727234223071
- 9696794527224661597386602174168903912272254713382591553228452515226694697281730317552536710851911358
- 8765425443579041298241035431744232764343271370654209963215706364060968713845246245663352691301220789
- 2078038541203760206341195539453469466949309162079581991165930757419826929877866650365908258531021071
- 7015018441367529138484739081922356470866562195031986519855569037476710947140876135315487181593027818
- 8382078139400086999967045174005890292947204951246680739095172243055169301048038278147544641937702694
- 2493272433681252024601571534861044060759056332037417883714753521439572777882746386184160872134325498
- 2369004837382182638400925102155997628249241483239110024692789253625384807769987524168277515798144534
- 5592180912352016230923561872620356180637137437050124625681248863511622694756689681361908739138611682
- 7810422466418488137749163775823530717510933636515920783202850748781773294567957228802702925330393035
- 6296096550908111234599045006409831462600113397660037298133881316144986246073840041038738952334677015
- 6047656476774375309135303602773064948548181815798555845871362783153768046482215248418050024360485920
- 4248195328836784036387899563193321631831778397529919375524219659608965065537394044608982289650830886
- 0509089024965126472119109692294038660590913782666359794484078326763625443829738263161238512713588318
- 9511072580994198572394263896590594982782417809235047599580728228798338367066100204159537645690875936
- 0820905304646456054983510903778477908765197460005749378268569622689236564736896640023761421391404088
- 5302285301422924022934239184746072891824401584031619657037005116503748328361213051792767920294958449
- 6107578731219312362792490708774704940277207668639512899595810379182555275737019903563985512824029479
- 3513430470149853316341488272414708705113722107326378167707957042443525424026587849103230994421850476
- 5710476292622152637991177350294554041471979736189391641364679582508105253622100956730870705995351102
- 3282255406880818424246132905503411246368206259564429291757401920097057467517837870949738346200035152
- 0235096582205132349518812880974170138280072774927060738429578676545651223280696018735927938422502982
- 3945265456615376890950037612041625651830107353700390702915020475371427789436880591732030271185778991
- 7666634257164269537166959331831417686469920393292873147806545499610556358587858035598893825325627842
- 7797527748695905829017843531703864196779140765048129809438387688116335995347497834963258404256655648
- 8352302309715263896108526328413993551737005570157924331455713392635064912691032874574336801684708832
- 1019831805725899635641749947999141176464087830985873887601262243929152513512743163114240916595798544
- 2311940742639141995737008193686324395428889189215907335571177725165886954494464905156957324223604942
- 9106113988187879781456923008256816350893376885360878491509761407672722017652632700630404298829853236
- 0410002404018299071505820953486678658549147523103917653043924444519665134251485886593572530618789331
- 7329084163403552216474104154352613758218181879127906528210805664458170081884621209532764188236193739
- 3715845416545004613763475572691672524761025578021119822121916167692479946814851022110835468697760470
- 6507970232697917944664058254587841235137839159878685765801747173575840055450021699156624893432775705
- 3162343985746512112556697615957941655004309278395806436785620176109369534322744203237277829212641072
- 7927331538805426571871952314614760851241207116214537070523460987352852535263985551737598862152283252
- 7062331717710576468344207112184896971626329212490614166624188760417868396533520813403993199974584851
- 6368676490886859104526807873062160502149585919378227149265333228609685365050398614037995783932359268
- 0910778905485558610885924282242259277447736511781827001981388531607305680336579676271784577742916999
- 7919369629629072997268103049709697061750361784872804915714553234024897008651825057184139097089981443
- 2108632743076295346483010602917603173983162988558076971443395677290152947924948925730531036288092988
- 5710977420343390389424177496084967853115875752446072106263522179995794483282496498179688087770356049
- 0697406097558151120951620501327709107803913461147510049698677195780467282368221758850855512187378823
- 8435502397135356476753128488751114558439441307561669080219404705402509256163887305799593571007095421
- 5242402389738661449843026964361569759383503580008652520663448232509342891281594682468813110767064807
- 2715392133808549088932174463059788581127442534488131962175507453904692292260778682863658751566809447
- 5047862672273570769537148972648601362808015084422632659722114711872171544581877426158697079388695592
- 3103553477448442710277279181265419391255476048443180934367966463340428283327337418506298654994600120
- 9056686091094950352084418389916340306963343519971372234045101839365628394905715741199173881420686449
- 1885648968163335519506600092884333252480673558417133749617150550934263718940232530354259938439418771
- 8742088145543543561643034891031481520576588694447827064491099533521284325191049124690543217380510679
- 4185988054401289425123258990996231232405387739821014464058496559741586595232058144988525103769306549
- 7489313506032936074481814998982011182749277815201132404643038340009302231080547259597551216746706659
- 2294443857107582935686515980117901994804535824717234503017639891490221449489021601986841517587379191
- 6826610983857384537652804189009337550323487675887576583508168084898048899461346384675835827589450046
- 6480260224707959607311234708701901229396384219925088768537111998543312937242948475788361151740833584
- 3753310906659427013258032954398152692068105480421552102479651145454331971153057409954937838369320017
- 0656410239939685203415131733092513860829839610344837564348547094563741106045616668328026369760559410
- 7860053014854032125282532232725173232493557882265939595083733400950598453008448615493760830772932369
- 7805390206948984365228679285807815810808580649532633173056468160917851471254000880722579371359859196
- 0203211769851661813820572666448797145605056476417427368418914506734245675641604829030981897917595674
- 4799704418481543956047023378435681267617715798737487316524458821001641061928767152951977309612579504
- 0132799512512304460717376533044348897583775022006741467780169732280054567344994253724138458236775963
- 9957228554593078385191403950474413617589100741462268192976969498861286529855178802499331966356382483
- 8294192474319235584267635073198580303015343074861824378325227933579938356853781132755653864730024767
- 4306723758445557066433223967058378975019401109845845303120397416081495286336512248395115142651395213
- 6199492804776145672284844312856596154497313827859533076736960149415863707036217565867010430358696114
- 5791714834458205482295971166547021136277282493540794629070601403720169035778923993263032726072545060
- 0403646050283809296100760006762109358216154880968279818045908769907558279711149674858710365979817790
- 0559920461992108621883339386436767545357823633698908816193564218210955951100939837537477554658607786
- 5594330622484912789787545081355800095536186322477894557821672858215655834857416920557822343615032535
- 5191306945196005289498694046865586452883932391961240439959477905755435190582258127024682573216026993
- 5312376217316256389732475711628596069997082939495981464546812429119289449321675789363587752365870831
- 2626129768952214037121333371373636570097496111467954738940216254866841463524981486568437129932566103
- 6903209843245244363745789283274532540101378735460870857849153391330184879650215888109299037143501149
- 6211919724372703633189011799293100919897206605891949918385269867800580939230917378195429850851684668
- 1299233425946670761777675588620801261412614640886156063703867564612888143788618168840692105737310071
- 4712755602825523846104942873199498380141927494375100694790609597627570407425605279204037351322564372
- 0532009690271261787884195824392343316525246682094254662729793482420950273277702953598156498247338180
- 6163938715477491975350493217917432066843409206201758084778305188754961244239520118964907047660186063
- 5733321398793734673914908088123513455137740715586822235455884575446863433377540313871302626071462240
- 1171706024010652254911986468430964157219449244602828173252536670353723004242498660648053112750195435
- 6523225687382635156061797817749036314750495732032582722820879015800370394722078471144085353021626740
- 5066505125616695005739908327325068995212697526160602725247283665244676995469356947594725756685581189
- 4258537772576809839768588064964418575387172908716236658429546000645728360531387581386362944104313462
- 9953741827762718530615919342612177132010310021145256576690287097455533109073858111289551403927166875
- 2247998498749917850258926890214824595782590518644548253086709605415246391648674819969569196375971963
- 0398096105803354613278943598184350869745259200054859003037296168307195762268543536417311817450957993
- 3164776907746402740259052553880918629368604586739521133104685547484403817107250663691014557314738282
- 5053570575661393917552606951868964925034468664749146526156085505037913942029819942221994735438231783
- 2230368471373302474855942982638040651298489197127731269793994244683681397971930894515313010228207176
- 0241132296391228061815709537618452022878633617842610353107341759203978291654370239534309225910850108
- 0565591877252777554800270019294614144153767227568255332141737201407471347884434363167591614387225594
- 3304949771961233842226616048964396242053267797041430802411640119680891010920634290380279255156967953
- 2441619283486641083828605441536996436593196913777787005936030482022913026514592296134558029718272438
- 4196876724370844926367550705633405026837199449354732652656320662743808369958263351676070823549529856
- 1583433119524392297003987910675268314944224875870597119750135716880807708801638578432778181513027786
- 8311685891946114301089589218392897133594139288856488545091637259398359742076715707460714975246059863
- 9896695746231577768604879720148035767956484589821970288761612319470132095592421448835550576272323443
- 4842642601175322306182230356585080470110118991932525717205499629266412977350428504370262289723585281
- 6267563789630203898474355948061217387390668535438453039293129881938833041183423778361478059757505840
- 6622541336293357809319478196639297423503908480593200697899176788339686913197482588647470862799713132
- 5613717273081653340613946256855059072754586450686465652776825553429721408833837278820102890293240313
- 2421020026106356642443696612083041768693220104899345155973211746630090867120083557242052922510628503
- 0294066927058050440068181922735142563465843548110959320734012749694900025447207973603791646697031950
- 3383284835516767605831036545270857655498002823947822313718870396521642078414038632005016875592892442
- 4891643210796200313711074626069359189558182399883659153109700423581742946007359612474329057210929097
- 6292410410656620923503792443139268903030622034078705847521368443498140066439968281777288328306808296
- 7474851072684228563950311923967939970227828083290403918794270125640317319867054809038172901093826770
- 3276181873338233299287354251791214674169684443841609957921734925475411516955036329294606721879838177
- 9848868362782909979843021720417536252229967274325716308033262679427008834667993123722778928049072690
- 6343593863344827373494687180880694508882406899726165871343751874071244353589993574950576391055026023
- 4884831930109776287518455556142797284284876039387213049090254184884269775140116269376139550458568990
- 4730039876222569569528522702700707002236312782756472091890723661453383150645086601571667250304425313
- 4573076142482529934735508200948111074026427032879613545589972387692438810975970444457279722559558214
- 8318579221168381920223766601470535503329905663899611395020035590039531431485319997339561100645962955
- 5821496162158045516324961524984625491338666155661305747107306606494761259251347398672404294705271394
- 5870057114461774359248919999779853985891554580117570754584198570746444171573528708831815566490671161
- 3720524842124067568833334632630939467440591539281243468652741507636710833294679930796012132262362971
- 9228890611294395686589067468858225888839891650188355330752331981579035535868551557820654682183321590
- 7429103474695675663392485415223645371500388621789026343137853026622744881799998738533234152500505075
- 9944529160103849242964737923144851996764003120426193110183900107455976932457439965196822111570172250
- 0007801852007690927995274819572235224900924551021008329435060470903821762340123527848387377273143198
- 1235331216735074162478419546325344615208289122378046922908509386280752677373364891675275108867186907
- 4857315117987191127589737172122200697902686270153977033376235391685730235327780805150085259817532955
- 5080787788667281565096669161583911272169869938875911268864848545345289838450017200753178809612734774
- 4030045241675032393038367061707101305504380587173067566833533745378303685599937759086951306218465528
- 5792359339174191712054179699872561324532665773975697093217056219380046148285749989375231643513474707
- 3658820981060577886541651473248981787009463013850792559222607297152262038819437484391431059409599258
- 4334465657681739689326110459870100372754352511637744161227299994101861956605142159694120635513144859
- 7195452860809748682548745244590362604731380648393797344681866249700721554710601935002386483893437562
- 2763501279258494173264366237202327855359419493045001115249370114763463415754264095574739430694456354
- 2362081212241176373576970867776359301935638364440288936305078333228036674743943248657079895085250872
- 7418326835271995157792652719876374997907620843894634721262036078308173814280478785549782897862274724
- 4177003016325501339705372417682815323516176906921997025569996205464243726535775472510240312994355386
- 4594831470194940156026684943031837836936554661866566254708258607489483972825155891603855349506451384
- 7442211882756298620633135692134350535417532546229427385701851422160479791812391358185702336381354453
- 5711277117194321660466143101547419821554929047562109018957208060623490880290406785456674637241772486
- 8119007420655784822192950106596683535208679087585534490092713251073537813112328600410529188355048282
- 5682124393180978579666414416419743846503597543167041838521459077943357731496484574214860854886745291
- 3145745893151848342050585427211602752070105302881218204425718504079717735193826444151430340000389650
- 8354760695211261435151449409699151517833258517247989474052420610045984073638435113829829335370285516
- 4153281846898780435921758197601110371882601157152121989928035754608388740947375220406391233628982806
- 6187319532355292040142200095154808807061007453865639725897080303279855124057096752994877525034838119
- 1484476396069023998008588751011612900600807691194381030260949480659847619690480593217852139982865901
- 6361397294733342452975784299759023288921228876174536434315837531437849574608874737342587958758219901
- 9353898142294239179415156131539793025146413798608959887675413694323040487028555419780922958044698990
- 1929045589068465978383379944925127160494133779070648657858949675759940506175576329347568082892202911
- 1549186488201592146177654499211827254988676568962251706361483219514060308448688429474908171412276698
- 9529766528467187010729193377929282443532431382852063570615807692592826032221194027687790429240836532
- 3232151023540753423210947605321017167804788960416851071973969399186187946346189679713546786722440290
- 5164443964782932669463584918661504011655032137958238846403545337067500146824508939635084079633883393
- 1644002155762948765545149622984945735704556398458286539010312031199558632978985996427424165456402215
- 5269311761821934040528049770013958185699504506269083218442209858065603603966505204050926529449163112
- 2474122439854552334593973602158488959564576035601123947226002909110232358183270776031819289578931912
- 0042282972271927680105785644667334020318606579759989767363004515534412122274649211784192104299302330
- 4754593408148695733885585311878925724359962470195810494083427130065971636437516574637102498705362916
- 9290060997979798208147147131128995085184920039864046146530250994914143403583695568842161518200066725
- 3985853203567078753447410182134499703959178739753496211472367771510750644341932067097848101390611946
- 8142996565946949980301501505043949916581936434061754712006023253305100568566199539885210969917968103
- 0651566276114001239394412740504065600221709854777964424685874863196946189551035133391641195903971893
- 8761054426423024644127859663201484795527322743409286346200984059824533857638615193364432098339181957
- 4962950525271704159411032941605520070797004452742655032910680168291821505488657297908306573320056671
- 1040393166428946073974276132720699137735888776468407672601645037969090673762491231815694613258421465
- 1124301808862838501872732082930493205348834908022579996208931538204345874620625236296812240775571667
- 6147083325307435180280156466152412335772666545968950153512096407409879933525112423683932555080407795
- 3890651359848693148572687489949014085300106254036984402433985738212677629454919277281927072710075950
- 5419454503790918051636158083628887001538672439450070274989843218556764740324714392366484341116062093
- 1019601825031780683539857258391335713344930361449170866597972333881453092174031811747752032581674338
- 9458264967527525203611262736721097645431340238065872011251345146117238016383594726875228176383566558
- 9618861321672998939401494125103564658336368877609065883769674182919192031194564697809424983860904160
- 3309637645292794234193002301740054343225854625094743545517096835436975603565019923851473718492670597
- 2332775797911738152474353163342411729845894129107504555042885877762737340663304160391808268741726065
- 9615989336077863307019922231846664888930452715240551174612022301603661921939366157937867369615816259
- 7300582128112825576467959494028146674576045577470673902200197698318259700293819541492759081133733236
- 0588587778716100672583596232604960016058991488934220473616132710075452300484394310989991637221886232
- 6257224723071197918230494443514033574476639708361069860714457006927639663973492029218346297644381860
- 1893766880534512777038481569085406140328036150280386094903353489323035792511739353041584113326547129
- 0567398884435930822283033032221165929854191965597971848854238871580891403693016171725700155706148369
- 0681274229550279346352264500686934307748207466636874761476200227501815517969782667374145950438705887
- 2387338963291213957303994663054340289132774681687546695021614124655037009126591798302903887348417613
- 9723433945569356600838016094355613785537468920714544233776467196313846465263157010171323583974874665
- 4423630277928541904501566645788185997947897125148114050237769026172897930130806565716312121207914290
- 7054215088898379545365916435512334174598794809276941751149031174605522455785458135586702153090077031
- 9556558995997468057416133383616416911400992334155643868362258664428079403362670105226669361924674723
- 7136409054289852051883510036926818799746564705254506826839362640699442231179129973336410667817359159
- 7162898327417728872302052609804248757771006988196240372912716284558358478403404924364878183372432037
- 1618788149318366321324242424201471879866012908295449020987399595428721390667769827563089167942174016
- 8823587653975042030244898641889636909631627012055768196992915499277514254378812946766508325035126716
- 8466448444547240410124528064217832732227760436916102880783588718437100518084017958014108352816351636
- 0380534630763891947615018698673670605014755654519125563485474406162027393835035627856152958894681701
- 6999401433231109528721244827047206054602585006670407579111413682790697868658711779204356114892996871
- 9888032590349546258685078645156073721715399533910705457420844700489981128289942160212220926244947274
- 5405610358209264251267803981905452659443737519428132171370336125910575516989928472946953424298072325
- 6290258883626842678447029836313294966054416253861474882834798167322881097848769413234367188334829751
- 3277555209811183566129984856870217344971594558142051676013631681044749870916364943156667001634124731
- 5263146646944702228602807118139928158887516372142668321214150923172057318911173288259805252015609004
- 1554777595240408913500940365197084870074967833274323358869463126879009850231317206614113210860760486
- 1957063566245230487204929701679457814582009036192806782139458937433777693126987686811712481640849105
- 2538842393336908946354092358023108172557634997996943645975444894856647732804498867623578917302150269
- 8796454984277123360252396013678890263912763167334869009946588810286310223749553599501716187794059542
- 7203256807509917230406040592447593475587819231150708603864364001669769358844410773687028457703794092
- 8349414028221295864075270639353993044472385084396885275777983552083175810709482686545514923467711645
- 1188567223807600629987818448782700527203129388479982097194320227571363520398880075609793549685072221
- 7381909642757568466440784384976235954164378986071667348604995364292157690926961517095282542108602668
- 8812876213228288701239411121356084998485602261674350348830521151995222130947223118824547392608085441
- 2153442104345431104283533610723224461095047549030823849762337877239798576467071485072701155033507917
- 6889428553256555785689141110539376812300764172733233555555695819795161678765161127158802381737058125
- 8433764454963932090336308884238313464741325415758340853287016214784675273660353298142198999001039965
- 1663985781627083589624813758112852050274683143462186542100287357984530641972173311190325200734619298
- 1287229517898245111770328323475986403956270619085455073580791658971007776402290351977055165146315695
- 4288414243755797570968942232887312501544659132356822348563230881862148691752544420425031155171125209
- 3266720935244538532857593078572051963112677159656335359564606638121569917613427105035796893469256097
- 7592291135575500449546809395941988076919375288865024897112468591619511911805736623365074921836732839
- 5749066939668994863881254658855888383033086427922354597161408639132801696867060967477934970251369670
- 9492118518268068371039329768182793490904880992685297949785573337154568122911908288999964961736727582
- 9677225427182642232866400132724327309242950923056622134697756027497131137749640216045186933589599433
- 4517013147431671669925355352625191822960685511025521066176939130589930470440130555394785866316843769
- 1828647234353248593887797337000237434440522305783385042336974867005016002866371635480721425727423634
- 7165982592000599527350286342941390667926697237987304373539379577587467043870950735671245544966030978
- 9611819455417024559219300964059380552294276921735098819503385424390196223556566509598118950849558347
- 5832679441371943347770644174306876072873238603190937646745291892183927340565244912505869565176115620
- 6981250039315388458184406490819305513822068081023933630856535953832850815185286024907380888193971974
- 1926645634161448426511541316956283525195911244283826288101030847554548973690254035882364831424405950
- 6043336372172311369797376625377898329148146768547541189710236465877932945245536608462987170976671452
- 1539359362956508416867938874745177684647019705601206291119659392716942878200104738422691208420374736
- 3388386274792663438170746008618165177012473800268910283248614546728946437703394342046484241967025618
- 7916489725183867462223041651600018564312996541175982085005633239524163204667553500133537296849174676
- 4631941349922374424722463302202185954740646378821188234593940899689958667766370114295285312707935566
- 3237832561966782136657092206028310256539135401190662142923938164112080696172160438099387993003279135
- 1939616054590672596572424438866730988394948040500199586995408776106691389068427993564695024599087865
- 6104815262619488029162203772854404310761915233096761345657898664927602310346708078390992627547645000
- 2311159881515250166756373957401905770341261342041635904480839076537485827775259666285431629883314207
- 4778261209504077604333883663580243089244840348835410287061473396328346465783579669745925874011346345
- 7623216081042397622251689597347681742851273772134888431264298689167069631623873420014694898521423020
- 8355107107105025571884627785644037605341548737134057035304716047710677529320079908300857963350589136
- 4869774715093761225628448351427933875263674570722200256769127483422379436606131986267609440621051523
- 7198485974737929740617724333077735380254302218943957667695095667279812485008486264258848457967719356
- 1466464626014964951463471490061886726013021674810746605411192668918406378835311056304417080835780199
- 9223295643474303295979135889437938009727044258215069279799888314467253297689672092433109678778704372
- 5470404969378268535332779967817629151867127754136572668369349108729256606562281591526335044669497567
- 9229497645839604031247826096808076324572917963135706380553018179506155893461920055250204212768920472
- 6523519590844163705976227580527335399057273772924589843113466208946935684628077087959342361434261835
- 7397284121665260195438481774502442968737870447818458084566985918167574593630071250992994559021579797
- 1267979286814183617945293811474383459113049494906254577757396574482504189366105015672239114063379044
- 2693276717835728234784024292290403767470039713468343855464064270710261175300913084761273575638893444
- 9578014367197801389826534243776067204873056592069332816973770772050673214000573675534498089554053868
- 8878671591124076024028764936109146485632435139228289616920538474220896046608059038230996591893342589
- 0790062237040800669979202979819440927717350270127336846820867383102707947935530220822775215446092735
- 6207151719553874896681908468028606626805266261730739559289324327665608205589264922811457207893258778
- 2368082793050500307417743535142587643209181854326694069067600791908213420396368953094525633402213073
- 0209864586297689655472486526242846110473665750904177173205232374140756584899323927086821679426432687
- 5694735191217476911115775407999719992668288850793903934061031042132964682504077064770521769095572432
- 6859664717698638291411537797697600025819272394469201049660042850854700148091808108172665045679671866
- 8806462058478809300711671419078497133939149939952552454520949465078434971981036142877818403322057069
- 4639515476946972767747706424864607939235195654366350830702520798246537427425699694577564626119873862
- 9434532805415082762099066227743584448627037670924884313967312656356805978534285819844609008250228150
- 5106367269141887603978831977318626572931421807329055093538562444488808705158512055619441373703285405
- 4757221463407137369326552108693222709423907542994089944254445906867574114322524261672343521912782585
- 4388455951679782993283236427374574525445460529398968062635137335872148508088202055186599580340814883
- 2970125378123505679305081881856850573123325755554241960542735831944797643249922882266043555852334960
- 6680905502905216337784746351934749713022329493965510415987839740167516618593605179338950392466205245
- 5112688373111207852572442457996232944501683417135951402520951792646811568298203136188273964266233216
- 7644152469548755816408435821258504424767069969380375857300390579011051541477955717916931272909599822
- 1364115981595201458613678920666663532183944579112942949372746424648239215477975615733670895761840575
- 3220985047485835708917663527278094953542744825251137393829123783351841471827848818093776259467255433
- 4206902383755976584674449885729710015336570259383860983788837055966165661226188124546387807403643775
- 5829259340136451738584462455407649029616220229244791778901424327249245624610572832994427679678314481
- 9346705517570835029425673263352649065141412102378610932967188631037171704617628931161672590290677122
- 3985883659641492455308120728570841006607616854351666353034138280113381967791228997412665524495134833
- 8934636181282256499053411503179141167093830767768774232569803429140799802919107611396530776180407622
- 1944515194026040634703567993538832743785881520110804064908851752700820562380205128642184248230026324
- 3205599799834692623266564470195635730067953905724415039816423908213623513271771458619121032811235726
- 9933087662553440894151205179902731473868182626644475280406727464085723801550389418912595893739926501
- 6877527437697415337481724220377071286644907711626031544171194141083486068995295074447722033627442668
- 1847119656361571377242461545607047965087831290013343491113629297558360906017594945379686150681790850
- 7607566212738100117918293076118629911635574502602021275654360951138569094815424476722607340061037334
- 2612736080448553121475788902375590577113174550094118597486529627058856391738971595159889870141758696
- 4865418532486377943378050698934555388050523312494984188757304644473314445985055247398653997073462338
- 1939800857730435695476169828265893810030602411218665685980207253371656135335099218859560107881521955
- 9929848307371141617648399503300378988247903454105325020549556935880161545989189368865721247489636136
- 7186281885464478617924358171011255185131787177450430735364502976150729230110833080255153495186929484
- 9716900991730394769733378956502295614877878048366582834827540230192303690385819788534303828558273006
- 7215613042476796509973673898639630845953309944673660052789535100775106235405180950620729591214778792
- 6626338542879258977595863058064650448452623913353834262705043086700946703622040633976725299136518784
- 2306583966702262580562122210733541161850293635641616655779237766395860494693244550805903617986442755
- 7412949830210469698616449313701037027750848601539616658645128535453048155982963829859815455625924865
- 9186328817630110149973720692015386987741862165578208788502897085678297019269582769523940825795893466
- 6666883918358815549069436830703532763207934945109365399450972042836730670351441963155288753214822189
- 3259671737078127140513347473860809636945635120190184391605573384080516638291488624793513794037131979
- 6687585625948294207463241614819626828884980096887564131779026576910555080254322803125858998458287208
- 3257358894763134926062496271832200731813542439536437705648192953995700144554383910878449144193680471
- 0651634740311703744824585051857881806866288441707935660426980031632363491203029197537009960106661938
- 9621731876226707182631485228441727943340681810310183841753499734969790135260460838986493841708529346
- 9279158345594247787414758186260672246624811772249856862298974404384392184024560360919123698959782488
- 0644631955555593083281673460231204066700724877475998063268452732025570156216876628405832688949305051
- 9390050495049587015400348542776024624858846666734238597445456716114198430383570639742666670385556096
- 4523903570201073652328352769206772213666358574608076159948257589026155644286649673725692080468511746
- 2670246787668603228796511978576164426500255366220799720399986561469155119965918926099875691957219827
- 5509506475978615626474235578645011389704199350997640667655712085029584211559149472907523553499274100
- 8512949193855962594032638202524988224921444475588270029003679518705235762764423558418333071204601246
- 2993991548419581355125514677093447144330924763732150118612798381856025571631417442644210392318412486
- 1561304709814802473388125696051967726943832149010465240998150118339414506008422291319416099500996449
- 6196330766171680279966145964908485717408237805713129439661036877272697904349031896749323216657233190
- 3721541461036471884246356801971257097712420455992771894016308075557915318038863852263293491228689445
- 8712440718739851310980729960000540296913908632667141792364975629719250212883990970848468043907176319
- 8298386258976031273818102754934261012824458351039724617260027124726441028393060367775439840384623746
- 5571177660427479404471102532275260708819152596238810359449121002592156755099903598490287366394653336
- 2227856019878524480781200009226725563043118702187832547386880440918833104825515033950623703534591157
- 5694871584408122253546614612133683291417713871207911325632996961058630638814550382930706507642500409
- 5978377200913542843287311066940704199932530568316953318544062180960834613197799338171659170654879552
- 1144399346369103913258534977738053801424940934503627616581368950030951261057084123445629601328070394
- 8714675890101664115170393932146989030266726605846735059647527480561780786795393551032684912986766565
- 4263127329885291927008247087740022137431156586969076065899085477980877564865594130890270456897729741
- 9559655010922193569323849781622587517646552420925574092571769546886051901000316080128972898705286108
- 5422973909396815077500965971737146008611522092622608527082988364373624387798127745117082236808061077
- 0774136633479557435335472506634409792898991840821815020062629005813678154528485775952733595359748408
- 7245005388274103999870195212623316986282803438849726914169586295036202722974886898490039741471616745
- 7511413346027344974235505878072186655258735064125308324573880356085157662659100847907204770453688975
- 0719974356650630663167587611347516441890509949530441171998514991673976622942694451662140808774913553
- 6734530651829997758201465753081579408167503572563130826897527686949131751660314196274122716209578299
- 7451259507368949976478651309830445539167618793163664040969778731171580041226555288637091406258178846
- 9239036439876794389944195963322773315106241711111175895820421382268247158558623159366153128943219165
- 4892821195976227665814359674319046931897070954625498480234955018692311293664029290996670086387840042
- 8904420862483661779064302063305933920322434365160794325702465868466897715343280772170987980118148551
- 5792816444921354300152529961377236010772921085951314599524616594227164157476323657025718806117063487
- 6292627323600831252569965434321893745077967445291542789471272289470446481314744124221166590081005721
- 7233044387008737360533164683029287005557200190699431998706454465506242821727117124592068124294810550
- 5040470592410528835740065648454724560748756247634725962019554163080869913086567869678755397008127911
- 7686691949683813515098808520958276792948785481815843390389576480289850925724608625300614888628650306
- 5719865793656157955982572991894328947716189620569354672805441856350184626344267485715560888443376776
- 7751811195879631684185363912337497661237712587055753677142553545280102361912882466084685673608493413
- 3311957993354042333577358896378053183909344428049227035216223087149443606730042311797968286390517195
- 1575052097655902730996709989020051300226332647381845202399769112952460615572933669965418267875614644
- 7436938872908878942599227147563262066667329080946986292953431110762432816432736086308641338648646683
- 6833403411741724336137908604788056800459754328933272140608034447503284344114611719096701762539842822
- 6686468388170610025364990074317384700086148176164319642146091993738188776548270699793984153938974909
- 4610308060895210562372337339552990648545654777111323511505835187239748697076352293343549725610030112
- 1589126783284926464529265711611514653003449614413040707869371417923311666247696408763548739901747753
- 7102018211428142144824621320489013665523144244134042877529811835667348556593691796255853153675107980
- 6714527966374589942103118815474548075246518531702182499670582009281703471433056490611030296600778862
- 1864395862030912621953745931915501116913315595473394117208613535884052045859273604632198270224071542
- 0614033109614862990759081033133065914757495394365387018430653038342790401430598298810968662879396068
- 4213401058668136877008625504106696553622430760974869206667440684275559470825940375954543932812646151
- 9786010940922100394662393810002488578082153053964123626303568044502330247943343213441880843146928161
- 8392368201869189398393330782579391518765988615852658830313054820647419923861166216919045975656253336
- 3184467689507529925867773089781132205545268932341196377415807042979172961849337651669375621514648813
- 8417266217153236227108027841813774596097865572452165349267876088009188070751445179559189320746484076
- 1990517355858488913303280635078797052313167676931577373187959490721237263799259715349422416504918609
- 5916392980515375415305601083541412442663508841170889542644097702742282321287378185848137739355097493
- 3555114062446643689420453552379302295569902568889247247648285698792777177043958436924724006222094132
- 5554943292326806265100656067112487799788039988221458634529591716662481653228741155327526411248966562
- 3653627179051708201531002673539588247022352816399724015346412203202579778082731355120501936842815520
- 8185549975149151101699141271160844540090762083005141646188255296346203608737167901905825189468389540
- 4682662971748668008393029512607766929924069435225777438631812759679506943700156062505627855914341512
- 4133940303277129532531071186174802577223494892925219809743089521223146195766620759235563597266907679
- 8666123329105952796101834310690770203222871625208361195649481175299713274973059783552852128578547844
- 2861816852571073997916448507379463019479486010937938364054003035089249948913801089313227030643660409
- 2136152251750336475912552993362345087462062522116152134533464059073152732407955939560032748790973869
- 4260663614314509347957936425282076057673668224556127797885798509050746557599952332576801978516473222
- 3573444661249477999064293351032029241706181476957105077280191727166542272028024548065568292656244457
- 1074844343809247355832405957279281370093179495842802006781667030234830107405474219268605401978802767
- 0617733116985490100532526580700391933221832551762219500495602329543188072487098922493307375904553488
- 7851895773428251250967651971856799652910171995101746478143027813335716956422319340757137678346086967
- 1224381217307989693831217042049112414515862212057381989260281325336165063327096126811273544576450343
- 8627183739199389437969585611671266838339375985582646154279781331791205782912378998922762772561595125
- 8427540001446320445791065468667324140533658619184280422625821688273710321538212290016053895557458048
- 1497079514288287427566570758148260548242022106120376883410734370446169531356584731584649952332889740
- 8613892603743654557103135730978703051579767418648833308333468306177619964953332343405916867838864524
- 7041275531439579402788421613759684918282328600669289116050761181598098057229676116423560905478275530
- 9990228360118255687572387881258582934211212064353513623423335454800037637353922844133746644754648997
- 2715324870623432473939494074367849041727254265742675895182796020334362260618434065482929109694732775
- 8106315005802505689492133983705710619553810369925100616045006231958956852776338414533870921568787580
- 3212746031128492488714697592389661216541007845166518759992660729902045834562796342043971565244565003
- 9332697584161527418689052810339622772868014570270031896278770775137289513749285389160134511814790912
- 1245542835114507476620614502078740552719831064913195084319393794051393560862448712063282330972563106
- 5680671593587120399214096663322511910445083216535436219937775858432812272309717649727002825335202360
- 3346945160822872847275228184687773750722988339131876836902638244934888564346061470214101593355370833
- 7592611935438143753258368050686926516021319638590042494502607779328982929749310257474851915475821236
- 8427556373977810151502777188467396734397418256427158653009213673388007912311266160418917228468906382
- 6787172246977341470030337709486294246783622917217912573978588957230493800358591236399689631216138583
- 1046483707963766267992976156682119846593415593391674446886200355689651840618965020995787949475034213
- 4510646829418913576240994955771883376474844936148903373387364084487665128579906005691803558021757432
- 8223720982964054139849176861425411357801923284322356622012533756997103821037145053611352158087544325
- 8875177314981234159790077484154852468747186982843716427756796612188225898363586461233727087316163958
- 7829938155273415802880622289603227447919731513419589488384195292905675291358284702889972904682421781
- 1588125445002757734897566106936993830600284424883040855689756491161569382878286204590171592066183555
- 9705573502183092691196050687113637921989163882647003032398559982585297372067596850212232594796092137
- 0133154369004734758005266973163662808767546868431544120054451810963963317799632707332700784242615943
- 2871983671001853052211000499358589809347272782613245222554744663365234690260799520188298486579293564
- 3341058619206357658021349497123815423332633081824963302038636180607430078936284804945727476555968976
- 9047963077258435896097235562688527717695095754854674156318936544434526825222687331658583367174104535
- 1860168973900370511403872160749256572866941446343428193422010787994447931528908070441678372085914038
- 0787192020468714895404296577827423277263006754826839257204742895691916760052052321538211408873240679
- 7255883699722977039781747786554451339369528046730979198754644054050153559842149017649397089933682368
- 1797861826371377477618992421396475468152180235657008465062462125800933823937589398535255324737030726
- 8761318693261257733337290274919695015084048179987728373665255064027193614777325988089081494639422730
- 7546211379742525447857306562061623275845663368716041054565558219632284442580016130922925611695217058
- 5617429297116993729879855268657367981622307685949173321863761507735171533780533639947253173790467038
- 5755272237382781358856453237660838981202294975179584990141689663452187860835838411893138472832576864
- 8734746219535389978008754241505867497801560159311365405520709508035255004812123123771815210729800323
- 1017591837862540565962539948544710762023852340834150142189018389630276690864606288997315830500060541
- 6610521126183324563088749423761321117383235991026715443333980903010767519215606860915099297579489847
- 0913404847760372533164866332739977457417078705885849890364782505006075652766776667301814279834629978
- 6311547247190463813082702695027155243458377713288884011332285612327642475805491414533400430735136820
- 0167103048967407913220417329365588638081990240250424758979906199739449424061393859002043745081712616
- 0362783912411472682090856905268374225068910991937677220777687371267701529071296822615843757149665346
- 2961540352898069849819902381588132490072828420316645458645186778718177177277928321252696832297664124
- 5496739715278796804347658957612653385245739151343813784500518738591532963414053689484439722550801196
- 0792690281162293670434371158371953865778600341946713096653442535523561350392637433355902487780093167
- 5855665020261424517552023105180379792416018681653272134907447418792630463793570195725465687076964902
- 5628311394908306598139258771657534329051829883074422093153945626718913650932778527585614188691505843
- 1128180621164533834614564998610279908878315999233208349703499009644828973619972608413030501613834375
- 7350335026967919910039457648503139889980405347620797995103556280094271198077141386253746894200671129
- 2903794021105099312881767863557121288220584525902329882784488972855767643376551320983720845365197273
- 5662945407520786837748259937695085474585377854401518668703212703251083788575535253274224674561655301
- 7529469704928603493523766319377581531269112157125054564936628404613157549323436161143868941551917955
- 2116040327941387040597365968287723555493695367249260335274498928882204488684436527515895468955885890
- 7183172928912923457744284419272505276847550387027063282979975853882599387906789963676634726367997091
- 1370005004519151507050208574470532031134283753039645068373494746515254316164069588396569604776248100
- 7698125762324027656324714558678116653563357384133203756328577111457947736117758910978449597487134549
- 9454050089749431237026691600227796215160164431446321556746579869691343020917375379329537363102934825
- 9418485153134577006494373909764208589573177423145767288296790675029922315257328698330263412335263163
- 4902064904297082100632648815676763242544468703921333767894896001251362652354725651702225595569986284
- 2510886689684710787260016733242215625124292721308055932622130721409368643549968987874303526768849221
- 2318344924190763747157474462521597457646635724275279522289150406427767865661151919331918178305671646
- 5304813810106667342459156864174457688390624192018654102252669706153890999072549984285484195668192454
- 5197470930614227531512984453091827577151361181673035809321460322584723528118255047060621542622432455
- 1446896457269382316655525095989504109342537430859997971370042588583403044972671096299697632336077767
- 4373479878835673010286471384545928791637490145406647519394899352212362474366131747830486884631516036
- 5922435767627623446665395897964687905529239027020107572189191382148316268524904958486754329312418264
- 1346627228209365327728397667557267289731938129341943057239620723292007186386746670306364601331111164
- 2546802512289430533112509853860120123607044969978521095859875329303277162267982305510767692680002207
- 4188490301650050385344759710183016737826819436124165696392522947410357431851765836560341232764339009
- 5651186326079173389912627720721351617522225524182961243396282518232869686254441186238123306403453315
- 5601640695747232038365145663557498734411685994161655182496042597983926781613148318090253450716466644
- 2670262761185976491324768295272780570322383435150636721770663763740249030465909628596027197972553780
- 0141820199810181398125950423486624834404392113648723666292020639396288453144837489010260840361484073
- 1200674156229159669636694083603264334149637120985454752501773669601971461784645155559941672637397085
- 8649598779532421583282184109391640528356790706864210780346607571979891481554005420051073009627962347
- 2724997011221778165679844919433222633415033856753082446773410455032742856115745538742140007192843017
- 7447314230098365760751551277796281014722053066817420350596794105098046656313637782517247091409925552
- 4710368126705138246752117200528494295219748862848985277878356210600487812711440634990881645924451898
- 0104429357083290472201607269660461984260772247831071714390934928973795075056471053802916187491886994
- 6353013572935018732066873115017315310912967948625497958151216822075712318919091383383534471023659794
- 4808047123388274440350534679995291335460941392728446513911908360762265798398156424638291599904416284
- 5276818935327913567474032273515068909877547218155749984883466946222711943435139572756093318776721574
- 2857830330183042225170496329716122968367527489832947231506974978874140021926700672065677292131084935
- 7294076359289561828129001109784724328303846519743758573685912309817836030314052823008130266313304139
- 9253399217941576479853470817863611377200140857083863943770352918349740374183511622370040173188269393
- 2630875054875664529093265665030243944536227279170800381578513252902365105680962589179424001638714961
- 2121694699254423986747262060057131153878388338830780165378838775211593119449359569491793940578848860
- 6239594441849728928723084955792607211329771213723886969863602368291622254647108806210944791323990154
- 0667816028934694282155062721260541798291781738248919973382953016826679061778013533650471886339784273
- 5335856232791853579779226627038024456968296862549118748685305497857965989184862186237485563935321563
- 0489928348655615415406495122104661037654818060250676549134033273862941691177626381383478511836410569
- 9966094920204489502629446168466855106066242088314537401268779478139859577769903987707399417032565319
- 3556130005281435994560612616083223589903248956595675275769853245744035607612886079681857619771788765
- 5619852375274472235992720206023891671879081470886706830279398976837802333757968374847167920420561188
- 4614435084238369737859482588497825952141431676898495921319389412875069596149193271147035874533660814
- 9437546971429195290310193894356371835937491483074230449340295962811166523899581106000938622216226552
- 5297661065074527135894973344740728167392634862226297134715553293624445799465082319790876907445852537
- 0345709007744081534167863870148099674124003837808523427397788174691080535330509119443313873040838043
- 0675060306862695321245229016675038563185858593174377694941574108105727494443840013991522952924016806
- 6745842469660556910769759698731095078451825185768980009394286371219101669807885171057114466950703127
- 3706962004730035675368235205815249186823908397408809264852704581680063915340134937352547150923527044
- 1619265721100423458480853223980930819701215864173291305325898717158855168420606503405569968593715915
- 6219395459555855700934771168117983599584279819556435636530938905094196464188924341766121771175457371
- 4429402729377177659183107443058151531596094826350633655723861413920813075414610740512741348138890687
- 5208965175472864434890201501872018366138417280798827295820189774861263383603711094140868044146381899
- 7551441905115201402418762897868823386652887495647401107245990553799217515564781980918495587675277828
- 0803822629818043941563979561725694090929518577447883651594478720682678596369454763706238206696202396
- 6206659210812781832191274680814530314217798673533684893808266818969129998351994223212726387715975764
- 2852132151588371714648542881242312246840283905615779681998978556251027107062837939943190735797975362
- 2873719947845210383168668521420822019266723155810117372442375609151489386343666526579426037168289281
- 5806931590571523794802566191268708876475069508501113702578802333818019030210029759755926818216359535
- 0706418857190059497444679741742025213094724619195027721323724702570296163168146476218464364465179953
- 5877759048091724695567396794553734971032219369455962778937791938340697253788415502062958387483096195
- 4204615469902226843474617677113197374866000879354436073024336632808653684733506687074089001847030676
- 9821475313373154286221515513181409541497972467067634369769645830928679521201994140665404326668344081
- 9686918622917654410364920807857292423388755061809836591222653797288411120130691018576030498329532694
- 2141884259428662146952768806320825719648671342246985264194190222362411863391302841718447248227557233
- 7996970748200243758037179218073420208053693574061876566416960773912090981349470212072519721369964234
- 4209305478465069237446490420888732630226156357919606309236991602782364930003449747123779455951240858
- 2397099465702753667598133047775050505366345747155165583727731007857817871530316132768489253576078462
- 1147886035180402976569605848671756763665930874801609992795078717891310420384947894328608479705150428
- 3326524571886423198399932856342268607883443745309272893146092544299060787111736766959849633062177514
- 8848993377878678597852652805705486612173792135521247023953256081906788528038324229680755447174377489
- 5014302315014696122549489533836275694486930467419802292255506508742977275807609510687982710919383714
- 2290968268728596321942836727242477443909060036804852784543854819955828743344189095523099265929588482
- 8977719675054392057716689385523977360925820906934305789867423572953120514850903846524931400689961737
- 3173581622229445541614935787147750627037619249803638440016091361171372955766180892638646794027936567
- 0385305779912988573944783757639092679443336505496770742285963808721870399582714758000440222404214003
- 3035903609605480047188473046782868077409898322252624531680320340844351093743194993802990812417921108
- 9542392709654258219584858667992411578844781521955749832225833567422679896009803200935486510854946767
- 6713405310343499864349758000215286835835721365978208435732604661260570464409200520643748808684041999
- 5854086974773160175053902530649036204494584764408820400538605715251822177935180194147116600865329482
- 8106002191594469278346037982926881867778488378271314816066812848087479043023420037713089646478178559
- 9461837510620688441358628450630346441913942893762354742777586769014678228907006092683252250324639953
- 3375667289976602542465979519632609027426151574818652781929779836811013313396516257933184194070269649
- 8895138692396126127536959206022969008742083472084083318841582683801938335897322433513641224432117497
- 9404766824167809635203566415433254150964501977910541460943749815990445792838028880133562481814072611
- 4232759728948241418870259574549342547227469899768771623160993228850420280708381008140918873526333183
- 5842074074844657339783842980534710600237421998721176268333490920907386533795907492808928303010720755
- 0472450851183334676304759820661789998004462744803370196555021320441396423674506953708781697379969379
- 0616378482011697962707212703584804794885806583089632312886734029638482411287659521853624112569697491
- 9905747828032629986123172479305032363770584569878577453161038667067555844068240891051181842902580329
- 8514096157331538756311438547792152983663838215871358824082012778384097362326475844352630281664756079
- 9932214839271563212499908370989309463295598599287284335212524274334943790238249494457851649361270326
- 4233909454480862002835352626175298183552529788046502813539911284716128115341446038970316546773952587
- 6538384445746110351561641809273346254142217903310714720310599294953895958436885773489495225982103831
- 5964206232730714837166917989674445418418903725112728353005929827393747375710992776523563703606473487
- 2478483968420374230975899887438787654284159356597358834506093612992449258746769154280459813281582587
- 2999110300780631592481722052213206010771492336601003182710066727266488949550942336897935481055796423
- 7715449541371774079951775014666954655741008015579341795983013187154617138382203332872631369978080937
- 5628169857535292539023656811435865539828428324170005164199005176438351200575693343042180293152368541
- 1424059868057389737717209032816486238395498050084360235358582554618855942442612928921434147898267094
- 1767604522251349298729974353338206276224063310048837745273811887225818199822194282936766660000403799
- 1487001856867455441231957351871237930599514821595486770105404782025853908333564061826222520802864866
- 6809763156107137641890902360603954124553570380667535676524726680367517673845564696693596022634258001
- 5557208962384036477132142966921934724207987296298616757967460829597127485706790346703915786585811127
- 3825743251903978299544576743057529928302863418624254502249624197916398273490435941139589840434895757
- 8332464822165249725331811930555856140503105076548589915525542652886287528895545773678742029770378468
- 4756366424947670848543073541328403616349134710744683298589809511102012425448846430712271748865869643
- 6722375125740766380757796859385182321580379013885132456704225278538766101351956828652339460402003567
- 3386025205513475307900746894526143616381246602094339688182998572534654355285404636104131214993769216
- 3026148315182346942096279115494171946607206655284400443565753266414389342772209055751842369120803473
- 7988670796922839869375088816146073838246420008153936740018862573073695349973083672528101494304364563
- 4975213545319519500350764823703618453849756361633974429430988638719898808188086747495831760222984672
- 5019591837178700154647194377440245879644193433052737786174502452497071499070005187269292834587178630
- 9174843878550639754778139797614710297480525893069221666222523537344901135398626602814192647629370976
- 8013187204140666876255459542229249384946271177550175862021378876760029805157411237809551927818159082
- 0663636540356868332445566200951604633752256882558545829200193063815338736565179457437025887562647321
- 0773227646623152269937958253816250741193599257543470320751896392792921623091299025904455121720931896
- 6179934694954150218683377015220759113008886890238579915282639867824654608874627852622681424733188588
- 5724166512619590003292244047284089619602649237730727930328698350719950917336222069042662113793573787
- 8963398219271111792437518683817576213472922730484110905289312739756654644015991089205635953955062268
- 4903481778340163888074775859106047358664560729940094200063120435623081164981455149655513005854611735
- 5240521671556660413334758759879204455921756775632837672276901154164921122464223603954033684550113426
- 5424744898954599679203644242966524827350687996495015740462148251111674016381288237054926766797280057
- 4632906194561799730944487237467063062834619376926372843710250629430239838747180411277944515182108640
- 0015584757912846401287399509776297708262263458825052078183457605053081571276816461601267456151310391
- 0717697384557873224133003000553471951166901258113520801563037304690809309792735365856491357471135090
- 4412759076490299193882008262173939592861233365729706646410270587838551318934657962685933047956026011
- 5450359677101400579933368890040220753848251399308637163433660079237124064576176500364106122054356886
- 8817740625305700602301898291109153407117751712442370364363715890220116231710263565013024399121540427
- 0127303916604348528921717678005443537960268144769874794055715993778356399662100669274192714681089620
- 4073611163472025898624647440819612040336875208970108806335428443692521801742512119678569911058334944
- 9991683094494698470780636754666776782538372304052848929117305480298931061328228524301397442127840108
- 2297992256374991861619095395092292352403872656334962447446903480575135659465046250309625011185996363
- 0240365418782445707402458948806050741683907150580324241837558626796044894031184207156184266389930059
- 6835196088099155005408191160942615617799649455573893623350956021693845302940741535422017008850593410
- 8021537744168969765523900070011310946928000344435606360766131030272873892742266524989909815901237651
- 5704327731921850284488111933201103571057194443871218352322554867726440866734045441353674039901046417
- 9288114132773295705233233998780091602670028929046700345506321135518225964545636558027046215314706032
- 1476780387345442039887757315364197294374658678276336231119864674608317162495938051631791016021743160
- 0363721351355065556811627671648322879623900371433163480958689243847116904830789651005911049650159928
- 3143831201893252516676895589731051802070915612821279478576823150309965487013780142034235086218894451
- 1309174155201212503779765726305117588445579181661243191479349987937188974667677782724332922702482645
- 4802849998567554945269468703275037839400366514426856820813090209490578996221008140773669655662797895
- 8759938160373929408189832602311979060514597803844941218550734723444046413633317148297819766986696551
- 4005181845419763310556350448849713422360339130058979717346782373472329230517388505004636025681998062
- 7282581124555915860150184390904098641809717100754618847739349112735711271075330950790361979461708733
- 4466480524178880606773110645588414287431205536864507541312378920501641824559852917028552982349175681
- 5198174953565040453735880040973693100210161974099408857233681398906852305802152257830798584444988490
- 0267221549288886129250288528135271737803182076280866581987021339186121133602461873626491285983857042
- 4605478859944208240180919736271175154047465634118048628864398751105260186007632086640320800588098124
- 6682872769158288851453555992972145134318817716645564502666336275157142261212702829023587031467862427
- 3023359989513383310690803679122897592232090053533983610528084879743470505105124297994696958773290081
- 2070797287965358392324265767339214438047036170652959567299323441686930920186625715820350459222746011
- 3349178476867831063630236724355370932562694982307261863131091050164320612674246086791670377930940669
- 6071354477720412401713871525414787133745660229142745368281009292055889007950848372326787186595562128
- 3765493043122746445977381115639667409274991990309678315704437927396416667510978926409311746824187884
- 6539287943914280719137228194506211199604942014167567514155226569328596939900541011164776752925649440
- 4287958357100368450907034580190874999930927342332379066474107462898117101040277883382145098316061371
- 8505842790389539496134598694553433217338838044229221868482471011714851583471060997578697619681601243
- 7330230684469271055789326166001295993498597491718450334461056240840010952490311291513102073536606699
- 1425097441671089180442792638502557662206256643470568888120913431296547816198453967515482108102441606
- 2444931858735121428601085815587151941939765526106247809254081424759646627019194378550718698349687692
- 6575171350176402003599383530178302781767102202449288655654620105595674157711590472858301654225614200
- 5482685137191627689825272660007703368359267689271174661458864432562954417051216860837357165976102782
- 3884860670144632963682136373033174648717632014278800674249348568445726886782552555092500615469758288
- 5492108122224766822902775116822369502543987324561861209996738050145752145346770108025915298160421223
- 1163287602645784892088144425417823517877294636849168637871033559880293528797513166009650345021350087
- 8614816527569342549157582544785878977900421015928011354809715815493253864902115138985775663927058200
- 4783308103193586172095928503098371977956384664987334554901336566062958993312667035425517958589534255
- 6852221670572063731668209322415546565287062082026853326008665800583966090695049703022545349369418434
- 7991814854031752161531889360169898297123827273296188151354041870492734852626566640813648637887168029
- 9743419921840452670036155802038750040963721886553766105646252585967623112091455580614923744622486559
- 0525941467834123013364881208645131781450546417941645672385775090452177054997583323609161824686637311
- 9959742563739243193683606633468788836648939977087099239751769429327043157163405058351989947721259861
- 2465956758031364020077933287978651130119476790122849334559372745446777306994245626020238875493090223
- 3573983039664285659923462394343075435576614858518612844661731439799759776844709297927738276470935627
- 9494509375749758094022971955437014385922121605808100423974385330454346711914387122662709140126153844
- 6277366108865182715566402048997387185384279740871780398587857487216892636293407937055160183714050877
- 1496281607873833623355597883713608096663152189322875105227403710184125482971285689541641949279438506
- 3945483861715452863298700743447464614650341446025619364938925571934232096238572840936220720551764698
- 2530400643228756038069773146999660101861018409083474528089280983391290914925830365117302996765473925
- 1518450277244844953768047638864019063487296774799021248561273166399844273618623088551731823996788171
- 5818320630969964851472957372369464794425482501448372786430354266996443153981527716867984468577777317
- 6724214993063597651813595392768068710323045802519156036464184552722886148251459740929971994529105998
- 3347241041854202720851360543073574876227384079200167634661510906147191081330087692439890505428382858
- 7174596002008845764482519031375548086017940341094418988372652319407183137053799835234437595489813215
- 3424084287482442809898880471971054529233998476551717751441096350331443841574283608079013413016396157
- 9445590873662789091442759845229763054393408666782643140163757170561881345065363728887368457730018975
- 4353864153639381737629018229633304944189194065973057538512133986275646249847032791841511149121135250
- 1046851190089611707902188891880624882538422836411906558748088381207312323141344233353144433609656271
- 9210824764039272060888862628525885199283013330589057652728295714261949791649958943631773247495809598
- 4149163996087240559405897409518518453701084239110782354479538977220797522617599737993180176602584167
- 8345852154531357858420969913069952099187860988612444010607411986374471530993510334286163756809485035
- 9275704744265896795661933828768847466738762703577987555965494014662899892099869716485407230339888393
- 6761101330378404511307837997043311605332621995442577030710396843975279691973081280251126223600777540
- 0051308597498304645404951309704803426138354091344540564134101462193716056552804448400880453039649492
- 9738268650227452822994845774673433786755028009975605100915288666465879026257768957124187931583948729
- 7388771483538424812931191683160601354302997848368635277312029030297107783027747389581346519427561606
- 6742843607020400238768610459207769656762678781970656061203397304722965481373446191321988589232186743
- 9123224152577419290782257091414018156957284573833622918850794868329493305335931935720916763645955813
- 6799238696355674929865113248271394607316285501241323117372648773982965149234267413224728863284602104
- 1366966644267728104149594302767238763428606644807904842677191598564512608618704025727442774514307901
- 7361515617731515750059883996401418804973069975506691012924075303749581557846276831148373516100826421
- 0568687863568408589201192682524370390352517666900923840826467526170926026971040704714815310205739799
- 7681579182981289235304146491987593615632212451682746172277968157330253255735223022968339827799416034
- 8264985693826397360590562321392948550742764853294267105896994589264214411960008453533311450406865373
- 1319571484348541504151723470687159665889346879477616050652520532551887794276200067792917428629514803
- 6393715562492149219289945067840972054346001956298474409674862465363711302087381417548333816616561518
- 5111911346847323655382485319878581818145010538694131580428941053108502625828157123111145551238854904
- 4534798670025707762174138029189276234523893914028052930968645560208707475029630568566687239774998591
- 1356208348594264702238540331396655512294052067722982107716988749068312321865667889253484373928939824
- 3039270631046016785592875306017870222133068112991425648726649716803285494390895401159821493770170327
- 6762092987636152947610229638640039099466517428605271606511721401325095927055929483973612998179810256
- 7138533177106675033131782787325121501327837748650207033135506227558130481080029460517179886418646938
- 3014272229157943503979917780164905282771302956245709102784944459005025001264756232514016120398203255
- 0275269695196707423516842119109820901473455345247385160545020344886526119484579467391032494601754606
- 5949133473564878481268188018707352591838083903679072721987136512691128737953771599527413426674052986
- 0582672777608419974697064196590299595629560556000221763788281809646584242944311604341015403241618371
- 1241183341336908604073818218678592966006015260979204302690514322256814365746965542007161049260710551
- 6213629879300555912132665254334472375154831796125640786777424307070087662202918140655021360191663843
- 8599988612327515290352987034953210752896906114040165980218828037680534871490208308719178047753136085
- 8414106596751960432401798589153532443423362991003390367726189914046681027614857872154303275752435932
- 0503117165170343024273760823271009896214950638496910029025774167136585044898207551353446944194185199
- 1214566815068435730758765412713166542356681222737222333875877673936228746034106368156518664932281342
- 3042420400173053913958045034059680448257513405554904641633578438160588686022799179151567769918483857
- 4581978981362012970538786726606889518850722007442610297073712835694266977933820878091270526740228190
- 3448878106828049595910794308881004695618358720934323233044096976123771968962982119916878709833961134
- 5262017695940034586738339782341473219138249974991406589677344743402835803153747984899676192496998518
- 2240176819305210022455108578603846905687663641289089751554366506561650619221818558606395256352043478
- 9459161679812323605749683748234389055596433504292754772607193219830825380715538852177309242994131441
- 9026355802110535798866536264151014646071198559829289549075514813694409360717649426291034038171821614
- 3960417698528173282088210369061259770468314059876589814268531700310662742574082809102331168159759586
- 5485617816146064344765193028717343009218001005873954834544037627646013824276340532946558088847737466
- 8362561690834309727006997481782424574194262607770979891422900350084332119239773590955945746815664694
- 7811010103696356946867890309337571102762086607087821065555377926088164133752939155961539106238153813
- 1481317662760323198880497921677961104910238832275063964710076965247441460982262594476729758448101388
- 0841014521593298873538518073069810094601261678689308602437849860720828026692445109815391695973601821
- 3287944079223067584129848490365630343690870142583141989910541398522693075466950199902772011993438099
- 8096571948285919876724145591715959557500060243914734649999094962280732089018531774166215707333892838
- 8639164413759397417797996190645277409657976928253653487828864697225365575452522803168847103926942994
- 4017744150565410839248185380972246265514689030002078212754945052791543698175496661875134783191865741
- 2558355397407737334160156114452815017161751179996399406119110086304704795713409531582791149697550614
- 2525966187901940474528757334388929908002976987789308698733990273247229361876519329728094639215880105
- 8120917330356069608825523217970057600041590448817939229844535803797460712947076082006515168336564512
- 4128112940020791146082742431095203360028505785103178129690111967320860994900367426065788332367599890
- 3174678418827376211282261504373578261282392358326023506215025388120503808761075779234110200663883596
- 4616931815750428606621212402530812757970025787253844905787402407677517611828280220570076803317314373
- 3222497208953222317699148309229185252467490518771658719283391451272224391076880381467647768256051991
- 6242899466641586857003358971005817274611700131317272015264539575067017238873314438527194969975372458
- 5045185112124532376009243047239954398933276325847419966021261252980566184976823050412057268302788959
- 0129847903701012363477732672039081071163930328926896985898027604285309812579195732408053145359995068
- 0281647637678616204990872205057179263264470138021032744757850959815376927943735399559906920110868457
- 2761587374741497813219922100979463616836883769800680193267246356331393619802284466029082574970887611
- 6126193917988989141472036055993690883893058053593693391145031666583767906825338101549463368505270216
- 0528658989694225709635345492408795324498345015230231036833493083408235168291518964166715750476290195
- 3467655050454331891572657051498776384149079126728380317905379403906551343242579313304132494807608810
- 4697312495453454578562643292457539754436311066043652894034438429341310299218563861969039536229361901
- 0163993528535010572993277183944687864902771924119694776679674321691661740183719065604639000765211961
- 1483507207555929101785378770569542074600725347546329875918008302027150297749789152839894533255407195
- 1666575323092649513942114255404511537786456966234680050010557665686222565597532000694853643862230379
- 8485693682238749031954900491665783397436698609183391998723719472588452887254012846450566305472362710
- 9926427857024582922373042200103989251437607418119767998004961158488903136574404814727769349793351969
- 0791241286804950501774453583056740426732857897572640251681129144017289388939060078622033980666196507
- 8580853482490794371510593186923206404967386563531281304079107222213576654821878051985853001988320719
- 4602635121427993700694070856559587246813655434167121600702677482923620401452985056021224418548337825
- 9554164191001106984416061119361341572843855737682243702736802105490498596516582972944555191824151604
- 0655118397072027202084640204393072986300139055434860805727208711812587793844984904370529210374970100
- 1663998151949476294999864284937367525363175218833130871088807978839241770462788936077376914701380205
- 7889504947811588756399045026857550561741605589946250346009210210935213094767593435082242287365273888
- 3742321134710601092049395617317488537802273146628841603886788153423753915600377407866832869398483480
- 8067071923600158571920292311134173510221745594119959835444561375619179631107040180474480380943839754
- 8267445519775059366593295007869513983479298733887810177945608175447381355918082998124982315003735066
- 2654337764521831661729592356655050362988711935601204167938372520077159314190351927245801694493938939
- 6886129000119117055885151579807832197586364396223411559124784518708290402202070552688856767767572084
- 3301962157900852947127982339707670466783431019043137939095674184931794875599199055140961968939225573
- 3193871822401654043894242976165912825960645565767896269500675457661057497034947209854964172219226415
- 1810279891105903306539154665967022021495454292522568011997322331862993012889772600548883051801907365
- 6178487244896155732164825745475381614346708401825711363753394201684005114429600303082324276272440249
- 3439561055939330737827909395440108058510853811441266551615428095286811705096078289107899719529989342
- 1677946200201699898496514405533694909314415663747898278927807417117097798317152252276910176290637536
- 7829868692728058988150048230697907349216189955367079070334793754336049453072079648770163350386612477
- 1679889404617208901243370958171600709412249362154964957549239133890521379284813256006540708721929520
- 4117451146578362108110624285418078166194941845801094848226063578640095318038055317525908824674419440
- 8371697512638377222189990351660818503784010369641914891107162792024978840785035770140561634787422640
- 0006355817468995774598161717654247358213363439055746336700418263131436114181603329667629676001679942
- 0553340364035181666054990897216378910193314935297881620939541968206581906428364266241323705903925680
- 4645463665882027057632649182915871363604687363845054497488839362556344690258479973397243782686679200
- 4894254402223869489172004665582573288023324994353981089464662938621067826158527899573711364825491949
- 6669990046514833047867362138961073979915734993372656791738205067948903357851703480156848711905733150
- 3073236481575437192770782678884988301848646539821183228847745990682339746215612585382662372283196986
- 0252043378627735575155507201016059787121746506973699977488505823686182397405962823899061718458168239
- 6699394042340380271521493416458066506094255166330604931071671973308360331180912226728261653649177815
- 4547133361395136935789707903812910081720867497056696396275052837274397916287648645576810769790438777
- 8853689843730036014312948664926231077274903705956214258751429326687828478807876284781862459567816866
- 2583026820364459788509829508925259441721135355859411423995153512414886100581148133714476205748937224
- 1692219063913137828116201787876086438886050658708324086986394651945116888379527746353597780059964225
- 1188127560160179159022475213976910679863209283384060086102184671398118661205103771796785864715889119
- 1978082065110498720927329367444664555227833315561279846519883483619760801583131790674551241002086775
- 2382206554614559397489786921632321555311929060258852766336700281085004036776020246255778526526697703
- 4006959215776156476425963474335647160218551276752648922167599801547259118353017790110214847022673250
- 7958525275484231626158929674912801498005754149289437240746443811161096891279255334866504394777647016
- 6897046624970217334733680794773210861934434226421608580130350246371110894166810265036737521403282434
- 2933691937372637891689833875137555791026545295231372878571956727250352327250114908852401112212315223
- 9535668141756360827968894201993232452749115000568066190671007305621131256401829504993342817836112004
- 4138708304541177799082829852391031652175532217390838633772407026085160186509754722845119753912039762
- 7596019905383829494982268416069423707468528511859666876879722986460275718450299124692064899469489774
- 8305050135197459222778942804945888936266175575585016684911380345406553384045092547795648368531413220
- 6728052953221775767997329750000772090302585104432463993406745109433124358732359862858793613228624008
- 2781507656081553948158074626359271910622864529121954899127388993476898406306935015305808395651394402
- 4323250666224298765923968269410311308341511967555361378398542211792194114495619165388491859795707643
- 2673697459359381066877511045939056158759634966179567758163129073143952002117162416023638780963299013
- 3247037859386552914051894854020217477434941180746937803653261313994620894555749060397697094955008026
- 4968790833922207730630331527199447948997819818289566397872623599650538450840226160712887069191795534
- 8341272915563450783929095549621763780941447603926762029912097978526101261615871270753558678860701332
- 2937414800980534901978765117235013926032028283193813753046174386185487073152287896043801626021519321
- 7278125010153660955395939482662978500964721476963041420928560836755369714576744658251377926893003498
- 1876730953665615409401818121381451571893485211413763239747591249359704551181113512626385218226841422
- 2905761672336221741638596959428555841526603258173569687347871528253854686617083171567897986920796685
- 7938520386732793631311097017509091536397157747854669238984188000859849849311591372836081341437393598
- 4087726813881576316452990400331700614355158713210484908604086309955458293249851269415089658896620196
- 4410303356985757879719137187474794198902398557644542753175912782182067919400959794488980216551994749
- 1076702194965961007134306836058843980625029333392918050437874958457839559752191849939915665684207644
- 4015770263734973607980438943732337103577946294959569752864241690766716259743117028013043352721392098
- 9591016293150314406167603304487131088893032925209532460424387158071374113333496752189467842043520120
- 0510171558881014072790337090139060829623257365434902251585715973438396432549682824253927771242235747
- 6365147462686304216003673739057280974151802633253647788062977836503169624788766304946589041398145368
- 3496483767637972403013154653988084173969361425867179381914048143126221184901047710700206513634019865
- 5824595491518936088602077543374425879392350378338502501167727052720609919380261179501593818710043945
- 4786426117842514617256027238047632869979661131161471745987885542037896030485119369471921087749508553
- 8628995850377779904479879768191744941429000980359750244314457216387987325933347484330457394081255124
- 7937720838298860465524871445206812031443287202182491713332412389413032203595572780514404956058136514
- 0986160079051007464455743265393945391647302445540904493591899500930070180617233371679820223173261954
- 8655260653765962406939391279640892608416114880330646499405407464597314824039656863432159312994393707
- 7821600270955871259263938062653090637227159030214454082789035367016709815238983270423840016348101274
- 9869965938331877195079369730835694367288565061102509453520470419059542468201989827961069973226213662
- 8167363122989056247377762923755761011654006559385237273915066906457679463920589716522864977434502284
- 1403508880830934461816836667371572514163826056268400920108841378388920760123000864027233105874037792
- 3680777236337609996334549142295140263407406950003571920163554103905240352907273269823891464585498060
- 7121971683395177468457273270578300165043438522673289066041888411382508341361379961981016970527367724
- 7197959326117762234453981953204724407339455212937548499646212828779894759263556471124809844788635485
- 7684404007964540865343117844698666996315507153553467533182789421749052954084700236515593719130070765
- 3206101646242846057544591362740802494426430247420387231136814035011649167388033979628128823708626314
- 7773710950925211669667728400056696523553312357273447122505849334210006543804671533515249182317846165
- 1025808818016446049994058848908523540861518389404360719340671292367260694480645999780777249220902903
- 8624407445869701420590221988806846096515170948230600096465701436440766806637279687569407135156782799
- 0649079063277209044524503248575792807082252032623968335485158606931459783852836169456336186314956895
- 7512520542758340843376543877357558113323322445874169130446233328853040341681853276507962953325671968
- 0304662622269392924233817614740621769438130181644683625060288786882638848622844076864987050543822925
- 8065848704040355625732567495201114319375477540770919620795371814882506166306925483188887162368525155
- 4848108075745353475665069108998902579006747116536104463548486258453296011166055248123665813348443402
- 3033838766947308531146822952900928520339707297247845950326397304709692877275566741078792127067696914
- 7191629646778484264375541857569851081658718271514749550361565003713207380545212738607371349328329950
- 6794838104667216961316674556498386410665538519571147797989780405313153130469535595601250122307301351
- 2282359030897413153187246065767650692731207540535622805396956670940455433100169920093401603015109670
- 0708703308962865869548111711644722242956459262470228438373631682761826381454527381901157150895220166
- 9555895255462206792074276777692308115226475110682443391341650025240406933025859894563392703641944075
- 3978120082182135850455473521574804387050965377446147811346871656555888351972792131850455068355394307
- 6050369009362962387836408667012944398938544441878508815883750876290001144469012888129558556775237521
- 6598684934324220643331265915748872953995338622517538068215345051124474409469110451163239958515057551
- 2312582940123674771515790267854663437832997684375181671324663954643020788768384514133131120043836272
- 0947289667797439488890340393339347714916556098784406261235812235129549256259585831916362448449112395
- 3657658710507880739670881097669121051336720210884909249834814108085147197931198325601491340711816926
- 5377176694886325677385081130992939242797311269677458349060895901467971121975453286879491003849694060
- 7005645672377105349189064450652802955744757018578593533302534373141442053035818947250256597419922390
- 0855033384792966237076723346362903759950087543075025796397415020398849590375857682910017344100301639
- 0174848563306422011752017788579842745795912502607278147035731188031082540722337056184039814643086670
- 1326413991073500244188772556351318020125185808148975409736973081487305408871737347442840919291643424
- 4021024496426392873573982403810584200373458695310703279798502293094662680690179272417870980625238297
- 5492674271740109313390844006031771503988397175651715664250661408635197545734597473285460352577081637
- 9080538731580692280533069866107176170472318941722385413267567686410850693619772850880899912059322947
- 8701723659957911254740490230421735611643954893538440386619667832273836309911100528583707824962506145
- 5188256938516357639930307559070740917791768960090942166268639945930987166518752762806121677655991791
- 0290609779887602911312938589553501801828282284251271767414232794377249083446842157094679010491342939
- 7381565935133360706191251839663489878904947087264413445808102413965253897144390891777522524117802201
- 6887498243016237329016542389588802987575006283104455394872770124930831524949797471267648110417923690
- 3256497908621475914072338569985684899320722812683150370989919313076022276809177596019419663136065337
- 5426514541707897265642169499127767201935651871297423897420077422706008183314686892660294098085839553
- 4529813264337429483971371578266348938881758528599643215246849202217050423643862971531703786120257828
- 5472396855010947264868652733936132705317091849608428679730630043616542134626766101017003598757979069
- 9862232054880264185324862925109616879659807695389765453614545744554001652239142481489297293814279062
- 5588597012238728348902405738552464234439119934502720657717152104991279089921169924264097040941620723
- 1803949694168898542656153032807224682554245811114270095732327190155988537895755711619245963123390013
- 8923872721527861242038168148964678214166675876691828545852443941373067714640373433094041364476929357
- 8325756754722460492377254530663122614055017563811599943197027883656146997453561866251992177475878966
- 8022046667762597743833899566039040362829861482702138619053606636684579151451491296624149189690080815
- 3987865583853781157034266034430482255013197866047676271115191413296063961296795675148556053596642717
- 6487338775484216680732679344682737453566108015086057433991986215295787876111855924472352713169009007
- 2760229277857204073949284081028003889856654021555633375622291458982640581718488090352195923229845591
- 9169463929579675300915498710901410398873834792493628931057971150462061769010546893013669125649607645
- 5191053362731791560064596482747654805723188947139841098601302864866561626662957625009817839445743520
- 3937949163186162324508410436164555398170233396828075408160676789235051027647052040995697148193078321
- 5993225562257913369017793709375425041782576570705962239705424120671641874246415575661781751832110091
- 8462648717765091190334572307787317880484937765442539452471494240914793370735134878763145769851002496
- 7498296725718389578378464947863985440231214546407023160932103605559461954760831841078154975855244947
- 3221438932052337349758294772936978542447331921658533831755522494658487593974612031368176924912879005
- 5178403707516106150863284334456738495665891503494240520078974138322121492467179808528463428682044702
- 7578369882865730447370179875498833918216443632043836027526113090044610037477990279490761245993811240
- 5161919960596513900779096342935831190343056243567157340950561636287482782058761548998813622840063195
- 1119520178080967490670497658942820319324591324255961711416431669441618015524066188633117399506879643
- 7781553809722292974598686743643437724460225008217013149369918140245420915767683955013168181074034283
- 0411268652549868032645793231845029509774520138980553581941410191319848338679855548199401716615848836
- 1181485049186467563917728633058374665125190995176278621822177837392160428438123658550359877683167988
- 7691766786403769600339672806404573452597520193285403903843278475185561475310226363733593846397999451
- 1977345685665446742838958191103508750244754207501175472655793430406416448164000185489617235736987650
- 0209146312440068050665618211320293368595675472266646602468685420080392607405662982996622827886673306
- 4506550328841629388295625887554096946807070658121980508578924056678207301913200670603642168364916525
- 6313537762548308959484205360987229555827524593150094334190090781546711225727107985212227375561583261
- 0302392053167927886141183298226459755765340454234610490295722395875331195796195022894605030835697403
- 1984824793750389739827953899206897189129627097026816017999488236851544102490634503793304638505980500
- 6893688509215960924934546170186966470225326193881930168212264843687779523961813687773501783987601428
- 7972084836641077328764288692535871469783972618881033845033371181517114847157535728291113771363131977
- 8212024568460969777492196379684737496910945644214623527467527261285301800789573543032753550589002760
- 7241710824277977227327359006266638666960135223025608509729963153757824337925071621720744063331379638
- 7517144392662381145539390043886785184247175875379030663666093268883193121032320723514090703360541657
- 5082209060337201668113885031468464451916950436558866152125950693828434458152870871228293140727555933
- 6996812109903515910164212560711075765634430635117056731674352895819475495216114251931100258904134528
- 9007507758318181226707486169370511374740514479454619795301747600610679345348377394055213592998818346
- 5458679825875860431734040554601182336493553306359083224391666806121029285929309962757245031274894390
- 9642963320873077467150077733008339343158859637012443376957769454826077160976708615481666794238910350
- 6090461460441303968713689488679983508780406806438162177240634791781191620062957777013993709343944321
- 7249722182319521253794132602753367456855860884410590851123027060655379689486119033343118293391087619
- 6185654145709689387436957061234280197733557389624076816315844335848770733607207064012636724168412550
- 9830095138195768861512464866019104419000405387333567120152878262611453144400194905011564171801462355
- 3003346080217675891561479950371467332745815027281127211826466922555444131883985950933419623985945561
- 1849476747865322071492014140435873483891207105258163644906920398813879272899285398846067946999733862
- 8784322251003743280666592641993060846936167567748471799555382249785746556725055674894930960003881116
- 5025990005993740173866604706262123885284817010946710138768352200253700490944667104755790008627486998
- 6075801005598973977527485320741834661939937899976107539930251144261568920485519723078407582278483831
- 2358647816828634723970507033770155108037216863941507175891202523520030936445381610008908813050203916
- 9341159108232754929969978413544833229671875424182246552003796227904310697702416765482939497616404950
- 0283098389394260224304616904843558047477224038717866934915392885786302298924314368417304703015701090
- 2306067503702447200332641348728560100321972365652015909492934148262122999823173320730648796012037972
- 7647315563630376092938373423468209183320342088037583199689240992749363529073564984723927517964835646
- 0381131807445271846223458597944972284318052740625000578442004830052382387510848554266486618405878804
- 6412068103591989839609872713115064108184549045557992760943542184006717645354861510528247568296268598
- 1806029377282987924425294387085412073102529404983278917912774900315217552148825260347141601819538454
- 1767118062521836875819415407036768156157661817204779986923314640336138033465204018426158039026418253
- 6185722468448606128873686999272027416268063766621120692903461969545811364344741598714018921166046622
- 6582661590542069763943593123662045528756034216500347360119434225614914032015794171185171542756396517
- 2568645384670954524837130594898582559745277564378372093903737606448757805380896666613991839630554346
- 3515315481858867792629127253634262889852568544646981449746189241495863663671981400650685888608602242
- 6733798812768796940649702991545245272132575428195324917311506620858665207749095296510075340404922735
- 6548282957025690629358881690414651069717772420955446130258543817863048508060589906373809054306950261
- 3842422270537535459859099326696733216515194817253453274733360274472585272453947857870490548475863311
- 5718366332359132347588259340641521039072871936326796375928473313161233978154985650774595742630192501
- 3613442181778657326845949803925741969699998764598249567094095595490645143192997532969902929018113346
- 8491893973167337404737610215349790280131722337912799863914710105736458088249640377936691442602252243
- 2918220359694796522963241504625930376366432840865616023121610990271779794048244237437724217545327436
- 9030749262617258880652233261410603381653209323202669910870847586819856399049857501176199636905969925
- 4104368753291819072004157598262345466727015736971133357041403209379345126606070799065586879616157998
- 4934109540903212436544310873161586375727374817450178665573793984866922911759920434224760064859760054
- 9782806294187391474966456601976892636165982896565574458040991426890947249706735220470116191536009452
- 7363253066644020100232018732278197614868663489891327347014448203242931178410091528333303769111970512
- 5251189029708294297488398137149977805278164934370560432600535269810691898658868981610889926992043454
- 7815535740465293822554757923965125781698498673421821853124073431152960821411209199994061601015821912
- 7373016501769581186190366897792756904678571018105939373143881192914749443565221896260286325866365190
- 1745365921218638768107774209158364690909165182739807531030664998062448492774756188452973294727139148
- 9972684077858977868656048723305752422857172473443666741818123270841591791478616819780032875242194648
- 0119315937935152394174090419098412578099090388940779420467270491534500024860427455307306836472220758
- 9308219944523472145218428256209291437681438780213969363997860221263221098220773571441294126406537652
- 6428543482970693655116806728306148155350067799273428746717408366660205372922048484087025230125857179
- 1456966579523963596862706459037207268058794398134006676701411765812522334810483868677174058797368961
- 5599621784654973073934095466043145860154049561577645616734472126427468746140830206387935980428496622
- 4722325504660952317681724586362611284833874076507582889567745895887361095197420723212623335561519338
- 2471760218186838953006797502120769043883812835625814501250071190271565144346270648149505901969961390
- 4056079067372607241129244719947702838483531863329817619994731283314491596877750429032797703476193806
- 2955123840138422910035767692969859590544398289266660878010344059670559052076683702101595219513945447
- 7311874107235279456084435494667607928826819356764666589161362140424785642792681562544850631668526832
- 7524656002747765241279427053419348280546267028159924539124873937558094012591977834653365573562593766
- 8087699752574602702166964925299837753819693846254708518861510475226475136489188335738189169712195832
- 6810041957653770211921182725665088966824675048666996598850420411916153320898856723809260181428117623
- 4479558294288085813698860737275497491213068743742194301486676625969169519536885691174938231969755955
- 7940217938873722515159971405447289708395510365486662819650368486846610392745568414363590177744038756
- 5120807714563648777284438331563572496836756314810394389680921192823374145076186305657777377941453330
- 2578207887933713552328193066778103474487881453302276711598246301467739131806469901714532318195729640
- 1713829934458665281042390292044042050301085037228897072266732041640758383521162554729354209770671865
- 2620762946720436336432735056632041125212872258941499762804689148555075973614650511764125793028369745
- 3203604650615692381197213251056180613452134381768173276284141810216441341702491755843656811454797775
- 1958280662844249750379174772362042042450573630609111548402426995643360035301436665975118280328039534
- 2105404919103056731421075413023579348772342390739593893004368913281485468821970534826806406133447603
- 5746590906564609800971717699575204375563545216850442243908278083480721568003121380513744755738663358
- 0661289825695253557232663073951954063697946913927391950929709929134880148676072714978516827026905071
- 0767896576530440463362626888722627429312028751738497554214315049989074564612156955425357015201474626
- 5873588291544869367168210972638770366929876270333269267640511235659178773632477046116118752837864088
- 0382801363490414508513182955873803365715923755404374036600943126624937447350183694088350123180570255
- 1089418469366688303806236043616899868181504628145439937084394672379528195303288606099631547805411053
- 9798317391048191798793376309918240071636953592567835866999085256828346179992044849215828682554266066
- 6948065905588375476747789006303076397732011916264419312313733282236418119343830505865855449829986899
- 1146681311711942189160179373602575963218532104868749920473470299426787127613334237668342822565756501
- 5748972028034318032062448495723097390057150931453891843449438283973734515799805156259164322627014186
- 2062369447593021410508502812036049109939053684780560216627046368552572741329060422899563510252284751
- 9070308253273849955553304495780330902592753163522180988988262911598033711257017217676690454568064922
- 3051574746891557171017567240354189350611288873024043144319869586521866760733038549036027746096354501
- 9525296534070301597032409851150252930588656719011250832847149680648943813007837186239244681790216217
- 3569122887239480216484647377517681894212220710356555965079794844990082719355281479143404037138717208
- 1760903198856458746108109910593691774379471287936895032477418648580648196799561464367082487089936839
- 5131507203056530300788685982036072066991673761641475665428771935359104452116916769281639636456297834
- 0737064788274061834054357077412161383202873787903785858932745536149564461255050554782668745445509088
- 6889469271859889494234495074838218501843413032362004668070019175045926284083850536431267686980340268
- 1158070981034589860413084173550995694415179917543233480633073261339139979788000382109132766014549611
- 1570428580281606751623381353863052429563833095032019287816413249223004761179535824956059145300042464
- 4788062130246897865596926292576357402879940135692116755390400269966455602568297236950495909960271709
- 7381666168678004832729299059428102968161574696306060610106226717021253966747951389381374853895351757
- 8329451364260069361377774400056699301740201136677317877044694506012922607496911061576207637893345041
- 3733651195600329078352359646532657474974352867211162980756758510838501606998969358671522596463057009
- 1390876287416492541708169096847309548860233298288800101652962808976987723196907421027009348880934455
- 5121881883365197843185355960674763507221611787287356394656554342761406855941242591214170781163030801
- 0192587621993809895894305093968251827713033033492664885329561879526644631906349389649279747796305818
- 2377606580354022796691081809322672514261428768508550234036395970562141251513762046722444289799785545
- 4131901372056002945670634038242991780751257244844635771525893472233684526800050490579407659261183404
- 6276469983532198933127117327105112938774627200813172632086712472478310369532505711668466933919993838
- 3416530133092477294293584707438826342400701321713209728274947961163566782615071566282502125206276389
- 7515665851340604552901092611263816622423668992710649041886270014421128735923939982500565800643250607
- 5094589358500721807293223082461082581858746713340673344326805154756527611229009421546556183103412687
- 0172286541622690757446663740257850581983903372668539128342511388977610370155470596978428438121104166
- 7496423619368984063561387622795954521514689288132823943963661294501387816765909292508975324716691236
- 8348275154607827280445182434537596550492568064853230999281451475345509275552779627941424557440525521
- 8825323955625085721179963530195675811774436762550973197511556514845137285424074904838081995588091516
- 1179392191042619092848578161390514823147445531015161591784145999471223905165969441039727295741158339
- 7459390620500775807095967658989249614373434878156377442083749991461834513411785721356576510028821653
- 4378838906972299886294622686851956288323205705378942178959367844899972838082251295857374295653148704
- 3040321954330164722045813979057452880207472858810311408587987472118632864898447340531146044004800111
- 8964742165719993115889037205900314664181261792091194088785006677801099918546190934892669185091189985
- 3281758015614963442527274202132308326262537829753747808496486205747377298059504902145550108969348064
- 5109743330059979855532033131826917519159195006558488436551656335235079497441486995545934682666761749
- 8419319232391985849314290703397249074104335315507161857712844527045561514872082178790107580994599078
- 1903407684845590803485256121124463883238877600772564059505857614506172929101763421062016322763133570
- 8698416113338433519159552199342391045655659731008231699479978456319598341143056370588841358572324394
- 5999371608451544322473332574743269029321113405536052609072416883753354361412870234237825270895382357
- 6585165964173281100423670224794265894895420024627797793098934507602136241713703106513275975961348992
- 4270047047172533326422774262347566320225179842495249821276559511394568141270076623154851582573596335
- 3826717922669936333918066855094802896639701633580306357779206151292995868181602332782682875613869534
- 8983385807840486775650291623281022321262862370364711672590911162207449944470337154671719355796034064
- 9572183991324315717586890563578201193562277776342162367247566768761722061015213389428844275546380391
- 4298293409706376846651169968454977492484216234549879019005901223071102488058804992082026734152133452
- 6194822718040452465922884429554190815449214580890457049392729832168834134299536825867464108367284683
- 3132874321981230074513031444007683574024462780977013002142187123511884439078142864571486713031627438
- 1405338857603885294690507769112439640284427539211601124684855885908711120433136983355129831770447543
- 9527351180945626273650721342386754878162350966398758989078105843337220397544204986189921453439457001
- 0766993023334045070623558228321979391210716339044784574064959683736835999610270559810934327545718226
- 5819162737640832649194463392541412570472789300121814099502881776632184985453085666790070376265770583
- 8273174956120917523247601272848854422298986799882662839508678945771438815809675505801148163295101341
- 7845494953248474350246166826049086054349862607076952206845769308881019936388602056908101664505187218
- 1500574347274692400456628013524424290432379684768326499597859954187679609888240649742665229584406972
- 9776191462648978315102874006697923620332060404453547944198199894752531957170520855316177791641077276
- 4613921571177402991355550151670979661965240622229141609972270298654087146907919329111017460401206520
- 8119033479335074093396733543810667764425162109106409782774039347240922697139986419324018336762578795
- 1661669211485708440347311098577186041438065703058114089652279903370706792777717324019606366905990239
- 6600617475966027436477233417132112564069573043007387189697608262537784076168904565036964121017260551
- 1050631805878307177104571678917209315551005131262488507497125708827760818462973515666064138131857756
- 9232194221616981981833861591091112129640683476454149874892596769391552088999743483482510977171733477
- 4849042415704476573657457752887031370873919072182505772993177204212596617789094627810737489396727533
- 3669497759775761401339096400599495991247742405822602276743479140436597750071174906872762693456375287
- 6279153861033480986929574289849008704137552160375946787643984362695913728997237720073145336673352699
- 6836629260856570583903882359383118961476361331704366529764436074940164969717395660023248475312782613
- 5116274516934985914972842578011566354011257488383449578205475651348675253533930949298777856682473832
- 2471363412781566382459050230733983253608300387302483963995418402866298087668996005436067463747817597
- 3859320010970384009432908482521486078558007203028392624814842107356768943650847829172394313537730783
- 3828620452560793714347989024775448000157389116577894911436600367935436393206776263021105215210135921
- 5469454499705888762836579334060613239110233812347891165133960648232734302761158534325707822596745669
- 2639944506549281999054027881507062990362135050452317325013670624394106180766761378661414563785766044
- 2074924229269770349845012651492167176963310516767267848837295490056786572397844276311347324977198906
- 0076187591408960730665821513844913456155557115108451321597382911001114287389599461623938505836032323
- 4420828814504339150737808186319372078380311364175837348751976507933520535426106483964680022831803234
- 7662678243897034382828567674099388012245584182825061658871841917739713484249557535536154283510624483
- 2821141075660967969951048252279421587069315186868228906599054454289767683407842846866351695073592900
- 5944652517186518412045443271163745245912494051031774974327164330478610425203579403271210384808446436
- 3330137152901498842752377949834574799875281511965159434402988721491706555591849396373620235346368882
- 1813143720813493658980418852618146166856463897428391505955837039471238321734527348213615696128326308
- 5165038215295650842082471083485563684152892779777775636659828621565022125074611675903211654209654147
- 0122942838545756721417389929799800524641816847334818021732521988211950351846705828084292711592599970
- 1537509747900795093033188056558010139808122984565468161871538579928128610376600684408308498397279763
- 7004166030652461482660428311779328935587420559345188132647605029917983382716373959860235887851346092
- 6732319515887297292466770976350989467701402822922459093649319251931742859694152366564659951119254685
- 8864800103777931630738794443787115163435808683855098036167341177467955250541569632555175659300110987
- 1034383335920075203177187132116942973736665048161622813974369194360219793318911371477579284604851057
- 4542832874817932872278710961589682604151910321603588677947479259298850999499049216484971385441255339
- 1673798326983742448741274547096206337139047404836079415752936336390448179541411173493620260485120123
- 0536055436888793862914480787910052555989328252773354359247067399972692273992775653397256696715240967
- 7307351761299221420255506531429549087426170533585033317774602589152893788654307666139718694743502046
- 9696687505676637825001336654434120149780395334094843058804080871386953158989175443230557614844599297
- 1287256207647002380883308255786375448067354538598763808584763650695267362809861199004026798113020461
- 0101944598035927435305744929624227377339552016915800533206697551301973113370391256119133054329794169
- 9192948293905572679579528177269687932911425777320500214760199698152202061524517942389845818526827978
- 9797440541656480562100833028605473010316050320145740518887619845350296999926465795650019044827824173
- 8609540179103702546381436244525088702922663923366404351967800356654544364250362507952964892139065648
- 4140182736971450214526431646621003738099504185588748963082465740733426300253099497815591421287519705
- 2710011571017163774988337879565686539344266119544077414439924874232060422661597714780065489643349623
- 5839622113531257289820135598481565702045748210917373786628025393070446554368897474906584779494095981
- 2244787432218660153009734548024696172671294778795194415134401730118832367448720447806236637003524258
- 6176568380848573688569023709229088212227208341700897912925654354194078268993055731519169901180705018
- 9588596474048139046260970734195449422706775403353710296483606203275561731021591434684415539095659097
- 4654992791537633294735996020089802640794682925361277898320585360585618611894514061132224271286111668
- 6725025703363488631585717397116032882123866374918745662604295318985208791769279853205968708273206077
- 2049087562497623985063918737880636107372115907573362989705665746883773515985230620783485667267399450
- 1972457061604170286561431266850797557168950806738619613357613077933856652942611789955761282203962786
- 1630366976572927463176005226248813002620159344695993323013044439085141440696129490951435113240437281
- 8037803052701614745966697318233961655755091009447720112313016992708211043728483536465802279843531764
- 8760439520807362259586407873458191531059455825240310753772157432145713447781843098447499918919885723
- 4881539219045201566171925554299875334540023811097485202700537114712389797470101585475386268028132317
- 0286201290386585144236448649286552358171372029388017529410102252028569118718607964501087652984253297
- 1631174418650752018769292746421061313176203085067906658825606161624512329833385602122519961320728581
- 6407020906231271834484822300789404092439163274524087456678136735570039755142780739200343533132128228
- 7328689542061881883291418904239295829349293059481391941921015430324356744769924306848954952023954564
- 5503065047097125895308641001156968732728057534628882092894998037694276715237246907452768749411737611
- 2489070191987929642324749483718639132922040334047627285290480570200588772263597678817471579821421764
- 1766434900548515322233513050200474266084260275811143081158773578536814136568366713391740316070565037
- 9085284322678216464359301519207099123433844476197489701363751895168498630633471243935719934533251192
- 4340248672268509671224442280954862096706420714603892359340106844004753696386497513597358331093783260
- 0190925157443192037612293770890557454362847738453351375649811641233689229522888668519991591629961786
- 7208191837173473070068228127018606502753029833901466999574794461070267161116027871706500234454852655
- 3180461527980301358894310966438222475439771623046764635318028199644937566237115116051978758708342921
- 4674980001529714109167257057969361548756157178235831117710135901253539556871274579972017592606546190
- 0593796089784619027221814507235879548427149913315039620305124110916504419669755825132181861783569427
- 5540614559727053523826735711023180819720853948601822054826898663602869566818348668524544614408406952
- 1826332804876044469190082669676296454907545722369233274416649131955648643994588993387758700988054331
- 8639985540493230677615918285928743896057804640984208974055068329611397239222226979036469776787551730
- 3966644741574726584654780659639564895358195570035797166891226946992715128448647722739811741814886633
- 1928994659470600892113189894296771965704861852768613423688150000417238002829767005277922765540848554
- 3334861688984973871867886189873232380042400963864067984351716251126972592465867872110705380153194957
- 7164948506298157989469417142820421641655866599072861984938491754802695846196422947793149812238364153
- 8557038089789007613901032349717969632547196564912274558263541323414243643574594749297927856960776359
- 1484728012121820571237229125443324556605340748495181446769058959806952003492300124986619376210850051
- 2364425478264357338213296609669731653535425624730809028817761133739720629836430505408619406221838502
- 4498547566872126006763397437315325783835487482440978097393361487310202390453380947415977664560313768
- 1106298921409016612327003900505022947613518859124106470656031298014608889949278623547812337075637352
- 4321271800610530855171703405360330737630187113669353217698428260176112186006358489653414360670914199
- 7792464097211427449546989146355548286434011040147223008474005897193942555677557844039936570126377009
- 2330401772015709714022618972549024996396256689084858977504157130429271592893380146276281780424512433
- 4611567291708721811698669587131261066558109715515556963348198442249377278998490016913340650139225583
- 7452536445871131537749642845154005364042185976909329790072008362962024673223965883741317529058662626
- 9446735210442603791931521103560615613271779583324238941011378308624546295140958171894165381882609858
- 1362550702814720744101032283856977012126679321464728011596824377110164058829203812229822825505648850
- 2000903159908409669801425015995974256102202631836172557111491392144361101853384556828607031576644860
- 5768250919462158506950828494085301806644991207142867598986688412790646539483571531979162968219164287
- 6269125672169472287743672269074631085341954406113360848716300832207815371548154354645837025948503616
- 7470707302758499672313280960162936123357408505167586704703228598724739808647326794039491393791308497
- 3632414139029439284576638351984218676346643018086896069214338319604221009472098439766652282254436830
- 4222054701432565119426870397199293424806391183114715967928827659016065848116137229441994332637690168
- 2224343559260799088203400234350990585913929771576049472707702830957584270709136977043713575902026722
- 7121355344973304305067410370544077345958430922769374840395638204885926470438636211199354225500002561
- 1449708505270500916289296049847398305977089314120419837701870006385807844261773612787580995515950384
- 6662074848157250182123540825433798202752568074574177955302589468194577646065374993269932888205395151
- 8474085147443635682109242501710525863495345791590287152212995365959158076973734068649381356148346862
- 5939742529349372392299112609535278901474152094619169375233960791800588818378506688578822174089302237
- 6707892649055901783573302904986104756624088404630174420916460792765924033500521369750536665803340501
- 3128071242798970006273729152590701666746437245667874325600195554242094453363343939195676804590871330
- 9834479621296632581163765466480890071124740281515643434631081445327339715432334544926861930744837353
- 2903424290227063234450908155379512377571610492712179818535358509941553871821944942708611496926208222
- 8311054505260176469442149847969162493833508643899797943725725850349473321123642015645445958323210258
- 6733821208272011023617181329162813476936133623163000555185416994512370308747176934753063809491488282
- 3181146014847359176501968305714704713971680541712076085415277906148408154352770547111386619355191825
- 5549673768753756559018915892076743526148852937632107873123875720648408237375303288464023488292875867
- 4575174119642595547325471299887844133769717447828951480606297501598104109651792487372542415860607092
- 6343451122180515157680503952320798390703844559080248976751242811186831122353594495362332805156428450
- 9116382532846827690377989405609730496598216774794290605229064271154090759630490750045786694806442407
- 9141604249897363962238355342656882489249030940135322759829226761802139944680189960320675803429397947
- 9500581123563398697279023670197762898407331986142970899455340903726057682234474886920102976488719461
- 8758629342131709327277769165187100249899666585508381133567896174811392400806920441462566538294522339
- 1551604594824870277524026560308024160840633583104991593130853947426907323472088411918202484707573291
- 1507212454468985268553115998511179393810802097734738174933999888973856536994038759525336217482394715
- 4783480058946039366591889289962175210471630466038444412373450910382932483894560012983649341732042243
- 2165642758286269646298705494370864746342771185293824804393582160198607006217119659183259180757449365
- 5660319057421033069753707322301404429391360729974231482186205712797240843229742225306478470222877289
- 8891720445413641683018620592669478106500157727303468399829551105996427519834420909942982394136155832
- 6538840685298375019610026743279608322676608982437399230458381935994455203647109590825189916629159319
- 6398638609984425245591944423740980765055611750578961464359199255642675963119627783751287465379652386
- 6525681695700326964287850720184716605737922725209523210990761127024194913962807481696514943204319306
- 4899696752352377801336017153557941527226744043835477478346154171361080719710473088602374503121389008
- 1325624317204976886802282925502433493959917827467695941155443098503616431316394425732596746141758066
- 3424492506040232202802946987375182931270655413778298861958481093502663645207509319615250820150239512
- 8106961883020837877917531424737800666136610712556138095687549097630224818254733695777442501363334650
- 5272962419515030700162982343399091000615550249467371288432197235339945293806722341962170161634329247
- 9375744591466577156266828511079209801382360277908524908614061323820470296033614212396789169499234232
- 1715288832979939112946652538472686405318731979322677702760178715157112713190221683641694532904519520
- 4615033553473446978714152244708770708456141208314980110666716520746555367187872873746904987162762468
- 0530857583522804191995607327665917569577300287920706287306356228290710931722541244102899656219439303
- 3935979312729824901885059982075302805818268734536262076988428838928963551772699775527089280711983832
- 7126416498135850566092974668194143322037636016031702386454010380419337568874559351238398276056529937
- 9694631115736236765803515756436802079790980697358928950333631027509478478135700064703167653179843748
- 9385931992844679705050146584222778269606759197774314228489834622963809575224532923435922351304412034
- 5909610127448589140505827476775911036197187481126259602724586676557147275493941205551336228916904263
- 8208357399520615723946451744498991297021106570959449855647567105391013640465590616591177906243645957
- 3934607185777117061118451700154545080998850040593155875095120616554563146200738739443327439156540822
- 2265516671149813613507373995489339174808637419664809327817100263955025914047775193472052693611721552
- 9192894891128512312563105277097234938677089309885624797358932759808463423218516249853050362731645550
- 8600244801128794870890218752873453929413161466208814826808614162015915549122041986025984886099100100
- 8935521986004274340573101214273402947594356726977628542777276759795406783215499987080260583813286902
- 8183862100061003376423791980019442370442063331998932146516974334576991282231826114090708986144154081
- 9914737474336816449824325266081666966973361969533212777691297726357984301509710815856277952410140312
- 1972539950098548370069915726381749334231984170867848596330912936697738356288707840800239223578231036
- 1229231334313870871375607264795530687856767876140867978538841839750850468350928414471968343566924539
- 1453969726703865703172962418389792354536870706291053584095862528817292816924710463959137654339775103
- 3038618690541627854067967188564523146253468346430020306636243007728041839150504839977463906523527004
- 7668220337015691585237701399054126383476484663841179107634163945096265761345248340913898753793488871
- 0844082251502479447198768883992003573792607365768549301553430268438483889314027219668203872768490406
- 5078641498395483862399144327100354841428571466367581410868575684974964249205885698437459468657448018
- 4934228027958235637756438826823262418776221622607090451984593267734773501828543606939352416589601174
- 5073761140640689598829299446453818686066474728889919098229601789297804735791247963218691536870365595
- 2944433499542516058090830492735940881012512804591065050476649626758222413393315802709420923435482413
- 7545730590871565675676701092095054671117837732104759766979436357024999172477640990996184223422593896
- 6846991544188772094653007034437183115728705732067398759578214079407363342360849638323335917902277126
- 8263032769487753200468018475770539434300795119666775243961591663082780839590538322951127233820755074
- 4153078897776286771662518810911875351973300986377174786188154764116022239030319559678981537333332582
- 9836004518897341313857960092977745880614240104591501478206797394363629199355822760236751034782755648
- 6627121882555285317825358601035108225814502611204747092401718602564690068461731767990573490110072728
- 7689261945275883358758221947384320834578633052807557454938289523900598456827291413464323488171485846
- 0678305948260145359687621596708124955323057637815649344565257825522938249626575117074949886687654410
- 3827053374089892104036867736560454285845169503140223236337570264179657785208175448924655709924081323
- 6655786985264535388801118891932862519259222135566768155760927630615575930662647392608983278347680214
- 6055571315939157513419736238143794497888858119633437282923219663203357801261130770108572159898202801
- 2452701419440551082110912628261670708062742710620807375623747391179018806303915191898251718666137575
- 7275971038981146281320941182432120115782881787555919083128416589810129599397245828288503470905302829
- 2225178972431329487897374321507341389531992364509403300894441779949785506114695615294856553112229462
- 3526306051560149924641646941653581717906597534647747475189449033886376945491013384753795701243435328
- 3214492982757320649460057035879741372847308556850024140578069949444209656454542067040671269177034205
- 5893545921475139946586563795324498939480729634535959897732503522425366975520262596619022391137446470
- 1515637749468173440379453288595394926777638755908647972478088680068172355853131435632975431766043925
- 3838540575689974298509517127782488540660920326559828127019571356428139254066130983872519138828743230
- 3850700660199215706888715653136986458667179283657355256586271881440144317143679374810596913709321216
- 8062424716237296617153934399533680541456986793897178488910159860309541293529874616910919252380974294
- 4551488558318499498594795902426366425548655563314934689356150341488374884631294653005659807467697736
- 0194559815286306276126267663557735976758113842161237331459708729860471384174012488889187971332736362
- 6251131133467653762929984089037789520000853939976358474428197985767807210489634599077801542669717456
- 7542617238402203277336476397551754916653384472733685352496691562976924834362650474619882335945593854
- 2388739013641770469453957981187527121597768442511799580716945466861749820038914136757425295199235363
- 0286409958477380806675941697155808335426239966791371918119745650950142157414450246559428230866854834
- 5475504175328090492439697577338340692003659626982380632105842116831153608063960003029834869862501418
- 9519615977098530989341590691826447462124298360754346446243464183758912699382353801438495736433235890
- 8803400365035629450989571731821193875360604033750257331182525704669344702757566572460202434358051761
- 7980430500157661220685910711916447836787755287555765149553864629003147784335242018223228186288983604
- 9955671009471307362511750465682887493345110800437057008572073227508319673684109210872646030862698701
- 2176044090402806979491118396436605218431492307351631588904445480567978322555962857732503063907386237
- 0333133937948649073559546851796504296661825531052645982451735375632502837394355101805927205309010514
- 2909243352731278690015151305587405395535952649030281312758926687850268380277539808784196954244470759
- 8265277147636801344512270464696586160140500059813554266004555304125645385648993160312805596469709727
- 7176477513623793186953564285143044563012761042826494036797480293301901344399860928405868810026888328
- 7786069070057522291637884595429511271236416290417249259287033518121777245720634744414071045798701168
- 3486538940860879346428858140532372205220333882782491606550751428498895026730473386894146657715191706
- 7007154628493341305459532617825762474557786052890705568120939213636020794840019045348227175019919985
- 0351721819829155537394052447488160840114286829854219815417399461519446756653991108625702661728915721
- 1616708612807864422596878065405524084076980926229798908974388648718812412152858621071441713146827394
- 1512454023152718464160210458750969483759431807362021929374001190274750271765673435942473670661803986
- 7767305606401858990535751230023066083708711686914757913363840862325384349267186066139046684337879651
- 6790070950960770044545355631362405135816161738439970087207800572797374766973300019518157166514482156
- 3406218186569555695230599732096135279604360849164645440098534029608616745334380968998239436938249495
- 5094716954167064128394245171412601916247382708669769311806960971015572581478531946257461453503976260
- 5546512543502145241434329824924138121771320340323718671520627359281633744103154710463963111770834535
- 0154482594576086659775717391457660958775366724984051724570082595821245485219616437893131098824817003
- 8422332063288500432542084921594423734706930124693333918887639562414254068324429613965686240316412840
- 3058782564652342818336566518958550369909432595309425060808246841425531437037390665109896765398087358
- 7499377033458953019495195170217522645207320360275463941311371161162228990045708028475403614063814770
- 8904136189639814679360905829482054185806765374568452152011414513584740042491714183497910852675578692
- 3646084051029640568547162911479605166051298601164218923584706774478369791634369220302198889638490152
- 4172648351087367313458395344215022462615533663361483478643233561380530074966762084287575307448476761
- 2212952046402684256157402198984963409036109218476043128882969266380818247741624321491805174576051652
- 7671485956723605854481485440213290753231193378970542137669259894146244375806251615321799734696371796
- 4554733535492490014056074366310647417667998572569863025283994443463799305182425984125798358649590627
- 8906953651854959181602825231129648862454662474149878023489619904934728196665830714757725320158683554
- 7077836728257562399243554639377454477973382960292239539101363924842457990895204656398045121789111868
- 3684611173674956595237321588319222476966429594969400736850502840377689062658085002467172958976399152
- 8855287127946920792122067201320528093964522632270868221231475800660317858618410693450455257909777395
- 6618012334187417941362215786050078339034591252524540485754363277089363734813762506583880204845701532
- 9172877536585102843043037380946458279446317034769613448682880549387474207836072091819669560779780786
- 5955740709604430297860930907972073074960701081558685015948097534353052729341161714831747339661005175
- 2170023014799010869034522977048775984057286298941810215296900745556597243348361850377715055086033011
- 1505317616416961877236613812722787109865173452038573787302166127222580623945634238951182710638999382
- 8193946808908917142686787488703236974236982543558888324608458202840234836262358836434932664801755904
- 6034282151721956396349530430084841662178271514494595409011794488525950494726556911945792036793654037
- 6113867493761913528838976548861213181153030471606196867043644288434988225523312968750291635458654268
- 6608894604692937059649512844897404856780035852704039935626048982822152555719969935257945452617407432
- 7085989113001429067140022594327469021898299517955344274871811164211742934346618581259577501754135341
- 1801559140012523994839390176617521611923006320392693503074408005564853217364811681583302031705897646
- 7823292023818247676449092399715748466900662684870792697974543610502665979171872565458187225995671847
- 1895396896356398273911694540082867722083973564852019605960672645551934292523068186375946771657471639
- 8510375801026645131490589465320117025939029809267215532618811216870595841647293227196915373233155149
- 8788130347398894896254271704631085200203089349760747480969523143814485952336287596393157034764290005
- 2519090875253165740792449294631761411281605006043323678149217024471810409000252357290745094008754190
- 9448501323427737790282037687775988388910224289465863071885783632584011400402958201515727775055220497
- 6717418065229681281445359630774683991974361507755608490148304881526622616887549680346283304068496724
- 8845831448961089841116418534724679049542984233687929502850535622738086930362906434961063890273423981
- 6444371298967524622134998071790983253853751824514318229817014980471474405208206771734829307574244607
- 1778472524594618574890493050965097953905422530692123607017038379108571469830225772485251738459145607
- 9105588537047066293052686115149625701677756605098715221893119931908608040958932727146520031599118043
- 6374064955449852221163110792402530841208587432750830257360467355905024287620096058217825407072535881
- 9424274822906126115650670990690000964622866691935026133569804484990306069770879179642034494706647343
- 5831304985932397059589076521205938976976179995460990255750129252950517564633281937784817982728921626
- 8839791503902841548928484050101832934301693930859769188207609832728889211355169823445644473332530729
- 6239857923564576768444655740788184753280032062040912485037907903369696799857569854811754811838668849
- 2826248933731346365620962364360176047562884825574687983523166892032758120831192672738707762830879194
- 4164060207462803182215764029456583397476087986917525550317049629196191712150721245277331363754728630
- 4990037502459348596003211514499284066215825743674227447550106391222421889039120688571499028125033222
- 9301019625987938312748207951457466369086901110213105305738750610287625824804729782975970378866527021
- 7441124608373700727640915037133336149717400905160213542870186599060553712590929896988757268780006791
- 5869091084574078027399010187258340250270675234927908455645847233838793694839321219370566310273581109
- 6309442346293573358743954610171509748417603259483536217516712490048287878693443178634077789561343147
- 6530447271015873083591865442275335060945004542709438295952345006179508154991222606770536954034708723
- 1670377358003858882018536060774078592030910013073668615332051430948329712861083660252455592697326600
- 1032976141119174374276782789747510302954650308104060484212662927492258713195804378325583814279728206
- 1046716445453966782750663376119561547180811410663728904450860711216506603398923855553767532053879934
- 6850503492185865362156116256077378507833681394845092505697034605431168901434565623077243178045128441
- 4990211879930904828898966619644774295261486897574573204681701313930905117056129681336246565767032752
- 9978842563672610468451395578761745542614079499278851594193234557306458553637676662779045651946875235
- 9050707029026423593768921741125833571439855472717969334716699045245738576573463632340209580112235447
- 6444172330199688759484111588591938802652082412625415775923953557139009940619257885762438343967082535
- 9850867717452030647712597168716292719811087226407167316203119950574953533507855790580552280567687094
- 0035886214508419394511021296641803010250719004143518026258391841696334287108392447011217284273032774
- 7013437984117330124469137759748817280837808632835848060410924220865767728752209963240080429944929304
- 9868849898458249983713858916691314115948053797704200159706893471118315733890104746479878081565219264
- 4112417536626682168177076943238146633641948679086382584713414390786785266254202550798750059834420864
- 3353203403385407169700485895423819416463202364499218696935197625148758953644751634449406416198941671
- 1341044350148248437987463916000978580071488654135135723460466234792972728314241559208002510346789545
- 4275219424132570402630697694654016135485468798571442948680303910184410863890414481123754437128533082
- 3993732836681962313029569185695856627411377033885853664622747193167250336110407331565700765207124240
- 7975699950151716821900645117887028746352292980881877100729033972992256642113056013757759771901399412
- 3632672808453894003190961542149931926133641122555360118366273278385267401987547818763539357339492847
- 1029582528710380997565439732567129487558224783626807452739034903745390658115194195726455858788269618
- 8599474918395265496354475713650412286059311783277470431717021755542733811316446122057779146073657791
- 4630762301569877794279947080006669333908086631285203725804287139455275693441864382832163075424935767
- 4340668984292481754076245634843585997894799507358408972112726010980185913187269858204360215449353734
- 2282099832151279967547715108672556888219897690679432319918500345646597546894209085865186885415650053
- 0177043477744794386727039309525080717481143880667694404088033700276228922940394954645686946736562765
- 1215744427275561854727297092316077100833032761204644001950108825543666118384017506433079878960184957
- 2564092270264536383848782826443778467646788945218613735355436563776064766781708984505435511469123142
- 7414164836797645974961007517515958073916479931951112693660164858482939073318797391690878819561867435
- 8831373515539061314098627551521295444877104580897721910582763398947484910278339169952254377681439407
- 4186682375671244233235148234658676499645194524763308705364406871414568326066397694548019309437100867
- 9575123989119060859807956189770286170467140202639004075521169679039679720071713355977146779184571361
- 1149407966712462922999331477634216541227783574825862753499006792111978060307885749546973284196464487
- 2481549238845041687488440326562774709529606774811952785925148107028490709150186522875342941836314061
- 1237085873262940243390981983868089791860127462081893950209887488319592020920204199143110243288618404
- 3867214698447218058827477611885531433454775949915708112154724304881109826753085018792712236067265424
- 7225549511677834995137607049303136759892216457674176156088948829950931142765681879504457390726038660
- 1558121381695557713584204354934789536420233897464954927668535362013175286570550588094409771668261877
- 8503565693248837006191686881325769898892153770164294154770352800561194842247298518748777495354659986
- 4731283766810231684783864208035715066104376080275900992417626841020731910411686475234925060364563867
- 7729618049536610561814538747453647356295576007682838500265390338220423592553982932841939449420500089
- 9887248918062112870490391300294855651474954344575244822871583406545423074678494274930963470015143263
- 1241612982110976577978086462089636434720880591553642322648312645150216051965026584720667061301204933
- 8696992206072120550748469831325044567903619793751145105610994059722706102455316434184231593135390530
- 7277364315636726458013226763772668618633479296099412432700177449539823043204002544985446412582181492
- 0560149218878884850042818418295383774717036791912893763087010427207210527934076159095560569028788415
- 4359370412944870677376427126382152837911463086145996881385154958969349477753009109089564506288798749
- 4998791897733005539554996967223113032996223735743856778002884728964213358326697472583460615280371262
- 7432217243252933925759249244741154505859760314253954019027327179534824534471181832675337725688313193
- 5700208316178318579346955506250987414808507383726201448358464003533691270556211958906298935556277917
- 8399088576495624037971430883909711102642258974629317668967223404012789249994400301464679220203830421
- 6198807717346647351646810982056584456771849874997429162956952777441709563128459610269014542233395364
- 4324790898827529451163209927530749937938189831475679444124595963726257884877982459217012800557580271
- 6147579216877302876772414278390459073912739294267884385771923968052299403405334707357333451836725155
- 4265826396199993098367307950372448686461149373049576129415707070662032891811072389155275383366638170
- 8043033055670727526167741946306060870155565744523087465583961240503014805791061458163090131489886188
- 2107938274751304764124868278016019084967844218901110183925596780158884405085393976838736014191230960
- 6008688848409587590939798875457125098902772115401440192622172796546564989599214375691142902020411115
- 7924873126508075595972847278699682789162682786949115247674585192281108652677009819279435337913553500
- 5146898579382371388273535727171789383014221648571714102900699728235323288484621928112894081707974024
- 4219054436930380174929970320843401108733211145368423599993209089515669085964915227766722963969422424
- 2341883180352109911640280643484735443798320000362808190976855849256117523929774165820418448109089512
- 6836470846247411739612714881019329455867381943250861265358837368559920259078153960821287907306065333
- 5449059883474701016808696373177373258291394020149923292096927067831675968147669667520807748268071111
- 6784929358461984186261721109253221606852538815918559880627768721643818351604955385279364210903131036
- 0781624389147125433165370049295435731311918042841965032161578090425201331248560532036085914481767170
- 5497669073927648951405521520609254132916570249181716644372036661368578767332511082859038192154476652
- 8622524635921917501303428439331954912297279269763953174862232078789202684450835204124961260947859764
- 7640505134461645779957974192093941387311276724057940541046207559701574182718191565611832096658777408
- 1467691697748376641838608175254785968515246948077528179062939927065252312930894866450147904547107615
- 1553997996389545735499561642096460474745985377240519452042446951551105760149422144598507856289800520
- 0150144217236030394428342444870888738111756954845868810158847305082029360514301370104506990268158198
- 9459515045374857234879807161323689988928620499341347784459648262388689344956413068869396801624022569
- 6097259058369035914478304640969184582654758153494500776516075819566412400743361172866660578064097906
- 8506843839086550136603417156612177413653524666292403852731631584292475107182073761997425700526636287
- 3424852769709124146326043911646825719384474976527412791288332764753400458797875672197285080251587765
- 4905655892204714962052521040120166987644538174938761539621762099818669564349377520407867045502757495
- 4208283438265272799066404046308555601579354158018388708877140523005777747910133607583463708160374140
- 3358166217105237795477803108287893113898944795861169392281377248209766223153741655518707243003784468
- 3873444610185876496624830235355290685620889367050129145033747129770829859205524051878310562165213224
- 6122880034754732559325711750916176594166482394972913352370543886272408483705528170029629809058650804
- 7949546245822401357141584900673308445738818119674451429115214342793926996556225719864391960677530383
- 7468667222170355689084250348329476678415036783681989747562636076056173959495904537872887088011965418
- 7892476530782025541234215275554653752784851164219300210400696015444285500717437035400703359356505398
- 6517857070065820998041957449512358764478124861041475565904500553778745425732766313738825020172648969
- 6161291010481279326374567313473871166387709984542067027002960111722637627272674521018118655910525861
- 4533881970128991196384735029017400070680631462301308053975457760287247409909750691788261928319716472
- 1284958737918035495590854500617988132119821142982583753056350978991235940544860179024862607671948351
- 8442349058719075337294433959240918535280295720103839420962334277562087477231701175275687241012245302
- 8153879584509634857983910451921318634956903039125641139059641254019436292949491921353071715344840968
- 4207106422822898118640267635071607969350470210023187810985613567910659306600789776255319789825006631
- 5156298335443916444925805700780106162803210220195704757986565811680933242300056066489673694876242617
- 2410119907596206943468594040616410905711553454537680923271287235399907443591953983973721101334949165
- 6927142993028020314774560505446618457532305901707861564430381970179149567653940459435606066050701739
- 3893132134625850381073195038674483556019491822805167730576850268843254958908956081419950752565189355
- 4022636610084816146203865446477107121879516306983362021407461243273856073300741729085341371467646620
- 8233265300757784578012755078726278301618250870084281877453320787977894296485859758192842049964829620
- 4273540733853100546993954125461947347217039952702270357793858512968366440678898374656563613544478066
- 6838466976517661499961854398962350237176711027408909193995831451468723612871384972420690809504422367
- 8551028762868042518816358402616298518072115283322375809709057453569178401938160024396543257825045445
- 1969403488409243408578999827719151230309473805540308231556081860716158343395561728106373311060601526
- 4964148156840431946235604363017431750920771304908868560472738551730953808475014486517604975677360783
- 3154472292534335963845630215217104987385925310203978958143336638415592992550894460278070179622745210
- 5550671191316326265279936696359892383006096981600167088134430020391177191630701637780038300371126418
- 2414601498704171480566260338497751756038495491915791417929536849597062863297174522149452643640004011
- 6851275873879434866688375722889961342993866402364058944824529124282016580047816694184780636604784838
- 1761856515584017460372897821585659083148930651177919857231716476472418930431531999088154997137742072
- 1011833196861968494405184713480510376244887581817277233442721570874000852493919493398103083199952288
- 5426263085181455141049674896425768172031457741976055401166514371933763721881865065248544503999376609
- 2267777074793998014225808662149871912470138746989567658098163424079513570373348683994607400148381880
- 9109122785049874225639471028589036178924869455199904917116231709297408195172163625062371420825261190
- 7131791876380037382099894155167362903105494029053725379895773700088178658870490439209102611278111129
- 3551942277819214700743637373519008329473368732239654947632992827531835181262400711892034565885546809
- 5030263042519219879777374432637260928911109005219868755372281053055764147614824639858637189772797761
- 9373087670426497044115114128900621261138853060373672295958161170213950300741417661128483328860167367
- 1673203588047015802478486463980799957676470792331064456626033730736158992261787526742601353600729527
- 8511447312992791452450623340290963971759232197958011191466992839606609054620079823745212245036016910
- 4115632219532972695445551518284094539550786740409371853236603877962805143126766274036439823983188176
- 0597852813466394695605558118458939807050113575168206806948943855291350882854473482815176097154238595
- 2213273086132204129233077656558692790957004784303955681994015964223359594550228105654377995470862448
- 5590800370695015608019307214648972673163938925538159958617022059139730270900638588414953461627642604
- 4283738912519184781985002549826303585100634103443763340733469903127035583080112435481586611646799047
- 0409954792381287897186780109815204978806050476668203662967250936939607313669337472036724300318966620
- 4997506525201754713578657346438364676379268501958461510696765363902447489954321997231906116932962287
- 7894612265668306435189561638995745077221094512799188532444937648778904054422423347097958726521769377
- 7637079604073278970245582953869616412632465754921044812238089336380764949967196348615540609091415949
- 7678087746191227708286844605325727180192324631999466767892603035979578118279000471394092171939987407
- 6000999706958163447923360510616646007787559395457858135619117973484724275643954446900185370303889947
- 2199830805883405836720473010593371645853777333738261881997860740674509062922554889908344358447071868
- 3462839079294708011696863948511850811643813460281234771266500937086434980810611925116998390691124112
- 7884922501074046700100249875549803524056367371564404834835224610219675040334226809019609191836769753
- 9184488898103076931360368464907518519208998079674849520642528150398821992945016312244419290790582175
- 5002124641564387801147363534860323181769769925688623422436511614137835848603457291845645973101458014
- 4233910343661909121175141432240043381471464957028036817478157339925527876758136335975360559539384017
- 6867674304746201122791642138790162717829363320257354064982943159500554714114406637280225906499077297
- 2153184835396210592075094818702230994825467297018483782461121232263919435007317776200669540599603740
- 3765441062871924178666242088214648278279438113619744675884359564005433840353292127859574881400073749
- 7083250483278575562787738665283977888843093724219594555535436816532937198863634368179075180196127350
- 9345804109446551725884968026121015346697273811614985607135933184212517820869764413662803131959266299
- 8008004999380179915344918391418600149176520095550574294390306323540512913272285289533183861280090024
- 2018592068301245576885159986036670882144036179949757693010158168404896369505707194161819229869985461
- 8110664316242154343885744834338880719947667423092554142522046461326333021925412332655422517900396237
- 0011877224880121899739867454023278310111558138887625327523466564979284560911758393972476956922958164
- 7917057753460630170075274314017131409347082620758055636513836577977785668667231433899715854051283817
- 5395172886726792433519324279446404274845572204271370383384282433585631425510375691018147458356414678
- 9534508685629018486760916770619988006592305344363957172825088842599663928971247757401309355439247332
- 4079182045553817663723533222093512540132481590298902642974259278789454750065499469212124666206626082
- 1434932002080552240572239843830449363282819228454889328958740225793208207774992126360859118902964660
- 9838958881002923882049246229713322929703775199313610098035267052448685322637447804638432564630100081
- 4486291219945715644790099446084293682847965274461276533324488110332420251747386222344906972367553788
- 0339959666403072143753602331036965733231523772298744269056689617796282321898718909625100096673816079
- 9485616991125616466451101755971637994994874517358658677084047168447477084990976997944707107221646280
- 1394627545923362533618584457602386869037340402342997958662188971415880457537565078504261021206974369
- 7096921440941134689942630874378569318126994043871459489599835002482339043529602141043479871030683534
- 2977082983320775180715284808828337014599515736692340895220746753110902000408776677345208304107255415
- 9390052576034609120814028417742037713070084243715867293605934806649256089060062140073524622034669434
- 0437762973714172956577384435940054753577833647871738588319957253806398099602645405327205628731511229
- 7815716086295737468456654236008290043057653315412716898974622851338510767066427511106126351131616092
- 4243466569700709329952178094757112910514811469846816362099491211915737590934654666176085925249964296
- 4904995300849587607819636004710267394007407320843624420034614494703242395176785324245348099377528028
- 0525924048657628467141218672997407703083930742617401450032210497262071517016718491281343898195596976
- 6521920190813700036727820825480844407705488949773529007409396411521592813098524327606824759522533080
- 2824831409114550349648055883363143637880869268509840227543561095303877707012120002898032517901049232
- 5077885025908326341435485168772200998294771996023052438855804487383316035861722692030067101878742606
- 9417860407069990250750049323362692993214094658099646531428589402950507599383742467138926990433088969
- 6893171221522509329615283223140401522472006962251931218769483286742002917366443568066358210533280417
- 6726151562302124288855432501934774716280438341939284793348612220573524012877500894115331923097650828
- 1811189635502495846710684529264484555742771213474285886128655316929049767845662596418247266927783440
- 0266072794741444083706645758512376709200048312194034837292085600229027797730864854147461858811157024
- 0287314904233747102205122542105996607035383950648233459260971244250184778080977172673924731940165503
- 9607867012304739576533280658508348412526008894658467311915729174574224177949335497989190078206213086
- 1080386551622375812464835540650724329292911545092667131859296769309032438050050470579802957471634654
- 6186859666334816473756375825302952862923734367894946601088352913613146663832807119837174914550006429
- 8208172745061751153316431785068605599580414470505145134434661354349132377733690004775758504046993549
- 5286508212310688552096189971243934341116809879539624817085293385576090027022794974124179740475717835
- 8915130101948311420886832494331481780233765095332429955285944368343551972731851780494655835099194309
- 3702256819318024684488318677087309347278038059155250231204064223609470988530160758370543677837414644
- 1160534217600459326489012510109436888394937501080782355178495090823589954072647462043742888105083964
- 5588426654869276504840328312182091922525491147266406362203079345506603988385724860051085280789875092
- 2954152053685929261987791689221592205220551985320147926147108591884318686574115963789931121609989761
- 1097963356544490273435909832894786788397496610903105796567898848146337793780972063390584010251514800
- 1880401230886131297554207215369649270580145527502161467808691366074981225162163435485100633443491035
- 3420533934694524974769550862656936276212610915726891851277303763839795715936693067949298648386633844
- 5448631276085510051818945811041464708454015362914582274572901534105798816935405528318673603825088352
- 3047392021460703493319106727265127717991413837226705030042889515491348029236323928824220795773086577
- 3544300787149940796063032576958992623920596601385554180341966989324367028510494283621790242444777381
- 9256545997264421416458801833242657385618786789598523634784235368090599271199955978540144835966062156
- 3295163890730042756825400192358883203001911349752328613006510978769294553113966895558347643708070331
- 5692464770566831708735818394804538875307517147833711950768797640772884648664979182318450231538105517
- 5873407189625387985376214371724368207104688142052492393655087044891355416556266667131541921763666664
- 4546134197065884404803958628401161360336854813455050935903141657252576055258698787030511931907553636
- 3454402515452339582336587160381608528218500714103549936084662784075061236838764462145891921779142593
- 0064973124185463655995675129585020308227841032613715113519839061241596463339823900878973879933716728
- 8720356789486961278469180298840007702404614168435709646116237948458002436915344623192970276370458105
- 4668618648920064818578844704613762942820614210703480363084411167800614815023913690139665758030939659
- 0441591251209695297358127309790325832927479399692824383149206259029330928601033239174038383427457113
- 5139845774783202448838602196807671633165349867303474540139992159822111671115125442585376091673432769
- 9904005844974347590556420630769469347283565064991077767958926507983234810840182244891170749665104061
- 8759184748576972103674326815148420195697220747344822087928699608362935876316538904783900487427479351
- 5152841972707861432196582841706939049681577256828050122020751092363465517693151572323810501802258551
- 7518247822341364317881652068506613942262653446972893597805755792607832166738898066125192388000169534
- 3252262005288995610861328799507595735547495524742430832870191803056477082736701434453937593763155017
- 5093518515879850506946390523195829252309751407405254595631400743663136531859885757737887841902614118
- 6895445650421603370647862526272470854341759779500692649026951120275026309543674058016472131592679453
- 7943694975261018446608580007831271913160212350913829704258702336416046448461284709186343151986536546
- 6090267618224747180122535599681323522386679559736925806895975303712648024482045813701820343286908637
- 1659833775710858330103687434657741106218143176556339621006385831674674809188717077376535589866220294
- 9987382744425547924116346546794060365024746024561895259093499667359512271273205240111113918523027067
- 6142772309222947288101331929633399781855031829344326322064698010129517045570430063250156250431508365
- 7628326741230020495063971736784188910051425253052496886256738738477796628662164973624028836930961735
- 4373373136677583583570179447145747081249069802297768156882572257089498908991206605540252060801322450
- 4825120813756743766198679642641298605943112830005408881881233133472974731212674444311867594320910668
- 1841781026557335326213877374737553457827904151159313218518285887774417722966204691386602093496942560
- 5364506621333173259619876825885942987942670938011410541539939189608363619248741879169306463578448072
- 1565839931203794011832448020155671414285986372785984697074047554361823481587960114136623524548067203
- 4561475693978012289565852162256169671298369008539004383451036299591188765554858501038242000728257383
- 1915399075270712724127201395819955356637355128909069762510703048920279452591556500485530466782494374
- 1234171084511127271602210941931455401579997525759706235711965092077965351455828496946412471272627520
- 2638568898807683516345882147443822121862964661262708267422635057195047392386350754121166483026200971
- 2767100489826716132451910352783620701285444467011130523252269301508703063384519741892706340692454588
- 0913768037295753346806779350468647874587707376219253052874813619851138575784542929107665429283407134
- 3502250882818892915244527783987472190081314380720430207245467931758778466626656846528861507688403122
- 3212187332960724426849433913948234400487947318100156723452617702576708867907794884357597613518177223
- 3032469991166575966356154888040497320129756009526598823496022332949604235511787278552924080285877667
- 8063370228800022181033547073381937382622675719292593356370954061572778057244148311164042802001173781
- 0453773569712267028220634931269054549816718499502811568901079688029001125658917905559234547229213785
- 2872328218121250345182059548096772277660713101778603438829573318206423587236993410098106172349638246
- 8683009133256534492346840680693901747353201504440611383475519042887754060775819161781154130039925740
- 3786443591301907846113155981228743338330985378397280207272868923202989439733948198177571392474916946
- 4666678961234291093703387932512337739713880254983507066465501643565968531458265075610705724702998374
- 0904860172437641981422704314803738452936874360053639126726507615680781314200412241195949403929770163
- 4281240787208085216663064592305670320709816172252902696023063081292602279781774357161381029192980622
- 5097290234214027211916938032713298320083728506679616281592358286686576099904415991587203941836822473
- 0903669496907177457012177714467268351119457992357643789469356535420860629730104673071982276607743930
- 2309468861548281095152021597052550236156478355794196881755560913857785219222596477699410230570038366
- 7476235506978823189655698241465028678631892113122406061809386048832645173084016950142082157326064292
- 2288691115250254993602180051041932609690738474883239140241558533260115285070430660932244424825241441
- 7460744488445341855282414037622464301160849294866458299855205426715174054544202062807034332941069337
- 2726429706689108153584840149094569382462168479929707068737877406289283254513422604088371872199038355
- 5267472209412312676596338155725024484611269592746975238144932164044468989516224006928370958627380688
- 8336291637240041875958645520463746275695830507984538153471523066411007256923629349276393671091313512
- 7040305457696996684553584714559181928377124625835214124458120274966078477181056994570433605081685095
- 8945374630795183950034717251948443599494854468526812973590190690653598903356956031006447968263120457
- 3191011544496555112268417325152277386303081359758217229059766137627641766163476909125070161999553759
- 6432115575343966216882710840367511929996000886246321999875418094360053087413396269299820762966801548
- 8090523558718680761698556060434175392524049679996465176000269269165516987526525067739508513040805388
- 4450609260109643688108942026856159073899850990825015494639182209700648455366366899685892286382159711
- 0767179767897501154280872303912887886996186789307198286754991974326270934100026851032592963268818524
- 1489579124432764872180145298218574977142929436668937836438222965859111417940518494207357064528325988
- 4591225939492744455714667765151145692903139525375804633758579641581163621872276615189824122053513224
- 2248825616774245967654125403317844988384111376073500772008569727762648736527833891636142496421063088
- 3493089033208487794286440497222682861859946689343794851334855905828206964612394649757412236283139773
- 3819087455803316751727223866473603363229422165312776358477306315342973727749231497394273391681398751
- 7165017810326131745506377657709788695976757422149371635288456874197560695360039337332020651649369708
- 1492295834331163103727409098662574705051470227230962962287676893693773871239020465167295592539637570
- 4229682701372159784961803623480433790639703585582422108823529872394968853577050451828950991937634747
- 3203519382811144209254673933678229258496532200800152631802914086468882484513127730626798081559547648
- 2850417271139264031553850405835488218720632498225683083781144749672788833320028717670034369690112633
- 3771406814924856099222370955185473844571790541768739279171785165931986828875641818677687684101914918
- 0793996112890707515885455246994765082176756772116466364276819985224100965213050465083407275744849661
- 9761614608405906074102214449762236679944848377775461200772349048346804799553637492002228711271851356
- 0661682291232392180055827814185815990440624052625463677109244383173398476328514706535000797831849158
- 2401175956590053502706403840870712334125490430058925526833691094710188568063097486389407660730095765
- 9146215650501976073448899217067459599010087108436183443327787653682587723082233443454329275264503508
- 2751036885278769677924752905435163484717783060043423068025104169270984042942326154928313761218792561
- 5980554961799348822340432228376565318861257502640780451529541971941954779774061554624267671433647051
- 0868155403216644525162310712260123089371047550682508603240463908671443690773244134398492841467882847
- 1479332996215272656768340104003538027202527541843522537228344897065811560857105993366677451985660472
- 2008416019086000078805952681826691313841734181990559010582359290201354051461037292598408924440579962
- 9261209829819631751214535332103905565185435755015506330230393983217424163887658141828375495738248135
- 7953537641564860019910209763533920754849348388692816112409042860516889724156259375795831898950072924
- 5960467988554419093112332985271844623356777359933348040747037205328034706976370027157282023073057696
- 1414871966420425572750491950366323004651395418140725108930709443978312110733276687592803776507172513
- 6087557193764856367448558888257887661339184493021191882292709019500146842343636992753199546115671386
- 8570450744143216339040780299923490581446565204496233515435720105541820604402629891318181183565214801
- 3865548465039391744227689983209599473453261485153380908818440673726935784293194085081800541112501203
- 4574453033313973804469488527709899805696000519141141422794776296903922415244615981368125575139849403
- 0158908912839039690682371596762282654375590561603002045727456152794596519182500713348715654510175277
- 2344850870016671622088134714559577331251876805648529105407392802221120032862781056402439800380701905
- 6977396529787790988003162006689840372155196243342979928100956086160201491088191150979379290036944991
- 2062176537748237195532458063615013009808650442425293478356985149428846338401965086282619268181813314
- 5352271022161786885639796180425572709401969041952782218972371157604600163990908887257182510468842834
- 6189131812029696413348931760054804610495092798975176311147402264219675764519848872453240032533025182
- 4830774912325256688475616954239348897784619157579442277085582057854100616348798261398555091924933763
- 4419693864702415434328232827684568414269943837235402540939373073804634343828207196553140326715847016
- 9414833139149967410908125309984316312073108505016906329319101821105395585567039824196291695207657199
- 9272307176373081364238940148232626547055090384196166395745836874762673525255811990719183623735843687
- 1834305909221799544996922233003428708226933056544676836776755877960837571832810682555956854316804574
- 7689684479201244439748747005737572457408749217827564247332585933827183601185506372711682381424624589
- 0459076029692142808180577856018865526909992792215471270895924017947650784451441464551717272454847694
- 1607662478326065735413894461988583756749847678053698392957632660226472399204136521623736361466640323
- 1551854151548111858108443398551504367348070980163062524751019715046695459749141410113086616816368604
- 2103388074565199493245861160487111648627998380248125394189901363772731113383426677853259232453334485
- 3759664716208338537412263555308937443901951541575679942453238033408307216841994789968124268884616597
- 0608333973371771443649867987671879725126150631972885540631915126103864962031374005154413457210449044
- 6705194515692273936673249768573916031054311481689222515925766878095346204881819135120128416258147210
- 2780965979991944160344384182326231448081673218912379946597469447371994734475461447290698588542010162
- 5230641968059723722842337324511406540283755263039707842698045973210194934570025250559594698145422107
- 0283690676511133800827197043045192478092511785627291035262791697425806840262730758419021462844091789
- 8442561629867390910053700297885506985823190928855440993457717507878492547917137854322631465566615358
- 7021169160431720984265232313966065488930853830196834019241368671420697276336719758147787236143301726
- 1255520558300247566655717115576955972073111366164764921241000743253672111718190269864734965813010136
- 7113732229307682146982330958626017552721672584247759443215834483251667717953813744964440656738138326
- 6457517449057480046505684021118589827064600254984222932072749822069747698062260826601109618485569352
- 1180662292994038015726101038428296088987460656304679850229299020929193246177160616038480142250886912
- 3734248586441731267184746634512149080855321275811894748251785940175844722914259381996647903390875103
- 6666615416468654700720220225459753480984235013648485749478855474592133750963767821654279141354746700
- 6281276744222299118827998135726907378546909110155681042971730577884247638537402679741523709462463943
- 4605121639245148210507976032685986609400873234156423535667666375312276348010107704548905103240579565
- 9667413083115792797480966954347260724741069201533920909334582777447339616500935752471124170750635032
- 0886771741219349514666763871263737284611604087706301583760011153364921219020331806850032466637922173
- 7979268046636376195583620471957455881725511200080419911461363395552011300394239159753566741136702232
- 5519019341764557314694822022252295483332977455605137307742517709774446598076075945466065931031273487
- 1555326438908338370277382207431456894458643717541210660493377454249047001490395946574594377123789728
- 0058429396210552675039566321492376729814066350061202360793595072500261188229881702440932306066540097
- 2298243353765243779941591851493390417225014699742533537805043621410935772354900881869073902695140166
- 9721483626167233238511176389727375572281168991998039957293746032217281928453409332584411696304062383
- 0035426887429021182429856451245795207347984627346195104552425613736299433014983937291110870529969519
- 1835336505348442428480463104765220834208593651730965844961302858336548195435981867562202941613843211
- 6325768598256296720182890678112418686878459731338714041872970071191986770129310629309694989935481392
- 1875928804839845138740758643027656157147335183544073506255312343664960053109148813032384462652043513
- 6290262659333068120511588851043585699456499388695707061119235727571102941969289941876554368842569280
- 6386143513031063844433431339619697973356152324266641706639024036236559357494425103835682493854306636
- 9565628381349757831909024277049909445141111241230206043422328892597491438231575907984423517784541128
- 7242594935333309857109787553868398175482521217518103082181765051555634524299484539045775626744657855
- 1759148916225117807053288117045974059759864583008005610322332538430075098113431012045083319042286546
- 8587799440122965616563890815959223940343922260010197221765736217116359902575752900033866022749259421
- 9355961294755185136993932496927866350652388267689411676389089823146190959683386123118586714957572705
- 7568639974542711303659181838471780818084175201006556621304763267524946682059974639368806499907641342
- 5808930820409023632383517830632217617206433632011040344099409158405146878326260477568040712615484260
- 3468338802680940447930891937342390363864402549244811573907631680266467996790175567187064136332402887
- 0508745716587139591642925361440259784029087134377444175895665581130737629688934752717371131377900031
- 0082729387122487986914124280084502725122546352721992018762423508027844796784337023680736143992859048
- 1111125419311013509593127276611248889546891945355636218793299748845867834814486269804703990091628952
- 8836891137461673156170241004515775700160377837033957253926135405325011465741922480121824316985303536
- 3945988575041132622240054109705194916292574379281916876204926756847774860345138396946799094353055861
- 5004279444831120630905934432470009375367100560449265560347274778079078363950451876244839269798731353
- 5284348463888133230439792774802201529619235548600047342730950786780625307673643332282419613242705655
- 7794522660656950161892625626948238005695033649150471162428579689682908969058363758278283892895520363
- 2239309604204622878106376581117827427625323405055645853432873936828810555823020155443402566605611991
- 6083312452763767493832195233495631786258422134166574826288774471793387032908362503995945159111325505
- 0506004055193310678540221401392893077471031783341055948291837130769245697952206414022795846705868857
- 7578468725289470075085185004530687570783974666384507360195357370737853567003625855820667372433386238
- 3506635732352725502987473715710495782761939356350167592836742308538385735127612882617320094878087312
- 9781099401372087532187962176750723431042040983005430754543089347560999967053006260089395875398030047
- 8168171271950939341910683317924294515954385112109091722673218321181622795705954478225361268295095486
- 2217231236316650725721863453174107239765038264726120658627233900281950908857409600576878745913537314
- 6151589768102894467346086010997367803156129155718923796941378351231627407516945694908680544178759792
- 0036554692634446181773732271670034442667760460949248120587970646584973528807924153156393243441257891
- 7793572590178637582569380634250443054588279581374107560228758444781096542765176706222370697241979180
- 2152291454833956256228460783866292668106052637667735843824873378258642885012123329247207096075960682
- 7560580289356980680090424779414480522461408019298274453591426130067315399742203980804453750119539726
- 1944848449519911402819066003262802697095448716577923187991552650311232355363968668453024301596197349
- 2262352274323053604223375606417777316238560718050405591823508941421612604389373200349753263396931768
- 3963974083408761489660534676500201801809501790152475738159051446684042332046251958596479602895315590
- 7754720418751680422104882739795248273749674258822122908418426732735405062974739562518609784580701322
- 7661151733251592801250066103078456552279339066119554676984670693114454341653858729999117725534075836
- 2673072059819231864158196833440775617358760115854106288590251485970663025662727818819343204435440594
- 2641747287444638497088753892436548269542567705195500503048573967192593691831322499523829039519078750
- 0747741928834128339315143605456554992740034000514752860117649136881975405835181301064281918542772397
- 9888911556544206132952148340397465595374693176797126059326227357889369439528140371554981256229183602
- 8970988448351999590927247614292738476113427394270764659658609967512305032437609252837453544759855871
- 9279745135456040928446312383889192976387224509486946643316458586117087884072595663446488772838981448
- 0697593346348920920847479336641147691694830437595998302984485104669711676118031575670430748683191350
- 1510866268148110806626764448818763734119104630148643395133316943864867191253051197712222605129272066
- 2888283651460221944708196954631978248180623064295919343803191070756728911303416669390683766514373340
- 0982917691778335023511377237807008013449375124805050073219738123851625063208104966695365173928688581
- 3977490771907824529794195616886972231675210450667137919208653893674998631486641017004445762995894532
- 1955986639580917941851056008686137283520554464203327542845960428433290425439861323590988961610491104
- 0370538129550774681638755768131629919025081570271907649077578436021697722790417283215248311154673779
- 8675348633009709840718852917729363837896867045449380220171574243059909227766330242974417045007458994
- 4751500765742782902593896377634935315947832002254243267251842300506882020825497212921405633725581581
- 1271047415701853893178293987877127982748865671504632246643855553484887868766413556127610485824205891
- 8651972343533639572360994808168173974031190309304510004396180691234477085551492472966785089521986109
- 0165524898357700496192037386165583736313265234598245319951059160583790003979969517770697952469522983
- 6760743149900854856414332722003498903384042853124211234021004981624291858924222434957536080826030676
- 2401546957880647296192668452751116009590537854831636712454848677882017252054639855865003582350020215
- 0851642366350078776071519856145256264951591055507477278537981540632716819511175410228892983782225453
- 3675665190251216823016918198394259899975941176958752150927946376619633608719250944468590221362185710
- 4072204996638635871299053055527028410467726202127446674545215457723708236444533570645225149756787051
- 7194800500802567824607818185487583892258881641762049036112904312816748320766934852285776067934846458
- 6576690952066100878790643016816753391621152056810844678941591233741463682113883375773261402746246664
- 5150989210440638180830560804013701008907417193766295844421691227908932831982677233321279200768091661
- 0268387238432454420686797560394826736582067345155042676308818158558039319161732754429557643651620151
- 6644668557593725940971151878369217329993841578827660226709252914746182341866367219311226984236086854
- 5204188312801997803348787565882710587023709613027479913234822581376961217046227422496101673375478801
- 0634085514866228699569152716263350178980339827364487742823153814829001343256788832287607165110115958
- 7187145010578347629752887433927458182768600045277571772478802098965643852942388173879991874712975874
- 1165413323915565108908775257686286616807192109034326503014635427492044749312465201473231975770361204
- 5011747939862821525354972026717908950519508590979562153891218056487899678573068849963903277813229401
- 5207305052020960765468832525175264101355065145029802134353365875559161683674942894412148048659982256
- 1119879720866930212849950166479523817064956427351552584684628920014188138574351067080680393400649398
- 0278204084501559743111297779680235822043997189182740819520245230161759947970828058600328892886741062
- 4713286909469466843904201205774106699462157238511091569237592785586844939773606880019229349147175801
- 6316525474727285404111782500315404941649532114745075496654802310185518447420493368214986786738789249
- 5751470690246623904739663020066157810935792046362771350394697843435917414264377803119021954752269208
- 9547968878254856457071355666985023275461239882302786890131757321917167849301636501389552913159011742
- 2489607374946020294851279855924507737935690813338697470374157396558258857374134903582781434074625542
- 3551643968904607795838664996649445074756579699351493513597320013303372081166289167650986948072944032
- 9917612907230111404658911382427272632968517609428418793980260523956540664593300789657415766970867192
- 0929452539315527437352828004823457509144853354240491820583021173669376049738422721591348355204042576
- 1699280642854714019368556141102765828085704034232587586569465009202308498308267843272774869277955040
- 6611100435976476867865384955027225588542249861365736317396148099893608474097176495471543340623707326
- 5869752764592133742971412420705112256449499079144192444832839379138042063623800297002820623931807561
- 9226485397394933083251970873138458119857017100249136525227198684083184047846936429025111292751766993
- 9886203438789175172675722174421453857611002834874321905243332939928094883906152940641101879375394113
- 4303171916852635531673529853639867761635066119682247234864034096810385850460672960147613107402400742
- 6534024368037921068446153419708080881220768071106438905886342157852825822877436754701408310031138429
- 8534935282493585040362345923926688311448077546710591069406547237346587789419248732364370240202401751
- 7597046829540255079677309844431798635413464595390227657432035188431115597546352330452355055292850636
- 3115240811767846454714132798134065927467320835452822766343059530547343093817503778723176464890964910
- 4425587969404117052776629702325695246367177584587882202846053053054661817220965509818396754440119356
- 7027827210833556064466575228098058628703330757873821082112921021038961652312284879203280376653872019
- 5820518561825014424096283660984633225284110157417361488234146028737749849149845904629889032849256083
- 9573991405910241206845576248034590472359536883927461900635300602528684434546600578574568725002887974
- 0781269950143596964947641493185049625552169444528557452948072324330277365557456104296608835697425307
- 3611130310823800031585387362868849210917491803390548285054627864100013169471998948894209530864465026
- 7961007150484392620633117118608612081871573273455137001418676869219670488590103624233151677601727174
- 2233050495306158524791962889675944421346235651931221942844071430978955055985886244201736282607350511
- 6384635711187846834715883490623342588343614274793829548341263417416882602888735547816653238321540768
- 3590968120548845481718926920620367096536056408987592845081574274786219413671699432294586933049535372
- 2967997800487191020347824739491797171976726253884952817305136008922705243085564874504121603355151493
- 1039641863808926595190343501979503662299371070610980328347286934541513596718150629766374430994932369
- 5704953495914193527271514187376586945122363671079380115242166244941198004465572125975358046399910239
- 3279770838718475347998543603066177468548167430253509114142253635633838835435446860011086384802147927
- 6315847935107106227221232890003040085551034607680665195521686567189181334850680693770039068701376254
- 0552466849767101445993496184224689804170186023510196499013377865083234368694437821639202188508599658
- 1311126588948291773489736110174739245996397882377084643593256464055446635456450627816507891000060357
- 8958471411788114001470455657924684793389859044356095193955983048411907085968390826969646301033129195
- 4054835663347075482559716224095724560789952275137431729204329442145717570211196649273295045892435115
- 4224989284182930968016279099901439100065160664654765723303846462439511383067770124161991030939928940
- 3981160616742076033829175930656604400871622422948641209276800548402635460460212864312968617604867685
- 4587332459049044581544689760012917675937178287781574634474974431747224571417824959332658959901232631
- 6543180978557825775355049571779819902461257772849446353525217033433931343645138304258981514773623679
- 1994181688328599187157217228765199470314248248787596411631008191276660288566473109611646667671189367
- 6347212909630086923962342070886293386312556128734065346790974199382881663850602787328004850544918201
- 9933787113082949339025444084544528311079067175578158009386753600386035576806398106423575109973318402
- 8068507709966620139938302157057490439491154383090561583001130141099139583290325869583767619707448919
- 1132631216409818434725600876621115969513338904625890504021039716887529763411565301637614017241741275
- 4156775733851563340968924430140617974975371744256647349345457924696799301102619433763644866753756108
- 7691613043613748330479441225952612415148981699807681018481895780038325763387804353118569719951740840
- 4042921573207178938770895931557022742728265816149740801332063433840086890238893918333142004515961400
- 8986112156292436416947254313561701811792005595928543918333436945191945143171541350074200639050607167
- 6581905824216202897696844090552454470012818868581435495454205566898387862448320752121741094873647410
- 9157860409910258555863940130915517560027976586538407568236397358347233648255335205247722960881930540
- 8210532813113048809262550440623955759039194431714152652754080895298657263071634073224395037998714881
- 5126244606312813852410741435979408576657852516943899274655621805886920662325044937029212885127459270
- 2137674834292777741271892215540626833008286009017921875382948629150162454072477788669988900709805056
- 9250698581837390135076394365418723293031183658168633364477932900707857451061139914809110997127929438
- 4939136701584241896910938623802725764521667814022361322904680977248778268641881228779934329767071638
- 7056951199018963230924589999021797571313451742593603251369020883958608546750477732292906284648172031
- 9507281491180095950512581344757157055467848443623776914819179984052906677154792911742669334885856708
- 8139473448486214381111595475449852804057422506951464720084246244722993215792264672178814520648208302
- 7693611921738523678567409627910852342295609063266671048028819226371390907376844480931844498969929310
- 6036870095308727241026213678870697269856973400228036350475523688004955869735903902069193128307071061
- 7913556767421587725759822191294318645745477205132894587827375775210307119425545175288583633445935800
- 5524008931209918825706554866392314480862374414595305590030658095292440426176752542067710335536849552
- 4654643577010178979641631303867495239610828903257724489918622996519842327827499595893408310312932676
- 6102724108073795462818807634269861761703310093468008306518347713287054254996232603250116192827302129
- 9349341397996342615126485063473483275913631786824728944493214660618479650573040671874828415191474168
- 4169089722956160670072819776610831141061869274357335535646272541437940981346383228624336413347897889
- 0912641531873040605317247738103537082669410654440622661293766233632590613838197631940130398985582094
- 8209539186024819909896648627135664987570149795340067644785868204910762709697757054915087961976919441
- 3901594125683267942639579018278254556896996803223178158977822565761387167701321480211552727673111734
- 1653118922038451473699023164776475938806016075537483382328545825950629102393600165447353942982876682
- 0737121927529990736974408113423720201314234045052593169727755905856570031320224654790866575834512665
- 4568263055461931475471873912792397211846921778376200632624668145632249687765602801045500696828152865
- 7542598234834009264710128328430643025697652644694135027062145831911049179319414349301770348702633346
- 0168710291836083741253275877631540223039562887768447232803021429872949464749395031464918041335142023
- 9388152487593737159283832660035406428953541698506199223530382921861048691825526902557498893197784720
- 6199198050179722622476371814459796413713846207982090839588211870480155631852081343051685237415842174
- 7814580115630583117678770897709425691536078780911362843548240228283945658041952201303119772279659598
- 3884093635835590118574270448266505634384216253604983408543890402854304926899306613530295624400202826
- 7343672871926207940297350617969254101291753762660825396822180621641812462173118967334743094220887670
- 6063054671699631418215590292435137843643506322620931206801431691638497810122710715021679247205626346
- 8706739088756753944244827083825087882653565581974416635778492417631881483621644122223236354993894299
- 0784092165099611235325120110314233835506549388909275961105369398083023861037130475667626055583092784
- 9435785197856390534743267450560490940770859188651065545300819826445252817408774654789916151163487539
- 3067419302334275836504964156863538834492970269883021283850750117307225319474121886030606608665654771
- 4244902618109150955830742760829485811035201107033030587092579512353389221572474247856716767883589737
- 6761772117513058693433553676490367437388170444054369873859392664944715350381525963250553002049067646
- 2445852260521393121962997057825503270457798044858956070209902153446695370684284521782144523866710469
- 4081075061673174785697189794278788716052834504290221224398343390694767646413145818070481842165818603
- 6693764098943364938142679991971798152335108415706476165027604538632999522443033893844869869487964925
- 4150996947664654689769216486142392356827531850965408813353323603150184543091811589795300960882380182
- 2954836466507308346158753739094675311255426108040965927527145627225527350121765782432201282217368454
- 0188340911256369605867417354418830302910422954093121391632516652716281214020039348524629267702533556
- 7801321211000746875104927292150677332824634054330514641101694580152392810648716511937484962847145205
- 9228602216430922707329113148505514626087654910369689708578112513994774893832884265980561212183161153
- 0304191551869772206964070517065583074542955680205586064791985611372083202139733715897180100934195299
- 2408631804186229969441590014844534898620679645053077361183991361144007305930420574967863953731729127
- 7835848215629148003084298917636403425821977585909988615422915064881854893919464924424427073460653662
- 8241104380687463464244524892172700800269889684009770499068790618994349059987912329939316865429778734
- 0536374108604116821223280321443018450796681914202371152463948220177093142729884554336272986473983606
- 7619735520646544148606206582731163150571772420887655624872226829266602037148511214624414964999515202
- 9735696346895793491184861387323567372723628672295693070222728261893624209144683434264680026607719950
- 2216509365191242991298909496734886916099755708415385632669799928723106696812003873504357001390292512
- 4556125259003322197307426285577090519268291420781601592068468518949602680324164502321797845493500368
- 6853112007439987867535318804473478513954317739606005536111440635364216181260212638657309469059325590
- 6397219492038056287678828743091909615406869152123189362789249870124538829074308381607486273896787745
- 3782363709467889116034175404550891697540592273940492666239120406468558191112089876130221444569725686
- 2545295013041121719980910669115415746874858495998661990839837817126331068153364133204083616858950592
- 5150168276847524016347344155357829189499213859109112248318187172194868838657130404829477742444060109
- 9690156383523782761290959674815107225829181329982874270549873596774842208562067520671599421809118851
- 0214643881536079623454150921340343006129978686825796029384976591871270680515270714186196057390318885
- 1282433872683766410207671757126610927458223352290512994852828161359254699066916018502759401681624498
- 2303860880138242498830699639176230939613485459945178006710782255193242050873901267954978440156989887
- 5079123165277472128947915317312845796906128837001975189510916690850679856760516587307479984144568492
- 4921279790288124241008840884778373159193613204548263035674749277565413855998730321590540762951436378
- 8522298669818514967083486052744652644981763753211029230625903686358567994891492488089604126511073389
- 0966344359338441249583269826824276010209896594546047736523987118017518651367339339449442676775423211
- 9108230942372896868022034743959324862376943741086660282017476556319495108722588920221524980324583927
- 1724279586677378380658016613729297771184466502501152581240730709630180406940749655684993087263042183
- 0015704120137922456787319402582131094546109369974922261858374651973232203681278216797854825403853579
- 9586852096711956323580355674470587232686279282060364871793666055944117539018089837790280843442247968
- 7088565952716127883634043276080005804509481613762417573420339477986303223673828425719406058354743783
- 8904464154065790999931856081243084635339679917228812637887991600338337885884554719823167938893362837
- 7732064114661702595420850885180512900843163071504331075395455419907964650902316442883447406871971893
- 5466735649456812354304961298884537609297708931994214630482207660235398243215761625487612842541210616
- 1133133648822454132448975453566265349142408224913402066175007211269430612496634133218785546802945912
- 4917217464103818671362151457164950732198489695727687268836431105360442715715428913668157127442833213
- 3397633430005081273956718748263504621039314324319975491958090961365625700243201665807095188730589919
- 7870679368295244048534202386527588450776292787146342219301500563804572513175940122856113554368542010
- 8182371586901339410613178329297920410991327454105471307174533004723383956546187163445703401855604718
- 1381578089815947036849425786821926363634477428221860596424745794721701500258173333022732047386573215
- 3469489387723270055569460064750620414873316115686228526907416880934990174691276069271989385055648400
- 2433703265597529368602387426960159164509565088854902089848498876250095069667635938123169779034511780
- 5540667349228798064769733991389207356808640524705632218673824785071644611430980954948809247373180071
- 9660589269647674380197026822410328865611136584927486696312680737684133674344484354915694758172853359
- 4401006332275230578399387530325507216780079595410679816105128701235325189048159356172170323986252992
- 3914117857155601316674495414313623225134309093811713897244019512308210327892658362850240295904940492
- 9415327768642359797838724580593951390567955604890224296007343177928261847519339555645937150468756199
- 7579743169015357214406687580868655452485004827357130853173124413579232099358194008478035530266617899
- 9034001645004709491013833401772294629926564233454788104605647714030170786181447811161624796255323924
- 4068009690117909228513527314795503645016130130038280678845335633911351731410242678439770712448559939
- 2643077445632719090320883935185236603305236997613131733483452682577284960574391671553951585295633300
- 8194184226563499761732066839099307221655802854054586971189012219660240669460829422781432154324365761
- 0175020591296018436712618332914534588474962392709765816939404028638746776848598592213820703486498305
- 2250484391685775345481955113749471895212461814152399021533658511335253541411165644033399101481716030
- 5596064373428680323910031407094111326232632399839699537619227136973500148398583884971448168151714974
- 5907959017744927744511130627284201316358437641792093329243167440055461231142916162639760706635603860
- 0656083714043830300413434746398954845945112697033377583290553364122253592752497345534833372325862570
- 9633843342035966408972856443178958761351810094275452037400888010727884818895951672312621189125001920
- 8737338613365013734348864042522520017704620726688200704465618473896823556471471078268263004521490432
- 4105536355452559184213541968651137397886663097500814256431984740377591458789590609845742607885786320
- 2314402576460524637248392024315470427111900318904204033381700098642286434180747777779834425559893089
- 2290697457018720204681829416752491348559960619800989484474891662876041980060259700127365693936297540
- 9320859454667562340804615013545821550863207226603893401376730576253406555169815277785599299882419464
- 2665167687761191736222702092278336052507704807075907180343633570756382836596813995390760727068181365
- 6575919866837510546115218083781191964755409670958249560178282456727368563121850209804703624641761986
- 8271774847822246349032781088546314151737181432979288325624993711562971573739011583631087044860251030
- 0496946914258386937065120377046630824216489443358000596868730214852492879538242286100073642036496791
- 4869424254773064472810425508729193419606670525645064096087900244040642473114135660990065146788809327
- 9138493846480654610178905627645635564452678797317660085645985904575945045293632732291403406240934385
- 1631402526002102085325002803141809837523389639583076237367334254811893427718926930339828412036495177
- 1760100346751920815833829363212820663131089145602014822523045528829442917400514389131182798098198484
- 3229029838696282514873944582039109406532801887540772094907478611791577001719038791280637623661744014
- 4045207022924523204540576280696579308502039812183784020672025012026675295531308349435347193634177273
- 4063602625796031365119785548566937284640420468489277157780434586776100852896073693144133464873773525
- 0159245211976597545908769502060561757819359107740362583576536008089376532813708436943902272298653222
- 1828843740013882581116297155345756740321498609755428688657987436900949705097986093770278357223388331
- 4539804939892101714335826189674003122527997303364571061607284968264026682347704558301545855748271713
- 7243584709948613726587130254940244957385588996605353709033892511454055581245692941378882716519900043
- 7610796725728059987482047989567855938858499483469651949308978149972776347330585707179027093568227576
- 3063930497022966339552876337991307858593142078113351114320121026019873042167062601435758411797707904
- 5808380884980881666261853588355924200630530246434628992308203070806494107304156759771007752398558686
- 7594573174476709455684268903853112849498801814477456650509614898991517629924164287800047413850804520
- 3295305391840976899463199695591278676949319592733662054309181205566924621527407866514323526592070708
- 6787955864168604527753575020748767143337706011912940315857431076777779521359026130808289832488394832
- 0949988456830767241759299430340209439932270827548357388507419917136940049879858619423446279608414447
- 3566520379282953170163351181530293127230254356291055458639577778022116588666112693357407294436145574
- 9056372007128254481135578340290160485176052432969813550274714705263542935264813662388695848981951679
- 0476124747446800847725887139455273671088784750842568825983963683066764766451330823429953840637149396
- 5512602596412691663955329422216277976078749552917485688421824863746324747783244929832354402571567607
- 9286742595284943389896764343657548230757547840335036965376873654980223987801192035440491288268359419
- 5397184364725540905314210556663207320463884838276837926105500380573953794021513641366249674935373241
- 0440434862382336249204953544285790530654527726507220346592904432022017163242358313783512521095764152
- 7412446577626167543609470974335640076904143622180682993551510913855657373411948903218456220443877152
- 7004821101276120814078245264988636103832650848085252951495226355426460671844543042653382666861006655
- 7716951714429565559054236819339387175320386411552242884740879638726559965035453160178728429959062489
- 7569431465725329799565644275381025956667255876113030863545950868484208170230903776010731371062342933
- 7807454750823785605494798769021390566558589286009199045602603206378272907615539703831101800844901121
- 4811927779674839102728820575597820535088346150021903483765764631105684014250421063783316509790934725
- 9499426617045207232691017186806893159895008062399758694838970524161223017172894039046699849427213392
- 9568126161004650902845621267573941439279503195865023504811047168563578354042648572127540263881287194
- 6209203813254648116170313586767106436587660551655133113317022718232156877362195848216856465284606970
- 6619054395401406510630973336513811963331659490303921642708535422804979802671491189563642517489134412
- 1426361554780892145283670822169402598711263211438852993916963048048178929629882011238074901305294249
- 2948016114353302390080670657213781679719856861302903012993994451249846901001989193605982791697305147
- 5943464960288332896966081505634505660937812923613349058578055094564210353090736019584463712165073198
- 2015642422013268456687741832331024731921868515643412032717030573066078517538509706917170791725285511
- 7436278713016009522089202424050305756402153727369592667997478107072793723912355777093468284756010763
- 0127913119953917628186159430382077839824326173196631333620637934967687508952402364246923190454167386
- 2358360482837439278866547759485902892040201939593770656732119490991043352855179871403502030760557820
- 1914838828809464964820842417669924567583122624780703905576531412632602429224362037195329185547180915
- 9644318568520578823501030910761280604457044251479975896088802812599786238774354965990492967322084497
- 2443458243503689780365184909951214229401566917453416838309035284779643067608611599763678720495505795
- 6365166938345210212057124671890236358379083391190802068995968969901881223218552528693485736518886301
- 6045294102817973608068954952403606648894468348535737117060799430547192164875943131412697595251661025
- 2290957537550950933718544900072907676126346765291664645580371533060205534741620555668380872331011456
- 7060821971360199116696011772653512414405109362036010017584053344689875653490024475801849902851129056
- 0362815437279676288312381657743751766245640457837049648569090428184674143410766075498411465742153343
- 7962825237739351775877039942552131816901739901861642141354392779733470876597369481710103318186376892
- 7283763660230192059197929591791482244163940318041477900282857125177644841059315644675363309241579702
- 1262648130428083893377067239822865434173173648142456296618079313695325091128754694980155031799451669
- 1228413844646308741027987820955877346176667793320063616141299836112387852698449676224949460162224198
- 4818828441759725089650432388388267762115386944907223140800386409667479556596033658655008345015746681
- 0037154981215455917708285526905878274626801895484098548064776732259308336464326667895198132303438478
- 0554257118933244880337102766080664261976800040145768192614123421421090837882603488039871589674691868
- 1275950354190406896727813951321988421183256109487473527648664367133593683737190716713615344289207252
- 7305707780561606591615442358910784646554736956343970737221781859123010944369231395220301011367407345
- 7059526133029367437932120406159970890681203507862354127805416826582353742593856966435762710973540865
- 2303333957492497719953466625694281212119266748886652563151697066072400219396266842825154475614963579
- 3336584523772409968735795322759190097974155172133484533357868142287399385190209367827402155999142045
- 6446438381600099906505371881484938160865503572270641774386629751678966655499987889572179026230908454
- 4806465185693092556964531722410894516454267967618197288329584139351338445960416728545739914150804959
- 4466135343984501427618054220965984867109944082508151323925213606951062673373679223322142599523022293
- 6409047664596154505594842048813114413172046469267049759749059935116920439027605157446677396870803247
- 8040634377784167250219888494354098282116000727729150507598693656847220169410461894445826185511600415
- 4945106281588724851403451900555634666152447374960766113577874837400388629388488610195028128078179274
- 5034958405752928452983890915764913247310105633314781346402650462629156753779092137247828970031963259
- 6891251330215246561205435837622686092820307774168700459043526358174946367245517897849317506753904640
- 4160336384724054649807500393002457661071466060571949510914024823273526691221496016070897220722054628
- 8100387307622968906215262971114289273463392143785758381679957096512975121288247076229375657213489062
- 3618601418995950002939343301174633003329729078340263825278379605300004735592754684871892997206561365
- 3375153747792196249551796922008557314794457428822592422876777321288598065370465402461993872964993594
- 3563230213110848242495018006757189398611897262182430778317833445857036118160941397634465162725658288
- 6168782130134255890738184057342227527909440150796335069630683158584259597583441339316667997304805147
- 1042051621356217540904877733022739698065649590094569569853658432083562061593452925424189291617305222
- 0979352465712270664005413539212620953741607025988131267956667461709323717405236296319608936529844425
- 0743022804976641640382829257137163603061762596724995717615369585248664493172010960853457234236254503
- 8544414412716384767262833330818958559364760061635249859063288744503255113776818130533466466995015477
- 4932420985686593504901062114129914177309980459978865399855599720886527297388216508774800198668603163
- 0561230114449331935784076334183313859772732345270212652657729626488462044050323775092702644091599212
- 6524862677165996591324571541392540015381169966140144979220598528654631198814587419187337551855095811
- 8710196924176642924238937549451631594772453110198414508008761556264407882172093511259342618446830352
- 1073794000418382893605854407065172644916885787285452650728104911722412941522346848448989734965331556
- 9393268554021166559449075153103970832462344595701968564326756803854451935868733514968195976960082012
- 5379900840010546335233641891279605446876357037106514135683715512448361849192509499414144624632178459
- 6766719116487767444895994644315839584871818846627420278441899928803275124496669648679345894132986023
- 3034829288762606371364458073713401017269924003140999628987593282399732487871382265254741903488221774
- 9819545570796378004278014587919441189077071435801103026624542936251505434616515198607934238562390664
- 5515459086899700987275783385647691033468638899428963619169533138310635144431946929978952150427343027
- 4505489128224046567516837384091737414843731819711882264119670295140010484497368688360489262885407453
- 7124601578468879477813170839202770185008395994013507875106453561461548450353467874901534027514090183
- 4645675419760454833086921693902489806750922992294071550692377787826669912301589909380813372850555299
- 0599347167842350786739058036553895201811147715527516138372665668705503251456831582959065357006080657
- 2699022721433791492375242219582555155273904766415152423084130932793556194050053244414539506109491632
- 7038715303701528100887540809332947909865917839654089741191987143734113651271643824052441584288769757
- 1497711414714279508295887029927924683321337051526756439423113502628776890344646636321844459217157587
- 9241131996329875413120183252226786967899641329341131763665388968320511916362239963736400650624218691
- 9822306441981351532197319859101563625698621817485470888837822021617101491243249216532386557690852747
- 2547859682981249480686066444493519183037483665508175542257335268514038987865030070402899334381972301
- 9614734086482834761260730198222686144117989843675583891590084699913140541383193918165643088434978829
- 9151717429748649096383896734306517121736027545375783431135217215018269592914932278747374257245721360
- 2566263841389526262793021300099661963003232522013138218844822215385253127676763048551870068314684039
- 9268185487653840563848319210024722319166100913439507678555138370482142849151016989753390789756323399
- 2177890388047633681374846516892263571623071840641566324924108669239676012160108144560923213374291457
- 8448806124786377388264102086180249513057338836941585087823197098151586711709517388028679580151067880
- 4493390248068909905291953284466968288254552920787080905016614853675330813369070048013388285854616540
- 6413320250693835596317424365884064726157576009934784114084062998236648235748554353359050536126274282
- 0018784805295304476986322636627829632741637011531118234081786739876610728127325778513921138076815418
- 9444041763294630490061864780759891264283257299873528716127741833680517563794195244023212888549117741
- 5065311168183622698953190049592292508376260805003317433385637848674958223105863188940739807614496920
- 1791751393353298858853433644997913001657128680999951557636883579690344998472342604194318599122046582
- 7495644137636777021611431270014347716120164648321329271182571328791058413578619311893745953236310239
- 1270889013912909166527192377458686417036480120329532875161201291706095927090777356167401939117441244
- 7124601417849679728249366145899072550082434997089096809636416891569620898451925626719343047171456304
- 4323998155688693543372623026149800352837166513591216931783823097964852220628541884734869393594384325
- 2998753765119249233509919666893106839343099291774291126087972830433166387584023702201121723945611447
- 3365412763340270584541778577485248631649999170485476948432053120929273998661075263131976433765380295
- 2214163742360237221850677911388725805767775543742535744238997963358197140322779356139744707119461141
- 6517615151238823627905648863589472686057334479728309257094391377951656305853890416816898769258083650
- 6882500936119261078911242709881222693468531985170663717420468096376655728936417132493864433405288735
- 2790255086899509376151204649845093084820946460641779407759272735187506149345281817675171084502365204
- 4236776815132674319325109519200587674918493027769559654098122539635771169467112606023606943945721364
- 8076464990166378437484109735730098749733872155726959760331137128831583803062490323833048619521149826
- 2358667333635943608153309620435231806990586725316679671989775739671985056332039162769296127845043250
- 9302784936557570466366500504235380700021043379054365452676915632116230708153866793287528039918102228
- 7966754927414138146006565485087779489944785505088949148052882658768844456627293908196144006839830805
- 2403725695064114389933181166377016307519304450021566160912397787650073874339861213776763163799499160
- 3580029425394150936118287792564890199706361151183343773228780513781700685461893977078002754504705746
- 5744096115186501688721678158080161854864108089863222334099124749225808111853269987957362030363601202
- 4863397052946712401923986888626998354310920045622791699844169883212018095594550534885326175425495363
- 8515063118962530921766529165824315900458349693970687658654243281945647647853735525153068989109796668
- 8781002569839068711319214254198866419286668754537724431761446354156657628714055353642878518017662196
- 4712668996243194827310093974171042590552437496873330365968721460188999669280258230500025049474319578
- 8736177439811819412948004602950542736866923100793833552779750038359156208164728629951618141511824304
- 8649558704764203871577064527587236770808180590408423523775775754008846877561116658139251193567319094
- 0209614289011096489957150397207159050424785782964191398186464569806900388364679836798101237694632288
- 8360915854430104942614876035037990344177685999567599330502253234765254688995525806289317811721823163
- 7950877845934372878641514463873034437300982480492495540033223434378058884644265651671117254089024251
- 6568074345760295714812822409478460558543210753456382184804837562589157517060137146819642168971776054
- 9530199246953023901996148262601706284818796357991239697001594441468677531856458312725471743944500821
- 6298283049375695975213397439120310652126169622928117872149914975372547212930687038508756506150275226
- 4203373041216162349639788099435270804166933227218359322427911165736309254664967124992961439907500009
- 7635710205091352172102674878381800459683310699995590778255464891283674339451582478152805746103415113
- 4356381056637703548798094032652665484582486845829067556435863245918075346077580169583997580648813770
- 4343413010596884392991793174174742867125143313255177595667391206113546736483115197935420861547222832
- 7585604017733891732111418623652027644917630825994309391671301603555506639664006376991774482383984045
- 2727764172011229122906118559512750665064983546029610296574754375906955550751018593507588378946923408
- 0884424210404435178451018449469776602243257275763372138266732831848510419137225727990030230195198814
- 5702121716572276518919027375580323980856028541791086963303805028305825415520792215467550998816607126
- 3796669062669622288041052194375553599347863223933308807429440316363392974318457429479645304848126672
- 4296055477893724165925475425727294818303585240798970601383390192188164731155785052643281067107830425
- 3827862550735751441780943794515208769644180392945053371069580028806009592615542404295384939223669282
- 5186545787154155054376817216194941624398023669701764585168224184823494985612261220525940694686843355
- 8288000423604267164920519830030400639082160494841822317937800187897147326541391659694146628544607201
- 1663385275508319000328193491650079157574254157264221073192131424033453260766000540883242243039536428
- 5170101907195968996222168572420582700804488458661600852468547117664403374541716972573166435712993493
- 8871819929175946631813286486618479719449399756737688968894218741250518128652265436890284789523945318
- 9075978183784293738692711233245224027048550113680713014991275390637656776195040824729457795161472517
- 8334058293631438937472774496789651364811407002313274619898292467466885589843355545576042775737627609
- 1205804848027199984955395267234262697175122246216969012780081098444425535915175083609503915428095603
- 2294024501253444800135907132943742644076571567194141395791922713654100901617029910319986570525840925
- 7998434141590790940476127073830478178955109473090662575049936351422786265074676659604091872737225477
- 9472975212156735685726097885664645754101381930184782123365156997722636151699971162308147353868744559
- 5345401386655999956253624683462963168340979755045640501027726108378785182034937053327921389434083704
- 1728605351627431809719641851581334638617864058085289932616267479202822900779806148737877411733583027
- 6131207960256078488189046862289627843902049983703685368810277112776491648078939944439040925075904833
- 2890872832414244933523646308167981840710198476936630553895402873674490337398474907585950356060720035
- 8784504301688110214426498847297177449594105845200382301253166078708859906630371280412152890785515342
- 2131215471139478438631378025693727576221585767928915212630006697169938472634430828463068278319532124
- 7975797640301436814373461526469198950210342181762593659784532667602506674488467124609668661730097066
- 2524501769227885205690673590084316041245928474805668946978182767794755884701037881345716318817494428
- 9989298716727868572546655367737283112444617673040875235065054391728319619830505638090014071189077122
- 1329209083766220493049679457866788418100358637383427091353528093942551819807934978546448024964273686
- 6843355216708089658368204954333674108689934436229704144434396109886127019621236168294238935804471970
- 2097389199208230232314642350567106499113603577319563884719181976988071005806703870572501530190615358
- 5559014641266966919236290595038548687337612191372174427144615555267452282574000580347074835030814855
- 1071539938916838373110927502058170195123131177677851844877768726804213939286034213238995818513277666
- 9365598180645571558540380121592971267768643842853718880917909957308068010225411651642985479859780120
- 0530325322575249974103543108838019843220023575674082733060839664255593659517583051615349713443826367
- 9902877179428908266042597494911477071422970252511258606039005296024025458262483257557575612161312795
- 8128121568538408559162780570929372466124367205888681576790769303505178957563934003111259297972535777
- 5442005699664022021383473566037691695441318906191606144682518131601766098616772320663497456046509728
- 8265951275397273336869417550848721788938864061839846003716868968509185229834465775516415629814905434
- 6762684211445248399413123038525805184868019570889226188325223553643687364583479146903567872259825575
- 9755960216814522299491973792689788065727749960206183123619125984229997445917931919070044699554058436
- 0693267316708926126170133984267188893421249875569902430595059536766540275330755030949068933593376555
- 7321753833566489041072878037317426730961814074515620721259831472457483012110660947978796294904381332
- 4270611655269733179812220467342712122664138192914732789436609182787888276414614697642220502911444841
- 8441381849237635277149146906974336080814504292765761587542170524939409283863732947357784234240779548
- 8209531262353402755035057102890394313368148199515356610924477427046999116723789895516390463749839660
- 3242741993113944290390576059074155553325065548215179292254764254508718962213113516699330454312000074
- 7182980065063873898926256489054397396866794321270549392327444279957173363591063334844185146953429812
- 8089686874083237540802626059432986205629181754412222900184021005925843557050011626334138911164722410
- 3293543067992468631553900279513923299722276621299513099409795053020739055958119151243330404078852497
- 1092537241747430138830317970184410857045135768151291536244294925037526161101183732100465189614678269
- 7244426178043464984407081819464885701556647291249400183231574748921227215054856761733105517328675555
- 5513727525722807015844443069091168420794485271927516752388469452014058436541244190068829957459005435
- 7430805615594652422881931272032923409249033976547146518111314592519057258049351511243668916540226006
- 2755458017611743528143148949991614671893523814433684640427672953871675260813395098759620778572778924
- 9855982834823289177208117777338346633424188492279198052968309263756731847097048722337076247583698147
- 1774211480432136309414872547814926308746678478952455561005349890788889845921184102235978273731652128
- 0197485413419869770543953887497390145741221190480539008552547517769182706070979677126597248844196823
- 3810582599435298238267236317342426715578296460105068310046137927489065603076363259810279366112357062
- 2546093038459223095699447464899594352803595728122073590021484674876096284970187989807161708718601131
- 7039698435437109684351766492479554420274224706377160003575229427613743288102773742437633846548182324
- 2545858652299370190888474776740026800100967319726684955864544676707987877175135398088398320732770178
- 0462499327861888076713309254338928428954733998046782679145981967469019830683989226343929035718573309
- 5966285388450311226586325701495178443681391853583920429643375838949238481221756550210355406710582772
- 6887575137843597979044491452691790592703508814671877816814014900991554621690142569780350359587247391
- 4976161903348045649916980438948284871605733097080720504665480348755712333122224862473301639986713795
- 1278867986438102554256042535792751624131624549552973102364591993011349614295221853169829571040685148
- 0382213988837696390758142551957119935917111875508775962547737751359233870322994013917636580370678440
- 0859562468763995140147145722468543401280785856430439394706997121975940645921442901071293191405742653
- 3471341641286645107585645881239511401177955080732163678101603734337601573155634925565939373671656193
- 5500458810732233559302448256969965558388305341318667616899808566682827713235687068122625484629821031
- 3176077180123905872553472420474152001617666021805882461949664874606456387899631507124429153884042324
- 5075603214047762425803652609205191482910102715774592414262871044559729269995650112860668854627487571
- 8766506696977960282304138110846930878716848357909254627803494426425458612045997199608003166303479589
- 9289456325531254253443173998536945980583602867451850810533130476475285376287457097777675413077142430
- 0232534740409303069421829116816439039165574700321658811000624207185247579746980527651709727451530250
- 9461865993728504011681495778142596361240147809683786888511251471276223179153314870448712057937765503
- 0401664297015076738855047738328881787312124600745276123541766657688170101149428992573491012356466763
- 9625806511271339649842282450273056693708923735816460953561164343750565029963151679745340938235328999
- 7025627180216562436255117986972162498323095658719682960254668065000046716222402396653824185505730658
- 1446063590559554964198201139696528443930157393105206283089149218063428715535370059003504708646096354
- 1097884106096566034365354449061700707899583180561453390650477052743156641760972151791948928336481286
- 6046083530718819480534421773042360408411915761644613091367593152863992339638705407205479884795798861
- 6996218064420153535317900447652558227276706459363505728780427573485589876829668923357242880868062463
- 2489791895841694457900295928632288829382800916032460635320238223124737736787406179409010413815330576
- 1028300884886494159225575438094606302586267698917318461563936799577053825149341530483493122434806333
- 3168840269976702447327490618973633454332782808207744026670977817820783120857263445609470855485214265
- 8489101849573503186642174822985673406328525642088746642534053395045023102754493429019160008441503984
- 9520215325600163927669366477809584126560429064525680617095585204187128148134743445153937464754963442
- 2053892610995494428914636753895787605584248419025831181728850215885837880689893059452153928137465408
- 8777536100423510149310846076543290946086796910018840384162250090888837411244830646123775233176545420
- 1486843335315258075266734685821776462554798771580037807371524124840869256907049289006667811402797916
- 3653743339514516141110722645617628225991247884909928487298887052980830652459935517374082411336775797
- 2723356826803378116357549983476669908238378145543916215512856385576818804480343213210293942162408135
- 4802623088222419123119256612052550161349899775372113033318398096362166247186330045413600338330530579
- 3860790211293203288717499514527204506239580054268931734818354080848734709388738861901021362175650259
- 5911351442127021011648093093037494167291593624568786003466022400339535225142449151606042997647942423
- 4983779611349866591027178292993124652842563039824406078979869734206039517007531875786306161264714500
- 1003208115941696043578824718476564441351338509186208978574621805394727057491475888584634266518241468
- 3879858080482488208055020192887763490205355158562400189346433242686366341174030312234237172519433745
- 1401469092871472905890150615238956228461520314617026175667585862095154776828356254506431626437458076
- 0714178578002758760804833259675887885318095959658148160080652129817919584398592529518445846927246647
- 7076091516851746385647187622149193215623010127131052844507481070026502446417858724356779922130399652
- 1838279141848265281625104614721163047907822420234842176235064391415298230055436257014763699588784501
- 4405130574818011867308723759652465204643509343130396665585629392515681038169466662031363943991734489
- 6713982981562741198826272351095251221821704750686253399267537797846680999542042149911343540701022056
- 9268199940425166589339284985656673473325794934373118520489614803989074911035031394683340777866936873
- 5475491107761126947029878211256476568149156669190955293673205595772792951298209071515773009178847796
- 3374300214580360314477890620077155490476480542427051316776689353266943735909722400831594023758388314
- 7635421404408604212995770165367296599020483630577798545770670281905871864830613825275278600758790702
- 4358743812118409743929083622398912538931673184265955965954849588145573527311910746917982834574376785
- 8841443980936994532326065725996975882421929358791454369349104390422637817675573224987314756957013416
- 0414988729796068385741483909738944823408130109565830165946280719178447982633284555363597451218726033
- 2535781792406870010686165062027823681063429287414508137306095489089247445066227733083852681090209081
- 3243131511849533596968989039103170864371432842682490648126662406926704213367160470574265531382424342
- 2085609793500650141268388679333024186546223074720253207178938050317199178734911226776218997084782360
- 8111600798019560682135626640924595140594191988865960527804596189879889781246044507520439119510874257
- 6253503374285344359966802548772112938561910122074296511208884295468554439251909040934596997623225136
- 6844939593914310582200549776165119323633557844773870072751670887701833608973105333061674009407487608
- 4857287050254039652206249843878079142123292038061883104817232109300172019148512553721123091515719016
- 1271374065368354640345909017516919077376312212625722658664549644959123749618371939551519665045731490
- 3486981404538174573697589822751137745630786723562169766825239245298159046756218528584558914530148222
- 6584053595263909853937176619710158783873278238375584724428825363726210818665740744020130772139829403
- 4324598455034889846916089350460604602972075243052225050884840981344559999075868131547522204656145766
- 2331404526326965352792923797929373929190374869671964630718060724784747396550517097475096606260234290
- 3764684445058224722202132386388557145132347498203499660406621177777297860644341467366211106480533161
- 4307054651648294660337643562092912703240902104351027595403970654729979272108961839673150847030362204
- 9840208056686992252465953583737496013314179003537005246456058694776746889730944136910107442020272238
- 5751420522547081908963499142194431740411237485172889543080184574091031999461128055643344226228957934
- 0517365029531336028314329702493656220118807383796596866938563040365542449375719742102493740570193694
- 5138482569860019532151625689714018351165254960063601103120281995349670461609746208291773657299785645
- 7130696516500162277788527383407259835596739708240463152591767380422974317852831564944495450369564011
- 0936985581798511502721191591763800482965813078985947039731206537802032276034416297329698012059066824
- 6901430294939952501589890477105080253835157158428051781526426400657458402791703655628341155199917788
- 4995168857898088140509686764825608157587168921378526143482401986700859594918343799687274938039243990
- 0124089292676454523422192207578413785334248788335354749324685978019743073891678142961050444496628579
- 7198684931704497491550675521279111615838057069681965725948152986672133352580867678999596495159606109
- 8889306228869661326312175575758648326279685711415335026472140795023598595852764820313639865562813744
- 7612938148477402022504450859121825095624779073889654945265020370785100531156965622029849937475086136
- 1904397629959903131190080431975245809400009145582174545266258052740399813169325700182768421722318051
- 4068200502309296617727018544600370433014323452516468664561052172069290603672027333539615770828488823
- 7288135889404534490226994538768784657248578192875582017026334879541782535545557549068250069979739505
- 9504613420534309269819057255312303387133029128503192281356963960128385345521159435691409774601581987
- 7741238198895866727111427295831082708986392046218034537945562433971856249712714095792596192307818840
- 4535552979777422106889367338855485881072236768784859382251540354409948225290592834847801360135009151
- 5811453292144235396298755483068015588531659665633944781862223936580697312612851200242204741143375961
- 7769910633391463758052035815470306229527721703514821238530493265705844611319656225452385286064449330
- 9181674712723697272029500262669493867606739072357441326860714781306327962522521358345146175319707352
- 8090113543146777394534710240060895178155583075721182150799500558837744547319261292538304998174304023
- 0702238909816076153110992888652872560217949886633964206182092131604317680117781542966367350787241918
- 3405805978019413641380162857929818320868424446974760959467546593513927192027086066670096446912642578
- 9697600503752819096615375661855458062643522949216579083498437925743197158770646868200181823204868998
- 2564563340501384966557640297083448061878669689312163513396687831362351177497941993054822898661904006
- 4715435959579227544277779439667263372974662779775357319608434724918119021011929439259038026026484174
- 8444782005168568430346614412500612254411855360366968299480657213953513340788692453270591291498280174
- 1121071884134268787888298002107119318415476906323213303566470428019983416257261051670413116849386770
- 0277509498844108513693169564448607593170835467673690177738942973154551145922770111036084305577182412
- 1223403292822987443986446401919560923000143949934530604425799693849177239781614945113120420486863791
- 6752530634900665239580440289843539255578484580722003320292503465974481326140173373348415220872649858
- 3672364880564331283046930530487353905968489776941066248996816465510182556276908923306543747477325157
- 4823464207618269372020011128849083740841566637879049177157916261744725335692110279631363639619333830
- 3169096058563478651583641040952185421892539384536519000945682188235121967853491290747273345761908795
- 2770071453429642885777891979700517737331894256474677870595141670950151254363254585850590927777223574
- 4136906107059254179657940736448940133684621259740377694362926710786480691656941449476496275547975269
- 9750611239290659055560299806182775792321198690451590594249076760144944330214475381107886168394173626
- 8247379536204857866736619434018375399507887357076956973633489060966234152033032736644168409155972675
- 0606818691954289729554967800742088808731999842293318016422639183011407959704912671956726619387623534
- 2306778374503739921556049731619654537918413623760136660987343740561564616345985238478285233197307913
- 7019825090585326929428640128896615562366533668086796762690219338587009470620408502701789450516817868
- 2770319342784307016451931313911485790961696844160662092837320833387867641488391352989258481845308669
- 9758841288965867024287556877312359003496164995760829237752268936555707635413408265577248890243575485
- 3975257909113420179830261153474517489394228238827710449742344359228203662147297399136740367101215970
- 9430824875344769801066976990314194078502080100063845162203542748953285695525801669871401279094554658
- 4468531729766388592232722802392295725516217043953779868091887085119555014834500653542058958817281907
- 1594632777061363476090473165184177320017762749668619298300484784222251662526812410603171436519456728
- 3488928109589044695107654103618988534832669434021847931347638061335551520236021763656182711315453253
- 1524831850160025503530023509981187456840139784132450412924899510635618839886059399851860662669837430
- 6821560893536408037221056922170621065402903346895715239006679969843981971994494884736379926562713791
- 4408554512627737680336924879096474511063094304810474408259752902764930190996182867206680083812477082
- 8042534854515494482673351770991586513972074445355962906202978965148227996438228462410049492538096631
- 7158494746496877324294171486011775792546480922293925634847344849734476876789725518676844578041930104
- 3588384787449847191575466125277421065198340368876821770985647989749664179637585327608894833993789803
- 8693590500388591500418224769262139163222115117073297407572999505921614195341795453956482580695755819
- 1410105474085836697638897485443567038088777622534237252366858625286860701112073766444177034759239022
- 0540292118336359207682874681916357344362122584685518491173782814989331732943286878667341277094195061
- 4067843095596346611830093772355931550084081882042990111253625495158658798777933201606023025399639582
- 0888578524640683893060314881551188185106339280138068829477553386857687006287381871755096202301678908
- 2957729937039481235532251177306514137747970534389379645194776233680444566103772824237746406531747191
- 2285508752570124855530349584254775511192310417412608960417645304738448618495987688244554949742237079
- 6274252261378595615081527071735522514060924714662877076575923280000636236617818518201466129968973204
- 5067019387912233902801967928485764215175360503242804953741260170275740303053422716418639495786000064
- 5995239276691728895103478325073178136744237372764385742521775361860499615778451640562125120075711268
- 6925439127054804174130629085265480196487981111437341575547549991708223661965071527972205089698520513
- 6490535547278448297207107814574514568460861115729565963175793886474842463316376564944811616192160462
- 8737029040409753672886130662513809093509849143091520136859403499036297931364403312590118696488012087
- 8666141208928978105070175592631593289475933353555853961535737486473277884692900514837562696456927138
- 3010871929842282561144132628796930855435148219592948067080592226824590669598704980565202263218860004
- 5813384821338380107140119370503199986558912494606613140897994650450291669772328830601951849785565324
- 3552234794761767925765445820526605167994476072270550260402538069305498861065092174655658888730178883
- 8412895999596591593227930457380841437898235779781221663915400107412133609571689636670057484589520547
- 9261619617366617966892473003181633077684291239817740029380690464820050593056721097047072358576276559
- 7152866857405809911535605869057244722420834985942707651457804339879341679576813796362083390395083293
- 4495580595363760485462231136251679236438135424774841948043589332145988194213605792941674122615999836
- 1085501672440264935290269294762413425825638723031974350786160646176951012185410632203081716611241488
- 6764403388729757658443952202219610073743454148508916871337442678359527056131521252620738693321830593
- 5658930621030492920953553814549511601214641984397939037189643986934878415890922090939070427578219059
- 3570943076723702438900534531209670035089619222429881608768643298293971488249604124465132808211248922
- 4188331444749268803634239182966671662822415678183967524379665967458116991492813690145022797801359769
- 3138653945547206845777717459138536178479266953710369508963772279061281236547915708886907667689081937
- 4934061036841067386005411002627870087470594710658645143919698055970695055650501512339366658905717331
- 3364476421307065675731991903938811893825307521088285951614750680946883924574001113547027478698216862
- 1274321497665188300319603334562235534421417368117005957663493676223290691848803237345192434912465665
- 3297182384173969198658713331341207105170736834172412344723718672494151084270496155495037955015287382
- 2486053846067672039287586862626169843822805601587578668309251223040159989753848922836009598075215949
- 0258074717157735374806690050015349853590369767229710437159210984693912049054262463396085508249182328
- 6584393402629382685637152596238947447178336999661802011547882499133236522159566534048570112325827708
- 1886215013071577934600274395168927524355182396240839150123473924668651002227673515415339817443806293
- 6818843187021953946745788068387330450266993482047409308509529400887069518186325483548249662607066502
- 4995646819410647040712273110042154418554912316340734019618090749872367033899749934392439916588065128
- 3667905641695736521605028224488521757361133174294735635774830847833098492957430573060450412840297114
- 8973655233370252933328593415448831374005810726242464775155356118977342742942596840194068133338141610
- 7490916404430780527772977009382768736682692808362834677259100328412812893578761188653303799439157109
- 9173130876841482981473167438924150708123330466386665268851715228773495808650709021102713080114880705
- 2510861641816152556748171047862194001056128001346471000489600816181363398613143759537835734463470097
- 3802239706673331788471217421662379783395050849458405648043005911201841730050224196298113764325550862
- 5993667297921212396833626254330792019745755537985778603339936113973147973585880467482663190555031714
- 7510740826575455384526005243911716394798545438546404774452744423208201158058940110410945383309204755
- 9831301278034058767338113451784704239620884935829339947629489274926307615195947580863523050039063526
- 9755089737196321432027975808869585297731621983594425668946663498655664182852784053071039460383705531
- 9530705781433206165483720876373054215104981963982316223946155540162448192274889889915481816161014129
- 1114223327424807105120278497238490440264296807698034403160101365988085642296075406956955713350800535
- 6595188841456265319836545998149354703533396578804947612732090048553113590869747145353689015718969841
- 5775481177794107604190191456527288840405188279508490082645360132429152288889379751999559985968288936
- 0891127109103099730675706218659729673463984306192842955042921054669160915418280351783236841552181865
- 5679634071112430643855154156248975176397718812620984087360982992383637303027505941877062626357378481
- 3688683682933396988927744468696966294996896602769160036986059689047184171600019718412362651997930127
- 8741913927227986980227245952294015243220840481753981240082576371360670303344776541140427436996205412
- 5145048270021051517411890882549260977472146205536677900755200879989232346535925261273772769545671215
- 4449995014845268543259740875744450235595031758880946786706242795049681223173819531934699556151004209
- 2153608326032153069185727225992986003953925473431806464770644415440963085983320989428117389795068274
- 9552487066282732805364792474107235461194594426537978749869795964322144950143520616632736083387789574
- 6269008896094162137344263820026765753391034189247610563598881700835396449558521922407698130525217319
- 5013237419645342897616581354073313026303028547802248519255207832323745483267963289071256274752461229
- 2929641409424850290594741557599275124250850699663473537642940738391820741909162541609728445916256144
- 7272170590829385767671304543843359908261608628467196328751602860804035347208536219374949413665519915
- 0853689237351274850742948144519654169382291793153091803782047287223894558772648584565835836888354176
- 1056472125564386401518568769577988275174222434711115526234369721170763345046653272476633423782119587
- 9117615783397228747084512798865992451832791641445982802144372701894626680357923333751748064104993185
- 2188455068211836085689756325118138750460942419557443263971984310789277524723566722883955273552360662
- 2598788598539632877284454683694923676064844122735368292191324554704074421666820674612656707964301200
- 5535159904741708546163733620270386595227380642312621874062689090399816710861502195826500644977817357
- 3185052157715160847631314297100682482491391624928925561263847673862182333452283028570138155437476505
- 7846569058839482531341998139629573625019198571058084667923649110592908805506833821771837094406269993
- 8269197068244705320057945408351861003661161560945082423986504199873162383835746664545218873590261219
- 3453160485833921266637725062085190546236237337328114258166438424988979859667954175920036913004537037
- 1962753606871830137648121274105614824487959863510850054873490298447752975753493966553071505515441039
- 0938653741666521591833549973825668932645268620823596214023963409712242682687002533955826932243805998
- 3242690845304781419914989311071015716947495557635219458745768629630183899058242012787867557969347231
- 8503074461060348391459879497794871139135462902548628222497438944743868266164360683181248859872326879
- 1076616230538008602921583381443284532240746235541879988817472381285359683828950062022524646357316108
- 2663603643148563553160504991541441308872154144331745253732106513961197330694878139130968733186136669
- 6193940257200499308099995348219427655878113235218778124571834239764680697306979340608138301890778537
- 9227621548466408823126429816421239417456971356661539825555435294981722390145222359192574194314642182
- 6647768886677250217123294152289784461629105662854200714538834167814891345667445069291290631913561846
- 9153315855813507648754132185945574577015648665261674662085801070023556816875810595967699890198547270
- 6417531288487494139070866420808062769445013196701970335518100417192425136442744852197815370357770961
- 7978036554715010064181805027540735836312100758486904203604530637430343887615238289835573728526027901
- 0965811358399008202510641500684886037785145170399362693832261888230189959127100087907541662874832239
- 4452285023918486791381569205686354321704163358637035324353038603138245178894425200804853014804232640
- 0652099629600966417769376130820806870201308834720999916645580574702972650642485903100718469895310690
- 1743228378475715367509849704348348205993122322475198548535455451980842281450746416932517417116603293
- 2667762278190834897227510030808975252050302466493512646127848908741183038587799856966390634505200221
- 2393452668657992044238614847572428901051143288838145837001486782283330164072761140369413621157371699
- 8560584173544560803368889069252435338105397159315045259209401288682676195785113132383976361566212857
- 6482640972356689220650459488317985864101056438186988942899276314816131141197839485143896402016161447
- 0282221756482734200646153016170156730451861843770521270625734225871506289598548861762052296168865652
- 1583778424714947986648770706732481799084249744141303077278122172757039389853107662656948276197633287
- 4465960455935018021232313616829469105165367996131496561881423079790028197020753072041377449667453062
- 5110784565792463800382738568602245895406143936149940484842869698064832621084643807433365583986880899
- 8847151429570101451205496684289667486610186687651297313962832144102683416586035991143893180762564434
- 4609274750282537324722439635823144186618983533732369168086950292204814362372048123472392174822684291
- 0666117849435316725923850410537793110490815729580082189041099653740522940462019848205947195654684300
- 7682203732839906146792078803130621080742887826745652227951039753018549245010806671435652203409852097
- 1712751588390486131129466673396409924349264716231223460568160044054572146286566256168928699746838216
- 3390433176286370809582850819096974176212074055085110018153302081718136717685434872720891726067431810
- 3868754990964287428041065285744478313994874978924434353732018837509779534604400528119785269275442489
- 6325741629879428825506076395165108387117664673766387526975088379398903288357402112295635432087437414
- 1624949105157682271174177119322329453919740921365908600004762024328188811611636449287155599082998145
- 4358403717095653052756790061038582200502577422429256977373229660938546733692944968154326056858234085
- 0739091504592315081322676781063632505958627455148922828565406945222105635580286224167640557695260322
- 1833562396373988080142461187550546095550941227200200166732907897800070963848283124462955965450221207
- 4332643657186971345144689688892295108020016256807995121841316098330970217827686024487144336131445923
- 2060147349748148691320774245973643394920073088574820672241184792682405330459869275458970721315458415
- 4047723222208392080363241272176311628918816433940368693171355826800063517320974505243783052633429820
- 5158572929372906514408225209314003833442860094371776965082929411189712087370784093552754759466760770
- 0739582996325838861067374507926180433067251405352116133767896036538579850322184508372345725893974482
- 4492032873386027992042012799506284586176929349347486450464919686353383914495693293534991399224536641
- 8810063103071095056877344542309645895436141863087624149444741986669834771340530095779787207929146238
- 9626390884639299690639310163833638321319539379304280498487596279495977933648358480037841610186331741
- 4981336434273879803025779702183088650364181062215710292820215871814456266435519128923907464494910427
- 3596927665231146956658445818114476377375235012859312659257607505565019843356775432091750690113587867
- 1619549365520291390943771733201558080722733319100177931651968154228088370576507598837597021754117738
- 0871379853389628968302629816280553011075577589785348238548129828105014962885887182322180488826018274
- 6164487902917284184000293674697066526008628284388308813356335802435105776352859335154443801010244994
- 2174781896553188470873781552236440714542829548321311895375408182160748659797776227910230823364843617
- 2336602917193399261678828689800578911911569612861137304042229962444456452288117974715366357914615049
- 4381217969991171955339291546798588856908281911031471838112996786565145305967981319080042218270900569
- 3044807483008345642515023609363752556383193517427034362926840234776413899039043362351851350263930095
- 9664448987760417437860381723420607907143711944475395228435516778885709093405909842628007555002487258
- 3065055751125935389631517182606584600128932682974216179130811687821272103921757969833700705560047926
- 5997432364952544755986234844740409617147566288275325091737591546032508096011443270411987315969680079
- 6893604075977501803740941714699818850466289826305034062817302823197991255309183628077992511330655577
- 7258958054972193754768545034660721841155705309674742472328699207294954176864890518966875077362184297
- 9151157585159066981543346997356951876553230061572819957408798433268786548387703704838867969634471044
- 8810366625529586283434384804626781221476425166019764227020362945087987909230689977626220233634117711
- 8201539905017307149399611554840371522826857799838510938400452826367576126056398439135294087394557427
- 7648499241414685824291385791775623295402016824786676002102151382666411013004217800623443217919523686
- 1776961388050065925090702529001557499487526013723194269628376917390123280026029927806831063027349010
- 1100314067077900457927698279313684945163089509182904830296500190892833649883721439618079320874232876
- 8068649099204449507359860528957211699519040408338984083563306643854128890071475438665670708501846953
- 7900325716436271571357347225105929586511098406845689715658254557256333555945765777476180201568378523
- 6403149785380983156625318580942578510581390461546524807271983290957729580553008835764393546571457913
- 5927674664325448384545582730913986167177799594349945503174771436597966834564542345782349530220337939
- 2308962273442866717466798655682537325145377430092237212027531693856659776107823598018863075075604083
- 6771274187145896698345702753848703603042584280212778831071351132772777499204648303734048642790225836
- 7600773900836561591221966284269036366602985432353631799451470339639496138687167177630565460918856551
- 8443445168903346245846829124143175358657498912475955608960402921553939774464288772795162230612464779
- 3088265423574801071780915277401654871046826553570309898131083104309486675394151163167665828140370086
- 6865547643833977042757125044749221422969080622787608544404858813995712747561301902637515073878311885
- 1441005371031418316347433675117492320531768258391503423545058602263058687027792432296916175459534404
- 5744739971171211920778991581218062470944155069472735140123455020462906778337817621419189014690880707
- 9818100673485939679726693487696523832201910820873136965799813776062143345608391307991994916188426151
- 7662011516330133652402686506039217254034345528675180825801046290582083646811073518337297519614561225
- 2537135677118878425199402354396224247751737334535338915072628823213219610084406315154799859952158888
- 4711599783751001062597243954442905647837242827112768861308729717667450387784470605049817926326301121
- 7932857796302134172905845069384231278574470982819903689333323225245658784864990971750320221672852149
- 9882775465830655901595843516185552054897826736135796279574933052201119161084208023699613890043993283
- 5066345181640768389987922413230641588672500479862191487276091383655534567175784547455676041291332244
- 6095514831253536112871452107430436355478982136977200927930137261704890828039390999835574082898005613
- 0326328048784070258801908538773031881871273074613664205091087496124190176913449970774575283633978323
- 1561103564821247090359536816103938413756883377157827938294135462391627057605602271779835321108182513
- 4419902677286104968703506073372089355308640081426599165087223597269462486048366658911303958507510474
- 4947269939264526460552266518924976453080721310935209623157608488311382603647916682468008414223588777
- 4104611556932270788793268743612837957576853818407467782098467762736724469111891654655430484797104215
- 2397792892067638966358963835664180589442147453962262317532655797252681466311769780129937110982453405
- 2292709330039962951371443831951350573178805666396104212257787252801325283848330829972881825074988518
- 3147176842056425852484751295545343386763129354644077734050007219968380140522695947091991189551884053
- 7007723165819521053047311491449137585879146562388719464798452652848026896471317271515010401260230712
- 1222879224688811363287433466723782055811179420272164792256537042244877632969701292769131500425202259
- 8108009997988559023568904329023147853873872402094744838539417783679432332561309381772050173430979624
- 5324951033905554193731155678109600573604690408793506212987488240528497439396469465846777436237028014
- 1430030440166179011657976026979051136930909194130040439925056649562424683802034050894802900026376220
- 0578640552156227401553880280034689559175431276218613147605255689989509498932383472879082539984234639
- 7579120047011707656479780085662647461192149320181526856763348584378214733117677538206424894580965820
- 0413472695716237038372077935659762005227802251822529632003253692765319844596583810375507928342527858
- 2591745643500626084344163112970195537547485185666661090821301768897917608118674529452988157107661286
- 0214031901965386239562915131391540587849663072019421858020705480546447754769556787208960159717907361
- 7241406114197727650252901385992813531379709256036120684983888215192251813217998093335978213175107048
- 3806021942235771089945917470518247086038195757880028161556161166585331628472637285890244233722087246
- 2933270283531749284100443472630417990086941692873722278380802882663780139205329286772928042365659125
- 6451489454928932008400609684183178390593490237620500022433912426191828329180108477069574155867364119
- 2801283496458206833115754626233916641813906198852245734368306773983610104642316464133135532352273752
- 6644533820300409551032192889761040287882571654340181783887410155412948949210975077746095597715247869
- 1288112448292842571974688204885654909561576851286105935267802656143938335859217886735660059653009853
- 6546206425434637910629888573898318354369679219264775780379760991519977631569730191138816967770383136
- 1743164453785457007319360521970015173541007668696013054372758816070499877893650174222466174381932691
- 9286242930106198425416346048533061312244441005381190421705295021020394928499328022918752088000318240
- 8337953638642237831826693545467637857036064039922133069977838159195259555588878191552733115500131708
- 7949016677272842630344949747135658767281439426549205263006190800059109449562185452175790848418298466
- 9384194955881207470010603768356344103320545001615165724072012529860495889470797218342597016438475984
- 8658280980869054903677261462021539863629416377179304762721831365968096850029180311410797043113811864
- 1849141586975849866022454649276513102872758629386704002130005951781635864407787481178065225685065307
- 1350734245894460268346208345803133921453542233875444863038607087278502777777508677629920222402710743
- 2459134004028928720902658654473562108425271922286631314180112202868765811959272712835132421508816450
- 1912089966902197373677201815546709893992735421991162731652624506949920028485236634716192101353179446
- 0181932739607212488739815750393461817020822302795639335431676555278850293516327345947265795104011499
- 7344823774206587573034636025051615613927268982066048321085542322084072024003091375158254174604210574
- 5596153391984589002739715743753802242641556777875930793480424536014455008046344124054408972659399663
- 3007997972592129223109419470783842041830759662553943244560963589541422566136737969285423713764749526
- 3375569771626021992267349139427236091784676196587205759703367639965915756363993425058788943766830142
- 8916417573850338881007860021862503880088175428204767842725956719604840605712100796561649269169969392
- 0855774499424977562114141333324323795150936409664134080844752861415797124250850592580508106462051245
- 7221688482019793441153229915524820485989751301007559884796958676495248802794232312419807388735906666
- 4964915113962924488710570456434199781743710931692166476206909405665634791222087667353162014395794445
- 7621663868466016550053394793158087747107647644547839610999272348900285145797974434466044051117604558
- 6177008433876053148008853673570211565036104548799284037532175914820188299399708652690645538159173954
- 1840830826296942142296036192656880385459991453155319530519391834550185884549349557882374650985608212
- 9842400795180417637267312953711599532987137948096818664554688514436258350366624408525585930624414700
- 2018821220464219259172345933989619257901631775292386555197656249237162846568538934472706908824411028
- 1325841910775755054815966754311956994397841516332406889407043926608112156186190253032207139064676977
- 3268368150661123769280024896835575713723112884258276892878231095678118996696977409489348724146614973
- 9727949412661076369402958236283034824223717633199718432399903981284939398586827244646054071699259408
- 4518183571889109435126417684691477909225283783753239560194745349090551016423380781159966344826207141
- 5872381354203240493175757533707935096946134828527465137714683420562623632197172961999170866638304381
- 5049988726067172676572483899667394934781864059973119900529660035329941393264852632809300822108367705
- 0197128707669900247813008513052729668440606101643782307191363070494220493834196009535099939871351587
- 9252197394280615135656431340816156888490174782485783660680040392675996290863093790311150672767194187
- 6882462830751887950689739054897988939998836266317622380542165500973438436075892142420468068102248730
- 7387780947877235273901645574306789841755860978059801159655866608180878353193002712597379133589578973
- 3400876344311886148697683788112151087712667757231018332511139198516665079680964485325566384175831166
- 9493885921614166745675555382378604424455712633396677214622446741586901295620545652768104736368260978
- 9864963005682790737691986315601291614256930647810069891970202265386741626030496339971273667679574289
- 5556631401488118461544582007593167883566826708991945569858024090677654274445079856845354905475878108
- 2742772021979660038202099786595196994492933543169491649170554412944820929676092514799032258890049539
- 5499572299301806217926211240711016220957855270488860538192842360852957014065767422134831332602634217
- 7054373095357010890780730221354982636285288782655869156856346625947313258519565913846892446244583440
- 2277049670665349938723547520909770648817090001106391255718740682470471367225709217122286721119172532
- 2046914596922156122975243745550688205617369549406662733252604137044629086544615104425600763291794861
- 4510692258879443748157789125088591113417223303156749738192086397220651352015828008698246876537375323
- 3446669783773281011145261959958866650108216881597594956660290352758332149372864358745996764765258208
- 6055524473391211712979767298140379890972865069764920322099279240402066292979560833334837097343711038
- 3136407411648476005069852015674472277835899960842557884272473530611705160202186456818014842377128587
- 6616591199011868814095160940245806826199051129611212754574119275346382293994753499107485956141079594
- 0104716129658891591656799255444422507796929870576970584791430401182545453561117242733713999994326721
- 2771932319339130006890262678523004204477598136728474379012867170965176478255946009076012677038666595
- 5450974046848589127133239909729337983586535080972670948531616454530790871573529955075169242502752012
- 5482063398833903447828489486253263843703940445054343631202404956819485038629028569337191554779296289
- 8845325057659768207643446294689814524433420558044994658582375053659570536224403818429935935441506813
- 5070920577444979990516676905380209621766365606835781587320379231026760528625950776545290579527210420
- 4138524615686057656282187475538902520578508007406933729429877374630579256993775040268566158661680407
- 6154221619388979463853633831125958244187970971954952240747959539519422976858251390076954836547899338
- 6356880618290567934076519758024674217910250332216964377600441282077990490323308123176112379972572146
- 9283312184717521295801191664227393514437669837519984530645787366407773806996529187031231945950041645
- 1412022582697246981461488184628904987272836192381272041977916155713134479968757570339354019325461289
- 3602565440312289217822034095434438836935460408954458024790180847629703419796230216029451611247691650
- 1860059811641727438266730728952978409244016569577657255557295761302425335479095067619819197014241516
- 6593574460395967361853255106100792443466532944181807012147646030124862963997533347247459834339008685
- 1604672402252161362633437520040663234254993084214185882609820943615743240845647108254431018830907726
- 2585702511210465516446200720391537464739321529206337979709851707477303806053628389815119695460644201
- 7113929566885311883280626433431701717020517026485281318412516343924730717133554950605158671361101058
- 0504697835880611507229261275769395214080302982839704314172657091329508291125343176943080754686551329
- 2224276499041740474813410763681949573977464379686518304446566839831848419482441760598638213837823531
- 3730452285949831010176224943940539018649427132324272489432022720850526670401611065492980272688629950
- 3201407835500681783266124429473379347087040369339474448836401463014307665488869199951906540631166476
- 7819404973010037519857054167252764702308591992273998423414933499839097864034390769224272933766892660
- 4934944169471569715547059904217421925882575342592999565986426768451410612384687880654457917717504027
- 7628236063300794375840743669481319018301570912676662079893317001720205395490686409451497740977410943
- 7345210942859684717270234064506710071428745863558686782369963390799448807437608835336820312113732445
- 1571040418642925879449637775145772351175866088174938782675387764130377951906050406476302680647426906
- 8794144744826935195393809701784967319464528914389222386328010121834314118098075047970243899193572725
- 7052706054704728147464744620822245407471416940652069695167600105591770136489713227842017003356643205
- 5511462217933132322217119327373477715778865837696990791171131728353740193571986318244470476154481845
- 7702523441248455096812811666497090604322747183366809811678365157004680187681709568893241844073623106
- 0256627475747969763747209063548402949173472748730812019505270963758360746254547935295423417127268198
- 1339902641902576337361165697385508744130241104699836432221001267728682180949890762368689263384417518
- 8562628321296599412137517969890520924751998789466845120578373584504314890844568816138401588039698729
- 2009854086296947132259863231317127321942891413549432335912293724230966015461649969855796276327555457
- 7984454403223040904934659346663308857369596023285750180268502120007127142076555657726407983020729194
- 8065129360217761136093911359393530812177362843189441739621355453605002461387879606760408053169300250
- 9344182571342161361444011915228953065300777905397200339662894179465964177798355925342228777465640003
- 4393526477351783515933055719947159812125038017559547577745951520713908433610011537904901507890705670
- 8818445741145088305122997002099696113097121893728533083594288099049270074679601280969718292839412819
- 8960521323361070521443176014995019958953589718336907828313863423685795679656341929304976981520997452
- 8878312145973684607567476636060039687917435421385034895326295820544748769241330366118328689112778317
- 5460291279129556760074187332255429082447596730430080458966345337819875369948633505377224451590105416
- 5665887069898901375388802432758515141185845435365298749157271886535640826832722511014700909898627167
- 7224152877689862267703698396995978281655794088825371837645374022181884118744813382879471964454937570
- 0207234696253360159221820280817972604912829242072671298002423760022464850087988988572315884221469461
- 4749102789155465212305942486102726047126981324149381499017673574896094118268050477173013164589468234
- 5409075051861661015410701795541759759828042293862715551077779967459122466163847477146011178964858677
- 2191861044175307319060399730981271821910672442441948147115278343039206536812214246550226930206567588
- 1276475434385573474263281549277056266006654671184876520726733565473166966217706983364583582683020776
- 6337778647489587312552194785990526293246984363824685738723284277789839925737597904038285297787397684
- 6638096241754775914830964299155281451658037282442319575209277265826932305975246124505643557559140534
- 0142976750824433474662439858343761487938996414440251411300246886937195215783044869344384073455908669
- 0946448138235353204219253479168899801439178623237601755214594654274459179747606361665240186206188847
- 5586487380583089379600294714755490167949590428156184287251585293982983632066919799567389478800199587
- 9803482831259925329759910502073507362660254243105132862940349554176399109476329448542904448102689152
- 5958952145732012266399103321680006863504862007357034858961061790277660718167706817936631804538237919
- 1259561984388576095180289432157965212056576110939899154968840313775493935408569534499080090127038401
- 7262618018204667379599468295436971942325792206474709758952510700203774171942638934649675715427250404
- 6938718835727756344487694459508498638877616835505884970028685726928054212917958581319142283803871372
- 8275528683064543331486880921516972378760137552798110459669882917779624109707091370378839304506450124
- 5988678589578863709104821652981152058332278081779915608263843346554197603150488841919860848406264900
- 3995878169329427061962297453127136532694441514636256973427524160873440269797879002146362696262012037
- 7533883677549691572082415463924241350575749432317953795546323852419930894060511341098518780558840927
- 3559116716167018711815535058236609856919392270006468228835899448657522671480046316567521942019661830
- 7034521639282318251127783428328954142472172600810147875803021229475153440371272332167086572434181080
- 4779578414426518997788601140202712329482376233826892096411116301103221754850809433535043407762834159
- 3003000533913418044642352624003807395109513701115850953473248223743803508935289352165877809760032571
- 2128354195312255082041269876035418900771365110860471819410808843111074253639171389881359753193233465
- 1579864775046845758698939196311882411441543035704000826401267779538411066650964079049875221717226415
- 6490434959626706563289904578376011368513262468346021348455756462607773521883602166221683273267524660
- 0907786809348433879198156466120824848678050644296958460210293045372463348760259962242700993707358710
- 7459968463323761050293787408079067362688314322240026342541834946497494337876425107862940494355970889
- 5096801337624024819095581134913297913613799767020614698043501490706733150637876240206623907027183279
- 0480285148295606115474069599725619492966830210211930502506226826388089654062984556197933891284197588
- 1135820072574356168576772366593657751853637407687010082486727325827055947358759499152718354765991563
- 0391378571672985440402751717388265873849917746309881277693341113336407022766678610507168850450924177
- 6817981250769109509091441158337030312240850672305458124543727125939201379371298950497688964104658348
- 5074819454011857702359172469012966511482150074342299282812227997873756699200712962845547283485924965
- 7682030788467950647021947309801494977443099497791041466285009066700904219602986633110301100111327823
- 0180588984555896639346087537285190743600228423038962151716195641806562700099995601348969285573932626
- 5725163640020407998471412336038886746834087295761469762659715075739705145216740388083854201531984940
- 9356208349418084482165184390718645485793541198865262240327191774938527578225038226935970540054945456
- 3248668816693702136705498488652755267963759254295311527394338996216801552906883513703290248458258150
- 7127636005483568596542941065170419630389669909871302275853459041651175097486133027113604353170371718
- 4168098731418195850315648707721494788546280039262775184566504309126034142218423042101331402856915028
- 9035417750909654228140833298247325956328247018868131890697734122400982457204778102124425786794196217
- 9708245494715165738807912130559425579829365910185929521458891989736410574890894887746130638684259775
- 6423252686346343967798383912119284815590463257268442980690380184893738786626776014667556930214317529
- 0992680576999578973176289166009235193383288594182243444483733745857062267504976827361392921256590388
- 5590939178962936286792195698567220771145167687115170363840099018030189287795668529739177054160961453
- 0699375915962278339171127981012984300277489093587489453981173533815768461395084185638045832986728493
- 6286928780127547239866389241352820450578035388536484709732754492568009427559651602910345775124513594
- 1932152689509014544595241696113698064708110231533338827666229870284100724886605287603754043021857842
- 9642231635313350340680402784441475200826890037863547841565363689567311688395043354563178010166155103
- 6438448861498271395607957291390579008646612982441522813477864422645334901586371744886261087774283733
- 7586277208196830696383180588110789389572837677830118699970089433656062457189838150176746551248089349
- 4477000837345306194820022438725236049547571173946629136182524460576260094886690256581329311350674437
- 7932320250380205435018529949807781052599853044887550724931255065100388571908248547838993266028603373
- 9356873644557467569660119191601438807752987664394513579476071447098889327766053074116311530139110492
- 3282193110588097367047432344058908828564002679759435346427421078414906154092962408338791081565789909
- 4988157126902366200432802152895896157752220606214579882840491823383657351254312693680379872686847552
- 3692007777213811796492400361590234577003494115340683355738248739131353919147581585276254133758998420
- 3618879551380731734622447712358536727905300835514369174708516100914754482240609224557576103986096635
- 6788289455003336043337208465567251648946232727869309895094558630983011437878258832122990671329181939
- 7652202572455840081402413093213342095068969419077870202615357580218210512329081352831950915725992555
- 0067198796875146302345713152953633128866961298875104615085935633839150702622404505679511688694605110
- 9466276723760723750528845553323504747748998015828804575300504609169021596452383038262921063032258517
- 3215675280891358488354854871241265327424716575220157935604338198464883776605527026552678470835601024
- 3568608832661178809770313606137790936091130872340772096181023901578532920354712719691056747947044146
- 4331213143956096751662611289444050366388193402864204850380728609879198298048731334990048455219406573
- 4654155537801466230578392118511432796651242618604478370665694246510969746211106625572671764171963200
- 0060679461544447383009587849363123252352851899857198091600068141919186168389015181248046434719012840
- 0070704117380054024841599367102849240755930396348724030137535199115751180444162615222008808978968333
- 3245220004404297312612251617655694246030207535958932402085289249243527073965651388572918316494763448
- 8104460321439087648326551672987621999736837094585493934338332588462059401572984464297862778628233290
- 6904492327659329244991240461338339690152475856010196827612372034305510897923175286777387820132668450
- 9880718026820392202804849215743424256804673069717712187345608571520356706217008389369827536191719737
- 1079407399906036839520612792285497138600225654467398562769675644776992563009495709270131191929824955
- 7757637508594236914490683476345460439443713186795630258838268179289757907386757743819735208131268068
- 5284194436531551097133568125748283469790178901431827752618088331363997360282959901000051972437701525
- 5864819106123617676411458323693479550647375250340609927897230719508277849700119603131624755510087288
- 5217381291856087677478561960638935124092507858062866821553712362464896932592034892191306713471710997
- 7033736289595978350953252359827128964919871104481561301082918581273929221101792694864281968328624692
- 9210846438959969288165507695822898733723861578329428488075621932309574063083808914628364138116929229
- 0832336756904067876535761639617542666459380243601974719954034836508568871288552924293518679946556844
- 5132086630207489953169878887983908989545654675923206058192261778837661222533547338637096772959302399
- 1180556622809264950044987752773346252173326389389494914654038212432180736158453611404602155525975366
- 7202239198810502846810737704377232931215975362275051572387645294363483879135289887879058215501111042
- 3358451831022761133433580478971414977152515778984829893616449182897931779032646722874941867545326918
- 3640879828266619105953142528663092670701732405950706227386670579287338827184951879760685322806148088
- 1864659328799427797461245295409526712496904410461310739091921123969406835184469699304716866174240505
- 1922297675298529668486734836811625766352554575224403184392246233255616522514104235923273201888336360
- 8901360504726337496205823706184846895299865267466363021958716136936786724835356109940373813996989004
- 4051538895903910328279457281511397587762747445318429305366136379516981727460520885464692320417591143
- 5001350395075348489615692495090020755605575438417029014607818186992492393911943824110025705182138823
- 0098035458587811640045530311277179266614743774837366237460202073538403482309687677893623056167893806
- 7317856631371635387047158740172890527249125208271689304373982296588377632265870582768134735329947863
- 8582774381654779360985613156779341800020147580424559377378303603956313491357634013503034840739927578
- 6595343912755160207530865236538527450378885971248667165003987741926537414501116049507100186493015358
- 2757306955302684228758483403210477930534852209549079257356397702757373204550799101581843679809773130
- 3516449897806847700924124658901717949986390152345242314464073314623970454745260504301874212994382125
- 7064491507354692970932063802903775911881873901579103827946849262860649355770579275356999844748784544
- 8455800506346031019432771827220312508097750299519197688024658963981141533713506843610011310996298251
- 0923400768862681738142858204141106078957011495068943086279652602887953539761168458073043529965627122
- 0921968552522884916973449075278234090379343664317568824083192949783543147314493991484494446342896571
- 7965533285040094675939963594990733864266562187481072632478724304062904946792025384859153980266086302
- 8206837106819258636756161674883003149343012810529959988806188629972368964165204568060779510100917746
- 5730814546919258132731296730255920587165658804203391315397441591728719487570142622214719278911066027
- 5076128944273224291366994665927065725104193631023859817549079869943892438890089393463412138281362194
- 7180798111450300020433901579204393125539951922260908899971256309233027142912501440398187050042025960
- 8780870813586866490177244473695219446703490650223840969305182593996803942103858321601640076947789192
- 4212148954359374400999379643728561303628943116743708946744737971676182086415931683561842400484542707
- 6218560664395978802142164316651900960728174606413768465552889186181960348825852074845556619089693189
- 0551159916269087256988217638846374595506473777391415806674076650097783414934842161844038388310937601
- 5393889363106315487134597252904837036883415016860751585799025411531953560707703814971227446960968940
- 9530526009808174927009219332674213887448974859582609816278112393479338277056197406663789713662110111
- 5062064178327309094386421044341001568487946244696759993524704930849927057311124823975923359898645282
- 7704154827762908516503796081505783509823027587421577959779004592060888004354874347352982814703676657
- 8453926047834167045941769174894680825377283621606685686911351945238338908918911109127985145874140765
- 0285259067209111152799259142128435543975758998522071759099462414469284632686263402158266024982921158
- 6948010765766605491619087786452758667194236834434314341938123350021289777131425000529224971673107771
- 0017168511888229988920847294675210622424553471607991208322047262682159688664508167350961643933992447
- 7511462369670308230209426462536749134703407424587665240882619103362519804641137116122739349796447567
- 0145458128842701067719626329369178482286279120561849828090900732388615464457885782858409709604774411
- 2659161889517766291662527168721718762516513631708979617646484309698655020383274990369013956616772453
- 3477735942841050791076893352387935549818784678123081259581976513263542563940234617028903607081664241
- 7750144015178987133940719540680368401437775382302327416865127331446717927706754152593737093421319759
- 7040931481491994889872286782267469651931566305291459571361839749552474801943392794936563511497990843
- 5426571310201971443459520117787594580375078746251804995052213989814784595033178625784899977510091836
- 7587992192282605503802850781001785441580731247007138124481319901891828791517297480631535418402724973
- 1986676050304698921400122077849186541670628894614373987362169714665740339540354657042071325868663336
- 2792832121561488105450732644643989838002417068492199129748009428508166943564929578343441236526169848
- 2303194094863341021660698828462310983387014189280782073748320543074954164289632481395094558993370449
- 1826186642654150819005827072358841898280998019151035177063881643966427934704377364802695785368103679
- 8665319390376877658266085036871810357283666433650577172278666728793090809972219221888136713093480501
- 0525726415738134064117816210480678714302389166811566310728760536945753778478065058502995269117032333
- 0371671960112352344407475268128928355868286840263257160569745001944449517018066181081906441054552466
- 2199746055108376658288581298144515267490380226956781150070305237616097616075164743583933410407798055
- 7722934775991343313672159786610550734227837116776183199485930275857261397058658470986866795339609462
- 9188678055717113687861007855007438818571064126920509669914928942274974254510850292688489395447482286
- 3067499394273403248683744914556473583037878860598475691837004542330128662758579270951067896905333597
- 3429361420032882467148804583531441386307976265974048930871107688512323078607934245122017154558018416
- 9216407608957713287564519943138023272075005128755637620339753300605391520811588010542944317855589339
- 8246356458310469241582866117884901004634140760949982144654146039283751024735058944073491964954037027
- 2245345722012446368700313848339842309183240249015795186593378599282947015985795919685983868598194490
- 5441298097484199553689636996354717206181813585525926232995399169375917092428613664218558467667720623
- 0544414885826253705320824543744822903027802706575103800171088178328186514598655832587195546458525341
- 9757769782177292361207133364124028163497001437315008855271291758919608289738898020217608210487754500
- 1333613191713197620856414914813796406630406540354290848751446093045428797888157247969800565660799594
- 3883648202831603389466790445113655307314233276057871082079267604395353546642253678185026829228847438
- 6393039583740097385870142651086344620470517584760549904572725750315085058585681974684292904170671661
- 4133188504384698079735601777104811768366410779396794362026848191177314824089976925551288263145278012
- 6438139137569639489110846479984997677906299545449515731787008040712480283337111702642723015442391360
- 2066185340630711308281520749753719314684009710622503719592163865824282289408364927262824559605155252
- 3505912078414670760567587367336189411174276167915553017199436756847928532673226578045593297864425666
- 9444338925456899171225377298404289632547282555336798903507722310316422225593686622402932897079007749
- 6213095713496292896492938787597564476663310010012085380491365778048694771004653842197087555332495654
- 3022798404918623196790625317699314735845280277782058867692232477965323935598599179926338256860793129
- 7153065955394878327773888071369814974640506625175143141064669754807888250621080369303014952360247668
- 7170177830459449398213546668120189155589510932377910663974321717152861012900733351801133111413566846
- 8007910399622453150596207162070402855157026143358103007802778165023775172009678562401690788151274926
- 7410160630231957867333096674195332631791548690087721251730723578980925225302256322654190233991410380
- 3099343538458027068033444271651927725823425369059249275644499599318933730202415613392172868821116886
- 2565852709987290601656571088073894875836169521706209563268246090399618378897872018226870237853568344
- 1810012149346172306767528635990112808891008964737792459795688250073985023807750959129815553066924895
- 3573727641323856684678177814057638772348760403251294676471359436659413455310631406958562634633689731
- 0651638074355343126100690967453765014405198118349235318871940799399909553892895779875047727780327084
- 6609361548855965799697025956232802846174744164826320487241282989494781029882283774618561858232334667
- 1858688349581842191943883222041292566218213616277944900410223801402421658236604363913231229544346569
- 4982722206790823288070241513735241623122747757303256124704268544338532247012797778599783518199543021
- 4875947781607618852708382020848349974712755282025796946996655381939593798289613778443007953018540036
- 9661661157628681207957971615356066202735762672471209934826291145872585661003020261654600684814387146
- 0837279792596145993239211017039733769873495439047451665419547377441161880916700728524973472353480092
- 4594736914410232283436343841037207710013462057946640670753098240855503576886997007848143675510401545
- 3365221491888383202132791737495225085910409412646261587266461619176963173314166337444938488514859513
- 5867901870079581736475850407096563444530063108651340154568645460985779376822846423033101732799271214
- 4695553139665054817276401972657906219538813253509632509474459898910878590169692258198604873251616314
- 8722533208681152503877839030921096397314087014632627748736199925160369035164018132286384101577891383
- 4548208695394911416541921224410372588235373528329662254040539599551254188046955347016927965818084221
- 6911467794957709031814719952242004890588559374644161534909346821095273819069249340125854016212983888
- 2360671129904727853825109322126760086356788729911106064744385406313070269157932911471683574893086073
- 4176203484242255797432510010038643688160552466827732801481669787349633209963417237792378830351660548
- 7167179287400111914472624567124700249762245822402739770702702350323771241691314913084480272640099449
- 7259572092359302306992730005224907365141977781182720305259060505366479310184870828397624359765410245
- 4719021296462440721878685429130719911560221343598109261278099244929883532142115168804430524223133517
- 2036687591092061218171572150132304915038524312760160267807102779059878363028490995133233325655424283
- 2331269708260482841091164629355307970134715999285642688988970076744233464896500451148248944884381190
- 5203162023956125155080114293455938402258904452354916067705752641775197360904402044833678818915689702
- 7789366044998316755033346099743453906679681237983313639844586220491826985980185062808365058175856328
- 2867239702164703792611575436878345664046590607888585936157260733764794736283941894928357605048336449
- 4011349865491208210048132550683756281970256869699549187621976397204502790044667563951193761315600645
- 4486485525074979942085002895444499533574504683662276687208248316413599480307060161182230915617525952
- 8490028995293428737617351026742418815937159948909697922257721440139091272246178883874360805196751530
- 3147911414335732073658590493042773379844712919544464543044009597518309741823376186337811529128015178
- 6636009016476974544958957323146795549938933751394956436260145495926467373472160218853132654468600885
- 3720772213452751031059526253071110235537885691649959116922083888770780517354383985678670150963780886
- 8647575766982532354044245428400882687477770328538261997625425819929342059121797780827787051185845230
- 8972985638768651127507276341003599414660122279489574955920360994603780484838552595991081712362827442
- 0401784980211031762787788750303630226361609766675801060395554799787456998157973342339974244475884531
- 3933453664591755258134755046344267161094890817996895922670464402169176805100590718447352631235416442
- 4864777438787765173853478975014025204069329911353255614813604353296831292899129535615290402759131767
- 7341277704636530852213257548630793354788299638340699937151542249438088240647332631233504613882159479
- 5169175925450984809791108923311377895396640746083457300976511706075241436288346609180038490635692685
- 3296400551653599785791306066404745571908486625041462763357204425087660332076412002768371472025839577
- 5725483081763522817065775941532708326625539109689730585045622593689849897562270215826526528062002518
- 4416489819196909558212078989726717646133800839566487722019320463671881723954704930209279866104118469
- 5704868470049638641259530673766660389421761893875423752240187458159722844252290797737229255101808867
- 3990839885492144913863562538863789161591888424051299819365171369259169577919988494941497711519431575
- 5826307059948575863534749639756855970386267805400720089745025270519397969812529688311916459045209756
- 3052833730948602383296272132256900737675339111682947198127705742624375221375825032008736375320464500
- 0573891793465923557708362204145285013907946406724667360182753798544781407692125608569448105416619567
- 5264750745239025451705310940662636682474575734607040652757535777432010239133411381357750332256114390
- 0976099469521398177028414610884136085659183932993931358081952707069270927607721717779098763854634460
- 2405169049949774757748287300933978940641473694571985048299051348428670709915093304457966391953558914
- 7801094434509827017367724097904948059288384657526908214068409367522488842466125605269509780101260577
- 2822873599379849977045731761175869419846747429048640123199674462226863633260076411070293488972360126
- 2149845968416031874245315843520548918590453569419644606333798849315311695475836111574976677407031544
- 8057897817050457319225881549431143902579345049989550037270423618264568041589970013697709364618431829
- 6660690731354763645120346808804485446394798810546809849670131795494286681388276584446505851797712368
- 1426745854755713822907266346031643813750146542919453599343608206282790725318865751797342457466122502
- 7443019092242962776936653158716809444242786249840749466556352680450276843578211362734069435616425153
- 7923224666458237107932145904446111092210703976045651010128697605935565797997230393938683961799189869
- 1799159386947086324241601016103098873785439567731482972348965947671427213412840043762106602005505662
- 0233395195755864512830241771428237157769328767978452275710423728172468445461622447270366618640546724
- 9250144671204565478357269214470538798054274436506654919003697852300703720061418372571130911168102172
- 2867212589594857460043532950331146957965649006244622695391251125286803782637520834620109193920529940
- 6735316501758378263276410048994464890719508214784102083666996441555489973118544459531232788198843519
- 3646690756191744363874898626362765030272068609251880972360884793801625295039225521028318591195209521
- 6030879709223063182430490513612517852667830989648407626187112119385645233258801563584566325681536597
- 4140063516653852783302799332761818731642928434366351615663255280877405476696700018814831299264949756
- 0617449945560484056516920660629441907471164740575561955183453874064046466344652333203510377844767588
- 5666660901728752098224471156450455672431109195734666267791950351111912484914064555435257725496566392
- 6785221917623854753819710831983228483946922294953737493172577554258096479498589102686359453576135514
- 6603751391496845122967455478424717793060749999248715039173711331059841824004577425759178667121950517
- 4289611967389888904579312607783631612978256941136845078884344497866404495895781779775376331750386865
- 6921432845659076387703508545492288177459213464479036409671937884800156599085262761750977394016437406
- 4232153788341300502620171319759124864587923006850025338135489151319984710933979884365446048272891549
- 7107603731744512609717170621549152309355807845628392179950936649904409609156994214938711242914663120
- 5469132238606335268740464186976497513460031842898257475120258445983103982014060948468707691618383086
- 2387891061468241972832005261503851106819905835176956323656969414236261015215538172503693919882029271
- 3685444010629436726451203334424480829528507786502235886684798729233633452675826546136476448809927763
- 3165502130074494529895433961752661174901691213005810955424491226738528512234383695983978048397524645
- 1012058826742830639996089076557344363448014904882983571898164096451011928985398760882296922643542082
- 4456841236875233258977838524384542275920567609260795846727938663976401333752981741038008397136698750
- 1792518889005096162725302906385122448156294734866718079216757439502335418797146370341359507068879603
- 1015016464474223923286729237172565384290147065906886729406948425427159052053409339014321081313854582
- 5970434858093148550633941870543754820191702268823175109013294136171877005809113345796164220301259802
- 2043107382966864907037504453868442844087909458071383896209544920759961553665571306844046952712994878
- 3097134507882757248448998973497039622465110498777004179371263198665504248264504271322916123093246164
- 1353303916768945148358569270216603190656899930352729669425409329858504714285408386710889273443108736
- 3457002691119243249637729822940094402075202466206644738391720442575483401453940803546273409990964069
- 0720756229073746841311985865787988559142521470803517849673589369335350075446723246131252582687046375
- 6343964639059479070392896125976486670569071815846029936042856641652378271137607745621090317980865717
- 3199934312817969129429620455695201243315446083595765650783244672112585007760996890714299062146372250
- 1837031998516922005081391020537898391562299250064687356797954066278295022474592665617686886293211625
- 6560500845429455903291737200982085881735374687831820644702268612764976090634339415664902642621944959
- 9972627879887420686537748400124027120252747334436166813022720475458702704640986434675736414944556040
- 1804690256490853251672716709512790052393421702743032886141323309616964755602018386215997872360962122
- 7570421099687370007122579942951869630041295418877962872409327846179804864790769989057773388605583824
- 9114228316374869287853814814314622428398496233785577350860511010509261293230994924741892675131618818
- 6207532574038684806964904698279991221611386656638203260191359684025156492479064439833300318078952369
- 6165184056141033843479937617818210047435190907065480640320569117166432209921547124046169424710431522
- 2205104885366382704720835222072281792307724378621462986066830039443184031897119593875880719811504839
- 7750862492845205376609935703511384695978429595440648575150506208497122812336063954148045231830375903
- 9230419312935804702532239639115127937593601514087053514606298995194074575535488686198226932469553821
- 0219472021248849044263655395305394353300405061335996832016669879477207952586691433189909211865226058
- 4960881496268365467234984048143810943198574036837746637093658063733929458794664451682611483334598089
- 4813230142344973630008177003029015416740179574436162018422076053577654231628456427644093755689715537
- 8728695987224574072558628891627542274001393924890937205554561607842415395618839990558247974029707414
- 7881435727079149221043557745460934900573768159682819680197715906457966057549425418144532992479819966
- 5711964551885655656812151334909804658037684761826601373717568372741306170464438082924391653713296382
- 6165307231060682333889999510255307327441209426994137920110104663208749715410587445826115995906877240
- 9428697875946269429880547786077645800522940757030840638516043605931255565855331231165546386554103007
- 2699344773118169078662801195532248099561712788155639351901256077112884694732263635778302596564232697
- 3847446967479381719183498441201028423519219594794118886452077960231343063217174354069248862375881350
- 7950130195421256853896066931254279329444504604143997511059306830758986663120897091786738144310626732
- 8572913524733573733413996498162256056419741787984415602133012302960042148911478485752643862518142961
- 9136898382227494155863957874082378090383414087929764451188880233720098864012236174176430506370381076
- 9278341189017294013294623856393085315322442227688185717288938851686500759048441570973663653939411381
- 4143300708417983117234397432128982693088281790845460835227616883923670670181937790638751868898267898
- 5926122487707255370774680909173812195568154246781758249863590845775282210873370947100534470431626453
- 2650987541870482604085049432894496711511556404503759922183153150621894176807974004026780591637359492
- 3058021891056162459013019130734230922011877489054176347523478720509575083012458009760894490201422832
- 1517081786382971517875410232779377854072683639518037227273990724613281166726202385362958044768744894
- 5589355612941667877115144459521507280112452897838988924398057926113395117163372724763220356134137665
- 5493609107607754288639415375091128355095389101756992734810580205244749886065694140688059815714553496
- 1021164041299207119157382239649687900615771795957511675590848192969043559344490289369648619008661184
- 8364084454709229880820186964350102416589280672893461892128839980588675472338226628746748982760072139
- 6917908199418072364514382989430173553032251147891184679935694376925654535114088246264417878175405852
- 0462752091194551715071532232290031783786392997264579504136224307388747429588420386537963008878284974
- 9101536714044872706052239832746544345293565280769604772215030240603299608201442874066463090243695582
- 2017514819021276959194854806500251596627667211562658270387072145811474469794369850676576882350350632
- 7908552602752457845213931189712195956022277801052170563123963444611270021258672357370900902467406949
- 2576669653047973714276265705359574487908761992997975491547095674568662666933178160269499245637861334
- 5040128648268256454678144257343138486006682679767270827808689640327625941678840571459411480462916488
- 1285200102610561984527854316767343019418002873928094615194818546866310990795150448813365012546122141
- 3542791228391303694726258978002733168003031221980792227233930233396990249323813630178121360113136831
- 0388677339001225252410376288392001146874739783019681516234484584417084711540563067122150252400600956
- 6845020996544235778554788006584453063354586519748517271104686923708210374238344516214463591642683264
- 6976748511916117839341951421626343457280693936967164403452311179813313674725581030233003356470919313
- 1184154932715418721453955008962151995577648095322472817056846283525646275430576200001721499028964513
- 8438331171165858417764510618582508210472454698908552605715433473640776605980218446223023035764928698
- 3535477228669116725509292642349535911297780867067640091417604725110184229542894697242719313957825111
- 7713736466128861099385961544636685556640632424096551152712448740813863395840329068301663750515937889
- 4470032446794442050062323805678075861405161794915675878485475379803613320458867201313746842227773933
- 8301015927873826640352079385737273318787221160069788684910568876737354682071793442051691869120733906
- 0230403595314402484827552498849668639056151812913549133306891980509583195474524347688558773831041434
- 4539933978264379056007932577903268772389335970408929063798623591326882769120482353226853311130949276
- 6145457891114707181678298795487397796649393340499958044511144263787805500618120194285658011511604965
- 9751470936084824478407151016568819151547630853708991777495003154677919940554302384555684329587122807
- 0339303655080520359026902225743269417733783302077850881645997749984355147030418993109278863628555954
- 9866645215146083224327029398653547117146112097864464644325618002352000486416928090125195558796777707
- 1201415854032429272796513998214262542785238361824897440083764657199183395660336509497078523288974588
- 1493347730994863973831820193244687919192275981928705919005907540673571852348118683464347785054157828
- 2244907985840870058612052844716335877723304380827091373968895056845553523261822111023731271368814205
- 8398385474704900053609386576177773048783078559721753881861727200525683687300867217691544126287754950
- 3239222116487221786152262091124259237746705501612558235461544208744584214964776025595727402918471645
- 3158885258827884286855889496508427039429899354427475578488409253424367596461265438109202556299820515
- 4148019374700480357966774587410088413181187258238578544848881668277133032050914804990270633866946909
- 9351248792271005092774614149529146261051764859906929923817599024416187949702356571809514425854995765
- 1792962105674460022141336737548079860359695946856983379772672852875925060444184643577824036237766702
- 9872832370604527442555068151809555888683589147533045701169217308190413682196197924446042649934384845
- 2732374619113711082446433501694801550253284184628733492266134568944139002470663355470788141605485679
- 6686564326698130317836216464658820830050364454812922884964461641012502375768282189455118458059573209
- 0939462064867750938024379128960180082794047481742206332791471284209513701056194327176292868579090949
- 3218055568979066286289154737548673198693738466419585618899770827990016924649425190347377703988630149
- 2011183528372327919965077715581634061761969840722231867827012354034994384291685565051517438377353920
- 3225611599297568796557485637139984984188981872386344774773551501353507919108180826989536012524782547
- 0432140977846932329438014725512584376086099814602199698631548473576292080996702231230779999766892614
- 9370948131311761267250290202511250176953858317579332482374758716019598930968995429457152380277892235
- 6850487641824139102326914916557444484512460830514578741750738717674417355110130764553789788752222185
- 2058613301075912720128415816099012918291185666715739299809291799149161000466033329225776086756566635
- 9653418185422560598843184427218109423181090631060596773327840395059606697721027773614118272064342985
- 3844246587728471851788363375281932542583005499614614837350414191861619862910670638791195176205055641
- 0548148530782364372016539996520950423890411674976436029024341956762244685142089456568032327777818280
- 4023531717271616138474526434256170300403880716888884214757957281324163069397719048693210177484934395
- 2208897797746064132160659123542873066349856495138429915119375415682688046403440740031916487524228128
- 9908496049108875248189766295443946375362198306085302662976776229728237088410640306798395704550798642
- 5562413295697069031260693727227049738584906354811946653533660264315355456127620022454365014092870701
- 0384502494229968246989481931106380584896383496684231546895857394178100478027431024343617063937322667
- 1414047645055320685254527772713379959897191293351095335218376237814482821238983318392269540362944194
- 4477939338629478208565391602768654742216021974541625034794865733087486963621460507966572115585682647
- 1256401983236872218016273702740854612331531487465319393626134387278498409826789986196912202669754590
- 1203347487171527203423784853201997739410893991832399353436083831944835040717016050019719407955692916
- 9441248268460290554602480556637492567690235856549630563054990947383386820022532727510147653820157189
- 6891764386176038466914712705020901016679314353889817992613894958205684315254271733398458496778421955
- 4228496937753821419875398362804151385327095150706778317618492686749245187887825652388078755933987418
- 9923941064660842841595176800291899674460456234768417462843614905240996146091329907825077671729948737
- 9930049706095219029159187881565502948692499482638863968238495608685005799920812591698095762500632522
- 7429775722353244646312991916029527828387808637437948487816007986691844944952033890911819968400143601
- 9370933054722190471786161995211092911279170019766720202163966918422241349535264054150343478493730094
- 8107500099230370915388201550820033012007604036740047502823812172353310546983710100965755488116614281
- 7419714224111146539649408810687135316799674897427937226351358103899882545160553672510213641692900321
- 0731223430072399556914225246430126273566681782285901690339952558864708517542843979342327492533998925
- 8403923207983599325215743584252303743666138993863200080064574750880709379984627470966570809436929936
- 1070027345381568480143981800226497961654983924247214953855166490613388699479448764070625660160551717
- 8911310515789812484067441540438634321808049603577636933696507502496754659653517150085997507640004559
- 5426370119626833504239694093247325407321746536577121897863354556824170391037818242656724415781843849
- 4538256203497811749471046589508232140820478205399922170830963792471914357052689273788296301720459841
- 6396765979399246845120216731557594061085011084015014939584813243143264831706383522933898357328629625
- 0064539653232340901663455349761453977754354551018002272987816661057242312430623503991266927255939838
- 7044682244056902175272089059731403171949939375760651704430817843584689023226409067025582563156527103
- 9919878744996005669653116942017890333193079128764045002452926077757355448308514991216046260407966357
- 0042929414152107851793951248929311310872340368754933321199716941558224225323452699165148427080749649
- 8243209108709130271922073605282398890333776482440248216436744892838932717872463012952137775840656766
- 5034225484479527343892962635217069248295722337237260521214867559012437510688636168620684810753252551
- 9080870082393756679930005256400410568687321345774201100430212747964046267720796028868075453328446116
- 3963670296167636106120956409159039226759772561277082336910179793240276009477905049390594990355097623
- 2855245692014923380389555114536945379896424390775315438661079617254935797164480344612666235380414555
- 7367642625144590571925802222930640330494317739911077459948051848434169030124710528400114530117015926
- 4176031004668798434006763661357541593810739490233845959978566490063310019258076179659274890217308818
- 6545124915610084564921917339841849364007892425340052885127409782607281844993623344396777834164303286
- 1707465557447095887106612285979843832898882778608994982593444570625520846669336207364561329951753464
- 9909660709934312563597490296567184680351887876443719273432284967575348743806058683938732087107123411
- 9603308930602352193502379647530151415937286211822952590670185758559048698103361310619537044107720860
- 2330006694355982298997200389420507124130963301247398988986501613446041636976412991855139856413348024
- 4010903820420980509818816370765602535422885206425047489586808991794668611719325033248230241059805584
- 7663804552137893230572350200971557476025937720767760874681482134522531630208788823985355668408462018
- 8776333889382394005969382347555811966044053660170851554314092863357092159448116017532965834133347177
- 3027110597090517811589017086602990160512479450702430123230670262179701141510682002268139997507258321
- 3035616679491261005420128645322980067268900094820970758541021988488529545960197473063613284296985538
- 5226523816130889665914509124886813125953536296057660319750429504118843939724705360578947986283171400
- 3968480764211909414275681202732454233195931119523950562906226110099643989483816464487458668307548577
- 8532874081993757274852197413718094296777741172223936413560332119093344075567878381130451998451486289
- 8000608483869420621852719280187780424866808029951289703473294463170946003859512545338683557968905846
- 5172300670448889684061086304061213515520387421392844962022257546585820866986406049865542588590814553
- 0994843493842733842178645051398542739742909585700856146256183495270022814173253676539794691275297470
- 1317006383541596544634244968352635059485344744721078056107810829649426478810025979318775639239043291
- 7853276342037522975657527434082950845479470152452608993138857831239117512692255667572885133404397696
- 2540393117493371399449529356801060379694459568597524987726734807907326761824523355212162149680234492
- 9254288655145733756557659455570923953342814246290317278154039983415564198377180189821124760855955518
- 9995062073007140345208155033298149750702442677264360338737539731484313740709266544922952042319900734
- 5946393119965350568073329814865841109199443946272328453677112848473622460633136028591059635237193871
- 6345986963644390685405322319315241354693248757673046338170302944798352260205181494445850496120326909
- 2337527162355133526234320721943009358815033935989744933526957874572783140396703969100170734149325310
- 2206326301692523701801202442268849290981955511719561208381550144858365716651026908664871732381901486
- 0992469913154608200199270504730568876141893298108310235264828108102485450220875722128344134379484999
- 7279202583543417204425984693274091417821439492801799745659873698287428268267484421213715468232751128
- 5341652370316530704325828337211237137609695939937549536223222219746596193325290740424876025138195242
- 6973910175637197534300447961782504311533150675825627353434762525391425152757047878437678852418719663
- 4624199270080257610839274976226365490018653206454995155802908398513272627321967284783025385221904792
- 7868938953878036869931884660310436335243732715469989881118644367011402842620261504738823589974728149
- 3343257065474637022451887289061255030273791902640396577417606898976983456646470520471635921448307099
- 5843064717275076337180207145974456525141885050371637738189029696852844092581931744100555760898502923
- 2710160089825722381739454369852965476949018738404646564373071319590114076131742822038833136029708526
- 1451234907307147624534050245423763666685575740120604059886955630114415443141696986074032207886003132
- 7905539178696741635552402507676530856322427378471497460377840646093468129918719028927597630701598408
- 8778174519269014769103003023497945851100018088660621628680111091511610409832730880899543375511871831
- 7378655877648735885449036687907416918253831330636233820582015488544982788382174243758054923815972964
- 0619631058215167091903263187309338138501130913327709303425112210972155056104913870504262198052602476
- 1160750597103794366477152935349171861250661163673833049956487877936569791129319587827777406010753337
- 2432790009732407256070388800871137309659634457096041175089444791191621745516970964844762046174128154
- 5361284226015513015895258628069570639244435478023905168613385498619266567622760358234985569192248906
- 9011645986609615679554154921575812835409202539317080737814650788320352665134570706553685699281124265
- 6708448017786461497404549211843122762184522441088471507570190883495022437569885049454241057266246094
- 5832095962572872030994776540107398558069966198019534500506514501054924018861089134173060759238439461
- 2465698616056090945417729073640093913219567683643332996199979654243480265694068369867061758741316765
- 0506027135882574433707216458819522613397054520523441280923173065051989954502858538352287378728698291
- 7275807824209826106060901509252110908989964389297862943014111400676287749920781723794746209168998389
- 6189486307730602749102670388394335247424342123671217702461011602406111857168705082440491623894343504
- 7025081364915515510432725074794102473747819226520593355136255301812196424992488212992601774080103719
- 8842125474472160296950027742685077521758669179938013625842241739856076699165432757061230452867280707
- 6318947058954406188421315713800339848740868094144618458542303449514485210539912489324554866593053355
- 8457827714423774338533920824127763216596753832665064306388069556915620262225946941429007998769834420
- 9146999897956832667090414139806863332515652569687878992257432796139643702654314463933379900081985753
- 0797881761337436094839283022338032797320386536462424980551140224692264789315929449180403829836490348
- 8863869756441485560856053717722873714822823686427811365720394749690693723991561003682807514117847378
- 2562212775995916775814038532986888513655232313938431742258535628070191544007763016347647781261324380
- 2484218656698552740076410511901095452898382563484070455808090522147697220428738220206445111655802021
- 5813722046634766333517561799050089778088560093208145417644390323524193973154721892092020247427040585
- 7913543792600976807636298756614782644338926121213456594456801042227616524183764018673453391488079001
- 3636035284321747804016831467261880679364930468658736463114832826980492022787625545401785091774977282
- 9467569293545166609864194814583644478909603830458285369895608066566619036031004530472002422639388157
- 2068674690061929873082248490016816348921255433754447580388736158658859248597558742783859992954170991
- 7225115340254222296922343661777819296533134967477572209784301938184450598507508056494831896792205834
- 3414789051025761749099758200123472441028507941231843760147142137829511021873589939170816868055988133
- 5469913794537831377114135491971243465810931127833266217592227589369934770498435251921073517573702005
- 4573451305873132214384620876027751840534893713237662907112055269490530038882280420480821085192876107
- 6772814548927944032272362841247943192644192430796813703829482005869742015013235319872051992035387731
- 4215882211485974318238790989199325393415037876899596958043272517776898661258893954420139171306418862
- 9510665268960624145208448034034741133148800431386473171584468157548365316705126017466407607280959672
- 1327294224536104266792809469773583638349822811476691695969557327702827912099792608638170176542101511
- 1581109268328748595064626236299259249694378182229169234325485361604152514206369252147745980941988926
- 8147764439053761119174630260741704144922419498001706238668169466079892475169718500094287444466241005
- 8638035586306506360957270979734930709648890760630190792334617019745665624871288498673826785462689451
- 2094622905482754233025173213282785316517586934054111845715104834632832008101152525413119367954561261
- 2161031974278321038795482539174314098770652570060376719683830478692910032674834420668406673515088586
- 0916629765722779969260038682733496418758332118080916861851713459115685089314940448199610725023378967
- 7989918872582686705377574351246508137986281348350664313246627092452365469835174070426513698824143308
- 8355263194547542532484588409399378463186733813366103100581146455151877305014130815666018061132268352
- 9639711462401049831484646043952006163735425846982605212545385915053646201416593061524137743303724644
- 1039759850015689210279093786786031851767240469599157234052900381676072424770169781521486151947462705
- 4614221125691272253815905020395830514685850036024200549094550268261850958754262109739913220950295489
- 5828917423298134315406925757058801573654535178927415271289413143182694769025888547865991968988359990
- 4388542274846947311875197488771215019159190888581326376998121590808969182335059079714874613336803970
- 6350036955539422590734536933263896961623842541047946294837937463813246124082530690269146502151719655
- 2425678847127229752667920280384129661575021846811088693939925268794395032672870087581886104930085975
- 0196928095204823757138945438844241621756626373518033643277401734125942745582026754402788121409286880
- 4120300022706318082593186766481490447257994467045942382811148786117712471299402343531934763897789484
- 4625604174547802052955308150254298015709039238214721457480550269684443809603801644372619530044039908
- 1842658748795326360174773439634741333029275581820008464886098183291707862124370345940428150160414770
- 5818564413222318877939216398896127369924002251605351282937236557373193193898341753843970830903585333
- 0857183693113650370081905654504329842209938149004544540044861822140550605287168313414262789644169533
- 3980296879517536667847550967256739077347181693399759001189891113962465206160718856491192664269401606
- 9590616104437801498666998284332465257608825710108991959111180835030365079742812307093951984025480169
- 4462620592363635107199014815677440001231307254102560560159316840532816997339070715372088090132654154
- 0840848694648513376227482849916127474705322255057918337197829980217375914243447148663438084599101392
- 5549446596674237301191215691048473306980508171297273138066292296784931657070031083055678897912329813
- 0375103174678340112081353091466073367511876218722324789683703827950123954449539675885373844664134720
- 2470015885201761312154814372133479265672244691795625863300306994583628910381264895233888076384381880
- 9211807397927683141230868809469171765526719713411290271581467529442762521329501543011533690389221384
- 1013378832753935920209051942093938979412893807659530870273550773042219114300432566846240722890340217
- 1151273168905339467851873822784851582247048412773926828056517260376445844006828466737354482592496916
- 2142390338893181170113891315019222854107381814522925921851485752524761838480775838298666675567628883
- 1008601526358935863571274217772895154458312934709800847178289672734129037076071597089783899342792625
- 5738188956319405072752087325999456545608586855358263133708493406413934913749179077218228531160094982
- 7036679278923587884316084918389533623615765768334222895927023939153868119581529960664520818861843896
- 9720018935678548949422165123610171847376046060382961644273311730402586998521537216477536320660720612
- 3292932396240780047428067808124542992795093505143976021192911303780217039508295099069944393911955003
- 4072157414801775922997193282716303971339380034926791334165089113946424796613209472508981957237504911
- 3312916698427371148958662864933613397030362471630128321007084152026276899630681896952666694405167511
- 3293786905003412004284173942954144584447541246771850871030194976373064645661863494065661595559022203
- 8813571361768234778463109885474803141607518313054403428112703507195990142030588149232148841293569445
- 2964317031319035779377391901656912577178069851218011520363784718232894953444655146267846820263039666
- 3019906922610623240862574936674402658139719248013316060412804309403011781839533845697347778755496505
- 2267198920398064650880987659599040268354582908404887435901210248570719056955851822996481632457015703
- 7483350716256177878402602480795436431427740975204629600770595232159378392656058476318316453946086912
- 9139029707529324575283112206316530779455997093588019101795478468222029813794967339008709934835236592
- 5215317478091492963595768036416453157419840829497042403902353402659221352598530803324317858577406056
- 9003951749662478311461547074710152410927099019069460555923968305614807726537399849961888020452613695
- 7223089073682258369725346732930434907962315838626126344424086314103499740365508692160500462809793942
- 5957370775224212775596279285841773136930903645943638449398233929185489553676473560878989971977807038
- 6620927463185198508519268526245382587024957380501099381632387082022856447402189035037020515868245711
- 2552023153087809016194370538717681644829394491186589768122858228286305889861029605283254438604524159
- 8879043704773773713685021353938226539490234217108897837100517498175970206868257027259712399904777313
- 3208906742112120082183986777870565629424693820042378134913066630287587520925647732731674636966474625
- 7061200346715640903478963148186821345980612729682565455767498591972867379753810674217385801948693932
- 9232978545561007900054725330516708185495508295733164530389667280573878280582588338674395672132016122
- 3642719023999031850697809484729803770517200091305626967205284316649649046311031340090378152174924340
- 6714466245262478844479703267080920479660215253622977798413035291824916677547333861097577175208925700
- 6270953984192767246810212714644651636182903867855736355070011836724154289540477483432843483747564304
- 5274450680844294328800326353481326604760172142269400349628563970257256283718828008954760238666306549
- 7470453498437664038598946458144805319509199259451498233613653904412316740712966326187042419884078656
- 0346889440980735651117190884162131337038328475271580140233374087460550901973370836047200902016509576
- 6376037863721883200386390086318700252115943278393284792647056206906139403648830945520239437276001155
- 6448767844754083561603998488513772923034323530097939678336983009127779979497170462853141004353493338
- 2267484965817752353127196015906172828462137140103053343920270345130194910703446174565771792191324143
- 7364969396904896573282575669132764531083445687159449900509202240475799421485141392454572532607827164
- 7130569958137234896227241015135814633935985739176240573446271578414318958068767448800803490104731595
- 8190724146417291159828969702593777767500673203833675999208981411198985757705456900880667351053470372
- 1329348905545549720535301055732469661053806609950070275475226267638316527252791548331453619391671955
- 1030251519417178123912448276111453221886677717673417406452378993015037104211023223884776937314255347
- 9838888837413246016948494522990510710895587932162056322085156530074079505592494459743510349190441133
- 7915663666177246177234250577135160442663034312685087965410397347392745290514055124103029836258933623
- 5834267865532047780753909090946014043806764382911478302964651821538618920140071149455186269299132473
- 7572992206115252478291665457569566383251147867252560975782740644380460707154246177387337680719306797
- 1913031072597471709514887374746950349152024257187438661942079828728831057102815793640271463453279847
- 3494139024208229738660143735485609080295713469226533118264067965254434989996978086293470385536157001
- 0379699864618068028932857297252901428290197040501117093960401799400772790730059574064535923916663881
- 1445976418742692009378297052256405569829948514511625396658674223630839350814877821146971451562642183
- 9723245197256393926186481618297743853241064349252541686264352270431372380466259855686036939297507794
- 0069921092726870253264588061666922557296352244204858671812045093427166631890519262450149084600688052
- 2350944434658274022582905129503049799614016607725564487461462709786889732567210192923009824547654380
- 0864374001097572366609241372318680077447626862945263917248970267674567927348695426329629330779938306
- 0695174258956537533033198251374669746258716171967671157859591293894641900519594231162554265589036040
- 4261172499890930640509531999646107199705169382815884249161492363960011138453259171654027649547661729
- 5659031279164951736029421362818726459267767827689602966497224763374234588532554323573191763216539724
- 3501468576239165650433876800210156944358236086348457350102531746380709120581568187968385839451042367
- 9587670566860802659482952325594202921026887529115436922289471789836330628408977303931369921911471481
- 6289438323424291014432554651237764299212082763929737715940641397405209230530964078416316554355424023
- 7060821781822992158282156540176766976612089914480600595299065437623636120263059889510077235755651659
- 2197145167836743551290845111362955595308758670837780019199618165568310045570228278919161302403618351
- 6412231627090454293979674128235084330945220216062668426891971808149654830769221468092724377218327397
- 0929550675247929813115669882315933109698993912254344793577456066112690464296564074054192882264785479
- 7979744559229982135300293155312717617221863197089822353116106940684881575528948162082091816672481312
- 8908104623769907013229353284450081408941518931109879654072146182757480558580243538161513918772004445
- 8506579847920254569441147796639922979053202771302349978644034421824961632018918118043264783111515946
- 8111481647264547761763497871308668875695297626030316668412146343026244079468697828598741839503171394
- 2900135590877225577053738582054889531696018068632325879151070588932716859422071560763890785976077655
- 0843037319077176693145523913518622363114271160854458040847500024799875823005870882654914622078726726
- 8063637453759806741647944848149738923875472845934387527928676644327256479556156983137246251045428885
- 0073348951302504367500924192903435436010856692082942618503883972921380359209785263348133849959272530
- 1325821086087156279941191224265330135185468301475883617271648821814983502877885575396597889061068322
- 2861861952982764025772256605724744655934032528658160143865185373616114163075572970379994466511411405
- 4079427147537781111425513397283496115287533038864432816081165190097196055850403199345652798222234280
- 7299181713054322774875923028252948026550571740861992523706296814981242042637768598819539599684750680
- 1203170391350760070019492084836887963851424058353860689680377544207064271651941908844817749095380525
- 8104482473913499622829643783561309374571147615093589594579265351844458244073484489100939557560229105
- 6062448456125600438212279003427907039318710752380856389211364039358354010582073711565980725630307728
- 2358517313619370779490857099847401336685002084129819112235959696822259645458832143393571194834778926
- 8345889740076030693945402135727476634284866657596679093779764676816301584881677064603897065832759236
- 3081409299550394583781385143772011353236289264203778348412135950821407271208953373316878810000342084
- 0576180389037755660267923579426458250463428582640582466470413641994747054661183354387910763314524200
- 0537808999550347417398247970896323065778806615087882093271595756544842616883205894028796721171980537
- 2836240656118907999138028832094343311246912681414321820670235390665254965636176151324015679568910354
- 8807955825825328000037407243165059153059069416552440264422265534657082709714384284185626503226274931
- 9629589024754165345761282409353540627014400709114820954833364938657662856625027302154425979845382948
- 1913014999381683903264080298234887741471682495878481818005552066910156137025327368239846402589188012
- 0337650092064772911586849770591281425393646332561493813809881934729589219122373029584341575051021773
- 8760027425700671307213271558502718326316567322974165569938789693238288866660475346398736332850561625
- 4877385435688300572624974075468515505447792066495159632292580229326617229622139077254749522646217975
- 4608682099390454206571222320193765629382978088618030619528493132084967387233260394748697307938567850
- 0759409394786742549882024204154706671982406807377080366075125464173710459356950619561033855527322098
- 1093912275466544307152856539660824821860992013074825707698853489469154319716569722476616161766706519
- 8873444896624586286251522253842901560874089954342176951754103353363403734750381964569616208605048641
- 4145849222445318556939210460917094993512309706812433674499298196274387393132097040166953757317336392
- 4066206733660664354609510478033905319817058757712382737802524734990313350046117788777274760720342573
- 1481597071163454090918423175198274427763779402582949213724616142441229924935894614340088093891446700
- 3203465218983727289742397437971531983072961242850269656158846639448405567776686058195053148337097686
- 8517186306676495978906788870683150525108802156270017004232925652577553571474880717033038406465942131
- 3222560288183751881800277819930167409986441062719982527455695968061642301490583712942032835260868134
- 6582068661120881999425608719239598657559906884794479895728471897115760112663523321187199746658400358
- 0218134043653557895102240963230644670362396496910274014153840261860400252104070107826599150449718939
- 4637653897423395944478094125964467938810595401770617103493179060102858481794286927768025160634698186
- 4876158623370152516023637181787999034379595511508651454025879726423200572504444194331712013746825419
- 0708531072152085126939846628017711102642445638079158824956674349287553422153367398007018414596890640
- 6936381641534693733580413486216823628124855196282073725171164471004843392677129047095449821771245997
- 3537949895925018192667009919231981513968720392407813173328822740618348993689159625882779434181259782
- 2374682335655696616170703773942455538602130433493640075319533984910869963335613308498200462205237942
- 1261127386469773435298406141202933574769854283798507314230296086006458390203266832971066474859280280
- 7062228941198468523711846288178252337801817573627386563385765251145897691425173865797681334553312596
- 1089216796759921620047777736601739698157005189305563209347680575208239247093075056486535401470969258
- 6332447535240023579514208088609935236904979271649529733073121762702277582805843309927781993804392172
- 6811176593651677463485868115239136038172399380436191370870417832458368707326879275915124213279306924
- 9368067256716409379581154374100844743180798479818456229533783159209437058598793067431495842128091771
- 4693715998839338365967633328550845214487173498729828022872245972111003370678851957086364693267471590
- 6123201811286192207037816689825406153183076538439839566907198048513952994033311865280881232170777351
- 3270097093437728645069055248320188640544591213111790441279949017804606511934621383518200791941711869
- 4779020864787750881187224477634397287600533491197235765406868201936808677188641543680800990685123604
- 6326960994085099039694836217157071869815680859943192755078361763106352286244358297577723971617124439
- 0007852725787442545538826516658015450494415164016924498904268345734562617340205714011793825315539669
- 1786508532861602277977618284482128672946293714911091163510449320107800723707449634925691218904931357
- 3617672737075794898819870814803294560802701424574027992891569507497718776325901218558321168332456383
- 2463542641366304744206953390687461804874269573082528928549775570446553072537265354490916550585449050
- 0908073608133007772880591762113407812702207157721799184691999647647655001009776601727964696655224452
- 6699337699312900316835211790528327287495447512981340250629138109549668572838779529050442889661515542
- 2823760174491373513862739753898374287836457085777879177722829418378625092628139451414028381810712499
- 3708570349600679768563369686476720810794013433268992292032107971528543223093687838982497846997755897
- 7758416212889666118309718939561805589888734788223858629836061482819706388537663870236997190568879142
- 0015005893278157667955412656153240777511837016662680233363450787841366979508958640285849250404849337
- 9617118032804557079693217083088711762591995943564413971495282622098711793930564122549381874381430808
- 4727553083891726934629489967863754936115462433363099267699468701922308814839034814606660954452470388
- 3761208316514201007631833758934939996200824800998604628306243249049275733571918058260532493551274110
- 7358603022530576982049946002145986397578505832139101615820893810253664043283856221560504818745659654
- 5074877137045502581458868787094158414236369582539050044102606727943451061502477228062235096633157361
- 2514266794341407466520635345465839222611463235578393993709702620191622134738856245398302016554714620
- 8476297265257464268723386362315313553556816636051903571895244664237586619804114480252199013025958934
- 9990701834644312706805990043256138711210450689055750679076762563050384262622513729065225654942654827
- 3213499848416053950047182498565601847314490742691964574526581135702651071623877334688337258997786436
- 7259174115570165529248420631521873791595246448319525159806339460374218673502419803903429172882058569
- 3526786658158201195876069825239649292348914679443084786574974508366962329607901893079624458748437251
- 7492298595716781255748423316730358061373238720790093363369257424578919538675866761134125824716030708
- 9431687496491257167276344430305543587943967279839160550213514833324054482959124012187831340304592944
- 1621292750499845016709464849534409152471837782557600293979425014893421463386758834589638702611272977
- 9481845303444231471312440784982148467358627326536286255010397360301794632125535434232983465042878299
- 2697952507621176604162749698363594996032434957912103000462192014621172228858441330174290915199745617
- 4122142548151012748826300946974835123007217022380251636265424573166829154744421810027776127607297892
- 3682586116206667022106584256981663821798412038784102644877355661996291918779924348976235918131207934
- 2126285808524547143180977676372136458404335992767255515876687292681898646645773718156713727127327069
- 1744607683702302787924243821403830439878125470062137965560074412906471083531304202892912152146345225
- 6753566839681362781899954496762854591729513324623126862712073070316867408660159570991663158646522388
- 7456234496451599074979209945903431392149406798483027225457243051435304549078550468575655985031418630
- 8483486501057512449287567182899127645724607259255296433846454729452076411844381790283425846409298456
- 8121756169389359659757404292955715291507682970780202397891696925219956916743579510728110135844878034
- 7612045865179866632782748015063649022752319205745215355728802481958656569366630546997062951144220612
- 5550456869148032744860281726828102742488640261601893418136540881702751903632798220382703820898351245
- 5779035361653446984428513345483864352548108312849983289418172916120839071390684868789213810103679650
- 4435251204222146561436472201498942002143834420124097014662363438582726929610862525525118921290714836
- 0456679559516865330531054510197832165741762682855934691871492472425479123271529093087674353283875056
- 3162595363919968592580225709413045416467857239737626687111622820934741373839530974538562283954012484
- 7808174876622182715157013569546601451452768614882194513411059801959086376897851029047454766574382151
- 8113451025024651282130788257311518251357320827342206955041620563142444929775785418104799619444293639
- 4669739813593669111845157777992643506435444778907866885667636555675101330203920641099446748697238001
- 8901857712373933385189115176152917903357035783597959554448978594989542466471543277067082726518943783
- 7948064033422143377240478678694063066207205650277370025852374393455794943717575948222394848213090905
- 3923116986640964837350683077249445046879290633705387963710117044090375203852640296257030044175089847
- 8007785474006909831594109288735871895339473582884735120247775144152864143330152376020257165466393135
- 1516958028866473153834042344370579637648669804291749897294330983715121568619296541976790875435900658
- 8519119491014260755969465368844561880990145071492835593653328658780734465634881032988679671646781357
- 3843886039356754812673163834632608152226774336103425627990445807102437290860556394198440975135534819
- 3689894438585629536549986258860485713492088747953260910977030346501294040228602836133422350547868311
- 7531048043788706828828150004082704666900724460766081328348616471638169678446051551761653711887635152
- 3592785897555315812735391683028019688722025518660905434784145591634664587131734675240423205137846651
- 4548485210827433728001348672450682567941253261976165988765239668887392524079984935281412709665420506
- 9769479109091969184310175731322507064339087907860867329003063983535165159800074053082689602417037023
- 2670697644702976026046981576139529220964311841219908124432974534969714035525042861389842059873557626
- 5543534721231099641807557394304984758358977867534082777525594534690720294929013861369117193813173601
- 6464766254974355119237231903375664039955424477839442983518287742464123279166224872611661531195565153
- 1837930374483071056491908637692464303925333281823210265162984382479889408161531526098178358205420475
- 7574239190790661089061726333635275358836728525323566999568627018308121674052801800025536899293369386
- 7881167440777299165427880446784135620093629755456915180767133129637553148165799090729310413796284759
- 9417790724890998839946581298870509883672688417262456006546811448063717429508458798293125338228957064
- 2635558951957479210047487800990674713490817711659702787400484855846184436218804559755361397818771100
- 1600120973806585206022746739843219801950690953316230458982917616258601136021828935305946736287128555
- 7042048740358073801752241601053644920727003135873627446547077793526648446408067183202372794201434472
- 3474168049821435321906618542992546902783902394693675658550471520114175000886374437528098633553566630
- 5314474278010855994616123990295628653163830851747979431177026166211075066725911367956573126107906874
- 2527132102089342043068644265621908898010268788167758633391987936068177968001520738645811186433222300
- 2760660979237284918816522192627682090188547803894435603204243307256873460617370232452680436617589619
- 9744461169110304860590553199705636008633935746768254932730261029297265221999701378474566833692781960
- 3268412053872503967733874100943023310659498597575628944088749450232447104514115759283854319043656099
- 7944177869456505908673727940501810358913300780225183670471294785839325894520337371154096525172614324
- 5821365109492864963727906756677570290788108245219873727940381999502492852736340743617223491460131337
- 4188261577753944998175824449373817062049505167229424285374716677617880644347567422409659208038034162
- 7847256942682902292521252384858533734791367159246949973608350100908415999161378048415807766179309191
- 5947188569099610232560063679650977588295435738186298518032859284770413724366489514614505019206944691
- 0055451753162806533052264007677708933108986747592363114249211964737983859542557785447923057506806386
- 1269020901325063079395192221338609185950651259496621115675247703172613236327036342371720466923617527
- 2964371717948451046238560425822273820574669416399792178115941355964646929848306709201425779742380093
- 5295307642131187963032500338498464286036340724983128555939809627486824431957818590388875500902591367
- 5504375891472026058362137766642009090107059305338719095934833833029991281661449330234883242862780945
- 0374459419962277192591212973961871592020847315534698082291794557411069295622770746468292250640769884
- 4047590191734774146649892635236134717021650665605904732803649682439836851481673729696986157231072880
- 5030865542054653459983217996813769385218793864713741529934848299188089577576066975496074257348997204
- 9994459247477655065588130988577915322125348254266184290083358153300425533240532142124836043612819221
- 7295783844480015460029895050118238964630978560709107880102649379376565094718793225833884460889554615
- 2946266400196083891130912856890749524410992955918508708629877492462935098430541631892065189010221083
- 6873850768604495583670088449719941471180764413202319502904398729819740588179575559249432469415479940
- 5009578634649107893595827727866007415601127758927156974669185672088046158595689739292346460865182597
- 3480987627803273578312282423971491807934995218964891498748911954466018464859793933432798169521734810
- 4730074648312530680755197063807910667955898766453000450685243345844501419438076057321597242893329409
- 5357769028928132730950373344137444842404965267264912307457602800339029746726007190696517893056846085
- 7048624192192189552950120649938297904522189071154499699379144340897775117026140825840144415357391257
- 5268782112047795676433288753969726244731879032952501475268642593745614354879964023555025562412865641
- 8887114956390547794276858725041127991197852527863555532605490775416372818787942166756748578561416230
- 4336382407650378801560198809577238048798808776868188531550715521356754582486210745365289042299172215
- 6412432965485960404760340108960793000197018816034018706687673493011680676253758341019449395995975179
- 9294529013819672487642943530349403840454890206908114517035801938191590053992538549904281164432095981
- 0429725600989398297814280181586790336160128834089182426560769657275476319967224533077566356514988924
- 0332801785290967159121559220796605920051664715113084015747198573315595081493132744386096777289684562
- 8669479813650313566094452938685876216472384194726675264827978036461664616546009384320096386651058793
- 8358408749636141970634373244074406175963950405430230842045311689261869054774551230814292867131454787
- 2493672262714019480580720895607295402660357300016591846228694429707353592797791351415457236366805613
- 5103373594160579869350944593076459253643501294918340746568221068024329544721198860420889704487725978
- 5222935514414359586661710840576191296480249689572963361908106473429291580124923341595072790860874734
- 7297779283102211703600785545769509313647869059130192897508136820693747662440979739060858195703694795
- 6217339092242356878719544888707655404175386489494700125053265954906591158579312704816593456876477106
- 1383451657286356567308144810722413625202977151230115216366436175554153777313531260736738451161060841
- 5135837496499914467183123847817266127832291011902305693426788974768845305927887905349031050776142554
- 2996293875484175196399791206714877105669967322253891393223401564458501503835897166317796965033760872
- 6334162566515216857077375304022479440398754569309976118475950363021128888392344959267003790422257102
- 8065129805454695532114953758276649718670663197079169226050790892188740761776634726929343000028544451
- 7296016471890156412069943099861693668518983340105486629594899465690353605541570293708695036832258132
- 3917400113357891228386438186621427639112016762850917015801323940797165867875199335922606774097310151
- 1742268902396322001301650111700896408566091596419960202060399859516759933616460872516105373830608301
- 3854701146917863353802341074177249771296949823893347460978146663308890623941931970797684886220394489
- 6652185530855371967667509635988051779747261793032691283182674862057809265256529034280190882705901405
- 4663747001383302588936160171501548886893591056944044972172021139245648474988858366001193030933405042
- 4819094808467898760038276692181719086769660182978203559920718977804292361836630667945726051889605382
- 3472875932823011951586555180178283133565830986137316525935030805823962559082865729213865472195779312
- 2433591473237524037869082536021646294813204884573987051367246382465059987311460376225349778221030101
- 4542987511382244821367352673721070466677797424225083858464887294909600521861477477151996602465522606
- 9621270620854168787239515997826861207922328864955994712943920009967608462614452966881819111809448899
- 1955881471379931481529329582516076010711662495155659372028930345139657761202158250017927165821147493
- 9898252164131398331629215911678786311490350370804672911346756645736776031670447118722869777749372049
- 8411552534228368936469948659928163890293333295967050233310631864547159461989211746960440747930112114
- 1664974922769663879341360554362801356521885916919160126501703473492198577912155996554507884590280024
- 1979283614688616696872940673265794485514121029331647678050432030238929162094969940946268112688477619
- 4192988872830204532548355595645610497507526105244255809386273420635892776828442281295814647347367073
- 6225597282943726377487768399286376323453936634450584640322202749734150248757659910215195448391414894
- 5282238326814839805199707655926889831544715769511831555106187300676856804057123078324335686278130316
- 9868434085520815414852556772088289519403587858372024544781686346084119703605994692042050223895050999
- 0547462252473281286675507560592665702381967985443697384303634755135301014223131859665983550172909122
- 6635606839627244308404652362865284232381423499086766091580811529985673188270001310938215761913296593
- 1457997811998234263059141198338941256260215214745561859783940816914555513000175131020838255631736162
- 1545903512910618001537992129948114092826421522700318799959583363724143264712437805197524452586298660
- 9139765363120503485519687014261642737394425538704104093401178690284831732444669643839274132175880980
- 0049498861502455683932136997226039513159990952783701454801275952792565706687603394301212911978505936
- 5743941306541784682021900338105036071495296968271934082499540824216163965539009310071446388762031349
- 1340775627556205877748079843945811949518820071320525940334421340012436887461101510266689010672516105
- 8423245264855139823924004357219566830736578634636284713947718760514239870777535371198854467657293463
- 5846988478103391466784785470873151504290874245923946132610892919503710118254923184207210437942006267
- 2244936264350959550337583817195105443116873279605675329829161312575435682524564650081228052263681461
- 1597532119917066036435974480828856219322673936865606254293822490061995607753330652464844307273487208
- 8797672926968147974853263746082115171227217434461213726243363240118432918898637112347583073897410591
- 6818188166895595371823995831091589558651551079391105153715928239197272385189345950241777905515151572
- 6497570872428767944097314530204095907691738750096132648370745595341535133134490003875280310133785644
- 1911474235022452362008865534205354859562097776348591737878062122554402259252738483077651799963738230
- 0909619759380174752578307961563233626646373083895738467111670927506441574763282421096818667021420776
- 3268375526077611108988944964673277534390149108961636184144351402764581222896050603815546531573231035
- 9157359227589113492569009356071479776887007319541022834271748757490709187163047623887234096963025340
- 7824746509725002722414526033508279170509524408937573333123198203021541635078677826550932171378171231
- 3716114212318124408063309815360743763950265425574723877774795160370760254863489482815303352021941346
- 4669637514327152808029100281629344182641082759195249518173693711365151453769757463035503968815577039
- 3898348715498840132387691533308860839615203879265983426272431774927686269635413106846562448434931165
- 0896687484469347103405348229548440424944548029015008712091167917658606527872481257977534747880316689
- 0035108745856817454970704973599571133983455436889482161005371526145300563991242445399625803132802285
- 7815556753370517961433593548312607199002585111086675429079991703537006064368388657603432842134674936
- 3284798134599509524459413666885886365358016564396724558897521380576361590214842158335086871769121384
- 5760044375608187454847305378791606854309384081019497206105993813537730874309360802543746183604369148
- 7411272220989011476728779478953951733778941126562046748007712938053458407655616163671403281364506738
- 9621785209078922246439167986043804019848760595357572978480805364654179647434163208018815226299727917
- 5361841901057253910235261006661285793861284828721151144331217481644040056183601867286327932539692823
- 2426014000725989950970512646811985138070288116929747036513882781618018114314687279332331454315102504
- 8027376973590692969718888934545315353695151898759688924675788779434750697095948389187091999856782139
- 0784326370316579878408076134700595423153306313562919723476311123701263743716988364569939180204023601
- 7065484741044827168499151197376191570800687543188967229491535191956193124787701048836490034307122021
- 6932716448737890748697168890556697893495574826859945388159342379901066924553808660356930934748516271
- 9970008372666259460916369119186683408760398160534571873044883787844599456410661946492827902987144851
- 3829662277069771018679726274836234505524986843346217582535199489358389264000821604257858150101486886
- 9194413913566869688314459862119923349722584933741055324623722317841154042257919783776260572497686118
- 0888568657979800450074365599616849105084972307353455998115616755131668419573344751329229644291365157
- 9966325538347945076610328968486987628172465341810383001694345217588085496074784900756730397047497994
- 1243512618421371502775616682736902616881508892134935073218269322806605182315763054160723036713898748
- 3779334050158419807105831531091345171439567188012503059886950631165440619618064708073612376753683950
- 2282439875286051051135181419197379569469363868127453165281063503834682835738440551422934800799366821
- 0804493606862164600676634483031922495893155954045816949724136805749636567933079196367152569807186187
- 4731197459621434447874538755676792302136148597286303389418237450498917697400714288423976680628317290
- 1190857403250338545222354033759894400897932960374120546035438418200763258809362869789359558085094975
- 6506799535033458370680057239672681329462140754013128286368823074537737549664487670662370586745285605
- 2628768437103120859783070774298894233319665993370672470968952524985445820981439492120793934365568025
- 6945592260893704379680883059217354990280818723942350083166725862989891886521707048580918439451741645
- 6009022597384114577622103057688690926001961997563649835723155371164800780419034073499583084414551229
- 4281776021521049358131823966276787157371499828414080368819714227388302087450157398585239725106689569
- 9623496283549272734508268912027147525704270506111845946471828532054542723345159408698624119906327074
- 6182667956011701275258350864738849204602785712850234784675339031318786296649552070645507689584383918
- 6767906678569477562130037760802451808273452521432055160633150403699415486061306759533659716800235921
- 6089478140468185331471060954683369162184806558707134105519361745103710159921613619950970865013778053
- 3897593988366937873954822789683336138162870025109398023076921640166695991773931224839082644791280998
- 5780640532434091371862188532304910289011371610830868087486723811585974218156537092967446551849292875
- 0040651580719202828052992244416273543223825649525174246715774826896121618525639989365694450558351032
- 8185664131997626697439111167780948717936965736903761431922383476655463730888517770884496832380581866
- 1049089021478787690731157126141234536496390084269944708025514624680875023203989773654607133043284170
- 5373441390389323484250318168830269138738845884794203557989165117728792068933863168270043214700842467
- 5785294166046964037538411912376432743868418340633769086563342469199412844660048651217780432768985518
- 4022775180987901106967645819095323132112878909014976869469812633598854195455671757126766788371557631
- 2670276152597776992561643721030108499313035437189899247009395752824298729692241071111800967264157307
- 2618623927137157828061141430020171114264825848892720722572122032771300998294999206516489224551883661
- 4215959589128237524836062172044495902485756809969155862344381651671463163310048739229322622194319536
- 5465767781209844862542039608301127767452831340676229436884135422093949607182598326001355753099690969
- 1637349665597450373805541787929382030075698430766954390311872706744220840025986793092414366290522730
- 5487332037499318170389925641616744964935692665215348150771057177730318828452217536385509090287600520
- 7644455852172346692659704934706045532756296067906066323102672442059559496173835522058814667667226152
- 5390990922373470014065613975006335694487509687715208483235189794212322592920100695072008942754098085
- 7268094505906415482184309235205988084931561998371348630863160817753099343135682611939113131975531178
- 7891831559922775024846159670664664052848809211928532569954957327013366289102018529597151020987318184
- 6394428005269519090433002235567601977870530906642648447231165417685422211916748623508214055524163362
- 8561937291560265630374851963379831249371251258466854494417939893950361305635853814653497429452024282
- 8047303931963919665686795097812119450371518494839553461857076075329697620604212644505057272373623975
- 6574400005188506438255472818396964755953980263000973297590967668112501920350862913964308563802687805
- 4242269120670846669566779380842887975906633338519183165807333128864107796998027738812163216461819722
- 9799382327922503439232071557065563693152921882935546190236507169076916658534114162027868814520633343
- 5182444586927795980466279701274348819999836714161593004038549093477123216230853924966881367722657236
- 6504800742866450667231972813565442043144422054427955692892481651067906360543142276229820510603946839
- 0735987427441902527429805800573784246772140507586893275782389649330295393167543655826368293342278667
- 9969086201880895596168898194833665683085048883617646031216687630865949198367526097189379850864296154
- 2780131573884226269097207549301238347693325994685064488503584484386598349300601794354979546847118805
- 8153183483885467009000362390165675090985197438260891762970517516264463210468224004535486063995436349
- 9876179329543924509327532211671851255361710720256583335435269680085114896326771841394897101579682237
- 1232377799817045313497795344097553782240414687831031187320430287713984126674284308300996375651519942
- 5640823532499590528093660801770815480297746804698730184428172248913336690764257349831495301549179718
- 6038684886416413668203152784150730160382876090478550704679705102972376240049732679654044375743461492
- 6309232993953102138573340394654643138039328475460166828945703985202898970561990500585663316810254247
- 9612249799416192380808171869561768335559308203432917111861194066142459302341685892832540228112237514
- 4878383804375333860052459837715219808574847409115965605101261021357390877587448522307072786751026934
- 0595258400443876916608889983769297115767546444686686822582163159384153340218454302004455678786165353
- 8779006847964816115461477425676643466678616571432139560580510685249293020348631118769790675737306130
- 8658049805399624983088516297448323420918709324865566316859988821807634263361803803309370806856552116
- 3083570426598784939627742574272212686526087553770343242797213162471865621815021272100153381435276404
- 4674384081792139852471765606453271666305344360658788502002162008322243397547438846569080848229761095
- 9890936151291814324694190177542972016826029260693628677593944130399807004856247227074616381708027260
- 9324491040716169431127216932459613466992507264935833273692236372077527056795318598698939329745192340
- 6580320289778734716023174722746080557162944886163769004988028768178344620062203271019135123357703649
- 0080845554425576826710914815596736553858259438221951358015637711971679367020622245686348546905987780
- 3465897456584478524088192688309227770546049463556158414097453554239477673427530500839360542653385834
- 2924088679140936814423285879009223052915279991590500906519247441417091004770849988903033856339419441
- 0486439219020225662877398462669712962868737572216188171278212356334904715499470758868040594632498061
- 3245053389545238627255245644008130368634687268413792193795785077498902782431583827323503310967089933
- 0157066419524016404802598619582946661146570878969931266619486819119516889978571382608897201650221151
- 5000045916759183141379528429240162630759069281025915047690687227211554583699847244222110127830084214
- 9489854275989287579626814082842462027344811563776158858566660628707597984538985888539735915067846667
- 7440735588962117649026388773046312288150082414864035251260700750590426855154587308199448361425175009
- 6919881214717769429055846364755781593888066239542018937490840322751020634892328309341028237894088989
- 5317257072781466983925467615050901133856273474822826535359010089528178689238513054833708012163757061
- 8687637859548021488100672071140270517244681807607601299422257578378515262372980443754897446037591002
- 9399148776753477242411230998381469118795725444744960420094875863210496756226171098065703754579778452
- 8755506706813330119403702836846318300506680753062470647522436185743826977839833542129935793422513520
- 3492355031032263242244961884867197753558031652147106199584104062211908359669078979633808121363989284
- 3731074315823093529694423351893330134370824326438532789908261497650024662233601347971746464208079836
- 9546513329453775576622725244620507851699672019899993401013335072075807710403826558364817000188252048
- 7386269472797768681984124497130143674446177383603784505886773104155213802955114829413819681116530162
- 3559891014775948075941177157011650869218541147100498530766154450326362434342050527856128683711788698
- 6242284537112278047537319214048956991086183575809549838444566013084746527651201522516404600863882540
- 8921010246158353618988556156795455594341539377450291006612155870640166529816814549150487091045363602
- 3369626790074204524510787476711108581603883350490730198454596575431151627225013288264132732720045864
- 7504003597538841150858712366767330536716517667235923474108220556620738971458967361244286013184480990
- 0996619418551265914031244826821505050968211722386212311526523007131658654273609247852137350152630873
- 6450420970868697527750651953873468375231671703179386470783338125470305674216067595718124481724154900
- 6779553950339497434406511014026688323398138407299525779426860509803857100388472248482378758702492339
- 2172716067232378375966828065587790533662110909733434199797844334852653243507225336039871946098706430
- 1678895409084338318327380095549056808509279132189616199663626200962269637110459230585985793321394571
- 8121849704692397468471194090316286548267278160233466412458675531537220698657075888456159200392763767
- 6159553914381141064107128036641827384857021316647667552407500949113768318919687594594576779755050543
- 5913958847686279204416073899438660597048755736032076189399290784732570121893863512434504025611153110
- 6159816041062934721259033810339622107691013592064184427275725636244992188419296928450488655716808147
- 6678966093634642719375556300958026571667406069670450700559764523975309356692672134756563223105217097
- 9726788201175673384420258585856309958277223767012426195014021412415170170625748239199375731539805651
- 8447478149788507156871414235362443327302122681085470827797568225700932570140588369636640436028018657
- 3558394491847903362635015543240087944455288584149451156409427092240658840581570274699062826291235403
- 8024579975749327018239144762628671972800674151064615784260870892100884337577739685600881081369285756
- 5080184359309963392248748227346979480784064776775774350810648131138541202668180146216960634863869351
- 8228333021346613369327916859503079924691147833251308207669101517857971695866018579272996719400552366
- 9049880576522883405403829572329495666610618163109789226399407301157002457628374773576308183798161638
- 1190797360315872121983138196203449769816206423985075228327733732583324372882160597886109873551913778
- 5588140372986508381751163266745475940834529696709262816998084488901044363992941713355049172185304441
- 3612755372740438019661670623338297380240490629825860951393502749589875052807206731837864730248913057
- 9054815627366934203153365934803545221237593231989288843748037324107862086056224621755669140664965603
- 2562701524693947009851471160099408912835194756827483296722721766829934944453406790736552541717488658
- 3901039319287413336870559291380027727314775486977554119840138896045288554164615529596730625328830411
- 8555011888298415869115770818537363775060713350543268713538259132850979585614230274360395764960678598
- 0108937955654308759455387321323500760300773010791789640837991887086196320867905115889137412620483854
- 1157848822039592359433270452459141147350780545504033581903384706481014248689197256381168631933216497
- 6298148495396460838748495439694585152579518091162665452367335174501636083335297396558922109211569119
- 7831672918442579257575500403074904666422709066432242851324544080760503099725830217902579218216908237
- 7943883480865654516580322492664139624733960511524759583935636607443829936677311897124381434507144263
- 4906683367462679651448757604216490046578045668108976237352466304486513946482319660407267126392740537
- 1480600202881411947914174210964506313055942410056398778030768315454955071573005820147925159590460246
- 6115178393678560161253240627524204371192506137964850891981909587770580992490842085600103886023943155
- 7064092622965854619405990986964765074089090371020410737732283300019434413131898982911460768793479475
- 6379260766087148325864793093194260650376503122078960597372119426458074333932294645621715299286987757
- 2374421745243510593701522448697613048297775612559901751454759543095729786727400721774104428762419527
- 0575130818896669903902513418046187913963917519996106880395794578140869943557929398861400711417249894
- 6051202315286273269232409802703440393572135190345840288779882338142266098933184966747889266988742745
- 1477269584954658077358949663204319684227293905402342069936593465517594644019356968088757365135655273
- 7827558456003178125785472579739016890446296702126248612178766264775483706533502859187059393901778046
- 4717594243236240820479795837934985204559679902540515940494547744176083957797368673769058556479182794
- 8871367856297647036197192772736875817422061934212158392214716939705250724783165836869092120660602977
- 8144229145154061195058652651412881871106491879697943160479965128847403654083999670832363146792721324
- 4936269857074070471305843482632931884544051058661940375587325025731566527539290215236220741530144657
- 5930722750888326706370582148843196156531041890179125548457874634053818750561404423146119784513097056
- 5453691268255794448780425882950076968232189862623811110723687449921424691504040400313321866823059154
- 3595496718901355903146969137362240776144310312264860376479193926771749354075341625710255887112283009
- 8045539403337048732823588397650909521672656474725802054809063989279095949756542290618460679476258129
- 1478097037557429248089816541744855096727088920335142693606922157665634684417142514188413007346342117
- 7091338849728156826975564830840913326336717247725008190383325739818737436603642934168154160852874645
- 8725565350762115073088506880345696823291535406069272424136126383496243025222734822076674328244625195
- 3438168663298333351231892641537539026898020923069024691880866165342597137031996465636551784185225207
- 7400377550133609358614163704490921998912980817235962029538477316594515932545751276218265882696502308
- 3274877952126416176015483903845869845831937117209368199083288932591601683152378984175095542145657354
- 2447703079868907388542365511940355299976861512185036911858118061965525762964582474395494638849523052
- 2939043192083470040859590624775869267390038385675195963571883814773408191367110130507853555897601972
- 4131868873517693888960920970811996086393237611436761070356756751954509856677260928307830333384947896
- 3026102904982778516773496566301792404581418889016861103714921870755368544212842300294361846299784470
- 9902389209087028258677599793290024068740412895878180015512623850669835207610152581029222069185058987
- 9780761031752744058602314927111485381252502212065908659017820258780104224742644030508149340088935536
- 9942155412427940242883301635560084548061142519736000794683676743928913680375452258525035643374923040
- 6118813478986495017912039521392725893518850322747972830455537783064856392215254818172332080667252766
- 5964316205418059448070937337627385191779318699473024590811653170846477848979352443357203806146987009
- 2327006538735123781189355588073827614313871047732133065852429217695200986522155832270762404786747201
- 8538357834377022350425081424571284375657147968931036341808937329972201918567752838733601339441772638
- 1562202849015960447422841069146815777966019357848536075667691643346140295482150176278079402653275401
- 6988343543419531698259725727032376723271043885021457551160781078490367273413756850547512833318281681
- 8068792348394235790283046532570909969893392931956859422151042753161377858913302623839957249246256520
- 9238098216310022009938517838786291284754647499738084609884915717838740446198137448390687340591284238
- 3139922683550617309537760077334415519711344778011363671293049539990019837057605614721077458334412357
- 5225879819732015437084932129176882040450744949109305178697056711770114196561695487469569955457946649
- 0245988058182052267828055440063055171620109170645496657728091231282730371179344888819275752509942568
- 0572045715600308835125483545318216700312020988817566560248156433398561210335218031222038724546176492
- 7719760756163989992555884482471253975444199575287553381607523828907495794340847840981905049954722349
- 1767808998973555428169119866029105054819004663413715557369930816878792785736669646282662826784498376
- 7811270499161680058808699835076429727402925188906394922183187369232560399158730451177448334267912516
- 8538532935334055740695466163939922312566237332891308244660515960756818641377290495515788532889906154
- 1234378136169948046390831109473541619189442527956102391550363062024648582096751952056686309608898274
- 2416026648684310185357920109341489959132940129700809792093387285245068367706352271937561210705529957
- 7005685216547395630934014599507090684943999526109950370114911485835658403569443924401813758729506682
- 0507129554209918508765071118127238305255094270970180836733246047964391637119624816712878168808667228
- 6327543572199760279585502124996042934207237855661033521342883540324720884075362274770767226570322161
- 4598530848070143271133232795589627033533113301913893098742633572074810144260604122194998739520982043
- 1409400117396015001163746493739333742500935967983549598081681749426411617589002974453790246451001157
- 3256811536605504921822907182084906673068373474135408768646880362810534636606363963705084006032259444
- 2368068407010904147914080743724325375420452945492320548854094472777330867728957284483519930624062333
- 6014894657010295372769319239800791374246128988062094042510718216870035418271782469358852896936838712
- 3395081807112652032316069421394350441642211804586597284701987470587704917452361406216647182684227650
- 4309872213025329208062441013565190192429768319418422479532304887222761999981305934343540963408734149
- 4009836113799290104049021651980016965345105093201186528895001349855481579764869199753554001996239218
- 3037155704956611140749069890614688031627456504309292968564920493914266325600490954672462450603867027
- 7906597782558864298724579515518278895492937913618643354949560747960629939433289895607101850074129740
- 2790275983298534453665473738254430506492187558490547253663137453707765892998875453181707580339014469
- 7612612080121923648496013191453758738420887032773631045444103175204216817020249242468543393848183239
- 7201173367271437591403573249742190766283951872620948773642289035555070995680644813853912139494407699
- 8176571221767587769774137476930080385309241470259267309724342514738979433308220709198444296349368273
- 4555999275654308492145005895949858388972194908048002110310107746945750302798672045602966829024330049
- 0195865656152338506601086085247051259251072368903914426044804191068856917115605546765577541313378467
- 3435728191355792152125244163426728793514579872623606847687942449245432959375932256803824124308040441
- 5170323303546805930255459808401814193883913099131378039516586688564053442504597686306846470385293042
- 2812537128881240638371919682513155064045865821220270334452515002455569718520449427126617557097790765
- 2201631409924345624965823463274199966965919096303150772162295973794133044906912354662899976787063964
- 4275439705307201015678667651462562096649852069770710283319925355222101790715425549106689098901571435
- 2252320882493548326405825443322899338818143324607762021192763535560554018124664011806449074865679249
- 3045753030540635899858103643050669178836044633760072521059307210192292241895322382915890934128228750
- 5109801463162395736714345765411805422274015650441113110505863376808693783303841959694538613373289247
- 1602532229369731322493799729280059926755672479757909534963414170020386634196145344182859054952805340
- 9997763087934339975978910568604133901260650786125608232043804545448631332510663723910133243023185466
- 5265092939118054325741690275954071908417628867735299986425460585144807032455850880023749219853889982
- 5763569046940203693882744668184013998417739780380225429149259195749277317837957450107291618969993288
- 3137541980767264918001306438990549637448406914582846426124204961678749190028707996979188534126248108
- 7950554207435264417947194040344796510910272448179190320555977587738427273813105814360328119623482496
- 8770668087190298872341728952793641870640694846398010895643153523342290031479810166843136947919614720
- 6097308580136150705516651333914433244858694690120492477325571823058188574716991463603187793301384759
- 7598611209617071626757731572976133468570481409796915486001251242060298788553533764784651123129289985
- 2004061054006583425034516346856303094050978983625277393412354469101293626170198997139567103939774531
- 0096305490105448365702167199187220346357563638244111617093788893854939355612500904793637171542240806
- 1034381188603305755612486733268456069417527934409497025997743501467019950271079144783210978457155621
- 8883274107109765306341681297933459346742756707244134694314516216704733767358268531719605428171285887
- 0830159316048841492190324363058050330721966018280900940432717917990576993235443881050324067491860691
- 5784062898734473767092342257822449454348280812656771732125804023869289361125565308204506530663405614
- 9010369686585620638108841621125072437468721892420926302653347648510064882401875311077523879905191475
- 1301701155512593650950277663865604759932677726955347806327049303948934897959809117789256537443265439
- 3742278506271653261710049130127647658588781300480840711844142690290625420067897649616996620372407499
- 9018383924962308016797133423606997570874906266593733463493311747238915673444128676776285007328674289
- 3474298435416914069489814464185413445247285102226600079613809607527010407727596892661516744436606657
- 9171195189270912069311570060784613104860095902797295146546772338319753003929982023067750861479378310
- 3409232516679305885809444971780201240607532058426904533209973279358065620778914455124440482552693035
- 3303513359014814445164701717409678054134220952991809060291260715683392766168926744561155320928000933
- 5523419347624811687507833375052144864123004693591272455168409493435643592020840086639728874526447641
- 6812224319790057403767520411314593569082948636502886651386671870984019126520871938214610496291771605
- 6112413262298472918197350192326469347606735917920473460195021468502042227254990605003905271739830882
- 3934696132954605823559616885961443855177325568257200408640667157261428742158656293653466676503053994
- 3726433777117552486333465468661747102947425707471145240840693574593305810664791058725770870394121595
- 8349720801434732021667320029592177831146547941567632358090159344983934360311394701960236806436471015
- 5265483303322903249484887401748716255541784323459835831317368567411948216488283219830392937820890066
- 6864165635632999002589124253674659874275784244531350568116333665037981361610334287691399779093956537
- 5874699178205295126606543587480249531054620790828692382531734870934885092202989974921677075930466511
- 5811333830478324658453779995964224511055205282259855135799543314078046873828830918171688650474647342
- 0060161594458175927648783175100615405715334080277700173393486915972544835849957031169089050234790041
- 8269611277438910111368249836511243522173294127706038130263418165235751483500779868261068935781083578
- 6811158166380254286394548824474315217144653188212265603371686438855279490837229672715058599839020073
- 7043520451962130066826186389711245753979831674835802866090243753365970379553017428601709822852543466
- 2822605029782281922967974950706846947014111471827123771794543954247545582317637072002093952480305502
- 4861529194258380746445612475663032936211194064385351261733638375785199093033778956350709984872647563
- 2881577185877829735370548456218406166516380521163355359561571365548830402308390484990534640227536350
- 5322131262857984748871208797423919712980651571562251453573762296496995785161894725860193048018878841
- 4077064277898211155038934041729907842887791396031909094756427746282346450496185589571867270893050509
- 9175082590601623035608541002615065995829409418822317117668561034310940901519556035941976295271519144
- 6546570114627356476034166407335530107840661217068804877676582960344592623864758557477341228559099455
- 1261972615033569804674294654465241074799894679978464892745481446292704610242772494517285427202517075
- 1372587973508902883565123730751402162131170264048251331975042822098951384552813626884177326700882525
- 4317243579889892752698716039884633307640274102072542860753914632056334190051780169548164179493173488
- 7812244472518611941008835131375554904941816728642441721880263881656275398573336004110595994336004451
- 0938252578802766481442579095548425763256667686186591270514838980441597550202022308442316481714578201
- 0230876136894006217159186369664756680115058939506917948617938811069135739111929119476457163842439850
- 6767609270156013876254738775551308216149178633110756769969326398363601998430563988679303503631101462
- 1259261823243292023050487397355510388061839630338392022445021877806341801390292508001654765599060390
- 8806917718524407509635151958193085485349436375269314283472601286321556955893475903752173339569860535
- 5818133404046834587120394074492363546970801353967029689205641532705761785074369410421620028138597409
- 9445803948437171223780859161062547291289418501433733201139419237769927284987921679570485720848262117
- 8953745099590160573191451033015921950477998616399735136343018127076636196256421829613557147414196825
- 1977845129239951809480276157790515052996245646768594108003196552477778443101848753683776930481208594
- 9347514957536351908366451038348117838304020087249543294359801839909611614425208081024615483437721590
- 0747465469707895682559178102153564440601396893159844515933212019827378778074605279848063188533935925
- 5326405680475871392736171274390494442064001760465960097267419950111801944219947030763868082018915210
- 6960803373114792754504691807086633068304717712769938884349752036150838640309236770796659624074665303
- 2058855795435358985947775420846585446621311741732136381937611174526719845377107365956594981659688759
- 5352725655305225867778743619699554527008888504312759094143302364295198309281704636367105770040823556
- 2634578787478523448239984694378073980038821035519714677936743948439795042261555530639372957759761213
- 9082829477616090698661599524434740720825487274741637905412032043763264976757883944911594852617550814
- 8236435201449006844903755254950452871127759024402682896602399138122666872871694391424233569071672197
- 4852985490650286693853139002780062228105465949194965767734087173852622258531958476574101365001688354
- 8356236992354401223596936006051229704848086706559828336254616249888405808056838747680592416721489925
- 4667697070427975947074439924019217135876892945577148244404837002827609384443667265579592053332863638
- 2118343620277464608717645601823692049975214261411194950914136593993959888496873253905456168986309629
- 6277455693159627111291389068753371428581683265582291531673412889027734335549344788683553410612823002
- 1846623652602520308299055735996294121284036158487698284476721665060508430933235779163412598672524107
- 4116285556088741764834982071420906963904058285391826216228998268695975949380590488575368152351745149
- 6466142696587956201997664381005061504180068707658470453477147005963307233577907943767064211961192058
- 2425444418641308896296689603339150013243279609922778353395891846625759931945266902421463659868461586
- 5059340714840086040303385526382246381589158118363359664373818562104058201328165698540316735563816301
- 9680564587348039675160571644904016838278201603100326068032668396046855898129134031175368012912557689
- 0009703604992591452651397757729834685305855369363518247572333780440075047551435090756127219522846296
- 0672210621607461237715153711868850400371478628178842646139058053647502894690723928909472263625662125
- 7205691977369329031393413587569782287912428335072502728595632347802504078961201978921641323874369299
- 1691397743472714978009964967297895391487270489581227501458990446238905869642949272303541293353238761
- 8921156458876442971363897816413221384394558034626557913144029141250116885199892287079988203332745885
- 0878739620195842849169998809625666397846140216095059729972870961243304576253129268156432918037383948
- 1915146495291988536197668964987775347004098933337972715949051939180303124409381216360642720597499374
- 3009579616220470674611740857341097442874902407222407192008491185818151812427633852311408809193386990
- 5247375517969791533483698607788473417923759000206964547789804654420961655824545657572601098292794621
- 2016035864590980012146110812974865267664937754855501638009363914403874704406807417307111491203955955
- 6476378636872521258664199651815527268261024910471618972792199637288140577295437189483001292061255825
- 0088095864823435031158427250447144179924088583160443635426313119988381503447473273977326572582918374
- 2486825322133620191484736976267555076004784747507130263315279144246484583105426179273255959789950216
- 3649805680167217023986364221513849136789469665189599636981895289292091091581455804158302963877917869
- 3541218300409986888887076505606757845234883714489299580313972269250026344239337293778361219989460046
- 0805192918157365071406052132436657117486518651095866553176699331817383034483252372392809606769052368
- 5146455827238435892090666957383546278011242910414205647458071394447904816658809815878347299839103102
- 7522874694740469677382116151097247127560918182160321327115448287990220915809954467179102398577577600
- 7593706623699315285106178001622280013068950348282438059889742807809786337323753673875156399625002026
- 8891715608720568198038132159271334649860797832469882632505217246773232158505276772769080739518020633
- 2392022289351307434265978605937025106926387895048939556321921166611355155598132690575754094401663689
- 4260092675520406533365539514595944303364729869725224613028739834973048301961869455565752979106778727
- 7547211347230810666512202661837023659008353118127529782410474176812005473285408824483885466837414233
- 6505912599422868792294835077262714575470462006165094003489129260399554319578326832004035426871828068
- 2549652538315835325773079887414298463873930588432411167585453287548999719550230033835213264235652711
- 0701750793748806830785603325414601943320967706374935741539533003747883990990070253146296598041526455
- 8977993948764754107248509319276032948979171741362137841981035068496164039387135610981878533506494822
- 5067534562645152529774032989275375616918174853755507337163704805113108209276849359945306955812100822
- 8531454181705533962376276768523646265893677373342803558785781280821115743061979155371243564354768881
- 1631808683393775827893152246419954930016978447909000797664761987833614645661921975754528302389984112
- 8019862103849883015774370873841082808014473728766681903237096742894197093402433644581613180747722821
- 3377537599246894948856887259048714181460237646959950801386604347059435174986009052318312201394591848
- 8907530401736869961254394667213996723140303493622862701101830211066751111569744130936944850884308639
- 2094696380055670063404787656103708240980486788426585055996477627529334517217948195455073849381133042
- 3859464446390168372344019907188086077474584650233245520572489711651503735461248395335503707166335469
- 5583359220890033148110931050356252415751554607393244446202438951629450718397676169870974697327731850
- 0836328590628633813257734717679708600828636578477101424365570873713729405753606851996199014232615351
- 9121878183240382660104099322768038702518282689905013928749433754762826805592644380644635852915698379
- 7510240859940571555962016906118060638530479462781011636883711150185564208324098816256980545241961108
- 0501075913425742311627438861264992086892643935521215084790616735964953417920335729931922987009457311
- 9991169784226885366510539372307341483362776594610820275072013548479905377197752110208021488139107284
- 4348389583374523960791312644616573885318211704659936653431264959034724197008910572073105140310031420
- 0160783683427754926384781255572681147907979017869070658706347495144162525321346591354161159377354271
- 1274878442640103209138695354514175104568359401016226775468370908677917638329951341468046889569352868
- 0453620097557985880107544175928524296410275443941749831975845436916715453758318798583064671534276462
- 6016617073652015024125094132891717472435772793642305284204915384313671868862378670068866990269549824
- 2234826535568866776437975758217353681724178526139621292352814651019033040202959808631994332812220298
- 9858917413312941254825530968687233116292184678213100262026568569686333898603114906825151840653582620
- 2849203691108013004510658289976889398622302002987302026668239598343372148343594114186800944102423948
- 0597129516215285958031825836245884073891924717130756271362697428833359520054337402297168977565143850
- 0239796312208322968868544151807687575048509919864160038519290649018781843282607380365794153750889224
- 7333091289023297839157016547098990259096337756258327711521976990127206542767363431443596338669837899
- 0691427314298771210280981354038990518196590257528717110177255359810918897180596906653462252559961087
- 1060290385068261037365951903659809459038756802348958120983781845663284751012262558117615391139727878
- 6965663647603878330958458695212974136021230392623072758316201715327098091760294702138897544744047645
- 3541813844023239519271050083654112614498747762957664613152927304082624646701708792176731621559023521
- 0339715859547058024228382702797149401860222887247744951501920484063908977847063936837638424702769184
- 3714011326399534905539160928436499378627081492308485158569104536572034214111838272419259960984403071
- 5132883908461395367071412105272205061025340510194029407497595745271749295390793858606386322716975883
- 0913157754808342730845003458209437567851176238291813322850072395652673288180902382192834149414495655
- 4284260221379058861020041883391973178632547226069678634981468979548112924564919562757485899108511676
- 6023520108670357206241041911139896508056310177625446789940282116489206299309939504162691936328525056
- 5907122368264291345975000114381266244639619402922612493139664600821783860242226340290988260707141310
- 1340225182292518114507453249611798278098090904059866888739465434533741529283527320684520374228670618
- 0187577441930845756845900830486689521818505462058364007276520648231602447922945765035027161024023604
- 8276091892925914186544310797306158572168975813014599779416671685835670145627974813776287791201997077
- 3376009154885054854373491910724448878268507976727424749887750371695099645685066210523598133155973577
- 0965590640499957013762197929214384231902193401513373371463885699756025752609691992041679698230878351
- 3389340972127413617967133318021610655335147840122718050005605899625441087429177105963861488871216534
- 2027420219400108982349163214334109664552364564157442547616280614994862262819794712099533265692883575
- 7076874231482565476213966576158701886088308735206342138180550809538710626433109792183401239101558732
- 3449789928640434008566433244035520634294570835086745978222019072043491820981652741547556192053287163
- 7706698839126538932588300907859330973252798030071390325461116679061262209148495864246313746047429285
- 1212258409058847153194384311331074768044632952910144117885336084147241830788228795538892654286664484
- 3467401260175278300532377950471739461989498412658617883899732766773092597723637251124093693571530993
- 4453343631595721100047780613195625664941902661002920527566702498156483747966409720938614287428218067
- 1772944466864229698980601045005527182047419353303659476484286197418817359912109181105178317173557233
- 6204876797734979795164258297228610893435015799839631133567144207775122452215944588812353931831789842
- 7767907761957475125202725763459241059992691541859509460537709471536644233681603453774944782038031479
- 9452485419024158225473078010510922138304388873009741595897624392851682724173540249533525649788361744
- 7651981462148737973733502013899631749840480314174733112535768108772820544027530157949921224822818831
- 5859903217642180857611795898305076310457939415167540135991645960889661120356360724099260713876870353
- 5308360231371618275879494370788026235451349994710057516165840831401814160964148485556955730484032393
- 2205248542084091772149915796670505394094970913094260358442410735665967515059412976505726814953177565
- 4706723150313046360845483584572144624672088377626519460492307291085755171808704011926298599674373996
- 6703984299785629244915783679456050193823228919978420229143846192877103398117953279196400870648499992
- 7364161019298282836441987022831823536960133729526964003143205504271571656300347801719246420651854607
- 5681103879480426458869192365485930336260644027694822097406835423424397801948531719202606336030218984
- 9987739570514319242794157428371466917177565362215383803955612588336253255619898881383941315190594078
- 3614415697879733902202666436676056612603417723852733817170074654328762267357799173442064014595759856
- 0581198520436099074878620106330950503989497135317475818349436118333585257563921246465585146177331430
- 0998747082934936630501465316745749214912742258220888494609209423211433462825171607831824274822368063
- 1197587626810722779638741191448120760796135398449987832458778085584707914035804032279332157013895936
- 5817735396784757753859198605907702571498519979291886207175540665044143674061959756902461075245136349
- 6607249358249381528623686592641392363275844595423516530266033702306645558408623065624456971108791978
- 3006102976488461105742426529547417648662520787040049090179046710359849647006034864761711029493672651
- 4970098727032847990599934789281851306023690074930957379371813869516821395468129591464986234149183262
- 0755026387682489509567486763202646934551755102928182498391196467909182393524187155525228632683189420
- 8769977596787361174983485889930089824631185447842241011310191145821330652805811241230053589649036369
- 2652436919364069404865160756328368948571924613377198958925336526525704820267206476980220983714151087
- 4808272712145526565400494632261371175565225578557854386204843972745128112469893039538513275572087385
- 8613633284515498099912162217608194229832953752884308497481526598950959603170767549866453741376304678
- 3260728838516515898281905983662442409841239767543381995641388773390255619104043407092540587331227195
- 1500439073325700740229108927106398570264233945072301662562178032650525080887920390398302390563040930
- 8301813017261457073083950018428619529012573812442180643661159699702227693367937704896765160022948925
- 5184171690301299072120129650133350627007142276635497411119992198196646987095666400665324210039471451
- 7812910000178032454064536894501473949749005669062242571460680569254946226479467048866362893504625320
- 9784701286810903059627837913196010909078160372575988890915668049431931958905969736237831810429437253
- 3961007287257463297767480226244825115785530275005860141541908753722113152887672443495488939371268118
- 2357650797573755918622609547587939006855053792263520713017519988485814137391208239095529104948088632
- 0773452653449560697377315653885478357543068230985809033063451846343524211935900991772519327329122989
- 2982399848033143071342088986768649183176648276455164850978318312757196668594096546739916866673803114
- 2877256054767215666764458975682178499580369793880035091827535854837351023803509660322552556599141555
- 4441736919449621569243311265081247949877523397160098964043204516324156612432501455034316605675360644
- 3540198147107297747801155023230507765864292355729797955055139760232195070145877926441473921211871557
- 5931178810856734946743677579086970048686007610485539674009396682669252994853769134670998340658310623
- 2213642074997103676648809063665818289088678365447656052399611687466435038854549657939336678299942212
- 3905754675789611320021463888751427704284851614103790853626728543299282619009124004269300184230897419
- 4723371882770765364599634437675073059724489094684373350253686017508317203951523600178790732272888524
- 3637033300444409278129059345368663141470104659341883474689282629988236301306013766926988217798851721
- 2454145733784882303824671916659511051746324312790315608741488607081554831102132540133568685405588343
- 1018870889387613937325023408807965938201480483031644811231762015402434502589721776700525987685752911
- 0799488761703346812320199323113219287434184661259987018174656117914611868926837025201652991198988874
- 9488292420616964965430894423463417530646262066320412705247904652222594748526298821801665103773915209
- 5692571767605139151290790833063089131384670767807136082989918994490539984327494024388971060176275164
- 8654324350417468217404772053579072978819030064762179565605159378531746997543678504299622806859383605
- 8350652163718143758120359463898013538578900875386377999442527513971642857645585388150959986542599611
- 1121263525218353737540893838299407147671947955656533381033560920916513587960431756452149002108737452
- 1940701660790742117146389209287184760160902492319110422671510290601789567464238340951983591142408642
- 6457110707485300762498022067363837798445988414775150716229321920310260500551509076978943194378348211
- 2231317197696873083287468383293986801931916537026638200348246498888280099530802191763804197594627304
- 3423705049816862663146331381992449951350409336852132648622166261430456380155416702997567018107991459
- 8371430134003203497652952164385778342024804974604813565562787670014116764532765709159469878574710951
- 7077561758971954701469140528987623863446660752169184051529203706434167143445810148812459041088366769
- 3696301612214043030796233418792780707414554309612195098803307323271225143074674379294908470001118157
- 8721760472562843687444029999034907235233647795614826072754304750733835794169520854118581414211633663
- 3188436139304608640443812030500873747407430351981258795565121015437961854018176835163955314297889210
- 9793350644218922063827926017080859661513409231014455095980500497093334182603462822266136524578624368
- 9338287481808083116632140886018962793337969179670238926003951088492322226248791469952469448221322207
- 1622818763375411744071764408256359777491004984411315866456552169347946993853458952764802986158402264
- 0999942100043342064493941644651586082274972790568046591058023199814041816664689710703815899178259905
- 2443794164767665313637038164955688078417197066690888187111892963554097089449350838086720874087385891
- 6782805784646387301335632900560817556570518689835182885385581894187618464318855418835322055865514919
- 6084013505109130429643867372670176920946256840482169559422438162836317605490729939838290187707137864
- 8219596279582737284384930210765170111412097127189513677811336345225119432564060929092039892030311428
- 6931102996162897157416513531226509765663872541502188189457696063382654025201746274843313786593668353
- 5892728894413722271223237303189976271218756359030552405933440680406716588549910892233951031852280400
- 3163077793139388788124263739945766173505780454864709713365612269105452680323351709465782235132634711
- 9775415664800121647618915383944543827074135711098802738252435819294527063872430289838878623739726994
- 8101909956476339872677974381882407864696372061345750204043865140481454084863722948089187495333684538
- 3329185692611600136090526980748507788080971992207905493846449129981160445105124820157681342303697584
- 5979313525076499172671897835920462441355835396802043901129880820848792705993984520815145552771604555
- 4509166391086146598101094364855299583415894050113221759189182274078858545057370754171980793576571347
- 6422566400785520271235964984181478091852475405178298598358719450900926456203221456793600320098036589
- 1403659248029705970423893401417849408983405889420828137541084532719476594015784918087988412786712883
- 4697304445346330011340784244697467610052163252314696074617972352275188891136610847282504473338769880
- 8997882496174571432653895931989193809453735620069779566007329207375987877395334012242628246381176046
- 6552954932776015165444339879779657596421303648495380297336297340540953656602715666209562420401897254
- 1002690308873068859675832363484860800313674933788046988108179243487055585861260443351113415506834721
- 0280388630798842486479599344269107098070530828950651392898724560947408991150499159326607612639813504
- 1864212683987924382810639019024427167350764624024576817524129773437704721153408616804178294996765068
- 5806251274752995065595324988186611187221699214720955606547552197614550491099906975684236752153392973
- 5597122527571508766565966450271917178205293885109369447210327912997299789495953721796541482204684847
- 1079713315292422565810659649076885751212831515757008915688390775159233949705557155439612034287580617
- 5188670398308678334081013481683943703392193419742431633468771675540102879059518554697024410748369099
- 8853159223576836050185875678557363745857714841063401334897590877749058334553977057953521359016826647
- 7382725085565578135488763598832002785770631642240468395161657169656331177116454122497180862165255308
- 4508026356189132604359629200964032384354637212951594753702934135578205609103465031482793614106566034
- 5442082853716002311366813190919641028730492085004174370383374462810464620942776963785580934275787598
- 7841833340399660193542026714882612819488625539504381515336088819835281749473542529613052058898947452
- 9789819276536230214649271640863202923565929941917524547761440843060223793185676064830394341621875362
- 7041474976139638429863915287083114593851766848536922452479133970185679661898100702047221233180454192
- 3079943922150899183397221294664854266918247805798787826538813387791747999298627164543339304246091128
- 4741410076110542008971258536672836314860898634346456934102417486756764886499932016760769139511745616
- 3032737449804460907809064030467634944431558869897372150230602240876896280899677720082954009728621969
- 3697999085628637818920687343124342519125716658608488533132234261843260558367351735755946247449424091
- 8913520207424891718440223182667020736467686101862473648492758014735888129615711645307777309918790610
- 2988862871493020467922752516710370807163943912374316792866821934446224765726040705459985968287895948
- 1812296099664498418954355051269746222228405582160178156384893241562942941023547244744065298275956508
- 5230803988104176753109539450829566866700980596803972387830710888730991670839909866670302161465717224
- 7840852262333384257208168100733965346032149843206972663930918651492548013701038387054784958056923908
- 0907147014680319441188291677410010867607146367034609701658774793861986557251491603212619971997380349
- 0164842267544912596739312397990074831055385068661830482906443355681392530449017556754977224586553701
- 3114885452145575276500340012894742742237558340321677426586029415028540595957341787349070980159085826
- 5302204657806921368634418238335855058044069078904876946952301682422689530301950384904574094772378584
- 1308094244812638676254526179071856678494915944757525890432985971556253916870664050033869114702527528
- 7746323076394773662205021243171119766975540707333112675955811430766435083776613839374188211987281402
- 4301959257723399249774565359917373704823455256901746838618160590685025236871722925582045471781431991
- 8580749491682119101061410175466753076202891546321342918722601569145323392446783536092923925956317992
- 4773642655885414299302894571429764367323222629236024015550305643202837051864402703207009413308930740
- 7897145934113546630626365872857188977005569179639209408954049496757766916683128261519805386857951638
- 8745693396126973669872220449857426520785733934500552182495973648387278103946120544515637979612030291
- 6594765746993415432710140747457728926544229966008021914307516320121147122336288689110031419826976208
- 1161023720046209913211643260706919886802864097226678090238074035935421449915746197968355714813677142
- 0102843682700410344318799421436138119770538705702515776750087453539287747201965450490621594472377056
- 5106196759999085694877759391491159420150509913677419640531912235392749755102752262125932903159292020
- 6322743156316398835598947694912780282598450835836799862035335202068546055921678655283576498156695323
- 1585885723872988882219155944803787090891648567299072137386053604371214396169103856951761602847570707
- 4122088557445480386155492999601110900895293056150928346650288039831552918890865902817664933855036021
- 1301004261404612185620272908635851705705207750060330829518090619335033657336926887231145986400466223
- 7348473629802877988102147101924585493748777453115962897925405501780747491964778406746552790393195565
- 8138966925439286116812702860780164924717579476900407138384187102292173351898940764080897143188308922
- 1639365968753798701420400378491301275010036189355286464804238014072668778949947024252513956832936672
- 0126727746887603228486942873013499735546344984108290399024614311248528848255524681487627399427149890
- 8989640658846538277748820154989400559486508510846581978619330248608338007255035370575267261626271208
- 9574838570781071679039632140611479857589273165206651387414183990141524080694271641531248414657507367
- 1621014372856615067280484820945901214115397057048462215390455053205451408649083481693367506628520708
- 5044761687047642470629251984218234056711931759773850712138435661612005412914870910999681331855034567
- 5525027394805609455333324261650049742736992368959557120323458164445061839809446368120108418926213314
- 6656721599470819817686659148832682318546016554172883453416704493091663748465689767634231201898326438
- 3910341875841362419674579946492022219798345930565636927568493597776710931030414113073125395642486385
- 0145550075794360426654494747022596898510266337438301815326070463610412035069829100774024752336575842
- 4349259806781961067661254989366947457932038348011891804623993440204860547400539729198870648908353273
- 8462542597815237701653934090663961614181369936262272422063733819843067752648038741771906134560708695
- 1288294213418894326141155983741984309650618079924824859955747397586597917835001625124791176820566112
- 4568789795467228944116120724622182150361118719603867594046340815340520931954899452801363923920455820
- 7050232815917711079086385994326625268337083516221862790696351346100018927287897223967334211224885525
- 3794962334805017456457141696886360100538717492882149746928962534740324906591107947746995501662902714
- 2984650883917957439011915442316633387279050548931573371400843033387711793984550288105152253878558588
- 5276786724654682252601394142126380025151105253620202850883368116711791314535182745826907936214338287
- 3636714785502540618315074263817135131076739357650065187225796621355848452519981400465049664429369446
- 2643253534227048108735843865153165747836934943817561843938910192099339207935917302351336134333617409
- 3788943324363676621020575206404986003394762611773065979007173384350861190466728309191914054876182490
- 3540960361117175873842829531071297887413006781572900718720285253473736830526838820885190065288899206
- 7114141756148218048590301612699363022004245730365450630834445212718140481106462655021833491808728134
- 3170005938945464777807178007554115944795663687523130280968563849766467416423979403809780240068223930
- 4397514877618551014680749244431304936842402797966380697010721859444694667569526315883828526261340027
- 8056513954164726797847201873928734317431956342714686128687031868026805130778331133364970514243458619
- 4339937603831348919536165221985717340060262681642333152627532561526998660446742821000163078713356756
- 4176057061036539724403434996407552391445970004248827807009018247852047697306068182728689501112304020
- 2596546463916882653440624513894380086858263099263707383047836303898086010994899412575125614015344638
- 4423708749095624413019599875638910465209667545877660086590395215269307249475934637655249995739813687
- 0468238357822213502275156277174392239955413454901430780658888714513281337076148502576852323638293314
- 7428059668809646209984224762074394269002794291723758974789327985624247296590853215947205332369490434
- 0279662663074027313164322304712428965781608109046022568044881972470679934948937439150755051735578827
- 3674663011336512806280676387389443510734047785428449458103240215302688926709289273432162228866530807
- 9172552536648253192224860467190401188149796691897238390489921449906378342247258297448757138716393766
- 0383531958221258389950053175670095529364850788840429000362324607985108094470411877669656985270022423
- 6542148408230742496591289909650888536308725432732151415989181628756781130705162568510558151267135934
- 4832178026783508960472580054261710332895188363891032447371674832059178733650962829745596943462409255
- 6528166566428133690259307587404400234673137376777924867261026258403688081693860941830435421605123289
- 9431137753391065117317425791903877442755577466603040662009904063042605149202987043184601327389509099
- 8152703064336944690410044571202235451171011328756403959370242331710298393490082072739036495979673246
- 0701174416574343254996117806917646759647468797915155727815162473060583345263648512898167784698088189
- 9113210039395551118696836023267657819460839277758877356094075598291775428086114543301395004552465512
- 4291004911372885966068671895355711890373330064908975683351650049482437502013368515728499636967464259
- 1495360373941154960982344314351093202218097093597803295497595988950811043501360621642003040542535251
- 8200915587623321754421758808594192994016616000363439101534009403986138161418529659189582746862217600
- 4007540224052349144874115414450603504256362329696036597208236492559421476520771374574795122002325330
- 7577273544066672546063855660020024685704460037275403923296087432532813924489275962636999746081980307
- 6121586944368125434647600582345170986588687578964346022705480070837900413305141721926594157615687911
- 5019134029748585051714860817315609739898187117889639975438593851481271228565920278693528607609610014
- 5004686282143308100288003423799080316038850406082976294182308278380860352272498102367705906046463477
- 3095240249025118717986424339190253045895732039085850787195225501777037652162664218528198174050734002
- 6663725152809340520811671011269698677937225985693349519432693201259024230765182777135271884472532778
- 0205511448358644478230115471184418352293251149325726988617491226032840207277788433002018243512889526
- 2643485040180117669218940030138462303925595731289815372438169530773158947855646025489012335984452603
- 0584211078366417704984380422727756181463614970822052978940468419642105195952976344279449380087623752
- 7458736540436860323925681203968153978062031844117517340635496464494688643129005659923971039802605527
- 1913444121764931576701250232821586829133991709434721860199061499472704193722324481136577736478433420
- 2259996962798552988234835813451982181425675924349886313315764355498522016187470094484862457290141545
- 5918948887077304374958672079248383857434010982500628961660799710944183699874784439567679292388862416
- 0244369027154652760022493934903690547167448296577083073924210015283272337960935692399033882446560129
- 8007919176430314202194237399396437444250881398720311047330446839944062988196979371975773532541936499
- 9703329803095057301944905176813411652445359329905152911986147095703537452655787424518568889601351304
- 4654670270758809946090330183569536601327917187944495410156034369228648022224704476758696090322096842
- 2563613405634836829717434394913450350154562712113070691281968263867332213184044441497703738450944461
- 7548305453689936068205803889877247411952389292421637467845624985427985031449329953315855430027667154
- 0262962651669580914607881017471430699174419986584732904016553566585762630805024149558847753348985236
- 4672238934163656532479436451005902522586321364641258499846796161843552340352324721110521226636091573
- 6027130213294482089766141037807091936558026221817849571220758511904228780008745928677362763323009690
- 4378031370895252076667175727182998614393655511837166922372541946679808216666811103956604393375037280
- 7554514848068166043674678943264045371156658637505315120812713275492053068222000525692985014308858791
- 8383385888272261667756834554600420387321665037563085408359999738344203187925351510988383385390032909
- 6587405487398852972968379972293660129231230716020550973393093605034590395514435053077998616792471614
- 4327074762450851301978973869927099332578952464554750676366826464527152552254333880535483627391626239
- 2529667664587548946734475772733560138382737290053938966565922305985710484827743980497205838211155382
- 0098920966136946893177199111474717037337482698105962706129131399606088218772148525578898249605715119
- 7409955071399286692015456583834310142603080858688493271922984158950926435718314092471047051845128758
- 6998841092873590287431203934376279851641103244122629263110011096914955445030945335769214098033156765
- 4806421257727767562525366210180850636818295792871608398234021472035362598206364552008523128058003267
- 1686683448151104637370484997348399072102721190358008843242221164334445080022597795281797172269973237
- 4386451794698445764806394894918334385251804287869326327529024478904759379404285984527499222779721000
- 2389112154893838239138287298993173119476173906115044782792876911023764755025225717321948181473706301
- 3088417889819598162999541083390244410692706737595956997119535930938496110286574076506367694490893018
- 5586498703728972723433457224927891532609223247702287726296424917698080302782362172393798854005036257
- 1554887536100890114568649828243767815051248282055049206761472527146521896630049688579599767752259397
- 4060305110289858039626218819712821705192632230895174681586477249400663476252399854173196026161036924
- 1957159776019716949023993287274397465880436565936496880168528639775155224759997649418595026804050064
- 0969843511307379711044119791800574646549307802152125298100873140604694735659064689241814839126360000
- 7362471055648198258938088745764536277429937681358765419179735722961270008929684713696493683678963525
- 1823038913103992633758596525796164964499089095524355086589025530278599077553259012730600235531124137
- 2288339546404865777833161576829861517865092413747423720887013088054395225927885302394309216595649098
- 4077060959426129628247967788111335332629528747975409878835566787900429195451576744148678404482363922
- 3350956600727547939140169710723185824412798923388200237794063975753657251625013351636726443591597747
- 5061192571301623009093734510047452761801638070967737009437680596671422941358960082475538324597480393
- 2060796044905017692070585123672619845895683093796806254340250957462165951887975505779654919550494928
- 6712332513375567387160573563800289429902488512188012405686792361892475560482487495532826387314646416
- 4205988538514774334331725912973171197400042649872224381061421103274992413637133754743240629667251815
- 6579138643702562024303964790489005044298526244657566236218820854094942368505732727377622836552938642
- 1319461785260626049990625479688474585304413059373947277930775350781935576273441069215589407275736285
- 9694496638890921585132706101710614979762053857085281209575276329498576677719475935215242167687786817
- 3437055674237402436509635179971533020571431114640135864028290245151732610767169202252500633762431074
- 1617874762431101802901331809722311238240044665270255791343338648233847824083641509142630321466554736
- 6175962561696659433120665985127670461450435565056763231927238034514025354212809618536406586065956865
- 0090054298405004609354853062062677047658456432303555796213970401284145071551329589154551669286582783
- 8940339152992238823329025388857260584924330742050480774965818966106091810585454197932480203796556828
- 0399926145969205463805877136490314877440480911274281654824191745721110244974231615616924754790847307
- 5166326609819523795676463876788253431508822081795667477147068016351059647568318898324971204609208556
- 9971337574144650469347830224327100384214768793221424857135656462834010324241282632765420816089448070
- 1691549541907889908583899738707067015416665338419583507169714519341920374457438205104077772973273608
- 3932416374562858922413376538636749550495430566377084345083651770046466463815328674448226290496018468
- 6050368834407760844823970025677621323572137726913923930959252379422056676983704392607890348267373475
- 4528332857659917761012569555350192620551799398021571031241431145302306985898701030358942128852315150
- 6444142065284953493622024421560328509445445462874140740184508573337343507763059426122501925255325129
- 9186342147658214038307979527387376105273026392418224264154215090646009883184415256430726001468614601
- 1619491302403669382475017141894225920208067077454915759538454237813886087021786642478602868245538257
- 0607007852827332226510563344566490874361582295226450690960831695617260526525349150207041380219034005
- 7017883118312374199817868723882510105974751202349065416840157335014317837335248193861982871799710861
- 1704819560792586428195619770249670042110009538004738803920047245467873090629279686005426820228388866
- 8402908313352076886505277918656290128921312403151147840465000757126177971158769600362591788995845532
- 0352877641847839786316650707375096690883613167391476683106804830017611360594125583902618497547666962
- 1728534035859219034523767151164313372600671055941435933213580593431965154632317833809081857823319571
- 6802322563645435465739653891585126961726835665295452993366536165073980298734018388646124416365174666
- 6698938924827378264542631427203865011755309707615587334543102676089168151624212648705807750635927882
- 0073571778056908881607984334565970610092424036098417826254172021527883071915797667428851450587738133
- 7614484000839126439568917135693227613352816047973256116480024364781339419493919981444634503389773048
- 3079017221897876114152675849137827671364048145222417009763802459275416672698590142034111588045151837
- 9364707694489921651958233263828168333632551302342635169444008445773426489193207412771550956432261038
- 6891038570095852192162848418489882732686554704236675275075298431229087305419839504408942021416678082
- 1968098279767077492898497124238809335414495108294256297327826692300410116180647868542163393012745589
- 2232424786749160761576954116883021345421715965846090848019719649487228542292491332269577189910652192
- 6823520973428529362798860921167917076294858474961499783598343087200700477102185689744126172310910355
- 8622624994683902497802482310610773890804303172905984770452243032100330495756965955759098089718773551
- 3274829633988645718778469106403556448961252735144868231053002778188431067681436348836868815197935919
- 4805864518378586597310271207805878176828347642204580417485465272557925932127542209355067091521746074
- 1863450104795444847280432287590427853279892586453224298523386332572078549434410071304918160075095719
- 8178380956000287475827557145959121423798241034420119904298000834846679847791736676339167559812330736
- 0449981783300027146207947153962607424019051778269682879307334273726355455968205132147577968851655215
- 7856382150610037574421068786981759087972310547187859794509341635317309713427557368480465493684608589
- 3279519387805483535183845795512788897107538526481259181979522714467314889783066814412948090438764754
- 1720328836793153948731927842820614083782111123855185925737202642344646616985206338453406008552668716
- 9998825468531836845011643354224246766319745613460084963085605745373590303320585846047421171983158007
- 2893001356115756207174231489330479644746806496381293164292352358113902966994946800145068838572950498
- 8003174294755623676743764994243612959018878163634223194934072584973173897184738742749355098506472696
- 9684412652067805021942042876107362888938588503873245685564388165788462809886618203203578230333800993
- 0591300723334132345096025973746052004357099860029814550957846283200151357359254602735159675644163653
- 0112264712786403244824007737996917646650602387339665635679340398356568072219654048851193224882054279
- 8091297110077004500227754612066171669155913980976565982271696317371323802330818946438128134866452495
- 9954457359960273403749531981034137354585996149549836091761262853953078738457075946329303714882251930
- 3817175115438350026708995826545263811037252548877439260135406025221454919816995798737164535132550990
- 5208796779944078225308077581699560271112775854486844027605293945142888002909538028485411012261577841
- 4915814077499984149629224019889130831785966691538822900994694745024784490257136735697263979283040328
- 6063454681985901480867741408921089040105765750311041922161494187431458784761367147739183053531438322
- 6695453832992239404561336060178214118865092922079294966409121600359051153880564921627054464191236518
- 9082065327758919973892229390120026823222236977367233003938217236746530526507439140683094747321260320
- 8840098990148026780199482685855351480657053914005769345471367320387577245130697596060567953900372658
- 4611384511323064583372505805316793447259943055217500853177863633981947217743849839416646214485505188
- 7706616890278874741977750727859461678481964887923839242970123021952643848769171169294191367645398975
- 3022131894427468986445119523361135808699525657384995132272344858932311386797831195178438771350648230
- 7870482998034471550701418820531041426682294816008160950246823597889332394676950155947575022359260204
- 2472263849410031136704409745365861030801205930892752761072852639425752928436218637764253542781899306
- 4800665696367275161697181990722601937571168925947974476124876288821798650136747507500638323479883964
- 9774004884123575666865716142158311084736091393450002732005130798128157022256169065526833030836656381
- 4134700708194221664848221041593434919082040564085952240388003780734926165030023171799931482592911800
- 3774744659501565939981386238692869062652382061233623674596407209835077011082990790280690341091750963
- 5731456182319044477049548661871606922803035013735952241233169641834879908074808040868998221727551316
- 1958780967752165398983096203489409368385653942119612308102110347105174241643465517192077927713852950
- 6026751864243969265536723344784100681455951149036782838817570535380038946002769070563127023230141413
- 0663168017467973350972541462609599578815941072780659665422853016083098094827980877799541513306341851
- 9778723030126639225399955941394962110041954607825206744250803288180503393892187565244451699554137647
- 7841671637307558479723386593926352240182260803169276708468269071288406191974911765628699969084970730
- 8233756477976874846675305269192985079280366818214376796073050873808083014464297598254170078643973049
- 6108341861969661959632201840359163563411843581859820514136319153091251744066240493909245135885190762
- 7068893662709905594646893766800692046828363046250164021027437917854480248512861821612512114570003573
- 4674069253679036890950259239891548171622541825245208060039060040615540589290773206873095800617499719
- 2036471209788419244666709204449749874824088659052669358894877525751640135436742379201453072202353576
- 8345446812068659513932726355927699659957377744110379091071568358658465622085862107139549354539122567
- 3280629527519007549409048963943888064254557072622115936312439491645972564910184257540822004722888846
- 6345128030448319017840074011676477395615436471395235581999769359010841775219733620308326257616596841
- 1936614585331142075321195292766971704206705185984249976283460412316390812279089005602391472762547230
- 4465613738919348291198454930609446294509615911536755252862610591271212204144684177497818630501112974
- 0039411193508189083573332905511440743044446758533039081986774585870646675310587332044486643819547370
- 8480984019014571108015111144466295074606523305173459452577257589307863700719576792849542202391372656
- 8259931838496357371745540503873578054083223542866825098340742461917212410659284052811166200923282960
- 3017213638492851047735852983920870989263169843588574220637445799561054144370524882233580267567460992
- 5440227768400935931817775078576733453207311853083797369573820246047450096045240556006415683554046864
- 1810641559159869257448903034714608636868420714152951953996888639944162985012621982654789950631292147
- 9605647184999313392444952972883378335522530665608113911155759997907138289241837357409051932411808327
- 5321057583443407862876642948811335953007811514259578279640928378127631674688525323298028567924732045
- 3209385421015807147401809479461160486277678673437757511437592333049254994572062768423364394693270173
- 3610844401875653569316078803127015677432921109546037466986463058964329961957990839163885107358365539
- 7358685803947562940402286352096347217039450470385257108531336244754542001052596712178357874633359416
- 5923235625703933128018819799348769808508853873790156788859249599338041045070956681978068909791304753
- 1270144691199081713805793823536727157978743995647891549064076938192367836672321819058213639903497314
- 3981196742174048660691965065868831513483401876813467904264395573859006548375807152818128951074144096
- 0450170439654853590538278043481358307724451600378609737374314721794026495307729429552473216428585864
- 1931339046225557314287679022533447878688563797709322070475438244713707210817280726216192203451676638
- 5698542146002937106613178446743494946034274590970779402571198873753139912381326000956320636823628583
- 0789874153227446212759179354631214921585631006889095807780605937282837406604517338147569406689687907
- 4464372890324045717468931622799152607670087495794636552981080060563205359323461491322115081869171155
- 0065566655477454978755929060742276192490131286777580134210840162883087292122615776509522101508044663
- 7440329782265047958483949290880913783491105270189158666597815395224336302038194307797221007492952919
- 0141757752516992977147935001371899644889115206473629667612182183930848992602460041899154669973852196
- 7567293096434216988980634192953311166015202689067552639251081017259294741159705724670208362379144576
- 5730763105504694796613415062949874761664184570782385557437047474057201870953392723123250003365765441
- 8215016266023517184726721533121075096401585101898137749142654529986669208708890369491023049304630341
- 7508983514679902569728765115044510267583560834962773334541439538796196861122862718377702626499995437
- 8975661863845224244739492492150548510122167075552405102103873300284593613184584427867338231426176973
- 5636427084212028318843673819283471319508717312219101203167211411093958999228846748017416567609937878
- 1968770763447597018787011536350704268062034322219624818967910905627992687206315734435950789785292306
- 9671951104333055667838495384096125277958389105487968484862086797174930084521443594253462001124108426
- 6566758689780827762768401346982941929580203305740047491397897105912264221040732557891314047746709521
- 6337310954671071478824347469732253620897184341401689515209329372895796179900974531322807631818289943
- 3189695689530472370399538905839657483550150819470100336494607541568093909482754499811810031151431124
- 3716206028508211677160529015030383998177874986196350048908052208969068279491550381572239746651144204
- 0712132800560653624460196857385732581380945079434740660360543591168103854745541390100521085682696417
- 4364592697573011123142761569164064382930414419125809700150147626045084302994739777044340602558483155
- 1837098621043718244490932449990941239696807273557499097475439290255798479709348219032808505910233185
- 0565958856934103697521787966167710423049423523510863007281287132147932780402066461426230078561408403
- 2598348925571208511898538223851362097287919518774650641861010501100015239214019881155010333190671539
- 1496612736381353490620189880118606264888141694352927513020120744485069394971565696370052810443645796
- 5400855804416248425718544837208664333866575252285810948289217257839158191476913646032684476202255833
- 7884307066268201365625670604291660967399373963337255981754023690188353530079901593967249287745723100
- 1781338885062942677684523610642620854720708060536737626847668768462104365662552545771558209684895512
- 5604270948386990045370602363886713679104249114919963014756467260027940693936292085268041593916556942
- 8310137017215002461341255538803212017480246619940571602598114205384973309909585864771311219005778516
- 8213546567692543695868395539592269791198151056786242787386355969635159652578010088777516139485947653
- 0289336591762402297065783698536071100495347567572284079338746963969820527548854138638091280465567957
- 8673802477962455807493572388749181720103008919889932379533927562492951430639175417565236205655375337
- 4784035475143499180169624212773057517531727140899284179971054379976646930483998576569703889161802688
- 9482866498396473822403052368385787917654987361628471601522751105553564227093034129063412140503747065
- 3876110440576312776776879558283969360687974929924730557570145071286487760372167136663996479516812181
- 5089563593221450808534862645244138042319376365335527483533321558341288886647780139622494602435843022
- 3059175741552754477847166515158060159683143469938602241167033961033143444142152378121270529004152968
- 3283581427457205480763417399768540321142787027099465821456696142049358600517832030749599849994536775
- 9639015443329837295987702158798404530424172368853956543113249128001668861432133590181459881534511564
- 9693087226879981544016379036258474494027676223140583830246323278355589704912287637551609935228638759
- 4826470923454896604043955282969349632732961945392634125404435830649127279699414425771537866021215962
- 8384800807764860068442119512842811118606563381627587966850467909393030243819414713450444610996238141
- 7080458893859796343824476120094314750139145110290353458464233986653377503403288751178445621701907008
- 2687537123489425484526795290596728991141621687172072527895413036625313121616871840029084914010882474
- 1929033100395853328090305689816195958414640350088183835447766161764083433565762829160365278550533429
- 2017344423999912982156065639233096831232606113498474590475348175724793522899893500943495075396373482
- 8911547110172984407907116384882298841792185428317498575601644356222646122594640283086477663873594598
- 8424504709908678771675009139300382117519811184256499449961925019393804725337399459333773125252463064
- 0434299251006362772644042522129335363983888712558650282148393519537829121923251329550479427077479817
- 5730690981398175836426749156756380340241635030089974588466445595105263773038875334873440217725854816
- 5703260033562049041773557909734759843947599584542976546367412107535150701385121261710170943881638681
- 8003253445607801138931545723258763168759141418393365682229624660091462055145978337911564647926663543
- 6278233025485821978207099747310916035110647009748740007315222876647396291277862184468355500202043071
- 9142007284627901831863978702570277226878239103697244548641105888916691110592202944493294362703541330
- 9880526880087934617095630484602882766011907089407300282006643598669430991288386695237929866628178898
- 4272697048886044737676094202615377177917909677512787197471044080915599067919077234172080808599042860
- 0454545675142277138473782341100531182443063238871528440862687566050697234784773621962023765844110337
- 2159043811894698293130692861159856453139893139948999833404400924228379125175552174621891287605139468
- 9884726771874665047852706643625748319169084915371258805414540363267478695396491037240057461302202931
- 9950310198775060288023797500255215749964464245334988591590936954395808452804500493663983056378225410
- 5626241683217301132374663650818321551390498019391996251482034852336035202979892243773111150091658570
- 1032600353644447517742469891589357347056587514976256326803969581696949039759946106397634323054227213
- 0876246685734670460622349378419919838013099392802365227419198605426424971179228205037053758742713666
- 7271485530946080779629080935838546546834984036355521684570343035006341023502853487766353047125068844
- 0872326675905655793347845911332126078901928698099359636775783128957269704288379935513039269512405891
- 9984490604631927762990564603947687565277618898780750820211548536425379197075472907112634428136059928
- 1191735709921525555198027605603718090518902071857735055523271391396250159427253930237186445017661783
- 5950053674245283533462966004008468072728533180835272486343316020649687387392161609559277707472091863
- 8361912857557193948445722793390984130659405999651263847999733328982724471352363001173194587972985469
- 5574966414860678319364121215726453407658070668960253185401478248747972806312019166738072237763920872
- 3247542101321740219317052468831195661303656707030521912378617793925690762722384770505239270622228374
- 9423814306103440377982382108877414396313901510708203127545660795464337135345992806287196946972555924
- 8762340560859976025423380535602919869909560761373682770704428667046412247405699674920985983836128293
- 6506774498024522167809570099379281101073932308678935464775565148775074794665008756926950491325561264
- 2806005988394995155162576408277981605727557443961201814749780045132178212978637437510997476733763131
- 3444066932216989790648141522459605796036374929385390580458098260355681952893952216695741564220430366
- 4372299146967604386441942130136759001693242269349130492467027077824818455231134611034534892733150600
- 0123028538334230363824715502555136874563216693665604441464245556981823192741194508279688704694176702
- 9660195074502498516529806186805463813475251438433278991996092710858122008935766222569799359869922149
- 9254647176821012765199595978247005014221747545861942960392394590928828418146877484191361418987382812
- 6483553432410169649346552629534556346170833510950168069402286750567763445714741321777516730620778218
- 7706492244447520828000983425570457784919191688417677178688630332126895491976457394075370098837140048
- 7025429260329638779287543770695604373399901002948526381500326289972855113010369858193267448850522284
- 2191805455408227747527607465389890506437479816983471777490761037600628289061945763967812992880200275
- 9672944986154770652047321954189029670858378060569502688599152022861683177931813811133700846648282316
- 4294019403501667489299392408705756479425131999586127833097352653843359384167524753096842469778191862
- 4343771115599252828273132951369787821407425451631268645232757808217439154214688943590977318156580220
- 5796404419421225370147991892788537903377743287340955117413783520191979152796500139386884855693747482
- 1612927167295727856384738632469385840529246749040224134389518832380107931460183429162163319657370015
- 9794273900450006384165131451765590859700264700322130221985224974139157795298792909634972898511760181
- 1374469220942531031313834496135599318178835441647145038785547166597698246724797440311660606198912250
- 4156909044764662457128363820616674275647027759689746278418105147670135804259038575306203657293784016
- 4916694827135928569273543067691788670004922027323162640407025502795620934962162273386194868110608449
- 3589560178708588313384417288763890931537407240007280253256276428402648656501968697974430425922584958
- 0474179227925340055252474495023408392656172390930942300609366303234802021086788680896591816847927368
- 3301432714695684457049365421273852364197627489417603760297520161535938944876220235739135468342725946
- 2829509057651431942095955160726127413535983319184123578419642134288725668738970843831141046585600376
- 8822032463086565154107992964690465777065237950534596024614940206156054484306437872994525822626360919
- 7006342345695812108101880429485136828673985213253451985198680652792016175389656184118252242529689346
- 3498323878626573832248821467182212392161452163325275670017042893990524654825877851241251856125788689
- 4555316654975464304753503190355902321438128581792753398401246082389071705460583596058677199021834652
- 8305718682775107625066537094529888302119627302931858892708475701485689985296650573384710386205996389
- 4320941335957796447699221415378655112464853794392540736219275246848238284997312571864576555150869582
- 4151349798157017437827336637993430650906064980929838630333539425021822566381273209743546622445887643
- 4994073553886358770672063368111132294229836540526882156127024596288572354826421831454614331912545833
- 1181255979147364840129146862219867375818977195188232785208093327828052850343881380195284554650513932
- 4690269115602676843585443935076285667261266508394535898309320803700107893243658291550801322381298871
- 4648091356440292471252441002452525445080232461578220635868716711055693285438016246834619674923755227
- 7513105100126776057643879915719948597065176021389146406317350223384643458394835435027981902728797303
- 2028508468840198759498703781461796686462875466703998963042483342254904924467013293924725832362315311
- 9971239894462176588427193382546662161038214006990230277426443857141757458794397897959481580497290597
- 7772621874827919154213901567104042498796038383987308071550425303932011381726233669143418847662675503
- 2586344926729416355440616416058126006897850489024654095367384485080441994812315226437778358928010770
- 5287235798131917642254407902629775223299431624405682282404897958586204209590301675307700984125504143
- 9517370577205755550817551260179018120073513341772372476220812000860440795123951426598964340376424506
- 0829599666156088903857106846402914127173765715134887944642689107694108953101190999299956309309050352
- 2277723326291470140178644514635311873837849554388250085692730878394745287492017688644731178310411019
- 9160063149881892999061015277816870842162138183955707918405119806759776959987531377577268878910886459
- 1654468983133474235479298051910921514683071632385535103872718754467670829529749053459537652593192516
- 5945147933685063816797347866368832707895439596677298327096680062790539599982945777316823832607388018
- 0654102514617216288678835870661909367729796642225593369082458671032121453015761406563848832046204655
- 1157310033106271776366327253551051140113729479742423417996595373489421421400236584408113388319761752
- 5505890092454531377560588422476286523876062724699030212670470780945124147162949557027040189986666320
- 1798423005507008440753327962569991771876542652570331254951397086494471914527294488305094601841529556
- 2514740409525798009901463383797769021293940853102488561567350606338634923684489507528233401007520258
- 2830620711371905942678155214109218605705420961030713293725553682257947355874625677765164533109298228
- 7602837922593025131851658133770605209210865756174301233428908469922349735151163142174525426713978924
- 8050025172232090821245741107761163535916860465237641185208310455600513909589498730970708723111425470
- 2312167332038108548092017873914879344888372685456892148778303900165477417622812605807283554153313690
- 0793139630006376970200762535050726123344151011142807093681940223698999130824742465401270194011322299
- 9932048332874671355383494579635836899288623290439722584493817107725905803949716259506636916042428812
- 8254838697159665305547425435455973433201650174716942614086413803804665953223880609959689304939813989
- 1441778108044017768041263118730703803284078136515237865950551008740358384973781723210016623052721994
- 7879907436057423140992833458661530302659108802848943882627192860592688546252611811506554314391860473
- 8638320149520141992401651017397674092260432548429456592585817768997716520267498641989074933642588243
- 0300822991408842303703349200032109476423574937082515388359612855402857151199968412130951329760106062
- 2384467853304303605283324594771517521109132184692968901359920399067517466637717540893162635269159223
- 1667585283815133095733518294423401948575999288757158961137352500733529944686451772778107293555066200
- 1116627864068458347421220153546184274562778139563100350380090185222039972627590546827269914375360065
- 8655126345316534223994033256987619903270018293229045380216469805315530988295337618967309534457130377
- 1285992545818022726137465569058225957869209898046116740093917323357544514241815594279041648405012175
- 2751116222484137648793952894876891106208346787576323688199506508172349368185004920139539693115045084
- 0631833169795650011516330083782711074977286046415193311497771862005817211835717658891646355701844887
- 3306567412167110459918528506122196801107322548295187740766699796023038472007253327600594678695267905
- 1431952573547714111157306283794871723879901011073719703379511138790244228576611951347093824055168672
- 9869870945885528098965550905005839479776816362135995896454669367741167952365593301962543171459828163
- 7637734830415853528871062820092867345131786705790558624228776977038033586718966440076045210507780109
- 0263740143632780046286289324312169848956969268126996557009611629781048808333226401158444986578869198
- 9155116498775950082011654710794954761627253597443140698950143479155214870180524406888053182445054861
- 5105575082458334830601530515271410340134615871762049327376822811793638223772636769508996060057645760
- 7434908380867249533034011936473642216403187735017426283830918160337130530819470054814566633422929439
- 4379129613611797429979597898222018382043393751513900818795675780849881967116995779814800468611110202
- 9985597696284193886876123274515246277330804465733695463654938404008197776097066391323765425391868682
- 0356685427661932684390288591996788147248350231950588774756415910641899124069125309416312561954109543
- 5308814642343408331609704950449309811673539831293735539341187320088670867106762928026623131366609838
- 3643075615682433710032476128660874213918935675213059506263362049826465500820665018774633318404810965
- 3726939935499250846093222363891818790058724923861078321577979026003556222664391725444460628932945945
- 4295831001567300550754372474262118465163712077024599682774758902127077460823281087774656437622050892
- 2117628625949233373223067991761502464359913563816206074085843974251331593898633831027241143850753208
- 0538973380115912508795623407291394530386270706817801468194772402893961722164417584863020451648879583
- 7610929850676053716776401041227878179550018233197260574617611883779468454732039891838117019778662208
- 0801810164834714314032925450314249522008211143307446640136242253192598750915751217391324329653494012
- 0953928653470846315882150495516801442870649484831563843727263048169479579203556684457786382972288953
- 5344118520610069545041770445474492597086698863609934470061993886472734499279127222316585283623292536
- 4825934210735524995285484423127322046747107806424366995842385286374322732442018283439734000322418590
- 1923803059005872229289610551499388306141350064936910473902129154397749453605108064872080131190490223
- 1107072307706242833919528937220911487783908790449596315222989682708220530489656016395945586075535222
- 2215957383495960928649204136611204987681652094163269125894048452822290360702772755091042347607151026
- 0847037204995330735661652016080315883563879622431208900709419217345047787877409407146870679225942590
- 5227518180949282295331821489040420843933377285890253665084263277258143948601959376487549244711520859
- 6616658830859553361607170585204247977505790595212049489913462737333935179735374909554018050208624252
- 9471556100879915414706965354572999224070932580384255389746776351480895187698836463589425494284220731
- 2036451005027160780398336131700022763357322058050472099901287776893533759857416645852007639216878048
- 5736753929495033840982293979706583142555539282959192296980687772279663972939077790821785173247610873
- 5564189670849418232302926913249449134037576977880000852120689948851950118704243081970477677656477051
- 6660073820649884857171048322723457119259180652711670489692290985807515362751709550528429039224365004
- 8248807448131857436465669844521805366646754837987356791642201329619035170864147973371577541061516174
- 2404449579958031556111579103087313472099035301894999465821929921964771056882282986141014201946390542
- 3285844381712408363322656243251238385947763567301206764410850147539814463428593104949686936382640046
- 4162596469514903196111048544775919170658439270676024003114521271764708333200941756887387594777063240
- 9980920684630534774332419452200217630004662282023808277804197794933893918898522440855068666909872615
- 0999343275594219513614894603275485400282474638185574303867224848145712041289402200141526884770962461
- 2221149992288764391919108994000764500426736360335956446442708189785274177077451339584095760446211432
- 7655989257121246407049760606889475217788884675365773130888483170413084708302811779259466701208771841
- 2865941990187787509632002811023755143635612304865546153298828299904617451774858147760123133434173138
- 7710905577093670657365502031757900430672293031445024199197742809676221242519928632740258370400752972
- 8174354804106393450637326750684346881838874833235411216634188042412330340349096757794165377908412586
- 8798288610323527885733215533815198830588045853153469043130898096369406641813704154859314966671159813
- 0899440825457153552300652508228496172872396746508251900453245582357486877200667479497121636028208523
- 5430278386536117112453214864879424132133170085231543372774607680663766996188951228804910891117659551
- 5736498473886069524716684752375144641521336548924672761225853936148416514385818691738416754348278131
- 7663142911693785564618171660966340291272053653025444763830653355045114641522470865121213129009990019
- 6815169592152430391022949696439063552199065139432163036534539747151573501445915609700314795373825072
- 2286432679118022285454450510066868382649729074813258480871020887495051426964293739258136771841690654
- 5215610876157378020535279580044684913613691746825371728035367843503618901245777758338646770048718755
- 1541811503714129454911427269687720886195290311000652148060479389430426121125047463622256753934768192
- 2221920063516876682582150682798801607357061108055578616867049474864042027000614400977944187614785497
- 6458239562498054449551257091064027083239081446009251177787652063803937135711764476329221621412656483
- 7394710745132290507372055423326208635230121119230099328216475364369237906325033568253135543303478962
- 9153304492311538091995755532944987052801903351167407527636655981472206121804385730030729787921735685
- 0001256233180674259887240109968969813852397306191955928336948611903239492535944158365958161383912185
- 4119515199265507043722245110633671266896256727586677388238790791336450938651172201396285944786544296
- 2183266784517002027818841924009364903662723574437287448563310872878958458482352508201562742207923922
- 0339204508281946226152918446070619758228521338779696323678640133130410995564537477406457775768490351
- 3791673253218265004401500646241636404631178277966053575667603716137442026691617218914299163923048497
- 3825428942219985454786894825670545771208306069664015175470113984382899319336352288857298115482869135
- 9603242851163621922207667981900638840484271526086590715537049718593352260571181041504579347353963276
- 3998872325606368960841031544136421487826119285418384995743044276868385145914918918742400661902831447
- 9859226445963347995310286302780183115008930007657628088707768885566711361061861689962499638799370291
- 1361950062155095910026639429805842317789649650662756529783441514973388255236336446520362201321628032
- 1350049361959750702691727832370138371576432302888101329633287393824573874624509689508223833084417619
- 2408476051027246860191447430391510803777481923871052911279590551749882293907551274408036416932829212
- 5537800884919287028546754254666973573970536536245400722239895620130676048113391563497277605671449640
- 9064045114809482486851179621640442806897195762975356223618168885002728569433652880013184412121411238
- 9838519527851194814679016652840688382186958683066129590397745990561487036122898098411382006158591424
- 7128622986004171890645301008203279408858038576089051226987600864246064826948504861862965172218487518
- 3556528814663127523768706746675269172441672973545695673316677184928439431385995773850485061097313805
- 7829209449944463239430606875958119003860261904921098398719699336474633114066294511147152055694804027
- 9873582430918597382639771340411416016623775269357722361477563479055527521664824146099814862813287663
- 1187524107417432987436275385045777742542057576627393156984043856772914383783590182351736877088048034
- 3742863236659074522885395228357786813472195376605008468619896263300503309360409978222914815147525771
- 8379528138489156804919218123836041227135829611649724710802612545920595248651142278339115649754666274
- 4867185218756181629471196471380668777153608541786941838614660748536539552580901696623778000065583681
- 8847197698244458732298445308869902993378877952657197280899159793941934367522718663437829079368244403
- 2062463960186699049723190315024362504081305535338306531610923789527333914369792593690728697404262340
- 4247587033791700221492583435241015718645398347845451758922412361367352913626017121554410849303321644
- 2300759697110588546958695711726320379851371929401448711950153715879163321253830793896944127468922739
- 8610118372085142869319715028646909873284817207387381520159116379451230101019666620364454129562919035
- 5481051912534387131600152412478550452245480417085800974416436084037596380188386074895352662695035328
- 1648096816794488017615939929356306431457111483516674756546277594216725378229613379520048290422881659
- 9956705076073487042908590849968490952949104632685176365224631701348799893768877984209294851296278523
- 0159883015336126834299177661463925494770519302050031055605493677633916328395389557886997769714313544
- 6101324961890191705701201820667021165776654146051368534345117330284374109752675183557592471851518890
- 9168989486576041645332124170280811484675907730132725479460941550972867896718796180122044335029687962
- 1964404832788637996040983882536293823039583969837394961017123582184217743974270364691125810751594526
- 6355464675143678868797822902295599477157643067126525971855615110357476610420964178412476830158403397
- 9360112118781120082317450371407570040927108374354010891993459498375670612740971769921395411095210125
- 0839813654956204515024366843113398973858736113065124745242321542571509170983114140086026489053937071
- 2774412440669076831670854240573003611786905243232054426823568650032703030650150774804738700240267292
- 4144800205153067732701911145489873963492924892062897129047830449268538002831487535810599705614838069
- 2737300968661098886378902955732473773218392968237265964099999476679557605307182161869394599277816445
- 2536969658122450093564589944321917279168676398557892539969660988248722705869024920017849027121486353
- 9553280594682884699335785668968529914380341052833693838980810654163125074949460944740888646908365216
- 5710685290293790114001017104187582043926198243372615611135685841730762865206310031274971446997819103
- 8819926090166461797540691029725658474690450719252449465833527641746399517886169056732659316334124585
- 4517825808244900718850178514288717667208311599555929267262117825611904459506934896175722832507114752
- 0441276776575050868936709803366686786798668095854516356450456700098282130467124423758025533584949678
- 3455027631075616185676110242006229086221786801124345915647756613627310796173252346814090700110500979
- 4586345724419026620057736717904612327442085379760972626868770094642272586850071636459572360638163384
- 7494349975206543190488268758253505156910742713458684179456955827177098027528168620203131954435974916
- 4686549228763080466621431318534173986503522645190258054517242379319713354798944313018430240118980856
- 8284287635611511359254505175900660902931753419723703731662676310455267705728410826619539539676802350
- 0467639232238198895390409926916785915668921976462053713869576979999088841317689151137434627023755761
- 3560235953212929513393306880410662258095597530152275907114307261209980406112049595447025290224582981
- 0326046036661079078461456247718072122094537822437960892084783698815339985784383584762331111455294499
- 3163589565451707434941008645637568236524522552890279717199986729963816213783471325388298076612871462
- 5534783529714630139379788432298529584543951967680386477081199962158170809443989580382507071135827079
- 8334780985661030080924836334010664378517170500867285605725665824900630381665925027603594014207243253
- 3503290715340643720991049554417219296172851893187876675409135877109975306839422832961708480658343497
- 1118140092278253026159348139475517360355840894266447493309584619986206812924842999006904953095601991
- 6735927003422770580777725794298919248350750002625357538268748323634227672480871144139303257644516263
- 6301415773729913585526476183106154750550543500397887915345327702159604456635703067706610019201793214
- 0171479697167384697333397070560585989228309253129526494279536183676079287994017708601760847530393479
- 1124788612396945329823362750327417646243217820505863121003280810253530905228112133576906734827893771
- 9290836686403502827994706248624768867044020859538534724137046928259372275289596415597499167757872687
- 0096143793390912193869911363019731897109456037301611109766624424400181780650555724623398592568655386
- 1168261270433407009518008868971398949213194807654561609544651226431496693496974361698396168741124092
- 6925087916495101225186752483635616057123486384689279645666764984846476716504656126699086548540370528
- 1050282325415823196482458286149790041803457596958657165789359912026924047544686256265670714416277114
- 3207057262320457058642548648538642871832592358827210050178192591032186210252542906106419649321973848
- 2292467214508802767736310025106146589875281845672592050079006099263317935029302633914975478998055915
- 9838740722820121116031847446073130926422360572014068318740741436847356693028138596844963678163554669
- 0457525318548265991161791886475069922132683880788802178150798752627095916528280767673143687407626055
- 4027715833284666790562252441503160456864894181125999979503530707283995418800406218376904052860463782
- 2068355374436554856947783615062635989936347870279090309974627721842411001764821590127056711820876687
- 8227576467699428541130542428469796771293655637190811243475249918894104423899887655814909816313382834
- 4398678830561422069948656437056345681695102097143423812653705290231148917416269759846890675493815136
- 8823125531785534937461150504580356678194431847685134829172679530465154959807564116899823793686265452
- 2544768231938216555988168975654498984722336080402362152126378985700273204797098350733847558808852656
- 0046011136366410695357973449086862143285777692977138838668754917368355359148530578245719109983029831
- 3951375705252562095809540178976954139461517202617649660795210633054864581189033232775355608042092880
- 7954813104430831425411756469379644937008805178843906465059869952993456228849781367900568424690668982
- 3480376722839141414639383441970505255527456615243070311689399586409521846800689011361913009089342682
- 7828837570563951953301251801823500492931069727258057031966431977564341418649195709519441152022579601
- 5794217433299871249539848164321588401682318015676822058890334434057690623837262060541947083026988680
- 8831940015177925067757175174593722384717722050820930704159311736220200038813060788840091117739664188
- 8367333204465296464459344197685964281262445125625778863231538319095654286792308345124027616888359652
- 5102882925470174588508778546743233541314358139890052342270388006077143178342526680299665251595805267
- 3968256629757854112732459999634827193710570217727679088300584907363364013164799368378780942754761608
- 2779063539802635477089489921777344518972910084616490569126445840049207083085260645566055418879410176
- 8916027728337257152926339124809056000282337920177526406893511804497791997323780203805484515346421441
- 1215740926117175317752534252312656527895654799495249996613418668561137172657535761612467563936363465
- 8529021988359358313921924913934186424541359344281660384057943034058583059516125841208664179704045005
- 5709015103142797901457995856719745613645353724475732597176241622166560981547765107924332845973035022
- 1418019104377848724061746812837199614628391664253480309667240241178483790511869883383917902679307649
- 5649132796657819771695645747593331331342626077489713671970058790516411057560868039039268658263487063
- 4540551576313986167638107741445122594128550754494215952948573989863056847155351487711933227943103860
- 0662876069707269223883921101042205418231418783870028474888838905667506331222092051480787061361084283
- 7440600890446146679737158262720291116842293247482478917896858777805977609418186443163400288502645364
- 4551355067121340118869078555749941020501202058436935943833843142118798496695796671231829694191171815
- 8049435257952406018375850997934371130880264021542881644344306720286303061244985371567180909678367412
- 7520201113454134998391711172535385170214243067321000314413728871055440789582470237649047523203097059
- 6062076120274233173017656903200367749269422733032275776275170079415069130235233822952293804237429919
- 5531100137570087357404896049301491001310514828563869984292941736475578552941533379493920244023171942
- 7160290231271594369364613047780157046975102606154335602353227271325523781649405525365188946498390345
- 1788574439635435801343497602714738438551198478108928668229457725753597842954543499095269077618698050
- 1260973242575667396516641860943350384149618387370350938070380101695366304616092407294362211337355372
- 2563179924520868182716706419610045069000178351726815392178658474812406988299439446928475392120476967
- 0400891751698004473501340113780055210563049882543493206799641734183811320822606619087198336021714825
- 6562393710727708004426030257864375469141406467379988133306274980434048844433937285851420929071406931
- 3278515053469681273452320463635666300917026335976323886142443801882404910085101582522932565567279300
- 9966171516757110370227909005772432264519348539581533676201804307906634693859522827634852807373926695
- 4153406812865943469956911804724376608938315621924386564103131340589115080721932867391688323814944776
- 0719920810354753884234538967326548496844080635106715752371203075032887685369166123886017735354040091
- 0880395892751210025497166937079787186642922014014558824562342414467031323035012810324420163216305765
- 3771387099052725968494087829811861525888492527218603289522182402628298323270081763455612997145774658
- 3785472429674618246643849029786530077631593791964425478394882826806550176331623401014632709472597201
- 8823335388133530254565390463483105173008497042615373676406203301379064787387371214645255533658355828
- 2531298690853960026366890725505682714100041735228984821717599940268074649141888703063814711532964678
- 9559318086512230266369972047113174786349052776694142734227232795808700025982805258013785387832003118
- 0872150984623227074316277615294128040427317387669976955481915380842773570932813737605617669370728806
- 1211955806890081599398264876451200332178564869843209063760256299992888973076124774122838326961611075
- 1648915228250644546268306417227180338343173765819712463951447878320009351333318655222338955660251647
- 0810190022446747793987501087746162698894095028131074856975128637090065771914143770296754856231438325
- 1595038525173136644265502859810576418370704824060732078711770552954530969818351972929411541825195835
- 3083363474955997898763199425104174380877385642307717332540519763611239063521989491743905255002477559
- 2393944610777614131867655092406892223028644317156237562055325359475888341884110318326056616085707801
- 2412132972749166000048992747414021583437012481574191298877094711693311104113046464573198787106957011
- 3548766016847239555580887290897174691220369251189724680591711257457394391145651806106080563786530895
- 7847735391188780952243969780018458236443954482446565562789229023722984608325547054940682218788034731
- 7899183416054026859967487218008132077885533824305278895252897097708026085078817526844197474750300894
- 4242700277303247293819695799127666762690253597622952462332687883138948400393681704468721851013957132
- 4767540822323043782281750498121221849238110607200441017372402920022571947628031499451547833447030334
- 6453163731315274916269277287196580757976562490296241213427394749494996058045828871922218243736016280
- 8616446829421784486643308194165490980503506193935373441844498848185595049650263222645086225208709839
- 4179516137292615631666411637908625996619584832695382064061026825170404948988385791924216865098291704
- 7583952932601194431057299970094882000646282506414298088578461198438509317434993315875405684618443087
- 2481690382849694454914912112838991744269803554425667205923759401508528758412056238186705431189016681
- 8097178919022122935188742790921955155180888689031344770845777714549283578452961724874657333204316660
- 6413022240780940992408614861966164617915731781241135208581516991824554105441256762164334410701735120
- 3236836922470239475223198646809466576700844147762711278182037067394773027252712992031143845135201994
- 6347089810581466817328707877561024420480747530842041044301634872633267883450445024484231091775516736
- 7076052841051752145229349324802842648388484690020994452862646418420347221657095686434779811103662204
- 2605284032034121534186240396136792653976305723917678082394197387937396993118579045446878731500279916
- 4768258851740784400056127034280313124159400625600806031689679607752678055851584447737573204098686615
- 0895683261795987193471910824256221882689002334105397189176036305647134218859359916610040431195689986
- 6854709529630760786863475180887668213990046769273709484748663262578526322996526490290475572655642628
- 1710673612277932681885116213824241463851419800618482560202162079647746012249996696722868524506028513
- 8006176482634185967083763616017717878758478721135242571274834527649231762646257436709226621130773355
- 5205683386054307054158740244929003575611165555716998579313100068193328538001828777472325091411581985
- 0576954509512870720057652266342717714995753519942375852010832755725591013419830661178092084032701596
- 3024197359149660681090192953878864962912091547913184092762346231311444102527801585364435130263119592
- 4384614550783343687132109051148727123095875779712220718360713602361416279336302762006615130143175584
- 2436447252712844828608334767494112067999001847319319046961301417860432255267100830950296615161233914
- 0072324812740694337484813194585701844194851954609071396254069592655653623192382949857221286126450946
- 3919495411072692219061756817721293282395098163294236973124724084346206764151658372429522369301743268
- 4138741020941322315904311230900855917808980986398114724234312597727307258749654507988460850364940355
- 6360642136024636725029758258821423970906963894751585219601005670875761743422200688184018678289640797
- 1342119879894242005426232263910916080832822172062383218156600956376613115070352539431370438476406712
- 5707365986370470574729955770563329249287066767157842639748416481898746442062732629180918634569514082
- 1112621118307784231880550483902301823855961986897258663753836854851880890027567239148796757475871447
- 7044963905966647638840555139832085110518086946733442146964388936519874292945007963579336776306583547
- 9134409437498487491781105259529349460886960396179237563635270568286632335693875478284960491495594355
- 8112337629627949110896272845630669590312923738949873906464548234526530112459709369166368198429401975
- 7039611050180939637076776957461341673659491868407159799409774921295144753643557051040490718226804775
- 3468921921922396655988926401383385425649428775082404565581803397987528075009321325165955626489684326
- 4720950845726942676196203246524253611380812855410809861388993231752761000593682748189193057268792705
- 2706681650947384411241352252246216405896697737766266947223060479259376589040545108908727196692960261
- 5646056922347083077659724942225173449004958810325871173498512933407482889628228684514065870595822088
- 5463566222379692684577270800624286247083910001271322746693291077595784116055523253942755096006076083
- 7053344808069613574798661003456942905048742886541585205718247493430292664502012901522850857613745521
- 0972739110882540490195467902253732559437010933022233435336792479155486508905610315092010532977003311
- 4909933191441582540393767103856151258970841315151528321798116250944078384463599269824851477998262383
- 6715422818506966671626620176160970567094861125093594209257672502737040835833893160975056783035442840
- 0003970020286423333532380030836727576947167063207271563288145135402665452805370561633756575655615604
- 5683973582112723349302665713737615780888148416954606951892450897761458277305644711560367234013737512
- 3911334222135099520103561776430770908044730482689991779764687600344803644414864134634689995078455510
- 2030298886333848328181072699200088982857193684138915398111676352370135996047767943273521946249418339
- 8303417727528719732165352397478366615988300018701354800725499677948156412225073198207773749493693405
- 1592615121472524091331243285352266095099178862420621470761814443651682059066937026972848443035060252
- 1914049775512614504465725697123159579764295821796831320720497667628657047131171465971689941414194155
- 8552792132916553410803586453942360439763461695335289846339014437097710317188526335297860098669308669
- 8435263934184369703188574390628654710685190800238247922659706695796912922827797760081119896191705187
- 6577047154804076234201469014747012300723672006374794146524884880021869725445463705686004723267422019
- 6980822142277847213930550996393066658835120573420953623270683351905374323509642416928024349246375291
- 3196824007038389209946820797082050855302650608417290646789432924890422666237149391487185204533360509
- 2819272200266783545090067219293448357187400486452584361950094552025533853015019360827545508148367762
- 9431734666870183989663273687066717388978381705851435561662657530589349283799568837156619051174693401
- 9853587525067274615771754279297665411243066168857921466304826537623629178636344787320604811685644513
- 3196337759745210891420642621077337168716290579109047378376399934031761013295865660178686150841320259
- 9439184688026600919412070156736705275210446025424647662225537968562211299822221366194969278051234613
- 5893880093787006445888955300930967808022056712229117324496219466633608501509594916809119443188318875
- 5727288072604920484225726950234777273625668174264307924072732430554923883140548639459295216734612059
- 3473310812267074435854430639051354861245846923527729555959508163391240344880846155748316511028056596
- 9126047382200962429878618959522873019383292859627993498447285095834161821543866108691365440642590891
- 1589698129897442714708606373440889508112079256324343912160486709803726929822324855824995708943110863
- 7654840373752138369775403725350930868402408318659218947543425465681993319202869736416876380780559427
- 2649094054318608688358706239930380932489377606395880881692788217232840100800778744685528493009535616
- 8133698782188131987960915707800606587512041368105515013899140721605454073209842445711240786902752955
- 6371764996922732097345339032749384224697177560429121963794004392913939936963834312381057271231601654
- 6238186080341693779232360806484166851670088458007079905399019138986928867886850125467916825295729795
- 0907781400775837291959525923077898529009537496931446488560420183072483668164534888900616418487213140
- 1761979206738425388528296023984285540130893392381411757012080830155418887191011712203543960412588136
- 8880489293940966294766794056226564819392253637168630106007982286989053718470719552486361442452983986
- 0549722667381399271232326979135267819475081542475158259570718215174779333083805385422525935868790011
- 2017697150694846872323977569602190530277291344179895332845717225695951393984500808185505028461731209
- 3463323897674396686784116298253664412222350542063236389978613011604606427642524721199538797765254709
- 8991387573337095875444606881810333079159233516940026805099690092016813695028758939377149493311215724
- 1590212362251549726987858042362441274878998655931459382697569314305549817950653144186683273288195130
- 2751995672175382370571522522917889973898390630173991729947859647328824514805731576623972746812720692
- 8354685997204915820065493214263737853653777657763105425649156377280018981099444126794727692115095607
- 2802362828488060198203017705573603550343134769074127602842407027856245018676049368092179666630506285
- 7919256903216092155038298157384365049568333881991420375632076289437684602476610394352022944810101404
- 1168409635222224465266984042964025300170064070372331719352207617831350035742568452310201544861847411
- 2946240496328898364055154538023000657624314766841533398052677981987237595528463455943508759753081225
- 4078311528564591382669854061989075985920268537279230084147530346162184574848815554875180280750087011
- 4860205663005110795262621816509997046246093820030562461035531104034228743366878696989658957146052636
- 0133947402955027742886004823589976160326074985704712218455866713227141006978846958171262714993858982
- 8585921462536869196078653561335684500757664674333108632471158007102508635704220042755102796922229828
- 8679505160390327842273887381118303297732968241604268323692533434394805615130277475655642243538631283
- 4139392655972966202638496945337587293946902596287388740148807094633806597996983165111929088025119256
- 0285817304991084121641799684325236402041202666033906135644140131389322120287306294453261319831333565
- 4125205821195292932149405364882300337137813069933752626752573427205471825985193439712284754974232282
- 5404076626173085591797748712629887002266741047470611468698028702735148198879330690780405185216982872
- 2319131755837755538329306419343327670587118572766871456496475004679237066771990706913870008711630394
- 4297482298951815094107419158382849830008905156337499709234458126841189055720390138093744926726325991
- 4733455221666514058384741593179377470138831092920729725748072689274863625450102261803654579949694183
- 6305185203348583061388608915374757681450689048305047432310417567254445678677540565353246244263845011
- 2540158811337628792279144576999324549020710057193890243323158180677444472667231766456076823483862792
- 1390923872430415110888337404826020756447675776852313457857843464984582933624074648014159794645214350
- 9285544414656623672600705710744294714808993054625246150539546672945745477522309885938349227321181401
- 2181993728972747836391302422295422832265812729939788697581742933644005462333979847923661918522402262
- 5456201012629622742562381753005177632863755395427686041957675848786829356580164847516468108506725307
- 3869350186544318606782117480706710238606132897325712447823979443239268514685587071759326786933587685
- 4716034489616776117163412996673364505897921107546018301236333606911449641883879341218421949353787499
- 6652379751539176305915964610347152121465642747239185396502131632591123081652835029486819565713588747
- 6772396290191693199167768645873058755288747597090159188858413402314944535163715820461193929538650063
- 0901968781148725200246325005859550973265669759408809248852766267444246672639849454940963335885449443
- 8550708277866043263766955889909423392133453243745869236955358408441578541048678823088765914992585877
- 6134937893933817239566126732645860588609983313023881770669293348340480489448144118284346563752808166
- 5602947298876984895191128972799505976303277305177693767829975992595734475281486283944418936299209900
- 2413580600242332685520325343646493589775270690343598809038877648352811417289852206157665771897459969
- 3126904994274595857748900715017710280050510218508746333748028182672386637611059367212151178910066446
- 0382809245724443141738580831441736587686372497575017241805055648156458882694424136256973792922559459
- 0205061321039231722794686286895619967419234007390131687938180418212831728509935919804705998908531525
- 5060611129029607455276541605554323462610167088128515203185163523305468450163097876868862516095539218
- 2019384304322085788084740784823651151685245792053763628583004724889499062322027715010389354247920672
- 7218039032318085454935230021570322404830357516834614195045183770461312945022064049232543372082330956
- 6895789820800186133500506875378551738982296086457926134601229336427894129347237377241183471056719947
- 4988132556630241748551125446135307313825080177595900205755256882935354103329405824763345954891191480
- 0263059411228562902099198297089226752024511822200112557157924073365057461275883823812394802411040449
- 0718897939017921349177985750287517112124497071036628890526745050625093926019965399546707668561456593
- 0046721731049675699045562486633893772473508896872455308678381939797414983908087007124844406148488248
- 9613102697330738591249879037418706260010514215839040887612370365371352029294878765054888518285342824
- 8410038398553662313376457670923704477054434480282490886232209658664498591943363119205831620545310144
- 5784822337399509556817273414508503565028059306482927185297472128532388175324000776256548899011148468
- 3462321804607071758237816362115737939333656351436126557882430018387059786827453486224103312709824869
- 4442254632051824297733063193782880524736277279010236575158387770445736380232431010591330252239746032
- 5442284253047639249936874122594125253442745719143579042619855980323554107555171796022257310079403792
- 9632241778553617780508804949631587383212867555429706886595155552168285084918184671511976087907235697
- 8603646204109197206493004123150188837770458311397629187009238052681820978751665089521199378270494551
- 3992044479894337884842312224876272598929978954825746643485755792646037586224230854016062202312395837
- 9396790618608202073848623338500638603716795394641282798171911311961478216700083080895078544581326695
- 4818166386256950925231648219178221346241417591335437979028341423778353888920595668461979810523192825
- 7665293832880911966876104818588964544244022054274896911206933353455235173072013952795452161236905634
- 5572702560858266064853839180881791607076066138641953390753463104231631434614551495468392152545717652
- 3017627907134670298964119348104686248731091290588286930561548550109865716994317948320400204615028922
- 4283253987204035091938364542056806579819349237779739923616433923284412229124161310236812384123094008
- 5955594392123890261014800241184367325721856692868521171174389577355671369440365534188266303219673712
- 2047784613967242423934382065575710146521083904110580254990574309270936597181213253729453276129255716
- 0338115993272951200795600781120533146361127222089311501471925179535242820970463835362813237330503957
- 9921425714309960203390688005783518739818893141181303060737189155369873116976049855114076377510951304
- 9911398393241826775067861293093343419446004710929787141898483801103110274188437832920482839062201145
- 9245419765221268914531787212145133126779878455604456159595249754529857535222154681714898414511138425
- 0814105501308548962342436284979104194400095354198478294098804365041833757195053081693362546548668506
- 7659486021084403208883697917857456235888145994833927128325817566478148930763018318845031751877025433
- 8151217217473808647418369178051185427139283059255152036961544265579274334095174087902928468948476751
- 2818289936936963800520966258096309522447841141623347063886751542015041317535385000813287716280810470
- 0188346896555554432576568037656735020267265299682668844678106657495635099985961788943244307515831054
- 9771763453238063905820477318116208907400124014920080192386954492021367930242580246465176983105671485
- 0197856958739975556787502966173286707949082756613216383025793652727117235764937197729881838765016004
- 6960198076260717297338719586498709909968724717494761114101478259018801182453610215220422049819761816
- 3530033988599978726056037579759868030733147522475640075715187922016448589055409022006921571006776359
- 2498572399552763201444121684915435778005526595484999851247978090199909088142554531420111741169391548
- 3314820573828041454362718046468662629137358234966482875220896995836290036596212940685485088790079706
- 0971536150493030709714479356640149031120553080824095024438419875824164708605864899073940687544131101
- 7445035194648723317674626024900661157888610971626885032390425642166579301971423307771445355387862843
- 2514336021250189909452614454005268521377177876674943223919259355906514401227995323657387859633667188
- 6798210051122484817540292475013669500504759670844180126373458801066225304001850669818109719049088130
- 2291872876366011259816340730258132566262078794293937730883405816982294048034393246806755200085304321
- 4053837036811967449736426643299033781535255022524682542776448272604906490826977213886983755924420723
- 7728578067019484075482502459031366717778767945828097120074709141033453979230407021247047895972416306
- 3167939042624636533153824680278462999849295582970677703673617809127448651096131947837554214734726097
- 7852214220697744173339302375889154517446218414658881740633219251066399862636936880015612905397748917
- 8692275227186600000648688606943843341695689761910479315504073790699480541423931403427721205641761019
- 1846519831622755248470937887500888830317863573072829187673035632713538749271862784783688027045784857
- 0870734728184365507652351170625675594045614751081746288865138894890196169187358664401789113965033124
- 8286282127732341495662570381436670394964964220174269652541250313866715492577924258247183930406221193
- 1552939524729565961088349107731184650661085378223722765072330072986433681676406634827126596611335519
- 4054621502427959882603393437778513689665892077747703809123061987976754485388849348861517902298951335
- 5151317816944793898448055101604475387293460208105642399995653132943818118179491682066434229861417488
- 8862468891091040157838357890464703385062422545091526178581720960154959041901980817249863332365323996
- 2035299833581288184440031231668441282092157103650031779327671655485926788764291194438852182338965094
- 4951082992926077565435181399883335003165944187490157382515153491173025292109119075949224257483071597
- 0710339463947729017711117954838753245430821919571097116313655851113361677992674500225456746172702619
- 2658228096930167652635367978562181504406855242502063277431207892459280730831609544932281990578760422
- 7141254698992203722558094193132907397952984690749668849730282861276834244509402541973342783863713321
- 6298271886802877048859039816542665131221746650688390343880540662876132415147364980113225683524539644
- 5917788087746545702095388905755986962043372578858288766430401486028813478566777522316770085281567031
- 3517086993687228395979776142704304433875367404610340962659814007959537338037660820668071019298809834
- 6461125352172626474614809062450843560918326623328614765717887367070432644964237558311181086135320630
- 4527313550133893258469803965075894599527870986867736616656527294096627095361899238083435232506453540
- 6536366700812380843142129160848939260647575042436077337007697801048622686697327206131308771242883807
- 9513682325960493546269875478506976087090621394446709870504353997170682855777324556183385967258415295
- 8438809541003637976907483263922322696763108630399810679689234160825946605411965782508337910051764307
- 1960066914226778080310863589495491266601968216898487279809973651882678777310532850591912303608390383
- 4063911136575293847387327396475869511903909612921446578009656278230854852576498319237213841985818804
- 9149140812202983666476256389535915309542442102381140094220105435873360217656075153784198983618305840
- 8095095792328872313144825688115900293087041948841952225155771425360196960007116347447439350056845634
- 4376900335741760282554910888521532392506087844859788167278966902631720010672064720740459424890050807
- 6282339720351383460410116855895150189454592283258699909935831848388833334959057125432197139992855669
- 8368262705426927598788149893889555327752195716198846758409266923712272429452524398252383641763866889
- 5023936487670293181515076725859767848492337458449430892319353106512504708445945982293233904494552069
- 1951947530503597462788335698461320222129938974906934284023355296263560276993322927250894302020639727
- 8510558905844300789720504880441292348947467288678389150262288852912874295275043556502096294224736793
- 4640352551269544793314931432012374843865246657866338104602907702516740675225470354471781686148529224
- 5879861896172324465895281971514061410121927327569484710478372857694609245181691687995355804049841241
- 1049197574392925110095931428097659219158870146386551402977596012953584700768611682922644374888309035
- 8961861126606849828180729560094573218650739506343957012535482591503536895771466916509576445043362651
- 2511991682040885348821839921490374688320638921958396771807212607327885619513135576575243413453665708
- 4865934159844354645376945359090314079655081066049468224721451838346650131789067411039280361890014419
- 2600451772699029465191226253027545038060324885188360479364632249905482580495776019740854482383090288
- 7041597312047031639348365489265472302515290804077270773036185182519612016624249355133908758669104232
- 9502521962227426242566715929828930404311900679570412010084094782659788365032760310302848431325642110
- 5347720758350314603861753293827376171032952138127566993973744418533716325063558390500476440504318465
- 5505073040899038926993628862046940269584431506310889786433825298791700659552819878337554177791762887
- 6197775025249067296380621847945014014371102715759436540408833825817964419430833308599847759889176852
- 2529027457842168969003684371389240369032563217458039652881882758186777509035040778567728215280374417
- 8285539246393030179355759946961952814180998160358562272455412759745369637536195570980535234513266574
- 6446826235548397593427568458345430580915983825089473892876921029768874299871189541517320435806519158
- 5613271735168111490983541922118283470365728867448815599802621633472873434300014617603878659001368802
- 5581277660263460014492081709590733726661036073624230859884385252469347359660993796975691783492560369
- 3389615646024653120908008670272784774156103600087897533676639449245622950923406638335836132514639323
- 9122021141047583736381538827391201590659474884818049489836365636223485421468944007752508002307778637
- 6424808628191028182034711831743730349334426177975436953771948128215642985465056109643559380311477664
- 3035513388882948516981378638751307499107404631767287595323655332912659476404873562844117507971390474
- 0055133239389619555128569785980204776976005252060680548352054715812429473628012190883115120816936817
- 0922796178050408945578359913093476322808015149969889135696881361110514023419878417059507765640482463
- 1188859014808337761115523768193830635714319409642574226714354981847395407794813508778895488544130013
- 3174612510004307332540107531424253624326777980106057834007304622567359488688561912669235601232984355
- 7726500006474319751470222670528280388950057002152053908057026851688179096653597758126368885914769419
- 7974829700113258576587857266967996800320896771899522050292034907180214016910200562865477296008692638
- 0272911146940147119550677284396877248732715812748042859781030245051328997441075754153570752061036910
- 2909431370692300027584895321251197846884642301068044903732891922605837738861309121071177058775287031
- 8746530455255581540388785652417324957369774887607670119504928941832459182180707700622495028789984059
- 9660972843531403320074981937074803208342455636186316599741500158189254372358414756584357119349433485
- 9756354649191752511745608308191804386335764683071924141075004094886850106059961850142045861653689695
- 5114758739606606076195171626252502367814350592999274323654217871595338031759236278898782949132690189
- 6017961588736995835363153030503048325861920935222145942082074130397798738379090640621247797034395114
- 1630488008217868194136392839249637892044245671039999528975670486179028806273423845473978447281935512
- 8116073381263279174219928320972189396961112814976972284264370275407503476407901345333133132456496302
- 8811571355381128154995238826309068009825704032522248214189545731194710504933927455593513204206562153
- 6892949366468640905631095853659861276550296528504908502547745982156692951273711332174559075315718029
- 0994325883405386994816409967232531224608321089931752489923443811948206643167694320572801425335205262
- 1878287214890835065610874192721644374574088327016759943094565014599538832556482404066112833332293469
- 4473822981475820213179753550555457762429632551222563613964468549978940344397493681610165919412356501
- 7327701212257496652664631173071157348366699751314182591158461432810857875813421737613298382076751955
- 5975541957172396642226764547465200211986278228782024036452599026354617705964647041183230009657954902
- 4871371179156318995621081675428352688809117989183270015100894309335022655098804172681489088122912870
- 8295210976641544476183309811369127897747712298020213321274658985263467192662455538831927714499914083
- 4101059524872569030654767321855578141002838442058890414682109669054337555206532913423204111494441007
- 7245985564152890121622584263525511470785955532136098809328950696448376187763252594271087013146790767
- 5027632598732576679119043428262705147524536494231169042157035922697585321023117194458974786817232156
- 1144409284498744812255972316167944415034458684482061781214268917234825687477876627836168367743249408
- 7732449489886910631126003804788658181342462107208455447364215184728768745937138298428035092082752117
- 6899384594910962462437545367749182746541846734745927049744842547339625754198994080811398880961788701
- 1452014324499095869529262140219339730031606517359189393323587541379546540821388091274730654354517356
- 6449093275849006172638897645842184591345904519770084034522599909618879193398402889543235627906082493
- 6894154632361167752940382683462355519428633099565126369680011564888048929462661936465231843409883458
- 6027305854133387446270545353835020397571542522128525212821830130299332661790412226923870614682842645
- 7480684458555758248668872135025417309371260417969124276481319974611402653413800502024718139556939770
- 2665136484009479262014589759138181669048177231659380550527069076839774618455309912602312300839997984
- 1076047829385141598878724798422390914376454307318765451890953265023109477426368636396795651027995433
- 0455019629951028984142909911558001888557617770337346744546784876147552509669944506590337393015003131
- 6083832059972984457035801649539935756873406560221992121815670455920865803054460810365368880519721305
- 7760336977912821309760536858063007951517605647629964106247398349695899949168518709749894440934598359
- 3523263468128802598854253196513163595894431454200681572435605398018596809437149428655669441490034911
- 1556979734615304236866068945047000453891921643594562912220420454155483397818361155128983312621025076
- 9674369298551683203785418677422376337169514555308472609142939192564006809487739878753639043132845210
- 9577870245721680367654253697556693376916893721596826427575374494974180054169944270856774686279433457
- 4127819345975089292370144992534455143533966206168461628694631883411638168732635660966844266181685087
- 8358302201726827279515949196298894654714150300669941787908569445027324080377784271503413853735560505
- 0774296153837658200559422209594072775101931880464424558912948593645383784405015959209169180992093220
- 8512267292474920514401517221610979212210269157230236569349855124309230660305936577985029687173529133
- 4499724162964734825673764078783302942775073652195965175395117328425384809993466669701185413116405189
- 4952655495008143931482664881444646402094078323539342361234953898624815016462628725140684415403232410
- 3038129212028434275834077158714583810420168862545619529592250289375037943829260402097400297659130668
- 6065952755327510698794454143399655516194986920940659152382011727678666162834438312481666252038836576
- 2541266998454645663056269563005241453508164490795914799096477820024481302876707249446871007039715991
- 1375934701497108624407665152147198933063018602130504808607034518380062795641871228536242328066541232
- 4259297091097700292972121994744426228543308684127337911626984752085482300415690572101220265546980356
- 7154815773525190469140430937889334079783576638924079458310538093398617146133213150026795797258189622
- 9057661511991624099919326321505998246815961203508619616218514095538350773709738165512965135202631895
- 2939243562395145390317544223633130657390191841231458942990560684292537598977918245736986947330423936
- 9233735211154133584762038181426924586220681605170577372233329961192988887052130039696680004463367180
- 9692370885305036087584320402755756772967005007093445629219875590098517416117101049895879708446952195
- 7848116947199891507108449626352546703160579177421169382207722093235260057182342362393439411167924584
- 0915260616864130025591430568111117797082777361518323078893856675090928097083693313274270041040190294
- 6144372591081348354917074104732302975622169328016927704919328931914111490886972438904204922187582597
- 9970675643926559694021381142671289816729574280407646858336987035423399064120619089258734901166405703
- 0824007649122612850101872935100246046182225683153238261980699821183840107194822899896073720109075703
- 4014732667850030562583899804980719849773423190191747246598372272074210855769543250590340703340504822
- 4226143087628088834201672994184495616288695892134723418576797210819805461815839733317831479781392885
- 0648258250881896576169717918714150170609154500399663989704484130921254691232004758442453751004184464
- 7710493477384411257984961966549943416890264371295126805623028208527087804399988117787752643841823140
- 5761652466193118860690405132423239531733139514493709568694609307469314164276161660931859705889566352
- 5960237753074830431316525457281206579123672849821857534745553875476826027002266247481546710531782539
- 1142737172074582716509627640099158475043363431826546354402640405973284371165072254032651366553949818
- 9050993479379819858069782186550218132703931536004981536976329865055365877436341521795877561245185803
- 4830994833708860254890915258282377983668348739557098706627632980572519218791453602855717737671378299
- 6157796051868521774624727977445894561254974374283190481535080953603345176201862224601260462488022681
- 4489030208699540534068141543851849396599038459111745869040957358146683360303234564462806343052444122
- 2099497111347024145602396931181520775528928748789363961892837294870079331117133257969760228398317745
- 5775458612993110518107239694876579428203755884462077707173234133890415195554046475576327027653380107
- 9265904501991399911148631955713222124599327298591184973501322417377527672498332161573711800569092997
- 0080181244718689665787726800545551153681979719882684807894522754243348703672318842103520350485308724
- 1154459384754965862009222207569799320338036937197011862068678541949525556332466091158655042170617676
- 5066648772023067335212871229572864628593292686770613076925551413724934001927652248539432700595619641
- 0907039162084403283279898661939875924646768939114950318280834793998604665837250695021325692175649023
- 8876561524018521701221162127468589481789850286474477872880522352356822852035937224412799366379674282
- 4483964378068084949230172094688777742518660795932453717290802613994109697676546634094312714343688065
- 8920699238896633992377814747893502809437366027590036462416130091873498595963428047847369567350496512
- 4278435885422229450338001132620039715846114551960415420912023544705338201478038741000722524862318388
- 8193780192165821037441670975857353741134083939552285787470682184294374504489182475143887812334555863
- 4507762627021771657630862420917470500401708664012755923070392599025709615495474257433275765180189688
- 3382854955713228848591640290722819747439084329162549923360313093772591162447164874142268157619944324
- 6160572956060077755727121477555028219570885987610308616526997434567736849345330753107855095203683421
- 5382026867636799048087551299768255483326900052195031300284825693688810115009007083340100905416054397
- 0501044880124123142517279266978094246624616089531136154168053097688007906225531274958649556987999188
- 8536255300611324583354828575063694882255737304037192527978009324019657545394260194974997779469639167
- 3674187369879878250594371175061368451255835800714655979918322786715428353719341954906222489359562248
- 7235001596551595820360278287417452051357454840974327538257555219568073477789127242952528547537741631
- 0543712273922030540663165394607929542801194972285986886262095970577136576745769464229858567404085499
- 3161468923354856786331441819221221368862997065403171115279792138934362829963788413277829395098920549
- 5568478674730118373845505613147815705416301181460518125831815266099326685656447494864272361110063990
- 2015319341288259832107369494952916086270297793904223636251591408247034324703681924639827518952691022
- 7950314933730899837799279245439411604715911973315412320997178133722888601536303280053212834939228219
- 4279859554554166792585108532064032098488506278156616214881284667672704162016898436880694859910074525
- 7530198237645384205604722679798456326015055493416189255332635667717529430341119018787056822355471201
- 5982950289360956336836118560837692702315069334026594230419562045967244077011364731694969106130497283
- 2176408469533539206481500583501825585103085490348803833748183194421881309584774220376952264714441724
- 5993959341190705441636307972141768559382864112094716562019410130765693954697559964008297600535418866
- 1788231110201727155730225505952903350137402586928542771974669844636030298141183451832193293466211910
- 4972061197368362956703341942779167623834154639216655897206710021103908596866839052817371965278139213
- 4501547568786291318332843345475807220124754674876828981892346880324971215786221858465238181791603387
- 6220544502610535277301691773664780882417390884452589138524041891705393013605620502532289090913146599
- 7522304654649626487270505042798563552499956894354846562905335283890524074768282346944251242205243214
- 6049691151599502745119211568291361987775744299750819945714978774047543664667121836718639985938647758
- 4804973795743103135561069226488933237941886210343030099671295756250603303590322176674941553563372391
- 1688903236692739237960555947822231835025757695690484995783553419927080045371029096730804871931921873
- 4905095783279092933409790112305095355177878797425730259126615147330971950212836644394579639594272143
- 4847918265638596525320195043897241592694683925242421860380728712661664237383521768393446568942250005
- 5758131518403085059725619469623569650725848509348137829283722170682289794264165425784454200928474864
- 5428513828372778381335135819408279535792283988973991137735931487315643412685577389382827974403739403
- 8580890547585376469202656818166100037622459230782536902831976059742661345582628952000747175198661393
- 4845228586067098922913986007376721642745021841899068751282105164071420660638958780283243197758108844
- 3726138355462961246061281033813110128147483064925001565512390649263760563155724150594446447578971934
- 9309910266809570814842381048841857925500513676842913511411251757939022262587400884536416338712775753
- 0258196237227159074255547573401193630835292546627694571481133866548463902123036916905804954067841731
- 0559465918598303503065831399068316976483876101199519366253613888976226616508466733759478466304203938
- 4465890384648834728228452379531706994116136410819446969967244407469283923641305679339230152919108360
- 7535780895440722657842315084058834195478235687997366218421868049687643075313951636703662637544391351
- 8542939738639303504732241669528654384395492271047001209217380103835760953115694497464875956857723939
- 5946125495083017942186451249760690958553284814130398283321957441569941230839326637951758977091254917
- 7973118459399261534522139961410983491061840577367414824444133572465291503100508044625750253745275459
- 8551539294860423302145828071311737531913940893517121551804301704622055447973766966747893173096271481
- 7804320524153739850169540905116883068125314868090439523232437602316225250438836689868570661653066181
- 9045685274746655871617726585165073415506594517561366784259071595185264923266119894199276978330288377
- 7941111750144741042290808902366083391940652111393237267613597885389234282889008977305473363126803325
- 1710912983926148497000542686160299429609638488644406004910294550396652917023423634660650422229602109
- 8785880069442156985770536698448410868673105069630296090619342316066387489900188289495125615591102404
- 4628205315937709684265648034603378173148140538450449907592035509064459099090914452597256714953028272
- 6452152739661221826041346147501028649224457265765754529032405471437060123443121775206577764552719001
- 1539533425054180753912191505983798526157337051622954411970307888743173998914579482534998715896943787
- 7343737675161566395464762435208186531597510366689707775832838650575235805017140232362041820853877746
- 7983029508442338331103745806536419079447497062847706547679482962188669259068217600673139160665816078
- 5832842513862468330626033667954679124922303238892956877289476121515363960309406276531197669010911380
- 4874054937787515860827573236354566858067490627165972159902992186708613896895137370683173156800919554
- 8277920465055777750668885211866929765211039077863184433695906723520283999964323963876867320361379164
- 6686795031121791267912049422686319695226494152603183846016537045092592578800424405944349467622855508
- 5452556602069422687732189463339027671535820222547033122347985668270282524598801234683953776355174689
- 1225367881238189199546378441270332418737376332561304223327118444507497424223782661970461040111226532
- 7588955723849850576364804940924804011116277087155527988407903612572788359124144608103336856769783495
- 8256973338399561692398900085029353534299965740696377950214085190300644954777473548411684055102877611
- 0864198567266226787228785939335839702878835954512635880762654146340514808297800269911581141860547629
- 5128819943083866532048426740555551025332274613422199310361947772049524338821178503225046229221424569
- 5555003313775842857102650520168844871279318563741260727741141786989397154226727632286584861696775818
- 7395294670929434525373350650056960134607318025776790991551345034841583984675265057374239747147481254
- 0093578195354597345847076500744709732549393103595244087802427666984630842644463867363801628651193925
- 9851334195630392655957116711230449799232117360684897591755826316223902262248984622865793572796249103
- 7640382310408048197494285927024632127390069050749887731732188546893642438942096492856644246175264232
- 7072727933081557155886648416319531614117369090813201902738952842515499672243034890237632805437291613
- 9822725299083690889249738852299592377545012678088732611954616362090049010456572723812186073402918544
- 7799535289959211945518805213829562617740804127330379420903678075311256760080426049507406190564878080
- 5023437355891615538992746563307620080099691290761006320537323126937279620073905433437462210258995721
- 3978891909703175501973559378692404636111602720633833840903223989418916722494065846038688359912725214
- 2008927927430986616350795728379051438551387295271129836678961619181394864073685794226166711785990514
- 0382347291400900979224913024997870400380541456406429066379039225230449217160958905202817816159901170
- 4358289134091358894393049509659960511332429448250983651074985148901512823058472152580251850119996729
- 0923019534159104663497514809765758541954441938660301023932894081909479278480783045240452965721750860
- 3472258594175772471071244270779869072099558068222519789986479329847328307793432374088524818024125993
- 6076280749955223104632199106829980811820415770202403786723523630415869096428133036466253394949402426
- 8686257659183352224135410200488785056997471685240672865751943425706257347366754736503125572083747217
- 0777317324261128030775906546923950229067582820612767349847106351976446644271672093846156072556820379
- 1375209490395388168627203084219274933011968906502185542429917425792226204508851936642892877228775513
- 0094773646300064241099299000459324667735313744405486684875877715788647542882513257102499583552305099
- 0406816463413145731448493938698331347774273521501166697679503234920870266706333426771215264880879536
- 5929937351899242067225119480731326592334357720796452977775486743842476892616068173391692812463591354
- 9460964501115658857292538244691171975572851078655298454278716583023412111155300074663525550482452345
- 4104857318779100347623305884072578334984425498805845876271348453269204022568383164232223709764547140
- 5091236413440636195922050000387149001957833598078100859888605597284847911653207087459343563080218716
- 2111489589626800897330821420606706376919309905812237161050163381359939183593187130304492618018971089
- 2820426100316149965985859667959009433747212333443895178821392131689613734560088472118340553704173908
- 8655022155389774248059789541723435365861490158428369474900604308895256061113875543858496272691509108
- 6239755480590136238040358262600530735745124871077414263477512509773977309390725282336321002648028822
- 9727064109520105288380786769462037156395760476611450058080477176427287800131312774132443027234088512
- 9896856038315246574743679823704601279075780608924227128322264403079900615323141020797123800533820530
- 5121911738709301983853679081734700155973475132833216025461225027248671258349531573900562069353295402
- 3597171539469246442743880275961486494129247527733741349507148780335377866363118562306153486757767063
- 2549018682958003825878848517645563087087772192083183889862253677915514040364912819332723464641041042
- 0881109312609839618401855846370235435946724857491530908048594183126096729940667484419440084259832175
- 4803345986174002004313785082861832997568177657103119631581865995049067237979178736721907515640653437
- 7644763062170576698567087492270750280876724620422535389447414241343631101664366396998808785733504534
- 6724540669218104268811566954384513391960569769130745213394121929508769111217525555025022707891471738
- 0068542365030323737486778702558389059893630502100871664697857118051661731567029479585884426271984103
- 5509462151000546726532666861744293511621047567390241977309661472422087045241117074333885178666262283
- 8975950520312887201895235448217394782194244399758999835006078041238792193065679325724872870197685892
- 4652325066961147397300880047710443386543722688439568250088571648130946844612709565431395575475805079
- 3514267563138193621702422973187848122776831895740704846233538362165958684330857962853761603136764747
- 8472565866092667662925760874527312462223550441586597063699892768170434994116812797928212969226927665
- 0708667244800880233097892820355930828885978535341197850211821400468425054674025497714173333668952304
- 9168314443762977348272050599618427960138243826409005405005054389956220325769403114107296693855412386
- 1845341651357163376862041548822631196037539535157965115615791687520081674536224127084386082271549504
- 4441606876735071527867361649906840791020504384460123082621949618692440030831429304478409256311863207
- 7751264305941995949177170641308906867774638543917793819757616446811106638932358361840915953211635978
- 8090633295173261028171014866694864396113101717553654033227890444701001976312123410764636362458309773
- 2689325932774191957149924498559646976173046729152699247405557698159349663077375470407104034797497551
- 7710849312135392429329973675722029345975758802576403917756905121552802314521029313049965333937302320
- 0920505409685661504058680341637934252197386129365897185693312537414578482782700860598921654039560817
- 3187429758719191069327571217995208732082698186359846006727643387648206815611367912284097379440355613
- 8714059739036867993047423692350310653421466641916361401970239342325752694299027469339644081593015791
- 8795154429053346261410491553156884501255855500091332206111270101844350069521746173065959864168810938
- 1630424976087706154578395449379187191797782140502257904967221220778160238014923812940085463237140405
- 2972776933521421226846185978211744358524205910970289419846246899952324223981655590466771322876361960
- 1838487431946537298122963352740628643961041759162471820635419743568571300716754368106285383585873611
- 4148832792331046006134451413086470002471956472167985528236769001963621404356498533319768880648886200
- 2046177902558022709496834234610834925724753544521339268873693931289850485958822328147510381188809460
- 4514397803692352923365109003413934584678504122917413504943706196058666194826656431821665662964560637
- 3347509328955343251749727379136224270823935645582443273066007731554713017808401693196075223441839922
- 7001189768898484463505526607269164237837900804794161768433438322845853768413811825116775638388925839
- 4020120613567446919670757527804706934458182769157795686023249588411602895983784051152559797838818410
- 2901478476234508967028966728888964765797782306997988192708835134933044589817086468179711128381820020
- 4419749911772154103420516542702703199984663491469520761598650684885220316328732259038150648355010008
- 4517784375450743614505922194240241872628249035634126526431192655030406320257536605315091862694230400
- 9333102482986091924700441157769350573870042859048669736423070558612735640205404826776438809032580278
- 8508769099480925732901733117165305467839238783985992084494944282354551111075567141794156706197119864
- 1995640898197469650383598560001537763197865942684706532072913018346587824492507819878301123504261299
- 1308041293778671171441743649417041309599842774961523852311952163541571620418554261725773289754274896
- 4252455836900805206971989783405327952496283264156934156139985728673098742262140288518128600190846032
- 3175013330780748312361641782613805117793371447041481211899591909802237467877728128904530357995934005
- 6720430564404493547802696346463971915660009263686421734741176193906414540231793906317382851890365239
- 8629007099830986252248923437122606098581030409576388510924389509763364947748584167476644141210442699
- 6776851984981650675379539545328708054990529826809162734102724026108419569462737591630570306936049304
- 9551760291677145256732350336713095707817696108902556901313383745115817342608720809197689623761582472
- 3279969676265949176968903500018108711473857434983640990927933694547181562903452870089331778646260018
- 4845835027509394656574351979662469396278967133275300103362167058028060203271745531773549327571281289
- 7223016943175659529582131377364076503258241209583942276617489875728184847630287518607461981595309145
- 1776753761422878153832469158203968556471318706824864146943554341864240898653402265297935042531053074
- 5564744585987765188270858920942199651867033066055402432358530574124988971883964658269498141403272968
- 0400985674094472202944414410268192913411094218741513282873310798232925145066107827921012180103111970
- 4277690769430354497528305709508933635333331851096902389069806293571634303881507485149898279017106593
- 6441270747611298518681777313704723445403745600286219167913221365782707024079509967914180334821962558
- 6266951974361124884659465827287656449897715944442118234927551749896827448384642155445225433577710157
- 1115312646908838680103921379271888579610984245440176035892736009257986197434102460936289896955972601
- 9190217380700975580237538083550621119923314740908846814351990335032977622554102622476650244698571713
- 5357265288218568611239302212235302190516277356974128634983540839032773548105080711638965572944766845
- 7921741120944840199655614355306898308612084948698645171066737076918157254460466820282052648523358699
- 2499908059551927828814586941368229897692946966657523038260343104885807605511708300919710119849253648
- 0728361569767818774221507110373995369276615245244965350910034528895977702974277885415339785881066071
- 5689492621308277949265494362107345696787855068738556113335206511000951672238444435331586671798353595
- 3576451196680957452740004243401544004906266613796295747065274075783714609400233265567720783707945010
- 2526980479349759953631214724888120659995044732454052956949161135437651275923571260142803889143997132
- 0628419546819688588417529292266886442621434063384323544903587183699050534709475844958153940545298839
- 1465186318150939736233214054509690894535311623502316264542428788803218861917253625798092179692510697
- 6631553486672128902553534276632117995418894408023111712410789106391179138011169084156147104326412032
- 4352019466878197773271630704885109519004363450847138672677153789281655621250931993308461735522700918
- 5624196261048152846404552681817698323603329448717990508744856244052584667057078202967384386993693546
- 5436456444723004453622737526653145299219622309881176456806767139785437916584732095046944304384883707
- 7186501843256927011517134949617369807824269408040645009225068239337956837176121539057082385854829100
- 4571562854052309447709233679921158488718861524422945904780396105235477529451843291821776470401267419
- 0255625784771039687550336529962214488179352640586781333262159209134904418941231255215399597795265706
- 8257462407649548661139248146700657227719602495734508058408702213078799454350725560360218895109924837
- 0331300766185308525391274076920389698099676917560701484757577914252713802209415938774884940496468312
- 0257215335558064888819994902449124874438702696481904561785671518215321421458688965726342557795756265
- 2700629297845964506174896425300021092247981808889462516757327350029677147050327998757989962912792874
- 6607578196479484752392035222645594063126283248417539754817457010657092602259317232087409327491400979
- 7818697026014374214786317938531308155711671801618419885007706082881144649675351462171955213852392511
- 0419841081641404822044249417827953801735743096369443649506351874820396050910708920984431416784064461
- 9109367713615057721430047516429278462760612587932649555864471865902984818220160210049977198361803778
- 2118959565168922539341826350103713632115778121460237093669106321911883916952705363199942535844908602
- 3980831429872436326258410691536617915011710034582739884502300190025577477431214334215609102142563004
- 7292952168051282215647987913148361230334611027752033829796984764875107530862096284647678635312023068
- 6050987180875128226550528198916999445054582528742745970634022960335685388694979938282801471099860087
- 0595684841215196473343476633762743513560052413635371901147912029922253153318866025153770683310154889
- 0999536990171736942984470666770482793224482341820656742587914678111518974774907255848915546647004332
- 9222039895064945277075532932299426267433298828142825568965733266786575619337195939080664291914750311
- 1328446751487396357728793429897564133604265814305092134813679852888292572515952463686670526471898396
- 1963598492113415695319863804558148479071780907869529272791840452294301029428367110839506348425063820
- 8555865392327654528622726648834185074874139385493074176302795550310290813677069430289701202531770184
- 9418209149792382963165602229836198034820405795231938132665460972135883930448521662872143525751137236
- 8450592929824956114742268292183057942653346922593252263720317019199984476757154104896916082005560929
- 3880438561539393886108000388931415514251988072813467570939331543005256903783714451599730234429145056
- 9986414675950303181271527278942502383466726331733374558809943544395003677567031091909407161141154055
- 7340884834283353599319214437106006859366026469934657200936031623444263821514244283917159614658131742
- 4731705156325348237931474944920069795480164682189884332759152807095398821268398936423181065489044804
- 8927684892185471067697886135033352449811386163739573102680251642313394115498106267049750201361285327
- 1679450641310008468510052112136399583903140226191080728990981630702063541311154226660786954871773820
- 2141054740140240326319645639300962185517129143265244274594414418275602144551534404540028743249577705
- 8449408098403302725818096317965249173507014948466841572546592899494762363700598048903965763138240276
- 9423666262269015147894711690498025494902525878222068537260457330359730907758353931703088870854234953
- 1223031802292879599064050177373344213062743143128615220905180899239090902879120512231186846024133278
- 6097500246750791712605774045752925643648232591599931664450989019146148028600254823438719690337398705
- 3600376311002385030885515627394262315739071459324738698502972134778226071168099600604407499093418534
- 0057217199340913082088234123050761235269621245455084222401498616621573160299790401496699491727462378
- 2673017894094249596068843773894743154058947327147016961985825091282157140530857846619186132280610365
- 0342003901308140379286128430225378811284489468830537103303123570043462316590768763089808395415916852
- 0545880947623711927889907467857536699281423524704411716652528910036053775597355884354254237465176941
- 8514470731452547687692899700595461349680397382329362389980198620565056246066813102252036805483248433
- 4969568965310038523754667587856799400946425372666150546757091298762361926700835987626785550302863066
- 8799392265099377398846083906682082066230124612997303780115748296449826052470590020138856244146334105
- 8145336313282560532052005929264808303132120350787766295846454418916953734242813903516292914225048390
- 3626144425573581074868348925185396565314981963055712419995035132382195118696723815145833934908285975
- 5991966972170453430432731619357189676268639789788684438861190418094418582586957960263456303755247758
- 3111543114762035938698507377670742765108248192897681013385969978614342443000676843942075955495740760
- 9325016782399296004574035775833310658604115555081469085084839959586167662512905315303224394011724448
- 8740345224071805352218797147385313216889626028531253487585855672513707818686352116963311057203172237
- 0604678119508611426666560265806290848488172315565972646242491374667624461437195284569352215618440020
- 8981301595486002990251885850735730715293231231813184991789363734145399134110220355654105101077243598
- 6055631748277847240137983474630972453826070078510252638166027436710934976867796097426453923241963379
- 8976824844220980191330548596452868142462908735370534116434769696472966752583007869309307984984271168
- 7904408338186326775973380325268242243329680739506418067156560271426821123031234294855165365321526945
- 7610646824700707679329111011960165468779920874150621869243525586056608143500705463657282512899089865
- 2988276265682300743770361058062226645479965700376271442571577258126868254662946872399564065097283240
- 7761438918770424976762342214513091793687746062916851839024680313643989741696135882918597365538906457
- 7513081193455198291814912845765152299640726298338964187393802463224707363927685951291328962522675690
- 3128989820889247134957014294468682265559575277458228284299728097773832127325305141699246552250666146
- 5591357598655474894260157123808779428472791143722367111530382747753341424240717948860202834057759385
- 8604743995094332651136487754324221472663136485905777194353727858104371833790095179817963113508959960
- 5570568421753214407989559231848085248780836755006834594839342478328565635247641894933649224929770885
- 8162423150204913980435904498100431493233010594490247471847639893163168444347404750568117237464392161
- 3431838126854709402109279571879936931386000038468514368458211668002182820129991748092639890989566539
- 4058295888600282744802699916980106424049242658107592127246906309924560742166116941838972040284553170
- 7331523151114205678509496575612039007683156747627210704573566171878402962624872115917692632706359138
- 7678465536199985983182304514554009697426850377501200832133206958860197305121870854184388061088381433
- 4713432566689792627702443419921807686310016485733840408240758539913655790811783908542062933068122947
- 2933559716393679462033539152709063720694673423381513834269471410243982243883086676898962441571506447
- 4790566932331808524642956292310160051118640956880068052259396549137978135636662786584825404606873151
- 6751685658713053052115870559273837534786890808148447224684033527700001191254671233038886156296696015
- 8721813302472824787916219784911643328606722244635288310532085836045805147849852094422354984713141131
- 8817352440769169838170078031706833636151053133551533095846623655392600802125833620966795554446296223
- 4869224431908474639193517496015959286204453799127924439547619127992304158443289127305216912408131923
- 4088661680918543382424029454461017088275160881042747219249209453946970268602852630794031070690991309
- 2204311596450429819108579944260900152451424283341581548822767582003641525105027903580048053428092302
- 3699820894145946331693593899070015559835064469082244498619717044307628693201445951564848777012594850
- 1151405397979633930100438405319067907436471299584718332138871109099823566722126380548683874189401010
- 7540013788101839315914880874786587879500151553964407616257750818635821793101172614404666888481821945
- 6044051379248831971545712438419343896724755144423665893647185182260718836387507045929451981123641178
- 0972307434095521941405244642200902221666865483560810185144317155508745203070668135820388435215498794
- 4960394947296065470806398245627394706397440640513789295335728586689990085990869067039434348708008176
- 0714050432569032008815369471670760999678083787526081073299247949817333213953183877832823591673701258
- 3124289064735474215088782551498414142350130167267508217911100255797251742760073937319214210392603297
- 0810769819058988038916181382579914443432210529156905787884745821110382660549894669376430572820094574
- 0752925336116365750936006367349850284388726581710725994107849303081301175864861158329066057327427060
- 3069996948240058608640332505107457077136203520688649462344119056316806989240695412565563981942471888
- 9220352243226097231754888531728266773910375723710106739337663808981515842676046852036203672407891490
- 1879273556180766175587818153830714572203881772971875938956629614975056785345081345976592828371823671
- 9243140097410543729784451016257543958762457903820890293493150148104836451353888928030438603690164265
- 8923162207218966651935591627497955048009255515951904618606791880818722697029796220208880024877871779
- 1258102117894250727613197954310962466401977209723226100268637455300186190885982565656265279366085407
- 8228115251551182617048217569561541627851396377824799523943593124697524369059218677942638333073373920
- 9231890347396557573966490982052618777270846169558736145592952198126893316443382397314238472615945308
- 8525408871886577640223851051087973101722522845299769476173758249952632471411817301602018331119181122
- 2813508856982100481816114616760485187369995611471710489695145284969675812583453612978034773231329653
- 5965223906335742142020499047977949714036872153280706435798771212837235867186123284810142893866885703
- 7620723484479675929144219538642201210820779887655110250311529371693291996515388780425162560257463240
- 8504228844997762389469269631528657293741343016936007603532936970641782778773779306501056973945611621
- 9240336676403090783541455138316434889449979237557815875014455206486934713086498330073898088056894346
- 0652073487595248873814528563311886966371772606539290129962451213621618212497585510924608606703292781
- 9860265252326322826483572273239183834925820212759389405715304112736281883610271502536481549937009962
- 4982612448826291798672824976494874375237721882327023286078786741446467607560018209489067346574075767
- 6455255636422430212091679637261321178552432544516726617845496108737903746066329417692646345850239275
- 5446300306386677951156431097661700950080536746629214903192289315461344795220517567305078224066541216
- 4309774725130449522884992542381654379640699109303726768644369877159674558387881782369993907291362951
- 1356585921262470605123799207098445306806751021923597625803820917959940362293224160002144948306949888
- 4798402571157588664260148826172477609227552782493180061245468044327036949428051996932474056765621398
- 6896794541045778067938189867874389603154930808754485087084139693776973877043177428658169640187113187
- 5555139837434149480436738506910996892834084554865883150782980444429217813519681652065459628859248994
- 7217333292060737007254838521659865898890770988354659504458514681125195787272983135614348787393577890
- 1650631075864406944483973846508885441240799357171892723876043392675414211824046241390905429387061282
- 3904674491829046176385817767365973869331068507357006883922614400496752244109439386794743104730175735
- 2214306870791138992751983374317080328301799688937442731252158213563170635121945802432086185211252156
- 3609484108627492827688256250168628994059815893041995881642867887107620110956075974128723052213171260
- 5071600536828028137772342999917730050094327364174874089319317228940480334599855226410892982215449118
- 1471363488518083295243711560960510757651097870387631281243959587830946173490398347583369466057915452
- 2058959144056918656096427650852458957058774828812041326123928589487352356033810431400035728912378562
- 7432502504636500743890095572740636949446188365286660543726152454172205829830850965936482841958696169
- 1157259324198273583245853831440167068161487347508612648751989780776187917496827001171248189184661389
- 8797807611495726137823984153462245734739133766906177880605463474924802150100016241121217139454356212
- 0000272927378809068638911983351608116287091044323730701597837680528428190952153900899546814560480934
- 7727238999210771270883119994083118190220414788829239645428650979881116428598216955662881290310706500
- 0093202373656256754844374179931102181762310080201404616668489913449894241224497019175557649285423992
- 3972482065041525370392288105886341191972034439414870165759984553384786876567773477091766714680382367
- 3134016398284078802053495468329590014417804615539401292235930446998544589414974439097524012233423549
- 6542515475897214184893791435027789414016885281649814395529829554011283072905955477612250008820025122
- 7256136937374376926594900873746044344756874791717024790073562716781833766636490104058900490891903746
- 4562017867738315369910284000822875981974853524725020143724210479284879675997055778633111140447469807
- 8827521309539908080311709187392213784736322633200766495163505108258978872205344514715051636392345586
- 2358747744662242736212811092579582876119166254153684657318540677262662818074645612365270570261399929
- 1616530551980465265030554548499179403755411083989139053949669149956241308657657440203839651663557873
- 0617890614207972461756714788535806936170019844579843509116551020022736519845348479824964461874462583
- 0476746482617361233386321767888312504912779200926688484238181854808972739446180692274654904673210947
- 4947459117309631426559931051181446498491646573488929909562360569180745378234301662743162359500345076
- 3718679986930718629506983311087556768767520957403143485900228811237823624226101946741693084249295818
- 8229097115975301249041505839344052802235065103086218445972740352939276989646953854696237284285171887
- 0062273433716976454998828682355302327643503763520442330312191859473589456042668354496126899092401308
- 9983378701351245239487953845969039342470609246933983359445142833816687683906014541970792247310862821
- 6859276547233642121807873842997293257587252274196921100888994834956422769640231142753912447443241958
- 9510468682513841571172266308178034083469444691605476793293889420433966208647272271340585034694769837
- 8481116592561577153522840427648249729162557314786408820040147197345096547770301284755681410163286181
- 3732440985906856266371605889070719967656969369557771869700083478267984657239831280624856641195835594
- 6686463368241014706634969054555589265162962210076841661897345442324855875315765411575235082441977440
- 5089409900945155868296661067096709024218856726351302207694616474196101248350048832439909968585541868
- 7667730961363628557499053167283427905552087494170066782095830556996249477733433635071383166500916099
- 4458603070199120636209472616281628154305055797300197875513378835228335930191701502437749238293956379
- 3589629549538010617350700506211537941161369245401779331106731368079062915857711534352906341740273374
- 6525121883693915935520571525480391410141160760734932551286532242006682870834932947027112382304481910
- 8063670170555516816605161708525775389709427072966869302260064896574146620726150470861373723724645325
- 4378255759009256753842261930842019301417055445797375197530047041686118589733242245538937939958889725
- 7396558578662120421137705850100415363247338063484930878170556606153341128860737674343207140406875176
- 8453010249189447882289246709247645453578114727268341198125157937479385901365363192228537725907459494
- 8916500890635310373293460482081275476655448033468975099417337722730080088351386612163960876950803327
- 7446327520211238336638907570173658688340714324957376376131890231795720119331834684075713003556003589
- 1019144267179484864097507034891571557880121672194813174243874698484019368355064257538885953635406457
- 8459525802634894053684852456612071352028218360912107282448603570984859862149911072056038245919485982
- 9823543664747724431874436259385244319349885976950847699830301144277916640235362440694889364336665191
- 2063300227069643142891417815651576241366067940864427739315087645327820000514311441693845021360245385
- 9527358241280822840514800724995059504215819802203211911703806022726228531527782250798281601848480446
- 3884542381877821710453476165937626072970888421769980440600360950716305937923533727603256790842966377
- 1490318446980759242293061592887578809375455664416098881032273324326116095521520558655728808412282000
- 0875492308382839802493037018529206223877098770427810125622682864582582074893745065734680589573571270
- 2446993304075235454486384826117949774906522988066396915491619456757341717414665666776155891302285172
- 4937498914231544042036008376023193268910997554626585144244130691699988162808907485969048306877241500
- 9109248226072211953662783562688880666917145514720406546986724461341839275466663949242227578726053861
- 9426620379390926492695130808143167659282504876472104863583938056093091373069208483881377562730641491
- 5510911084412526884282244779976582804516708878961001559623254578416946031392298780545287215559674980
- 4085046227082625986099215606656776059196478661965350118610338730120681862698898317555385634933349620
- 3625458890583539704996418141434400220806029988614134685842391393401535642324721425301428591205657638
- 5693562776247087717263782078595318143314668428861440577879484394185441455390118963375663753705902427
- 8787829869814914979048998218102052906879742490994284322732392927379229358949375634604471174134618118
- 7637755675531713533286944678866336852529977913388840625205355767274522687590942502698802623029029591
- 9800718727154390507570920489474278808112161753705708177786065723273944368967597196132409349773380717
- 7485067680661100024970948317758504896131681710471576013281159979796697117964893749365801828293146885
- 3266706863564738459193816300614124738538845590045829273118304531949237507394953597139353273415735585
- 1621085639294721898095939341482083584956933469183118947980144332181463352839107766288844960868696378
- 2651073755036361644921669180879049103339948482442207474508737919354745696156441020723233200904265039
- 4967045947946721723223141046197781792322796891151603338708596999475128428050100075079366668644883362
- 6725037759025211026258813348489287313666404959347028020629670055707734062202975577334989184277808485
- 0329492415000656210226872992169408430237869071121487459408905047676091555973770140654311513641993910
- 1532216931977506053626463245629378601040851025972253251730926509659234796949922483311768116594806088
- 0008261892370405949807704001739674582189242954895071687713310010397851533534531471068595709445060537
- 3359195365861719631497006018216015116781644587779937232745484370216719698324035215895168535513924782
- 0559128279615349166301514580517888411480971867069842722647325396278568856218601357551480258411912578
- 6169815402760912705074195114039656379289828828522740860145039535211265389538838677939951729586292709
- 4784127391152433112925946400072613464924997268181094515144033606300528712881176345574744004968524233
- 4339885902991306423665017309231172549322356936462708264736539614701936146564880823663856871274311814
- 6280242967084161021875899860964969235031298244682022862410158118338086958732157760182237896180157677
- 9989263352748408957310408461068537718696398441318584611504148287305023118066959863417933895317469817
- 7066866352511778784457585311149522528920915042815749224555913847113304271589135534111423495667324043
- 8530735724622868469222840837937344847060291693601399304095065459619003081838025272825630822093726975
- 2752989520766338895811003934670501955027215254070784222031586900159951308263848419748777684991692392
- 2196537231665447574407641010099650617126279590178098819258884779270810165459373325352841280200757510
- 4825911652513757834010089518476852491018622117355534863696984157401995560286512422361874058340908447
- 6878971542125953035591327072076061508973819799481185638356745062572946951343691678918263066507952431
- 1558263643719976037744462018791016135424477006273647656549196267616444680772190922929080866228112959
- 8849247811486715342571553676031195245475615652369677038537047688660469802138524803056117638206875750
- 6758136412862878013776514061907267002330978458776691822833391651290787076086693751711689174162769080
- 9551757279698052016821027162621360697060416091561788705305407209797684930266376389686627360501139889
- 8836733591351396031547428897471385416969392931830868002123289632959938127165372211852951450167108432
- 0746942049020976670074228274667222156833863413023286091104602401561230498455914095239210460975654364
- 8344461508550374997059553366602213462604839960122732736419106949439922465245700052391362273333832849
- 7275573933564959431552309012332305634341523510569628228677882109308461215686611444387076095828406715
- 1875349808971433102743967023207286830105305585474061120710903593522245318973774892872122393887443165
- 4802090390081081088526692277246193143825290972586311246157795502759822070616687080487695005424198755
- 6204669927466398863934848684014223352872821444039547842289174547658271945439737217167460006085368620
- 6659734305152428332728939125107799228171714059172236020738527892642080373792927864355780211583575735
- 8359060207378135471081449504904591832117553015450198368358598699232679936322436043562460202847050065
- 8345386692633431478982991467853814916433293733770647285611977754717802105720656241678062049249605068
- 1014505544400083691585386399196405583027286332121027159254780491989067089066871512194349441699015818
- 1216296916452965667288822617346469987438060666365012549193529951563426706148368629787919482858285181
- 2784137702694022167558068283567621527125100272253217550117539167618570824410005697863552015457177509
- 6098390350012825128730291388517597460971546374785158162912190028421493728409410165155706168620646222
- 0736689554939314543518226625017737147979968920612065325275418413914476113922152134614069286419355821
- 6544796702536944885444171239433349986029802709850271418159541678025432450545151692226883222768070584
- 1685710882489400810805982436388069304940140036054058825147274558825823285297655543660060976141881745
- 4395068351899430644076770973415827497543346074110326888197363251029598689127139183273239406546776520
- 5701268560215837385465875625128673719730520083545205711511563796715242285437561231936717685670090063
- 7354250309455101918511962299514032597437920935437420911843155116834985132549158654381928399557383125
- 9453672482506711473896296729908788858488825997010742272525040354818049628522570520823634851226938315
- 6280672836714743505598392797326066842950726351382751041974688976767259136901730651236573171953243101
- 2869561072580528336315890095826698417353963848720165200490649064035498544923722942741837841103308077
- 7386940393450466333220017422240536339407527505982935749108698818541052273129910222333976612533246907
- 3008027004902589119786609546141221334121389196263882666178655614634421081326330771760786638063634243
- 1909183254194322747324115237704877561380927960483576499695368748511308807062476127325750376659107831
- 6587857685506619883979458302690860270196411220225736605864073929143877225989074073598764473315527068
- 4661916708199094210860851403328060178785143014996799473634236622229182069032445301525015578576015228
- 8473671518234944926548288571797699263163527538455765576440677544890668248996613455952180097814220867
- 2688630564291540138296534685734899671972420171760414562999130251414447524884878859521922268437236453
- 2964338807885110699339769612778269162546309732353545146226413765213929750680992477659734726126909397
- 8722139280745585647099981589429668515562704033660587623053403109834593229001269832269205022015814343
- 0280800022365801546328825529047068250736300630781189568719809407671585126103344019382962718808600861
- 1697072396703943181261309742471117179019857430123990754035471650628805126492009560551345333620292630
- 6649809154087581763402129960016194911103493751576558875248272142376797264256426977368198890882172269
- 9265553049872479047981000650468434265519305954864635159658341932560199539427254246373171515176352439
- 5140380742442385772476565961524567466993162860282648550406859122463407696639769427013669388291856076
- 7582008669438337563145932941714551996669772822181470620906203497631712086466030605675614933109167359
- 6869262998033651598521300888024046181683318608779296650027792213476011617481352000602598951502189632
- 6415385131177521071464107072577934971822527267900599337018659615793278006617691118316761471579646487
- 4106952245376114568879231150886303623840717691959989003565807547270107199166447759227730658896111939
- 4275860246657291646477829595177925217284078607443295113156581166361862904473631555156558233734102054
- 1097055398105511858777484725531770169456197732740007627466291601557814989384991548006700158802872713
- 9647788555334050152578884671964802052467242449395518643725584409996006306300289818578112735319400344
- 4827534004296065595089225351860155422289176429463530972839057155251922006718225204483456957283024858
- 1587778354371951268596542670816960798234661679259260735618939895590289542298200690113501199927833705
- 7617540712583480582780681238942856193111114132504933164260528023303981416900679889803737603209951643
- 8489058699369606830710123179615266924530464923746322846279908242334798330374034450178644803988127559
- 2259020465366084691021379484236888145262969686621356647670201426725320564435031311714441377135146736
- 7169726545226546510614403820274351610225460111162195775537690901298148136883286248160366899277390833
- 9405147143384874769201164261948192396449463200446384746884791115170448439193867653031100824238704981
- 5245204055739620581831624869450329535091985805645898908744256831229254345074737341519527423647641802
- 8199548731737721290125242144675404294585540242390647170225700446424875936387663670677479620244276809
- 4377854825766512843776900931420986660710187029338593310437732853034371688951848025477991273331396336
- 6725069762400444399984287154827354002136228003638783578086193032813099949059658918893750753834426925
- 5703320890375832462846794994772016161849244806707260664239432321923207176003725231360026007938117888
- 5240250457731492535024973994254405139909972427789185118923895556724908833225321079886270815640003225
- 2780315109766866228334677738349417461225894542098000029093296907437726013869091027914062598515250597
- 7668184401078167066934000751493482854055561430475539110533143757464229486209744679084475876468363178
- 9277308598851113550957947449542186298667749669615947444409273113200669786113808590545317626494590167
- 8196971498613994922697223384527051438093895135046443755122548611170891396680893667779730994384880861
- 9331909104357860720849673073825937923963599328475100407272793862627167044754075719202503934191972545
- 1894831172790246140496689551790799869102537648909648459816709017139351206782839579961226311973314913
- 3778183433841931852367538662901900463343328532834341824921071916092767308013235369472648489276442979
- 8706811256546280611726046073321917630474121506403020178932057956876051027752505304361222709604675845
- 3127386616521424194086834083758914009511413392954577009473174811688536409418352861099710341672355817
- 8602823498202031499867940174041719140283936210519480604819018245180081701371042197459212798404024268
- 9630053355368549416400863921774567695344586508832862982165846016450780000359898521290123959007042026
- 6074498878506271760776222550606390745319477188925099058100936729891954099576633538658378098044793537
- 7991877121429774619764094727212140235326551777236163419660743763915386601945017769140062406841273162
- 9586080635067629377512529343675960734271996751352015800873739548389734399012382565682907859114425882
- 8521366169201402990041314621368063235265086541121808474998758441118362909790891983411875376649604809
- 3626489329104390597725632955813887767446954618157978704191597558335000377286724607351853508854954642
- 0293097158563694978576404837415055580991884020934333351281955145551857333488816491676944277824055543
- 3697731192014372254154192745059760137984144373599420287605255571893780411489261257983036183801077110
- 0500423923926441569227790057027947401364942291847933692535432484048780231777445184177958355825754761
- 8425495753958785494583430848044173708798492674195289323031489589916006854228795789294815900068735373
- 3333338638139084209948725511726171087294408886844785081163455852692141540299672098869371588623222033
- 1485581742682635950689362344813422473786939460923256600754721256741410342184901311896396765473291674
- 2471899342433028029092698507522949079709443009238672877439362551113136287615919738324134916722682612
- 2826312779381175080740895894397190025426412664947980176442016454158813176018972659624614413913192067
- 8503524638306577640165229732047089201146917133722878630370384531341942644142496649844744048617738513
- 5293731080998594728151117365071913988126930748269061403928642276627849432955882859383721484750707783
- 5511989622491195588237045064582005610170205324844490215022945617655618592145743990095548229413751544
- 1361329150430469141799412246093381651362627902827884213812207758942403884062294331727989259418366829
- 3679259604224184594177065301954864394817033552410287470447311715070347750834323733311632587672763683
- 4685844486562539187239460827324713500448957086803150325038676401735315079400345572855037001845602769
- 9615061568291416117061046161740824846267033518915255188248212726007259576567889912567870201497866790
- 8471066310748764673098909147197987925985906257336497349823503126098309873468616273935805790735490824
- 6830497284097732381167082491516373468087051052191917620541698826254760544581771117993776778696542169
- 9257855772042634424430420744954897033904345072061190076973635174019526563221392825831205282400374669
- 5459092804525968798460814087071953425476138836335351191121441431485055201235813806264923135383387675
- 8091889237975855157320365883176242411691675238145885920751640352366843726791759063705392197981126597
- 7081139473516719629999705209017090758985691638906642704235700744502775120104903948148329457443809746
- 2603510578981954076398706078758177407249118450697884299413834206081242839014881487259985418148029294
- 9227878324356105549156410917488770670678201198591095890983868839511718380134914825499274914269855259
- 5177653612624215726624488960961482979703084202105160279671478561594064613638247758902011025199234215
- 3210060175230257421223754210749591872867518955215532994532268942518840942282675774422227552820761560
- 7277103947182566802471066067738312063031466284744338620474325956850568928716265329083278784399650716
- 7242206138294532916600463808725630595241532881209370099229896006981396279686279567635198741824018562
- 9319849226233364318993090170488199525882733880795326588514493938124115432732058916457864229452684117
- 5188081840509569046913813443077848902114879712116283977344305484614980793562435496714129473332666422
- 4830500436445454702749172320783995650868018761732703319065657954753952069292520153070643504713068812
- 8903205385455639879921010956672982873047946610054316358462344874415554071338143234413117884241960190
- 3702868696242276246502400420813713504640159934720532755679503533906712721617790603021623997804185763
- 3481005448388703173071625525647995999986935319681301015629709787116730696494027491665726749434320813
- 2314613886925533494929411831638778899032594010934111572742980133181457828168791351424395578734205915
- 6145877368988080791707114551154762661682081777574724842787971298154823852036895916524054373052466728
- 7313030192582952498763932098573120916105613572201763927169959868610886760613384364961695186548486046
- 1684848240743838118074173422244839478939982780147342223057865410217729264820914094850350132241515599
- 9901630714781485270516144322582547801434401095336602393626424931385229405475364168364670415743005583
- 7298470401814557100296962346985059977885573699802182230354923831879762989415697721236384408891789275
- 2775284714477621892057425453151037479977706862362421899063030962822117732197082303477454550602385859
- 1140389896916662207787683260123961741999762365506363266016990661168908868774133378091951614977054921
- 4171181911014954347869382062098082787895731327899060020863391127847153684304381498150970304770886881
- 6359741925341341221913962874578109934248327141091782763176542096312507136692636588213575119987540115
- 7902802850780669833384183382667394553683196565717031946293364109272667274244992747322913800983574450
- 9134079930856836048467786653542105866800521154264867497239537936421566535872081855412598194547427516
- 1184169366255632419359158569508890535314121833662399878022115042456600150236469108159974192025443787
- 3610226712941228298888053367943950329404804961677110728788103161467730371502183528902414648175430954
- 9059448875410425016804069999819671937982082773346485581585910776178828497505468567913990401138456243
- 6040357440246191237694402200760421433573387260392537246640896649147146547300721952927374176796135652
- 3306780426820002423074121866748669462805878878738299523278050107066101385402880119138557309113805727
- 5589368194030938071886379375821544435162655991203087848205239374935189559715815518280481480783131053
- 5096823567161235509631615286658578590195287177546425064129849451057303533243348909799720945729170095
- 8784083221404405014741143817095657712526715779817097676384786420648761367939457844238586035649664463
- 1401310486670561346276901749283229004327112081922956415894815282655842219261890253051381591180342310
- 8851491226653917944817433904322700506874288819967061960688500673328353614680498596081402879119631127
- 4825466404370384782884007981579134452321016686737411212944968134510122379842940219479469166481503124
- 3187396911960215671211422794306820104087675680937389820546842147856014277688201880717174141274936746
- 7817513227710904673001530946777306922329095349569449160116904681818272347781619751257278515355698616
- 2922029188474530269830156638749177021947605094174866841197276604440854832975049890782580615390200301
- 0352180271792099508178391212339700700278329061937133682183369615408265203927161518022791528640768315
- 0329974060928048310506255157226287131327681824780116915493786248322401723837072716088641929421181718
- 5646748118569400870529961131410594582938703305286297918826493247420179551244232947629034883495272292
- 8308040122263722761102752038001209375208856240645311250372640153996437123370790374395120320285350254
- 7482779809303020219663250932909448819057451029852172830699622421954710165193932976937065457633343243
- 3256433136391221083529135557700812650539793164681494513412075121883505473968595553878091947374656627
- 9031868161713641615215540774535438041479845458406344747450856802808623241269693993112296405603273109
- 2793849169187933359614853517001814969826164800344027822813985879014862852128674617538485034806838652
- 0168074767440211476655696438739675796644295886409577559154192615071966537341081706497482220419135035
- 2239320369277923907369558805779975526019030814355084924759818577979802981264125192698083107565746594
- 6935112856279759057800341932347600136961144729013113729326518877314672141074127522101051515586571349
- 3912768855730064565566635935253545094573789688358002770721080754685197902156776635596085899524492722
- 0497752998154586253592955688586552190862034885742944354883401766168305532660245835994454330952973620
- 5642829474539664101759387807875790401431956726445025653896405200714870685370656271174667615719181064
- 2280464382686780641781701710145579987859492981028674877471679017435503993169683528592116481487861286
- 2891163759927684710887436616177623930982949823406413782807112174123783422241440699848632882392406563
- 7743898084631704339814190170417704585646785993494113767101851048288345847591129859911326180631166520
- 9771093260254577766404781139798120273962790521780796565933483031963863726360548172617544026268435726
- 4514741114361974748853281352543231321040655374753560914051335764484512650315994993984759123386762589
- 9886282674242141065631702826842027427753547852784980625547796730956213501075135701081437671209736106
- 5693389811287700643950868226352419579899875244531513268435771252695511656842606249795300564134236794
- 0326869432022127715528452294559060131663002332978618427293697054256408957224731479608422799606431211
- 5572289888413406901570607916985539706270694986922613155059545816240665427626536098988246922842402217
- 0510920884522641938004050647235141065446293973629500626870691857435034689078702526688990310590307332
- 0209977070195562670800784214175004024877643693827049667540691448956340009298523549912969960465402832
- 1299512881718293173380258934336088863956188145305493633210224670237123490797406812568724883352801820
- 8796868376748932865951563500158437345427148615342497125226151780864718350199049932178199155353873785
- 6234550871431390503843286965138769032905340152384282439639132568672927224870847796968092736560421516
- 9040230075017366194993585447144041522141064749724216152303724661255301796533454354088980086901630718
- 9158808455522198431157422312945196703758626058776263336684850752752847903442501653764916331792832073
- 5720436314962933262171984120414969390021578987584055068836313189782803270681820620114709707824647760
- 2762963513245135225192242786044766017845546358689564183440825955325433408871016151070367468245292204
- 6780848531852956030260393369987912529602307327858469371627037491448388916337500526216973323321524007
- 0875809848564628977918098482534272120248127256555150503057004181198951860921678780927093724148047112
- 0320927521638219693005366775084683589386544528152235347557559076380237852151946018272456823639549056
- 8125932747289545698934471141809813153649597485154106854609786330324864298777018635531367450811076763
- 8604733464029576882115288981356644930949310435890364514131755241478099253505914813095314712262341354
- 0646090598039300729540969213694564498578781314849834710618588580258335380086634822074587547577692067
- 4100675717787021480249068099354034049780869747523182136878867192069420344186215299004686685357497787
- 1014752845821521535098270986352770357562938493139316042388716899073982395618988722188420611902770942
- 9903227573668718607977070772155923264181360169717277740702884134571773206253029881617264064980178019
- 2696415503872932862487451156694400901469103714665895280769075063099165801904028249123963456798392695
- 6557159476136694387393330068373830818123094204415929595171871924926797929712950294915811852694465448
- 8816064489091085747384972252662561359833739178319495991506543998379398350900517433878817182955161844
- 7325706942293753652551534711785761849774779733167716071499421452638170475227272955705001733744013560
- 2978121687188613072957200868270472815099449365576135300683820300724872389186045558234056763187626236
- 2589043407960239552914408186887350391637299347162815765862853465444767189779664009434202490164341084
- 8630536408494091288771199650698045788071379779515912042538025709198604559673886019016344148290099729
- 7139228277863871263080176692137049349769043808195656188012979091465075440684531805169404962484549525
- 1863363242222261458699500929790456268865970393098396956023564388968632992332376590811424860358035451
- 6978206769488924866383306879176594263820092637789031658270502911378572975097400493867535805163232169
- 8473633858419735204876339455394642739288524974516748990465145947388497787436575894707717794356270743
- 2572285536101492929675650265851006003218146153612928591069343214878686374342977020598254510958054174
- 4556250811648819563443233555509154070228734506176634898004928111484860336673588052242980276245065806
- 4166164609330965832277412016870046186470873546075946002355373436366858463000829891159321746543217351
- 1755315755510186309658856027447328817436176453655926246176438777403799768860801841457644764303571298
- 3995556915655942311745306594836250206036438221735440965535395090457436938651043129342716658105214647
- 7362856041042715237293978124871060598593201780757738436706563113506859305888608362023477806498797585
- 3178401672905978765702813875802603233337988320303896853999145202912912522642348966197633971826810602
- 3709597596629809185348190125040315899625204717076766399868353153196608687529125423115375034755005153
- 6740686846995676773305775107923504903457787782633964738764290564016443331682245650903957006685680098
- 2518273305819042432261128948518491882214253968613100337137224301868395596441734670841783204007571512
- 4168083755413148247924004524308125367729689704440679643179742681593592031358215146396789238533146916
- 8480192378561366570636094221329625671822214085376580706834616858349637565564815213278800208251696180
- 7984840474867542864812471892324572784880995178492002381321495055976860978043922721365667914325583872
- 9396288555753189851339047123780845594071844832836115336157802570583643859337129234780510580916071579
- 2371735883271261645606567945034809907997205084227305474190778110649402160166666295094593246968082788
- 5873826896084877445611837984486573045432053689268403491423450881535101678575706668749563760666307293
- 6364979840910528400845462332617818149797614121818728612686534607116650955135477832306274118114820717
- 1646652654270991484788077768928234579548611067150494736473997364806652995373677999340235327496480103
- 4460008563976973633732229471469730277640940775396288390125824662939693898770158620893799185516933084
- 6381599653959133926292450056440676097423169030780271559700744418327838639200591504192666472875278979
- 5492770341508263915478969268833081660479564209112379312512452382628913239114259259248872353135341403
- 7167337993061711996480374076644403610827781509371989266789958837505255476092942001843074443896493496
- 8142535424422875482634672599399787959797254722441172876007712608840939504811921596748873955586267106
- 5490302132402247707926524977694495520510805641048220680217292763561522377385106360209720313789483890
- 8760877304444339107037138713316374909282154921296609435599576542505065970239239800133971925439883533
- 5819326042355334640709072858048652141533903522297060471220130494123455357789547124863000470556288945
- 5044608622266485238473107331722303856418653118021793512078836789316324319258064485005114528227697470
- 2881297556723041938969669115168403425219126668605613003845205389336911210081205025241087952203462366
- 0139062940958680638104861567034918952889959443421807536331295702241260765662837857763105841332497008
- 0210963951349160864205194055137980373826514725989990212475135972827648704803024095769246243692551113
- 9223531786948292842185557243747361826577956003518901587687598144266576265825837773537988011685811161
- 1885458719903282377257659747925555015170352252043295945668950459779859313354603058046287121050992002
- 6539199902203280298551349905589529620350811851911623933176841545106106551624788219806941469531402163
- 8542948465099305759018425477258768576414740917080050765864163376935814660781872244505837942437576287
- 0854540335011053709267102160168897425190172664771091187734019658761319238244016778669447316036433235
- 9105304639269254864734057622116648426993833030504817439731193500536761645050844763047325637642166613
- 9818172167153111289102455851620731970070031125405052082382908931287575642187541678615691797009700938
- 0501429846668521200159151132720592321337362451009271857273494135289481232311599234615896909789674454
- 1306276268725633046823353137159651300040615332005626421384322314827035473586350919884465338356840048
- 4168465383514752987266852104759009105167315924626485357070819430352359875504929773330753172203557347
- 0236517079315932787444549816445932473938377943652780031092775354373492970112030888508113851103629856
- 2059488346961563623208283108425028737613641284672645036795749821634469459924402320386636095796527312
- 5048912012359996284808751700271355908821282445921236597263623626193171749930602780067270385204438694
- 4202396265943071733875448439649357394016544694254389183159395967500993298475531832019709586811147403
- 4114643077490787323473238318431697758006951047596253478039290531227897202831710307704415204096202753
- 6066168775095387491356486548993528510813754662302301044164406078743379938865943431973972762809887255
- 3596421836886252528684292094076693531017467606143615040224106100657518385781845943097381666527422822
- 3595232656315600436346060661799295434268127824698023110783192217548828248443489421559050962496809551
- 6816141784081058068173009002631527217960747234579744753439008266238408070488767662012566975422632476
- 8414436029961270632036424767255662395841363346696342018339637825422544743063280535146449208028401169
- 3507171925134344917591634464815473816005896456760840579801659025574897671187722539527000178383461807
- 6833574250619637793972907186641657756554922398951160504436181020594168505418765847159029625940307677
- 1869386054624379389529177382974148463926922111853547905990950972997607473872962647276052104595112827
- 4356312709605950237557318061954525987653198881915837078060946073010461531407967225257577860927309190
- 2469192988451739871631507685766351864937976297380660316503198618172065118786733591976523956744318887
- 9533652290886520080140499811495657664501357148699739221946031665890119202261370639549215000080968080
- 4936515617904441399365473211942270762716806623267993172218125745760915245516705097654927987579284966
- 1673761936853435468604260079278210505029351060269911077292583322331389423980871654050463146586178672
- 1994997496972905979157918464803703518738864382027060980493400455678609307653826192652631811202186385
- 9251656925865948327448316434614594036961723580597179588829058381523697885331682301331452292999154059
- 2302274058550374062853590459765785964573806521600263159177428881248018307666463770771998546947143246
- 0415430871067788218769070796941313678460577018382839283094791609157762283512933081599452697606840265
- 9423392885871105440868306366385810204736320944965349887762757862699053539155327911881192633510691931
- 2733976667409148613974561452545275688380518228526608713496328388418368484801362645828954007306507915
- 6074102889083454659625380869625526263711592359482638454560872583686037619817067263374481287637268299
- 8877722944540407706789940164381250027554201698302306954511629983134310718899098625410160029355244154
- 8625913761597478709185153402568888130198921884456611164910632688832423448309628880496579742710340822
- 3736673828255772507677153051860616483063355980193407109897163098840874672591044598887595960530329248
- 8993638521193949096828371086457135234560158043864297103538466830596898796808358734978576267855658883
- 8364951627235452070877953346765867204916172087981314914169891375664645456974216663388028870931159655
- 2908909685832466209423687259552095876586763964525810627609539552914917651817376729189876677984251192
- 1680755258160046926728928376965028649208798782224421071404646730748519743713976053074322345155253212
- 1235870851616285214538008368612462951548039453329683773642486296457024358189231686226499499218634983
- 2468121494673751199481950450744965970432717604013383552223608153400047959819368522309258814575459795
- 6696947562389495724732524848660706542882562876735928839761419619059132908399469163841005321889186943
- 2565720667765232382473164380797696044457296944650283430616652216987080261757570512416411109207357726
- 2039704116888594037610584331302931444829065955684296487296377161321950732199716414417025654689461012
- 7030824597238418283604031166034891537160762328639666165618560009467155491519746730842325586767410973
- 3402984616967564210763223153678979988580683198922830859763375092946490387910743707740084634936236240
- 0830084950073558164966916759777865808111823047707424696436047327935182038471988961170359008300455685
- 1252805095510667699602373878235376637278226774052051061532018998380611491985952875002662945542273526
- 0581489488099794079523817886224433013323645543257410388370423239809214161496327553956636176867524381
- 7655662510133743046480820755285156491167182834541304723879598488899915627591908215219594535894398739
- 1987885447878558839301953170347124025007207286819666318891540923756298247737363589629303730274864925
- 1369197889067635824615369075723811889000386834089303979375199306538172287366775385114171618214640630
- 0539934079367210950941233283505714265283194967469485021225058627404548110939587405372888096652279949
- 1313504114857375818994915227341352040220177174269756103240539002593855895784915494068759108510900445
- 6698779029635899957858043995947222843355440391384551575459051012236770949004290725163272506438911414
- 9403143929338160492141148298696151260756811930048851604289256533437306862399621812008375911431730894
- 4198998029337723050652250270984972059596353606069301554054235809356222199901761551336947568289739010
- 0935189886891023056203345606747815955637373724315051310463884368461660222105807660550163384439513392
- 7539050471981112677893784252742930717142873760554379041535781461948559847060404010163365311893068369
- 6593975950084585133272847308800484877403931718396492321212575915598639683100503344056052789887661147
- 2430892073906771713344899959049955652866870431389745563864195065256263382007256053250254497912589372
- 8660693665274756954585549379365494669059562648221660110907222716643362714785994645999926749049549615
- 1264230852976404043695030783887567665223227853593755677217005441761522757890068849222464725810068548
- 3167616870537047140293293794295759712945613452455275456568249439714331385804950973720607539412574156
- 2910110232605185216108762961134662379674361123425177993400596014944329479641646003108837766887059200
- 4886201801963376976145058292176891376685475541938116074706436461835509504278367638447274620716138197
- 1191770444487975137788922899588473820082965070462231272806210512699103944589360789044290661289121648
- 8673293277124505955764999531645688888539374049657657168809130392423485693764450199912028784002735463
- 6310802804883903986446286631594078401029177968777418982862222702853291914550355495243566744611953366
- 8970392803076336134227848130080590245232298645365347593792470097712372514855978962233505503714082373
- 8855989996357257681528249857323029102096633655298097518691642928076192749832296521944816960437154884
- 7590855272358644048020175814257540052934387946196431967349029347026961869732830560212662858359414291
- 4176432704388399714037984862965074407226526416346342898291915406945822384005322871978130120342846511
- 5000214159693875605989584674337883215104458173349102931408492619625443010694755863267361339601315493
- 6002702882265375501691319481721677272774887979071308645912517689622702343482671737444762540360443612
- 3834266368529097934730262217743440936100473438325947055617962424701479577599383961282821867040465947
- 3671346740038028868906734350560654196291543982323319166341577275777262556671272875677647403587825186
- 3240142935123099265241861053652623906898057679590093782672125122055111315834782392514171893266684869
- 6741049338628805893314125836487308559685236487095735227355156417316000570435683375128586486798777626
- 8789119701741989262975037390169668114553105639638913349194784911260028872720224362955411330210328883
- 1252179038609153411678577623388013856364347123025313312758349214962681684346180565506437686484432169
- 1600993297935886971326345948047658016730287623626375404641773711712333755529076168457609841203148149
- 0671265447881308749669265249507283763395824831279554241699844491415609082123420144663561151439878692
- 8367644038199996073613035658764068334110290878236852304517716218148049432624678420340375691218100204
- 8571334683860316409189049331870282565113342259651395183628517923265340031625303117768583043905855303
- 1434700094995404289931062006909384298598494625764243642747550200929598219970537138567540242399582249
- 3614688183578390529256276625781476282549052153118845167267925851062996411218904742903268982903001953
- 9195564907348181246684338993876522912442311981457466200937808079651108208092025003722176564662265462
- 8516780697561651229846904028763819653602313563613649766389022197923617233885491819809573522970142320
- 4549139476002030983118265134708319579082742177973229110014981104209291997270793913105416884305647668
- 0682881432639312292484752803515563282795273265608341088161697961023963066523100437026823091533999011
- 0185178408534796664576963995643862325907256630756039470551358975851270259376353252345454607115787656
- 7775171323140719849308707274172599038347990837752226623850161890001369665331022529573865193690993625
- 8963337910411775860518781920708777656099941098051551760524338381498578844158021483003773807294222057
- 6114221873419120173809741916039089694570812869196186877182344133397780597593991704085257402459527953
- 5895516836710461224141484882350704209894946405334610298148181498384962874854695004074324843010042370
- 2377026935949778090939009555164281254168379512226340810340240060173185622836711787912863505765122105
- 2346487547089228654757979919866349134336745731780800010159228032458041560620405881497336905468838305
- 6831118856426927446668256282605693182711497110790802221674273725205608523980970519287617281829491707
- 9681084956342092215680052226576590502708101059646896004191594139713443207974875200619703621436531076
- 8194923146657468333019425617725802965628710574635667936196429335090417591547605643722848231520544883
- 2642676308711147460636034732834323009419042086748123219633559808929813901374321723190294403380213835
- 0378466582478492823716028457090185093998630876897463612139222874464372822230689814427108087673984745
- 1986859735656832475850237902290438743386565016354309204949751394651712042399638048515240438271400499
- 8736609221595167943665520971624671902878497234306879414622093306540351514653335343817621214097499529
- 0813343668874219608546300562941871857198979654903892260994006458134576989890293752526031594793520517
- 2873837166700721547961956375740701285592607563335804361178569570327151086097332660021100882712319916
- 3759340997123032026138109889964222097317552741425536341306159729484372048567305363345356618321960256
- 9723677437664041985539084586654773133442430617212600862976052967207859322562292355846262846333189292
- 8319836100025921871137039971505577493204875978319767136286320184428233653934716363794571277158840984
- 1768777705511446946524042208853820282498929639508467046570193475974601082109002237981389393889173661
- 9958702353222196294149913960484299279341165867048778571113372653492856653689288750896260840586049730
- 8118077965006010068109796230455954801189768566196762423893127565241655983194566147167582205720515073
- 3187438649959207729217154115270702515737429327406030388997018176392492844496144989211996008741455920
- 1197110619178135600831179394370021856788080126118115799464147173035479067670391626448036915230016380
- 9750954986478577153019332075870767280738241627299798565721981668444519311512147215394626062415474788
- 4492531474522234289814443935668965208172835201849104468501236353466594439101771286059078923203698177
- 8144140657657953141693427566274427564792495722561771122441508205905726084814714045923953079597060427
- 1724592752165506005137153967772426318259343164959994084881348962944398019280504469903074332958696420
- 2347799440608555298026016876274594816524700132047509569931582510565956554511246812167410441892014971
- 2917059113204648692995218936078725719895433268702764211207971112580634371790702853656868188130649315
- 2903586491231366257190281160804499253317309331886197389137211839634887920380921481773975151215550607
- 1421237847824951464949328585000899517323133417944919571954937381022516204335585096404429995065494821
- 8174918298209802850161357646979930679132224784985129587419897623402048264287062020511304845432074564
- 3630546829858997903588405564610067458997230028648958952414533037922186076757219603000199840534610423
- 6967394846598198903322644713641778288583186156410899810633325669588014908754891185529444754877770703
- 3254281654048701145290259162535198012387414010436036309205281399608185782175059199204440716799015338
- 4458640154205422766039495098525317146476566588668145884224627681547177489770602016193969477385529779
- 5179206393425938196355238038842483958103927567056400517745841545364779201707342682078953784241931871
- 8112513400191354907522301885366424561518864030265041520622587526974644830596060008664808467397587469
- 4031004430507110080328575618526003370683321783410069730737036403212982503954591566451625180163585488
- 9250188649041767130862347416451200097805267165914094586669529719432662613627554666276397479883132420
- 7660024708256555168634654157322730379846334974354176053391180554958485171003065047146570917400082202
- 2033342084271621025506998295166962322792052067901249991059790172386421758536906421361877237109133881
- 4995600185227362965360920637316839784737149841162314047954571631028508309649294656142890777360309568
- 9141375737242200843195367673720751672340211743272646707775707205664465381708610430491301993304747985
- 9635164887964619449295289058257309790409506277206668356944279880549619837512732746507601821215205334
- 9220808519176266170836135723334251006968310417820797186065027973257761157165072402736511990861376703
- 8988665032755774389422758156617307697218364368019421958476811417575765780225941229369376285483761501
- 1371209444777267883907263765061893274494741092640586931989590585599696009720463567109558642594222507
- 1342281083161078785456208386552686224968775589567428400965170789743998364521940287896992967688552250
- 9924548113167981196095844999451283017439565864554253492467331927699292211498644288427428218962343777
- 0714914385776080580848564273037171353764245306793786945790575233507643881521810656607927075157252883
- 9918515710526005618833910853622127568842615368679981807360170875673642170133324263530619346354543601
- 7260388552556774580621314638205488997794379948659252807324771277015335667243051287455111305227076922
- 6215106526147981396130120548259553984982903822165854000278718281794527593457598160626825669353591091
- 9702531758789585078642512381690228684408855504623386176809374387125500306276779114460427175023690482
- 6053496822003468062797939752823723519731070856662324732554815669120184661565393448604754035740573532
- 6497356594491899073616081176313352491857472402949142219105534669423028663739063083795795265229165823
- 0260997650740918733400133052343101030377785078752063516583462778448353683665590270558349479612983505
- 6123943390247573969305052295130811046709132498820483153789422613223556634309811418309866847681028257
- 1550286827483833975719258734740115366467168262937015526822442127711052390917969319239127737977176880
- 1542246883496201400997322757593293917724086463489283646444353876181138341439888235343530623717836037
- 7270922206790149131574946123524864980368060944848857198938411919684715248368996081472224187543173353
- 3374236949008176264368931636788534545428571396360327509922895712580324146305634287293186997117594565
- 8363103616835157351924115291745856865483974709206998158899997133603670512517832216587046941565206271
- 2941883036728616973277595474898327009337617091038055159386077975183164791131510918328012752515936515
- 0488607939884858609930811934938012778967091084784084709431548945577055045503618218115460265023335986
- 6262119075457284333340654655923652677967900972402255903766627701571787453010678368459746242411941460
- 9270255181653574496408037076359218204807031707800495030515279198046841480292623759144109388211758454
- 2230025871050989743405380196080967060017294461315943539319021552498639177030603251093959660382062356
- 4441379417884276524064389978721528985487390825419481126849740034138058770293316002349752331437832506
- 8346832390294862961289177107044987706230858455583007253858193699956274947316552089561794462764776882
- 7751115761470499019482284323868027347074673862814752675333720121010716466861961600633771352137821138
- 8572121554773972169330440194716653483026828509805531003676041798533591083991213560094604211825482838
- 2608059451163333745999330985400909567553128225040676460073412663544062482616605635769125279981301615
- 9259426864869950047247753327706499938464441139295589691465220429908122439062860004650357381269521702
- 2563921682177336732020915867504500478898168703646096151846004855741439881726097384472127464419545019
- 8335593231768829557830645802089829527631549073550054654111113719476304362617329785902846513191614666
- 5516766350641193345758667137818109841564659296236576908362716072233814788508550638863177490787234919
- 1987679896746362545471260440954168197799220710427640251548433196477390558104961000164705989515785294
- 3991917985197806089395678647197363890098524223400054422376311640315186427938021795265684299781428838
- 3213895982439395887701557990783944892067091706552034967699860541559021057651477157873786751371254730
- 4466033499423963787796271176836236896244596776440199697869302789570435167443150980228986501287745403
- 9340739724267160500255878549888894099384209100168173874898358456289352751707911705490005436219621706
- 4294043278062798737866767302228520183704159213524224275962837503729973495914312511292396853190129753
- 5611629672308486174323176389298817540247039152280625468479103097962829343042133940228841293104759404
- 3460835668343232495613647542579862544554498896351671364445937935735007027731767348845174887099668250
- 8104389915567709984887401788299074948442331678830180605973715188996429503241991398806477821402001041
- 1177747896883955510807421116480422750798779310315115110843383177288725255853668013231927523396907869
- 3015925808524191590883768045362608975083421104441911728556321464612372029116740614660357396431901332
- 6735113831808685442753061156822006420507762762431630907633957468027315291779908101253549436125914719
- 8875238666399374852539797888793077692813208745702729612199390812546255462541090083430520403871083838
- 5722642176756302904930176929511528857908547895413427296790845515266249771074342215376569954921693119
- 0035675588797196959360894440560279853228297459230057292902250191869049960515196346658738457662861655
- 8370926229549052558715098878019153598544171672135730700635697462366450699943859586530458169557668141
- 5188637516729582855194702568148675216121345853932624252174469525507007692700832805350536951638370248
- 2620563452119086436094550878637455568841651474777446606868027320905274568175395157132037546217069826
- 2614847590710692505568871840363000530513868109575388748063346329994876955374348108245413109810837369
- 0707510452638146157137362035056374120611543698395643113673185097174963434058322907235834016182906087
- 1658710160130421591917139023645897059027348156810722898671953025796837645639897187692251759331558679
- 7334077373304321675565391075575423891616070212271737592070056307136843747821213528898979866821776283
- 2572533345183230392747618654039192087965652589286081930704035739642080989321089432200851994167611717
- 5273539788820266187445622820220531528314278483033868602799651751797558198833310256254382304160189423
- 3917038633783579210320377866821806189086326486741966200834537726721380300483534966960106622413864272
- 5292530005372917737061162348654387360333573151227139300475257703092179902691056833698681470070046680
- 7131900900638769068942035418676510749733938247585986386289190118498516056762720635681836412579224498
- 2802899653618617776686778141029039884734762717902348638353671988418153776428435790683635879056700585
- 8121342784860173429927311498525829426381306584979321719602718883988881367210302529373730687284284252
- 6768184950327932957470704537523032086408891882046920257811437470677421043931464527865896380704085307
- 4482407805394314796823543620540986524254461309609568972992532000469372276519264525234710438680616284
- 4150263272906125719272577676314022420185623514890590306131224408194389634712598106722230807362487403
- 8823446428048391759971189069304948686931188157335894633373137830646307582206036072722165120394083173
- 6077127229108945530997277130413106141567730248755030303311974593678235696920692900868406551784355069
- 9097961301208591342082523653831972164002578438653155268518045595065276218297807292700162623807539845
- 3178749321457176744284224049806304873363455955714192165559906931601168545680475785694458258146525410
- 5690942130415186078742436405050757001169784515992851436363314191985622039283636376980736964248023175
- 0529550137335897960359874442590363690717246275208403121238030892613188023207103014046119559039673478
- 3221472762103942851915451503469923928686060878948272040131551785488924211858750326012076622758794866
- 1078061994316694602312466700366406945698803378941916927909305638007712556961113855111068230718626350
- 8781301659159665719956166392695240132819371226867383997102313023718606144240281675000278523701329742
- 8005731412337710767305263002918854321849520377262517251966548985863027520198580555286556701741242478
- 1398441147945614036133723592910024028800169542825276370017260558174084453430805114569010709200685375
- 1074980056229956793937036094216558524012682608620139896639979818266838146426887629454986869869560183
- 5872133246870517519561716040850360702192659349072702510994757252219108424455952078308514342748979583
- 1409061138136873218656247805199733098940110047570718189852293784438141434541275082709849791964579292
- 0802355036436353509601251717716805655499827883668720305795332335489227358143909560512229294254511059
- 6156659899801588064005422943187694927076222111028476180826159644660270430972905492918095775775902696
- 2478243427196842521066737089539128792695710391317015524198956659379628884094286905195234919075493968
- 3374338510867886831129748407742561428880242025456470750857403395398767464470647241224405084157459877
- 3169274280657938451080829334713697457317170780121504655607730879875787050244201825130662513284579379
- 6693426746591767544732128729799255322939565415828683586256392962270161695814361047964633701681690383
- 7002557364944013958190229025904302917933014131985196006053939593015118034855063021486381739005927865
- 9377962839746005016600245619242505593516523938993857858329225917116476018331586739589226917986771992
- 6426770722804451657455450128217130748500736779344547024871488371884766882437818598556832300391829250
- 7222124723395438145081249592057273858216386717412145544407200077462566779999303388581438395224684186
- 0609946505511749493126247475454114900899298880244751171439414717156204843166161483490190460011909296
- 2556851628776043685120922176537252030663261027926045712112346384308976910057607603820506269489451831
- 3368129757008494650362783044503424298855803363561984544505418523948398908251480866797159530872371873
- 2952461752619649890592054696908404522519746654776340655367050839612952694377982971982255074008724675
- 7960737559298851192270040140899223099769250729082437252930253655458496293343701951694483160099816953
- 8217539750893931830881834902561945268977264011060413490804531314501071393769710546347665429387332788
- 4965077889115704433899875968620677669411702353257219697006335598012767963217354057017373873456002788
- 4615557553918888819015793780554417315212471104852527959766608726189792991456157552097970404808675605
- 4469428312274540256332191157104455429631522523043608263630844221033568337100347482864619734312032202
- 4724439322933802978839273166096657341966481397117329057631860775941914189828747832911366843302535292
- 5249647921101964649065217824280216584448011941483756087062646822170527885558666093973084921172488988
- 0705529500413886690763683994300818877934803775541180454695193374369307401500438691562902746936145881
- 4570456637297627949440616093119931117418045204492835456146997128768235017514453738928383768007204168
- 0696395364925057869308093258643237958397918508366785268709394339609878348151314236645262541524927558
- 7799065325616332081271863536440504910181314864879728064836084966650248920735697536217190475720554079
- 2696638443542621309943524325188309713530823407873141549480966574879196207042981321762437810817966000
- 0362780596168645858331102483433125102935266385776539714735100522118161656726351353841367755589213883
- 3561375461669015061175377649637297641275729796185460065305881543374664637502467661873682860135938997
- 9661048870373212998988077189303455828424798632586508329716478813687836934043158699441584056073105170
- 0807409062423229834214836459375406668988799024529677503806308864246235400067920501694025766842267333
- 7762347007385086104194711069943580453445570489168572684254649000937125624761059366963889973127846586
- 2443799144139951569466810839263252231819117286400745587634104562885751255056808152522939279259781486
- 1747545269477638044769959550506070304057230748023470574234467241031229653495050651701165431324285219
- 7592232503963491802465431634661291802225697714089021233932878860417394101352631152036911145392003875
- 4109001217400800370764068065824627805087557204105425815704573154793095847220829190461794537539554705
- 5895534904623810081663731945502358481019922271929120161775202444668605900966401426557247684365331867
- 0352206558014589136521421488427956558662705933887491878639391231094985612126299412921957055098215904
- 1459138611252665621879456917858641408418466291812312771701856076429841403475924859795364139295700295
- 3996000447652417411806360908910703299357601235674502894896672436831132348273563813700784818092204544
- 4878697136394407140683810853750237906792549199074354539111875441697879774458807061279467910261059726
- 7850687549686191026642898726604155400035593706209614687774802119559012974434756190369015032298765074
- 4211659407494846421163583607742142679643983102756815554612105716791531072217779302545732287453729298
- 9194954644443021474349443399152619976461756050044687614144519713784817621178977241435546735467024250
- 7347836422189788430240648952846314388163435075296533334782074398744784424394834378621580005295941201
- 6958449975956621953145946385170657449406445413770883853227475395462267472178164107859715062639482911
- 7437331691230877947558401624524346731607652792303833610840339322785923043706961423361851512020163003
- 7106473392360159409348761413931578014737552099930571439690936141780868692008127299950126894063381545
- 9426180425248707055293695120120933850061826700896112557402629284289397798199536585334676890135251331
- 6544784862113897579395337638477043789600054374631526792261265540350013294479593320389950440369123410
- 0895651264183332718963511651306511767120225793729061014842352467437854740469612582211063998326045158
- 1254754677929322160100396891835166867336830393136298532998872877313365140099200771811594958529964781
- 8660678895687304129796819333868640365429982502489760838987278799683224799486129062153811952781175065
- 3500768127034638069985321345239607040850382203113837312467354408540035498055988976284821825502984175
- 1924213819952951835534403125784310766698198236289049859569939761472019504074153418288497163679555729
- 9811576928990294536517544152653286097253112470609774310064281021572319914392872471828409399674138326
- 9759137019206039345242446281820941620536688358917458615199461028929758611633262539363485791650895497
- 4755610887043082657833533954872060436193138168742118417529818004502462401321388921541354063163302382
- 1615654645339912191886658802828303673099471289780816548788972062587681901474865764326474554358647966
- 0505441931400783305815766575393391766014969017251101351930327641254379081724668999981078707432988286
- 0632105428729230684618965421625785755601612552340300580197329431255534421488652069980970043014298345
- 0790538092344582436794387491628148340152942878299190846211322390876235024637891877012267547630879194
- 5324149114109125348773470452902228567697375702167027235152036832281449865303019336247358246400226530
- 1781786230613182673475745562719183138593703869423224060783415856173750148103203795100191326222685916
- 2075839999284142583607550237036751437347250061084565212317820690269323271707170180717500766710702438
- 3008821349562114209666627925762947535365612231196303487297992396129561001441176843099144359806556684
- 7331837711114898251668605288243158296681577367429301750530961966351587675538641288368646401680329010
- 2098364145390136182012310600000775796607677144532374490366645381903303565964053774848637705689195214
- 3606796432870265114198205871409962188495412759055289662717437163787015463118234995808051672638789869
- 0116970574332525233066881141023090637160965393382917542474057228131824852865622014084294835890305433
- 1768669388627252990137430129882853320414925964724870842887086812156215565905552011876699209953492885
- 8695129349256205885299759459814735055255033151457349813024963566600571562129412882016229998481452915
- 8027274529433671346133989549925197261429546713411065508748687356789905052618418649467003626154556517
- 8590074743468302203353062126331982820548103883294377278480154352985423406909915122071140819165328421
- 6286828263663561083432356662184583496584243511408252713418446704388546056408915331118311239118605398
- 7811676276761370365842848180731392005624904716232823299108066060664706264035428591900796973473018870
- 5856542992129141065083105024921181152561006374229243293904732428585904369109978087368701612715657608
- 6252725630413794618685327159089484682802764387819688303469013986309935348904399396141313859646288438
- 5448545178614698948363593025023338886138660578825349382042975420534819660539437264347797913552987090
- 4409751671425654917341865740283310563786899303765618156623518204755499419434971521548912142520647079
- 2904376212845403635654004264438858799154465265045884415022083481899808252376263783493919299087741863
- 3119502333553507950955019850442946460037920770326472316538371677976322551046150834470572786498431040
- 6919552119029089819095506643754003665989157129669037382605868862209431585676214169462770034461465588
- 3709614541838367816532646717988704751624200276984105681049934797417474275556623834482187239492559872
- 4808179028869791780821130782667388227175699536815810068349441770141103531411070982796796045742155734
- 6773729313183574290098817251070700102705681610590925619773872526295496706438269748763152709963323153
- 8978021419584628370235855228029775802140619125039390009549720689692293515487099579621681865172941430
- 0236510071410275558943126234999452621742518340731495182266541367071120543595047705298405516414408231
- 6040094148593227671833561041031952334848460795236466106998696317658850281933170909277543809750296912
- 9282902871827186867656056560103883625974768993319181508684635102020444319141590772364683025539168088
- 9137742672332139947128849775979539773479229678936219309925112006630115661739065757368376763659371892
- 1142236849912021475571972230557410057254525724538555650568646053711226822679501929631039458441745580
- 6521223889346737778117487711085358563651048040070235138414083943449149587336317033745247442076903104
- 6589402807065204049010261018063071440950890118365282910010426311261217230160730391427829982605482593
- 7487197078945590863342170565376911559913371696415252912586550719274834593711307562682233144193075059
- 9400673536365037293550076798042151214351972532560562264394541411316747298778368714099675896563070199
- 6956082462801450491199124071218574805370693964038921234646978712255066960696516150681300606294107400
- 8047075701309161735077334755648772547369122521509813503319299338334382107885543833236187356907160805
- 4558098436700574350850753199409765965336872104349332228061883499200482787381125275030492088881748464
- 2831901653960063046650291562089053229473199966789104299917745341287689103090997671881480309327162698
- 1236572060433159649649342053593097499554635341599843823862049425069393201426663783689481202199761417
- 9860830589838293900673951455175735499971707538924803152941090118514926140875944737211593932892637050
- 6958329918100862084041028648992346326034564237042482425706390912938080170465965363072414492818375533
- 0479486233506336636375886561058906603353162911176597900236530121728575366201890101649815977724729054
- 0226707862683387773011170094318514035776219454816762064375319687841485184258934481405295839963849702
- 5395976212635978594566911063706013322795334191053037954042597830413766751674976878746529964917834233
- 6427000745475481949471359866806915666645853291490308232059890281205878126815767430930721017613582263
- 1899928879732309320101492321263732671517964955489689247766118431545671617574939384016165229078440894
- 2315087668705466527579323880554912666169377759895392556108040693811822480005135080937204668602003905
- 5009141165394481995941732187190340971882559072629584283719770085817941850701023924759988289613573778
- 7564358854963425611467807833405187109513125759999318051909219022665615695039282619479016017023122433
- 0575443126065446462500868662274804386674419442015394260381155782754000040402071218190131574640109342
- 7335748336101469403685451256443203470752844838931754561764631572209287810279912029021892238282470350
- 5463383094194477974691308829245720502922062498555235510565416430457629886417680620174113480892342272
- 8834745432011980726606895692588229327024544775347217655283908061743002542828159828767471359831392486
- 7754531846844608380481508156635419462565813296359550594829076330106815644966517880328377723442649573
- 4762093975759557930638671004777439340064983405507236218119894844821271727778513899568490447627008613
- 1269781577572295464760335927355634301851525659582920138209150226200880031749728538998215039065355933
- 1282828353022910424849910104096008081292273713451581458295962514381717546634167630658001246761930273
- 9397496828271609649437231135575629078101961242402981117679826186714048395466852385580727594056093297
- 3124055553730447992932564932798114831833202137311156232404092544419362171293573215519555826930703620
- 8693910309562625792884944657181752916336105084401385563679207115718885798851349629804275613855008281
- 6695303908698962080290303553800625563214036681779081802116484387794827851293781711519531292060253499
- 3978761754640800188549112650947737794033808138516582177365474212231932820826980804014905348395503964
- 3892782029247237348271696437467813541562307929349307240336751699252188922405669614699681473878851860
- 3142897635379762432426981910159665618186293922048809589153523367722568736438466816976741773574492402
- 7732442718521724582490379444028830673844564001853656074654175605371082546817925693646964418020722076
- 7950152974675083841352311356162549952917635141688384581887938427692077003633081667441340571715043076
- 4455055708620196218750902138849321558849314636118516681921933331068710415721922258451362322199002670
- 8380222348732157579711911396826803848840402814592695923283959641886626796149305159820371186283109450
- 1976913355793881589511415327250422495358886450529525188569766476775406419896461256327822597017023337
- 5585208862221826002853592814463086109070674171612612300225306229432694397803268357300881624868449638
- 0618338129063172066698253927339740049475856958735139345476951134818732264175263119057768859219802373
- 2093522988172495982321802051416465423317460267710479573856951746726028070968152504373358982055047400
- 8030133017558152271695309675197201612009205662308775428710696458634713742806675167831937351325652214
- 8383317367230811981653422398026247437655894767569216343687766915649479989449089533354826086379823253
- 9491667268994167499834770469902146408996837582495058290814533142200622637026588908567589263050621772
- 5045902749909993279197623786666529191863955876879356638777647427669516078960839316235252927832503641
- 5584678024618159880514292691440698965247194819339632313685463418650909284138271725216953836200632300
- 9210996206249425060811181486751298160865486378491683891420244074612537349911807444468004565780723476
- 2101130684460779794221320441751848161601019084311857783736923028533939927561111606255009383801593115
- 1113590785216256048538691432381224590429977294696432227371518952580297336604535600707534380412669670
- 5867914369328092183041139251793786077259043301053693860564531228257539431737223358522116815430443635
- 8497427720836342278796178301536250280185857848442597198671328342485127694810821482898998745431722097
- 7924036083261987325361585956014193841365176258823231664971366187149882091304281551016224391160452496
- 3384256540786205403968475984137295093158148777371240187179778380478989949436542977673257015705381263
- 7852227469724678742413007936423284978184783841870950009202723276546498176971856311594683012099715472
- 7353173557025264097429486253814814007859420937562638394686737163244650066947567053159947268781125617
- 0460064074445580742901999701262105369442807140922166151821307934869897283700119529308107366672854879
- 8578714822353168796747873575266193854236240007139113056755503388529014237718541648922941556716384588
- 6141110633338312041108527645828402610255558454722593759618723463643099396380123444892556529898272029
- 9003678439151041868749582442954626212615552519867450944465290221964963295540000703852105632196765824
- 8422650733125362054626026868452266096888043838047437262323316166601591279368819959405025719999329176
- 7339310271001259536094694379663859680832664319316496584963397729194414518373166757368853645182023023
- 8148263770653011391128913691346249132791260325353459199163234527758142476660279547954070433050957305
- 8571051219829120944316533594324084681380748875387297085375441682806609884935066699637289794431656792
- 6876367066059226649550352104308343571403351838775617420963086662250481525113784858825700250405158386
- 1836164507635919756645647121506198985206274610720778853409008974133378884529056064324678372378442381
- 1624539607897311433337060960525973019965093743954562466866281243275277881785764509786865491389233961
- 4539387201609954727731688759973321677118441995894848614261038915187575363531390084472167159313610565
- 9055230688227016390060464654237193404309850825077350154851993174718357373044915069497572480079084269
- 3598291438309313898554875494232274494916279219117441681762258515329230906270288626273271727137367472
- 8853638621232215215659814014346174420864122382487018421762113798480012891846115029134072351040099682
- 8163551558849625934702284245296564463145812208779641481397405213189828785428426965782243489218621245
- 3402142291873824879831283655208388110223504587132896511975297239395600114252964021960676967957581479
- 3597999314184981204111154282216513239255907098748163233710191611397919813113343628756085191368235626
- 3775811195201592830109802456170110222573672111807537839399705619783478589980103958642732946843133101
- 0946879646342978777226821944480569992455368546016753353994086181176225929427764715341240000276901027
- 4117619239922487172129321988282132145815583308103276766568215762232861023578888664955757065519767142
- 3095042057620106160092703642002340450972083564857718166824151192694485068151862935190561171280365926
- 7821369850750877498220731933486197900725897758266414280631975955986314537097065477664768007258785006
- 3099401087894554709720638038948369303697002697458292541889356827697675923286776710169803509732769360
- 2728831210398704047295073357317572232713912886823089697758812579145493793429853594473006165593150559
- 0245069290180294939653193727641307597943503018619518284940068279455659277338106214901644988342847501
- 5304083572143224589265200027521484688613520268320201235650451901911872323559167037232979034597875506
- 9469277215711471823799668074639072294512299085346532617467973382168394091646111762121075682647338261
- 4614878022120885461094160724950146164718017557452315757256491655201696462797061834737046196119470719
- 3166112753777075198944648689161124640677993406222196506865913705310362339187592819657416107839829879
- 5138647707406451422449302925240762368664335949866113933096820043150156117174402845705892934250488997
- 2302803590243885579715131545883284619046631488813005446165010619163392539632499566891885581207683296
- 1375023195402633096304694051247986849565872764528769709915657361774733919053124868449462587226912095
- 5020707217071621879679187760705580481015192295074326337820027918311553682643767887579911981167968873
- 9631778145299544256657730927567143291248470230227864752245335402514079094918254625352910143935228966
- 6482429845599342557559177758575824235233897374748446334004725931357292624483984877701765481318806697
- 0615022889309610656882030057928247768456505759164018129455869688032645811705112881260506082220110294
- 8137886762347888324825282503946688656047914724349593624085753393149412855950658025762800089063568814
- 9232095192164003188097299919802546703286321856744877047667974008052444941230192577061686079333377261
- 6679523723102256030456073494572063560313170703759627214649019425087954259668365673496784779640178627
- 7500941708392596517921137188850269605808592871546564185389115112448280957513693327438297878402591292
- 4252701523801839428277642307786599800714990011271862672569779749355858588276207844192101150122755574
- 1779763862705852706545988937833296495187701152644142164487520863294241085419318611140968276285129014
- 3784802343912480472466682815277274311548964625567080291229410470366544127961945872451600591100008959
- 9347648268573468246049695113680191131432130230724663416373425090192136199058793486103011684913670312
- 5159321122314328916323155148639038920490730467537906033384814622379047633637202231768335411432973333
- 1141893942473793198755133365951923692060556418153629274571724953820445747470974338111998252069390559
- 2573907077743606915448349546454394555065175130465938835163084824746341099051994962367971035899271356
- 2010978505616249952318905021558146844677246361554697831683248275696313571755831470789709172877833718
- 0485198954598438285966997768692505943828099531163809644381799776035011308707394485192851625490589031
- 1087233296314882559207427401434402388147125455959070011936654709673891258727027356852730777519396886
- 2038706430537341996367859408521578977244356095538320973712223499363623409298990125319603399472142957
- 8747514768554321732167127462276803323300056382327072275452949421725751941251053916721864335859445349
- 2687692208238733143003926135466300572963673315564909795980489924726693864564374620224968338000050557
- 8982685667696711428018767262177865576649157700352461100932794682563677161539624379277129483813797234
- 4729096852205312331820157895844795748404966542625020395674682354733532589667464821188622077302441641
- 3964005743958993445124070810023107666728342986005755493637474986490855563048804573498089745784926319
- 7751447359585777356307725467852982333254687020095719748961900232497446877253504533172730924230889057
- 8830620727285549856746790484861180492665365738111300318254729987787422632245052354172183013256341795
- 4396498386793829456411967522772180797079505564445083804357892004410159910087105620865457535861988133
- 7544255212730289424165307580303308079636039796066642428157932448605287249560748740903618136406243020
- 1765226239558683682892096274924609118894291902212698768197461064344788994633549049367584304851434998
- 0646095449673288773001522154402956812345344894693259234979855786079219347904248738644206792284192513
- 2730049639053883815793747911629959337347104425865737219183591342311892468121510056417553783567312752
- 7720339420845773309322939337741474629120414336423758453227800104181991754841646907988966638034903140
- 4208579751276702343697309017820412023120163323706816098096193762383531664281467808566072208949378140
- 5850826582561206415669080391330145037873747008619163420786896584131327336331436338237259869247856701
- 0819887206149431011600932643020534519436686730988893658736185274628304684865086589316628441742815813
- 4399120583431847933143825136125768653093775747737196608082413879789095686319242787821365341453517151
- 2012415632145577261257171154237575230435611185589196631444230869366705119913815340322621062159439742
- 7120765465231765198966424475262047151909698917445511843743312560411206000481062834177449518999061022
- 1341264453400653485761580063364046688273922022619214475711159414547570565243538867082174995562889089
- 0167708239731020519483887183549834328808886071103617690332310781379630557273898112912770386827993216
- 5904053146896325986391942915207644121837405335668958199426520915206072234787011150784945992637942582
- 7381004560937340373847005260432400476515103397442629158978594216190276546124371007314153313395606701
- 2099235705589355558643733246623936827338137666098856138608175608552575188182298236562059303984802684
- 6892564831572720381963427502449053813871227283653813817411890381862937066879655274018351601106777215
- 4427487631866938516652689190966932412414576525175477138616790707468769050286308364149318965595623542
- 7862455158759933740486888805936350947640464042266902373943469381319809455398305963795278500402818801
- 7151896873158310682541473547504832093766879887868201624977207965462296599869709286344427118784043263
- 4846582416724416037900486290633522739626326436896952186374585547737927708108320998006560378549786179
- 2816823801844373777396596758291322060125539286970613118307574973649821014731399951378011958363046578
- 4586218819441497849370098402756006854980263357350276903501334915999410634061547078733290603707231161
- 2403418705507883790008981769470259740812636634023320523475949462864772027962521136864483778421277547
- 0890607510255301454648072545962761137431679308322714444951825155320253068899305853194831806190976281
- 8016677230361216606781369517176487597906417672078274900447456671143903026184811709882218889166496393
- 8685131934691125989498624773419222103929318565373462824471898957875867961128151109965937010037834603
- 6699083660549953931420999423492601951720056003498594040963539910547277394697990413578702263206920254
- 5498416572677427946396129743913685217948503406180772850987428122769011413681640284675288754276648347
- 1728545123898591571606211062103861150414532497879130121380688937808878574113569402360108611727474907
- 6863458679625973610019911702986963967536056330358598505902404485705231443082279855858042106676069784
- 6685856139920532524870355545853701010773500886495196354119145399547557065526277584357657458461258415
- 6310747495367701904508846045178961035630096449832567980305263711009034833683273800925855783963976978
- 8757455040977616660990279542918858930891795098681231156305389211681423379581310829419130185387664983
- 8432666048909688018607869899694639519523554122354444951091490427932659316891653845246476121029773238
- 0494910269720631973144576872230188864547231035203360880327345189251460428378272357373813799044513964
- 6145877241578009918294527691148925644955445782081125854974629912272326464903975079642306002619452609
- 8123860389417285256976447427429289378164410225978278080809381188489828665645075046990355036823640457
- 0287861926400784608310625668967210515107875998062605331021001223580899087864525527739274544838949424
- 6097730976810328818104837755849053575436985478248720979623960285646337036722444725602653139281324322
- 6027749446017801180064353804656177241828844153793279733031656426254964457524785225151403332921802994
- 3636689200450280879301458362655927453036932085819923685824058244928679704700489293410367432496807871
- 6780528715571526979538731761613935613259300309851874585260746042807145302953344424836352786309151458
- 1116770338434981090347138086879895128909270471036033367710778140834844624686061472549883654767143507
- 8971650144527699386002279228873124616118886865145487571245875831948668196071351297809734289009348299
- 6091613721718408056889128483203073780439902980119776744595260872450178788482758220314160796646845338
- 4013730036339352239132617464228397146920127293410803224014862978907413563620435519583015124060878235
- 7990545993705598339963964272542888444321935083739604441268034988549867801424120139847994694742672513
- 4575043284161152831893433625782555576248604469892081082951581213080747248488317379714406575523709296
- 2046872292297505739043255293584811980266329093403989497358092902735650265209686282787669265416618779
- 3651464999633518918591982811237177058085129088914798950229698022775369781832643658030659460809240080
- 1768907232584144129719282424720380048659076248329843266612530268510334990265765785799633057285781580
- 4481506534147291034011865107527575914621385957555798465331746524212479703562965764849716996877845984
- 1432813641506265880323735372672051002039187208654889404916333923844805717563887250930123137906973034
- 4640283694891453218747968903689080091910769648752267931968839730831363285516442848545438955119235162
- 6705524166101161919395623212154044745884493177603326458648332699995327613115608198673031798777096885
- 4732069736111069687352300866613257328235545132889270735840381580895934095400477668633738822098999477
- 5888725251392894710257611581130581373079256950891110603633747143004818074544707123585696701876163044
- 0248592810294124481653304300197678125184887324291465465374765308407856299090453737847639163410697134
- 9483164149431772592573598987741410425852565064699225753338667022937999299024833844979636165826017703
- 7602404285435251468929382667737884010050407781498010651565529747650230253048184829022351663490708944
- 9876811196121510650807088452894029830319134369478860719723091087906545455929044269621024126508962080
- 0237754863792190058221375417994513677375502934421394783438454088249683005596980722742714752346186384
- 4963300372011058488444262822847183566951057836418070908711811976341346792304827999192942334443433745
- 2657118519582758172429556975365547653558571537158788673155823731791203581943368590246116895493584548
- 4381021820980564566711522781111528663148797912241046715034541226359174023105072675781565169079497535
- 4569546610234350635178926282007387671578418448532331264748169641045009329526393910725514026380972345
- 0742145266346791248799219504249506398350575631670024222097888845014235493326447708542073295642006479
- 9904567282882730897363424016355981512716558570876026319347603574797113673228442544954614124103144112
- 1365329590731844662678111062740199008005740851336021711329191019148172385811035976323362159445906860
- 6885817458272106636078324721105539882285311162308307722493207187603142835549723999909543867479119041
- 2064095816350306921536539525593982910836444057789476865590642695907855588927801481153129605282973963
- 7830522396568797932913415829562315501056197500574788258435068389480272013168005449241765541341553672
- 2967818672262975219357296762159745729299827845769995818570124704106527552347093167602108874620189498
- 3099905626803547323919174388035285239451968559022629912340556236681684202614065946016614268981636489
- 6322670567145452761552084031997755218112222830694640282754583090788009525538267001174808944008582442
- 2344840901443930995076045874992960929194486787284244655294260355040153663048572784575067890334206375
- 4856518026058646545350492315463660672149559792319961283892566068624538219662137909561418094819626802
- 3483737048644539098579604117131070124331472277069438162426160779174735893060403221611731902362901081
- 2414634682390910147478453481264736939378034508669020117854092269189072113908427362640084022560952795
- 3662226878036310749929518963349372478078424620773854564629746985678187794641332775595949591985874191
- 6684478301866887582598506335809530473059262795878826628135669574185663518366296779633536616256900065
- 8834528478932612307942533321209343130986170013940224515939863015330027588574482615552011632165583054
- 0110902479913174431860947888944247191765658573938336152938916463157877752069260989922377842721076226
- 7547136296772652833826045803154881842918345790562055852313846748688098747574182995143608952757114896
- 9698465913305515718249017264063469473831622484570295688213478321860050219757949327957537140194691987
- 1033919215034601174895493500576483118480038321070455100031972994606266908170328465232638024224858174
- 0354229851081369311162482037815682402670540265060927629574130039459067445279197996647299332750032387
- 8534455218203096952772541183313194929837454299674345083494569207945583308957219416697425544682533864
- 6561066514161947402732330689180554887144239701482488141302433322116028228928803159132754604063931447
- 5650451024707847827003100830623983379035059208538782367438487469071591071661383527097558515843491321
- 0350122255865928574296051076914689252902235938279127110071779878737897902060104053792712655426027857
- 2353850665444666703866631450870991655715371206920784426287258032345585653143785432590390181683860053
- 2754965792572606903799575988813473068888074744754711193224014850571325800645281485106494506217879717
- 3665367581241855617818186509256591508967858838537346006935149766940200854142411958615773819902618019
- 9575558106225483616404106207630901758560745738847326450713338575654604173253371130280137894079385793
- 6433995336278092312108397002330283646942338620299103313769745072519281930448106053614889812723727553
- 4536451517984386997375729723447961754122638543250152317808397255726878502256871216813534253902834781
- 0191915420343242593460913311364251073193994337038432388613758805682715616485493653802378509039348336
- 2248227318207409968453296642006626803726878202648670578298511928450302215815053035641756893775421063
- 1387943008169086192587428698754675509234944739615670759250191683691129303774804955199097039823363826
- 3648913505843039964819572362115740772576823369907023744639354292702053460448038310231444811459137953
- 8474923915729431278074120440608030975872966973107181984410669334082604969841515771659295519486558164
- 8675779423393689882775900357894212761604704734211672187920488769423319638405449947511159325479617623
- 9384985382401964770818520948648559242287732496687300301024626104466769085254560976052527675426097221
- 7580423153215767353290753481536411137564033449376447731570107441776235823186517003547205375940431782
- 4599133598339181781909632989815139125754319138983372544052815081545703102289680299577227508331211659
- 7704221998268965832469412245112832949898729700252886927820088561271599497751356215241446212011857260
- 1525246972290915140464075319219928173428032761859964570258021156017462090635890751861757530000424919
- 6720092148567640159697615970405736942590356827057621726980826125845805961670618866332840263385648286
- 4261038593074900732614647683459041578797930499820505904321300238863933029787387361962755332185958012
- 6622163258466407754647657936338085449649570965549194681612051155694391080796813539384605975006717950
- 6310256122479527199604657086253843127219194520031050931912369479545856122379295846744832208038385192
- 6631532382845070622235541635575201604845859578772796435664079289773151778925432460163741951653324854
- 8662125998117972463576280561784916758392325772236684392313904636250636402302831723001378553839784405
- 9603568332684279926654616067211095960638834242950430023363651087339459142466082468786791422410972599
- 5512135343919323395208857001590380446982663110695458536384642995474068040679609633400896596476123350
- 1181547182215652025938005625906215027290122242604041472615840342781626054598733857245637147779216047
- 4827443344111296731237676119862978669863080241795004730990548680786839290099752578360568423252734512
- 4938846464261174378459017654469540965159470872997650711276266611757869601903289742862638348064602583
- 5183651959147287102541609034171076266775815046516946254495799382899617866660985727357260685506695869
- 0375723054995572090626217139470396850395236312944870874152476422506065216697079552830412810868604973
- 9229536592431541725993932707486079566741459387068412327500416690860257614875887987623593673475462930
- 4596834705781824339237473999249931821377630383752990385151049213862685594862282898029098604098401166
- 5073222899953224056223484778426908827773333002520957071638789137572836111316150828240586774806128378
- 0997658812245009750709847914399252401416224053285985178406026775338192282678495278866724568933375945
- 1607319568621685606351203502463099283741850780760420477384305325483876359241255753163645229316351178
- 6522282328964448319102692474163633999280535309366592617986442495494884617481328995681373139483095949
- 9581124735554883738711252190337005154680402367783261544240656690622404363579199589191618731985304828
- 0061974222320988366936470840181232141747627673223947330600405172628593548541188246139912254599360462
- 8969714134165203093502573559361261145139647646649021062754457374977144715508058882686031359661575978
- 8880825134084175124084231421887595702639616666768421788501511665029595597861841596054792017855481164
- 6541858311314120912782845969044480818199806314389038052207497099964459268042684734454155781033449320
- 5950156320196305397621418073990862708480643032178002476090143977156423120072263543493273799157315518
- 5911006524727748519971019847797665568944919671648616867079037571706648356280803259648676734045842056
- 8650181937024269525364816955814590909365907807686812438639934256553533046505678506554865557128211838
- 1739659983633576780308871040572972063848194704823330793522090608439862801838670895297949455903398039
- 7505682344935367837444146988538880452810081360625583295193112119347517762845206651922225273866969263
- 0025665605713798746774722632191103954463938461218455857756926921127446965654071571414181979492296144
- 6403902152393652171319701682379101625390563079628676903703669998720101055197275883904902666193971648
- 3481149742391173870422714295049803918440920353535056464826470908831627172704391412142384229216009271
- 2912360067010295249048268895285813608494320353804135696451593092433827730106982907400363781910721422
- 0109190692418721602775558045932649015215059414233531352862778826912685057008770944176708211117803391
- 6132310778845476958923562860626769063681154808619448865059856349824207852248210273557171168286043742
- 7930019053242147326980760359336634855924681912023947148092123328418605006258537910855539500693514325
- 7214182173424169658289168710477383110597050998134940969399553351724534645472530194525002197042367256
- 3394199259591390300437260389765339723331018927319980366786966546139807538001500749940589639656960444
- 4634104888910187725401758136482992701898931874351475719511901643262456514200623107476545219553062209
- 4090762265639677031822328595936090281625230627976852910671388077127464190257056024461237830789026485
- 4860064900878587772245828110243449387066147744535679373207145334080832496103686003164871160455763852
- 9640009288990565903880787201538168686057845360262395376158436587641315689542018451668042531125090612
- 8057586051851261261263727019604236219016699129075528914842550002031663943368032040571141160423757980
- 3585659563124749946956984951358676171716148613421187649219985740236045258155314008760929919647446288
- 1338290732168822691315735551490184217278167785213038366037635612900768544531563881090587180694081778
- 1907895745143359593839035139959232215815478747867262033422730377952548101343348870112698825270694572
- 9704429254738586395894031625241817680103388373892597828563795133490722566439821360408060769512299054
- 7942207745586977993303444390441999735760797502802035252928636562271663753010434815414543327065339165
- 0995946735871134933382166989485670557380782200217312093915300782652612868451424290726599905709582548
- 6043035452329999651555781461768952857780536654894859263172911706262038297980160841215931881886962902
- 8287157978717936884904025766919694789119701664230794471163004796916602963366541165671412926658386416
- 7655842583466265066904169951079819904156389709616578360678034580385887549043983668110794625922809484
- 3989003473574576572212780205076636124247453027283277919753687094602692110264128505204647715113195909
- 7597847520095406773721741184399590135072729305996362535527518365125842604722808130501701636458298879
- 5296387473523944228984041274230766926575389191293792702273587158906780074048592164839630908392340398
- 8400951287322298306185307149444124552897445431895856118740001809527520962851371172568457262195438787
- 8592562737224001189285921097359177445309099137601857105133655268996097982796691301664713645669707323
- 7081484653493878889810099483298222045461002017204361275120315381165829910151186943049114475937441511
- 9921482776988466723909198092150851582445610520088718546069873013725536346329956445546387264452326955
- 7824381689553110896531340698420412186385006905379902901129655602973049646054821960184977149958716016
- 0186321879285776555148260986889146641786743554863988576721640798099307846447004158925298121200807754
- 6940444869022853477093950868213234073387381521176404447604834555293052999589302071650213184557608516
- 3782416290715979408661795263226509087062500009785294598803412110825577607201418877274907101283893632
- 4373447553276610994629820292478457279595995866906046000101825538486745656582757507158587296867716751
- 1148726521220658930514702981699114593575970624052382042720167609089719364403104714270189011229197278
- 3281602113559756325548699992243388504519858282629103818226122655992591597082919786233193166881062975
- 2541068411710862598703071440860838890816173401839452178676169102178400070572151153318183463981090485
- 5059841908065379840393196765261825490144962826381313686830190537277629022140822825320503157581449110
- 5214969340080059171842886747423281889208221098707510096094222717960611868752310865130548794073032475
- 5855158572712956851667115026585753721524970207356655428748048188381689438092947193924970783426911981
- 6210471308309570279144044887529446522288091642693221208914373532634347018941418654987580854438978375
- 4276111604821944985733991946416345105882759641507497086868706533308767468551708636722004133550690898
- 2270336380872483247736238427671272998279000472375033656913596485058948711797177358953752351727045329
- 8808976870603717168938131149261179907638681757227782503037994810530997141332106791117693908249785759
- 5017347343274863356684315499742555434287981387288858840828665550630311692303426240065192461820851294
- 0513841094383383099433732356118408341561095254744542667874415394527438085478157481718055429230172577
- 0825421551455231168981598415763033104102486785934451395633720568858890690571190839996979952133448395
- 2287592283977865693169705450275524986037593813800658952570565487153992594249997173171679762518307807
- 1800651730515295633826327932127180626959480634164969102111602364643235890477243477665172504370188262
- 1158437644226666204751278252351887021789802726728027711822773152103035872642082452898843316831579166
- 6499256821611449903424669515324639135704780768526898998489320525337210124674485594511686982516508631
- 5065590233506089461332596475857404743071645102198896466685765093083300456818727572416807670592160435
- 5468100929255939564895332950279715672189202732570815062770907173871031323842496009919676665726212488
- 7134992056972358693324073811177055732346090215798472234521382771579580347220540258966441539053412137
- 4470050890338715383493907836511458079202721014790629798992357303403249969762406078897321843108824493
- 0826619080262204999011285974929556277217464611468993929401059494209733817594382878025044409968753401
- 9038860177170124591227676884675715236965521220057724245036539737696902851785827201084335983398454456
- 8178406257490431917087743824104031867141420417203681142989503677256546071050128601831884330590267041
- 3591446899968847178334704082914681241547430930099815384258505632760473908768904927932249240953499190
- 3416211544608213898364543627345255421371578915213206037656434612877334642326527949078838192386444755
- 7705950091194441422576047487273346424607959246298170464153460651330840957147648715521286086578470735
- 2955176812758232095338163731442904741798402689359511383623361903652219368694895392929861056065435057
- 9702715511242608643085927282057320382452863375360040537159776632209913491222622982155246441341529456
- 5515770151918986924072986258052706984831289548079625435319741712858425766114028200953496918021677875
- 0906409638893891048450466408657503729405221041128000954731966004650043944216848594220901445242927222
- 5584905936638244027733283626450303053353993096987770343090712332576249414960161079242873166852638845
- 2751267060300570764109526142989664881812039606387340849855500941732198779667532749962011869772569041
- 4469020624776565535065664237591469173330727489154340583008070722148098316774819302173684537002122864
- 9151994480864391860713650673852662802901568680073865848269567625421052986411659338692482538337878752
- 1349222969889549770334204786174098071621018441516177221481911004373337116936743087732669730859901037
- 1973977949610284291618684127575699139864921142478781435310883070128710377476645242406304328370837731
- 5256119447305575523791098461773531290644241044708945166904880695091460731826894492787888493093950009
- 9507022903534353921332558947652503280710528542412429468783066310827995140399264853819433461802956014
- 3112432856484696531717017391253878974666097145394227727410114423938795895987891054566410426814789116
- 2685728035996783039870978666344440474495023780537494089169791738537209747073452739794605724927590824
- 9278258335068256908378083545693636681739559150054891171229458934250193970208963987204233608131092995
- 2781885040277128738574435470581971449057130415919250755715118568712451386170846137621994813881555082
- 9388483756914525902356397006311126012211800437038477707067215788291447250470385711950858809347550637
- 4838293531777538088558941174192632937495430008507222483922287543944226262695981911896956305252790993
- 4629461536093616354944787917503777137415907062317596724558368532599842155881031625624442765549902532
- 7501763136294312779601191643050971695953211299204527177449654633602651536565828841936387933775355221
- 0007523306249938917088603055134982454203328601498822518924449789713654388787607325839686941239838808
- 2043346266117220437998133074235136784990845864816666286201110167877285493227258973179629008389380937
- 8368862243092816036269180732135646537153505048869164778779185842773790818861314754357370438396416108
- 6684544778605185698836435455394146744883622569075822976566805177777484874297315217407172224089962520
- 2713446380289384331452516983638073117992146783653334217478880597728426160203584308289244514390795487
- 4192059946703109376776927346001157263547865330378705088255862616916954752736042627652426280382477111
- 2903565310920613755010415351635002947736028030426515606870445034565865327374888313887136360128083391
- 3126850405697305826236750606618539761570417421742759409404777662958560993046444536969357131235331390
- 1844731016702853668941803502361632619326787257731214972498245087303034204762585225658713844171927986
- 4813496990033682366359258820601075142130599354051182398221393595842421288680155694960131634265883922
- 9035170296385493143120268575172092434167716759536738545958915630415154340888500416067053346654082813
- 0700832897761488249696289240160421141615103617977793210297134762657997940215469978038778479401598816
- 0852142135353041497943485318919528301157500655585264236187716442360830789734582505232932436402643759
- 2459180056329087230507629703648435508696762133108287701771634937764001574077061929099773118327157053
- 7209205365402970776786726653277933085996580010922173623890413584279519335088822145436519113434014342
- 8094289321478884830738725770497425332464660948353516657817670744653783648028470969261013186450293122
- 9616599437355582029288202344507282771381373531087386815666846805841655395240631511573679215491126324
- 7750126529807086865320787180461286792428807755570652927825941943007588427801209591016637750414014314
- 4565160939204213995507274987872445710941355550450157228970947059287154785784237549555530688277162786
- 0681824647647199972980036733287720747522653591039754964088642547652414313788619066227139203374830355
- 5382843444764459824363406532781363195780834389918402072956331227424040632911369762268565400010623898
- 6047816686297777840312794899917073967230675221629509652878963150378284676791610967455848873593475491
- 0866919617224603794332653671753266796427575943996049976680661204001653302850494997286070427542509372
- 0773858637004154410260595244937075850036378413818607795676066806461723429500752397765145943294896719
- 0018394508535071152508262845453452737577969122483337192342761582030801462801767562825024071460250971
- 6056309317672459307604868824879005384715805207507448203052649668981999402515794942321159027841043254
- 2583533717778889923951746366574326137285181100529275734664184818518156994434040881803768753519740663
- 6304783372844055818192994312492820699574561423826653050981344664300969883579889993336482496472266767
- 8660948382182006917644779951541006483149509234023132985550207601297659765482514322142772658066657557
- 8245211435118357337237730492437142595702958551587115638880779956709924041678394507854184745979089815
- 8041308296754681520346603969878439383081839237477162789771382844434051340951168427734092176907252476
- 3108922444664789116879432513222007365153456231185501387421523354450308938853986101461106907489109566
- 3596629481504685467562292894151089237294319319561491823182561129060258364287817219492917534538823527
- 9936285889636367951806699435539473796067883863943299218278556841255867799549795461330287862146465157
- 1399165914028458734870270526106981706256806358660128164497972466681641619698798867736847470963519634
- 9675767724117193889891161841016757249065281230163968169315003082520148974579738890015268240237779830
- 9724004631085064997410591209501570775841414891805283246730618351409517491370788512597534824769265004
- 2368546235843601597072961828044309168026370057859215113722012165857223365413744447659413954964395531
- 3251616096580180992087790835257903757726750622322518588306075693231895633747331807153668699884986386
- 9143703937913796902175096258692842571691290542002081554697777269088469155248117449993657072604850439
- 5080918943285304474939896300603185187727458210524655774108122548587461398410245523154697286056159900
- 4919730133874530431602324644992651250170425989598182556523887587795429109096721908835535777249868613
- 6615280495876215441732619304117924969971423648039456363099307208351692249539620200838815119183724445
- 2275263668892099295766770956673835188966195961605375350086023233648287212672794571825927178717732484
- 3095828273573981941079466564284153735209789228890021037317202758664290118383502401038262269418554517
- 4623600553905336844479903780231493500910433515559836118650126049569602591345769365876222655770632075
- 1802591029709744929517888542021192971691266310414209140107864252386132081347634547297753174408567322
- 1032254607393016774189560202729920316247975376862780784597105213268572645373624225531925095186171876
- 0134511243376299053555461959175254804303890441737617913169627434487853115501952536997807793447126384
- 2488993435819171956729612216520534622308553410454617535160285303531706014088121363733345863747449007
- 1286834136213074664314991962645876623832479456855495264936646501737302526991190873488938380822049031
- 3999050562754439889044634722325658585987911886688740806970103202682039916459653939827631397675758675
- 6306611912485289248569949554527475825958380592669805669093152791187730205978970631378708933883220709
- 5089767335300855561529457849364066391245229601266959600962624923623543500671735657509324621100978763
- 8785940003781112255481862865919130265466121607498035325602344356367631241181589646973856150829519318
- 0065715412630622899429863180944708829996977823600837319327593124537302930803197083916792112382203775
- 9386912820570401257724448615797828970323720982431419952191356933990701376486572379409018973102677314
- 6477049154312463353149231164982846119122320443297987988654550488550281722412719641296214255244081433
- 8331848355485316489156555947284549415951832993178851797857233334982197167452209398227947038948309387
- 0068880950095001760186510756826190182122598791106735765741023718866272469935107575855314875850606889
- 2653011018387189835211172154353512759382643296902223394938045976378558090731716349568750327089865704
- 5091638820524807942352227535687082560260318281292577270037991853012635237990106194259570352197978694
- 6037934090907681690393742403294222448564906242924069041355557978176280993978467808750873788927217350
- 5415721686106252435312971752870170021713892652686261966868712382220018081998105567112872178866928665
- 1408685730731420302602941758006147543396996144541957801734713074532518466502487391866312265912601566
- 0236378626652016174160913156721283704302383185801183603595637611440219634198851777358715380279808392
- 3962306959289445028812707711326597922053836475249006386505384673526547127960139270574253357239928439
- 2566821190075920761228272723860856213827653499339217228831328929444455418559118523325131830035127913
- 7925207603882293290768317757284347671056843279974476200796878545960902303706015474437242611467397637
- 6141025089181934278782304188311556795804541243119210344135149026909550179999604207232260994274936196
- 2125944584701579942673840826916807034200373342817358824220480345776191805538441867061092786475446871
- 1090427656490961336789669320618650990481167965986055034049205961741584031837366244498788910350470616
- 5000925499423394566216562460486362752367571958462127097101035867837376285945519035694807841844204611
- 6427432686078748084405425187122732222002621434798954295282674932403815009818480465700784161918386349
- 2574776926460569176755318367548227892033180272665310931271164367933819622800959541330478706842758615
- 7839815966786353122126491074162834036375848986732387826613769035930136232429615603116634579503348069
- 6041468095999851416733156416636610638135933370291055809518610025965969335853813370266720930385742574
- 2167864290636425462777371245161425008963865385952758013222891865379060793284411531239571944333059711
- 1674626649023894326671796113079458231044119190079783881715223000670094400240063875922694362285108398
- 9082522875583396750453543274241265645394801066480187933702647796786435630154195928502562439369802444
- 0700414898101285038476125576653219679989499751165166552568035436426047314998069415767114957179087061
- 9144799725227147952932796307353587611207582906805645927075287717611731266294567603663357133534836225
- 7492316090884997339500082390802270834018442186023971562268946975901121116417635281961788002013550898
- 6069980355503955076960175235571734913676580503663480989176623747277794438892098679516938936159532508
- 1576104264980771878858319166602587545585580207124960203569014360241160676509441751163995525117604635
- 5458354558683733327378353855866576517556532384665889863983862957934979865807839120288373221654180551
- 0150451839104689209505644292618713072718897597198522462131429519367378454725128419139172808431950208
- 1487214486818091226214195079624858367872512008495905249253663525575397130128252266631931267472711708
- 7401687401981820530095690121079949369324046386341005226062833597847775099361974110216099153341241745
- 6322272914289845315460446793246316585082059900844430445292356835613059585727698497651003576373809488
- 9043789814971338944112155340478285383410251586273452209298137895801512526795905016883811079779373785
- 2314075453642383267753725911397231685879268790411956752555832558943262474631695959323793280773972152
- 3413165102332695551004256713478165687894432590102030761299318706117131114724468473809876166132982158
- 9523733673235671671545614175551623880797120001523453111994541783387246086759196531569649459754343526
- 2414717377027351623521869084588169433264954360963069032786367827217343378723421220127791453073615284
- 4291764593757545276655117361662493776258341232669470386618010995264161414469436866655412146535572510
- 8823132604443020594782957064696420840506639720639317365073513173003880445262259603654848636596942695
- 1483721919405374886648224695513800141661753441310943976696304892594972320831753099626143078452993318
- 0165084520803236358264421016274310136612985587054229184691858535800025965709361068886707408368708490
- 7612579947164130996388859772806057254383677775945949487903959265587631921103227650583873043998704354
- 1540772170815337122816972534708480460678481530339827425354606736133106255364807823517193731976382923
- 1976068793186399739397093292358465259252548784756066958736726025074964686593205347603330267022587893
- 9971559384670734638222108716543115987110832363590150691704625433514220561500233993163621226931614164
- 5163467224870089085755978428672090870503505953911028556125649913517596449387846853627188016450215023
- 4656608575440062129328084245635478066713704565685192593359224746434449681389396409572880300774156674
- 0902382614245016397148992671505880621404736388771776520916125774301134751954522037490896163122104904
- 3534651801900090993521519640471458864773560214651224794178059004235182076679650785800263851082616667
- 8848558950749158645126619309838305834826296907131706731071719728080776848480579658754441379929449107
- 0474718297280178725901703403330009230392538061041675484669889573135068038686174263992443690005077832
- 3469824069242703312234425338168695545685424131743688576721218523392455145195436629288774904004394559
- 4665507408427025138815422580127799362494827612553010957594107015575245701740197885097699952595617208
- 6894340915972589634928359294917641877073511887557335239097533861390461174419754910858237894535948817
- 3409788639450617009227355835690040585622723780649116217992575263587677173378254508192811081021590238
- 8311849529597030289045463552392776037669718046455009366389395271293756618364987721355743227583521179
- 6176974028937456777117102096019708609988891974822781834064514963240191341985954666751863043821782298
- 0536476808596413487848827651335906070316166008073856450236740863265104795655555239056932413659061767
- 3191577439406138380081622869421478366058122796601378688103642239344928990155827756047672145288752696
- 5184984097572531141269697999683583131116362301667967637406820847352207648198751988229863052801822887
- 3740084633583983983511917977005782448199586712374407288542554258820673303865935123488499797026231342
- 8093258461206187314490573933429526185556831586472346508233563111689903929807462373018589617512746201
- 1024135025301650473598739129966877316578879331468114620930068822230887206158330968583647938117175872
- 3221188044075636045626651016083443677231341484618712669394355809447299222058095400341747711692494857
- 2249761131666871509490601304242787861170021809547239131794441841677024576301402297501831938044884481
- 6047770140408137418939545475965527353961460351911339301223133299133292565079896523080905985857406951
- 0691920327933473397266149554170561661608154295217879242085018926158908427708999081541020516351796459
- 8157545596880694260180013035578554702715987600680733145181619407836722122385173317731783658569999622
- 1593848758839224899291106871277741693137472569565133430063065227379245510562669218808078118325867313
- 6960112090771466579443662883300144081586309863172641906333044044508058228112815488916198322932731818
- 7999588512737838729385096990500690958150559968623777129423176197294040813941813602724051482082073795
- 1363148433542279393342776536861035254077258399965486187460681108544159937826344218383938448584852903
- 5304569715109912504423138252492529540089600277653873866357415638827431411023599533922274661428089503
- 0235763018473899695696878579647614813385274626000172840076610353359970011074295886179093448568823861
- 4022120262810098784194778556695767060208297297284932172835947885074785626883541396045205032733900115
- 9768997592348823789600370474350944012621810109481571513305005269673475051595793024141924677188377990
- 7897096741985620620603365776260662003934751458951212313889676805215858321485875621004939827433779291
- 0008563459608478727443346055618482163033872291055643309346721926478665631468981442003818721109343897
- 3898630381721295790929911274307671977729157837674854628928521808203967143785079336373695007727664266
- 7558541999588569725888941718854732457041265453872792938355542304128413701321311631686167649503182078
- 1233528078670360575316926111114131927428779044645590745310830304595611994778892976495070646397168145
- 1462945312429436355548868636124882656124006440932704627209919380249935389605974433512849065936304283
- 0104058174606123204394459678619943758818210788705529097240315088518044697672070493219326427327474947
- 4657352706314008460022706069559676968769935816122080876142890824382822508271626545101507650711225487
- 7678312710489858125890314808011532348223548575625016361343244575548970840185256248785584116155906291
- 5706400186193826787191671454229784270131855635300759233917437150422523687143080286973897230659408747
- 2615583200288560564305436754730126975992391214093078205163473056839443576608050549539129145864564189
- 5198421266755703261404016526464718191682556178050004366263986812632605156770373757632282557237224033
- 7326563439926101072777491347627176169780024202417454219633542368342108998205098399693090096683351729
- 1556051800329123750279741383363465570545278348537476157707297860282642316989566162153641506119169118
- 6958507630088773984133144332352216108648075376275627953573261927680750591791975382208050553608592143
- 7064255882040794994568053209984521619529034874717291587880433789802719917575528412495164553897366903
- 6679774585106049237316474933485138913107670478168931509280056525080740033602625587974658733895886504
- 5549105944187115107898947642772391413200859027313482305147114710862568442443055612645731317975946690
- 8304134034969841895264128081303923795354233955145164368583297176727033879966070502753808844666613249
- 5208470595623603513288763569283104042351423073689830225761893982210451471164975086495793133102305164
- 0070274041872292552531255505075196263090141904288158378608018722688533033426032418874199474309487098
- 0900779689622152127820403638718498691155689285267885143692081119896699199175939442227659858529607316
- 1102727719303922875037352767460313649872860148590878010890276964810178419250513768363944327798589783
- 4996707510645916080799781498674621295942992949510345561239528518996648389315134166342562538722904207
- 8570031005057667238782499422930433187629331075992163341034881853078945786213043844699022597151095378
- 4248396404519561395264994091054193480278333814105054975038632521344166525325783462410543137242051343
- 6561007097502647497506018793298970049526351080384880012217081134423115923301825065523290008053296095
- 0529674761782776499033804649275642460784400622477510229840904464576088284008438396537572516330908693
- 6595011316680590317606539941304678318604500629809546411793222760643945450974640311900040461013636375
- 6652514763392205640853948811565665156414499546999798961551708519238964173504861644019602822837023105
- 3195494455715777919567588597530366609882202496886496240237376974149089622782626717164709054545896434
- 2513581072155099312787001810947933780019428811697138455978130343759117449830503972720050883851002048
- 6452766917597291317151669041458699094829963978857884712415821518191513119364659265502246995225206586
- 1237108617077752972480096285573811172643504397723991591353337279437121493974863979262479245746309268
- 8060161268332810801373076067896388530352476247957729623303632060797531311700321563157739611414172670
- 9684579198896782331749802500904092769839889486946584061970883711871716267895059803799281868790835967
- 6744386739411089537196986182976738458954392441121744326072814344156833377839658009332416265311975886
- 3863145759699162822606077903337395378068615499543343966625340413723933605837613571366314849602284656
- 7534731883339597694060242585033382282696716025148826483767031393661503046556944035909979588086530647
- 7527207618121415394106818553151735880056317978950810699820712326357146714531162758252500806200983530
- 2998598765345615877265590577677705235068007347211604498064883912344314969945662968838109923179375961
- 5151983265012059878144161793289005863320956390449673274096775615657921695125695757343065011177279446
- 7699754846396367647409519787469857405002566630430496930378286467308890740676217208162910009270841088
- 0219803664690320066048982952654419736165080870899913997268065256227964180494645415644876701280058394
- 4430038777135570780465643299132187060632208151427506224046357396332303341712920530795518615942218913
- 4174393464269860039630400508002042870415729593735309957716677615251624524092900687648409445244870829
- 6372347946634083467678892429045159840508607169534168927276857026100718961752877525160511457579234875
- 8289688272500582964348325725019488704916732932741441469386161100821207301489450942209156113531966015
- 0600951530042151879680050092567027746169752691736633588478953104875162792541522915736474184880129370
- 7600826420065741850241704070543171728758494534967559692560581068000917355323392465539765805611506266
- 8571458886231368778250270750779389298522128983767573394440612389601946254801496866953716675692027945
- 0041465728456706853099431195910398723702492709010435325525980501157121226328470745074590340596438552
- 8208729191184983955166804404872154753233912561994593028105975250334168546567651849453998885243277578
- 3503720834777412746381874054586392925447115055543227998182086818796986470104656134118680053965131346
- 7232381249441404741459647131100723335520281233852214050723861536931660894605930756758626679075053701
- 6110407034090926282674887750285975237510238545267796205530602752777436781940577953384076593719123390
- 4161229938965877540504209331657806959653412589292769002105835347234056106514555429320091707450439470
- 1995669836627702247022883042665069045512194383705684670838235730118163228543400184304949798582621768
- 4156199179199351241530949158010079374774040392763688826938414993758057175171344755815931032745774187
- 5763711877571322468922722424933777711395755848434693143205619352281759976456338446352366793269416636
- 5293829299473155416026227810434045971282582242670197609692542335680025383489465631124951701468994004
- 6400911880740870773299643030944043581834084141758018478995026247389569075478192665221993496740541728
- 8191105033252790021585459431757345887327695863977413383026542251574881272858188927328497769691108525
- 9385652172391840425825823144703106476046481450202221028653330865637440225958804713218694501443668175
- 3853073158920051906575480158234491548443177708176712520461196493945018862567637414537686456006014215
- 1261292424645967306428464885104976111918846720498664547599992680177566433790034005684703754475628782
- 4934898408714007702362965041707501045403006968311235317293403026317221317086176202960434454820954348
- 6763695249394153847667538095773551214637499080503829564670902052304673985564355823807120013405179535
- 8177592661179297460148692132026306003931799564849444447316119372536942062347563745047826759397321270
- 3372805781343126621117387222492806333639834519303680389259309688995209252035278571980992380576236122
- 8496065232769709707647903913942314021333686903948086876847433080122688699462034708237163097247047250
- 2810603314164701447412054213824030812834719100930862026974909153607225275128659774951950701446835957
- 0342661460253028153384827277644979007768898074458301080580762580282652539846712184990443942589188021
- 8806297599563142816384851120947134995242272909662562131057200278602521302716524357302013219950531711
- 2041933385624321811596853531436428098866010958543685260108529344637841188537182627216507454141542909
- 2412576342816834642480358183339986607357730940949860657066158440701673506468455108344830410340714330
- 6886135064816123133500844233624141744252203847162068581577800344074422408997737952507722722425221632
- 5270798286483423936031993600770157814548549973279149571524204777183259862557471172176000475918686134
- 6576680074791388238882526059503696145637555094836455249433184937579583447082565112029771305489059858
- 8936049041984366155680280639101693150794123984426141463145272074906342167466656220820733874054410275
- 5527732642572666260325434141645180646462013591074636904814091394881734915019090588786588657560805463
- 3191153957951992269151017526113553536548044915380523524309209568391339236641860218486574056531386585
- 8918038882901004954410539504281908521709568970985222660491497703442563415201133543595601620804833457
- 0567858284751828869432645728470941550706639004202184742841481507293211425552538487682398405964036946
- 7558558706507780528881184370543707668539402043667908794727576997674271743908241142251517023195532601
- 4929205324852331644303361410581348081211878445401680049841863719537750791225098168839594398437434905
- 0092769074304972197321668269078681894298865543260393479960279152866631674245204993576832197598296140
- 9060960027750075411611823413659519543647682659743538725034335575607603094264593717684435256584561894
- 1330436265854933396448813667814189940353781251863618098614310938046860842389417657170919837530273529
- 4605318217748498067641007278068935394877856208076607646288643497578138491675496948013336164585535923
- 4218744439048728220232748279000438097437222409055665798279254079201827191764073156868788990869823443
- 3324298461713480779415792607894378693787932181927623832088562198256262053706157053365099866604373352
- 7800430297853858257772582081434930689509974690284212321480543625214410992658451320869835695037934121
- 9278770154837668462588485148035328210057622595312384395499845597718366177469694877133736029490243201
- 4008936954352464284670390628296129253331756090545801524153362697046334156094771470387833114080455327
- 2026698516916550545808852623472270091856838115291325160755751473298310481745116901185447389050027079
- 6628135737332891521947351317150714211819622395064036066250793766101141090975719875195062790767199208
- 4156183831262327870536779495872093480853103370037079676981443339865319473005539550361373716903540441
- 2274418482508972554341132914140992101050279406078134345274545748910397870395925576771973032662920585
- 0021841243056110147117266588588758581109801362242719178360150563008450612609580351146221868970392656
- 0067677522712781150869182409312639832388951433073092080618183670533272221996712213824392494133845030
- 8553742913951006061214064015277299204721624746906019968753616129309594435319670213870262242747134252
- 9519834641150215258521719073343528760508969489859661873724647148445754004263211169130661080007590199
- 2768527723122943384537537344556192707318420770035251888198510000910588697024636141339463736403629167
- 6485024313959222610891431245843108024918533766365473795428101980063946754916567388220937206795502245
- 3974952793604321876041673712529418689041678756050715819184628397499517761898470120141728492253165997
- 6424913961553463045596737003669827139244746172240537756388452506057383117220633099522461382751543842
- 6248418305454616142397679580757579289295535823158379105998810001363558358025381930496087484840623244
- 2130196731285727975696380891589114151062682936713253390443220443935122562713425835719375807555547099
- 5280586509274891485606150149058672218630181453955271543377441157484301460454210472371065909374589455
- 6018507470655512504962079763495262962858574191061198684337435959902767513512428421627873827040736179
- 0182264211619056545235598213465009844346847498934255194190612568539471215509383577839973398535979920
- 8044091401401301969205884816241657792074385061659298842954287592676532576461278658136538693023064324
- 9514872291568341948933977325772383110186072859921382743995531670717977869463102412096562992515636907
- 0709797657462230224811183699337954003728904003552813838791669645146305017446678302677339156584851313
- 3733221345559120169428199446355869119901046702572488630391431318926902723427880765595671435508100852
- 3328736761888331433062584028544613817909164915113898688610204244109694930399461881564346922592382271
- 5423732556186576373191113839350829844737578763090888190669748750346261607736201056147649195858889526
- 1757302986600028449208833098693563896669357365831543219805114630291803035328239125122651457960451129
- 1362048141607426348368904872534774146049792896866547180431109637020693661800381564926460176322823546
- 7525772510063481083324604963974581894856250715927985140068823456587664328616964994470287617278607401
- 6278793760031340305365372001633610673119735402165742745526613772464146797016342322109483927352053992
- 1618466844316578051485787487389956117356157422927107997893783041174634233172312368706298879939563796
- 9323438140930773031667385587583365894879219229299170292532195313106313751699564895556279207732633443
- 9956069913401234556618660027238644091295776817456745562042696966397914924854631761555583478849112031
- 3298081093820200166708214261953839391351949433245587415772583694811634921404847335467048525276266990
- 9591444857090831604238663433552347995241933217431270826427571501537381144704648961477923432391883659
- 7604173276069183964760678663226749291933231611318776739191327131564491305693705855153395058229226297
- 9366928009889012737440110729913075848391948372516387525152681209356155068966128156527850437743856737
- 0659686571290407450402139678640980501628716324266422673376138215295623652204021188430916924496201670
- 3983772402290077519119901733887256549451670248842314466733016979564931389538586123981116683082572022
- 3337246985737787251767301674688527011564277582005939357098122586901258892772753477512459695452503898
- 2611668021287757380563685631564442199458187402810656801753185564565295582288616955286274200281964030
- 6143910590032153797953969302185194232688079468527914072587719484690411764169152274721106824390965834
- 9368174072439125672601413920553750443877850971869061283089542144509045453485238152261213609136327962
- 5618713641431649422139355442206005338273451530798672306688013562930131650176555377047163009150624792
- 1237391937057541387260377844094217302591125049238615493819007039732269827084459330938371631480611283
- 4117948631308461995943078968496411168708433793344057007952647802553242998827021223958907157262154491
- 8831198911796492255687257951873764372652104196188623597080763708251916019748223448209944333236500401
- 5103308033450987342082127921412004204801805010797985617232164735044013698114855410588119726087395394
- 2549086287378390374680988320817221479683074313026938154363684537845761557520199479117741233670859357
- 1769209592840288800006291720871627379774153512958050297099442419138076287230850635785570220029013432
- 7092777298737515761662474840473928515508631642153028208352650155756311959083682307340304392715181050
- 0275265003370868949842881323568496500724939884740105694734338056373384023824360725388733091113738840
- 7645000377344784709100186480455411711002561405408783699288695274139261937908513852292978958106283980
- 5904499241387273763985719482912844834765974014041432598188502453910670591768324622694839736115718148
- 9852877065023792132178926953611637930446467710253991656844314443202029811685936616659255206559795684
- 8269167629977734031737378030874820811784876725458683733424633452419941410780153692124159877833997466
- 9973954295186818200906496976103678215280989529876069957103569096028371008599789898946334872095708021
- 7923366574870714677736736097246399221575321940236988042560150000758404117573195749841674033303526039
- 4809737885653902886659099013584031964803732938986045942039868966162227548943655076000234581410708961
- 5093946926452773942351146940111277191491369254378585394835272648575521602087204812491691018527179951
- 8375607328442667718476795407111621801535398791824774981618583564645228030863239977138499283592092705
- 5530786651556452768959162186920347015645557340287669263841325770360160596459690403225512310202955997
- 0989164180907129145748986244302977071138941462836484848715767856779487814312512432935502476872684689
- 4693387893096861937217245242168739271859503264117183198135708927075601079299185145627502866219243697
- 9841781141404540319609164247843921439027833868372641711554943963041940588806752381877429108551788002
- 0788117679147787731136388027728566969401182727554750200093592740494837691964174174743764309935882811
- 4902415856717211865451819540327446308508490018672136527178874236275133685438258435726097657633985935
- 3648790620203688881027015850058083028005290525005920409954009559933828156055157808056927750376405932
- 4228538216945892473083726933480345155440890818030000971359031387603695064629525581193233191042017397
- 6968511078545102058841174742956674264086276226066772160763338326092443117163266104428145958606250699
- 8686074775429041244464632860784627920804163161718877365407205146931212143251692342945354332472824172
- 9604332479029063540574426435510165761886887575528924905830732266885794063610726347131451280390967940
- 9368497933681487571329869781321192473059949601402778186483195060983999490292484822645196907669493668
- 0918529246540254800772199089177291960931566054867802714844783766043906003147146452296723373821018725
- 0391731552458699554238861364979298934057309118689822968756922198783526788848165620121799323557181193
- 3947899729411316250382377160747601225078909139136007369816164496155077115624751848671864274187522209
- 8369926251107945876744271026054910183771414939538460173089933449360476973301928779138027031350707321
- 0981882099042177479582446759902008357116817844883047873914753449351938140117520881370598439846549557
- 0550101894746331785135447806050024532228986959561098127445372003405068433161951983630318170374789862
- 6632707244065379439277750611738437739100370156045085424417182946223230987415992613792310306397975196
- 2906214954936751493482955342557326734057366254563878208772478017012519108061380763294191048376862061
- 5503990171057754937943719814986022745743276873586654721193724736483688847386369550472304586168757789
- 9262417991924288808684663276562154894537758464269366017054904106967913965856504723142697926688920856
- 9296287842331651540087970794840446062660205914207157264149118427257725445185179225229922899892552417
- 9313295561629333876104160849199666317442308779405887350839478730728309916977398349794368477463448015
- 7906910420838749535492617591718541229359751899008922262172191445930678861976035622188127806388132245
- 6355560680694152552978974969052102555871166688039462531658155902647017179900039902483340191847418611
- 1779142508795783220037431338999438878790174932178328570913622593452398799211941358296486042387182406
- 7417098622812190185733368156857032359430919908413100327424163085607040183967645421975659821525834228
- 8679649061753328803833759251880213557889351191633363591256530761963446885955556790319313426753383306
- 6316434060769725033746120456578575427494456057731809473490446364211529985330435369838466098461376693
- 4308461700054908361012391654874021552018074383204637467839049999351856781079228972587469036774957913
- 3853503513360755073213256002919103155131072831771162507725515312573049623272208602252146484022028427
- 9859329283668879907714081923988378503562205294533615680282037531395403317643158940563253112358682394
- 7289210428147770904529570491287593524120513586876032845142582734694488545643193344560610392771958212
- 9219413108746666766592457491385391579446355239886906767996953556594034008392663094891563705155183329
- 3940005032264170884889946017449665907668684722866810183423473358074816786082569926361457941434157737
- 9697276195362514816047504644571393528525921757839527856441202769631859515199253706473854375073484198
- 0458523109952456640263945256711483053596867831113800408161923406923403260989704104568037934836010544
- 9292069273132391092894894161225287725417258807157698002902327692992653967222231259542378978187961729
- 7369231269862904132940693047792690340796085936969553082870633498853589806317037906551023455503598110
- 4722630784324378875026808665286661970123584310754871934469961351102465382307632638598946857435306560
- 5827530017359129830695156395419433781212111804407015361531438457987316667203618404665922914000728615
- 7047092318388883712590113775110154672815683126173135845444955569340401606251591221445202630400731678
- 6242123473984156636061570022957579512596067890949180714872199201151338603342012490334326901903152471
- 1111770537674903792507047710800078072437972199974867805127054386580977383660845571415922313112507699
- 4385057495720844706161764642897016734248531307265311314113296922449973258986937933620538231043046881
- 1672702967817935315147925262277150873178413472011750829199181400243851651872933219223671393302183937
- 1801828431923462068612248771248161446437262384667227387169270434322667628213359572086575925299335704
- 6930167137706293723161840281281466540339392997647994508355635293134044814997460821573143678277060209
- 0362000236561479481796166953389820330364315197605893882403131045864624539039457563768870592794191446
- 3513165656385303413805511607383011523496501602628983311752665408951427645487394364290003104649756341
- 8646706338393702640432719993444501765362119418398091405435431204661107102294914795728223004888150989
- 2880052029822219560313715553191807236758087351573949415863863465924264929827124687428737887107211779
- 6093428528221850751761203163287865050956785978469694397066857436394417334190563835044072943862175261
- 0060673994465714452565082185110811234734977092353306073156034383366681280289728355294978346861207930
- 6536662298488684458973023686950573180717092710488020936988600525942346855824214663237148360334708879
- 0508346751416318599787318213771136093379679226713048084006357127404476190169902128050362495514649375
- 6285725553472201552916273600484207174507880795076184591360695778824861874794960279482146832553636964
- 8055794751958042265961817575455372575780063850078828942880154045147286645076936364292616561464092376
- 0991944230253071776066476460974890130071283206700958344414867959642884426565334806269850089001435859
- 7934320495470073979019762402183186450225187355768195384669571307006288829263756160327876421596559312
- 5292492422161329574504065382201672623986186616485814342988831519203159057960073366305926447801768242
- 8057937751925499116138740816555196180080619144877294851166256997724515082137146328190365180877334737
- 5322139017956945546985589460995099448197662316058273897392430853104944407870847269906403178359352904
- 6138482240608140130673921194035926589229119690168304343622797153048445980731590371353990852305554135
- 8503033059942630753008447497312132922813900414937292573158103903671573439298137236609677070372399756
- 4711313836503606104054887160986190396184993610539032305603590895271652168824412076000293777205420054
- 9345059959328476579144513894804179203585085252993874450064907705032042624603929134791860529641815140
- 7354308345877036201626136356475367166760597478008590314293613337929331917500848550960438971811040988
- 7752004921222370695585812496257133144760665069336788276888731032445424398289077351072677332667843932
- 3322019262193656446632205485521963628598869821245905948414538983552431719342491299006181463959235638
- 2859406169029756476311262291466746536626582357583297221661709968921215263224954097253009276090968909
- 2981539854778104754603970480564097019438611243783216133017217352016953866778938051847299996113301753
- 0953639202007972943843344271324196298010719595118940802076078542247534707659726795708604373801337156
- 1484930232571019813287494389614948548783732970942781633625443633308269399055796881049489203758750785
- 4537640505365757571955571940241392108268760908876905226368654030187082270188354758472399922894034079
- 0795136796379635072634422455419128095770590315877255589220778969111186865369280723830240389236271049
- 8072888312875535071751133424809692876972015866751891421714342557639048959469858075006092798100439092
- 4945240817662509527417274156016145431594518522171855749552684752772716738913902901472023505989549615
- 7417316989042855399440283027838377623650108590936919201540276948681440882683921593425318596862968867
- 7073556817836034197051841911679193966183372970001938229801502724830835080109717730911105870894894672
- 3054289271511824641544091066453295323935450519305278990931728114996492725306034702159871961345650020
- 6310713361365178616544164970357368209762583749438630392248773435717559667110116693127919204620889828
- 7538871071536313688155466795901553145462365337277109419292748404169131454197001775401916619419279523
- 2601888253730337752336012196171161255538897835617670837738785260756313420586568197019298042050503450
- 9501358373027020583244706964639692236906385933110811220139677100067477245536145173982465787334364145
- 5185212468580407288018781059764871776307978933254645800932156135484194842177917559330935785967194699
- 1950561912931679934411945972942434600010285797589940496943656661909757932956680542467013837449990948
- 8656972175297862499944403863256488733167600407677690717691102171332461667136933577677517966874823798
- 1197416413893296651098321913188912306128832130617534730645943263123690219424876504426568006403723735
- 6520012431948237319111641586119940162345610705558803666260316221668784713489649977257144363570318750
- 0753298600633308289970512791458197779206078069420505494926820444046342562971575340949274355797251601
- 5720797972660701996918700986122241889692247833122306988351930268001333515823480974691137836974486763
- 2078154664881263924082841865160249149549798644272098660518203571764568949935602043071048929581586506
- 3951917305638559382217514301314348075986693326504874799038056468350956561639841602315510479659885931
- 6847452297845327115630225679638245805708738335984861594269992353031747205620220372615270897606684602
- 6088744711951867528525005617829728887196752466048954131079105130025731039262690888474237156518309916
- 3546737457239943835000925165391918101842370641827844631996490552888569939325282656262824286907604695
- 9122933888826367890525889629799260043658351292859166016816271158503859509920045023828805257871607999
- 1485779511741071458789278928594455422975748926639149060612255901846742420489830696032609924160537319
- 8039930958031845874187561196551694103025884274613267715286041675625997166890091974462057078876061938
- 2471443068200786999515821869152348094620599473367284161874380183762446843114622719971835404199085721
- 2670067522055708177908020764223877008302314596324376972484302281374748014994596782976524511116475628
- 4494882391126580223207233939672487353483796834709037217278071821993045796170874846683226075483119464
- 6363162955046142891818703440255160661099604396822797600851051090393629109199421193882665513643110459
- 3773982337547022348970989382383349606222414458818157174486985800768017680983135448890807309801045982
- 9884067101286138185559779131126585794627976344020932540464256523214487854998370452126786486295967723
- 5993867028758906282699279492148880889025975297177478906720299367123678763451986595708011874771798648
- 4510898251955339140452640402757528622015609839097436788392343368690293794902388062976992556920231250
- 4277051089435097832023702609078772210288838691730652029707426870592354303768898474913311508457272408
- 9272768529320256830382290269854983092664279816962154826437896461283683804207320924463481062482376286
- 7848195810854733788917216503370931716230082783544609535500015708732585371829606975508170435834992204
- 3478239737270858232696362370176097674845003041090604011687748131236415722492541367350659699997435146
- 8311300047904376338946838115075044798362249775689187063312159825736569343060981010581075128320284644
- 4444669225835877645410765424544616023777827884230143241483760775272286664586317686875728436203463872
- 6464703378104558038408699001847001329490672016291067320866560152720035703770087723639337084619152832
- 0488231140350582535412867184976918987401837011197112474081661540189701457760230237450381123110997102
- 6466141404185726108956369605831244662510334421769869553123069183533005618851848711467565374712842537
- 8375360270025404781526769638680028149067082684714366270449383420886829795605591530914319592305379389
- 7090912350168317523156938922081723667794771797136271924145558888086019038040749460151095181573219926
- 3163081536727786395339826503769350931962174930710360546827463851923840108589380482153796057037554136
- 3419453179102144027724400228595051052507885300563625487962039630514167505389028154839893826056184605
- 9692543092305011844820244405735333994864623246986164271525520414183945458833906450700211202816269037
- 6437236786327092384808357049285566542256570041716643467942705669316946590355900250098110204615997069
- 2226960430393134150112385202084330783492768521280232291152519737913751743284056717195786548200968348
- 3949354987063341045109115580239978965553728671671998063562188229089859713594565995658390071990841135
- 2900703212798486817378763769197501596503476210492679280029798828161442624704549931873587379611446122
- 0750417737680384233088995124892738217191170599517713453429945729725215214038343046073402932129297183
- 5990233671675519020483679889348578542813074091711212749135188966503880595036488660019305177479737720
- 0603859479443146650104107719235172244725816987613573155394736063610226081719549477487334657530769762
- 3829299706659381130355666982838308327669547610966886531811220411325508888982062797980648030112172279
- 2334181960798412999720720088418393872211390347247310851532774836698378248679654485396054673324517828
- 2183737129068488432260975031906355301794126482389535114738786399505486022460003357691360318382569522
- 3930439416276778650226367159054260821794162606278653413781787284203815659300744636406739896675492687
- 6493957184903132121136562023902615229840628730956481281693035018696850371310954723293767472224785729
- 6417081985894052169659810525337889233503198725849488937286407683296645338400341397336846566429981296
- 2074532556516610754825373816739692277169563653668258137853929592804863934624068004561289736777656499
- 2644452755616222399431748911099786814130034087861609640689091934466010685781739964966919294071519797
- 7061967355632780830374867624281895329937993501743770330412678463941074239000407519860591815646594775
- 8609699994125596896228698815789024265778977792045289457268597880151203918786449716049993622264612495
- 8687721434771817782721540331579087438333180945029353819157281454183268211248197232597214322349402628
- 9546957476210108078742584765714780160883340496255465063241474442371159678992370589827766568589771945
- 7925992692904083389327233247930254203274120827944369363547913979579720396366395782104958416314403965
- 4240938604752833259243435007813065949179499077038816705671448564759014708193628846063438708308730139
- 9925372529836689104103313594394347713254525111255211109279872778595138270891636659095207417092752512
- 9902620455410308034810322700046208199313497741033969935705200813490694208037872203790464382890249902
- 4012213804633979802421821068393468508849301679182896621304254933387996548743861093208514910533275877
- 3226902672412929662567364590687559148963120501742439452638939790244232370326490359685257821378096515
- 0454498931866068559097566323944226182229519656421572541809032099804496613813953120985347967114699342
- 6949382451496674751598529004751805276612260071977572249670815150580391434618240125218092935634426976
- 9077593665452090820250602780467149336326778720581681597025048184007645428436549500337194233565531706
- 1100284423030042053052952933086763760286456546110382753741547484910093128725956442056976109993020881
- 0403531866948926239609953565722335747574315878618459048319664295632227261052716481983985463379437083
- 6572964093948882039748696069433331514579163972074807234334427069762865685088947309498159719068311061
- 2001028675230952011106399785970418819427843873191795483746036719035569303839940154837381862624892618
- 1581754672309466283620556512169174703278872845703153454448585223696069798688922493453282096934356761
- 6792601084723826258975990526379232591641503276362559460774627417043325449345744488947721687627182772
- 7072947967992940703725682106129508999370246217199889894467876686273457941352264033498177530833993906
- 7029665213380346983727289053247600661939254582065928970141526129507274262922793246579170438371626932
- 0753650111960155752594694061918181848737771342683444424052930660057334458886905888039317748451177410
- 2397358775282284385958672028239874374352959211556243224389289630027291056872887268161611773035695272
- 3169774369592914248446211898945750116903129574251482845174419871337174865767463539747457615954160878
- 1521949380382190631719785463648068772488618103918944897507305385580490920796321483089352318480379090
- 6668134527178233532246612521949926765291427590890922621175108174670500059568093135195284008043900757
- 2617866577512574528843305355317484142917533742487750948993354373583595545788270603739739129226937030
- 1243965689712377394516731859670419317393074231020539449279372556695143497880554570330590834011304552
- 4208837745301823471483685405703839803008349014666157562782972454384494736538947399853428754328227478
- 5381373116324699293836702958321529676293169015770163764597073115455682766349019482504203271623554376
- 1606289610103177892081300713313496833865486540725269994243818874654827286727227810546989992436385383
- 8917100915927170823049066727659616237816864044108587574547936667543859698670955474999659120236471863
- 0251342342866031230832887254261484650491333914084557134897421213326279563751415885938343702328836763
- 6142721091091632643811993071180581370532052181871689034040842283314956139714100091017150993735501625
- 0498698021280775524186200458708968444383063445989495551440098765192200443482688701270198303940692242
- 8539144344376925256906037856331636359169597563628551168556316245250277545376196294289043661945896802
- 3918515806791438606554576306665385508979167196722773975207635829190576647967180388564538818866035064
- 5431683355124532052382832782772109259629794743650827334190694841174771358669416235515154189766502736
- 5243778292737501090510930825867898462418684947221879450928673056564729372657210556932497375301720300
- 3429846293990357604055326948019752126003066980384350399536224586496757173536448662296086766502211476
- 1971906683670007878619525727724960774953015827040191563034896276315535912935217020929815099957118977
- 7124690854467614485083505413333978482613439531495371915024132149252570114576270103268359197885516410
- 3614737647596250976223028811188954047134804246179115385416323284005437108464269095036218683372877564
- 4555584451321260709365088896899626104066097271490158259265168477635062365733527671953832978920009067
- 2985653235452227481654101948007407498391882302793263914494236957352889952770410995339475528270108194
- 3357336971843195081657518177313617892037222004623202250257101959975795240224447773214620837600834855
- 3877306273902091886835251019639767078418503278393034561640141876545693800041666721878598301833249780
- 4306684137087899778060970875131224537331792104776532196322692920624441186024038239395826938487694386
- 4799215827507678016075065363560192478163288489506739317047508196646271951189687925950485598142253735
- 3491882022522322545270640311004505864934019626832439967502709419772579999621126315498180662935407155
- 8361027497190651842740656593725451257474213565274061255142087368319535891534018300564376147556000590
- 1887559432489987342354418536298897724641429112985184953106090530703685290951747470466217592782127028
- 4427202763242218865003628293273448127781908247371971787331228262452933903310566123136943767215970190
- 5627862510231496508385051784954746257928633548467647505619389560487127247631535427130602573246197073
- 0588914499576286610805194016087738399359475968793420630616497610162893847437876270839809365286890936
- 2413539742230974044012337734528350622583007681949535057372712472914630242934201182055942858754096729
- 9824774332995253289388910288262385002918686066223060076954145344014154378027435465277981124805950108
- 8156886539095810551792517892616859476198901851288548533001971913658050934308651373391567144253106933
- 4558535936906805731112135220901489843226163964326307761140249595727575518017958941940131977457342289
- 2233099739196245423781531637399205324766455348061014367306832579576051667436473662023462120548832579
- 6206777946589615346666284962251255998837366356154573809942398223413977857318118526694509219333400278
- 3956605221904343907952187695286295362583451142883374188013897668334834519923543727595099724884754998
- 5348212875416021214200071674252732281865847130243740380124721275771551735438068693217817098469304772
- 1386934362393518517720943809190247679191235016341974983001943492514392273283998952752845430980061397
- 5570079141708167825793398258034505303504355997163018455281682926422796379517399826256972139310348886
- 9523650338876723534591792138831157879766244044458568626611876186607785442345782556217513915151217506
- 9970282671214823537616753390299724794386940098439803372392608257591497122524969990916251682241883027
- 7064831538112236871275612260858402325217728238991975461696687100468066683951394054683014706632437280
- 9717308526175004054058463579964387130602504665324509851371135047840666967408120622808495247082736778
- 4896750668680665695204615935906403278260228102365520837977749099988133930572493066866543878693836289
- 4312535175161385304765696084834268921637953176445418916273051752216789720804110223722838862096566304
- 3269375053812605807435715564425203015360659827372446319420027263684000729039135232160978068208980025
- 0397115413563807418433383843775594568899343275732876358995393433301321522590012083860051252010931866
- 8826735672604998799535122658646076878454488418338341366254221969714632518921172825009741219838894379
- 9647742461118287564927400801095806810716319090555440663768419924830303824453861204763918078777478409
- 5532936773126665062304634915420945503013186992838587040497769498762308681601198225060378407782933137
- 1486931955769041248096002894285901471563003599521187511349609284646438827763668164442908723542365626
- 2418491311097071158811075995684882418627659429311553264355336578107862493660680973525672832824388047
- 1495336516304463220419935623776365923546949824861222404369330506445470866983819456132717316706287211
- 2922330882782287685661129367040431097366815821566525309531927357606575536633813081141261504182742591
- 9791584686097566171115535926504724528901397973074836568456676376607503000803886827448092560195250182
- 2877867751168351851390092399073510597032706696191540732872891168466075052090920060714564638393565915
- 6554266871106258607999663404577588827698230347449917712787416589237797961170443306654990881949703719
- 9281218530920424550101018728097074432904339482702886320072929682300716061300967267295626979183862541
- 9239274660390007121099734961053233558472567594158335365038969578883612227716102099081807849942356230
- 9210965202007496819097023368204647962109385232105587621508865676768483543211634698215738765508378320
- 3733814319900742026349784281011684895754010218975450709832665427621469333908039904675311152024150248
- 3200566561580635979236181932300762882729466887837907885397404896953393147003113132449309322770532613
- 0028850543429077890063403191002285599374199590545341982948388657641910838216642991461141910541040721
- 7183757715506151351539277140087755200122840978187258166270893127396454647725980889490463874441203383
- 4039847054748264843421660150604097870387197604533296815945603974179277038661169175403060560427594749
- 2737317580608753112966079880717230218830918163103554699678999676814113223840584872150451109777541309
- 2733480856139943138919564591791374612961227432649028945058286960183976632667681848636729784429610824
- 5753273532378558101279916957607536616328445715479677570022259203947901245647188595273323538013204986
- 7071615509158782889567274613439615495902481052675789916395615629228002473414729092945654241442384279
- 7513489457306058339555466206627021001410276707945843521164890881686243697965682341977082233313015802
- 8218768411671028519113734962555044156500322013218780720836321567275832894119429300942017627734310749
- 3222163016969037110211968178145961129850803567824717557225952337646404023992449941171332270648140922
- 0890393406774165907933582247961761271957579062321607533348044259252472166376532812491737879135545453
- 1828388653870756476397340816244449879336143123185696534013864422093057439128727633815813871255067371
- 2242883009985818632101563534940227831056311703310767124990400513200129348970272130995215492391507859
- 0421402689313004609865615236140525303927254313140978670372367159813508704144415568474093424285806826
- 6918870587013314646320508191505624847600443520708075408782114949462115092792335641676736833501642284
- 2786529339283279284533215152892040943012000817086185841075044157621681026060833568283697384319713651
- 0829362124680025797679911553999076484038049928171803756534595183845950993400933926031105087975376413
- 3549052939570876599134289972977018161429476080132837284371590590628796866400470614917846595143380897
- 9790174722888221305314151452675047969517343623347261533030009304974265653945794747407885636678194708
- 7581203460486212211973268398503198398806751235560721231422483976820693357970254541142678568828685762
- 1814616682467550295237752661408949262179410234215163541177570269072944307695709089606441496588167174
- 2121668318114963709144779139340867791720363604718337590738200996909450123084402978243198983074299124
- 7475096595054024321134629833441563938684666384511304171688046800828350179909695445574285813277440301
- 4003363683787123611627532239185200931510869547854040603851429675337051449228581682317546757859933248
- 9704331947481163136568762244209211961639847807493990632550658610472649946278570911848293076400523023
- 9571694045302297748433753449693479104278804649755091689284811027335593809440469348957848319661916191
- 5687678664744209176769614601596143007118763711598184357094876341973991380856286178181951683356605131
- 9780945322585426552516534052564189836041918098775647547009333545646386374588183707193089927774747776
- 5194007121001602129242904288437751885569693798413746195948786640495288517970299440341709225712698364
- 3477923420004450897240195642776843574000469180688578829638255568576955243348105923536963237766541213
- 6136594165896489360126908303912189079669346387826994625689894323842694790019544917649079925967283332
- 0150204055056395822883229865421520127390385712551158338946014788267961307059368446271407317663585074
- 8773515360878547105994508157375037687217575866897476371420450858593475520371592894144903845551888247
- 7822488860567681794844885054248271176560204127562510816987302947899169290417780732082029453912387288
- 5057804711502794340678197206798706677346899175968570170964221498843862131723330140364840906229633661
- 3973120512678548019751401068761497867822382951553014477543880094209195811190845593172841912844754245
- 9302404344156046849603652232207039181979547390237479288943062875587989550434633272922942658198189938
- 4964339039017485919007454985194324377468897151635061784044765817263836980897975093316068670902736290
- 6796736528277031546320116423755537799298474640332327398535516109777781075212622968949860513517165602
- 4102871037724129408278075558919925350758497154770214909146833655432231086547487771386228875760810079
- 2717858979025987591886351963060456666333631921740794453033459277301240490432328916988631072549085903
- 9501306666592730117026037662981068329188801540077400682229302138595764542356841724364975303391034247
- 5954667977697080027375943580064715248683506681994620785001781035428128258352865340395212327966035363
- 2408223180898254477105204750370425226479722869915914522430007083320007429597732272579503765299376768
- 7202659189314667887983961876650840897212071621470805053296553068382337586478099701736217752518266225
- 9448897555479107900294328073777695412037888193857533624535557555386215137215790485645195524782723839
- 0439225555860854598378324204224899605866221584236888878281887503287720578409778708991012397962235928
- 1304154281462067094690729430442763735707951946382406385353975389325145532040398658131876665067180128
- 5529209290281388464944991314896215110965735382736711051946125607048321120628812596874969053325465166
- 0985515328470502072184489791513038599618270755253508309417881533073713333483247287774790518106099400
- 6506218469579141609025863337653702695033632515901240061077265518504085743720504028696419034506015434
- 1482587482135948966805169716220412921890901365194266163349101517770935418782341159443425730184584604
- 7967497734112396736746076937584906354299939745453007174309149674014521858837580790841009395282512399
- 3941887800098000852983250117971552469662980523935942605334256683484171065964689960240675931818730076
- 0771656964600274918478453928375977395610105436229722833079671242759581913381790783409621408277302609
- 4598302411681339242540210247908295842719227209123104987777436008228204047939823835763173244317194831
- 5697133001082852534017809175846522941747359197349372218733486503775663769454517348058412741929648062
- 3788474696003236329645607187500856199400629019636181432769610791010248477449948177473036975189922813
- 5576935750144684547038179643560419274820296641148426475538846160928431736673260951171414551466420877
- 5937211606640057131871831940378249303566026421145554655096381561717598832630660635415029101213817574
- 0705460347589437776573433474433136145706954995855206815968719207955264670235032289325886926552115837
- 4045717679269786983093658441605217539839796914164692130528871247348215268404863354416036667164545205
- 7287892065390396896570098833039278228312463988322593681848897300762029501913922174696391900812982244
- 7578103017840712413711813334742069153806373196342037227001353128231561282092730787333606573188224330
- 3526775361685144012848142160469279280062614904237264752955289806723868980112463526170892236094195142
- 9831850549387764220559839784235496068384308044463091873898281103232617494249024592968705429095989327
- 7188672788181490220518594249649786437220191508458725241513773308659016343738990369096183941846604804
- 7641285774857339602432888485615948165391309950784326152761242743730419813219131097138233235365219625
- 6565684132100997793465867125309809163123694545655240867099025795737378690735707957623330415204577601
- 5138834558474196237479266731639431708110461614928063588389189301292776504366428922229524865961964742
- 5015639365130455542218413698115505602264569224268844270921908249138797460468842621535222232159695297
- 2046003562844801805143092351464906483155814707337390990940330635162847636452430703990228906910322690
- 6335776036486055194090278268031593780882659283867885892833398144312107432421057444077972553048758075
- 4382718089738160582946051048302938386321120440632379853101812009680047840131210419317231158801989412
- 8999509449051823520285501747845472762059863697070096215053673678007104018661808141385962780769153033
- 0859735979222742977968064432368930843822216161344502909244442413428682045989239144100586494855598206
- 0284922716247787026995589742281427014367258362020191046924111432481136567823885316616782305910130295
- 7723739494218220628532292532966281056278942937466150517532071023254039560695420249982143153977132554
- 3297586855252724801325259204962363918642824022950565291717349820738772748645347449926663833468080472
- 8431021137809271950366939837088898079287353281533984742606450074080844329450210486602352792585313312
- 9653132245368773308954167066148363110682779419010528654438552547588213894308783875546974389267645496
- 6213807228842572393450520834542156644577393590327231975817176591609149922300536477728381273341666225
- 3384147224262994241192462240097854472979829127844039263998169698249831998810282024020189496060671263
- 6566100746939708920646894033570492380927010705105350938561179427302169798825354162801527272038979683
- 5160423690238188359887210402920190710560875100167903711110517939171375466236838325414471785938653029
- 7056462626094815960597311128207255718281113324607610421774775964548391117971361887347487868253984586
- 6897492106177035032173667065708216985559866053152727023642929621060332762951293492175214297488361749
- 8973053872979523177137651695656076009410257209652641367228047189019484536577305232471845768564345313
- 3418091260257540139039411638861092776307356147710429820371485588099882807701182076886043581805556974
- 2895134939208502703609985291365667242000409340681562664800047750369267010067187565498302678403949779
- 0284984080411286490427373187873235749233515777926654640587552701973317415255343693433358781774394766
- 7698653410903424182885600468244271735589195629962507979082737456067765384902422624243413944410514766
- 8328626098116986962995732918948031309383657877203054406356888087392173364316856301974958824077856564
- 6911005844850632217485602786987082544923435009462428781142479255709287588160371333704989444793554135
- 7861767774259300350199487881893546457069989802388428594340235293957359036387799554858018444355982316
- 9084248835355006567840024862288539779059190210100832664391404237858347141539211252119664412719679850
- 0140377737816113954694556263934396372291698397034431618022638018535077274790383583877603813757838647
- 0121363152065502850438209268547160480494467248770511152956399198461966070480199092254387591936048994
- 1776424323787824512750976245752855490091949663430056325042158247850394386565734703026506980027224965
- 3816227554125812383002246685055927019280952766320805532391360748859854952576989950792761407664345764
- 6429097181815270408434116864875195291524250698686972091219727276416639989480352938155720610365285429
- 9804227933990984630926287867918884474582281838491541379025757617305573721909891733580870609521181391
- 3922837017330476881808509917109050444013024907362722374529981247942216588118589638088129678928602717
- 3502479061364226666970965563306010179050522655425750442591979884309629281030657817347163705682133316
- 9546753852570412755704075586258683249666663999607717507142454243476380734993509255726525019287640864
- 9276184971730458976251487164885915989512553752282229553578092755157717734942544940646365328643887343
- 3421753070279721078884393578408051947775698254173932129280352819043283042266081152776150337280932222
- 1614627280225517275940258914049567804027668536835600648375121195655603792908901749705688289249537680
- 0055117044514709040276477095266126178911643527084947663336330375047626681813493831684698386036717861
- 8075709038409994416681888508857156733750859452381605828850594971914115773519469163826632910009363196
- 9376262656339971438859083062405002210685624839375451664538977952645501454384899174219683121931401372
- 9951184100975097941992374688409542501321236476707532895687164905935102896844431703315138814848447542
- 9115655149549323986047347014309945309592965732996406961790565718915571395922522237799661633492924092
- 6900212172351354308093758013216123137754512348729033561460914816427581049952002360871359854964801275
- 9693337261148782204827141654286109728738531498106973275369685591326889312465886397377860527964731457
- 7443870375512914383631014808801025549750185056343837423264942884038079814325557800163924992969085284
- 5898363913292517937062540150226681735964657598594163322441515757367266219230425695566601862213826190
- 8801925812037238815460077600385904490388617664212001571276624408763052928397860029377083531090043918
- 6588120008743195074102899806565937988870123097310069701795579926044738696361160786515983764865016794
- 3285933431962812865551608452919059142677920493990411896788778786674303929975761676465546813424735632
- 5818313412266269003748336985031872001174603213572511554875102276922014334441704147593650389209545499
- 7699002142804930356954589200600890881228980848054976146423981241706535745430437630406316824995543589
- 7677978729067940476948112679095135574378201752416467534613297580009812957790997270711903936380944971
- 3956296258726823835894718541656384732924275869509842767377721923321752765396866061772823715965708211
- 3035581036381518279132569446119309158813353194273406654288407415997081949240291838849762574831533937
- 5254667365082843965540113896630167639046301783547536947865239365547983209434681476337898406578472456
- 1420759944989774128751744945814534657383789979602559586269280739502699277569907760849202215589743467
- 3926377917530366643870530714852519470220957089282863695049358558489320909558686670233457554319254514
- 4251812880078499151418500330138018283582919167951015135063258915735687948767419183823306159137685922
- 3498332250831999552784862550590848674550469516024205215252356676382666432062440113462461848355382319
- 1903078979048915649288167569495129760602261851595750909144277224633135683572235099411255280916228242
- 4069411322325689953200039030202196968217386130987969800721311638620390327297191995557705918946517770
- 9310867334359701908675463750777494181642136624587122836257130969042522142409274144442862946764111157
- 3339026068992839959142073445918210129878938271304750373833166795787273900628348817212343279316790078
- 0179277820576279424741963951177750945739527443895863353347367966070550527012142544299479080491346447
- 3573810923689307860356623664611507441594192307991226358053752635962493588388549945357860888234906479
- 0166624557209478823103870099917210865162700174127764789314306360703172683961166817967359974052437218
- 0120623481940467735151101150135753039355361350398387654046363031729240400443934542228866504375595216
- 7963855990474148107366357622269326643306422466225136196475599479394475167428303938849538786086663136
- 5660876086740168682542438595093098390095082474146115182797151479253878236323116039101597908370532676
- 1335653050108925597369478256693522289815420801446620485501976532321021816166219530346571841288016502
- 6448317775303785757210757216727037351922240314148705332812556025237909652855171060447447911806731970
- 7100206860334909523369289943517346016999107184507049095286957774131794120530566393158259808009454159
- 4568474016733761993444644185952484585780679184671826721457933027162864842332549702086814740691585705
- 2483014262513491301317931897383824525493171754034351063059441518585179933228918463985687661286780829
- 8214112906685003925620774769600566532434851625148542827048561423339710633961326931405248211840228020
- 8764932824600707929518671187707464164573645634222261847181242843835488266056541755904987953693629595
- 6649725411837193356979846993998266970823283120991093412559948081987322038686457497615007315013080359
- 4050406734056012325709787469629188299464967009553229932888316237622770234460841617862958418100330595
- 1772290600660895813030583131395588588048276225962517551839426498063120045127181001922219497057669748
- 8445965926929976916207972664234143396980960850145452991168678452787722580150857428597643180504071622
- 5494651215268950797614098356924309417467654518171956674720444984286032696803718410825938273355849743
- 8685580513595228455287596361386027589819453100170760894427332474687242958911647821885362098458294683
- 0304075110083054667661213169494465638662336973149053630487890788328740420726733833969258348281353332
- 4626119663972767295769874440365471360016591674771423861819916453062722898155773566229226610897177977
- 1500834627946440936058431573206378347619517000016581060210092878404435682065201945270285682643221760
- 7135816017522219734672233277802743989435971155978038127627806526046703857508556025560810516667781838
- 2636916211202759547635750927356103375651797699465779495961144911621311679160046072342568134822109174
- 7041610254084248399240423509621969126368120916434903792669349222546351017403410154654375283162070610
- 5390821226693539714144670163871339195724562013513920405091861473232182936195189123645492088239049722
- 4882879142572991339778222478186521013391414371601077808100071612966209368046726337703019405918478585
- 9655730889364507857936000878628686633807976368902807806198570100232244772514039330322119572056967186
- 4238802321863347761125994354864992447475166117836031669526375416043600635663238710592793579217568711
- 9998228111108914246461015465535659621270420999440319758735153439833319560989417309386547454651409993
- 8939769355392245864303588762315761562586158746287281878133711235134587883785580421697764398525992789
- 0499624290653889621582122218978878116258382965907363248496977987612007130681883372519003703774034872
- 2504297349609934766072848640001631992960669543707142711831921409924423946958256654205419145120455361
- 4236488414816026053774866149864110283759516290999622091232981921678339239642561390727753657077363937
- 2511982297369678692468915137165264869759651344357671228268583753144012628041840462286935889735824637
- 3787848447481641210733816758775922822307915498221080479590434831933876343307339949925194243372136321
- 1915365810872552754939034970117953105652743688889440854746664727270780909808046997309405202816129582
- 4460656291655076968023561451397859995356144918568579496089902281540993189622735210747582448567245261
- 9510048267256152701723009343943029068805301926455353042977099978289188712729775673122508012156908989
- 2104620610303265419535588308434633118423243266793502469894057473910493235573872862497868075144049873
- 8143435118385255825859650848619765348305165577465354849251847062358463611289612310634756134878291962
- 0808029021541889567169547057841263606512805097004486533945692126761074648902182601513600217640420759
- 3430425154960471216560638269072668810603281420474122008886673494151799724644431487852302819566773009
- 2434525278035472371332498112111447527196051728526390932400074100850410135349534043775070868269290958
- 9645056777697550518169976547742490749871376897080542223103073699862144213444970480833388629036192462
- 0994170065952755234994560840888352771199512564117887487755426906953789016658371705059760688177908491
- 1618570218746070392004112101273866342584584512364593848810490498891712468573926962218064811341034779
- 9910285334504336352935599469991079748386073093832224185655436504976494583857095754758924181079549377
- 6431689626073436458913015274465652114578614155770992104933437132765485502078197577561301902631627312
- 4397224267414660169404353621126647620668955718147149979122203905936045317129530955540122855108112121
- 0265729697565469723178282753589325263383311106965765815561173594867954759424190295582012445750907537
- 3370460353622615497103954431129334077832390857018090461357962884855271634026996506312919099426969596
- 6225589497975628721287757198542419673475301587463470733050737845796145354542520644230878240841408078
- 4627967368738878895852044709279081010712119877987278359242339335575561937132499795938760984147798982
- 1381826503432240130638574544885493589707048625142787242965210065664978707015683883864539959036508017
- 1114364104266278696724141998326547334111284879330934395808667890754340702026793784774345535265665129
- 2901343372346289780107820115522188723937312016093709704068632553677092619190039894188411459261537011
- 6668658956367315052216330410779848867721149416004662110658605248504107954794838142514049963682497073
- 9689414424666717487367463168517045635775424231051505809864764641739106287459904737924888107274308142
- 6295248909319854957628983241719089619983841001815466443780823753328402254416041489599319087300847247
- 2855748818376975818953479390880198458062894211236113335463254004046653571731667323865207845030801661
- 9577080902713241189165462019807089554609187238543726113874966299766658252314714818800323795003806670
- 1185989421959948218404892260458854876888023375940142157915429528712356822719394165950006243911835934
- 2678164048354162384967924208087709963757338733972713857005101721639010281400619964029555551092051482
- 3727888939586225063582005762355860460670033354514888308803206990796123184492379733390033115058829483
- 8020687671024091648595888839443246563446675746335849532241416518803282548820899182410294068318220651
- 1712210563581095080526760824300375506483382815036583507743940163080243748097984829566487277021341700
- 5589113966218009352304353954888255902667090006571188533595233013070087619042828655767907621690733940
- 8560706158893619301348780259524996703159143624421997785198300437984441454865516590828204141139376731
- 8104087719596578936089006009298571878482454316218024538611683785858623451078284918216914586433097247
- 6771131495903082734618524789221595763617619415803413031319184160775944101215743941774531300010795056
- 4422525109306737523223688543242791213530557592621003112211862038297502753817842541731173375517119681
- 6524092843676630140284331236103292345231891837022303444549741418863973986508372860686169436251316559
- 8064294041596095582815279474489407960067040156066354233056608882241092462255818735880428279346966420
- 6274112459752152202761318262096736092737034186306804296209480151901121564632335461994960497408344435
- 4531421150067268251668779506672541821696486833308233724458549241292167319098180229151717027639539076
- 5960845015945874597607378223637182049117249030372172847521476818938282858524186640140709140991778837
- 1395692161707697901006019230526629784219510099218401232206291400604821781949015619479026466313128750
- 2908324448371554662484940386152485353273663548381024000726950375367248133315649581319529832958248945
- 6994701540983863588375105274450387542374163505345484390591298010160337024065091419654406408930992874
- 5635036122491584860237513287337313061777643833491141679742795635358264326565093438974387697125404890
- 9954397610309447012230170495967791613454602409207214946497104487480382550964755792337840850157046965
- 4092609937529297506575632445478640178182086899760355012046052898752372284096564154010430487466276071
- 9959290035181390822646562780069174993818897575504124552628118769537357505250127280159222927782677371
- 9461371921651640018071110326066546576457256839904111265510326989847762004945257320763366118794668546
- 8075655577881616833650598047997528938859344621827274827697573534811670385110008812060026845121931613
- 4987292279735435145251620662644675504351300995887599865911443487330276057832738606108196032567833536
- 2521398537214632713714373366852594289784092798477878664746644957883589668082045147767271907031262880
- 7710771780875944659287949105828127513178451193902192043621739992710417481747355300551496807137461376
- 6826102458229788902686407062087169184080590668402107117975507316360971232104299798331921659946411876
- 7390473835823972710206691386867582223407683714025128786024336013754569561210121118668569527576098387
- 6242013180600973001510948770418647501460347190956001644591325816011088700342409510860065966824661861
- 3700340454030565015603210896111956432794011332320624412968527189733900293043875268264132523728118187
- 3418377266831707982236681984925517311140484292263600497298366464717470320358925111903145526378203697
- 4827376444746579634703436277452109556074920999706859663108318811970526754076084185209907452641268309
- 0143476734298550655555049583671068719038492443885017162418959241597064389551791976124801051183266210
- 8395180919193168647150076228549154633210029492313843480405709777013982744519348392219713060823701654
- 6337256801393503481012122660511497687829462858623206434741211262663352782157747324524831241354286604
- 4140191905637144561933616734099663782714960097805768754169534454405994793961814891494772883934449386
- 2378544571071502666829049614037984996997990417731453498520525154680296797462648196687022861642312147
- 7629241242965831276366150132159956875563032138349578504195023669392820440838149111506865684280960304
- 4852969738253800241726769870945805588238766750880469991238113646498178032327138862753999814306474612
- 4047754171778696333861396561788596483175635190236538942860987981324310596410750202204906039359870915
- 9547794213809864179132509391514302291823591945291150294344931341236215198182158312032029486003940276
- 6901266322070662570651654600527475224010199238734690299750611631661928185097677922609310051354456493
- 6116459656602849112845526224785726874706115946260327304926038731909842727022302279363717567119268583
- 6471857815155133520340200942557325702413567497929832606616892374772379092315644836993982219062239598
- 3512927748740492188486514861800676468364747663490435468522704418150329473466880598025997045147190867
- 2697542090927146372479398724290800146596030612664416602228604050721331815082946098885070980566227981
- 5499892792431405323990348617380802149334102633155051103722338875148162043988162961449937118414730654
- 3972563580373206053741937671572155162520262879124347517695662745040518338716088598437046467204976925
- 7186263068174611117896507127338941343126400421900228426884632219249602699285376809615893194890230425
- 8339012860852902135855253522872936927725731124839805870962208930684664626363416474317898670004740615
- 6685763785710758427494742964857966762548769795941069449268116576569257910637391280917433293427660082
- 3474451226468172447913454112832897445755146507869565899052824665349909387151111696795153643282615119
- 8278986688971093101695910417845024882873523192384486242263629734975768439282263112020004713218720170
- 1783710975756685537139382475853381189805680552456175892532901241044606138626252972014495518845924861
- 0761575320195237921069318224655177285864226604778693839844215191391884947712040124803222614617113859
- 4797565685911745747244418275564366755031861737105312840615915488212497193717302126743920082041117549
- 8546836398413567746088381673386741710047033045122372699632967533503556837425593278850528484397099534
- 1517659032938402850692199642609108990684290371284529345494907934984037039501594365634463139951298245
- 8133353138964830395468537774238675823879959507312791666339121357622930082381374995088042414367706341
- 1867945790202225251977023599544884292304632875492349672208730074226185326239441584686508261531865605
- 7785769972925335180744046382897304361213124874166495577320583031985264922840033821229619829400035721
- 8896092227607689217373213756128171401278947680860184617347613358304779955557011084658991846526471602
- 9062432682309721379199995026002007677928428128010218904655036864494068516374694740097967052287174665
- 3346534766832852993058391752919256842294613330335029926614749035530997059294430175663343834322304415
- 4343703476466404927395026581091264882415178063849558473212925984863914337804053563760280606861278168
- 8892152483564543619165845905112065370194484792425462055879015583333543255865910183915327556343253047
- 9137407024665888585517326415578510827116214091911502018761617581702513117007944140863486314831905529
- 6155411318677747603095539999860807938437497622730370371697491622920021830001353391812999182960402359
- 2948162240375734996478981565262268246922466182266003346563155444069190919446133592294764761753098401
- 4456964949854178741721231360779557004623157574070164761282734096389797697740198761601941576015291091
- 0925312276183834786795185241937060797916559070575151805129542831018535917318636529202913084205780739
- 2675741156313456410600481485906597772775589233973047601761186109466683938317051367676598060864546532
- 7538441719332482103500346143870064257499982174252182121892042469834596946017145410809671735478479028
- 9649005709369565850736027996266961684643111823719819499540175555079372487801969337650451347412370232
- 7858171705272875406768086778657331919180654146507023469304107602604380764983984187762433538838135818
- 3139633229783045192735420001244347701439141020280583513761524868346540092241485555890737202921946094
- 9678309380472522542715397156446139320717562051057479473825563034044998409055189312252581517064469135
- 9945494107897660528393799502191260261204772051458836877277420393934927466174231696612724488814202863
- 9142022781241935332974216945094679545206739569773828062800915341955720929620870217816235957315398580
- 4940599130964597843674616880332762471313321871636394671809366747344033575552621977254844202499963393
- 1748616681168580024161019357181587639139371591531076342504338406774911006239888597954611355539755839
- 6530539242511338515197295715072567194931591445438867480941270092974257722117019767807775541153146444
- 1588881354640461003436754633954381365737941755202298370463378124045276311595878742915414204162066248
- 9126162385007770392863484726233343506441746226554888964328960847169212331084463333505337147173330331
- 9017211530774818159753187403206520654666303834024724044364192958515662077201957319351948859162981533
- 0055105279952540010923346567985970645405142910657105043026284793759359388054120084681207165725958968
- 2779436299311192290462874989338151616124180754183887659727170003193889665336565273596570472983705556
- 5100268027923851679503365206653091784354680053222118117845683243680044326659025462859459910385475796
- 5209123438950325105958302845145019453098923277198489280787845546749643627564616966261836486662036715
- 5784981383986825287619563857360852041933202576410865853082078346093735426744174587917981650977606748
- 0342358794378816611199895956667944648382154771584452235751309630861325983230445664681920972502934490
- 3578658988884052055288786406593898270941098662152737161752449269126472228562674431790670660513250331
- 4572067834404637951426017333495920626461812732873779400130153571573662376126852832110391120166194811
- 5587795504039408651223604194975793571897974081155637346720742742415773774044410912384855584519673648
- 3504888683099313898234421248549562023391981900603548985180440671358033140872413265815580856335529235
- 6505562434062217386358710059109166690201106008519210620615217298898708361337945882584198929728135937
- 8463864081462097321574887645854545290564856934762540928991066919225602464254529100149820094514753886
- 9058507821574990164238325826612333030842360171331330197402643659281051697460061129741349954361141507
- 7890155231616362758211607345219385511127230089600339937108736340084744585828116929172840147159292712
- 7197382253553963987645924738369326112803742994013875808176175069360473808825916076549966028549415839
- 7942913044178937413498128512994331756758244076734176951024244331173208054198122503155476482578701650
- 8657667023097852712134326096082828084722273551612798021794324863898906029251915448088529449249132385
- 7532148964128445650583365153439839435370632236908681847489163408293026856719785796604160121522883409
- 8644950300613637984752788790195341774348444672748004363482761808233991610087405112235165967744517830
- 8192167027512514354946996687266873708278491919916820259037114776598260684642971682887151964827056579
- 3794566304849953425828271002028745751425313487886988808012391825275474862935920257975002818219751009
- 9462917837851103466716091576507689424057643488232454106255171455768523557408154552326601776743209479
- 0156452054668753256510525147976320111226602675248332139550899312683263493013685192428403094260238790
- 5323204787679384881578179912075883998951182420162549243993752925029268338089129651247232814990269823
- 0237888614435318987992150720017872694765932161051852405076863648912351751671937073774216243588562940
- 6235947704312005266062569762509684217812114888298800266160440592223293316241761229087433790222878045
- 6170135772375061952160342686280629053786496887139338571256241696407932447583136988591827299927578294
- 9295751304825043666028532371402054964473380738245775558257092700759153582136224878739519806447536509
- 2283387321973789450989488122243166650106987396166729899209644205968175696192318398661917934084742578
- 6815461594145893864060229613295003812003838976745020863385578266798810656903699908156782778516378293
- 4599361943366980652979221522153666288839940268038621838784138954997920072289371169507757061724002344
- 8728986838088894693258218633782343569120740289568718856687096061273862193498732632240960659606991760
- 2005453603816589660214387177128755309837099020713308471230391797557448381005068328095118932927219123
- 1654940906640214568359874463216265575739792837308702860612939772368385814919939258415742549146335154
- 8204141285052561164143847386215794850259095916940167019222271520515924463847867368440341019760225485
- 0585962037452021034019586721608171270192646070460795992871312107480351188250682335304496981265520956
- 7080884541941022535199131368352911597222819779651917510914125749066752719879928439903727410645886716
- 9811835091012056834981767731009548469910066421703751012964027952668079262013464908265708373127308877
- 0349853816883018041591073508780278978144452516540770812748847379655033182989360261051517090092011022
- 2071001669479948606498841609925577821033292542220238243161693794552445077116612781957202899490592371
- 7876307137916207732805190043595063027837205242860716863197568319944953596546175823793319549221835571
- 4063821726217011899062436301646834987994306732489748402990062675636866393449866870295746329559276358
- 2274173904767366468327098725400825658274079373013421250157872246935933602320278802133447547116925472
- 4427882347885720204784810966824957325946506938183932899440856293295484523469547324707209576815500031
- 3628681830587359766552445629233370980039202446539708198088097516775900082945233933825387379751663668
- 4848199061917189230530293275282052288738997779857757464433066738428466834238197778223941515224363898
- 7424951701065667853026766643708546240614507510982382650823292192311694659360552162437012743002394924
- 6000846441913713453739088171054329719962592178595836890022753546934419927056354499446464846356921147
- 3954542342093035095619125962942760332314028381564195812399216843570592611552186436729390811404988429
- 9540135030458261668561511919247042480677787488387131898718967382619247397490892216965648998157671704
- 2890174496662059680086819909195664839871279960006066009833665085013172670506678073810536253324043615
- 6109801108476755494877494236585163719465279328497990577018451049091701533568613632443894879659034367
- 5903495600216642655815244439282787227173594594830789387202484734203222900521336068460531292940974975
- 9889320134905015546639978806999170087371588917595677689472706181150301964728913257678481619091938845
- 9773052888173913796341910139122828818689576669158175066401906642575911857638875482934362992117191271
- 0549773853730155778381018844418606578305924104527243196692276439468819023029366036893929143527900678
- 3454920522889611788605187540831049180891775926096257118288327086436346727818162747255714850253575093
- 5601944533705704297279316518324369707363874856092728216957075593521798282931763040398854389505725017
- 9465534119664384061183281712258058093138653669016323415504235539488039771007125070410567877416202585
- 9908400717682098941448674622992276289202550858081621731508389755388405349427919056734487660483097079
- 1086659225293101759747853825571471946452962908784519565174095947894396337685688784133633407353907274
- 3766372205280224459160534573754066183716958052421718003218602285837532259788835018804231788756894023
- 1975197437444613352597457897400554662442432497593440495376268236401505734726953980110100256582513119
- 5753891584938212512967996772536212764607639106722691844111059166671823174812066194772280535025793861
- 8987107329311431962195583590075732545492654405344858762379970486963982129062304652602371545697463982
- 1850402406160647212247386285369145422758281589303257867192003815231307030123145001620383558559708463
- 6288728568661829588038151412597924271222800658072175375995609753028168132431908826758112139786458977
- 9915670771233413006140507207378747754227133477723187913877806041160283389280732294629861094389948042
- 6877630904138282008249327643784456946668559691350972809296560296837842483190637664897589402297476523
- 3737070759029573229676410744477902854220571083318641606283483284039376713381480941530810038363462098
- 6740923141625772592601642413107683838536096774393896453881219871847087835760284657585006626430131835
- 6377598343942325631956738892178647425115391464830610561761852266148498621173529930039419626797835115
- 4324719792100999023599501018504522633621366295417587904115529116300595092988709372051119953209519197
- 6119111178565685631458237425273363487442621789437342555944388272109955258344048078153363012318172504
- 7611209858621391195038127685768422270602288085792280227899270135450268982898128670846948085869077368
- 7310488241352092533779928151782807224730432956057066223456189965692940799043010318005588385154956003
- 7101536288339329630838861183757251344292962374362569028623990818089667478407215416482153646698525111
- 8356093769538838247792682054035562293103398234617217749928761143107112618698176716510102132817484322
- 6860492899962137442648917874708005217789914597936832576908254470499557365460738332954455037605455616
- 9384629935269555982548143695227451351596350128443816576238782190283447784194348491675433220898865725
- 1072163801257455920500626138323533310017463563269678829979522312213359229559877714784256215281966009
- 5824803979607418806864814622218467350238464996209482900237216747151301761618348664856900958044527129
- 2413610774485501645401658821009469531851670949653202836855634394275525867623093990262646880252100234
- 8398810810313959156722167521036403116827698020447084682751021600765291285961812328923919989837615465
- 4015288476402389564008009111707771686632584715188865213418100963097892468142777674442490984819462072
- 0991186061783788272560602774892025077565496092241537218489819139994930435616869362159642917710952569
- 5097069900632310061085648555448231768169491892033538259383979779552017806002615045384660223480584280
- 6680800540972724248870988991814030172108374085197168446555068686682595762131761853474144377640981168
- 9746202037121131861503180534816370992805100579393958183960538157279905317356462047256467564657337523
- 2496044286662754228334119477101158614822513290574723369645459350778630281397035026933558672025420653
- 2019113645684278522271130499308474015508320553450220711151829250378245841515954238572909205590931555
- 2709371573043650713919706627072083660506535925780753879966242782962602719086367858420342617942729278
- 3872074227039258647899698885201728543732963891417985649549871231317421078111745847834714810113022006
- 6918811713906332237746391442787135013391013614654758235473132163877978594229259092873266039806170514
- 5105189352613846356490075823486329152025865510311034138140491015735161788607576439646188341017565444
- 1487477439695871259318206839292181168088355971272265371195267463913547288909010252777742990668168005
- 3198706232475569631647941994318772899895890737174479138221069168303144302108832718736937223637159824
- 8511277737658543952206649876302769812346134536976210473975484439806649685515001824287241396293002078
- 4239040770171753087400621103886981275161331107671042265609534206562796480309195917122225686050866069
- 7491958719528511720186301457223111255958058030059590451780162091560033927158135619396152450582940942
- 3830675223104876027568331931395370615940569008254671634076885187380620283937649414169522478976448274
- 1592439389073858703368311064748295916563631940759787977389368568253656567981194055582946890756209748
- 6397051586280616049553801992987901072698852640686948961003323272842034061884542128979432188689707273
- 8273627785013727011496387088466407860794265555255548566482536726238855301957008990944181411968192782
- 2521474367302375772647906302136270092943519353752024482465044502817747353031305587840428905295653616
- 6955757460304468400201302583472857878603479642966228563383909385040595996338205201313459775949549591
- 5282491367582655773708630985343103165699186477493523558769856167640256943679496508265951649361856390
- 6776134086344949610923085281595759473244692997843787506957796523406627034893439922003933142022159640
- 4753079877248547192899031903311360675387409926265876145829524546296274478253060713708610093256561091
- 0629015937032345784651094254156584863367597171410368246906821364595022593823586898034205214584241562
- 1097712594198860517418460981052180233091349159305532364021180135399382739076096018812708570022161499
- 4202352285301197851514825409266951856567653410404445485488177660629153334239355883040977080382629431
- 8944385077023904084750171040932368683097904497849323892155985002143587007713428715847006930247167663
- 1228530283911202961584833228762187312702544027509886977752418671972580398456783452867233726268194259
- 1376892237327986963699571947508280574929908016092963856488757743668130599330030106516567168643311600
- 3817843318094769824924266082639256472210856302821228584359129114203603272060182523237946293109254102
- 5124541700516649174969785017658680012863254457378725293267127745162433436012734039785930222159961775
- 1736148666793967656332219514934298376790374930825170161852849338344242504183230302641005578188318544
- 2893640874032039660088923438710023409268523884967322844566873657042343156698938113117085498055633424
- 1109039029402069878836686500964163691705281565858356477475504883191164843064598996632703398001097062
- 7143154871743704811217006209186084162459632196275818916875947150823636892761717485163145845180705435
- 6379707232789574505387584471007564558747372456716260758755826316241638301758948123727346583284264334
- 9842119906790332769950618788667306344903282783764859091686806539844039317138256966595923657348223568
- 7609504600206957367369539435373448928789454142994492422965419920687071717990820275112322883020637409
- 3324308284076802365996223074507239548291325100146231522838566996364648161993061080350119340985512877
- 3081595450154979098326100700084351632209140971316683905093077706782579384891592132099286598075166477
- 6274042102287069580316910197690665849294116301449041755241528407985584192045942224722408579545248996
- 6149963129567459931787449783413501974760024855830935569788153697313632144525114082928418128045024919
- 9295984561729788649836529671737406535027575784653418707842130980573575850987089232183386027668096878
- 6744587673937042506105294559344800003379484411869103438489819927217800456984088256180027740246971556
- 9634535370581771324966543170795487952577664211206856943407407369416521104530170777514495029664201508
- 5673418561330879369079908598888195417742618803144141748693529301286286876979634971644124217738001969
- 0974862799608946093642530679104174593571283190402983113155059303861120619275400347429960129769845672
- 8568007574786825685265588805504465028247234062122672309876509524679555116757607551897367108186648733
- 9135554730387177148259924982090655636246368887442816354759738020092703372797235756205852019488731175
- 7364152085688799839625539506720457656370866786849616739928990516639547348064688416321612696232140430
- 0430349787937658955255912612733494431374931875585152203504887715420612832321554250103695842011777060
- 5811310857406721768844739241215189067429767995284346046208510422989295590153886171777859625965902453
- 7479964480573754259033955717369017939751600199875836990940353460200600611457081297272864924415558859
- 7502427490101997527856958345334494325002578020434444086828907507743961736705538376157878638538700095
- 3573335902594668119751237389838726653687955430018415044807205276494457025799468680349949294168674710
- 4745236313650471152698278105520599626500224544073428713991949802538333850588539364994173363696431899
- 8036953211463174617170203880708663490647863404224584691355904242451402814259720943368039404264695762
- 2035197605253746691968646840574852273222141126346820073268099128359680433712489865124847133386599958
- 1557036241284311923713805206985546305223962860016932609247618752321257009959416454501759791304831585
- 2269009244055311865815319784593140513549679750197159130563640796787427438869743181215963320242453695
- 0908108540107486745322336694887417447584560189776395844902174934597104770315419794721755903104895515
- 0713033750922642894743661501146171128540489836287823217755403355815130890086002311190892831719794615
- 2733963981475579561048165472182282092824126224408661731611829531462701196213661995941087935835643209
- 3296418935628950752183416094956286605476082023394390369382944107069073784215937110084355080993495125
- 8480556142602794888117357782314109215630977556334356892809062401470430406809674541428500105312911014
- 4071931810600556195293759944098161264543744367739789284558236168065730568681889329055524837773886978
- 8338482126900338552557729632948503625724161794560688062505674398343584068858652798471320568203326801
- 5840118612253710729945929721983140398249546430136414120937944647846329673080412403157916714681071721
- 5465797595084379065463926894416436702026717333321428687279300067525680895947246054007739214366237747
- 0366937064798928068343630666235735491883630674089690534541962549218595948296352991442506812421957849
- 3976249362699766843201171783094789764534282159211054419253956738906802587429523470246253627205862445
- 2991614257874992015478349251604342385349243843410303807273770776570147437343580798451121498902138772
- 6113074931251848497128991745909500393219062568077239325454554691767350021142782515915371392247521510
- 2619575181255589919223775605562518625777871520402423564300801544064737868647177454853375685133039577
- 3050554298410274520848824563801811743244115088666941720292251387140525933292189039302348495217837323
- 5334465326269377747325041092055082762701360107626880573492834106150143211791258410932812267491152949
- 6919441405798335403820079492052726207312385833278588756477905672110416544166147076128836100062438413
- 0531050140081010798755577315225042463587242081346517078196813266473052652668700975390102354840054319
- 1030305850507328485666218923073610160979873010960457878627259697182149777459319121724208552038322309
- 7743733627260091079170854159065400695404757694645269352738958908946566093553216942712942611401893368
- 1755821233660928809368683610841295931368976682546341618079733799311434919945061976741403836739591043
- 3250837896097654632163442968447504718087753879660115946910584698569346315467151967310540189434725327
- 3510123305556649244625308979855259889634444538294144883825709671236053389198293136490349913321228421
- 9660873657571369432863633838749656941544771070613803436739395432994554889460443286211704228102975764
- 9010846130362580988520444565288925386561835543746690507579482110698111609436227278171946884422390136
- 4355582252243301409371154840113662138841082479809005429724928690877078639433835697580891344855483753
- 7677719658959365875154327502949340116362862841933060481710939239987919008842034872943437214946123970
- 1703430337079169831624576605061362459054918358805245203073129842425880187096078491816358337632141776
- 5526484660862674494777513116337460985326156771682160131478190445605770892030801852154088126888224610
- 8542068433312797584809219544443889667113144461789314741293665128198790259329194565273687344836398893
- 3899843612116806898657975674885165488863376900353752919877576930810573551739514437952727038004470490
- 0728573092526263167309907400068490459975878713209353348147998072978030685925274921540325080620629679
- 3680290963657119655454749832657557609467247229240892061371056217009793399279320665670945892120839049
- 8460475864801144552327813602814534457954387336599185402955060100187896258232064467145096398089199675
- 6614659823701412873664688038594032665222408750886052884106719799914085448700729302201722026030478638
- 0710886172631415313923748994778191781040775452555369360545903637816192863942002266964803975868226345
- 3758128535507962060646362022763410015625391199463257867883608702524372526283033010210448943262262753
- 2207366765291091628199888719161678669769861721068950090236405929175721859458476306892124704365027536
- 3283506500433461831897030508283915358506052517223442293318962943725776163152226873950058135915637995
- 0090704572007260968988373875369824262186314951213988357167356388063005629032547514519966181726778207
- 8962727991656377480299102250947244094198014686901886252851004233665906643076501671002367873518980417
- 5086476038055608827119847886391169660571257581116143322031623986195399608106448911512990383218924496
- 7115181985798502770446978518416280732953187522170737542780783674506060843688776930498302304143646891
- 3983700826939640606945628816416952916654437390847572819696146411957158066368813124848782960051923653
- 8166969144131643782128080377458223191425066537273186601585557631000545881914608634151201340660568618
- 3053991092842220972227727666420070998758231590762943912951563496720838098972472304203873278350860147
- 4116048285204200743959607793967665745457415734381437629295610953115848209200019968349222746222332034
- 9229787977209325937345893185303632200218523329226604326327773869929525440037460654804476294982724042
- 2914656005290459866149053053303411842327747134752876324177468600510351968025950489335416177387650238
- 9319108406652138046674665296435771960522892728790582333626717180104787074150978653274415552281550979
- 0153143256991410913299525027699164121847989035341734180288807859437047470037468716698072913698781051
- 9134823174319971817569732471693411240421932383237581583407505032512102423272159997622559536081716396
- 5955459215200626349383277938717450987669553428787897746644363855170650265044857714758789516639052612
- 6187671738754045938775924493697246870221984680515191826034341463515337517354398346584036650078008251
- 3376195811125396059589417188047217874636046685077559560876646149799759072572546693095018122660597563
- 3832045120846386446499477556747110488258186245181148216024173113511553376394180161986082932584828502
- 9721564124935435493701472218371490931352746516140422988403472587358480471003049710367861996903966400
- 3189027014102187471439739304796671271469674524858219615904435885750474711610835582761860115988679925
- 2327767007791348806270678430582303768443224083728557775850821627326777552157538549313918894433113709
- 7187976549309906304370838121079727316041468874104427329403072777436378288442397759487234629173289643
- 2364895042303033952547723285292251820978632941279227761069976483964461549803039103687476367007442072
- 0134868042097834465670780850085124892609127081572378968179538971471665316354179274132493745551049067
- 7088305382910466098618013354927364715788231751702295292557476729438071843235282789387873058507172169
- 8784087093608489127582967318450352330091008245008946000168372896985534781567708986066370243799181871
- 2713748359424429636432094727572711041804433460130510702217782472919884095444291559247296793147664168
- 6467990945637704603699887007961285734670508717635799267264190775864829795801509614971798643932311870
- 5902309745168343571252335874425716502513078384396781248954102878996867215558351818219767292372675088
- 2719132592890457053921699623157341359810162606343841974111595598712194855707915404099126084315344947
- 2936182597146663520940304301794361263079707780953877079498286453666763263533422068945343030626974857
- 2960188084656490209749955256673401338028230788629806818705205412520401199904304289199124015463064896
- 0755234800192945487528805570650554523548791789559874402509130074164191809399729468221035701898118676
- 7215490449502844625996837678251688727079295334993551398511723804911695566612441880493518211954231454
- 5793295497329011549763279700425725292885167605567069578881891666892649627826606842817888551356822010
- 5986486442689731040420642038862021415931334335650607977648372861174785410131819538820963263739781867
- 5015670201035161382762235549907816708176258006326519090723097311326126453948061274615763974697290381
- 9915758063074587538517334833468607608896462270121404016579559790815513643179269714327811600039509295
- 3053015664053854401446819567416891439500506012989953252062425640256999735405633568511706263129378820
- 9655763055783267561616292217039451858995939277954633373520501688984643648882073146139928560157646190
- 6088270052183882944905283501856406504336417535013934985705100635004423277553280516632501555360016855
- 8606321618016788228898592777398070823443012187649829882195076487937452732497757164679437682597865380
- 7770909315826869893218567541022181137066289150507191692405571751537297985467954771694404608728583402
- 0071682558785035025806898027943094618467258018625571769991436669256776624788825636710239050892975798
- 2489522270941846744341466441191197624863088675226917379560846434163676355883085129548653711250744903
- 7322882719925727151996600021666938956050382795190662337107102964526112535482018081623405931612383383
- 2787215450909054427198032006442253236001249893448436367593719142322778515962657684525307584855373583
- 0841651524777849983556099679145290553712899338041735803322331380434826019161910280534759866238541512
- 0389560611327005564966892813167555129799676336653554047090793988866895306857810173302660568853689560
- 2118077216225892191992431173048925224971255312282117588225282650923582291225204138370082863879599408
- 7533142292025537883192590178881759789430772711316048915678508678373881223628875585526611865733674460
- 2261173633288022556206861495846722660537793575255583609340989163829636599800730784500136994588212051
- 9742716629518893636617887245193879883914985074636701161462355909180891464878247698323775978709634559
- 3154570680055282070629464310763848171836412428448832224163453064177764928060031678970019137344145995
- 2908181300827357120244541781460612372671440187538225274535151552424500790797536879918711567102845303
- 1873265631128191873581420504230774629722540369635233574830656204856108640934273833183346343273512715
- 9264239390049127973028883783463744236046441965815843840531910829032323939150063705253777010659429219
- 0766393180810878765575969070784073173239732355063441358556746002928122819448262638691858136721604139
- 5463318790725616930815409969437600214768482366689595833864458433913973419577395445894737996499396501
- 9731801875821543881858049244015386570718876787890605894343970572439680676623307775021542477708237790
- 4412690412076066171751458329065681240190888065205921445972236876022617302455546374056207480813993774
- 6700941252221532734488417063681524435825611869662613638340292866449700660379967501793763167639180694
- 3767843386214908962356182010564061401237788509883566708473114371688891394268479485387646650984117195
- 4337028921584835072586019765152460415435606762746411781037958055110585275094244729655712945889544502
- 0468225672010620986206771821667486885596778133367304894138883039656612191893305871404778455132876728
- 0301432209927052902106177139212773759052612468035783233612231672451314301832827898769529904655069884
- 8503343483983359922741648106833596317970504048017163575811696110898875265050394554508189045782033398
- 8805527336174058906607625678876023448996558182195071306798279843747014713056703678040027908882626096
- 8751798433062161683649757733948961813441882416886502289967808162797562569227498087402088768810359436
- 9299203957265613050681288387614411959186240022364452480039479994244058253172682465135209489596658726
- 9366348840150992837598464647534240305615590651054491691242186078781176800389930760906904835067279512
- 1403003404594882920845356727163295012007112146837654494140706925962143328567874574683801853930454624
- 3136985598732642070733736209526825330022465956542110218831635555322102232583541986992666491353192963
- 1878234901491587001477499219108946501280172618658424119957747844638088817923589672365496158227535354
- 9969841302939493205679621375776989665420961561839357548510610187366314026732506199565814384095884354
- 5927104275247448553201536290028879027363715117097611575104474448575002325858148560788985128350955612
- 2124413532387816233318165611929257620999185168792428624230801705860076558534645099212221386291932006
- 2916671040534441325309940503148420160032899923191032840172480360326411739587737364393158054756344611
- 6674421959053416946656368004997460891763261639369972680056711919008111646000296009990629766649508010
- 8508005158670385819718130552317324630173528769303497898533046076126706915198052104187921693861999113
- 1368284102584387483086310227556652408281412368889519506244729375224036690315921818643234026919293237
- 6887151770807674952389899214924574176299185804334862960608936311062581001413806306012314943627930687
- 3326876877147445496118241966037173011732267211548894144715807643463644764575907033408588793793885511
- 7519467423534045394122524064570712144659046656734809242615388417502636499676403979640395064536033058
- 4671065916086949364276706384187525076396896156031731192926863383238674463351811330830743913035433722
- 7907141030795282271658841103444348578821809080282082955442812200380195266021863595246105666063149576
- 1270251582303335224947078904661050788518613260070870531252100924188140333110980343254472187535643394
- 3220404659540269285044885564614251052654795847216630572994563578827156077280214821750447870011247793
- 6570705673098921138721930592905808649783986319434663257922428340202752079620107667460469407170560953
- 5133339937607492713011765060222240784478082149383963988120054778938005665780359904311487101637277035
- 2144947284480659802102462962863743293337500534210984024858609771594603462650708927576848032018361905
- 4988522892809537682131515043558251720372860169596095876425139501382209840496122262422817340434028089
- 3997262257739330366102986819922133775791637356034537807550181325596156935501032832994238499747515243
- 3810011519501213178050138796465628491543324891943371832694701926816767596061591878897636526032086512
- 6585226424524119959018981878845082876944376766318492238487992413740076722940680731052803953540236603
- 5209984205504305921203882755655930480839116597306245017725252787907988546850842585551738383833851994
- 3442889159122536441186696441712424001358879607219106134942308330297896634430882711074670005236299743
- 2610231802714226622261875057254396907738147426352215524483240080437569669907102947264051780301516189
- 1026800926358769818418013034526647105519950731606432675504048745317728164797498493168163518881132546
- 1499640318314012084999975450565440566511483583871743810710444468199573634628689300271371764306960414
- 7832273275678903050809576914347830867035401616202818491144123200843999282131818484332288134255124888
- 6686544852708423042840098831385549010037940264844762363637536465110550081029406609915248147926317308
- 7744064207095391999167556393167624758908322427072948295443281512295290316475060981071517094932166168
- 1302220084899907335192848409001433236988693791759977923872805644858636356047169644366020445259704868
- 2215144197815912322747578772163986575276098408998893737775089374040658456115404534488982635679449628
- 6422470716132658749959558344008024494005256475311275829458245552383399388616021670954090395096229843
- 6975360579443816778281566351717190156086785010229710669378772149098891936845438672597300797493811034
- 2945358118921302910485720499673562211673336635007643262740588295448615756961432047896330591725250029
- 6559546804876536262815497576765802778755902367873481625042453157027418353906499723714308623953642833
- 3798525880936563580878758721141673582000237858579171465416121120260342725573842215518015874630577677
- 9395293678912532977700508226250081937416451141684737365725226777890874579968237345277327360629946429
- 2416996715508622928060803167877150190204161663020493507588377690661867461629647016770563441830896762
- 6618874403297051778814524340125122267941041217761721828885081597216420838479333398295669940349593790
- 7282033978008796049701378070294014570618322752960348530283719222610059395644991241509277875461366823
- 1461289469981672588247118985447614664135974724040011672646403383299904015026352712185799138187518382
- 1542253047992153889028461653792947236379633347931270846642722737043541076853791213190343311924506345
- 2076733343809168129039267109298757177148028222733070858590225913929052589740024375710216995532657613
- 3351851876638602761997003980523930527428933709016910236752074517701696404723753863828765431904302903
- 5798193044682863204543018914216075051699668512336445188313943158140465206850355976752840620968648400
- 1463298802638325495627213258275734485355830002225513318596228864977249448196664152819040702879710950
- 5677755838364707508929280129921465508984652700726965716889740132432879571982172311902810990922494210
- 6911519427044773587520266021778729973938043291783216346721288728433697903169348592455772175986332169
- 2291013129964934565694568312672848095842925093551561535868203373672201361285171957991790678887948977
- 8741557950785828040051987951437931024097351375424452291066587300786546251418820808073071926898391350
- 4925377543744202657016514854903903784915335783523919509184229410079581794626130462168818441217468062
- 2072287104625149387649178333892585359415439913580058590242985408557250448942910311306684106105252152
- 9436405894282256195150902988534967011852089646433204187932153336684750090937947458624405009441979525
- 9305808470573044171422807785657037127947580934562908770479883469716932355169605915512903946546491946
- 9769565801044772122115297178854242063014493599903647048816869639454598739566495684468008279740648593
- 9762888615420634495952047787647960222248140451871122057621282895120964242624397691077791875989150916
- 9674884969014041781462488218992047215397897010041004451916374635484937776724048963056176085749019066
- 4199208564988244166592591364114979721105709200483463562191125920531594952077285728535022771786911343
- 1709507474177404611259771054406639288875718393323600024450260387599951742135949797649404000414409398
- 6809319328642332313807310726052347022269955029753364133333637683830769912223911477705585997784287425
- 6964525973045897989161844009118754738104698043805595170062963032943375011243769165920722953015125432
- 1394054433778916278191406215516820884736345341979998879516117261028410632336985345662271408982502069
- 1286704441169025820479657650680608338935449086211438738256599464349788032327217582926945169986312673
- 5875109548455878463140759717201962433708521996779288308204170836282188671042940242600584400437735875
- 3310704188814221920924607149133502963690584664488320319474101734611287867351794220941454660418534030
- 1551815562321431657473326661079898031090681700826887321019364595617858517345054728589800787287211541
- 7256740244197902884322531541019214013509123867111032321373145940511561470672128959326381967580376907
- 2313032161582473040701388589334636633597677154707019773249548814517149561588915972704031644349512185
- 9747041467171509731132947384808502107073004895212374842154038998185951322490144185729193570943752415
- 9215545692963115014493847033948930762435538342354395078579177058758873286872636137723131795763188119
- 1749399736458295599559616847144784415189854307741455943009162727770640067845262221886063381067248472
- 6902440264267413390721935300584244062259464253948368565478450534349052967430589748649564389293525069
- 6872825573073886534797956973796373941631251221135723661242014026468319875234913753259196515806193872
- 6661939160510493592652713216922096224639699245339494168148769759450227569316017372978252259321139227
- 9726446990787079721129270100728931641413289755405112986071300454244972199825592301733559399196662588
- 6284890280161029774147281472179960743046863683943583762096637059217800358151699129476731548326243472
- 2529800380095958755554513635248529233660366613345215784920268506151949203452902146178514203242331042
- 2848635208968797421845400387349417283201176273782264796397846777136587351119302070722256003750749407
- 8103946338951998454416631432297316080844049828135430303833631635314540529914831642560125106820856569
- 0016030297291658467891832210586994891004078010769247782572806721865866449357592377066019997260659525
- 5433273364250389479833660143199307308480934516150880480764636667529086671693620624928739814887990436
- 5333871639691167273697027312653742840860973486972932552788541993019041684282321395857966024873754065
- 4392608495318634134694686789235833606803394455761856487011325964277558202631925680997158944893454073
- 5451669323844921499118554933828244577076688230525469796128224404159966892371592950939237321195478945
- 0740806774448900380624434575224611555723894226838593051527754976545431808349023872919846748693162608
- 8717921512482924761589351414914158904235105073534967969487491863344304793625203651055672156988823952
- 0349805230153122385212513261664494737046124818609901439565463727101755621611221104722479265060881879
- 2187856456477020191870817409827426388517851782319529341904819315715640400178260080474641545364258579
- 6882213147120219506870737039312153332239429647101433881763991811507421555422604821990245008205203155
- 1588031076765688121985750384512044736027969238848943985040776693919191780385131179046372645787280056
- 6499501595762530276734247490355778730320694669762067937109531408787466090719090054787150227573861562
- 2840311999793601481740181407268559346424708186513726761279734277641240894070241225057591283320448767
- 5083824823354900622431962572928264805660096775092853257303888341824250441019443837490829289077044151
- 8151343279012631862709344102805833319718393808451124787757790528799614248096853758097666763701569484
- 3487431747574899146388916335043383627398851102955909972689955904715112917945559126983594293067385743
- 0486989898559443261989642534349217117176194986881381153736011925283763481221877710943925932205737095
- 6269816464526459305254130817680476849179967094590975627099457464166873129985177713155886207655433151
- 0263023608492235320184002464426949822200938856198141742352942110120448887865176204772310072355773711
- 7569645402677378698782932384884658685482430725132245997181951763782065167701734963907291197323152110
- 4508388963690034363456497713884180568029841405323097836878788733235745843716778596231931182129965442
- 6422746033116562189958073857091407481709077707206012582553725598818255400017096790909741338551791505
- 0346241362796294337527980392121612449422857348055409299617422186755267066387154019716495925804198284
- 5727233943587273849129806250522990823041441796420186323933597564085626472114098710275684232847105442
- 0476927372279586934325516237287061306248948317683005950316273539272221555960371912609270563209001688
- 4464223997459907628360386145156011467908671952274422534153735630436368076582092944816815756244075835
- 4209445041481836940072478719937160807471437048052724122720576200148265567384258527615204225756167756
- 6344890835515904034755970552781149851302508741216556160585427292302899331654735499079156121786647178
- 1343392824994159050140923632016984086805996772364631180032309172314490659601839443357324679947213636
- 6714309332268725922769959786634219848604764038331215159824633481575389136213747050626776094939156543
- 4449665030715756019052561493434123986500863349768772582014261603587642188657530917405182417491784121
- 5303222383004188066393854558891787620068788140487669276059762638850841876717239068821513753446907420
- 5279687593862965749865441776294251870300911496135284438920514500715511087309466495949907089979305234
- 0129573493866881785927244230815215906606499607550272376081272387058512137274552888617735445449593851
- 5895687751951802687798564825202662409444861882867270542074750435367998458468021181612451191791640838
- 8220977886418275681058507677565728648482836037024932871581980604355587998037575747633172000054495984
- 9872516688565706303352876068093081590181410593721378560788103151292531750411050960975165425371030855
- 1748548992807927921650826702477524637499837850472341148722403887877968562165891841573565939687030319
- 3507502981382895299683035730430607120754662998058479510773229041914306816287029509007188141342145828
- 4156116327645897977943185244670333572201518300806773009843428145985559436573897199032628610071674691
- 1509026594642792375562493742351217445080312134998741021050402625411576311412306403373840230248447393
- 6132777143177832648722787200003132437991158454107320083254717655335778841973881119878308116128253343
- 5001379109732645804567535626928483455102531756976137831443682524778543069370631432550964076224942709
- 6972762106167981630745864773136210291691319019350539173633877209593077288021138495225308523356420091
- 4758211321508141634559373276638164620996415041814279261478485611225096974418073994012186495761708774
- 2985390839419901188858773363731131301710135777903347562044395262607677976568538504151780028622026017
- 3983153578949045444271657055964920522231883544742831119346960371194121860939647436968352163008411309
- 2122137612361931555091187753464456042937379215166896202425471680377818274638590796820735640934299433
- 4271792080288752211254331790114149116004796389603318772204714551925930589486933504992233576520706393
- 3665786108085920057759573577060563469345760388491080506695516093810694366212875882733161322864831431
- 4717672115704619235614650037740538721762741113660178235855845173100298207789993646817768759805771969
- 0442932656414928889506161743273954534823316663997917484984027478354053591200222609439905312070766019
- 6672743214667313250599196153749191206109264878195377790614253518922346613960953196062526178425715869
- 9243782660916171746497163472047738961314867194294824902919894191675830888923397311741555417268094753
- 3102737797997098175650450547360227678621069754045059261438837781516179253790106064022916738026962573
- 4343046453004211042527662303055207247573930679272639371318872288012695855490424866322830702277401555
- 2803422055731726091592927513287204433777236381546602242627227955242640479069128534664743956703901536
- 6644825118623402780402537808866611353566441069137697238823654053705720326485133071180018862177768059
- 7953218065436753210222504280004399406185181288953614073372395066311517070005713863153021329368553801
- 8489869696302851089301202179506470724877503209994836756871724700290558145698405144674694507188717376
- 3680287347355619685317530756612015693057034430987614972306895286644415640748345880898652566166437972
- 0289586844220392181943171512756411177614756371405936864000103588026389125969238170622763716762874806
- 2838160227594105114626922888091294330277664959472497384473093376327460037108435907859976671800558687
- 0287301832296672925665119592610059415810036508929062603999789107646931019522717446451994436169991555
- 6415641215108714382080886807522978508148022862341353184392056663971152460890481318445192314929106328
- 1540279224893782282515457682716245961176395668864617423953715865744626643996155478905163732521825783
- 3325356445898929059519260586597986713448274478262666789841919627360593520221496681570436556904167082
- 5752744588175728116095614818572243695464750508302844307531707792355713293487611783908130291059918355
- 2262237468671157570593774909379757938195247331632266235982695699804734334402616879654751304293461624
- 2661346074732526957031148814696916429336907194815454817908292910720694297318759719731015426199335646
- 1532836182287015155903310706146530421700668825337970132344950607141683526860988131227220540903094664
- 6066185857999914153978144847741564082258903540644906463510615433719400401386160350714559736014278623
- 4514865734796217978467570218989951333364438192919053008577399504523493495718968461271137688957597933
- 2349533208953814539846770285124109139999624094286153561549520156418899621259300512644209686597252899
- 4184350366818804807529105972336008365482357019198685509260350048765737882951629237418327132367686584
- 9464000596709506778345361003674425949188581955959269025123931107259512121156338241589606737480071832
- 4687784130780969382414829151895604275501754206517442088134014543607071355602676349959757596004103616
- 0961213773621820223563980101455924936015689714897933365854991863497304103495007905509710373294892197
- 6405886995320189664933508204310048852305942984868017855565645389715296386871398239389278862831305388
- 9870441633874853236655056254302382861317683147439934461560931076538494758464893162151583588989339195
- 6732944334790390909645002015254529742236093348737748570906018648070516991257559332518203044120573389
- 1169249497937444418172101800486952748158248607577122172413829852529767035268850421330346370320590111
- 2769270842312247374039903446761895700102591785896614704561188690554318000135741145453848091623845601
- 9398214576980154036744730933242141647275552190877396917417373506414595184607851240181377454588376298
- 5179066094251799695036587235132911540694118558004057561078043579191051543895293017860705688578117217
- 4213915509532072119708984152215425316479193046160498117600999404341319099118921551365122611550181311
- 0735194067489641860940284869283055022119924343866309661229983761658981274730669004071331315325819303
- 2028149674557028927119805023083429490724610549109579955078936602634698465662818805549010438789895744
- 0931415296414337769026050643640983268217633628709882627239743023005506385167528922648375095088613721
- 9833353460698489068556859024446788863364396043781823649316075069795253661777044807862852104682093268
- 2668289722071591098008197780192649525383047246360795893917370036932896635802205065980285338702996809
- 2228675427129133869994026633577360863754047202114992733399559638671394141599506355503816227131799287
- 6143298924595866321022805072720176632829028139513624639259879408411977424214784974887928534813292261
- 7580429695360568496416333588361246477604717663033985377267173732323243519297973342376460670072590569
- 7847782259010224718618495510870041401552763492243058506497917469994122470166700310104432762653099301
- 5284206842468595235910530969681058431185510376080853681033317095349081348831311722359377438741462183
- 9265017156090327940281899356126944963967143320782904731916666780851825519771728800627735453991592789
- 0340107862889636611570807579263712515753212564345879767582279860562178539046344387826022476983164473
- 0911677313769865439441397481344800381829810375495058853983542914632275329122606239178293199621398691
- 8817711118424419627718789923057350447245775383119433851793221285766035212168779011404776589767784356
- 9635136532915149309638039104754501169967587802799979553895585500590455332979356370264077033348112055
- 9679109660880465445819911756967335381794020297742084467140554762538001665796195719912620080781668202
- 8859158624857236155994016255477707914111600676407826080771078947343728991156761306850732249631591231
- 6341975884627647288192023676271637519476695332542049089161024916483733496591727080014711527101290890
- 2961211040472462065622820963283626670888972846484919450548524147558133923773626921276628090107039603
- 2994626272509471411769121429133539751301514317746716858402905968622217080111036660714630206206422073
- 9673674027544451115318680357371197061263214355234685554438245653255194962230924422262761618107635327
- 1218486711038748633241670789046885223329211115019790098723766740155479167534474858911628126868673604
- 2229943560768269783317351763941137568187311853109391473316134714642957480258866120984333362644789232
- 7799217189381104902575089833295752311385116384118101924499132930087784725362736588016792732391195667
- 7377346029231167147252754387732395409644074174493088103356901689944732650629356812407468591689254650
- 9211091423164339664349653553999052260304711487117501951086036214378879284074498252703324251691779534
- 3239338053753415428633449200572757968191874218427218858846662660281339159122650870329556297431210060
- 8476462382406120209740885851097134502445345626967484521749379519983660135959959804421055339305799463
- 5412156592603739545481307090026816164735807530907005794698595121857669282043359313336580210439358016
- 1079082794266448782035280157498477771875366638868714692849223359797020185921637526370647072392328071
- 1774975523653624170626315463270059026630402473980453353020409393130497397130791718151488632385160351
- 4091871517272596320603977518189877379429833548962149298830651687972617323342951860291979123542091466
- 1761858081206578509755405181262454785358714234987228245076280218555416439373557287341317707953318264
- 1069580231812678272926217247904786733132302602879014764854335809993244372349188499585994862583067600
- 0122047336344668680030217744283089567321206573109092985212685308293535203316260961238719270474910316
- 9411516483884747974567712343355744298126844614327533710603770238115873068862889693941323630060605042
- 8996520045106037486769613649172511721417104539723698376574825092862531991761037960505070047452751987
- 0692438307972081336510745808625339870452950365773947943751943255366001421055646414822436061646770791
- 7165851176561085923563460948549764477962116551131870096990291407315148390390899181591857833265027795
- 3957841825197056152467518107456330457082959442889150666715929760412803354745155100439949339911357400
- 3681082145201003716633376952121337532395906445150652333790747504285781596952756961817847042381784203
- 1599241711215728175313825528990831722270803193340184997462466150686413717867935948059327285196433573
- 6880274143158690076520872345466373639831869120209656207541348874115504351794570520219208662862157046
- 5012959513127937440724676204192266556744533344472968171487354493873384801665428264237833848317565438
- 3336174408732187921997143097193907561528997991933481684566486989431576014380286263353313618572379316
- 7236606367549438005252967139974035099407121933737585712045559496028444564046130603362226362162934122
- 4576151165419387916848132809624695244456954621250879118935398322196378999498705755174877188610510452
- 5870912001550271811121400833033945999772865870452341916673040685570047172861172633588496827107174500
- 3538903363106665809112216112279535205973563154238786279221174002792992766027230910087889644867197751
- 0644852854236760680678328702716021491220890738359867916779079846546847654432886332754592689976471361
- 1821919363719709430918976095893307419509153578998159456268174031091186213611238703266328745925123801
- 7221859237596420397178011973301354548630311562876453973330103535199368908917165821184472025394047093
- 1783306012396416727093121636937919332391842597730527614792293021230131636529561376233305284546377449
- 6678385572416305553286105327552078438940442472330870014940075648539493897085636662472351155496842637
- 0742241985340721884331711808624785109999817623225805812020490727023675155996038558466728397347325959
- 6127104496948996928070408723556135501883486098273344942119279511596389142170133713625405959158400657
- 6371033621859435409072149507971926424741687886613509620131303193981656443184231910367414205125568633
- 2809855207709323995574220458372892438309481108423300876415366308472416897637519419399848086392769531
- 7901643727802977688806162490841933764103645096126040651273694733432136475166867454187542353324904525
- 1400126199102550494220608990865348912185197785208035382979351647361636394852849756284971488562703642
- 5437615253034856791421813834154676563036293594327156888851139645341755011355523422660951773817818038
- 9386443090830539927386531988392370825144349766957951254066405582132495347608244642379595204674037169
- 1040228650601644011882128168872783923427369292606206409640919596145904314517234161617915107061776717
- 4151129700974362635716917980979131076075544400727482316585363917076912591900555112850732808167705134
- 7490741450119502481084276777357730810360845003755565026865827089490664096114629969042922698380843496
- 8138914924798862248716712812408926279700650937412914280120188192206542159389736338193225912707130384
- 8942162931911004907149225362821862035617644685446995943076419072713387818263384790269051413488524088
- 3415970409316671764584851653904600109634729323170245268608078649180077024542605338592009166331507927
- 7873248325901604421715668749405791518967711591318927501780445182499374387432993291435543746809468340
- 2608346425268170735136026784411711754768030257828432741271295550926710857402304746960026445711893018
- 0581121892575725002417910664730201129469375495333839271076783815855808875670613299964991589394990408
- 7497782355039210513630164671634086226936539403456769518652775268560312868088156891699160460136793560
- 0028878486501738703611861366168233700637624901718703548391653008880657523737679906815547888893864623
- 3804336788144738626369751444635331513645033652509877954130939941467601122228501278273455755159561984
- 4872672888621691139127864441826501071593433318160552880980931375760219544842366891814048761296983574
- 0368011755189133005722699475919228724396947107244977040473296751338485372898919851448791269339956272
- 7628630157178270573552384501936652886942503015712886490989930558977451480649740071081376020676606100
- 2833539832072435945672059494512168440253056141611504723767968712526931563193098160823297950425898166
- 7480087815264867736414493569584287953879511112090041388243506999888209156555403289250228805141696787
- 9299266268622246705254906674953625013269700318245101140735192981527091168287631615254533623132422680
- 4522288961497091739711353525544012360861881545414708532046722994693907148818860332682826172282696478
- 5169840975561328091090492994205890209975868027011829714381130616650165606940509417447084136593172946
- 0368323148867837834015846665262779381103471856527342901126469689951352204381388359254084508757429340
- 4830480525702636746819999711139249943082380948147319257601152853824735720831491052716081699222814186
- 7532991179552447748792024698247835770179058176843376667776890217764906219369958965467659969428721801
- 0978136921367446220974783004092718190513763561232548612721452226168051802932568183109314139665924531
- 0344236884339706735287266383000454195146442303262301907189759856124702358650054207598252489819907503
- 1653803249502601693723058314817314752430435942498914879189062802634091227267353344853777985327688970
- 4761672615852883514060352527088519929217133070578576387493937455594009676153752177828011626903772652
- 8989620344126159881063216825320644381640612917117212009556747383916722296235557461243901559905448832
- 2626441625687126870485003449211415757614315487883822624493825719072052822435654030668643394952786639
- 1978261966212889029317080915069335476093630695038779648380650097087712584207442114997169855615899897
- 4787651375057853627245365217806628977750732715703498547747167890295666395835111199772543088210830083
- 8719703001636037548232031811034519634199719570801626375425606969661834362972690706622306143131863618
- 1161133168418495161296479946354081551662886453122010561796238101443846201413252468510264137934116621
- 6666044355543396726083900293342498560592304772543016048596898781615324252348894799274995680405750878
- 5961584656399688277050582480803752624440992284265581071965313962147422223415350770031361866522902424
- 2427339752232201197300895968910498540544742769756380596262269087884764367655193756819519963044228090
- 2471965977981411229976113099668948406547030430616154284052898460555610527743167094547976542569994432
- 5615151270411776840247262990518468739384403174909227786713746504877565400352618233613582209691595165
- 3100302994702612137983269955154794300452825040411617899229947911176412173992693774165820202835024261
- 1557953577101928695026460543592411800668078233417498334223525119403957869035786809979573555664634818
- 4109235356638053216250587339612730165179209152696307741603539343614876508656958944166875931028197227
- 0842130060698903276812481364340882914506935350078426900283389692890036766306519621256911370825149526
- 4130730020572342600614347947841846620763374247401965234906393029662233773082064022870408809540394489
- 2602375593027578381867271119555903626438180369441026989560997022402685189290570563411576345663453530
- 9178364491270655146521452745160957092696019819351482504230830933240208569382325737324655619783805079
- 8236783914896441321211903253837193051261214351205434672138024917208445724067560783891183614420617219
- 6093241887871539065311934562423143050595975813896800145932726803699031531485898178421841408627035413
- 2340571406372423344162305201146005372433545440858047849152738356053700832984194419408785772894289429
- 8905564111848901279881742427130941732502246499897761849958444824319633387713606417005057588112062601
- 8903546125859345154561817568409731473384201495189375815899601208752575627603329500301183188095642910
- 8679299364914087426322667213868491522412990329146293202682373490956625790320642804533851675572566335
- 9643282983690679715448949144144284457366131214716525772928322838722519122781850333184575375231181388
- 9104687301120253329343303322817674447909206656325018838874991783124527795687803251857087877108213218
- 1754229913702999034634082431982200181814301695015867564772318455173516019353974118068162554986334692
- 9742793638368312286209015008476329602715420554092347219774875557737277125358437929973367550413539009
- 6260754601770478320092090000437030477206239693112361996923069451921228075128062610903396080855119939
- 3625766456058454748929845661051643776323020476293348833136645533457348047357156744499773471782198157
- 3926294356614853325635257380075373424585696273226443292539121854835008471872615376119359921175544946
- 8751722095340217149673323008543031277343008442170392235658052374699781195238474449333837385774851142
- 7462252203934675721232785066105269132797730634628873726222419584671667202215168082910005267022364151
- 2652274077600461979496685044241492903303752615324755653009315314557741560785488843720415714060087651
- 2807613311400021517609289824898629450626479863972781208733447929847854531512329334051406847255746928
- 4862631503547709257191442014221858878025727912833117798221233680779311687586547771399946239543986001
- 7821714044511587793376458252175919910881923830051663310282837236134127214072246237953912933883641879
- 3155329932894879874861538613915230746891741006626186077722679134871363221475165685084419917806948619
- 5460193408937081923214192638277533759194570326450236304347568717345295839955367097394731137451394332
- 8197791122226939725459124938379823126607096382225967019008381453286290461060658685632097801508542233
- 4848110590617385229862052817896049500732570427222020393613638247958310354325985507262140340985962778
- 6017216895598750303288281768040946852093886403363652364944285765333810979533420258752306609947377791
- 7483409964056208373304316767108759298266668435467009599704858953748415115221450224994544152838657802
- 9285301765856291013881441726693837902070500341910121386791346354652287481407153382029019192351467212
- 6838275100017394805179223575910310629411782671583818637819546488431229736302075907294961313226423551
- 0849102649984741887018127403987203067935831231548287878038686720763454984951991134450991244247310505
- 2272527668320660348538056734851263693194665299251629026264658941634139609150972187236402755002697010
- 8838683249414212571204886964565829636160986536859883788390280207060702963996208929169242011756462921
- 2717841443866094448415307132753827418051247560470084561419607860495448592558130716152717681871096104
- 1702864624451063869927990313298023938322923078600246111212562537492992069623605549739779337090550915
- 0615995807462647693070614654733657295388010846593077370926439327096173358979875513329851735335805761
- 9820375607173964951210260568242153539432206578780654333681668379183925431029629978625583138150842902
- 3460414642850633182078026674085750429654935395449486518527564708814351323195973497899171415169373256
- 8833893316283389645184887032263989305568945183919124308293251565402367538500430945522752298621936349
- 9930799560689684466187459894748823413664085188532193673114375894635657021422230371741481201272628291
- 0573318578392273347952606800413122404444690695700343265791095617342284655138302877708170928004370327
- 5264455762009029489870172647182289327617882346799595389668011402866870526336706006304261299460849499
- 5638275599060264777652197025375830641181461287543876098578289963422105950225341504398260961876098352
- 1652316543316977214412517700380390215981379748913202929277554387117033911632248075246572497296231247
- 6509351794356748381143152864133302908912377714661246904486455116492679934634155621188228175642302405
- 1694895444281683141404904380578860590107370067182984993650407494702785573862720327108426027326956900
- 6412015558094691371012984255290544957645064575600374031494587908210547355911363990672780648145919170
- 6433870697147736652477844338630255698388102589879309501971312840708918719696749394002657194057221592
- 9586883457866981031818359493810271931161525153017409040319451723832245963305267862642100074573633679
- 7264614352971498884605529190782295721345692646383479217594057805130367348879544947334464560679667691
- 2782679904942003628806990026035221665252664880972246721212946167822822474271783410535858490938180843
- 8207696712262215564925244641011600663839118183087308563542267215017218891349111443407423167201858015
- 4409683941721845529247030666331743969920320999137230793920870633268149502702418363237393557565948355
- 8643427585271530364753467460118162312180861113799324835451482289863062536933279374737264046931267375
- 6534019973009076142621228650115856894482080371428361204858316174750390771287604650336123613522431214
- 2049114096204585829225543574900902717114310056202779664273282036840883514218997367661285154174170155
- 0559669295433553384988687023249020610644580716922863343391855394434659741831033154532910259130360646
- 2266687977945573490454674882327531737599593723227310371044521133115338289304247739724195727440116541
- 8484315564894048921358055708557627558495534889191385643791638342408939602209788019587504761416457873
- 3843443198087351575166749682003791537961029734944321094760732700463633436612590711792603829657765048
- 9833996820052846423420685449469930387124964664248581160442000466693398574168555172983698292635849104
- 4717933844683250433844717587252699366862337570798586379951176474378774221029593262173881717992112564
- 9607665490503647530112846059719986422397278433919677740389582319175573259941937900854928259806607678
- 9498548433335533052044297814686422621546390705667804793891317765192204993576166388219632235722413875
- 8048818728755477834305533714162429159181440724910183373607258613130585839379636913731605046386537876
- 1619976568352789603916541221197123163706463843508750588046575531967200804810632083118215379561380098
- 3535595260936370006453170806442028883772669082680094247506157736530695369994647344426417990880723658
- 5691623899636517578076237318613662803000677595254569830359350209310340106654882387605906309667152580
- 3190270180565107741796599641778895066406027884717068077927555703510222371473067950065096075380534263
- 9820261540712721378560322743288616802417338945979050503213797484661490309530174023009549575261795889
- 6983609703142914084804583842017705933308727898829210653986085497841770226800199431723125607279669350
- 9378461673808145347108132937634521964744163193311786906499824823727616205615024443944723233791069608
- 3968856032674365944761324366862391058343526372587026552727235468109736136753799885434022478297321958
- 6473847079849851417285386752779230658409174320605010991022389298189386457216041689492340208559404805
- 9798887199075389944836245759181795872647854824368717842805118165701035999489616756458144117743599941
- 5574156405419809407770607818178732780883923516652729811729470451824894886940253978497040401257850170
- 8525229480032644855398293395410250493410544461435613045371236961682202427087546803225777224676453869
- 0691735846329099659789270857241360685294722841899888111976949257775673473149204541882499353860754485
- 3832734931602494458301840052011005971211224881899260140903390584301410505598071884441547633560933892
- 9558270335638391892072441156624136346793755416738908930918686080312637892309129166075500989808404308
- 7717386876849306238533350915041060003830601639488536879210612389410574394034606240163718548425217716
- 7545163976002550502264396115259942943086934986907462978375997016129503084380366066005892265852930563
- 7886695846678487572600253291839307185472610120143531812300826282453907565263848166284306712414091535
- 3230173735777223170545453318573303986361162909280796514000762580295868325211303562521349985400678329
- 0579810026266376780517206247540163537025216821873552872040199635961887360693473067284096081288649892
- 2816545218524083282791281849386363527220300859827544599898999583511157436878788812704855717381485740
- 3078036294204859420644334157901693839596815335852775087815743971924322779883170605463400533096961159
- 9543732039412995517719740924937281938691042471916807457558054131728168336553796527595104025829376600
- 6937948476305024368669308749861291151557902990891475114714361655097781089168915938904322861163098089
- 6160154365423970713173398762556138393349278906057471453816915692648820151026214721832503409165624542
- 9353117328396837417555069788772460439855626108533737402877099728804761149157785765104752908911381780
- 6546922207217132541594679780555957405449532558779284323247504820257296107211930542720344543111901843
- 2651599832951192425499568866292451206155443548518778433760228457318552553020385780679964233347394328
- 3255079768143174935290365355235708336227295402976036224596787022467961087290065369158110329772411271
- 9687184631712015310872022829121678513683286828899841006308305969973295124018343792808075866877889849
- 6043772754027589522929366853922675139928237161596447373298270175090837568027446669159111149779944667
- 1135691088924379199309424721308073081984262593144347965790856700825628858836114463307069019106360685
- 9951853870417106238568043241122994069976976521718948993497188045038643217598286433134023273173503448
- 7552793783486413104199496595525770669045671843550215620189672793973426821625686085922488113166647341
- 4298910138757127570483051459436636099246610627201124409872399971042075654391506863102013575984601467
- 3026511990342986506396760006966879582828924339782590587485678262692633034683723321240661577602951565
- 3722610682290383661336834150499989593428093201865424703607359076560816219599759343820172461807695817
- 8347221271503991239373308059816434946231367174959999463042117638181478301910213344735692656258805710
- 1644687984556617203758742814909984339304652393122000356442486502802002210387238150855436080610859538
- 1742785324654979231101510181266741384662946267400340729092430677564917857934277516529509846000986282
- 1986519350148631413113382340818641810195988872295935856034372242367239601514627896565485335331740074
- 1984242601360667355298407544025731777149540219275487625663663209795134838923239847309342827299390954
- 9226286852582803762571040814041407092153377982471219334648252071838785374450072385259360567659576220
- 4021945192479291241307585464859181278455595125339485377327439546532520168622505372850013045372400046
- 4744479074597825102944479047597268994937537469280893311554355051420516123636834410073498429947070865
- 3487282616826119499544459888850359607914367111963913932091120095413351288550899249339285379476656164
- 1592545275885347906803485930421014317785771172451137418462432155337224056541214942322346734100328640
- 9237227571473170380930584666114105286653492921570438437193875825489184989446589748921123980435592536
- 4919086589066917390808867500913233054266548207715736402520816248301658987303608659808379615767364117
- 7362734669761566653921348293456423991292807859979878815204292215190914169078549736187251693099991322
- 7000674997233515576579514366474702374876614964404926134860829976097836260492782317388949792246852097
- 7599508049882697239249576598722306469511876779916054956726996908515258226529522738588543930217342747
- 5574391874411376633994128594831234384848812794576013671006676165974395896325545306708168429451211409
- 1221200910866698998915001020556924848523722554213107166139198282765742981882917518337208417523869676
- 8280591023151992531280144537722164743682595086088863644346720804079957456104290101965608808393098287
- 1606160491216360458690862228973756455741357430715910893672423316644773328296824188314921716494972514
- 0119493690567095296152704329196175641010185140596083954221011253004320324477290450956867286869283797
- 8994453347325407832005428354880451308874136319369558168287460790465669459004074428841873812325676996
- 7164692679986955886052080637298383211238624681202881704348155814062949883062634593344998884038652605
- 7374223073857866400023774153128859094551257535393369408694442939407522182847100107766580951275670201
- 4775408298259436553900777906180300371040301910921852932847824116551890922870290124041600452149317093
- 5775360816342085655233201443845388958342206841713882399532270635638724261133021723608875319692482011
- 7906522275084815465360634684320835251951083321606843173343658468059130157408787018229598765822830020
- 4252835566932045019819881714582611715984000117232324846223680233784983905719584208339418833025000410
- 0260037883422114836730547496096779242970449998379947904405434971089626589676691300284990960386063046
- 2400933379790920357551625516664005711218771723903001503960954051845816999386430449804010399161286593
- 4744955827606683482489093373386292669896469705317415608922966624289143819273723567260303050110341597
- 0150390759411599156179251165622892441767557720263927108978526059947131533570045904830124535860224570
- 7716058212332185295875822030519372890200177343206194287342147523788608300702997965315568103011287992
- 5893918338779647006752027036887724058406643691909028743876338820971458010174951013464584028127801131
- 6813989780650900740767464220963899804533262076514960825977452275842390413450268461861681457953371759
- 4622683030636661453659920280300843252851498178817712725738675355028513383679230567432436869620272756
- 9049569472142242467988436041192263169155678827648422239119627403671459897414454318006168862933763562
- 3975254816109201806289442065086508865174388445174402936157089106653051819134408352417385390895294733
- 1269090022881476173592405472755741008722118602480706552734785464670810033252880494872818846476645138
- 7194846470027398366396786911087224906894452544993013613598230210096649662658249790741793302604479616
- 4678961217630473547094105905476778743627698111464819594676539533132602160451880568520123818538359935
- 2509055867304816958939312668888710724516375807869185298046443759849390149864088672912156151469350544
- 6800392775377162800284446170887283461332016027846935141710371898135928565444047388935336434225299535
- 6306714864357582266150708472242121395749058812364726080795665391821078069759191962729961376825052719
- 0168013501825936503904314892374222182997294359105047665101984354967715836390356050902744094547376200
- 0866255189537989739869552494420945283689372916225586445881857232200509734021124202427013381380975063
- 8707368786224134616266076141865890367575672804946851392949246947497670448286278503799394283278791220
- 3329713975438436447227794195248300533133083265941268165481431836724185190716453711839456188537671861
- 1463451009876355610396882403469322743163868563893669207826287866646316230586562320803446703322414896
- 5844290862011917977518360789811784708762629615319400347815464050634565985845395933678392047177816196
- 1151978159915334832397561116212221045289683087138354599880658578013548593749042639560201729578681154
- 9407988789989527859449531291247582481713710885909691407061933036180030332389191321684024237117855941
- 4793817512261537355292820484620119087835578241076795898728264838018836306051625874581323807170212707
- 0311601599319566532110559086844637230112193935288299328435695606597198930148418941924696514195047131
- 0036209138468408714367868832381248718738058221779691668726770528694917232969297574129371576503104861
- 4982649963942542515355227892655817659328122813519904998628338917695098649870938852865224641624149800
- 9133604809416167206933424250017253335902412245206966274283806079157097461019323432744228427903009219
- 7167819796597905954912721055386447240760083100058808181907244787034365745427947504666021168615328207
- 9367042283157677410978706565288995809215120790091062488938646517486033663048808838585836547541959063
- 5290169607959866719791951547267539998847762188847851073660556792237455158009612734637037295470996414
- 4895440357070050979597124970791498940575042016503073921008375739413281657808571980285113042479613451
- 4504277763666054870573901649799638800674927633569990174214247086042763368701538895425544860519661560
- 1145707431101267836061897633765408595584416739699898991714686664840902419001493111173462062958230778
- 7057948676463855675872109951364683099777160945465572016812285393776737409942830395155749453169206582
- 0371452045827753578337982711615753554754759598809028882500151326903062183753558815228008049946219926
- 3139514759007671504441201028640422323467572146522255433374645407695544296373365183294408114816553112
- 3178885685344936256510923382232508875197006402178562624050439203931155127424198127866118045752037903
- 1352263821500210772130502406624183002862477655911114130894749764170442763287774736669514152962797298
- 4736229019636223154363191418417996968962803592775061551398755785367266353781400817153183187933147980
- 3166307354183824985477461434758212203503303949134626725084373973133134613497187865221548479521132806
- 5589745100203248729792239256892753749027042598668561490405375284504662614426425991229576994984595616
- 8866129342741521686045369508582771055380684247063968607781328993106285511287995439433670099191520888
- 6144555645744227925330947510327863999828608664778246977669364695968209330630483252302728616288409185
- 4021075857505952335491745175635055894316749129117086207384696004878978263910905625739599487492495979
- 0110901916146590802074849626393582792650583647676708383011968855505051861579809721852980782027546790
- 7773528459488554864209571848095773550264183796622010560620176724101647596182317714441988100961027947
- 7760819625624682085457499375939175577255504390164427090909940333682021018189188094314468725119448839
- 7607261064289476377050838168092847287045308547161072786663101220366887582906462496532944215040426089
- 6079559602848376811583310656398188715410222918563637554680861467680606261759125475132626589633416570
- 6265117268170549301094065863026692204229894830237644323671421946364900320018910295105537319742039399
- 3038094287078665529147692881385645878149664779808233148266402166554846713406240185971412175424409787
- 1277182877853413438373825809953777455566863903097000614928407730247009172019952462062453919858592371
- 3450742399985171822495428895132343503182334483788319295955334879010992117189922536529429365336258259
- 5390946552963581374497293699746511875338537487094217708081745701742251604090438846121574124452850202
- 3798390369991138969673477880497042088863931284389157986861499535720637694821492093062812513122808049
- 9666262553224283839917352025667452522990840994632586468341113042084589880324142878241486082621057749
- 4753300377060215168255421685888255205289137193877249869082025393362940473047505009970440709469358919
- 6990053347830446358119649104831638160680743239747518873774504853932080118920921762003254128590019212
- 8507800878010809612186997215672787878360378342850502233591047386100379003368195821534795312420332192
- 3791186979738109328501036782788060812745282883103918315704414803727152691119589138273502062661678813
- 6738930058943498719262754217586783775861692911564196954978050050271744148214225317716645648976255943
- 7582676430949126055292857753556527311492956087911082159619401757024920446262077946805377695544163790
- 2384442862707600133588293722905895613531099244879237739700126380103906210362971005400902332662052868
- 5512923889365400766396639839257245082449689892624599243943845087655789090281898568343345109961963840
- 9116437670596054841952535056878723052067916205797398008695875004656119615450401629767770096547018528
- 4334977644679496028037224229231209258155238064515073175826397848971659561076294495873794568519845906
- 0936913497322702428238293584834762009727957320397390824404902652459373962572954491177296085988591097
- 9831916191923715574314777305613275865030186712879223339994092210626790946258508116928279669238172379
- 8551276299352386088317714689728571559104796911352900853677375489955124718689039574466000484795401447
- 8028822320824256701845114754583859463997760412123218294512072077908176823315161845542195987497445589
- 0151199270623605189634073539348756409531560340706935958257608166769558749209824048066652756245519232
- 2003251452941755396468271902352195763796378975941750521586754201928536559666201450456338552783571256
- 7120512822751960929539092457841885540127128286062203184030416252304573349919862033683941854919174431
- 2814170274683480533123636546408009522798679980816786143876702299176420421935770303028892406338233711
- 8831666892347256653147154261973692488185677444236830676285808035577667085249394327267591827130580282
- 0474498683109238845183965692912826914135802285087920263815575944588577839176304153824777450273630047
- 9676856895905742907753282403183887419532847250575823699898418557360973793479262107564800127606600568
- 4856289529627036503340728499245707682166060043085192144993994615927401867906702492509188084254975382
- 5000573641152765627882068316837456136116466105945296098764787617810657325699441300696040441275748480
- 5908154315252191475930781041409918043677066395667263443535624561935640751356546727167909411879488480
- 8680923093832873822500428513086155646738231344891197653033059034948850709043640855117089681596818853
- 5559683677670828759269590012226813063407905218083141753428838750131652921876633335743143710101634779
- 6658883618869883499832898116400702596550204761199068845930641188013743352809379510983052205865755190
- 2553313247393551842157260882310168318176409724179664282170553923573318235997210559146758099096015712
- 5453625914657358345108084976967080717266943718308124966413928529324205814835226274469375858569571687
- 0345022377577778359815858095456674554627297947307975693205085626405035283025567228667754448284086209
- 9813897930370925326425964038534996170546386083723031489481001371999013197012628010849698683279080599
- 5250749377542359999787837446577837123753575785267771063814356136789079473724792426181599280191554236
- 3584092241092695194986758370140080691259459445559254670473203928004701116001559541702028795035929201
- 7703968601134563044492333977435455716545727149517353452904622158776693210397256540533868239130580966
- 0021212324831138704907261634988177752506339880373528304413788504053529141957344862622148033294954488
- 8908545079248054268374194066918855516757216622110920899731852667678293526613290427617120717343300234
- 5258919537355747509268743152936342844964077178567399584381489421046285181038496434277355192443854011
- 0560036409186090659830023373684591499584014449901293693725893952889834811556455810610307945458047566
- 4650489357678527521118340799459874420567550698461628297481692743403195744811212692198913243550319837
- 0546644424960963633748486558714369342400084268306946647268678216054307605555515711301054996369421412
- 0145286056715492814503563608857935420449883125571959955870785833653305512108392849984112684790571297
- 2202465501387082052447492723419195036030393946034767708515347254338076913543021032331182709941052543
- 7316371791899608133844403673509209111063173376587401600018697304252984202448885270331725146924974753
- 9319823503525226176160943848097053512457087513186892673700507442774120709790407346312262052900063918
- 9290990331964353335337782773033800956435520237281189341422221316384124662187626562926213165374744095
- 2305454016919059121029833254873844314996900817917666244456257105500140603668001332495809064102834877
- 1641935647143040955057638038573852209871616795910485222080708395443816652953500877460681136027308248
- 8566261392866772837170303237832334671640641865105991624817670706345653146764074492658990400249294338
- 2034766548273034152265790423510131092975678304848136329763976322746732729909893927449638572144129084
- 8706448070466163067183262697301895505226175036704437656063860897547480919952639440353604654399823773
- 5619024650269312958914022210598873408816322256258686174453244115894930355509977482474151507373411947
- 5733373556527627418519164245146201049878262945368950884462321176358003511841835926759864297128139853
- 8414469096917190799516740467818935875027443503551180799677762498706284759291327261688448884939141128
- 7453205724835916236067416163446388013123511612633214157350735873789089864603319101047904951088053276
- 2436343801953205313641343554593647041984399732731928183025760085767530258321696714646834358840039142
- 0370724267082601761625339029898671526756221981306035295948446464040396885600648176610903305607906503
- 8768968446731694854343891836893537933416898764610405060241093598555326643129997593902636796969251376
- 9369261591022851172165414889215726223597736677014639845855210470747638897225490221795578347385363008
- 1933437898874815680276975999495121254415702713764902775150787799491095614895742622739879403322128257
- 5324578456195527149717737489231107175800448526108753397144093342364167000739474760533876638025429586
- 3552936913034769868990613336245908473538052999169523740650576570393490154739065565289258081944696284
- 0122139245511198760380740566099410523116436019256847220532851072587588370887878354074617797601531730
- 4950058293812475052503021700236109573670907840223511622259723813014440798479181330321054432443110271
- 9791005913738093483775863613997719436720065592456993814702761918466612118042961718665283106957766092
- 4377161598315124593617280103901636552046619370925251253631396559201177821427680194280476586534858158
- 7470311992677097913350491107205165243246231253831574487512954156035527502636796145461093444168535781
- 0273138996999546867343518103443255259516930023300505925727997815904820223589052604792034825075042171
- 7345546642531252852594784406842133378979724559983814529024913412772434245097179511864461506281528392
- 8650237212926436840813268942316931518881895385268180047631030778038992441215187198582722254498999677
- 8751458791602397076666044133305940017725196828827618138902540142141154032221880752214931387303943894
- 8386348804885872573129605440226754011944434427123955690237907150071386106419858388879568805486335172
- 8084446447248132772385956105213013091015106264293276316247222859852571026371594629994013226550518804
- 4657398980037754421846299791933040060517616187986026555760768914956796240330209203533823006419857512
- 1280549087681264999866296820216008393577425692390014509676551896830011498580395006624633861680225506
- 6870759127483197530001455406015411980784113494829465680601707418219448269420291459193117972944253523
- 5139331011218688316780023266376919519389893049565596364430499826362332222131737958633752729015980267
- 6243820849089436428312496796216250016352996689304462584580416724907109041427954474322776405586064497
- 9937748159790612922202930619833526180042611796654967580548290181068947372216120265716263043635302282
- 1293372450839435343709678543243805831288950527866356571712880369852845487149507985624665557793170507
- 9028998685971436459307797350701401522754476693419823926389892945353431902180169387585028778687970204
- 6168231973519928076697586512760646823839169601486711150096038459388200510615266462562727086373994715
- 0257718107230896204362641552557152127904583542959059101205185086051998335829520276445242512357735153
- 6145132912213357834119671870758566063500029766458721899656846809835422555679769978615295831620657432
- 0737210996844061946085275213997207746028379618294067782659809969835866089743865103656242556250842354
- 3545630151219711116732833655070583247917273565142769410984986357066618802528434536119774234900016041
- 0913598065825325104777234873758588466697858029999224197366504115511962816004732157650700516628984539
- 9637919414471961275368496384841840783539219495160760752984767084138274604403017707579996667675686125
- 3610514003917168172567805013897837186583796897615017209848060227215120876367111635529356196130402092
- 7396418528693604726513966875563040087535856868313141286860922825551242269595679930350249011366770936
- 4034990374845874198910890189457051985781247844035757867139319708554989380999706541057916902095988974
- 9873844727261372435180656164993163897351119703310393978040928094799734337726502122497143409823782365
- 1965892886279223277990394182050685698376711662377215144120227663379491737437342283179727940119374539
- 0490579714461718360256732214055219462186285914543896562340248945379811955964968707073021860780513193
- 0946785284844420212843249930715413564423079386272526585208492269484399394853053527270682335863948608
- 1705774075169738521202106289594177160792541306991346081438246328669352312659073430366809538595608450
- 1673932290965428288540978637787221825907274341956466116595934087134481202995796040005764146848563841
- 9208402583268552123795496248911586260094009876541358587061925113653719481486085710770837602097237465
- 9553114403073394942348448615252372266625317209081622694000211227591834255298281689971968761014385191
- 9012898807424280528355553325232571548587561447752011946801115509440542965731019362159591875821948220
- 7475615307833480300854994330873982134027070003112858879279673962736609207126971151381953771554641063
- 3745558491963169175525559918922408979783312427354538417960278459589864706009528418086646771109464159
- 8431500095974947022075958749369609348923513155308795226753192288751932690569926959011242800843780897
- 5802237272111281427715809215786190314382328222158431197363867972722768495813632814701827652361699870
- 3831654805714617520177978010749005200986222538671343789879848810445030271773860682106718234856661032
- 8159840918571490847707412577372152962362895142819394934492310024755294687688142282688263381992107050
- 0314822969078127068502360967952456156317625378443908683885454717662505486886145388589401906509184101
- 5885208833696129877316727526919756238642760951369458384261852183389570518641326320252293139134838082
- 1287964338813629845539042373128573855900623287197915909121817103349208828736572596006751034516917303
- 4840664773124728536498697032255058028512103145813971655005402199912584671247522962330479476204174835
- 7339651293388462598605466902068727431079892009360086299625852649556926342244349075889871207540557239
- 1778889837474006283110359893639753683143163791553508445994998151790357191664595797264053563579622852
- 2323209995625290729565968625666476118217436889365526584209735880483823563270384629174104274634032764
- 0442472179196338923330045235292002875730135630382111728971331694363722061750858152029084972463690556
- 6762892184262651781976519538524643036425620321295916089585335981540706502452521657088226438896955320
- 0330712386017719942697998742711966035304852835818441460854913450644431713086666567324744794322805473
- 3913760627581890428365658659895466488561709859023357189364711022191554480141608108632865265720250373
- 4779658698028969756875969566551715729978174149125519450833779497446698060268643181523422924316776326
- 5101550537467770920415647646247512496723011428848395397060605607246531422732188958383550139850224798
- 0616382349453661289940409355917809265868236064198494786394927392551467596218556484340287163998424165
- 6407922432049921519352709427492550972098376405547995076369623700896158531420828549780644065756946107
- 4012428301167709175408804880626657504874497001006448172817033718571687699052050431269126758942354642
- 4263219268161260713525593779984687684876663746373708483091302303187597551925243991782626402799661636
- 7094369112530086284350297886671483877355700954085095109254267237087162850872049910014666606934352543
- 9681324227750520412084311778362086425913741403701893905849130885307671803377759779815450406004508428
- 1692653954942424173439682579794296332233121321810780129321979360275038885263104587257887904993301724
- 9371699290336354529074965146405609127548752881574874850466564788157133643242701577120650882647257091
- 1545293554151064551035094710720178800179246413597213842994871045977552798427450697742656414883406830
- 0809230546462603894832672239604062464659457420252210842881282668896752789802434682655789626562663797
- 4536891092934689209248410970235713162753302389020769867314325842760948183881245857587340140970686718
- 9561813112229470021978448241581544509819889152942428906934660562607956566439433934279983588235711675
- 7511632925562149947095183522331245810913158655773591758470369414848815038632640986605244160899442142
- 3724467318576854052616459608035904616045947747232056287891088699234201957552645554915186288103709855
- 6289818492084536281760741755782246663879072604677554834517443481890496880563765032503535926271374514
- 9886240548295624736933344962330902739113708105840712372655403944406661654666981279401611743803144254
- 5836113138700180051064222504742126749539970759097152710314165536334773200549635491466719499256643771
- 1135196471224844213383344829914740191692970978273304820965702365744166216404138597571994011075505481
- 3835675097536770208621480224769057593128457961205201060652722159599745589563929274161013544777148660
- 2722228078789190310493304860642348889412653650919804680472667929079707702290502025767138443684581563
- 4829002226658722453892420758678126480742598431037231448350739349163285687087989353089830355384383950
- 0797078015089931667721215355785047682448066812060081609252490055065606882005394397529404297779977739
- 0954812182338828159978628439344893791861555638458479425929894905438450373697647333225685242402160195
- 9044724016399444925891545222094738197285735608141629442012082969234213675190569210533735923778160066
- 5668763641463665790435737824436651668510493519577657907919335490054245374836258264105168437864450295
- 9183589839644056859368882636863710502768783853127777056659956030015723582371471547219056714260143368
- 7966468436491439499957272215058042899218100989507993449442141990214468925539286769175103982467582463
- 7343805239735083028068718734460641876299320312170407048304612916426319820862850786951729018997001434
- 2896826244178078191626441719504450757666856324245674581755185913604359995857459882503553846674132820
- 4525370108050902351148404819530588806416040823552351294128140484544881037085694262600027163923010086
- 0372142424842912649571956987321905242756339490162246454625934745670300567283750846724982527983673495
- 6177089836516547827889426186105183276920850360362178003391524933714844455014157911625050689091071382
- 7580224465050986098688327677971183257939187162167678835622419886753868393157565897768652016394528273
- 8867440651787566006894982173557480744432557759069273637848180513357096270189715205890970811986200522
- 7679349913304058284567203585664724105889455308752236461838439640259601125485287660886628483076360128
- 7006667228026700036149423026125416550458296169931638437058296750705322926910916119674936127372916312
- 0586368847905250952735154380622219327300289599240793907443857366909352949258689440107342217802437077
- 1528161242531908822717327154338237401474543621843332568029599407713014983323704510969965453202745335
- 0702177037070611381910516358803074747708198082653195105524034346189080408772855887102619129910922959
- 5088225181920585188744198634862518824566545078032953634810263484330308372418113655627830193910161835
- 1740322384509791468752162387714423922323245576364107974700125539832471226019053048866664933322848632
- 9053808683517096435404402568667911688444342169402517726916720054236587952458648729193194196398370591
- 0834659556545737455427472252563872049196484680456121634675557800183911458050720291040917746197882965
- 0486123555287269755200042382038183207642553640963208933924544967598152309215189473050197853510015299
- 5735305428112836484236594743595960959569801620275302395941995334462820826497923607942188680411060241
- 5874150857519458061568880834301854125378195459697414236778741870667215842752231935277070188776280303
- 2337402862660420730505237852035421042577244255914042700874907643524826938681071637669307303727237417
- 1754245852247735758270295996649854102311510138743237047991591787902994485501682558654515388125485742
- 5414604291201232285561488953271771724012262799441082686913997298743825568158111262387326261042642491
- 9146730313932407899673786143290414208441146741535167426897337032190690287477060200884221903212516552
- 8911717385674777311366153734391751962707954921617093780054340457873789689579406584026092226706663974
- 7064746191485114465244380741520552128686202006717232636847179672315491533594924534289288748593176642
- 6993620967340749774505307056843141013326328777592130576231470087437384507626030587577497873242071406
- 6513617994956945601081928431937367328417989351895954235197022893472976977104975358649956731850469509
- 8739662801395315247336067459574653673422509659501098766962373414060683935034819838271821186844060176
- 1576560254701139537357267834526945596079177094497172723469473343678038722377574791686895552041362153
- 8014282548673776952837038414279340044001305689783556227986071360705966044685334333224708199605172761
- 5220108066710652379501907097493741821633529938651891700778898834763609236188052690600640828079713434
- 9789427595928872026107851555411239737304609759231788346880725383510590800218660449028979118967259367
- 5521396472906857973507367571821697403667069896134578745061097120350147956537516416615312164732544167
- 8927750724594362819238256233629810375653289132823923222725067941709469131856699622676300847493329492
- 3772482025168055066631619903457800502962160950971278313497549748497080750146928617797205392087735573
- 5426344654046917507878362978303712221263449953760458706825466567329277539722860367819247326075875375
- 0363960555755152470447904689279007417440809916215353523795515931682503917084115733894721483377058789
- 3695415348273160717030232024929094546655312055250126322531741427372940893582323130414035967091049257
- 1838352019535775111030301893738736672956883475900280466901502804156922062794107897682809626966101213
- 7488119556311967779804681249306478374053162747606283458684716459438243677534276082695576532344276053
- 3997129870805208989856144206593472215753513573135315096432568632699760118167688723309047847387826108
- 8300271876502608262925233194476909940416700264006555597136991814669791135677806574510572964711963826
- 4380698960233881135307214985853687086285871789268796297801608941639363012094163552302777342996301526
- 3435775125041351983411873620583345473118538074572684337206905220856255010506100937942856140474184559
- 2117933927270859725115288005694028053614114492402092462087948741836224854453701673479359020150069908
- 9471119500954771699606451569340980957608723061167985930544742494585592763754265507909850782622745241
- 4280564196195794701618141018859396702928840881750713269491264514792458713883472209570125453762871154
- 6135844710131132320149549094464014760003023763285717139536547149001355586963306925811264047920053172
- 8092117912870096788138937329594906876916230917822286435333405933967916024289327484446631559457485611
- 3204517830646491662241813246295767509185902988333230655145023629404347405492556117642216093884711734
- 1895740719985035273669869338669851702573938066023027910628085352549353166194585293885401347619818297
- 9019270269975539762709721332077521428883136382794037795481043639684621695249482298443229689692085335
- 5530853174095397100274487325283527573624794580127804455036106064558578035736262525563606477349056863
- 8324600588264572996728670647068819718804899591820953876986724126105812313371883281538730532406351716
- 0488373186348319448785524534021310596054326978736278990273623581526866772864841376321754066899897348
- 8261186018002936002236261588495903893818383478150216473108913836953738086831643699087980859301283735
- 2876220600536227587287679465791680576358143240925305502388654829492572512760977104308414241327149223
- 0145550249153801165157010725991966088910334458778020184201986872557983485892794115791654898418079655
- 9816529244002860008928330899598461251541347364124755370565807249607337289686395655103449758583001718
- 8013929340815934657740749168731401990382842771226233324460588756739838593500769513118556316845738386
- 5551229294080306842203625672459181138606350480155226167063564964286732345965669379924358729329116688
- 4983936420697970390191593194559703612592627063708371713607972229244838973659949263221859430952934455
- 1705400945927487032843519938814026708591528949635950763638073234705346230932441509575691850480891957
- 1739191653100024157142935668690970675538485026108040743406457426342832522110207103450374538340721719
- 2728609307970908786402740375603419620326095180233319446604704393480054063586910294183143819807662636
- 9229201519626745478890548730085334220881597403289253567824780457234485556638842993651785938154287147
- 3470540776250407980710868325712720965952470280931298490597903061967508059944421798850698316109638043
- 1857573493208970279214433939134282900983890292760099810349716753400553502665754851358206981718943173
- 6521873727270386652434205926968399585877165807536293049174582102753301267023622273305213709274757549
- 2754032248665363239284288788071811943447754439431574633737742190514462638401483845223060132636502788
- 4514717047905831805834894085694942499441515548386334237720406996019335803137534497602844499515410901
- 1381560664132329431053540356633498250090053413621495974752980282398461972836700621058461397781582746
- 7657982601784729657646395894187742496331695884228391191590565640228193496801758163840139429208142088
- 2045469029946376520599881978317544801271199655622131732442716080219316644607184506702451604612011797
- 6382723921134833943879896290584017968636094325530065062888973239251361632702390752395982653489399468
- 0658059487686462751410940649931153419873217299143125910097771886869455712444493582861381259764637551
- 1342798457376202343562568983122530420590214907099967416032154670753881650296586399155315134290551333
- 1653248308850347019549055674484101032187658995675839455823828688310814186283547319475525274711575402
- 5434804661774803878685983787156949134278530829472887354120431902320905952954328610661326976076266926
- 6113521146625276984127734085241913826858280955075837578751829441953816699647593380581097441970408876
- 8832525737438561825911089750196431479372572070809405896055397098285800445563078599861108297845198039
- 9882309416250986802635162822807560816507048348964416836183659463297691973326645044332702652964407332
- 6083594871297205636803629992269220555502193613130943929256168982589380953115434813289518491654287254
- 6286351978103023730034903799179307688612204532651318101381689879195678466786614433105801438125991279
- 1415887667170290675999071222928172745278544319176377518648854469055214182947546075537345606085563464
- 2039617667095752874549490120466035196463687357729297428234750549678654459273606276089892469782418907
- 1366910300926678191303055919511695693178319754079624033842110466446524045818686393260964635303347112
- 9213154369571442206723727019032161283163660683535359140279885260953147441976705764010907530604721386
- 5706766549972656139956259081850853030455592840761412465221809965435307163185074886478933137159804019
- 1058010242554171356618961206011069761203387121769536277481470240462879594479656892916665615162911773
- 6946184946177683166359452851171641400879610965586719421163816545789355943747416596019104026506996537
- 6089108849054090880766242236244525313285217856872117107507287258024370274958356646245635139772059647
- 7873476721370969778743722222285444150516258147590016001034987342164287379415209172808743852870687452
- 9967585063462361565683806568468586659128839299398749192804509759935762191530345339640241628163756457
- 3379859690128292741879627625038064030579982239393509589219952785102916463804783293620919278040771504
- 1873006891785738178253793126532269564298480575057043385936993433934560449623259372433043576671477116
- 6426205667161937773757701820493615978206551775960445574271401595850624208614320221027947003286440974
- 9853119493397220525601724380678398080630198033038714010823737020217802399919659484742081004162463139
- 9989387267812969837139653343697806394667642860024152824873785639412927935383607707608300750085468836
- 6849683447381380001948099946392793972548092617557123230722879914729499627829318121179995311913933682
- 9142170800391710839203996253246571242671148076218732388866302732632605102274855876858248299627378563
- 0375020526294883169608949012916313726348858049819248754553524887326239439367504501654768934020682145
- 8565566171050775119437380589413425696041313947581919706682302632423409024450540958834108768898805836
- 0019058008561994910332388450133139604194546882835906148062791702742550569836303868190408076986074650
- 8844236776170546226084543972221940355420265203310445526900704688277458214569663667446999428841734711
- 4807023479517943077836152757400116754238104978226516996793270179099132535969256413102120317675960263
- 6795510869259891936051529316116399937906052216218262573447363342026307505726425225525500696250372133
- 8053244844653771497170577712173855502140364109117838972141797635473176486099732370208765716623286273
- 6406666652522444844237047431260270194052932539203881245611678392260714780011957184750455611615250384
- 4822082691866745295001945479554742670311953388463367504753411924305172890558306396064273009317899033
- 9713439315840591610085863938221382022717081924757782100150391638486660170908139091359533406190146269
- 0424095680526240107056477766184073651996598312015914861912479104532820849003769623579045204928147481
- 4484658172687429160111256780098117726912220907023785148661124371445919846685763094737512094243352004
- 4650532973912516708301825542971302260674660980052603919627557983895090692431900473756401836074549348
- 5910179447557716286315055488761028672918186758647664447865962782729403999320990533549691384757430422
- 0358026682005018352485651517034209943110726037475082164349588541432104573557419801182940065163845907
- 7831309473009929939541827181805997731995522537656235226168798804828472031495890625696894424278407617
- 1974785212111708675294460367053355570333619526994064352330819095743708046560784123500619341564951004
- 9733173836204004227344378915789653495861159191813589724449560707032232278280157914855808866326700924
- 0423420313927164689630137056221855039903462294679176978329701524127573584580130897595258639855021546
- 3677050900703329079755832652569733099251994233523426743245262878343487803932099014786974131728112549
- 6445904277797369126687707533793810529597921956009451964724521456644781129408884259739950228931567320
- 4890035956531488181813352488448698694800612536474277550005042040462103442555588086621442523793246458
- 6130867091526143968878163367734969512409007739167264140941242164561853646208583805219480898873774634
- 2851400043979235067024246706670697307923553229765566845704762902563225978319618333972491546952552514
- 3514347973072505898539350344143010372769330828701075552612213237948915324248501547845700977456836739
- 5706462453231678342716059951325335038447646180452988910089257614236456892093712162335777919010169852
- 7465074331339403860558383560512529911464752510497400839238188040952466569782190675007745127340413746
- 9485989032430384217737576080925883639849428524916612397421340306639968399457315314592189561854297369
- 4163929127458660214919325606290835478894538705890991028776842634490924275819538227715445507550828207
- 8488360093885750407133806431446435106635772542001072151282148738012783255219477266669643519639951388
- 0976645324332723557684264153138097822980463213153774625235404290603580170561927446884847759849178086
- 7455498329658519534616200108125422426766724465919850037372467000945314183285138022443386726425015956
- 7592114147496245184912047206467560940593359887917979059001367488538645068696206561499083496822578568
- 1134556483957272889037685647348587027874709244378417015400337456982748232469221776707380599850755861
- 6687137871868309680967655837021661114077220785221064026826988873072896051684378352036740225003301294
- 2208799728073355203320849825187947636617429055283759128564164974137281936511433254132159665447975088
- 9663784405834138448245573385931223675087756917458077706663761431383703360433458674650157199994935709
- 2631498313539476010997460000053765814494573326745861063304932150297383939354427370993864150604817313
- 3810760582530943941987857532365723323047959249575058023465548576017407830040764894676825864095103880
- 4374399269553415069260955209966849636219609754199025668927300183039884115526354875841019186258565195
- 8949917543670137752629621235562608907598144724510634531684374203926963412512254942553244660392238541
- 4921802547488287657536406695665685449904948149152805038253528556467200442522894314635745970560541321
- 1134776183459143500680409751657893967117854851652292067783571075255139531452823122246077432648578021
- 4710696712582490549532520029801187432980385609820847498781051624257385362174946834560794401386804272
- 5973721779959761348492683692590494544728545348555476728550926269663335154395319199262090222901179165
- 0354053205354155732396286587788501001210509448364369355456565298702510427337311270368643270185393046
- 2298639018498497790852704663810074106064199346768348792149018237926231535776760045253983094883499531
- 2973156738110357671380950602689881032606604431764355029953307435121783536374226307308941189098334119
- 6386055152202496844393942530531427282384519772446016604039958354727913725799487690563099638920470629
- 3760505652182054213457997735548935383680336528207608125148943624690017425014836948910324978639419114
- 6005402306216185569908610246731548646098802027810734737377704918834398152960696061717154770915580453
- 9147213794488630702751062591007953739995139486174490302297892181523395588210157649640209459194090016
- 0611658741111198073433510338190204012029929324031443298771647219418758925676345923219909229015572393
- 3728886071369406177616450934567152280499827475092783026359931981639916855626044956799351948320384470
- 3965009899853801126586133337947755213032889161978793373276844741328316215382135050223298247951985584
- 2530644062732756704048542157953717334383013657922716976581525422725319026917215835634790655014339322
- 2118454577433731865452718559410210622948825204347308783812222983168723577837337344515599482329233926
- 9578929447998242009493926642707394323274713200971603475707441072850307963039075727028380502095916175
- 5070005016627792429318124505238672399685851931779590388404675565133255758214943153517959498790175939
- 9540186995861620669715389333257560018092077957850127158525013243702679838153216831510588027374558939
- 8225165079655680674055293358041645869285231652892506244103450725475174669695766475991206556847983177
- 8838624441646954191913411663831359509426984078970554946580729459831838654621775210631145510433633536
- 6177573050374063429208912775022362094183093820379420494301832564881514621747314953122724966519403326
- 6694654817482534172522912474970511461616005428188054035419894723457255907901419851829814814599027140
- 5143266071026229634919481259342145337898724583097604861888669585130390729173392077225689609836520912
- 7931148217974750644655976134038757592240223960347357084918337811214989258295323354443785318333610174
- 3721712707556161914380532726602449486684750343807525183922459239571783023471419022350350380794112727
- 7487289504002308047407224556001247620731599212504578861913386499033912685147243309106085594366056248
- 4867647533010336365985774896315464134652817637412615811007817367012495447965411601224900939460349933
- 0999402392749438135040080294489916879393667610867550354692386570894147039461647784558930701189503601
- 6968430078158866532913562055689169725157812754395541621519521053001313362218719381457197443546784636
- 7988318741333305512922100157473047822274735436233806082009833664536855868925633157469202431516831234
- 0672977314170507985368300211465536273578120633869732468790648595875816722867648874376546504490483805
- 6518022973211179540565437944615042021563406645608062174908344929657888829537930350472608621682320154
- 9849336065885036959606666076136341254667714265766966938253333538296866778018554763758741375614974085
- 1683629386444454372825282127596573341880697804038637562432135935333827691436403187220519444882699899
- 8678043790503172651953332428847616800651629802990750232478834434240656782881288607696374064960256307
- 1565676750520370530839136166283921641845098284467430512284442398334641301530273921750420119266145727
- 5082813903767336357639254460529716017653757738989469139770671718421230296681287204971364532552899308
- 6401233052322605408161138788925319487861723276315274802047699701084142223997929110102895691963294280
- 3327708353525389035143185882863193742926542221292762852600422545397998100595536678399989239291809150
- 3877736140092815308194078606647484238225957635285178492414744484368434252066821565966919769728805736
- 6703621563551249944361226689330580394804546277509788735672716123758257138391394108724319551951605337
- 6515555892535518269797147560668931735310531915212298359173023026758392741649314224393897443100874491
- 1962224480737158524947552758284137168733885684513971935717435137665104895239029017063092712264684066
- 9278348399886285959423967936456417355871840199018757254634606762070626278962322034805371836351794691
- 0877638519911078379366902264789614265281989949894409583646926514431656582124717920789203351405936678
- 2849401779896529798150547543580317758562255869061012302340109361295535357635843299746307928840816702
- 3366788970128145958847428199428749866143771185970104607861183122285674946913190044825643028262007248
- 7875253943979012522035179906701088644441733329427038504777629594843814990998912625348880022470112685
- 3866059437662227036508267221232223515725503765038540952531017575868733835311996936024166003965092807
- 2743807137547048484456886848919687212310981990987307479532054140103959736196967523052442164056190052
- 6742759939791372686862785354305517912575047157660184923718223934849391969295394499883801965726625036
- 5175749403311969597941172125762371383165114796260557917844027818812255383408963982704978907257430443
- 0334117910810905995054171220773737974775030368125820309958441194867999857940111713933242395262703619
- 9270637724170339781113332382715682773420147905472616543401932267144218019610533705026333742731904551
- 8794871348524986266822221111131891445576221042289834739034998125977811080901318642567088910367429803
- 0491363651421324982033989238262331145775400763163825126866684850315841111141155886426790721346040922
- 1705074598247207024552431403520119565313924583310091425363495878979074393713659709552725556666007024
- 2028391007459462466313074544675113059937775120411928055649729151234915055327810229864306084053764409
- 8917444310769987172760038151634428606521830692100917992794170931936294247745806817335335970175989328
- 6031485320156876979156521241896700403095917277570816030186945971407998244363332875431922140735996952
- 6268303856595845208956554977810132745394340864386526954140660420525015130837808664572997492569037617
- 0930028161622503187003032737144860512516407239007008823823906811473995804355590351241221823298274366
- 7778903853858623918147815883532581378931913051647239015905150073292582746204289143926675349521549429
- 2409278561294142586937295146893142705444227000932416109334447817626188849164416925608135907757944738
- 6206015924040120633749989542529116340952448531423182474586867921351026966287517052106460784704974666
- 1545188141510351673498157830888050629025247278491328835858571968770316330097553904904884566448974688
- 8824842250422741076906915478241586198518421957909459139269455393497074170826012991361372933199089961
- 2447611270277043889271701723488617631963685024672082669876084819752651511784683974330831726048785403
- 0332942786443609114897628797413020336753926893185945801618329179440100958324980587506458366412769529
- 2859826577033300623458265495553231665323056373735121952849214896392942381059559822709275997303299473
- 7505687449872812934702606624477615834666170491626975717975872429291141879750748782171533419974526805
- 5732256003141704634220318975782077302373862469785041650979758445271645852204355139759287529508954652
- 2806626969434499014880200418118642039774220404270266955446032990925495943520252796488734580054345846
- 8494529753539158379291130570376177366337579523977108739337954733211854879061926854224008395361036877
- 8991522104521065020038005180834770931615105441297268508996642282464489776423231947675602438097694631
- 0016887760572567989369280086502487446760824545957501328381000122974730565399913766112760678583451295
- 8030384050253041663117398222113792207474393966300340704960764328821987339877333802859793609821535465
- 5910072431709715706097105968688690664790679515081011519705136357516361120759637386375738584999837864
- 5305790304439430129504109743783727473215821070222676757039661418608774439690962477761429826812572551
- 8207382106291429179289825779700233074929888582353993193563942526806194864206708332451046817067040554
- 2134187651641921977618868029589218724367391297929670217002604707954075998806965382947068262947500799
- 2091780545010872131836710302140341239939886741014047291317644420908011091980352443211333653582852718
- 2843262367250370024116259482255974488083176067370154856289118665446550456305213779045057328185120197
- 9665409430270049744632546121224141128329366437940321984479276656109271707635594012205535902446730707
- 3784068108916048402263161316537882261306234764932281552291952234092518396017149557062533930191906745
- 9718990077654358539453730570858767339377522556188759086266557260714813602684304809463378108948705332
- 5334693152865228184850150399380033663878973389341128843457735233219997625754387619478290608410492317
- 0869792726685650177178453576014440687171686900952806803431893356304270972778706508863333729703100159
- 3202232479700410181494676461336968844790945361149017446298974932300375802531917695505241625006552842
- 6114373076226542082682213459467537033662184218165664434775720963001368851514596794720360121393994632
- 6114541444682752648661586756681602323921704745125701348659061643086005885568792084783360624630419584
- 6417470830336606533005342062042836863188883242668160351752140074640269007587610894794635150844959617
- 0005018277089668242632747552939134464826875600962762224250729627218837874695585396808698731268923748
- 1269813501287025948529870938537227129950556301593716628582188659160520740380572603304513197216792914
- 7718675630529355727688239029226621973058048731140117530813389217011861801173372514366353087565734208
- 9417048072193359887479736426861987941028542129529410436548061666466560953506812679860837723426852206
- 1587747745045440859724123572813629395024877213229181447460352824090500401017736626986417021816703518
- 1897467051204279605436662794521749414856486403423375959054906013609693091684106291636794689232189120
- 9127401951706180387212284307087960773113725441306054172989950548378827727046663864191137798869740632
- 7767999608103275565628709067701614858118516715255720673109259432660248555938871841243042256167746151
- 0838972883424225891485050847290517606189977758300706565252084740820884217337391076739811488077333220
- 1658891141005158542238840636728656725089712885038452940316291883714453787866130540009170501111547185
- 4363558310332072119813348586311534236019202937183043526169084401955004814506589376871523847124185820
- 7056441353048742051561451208666809688655364730701451711555839964583567800349094903932744514411779916
- 3796310338254450612672966298207689283473834827563761713839607939250893828751938890837424828395334225
- 6640130058887766579178359774040670750177108719391145784682542500121104011567813812956625725510917646
- 0365967780579961308628200115012516792484947604849884203733393954346866859023545752309540738153041167
- 5919196403395008232212122031948582192443475529337530173935181814669205300676835498326089762673603011
- 7845855487527030732200353241223910296706648167195592545322134782497402500270274805998168376214118183
- 3876083487925809813815166160414642080752020537454958013051355297538783179556066095345275028999528430
- 5259958631497799031259959268523867599757644136022576047065119871932352626491081301935915996762477542
- 0054683329136080933231845309103266426957027363688615868419863558986966216126369423462698706529516460
- 3659088977630943695328921497180259712631079198634234336833798542781592437536105952313676705884251472
- 6866925962255623338825444915338951480780353160096236272362629321093838121344292596168977607129610965
- 3285812638563528406918707269095087199084875880597680615434384983307862237329950538595446528725800917
- 3848216395247618669194284409202032528586359734273652108417792406533769948709190400653628400265799102
- 7808588169428112419867803212676611908212068769439025689831855029507358136283325881329349787561199657
- 0647703233546013593301573718699852759527884015523130446664670070445701673747302944778425837971339579
- 8102341927430114166335631047200206230346672004347363362091860740637938741083779837265910226226628166
- 8368174614508881058679402091696237070267227078556702466966215235923248906556541142321653001230668315
- 8137095011751649747417707710478671144231270308259649702806523097265225953502609376032046418104012825
- 7029715290996630179728749671607818738643460436560312600913080199055913449698243059810448121422323919
- 8832330517487617761060380242248693360782698348799053187120193656571881137988285470003661803376461641
- 8080056211065665713544573803557216270206698706659611630266928133512859723422734740435504503018436615
- 7059758602591897297176293782075851521436630058441375435301528736386393755920249401991229614783120533
- 9020402152495716237517713920740481216320695616878374406751427661181935704092622544281257244674793566
- 9902240001616279356999773793622293288995109667188147254724474423324508328161135885062617781347522637
- 7416689306796189069817385426207116834520208661722554021513152030142615363529241762488724019384328470
- 3145335685532116346032411910969004980661636537048300440101181291865610897469806955769191358515559383
- 3791589067981878573696873349166531702934832744826234967893671344072677226840840390785044733709169016
- 1948341749284476857660558238949976266570726095917281026112370882204240489674179817610597121652434189
- 8769732540518357639068967524643049459814039960198336818628217058607337201469935697285000231851541357
- 6999413002897984546387206092599165675004257455772138558216066238188184326085590864884230577290245837
- 5483327194659221890608225577193031024428450880238041182458745459540599118793898665243467776067162411
- 1861001010409073491303067136969073215943484812974545321465061611701587079237826776752243663566391919
- 6042731264289021440187347592854707425670344996917675233598478138865565705899983318601234615036475938
- 1711586038569704789249935904441279760418898209130348330214953067826196903024060825099184094962411171
- 4750193668254719668444733985153038785005110697902006497353545593857570788333676889246110793462714441
- 9802729030596670946542694668000365572482505385372657003464552984375485605766436548468959198703255509
- 0859093742098048624130992674323728635611761809716368736588525875429289986840706674091310523331169139
- 0175906117790840555041040973012675087716768600432640471731730874894457953682806516682884188097638768
- 7751677225401507003933693798837135823136755015852875240337553986870947839756157946308525991462120723
- 8560952292201024194226436550096437281621236592956492120341931085580480579252070560970733110036108725
- 7336551244363974172687751532206542256393391424987919220299243040151353261830425163982175998799403271
- 7706306529601965946603316609193225213978517420275604532822558009110705570160851977806571014316301211
- 8809125580649860309480491466761077207455026345069561581532830704419644626444019789530416738083329238
- 4654515372513331684033152563896589471100879881182953236468004613394537670149121770428219428285050662
- 2188463050880409783570115326654916255249526385096275796749475771603492347359628017615562674390623303
- 4700445381194095286975509385806797026611456848448463089914943151524881780244169740998906039084394418
- 5025304735724693730561618537934068829460142540221142337313972408574494586237761932255185568911036463
- 7684070516003606140643570811847797770405995641200104601413000890788089377595295745047655039053183599
- 1468545540757025419445358817282302171840873401560659477066982172966386591321277165192516662912421600
- 2608240455641818282420715559304141284792123814859514483996567150576460271361040734548881707227180083
- 2968140120396622375240917625930501196457437538992864618902187410750169415517307487965557943412213401
- 8619457111141451434767911050873858437954322814623925103215251780610220029850611715115229246844062336
- 7092708922645324107817862349300203648615299307013684697050663695876213038719184967362628612877313530
- 7721316622088806901178452231994936532272443177479044080521012426828275776057685207211032353363551733
- 2228465853855790725929976584978688690119345292746422752555850487824174159627743927269508630037391972
- 3243280964233209858067469745511572367038795593244575845312260023956451863424137001098615026519509650
- 1276333828196736597643559400008983705072192268375625342457964215208141538140352834232745745282188653
- 9984540277441222545229422654145010246288388525706463919904127385863747237719701816615015593065525804
- 0244909298244953501327780953256426342626343279899516866922969197876946230763821342879185340166382658
- 6138981055665067401063420828539478180020453642269679016347991779681426970196243141837017933239208206
- 9639114568653435751789370246642695952596006543260916042709032773341248793762208978545694318474194345
- 1062039746655514720561706101946122268668159690483839429043099283167735414442937221925763921777923422
- 3773397148488181910169982018278621131812845363263984386215655096776531988541783185586741582390043053
- 4511707373728672801882335457853069599677880674179643009793841325405448123808319030586540851532278542
- 3135428374235375872168823632205507065270649525135696367521210463206418432239356377952099896545472001
- 6968351074307701939884197870709476949874864200855470745726706021712740956692665431438337769024013142
- 7899977567787241795713572230606323052385635147631325572644675977337769862841750940339381216921426735
- 6386462354340206694306350751394027442889765823700307564930106573451869821269475788504119196136104609
- 3431644074153374395772435885256502313780947543195773054518785207209863861162273043345329587547485512
- 7338327972219185035047871897884249287106896182108994171586776120838015161888651454001285859716463013
- 6449651605514938227928344490837674328198921142910431061110868692165527920798201649329374581342150765
- 5118784892767382548793511783235161120855178410837621175281500785185477818607679428641484323323319109
- 7266850032934128914045858204431557610778785762577423838489931572373959838110607812467786358556899652
- 7368845240942528704596435920760579346684324145325596356248748821179120818397034784641754929142248619
- 8816983583681912923190240717129570007687463345058546053618974136529114874878826670127663175041210072
- 0315781088924376640367730911755309040928171196136210539234138733422593767876852625713512243413482449
- 2437863318852768275374310490354455242143571369313856402904000656993625368177991878558718447307705825
- 2974350574866412708465442603847274453318352984893683898897808289018623074484047084490852849403039434
- 2955463852740854759015268816000374772522811781161157423713981950740674175343184146350544342438357451
- 9248611580880039606683439401908987378192440400219832284520765154792113692550747874165836602422185462
- 1946430775152186135581519887540463551761409590543738570052501358093904859672162021606984416156907877
- 1684068127414376614091118139631085599151661481079544515324959921366825499632712373562568414745414312
- 3120604881956549350282357979943767775718356659006902041799336909172824104906231327124424941601428516
- 0962807790636038335841419927091542276842581774992219930572580325951237712012994424840701227968679444
- 7341806792582657934958914767888378915440932631656700608894731093256105619880308605486520877456454524
- 7485353154050111681242847495790437215941553943670290712577865368975422894964011618502443713140843463
- 0354358064772127114350431362548438660924361550031965108550050907158337041502556889102458400418193352
- 0252124498457167679255682218023266396231570964589079686994941373432621181495473897856248821720105582
- 7898453333313654848945088878567519040445959265319521581192448981135290221345503835659827193694931765
- 6578186760047007731691816455034194766774380181590333099302566595666806010250926530115150160622468616
- 3897193090214321417040021914577268584078652097221680980634034097430869072988223097519519831002986126
- 7048908177882768775796117833022329018460019071608747684231522405077436077933069971420826618840794046
- 9258063274247275041565742546714723309962603957286538590552888005911222577468976219282389040655521371
- 9749452232127683384515514576846611277668820788347588586006488657357631652755699941191083466144561867
- 0681274946339286427366151155891224086859707892700750339421987583653597343004106955922676103553305993
- 1059176312793511629714079606501253293619401366506307941570050211188043581494533791320858732548430463
- 6596357544534702368957640754770441557149317686793022777531198821848373019117862893069401115893599512
- 7482991205306812955192982493827214779554101294437734517564251171652621616699918583564687464935792409
- 7724551332802362936675709907697852514226641191193585434501374096079376005086552834228065726478022042
- 0613079516996395332476166228915466846940969145152525634154269767270965428923669684031925350949067384
- 5090202972431809123127018255195138346002937882176207767661470179105698709532770660030841618105920658
- 7486560051483952184824992543254856132508585197436417072553803196406928071563221322173345451876615575
- 5263903183393965684200294607011191290037403223439767010625918954941108166177756219216231211370903139
- 7199510930006010300715333345290159788935879859588478418005253796008798347110926578754895419075386106
- 6220189959789540593437873947063842367677502183369288728660527834544522024058057113629600759746651977
- 7111126309694695034238465105314336670951107606862905878290788220871334642003643903663329809885008513
- 3781496316618857710806631255804432420769864751221658236162083468148414083152527539605062706669652630
- 1902593848744034126606357473771924725215165229394066955245342248129991832656594423759120559882004728
- 6420420670742228727590740971398215723796321454991672967308028648644840683221903368490269899297102009
- 2041186578702517859183575055270334768877563858546273960750997614740057219289818296672620120311458260
- 8158553826922251013825611025429443067962436400899781005440067802134276707642549925936710102284674866
- 2259411752940516675558186269417505939971153767539966509833016157369709227005573096959556492723851825
- 7578755341788875263978855596462447492326407482162854233803633594937489952680601675414219788350902373
- 1057687503281918259052125331849318306100702202678580527851563024324195553938565711330622522462341479
- 7114479325789937362652202228457992303460117710415744094124681972950029114139867615503525998194807352
- 3915452858111822298181564944792756355332235062904962376021888577294081893514505639433389353397765545
- 6340866555282658136000816463334525449484505955566705163107708872505206626022560573629214451674721138
- 8601691629300542051242064155552724019455873595097526255337290938999075288085242342552687896232612745
- 3557578081715309102459635355394814762771969164198426111827588625890580436615487562068163743408004760
- 0164419843802937341468286777176160414285412606425641580937439615912924271363136731776124458993385917
- 7730611332988466552457482834925231194587069989123810600838202270265985625763339190336729400012642906
- 9966838423817943612746986659318961904532222329360316632960149436871828093274304915238932256255191114
- 7300753148128807206426842226981136185520154479808760107287609450269249454061487952597780986360069669
- 1013778141234900206869198389264153767225517687495152040148830312041130202278064596458948058713779967
- 6887349391870379821439167206459086965189722569169850999031020309665736330187721579107878142644572561
- 7411584185877699635635291576611517161175561912146377213801136522636271278503521453330658424042719346
- 5708056180564286269988319327273724685080806372534586774314356471343299136108458711456701768060241563
- 9874524038583363793983563393494459503071442769421392165933515161002806826001862171080275899091634546
- 2460226985867174542310977297306019504557502121786672926863366512580710505001747213369207269807192779
- 0633012919033429182201301171302068612463736153617639480556112267903595998345820736803032156050836640
- 1669154640260872605066519849075749621296331192046086424701059966275204067990852111188739395262221717
- 1839456743584366250259407567787455206883177021018226392892933319946189556214339398753777418233490776
- 3855993540087193532155781063434926469216680197306958779347172225448079118111196392639276480012351772
- 5719274788305783971136690606455254331919032228919360954971843249100904540662729238502740563383854859
- 0188268149435843645843980262611116171765842816097957652506787611795116323992635170032619534150929750
- 0553404886640965835191659794919350863488219261598144843692437545565112204194805526823075332476974088
- 4727787435452359272108804052625835368689199319844609897160844674263673591680055284786340626912717217
- 3171756061677171463475561619807884390311358477716426051047474576636143832085499367219745739979786652
- 2775035398061891408888385909321374375272033623025787795610472928563860851309157784649600087363339203
- 1048977816919904548372115769326147221016937339567708656913761110869153278354055689486050710822954248
- 0918055808095852840667352878148038653802146646757143896547580860434512955393551309586932110862993111
- 0605839939424965760106574952402644946365524442407305990365284908966648040467945517605689027631717191
- 8768727725748903365671778563823216530569212911505032641281573270750113835519789309408910748803426109
- 0882741413711940912309437167869613636072477657104623486150406068547046457718789166038214014347509730
- 5369103110844079695504562377538119827552159521365018775633970735439580120471966019512882510545033173
- 0516216341090518192260525546312264355322592957475728820016262708082360424445903581361990459604491675
- 4037553727206181988999514777161493276079799935405323179303743527584995426817187213747300025933561536
- 1921111292616389162184695669562033564970596509332371688551878420333041807503066505560625174160505262
- 3316640919252238258870955218902881295750521711655979171308253404608433079774654768816669196814476897
- 3284839179217767764271032151745244795073588076328905416731603181192610241700381775659611825654152518
- 0967987602616343017278370327961732925081347047654857656059010727673521385459827689298733297583299446
- 8536565991927202723128419689666325935947726672235001137195026467308449262860959852620522409521822359
- 2003147069826977926672250423655929192492054350354442390940880576201050465309269773134941085727997638
- 0113049279739865584198988765833201593343961046875079635201784729873173044084272669658406096180546546
- 5631930250501495988840192508559631880923328014730387912919579582510129204377653347410891807580724712
- 7240276166629686262222231660704487522921471507146159607733512382721669154552729130788761367040033447
- 7105207700594289972711773659192429913212080970648963125588439119442642483455502072746152267209925644
- 5652834679899490660341741368476155773134407346980037980421412267132037246532107321735737604919320627
- 5564676654903913028689978015277912027247510532924595527398642066245295718008680915733555397019651293
- 1004832314704135049429359651182657240498204431397567031470537098506131461559915459679080382063327112
- 7053976438946130683352466915676444805847905318562649578393545468362970975088640725578236692990650812
- 7064320767425390436885713810940745855659674181134810267297801287659770581626728457561593281266064575
- 3286983567541694373351718691544942980395328095625329671764742784192171054963853414283219862148618952
- 6791483040045423024372446249427695881885130478794805150924022184727268743260289620485985683180743752
- 1486290992133913992180695380744363471106230210202399080166428312197903931088989028681277449139877816
- 0123696349353837904833738861649739886424085640388600121735603712566302824193284413937152603550255365
- 0068469137995125330157088169317619805957660961132814536248638143747081376099733927934071387102183560
- 4437946559576321085972638056113173862779961866282810658000636060566965160500275463200064283833990047
- 0686106215897801359187080238837576895579111713270218719138612446092285094662178800912356646714252845
- 8131688323343861702634545310635732686171417326825210992719583249078323219289804851229823033793785926
- 9722693195895033354126067763684519202799011294351329008525896049061348176846124481858634526732494412
- 3950337024289552856674557637765483130391544907241744699033348963010326960851264053688782221214621521
- 9423825090781889402643536751568910448856832921283602581574800998458320548765308408242561350893597229
- 6031858838858038358185664412153867087676012483101046308447443218801447909336747468844785641481744590
- 9124539810323008859206371015635875651643095961127396401586176978131408795073714288317760436689819626
- 4134750069719405651950455051677423979401968998625278900852374458073288670697417739635725450609854234
- 5678985204250732286070942026394841828669256606166544407204577568393932312265407812478316668801803018
- 4225045200535518686848505584530852538497542612057943053533080747750826496088529445572785003441395589
- 3793350511840302252987061629150596422599960058564895723365317986913669699442786657891252568462604147
- 9811086568557173907213307893310852590333311371858772870349262790271567329168662716674908199318258316
- 6832828500157570780161193169221931514754937755159804654092839991094937420103717085608605881785449005
- 7041041360404351376424689981526806092554011234653295043491805374773561666671046929830956789203164820
- 6393173922124840551203478063211131681337322406321645541558823784609194273808850283831236226654974430
- 0558099898299574258432353764298631465635055283560477090757473282636770439630979234656297949344566413
- 9608514643713039321367742124709044527215406879215426306425972602920189946552981151426126049007638671
- 4173023572727683904155972345066669386646058829201247114417883178223482153389187605836327618181943322
- 7695553112581904847517462905620013468996440716198232054347184611020511315550930226825107491990149608
- 1785626051088590365847451503763849151340003295163991062192405572830081035217619796168322139816924083
- 5763955621165712611219290508716325525855864961663825419359148218187619592329205699550637645818268557
- 5221152787011802994335467415362762077497854054133303136335423682410108464763749063885279841490076464
- 6976485400947963589549754614481376369705916356998368119875250547930693532075707667801484477014247162
- 4190816682249007420711186488154772891718653596776539579933503342728214605416964960098470697958559264
- 3042870363664713071314782330611576419913222420646099898830762685836055527409904784676107604241784215
- 0628517557352999647862552954283674298706645794337580101407402116186144843297657442634285287047785563
- 0830963143527878304194501970294657577773281674685808745393160393725331589928057943463140873586086177
- 8826334927746151184911655130681846713677348823341085136403947939208876886336339461382358344794081569
- 6109142938773471389342377361910964605642444747790820760496602713561689541064448321365980829389097296
- 1891211834291490616389638610693752089534688398334446718982124347807238740745769755450743684674713502
- 4858818399665568196344528811941833172636825050611864900394125520574571203603557802514190435267183721
- 9213848299058032246958424323158984432510396544353505354322921674704077861468485976255744615351188003
- 1430569954927847167454497269761283933251838197222328360707522781292813010656941262948730634268837338
- 1817421706086475482763942423914027532180429519034116351704698074233515560578575624509992532017874996
- 3664047347703898558730650760387099773184312810989789882085435595509432539023718952168202334424557257
- 5307879263398550901645594237339662522335164875058955694217297244895998825089232112034795894154654603
- 0378786175915716613988693268737496847305496532937821475648105793808285300532447080506569294223400109
- 5934829461453907889066162640215013073533003319207456372637707709993999228862122432488020626348508885
- 3036010723436890136064275814252839878594917997961121963797576519245218670960880921371119775000878159
- 3043072934488393095757415924137528597779729189345385050803831986774590025186579172370808574164297153
- 8078840607130686803619824197157747638950725346840456919275953193722370222901558006560760473854735990
- 4477996748749969769427137668695533195125337764098587096683863263926164945608684140374568420719405950
- 7017430354691821509004664939985517413893851975731215682616228622318810967297476060130283311937161140
- 8747270676255856777511995666748615196491297019331808499410961813929649278936090212535443327375064260
- 6242994120327362558244174983450947309453436615907284163193683075719798068231535737155571816122156787
- 9364250138871170232755557793022667858031999308108305763076523320507400139390958079016377176292592837
- 6487479017727412567819055556218050487674699114083997791937654232062337471732470336976335792589151526
- 0315614033321272849194418437150696552087542450598956787961303311646283996346460422090106105779458151
diff --git a/Day01-15/Day11/res/file-open-mode.png b/Day01-15/Day11/res/file-open-mode.png
deleted file mode 100644
index 2d01ad486..000000000
Binary files a/Day01-15/Day11/res/file-open-mode.png and /dev/null differ
diff --git a/Day01-15/Day11/teacher.csv b/Day01-15/Day11/teacher.csv
deleted file mode 100644
index defb8349b..000000000
--- a/Day01-15/Day11/teacher.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-骆昊,38,叫兽
-狄仁杰,25,砖家
diff --git "a/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md" "b/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md"
deleted file mode 100644
index 3fa4e96af..000000000
--- "a/Day01-15/Day11/\346\226\207\344\273\266\345\222\214\345\274\202\345\270\270.md"
+++ /dev/null
@@ -1,274 +0,0 @@
-## 文件和异常
-
-在实际开发中,常常需要对程序中的数据进行[持久化](https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96)操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词,可能需要先科普一下关于[文件系统](https://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F)的知识,对于这个概念,维基百科上给出了很好的诠释,这里不再浪费笔墨。
-
-在Python中实现文件的读写操作其实非常简单,通过Python内置的`open`函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件还是二进制文件)以及做什么样的操作(读、写还是追加),具体的如下表所示。
-
-| 操作模式 | 具体含义 |
-| -------- | -------------------------------- |
-| `'r'` | 读取 (默认) |
-| `'w'` | 写入(会先截断之前的内容) |
-| `'x'` | 写入,如果文件已经存在会产生异常 |
-| `'a'` | 追加,将内容写入到已有文件的末尾 |
-| `'b'` | 二进制模式 |
-| `'t'` | 文本模式(默认) |
-| `'+'` | 更新(既可以读又可以写) |
-
-下面这张图来自于[菜鸟教程](http://www.runoob.com)网站,它展示了如果根据应用程序的需要来设置操作模式。
-
-
-
-### 读写文本文件
-
-读取文本文件时,需要在使用`open`函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为`'r'`(如果不指定,默认值也是`'r'`),然后通过`encoding`参数指定编码(如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码),如果不能保证保存文件时使用的编码方式与encoding参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取失败。下面的例子演示了如何读取一个纯文本文件。
-
-```Python
-def main():
- f = open('致橡树.txt', 'r', encoding='utf-8')
- print(f.read())
- f.close()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-请注意上面的代码,如果`open`函数指定的文件并不存在或者无法打开,那么将引发异常状况导致程序崩溃。为了让代码有一定的健壮性和容错性,我们可以使用Python的异常机制对可能在运行时发生状况的代码进行适当的处理,如下所示。
-
-```Python
-def main():
- f = None
- try:
- f = open('致橡树.txt', 'r', encoding='utf-8')
- print(f.read())
- except FileNotFoundError:
- print('无法打开指定的文件!')
- except LookupError:
- print('指定了未知的编码!')
- except UnicodeDecodeError:
- print('读取文件时解码错误!')
- finally:
- if f:
- f.close()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-在Python中,我们可以将那些在运行时可能会出现状况的代码放在`try`代码块中,在`try`代码块的后面可以跟上一个或多个`except`来捕获可能出现的异常状况。例如在上面读取文件的过程中,文件找不到会引发`FileNotFoundError`,指定了未知的编码会引发`LookupError`,而如果读取文件时无法按指定方式解码会引发`UnicodeDecodeError`,我们在`try`后面跟上了三个`except`分别处理这三种不同的异常状况。最后我们使用`finally`代码块来关闭打开的文件,释放掉程序中获取的外部资源,由于`finally`块的代码不论程序正常还是异常都会执行到(甚至是调用了`sys`模块的`exit`函数退出Python环境,`finally`块都会被执行,因为`exit`函数实质上是引发了`SystemExit`异常),因此我们通常把`finally`块称为“总是执行代码块”,它最适合用来做释放外部资源的操作。如果不愿意在`finally`代码块中关闭文件对象释放资源,也可以使用上下文语法,通过`with`关键字指定文件对象的上下文环境并在离开上下文环境时自动释放文件资源,代码如下所示。
-
-```Python
-def main():
- try:
- with open('致橡树.txt', 'r', encoding='utf-8') as f:
- print(f.read())
- except FileNotFoundError:
- print('无法打开指定的文件!')
- except LookupError:
- print('指定了未知的编码!')
- except UnicodeDecodeError:
- print('读取文件时解码错误!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-除了使用文件对象的`read`方法读取文件之外,还可以使用`for-in`循环逐行读取或者用`readlines`方法将文件按行读取到一个列表容器中,代码如下所示。
-
-```Python
-import time
-
-
-def main():
- # 一次性读取整个文件内容
- with open('致橡树.txt', 'r', encoding='utf-8') as f:
- print(f.read())
-
- # 通过for-in循环逐行读取
- with open('致橡树.txt', mode='r') as f:
- for line in f:
- print(line, end='')
- time.sleep(0.5)
- print()
-
- # 读取文件按行读取到列表中
- with open('致橡树.txt') as f:
- lines = f.readlines()
- print(lines)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-要将文本信息写入文件文件也非常简单,在使用`open`函数时指定好文件名并将文件模式设置为`'w'`即可。注意如果需要对文件内容进行追加式写入,应该将模式设置为`'a'`。如果要写入的文件不存在会自动创建文件而不是引发异常。下面的例子演示了如何将1~9999直接的素数分别写入三个文件中(1~99之间的素数保存在a.txt中,100~999之间的素数保存在b.txt中,1000~9999之间的素数保存在c.txt中)。
-
-```Python
-from math import sqrt
-
-
-def is_prime(n):
- """判断素数的函数"""
- assert n > 0
- for factor in range(2, int(sqrt(n)) + 1):
- if n % factor == 0:
- return False
- return True if n != 1 else False
-
-
-def main():
- filenames = ('a.txt', 'b.txt', 'c.txt')
- fs_list = []
- try:
- for filename in filenames:
- fs_list.append(open(filename, 'w', encoding='utf-8'))
- for number in range(1, 10000):
- if is_prime(number):
- if number < 100:
- fs_list[0].write(str(number) + '\n')
- elif number < 1000:
- fs_list[1].write(str(number) + '\n')
- else:
- fs_list[2].write(str(number) + '\n')
- except IOError as ex:
- print(ex)
- print('写文件时发生错误!')
- finally:
- for fs in fs_list:
- fs.close()
- print('操作完成!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 读写二进制文件
-
-知道了如何读写文本文件要读写二进制文件也就很简单了,下面的代码实现了复制图片文件的功能。
-
-```Python
-def main():
- try:
- with open('guido.jpg', 'rb') as fs1:
- data = fs1.read()
- print(type(data)) #
- with open('吉多.jpg', 'wb') as fs2:
- fs2.write(data)
- except FileNotFoundError as e:
- print('指定的文件无法打开.')
- except IOError as e:
- print('读写文件时出现错误.')
- print('程序执行结束.')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 读写JSON文件
-
-通过上面的讲解,我们已经知道如何将文本数据和二进制数据保存到文件中,那么这里还有一个问题,如果希望把一个列表或者一个字典中的数据保存到文件中又该怎么做呢?答案是将数据以JSON格式进行保存。JSON是“JavaScript Object Notation”的缩写,它本来是JavaScript语言中创建对象的一种字面量语法,现在已经被广泛的应用于跨平台跨语言的数据交换,原因很简单,因为JSON也是纯文本,任何系统任何编程语言处理纯文本都是没有问题的。目前JSON基本上已经取代了XML作为异构系统间交换数据的事实标准。关于JSON的知识,更多的可以参考[JSON的官方网站](http://json.org),从这个网站也可以了解到每种语言处理JSON数据格式可以使用的工具或三方库,下面是一个JSON的简单例子。
-
-```JSON
-{
- 'name': '骆昊',
- 'age': 38,
- 'qq': 957658,
- 'friends': ['王大锤', '白元芳'],
- 'cars': [
- {'brand': 'BYD', 'max_speed': 180},
- {'brand': 'Audi', 'max_speed': 280},
- {'brand': 'Benz', 'max_speed': 320}
- ]
-}
-```
-
-可能大家已经注意到了,上面的JSON跟Python中的字典其实是一样一样的,事实上JSON的数据类型和Python的数据类型是很容易找到对应关系的,如下面两张表所示。
-
-| JSON | Python |
-| ------------------- | ------------ |
-| object | dict |
-| array | list |
-| string | str |
-| number (int / real) | int / float |
-| true / false | True / False |
-| null | None |
-
-| Python | JSON |
-| -------------------------------------- | ------------ |
-| dict | object |
-| list, tuple | array |
-| str | string |
-| int, float, int- & float-derived Enums | number |
-| True / False | true / false |
-| None | null |
-
-我们使用Python中的json模块就可以将字典或列表以JSON格式保存到文件中,代码如下所示。
-
-```Python
-import json
-
-
-def main():
- mydict = {
- 'name': '骆昊',
- 'age': 38,
- 'qq': 957658,
- 'friends': ['王大锤', '白元芳'],
- 'cars': [
- {'brand': 'BYD', 'max_speed': 180},
- {'brand': 'Audi', 'max_speed': 280},
- {'brand': 'Benz', 'max_speed': 320}
- ]
- }
- try:
- with open('data.json', 'w', encoding='utf-8') as fs:
- json.dump(mydict, fs)
- except IOError as e:
- print(e)
- print('保存数据完成!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-json模块主要有四个比较重要的函数,分别是:
-
-- dump - 将Python对象按照JSON格式序列化到文件中
-- dumps - 将Python对象处理成JSON格式的字符串
-- load - 将文件中的JSON数据反序列化成对象
-- loads - 将字符串的内容反序列化成Python对象
-
-这里出现了两个概念,一个叫序列化,一个叫反序列化。自由的百科全书[维基百科](https://zh.wikipedia.org/)上对这两个概念是这样解释的:“序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)”。
-
-目前绝大多数网络数据服务(或称之为网络API)都是基于[HTTP协议](https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE)提供JSON格式的数据,关于HTTP协议的相关知识,可以看看阮一峰老师的[《HTTP协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html),如果想了解国内的网络数据服务,可以看看[聚合数据](https://www.juhe.cn/)和[阿凡达数据](http://www.avatardata.cn/)等网站,国外的可以看看[{API}Search](http://apis.io/)网站。下面的例子演示了如何使用requests模块(封装得足够好的第三方网络访问模块)访问网络API获取国内新闻,如何通过json模块解析JSON数据并显示新闻标题,这个例子使用了[天行数据](https://www.tianapi.com/)提供的国内新闻数据接口,其中的APIKey需要自己到该网站申请。
-
-```Python
-import requests
-import json
-
-
-def main():
- resp = requests.get('http://api.tianapi.com/guonei/?key=APIKey&num=10')
- data_model = json.loads(resp.text)
- for news in data_model['newslist']:
- print(news['title'])
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-在Python中要实现序列化和反序列化除了使用json模块之外,还可以使用pickle和shelve模块,但是这两个模块是使用特有的序列化协议来序列化数据,因此序列化后的数据只能被Python识别。关于这两个模块的相关知识可以自己看看网络上的资料。另外,如果要了解更多的关于Python异常机制的知识,可以看看segmentfault上面的文章[《总结:Python中的异常处理》](https://segmentfault.com/a/1190000007736783),这篇文章不仅介绍了Python中异常机制的使用,还总结了一系列的最佳实践,很值得一读。
\ No newline at end of file
diff --git "a/Day01-15/Day11/\350\207\264\346\251\241\346\240\221.txt" "b/Day01-15/Day11/\350\207\264\346\251\241\346\240\221.txt"
deleted file mode 100644
index 8380e7867..000000000
--- "a/Day01-15/Day11/\350\207\264\346\251\241\346\240\221.txt"
+++ /dev/null
@@ -1,7 +0,0 @@
-我如果爱你
-绝不学攀援的凌霄花
-借你的高枝炫耀自己
-
-我如果爱你
-绝不学痴情的鸟儿
-为绿荫重复单调的歌曲
diff --git a/Day01-15/Day12/res/tel-start-number.png b/Day01-15/Day12/res/tel-start-number.png
deleted file mode 100644
index b1be7a90a..000000000
Binary files a/Day01-15/Day12/res/tel-start-number.png and /dev/null differ
diff --git a/Day01-15/Day12/str1.py b/Day01-15/Day12/str1.py
deleted file mode 100644
index 61b1d81e8..000000000
--- a/Day01-15/Day12/str1.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""
-
-字符串常用操作
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-19
-
-"""
-
-import pyperclip
-
-# 转义字符
-print('My brother\'s name is \'007\'')
-# 原始字符串
-print(r'My brother\'s name is \'007\'')
-
-str = 'hello123world'
-print('he' in str)
-print('her' in str)
-# 字符串是否只包含字母
-print(str.isalpha())
-# 字符串是否只包含字母和数字
-print(str.isalnum())
-# 字符串是否只包含数字
-print(str.isdecimal())
-
-print(str[0:5].isalpha())
-print(str[5:8].isdecimal())
-
-list = ['床前明月光', '疑是地上霜', '举头望明月', '低头思故乡']
-print('-'.join(list))
-sentence = 'You go your way I will go mine'
-words_list = sentence.split()
-print(words_list)
-email = ' jackfrued@126.com '
-print(email)
-print(email.strip())
-print(email.lstrip())
-
-# 将文本放入系统剪切板中
-pyperclip.copy('老虎不发猫你当我病危呀')
-# 从系统剪切板获得文本
-# print(pyperclip.paste())
diff --git a/Day01-15/Day12/str2.py b/Day01-15/Day12/str2.py
deleted file mode 100644
index 23b171216..000000000
--- a/Day01-15/Day12/str2.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""
-
-字符串常用操作 - 实现字符串倒转的方法
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-19
-
-"""
-
-from io import StringIO
-
-
-def reverse_str1(str):
- return str[::-1]
-
-
-def reverse_str2(str):
- if len(str) <= 1:
- return str
- return reverse_str2(str[1:]) + str[0:1]
-
-
-def reverse_str3(str):
- # StringIO对象是Python中的可变字符串
- # 不应该使用不变字符串做字符串连接操作 因为会产生很多无用字符串对象
- rstr = StringIO()
- str_len = len(str)
- for index in range(str_len - 1, -1, -1):
- rstr.write(str[index])
- return rstr.getvalue()
-
-
-def reverse_str4(str):
- return ''.join(str[index] for index in range(len(str) - 1, -1, -1))
-
-
-def reverse_str5(str):
- # 将字符串处理成列表
- str_list = list(str)
- str_len = len(str)
- # 使用zip函数将两个序列合并成一个产生元组的迭代器
- # 每次正好可以取到一前一后两个下标来实现元素的交换
- for i, j in zip(range(str_len // 2), range(str_len - 1, str_len // 2, -1)):
- str_list[i], str_list[j] = str_list[j], str_list[i]
- # 将列表元素连接成字符串
- return ''.join(str_list)
-
-
-if __name__ == '__main__':
- str = 'I love Python'
- print(reverse_str1(str))
- print(str)
- print(reverse_str2(str))
- print(str)
- print(reverse_str3(str))
- print(str)
- print(reverse_str4(str))
- print(str)
- print(reverse_str5(str))
- print(str)
-# 提醒学生注意这是一个面试题: 写出你能想到的实现字符串倒转的代码
diff --git a/Day01-15/Day12/test3.py b/Day01-15/Day12/test3.py
deleted file mode 100644
index 126f19f88..000000000
--- a/Day01-15/Day12/test3.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""
-
-验证输入用户名和QQ号是否有效并给出对应的提示信息
-
-要求:
-用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
-QQ号是5~12的数字且首位不能为0
-
-"""
-
-import re
-
-
-def main():
- username = input('请输入用户名: ')
- qq = input('请输入QQ号: ')
- m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
- if not m1:
- print('请输入有效的用户名.')
- m2 = re.match(r'^[1-9]\d{4,11}$', qq)
- if not m2:
- print('请输入有效的QQ号.')
- if m1 and m2:
- print('你输入的信息是有效的!')
-
-
-if __name__ == '__main__':
- main()
-
diff --git a/Day01-15/Day12/test4.py b/Day01-15/Day12/test4.py
deleted file mode 100644
index ee282b34f..000000000
--- a/Day01-15/Day12/test4.py
+++ /dev/null
@@ -1,27 +0,0 @@
-import re
-
-
-def main():
- # 创建正则表达式对象 使用了前瞻和回顾来保证手机号前后不应该出现数字
- pattern = re.compile(r'(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)')
- sentence = '''
- 重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
- 不是15600998765,也是110或119,王大锤的手机号才是15600998765。
- '''
- # 查找所有匹配并保存到一个列表中
- mylist = re.findall(pattern, sentence)
- print(mylist)
- print('--------华丽的分隔线--------')
- # 通过迭代器取出匹配对象并获得匹配的内容
- for temp in pattern.finditer(sentence):
- print(temp.group())
- print('--------华丽的分隔线--------')
- # 通过search函数指定搜索位置找出所有匹配
- m = pattern.search(sentence)
- while m:
- print(m.group())
- m = pattern.search(sentence, m.end())
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day12/test5.py b/Day01-15/Day12/test5.py
deleted file mode 100644
index a62173ae5..000000000
--- a/Day01-15/Day12/test5.py
+++ /dev/null
@@ -1,12 +0,0 @@
-import re
-
-
-def main():
- sentence = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
- purified = re.sub('[操肏艹草曹]|fuck|shit|傻[比屄逼叉缺吊屌]|煞笔',
- '*', sentence, flags=re.IGNORECASE)
- print(purified)
-
-
-if __name__ == '__main__':
- main()
diff --git "a/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md" "b/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md"
deleted file mode 100644
index d0075ce92..000000000
--- "a/Day01-15/Day12/\345\255\227\347\254\246\344\270\262\345\222\214\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217.md"
+++ /dev/null
@@ -1,189 +0,0 @@
-## 使用正则表达式
-
-### 正则表达式相关知识
-
-在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配模式(如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉)。如果你在Windows操作系统中使用过文件查找并且在指定文件名时使用过通配符(\*和?),那么正则表达式也是与之类似的用来进行文本匹配的工具,只不过比起通配符正则表达式更强大,它能更精确地描述你的需求(当然你付出的代价是书写一个正则表达式比打出一个通配符要复杂得多,要知道任何给你带来好处的东西都是有代价的,就如同学习一门编程语言一样),比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像028-12345678或0813-7654321),这不就是国内的座机号码吗。最初计算机是为了做数学运算而诞生的,处理的信息基本上都是数值,而今天我们在日常工作中处理的信息基本上都是文本数据,我们希望计算机能够识别和处理符合某些模式的文本,正则表达式就显得非常重要了。今天几乎所有的编程语言都提供了对正则表达式操作的支持,Python通过标准库中的re模块来支持正则表达式操作。
-
-我们可以考虑下面一个问题:我们从某个地方(可能是一个文本文件,也可能是网络上的一则新闻)获得了一个字符串,希望在字符串中找出手机号和座机号。当然我们可以设定手机号是11位的数字(注意并不是随机的11位数字,因为你没有见过“25012345678”这样的手机号吧)而座机号跟上一段中描述的模式相同,如果不使用正则表达式要完成这个任务就会很麻烦。
-
-关于正则表达式的相关知识,大家可以阅读一篇非常有名的博客叫[《正则表达式30分钟入门教程》](https://deerchao.net/tutorials/regex/regex.htm),读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。
-
-| 符号 | 解释 | 示例 | 说明 |
-| ------------------ | ----------------------------------------- | ---------------- | -------------------------------------------------- |
-| . | 匹配任意字符 | b.t | 可以匹配bat / but / b#t / b1t等 |
-| \\w | 匹配字母/数字/下划线 | b\\wt | 可以匹配bat / b1t / b_t等
但不能匹配b#t |
-| \\s | 匹配空白字符(包括\r、\n、\t等) | love\\syou | 可以匹配love you |
-| \\d | 匹配数字 | \\d\\d | 可以匹配01 / 23 / 99等 |
-| \\b | 匹配单词的边界 | \\bThe\\b | |
-| ^ | 匹配字符串的开始 | ^The | 可以匹配The开头的字符串 |
-| $ | 匹配字符串的结束 | .exe$ | 可以匹配.exe结尾的字符串 |
-| \\W | 匹配非字母/数字/下划线 | b\\Wt | 可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等 |
-| \\S | 匹配非空白字符 | love\\Syou | 可以匹配love#you等
但不能匹配love you |
-| \\D | 匹配非数字 | \\d\\D | 可以匹配9a / 3# / 0F等 |
-| \\B | 匹配非单词边界 | \\Bio\\B | |
-| [] | 匹配来自字符集的任意单一字符 | [aeiou] | 可以匹配任一元音字母字符 |
-| [^] | 匹配不在字符集中的任意单一字符 | [^aeiou] | 可以匹配任一非元音字母字符 |
-| * | 匹配0次或多次 | \\w* | |
-| + | 匹配1次或多次 | \\w+ | |
-| ? | 匹配0次或1次 | \\w? | |
-| {N} | 匹配N次 | \\w{3} | |
-| {M,} | 匹配至少M次 | \\w{3,} | |
-| {M,N} | 匹配至少M次至多N次 | \\w{3,6} | |
-| \| | 分支 | foo\|bar | 可以匹配foo或者bar |
-| (?#) | 注释 | | |
-| (exp) | 匹配exp并捕获到自动命名的组中 | | |
-| (?<name>exp) | 匹配exp并捕获到名为name的组中 | | |
-| (?:exp) | 匹配exp但是不捕获匹配的文本 | | |
-| (?=exp) | 匹配exp前面的位置 | \\b\\w+(?=ing) | 可以匹配I'm dancing中的danc |
-| (?<=exp) | 匹配exp后面的位置 | (?<=\\bdanc)\\w+\\b | 可以匹配I love dancing and reading中的第一个ing |
-| (?!exp) | 匹配后面不是exp的位置 | | |
-| (?a.\*?b | 将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 |
-| +? | 重复1次或多次,但尽可能少重复 | | |
-| ?? | 重复0次或1次,但尽可能少重复 | | |
-| {M,N}? | 重复M到N次,但尽可能少重复 | | |
-| {M,}? | 重复M次以上,但尽可能少重复 | | |
-
-> **说明:**如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用\\进行转义处理,例如想匹配小数点可以写成\\.就可以了,因为直接写.会匹配任意字符;同理,想匹配圆括号必须写成\\(和\\),否则圆括号被视为正则表达式中的分组。
-
-### Python对正则表达式的支持
-
-Python提供了re模块来支持正则表达式相关操作,下面是re模块中的核心函数。
-
-| 函数 | 说明 |
-| -------------------------------------------- | ------------------------------------------------------------ |
-| compile(pattern, flags=0) | 编译正则表达式返回正则表达式对象 |
-| match(pattern, string, flags=0) | 用正则表达式匹配字符串 成功返回匹配对象 否则返回None |
-| search(pattern, string, flags=0) | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None |
-| split(pattern, string, maxsplit=0, flags=0) | 用正则表达式指定的模式分隔符拆分字符串 返回列表 |
-| sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数 |
-| fullmatch(pattern, string, flags=0) | match函数的完全匹配(从字符串开头到结尾)版本 |
-| findall(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
-| finditer(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
-| purge() | 清除隐式编译的正则表达式的缓存 |
-| re.I / re.IGNORECASE | 忽略大小写匹配标记 |
-| re.M / re.MULTILINE | 多行匹配标记 |
-
-> **说明:**上面提到的re模块中的这些函数,实际开发中也可以用正则表达式对象的方法替代对这些函数的使用,如果一个正则表达式需要重复的使用,那么先通过compile函数编译正则表达式并创建出正则表达式对象无疑是更为明智的选择。
-
-下面我们通过一系列的例子来告诉大家在Python中如何使用正则表达式。
-
-#### 例子1:验证输入用户名和QQ号是否有效并给出对应的提示信息。
-
-```Python
-"""
-
-验证输入用户名和QQ号是否有效并给出对应的提示信息
-
-要求:
-用户名必须由字母、数字或下划线构成且长度在6~20个字符之间
-QQ号是5~12的数字且首位不能为0
-
-"""
-
-import re
-
-
-def main():
- username = input('请输入用户名: ')
- qq = input('请输入QQ号: ')
- # match函数的第一个参数是正则表达式字符串或正则表达式对象
- # 第二个参数是要跟正则表达式做匹配的字符串对象
- m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
- if not m1:
- print('请输入有效的用户名.')
- m2 = re.match(r'^[1-9]\d{4,11}$', qq)
- if not m2:
- print('请输入有效的QQ号.')
- if m1 and m2:
- print('你输入的信息是有效的!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-> **提示**:上面在书写正则表达式时使用了“原始字符串”的写法(在字符串前面加上了r),所谓“原始字符串”就是字符串中的每个字符都是它原始的意义,说得更直接一点就是字符串中没有所谓的转义字符啦。因为正则表达式中有很多元字符和需要进行转义的地方,如果不使用原始字符串就需要将反斜杠写作\\\\,例如表示数字的\\d得书写成\\\\d,这样不仅写起来不方便,阅读的时候也会很吃力。
-
-#### 例子2:从一段文字中提取出国内手机号码。
-
-下面这张图是截止到2017年底,国内三家运营商推出的手机号段。
-
-
-
-```Python
-import re
-
-
-def main():
- # 创建正则表达式对象 使用了前瞻和回顾来保证手机号前后不应该出现数字
- pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)')
- sentence = '''
- 重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
- 不是15600998765,也是110或119,王大锤的手机号才是15600998765。
- '''
- # 查找所有匹配并保存到一个列表中
- mylist = re.findall(pattern, sentence)
- print(mylist)
- print('--------华丽的分隔线--------')
- # 通过迭代器取出匹配对象并获得匹配的内容
- for temp in pattern.finditer(sentence):
- print(temp.group())
- print('--------华丽的分隔线--------')
- # 通过search函数指定搜索位置找出所有匹配
- m = pattern.search(sentence)
- while m:
- print(m.group())
- m = pattern.search(sentence, m.end())
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-> **说明**:上面匹配国内手机号的正则表达式并不够好,因为像14开头的号码只有145或147,而上面的正则表达式并没有考虑这种情况,要匹配国内手机号,更好的正则表达式的写法是:`(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)`,国内最近好像有19和16开头的手机号了,但是这个暂时不在我们考虑之列。
-
-#### 例子3:替换字符串中的不良内容
-
-```Python
-import re
-
-
-def main():
- sentence = '你丫是傻叉吗? 我操你大爷的. Fuck you.'
- purified = re.sub('[操肏艹草曹]|fuck|shit|傻[比屄逼叉缺吊屌]|煞笔',
- '*', sentence, flags=re.IGNORECASE)
- print(purified) # 你丫是*吗? 我*你大爷的. * you.
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-> **说明**:re模块的正则表达式相关函数中都有一个flags参数,它代表了正则表达式的匹配标记,可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为flags参数指定多个值,可以使用[按位或运算符](http://www.runoob.com/python/python-operators.html#ysf5)进行叠加,如`flags=re.I | re.M`。
-
-#### 例子4:拆分长字符串
-
-```Python
-import re
-
-
-def main():
- poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
- sentence_list = re.split(r'[,。, .]', poem)
- while '' in sentence_list:
- sentence_list.remove('')
- print(sentence_list) # ['窗前明月光', '疑是地上霜', '举头望明月', '低头思故乡']
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 后话
-
-如果要从事爬虫类应用的开发,那么正则表达式一定是一个非常好的助手,因为它可以帮助我们迅速的从网页代码中发现某种我们指定的模式并提取出我们需要的信息,当然对于初学者来收,要编写一个正确的适当的正则表达式可能并不是一件容易的事情(当然有些常用的正则表达式可以直接在网上找找),所以实际开发爬虫应用的时候,有很多人会选择[Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/)或[Lxml](http://lxml.de/)来进行匹配和信息的提取,前者简单方便但是性能较差,后者既好用性能也好,但是安装稍嫌麻烦,这些内容我们会在后期的爬虫专题中为大家介绍。
\ No newline at end of file
diff --git a/Day01-15/Day13/asyncio1.py b/Day01-15/Day13/asyncio1.py
deleted file mode 100644
index c0763a68d..000000000
--- a/Day01-15/Day13/asyncio1.py
+++ /dev/null
@@ -1,32 +0,0 @@
-"""
-
-异步I/O操作 - asyncio模块
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-import asyncio
-import threading
-# import time
-
-
-@asyncio.coroutine
-def hello():
- print('%s: hello, world!' % threading.current_thread())
- # 休眠不会阻塞主线程因为使用了异步I/O操作
- # 注意有yield from才会等待休眠操作执行完成
- yield from asyncio.sleep(2)
- # asyncio.sleep(1)
- # time.sleep(1)
- print('%s: goodbye, world!' % threading.current_thread())
-
-
-loop = asyncio.get_event_loop()
-tasks = [hello(), hello()]
-# 等待两个异步I/O操作执行结束
-loop.run_until_complete(asyncio.wait(tasks))
-print('game over!')
-loop.close()
diff --git a/Day01-15/Day13/asyncio2.py b/Day01-15/Day13/asyncio2.py
deleted file mode 100644
index b23b1d257..000000000
--- a/Day01-15/Day13/asyncio2.py
+++ /dev/null
@@ -1,27 +0,0 @@
-"""
-
-异步I/O操作 - async和await
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-import asyncio
-import threading
-
-
-# 通过async修饰的函数不再是普通函数而是一个协程
-# 注意async和await将在Python 3.7中作为关键字出现
-async def hello():
- print('%s: hello, world!' % threading.current_thread())
- await asyncio.sleep(2)
- print('%s: goodbye, world!' % threading.current_thread())
-
-
-loop = asyncio.get_event_loop()
-tasks = [hello(), hello()]
-# 等待两个异步I/O操作执行结束
-loop.run_until_complete(asyncio.wait(tasks))
-loop.close()
diff --git a/Day01-15/Day13/asyncio3.py b/Day01-15/Day13/asyncio3.py
deleted file mode 100644
index 514ab4fed..000000000
--- a/Day01-15/Day13/asyncio3.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-
-异步I/O操作 - asyncio模块
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-import asyncio
-
-
-async def wget(host):
- print('wget %s...' % host)
- connect = asyncio.open_connection(host, 80)
- # 异步方式等待连接结果
- reader, writer = await connect
- header = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' % host
- writer.write(header.encode('utf-8'))
- # 异步I/O方式执行写操作
- await writer.drain()
- while True:
- # 异步I/O方式执行读操作
- line = await reader.readline()
- if line == b'\r\n':
- break
- print('%s header > %s' % (host, line.decode('utf-8').rstrip()))
- writer.close()
-
-
-loop = asyncio.get_event_loop()
-# 通过生成式语法创建一个装了三个协程的列表
-hosts_list = ['www.sina.com.cn', 'www.sohu.com', 'www.163.com']
-tasks = [wget(host) for host in hosts_list]
-# 下面的方法将异步I/O操作放入EventLoop直到执行完毕
-loop.run_until_complete(asyncio.wait(tasks))
-loop.close()
diff --git a/Day01-15/Day13/coroutine1.py b/Day01-15/Day13/coroutine1.py
deleted file mode 100644
index 3d4cfefec..000000000
--- a/Day01-15/Day13/coroutine1.py
+++ /dev/null
@@ -1,42 +0,0 @@
-"""
-
-使用协程 - 模拟快递中心派发快递
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-from time import sleep
-from random import random
-
-
-def build_deliver_man(man_id):
- total = 0
- while True:
- total += 1
- print('%d号快递员准备接今天的第%d单.' % (man_id, total))
- pkg = yield
- print('%d号快递员收到编号为%s的包裹.' % (man_id, pkg))
- sleep(random() * 3)
-
-
-def package_center(deliver_man, max_per_day):
- num = 1
- deliver_man.send(None)
- # next(deliver_man)
- while num <= max_per_day:
- package_id = 'PKG-%d' % num
- deliver_man.send(package_id)
- num += 1
- sleep(0.1)
- deliver_man.close()
- print('今天的包裹派送完毕!')
-
-
-dm = build_deliver_man(1)
-package_center(dm, 10)
-
-# 两个函数虽然没有调用关系但是创建快递员的函数作为一个协程协助了快递中心函数完成任务
-# 想一想如果有多个快递员的时候应该如何处理
diff --git a/Day01-15/Day13/coroutine2.py b/Day01-15/Day13/coroutine2.py
deleted file mode 100644
index 61333ae4d..000000000
--- a/Day01-15/Day13/coroutine2.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""
-
-使用协程 - 查看协程的状态
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-from time import sleep
-from inspect import getgeneratorstate
-
-
-def build_deliver_man(man_id):
- total = 0
- while True:
- total += 1
- print('%d号快递员准备接今天的第%d单.' % (man_id, total))
- pkg = yield
- print('%d号快递员收到编号为%s的包裹.' % (man_id, pkg))
- sleep(0.5)
-
-
-def package_center(deliver_man, max_per_day):
- num = 1
- # 创建状态(GEN_CREATED) - 等待开始执行
- print(getgeneratorstate(deliver_man))
- deliver_man.send(None)
- # 挂起状态(GEN_SUSPENDED) - 在yield表达式处暂停
- print(getgeneratorstate(deliver_man))
- # next(deliver_man)
- while num <= max_per_day:
- package_id = 'PKG-%d' % num
- deliver_man.send(package_id)
- num += 1
- deliver_man.close()
- # 结束状态(GEN_CLOSED) - 执行完毕
- print(getgeneratorstate(deliver_man))
- print('今天的包裹派送完毕!')
-
-
-dm = build_deliver_man(1)
-package_center(dm, 10)
diff --git a/Day01-15/Day13/generator1.py b/Day01-15/Day13/generator1.py
deleted file mode 100644
index 0f6f44886..000000000
--- a/Day01-15/Day13/generator1.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""
-
-生成器 - 生成器语法
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-seq = [x * x for x in range(10)]
-print(seq)
-
-gen = (x * x for x in range(10))
-print(gen)
-for x in gen:
- print(x)
-
-num = 10
-gen = (x ** y for x, y in zip(range(1, num), range(num - 1, 0, -1)))
-print(gen)
-n = 1
-while n < num:
- print(next(gen))
- n += 1
diff --git a/Day01-15/Day13/generator2.py b/Day01-15/Day13/generator2.py
deleted file mode 100644
index 60c3a4df1..000000000
--- a/Day01-15/Day13/generator2.py
+++ /dev/null
@@ -1,21 +0,0 @@
-"""
-
-生成器 - 使用yield关键字
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-21
-
-"""
-
-
-def fib(num):
- n, a, b = 0, 0, 1
- while n < num:
- yield b
- a, b = b, a + b
- n += 1
-
-
-for x in fib(20):
- print(x)
diff --git a/Day01-15/Day13/multiprocess1.py b/Day01-15/Day13/multiprocess1.py
deleted file mode 100644
index 7309b96e6..000000000
--- a/Day01-15/Day13/multiprocess1.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""
-
-使用Process类创建多个进程
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-# 通过下面程序的执行结果可以证实 父进程在创建子进程时复制了进程及其数据结构
-# 每个进程都有自己独立的内存空间 所以进程之间共享数据只能通过IPC的方式
-
-
-from multiprocessing import Process, Queue
-from time import sleep
-
-
-def sub_task(string, q):
- number = q.get()
- while number:
- print('%d: %s' % (number, string))
- sleep(0.001)
- number = q.get()
-
-
-def main():
- q = Queue(10)
- for number in range(1, 11):
- q.put(number)
- Process(target=sub_task, args=('Ping', q)).start()
- Process(target=sub_task, args=('Pong', q)).start()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/multiprocess2.py b/Day01-15/Day13/multiprocess2.py
deleted file mode 100644
index 6fdeb2074..000000000
--- a/Day01-15/Day13/multiprocess2.py
+++ /dev/null
@@ -1,35 +0,0 @@
-"""
-
-实现进程间的通信
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-import multiprocessing
-import os
-
-
-def sub_task(queue):
- print('子进程进程号:', os.getpid())
- counter = 0
- while counter < 1000:
- queue.put('Pong')
- counter += 1
-
-
-if __name__ == '__main__':
- print('当前进程号:', os.getpid())
- queue = multiprocessing.Queue()
- p = multiprocessing.Process(target=sub_task, args=(queue,))
- p.start()
- counter = 0
- while counter < 1000:
- queue.put('Ping')
- counter += 1
- p.join()
- print('子任务已经完成.')
- for _ in range(2000):
- print(queue.get(), end='')
diff --git a/Day01-15/Day13/multiprocess3.py b/Day01-15/Day13/multiprocess3.py
deleted file mode 100644
index b82ab7637..000000000
--- a/Day01-15/Day13/multiprocess3.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""
-
-创建进程调用其他程序
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-import subprocess
-import sys
-
-def main():
- # 通过sys.argv获取命令行参数
- if len(sys.argv) > 1:
- # 第一个命令行参数是程序本身所以从第二个开始取
- for index in range(1, len(sys.argv)):
- try:
- # 通过subprocess模块的call函数启动子进程
- status = subprocess.call(sys.argv[index])
- except FileNotFoundError:
- print('不能执行%s命令' % sys.argv[index])
- else:
- print('请使用命令行参数指定要执行的进程')
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/multiprocess4.py b/Day01-15/Day13/multiprocess4.py
deleted file mode 100644
index ebcbb9dd8..000000000
--- a/Day01-15/Day13/multiprocess4.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from time import time
-
-
-def main():
- total = 0
- number_list = [x for x in range(1, 100000001)]
- start = time()
- for number in number_list:
- total += number
- print(total)
- end = time()
- print('Execution time: %.3fs' % (end - start))
-
-
-if __name__ == '__main__':
- main()
\ No newline at end of file
diff --git a/Day01-15/Day13/multithread1.py b/Day01-15/Day13/multithread1.py
deleted file mode 100644
index 3b678101d..000000000
--- a/Day01-15/Day13/multithread1.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""
-
-使用多线程的情况 - 模拟多个下载任务
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-from random import randint
-from time import time, sleep
-import atexit
-import _thread
-
-
-def download_task(filename):
- print('开始下载%s...' % filename)
- time_to_download = randint(5, 10)
- print('剩余时间%d秒.' % time_to_download)
- sleep(time_to_download)
- print('%s下载完成!' % filename)
-
-
-def shutdown_hook(start):
- end = time()
- print('总共耗费了%.3f秒.' % (end - start))
-
-
-def main():
- start = time()
- # 将多个下载任务放到多个线程中执行
- thread1 = _thread.start_new_thread(download_task, ('Python从入门到住院.pdf',))
- thread2 = _thread.start_new_thread(download_task, ('Peking Hot.avi',))
- # 注册关机钩子在程序执行结束前计算执行时间
- atexit.register(shutdown_hook, start)
-
-
-if __name__ == '__main__':
- main()
-
-# 执行这里的代码会引发致命错误(不要被这个词吓到) 因为主线程结束后下载线程再想执行就会出问题
-# 需要说明一下 由于_thread模块属于比较底层的线程操作而且不支持守护线程的概念
-# 在实际开发中会有诸多不便 因此我们推荐使用threading模块提供的高级操作进行多线程编程
diff --git a/Day01-15/Day13/multithread2.py b/Day01-15/Day13/multithread2.py
deleted file mode 100644
index 5d17915cf..000000000
--- a/Day01-15/Day13/multithread2.py
+++ /dev/null
@@ -1,36 +0,0 @@
-"""
-
-使用多线程的情况 - 模拟多个下载任务
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-from random import randint
-from threading import Thread
-from time import time, sleep
-
-
-def download_task(filename):
- print('开始下载%s...' % filename)
- time_to_download = randint(5, 10)
- sleep(time_to_download)
- print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
-
-
-def main():
- start = time()
- thread1 = Thread(target=download_task, args=('Python从入门到住院.pdf',))
- thread1.start()
- thread2 = Thread(target=download_task, args=('Peking Hot.avi',))
- thread2.start()
- thread1.join()
- thread2.join()
- end = time()
- print('总共耗费了%.3f秒' % (end - start))
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/multithread3.py b/Day01-15/Day13/multithread3.py
deleted file mode 100644
index 5baeb8586..000000000
--- a/Day01-15/Day13/multithread3.py
+++ /dev/null
@@ -1,47 +0,0 @@
-"""
-
-使用多线程的情况 - 模拟多个下载任务
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-from random import randint
-from time import time, sleep
-import threading
-
-
-class DownloadTask(threading.Thread):
-
- def __init__(self, filename):
- super().__init__()
- self._filename = filename
-
- def run(self):
- print('开始下载%s...' % self._filename)
- time_to_download = randint(5, 10)
- print('剩余时间%d秒.' % time_to_download)
- sleep(time_to_download)
- print('%s下载完成!' % self._filename)
-
-
-def main():
- start = time()
- # 将多个下载任务放到多个线程中执行
- # 通过自定义的线程类创建线程对象 线程启动后会回调执行run方法
- thread1 = DownloadTask('Python从入门到住院.pdf')
- thread1.start()
- thread2 = DownloadTask('Peking Hot.avi')
- thread2.start()
- thread1.join()
- thread2.join()
- end = time()
- print('总共耗费了%.3f秒' % (end - start))
-
-
-if __name__ == '__main__':
- main()
-
-# 请注意通过threading.Thread创建的线程默认是非守护线程
diff --git a/Day01-15/Day13/multithread4.py b/Day01-15/Day13/multithread4.py
deleted file mode 100644
index babe91528..000000000
--- a/Day01-15/Day13/multithread4.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""
-
-使用多线程的情况 - 耗时间的任务在独立的线程中执行
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-import time
-import tkinter
-import tkinter.messagebox
-from threading import Thread
-
-
-def main():
-
- class DownloadTaskHandler(Thread):
-
- def run(self):
- # 模拟下载任务需要花费10秒钟时间
- time.sleep(10)
- tkinter.messagebox.showinfo('提示', '下载完成!')
- # 启用下载按钮
- button1.config(state=tkinter.NORMAL)
-
- def download():
- # 禁用下载按钮
- button1.config(state=tkinter.DISABLED)
- # 通过daemon参数将线程设置为守护线程(主程序退出就不再保留执行)
- DownloadTaskHandler(daemon=True).start()
-
- def show_about():
- tkinter.messagebox.showinfo('关于', '作者: 骆昊(v1.0)')
-
- top = tkinter.Tk()
- top.title('单线程')
- top.geometry('200x150')
- top.wm_attributes('-topmost', 1)
-
- panel = tkinter.Frame(top)
- button1 = tkinter.Button(panel, text='下载', command=download)
- button1.pack(side='left')
- button2 = tkinter.Button(panel, text='关于', command=show_about)
- button2.pack(side='right')
- panel.pack(side='bottom')
-
- tkinter.mainloop()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/multithread5.py b/Day01-15/Day13/multithread5.py
deleted file mode 100644
index f23ef9a5f..000000000
--- a/Day01-15/Day13/multithread5.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""
-
-多个线程共享数据 - 没有锁的情况
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-from time import sleep
-from threading import Thread, Lock
-
-
-class Account(object):
-
- def __init__(self):
- self._balance = 0
- self._lock = Lock()
-
- def deposit(self, money):
- # 先获取锁才能执行后续的代码
- self._lock.acquire()
- try:
- new_balance = self._balance + money
- sleep(0.01)
- self._balance = new_balance
- finally:
- # 这段代码放在finally中保证释放锁的操作一定要执行
- self._lock.release()
-
- @property
- def balance(self):
- return self._balance
-
-
-class AddMoneyThread(Thread):
-
- def __init__(self, account, money):
- super().__init__()
- self._account = account
- self._money = money
-
- def run(self):
- self._account.deposit(self._money)
-
-
-def main():
- account = Account()
- threads = []
- # 创建100个存款的线程向同一个账户中存钱
- for _ in range(100):
- t = AddMoneyThread(account, 1)
- threads.append(t)
- t.start()
- # 等所有存款的线程都执行完毕∫
- for t in threads:
- t.join()
- print('账户余额为: ¥%d元' % account.balance)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/multithread6.py b/Day01-15/Day13/multithread6.py
deleted file mode 100644
index ad9ba5982..000000000
--- a/Day01-15/Day13/multithread6.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""
-
-多个线程共享数据 - 有锁的情况
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-import time
-import threading
-
-
-class Account(object):
-
- def __init__(self):
- self._balance = 0
- self._lock = threading.Lock()
-
- def deposit(self, money):
- # 获得锁后代码才能继续执行
- self._lock.acquire()
- try:
- new_balance = self._balance + money
- time.sleep(0.01)
- self._balance = new_balance
- finally:
- # 操作完成后一定要记着释放锁
- self._lock.release()
-
- @property
- def balance(self):
- return self._balance
-
-
-if __name__ == '__main__':
- account = Account()
- # 创建100个存款的线程向同一个账户中存钱
- for _ in range(100):
- threading.Thread(target=account.deposit, args=(1,)).start()
- # 等所有存款的线程都执行完毕
- time.sleep(2)
- print('账户余额为: ¥%d元' % account.balance)
-
-# 想一想结果为什么不是我们期望的100元
diff --git a/Day01-15/Day13/res/macos-monitor.png b/Day01-15/Day13/res/macos-monitor.png
deleted file mode 100644
index 3d1b88b0f..000000000
Binary files a/Day01-15/Day13/res/macos-monitor.png and /dev/null differ
diff --git a/Day01-15/Day13/singlethread1.py b/Day01-15/Day13/singlethread1.py
deleted file mode 100644
index 85aed3f1b..000000000
--- a/Day01-15/Day13/singlethread1.py
+++ /dev/null
@@ -1,31 +0,0 @@
-"""
-
-不使用多线程的情况 - 模拟多个下载任务
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-from random import randint
-from time import time, sleep
-
-
-def download_task(filename):
- print('开始下载%s...' % filename)
- time_to_download = randint(5, 10)
- sleep(time_to_download)
- print('下载完成! 耗费了%d秒' % time_to_download)
-
-
-def main():
- start = time()
- download_task('Python从入门到住院.pdf')
- download_task('Peking Hot.avi')
- end = time()
- print('总共耗费了%.2f秒.' % (end - start))
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/singlethread2.py b/Day01-15/Day13/singlethread2.py
deleted file mode 100644
index cd33a89a8..000000000
--- a/Day01-15/Day13/singlethread2.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""
-
-不使用多线程的情况 - 耗时间的任务阻塞主事件循环
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-20
-
-"""
-
-import time
-import tkinter
-import tkinter.messagebox
-
-
-def download():
- # 模拟下载任务需要花费10秒钟时间
- time.sleep(10)
- tkinter.messagebox.showinfo('提示', '下载完成!')
-
-
-def show_about():
- tkinter.messagebox.showinfo('关于', '作者: 骆昊(v1.0)')
-
-
-def main():
- top = tkinter.Tk()
- top.title('单线程')
- top.geometry('200x150')
- top.wm_attributes('-topmost', True)
-
- panel = tkinter.Frame(top)
- button1 = tkinter.Button(panel, text='下载', command=download)
- button1.pack(side='left')
- button2 = tkinter.Button(panel, text='关于', command=show_about)
- button2.pack(side='right')
- panel.pack(side='bottom')
-
- tkinter.mainloop()
-
-
-if __name__ == '__main__':
- main()
-
-
-# 在不使用多线程的情况下 一旦点击下载按钮 由于该操作需要花费10秒中的时间
-# 整个主消息循环也会被阻塞10秒钟无法响应其他的事件
-# 事实上 对于没有因果关系的子任务 这种顺序执行的方式并不合理
diff --git a/Day01-15/Day13/test2.py b/Day01-15/Day13/test2.py
deleted file mode 100644
index 952b7c7c2..000000000
--- a/Day01-15/Day13/test2.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import time
-from threading import Thread, Lock
-
-
-class Account(object):
-
- def __init__(self, balance=0):
- self._balance = balance
- self._lock = Lock()
-
- @property
- def balance(self):
- return self._balance
-
- def deposit(self, money):
- # 当多个线程同时访问一个资源的时候 就有可能因为竞争资源导致资源的状态错误
- # 被多个线程访问的资源我们通常称之为临界资源 对临界资源的访问需要加上保护
- if money > 0:
- self._lock.acquire()
- try:
- new_balance = self._balance + money
- time.sleep(0.01)
- self._balance = new_balance
- finally:
- self._lock.release()
-
-
-class AddMoneyThread(Thread):
-
- def __init__(self, account):
- super().__init__()
- self._account = account
-
- def run(self):
- self._account.deposit(1)
-
-
-def main():
- account = Account(1000)
- tlist = []
- for _ in range(100):
- t = AddMoneyThread(account)
- tlist.append(t)
- t.start()
- for t in tlist:
- t.join()
- print('账户余额: %d元' % account.balance)
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day13/test3.py b/Day01-15/Day13/test3.py
deleted file mode 100644
index 5cfcd21fc..000000000
--- a/Day01-15/Day13/test3.py
+++ /dev/null
@@ -1,69 +0,0 @@
-from random import randint
-from threading import Thread
-from time import sleep
-
-import pygame
-
-
-class Color(object):
- BLACK = (0, 0, 0)
- WHITE = (255, 255, 255)
- GRAY = (242, 242, 242)
-
- @staticmethod
- def random_color():
- r = randint(0, 255)
- g = randint(0, 255)
- b = randint(0, 255)
- return r, g, b
-
-
-class Car(object):
-
- def __init__(self, x, y, color):
- self._x = x
- self._y = y
- self._color = color
-
- def move(self):
- if self._x + 80 < 950:
- self._x += randint(1, 10)
-
- def draw(self, screen):
- pygame.draw.rect(screen, self._color,
- (self._x, self._y, 80, 40), 0)
-
-
-def main():
-
- class BackgroundTask(Thread):
-
- def run(self):
- while True:
- screen.fill(Color.GRAY)
- pygame.draw.line(screen, Color.BLACK, (130, 0), (130, 600), 4)
- pygame.draw.line(screen, Color.BLACK, (950, 0), (950, 600), 4)
- for car in cars:
- car.draw(screen)
- pygame.display.flip()
- sleep(0.05)
- for car in cars:
- car.move()
-
- cars = []
- for index in range(5):
- temp = Car(50, 50 + 120 * index, Color.random_color())
- cars.append(temp)
- pygame.init()
- screen = pygame.display.set_mode((1000, 600))
- BackgroundTask(daemon=True).start()
- running = True
- while running:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- running = False
- pygame.quit()
-
-
-if __name__ == '__main__':
- main()
diff --git "a/Day01-15/Day13/\350\277\233\347\250\213\345\222\214\347\272\277\347\250\213.md" "b/Day01-15/Day13/\350\277\233\347\250\213\345\222\214\347\272\277\347\250\213.md"
deleted file mode 100644
index 89d6ad665..000000000
--- "a/Day01-15/Day13/\350\277\233\347\250\213\345\222\214\347\272\277\347\250\213.md"
+++ /dev/null
@@ -1,499 +0,0 @@
-## 进程和线程
-
-今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验。因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”,应该是程序员必备技能之一。为此,我们需要先讨论两个概念,一个叫进程,一个叫线程。
-
-### 概念
-
-进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。
-
-一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程,多个线程共享了CPU的执行时间。使用多线程实现并发编程为程序带来的好处是不言而喻的,最主要的体现在提升程序的性能和改善用户体验,今天我们使用的软件几乎都用到了多线程技术,这一点可以利用系统自带的进程监控工具(如macOS中的“活动监视器”、Windows中的“任务管理器”)来证实,如下图所示。
-
-
-
-当然多线程也并不是没有坏处,站在其他进程的角度,多线程的程序对其他程序并不友好,因为它占用了更多的CPU执行时间,导致其他程序无法获得足够的CPU执行时间;另一方面,站在开发者的角度,编写和调试多线程的程序都对开发者有较高的要求,对于初学者来说更加困难。
-
-Python既支持多进程又支持多线程,因此使用Python实现并发编程主要有3种方式:多进程、多线程、多进程+多线程。
-
-### Python中的多进程
-
-Unix和Linux操作系统上提供了`fork()`系统调用来创建进程,调用`fork()`函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。`fork()`函数非常特殊它会返回两次,父进程中可以通过`fork()`函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了`fork()`函数。由于Windows系统没有`fork()`调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的`Process`类来创建子进程,而且该模块还提供了更高级的封装,例如批量启动进程的进程池(`Pool`)、用于进程间通信的队列(`Queue`)和管道(`Pipe`)等。
-
-下面用一个下载文件的例子来说明使用多进程和不使用多进程到底有什么差别,先看看下面的代码。
-
-```Python
-from random import randint
-from time import time, sleep
-
-
-def download_task(filename):
- print('开始下载%s...' % filename)
- time_to_download = randint(5, 10)
- sleep(time_to_download)
- print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
-
-
-def main():
- start = time()
- download_task('Python从入门到住院.pdf')
- download_task('Peking Hot.avi')
- end = time()
- print('总共耗费了%.2f秒.' % (end - start))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-下面是运行程序得到的一次运行结果。
-
-```Shell
-开始下载Python从入门到住院.pdf...
-Python从入门到住院.pdf下载完成! 耗费了6秒
-开始下载Peking Hot.avi...
-Peking Hot.avi下载完成! 耗费了7秒
-总共耗费了13.01秒.
-```
-
-从上面的例子可以看出,如果程序中的代码只能按顺序一点点的往下执行,那么即使执行两个毫不相关的下载任务,也需要先等待一个文件下载完成后才能开始下一个下载任务,很显然这并不合理也没有效率。接下来我们使用多进程的方式将两个下载任务放到不同的进程中,代码如下所示。
-
-```Python
-from multiprocessing import Process
-from os import getpid
-from random import randint
-from time import time, sleep
-
-
-def download_task(filename):
- print('启动下载进程,进程号[%d].' % getpid())
- print('开始下载%s...' % filename)
- time_to_download = randint(5, 10)
- sleep(time_to_download)
- print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
-
-
-def main():
- start = time()
- p1 = Process(target=download_task, args=('Python从入门到住院.pdf', ))
- p1.start()
- p2 = Process(target=download_task, args=('Peking Hot.avi', ))
- p2.start()
- p1.join()
- p2.join()
- end = time()
- print('总共耗费了%.2f秒.' % (end - start))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-在上面的代码中,我们通过`Process`类创建了进程对象,通过`target`参数我们传入一个函数来表示进程启动后要执行的代码,后面的`args`是一个元组,它代表了传递给函数的参数。`Process`对象的`start`方法用来启动进程,而`join`方法表示等待进程执行结束。运行上面的代码可以明显发现两个下载任务“同时”启动了,而且程序的执行时间将大大缩短,不再是两个任务的时间总和。下面是程序的一次执行结果。
-
-```Shell
-启动下载进程,进程号[1530].
-开始下载Python从入门到住院.pdf...
-启动下载进程,进程号[1531].
-开始下载Peking Hot.avi...
-Peking Hot.avi下载完成! 耗费了7秒
-Python从入门到住院.pdf下载完成! 耗费了10秒
-总共耗费了10.01秒.
-```
-
-我们也可以使用subprocess模块中的类和函数来创建和启动子进程,然后通过管道来和子进程通信,这些内容我们不在此进行讲解,有兴趣的读者可以自己了解这些知识。接下来我们将重点放在如何实现两个进程间的通信。我们启动两个进程,一个输出Ping,一个输出Pong,两个进程输出的Ping和Pong加起来一共10个。听起来很简单吧,但是如果这样写可是错的哦。
-
-```Python
-from multiprocessing import Process
-from time import sleep
-
-counter = 0
-
-
-def sub_task(string):
- global counter
- while counter < 10:
- print(string, end='', flush=True)
- counter += 1
- sleep(0.01)
-
-
-def main():
- Process(target=sub_task, args=('Ping', )).start()
- Process(target=sub_task, args=('Pong', )).start()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-看起来没毛病,但是最后的结果是Ping和Pong各输出了10个,Why?当我们在程序中创建进程的时候,子进程复制了父进程及其所有的数据结构,每个子进程有自己独立的内存空间,这也就意味着两个子进程中各有一个`counter`变量,所以结果也就可想而知了。要解决这个问题比较简单的办法是使用multiprocessing模块中的`Queue`类,它是可以被多个进程共享的队列,底层是通过管道和[信号量(semaphore)]()机制来实现的,有兴趣的读者可以自己尝试一下。
-
-
-### Python中的多线程
-
-在Python早期的版本中就引入了thread模块(现在名为_thread)来实现多线程编程,然而该模块过于底层,而且很多功能都没有提供,因此目前的多线程开发我们推荐使用threading模块,该模块对多线程编程提供了更好的面向对象的封装。我们把刚才下载文件的例子用多线程的方式来实现一遍。
-
-```Python
-from random import randint
-from threading import Thread
-from time import time, sleep
-
-
-def download(filename):
- print('开始下载%s...' % filename)
- time_to_download = randint(5, 10)
- sleep(time_to_download)
- print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
-
-
-def main():
- start = time()
- t1 = Thread(target=download, args=('Python从入门到住院.pdf',))
- t1.start()
- t2 = Thread(target=download, args=('Peking Hot.avi',))
- t2.start()
- t1.join()
- t2.join()
- end = time()
- print('总共耗费了%.3f秒' % (end - start))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-我们可以直接使用threading模块的`Thread`类来创建线程,但是我们之前讲过一个非常重要的概念叫“继承”,我们可以从已有的类创建新类,因此也可以通过继承`Thread`类的方式来创建自定义的线程类,然后再创建线程对象并启动线程。代码如下所示。
-
-```Python
-from random import randint
-from threading import Thread
-from time import time, sleep
-
-
-class DownloadTask(Thread):
-
- def __init__(self, filename):
- super().__init__()
- self._filename = filename
-
- def run(self):
- print('开始下载%s...' % self._filename)
- time_to_download = randint(5, 10)
- sleep(time_to_download)
- print('%s下载完成! 耗费了%d秒' % (self._filename, time_to_download))
-
-
-def main():
- start = time()
- t1 = DownloadTask('Python从入门到住院.pdf')
- t1.start()
- t2 = DownloadTask('Peking Hot.avi')
- t2.start()
- t1.join()
- t2.join()
- end = time()
- print('总共耗费了%.2f秒.' % (end - start))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-因为多个线程可以共享进程的内存空间,因此要实现多个线程间的通信相对简单,大家能想到的最直接的办法就是设置一个全局变量,多个线程共享这个全局变量即可。但是当多个线程共享同一个变量(我们通常称之为“资源”)的时候,很有可能产生不可控的结果从而导致程序失效甚至崩溃。如果一个资源被多个线程竞争使用,那么我们通常称之为“临界资源”,对“临界资源”的访问需要加上保护,否则资源会处于“混乱”的状态。下面的例子演示了100个线程向同一个银行账户转账(转入1元钱)的场景,在这个例子中,银行账户就是一个临界资源,在没有保护的情况下我们很有可能会得到错误的结果。
-
-```Python
-from time import sleep
-from threading import Thread
-
-
-class Account(object):
-
- def __init__(self):
- self._balance = 0
-
- def deposit(self, money):
- # 计算存款后的余额
- new_balance = self._balance + money
- # 模拟受理存款业务需要0.01秒的时间
- sleep(0.01)
- # 修改账户余额
- self._balance = new_balance
-
- @property
- def balance(self):
- return self._balance
-
-
-class AddMoneyThread(Thread):
-
- def __init__(self, account, money):
- super().__init__()
- self._account = account
- self._money = money
-
- def run(self):
- self._account.deposit(self._money)
-
-
-def main():
- account = Account()
- threads = []
- # 创建100个存款的线程向同一个账户中存钱
- for _ in range(100):
- t = AddMoneyThread(account, 1)
- threads.append(t)
- t.start()
- # 等所有存款的线程都执行完毕
- for t in threads:
- t.join()
- print('账户余额为: ¥%d元' % account.balance)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-运行上面的程序,结果让人大跌眼镜,100个线程分别向账户中转入1元钱,结果居然远远小于100元。之所以出现这种情况是因为我们没有对银行账户这个“临界资源”加以保护,多个线程同时向账户中存钱时,会一起执行到`new_balance = self._balance + money`这行代码,多个线程得到的账户余额都是初始状态下的`0`,所以都是`0`上面做了+1的操作,因此得到了错误的结果。在这种情况下,“锁”就可以派上用场了。我们可以通过“锁”来保护“临界资源”,只有获得“锁”的线程才能访问“临界资源”,而其他没有得到“锁”的线程只能被阻塞起来,直到获得“锁”的线程释放了“锁”,其他线程才有机会获得“锁”,进而访问被保护的“临界资源”。下面的代码演示了如何使用“锁”来保护对银行账户的操作,从而获得正确的结果。
-
-```Python
-from time import sleep
-from threading import Thread, Lock
-
-
-class Account(object):
-
- def __init__(self):
- self._balance = 0
- self._lock = Lock()
-
- def deposit(self, money):
- # 先获取锁才能执行后续的代码
- self._lock.acquire()
- try:
- new_balance = self._balance + money
- sleep(0.01)
- self._balance = new_balance
- finally:
- # 在finally中执行释放锁的操作保证正常异常锁都能释放
- self._lock.release()
-
- @property
- def balance(self):
- return self._balance
-
-
-class AddMoneyThread(Thread):
-
- def __init__(self, account, money):
- super().__init__()
- self._account = account
- self._money = money
-
- def run(self):
- self._account.deposit(self._money)
-
-
-def main():
- account = Account()
- threads = []
- for _ in range(100):
- t = AddMoneyThread(account, 1)
- threads.append(t)
- t.start()
- for t in threads:
- t.join()
- print('账户余额为: ¥%d元' % account.balance)
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-比较遗憾的一件事情是Python的多线程并不能发挥CPU的多核特性,这一点只要启动几个执行死循环的线程就可以得到证实了。之所以如此,是因为Python的解释器有一个“全局解释器锁”(GIL)的东西,任何线程执行前必须先获得GIL锁,然后每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行,这是一个历史遗留问题,但是即便如此,就如我们之前举的例子,使用多线程在提升执行效率和改善用户体验方面仍然是有积极意义的。
-
-### 多进程还是多线程
-
-无论是多进程还是多线程,只要数量一多,效率肯定上不去,为什么呢?我们打个比方,假设你不幸正在准备中考,每天晚上需要做语文、数学、英语、物理、化学这5科的作业,每项作业耗时1小时。如果你先花1小时做语文作业,做完了,再花1小时做数学作业,这样,依次全部做完,一共花5小时,这种方式称为单任务模型。如果你打算切换到多任务模型,可以先做1分钟语文,再切换到数学作业,做1分钟,再切换到英语,以此类推,只要切换速度足够快,这种方式就和单核CPU执行多任务是一样的了,以旁观者的角度来看,你就正在同时写5科作业。
-
-但是,切换作业是有代价的,比如从语文切到数学,要先收拾桌子上的语文书本、钢笔(这叫保存现场),然后,打开数学课本、找出圆规直尺(这叫准备新环境),才能开始做数学作业。操作系统在切换进程或者线程时也是一样的,它需要先保存当前执行的现场环境(CPU寄存器状态、内存页等),然后,把新任务的执行环境准备好(恢复上次的寄存器状态,切换内存页等),才能开始执行。这个切换过程虽然很快,但是也需要耗费时间。如果有几千个任务同时进行,操作系统可能就主要忙着切换任务,根本没有多少时间去执行任务了,这种情况最常见的就是硬盘狂响,点窗口无反应,系统处于假死状态。所以,多任务一旦多到一个限度,反而会使得系统性能急剧下降,最终导致所有任务都做不好。
-
-是否采用多任务的第二个考虑是任务的类型,可以把任务分为计算密集型和I/O密集型。计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如对视频进行编码解码或者格式转换等等,这种任务全靠CPU的运算能力,虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低。计算密集型任务由于主要消耗CPU资源,这类任务用Python这样的脚本语言去执行效率通常很低,最能胜任这类任务的是C语言,我们之前提到了Python中有嵌入C/C++代码的机制。
-
-除了计算密集型任务,其他的涉及到网络、存储介质I/O的任务都可以视为I/O密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待I/O操作完成(因为I/O的速度远远低于CPU和内存的速度)。对于I/O密集型任务,如果启动多任务,就可以减少I/O等待时间从而让CPU高效率的运转。有一大类的任务都属于I/O密集型任务,这其中包括了我们很快会涉及到的网络应用和Web应用。
-
-> **说明:**上面的内容和例子来自于[廖雪峰官方网站的《Python教程》](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000),因为对作者文中的某些观点持有不同的看法,对原文的文字描述做了适当的调整。
-
-### 单线程+异步I/O
-
-现代操作系统对I/O操作的改进中最为重要的就是支持异步I/O。如果充分利用操作系统提供的异步I/O支持,就可以用单进程单线程模型来执行多任务,这种全新的模型称为事件驱动模型。Nginx就是支持异步I/O的Web服务器,它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上,可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。用Node.js开发的服务器端程序也使用了这种工作模式,这也是当下实现多任务编程的一种趋势。
-
-在Python语言中,单线程+异步I/O的编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序。协程最大的优势就是极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。协程的第二个优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不用加锁,只需要判断状态就好了,所以执行效率比多线程高很多。如果想要充分利用CPU的多核特性,最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。关于这方面的内容,我稍后会做一个专题来进行讲解。
-
-### 应用案例
-
-#### 例子1:将耗时间的任务放到线程中以获得更好的用户体验。
-
-如下所示的界面中,有“下载”和“关于”两个按钮,用休眠的方式模拟点击“下载”按钮会联网下载文件需要耗费10秒的时间,如果不使用“多线程”,我们会发现,当点击“下载”按钮后整个程序的其他部分都被这个耗时间的任务阻塞而无法执行了,这显然是非常糟糕的用户体验,代码如下所示。
-
-```Python
-import time
-import tkinter
-import tkinter.messagebox
-
-
-def download():
- # 模拟下载任务需要花费10秒钟时间
- time.sleep(10)
- tkinter.messagebox.showinfo('提示', '下载完成!')
-
-
-def show_about():
- tkinter.messagebox.showinfo('关于', '作者: 骆昊(v1.0)')
-
-
-def main():
- top = tkinter.Tk()
- top.title('单线程')
- top.geometry('200x150')
- top.wm_attributes('-topmost', True)
-
- panel = tkinter.Frame(top)
- button1 = tkinter.Button(panel, text='下载', command=download)
- button1.pack(side='left')
- button2 = tkinter.Button(panel, text='关于', command=show_about)
- button2.pack(side='right')
- panel.pack(side='bottom')
-
- tkinter.mainloop()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-如果使用多线程将耗时间的任务放到一个独立的线程中执行,这样就不会因为执行耗时间的任务而阻塞了主线程,修改后的代码如下所示。
-
-```Python
-import time
-import tkinter
-import tkinter.messagebox
-from threading import Thread
-
-
-def main():
-
- class DownloadTaskHandler(Thread):
-
- def run(self):
- time.sleep(10)
- tkinter.messagebox.showinfo('提示', '下载完成!')
- # 启用下载按钮
- button1.config(state=tkinter.NORMAL)
-
- def download():
- # 禁用下载按钮
- button1.config(state=tkinter.DISABLED)
- # 通过daemon参数将线程设置为守护线程(主程序退出就不再保留执行)
- # 在线程中处理耗时间的下载任务
- DownloadTaskHandler(daemon=True).start()
-
- def show_about():
- tkinter.messagebox.showinfo('关于', '作者: 骆昊(v1.0)')
-
- top = tkinter.Tk()
- top.title('单线程')
- top.geometry('200x150')
- top.wm_attributes('-topmost', 1)
-
- panel = tkinter.Frame(top)
- button1 = tkinter.Button(panel, text='下载', command=download)
- button1.pack(side='left')
- button2 = tkinter.Button(panel, text='关于', command=show_about)
- button2.pack(side='right')
- panel.pack(side='bottom')
-
- tkinter.mainloop()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-#### 例子2:使用多进程对复杂任务进行“分而治之”。
-
-我们来完成1~100000000求和的计算密集型任务,这个问题本身非常简单,有点循环的知识就能解决,代码如下所示。
-
-```Python
-from time import time
-
-
-def main():
- total = 0
- number_list = [x for x in range(1, 100000001)]
- start = time()
- for number in number_list:
- total += number
- print(total)
- end = time()
- print('Execution time: %.3fs' % (end - start))
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-在上面的代码中,我故意先去创建了一个列表容器然后填入了100000000个数,这一步其实是比较耗时间的,所以为了公平起见,当我们将这个任务分解到8个进程中去执行的时候,我们暂时也不考虑列表切片操作花费的时间,只是把做运算和合并运算结果的时间统计出来,代码如下所示。
-
-```Python
-from multiprocessing import Process, Queue
-from random import randint
-from time import time
-
-
-def task_handler(curr_list, result_queue):
- total = 0
- for number in curr_list:
- total += number
- result_queue.put(total)
-
-
-def main():
- processes = []
- number_list = [x for x in range(1, 100000001)]
- result_queue = Queue()
- index = 0
- # 启动8个进程将数据切片后进行运算
- for _ in range(8):
- p = Process(target=task_handler,
- args=(number_list[index:index + 12500000], result_queue))
- index += 12500000
- processes.append(p)
- p.start()
- # 开始记录所有进程执行完成花费的时间
- start = time()
- for p in processes:
- p.join()
- # 合并执行结果
- total = 0
- while not result_queue.empty():
- total += result_queue.get()
- print(total)
- end = time()
- print('Execution time: ', (end - start), 's', sep='')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-比较两段代码的执行结果(在我目前使用的MacBook上,上面的代码需要大概6秒左右的时间,而下面的代码只需要不到1秒的时间,再强调一次我们只是比较了运算的时间,不考虑列表创建及切片操作花费的时间),使用多进程后由于获得了更多的CPU执行时间以及更好的利用了CPU的多核特性,明显的减少了程序的执行时间,而且计算量越大效果越明显。当然,如果愿意还可以将多个进程部署在不同的计算机上,做成分布式进程,具体的做法就是通过multiprocessing.managers模块中提供的管理器将`Queue`对象通过网络共享出来(注册到网络上让其他计算机可以访问),这部分内容也留到爬虫的专题再进行讲解。
\ No newline at end of file
diff --git a/Day01-15/Day14/chatclient.py b/Day01-15/Day14/chatclient.py
deleted file mode 100644
index 4d53e7cdb..000000000
--- a/Day01-15/Day14/chatclient.py
+++ /dev/null
@@ -1,34 +0,0 @@
-from socket import socket
-from threading import Thread
-
-
-def main():
-
- class RefreshScreenThread(Thread):
-
- def __init__(self, client):
- super().__init__()
- self._client = client
-
- def run(self):
- while running:
- data = self._client.recv(1024)
- print(data.decode('utf-8'))
-
- nickname = input('请输入你的昵称: ')
- myclient = socket()
- myclient.connect(('10.7.189.118', 12345))
- running = True
- RefreshScreenThread(myclient).start()
- while running:
- content = input('请发言: ')
- if content == 'byebye':
- myclient.send(content.encode('utf-8'))
- running = False
- else:
- msg = nickname + ': ' + content
- myclient.send(msg.encode('utf-8'))
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day14/chatserver.py b/Day01-15/Day14/chatserver.py
deleted file mode 100644
index aeab5bf59..000000000
--- a/Day01-15/Day14/chatserver.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from socket import socket
-from threading import Thread
-
-
-def main():
-
- class ClientHandler(Thread):
-
- def __init__(self, client):
- super().__init__()
- self._client = client
-
- def run(self):
- try:
- while True:
- try:
- data = self._client.recv(1024)
- if data.decode('utf-8') == 'byebye':
- clients.remove(self._client)
- self._client.close()
- break
- else:
- for client in clients:
- client.send(data)
- except Exception as e:
- print(e)
- clients.remove(self._client)
- break
- except Exception as e:
- print(e)
-
- server = socket()
- server.bind(('10.7.189.118', 12345))
- server.listen(512)
- clients = []
- while True:
- curr_client, addr = server.accept()
- print(addr[0], '连接到服务器.')
- clients.append(curr_client)
- ClientHandler(curr_client).start()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day14/fileclient.py b/Day01-15/Day14/fileclient.py
deleted file mode 100644
index 8c326697d..000000000
--- a/Day01-15/Day14/fileclient.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from socket import socket
-from json import loads
-from base64 import b64decode
-
-
-def main():
- client = socket()
- client.connect(('192.168.1.2', 5566))
- # 定义一个保存二进制数据的对象
- in_data = bytes()
- # 由于不知道服务器发送的数据有多大每次接收1024字节
- data = client.recv(1024)
- while data:
- # 将收到的数据拼接起来
- in_data += data
- data = client.recv(1024)
- # 将收到的二进制数据解码成JSON字符串并转换成字典
- # loads函数的作用就是将JSON字符串转成字典对象
- my_dict = loads(in_data.decode('utf-8'))
- filename = my_dict['filename']
- filedata = my_dict['filedata'].encode('utf-8')
- with open('/Users/Hao/' + filename, 'wb') as f:
- # 将base64格式的数据解码成二进制数据并写入文件
- f.write(b64decode(filedata))
- print('图片已保存.')
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day14/fileserver.py b/Day01-15/Day14/fileserver.py
deleted file mode 100644
index dac241ae8..000000000
--- a/Day01-15/Day14/fileserver.py
+++ /dev/null
@@ -1,46 +0,0 @@
-from socket import socket, SOCK_STREAM, AF_INET
-from base64 import b64encode
-from json import dumps
-from threading import Thread
-
-
-def main():
-
- # 自定义线程类
- class FileTransferHandler(Thread):
-
- def __init__(self, cclient):
- super().__init__()
- self.cclient = cclient
-
- def run(self):
- my_dict = {}
- my_dict['filename'] = 'guido.jpg'
- # JSON是纯文本不能携带二进制数据
- # 所以图片的二进制数据要处理成base64编码
- my_dict['filedata'] = data
- # 通过dumps函数将字典处理成JSON字符串
- json_str = dumps(my_dict)
- # 发送JSON字符串
- self.cclient.send(json_str.encode('utf-8'))
- self.cclient.close()
-
- # 1.创建套接字对象并指定使用哪种传输服务
- server = socket()
- # 2.绑定IP地址和端口(区分不同的服务)
- server.bind(('192.168.1.2', 5566))
- # 3.开启监听 - 监听客户端连接到服务器
- server.listen(512)
- print('服务器启动开始监听...')
- with open('guido.jpg', 'rb') as f:
- # 将二进制数据处理成base64再解码成字符串
- data = b64encode(f.read()).decode('utf-8')
- while True:
- client, addr = server.accept()
- # 用一个字典(键值对)来保存要发送的各种数据
- # 待会可以将字典处理成JSON格式在网络上传递
- FileTransferHandler(client).start()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day14/mmdownloader.py b/Day01-15/Day14/mmdownloader.py
deleted file mode 100644
index 2cd33f797..000000000
--- a/Day01-15/Day14/mmdownloader.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from time import time
-from threading import Thread
-
-import requests
-
-
-class DownloadHanlder(Thread):
-
- def __init__(self, url):
- super().__init__()
- self.url = url
-
- def run(self):
- filename = self.url[self.url.rfind('/') + 1:]
- resp = requests.get(self.url)
- with open('/Users/Hao/Downloads/' + filename, 'wb') as f:
- f.write(resp.content)
-
-
-def main():
- # 通过requests模块的get函数获取网络资源
- resp = requests.get(
- 'http://api.tianapi.com/meinv/?key=772a81a51ae5c780251b1f98ea431b84&num=10')
- # 将服务器返回的JSON格式的数据解析为字典
- data_model = resp.json()
- for mm_dict in data_model['newslist']:
- url = mm_dict['picUrl']
- # 通过多线程的方式实现图片下载
- DownloadHanlder(url).start()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day14/res/TCP-IP-model.png b/Day01-15/Day14/res/TCP-IP-model.png
deleted file mode 100644
index 777af4733..000000000
Binary files a/Day01-15/Day14/res/TCP-IP-model.png and /dev/null differ
diff --git a/Day01-15/Day14/res/after-browser.jpg b/Day01-15/Day14/res/after-browser.jpg
deleted file mode 100644
index 7cc95202e..000000000
Binary files a/Day01-15/Day14/res/after-browser.jpg and /dev/null differ
diff --git a/Day01-15/Day14/res/arpanet.png b/Day01-15/Day14/res/arpanet.png
deleted file mode 100644
index 65d2dd37d..000000000
Binary files a/Day01-15/Day14/res/arpanet.png and /dev/null differ
diff --git a/Day01-15/Day14/res/before-browser.jpg b/Day01-15/Day14/res/before-browser.jpg
deleted file mode 100644
index f8161445c..000000000
Binary files a/Day01-15/Day14/res/before-browser.jpg and /dev/null differ
diff --git a/Day01-15/Day14/res/browers.jpg b/Day01-15/Day14/res/browers.jpg
deleted file mode 100644
index 0be1d4dcf..000000000
Binary files a/Day01-15/Day14/res/browers.jpg and /dev/null differ
diff --git a/Day01-15/Day14/res/browser-market-place.jpeg b/Day01-15/Day14/res/browser-market-place.jpeg
deleted file mode 100644
index 196b0f461..000000000
Binary files a/Day01-15/Day14/res/browser-market-place.jpeg and /dev/null differ
diff --git a/Day01-15/Day14/res/how-data-is-processed.jpg b/Day01-15/Day14/res/how-data-is-processed.jpg
deleted file mode 100644
index 4359bcd4b..000000000
Binary files a/Day01-15/Day14/res/how-data-is-processed.jpg and /dev/null differ
diff --git a/Day01-15/Day14/res/osi_rm.gif b/Day01-15/Day14/res/osi_rm.gif
deleted file mode 100644
index 876960d9a..000000000
Binary files a/Day01-15/Day14/res/osi_rm.gif and /dev/null differ
diff --git a/Day01-15/Day14/res/osimodel.png b/Day01-15/Day14/res/osimodel.png
deleted file mode 100644
index f0361c924..000000000
Binary files a/Day01-15/Day14/res/osimodel.png and /dev/null differ
diff --git a/Day01-15/Day14/res/tcpipprotocols.png b/Day01-15/Day14/res/tcpipprotocols.png
deleted file mode 100644
index 4acf2169a..000000000
Binary files a/Day01-15/Day14/res/tcpipprotocols.png and /dev/null differ
diff --git a/Day01-15/Day14/res/telnet.png b/Day01-15/Day14/res/telnet.png
deleted file mode 100644
index 20c86530c..000000000
Binary files a/Day01-15/Day14/res/telnet.png and /dev/null differ
diff --git a/Day01-15/Day14/socket1.py b/Day01-15/Day14/socket1.py
deleted file mode 100644
index 82389d763..000000000
--- a/Day01-15/Day14/socket1.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""
-
-套接字 - 基于TCP协议创建时间服务器
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-22
-
-"""
-
-from socket import *
-from time import *
-
-server = socket(AF_INET, SOCK_STREAM)
-server.bind(('localhost', 6789))
-server.listen()
-print('服务器已经启动正在监听客户端连接.')
-while True:
- client, addr = server.accept()
- print('客户端%s:%d连接成功.' % (addr[0], addr[1]))
- currtime = localtime(time())
- timestr = strftime('%Y-%m-%d %H:%M:%S', currtime)
- client.send(timestr.encode('utf-8'))
- client.close()
-server.close()
diff --git a/Day01-15/Day14/socket2.py b/Day01-15/Day14/socket2.py
deleted file mode 100644
index ca5ce7b16..000000000
--- a/Day01-15/Day14/socket2.py
+++ /dev/null
@@ -1,20 +0,0 @@
-"""
-
-套接字 - 基于TCP协议创建时间客户端
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-22
-
-"""
-
-from socket import *
-
-client = socket(AF_INET, SOCK_STREAM)
-client.connect(('localhost', 6789))
-while True:
- data = client.recv(1024)
- if not data:
- break
- print(data.decode('utf-8'))
-client.close()
diff --git a/Day01-15/Day14/socket3.py b/Day01-15/Day14/socket3.py
deleted file mode 100644
index e70d154c8..000000000
--- a/Day01-15/Day14/socket3.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""
-
-套接字 - 基于UDP协议Echo服务器
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-22
-
-"""
-
-from socket import *
-from time import *
-
-server = socket(AF_INET, SOCK_DGRAM)
-server.bind(('localhost', 6789))
-while True:
- data, addr = server.recvfrom(1024)
- server.sendto(data, addr)
-server.close()
diff --git a/Day01-15/Day14/socket4.py b/Day01-15/Day14/socket4.py
deleted file mode 100644
index 4fdf9c4d4..000000000
--- a/Day01-15/Day14/socket4.py
+++ /dev/null
@@ -1,22 +0,0 @@
-"""
-
-套接字 - 基于UDP协议创建Echo客户端
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-22
-
-"""
-
-from socket import *
-
-client = socket(AF_INET, SOCK_DGRAM)
-while True:
- data_str = input('请输入: ')
- client.sendto(data_str.encode('utf-8'), ('localhost', 6789))
- data, addr = client.recvfrom(1024)
- data_str = data.decode('utf-8')
- print('服务器回应:', data_str)
- if data_str == 'bye':
- break
-client.close()
diff --git a/Day01-15/Day14/socket5.py b/Day01-15/Day14/socket5.py
deleted file mode 100644
index 97fe088b0..000000000
--- a/Day01-15/Day14/socket5.py
+++ /dev/null
@@ -1,24 +0,0 @@
-"""
-
-使用socketserver模块创建时间服务器
-
-Version: 0.1
-Author: 骆昊
-Date: 2018-03-22
-
-"""
-
-from socketserver import TCPServer, StreamRequestHandler
-from time import *
-
-
-class EchoRequestHandler(StreamRequestHandler):
-
- def handle(self):
- currtime = localtime(time())
- timestr = strftime('%Y-%m-%d %H:%M:%S', currtime)
- self.wfile.write(timestr.encode('utf-8'))
-
-
-server = TCPServer(('localhost', 6789), EchoRequestHandler)
-server.serve_forever()
diff --git a/Day01-15/Day14/timeclient.py b/Day01-15/Day14/timeclient.py
deleted file mode 100644
index c2b711536..000000000
--- a/Day01-15/Day14/timeclient.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from socket import socket
-
-
-def main():
- client = socket()
- client.connect(('10.7.152.69', 6789))
- print(client.recv(1024).decode('utf-8'))
- client.close()
-
-
-if __name__ == '__main__':
- main()
diff --git a/Day01-15/Day14/timeserver.py b/Day01-15/Day14/timeserver.py
deleted file mode 100644
index 048eec854..000000000
--- a/Day01-15/Day14/timeserver.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from socket import socket, SOCK_STREAM, AF_INET
-from datetime import datetime
-
-
-def main():
- # 1.创建套接字对象并指定使用哪种传输服务
- # family=AF_INET - IPv4地址
- # family=AF_INET6 - IPv6地址
- # type=SOCK_STREAM - TCP套接字
- # type=SOCK_DGRAM - UDP套接字
- # type=SOCK_RAW - 原始套接字
- server = socket(family=AF_INET, type=SOCK_STREAM)
- # 2.绑定IP地址和端口(区分不同的服务)
- server.bind(('192.168.1.2', 6789))
- # 3.开启监听 - 监听客户端连接到服务器
- server.listen(512)
- print('服务器启动开始监听...')
- # 4.通过循环接收客户端的连接并作出相应的处理(提供服务)
- while True:
- # accept方法是一个阻塞方法如果没有客户端连接到服务器
- # 这个方法就会阻塞代码不会向下执行
- # accept方法返回元组其中的第一个元素是客户端对象
- # 第二个元素是客户端的地址(由IP和端口两部分构成)
- client, addr = server.accept()
- print(str(addr) + '连接到了服务器.')
- # 5.发送数据
- client.send(str(datetime.now()).encode('utf-8'))
- # 6.断开连接
- client.close()
-
-
-if __name__ == '__main__':
- main()
diff --git "a/Day01-15/Day14/\347\275\221\347\273\234\347\274\226\347\250\213\345\205\245\351\227\250.md" "b/Day01-15/Day14/\347\275\221\347\273\234\347\274\226\347\250\213\345\205\245\351\227\250.md"
deleted file mode 100644
index 7f33271ec..000000000
--- "a/Day01-15/Day14/\347\275\221\347\273\234\347\274\226\347\250\213\345\205\245\351\227\250.md"
+++ /dev/null
@@ -1,303 +0,0 @@
-## 网络编程入门
-
-### 计算机网络基础
-
-计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享。今天计算机网络中的设备和计算机网络的用户已经多得不可计数,而计算机网络也可以称得上是一个“复杂巨系统”,对于这样的系统,我们不可能用一两篇文章把它讲清楚,有兴趣的读者可以自行阅读Andrew S.Tanenbaum老师的经典之作《计算机网络》或Kurose和Ross老师合著的《计算机网络:自顶向下方法》来了解计算机网络的相关知识。
-
-#### 计算机网络发展史
-
-1. 1960s - 美国国防部ARPANET项目问世,奠定了分组交换网络的基础。
-
- 
-
-2. 1980s - 国际标准化组织(ISO)发布OSI/RM,奠定了网络技术标准化的基础。
-
- 
-
-3. 1990s - 英国人[蒂姆·伯纳斯-李](https://zh.wikipedia.org/wiki/%E6%8F%90%E5%A7%86%C2%B7%E6%9F%8F%E5%85%A7%E8%8C%B2-%E6%9D%8E)发明了图形化的浏览器,浏览器的简单易用性使得计算机网络迅速被普及。
-
- 在没有浏览器的年代,上网是这样的。
-
- 
-
- 有了浏览器以后,上网是这样的。
-
- 
-
-#### TCP/IP模型
-
-实现网络通信的基础是网络通信协议,这些协议通常是由[互联网工程任务组](https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%B7%A5%E7%A8%8B%E4%BB%BB%E5%8A%A1%E7%BB%84) (IETF)制定的。所谓“协议”就是通信计算机双方必须共同遵从的一组约定,例如怎样建立连接、怎样互相识别等,网络协议的三要素是:语法、语义和时序。构成我们今天使用的Internet的基础的是TCP/IP协议族,所谓协议族就是一系列的协议及其构成的通信模型,我们通常也把这套东西称为TCP/IP模型。与国际标准化组织发布的OSI/RM这个七层模型不同,TCP/IP是一个四层模型,也就是说,该模型将我们使用的网络从逻辑上分解为四个层次,自底向上依次是:网络接口层、网络层、传输层和应用层,如下图所示。
-
-
-
-IP通常被翻译为网际协议,它服务于网络层,主要实现了寻址和路由的功能。接入网络的每一台主机都需要有自己的IP地址,IP地址就是主机在计算机网络上的身份标识。当然由于IPv4地址的匮乏,我们平常在家里、办公室以及其他可以接入网络的公共区域上网时获得的IP地址并不是全球唯一的IP地址,而是一个[局域网(LAN)](https://zh.wikipedia.org/zh-hans/%E5%B1%80%E5%9F%9F%E7%BD%91)中的内部IP地址,通过[网络地址转换(NAT)服务](https://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2)我们也可以实现对网络的访问。计算机网络上有大量的被我们称为“[路由器](https://zh.wikipedia.org/wiki/%E8%B7%AF%E7%94%B1%E5%99%A8)”的网络中继设备,它们会存储转发我们发送到网络上的数据分组,让从源头发出的数据最终能够找到传送到目的地通路,这项功能就是所谓的路由。
-
-TCP全称传输控制协议,它是基于IP提供的寻址和路由服务而建立起来的负责实现端到端可靠传输的协议,之所以将TCP称为可靠的传输协议是因为TCP向调用者承诺了三件事情:
-
-1. 数据不传丢不传错(利用握手、校验和重传机制可以实现)。
-2. 流量控制(通过滑动窗口匹配数据发送者和接收者之间的传输速度)。
-3. 拥塞控制(通过RTT时间以及对滑动窗口的控制缓解网络拥堵)。
-
-
-
-#### 网络应用模式
-
-1. C/S模式和B/S模式。这里的C指的是Client(客户端),通常是一个需要安装到某个宿主操作系统上的应用程序;而B指的是Browser(浏览器),它几乎是所有图形化操作系统都默认安装了的一个应用软件;通过C或B都可以实现对S(服务器)的访问。关于二者的比较和讨论在网络上有一大堆的文章,在此我们就不再浪费笔墨了。
-2. 去中心化的网络应用模式。不管是B/S还是C/S都需要服务器的存在,服务器就是整个应用模式的中心,而去中心化的网络应用通常没有固定的服务器或者固定的客户端,所有应用的使用者既可以作为资源的提供者也可以作为资源的访问者。
-
-### 基于HTTP协议的网络资源访问
-
-#### HTTP(超文本传输协议)
-
-HTTP是超文本传输协议(Hyper-Text Transfer Proctol)的简称,维基百科上对HTTP的解释是:超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,它是[万维网](https://zh.wikipedia.org/wiki/%E5%85%A8%E7%90%83%E8%B3%87%E8%A8%8A%E7%B6%B2)数据通信的基础,设计HTTP最初的目的是为了提供一种发布和接收[HTML](https://zh.wikipedia.org/wiki/HTML)页面的方法,通过HTTP或者[HTTPS](https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%AE%89%E5%85%A8%E5%8D%8F%E8%AE%AE)(超文本传输安全协议)请求的资源由URI([统一资源标识符](https://zh.wikipedia.org/wiki/%E7%B5%B1%E4%B8%80%E8%B3%87%E6%BA%90%E6%A8%99%E8%AD%98%E7%AC%A6))来标识。关于HTTP的更多内容,我们推荐阅读阮一峰老师的[《HTTP 协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html),简单的说,通过HTTP我们可以获取网络上的(基于字符的)资源,开发中经常会用到的网络API(有的地方也称之为网络数据接口)就是基于HTTP来实现数据传输的。
-
-#### JSON格式
-
-**JSON**(**J**ava**S**cript **O**bject **N**otation)是一种轻量级的数据交换语言,该语言以易于让人阅读的文字(纯文本)为基础,用来传输由属性值或者序列性的值组成的数据对象。尽管JSON是最初只是Javascript中一种创建对象的字面量语法,但它在当下更是一种独立于语言的数据格式,很多编程语言都支持JSON格式数据的生成和解析,Python内置的json模块也提供了这方面的功能。由于JSON是纯文本,它和[XML](https://zh.wikipedia.org/wiki/XML)一样都适用于异构系统之间的数据交换,而相较于XML,JSON显得更加的轻便和优雅。下面是表达同样信息的XML和JSON,而JSON的优势是相当直观的。
-
-XML的例子:
-
-```XML
-
-
- Alice
- Bob
- Will you marry me?
-
-```
-
-JSON的例子:
-
-```JSON
-{
- 'from': 'Alice',
- 'to': 'Bob',
- 'content': 'Will you marry me?'
-}
-```
-
-#### requests库
-
-requests是一个基于HTTP协议来使用网络的第三库,其[官方网站](http://cn.python-requests.org/zh_CN/latest/)有这样的一句介绍它的话:“Requests是唯一的一个**非转基因**的Python HTTP库,人类可以安全享用。”简单的说,使用requests库可以非常方便的使用HTTP,避免安全缺陷、冗余代码以及“重复发明轮子”(行业黑话,通常用在软件工程领域表示重新创造一个已有的或是早已被优化過的基本方法)。前面的文章中我们已经使用过这个库,下面我们还是通过requests来实现一个访问网络数据接口并从中获取美女图片下载链接然后下载美女图片到本地的例子程序,程序中使用了[天行数据](https://www.tianapi.com/)提供的网络API。
-
-我们可以先通过pip安装requests及其依赖库。
-
-```Shell
-pip install requests
-```
-
-如果使用PyCharm作为开发工具,可以直接在代码中书写`import requests`,然后通过代码修复功能来自动下载安装requests。
-
-```Python
-from time import time
-from threading import Thread
-
-import requests
-
-
-# 继承Thread类创建自定义的线程类
-class DownloadHanlder(Thread):
-
- def __init__(self, url):
- super().__init__()
- self.url = url
-
- def run(self):
- filename = self.url[self.url.rfind('/') + 1:]
- resp = requests.get(self.url)
- with open('/Users/Hao/' + filename, 'wb') as f:
- f.write(resp.content)
-
-
-def main():
- # 通过requests模块的get函数获取网络资源
- # 下面的代码中使用了天行数据接口提供的网络API
- # 要使用该数据接口需要在天行数据的网站上注册
- # 然后用自己的Key替换掉下面代码的中APIKey即可
- resp = requests.get(
- 'http://api.tianapi.com/meinv/?key=APIKey&num=10')
- # 将服务器返回的JSON格式的数据解析为字典
- data_model = resp.json()
- for mm_dict in data_model['newslist']:
- url = mm_dict['picUrl']
- # 通过多线程的方式实现图片下载
- DownloadHanlder(url).start()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 基于传输层协议的套接字编程
-
-套接字这个词对很多不了解网络编程的人来说显得非常晦涩和陌生,其实说得通俗点,套接字就是一套用[C语言](https://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80)写成的应用程序开发库,主要用于实现进程间通信和网络编程,在网络应用开发中被广泛使用。在Python中也可以基于套接字来使用传输层提供的传输服务,并基于此开发自己的网络应用。实际开发中使用的套接字可以分为三类:流套接字(TCP套接字)、数据报套接字和原始套接字。
-
-#### TCP套接字
-
-所谓TCP套接字就是使用TCP协议提供的传输服务来实现网络通信的编程接口。在Python中可以通过创建socket对象并指定type属性为SOCK_STREAM来使用TCP套接字。由于一台主机可能拥有多个IP地址,而且很有可能会配置多个不同的服务,所以作为服务器端的程序,需要在创建套接字对象后将其绑定到指定的IP地址和端口上。这里的端口并不是物理设备而是对IP地址的扩展,用于区分不同的服务,例如我们通常将HTTP服务跟80端口绑定,而MySQL数据库服务默认绑定在3306端口,这样当服务器收到用户请求时就可以根据端口号来确定到底用户请求的是HTTP服务器还是数据库服务器提供的服务。端口的取值范围是0~65535,而1024以下的端口我们通常称之为“著名端口”(留给像FTP、HTTP、SMTP等“著名服务”使用的端口,有的地方也称之为“周知端口”),自定义的服务通常不使用这些端口,除非自定义的是HTTP或FTP这样的著名服务。
-
-下面的代码实现了一个提供时间日期的服务器。
-
-```Python
-from socket import socket, SOCK_STREAM, AF_INET
-from datetime import datetime
-
-
-def main():
- # 1.创建套接字对象并指定使用哪种传输服务
- # family=AF_INET - IPv4地址
- # family=AF_INET6 - IPv6地址
- # type=SOCK_STREAM - TCP套接字
- # type=SOCK_DGRAM - UDP套接字
- # type=SOCK_RAW - 原始套接字
- server = socket(family=AF_INET, type=SOCK_STREAM)
- # 2.绑定IP地址和端口(端口用于区分不同的服务)
- # 同一时间在同一个端口上只能绑定一个服务否则报错
- server.bind(('192.168.1.2', 6789))
- # 3.开启监听 - 监听客户端连接到服务器
- # 参数512可以理解为连接队列的大小
- server.listen(512)
- print('服务器启动开始监听...')
- while True:
- # 4.通过循环接收客户端的连接并作出相应的处理(提供服务)
- # accept方法是一个阻塞方法如果没有客户端连接到服务器代码不会向下执行
- # accept方法返回一个元组其中的第一个元素是客户端对象
- # 第二个元素是连接到服务器的客户端的地址(由IP和端口两部分构成)
- client, addr = server.accept()
- print(str(addr) + '连接到了服务器.')
- # 5.发送数据
- client.send(str(datetime.now()).encode('utf-8'))
- # 6.断开连接
- client.close()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-运行服务器程序后我们可以通过Windows系统的telnet来访问该服务器,结果如下图所示。
-
-```Shell
-telnet 192.168.1.2 6789
-```
-
-
-
-当然我们也可以通过Python的程序来实现TCP客户端的功能,相较于实现服务器程序,实现客户端程序就简单多了,代码如下所示。
-
-```Python
-from socket import socket
-
-
-def main():
- # 1.创建套接字对象默认使用IPv4和TCP协议
- client = socket()
- # 2.连接到服务器(需要指定IP地址和端口)
- client.connect(('192.168.1.2', 6789))
- # 3.从服务器接收数据
- print(client.recv(1024).decode('utf-8'))
- client.close()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-需要注意的是,上面的服务器并没有使用多线程或者异步I/O的处理方式,这也就意味着当服务器与一个客户端处于通信状态时,其他的客户端只能排队等待。很显然,这样的服务器并不能满足我们的需求,我们需要的服务器是能够同时接纳和处理多个用户请求的。下面我们来设计一个使用多线程技术处理多个用户请求的服务器,该服务器会向连接到服务器的客户端发送一张图片。
-
-服务器端代码:
-
-```Python
-from socket import socket, SOCK_STREAM, AF_INET
-from base64 import b64encode
-from json import dumps
-from threading import Thread
-
-
-def main():
-
- # 自定义线程类
- class FileTransferHandler(Thread):
-
- def __init__(self, cclient):
- super().__init__()
- self.cclient = cclient
-
- def run(self):
- my_dict = {}
- my_dict['filename'] = 'guido.jpg'
- # JSON是纯文本不能携带二进制数据
- # 所以图片的二进制数据要处理成base64编码
- my_dict['filedata'] = data
- # 通过dumps函数将字典处理成JSON字符串
- json_str = dumps(my_dict)
- # 发送JSON字符串
- self.cclient.send(json_str.encode('utf-8'))
- self.cclient.close()
-
- # 1.创建套接字对象并指定使用哪种传输服务
- server = socket()
- # 2.绑定IP地址和端口(区分不同的服务)
- server.bind(('192.168.1.2', 5566))
- # 3.开启监听 - 监听客户端连接到服务器
- server.listen(512)
- print('服务器启动开始监听...')
- with open('guido.jpg', 'rb') as f:
- # 将二进制数据处理成base64再解码成字符串
- data = b64encode(f.read()).decode('utf-8')
- while True:
- client, addr = server.accept()
- # 启动一个线程来处理客户端的请求
- FileTransferHandler(client).start()
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-客户端代码:
-
-```Python
-from socket import socket
-from json import loads
-from base64 import b64decode
-
-
-def main():
- client = socket()
- client.connect(('192.168.1.2', 5566))
- # 定义一个保存二进制数据的对象
- in_data = bytes()
- # 由于不知道服务器发送的数据有多大每次接收1024字节
- data = client.recv(1024)
- while data:
- # 将收到的数据拼接起来
- in_data += data
- data = client.recv(1024)
- # 将收到的二进制数据解码成JSON字符串并转换成字典
- # loads函数的作用就是将JSON字符串转成字典对象
- my_dict = loads(in_data.decode('utf-8'))
- filename = my_dict['filename']
- filedata = my_dict['filedata'].encode('utf-8')
- with open('/Users/Hao/' + filename, 'wb') as f:
- # 将base64格式的数据解码成二进制数据并写入文件
- f.write(b64decode(filedata))
- print('图片已保存.')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-在这个案例中,我们使用了JSON作为数据传输的格式(通过JSON格式对传输的数据进行了序列化和反序列化的操作),但是JSON并不能携带二进制数据,因此对图片的二进制数据进行了Base64编码的处理。Base64是一种用64个字符表示所有二进制数据的编码方式,通过将二进制数据每6位一组的方式重新组织,刚好可以使用0~9的数字、大小写字母以及“+”和“/”总共64个字符表示从`000000`到`111111`的64种状态。[维基百科](https://zh.wikipedia.org/wiki/Base64)上有关于Base64编码的详细讲解,不熟悉Base64的读者可以自行阅读。
-
-> **说明**:上面的代码主要为了讲解网络编程的相关内容因此并没有对异常状况进行处理,请读者自行添加异常处理代码来增强程序的健壮性。
-
-#### UDP套接字
-
-传输层除了有可靠的传输协议TCP之外,还有一种非常轻便的传输协议叫做用户数据报协议,简称UDP。TCP和UDP都是提供端到端传输服务的协议,二者的差别就如同打电话和发短信的区别,后者不对传输的可靠性和可达性做出任何承诺从而避免了TCP中握手和重传的开销,所以在强调性能和而不是数据完整性的场景中(例如传输网络音视频数据),UDP可能是更好的选择。可能大家会注意到一个现象,就是在观看网络视频时,有时会出现卡顿,有时会出现花屏,这无非就是部分数据传丢或传错造成的。在Python中也可以使用UDP套接字来创建网络应用,对此我们不进行赘述,有兴趣的读者可以自行研究。
diff --git "a/Day01-15/Day15/\347\275\221\347\273\234\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/Day01-15/Day15/\347\275\221\347\273\234\345\272\224\347\224\250\345\274\200\345\217\221.md"
deleted file mode 100644
index 36c5aafa2..000000000
--- "a/Day01-15/Day15/\347\275\221\347\273\234\345\272\224\347\224\250\345\274\200\345\217\221.md"
+++ /dev/null
@@ -1,125 +0,0 @@
-## 网络应用开发
-
-### 发送电子邮件
-
-在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。
-
-就像我们可以用HTTP(超文本传输协议)来访问一个网站一样,发送邮件要使用SMTP(简单邮件传输协议),SMTP也是一个建立在TCP(传输控制协议)提供的可靠数据传输服务的基础上的应用级协议,它规定了邮件的发送者如何跟发送邮件的服务器进行通信的细节,而Python中的smtplib模块将这些操作简化成了几个简单的函数。
-
-下面的代码演示了如何在Python发送邮件。
-
-```Python
-from smtplib import SMTP
-from email.header import Header
-from email.mime.text import MIMEText
-
-
-def main():
- # 请自行修改下面的邮件发送者和接收者
- sender = 'abcdefg@126.com'
- receivers = ['uvwxyz@qq.com', 'uvwxyz@126.com']
- message = MIMEText('用Python发送邮件的示例代码.', 'plain', 'utf-8')
- message['From'] = Header('王大锤', 'utf-8')
- message['To'] = Header('骆昊', 'utf-8')
- message['Subject'] = Header('示例代码实验邮件', 'utf-8')
- smtper = SMTP('smtp.126.com')
- # 请自行修改下面的登录口令
- smtper.login(sender, 'secretpass')
- smtper.sendmail(sender, receivers, message.as_string())
- print('邮件发送完成!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-如果要发送带有附件的邮件,那么可以按照下面的方式进行操作。
-
-```Python
-from smtplib import SMTP
-from email.header import Header
-from email.mime.text import MIMEText
-from email.mime.image import MIMEImage
-from email.mime.multipart import MIMEMultipart
-
-import urllib
-
-
-def main():
- # 创建一个带附件的邮件消息对象
- message = MIMEMultipart()
-
- # 创建文本内容
- text_content = MIMEText('附件中有本月数据请查收', 'plain', 'utf-8')
- message['Subject'] = Header('本月数据', 'utf-8')
- # 将文本内容添加到邮件消息对象中
- message.attach(text_content)
-
- # 读取文件并将文件作为附件添加到邮件消息对象中
- with open('/Users/Hao/Desktop/hello.txt', 'rb') as f:
- txt = MIMEText(f.read(), 'base64', 'utf-8')
- txt['Content-Type'] = 'text/plain'
- txt['Content-Disposition'] = 'attachment; filename=hello.txt'
- message.attach(txt)
- # 读取文件并将文件作为附件添加到邮件消息对象中
- with open('/Users/Hao/Desktop/汇总数据.xlsx', 'rb') as f:
- xls = MIMEText(f.read(), 'base64', 'utf-8')
- xls['Content-Type'] = 'application/vnd.ms-excel'
- xls['Content-Disposition'] = 'attachment; filename=month-data.xlsx'
- message.attach(xls)
-
- # 创建SMTP对象
- smtper = SMTP('smtp.126.com')
- # 开启安全连接
- # smtper.starttls()
- sender = 'abcdefg@126.com'
- receivers = ['uvwxyz@qq.com']
- # 登录到SMTP服务器
- # 请注意此处不是使用密码而是邮件客户端授权码进行登录
- # 对此有疑问的读者可以联系自己使用的邮件服务器客服
- smtper.login(sender, 'secretpass')
- # 发送邮件
- smtper.sendmail(sender, receivers, message.as_string())
- # 与邮件服务器断开连接
- smtper.quit()
- print('发送完成!')
-
-
-if __name__ == '__main__':
- main()
-
-```
-
-### 发送短信
-
-发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。在下面的代码中我们使用了[互亿无线](http://www.ihuyi.com/)短信平台(该平台为注册用户提供了50条免费短信以及常用开发语言发送短信的demo,可以登录该网站并在用户自服务页面中对短信进行配置)提供的API接口实现了发送短信的服务,当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。
-
-```Python
-import urllib.parse
-import http.client
-import json
-
-
-def main():
- host = "106.ihuyi.com"
- sms_send_uri = "/webservice/sms.php?method=Submit"
- # 下面的参数需要填入自己注册的账号和对应的密码
- params = urllib.parse.urlencode({'account': '你自己的账号', 'password' : '你自己的密码', 'content': '您的验证码是:147258。请不要把验证码泄露给其他人。', 'mobile': '接收者的手机号', 'format':'json' })
- print(params)
- headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
- conn = http.client.HTTPConnection(host, port=80, timeout=30)
- conn.request('POST', sms_send_uri, params, headers)
- response = conn.getresponse()
- response_str = response.read()
- jsonstr = response_str.decode('utf-8')
- print(json.loads(jsonstr))
- conn.close()
-
-
-if __name__ == '__main__':
- main()
-
-
-```
-
diff --git "a/Day01-20/01.\345\210\235\350\257\206Python.md" "b/Day01-20/01.\345\210\235\350\257\206Python.md"
new file mode 100755
index 000000000..38ff4e23e
--- /dev/null
+++ "b/Day01-20/01.\345\210\235\350\257\206Python.md"
@@ -0,0 +1,104 @@
+## 初识Python
+
+### Python简介
+
+Python(英式发音:/ˈpaɪθən/;美式发音:/ˈpaɪθɑːn/)是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户的编程语言。Python 强调代码的可读性和语法的简洁性,相较于 C、C++、Java 这些同样影响深远的编程语言,Python 让使用者能够用更少的代码表达自己的意图。下面是几个权威的编程语言排行榜给出的 Python 语言的排名,其中第1张图由 TIOBE Index 提供,第3张图由 IEEE Spectrum 提供。值得一提的是第2张图,它展示了编程语言在全球最大代码托管平台 GitHub 上受欢迎的程度,最近的四年时间 Python 语言都占据了冠军的宝座。
+
+
+
+
+
+#### Python编年史
+
+下面是 Python 语言发展过程中的一些重要时间点:
+
+1. 1989年12月:吉多·范罗苏姆决心开发一个新的脚本语言及其解释器来打发无聊的圣诞节,新语言将作为 ABC 语言的继承者,主要用来替代 Unix shell 和 C 语言实现系统管理。由于吉多本人是 BBC 电视剧《*Monty Python's Flying Circus*》的忠实粉丝,所以他选择了 Python 这个词作为新语言的名字。
+2. 1991年02月:吉多·范罗苏姆在 alt.sources 新闻组上发布了 Python 解释器的最初代码,标记为版本0.9.0。
+3. 1994年01月:Python 1.0发布,梦开始的地方。
+4. 2000年10月:Python 2.0发布,Python 的整个开发过程更加透明,生态圈开始慢慢形成。
+5. 2008年12月:Python 3.0发布,引入了诸多现代编程语言的新特性,但并不完全向下兼容。
+6. 2011年04月:pip 首次发布,Python 语言有了自己的包管理工具。
+7. 2018年07月:吉多·范罗苏姆宣布从“终身仁慈独裁者”(开源项目社区出现争议时拥有最终决定权的人)的职位上“永久休假”。
+8. 2020年01月:在 Python 2和 Python 3共存了11年之后,官方停止了对 Python 2的更新和维护,希望用户尽快切换到 Python 3。
+9. 目前:Python 在大模型(GPT-3、GPT-4、BERT等)、计算机视觉(图像识别、目标检测、图像生成等)、智能推荐(YouTube、Netflix、字节跳动等)、自动驾驶(Waymo、Apollo等)、语音识别、数据科学、量化交易、自动化测试、自动化运维等领域都得到了广泛的应用,Python 语言的生态圈也是相当繁荣。
+
+> **说明**:大多数软件的版本号一般分为三段,形如A.B.C,其中A表示大版本号,当软件整体重写升级或出现不向后兼容的改变时,才会增加A;B表示功能更新,出现新功能时增加B;C表示小的改动(例如:修复了某个Bug),只要有修改就增加C。
+
+#### Python优缺点
+
+Python 语言的优点很多,简单为大家列出几点。
+
+1. **简单优雅**,跟其他很多编程语言相比,Python **更容易上手**。
+2. 能用更少的代码做更多的事情,**提升开发效率**。
+3. 开放源代码,拥有**强大的社区和生态圈**。
+4. **能够做的事情非常多**,有极强的适应性。
+5. **胶水语言**,能够黏合其他语言开发的东西。
+6. 解释型语言,更容易**跨平台**,能够在多种操作系统上运行。
+
+Python 最主要的缺点是**执行效率低**(解释型语言的通病),如果更看重代码的执行效率,C、C++ 或 Go 可能是你更好的选择。
+
+### 安装Python环境
+
+工欲善其事,必先利其器。想要开始你的 Python 编程之旅,首先得在计算机上安装 Python 环境,简单的说就是安装运行 Python 程序需要的 Python 解释器。我们推荐大家安装官方的 Python 3 解释器,它是用 C 语言编写的,我们通常也称之为 CPython,它可能是你目前最好的选择。首先,我们需要从官方网站的[下载页面](https://www.python.org/downloads/)找到下载链接,点击“Download”按钮进入下载页面后,需要根据自己的操作系统选择合适的 Python 3安装程序,如下图所示。
+
+
+
+进入下载页面后,有些 Python 版本并没有提供 Windows 和 macOS 系统的安装程序,只提供了源代码的压缩文件,对于熟悉 Linux 系统的小伙伴,我们可以通过源代码构建安装;对于使用 Windows 或 macOS 系统的小伙伴,我们还是**强烈建议**使用安装程序。例如,你想安装 Python 3.10,选择 Python 3.10.10 或 Python 3.10.11 就能找到 Windows 或 macOS 系统的安装包,而其他版本可能只有源代码,如下图所示。
+
+
+
+#### Windows环境
+
+下面我们以 Windows 11为例,讲解如何在 Windows 操作系统上安装 Python 环境。双击运行从官网下载的安装程序,会打开一个安装向导,如下图所示。
+
+
+
+首先,一定要记得勾选“Add python.exe to PATH”选项,它会帮助我们将 Python 解释器添加到 Windows 系统的 PATH 环境变量中(不理解没关系,勾上就对了);其次,“Use admin privileges when installing py.exe”是为了在安装过程中获得管理员权限,建议勾选。然后,我们选择“Customize Installation”,使用自定义安装的模式,这是专业人士的选择,而你就(假装)是那个专业人士,不建议使用“Install Now”(默认安装)。
+
+接下来,安装向导会提示你勾选需要的“Optional Features”(可选特性),这里咱们可以直接全选。值得一提的是其中的第2项,它是 Python 的包管理工具 pip,可以帮助我们安装三方库和三方工具,所以一定要记得勾选它,然后点击“Next”进入下一环节。
+
+
+
+接下来是对“Advanced Options”(高级选项)的选择,这里我们建议大家只勾选“Add Python to environment variables”和“Precompile standard library”这两个选项,前者会帮助我们自动配置好环境变量,后者会预编译标准库(生成`.pyc`文件),这样在使用时就无需临时编译了。还是那句话,不理解没关系,勾上就对了。下面的“Customize install location”(自定义安装路径)**强烈建议**修改为自定义的路径,这个路径中不应该包含中文、空格或其他特殊字符,注意这一点会为你将来减少很多不必要的麻烦。设置完成后,点击“Install”开始安装。
+
+
+
+安装成功会出现如下图所示的画面,安装成功的关键词是“successful”,如果安装失败,这里的单词会变成“failed”。
+
+
+
+安装完成后可以打开 Windows 的“命令行提示符”或 PowerShell,然后输入`python --version`或`python -V`来检查安装是否成功,这个命令是查看 Python 解释器的版本号。如果看到如下所示的画面,那么恭喜你,Python 环境已经安装成功了。这里我们建议再检查一下 Python 的包管理工具 pip 是否可用,对应的命令是`pip --version`或`pip -V`。
+
+
+
+> **说明**:如果安装过程报错或提示安装失败,很有可能是你的 Windows 系统缺失了一些动态链接库文件或缺少必要的构建工具导致的。可以在[微软官网](https://visualstudio.microsoft.com/zh-hans/downloads/)下载“Visual Studio 2022 生成工具”进行修复,如下图所示。如果不方便在微软官网下载的,也可以使用下面的百度云盘链接来获取修复工具,链接: https://pan.baidu.com/s/1iNDnU5UVdDX5sKFqsiDg5Q 提取码: cjs3。
+>
+>
+>
+> 上面下载的“Visual Studio 2022 生成工具”需要联网才能运行,运行后会出现如下图所示的画面,大家可以参考下图勾选对应的选项进行修复。修复过程需要联网下载对应的软件包,这个过程可能会比较耗时间,修复成功后可能会要求重启你的操作系统。
+>
+>
+
+#### macOS环境
+
+macOS 安装 Python 环境相较于 Windows 系统更为简单,我们从官方下载的安装包是一个`pkg`文件,双击运行之后不断的点击“继续”就安装成功了,几乎不用做任何的设置和勾选,如下图所示。
+
+
+
+安装完成后,可以在 macOS 的“终端”工具中输入`python3 --version`命令来检查是否安装成功,注意这里的命令是`python3`不是`python`!!!然后我们再检查一下包管理工具,输入命令`pip3 --version`,如下图所示。
+
+
+
+#### 其他安装方式
+
+有人可能会推荐新手直接安装 [Anaconda](https://www.anaconda.com/download/success),因为 Anaconda 会帮助我们安装 Python 解释器以及一些常用的三方库,除此之外还提供了一些便捷的工具,特别适合萌新小白。我个人并不推荐这种方式,因为在安装 Anaconda 时你会莫名其妙安装了一大堆有用没用的三方库(占用比较多的硬盘空间),然后你的终端或命令提示符会被 Anaconda 篡改(每次启动自动激活虚拟环境),这些并不符合软件设计的**最小惊讶原则**。其他关于 Anaconda 的小毛病此处就不再赘述了,如果你非要使用 Anaconda,推荐安装 Miniconda,它跟 Anaconda 在同一个下载页面。
+
+还有萌新小白经常会听到或说出,“我要写 Python 程序,安装一个 PyCharm 不就可以了吗?”。这里简单科普一下,PyCharm 只是一个辅助写 Python 代码的工具,它本身并不具备运行 Python 代码的能力,运行 Python 代码靠的是我们上面安装的 Python 解释器。当然,有些 PyCharm 版本在创建 Python 项目时,如果检测不到你电脑上的 Python 环境,也会提示你联网下载 Python 解释器。PyCharm 的安装和使用我们放在了下一课。
+
+### 总结
+
+总结一下我们学到的东西:
+
+1. Python 语言很强大,可以做很多的事情,所以值得我们去学习。
+2. 要使用 Python语言,首先得安装 Python 环境,也就是运行 Python 程序所需的 Python 解释器。
+3. Windows 系统可以在命令提示符或 PowerShell 中输入`python --version`检查 Python 环境是否安装成功;macOS 系统可以在终端中输入`python3 --version`进行检查。
diff --git "a/Day01-20/02.\347\254\254\344\270\200\344\270\252Python\347\250\213\345\272\217.md" "b/Day01-20/02.\347\254\254\344\270\200\344\270\252Python\347\250\213\345\272\217.md"
new file mode 100755
index 000000000..c2fade7c9
--- /dev/null
+++ "b/Day01-20/02.\347\254\254\344\270\200\344\270\252Python\347\250\213\345\272\217.md"
@@ -0,0 +1,150 @@
+## 第一个Python程序
+
+在上一课中,我们对 Python 语言的过去现在有了一些了解,我们准备好了运行 Python 程序所需要的解释器环境。相信大家已经迫不及待的想开始自己的 Python 编程之旅了,但是新问题来了,我们应该在什么地方书写 Python 程序,然后又怎么运行它呢?
+
+### 编写代码的工具
+
+下面我们为大家讲解几种可以编写和运行 Python 代码的工具,大家可以根据自己的需求来选择合适的工具。当然,对于初学者,我个人比较推荐使用 PyCharm,因为它不需要太多的配置也非常的强大,对新手还是很友好的。如果你也听说过或者喜欢 PyCharm,可以直接跳过下面对其他工具的介绍,直接快进到讲解 PyCharm 的地方。
+
+#### 默认的交互式环境
+
+我们打开 Windows 的“命令提示符”或“PowerShell”工具,输入`python`然后按下`Enter`键,这个命令会把我们带到一个交互式环境中。所谓交互式环境,就是我们输入一行代码并按下`Enter`键,代码马上会被执行,如果代码有产出结果,那么结果会被显示在窗口中,如下所示。
+
+```Bash
+Python 3.10.10
+Type "help", "copyright", "credits" or "license" for more information.
+>>> 2 * 3
+6
+>>> 2 + 3
+5
+>>>
+```
+
+> **说明**:使用 macOS 系统的用户需要打开“终端”工具,输入`python3`进入交互式环境。
+
+如果希望退出交互式环境,可以在交互式环境中输入`quit()`,如下所示。
+
+```Bash
+>>> quit()
+```
+
+#### 更好的交互式环境 - IPython
+
+上面说的交互式环境用户体验并不怎么好,大家使用一下就能感受到。我们可以用 IPython 来替换掉它,因为 IPython 提供了更为强大的编辑和交互功能。我们可以在命令提示符或终端中使用 Python 的包管理工具`pip`来安装 IPython,如下所示。
+
+```bash
+pip install ipython
+```
+
+> **提示**:在使用上面的命令安装 IPython 之前,可以先通过`pip config set global.index-url https://pypi.doubanio.com/simple`命令或`pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/`将下载源修改为国内的豆瓣镜像或清华镜像,否则下载安装的过程可能会非常的缓慢。
+
+接下来可以使用下面的命令启动 IPython,进入交互式环境。
+
+```bash
+ipython
+```
+
+> **说明**:还有一个网页版的 IPython 名叫 Jupyter,我们在用得着它的地方再为大家介绍。
+
+#### 文本编辑神器 - Visual Studio Code
+
+Visual Studio Code 是由微软开发能够在 Windows、 Linux 和 macOS 等操作系统上运行的代码编辑神器。它支持语法高亮、自动补全、多点编辑、运行调试等一系列便捷功能,而且能够支持多种编程语言。如果大家要选择一款高级文本编辑工具,强烈推荐 Visual Studio Code,关于它的[下载](https://code.visualstudio.com/)、安装和使用,有兴趣的读者可以自行研究。
+
+
+
+#### 集成开发环境 - PyCharm
+
+如果用 Python 语言开发商业项目,我们推荐大家使用更为专业的工具 PyCharm。PyCharm 是由捷克一家名为 [JetBrains](https://www.jetbrains.com/) 的公司针对 Python 语言提供的集成开发环境(IDE)。所谓集成开发环境,通常是指提供了编写代码、运行代码、调试代码、分析代码、版本控制等一系列强大功能和便捷操作的开发工具,因此特别适合用于商业项目的开发。我们可以在 JetBrains 公司的官方网站上找到 PyCharm 的[下载链接](),如下图所示。
+
+
+
+官方提供了两个 PyCharm 的版本,一个是免费的社区版(Community Edition),功能相对弱小,但对于初学者来说是完全够用的;另一个是付费的专业版(Professional Edition),功能非常强大,但需要按年或按月支付费用,新用户可以免费试用30天时间。PyCharm 的安装没有任何难度,运行下载的安装程序,几乎全部使用默认设置进行安装就可以了。对于使用 Windows 系统的小伙伴,其中有一个步骤可以按照下图所示勾选“创建桌面快捷方式”和“在右键菜单中添加"Open Folder as Project"”就可以了。
+
+
+
+第一次运行 PyCharm 时,在提示你导入 PyCharm 设置的界面上直接选择“Do not import settings”,然后我们就可以看到如下图所示的欢迎界面。此处,我们可以先点击“Customize”选项对 PyCharm 做一些个性化的设置。
+
+
+
+接下来,我们可以在“Projects”选项中点击“New Project”来创建一个新的项目,此处还可以“打开已有项目”或“从版本控制服务器(VCS)获取项目”,如下图所示。
+
+
+
+创建项目的时候需要指定项目的路径并创建”虚拟环境“,我们建议每个 Python 都在自己专属的虚拟环境中运行。如果你的系统上还没 Python 环境,那么 PyCharm 会提供官网的下载链接,当你点击“Create”按钮创建项目时,它会联网下载 Python 解释器,如下图所示。
+
+
+
+当然,我们并不推荐这么做,因为我们在上一课已经安装过 Python 环境了。在系统有 Python 环境的情况下,PyCharm 通常会自动发现 Python 解释器的位置并以此为基础创建虚拟环境,所以大家看到的画面应该如下图所示。
+
+
+
+> **说明**:上面的截图来自于 Windows 系统,如果使用 macOS 系统,你看到的项目路径和 Python 解释器路径会跟上面有所不同。
+
+创建好项目后会出现如下图所示的画面,我们可以通过在项目文件夹上点击鼠标右键,选择“New”菜单下的“Python File”来创建一个 Python 文件,在给文件命名时建议使用英文字母和下划线的组合,创建好的 Python 文件会自动打开,进入可编辑的状态。
+
+
+
+接下来,我们可以在代码窗口编写我们的 Python 代码。写好代码后,可以在窗口中点击鼠标右键,选择“Run”菜单项来运行代码,下面的“Run”窗口会显示代码的执行结果,如下图所示。
+
+
+
+到这里,我们的第一个 Python 程序已经运转起来了,很酷吧!对了,PyCharm 有一个叫“每日小贴士”的弹窗,会教给你一些使用 PyCharm 的小技巧,如下图所示。如果不需要,直接关闭就可以了;如果不希望它再次出现,在关闭前可以勾选“Don't show tips on startup”。
+
+
+
+### 你好世界
+
+按照行业惯例,我们学习任何一门编程语言写的第一个程序都是输出`hello, world`,因为这段代码是伟大的丹尼斯·里奇(C 语言之父,和肯·汤普森一起开发了 Unix 操作系统)和布莱恩·柯尼汉(awk 语言的发明者)在他们的不朽著作《*The C Programming Language*》中写的第一段代码,下面是对应的 Python 语言的版本。
+
+```python
+print('hello, world')
+```
+
+> **注意**:上面代码中的圆括号、单引号都是在英文输入法状态下输入的,如果不小心写成了中文的圆括号或单引号,运行代码时会出现`SyntaxError: invalid character '(' (U+FF08)`或`SyntaxError: invalid character '‘' (U+2018)`这样的错误提示。
+
+上面的代码只有一个语句,在这个语句中,我们用到了一个名为`print`的函数,它可以帮助我们输出指定的内容;`print`函数圆括号中的`'hello, world'`是一个字符串,它代表了一段文本内容;在 Python 语言中,我们可以用单引号或双引号来表示一个字符串。不同于 C、C++ 或 Java 这样的编程语言,Python 代码中的语句不需要用分号来表示结束,也就是说,如果我们想再写一条语句,只需要回车换行即可,代码如下所示。此外,Python 代码也不需要通过编写名为`main`的入口函数来使其运行,提供入口函数是编写可执行的 C、C++ 或 Java 代码必须要做的事情,这一点很多程序员都不陌生,但是在 Python 语言中它并不是必要的。
+
+```python
+print('hello, world')
+print('goodbye, world')
+```
+
+如果不使用 PyCharm 这样的集成开发环境,我们也可以直接调用 Python 解释器来运行 Python 程序。我们可以将上面的代码保存成一个名为`example01.py`的文件,对于Windows 系统,我们假设该文件在`C:\code`目录下,我们打开“命令提示符”或“PowerShell”并输入下面的命令就可以运行它。
+
+```powershell
+python C:\code\example01.py
+```
+
+对于 macOS 系统,假设我们的文件在`/Users/Hao`目录下,那么可以在终端中输入下面的命令来运行程序。
+
+```Bash
+python3 /Users/Hao/example01.py
+```
+
+> **提示**:如果路径比较长,不愿意手动输入,我们可以通过拖拽的方式将文件直接拖到“命令提示符”或“终端”中,这样会自动输入完整的文件路径。
+
+大家可以试着修改上面的代码,比如将单引号中的`hello, world`换成其他内容或者多写几个这样的语句,看看会运行出怎样的结果。需要提醒大家的是,写 Python 代码时,最好每一行只写一条语句。虽然,我们可以使用`;`作为分隔将多个语句写在一行中,但是这样做会让代码变得非常难看,不再具备良好的可读性。
+
+### 注释你的代码
+
+注释是编程语言的一个重要组成部分,用于在代码中解释代码的作用,从而达到增强代码可读性的目标。当然,我们也可以将代码中暂时不需要运行的代码段通过添加注释来去掉,这样当你需要重新使用这些代码的时候,去掉注释符号就可以了。简单的说,**注释会让代码更容易看懂但不会影响代码的执行结果**。
+
+Python 中有两种形式的注释:
+
+1. 单行注释:以`#`和空格开头,可以注释掉从`#`开始后面一整行的内容。
+2. 多行注释:三个引号(通常用双引号)开头,三个引号结尾,通常用于添加多行说明性内容。
+
+```python
+"""
+第一个Python程序 - hello, world
+
+Version: 1.0
+Author: 骆昊
+"""
+# print('hello, world')
+print("你好,世界!")
+```
+
+### 总结
+
+到此,我们已经把第一个 Python 程序运行起来了,是不是很有成就感?!只要你坚持学习下去,再过一段时间,我们就可以用 Python 语言做更多更酷的事情。今时今日,编程就跟英语一样,对很多人来说都是一项必须要掌握的技能。
diff --git "a/Day01-20/03.Python\350\257\255\350\250\200\344\270\255\347\232\204\345\217\230\351\207\217.md" "b/Day01-20/03.Python\350\257\255\350\250\200\344\270\255\347\232\204\345\217\230\351\207\217.md"
new file mode 100755
index 000000000..02a0267f6
--- /dev/null
+++ "b/Day01-20/03.Python\350\257\255\350\250\200\344\270\255\347\232\204\345\217\230\351\207\217.md"
@@ -0,0 +1,132 @@
+## Python语言中的变量
+
+对于想学习编程的新手来说,有两个问题可能是他们很想知道的,其一是“什么是(计算机)程序”,其二是“写(计算机)程序能做什么”。先说说我对这两个问题的理解:**程序是数据和指令的有序集合**,**写程序就是用数据和指令控制计算机做我们想让它做的事情**。今时今日,为什么有那么多人选择用 Python 语言来写程序,因为 Python 语言足够简单和强大。相较于 C、C++、Java 这样的编程语言,Python 对初学者和非专业人士更加友好,很多问题在 Python 语言中都能找到简单优雅的解决方案。接下来,我们就从最基础的语言元素开始,带大家认识和使用 Python 语言。
+
+### 一些常识
+
+在开始系统的学习 Python 编程之前,我们先来科普一些计算机的基础知识。计算机的硬件系统通常由五大部件构成,包括:**运算器**、**控制器**、**存储器**、**输入设备**和**输出设备**。其中,运算器和控制器放在一起就是我们常说的**中央处理器**(CPU),它的功能是执行各种运算和控制指令。刚才我们提到过,程序是指令的集合,写程序就是将一系列的指令按照某种方式组织到一起,然后通过这些指令去控制计算机做我们想让它做的事情。存储器可以分为**内部存储器**和**外部存储器**,前者就是我们常说的内存,它是中央处理器可以直接寻址的存储空间,程序在执行的过程中,对应的数据和指令需要加载到内存中。输入设备和输出设备经常被统称为 I/O 设备,键盘、鼠标、麦克风、摄像头是典型的输入设备,而显示器、打印机、扬声器等则是典型的输出设备。目前,我们使用的计算机基本大多是遵循“冯·诺依曼体系结构”的计算机,这种计算机有两个关键点:一是**将存储器与中央处理器分开**;二是**将数据以二进制方式编码**。
+
+二进制是一种“逢二进一”的计数法,跟人类使用的“逢十进一”的计数法本质是一样的。人类因为有十根手指,所以使用了十进制计数法,在计数时十根手指用完之后,就只能用进位的方式来表示更大的数值。当然凡事都有例外,玛雅人可能是因为长年光着脚的原因,把脚趾头也都用上了,于是他们使用了二十进制的计数法。基于这样的计数方式,玛雅人使用的历法跟我们平常使用的历法就产生了差异。按照玛雅人的历法,2012 年是上一个所谓的“太阳纪”的最后一年,而 2013 年则是新的“太阳纪”的开始。后来这件事情还被以讹传讹的方式误传为“2012 年是玛雅人预言的世界末日”的荒诞说法。今天有很多人猜测,玛雅文明之所以发展缓慢跟使用了二十进制是有关系的。对于计算机来说,二进制在物理器件上最容易实现的,因为可以用高电压表示 1,用低电压表示 0。不是所有写程序的人都需要熟悉二进制,熟悉十进制与二进制、八进制、十六进制的转换,大多数时候我们即便不了解这些知识也能写程序。但是,我们必须知道,计算机是使用二进制计数的,不管什么样的数据,到了计算机内存中都是以二进制形态存在的。
+
+> **说明**:关于二进制计数法以及它与其他进制如何相互转换,大家可以翻翻名为《计算机导论》或《计算机文化》的书,都能找到相应的知识,此处就不再进行赘述了,不清楚的读者可以自行研究。
+
+### 变量和类型
+
+要想在计算机的内存中保存数据,首先得说一说变量这个概念。在编程语言中,**变量是数据的载体**,简单的说就是一块用来保存数据的内存空间,**变量的值可以被读取和修改**,这是所有运算和控制的基础。计算机能处理的数据有很多种类型,最常见的就是数值,除了数值之外还有文本、图像、音频、视频等各种各样的数据类型。虽然数据在计算机中都是以二进制形态存在的,但是我们可以用不同类型的变量来表示数据类型的差异。Python 语言中预设了多种数据类型,也允许我们自定义新的数据类型,这一点在后面会讲到。我们首先来了解几种 Python 中最为常用的数据类型。
+
+1. 整型(`int`):Python 中可以处理任意大小的整数,而且支持二进制(如`0b100`,换算成十进制是4)、八进制(如`0o100`,换算成十进制是64)、十进制(`100`)和十六进制(`0x100`,换算成十进制是256)的表示法。运行下面的代码,看看会输出什么。
+
+ ```python
+ print(0b100) # 二进制整数
+ print(0o100) # 八进制整数
+ print(100) # 十进制整数
+ print(0x100) # 十六进制整数
+ ```
+
+2. 浮点型(`float`):浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,浮点数除了数学写法(如`123.456`)之外还支持科学计数法(如`1.23456e2`,表示$\small{1.23456 \times 10^{2}}$)。运行下面的代码,看看会输出什么。
+
+ ```python
+ print(123.456) # 数学写法
+ print(1.23456e2) # 科学计数法
+ ```
+
+3. 字符串型(`str`):字符串是以单引号或双引号包裹起来的任意文本,比如`'hello'`和`"hello"`。
+
+4. 布尔型(`bool`):布尔型只有`True`、`False`两种值,要么是`True`,要么是`False`,可以用来表示现实世界中的“是”和“否”,命题的“真”和“假”,状况的“好”与“坏”,水平的“高”与“低”等等。如果一个变量的值只有两种状态,我们就可以使用布尔型。
+
+### 变量命名
+
+对于每个变量,我们都需要给它取一个名字,就如同我们每个人都有自己的名字一样。在 Python 中,变量命名需要遵循以下的规则和惯例。
+
+- 规则部分:
+ - 规则1:变量名由**字母**、**数字**和**下划线**构成,数字不能开头。需要说明的是,这里说的字母指的是 Unicode 字符,Unicode 称为万国码,囊括了世界上大部分的文字系统,这也就意味着中文、日文、希腊字母等都可以作为变量名中的字符,但是一些特殊字符(如:`!`、`@`、`#`等)是不能出现在变量名中的。我们强烈建议大家把这里说的字母理解为**尽可能只使用英文字母**。
+ - 规则2:Python 是**大小写敏感**的编程语言,简单的说就是大写的`A`和小写的`a`是两个不同的变量,这一条其实并不算规则,而是需要大家注意的地方。
+ - 规则3:变量名**不要跟 Python 的关键字重名**,**尽可能避开 Python 的保留字**。这里的关键字是指在 Python 程序中有特殊含义的单词(如:`is`、`if`、`else`、`for`、`while`、`True`、`False`等),保留字主要指 Python 语言内置函数、内置模块等的名字(如:`int`、`print`、`input`、`str`、`math`、`os`等)。
+- 惯例部分:
+ - 惯例1:变量名通常使用**小写英文字母**,**多个单词用下划线进行连接**。
+ - 惯例2:受保护的变量用单个下划线开头。
+ - 惯例3:私有的变量用两个下划线开头。
+
+惯例2和惯例3大家暂时不用管,讲到后面自然会明白的。当然,作为一个专业的程序员,给变量命名时做到**见名知意**也是非常重要,这彰显了一个程序员的专业气质,很多开发岗位的面试也非常看重这一点。
+
+### 变量的使用
+
+下面通过例子来说明变量的类型和变量的使用。
+
+```python
+"""
+使用变量保存数据并进行加减乘除运算
+
+Version: 1.0
+Author: 骆昊
+"""
+a = 45 # 定义变量a,赋值45
+b = 12 # 定义变量b,赋值12
+print(a, b) # 45 12
+print(a + b) # 57
+print(a - b) # 33
+print(a * b) # 540
+print(a / b) # 3.75
+```
+
+在 Python 中可以使用`type`函数对变量的类型进行检查。程序设计中函数的概念跟数学上函数的概念非常类似,数学上的函数相信大家并不陌生,它包括了函数名、自变量和因变量。如果暂时不理解函数这个概念也不要紧,我们会在后续的内容中专门讲解函数的定义和使用。
+
+```python
+"""
+使用type函数检查变量的类型
+
+Version: 1.0
+Author: 骆昊
+"""
+a = 100
+b = 123.45
+c = 'hello, world'
+d = True
+print(type(a)) #
+print(type(b)) #
+print(type(c)) #
+print(type(d)) #
+```
+
+可以通过 Python 内置的函数来改变变量的类型,下面是一些常用的和变量类型相关的函数。
+
+- `int()`:将一个数值或字符串转换成整数,可以指定进制。
+- `float()`:将一个字符串(在可能的情况下)转换成浮点数。
+- `str()`:将指定的对象转换成字符串形式,可以指定编码方式。
+- `chr()`:将整数(字符编码)转换成对应的(一个字符的)字符串。
+- `ord()`:将(一个字符的)字符串转换成对应的整数(字符编码)。
+
+下面的例子为大家演示了 Python 中类型转换的操作。
+
+```python
+"""
+变量的类型转换操作
+
+Version: 1.0
+Author: 骆昊
+"""
+a = 100
+b = 123.45
+c = '123'
+d = '100'
+e = '123.45'
+f = 'hello, world'
+g = True
+print(float(a)) # int类型的100转成float,输出100.0
+print(int(b)) # float类型的123.45转成int,输出123
+print(int(c)) # str类型的'123'转成int,输出123
+print(int(c, base=16)) # str类型的'123'按十六进制转成int,输出291
+print(int(d, base=2)) # str类型的'100'按二进制转成int,输出4
+print(float(e)) # str类型的'123.45'转成float,输出123.45
+print(bool(f)) # str类型的'hello, world'转成bool,输出True
+print(int(g)) # bool类型的True转成int,输出1
+print(chr(a)) # int类型的100转成str,输出'd'
+print(ord('d')) # str类型的'd'转成int,输出100
+```
+
+> **说明**:`str`类型转`int`类型时可以通过`base`参数来指定进制,可以将字符串视为对应进制的整数进行转换。`str`类型转成`bool`类型时,只要字符串有内容,不是`''`或`""`,对应的布尔值都是`True`。`bool`类型转`int`类型时,`True`会变成`1`,`False`会变成`0`。在 ASCII 字符集和 Unicode 字符集中, 字符`'d'`对应的编码都是`100`。
+
+### 总结
+
+在 Python 程序中,我们可以**使用变量来保存数据**,**变量有不同的类型**,常用的类型有`int`、`float`、`str`和`bool`。在有需要的情况下,可以通过 Python 内置的函数对变量进行类型转换。变量是可以做运算的,这是解决很多问题的先决条件,我们会在下一课中为大家详细介绍变量的运算。
+
diff --git "a/Day01-20/04.Python\350\257\255\350\250\200\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.md" "b/Day01-20/04.Python\350\257\255\350\250\200\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.md"
new file mode 100755
index 000000000..4eb7c02c0
--- /dev/null
+++ "b/Day01-20/04.Python\350\257\255\350\250\200\344\270\255\347\232\204\350\277\220\347\256\227\347\254\246.md"
@@ -0,0 +1,240 @@
+## Python语言中的运算符
+
+Python 语言支持很多种运算符,下面的表格按照运算符的优先级从高到低,对 Python 中的运算符进行了罗列。有了变量和运算符,我们就可以构造各种各样的表达式来解决实际问题。在计算机科学中,**表达式是计算机程序中的句法实体,它由一个或多个常量、变量、函数和运算符组合而成,编程语言可以对其进行解释和计算以得到另一个值**。不理解这句话没有关系,但是一定要知道,不管使用什么样的编程语言,构造表达式都是非常重要的。
+
+| 运算符 | 描述 |
+| ------------------------------------------------------------ | ------------------------------ |
+| `[]`、`[:]` | 索引、切片 |
+| `**` | 幂 |
+| `~`、`+`、`-` | 按位取反、正号、负号 |
+| `*`、`/`、`%`、`//` | 乘、除、模、整除 |
+| `+`、`-` | 加、减 |
+| `>>`、`<<` | 右移、左移 |
+| `&` | 按位与 |
+| `^`、`|` | 按位异或、按位或 |
+| `<=`、`<`、`>`、`>=` | 小于等于、小于、大于、大于等于 |
+| `==`、`!=` | 等于、不等于 |
+| `is`、`is not` | 身份运算符 |
+| `in`、`not in` | 成员运算符 |
+| `not`、`or`、`and` | 逻辑运算符 |
+| `=`、`+=`、`-=`、`*=`、`/=`、`%=`、`//=`、`**=`、`&=`、`\|=`、`^=`、`>>=`、`<<=` | 赋值运算符 |
+
+>**说明**: 所谓优先级就是在一个运算的表达式中,如果出现了多个运算符,应该先执行什么再执行什么的顺序。编写代码的时候,如果搞不清楚一个表达式中运算符的优先级,可以使用圆括号(小括号)来确保运算的执行顺序。
+
+### 算术运算符
+
+Python 中的算术运算符非常丰富,除了大家最为熟悉的加、减、乘、除之外,还有整除运算符、求模(求余数)运算符和求幂运算符。下面的例子为大家展示了算术运算符的使用。
+
+```python
+"""
+算术运算符
+
+Version: 1.0
+Author: 骆昊
+"""
+print(321 + 12) # 加法运算,输出333
+print(321 - 12) # 减法运算,输出309
+print(321 * 12) # 乘法运算,输出3852
+print(321 / 12) # 除法运算,输出26.75
+print(321 // 12) # 整除运算,输出26
+print(321 % 12) # 求模运算,输出9
+print(321 ** 12) # 求幂运算,输出1196906950228928915420617322241
+```
+
+算术运算需要先乘除后加减,这一点跟数学课本中讲的知识没有区别,也就是说乘除法的运算优先级是高于加减法的。如果还有求幂运算,求幂运算的优先级是高于乘除法的。如果想改变算术运算的执行顺序,可以使用英文输入法状态下的圆括号(小括号),写在圆括号中的表达式会被优先执行,如下面的例子所示。
+
+```python
+"""
+算术运算的优先级
+
+Version: 1.0
+Author: 骆昊
+"""
+print(2 + 3 * 5) # 17
+print((2 + 3) * 5) # 25
+print((2 + 3) * 5 ** 2) # 125
+print(((2 + 3) * 5) ** 2) # 625
+```
+
+### 赋值运算符
+
+赋值运算符应该是最为常见的运算符,它的作用是将右边的值赋给左边的变量。赋值运算符还可以跟上面的算术运算符放在一起,组合成复合赋值运算符,例如:`a += b`相当于`a = a + b`,`a *= a + 2`相当于`a = a * (a + 2)`。下面的例子演示了赋值运算符和复合赋值运算符的使用。
+
+```python
+"""
+赋值运算符和复合赋值运算符
+
+Version: 1.0
+Author: 骆昊
+"""
+a = 10
+b = 3
+a += b # 相当于:a = a + b
+a *= a + 2 # 相当于:a = a * (a + 2)
+print(a) # 大家算一下这里会输出什么
+```
+
+赋值运算构成的表达式本身不产生任何值,也就是说,如果你把一个赋值表达式放到`print`函数中试图输出表达式的值,将会产生语法错误。为了解决这个问题,Python 3.8 中引入了一个新的赋值运算符`:=`,我们称之为海象运算符,大家可以猜一猜它为什么叫这个名字。海象运算符也是将运算符右侧的值赋值给左边的变量,与赋值运算符不同的是,运算符右侧的值也是整个表达式的值,看看下面的代码大家就明白了。
+
+```python
+"""
+海象运算符
+
+Version: 1.0
+Author: 骆昊
+"""
+# SyntaxError: invalid syntax
+# print((a = 10))
+# 海象运算符
+print((a := 10)) # 10
+print(a) # 10
+```
+
+> **提示**:上面第 8 行代码如果不注释掉,运行代码会看到`SyntaxError: invalid syntax`错误信息,注意,这行代码中我们给`a = 10`加上了圆括号,如果不小心写成了`print(a = 10)`,会看到`TypeError: 'a' is an invalid keyword argument for print()`错误信息,后面讲到函数的时候,大家就会明白这个错误提示是什么意思了。
+
+### 比较运算符和逻辑运算符
+
+比较运算符也称为关系运算符,包括`==`、`!=`、`<`、`>`、`<=`、`>=`,我相信大家一看就能懂。需要提醒的是比较相等用的是`==`,请注意这里是两个等号,因为`=`是赋值运算符,我们在上面刚刚讲到过。比较不相等用的是`!=`,跟数学课本中使用的$\small{\neq}$并不相同,Python 2 中曾经使用过`<>`来表示不等于,在 Python 3 中使用`<>`会引发`SyntaxError`(语法错误)。比较运算符会产生布尔值,要么是`True`,要么是`False`。
+
+逻辑运算符有三个,分别是`and`、`or`和`not`。`and`字面意思是“而且”,所以`and`运算符会连接两个布尔值或者产生布尔值的表达式,如果两边的布尔值都是`True`,那么运算的结果就是`True`;左右两边的布尔值有一个是`False`,最终的运算结果就是`False`。当然,如果`and`运算符左边的布尔值是`False`,不管右边的布尔值是什么,最终的结果都是`False`,这时运算符右边的布尔值会被跳过(专业的说法叫短路处理,如果`and`右边是一个表达式,那么这个表达式不会执行)。`or`字面意思是“或者”,所以`or`运算符也会连接两个布尔值或产生布尔值的表达式,如果两边的布尔值有任意一个是`True`,那么最终的结果就是`True`。当然,`or`运算符也是有短路功能的,当它左边的布尔值为`True`的情况下,右边的布尔值会被短路(如果`or`右边是一个表达式,那么这个表达式不会执行)。`not`运算符的后面可以跟一个布尔值,如果`not`后面的布尔值或表达式是`True`,那么运算的结果就是`False`;如果`not`后面的布尔值或表达式是`False`,那么运算的结果就是`True`。
+
+```python
+"""
+比较运算符和逻辑运算符的使用
+
+Version: 1.0
+Author: 骆昊
+"""
+flag0 = 1 == 1
+flag1 = 3 > 2
+flag2 = 2 < 1
+flag3 = flag1 and flag2
+flag4 = flag1 or flag2
+flag5 = not flag0
+print('flag0 =', flag0) # flag0 = True
+print('flag1 =', flag1) # flag1 = True
+print('flag2 =', flag2) # flag2 = False
+print('flag3 =', flag3) # flag3 = False
+print('flag4 =', flag4) # flag4 = True
+print('flag5 =', flag5) # flag5 = False
+print(flag1 and not flag2) # True
+print(1 > 2 or 2 == 3) # False
+```
+
+> **说明**:比较运算符的优先级高于赋值运算符,所以上面的`flag0 = 1 == 1`先做`1 == 1`产生布尔值`True`,再将这个值赋值给变量`flag0`。`print`函数可以输出多个值,多个值之间可以用`,`进行分隔,输出的内容默认以空格分开。
+
+### 运算符和表达式应用
+
+#### 例子1:华氏温度转摄氏温度
+
+> **要求**:输入华氏温度将其转换为摄氏温度,华氏温度到摄氏温度的转换公式为: $\small{C = (F - 32) / 1.8}$ 。
+
+```python
+"""
+将华氏温度转换为摄氏温度
+
+Version: 1.0
+Author: 骆昊
+"""
+f = float(input('请输入华氏温度: '))
+c = (f - 32) / 1.8
+print('%.1f华氏度 = %.1f摄氏度' % (f, c))
+```
+
+> **说明**:上面代码中的`input`函数用于从键盘接收用户输入,由于输入的都是字符串,如果想处理成浮点小数来做后续的运算,可以用我们上一课讲解的类型转换的方法,用`float`函数将`str`类型处理成`float`类型。
+
+上面的代码中,我们对`print`函数输出的内容进行了格式化处理,`print`输出的字符串中有两个`%.1f`占位符,这两个占位符会被`%`之后的`(f, c)`中的两个`float`类型的变量值给替换掉,浮点数小数点后保留1位有效数字。如果字符串中有`%d`占位符,那么我们会用`int`类型的值替换掉它,如果字符串中有`%s`占位符,那么它会被`str`类型的值替换掉。
+
+除了上面格式化输出的方式外,Python 中还可以用下面的办法来格式化输出,我们给出一个带占位符的字符串,字符串前面的`f`表示这个字符串是需要格式化处理的,其中的`{f:.1f}`和`{c:.1f}`可以先看成是`{f}`和`{c}`,表示输出时会用变量`f`和变量`c`的值替换掉这两个占位符,后面的`:.1f`表示这是一个浮点数,小数点后保留1位有效数字。
+
+```python
+"""
+将华氏温度转换为摄氏温度
+
+Version: 1.1
+Author: 骆昊
+"""
+f = float(input('请输入华氏温度: '))
+c = (f - 32) / 1.8
+print(f'{f:.1f}华氏度 = {c:.1f}摄氏度')
+```
+
+#### 例子2:计算圆的周长和面积
+
+> **要求**:输入一个圆的半径($\small{r}$),计算出它的周长( $\small{2 \pi r}$ )和面积( $\small{\pi r^{2}}$ )。
+
+```python
+"""
+输入半径计算圆的周长和面积
+
+Version: 1.0
+Author: 骆昊
+"""
+radius = float(input('请输入圆的半径: '))
+perimeter = 2 * 3.1416 * radius
+area = 3.1416 * radius * radius
+print('周长: %.2f' % perimeter)
+print('面积: %.2f' % area)
+```
+
+Python 中有一个名为`math` 的内置模块,该模块中定义了名为`pi`的变量,它的值就是圆周率。如果要使用 Python 内置的这个`pi`,我们可以对上面的代码稍作修改。
+
+```python
+"""
+输入半径计算圆的周长和面积
+
+Version: 1.1
+Author: 骆昊
+"""
+import math
+
+radius = float(input('请输入圆的半径: '))
+perimeter = 2 * math.pi * radius
+area = math.pi * radius ** 2
+print(f'周长: {perimeter:.2f}')
+print(f'面积: {area:.2f}')
+```
+
+> **说明**:上面代码中的`import math`表示导入`math`模块,导入该模块以后,才能用`math.pi`得到圆周率的值。
+
+这里其实还有一种格式化输出的方式,是 Python 3.8 中增加的新特性,大家直接看下面的代码就明白了。
+
+```python
+"""
+输入半径计算圆的周长和面积
+
+Version: 1.2
+Author: 骆昊
+"""
+import math
+
+radius = float(input('请输入圆的半径: ')) # 输入: 5.5
+perimeter = 2 * math.pi * radius
+area = math.pi * radius ** 2
+print(f'{perimeter = :.2f}') # 输出:perimeter = 34.56
+print(f'{area = :.2f}') # 输出:area = 95.03
+```
+
+> **说明**:假如变量`a`的值是`9.87`,那么字符串`f'{a = }'`的值是`a = 9.87`;而字符串`f'{a = :.1f}'`的值是`a = 9.9`。这种格式化输出的方式会同时输出变量名和变量值。
+
+#### 例子3:判断闰年
+
+要求:输入一个 1582 年以后的年份,判断该年份是不是闰年。
+
+```python
+"""
+输入年份,闰年输出True,平年输出False
+
+Version: 1.0
+Author: 骆昊
+"""
+year = int(input('请输入年份: '))
+is_leap = year % 4 == 0 and year % 100 != 0 or year % 400 == 0
+print(f'{is_leap = }')
+```
+
+> **说明**:对于格里历(Gregorian calendar),即今天我们使用的公历,判断闰年的规则是:1. 公元年份非 4 的倍数是平年;2. 公元年份为 4 的倍数但非 100 的倍数是闰年;3. 公元年份为 400 的倍数是闰年。格里历是由教皇格里高利十三世在 1582 年 10 月引入的,作为对儒略历(Julian calendar)的修改和替代,我们在输入年份时要注意这一点。上面的代码通过`%`来判断`year`是不是`4`的倍数、`100`的倍数、`400`的倍数,然后用`and`和`or`运算符将三个条件组装在一起,前两个条件要同时满足,第三个条件跟前两个条件的组合只需满足其中之一。
+
+### 总结
+
+通过上面的讲解和例子,相信大家已经感受到了运算符和表达式的力量。实际编程中的很多问题,都需通过构造表达式来解决,所以变量、运算符、表达式对于任何一门编程语言都是极为重要的基础。如果本节课的内容有什么不理解的地方,一定不要着急进入下一课,先在评论区留言讨论,我会及时解答大家的问题。
diff --git "a/Day01-20/05.\345\210\206\346\224\257\347\273\223\346\236\204.md" "b/Day01-20/05.\345\210\206\346\224\257\347\273\223\346\236\204.md"
new file mode 100755
index 000000000..882071ddc
--- /dev/null
+++ "b/Day01-20/05.\345\210\206\346\224\257\347\273\223\346\236\204.md"
@@ -0,0 +1,329 @@
+## 分支结构
+
+迄今为止,我们写的 Python 程序都是一条一条语句按顺序向下执行的,这种代码结构叫做顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的过关条件是玩家获得 1000 分,那么在第一关完成后,我们要根据玩家得到的分数来决定是进入第二关,还是告诉玩家“Game Over”(游戏结束)。在这种场景下,我们的代码就会产生两个分支,而且只有一个会被执行。类似的场景还有很多,我们将这种结构称之为“分支结构”或“选择结构”。给大家一分钟的时间,你应该可以想到至少 5 个以上类似的例子,赶紧试一试吧!
+
+### 使用if和else构造分支结构
+
+在 Python 中,构造分支结构最常用的是`if`、`elif`和`else`三个关键字。所谓**关键字**就是编程语言中有特殊含义的单词,很显然你不能够使用它作为变量名。当然,我们并不是每次构造分支结构都会把三个关键字全部用上,我们通过例子加以说明。例如我们要写一个身体质量指数(BMI)的计算器。身体质量质数也叫体质指数,是国际上常用的衡量人体胖瘦程度以及是否健康的一个指标,计算公式如下所示。通常认为 $\small{18.5 \le BMI < 24}$ 是正常范围, $\small{BMI < 18.5}$ 说明体重过轻, $\small{BMI \ge 24}$ 说明体重过重, $\small{BMI \ge 27}$ 就属于肥胖的范畴了。
+
+$$
+BMI = \frac{体重}{身高^{2}}
+$$
+
+> **说明**:上面公式中的体重以千克(kg)为单位,身高以米(m)为单位。
+
+```python
+"""
+BMI计算器
+
+Version: 1.0
+Author: 骆昊
+"""
+height = float(input('身高(cm):'))
+weight = float(input('体重(kg):'))
+bmi = weight / (height / 100) ** 2
+print(f'{bmi = :.1f}')
+if 18.5 <= bmi < 24:
+ print('你的身材很棒!')
+```
+
+> **提示**:`if`语句的最后面有一个`:`,它是用英文输入法输入的冒号;程序中输入的`'`、`"`、`=`、`(`、`)`等特殊字符,都是在英文输入法状态下输入的,这一点之前已经提醒过大家了。很多初学者经常会忽略这一点,等到执行代码时,就会看到一大堆错误提示。当然,认真读一下错误提示还是很容易发现哪里出了问题,但是**强烈建议**大家在写代码的时候**切换到英文输入法**,这样可以避免很多不必要的麻烦。
+
+上面的代码中,我们在计算和输出 BMI 之后,加上了一段分支结构,如果满足 $\small{18.5 \le BMI < 24}$ ,程序会输出“你的身材很棒!”,但是如果不满足条件,这段输出就没有了。这就是刚才提到的,代码可以有不同的执行路径,有些代码不一定会执行到。我们在`if`关键字的后面给出了一个表达式`18.5 <= bmi < 24`,之前我们说过,关系运算会产生布尔值,如果`if`后面的布尔值为`True`,那么`if`语句下方,有四个空格缩进的`print('你的身材很棒!')`就会被执行。我们先输入几组数据运行上面的代码,如下所示。
+
+第一组输入:
+
+```
+身高(cm):175
+体重(kg):68
+bmi = 22.2
+你的身材很棒!
+```
+
+第二组输入:
+
+```
+身高(cm):175
+体重(kg):95
+bmi = 31.0
+```
+
+第三组输入:
+
+```
+身高(cm):175
+体重(kg):50
+bmi = 16.3
+```
+
+只有第一组输入的身高和体重计算出的 BMI 在 18.5 到 24 这个范围值内,所以触发了`if`条件,输出了“你的身材很棒”。需要说明的是,不同于 C、C++、Java 等编程语言,Python 中没有用花括号来构造代码块而是**使用缩进的方式来表示代码的层次结构**,如果`if`条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了。换句话说,若干行连续的语句如果保持了相同的缩进,那么它们就属于同一个**代码块**,相当于是一个执行的整体。缩进可以使用任意数量的空格,但**通常使用4个空格**,强烈建议大家**不要使用制表键(Tab键)来缩进代码**,如果你已经习惯了这么做,可以设置你的代码编辑器自动将 1 个制表键变成 4 个空格,很多代码编辑器都支持这项功能,PyCharm 中默认也是这样设定的。还有一点,在 C、C++、Java 等编程语言中,`18.5 <= bmi < 24`要写成两个条件`bmi >= 18.5`和`bmi < 24`,然后把两个条件用与运算符连接起来,Python 中也可以这么做,例如刚才的`if`语句也可以写成`if bmi >= 18.5 and bmi < 24:`,但是没有必要,难道`if 18.5 <= bmi < 24:`这个写法它不香吗?下面用 Java 代码做了同样的事情,看不懂 Java 代码没关系,感受一下它和 Python 语法的区别就可以了。
+
+```java
+import java.util.Scanner;
+
+class Test {
+
+ public static void main(String[] args) {
+ try (Scanner sc = new Scanner(System.in)) {
+ System.out.print("身高(cm): ");
+ double height = sc.nextDouble();
+ System.out.print("体重(kg): ");
+ double weight = sc.nextDouble();
+ double bmi = weight / Math.pow(height / 100, 2);
+ System.out.printf("bmi = %.1f\n", bmi);
+ if (bmi >= 18.5 && bmi < 24) {
+ System.out.println("你的身材很棒!");
+ }
+ }
+ }
+}
+```
+
+> **说明**:上面就是 BMI 计算器 1.0 版本对应的 Java 代码,很多人喜欢 Python 语言不是没有道理的,通常它都能用更少的代码解决同样的问题。
+
+接下来,我们对上面的代码稍作修改,在 BMI 不满足 $\small{18.5 \le BMI < 24}$ 的情况下,也给出相信的提示信息。我们可以在`if`代码块的后面增加一个`else`代码块,它会在`if`语句给出的条件没有达成时执行,如下所示。很显然,`if`下面的`print('你的身材很棒!')`和`else`下面的`print('你的身材不够标准哟!')`只有一个会被执行到。
+
+```python
+"""
+BMI计算器
+
+Version: 1.1
+Author: 骆昊
+"""
+height = float(input('身高(cm):'))
+weight = float(input('体重(kg):'))
+bmi = weight / (height / 100) ** 2
+print(f'{bmi = :.1f}')
+if 18.5 <= bmi < 24:
+ print('你的身材很棒!')
+else:
+ print('你的身材不够标准哟!')
+```
+
+如果要给出更为准确的提示信息,我们可以再次修改上面的代码,通过`elif`关键字为上面的分支结构增加更多的分支,如下所示。
+
+```python
+"""
+BMI计算器
+
+Version: 1.2
+Author: 骆昊
+"""
+height = float(input('身高(cm):'))
+weight = float(input('体重(kg):'))
+bmi = weight / (height / 100) ** 2
+print(f'{bmi = :.1f}')
+if bmi < 18.5:
+ print('你的体重过轻!')
+elif bmi < 24:
+ print('你的身材很棒!')
+elif bmi < 27:
+ print('你的体重过重!')
+elif bmi < 30:
+ print('你已轻度肥胖!')
+elif bmi < 35:
+ print('你已中度肥胖!')
+else:
+ print('你已重度肥胖!')
+```
+
+我们再用刚才的三组数据来测试下上面的代码,看看会得到怎样的结果。
+
+第一组输入:
+
+```
+身高(cm):175
+体重(kg):68
+bmi = 22.2
+你的身材很棒!
+```
+
+第二组输入:
+
+```
+身高(cm):175
+体重(kg):95
+bmi = 31.0
+你已中度肥胖!
+```
+
+第三组输入:
+
+```
+身高(cm):175
+体重(kg):50
+bmi = 16.3
+你的体重过轻!
+```
+
+### 使用match和case构造分支结构
+
+Python 3.10 中增加了一种新的构造分支结构的方式,通过使用`match`和`case` 关键字,我们可以轻松的构造出多分支结构。Python 的官方文档在介绍这个新语法时,举了一个 HTTP 响应状态码识别的例子(根据 HTTP 响应状态输出对应的描述),非常有意思。如果不知道什么是 HTTP 响应状态吗,可以看看 MDN 上面的[文档](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status)。下面我们对官方文档上的示例稍作修改,为大家讲解这个语法,先看看下面用`if-else`结构实现的代码。
+
+```python
+status_code = int(input('响应状态码: '))
+if status_code == 400:
+ description = 'Bad Request'
+elif status_code == 401:
+ description = 'Unauthorized'
+elif status_code == 403:
+ description = 'Forbidden'
+elif status_code == 404:
+ description = 'Not Found'
+elif status_code == 405:
+ description = 'Method Not Allowed'
+elif status_code == 418:
+ description = 'I am a teapot'
+elif status_code == 429:
+ description = 'Too many requests'
+else:
+ description = 'Unknown status Code'
+print('状态码描述:', description)
+```
+
+运行结果:
+
+```
+响应状态码: 403
+状态码描述: Forbidden
+```
+
+下面是使用`match-case`语法实现的代码,虽然作用完全相同,但是代码显得更加简单优雅。
+
+```python
+status_code = int(input('响应状态码: '))
+match status_code:
+ case 400: description = 'Bad Request'
+ case 401: description = 'Unauthorized'
+ case 403: description = 'Forbidden'
+ case 404: description = 'Not Found'
+ case 405: description = 'Method Not Allowed'
+ case 418: description = 'I am a teapot'
+ case 429: description = 'Too many requests'
+ case _: description = 'Unknown Status Code'
+print('状态码描述:', description)
+```
+
+> **说明**:带有`_`的`case`语句在代码中起到通配符的作用,如果前面的分支都没有匹配上,代码就会来到`case _`。`case _`的是可选的,并非每种分支结构都要给出通配符选项。如果分支中出现了`case _`,它只能放在分支结构的最后面,如果它的后面还有其他的分支,那么这些分支将是不可达的。
+
+当然,`match-case`语法还有很多高级玩法,其中有一个合并模式可以先教给大家。例如,我们要将响应状态码`401`、`403`和`404`归入一个分支,`400`和`405`归入到一个分支,其他保持不变,代码还可以这么写。
+
+```python
+status_code = int(input('响应状态码: '))
+match status_code:
+ case 400 | 405: description = 'Invalid Request'
+ case 401 | 403 | 404: description = 'Not Allowed'
+ case 418: description = 'I am a teapot'
+ case 429: description = 'Too many requests'
+ case _: description = 'Unknown Status Code'
+print('状态码描述:', description)
+```
+
+运行结果:
+
+```
+响应状态码: 403
+状态码描述: Not Allowed
+```
+
+### 分支结构的应用
+
+#### 例子1:分段函数求值
+
+有如下所示的分段函数,要求输入`x`,计算出`y`。
+
+$$
+y = \begin{cases} 3x - 5, & (x \gt 1) \\\\ x + 2, & (-1 \le x \le 1) \\\\ 5x + 3, & (x \lt -1) \end{cases}
+$$
+
+```python
+"""
+分段函数求值
+
+Version: 1.0
+Author: 骆昊
+"""
+x = float(input('x = '))
+if x > 1:
+ y = 3 * x - 5
+elif x >= -1:
+ y = x + 2
+else:
+ y = 5 * x + 3
+print(f'{y = }')
+```
+
+根据实际开发的需要,分支结构是可以嵌套的,也就是说在分支结构的`if`、`elif`或`else`代码块中还可以再次引入分支结构。例如`if`条件成立表示玩家过关,但过关以后还要根据你获得宝物或者道具的数量对你的表现给出评价(比如点亮一颗、两颗或三颗星星),那么我们就需要在`if`的内部再构造一个新的分支结构。同理,我们在`elif`和`else`中也可以构造新的分支,我们称之为嵌套的分支结构。按照这样的思路,上面的分段函数求值也可以用下面的代码来实现。
+
+```python
+"""
+分段函数求值
+
+Version: 1.1
+Author: 骆昊
+"""
+x = float(input('x = '))
+if x > 1:
+ y = 3 * x - 5
+else:
+ if x >= -1:
+ y = x + 2
+ else:
+ y = 5 * x + 3
+print(f'{y = }')
+```
+
+> **说明**:大家可以自己感受和评判一下上面两种写法哪一种更好。在“[**Python 之禅**](https://zhuanlan.zhihu.com/p/111843067)”中有这么一句话:“**Flat is better than nested**”。之所以认为“扁平化”的代码更好,是因为代码嵌套的层次如果很多,会严重的影响代码的可读性。所以,我个人更推荐大家使用第一种写法。
+
+#### 例子2:百分制成绩转换成等级
+
+要求:如果输入的成绩在90分以上(含90分),则输出`A`;输入的成绩在80分到90分之间(不含90分),则输出`B`;输入的成绩在70分到80分之间(不含80分),则输出`C`;输入的成绩在60分到70分之间(不含70分),则输出`D`;输入的成绩在60分以下,则输出`E`。
+
+```python
+"""
+百分制成绩转换为等级制成绩
+
+Version: 1.0
+Author: 骆昊
+"""
+score = float(input('请输入成绩: '))
+if score >= 90:
+ grade = 'A'
+elif score >= 80:
+ grade = 'B'
+elif score >= 70:
+ grade = 'C'
+elif score >= 60:
+ grade = 'D'
+else:
+ grade = 'E'
+print(f'{grade = }')
+```
+#### 例子3:计算三角形的周长和面积。
+
+要求:输入三条边的长度,如果能构成三角形就计算周长和面积;否则给出“不能构成三角形”的提示。
+
+```python
+"""
+计算三角形的周长和面积
+
+Version: 1.0
+Author: 骆昊
+"""
+a = float(input('a = '))
+b = float(input('b = '))
+c = float(input('c = '))
+if a + b > c and a + c > b and b + c > a:
+ perimeter = a + b + c
+ print(f'周长: {perimeter}')
+ s = perimeter / 2
+ area = (s * (s - a) * (s - b) * (s - c)) ** 0.5
+ print(f'面积: {area}')
+else:
+ print('不能构成三角形')
+```
+> **说明:** 上面的`if` 条件表示任意两边之和大于第三边,这是构成三角形的必要条件。当这个条件成立时,我们要计算并输出周长和面积,所以`if`下方有五条语句都保持了相同的缩进,它们是一个整体,只要`if`条件成立,它们都会被执行,这就是我们之前提到的代码块的概念。另外,上面计算三角形面积的公式叫做海伦公式,假设有一个三角形,边长分别为 $\small{a}$ 、 $\small{b}$ 、 $\small{c}$ ,那么三角的面积 $\small{A}$ 可以由公式 $\small{A = \sqrt{s(s-a)(s-b)(s-c)}}$ 得到,其中, $s=\frac{a + b + c}{2}$ 表示半周长。
+
+### 总结
+
+学会了 Python 中的分支结构和循环结构,我们就可以解决很多实际的问题了。这一节课相信已经帮助大家掌握了构造分支结构的方法,下一节课我们为大家介绍循环结构,学完这两次课你一定会发现,你能写出很多很有意思的代码,继续加油吧!
diff --git "a/Day01-20/06.\345\276\252\347\216\257\347\273\223\346\236\204.md" "b/Day01-20/06.\345\276\252\347\216\257\347\273\223\346\236\204.md"
new file mode 100755
index 000000000..598a6bfdd
--- /dev/null
+++ "b/Day01-20/06.\345\276\252\347\216\257\347\273\223\346\236\204.md"
@@ -0,0 +1,337 @@
+## 循环结构
+
+我们在写程序的时候,极有可能遇到需要重复执行某条或某些指令的场景,例如我们需要每隔1秒钟在屏幕上输出一次“hello, world”并持续输出一个小时。如下所示的代码可以完成一次这样的操作,如果要持续输出一个小时,我们就需要把这段代码写3600遍,你愿意这么做吗?
+
+```python
+import time
+
+print('hello, world')
+time.sleep(1)
+```
+
+> **说明**:Python 内置`time`模块的`sleep`函数可以实现程序的休眠,参数`1`表示休眠的秒数,可以使用`int`或`float`类型,例如`0.05`表示`50`毫秒。关于函数和模块的知识,我们在后续的课程中会为大家讲解。
+
+为了应对上述场景中的问题,我们可以在 Python 程序中使用循环结构。所谓循环结构,就是程序中控制某条或某些指令重复执行的结构。有了这样的结构,刚才的代码就不需要写 3600 遍,而是写一遍然后放到循环结构中重复 3600 次。在 Python 语言中构造循环结构有两种做法,一种是`for-in`循环,另一种是`while`循环。
+
+### for-in循环
+
+如果明确知道循环执行的次数,我们推荐使用`for-in`循环,例如上面说的那个重复 3600 次的场景,我们可以用下面的代码来实现。 注意,被`for-in`循环控制的代码块也是通过缩进的方式来构造,这一点跟分支结构中构造代码块的做法是一样的。我们被`for-in`循环控制的代码块称为循环体,通常循环体中的语句会根据循环的设定被重复执行。
+
+```python
+"""
+每隔1秒输出一次“hello, world”,持续1小时
+
+Author: 骆昊
+Version: 1.0
+"""
+import time
+
+for i in range(3600):
+ print('hello, world')
+ time.sleep(1)
+```
+
+需要说明的是,上面代码中的`range(3600)`可以构造出一个从`0`到`3599`的范围,当我们把这样一个范围放到`for-in`循环中,就可以通过前面的循环变量`i`依次取出从`0`到`3599`的整数,这就会让`for-in`代码块中的语句重复 3600 次。当然,`range`的用法非常灵活,下面的清单给出了使用`range`函数的例子:
+
+- `range(101)`:可以用来产生`0`到`100`范围的整数,需要注意的是取不到`101`。
+- `range(1, 101)`:可以用来产生`1`到`100`范围的整数,相当于是左闭右开的设定,即`[1, 101)`。
+- `range(1, 101, 2)`:可以用来产生`1`到`100`的奇数,其中`2`是步长(跨度),即每次递增的值,`101`取不到。
+- `range(100, 0, -2)`:可以用来产生`100`到`1`的偶数,其中`-2`是步长(跨度),即每次递减的值,`0`取不到。
+
+大家可能已经注意到了,上面代码的输出操作和休眠操作都没有用到循环变量`i`,对于不需要用到循环变量的`for-in`循环结构,按照 Python 的编程惯例,我们通常把循环变量命名为`_`,修改后的代码如下所示。虽然结果没什么变化,但是这样写显得你更加专业,逼格瞬间拉满。
+
+```python
+"""
+每隔1秒输出一次“hello, world”,持续1小时
+
+Author: 骆昊
+Version: 1.1
+"""
+import time
+
+for _ in range(3600):
+ print('hello, world')
+ time.sleep(1)
+```
+
+上面的代码要执行一个小时,如果想提前结束程序,在 PyCharm 中可以点击运行窗口上的停止按钮,如下图所示。如果在命令提示符或终端中运行代码,可以使用组合键`ctrl+c`来终止程序。
+
+
+
+下面,我们用`for-in`循环实现从 1 到 100 的整数求和,即 $\small{\sum_{n=1}^{100}{n}}$ 。
+
+```python
+"""
+从1到100的整数求和
+
+Version: 1.0
+Author: 骆昊
+"""
+total = 0
+for i in range(1, 101):
+ total += i
+print(total)
+```
+
+上面的代码中,变量`total`的作用是保存累加的结果。在循环的过程中,循环变量`i`的值会从 1 一直取到 100。对于变量`i`的每个取值,我们都执行了`total += i`,它相当于`total = total + i`,这条语句实现了累加操作。所以,当循环结束,我们输出变量`total` 的值,它的值就是从 1 累加到 100 的结果 5050。注意,`print(total)`这条语句前是没有缩进的,它不受`for-in`循环的控制,不会重复执行。
+
+我们再来写一个从1到100偶数求和的代码,如下所示。
+
+```python
+"""
+从1到100的偶数求和
+
+Version: 1.0
+Author: 骆昊
+"""
+total = 0
+for i in range(1, 101):
+ if i % 2 == 0:
+ total += i
+print(total)
+```
+
+> **说明**:上面的`for-in`循环中我们使用了分支结构来判断循环变量`i`是不是偶数。
+
+我们也可以修改`range`函数的参数,将起始值和跨度修改为`2`,用更为简单的代码实现从 1 到 100 的偶数求和。
+
+```python
+"""
+从1到100的偶数求和
+
+Version: 1.1
+Author: 骆昊
+"""
+total = 0
+for i in range(2, 101, 2):
+ total += i
+print(total)
+```
+
+当然, 更为简单的办法是使用 Python 内置的`sum`函数求和,这样我们连循环结构都省掉了。
+
+```python
+"""
+从1到100的偶数求和
+
+Version: 1.2
+Author: 骆昊
+"""
+print(sum(range(2, 101, 2)))
+```
+
+### while循环
+
+如果要构造循环结构但是又不能确定循环重复的次数,我们推荐使用`while`循环。`while`循环通过布尔值或能产生布尔值的表达式来控制循环,当布尔值或表达式的值为`True`时,循环体(`while`语句下方保持相同缩进的代码块)中的语句就会被重复执行,当表达式的值为`False`时,结束循环。
+
+下面我们用`while`循环来实现从 1 到 100 的整数求和,代码如下所示。
+
+```python
+"""
+从1到100的整数求和
+
+Version: 1.1
+Author: 骆昊
+"""
+total = 0
+i = 1
+while i <= 100:
+ total += i
+ i += 1
+print(total)
+```
+
+相较于`for-in`循环,上面的代码我们在循环开始前增加了一个变量`i`,我们使用这个变量来控制循环,所以`while`后面给出了`i <= 100`的条件。在`while`的循环体中,我们除了做累加,还需要让变量`i`的值递增,所以我们添加了`i += 1`这条语句,这样`i`的值就会依次取到1、2、3、……,直到 101。当`i`变成 101 时,`while`循环的条件不再成立,代码会离开`while`循环,此时我们输出变量`total`的值,它就是从 1 到 100 求和的结果 5050。
+
+如果要实现从 1 到 100 的偶数求和,我们可以对上面的代码稍作修改。
+
+```python
+"""
+从1到100的偶数求和
+
+Version: 1.3
+Author: 骆昊
+"""
+total = 0
+i = 2
+while i <= 100:
+ total += i
+ i += 2
+print(total)
+```
+
+### break和continue
+
+如果把`while`循环的条件设置为`True`,即让条件恒成立会怎么样呢?我们看看下面的代码,还是使用`while`构造循环结构,计算 1 到 100 的偶数和。
+
+```python
+"""
+从1到100的偶数求和
+
+Version: 1.4
+Author: 骆昊
+"""
+total = 0
+i = 2
+while True:
+ total += i
+ i += 2
+ if i > 100:
+ break
+print(total)
+```
+
+上面的代码中使用`while True`构造了一个条件恒成立的循环,也就意味着如果不做特殊处理,循环是不会结束的,这就是我们常说的“死循环”。为了在`i`的值超过 100 后让循环停下来,我们使用了`break`关键字,它的作用是终止循环结构的执行。需要注意的是,`break`只能终止它所在的那个循环,这一点在使用嵌套循环结构时需要引起注意,后面我们会讲到什么是嵌套的循环结构。除了`break`之外,还有另一个在循环结构中可以使用的关键字`continue`,它可以用来放弃本次循环后续的代码直接让循环进入下一轮,代码如下所示。
+
+```python
+"""
+从1到100的偶数求和
+
+Version: 1.5
+Author: 骆昊
+"""
+total = 0
+for i in range(1, 101):
+ if i % 2 != 0:
+ continue
+ total += i
+print(total)
+```
+
+> **说明**:上面的代码使用`continue`关键字跳过了`i`是奇数的情况,只有在`i`是偶数的前提下,才会执行到`total += i`。
+
+### 嵌套的循环结构
+
+和分支结构一样,循环结构也是可以嵌套的,也就是说在循环结构中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个乘法口诀表(九九表)。
+
+```python
+"""
+打印乘法口诀表
+
+Version: 1.0
+Author: 骆昊
+"""
+for i in range(1, 10):
+ for j in range(1, i + 1):
+ print(f'{i}×{j}={i * j}', end='\t')
+ print()
+```
+
+上面的代码中,`for-in`循环的循环体中又用到了`for-in`循环,外面的循环用来控制产生`i`行的输出,而里面的循环则用来控制在一行中输出`j`列。显然,里面的`for-in`循环的输出就是乘法口诀表中的一整行。所以在里面的循环完成时,我们用了一个`print()`来实现换行的效果,让下面的输出重新另起一行,最后的输出如下所示。
+
+```
+1×1=1
+2×1=2 2×2=4
+3×1=3 3×2=6 3×3=9
+4×1=4 4×2=8 4×3=12 4×4=16
+5×1=5 5×2=10 5×3=15 5×4=20 5×5=25
+6×1=6 6×2=12 6×3=18 6×4=24 6×5=30 6×6=36
+7×1=7 7×2=14 7×3=21 7×4=28 7×5=35 7×6=42 7×7=49
+8×1=8 8×2=16 8×3=24 8×4=32 8×5=40 8×6=48 8×7=56 8×8=64
+9×1=9 9×2=18 9×3=27 9×4=36 9×5=45 9×6=54 9×7=63 9×8=72 9×9=81
+```
+
+### 循环结构的应用
+
+#### 例子1:判断素数
+
+要求:输入一个大于 1 的正整数,判断它是不是素数。
+
+> **提示**:素数指的是只能被 1 和自身整除的大于 1 的整数。例如对于正整数 $\small{n}$,我们可以通过在 2 到 $\small{n - 1}$ 之间寻找有没有 $\small{n}$ 的因子,来判断它到底是不是一个素数。当然,循环不用从 2 开始到 $\small{n - 1}$ 结束,因为对于大于 1 的正整数,因子应该都是成对出现的,所以循环到 $\small{\sqrt{n}}$ 就可以结束了。
+
+```python
+"""
+输入一个大于1的正整数判断它是不是素数
+
+Version: 1.0
+Author: 骆昊
+"""
+num = int(input('请输入一个正整数: '))
+end = int(num ** 0.5)
+is_prime = True
+for i in range(2, end + 1):
+ if num % i == 0:
+ is_prime = False
+ break
+if is_prime:
+ print(f'{num}是素数')
+else:
+ print(f'{num}不是素数')
+```
+
+> **说明**:上面的代码中我们用了布尔型的变量`is_prime`,我们先将它赋值为`True`,假设`num`是一个素数;接下来,我们在 2 到`num ** 0.5`的范围寻找`num`的因子,如果找到了`num`的因子,那么它一定不是素数,此时我们将`is_prime`赋值为`False`,同时使用`break`关键字终止循环结构;最后,我们根据`is_prime`的值是`True`还是`False`来给出不同的输出。
+
+#### 例子2:最大公约数
+
+要求:输入两个大于 0 的正整数,求两个数的最大公约数。
+
+> **提示**:两个数的最大公约数是两个数的公共因子中最大的那个数。
+
+```python
+"""
+输入两个正整数求它们的最大公约数
+
+Version: 1.0
+Author: 骆昊
+"""
+x = int(input('x = '))
+y = int(input('y = '))
+for i in range(x, 0, -1):
+ if x % i == 0 and y % i == 0:
+ print(f'最大公约数: {i}')
+ break
+```
+
+> **说明**:上面代码中`for-in`循环的循环变量值是从大到小的,这样我们找到的能够同时整除`x`和`y`的因子`i`,就是`x`和`y`的最大公约数,此时我们用`break`终止循环。如果`x`和`y`互质,那么循环会执行到`i`变成 1,因为 1 是所有正整数的因子,此时`x`和`y`的最大公约数就是 1。
+
+用上面代码的找最大公约数在执行效率是有问题的。假如`x`的值是`999999999998`,`y`的值是`999999999999`,很显然两个数是互质的,最大公约数为 1。但是我们使用上面的代码,循环会重复`999999999998`次,这通常是难以接受的。我们可以使用欧几里得算法来找最大公约数,它能帮我们更快的得到想要的结果,代码如下所示。
+
+```python
+"""
+输入两个正整数求它们的最大公约数
+
+Version: 1.1
+Author: 骆昊
+"""
+x = int(input('x = '))
+y = int(input('y = '))
+while y % x != 0:
+ x, y = y % x, x
+print(f'最大公约数: {x}')
+```
+
+> **说明**:解决问题的方法和步骤可以称之为算法,对于同一个问题,我们可以设计出不同的算法,不同的算法在存储空间的占用和执行效率上都会存在差别,而这些差别就代表了算法的优劣。大家可以对比上面的两段待会,体会一下为什么我们说欧几里得算法是更好的选择。上面的代码中`x, y = y % x, x`语句表示将`y % x`的值赋给`x`,将`x` 原来的值赋给`y`。
+
+#### 例子3:猜数字游戏
+
+要求:计算机出一个 1 到 100 之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息“大一点”、“小一点”或“猜对了”,如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。
+
+```python
+"""
+猜数字小游戏
+
+Version: 1.0
+Author: 骆昊
+"""
+import random
+
+answer = random.randrange(1, 101)
+counter = 0
+while True:
+ counter += 1
+ num = int(input('请输入: '))
+ if num < answer:
+ print('大一点.')
+ elif num > answer:
+ print('小一点.')
+ else:
+ print('猜对了.')
+ break
+print(f'你一共猜了{counter}次.')
+```
+
+> **说明**:上面的代码使用`import random`导入了 Python 标准库的`random`模块,该模块的`randrange`函数帮助我们生成了 1 到 100 范围的随机数(不包括 100)。变量`counter`用来记录循环执行的次数,也就是用户一共猜了几次,每循环一次`counter`的值都会加 1。
+
+### 总结
+
+学会了 Python 中的分支结构和循环结构,我们就可以解决很多实际的问题了。通过这节课的学习,大家应该已经知道了可以用`for`和`while`关键字来构造循环结构。**如果事先知道循环结构重复的次数,我们通常使用**`for`**循环**;**如果循环结构的重复次数不能确定,可以用**`while`**循环**。此外,我们可以在循环结构中**使用**`break`**终止循环**,**也可以在循环结构中使用**`continue`**关键字让循环结构直接进入下一轮次**。
diff --git "a/Day01-20/07.\345\210\206\346\224\257\345\222\214\345\276\252\347\216\257\347\273\223\346\236\204\345\256\236\346\210\230.md" "b/Day01-20/07.\345\210\206\346\224\257\345\222\214\345\276\252\347\216\257\347\273\223\346\236\204\345\256\236\346\210\230.md"
new file mode 100755
index 000000000..5c06f09b3
--- /dev/null
+++ "b/Day01-20/07.\345\210\206\346\224\257\345\222\214\345\276\252\347\216\257\347\273\223\346\236\204\345\256\236\346\210\230.md"
@@ -0,0 +1,173 @@
+## 分支和循环结构实战
+
+通过前面两节课的学习,大家对 Python 中的分支结构和循环结构已经有了初步的认知。**分支结构和循环结构是构造程序逻辑的基础**,它们的重要性不言而喻,但是对于初学者来说这也是比较困难的部分。很多人对分支结构和循环结构的语法是能够理解的,但是遇到实际问题的时候又无法下手;**看懂别人的代码很容易,但是要自己写出类似的代码却又很难**。如果你也有同样的问题和困惑,千万不要沮丧,这只是因为你的编程之旅才刚刚开始,**你的练习量还没有达到让你可以随心所欲写出代码的程度**,只要加强编程练习,通过量的积累来产生质的变化,这个问题迟早都会解决的。
+
+### 例子1:100以内的素数
+
+> **说明**:素数指的是只能被 1 和自身整除的正整数(不包括 1),之前我们写过判断素数的代码,这里相当于是一个升级版本。
+
+```python
+"""
+输出100以内的素数
+
+Version: 1.0
+Author: 骆昊
+"""
+for num in range(2, 100):
+ is_prime = True
+ for i in range(2, int(num ** 0.5) + 1):
+ if num % i == 0:
+ is_prime = False
+ break
+ if is_prime:
+ print(num)
+```
+
+### 例子2:斐波那契数列
+
+要求:输出斐波那契数列中的前 20 个数。
+
+> **说明**:斐波那契数列(Fibonacci sequence),通常也被称作黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中研究理想假设条件下兔子成长率问题而引入的数列,因此这个数列也常被戏称为“兔子数列”。斐波那契数列的特点是数列的前两个数都是 1,从第三个数开始,每个数都是它前面两个数的和。按照这个规律,斐波那契数列的前 10 个数是:`1, 1, 2, 3, 5, 8, 13, 21, 34, 55`。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。
+
+```python
+"""
+输出斐波那契数列中的前20个数
+
+Version: 1.0
+Author: 骆昊
+"""
+
+a, b = 0, 1
+for _ in range(20):
+ a, b = b, a + b
+ print(a)
+```
+
+> **说明**:上面循环中的`a, b = b, a + b`表示将变量`b`的值赋给`a`,把`a + b`的值赋给`b`。通过这个递推公式,我们可以依次获得斐波那契数列中的数。
+
+### 例子3:寻找水仙花数
+
+要求:找出 100 到 999 范围内的所有水仙花数。
+
+> **提示**:在数论中,水仙花数(narcissistic number)也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个 $\small{N}$ 位非负整数,其各位数字的 $\small{N}$ 次方和刚好等于该数本身,例如: $\small{153 = 1^{3} + 5^{3} + 3^{3}}$ ,所以 153 是一个水仙花数; $\small{1634 = 1^{4} + 6^{4} + 3^{4} + 4^{4}}$ ,所以 1634 也是一个水仙花数。对于三位数,解题的关键是将它拆分为个位、十位、百位,再判断是否满足水仙花数的要求,这一点利用 Python 中的`//`和`%`运算符其实很容易做到。
+
+```python
+"""
+找出100到999范围内的水仙花数
+
+Version: 1.0
+Author: 骆昊
+"""
+for num in range(100, 1000):
+ low = num % 10
+ mid = num // 10 % 10
+ high = num // 100
+ if num == low ** 3 + mid ** 3 + high ** 3:
+ print(num)
+```
+
+上面利用`//`和`%`拆分一个数的小技巧在写代码的时候还是很常用的。我们要将一个不知道有多少位的正整数进行反转,例如将 12389 变成 98321,也可以利用这两个运算来实现,代码如下所示。
+
+```python
+"""
+正整数的反转
+
+Version: 1.0
+Author: 骆昊
+"""
+num = int(input('num = '))
+reversed_num = 0
+while num > 0:
+ reversed_num = reversed_num * 10 + num % 10
+ num //= 10
+print(reversed_num)
+```
+
+### 例子4:百钱百鸡问题
+
+> **说明**:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡 5 元一只,母鸡 3 元一只,小鸡 1 元三只,用 100 块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?
+
+```python
+"""
+百钱百鸡问题
+
+Version: 1.0
+Author: 骆昊
+"""
+for x in range(0, 21):
+ for y in range(0, 34):
+ for z in range(0, 100, 3):
+ if x + y + z == 100 and 5 * x + 3 * y + z // 3 == 100:
+ print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')
+```
+
+上面使用的方法叫做**穷举法**,也称为**暴力搜索法**,这种方法通过一项一项的列举备选解决方案中所有可能的候选项,并检查每个候选项是否符合问题的描述,最终得到问题的解。上面的代码中,我们使用了嵌套的循环结构,假设公鸡有`x`只,显然`x`的取值范围是 0 到 20,假设母鸡有`y`只,它的取值范围是 0 到 33,假设小鸡有`z`只,它的取值范围是 0 到 99 且取值是 3 的倍数。这样,我们设置好 100 只鸡的条件`x + y + z == 100`,设置好 100 块钱的条件`5 * x + 3 * y + z // 3 == 100`,当两个条件同时满足时,就是问题的正确答案,我们用`print`函数输出它。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,只要问题的解存在就能够找到它。
+
+事实上,上面的代码还有更好的写法,既然我们已经假设公鸡有`x`只,母鸡有`y`只,那么小鸡的数量就应该是`100 - x - y`,这样减少一个条件,我们就可以把上面三层嵌套的`for-in`循环改写为两层嵌套的`for-in`循环。循环次数减少了,代码的执行效率就有了显著的提升,如下所示。
+
+```python
+"""
+百钱百鸡问题
+
+Version: 1.1
+Author: 骆昊
+"""
+for x in range(0, 21):
+ for y in range(0, 34):
+ z = 100 - x - y
+ if z % 3 == 0 and 5 * x + 3 * y + z // 3 == 100:
+ print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')
+```
+
+> **说明**:上面代码中的`z % 3 == 0`是为了确保小鸡的数量是 3 的倍数。
+
+### 例子5:CRAPS赌博游戏
+
+> **说明**:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简化后的规则是:玩家第一次摇骰子如果摇出了 7 点或 11 点,玩家胜;玩家第一次如果摇出 2 点、3 点或 12 点,庄家胜;玩家如果摇出其他点数则游戏继续,玩家重新摇骰子,如果玩家摇出了 7 点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数玩家继续摇骰子,直到分出胜负。为了增加代码的趣味性,我们设定游戏开始时玩家有 1000 元的赌注,每局游戏开始之前,玩家先下注,如果玩家获胜就可以获得对应下注金额的奖励,如果庄家获胜,玩家就会输掉自己下注的金额。游戏结束的条件是玩家破产(输光所有的赌注)。
+
+```python
+"""
+Craps赌博游戏
+
+Version: 1.0
+Author: 骆昊
+"""
+import random
+
+money = 1000
+while money > 0:
+ print(f'你的总资产为: {money}元')
+ # 下注金额必须大于0且小于等于玩家的总资产
+ while True:
+ debt = int(input('请下注: '))
+ if 0 < debt <= money:
+ break
+ # 用两个1到6均匀分布的随机数相加模拟摇两颗色子得到的点数
+ first_point = random.randrange(1, 7) + random.randrange(1, 7)
+ print(f'\n玩家摇出了{first_point}点')
+ if first_point == 7 or first_point == 11:
+ print('玩家胜!\n')
+ money += debt
+ elif first_point == 2 or first_point == 3 or first_point == 12:
+ print('庄家胜!\n')
+ money -= debt
+ else:
+ # 如果第一次摇色子没有分出胜负,玩家需要重新摇色子
+ while True:
+ current_point = random.randrange(1, 7) + random.randrange(1, 7)
+ print(f'玩家摇出了{current_point}点')
+ if current_point == 7:
+ print('庄家胜!\n')
+ money -= debt
+ break
+ elif current_point == first_point:
+ print('玩家胜!\n')
+ money += debt
+ break
+print('你破产了, 游戏结束!')
+```
+
+### 总结
+
+分支结构和循环结构都非常重要,是构造程序逻辑的基础,**一定要通过大量的练习来达到融会贯通**。我们可以用上面讲的花旗骰游戏作为一个标准,如果你能够很顺利的完成这段代码,那么分支结构和循环结构的知识你就已经很好的掌握了。
+
diff --git "a/Day01-20/08.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\210\227\350\241\250-1.md" "b/Day01-20/08.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\210\227\350\241\250-1.md"
new file mode 100755
index 000000000..7d7d02551
--- /dev/null
+++ "b/Day01-20/08.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\210\227\350\241\250-1.md"
@@ -0,0 +1,226 @@
+## 常用数据结构之列表-1
+
+在开始本节课的内容之前,我们先给大家一个编程任务,将一颗色子掷 6000 次,统计每种点数出现的次数。这个任务对大家来说应该是非常简单的,我们可以用 1 到 6 均匀分布的随机数来模拟掷色子,然后用 6 个变量分别记录每个点数出现的次数,相信通过前面的学习,大家都能比较顺利的写出下面的代码。
+
+```python
+"""
+将一颗色子掷6000次,统计每种点数出现的次数
+
+Author: 骆昊
+Version: 1.0
+"""
+import random
+
+f1 = 0
+f2 = 0
+f3 = 0
+f4 = 0
+f5 = 0
+f6 = 0
+for _ in range(6000):
+ face = random.randrange(1, 7)
+ if face == 1:
+ f1 += 1
+ elif face == 2:
+ f2 += 1
+ elif face == 3:
+ f3 += 1
+ elif face == 4:
+ f4 += 1
+ elif face == 5:
+ f5 += 1
+ else:
+ f6 += 1
+print(f'1点出现了{f1}次')
+print(f'2点出现了{f2}次')
+print(f'3点出现了{f3}次')
+print(f'4点出现了{f4}次')
+print(f'5点出现了{f5}次')
+print(f'6点出现了{f6}次')
+```
+
+上面的代码非常有多么“丑陋”相信就不用我多说了。当然,更为可怕的是,如果我们要掷两颗或者掷更多的色子,然后统计每种点数出现的次数,那就需要定义更多的变量,写更多的分支结构,大家想想都会感到恶心。讲到这里,相信大家心中已经有一个疑问了:有没有办法用一个变量来保存多个数据,有没有办法用统一的代码对多个数据进行操作?答案是肯定的,在 Python 语言中我们可以通过容器型变量来保存和操作多个数据,我们首先为大家介绍列表(`list`)这种新的数据类型。
+
+### 创建列表
+
+在 Python 中,**列表是由一系元素按特定顺序构成的数据序列**,这就意味着如果我们定义一个列表类型的变量,**可以用它来保存多个数据**。在 Python 中,可以使用`[]`字面量语法来定义列表,列表中的多个元素用逗号进行分隔,代码如下所示。
+
+```python
+items1 = [35, 12, 99, 68, 55, 35, 87]
+items2 = ['Python', 'Java', 'Go', 'Kotlin']
+items3 = [100, 12.3, 'Python', True]
+print(items1) # [35, 12, 99, 68, 55, 35, 87]
+print(items2) # ['Python', 'Java', 'Go', 'Kotlin']
+print(items3) # [100, 12.3, 'Python', True]
+```
+
+> **说明**:列表中可以有重复元素,例如`items1`中的`35`;列表中可以有不同类型的元素,例如`items3`中有`int`类型、`float`类型、`str`类型和`bool`类型的元素,但是我们通常并不建议将不同类型的元素放在同一个列表中,主要是操作起来极为不便。
+
+我们可以使用`type`函数来查看变量的类型,有兴趣的小伙伴可以自行查看上面的变量`items1`到底是什么类型。因为列表可以保存多个元素,它是一种容器型的数据类型,所以我们在给列表类型的变量起名字时,变量名通常用复数形式的单词。
+
+除此以外,还可以通过 Python 内置的`list`函数将其他序列变成列表。准确的说,`list`并不是一个普通的函数,它是创建列表对象的构造器,后面的课程会为大家介绍对象和构造器这些概念。
+
+```python
+items4 = list(range(1, 10))
+items5 = list('hello')
+print(items4) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
+print(items5) # ['h', 'e', 'l', 'l', 'o']
+```
+
+> **说明**:`range(1, 10)`会产生`1`到`9`的整数序列,给到`list`构造器中,会创建出由`1`到`9`的整数构成的列表。字符串是字符构成的序列,上面的`list('hello')`用字符串`hello`的字符作为列表元素,创建了列表对象。
+
+### 列表的运算
+
+我们可以使用`+`运算符实现两个列表的拼接,拼接运算会将两个列表中的元素连接起来放到一个列表中,代码如下所示。
+
+```python
+items5 = [35, 12, 99, 45, 66]
+items6 = [45, 58, 29]
+items7 = ['Python', 'Java', 'JavaScript']
+print(items5 + items6) # [35, 12, 99, 45, 66, 45, 58, 29]
+print(items6 + items7) # [45, 58, 29, 'Python', 'Java', 'JavaScript']
+items5 += items6
+print(items5) # [35, 12, 99, 45, 66, 45, 58, 29]
+```
+
+我们可以使用`*`运算符实现列表的重复运算,`*`运算符会将列表元素重复指定的次数,我们在上面的代码中增加两行,如下所示。
+
+```python
+print(items6 * 3) # [45, 58, 29, 45, 58, 29, 45, 58, 29]
+print(items7 * 2) # ['Python', 'Java', 'JavaScript', 'Python', 'Java', 'JavaScript']
+```
+
+我们可以使用`in`或`not in`运算符判断一个元素在不在列表中,我们在上面的代码代码中再增加两行,如下所示。
+
+```python
+print(29 in items6) # True
+print(99 in items6) # False
+print('C++' not in items7) # True
+print('Python' not in items7) # False
+```
+
+由于列表中有多个元素,而且元素是按照特定顺序放在列表中的,所以当我们想操作列表中的某个元素时,可以使用`[]`运算符,通过在`[]`中指定元素的位置来访问该元素,这种运算称为索引运算。需要说明的是,`[]`的元素位置可以是`0`到`N - 1`的整数,也可以是`-1`到`-N`的整数,分别称为正向索引和反向索引,其中`N`代表列表元素的个数。对于正向索引,`[0]`可以访问列表中的第一个元素,`[N - 1]`可以访问最后一个元素;对于反向索引,`[-1]`可以访问列表中的最后一个元素,`[-N]`可以访问第一个元素,代码如下所示。
+
+```python
+items8 = ['apple', 'waxberry', 'pitaya', 'peach', 'watermelon']
+print(items8[0]) # apple
+print(items8[2]) # pitaya
+print(items8[4]) # watermelon
+items8[2] = 'durian'
+print(items8) # ['apple', 'waxberry', 'durian', 'peach', 'watermelon']
+print(items8[-5]) # 'apple'
+print(items8[-4]) # 'waxberry'
+print(items8[-1]) # watermelon
+items8[-4] = 'strawberry'
+print(items8) # ['apple', 'strawberry', 'durian', 'peach', 'watermelon']
+```
+
+在使用索引运算的时候要避免出现索引越界的情况,对于上面的`items8`,如果我们访问`items8[5]`或`items8[-6]`,就会引发`IndexError`错误,导致程序崩溃,对应的错误信息是:*list index out of range*,翻译成中文就是“数组索引超出范围”。因为对于只有五个元素的列表`items8`,有效的正向索引是`0`到`4`,有效的反向索引是`-1`到`-5`。
+
+如果希望一次性访问列表中的多个元素,我们可以使用切片运算。切片运算是形如`[start:end:stride]`的运算符,其中`start`代表访问列表元素的起始位置,`end`代表访问列表元素的终止位置(终止位置的元素无法访问),而`stride`则代表了跨度,简单的说就是位置的增量,比如我们访问的第一个元素在`start`位置,那么第二个元素就在`start + stride`位置,当然`start + stride`要小于`end`。我们给上面的代码增加下面的语句,来使用切片运算符访问列表元素。
+
+```python
+print(items8[1:3:1]) # ['strawberry', 'durian']
+print(items8[0:3:1]) # ['apple', 'strawberry', 'durian']
+print(items8[0:5:2]) # ['apple', 'durian', 'watermelon']
+print(items8[-4:-2:1]) # ['strawberry', 'durian']
+print(items8[-2:-6:-1]) # ['peach', 'durian', 'strawberry', 'apple']
+```
+
+> **提醒**:大家可以看看上面代码中的最后一行,想一想当跨度为负数时,切片运算是如何访问元素的。
+
+如果`start`值等于`0`,那么在使用切片运算符时可以将其省略;如果`end`值等于`N`,`N`代表列表元素的个数,那么在使用切片运算符时可以将其省略;如果`stride`值等于`1`,那么在使用切片运算符时也可以将其省略。所以,下面的代码跟上面的代码作用完全相同。
+
+```python
+print(items8[1:3]) # ['strawberry', 'durian']
+print(items8[:3:1]) # ['apple', 'strawberry', 'durian']
+print(items8[::2]) # ['apple', 'durian', 'watermelon']
+print(items8[-4:-2]) # ['strawberry', 'durian']
+print(items8[-2::-1]) # ['peach', 'durian', 'strawberry', 'apple']
+```
+
+事实上,我们还可以通过切片操作修改列表中的元素,例如我们给上面的代码再加上一行,大家可以看看这里的输出。
+
+```python
+items8[1:3] = ['x', 'o']
+print(items8) # ['apple', 'x', 'o', 'peach', 'watermelon']
+```
+
+两个列表还可以做关系运算,我们可以比较两个列表是否相等,也可以给两个列表比大小,代码如下所示。
+
+```python
+nums1 = [1, 2, 3, 4]
+nums2 = list(range(1, 5))
+nums3 = [3, 2, 1]
+print(nums1 == nums2) # True
+print(nums1 != nums2) # False
+print(nums1 <= nums3) # True
+print(nums2 >= nums3) # False
+```
+
+> **说明**:上面的`nums1`和`nums2`对应元素完全相同,所以`==`运算的结果是`True`。`nums2`和`nums3`的比较,由于`nums2`的第一个元素`1`小于`nums3`的第一个元素`3`,所以`nums2 >= nums3`比较的结果是`False`。两个列表的关系运算在实际工作并不那么常用,如果实在不理解就跳过吧,不用纠结。
+
+### 元素的遍历
+
+如果想逐个取出列表中的元素,可以使用`for-in`循环的,有以下两种做法。
+
+方法一:在循环结构中通过索引运算,遍历列表元素。
+
+```python
+languages = ['Python', 'Java', 'C++', 'Kotlin']
+for index in range(len(languages)):
+ print(languages[index])
+```
+
+输出:
+
+```
+Python
+Java
+C++
+Kotlin
+```
+
+> **说明**:上面的`len`函数可以获取列表元素的个数`N`,而`range(N)`则构成了从`0`到`N-1`的范围,刚好可以作为列表元素的索引。
+
+方法二:直接对列表做循环,循环变量就是列表元素的代表。
+
+```python
+languages = ['Python', 'Java', 'C++', 'Kotlin']
+for language in languages:
+ print(language)
+```
+
+输出:
+
+```
+Python
+Java
+C++
+Kotlin
+```
+
+### 总结
+
+讲到这里,我们可以用列表的知识来重构上面“掷色子统计每种点数出现次数”的代码。
+
+```python
+"""
+将一颗色子掷6000次,统计每种点数出现的次数
+
+Author: 骆昊
+Version: 1.1
+"""
+import random
+
+counters = [0] * 6
+# 模拟掷色子记录每种点数出现的次数
+for _ in range(6000):
+ face = random.randrange(1, 7)
+ counters[face - 1] += 1
+# 输出每种点数出现的次数
+for face in range(1, 7):
+ print(f'{face}点出现了{counters[face - 1]}次')
+```
+
+上面的代码中,我们用`counters`列表中的六个元素分别表示 1 到 6 点出现的次数,最开始的时候六个元素的值都是 0。接下来,我们用 1 到 6 均匀分布的随机数模拟掷色子,如果摇出 1 点,`counters[0]`的值加 1,如果摇出 2 点,`counters[1]`的值加 1,以此类推。大家感受一下,由于使用了列表类型加上循环结构,我们对数据的处理是批量性的,这就使得修改后的代码比之前的代码要简单优雅得多。
diff --git "a/Day01-20/09.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\210\227\350\241\250-2.md" "b/Day01-20/09.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\210\227\350\241\250-2.md"
new file mode 100644
index 000000000..96c2c96e0
--- /dev/null
+++ "b/Day01-20/09.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\210\227\350\241\250-2.md"
@@ -0,0 +1,328 @@
+## 常用数据结构之列表-2
+
+### 列表的方法
+
+列表类型的变量拥有很多方法可以帮助我们操作一个列表,假设我们有名为`foos`的列表,列表有名为`bar`的方法,那么使用列表方法的语法是:`foos.bar()`,这是一种通过对象引用调用对象方法的语法。后面我们讲面向对象编程的时候,还会对这种语法进行详细的讲解,这种语法也称为给对象发消息。
+
+#### 添加和删除元素
+
+列表是一种可变容器,可变容器指的是我们可以向容器中添加元素、可以从容器移除元素,也可以修改现有容器中的元素。我们可以使用列表的`append`方法向列表中追加元素,使用`insert`方法向列表中插入元素。追加指的是将元素添加到列表的末尾,而插入则是在指定的位置添加新元素,大家可以看看下面的代码。
+
+```python
+languages = ['Python', 'Java', 'C++']
+languages.append('JavaScript')
+print(languages) # ['Python', 'Java', 'C++', 'JavaScript']
+languages.insert(1, 'SQL')
+print(languages) # ['Python', 'SQL', 'Java', 'C++', 'JavaScript']
+```
+
+我们可以用列表的`remove`方法从列表中删除指定元素,需要注意的是,如果要删除的元素并不在列表中,会引发`ValueError`错误导致程序崩溃,所以建议大家在删除元素时,先用之前讲过的成员运算做一个判断。我们还可以使用`pop`方法从列表中删除元素,`pop`方法默认删除列表中的最后一个元素,当然也可以给一个位置,删除指定位置的元素。在使用`pop`方法删除元素时,如果索引的值超出了范围,会引发`IndexError`异常,导致程序崩溃。除此之外,列表还有一个`clear`方法,可以清空列表中的元素,代码如下所示。
+
+```python
+languages = ['Python', 'SQL', 'Java', 'C++', 'JavaScript']
+if 'Java' in languages:
+ languages.remove('Java')
+if 'Swift' in languages:
+ languages.remove('Swift')
+print(languages) # ['Python', 'SQL', C++', 'JavaScript']
+languages.pop()
+temp = languages.pop(1)
+print(temp) # SQL
+languages.append(temp)
+print(languages) # ['Python', C++', 'SQL']
+languages.clear()
+print(languages) # []
+```
+
+> **说明**:`pop`方法删除元素时会得到被删除的元素,上面的代码中,我们将`pop`方法删除的元素赋值给了名为`temp`的变量。当然如果你愿意,还可以把这个元素再次加入到列表中,正如上面的代码`languages.append(temp)`所做的那样。
+
+这里还有一个小问题,例如`languages`列表中有多个`'Python'`,那么我们用`languages.remove('Python')`是删除所有的`'Python'`,还是删除第一个`'Python'`,大家可以先猜一猜,然后再自己动手尝试一下。
+
+从列表中删除元素其实还有一种方式,就是使用 Python 中的`del`关键字后面跟要删除的元素,这种做法跟使用`pop`方法指定索引删除元素没有实质性的区别,但后者会返回删除的元素,前者在性能上略优,因为`del`对应的底层字节码指令是`DELETE_SUBSCR`,而`pop`对应的底层字节码指令是`CALL_METHOD`和`POP_TOP`,如果不理解就不用管它了。
+
+```python
+items = ['Python', 'Java', 'C++']
+del items[1]
+print(items) # ['Python', 'C++']
+```
+
+#### 元素位置和频次
+
+列表的`index`方法可以查找某个元素在列表中的索引位置,如果找不到指定的元素,`index`方法会引发`ValueError`错误;列表的`count`方法可以统计一个元素在列表中出现的次数,代码如下所示。
+
+```python
+items = ['Python', 'Java', 'Java', 'C++', 'Kotlin', 'Python']
+print(items.index('Python')) # 0
+# 从索引位置1开始查找'Python'
+print(items.index('Python', 1)) # 5
+print(items.count('Python')) # 2
+print(items.count('Kotlin')) # 1
+print(items.count('Swfit')) # 0
+# 从索引位置3开始查找'Java'
+print(items.index('Java', 3)) # ValueError: 'Java' is not in list
+```
+
+#### 元素排序和反转
+
+列表的`sort`操作可以实现列表元素的排序,而`reverse`操作可以实现元素的反转,代码如下所示。
+
+```python
+items = ['Python', 'Java', 'C++', 'Kotlin', 'Swift']
+items.sort()
+print(items) # ['C++', 'Java', 'Kotlin', 'Python', 'Swift']
+items.reverse()
+print(items) # ['Swift', 'Python', 'Kotlin', 'Java', 'C++']
+```
+
+### 列表生成式
+
+在 Python 中,列表还可以通过一种特殊的字面量语法来创建,这种语法叫做生成式。下面,我们通过例子来说明使用列表生成式创建列表到底有什么好处。
+
+场景一:创建一个取值范围在`1`到`99`且能被`3`或者`5`整除的数字构成的列表。
+
+```python
+items = []
+for i in range(1, 100):
+ if i % 3 == 0 or i % 5 == 0:
+ items.append(i)
+print(items)
+```
+
+使用列表生成式做同样的事情,代码如下所示。
+
+```python
+items = [i for i in range(1, 100) if i % 3 == 0 or i % 5 == 0]
+print(items)
+```
+
+场景二:有一个整数列表`nums1`,创建一个新的列表`nums2`,`nums2`中的元素是`nums1`中对应元素的平方。
+
+```python
+nums1 = [35, 12, 97, 64, 55]
+nums2 = []
+for num in nums1:
+ nums2.append(num ** 2)
+print(nums2)
+```
+
+使用列表生成式做同样的事情,代码如下所示。
+
+```python
+nums1 = [35, 12, 97, 64, 55]
+nums2 = [num ** 2 for num in nums1]
+print(nums2)
+```
+
+场景三: 有一个整数列表`nums1`,创建一个新的列表`nums2`,将`nums1`中大于`50`的元素放到`nums2`中。
+
+```python
+nums1 = [35, 12, 97, 64, 55]
+nums2 = []
+for num in nums1:
+ if num > 50:
+ nums2.append(num)
+print(nums2)
+```
+
+使用列表生成式做同样的事情,代码如下所示。
+
+```python
+nums1 = [35, 12, 97, 64, 55]
+nums2 = [num for num in nums1 if num > 50]
+print(nums2)
+```
+
+使用列表生成式创建列表不仅代码简单优雅,而且性能上也优于使用`for-in`循环和`append`方法向空列表中追加元素的方式。为什么说生成式有更好的性能呢,那是因为 Python 解释器的字节码指令中有专门针对生成式的指令(`LIST_APPEND`指令);而`for`循环是通过方法调用(`LOAD_METHOD`和`CALL_METHOD`指令)的方式为列表添加元素,方法调用本身就是一个相对比较耗时的操作。对这一点不理解也没有关系,记住“**强烈建议用生成式语法来创建列表**”这个结论就可以了。
+
+### 嵌套列表
+
+Python 语言没有限定列表中的元素必须是相同的数据类型,也就是说一个列表中的元素可以任意的数据类型,当然也包括列表本身。如果列表中的元素也是列表,那么我们可以称之为嵌套的列表。嵌套的列表可以用来表示表格或数学上的矩阵,例如:我们想保存5个学生3门课程的成绩,可以用如下所示的列表。
+
+```python
+scores = [[95, 83, 92], [80, 75, 82], [92, 97, 90], [80, 78, 69], [65, 66, 89]]
+print(scores[0])
+print(scores[0][1])
+```
+
+对于上面的嵌套列表,每个元素相当于就是一个学生3门课程的成绩,例如`[95, 83, 92]`,而这个列表中的`83`代表了这个学生某一门课的成绩,如果想访问这个值,可以使用两次索引运算`scores[0][1]`,其中`scores[0]`可以得到`[95, 83, 92]`这个列表,再次使用索引运算`[1]`就可以获得该列表中的第二个元素。
+
+如果想通过键盘输入的方式来录入5个学生3门课程的成绩并保存在列表中,可以使用如下所示的代码。
+
+```python
+scores = []
+for _ in range(5):
+ temp = []
+ for _ in range(3):
+ score = int(input('请输入: '))
+ temp.append(score)
+ scores.append(temp)
+print(scores)
+```
+
+如果想通过产生随机数的方式来生成5个学生3门课程的成绩并保存在列表中,我们可以使用列表生成式,代码如下所示。
+
+```python
+import random
+
+scores = [[random.randrange(60, 101) for _ in range(3)] for _ in range(5)]
+print(scores)
+```
+
+> **说明**:上面的代码`[random.randrange(60, 101) for _ in range(3)] `可以产生由3个随机整数构成的列表,我们把这段代码又放在了另一个列表生成式中作为列表的元素,这样的元素一共生成5个,最终得到了一个嵌套列表。
+
+### 列表的应用
+
+下面我们通过一个双色球随机选号的例子为大家讲解列表的应用。双色球是由中国福利彩票发行管理中心发售的乐透型彩票,每注投注号码由`6`个红色球和`1`个蓝色球组成。红色球号码从`1`到`33`中选择,蓝色球号码从`1`到`16`中选择。每注需要选择`6`个红色球号码和`1`个蓝色球号码,如下所示。
+
+
+
+> **提示**:知乎上有一段对国内各种形式的彩票本质的论述相当精彩,这里分享给大家:“**虚构一个不劳而获的人,去忽悠一群想不劳而获的人,最终养活一批真正不劳而获的人**”。很多对概率没有概念的人,甚至认为彩票中与不中的概率都是 50%;还有很多人认为如果中奖的概率是 1%,那么买 100 次就一定可以中奖,这些都是非常荒唐的想法。所以,**珍爱生命,远离赌博,尤其是你对概率一无所知的情况下**!
+
+下面,我们通过 Python 程序来生成一组随机号码。
+
+```python
+"""
+双色球随机选号程序
+
+Author: 骆昊
+Version: 1.0
+"""
+import random
+
+red_balls = list(range(1, 34))
+selected_balls = []
+# 添加6个红色球到选中列表
+for _ in range(6):
+ # 生成随机整数代表选中的红色球的索引位置
+ index = random.randrange(len(red_balls))
+ # 将选中的球从红色球列表中移除并添加到选中列表
+ selected_balls.append(red_balls.pop(index))
+# 对选中的红色球排序
+selected_balls.sort()
+# 输出选中的红色球
+for ball in selected_balls:
+ print(f'\033[031m{ball:0>2d}\033[0m', end=' ')
+# 随机选择1个蓝色球
+blue_ball = random.randrange(1, 17)
+# 输出选中的蓝色球
+print(f'\033[034m{blue_ball:0>2d}\033[0m')
+```
+
+> **说明**:上面代码中`print(f'\033[0m...\033[0m')`是为了控制输出内容的颜色,红色球输出成红色,蓝色球输出成蓝色。其中省略号代表我们要输出的内容,`\033[0m`是一个控制码,表示关闭所有属性,也就是说之前的控制码将会失效,你也可以将其简单的理解为一个定界符,`m`前面的`0`表示控制台的显示方式为默认值,`0`可以省略,`1`表示高亮,`5`表示闪烁,`7`表示反显等。在`0`和`m`的中间,我们可以写上代表颜色的数字,比如`30`代表黑色,`31`代表红色,`32`代表绿色,`33`代表黄色,`34`代表蓝色等。
+
+我们还可以利用`random`模块提供的`sample`和`choice`函数来简化上面的代码,前者可以实现无放回随机抽样,后者可以实现随机抽取一个元素,修改后的代码如下所示。
+
+```python
+"""
+双色球随机选号程序
+
+Author: 骆昊
+Version: 1.1
+"""
+import random
+
+red_balls = [i for i in range(1, 34)]
+blue_balls = [i for i in range(1, 17)]
+# 从红色球列表中随机抽出6个红色球(无放回抽样)
+selected_balls = random.sample(red_balls, 6)
+# 对选中的红色球排序
+selected_balls.sort()
+# 输出选中的红色球
+for ball in selected_balls:
+ print(f'\033[031m{ball:0>2d}\033[0m', end=' ')
+# 从蓝色球列表中随机抽出1个蓝色球
+blue_ball = random.choice(blue_balls)
+# 输出选中的蓝色球
+print(f'\033[034m{blue_ball:0>2d}\033[0m')
+```
+
+如果要实现随机生成`N`注号码,我们只需要将上面的代码放到一个`N`次的循环中,如下所示。
+
+```python
+"""
+双色球随机选号程序
+
+Author: 骆昊
+Version: 1.2
+"""
+import random
+
+n = int(input('生成几注号码: '))
+red_balls = [i for i in range(1, 34)]
+blue_balls = [i for i in range(1, 17)]
+for _ in range(n):
+ # 从红色球列表中随机抽出6个红色球(无放回抽样)
+ selected_balls = random.sample(red_balls, 6)
+ # 对选中的红色球排序
+ selected_balls.sort()
+ # 输出选中的红色球
+ for ball in selected_balls:
+ print(f'\033[031m{ball:0>2d}\033[0m', end=' ')
+ # 从蓝色球列表中随机抽出1个蓝色球
+ blue_ball = random.choice(blue_balls)
+ # 输出选中的蓝色球
+ print(f'\033[034m{blue_ball:0>2d}\033[0m')
+```
+
+我们在 PyCharm 中运行上面的代码,输入`5`,运行效果如下图所示。
+
+
+
+这里顺便给大家介绍一个名为 rich 的 Python 三方库,它可以帮助我们用最简单的方式产生最漂亮的输出,你可以在终端中使用 Python 包管理工具 pip 来安装这个三方库,对于使用 PyCharm 的用户,当然要在 PyCharm 的终端窗口使用 pip 命令将 rich 安装到项目的虚拟环境中,命令如下所示。
+
+```bash
+pip install rich
+```
+
+
+
+如上图所示,rich 安装成功后,我们可以用如下所示的代码来控制输出。
+
+```python
+"""
+双色球随机选号程序
+
+Author: 骆昊
+Version: 1.3
+"""
+import random
+
+from rich.console import Console
+from rich.table import Table
+
+# 创建控制台
+console = Console()
+
+n = int(input('生成几注号码: '))
+red_balls = [i for i in range(1, 34)]
+blue_balls = [i for i in range(1, 17)]
+
+# 创建表格并添加表头
+table = Table(show_header=True)
+for col_name in ('序号', '红球', '蓝球'):
+ table.add_column(col_name, justify='center')
+
+for i in range(n):
+ selected_balls = random.sample(red_balls, 6)
+ selected_balls.sort()
+ blue_ball = random.choice(blue_balls)
+ # 向表格中添加行(序号,红色球,蓝色球)
+ table.add_row(
+ str(i + 1),
+ f'[red]{" ".join([f"{ball:0>2d}" for ball in selected_balls])}[/red]',
+ f'[blue]{blue_ball:0>2d}[/blue]'
+ )
+
+# 通过控制台输出表格
+console.print(table)
+```
+
+> **说明**:上面代码第 31 行使用了列表生成式语法将红色球号码处理成字符串并保存在一个列表中,`" ".join([...])`是将列表中的多个字符串用空格拼接成一个完整的字符串,如果不理解可以先放放。字符串中的`[red]...[/red]`用来设置输出颜色为红色,第 32 行的`[blue]...[/blue]`用来设置输出颜色为蓝色。更多关于 rich 库的知识,可以参考[官方文档](https://github.com/textualize/rich/blob/master/README.cn.md)。
+
+最终的输出如下图所示,看着这样的输出,是不是心情更美好了一些。
+
+
+
+### 总结
+
+Python 中的列表底层是一个可以动态扩容的数组,列表元素在计算机内存中是连续存储的,所以可以实现随机访问(通过一个有效的索引获取对应的元素且操作时间与列表元素个数无关)。我们可以暂时不去触碰这些底层的存储细节,也不需要大家理解列表每个方法的渐近时间复杂度(执行方法耗费的时间跟列表元素个数之间的关系),大家先学会用列表解决工作中的问题,我想这一点更为重要。
\ No newline at end of file
diff --git "a/Day01-20/10.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\205\203\347\273\204.md" "b/Day01-20/10.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\205\203\347\273\204.md"
new file mode 100755
index 000000000..e1b96d377
--- /dev/null
+++ "b/Day01-20/10.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\205\203\347\273\204.md"
@@ -0,0 +1,173 @@
+## 常用数据结构之元组
+
+前面的两节课,我们为大家讲解了 Python 中的列表,它是一种容器型的数据类型,通过列表类型的变量,我们可以保存多个数据并通过循环实现对数据的批量操作。当然,Python 中还有其他容器型的数据类型,接下来我们就为大家讲解另一种容器型的数据类型,它的名字叫元组(tuple)。
+
+### 元组的定义和运算
+
+在 Python 语言中,元组也是多个元素按照一定顺序构成的序列。元组和列表的不同之处在于,**元组是不可变类型**,这就意味着元组类型的变量一旦定义,其中的元素不能再添加或删除,而且元素的值也不能修改。如果试图修改元组中的元素,将引发`TypeError`错误,导致程序崩溃。定义元组通常使用形如`(x, y, z)`的字面量语法,元组类型支持的运算符跟列表是一样的,我们可以看看下面的代码。
+
+```python
+# 定义一个三元组
+t1 = (35, 12, 98)
+# 定义一个四元组
+t2 = ('骆昊', 45, True, '四川成都')
+
+# 查看变量的类型
+print(type(t1)) #
+print(type(t2)) #
+
+# 查看元组中元素的数量
+print(len(t1)) # 3
+print(len(t2)) # 4
+
+# 索引运算
+print(t1[0]) # 35
+print(t1[2]) # 98
+print(t2[-1]) # 四川成都
+
+# 切片运算
+print(t2[:2]) # ('骆昊', 43)
+print(t2[::3]) # ('骆昊', '四川成都')
+
+# 循环遍历元组中的元素
+for elem in t1:
+ print(elem)
+
+# 成员运算
+print(12 in t1) # True
+print(99 in t1) # False
+print('Hao' not in t2) # True
+
+# 拼接运算
+t3 = t1 + t2
+print(t3) # (35, 12, 98, '骆昊', 43, True, '四川成都')
+
+# 比较运算
+print(t1 == t3) # False
+print(t1 >= t3) # False
+print(t1 <= (35, 11, 99)) # False
+```
+
+一个元组中如果有两个元素,我们就称之为二元组;一个元组中如果五个元素,我们就称之为五元组。需要提醒大家注意的是,`()`表示空元组,但是如果元组中只有一个元素,需要加上一个逗号,否则`()`就不是代表元组的字面量语法,而是改变运算优先级的圆括号,所以`('hello', )`和`(100, )`才是一元组,而`('hello')`和`(100)`只是字符串和整数。我们可以通过下面的代码来加以验证。
+
+```python
+a = ()
+print(type(a)) #
+b = ('hello')
+print(type(b)) #
+c = (100)
+print(type(c)) #
+d = ('hello', )
+print(type(d)) #
+e = (100, )
+print(type(e)) #
+```
+
+### 打包和解包操作
+
+当我们把多个用逗号分隔的值赋给一个变量时,多个值会打包成一个元组类型;当我们把一个元组赋值给多个变量时,元组会解包成多个值然后分别赋给对应的变量,如下面的代码所示。
+
+```python
+# 打包操作
+a = 1, 10, 100
+print(type(a)) #
+print(a) # (1, 10, 100)
+# 解包操作
+i, j, k = a
+print(i, j, k) # 1 10 100
+```
+
+在解包时,如果解包出来的元素个数和变量个数不对应,会引发`ValueError`异常,错误信息为:`too many values to unpack`(解包的值太多)或`not enough values to unpack`(解包的值不足)。
+
+```python
+a = 1, 10, 100, 1000
+# i, j, k = a # ValueError: too many values to unpack (expected 3)
+# i, j, k, l, m, n = a # ValueError: not enough values to unpack (expected 6, got 4)
+```
+
+有一种解决变量个数少于元素的个数方法,就是使用星号表达式。通过星号表达式,我们可以让一个变量接收多个值,代码如下所示。需要注意两点:首先,用星号表达式修饰的变量会变成一个列表,列表中有0个或多个元素;其次,在解包语法中,星号表达式只能出现一次。
+
+```python
+a = 1, 10, 100, 1000
+i, j, *k = a
+print(i, j, k) # 1 10 [100, 1000]
+i, *j, k = a
+print(i, j, k) # 1 [10, 100] 1000
+*i, j, k = a
+print(i, j, k) # [1, 10] 100 1000
+*i, j = a
+print(i, j) # [1, 10, 100] 1000
+i, *j = a
+print(i, j) # 1 [10, 100, 1000]
+i, j, k, *l = a
+print(i, j, k, l) # 1 10 100 [1000]
+i, j, k, l, *m = a
+print(i, j, k, l, m) # 1 10 100 1000 []
+```
+
+需要说明一点,解包语法对所有的序列都成立,这就意味着我们之前讲的列表、`range`函数构造的范围序列甚至字符串都可以使用解包语法。大家可以尝试运行下面的代码,看看会出现怎样的结果。
+
+```python
+a, b, *c = range(1, 10)
+print(a, b, c)
+a, b, c = [1, 10, 100]
+print(a, b, c)
+a, *b, c = 'hello'
+print(a, b, c)
+```
+
+### 交换变量的值
+
+交换变量的值是写代码时经常用到的一个操作,但是在很多编程语言中,交换两个变量的值都需要借助一个中间变量才能做到,如果不用中间变量就需要使用比较晦涩的位运算来实现。在 Python 中,交换两个变量`a`和`b`的值只需要使用如下所示的代码。
+
+```python
+a, b = b, a
+```
+
+同理,如果要将三个变量`a`、`b`、`c`的值互换,即`b`的值赋给`a`,`c`的值赋给`b`,`a`的值赋给`c`,也可以如法炮制。
+
+```python
+a, b, c = b, c, a
+```
+
+需要说明的是,上面的操作并没有用到打包和解包语法,Python 的字节码指令中有`ROT_TWO`和`ROT_THREE`这样的指令可以直接实现这个操作,效率是非常高的。但是如果有多于三个变量的值要依次互换,这个时候是没有直接可用的字节码指令的,需要通过打包解包的方式来完成变量之间值的交换。
+
+### 元组和列表的比较
+
+这里还有一个非常值得探讨的问题,Python 中已经有了列表类型,为什么还需要元组这样的类型呢?这个问题对于初学者来说似乎有点困难,不过没有关系,我们先抛出观点,大家可以一边学习一边慢慢体会。
+
+1. 元组是不可变类型,**不可变类型更适合多线程环境**,因为它降低了并发访问变量的同步化开销。关于这一点,我们会在后面讲解并发编程的时候跟大家一起探讨。
+
+2. 元组是不可变类型,通常**不可变类型在创建时间上优于对应的可变类型**。我们可以使用`timeit`模块的`timeit`函数来看看创建保存相同元素的元组和列表各自花费的时间,`timeit`函数的`number`参数表示代码执行的次数。下面的代码中,我们分别创建了保存`1`到`9`的整数的列表和元组,每个操作执行`10000000`次,统计运行时间。
+
+ ```python
+ import timeit
+
+ print('%.3f 秒' % timeit.timeit('[1, 2, 3, 4, 5, 6, 7, 8, 9]', number=10000000))
+ print('%.3f 秒' % timeit.timeit('(1, 2, 3, 4, 5, 6, 7, 8, 9)', number=10000000))
+ ```
+
+ 输出:
+
+ ```
+ 0.635 秒
+ 0.078 秒
+ ```
+
+ > **说明**:上面代码的执行结果因软硬件系统而异,在我目前使用的电脑上,执行`10000000`次创建列表的操作时间是`0.635`秒,而执行`10000000`次创建元组的操作时间是`0.078`秒,显然创建元组更快且二者时间上有数量级的差别。大家可以在自己的电脑上执行这段代码,把你的执行结果放到评论区,看看谁的电脑更厉害。
+
+当然,Python 中的元组和列表类型是可以相互转换的,我们可以通过下面的代码来完成该操作。
+
+```python
+infos = ('骆昊', 43, True, '四川成都')
+# 将元组转换成列表
+print(list(infos)) # ['骆昊', 43, True, '四川成都']
+
+frts = ['apple', 'banana', 'orange']
+# 将列表转换成元组
+print(tuple(frts)) # ('apple', 'banana', 'orange')
+```
+
+### 总结
+
+**列表和元组都是容器型的数据类型**,即一个变量可以保存多个数据,而且它们都是按一定顺序组织元素的有序容器。**列表是可变数据类型**,**元组是不可变数据类型**,所以列表可以添加元素、删除元素、清空元素、排序反转,但这些操作对元组来说是不成立的。列表和元组都可以支持**拼接运算**、**成员运算**、**索引运算**、**切片运算**等操作,后面我们要讲到的字符串类型也支持这些运算,因为字符串就是字符按一定顺序构成的序列,在这一点上三者并没有什么区别。我们**推荐大家使用列表的生成式语法来创建列表**,它不仅好用而且效率很高,是 Python 语言中非常有特色的语法。
diff --git "a/Day01-20/11.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\255\227\347\254\246\344\270\262.md" "b/Day01-20/11.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\255\227\347\254\246\344\270\262.md"
new file mode 100755
index 000000000..d71877425
--- /dev/null
+++ "b/Day01-20/11.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\255\227\347\254\246\344\270\262.md"
@@ -0,0 +1,358 @@
+## 常用数据结构之字符串
+
+第二次世界大战促使了现代电子计算机的诞生,世界上的第一台通用电子计算机名叫 ENIAC(电子数值积分计算机),诞生于美国的宾夕法尼亚大学,占地167平米,重量约27吨,每秒钟大约能够完成约5000次浮点运算,如下图所示。ENIAC 诞生之后被应用于导弹弹道的计算,而数值计算也是现代电子计算机最为重要的一项功能。
+
+
+
+随着时间的推移,虽然数值运算仍然是计算机日常工作中最为重要的组成部分,但是今天的计算机还要处理大量的以文本形式存在的信息。如果我们希望通过 Python 程序来操作本这些文本信息,就必须要先了解字符串这种数据类型以及与它相关的运算和方法。
+
+### 字符串的定义
+
+所谓**字符串**,就是**由零个或多个字符组成的有限序列**,一般记为:
+
+$$
+s = a_1a_2 \cdots a_n \,\,\,\,\, (0 \le n \le \infty)
+$$
+
+在 Python 程序中,我们把单个或多个字符用单引号或者双引号包围起来,就可以表示一个字符串。字符串中的字符可以是特殊符号、英文字母、中文字符、日文的平假名或片假名、希腊字母、Emoji 字符(如:💩、🐷、🀄️)等。
+
+```python
+s1 = 'hello, world!'
+s2 = "你好,世界!❤️"
+s3 = '''hello,
+wonderful
+world!'''
+print(s1)
+print(s2)
+print(s3)
+```
+
+#### 转义字符
+
+我们可以在字符串中使用`\`(反斜杠)来表示转义,也就是说`\`后面的字符不再是它原来的意义,例如:`\n`不是代表字符`\`和字符`n`,而是表示换行;`\t`也不是代表字符`\`和字符`t`,而是表示制表符。所以如果字符串本身又包含了`'`、`"`、`\`这些特殊的字符,必须要通过`\`进行转义处理。例如要输出一个带单引号或反斜杠的字符串,需要用如下所示的方法。
+
+```python
+s1 = '\'hello, world!\''
+s2 = '\\hello, world!\\'
+print(s1)
+print(s2)
+```
+
+#### 原始字符串
+
+Python 中有一种以`r`或`R`开头的字符串,这种字符串被称为原始字符串,意思是字符串中的每个字符都是它本来的含义,没有所谓的转义字符。例如,在字符串`'hello\n'`中,`\n`表示换行;而在`r'hello\n'`中,`\n`不再表示换行,就是字符`\`和字符`n`。大家可以运行下面的代码,看看会输出什么。
+
+```python
+s1 = '\it \is \time \to \read \now'
+s2 = r'\it \is \time \to \read \now'
+print(s1)
+print(s2)
+```
+
+> **说明**:上面的变量`s1`中,`\t`、`\r`和`\n`都是转义字符。`\t`是制表符(table),`\n`是换行符(new line),`\r`是回车符(carriage return)相当于让输出回到了行首。对比一下两个`print`函数的输出,看看到底有什么区别!
+
+#### 字符的特殊表示
+
+Python 中还允许在`\`后面还可以跟一个八进制或者十六进制数来表示字符,例如`\141`和`\x61`都代表小写字母`a`,前者是八进制的表示法,后者是十六进制的表示法。另外一种表示字符的方式是在`\u`后面跟 Unicode 字符编码,例如`\u9a86\u660a`代表的是中文“骆昊”。运行下面的代码,看看输出了什么。
+
+```python
+s1 = '\141\142\143\x61\x62\x63'
+s2 = '\u9a86\u660a'
+print(s1)
+print(s2)
+```
+
+### 字符串的运算
+
+Python 语言为字符串类型提供了非常丰富的运算符,有很多运算符跟列表类型的运算符作用类似。例如,我们可以使用`+`运算符来实现字符串的拼接,可以使用`*`运算符来重复一个字符串的内容,可以使用`in`和`not in`来判断一个字符串是否包含另外一个字符串,我们也可以用`[]`和`[:]`运算符从字符串取出某个字符或某些字符。
+
+#### 拼接和重复
+
+下面的例子演示了使用`+`和`*`运算符来实现字符串的拼接和重复操作。
+
+```python
+s1 = 'hello' + ', ' + 'world'
+print(s1) # hello, world
+s2 = '!' * 3
+print(s2) # !!!
+s1 += s2
+print(s1) # hello, world!!!
+s1 *= 2
+print(s1) # hello, world!!!hello, world!!!
+```
+
+用`*`实现字符串的重复是非常有意思的一个运算符,在很多编程语言中,要表示一个有10个`a`的字符串,你只能写成`'aaaaaaaaaa'`,但是在 Python 中,你可以写成`'a' * 10`。你可能觉得`'aaaaaaaaaa'`这种写法也没有什么不方便的,但是请想一想,如果字符`a`要重复100次或者1000次又会如何呢?
+
+#### 比较运算
+
+对于两个字符串类型的变量,可以直接使用比较运算符来判断两个字符串的相等性或比较大小。需要说明的是,因为字符串在计算机内存中也是以二进制形式存在的,那么字符串的大小比较比的是每个字符对应的编码的大小。例如`A`的编码是`65`, 而`a`的编码是`97`,所以`'A' < 'a'`的结果相当于就是`65 < 97`的结果,这里很显然是`True`;而`'boy' < 'bad'`,因为第一个字符都是`'b'`比不出大小,所以实际比较的是第二个字符的大小,显然`'o' < 'a'`的结果是`False`,所以`'boy' < 'bad'`的结果是`False`。如果不清楚两个字符对应的编码到底是多少,可以使用`ord`函数来获得,之前我们有提到过这个函数。例如`ord('A')`的值是`65`,而`ord('昊')`的值是`26122`。下面的代码展示了字符串的比较运算,请大家仔细看看。
+
+```python
+s1 = 'a whole new world'
+s2 = 'hello world'
+print(s1 == s2) # False
+print(s1 < s2) # True
+print(s1 == 'hello world') # False
+print(s2 == 'hello world') # True
+print(s2 != 'Hello world') # True
+s3 = '骆昊'
+print(ord('骆')) # 39558
+print(ord('昊')) # 26122
+s4 = '王大锤'
+print(ord('王')) # 29579
+print(ord('大')) # 22823
+print(ord('锤')) # 38180
+print(s3 >= s4) # True
+print(s3 != s4) # True
+```
+
+#### 成员运算
+
+Python 中可以用`in`和`not in`判断一个字符串中是否包含另外一个字符或字符串,跟列表类型一样,`in`和`not in`称为成员运算符,会产生布尔值`True`或`False`,代码如下所示。
+
+```python
+s1 = 'hello, world'
+s2 = 'goodbye, world'
+print('wo' in s1) # True
+print('wo' not in s2) # False
+print(s2 in s1) # False
+```
+
+#### 获取字符串长度
+
+获取字符串长度跟获取列表元素个数一样,使用内置函数`len`,代码如下所示。
+
+```python
+s = 'hello, world'
+print(len(s)) # 12
+print(len('goodbye, world')) # 14
+```
+
+#### 索引和切片
+
+字符串的索引和切片操作跟列表、元组几乎没有区别,因为字符串也是一种有序序列,可以通过正向或反向的整数索引访问其中的元素。但是有一点需要注意,因为**字符串是不可变类型**,所以**不能通过索引运算修改字符串中的字符**。
+
+```python
+s = 'abc123456'
+n = len(s)
+print(s[0], s[-n]) # a a
+print(s[n-1], s[-1]) # 6 6
+print(s[2], s[-7]) # c c
+print(s[5], s[-4]) # 3 3
+print(s[2:5]) # c12
+print(s[-7:-4]) # c12
+print(s[2:]) # c123456
+print(s[:2]) # ab
+print(s[::2]) # ac246
+print(s[::-1]) # 654321cba
+```
+
+需要再次提醒大家注意的是,在进行索引运算时,如果索引越界,会引发`IndexError`异常,错误提示信息为:`string index out of range`(字符串索引超出范围)。
+
+### 字符的遍历
+
+如果希望遍历字符串中的每个字符,可以使用`for-in`循环,有如下所示的两种方式。
+
+方式一:
+
+```python
+s = 'hello'
+for i in range(len(s)):
+ print(s[i])
+```
+
+方式二:
+
+```python
+s = 'hello'
+for elem in s:
+ print(elem)
+```
+
+### 字符串的方法
+
+在 Python 中,我们可以通过字符串类型自带的方法对字符串进行操作和处理,假设我们有名为`foo`的字符串,字符串有名为`bar`的方法,那么使用字符串方法的语法是:`foo.bar()`,这是一种通过对象引用调用对象方法的语法,跟前面使用列表方法的语法是一样的。
+
+#### 大小写相关操作
+
+下面的代码演示了和字符串大小写变换相关的方法。
+
+```python
+s1 = 'hello, world!'
+# 字符串首字母大写
+print(s1.capitalize()) # Hello, world!
+# 字符串每个单词首字母大写
+print(s1.title()) # Hello, World!
+# 字符串变大写
+print(s1.upper()) # HELLO, WORLD!
+s2 = 'GOODBYE'
+# 字符串变小写
+print(s2.lower()) # goodbye
+# 检查s1和s2的值
+print(s1) # hello, world
+print(s2) # GOODBYE
+```
+
+> **说明**:由于字符串是不可变类型,使用字符串的方法对字符串进行操作会产生新的字符串,但是原来变量的值并没有发生变化。所以上面的代码中,当我们最后检查`s1`和`s2`两个变量的值时,`s1`和`s2` 的值并没有发生变化。
+
+#### 查找操作
+
+如果想在一个字符串中从前向后查找有没有另外一个字符串,可以使用字符串的`find`或`index`方法。在使用`find`和`index`方法时还可以通过方法的参数来指定查找的范围,也就是查找不必从索引为`0`的位置开始。
+
+```python
+s = 'hello, world!'
+print(s.find('or')) # 8
+print(s.find('or', 9)) # -1
+print(s.find('of')) # -1
+print(s.index('or')) # 8
+print(s.index('or', 9)) # ValueError: substring not found
+```
+
+>**说明**:`find`方法找不到指定的字符串会返回`-1`,`index`方法找不到指定的字符串会引发`ValueError`错误。
+
+`find`和`index`方法还有逆向查找(从后向前查找)的版本,分别是`rfind`和`rindex`,代码如下所示。
+
+```python
+s = 'hello world!'
+print(s.find('o')) # 4
+print(s.rfind('o')) # 7
+print(s.rindex('o')) # 7
+# print(s.rindex('o', 8)) # ValueError: substring not found
+```
+
+#### 性质判断
+
+可以通过字符串的`startswith`、`endswith`来判断字符串是否以某个字符串开头和结尾;还可以用`is`开头的方法判断字符串的特征,这些方法都返回布尔值,代码如下所示。
+
+```python
+s1 = 'hello, world!'
+print(s1.startswith('He')) # False
+print(s1.startswith('hel')) # True
+print(s1.endswith('!')) # True
+s2 = 'abc123456'
+print(s2.isdigit()) # False
+print(s2.isalpha()) # False
+print(s2.isalnum()) # True
+```
+
+> **说明**:上面的`isdigit`用来判断字符串是不是完全由数字构成的,`isalpha`用来判断字符串是不是完全由字母构成的,这里的字母指的是 Unicode 字符但不包含 Emoji 字符,`isalnum`用来判断字符串是不是由字母和数字构成的。
+
+#### 格式化
+
+在 Python 中,字符串类型可以通过`center`、`ljust`、`rjust`方法做居中、左对齐和右对齐的处理。如果要在字符串的左侧补零,也可以使用`zfill`方法。
+
+```python
+s = 'hello, world'
+print(s.center(20, '*')) # ****hello, world****
+print(s.rjust(20)) # hello, world
+print(s.ljust(20, '~')) # hello, world~~~~~~~~
+print('33'.zfill(5)) # 00033
+print('-33'.zfill(5)) # -0033
+```
+
+我们之前讲过,在用`print`函数输出字符串时,可以用下面的方式对字符串进行格式化。
+
+```python
+a = 321
+b = 123
+print('%d * %d = %d' % (a, b, a * b))
+```
+
+当然,我们也可以用字符串的`format`方法来完成字符串的格式,代码如下所示。
+
+```python
+a = 321
+b = 123
+print('{0} * {1} = {2}'.format(a, b, a * b))
+```
+
+从 Python 3.6 开始,格式化字符串还有更为简洁的书写方式,就是在字符串前加上`f`来格式化字符串,在这种以`f`打头的字符串中,`{变量名}`是一个占位符,会被变量对应的值将其替换掉,代码如下所示。
+
+```python
+a = 321
+b = 123
+print(f'{a} * {b} = {a * b}')
+```
+
+如果需要进一步控制格式化语法中变量值的形式,可以参照下面的表格来进行字符串格式化操作。
+
+| 变量值 | 占位符 | 格式化结果 | 说明 |
+| ----------- | ---------- | ------------- | ---- |
+| `3.1415926` | `{:.2f}` | `'3.14'` | 保留小数点后两位 |
+| `3.1415926` | `{:+.2f}` | `'+3.14'` | 带符号保留小数点后两位 |
+| `-1` | `{:+.2f}` | `'-1.00'` | 带符号保留小数点后两位 |
+| `3.1415926` | `{:.0f}` | `'3'` | 不带小数 |
+| `123` | `{:0>10d}` | `'0000000123'` | 左边补`0`,补够10位 |
+| `123` | `{:x<10d}` | `'123xxxxxxx'` | 右边补`x` ,补够10位 |
+| `123` | `{:>10d}` | `' 123'` | 左边补空格,补够10位 |
+| `123` | `{:<10d}` | `'123 '` | 右边补空格,补够10位 |
+| `123456789` | `{:,}` | `'123,456,789'` | 逗号分隔格式 |
+| `0.123` | `{:.2%}` | `'12.30%'` | 百分比格式 |
+| `123456789` | `{:.2e}` | `'1.23e+08'` | 科学计数法格式 |
+
+#### 修剪操作
+
+字符串的`strip`方法可以帮我们获得将原字符串修剪掉左右两端指定字符之后的字符串,默认是修剪空格字符。这个方法非常有实用价值,可以用来将用户输入时不小心键入的头尾空格等去掉,`strip`方法还有`lstrip`和`rstrip`两个版本,相信从名字大家已经猜出来这两个方法是做什么用的。
+
+```python
+s1 = ' jackfrued@126.com '
+print(s1.strip()) # jackfrued@126.com
+s2 = '~你好,世界~'
+print(s2.lstrip('~')) # 你好,世界~
+print(s2.rstrip('~')) # ~你好,世界
+```
+
+#### 替换操作
+
+如果希望用新的内容替换字符串中指定的内容,可以使用`replace`方法,代码如下所示。`replace`方法的第一个参数是被替换的内容,第二个参数是替换后的内容,还可以通过第三个参数指定替换的次数。
+
+```python
+s = 'hello, good world'
+print(s.replace('o', '@')) # hell@, g@@d w@rld
+print(s.replace('o', '@', 1)) # hell@, good world
+```
+
+#### 拆分与合并
+
+可以使用字符串的`split`方法将一个字符串拆分为多个字符串(放在一个列表中),也可以使用字符串的`join`方法将列表中的多个字符串连接成一个字符串,代码如下所示。
+
+```python
+s = 'I love you'
+words = s.split()
+print(words) # ['I', 'love', 'you']
+print('~'.join(words)) # I~love~you
+```
+
+需要说明的是,`split`方法默认使用空格进行拆分,我们也可以指定其他的字符来拆分字符串,而且还可以指定最大拆分次数来控制拆分的效果,代码如下所示。
+
+```python
+s = 'I#love#you#so#much'
+words = s.split('#')
+print(words) # ['I', 'love', 'you', 'so', 'much']
+words = s.split('#', 2)
+print(words) # ['I', 'love', 'you#so#much']
+```
+
+#### 编码和解码
+
+Python 中除了字符串`str`类型外,还有一种表示二进制数据的字节串类型(`bytes`)。所谓字节串,就是**由零个或多个字节组成的有限序列**。通过字符串的`encode`方法,我们可以按照某种编码方式将字符串编码为字节串,我们也可以使用字节串的`decode`方法,将字节串解码为字符串,代码如下所示。
+
+```python
+a = '骆昊'
+b = a.encode('utf-8')
+c = a.encode('gbk')
+print(b) # b'\xe9\xaa\x86\xe6\x98\x8a'
+print(c) # b'\xc2\xe6\xea\xbb'
+print(b.decode('utf-8')) # 骆昊
+print(c.decode('gbk')) # 骆昊
+```
+
+注意,如果编码和解码的方式不一致,会导致乱码问题(无法再现原始的内容)或引发`UnicodeDecodeError`错误,导致程序崩溃。
+
+#### 其他方法
+
+对于字符串类型来说,还有一个常用的操作是对字符串进行匹配检查,即检查字符串是否满足某种特定的模式。例如,一个网站对用户注册信息中用户名和邮箱的检查,就属于模式匹配检查。实现模式匹配检查的工具叫做正则表达式,Python 语言通过标准库中的`re`模块提供了对正则表达式的支持,我们会在后续的课程中为大家讲解这个知识点。
+
+### 总结
+
+知道如何表示和操作字符串对程序员来说是非常重要的,因为我们经常需要处理文本信息,Python 中操作字符串可以用拼接、索引、切片等运算符,也可以使用字符串类型提供的非常丰富的方法。
diff --git "a/Day01-20/12.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\351\233\206\345\220\210.md" "b/Day01-20/12.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\351\233\206\345\220\210.md"
new file mode 100755
index 000000000..a4b745806
--- /dev/null
+++ "b/Day01-20/12.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\351\233\206\345\220\210.md"
@@ -0,0 +1,185 @@
+## 常用数据结构之集合
+
+在学习了列表和元组之后,我们再来学习一种容器型的数据类型,它的名字叫集合(set)。说到集合这个词大家一定不会陌生,在数学课本上就有这个概念。如果我们**把一定范围的、确定的、可以区别的事物当作一个整体来看待**,那么这个整体就是集合,集合中的各个事物称为集合的**元素**。通常,集合需要满足以下要求:
+
+1. **无序性**:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
+2. **互异性**:一个集合中,任何两个元素都是不相同的,即元素在集合中只能出现一次。
+3. **确定性**:给定一个集合和一个任意元素,该元素要么属这个集合,要么不属于这个集合,二者必居其一,不允许有模棱两可的情况出现。
+
+Python 程序中的集合跟数学上的集合没有什么本质区别,需要强调的是上面所说的无序性和互异性。无序性说明集合中的元素并不像列中的元素那样存在某种次序,可以通过索引运算就能访问任意元素,**集合并不支持索引运算**。另外,集合的互异性决定了**集合中不能有重复元素**,这一点也是集合区别于列表的地方,我们无法将重复的元素添加到一个集合中。集合类型必然是支持`in`和`not in`成员运算的,这样就可以确定一个元素是否属于集合,也就是上面所说的集合的确定性。**集合的成员运算在性能上要优于列表的成员运算**,这是集合的底层存储特性决定的,此处我们暂时不做讨论,大家记住这个结论即可。
+
+> **说明**:集合底层使用了哈希存储(散列存储),对哈希存储不了解的读者可以先看看“Hello 算法”网站对[哈希表](https://www.hello-algo.com/chapter_hashing/)的讲解,感谢作者的开源精神。
+
+### 创建集合
+
+在 Python 中,创建集合可以使用`{}`字面量语法,`{}`中需要至少有一个元素,因为没有元素的`{}`并不是空集合而是一个空字典,字典类型我们会在下一节课中为大家介绍。当然,也可以使用 Python 内置函数`set`来创建一个集合,准确的说`set`并不是一个函数,而是创建集合对象的构造器,这个知识点会在后面讲解面向对象编程的地方为大家介绍。我们可以使用`set`函数创建一个空集合,也可以用它将其他序列转换成集合,例如:`set('hello')`会得到一个包含了`4`个字符的集合(重复的字符`l`只会在集合中出现一次)。除了这两种方式,还可以使用生成式语法来创建集合,就像我们之前用生成式语法创建列表那样。
+
+```python
+set1 = {1, 2, 3, 3, 3, 2}
+print(set1)
+
+set2 = {'banana', 'pitaya', 'apple', 'apple', 'banana', 'grape'}
+print(set2)
+
+set3 = set('hello')
+print(set3)
+
+set4 = set([1, 2, 2, 3, 3, 3, 2, 1])
+print(set4)
+
+set5 = {num for num in range(1, 20) if num % 3 == 0 or num % 7 == 0}
+print(set5)
+```
+
+需要提醒大家,集合中的元素必须是`hashable`类型,所谓`hashable`类型指的是能够计算出哈希码的数据类型,通常不可变类型都是`hashable`类型,如整数(`int`)、浮点小数(`float`)、布尔值(`bool`)、字符串(`str`)、元组(`tuple`)等。可变类型都不是`hashable`类型,因为可变类型无法计算出确定的哈希码,所以它们不能放到集合中。例如:我们不能将列表作为集合中的元素;同理,由于集合本身也是可变类型,所以集合也不能作为集合中的元素。我们可以创建出嵌套列表(列表的元素也是列表),但是我们不能创建出嵌套的集合,这一点在使用集合的时候一定要引起注意。
+
+> **温馨提示**:如果不理解上面提到的哈希码、哈希存储这些概念,可以先放放,因为它并不影响你继续学习和使用 Python 语言。当然,如果是计算机专业的小伙伴,不理解哈希存储是很难被原谅的,要赶紧去补课了。
+
+### 元素的遍历
+
+我们可以通过`len`函数来获得集合中有多少个元素,但是我们不能通过索引运算来遍历集合中的元素,因为集合元素并没有特定的顺序。当然,要实现对集合元素的遍历,我们仍然可以使用`for-in`循环,代码如下所示。
+
+```python
+set1 = {'Python', 'C++', 'Java', 'Kotlin', 'Swift'}
+for elem in set1:
+ print(elem)
+```
+
+> **提示**:大家看看上面代码的运行结果,通过单词输出的顺序体会一下集合的无序性。
+
+### 集合的运算
+
+Python 为集合类型提供了非常丰富的运算,主要包括:成员运算、交集运算、并集运算、差集运算、比较运算(相等性、子集、超集)等。
+
+#### 成员运算
+
+可以通过成员运算`in`和`not in `检查元素是否在集合中,代码如下所示。
+
+```python
+set1 = {11, 12, 13, 14, 15}
+print(10 in set1) # False
+print(15 in set1) # True
+set2 = {'Python', 'Java', 'C++', 'Swift'}
+print('Ruby' in set2) # False
+print('Java' in set2) # True
+```
+
+#### 二元运算
+
+集合的二元运算主要指集合的交集、并集、差集、对称差等运算,这些运算可以通过运算符来实现,也可以通过集合类型的方法来实现,代码如下所示。
+
+
+
+```python
+set1 = {1, 2, 3, 4, 5, 6, 7}
+set2 = {2, 4, 6, 8, 10}
+
+# 交集
+print(set1 & set2) # {2, 4, 6}
+print(set1.intersection(set2)) # {2, 4, 6}
+
+# 并集
+print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7, 8, 10}
+print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 7, 8, 10}
+
+# 差集
+print(set1 - set2) # {1, 3, 5, 7}
+print(set1.difference(set2)) # {1, 3, 5, 7}
+
+# 对称差
+print(set1 ^ set2) # {1, 3, 5, 7, 8, 10}
+print(set1.symmetric_difference(set2)) # {1, 3, 5, 7, 8, 10}
+```
+
+通过上面的代码可以看出,对两个集合求交集,`&`运算符和`intersection`方法的作用是完全相同的,使用运算符的方式显然更直观且代码也更简短。需要说明的是,集合的二元运算还可以跟赋值运算一起构成复合赋值运算,例如:`set1 |= set2`相当于`set1 = set1 | set2`,跟`|=`作用相同的方法是`update`;`set1 &= set2`相当于`set1 = set1 & set2`,跟`&=`作用相同的方法是`intersection_update`,代码如下所示。
+
+```python
+set1 = {1, 3, 5, 7}
+set2 = {2, 4, 6}
+set1 |= set2
+# set1.update(set2)
+print(set1) # {1, 2, 3, 4, 5, 6, 7}
+set3 = {3, 6, 9}
+set1 &= set3
+# set1.intersection_update(set3)
+print(set1) # {3, 6}
+set2 -= set1
+# set2.difference_update(set1)
+print(set2) # {2, 4}
+```
+
+#### 比较运算
+
+两个集合可以用`==`和`!=`进行相等性判断,如果两个集合中的元素完全相同,那么`==`比较的结果就是`True`,否则就是`False`。如果集合`A`的任意一个元素都是集合`B`的元素,那么集合`A`称为集合`B`的子集,即对于 $\small{\forall{a} \in {A}}$ ,均有 $\small{{a} \in {B}}$ ,则 $\small{{A} \subseteq {B}}$ ,`A`是`B`的子集,反过来也可以称`B`是`A`的超集。如果`A`是`B`的子集且`A`不等于`B`,那么`A`就是`B`的真子集。Python 为集合类型提供了判断子集和超集的运算符,其实就是我们非常熟悉的`<`、`<=`、`>`、`>=`这些运算符。当然,我们也可以通过集合类型的方法`issubset`和`issuperset`来判断集合之间的关系,代码如下所示。
+
+```python
+set1 = {1, 3, 5}
+set2 = {1, 2, 3, 4, 5}
+set3 = {5, 4, 3, 2, 1}
+
+print(set1 < set2) # True
+print(set1 <= set2) # True
+print(set2 < set3) # False
+print(set2 <= set3) # True
+print(set2 > set1) # True
+print(set2 == set3) # True
+
+print(set1.issubset(set2)) # True
+print(set2.issuperset(set1)) # True
+```
+
+> **说明**:上面的代码中,`set1 < set2`判断`set1`是不是`set2`的真子集,`set1 <= set2`判断`set1`是不是`set2`的子集,`set2 > set1`判断`set2`是不是`set1`的超集。当然,我们也可以通过`set1.issubset(set2)`判断`set1`是不是`set2`的子集;通过`set2.issuperset(set1)`判断`set2`是不是`set1`的超集。
+
+### 集合的方法
+
+刚才我们说过,Python 中的集合是可变类型,我们可以通过集合的方法向集合添加元素或从集合中删除元素。
+
+```python
+set1 = {1, 10, 100}
+
+# 添加元素
+set1.add(1000)
+set1.add(10000)
+print(set1) # {1, 100, 1000, 10, 10000}
+
+# 删除元素
+set1.discard(10)
+if 100 in set1:
+ set1.remove(100)
+print(set1) # {1, 1000, 10000}
+
+# 清空元素
+set1.clear()
+print(set1) # set()
+```
+
+> **说明**:删除元素的`remove`方法在元素不存在时会引发`KeyError`错误,所以上面的代码中我们先通过成员运算判断元素是否在集合中。集合类型还有一个`pop`方法可以从集合中随机删除一个元素,该方法在删除元素的同时会返回(获得)被删除的元素,而`remove`和`discard`方法仅仅是删除元素,不会返回(获得)被删除的元素。
+
+集合类型还有一个名为`isdisjoint`的方法可以判断两个集合有没有相同的元素,如果没有相同元素,该方法返回`True`,否则该方法返回`False`,代码如下所示。
+
+```python
+set1 = {'Java', 'Python', 'C++', 'Kotlin'}
+set2 = {'Kotlin', 'Swift', 'Java', 'Dart'}
+set3 = {'HTML', 'CSS', 'JavaScript'}
+print(set1.isdisjoint(set2)) # False
+print(set1.isdisjoint(set3)) # True
+```
+
+### 不可变集合
+
+Python 中还有一种不可变类型的集合,名字叫`frozenset`。`set`跟`frozenset`的区别就如同`list`跟`tuple`的区别,`frozenset`由于是不可变类型,能够计算出哈希码,因此它可以作为`set`中的元素。除了不能添加和删除元素,`frozenset`在其他方面跟`set`是一样的,下面的代码简单的展示了`frozenset`的用法。
+
+```python
+fset1 = frozenset({1, 3, 5, 7})
+fset2 = frozenset(range(1, 6))
+print(fset1) # frozenset({1, 3, 5, 7})
+print(fset2) # frozenset({1, 2, 3, 4, 5})
+print(fset1 & fset2) # frozenset({1, 3, 5})
+print(fset1 | fset2) # frozenset({1, 2, 3, 4, 5, 7})
+print(fset1 - fset2) # frozenset({7})
+print(fset1 < fset2) # False
+```
+
+### 总结
+
+Python 中的**集合类型是一种无序容器**,**不允许有重复运算**,由于底层使用了哈希存储,集合中的元素必须是`hashable`类型。集合与列表最大的区别在于**集合中的元素没有顺序**、所以**不能够通过索引运算访问元素**、但是集合可以执行交集、并集、差集等二元运算,也可以通过关系运算符检查两个集合是否存在超集、子集等关系。
diff --git "a/Day01-20/13.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\255\227\345\205\270.md" "b/Day01-20/13.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\255\227\345\205\270.md"
new file mode 100755
index 000000000..7d5849f67
--- /dev/null
+++ "b/Day01-20/13.\345\270\270\347\224\250\346\225\260\346\215\256\347\273\223\346\236\204\344\271\213\345\255\227\345\205\270.md"
@@ -0,0 +1,265 @@
+## 常用数据结构之字典
+
+迄今为止,我们已经为大家介绍了 Python 中的三种容器型数据类型(列表、元组、集合),但是这些数据类型仍然不足以帮助我们解决所有的问题。例如,我们需要一个变量来保存一个人的多项信息,包括:姓名、年龄、身高、体重、家庭住址、本人手机号、紧急联系人手机号,此时你会发现,我们之前学过的列表、元组和集合类型都不够好使。
+
+```python
+person1 = ['王大锤', 55, 168, 60, '成都市武侯区科华北路62号1栋101', '13122334455', '13800998877']
+person2 = ('王大锤', 55, 168, 60, '成都市武侯区科华北路62号1栋101', '13122334455', '13800998877')
+person3 = {'王大锤', 55, 168, 60, '成都市武侯区科华北路62号1栋101', '13122334455', '13800998877'}
+```
+
+集合肯定是最不合适的,因为集合中不能有重复元素,如果一个人的年龄和体重刚好相同,那么集合中就会少一项信息;同理,如果这个人的手机号和紧急联系人手机号是相同的,那么集合中又会少一项信息。另一方面,虽然列表和元组可以把一个人的所有信息都保存下来,但是当你想要获取这个人的手机号或家庭住址时,你得先知道他的手机号是列表或元组中的第几个元素。总之,在遇到上述的场景时,列表、元组、集合都不是最合适的选择,此时我们需要字典(dictionary)类型,这种数据类型最适合把相关联的信息组装到一起,可以帮助我们解决 Python 程序中为真实事物建模的问题。
+
+说到字典这个词,大家一定不陌生,读小学的时候,每个人手头基本上都有一本《新华字典》,如下图所示。
+
+
+
+Python 程序中的字典跟现实生活中的字典很像,它以键值对(键和值的组合)的方式把数据组织到一起,我们可以通过键找到与之对应的值并进行操作。就像《新华字典》中,每个字(键)都有与它对应的解释(值)一样,每个字和它的解释合在一起就是字典中的一个条目,而字典中通常包含了很多个这样的条目。
+
+### 创建和使用字典
+
+Python 中创建字典可以使用`{}`字面量语法,这一点跟上一节课讲的集合是一样的。但是字典的`{}`中的元素是以键值对的形式存在的,每个元素由`:`分隔的两个值构成,`:`前面是键,`:`后面是值,代码如下所示。
+
+```python
+xinhua = {
+ '麓': '山脚下',
+ '路': '道,往来通行的地方;方面,地区:南~货,外~货;种类:他俩是一~人',
+ '蕗': '甘草的别名',
+ '潞': '潞水,水名,即今山西省的浊漳河;潞江,水名,即云南省的怒江'
+}
+print(xinhua)
+person = {
+ 'name': '王大锤',
+ 'age': 55,
+ 'height': 168,
+ 'weight': 60,
+ 'addr': '成都市武侯区科华北路62号1栋101',
+ 'tel': '13122334455',
+ 'emergence contact': '13800998877'
+}
+print(person)
+```
+
+通过上面的代码,相信大家已经看出来了,用字典来保存一个人的信息远远优于使用列表或元组,因为我们可以用`:`前面的键来表示条目的含义,而`:`后面就是这个条目所对应的值。
+
+当然,如果愿意,我们也可以使用内置函数`dict`或者是字典的生成式语法来创建字典,代码如下所示。
+
+```python
+# dict函数(构造器)中的每一组参数就是字典中的一组键值对
+person = dict(name='王大锤', age=55, height=168, weight=60, addr='成都市武侯区科华北路62号1栋101')
+print(person) # {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101'}
+
+# 可以通过Python内置函数zip压缩两个序列并创建字典
+items1 = dict(zip('ABCDE', '12345'))
+print(items1) # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'}
+items2 = dict(zip('ABCDE', range(1, 10)))
+print(items2) # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
+
+# 用字典生成式语法创建字典
+items3 = {x: x ** 3 for x in range(1, 6)}
+print(items3) # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
+```
+
+想知道字典中一共有多少组键值对,仍然是使用`len`函数;如果想对字典进行遍历,可以用`for`循环,但是需要注意,`for`循环只是对字典的键进行了遍历,不过没关系,在学习了字典的索引运算后,我们可以通过字典的键访问它对应的值。
+
+```python
+person = {
+ 'name': '王大锤',
+ 'age': 55,
+ 'height': 168,
+ 'weight': 60,
+ 'addr': '成都市武侯区科华北路62号1栋101'
+}
+print(len(person)) # 5
+for key in person:
+ print(key)
+```
+
+### 字典的运算
+
+对于字典类型来说,成员运算和索引运算肯定是很重要的,前者可以判定指定的键在不在字典中,后者可以通过键访问对应的值或者向字典中添加新的键值对。值得注意的是,字典的索引不同于列表的索引,列表中的元素因为有属于自己有序号,所以列表的索引是一个整数;字典中因为保存的是键值对,所以字典需要用键去索引对应的值。需要**特别提醒**大家注意的是,**字典中的键必须是不可变类型**,例如整数(`int`)、浮点数(`float`)、字符串(`str`)、元组(`tuple`)等类型,这一点跟集合类型对元素的要求是一样的;很显然,之前我们讲的列表(`list`)和集合(`set`)不能作为字典中的键,字典类型本身也不能再作为字典中的键,因为字典也是可变类型,但是列表、集合、字典都可以作为字典中的值,例如:
+
+```python
+person = {
+ 'name': '王大锤',
+ 'age': 55,
+ 'height': 168,
+ 'weight': 60,
+ 'addr': ['成都市武侯区科华北路62号1栋101', '北京市西城区百万庄大街1号'],
+ 'car': {
+ 'brand': 'BMW X7',
+ 'maxSpeed': '250',
+ 'length': 5170,
+ 'width': 2000,
+ 'height': 1835,
+ 'displacement': 3.0
+ }
+}
+print(person)
+```
+
+大家可以看看下面的代码,了解一下字典的成员运算和索引运算。
+
+```python
+person = {'name': '王大锤', 'age': 55, 'height': 168, 'weight': 60, 'addr': '成都市武侯区科华北路62号1栋101'}
+
+# 成员运算
+print('name' in person) # True
+print('tel' in person) # False
+
+# 索引运算
+print(person['name'])
+print(person['addr'])
+person['age'] = 25
+person['height'] = 178
+person['tel'] = '13122334455'
+person['signature'] = '你的男朋友是一个盖世垃圾,他会踏着五彩祥云去迎娶你的闺蜜'
+print(person)
+
+# 循环遍历
+for key in person:
+ print(f'{key}:\t{person[key]}')
+```
+
+需要注意,在通过索引运算获取字典中的值时,如指定的键没有在字典中,将会引发`KeyError`异常。
+
+### 字典的方法
+
+字典类型的方法基本上都跟字典的键值对操作相关,其中`get`方法可以通过键来获取对应的值。跟索引运算不同的是,`get`方法在字典中没有指定的键时不会产生异常,而是返回`None`或指定的默认值,代码如下所示。
+
+```python
+person = {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
+print(person.get('name')) # 王大锤
+print(person.get('sex')) # None
+print(person.get('sex', True)) # True
+```
+
+如果需要获取字典中所有的键,可以使用`keys`方法;如果需要获取字典中所有的值,可以使用`values`方法。字典还有一个名为`items`的方法,它会将键和值组装成二元组,通过该方法来遍历字典中的元素也是非常方便的。
+
+```python
+person = {'name': '王大锤', 'age': 25, 'height': 178}
+print(person.keys()) # dict_keys(['name', 'age', 'height'])
+print(person.values()) # dict_values(['王大锤', 25, 178])
+print(person.items()) # dict_items([('name', '王大锤'), ('age', 25), ('height', 178)])
+for key, value in person.items():
+ print(f'{key}:\t{value}')
+```
+
+字典的`update`方法实现两个字典的合并操作。例如,有两个字典`x`和`y`,当执行`x.update(y)`操作时,`x`跟`y`相同的键对应的值会被`y`中的值更新,而`y`中有但`x`中没有的键值对会直接添加到`x`中,代码如下所示。
+
+```python
+person1 = {'name': '王大锤', 'age': 55, 'height': 178}
+person2 = {'age': 25, 'addr': '成都市武侯区科华北路62号1栋101'}
+person1.update(person2)
+print(person1) # {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
+```
+
+如果使用 Python 3.9 及以上的版本,也可以使用`|`运算符来完成同样的操作,代码如下所示。
+
+```python
+person1 = {'name': '王大锤', 'age': 55, 'height': 178}
+person2 = {'age': 25, 'addr': '成都市武侯区科华北路62号1栋101'}
+person1 |= person2
+print(person1) # {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
+```
+
+可以通过`pop`或`popitem`方法从字典中删除元素,前者会返回(获得)键对应的值,但是如果字典中不存在指定的键,会引发`KeyError`错误;后者在删除元素时,会返回(获得)键和值组成的二元组。字典的`clear`方法会清空字典中所有的键值对,代码如下所示。
+
+```python
+person = {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
+print(person.pop('age')) # 25
+print(person) # {'name': '王大锤', 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
+print(person.popitem()) # ('addr', '成都市武侯区科华北路62号1栋101')
+print(person) # {'name': '王大锤', 'height': 178}
+person.clear()
+print(person) # {}
+```
+
+跟列表一样,从字典中删除元素也可以使用`del`关键字,在删除元素的时候如果指定的键索引不到对应的值,一样会引发`KeyError`错误,具体的做法如下所示。
+
+```python
+person = {'name': '王大锤', 'age': 25, 'height': 178, 'addr': '成都市武侯区科华北路62号1栋101'}
+del person['age']
+del person['addr']
+print(person) # {'name': '王大锤', 'height': 178}
+```
+
+### 字典的应用
+
+我们通过几个简单的例子来看看如何使用字典类型解决一些实际的问题。
+
+**例子1**:输入一段话,统计每个英文字母出现的次数,按出现次数从高到低输出。
+
+```python
+sentence = input('请输入一段话: ')
+counter = {}
+for ch in sentence:
+ if 'A' <= ch <= 'Z' or 'a' <= ch <= 'z':
+ counter[ch] = counter.get(ch, 0) + 1
+sorted_keys = sorted(counter, key=counter.get, reverse=True)
+for key in sorted_keys:
+ print(f'{key} 出现了 {counter[key]} 次.')
+```
+
+输入:
+
+```
+Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
+```
+
+输出:
+
+```
+e 出现了 27 次.
+n 出现了 21 次.
+a 出现了 18 次.
+i 出现了 18 次.
+s 出现了 16 次.
+t 出现了 16 次.
+o 出现了 14 次.
+h 出现了 13 次.
+r 出现了 10 次.
+d 出现了 9 次.
+l 出现了 9 次.
+g 出现了 6 次.
+u 出现了 6 次.
+f 出现了 6 次.
+c 出现了 6 次.
+y 出现了 5 次.
+b 出现了 5 次.
+m 出现了 4 次.
+p 出现了 3 次.
+w 出现了 2 次.
+v 出现了 2 次.
+M 出现了 1 次.
+k 出现了 1 次.
+x 出现了 1 次.
+```
+
+**例子2**:在一个字典中保存了股票的代码和价格,找出股价大于100元的股票并创建一个新的字典。
+
+> **说明**:可以用字典的生成式语法来创建这个新字典。
+
+```python
+stocks = {
+ 'AAPL': 191.88,
+ 'GOOG': 1186.96,
+ 'IBM': 149.24,
+ 'ORCL': 48.44,
+ 'ACN': 166.89,
+ 'FB': 208.09,
+ 'SYMC': 21.29
+}
+stocks2 = {key: value for key, value in stocks.items() if value > 100}
+print(stocks2)
+```
+
+输出:
+
+```
+{'AAPL': 191.88, 'GOOG': 1186.96, 'IBM': 149.24, 'ACN': 166.89, 'FB': 208.09}
+```
+
+### 总结
+
+Python 程序中的字典跟现实生活中字典非常像,允许我们**以键值对的形式保存数据**,再**通过键访问对应的值**。字典是一种非常**有利于数据检索**的数据类型,但是需要再次提醒大家,**字典中的键必须是不可变类型**,列表、集合、字典等类型的数据都不能作为字典的键。
diff --git "a/Day01-20/14.\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227.md" "b/Day01-20/14.\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227.md"
new file mode 100755
index 000000000..8ad8a4d55
--- /dev/null
+++ "b/Day01-20/14.\345\207\275\346\225\260\345\222\214\346\250\241\345\235\227.md"
@@ -0,0 +1,392 @@
+## 函数和模块
+
+在讲解本节课的内容之前,我们先来研究一道数学题,请说出下面的方程有多少组正整数解。
+
+$$
+x_{1} + x_{2} + x_{3} + x_{4} = 8
+$$
+
+你可能已经想到了,这个问题其实等同于将 8 个苹果分成四组且每组至少一个苹果有多少种方案,也等价于在分隔 8 个苹果的 7 个间隙之间放入三个隔断将苹果分成四组有多少种方案,所以答案是 $\small{C_{7}^{3} = 35}$ ,其中 $\small{C_{7}^{3}}$ 代表 7 选 3 的组合数,其计算公式如下所示。
+
+$$
+C_m^n = \frac {m!} {n!(m-n)!}
+$$
+
+根据之前学习的知识,我们可以用循环做累乘的方式分别计算出 $\small{m!}$ 、 $\small{n!}$ 和 $\small{(m-n)!}$ ,然后再通过除法运算得到组合数 $\small{C_{m}^{n}}$ ,代码如下所示。
+
+```python
+"""
+输入m和n,计算组合数C(m,n)的值
+
+Version: 1.0
+Author: 骆昊
+"""
+
+m = int(input('m = '))
+n = int(input('n = '))
+# 计算m的阶乘
+fm = 1
+for num in range(1, m + 1):
+ fm *= num
+# 计算n的阶乘
+fn = 1
+for num in range(1, n + 1):
+ fn *= num
+# 计算m-n的阶乘
+fk = 1
+for num in range(1, m - n + 1):
+ fk *= num
+# 计算C(M,N)的值
+print(fm // fn // fk)
+```
+
+输入:
+
+```
+m = 7
+n = 3
+```
+
+输出:
+
+```
+35
+```
+
+不知大家是否注意到,上面的代码中我们做了三次求阶乘的操作,虽然 $\small{m}$ 、 $\small{n}$ 、 $\small{m - n}$ 的值各不相同,但是三段代码并没有实质性的区别,属于重复代码。世界级的编程大师*Martin Fowler*曾经说过:“**代码有很多种坏味道,重复是最坏的一种!**”。要写出高质量的代码,首先就要解决重复代码的问题。对于上面的代码来说,我们可以将求阶乘的功能封装到一个称为“函数”的代码块中,在需要计算阶乘的地方,我们只需“调用函数”即可实现对求阶乘功能的复用。
+
+### 定义函数
+
+数学上的函数通常形如 $\small{y = f(x)}$ 或者 $\small{z = g(x, y)}$ 这样的形式,在 $\small{y = f(x)}$ 中, $\small{f}$ 是函数的名字, $\small{x}$ 是函数的自变量, $\small{y}$ 是函数的因变量;而在 $\small{z = g(x, y)}$ 中, $\small{g}$ 是函数名, $\small{x}$ 和 $\small{y}$ 是函数的自变量, $\small{z}$ 是函数的因变量。Python 中的函数跟这个结构是一致的,每个函数都有自己的名字、自变量和因变量。我们通常把 Python 函数的自变量称为函数的参数,而因变量称为函数的返回值。
+
+Python 中可以使用`def`关键字来定义函数,和变量一样每个函数也应该有一个漂亮的名字,命名规则跟变量的命名规则是一样的(大家赶紧想想我们之前讲过的变量的命名规则)。在函数名后面的圆括号中可以设置函数的参数,也就是我们刚才说的函数的自变量,而函数执行完成后,我们会通过`return`关键字来返回函数的执行结果,这就是我们刚才说的函数的因变量。如果函数中没有`return`语句,那么函数会返回代表空值的`None`。另外,函数也可以没有自变量(参数),但是函数名后面的圆括号是必须有的。一个函数要做的事情(要执行的代码),是通过代码缩进的方式放到函数定义行之后,跟之前分支和循环结构的代码块类似,如下图所示。
+
+
+
+下面,我们将之前代码中求阶乘的操作放到一个函数中,通过这种方式来重构上面的代码。**所谓重构,是在不影响代码执行结果的前提下对代码的结构进行调整**,重构之后的代码如下所示。
+
+```python
+"""
+输入m和n,计算组合数C(m,n)的值
+
+Version: 1.1
+Author: 骆昊
+"""
+
+
+# 通过关键字def定义求阶乘的函数
+# 自变量(参数)num是一个非负整数
+# 因变量(返回值)是num的阶乘
+def fac(num):
+ result = 1
+ for n in range(2, num + 1):
+ result *= n
+ return result
+
+
+m = int(input('m = '))
+n = int(input('n = '))
+# 计算阶乘的时候不需要写重复的代码而是直接调用函数
+# 调用函数的语法是在函数名后面跟上圆括号并传入参数
+print(fac(m) // fac(n) // fac(m - n))
+```
+
+大家可以感受下,上面的代码是不是比之前的版本更加简单优雅。更为重要的是,我们定义的求阶乘函数`fac`还可以在其他需要求阶乘的代码中重复使用。所以,**使用函数可以帮助我们将功能上相对独立且会被重复使用的代码封装起来**,当我们需要这些的代码,不是把重复的代码再编写一遍,而是**通过调用函数实现对既有代码的复用**。事实上,Python 标准库的`math`模块中,已经有一个名为`factorial`的函数实现了求阶乘的功能,我们可以直接用`import math`导入`math`模块,然后使用`math.factorial`来调用求阶乘的函数;我们也可以通过`from math import factorial`直接导入`factorial`函数来使用它,代码如下所示。
+
+```python
+"""
+输入m和n,计算组合数C(m,n)的值
+
+Version: 1.2
+Author: 骆昊
+"""
+from math import factorial
+
+m = int(input('m = '))
+n = int(input('n = '))
+print(factorial(m) // factorial(n) // factorial(m - n))
+```
+
+将来我们使用的函数,要么是自定义的函数,要么是 Python 标准库或者三方库中提供的函数,如果已经有现成的可用的函数,我们就没有必要自己去定义,“**重复发明轮子**”是一件非常糟糕的事情。对于上面的代码,如果你觉得`factorial`这个名字太长,书写代码的时候不是特别方便,我们在导入函数的时候还可以通过`as`关键字为其别名。在调用函数的时候,我们可以用函数的别名,而不再使用它之前的名字,代码如下所示。
+
+```python
+"""
+输入m和n,计算组合数C(m,n)的值
+
+Version: 1.3
+Author: 骆昊
+"""
+from math import factorial as f
+
+m = int(input('m = '))
+n = int(input('n = '))
+print(f(m) // f(n) // f(m - n))
+```
+
+### 函数的参数
+
+#### 位置参数和关键字参数
+
+我们再来写一个函数,根据给出的三条边的长度判断是否可以构成三角形,如果可以构成三角形则返回`True`,否则返回`False`,代码如下所示。
+
+```python
+def make_judgement(a, b, c):
+ """判断三条边的长度能否构成三角形"""
+ return a + b > c and b + c > a and a + c > b
+```
+
+上面`make_judgement`函数有三个参数,这种参数叫做位置参数,在调用函数时通常按照从左到右的顺序依次传入,而且传入参数的数量必须和定义函数时参数的数量相同,如下所示。
+
+```python
+print(make_judgement(1, 2, 3)) # False
+print(make_judgement(4, 5, 6)) # True
+```
+
+如果不想按照从左到右的顺序依次给出`a`、`b`、`c` 三个参数的值,也可以使用关键字参数,通过“参数名=参数值”的形式为函数传入参数,如下所示。
+
+```python
+print(make_judgement(b=2, c=3, a=1)) # False
+print(make_judgement(c=6, b=4, a=5)) # True
+```
+
+在定义函数时,我们可以在参数列表中用`/`设置**强制位置参数**(*positional-only arguments*),用`*`设置**命名关键字参数**。所谓强制位置参数,就是调用函数时只能按照参数位置来接收参数值的参数;而命名关键字参数只能通过“参数名=参数值”的方式来传递和接收参数,大家可以看看下面的例子。
+
+```python
+# /前面的参数是强制位置参数
+def make_judgement(a, b, c, /):
+ """判断三条边的长度能否构成三角形"""
+ return a + b > c and b + c > a and a + c > b
+
+
+# 下面的代码会产生TypeError错误,错误信息提示“强制位置参数是不允许给出参数名的”
+# TypeError: make_judgement() got some positional-only arguments passed as keyword arguments
+# print(make_judgement(b=2, c=3, a=1))
+```
+
+> **说明**:强制位置参数是 Python 3.8 引入的新特性,在使用低版本的 Python 解释器时需要注意。
+
+```python
+# *后面的参数是命名关键字参数
+def make_judgement(*, a, b, c):
+ """判断三条边的长度能否构成三角形"""
+ return a + b > c and b + c > a and a + c > b
+
+
+# 下面的代码会产生TypeError错误,错误信息提示“函数没有位置参数但却给了3个位置参数”
+# TypeError: make_judgement() takes 0 positional arguments but 3 were given
+# print(make_judgement(1, 2, 3))
+```
+
+#### 参数的默认值
+
+Python 中允许函数的参数拥有默认值,我们可以把之前讲过的一个例子“CRAPS赌博游戏”(《第07课:分支和循环结构的应用》)中摇色子获得点数的功能封装到函数中,代码如下所示。
+
+```python
+from random import randrange
+
+
+# 定义摇色子的函数
+# 函数的自变量(参数)n表示色子的个数,默认值为2
+# 函数的因变量(返回值)表示摇n颗色子得到的点数
+def roll_dice(n=2):
+ total = 0
+ for _ in range(n):
+ total += randrange(1, 7)
+ return total
+
+
+# 如果没有指定参数,那么n使用默认值2,表示摇两颗色子
+print(roll_dice())
+# 传入参数3,变量n被赋值为3,表示摇三颗色子获得点数
+print(roll_dice(3))
+```
+
+我们再来看一个更为简单的例子。
+
+```python
+def add(a=0, b=0, c=0):
+ """三个数相加求和"""
+ return a + b + c
+
+
+# 调用add函数,没有传入参数,那么a、b、c都使用默认值0
+print(add()) # 0
+# 调用add函数,传入一个参数,该参数赋值给变量a, 变量b和c使用默认值0
+print(add(1)) # 1
+# 调用add函数,传入两个参数,分别赋值给变量a和b,变量c使用默认值0
+print(add(1, 2)) # 3
+# 调用add函数,传入三个参数,分别赋值给a、b、c三个变量
+print(add(1, 2, 3)) # 6
+```
+
+需要注意的是,**带默认值的参数必须放在不带默认值的参数之后**,否则将产生`SyntaxError`错误,错误消息是:`non-default argument follows default argument`,翻译成中文的意思是“没有默认值的参数放在了带默认值的参数后面”。
+
+#### 可变参数
+
+Python 语言中可以通过星号表达式语法让函数支持可变参数。所谓可变参数指的是在调用函数时,可以向函数传入`0`个或任意多个参数。将来我们以团队协作的方式开发商业项目时,很有可能要设计函数给其他人使用,但有的时候我们并不知道函数的调用者会向该函数传入多少个参数,这个时候可变参数就能派上用场。
+
+下面的代码演示了如何使用可变位置参数实现对任意多个数求和的`add`函数,调用函数时传入的参数会保存到一个元组,通过对该元组的遍历,可以获取传入函数的参数。
+
+```python
+# 用星号表达式来表示args可以接收0个或任意多个参数
+# 调用函数时传入的n个参数会组装成一个n元组赋给args
+# 如果一个参数都没有传入,那么args会是一个空元组
+def add(*args):
+ total = 0
+ # 对保存可变参数的元组进行循环遍历
+ for val in args:
+ # 对参数进行了类型检查(数值型的才能求和)
+ if type(val) in (int, float):
+ total += val
+ return total
+
+
+# 在调用add函数时可以传入0个或任意多个参数
+print(add()) # 0
+print(add(1)) # 1
+print(add(1, 2, 3)) # 6
+print(add(1, 2, 'hello', 3.45, 6)) # 12.45
+```
+
+如果我们希望通过“参数名=参数值”的形式传入若干个参数,具体有多少个参数也是不确定的,我们还可以给函数添加可变关键字参数,把传入的关键字参数组装到一个字典中,代码如下所示。
+
+```python
+# 参数列表中的**kwargs可以接收0个或任意多个关键字参数
+# 调用函数时传入的关键字参数会组装成一个字典(参数名是字典中的键,参数值是字典中的值)
+# 如果一个关键字参数都没有传入,那么kwargs会是一个空字典
+def foo(*args, **kwargs):
+ print(args)
+ print(kwargs)
+
+
+foo(3, 2.1, True, name='骆昊', age=43, gpa=4.95)
+```
+
+输出:
+
+```
+(3, 2.1, True)
+{'name': '骆昊', 'age': 43, 'gpa': 4.95}
+```
+
+### 用模块管理函数
+
+不管用什么样的编程语言来写代码,给变量、函数起名字都是一个让人头疼的问题,因为我们会遇到**命名冲突**这种尴尬的情况。最简单的场景就是在同一个`.py`文件中定义了两个同名的函数,如下所示。
+
+```python
+def foo():
+ print('hello, world!')
+
+
+def foo():
+ print('goodbye, world!')
+
+
+foo() # 大家猜猜调用foo函数会输出什么
+```
+
+当然上面的这种情况我们很容易就能避免,但是如果项目是团队协作多人开发的时候,团队中可能有多个程序员都定义了名为`foo`的函数,这种情况下怎么解决命名冲突呢?答案其实很简单,Python 中每个文件就代表了一个模块(module),我们在不同的模块中可以有同名的函数,在使用函数的时候,我们通过`import`关键字导入指定的模块再使用**完全限定名**(`模块名.函数名`)的调用方式,就可以区分到底要使用的是哪个模块中的`foo`函数,代码如下所示。
+
+`module1.py`
+
+```python
+def foo():
+ print('hello, world!')
+```
+
+`module2.py`
+
+```python
+def foo():
+ print('goodbye, world!')
+```
+
+`test.py`
+
+```python
+import module1
+import module2
+
+# 用“模块名.函数名”的方式(完全限定名)调用函数,
+module1.foo() # hello, world!
+module2.foo() # goodbye, world!
+```
+
+在导入模块时,还可以使用`as`关键字对模块进行别名,这样我们可以使用更为简短的完全限定名。
+
+`test.py`
+
+```python
+import module1 as m1
+import module2 as m2
+
+m1.foo() # hello, world!
+m2.foo() # goodbye, world!
+```
+
+上面两段代码,我们导入的是定义函数的模块,我们也可以使用`from...import...`语法从模块中直接导入需要使用的函数,代码如下所示。
+
+`test.py`
+
+```python
+from module1 import foo
+
+foo() # hello, world!
+
+from module2 import foo
+
+foo() # goodbye, world!
+```
+
+但是,如果我们如果从两个不同的模块中导入了同名的函数,后面导入的函数会替换掉之前的导入,就像下面的代码,调用`foo`会输出`goodbye, world!`,因为我们先导入了`module1`的`foo`,后导入了`module2`的`foo` 。如果两个`from...import...`反过来写,那就是另外一番光景了。
+
+`test.py`
+
+```python
+from module1 import foo
+from module2 import foo
+
+foo() # goodbye, world!
+```
+
+如果想在上面的代码中同时使用来自两个模块的`foo`函数还是有办法的,大家可能已经猜到了,还是用`as`关键字对导入的函数进行别名,代码如下所示。
+
+`test.py`
+
+```python
+from module1 import foo as f1
+from module2 import foo as f2
+
+f1() # hello, world!
+f2() # goodbye, world!
+```
+
+### 标准库中的模块和函数
+
+Python 标准库中提供了大量的模块和函数来简化我们的开发工作,我们之前用过的`random`模块就为我们提供了生成随机数和进行随机抽样的函数;而`time`模块则提供了和时间操作相关的函数;我们之前用到过的`math`模块中还包括了计算正弦、余弦、指数、对数等一系列的数学函数。随着我们深入学习 Python 语言,我们还会用到更多的模块和函数。
+
+Python 标准库中还有一类函数是不需要`import`就能够直接使用的,我们将其称之为**内置函数**,这些内置函数不仅有用而且还很常用,下面的表格列出了一部分的内置函数。
+
+| 函数 | 说明 |
+| ------- | ------------------------------------------------------------ |
+| `abs` | 返回一个数的绝对值,例如:`abs(-1.3)`会返回`1.3`。 |
+| `bin` | 把一个整数转换成以`'0b'`开头的二进制字符串,例如:`bin(123)`会返回`'0b1111011'`。 |
+| `chr` | 将Unicode编码转换成对应的字符,例如:`chr(8364)`会返回`'€'`。 |
+| `hex` | 将一个整数转换成以`'0x'`开头的十六进制字符串,例如:`hex(123)`会返回`'0x7b'`。 |
+| `input` | 从输入中读取一行,返回读到的字符串。 |
+| `len` | 获取字符串、列表等的长度。 |
+| `max` | 返回多个参数或一个可迭代对象中的最大值,例如:`max(12, 95, 37)`会返回`95`。 |
+| `min` | 返回多个参数或一个可迭代对象中的最小值,例如:`min(12, 95, 37)`会返回`12`。 |
+| `oct` | 把一个整数转换成以`'0o'`开头的八进制字符串,例如:`oct(123)`会返回`'0o173'`。 |
+| `open` | 打开一个文件并返回文件对象。 |
+| `ord` | 将字符转换成对应的Unicode编码,例如:`ord('€')`会返回`8364`。 |
+| `pow` | 求幂运算,例如:`pow(2, 3)`会返回`8`;`pow(2, 0.5)`会返回`1.4142135623730951`。 |
+| `print` | 打印输出。 |
+| `range` | 构造一个范围序列,例如:`range(100)`会产生`0`到`99`的整数序列。 |
+| `round` | 按照指定的精度对数值进行四舍五入,例如:`round(1.23456, 4)`会返回`1.2346`。 |
+| `sum` | 对一个序列中的项从左到右进行求和运算,例如:`sum(range(1, 101))`会返回`5050`。 |
+| `type` | 返回对象的类型,例如:`type(10)`会返回`int`;而` type('hello')`会返回`str`。 |
+
+### 总结
+
+**函数是对功能相对独立且会重复使用的代码的封装**。学会使用定义和使用函数,就能够写出更为优质的代码。当然,Python 语言的标准库中已经为我们提供了大量的模块和常用的函数,用好这些模块和函数就能够用更少的代码做更多的事情;如果这些模块和函数不能满足我们的要求,可能就需要自定义函数,然后再通过模块的概念来管理这些自定义函数。
\ No newline at end of file
diff --git "a/Day01-20/15.\345\207\275\346\225\260\345\272\224\347\224\250\345\256\236\346\210\230.md" "b/Day01-20/15.\345\207\275\346\225\260\345\272\224\347\224\250\345\256\236\346\210\230.md"
new file mode 100755
index 000000000..a553c80ba
--- /dev/null
+++ "b/Day01-20/15.\345\207\275\346\225\260\345\272\224\347\224\250\345\256\236\346\210\230.md"
@@ -0,0 +1,231 @@
+## 函数应用实战
+
+### 例子1:随机验证码
+
+设计一个生成随机验证码的函数,验证码由数字和英文大小写字母构成,长度可以通过参数设置。
+
+```python
+import random
+import string
+
+ALL_CHARS = string.digits + string.ascii_letters
+
+
+def generate_code(*, code_len=4):
+ """
+ 生成指定长度的验证码
+ :param code_len: 验证码的长度(默认4个字符)
+ :return: 由大小写英文字母和数字构成的随机验证码字符串
+ """
+ return ''.join(random.choices(ALL_CHARS, k=code_len))
+```
+
+> **说明1**:`string`模块的`digits`代表0到9的数字构成的字符串`'0123456789'`,`string`模块的`ascii_letters`代表大小写英文字母构成的字符串`'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'`。
+>
+> **说明2**:`random`模块的`sample`和`choices`函数都可以实现随机抽样,`sample`实现无放回抽样,这意味着抽样取出的元素是不重复的;`choices`实现有放回抽样,这意味着可能会重复选中某些元素。这两个函数的第一个参数代表抽样的总体,而参数`k`代表样本容量,需要说明的是`choices`函数的参数`k`是一个命名关键字参数,在传参时必须指定参数名。
+
+可以用下面的代码生成5组随机验证码来测试上面的函数。
+
+```python
+for _ in range(5):
+ print(generate_code())
+```
+
+输出:
+
+```
+59tZ
+QKU5
+izq8
+IBBb
+jIfX
+```
+
+或者
+
+```python
+for _ in range(5):
+ print(generate_code(code_len=6))
+```
+
+输出:
+
+```
+FxJucw
+HS4H9G
+0yyXfz
+x7fohf
+ReO22w
+```
+
+> **说明**:我们设计的`generate_code`函数的参数是命名关键字参数,由于它有默认值,可以不给它传值,使用默认值4。如果需要给函数传入参数,必须指定参数名`code_len`。
+
+### 例子2:判断素数
+
+设计一个判断给定的大于1的正整数是不是质数的函数。质数是只能被1和自身整除的正整数(大于1),如果一个大于 1 的正整数 $\small{N}$ 是质数,那就意味着在 2 到 $\small{N-1}$ 之间都没有它的因子。
+
+```python
+def is_prime(num: int) -> bool:
+ """
+ 判断一个正整数是不是质数
+ :param num: 大于1的正整数
+ :return: 如果num是质数返回True,否则返回False
+ """
+ for i in range(2, int(num ** 0.5) + 1):
+ if num % i == 0:
+ return False
+ return True
+```
+
+> **说明1**:上面`is_prime`函数的参数`num`后面的`: int`用来标注参数的类型,虽然它对代码的执行结果不产生任何影响,但是很好的增强了代码的可读性。同理,参数列表后面的`-> bool`用来标注函数返回值的类型,它也不会对代码的执行结果产生影响,但是却让我们清楚的知道,调用函数会得到一个布尔值,要么是`True`,要么是`False`。
+>
+> **说明2**:上面的循环并不需要从 2 循环到 $\small{N-1}$ ,因为如果循环进行到 $\small{\sqrt{N}}$ 时,还没有找到$\small{N}$的因子,那么 $\small{\sqrt{N}}$ 之后也不会出现 $\small{N}$ 的因子,大家可以自己想一想这是为什么。
+
+### 例子3:最大公约数和最小公倍数
+
+设计计算两个正整数最大公约数和最小公倍数的函数。 $\small{x}$ 和 $\small{y}$ 的最大公约数是能够同时整除 $\small{x}$ 和 $\small{y}$ 的最大整数,如果 $\small{x}$ 和 $\small{y}$ 互质,那么它们的最大公约数为 1; $\small{x}$ 和 $\small{y}$ 的最小公倍数是能够同时被 $\small{x}$ 和 $\small{y}$ 整除的最小正整数,如果 $\small{x}$ 和 $\small{y}$ 互质,那么它们的最小公倍数为 $\small{x \times y}$ 。需要提醒大家注意的是,计算最大公约数和最小公倍数是两个不同的功能,应该设计成两个函数,而不是把两个功能放到同一个函数中。
+
+```python
+def lcm(x: int, y: int) -> int:
+ """求最小公倍数"""
+ return x * y // gcd(x, y)
+
+
+def gcd(x: int, y: int) -> int:
+ """求最大公约数"""
+ while y % x != 0:
+ x, y = y % x, x
+ return x
+```
+
+> **说明**:函数之间可以相互调用,上面求最小公倍数的`lcm`函数调用了求最大公约数的`gcd`函数,通过 $\frac{x \times y}{ gcd(x, y)}$ 来计算最小公倍数。
+
+### 例子4:数据统计
+
+假设样本数据保存一个列表中,设计计算样本数据描述性统计信息的函数。描述性统计信息通常包括:算术平均值、中位数、极差(最大值和最小值的差)、方差、标准差、变异系数等,计算公式如下所示。
+
+样本均值(sample mean):
+
+$$
+\bar{x} = \frac{\sum_{i=1}^{n}x_{i}}{n} = \frac{x_{1}+x_{2}+\cdots +x_{n}}{n}
+$$
+
+样本方差(sample variance):
+
+$$
+s^2 = \frac {\sum_{i=1}^{n}(x_i - \bar{x})^2} {n-1}
+$$
+
+样本标准差(sample standard deviation):
+
+$$
+s = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n-1}}
+$$
+
+变异系数(coefficient of sample variation):
+
+$$
+CV = \frac{s}{\bar{x}}
+$$
+
+```python
+def ptp(data):
+ """极差(全距)"""
+ return max(data) - min(data)
+
+
+def mean(data):
+ """算术平均"""
+ return sum(data) / len(data)
+
+
+def median(data):
+ """中位数"""
+ temp, size = sorted(data), len(data)
+ if size % 2 != 0:
+ return temp[size // 2]
+ else:
+ return mean(temp[size // 2 - 1:size // 2 + 1])
+
+
+def var(data, ddof=1):
+ """方差"""
+ x_bar = mean(data)
+ temp = [(num - x_bar) ** 2 for num in data]
+ return sum(temp) / (len(temp) - ddof)
+
+
+def std(data, ddof=1):
+ """标准差"""
+ return var(data, ddof) ** 0.5
+
+
+def cv(data, ddof=1):
+ """变异系数"""
+ return std(data, ddof) / mean(data)
+
+
+def describe(data):
+ """输出描述性统计信息"""
+ print(f'均值: {mean(data)}')
+ print(f'中位数: {median(data)}')
+ print(f'极差: {ptp(data)}')
+ print(f'方差: {var(data)}')
+ print(f'标准差: {std(data)}')
+ print(f'变异系数: {cv(data)}')
+```
+
+> **说明1**:中位数是将数据按照升序或降序排列后位于中间的数,它描述了数据的中等水平。中位数的计算分两种情况:当数据体量$n$为奇数时,中位数是位于 $\frac{n + 1}{2}$ 位置的元素;当数据体量 $\small{n}$ 为偶数时,中位数是位于 $\frac{n}{2}$ 和 $\frac{n}{2} + 1$ 两个位置元素的均值。
+>
+> **说明2**:计算方差和标准差的函数中有一个名为`ddof`的参数,它代表了可以调整的自由度,默认值为 1。在计算样本方差和样本标准差时,需要进行自由度校正;如果要计算总体方差和总体标准差,可以将`ddof`参数赋值为 0,即不需要进行自由度校正。
+>
+> **说明3**:`describe`函数将上面封装好的统计函数组装到一起,用于输出数据的描述性统计信息。事实上,Python 标准库中有一个名为`statistics`的模块,它已经把获取描述性统计信息的函数封装好了,有兴趣的读者可以自行了解。
+
+### 例子5:双色球随机选号
+
+我们用函数重构之前讲过的双色球随机选号的例子(《第09课:常用数据结构之列表-2》),将生成随机号码和输出一组号码的功能分别封装到两个函数中,然后通过调用函数实现机选`N`注号码的功能。
+
+```python
+"""
+双色球随机选号程序
+
+Author: 骆昊
+Version: 1.3
+"""
+import random
+
+RED_BALLS = [i for i in range(1, 34)]
+BLUE_BALLS = [i for i in range(1, 17)]
+
+
+def choose():
+ """
+ 生成一组随机号码
+ :return: 保存随机号码的列表
+ """
+ selected_balls = random.sample(RED_BALLS, 6)
+ selected_balls.sort()
+ selected_balls.append(random.choice(BLUE_BALLS))
+ return selected_balls
+
+
+def display(balls):
+ """
+ 格式输出一组号码
+ :param balls: 保存随机号码的列表
+ """
+ for ball in balls[:-1]:
+ print(f'\033[031m{ball:0>2d}\033[0m', end=' ')
+ print(f'\033[034m{balls[-1]:0>2d}\033[0m')
+
+
+n = int(input('生成几注号码: '))
+for _ in range(n):
+ display(choose())
+```
+
+> **说明**:大家看看`display(choose())`这行代码,这里我们先通过`choose`函数获得一组随机号码,然后把`choose`函数的返回值作为`display`函数的参数,通过`display`函数将选中的随机号码显示出来。重构之后的代码逻辑非常清晰,代码的可读性更强了。如果有人为你封装了这两个函数,你仅仅是函数的调用者,其实你根本不用关心`choose`函数和`display`函数的内部实现,你只需要知道调用`choose`函数可以生成一组随机号码,而调用`display`函数传入一个列表,就可以输出这组号码。将来我们使用各种各样的 Python 三方库时,我们也根本不关注它们的底层实现,我们需要知道的仅仅是调用哪个函数可以解决问题。
+
+### 总结
+
+在写代码尤其是开发商业项目的时候,一定要有意识的**将相对独立且重复使用的功能封装成函数**,这样不管是自己还是团队的其他成员都可以通过调用函数的方式来使用这些功能,减少工作中那些重复且乏味的劳动。
\ No newline at end of file
diff --git "a/Day01-20/16.\345\207\275\346\225\260\344\275\277\347\224\250\350\277\233\351\230\266.md" "b/Day01-20/16.\345\207\275\346\225\260\344\275\277\347\224\250\350\277\233\351\230\266.md"
new file mode 100755
index 000000000..692144d66
--- /dev/null
+++ "b/Day01-20/16.\345\207\275\346\225\260\344\275\277\347\224\250\350\277\233\351\230\266.md"
@@ -0,0 +1,165 @@
+## 函数使用进阶
+
+我们继续探索定义和使用函数的相关知识。通过前面的学习,我们知道了函数有自变量(参数)和因变量(返回值),自变量可以是任意的数据类型,因变量也可以是任意的数据类型,那么这里就有一个小问题,我们能不能用函数作为函数的参数,用函数作为函数的返回值?这里我们先说结论:**Python 中的函数是“一等函数”**,所谓“一等函数”指的就是函数可以赋值给变量,函数可以作为函数的参数,函数也可以作为函数的返回值。把一个函数作为其他函数的参数或返回值的用法,我们通常称之为“高阶函数”。
+
+### 高阶函数
+
+我们回到之前讲过的一个例子,设计一个函数,传入任意多个参数,对其中`int`类型或`float`类型的元素实现求和操作。我们对之前的代码稍作调整,让整个代码更加紧凑一些,如下所示。
+
+```python
+def calc(*args, **kwargs):
+ items = list(args) + list(kwargs.values())
+ result = 0
+ for item in items:
+ if type(item) in (int, float):
+ result += item
+ return result
+```
+
+如果我们希望上面的`calc`函数不仅仅可以做多个参数的求和,还可以实现更多的甚至是自定义的二元运算,我们该怎么做呢?上面的代码只能求和是因为函数中使用了`+=`运算符,这使得函数跟加法运算形成了耦合关系,如果能解除这种耦合关系,函数的通用性和灵活性就会更好。解除耦合的办法就是将`+`运算符变成函数调用,并将其设计为函数的参数,代码如下所示。
+
+```python
+def calc(init_value, op_func, *args, **kwargs):
+ items = list(args) + list(kwargs.values())
+ result = init_value
+ for item in items:
+ if type(item) in (int, float):
+ result = op_func(result, item)
+ return result
+```
+
+注意,上面的函数增加了两个参数,其中`init_value`代表运算的初始值,`op_func`代表二元运算函数,为了调用修改后的函数,我们先定义做加法和乘法运算的函数,代码如下所示。
+
+```python
+def add(x, y):
+ return x + y
+
+
+def mul(x, y):
+ return x * y
+```
+
+如果要做求和的运算,我们可以按照下面的方式调用`calc`函数。
+
+```python
+print(calc(0, add, 1, 2, 3, 4, 5)) # 15
+```
+
+如果要做求乘积运算,我们可以按照下面的方式调用`calc`函数。
+
+```python
+print(calc(1, mul, 1, 2, 3, 4, 5)) # 120
+```
+
+上面的`calc`函数通过将运算符变成函数的参数,实现了跟加法运算耦合,这是一种非常高明和实用的编程技巧,但对于最初学者来说可能会觉得难以理解,建议大家细品一下。需要注意上面的代码中,将函数作为参数传入其他函数和直接调用函数是有显著的区别的,**调用函数需要在函数名后面跟上圆括号,而把函数作为参数时只需要函数名即可**。
+
+如果我们没有提前定义好`add`和`mul`函数,也可以使用 Python 标准库中的`operator`模块提供的`add`和`mul`函数,它们分别代表了做加法和做乘法的二元运算,我们拿过来直接使用即可,代码如下所示。
+
+```python
+import operator
+
+print(calc(0, operator.add, 1, 2, 3, 4, 5)) # 15
+print(calc(1, operator.mul, 1, 2, 3, 4, 5)) # 120
+```
+
+Python 内置函数中有不少高阶函数,我们前面提到过的`filter`和`map`函数就是高阶函数,前者可以实现对序列中元素的过滤,后者可以实现对序列中元素的映射,例如我们要去掉一个整数列表中的奇数,并对所有的偶数求平方得到一个新的列表,就可以直接使用这两个函数来做到,具体的做法是如下所示。
+
+```python
+def is_even(num):
+ """判断num是不是偶数"""
+ return num % 2 == 0
+
+
+def square(num):
+ """求平方"""
+ return num ** 2
+
+
+old_nums = [35, 12, 8, 99, 60, 52]
+new_nums = list(map(square, filter(is_even, old_nums)))
+print(new_nums) # [144, 64, 3600, 2704]
+```
+
+当然,要完成上面代码的功能,也可以使用列表生成式,列表生成式的做法更为简单优雅。
+
+```python
+old_nums = [35, 12, 8, 99, 60, 52]
+new_nums = [num ** 2 for num in old_nums if num % 2 == 0]
+print(new_nums) # [144, 64, 3600, 2704]
+```
+
+我们再来讨论一个内置函数`sorted`,它可以实现对容器型数据类型(如:列表、字典等)元素的排序。我们之前讲过`list`类型的`sort`方法,它实现了对列表元素的排序,`sorted`函数从功能上来讲跟列表的`sort`方法没有区别,但它会返回排序后的列表对象,而不是直接修改原来的列表,这一点我们称为**函数的无副作用设计**,也就是说调用函数除了产生返回值以外,不会对程序的状态或外部环境产生任何其他的影响。使用`sorted`函数排序时,可以通过高阶函数的形式自定义排序的规则,我们通过下面的例子加以说明。
+
+```python
+old_strings = ['in', 'apple', 'zoo', 'waxberry', 'pear']
+new_strings = sorted(old_strings)
+print(new_strings) # ['apple', 'in', 'pear', waxberry', 'zoo']
+```
+
+上面的代码对大家来说并不陌生,但是如果希望根据字符串的长度而不是字母表顺序对列表元素排序,我们可以向`sorted`函数传入一个名为`key`的参数,将`key`参数赋值为获取字符串长度的函数`len`,这个函数我们在之前的课程中讲到过,代码如下所示。
+
+```python
+old_strings = ['in', 'apple', 'zoo', 'waxberry', 'pear']
+new_strings = sorted(old_strings, key=len)
+print(new_strings) # ['in', 'zoo', 'pear', 'apple', 'waxberry']
+```
+
+> **说明**:列表类型的`sort`方法也有同样的`key`参数,有兴趣的读者可以自行尝试。
+
+### Lambda函数
+
+在使用高阶函数的时候,如果作为参数或者返回值的函数本身非常简单,一行代码就能够完成,也不需要考虑对函数的复用,那么我们可以使用 lambda 函数。Python 中的 lambda 函数是没有的名字函数,所以很多人也把它叫做**匿名函数**,lambda 函数只能有一行代码,代码中的表达式产生的运算结果就是这个匿名函数的返回值。之前的代码中,我们写的`is_even`和`square`函数都只有一行代码,我们可以考虑用 lambda 函数来替换掉它们,代码如下所示。
+
+```python
+old_nums = [35, 12, 8, 99, 60, 52]
+new_nums = list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, old_nums)))
+print(new_nums) # [144, 64, 3600, 2704]
+```
+
+通过上面的代码可以看出,定义 lambda 函数的关键字是`lambda`,后面跟函数的参数,如果有多个参数用逗号进行分隔;冒号后面的部分就是函数的执行体,通常是一个表达式,表达式的运算结果就是 lambda 函数的返回值,不需要写`return` 关键字。
+
+前面我们说过,Python 中的函数是“一等函数”,函数是可以直接赋值给变量的。在学习了 lambda 函数之后,前面我们写过的一些函数就可以用一行代码来实现它们了,大家可以看看能否理解下面的求阶乘和判断素数的函数。
+
+```python
+import functools
+import operator
+
+# 用一行代码实现计算阶乘的函数
+fac = lambda n: functools.reduce(operator.mul, range(2, n + 1), 1)
+
+# 用一行代码实现判断素数的函数
+is_prime = lambda x: all(map(lambda f: x % f, range(2, int(x ** 0.5) + 1)))
+
+# 调用Lambda函数
+print(fac(6)) # 720
+print(is_prime(37)) # True
+```
+
+> **提示1**:上面使用的`reduce`函数是 Python 标准库`functools`模块中的函数,它可以实现对一组数据的归约操作,类似于我们之前定义的`calc`函数,第一个参数是代表运算的函数,第二个参数是运算的数据,第三个参数是运算的初始值。很显然,`reduce`函数也是高阶函数,它和`filter`函数、`map`函数一起构成了处理数据中非常关键的三个动作:**过滤**、**映射**和**归约**。
+>
+> **提示2**:上面判断素数的 lambda 函数通过`range`函数构造了从 2 到 $\small{\sqrt{x}}$ 的范围,检查这个范围有没有`x`的因子。`all`函数也是 Python 内置函数,如果传入的序列中所有的布尔值都是`True`,`all`函数返回`True`,否则`all`函数返回`False`。
+
+### 偏函数
+
+偏函数是指固定函数的某些参数,生成一个新的函数,这样就无需在每次调用函数时都传递相同的参数。在 Python 语言中,我们可以使用`functools`模块的`partial`函数来创建偏函数。例如,`int`函数在默认情况下可以将字符串视为十进制整数进行类型转换,如果我们修修改它的`base`参数,就可以定义出三个新函数,分别用于将二进制、八进制、十六进制字符串转换为整数,代码如下所示。
+
+```python
+import functools
+
+int2 = functools.partial(int, base=2)
+int8 = functools.partial(int, base=8)
+int16 = functools.partial(int, base=16)
+
+print(int('1001')) # 1001
+
+print(int2('1001')) # 9
+print(int8('1001')) # 513
+print(int16('1001')) # 4097
+```
+
+不知大家是否注意到,`partial`函数的第一个参数和返回值都是函数,它将传入的函数处理成一个新的函数返回。通过构造偏函数,我们可以结合实际的使用场景将原函数变成使用起来更为便捷的新函数,不知道大家有没有觉得这波操作很有意思。
+
+### 总结
+
+Python 中的函数是一等函数,可以赋值给变量,也可以作为函数的参数和返回值,这也就意味着我们可以在 Python 中使用高阶函数。高阶函数的概念对新手并不友好,但它却带来了函数设计上的灵活性。如果我们要定义的函数非常简单,只有一行代码,而且不需要函数名来复用它,我们可以使用 lambda 函数。
+
diff --git "a/Day01-20/17.\345\207\275\346\225\260\351\253\230\347\272\247\345\272\224\347\224\250.md" "b/Day01-20/17.\345\207\275\346\225\260\351\253\230\347\272\247\345\272\224\347\224\250.md"
new file mode 100755
index 000000000..0a5fbcbb7
--- /dev/null
+++ "b/Day01-20/17.\345\207\275\346\225\260\351\253\230\347\272\247\345\272\224\347\224\250.md"
@@ -0,0 +1,256 @@
+## 函数高级应用
+
+在上一个章节中,我们探索了 Python 中的高阶函数,相信大家对函数的定义和应用有了更深刻的认知。本章我们继续为大家讲解函数相关的知识,一个是 Python 中的特色语法装饰器,一个是函数的递归调用。
+
+### 装饰器
+
+Python 语言中,装饰器是“**用一个函数装饰另外一个函数并为其提供额外的能力**”的语法现象。装饰器本身是一个函数,它的参数是被装饰的函数,它的返回值是一个带有装饰功能的函数。通过前面的描述,相信大家已经听出来了,装饰器是一个高阶函数,它的参数和返回值都是函数。但是,装饰器的概念对编程语言的初学者来说,还是让人头疼的,下面我们先通过一个简单的例子来说明装饰器的作用。假设有名为`downlaod`和`upload`的两个函数,分别用于文件的上传和下载,如下所示。
+
+```python
+import random
+import time
+
+
+def download(filename):
+ """下载文件"""
+ print(f'开始下载{filename}.')
+ time.sleep(random.random() * 6)
+ print(f'{filename}下载完成.')
+
+
+def upload(filename):
+ """上传文件"""
+ print(f'开始上传{filename}.')
+ time.sleep(random.random() * 8)
+ print(f'{filename}上传完成.')
+
+
+download('MySQL从删库到跑路.avi')
+upload('Python从入门到住院.pdf')
+```
+
+> **说明**:上面的代码用休眠一段随机时间的方式模拟了下载和上传文件需要花费一定的时间,并没有真正的联网上传下载文件。用 Python 语言实现联网上传下载文件也非常简单,后面我们会讲到相关的知识。
+
+现在有一个新的需求,我们希望知道调用`download`和`upload`函数上传下载文件到底用了多少时间,这应该如何实现呢?相信很多小伙伴已经想到了,我们可以在函数开始执行的时候记录一个时间,在函数调用结束后记录一个时间,两个时间相减就可以计算出下载或上传的时间,代码如下所示。
+
+```python
+start = time.time()
+download('MySQL从删库到跑路.avi')
+end = time.time()
+print(f'花费时间: {end - start:.2f}秒')
+start = time.time()
+upload('Python从入门到住院.pdf')
+end = time.time()
+print(f'花费时间: {end - start:.2f}秒')
+```
+
+通过上面的代码,我们可以在下载和上传文件时记录下耗费的时间,但不知道大家是否注意到,上面记录时间、计算和显示执行时间的代码都是重复代码。有编程经验的人都知道,**重复的代码是万恶之源**,那么有没有办法在不写重复代码的前提下,用一种简单优雅的方式记录下函数的执行时间呢?在 Python 语言中,装饰器就是解决这类问题的最佳选择。通过装饰器语法,我们可以把跟原来的业务(上传和下载)没有关系计时功能的代码封装到一个函数中,如果`upload`和`download`函数需要记录时间,我们直接把装饰器作用到这两个函数上即可。既然上面提到了,装饰器是一个高阶函数,它的参数和返回值都是函数,我们将记录时间的装饰器姑且命名为`record_time`,那么它的整体结构应该如下面的代码所示。
+
+```python
+def record_time(func):
+
+ def wrapper(*args, **kwargs):
+
+ result = func(*args, **kwargs)
+
+ return result
+
+ return wrapper
+```
+
+相信大家注意到了,`record_time`函数的参数`func`代表了一个被装饰的函数,函数里面定义的`wrapper`函数是带有装饰功能的函数,它会执行被装饰的函数`func`,它还需要返回在最后产生函数执行的返回值。不知大家是否留意到,上面的代码我在第4行和第6行留下了两个空行,这意味着我们可以这些地方添加代码来实现额外的功能。`record_time`函数最终会返回这个带有装饰功能的函数`wrapper`并通过它替代原函数`func`,当原函数`func`被`record_time`函数装饰后,我们调用它时其实调用的是`wrapper`函数,所以才获得了额外的能力。`wrapper`函数的参数比较特殊,由于我们要用`wrapper`替代原函数`func`,但是我们又不清楚原函数`func`会接受哪些参数,所以我们就通过可变参数和关键字参数照单全收,然后在调用`func`的时候,原封不动的全部给它。这里还要强调一下,Python 语言支持函数的嵌套定义,就像上面,我们可以在`record_time`函数中定义`wrapper`函数,这个操作在很多编程语言中并不被支持。
+
+看懂这个结构后,我们就可以把记录时间的功能写到这个装饰器中,代码如下所示。
+
+```python
+import time
+
+
+def record_time(func):
+
+ def wrapper(*args, **kwargs):
+ # 在执行被装饰的函数之前记录开始时间
+ start = time.time()
+ # 执行被装饰的函数并获取返回值
+ result = func(*args, **kwargs)
+ # 在执行被装饰的函数之后记录结束时间
+ end = time.time()
+ # 计算和显示被装饰函数的执行时间
+ print(f'{func.__name__}执行时间: {end - start:.2f}秒')
+ # 返回被装饰函数的返回值
+ return result
+
+ return wrapper
+```
+
+写装饰器虽然颇费周折,但是这是个一劳永逸的骚操作,将来再有记录函数执行时间的需求时,我们只需要添加上面的装饰器即可。使用上面的装饰器函数有两种方式,第一种方式就是直接调用装饰器函数,传入被装饰的函数并获得返回值,我们可以用这个返回值直接替代原来的函数,那么在调用时就已经获得了装饰器提供的额外的能力(记录执行时间),大家试试下面的代码就明白了。
+
+```python
+download = record_time(download)
+upload = record_time(upload)
+download('MySQL从删库到跑路.avi')
+upload('Python从入门到住院.pdf')
+```
+
+在 Python 中,使用装饰器很有更为便捷的**语法糖**(编程语言中添加的某种语法,这种语法对语言的功能没有影响,但是使用更加方法,代码的可读性也更强,我们将其称之为“语法糖”或“糖衣语法”),可以用`@装饰器函数`将装饰器函数直接放在被装饰的函数上,效果跟上面的代码相同。我们把完整的代码为大家罗列出来,大家可以再看看我们是如何定义和使用装饰器的。
+
+```python
+import random
+import time
+
+
+def record_time(func):
+
+ def wrapper(*args, **kwargs):
+ start = time.time()
+ result = func(*args, **kwargs)
+ end = time.time()
+ print(f'{func.__name__}执行时间: {end - start:.2f}秒')
+ return result
+
+ return wrapper
+
+
+@record_time
+def download(filename):
+ print(f'开始下载{filename}.')
+ time.sleep(random.random() * 6)
+ print(f'{filename}下载完成.')
+
+
+@record_time
+def upload(filename):
+ print(f'开始上传{filename}.')
+ time.sleep(random.random() * 8)
+ print(f'{filename}上传完成.')
+
+
+download('MySQL从删库到跑路.avi')
+upload('Python从入门到住院.pdf')
+```
+
+上面的代码,我们通过装饰器语法糖为`download`和`upload`函数添加了装饰器,被装饰后的`download`和`upload`函数其实就是我们在装饰器中返回的`wrapper`函数,调用它们其实就是在调用`wrapper`函数,所以才有了记录函数执行时间的功能。
+
+如果在代码的某些地方,我们想去掉装饰器的作用执行原函数,那么在定义装饰器函数的时候,需要做一点点额外的工作。Python 标准库`functools`模块的`wraps`函数也是一个装饰器,我们将它放在`wrapper`函数上,这个装饰器可以帮我们保留被装饰之前的函数,这样在需要取消装饰器时,可以通过被装饰函数的`__wrapped__`属性获得被装饰之前的函数。
+
+```python
+import random
+import time
+
+from functools import wraps
+
+
+def record_time(func):
+
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ start = time.time()
+ result = func(*args, **kwargs)
+ end = time.time()
+ print(f'{func.__name__}执行时间: {end - start:.2f}秒')
+ return result
+
+ return wrapper
+
+
+@record_time
+def download(filename):
+ print(f'开始下载{filename}.')
+ time.sleep(random.random() * 6)
+ print(f'{filename}下载完成.')
+
+
+@record_time
+def upload(filename):
+ print(f'开始上传{filename}.')
+ time.sleep(random.random() * 8)
+ print(f'{filename}上传完成.')
+
+
+# 调用装饰后的函数会记录执行时间
+download('MySQL从删库到跑路.avi')
+upload('Python从入门到住院.pdf')
+# 取消装饰器的作用不记录执行时间
+download.__wrapped__('MySQL必知必会.pdf')
+upload.__wrapped__('Python从新手到大师.pdf')
+```
+
+**装饰器函数本身也可以参数化**,简单的说就是装饰器也是可以通过调用者传入的参数来进行定制的,这个知识点我们在后面用到的时候再为大家讲解。
+
+### 递归调用
+
+Python 中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。函数自己调用自己称为递归调用,那么递归调用有什么用处呢?现实中,有很多问题的定义本身就是一个递归定义,例如我们之前讲到的阶乘,非负整数`N`的阶乘是`N`乘以`N-1`的阶乘,即 $\small{N! = N \times (N-1)!}$ ,定义的左边和右边都出现了阶乘的概念,所以这是一个递归定义。既然如此,我们可以使用递归调用的方式来写一个求阶乘的函数,代码如下所示。
+
+```python
+def fac(num):
+ if num in (0, 1):
+ return 1
+ return num * fac(num - 1)
+```
+
+上面的代码中,`fac`函数中又调用了`fac`函数,这就是所谓的递归调用。代码第2行的`if`条件叫做递归的收敛条件,简单的说就是什么时候要结束函数的递归调用,在计算阶乘时,如果计算到`0`或`1`的阶乘,就停止递归调用,直接返回`1`;代码第4行的`num * fac(num - 1)`是递归公式,也就是阶乘的递归定义。下面,我们简单的分析下,如果用`fac(5)`计算`5`的阶乘,整个过程会是怎样的。
+
+```python
+# 递归调用函数入栈
+# 5 * fac(4)
+# 5 * (4 * fac(3))
+# 5 * (4 * (3 * fac(2)))
+# 5 * (4 * (3 * (2 * fac(1))))
+# 停止递归函数出栈
+# 5 * (4 * (3 * (2 * 1)))
+# 5 * (4 * (3 * 2))
+# 5 * (4 * 6)
+# 5 * 24
+# 120
+print(fac(5)) # 120
+```
+
+注意,函数调用会通过内存中称为“栈”(stack)的数据结构来保存当前代码的执行现场,函数调用结束后会通过这个栈结构恢复之前的执行现场。栈是一种先进后出的数据结构,这也就意味着最早入栈的函数最后才会返回,而最后入栈的函数会最先返回。例如调用一个名为`a`的函数,函数`a`的执行体中又调用了函数`b`,函数`b`的执行体中又调用了函数`c`,那么最先入栈的函数是`a`,最先出栈的函数是`c`。每进入一个函数调用,栈就会增加一层栈帧(stack frame),栈帧就是我们刚才提到的保存当前代码执行现场的结构;每当函数调用结束后,栈就会减少一层栈帧。通常,内存中的栈空间很小,因此递归调用的次数如果太多,会导致栈溢出(stack overflow),所以**递归调用一定要确保能够快速收敛**。我们可以尝试执行`fac(5000)`,看看是不是会提示`RecursionError`错误,错误消息为:`maximum recursion depth exceeded in comparison`(超出最大递归深度),其实就是发生了栈溢出。
+
+如果我们使用官方的 Python 解释器(CPython),默认将函数调用的栈结构最大深度设置为`1000`层。如果超出这个深度,就会发生上面说的`RecursionError`。当然,我们可以使用`sys`模块的`setrecursionlimit`函数来改变递归调用的最大深度,但是我们不建议这样做,因为让递归快速收敛才是我们应该做的事情,否则就应该考虑使用循环递推而不是递归。
+
+再举一个之前讲过的生成斐波那契数列的例子,因为斐波那契数列前两个数都是`1`,从第三个数开始,每个数是前两个数相加的和,可以记为`f(n) = f(n - 1) + f(n - 2)`,很显然这又是一个递归的定义,所以我们可以用下面的递归调用函数来计算第`n`个斐波那契数。
+
+```python
+def fib1(n):
+ if n in (1, 2):
+ return 1
+ return fib1(n - 1) + fib1(n - 2)
+
+
+for i in range(1, 21):
+ print(fib1(i))
+```
+
+需要提醒大家,上面计算斐波那契数的代码虽然看起来非常简单明了,但执行性能是比较糟糕的。大家可以试一试,把上面代码`for`循环中`range`函数的第二个参数修改为`51`,即输出前50个斐波那契数,看看需要多长时间,也欢迎大家在评论区留下你的代码执行时间。至于为什么这么慢,大家可以自己思考一下原因。很显然,直接使用循环递推的方式获得斐波那契数列是更好的选择,代码如下所示。
+
+```python
+def fib2(n):
+ a, b = 0, 1
+ for _ in range(n):
+ a, b = b, a + b
+ return a
+```
+
+除此以外,我们还可以使用 Python 标准库中`functools`模块的`lru_cache`函数来优化上面的递归代码。`lru_cache`函数是一个装饰器函数,我们将其置于上面的函数`fib1`之上,它可以缓存该函数的执行结果从而避免在递归调用的过程中产生大量的重复运算,这样代码的执行性能就有“飞一般”的提升。大家可以尝试输出前50个斐波那契数,看看加上装饰器以后代码需要执行多长时间,评论区见!
+
+```python
+from functools import lru_cache
+
+
+@lru_cache()
+def fib1(n):
+ if n in (1, 2):
+ return 1
+ return fib1(n - 1) + fib1(n - 2)
+
+
+for i in range(1, 51):
+ print(i, fib1(i))
+```
+
+> **提示**:`lru_cache`函数是一个带参数的装饰器,所以上面第4行代码使用装饰器语法糖时,`lru_cache`后面要跟上圆括号。`lru_cache`函数有一个非常重要的参数叫`maxsize`,它可以用来定义缓存空间的大小,默认值是128。
+
+### 总结
+
+装饰器是 Python 语言中的特色语法,**可以通过装饰器来增强现有的函数**,这是一种非常有用的编程技巧。另一方面,通过函数递归调用,可以在代码层面将一些复杂的问题简单化,但是**递归调用一定要注意收敛条件和递归公式**,找到递归公式才有机会使用递归调用,而收敛条件则确保了递归调用能停下来。函数调用通过内存中的栈空间来保存现场和恢复现场,栈空间通常都很小,所以**递归如果不能迅速收敛,很可能会引发栈溢出错误,从而导致程序的崩溃**。
diff --git "a/Day01-20/18.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\205\245\351\227\250.md" "b/Day01-20/18.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\205\245\351\227\250.md"
new file mode 100755
index 000000000..365fa94a8
--- /dev/null
+++ "b/Day01-20/18.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\205\245\351\227\250.md"
@@ -0,0 +1,207 @@
+## 面向对象编程入门
+
+面向对象编程是一种非常流行的**编程范式**(programming paradigm),所谓编程范式就是**程序设计的方法论**,简单的说就是程序员对程序的认知和理解以及他们编写代码的方式。
+
+在前面的课程中,我们说过“**程序是指令的集合**”,运行程序时,程序中的语句会变成一条或多条指令,然后由CPU(中央处理器)去执行。为了简化程序的设计,我们又讲到了函数,**把相对独立且经常重复使用的代码放置到函数中**,在需要使用这些代码的时候调用函数即可。如果一个函数的功能过于复杂和臃肿,我们又可以进一步**将函数进一步拆分为多个子函数**来降低系统的复杂性。
+
+不知大家是否发现,编程其实是写程序的人按照计算机的工作方式通过代码控制机器完成任务。但是,计算机的工作方式与人类正常的思维模式是不同的,如果编程就必须抛弃人类正常的思维方式去迎合计算机,编程的乐趣就少了很多。这里,我想说的并不是我们不能按照计算机的工作方式去编写代码,但是当我们需要开发一个复杂的系统时,这种方式会让代码过于复杂,从而导致开发和维护工作都变得举步维艰。
+
+随着软件复杂性的增加,编写正确可靠的代码会变成了一项极为艰巨的任务,这也是很多人都坚信“软件开发是人类改造世界所有活动中最为复杂的活动”的原因。如何用程序描述复杂系统和解决复杂问题,就成为了所有程序员必须要思考和直面的问题。诞生于上世纪70年代的 Smalltalk 语言让软件开发者看到了希望,因为它引入了一种新的编程范式叫面向对象编程。在面向对象编程的世界里,程序中的**数据和操作数据的函数是一个逻辑上的整体**,我们称之为**对象**,**对象可以接收消息**,解决问题的方法就是**创建对象并向对象发出各种各样的消息**;通过消息传递,程序中的多个对象可以协同工作,这样就能构造出复杂的系统并解决现实中的问题。当然,面向对象编程的雏形还可以向前追溯到更早期的Simula语言,但这不是我们要讨论的重点。
+
+> **说明:** 今天我们使用的很多高级程序设计语言都支持面向对象编程,但是面向对象编程也不是解决软件开发中所有问题的“银弹”,或者说在软件开发这个行业目前还没有所谓的“银弹”。关于这个问题,大家可以参考 IBM360 系统之父弗雷德里克·布鲁克斯所发表的论文《没有银弹:软件工程的本质性与附属性工作》或软件工程的经典著作《人月神话》一书。
+
+### 类和对象
+
+如果要用一句话来概括面向对象编程,我认为下面的说法是相当精辟和准确的。
+
+> **面向对象编程**:把一组数据和处理数据的方法组成**对象**,把行为相同的对象归纳为**类**,通过**封装**隐藏对象的内部细节,通过**继承**实现类的特化和泛化,通过**多态**实现基于对象类型的动态分派。
+
+这句话对初学者来说可能不那么容易理解,但是我可以先为大家圈出几个关键词:**对象**(object)、**类**(class)、**封装**(encapsulation)、**继承**(inheritance)、**多态**(polymorphism)。
+
+我们先说说类和对象这两个词。在面向对象编程中,**类是一个抽象的概念,对象是一个具体的概念**。我们把同一类对象的共同特征抽取出来就是一个类,比如我们经常说的人类,这是一个抽象概念,而我们每个人就是人类的这个抽象概念下的实实在在的存在,也就是一个对象。简而言之,**类是对象的蓝图和模板,对象是类的实例,是可以接受消息的实体**。
+
+在面向对象编程的世界中,**一切皆为对象**,**对象都有属性和行为**,**每个对象都是独一无二的**,而且**对象一定属于某个类**。对象的属性是对象的静态特征,对象的行为是对象的动态特征。按照上面的说法,如果我们把拥有共同特征的对象的属性和行为都抽取出来,就可以定义出一个类。
+
+
+
+### 定义类
+
+在 Python 语言中,我们可以使用`class`关键字加上类名来定义类,通过缩进我们可以确定类的代码块,就如同定义函数那样。在类的代码块中,我们需要写一些函数,我们说过类是一个抽象概念,那么这些函数就是我们对一类对象共同的动态特征的提取。写在类里面的函数我们通常称之为**方法**,方法就是对象的行为,也就是对象可以接收的消息。方法的第一个参数通常都是`self`,它代表了接收这个消息的对象本身。
+
+```python
+class Student:
+
+ def study(self, course_name):
+ print(f'学生正在学习{course_name}.')
+
+ def play(self):
+ print(f'学生正在玩游戏.')
+```
+
+### 创建和使用对象
+
+在我们定义好一个类之后,可以使用构造器语法来创建对象,代码如下所示。
+
+```python
+stu1 = Student()
+stu2 = Student()
+print(stu1) # <__main__.Student object at 0x10ad5ac50>
+print(stu2) # <__main__.Student object at 0x10ad5acd0>
+print(hex(id(stu1)), hex(id(stu2))) # 0x10ad5ac50 0x10ad5acd0
+```
+
+在类的名字后跟上圆括号就是所谓的构造器语法,上面的代码创建了两个学生对象,一个赋值给变量`stu1`,一个赋值给变量`stu2`。当我们用`print`函数打印`stu1`和`stu2`两个变量时,我们会看到输出了对象在内存中的地址(十六进制形式),跟我们用`id`函数查看对象标识获得的值是相同的。现在我们可以告诉大家,我们定义的变量其实保存的是一个对象在内存中的逻辑地址(位置),通过这个逻辑地址,我们就可以在内存中找到这个对象。所以`stu3 = stu2`这样的赋值语句并没有创建新的对象,只是用一个新的变量保存了已有对象的地址。
+
+接下来,我们尝试给对象发消息,即调用对象的方法。刚才的`Student`类中我们定义了`study`和`play`两个方法,两个方法的第一个参数`self`代表了接收消息的学生对象,`study`方法的第二个参数是学习的课程名称。Python中,给对象发消息有两种方式,请看下面的代码。
+
+```python
+# 通过“类.方法”调用方法
+# 第一个参数是接收消息的对象
+# 第二个参数是学习的课程名称
+Student.study(stu1, 'Python程序设计') # 学生正在学习Python程序设计.
+# 通过“对象.方法”调用方法
+# 点前面的对象就是接收消息的对象
+# 只需要传入第二个参数课程名称
+stu1.study('Python程序设计') # 学生正在学习Python程序设计.
+
+Student.play(stu2) # 学生正在玩游戏.
+stu2.play() # 学生正在玩游戏.
+```
+
+### 初始化方法
+
+大家可能已经注意到了,刚才我们创建的学生对象只有行为没有属性,如果要给学生对象定义属性,我们可以修改`Student`类,为其添加一个名为`__init__`的方法。在我们调用`Student`类的构造器创建对象时,首先会在内存中获得保存学生对象所需的内存空间,然后通过自动执行`__init__`方法,完成对内存的初始化操作,也就是把数据放到内存空间中。所以我们可以通过给`Student`类添加`__init__`方法的方式为学生对象指定属性,同时完成对属性赋初始值的操作,正因如此,`__init__`方法通常也被称为初始化方法。
+
+我们对上面的`Student`类稍作修改,给学生对象添加`name`(姓名)和`age`(年龄)两个属性。
+
+```python
+class Student:
+ """学生"""
+
+ def __init__(self, name, age):
+ """初始化方法"""
+ self.name = name
+ self.age = age
+
+ def study(self, course_name):
+ """学习"""
+ print(f'{self.name}正在学习{course_name}.')
+
+ def play(self):
+ """玩耍"""
+ print(f'{self.name}正在玩游戏.')
+```
+
+修改刚才创建对象和给对象发消息的代码,重新执行一次,看看程序的执行结果有什么变化。
+
+```python
+# 调用Student类的构造器创建对象并传入初始化参数
+stu1 = Student('骆昊', 44)
+stu2 = Student('王大锤', 25)
+stu1.study('Python程序设计') # 骆昊正在学习Python程序设计.
+stu2.play() # 王大锤正在玩游戏.
+```
+
+
+### 面向对象的支柱
+
+面向对象编程有三大支柱,就是我们之前给大家划重点的时候圈出的三个词:**封装**、**继承**和**多态**。后面两个概念在下一节课中会详细说明,这里我们先说一下什么是封装。我自己对封装的理解是:**隐藏一切可以隐藏的实现细节,只向外界暴露简单的调用接口**。我们在类中定义的对象方法其实就是一种封装,这种封装可以让我们在创建对象之后,只需要给对象发送一个消息就可以执行方法中的代码,也就是说我们在只知道方法的名字和参数(方法的外部视图),不知道方法内部实现细节(方法的内部视图)的情况下就完成了对方法的使用。
+
+举一个例子,假如要控制一个机器人帮我倒杯水,如果不使用面向对象编程,不做任何的封装,那么就需要向这个机器人发出一系列的指令,如站起来、向左转、向前走5步、拿起面前的水杯、向后转、向前走10步、弯腰、放下水杯、按下出水按钮、等待10秒、松开出水按钮、拿起水杯、向右转、向前走5步、放下水杯等,才能完成这个简单的操作,想想都觉得麻烦。按照面向对象编程的思想,我们可以将倒水的操作封装到机器人的一个方法中,当需要机器人帮我们倒水的时候,只需要向机器人对象发出倒水的消息就可以了,这样做不是更好吗?
+
+在很多场景下,面向对象编程其实就是一个三步走的问题。第一步定义类,第二步创建对象,第三步给对象发消息。当然,有的时候我们是不需要第一步的,因为我们想用的类可能已经存在了。之前我们说过,Python内置的`list`、`set`、`dict`其实都是类,如果要创建列表、集合、字典对象,我们就不用自定义类了。当然,有的类并不是 Python 标准库中直接提供的,它可能来自于第三方的代码,如何安装和使用三方代码在后续课程中会进行讨论。在某些特殊的场景中,我们会用到名为“内置对象”的对象,所谓“内置对象”就是说上面三步走的第一步和第二步都不需要了,因为类已经存在而且对象已然创建过了,直接向对象发消息就可以了,这也就是我们常说的“开箱即用”。
+
+### 面向对象案例
+
+#### 例子1:时钟
+
+> **要求**:定义一个类描述数字时钟,提供走字和显示时间的功能。
+
+```python
+import time
+
+
+# 定义时钟类
+class Clock:
+ """数字时钟"""
+
+ def __init__(self, hour=0, minute=0, second=0):
+ """初始化方法
+ :param hour: 时
+ :param minute: 分
+ :param second: 秒
+ """
+ self.hour = hour
+ self.min = minute
+ self.sec = second
+
+ def run(self):
+ """走字"""
+ self.sec += 1
+ if self.sec == 60:
+ self.sec = 0
+ self.min += 1
+ if self.min == 60:
+ self.min = 0
+ self.hour += 1
+ if self.hour == 24:
+ self.hour = 0
+
+ def show(self):
+ """显示时间"""
+ return f'{self.hour:0>2d}:{self.min:0>2d}:{self.sec:0>2d}'
+
+
+# 创建时钟对象
+clock = Clock(23, 59, 58)
+while True:
+ # 给时钟对象发消息读取时间
+ print(clock.show())
+ # 休眠1秒钟
+ time.sleep(1)
+ # 给时钟对象发消息使其走字
+ clock.run()
+```
+
+#### 例子2:平面上的点
+
+> **要求**:定义一个类描述平面上的点,提供计算到另一个点距离的方法。
+
+```python
+class Point:
+ """平面上的点"""
+
+ def __init__(self, x=0, y=0):
+ """初始化方法
+ :param x: 横坐标
+ :param y: 纵坐标
+ """
+ self.x, self.y = x, y
+
+ def distance_to(self, other):
+ """计算与另一个点的距离
+ :param other: 另一个点
+ """
+ dx = self.x - other.x
+ dy = self.y - other.y
+ return (dx * dx + dy * dy) ** 0.5
+
+ def __str__(self):
+ return f'({self.x}, {self.y})'
+
+
+p1 = Point(3, 5)
+p2 = Point(6, 9)
+print(p1) # 调用对象的__str__魔法方法
+print(p2)
+print(p1.distance_to(p2))
+```
+
+### 总结
+
+面向对象编程是一种非常流行的编程范式,除此之外还有**指令式编程**、**函数式编程**等编程范式。由于现实世界是由对象构成的,而对象是可以接收消息的实体,所以**面向对象编程更符合人类正常的思维习惯**。类是抽象的,对象是具体的,有了类就能创建对象,有了对象就可以接收消息,这就是面向对象编程的基础。定义类的过程是一个抽象的过程,找到对象公共的属性属于数据抽象,找到对象公共的方法属于行为抽象。抽象的过程是一个仁者见仁智者见智的过程,对同一类对象进行抽象可能会得到不同的结果,如下图所示。
+
+
+
+> **说明:** 本节课的插图来自于 Grady Booc 等撰写的《面向对象分析与设计》一书,该书是讲解面向对象编程的经典著作,有兴趣的读者可以购买和阅读这本书来了解更多的面向对象的相关知识。
+
diff --git "a/Day01-20/19.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\350\277\233\351\230\266.md" "b/Day01-20/19.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\350\277\233\351\230\266.md"
new file mode 100755
index 000000000..c6b540f03
--- /dev/null
+++ "b/Day01-20/19.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\350\277\233\351\230\266.md"
@@ -0,0 +1,191 @@
+## 面向对象编程进阶
+
+前面我们讲解了 Python 面向对象编程的一些基础知识,本节我们继续讨论面向对象编程相关的内容。
+
+### 可见性和属性装饰器
+
+在很多面向对象编程语言中,对象的属性通常会被设置为私有(private)或受保护(protected)的成员,简单的说就是不允许直接访问这些属性;对象的方法通常都是公开的(public),因为公开的方法是对象能够接受的消息,也是对象暴露给外界的调用接口,这就是所谓的访问可见性。在 Python 中,可以通过给对象属性名添加前缀下划线的方式来说明属性的访问可见性,例如,可以用`__name`表示一个私有属性,`_name`表示一个受保护属性,代码如下所示。
+
+```python
+class Student:
+
+ def __init__(self, name, age):
+ self.__name = name
+ self.__age = age
+
+ def study(self, course_name):
+ print(f'{self.__name}正在学习{course_name}.')
+
+
+stu = Student('王大锤', 20)
+stu.study('Python程序设计')
+print(stu.__name) # AttributeError: 'Student' object has no attribute '__name'
+```
+
+上面代码的最后一行会引发`AttributeError`(属性错误)异常,异常消息为:`'Student' object has no attribute '__name'`。由此可见,以`__`开头的属性`__name`相当于是私有的,在类的外面无法直接访问,但是类里面的`study`方法中可以通过`self.__name`访问该属性。需要说明的是,大多数使用 Python 语言的人在定义类时,通常不会选择让对象的属性私有或受保护,正如有一句名言说的:“**We are all consenting adults here**”(大家都是成年人),成年人可以为自己的行为负责,而不需要通过 Python 语言本身来限制访问可见性。事实上,大多数的程序员都认为**开放比封闭要好**,把对象的属性私有化并非必不可少的东西,所以 Python 语言并没有从语义上做出最严格的限定,也就是说上面的代码如果你愿意,用`stu._Student__name`的方式仍然可以访问到私有属性`__name`,有兴趣的读者可以自己试一试。
+
+### 动态属性
+
+Python 语言属于动态语言,维基百科对动态语言的解释是:“在运行时可以改变其结构的语言,例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化”。动态语言非常灵活,目前流行的 Python 和 JavaScript 都是动态语言,除此之外,诸如 PHP、Ruby 等也都属于动态语言,而 C、C++ 等语言则不属于动态语言。
+
+在 Python 中,我们可以动态为对象添加属性,这是 Python 作为动态类型语言的一项特权,代码如下所示。需要提醒大家的是,对象的方法其实本质上也是对象的属性,如果给对象发送一个无法接收的消息,引发的异常仍然是`AttributeError`。
+
+```python
+class Student:
+
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+
+stu = Student('王大锤', 20)
+stu.sex = '男' # 给学生对象动态添加sex属性
+```
+
+如果不希望在使用对象时动态的为对象添加属性,可以使用 Python 语言中的`__slots__`魔法。对于`Student`类来说,可以在类中指定`__slots__ = ('name', 'age')`,这样`Student`类的对象只能有`name`和`age`属性,如果想动态添加其他属性将会引发异常,代码如下所示。
+
+```python
+class Student:
+ __slots__ = ('name', 'age')
+
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+
+stu = Student('王大锤', 20)
+# AttributeError: 'Student' object has no attribute 'sex'
+stu.sex = '男'
+```
+
+### 静态方法和类方法
+
+之前我们在类中定义的方法都是对象方法,换句话说这些方法都是对象可以接收的消息。除了对象方法之外,类中还可以有静态方法和类方法,这两类方法是发给类的消息,二者并没有实质性的区别。在面向对象的世界里,一切皆为对象,我们定义的每一个类其实也是一个对象,而静态方法和类方法就是发送给类对象的消息。那么,什么样的消息会直接发送给类对象呢?
+
+举一个例子,定义一个三角形类,通过传入三条边的长度来构造三角形,并提供计算周长和面积的方法。计算周长和面积肯定是三角形对象的方法,这一点毫无疑问。但是在创建三角形对象时,传入的三条边长未必能构造出三角形,为此我们可以先写一个方法来验证给定的三条边长是否可以构成三角形,这种方法很显然就不是对象方法,因为在调用这个方法时三角形对象还没有创建出来。我们可以把这类方法设计为静态方法或类方法,也就是说这类方法不是发送给三角形对象的消息,而是发送给三角形类的消息,代码如下所示。
+
+```python
+class Triangle(object):
+ """三角形"""
+
+ def __init__(self, a, b, c):
+ """初始化方法"""
+ self.a = a
+ self.b = b
+ self.c = c
+
+ @staticmethod
+ def is_valid(a, b, c):
+ """判断三条边长能否构成三角形(静态方法)"""
+ return a + b > c and b + c > a and a + c > b
+
+ # @classmethod
+ # def is_valid(cls, a, b, c):
+ # """判断三条边长能否构成三角形(类方法)"""
+ # return a + b > c and b + c > a and a + c > b
+
+ def perimeter(self):
+ """计算周长"""
+ return self.a + self.b + self.c
+
+ def area(self):
+ """计算面积"""
+ p = self.perimeter() / 2
+ return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
+```
+
+上面的代码使用`staticmethod`装饰器声明了`is_valid`方法是`Triangle`类的静态方法,如果要声明类方法,可以使用`classmethod`装饰器(如上面的代码15~18行所示)。可以直接使用`类名.方法名`的方式来调用静态方法和类方法,二者的区别在于,类方法的第一个参数是类对象本身,而静态方法则没有这个参数。简单的总结一下,**对象方法、类方法、静态方法都可以通过“类名.方法名”的方式来调用,区别在于方法的第一个参数到底是普通对象还是类对象,还是没有接受消息的对象**。静态方法通常也可以直接写成一个独立的函数,因为它并没有跟特定的对象绑定。
+
+这里做一个补充说明,我们可以给上面计算三角形周长和面积的方法添加一个`property`装饰器(Python 内置类型),这样三角形类的`perimeter`和`area`就变成了两个属性,不再通过调用方法的方式来访问,而是用对象访问属性的方式直接获得,修改后的代码如下所示。
+
+```python
+class Triangle(object):
+ """三角形"""
+
+ def __init__(self, a, b, c):
+ """初始化方法"""
+ self.a = a
+ self.b = b
+ self.c = c
+
+ @staticmethod
+ def is_valid(a, b, c):
+ """判断三条边长能否构成三角形(静态方法)"""
+ return a + b > c and b + c > a and a + c > b
+
+ @property
+ def perimeter(self):
+ """计算周长"""
+ return self.a + self.b + self.c
+
+ @property
+ def area(self):
+ """计算面积"""
+ p = self.perimeter / 2
+ return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
+
+
+t = Triangle(3, 4, 5)
+print(f'周长: {t.perimeter}')
+print(f'面积: {t.area}')
+```
+
+### 继承和多态
+
+面向对象的编程语言支持在已有类的基础上创建新类,从而减少重复代码的编写。提供继承信息的类叫做父类(超类、基类),得到继承信息的类叫做子类(派生类、衍生类)。例如,我们定义一个学生类和一个老师类,我们会发现他们有大量的重复代码,而这些重复代码都是老师和学生作为人的公共属性和行为,所以在这种情况下,我们应该先定义人类,再通过继承,从人类派生出老师类和学生类,代码如下所示。
+
+```python
+class Person:
+ """人"""
+
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+ def eat(self):
+ print(f'{self.name}正在吃饭.')
+
+ def sleep(self):
+ print(f'{self.name}正在睡觉.')
+
+
+class Student(Person):
+ """学生"""
+
+ def __init__(self, name, age):
+ super().__init__(name, age)
+
+ def study(self, course_name):
+ print(f'{self.name}正在学习{course_name}.')
+
+
+class Teacher(Person):
+ """老师"""
+
+ def __init__(self, name, age, title):
+ super().__init__(name, age)
+ self.title = title
+
+ def teach(self, course_name):
+ print(f'{self.name}{self.title}正在讲授{course_name}.')
+
+
+
+stu1 = Student('白元芳', 21)
+stu2 = Student('狄仁杰', 22)
+tea1 = Teacher('武则天', 35, '副教授')
+stu1.eat()
+stu2.sleep()
+tea1.eat()
+stu1.study('Python程序设计')
+tea1.teach('Python程序设计')
+stu2.study('数据科学导论')
+```
+
+继承的语法是在定义类的时候,在类名后的圆括号中指定当前类的父类。如果定义一个类的时候没有指定它的父类是谁,那么默认的父类是`object`类。`object`类是 Python 中的顶级类,这也就意味着所有的类都是它的子类,要么直接继承它,要么间接继承它。Python 语言允许多重继承,也就是说一个类可以有一个或多个父类,关于多重继承的问题我们在后面会有更为详细的讨论。在子类的初始化方法中,我们可以通过`super().__init__()`来调用父类初始化方法,`super`函数是 Python 内置函数中专门为获取当前对象的父类对象而设计的。从上面的代码可以看出,子类除了可以通过继承得到父类提供的属性和方法外,还可以定义自己特有的属性和方法,所以子类比父类拥有的更多的能力。在实际开发中,我们经常会用子类对象去替换掉一个父类对象,这是面向对象编程中一个常见的行为,也叫做“里氏替换原则”(Liskov Substitution Principle)。
+
+子类继承父类的方法后,还可以对方法进行重写(重新实现该方法),不同的子类可以对父类的同一个方法给出不同的实现版本,这样的方法在程序运行时就会表现出多态行为(调用相同的方法,做了不同的事情)。多态是面向对象编程中最精髓的部分,当然也是对初学者来说最难以理解和灵活运用的部分,我们会在下一个章节用专门的例子来讲解这个知识点。
+
+### 总结
+
+Python 是动态类型语言,Python 中的对象可以动态的添加属性,对象的方法其实也是属性,只不过和该属性对应的是一个可以调用的函数。在面向对象的世界中,**一切皆为对象**,我们定义的类也是对象,所以**类也可以接收消息**,对应的方法是类方法或静态方法。通过继承,我们**可以从已有的类创建新类**,实现对已有类代码的复用。
diff --git "a/Day01-20/20.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\272\224\347\224\250.md" "b/Day01-20/20.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\272\224\347\224\250.md"
new file mode 100755
index 000000000..00fa3faae
--- /dev/null
+++ "b/Day01-20/20.\351\235\242\345\220\221\345\257\271\350\261\241\347\274\226\347\250\213\345\272\224\347\224\250.md"
@@ -0,0 +1,228 @@
+## 面向对象编程应用
+
+面向对象编程对初学者来说不难理解但很难应用,虽然我们为大家总结过面向对象的三步走方法(定义类、创建对象、给对象发消息),但是说起来容易做起来难。**大量的编程练习**和**阅读优质的代码**可能是这个阶段最能够帮助到大家的两件事情。接下来我们还是通过经典的案例来剖析面向对象编程的知识,同时也通过这些案例把我们之前学过的 Python 知识都串联起来。
+
+### 例子1:扑克游戏。
+
+> **说明**:简单起见,我们的扑克只有52张牌(没有大小王),游戏需要将 52 张牌发到 4 个玩家的手上,每个玩家手上有 13 张牌,按照黑桃、红心、草花、方块的顺序和点数从小到大排列,暂时不实现其他的功能。
+
+使用面向对象编程方法,首先需要从问题的需求中找到对象并抽象出对应的类,此外还要找到对象的属性和行为。当然,这件事情并不是特别困难,我们可以从需求的描述中找出名词和动词,名词通常就是对象或者是对象的属性,而动词通常是对象的行为。扑克游戏中至少应该有三类对象,分别是牌、扑克和玩家,牌、扑克、玩家三个类也并不是孤立的。类和类之间的关系可以粗略的分为 **is-a关系(继承)**、**has-a关系(关联)**和 **use-a关系(依赖)**。很显然扑克和牌是 has-a 关系,因为一副扑克有(has-a)52 张牌;玩家和牌之间不仅有关联关系还有依赖关系,因为玩家手上有(has-a)牌而且玩家使用了(use-a)牌。
+
+牌的属性显而易见,有花色和点数。我们可以用 0 到 3 的四个数字来代表四种不同的花色,但是这样的代码可读性会非常糟糕,因为我们并不知道黑桃、红心、草花、方块跟 0 到 3 的数字的对应关系。如果一个变量的取值只有有限多个选项,我们可以使用枚举。与 C、Java 等语言不同的是,Python 中没有声明枚举类型的关键字,但是可以通过继承`enum`模块的`Enum`类来创建枚举类型,代码如下所示。
+
+```python
+from enum import Enum
+
+
+class Suite(Enum):
+ """花色(枚举)"""
+ SPADE, HEART, CLUB, DIAMOND = range(4)
+```
+
+通过上面的代码可以看出,定义枚举类型其实就是定义符号常量,如`SPADE`、`HEART`等。每个符号常量都有与之对应的值,这样表示黑桃就可以不用数字 0,而是用`Suite.SPADE`;同理,表示方块可以不用数字 3, 而是用`Suite.DIAMOND`。注意,使用符号常量肯定是优于使用字面常量的,因为能够读懂英文就能理解符号常量的含义,代码的可读性会提升很多。Python 中的枚举类型是可迭代类型,简单的说就是可以将枚举类型放到`for-in`循环中,依次取出每一个符号常量及其对应的值,如下所示。
+
+```python
+for suite in Suite:
+ print(f'{suite}: {suite.value}')
+```
+
+接下来我们可以定义牌类。
+
+```python
+class Card:
+ """牌"""
+
+ def __init__(self, suite, face):
+ self.suite = suite
+ self.face = face
+
+ def __repr__(self):
+ suites = '♠♥♣♦'
+ faces = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
+ return f'{suites[self.suite.value]}{faces[self.face]}' # 返回牌的花色和点数
+```
+
+可以通过下面的代码来测试下`Card`类。
+
+```python
+card1 = Card(Suite.SPADE, 5)
+card2 = Card(Suite.HEART, 13)
+print(card1) # ♠5
+print(card2) # ♥K
+```
+
+接下来我们定义扑克类。
+
+```python
+import random
+
+
+class Poker:
+ """扑克"""
+
+ def __init__(self):
+ self.cards = [Card(suite, face)
+ for suite in Suite
+ for face in range(1, 14)] # 52张牌构成的列表
+ self.current = 0 # 记录发牌位置的属性
+
+ def shuffle(self):
+ """洗牌"""
+ self.current = 0
+ random.shuffle(self.cards) # 通过random模块的shuffle函数实现随机乱序
+
+ def deal(self):
+ """发牌"""
+ card = self.cards[self.current]
+ self.current += 1
+ return card
+
+ @property
+ def has_next(self):
+ """还有没有牌可以发"""
+ return self.current < len(self.cards)
+```
+
+可以通过下面的代码来测试下`Poker`类。
+
+```python
+poker = Poker()
+print(poker.cards) # 洗牌前的牌
+poker.shuffle()
+print(poker.cards) # 洗牌后的牌
+```
+
+定义玩家类。
+
+```python
+class Player:
+ """玩家"""
+
+ def __init__(self, name):
+ self.name = name
+ self.cards = [] # 玩家手上的牌
+
+ def get_one(self, card):
+ """摸牌"""
+ self.cards.append(card)
+
+ def arrange(self):
+ """整理手上的牌"""
+ self.cards.sort()
+```
+
+创建四个玩家并将牌发到玩家的手上。
+
+```python
+poker = Poker()
+poker.shuffle()
+players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
+# 将牌轮流发到每个玩家手上每人13张牌
+for _ in range(13):
+ for player in players:
+ player.get_one(poker.deal())
+# 玩家整理手上的牌输出名字和手牌
+for player in players:
+ player.arrange()
+ print(f'{player.name}: ', end='')
+ print(player.cards)
+```
+
+执行上面的代码会在`player.arrange()`那里出现异常,因为`Player`的`arrange`方法使用了列表的`sort`对玩家手上的牌进行排序,排序需要比较两个`Card`对象的大小,而`<`运算符又不能直接作用于`Card`类型,所以就出现了`TypeError`异常,异常消息为:`'<' not supported between instances of 'Card' and 'Card'`。
+
+为了解决这个问题,我们可以对`Card`类的代码稍作修改,使得两个`Card`对象可以直接用`<`进行大小的比较。这里用到技术叫**运算符重载**,Python 中要实现对`<`运算符的重载,需要在类中添加一个名为`__lt__`的魔术方法。很显然,魔术方法`__lt__`中的`lt`是英文单词“less than”的缩写,以此类推,魔术方法`__gt__`对应`>`运算符,魔术方法`__le__`对应`<=`运算符,`__ge__`对应`>=`运算符,`__eq__`对应`==`运算符,`__ne__`对应`!=`运算符。
+
+修改后的`Card`类代码如下所示。
+
+```python
+class Card:
+ """牌"""
+
+ def __init__(self, suite, face):
+ self.suite = suite
+ self.face = face
+
+ def __repr__(self):
+ suites = '♠♥♣♦'
+ faces = ['', 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
+ return f'{suites[self.suite.value]}{faces[self.face]}'
+
+ def __lt__(self, other):
+ if self.suite == other.suite:
+ return self.face < other.face # 花色相同比较点数的大小
+ return self.suite.value < other.suite.value # 花色不同比较花色对应的值
+```
+
+>**说明:** 大家可以尝试在上面代码的基础上写一个简单的扑克游戏,如 21 点游戏(Black Jack),游戏的规则可以自己在网上找一找。
+
+### 例子2:工资结算系统。
+
+> **要求**:某公司有三种类型的员工,分别是部门经理、程序员和销售员。需要设计一个工资结算系统,根据提供的员工信息来计算员工的月薪。其中,部门经理的月薪是固定 15000 元;程序员按工作时间(以小时为单位)支付月薪,每小时 200 元;销售员的月薪由 1800 元底薪加上销售额 5% 的提成两部分构成。
+
+通过对上述需求的分析,可以看出部门经理、程序员、销售员都是员工,有相同的属性和行为,那么我们可以先设计一个名为`Employee`的父类,再通过继承的方式从这个父类派生出部门经理、程序员和销售员三个子类。很显然,后续的代码不会创建`Employee` 类的对象,因为我们需要的是具体的员工对象,所以这个类可以设计成专门用于继承的抽象类。Python 语言中没有定义抽象类的关键字,但是可以通过`abc`模块中名为`ABCMeta` 的元类来定义抽象类。关于元类的概念此处不展开讲解,当然大家不用纠结,照做即可。
+
+```python
+from abc import ABCMeta, abstractmethod
+
+
+class Employee(metaclass=ABCMeta):
+ """员工"""
+
+ def __init__(self, name):
+ self.name = name
+
+ @abstractmethod
+ def get_salary(self):
+ """结算月薪"""
+ pass
+```
+
+在上面的员工类中,有一个名为`get_salary`的方法用于结算月薪,但是由于还没有确定是哪一类员工,所以结算月薪虽然是员工的公共行为但这里却没有办法实现。对于暂时无法实现的方法,我们可以使用`abstractmethod`装饰器将其声明为抽象方法,所谓**抽象方法就是只有声明没有实现的方法**,**声明这个方法是为了让子类去重写这个方法**。接下来的代码展示了如何从员工类派生出部门经理、程序员、销售员这三个子类以及子类如何重写父类的抽象方法。
+
+```python
+class Manager(Employee):
+ """部门经理"""
+
+ def get_salary(self):
+ return 15000.0
+
+
+class Programmer(Employee):
+ """程序员"""
+
+ def __init__(self, name, working_hour=0):
+ super().__init__(name)
+ self.working_hour = working_hour
+
+ def get_salary(self):
+ return 200 * self.working_hour
+
+
+class Salesman(Employee):
+ """销售员"""
+
+ def __init__(self, name, sales=0):
+ super().__init__(name)
+ self.sales = sales
+
+ def get_salary(self):
+ return 1800 + self.sales * 0.05
+```
+
+上面的`Manager`、`Programmer`、`Salesman`三个类都继承自`Employee`,三个类都分别重写了`get_salary`方法。**重写就是子类对父类已有的方法重新做出实现**。相信大家已经注意到了,三个子类中的`get_salary`各不相同,所以这个方法在程序运行时会产生**多态行为**,多态简单的说就是**调用相同的方法**,**不同的子类对象做不同的事情**。
+
+我们通过下面的代码来完成这个工资结算系统,由于程序员和销售员需要分别录入本月的工作时间和销售额,所以在下面的代码中我们使用了 Python 内置的`isinstance`函数来判断员工对象的类型。我们之前讲过的`type`函数也能识别对象的类型,但是`isinstance`函数更加强大,因为它可以判断出一个对象是不是某个继承结构下的子类型,你可以简单的理解为`type`函数是对对象类型的精准匹配,而`isinstance`函数是对对象类型的模糊匹配。
+
+```python
+emps = [Manager('刘备'), Programmer('诸葛亮'), Manager('曹操'), Programmer('荀彧'), Salesman('张辽')]
+for emp in emps:
+ if isinstance(emp, Programmer):
+ emp.working_hour = int(input(f'请输入{emp.name}本月工作时间: '))
+ elif isinstance(emp, Salesman):
+ emp.sales = float(input(f'请输入{emp.name}本月销售额: '))
+ print(f'{emp.name}本月工资为: ¥{emp.get_salary():.2f}元')
+```
+
+### 总结
+
+面向对象的编程思想非常的好,也符合人类的正常思维习惯,但是要想灵活运用面向对象编程中的抽象、封装、继承、多态需要长时间的积累和沉淀,这件事情无法一蹴而就,因为知识的积累本就是涓滴成河的过程。
diff --git a/Day01-20/res/day01/github_pypl_and_ieee_spectrum.png b/Day01-20/res/day01/github_pypl_and_ieee_spectrum.png
new file mode 100644
index 000000000..37b28343e
Binary files /dev/null and b/Day01-20/res/day01/github_pypl_and_ieee_spectrum.png differ
diff --git a/Day01-20/res/day01/install_python_1.png b/Day01-20/res/day01/install_python_1.png
new file mode 100644
index 000000000..c9048606a
Binary files /dev/null and b/Day01-20/res/day01/install_python_1.png differ
diff --git a/Day01-20/res/day01/install_python_2.png b/Day01-20/res/day01/install_python_2.png
new file mode 100644
index 000000000..df69f6d45
Binary files /dev/null and b/Day01-20/res/day01/install_python_2.png differ
diff --git a/Day01-20/res/day01/install_python_3.png b/Day01-20/res/day01/install_python_3.png
new file mode 100644
index 000000000..384ca3309
Binary files /dev/null and b/Day01-20/res/day01/install_python_3.png differ
diff --git a/Day01-20/res/day01/install_python_4.png b/Day01-20/res/day01/install_python_4.png
new file mode 100644
index 000000000..8904d1495
Binary files /dev/null and b/Day01-20/res/day01/install_python_4.png differ
diff --git a/Day01-20/res/day01/install_python_5.png b/Day01-20/res/day01/install_python_5.png
new file mode 100644
index 000000000..f09d4e7f3
Binary files /dev/null and b/Day01-20/res/day01/install_python_5.png differ
diff --git a/Day01-20/res/day01/install_python_6.png b/Day01-20/res/day01/install_python_6.png
new file mode 100644
index 000000000..31dda3ce8
Binary files /dev/null and b/Day01-20/res/day01/install_python_6.png differ
diff --git a/Day01-20/res/day01/install_python_7.png b/Day01-20/res/day01/install_python_7.png
new file mode 100644
index 000000000..2a9e0e0a0
Binary files /dev/null and b/Day01-20/res/day01/install_python_7.png differ
diff --git a/Day01-20/res/day01/python_download_page_1.png b/Day01-20/res/day01/python_download_page_1.png
new file mode 100644
index 000000000..cf4b99052
Binary files /dev/null and b/Day01-20/res/day01/python_download_page_1.png differ
diff --git a/Day01-20/res/day01/python_download_page_2.png b/Day01-20/res/day01/python_download_page_2.png
new file mode 100644
index 000000000..17c7a8a0e
Binary files /dev/null and b/Day01-20/res/day01/python_download_page_2.png differ
diff --git a/Day01-20/res/day01/tiobe_index.png b/Day01-20/res/day01/tiobe_index.png
new file mode 100644
index 000000000..52ebfef1d
Binary files /dev/null and b/Day01-20/res/day01/tiobe_index.png differ
diff --git a/Day01-20/res/day01/vs_build_tools_download.png b/Day01-20/res/day01/vs_build_tools_download.png
new file mode 100644
index 000000000..ff194f6f0
Binary files /dev/null and b/Day01-20/res/day01/vs_build_tools_download.png differ
diff --git a/Day01-20/res/day01/vs_build_tools_install.png b/Day01-20/res/day01/vs_build_tools_install.png
new file mode 100644
index 000000000..7b58a2b87
Binary files /dev/null and b/Day01-20/res/day01/vs_build_tools_install.png differ
diff --git a/Day01-20/res/day02/pycharm_download_page.png b/Day01-20/res/day02/pycharm_download_page.png
new file mode 100644
index 000000000..d23020b54
Binary files /dev/null and b/Day01-20/res/day02/pycharm_download_page.png differ
diff --git a/Day01-20/res/day02/using_pycharm_1.png b/Day01-20/res/day02/using_pycharm_1.png
new file mode 100644
index 000000000..5866afad3
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_1.png differ
diff --git a/Day01-20/res/day02/using_pycharm_2.png b/Day01-20/res/day02/using_pycharm_2.png
new file mode 100644
index 000000000..e95a84c62
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_2.png differ
diff --git a/Day01-20/res/day02/using_pycharm_3.png b/Day01-20/res/day02/using_pycharm_3.png
new file mode 100644
index 000000000..65b097604
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_3.png differ
diff --git a/Day01-20/res/day02/using_pycharm_4.png b/Day01-20/res/day02/using_pycharm_4.png
new file mode 100644
index 000000000..5d8af92c6
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_4.png differ
diff --git a/Day01-20/res/day02/using_pycharm_5.png b/Day01-20/res/day02/using_pycharm_5.png
new file mode 100644
index 000000000..4ac4165c2
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_5.png differ
diff --git a/Day01-20/res/day02/using_pycharm_6.png b/Day01-20/res/day02/using_pycharm_6.png
new file mode 100644
index 000000000..62f19a6b5
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_6.png differ
diff --git a/Day01-20/res/day02/using_pycharm_7.png b/Day01-20/res/day02/using_pycharm_7.png
new file mode 100644
index 000000000..e204b3aca
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_7.png differ
diff --git a/Day01-20/res/day02/using_pycharm_8.png b/Day01-20/res/day02/using_pycharm_8.png
new file mode 100644
index 000000000..7e7ffcc6d
Binary files /dev/null and b/Day01-20/res/day02/using_pycharm_8.png differ
diff --git a/Day01-20/res/day02/visual_studio_code.png b/Day01-20/res/day02/visual_studio_code.png
new file mode 100644
index 000000000..c8b4df311
Binary files /dev/null and b/Day01-20/res/day02/visual_studio_code.png differ
diff --git a/Day01-20/res/day06/terminate_program.png b/Day01-20/res/day06/terminate_program.png
new file mode 100644
index 000000000..0a98dd339
Binary files /dev/null and b/Day01-20/res/day06/terminate_program.png differ
diff --git a/Day01-20/res/day09/lottery.png b/Day01-20/res/day09/lottery.png
new file mode 100644
index 000000000..011a46e0d
Binary files /dev/null and b/Day01-20/res/day09/lottery.png differ
diff --git a/Day01-20/res/day09/lottery_run_result.png b/Day01-20/res/day09/lottery_run_result.png
new file mode 100644
index 000000000..1258b7879
Binary files /dev/null and b/Day01-20/res/day09/lottery_run_result.png differ
diff --git a/Day01-20/res/day09/output_using_rich.png b/Day01-20/res/day09/output_using_rich.png
new file mode 100644
index 000000000..27f51f9f4
Binary files /dev/null and b/Day01-20/res/day09/output_using_rich.png differ
diff --git a/Day01-20/res/day09/run_pip_in_terminal.png b/Day01-20/res/day09/run_pip_in_terminal.png
new file mode 100644
index 000000000..ab623fed9
Binary files /dev/null and b/Day01-20/res/day09/run_pip_in_terminal.png differ
diff --git a/Day01-20/res/day11/ENIAC.jpg b/Day01-20/res/day11/ENIAC.jpg
new file mode 100644
index 000000000..75c5f42d1
Binary files /dev/null and b/Day01-20/res/day11/ENIAC.jpg differ
diff --git a/Day01-20/res/day12/set_operations.png b/Day01-20/res/day12/set_operations.png
new file mode 100644
index 000000000..0a5acad68
Binary files /dev/null and b/Day01-20/res/day12/set_operations.png differ
diff --git a/Day01-20/res/day13/xinhua_dictionary.jpg b/Day01-20/res/day13/xinhua_dictionary.jpg
new file mode 100644
index 000000000..6ba2479ea
Binary files /dev/null and b/Day01-20/res/day13/xinhua_dictionary.jpg differ
diff --git a/Day01-20/res/day14/function_definition.png b/Day01-20/res/day14/function_definition.png
new file mode 100644
index 000000000..0f44d05bc
Binary files /dev/null and b/Day01-20/res/day14/function_definition.png differ
diff --git a/Day01-20/res/day18/20210731182741.png b/Day01-20/res/day18/20210731182741.png
new file mode 100644
index 000000000..538fa4d86
Binary files /dev/null and b/Day01-20/res/day18/20210731182741.png differ
diff --git a/Day01-20/res/day18/20210731182914.png b/Day01-20/res/day18/20210731182914.png
new file mode 100644
index 000000000..c631e2fa2
Binary files /dev/null and b/Day01-20/res/day18/20210731182914.png differ
diff --git "a/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md" "b/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md"
deleted file mode 100644
index 5d5064629..000000000
--- "a/Day16-20/Python\350\257\255\350\250\200\350\277\233\351\230\266.md"
+++ /dev/null
@@ -1,2 +0,0 @@
-## Python进阶知识
-
diff --git "a/Day21-30/21.\346\226\207\344\273\266\350\257\273\345\206\231\345\222\214\345\274\202\345\270\270\345\244\204\347\220\206.md" "b/Day21-30/21.\346\226\207\344\273\266\350\257\273\345\206\231\345\222\214\345\274\202\345\270\270\345\244\204\347\220\206.md"
new file mode 100755
index 000000000..4d46f941f
--- /dev/null
+++ "b/Day21-30/21.\346\226\207\344\273\266\350\257\273\345\206\231\345\222\214\345\274\202\345\270\270\345\244\204\347\220\206.md"
@@ -0,0 +1,244 @@
+## 文件读写和异常处理
+
+实际开发中常常会遇到对数据进行持久化的场景,所谓持久化是指将数据从无法长久保存数据的存储介质(通常是内存)转移到可以长久保存数据的存储介质(通常是硬盘)中。实现数据持久化最直接简单的方式就是通过**文件系统**将数据保存到**文件**中。
+
+计算机的**文件系统**是一种存储和组织计算机数据的方法,它使得对数据的访问和查找变得容易,文件系统使用**文件**和**树形目录**的抽象逻辑概念代替了硬盘、光盘、闪存等物理设备的数据块概念,用户使用文件系统来保存数据时,不必关心数据实际保存在硬盘的哪个数据块上,只需要记住这个文件的路径和文件名。在写入新数据之前,用户不必关心硬盘上的哪个数据块没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
+
+### 打开和关闭文件
+
+有了文件系统,我们可以非常方便的通过文件来读写数据;在Python中要实现文件操作是非常简单的。我们可以使用Python内置的`open`函数来打开文件,在使用`open`函数时,我们可以通过函数的参数指定**文件名**、**操作模式**和**字符编码**等信息,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件或二进制文件)以及做什么样的操作(读、写或追加),具体如下表所示。
+
+| 操作模式 | 具体含义 |
+| -------- | -------------------------------- |
+| `'r'` | 读取 (默认) |
+| `'w'` | 写入(会先截断之前的内容) |
+| `'x'` | 写入,如果文件已经存在会产生异常 |
+| `'a'` | 追加,将内容写入到已有文件的末尾 |
+| `'b'` | 二进制模式 |
+| `'t'` | 文本模式(默认) |
+| `'+'` | 更新(既可以读又可以写) |
+
+下图展示了如何根据程序的需要来设置`open`函数的操作模式。
+
+
+
+在使用`open`函数时,如果打开的文件是字符文件(文本文件),可以通过`encoding`参数来指定读写文件使用的字符编码。如果对字符编码和字符集这些概念不了解,可以看看[《字符集和字符编码》](https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html)一文,此处不再进行赘述。
+
+使用`open`函数打开文件成功后会返回一个文件对象,通过这个对象,我们就可以实现对文件的读写操作;如果打开文件失败,`open`函数会引发异常,稍后会对此加以说明。如果要关闭打开的文件,可以使用文件对象的`close`方法,这样可以在结束文件操作时释放掉这个文件。
+
+### 读写文本文件
+
+用`open`函数打开文本文件时,需要指定文件名并将文件的操作模式设置为`'r'`,如果不指定,默认值也是`'r'`;如果需要指定字符编码,可以传入`encoding`参数,如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码。需要提醒大家,如果不能保证保存文件时使用的编码方式与`encoding`参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取文件失败。
+
+下面的例子演示了如何读取一个纯文本文件(一般指只有字符原生编码构成的文件,与富文本相比,纯文本不包含字符样式的控制元素,能够被最简单的文本编辑器直接读取)。
+
+```python
+file = open('致橡树.txt', 'r', encoding='utf-8')
+print(file.read())
+file.close()
+```
+
+> **说明**:[《致橡树》](http://www.china.org.cn/learning_english/2011-02/21/content_21967654.htm)是舒婷老师在1977年3月创建的爱情诗,也是我最喜欢的现代诗之一。
+
+除了使用文件对象的`read`方法读取文件之外,还可以使用`for-in`循环逐行读取或者用`readlines`方法将文件按行读取到一个列表容器中,代码如下所示。
+
+```python
+file = open('致橡树.txt', 'r', encoding='utf-8')
+for line in file:
+ print(line, end='')
+file.close()
+
+file = open('致橡树.txt', 'r', encoding='utf-8')
+lines = file.readlines()
+for line in lines:
+ print(line, end='')
+file.close()
+```
+
+如果要向文件中写入内容,可以在打开文件时使用`w`或者`a`作为操作模式,前者会截断之前的文本内容写入新的内容,后者是在原来内容的尾部追加新的内容。
+
+```python
+file = open('致橡树.txt', 'a', encoding='utf-8')
+file.write('\n标题:《致橡树》')
+file.write('\n作者:舒婷')
+file.write('\n时间:1977年3月')
+file.close()
+```
+
+### 异常处理机制
+
+请注意上面的代码,如果`open`函数指定的文件并不存在或者无法打开,那么将引发异常状况导致程序崩溃。为了让代码具有健壮性和容错性,我们可以**使用Python的异常机制对可能在运行时发生状况的代码进行适当的处理**。Python中和异常相关的关键字有五个,分别是`try`、`except`、`else`、`finally`和`raise`,我们先看看下面的代码,再来为大家介绍这些关键字的用法。
+
+```python
+file = None
+try:
+ file = open('致橡树.txt', 'r', encoding='utf-8')
+ print(file.read())
+except FileNotFoundError:
+ print('无法打开指定的文件!')
+except LookupError:
+ print('指定了未知的编码!')
+except UnicodeDecodeError:
+ print('读取文件时解码错误!')
+finally:
+ if file:
+ file.close()
+```
+
+在Python中,我们可以将运行时会出现状况的代码放在`try`代码块中,在`try`后面可以跟上一个或多个`except`块来捕获异常并进行相应的处理。例如,在上面的代码中,文件找不到会引发`FileNotFoundError`,指定了未知的编码会引发`LookupError`,而如果读取文件时无法按指定编码方式解码文件会引发`UnicodeDecodeError`,所以我们在`try`后面跟上了三个`except`分别处理这三种不同的异常状况。在`except`后面,我们还可以加上`else`代码块,这是`try` 中的代码没有出现异常时会执行的代码,而且`else`中的代码不会再进行异常捕获,也就是说如果遇到异常状况,程序会因异常而终止并报告异常信息。最后我们使用`finally`代码块来关闭打开的文件,释放掉程序中获取的外部资源。由于`finally`块的代码不论程序正常还是异常都会执行,甚至是调用了`sys`模块的`exit`函数终止Python程序,`finally`块中的代码仍然会被执行(因为`exit`函数的本质是引发了`SystemExit`异常),因此我们把`finally`代码块称为“总是执行代码块”,它最适合用来做释放外部资源的操作。
+
+Python中内置了大量的异常类型,除了上面代码中用到的异常类型以及之前的课程中遇到过的异常类型外,还有许多的异常类型,其继承结构如下所示。
+
+```
+BaseException
+ +-- SystemExit
+ +-- KeyboardInterrupt
+ +-- GeneratorExit
+ +-- Exception
+ +-- StopIteration
+ +-- StopAsyncIteration
+ +-- ArithmeticError
+ | +-- FloatingPointError
+ | +-- OverflowError
+ | +-- ZeroDivisionError
+ +-- AssertionError
+ +-- AttributeError
+ +-- BufferError
+ +-- EOFError
+ +-- ImportError
+ | +-- ModuleNotFoundError
+ +-- LookupError
+ | +-- IndexError
+ | +-- KeyError
+ +-- MemoryError
+ +-- NameError
+ | +-- UnboundLocalError
+ +-- OSError
+ | +-- BlockingIOError
+ | +-- ChildProcessError
+ | +-- ConnectionError
+ | | +-- BrokenPipeError
+ | | +-- ConnectionAbortedError
+ | | +-- ConnectionRefusedError
+ | | +-- ConnectionResetError
+ | +-- FileExistsError
+ | +-- FileNotFoundError
+ | +-- InterruptedError
+ | +-- IsADirectoryError
+ | +-- NotADirectoryError
+ | +-- PermissionError
+ | +-- ProcessLookupError
+ | +-- TimeoutError
+ +-- ReferenceError
+ +-- RuntimeError
+ | +-- NotImplementedError
+ | +-- RecursionError
+ +-- SyntaxError
+ | +-- IndentationError
+ | +-- TabError
+ +-- SystemError
+ +-- TypeError
+ +-- ValueError
+ | +-- UnicodeError
+ | +-- UnicodeDecodeError
+ | +-- UnicodeEncodeError
+ | +-- UnicodeTranslateError
+ +-- Warning
+ +-- DeprecationWarning
+ +-- PendingDeprecationWarning
+ +-- RuntimeWarning
+ +-- SyntaxWarning
+ +-- UserWarning
+ +-- FutureWarning
+ +-- ImportWarning
+ +-- UnicodeWarning
+ +-- BytesWarning
+ +-- ResourceWarning
+```
+
+从上面的继承结构可以看出,Python中所有的异常都是`BaseException`的子类型,它有四个直接的子类,分别是:`SystemExit`、`KeyboardInterrupt`、`GeneratorExit`和`Exception`。其中,`SystemExit`表示解释器请求退出,`KeyboardInterrupt`是用户中断程序执行(按下`Ctrl+c`),`GeneratorExit`表示生成器发生异常通知退出,不理解这些异常没有关系,继续学习就好了。值得一提的是`Exception`类,它是常规异常类型的父类型,很多的异常都是直接或间接的继承自`Exception`类。如果Python内置的异常类型不能满足应用程序的需要,我们可以自定义异常类型,而自定义的异常类型也应该直接或间接继承自`Exception`类,当然还可以根据需要重写或添加方法。
+
+在Python中,可以使用`raise`关键字来引发异常(抛出异常对象),而调用者可以通过`try...except...`结构来捕获并处理异常。例如在函数中,当函数的执行条件不满足时,可以使用抛出异常的方式来告知调用者问题的所在,而调用者可以通过捕获处理异常来使得代码从异常中恢复,定义异常和抛出异常的代码如下所示。
+
+```python
+class InputError(ValueError):
+ """自定义异常类型"""
+ pass
+
+
+def fac(num):
+ """求阶乘"""
+ if num < 0:
+ raise InputError('只能计算非负整数的阶乘')
+ if num in (0, 1):
+ return 1
+ return num * fac(num - 1)
+```
+
+调用求阶乘的函数`fac`,通过`try...except...`结构捕获输入错误的异常并打印异常对象(显示异常信息),如果输入正确就计算阶乘并结束程序。
+
+```python
+flag = True
+while flag:
+ num = int(input('n = '))
+ try:
+ print(f'{num}! = {fac(num)}')
+ flag = False
+ except InputError as err:
+ print(err)
+```
+
+### 上下文管理器语法
+
+对于`open`函数返回的文件对象,还可以使用`with`上下文管理器语法在文件操作完成后自动执行文件对象的`close`方法,这样可以让代码变得更加简单优雅,因为不需要再写`finally`代码块来执行关闭文件释放资源的操作。需要提醒大家的是,并不是所有的对象都可以放在`with`上下文语法中,只有符合**上下文管理器协议**(有`__enter__`和`__exit__`魔术方法)的对象才能使用这种语法,Python标准库中的`contextlib`模块也提供了对`with`上下文语法的支持,后面再为大家进行讲解。
+
+用`with`上下文语法改写后的代码如下所示。
+
+```python
+try:
+ with open('致橡树.txt', 'r', encoding='utf-8') as file:
+ print(file.read())
+except FileNotFoundError:
+ print('无法打开指定的文件!')
+except LookupError:
+ print('指定了未知的编码!')
+except UnicodeDecodeError:
+ print('读取文件时解码错误!')
+```
+
+### 读写二进制文件
+
+读写二进制文件跟读写文本文件的操作类似,但是需要注意,在使用`open`函数打开文件时,如果要进行读操作,操作模式是`'rb'`,如果要进行写操作,操作模式是`'wb'`。还有一点,读写文本文件时,`read`方法的返回值以及`write`方法的参数是`str`对象(字符串),而读写二进制文件时,`read`方法的返回值以及`write`方法的参数是`bytes-like`对象(字节串)。下面的代码实现了将当前路径下名为`guido.jpg`的图片文件复制到`吉多.jpg`文件中的操作。
+
+```python
+try:
+ with open('guido.jpg', 'rb') as file1:
+ data = file1.read()
+ with open('吉多.jpg', 'wb') as file2:
+ file2.write(data)
+except FileNotFoundError:
+ print('指定的文件无法打开.')
+except IOError:
+ print('读写文件时出现错误.')
+print('程序执行结束.')
+```
+
+如果要复制的图片文件很大,一次将文件内容直接读入内存中可能会造成非常大的内存开销,为了减少对内存的占用,可以为`read`方法传入`size`参数来指定每次读取的字节数,通过循环读取和写入的方式来完成上面的操作,代码如下所示。
+
+```python
+try:
+ with open('guido.jpg', 'rb') as file1, open('吉多.jpg', 'wb') as file2:
+ data = file1.read(512)
+ while data:
+ file2.write(data)
+ data = file1.read()
+except FileNotFoundError:
+ print('指定的文件无法打开.')
+except IOError:
+ print('读写文件时出现错误.')
+print('程序执行结束.')
+```
+
+### 总结
+
+通过读写文件的操作,我们可以实现数据持久化。在Python中可以通过`open`函数来获得文件对象,可以通过文件对象的`read`和`write`方法实现文件读写操作。程序在运行时可能遭遇无法预料的异常状况,可以使用Python的异常机制来处理这些状况。Python的异常机制主要包括`try`、`except`、`else`、`finally`和`raise`这五个核心关键字。`try`后面的`except`语句不是必须的,`finally`语句也不是必须的,但是二者必须要有一个;`except`语句可以有一个或多个,多个`except`会按照书写的顺序依次匹配指定的异常,如果异常已经处理就不会再进入后续的`except`语句;`except`语句中还可以通过元组同时指定多个异常类型进行捕获;`except`语句后面如果不指定异常类型,则默认捕获所有异常;捕获异常后可以使用`raise`要再次抛出,但是不建议捕获并抛出同一个异常;不建议在不清楚逻辑的情况下捕获所有异常,这可能会掩盖程序中严重的问题。最后强调一点,**不要使用异常机制来处理正常业务逻辑或控制程序流程**,简单的说就是不要滥用异常机制,这是初学者常犯的错误。
diff --git "a/Day21-30/22.\345\257\271\350\261\241\347\232\204\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md" "b/Day21-30/22.\345\257\271\350\261\241\347\232\204\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md"
new file mode 100755
index 000000000..39658ec7b
--- /dev/null
+++ "b/Day21-30/22.\345\257\271\350\261\241\347\232\204\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md"
@@ -0,0 +1,239 @@
+## 对象的序列化和反序列化
+
+###JSON概述
+
+通过上面的讲解,我们已经知道如何将文本数据和二进制数据保存到文件中,那么这里还有一个问题,如果希望把一个列表或者一个字典中的数据保存到文件中又该怎么做呢?在Python中,我们可以将程序中的数据以JSON格式进行保存。JSON是“JavaScript Object Notation”的缩写,它本来是JavaScript语言中创建对象的一种字面量语法,现在已经被广泛的应用于跨语言跨平台的数据交换。使用JSON的原因非常简单,因为它结构紧凑而且是纯文本,任何操作系统和编程语言都能处理纯文本,这就是**实现跨语言跨平台数据交换**的前提条件。目前JSON基本上已经取代了XML(可扩展标记语言)作为**异构系统间交换数据的事实标准**。可以在[JSON的官方网站](https://www.json.org/json-zh.html)找到更多关于JSON的知识,这个网站还提供了每种语言处理JSON数据格式可以使用的工具或三方库。
+
+```JavaScript
+{
+ name: "骆昊",
+ age: 40,
+ friends: ["王大锤", "白元芳"],
+ cars: [
+ {"brand": "BMW", "max_speed": 240},
+ {"brand": "Benz", "max_speed": 280},
+ {"brand": "Audi", "max_speed": 280}
+ ]
+}
+```
+
+上面是JSON的一个简单例子,大家可能已经注意到了,它跟Python中的字典非常类似而且支持嵌套结构,就好比Python字典中的值可以是另一个字典。我们可以尝试把下面的代码输入浏览器的控制台(对于Chrome浏览器,可以通过“更多工具”菜单找到“开发者工具”子菜单,就可以打开浏览器的控制台),浏览器的控制台提供了一个运行JavaScript代码的交互式环境(类似于Python的交互式环境),下面的代码会帮我们创建出一个JavaScript的对象,我们将其赋值给名为`obj`的变量。
+
+```JavaScript
+let obj = {
+ name: "骆昊",
+ age: 40,
+ friends: ["王大锤", "白元芳"],
+ cars: [
+ {"brand": "BMW", "max_speed": 240},
+ {"brand": "Benz", "max_speed": 280},
+ {"brand": "Audi", "max_speed": 280}
+ ]
+}
+```
+
+
+
+上面的`obj`就是JavaScript中的一个对象,我们可以通过`obj.name`或`obj["name"]`两种方式获取到`name`对应的值,如下图所示。可以注意到,`obj["name"]`这种获取数据的方式跟Python字典通过键获取值的索引操作是完全一致的,而Python中也通过名为`json`的模块提供了字典与JSON双向转换的支持。
+
+
+
+我们在JSON中使用的数据类型(JavaScript数据类型)和Python中的数据类型也是很容易找到对应关系的,大家可以看看下面的两张表。
+
+表1:JavaScript数据类型(值)对应的Python数据类型(值)
+
+| JSON | Python |
+| ------------ | ------------ |
+| `object` |`dict`|
+| `array` |`list`|
+| `string` | `str` |
+| `number ` |`int` / `float`|
+| `number` (real) |`float`|
+| `boolean` (`true` / `false`) | `bool` (`True` / `False`) |
+| `null` | `None` |
+
+表2:Python数据类型(值)对应的JavaScript数据类型(值)
+
+| Python | JSON |
+| --------------------------- | ---------------------------- |
+| `dict` | `object` |
+| `list` / `tuple` | `array` |
+| `str` | `string` |
+| `int` / `float` | `number` |
+| `bool` (`True` / `False`) | `boolean` (`true` / `false`) |
+| `None` | `null` |
+
+### 读写JSON格式的数据
+
+在Python中,如果要将字典处理成JSON格式(以字符串形式存在),可以使用`json`模块的`dumps`函数,代码如下所示。
+
+```python
+import json
+
+my_dict = {
+ 'name': '骆昊',
+ 'age': 40,
+ 'friends': ['王大锤', '白元芳'],
+ 'cars': [
+ {'brand': 'BMW', 'max_speed': 240},
+ {'brand': 'Audi', 'max_speed': 280},
+ {'brand': 'Benz', 'max_speed': 280}
+ ]
+}
+print(json.dumps(my_dict))
+```
+
+运行上面的代码,输出如下所示,可以注意到中文字符都是用Unicode编码显示的。
+
+```JSON
+{"name": "\u9a86\u660a", "age": 40, "friends": ["\u738b\u5927\u9524", "\u767d\u5143\u82b3"], "cars": [{"brand": "BMW", "max_speed": 240}, {"brand": "Audi", "max_speed": 280}, {"brand": "Benz", "max_speed": 280}]}
+```
+
+如果要将字典处理成JSON格式并写入文本文件,只需要将`dumps`函数换成`dump`函数并传入文件对象即可,代码如下所示。
+
+```python
+import json
+
+my_dict = {
+ 'name': '骆昊',
+ 'age': 40,
+ 'friends': ['王大锤', '白元芳'],
+ 'cars': [
+ {'brand': 'BMW', 'max_speed': 240},
+ {'brand': 'Audi', 'max_speed': 280},
+ {'brand': 'Benz', 'max_speed': 280}
+ ]
+}
+with open('data.json', 'w') as file:
+ json.dump(my_dict, file)
+```
+
+执行上面的代码,会创建`data.json`文件,文件的内容跟上面代码的输出是一样的。
+
+`json`模块有四个比较重要的函数,分别是:
+
+- `dump` - 将Python对象按照JSON格式序列化到文件中
+- `dumps` - 将Python对象处理成JSON格式的字符串
+- `load` - 将文件中的JSON数据反序列化成对象
+- `loads` - 将字符串的内容反序列化成Python对象
+
+这里出现了两个概念,一个叫序列化,一个叫反序列化,[维基百科](https://zh.wikipedia.org/)上的解释是:“序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)”。
+
+我们可以通过下面的代码,读取上面创建的`data.json`文件,将JSON格式的数据还原成Python中的字典。
+
+```python
+import json
+
+with open('data.json', 'r') as file:
+ my_dict = json.load(file)
+ print(type(my_dict))
+ print(my_dict)
+```
+
+### 包管理工具pip
+
+Python标准库中的`json`模块在数据序列化和反序列化时性能并不是非常理想,为了解决这个问题,可以使用三方库`ujson`来替换`json`。所谓三方库,是指非公司内部开发和使用的,也不是来自于官方标准库的Python模块,这些模块通常由其他公司、组织或个人开发,所以被称为三方库。虽然Python语言的标准库虽然已经提供了诸多模块来方便我们的开发,但是对于一个强大的语言来说,它的生态圈一定也是非常繁荣的。
+
+之前安装Python解释器时,默认情况下已经勾选了安装pip,大家可以在命令提示符或终端中通过`pip --version`来确定是否已经拥有了pip。pip是Python的包管理工具,通过pip可以查找、安装、卸载、更新Python的三方库或工具,macOS和Linux系统应该使用pip3。例如要安装替代`json`模块的`ujson`,可以使用下面的命令。
+
+```Bash
+pip install ujson
+```
+
+在默认情况下,pip会访问`https://pypi.org/simple/`来获得三方库相关的数据,但是国内访问这个网站的速度并不是十分理想,因此国内用户可以使用豆瓣网提供的镜像来替代这个默认的下载源,操作如下所示。
+
+```Bash
+pip install ujson
+```
+
+可以通过`pip search`命令根据名字查找需要的三方库,可以通过`pip list`命令来查看已经安装过的三方库。如果想更新某个三方库,可以使用`pip install -U`或`pip install --upgrade`;如果要删除某个三方库,可以使用`pip uninstall`命令。
+
+搜索`ujson`三方库。
+
+```Bash
+pip search ujson
+
+micropython-cpython-ujson (0.2) - MicroPython module ujson ported to CPython
+pycopy-cpython-ujson (0.2) - Pycopy module ujson ported to CPython
+ujson (3.0.0) - Ultra fast JSON encoder and decoder for Python
+ujson-bedframe (1.33.0) - Ultra fast JSON encoder and decoder for Python
+ujson-segfault (2.1.57) - Ultra fast JSON encoder and decoder for Python. Continuing
+ development.
+ujson-ia (2.1.1) - Ultra fast JSON encoder and decoder for Python (Internet
+ Archive fork)
+ujson-x (1.37) - Ultra fast JSON encoder and decoder for Python
+ujson-x-legacy (1.35.1) - Ultra fast JSON encoder and decoder for Python
+drf_ujson (1.2) - Django Rest Framework UJSON Renderer
+drf-ujson2 (1.6.1) - Django Rest Framework UJSON Renderer
+ujsonDB (0.1.0) - A lightweight and simple database using ujson.
+fast-json (0.3.2) - Combines best parts of json and ujson for fast serialization
+decimal-monkeypatch (0.4.3) - Python 2 performance patches: decimal to cdecimal, json to
+ ujson for psycopg2
+```
+
+查看已经安装的三方库。
+
+```Bash
+pip list
+
+Package Version
+----------------------------- ----------
+aiohttp 3.5.4
+alipay 0.7.4
+altgraph 0.16.1
+amqp 2.4.2
+... ...
+```
+
+更新`ujson`三方库。
+
+```Bash
+pip install -U ujson
+```
+
+删除`ujson`三方库。
+
+```Bash
+pip uninstall -y ujson
+```
+
+> **提示**:如果要更新`pip`自身,对于macOS系统来说,可以使用命令`pip install -U pip`。在Windows系统上,可以将命令替换为`python -m pip install -U --user pip`。
+
+### 使用网络API获取数据
+
+如果想在我们自己的程序中显示天气、路况、航班等信息,这些信息我们自己没有能力提供,所以必须使用网络数据服务。目前绝大多数的网络数据服务(或称之为网络API)都是基于[HTTP](https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE)或HTTPS提供JSON格式的数据,我们可以通过Python程序发送HTTP请求给指定的URL(统一资源定位符),这个URL就是所谓的网络API,如果请求成功,它会返回HTTP响应,而HTTP响应的消息体中就有我们需要的JSON格式的数据。关于HTTP的相关知识,可以看看阮一峰的[《HTTP协议入门》](http://www.ruanyifeng.com/blog/2016/08/http.html)一文。
+
+国内有很多提供网络API接口的网站,例如[聚合数据](https://www.juhe.cn/)、[阿凡达数据](http://www.avatardata.cn/)等,这些网站上有免费的和付费的数据接口,国外的[{API}Search](http://apis.io/)网站也提供了类似的功能,有兴趣的可以自行研究。下面的例子演示了如何使用[`requests`](http://docs.python-requests.org/zh_CN/latest/)库(基于HTTP进行网络资源访问的三方库)访问网络API获取国内新闻并显示新闻标题和链接。在这个例子中,我们使用了名为[天行数据](https://www.tianapi.com/)的网站提供的国内新闻数据接口,其中的APIKey需要自己到网站上注册申请。在天行数据网站注册账号后会自动分配APIKey,但是要访问接口获取数据,需要绑定验证邮箱或手机,然后还要申请需要使用的接口,如下图所示。
+
+
+
+Python通过URL接入网络,我们推荐大家使用`requests`三方库,它简单且强大,但需要自行安装。
+
+```Bash
+pip install requests
+```
+
+获取国内新闻并显示新闻标题和链接。
+
+```python
+import requests
+
+resp = requests.get('http://api.tianapi.com/guonei/?key=APIKey&num=10')
+if resp.status_code == 200:
+ data_model = resp.json()
+ for news in data_model['newslist']:
+ print(news['title'])
+ print(news['url'])
+ print('-' * 60)
+```
+
+上面的代码通过`requests`模块的`get`函数向天行数据的国内新闻接口发起了一次请求,如果请求过程没有出现问题,`get`函数会返回一个`Response`对象,通过该对象的`status_code`属性表示HTTP响应状态码,如果不理解没关系,你只需要关注它的值,如果值等于`200`或者其他`2`字头的值,那么我们的请求是成功的。通过`Response`对象的`json()`方法可以将返回的JSON格式的数据直接处理成Python字典,非常方便。天行数据国内新闻接口返回的JSON格式的数据(部分)如下图所示。
+
+
+
+> **提示**:上面代码中的APIKey需要换成自己在天行数据网站申请的APIKey。天行数据网站上还有提供了很多非常有意思的API接口,例如:垃圾分类、周公解梦等,大家可以仿照上面的代码来调用这些接口。每个接口都有对应的接口文档,文档中有关于如何使用接口的详细说明。
+
+### 总结
+
+Python中实现序列化和反序列化除了使用`json`模块之外,还可以使用`pickle`和`shelve`模块,但是这两个模块是使用特有的序列化协议来序列化数据,因此序列化后的数据只能被Python识别,关于这两个模块的相关知识,有兴趣的读者可以自己查找网络上的资料。处理JSON格式的数据很显然是程序员必须掌握的一项技能,因为不管是访问网络API接口还是提供网络API接口给他人使用,都需要具备处理JSON格式数据的相关知识。
+
diff --git "a/Day21-30/23.Python\350\257\273\345\206\231CSV\346\226\207\344\273\266.md" "b/Day21-30/23.Python\350\257\273\345\206\231CSV\346\226\207\344\273\266.md"
new file mode 100755
index 000000000..ce639830c
--- /dev/null
+++ "b/Day21-30/23.Python\350\257\273\345\206\231CSV\346\226\207\344\273\266.md"
@@ -0,0 +1,82 @@
+## Python读写CSV文件
+
+### CSV文件介绍
+
+CSV(Comma Separated Values)全称逗号分隔值文件是一种简单、通用的文件格式,被广泛的应用于应用程序(数据库、电子表格等)数据的导入和导出以及异构系统之间的数据交换。因为CSV是纯文本文件,不管是什么操作系统和编程语言都是可以处理纯文本的,而且很多编程语言中都提供了对读写CSV文件的支持,因此CSV格式在数据处理和数据科学中被广泛应用。
+
+CSV文件有以下特点:
+
+1. 纯文本,使用某种字符集(如[ASCII](https://zh.wikipedia.org/wiki/ASCII)、[Unicode](https://zh.wikipedia.org/wiki/Unicode)、[GB2312](https://zh.wikipedia.org/wiki/GB2312))等);
+2. 由一条条的记录组成(典型的是每行一条记录);
+3. 每条记录被分隔符(如逗号、分号、制表符等)分隔为字段(列);
+4. 每条记录都有同样的字段序列。
+
+CSV文件可以使用文本编辑器或类似于Excel电子表格这类工具打开和编辑,当使用Excel这类电子表格打开CSV文件时,你甚至感觉不到CSV和Excel文件的区别。很多数据库系统都支持将数据导出到CSV文件中,当然也支持从CSV文件中读入数据保存到数据库中,这些内容并不是现在要讨论的重点。
+
+### 将数据写入CSV文件
+
+现有五个学生三门课程的考试成绩需要保存到一个CSV文件中,要达成这个目标,可以使用Python标准库中的`csv`模块,该模块的`writer`函数会返回一个`csvwriter`对象,通过该对象的`writerow`或`writerows`方法就可以将数据写入到CSV文件中,具体的代码如下所示。
+
+```python
+import csv
+import random
+
+with open('scores.csv', 'w') as file:
+ writer = csv.writer(file)
+ writer.writerow(['姓名', '语文', '数学', '英语'])
+ names = ['关羽', '张飞', '赵云', '马超', '黄忠']
+ for name in names:
+ scores = [random.randrange(50, 101) for _ in range(3)]
+ scores.insert(0, name)
+ writer.writerow(scores)
+```
+
+生成的CSV文件的内容。
+
+```
+姓名,语文,数学,英语
+关羽,98,86,61
+张飞,86,58,80
+赵云,95,73,70
+马超,83,97,55
+黄忠,61,54,87
+```
+
+需要说明的是上面的`writer`函数,除了传入要写入数据的文件对象外,还可以`dialect`参数,它表示CSV文件的方言,默认值是`excel`。除此之外,还可以通过`delimiter`、`quotechar`、`quoting`参数来指定分隔符(默认是逗号)、包围值的字符(默认是双引号)以及包围的方式。其中,包围值的字符主要用于当字段中有特殊符号时,通过添加包围值的字符可以避免二义性。大家可以尝试将上面第5行代码修改为下面的代码,然后查看生成的CSV文件。
+
+```python
+writer = csv.writer(file, delimiter='|', quoting=csv.QUOTE_ALL)
+```
+
+生成的CSV文件的内容。
+
+```
+"姓名"|"语文"|"数学"|"英语"
+"关羽"|"88"|"64"|"65"
+"张飞"|"76"|"93"|"79"
+"赵云"|"78"|"55"|"76"
+"马超"|"72"|"77"|"68"
+"黄忠"|"70"|"72"|"51"
+```
+
+### 从CSV文件读取数据
+
+如果要读取刚才创建的CSV文件,可以使用下面的代码,通过`csv`模块的`reader`函数可以创建出`csvreader`对象,该对象是一个迭代器,可以通过`next`函数或`for-in`循环读取到文件中的数据。
+
+```python
+import csv
+
+with open('scores.csv', 'r') as file:
+ reader = csv.reader(file, delimiter='|')
+ for data_list in reader:
+ print(reader.line_num, end='\t')
+ for elem in data_list:
+ print(elem, end='\t')
+ print()
+```
+
+> **注意**:上面的代码对`csvreader`对象做`for`循环时,每次会取出一个列表对象,该列表对象包含了一行中所有的字段。
+
+### 总结
+
+将来如果大家使用Python做数据分析,很有可能会用到名为`pandas`的三方库,它是Python数据分析的神器之一。`pandas`中封装了名为`read_csv`和`to_csv`的函数用来读写CSV文件,其中`read_CSV`会将读取到的数据变成一个`DataFrame`对象,而`DataFrame`就是`pandas`库中最重要的类型,它封装了一系列用于数据处理的方法(清洗、转换、聚合等);而`to_csv`会将`DataFrame`对象中的数据写入CSV文件,完成数据的持久化。`read_csv`函数和`to_csv`函数远远比原生的`csvreader`和`csvwriter`强大。
diff --git "a/Day21-30/24.Python\350\257\273\345\206\231Excel\346\226\207\344\273\266-1.md" "b/Day21-30/24.Python\350\257\273\345\206\231Excel\346\226\207\344\273\266-1.md"
new file mode 100755
index 000000000..6ddbc4199
--- /dev/null
+++ "b/Day21-30/24.Python\350\257\273\345\206\231Excel\346\226\207\344\273\266-1.md"
@@ -0,0 +1,192 @@
+## Python读写Excel文件-1
+
+### Excel简介
+
+Excel 是 Microsoft(微软)为使用 Windows 和 macOS 操作系统开发的一款电子表格软件。Excel 凭借其直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,一直以来都是最为流行的个人计算机数据处理软件。当然,Excel 也有很多竞品,例如 Google Sheets、LibreOffice Calc、Numbers 等,这些竞品基本上也能够兼容 Excel,至少能够读写较新版本的 Excel 文件,当然这些不是我们讨论的重点。掌握用 Python 程序操作 Excel 文件,可以让日常办公自动化的工作更加轻松愉快,而且在很多商业项目中,导入导出 Excel 文件都是特别常见的功能。
+
+Python 操作 Excel 需要三方库的支持,如果要兼容 Excel 2007 以前的版本,也就是`xls`格式的 Excel 文件,可以使用三方库`xlrd`和`xlwt`,前者用于读 Excel 文件,后者用于写 Excel 文件。如果使用较新版本的 Excel,即`xlsx`格式的 Excel 文件,可以使用`openpyxl`库,当然这个库不仅仅可以操作Excel,还可以操作其他基于 Office Open XML 的电子表格文件。
+
+本章我们先讲解基于`xlwt`和`xlrd`操作 Excel 文件,大家可以先使用下面的命令安装这两个三方库以及配合使用的工具模块`xlutils`。
+
+```Bash
+pip install xlwt xlrd xlutils
+```
+
+### 读Excel文件
+
+例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xls”的 Excel 文件,如果想读取并显示该文件的内容,可以通过如下所示的代码来完成。
+
+```python
+import xlrd
+
+# 使用xlrd模块的open_workbook函数打开指定Excel文件并获得Book对象(工作簿)
+wb = xlrd.open_workbook('阿里巴巴2020年股票数据.xls')
+# 通过Book对象的sheet_names方法可以获取所有表单名称
+sheetnames = wb.sheet_names()
+print(sheetnames)
+# 通过指定的表单名称获取Sheet对象(工作表)
+sheet = wb.sheet_by_name(sheetnames[0])
+# 通过Sheet对象的nrows和ncols属性获取表单的行数和列数
+print(sheet.nrows, sheet.ncols)
+for row in range(sheet.nrows):
+ for col in range(sheet.ncols):
+ # 通过Sheet对象的cell方法获取指定Cell对象(单元格)
+ # 通过Cell对象的value属性获取单元格中的值
+ value = sheet.cell(row, col).value
+ # 对除首行外的其他行进行数据格式化处理
+ if row > 0:
+ # 第1列的xldate类型先转成元组再格式化为“年月日”的格式
+ if col == 0:
+ # xldate_as_tuple函数的第二个参数只有0和1两个取值
+ # 其中0代表以1900-01-01为基准的日期,1代表以1904-01-01为基准的日期
+ value = xlrd.xldate_as_tuple(value, 0)
+ value = f'{value[0]}年{value[1]:>02d}月{value[2]:>02d}日'
+ # 其他列的number类型处理成小数点后保留两位有效数字的浮点数
+ else:
+ value = f'{value:.2f}'
+ print(value, end='\t')
+ print()
+# 获取最后一个单元格的数据类型
+# 0 - 空值,1 - 字符串,2 - 数字,3 - 日期,4 - 布尔,5 - 错误
+last_cell_type = sheet.cell_type(sheet.nrows - 1, sheet.ncols - 1)
+print(last_cell_type)
+# 获取第一行的值(列表)
+print(sheet.row_values(0))
+# 获取指定行指定列范围的数据(列表)
+# 第一个参数代表行索引,第二个和第三个参数代表列的开始(含)和结束(不含)索引
+print(sheet.row_slice(3, 0, 5))
+```
+
+> **提示**:上面代码中使用的Excel文件“阿里巴巴2020年股票数据.xls”可以通过后面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
+
+相信通过上面的代码,大家已经了解到了如何读取一个 Excel 文件,如果想知道更多关于`xlrd`模块的知识,可以阅读它的[官方文档](https://xlrd.readthedocs.io/en/latest/)。
+
+### 写Excel文件
+
+写入 Excel 文件可以通过`xlwt` 模块的`Workbook`类创建工作簿对象,通过工作簿对象的`add_sheet`方法可以添加工作表,通过工作表对象的`write`方法可以向指定单元格中写入数据,最后通过工作簿对象的`save`方法将工作簿写入到指定的文件或内存中。下面的代码实现了将5 个学生 3 门课程的考试成绩写入 Excel 文件的操作。
+
+```python
+import random
+
+import xlwt
+
+student_names = ['关羽', '张飞', '赵云', '马超', '黄忠']
+scores = [[random.randrange(50, 101) for _ in range(3)] for _ in range(5)]
+# 创建工作簿对象(Workbook)
+wb = xlwt.Workbook()
+# 创建工作表对象(Worksheet)
+sheet = wb.add_sheet('一年级二班')
+# 添加表头数据
+titles = ('姓名', '语文', '数学', '英语')
+for index, title in enumerate(titles):
+ sheet.write(0, index, title)
+# 将学生姓名和考试成绩写入单元格
+for row in range(len(scores)):
+ sheet.write(row + 1, 0, student_names[row])
+ for col in range(len(scores[row])):
+ sheet.write(row + 1, col + 1, scores[row][col])
+# 保存Excel工作簿
+wb.save('考试成绩表.xls')
+```
+
+### 调整单元格样式
+
+在写Excel文件时,我们还可以为单元格设置样式,主要包括字体(Font)、对齐方式(Alignment)、边框(Border)和背景(Background)的设置,`xlwt`对这几项设置都封装了对应的类来支持。要设置单元格样式需要首先创建一个`XFStyle`对象,再通过该对象的属性对字体、对齐方式、边框等进行设定,例如在上面的例子中,如果希望将表头单元格的背景色修改为黄色,可以按照如下的方式进行操作。
+
+```python
+header_style = xlwt.XFStyle()
+pattern = xlwt.Pattern()
+pattern.pattern = xlwt.Pattern.SOLID_PATTERN
+# 0 - 黑色、1 - 白色、2 - 红色、3 - 绿色、4 - 蓝色、5 - 黄色、6 - 粉色、7 - 青色
+pattern.pattern_fore_colour = 5
+header_style.pattern = pattern
+titles = ('姓名', '语文', '数学', '英语')
+for index, title in enumerate(titles):
+ sheet.write(0, index, title, header_style)
+```
+
+如果希望为表头设置指定的字体,可以使用`Font`类并添加如下所示的代码。
+
+```python
+font = xlwt.Font()
+# 字体名称
+font.name = '华文楷体'
+# 字体大小(20是基准单位,18表示18px)
+font.height = 20 * 18
+# 是否使用粗体
+font.bold = True
+# 是否使用斜体
+font.italic = False
+# 字体颜色
+font.colour_index = 1
+header_style.font = font
+```
+
+> **注意**:上面代码中指定的字体名(`font.name`)应当是本地系统有的字体,例如在我的电脑上有名为“华文楷体”的字体。
+
+如果希望表头垂直居中对齐,可以使用下面的代码进行设置。
+
+```python
+align = xlwt.Alignment()
+# 垂直方向的对齐方式
+align.vert = xlwt.Alignment.VERT_CENTER
+# 水平方向的对齐方式
+align.horz = xlwt.Alignment.HORZ_CENTER
+header_style.alignment = align
+```
+
+如果希望给表头加上黄色的虚线边框,可以使用下面的代码来设置。
+
+```python
+borders = xlwt.Borders()
+props = (
+ ('top', 'top_colour'), ('right', 'right_colour'),
+ ('bottom', 'bottom_colour'), ('left', 'left_colour')
+)
+# 通过循环对四个方向的边框样式及颜色进行设定
+for position, color in props:
+ # 使用setattr内置函数动态给对象指定的属性赋值
+ setattr(borders, position, xlwt.Borders.DASHED)
+ setattr(borders, color, 5)
+header_style.borders = borders
+```
+
+如果要调整单元格的宽度(列宽)和表头的高度(行高),可以按照下面的代码进行操作。
+
+```python
+# 设置行高为40px
+sheet.row(0).set_style(xlwt.easyxf(f'font:height {20 * 40}'))
+titles = ('姓名', '语文', '数学', '英语')
+for index, title in enumerate(titles):
+ # 设置列宽为200px
+ sheet.col(index).width = 20 * 200
+ # 设置单元格的数据和样式
+ sheet.write(0, index, title, header_style)
+```
+
+### 公式计算
+
+对于前面打开的“阿里巴巴2020年股票数据.xls”文件,如果要统计全年收盘价(Close字段)的平均值以及全年交易量(Volume字段)的总和,可以使用Excel的公式计算即可。我们可以先使用`xlrd`读取Excel文件夹,然后通过`xlutils`三方库提供的`copy`函数将读取到的Excel文件转成`Workbook`对象进行写操作,在调用`write`方法时,可以将一个`Formula`对象写入单元格。
+
+实现公式计算的代码如下所示。
+
+```python
+import xlrd
+import xlwt
+from xlutils.copy import copy
+
+wb_for_read = xlrd.open_workbook('阿里巴巴2020年股票数据.xls')
+sheet1 = wb_for_read.sheet_by_index(0)
+nrows, ncols = sheet1.nrows, sheet1.ncols
+wb_for_write = copy(wb_for_read)
+sheet2 = wb_for_write.get_sheet(0)
+sheet2.write(nrows, 4, xlwt.Formula(f'average(E2:E{nrows})'))
+sheet2.write(nrows, 6, xlwt.Formula(f'sum(G2:G{nrows})'))
+wb_for_write.save('阿里巴巴2020年股票数据汇总.xls')
+```
+
+> **说明**:上面的代码有一些小瑕疵,有兴趣的读者可以自行探索并思考如何解决。
+
+### 总结
+
+掌握了 Python 程序操作 Excel 的方法,可以解决日常办公中很多繁琐的处理 Excel 电子表格工作,最常见就是将多个数据格式相同的 Excel 文件合并到一个文件以及从多个 Excel 文件或表单中提取指定的数据。当然,如果要对表格数据进行处理,使用 Python 数据分析神器之一的 pandas 库可能更为方便。
diff --git "a/Day21-30/25.Python\350\257\273\345\206\231Excel\346\226\207\344\273\266-2.md" "b/Day21-30/25.Python\350\257\273\345\206\231Excel\346\226\207\344\273\266-2.md"
new file mode 100755
index 000000000..02580f116
--- /dev/null
+++ "b/Day21-30/25.Python\350\257\273\345\206\231Excel\346\226\207\344\273\266-2.md"
@@ -0,0 +1,182 @@
+## Python读写Excel文件-2
+
+### Excel简介
+
+Excel 是 Microsoft(微软)为使用 Windows 和 macOS 操作系统开发的一款电子表格软件。Excel 凭借其直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,一直以来都是最为流行的个人计算机数据处理软件。当然,Excel 也有很多竞品,例如 Google Sheets、LibreOffice Calc、Numbers 等,这些竞品基本上也能够兼容 Excel,至少能够读写较新版本的 Excel 文件,当然这些不是我们讨论的重点。掌握用 Python 程序操作 Excel 文件,可以让日常办公自动化的工作更加轻松愉快,而且在很多商业项目中,导入导出 Excel 文件都是特别常见的功能。
+
+本章我们继续讲解基于另一个三方库`openpyxl`如何进行 Excel 文件操作,首先需要先安装它。
+
+```Bash
+pip install openpyxl
+```
+
+`openpyxl`的优点在于,当我们打开一个 Excel 文件后,既可以对它进行读操作,又可以对它进行写操作,而且在操作的便捷性上是优于`xlwt`和`xlrd`的。此外,如果要进行样式编辑和公式计算,使用`openpyxl`也远比上一个章节我们讲解的方式更为简单,而且`openpyxl`还支持数据透视和插入图表等操作,功能非常强大。有一点需要再次强调,`openpyxl`并不支持操作 Office 2007 以前版本的 Excel 文件。
+
+### 读取Excel文件
+
+例如在当前文件夹下有一个名为“阿里巴巴2020年股票数据.xlsx”的 Excel 文件,如果想读取并显示该文件的内容,可以通过如下所示的代码来完成。
+
+```python
+import datetime
+
+import openpyxl
+
+# 加载一个工作簿 ---> Workbook
+wb = openpyxl.load_workbook('阿里巴巴2020年股票数据.xlsx')
+# 获取工作表的名字
+print(wb.sheetnames)
+# 获取工作表 ---> Worksheet
+sheet = wb.worksheets[0]
+# 获得单元格的范围
+print(sheet.dimensions)
+# 获得行数和列数
+print(sheet.max_row, sheet.max_column)
+
+# 获取指定单元格的值
+print(sheet.cell(3, 3).value)
+print(sheet['C3'].value)
+print(sheet['G255'].value)
+
+# 获取多个单元格(嵌套元组)
+print(sheet['A2:C5'])
+
+# 读取所有单元格的数据
+for row_ch in range(2, sheet.max_row + 1):
+ for col_ch in 'ABCDEFG':
+ value = sheet[f'{col_ch}{row_ch}'].value
+ if type(value) == datetime.datetime:
+ print(value.strftime('%Y年%m月%d日'), end='\t')
+ elif type(value) == int:
+ print(f'{value:<10d}', end='\t')
+ elif type(value) == float:
+ print(f'{value:.4f}', end='\t')
+ else:
+ print(value, end='\t')
+ print()
+```
+
+> **提示**:上面代码中使用的Excel文件“阿里巴巴2020年股票数据.xlsx”可以通过后面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
+
+需要提醒大家一点,`openpyxl`获取指定的单元格有两种方式,一种是通过`cell`方法,需要注意,该方法的行索引和列索引都是从`1`开始的,这是为了照顾用惯了 Excel 的人的习惯;另一种是通过索引运算,通过指定单元格的坐标,例如`C3`、`G255`,也可以取得对应的单元格,再通过单元格对象的`value`属性,就可以获取到单元格的值。通过上面的代码,相信大家还注意到了,可以通过类似`sheet['A2:C5']`或`sheet['A2':'C5']`这样的切片操作获取多个单元格,该操作将返回嵌套的元组,相当于获取到了多行多列。
+
+### 写Excel文件
+
+下面我们使用`openpyxl`来进行写 Excel 操作。
+
+```python
+import random
+
+import openpyxl
+
+# 第一步:创建工作簿(Workbook)
+wb = openpyxl.Workbook()
+
+# 第二步:添加工作表(Worksheet)
+sheet = wb.active
+sheet.title = '期末成绩'
+
+titles = ('姓名', '语文', '数学', '英语')
+for col_index, title in enumerate(titles):
+ sheet.cell(1, col_index + 1, title)
+
+names = ('关羽', '张飞', '赵云', '马超', '黄忠')
+for row_index, name in enumerate(names):
+ sheet.cell(row_index + 2, 1, name)
+ for col_index in range(2, 5):
+ sheet.cell(row_index + 2, col_index, random.randrange(50, 101))
+
+# 第四步:保存工作簿
+wb.save('考试成绩表.xlsx')
+```
+
+### 调整样式和公式计算
+
+在使用`openpyxl`操作 Excel 时,如果要调整单元格的样式,可以直接通过单元格对象(`Cell`对象)的属性进行操作。单元格对象的属性包括字体(`font`)、对齐(`alignment`)、边框(`border`)等,具体的可以参考`openpyxl`的[官方文档](https://openpyxl.readthedocs.io/en/stable/index.html)。在使用`openpyxl`时,如果需要做公式计算,可以完全按照 Excel 中的操作方式来进行,具体的代码如下所示。
+
+```python
+import openpyxl
+from openpyxl.styles import Font, Alignment, Border, Side
+
+# 对齐方式
+alignment = Alignment(horizontal='center', vertical='center')
+# 边框线条
+side = Side(color='ff7f50', style='mediumDashed')
+
+wb = openpyxl.load_workbook('考试成绩表.xlsx')
+sheet = wb.worksheets[0]
+
+# 调整行高和列宽
+sheet.row_dimensions[1].height = 30
+sheet.column_dimensions['E'].width = 120
+
+sheet['E1'] = '平均分'
+# 设置字体
+sheet.cell(1, 5).font = Font(size=18, bold=True, color='ff1493', name='华文楷体')
+# 设置对齐方式
+sheet.cell(1, 5).alignment = alignment
+# 设置单元格边框
+sheet.cell(1, 5).border = Border(left=side, top=side, right=side, bottom=side)
+for i in range(2, 7):
+ # 公式计算每个学生的平均分
+ sheet[f'E{i}'] = f'=average(B{i}:D{i})'
+ sheet.cell(i, 5).font = Font(size=12, color='4169e1', italic=True)
+ sheet.cell(i, 5).alignment = alignment
+
+wb.save('考试成绩表.xlsx')
+```
+
+### 生成统计图表
+
+通过`openpyxl`库,可以直接向 Excel 中插入统计图表,具体的做法跟在 Excel 中插入图表大体一致。我们可以创建指定类型的图表对象,然后通过该对象的属性对图表进行设置。当然,最为重要的是为图表绑定数据,即横轴代表什么,纵轴代表什么,具体的数值是多少。最后,可以将图表对象添加到表单中,具体的代码如下所示。
+
+```python
+from openpyxl import Workbook
+from openpyxl.chart import BarChart, Reference
+
+wb = Workbook(write_only=True)
+sheet = wb.create_sheet()
+
+rows = [
+ ('类别', '销售A组', '销售B组'),
+ ('手机', 40, 30),
+ ('平板', 50, 60),
+ ('笔记本', 80, 70),
+ ('外围设备', 20, 10),
+]
+
+# 向表单中添加行
+for row in rows:
+ sheet.append(row)
+
+# 创建图表对象
+chart = BarChart()
+chart.type = 'col'
+chart.style = 10
+# 设置图表的标题
+chart.title = '销售统计图'
+# 设置图表纵轴的标题
+chart.y_axis.title = '销量'
+# 设置图表横轴的标题
+chart.x_axis.title = '商品类别'
+# 设置数据的范围
+data = Reference(sheet, min_col=2, min_row=1, max_row=5, max_col=3)
+# 设置分类的范围
+cats = Reference(sheet, min_col=1, min_row=2, max_row=5)
+# 给图表添加数据
+chart.add_data(data, titles_from_data=True)
+# 给图表设置分类
+chart.set_categories(cats)
+chart.shape = 4
+# 将图表添加到表单指定的单元格中
+sheet.add_chart(chart, 'A10')
+
+wb.save('demo.xlsx')
+```
+
+运行上面的代码,打开生成的 Excel 文件,效果如下图所示。
+
+
+
+### 总结
+
+掌握了 Python 程序操作 Excel 的方法,可以解决日常办公中很多繁琐的处理 Excel 电子表格工作,最常见就是将多个数据格式相同的Excel 文件合并到一个文件以及从多个 Excel 文件或表单中提取指定的数据。如果数据体量较大或者处理数据的方式比较复杂,我们还是推荐大家使用 Python 数据分析神器之一的 pandas 库。
diff --git "a/Day21-30/26.Python\346\223\215\344\275\234Word\345\222\214PowerPoint\346\226\207\344\273\266.md" "b/Day21-30/26.Python\346\223\215\344\275\234Word\345\222\214PowerPoint\346\226\207\344\273\266.md"
new file mode 100755
index 000000000..3281ca8f4
--- /dev/null
+++ "b/Day21-30/26.Python\346\223\215\344\275\234Word\345\222\214PowerPoint\346\226\207\344\273\266.md"
@@ -0,0 +1,245 @@
+## Python操作Word和PowerPoint文件
+
+在日常工作中,有很多简单重复的劳动其实完全可以交给 Python 程序,比如根据样板文件(模板文件)批量的生成很多个 Word 文件或 PowerPoint 文件。Word 是微软公司开发的文字处理程序,相信大家都不陌生,日常办公中很多正式的文档都是用 Word 进行撰写和编辑的,目前使用的 Word 文件后缀名一般为`.docx`。PowerPoint 是微软公司开发的演示文稿程序,是微软的 Office 系列软件中的一员,被商业人士、教师、学生等群体广泛使用,通常也将其称之为“幻灯片”。在 Python 中,可以使用名为`python-docx` 的三方库来操作 Word,可以使用名为`python-pptx`的三方库来生成 PowerPoint。
+
+### 操作Word文档
+
+我们可以先通过下面的命令来安装`python-docx`三方库。
+
+```bash
+pip install python-docx
+```
+
+按照[官方文档](https://python-docx.readthedocs.io/en/latest/)的介绍,我们可以使用如下所示的代码来生成一个简单的 Word 文档。
+
+```python
+from docx import Document
+from docx.shared import Cm, Pt
+
+from docx.document import Document as Doc
+
+# 创建代表Word文档的Doc对象
+document = Document() # type: Doc
+# 添加大标题
+document.add_heading('快快乐乐学Python', 0)
+# 添加段落
+p = document.add_paragraph('Python是一门非常流行的编程语言,它')
+run = p.add_run('简单')
+run.bold = True
+run.font.size = Pt(18)
+p.add_run('而且')
+run = p.add_run('优雅')
+run.font.size = Pt(18)
+run.underline = True
+p.add_run('。')
+
+# 添加一级标题
+document.add_heading('Heading, level 1', level=1)
+# 添加带样式的段落
+document.add_paragraph('Intense quote', style='Intense Quote')
+# 添加无序列表
+document.add_paragraph(
+ 'first item in unordered list', style='List Bullet'
+)
+document.add_paragraph(
+ 'second item in ordered list', style='List Bullet'
+)
+# 添加有序列表
+document.add_paragraph(
+ 'first item in ordered list', style='List Number'
+)
+document.add_paragraph(
+ 'second item in ordered list', style='List Number'
+)
+
+# 添加图片(注意路径和图片必须要存在)
+document.add_picture('resources/guido.jpg', width=Cm(5.2))
+
+# 添加分节符
+document.add_section()
+
+records = (
+ ('骆昊', '男', '1995-5-5'),
+ ('孙美丽', '女', '1992-2-2')
+)
+# 添加表格
+table = document.add_table(rows=1, cols=3)
+table.style = 'Dark List'
+hdr_cells = table.rows[0].cells
+hdr_cells[0].text = '姓名'
+hdr_cells[1].text = '性别'
+hdr_cells[2].text = '出生日期'
+# 为表格添加行
+for name, sex, birthday in records:
+ row_cells = table.add_row().cells
+ row_cells[0].text = name
+ row_cells[1].text = sex
+ row_cells[2].text = birthday
+
+# 添加分页符
+document.add_page_break()
+
+# 保存文档
+document.save('demo.docx')
+```
+
+> **提示**:上面代码第7行中的注释`# type: Doc`是为了在PyCharm中获得代码补全提示,因为如果不清楚对象具体的数据类型,PyCharm 无法在后续代码中给出`Doc`对象的代码补全提示。
+
+执行上面的代码,打开生成的 Word 文档,效果如下图所示。
+
+
+
+对于一个已经存在的 Word 文件,我们可以通过下面的代码去遍历它所有的段落并获取对应的内容。
+
+```python
+from docx import Document
+from docx.document import Document as Doc
+
+doc = Document('resources/离职证明.docx') # type: Doc
+for no, p in enumerate(doc.paragraphs):
+ print(no, p.text)
+```
+
+> **提示**:如果需要上面代码中的 Word 文件,可以通过下面的百度云盘地址进行获取。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g 提取码:e7b4。
+
+读取到的内容如下所示。
+
+```
+0
+1 离 职 证 明
+2
+3 兹证明 王大锤 ,身份证号码: 100200199512120001 ,于 2018 年 8 月 7 日至 2020 年 6 月 28 日在我单位 开发部 部门担任 Java开发工程师 职务,在职期间无不良表现。因 个人 原因,于 2020 年 6 月 28 日起终止解除劳动合同。现已结清财务相关费用,办理完解除劳动关系相关手续,双方不存在任何劳动争议。
+4
+5 特此证明!
+6
+7
+8 公司名称(盖章):成都风车车科技有限公司
+9 2020 年 6 月 28 日
+```
+
+讲到这里,相信很多读者已经想到了,我们可以把上面的离职证明制作成一个模板文件,把姓名、身份证号、入职和离职日期等信息用占位符代替,这样通过对占位符的替换,就可以根据实际需要写入对应的信息,这样就可以批量的生成 Word 文档。
+
+按照上面的思路,我们首先编辑一个离职证明的模板文件,如下图所示。
+
+
+
+接下来我们读取该文件,将占位符替换为真实信息,就可以生成一个新的 Word 文档,如下所示。
+
+```python
+from docx import Document
+from docx.document import Document as Doc
+
+# 将真实信息用字典的方式保存在列表中
+employees = [
+ {
+ 'name': '骆昊',
+ 'id': '100200198011280001',
+ 'sdate': '2008年3月1日',
+ 'edate': '2012年2月29日',
+ 'department': '产品研发',
+ 'position': '架构师',
+ 'company': '成都华为技术有限公司'
+ },
+ {
+ 'name': '王大锤',
+ 'id': '510210199012125566',
+ 'sdate': '2019年1月1日',
+ 'edate': '2021年4月30日',
+ 'department': '产品研发',
+ 'position': 'Python开发工程师',
+ 'company': '成都谷道科技有限公司'
+ },
+ {
+ 'name': '李元芳',
+ 'id': '2102101995103221599',
+ 'sdate': '2020年5月10日',
+ 'edate': '2021年3月5日',
+ 'department': '产品研发',
+ 'position': 'Java开发工程师',
+ 'company': '同城企业管理集团有限公司'
+ },
+]
+# 对列表进行循环遍历,批量生成Word文档
+for emp_dict in employees:
+ # 读取离职证明模板文件
+ doc = Document('resources/离职证明模板.docx') # type: Doc
+ # 循环遍历所有段落寻找占位符
+ for p in doc.paragraphs:
+ if '{' not in p.text:
+ continue
+ # 不能直接修改段落内容,否则会丢失样式
+ # 所以需要对段落中的元素进行遍历并进行查找替换
+ for run in p.runs:
+ if '{' not in run.text:
+ continue
+ # 将占位符换成实际内容
+ start, end = run.text.find('{'), run.text.find('}')
+ key, place_holder = run.text[start + 1:end], run.text[start:end + 1]
+ run.text = run.text.replace(place_holder, emp_dict[key])
+ # 每个人对应保存一个Word文档
+ doc.save(f'{emp_dict["name"]}离职证明.docx')
+```
+
+执行上面的代码,会在当前路径下生成三个 Word 文档,如下图所示。
+
+
+
+### 生成PowerPoint
+
+首先我们需要安装名为`python-pptx`的三方库,命令如下所示。
+
+```Bash
+pip install python-pptx
+```
+
+用 Python 操作 PowerPoint 的内容,因为实际应用场景不算很多,我不打算在这里进行赘述,有兴趣的读者可以自行阅读`python-pptx`的[官方文档](https://python-pptx.readthedocs.io/en/latest/),下面仅展示一段来自于官方文档的代码。
+
+```python
+from pptx import Presentation
+
+# 创建幻灯片对象
+pres = Presentation()
+
+# 选择母版添加一页
+title_slide_layout = pres.slide_layouts[0]
+slide = pres.slides.add_slide(title_slide_layout)
+# 获取标题栏和副标题栏
+title = slide.shapes.title
+subtitle = slide.placeholders[1]
+# 编辑标题和副标题
+title.text = "Welcome to Python"
+subtitle.text = "Life is short, I use Python"
+
+# 选择母版添加一页
+bullet_slide_layout = pres.slide_layouts[1]
+slide = pres.slides.add_slide(bullet_slide_layout)
+# 获取页面上所有形状
+shapes = slide.shapes
+# 获取标题和主体
+title_shape = shapes.title
+body_shape = shapes.placeholders[1]
+# 编辑标题
+title_shape.text = 'Introduction'
+# 编辑主体内容
+tf = body_shape.text_frame
+tf.text = 'History of Python'
+# 添加一个一级段落
+p = tf.add_paragraph()
+p.text = 'X\'max 1989'
+p.level = 1
+# 添加一个二级段落
+p = tf.add_paragraph()
+p.text = 'Guido began to write interpreter for Python.'
+p.level = 2
+
+# 保存幻灯片
+pres.save('test.pptx')
+```
+
+运行上面的代码,生成的 PowerPoint 文件如下图所示。
+
+
+
+### 总结
+
+用 Python 程序解决办公自动化的问题真的非常酷,它可以将我们从繁琐乏味的劳动中解放出来。写这类代码就是去做一件一劳永逸的事情,写代码的过程即便不怎么愉快,使用这些代码的时候应该是非常开心的。
diff --git "a/Day21-30/27.Python\346\223\215\344\275\234PDF\346\226\207\344\273\266.md" "b/Day21-30/27.Python\346\223\215\344\275\234PDF\346\226\207\344\273\266.md"
new file mode 100755
index 000000000..00ed13520
--- /dev/null
+++ "b/Day21-30/27.Python\346\223\215\344\275\234PDF\346\226\207\344\273\266.md"
@@ -0,0 +1,141 @@
+## Python操作PDF文件
+
+PDF 是 Portable Document Format 的缩写,这类文件通常使用`.pdf`作为其扩展名。在日常开发工作中,最容易遇到的就是从 PDF 中读取文本内容以及用已有的内容生成PDF文档这两个任务。
+
+### 从PDF中提取文本
+
+在 Python 中,可以使用名为`PyPDF2`的三方库来读取 PDF 文件,可以使用下面的命令来安装它。
+
+```Bash
+pip install PyPDF2
+```
+
+`PyPDF2`没有办法从 PDF 文档中提取图像、图表或其他媒体,但它可以提取文本,并将其返回为 Python 字符串。
+
+```python
+import PyPDF2
+
+reader = PyPDF2.PdfReader('test.pdf')
+for page in reader.pages:
+ print(page.extract_text())
+```
+
+> **提示**:本章代码使用到的 PDF 文件都可以通过下面的百度云盘地址进行获取,链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。
+
+当然,`PyPDF2`并不是什么样的 PDF 文档都能提取出文字来,这个问题就我所知并没有什么特别好的解决方法,尤其是在提取中文的时候。网上也有很多讲解从 PDF 中提取文字的文章,推荐大家自行阅读[《三大神器助力Python提取pdf文档信息》](https://cloud.tencent.com/developer/article/1395339)一文进行了解。
+
+要从 PDF 文件中提取文本也可以直接使用三方的命令行工具,具体的做法如下所示。
+
+```Bash
+pip install pdfminer.six
+pdf2text.py test.pdf
+```
+
+### 旋转和叠加页面
+
+上面的代码中通过创建`PdfFileReader`对象的方式来读取 PDF 文档,该对象的`getPage`方法可以获得PDF文档的指定页并得到一个`PageObject`对象,通过`PageObject`对象的`rotateClockwise`和`rotateCounterClockwise`方法可以实现页面的顺时针和逆时针方向旋转,通过`PageObject`对象的`addBlankPage`方法可以添加一个新的空白页,代码如下所示。
+
+```python
+reader = PyPDF2.PdfReader('XGBoost.pdf')
+writer = PyPDF2.PdfWriter()
+
+for no, page in enumerate(reader.pages):
+ if no % 2 == 0:
+ new_page = page.rotate(-90)
+ else:
+ new_page = page.rotate(90)
+ writer.add_page(new_page)
+
+with open('temp.pdf', 'wb') as file_obj:
+ writer.write(file_obj)
+```
+
+### 加密PDF文件
+
+使用`PyPDF2`中的`PdfFileWrite`对象可以为PDF文档加密,如果需要给一系列的PDF文档设置统一的访问口令,使用Python程序来处理就会非常的方便。
+
+```python
+import PyPDF2
+
+reader = PyPDF2.PdfReader('XGBoost.pdf')
+writer = PyPDF2.PdfWriter()
+
+for page in reader.pages:
+ writer.add_page(page)
+
+writer.encrypt('foobared')
+
+with open('temp.pdf', 'wb') as file_obj:
+ writer.write(file_obj)
+```
+
+### 批量添加水印
+
+上面提到的`PageObject`对象还有一个名为`mergePage`的方法,可以两个 PDF 页面进行叠加,通过这个操作,我们很容易实现给PDF文件添加水印的功能。例如要给上面的“XGBoost.pdf”文件添加一个水印,我们可以先准备好一个提供水印页面的 PDF 文件,然后将包含水印的`PageObject`读取出来,然后再循环遍历“XGBoost.pdf”文件的每个页,获取到`PageObject`对象,然后通过`mergePage`方法实现水印页和原始页的合并,代码如下所示。
+
+```python
+reader1 = PyPDF2.PdfReader('XGBoost.pdf')
+reader2 = PyPDF2.PdfReader('watermark.pdf')
+writer = PyPDF2.PdfWriter()
+watermark_page = reader2.pages[0]
+
+for page in reader1.pages:
+ page.merge_page(watermark_page)
+ writer.add_page(page)
+
+with open('temp.pdf', 'wb') as file_obj:
+ writer.write(file_obj)
+```
+
+如果愿意,还可以让奇数页和偶数页使用不同的水印,大家可以自己思考下应该怎么做。
+
+### 创建PDF文件
+
+创建 PDF 文档需要三方库`reportlab`的支持,安装的方法如下所示。
+
+```Bash
+pip install reportlab
+```
+
+下面通过一个例子为大家展示`reportlab`的用法。
+
+```python
+from reportlab.lib.pagesizes import A4
+from reportlab.pdfbase import pdfmetrics
+from reportlab.pdfbase.ttfonts import TTFont
+from reportlab.pdfgen import canvas
+
+pdf_canvas = canvas.Canvas('resources/demo.pdf', pagesize=A4)
+width, height = A4
+
+# 绘图
+image = canvas.ImageReader('resources/guido.jpg')
+pdf_canvas.drawImage(image, 20, height - 395, 250, 375)
+
+# 显示当前页
+pdf_canvas.showPage()
+
+# 注册字体文件
+pdfmetrics.registerFont(TTFont('Font1', 'resources/fonts/Vera.ttf'))
+pdfmetrics.registerFont(TTFont('Font2', 'resources/fonts/青呱石头体.ttf'))
+
+# 写字
+pdf_canvas.setFont('Font2', 40)
+pdf_canvas.setFillColorRGB(0.9, 0.5, 0.3, 1)
+pdf_canvas.drawString(width // 2 - 120, height // 2, '你好,世界!')
+pdf_canvas.setFont('Font1', 40)
+pdf_canvas.setFillColorRGB(0, 1, 0, 0.5)
+pdf_canvas.rotate(18)
+pdf_canvas.drawString(250, 250, 'hello, world!')
+
+# 保存
+pdf_canvas.save()
+```
+
+上面的代码如果不太理解也没有关系,等真正需要用 Python 创建 PDF 文档的时候,再好好研读一下`reportlab`的[官方文档](https://www.reportlab.com/docs/reportlab-userguide.pdf)就可以了。
+
+> **提示**:上面代码中用到的图片和字体可以通过下面的百度云盘链接获取,链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。
+
+### 总结
+
+在学习完上面的内容之后,相信大家已经知道像合并多个 PDF 文件这样的工作应该如何用 Python 代码来处理了,赶紧自己动手试一试吧。
diff --git "a/Day21-30/28.Python\345\244\204\347\220\206\345\233\276\345\203\217.md" "b/Day21-30/28.Python\345\244\204\347\220\206\345\233\276\345\203\217.md"
new file mode 100755
index 000000000..bfb171ec7
--- /dev/null
+++ "b/Day21-30/28.Python\345\244\204\347\220\206\345\233\276\345\203\217.md"
@@ -0,0 +1,171 @@
+## Python处理图像
+
+### 入门知识
+
+1. 颜色。如果你有使用颜料画画的经历,那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色,事实上这三种颜色就是美术中的三原色,它们是不能再分解的基本颜色。在计算机中,我们可以将红、绿、蓝三种色光以不同的比例叠加来组合成其他的颜色,因此这三种颜色就是色光三原色。在计算机系统中,我们通常会将一个颜色表示为一个 RGB 值或 RGBA 值(其中的 A 表示 Alpha 通道,它决定了透过这个图像的像素,也就是透明度)。
+
+ | 名称 | RGB值 | 名称 | RGB值 |
+ | :---------: | :-------------: | :----------: | :-----------: |
+ | White(白) | (255, 255, 255) | Red(红) | (255, 0, 0) |
+ | Green(绿) | (0, 255, 0) | Blue(蓝) | (0, 0, 255) |
+ | Gray(灰) | (128, 128, 128) | Yellow(黄) | (255, 255, 0) |
+ | Black(黑) | (0, 0, 0) | Purple(紫) | (128, 0, 128) |
+
+2. 像素。对于一个由数字序列表示的图像来说,最小的单位就是图像上单一颜色的小方格,这些小方块都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置决定了该图像最终呈现出来的样子,它们是不可分割的单位,我们通常称之为像素(pixel)。每一个图像都包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小,大家如果爱好拍照或者自拍,对像素这个词就不会陌生。
+
+### 用Pillow处理图像
+
+Pillow 是由从著名的 Python 图像处理库 PIL 发展出来的一个分支,通过 Pillow 可以实现图像压缩和图像处理等各种操作。可以使用下面的命令来安装 Pillow。
+
+```Shell
+pip install pillow
+```
+
+Pillow 中最为重要的是`Image`类,可以通过`Image`模块的`open`函数来读取图像并获得`Image`类型的对象。
+
+1. 读取和显示图像
+
+ ```python
+ from PIL import Image
+
+ # 读取图像获得Image对象
+ image = Image.open('guido.jpg')
+ # 通过Image对象的format属性获得图像的格式
+ print(image.format) # JPEG
+ # 通过Image对象的size属性获得图像的尺寸
+ print(image.size) # (500, 750)
+ # 通过Image对象的mode属性获取图像的模式
+ print(image.mode) # RGB
+ # 通过Image对象的show方法显示图像
+ image.show()
+ ```
+
+
+
+2. 剪裁图像
+
+ ```python
+ # 通过Image对象的crop方法指定剪裁区域剪裁图像
+ image.crop((80, 20, 310, 360)).show()
+ ```
+
+
+
+3. 生成缩略图
+
+ ```python
+ # 通过Image对象的thumbnail方法生成指定尺寸的缩略图
+ image.thumbnail((128, 128))
+ image.show()
+ ```
+
+
+
+4. 缩放和黏贴图像
+
+ ```python
+ # 读取骆昊的照片获得Image对象
+ luohao_image = Image.open('luohao.png')
+ # 读取吉多的照片获得Image对象
+ guido_image = Image.open('guido.jpg')
+ # 从吉多的照片上剪裁出吉多的头
+ guido_head = guido_image.crop((80, 20, 310, 360))
+ width, height = guido_head.size
+ # 使用Image对象的resize方法修改图像的尺寸
+ # 使用Image对象的paste方法将吉多的头粘贴到骆昊的照片上
+ luohao_image.paste(guido_head.resize((int(width / 1.5), int(height / 1.5))), (172, 40))
+ luohao_image.show()
+ ```
+
+
+
+5. 旋转和翻转
+
+ ```python
+ image = Image.open('guido.jpg')
+ # 使用Image对象的rotate方法实现图像的旋转
+ image.rotate(45).show()
+ # 使用Image对象的transpose方法实现图像翻转
+ # Image.FLIP_LEFT_RIGHT - 水平翻转
+ # Image.FLIP_TOP_BOTTOM - 垂直翻转
+ image.transpose(Image.FLIP_TOP_BOTTOM).show()
+ ```
+
+
+
+6. 操作像素
+
+ ```python
+ for x in range(80, 310):
+ for y in range(20, 360):
+ # 通过Image对象的putpixel方法修改图像指定像素点
+ image.putpixel((x, y), (128, 128, 128))
+ image.show()
+ ```
+
+
+
+7. 滤镜效果
+
+ ```python
+ from PIL import ImageFilter
+
+ # 使用Image对象的filter方法对图像进行滤镜处理
+ # ImageFilter模块包含了诸多预设的滤镜也可以自定义滤镜
+ image.filter(ImageFilter.CONTOUR).show()
+ ```
+
+
+
+### 使用Pillow绘图
+
+Pillow 中有一个名为`ImageDraw`的模块,该模块的`Draw`函数会返回一个`ImageDraw`对象,通过`ImageDraw`对象的`arc`、`line`、`rectangle`、`ellipse`、`polygon`等方法,可以在图像上绘制出圆弧、线条、矩形、椭圆、多边形等形状,也可以通过该对象的`text`方法在图像上添加文字。
+
+
+
+要绘制如上图所示的图像,完整的代码如下所示。
+
+```python
+import random
+
+from PIL import Image, ImageDraw, ImageFont
+
+
+def random_color():
+ """生成随机颜色"""
+ red = random.randint(0, 255)
+ green = random.randint(0, 255)
+ blue = random.randint(0, 255)
+ return red, green, blue
+
+
+width, height = 800, 600
+# 创建一个800*600的图像,背景色为白色
+image = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
+# 创建一个ImageDraw对象
+drawer = ImageDraw.Draw(image)
+# 通过指定字体和大小获得ImageFont对象
+font = ImageFont.truetype('Kongxin.ttf', 32)
+# 通过ImageDraw对象的text方法绘制文字
+drawer.text((300, 50), 'Hello, world!', fill=(255, 0, 0), font=font)
+# 通过ImageDraw对象的line方法绘制两条对角直线
+drawer.line((0, 0, width, height), fill=(0, 0, 255), width=2)
+drawer.line((width, 0, 0, height), fill=(0, 0, 255), width=2)
+xy = width // 2 - 60, height // 2 - 60, width // 2 + 60, height // 2 + 60
+# 通过ImageDraw对象的rectangle方法绘制矩形
+drawer.rectangle(xy, outline=(255, 0, 0), width=2)
+# 通过ImageDraw对象的ellipse方法绘制椭圆
+for i in range(4):
+ left, top, right, bottom = 150 + i * 120, 220, 310 + i * 120, 380
+ drawer.ellipse((left, top, right, bottom), outline=random_color(), width=8)
+# 显示图像
+image.show()
+# 保存图像
+image.save('result.png')
+```
+
+> **注意**:上面代码中使用的字体文件需要根据自己准备,可以选择自己喜欢的字体文件并放置在代码目录下。
+
+### 总结
+
+使用 Python 语言做开发,除了可以用 Pillow 来处理图像外,还可以使用更为强大的 OpenCV 库来完成图形图像的处理,OpenCV(**Open** Source **C**omputer **V**ision Library)是一个跨平台的计算机视觉库,可以用来开发实时图像处理、计算机视觉和模式识别程序。在我们的日常工作中,有很多繁琐乏味的任务其实都可以通过 Python 程序来处理,编程的目的就是让计算机帮助我们解决问题,减少重复乏味的劳动。通过本章节的学习,相信大家已经感受到了使用 Python 程序绘图改图的乐趣,其实 Python 能做的事情还远不止这些,继续你的学习吧。
diff --git "a/Day21-30/29.Python\345\217\221\351\200\201\351\202\256\344\273\266\345\222\214\347\237\255\344\277\241.md" "b/Day21-30/29.Python\345\217\221\351\200\201\351\202\256\344\273\266\345\222\214\347\237\255\344\277\241.md"
new file mode 100755
index 000000000..f60598a69
--- /dev/null
+++ "b/Day21-30/29.Python\345\217\221\351\200\201\351\202\256\344\273\266\345\222\214\347\237\255\344\277\241.md"
@@ -0,0 +1,202 @@
+## Python发送邮件和短信
+
+在前面的课程中,我们已经教会大家如何用 Python 程序自动的生成 Excel、Word、PDF 文档,接下来我们还可以更进一步,就是通过邮件将生成好的文档发送给指定的收件人,然后用短信告知对方我们发出了邮件。这些事情利用 Python 程序也可以轻松愉快的解决。
+
+### 发送电子邮件
+
+在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号的链接、银行向客户推广它们的理财产品等几乎都是通过电子邮件来完成的,而这些任务应该都是由程序自动完成的。
+
+我们可以用HTTP(超文本传输协议)来访问网站资源,HTTP 是一个应用级协议,它建立在 TCP(传输控制协议)之上,TCP 为很多应用级协议提供了可靠的数据传输服务。如果要发送电子邮件,需要使用 SMTP(简单邮件传输协议),它也是建立在 TCP 之上的应用级协议,规定了邮件的发送者如何跟邮件服务器进行通信的细节。Python 通过名为`smtplib`的模块将这些操作简化成了`SMTP_SSL`对象,通过该对象的`login`和`send_mail`方法,就能够完成发送邮件的操作。
+
+我们先尝试一下发送一封极为简单的邮件,该邮件不包含附件、图片以及其他超文本内容。发送邮件首先需要接入邮件服务器,我们可以自己架设邮件服务器,这件事情对新手并不友好,但是我们可以选择使用第三方提供的邮件服务。例如,我在已经注册了账号,登录成功之后,就可以在设置中开启 SMTP 服务,这样就相当于获得了邮件服务器,具体的操作如下所示。
+
+
+
+
+
+用手机扫码上面的二维码可以通过发送短信的方式来获取授权码,短信发送成功后,点击“我已发送”就可以获得授权码。授权码需要妥善保管,因为一旦泄露就会被其他人冒用你的身份来发送邮件。接下来,我们就可以编写发送邮件的代码了,如下所示。
+
+```python
+import smtplib
+from email.header import Header
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+
+# 创建邮件主体对象
+email = MIMEMultipart()
+# 设置发件人、收件人和主题
+email['From'] = 'xxxxxxxxx@126.com'
+email['To'] = 'yyyyyy@qq.com;zzzzzz@1000phone.com'
+email['Subject'] = Header('上半年工作情况汇报', 'utf-8')
+# 添加邮件正文内容
+content = """据德国媒体报道,当地时间9日,德国火车司机工会成员进行了投票,
+定于当地时间10日起进行全国性罢工,货运交通方面的罢工已于当地时间10日19时开始。
+此后,从11日凌晨2时到13日凌晨2时,德国全国范围内的客运和铁路基础设施将进行48小时的罢工。"""
+email.attach(MIMEText(content, 'plain', 'utf-8'))
+
+# 创建SMTP_SSL对象(连接邮件服务器)
+smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465)
+# 通过用户名和授权码进行登录
+smtp_obj.login('xxxxxxxxx@126.com', '邮件服务器的授权码')
+# 发送邮件(发件人、收件人、邮件内容(字符串))
+smtp_obj.sendmail(
+ 'xxxxxxxxx@126.com',
+ ['yyyyyy@qq.com', 'zzzzzz@1000phone.com'],
+ email.as_string()
+)
+```
+
+如果要发送带有附件的邮件,只需要将附件的内容处理成 BASE64 编码,那么它就和普通的文本内容几乎没有什么区别。BASE64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,常用于某些需要表示、传输、存储二进制数据的场合,电子邮件就是其中之一。对这种编码方式不理解的同学,推荐阅读[《Base64笔记》](http://www.ruanyifeng.com/blog/2008/06/base64.html)一文。在之前的内容中,我们也提到过,Python 标准库的`base64`模块提供了对 BASE64 编解码的支持。
+
+下面的代码演示了如何发送带附件的邮件。
+
+```python
+import smtplib
+from email.header import Header
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from urllib.parse import quote
+
+# 创建邮件主体对象
+email = MIMEMultipart()
+# 设置发件人、收件人和主题
+email['From'] = 'xxxxxxxxx@126.com'
+email['To'] = 'zzzzzzzz@1000phone.com'
+email['Subject'] = Header('请查收离职证明文件', 'utf-8')
+# 添加邮件正文内容(带HTML标签排版的内容)
+content = """亲爱的前同事:
+你需要的离职证明在附件中,请查收!
+
+祝,好!
+
+孙美丽 即日
"""
+email.attach(MIMEText(content, 'html', 'utf-8'))
+# 读取作为附件的文件
+with open(f'resources/王大锤离职证明.docx', 'rb') as file:
+ attachment = MIMEText(file.read(), 'base64', 'utf-8')
+ # 指定内容类型
+ attachment['content-type'] = 'application/octet-stream'
+ # 将中文文件名处理成百分号编码
+ filename = quote('王大锤离职证明.docx')
+ # 指定如何处置内容
+ attachment['content-disposition'] = f'attachment; filename="{filename}"'
+
+# 创建SMTP_SSL对象(连接邮件服务器)
+smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465)
+# 通过用户名和授权码进行登录
+smtp_obj.login('xxxxxxxxx@126.com', '邮件服务器的授权码')
+# 发送邮件(发件人、收件人、邮件内容(字符串))
+smtp_obj.sendmail(
+ 'xxxxxxxxx@126.com',
+ 'zzzzzzzz@1000phone.com',
+ email.as_string()
+)
+```
+
+为了方便大家用 Python 实现邮件发送,我将上面的代码封装成了函数,使用的时候大家只需要调整邮件服务器域名、端口、用户名和授权码就可以了。
+
+```python
+import smtplib
+from email.header import Header
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from urllib.parse import quote
+
+# 邮件服务器域名(自行修改)
+EMAIL_HOST = 'smtp.126.com'
+# 邮件服务端口(通常是465)
+EMAIL_PORT = 465
+# 登录邮件服务器的账号(自行修改)
+EMAIL_USER = 'xxxxxxxxx@126.com'
+# 开通SMTP服务的授权码(自行修改)
+EMAIL_AUTH = '邮件服务器的授权码'
+
+
+def send_email(*, from_user, to_users, subject='', content='', filenames=[]):
+ """发送邮件
+
+ :param from_user: 发件人
+ :param to_users: 收件人,多个收件人用英文分号进行分隔
+ :param subject: 邮件的主题
+ :param content: 邮件正文内容
+ :param filenames: 附件要发送的文件路径
+ """
+ email = MIMEMultipart()
+ email['From'] = from_user
+ email['To'] = to_users
+ email['Subject'] = subject
+
+ message = MIMEText(content, 'plain', 'utf-8')
+ email.attach(message)
+ for filename in filenames:
+ with open(filename, 'rb') as file:
+ pos = filename.rfind('/')
+ display_filename = filename[pos + 1:] if pos >= 0 else filename
+ display_filename = quote(display_filename)
+ attachment = MIMEText(file.read(), 'base64', 'utf-8')
+ attachment['content-type'] = 'application/octet-stream'
+ attachment['content-disposition'] = f'attachment; filename="{display_filename}"'
+ email.attach(attachment)
+
+ smtp = smtplib.SMTP_SSL(EMAIL_HOST, EMAIL_PORT)
+ smtp.login(EMAIL_USER, EMAIL_AUTH)
+ smtp.sendmail(from_user, to_users.split(';'), email.as_string())
+```
+
+### 发送短信
+
+发送短信也是项目中常见的功能,网站的注册码、验证码、营销信息基本上都是通过短信来发送给用户的。发送短信需要三方平台的支持,下面我们以[螺丝帽平台](https://luosimao.com/)为例,为大家介绍如何用 Python 程序发送短信。注册账号和购买短信服务的细节我们不在这里进行赘述,大家可以咨询平台的客服。
+
+
+
+接下来,我们可以通过`requests`库向平台提供的短信网关发起一个 HTTP 请求,通过将接收短信的手机号和短信内容作为参数,就可以发送短信,代码如下所示。
+
+```python
+import random
+
+import requests
+
+
+def send_message_by_luosimao(tel, message):
+ """发送短信(调用螺丝帽短信网关)"""
+ resp = requests.post(
+ url='http://sms-api.luosimao.com/v1/send.json',
+ auth=('api', 'key-注册成功后平台分配的KEY'),
+ data={
+ 'mobile': tel,
+ 'message': message
+ },
+ timeout=10,
+ verify=False
+ )
+ return resp.json()
+
+
+def gen_mobile_code(length=6):
+ """生成指定长度的手机验证码"""
+ return ''.join(random.choices('0123456789', k=length))
+
+
+def main():
+ code = gen_mobile_code()
+ message = f'您的短信验证码是{code},打死也不能告诉别人哟!【Python小课】'
+ print(send_message_by_luosimao('13500112233', message))
+
+
+if __name__ == '__main__':
+ main()
+```
+
+上面请求螺丝帽的短信网关`http://sms-api.luosimao.com/v1/send.json`会返回JSON格式的数据,如果返回`{'error': 0, 'msg': 'OK'}`就说明短信已经发送成功了,如果`error`的值不是`0`,可以通过查看官方的[开发文档](https://luosimao.com/docs/api/)了解到底哪个环节出了问题。螺丝帽平台常见的错误类型如下图所示。
+
+
+
+目前,大多数短信平台都会要求短信内容必须附上签名,下图是我在螺丝帽平台配置的短信签名“【Python小课】”。有些涉及到敏感内容的短信,还需要提前配置短信模板,有兴趣的读者可以自行研究。一般情况下,平台为了防范短信被盗用,还会要求设置“IP 白名单”,不清楚如何配置的可以咨询平台客服。
+
+
+
+当然国内的短信平台很多,读者可以根据自己的需要进行选择(通常会考虑费用预算、短信达到率、使用的难易程度等指标),如果需要在商业项目中使用短信服务建议购买短信平台提供的套餐服务。
+
+### 总结
+
+其实,发送邮件和发送短信一样,也可以通过调用三方服务来完成,在实际的商业项目中,建议自己架设邮件服务器或购买三方服务来发送邮件,这个才是比较靠谱的选择。
diff --git "a/Day21-30/30.\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\345\272\224\347\224\250.md" "b/Day21-30/30.\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\345\272\224\347\224\250.md"
new file mode 100755
index 000000000..90a4d3ef1
--- /dev/null
+++ "b/Day21-30/30.\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\347\232\204\345\272\224\347\224\250.md"
@@ -0,0 +1,159 @@
+## 正则表达式的应用
+
+### 正则表达式相关知识
+
+在编写处理字符串的程时,经常会遇到在一段文本中查找符合某些规则的字符串的需求,正则表达式就是用于描述这些规则的工具,换句话说,我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。
+
+举一个简单的例子,如果你在 Windows 操作系统中使用过文件查找并且在指定文件名时使用过通配符(`*`和`?`),那么正则表达式也是与之类似的用 来进行文本匹配的工具,只不过比起通配符正则表达式更强大,它能更精确地描述你的需求,当然你付出的代价是书写一个正则表达式比使用通配符要复杂得多,因为任何给你带来好处的东西都需要你付出对应的代价。
+
+再举一个例子,我们从某个地方(可能是一个文本文件,也可能是网络上的一则新闻)获得了一个字符串,希望在字符串中找出手机号和座机号。当然我们可以设定手机号是 11 位的数字(注意并不是随机的 11 位数字,因为你没有见过“25012345678”这样的手机号),而座机号则是类似于“区号-号码”这样的模式,如果不使用正则表达式要完成这个任务就会比较麻烦。最初计算机是为了做数学运算而诞生的,处理的信息基本上都是数值,而今天我们在日常工作中处理的信息很多都是文本数据,我们希望计算机能够识别和处理符合某些模式的文本,正则表达式就显得非常重要了。今天几乎所有的编程语言都提供了对正则表达式操作的支持,Python 通过标准库中的`re`模块来支持正则表达式操作。
+
+关于正则表达式的相关知识,大家可以阅读一篇非常有名的博文叫[《正则表达式30分钟入门教程》](https://deerchao.net/tutorials/regex/regex.htm),读完这篇文章后你就可以看懂下面的表格,这是我们对正则表达式中的一些基本符号进行的扼要总结。
+
+| 符号 | 解释 | 示例 | 说明 |
+| -------------- | -------------------------------- | ------------------ | ------------------------------------------------------------ |
+| `.` | 匹配任意字符 | `b.t` | 可以匹配bat / but / b#t / b1t等 |
+| `\w` | 匹配字母/数字/下划线 | `b\wt` | 可以匹配bat / b1t / b_t等
但不能匹配b#t |
+| `\s` | 匹配空白字符(包括\r、\n、\t等) | `love\syou` | 可以匹配love you |
+| `\d` | 匹配数字 | `\d\d` | 可以匹配01 / 23 / 99等 |
+| `\b` | 匹配单词的边界 | `\bThe\b` | |
+| `^` | 匹配字符串的开始 | `^The` | 可以匹配The开头的字符串 |
+| `$` | 匹配字符串的结束 | `.exe$` | 可以匹配.exe结尾的字符串 |
+| `\W` | 匹配非字母/数字/下划线 | `b\Wt` | 可以匹配b#t / b@t等
但不能匹配but / b1t / b_t等 |
+| `\S` | 匹配非空白字符 | `love\Syou` | 可以匹配love#you等
但不能匹配love you |
+| `\D` | 匹配非数字 | `\d\D` | 可以匹配9a / 3# / 0F等 |
+| `\B` | 匹配非单词边界 | `\Bio\B` | |
+| `[]` | 匹配来自字符集的任意单一字符 | `[aeiou]` | 可以匹配任一元音字母字符 |
+| `[^]` | 匹配不在字符集中的任意单一字符 | `[^aeiou]` | 可以匹配任一非元音字母字符 |
+| `*` | 匹配0次或多次 | `\w*` | |
+| `+` | 匹配1次或多次 | `\w+` | |
+| `?` | 匹配0次或1次 | `\w?` | |
+| `{N}` | 匹配N次 | `\w{3}` | |
+| `{M,}` | 匹配至少M次 | `\w{3,}` | |
+| `{M,N}` | 匹配至少M次至多N次 | `\w{3,6}` | |
+| `\|` | 分支 | `foo\|bar` | 可以匹配foo或者bar |
+| `(?#)` | 注释 | | |
+| `(exp)` | 匹配exp并捕获到自动命名的组中 | | |
+| `(?exp)` | 匹配exp并捕获到名为name的组中 | | |
+| `(?:exp)` | 匹配exp但是不捕获匹配的文本 | | |
+| `(?=exp)` | 匹配exp前面的位置 | `\b\w+(?=ing)` | 可以匹配I'm dancing中的danc |
+| `(?<=exp)` | 匹配exp后面的位置 | `(?<=\bdanc)\w+\b` | 可以匹配I love dancing and reading中的第一个ing |
+| `(?!exp)` | 匹配后面不是exp的位置 | | |
+| `(?`a.*?b` | 将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 |
+| `+?` | 重复1次或多次,但尽可能少重复 | | |
+| `??` | 重复0次或1次,但尽可能少重复 | | |
+| `{M,N}?` | 重复M到N次,但尽可能少重复 | | |
+| `{M,}?` | 重复M次以上,但尽可能少重复 | | |
+
+> **说明:** 如果需要匹配的字符是正则表达式中的特殊字符,那么可以使用`\`进行转义处理,例如想匹配小数点可以写成`\.`就可以了,因为直接写`.`会匹配任意字符;同理,想匹配圆括号必须写成`\(`和`\)`,否则圆括号被视为正则表达式中的分组。
+
+### Python对正则表达式的支持
+
+Python 提供了`re`模块来支持正则表达式相关操作,下面是`re`模块中的核心函数。
+
+| 函数 | 说明 |
+| ---------------------------------------------- | ------------------------------------------------------------ |
+| `compile(pattern, flags=0)` | 编译正则表达式返回正则表达式对象 |
+| `match(pattern, string, flags=0)` | 用正则表达式匹配字符串 成功返回匹配对象 否则返回`None` |
+| `search(pattern, string, flags=0)` | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回`None` |
+| `split(pattern, string, maxsplit=0, flags=0)` | 用正则表达式指定的模式分隔符拆分字符串 返回列表 |
+| `sub(pattern, repl, string, count=0, flags=0)` | 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用`count`指定替换的次数 |
+| `fullmatch(pattern, string, flags=0)` | `match`函数的完全匹配(从字符串开头到结尾)版本 |
+| `findall(pattern, string, flags=0)` | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
+| `finditer(pattern, string, flags=0)` | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
+| `purge()` | 清除隐式编译的正则表达式的缓存 |
+| `re.I` / `re.IGNORECASE` | 忽略大小写匹配标记 |
+| `re.M` / `re.MULTILINE` | 多行匹配标记 |
+
+> **说明:** 上面提到的`re`模块中的这些函数,实际开发中也可以用正则表达式对象(`Pattern`对象)的方法替代对这些函数的使用,如果一个正则表达式需要重复的使用,那么先通过`compile`函数编译正则表达式并创建出正则表达式对象无疑是更为明智的选择。
+
+下面我们通过一系列的例子来告诉大家在Python中如何使用正则表达式。
+
+#### 例子1:验证输入用户名和QQ号是否有效并给出对应的提示信息。
+
+```python
+"""
+要求:用户名必须由字母、数字或下划线构成且长度在6~20个字符之间,QQ号是5~12的数字且首位不能为0
+"""
+import re
+
+username = input('请输入用户名: ')
+qq = input('请输入QQ号: ')
+# match函数的第一个参数是正则表达式字符串或正则表达式对象
+# match函数的第二个参数是要跟正则表达式做匹配的字符串对象
+m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
+if not m1:
+ print('请输入有效的用户名.')
+# fullmatch函数要求字符串和正则表达式完全匹配
+# 所以正则表达式没有写起始符和结束符
+m2 = re.fullmatch(r'[1-9]\d{4,11}', qq)
+if not m2:
+ print('请输入有效的QQ号.')
+if m1 and m2:
+ print('你输入的信息是有效的!')
+```
+
+> **提示:** 上面在书写正则表达式时使用了“原始字符串”的写法(在字符串前面加上了`r`),所谓“原始字符串”就是字符串中的每个字符都是它原始的意义,说得更直接一点就是字符串中没有所谓的转义字符啦。因为正则表达式中有很多元字符和需要进行转义的地方,如果不使用原始字符串就需要将反斜杠写作`\\`,例如表示数字的`\d`得书写成`\\d`,这样不仅写起来不方便,阅读的时候也会很吃力。
+
+#### 例子2:从一段文字中提取出国内手机号码。
+
+下面这张图是截止到 2017 年底,国内三家运营商推出的手机号段。
+
+
+
+```python
+import re
+
+# 创建正则表达式对象,使用了前瞻和回顾来保证手机号前后不应该再出现数字
+pattern = re.compile(r'(?<=\D)1[34578]\d{9}(?=\D)')
+sentence = '''重要的事情说8130123456789遍,我的手机号是13512346789这个靓号,
+不是15600998765,也不是110或119,王大锤的手机号才是15600998765。'''
+# 方法一:查找所有匹配并保存到一个列表中
+tels_list = re.findall(pattern, sentence)
+for tel in tels_list:
+ print(tel)
+print('--------华丽的分隔线--------')
+
+# 方法二:通过迭代器取出匹配对象并获得匹配的内容
+for temp in pattern.finditer(sentence):
+ print(temp.group())
+print('--------华丽的分隔线--------')
+
+# 方法三:通过search函数指定搜索位置找出所有匹配
+m = pattern.search(sentence)
+while m:
+ print(m.group())
+ m = pattern.search(sentence, m.end())
+```
+
+> **说明:** 上面匹配国内手机号的正则表达式并不够好,因为像 14 开头的号码只有 145 或 147,而上面的正则表达式并没有考虑这种情况,要匹配国内手机号,更好的正则表达式的写法是:`(?<=\D)(1[38]\d{9}|14[57]\d{8}|15[0-35-9]\d{8}|17[678]\d{8})(?=\D)`,国内好像已经有 19 和 16 开头的手机号了,但是这个暂时不在我们考虑之列。
+
+#### 例子3:替换字符串中的不良内容
+
+```python
+import re
+
+sentence = 'Oh, shit! 你是傻逼吗? Fuck you.'
+purified = re.sub('fuck|shit|[傻煞沙][比笔逼叉缺吊碉雕]',
+ '*', sentence, flags=re.IGNORECASE)
+print(purified) # Oh, *! 你是*吗? * you.
+```
+
+> **说明:**` re`模块的正则表达式相关函数中都有一个`flags`参数,它代表了正则表达式的匹配标记,可以通过该标记来指定匹配时是否忽略大小写、是否进行多行匹配、是否显示调试信息等。如果需要为`flags`参数指定多个值,可以使用[按位或运算符](http://www.runoob.com/python/python-operators.html#ysf5)进行叠加,如`flags=re.I | re.M`。
+
+#### 例子4:拆分长字符串
+
+```python
+import re
+
+poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
+sentences_list = re.split(r'[,。]', poem)
+sentences_list = [sentence for sentence in sentences_list if sentence]
+for sentence in sentences_list:
+ print(sentence)
+```
+
+### 总结
+
+正则表达式在字符串的处理和匹配上真的非常强大,通过上面的例子相信大家已经感受到了正则表达式的魅力,当然写一个正则表达式对新手来说并不是那么容易,但是很多事情都是熟能生巧,大胆的去尝试就行了,有一个在线的[正则表达式测试工具](https://c.runoob.com/front-end/854)相信能够在一定程度上帮到大家。
diff --git "a/Day21-30/Web\345\211\215\347\253\257\346\246\202\350\277\260.md" "b/Day21-30/Web\345\211\215\347\253\257\346\246\202\350\277\260.md"
deleted file mode 100644
index 088b2680c..000000000
--- "a/Day21-30/Web\345\211\215\347\253\257\346\246\202\350\277\260.md"
+++ /dev/null
@@ -1,407 +0,0 @@
-## Web前端概述
-
-### HTML简史
-
-1. 1991年10月:一个非正式CERN([欧洲核子研究中心](https://zh.wikipedia.org/wiki/%E6%AD%90%E6%B4%B2%E6%A0%B8%E5%AD%90%E7%A0%94%E7%A9%B6%E7%B5%84%E7%B9%94))文件首次公开18个HTML标签,这个文件的作者是物理学家[蒂姆·伯纳斯-李](https://zh.wikipedia.org/wiki/%E8%92%82%E5%A7%86%C2%B7%E4%BC%AF%E7%BA%B3%E6%96%AF-%E6%9D%8E),因此他是[万维网](https://zh.wikipedia.org/wiki/%E4%B8%87%E7%BB%B4%E7%BD%91)的发明者,也是[万维网联盟](https://zh.wikipedia.org/wiki/%E4%B8%87%E7%BB%B4%E7%BD%91%E8%81%94%E7%9B%9F)的主席。
-2. 1995年11月:HTML 2.0标准发布(RFC 1866)。
-3. 1997年1月:HTML 3.2作为[W3C](https://zh.wikipedia.org/wiki/W3C)推荐标准发布。
-4. 1997年12月:HTML 4.0作为W3C推荐标准发布。
-5. 1999年12月:HTML4.01作为W3C推荐标准发布。
-6. 2008年1月:HTML5由W3C作为工作草案发布。
-7. 2011年5月:W3C将HTML5推进至“最终征求”(Last Call)阶段。
-8. 2012年12月:W3C指定HTML5作为“候选推荐”阶段。
-9. 2014年10月:HTML5作为稳定W3C推荐标准发布,这意味着HTML5的标准化已经完成。
-
-#### HTML5新特性
-
-1. 引入原生多媒体支持(audio和video标签)
-2. 引入可编程内容(canvas标签)
-3. 引入语义Web(article、aside、details、figure、footer、header、nav、section、summary等标签)
-4. 引入新的表单控件(日历、邮箱、搜索等)
-5. 引入对离线存储更好的支持
-6. 引入对定位、拖放、WebSocket、后台任务等的支持
-
-### 使用标签承载内容
-
-#### 结构
-
-- head
- - title
- - meta
-- body
-
-#### 文本
-
-- 标题和段落
-- 粗体和斜体
-- 上标和下标
-- 空白(白色空间折叠)
-- 折行和水平标尺
-- 语义化标记
- - 加粗和强调
- - 引用
- - 缩写词和首字母缩写词
- - 引文
- - 所有者联系信息
- - 内容的修改
-
-#### 列表(list)
-
- - 有序列表(ordered list)
- - 无序列表(unordered list)
- - 定义列表(definition list)
-
-#### 链接(anchor)
-
-- 页面链接
-- 锚链接
-- 功能链接
-
-#### 图像(image)
-
-- 图像存储位置
-- 图像及其宽高
-- 选择正确的图像格式
- - JPEG
- - GIF
- - PNG
-- 矢量图
-- figure标签
-
-#### 表格(table)
-
-- 基本的表格结构
-- 表格的标题
-- 跨行和跨列
-- 长表格
-
-#### 表单(form)
-
-- 如何收集信息
-- 表单控件(input)
- - 文本框 / 密码框 / 文本域
- - 单选按钮 / 复选按钮 / 下拉列表
- - 提交按钮 / 图像按钮 / 文件上传
-- 组合表单元素
- - fieldset / legend
-- HTML5的表单控件
- - 日期
- - 电子邮件 / URL
- - 搜索
-
-#### 音视频(audio / video)
-
-- 视频格式和播放器
-- 视频托管服务
-- 添加视频的准备工作
-- video标签和属性
-- audio标签和属性
-
-#### 其他
-
-- 文档类型
-- 注释
-- 属性
- - id
- - class
-- 块级元素 / 行级元素
-- 内联框架(internal frame)
-- 页面信息(meta)
-- 转义字符(实体替换符)
-
-### 使用CSS渲染页面
-
-#### 简介
-
-- CSS的作用
-- CSS的工作原理
-- 规则、属性和值
-
-#### 颜色(color)
-
-- 如何指定颜色
-- 颜色术语和颜色对比
-- 背景色
-
-#### 文本(text / font)
-
-- 文本的大小和字型(font-size / font-family)
-- 斜体、粗体、大写和下划线(font-weight / font-style / text-decoration)
-- 行间距(line-height)、字母间距(letter-spacing)和单词间距(word-spacing)
-- 对齐(text-align)方式和缩进(text-ident)
-- 链接样式(:link / :visited / :active / :hover)
-- CSS3新属性
- - 投影
- - 首字母和首行文本(p:first-letter / p:first-line)
- - 响应用户
-
-#### 盒子(box model)
-
-- 盒子大小的控制(width / height)
-- 盒子的边框、外边距和内边距(border / margin / padding)
-- 盒子的显示和隐藏(display / visibility)
-- CSS3新属性
- - 边框图像(border-image)
- - 投影(border-shadow)
- - 圆角(border-radius)
-
-#### 列表、表格和表单
-
-- 列表的项目符号(list-style)
-- 表格的边框和背景(border-collapse)
-- 表单控件的外观
-- 表单控件的对齐
-- 浏览器的开发者工具
-
-#### 图像
-
-- 控制图像的大小(display: inline-block)
-- 对齐图像
-- 背景图像(background / background-image / background-repeat / background-position)
-
-#### 布局
-
-- 控制元素的位置(position / z-index)
- - 普通流
- - 相对定位
- - 绝对定位
- - 固定定位
- - 浮动元素(float / clear)
-- 网站布局
- - HTML5布局
-- 适配屏幕尺寸
- - 固定宽度布局
- - 流体布局
- - 布局网格
-
-### 使用JavaScript控制行为
-
-#### JavaScript基本语法
-
-- 语句和注释
-- 变量和数据类型
- - 声明和赋值
- - 简单数据类型和复杂数据类型
- - 变量的命名规则
-- 表达式和运算符
- - 赋值运算符
- - 算术运算符
- - 比较运算符
- - 逻辑运算符
-- 分支结构
- - if…else...
- - switch…case…default...
-- 循环结构
- - for循环
- - while循环
- - do…while循环
-- 数组
- - 创建数组
- - 操作数组中的元素
-- 函数
- - 声明函数
- - 调用函数
- - 参数和返回值
- - 匿名函数
- - 立即调用函数
-
-#### 面向对象
-
- - 对象的概念
- - 创建对象的字面量语法
- - 访问成员运算符
- - 创建对象的构造函数语法
- - this关键字
- - 添加和删除属性
- - delete关键字
- - 全局对象
- - Number / String / Boolean
- - Date / Math / RegEx / Array
-
-#### BOM
-
- - window对象的属性和方法
- - history对象
- - forward() / back() / go()
- - location对象
- - navigator对象
- - screen对象
-
-#### DOM
-
- - DOM树
- - 访问元素
- - getElementById() / querySelector()
- - getElementsByClassName() / getElementsByTagName() / querySelectorAll()
- - parentNode / previousSibling / nextSibling / firstChild / lastChild
-- 操作元素
- - nodeValue
- - innerHTML / textContent / createElement() / createTextNode() / appendChild() / removeChild()
- - className / id / hasAttribute() / getAttribute() / setAttribute() / removeAttribute()
-- 事件处理
- - 事件类型
- - UI事件:load / unload / error / resize / scroll
- - 键盘事件:keydown / keyup / keypress
- - 鼠标事件:click / dbclick / mousedown / mouseup / mousemove / mouseover / mouseout
- - 焦点事件:focus / blur
- - 表单事件:input / change / submit / reset / cut / copy / paste / select
- - 事件绑定
- - HTML事件处理程序(不推荐使用,因为要做到标签与代码分离)
- - 传统的DOM事件处理程序(只能附加一个回调函数)
- - 事件监听器(旧的浏览器中不被支持)
- - 事件流:事件捕获 / 事件冒泡
- - 事件对象(低版本IE中的window.event)
- - target(低版本IE中的srcElement)
- - type
- - cancelable
- - preventDefault()
- - stopPropagation()(低版本IE中的cancelBubble)
- - 鼠标事件 - 事件发生的位置
- - 屏幕位置:screenX和screenY
- - 页面位置:pageX和pageY
- - 客户端位置:clientX和clientY
- - 键盘事件 - 哪个键被按下了
- - keyCode属性
- - String.fromCharCode(event.keyCode)
- - HTML5事件
- - DOMContentLoaded
- - hashchange
- - beforeunload
-
-#### JavaScript API
-
-- HTML5中的API:geolocation / localStorage / sessionStorage / history
-
-### 使用jQuery
-
-#### jQuery概述
-
-1. Write Less Do More(用更少的代码来完成更多的工作)
-2. 使用CSS选择器来查找元素(更简单更方便)
-3. 使用jQuery方法来操作元素(解决浏览器兼容性问题、应用于所有元素并施加多个方法)
-
-#### 引入jQuery
-
-- 下载jQuery的开发版和压缩版
-- 从CDN加载jQuery
-
-```HTML
-
-')
-
-```
-
-#### 查找元素
-
-- 选择器
- - \* / element / #id / .class / selector1, selector2
- - ancestor descendant / parent>child / previous+next / previous~siblings
-- 筛选器
- - 基本筛选器::not(selector) / :first / :last / :even / :odd / :eq(index) / :gt(index) / :lt(index) / :animated / :focus
- - 内容筛选器::contains('…') / :empty / :parent / :has(selector)
- - 可见性筛选器::hidden / :visible
- - 子节点筛选器::nth-child(expr) / :first-child / :last-child / :only-child
- - 属性筛选器:[attribute] / [attribute='value'] / [attribute!='value'] / [attribute^='value'] / [attribute$='value'] / [attribute|='value'] / [attribute~='value']
-- 表单::input / :text / :password / :radio / :checkbox / :submit / :image / :reset / :button / :file / :selected / :enabled / :disabled / :checked
-
-#### 执行操作
-
-- 内容操作
- - 获取/修改内容:html() / text() / replaceWith() / remove()
- - 获取/设置元素:before() / after() / prepend() / append() / remove() / clone() / unwrap() / detach() / empty() / add()
- - 获取/修改属性:attr() / removeAttr() / addClass() / removeClass() / css()
- - 获取/设置表单值:val()
-- 查找操作
- - 查找方法:find() / parent() / children() / siblings() / next() / nextAll() / prev() / prevAll()
- - 筛选器:filter() / not() / has() / is() / contains()
- - 索引编号:eq()
-- 尺寸和位置
- - 尺寸相关:height() / width() / innerHeight() / innerWidth() / outerWidth() / outerHeight()
- - 位置相关:offset() / position() / scrollLeft() / scrollTop()
-- 特效和动画
- - 基本动画:show() / hide() / toggle()
- - 消失出现:fadeIn() / fadeOut() / fadeTo() / fadeToggle()
- - 滑动效果:slideDown() / slideUp() / slideToggle()
- - 自定义:delay() / stop() / animate()
-- 事件
- - 文档加载:ready() / load()
- - 用户交互:on() / off()
-
-#### 链式操作
-
-#### 检测页面是否可用
-
-```HTML
-
-```
-
-```HTML
-
-```
-
-#### jQuery插件
-
-- jQuery Validation
-- jQuery Treeview
-- jQuery Autocomplete
-- jQuery UI
-
-#### 避免和其他库的冲突
-
-先引入其他库再引入jQuery的情况。
-
-```HTML
-
-
-
-```
-
-先引入jQuery再引入其他库的情况。
-
-```HTML
-
-
-
-```
-
-#### 使用Ajax
-
-- 原生的Ajax
-- 基于jQuery的Ajax
- - 加载内容
- - 提交表单
-
-### 使用Bootstrap
-
-#### 特点
-
-1. 支持主流的浏览器和移动设备
-2. 容易上手
-3. 响应式设计
-
-#### 内容
-
-1. 网格系统
-2. 封装的CSS
-3. 现成的组件
-4. JavaScript插件
-
diff --git a/Day21-30/classical_layout.html b/Day21-30/classical_layout.html
deleted file mode 100644
index ba4e84591..000000000
--- a/Day21-30/classical_layout.html
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Day21-30/example.html b/Day21-30/example.html
deleted file mode 100644
index ae77ce585..000000000
--- a/Day21-30/example.html
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Day21-30/form.html b/Day21-30/form.html
deleted file mode 100644
index 609e1d8ac..000000000
--- a/Day21-30/form.html
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Day21-30/form_and_table.html b/Day21-30/form_and_table.html
deleted file mode 100644
index 2d5456b38..000000000
--- a/Day21-30/form_and_table.html
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
-
- 用户登录
-
-
-
-
-
-
-
- |
- 成都 |
- 北京 |
- 杭州 |
-
-
- Python从入门到住院全国巡演 |
- 2018年2月28日 上午9:30 |
- 2018年3月28日 上午9:30 |
- 2018年4月28日 上午9:30 |
-
-
- MySQL从删库到跑路公开课 |
- 2018年2月27日 上午9:30 |
- 2018年3月5日 上午9:30 |
- 2018年4月2日 上午9:30 |
-
-
- Django从学习到上吊交流会 |
- 2018年2月28日 上午9:30 |
- |
- 2018年5月21日 上午9:30 |
-
-
- 爬虫从精通到坐牢无遮大会 |
- 2018年3月3日 上午9:30 |
- 2018年4月17日 上午9:30 |
- 2018年1月15日 上午9:30 |
-
-
-
-
-
\ No newline at end of file
diff --git a/Day21-30/img/Thumbs.db b/Day21-30/img/Thumbs.db
deleted file mode 100644
index cd04faa74..000000000
Binary files a/Day21-30/img/Thumbs.db and /dev/null differ
diff --git a/Day21-30/img/a1.jpg b/Day21-30/img/a1.jpg
deleted file mode 100644
index eed94cd4a..000000000
Binary files a/Day21-30/img/a1.jpg and /dev/null differ
diff --git a/Day21-30/img/a2.jpg b/Day21-30/img/a2.jpg
deleted file mode 100644
index dfefd6c74..000000000
Binary files a/Day21-30/img/a2.jpg and /dev/null differ
diff --git a/Day21-30/img/a3.jpg b/Day21-30/img/a3.jpg
deleted file mode 100644
index 01323ade9..000000000
Binary files a/Day21-30/img/a3.jpg and /dev/null differ
diff --git a/Day21-30/jquery3.html b/Day21-30/jquery3.html
deleted file mode 100644
index 0d4798bed..000000000
--- a/Day21-30/jquery3.html
+++ /dev/null
@@ -1,319 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 海澜之家/Heilan Home春装商务白衬衫男修身HNCAD3A067Y 漂白(69) 漂
-
-
-
¥138.00
-
-
-
-
-
-
¥138.00
-
-
-
-
-
-
-
-
-
- HLA海澜之家长袖衬衫男牛津纺休闲干净透气HNEAJ1E048A浅灰
-
-
-
¥128.00
-
-
-
-
-
-
¥128.00
-
-
-
-
-
-
-
-
-
- HLA海澜之家牛津纺清新休闲衬衫2018春季新品质感柔软长袖衬衫男
-
-
-
¥99.00
-
-
-
-
-
-
¥99.00
-
-
-
-
-
-
-
-
-
diff --git a/Day21-30/js/jquery.min.js b/Day21-30/js/jquery.min.js
deleted file mode 100644
index e83647587..000000000
--- a/Day21-30/js/jquery.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
-}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,""],area:[1,""],param:[1,""],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:l.htmlSerialize?[0,"",""]:[1,"X","
"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/
+ ```
+
+2. 数据绑定(声明式渲染 )。
+
+ ```HTML
+
+
{{ product }}库存信息
+
+
+
+
+ ```
+
+3. 条件与循环。
+
+ ```HTML
+
+
库存信息
+
+
+ -
+ {{ product.name }} - {{ product.quantity }}
+
+ 已经售罄
+
+
+
+
+
+
+
+ ```
+
+4. 计算属性。
+
+ ```HTML
+
+
库存信息
+
+
+ -
+ {{ product.name }} - {{ product.quantity }}
+
+ 已经售罄
+
+
+
+
库存总量:{{ totalQuantity }}台
+
+
+
+
+ ```
+
+5. 处理事件。
+
+ ```HTML
+
+
库存信息
+
+
+ -
+ {{ product.name }} - {{ product.quantity }}
+
+ 已经售罄
+
+
+
+
+
库存总量:{{ totalQuantity }}台
+
+
+
+
+ ```
+
+6. 用户输入。
+
+ ```HTML
+
+
库存信息
+
+
+
库存总量:{{ totalQuantity }}台
+
+
+
+
+ ```
+
+7. 通过网络加载JSON数据。
+
+ ```HTML
+
+
库存信息
+
+ -
+ {{ product.name }} - {{ product.quantity }}
+
+ 已经售罄
+
+
+
+
+
+
+
+ ```
+
+##### 使用脚手架 - vue-cli
+
+Vue为商业项目开发提供了非常便捷的脚手架工具vue-cli,通过工具可以省去手工配置开发环境、测试环境和运行环境的步骤,让开发者只需要关注要解决的问题。
+
+1. 安装脚手架。
+2. 创建项目。
+3. 安装依赖包。
+4. 运行项目。
+
+
+#### UI框架 - [Element]()
+
+基于Vue 2.0的桌面端组件库,用于构造用户界面,支持响应式布局。
+
+1. 引入Element的CSS和JavaScript文件。
+
+ ```HTML
+
+
+
+
+ ```
+
+2. 一个简单的例子。
+
+ ```HTML
+
+
+
+
+
+
+
+
+
点我
+
+ 开始使用Element吧
+
+
+
+
+
+
+
+ ```
+
+3. 使用组件。
+
+ ```HTML
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+
+#### 报表框架 - [ECharts]()
+
+百度出品的开源可视化库,常用于生成各种类型的报表。
+
+
+
+#### 基于弹性盒子的CSS框架 - [Bulma]()
+
+Bulma是一个基于Flexbox的现代化的CSS框架,其初衷就是移动优先(Mobile First),模块化设计,可以轻松用来实现各种简单或者复杂的内容布局,即使不懂CSS的开发者也能够使用它定制出漂亮的页面。
+
+```HTML
+
+
+
+
+ Bulma
+
+
+
+
+
+
+
+
+
+
+ One |
+ Two |
+
+
+ Three |
+ Four |
+
+
+ Five |
+ Six |
+
+
+ Seven |
+ Eight |
+
+
+ Nine |
+ Ten |
+
+
+ Eleven |
+ Twelve |
+
+
+
+
+
+```
+
+#### 响应式布局框架 - [Bootstrap]()
+
+用于快速开发Web应用程序的前端框架,支持响应式布局。
+
+1. 特点
+ - 支持主流的浏览器和移动设备
+ - 容易上手
+ - 响应式设计
+
+2. 内容
+ - 网格系统
+ - 封装的CSS
+ - 现成的组件
+ - JavaScript插件
+
+3. 可视化
+
+ 
\ No newline at end of file
diff --git "a/Day31-35/34-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md" "b/Day31-35/34-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md"
new file mode 100755
index 000000000..86fec533b
--- /dev/null
+++ "b/Day31-35/34-35.\347\216\251\350\275\254Linux\346\223\215\344\275\234\347\263\273\347\273\237.md"
@@ -0,0 +1,1889 @@
+玩转Linux操作系统
+
+> **说明**:本文中对Linux命令的讲解都是基于名为CentOS的Linux发行版本,我自己使用的是阿里云服务器,系统版本为CentOS Linux release 7.6.1810。不同的Linux发行版本在Shell命令和工具程序上会有一些差别,但是这些差别是很小的。
+
+### 操作系统发展史
+
+只有硬件没有软件的计算机系统被称之为“裸机”,我们很难用“裸机”来完成计算机日常的工作(如存储和运算),所以必须用特定的软件来控制硬件的工作。最靠近计算机硬件的软件是系统软件,其中最为重要的就是“操作系统”。“操作系统”是控制和管理整个计算机硬件和软件资源、实现资源分配和任务调配、为系统用户以及其他软件提供接口和环境的程序的集合。
+
+#### 没有操作系统(手工操作)
+
+在计算机诞生之初没有操作系统的年代,人们先把程序纸带(或卡片)装上计算机,然后启动输入机把程序送入计算机,接着通过控制台开关启动程序运行。当程序执行完毕,打印机输出计算的结果,用户卸下并取走纸带(或卡片)。第二个用户上机,重复同样的步骤。在整个过程中用户独占机器,CPU等待手工操作,资源利用率极低。
+
+#### 批处理系统
+
+首先启动计算机上的一个监督程序,在监督程序的控制下,计算机能够自动的、成批的处理一个或多个用户的作业。完成一批作业后,监督程度又从输入机读取作业存入磁带机。按照上面的步骤重复处理任务。监督程序不停的处理各个作业,实现了作业的自动转接,减少了作业的建立时间和手工操作时间,提高了计算机资源的利用率。 批处理系统又可以分为单道批处理系统、多道批处理系统、联机批处理系统、脱机批处理系统。
+
+#### 分时系统和实时系统
+
+分时系统是把处理器的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。 若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时中断,把处理机让给另一作业使用,等待下一轮调度时再继续其运行。由于计算机速度很快,作业运行轮转得很快,给每个用户的感觉是他独占了一台计算机。而每个用户可以通过自己的终端向系统发出各种操作控制命令,在充分的人机交互情况下,完成作业的运行。为了解决分时系统不能及时响应用户指令的情况,又出现了能够在在严格的时间范围内完成事件处理,及时响应随机外部事件的实时系统。
+
+#### 通用操作系统
+
+1. 1960s:IBM的System/360系列的机器有了统一的操作系统OS/360。
+
+2. 1965年:AT&T的贝尔实验室加入GE和MIT的合作计划开始开发MULTICS。
+
+3. 1969年:MULTICS项目失败,Ken Tompson赋闲在家,为了玩“Space Travel”游戏用汇编语言在当时已经被淘汰的PDP-7上开发了Unics。
+
+ > 注:很难想象,Unix这么伟大的操作系统,居然是一个赋闲在家的程序员(关键是老婆回娘家还带上了孩子)在一台被淘汰的设备上为了玩游戏开发出来的。
+
+4. 1970年~1971年:Ken Thompson和Dennis Ritchie用B语言在PDP-11上重写了Unics,并在Brian Kernighan的建议下将其更名为Unix。
+
+
+
+5. 1972年~1973年:Dennis Ritchie发明了C语言来取代可移植性较差的B语言,并开启了用C语言重写Unix的工作。
+
+6. 1974年:Unix推出了里程碑意义的第5版,几乎完全用C语言来实现。
+
+7. 1979年:从Unix第7版开始,AT&T发布新的使用条款,将Unix私有化。
+
+8. 1987年:Andrew S. Tanenbaum教授为了能在课堂上为学生讲解操作系统运作的细节,决定在不使用任何AT&T的源代码前提下,自行开发与Unix兼容的操作系统以避免版权上的争议,该系统被命名为Minix。
+
+
+
+9. 1991年:Linus Torvalds就读于芬兰赫尔辛基大学期间,尝试在Minix上做一些开发工作,但因为Minix只是作为教学用途的操作系统,功能并不强大,为了方便在学校的新闻组和邮件系统中读写和下载文件,Linus编写了磁盘驱动程序和文件系统,这些东西形成了Linux系统内核的雏形。
+
+ 
+
+下图是Unix操作系统家族的图谱。
+
+
+
+### Linux概述
+
+Linux是一个通用操作系统。一个操作系统要负责任务调度、内存分配、处理外围设备I/O等操作。操作系统通常由内核(运行其他程序,管理像磁盘、打印机等硬件设备的核心程序)和系统程序(设备驱动、底层库、shell、服务程序等)两部分组成。
+
+Linux内核是芬兰人Linus Torvalds开发的,于1991年9月发布。而Linux操作系统作为Internet时代的产物,它是由全世界许多开发者共同合作开发的,是一个自由的操作系统(注意自由和免费并不是同一个概念,想了解二者的差别可以[点击这里](https://www.debian.org/intro/free))。
+
+### Linux系统优点
+
+1. 通用操作系统,不跟特定的硬件绑定。
+2. 用C语言编写,可移植性强,有内核编程接口。
+3. 支持多用户和多任务,支持安全的分层文件系统。
+4. 大量的实用程序,完善的网络功能以及强大的支持文档。
+5. 可靠的安全性和良好的稳定性,对开发者更友好。
+
+### Linux系统发行版本
+
+1. [Redhat](https://www.redhat.com/en)
+2. [Ubuntu](https://www.ubuntu.com/)
+3. [CentOS](https://www.centos.org/)
+4. [Fedora](https://getfedora.org/)
+5. [Debian](https://www.debian.org/)
+6. [openSUSE](https://www.opensuse.org/)
+
+### 基础命令
+
+Linux系统的命令通常都是如下所示的格式:
+
+```Shell
+命令名称 [命名参数] [命令对象]
+```
+
+1. 获取登录信息 - **w** / **who** / **last**/ **lastb**。
+
+ ```Shell
+ [root ~]# w
+ 23:31:16 up 12:16, 2 users, load average: 0.00, 0.01, 0.05
+ USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
+ root pts/0 182.139.66.250 23:03 4.00s 0.02s 0.00s w
+ jackfrue pts/1 182.139.66.250 23:26 3:56 0.00s 0.00s -bash
+ [root ~]# who
+ root pts/0 2018-04-12 23:03 (182.139.66.250)
+ jackfrued pts/1 2018-04-12 23:26 (182.139.66.250)
+ [root ~]# who am i
+ root pts/0 2018-04-12 23:03 (182.139.66.250)
+ [root ~]# who mom likes
+ root pts/0 2018-04-12 23:03 (182.139.66.250)
+ [root ~]# last
+ root pts/0 117.136.63.184 Sun May 26 18:57 still logged in
+ reboot system boot 3.10.0-957.10.1. Mon May 27 02:52 - 19:10 (-7:-42)
+ root pts/4 117.136.63.184 Sun May 26 18:51 - crash (08:01)
+ root pts/4 117.136.63.184 Sun May 26 18:49 - 18:49 (00:00)
+ root pts/3 117.136.63.183 Sun May 26 18:35 - crash (08:17)
+ root pts/2 117.136.63.183 Sun May 26 18:34 - crash (08:17)
+ root pts/0 117.136.63.183 Sun May 26 18:10 - crash (08:42)
+ ```
+
+2. 查看自己使用的Shell - **ps**。
+
+ Shell也被称为“壳”或“壳程序”,它是用户与操作系统内核交流的翻译官,简单的说就是人与计算机交互的界面和接口。目前很多Linux系统默认的Shell都是bash(Bourne Again SHell),因为它可以使用tab键进行命令和路径补全、可以保存历史命令、可以方便的配置环境变量以及执行批处理操作。
+
+ ```Shell
+ [root ~]# ps
+ PID TTY TIME CMD
+ 3531 pts/0 00:00:00 bash
+ 3553 pts/0 00:00:00 ps
+ ```
+
+3. 查看命令的说明和位置 - **whatis** / **which** / **whereis**。
+
+ ```Shell
+ [root ~]# whatis ps
+ ps (1) - report a snapshot of the current processes.
+ [root ~]# whatis python
+ python (1) - an interpreted, interactive, object-oriented programming language
+ [root ~]# whereis ps
+ ps: /usr/bin/ps /usr/share/man/man1/ps.1.gz
+ [root ~]# whereis python
+ python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
+ [root ~]# which ps
+ /usr/bin/ps
+ [root ~]# which python
+ /usr/bin/python
+ ```
+
+4. 清除屏幕上显示的内容 - **clear**。
+
+5. 查看帮助文档 - **man** / **info** / **--help** / **apropos**。
+ ```Shell
+ [root@izwz97tbgo9lkabnat2lo8z ~]# ps --help
+ Usage:
+ ps [options]
+ Try 'ps --help '
+ or 'ps --help '
+ for additional help text.
+ For more details see ps(1).
+ [root@izwz97tbgo9lkabnat2lo8z ~]# man ps
+ PS(1) User Commands PS(1)
+ NAME
+ ps - report a snapshot of the current processes.
+ SYNOPSIS
+ ps [options]
+ DESCRIPTION
+ ...
+ ```
+
+6. 查看系统和主机名 - **uname** / **hostname**。
+
+ ```Shell
+ [root@izwz97tbgo9lkabnat2lo8z ~]# uname
+ Linux
+ [root@izwz97tbgo9lkabnat2lo8z ~]# hostname
+ izwz97tbgo9lkabnat2lo8z
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat /etc/centos-release
+ CentOS Linux release 7.6.1810 (Core)
+ ```
+
+ > 说明:`cat`是连接文件内容并打印到标准输出的命令,后面会讲到该命令;`/etc`是Linux系统上的一个非常重要的目录,它保存了很多的配置文件;`centos-release`是该目录下的一个文件,因为我自己使用的Linux发行版本是CentOS 7.6,因此这里会有一个这样的文件。
+
+7. 时间和日期 - **date** / **cal**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# date
+ Wed Jun 20 12:53:19 CST 2018
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# cal
+ June 2018
+ Su Mo Tu We Th Fr Sa
+ 1 2
+ 3 4 5 6 7 8 9
+ 10 11 12 13 14 15 16
+ 17 18 19 20 21 22 23
+ 24 25 26 27 28 29 30
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# cal 5 2017
+ May 2017
+ Su Mo Tu We Th Fr Sa
+ 1 2 3 4 5 6
+ 7 8 9 10 11 12 13
+ 14 15 16 17 18 19 20
+ 21 22 23 24 25 26 27
+ 28 29 30 31
+ ```
+
+8. 重启和关机 - **reboot** / **shutdown**。
+
+ ```Shell
+ [root ~]# shutdown -h +5
+ Shutdown scheduled for Sun 2019-05-26 19:34:27 CST, use 'shutdown -c' to cancel.
+ [root ~]#
+ Broadcast message from root (Sun 2019-05-26 19:29:27 CST):
+
+ The system is going down for power-off at Sun 2019-05-26 19:34:27 CST!
+ [root ~]# shutdown -c
+
+ Broadcast message from root (Sun 2019-05-26 19:30:22 CST):
+
+ The system shutdown has been cancelled at Sun 2019-05-26 19:31:22 CST!
+ [root ~]# shutdown -r 23:58
+ Shutdown scheduled for Sun 2019-05-26 23:58:00 CST, use 'shutdown -c' to cancel.
+ [root ~]# shutdown -c
+
+ Broadcast message from root (Sun 2019-05-26 19:31:06 CST):
+
+ The system shutdown has been cancelled at Sun 2019-05-26 19:32:06 CST!
+ ```
+
+ > 说明:在执行`shutdown`命令时会向登录系统的用户发出警告,可以在命令后面跟上警告消息来替换默认的警告消息,也可以在`-h`参数后通过`now`来表示立刻关机。
+
+9. 退出登录 - **exit** / **logout**。
+
+10. 查看历史命令 - **history**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# history
+ ...
+ 452 ls
+ 453 cd Python-3.6.5/
+ 454 clear
+ 455 history
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# !454
+ ```
+
+ > **说明**:查看到历史命令之后,可以用`!历史命令编号`来重新执行该命令;通过`history -c`可以清除历史命令。
+
+### 实用程序
+
+#### 文件和文件夹操作
+
+1. 创建/删除空目录 - **mkdir** / **rmdir**。
+
+ ```Shell
+ [root ~]# mkdir abc
+ [root ~]# mkdir -p xyz/abc
+ [root ~]# rmdir abc
+ ```
+
+2. 创建/删除文件 - **touch** / **rm**。
+
+ ```Shell
+ [root ~]# touch readme.txt
+ [root ~]# touch error.txt
+ [root ~]# rm error.txt
+ rm: remove regular empty file ‘error.txt’? y
+ [root ~]# rm -rf xyz
+ ```
+
+ - `touch`命令用于创建空白文件或修改文件时间。在Linux系统中一个文件有三种时间:
+ - 更改内容的时间 - mtime。
+ - 更改权限的时间 - ctime。
+ - 最后访问时间 - atime。
+ - `rm`的几个重要参数:
+ - `-i`:交互式删除,每个删除项都会进行询问。
+ - `-r`:删除目录并递归的删除目录中的文件和目录。
+ - `-f`:强制删除,忽略不存在的文件,没有任何提示。
+
+3. 切换和查看当前工作目录 - **cd** / **pwd**。
+
+ > 说明:`cd`命令后面可以跟相对路径(以当前路径作为参照)或绝对路径(以`/`开头)来切换到指定的目录,也可以用`cd ..`来返回上一级目录。请大家想一想,如果要返回到上上一级目录应该给`cd`命令加上什么样的参数呢?
+
+4. 查看目录内容 - **ls**。
+
+ - `-l`:以长格式查看文件和目录。
+ - `-a`:显示以点开头的文件和目录(隐藏文件)。
+ - `-R`:遇到目录要进行递归展开(继续列出目录下面的文件和目录)。
+ - `-d`:只列出目录,不列出其他内容。
+ - `-S` / `-t`:按大小/时间排序。
+
+5. 查看文件内容 - **cat** / **tac** / **head** / **tail** / **more** / **less** / **rev** / **od**。
+
+ ```Shell
+ [root ~]# wget http://www.sohu.com/ -O sohu.html
+ --2018-06-20 18:42:34-- http://www.sohu.com/
+ Resolving www.sohu.com (www.sohu.com)... 14.18.240.6
+ Connecting to www.sohu.com (www.sohu.com)|14.18.240.6|:80... connected.
+ HTTP request sent, awaiting response... 200 OK
+ Length: 212527 (208K) [text/html]
+ Saving to: ‘sohu.html’
+ 100%[==================================================>] 212,527 --.-K/s in 0.03s
+ 2018-06-20 18:42:34 (7.48 MB/s) - ‘sohu.html’ saved [212527/212527]
+ [root ~]# cat sohu.html
+ ...
+ [root ~]# head -10 sohu.html
+
+
+
+ 搜狐
+
+
+
+
+
+ [root ~]# tail -2 sohu.html
+
+
+ [root ~]# less sohu.html
+ ...
+ [root ~]# cat -n sohu.html | more
+ ...
+ ```
+
+ > **说明**:上面用到了一个名为`wget`的命令,它是一个网络下载器程序,可以从指定的URL下载资源。
+
+6. 拷贝/移动文件 - **cp** / **mv**。
+
+ ```Shell
+ [root ~]# mkdir backup
+ [root ~]# cp sohu.html backup/
+ [root ~]# cd backup
+ [root backup]# ls
+ sohu.html
+ [root backup]# mv sohu.html sohu_index.html
+ [root backup]# ls
+ sohu_index.html
+ ```
+
+7. 文件重命名 - **rename**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# rename .htm .html *.htm
+ ```
+
+8. 查找文件和查找内容 - **find** / **grep**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# find / -name "*.html"
+ /root/sohu.html
+ /root/backup/sohu_index.html
+ [root@izwz97tbgo9lkabnat2lo8z ~]# find . -atime 7 -type f -print
+ [root@izwz97tbgo9lkabnat2lo8z ~]# find . -type f -size +2k
+ [root@izwz97tbgo9lkabnat2lo8z ~]# find . -type f -name "*.swp" -delete
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# grep "
+ 24:
+ 25:
+ 26:
+ 29:
+ ...
+ ```
+ > **说明**:`grep`在搜索字符串时可以使用正则表达式,如果需要使用正则表达式可以用`grep -E`或者直接使用`egrep`。
+
+9. 创建链接和查看链接 - **ln** / **readlink**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html
+ -rw-r--r-- 1 root root 212131 Jun 20 19:15 sohu.html
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln /root/sohu.html /root/backup/sohu_backup
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html
+ -rw-r--r-- 2 root root 212131 Jun 20 19:15 sohu.html
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln /root/sohu.html /root/backup/sohu_backup2
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sohu.html
+ -rw-r--r-- 3 root root 212131 Jun 20 19:15 sohu.html
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ln -s /etc/centos-release sysinfo
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls -l sysinfo
+ lrwxrwxrwx 1 root root 19 Jun 20 19:21 sysinfo -> /etc/centos-release
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat sysinfo
+ CentOS Linux release 7.4.1708 (Core)
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat /etc/centos-release
+ CentOS Linux release 7.4.1708 (Core)
+ ```
+
+ > **说明**:链接可以分为硬链接和软链接(符号链接)。硬链接可以认为是一个指向文件数据的指针,就像Python中对象的引用计数,每添加一个硬链接,文件的对应链接数就增加1,只有当文件的链接数为0时,文件所对应的存储空间才有可能被其他文件覆盖。我们平常删除文件时其实并没有删除硬盘上的数据,我们删除的只是一个指针,或者说是数据的一条使用记录,所以类似于“文件粉碎机”之类的软件在“粉碎”文件时除了删除文件指针,还会在文件对应的存储区域填入数据来保证文件无法再恢复。软链接类似于Windows系统下的快捷方式,当软链接链接的文件被删除时,软链接也就失效了。
+
+10. 压缩/解压缩和归档/解归档 - **gzip** / **gunzip** / **xz**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# wget http://download.redis.io/releases/redis-4.0.10.tar.gz
+ --2018-06-20 19:29:59-- http://download.redis.io/releases/redis-4.0.10.tar.gz
+ Resolving download.redis.io (download.redis.io)... 109.74.203.151
+ Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.
+ HTTP request sent, awaiting response... 200 OK
+ Length: 1738465 (1.7M) [application/x-gzip]
+ Saving to: ‘redis-4.0.10.tar.gz’
+ 100%[==================================================>] 1,738,465 70.1KB/s in 74s
+ 2018-06-20 19:31:14 (22.9 KB/s) - ‘redis-4.0.10.tar.gz’ saved [1738465/1738465]
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls redis*
+ redis-4.0.10.tar.gz
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# gunzip redis-4.0.10.tar.gz
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# ls redis*
+ redis-4.0.10.tar
+ ```
+
+11. 归档和解归档 - **tar**。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# tar -xvf redis-4.0.10.tar
+ redis-4.0.10/
+ redis-4.0.10/.gitignore
+ redis-4.0.10/00-RELEASENOTES
+ redis-4.0.10/BUGS
+ redis-4.0.10/CONTRIBUTING
+ redis-4.0.10/COPYING
+ redis-4.0.10/INSTALL
+ redis-4.0.10/MANIFESTO
+ redis-4.0.10/Makefile
+ redis-4.0.10/README.md
+ redis-4.0.10/deps/
+ redis-4.0.10/deps/Makefile
+ redis-4.0.10/deps/README.md
+ ...
+ ```
+
+ > 说明:归档(也称为创建归档)和解归档都使用`tar`命令,通常创建归档需要`-cvf`三个参数,其中`c`表示创建(create),`v`表示显示创建归档详情(verbose),`f`表示指定归档的文件(file);解归档需要加上`-xvf`参数,其中`x`表示抽取(extract),其他两个参数跟创建归档相同。
+
+12. 将标准输入转成命令行参数 - **xargs**。
+
+ 下面的命令会将查找当前路径下的html文件,然后通过`xargs`将这些文件作为参数传给`rm`命令,实现查找并删除文件的操作。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# find . -type f -name "*.html" | xargs rm -f
+ ```
+
+ 下面的命令将a.txt文件中的多行内容变成一行输出到b.txt文件中,其中`<`表示从a.txt中读取输入,`>`表示将命令的执行结果输出到b.txt中。
+
+ ```Shell
+ [root@iZwz97tbgo9lkabnat2lo8Z ~]# xargs < a.txt > b.txt
+ ```
+
+ > **说明**:这个命令就像上面演示的那样常在管道(实现进程间通信的一种方式)和重定向(重新指定输入输出的位置)操作中用到,后面的内容中会讲到管道操作和输入输出重定向操作。
+
+13. 显示文件或目录 - **basename** / **dirname**。
+
+14. 其他相关工具。
+
+ - **sort** - 对内容排序
+ - **uniq** - 去掉相邻重复内容
+ - **tr** - 替换指定内容为新内容
+ - **cut** / **paste** - 剪切/黏贴内容
+ - **split** - 拆分文件
+ - **file** - 判断文件类型
+ - **wc** - 统计文件行数、单词数、字节数
+ - **iconv** - 编码转换
+
+ ```Shell
+ [root ~]# cat foo.txt
+ grape
+ apple
+ pitaya
+ [root ~]# cat bar.txt
+ 100
+ 200
+ 300
+ 400
+ [root ~]# paste foo.txt bar.txt
+ grape 100
+ apple 200
+ pitaya 300
+ 400
+ [root ~]# paste foo.txt bar.txt > hello.txt
+ [root ~]# cut -b 4-8 hello.txt
+ pe 10
+ le 20
+ aya 3
+ 0
+ [root ~]# cat hello.txt | tr '\t' ','
+ grape,100
+ apple,200
+ pitaya,300
+ ,400
+ [root ~]# split -l 100 sohu.html hello
+ [root ~]# wget https://www.baidu.com/img/bd_logo1.png
+ [root ~]# file bd_logo1.png
+ bd_logo1.png: PNG image data, 540 x 258, 8-bit colormap, non-interlaced
+ [root ~]# wc sohu.html
+ 2979 6355 212527 sohu.html
+ [root ~]# wc -l sohu.html
+ 2979 sohu.html
+ [root ~]# wget http://www.qq.com -O qq.html
+ [root ~]# iconv -f gb2312 -t utf-8 qq.html
+ ```
+
+#### 管道和重定向
+
+1. 管道的使用 - **\|**。
+
+ 例子:查找当前目录下文件个数。
+
+ ```Shell
+ [root ~]# find ./ | wc -l
+ 6152
+ ```
+
+ 例子:列出当前路径下的文件和文件夹,给每一项加一个编号。
+
+ ```Shell
+ [root ~]# ls | cat -n
+ 1 dump.rdb
+ 2 mongodb-3.6.5
+ 3 Python-3.6.5
+ 4 redis-3.2.11
+ 5 redis.conf
+ ```
+
+ 例子:查找record.log中包含AAA,但不包含BBB的记录的总数
+
+ ```Shell
+ [root ~]# cat record.log | grep AAA | grep -v BBB | wc -l
+ ```
+
+2. 输出重定向和错误重定向 - **\>** / **>>** / **2\>**。
+
+ ```Shell
+ [root ~]# cat readme.txt
+ banana
+ apple
+ grape
+ apple
+ grape
+ watermelon
+ pear
+ pitaya
+ [root ~]# cat readme.txt | sort | uniq > result.txt
+ [root ~]# cat result.txt
+ apple
+ banana
+ grape
+ pear
+ pitaya
+ watermelon
+ ```
+
+3. 输入重定向 - **\<**。
+
+ ```Shell
+ [root ~]# echo 'hello, world!' > hello.txt
+ [root ~]# wall < hello.txt
+ [root ~]#
+ Broadcast message from root (Wed Jun 20 19:43:05 2018):
+ hello, world!
+ [root ~]# echo 'I will show you some code.' >> hello.txt
+ [root ~]# wall < hello.txt
+ [root ~]#
+ Broadcast message from root (Wed Jun 20 19:43:55 2018):
+ hello, world!
+ I will show you some code.
+ ```
+
+4. 多重定向 - **tee**。
+
+ 下面的命令除了在终端显示命令`ls`的结果之外,还会追加输出到`ls.txt`文件中。
+
+ ```Shell
+ [root ~]# ls | tee -a ls.txt
+ ```
+
+#### 别名
+
+1. **alias**
+
+ ```Shell
+ [root ~]# alias ll='ls -l'
+ [root ~]# alias frm='rm -rf'
+ [root ~]# ll
+ ...
+ drwxr-xr-x 2 root root 4096 Jun 20 12:52 abc
+ ...
+ [root ~]# frm abc
+ ```
+
+2. **unalias**
+
+ ```Shell
+ [root ~]# unalias frm
+ [root ~]# frm sohu.html
+ -bash: frm: command not found
+ ```
+
+#### 文本处理
+
+1. 字符流编辑器 - **sed**。
+
+ sed是操作、过滤和转换文本内容的工具。假设有一个名为fruit.txt的文件,内容如下所示。
+
+ ```Shell
+ [root ~]# cat -n fruit.txt
+ 1 banana
+ 2 grape
+ 3 apple
+ 4 watermelon
+ 5 orange
+ ```
+
+ 接下来,我们在第2行后面添加一个pitaya。
+
+ ```Shell
+ [root ~]# sed '2a pitaya' fruit.txt
+ banana
+ grape
+ pitaya
+ apple
+ watermelon
+ orange
+ ```
+
+ > 注意:刚才的命令和之前我们讲过的很多命令一样并没有改变fruit.txt文件,而是将添加了新行的内容输出到终端中,如果想保存到fruit.txt中,可以使用输出重定向操作。
+
+ 在第2行前面插入一个waxberry。
+
+ ```Shell
+ [root ~]# sed '2i waxberry' fruit.txt
+ banana
+ waxberry
+ grape
+ apple
+ watermelon
+ orange
+ ```
+
+ 删除第3行。
+
+ ```Shell
+ [root ~]# sed '3d' fruit.txt
+ banana
+ grape
+ watermelon
+ orange
+ ```
+
+ 删除第2行到第4行。
+
+ ```Shell
+ [root ~]# sed '2,4d' fruit.txt
+ banana
+ orange
+ ```
+
+ 将文本中的字符a替换为@。
+
+ ```Shell
+ [root ~]# sed 's#a#@#' fruit.txt
+ b@nana
+ gr@pe
+ @pple
+ w@termelon
+ or@nge
+ ```
+
+ 将文本中的字符a替换为@,使用全局模式。
+
+ ```Shell
+ [root ~]# sed 's#a#@#g' fruit.txt
+ b@n@n@
+ gr@pe
+ @pple
+ w@termelon
+ or@nge
+ ```
+
+2. 模式匹配和处理语言 - **awk**。
+
+ awk是一种编程语言,也是Linux系统中处理文本最为强大的工具,它的作者之一和现在的维护者就是之前提到过的Brian Kernighan(ken和dmr最亲密的伙伴)。通过该命令可以从文本中提取出指定的列、用正则表达式从文本中取出我们想要的内容、显示指定的行以及进行统计和运算,总之它非常强大。
+
+ 假设有一个名为fruit2.txt的文件,内容如下所示。
+
+ ```Shell
+ [root ~]# cat fruit2.txt
+ 1 banana 120
+ 2 grape 500
+ 3 apple 1230
+ 4 watermelon 80
+ 5 orange 400
+ ```
+
+ 显示文件的第3行。
+
+ ```Shell
+ [root ~]# awk 'NR==3' fruit2.txt
+ 3 apple 1230
+ ```
+
+ 显示文件的第2列。
+
+ ```Shell
+ [root ~]# awk '{print $2}' fruit2.txt
+ banana
+ grape
+ apple
+ watermelon
+ orange
+ ```
+
+ 显示文件的最后一列。
+
+ ```Shell
+ [root ~]# awk '{print $NF}' fruit2.txt
+ 120
+ 500
+ 1230
+ 80
+ 400
+ ```
+
+ 输出末尾数字大于等于300的行。
+
+ ```Shell
+ [root ~]# awk '{if($3 >= 300) {print $0}}' fruit2.txt
+ 2 grape 500
+ 3 apple 1230
+ 5 orange 400
+ ```
+
+ 上面展示的只是awk命令的冰山一角,更多的内容留给读者自己在实践中去探索。
+
+### 用户管理
+
+1. 创建和删除用户 - **useradd** / **userdel**。
+
+ ```Shell
+ [root home]# useradd hellokitty
+ [root home]# userdel hellokitty
+ ```
+
+ - `-d` - 创建用户时为用户指定用户主目录
+ - `-g` - 创建用户时指定用户所属的用户组
+
+2. 创建和删除用户组 - **groupadd** / **groupdel**。
+
+ > 说明:用户组主要是为了方便对一个组里面所有用户的管理。
+
+3. 修改密码 - **passwd**。
+
+ ```Shell
+ [root ~]# passwd hellokitty
+ New password:
+ Retype new password:
+ passwd: all authentication tokens updated successfully.
+ ```
+
+ > 说明:输入密码和确认密码没有回显且必须一气呵成的输入完成(不能使用退格键),密码和确认密码需要一致。如果使用`passwd`命令时没有指定命令作用的对象,则表示要修改当前用户的密码。如果想批量修改用户密码,可以使用`chpasswd`命令。
+
+ - `-l` / `-u` - 锁定/解锁用户。
+ - `-d` - 清除用户密码。
+ - `-e` - 设置密码立即过期,用户登录时会强制要求修改密码。
+ - `-i` - 设置密码过期多少天以后禁用该用户。
+
+4. 查看和修改密码有效期 - **chage**。
+
+ 设置hellokitty用户100天后必须修改密码,过期前15天通知该用户,过期后7天禁用该用户。
+
+ ```Shell
+ chage -M 100 -W 15 -I 7 hellokitty
+ ```
+
+5. 切换用户 - **su**。
+
+ ```Shell
+ [root ~]# su hellokitty
+ [hellokitty root]$
+ ```
+
+6. 以管理员身份执行命令 - **sudo**。
+
+ ```Shell
+ [hellokitty ~]$ ls /root
+ ls: cannot open directory /root: Permission denied
+ [hellokitty ~]$ sudo ls /root
+ [sudo] password for hellokitty:
+ ```
+
+ > **说明**:如果希望用户能够以管理员身份执行命令,用户必须要出现在sudoers名单中,sudoers文件在 `/etc`目录下,如果希望直接编辑该文件也可以使用下面的命令。
+
+7. 编辑sudoers文件 - **visudo**。
+
+ 这里使用的编辑器是vi,关于vi的知识在后面有讲解。该文件的部分内容如下所示:
+
+ ```
+ ## Allow root to run any commands anywhere
+ root ALL=(ALL) ALL
+
+ ## Allows members of the 'sys' group to run networking, software,
+ ## service management apps and more.
+ # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
+ ## Allows people in group wheel to run all commands
+ %wheel ALL=(ALL) ALL
+
+ ## Same thing without a password
+ # %wheel ALL=(ALL) NOPASSWD: ALL
+
+ ## Allows members of the users group to mount and unmount the
+ ## cdrom as root
+ # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
+
+ ## Allows members of the users group to shutdown this system
+ # %users localhost=/sbin/shutdown -h now
+ ```
+
+8. 显示用户与用户组的信息 - **id**。
+
+9. 给其他用户发消息 -**write** / **wall**。
+
+ 发送方:
+
+ ```Shell
+ [root ~]# write hellokitty
+ Dinner is on me.
+ Call me at 6pm.
+ ```
+
+ 接收方:
+
+ ```Shell
+ [hellokitty ~]$
+ Message from root on pts/0 at 17:41 ...
+ Dinner is on me.
+ Call me at 6pm.
+ EOF
+ ```
+
+10. 查看/设置是否接收其他用户发送的消息 - **mesg**。
+
+ ```Shell
+ [hellokitty ~]$ mesg
+ is y
+ [hellokitty ~]$ mesg n
+ [hellokitty ~]$ mesg
+ is n
+ ```
+
+### 文件系统
+
+#### 文件和路径
+
+1. 命名规则:文件名的最大长度与文件系统类型有关,一般情况下,文件名不应该超过255个字符,虽然绝大多数的字符都可以用于文件名,但是最好使用英文大小写字母、数字、下划线、点这样的符号。文件名中虽然可以使用空格,但应该尽可能避免使用空格,否则在输入文件名时需要用将文件名放在双引号中或者通过`\`对空格进行转义。
+2. 扩展名:在Linux系统下文件的扩展名是可选的,但是使用扩展名有助于对文件内容的理解。有些应用程序要通过扩展名来识别文件,但是更多的应用程序并不依赖文件的扩展名,就像`file`命令在识别文件时并不是依据扩展名来判定文件的类型。
+3. 隐藏文件:以点开头的文件在Linux系统中是隐藏文件(不可见文件)。
+
+#### 目录结构
+
+1. /bin - 基本命令的二进制文件。
+2. /boot - 引导加载程序的静态文件。
+3. /dev - 设备文件。
+4. **/etc** - 配置文件。
+5. /home - 普通用户主目录的父目录。
+6. /lib - 共享库文件。
+7. /lib64 - 共享64位库文件。
+8. /lost+found - 存放未链接文件。
+9. /media - 自动识别设备的挂载目录。
+10. /mnt - 临时挂载文件系统的挂载点。
+11. /opt - 可选插件软件包安装位置。
+12. /proc - 内核和进程信息。
+13. **/root** - 超级管理员用户主目录。
+14. /run - 存放系统运行时需要的东西。
+15. /sbin - 超级用户的二进制文件。
+16. /sys - 设备的伪文件系统。
+17. /tmp - 临时文件夹。
+18. **/usr** - 用户应用目录。
+19. /var - 变量数据目录。
+
+#### 访问权限
+
+1. **chmod** - 改变文件模式比特。
+
+ ```Shell
+ [root ~]# ls -l
+ ...
+ -rw-r--r-- 1 root root 211878 Jun 19 16:06 sohu.html
+ ...
+ [root ~]# chmod g+w,o+w sohu.html
+ [root ~]# ls -l
+ ...
+ -rw-rw-rw- 1 root root 211878 Jun 19 16:06 sohu.html
+ ...
+ [root ~]# chmod 644 sohu.html
+ [root ~]# ls -l
+ ...
+ -rw-r--r-- 1 root root 211878 Jun 19 16:06 sohu.html
+ ...
+ ```
+ > 说明:通过上面的例子可以看出,用`chmod`改变文件模式比特有两种方式:一种是字符设定法,另一种是数字设定法。除了`chmod`之外,可以通过`umask`来设定哪些权限将在新文件的默认权限中被删除。
+
+ 长格式查看目录或文件时显示结果及其对应权限的数值如下表所示。
+
+ 
+
+2. **chown** - 改变文件所有者。
+
+ ```Shell
+ [root ~]# ls -l
+ ...
+ -rw-r--r-- 1 root root 54 Jun 20 10:06 readme.txt
+ ...
+ [root ~]# chown hellokitty readme.txt
+ [root ~]# ls -l
+ ...
+ -rw-r--r-- 1 hellokitty root 54 Jun 20 10:06 readme.txt
+ ...
+ ```
+
+3. **chgrp** - 改变用户组。
+
+#### 磁盘管理
+
+1. 列出文件系统的磁盘使用状况 - **df**。
+
+ ```Shell
+ [root ~]# df -h
+ Filesystem Size Used Avail Use% Mounted on
+ /dev/vda1 40G 5.0G 33G 14% /
+ devtmpfs 486M 0 486M 0% /dev
+ tmpfs 497M 0 497M 0% /dev/shm
+ tmpfs 497M 356K 496M 1% /run
+ tmpfs 497M 0 497M 0% /sys/fs/cgroup
+ tmpfs 100M 0 100M 0% /run/user/0
+ ```
+
+2. 磁盘分区表操作 - **fdisk**。
+
+ ```Shell
+ [root ~]# fdisk -l
+ Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 sectors
+ Units = sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+ Disk label type: dos
+ Disk identifier: 0x000a42f4
+ Device Boot Start End Blocks Id System
+ /dev/vda1 * 2048 83884031 41940992 83 Linux
+ Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
+ Units = sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+ ```
+
+3. 磁盘分区工具 - **parted**。
+
+4. 格式化文件系统 - **mkfs**。
+
+ ```Shell
+ [root ~]# mkfs -t ext4 -v /dev/sdb
+ ```
+
+ - `-t` - 指定文件系统的类型。
+ - `-c` - 创建文件系统时检查磁盘损坏情况。
+ - `-v` - 显示详细信息。
+
+5. 文件系统检查 - **fsck**。
+
+6. 转换或拷贝文件 - **dd**。
+
+7. 挂载/卸载 - **mount** / **umount**。
+
+8. 创建/激活/关闭交换分区 - **mkswap** / **swapon** / **swapoff**。
+
+> **说明**:执行上面这些命令会带有一定的风险,如果不清楚这些命令的用法,最好不用随意使用,在使用的过程中,最好对照参考资料进行操作,并在操作前确认是否要这么做。
+
+### 编辑器 - vim
+
+1. 启动vim。可以通过`vi`或`vim`命令来启动vim,启动时可以指定文件名来打开一个文件,如果没有指定文件名,也可以在保存的时候指定文件名。
+
+ ```Shell
+ [root ~]# vim guess.py
+ ```
+
+2. 命令模式、编辑模式和末行模式:启动vim进入的是命令模式(也称为Normal模式),在命令模式下输入英文字母`i`会进入编辑模式(Insert模式),屏幕下方出现`-- INSERT --`提示;在编辑模式下按下`Esc`会回到命令模式,此时如果输入英文`:`会进入末行模式,在末行模式下输入`q!`可以在不保存当前工作的情况下强行退出vim;在命令模式下输入`v`会进入可视模式(Visual模式),可以用光标选择一个区域再完成对应的操作。
+
+3. 保存和退出vim:在命令模式下输入`:` 进入末行模式,输入`wq`可以实现保存退出;如果想放弃编辑的内容输入`q!`强行退出,这一点刚才已经提到过了;在命令模式下也可以直接输入`ZZ`实现保存退出。如果只想保存文件不退出,那么可以在末行模式下输入`w`;可以在`w`后面输入空格再指定要保存的文件名。
+
+4. 光标操作。
+
+ - 在命令模式下可以通过`h`、`j`、`k`、`l`来控制光标向左、下、上、右的方向移动,可以在字母前输入数字来表示移动的距离,例如:`10h`表示向左移动10个字符。
+ - 在命令模式下可以通过`Ctrl+y`和`Ctrl+e`来实现向上、向下滚动一行文本的操作,可以通过`Ctrl+f`和`Ctrl+b`来实现向前和向后翻页的操作。
+ - 在命令模式下可以通过输入英文字母`G`将光标移到文件的末尾,可以通过`gg`将光标移到文件的开始,也可以通过在`G`前输入数字来将光标移动到指定的行。
+
+5. 文本操作。
+
+ - 删除:在命令模式下可以用`dd`来删除整行;可以在`dd`前加数字来指定删除的行数;可以用`d$`来实现删除从光标处删到行尾的操作,也可以通过`d0`来实现从光标处删到行首的操作;如果想删除一个单词,可以使用`dw`;如果要删除全文,可以在输入`:%d`(其中`:`用来从命令模式进入末行模式)。
+ - 复制和粘贴:在命令模式下可以用`yy`来复制整行;可以在`yy`前加数字来指定复制的行数;可以通过`p`将复制的内容粘贴到光标所在的地方。
+ - 撤销和恢复:在命令模式下输入`u`可以撤销之前的操作;通过`Ctrl+r`可以恢复被撤销的操作。
+ - 对内容进行排序:在命令模式下输入`%!sort`。
+
+6. 查找和替换。
+
+ - 查找操作需要输入`/`进入末行模式并提供正则表达式来匹配与之对应的内容,例如:`/doc.*\.`,输入`n`来向前搜索,也可以输入`N`来向后搜索。
+ - 替换操作需要输入`:`进入末行模式并指定搜索的范围、正则表达式以及替换后的内容和匹配选项,例如:`:1,$s/doc.*/hello/gice`,其中:
+ - `g` - global:全局匹配。
+ - `i` - ignore case:忽略大小写匹配。
+ - `c` - confirm:替换时需要确认。
+ - `e` - error:忽略错误。
+
+7. 参数设定:在输入`:`进入末行模式后可以对vim进行设定。
+
+ - 设置Tab键的空格数:`set ts=4`
+
+ - 设置显示/不显示行号:`set nu` / `set nonu`
+
+ - 设置启用/关闭高亮语法:`syntax on` / `syntax off`
+
+ - 设置显示标尺(光标所在的行和列): `set ruler`
+
+ - 设置启用/关闭搜索结果高亮:`set hls` / `set nohls`
+
+ > 说明:如果希望上面的这些设定在每次启动vim时都能自动生效,需要将这些设定写到用户主目录下的.vimrc文件中。
+
+8. 高级技巧
+
+ - 比较多个文件。
+
+ ```Shell
+ [root ~]# vim -d foo.txt bar.txt
+ ```
+ 
+
+ - 打开多个文件。
+
+ ```Shell
+ [root ~]# vim foo.txt bar.txt hello.txt
+ ```
+
+ 启动vim后只有一个窗口显示的是foo.txt,可以在末行模式中输入`ls`查看到打开的三个文件,也可以在末行模式中输入`b `来显示另一个文件,例如可以用`:b 2`将bar.txt显示出来,可以用`:b 3`将hello.txt显示出来。
+
+ - 拆分和切换窗口。
+
+ 可以在末行模式中输入`sp`或`vs`来实现对窗口的水平或垂直拆分,这样我们就可以同时打开多个编辑窗口,通过按两次`Ctrl+w`就可以实现编辑窗口的切换,在一个窗口中执行退出操作只会关闭对应的窗口,其他的窗口继续保留。
+
+ 
+
+ - 映射快捷键:在vim下可以将一些常用操作映射为快捷键来提升工作效率。
+ - 例子1:在命令模式下输入`F4`执行从第一行开始删除10000行代码的操作。
+
+ `:map gg10000dd`。
+
+ 例子2:在编辑模式下输入`__main`直接补全为`if __name__ == '__main__':`。
+
+ `:inoremap __main if __name__ == '__main__':`
+
+ > 说明:上面例子2的`inoremap`中的`i`表示映射的键在编辑模式使用, `nore`表示不要递归,这一点非常重要,否则如果键对应的内容中又出现键本身,就会引发递归(相当于进入了死循环)。如果希望映射的快捷键每次启动vim时都能生效,需要将映射写到用户主目录下的.vimrc文件中。
+
+ - 录制宏。
+
+ - 在命令模式下输入`qa`开始录制宏(其中`a`是寄存器的名字,也可以是其他英文字母或0-9的数字)。
+
+ - 执行你的操作(光标操作、编辑操作等),这些操作都会被录制下来。
+
+ - 如果录制的操作已经完成了,按`q`结束录制。
+
+ - 通过`@a`(`a`是刚才使用的寄存器的名字)播放宏,如果要多次执行宏可以在前面加数字,例如`100@a`表示将宏播放100次。
+
+ - 可以试一试下面的例子来体验录制宏的操作,该例子来源于[Harttle Land网站](https://harttle.land/tags.html#Vim),该网站上提供了很多关于vim的使用技巧,有兴趣的可以了解一下。
+
+ 
+
+### 软件安装和配置
+
+#### 使用包管理工具
+
+1. **yum** - Yellowdog Updater Modified。
+ - `yum search`:搜索软件包,例如`yum search nginx`。
+ - `yum list installed`:列出已经安装的软件包,例如`yum list installed | grep zlib`。
+ - `yum install`:安装软件包,例如`yum install nginx`。
+ - `yum remove`:删除软件包,例如`yum remove nginx`。
+ - `yum update`:更新软件包,例如`yum update`可以更新所有软件包,而`yum update tar`只会更新tar。
+ - `yum check-update`:检查有哪些可以更新的软件包。
+ - `yum info`:显示软件包的相关信息,例如`yum info nginx`。
+2. **rpm** - Redhat Package Manager。
+ - 安装软件包:`rpm -ivh .rpm`。
+ - 移除软件包:`rpm -e `。
+ - 查询软件包:`rpm -qa`,例如可以用`rpm -qa | grep mysql`来检查是否安装了MySQL相关的软件包。
+
+下面以Nginx为例,演示如何使用yum安装软件。
+
+```Shell
+[root ~]# yum -y install nginx
+...
+Installed:
+ nginx.x86_64 1:1.12.2-2.el7
+Dependency Installed:
+ nginx-all-modules.noarch 1:1.12.2-2.el7
+ nginx-mod-http-geoip.x86_64 1:1.12.2-2.el7
+ nginx-mod-http-image-filter.x86_64 1:1.12.2-2.el7
+ nginx-mod-http-perl.x86_64 1:1.12.2-2.el7
+ nginx-mod-http-xslt-filter.x86_64 1:1.12.2-2.el7
+ nginx-mod-mail.x86_64 1:1.12.2-2.el7
+ nginx-mod-stream.x86_64 1:1.12.2-2.el7
+Complete!
+[root ~]# yum info nginx
+Loaded plugins: fastestmirror
+Loading mirror speeds from cached hostfile
+Installed Packages
+Name : nginx
+Arch : x86_64
+Epoch : 1
+Version : 1.12.2
+Release : 2.el7
+Size : 1.5 M
+Repo : installed
+From repo : epel
+Summary : A high performance web server and reverse proxy server
+URL : http://nginx.org/
+License : BSD
+Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
+ : IMAP protocols, with a strong focus on high concurrency, performance and low
+ : memory usage.
+[root ~]# nginx -v
+nginx version: nginx/1.12.2
+```
+
+移除Nginx。
+
+```Shell
+[root ~]# yum -y remove nginx
+```
+
+下面以MySQL为例,演示如何使用rpm安装软件。要安装MySQL需要先到[MySQL官方网站](https://www.mysql.com/)下载对应的[RPM文件](https://dev.mysql.com/downloads/mysql/),当然要选择和你使用的Linux系统对应的版本。MySQL现在是Oracle公司旗下的产品,在MySQL被收购后,MySQL的作者重新制作了一个MySQL的分支MariaDB,可以通过yum进行安装。
+
+```Shell
+[root mysql]# ls
+mysql-community-client-5.7.22-1.el7.x86_64.rpm
+mysql-community-common-5.7.22-1.el7.x86_64.rpm
+mysql-community-libs-5.7.22-1.el7.x86_64.rpm
+mysql-community-server-5.7.22-1.el7.x86_64.rpm
+[root mysql]# yum -y remove mariadb-libs
+[root mysql]# yum -y install libaio
+[root mysql]#rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
+...
+[root mysql]#rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
+...
+[root mysql]#rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
+...
+[root mysql]#rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
+...
+```
+
+> 说明:由于MySQL和[MariaDB](https://mariadb.org/)的底层依赖库是有冲突的,所以上面我们首先用`yum`移除了名为mariadb-libs的依赖库并安装了名为libaio支持异步I/O操作的依赖库。关于MySQL和MariaDB之间的关系,可以阅读[维基百科](https://zh.wikipedia.org/wiki/MariaDB)上关于MariaDB的介绍。
+
+移除安装的MySQL。
+
+```Shell
+[root ~]# rpm -qa | grep mysql | xargs rpm -e
+```
+
+#### 下载解压配置环境变量
+
+下面以安装MongoDB为例,演示这类软件应该如何安装。
+
+```Shell
+[root ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
+--2018-06-21 18:32:53-- https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz
+Resolving fastdl.mongodb.org (fastdl.mongodb.org)... 52.85.83.16, 52.85.83.228, 52.85.83.186, ...
+Connecting to fastdl.mongodb.org (fastdl.mongodb.org)|52.85.83.16|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 100564462 (96M) [application/x-gzip]
+Saving to: ‘mongodb-linux-x86_64-rhel70-3.6.5.tgz’
+100%[==================================================>] 100,564,462 630KB/s in 2m 9s
+2018-06-21 18:35:04 (760 KB/s) - ‘mongodb-linux-x86_64-rhel70-3.6.5.tgz’ saved [100564462/100564462]
+[root ~]# gunzip mongodb-linux-x86_64-rhel70-3.6.5.tgz
+[root ~]# tar -xvf mongodb-linux-x86_64-rhel70-3.6.5.tar
+mongodb-linux-x86_64-rhel70-3.6.5/README
+mongodb-linux-x86_64-rhel70-3.6.5/THIRD-PARTY-NOTICES
+mongodb-linux-x86_64-rhel70-3.6.5/MPL-2
+mongodb-linux-x86_64-rhel70-3.6.5/GNU-AGPL-3.0
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongodump
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongorestore
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoexport
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoimport
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongostat
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongotop
+mongodb-linux-x86_64-rhel70-3.6.5/bin/bsondump
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongofiles
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoreplay
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongoperf
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongod
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongos
+mongodb-linux-x86_64-rhel70-3.6.5/bin/mongo
+mongodb-linux-x86_64-rhel70-3.6.5/bin/install_compass
+[root ~]# vim .bash_profile
+...
+PATH=$PATH:$HOME/bin:$HOME/mongodb-linux-x86_64-rhel70-3.6.5/bin
+export PATH
+...
+[root ~]# source .bash_profile
+[root ~]# mongod --version
+db version v3.6.5
+git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
+OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
+allocator: tcmalloc
+modules: none
+build environment:
+ distmod: rhel70
+ distarch: x86_64
+ target_arch: x86_64
+[root ~]# mongo --version
+MongoDB shell version v3.6.5
+git version: a20ecd3e3a174162052ff99913bc2ca9a839d618
+OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
+allocator: tcmalloc
+modules: none
+build environment:
+ distmod: rhel70
+ distarch: x86_64
+ target_arch: x86_64
+```
+
+> 说明:当然也可以通过yum来安装MongoDB,具体可以参照[官方网站](https://docs.mongodb.com/master/administration/install-on-linux/)上给出的说明。
+
+#### 源代码构建安装
+
+1. 安装Python 3.6。
+
+ ```Shell
+ [root ~]# yum install gcc
+ [root ~]# wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
+ [root ~]# gunzip Python-3.6.5.tgz
+ [root ~]# tar -xvf Python-3.6.5.tar
+ [root ~]# cd Python-3.6.5
+ [root ~]# ./configure --prefix=/usr/local/python36 --enable-optimizations
+ [root ~]# yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
+ [root ~]# make && make install
+ ...
+ [root ~]# ln -s /usr/local/python36/bin/python3.6 /usr/bin/python3
+ [root ~]# python3 --version
+ Python 3.6.5
+ [root ~]# python3 -m pip install -U pip
+ [root ~]# pip3 --version
+ ```
+
+ > 说明:上面在安装好Python之后还需要注册PATH环境变量,将Python安装路径下bin文件夹的绝对路径注册到PATH环境变量中。注册环境变量可以修改用户主目录下的.bash_profile或者/etc目录下的profile文件,二者的区别在于前者相当于是用户环境变量,而后者相当于是系统环境变量。
+
+2. 安装Redis-3.2.12。
+
+ ```Shell
+ [root ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
+ [root ~]# gunzip redis-3.2.12.tar.gz
+ [root ~]# tar -xvf redis-3.2.12.tar
+ [root ~]# cd redis-3.2.12
+ [root ~]# make && make install
+ [root ~]# redis-server --version
+ Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=5bc5cd3c03d6ceb6
+ [root ~]# redis-cli --version
+ redis-cli 3.2.12
+ ```
+
+### 配置服务
+
+我们可以Linux系统下安装和配置各种服务,也就是说我们可以把Linux系统打造成数据库服务器、Web服务器、缓存服务器、文件服务器、消息队列服务器等等。Linux下的大多数服务都被设置为守护进程(驻留在系统后台运行,但不会因为服务还在运行而导致Linux无法停止运行),所以我们安装的服务通常名字后面都有一个字母`d`,它是英文单词`daemon`的缩写,例如:防火墙服务叫firewalld,我们之前安装的MySQL服务叫mysqld,Apache服务器叫httpd等。在安装好服务之后,可以使用`systemctl`命令或`service`命令来完成对服务的启动、停止等操作,具体操作如下所示。
+
+1. 启动防火墙服务。
+
+ ```Shell
+ [root ~]# systemctl start firewalld
+ ```
+
+2. 终止防火墙服务。
+
+ ```Shell
+ [root ~]# systemctl stop firewalld
+ ```
+
+3. 重启防火墙服务。
+
+ ```Shell
+ [root ~]# systemctl restart firewalld
+ ```
+
+4. 查看防火墙服务状态。
+
+ ```Shell
+ [root ~]# systemctl status firewalld
+ ```
+
+5. 设置/禁用防火墙服务开机自启。
+
+ ```Shell
+ [root ~]# systemctl enable firewalld
+ Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
+ Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
+ [root ~]# systemctl disable firewalld
+ Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
+ Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
+ ```
+
+### 计划任务
+
+1. 在指定的时间执行命令。
+
+ - **at** - 将任务排队,在指定的时间执行。
+ - **atq** - 查看待执行的任务队列。
+ - **atrm** - 从队列中删除待执行的任务。
+
+ 指定3天以后下午5点要执行的任务。
+
+ ```Shell
+ [root ~]# at 5pm+3days
+ at> rm -f /root/*.html
+ at>
+ job 9 at Wed Jun 5 17:00:00 2019
+ ```
+
+ 查看待执行的任务队列。
+
+ ```Shell
+ [root ~]# atq
+ 9 Wed Jun 5 17:00:00 2019 a root
+ ```
+
+ 从队列中删除指定的任务。
+
+ ```Shell
+ [root ~]$ atrm 9
+ ```
+
+2. 计划任务表 - **crontab**。
+
+ ```Shell
+ [root ~]# crontab -e
+ * * * * * echo "hello, world!" >> /root/hello.txt
+ 59 23 * * * rm -f /root/*.log
+ ```
+ > 说明:输入`crontab -e`命令会打开vim来编辑Cron表达式并指定触发的任务,上面我们定制了两个计划任务,一个是每分钟向/root目录下的hello.txt中追加输出`hello, world!`;另一个是每天23时59分执行删除/root目录下以log为后缀名的文件。如果不知道Cron表达式如何书写,可以参照/etc/crontab文件中的提示(下面会讲到)或者用搜索引擎找一下“Cron表达式在线生成器”来生成Cron表达式。
+
+ 和crontab相关的文件在`/etc`目录下,通过修改`/etc`目录下的crontab文件也能够定制计划任务。
+
+ ```Shell
+ [root ~]# cd /etc
+ [root etc]# ls -l | grep cron
+ -rw-------. 1 root root 541 Aug 3 2017 anacrontab
+ drwxr-xr-x. 2 root root 4096 Mar 27 11:56 cron.d
+ drwxr-xr-x. 2 root root 4096 Mar 27 11:51 cron.daily
+ -rw-------. 1 root root 0 Aug 3 2017 cron.deny
+ drwxr-xr-x. 2 root root 4096 Mar 27 11:50 cron.hourly
+ drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.monthly
+ -rw-r--r-- 1 root root 493 Jun 23 15:09 crontab
+ drwxr-xr-x. 2 root root 4096 Jun 10 2014 cron.weekly
+ [root etc]# vim crontab
+ 1 SHELL=/bin/bash
+ 2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
+ 3 MAILTO=root
+ 4
+ 5 # For details see man 4 crontabs
+ 6
+ 7 # Example of job definition:
+ 8 # .---------------- minute (0 - 59)
+ 9 # | .------------- hour (0 - 23)
+ 10 # | | .---------- day of month (1 - 31)
+ 11 # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
+ 12 # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
+ 13 # | | | | |
+ 14 # * * * * * user-name command to be executed
+ ```
+
+
+### 网络访问和管理
+
+1. 安全远程连接 - **ssh**。
+
+ ```Shell
+ [root ~]$ ssh root@120.77.222.217
+ The authenticity of host '120.77.222.217 (120.77.222.217)' can't be established.
+ ECDSA key fingerprint is SHA256:BhUhykv+FvnIL03I9cLRpWpaCxI91m9n7zBWrcXRa8w.
+ ECDSA key fingerprint is MD5:cc:85:e9:f0:d7:07:1a:26:41:92:77:6b:7f:a0:92:65.
+ Are you sure you want to continue connecting (yes/no)? yes
+ Warning: Permanently added '120.77.222.217' (ECDSA) to the list of known hosts.
+ root@120.77.222.217's password:
+ ```
+
+2. 通过网络获取资源 - **wget**。
+
+ - -b 后台下载模式
+ - -O 下载到指定的目录
+ - -r 递归下载
+
+3. 发送和接收邮件 - **mail**。
+
+4. 网络配置工具(旧) - **ifconfig**。
+
+ ```Shell
+ [root ~]# ifconfig eth0
+ eth0: flags=4163 mtu 1500
+ inet 172.18.61.250 netmask 255.255.240.0 broadcast 172.18.63.255
+ ether 00:16:3e:02:b6:46 txqueuelen 1000 (Ethernet)
+ RX packets 1067841 bytes 1296732947 (1.2 GiB)
+ RX errors 0 dropped 0 overruns 0 frame 0
+ TX packets 409912 bytes 43569163 (41.5 MiB)
+ TX errors 0 dropped 0 overruns 0 carrier 0 collisions
+ ```
+
+5. 网络配置工具(新) - **ip**。
+
+ ```Shell
+ [root ~]# ip address
+ 1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1
+ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+ inet 127.0.0.1/8 scope host lo
+ valid_lft forever preferred_lft forever
+ 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
+ link/ether 00:16:3e:02:b6:46 brd ff:ff:ff:ff:ff:ff
+ inet 172.18.61.250/20 brd 172.18.63.255 scope global eth0
+ valid_lft forever preferred_lft forever
+ ```
+
+6. 网络可达性检查 - **ping**。
+
+ ```Shell
+ [root ~]# ping www.baidu.com -c 3
+ PING www.a.shifen.com (220.181.111.188) 56(84) bytes of data.
+ 64 bytes from 220.181.111.188 (220.181.111.188): icmp_seq=1 ttl=51 time=36.3 ms
+ 64 bytes from 220.181.111.188 (220.181.111.188): icmp_seq=2 ttl=51 time=36.4 ms
+ 64 bytes from 220.181.111.188 (220.181.111.188): icmp_seq=3 ttl=51 time=36.4 ms
+ --- www.a.shifen.com ping statistics ---
+ 3 packets transmitted, 3 received, 0% packet loss, time 2002ms
+ rtt min/avg/max/mdev = 36.392/36.406/36.427/0.156 ms
+ ```
+
+7. 显示或管理路由表 - **route**。
+
+8. 查看网络服务和端口 - **netstat** / **ss**。
+
+ ```Shell
+ [root ~]# netstat -nap | grep nginx
+ ```
+
+9. 网络监听抓包 - **tcpdump**。
+
+10. 安全文件拷贝 - **scp**。
+
+ ```Shell
+ [root ~]# scp root@1.2.3.4:/root/guido.jpg hellokitty@4.3.2.1:/home/hellokitty/pic.jpg
+ ```
+
+11. 文件同步工具 - **rsync**。
+
+ > 说明:使用`rsync`可以实现文件的自动同步,这个对于文件服务器来说相当重要。关于这个命令的用法,我们在后面讲项目部署的时候为大家详细说明。
+
+12. 安全文件传输 - **sftp**。
+
+ ```Shell
+ [root ~]# sftp root@1.2.3.4
+ root@1.2.3.4's password:
+ Connected to 1.2.3.4.
+ sftp>
+ ```
+
+ - `help`:显示帮助信息。
+
+ - `ls`/`lls`:显示远端/本地目录列表。
+
+ - `cd`/`lcd`:切换远端/本地路径。
+
+ - `mkdir`/`lmkdir`:创建远端/本地目录。
+
+ - `pwd`/`lpwd`:显示远端/本地当前工作目录。
+
+ - `get`:下载文件。
+
+ - `put`:上传文件。
+
+ - `rm`:删除远端文件。
+
+ - `bye`/`exit`/`quit`:退出sftp。
+
+### 进程管理
+
+1. 查看进程 - **ps**。
+
+ ```Shell
+ [root ~]# ps -ef
+ UID PID PPID C STIME TTY TIME CMD
+ root 1 0 0 Jun23 ? 00:00:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
+ root 2 0 0 Jun23 ? 00:00:00 [kthreadd]
+ ...
+ [root ~]# ps -ef | grep mysqld
+ root 4943 4581 0 22:45 pts/0 00:00:00 grep --color=auto mysqld
+ mysql 25257 1 0 Jun25 ? 00:00:39 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
+ ```
+
+2. 显示进程状态树 - **pstree**。
+
+ ```Shell
+ [root ~]# pstree
+ systemd─┬─AliYunDun───18*[{AliYunDun}]
+ ├─AliYunDunUpdate───3*[{AliYunDunUpdate}]
+ ├─2*[agetty]
+ ├─aliyun-service───2*[{aliyun-service}]
+ ├─atd
+ ├─auditd───{auditd}
+ ├─dbus-daemon
+ ├─dhclient
+ ├─irqbalance
+ ├─lvmetad
+ ├─mysqld───28*[{mysqld}]
+ ├─nginx───2*[nginx]
+ ├─ntpd
+ ├─polkitd───6*[{polkitd}]
+ ├─rsyslogd───2*[{rsyslogd}]
+ ├─sshd───sshd───bash───pstree
+ ├─systemd-journal
+ ├─systemd-logind
+ ├─systemd-udevd
+ └─tuned───4*[{tuned}]
+ ```
+
+3. 查找与指定条件匹配的进程 - **pgrep**。
+
+ ```Shell
+ [root ~]$ pgrep mysqld
+ 3584
+ ```
+
+4. 通过进程号终止进程 - **kill**。
+
+ ```Shell
+ [root ~]$ kill -l
+ 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
+ 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
+ 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
+ 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
+ 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
+ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
+ 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
+ 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
+ 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
+ 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
+ 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
+ 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
+ 63) SIGRTMAX-1 64) SIGRTMAX
+ [root ~]# kill 1234
+ [root ~]# kill -9 1234
+ ```
+
+5. 通过进程名终止进程 - **killall** / **pkill**。
+
+ 结束名为mysqld的进程。
+
+ ```Shell
+ [root ~]# pkill mysqld
+ ```
+
+ 结束hellokitty用户的所有进程。
+
+ ```Shell
+ [root ~]# pkill -u hellokitty
+ ```
+
+ > 说明:这样的操作会让hellokitty用户和服务器断开连接。
+
+6. 将进程置于后台运行。
+
+ - `Ctrl+Z` - 快捷键,用于停止进程并置于后台。
+ - `&` - 将进程置于后台运行。
+
+ ```Shell
+ [root ~]# mongod &
+ [root ~]# redis-server
+ ...
+ ^Z
+ [4]+ Stopped redis-server
+ ```
+
+7. 查询后台进程 - **jobs**。
+
+ ```Shell
+ [root ~]# jobs
+ [2] Running mongod &
+ [3]- Stopped cat
+ [4]+ Stopped redis-server
+ ```
+
+8. 让进程在后台继续运行 - **bg**。
+
+ ```Shell
+ [root ~]# bg %4
+ [4]+ redis-server &
+ [root ~]# jobs
+ [2] Running mongod &
+ [3]+ Stopped cat
+ [4]- Running redis-server &
+ ```
+
+9. 将后台进程置于前台 - **fg**。
+
+ ```Shell
+ [root ~]# fg %4
+ redis-server
+ ```
+
+ > 说明:置于前台的进程可以使用`Ctrl+C`来终止它。
+
+10. 调整程序/进程运行时优先级 - **nice** / **renice**。
+
+11. 用户登出后进程继续工作 - **nohup**。
+
+ ```Shell
+ [root ~]# nohup ping www.baidu.com > result.txt &
+ ```
+
+12. 跟踪进程系统调用情况 - **strace**。
+
+ ```Shell
+ [root ~]# pgrep mysqld
+ 8803
+ [root ~]# strace -c -p 8803
+ strace: Process 8803 attached
+ ^Cstrace: Process 8803 detached
+ % time seconds usecs/call calls errors syscall
+ ------ ----------- ----------- --------- --------- ----------------
+ 99.18 0.005719 5719 1 restart_syscall
+ 0.49 0.000028 28 1 mprotect
+ 0.24 0.000014 14 1 clone
+ 0.05 0.000003 3 1 mmap
+ 0.03 0.000002 2 1 accept
+ ------ ----------- ----------- --------- --------- ----------------
+ 100.00 0.005766 5 total
+ ```
+
+ > 说明:这个命令的用法和参数都比较复杂,建议大家在真正用到这个命令的时候再根据实际需要进行了解。
+
+13. 查看当前运行级别 - **runlevel**。
+
+ ```Shell
+ [root ~]# runlevel
+ N 3
+ ```
+
+14. 实时监控进程占用资源状况 - **top**。
+
+ ```Shell
+ [root ~]# top
+ top - 23:04:23 up 3 days, 14:10, 1 user, load average: 0.00, 0.01, 0.05
+ Tasks: 65 total, 1 running, 64 sleeping, 0 stopped, 0 zombie
+ %Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+ KiB Mem : 1016168 total, 191060 free, 324700 used, 500408 buff/cache
+ KiB Swap: 0 total, 0 free, 0 used. 530944 avail Mem
+ ...
+ ```
+
+ - `-c` - 显示进程的整个路径。
+ - `-d` - 指定两次刷屏之间的间隔时间(秒为单位)。
+ - `-i` - 不显示闲置进程或僵尸进程。
+ - `-p` - 显示指定进程的信息。
+
+### 系统诊断
+
+1. 系统启动异常诊断 - **dmesg**。
+
+2. 查看系统活动信息 - **sar**。
+
+ ```Shell
+ [root ~]# sar -u -r 5 10
+ Linux 3.10.0-957.10.1.el7.x86_64 (izwz97tbgo9lkabnat2lo8z) 06/02/2019 _x86_64_ (2 CPU)
+
+ 06:48:30 PM CPU %user %nice %system %iowait %steal %idle
+ 06:48:35 PM all 0.10 0.00 0.10 0.00 0.00 99.80
+
+ 06:48:30 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
+ 06:48:35 PM 1772012 2108392 54.33 102816 1634528 784940 20.23 793328 1164704 0
+ ```
+
+ - `-A` - 显示所有设备(CPU、内存、磁盘)的运行状况。
+ - `-u` - 显示所有CPU的负载情况。
+ - `-d` - 显示所有磁盘的使用情况。
+ - `-r` - 显示内存的使用情况。
+ - `-n` - 显示网络运行状态。
+
+3. 查看内存使用情况 - **free**。
+
+ ```Shell
+ [root ~]# free
+ total used free shared buff/cache available
+ Mem: 1016168 323924 190452 356 501792 531800
+ Swap: 0 0 0
+ ```
+
+4. 虚拟内存统计 - **vmstat**。
+
+ ```Shell
+ [root ~]# vmstat
+ procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
+ r b swpd free buff cache si so bi bo in cs us sy id wa st
+ 2 0 0 204020 79036 667532 0 0 5 18 101 58 1 0 99 0 0
+ ```
+
+5. CPU信息统计 - **mpstat**。
+
+ ```Shell
+ [root ~]# mpstat
+ Linux 3.10.0-957.5.1.el7.x86_64 (iZ8vba0s66jjlfmo601w4xZ) 05/30/2019 _x86_64_ (1 CPU)
+
+ 01:51:54 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
+ 01:51:54 AM all 0.71 0.00 0.17 0.04 0.00 0.00 0.00 0.00 0.00 99.07
+ ```
+
+6. 查看进程使用内存状况 - **pmap**。
+
+ ```Shell
+ [root ~]# ps
+ PID TTY TIME CMD
+ 4581 pts/0 00:00:00 bash
+ 5664 pts/0 00:00:00 ps
+ [root ~]# pmap 4581
+ 4581: -bash
+ 0000000000400000 884K r-x-- bash
+ 00000000006dc000 4K r---- bash
+ 00000000006dd000 36K rw--- bash
+ 00000000006e6000 24K rw--- [ anon ]
+ 0000000001de0000 400K rw--- [ anon ]
+ 00007f82fe805000 48K r-x-- libnss_files-2.17.so
+ 00007f82fe811000 2044K ----- libnss_files-2.17.so
+ ...
+ ```
+
+7. 报告设备CPU和I/O统计信息 - **iostat**。
+
+ ```Shell
+ [root ~]# iostat
+ Linux 3.10.0-693.11.1.el7.x86_64 (iZwz97tbgo9lkabnat2lo8Z) 06/26/2018 _x86_64_ (1 CPU)
+ avg-cpu: %user %nice %system %iowait %steal %idle
+ 0.79 0.00 0.20 0.04 0.00 98.97
+ Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
+ vda 0.85 6.78 21.32 2106565 6623024
+ vdb 0.00 0.01 0.00 2088 0
+ ```
+
+8. 显示所有PCI设备 - **lspci**。
+
+ ```Shell
+ [root ~]# lspci
+ 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
+ 00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
+ 00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
+ 00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
+ 00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
+ 00:02.0 VGA compatible controller: Cirrus Logic GD 5446
+ 00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
+ 00:04.0 Communication controller: Red Hat, Inc. Virtio console
+ 00:05.0 SCSI storage controller: Red Hat, Inc. Virtio block device
+ 00:06.0 SCSI storage controller: Red Hat, Inc. Virtio block device
+ 00:07.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
+ ```
+
+9. 显示进程间通信设施的状态 - **ipcs**。
+
+ ```Shell
+ [root ~]# ipcs
+
+ ------ Message Queues --------
+ key msqid owner perms used-bytes messages
+
+ ------ Shared Memory Segments --------
+ key shmid owner perms bytes nattch status
+
+ ------ Semaphore Arrays --------
+ key semid owner perms nsems
+ ```
+
+### Shell编程
+
+之前我们提到过,Shell是一个连接用户和操作系统的应用程序,它提供了人机交互的界面(接口),用户通过这个界面访问操作系统内核的服务。Shell脚本是一种为Shell编写的脚本程序,我们可以通过Shell脚本来进行系统管理,同时也可以通过它进行文件操作。总之,编写Shell脚本对于使用Linux系统的人来说,应该是一项标配技能。
+
+互联网上有大量关于Shell脚本的相关知识,我不打算再此对Shell脚本做一个全面系统的讲解,我们通过下面的代码来感性的认识下Shell脚本就行了。
+
+例子1:输入两个整数m和n,计算从m到n的整数求和的结果。
+
+```Shell
+#!/usr/bin/bash
+printf 'm = '
+read m
+printf 'n = '
+read n
+a=$m
+sum=0
+while [ $a -le $n ]
+do
+ sum=$[ sum + a ]
+ a=$[ a + 1 ]
+done
+echo '结果: '$sum
+```
+
+例子2:自动创建文件夹和指定数量的文件。
+
+```Shell
+#!/usr/bin/bash
+printf '输入文件夹名: '
+read dir
+printf '输入文件名: '
+read file
+printf '输入文件数量(<1000): '
+read num
+if [ $num -ge 1000 ]
+then
+ echo '文件数量不能超过1000'
+else
+ if [ -e $dir -a -d $dir ]
+ then
+ rm -rf $dir
+ else
+ if [ -e $dir -a -f $dir ]
+ then
+ rm -f $dir
+ fi
+ fi
+ mkdir -p $dir
+ index=1
+ while [ $index -le $num ]
+ do
+ if [ $index -lt 10 ]
+ then
+ pre='00'
+ elif [ $index -lt 100 ]
+ then
+ pre='0'
+ else
+ pre=''
+ fi
+ touch $dir'/'$file'_'$pre$index
+ index=$[ index + 1 ]
+ done
+fi
+```
+
+例子3:自动安装指定版本的Redis。
+
+```Shell
+#!/usr/bin/bash
+install_redis() {
+ if ! which redis-server > /dev/null
+ then
+ cd /root
+ wget $1$2'.tar.gz' >> install.log
+ gunzip /root/$2'.tar.gz'
+ tar -xf /root/$2'.tar'
+ cd /root/$2
+ make >> install.log
+ make install >> install.log
+ echo '安装完成'
+ else
+ echo '已经安装过Redis'
+ fi
+}
+
+install_redis 'http://download.redis.io/releases/' $1
+```
+
+### 相关资源
+
+1. Linux命令行常用快捷键
+
+ | 快捷键 | 功能说明 |
+ | ---------- | -------------------------------------------- |
+ | tab | 自动补全命令或路径 |
+ | Ctrl+a | 将光标移动到命令行行首 |
+ | Ctrl+e | 将光标移动到命令行行尾 |
+ | Ctrl+f | 将光标向右移动一个字符 |
+ | Ctrl+b | 将光标向左移动一个字符 |
+ | Ctrl+k | 剪切从光标到行尾的字符 |
+ | Ctrl+u | 剪切从光标到行首的字符 |
+ | Ctrl+w | 剪切光标前面的一个单词 |
+ | Ctrl+y | 复制剪切命名剪切的内容 |
+ | Ctrl+c | 中断正在执行的任务 |
+ | Ctrl+h | 删除光标前面的一个字符 |
+ | Ctrl+d | 退出当前命令行 |
+ | Ctrl+r | 搜索历史命令 |
+ | Ctrl+g | 退出历史命令搜索 |
+ | Ctrl+l | 清除屏幕上所有内容在屏幕的最上方开启一个新行 |
+ | Ctrl+s | 锁定终端使之暂时无法输入内容 |
+ | Ctrl+q | 退出终端锁定 |
+ | Ctrl+z | 将正在终端执行的任务停下来放到后台 |
+ | !! | 执行上一条命令 |
+ | !数字 | 执行数字对应的历史命令 |
+ | !字母 | 执行最近的以字母打头的命令 |
+ | !$ / Esc+. | 获得上一条命令最后一个参数 |
+ | Esc+b | 移动到当前单词的开头 |
+ | Esc+f | 移动到当前单词的结尾 |
+
+2. man查阅命令手册的内容说明
+
+ | 手册中的标题 | 功能说明 |
+ | ------------ | ------------------------------------------------------------ |
+ | NAME | 命令的说明和介绍 |
+ | SYNOPSIS | 使用该命令的基本语法 |
+ | DESCRIPTION | 使用该命令的详细描述,各个参数的作用,有时候这些信息会出现在OPTIONS中 |
+ | OPTIONS | 命令相关参数选项的说明 |
+ | EXAMPLES | 使用该命令的参考例子 |
+ | EXIT STATUS | 命令结束的退出状态码,通常0表示成功执行 |
+ | SEE ALSO | 和命令相关的其他命令或信息 |
+ | BUGS | 和命令相关的缺陷的描述 |
+ | AUTHOR | 该命令的作者介绍 |
diff --git a/Day31-35/code/example01.py b/Day31-35/code/example01.py
new file mode 100755
index 000000000..c8d806fd6
--- /dev/null
+++ b/Day31-35/code/example01.py
@@ -0,0 +1,69 @@
+"""
+查找 - 顺序查找和二分查找
+算法:解决问题的方法(步骤)
+评价一个算法的好坏主要有两个指标:渐近时间复杂度和渐近空间复杂度,通常一个算法很难做到时间复杂度和空间复杂度都很低(因为时间和空间是不可调和的矛盾)
+表示渐近时间复杂度通常使用大O标记
+O(c):常量时间复杂度 - 哈希存储 / 布隆过滤器
+O(log_2 n):对数时间复杂度 - 折半查找
+O(n):线性时间复杂度 - 顺序查找
+O(n * log_2 n):- 对数线性时间复杂度 - 高级排序算法(归并排序、快速排序)
+O(n ** 2):平方时间复杂度 - 简单排序算法(冒泡排序、选择排序、插入排序)
+O(n ** 3):立方时间复杂度 - Floyd算法 / 矩阵乘法运算
+也称为多项式时间复杂度
+O(2 ** n):几何级数时间复杂度 - 汉诺塔
+O(3 ** n):几何级数时间复杂度
+也称为指数时间复杂度
+O(n!):阶乘时间复杂度 - 旅行经销商问题 - NP
+"""
+from math import log2, factorial
+from matplotlib import pyplot
+
+import numpy
+
+
+def seq_search(items: list, elem) -> int:
+ """顺序查找"""
+ for index, item in enumerate(items):
+ if elem == item:
+ return index
+ return -1
+
+
+def bin_search(items, elem):
+ """二分查找"""
+ start, end = 0, len(items) - 1
+ while start <= end:
+ mid = (start + end) // 2
+ if elem > items[mid]:
+ start = mid + 1
+ elif elem < items[mid]:
+ end = mid - 1
+ else:
+ return mid
+ return -1
+
+
+def main():
+ """主函数(程序入口)"""
+ num = 6
+ styles = ['r-.', 'g-*', 'b-o', 'y-x', 'c-^', 'm-+', 'k-d']
+ legends = ['对数', '线性', '线性对数', '平方', '立方', '几何级数', '阶乘']
+ x_data = [x for x in range(1, num + 1)]
+ y_data1 = [log2(y) for y in range(1, num + 1)]
+ y_data2 = [y for y in range(1, num + 1)]
+ y_data3 = [y * log2(y) for y in range(1, num + 1)]
+ y_data4 = [y ** 2 for y in range(1, num + 1)]
+ y_data5 = [y ** 3 for y in range(1, num + 1)]
+ y_data6 = [3 ** y for y in range(1, num + 1)]
+ y_data7 = [factorial(y) for y in range(1, num + 1)]
+ y_datas = [y_data1, y_data2, y_data3, y_data4, y_data5, y_data6, y_data7]
+ for index, y_data in enumerate(y_datas):
+ pyplot.plot(x_data, y_data, styles[index])
+ pyplot.legend(legends)
+ pyplot.xticks(numpy.arange(1, 7, step=1))
+ pyplot.yticks(numpy.arange(0, 751, step=50))
+ pyplot.show()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example02.py b/Day31-35/code/example02.py
new file mode 100755
index 000000000..f273fe28a
--- /dev/null
+++ b/Day31-35/code/example02.py
@@ -0,0 +1,161 @@
+"""
+排序 - 冒泡排序、选择排序、归并排序、快速排序
+冒泡排序 - O(n ** 2):两两比较,大的下沉
+35, 97, 12, 68, 55, 73, 81, 40
+35, 12, 68, 55, 73, 81, 40, [97]
+12, 35, 55, 68, 73, 40, [81]
+12, 35, 55, 68, 40, [73]
+...
+选择排序 - O(n ** 2):每次从剩下元素中选择最小
+-----------------------------------------
+归并排序 - O(n * log_2 n) - 高级排序算法
+35, 97, 12, 68, 55, 73, 81, 40
+[35, 97, 12, 68], [55, 73, 81, 40]
+[35, 97], [12, 68], [55, 73], [81, 40]
+[35], [97], [12], [68], [55], [73], [81], [40]
+[35, 97], [12, 68], [55, 73], [40, 81]
+[12, 35, 68, 97], [40, 55, 73, 81]
+[12, 35, 40, 55, 68, 73, 81, 97]
+-----------------------------------------
+快速排序 - 以枢轴为界将列表中的元素划分为两个部分,左边都比枢轴小,右边都比枢轴大
+35, 97, 12, 68, 55, 73, 81, 40
+35, 12, [40], 68, 55, 73, 81, 97
+[12], 35, [40], 68, 55, 73, 81, [97]
+[12], 35, [40], 55, [68], 73, 81, [97]
+[12], 35, [40], 55, [68], 73, [81], [97]
+"""
+
+
+class Person(object):
+ """人"""
+
+ def __init__(self, name, age):
+ self.name = name
+ self.age = age
+
+ # def __gt__(self, other):
+ # return self.name > other.name
+
+ def __str__(self):
+ return f'{self.name}: {self.age}'
+
+ def __repr__(self):
+ return self.__str__()
+
+
+def select_sort(origin_items, comp=lambda x, y: x < y):
+ """简单选择排序"""
+ items = origin_items[:]
+ for i in range(len(items) - 1):
+ min_index = i
+ for j in range(i + 1, len(items)):
+ if comp(items[j], items[min_index]):
+ min_index = j
+ items[i], items[min_index] = items[min_index], items[i]
+ return items
+
+
+# 函数的设计要尽量做到无副作用(不影响调用者)
+# 9 1 2 3 4 5 6 7 8
+# 9 2 3 4 5 6 7 8 1
+# *前面的参数叫位置参数,传参时只需要对号入座即可
+# *后面的参数叫命名关键字参数,传参时必须给出参数名和参数值
+# *args - 可变参数 - 元组
+# **kwargs - 关键字参数 - 字典
+def bubble_sort(origin_items, *, comp=lambda x, y: x > y):
+ """冒泡排序"""
+ items = origin_items[:]
+ for i in range(1, len(items)):
+ swapped = False
+ for j in range(i - 1, len(items) - i):
+ if comp(items[j], items[j + 1]):
+ items[j], items[j + 1] = items[j + 1], items[j]
+ swapped = True
+ if swapped:
+ swapped = False
+ for j in range(len(items) - i - 1, i - 1, -1):
+ if comp(items[j - 1], items[j]):
+ items[j], items[j - 1] = items[j - 1], items[j]
+ swapped = True
+ if not swapped:
+ break
+ return items
+
+
+def merge_sort(items, comp=lambda x, y: x <= y):
+ """归并排序"""
+ if len(items) < 2:
+ return items[:]
+ mid = len(items) // 2
+ left = merge_sort(items[:mid], comp)
+ right = merge_sort(items[mid:], comp)
+ return merge(left, right, comp)
+
+
+def merge(items1, items2, comp=lambda x, y: x <= y):
+ """合并(将两个有序列表合并成一个新的有序列表)"""
+ items = []
+ index1, index2 = 0, 0
+ while index1 < len(items1) and index2 < len(items2):
+ if comp(items1[index1], items2[index2]):
+ items.append(items1[index1])
+ index1 += 1
+ else:
+ items.append(items2[index2])
+ index2 += 1
+ items += items1[index1:]
+ items += items2[index2:]
+ return items
+
+
+def quick_sort(origin_items, comp=lambda x, y: x <= y):
+ """快速排序"""
+ items = origin_items[:]
+ _quick_sort(items, 0, len(items) - 1, comp)
+ return items
+
+
+def _quick_sort(items, start, end, comp):
+ """递归调用划分和排序"""
+ if start < end:
+ pos = _partition(items, start, end, comp)
+ _quick_sort(items, start, pos - 1, comp)
+ _quick_sort(items, pos + 1, end, comp)
+
+
+def _partition(items, start, end, comp):
+ """划分"""
+ pivot = items[end]
+ i = start - 1
+ for j in range(start, end):
+ if comp(items[j], pivot):
+ i += 1
+ items[i], items[j] = items[j], items[i]
+ items[i + 1], items[end] = items[end], items[i + 1]
+ return i + 1
+
+
+def main():
+ """主函数"""
+ items = [35, 97, 12, 68, 55, 73, 81, 40]
+ # print(bubble_sort(items))
+ # print(select_sort(items))
+ # print(merge_sort(items))
+ print(quick_sort(items))
+ items2 = [
+ Person('Wang', 25), Person('Luo', 39),
+ Person('Zhang', 50), Person('He', 20)
+ ]
+ # print(bubble_sort(items2, comp=lambda p1, p2: p1.age > p2.age))
+ # print(select_sort(items2, comp=lambda p1, p2: p1.name < p2.name))
+ # print(merge_sort(items2, comp=lambda p1, p2: p1.age <= p2.age))
+ print(quick_sort(items2, comp=lambda p1, p2: p1.age <= p2.age))
+ items3 = ['apple', 'orange', 'watermelon', 'durian', 'pear']
+ # print(bubble_sort(items3))
+ # print(bubble_sort(items3, comp=lambda x, y: len(x) > len(y)))
+ # print(merge_sort(items3))
+ print(merge_sort(items3))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example03.py b/Day31-35/code/example03.py
new file mode 100755
index 000000000..6f70cdc56
--- /dev/null
+++ b/Day31-35/code/example03.py
@@ -0,0 +1,76 @@
+"""
+函数递归调用 - 函数直接或者间接的调用了自身
+1. 收敛条件
+2. 递归公式
+
+n! = n * (n-1)!
+f(n) = f(n-1) + f(n-2)
+1 1 2 3 5 8 13 21 34 55 ...
+"""
+from contextlib import contextmanager
+from time import perf_counter
+
+
+def fac(num):
+ """求阶乘"""
+ assert num >= 0
+ if num in (0, 1):
+ return 1
+ return num * fac(num - 1)
+
+
+def fib2(num):
+ """普通函数"""
+ a, b = 1, 1
+ for _ in range(num - 1):
+ a, b = b, a + b
+ return a
+
+
+def fib3(num):
+ """生成器"""
+ a, b = 0, 1
+ for _ in range(num):
+ a, b = b, a + b
+ yield a
+
+
+# 动态规划 - 保存可能进行重复运算的中间结果(空间换时间)
+def fib(num, results={}):
+ """斐波拉切数"""
+ assert num > 0
+ if num in (1, 2):
+ return 1
+ try:
+ return results[num]
+ except KeyError:
+ results[num] = fib(num - 1) + fib(num - 2)
+ return results[num]
+
+
+@contextmanager
+def timer():
+ try:
+ start = perf_counter()
+ yield
+ finally:
+ end = perf_counter()
+ print(f'{end - start}秒')
+
+
+def main():
+ """主函数"""
+ # for val in fib3(20):
+ # print(val)
+ # gen = fib3(20)
+ # for _ in range(10):
+ # print(next(gen))
+ for num in range(1, 121):
+ with timer():
+ print(f'{num}: {fib(num)}')
+ # print(fac(5))
+ # print(fac(-5))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example04.py b/Day31-35/code/example04.py
new file mode 100755
index 000000000..172ffe88c
--- /dev/null
+++ b/Day31-35/code/example04.py
@@ -0,0 +1,43 @@
+"""
+贪婪法:在对问题求解时,总是做出在当前看来是最好的选择,
+不追求最优解,快速找到满意解。
+"""
+class Thing(object):
+ """物品"""
+
+ def __init__(self, name, price, weight):
+ self.name = name
+ self.price = price
+ self.weight = weight
+
+ @property
+ def value(self):
+ """价格重量比"""
+ return self.price / self.weight
+
+
+def input_thing():
+ """输入物品信息"""
+ name_str, price_str, weight_str = input().split()
+ return name_str, int(price_str), int(weight_str)
+
+
+def main():
+ """主函数"""
+ max_weight, num_of_things = map(int, input().split())
+ all_things = []
+ for _ in range(num_of_things):
+ all_things.append(Thing(*input_thing()))
+ all_things.sort(key=lambda x: x.value, reverse=True)
+ total_weight = 0
+ total_price = 0
+ for thing in all_things:
+ if total_weight + thing.weight <= max_weight:
+ print(f'小偷拿走了{thing.name}')
+ total_weight += thing.weight
+ total_price += thing.price
+ print(f'总价值: {total_price}美元')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example05.py b/Day31-35/code/example05.py
new file mode 100755
index 000000000..1b8055e83
--- /dev/null
+++ b/Day31-35/code/example05.py
@@ -0,0 +1,49 @@
+"""
+递归回溯法:叫称为试探法,按选优条件向前搜索,当搜索到某一步,
+发现原先选择并不优或达不到目标时,就退回一步重新选择。
+经典问题:骑士巡逻
+"""
+import os
+import sys
+import time
+
+SIZE = 5
+total = 0
+
+
+def print_board(board):
+ # os.system('clear')
+ for row in board:
+ for col in row:
+ print(str(col).center(4), end='')
+ print()
+
+
+def patrol(board, row, col, step=1):
+ if row >= 0 and row < SIZE and \
+ col >= 0 and col < SIZE and \
+ board[row][col] == 0:
+ board[row][col] = step
+ if step == SIZE * SIZE:
+ global total
+ total += 1
+ print(f'第{total}种走法: ')
+ print_board(board)
+ patrol(board, row - 2, col - 1, step + 1)
+ patrol(board, row - 1, col - 2, step + 1)
+ patrol(board, row + 1, col - 2, step + 1)
+ patrol(board, row + 2, col - 1, step + 1)
+ patrol(board, row + 2, col + 1, step + 1)
+ patrol(board, row + 1, col + 2, step + 1)
+ patrol(board, row - 1, col + 2, step + 1)
+ patrol(board, row - 2, col + 1, step + 1)
+ board[row][col] = 0
+
+
+def main():
+ board = [[0] * SIZE for _ in range(SIZE)]
+ patrol(board, SIZE - 1, SIZE - 1)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example06.py b/Day31-35/code/example06.py
new file mode 100755
index 000000000..e03dfd48f
--- /dev/null
+++ b/Day31-35/code/example06.py
@@ -0,0 +1,50 @@
+"""
+编码和解码 - BASE64
+0-9A-Za-z+/
+1100 0101 1001 0011 0111 0110
+00110001 00011001 00001101 00110110
+base64
+b64encode / b64decode
+-------------------------------------
+序列化和反序列化
+序列化 - 将对象变成字节序列(bytes)或者字符序列(str) - 串行化/腌咸菜
+反序列化 - 把字节序列或者字符序列还原成对象
+Python标准库对序列化的支持:
+json - 字符形式的序列化
+pickle - 字节形式的序列化
+dumps / loads
+"""
+import base64
+import json
+import redis
+
+from example02 import Person
+
+
+class PersonJsonEncoder(json.JSONEncoder):
+
+ def default(self, o):
+ return o.__dict__
+
+
+def main():
+ cli = redis.StrictRedis(host='120.77.222.217', port=6379,
+ password='123123')
+ data = base64.b64decode(cli.get('guido'))
+ with open('guido2.jpg', 'wb') as file_stream:
+ file_stream.write(data)
+ # with open('guido.jpg', 'rb') as file_stream:
+ # result = base64.b64encode(file_stream.read())
+ # cli.set('guido', result)
+ # persons = [
+ # Person('骆昊', 39), Person('王大锤', 18),
+ # Person('白元芳', 25), Person('狄仁杰', 37)
+ # ]
+ # persons = json.loads(cli.get('persons'))
+ # print(persons)
+ # cli.set('persons', json.dumps(persons, cls=PersonJsonEncoder))
+
+
+if __name__ == '__main__':
+ main()
+
diff --git a/Day31-35/code/example07.py b/Day31-35/code/example07.py
new file mode 100755
index 000000000..20a91767b
--- /dev/null
+++ b/Day31-35/code/example07.py
@@ -0,0 +1,52 @@
+"""
+哈希摘要 - 数字签名/指纹 - 单向哈希函数(没有反函数不可逆)
+应用领域:
+1. 数据库中的用户敏感信息保存成哈希摘要
+2. 给数据生成签名验证数据没有被恶意篡改
+3. 云存储服务的秒传功能(去重功能)
+"""
+
+
+class StreamHasher():
+ """摘要生成器"""
+
+ def __init__(self, algorithm='md5', size=4096):
+ """初始化方法
+ @params:
+ algorithm - 哈希摘要算法
+ size - 每次读取数据的大小
+ """
+ self.size = size
+ cls = getattr(__import__('hashlib'), algorithm.lower())
+ self.hasher = cls()
+
+
+ def digest(self, file_stream):
+ """生成十六进制的摘要字符串"""
+ # data = file_stream.read(self.size)
+ # while data:
+ # self.hasher.update(data)
+ # data = file_stream.read(self.size)
+ for data in iter(lambda: file_stream.read(self.size), b''):
+ self.hasher.update(data)
+ return self.hasher.hexdigest()
+
+ def __call__(self, file_stream):
+ return self.digest(file_stream)
+
+
+def main():
+ """主函数"""
+ hasher1 = StreamHasher()
+ hasher2 = StreamHasher('sha1')
+ hasher3 = StreamHasher('sha256')
+ with open('Python-3.7.2.tar.xz', 'rb') as file_stream:
+ print(hasher1.digest(file_stream))
+ file_stream.seek(0, 0)
+ print(hasher2.digest(file_stream))
+ file_stream.seek(0, 0)
+ print(hasher3(file_stream))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example08.py b/Day31-35/code/example08.py
new file mode 100755
index 000000000..714d4322e
--- /dev/null
+++ b/Day31-35/code/example08.py
@@ -0,0 +1,53 @@
+"""
+加密和解密
+对称加密 - 加密和解密是同一个密钥 - DES / AES
+非对称加密 - 加密和解密是不同的密钥 - RSA
+pip install pycrypto
+"""
+import base64
+
+from hashlib import md5
+
+from Crypto.Cipher import AES
+from Crypto import Random
+from Crypto.PublicKey import RSA
+
+# # AES加密的密钥(长度32个字节)
+# key = md5(b'1qaz2wsx').hexdigest()
+# # AES加密的初始向量(随机生成)
+# iv = Random.new().read(AES.block_size)
+
+
+def main():
+ """主函数"""
+ # 生成密钥对
+ key_pair = RSA.generate(1024)
+ # 导入公钥
+ pub_key = RSA.importKey(key_pair.publickey().exportKey())
+ # 导入私钥
+ pri_key = RSA.importKey(key_pair.exportKey())
+ message1 = 'hello, world!'
+ # 加密数据
+ data = pub_key.encrypt(message1.encode(), None)
+ # 对加密数据进行BASE64编码
+ message2 = base64.b64encode(data[0])
+ print(message2)
+ # 对加密数据进行BASE64解码
+ data = base64.b64decode(message2)
+ # 解密数据
+ message3 = pri_key.decrypt(data)
+ print(message3.decode())
+ # # AES - 对称加密
+ # str1 = '我爱你们!'
+ # cipher = AES.new(key, AES.MODE_CFB, iv)
+ # # 加密
+ # str2 = cipher.encrypt(str1)
+ # print(str2)
+ # # 解密
+ # cipher = AES.new(key, AES.MODE_CFB, iv)
+ # str3 = cipher.decrypt(str2)
+ # print(str3.decode())
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example09.py b/Day31-35/code/example09.py
new file mode 100755
index 000000000..c2a488ff1
--- /dev/null
+++ b/Day31-35/code/example09.py
@@ -0,0 +1,66 @@
+"""
+装饰器 - 装饰器中放置的通常都是横切关注(cross-concern)功能
+所谓横切关注功能就是很多地方都会用到但跟正常业务又逻辑没有必然联系的功能
+装饰器实际上是实现了设计模式中的代理模式 - AOP(面向切面编程)
+"""
+from functools import wraps
+from random import randint
+from time import time, sleep
+
+import pymysql
+
+
+def record(output):
+
+ def decorate(func):
+
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ start = time()
+ ret_value = func(*args, **kwargs)
+ output(func.__name__, time() - start)
+ return ret_value
+
+ return wrapper
+
+ return decorate
+
+
+def output_to_console(fname, duration):
+ print('%s: %.3f秒' % (fname, duration))
+
+
+def output_to_file(fname, duration):
+ with open('log.txt', 'a') as file_stream:
+ file_stream.write('%s: %.3f秒\n' % (fname, duration))
+
+
+def output_to_db(fname, duration):
+ con = pymysql.connect(host='localhost', port=3306,
+ database='test', charset='utf8',
+ user='root', password='123456',
+ autocommit=True)
+ try:
+ with con.cursor() as cursor:
+ cursor.execute('insert into tb_record values (default, %s, %s)',
+ (fname, '%.3f' % duration))
+ finally:
+ con.close()
+
+
+@record(output_to_console)
+def random_delay(min, max):
+ sleep(randint(min, max))
+
+
+def main():
+ for _ in range(3):
+ # print(random_delay.__name__)
+ random_delay(3, 5)
+ # for _ in range(3):
+ # # 取消掉装饰器
+ # random_delay.__wrapped__(3, 5)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example10.py b/Day31-35/code/example10.py
new file mode 100755
index 000000000..d86335142
--- /dev/null
+++ b/Day31-35/code/example10.py
@@ -0,0 +1,48 @@
+"""
+装饰类的装饰器 - 单例模式 - 一个类只能创建出唯一的对象
+上下文语法:
+__enter__ / __exit__
+"""
+import threading
+
+from functools import wraps
+
+
+def singleton(cls):
+ """单例装饰器"""
+ instances = {}
+ lock = threading.Lock()
+
+ @wraps(cls)
+ def wrapper(*args, **kwargs):
+ if cls not in instances:
+ with lock:
+ if cls not in instances:
+ instances[cls] = cls(*args, **kwargs)
+ return instances[cls]
+
+ return wrapper
+
+
+@singleton
+class President():
+
+ def __init__(self, name, country):
+ self.name = name
+ self.country = country
+
+ def __str__(self):
+ return f'{self.country}: {self.name}'
+
+
+def main():
+ print(President.__name__)
+ p1 = President('特朗普', '美国')
+ p2 = President('奥巴马', '美国')
+ print(p1 == p2)
+ print(p1)
+ print(p2)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example11.py b/Day31-35/code/example11.py
new file mode 100755
index 000000000..af7ef19e8
--- /dev/null
+++ b/Day31-35/code/example11.py
@@ -0,0 +1,23 @@
+"""
+变量的作用域以及Python搜索变量的顺序
+LEGB: Local --> Embedded --> Global --> Built-in
+global - 声明或定义全局变量(要么直接使用现有的全局作用域的变量,要么定义一个变量放到全局作用域)
+nonlocal - 声明使用嵌套作用域的变量(如果嵌套作用域没有对应的变量直接报错)
+"""
+x = 100
+
+
+def foo():
+ global x
+ x = 200
+
+ def bar():
+ x = 300
+ print(x)
+
+ bar()
+ print(x)
+
+
+foo()
+print(x)
diff --git a/Day31-35/code/example12.py b/Day31-35/code/example12.py
new file mode 100755
index 000000000..57340d40c
--- /dev/null
+++ b/Day31-35/code/example12.py
@@ -0,0 +1,65 @@
+"""
+面向对象的三大支柱:封装、继承、多态
+面向对象的设计原则:SOLID原则
+面向对象的设计模式:GoF设计模式(单例、工厂、代理、策略、迭代器)
+月薪结算系统 - 部门经理每月15000 程序员每小时200 销售员1800底薪加销售额5%提成
+"""
+from abc import ABCMeta, abstractmethod
+
+
+class Employee(metaclass=ABCMeta):
+ """员工(抽象类)"""
+
+ def __init__(self, name):
+ self.name = name
+
+ @abstractmethod
+ def get_salary(self):
+ """结算月薪(抽象方法)"""
+ pass
+
+
+class Manager(Employee):
+ """部门经理"""
+
+ def get_salary(self):
+ return 15000.0
+
+
+class Programmer(Employee):
+ """程序员"""
+
+ def __init__(self, name, working_hour=0):
+ self.working_hour = working_hour
+ super().__init__(name)
+
+ def get_salary(self):
+ return 200.0 * self.working_hour
+
+
+class Salesman(Employee):
+ """销售员"""
+
+ def __init__(self, name, sales=0.0):
+ self.sales = sales
+ super().__init__(name)
+
+ def get_salary(self):
+ return 1800.0 + self.sales * 0.05
+
+
+class EmployeeFactory():
+ """创建员工的工厂(工厂模式 - 通过工厂实现对象使用者和对象之间的解耦合)"""
+
+ @staticmethod
+ def create(emp_type, *args, **kwargs):
+ """创建员工"""
+ emp_type = emp_type.upper()
+ emp = None
+ if emp_type == 'M':
+ emp = Manager(*args, **kwargs)
+ elif emp_type == 'P':
+ emp = Programmer(*args, **kwargs)
+ elif emp_type == 'S':
+ emp = Salesman(*args, **kwargs)
+ return emp
diff --git a/Day31-35/code/example13.py b/Day31-35/code/example13.py
new file mode 100755
index 000000000..e8fcd12b0
--- /dev/null
+++ b/Day31-35/code/example13.py
@@ -0,0 +1,17 @@
+from example12 import EmployeeFactory
+
+
+def main():
+ """主函数"""
+ emps = [
+ EmployeeFactory.create('M', '曹操'),
+ EmployeeFactory.create('P', '荀彧', 120),
+ EmployeeFactory.create('P', '郭嘉', 85),
+ EmployeeFactory.create('S', '典韦', 123000),
+ ]
+ for emp in emps:
+ print('%s: %.2f元' % (emp.name, emp.get_salary()))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example14.py b/Day31-35/code/example14.py
new file mode 100755
index 000000000..216aafd94
--- /dev/null
+++ b/Day31-35/code/example14.py
@@ -0,0 +1,97 @@
+"""
+面向对象
+枚举 - 一个变量的值只有有限个选择,最适合的类型就是枚举
+通过枚举我们可以定义符号常量,符号常量优于字面常量
+"""
+from enum import Enum, unique
+
+import random
+
+
+@unique
+class Suite(Enum):
+ """花色(枚举)"""
+ SPADE, HEART, CLUB, DIAMOND = range(4)
+
+ def __lt__(self, other):
+ return self.value < other.value
+
+
+class Card():
+ """牌"""
+
+ def __init__(self, suite, face):
+ self.suite = suite
+ self.face = face
+
+ def __repr__(self):
+ return self.__str__()
+
+ def __str__(self):
+ suites = ('♠️', '♥️', '♣️', '♦️')
+ faces = ('', 'A', '2', '3', '4', '5', '6',
+ '7', '8', '9', '10', 'J', 'Q', 'K')
+ return f'{suites[self.suite.value]} {faces[self.face]}'
+
+
+class Poker():
+ """扑克"""
+
+ def __init__(self):
+ self.index = 0
+ self.cards = [Card(suite, face)
+ for suite in Suite
+ for face in range(1, 14)]
+
+ def shuffle(self):
+ """洗牌"""
+ self.index = 0
+ random.shuffle(self.cards)
+
+ def deal(self):
+ """发牌"""
+ card = self.cards[self.index]
+ self.index += 1
+ return card
+
+ @property
+ def has_more(self):
+ """是否有更多的牌"""
+ return self.index < len(self.cards)
+
+
+class Player():
+ """玩家"""
+
+ def __init__(self, name):
+ self.name = name
+ self.cards = []
+
+ def get_card(self, card):
+ """摸牌"""
+ self.cards.append(card)
+
+ def arrange(self):
+ """整理手上的牌"""
+ self.cards.sort(key=lambda card: (card.suite, card.face))
+
+
+def main():
+ """主函数"""
+ poker = Poker()
+ poker.shuffle()
+ players = [
+ Player('东邪'), Player('西毒'),
+ Player('南帝'), Player('北丐')
+ ]
+ while poker.has_more:
+ for player in players:
+ player.get_card(poker.deal())
+ for player in players:
+ player.arrange()
+ print(player.name, end=': ')
+ print(player.cards)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example15.py b/Day31-35/code/example15.py
new file mode 100755
index 000000000..39d0e2034
--- /dev/null
+++ b/Day31-35/code/example15.py
@@ -0,0 +1,75 @@
+"""
+迭代器 - __iter__ / __next__
+itertools - 生成可迭代序列的工具模块
+"""
+import itertools
+
+from math import sqrt
+
+
+def is_prime(num):
+ """判断素数"""
+ for factor in range(2, int(sqrt(num)) + 1):
+ if num % factor == 0:
+ return False
+ return True
+
+
+class PrimeIter(object):
+ """素数迭代器"""
+
+ def __init__(self, min_value, max_value):
+ assert 2 <= min_value <= max_value
+ self.min_value = min_value - 1
+ self.max_value = max_value
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ self.min_value += 1
+ while self.min_value <= self.max_value:
+ if is_prime(self.min_value):
+ return self.min_value
+ self.min_value += 1
+ raise StopIteration()
+
+
+class FibIter(object):
+ """斐波那契数迭代器"""
+
+ def __init__(self, num):
+ self.num = num
+ self.a, self.b = 0, 1
+ self.idx = 0
+
+ def __iter__(self):
+ return self
+
+ def __next__(self):
+ if self.idx < self.num:
+ self.a, self.b = self.b, self.a + self.b
+ self.idx += 1
+ return self.a
+ raise StopIteration()
+
+
+def main():
+ # for val in itertools.permutations('ABCD'):
+ # print(val)
+ # for val in itertools.combinations('ABCDE', 3):
+ # print(val)
+ # for val in itertools.product('黑红梅方', range(1, 14)):
+ # print(val)
+ # fib_iter = FibIter(20)
+ # print('===>', next(fib_iter))
+ # print('===>', next(fib_iter))
+ # for val in fib_iter:
+ # print(val)
+ prime_iter = PrimeIter(2, 100000)
+ for val in prime_iter:
+ print(val)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example16.py b/Day31-35/code/example16.py
new file mode 100755
index 000000000..bb8369420
--- /dev/null
+++ b/Day31-35/code/example16.py
@@ -0,0 +1,66 @@
+"""
+魔术方法
+如果要把自定义对象放到set或者用作dict的键
+那么必须要重写__hash__和__eq__两个魔术方法
+前者用来计算对象的哈希码,后者用来判断两个对象是否相同
+哈希码不同的对象一定是不同的对象,但哈希码相同未必是相同的对象(哈希码冲撞)
+所以在哈希码相同的时候还要通过__eq__来判定对象是否相同
+"""
+
+
+class Student():
+ __slots__ = ('stuid', 'name', 'gender')
+
+ def __init__(self, stuid, name):
+ self.stuid = stuid
+ self.name = name
+
+ def __hash__(self):
+ return hash(self.stuid) + hash(self.name)
+
+ def __eq__(self, other):
+ return self.stuid == other.stuid and \
+ self.name == other.name
+
+ def __str__(self):
+ return f'{self.stuid}: {self.name}'
+
+ def __repr__(self):
+ return self.__str__()
+
+
+class School():
+
+ def __init__(self, name):
+ self.name = name
+ self.students = {}
+
+ def __setitem__(self, key, student):
+ self.students[key] = student
+
+ def __getitem__(self, key):
+ return self.students[key]
+
+
+def main():
+ # students = set()
+ # students.add(Student(1001, '王大锤'))
+ # students.add(Student(1001, '王大锤'))
+ # students.add(Student(1001, '白元芳'))
+ # print(len(students))
+ # print(students)
+ stu = Student(1234, '骆昊')
+ stu.gender = 'Male'
+ # stu.birth = '1980-11-28'
+ print(stu.name, stu.birth)
+ school = School('千锋教育')
+ school[1001] = Student(1001, '王大锤')
+ school[1002] = Student(1002, '白元芳')
+ school[1003] = Student(1003, '白洁')
+ print(school[1002])
+ print(school[1003])
+
+
+if __name__ == '__main__':
+ main()
+
diff --git a/Day31-35/code/example17.py b/Day31-35/code/example17.py
new file mode 100755
index 000000000..4918b74f3
--- /dev/null
+++ b/Day31-35/code/example17.py
@@ -0,0 +1,54 @@
+"""
+多重继承 - 一个类有两个或者两个以上的父类
+MRO - 方法解析顺序 - Method Resolution Order
+当出现菱形继承(钻石继承)的时候,子类到底继承哪个父类的方法
+Python 2.x - 深度优先搜索
+Python 3.x - C3算法 - 类似于广度优先搜索
+"""
+class A():
+
+ def say_hello(self):
+ print('Hello, A')
+
+
+class B(A):
+ pass
+
+
+class C(A):
+
+ def say_hello(self):
+ print('Hello, C')
+
+
+class D(B, C):
+ pass
+
+
+class SetOnceMappingMixin():
+ """自定义混入类"""
+ __slots__ = ()
+
+ def __setitem__(self, key, value):
+ if key in self:
+ raise KeyError(str(key) + ' already set')
+ return super().__setitem__(key, value)
+
+
+class SetOnceDict(SetOnceMappingMixin, dict):
+ """自定义字典"""
+ pass
+
+
+def main():
+ print(D.mro())
+ # print(D.__mro__)
+ D().say_hello()
+ print(SetOnceDict.__mro__)
+ my_dict= SetOnceDict()
+ my_dict['username'] = 'jackfrued'
+ my_dict['username'] = 'hellokitty'
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example18.py b/Day31-35/code/example18.py
new file mode 100755
index 000000000..f016a6b24
--- /dev/null
+++ b/Day31-35/code/example18.py
@@ -0,0 +1,47 @@
+"""
+元 - meta
+元数据 - 描述数据的数据 - metadata
+元类 - 描述类的类 - metaclass - 继承自type
+"""
+import threading
+
+
+class SingletonMeta(type):
+ """自定义元类"""
+
+ def __init__(cls, *args, **kwargs):
+ cls.__instance = None
+ cls.lock = threading.Lock()
+ super().__init__(*args, **kwargs)
+
+ def __call__(cls, *args, **kwargs):
+ if cls.__instance is None:
+ with cls.lock:
+ if cls.__instance is None:
+ cls.__instance = super().__call__(*args, **kwargs)
+ return cls.__instance
+
+
+class President(metaclass=SingletonMeta):
+ """总统(单例类)"""
+
+ def __init__(self, name, country):
+ self.name = name
+ self.country = country
+
+ def __str__(self):
+ return f'{self.country}: {self.name}'
+
+
+def main():
+ """主函数"""
+ p1 = President('特朗普', '美国')
+ p2 = President('奥巴马', '美国')
+ p3 = President.__call__('克林顿', '美国')
+ print(p1 == p2)
+ print(p1 == p3)
+ print(p1, p2, p3, sep='\n')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example19.py b/Day31-35/code/example19.py
new file mode 100755
index 000000000..f1deea051
--- /dev/null
+++ b/Day31-35/code/example19.py
@@ -0,0 +1,94 @@
+"""
+扩展性系统性能
+- 垂直扩展 - 增加单节点处理能力
+- 水平扩展 - 将单节点变成多节点(读写分离/分布式集群)
+并发编程 - 加速程序执行 / 改善用户体验
+耗时间的任务都尽可能独立的执行,不要阻塞代码的其他部分
+- 多线程
+1. 创建Thread对象指定target和args属性并通过start方法启动线程
+2. 继承Thread类并重写run方法来定义线程执行的任务
+3. 创建线程池对象ThreadPoolExecutor并通过submit来提交要执行的任务
+第3种方式可以通过Future对象的result方法在将来获得线程的执行结果
+也可以通过done方法判定线程是否执行结束
+- 多进程
+- 异步I/O
+"""
+import glob
+import os
+import time
+
+from concurrent.futures import ThreadPoolExecutor
+from threading import Thread
+
+from PIL import Image
+
+
+# class ThumbnailThread(Thread):
+
+# def __init__(self, infile):
+# self.infile = infile
+# super().__init__()
+
+# def run(self):
+# file, ext = os.path.splitext(self.infile)
+# filename = file[file.rfind('/') + 1:]
+# for size in (32, 64, 128):
+# outfile = f'thumbnails/{filename}_{size}_{size}.png'
+# image = Image.open(self.infile)
+# image.thumbnail((size, size))
+# image.save(outfile, format='PNG')
+
+
+def gen_thumbnail(infile):
+ file, ext = os.path.splitext(infile)
+ filename = file[file.rfind('/') + 1:]
+ for size in (32, 64, 128):
+ outfile = f'thumbnails/{filename}_{size}_{size}.png'
+ image = Image.open(infile)
+ image.thumbnail((size, size))
+ image.save(outfile, format='PNG')
+
+
+# def main():
+# start = time.time()
+# threads = []
+# for infile in glob.glob('images/*'):
+# # t = Thread(target=gen_thumbnail, args=(infile, ))
+# t = ThumbnailThread(infile)
+# t.start()
+# threads.append(t)
+# for t in threads:
+# t.join()
+# end = time.time()
+# print(f'耗时: {end - start}秒')
+
+
+def main():
+ pool = ThreadPoolExecutor(max_workers=30)
+ futures = []
+ start = time.time()
+ for infile in glob.glob('images/*'):
+ # submit方法是非阻塞式的方法
+ # 即便工作线程数已经用完,submit方法也会接受提交的任务
+ future = pool.submit(gen_thumbnail, infile)
+ futures.append(future)
+ for future in futures:
+ # result方法是一个阻塞式的方法 如果线程还没有结束
+ # 暂时取不到线程的执行结果 代码就会在此处阻塞
+ future.result()
+ end = time.time()
+ print(f'耗时: {end - start}秒')
+ # shutdown也是非阻塞式的方法 但是如果已经提交的任务还没有执行完
+ # 线程池是不会停止工作的 shutdown之后再提交任务就不会执行而且会产生异常
+ pool.shutdown()
+
+
+if __name__ == '__main__':
+ main()
+
+
+
+
+
+
+
diff --git a/Day31-35/code/example20.py b/Day31-35/code/example20.py
new file mode 100755
index 000000000..06de05d4b
--- /dev/null
+++ b/Day31-35/code/example20.py
@@ -0,0 +1,27 @@
+"""
+线程间通信(共享数据)非常简单因为可以共享同一个进程的内存
+进程间通信(共享数据)比较麻烦因为操作系统会保护分配给进程的内存
+要实现多进程间的通信通常可以用系统管道、套接字、三方服务来实现
+multiprocessing.Queue
+守护线程 - daemon thread
+守护进程 - firewalld / httpd / mysqld
+在系统停机的时候不保留的进程 - 不会因为进程还没有执行结束而阻碍系统停止
+"""
+from threading import Thread
+from time import sleep
+
+
+def output(content):
+ while True:
+ print(content, end='')
+
+
+def main():
+ Thread(target=output, args=('Ping', ), daemon=True).start()
+ Thread(target=output, args=('Pong', ), daemon=True).start()
+ sleep(5)
+ print('bye!')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example21.py b/Day31-35/code/example21.py
new file mode 100755
index 000000000..002b7e86a
--- /dev/null
+++ b/Day31-35/code/example21.py
@@ -0,0 +1,66 @@
+"""
+多个线程竞争一个资源 - 保护临界资源 - 锁(Lock/RLock)
+多个线程竞争多个资源(线程数>资源数) - 信号量(Semaphore)
+多个线程的调度 - 暂停线程执行/唤醒等待中的线程 - Condition
+"""
+from concurrent.futures import ThreadPoolExecutor
+from random import randint
+from time import sleep
+
+import threading
+
+
+class Account():
+ """银行账户"""
+
+ def __init__(self, balance=0):
+ self.balance = balance
+ lock = threading.Lock()
+ self.condition = threading.Condition(lock)
+
+ def withdraw(self, money):
+ """取钱"""
+ with self.condition:
+ while money > self.balance:
+ self.condition.wait()
+ new_balance = self.balance - money
+ sleep(0.001)
+ self.balance = new_balance
+
+ def deposit(self, money):
+ """存钱"""
+ with self.condition:
+ new_balance = self.balance + money
+ sleep(0.001)
+ self.balance = new_balance
+ self.condition.notify_all()
+
+
+def add_money(account):
+ while True:
+ money = randint(5, 10)
+ account.deposit(money)
+ print(threading.current_thread().name,
+ ':', money, '====>', account.balance)
+ sleep(0.5)
+
+
+def sub_money(account):
+ while True:
+ money = randint(10, 30)
+ account.withdraw(money)
+ print(threading.current_thread().name,
+ ':', money, '<====', account.balance)
+ sleep(1)
+
+
+def main():
+ account = Account()
+ with ThreadPoolExecutor(max_workers=10) as pool:
+ for _ in range(5):
+ pool.submit(add_money, account)
+ pool.submit(sub_money, account)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example22.py b/Day31-35/code/example22.py
new file mode 100755
index 000000000..315679e30
--- /dev/null
+++ b/Day31-35/code/example22.py
@@ -0,0 +1,50 @@
+"""
+多进程和进程池的使用
+多线程因为GIL的存在不能够发挥CPU的多核特性
+对于计算密集型任务应该考虑使用多进程
+time python3 example22.py
+real 0m11.512s
+user 0m39.319s
+sys 0m0.169s
+"""
+import concurrent.futures
+import math
+
+PRIMES = [
+ 1116281,
+ 1297337,
+ 104395303,
+ 472882027,
+ 533000389,
+ 817504243,
+ 982451653,
+ 112272535095293,
+ 112582705942171,
+ 112272535095293,
+ 115280095190773,
+ 115797848077099,
+ 1099726899285419
+] * 5
+
+
+def is_prime(n):
+ """判断素数"""
+ if n % 2 == 0:
+ return False
+
+ sqrt_n = int(math.floor(math.sqrt(n)))
+ for i in range(3, sqrt_n + 1, 2):
+ if n % i == 0:
+ return False
+ return True
+
+
+def main():
+ """主函数"""
+ with concurrent.futures.ProcessPoolExecutor() as executor:
+ for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
+ print('%d is prime: %s' % (number, prime))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example23.py b/Day31-35/code/example23.py
new file mode 100755
index 000000000..51c539c9a
--- /dev/null
+++ b/Day31-35/code/example23.py
@@ -0,0 +1,47 @@
+"""
+协程(coroutine)- 可以在需要时进行切换的相互协作的子程序
+"""
+import asyncio
+
+from example15 import is_prime
+
+
+def num_generator(m, n):
+ """指定范围的数字生成器"""
+ yield from range(m, n + 1)
+
+
+async def prime_filter(m, n):
+ """素数过滤器"""
+ primes = []
+ for i in num_generator(m, n):
+ if is_prime(i):
+ print('Prime =>', i)
+ primes.append(i)
+
+ await asyncio.sleep(0.001)
+ return tuple(primes)
+
+
+async def square_mapper(m, n):
+ """平方映射器"""
+ squares = []
+ for i in num_generator(m, n):
+ print('Square =>', i * i)
+ squares.append(i * i)
+
+ await asyncio.sleep(0.001)
+ return squares
+
+
+def main():
+ """主函数"""
+ loop = asyncio.get_event_loop()
+ future = asyncio.gather(prime_filter(2, 100), square_mapper(1, 100))
+ future.add_done_callback(lambda x: print(x.result()))
+ loop.run_until_complete(future)
+ loop.close()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/Day31-35/code/example24.py b/Day31-35/code/example24.py
new file mode 100755
index 000000000..2f9666ea4
--- /dev/null
+++ b/Day31-35/code/example24.py
@@ -0,0 +1,37 @@
+"""
+aiohttp - 异步HTTP网络访问
+异步I/O(异步编程)- 只使用一个线程(单线程)来处理用户请求
+用户请求一旦被接纳,剩下的都是I/O操作,通过多路I/O复用也可以达到并发的效果
+这种做法与多线程相比可以让CPU利用率更高,因为没有线程切换的开销
+Redis/Node.js - 单线程 + 异步I/O
+Celery - 将要执行的耗时间的任务异步化处理
+异步I/O事件循环 - uvloop
+"""
+import asyncio
+import re
+
+import aiohttp
+
+
+async def fetch(session, url):
+ async with session.get(url, ssl=False) as resp:
+ return await resp.text()
+
+
+async def main():
+ pattern = re.compile(r'\(?P.*)\<\/title\>')
+ urls = ('https://www.python.org/',
+ 'https://git-scm.com/',
+ 'https://www.jd.com/',
+ 'https://www.taobao.com/',
+ 'https://www.douban.com/')
+ async with aiohttp.ClientSession() as session:
+ for url in urls:
+ html = await fetch(session, url)
+ print(pattern.search(html).group('title'))
+
+
+if __name__ == '__main__':
+ loop = asyncio.get_event_loop()
+ loop.run_until_complete(main())
+ loop.close()
diff --git a/Day31-35/code/list_by_javascript.html b/Day31-35/code/list_by_javascript.html
new file mode 100755
index 000000000..ade42f100
--- /dev/null
+++ b/Day31-35/code/list_by_javascript.html
@@ -0,0 +1,119 @@
+
+
+
+
+ 动态列表
+
+
+
+
+
+ - 苹果×
+ - 香蕉×
+ - 榴莲×
+ - 火龙果×
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Day31-35/code/list_by_jquery.html b/Day31-35/code/list_by_jquery.html
new file mode 100755
index 000000000..d6fbc1f63
--- /dev/null
+++ b/Day31-35/code/list_by_jquery.html
@@ -0,0 +1,114 @@
+
+
+
+
+ 动态列表
+
+
+
+
+
+ - 苹果×
+ - 香蕉×
+ - 榴莲×
+ - 火龙果×
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Day31-35/code/list_by_vue.html b/Day31-35/code/list_by_vue.html
new file mode 100755
index 000000000..8e944226d
--- /dev/null
+++ b/Day31-35/code/list_by_vue.html
@@ -0,0 +1,100 @@
+
+
+
+
+ 动态列表
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Day31-35/code/test_example01.py b/Day31-35/code/test_example01.py
new file mode 100755
index 000000000..e992c4e59
--- /dev/null
+++ b/Day31-35/code/test_example01.py
@@ -0,0 +1,51 @@
+"""
+单元测试 - 针对程序中最小的功能模块(函数和方法)的测试
+测试方法:
+- 白盒测试:程序自己写的测试
+- 黑盒测试:测试人员或QA,不知道代码实现细节,只关注功能
+编写Python单元测试 - 定义类继承TestCase,写测试方法(test_开头)
+执行单元测试:
+- unittest.main()
+- python3 -m unittest test_example01.py
+第三方库 - nose2 / pytest
+pip install pytest pytest-cov
+pytest -v --cov
+------------------------------
+pip install nose2 cov-core
+nose2 -v -C
+"""
+from unittest import TestCase
+
+from example01 import seq_search, bin_search
+
+
+class TestExample01(TestCase):
+ """测试查找函数的测试用例"""
+
+ # 执行每个测试函数之前要执行的方法
+ def setUp(self):
+ self.data1 = [35, 97, 12, 68, 55, 73, 81, 40]
+ self.data2 = [12, 35, 40, 55, 68, 73, 81, 97]
+
+ # 执行每个测试函数之后要执行的方法
+ def tearDown(self):
+ pass
+
+ def test_seq_search(self):
+ """测试顺序查找"""
+ self.assertEqual(0, seq_search(self.data1, 35))
+ self.assertEqual(2, seq_search(self.data1, 12))
+ self.assertEqual(6, seq_search(self.data1, 81))
+ self.assertEqual(7, seq_search(self.data1, 40))
+ self.assertEqual(-1, seq_search(self.data1, 99))
+ self.assertEqual(-1, seq_search(self.data1, 7))
+
+ def test_bin_search(self):
+ """测试二分查找"""
+ self.assertEqual(1, bin_search(self.data2, 35))
+ self.assertEqual(0, bin_search(self.data2, 12))
+ self.assertEqual(6, bin_search(self.data2, 81))
+ self.assertEqual(2, bin_search(self.data2, 40))
+ self.assertEqual(7, bin_search(self.data2, 97))
+ self.assertEqual(-1, bin_search(self.data2, 7))
+ self.assertEqual(-1, bin_search(self.data2, 99))
diff --git a/Day31-35/code/test_example02.py b/Day31-35/code/test_example02.py
new file mode 100755
index 000000000..09afa0a81
--- /dev/null
+++ b/Day31-35/code/test_example02.py
@@ -0,0 +1,24 @@
+from unittest import TestCase
+
+from example02 import select_sort, merge
+
+
+class TestExample02(TestCase):
+ """测试排序函数的测试用例"""
+
+ def setUp(self):
+ self.data1 = [35, 97, 12, 68, 55, 73, 81, 40]
+ self.items1 = [12, 35, 68, 97]
+ self.items2 = [40, 55, 73, 81]
+
+ def test_merge(self):
+ items = merge(self.items1, self.items2)
+ for i in range(len(items) - 1):
+ self.assertLessEqual(items[i], items[i + 1])
+
+ def test_select_sort(self):
+ """测试顺序查找"""
+ items = select_sort(self.data1)
+ for i in range(len(items) - 1):
+ self.assertLessEqual(items[i], items[i + 1])
+
\ No newline at end of file
diff --git a/Day31-35/res/Dennis-Ritchie.jpg b/Day31-35/res/Dennis-Ritchie.jpg
deleted file mode 100644
index e263148f9..000000000
Binary files a/Day31-35/res/Dennis-Ritchie.jpg and /dev/null differ
diff --git a/Day31-35/res/Ken-Thompson.png b/Day31-35/res/Ken-Thompson.png
deleted file mode 100644
index bcfa8d277..000000000
Binary files a/Day31-35/res/Ken-Thompson.png and /dev/null differ
diff --git a/Day31-35/res/Linus-Torvalds.jpg b/Day31-35/res/Linus-Torvalds.jpg
deleted file mode 100644
index a2889dd96..000000000
Binary files a/Day31-35/res/Linus-Torvalds.jpg and /dev/null differ
diff --git a/Day31-35/res/Stallman.jpg b/Day31-35/res/Stallman.jpg
deleted file mode 100644
index dee2532ec..000000000
Binary files a/Day31-35/res/Stallman.jpg and /dev/null differ
diff --git a/Day31-35/res/Tanenbaum.jpg b/Day31-35/res/Tanenbaum.jpg
deleted file mode 100644
index d966adaa1..000000000
Binary files a/Day31-35/res/Tanenbaum.jpg and /dev/null differ
diff --git a/Day31-35/res/algorithm_complexity_1.png b/Day31-35/res/algorithm_complexity_1.png
new file mode 100755
index 000000000..2d57aed9c
Binary files /dev/null and b/Day31-35/res/algorithm_complexity_1.png differ
diff --git a/Day31-35/res/algorithm_complexity_2.png b/Day31-35/res/algorithm_complexity_2.png
new file mode 100755
index 000000000..0ff66f3f2
Binary files /dev/null and b/Day31-35/res/algorithm_complexity_2.png differ
diff --git a/Day31-35/res/andrew.jpg b/Day31-35/res/andrew.jpg
new file mode 100755
index 000000000..41f37a561
Binary files /dev/null and b/Day31-35/res/andrew.jpg differ
diff --git a/Day31-35/res/baidu_echarts.png b/Day31-35/res/baidu_echarts.png
new file mode 100755
index 000000000..48ff43c43
Binary files /dev/null and b/Day31-35/res/baidu_echarts.png differ
diff --git a/Day31-35/res/bootstrap-layoutit.png b/Day31-35/res/bootstrap-layoutit.png
new file mode 100755
index 000000000..3735ac865
Binary files /dev/null and b/Day31-35/res/bootstrap-layoutit.png differ
diff --git a/Day31-35/res/dmr.png b/Day31-35/res/dmr.png
new file mode 100755
index 000000000..2ca20e8cf
Binary files /dev/null and b/Day31-35/res/dmr.png differ
diff --git a/Day31-35/res/file-mode.png b/Day31-35/res/file-mode.png
new file mode 100755
index 000000000..f80d50080
Binary files /dev/null and b/Day31-35/res/file-mode.png differ
diff --git a/Day31-35/res/history-of-os.png b/Day31-35/res/history-of-os.png
deleted file mode 100644
index 22262ec21..000000000
Binary files a/Day31-35/res/history-of-os.png and /dev/null differ
diff --git a/Day31-35/res/history-of-unix.png b/Day31-35/res/history-of-unix.png
old mode 100644
new mode 100755
index 401b7061a..1da969e16
Binary files a/Day31-35/res/history-of-unix.png and b/Day31-35/res/history-of-unix.png differ
diff --git a/Day31-35/res/ibm-col80-punched-card.png b/Day31-35/res/ibm-col80-punched-card.png
new file mode 100755
index 000000000..8a797b190
Binary files /dev/null and b/Day31-35/res/ibm-col80-punched-card.png differ
diff --git a/Day31-35/res/ken-and-dennis-pdp-11.png b/Day31-35/res/ken-and-dennis-pdp-11.png
new file mode 100755
index 000000000..2a2b510be
Binary files /dev/null and b/Day31-35/res/ken-and-dennis-pdp-11.png differ
diff --git a/Day31-35/res/ken_old.png b/Day31-35/res/ken_old.png
new file mode 100755
index 000000000..7fd7853a0
Binary files /dev/null and b/Day31-35/res/ken_old.png differ
diff --git a/Day31-35/res/ken_young.jpg b/Day31-35/res/ken_young.jpg
new file mode 100755
index 000000000..4bf8fa61a
Binary files /dev/null and b/Day31-35/res/ken_young.jpg differ
diff --git a/Day31-35/res/linus.png b/Day31-35/res/linus.png
new file mode 100755
index 000000000..b2e1620cb
Binary files /dev/null and b/Day31-35/res/linus.png differ
diff --git a/Day31-35/res/linux-network-config.png b/Day31-35/res/linux-network-config.png
old mode 100644
new mode 100755
index a3b01e68d..1db952c0c
Binary files a/Day31-35/res/linux-network-config.png and b/Day31-35/res/linux-network-config.png differ
diff --git a/Day31-35/res/pdp-11.jpg b/Day31-35/res/pdp-11.jpg
new file mode 100755
index 000000000..13cca8e0c
Binary files /dev/null and b/Day31-35/res/pdp-11.jpg differ
diff --git a/Day31-35/res/pdp-7.png b/Day31-35/res/pdp-7.png
new file mode 100755
index 000000000..8246dd008
Binary files /dev/null and b/Day31-35/res/pdp-7.png differ
diff --git a/Day31-35/res/vim-diff.png b/Day31-35/res/vim-diff.png
new file mode 100755
index 000000000..5951e02f4
Binary files /dev/null and b/Day31-35/res/vim-diff.png differ
diff --git a/Day31-35/res/vim-macro.png b/Day31-35/res/vim-macro.png
new file mode 100755
index 000000000..e80ef3edc
Binary files /dev/null and b/Day31-35/res/vim-macro.png differ
diff --git a/Day31-35/res/vim-multi-window.png b/Day31-35/res/vim-multi-window.png
new file mode 100755
index 000000000..5028d2729
Binary files /dev/null and b/Day31-35/res/vim-multi-window.png differ
diff --git "a/Day31-35/res/\345\255\227\344\275\223\346\240\267\345\274\217.png" "b/Day31-35/res/\345\255\227\344\275\223\346\240\267\345\274\217.png"
new file mode 100755
index 000000000..8f592bb73
Binary files /dev/null and "b/Day31-35/res/\345\255\227\344\275\223\346\240\267\345\274\217.png" differ
diff --git "a/Day31-35/res/\345\255\227\347\254\246\345\256\236\344\275\223.png" "b/Day31-35/res/\345\255\227\347\254\246\345\256\236\344\275\223.png"
new file mode 100755
index 000000000..dd186221e
Binary files /dev/null and "b/Day31-35/res/\345\255\227\347\254\246\345\256\236\344\275\223.png" differ
diff --git "a/Day31-35/res/\345\256\242\346\210\267\347\253\257\345\257\271\345\255\227\344\275\223\346\226\207\344\273\266\347\232\204\346\224\257\346\214\201.png" "b/Day31-35/res/\345\256\242\346\210\267\347\253\257\345\257\271\345\255\227\344\275\223\346\226\207\344\273\266\347\232\204\346\224\257\346\214\201.png"
new file mode 100755
index 000000000..1a0e5b032
Binary files /dev/null and "b/Day31-35/res/\345\256\242\346\210\267\347\253\257\345\257\271\345\255\227\344\275\223\346\226\207\344\273\266\347\232\204\346\224\257\346\214\201.png" differ
diff --git "a/Day31-35/res/\345\260\272\345\257\270\345\215\225\344\275\215.png" "b/Day31-35/res/\345\260\272\345\257\270\345\215\225\344\275\215.png"
new file mode 100755
index 000000000..845e32b8a
Binary files /dev/null and "b/Day31-35/res/\345\260\272\345\257\270\345\215\225\344\275\215.png" differ
diff --git "a/Day31-35/res/\345\261\236\346\200\247\351\200\211\346\213\251\345\231\250.png" "b/Day31-35/res/\345\261\236\346\200\247\351\200\211\346\213\251\345\231\250.png"
new file mode 100755
index 000000000..06fef27e8
Binary files /dev/null and "b/Day31-35/res/\345\261\236\346\200\247\351\200\211\346\213\251\345\231\250.png" differ
diff --git "a/Day31-35/res/\345\270\270\347\224\250\351\200\211\346\213\251\345\231\250.png" "b/Day31-35/res/\345\270\270\347\224\250\351\200\211\346\213\251\345\231\250.png"
new file mode 100755
index 000000000..a54f4de40
Binary files /dev/null and "b/Day31-35/res/\345\270\270\347\224\250\351\200\211\346\213\251\345\231\250.png" differ
diff --git "a/Day31-35/res/\345\274\200\345\247\213\346\240\207\347\255\276.png" "b/Day31-35/res/\345\274\200\345\247\213\346\240\207\347\255\276.png"
new file mode 100755
index 000000000..6f79eb485
Binary files /dev/null and "b/Day31-35/res/\345\274\200\345\247\213\346\240\207\347\255\276.png" differ
diff --git "a/Day31-35/res/\346\240\207\347\255\276\345\261\236\346\200\247.png" "b/Day31-35/res/\346\240\207\347\255\276\345\261\236\346\200\247.png"
new file mode 100755
index 000000000..7eb42f033
Binary files /dev/null and "b/Day31-35/res/\346\240\207\347\255\276\345\261\236\346\200\247.png" differ
diff --git "a/Day31-35/res/\346\240\267\345\274\217\345\261\236\346\200\247.png" "b/Day31-35/res/\346\240\267\345\274\217\345\261\236\346\200\247.png"
new file mode 100755
index 000000000..9b63b895f
Binary files /dev/null and "b/Day31-35/res/\346\240\267\345\274\217\345\261\236\346\200\247.png" differ
diff --git "a/Day31-35/res/\347\233\222\345\255\220\346\250\241\345\236\213.png" "b/Day31-35/res/\347\233\222\345\255\220\346\250\241\345\236\213.png"
new file mode 100755
index 000000000..af181ff4f
Binary files /dev/null and "b/Day31-35/res/\347\233\222\345\255\220\346\250\241\345\236\213.png" differ
diff --git "a/Day31-35/res/\347\233\270\345\257\271\350\267\257\345\276\204.png" "b/Day31-35/res/\347\233\270\345\257\271\350\267\257\345\276\204.png"
new file mode 100755
index 000000000..f9b75ff5e
Binary files /dev/null and "b/Day31-35/res/\347\233\270\345\257\271\350\267\257\345\276\204.png" differ
diff --git "a/Day31-35/res/\347\273\217\345\205\270\345\270\203\345\261\200-1.png" "b/Day31-35/res/\347\273\217\345\205\270\345\270\203\345\261\200-1.png"
new file mode 100755
index 000000000..16dfe2be2
Binary files /dev/null and "b/Day31-35/res/\347\273\217\345\205\270\345\270\203\345\261\200-1.png" differ
diff --git "a/Day31-35/res/\347\273\217\345\205\270\345\270\203\345\261\200-2.png" "b/Day31-35/res/\347\273\217\345\205\270\345\270\203\345\261\200-2.png"
new file mode 100755
index 000000000..349c6d0ee
Binary files /dev/null and "b/Day31-35/res/\347\273\217\345\205\270\345\270\203\345\261\200-2.png" differ
diff --git "a/Day31-35/res/\347\273\223\346\235\237\346\240\207\347\255\276.png" "b/Day31-35/res/\347\273\223\346\235\237\346\240\207\347\255\276.png"
new file mode 100755
index 000000000..8034aa3ac
Binary files /dev/null and "b/Day31-35/res/\347\273\223\346\235\237\346\240\207\347\255\276.png" differ
diff --git "a/Day31-35/res/\347\275\221\347\253\231\345\234\260\345\233\276.png" "b/Day31-35/res/\347\275\221\347\253\231\345\234\260\345\233\276.png"
new file mode 100755
index 000000000..744e7d986
Binary files /dev/null and "b/Day31-35/res/\347\275\221\347\253\231\345\234\260\345\233\276.png" differ
diff --git "a/Day31-35/res/\350\241\254\347\272\277\345\255\227\344\275\223+\351\235\236\350\241\254\347\272\277\345\255\227\344\275\223+\347\255\211\345\256\275\345\255\227\344\275\223.png" "b/Day31-35/res/\350\241\254\347\272\277\345\255\227\344\275\223+\351\235\236\350\241\254\347\272\277\345\255\227\344\275\223+\347\255\211\345\256\275\345\255\227\344\275\223.png"
new file mode 100755
index 000000000..1fd08189b
Binary files /dev/null and "b/Day31-35/res/\350\241\254\347\272\277\345\255\227\344\275\223+\351\235\236\350\241\254\347\272\277\345\255\227\344\275\223+\347\255\211\345\256\275\345\255\227\344\275\223.png" differ
diff --git "a/Day31-35/res/\351\200\211\346\213\251\345\231\250\350\257\255\346\263\225.png" "b/Day31-35/res/\351\200\211\346\213\251\345\231\250\350\257\255\346\263\225.png"
new file mode 100755
index 000000000..75021ef70
Binary files /dev/null and "b/Day31-35/res/\351\200\211\346\213\251\345\231\250\350\257\255\346\263\225.png" differ
diff --git "a/Day31-35/\347\216\251\350\275\254Linux.md" "b/Day31-35/\347\216\251\350\275\254Linux.md"
deleted file mode 100644
index 3f31fad1b..000000000
--- "a/Day31-35/\347\216\251\350\275\254Linux.md"
+++ /dev/null
@@ -1,355 +0,0 @@
-## 玩转Linux操作系统
-
-### 操作系统发展史
-
-
-
-### Linux概述
-
-Linux是一个通用操作系统。一个操作系统要负责任务调度、内存分配、处理外围设备I/O等操作。操作系统通常由内核和系统程序(设备驱动、底层库、shell、服务程序等)两部分组成。
-
-Linux内核是芬兰人Linus Torvalds开发的,于1991年9月发布。而Linux操作系统作为Internet时代的产物,它是由全世界许多开发者共同合作开发的,是一个自由的操作系统(注意是自由不是免费)。
-
-### Linux系统优点
-
-1. 通用操作系统,不跟特定的硬件绑定。
-2. 用C语言编写,有可移植性,有内核编程接口。
-3. 支持多用户和多任务,支持安全的分层文件系统。
-4. 大量的实用程序,完善的网络功能以及强大的支持文档。
-5. 可靠的安全性和良好的稳定性,对开发者更友好。
-
-### 基础命令
-
-Linux系统的命令通常都是如下所示的格式:
-
-```Shell
-命令名称 [命名参数] [命令对象]
-```
-
-1. 获取登录信息 - **w** / **who** / **last**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# w
- 23:31:16 up 12:16, 2 users, load average: 0.00, 0.01, 0.05
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root pts/0 182.139.66.250 23:03 4.00s 0.02s 0.00s w
- jackfrue pts/1 182.139.66.250 23:26 3:56 0.00s 0.00s -bash
- [root@izwz97tbgo9lkabnat2lo8z ~]# who
- root pts/0 2018-04-12 23:03 (182.139.66.250)
- jackfrued pts/1 2018-04-12 23:26 (182.139.66.250)
- [root@izwz97tbgo9lkabnat2lo8z ~]# who am i
- root pts/0 2018-04-12 23:03 (182.139.66.250)
- ```
-
-2. 查看自己使用的Shell - **ps**。
-
- Shell也被称为“壳”,它是用户与内核交流的翻译官,简单的说就是人与计算机交互的接口。目前很多Linux系统默认的Shell都是bash(Bourne Again SHell),因为它可以使用Tab键进行命令补全、可以保存历史命令、可以方便的配置环境变量以及执行批处理操作等。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# ps
- PID TTY TIME CMD
- 3531 pts/0 00:00:00 bash
- 3553 pts/0 00:00:00 ps
- ```
-
-3. 查看命令的说明 - **whatis**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# whatis ps
- ps (1) - report a snapshot of the current processes.
- [root@izwz97tbgo9lkabnat2lo8z ~]# whatis python
- python (1) - an interpreted, interactive, object-oriented programming language
- ```
-
-4. 查看命令的位置 - **which** / **whereis**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# whereis ps
- ps: /usr/bin/ps /usr/share/man/man1/ps.1.gz
- [root@izwz97tbgo9lkabnat2lo8z ~]# whereis python
- python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
- [root@izwz97tbgo9lkabnat2lo8z ~]# which ps
- /usr/bin/ps
- [root@izwz97tbgo9lkabnat2lo8z ~]# which python
- /usr/bin/python
- ```
-
-5. 查看帮助文档 - **man** / **info** / **apropos**。
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# ps --help
- Usage:
- ps [options]
- Try 'ps --help '
- or 'ps --help '
- for additional help text.
- For more details see ps(1).
- [root@izwz97tbgo9lkabnat2lo8z ~]# man ps
- PS(1) User Commands PS(1)
- NAME
- ps - report a snapshot of the current processes.
- SYNOPSIS
- ps [options]
- DESCRIPTION
- ...
- [root@izwz97tbgo9lkabnat2lo8z ~]# info ps
- ...
- ```
-
-6. 切换用户 - **su**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# su hellokitty
- [hellokitty@izwz97tbgo9lkabnat2lo8z root]$
- ```
-
-7. 以管理员身份执行命令 - **sudo**。
-
- ```Shell
- [jackfrued@izwz97tbgo9lkabnat2lo8z ~]$ ls /root
- ls: cannot open directory /root: Permission denied
- [jackfrued@izwz97tbgo9lkabnat2lo8z ~]$ sudo ls /root
- [sudo] password for jackfrued:
- calendar.py code error.txt hehe hello.c index.html myconf result.txt
- ```
-
- > **说明**:如果希望用户能够以管理员身份执行命令,用户必须在sudoers(/etc/sudoers)名单中。
-
-8. 登入登出相关 - **logout** / **exit** / **adduser** / **userdel** / **passwd** / **ssh**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# adduser jackfrued
- [root@izwz97tbgo9lkabnat2lo8z ~]# passwd jackfrued
- Changing password for user jackfrued.
- New password:
- Retype new password:
- passwd: all authentication tokens updated successfully.
- [root@izwz97tbgo9lkabnat2lo8z ~]# ssh hellokitty@1.2.3.4
- hellokitty@1.2.3.4's password:
- Last login: Thu Apr 12 23:05:32 2018 from 10.12.14.16
- [hellokitty@izwz97tbgo9lkabnat2lo8z ~]$ logout
- Connection to 1.2.3.4 closed.
- [root@izwz97tbgo9lkabnat2lo8z ~]#
- ```
-
-9. 查看系统和主机名 - **uname** / **hostname**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# uname
- Linux
- [root@izwz97tbgo9lkabnat2lo8z ~]# hostname
- izwz97tbgo9lkabnat2lo8z
- [root@iZwz97tbgo9lkabnat2lo8Z ~]# cat /etc/centos-release
- CentOS Linux release 7.4.1708 (Core)
- ```
-
-10. 重启和关机 - **reboot** / **init 6** / **shutdown** / **init 0**。
-
-11. 查看历史命令 - **history**。
-
-### 实用程序
-
-#### 文件和文件夹操作
-
-1. 创建/删除目录 - **mkdir** / **rmdir**。
-
-2. 创建/删除文件 - **touch** / **rm**。
-
- - touch命令用于创建空白文件或修改文件时间。在Linux系统中一个文件有三种时间:
- - 更改内容的时间(mtime)
- - 更改权限的时间(ctime)
- - 最后访问时间(atime)
-
-3. 切换和查看当前工作目录 - **cd** / **pwd**。
-
-4. 查看目录内容 - **ls**。
-
-5. 查看文件内容 - **cat** / **head** / **tail** / **more** / **less**。
-
-6. 拷贝/移动文件 - **cp** / **mv**。
-
-7. 查看文件及内容 - **find** / **grep**。
-
- ```Shell
- [root@izwz97tbgo9lkabnat2lo8z ~]# find -name *.html
- ./index.html
- ./code/index.html
- [root@izwz97tbgo9lkabnat2lo8z ~]# grep "