SYNTAX and CONTROL FLOW

SYNTAX and CONTROL FLOW ~ Week 4

<div class="logo-inner">
  <img src="C:/Users/Nurul Iffah/Downloads/fotoku.jpg" alt="Nurul Iffah">
</div>

NURUL IFFAH

STUDY CASES
SYNTAX and CONTROL FLOW~ Week 4

Program Studi
Sains Data

Universitas
INSTITUT TEKNOLOGI SAINS BANDUNG

Dosen Pengampu
Bakti Siregar, M Sc., CSD

1 DATASET PRACTICUM

ID Name Age Salary Position Performance
1 Bagas 25 5000 Staff Good
2 Joan 30 7000 Supervisior Very Good
3 Alya 27 6500 Staff Averange
4 Dwi 35 10000 Manager Good
5 Nabil 40 12000 Direktor Very Good

1.1 BONUS RULES

Bonus Rules

Very Good
20%
Good
10%
Average
5%

1.2 BONUS MEMBERS

Bonus Member Results

👤
Bagas
$500
Good · 10%
👤
Joan
$1,400
Very Good · 20%
👤
Alya
$325
Average · 5%
👤
Dwi
$1,000
Good · 10%
👤
Nabil
$2,400
Very Good · 20%

2 FOR LOOP

2.1 CONCEPT of FOR LOOP

A for loop is used to repeat a command for each item in a dataset. In this task, the for loop checks the salary of each employee one by one.

The program reads the employee data row by row and examines whether the salary is greater than 6000. If the condition is true, the program will display the employee’s name and salary. If the salary is 6000 or less, the employee will not be shown in the result.

Therefore, the for loop helps the program automatically go through all employees and select only those who meet the condition without checking each one manually.

👤
Bagas
$ 5000
👤
Joan
$ 7000
👤
Alya
$ 6500
👤
Dwi
$ 10000
👤
Nabil
$ 12000

3 WHILE LOOP

3.1 CONCEPT of WHILE LOOP

A while loop is used to** repeat a command as long as a certain condition is true.** In this task, the while loop goes through the employee list one by one.

The program starts from the first employee and displays the name and position. After showing the information, the program checks whether the employee’s position is “Manager.”

If the position is not Manager*, the loop continues to the next employee. However, when the program finds an employee with the position Manager, the loop stops.

Therefore, the while loop allows the program to process the data step by step and stop automatically when a specific condition is met, without checking all employees manually.

👤
Bagas
Staff
👤
Joan
Supervisior
👤
Alya
Staff
👤
Dwi
Manager
✔ Manager found

the output ends at Dwi, because Dwi is the first employee with the position Manager.


4 BREAK

4.1 CONCEPT of BREAK

The break statement is used to immediately stop a loop when a specific condition is met.

In this task, the program checks each employee’s salary one by one using a loop. The loop continues to display the employee’s name and salary until it finds an employee whose salary is above 10,000.

Therefore, the break statement allows the program to exit the loop early once the required condition is found, making the process more efficient.

👤
Bagas
$ 5000
👤
Joan
$ 7000
👤
Alya
$ 6500
👤
Dwi
$ 10000
👤
Nabil
$ 12000
Loop Stopped

When the program reaches Nabil, whose salary is 12,000, the condition becomes true. At this point, the break command stops the loop, so the program does not continue checking the remaining data.


5 CONTINUE to SKIP (employees with average performance)

5.1 THE CONCEPT

The continue statement is used to skip the current iteration of a loop and move directly to the next one.

In this task, the program checks the performance of each employee. If an employee has “Average” performance, the program will skip that employee and continue to the next one.

Therefore, the continue statement helps the program ignore certain data while still continuing the loop for the rest of the dataset.

👤
Bagas
Good
👤
Joan
Very Good
👤
Alya
Average
Skipped
👤
Dwi
Good
👤
Nabil
Very Good

This means the employee with Average performance (Alya) will not be displayed in the result. The loop continues to process the remaining employees normally.


LS0tDQp0aXRsZTogIlNZTlRBWCBhbmQgQ09OVFJPTCBGTE9XIiAgICAgICAgICAgIA0Kc3VidGl0bGU6ICJTWU5UQVggYW5kIENPTlRST0wgRkxPVyB+IFdlZWsgNCAiICANCmF1dGhvcjogIk51cnVsIElmZmFoIiAgICAgIA0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICANCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICANCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgIA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICANCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgIA0KICAgIGNvZGVfZm9sZGluZzogIm5vIiAgICAgICAgIA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjc3M6IGFwYWxhaA0KICAgICAgICAgICAgDQotLS0NCg0KYGBge2NzcyBlY2hvPUZBTFNFfQ0KLyogPT09PSBGT05UIEdFTUVTIChHb29nbGUgRm9udHMpID09PT0gKi8NCkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PVF1aWNrc2FuZDp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZmFtaWx5PUZyZWRva2E6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXAnKTsNCmBgYA0KDQo8ZGl2IGlkPSJzaWRlYmFyLXRvZ2dsZSI+DQogIDxzcGFuPjwvc3Bhbj4NCjwvZGl2Pg0KDQoNCjxkaXYgaWQ9Im1vZGUtdG9nZ2xlIiB0aXRsZT0iR2FudGkgTGlnaHQgLyBEYXJrIj4NCiAgPHNwYW4gY2xhc3M9InN1biIgYXJpYS1oaWRkZW49InRydWUiPjwvc3Bhbj4NCiAgPHNwYW4gY2xhc3M9Im1vb24iIGFyaWEtaGlkZGVuPSJ0cnVlIj48L3NwYW4+DQo8L2Rpdj4NCg0KDQo8ZGl2IGNsYXNzPSJsb2dvLXdyYXBwZXIiPg0KICA8ZGl2IGNsYXNzPSJsb2dvLWZyYW1lIj4NCiAgICA8ZGl2IGNsYXNzPSJsb2dvLWlubmVyIj4NCiAgICAgIDxpbWcgc3JjPSJDOi9Vc2Vycy9OdXJ1bCBJZmZhaC9Eb3dubG9hZHMvZm90b2t1LmpwZyIgYWx0PSJOdXJ1bCBJZmZhaCI+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImxvZ28tY2FwdGlvbiI+DQogIE5VUlVMIElGRkFIDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0ibnVydWwtdGl0bGUtc2VjdGlvbiI+DQogIDxkaXYgY2xhc3M9Im51cnVsLXRpdGxlLXRleHQiPlNUVURZIENBU0VTPC9kaXY+DQogIDxkaXYgY2xhc3M9Im51cnVsLXN1YnRpdGxlLXRleHQiPlNZTlRBWCBhbmQgQ09OVFJPTCBGTE9XfiBXZWVrIDQ8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxLjhyZW07IHRleHQtYWxpZ246IGNlbnRlcjsiPg0KDQo8IS0tIEtPVEFLIDEg4oCTIFNhaW5zIERhdGEgKHBpbmsgbGVtYnV0KSAtLT4NCjxwIGNsYXNzPSJpbmZvLXBpbGwiIHN0eWxlPSINCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBtaW4td2lkdGg6IDE3MHB4Ow0KICBwYWRkaW5nOiAwLjdyZW0gMS40cmVtOw0KICBib3JkZXItcmFkaXVzOiAxNnB4Ow0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZmZlYWY0LCAjZmZkNmVhKTsNCiAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsMCwwLDAuMTIpOw0KICBmb250LWZhbWlseTogJ1F1aWNrc2FuZCcsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzI0MzAzZTsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogNjAwOw0KICBsaW5lLWhlaWdodDogMS40Ow0KICBtYXJnaW46IDAgMC42cmVtIDAuNnJlbSAwLjZyZW07DQoiPg0KICBQcm9ncmFtIFN0dWRpPGJyPlNhaW5zIERhdGENCjwvcD4NCg0KPCEtLSBLT1RBSyAyIOKAkyBVbml2ZXJzaXRhcyAobGlsYWMgLyB1bmd1IG11ZGEpIC0tPg0KPHAgY2xhc3M9ImluZm8tcGlsbCIgc3R5bGU9Ig0KICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7DQogIG1pbi13aWR0aDogMTcwcHg7DQogIHBhZGRpbmc6IDAuN3JlbSAxLjRyZW07DQogIGJvcmRlci1yYWRpdXM6IDE2cHg7DQogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmMmVjZmYsICNlMGQ3ZmYpOw0KICBib3gtc2hhZG93OiAwIDhweCAxOHB4IHJnYmEoMCwwLDAsMC4xMik7DQogIGZvbnQtZmFtaWx5OiAnUXVpY2tzYW5kJywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiAjMjQzMDNlOw0KICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiA2MDA7DQogIGxpbmUtaGVpZ2h0OiAxLjQ7DQogIG1hcmdpbjogMCAwLjZyZW0gMC42cmVtIDAuNnJlbTsNCiI+DQogIFVuaXZlcnNpdGFzPGJyPklOU1RJVFVUIFRFS05PTE9HSSBTQUlOUyBCQU5EVU5HDQo8L3A+DQoNCjwhLS0gS09UQUsgMyDigJMgRG9zZW4gUGVuZ2FtcHUgKGJpcnUgcGFzdGVsKSAtLT4NCjxwIGNsYXNzPSJpbmZvLXBpbGwiIHN0eWxlPSINCiAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICBtaW4td2lkdGg6IDE3MHB4Ow0KICBwYWRkaW5nOiAwLjdyZW0gMS40cmVtOw0KICBib3JkZXItcmFkaXVzOiAxNnB4Ow0KICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZTZmMmZmLCAjYzlkZGZmKTsNCiAgYm94LXNoYWRvdzogMCA4cHggMThweCByZ2JhKDAsMCwwLDAuMTIpOw0KICBmb250LWZhbWlseTogJ1F1aWNrc2FuZCcsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogIzI0MzAzZTsNCiAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogNjAwOw0KICBsaW5lLWhlaWdodDogMS40Ow0KICBtYXJnaW46IDAgMC42cmVtIDAuNnJlbSAwLjZyZW07DQoiPg0KICBEb3NlbiBQZW5nYW1wdTxicj5CYWt0aSBTaXJlZ2FyLCBNIFNjLiwgQ1NEDQo8L3A+DQoNCg0KDQo8L2Rpdj4NCg0KDQojIERBVEFTRVQgUFJBQ1RJQ1VNIA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbmFtZXMgPC0gYygiQmFnYXMiLCJKb2FuIiwiQWx5YSIsIkR3aSIsIk5hYmlsIikNCmFnZSA8LSBjKDI1LDMwLDI3LDM1LDQwKQ0Kc2FsYXJ5IDwtIGMoNTAwMCw3MDAwLDY1MDAsMTAwMDAsMTIwMDApDQpwb3NpdGlvbiA8LSBjKCJTdGFmZiIsIlN1cGVydmlzaW9yIiwiU3RhZmYiLCJNYW5hZ2VyIiwiRGlyZWt0b3IiKQ0KcGVyZm9ybWFuY2UgPC0gYygiR29vZCIsIlZlcnkgR29vZCIsIkF2ZXJhbmdlIiwiR29vZCIsIlZlcnkgR29vZCIpDQoNCmVtcGxveWVlIDwtIGRhdGEuZnJhbWUoDQogIElEID0gMTo1LA0KICBOYW1lID0gbmFtZXMsDQogIEFnZSA9IGFnZSwNCiAgU2FsYXJ5ID0gc2FsYXJ5LA0KICBQb3NpdGlvbiA9IHBvc2l0aW9uLA0KICBQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlDQopDQoNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQprYWJsZShlbXBsb3llZSwgYWxpZ249ImMiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkNCg0KYGBgDQoNCjxzdHlsZT4NCg0KdGFibGUgew0KICBib3JkZXItcmFkaXVzOjEwcHg7DQogIG92ZXJmbG93OmhpZGRlbjsNCiAgZm9udC1zaXplOjE2cHg7DQp9DQoNCnRoZWFkIHsNCiAgYmFja2dyb3VuZDojZWVmMWY3Ow0KICBmb250LXdlaWdodDpib2xkOw0KfQ0KDQp0Ym9keSB0cjpob3ZlciB7DQogIGJhY2tncm91bmQ6I2Y1ZjdmYjsNCn0NCg0KPC9zdHlsZT4NCg0KDQotLS0NCg0KDQojIyBCT05VUyBSVUxFUw0KDQo8ZGl2IGNsYXNzPSJib251cy1ydWxlcy1ib3giPg0KDQo8ZGl2IGNsYXNzPSJib251cy10aXRsZSI+DQpCb251cyBSdWxlcw0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImJvbnVzLWdyaWQiPg0KDQo8ZGl2IGNsYXNzPSJib251cy1jYXJkIj4NCjxkaXYgY2xhc3M9ImJvbnVzLWxhYmVsIHZlcnlnb29kIj5WZXJ5IEdvb2Q8L2Rpdj4NCjxkaXYgY2xhc3M9ImJvbnVzLXZhbHVlIj4yMCU8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJib251cy1jYXJkIj4NCjxkaXYgY2xhc3M9ImJvbnVzLWxhYmVsIGdvb2QiPkdvb2Q8L2Rpdj4NCjxkaXYgY2xhc3M9ImJvbnVzLXZhbHVlIj4xMCU8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJib251cy1jYXJkIj4NCjxkaXYgY2xhc3M9ImJvbnVzLWxhYmVsIGF2ZXJhZ2UiPkF2ZXJhZ2U8L2Rpdj4NCjxkaXYgY2xhc3M9ImJvbnVzLXZhbHVlIj41JTwvZGl2Pg0KPC9kaXY+DQoNCjwvZGl2Pg0KDQo8L2Rpdj4NCg0KYGBge2NzcyBlY2hvPUZBTFNFfQ0KLmJvbnVzLXJ1bGVzLWJveHsNCiAgbWFyZ2luLXRvcDoyMHB4Ow0KfQ0KDQouYm9udXMtdGl0bGV7DQogIGZvbnQtc2l6ZToxNnB4Ow0KICBtYXJnaW4tYm90dG9tOjE1cHg7DQogIGNvbG9yOiMyNDMwM2U7DQp9DQoNCi8qIEdSSUQgc3VwYXlhIGNhcmQgYmVyamFqYXIgKi8NCi5ib251cy1ncmlkew0KICBkaXNwbGF5OmZsZXg7DQogIGdhcDoyMnB4Ow0KICBqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyOw0KICBtYXJnaW4tdG9wOjEwcHg7DQp9DQoNCi8qIENBUkQgKi8NCi5ib251cy1jYXJkew0KICBiYWNrZ3JvdW5kOiNmNGY2ZmI7DQogIHBhZGRpbmc6MjBweCAzMHB4Ow0KICBib3JkZXItcmFkaXVzOjE2cHg7DQogIHRleHQtYWxpZ246Y2VudGVyOw0KICBtaW4td2lkdGg6MTMwcHg7DQogIGJveC1zaGFkb3c6MCA2cHggMTZweCByZ2JhKDAsMCwwLDAuMDgpOw0KICB0cmFuc2l0aW9uOjAuMnM7DQp9DQoNCi5ib251cy1jYXJkOmhvdmVyew0KICB0cmFuc2Zvcm06dHJhbnNsYXRlWSgtM3B4KTsNCn0NCg0KLyogTEFCRUwgKi8NCi5ib251cy1sYWJlbHsNCiAgZm9udC13ZWlnaHQ6NzAwOw0KICBmb250LWZhbWlseTonUXVpY2tzYW5kJywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7DQogIG1hcmdpbi1ib3R0b206NnB4Ow0KfQ0KDQovKiBXQVJOQSBTRVNVQUkgVEVNQSAqLw0KLnZlcnlnb29kew0KICBjb2xvcjojZTY0OTgwOyAgIC8qIHBpbmsgKi8NCn0NCg0KLmdvb2R7DQogIGNvbG9yOiM3YjVjZmY7ICAgLyogdW5ndSAqLw0KfQ0KDQouYXZlcmFnZXsNCiAgY29sb3I6IzNiODJmNjsgICAvKiBiaXJ1ICovDQp9DQoNCi8qIEFOR0tBIEJPTlVTICovDQouYm9udXMtdmFsdWV7DQogIGZvbnQtc2l6ZToyNHB4Ow0KICBmb250LXdlaWdodDo4MDA7DQogIGNvbG9yOiMxZjJkNGQ7DQp9DQpgYGANCg0KDQotLS0NCg0KIyMgQk9OVVMgTUVNQkVSUw0KDQo8ZGl2IGNsYXNzPSJib251cy1yZXN1bHRzLXdyYXBwZXIiPg0KDQo8ZGl2IGNsYXNzPSJib251cy1yZXN1bHRzLXRpdGxlIj4NCkJvbnVzIE1lbWJlciBSZXN1bHRzDQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0iYm9udXMtcmVzdWx0cy1ncmlkIj4NCg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtY2FyZCI+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1pY29uIj7wn5GkPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1uYW1lIj5CYWdhczwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQ1MDA8L2Rpdj4NCjxkaXYgY2xhc3M9ImVtcGxveWVlLXRhZyBnb29kIj5Hb29kIMK3IDEwJTwvZGl2Pg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImVtcGxveWVlLWNhcmQiPg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtaWNvbiI+8J+RpDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtbmFtZSI+Sm9hbjwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQxLDQwMDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIHZlcnlnb29kIj5WZXJ5IEdvb2QgwrcgMjAlPC9kaXY+DQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtY2FyZCI+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1pY29uIj7wn5GkPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1uYW1lIj5BbHlhPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1ib251cyI+JDMyNTwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIGF2ZXJhZ2UiPkF2ZXJhZ2UgwrcgNSU8L2Rpdj4NCjwvZGl2Pg0KDQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1jYXJkIj4NCjxkaXYgY2xhc3M9ImVtcGxveWVlLWljb24iPvCfkaQ8L2Rpdj4NCjxkaXYgY2xhc3M9ImVtcGxveWVlLW5hbWUiPkR3aTwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQxLDAwMDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIGdvb2QiPkdvb2QgwrcgMTAlPC9kaXY+DQo8L2Rpdj4NCg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtY2FyZCI+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1pY29uIj7wn5GkPC9kaXY+DQo8ZGl2IGNsYXNzPSJlbXBsb3llZS1uYW1lIj5OYWJpbDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtYm9udXMiPiQyLDQwMDwvZGl2Pg0KPGRpdiBjbGFzcz0iZW1wbG95ZWUtdGFnIHZlcnlnb29kIj5WZXJ5IEdvb2QgwrcgMjAlPC9kaXY+DQo8L2Rpdj4NCg0KPC9kaXY+DQo8L2Rpdj4NCg0KDQotLS0NCg0KIyBGT1IgTE9PUA0KDQojIyBDT05DRVBUIG9mIEZPUiBMT09QDQoNCg0KQSBmb3IgbG9vcCBpcyB1c2VkIHRvICoqcmVwZWF0IGEgY29tbWFuZCBmb3IgZWFjaCBpdGVtIGluIGEgZGF0YXNldC4qKiBJbiB0aGlzIHRhc2ssIHRoZSBmb3IgbG9vcCAqKmNoZWNrcyB0aGUgc2FsYXJ5IG9mIGVhY2ggZW1wbG95ZWUgb25lIGJ5IG9uZS4qKg0KDQpUaGUgcHJvZ3JhbSByZWFkcyB0aGUgZW1wbG95ZWUgZGF0YSByb3cgYnkgcm93IGFuZCBleGFtaW5lcyB3aGV0aGVyIHRoZSAqKnNhbGFyeSBpcyBncmVhdGVyIHRoYW4gNjAwMC4qKiBJZiB0aGUgY29uZGl0aW9uIGlzICoqdHJ1ZSwqKiB0aGUgcHJvZ3JhbSB3aWxsIGRpc3BsYXkgdGhlIGVtcGxveWVl4oCZcyBuYW1lIGFuZCBzYWxhcnkuIElmIHRoZSBzYWxhcnkgaXMgNjAwMCBvciBsZXNzLCB0aGUgZW1wbG95ZWUgd2lsbCBub3QgYmUgc2hvd24gaW4gdGhlIHJlc3VsdC4NCg0KVGhlcmVmb3JlLCB0aGUgZm9yIGxvb3AgaGVscHMgdGhlIHByb2dyYW0gYXV0b21hdGljYWxseSBnbyB0aHJvdWdoIGFsbCBlbXBsb3llZXMgYW5kIHNlbGVjdCBvbmx5IHRob3NlIHdobyBtZWV0IHRoZSBjb25kaXRpb24gd2l0aG91dCBjaGVja2luZyBlYWNoIG9uZSBtYW51YWxseS4NCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCg0KY2F0KCI8ZGl2IGNsYXNzPSdzYWxhcnktZ3JpZCc+IikNCg0KZm9yKGkgaW4gMTpucm93KGVtcGxveWVlKSl7DQogIA0KICBpZihlbXBsb3llZSRTYWxhcnlbaV0gPiA2MDAwKXsNCiAgICANCiAgICBzdGF0dXMgPC0gIuKclCINCiAgICBjbGFzc19zdGF0dXMgPC0gInNhbGFyeS1wYXNzIg0KICAgIA0KICB9IGVsc2V7DQogICAgDQogICAgc3RhdHVzIDwtICLinJYiDQogICAgY2xhc3Nfc3RhdHVzIDwtICJzYWxhcnktZmFpbCINCiAgICANCiAgfQ0KICANCiAgY2F0KA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktY2FyZCc+IiwNCiAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LWljb24nPvCfkaQ8L2Rpdj4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktbmFtZSc+IiwgZW1wbG95ZWUkTmFtZVtpXSwgIjwvZGl2PiIsDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS12YWx1ZSc+JCAiLCBlbXBsb3llZSRTYWxhcnlbaV0sICI8L2Rpdj4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktc3RhdHVzICIsIGNsYXNzX3N0YXR1cywgIic+Iiwgc3RhdHVzLCAiPC9kaXY+IiwNCiAgICAiPC9kaXY+Ig0KICApDQp9DQoNCmNhdCgiPC9kaXY+IikNCg0KYGBgDQoNCmBgYHtjc3MgZWNobz1GQUxTRX0NCi5zYWxhcnktZ3JpZHsNCiAgZGlzcGxheTpmbGV4Ow0KICBnYXA6MThweDsNCiAgZmxleC13cmFwOndyYXA7DQogIGp1c3RpZnktY29udGVudDpjZW50ZXI7DQogIG1hcmdpbi10b3A6MTJweDsNCn0NCg0KLnNhbGFyeS1jYXJkew0KICBiYWNrZ3JvdW5kOiNmZmY2ZWI7DQogIGJvcmRlci1yYWRpdXM6MjJweDsNCiAgcGFkZGluZzoxOHB4Ow0KICB3aWR0aDoxNDBweDsNCiAgdGV4dC1hbGlnbjpjZW50ZXI7DQogIGJvcmRlcjoycHggc29saWQgI2U4ZGJmZjsNCiAgYm94LXNoYWRvdzowIDhweCAxNnB4IHJnYmEoMCwwLDAsMC4wOCk7DQp9DQoNCi5zYWxhcnktaWNvbnsNCiAgd2lkdGg6NDBweDsNCiAgaGVpZ2h0OjQwcHg7DQogIG1hcmdpbjphdXRvOw0KICBib3JkZXItcmFkaXVzOjUwJTsNCiAgYmFja2dyb3VuZDojZjFlY2ZmOw0KICBkaXNwbGF5OmZsZXg7DQogIGFsaWduLWl0ZW1zOmNlbnRlcjsNCiAganVzdGlmeS1jb250ZW50OmNlbnRlcjsNCiAgbWFyZ2luLWJvdHRvbTo2cHg7DQp9DQoNCi5zYWxhcnktbmFtZXsNCiAgZm9udC13ZWlnaHQ6NzAwOw0KICBjb2xvcjojMmIzNDQ1Ow0KfQ0KDQouc2FsYXJ5LXZhbHVlew0KICBmb250LXNpemU6MThweDsNCiAgZm9udC13ZWlnaHQ6ODAwOw0KICBjb2xvcjojNDI2M2ViOw0KICBtYXJnaW46NnB4IDA7DQp9DQoNCi5zYWxhcnktc3RhdHVzew0KICBmb250LXNpemU6MTZweDsNCiAgZm9udC13ZWlnaHQ6NzAwOw0KfQ0KDQouc2FsYXJ5LXBhc3N7DQogIGNvbG9yOiMyZjllNDQ7DQp9DQoNCi5zYWxhcnktZmFpbHsNCiAgY29sb3I6I2UwMzEzMTsNCn0NCmBgYA0KDQoNCi0tLQ0KDQojIFdISUxFIExPT1ANCg0KIyMgQ09OQ0VQVCBvZiBXSElMRSBMT09QDQoNCkEgd2hpbGUgbG9vcCBpcyB1c2VkIHRvKiogcmVwZWF0IGEgY29tbWFuZCBhcyBsb25nIGFzIGEgY2VydGFpbiBjb25kaXRpb24gaXMgdHJ1ZS4qKiBJbiB0aGlzIHRhc2ssIHRoZSAqKndoaWxlIGxvb3AgZ29lcyB0aHJvdWdoIHRoZSBlbXBsb3llZSBsaXN0IG9uZSBieSBvbmUuKioNCg0KVGhlIHByb2dyYW0gKipzdGFydHMgZnJvbSB0aGUgZmlyc3QgZW1wbG95ZWUgYW5kIGRpc3BsYXlzIHRoZSBuYW1lIGFuZCBwb3NpdGlvbi4qKiBBZnRlciBzaG93aW5nIHRoZSBpbmZvcm1hdGlvbiwgKip0aGUgcHJvZ3JhbSBjaGVja3Mgd2hldGhlciB0aGUgZW1wbG95ZWXigJlzIHBvc2l0aW9uIGlzIOKAnE1hbmFnZXIu4oCdKioNCg0KKipJZiB0aGUgcG9zaXRpb24gaXMgbm90IE1hbmFnZXIqKiosIHRoZSBsb29wIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBlbXBsb3llZS4gSG93ZXZlciwgd2hlbiB0aGUgcHJvZ3JhbSBmaW5kcyBhbiBlbXBsb3llZSB3aXRoIHRoZSBwb3NpdGlvbiBNYW5hZ2VyLCB0aGUgbG9vcCBzdG9wcy4gDQoNClRoZXJlZm9yZSwgdGhlIHdoaWxlIGxvb3AgYWxsb3dzIHRoZSBwcm9ncmFtIHRvIHByb2Nlc3MgdGhlIGRhdGEgc3RlcCBieSBzdGVwIGFuZCBzdG9wIGF1dG9tYXRpY2FsbHkgd2hlbiBhIHNwZWNpZmljIGNvbmRpdGlvbiBpcyBtZXQsIHdpdGhvdXQgY2hlY2tpbmcgYWxsIGVtcGxveWVlcyBtYW51YWxseS4NCg0KYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQoNCmNhdCgiPGRpdiBjbGFzcz0nc2FsYXJ5LWdyaWQnPiIpDQoNCmkgPC0gMQ0KDQp3aGlsZShpIDw9IG5yb3coZW1wbG95ZWUpKXsNCiAgDQogIG5hbWUgPC0gZW1wbG95ZWUkTmFtZVtpXQ0KICBwb3MgIDwtIGVtcGxveWVlJFBvc2l0aW9uW2ldDQogIA0KICBpZihwb3MgPT0gIk1hbmFnZXIiKXsNCiAgICANCiAgICBzdGF0dXMgPC0gIuKclCINCiAgICBjbGFzc19zdGF0dXMgPC0gInNhbGFyeS1wYXNzIg0KICAgIA0KICAgIGNhdCgNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktY2FyZCc+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LW5hbWUnPiIsIG5hbWUsICI8L2Rpdj4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS12YWx1ZSc+IiwgcG9zLCAiPC9kaXY+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktc3RhdHVzICIsIGNsYXNzX3N0YXR1cywgIic+Iiwgc3RhdHVzLCAiIE1hbmFnZXIgZm91bmQ8L2Rpdj4iLA0KICAgICAgIjwvZGl2PiINCiAgICApDQogICAgDQogICAgYnJlYWsNCiAgICANCiAgfSBlbHNlew0KICAgIA0KICAgIHN0YXR1cyA8LSAi4pyWIg0KICAgIGNsYXNzX3N0YXR1cyA8LSAic2FsYXJ5LWZhaWwiDQogICAgDQogICAgY2F0KA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkJz4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1pY29uJz7wn5GkPC9kaXY+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktbmFtZSc+IiwgbmFtZSwgIjwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4iLCBwb3MsICI8L2Rpdj4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1zdGF0dXMgIiwgY2xhc3Nfc3RhdHVzLCAiJz4iLCBzdGF0dXMsICI8L2Rpdj4iLA0KICAgICAgIjwvZGl2PiINCiAgICApDQogICAgDQogIH0NCiAgDQogIGkgPC0gaSArIDENCn0NCg0KY2F0KCI8L2Rpdj4iKQ0KDQpgYGANCg0KDQpgYGB7Q1NTIGVjaG89RkFMU0V9DQoud2hpbGUtZ3JpZHsNCiAgZGlzcGxheTpmbGV4Ow0KICBnYXA6MThweDsNCiAgZmxleC13cmFwOndyYXA7DQogIGp1c3RpZnktY29udGVudDpjZW50ZXI7DQogIG1hcmdpbi10b3A6MTVweDsNCn0NCg0KLndoaWxlLWNhcmR7DQogIGJhY2tncm91bmQ6I2ZmZjZlYjsNCiAgYm9yZGVyLXJhZGl1czoyMHB4Ow0KICBwYWRkaW5nOjE2cHg7DQogIHdpZHRoOjE0MHB4Ow0KICB0ZXh0LWFsaWduOmNlbnRlcjsNCiAgYm9yZGVyOjJweCBzb2xpZCAjZThkYmZmOw0KICBib3gtc2hhZG93OjAgNnB4IDE0cHggcmdiYSgwLDAsMCwwLjA4KTsNCn0NCg0KLndoaWxlLWljb257DQogIGZvbnQtc2l6ZToyMHB4Ow0KICBtYXJnaW4tYm90dG9tOjRweDsNCn0NCg0KLndoaWxlLW5hbWV7DQogIGZvbnQtd2VpZ2h0OjcwMDsNCn0NCg0KLndoaWxlLXBvc3sNCiAgZm9udC1zaXplOjE0cHg7DQogIGNvbG9yOiM0MjYzZWI7DQp9DQoNCi5zdG9wLWNhcmR7DQogIGJvcmRlci1jb2xvcjojZmY4Nzg3Ow0KfQ0KDQoud2hpbGUtc3RvcHsNCiAgZm9udC1zaXplOjEycHg7DQogIGNvbG9yOiNlMDMxMzE7DQogIGZvbnQtd2VpZ2h0OjcwMDsNCn0NCg0KYGBgDQoNCi0tLQ0KDQoqKnRoZSBvdXRwdXQgZW5kcyBhdCBEd2ksIGJlY2F1c2UgRHdpIGlzIHRoZSBmaXJzdCBlbXBsb3llZSB3aXRoIHRoZSBwb3NpdGlvbiBNYW5hZ2VyLioqDQoNCg0KLS0tDQoNCg0KIyBCUkVBSw0KDQojIyBDT05DRVBUIG9mIEJSRUFLDQoNClRoZSBicmVhayBzdGF0ZW1lbnQgaXMgKip1c2VkIHRvIGltbWVkaWF0ZWx5IHN0b3AgYSBsb29wIHdoZW4gYSBzcGVjaWZpYyBjb25kaXRpb24gaXMgbWV0LioqDQoNCkluIHRoaXMgdGFzaywgKip0aGUgcHJvZ3JhbSBjaGVja3MgZWFjaCBlbXBsb3llZeKAmXMgc2FsYXJ5IG9uZSBieSBvbmUgdXNpbmcgYSBsb29wLioqIFRoZSBsb29wIGNvbnRpbnVlcyB0byBkaXNwbGF5IHRoZSBlbXBsb3llZeKAmXMgbmFtZSBhbmQgc2FsYXJ5ICoqdW50aWwgaXQgZmluZHMgYW4gZW1wbG95ZWUgd2hvc2Ugc2FsYXJ5IGlzIGFib3ZlIDEwLDAwMC4qKg0KDQpUaGVyZWZvcmUsIHRoZSBicmVhayBzdGF0ZW1lbnQgYWxsb3dzIHRoZSBwcm9ncmFtIHRvIGV4aXQgdGhlIGxvb3AgZWFybHkgb25jZSB0aGUgcmVxdWlyZWQgY29uZGl0aW9uIGlzIGZvdW5kLCBtYWtpbmcgdGhlIHByb2Nlc3MgbW9yZSBlZmZpY2llbnQuDQoNCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KDQpjYXQoIjxkaXYgY2xhc3M9J3NhbGFyeS1ncmlkJz4iKQ0KDQpmb3IoaSBpbiAxOm5yb3coZW1wbG95ZWUpKXsNCiAgDQogIGlmKGVtcGxveWVlJFNhbGFyeVtpXSA+IDEwMDAwKXsNCiAgICANCiAgICBjYXQoDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LWNhcmQgc3RvcC1jYXJkJz4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1pY29uJz7wn5GkPC9kaXY+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktbmFtZSc+IiwgZW1wbG95ZWUkTmFtZVtpXSwgIjwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4kICIsIGVtcGxveWVlJFNhbGFyeVtpXSwgIjwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXN0b3AnPkxvb3AgU3RvcHBlZDwvZGl2PiIsDQogICAgICAiPC9kaXY+Ig0KICAgICkNCiAgICANCiAgICBicmVhaw0KICB9DQogIA0KICBjYXQoDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkJz4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1uYW1lJz4iLCBlbXBsb3llZSROYW1lW2ldLCAiPC9kaXY+IiwNCiAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4kICIsIGVtcGxveWVlJFNhbGFyeVtpXSwgIjwvZGl2PiIsDQogICAgIjwvZGl2PiINCiAgKQ0KICANCn0NCg0KY2F0KCI8L2Rpdj4iKQ0KDQpgYGANCg0KYGBge0NTUyBlY2hvPUZBTFNFfQ0KLnN0b3AtY2FyZHsNCiAgYm9yZGVyLWNvbG9yOiNmZjg3ODc7DQp9DQoNCi5zdG9wLWNhcmQgLnNhbGFyeS1pY29uew0KICBiYWNrZ3JvdW5kOiNmZmUzZTM7DQp9DQoNCmBgYA0KDQotLS0NCg0KV2hlbiB0aGUgcHJvZ3JhbSByZWFjaGVzICoqTmFiaWwqKiwgd2hvc2Ugc2FsYXJ5IGlzIDEyLDAwMCwgdGhlIGNvbmRpdGlvbiBiZWNvbWVzIHRydWUuIEF0IHRoaXMgcG9pbnQsICoqdGhlIGJyZWFrIGNvbW1hbmQgc3RvcHMgdGhlIGxvb3AsIHNvIHRoZSBwcm9ncmFtIGRvZXMgbm90IGNvbnRpbnVlIGNoZWNraW5nIHRoZSByZW1haW5pbmcgZGF0YS4qKg0KDQotLS0NCg0KIyBDT05USU5VRSB0byBTS0lQIChlbXBsb3llZXMgd2l0aCBhdmVyYWdlIHBlcmZvcm1hbmNlKQ0KDQojIyBUSEUgQ09OQ0VQVCANCg0KVGhlIGNvbnRpbnVlIHN0YXRlbWVudCBpcyAqKnVzZWQgdG8gc2tpcCB0aGUgY3VycmVudCBpdGVyYXRpb24gb2YgYSBsb29wIGFuZCBtb3ZlIGRpcmVjdGx5IHRvIHRoZSBuZXh0IG9uZS4qKg0KDQpJbiB0aGlzIHRhc2ssICoqdGhlIHByb2dyYW0gY2hlY2tzIHRoZSBwZXJmb3JtYW5jZSBvZiBlYWNoIGVtcGxveWVlLiBJZiBhbiBlbXBsb3llZSBoYXMg4oCcQXZlcmFnZeKAnSBwZXJmb3JtYW5jZSwgdGhlIHByb2dyYW0gd2lsbCBza2lwIHRoYXQgZW1wbG95ZWUgYW5kIGNvbnRpbnVlIHRvIHRoZSBuZXh0IG9uZS4qKg0KDQpUaGVyZWZvcmUsIHRoZSBjb250aW51ZSBzdGF0ZW1lbnQgaGVscHMgdGhlIHByb2dyYW0gaWdub3JlIGNlcnRhaW4gZGF0YSB3aGlsZSBzdGlsbCBjb250aW51aW5nIHRoZSBsb29wIGZvciB0aGUgcmVzdCBvZiB0aGUgZGF0YXNldC4NCg0KYGBge3IgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQoNCmNhdCgiPGRpdiBjbGFzcz0nc2FsYXJ5LWdyaWQnPiIpDQoNCmZvcihpIGluIDE6bnJvdyhlbXBsb3llZSkpew0KICANCiAgaWYoZW1wbG95ZWUkUGVyZm9ybWFuY2VbaV0gPT0gIkF2ZXJhbmdlIil7DQogICAgDQogICAgY2F0KA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkIHNraXAtY2FyZCc+IiwNCiAgICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LW5hbWUnPiIsIGVtcGxveWVlJE5hbWVbaV0sICI8L2Rpdj4iLA0KICAgICAgIjxkaXYgY2xhc3M9J3NhbGFyeS12YWx1ZSc+QXZlcmFnZTwvZGl2PiIsDQogICAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXN0b3AnPlNraXBwZWQ8L2Rpdj4iLA0KICAgICAgIjwvZGl2PiINCiAgICApDQogICAgDQogICAgbmV4dA0KICB9DQogIA0KICBjYXQoDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1jYXJkJz4iLA0KICAgICI8ZGl2IGNsYXNzPSdzYWxhcnktaWNvbic+8J+RpDwvZGl2PiIsDQogICAgIjxkaXYgY2xhc3M9J3NhbGFyeS1uYW1lJz4iLCBlbXBsb3llZSROYW1lW2ldLCAiPC9kaXY+IiwNCiAgICAiPGRpdiBjbGFzcz0nc2FsYXJ5LXZhbHVlJz4iLCBlbXBsb3llZSRQZXJmb3JtYW5jZVtpXSwgIjwvZGl2PiIsDQogICAgIjwvZGl2PiINCiAgKQ0KICANCn0NCg0KY2F0KCI8L2Rpdj4iKQ0KDQpgYGANCg0KYGBge2NzcyBlY2hvPUZBTFNFfQ0KLnNraXAtY2FyZHsNCiAgYm9yZGVyLWNvbG9yOiNmZmQ0M2I7DQp9DQoNCi5za2lwLWNhcmQgLnNhbGFyeS1zdG9wew0KICBjb2xvcjojZjA4YzAwOw0KfQ0KDQpgYGAgICAgICAgICAgICAgICAgIA0KDQotLS0NCg0KVGhpcyBtZWFucyB0aGUgZW1wbG95ZWUgd2l0aCAqKkF2ZXJhZ2UgcGVyZm9ybWFuY2UgKEFseWEpKiogd2lsbCBub3QgYmUgZGlzcGxheWVkIGluIHRoZSByZXN1bHQuIFRoZSBsb29wIGNvbnRpbnVlcyB0byBwcm9jZXNzIHRoZSByZW1haW5pbmcgZW1wbG95ZWVzIG5vcm1hbGx5Lg0KDQotLS0NCg0KPHNjcmlwdD4NCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsNCg0KICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7DQoNCiAgLyogPT09PT09IFNUQVJUOiBTSURFQkFSIE9UT01BVElTIEtFVFVUVVAgPT09PT09ICovDQogIC8vIHBhcyBwZXJ0YW1hIGthbGkgaGFsYW1hbiBzZWxlc2FpIGRpLWxvYWQsIGxhbmdzdW5nIG1vZGUgImNvbGxhcHNlZCINCiAgYm9keS5jbGFzc0xpc3QuYWRkKCJzaWRlYmFyLWNvbGxhcHNlZCIpOw0KICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8NCg0KICAvLyA9PT09IFRPR0dMRSBTSURFQkFSIChIQU1CVVJHRVIpID09PT0NCiAgdmFyIG1lbnVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2lkZWJhci10b2dnbGUiKTsNCiAgaWYgKG1lbnVCdG4pIHsNCiAgICBtZW51QnRuLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgLy8ga2xpayA9IGJ1a2EgLyB0dXR1cCBhcmVhIHBpbmsNCiAgICAgIGJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgic2lkZWJhci1jb2xsYXBzZWQiKTsNCiAgICB9KTsNCiAgfQ0KDQogIC8vID09PT0gVE9HR0xFIExJR0hUIC8gREFSSyBNT0RFID09PT0NCiAgdmFyIG1vZGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9kZS10b2dnbGUiKTsNCiAgaWYgKG1vZGVCdG4pIHsNCg0KICAgIC8vIGNvYmEgYmFjYSBtb2RlIHlhbmcgZGlzaW1wYW4gKGthbGF1IGFkYSkNCiAgICB2YXIgc2F2ZWRNb2RlID0gbnVsbDsNCiAgICB0cnkgew0KICAgICAgc2F2ZWRNb2RlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIm51cnVsLXRoZW1lLW1vZGUiKTsNCiAgICB9IGNhdGNoIChlKSB7DQogICAgICBzYXZlZE1vZGUgPSBudWxsOw0KICAgIH0NCiAgICBpZiAoc2F2ZWRNb2RlID09PSAiZGFyayIpIHsNCiAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCgiZGFyay1tb2RlIik7DQogICAgfQ0KDQogICAgbW9kZUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uICgpIHsNCiAgICAgIGJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZGFyay1tb2RlIik7DQogICAgICB0cnkgew0KICAgICAgICB2YXIgaXNEYXJrID0gYm9keS5jbGFzc0xpc3QuY29udGFpbnMoImRhcmstbW9kZSIpOw0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgibnVydWwtdGhlbWUtbW9kZSIsIGlzRGFyayA/ICJkYXJrIiA6ICJsaWdodCIpOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAvLyBrYWxhdSBsb2NhbFN0b3JhZ2UgbmdnYWsgYmlzYSwgZGllbSBhamENCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQp9KTsNCjwvc2NyaXB0Pg0KDQoNCg==