Зазвичай команди в R виконуються послідовно, з початку програмного коду до кінця. Однак бувають випадки, коли деякі команди потрібно виконати кілька разів, а інші – тільки за певних умов. У такій ситуації необхідно використовувати спеціальні конструкції для управління порядком виконання команд.
В R реалізовані стандартні конструкції такого типу, як і в будь-якій іншій сучасній мові програмування. Спочатку ми розглянемо конструкції, що забезпечують виконання команд умови, а потім – конструкції, які використовуються для циклічного виконання команд.
Повторення і цикли
Циклічність (англ. “Looping”) відкрито Адою Лавлейс під час її роботи з Беббіджом над першим програмованим комп’ютером “Аналітичний двигун”, що був накреслений в XIX ст., проте так і не побудований.
Циклічність операцій – це будь-який набір операцій, що повторюється неодноразово. У багатьох випадках аналізу може виникати повторювана група одного або більше циклів, тобто цикл циклу, або цикл циклів. Контрольований потік операцій – це те, що робить комп’ютер значно кориснішим, ніж калькулятори для виконання математичних алгоритмів.
Циклічні конструкції багаторазово виконують одну і ту ж команду або набір команд, допоки не буде виконано задана умова. До таких конструкцій відносять for і while
For
Циклічна конструкція for повторно виконує певну команду, поки значення змінної буде міститися в наперед заданій послідовності. Синтаксис є таким:
for(var in seq) condition
У наведеному нижче прикладі слово Hello буде надруковано 10 разів:
for(i in 1:10)
print("Hello")
while
Циклічна конструкція while повторно виконує команду, поки задана умова не перестане бути істинною. Загальний вигляд застосування конструкції такий:
while(condition) statement
Програмний код
i <- 10
while(i>0) {
print("Hello");
i <- i - 1
}
знову надрукує слово Hello 10 разів. Переконайтеся, що твердження всередині дужок так змінюють умову, що рано чи пізно воно перестане бути істинним – інакше цикл ніколи не завершиться! В попередньому прикладі твердження
i <- i - 1
віднімає 1 з об’єкта i під час виконання кожного циклу, так що після десятого циклу воно вже не буде більше за 0. Якби ви, навпаки, додавали одиницю після кожного циклу, то R ніколи б не закінчила вітати вас. Ось чому while може бути більш небезпечним за інші циклічні конструкції.
Проте, цикли в мові R можуть бути неефективними, а їхнє виконання займатиме багато часу. Тому за роботою з великими масивами даних доцільно використовувати вбудовані в R числові й текстові функції в поєднанні з функціями сімейства apply. Докладніше роботу з функціями буде розглянуто на наступній лекції.
Виконання за умови
Виконання за умови означає, що команди виконуються тільки у разі досягнення певної умови. До таких конструкцій належатьifelse, ifelse і switch.
if-else
Керувна конструкція if-else виконує команду, якщо правильно задана умова. В якості опції інша команда може виконуватися, якщо задана умова виявиться невірною. Синтаксис такий:
if(condition) statement
if(condition) statement1 else statement2
Розглянемо такі приклади:
if(is.character(grade))
grade <- as.factor(grade);
if(!is.character(grade))
grade <- as.factor(grade);
else
print("Змінна grade – не фактор")
У першому випадку, якщо змінна grade – текстовий вектор, вона перетвориться на фактор. У другому випадку виконується одна з двох команд: якщо змінна grade – не є фактором (зверніть увагу на символ!), то вона перетвориться на нього. Якщо ж ця змінна – фактор, то на екран виводиться повідомлення про це.
ifelse
Конструкція ifelse – компактна і векторизована версія конструкції if-else. Синтаксис такий:
ifelse(condition, statement1, statemenet2)
Перша команда виконується, якщо умова condition істинна. Якщо умова помилкова, виконується друга команда. Ось приклади:
ifelse(score > 0.5, print("Здав!"), print("Провалився!"))
outcome <- ifelse(score > 0.5, "Провалився!", "Здав!")
Використовуйте цю конструкцію, якщо вам потрібно розділити дані на дві категорії або оперувати векторами.
switch
Конструкція switch вибирає команди залежно від значення, яке приймає вираз. Синтаксис такий:
switch (expression,...)
Три крапки позначають команди, що відповідають можливим значенням expression. Найлегше зрозуміти роботу даної конструкції на прикладі наведеного нижче програмного коду.
feelings <- c("sadness", "fear")
for(i in feelings)
print(switch(i, happyness="I'm glad you're happy!",
fear="There is nothing to fear about!",
sadness="Cheer up!",
anger="Calm down."))
Це надуманий приклад, проте він демонструє основні принципи застосування цієї конструкції. Ви дізнаєтеся як її використовувати в створених користувачем функціях на наступній лекції.
LS0tDQp0aXRsZTogItCb0LXQutGG0ZbRjyA1LiDQo9C/0YDQsNCy0LvRltC90L3RjyDQstC40LrQvtC90LDQvdC90Y/QvCDQutC+0LzQsNC90LQiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgY29kZV9mb2xkaW5nOiBub25lDQotLS0NCg0KPHN0eWxlPg0KYm9keSB7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQl9Cw0LfQstC40YfQsNC5INC60L7QvNCw0L3QtNC4INCyIFIg0LLQuNC60L7QvdGD0Y7RgtGM0YHRjyDQv9C+0YHQu9GW0LTQvtCy0L3Qviwg0Lcg0L/QvtGH0LDRgtC60YMg0L/RgNC+0LPRgNCw0LzQvdC+0LPQviDQutC+0LTRgyDQtNC+INC60ZbQvdGG0Y8uINCe0LTQvdCw0Log0LHRg9Cy0LDRjtGC0Ywg0LLQuNC/0LDQtNC60LgsINC60L7Qu9C4INC00LXRj9C60ZYg0LrQvtC80LDQvdC00Lgg0L/QvtGC0YDRltCx0L3QviDQstC40LrQvtC90LDRgtC4INC60ZbQu9GM0LrQsCDRgNCw0LfRltCyLCDQsCDRltC90YjRliDigJMg0YLRltC70YzQutC4INC30LAg0L/QtdCy0L3QuNGFINGD0LzQvtCyLiDQoyDRgtCw0LrRltC5INGB0LjRgtGD0LDRhtGW0Zcg0L3QtdC+0LHRhdGW0LTQvdC+INCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDRgdC/0LXRhtGW0LDQu9GM0L3RliDQutC+0L3RgdGC0YDRg9C60YbRltGXINC00LvRjyDRg9C/0YDQsNCy0LvRltC90L3RjyDQv9C+0YDRj9C00LrQvtC8INCy0LjQutC+0L3QsNC90L3RjyDQutC+0LzQsNC90LQuDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0JIgUiDRgNC10LDQu9GW0LfQvtCy0LDQvdGWINGB0YLQsNC90LTQsNGA0YLQvdGWINC60L7QvdGB0YLRgNGD0LrRhtGW0Zcg0YLQsNC60L7Qs9C+INGC0LjQv9GDLCDRj9C6INGWINCyINCx0YPQtNGMLdGP0LrRltC5INGW0L3RiNGW0Lkg0YHRg9GH0LDRgdC90ZbQuSDQvNC+0LLRliDQv9GA0L7Qs9GA0LDQvNGD0LLQsNC90L3Rjy4g0KHQv9C+0YfQsNGC0LrRgyDQvNC4INGA0L7Qt9Cz0LvRj9C90LXQvNC+INC60L7QvdGB0YLRgNGD0LrRhtGW0ZcsINGJ0L4g0LfQsNCx0LXQt9C/0LXRh9GD0Y7RgtGMINCy0LjQutC+0L3QsNC90L3RjyDQutC+0LzQsNC90LQg0YPQvNC+0LLQuCwg0LAg0L/QvtGC0ZbQvCDigJMg0LrQvtC90YHRgtGA0YPQutGG0ZbRlywg0Y/QutGWINCy0LjQutC+0YDQuNGB0YLQvtCy0YPRjtGC0YzRgdGPINC00LvRjyDRhtC40LrQu9GW0YfQvdC+0LPQviDQstC40LrQvtC90LDQvdC90Y8g0LrQvtC80LDQvdC0Lg0KDQojI9Cf0L7QstGC0L7RgNC10L3QvdGPINGWINGG0LjQutC70LgNCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQptC40LrQu9GW0YfQvdGW0YHRgtGMICjQsNC90LPQuy4gIkxvb3BpbmciKSDQstGW0LTQutGA0LjRgtC+INCQ0LTQvtGOINCb0LDQstC70LXQudGBINC/0ZbQtCDRh9Cw0YEg0ZfRlyDRgNC+0LHQvtGC0Lgg0Lcg0JHQtdCx0LHRltC00LbQvtC8INC90LDQtCDQv9C10YDRiNC40Lwg0L/RgNC+0LPRgNCw0LzQvtCy0LDQvdC40Lwg0LrQvtC80L/igJnRjtGC0LXRgNC+0LwgItCQ0L3QsNC70ZbRgtC40YfQvdC40Lkg0LTQstC40LPRg9C9Iiwg0YnQviDQsdGD0LIg0L3QsNC60YDQtdGB0LvQtdC90LjQuSDQsiBYSVgg0YHRgi4sINC/0YDQvtGC0LUg0YLQsNC6INGWINC90LUg0L/QvtCx0YPQtNC+0LLQsNC90LjQuS4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQptC40LrQu9GW0YfQvdGW0YHRgtGMINC+0L/QtdGA0LDRhtGW0Lkg4oCTINGG0LUg0LHRg9C00Ywt0Y/QutC40Lkg0L3QsNCx0ZbRgCDQvtC/0LXRgNCw0YbRltC5LCDRidC+INC/0L7QstGC0L7RgNGO0ZTRgtGM0YHRjyDQvdC10L7QtNC90L7RgNCw0LfQvtCy0L4uINCjINCx0LDQs9Cw0YLRjNC+0YUg0LLQuNC/0LDQtNC60LDRhSDQsNC90LDQu9GW0LfRgyDQvNC+0LbQtSDQstC40L3QuNC60LDRgtC4INC/0L7QstGC0L7RgNGO0LLQsNC90LAg0LPRgNGD0L/QsCDQvtC00L3QvtCz0L4g0LDQsdC+INCx0ZbQu9GM0YjQtSDRhtC40LrQu9GW0LIsINGC0L7QsdGC0L4g0YbQuNC60Lsg0YbQuNC60LvRgywg0LDQsdC+INGG0LjQutC7INGG0LjQutC70ZbQsi4g0JrQvtC90YLRgNC+0LvRjNC+0LLQsNC90LjQuSDQv9C+0YLRltC6INC+0L/QtdGA0LDRhtGW0Lkg4oCTINGG0LUg0YLQtSwg0YnQviDRgNC+0LHQuNGC0Ywg0LrQvtC80L8n0Y7RgtC10YAg0LfQvdCw0YfQvdC+INC60L7RgNC40YHQvdGW0YjQuNC8LCDQvdGW0LYg0LrQsNC70YzQutGD0LvRj9GC0L7RgNC4INC00LvRjyDQstC40LrQvtC90LDQvdC90Y8g0LzQsNGC0LXQvNCw0YLQuNGH0L3QuNGFINCw0LvQs9C+0YDQuNGC0LzRltCyLg0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCm0LjQutC70ZbRh9C90ZYg0LrQvtC90YHRgtGA0YPQutGG0ZbRlyDQsdCw0LPQsNGC0L7RgNCw0LfQvtCy0L4g0LLQuNC60L7QvdGD0Y7RgtGMINC+0LTQvdGDINGWINGC0YMg0LYg0LrQvtC80LDQvdC00YMg0LDQsdC+INC90LDQsdGW0YAg0LrQvtC80LDQvdC0LCDQtNC+0L/QvtC60Lgg0L3QtSDQsdGD0LTQtSDQstC40LrQvtC90LDQvdC+INC30LDQtNCw0L3QsCDRg9C80L7QstCwLiDQlNC+INGC0LDQutC40YUg0LrQvtC90YHRgtGA0YPQutGG0ZbQuSDQstGW0LTQvdC+0YHRj9GC0YwgYGZvcmAg0ZYgYHdoaWxlYA0KDQojIyNGb3INCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQptC40LrQu9GW0YfQvdCwINC60L7QvdGB0YLRgNGD0LrRhtGW0Y8gYGZvcmAg0L/QvtCy0YLQvtGA0L3QviDQstC40LrQvtC90YPRlCDQv9C10LLQvdGDINC60L7QvNCw0L3QtNGDLCDQv9C+0LrQuCDQt9C90LDRh9C10L3QvdGPINC30LzRltC90L3QvtGXINCx0YPQtNC1INC80ZbRgdGC0LjRgtC40YHRjyDQsiDQvdCw0L/QtdGA0LXQtCDQt9Cw0LTQsNC90ZbQuSDQv9C+0YHQu9GW0LTQvtCy0L3QvtGB0YLRli4g0KHQuNC90YLQsNC60YHQuNGBINGUINGC0LDQutC40Lw6DQoNCmBgYHtyfQ0KZm9yKHZhciBpbiBzZXEpIGNvbmRpdGlvbg0KYGBgDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0KMg0L3QsNCy0LXQtNC10L3QvtC80YMg0L3QuNC20YfQtSDQv9GA0LjQutC70LDQtNGWINGB0LvQvtCy0L4gKkhlbGxvKiDQsdGD0LTQtSDQvdCw0LTRgNGD0LrQvtCy0LDQvdC+IDEwINGA0LDQt9GW0LI6DQoNCmBgYHtyfQ0KZm9yKGkgaW4gMToxMCkNCiAgcHJpbnQoIkhlbGxvIikNCmBgYA0KIyN3aGlsZQ0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCm0LjQutC70ZbRh9C90LAg0LrQvtC90YHRgtGA0YPQutGG0ZbRjyBgd2hpbGVgINC/0L7QstGC0L7RgNC90L4g0LLQuNC60L7QvdGD0ZQg0LrQvtC80LDQvdC00YMsINC/0L7QutC4INC30LDQtNCw0L3QsCDRg9C80L7QstCwINC90LUg0L/QtdGA0LXRgdGC0LDQvdC1INCx0YPRgtC4INGW0YHRgtC40L3QvdC+0Y4uINCX0LDQs9Cw0LvRjNC90LjQuSDQstC40LPQu9GP0LQg0LfQsNGB0YLQvtGB0YPQstCw0L3QvdGPINC60L7QvdGB0YLRgNGD0LrRhtGW0Zcg0YLQsNC60LjQuToNCg0KYGBge3J9DQp3aGlsZShjb25kaXRpb24pIHN0YXRlbWVudA0KYGBgDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0J/RgNC+0LPRgNCw0LzQvdC40Lkg0LrQvtC0DQoNCmBgYHtyfQ0KaSA8LSAxMA0Kd2hpbGUoaT4wKSB7DQogIHByaW50KCJIZWxsbyIpOw0KICBpIDwtIGkgLSAxDQp9DQpgYGANCg0K0LfQvdC+0LLRgyDQvdCw0LTRgNGD0LrRg9GUINGB0LvQvtCy0L4gSGVsbG8gMTAg0YDQsNC30ZbQsi4g0J/QtdGA0LXQutC+0L3QsNC50YLQtdGB0Y8sINGJ0L4g0YLQstC10YDQtNC20LXQvdC90Y8g0LLRgdC10YDQtdC00LjQvdGWINC00YPQttC+0Log0YLQsNC6INC30LzRltC90Y7RjtGC0Ywg0YPQvNC+0LLRgywg0YnQviDRgNCw0L3QviDRh9C4INC/0ZbQt9C90L4g0LLQvtC90L4g0L/QtdGA0LXRgdGC0LDQvdC1INCx0YPRgtC4INGW0YHRgtC40L3QvdC40Lwg4oCTINGW0L3QsNC60YjQtSDRhtC40LrQuyDQvdGW0LrQvtC70Lgg0L3QtSDQt9Cw0LLQtdGA0YjQuNGC0YzRgdGPISDQkiDQv9C+0L/QtdGA0LXQtNC90YzQvtC80YMg0L/RgNC40LrQu9Cw0LTRliDRgtCy0LXRgNC00LbQtdC90L3Rjw0KDQpgYGB7cn0NCmkgPC0gaSAtIDENCmBgYA0KDQrQstGW0LTQvdGW0LzQsNGUIDEg0Lcg0L7QsSfRlNC60YLQsCBgaWAg0L/RltC0INGH0LDRgSDQstC40LrQvtC90LDQvdC90Y8g0LrQvtC20L3QvtCz0L4g0YbQuNC60LvRgywg0YLQsNC6INGJ0L4g0L/RltGB0LvRjyDQtNC10YHRj9GC0L7Qs9C+INGG0LjQutC70YMg0LLQvtC90L4g0LLQttC1INC90LUg0LHRg9C00LUg0LHRltC70YzRiNC1INC30LAgMC4g0K/QutCx0Lgg0LLQuCwg0L3QsNCy0L/QsNC60LgsINC00L7QtNCw0LLQsNC70Lgg0L7QtNC40L3QuNGG0Y4g0L/RltGB0LvRjyDQutC+0LbQvdC+0LPQviDRhtC40LrQu9GDLCDRgtC+IFIg0L3RltC60L7Qu9C4INCxINC90LUg0LfQsNC60ZbQvdGH0LjQu9CwINCy0ZbRgtCw0YLQuCDQstCw0YEuINCe0YHRjCDRh9C+0LzRgyBgd2hpbGVgINC80L7QttC1INCx0YPRgtC4INCx0ZbQu9GM0Ygg0L3QtdCx0LXQt9C/0LXRh9C90LjQvCDQt9CwINGW0L3RiNGWINGG0LjQutC70ZbRh9C90ZYg0LrQvtC90YHRgtGA0YPQutGG0ZbRly4NCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQn9GA0L7RgtC1LCDRhtC40LrQu9C4INCyINC80L7QstGWIFIg0LzQvtC20YPRgtGMINCx0YPRgtC4INC90LXQtdGE0LXQutGC0LjQstC90LjQvNC4LCDQsCDRl9GF0L3RlCDQstC40LrQvtC90LDQvdC90Y8g0LfQsNC50LzQsNGC0LjQvNC1INCx0LDQs9Cw0YLQviDRh9Cw0YHRgy4g0KLQvtC80YMg0LfQsCDRgNC+0LHQvtGC0L7RjiDQtyDQstC10LvQuNC60LjQvNC4INC80LDRgdC40LLQsNC80Lgg0LTQsNC90LjRhSDQtNC+0YbRltC70YzQvdC+INCy0LjQutC+0YDQuNGB0YLQvtCy0YPQstCw0YLQuCDQstCx0YPQtNC+0LLQsNC90ZYg0LIgUiDRh9C40YHQu9C+0LLRliDQuSDRgtC10LrRgdGC0L7QstGWINGE0YPQvdC60YbRltGXINCyINC/0L7RlNC00L3QsNC90L3RliDQtyDRhNGD0L3QutGG0ZbRj9C80Lgg0YHRltC80LXQudGB0YLQstCwIGFwcGx5LiDQlNC+0LrQu9Cw0LTQvdGW0YjQtSDRgNC+0LHQvtGC0YMg0Lcg0YTRg9C90LrRhtGW0Y/QvNC4INCx0YPQtNC1INGA0L7Qt9Cz0LvRj9C90YPRgtC+INC90LAg0L3QsNGB0YLRg9C/0L3RltC5INC70LXQutGG0ZbRly4NCg0KIyPQktC40LrQvtC90LDQvdC90Y8g0LfQsCDRg9C80L7QstC4DQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0JLQuNC60L7QvdCw0L3QvdGPINC30LAg0YPQvNC+0LLQuCDQvtC30L3QsNGH0LDRlCwg0YnQviDQutC+0LzQsNC90LTQuCDQstC40LrQvtC90YPRjtGC0YzRgdGPINGC0ZbQu9GM0LrQuCDRgyDRgNCw0LfRliDQtNC+0YHRj9Cz0L3QtdC90L3RjyDQv9C10LLQvdC+0Zcg0YPQvNC+0LLQuC4g0JTQviDRgtCw0LrQuNGFINC60L7QvdGB0YLRgNGD0LrRhtGW0Lkg0L3QsNC70LXQttCw0YLRjGBpZmVsc2VgLCBgaWZlbHNlYCDRliBgc3dpdGNoYC4NCg0KIyMjaWYtZWxzZQ0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCa0LXRgNGD0LLQvdCwINC60L7QvdGB0YLRgNGD0LrRhtGW0Y8gYGlmLWVsc2VgINCy0LjQutC+0L3Rg9GUINC60L7QvNCw0L3QtNGDLCDRj9C60YnQviDQv9GA0LDQstC40LvRjNC90L4g0LfQsNC00LDQvdCwINGD0LzQvtCy0LAuINCSINGP0LrQvtGB0YLRliDQvtC/0YbRltGXINGW0L3RiNCwINC60L7QvNCw0L3QtNCwINC80L7QttC1INCy0LjQutC+0L3Rg9Cy0LDRgtC40YHRjywg0Y/QutGJ0L4g0LfQsNC00LDQvdCwINGD0LzQvtCy0LAg0LLQuNGP0LLQuNGC0YzRgdGPINC90LXQstGW0YDQvdC+0Y4uINCh0LjQvdGC0LDQutGB0LjRgSDRgtCw0LrQuNC5Og0KDQpgYGB7cn0NCmlmKGNvbmRpdGlvbikgc3RhdGVtZW50DQppZihjb25kaXRpb24pIHN0YXRlbWVudDEgZWxzZSBzdGF0ZW1lbnQyDQpgYGANCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQoNC+0LfQs9C70Y/QvdC10LzQviDRgtCw0LrRliDQv9GA0LjQutC70LDQtNC4Og0KDQpgYGB7cn0NCmlmKGlzLmNoYXJhY3RlcihncmFkZSkpIA0KICBncmFkZSA8LSBhcy5mYWN0b3IoZ3JhZGUpOw0KaWYoIWlzLmNoYXJhY3RlcihncmFkZSkpDQogIGdyYWRlIDwtIGFzLmZhY3RvcihncmFkZSk7DQplbHNlDQogIHByaW50KCLQl9C80ZbQvdC90LAgZ3JhZGUg4oCTINC90LUg0YTQsNC60YLQvtGAIikNCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCjINC/0LXRgNGI0L7QvNGDINCy0LjQv9Cw0LTQutGDLCDRj9C60YnQviDQt9C80ZbQvdC90LAgYGdyYWRlYCDigJMg0YLQtdC60YHRgtC+0LLQuNC5INCy0LXQutGC0L7RgCwg0LLQvtC90LAg0L/QtdGA0LXRgtCy0L7RgNC40YLRjNGB0Y8g0L3QsCDRhNCw0LrRgtC+0YAuINCjINC00YDRg9Cz0L7QvNGDINCy0LjQv9Cw0LTQutGDINCy0LjQutC+0L3Rg9GU0YLRjNGB0Y8g0L7QtNC90LAg0Lcg0LTQstC+0YUg0LrQvtC80LDQvdC0OiDRj9C60YnQviDQt9C80ZbQvdC90LAgZ3JhZGUg4oCTINC90LUg0ZQg0YTQsNC60YLQvtGA0L7QvCAo0LfQstC10YDQvdGW0YLRjCDRg9Cy0LDQs9GDINC90LAg0YHQuNC80LLQvtC7ISksINGC0L4g0LLQvtC90LAg0L/QtdGA0LXRgtCy0L7RgNC40YLRjNGB0Y8g0L3QsCDQvdGM0L7Qs9C+LiDQr9C60YnQviDQtiDRhtGPINC30LzRltC90L3QsCDigJMg0YTQsNC60YLQvtGALCDRgtC+INC90LAg0LXQutGA0LDQvSDQstC40LLQvtC00LjRgtGM0YHRjyDQv9C+0LLRltC00L7QvNC70LXQvdC90Y8g0L/RgNC+INGG0LUuDQoNCiMjI2lmZWxzZQ0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCa0L7QvdGB0YLRgNGD0LrRhtGW0Y8gYGlmZWxzZWAg4oCTINC60L7QvNC/0LDQutGC0L3QsCDRliDQstC10LrRgtC+0YDQuNC30L7QstCw0L3QsCDQstC10YDRgdGW0Y8g0LrQvtC90YHRgtGA0YPQutGG0ZbRlyBgaWYtZWxzZWAuINCh0LjQvdGC0LDQutGB0LjRgSDRgtCw0LrQuNC5Og0KDQpgYGB7cn0NCmlmZWxzZShjb25kaXRpb24sIHN0YXRlbWVudDEsIHN0YXRlbWVuZXQyKQ0KYGBgDQoNCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0K0J/QtdGA0YjQsCDQutC+0LzQsNC90LTQsCDQstC40LrQvtC90YPRlNGC0YzRgdGPLCDRj9C60YnQviDRg9C80L7QstCwIGBjb25kaXRpb25gINGW0YHRgtC40L3QvdCwLiDQr9C60YnQviDRg9C80L7QstCwINC/0L7QvNC40LvQutC+0LLQsCwg0LLQuNC60L7QvdGD0ZTRgtGM0YHRjyDQtNGA0YPQs9CwINC60L7QvNCw0L3QtNCwLiDQntGB0Ywg0L/RgNC40LrQu9Cw0LTQuDoNCg0KYGBge3J9DQppZmVsc2Uoc2NvcmUgPiAwLjUsIHByaW50KCLQl9C00LDQsiEiKSwgcHJpbnQoItCf0YDQvtCy0LDQu9C40LLRgdGPISIpKQ0Kb3V0Y29tZSA8LSBpZmVsc2Uoc2NvcmUgPiAwLjUsICLQn9GA0L7QstCw0LvQuNCy0YHRjyEiLCAi0JfQtNCw0LIhIikNCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCS0LjQutC+0YDQuNGB0YLQvtCy0YPQudGC0LUg0YbRjiDQutC+0L3RgdGC0YDRg9C60YbRltGOLCDRj9C60YnQviDQstCw0Lwg0L/QvtGC0YDRltCx0L3QviDRgNC+0LfQtNGW0LvQuNGC0Lgg0LTQsNC90ZYg0L3QsCDQtNCy0ZYg0LrQsNGC0LXQs9C+0YDRltGXINCw0LHQviDQvtC/0LXRgNGD0LLQsNGC0Lgg0LLQtdC60YLQvtGA0LDQvNC4Lg0KDQojIyNzd2l0Y2gNCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A70JrQvtC90YHRgtGA0YPQutGG0ZbRjyBgc3dpdGNoYCDQstC40LHQuNGA0LDRlCDQutC+0LzQsNC90LTQuCDQt9Cw0LvQtdC20L3QviDQstGW0LQg0LfQvdCw0YfQtdC90L3Rjywg0Y/QutC1INC/0YDQuNC50LzQsNGUINCy0LjRgNCw0LcuINCh0LjQvdGC0LDQutGB0LjRgSDRgtCw0LrQuNC5Og0KDQpgYGB7cn0NCnN3aXRjaCAoZXhwcmVzc2lvbiwuLi4pDQpgYGANCg0KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQrQotGA0Lgg0LrRgNCw0L/QutC4INC/0L7Qt9C90LDRh9Cw0Y7RgtGMINC60L7QvNCw0L3QtNC4LCDRidC+INCy0ZbQtNC/0L7QstGW0LTQsNGO0YLRjCDQvNC+0LbQu9C40LLQuNC8INC30L3QsNGH0LXQvdC90Y/QvCBgZXhwcmVzc2lvbmAuINCd0LDQudC70LXQs9GI0LUg0LfRgNC+0LfRg9C80ZbRgtC4INGA0L7QsdC+0YLRgyDQtNCw0L3QvtGXINC60L7QvdGB0YLRgNGD0LrRhtGW0Zcg0L3QsCDQv9GA0LjQutC70LDQtNGWINC90LDQstC10LTQtdC90L7Qs9C+INC90LjQttGH0LUg0L/RgNC+0LPRgNCw0LzQvdC+0LPQviDQutC+0LTRgy4NCg0KYGBge3J9DQpmZWVsaW5ncyA8LSBjKCJzYWRuZXNzIiwgImZlYXIiKQ0KZm9yKGkgaW4gZmVlbGluZ3MpDQogIHByaW50KHN3aXRjaChpLCBoYXBweW5lc3M9IkknbSBnbGFkIHlvdSdyZSBoYXBweSEiLA0KICAgICAgICAgICAgICAgZmVhcj0iVGhlcmUgaXMgbm90aGluZyB0byBmZWFyIGFib3V0ISIsDQogICAgICAgICAgICAgICBzYWRuZXNzPSJDaGVlciB1cCEiLA0KICAgICAgICAgICAgICAgYW5nZXI9IkNhbG0gZG93bi4iKSkNCmBgYA0KDQombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCtCm0LUg0L3QsNC00YPQvNCw0L3QuNC5INC/0YDQuNC60LvQsNC0LCDQv9GA0L7RgtC1INCy0ZbQvSDQtNC10LzQvtC90YHRgtGA0YPRlCDQvtGB0L3QvtCy0L3RliDQv9GA0LjQvdGG0LjQv9C4INC30LDRgdGC0L7RgdGD0LLQsNC90L3RjyDRhtGW0ZTRlyDQutC+0L3RgdGC0YDRg9C60YbRltGXLiDQktC4INC00ZbQt9C90LDRlNGC0LXRgdGPINGP0Log0ZfRlyDQstC40LrQvtGA0LjRgdGC0L7QstGD0LLQsNGC0Lgg0LIg0YHRgtCy0L7RgNC10L3QuNGFINC60L7RgNC40YHRgtGD0LLQsNGH0LXQvCDRhNGD0L3QutGG0ZbRj9GFINC90LAg0L3QsNGB0YLRg9C/0L3RltC5INC70LXQutGG0ZbRly4NCg0KDQoNCg==