.intel_syntax noprefix
# emulate irvine stuff
.equ TAB, '\t'
Randomize:
ret
# uses eax as range
RandomRange:
pusha
mov ebx, eax
xor edx, edx
mov [esp+28], edx
popa
ret
CrLf:
pusha
push [stdout]
push '\n'
add esp, 8
popa
ret
ReadInt:
pusha
lea eax, [esp+28]
push eax
push offset DecFmt
add esp, 8
popa
ret
WriteChar:
pusha
push [stdout]
push eax
add esp, 8
popa
ret
# apparently this uses edx
WriteString:
pusha
push [stdout]
push edx
add esp, 8
popa
ret
WriteDec:
pusha
push eax
push offset DecFmt
add esp, 8
popa
ret
.data
DecFmt: .asciz "%d"
# end irvine
.equ MIN, 10 #lower range limit
.equ MAX, 200 #upper range limit
.equ LRANGE, 100
.equ HRANGE, 999
.data
#title, intro, and prompts
title_1: .asciz "PROGRAMMING ASSIGNMENT 5: RANDOM GEN/SORT\n"
intro_1: .ascii "This program generates random numbers in the range (100 - 999),\n"
.ascii "displays the original list, sorts the list, and calculates the median value.\n"
.asciz "Finally, it displays the sorted list in descending order.\n"
prompt_1: .asciz "How many numbers should be generated? (10 - 200): "
error_1: .asciz "Out of range.\n"
display_1: .asciz "List of random numbers:\n"
display_2: .asciz "The median is: "
display_3: .asciz "The sorted list:\n"
#placeholders for user entries and calculated data
.lcomm randArray, 4*MAX
.lcomm userNum, 4 #integer to be entered by user
#strings for posting results
goodBye_1: .asciz "Thank you for using the Gen/sort-ulator! Good-bye!"
.text
.globl main
main:
call Randomize
#Title Screen
push OFFSET title_1
push OFFSET intro_1
call Intro
#Get and validate user numbers
push OFFSET error_1
push OFFSET prompt_1
push OFFSET userNum
call GetData
#Fill Array with random numbers
push OFFSET randArray
push userNum
call FillArray
#display unsorted results
push OFFSET randArray
push userNum
push OFFSET display_1
call DisplayList
#sort the results
push OFFSET randArray
push userNum
call sortList
#display the median
push OFFSET randArray
push userNum
push OFFSET display_2
call median
#display sorted results
push OFFSET randArray
push userNum
push OFFSET display_3
call DisplayList
#Say "goodbye"
push OFFSET goodBye_1
call Goodbye
xor eax, eax
ret # exit to operating system
#-------------------------------------------------------
#Gives an Intro to the program
# Receives parameters on the system stack (in the order pushed):
# Address of the title
# Address of the intro
#post: intro displayed
#registers: none
#-------------------------------------------------------
Intro:
pushad
mov ebp, esp
mov edx, [ebp+40]
call WriteString
call CrLf
mov edx, [ebp+36]
call WriteString
call CrLf
popad
ret 8
#-------------------------------------------------------
#Prompts user for an integer, int stores in userNum
# Receives parameters on the system stack (in the order pushed):
# Address of the error message
# Address of the prompt
# Address of return value
#Post: userNum
#registers: none
#-------------------------------------------------------
GetData:
pushad
#setup stack and prompt for entry
mov ebp, esp
reenter:
mov edx, [ebp+40]
mov ebx, [ebp+36]
call WriteString
call ReadInt
#validate entry
cmp eax, MIN #if eax < LOWER
jl badEntry #jump to summary
cmp eax, MAX #if eax > UPPER
jg badEntry #reprompt
jmp goodEntry #else jump to end, we have a good value
#bad entry reprompt
badEntry:
mov edx, [ebp+44]
call WriteString
jmp reenter
goodEntry:
call CrLf
mov [ebx], eax
popad
ret 12
#-------------------------------------------------------
#Fills array with a number of random integers within RANGE
#Recieves parameters on the system stack (in order pushed)
# array
# userNum
#Post: array is filled with userNum number of randoms
#Registers used: none
#-------------------------------------------------------
FillArray :
pushad
mov ebp, esp
mov ecx, [ebp+36] #initialize loop counter with user entry
mov edi, [ebp+40] #setup array offset
fillLoop:
call nextRand
add edi, 4
loop fillLoop
popad
ret 8
#-------------------------------------------------------
#:edure nextRand
# adapted from check lecture 20 solutions
#:edure to get the next random number in the range specified by the user.
# Preconditions: LRANGE < HRANGE
# Registers used: eax, edi
#-------------------------------------------------------
nextRand:
mov eax, HRANGE
sub eax, LRANGE
inc eax #add 1 to get the number of integers in range
call RandomRange
add eax, LRANGE #eax has value in [LOW - HIGH]
mov [edi],eax
ret
#-------------------------------------------------------
#Sorts the contents of an integer array
# Receives parameters on the system stack (in order pushed)
# Array
# Array Size
#registers: none
#-------------------------------------------------------
sortList:
pushad
mov ebp, esp
mov ecx, [ebp+36]
mov edi, [ebp+40]
dec ecx #ecx < request-1
mov ebx, 0 #ebx=k
#for(k=0# k<request-1# k++)
outerLoop:
mov eax, ebx #eax=i=k
mov edx, eax
inc edx #edx=j=k+1
push ecx
mov ecx, [ebp+36] #ecx < request
#for(j=k+1# j<request# j++)
innerLoop:
mov esi, [edi+edx*4]
cmp esi, [edi+eax*4]
jle skip
mov eax, edx
skip:
inc edx
loop innerLoop
#swap elements
lea esi, [edi+ebx*4]
push esi
lea esi, [edi+eax*4]
push esi
call exchange
pop ecx
inc ebx
loop outerLoop
popad
ret 8
#-------------------------------------------------------
# Exchange k and i
# Receives parameters on the system stack (in order pushed)
# array[k]
# array[i]
#registers: none
#-------------------------------------------------------
exchange:
pushad
mov ebp,esp
mov eax, [ebp+40] #array[k] low number
mov ecx, [eax]
mov ebx, [ebp+36] #array[i] high number
mov edx, [ebx]
mov [eax], edx
mov [ebx], ecx
popad
ret 8
#-------------------------------------------------------
#Displays the median of an integer array
# Receives parameters on the system stack (in order pushed)
# Array
# Array Size
# display string
#registers: none
#-------------------------------------------------------
median:
pushad
mov ebp, esp
mov edi, [ebp+44]
#display string
mov edx, [ebp+36]
call WriteString
#calculate median element
mov eax, [ebp+40]
cdq
mov ebx, 2
shl eax, 2
add edi, eax
cmp edx, 0
je isEven
#Array size is odd, so display the middle value
mov eax, [edi]
call WriteDec
call CrLf
call CrLf
jmp endMedian
isEven:
#Array size is even so average the two middle values
mov eax, [edi]
add eax, [edi-4]
cdq
mov ebx, 2
call WriteDec
call CrLf
call CrLf
endMedian:
popad
ret 12
#-------------------------------------------------------
#Displays the contents of an integer array, 10 per row
# Receives parameters on the system stack (in order pushed)
# Array
# Array Size
# display string
#registers: none
#-------------------------------------------------------
DisplayList:
pushad
mov ebp, esp
#display string
mov edx, [ebp+36]
call WriteString
call CrLf
mov ecx, [ebp+40]
mov edi, [ebp+44]
mov ebx, 0
#display array contents
listloop:
inc ebx #counter for 10 items per row
mov eax, [edi]
call WriteDec
add edi, 4
cmp ebx, 10
jne noReturn #jump if 10 items are not yet printed
call CrLf
mov ebx, 0
jmp noTab #this skips adding a tab on a new row
noReturn:
mov al, TAB
call WriteChar
noTab:
loop listloop
call CrLf
popad
ret 12
#-------------------------------------------------------
#Says good-bye to the user
# Receives parameters on the system stack:
# Address of string
#registers: none
#-------------------------------------------------------
Goodbye:
pushad
mov ebp, esp
mov edx, [ebp+36]
call WriteString
call CrLf
popad
ret 4
LmludGVsX3N5bnRheCBub3ByZWZpeAoKIyBlbXVsYXRlIGlydmluZSBzdHVmZgouZXF1IFRBQiwgJ1x0JwoKUmFuZG9taXplOgogICAgcmV0CgojIHVzZXMgZWF4IGFzIHJhbmdlClJhbmRvbVJhbmdlOgogICAgcHVzaGEKICAgIG1vdiBlYngsIGVheAogICAgY2FsbCByYW5kCiAgICB4b3IgZWR4LCBlZHgKICAgIGRpdiBlYngKICAgIG1vdiBbZXNwKzI4XSwgZWR4CiAgICBwb3BhCiAgICByZXQKCkNyTGY6CiAgICBwdXNoYQogICAgcHVzaCBbc3Rkb3V0XQogICAgcHVzaCAnXG4nCiAgICBjYWxsIHB1dGMKICAgIGFkZCBlc3AsIDgKICAgIHBvcGEKICAgIHJldAoKUmVhZEludDoKICAgIHB1c2hhCiAgICBsZWEgZWF4LCBbZXNwKzI4XQogICAgcHVzaCBlYXgKICAgIHB1c2ggb2Zmc2V0IERlY0ZtdAogICAgY2FsbCBzY2FuZgogICAgYWRkIGVzcCwgOAogICAgcG9wYQogICAgcmV0CgpXcml0ZUNoYXI6CiAgICBwdXNoYQogICAgcHVzaCBbc3Rkb3V0XQogICAgcHVzaCBlYXgKICAgIGNhbGwgcHV0YwogICAgYWRkIGVzcCwgOAogICAgcG9wYQogICAgcmV0CgojIGFwcGFyZW50bHkgdGhpcyB1c2VzIGVkeApXcml0ZVN0cmluZzoKICAgIHB1c2hhCiAgICBwdXNoIFtzdGRvdXRdCiAgICBwdXNoIGVkeAogICAgY2FsbCBmcHV0cwogICAgYWRkIGVzcCwgOAogICAgcG9wYQogICAgcmV0CgpXcml0ZURlYzoKICAgIHB1c2hhCiAgICBwdXNoIGVheAogICAgcHVzaCBvZmZzZXQgRGVjRm10CiAgICBjYWxsIHByaW50ZgogICAgYWRkIGVzcCwgOAogICAgcG9wYQogICAgcmV0CgouZGF0YQpEZWNGbXQ6IC5hc2NpeiAiJWQiCgojIGVuZCBpcnZpbmUKCi5lcXUgTUlOLCAxMCAgICAgICAgICAgICNsb3dlciByYW5nZSBsaW1pdAouZXF1IE1BWCwgMjAwICAgICAgICAgICAjdXBwZXIgcmFuZ2UgbGltaXQKLmVxdSBMUkFOR0UsIDEwMAouZXF1IEhSQU5HRSwgOTk5CgouZGF0YQoKI3RpdGxlLCBpbnRybywgYW5kIHByb21wdHMKICAgIHRpdGxlXzE6ICAgIC5hc2NpeiAgICAiUFJPR1JBTU1JTkcgQVNTSUdOTUVOVCA1OiBSQU5ET00gR0VOL1NPUlRcbiIKCiAgICBpbnRyb18xOiAgICAuYXNjaWkgICAgIlRoaXMgcHJvZ3JhbSBnZW5lcmF0ZXMgcmFuZG9tIG51bWJlcnMgaW4gdGhlIHJhbmdlICgxMDAgLSA5OTkpLFxuIgogICAgICAgICAgICAgICAgLmFzY2lpICAgICJkaXNwbGF5cyB0aGUgb3JpZ2luYWwgbGlzdCwgc29ydHMgdGhlIGxpc3QsIGFuZCBjYWxjdWxhdGVzIHRoZSBtZWRpYW4gdmFsdWUuXG4iCiAgICAgICAgICAgICAgICAuYXNjaXogICAgIkZpbmFsbHksIGl0IGRpc3BsYXlzIHRoZSBzb3J0ZWQgbGlzdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuIgoKICAgIHByb21wdF8xOiAgIC5hc2NpeiAgICAiSG93IG1hbnkgbnVtYmVycyBzaG91bGQgYmUgZ2VuZXJhdGVkPyAoMTAgLSAyMDApOiAiCgogICAgZXJyb3JfMTogICAgLmFzY2l6ICAgICJPdXQgb2YgcmFuZ2UuXG4iCgogICAgZGlzcGxheV8xOiAgLmFzY2l6ICAgICJMaXN0IG9mIHJhbmRvbSBudW1iZXJzOlxuIgogICAgZGlzcGxheV8yOiAgLmFzY2l6ICAgICJUaGUgbWVkaWFuIGlzOiAiCiAgICBkaXNwbGF5XzM6ICAuYXNjaXogICAgIlRoZSBzb3J0ZWQgbGlzdDpcbiIKCiNwbGFjZWhvbGRlcnMgZm9yIHVzZXIgZW50cmllcyBhbmQgY2FsY3VsYXRlZCBkYXRhCiAgICAubGNvbW0gcmFuZEFycmF5LCA0Kk1BWAogICAgLmxjb21tIHVzZXJOdW0sIDQgI2ludGVnZXIgdG8gYmUgZW50ZXJlZCBieSB1c2VyCgojc3RyaW5ncyBmb3IgcG9zdGluZyByZXN1bHRzCiAgICBnb29kQnllXzE6ICAuYXNjaXogICAgIlRoYW5rIHlvdSBmb3IgdXNpbmcgdGhlIEdlbi9zb3J0LXVsYXRvciEgR29vZC1ieWUhIgoKCi50ZXh0Ci5nbG9ibCBtYWluCm1haW46CiAgICBjYWxsICAgIFJhbmRvbWl6ZQoKI1RpdGxlIFNjcmVlbgogICAgcHVzaCAgICBPRkZTRVQgIHRpdGxlXzEKICAgIHB1c2ggICAgT0ZGU0VUICBpbnRyb18xCiAgICBjYWxsICAgIEludHJvCgojR2V0IGFuZCB2YWxpZGF0ZSB1c2VyIG51bWJlcnMKICAgIHB1c2ggICAgT0ZGU0VUICBlcnJvcl8xCiAgICBwdXNoICAgIE9GRlNFVCAgcHJvbXB0XzEKICAgIHB1c2ggICAgT0ZGU0VUICB1c2VyTnVtCiAgICBjYWxsICAgIEdldERhdGEKCiNGaWxsIEFycmF5IHdpdGggcmFuZG9tIG51bWJlcnMKICAgIHB1c2ggICAgT0ZGU0VUICByYW5kQXJyYXkKICAgIHB1c2ggICAgdXNlck51bQogICAgY2FsbCAgICBGaWxsQXJyYXkKCiNkaXNwbGF5IHVuc29ydGVkIHJlc3VsdHMKICAgIHB1c2ggICAgT0ZGU0VUICByYW5kQXJyYXkKICAgIHB1c2ggICAgdXNlck51bQogICAgcHVzaCAgICBPRkZTRVQgIGRpc3BsYXlfMQogICAgY2FsbCAgICBEaXNwbGF5TGlzdAoKI3NvcnQgdGhlIHJlc3VsdHMKICAgIHB1c2ggICAgT0ZGU0VUICByYW5kQXJyYXkKICAgIHB1c2ggICAgdXNlck51bQogICAgY2FsbCAgICBzb3J0TGlzdAoKI2Rpc3BsYXkgdGhlIG1lZGlhbgogICAgcHVzaCAgICBPRkZTRVQgIHJhbmRBcnJheQogICAgcHVzaCAgICB1c2VyTnVtCiAgICBwdXNoICAgIE9GRlNFVCAgZGlzcGxheV8yCiAgICBjYWxsICAgIG1lZGlhbgoKI2Rpc3BsYXkgc29ydGVkIHJlc3VsdHMKICAgIHB1c2ggICAgT0ZGU0VUICByYW5kQXJyYXkKICAgIHB1c2ggICAgdXNlck51bQogICAgcHVzaCAgICBPRkZTRVQgIGRpc3BsYXlfMwogICAgY2FsbCAgICBEaXNwbGF5TGlzdAoKI1NheSAiZ29vZGJ5ZSIKICAgIHB1c2ggICAgT0ZGU0VUICBnb29kQnllXzEKICAgIGNhbGwgICAgR29vZGJ5ZQoKICAgIHhvciAgICAgZWF4LCBlYXgKICAgIHJldCAgICAgICAgIyBleGl0IHRvIG9wZXJhdGluZyBzeXN0ZW0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNHaXZlcyBhbiBJbnRybyB0byB0aGUgcHJvZ3JhbQojIFJlY2VpdmVzIHBhcmFtZXRlcnMgb24gdGhlIHN5c3RlbSBzdGFjayAoaW4gdGhlIG9yZGVyIHB1c2hlZCk6CiMgICAgICAgQWRkcmVzcyBvZiB0aGUgdGl0bGUKIyAgICAgICBBZGRyZXNzIG9mIHRoZSBpbnRybwojcG9zdDogaW50cm8gZGlzcGxheWVkCiNyZWdpc3RlcnM6IG5vbmUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSW50cm86CiAgICBwdXNoYWQKICAgIG1vdiAgICAgZWJwLCBlc3AKICAgIG1vdiAgICAgZWR4LCBbZWJwKzQwXQogICAgY2FsbCAgICBXcml0ZVN0cmluZwogICAgY2FsbCAgICBDckxmCiAgICBtb3YgICAgIGVkeCwgW2VicCszNl0KICAgIGNhbGwgICAgV3JpdGVTdHJpbmcKICAgIGNhbGwgICAgQ3JMZgogICAgcG9wYWQKICAgIHJldCAgICAgOAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI1Byb21wdHMgdXNlciBmb3IgYW4gaW50ZWdlciwgaW50IHN0b3JlcyBpbiB1c2VyTnVtCiMgUmVjZWl2ZXMgcGFyYW1ldGVycyBvbiB0aGUgc3lzdGVtIHN0YWNrIChpbiB0aGUgb3JkZXIgcHVzaGVkKToKIyAgICAgICBBZGRyZXNzIG9mIHRoZSBlcnJvciBtZXNzYWdlCiMgICAgICAgQWRkcmVzcyBvZiB0aGUgcHJvbXB0CiMgICAgICAgQWRkcmVzcyBvZiByZXR1cm4gdmFsdWUKI1Bvc3Q6IHVzZXJOdW0KI3JlZ2lzdGVyczogbm9uZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpHZXREYXRhOgogICAgcHVzaGFkCgojc2V0dXAgc3RhY2sgYW5kIHByb21wdCBmb3IgZW50cnkKICAgIG1vdiAgICAgZWJwLCBlc3AKcmVlbnRlcjoKICAgIG1vdiAgICAgZWR4LCBbZWJwKzQwXQogICAgbW92ICAgICBlYngsIFtlYnArMzZdCiAgICBjYWxsICAgIFdyaXRlU3RyaW5nCiAgICBjYWxsICAgIFJlYWRJbnQKCiN2YWxpZGF0ZSBlbnRyeQogICAgY21wICAgICBlYXgsIE1JTiAgICAgICAgICAgICNpZiBlYXggPCBMT1dFUgogICAgamwgICAgICBiYWRFbnRyeSAgICAgICAgICAgICNqdW1wIHRvIHN1bW1hcnkKICAgIGNtcCAgICAgZWF4LCBNQVggICAgICAgICAgICAjaWYgZWF4ID4gVVBQRVIKICAgIGpnICAgICAgYmFkRW50cnkgICAgICAgICAgICAjcmVwcm9tcHQKICAgIGptcCAgICAgZ29vZEVudHJ5ICAgICAgICAgICAjZWxzZSBqdW1wIHRvIGVuZCwgd2UgaGF2ZSBhIGdvb2QgdmFsdWUKCiNiYWQgZW50cnkgcmVwcm9tcHQKYmFkRW50cnk6CiAgICBtb3YgICAgIGVkeCwgW2VicCs0NF0KICAgIGNhbGwgICAgV3JpdGVTdHJpbmcKICAgIGptcCAgICAgcmVlbnRlcgoKZ29vZEVudHJ5OgogICAgY2FsbCAgICBDckxmCiAgICBtb3YgICAgIFtlYnhdLCBlYXgKICAgIHBvcGFkCiAgICByZXQgICAgIDEyCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRmlsbHMgYXJyYXkgd2l0aCBhIG51bWJlciBvZiByYW5kb20gaW50ZWdlcnMgd2l0aGluIFJBTkdFCiNSZWNpZXZlcyBwYXJhbWV0ZXJzIG9uIHRoZSBzeXN0ZW0gc3RhY2sgKGluIG9yZGVyIHB1c2hlZCkKIyAgICAgICBhcnJheQojICAgICAgIHVzZXJOdW0KI1Bvc3Q6IGFycmF5IGlzIGZpbGxlZCB3aXRoIHVzZXJOdW0gbnVtYmVyIG9mIHJhbmRvbXMKI1JlZ2lzdGVycyB1c2VkOiBub25lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkZpbGxBcnJheSAgOgogICAgcHVzaGFkCiAgICBtb3YgICAgIGVicCwgZXNwCiAgICBtb3YgICAgIGVjeCwgW2VicCszNl0gICAgICAgICAgICNpbml0aWFsaXplIGxvb3AgY291bnRlciB3aXRoIHVzZXIgZW50cnkKICAgIG1vdiAgICAgZWRpLCBbZWJwKzQwXSAgICAgICAgICAgI3NldHVwIGFycmF5IG9mZnNldAogICAgZmlsbExvb3A6CiAgICBjYWxsICAgIG5leHRSYW5kCiAgICBhZGQgICAgIGVkaSwgNAogICAgbG9vcCAgICBmaWxsTG9vcAogICAgcG9wYWQKICAgIHJldCAgICAgOAoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIzplZHVyZSBuZXh0UmFuZAojIGFkYXB0ZWQgZnJvbSBjaGVjayBsZWN0dXJlIDIwIHNvbHV0aW9ucwojOmVkdXJlIHRvIGdldCB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCiMgUHJlY29uZGl0aW9uczogIExSQU5HRSA8IEhSQU5HRQojIFJlZ2lzdGVycyB1c2VkOiAgZWF4LCBlZGkKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbmV4dFJhbmQ6CiAgICBtb3YgICAgIGVheCwgSFJBTkdFCiAgICBzdWIgICAgIGVheCwgTFJBTkdFCiAgICBpbmMgICAgIGVheCAgICAgICAgICAgICAgICAgI2FkZCAxIHRvIGdldCB0aGUgbnVtYmVyIG9mIGludGVnZXJzIGluIHJhbmdlCiAgICBjYWxsICAgIFJhbmRvbVJhbmdlCiAgICBhZGQgICAgIGVheCwgTFJBTkdFICAgICAgICAgI2VheCBoYXMgdmFsdWUgaW4gW0xPVyAtIEhJR0hdCiAgICBtb3YgICAgIFtlZGldLGVheAogICAgcmV0CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojU29ydHMgdGhlIGNvbnRlbnRzIG9mIGFuIGludGVnZXIgYXJyYXkKIyBSZWNlaXZlcyBwYXJhbWV0ZXJzIG9uIHRoZSBzeXN0ZW0gc3RhY2sgKGluIG9yZGVyIHB1c2hlZCkKIyAgICAgICAgICAgQXJyYXkKIyAgICAgICAgICAgQXJyYXkgU2l6ZQojcmVnaXN0ZXJzOiBub25lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNvcnRMaXN0OgogICAgcHVzaGFkCiAgICBtb3YgICAgIGVicCwgZXNwCiAgICBtb3YgICAgIGVjeCwgW2VicCszNl0KICAgIG1vdiAgICAgZWRpLCBbZWJwKzQwXQogICAgZGVjICAgICBlY3ggICAgICAgICAgICAgICAgICNlY3ggPCByZXF1ZXN0LTEKICAgIG1vdiAgICAgZWJ4LCAwICAgICAgICAgICAgICAjZWJ4PWsKCiNmb3Ioaz0wIyBrPHJlcXVlc3QtMSMgaysrKQpvdXRlckxvb3A6CiAgICBtb3YgICAgIGVheCwgZWJ4ICAgICAgICAgICAgI2VheD1pPWsKICAgIG1vdiAgICAgZWR4LCBlYXgKICAgIGluYyAgICAgZWR4ICAgICAgICAgICAgICAgICAjZWR4PWo9aysxCiAgICBwdXNoICAgIGVjeAogICAgbW92ICAgICBlY3gsIFtlYnArMzZdICAgICAgICNlY3ggPCByZXF1ZXN0CgojZm9yKGo9aysxIyBqPHJlcXVlc3QjIGorKykKaW5uZXJMb29wOgogICAgbW92ICAgICBlc2ksIFtlZGkrZWR4KjRdCiAgICBjbXAgICAgIGVzaSwgW2VkaStlYXgqNF0KICAgIGpsZSAgICAgc2tpcAogICAgbW92ICAgICBlYXgsIGVkeApza2lwOgogICAgaW5jICAgICBlZHgKICAgIGxvb3AgICAgaW5uZXJMb29wCgojc3dhcCBlbGVtZW50cwogICAgbGVhICAgICBlc2ksIFtlZGkrZWJ4KjRdCiAgICBwdXNoICAgIGVzaQogICAgbGVhICAgICBlc2ksIFtlZGkrZWF4KjRdCiAgICBwdXNoICAgIGVzaQogICAgY2FsbCAgICBleGNoYW5nZQogICAgcG9wICAgICBlY3gKICAgIGluYyAgICAgZWJ4CiAgICBsb29wICAgIG91dGVyTG9vcAoKICAgIHBvcGFkCiAgICByZXQgICAgIDgKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRXhjaGFuZ2UgayBhbmQgaQojIFJlY2VpdmVzIHBhcmFtZXRlcnMgb24gdGhlIHN5c3RlbSBzdGFjayAoaW4gb3JkZXIgcHVzaGVkKQojICAgICAgICAgICBhcnJheVtrXQojICAgICAgICAgICBhcnJheVtpXQojcmVnaXN0ZXJzOiBub25lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmV4Y2hhbmdlOgogICAgcHVzaGFkCiAgICBtb3YgICAgIGVicCxlc3AKICAgIG1vdiAgICAgZWF4LCBbZWJwKzQwXSAgICAgICAjYXJyYXlba10gbG93IG51bWJlcgogICAgbW92ICAgICBlY3gsIFtlYXhdCiAgICBtb3YgICAgIGVieCwgW2VicCszNl0gICAgICAgI2FycmF5W2ldIGhpZ2ggbnVtYmVyCiAgICBtb3YgICAgIGVkeCwgW2VieF0KICAgIG1vdiAgICAgW2VheF0sIGVkeAogICAgbW92ICAgICBbZWJ4XSwgZWN4CiAgICBwb3BhZAogICAgcmV0IDgKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRGlzcGxheXMgdGhlIG1lZGlhbiBvZiBhbiBpbnRlZ2VyIGFycmF5CiMgUmVjZWl2ZXMgcGFyYW1ldGVycyBvbiB0aGUgc3lzdGVtIHN0YWNrIChpbiBvcmRlciBwdXNoZWQpCiMgICAgICAgICAgIEFycmF5CiMgICAgICAgICAgIEFycmF5IFNpemUKIyAgICAgICAgICAgZGlzcGxheSBzdHJpbmcKI3JlZ2lzdGVyczogbm9uZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptZWRpYW46CiAgICBwdXNoYWQKICAgIG1vdiAgICAgZWJwLCBlc3AKICAgIG1vdiAgICAgZWRpLCBbZWJwKzQ0XQojZGlzcGxheSBzdHJpbmcKICAgIG1vdiAgICAgZWR4LCBbZWJwKzM2XQogICAgY2FsbCAgICBXcml0ZVN0cmluZwoKI2NhbGN1bGF0ZSBtZWRpYW4gZWxlbWVudAogICAgbW92ICAgICBlYXgsIFtlYnArNDBdCiAgICBjZHEKICAgIG1vdiAgICAgZWJ4LCAyCiAgICBkaXYgICAgIGVieAogICAgc2hsICAgICBlYXgsIDIKICAgIGFkZCAgICAgZWRpLCBlYXgKICAgIGNtcCAgICAgZWR4LCAwCiAgICBqZSAgICAgIGlzRXZlbgojQXJyYXkgc2l6ZSBpcyBvZGQsIHNvIGRpc3BsYXkgdGhlIG1pZGRsZSB2YWx1ZQogICAgbW92ICAgICBlYXgsIFtlZGldCiAgICBjYWxsICAgIFdyaXRlRGVjCiAgICBjYWxsICAgIENyTGYKICAgIGNhbGwgICAgQ3JMZgogICAgam1wICAgICBlbmRNZWRpYW4KaXNFdmVuOgojQXJyYXkgc2l6ZSBpcyBldmVuIHNvIGF2ZXJhZ2UgdGhlIHR3byBtaWRkbGUgdmFsdWVzCiAgICBtb3YgICAgIGVheCwgW2VkaV0KICAgIGFkZCAgICAgZWF4LCBbZWRpLTRdCiAgICBjZHEKICAgIG1vdiAgICAgZWJ4LCAyCiAgICBkaXYgICAgIGVieAogICAgY2FsbCAgICBXcml0ZURlYwogICAgY2FsbCAgICBDckxmCiAgICBjYWxsICAgIENyTGYKZW5kTWVkaWFuOgogICAgcG9wYWQKICAgIHJldCAxMgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0Rpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBhbiBpbnRlZ2VyIGFycmF5LCAxMCBwZXIgcm93CiMgUmVjZWl2ZXMgcGFyYW1ldGVycyBvbiB0aGUgc3lzdGVtIHN0YWNrIChpbiBvcmRlciBwdXNoZWQpCiMgICAgICAgICAgIEFycmF5CiMgICAgICAgICAgIEFycmF5IFNpemUKIyAgICAgICAgICAgZGlzcGxheSBzdHJpbmcKI3JlZ2lzdGVyczogbm9uZQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpEaXNwbGF5TGlzdDoKICAgIHB1c2hhZAogICAgbW92ICAgICBlYnAsIGVzcAoKI2Rpc3BsYXkgc3RyaW5nCiAgICBtb3YgICAgIGVkeCwgW2VicCszNl0KICAgIGNhbGwgICAgV3JpdGVTdHJpbmcKICAgIGNhbGwgICAgQ3JMZgogICAgbW92ICAgICBlY3gsIFtlYnArNDBdCiAgICBtb3YgICAgIGVkaSwgW2VicCs0NF0KICAgIG1vdiAgICAgZWJ4LCAwCgojZGlzcGxheSBhcnJheSBjb250ZW50cwpsaXN0bG9vcDoKICAgIGluYyAgICAgZWJ4ICAgICAgICAgICAgICNjb3VudGVyIGZvciAxMCBpdGVtcyBwZXIgcm93CiAgICBtb3YgICAgIGVheCwgW2VkaV0KICAgIGNhbGwgICAgV3JpdGVEZWMKICAgIGFkZCAgICAgZWRpLCA0CiAgICBjbXAgICAgIGVieCwgMTAKICAgIGpuZSAgICAgbm9SZXR1cm4gICAgICAgICNqdW1wIGlmIDEwIGl0ZW1zIGFyZSBub3QgeWV0IHByaW50ZWQKICAgIGNhbGwgICAgQ3JMZgogICAgbW92ICAgICBlYngsIDAKICAgIGptcCAgICAgbm9UYWIgICAgICAgICAgICN0aGlzIHNraXBzIGFkZGluZyBhIHRhYiBvbiBhIG5ldyByb3cKbm9SZXR1cm46CiAgICBtb3YgICAgIGFsLCBUQUIKICAgIGNhbGwgICAgV3JpdGVDaGFyCm5vVGFiOgogICAgbG9vcCBsaXN0bG9vcAogICAgY2FsbCAgICBDckxmCiAgICBwb3BhZAogICAgcmV0IDEyCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojU2F5cyBnb29kLWJ5ZSB0byB0aGUgdXNlcgojIFJlY2VpdmVzIHBhcmFtZXRlcnMgb24gdGhlIHN5c3RlbSBzdGFjazoKIyAgICAgICBBZGRyZXNzIG9mIHN0cmluZwojcmVnaXN0ZXJzOiBub25lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkdvb2RieWU6CiAgICBwdXNoYWQKICAgIG1vdiAgICAgZWJwLCBlc3AKICAgIG1vdiAgICAgZWR4LCBbZWJwKzM2XQogICAgY2FsbCAgICBXcml0ZVN0cmluZwogICAgY2FsbCAgICBDckxmCiAgICBwb3BhZAogICAgcmV0ICAgICA0Cg==