Dear Seymour,

To decrease the amount of items sitting in wait to either be printed or inspected, two proposals were offered:

  1. the speed of your ten printers could either be increase at decreased cost or decreased by 20% at an increased costs;
  2. hire a new inspector at an increased rate per hour, with an increase inspection speed.

The best solution would be to marry these two proposals by both decreasing the printer speed by 20% of it’s current speed, incurring an added $0.50 per hour costs to printing costs and hiring a slightly faster inspector at $2 more than the current inspector. This would result in an average final cost of $123.81, with a total of 3.73 sheets sitting in wait at any give stage of the process and 10.14 sheets finishing production, on average per hour.

Sitting at 14.52 finish and inspected prints per hour on average, these changes would result in a 4.38 finished prints and a 2.91 decrease in prints waiting for inspection. These changes would also be associated with a $16.33 drop in overall average final costs, from the $140.14 current average final costs. By specifically decreasing the speed, 1.83 fewer sheets would be printed per hour from the current 7.52 being printed alongside 0.43 sheets decrease in blanks waiting to be printed on from the current 0.52 sheets sitting in wait. By hiring the new inspector, a 2.55 prints inspected per hour can expected to be lost as well as a decrease of 2.48 prints sitting in wait to be inspected from the current 7 sheets inspected per hour and 6.12 sheets sitting in wait, on average.

Below offers a detailed analysis of each proposal and their associated potential costs and efficency outcomes.

Current Status Quo Evaluation

Currently, there is a two stage production process. First sheets are run through the presses then sent to an inspection stations. Each work independently of themselves thus incurring separate costs. Ten presses and one inspector are currently employed by the printing company. There is a $7 hourly rate associated per print produced and $8 cost associated with work in progress sheets left witting in either presses or waiting to be inspected. The inspector charges $17 per hours. It is important to note that the current process leaves several prints waiting to be inspected.

The below table shows the current processing times and costs.

The current situation allows for between seven and eight sheets to be printed within an hour at sum cost of approximately $70. With ten presses going, we see that around half a sheet would be left in-process per hour at a cost of approximately $4.14 per hour. The takes approximately 64 minutes to process each of the sheets with half around half a sheet sitting for approximately 4 minutes on standby in the in-processing queue. Total hourly cost to run the ten printers sit at around $74.14.

Once the a sheet has been fully printed, it is sent over to the inspection station. The current inspector is able to inspect seven sheets at a cost of around $17 per hour. The inspector takes an hour to inspect seven sheets on average. Approximately six sheets sit waiting to be inspected per hour, incur a cost $49 per sheet on average. The waiting sheets sit for approximately 52.5 minutes per sheet. The hourly inspection costs sits at $66 total.

TABLE 1: Current State
Item Amounts Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Cost of Process Total Cost
Current State 10 Presses 7.52 0.52 64.43 4.43 4.14 70 74.14
Current Inspection 1 Inspector 7 6.12 60 52.5 49 17 66
Total Cost 10 Presses + 1 Inspector 14.52 6.64 124.43 56.93 53.14 87 140.14

Comparatively, printing a full sheet takes 4.43 minutes longer than it would take to inspect a single sheet.

The full two step process possesses possesses an expenditure of $140.14, on average per hour. For a single sheet to finish printing and recieve approval takes 60 minutes (one hour) on average. The work in progess accounts for approximately 38% of total costs, with a total cost of $53.14. The total processing costs sits at $87, which is 62% of total costs. In the current state, the printing costs make up the majority of the total cost. Finished prints waiting for inspection account for 35% of the total costs, resulting in the second biggest part of expenditure.

In general, the cost of allowing prints to sit waiting to be inspected seems incur the most dead weight cost, account approximately 92% of the total work in progress costs. This stock that is not being adequately moved also suggesting a bottleneck withing the system. The processing cost to print with ten printers running simultaneously incurs 80% of the hourly processing costs, thus suggesting the actually inspection process is relatively inspection compared to the actual printing.

Prospal Analysis

Due to Valentino’s displeasure with the current printing process, two proposals were offered.

The first offered a possibilities which alters the first stage product process:

  1. decrease the cost to $6.50 per print, which is $0.50 lower then the current cost, by increasing the printing time by 20%
  2. increase the cost to $7.50 per print, which is $0.50 higher than the current cost, by decreasing the printing time by 20%

The second proposal suggests to replace the current inspector with a newer and slightly faster inspector who’s hourly rate is $19 per hour, which is $2 above that of the current inspectors.

Proposal 4

In general, this analysis compares the first stage of the production process in the printing stages. It ought to be noted that this is not an analysis of the optimal amount of printing presses or time. The table below shows the current printing time, wait time and costs associated with the first stage of the production process:

TABLE 2: Comparing Printing Speeds
Printer Count Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Cost of Process Total Cost
Current State 10 7.52 0.52 64.43 4.43 4.14 70 74.14
Increase Speed 10 11.05 2.65 94.69 22.69 21.18 65 86.18
Decreased Speed 10 5.69 0.09 48.76 0.76 0.71 75 75.71

The current printing state is associated with a total cost of $74.14, resulting in an output of a approximately 7.5 fully printed sheets between ten presses with an average of half a sheet sitting in wait. These are associated with a print time of approximately 65 minutes and 4.5 minutes sitting in wait per sheet, on average.

Analysis of Increased Printing Time With Decreased Costs

The Table below shows a comparison between the current state and the results of increasing the printing press time.

Increasing the printing time by 20%, the associated total cost becomes $86.18. This increase in time produces approximately 11.1 sheets, on average, printed per hour by all ten pressed with approximately 2.6 sheets sitting in wait. Each sheets takes approximately an average of 95 minutes to fully print. The 2.6 sheets in progress each sit for 22.69 minutes in wait on average.

TABLE 3: Difference Between 20% Speed Increase with Current Speed
Number of Presses Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Cost of Printing Total Cost
Current State 10 7.52 0.52 64.43 4.43 4.14 70 74.14
Increase Speed 10 11.05 2.65 94.69 22.69 21.18 65 86.18
Difference (absolute) 10 3.53 2.13 30.26 18.26 17.04 -5 12.04

By increasing printing time, the ten presses are able to print approximately 3.5 more sheets than in the current state. But this would incur a $12.04 increase in total printing costs. What is concerning is the jump from less than a full printed page sitting in wait to just over two and a half pages sitting in way. This dramatically increases the cost of work in progress materials by $17.04, making up the majority (77%) of the total increase in costs. By contrast, there is a $5 decrease in processing costs though total costs increase to $86.18, which translates to an approximately 16% increase. This increase in final costs is driven by the increased sheets waiting for inspection, eating up any savings by the decrease in print costs.

Analysis of Decreased Printing Time With Increased Costs

By decreasing the time to 80% of it’s original time (decreasing time by 20%) results in a final cost of $75.71. The table below shows an average final costs of $75.71. The cost of processing nearly accounts for the full total, with the $0.71 in process cost representing the less than 10% of a sheet sitting in wait. At a decreased speed, a little over 5 sheets on average are printed per hour, taking around 49 minutes per sheet to finish on average. What is left in process waits one average 0.76 minutes to finish being processed as well.

TABLE 4: Difference between 20% Decreased Speed and Current Speed
Item Amounts Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Cost of Printing Total Cost
Current State 10 7.52 0.52 64.43 4.43 4.14 70 74.14
Decrease Speed 10 5.69 0.09 48.76 0.76 0.71 75 75.71
Difference (absolute) 10 1.83 0.43 15.70 3.67 3.43 -5 -1.57

Deceasing the speed printing speed by 20% results in printing just under 2 pages less than in the current state. This also happens to result in decreasing approximately half a page sitting in wait, to one-tenth of a page sitting in wait. This less than half a page decrease in sheets waiting to be processed, results in a nearly 83% drop in work in progress costs ($3.67 less). Process costs are increased by 7%, which is a $5 increased. Thus the final cost per hour is increased by $1.57 per hour. The money saved by decreasing the amount of sheets sitting in wait to be printed is eaten by the $5 increase in printing costs.

Comparing Scenario Differences

As shown in the table below, increasing speed by 20% would result in a majority of increases while decreasing the speed by the same amount would result in the majority of decreases. To increase the speed by 20% would results in a $12.04 increase in total costs summing to be $86.18. By contrast, decreasing the speed by 20% would result in a $1.57, which results in a final cost of $75.71.

TABLE 5: Comparing Speed Scenarios and Results
Item Amounts Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Cost of Printing Total Cost
Current State 10 7.52 0.52 64.43 4.43 4.14 70 74.14
Increase Difference 10 3.53 2.13 30.26 18.26 17.04 -5 12.04
Decrease Difference 10 -1.83 -0.43 -15.67 -3.67 -3.43 5 1.57

Upon deeper analysis, altering the speed by 20% either way, results in a $5 change in printing costs. The $3.43 in savings through the drop in work in progress costs eats covers nearly 70% of the $5 increase from printing costs through a 20% speed decrease. The $5 in saving, resultant by decreasing speed by 20% taken from printing costs, nearly covers 30% of the increased costs found by the increase in sheets sitting in wait. Thus between these two scenarios, increasing speed skews the cost change towards increased costs; while decreasing speed will more evenly distribute costs between increases and decreases. In general, change in total costs appear to be driven by the cost of leaving sheets in the presses.

Proposal 5

The second proposal related to the printing process focuses around increasing inspection time by replacing the current inspecting with a newer one. This newer inspector works at half a sheet faster per hour than the current inspector employed. But with this increased speed comes a $2 incease in cost per hour for inspection. This is the second stage in the production process, with only a single step–inspection. Sheets will arrive at the inspection statement directly after printing and at 7 sheets arriving per hour on average.

The current inspector is able to inspect 7 pieces per hour with each finished print taking 60 minutes. This costs $17 per hour. The current inspector has just over 6 prints waiting for him to inspect them per hour on average. Each print sits for around 53 minutes on average in the pile waiting to be seen. This is associated with a cost of $52.50. Together, the total cost of the inspection process costs $66.

Analysis of New Inspector

The new inspector is able to inspect 4.45 prints per hour on average resulting in an inspection cost of $19 per hour. There are just over 3.5 sheets left waiting to be inspected per hour. The costs associated with the waiting prints sit at $29.10, which makes up the majority of the $48.10 total cost for the inspection stage.

TABLE 6: Difference Between Inspectors
Number of Inspectors Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Inspection Cost Total Cost
Current Inspector 1 7.00 6.12 60.00 52.50 49.0 17 66.0
New Inspector 1 4.45 3.64 38.18 31.18 29.1 19 48.1
Difference 1 -2.55 -2.48 -21.82 -21.32 -19.9 2 -17.9

Over all, hiring the new inspector would result in a $17.9 decrease in the the total cost. There is a large cost savings found in the 2.48 decrease in amount of sheets sitting in wait, accounting for just under $20 in cost savings, amounting to a 40% drop in price. Notably, the new inspector will inspect 2.55 sheets fewer. This decrease in prints inspected will also speed up inspection time spent on the piece, reducing time by 21 minutes. The total cost incurred by each inspector is driven by prints sitting in wait, and remain to be regardless of which is chosen. The approximately 6 prints waiting for the current inspector accounts for nearly 75% of the total inspection cost. The just over 3.5 sheets sitting in wait for inspection by the new potential inspector can be associated with 60% of the total inspection costs.

Scenario Comparension

TABLE 7: Comparing Differences From Proposal Scenarios
# Processed Diff (sheets) # Waiting Diff (sheets) Processing Time Diff (min) Wait Time Diff (Min) WIP Cost Diff Process Cost Diff Total Cost Diff
Increase Speed 3.53 2.13 30.26 18.26 17.04 -5 12.04
Decrease Speed 1.83 0.43 15.7 3.67 3.43 -5 -1.57
New Inspector -2.55 -2.48 -21.82 -21.32 -19.9 2 -17.9

Increasing the speed will increase the amount of sheets printed, but doing so will increase the number of sheets sitting in wait. Overall this will increase the costs, while doing little to improve wait time. Decreasing the speed will slightly decrease the amount of sheet printed but also decrease an already low number of sheets waiting to a smaller amount. The printing costs will increase, though cost savings can be found through the decrease in sheets waiting to be printed. Not enough to offset the slight cost increase associated with a speed reduction though. Replacing the current inspector cause the most drastic changes. While the new inspector will decrease the number of sheets inspector, the number of sheets sitting in wait for inspection will almost equally decrease as well. This caused the most cost savings, resulting in an overall cost decrease for the second stage of the producation process, while the speed overall increased the total cost for the first stage. As exemplified by the table above.

TABLE 8: Comparing Each Scencario Results with Current Production State
# Processed Diff (sheets) # Waiting Diff (sheets) Processing Time Diff (min) Wait Time Diff (Min) WIP Cost Diff Process Cost Diff Total Cost Diff
Current Speed 7.52 0.52 64.43 4.43 4.14 70 74.14
Current Inspector 7 6.12 60 52.5 49 17 66
Increase Speed 11.05 2.65 94.69 22.69 21.18 65 86.18
Decrease Speed 5.69 0.09 48.76 0.76 0.71 75 75.71
New Inspector 4.45 3.64 38.18 31.18 29.1 19 48.1

Overall, as seen in the table above, decreasing the press speed while utilizing all ten presses will decrease the amount of sheets waiting to be printed while also cutting the wait time by 26%. This will result in just over $1.50 increase in the final price. While decreasing speed will improve wait time and sheets sitting in wait, it ought to be noted that the change in number of sheets sitting in wait is negligible (from sheet a page to 10% of a sheet). Hiring the new inspector will cut the amount of prints sitting in wait by nearly half at a 41% decrease. The wait time is also dropped to just over 38 minutes, decreasing wait time by 36%. Both actions would forward the goal of reducing wait time in both stages of the production process.

Conclusions and Recommendations

The best course of action to reduce wait time would be by accepting the proposal to decrease printing speed by 20% while hiring a new inspector. This would result in an overall average processing time of nearly 87 minutes and a average waiting time of nearly 30 minutes per sheet. Cumulative, it would take an average of 117 minute for a single print to finish the entire production process. This is drastic drop of 64 minutes from the approximate average full production time of 181 minutes it current takes for a sheet to finish production.

TABLE 9: Comparing Scenario Combination Results
Scenario Amount Processed (Sheets) per Hour Amount In-Process (Sheets) per Hour Time to Process (minutes) Wait Time for Processing (minutes) Work in Progress Cost Cost of Process Total Cost
Current Status 14.52 6.64 124.43 56.93 53.14 87 140.14
Current Speed + New Inspector 11.97 4.16 102.61 35.61 33.24 89 122.24
Increased Speed + Current Inspector 18.05 8.77 154.69 75.19 70.18 82 152.18
Decreased Speed + Current Inspector 12.69 6.21 108.76 53.26 49.71 92 141.71
Increased Speed + New Inspector 15.5 6.29 132.87 53.87 50.28 84 134.28
Deceased Speed + New Inspector 10.14 3.73 86.94 31.94 29.81 94 123.81

By combining a decrease in printing speed and the hiring of a new inspector, the total cost saving would result in $16.33, with final costs sitting at around $124 per hour. While this is not lowest cost that can be obtained, it the second to lowest, only beaten by just a $1.50 difference by the first lowest price associated with combining the current printing speed and hiring a new inspector. This would not result in drastically lowering the overall wait time between the two stage of the production process to the minimum possible number of sheets sitting in wait.

Final Thoughts and Alertnative Possibilities

Two final thoughts of note, the inspection station drives the increases in both the amount of wait time and costs. While hiring a new inspector is an option, it is not the most cost effective option. An alternative option could be to hire a second inspector working at the same speed as the current inspector with at the same rate. The same can be said about the number of printers running. Altering the number of printers along with speed could better optimize the production line as well. A combination of these two possibilities could result in drastically lower wait times as well as overall lower costs.

For example, retaining the current number of printers running at the same speed while doubling the current inspector’s ability would decrease the overall number of sheets sitting in wait to 68% of a single sheet, with a total cost of $113.45 which is $10 less than what the current best option offers. Combining the possibility hiring a second inspector of the same caliber at the same cost as the current alongside decreasing speed would result in lower wait times, though faster processing times as well.

Appendix: Optimization

The below tables show the what potential costs and speeds would be associated with altering the current production set up by varying:

  • speeds between:
    • the current speed
    • 20% faster than the current speed
    • 20% slower than the current speed
  • hiring multiple inspectors:
    • at the current inspector’s speed
    • at the new inspector’s increased speed

with the same associated current costs as the current conditions stand. The tables below do not include costs associated with procurement. The tables below a nonlinear relationship in printing speeds and inspecting speeds with the addition or reduction in amount of printers and/or inspectors utilized. It ought to be duly noted that increasing the number of printers or inspectors will eventually cease to be beneficial by either reducing cost, reducing time, or both. This can clearly be seen when times and/or costs cease to change.

Current Speed

Servers L Lq W (minutes) Wq (minutes) Lost Profit Server Cost Total Cost
8 11.45 4.45 98.12 38.12 35.58 152 187.58
9 8.35 1.35 71.55 11.55 10.78 171 181.78
10 7.52 0.52 64.43 4.43 4.14 190 194.14
11 7.21 0.21 61.82 1.82 1.70 209 210.70
12 7.09 0.09 60.75 0.75 0.70 228 228.70
13 7.04 0.04 60.31 0.31 0.00 247 247.00
14 7.01 0.01 60.12 0.12 0.00 266 266.00
15 7.01 0.01 60.05 0.05 0.00 285 285.00
16 7.00 0.00 60.02 0.02 0.00 304 304.00
17 7.00 0.00 60.01 0.01 0.00 323 323.00
18 7.00 0.00 60.00 0.00 0.00 342 342.00
19 7.00 0.00 60.00 0.00 0.00 361 361.00
20 7.00 0.00 60.00 0.00 0.00 380 380.00

Increased Speed

Servers L Lq W (minutes) Wq (minutes) Lost Profit Server Cost Total Cost
6 38.18 32.35 327.27 277.27 258.79 114 372.79
7 8.63 2.79 73.94 23.94 22.35 133 155.35
8 6.69 0.86 57.37 7.37 6.88 152 158.88
9 6.15 0.32 52.71 2.71 2.53 171 173.53
10 5.96 0.12 51.04 1.04 0.97 190 190.97
11 5.88 0.05 50.40 0.40 0.00 209 209.00
12 5.85 0.02 50.15 0.15 0.00 228 228.00
13 5.84 0.01 50.05 0.05 0.00 247 247.00
14 5.84 0.00 50.02 0.02 0.00 266 266.00
15 5.83 0.00 50.01 0.01 0.00 285 285.00
16 5.83 0.00 50.00 0.00 0.00 304 304.00
17 5.83 0.00 50.00 0.00 0.00 323 323.00
18 5.83 0.00 50.00 0.00 0.00 342 342.00
19 5.83 0.00 50.00 0.00 0.00 361 361.00
20 5.83 0.00 50.00 0.00 0.00 380 380.00

Decreased Speed

Servers L Lq W (minutes) Wq (minutes) Lost Profit Server Cost Total Cost
9 40.47 31.72 346.87 271.87 253.75 171 424.75
10 12.93 4.18 110.82 35.82 33.43 190 223.43
11 10.22 1.47 87.60 12.60 11.76 209 220.76
12 9.37 0.62 80.29 5.29 4.94 228 232.94
13 9.02 0.27 77.35 2.35 2.19 247 249.19
14 8.87 0.12 76.05 1.05 0.98 266 266.98
15 8.80 0.05 75.47 0.47 0.00 285 285.00
16 8.77 0.02 75.20 0.20 0.00 304 304.00
17 8.76 0.01 75.09 0.09 0.00 323 323.00
18 8.75 0.00 75.04 0.04 0.00 342 342.00
19 8.75 0.00 75.01 0.01 0.00 361 361.00
20 8.75 0.00 75.01 0.01 0.00 380 380.00

Old Inspector

Servers L Lq W (minutes) Wq (minutes) Lost Profit Server Cost Total Cost
1 4.45 3.64 38.18 31.18 29.10 17 46.10
2 0.98 0.16 8.40 1.40 1.31 34 35.31
3 0.84 0.02 7.18 0.18 0.00 51 51.00
4 0.82 0.00 7.02 0.02 0.00 68 68.00
5 0.82 0.00 7.00 0.00 0.00 85 85.00
6 0.82 0.00 7.00 0.00 0.00 102 102.00
7 0.82 0.00 7.00 0.00 0.00 119 119.00

New Inspector

Servers L Lq W (minutes) Wq (minutes) Lost Profit Server Cost Total Cost
1 7.00 6.12 60.00 52.50 49.00 19 68.00
2 1.08 0.21 9.28 1.78 1.66 38 39.66
3 0.90 0.03 7.73 0.23 0.00 57 57.00
4 0.88 0.00 7.53 0.03 0.00 76 76.00
5 0.88 0.00 7.50 0.00 0.00 95 95.00
6 0.88 0.00 7.50 0.00 0.00 114 114.00
7 0.88 0.00 7.50 0.00 0.00 133 133.00
LS0tDQp0aXRsZTogIlRlbm55c29uLS1NZW1vLS1GaW5hbCBQcm9qZWN0IFBhcnQgSUkiDQphdXRob3I6ICJFbWlseSBUZW5ueXNvbiINCmRhdGU6ICI2LzEyLzIwMjAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAga2VlcF9tZDogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KLS0tDQoNCjxzdHlsZT4NCmJvZHkgew0KdGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJoaWRlIiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgQ2xlYXIgZW52aXJvbm1lbnQgb2YgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMNCnJtKGxpc3QgPSBscyhhbGwgPSBUUlVFKSkgDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KbGlicmFyeShtYWdyaXR0cikNCg0KbGlicmFyeShmb3JtYXR0YWJsZSkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGxwU29sdmVBUEkpDQpsaWJyYXJ5KGhlcmUpDQoNCiMgTG9hZCAicXVldWVpbmciIHBhY2thZ2UNCmxpYnJhcnkocXVldWVpbmcpDQpgJT4lYCA8LSBtYWdyaXR0cjo6YCU+JWANCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIENVUlJFTlQgUFJJTlRJTkcgU1BFRUQNCg0KIyBOdW1iZXIgb2YgUHJlc3Nlcw0KcyA8LSAxMA0KbiA8LSAxMA0KDQojIENvc3QgcGVyIExlZnQgU2l0dGluZyBQcmludA0KcGkgPC0gOA0KDQojIENvc3QgcGVyIFByZXNzIHBlciBob3VyDQpjb3N0IDwtIDcNCg0KIyBCdWlsZCBhIHRhYmxlIG9mIHJlc3VsdHMNCnRhYl9zbWMgPC0gYXMuZGF0YS5mcmFtZShtYXRyaXgoMCwgbisxLCA4KSkNCg0KIyBMb29wIHRvIGJ1aWxkIHRhYmxlIG9mIHJlc3VsdHMNCmZvciAocyBpbiAwOm4pew0KDQogICMgVXNpbmcgInF1ZXVlaW5nIiBwYWNrYWdlDQogIHNtX2MgPC0gTmV3SW5wdXQuTU1DKGxhbWJkYSA9IDcsIG11ID0gMSwgYyA9IDEwLCBuID0gMTApDQogIHNtYyA8LSBRdWV1ZWluZ01vZGVsLmlfTU1DKHNtX2MpDQoNCiAgIyBDb3N0IG9mIHNpdHRpbmcgcHJpbnRzDQogIGxwIDwtIGlmZWxzZShzbWMkV3EqNjAgPiAwLjUsIHNtYyRMcSAqIHBpLCAwKQ0KICANCiAgIyBDb3N0IG9mIHByaW50aW5nDQogIHNjIDwtIHMqY29zdCAgDQogIA0KICAjIFRvdGFsIGNvc3QNCiAgdGMgPC0gc2MgKyBscA0KICANCiAgIyBQbGFjZSByZXN1bHRzIGFzIGEgcm93IGluIGEgdGFibGUNCiAgIyBNdWx0aXBseSB3YWl0IGJ5IDYwIG1pbnV0ZXMgaW4gYW4gaG91ciB0byBjb252ZXJ0IHRpbWUgZnJvbSBob3VycyB0byBtaW51dGVzDQogIHRhYl9zbWNbcysxLF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQoNCn0NCg0KDQojIEFkZCBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKHRhYl9zbWMpIDwtIGMoIlByZXNzIiwgIkwiLCAiTHEiLCAiVyAobWludXRlcykiLCAiV3EgKG1pbnV0ZXMpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJDb3N0IG9mIFNpdHRpbmcgUHJpbnQiLCAiQ29zdCBvZiBGaW5pc2hlZCBQcmludCIsICJUb3RhbCBDb3N0IikNCg0KIyBTaG93IHJlc3VsdHMsIG5vdGUgdGhhdCBMLCBMcSwgVywgV3EgcmVtYWluIGNvbnN0YW50DQp0YWJfc21jICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCg0KDQoNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KcHJlc3NfY3VycmVudCA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeCgwLCAxLCA4KSkNCg0KIyBNdWx0aXBseSB3YWl0IGJ5IDYwIG1pbnV0ZXMgaW4gYW4gaG91ciB0byBjb252ZXJ0IHRpbWUgZnJvbSBob3VycyB0byBtaW51dGVzDQpwcmVzc19jdXJyZW50WzEsXSA8LSByb3VuZChjKHMsIHNtYyRMLCBzbWMkTHEsIHNtYyRXKjYwLCBzbWMkV3EqNjAsIGxwLCBzYywgdGMpLCAyKSANCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhwcmVzc19jdXJyZW50KSA8LSBjKCJQcmVzcyIsICJMIiwgIkxxIiwgIlcgKG1pbnV0ZXMpIiwgIldxIChtaW51dGVzKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiQ29zdCBvZiBTaXR0aW5nIFByaW50IiwgIkNvc3Qgb2YgRmluaXNoZWQgUHJpbnQiLCAiVG90YWwgQ29zdCIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KcHJlc3NfY3VycmVudCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUiLCBpbmNsdWRlID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBDVVJSRU5UIElOU1BFQ1RJT04NCg0KIyBOdW1iZXIgb2YgUHJpbnRzDQpzIDwtIDEwDQpuIDwtIDEwDQpmID0gMQ0KIyBDb3N0IHBlciBMZWZ0IFNpdHRpbmcgUHJpbnQgcGVyIHByaW50DQpwaSA8LSA4DQoNCiMgQ29zdCBwZXIgUHJpbnQgSW5zcGVjdGlvbiBwZXIgaG91cg0KY29zdCA8LSAxNw0KDQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KdGFiX3NtYyA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeCgwLCBuKzEsIDgpKQ0KDQoNCiMgTG9vcCB0byBidWlsZCB0YWJsZSBvZiByZXN1bHRzDQpmb3IgKHMgaW4gMDpuKXsNCg0KICAjIFVzaW5nICJxdWV1ZWluZyIgcGFja2FnZQ0KICBzbV9jIDwtIE5ld0lucHV0Lk1NMShsYW1iZGEgPSA3LCBtdSA9IDYwLzcuNSkNCiAgc21jIDwtIFF1ZXVlaW5nTW9kZWwuaV9NTTEoc21fYykNCg0KICAjIENvc3Qgb2Ygc2l0dGluZyBwcmludA0KICBscCA8LSBpZmVsc2Uoc21jJFdxKjYwID4gMC41LCBzbWMkTHEgKiBwaSwgMCkNCiAgDQogICMgQ29zdCBvZiBpbnNwZWN0aW9uDQogIHNjIDwtIHMqY29zdCAgDQogIA0KICAjIFRvdGFsIGNvc3QNCiAgdGMgPC0gc2MgKyBscA0KICANCiAgIyBQbGFjZSByZXN1bHRzIGFzIGEgcm93IGluIGEgdGFibGUNCiAgICAjIE11bHRpcGx5IHdhaXQgYnkgNjAgbWludXRlcyBpbiBhbiBob3VyIHRvIGNvbnZlcnQgdGltZSBmcm9tIGhvdXJzIHRvIG1pbnV0ZXMNCiAgdGFiX3NtY1tzKzEsXSA8LSByb3VuZChjKHMsIHNtYyRMLCBzbWMkTHEsIHNtYyRXKjYwLCBzbWMkV3EqNjAsIGxwLCBzYywgdGMpLCAyKSANCn0NCg0KDQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXModGFiX3NtYykgPC0gYygiSW5zcGVjdG9yIiwgIkwiLCAiTHEiLCAiVyAobWludXRlcykiLCAiV3EgKG1pbnV0ZXMpIiwgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEluc3BlY3Rpb24iLCAiVG90YWwgQ29zdCIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KdGFiX3NtYyAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQoNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KaW5zcGVjdGlvbl9jdXJyZW50IDwtIHRhYl9zbWNbMixdDQoNCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhpbnNwZWN0aW9uX2N1cnJlbnQpIDwtIGMoIkluc3BlY3RvciIsICJMIiwgIkxxIiwgIlcgKG1pbnV0ZXMpIiwgIldxIChtaW51dGVzKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiQ29zdCBvZiBTaXR0aW5nIFByaW50IiwgIkNvc3Qgb2YgRmluaXNoZWQgUHJpbnQiLCAiVG90YWwgQ29zdCIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KaW5zcGVjdGlvbl9jdXJyZW50ICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIElOQ1JFQVNJTkcgU1BFRUQgQVQgTE9XRVIgQ09TVFMNCg0KIyBOdW1iZXIgb2YgUHJlc3Nlcw0KcyA8LSAxMA0KDQojIENvc3QgcGVyIExlZnQgU2l0dGluZyBQcmludA0KcGkgPC0gOA0KDQojIENvc3QgcGVyIFByZXNzIHBlciBob3VyDQpjb3N0IDwtIDYuNQ0KDQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KdGFiX3NtYyA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeCgwLCBuKzEsIDgpKQ0KDQojIExvb3AgdG8gYnVpbGQgdGFibGUgb2YgcmVzdWx0cw0KZm9yIChzIGluIDA6MTApew0KDQogICMgVXNpbmcgInF1ZXVlaW5nIiBwYWNrYWdlDQogIHNtX2MgPC0gTmV3SW5wdXQuTU1DKGxhbWJkYSA9IDcsIG11ID0gMS8xLjIsIGMgPSAxMCwgbiA9IDEwKQ0KICBzbWMgPC0gUXVldWVpbmdNb2RlbC5pX01NQyhzbV9jKQ0KDQogICMgQ29zdCBvZiBzaXR0aW5nIHByaW50cw0KICBscCA8LSBpZmVsc2Uoc21jJFdxKjYwID4gMC41LCBzbWMkTHEgKiBwaSwgMCkNCiAgDQogICMgQ29zdCBvZiBwcmludGluZw0KICBzYyA8LSBzKmNvc3QgIA0KICANCiAgIyBUb3RhbCBjb3N0DQogIHRjIDwtIHNjICsgbHANCiAgDQogICMgUGxhY2UgcmVzdWx0cyBhcyBhIHJvdyBpbiBhIHRhYmxlDQogICAgIyBNdWx0aXBseSB3YWl0IGJ5IDYwIG1pbnV0ZXMgaW4gYW4gaG91ciB0byBjb252ZXJ0IHRpbWUgZnJvbSBob3VycyB0byBtaW51dGVzDQogIHRhYl9zbWNbcysxLF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQp9DQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXModGFiX3NtYykgPC0gYygiUHJlc3MiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEZpbmlzaGVkIFByaW50IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnRhYl9zbWMgJT4lIA0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpKQ0KDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUiLCBpbmNsdWRlID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBCdWlsZCBhIHRhYmxlIG9mIHJlc3VsdHMNCnByZXNzX2luY3JlYXNlIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KDAsIDEsIDgpKQ0KDQojIE11bHRpcGx5IHdhaXQgYnkgNjAgbWludXRlcyBpbiBhbiBob3VyIHRvIGNvbnZlcnQgdGltZSBmcm9tIGhvdXJzIHRvIG1pbnV0ZXMNCnByZXNzX2luY3JlYXNlWzEsXSA8LSByb3VuZChjKHMsIHNtYyRMLCBzbWMkTHEsIHNtYyRXKjYwLCBzbWMkV3EqNjAsIGxwLCBzYywgdGMpLCAyKSANCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhwcmVzc19pbmNyZWFzZSkgPC0gYygiUHJlc3MiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEZpbmlzaGVkIFByaW50IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnByZXNzX2luY3JlYXNlICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojREVDUkVBU0lORyBTUEVFRCBBVCBISUdIRVIgQ09TVFMNCg0KIyBOdW1iZXIgb2YgUHJlc3Nlcw0KcyA8LSAxMA0KDQojIENvc3QgcGVyIExlZnQgU2l0dGluZyBQcmludCBwZXIgcHJpbnQNCnBpIDwtIDgNCg0KIyBDb3N0IHBlciBQcmVzcyBwZXIgaG91cg0KY29zdCA8LSA3LjUNCg0KIyBCdWlsZCBhIHRhYmxlIG9mIHJlc3VsdHMNCnRhYl9zbWMgPC0gYXMuZGF0YS5mcmFtZShtYXRyaXgoMCwgbisxLCA4KSkNCg0KIyBMb29wIHRvIGJ1aWxkIHRhYmxlIG9mIHJlc3VsdHMNCmZvciAocyBpbiAwOjEwKXsNCg0KICAjIFVzaW5nICJxdWV1ZWluZyIgcGFja2FnZQ0KICBzbV9jIDwtIE5ld0lucHV0Lk1NQyhsYW1iZGEgPSA3LCBtdSA9IDEvLjgsIGMgPSAxMCwgbiA9IDEwKQ0KICBzbWMgPC0gUXVldWVpbmdNb2RlbC5pX01NQyhzbV9jKQ0KDQogICMgQ29zdCBvZiBzaXR0aW5nIHByaW50cw0KICBscCA8LSBpZmVsc2Uoc21jJFdxKjYwID4gMC41LCBzbWMkTHEgKiBwaSwgMCkNCiAgDQogICMgQ29zdCBvZiBwcmludHMNCiAgc2MgPC0gcypjb3N0IA0KICANCiAgIyBUb3RhbCBjb3N0DQogIHRjIDwtIHNjICsgbHANCiAgDQogICMgUGxhY2UgcmVzdWx0cyBhcyBhIHJvdyBpbiBhIHRhYmxlDQogICAgIyBNdWx0aXBseSB3YWl0IGJ5IDYwIG1pbnV0ZXMgaW4gYW4gaG91ciB0byBjb252ZXJ0IHRpbWUgZnJvbSBob3VycyB0byBtaW51dGVzDQogIHRhYl9zbWNbcysxLF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQp9DQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXModGFiX3NtYykgPC0gYygiUHJlc3MiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEZpbmlzaGVkIFByaW50IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnRhYl9zbWMgJT4lIA0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpKQ0KDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gImhpZGUiLCBpbmNsdWRlID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBCdWlsZCBhIHRhYmxlIG9mIHJlc3VsdHMNCnByZXNzX2RlY3JlYXNlIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KDAsIDEsIDgpKQ0KDQojIE11bHRpcGx5IHdhaXQgYnkgNjAgbWludXRlcyBpbiBhbiBob3VyIHRvIGNvbnZlcnQgdGltZSBmcm9tIGhvdXJzIHRvIG1pbnV0ZXMNCnByZXNzX2RlY3JlYXNlWzEsXSA8LSByb3VuZChjKHMsIHNtYyRMLCBzbWMkTHEsIHNtYyRXKjYwLCBzbWMkV3EqNjAsIGxwLCBzYywgdGMpLCAyKSANCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhwcmVzc19kZWNyZWFzZSkgPC0gYygiUHJlc3MiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEZpbmlzaGVkIFByaW50IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnByZXNzX2RlY3JlYXNlICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIE5FVyBJTlNQRUNUT1IgQVQgSElHSEVSIENPU1QgV0lUSCBGQVNURVIgU1BFRUQNCg0KIyBOdW1iZXIgb2YgUHJpbnRzDQpzIDwtIDgNCm4gPC0gMTANCg0KIyBDb3N0IHBlciBMZWZ0IFNpdHRpbmcgUHJpbnQNCnBpIDwtIDgNCg0KIyBDb3N0IHBlciBQcmludCBJbnNwZWN0aW9uIHBlciBob3VyDQpjb3N0IDwtIDE5DQoNCiMgQnVpbGQgYSB0YWJsZSBvZiByZXN1bHRzDQp0YWJfc21jIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KDAsIG4rMSwgOCkpDQoNCg0KIyBMb29wIHRvIGJ1aWxkIHRhYmxlIG9mIHJlc3VsdHMNCmZvciAocyBpbiAwOm4pew0KDQogICMgVXNpbmcgInF1ZXVlaW5nIiBwYWNrYWdlDQogIHNtX2MgPC0gTmV3SW5wdXQuTU0xKGxhbWJkYSA9IDcsIG11ID0gNjAvNykNCiAgc21jIDwtIFF1ZXVlaW5nTW9kZWwuaV9NTTEoc21fYykNCg0KICAjIENvc3Qgb2Ygc2l0dGluZyBwcmludHMNCiAgbHAgPC0gaWZlbHNlKHNtYyRXcSo2MCA+IDAuNSwgc21jJExxICogcGksIDApDQogIA0KICAjIENvc3Qgb2YgaW5zcGVjdGlvbg0KICBzYyA8LSBzKmNvc3QgIA0KICANCiAgIyBUb3RhbCBjb3N0DQogIHRjIDwtIHNjICsgbHANCiAgDQogICMgUGxhY2UgcmVzdWx0cyBhcyBhIHJvdyBpbiBhIHRhYmxlDQogICAgIyBNdWx0aXBseSB3YWl0IGJ5IDYwIG1pbnV0ZXMgaW4gYW4gaG91ciB0byBjb252ZXJ0IHRpbWUgZnJvbSBob3VycyB0byBtaW51dGVzDQogIHRhYl9zbWNbcysxLF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQp9DQoNCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyh0YWJfc21jKSA8LSBjKCJJbnNwZWN0b3IiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEluc3BlY3Rpb24iLCAiVG90YWwgQ29zdCIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KdGFiX3NtYyAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJoaWRlIiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgQnVpbGQgYSB0YWJsZSBvZiByZXN1bHRzDQppbnNwZWN0aW9uX25ldyA8LSB0YWJfc21jWzIsXQ0KDQojIEFkZCBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKGluc3BlY3Rpb25fbmV3KSA8LSBjKCJJbnNwZWN0b3IiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkNvc3Qgb2YgU2l0dGluZyBQcmludCIsICJDb3N0IG9mIEZpbmlzaGVkIFByaW50IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCmluc3BlY3Rpb25fbmV3ICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQpEZWFyIFNleW1vdXIsDQoNClRvIGRlY3JlYXNlIHRoZSBhbW91bnQgb2YgaXRlbXMgc2l0dGluZyBpbiB3YWl0IHRvIGVpdGhlciBiZSBwcmludGVkIG9yIGluc3BlY3RlZCwgdHdvIHByb3Bvc2FscyB3ZXJlIG9mZmVyZWQ6DQoNCjEpIHRoZSBzcGVlZCBvZiB5b3VyIHRlbiBwcmludGVycyBjb3VsZCBlaXRoZXIgYmUgaW5jcmVhc2UgYXQgZGVjcmVhc2VkIGNvc3Qgb3IgZGVjcmVhc2VkIGJ5IDIwJSBhdCBhbiBpbmNyZWFzZWQgY29zdHM7IA0KMikgaGlyZSBhIG5ldyBpbnNwZWN0b3IgYXQgYW4gaW5jcmVhc2VkIHJhdGUgcGVyIGhvdXIsIHdpdGggYW4gaW5jcmVhc2UgaW5zcGVjdGlvbiBzcGVlZC4NCg0KVGhlIGJlc3Qgc29sdXRpb24gd291bGQgYmUgdG8gbWFycnkgdGhlc2UgdHdvIHByb3Bvc2FscyBieSBib3RoIGRlY3JlYXNpbmcgdGhlIHByaW50ZXIgc3BlZWQgYnkgMjAlIG9mIGl0J3MgY3VycmVudCBzcGVlZCwgaW5jdXJyaW5nIGFuIGFkZGVkICQwLjUwIHBlciBob3VyIGNvc3RzIHRvIHByaW50aW5nIGNvc3RzIGFuZCBoaXJpbmcgYSBzbGlnaHRseSBmYXN0ZXIgaW5zcGVjdG9yIGF0ICQyIG1vcmUgdGhhbiB0aGUgY3VycmVudCBpbnNwZWN0b3IuIFRoaXMgd291bGQgcmVzdWx0IGluIGFuIGF2ZXJhZ2UgZmluYWwgY29zdCBvZiAkMTIzLjgxLCB3aXRoIGEgdG90YWwgb2YgMy43MyBzaGVldHMgc2l0dGluZyBpbiB3YWl0IGF0IGFueSBnaXZlIHN0YWdlIG9mIHRoZSBwcm9jZXNzIGFuZCAxMC4xNCBzaGVldHMgZmluaXNoaW5nIHByb2R1Y3Rpb24sIG9uIGF2ZXJhZ2UgcGVyIGhvdXIuIA0KDQpTaXR0aW5nIGF0IDE0LjUyIGZpbmlzaCBhbmQgaW5zcGVjdGVkIHByaW50cyBwZXIgaG91ciBvbiBhdmVyYWdlLCB0aGVzZSBjaGFuZ2VzIHdvdWxkIHJlc3VsdCBpbiBhIDQuMzggZmluaXNoZWQgcHJpbnRzIGFuZCBhIDIuOTEgZGVjcmVhc2UgaW4gcHJpbnRzIHdhaXRpbmcgZm9yIGluc3BlY3Rpb24uIFRoZXNlIGNoYW5nZXMgd291bGQgYWxzbyBiZSBhc3NvY2lhdGVkIHdpdGggYSAkMTYuMzMgZHJvcCBpbiBvdmVyYWxsIGF2ZXJhZ2UgZmluYWwgY29zdHMsIGZyb20gdGhlICQxNDAuMTQgY3VycmVudCBhdmVyYWdlIGZpbmFsIGNvc3RzLiBCeSBzcGVjaWZpY2FsbHkgZGVjcmVhc2luZyB0aGUgc3BlZWQsIDEuODMgZmV3ZXIgc2hlZXRzIHdvdWxkIGJlIHByaW50ZWQgcGVyIGhvdXIgZnJvbSB0aGUgY3VycmVudCA3LjUyIGJlaW5nIHByaW50ZWQgYWxvbmdzaWRlIDAuNDMgc2hlZXRzIGRlY3JlYXNlIGluIGJsYW5rcyB3YWl0aW5nIHRvIGJlIHByaW50ZWQgb24gZnJvbSB0aGUgY3VycmVudCAwLjUyIHNoZWV0cyBzaXR0aW5nIGluIHdhaXQuIEJ5IGhpcmluZyB0aGUgbmV3IGluc3BlY3RvciwgYSAyLjU1IHByaW50cyBpbnNwZWN0ZWQgcGVyIGhvdXIgY2FuIGV4cGVjdGVkIHRvIGJlIGxvc3QgYXMgd2VsbCBhcyBhIGRlY3JlYXNlIG9mIDIuNDggcHJpbnRzIHNpdHRpbmcgaW4gd2FpdCB0byBiZSBpbnNwZWN0ZWQgZnJvbSB0aGUgY3VycmVudCA3IHNoZWV0cyBpbnNwZWN0ZWQgcGVyIGhvdXIgYW5kIDYuMTIgc2hlZXRzIHNpdHRpbmcgaW4gd2FpdCwgb24gYXZlcmFnZS4NCg0KQmVsb3cgb2ZmZXJzIGEgZGV0YWlsZWQgYW5hbHlzaXMgb2YgZWFjaCBwcm9wb3NhbCBhbmQgdGhlaXIgYXNzb2NpYXRlZCBwb3RlbnRpYWwgY29zdHMgYW5kIGVmZmljZW5jeSBvdXRjb21lcy4NCg0KIyBDdXJyZW50IFN0YXR1cyBRdW8gRXZhbHVhdGlvbg0KDQpDdXJyZW50bHksIHRoZXJlIGlzIGEgdHdvIHN0YWdlIHByb2R1Y3Rpb24gcHJvY2Vzcy4gRmlyc3Qgc2hlZXRzIGFyZSBydW4gdGhyb3VnaCB0aGUgcHJlc3NlcyB0aGVuIHNlbnQgdG8gYW4gaW5zcGVjdGlvbiBzdGF0aW9ucy4gRWFjaCB3b3JrIGluZGVwZW5kZW50bHkgb2YgdGhlbXNlbHZlcyB0aHVzIGluY3VycmluZyBzZXBhcmF0ZSBjb3N0cy4gVGVuIHByZXNzZXMgYW5kIG9uZSBpbnNwZWN0b3IgYXJlIGN1cnJlbnRseSBlbXBsb3llZCBieSB0aGUgcHJpbnRpbmcgY29tcGFueS4gVGhlcmUgaXMgYSAkNyBob3VybHkgcmF0ZSBhc3NvY2lhdGVkIHBlciBwcmludCBwcm9kdWNlZCBhbmQgJDggY29zdCBhc3NvY2lhdGVkIHdpdGggd29yayBpbiBwcm9ncmVzcyBzaGVldHMgbGVmdCB3aXR0aW5nIGluIGVpdGhlciBwcmVzc2VzIG9yIHdhaXRpbmcgdG8gYmUgaW5zcGVjdGVkLiBUaGUgaW5zcGVjdG9yIGNoYXJnZXMgJDE3IHBlciBob3Vycy4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgY3VycmVudCBwcm9jZXNzIGxlYXZlcyBzZXZlcmFsIHByaW50cyB3YWl0aW5nIHRvIGJlIGluc3BlY3RlZC4gDQoNClRoZSBiZWxvdyB0YWJsZSBzaG93cyB0aGUgY3VycmVudCBwcm9jZXNzaW5nIHRpbWVzIGFuZCBjb3N0cy4NCg0KVGhlIGN1cnJlbnQgc2l0dWF0aW9uIGFsbG93cyBmb3IgYmV0d2VlbiBzZXZlbiBhbmQgZWlnaHQgc2hlZXRzIHRvIGJlIHByaW50ZWQgd2l0aGluIGFuIGhvdXIgYXQgc3VtIGNvc3Qgb2YgYXBwcm94aW1hdGVseSAkNzAuIFdpdGggdGVuIHByZXNzZXMgZ29pbmcsIHdlIHNlZSB0aGF0IGFyb3VuZCBoYWxmIGEgc2hlZXQgd291bGQgYmUgbGVmdCBpbi1wcm9jZXNzIHBlciBob3VyIGF0IGEgY29zdCBvZiBhcHByb3hpbWF0ZWx5ICQ0LjE0IHBlciBob3VyLiBUaGUgdGFrZXMgYXBwcm94aW1hdGVseSA2NCBtaW51dGVzIHRvIHByb2Nlc3MgZWFjaCBvZiB0aGUgc2hlZXRzIHdpdGggaGFsZiBhcm91bmQgaGFsZiBhIHNoZWV0IHNpdHRpbmcgZm9yIGFwcHJveGltYXRlbHkgNCBtaW51dGVzIG9uIHN0YW5kYnkgaW4gdGhlIGluLXByb2Nlc3NpbmcgcXVldWUuIFRvdGFsIGhvdXJseSBjb3N0IHRvIHJ1biB0aGUgdGVuIHByaW50ZXJzIHNpdCBhdCBhcm91bmQgJDc0LjE0Lg0KDQpPbmNlIHRoZSBhIHNoZWV0IGhhcyBiZWVuIGZ1bGx5IHByaW50ZWQsIGl0IGlzIHNlbnQgb3ZlciB0byB0aGUgaW5zcGVjdGlvbiBzdGF0aW9uLiBUaGUgY3VycmVudCBpbnNwZWN0b3IgaXMgYWJsZSB0byBpbnNwZWN0IHNldmVuIHNoZWV0cyBhdCBhIGNvc3Qgb2YgYXJvdW5kICQxNyBwZXIgaG91ci4gVGhlIGluc3BlY3RvciB0YWtlcyBhbiBob3VyIHRvIGluc3BlY3Qgc2V2ZW4gc2hlZXRzIG9uIGF2ZXJhZ2UuIEFwcHJveGltYXRlbHkgc2l4IHNoZWV0cyBzaXQgd2FpdGluZyB0byBiZSBpbnNwZWN0ZWQgcGVyIGhvdXIsIGluY3VyIGEgY29zdCAkNDkgcGVyIHNoZWV0IG9uIGF2ZXJhZ2UuIFRoZSB3YWl0aW5nIHNoZWV0cyBzaXQgZm9yIGFwcHJveGltYXRlbHkgNTIuNSBtaW51dGVzIHBlciBzaGVldC4gVGhlIGhvdXJseSBpbnNwZWN0aW9uIGNvc3RzIHNpdHMgYXQgJDY2IHRvdGFsLg0KDQojIyMjIyMgVEFCTEUgMTogQ3VycmVudCBTdGF0ZQ0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQpjdXJyZW50X2NvbXAgPC0gY2JpbmQoDQogIG1hdHJpeChkYXRhID0gYygiMTAgUHJlc3NlcyIsICIxIEluc3BlY3RvciIsICIxMCBQcmVzc2VzICsgMSBJbnNwZWN0b3IiKSwgbnJvdyA9IDMpLA0KICByYmluZCgNCiAgICBtYXRyaXgocHJlc3NfY3VycmVudCwgbnJvdyA9IDEpWywgYygyOjgpXSwNCiAgICBtYXRyaXgoaW5zcGVjdGlvbl9jdXJyZW50LCBucm93ID0gMSlbLCBjKDI6OCldLA0KICAgIG1hdHJpeChwcmVzc19jdXJyZW50ICsgaW5zcGVjdGlvbl9jdXJyZW50LCBucm93ID0gMSlbLCBjKDI6OCldDQogICAgKQ0KKQ0KDQojIEFkZCBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKGN1cnJlbnRfY29tcCkgPC0gYygiSXRlbSBBbW91bnRzIiwgIkFtb3VudCBQcm9jZXNzZWQgKFNoZWV0cykgcGVyIEhvdXIiLCAiQW1vdW50IEluLVByb2Nlc3MgKFNoZWV0cykgcGVyIEhvdXIiLCAiVGltZSB0byBQcm9jZXNzIChtaW51dGVzKSIsICJXYWl0IFRpbWUgZm9yIFByb2Nlc3NpbmcgKG1pbnV0ZXMpIiwgIldvcmsgaW4gUHJvZ3Jlc3MgQ29zdCIsICJDb3N0IG9mIFByb2Nlc3MiLCAiVG90YWwgQ29zdCIpDQpyb3duYW1lcyhjdXJyZW50X2NvbXApIDwtIGMoIkN1cnJlbnQgU3RhdGUiLCAiQ3VycmVudCBJbnNwZWN0aW9uIiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCmN1cnJlbnRfY29tcCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQpgYGANCg0KDQpDb21wYXJhdGl2ZWx5LCBwcmludGluZyBhIGZ1bGwgc2hlZXQgdGFrZXMgNC40MyBtaW51dGVzIGxvbmdlciB0aGFuIGl0IHdvdWxkIHRha2UgdG8gaW5zcGVjdCBhIHNpbmdsZSBzaGVldC4NCg0KVGhlIGZ1bGwgdHdvIHN0ZXAgcHJvY2VzcyBwb3NzZXNzZXMgcG9zc2Vzc2VzIGFuIGV4cGVuZGl0dXJlIG9mICQxNDAuMTQsIG9uIGF2ZXJhZ2UgcGVyIGhvdXIuIEZvciBhIHNpbmdsZSBzaGVldCB0byBmaW5pc2ggcHJpbnRpbmcgYW5kIHJlY2lldmUgYXBwcm92YWwgdGFrZXMgNjAgbWludXRlcyAob25lIGhvdXIpIG9uIGF2ZXJhZ2UuIFRoZSB3b3JrIGluIHByb2dlc3MgYWNjb3VudHMgZm9yIGFwcHJveGltYXRlbHkgMzglIG9mIHRvdGFsIGNvc3RzLCB3aXRoIGEgdG90YWwgY29zdCBvZiAkNTMuMTQuIFRoZSB0b3RhbCBwcm9jZXNzaW5nIGNvc3RzIHNpdHMgYXQgJDg3LCB3aGljaCBpcyA2MiUgb2YgdG90YWwgY29zdHMuIEluIHRoZSBjdXJyZW50IHN0YXRlLCB0aGUgcHJpbnRpbmcgY29zdHMgbWFrZSB1cCB0aGUgbWFqb3JpdHkgb2YgdGhlIHRvdGFsIGNvc3QuIEZpbmlzaGVkIHByaW50cyB3YWl0aW5nIGZvciBpbnNwZWN0aW9uIGFjY291bnQgZm9yIDM1JSBvZiB0aGUgdG90YWwgY29zdHMsIHJlc3VsdGluZyBpbiB0aGUgc2Vjb25kIGJpZ2dlc3QgcGFydCBvZiBleHBlbmRpdHVyZS4gDQoNCkluIGdlbmVyYWwsIHRoZSBjb3N0IG9mIGFsbG93aW5nIHByaW50cyB0byBzaXQgd2FpdGluZyB0byBiZSBpbnNwZWN0ZWQgc2VlbXMgaW5jdXIgdGhlIG1vc3QgZGVhZCB3ZWlnaHQgY29zdCwgYWNjb3VudCBhcHByb3hpbWF0ZWx5IDkyJSBvZiB0aGUgdG90YWwgd29yayBpbiBwcm9ncmVzcyBjb3N0cy4gVGhpcyBzdG9jayB0aGF0IGlzIG5vdCBiZWluZyBhZGVxdWF0ZWx5IG1vdmVkIGFsc28gc3VnZ2VzdGluZyBhIGJvdHRsZW5lY2sgd2l0aGluZyB0aGUgc3lzdGVtLiBUaGUgcHJvY2Vzc2luZyBjb3N0IHRvIHByaW50IHdpdGggdGVuIHByaW50ZXJzIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHkgaW5jdXJzIDgwJSBvZiB0aGUgaG91cmx5ICBwcm9jZXNzaW5nIGNvc3RzLCB0aHVzIHN1Z2dlc3RpbmcgdGhlIGFjdHVhbGx5IGluc3BlY3Rpb24gcHJvY2VzcyBpcyByZWxhdGl2ZWx5IGluc3BlY3Rpb24gY29tcGFyZWQgdG8gdGhlIGFjdHVhbCBwcmludGluZy4gDQoNCiMgUHJvc3BhbCBBbmFseXNpcyANCg0KRHVlIHRvIFZhbGVudGlubydzIGRpc3BsZWFzdXJlIHdpdGggdGhlIGN1cnJlbnQgcHJpbnRpbmcgcHJvY2VzcywgdHdvIHByb3Bvc2FscyB3ZXJlIG9mZmVyZWQuDQoNClRoZSBmaXJzdCBvZmZlcmVkIGEgcG9zc2liaWxpdGllcyB3aGljaCBhbHRlcnMgdGhlIGZpcnN0IHN0YWdlIHByb2R1Y3QgcHJvY2VzczoNCg0KYSkgZGVjcmVhc2UgdGhlIGNvc3QgdG8gJDYuNTAgcGVyIHByaW50LCB3aGljaCBpcyAkMC41MCBsb3dlciB0aGVuIHRoZSBjdXJyZW50IGNvc3QsIGJ5IGluY3JlYXNpbmcgdGhlIHByaW50aW5nIHRpbWUgYnkgMjAlDQpiKSBpbmNyZWFzZSB0aGUgY29zdCB0byAkNy41MCBwZXIgcHJpbnQsIHdoaWNoIGlzICQwLjUwIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IGNvc3QsIGJ5IGRlY3JlYXNpbmcgdGhlIHByaW50aW5nIHRpbWUgYnkgMjAlDQoNClRoZSBzZWNvbmQgcHJvcG9zYWwgc3VnZ2VzdHMgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBpbnNwZWN0b3Igd2l0aCBhIG5ld2VyIGFuZCBzbGlnaHRseSBmYXN0ZXIgaW5zcGVjdG9yIHdobydzIGhvdXJseSByYXRlIGlzICQxOSBwZXIgaG91ciwgd2hpY2ggaXMgJDIgYWJvdmUgdGhhdCBvZiB0aGUgY3VycmVudCBpbnNwZWN0b3JzLg0KDQojIyMgUHJvcG9zYWwgNA0KDQpJbiBnZW5lcmFsLCB0aGlzIGFuYWx5c2lzIGNvbXBhcmVzIHRoZSBmaXJzdCBzdGFnZSBvZiB0aGUgcHJvZHVjdGlvbiBwcm9jZXNzIGluIHRoZSBwcmludGluZyBzdGFnZXMuIEl0IG91Z2h0IHRvIGJlIG5vdGVkIHRoYXQgdGhpcyBpcyBub3QgYW4gYW5hbHlzaXMgb2YgdGhlIG9wdGltYWwgYW1vdW50IG9mIHByaW50aW5nIHByZXNzZXMgb3IgdGltZS4gVGhlIHRhYmxlIGJlbG93IHNob3dzIHRoZSBjdXJyZW50IHByaW50aW5nIHRpbWUsIHdhaXQgdGltZSBhbmQgY29zdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBzdGFnZSBvZiB0aGUgcHJvZHVjdGlvbiBwcm9jZXNzOg0KDQojIyMjIyMgVEFCTEUgMjogQ29tcGFyaW5nIFByaW50aW5nIFNwZWVkcw0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIGNyZWF0aW5nIGNvbXBhcmlzaW9uIHRhYmxlDQpwcmVzc19jb21wIDwtIHJiaW5kKA0KICBwcmVzc19jdXJyZW50LA0KICBwcmVzc19pbmNyZWFzZSwNCiAgcHJlc3NfZGVjcmVhc2UNCiApDQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMocHJlc3NfY29tcCkgPC0gYygiUHJpbnRlciBDb3VudCIsICJBbW91bnQgUHJvY2Vzc2VkIChTaGVldHMpIHBlciBIb3VyIiwgIkFtb3VudCBJbi1Qcm9jZXNzIChTaGVldHMpIHBlciBIb3VyIiwgIlRpbWUgdG8gUHJvY2VzcyAobWludXRlcykiLCAiV2FpdCBUaW1lIGZvciBQcm9jZXNzaW5nIChtaW51dGVzKSIsICJXb3JrIGluIFByb2dyZXNzIENvc3QiLCAiQ29zdCBvZiBQcm9jZXNzIiwgIlRvdGFsIENvc3QiKQ0Kcm93bmFtZXMocHJlc3NfY29tcCkgPC0gYygiQ3VycmVudCBTdGF0ZSIsICJJbmNyZWFzZSBTcGVlZCIsICJEZWNyZWFzZWQgU3BlZWQiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnByZXNzX2NvbXAgJT4lIA0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpKQ0KYGBgDQoNCg0KVGhlIGN1cnJlbnQgcHJpbnRpbmcgc3RhdGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdG90YWwgY29zdCBvZiAkNzQuMTQsIHJlc3VsdGluZyBpbiBhbiBvdXRwdXQgb2YgYSBhcHByb3hpbWF0ZWx5IDcuNSBmdWxseSBwcmludGVkIHNoZWV0cyBiZXR3ZWVuIHRlbiBwcmVzc2VzIHdpdGggYW4gYXZlcmFnZSBvZiBoYWxmIGEgc2hlZXQgc2l0dGluZyBpbiB3YWl0LiBUaGVzZSBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgcHJpbnQgdGltZSBvZiBhcHByb3hpbWF0ZWx5IDY1IG1pbnV0ZXMgYW5kIDQuNSBtaW51dGVzIHNpdHRpbmcgaW4gd2FpdCBwZXIgc2hlZXQsIG9uIGF2ZXJhZ2UuDQoNCg0KIyMjIEFuYWx5c2lzIG9mIEluY3JlYXNlZCBQcmludGluZyBUaW1lIFdpdGggRGVjcmVhc2VkIENvc3RzDQoNClRoZSBUYWJsZSBiZWxvdyBzaG93cyBhIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgY3VycmVudCBzdGF0ZSBhbmQgdGhlIHJlc3VsdHMgb2YgaW5jcmVhc2luZyB0aGUgcHJpbnRpbmcgcHJlc3MgdGltZS4NCg0KSW5jcmVhc2luZyB0aGUgcHJpbnRpbmcgdGltZSBieSAyMCUsIHRoZSBhc3NvY2lhdGVkIHRvdGFsIGNvc3QgYmVjb21lcyAkODYuMTguIFRoaXMgaW5jcmVhc2UgaW4gdGltZSBwcm9kdWNlcyBhcHByb3hpbWF0ZWx5IDExLjEgc2hlZXRzLCBvbiBhdmVyYWdlLCBwcmludGVkIHBlciBob3VyIGJ5IGFsbCB0ZW4gcHJlc3NlZCB3aXRoIGFwcHJveGltYXRlbHkgMi42IHNoZWV0cyBzaXR0aW5nIGluIHdhaXQuIEVhY2ggc2hlZXRzIHRha2VzIGFwcHJveGltYXRlbHkgYW4gYXZlcmFnZSBvZiA5NSBtaW51dGVzIHRvIGZ1bGx5IHByaW50LiBUaGUgMi42IHNoZWV0cyBpbiBwcm9ncmVzcyBlYWNoIHNpdCBmb3IgMjIuNjkgbWludXRlcyBpbiB3YWl0IG9uIGF2ZXJhZ2UuDQoNCiMjIyMjIyBUQUJMRSAzOiBEaWZmZXJlbmNlIEJldHdlZW4gMjAlIFNwZWVkIEluY3JlYXNlIHdpdGggQ3VycmVudCBTcGVlZA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIGNyZWF0aW5nIGNvbXBhcmlzaW9uIHRhYmxlDQppbmNyZWFzZV9jb21wIDwtIHJiaW5kKA0KICBwcmVzc19jdXJyZW50LA0KICBwcmVzc19pbmNyZWFzZSwNCiAgYygxMCwgbWF0cml4KC0ocHJlc3NfY3VycmVudFsxLCBjKDI6OCldIC0gcHJlc3NfaW5jcmVhc2VbMSwgYygyOjgpXSkpKQ0KICApDQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoaW5jcmVhc2VfY29tcCkgPC0gYygiTnVtYmVyIG9mIFByZXNzZXMiLCAiQW1vdW50IFByb2Nlc3NlZCAoU2hlZXRzKSBwZXIgSG91ciIsICJBbW91bnQgSW4tUHJvY2VzcyAoU2hlZXRzKSBwZXIgSG91ciIsICJUaW1lIHRvIFByb2Nlc3MgKG1pbnV0ZXMpIiwgIldhaXQgVGltZSBmb3IgUHJvY2Vzc2luZyAobWludXRlcykiLCAiV29yayBpbiBQcm9ncmVzcyBDb3N0IiwgIkNvc3Qgb2YgUHJpbnRpbmciLCAiVG90YWwgQ29zdCIpDQpyb3duYW1lcyhpbmNyZWFzZV9jb21wKSA8LSBjKCJDdXJyZW50IFN0YXRlIiwgIkluY3JlYXNlIFNwZWVkIiwgIkRpZmZlcmVuY2UgKGFic29sdXRlKSIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KaW5jcmVhc2VfY29tcCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQpgYGANCg0KQnkgaW5jcmVhc2luZyBwcmludGluZyB0aW1lLCB0aGUgdGVuIHByZXNzZXMgYXJlIGFibGUgdG8gcHJpbnQgYXBwcm94aW1hdGVseSAzLjUgbW9yZSBzaGVldHMgdGhhbiBpbiB0aGUgY3VycmVudCBzdGF0ZS4gQnV0IHRoaXMgd291bGQgaW5jdXIgYSAkMTIuMDQgaW5jcmVhc2UgaW4gdG90YWwgcHJpbnRpbmcgY29zdHMuIFdoYXQgaXMgY29uY2VybmluZyBpcyB0aGUganVtcCBmcm9tIGxlc3MgdGhhbiBhIGZ1bGwgcHJpbnRlZCBwYWdlIHNpdHRpbmcgaW4gd2FpdCB0byBqdXN0IG92ZXIgdHdvIGFuZCBhIGhhbGYgcGFnZXMgc2l0dGluZyBpbiB3YXkuIFRoaXMgZHJhbWF0aWNhbGx5IGluY3JlYXNlcyB0aGUgY29zdCBvZiB3b3JrIGluIHByb2dyZXNzIG1hdGVyaWFscyBieSAkMTcuMDQsIG1ha2luZyB1cCB0aGUgbWFqb3JpdHkgKDc3JSkgb2YgdGhlIHRvdGFsIGluY3JlYXNlIGluIGNvc3RzLiBCeSBjb250cmFzdCwgdGhlcmUgaXMgYSAkNSBkZWNyZWFzZSBpbiBwcm9jZXNzaW5nIGNvc3RzIHRob3VnaCB0b3RhbCBjb3N0cyBpbmNyZWFzZSB0byAkODYuMTgsIHdoaWNoIHRyYW5zbGF0ZXMgdG8gYW4gYXBwcm94aW1hdGVseSAxNiUgaW5jcmVhc2UuIFRoaXMgaW5jcmVhc2UgaW4gZmluYWwgY29zdHMgaXMgZHJpdmVuIGJ5IHRoZSBpbmNyZWFzZWQgc2hlZXRzIHdhaXRpbmcgZm9yIGluc3BlY3Rpb24sIGVhdGluZyB1cCBhbnkgc2F2aW5ncyBieSB0aGUgZGVjcmVhc2UgaW4gcHJpbnQgY29zdHMuDQoNCiMjIyBBbmFseXNpcyBvZiBEZWNyZWFzZWQgUHJpbnRpbmcgVGltZSBXaXRoIEluY3JlYXNlZCBDb3N0cw0KDQpCeSBkZWNyZWFzaW5nIHRoZSB0aW1lIHRvIDgwJSBvZiBpdCdzIG9yaWdpbmFsIHRpbWUgKGRlY3JlYXNpbmcgdGltZSBieSAyMCUpIHJlc3VsdHMgaW4gYSBmaW5hbCBjb3N0IG9mICQ3NS43MS4gVGhlIHRhYmxlIGJlbG93IHNob3dzIGFuIGF2ZXJhZ2UgZmluYWwgY29zdHMgb2YgJDc1LjcxLiBUaGUgY29zdCBvZiBwcm9jZXNzaW5nIG5lYXJseSBhY2NvdW50cyBmb3IgdGhlIGZ1bGwgdG90YWwsIHdpdGggdGhlICQwLjcxIGluIHByb2Nlc3MgY29zdCByZXByZXNlbnRpbmcgdGhlIGxlc3MgdGhhbiAxMCUgb2YgYSBzaGVldCBzaXR0aW5nIGluIHdhaXQuIEF0IGEgZGVjcmVhc2VkIHNwZWVkLCBhIGxpdHRsZSBvdmVyIDUgc2hlZXRzIG9uIGF2ZXJhZ2UgYXJlIHByaW50ZWQgcGVyIGhvdXIsIHRha2luZyBhcm91bmQgNDkgbWludXRlcyBwZXIgc2hlZXQgdG8gZmluaXNoIG9uIGF2ZXJhZ2UuIFdoYXQgaXMgbGVmdCBpbiBwcm9jZXNzIHdhaXRzIG9uZSBhdmVyYWdlIDAuNzYgbWludXRlcyB0byBmaW5pc2ggYmVpbmcgcHJvY2Vzc2VkIGFzIHdlbGwuDQoNCiMjIyMjIyBUQUJMRSA0OiBEaWZmZXJlbmNlIGJldHdlZW4gMjAlIERlY3JlYXNlZCBTcGVlZCBhbmQgQ3VycmVudCBTcGVlZA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIGNyZWF0aW5nIGNvbXBhcmlzaW9uIHRhYmxlDQpkZWNyZWFzZV9jb21wIDwtIHJiaW5kKA0KICBwcmVzc19jdXJyZW50LA0KICBwcmVzc19kZWNyZWFzZSwNCiAgYygxMCwgbWF0cml4KHNpZ25pZigocHJlc3NfY3VycmVudFsxLCBjKDI6OCldIC0gcHJlc3NfZGVjcmVhc2VbMSwgYygyOjgpXSksIDMpLCBucm93ID0gMSkpDQogICkNCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhkZWNyZWFzZV9jb21wKSA8LSBjKCJJdGVtIEFtb3VudHMiLCAiQW1vdW50IFByb2Nlc3NlZCAoU2hlZXRzKSBwZXIgSG91ciIsICJBbW91bnQgSW4tUHJvY2VzcyAoU2hlZXRzKSBwZXIgSG91ciIsICJUaW1lIHRvIFByb2Nlc3MgKG1pbnV0ZXMpIiwgIldhaXQgVGltZSBmb3IgUHJvY2Vzc2luZyAobWludXRlcykiLCAiV29yayBpbiBQcm9ncmVzcyBDb3N0IiwgIkNvc3Qgb2YgUHJpbnRpbmciLCAiVG90YWwgQ29zdCIpDQpyb3duYW1lcyhkZWNyZWFzZV9jb21wKSA8LSBjKCJDdXJyZW50IFN0YXRlIiwgIkRlY3JlYXNlIFNwZWVkIiwgIkRpZmZlcmVuY2UgKGFic29sdXRlKSIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KZGVjcmVhc2VfY29tcCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQpgYGANCg0KRGVjZWFzaW5nIHRoZSBzcGVlZCBwcmludGluZyBzcGVlZCBieSAyMCUgcmVzdWx0cyBpbiBwcmludGluZyBqdXN0IHVuZGVyIDIgcGFnZXMgbGVzcyB0aGFuIGluIHRoZSBjdXJyZW50IHN0YXRlLiBUaGlzIGFsc28gaGFwcGVucyB0byByZXN1bHQgaW4gZGVjcmVhc2luZyBhcHByb3hpbWF0ZWx5IGhhbGYgYSBwYWdlIHNpdHRpbmcgaW4gd2FpdCwgdG8gb25lLXRlbnRoIG9mIGEgcGFnZSBzaXR0aW5nIGluIHdhaXQuIFRoaXMgbGVzcyB0aGFuIGhhbGYgYSBwYWdlIGRlY3JlYXNlIGluIHNoZWV0cyB3YWl0aW5nIHRvIGJlIHByb2Nlc3NlZCwgcmVzdWx0cyBpbiBhIG5lYXJseSA4MyUgZHJvcCBpbiB3b3JrIGluIHByb2dyZXNzIGNvc3RzICgkMy42NyBsZXNzKS4gUHJvY2VzcyBjb3N0cyBhcmUgaW5jcmVhc2VkIGJ5IDclLCB3aGljaCBpcyBhICQ1IGluY3JlYXNlZC4gVGh1cyB0aGUgZmluYWwgY29zdCBwZXIgaG91ciBpcyBpbmNyZWFzZWQgYnkgJDEuNTcgcGVyIGhvdXIuIFRoZSBtb25leSBzYXZlZCBieSBkZWNyZWFzaW5nIHRoZSBhbW91bnQgb2Ygc2hlZXRzIHNpdHRpbmcgaW4gd2FpdCB0byBiZSBwcmludGVkIGlzIGVhdGVuIGJ5IHRoZSAkNSBpbmNyZWFzZSBpbiBwcmludGluZyBjb3N0cy4NCg0KIyMjIENvbXBhcmluZyBTY2VuYXJpbyBEaWZmZXJlbmNlcw0KDQpBcyBzaG93biBpbiB0aGUgdGFibGUgYmVsb3csIGluY3JlYXNpbmcgc3BlZWQgYnkgMjAlIHdvdWxkIHJlc3VsdCBpbiBhIG1ham9yaXR5IG9mIGluY3JlYXNlcyB3aGlsZSBkZWNyZWFzaW5nIHRoZSBzcGVlZCBieSB0aGUgc2FtZSBhbW91bnQgd291bGQgcmVzdWx0IGluIHRoZSBtYWpvcml0eSBvZiBkZWNyZWFzZXMuIFRvIGluY3JlYXNlIHRoZSBzcGVlZCBieSAyMCUgd291bGQgcmVzdWx0cyBpbiBhICQxMi4wNCBpbmNyZWFzZSBpbiB0b3RhbCBjb3N0cyBzdW1taW5nIHRvIGJlICQ4Ni4xOC4gQnkgY29udHJhc3QsIGRlY3JlYXNpbmcgdGhlIHNwZWVkIGJ5IDIwJSB3b3VsZCByZXN1bHQgaW4gYSAkMS41Nywgd2hpY2ggcmVzdWx0cyBpbiBhIGZpbmFsIGNvc3Qgb2YgJDc1LjcxLg0KDQojIyMjIyMgVEFCTEUgNTogQ29tcGFyaW5nIFNwZWVkIFNjZW5hcmlvcyBhbmQgUmVzdWx0cw0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIGNyZWF0aW5nIGNvbXBhcmlzaW9uIHRhYmxlDQpkaWZmX2NvbXAgPC0gcmJpbmQoDQogIHByZXNzX2N1cnJlbnQsDQogICNwcmVzc19pbmNyZWFzZSwNCiAgYygxMCwgbWF0cml4KC0ocHJlc3NfY3VycmVudFsxLCBjKDI6OCldIC0gcHJlc3NfaW5jcmVhc2VbMSwgYygyOjgpXSkpKSwNCiAgI3ByZXNzX2RlY3JlYXNlLA0KICBjKDEwLCBtYXRyaXgoLShwcmVzc19jdXJyZW50WzEsIGMoMjo4KV0gLSBwcmVzc19kZWNyZWFzZVsxLCBjKDI6OCldKSkpDQogICkNCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhkaWZmX2NvbXApIDwtIGMoIkl0ZW0gQW1vdW50cyIsICJBbW91bnQgUHJvY2Vzc2VkIChTaGVldHMpIHBlciBIb3VyIiwgIkFtb3VudCBJbi1Qcm9jZXNzIChTaGVldHMpIHBlciBIb3VyIiwgIlRpbWUgdG8gUHJvY2VzcyAobWludXRlcykiLCAiV2FpdCBUaW1lIGZvciBQcm9jZXNzaW5nIChtaW51dGVzKSIsICJXb3JrIGluIFByb2dyZXNzIENvc3QiLCAiQ29zdCBvZiBQcmludGluZyIsICJUb3RhbCBDb3N0IikNCiNyb3duYW1lcyhkaWZmX2NvbXApIDwtIGMoIkN1cnJlbnQgU3RhdGUiLCAiSW5jcmVhc2UgU3BlZWQiLCAiSW5jcmVhc2UgRGlmZmVyZW5jZSIsICJEZWNyZWFzZSBTcGVlZCIsICIgRGVjcmVhc2UgRGlmZmVyZW5jZSIpDQpyb3duYW1lcyhkaWZmX2NvbXApIDwtIGMoIkN1cnJlbnQgU3RhdGUiLCAiSW5jcmVhc2UgRGlmZmVyZW5jZSIsICIgRGVjcmVhc2UgRGlmZmVyZW5jZSIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KZGlmZl9jb21wICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQpVcG9uIGRlZXBlciBhbmFseXNpcywgYWx0ZXJpbmcgdGhlIHNwZWVkIGJ5IDIwJSBlaXRoZXIgd2F5LCByZXN1bHRzIGluIGEgJDUgY2hhbmdlIGluIHByaW50aW5nIGNvc3RzLiBUaGUgJDMuNDMgaW4gc2F2aW5ncyB0aHJvdWdoIHRoZSBkcm9wIGluIHdvcmsgaW4gcHJvZ3Jlc3MgY29zdHMgZWF0cyBjb3ZlcnMgbmVhcmx5IDcwJSBvZiB0aGUgJDUgaW5jcmVhc2UgZnJvbSBwcmludGluZyBjb3N0cyB0aHJvdWdoIGEgMjAlIHNwZWVkIGRlY3JlYXNlLiBUaGUgJDUgaW4gc2F2aW5nLCByZXN1bHRhbnQgYnkgZGVjcmVhc2luZyBzcGVlZCBieSAyMCUgdGFrZW4gZnJvbSBwcmludGluZyBjb3N0cywgbmVhcmx5IGNvdmVycyAzMCUgb2YgdGhlIGluY3JlYXNlZCBjb3N0cyBmb3VuZCBieSB0aGUgaW5jcmVhc2UgaW4gc2hlZXRzIHNpdHRpbmcgaW4gd2FpdC4gVGh1cyBiZXR3ZWVuIHRoZXNlIHR3byBzY2VuYXJpb3MsIGluY3JlYXNpbmcgc3BlZWQgc2tld3MgdGhlIGNvc3QgY2hhbmdlIHRvd2FyZHMgaW5jcmVhc2VkIGNvc3RzOyB3aGlsZSBkZWNyZWFzaW5nIHNwZWVkIHdpbGwgbW9yZSBldmVubHkgZGlzdHJpYnV0ZSBjb3N0cyBiZXR3ZWVuIGluY3JlYXNlcyBhbmQgZGVjcmVhc2VzLiBJbiBnZW5lcmFsLCBjaGFuZ2UgaW4gdG90YWwgY29zdHMgYXBwZWFyIHRvIGJlIGRyaXZlbiBieSB0aGUgY29zdCBvZiBsZWF2aW5nIHNoZWV0cyBpbiB0aGUgcHJlc3Nlcy4gDQoNCiMjIyBQcm9wb3NhbCA1DQoNClRoZSBzZWNvbmQgcHJvcG9zYWwgcmVsYXRlZCB0byB0aGUgcHJpbnRpbmcgcHJvY2VzcyBmb2N1c2VzIGFyb3VuZCBpbmNyZWFzaW5nIGluc3BlY3Rpb24gdGltZSBieSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgaW5zcGVjdGluZyB3aXRoIGEgbmV3ZXIgb25lLiBUaGlzIG5ld2VyIGluc3BlY3RvciB3b3JrcyBhdCBoYWxmIGEgc2hlZXQgZmFzdGVyIHBlciBob3VyIHRoYW4gdGhlIGN1cnJlbnQgaW5zcGVjdG9yIGVtcGxveWVkLiBCdXQgd2l0aCB0aGlzIGluY3JlYXNlZCBzcGVlZCBjb21lcyBhICQyIGluY2Vhc2UgaW4gY29zdCBwZXIgaG91ciBmb3IgaW5zcGVjdGlvbi4gVGhpcyBpcyB0aGUgc2Vjb25kIHN0YWdlIGluIHRoZSBwcm9kdWN0aW9uIHByb2Nlc3MsIHdpdGggb25seSBhIHNpbmdsZSBzdGVwLS1pbnNwZWN0aW9uLiBTaGVldHMgd2lsbCBhcnJpdmUgYXQgdGhlIGluc3BlY3Rpb24gc3RhdGVtZW50IGRpcmVjdGx5IGFmdGVyIHByaW50aW5nIGFuZCBhdCA3IHNoZWV0cyBhcnJpdmluZyBwZXIgaG91ciBvbiBhdmVyYWdlLg0KDQpUaGUgY3VycmVudCBpbnNwZWN0b3IgaXMgYWJsZSB0byBpbnNwZWN0IDcgcGllY2VzIHBlciBob3VyIHdpdGggZWFjaCBmaW5pc2hlZCBwcmludCB0YWtpbmcgNjAgbWludXRlcy4gVGhpcyBjb3N0cyAkMTcgcGVyIGhvdXIuIFRoZSBjdXJyZW50IGluc3BlY3RvciBoYXMganVzdCBvdmVyIDYgcHJpbnRzIHdhaXRpbmcgZm9yIGhpbSB0byBpbnNwZWN0IHRoZW0gcGVyIGhvdXIgb24gYXZlcmFnZS4gRWFjaCBwcmludCBzaXRzIGZvciBhcm91bmQgNTMgbWludXRlcyBvbiBhdmVyYWdlIGluIHRoZSBwaWxlIHdhaXRpbmcgdG8gYmUgc2Vlbi4gVGhpcyBpcyBhc3NvY2lhdGVkIHdpdGggYSBjb3N0IG9mICQ1Mi41MC4gVG9nZXRoZXIsIHRoZSB0b3RhbCBjb3N0IG9mIHRoZSBpbnNwZWN0aW9uIHByb2Nlc3MgY29zdHMgJDY2LiANCg0KIyMjIEFuYWx5c2lzIG9mIE5ldyBJbnNwZWN0b3INCg0KVGhlIG5ldyBpbnNwZWN0b3IgaXMgYWJsZSB0byBpbnNwZWN0IDQuNDUgcHJpbnRzIHBlciBob3VyIG9uIGF2ZXJhZ2UgcmVzdWx0aW5nIGluIGFuIGluc3BlY3Rpb24gY29zdCBvZiAkMTkgcGVyIGhvdXIuIFRoZXJlIGFyZSBqdXN0IG92ZXIgMy41IHNoZWV0cyBsZWZ0IHdhaXRpbmcgdG8gYmUgaW5zcGVjdGVkIHBlciBob3VyLiBUaGUgY29zdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWl0aW5nIHByaW50cyBzaXQgYXQgJDI5LjEwLCB3aGljaCBtYWtlcyB1cCB0aGUgbWFqb3JpdHkgb2YgdGhlICQ0OC4xMCB0b3RhbCBjb3N0IGZvciB0aGUgaW5zcGVjdGlvbiBzdGFnZS4gIA0KDQojIyMjIyMgVEFCTEUgNjogRGlmZmVyZW5jZSBCZXR3ZWVuIEluc3BlY3RvcnMNCg0KYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gInNob3ciLCBpbmNsdWRlID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBjcmVhdGluZyBjb21wYXJpc2lvbiB0YWJsZQ0KaW5zcGVjdF9jb21wIDwtIHJiaW5kKA0KICBpbnNwZWN0aW9uX2N1cnJlbnQsDQogIGluc3BlY3Rpb25fbmV3LA0KICBjKDEsIG1hdHJpeCgtKGluc3BlY3Rpb25fY3VycmVudFsxLCBjKDI6OCldIC0gaW5zcGVjdGlvbl9uZXdbMSwgYygyOjgpXSkpKQ0KICApDQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoaW5zcGVjdF9jb21wKSA8LSBjKCJOdW1iZXIgb2YgSW5zcGVjdG9ycyIsICJBbW91bnQgUHJvY2Vzc2VkIChTaGVldHMpIHBlciBIb3VyIiwgIkFtb3VudCBJbi1Qcm9jZXNzIChTaGVldHMpIHBlciBIb3VyIiwgIlRpbWUgdG8gUHJvY2VzcyAobWludXRlcykiLCAiV2FpdCBUaW1lIGZvciBQcm9jZXNzaW5nIChtaW51dGVzKSIsICJXb3JrIGluIFByb2dyZXNzIENvc3QiLCAiSW5zcGVjdGlvbiBDb3N0IiwgIlRvdGFsIENvc3QiKQ0Kcm93bmFtZXMoaW5zcGVjdF9jb21wKSA8LSBjKCJDdXJyZW50IEluc3BlY3RvciIsICJOZXcgSW5zcGVjdG9yIiwgIkRpZmZlcmVuY2UiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCmluc3BlY3RfY29tcCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQoNCmBgYA0KDQpPdmVyIGFsbCwgaGlyaW5nIHRoZSBuZXcgaW5zcGVjdG9yIHdvdWxkIHJlc3VsdCBpbiBhICQxNy45IGRlY3JlYXNlIGluIHRoZSB0aGUgdG90YWwgY29zdC4gVGhlcmUgaXMgYSBsYXJnZSBjb3N0IHNhdmluZ3MgZm91bmQgaW4gdGhlIDIuNDggZGVjcmVhc2UgaW4gYW1vdW50IG9mIHNoZWV0cyBzaXR0aW5nIGluIHdhaXQsIGFjY291bnRpbmcgZm9yIGp1c3QgdW5kZXIgJDIwIGluIGNvc3Qgc2F2aW5ncywgYW1vdW50aW5nIHRvIGEgNDAlIGRyb3AgaW4gcHJpY2UuIE5vdGFibHksIHRoZSBuZXcgaW5zcGVjdG9yIHdpbGwgaW5zcGVjdCAyLjU1IHNoZWV0cyBmZXdlci4gVGhpcyBkZWNyZWFzZSBpbiBwcmludHMgaW5zcGVjdGVkIHdpbGwgYWxzbyBzcGVlZCB1cCBpbnNwZWN0aW9uIHRpbWUgc3BlbnQgb24gdGhlIHBpZWNlLCByZWR1Y2luZyB0aW1lIGJ5IDIxIG1pbnV0ZXMuIFRoZSB0b3RhbCBjb3N0IGluY3VycmVkIGJ5IGVhY2ggaW5zcGVjdG9yIGlzIGRyaXZlbiBieSBwcmludHMgc2l0dGluZyBpbiB3YWl0LCBhbmQgcmVtYWluIHRvIGJlIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggaXMgY2hvc2VuLiBUaGUgYXBwcm94aW1hdGVseSA2IHByaW50cyB3YWl0aW5nIGZvciB0aGUgY3VycmVudCBpbnNwZWN0b3IgYWNjb3VudHMgZm9yIG5lYXJseSA3NSUgb2YgdGhlIHRvdGFsIGluc3BlY3Rpb24gY29zdC4gVGhlIGp1c3Qgb3ZlciAzLjUgc2hlZXRzIHNpdHRpbmcgaW4gd2FpdCBmb3IgaW5zcGVjdGlvbiBieSB0aGUgbmV3IHBvdGVudGlhbCBpbnNwZWN0b3IgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCA2MCUgb2YgdGhlIHRvdGFsIGluc3BlY3Rpb24gY29zdHMuIA0KDQojIFNjZW5hcmlvIENvbXBhcmVuc2lvbg0KDQojIyMjIyMgVEFCTEUgNzogQ29tcGFyaW5nIERpZmZlcmVuY2VzIEZyb20gUHJvcG9zYWwgU2NlbmFyaW9zDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJzaG93IiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCmRpZmZfY29tcCA8LSByYmluZCgNCiAgbWF0cml4KGluY3JlYXNlX2NvbXBbMywgYygyOjgpXSwgbnJvdz0gMSksDQogIG1hdHJpeChkZWNyZWFzZV9jb21wWzMsIGMoMjo4KV0sIG5yb3cgPSAxKSwNCiAgbWF0cml4KGluc3BlY3RfY29tcFszLCAgYygyOjgpXSwgbnJvdyA9IDEpDQogICkNCg0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyhkaWZmX2NvbXApIDwtIGMoIiMgUHJvY2Vzc2VkIERpZmYgKHNoZWV0cykiLCAiIyBXYWl0aW5nIERpZmYgKHNoZWV0cykiLCAiUHJvY2Vzc2luZyBUaW1lIERpZmYgKG1pbikiLCAiV2FpdCBUaW1lIERpZmYgKE1pbikiLCAiV0lQIENvc3QgRGlmZiIsICJQcm9jZXNzIENvc3QgRGlmZiIsICJUb3RhbCBDb3N0IERpZmYiKQ0Kcm93bmFtZXMoZGlmZl9jb21wKSA8LSBjKCJJbmNyZWFzZSBTcGVlZCIsICJEZWNyZWFzZSBTcGVlZCIsICJOZXcgSW5zcGVjdG9yIikNCg0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCmRpZmZfY29tcCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQoNCmBgYA0KDQpJbmNyZWFzaW5nIHRoZSBzcGVlZCB3aWxsIGluY3JlYXNlIHRoZSBhbW91bnQgb2Ygc2hlZXRzIHByaW50ZWQsIGJ1dCBkb2luZyBzbyB3aWxsIGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2hlZXRzIHNpdHRpbmcgaW4gd2FpdC4gT3ZlcmFsbCB0aGlzIHdpbGwgaW5jcmVhc2UgdGhlIGNvc3RzLCB3aGlsZSBkb2luZyBsaXR0bGUgdG8gaW1wcm92ZSB3YWl0IHRpbWUuIERlY3JlYXNpbmcgdGhlIHNwZWVkIHdpbGwgc2xpZ2h0bHkgZGVjcmVhc2UgdGhlIGFtb3VudCBvZiBzaGVldCBwcmludGVkIGJ1dCBhbHNvIGRlY3JlYXNlIGFuIGFscmVhZHkgbG93IG51bWJlciBvZiBzaGVldHMgd2FpdGluZyB0byBhIHNtYWxsZXIgYW1vdW50LiBUaGUgcHJpbnRpbmcgY29zdHMgd2lsbCBpbmNyZWFzZSwgdGhvdWdoIGNvc3Qgc2F2aW5ncyBjYW4gYmUgZm91bmQgdGhyb3VnaCB0aGUgZGVjcmVhc2UgaW4gc2hlZXRzIHdhaXRpbmcgdG8gYmUgcHJpbnRlZC4gTm90IGVub3VnaCB0byBvZmZzZXQgdGhlIHNsaWdodCBjb3N0IGluY3JlYXNlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWVkIHJlZHVjdGlvbiB0aG91Z2guIFJlcGxhY2luZyB0aGUgY3VycmVudCBpbnNwZWN0b3IgY2F1c2UgdGhlIG1vc3QgZHJhc3RpYyBjaGFuZ2VzLiBXaGlsZSB0aGUgbmV3IGluc3BlY3RvciB3aWxsIGRlY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2hlZXRzIGluc3BlY3RvciwgdGhlIG51bWJlciBvZiBzaGVldHMgc2l0dGluZyBpbiB3YWl0IGZvciBpbnNwZWN0aW9uIHdpbGwgYWxtb3N0IGVxdWFsbHkgZGVjcmVhc2UgYXMgd2VsbC4gVGhpcyBjYXVzZWQgdGhlIG1vc3QgY29zdCBzYXZpbmdzLCByZXN1bHRpbmcgaW4gYW4gb3ZlcmFsbCBjb3N0IGRlY3JlYXNlIGZvciB0aGUgc2Vjb25kIHN0YWdlIG9mIHRoZSBwcm9kdWNhdGlvbiBwcm9jZXNzLCB3aGlsZSB0aGUgc3BlZWQgb3ZlcmFsbCBpbmNyZWFzZWQgdGhlIHRvdGFsIGNvc3QgZm9yIHRoZSBmaXJzdCBzdGFnZS4gQXMgZXhlbXBsaWZpZWQgYnkgdGhlIHRhYmxlIGFib3ZlLg0KDQojIyMjIyMgVEFCTEUgODogQ29tcGFyaW5nIEVhY2ggU2NlbmNhcmlvIFJlc3VsdHMgd2l0aCBDdXJyZW50IFByb2R1Y3Rpb24gU3RhdGUNCg0KYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gInNob3ciLCBpbmNsdWRlID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFfQ0Kc2NhbmFyaW9fY29tcCA8LSByYmluZCgNCiAgbWF0cml4KHByZXNzX2N1cnJlbnRbLCBjKDI6OCldLCBucm93PSAxKSwNCiAgbWF0cml4KGluc3BlY3Rpb25fY3VycmVudFssIGMoMjo4KV0sIG5yb3cgPSAxKSwNCiAgbWF0cml4KHByZXNzX2luY3JlYXNlWywgIGMoMjo4KV0sIG5yb3cgPSAxKSwNCiAgbWF0cml4KHByZXNzX2RlY3JlYXNlWywgIGMoMjo4KV0sIG5yb3cgPSAxKSwNCiAgbWF0cml4KGluc3BlY3Rpb25fbmV3WywgIGMoMjo4KV0sIG5yb3cgPSAxKQ0KICApDQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoc2NhbmFyaW9fY29tcCkgPC0gYygiIyBQcm9jZXNzZWQgRGlmZiAoc2hlZXRzKSIsICIjIFdhaXRpbmcgRGlmZiAoc2hlZXRzKSIsICJQcm9jZXNzaW5nIFRpbWUgRGlmZiAobWluKSIsICJXYWl0IFRpbWUgRGlmZiAoTWluKSIsICJXSVAgQ29zdCBEaWZmIiwgIlByb2Nlc3MgQ29zdCBEaWZmIiwgIlRvdGFsIENvc3QgRGlmZiIpDQpyb3duYW1lcyhzY2FuYXJpb19jb21wKSA8LSBjKCJDdXJyZW50IFNwZWVkIiwgIkN1cnJlbnQgSW5zcGVjdG9yIiwgIkluY3JlYXNlIFNwZWVkIiwgIkRlY3JlYXNlIFNwZWVkIiwgIk5ldyBJbnNwZWN0b3IiKQ0KDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0Kc2NhbmFyaW9fY29tcCAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQpgYGANCg0KT3ZlcmFsbCwgYXMgc2VlbiBpbiB0aGUgdGFibGUgYWJvdmUsIGRlY3JlYXNpbmcgdGhlIHByZXNzIHNwZWVkIHdoaWxlIHV0aWxpemluZyBhbGwgdGVuIHByZXNzZXMgd2lsbCBkZWNyZWFzZSB0aGUgYW1vdW50IG9mIHNoZWV0cyB3YWl0aW5nIHRvIGJlIHByaW50ZWQgd2hpbGUgYWxzbyBjdXR0aW5nIHRoZSB3YWl0IHRpbWUgYnkgMjYlLiBUaGlzIHdpbGwgcmVzdWx0IGluIGp1c3Qgb3ZlciAkMS41MCBpbmNyZWFzZSBpbiB0aGUgZmluYWwgcHJpY2UuIFdoaWxlIGRlY3JlYXNpbmcgc3BlZWQgd2lsbCBpbXByb3ZlIHdhaXQgdGltZSBhbmQgc2hlZXRzIHNpdHRpbmcgaW4gd2FpdCwgaXQgb3VnaHQgdG8gYmUgbm90ZWQgdGhhdCB0aGUgY2hhbmdlIGluIG51bWJlciBvZiBzaGVldHMgc2l0dGluZyBpbiB3YWl0IGlzIG5lZ2xpZ2libGUgKGZyb20gc2hlZXQgYSBwYWdlIHRvIDEwJSBvZiBhIHNoZWV0KS4gSGlyaW5nIHRoZSBuZXcgaW5zcGVjdG9yIHdpbGwgY3V0IHRoZSBhbW91bnQgb2YgcHJpbnRzIHNpdHRpbmcgaW4gd2FpdCBieSBuZWFybHkgaGFsZiBhdCBhIDQxJSBkZWNyZWFzZS4gVGhlIHdhaXQgdGltZSBpcyBhbHNvIGRyb3BwZWQgdG8ganVzdCBvdmVyIDM4IG1pbnV0ZXMsIGRlY3JlYXNpbmcgd2FpdCB0aW1lIGJ5IDM2JS4gQm90aCBhY3Rpb25zIHdvdWxkIGZvcndhcmQgdGhlIGdvYWwgb2YgcmVkdWNpbmcgd2FpdCB0aW1lIGluIGJvdGggc3RhZ2VzIG9mIHRoZSBwcm9kdWN0aW9uIHByb2Nlc3MuIA0KDQojIENvbmNsdXNpb25zIGFuZCBSZWNvbW1lbmRhdGlvbnMNCg0KVGhlIGJlc3QgY291cnNlIG9mIGFjdGlvbiB0byByZWR1Y2Ugd2FpdCB0aW1lIHdvdWxkIGJlIGJ5IGFjY2VwdGluZyB0aGUgcHJvcG9zYWwgdG8gZGVjcmVhc2UgcHJpbnRpbmcgc3BlZWQgYnkgMjAlIHdoaWxlIGhpcmluZyBhIG5ldyBpbnNwZWN0b3IuIFRoaXMgd291bGQgcmVzdWx0IGluIGFuIG92ZXJhbGwgYXZlcmFnZSBwcm9jZXNzaW5nIHRpbWUgb2YgbmVhcmx5IDg3IG1pbnV0ZXMgYW5kIGEgYXZlcmFnZSB3YWl0aW5nIHRpbWUgb2YgbmVhcmx5IDMwIG1pbnV0ZXMgcGVyIHNoZWV0LiBDdW11bGF0aXZlLCBpdCB3b3VsZCB0YWtlIGFuIGF2ZXJhZ2Ugb2YgMTE3IG1pbnV0ZSBmb3IgYSBzaW5nbGUgcHJpbnQgdG8gZmluaXNoIHRoZSBlbnRpcmUgcHJvZHVjdGlvbiBwcm9jZXNzLiBUaGlzIGlzIGRyYXN0aWMgZHJvcCBvZiA2NCBtaW51dGVzIGZyb20gdGhlIGFwcHJveGltYXRlIGF2ZXJhZ2UgZnVsbCBwcm9kdWN0aW9uIHRpbWUgb2YgMTgxIG1pbnV0ZXMgaXQgY3VycmVudCB0YWtlcyBmb3IgYSBzaGVldCB0byBmaW5pc2ggcHJvZHVjdGlvbi4gDQoNCiMjIyMjIyBUQUJMRSA5OiBDb21wYXJpbmcgU2NlbmFyaW8gQ29tYmluYXRpb24gUmVzdWx0cw0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQpmaW5hbF9jb21wIDwtIHJiaW5kKA0KICBjKCJDdXJyZW50IFN0YXR1cyIsIG1hdHJpeChwcmVzc19jdXJyZW50ICsgaW5zcGVjdGlvbl9jdXJyZW50LCBucm93ID0gMSlbLCBjKDI6OCldKSwNCiAgYygiQ3VycmVudCBTcGVlZCArIE5ldyBJbnNwZWN0b3IiLCBtYXRyaXgocHJlc3NfY3VycmVudCArIGluc3BlY3Rpb25fbmV3LCBucm93ID0gMSlbLCBjKDI6OCldKSwNCiAgYygiSW5jcmVhc2VkIFNwZWVkICsgQ3VycmVudCBJbnNwZWN0b3IiLCBtYXRyaXgocHJlc3NfaW5jcmVhc2UgKyBpbnNwZWN0aW9uX2N1cnJlbnQsIG5yb3cgPSAxKVssIGMoMjo4KV0pLA0KICBjKCJEZWNyZWFzZWQgU3BlZWQgKyBDdXJyZW50IEluc3BlY3RvciIsIG1hdHJpeChwcmVzc19kZWNyZWFzZSArIGluc3BlY3Rpb25fY3VycmVudCwgbnJvdyA9IDEpWywgYygyOjgpXSksDQogIGMoIkluY3JlYXNlZCBTcGVlZCArIE5ldyBJbnNwZWN0b3IiLCBtYXRyaXgocHJlc3NfaW5jcmVhc2UgKyBpbnNwZWN0aW9uX25ldywgbnJvdyA9IDEpWywgYygyOjgpXSksDQogIGMoIkRlY2Vhc2VkIFNwZWVkICsgTmV3IEluc3BlY3RvciIsIG1hdHJpeChwcmVzc19kZWNyZWFzZSArIGluc3BlY3Rpb25fbmV3LCBucm93ID0gMSlbLCBjKDI6OCldKQ0KICApDQoNCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXMoZmluYWxfY29tcCkgPC0gYygiU2NlbmFyaW8iLCAiQW1vdW50IFByb2Nlc3NlZCAoU2hlZXRzKSBwZXIgSG91ciIsICJBbW91bnQgSW4tUHJvY2VzcyAoU2hlZXRzKSBwZXIgSG91ciIsICJUaW1lIHRvIFByb2Nlc3MgKG1pbnV0ZXMpIiwgIldhaXQgVGltZSBmb3IgUHJvY2Vzc2luZyAobWludXRlcykiLCAiV29yayBpbiBQcm9ncmVzcyBDb3N0IiwgIkNvc3Qgb2YgUHJvY2VzcyIsICJUb3RhbCBDb3N0IikNCiNyb3duYW1lcyhmaW5hbF9jb21wKSA8LSBjKCJDdXJyZW50IFN0YXRlIiwgIkN1cnJlbnQgSW5zcGVjdGlvbiIsICJUb3RhbCBDb3N0IikNCg0KIyBTaG93IHJlc3VsdHMsIG5vdGUgdGhhdCBMLCBMcSwgVywgV3EgcmVtYWluIGNvbnN0YW50DQpmaW5hbF9jb21wICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQpCeSBjb21iaW5pbmcgYSBkZWNyZWFzZSBpbiBwcmludGluZyBzcGVlZCBhbmQgdGhlIGhpcmluZyBvZiBhIG5ldyBpbnNwZWN0b3IsIHRoZSB0b3RhbCBjb3N0IHNhdmluZyB3b3VsZCByZXN1bHQgaW4gJDE2LjMzLCB3aXRoIGZpbmFsIGNvc3RzIHNpdHRpbmcgYXQgYXJvdW5kICQxMjQgcGVyIGhvdXIuIFdoaWxlIHRoaXMgaXMgbm90IGxvd2VzdCBjb3N0IHRoYXQgY2FuIGJlIG9idGFpbmVkLCBpdCB0aGUgc2Vjb25kIHRvIGxvd2VzdCwgb25seSBiZWF0ZW4gYnkganVzdCBhICQxLjUwIGRpZmZlcmVuY2UgYnkgdGhlIGZpcnN0IGxvd2VzdCBwcmljZSBhc3NvY2lhdGVkIHdpdGggY29tYmluaW5nIHRoZSBjdXJyZW50IHByaW50aW5nIHNwZWVkIGFuZCBoaXJpbmcgYSBuZXcgaW5zcGVjdG9yLiBUaGlzIHdvdWxkIG5vdCByZXN1bHQgaW4gZHJhc3RpY2FsbHkgbG93ZXJpbmcgdGhlIG92ZXJhbGwgd2FpdCB0aW1lIGJldHdlZW4gdGhlIHR3byBzdGFnZSBvZiB0aGUgcHJvZHVjdGlvbiBwcm9jZXNzIHRvIHRoZSBtaW5pbXVtIHBvc3NpYmxlIG51bWJlciBvZiBzaGVldHMgc2l0dGluZyBpbiB3YWl0LiANCg0KIyMjIEZpbmFsIFRob3VnaHRzIGFuZCBBbGVydG5hdGl2ZSBQb3NzaWJpbGl0aWVzDQoNClR3byBmaW5hbCB0aG91Z2h0cyBvZiBub3RlLCB0aGUgaW5zcGVjdGlvbiBzdGF0aW9uIGRyaXZlcyB0aGUgaW5jcmVhc2VzIGluIGJvdGggdGhlIGFtb3VudCBvZiB3YWl0IHRpbWUgYW5kIGNvc3RzLiBXaGlsZSBoaXJpbmcgYSBuZXcgaW5zcGVjdG9yIGlzIGFuIG9wdGlvbiwgaXQgaXMgbm90IHRoZSBtb3N0IGNvc3QgZWZmZWN0aXZlIG9wdGlvbi4gQW4gYWx0ZXJuYXRpdmUgb3B0aW9uIGNvdWxkIGJlIHRvIGhpcmUgYSBzZWNvbmQgaW5zcGVjdG9yIHdvcmtpbmcgYXQgdGhlIHNhbWUgc3BlZWQgYXMgdGhlIGN1cnJlbnQgaW5zcGVjdG9yIHdpdGggYXQgdGhlIHNhbWUgcmF0ZS4gVGhlIHNhbWUgY2FuIGJlIHNhaWQgYWJvdXQgdGhlIG51bWJlciBvZiBwcmludGVycyBydW5uaW5nLiBBbHRlcmluZyB0aGUgbnVtYmVyIG9mIHByaW50ZXJzIGFsb25nIHdpdGggc3BlZWQgY291bGQgYmV0dGVyIG9wdGltaXplIHRoZSBwcm9kdWN0aW9uIGxpbmUgYXMgd2VsbC4gQSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0d28gcG9zc2liaWxpdGllcyBjb3VsZCByZXN1bHQgaW4gZHJhc3RpY2FsbHkgbG93ZXIgd2FpdCB0aW1lcyBhcyB3ZWxsIGFzIG92ZXJhbGwgbG93ZXIgY29zdHMuIA0KDQpGb3IgZXhhbXBsZSwgcmV0YWluaW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBwcmludGVycyBydW5uaW5nIGF0IHRoZSBzYW1lIHNwZWVkIHdoaWxlIGRvdWJsaW5nIHRoZSBjdXJyZW50IGluc3BlY3RvcidzIGFiaWxpdHkgd291bGQgZGVjcmVhc2UgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIHNoZWV0cyBzaXR0aW5nIGluIHdhaXQgdG8gNjglIG9mIGEgc2luZ2xlIHNoZWV0LCB3aXRoIGEgdG90YWwgY29zdCBvZiAkMTEzLjQ1IHdoaWNoIGlzICQxMCBsZXNzIHRoYW4gd2hhdCB0aGUgY3VycmVudCBiZXN0IG9wdGlvbiBvZmZlcnMuIENvbWJpbmluZyB0aGUgcG9zc2liaWxpdHkgaGlyaW5nIGEgc2Vjb25kIGluc3BlY3RvciBvZiB0aGUgc2FtZSBjYWxpYmVyIGF0IHRoZSBzYW1lIGNvc3QgYXMgdGhlIGN1cnJlbnQgYWxvbmdzaWRlIGRlY3JlYXNpbmcgc3BlZWQgd291bGQgcmVzdWx0IGluIGxvd2VyIHdhaXQgdGltZXMsIHRob3VnaCBmYXN0ZXIgcHJvY2Vzc2luZyB0aW1lcyBhcyB3ZWxsLiANCg0KIyBBcHBlbmRpeDogT3B0aW1pemF0aW9uIA0KDQpUaGUgYmVsb3cgdGFibGVzIHNob3cgdGhlIHdoYXQgcG90ZW50aWFsIGNvc3RzIGFuZCBzcGVlZHMgd291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGFsdGVyaW5nIHRoZSBjdXJyZW50IHByb2R1Y3Rpb24gc2V0IHVwIGJ5IHZhcnlpbmc6DQoNCisgc3BlZWRzIGJldHdlZW46DQogIC0gdGhlIGN1cnJlbnQgc3BlZWQNCiAgLSAyMCUgZmFzdGVyIHRoYW4gdGhlIGN1cnJlbnQgc3BlZWQNCiAgLSAyMCUgc2xvd2VyIHRoYW4gdGhlIGN1cnJlbnQgc3BlZWQNCisgaGlyaW5nIG11bHRpcGxlIGluc3BlY3RvcnM6DQogIC0gYXQgdGhlIGN1cnJlbnQgaW5zcGVjdG9yJ3Mgc3BlZWQNCiAgLSBhdCB0aGUgbmV3IGluc3BlY3RvcidzIGluY3JlYXNlZCBzcGVlZA0KDQp3aXRoIHRoZSBzYW1lIGFzc29jaWF0ZWQgY3VycmVudCBjb3N0cyBhcyB0aGUgY3VycmVudCBjb25kaXRpb25zIHN0YW5kLiBUaGUgdGFibGVzIGJlbG93IGRvIG5vdCBpbmNsdWRlIGNvc3RzIGFzc29jaWF0ZWQgd2l0aCBwcm9jdXJlbWVudC4gVGhlIHRhYmxlcyBiZWxvdyBhIG5vbmxpbmVhciByZWxhdGlvbnNoaXAgaW4gcHJpbnRpbmcgc3BlZWRzIGFuZCBpbnNwZWN0aW5nIHNwZWVkcyB3aXRoIHRoZSBhZGRpdGlvbiBvciByZWR1Y3Rpb24gaW4gYW1vdW50IG9mIHByaW50ZXJzIGFuZC9vciBpbnNwZWN0b3JzIHV0aWxpemVkLiBJdCBvdWdodCB0byBiZSBkdWx5IG5vdGVkIHRoYXQgaW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIHByaW50ZXJzIG9yIGluc3BlY3RvcnMgd2lsbCBldmVudHVhbGx5IGNlYXNlIHRvIGJlIGJlbmVmaWNpYWwgYnkgZWl0aGVyIHJlZHVjaW5nIGNvc3QsIHJlZHVjaW5nIHRpbWUsIG9yIGJvdGguIFRoaXMgY2FuIGNsZWFybHkgYmUgc2VlbiB3aGVuIHRpbWVzIGFuZC9vciBjb3N0cyBjZWFzZSB0byBjaGFuZ2UuDQoNCg0KDQojIyMgQ3VycmVudCBTcGVlZA0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIFNldCB1cCBwcm9ibGVtIHdpdGggaW5pdGlhbCBjcml0ZXJpYSBhbmQgMTAgY3VzdG9tZXJzDQpsYW0gPSA3OyBtdSA9IDEgOyBzIDwtIDE7IG4gPC0gMjANCg0KIyBNaW5pbXVtIG51bWJlciBvZiBzZXJ2ZXJzIHNvIHF1ZXVlIG5vdCBncm93IHRvIGluZmluaXR5LCBjZWlsaW5nIHJvdW5kcyB1cCB0byBuZXh0IGludGVnZXINCmludCA8LSBjZWlsaW5nKGxhbS9tdSkgKyAxDQoNCiMgUHJvZml0IHBlciBjdXN0b21lcg0KcGkgPC0gOA0KDQojIENvc3QgcGVyIHNlcnZlciBwZXIgaG91cg0KY29zdCA8LSAxOQ0KDQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KdGFiX3NtYyA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeCgwLCBuKzEtaW50LCA4KSkNCg0KIyBMb29wIHRvIGJ1aWxkIHRhYmxlIG9mIHJlc3VsdHMNCmZvciAocyBpbiBpbnQ6bil7DQoNCiAgIyBVc2luZyAicXVldWVpbmciIHBhY2thZ2UNCiAgc21fYyA8LSBOZXdJbnB1dC5NTUMobGFtYmRhID0gbGFtLCBtdSA9IG11LCBjID0gcywgbiA9IG4pDQogIHNtYyA8LSBRdWV1ZWluZ01vZGVsLmlfTU1DKHNtX2MpDQoNCiAgIyBDb3N0IG9mIGxvc3QgY3VzdG9tZXJzDQogIGxwIDwtIGlmZWxzZShzbWMkV3EqNjAgPiAwLjUsIHNtYyRMcSAqIHBpLCAwKQ0KICAjIENvc3Qgb2Ygc2VydmVycw0KICBzYyA8LSBzKmNvc3QgIA0KICAjIFRvdGFsIGNvc3QNCiAgdGMgPC0gc2MgKyBscA0KICANCiAgIyBQbGFjZSByZXN1bHRzIGFzIGEgcm93IGluIGEgdGFibGUNCiAgICAjIE11bHRpcGx5IHdhaXQgYnkgNjAgbWludXRlcyBpbiBhbiBob3VyIHRvIGNvbnZlcnQgdGltZSBmcm9tIGhvdXJzIHRvIG1pbnV0ZXMNCiAgdGFiX3NtY1tzKzEtaW50LF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQp9DQojIEFkZCBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKHRhYl9zbWMpIDwtIGMoIlNlcnZlcnMiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkxvc3QgUHJvZml0IiwgIlNlcnZlciBDb3N0IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnRhYl9zbWMgJT4lIA0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpKQ0KYGBgDQoNCg0KIyMjIEluY3JlYXNlZCBTcGVlZA0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJzaG93IiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgU2V0IHVwIHByb2JsZW0gd2l0aCBpbml0aWFsIGNyaXRlcmlhIGFuZCAxMCBjdXN0b21lcnMNCmxhbSA9IDc7IG11ID0gMS4yIDsgcyA8LSAxOyBuIDwtIDIwDQoNCiMgTWluaW11bSBudW1iZXIgb2Ygc2VydmVycyBzbyBxdWV1ZSBub3QgZ3JvdyB0byBpbmZpbml0eSwgY2VpbGluZyByb3VuZHMgdXAgdG8gbmV4dCBpbnRlZ2VyDQppbnQgPC0gY2VpbGluZyhsYW0vbXUpDQoNCiMgUHJvZml0IHBlciBjdXN0b21lcg0KcGkgPC0gOA0KDQojIENvc3QgcGVyIHNlcnZlciBwZXIgaG91cg0KY29zdCA8LSAxOQ0KDQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KdGFiX3NtYyA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeCgwLCBuKzEtaW50LCA4KSkNCg0KIyBMb29wIHRvIGJ1aWxkIHRhYmxlIG9mIHJlc3VsdHMNCmZvciAocyBpbiBpbnQ6bil7DQoNCiAgIyBVc2luZyAicXVldWVpbmciIHBhY2thZ2UNCiAgc21fYyA8LSBOZXdJbnB1dC5NTUMobGFtYmRhID0gbGFtLCBtdSA9IG11LCBjID0gcywgbiA9IG4pDQogIHNtYyA8LSBRdWV1ZWluZ01vZGVsLmlfTU1DKHNtX2MpDQoNCiAgIyBDb3N0IG9mIGxvc3QgY3VzdG9tZXJzDQogIGxwIDwtIGlmZWxzZShzbWMkV3EqNjAgPiAwLjUsIHNtYyRMcSAqIHBpLCAwKQ0KICAjIENvc3Qgb2Ygc2VydmVycw0KICBzYyA8LSBzKmNvc3QgIA0KICAjIFRvdGFsIGNvc3QNCiAgdGMgPC0gc2MgKyBscA0KICANCiAgIyBQbGFjZSByZXN1bHRzIGFzIGEgcm93IGluIGEgdGFibGUNCiAgICAjIE11bHRpcGx5IHdhaXQgYnkgNjAgbWludXRlcyBpbiBhbiBob3VyIHRvIGNvbnZlcnQgdGltZSBmcm9tIGhvdXJzIHRvIG1pbnV0ZXMNCiAgdGFiX3NtY1tzKzEtaW50LF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQp9DQojIEFkZCBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKHRhYl9zbWMpIDwtIGMoIlNlcnZlcnMiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkxvc3QgUHJvZml0IiwgIlNlcnZlciBDb3N0IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnRhYl9zbWMgJT4lIA0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpKQ0KYGBgDQoNCg0KIyMjIERlY3JlYXNlZCBTcGVlZA0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9ICJzaG93IiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgU2V0IHVwIHByb2JsZW0gd2l0aCBpbml0aWFsIGNyaXRlcmlhIGFuZCAxMCBjdXN0b21lcnMNCmxhbSA9IDc7IG11ID0gLjggOyBzIDwtIDE7IG4gPC0gMjANCg0KIyBNaW5pbXVtIG51bWJlciBvZiBzZXJ2ZXJzIHNvIHF1ZXVlIG5vdCBncm93IHRvIGluZmluaXR5LCBjZWlsaW5nIHJvdW5kcyB1cCB0byBuZXh0IGludGVnZXINCmludCA8LSBjZWlsaW5nKGxhbS9tdSkNCg0KIyBQcm9maXQgcGVyIGN1c3RvbWVyDQpwaSA8LSA4DQoNCiMgQ29zdCBwZXIgc2VydmVyIHBlciBob3VyDQpjb3N0IDwtIDE5DQoNCiMgQnVpbGQgYSB0YWJsZSBvZiByZXN1bHRzDQp0YWJfc21jIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4KDAsIG4rMS1pbnQsIDgpKQ0KDQojIExvb3AgdG8gYnVpbGQgdGFibGUgb2YgcmVzdWx0cw0KZm9yIChzIGluIGludDpuKXsNCg0KICAjIFVzaW5nICJxdWV1ZWluZyIgcGFja2FnZQ0KICBzbV9jIDwtIE5ld0lucHV0Lk1NQyhsYW1iZGEgPSBsYW0sIG11ID0gbXUsIGMgPSBzLCBuID0gbikNCiAgc21jIDwtIFF1ZXVlaW5nTW9kZWwuaV9NTUMoc21fYykNCg0KICAjIENvc3Qgb2YgbG9zdCBjdXN0b21lcnMNCiAgbHAgPC0gaWZlbHNlKHNtYyRXcSo2MCA+IDAuNSwgc21jJExxICogcGksIDApDQogICMgQ29zdCBvZiBzZXJ2ZXJzDQogIHNjIDwtIHMqY29zdCAgDQogICMgVG90YWwgY29zdA0KICB0YyA8LSBzYyArIGxwDQogIA0KICAjIFBsYWNlIHJlc3VsdHMgYXMgYSByb3cgaW4gYSB0YWJsZQ0KICAgICMgTXVsdGlwbHkgd2FpdCBieSA2MCBtaW51dGVzIGluIGFuIGhvdXIgdG8gY29udmVydCB0aW1lIGZyb20gaG91cnMgdG8gbWludXRlcw0KICB0YWJfc21jW3MrMS1pbnQsXSA8LSByb3VuZChjKHMsIHNtYyRMLCBzbWMkTHEsIHNtYyRXKjYwLCBzbWMkV3EqNjAsIGxwLCBzYywgdGMpLCAyKSANCn0NCiMgQWRkIGNvbHVtbiBuYW1lcw0KY29sbmFtZXModGFiX3NtYykgPC0gYygiU2VydmVycyIsICJMIiwgIkxxIiwgIlcgKG1pbnV0ZXMpIiwgIldxIChtaW51dGVzKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiTG9zdCBQcm9maXQiLCAiU2VydmVyIENvc3QiLCAiVG90YWwgQ29zdCIpDQoNCiMgU2hvdyByZXN1bHRzLCBub3RlIHRoYXQgTCwgTHEsIFcsIFdxIHJlbWFpbiBjb25zdGFudA0KdGFiX3NtYyAlPiUgDQogIGthYmxlKCkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImJvcmRlcmVkIikpDQpgYGANCg0KDQojIyMgT2xkIEluc3BlY3Rvcg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIFNldCB1cCBwcm9ibGVtIHdpdGggaW5pdGlhbCBjcml0ZXJpYSBhbmQgMTAgY3VzdG9tZXJzDQpsYW0gPSA3OyBtdSA9IDYwLzcgOyBzIDwtIDE7IG4gPC0gNw0KDQojIE1pbmltdW0gbnVtYmVyIG9mIHNlcnZlcnMgc28gcXVldWUgbm90IGdyb3cgdG8gaW5maW5pdHksIGNlaWxpbmcgcm91bmRzIHVwIHRvIG5leHQgaW50ZWdlcg0KaW50IDwtIGNlaWxpbmcobGFtL211KQ0KDQojIFByb2ZpdCBwZXIgY3VzdG9tZXINCnBpIDwtIDgNCg0KIyBDb3N0IHBlciBzZXJ2ZXIgcGVyIGhvdXINCmNvc3QgPC0gMTcNCg0KIyBCdWlsZCBhIHRhYmxlIG9mIHJlc3VsdHMNCnRhYl9zbWMgPC0gYXMuZGF0YS5mcmFtZShtYXRyaXgoMCwgbisxLWludCwgOCkpDQoNCiMgTG9vcCB0byBidWlsZCB0YWJsZSBvZiByZXN1bHRzDQpmb3IgKHMgaW4gaW50Om4pew0KDQogICMgVXNpbmcgInF1ZXVlaW5nIiBwYWNrYWdlDQogIHNtX2MgPC0gTmV3SW5wdXQuTU1DKGxhbWJkYSA9IGxhbSwgbXUgPSBtdSwgYyA9IHMsIG4gPSBuKQ0KICBzbWMgPC0gUXVldWVpbmdNb2RlbC5pX01NQyhzbV9jKQ0KDQogICMgQ29zdCBvZiBsb3N0IGN1c3RvbWVycw0KICBscCA8LSBpZmVsc2Uoc21jJFdxKjYwID4gMC41LCBzbWMkTHEgKiBwaSwgMCkNCiAgIyBDb3N0IG9mIHNlcnZlcnMNCiAgc2MgPC0gcypjb3N0ICANCiAgIyBUb3RhbCBjb3N0DQogIHRjIDwtIHNjICsgbHANCiAgDQogICMgUGxhY2UgcmVzdWx0cyBhcyBhIHJvdyBpbiBhIHRhYmxlDQogICAgIyBNdWx0aXBseSB3YWl0IGJ5IDYwIG1pbnV0ZXMgaW4gYW4gaG91ciB0byBjb252ZXJ0IHRpbWUgZnJvbSBob3VycyB0byBtaW51dGVzDQogIHRhYl9zbWNbcysxLWludCxdIDwtIHJvdW5kKGMocywgc21jJEwsIHNtYyRMcSwgc21jJFcqNjAsIHNtYyRXcSo2MCwgbHAsIHNjLCB0YyksIDIpIA0KfQ0KIyBBZGQgY29sdW1uIG5hbWVzDQpjb2xuYW1lcyh0YWJfc21jKSA8LSBjKCJTZXJ2ZXJzIiwgIkwiLCAiTHEiLCAiVyAobWludXRlcykiLCAiV3EgKG1pbnV0ZXMpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJMb3N0IFByb2ZpdCIsICJTZXJ2ZXIgQ29zdCIsICJUb3RhbCBDb3N0IikNCg0KIyBTaG93IHJlc3VsdHMsIG5vdGUgdGhhdCBMLCBMcSwgVywgV3EgcmVtYWluIGNvbnN0YW50DQp0YWJfc21jICU+JSANCiAga2FibGUoKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQojIyMgTmV3IEluc3BlY3Rvcg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAic2hvdyIsIGluY2x1ZGUgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0V9DQojIFNldCB1cCBwcm9ibGVtIHdpdGggaW5pdGlhbCBjcml0ZXJpYSBhbmQgMTAgY3VzdG9tZXJzDQpsYW0gPSA3OyBtdSA9IDYwLzcuNSA7IHMgPC0gMTsgbiA8LSA3DQoNCiMgTWluaW11bSBudW1iZXIgb2Ygc2VydmVycyBzbyBxdWV1ZSBub3QgZ3JvdyB0byBpbmZpbml0eSwgY2VpbGluZyByb3VuZHMgdXAgdG8gbmV4dCBpbnRlZ2VyDQppbnQgPC0gY2VpbGluZyhsYW0vbXUpDQoNCiMgUHJvZml0IHBlciBjdXN0b21lcg0KcGkgPC0gOA0KDQojIENvc3QgcGVyIHNlcnZlciBwZXIgaG91cg0KY29zdCA8LSAxOQ0KDQojIEJ1aWxkIGEgdGFibGUgb2YgcmVzdWx0cw0KdGFiX3NtYyA8LSBhcy5kYXRhLmZyYW1lKG1hdHJpeCgwLCBuKzEtaW50LCA4KSkNCg0KIyBMb29wIHRvIGJ1aWxkIHRhYmxlIG9mIHJlc3VsdHMNCmZvciAocyBpbiBpbnQ6bil7DQoNCiAgIyBVc2luZyAicXVldWVpbmciIHBhY2thZ2UNCiAgc21fYyA8LSBOZXdJbnB1dC5NTUMobGFtYmRhID0gbGFtLCBtdSA9IG11LCBjID0gcywgbiA9IG4pDQogIHNtYyA8LSBRdWV1ZWluZ01vZGVsLmlfTU1DKHNtX2MpDQoNCiAgIyBDb3N0IG9mIGxvc3QgY3VzdG9tZXJzDQogIGxwIDwtIGlmZWxzZShzbWMkV3EqNjAgPiAwLjUsIHNtYyRMcSAqIHBpLCAwKQ0KICAjIENvc3Qgb2Ygc2VydmVycw0KICBzYyA8LSBzKmNvc3QgIA0KICAjIFRvdGFsIGNvc3QNCiAgdGMgPC0gc2MgKyBscA0KICANCiAgIyBQbGFjZSByZXN1bHRzIGFzIGEgcm93IGluIGEgdGFibGUNCiAgICAjIE11bHRpcGx5IHdhaXQgYnkgNjAgbWludXRlcyBpbiBhbiBob3VyIHRvIGNvbnZlcnQgdGltZSBmcm9tIGhvdXJzIHRvIG1pbnV0ZXMNCiAgdGFiX3NtY1tzKzEtaW50LF0gPC0gcm91bmQoYyhzLCBzbWMkTCwgc21jJExxLCBzbWMkVyo2MCwgc21jJFdxKjYwLCBscCwgc2MsIHRjKSwgMikgDQp9DQojIEFkZCBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKHRhYl9zbWMpIDwtIGMoIlNlcnZlcnMiLCAiTCIsICJMcSIsICJXIChtaW51dGVzKSIsICJXcSAobWludXRlcykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIkxvc3QgUHJvZml0IiwgIlNlcnZlciBDb3N0IiwgIlRvdGFsIENvc3QiKQ0KDQojIFNob3cgcmVzdWx0cywgbm90ZSB0aGF0IEwsIExxLCBXLCBXcSByZW1haW4gY29uc3RhbnQNCnRhYl9zbWMgJT4lIA0KICBrYWJsZSgpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpKQ0KYGBg