Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002...
Transcript of Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002...
![Page 1: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/1.jpg)
List Comprehension, Dictionaries &Benchmark Analysis
Prakash [email protected]://prakashgautam.com.np/6cs008
![Page 2: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/2.jpg)
Agenda
➔ List Comprehension➔ Benchmark Analysis➔ Dictionaries
2
![Page 3: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/3.jpg)
List Comprehension
➔ Explicitly write the whole thing
➔ Write a loop to create it
Squares = [0,1,4,9,16,25,36,49,64,81,100]
3
Squares = []for i in range(11)
Squares.append(i*i)
![Page 4: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/4.jpg)
List Comprehension
➔ Write a loop to create it
➔ Write a List Comprehension
4
Squares = []for i in range(11)
Squares.append(i*i)
Squares = [i*i for i in range(11)]
![Page 5: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/5.jpg)
List Comprehension
➔ Write a List Comprehension
➔ List Comprehension is a concise description of list➔ List Comprehension is a shorthand for a loop
5
Squares = [i*i for i in range(11)]
![Page 6: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/6.jpg)
List Comprehension
6
[expression for item in list if conditional]
for item in list: if conditional:
expression
![Page 7: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/7.jpg)
7
![Page 8: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/8.jpg)
8
![Page 9: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/9.jpg)
9
![Page 10: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/10.jpg)
1. List of Squares
10
Squares = [i**2 for i in range(1,101)]print(Squares)
Squares = []for i in range(1,101):
Squares.append(i**2)print(Squares)
![Page 11: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/11.jpg)
2. Remainders of 5
11
Remainder5 = [i**2%5 for i in range(1,10)]print(Remainder5)
P-Remainders = [i**2%p for i in range(0,p)
Quadratic Reciprocity [(p+1)/2]
Carl Friedrich Gauss
![Page 12: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/12.jpg)
3. Movie that starts with ‘G’
12
gmovies = [title for title in movies if title.startswith(“G”)]print(gmovies)
movies = [a,b,c,....,n]gmovies = []for title in movies:
if title.startswith(“G”):gmovies.append(title)
print(gmovies)
![Page 13: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/13.jpg)
4. List of tuples containing movie name & R year
13
gmovies = [title for(title,year) in movies if year<2000]print(gmovies)
movies = [(a,1941),(b,2000),....,(n,2017)]gmovies = []for (title,year) in movies:
if year<2000:gmovies.append(title)
print(gmovies)
![Page 14: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/14.jpg)
5. Scalar Multiplication
14
v = [10, -2, 3]vem = [4*x for x in v]print(vem)
![Page 15: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/15.jpg)
6. Cartesian Product
15
A = {1,3} & B = {x,y}A x B = {(1,x),(1,y),(3,x),(3,y)}
cp = [(a,b) for a in A for b in B]print(cp)
Rene Descartes
![Page 16: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/16.jpg)
?
16
def double(x):return x*2
Xy = [double(x) for x in range(10]print(Xy)
![Page 17: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/17.jpg)
?
17
print([x+y for x in [10,20,30] for y in [1,2,3]])
Num_list = [y for y in range(100) if y%2==0 if y%5==0]print(Num_list)
Ob = [“Even” if i%2==0 else “Odd” for i in range(10)]print(Ob)
![Page 18: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/18.jpg)
List Comprehension
➔ An elegant way to define and create lists based on existing lists➔ More compact & faster than normal functions & loops for creating lists➔ Every LC can be converted into for loop but viceversa may not be true
18
![Page 19: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/19.jpg)
Benchmark Analysis
➔ If comparisons done correctly: its called benchmarking➔ Lets analyze some sorting algorithms
19
![Page 20: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/20.jpg)
20
# Integers 100 10,000 1,000,000
Insertion 0.57 6064
Selection 0.63 6293
Bubble 1.43 15628
Merge 0.25 48.3 7023
Quick 0.25 44.4 7153
Tim 0.02 3.7 690
Randomly Ordered Input (Time in Milliseconds)
![Page 21: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/21.jpg)
21
# Integers 10,000 1,000,000
Insertion 8.8
Selection 6278
Bubble 1.6
Merge 45.5 6561
Quick 35.9 5044
Tim 0.2 20.8
Already Sorted Input (Time in Milliseconds)
![Page 22: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/22.jpg)
22
# Integers 10,000 1,000,000
Insertion 12028
Selection 6882
Bubble 22338
Merge 48.2 6851
Quick 37.1 5285
Tim 0.2 20
Reverse Sorted Input (Time in Milliseconds)
![Page 23: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/23.jpg)
23
# Integers 10,000 1,000,000
Insertion 6037
Selection 6270
Bubble 15496
Merge 48.4 6871
Quick 43.6 Failed
Tim 3.3 386
Random Ordered Input with many duplicates
![Page 24: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/24.jpg)
Observations
➔ Python’s built-in Timsort is crazy fast in all tests➔ Bubble sort: extremely slow except already sorted➔ Insertion sort faster than selection sort except for reverse sorted input➔ Quicksort is generally faster than Mergesort
24
![Page 25: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/25.jpg)
Timsort
25
def TimSort():for x in range(0, len(arr), RUN):
arr[x:x+RUN] = Insertion(arr[x:x+RUN])RUNinc = RUNWhile RUNinc < len(arr):
for x in range(0, len(arr), 2*RUNinc):arr[x:x+2*RUNinc]=merge(arr[x:x+RUNinc], arr[x+RUNinc:x+2*RUNinc])
RUNinc=RUNinc*2
![Page 26: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/26.jpg)
Timsort
➔ Designed in 2002 by Tim Peters➔ Adaptive, Inplace & Stable➔ Default Sorting: JAVA, Android, Python➔ Time Complexity(Asymptotic Analysis)
◆ Best: O(n)◆ Worst: O(nlogn)
26
![Page 27: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/27.jpg)
Tuples
Seemingly Similar to Lists
27
![Page 28: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/28.jpg)
Tuples are immutable
Unlike lists we cannot change elements
28
![Page 29: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/29.jpg)
Dictionaries
➔ List◆ A linear collection of values that stay in order
➔ Dictionary◆ A bag of values, each with its own label
29
![Page 30: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/30.jpg)
Dictionaries
➔ It organizes linked information➔ Examples:
◆ Word & Definition◆ Name & Phone Number◆ Username & Password
➔ If you know the 1st entry, you can immediately get the 2nd one➔ The first item is key and second is value➔ Keys: Immutable➔ Lists can’t be keys, why?
30
![Page 31: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/31.jpg)
Dictionaries
31
>>d={“id”:100, “code”: “A500ND10”, “language”: “English”, “location”: “(27.450745, 87.349823)}
Key Value
id 100
code A500ND10
language English
location 27.450745, 87.349823
![Page 32: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/32.jpg)
Dictionaries
32
>>type(d)<class ‘dict’>
#Define dictionary using dict constructor>>d2 = dict(code = “A500ND10”, language: “English”)
#Adding new data in d2 (quotes are necessary)>>d2[“id”]=100>>print(d2)>>print(d2[‘language’])
![Page 33: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/33.jpg)
Dictionaries
33
#Define dictionary using dict constructor>>d2 = dict(code = “A500ND10”, language: “English”)
#Adding new data in d2 (quotes are necessary)>>d2[“id”]=100>>print(d2) #It works>>print(d2[‘language’]) #It works>>print(d2[‘location’]) #Will it work?
![Page 34: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/34.jpg)
Dictionaries
34
#Define dictionary using dict constructor>>d2 = dict(code = “A500ND10”, language: “English”)
>>print(d2[‘location’]) #Will it work?>>#Solution 1>>if ‘location’ in d2:
print(d2[‘location’]) else:
print(“The collection doesn’t have location details”)
![Page 35: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/35.jpg)
Dictionaries
35
#Define dictionary using dict constructor>>d2 = dict(code = “A500ND10”, language: “English”)
>>print(d2[‘location’]) #Will it work?>>#Solution 2>>try:
print(d2[‘location’]) except keyError:
print(“The collection does not have location details”)
![Page 36: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/36.jpg)
Dictionaries
36
#How many methods dict have?>>dir(d2)
#To see what the specific method does>>help(d2.get)
>>loc = d2.get(‘location’, None)>>print(loc)
#To Print all key-value pairs>>for key in d2.keys():
value = d2[key] print(key, “=” , value)
![Page 37: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/37.jpg)
Dictionaries
37
#To Print all key-value pairs>>for key, value in d2.items(): print(key, “=” , value)
![Page 38: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/38.jpg)
Defining Dictionaries
38
![Page 39: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/39.jpg)
No duplicate keys
39
Old values gets overwritten instead…!
![Page 40: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/40.jpg)
Access
40
We can access values by keys, but not the other way around
![Page 41: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/41.jpg)
All keys, values or both
41
Use d.keys( ), d.items( ) and d.values( )
![Page 42: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/42.jpg)
Loop over Dictionaries
42
Print all key-value pairs of Dictionary
![Page 43: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/43.jpg)
Dictionaries are collection of key-value pairs
Example: the keys are all words in the English language, and their corresponding values are the meanings.
43
![Page 44: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/44.jpg)
Dictionaries: Complexity Analysis
➔ O(1): Constant Time◆ Anytime program takes constant # instructions regardless of the input◆ Accessing any element in Dict or List◆ Appending an element in Dict or List◆ Pushing an element onto the front
➔ O(n): Linear Time◆ When the program takes time i.e directly proportional to the input size◆ Creating a List with n elements◆ Traversing
44
![Page 45: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/45.jpg)
Dictionaries: Complexity Analysis
➔ O(n2): Quadratic Time◆ When n hits a value of 10,000: n2 gets pretty big (100,000,000). ◆ Doubly nested loop that I've gone over in class so many time is O(n2)
● for i in xrange(n): for j in xrange(i): pass➔ O(logn): Logarithmic Time
◆ Binary Search➔ O(nlogn): Poly-Logarithmic Time
◆ Timsort
45
![Page 46: Dictionaries & List Comprehension, Benchmark Analysis · 2018. 9. 18. · Timsort Designed in 2002 by Tim Peters Adaptive, Inplace & Stable Default Sorting: JAVA, Android, Python](https://reader035.fdocuments.net/reader035/viewer/2022071021/5fd56069297f3b459133a968/html5/thumbnails/46.jpg)
THANK YOU
?
46