Калькулятор выпадения осадка
Определите, образуется ли осадок при смешивании двух растворов, по произведению концентраций ионов и справочному значению произведения растворимости (Ksp).
—
Ионное произведение (IP)
(моль/л)a+b
—
Произведение растворимости (Ksp)
—
Ожидаемая масса осадка (на 1 л раствора)
г
Как пользоваться
1
Введите молярную концентрацию катиона (ион A) в конечном растворе после смешивания. Например, [Ag+] = 0.01 моль/л.
2
Укажите концентрацию аниона (ион B), с которым катион может образовать малорастворимое соединение. Например, [Cl−] = 0.005 моль/л.
3
Задайте значение Ksp для предполагаемого осадка. Для AgCl Ksp ≈ 1.8 × 10−10. При необходимости скорректируйте стехиометрические коэффициенты a и b (для AgCl оба равны 1).
4
Нажмите «Рассчитать». Если ионное произведение IP > Ksp, осадок выпадает. Если IP ≤ Ksp, раствор остаётся прозрачным.
Примеры использования
Смешивание нитрата серебра и хлорида натрия
После сливания равных объёмов 0.02 М AgNO3 и 0.02 М NaCl концентрации ионов в смеси станут 0.01 М. Ksp(AgCl) = 1.8×10−10. IP = 0.01 × 0.01 = 1×10−4 > Ksp, осадок хлорида серебра выпадает.
Растворение гипса в жесткой воде
Концентрация Ca2+ = 0.005 М, SO42− = 0.002 М. Ksp(CaSO4) = 2.4×10−5. IP = 0.005 × 0.002 = 1×10−5, что меньше Ksp — осадок не образуется, вода остается прозрачной.
Очистка воды от фосфатов
Добавление Ca(OH)2 к сточной воде с [PO43−] = 1×10−4 М. Кальций дозируют до 0.002 М. Для Ca3(PO4)2 a=3, b=2, Ksp = 2.0×10−29. IP = (0.002)3 × (1×10−4)2 = 8×10−13 > Ksp, осадок выпадет, удаляя фосфаты.
Важные нюансы
- Концентрации ионов должны быть указаны для конечного объёма после смешивания растворов. Если смешиваются равные объёмы двух растворов, исходные концентрации уменьшаются вдвое.
- Значения Ksp сильно зависят от температуры. Стандартные справочные данные приведены для 25 °C. При значительном нагреве или охлаждении раствора Ksp может измениться на порядок.
- Калькулятор не учитывает ионную силу раствора и коэффициенты активности. В концентрированных солевых растворах реальная растворимость может отличаться от термодинамического прогноза.
- При очень малых значениях IP (менее 10−30) численные расчёты могут страдать от ошибок округления. Используйте научную нотацию для ввода таких чисел (например, 1e-35).
- Техника безопасности: при работе с концентрированными растворами, особенно содержащими токсичные катионы (Pb2+, Hg2+, Ba2+) или едкие анионы, используйте защитные очки, перчатки и вытяжную вентиляцию. Осадки могут быть токсичны — утилизируйте их согласно регламенту.
Формулы расчёта
Стехиометрические коэффициенты a и b соответствуют формуле осадка AaBb. Для бинарного электролита (например, AgCl) a = 1, b = 1. Для сульфата бария (BaSO4) также 1 и 1. Для фосфата кальция Ca3(PO4)2 a = 3, b = 2.
Масса осадка оценивается приближённо, исходя из предположения, что весь избыток ионов переходит в твёрдую фазу, и пренебрегая остаточной растворимостью. Для точного расчёта равновесных концентраций требуется решать уравнение с учётом Ksp.
Источники данных
- IUPAC Gold Book — определения произведения растворимости, стандартные термодинамические конвенции: https://goldbook.iupac.org
- NIST Chemistry WebBook — термодинамические данные для многих неорганических соединений: https://webbook.nist.gov/chemistry/
- CRC Handbook of Chemistry and Physics — справочные значения Ksp для сотен малорастворимых солей и гидроксидов (99-е издание, 2018).
- Общая и неорганическая химия: учебное пособие (Н.С. Ахметов, 2019) — методика расчёта условий выпадения осадков и влияние ионной силы.
Онлайн-калькулятор выпадения осадка позволяет быстро оценить, образуется ли твёрдая фаза при смешивании растворов электролитов. Инструмент сравнивает ионное произведение (IP) с произведением растворимости (Ksp) и выносит однозначный вердикт. Расчёт основан на классических термодинамических принципах и справочных данных IUPAC, NIST и CRC Handbook. Сервис будет полезен студентам химических специальностей, лаборантам, инженерам-химикам и всем, кто работает с процессами осаждения.
CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc3QgaW9uQUNvbmNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpb24tYS1jb25jJyk7CiAgICAgICAgY29uc3QgaW9uQkNvbmNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpb24tYi1jb25jJyk7CiAgICAgICAgY29uc3Qga3NwSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna3NwLXZhbHVlJyk7CiAgICAgICAgY29uc3Qgc3RvaWNoQUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b2ljaGlvbWV0cnktYScpOwogICAgICAgIGNvbnN0IHN0b2ljaEJJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9pY2hpb21ldHJ5LWInKTsKICAgICAgICBjb25zdCBjYWxjQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGN1bGF0ZS1idG4nKTsKICAgICAgICBjb25zdCByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXNldC1idG4nKTsKICAgICAgICBjb25zdCBnZW5lcmFsRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VuZXJhbC1lcnJvcicpOwoKICAgICAgICBjb25zdCByZXN1bHRJb25Qcm9kdWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC1pb24tcHJvZHVjdCcpOwogICAgICAgIGNvbnN0IHJlc3VsdEtzcERpc3BsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LWtzcC1kaXNwbGF5Jyk7CiAgICAgICAgY29uc3QgcmVzdWx0VmVyZGljdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHQtdmVyZGljdCcpOwogICAgICAgIGNvbnN0IHJlc3VsdE1hc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0LW1hc3MnKTsKICAgICAgICBjb25zdCBwcmVjaXBpdGF0ZU1hc3NTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZWNpcGl0YXRlLW1hc3Mtc2VjdGlvbicpOwogICAgICAgIGNvbnN0IHJlc3VsdFZlcmRpY3RJdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdC12ZXJkaWN0LWl0ZW0nKTsKCiAgICAgICAgZnVuY3Rpb24gY2xlYXJFcnJvcihpbnB1dEVsZW1lbnQsIGVycm9yRWxlbWVudCkgewogICAgICAgICAgICBpZiAoZXJyb3JFbGVtZW50KSBlcnJvckVsZW1lbnQudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCkgaW5wdXRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lucHV0LWVycm9yJyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBzZXRFcnJvcihpbnB1dEVsZW1lbnQsIGVycm9yRWxlbWVudCwgbWVzc2FnZSkgewogICAgICAgICAgICBpZiAoZXJyb3JFbGVtZW50KSBlcnJvckVsZW1lbnQudGV4dENvbnRlbnQgPSBtZXNzYWdlOwogICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50KSBpbnB1dEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaW5wdXQtZXJyb3InKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGNsZWFyQWxsRXJyb3JzKCkgewogICAgICAgICAgICBjb25zdCBlcnJvclNwYW5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5uLWdlbi1jYWwtZXJyb3ItbXNnJyk7CiAgICAgICAgICAgIGVycm9yU3BhbnMuZm9yRWFjaChzcGFuID0+IHsgaWYgKHNwYW4pIHNwYW4udGV4dENvbnRlbnQgPSAnJzsgfSk7CiAgICAgICAgICAgIGNvbnN0IGlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ubi1nZW4tY2FsLWZpZWxkJyk7CiAgICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGlucCA9PiB7IGlmIChpbnApIGlucC5jbGFzc0xpc3QucmVtb3ZlKCdpbnB1dC1lcnJvcicpOyB9KTsKICAgICAgICAgICAgaWYgKGdlbmVyYWxFcnJvcikgZ2VuZXJhbEVycm9yLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cygpIHsKICAgICAgICAgICAgY2xlYXJBbGxFcnJvcnMoKTsKICAgICAgICAgICAgY29uc3QgaW9uQSA9IHBhcnNlRmxvYXQoaW9uQUNvbmNJbnB1dC52YWx1ZSk7CiAgICAgICAgICAgIGNvbnN0IGlvbkIgPSBwYXJzZUZsb2F0KGlvbkJDb25jSW5wdXQudmFsdWUpOwogICAgICAgICAgICBjb25zdCBrc3AgPSBwYXJzZUZsb2F0KGtzcElucHV0LnZhbHVlKTsKICAgICAgICAgICAgY29uc3QgYVZhbCA9IHBhcnNlRmxvYXQoc3RvaWNoQUlucHV0LnZhbHVlKTsKICAgICAgICAgICAgY29uc3QgYlZhbCA9IHBhcnNlRmxvYXQoc3RvaWNoQklucHV0LnZhbHVlKTsKICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSB0cnVlOwoKICAgICAgICAgICAgaWYgKGlzTmFOKGlvbkEpIHx8IGlvbkEgPCAwKSB7CiAgICAgICAgICAgICAgICBzZXRFcnJvcihpb25BQ29uY0lucHV0LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItaW9uLWEtY29uYycpLCAn0JLQstC10LTQuNGC0LUg0L3QtdC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4uJyk7CiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzTmFOKGlvbkIpIHx8IGlvbkIgPCAwKSB7CiAgICAgICAgICAgICAgICBzZXRFcnJvcihpb25CQ29uY0lucHV0LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItaW9uLWItY29uYycpLCAn0JLQstC10LTQuNGC0LUg0L3QtdC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4uJyk7CiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzTmFOKGtzcCkgfHwga3NwIDw9IDApIHsKICAgICAgICAgICAgICAgIHNldEVycm9yKGtzcElucHV0LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3Ita3NwLXZhbHVlJyksICdLc3Ag0LTQvtC70LbQvdC+INCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8INGH0LjRgdC70L7QvC4nKTsKICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNOYU4oYVZhbCkgfHwgYVZhbCA8PSAwKSB7CiAgICAgICAgICAgICAgICBzZXRFcnJvcihzdG9pY2hBSW5wdXQsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1zdG9pY2hpb21ldHJ5LWEnKSwgJ9Ca0L7RjdGE0YTQuNGG0LjQtdC90YIg0LTQvtC70LbQtdC9INCx0YvRgtGMINC/0L7Qu9C+0LbQuNGC0LXQu9GM0L3Ri9C8LicpOwogICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc05hTihiVmFsKSB8fCBiVmFsIDw9IDApIHsKICAgICAgICAgICAgICAgIHNldEVycm9yKHN0b2ljaEJJbnB1dCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLXN0b2ljaGlvbWV0cnktYicpLCAn0JrQvtGN0YTRhNC40YbQuNC10L3RgiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdGL0LwuJyk7CiAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQ7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgICAgICAgIGlmICghdmFsaWRhdGVJbnB1dHMoKSkgewogICAgICAgICAgICAgICAgcmVzZXRSZXN1bHQoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgaW9uQSA9IHBhcnNlRmxvYXQoaW9uQUNvbmNJbnB1dC52YWx1ZSk7CiAgICAgICAgICAgIGNvbnN0IGlvbkIgPSBwYXJzZUZsb2F0KGlvbkJDb25jSW5wdXQudmFsdWUpOwogICAgICAgICAgICBjb25zdCBrc3AgPSBwYXJzZUZsb2F0KGtzcElucHV0LnZhbHVlKTsKICAgICAgICAgICAgY29uc3QgYSA9IHBhcnNlRmxvYXQoc3RvaWNoQUlucHV0LnZhbHVlKTsKICAgICAgICAgICAgY29uc3QgYiA9IHBhcnNlRmxvYXQoc3RvaWNoQklucHV0LnZhbHVlKTsKCiAgICAgICAgICAgIGNvbnN0IGlwID0gTWF0aC5wb3coaW9uQSwgYSkgKiBNYXRoLnBvdyhpb25CLCBiKTsKCiAgICAgICAgICAgIGlmICghaXNGaW5pdGUoaXApIHx8IGlwID09PSBJbmZpbml0eSB8fCBpc05hTihpcCkpIHsKICAgICAgICAgICAgICAgIGlmIChnZW5lcmFsRXJyb3IpIGdlbmVyYWxFcnJvci50ZXh0Q29udGVudCA9ICfQntGI0LjQsdC60LAg0LLRi9GH0LjRgdC70LXQvdC40Y86INGB0LvQuNGI0LrQvtC8INCx0L7Qu9GM0YjQuNC1INC40LvQuCDQvNCw0LvQtdC90YzQutC40LUg0YfQuNGB0LvQsC4nOwogICAgICAgICAgICAgICAgcmVzZXRSZXN1bHQoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgaXBGb3JtYXR0ZWQgPSBmb3JtYXRFeHBvbmVudGlhbChpcCk7CiAgICAgICAgICAgIGNvbnN0IGtzcEZvcm1hdHRlZCA9IGZvcm1hdEV4cG9uZW50aWFsKGtzcCk7CgogICAgICAgICAgICByZXN1bHRJb25Qcm9kdWN0LnRleHRDb250ZW50ID0gaXBGb3JtYXR0ZWQ7CiAgICAgICAgICAgIHJlc3VsdEtzcERpc3BsYXkudGV4dENvbnRlbnQgPSBrc3BGb3JtYXR0ZWQ7CgogICAgICAgICAgICBjb25zdCBwcmVjaXBpdGF0ZXMgPSBpcCA+IGtzcDsKCiAgICAgICAgICAgIGlmIChwcmVjaXBpdGF0ZXMpIHsKICAgICAgICAgICAgICAgIHJlc3VsdFZlcmRpY3QudGV4dENvbnRlbnQgPSAn0J7RgdCw0LTQvtC6INCy0YvQv9Cw0LTQsNC10YInOwogICAgICAgICAgICAgICAgcmVzdWx0VmVyZGljdEl0ZW0uY2xhc3NMaXN0LmFkZCgncmVzdWx0LXBvc2l0aXZlJyk7CiAgICAgICAgICAgICAgICByZXN1bHRWZXJkaWN0SXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdyZXN1bHQtbmVnYXRpdmUnKTsKICAgICAgICAgICAgICAgIHByZWNpcGl0YXRlTWFzc1NlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CgogICAgICAgICAgICAgICAgY29uc3QgbW9sQSA9IGlvbkE7CiAgICAgICAgICAgICAgICBjb25zdCBtb2xCID0gaW9uQjsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbWl0aW5nTW9sZXMgPSBNYXRoLm1pbihtb2xBIC8gYSwgbW9sQiAvIGIpOwogICAgICAgICAgICAgICAgY29uc3QgbW9sYXJNYXNzRXN0aW1hdGUgPSBlc3RpbWF0ZU1vbGFyTWFzcyhpb25BLCBpb25CLCBhLCBiKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hc3MgPSBsaW1pdGluZ01vbGVzICogbW9sYXJNYXNzRXN0aW1hdGU7CiAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUobWFzcykgJiYgbWFzcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRNYXNzLnRleHRDb250ZW50ID0gbWFzcy50b0ZpeGVkKDQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRNYXNzLnRleHRDb250ZW50ID0gJ34wJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3VsdFZlcmRpY3QudGV4dENvbnRlbnQgPSAn0J7RgdCw0LTQvtC6INC90LUg0LLRi9C/0LDQtNCw0LXRgic7CiAgICAgICAgICAgICAgICByZXN1bHRWZXJkaWN0SXRlbS5jbGFzc0xpc3QuYWRkKCdyZXN1bHQtbmVnYXRpdmUnKTsKICAgICAgICAgICAgICAgIHJlc3VsdFZlcmRpY3RJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3Jlc3VsdC1wb3NpdGl2ZScpOwogICAgICAgICAgICAgICAgcHJlY2lwaXRhdGVNYXNzU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChnZW5lcmFsRXJyb3IpIGdlbmVyYWxFcnJvci50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZm9ybWF0RXhwb25lbnRpYWwodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gJzAnOwogICAgICAgICAgICBpZiAodmFsdWUgPj0gMWUtNSAmJiB2YWx1ZSA8PSAxZTUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1ByZWNpc2lvbig1KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdmFsdWUudG9FeHBvbmVudGlhbCgzKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGVzdGltYXRlTW9sYXJNYXNzKGNvbmNBLCBjb25jQiwgYUNvZWZmLCBiQ29lZmYpIHsKICAgICAgICAgICAgY29uc3QgdHlwaWNhbE1hc3NlcyA9IHsKICAgICAgICAgICAgICAgICdBZ0NsJzogMTQzLjMyLAogICAgICAgICAgICAgICAgJ0JhU080JzogMjMzLjM5LAogICAgICAgICAgICAgICAgJ0NhU080JzogMTM2LjE0LAogICAgICAgICAgICAgICAgJ0NhMyhQTzQpMic6IDMxMC4xOCwKICAgICAgICAgICAgICAgICdQYkkyJzogNDYxLjAxLAogICAgICAgICAgICAgICAgJ0ZlKE9IKTMnOiAxMDYuODcsCiAgICAgICAgICAgICAgICAnQWwoT0gpMyc6IDc4LjAwLAogICAgICAgICAgICAgICAgJ01nKE9IKTInOiA1OC4zMgogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoYUNvZWZmID09PSAxICYmIGJDb2VmZiA9PT0gMSkgewogICAgICAgICAgICAgICAgaWYgKGNvbmNBID4gMC4wMSAmJiBjb25jQiA+IDAuMDEpIHJldHVybiAxNDA7CiAgICAgICAgICAgICAgICByZXR1cm4gMTgwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhQ29lZmYgPT09IDMgJiYgYkNvZWZmID09PSAyKSByZXR1cm4gMzEwOwogICAgICAgICAgICBpZiAoYUNvZWZmID09PSAxICYmIGJDb2VmZiA9PT0gMikgcmV0dXJuIDkwOwogICAgICAgICAgICBpZiAoYUNvZWZmID09PSAyICYmIGJDb2VmZiA9PT0gMykgcmV0dXJuIDI1MDsKICAgICAgICAgICAgcmV0dXJuIDIwMDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlc2V0UmVzdWx0KCkgewogICAgICAgICAgICByZXN1bHRJb25Qcm9kdWN0LnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHJlc3VsdEtzcERpc3BsYXkudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzdWx0VmVyZGljdC50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICByZXN1bHRWZXJkaWN0SXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdyZXN1bHQtcG9zaXRpdmUnLCAncmVzdWx0LW5lZ2F0aXZlJyk7CiAgICAgICAgICAgIHByZWNpcGl0YXRlTWFzc1NlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgcmVzdWx0TWFzcy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7CiAgICAgICAgICAgIGlvbkFDb25jSW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgaW9uQkNvbmNJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICBrc3BJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICBzdG9pY2hBSW5wdXQudmFsdWUgPSAnMSc7CiAgICAgICAgICAgIHN0b2ljaEJJbnB1dC52YWx1ZSA9ICcxJzsKICAgICAgICAgICAgY2xlYXJBbGxFcnJvcnMoKTsKICAgICAgICAgICAgcmVzZXRSZXN1bHQoKTsKICAgICAgICB9CgogICAgICAgIGNhbGNCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxjdWxhdGUpOwogICAgICAgIHJlc2V0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRBbGwpOwoKICAgICAgICBjb25zdCBhbGxJbnB1dHMgPSBbaW9uQUNvbmNJbnB1dCwgaW9uQkNvbmNJbnB1dCwga3NwSW5wdXQsIHN0b2ljaEFJbnB1dCwgc3RvaWNoQklucHV0XTsKICAgICAgICBhbGxJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7CiAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcklkID0gJ2Vycm9yLScgKyBpbnB1dC5pZDsKICAgICAgICAgICAgICAgIGNvbnN0IGVyclNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlcnJvcklkKTsKICAgICAgICAgICAgICAgIGlmIChlcnJTcGFuKSBlcnJTcGFuLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgICBpbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdpbnB1dC1lcnJvcicpOwogICAgICAgICAgICAgICAgaWYgKGdlbmVyYWxFcnJvcikgZ2VuZXJhbEVycm9yLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXNldEFsbCgpOwogICAgICAgIH0pOwogICAgfSkoKTsK