Калькулятор выхода полимеризации
Рассчитайте практический выход полимера в процентах от теоретически возможного на основе данных о массе мономера, молярных массах и фактической массе полученного продукта.
—
Теоретическая масса полимера
г
—
Количество вещества мономера
моль
—
Разница (практ. − теор.)
г
Как пользоваться
1
Выберите мономер из списка (опционально) — поля молярной массы заполнятся автоматически. Например, для стирола M = 104,15 г/моль.
2
Введите массу мономера, взятого для реакции (например, 50 г), и практическую массу полученного полимера (например, 42,5 г).
3
Укажите молярную массу мономерного звена. Для аддитивной полимеризации она равна молярной массе мономера. Для конденсационной — может быть меньше за счёт выделения побочных продуктов.
4
Нажмите «Рассчитать». Калькулятор определит теоретическую массу полимера по стехиометрии и вычислит выход в процентах. При выходе более 100% появится предупреждение о возможных примесях.
Примеры использования
Полимеризация стирола в лаборатории
Масса мономера: 50 г. Молярная масса стирола: 104,15 г/моль. Молярная масса звена: 104,15 г/моль. Практическая масса полистирола: 43,2 г.
Результат: теоретическая масса = 50 г, выход = 86,4%. Потери связаны с очисткой и переносом продукта.
Синтез полиметилметакрилата (оргстекло)
Масса мономера: 100 г. Молярная масса метилметакрилата: 100,12 г/моль. Молярная масса звена: 100,12 г/моль. Практическая масса ПММА: 88,7 г.
Результат: теоретическая масса = 100 г, выход = 88,7%. Остаток — непрореагировавший мономер, удалённый при вакуумировании.
Конденсационная полимеризация (условный пример)
Масса мономера: 60 г. Молярная масса мономера: 120 г/моль. При конденсации на каждое звено выделяется вода (18 г/моль), поэтому M звена = 102 г/моль. Практическая масса: 48 г.
Результат: теоретическая масса = 60 × (102 / 120) = 51 г, выход = 48 / 51 × 100% ≈ 94,1%.
Важные нюансы
- Аддитивная vs конденсационная полимеризация. При аддитивной (радикальной, ионной) полимеризации молярная масса звена равна молярной массе мономера — атомы не теряются. При конденсационной — выделяются малые молекулы (вода, HCl, спирт), поэтому M звена строго меньше M мономера. Учитывайте это при вводе данных.
- Выход более 100%. Если практическая масса превышает теоретическую, результат показывается честно, но с предупреждением. Вероятные причины: неполная сушка продукта (остатки растворителя или воды), загрязнения, ошибка взвешивания, либо неверно указанная молярная масса.
- Потери при выделении. Реальный выход всегда ниже 100% из-за потерь при фильтрации, перекристаллизации, сушке, переносе из реактора. Нормальный лабораторный выход для полимеризации — 70–95% в зависимости от метода выделения.
- Степень полимеризации не влияет на выход. Выход полимеризации характеризует долю мономера, превратившегося в полимер, и не зависит от длины цепи. Даже короткие олигомеры учитываются в массе продукта, если они выделены.
- Техника безопасности. Многие мономеры токсичны, огнеопасны и обладают резким запахом. Все работы с мономерами и полимеризацией следует проводить в вытяжном шкафу с использованием СИЗ (перчатки, очки, халат). Остатки мономеров и растворителей утилизируют согласно регламенту лаборатории. Данный калькулятор — инструмент для расчётов, не заменяет знание химической безопасности.
Формулы расчёта
где m — масса (г), M — молярная масса (г/моль), n — количество вещества (моль), η — выход (%). Расчёт основан на стехиометрическом соотношении: одно мономерное звено полимера соответствует одной молекуле исходного мономера.
Источники данных
IUPAC Gold Book — определения терминов «полимеризация», «выход реакции» и «мономерное звено». doi:10.1351/goldbook
NIST Chemistry WebBook — справочные значения молярных масс органических соединений, включая стирол, этилен, метилметакрилат и другие мономеры. webbook.nist.gov
PubChem (NIH) — химические свойства и молекулярные массы мономеров: стирол (CID 7501), этилен (CID 6325), метилметакрилат (CID 6658), винилхлорид (CID 6338) и др. pubchem.ncbi.nlm.nih.gov
CRC Handbook of Chemistry and Physics — табличные данные по физико-химическим свойствам мономеров и полимеров, используемые для верификации расчётных значений.
Калькулятор выхода полимеризации — удобный онлайн-инструмент для химиков-технологов, студентов и исследователей, позволяющий быстро оценить эффективность реакции полимеризации. Расчёт основан на фундаментальных стехиометрических соотношениях и справочных данных IUPAC и NIST. Инструмент учитывает разницу между аддитивной и конденсационной полимеризацией и сигнализирует о возможных ошибках. Используйте калькулятор для лабораторных расчётов, оформления отчётов и планирования синтеза полимеров.
CiAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1vbm9tZXJTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1tb25vbWVyLXNlbGVjdCcpOwogICAgICAgIHZhciBtb25vbWVyTWFzc0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtbW9ub21lci1tYXNzJyk7CiAgICAgICAgdmFyIG1vbGFyTWFzc01vbm9tZXJJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLW1vbGFyLW1hc3MtbW9ub21lcicpOwogICAgICAgIHZhciBtb2xhck1hc3NVbml0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1tb2xhci1tYXNzLXVuaXQnKTsKICAgICAgICB2YXIgcHJhY3RpY2FsTWFzc0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtcHJhY3RpY2FsLW1hc3MnKTsKICAgICAgICB2YXIgY2FsY3VsYXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtY2FsY3VsYXRlLWJ0bicpOwogICAgICAgIHZhciByZXNldEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLXJlc2V0LWJ0bicpOwoKICAgICAgICB2YXIgcmVzdWx0WWllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1yZXN1bHQteWllbGQnKTsKICAgICAgICB2YXIgcmVzdWx0VGhlb3JldGljYWxNYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtcmVzdWx0LXRoZW9yZXRpY2FsLW1hc3MnKTsKICAgICAgICB2YXIgcmVzdWx0TW9ub21lck1vbGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtcmVzdWx0LW1vbm9tZXItbW9sZXMnKTsKICAgICAgICB2YXIgcmVzdWx0TWFzc0RpZmYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1yZXN1bHQtbWFzcy1kaWZmJyk7CiAgICAgICAgdmFyIHJlc3VsdE5vdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1yZXN1bHQtbm90ZScpOwoKICAgICAgICB2YXIgZXJyb3JNb25vbWVyTWFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLWVycm9yLW1vbm9tZXItbWFzcycpOwogICAgICAgIHZhciBlcnJvck1vbGFyTWFzc01vbm9tZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm4tZ2VuLWNhbC1lcnJvci1tb2xhci1tYXNzLW1vbm9tZXInKTsKICAgICAgICB2YXIgZXJyb3JNb2xhck1hc3NVbml0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25uLWdlbi1jYWwtZXJyb3ItbW9sYXItbWFzcy11bml0Jyk7CiAgICAgICAgdmFyIGVycm9yUHJhY3RpY2FsTWFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdubi1nZW4tY2FsLWVycm9yLXByYWN0aWNhbC1tYXNzJyk7CgogICAgICAgIHZhciBtb25vbWVyRGF0YSA9IHsKICAgICAgICAgICAgJ3N0eXJlbmUnOiB7IG5hbWU6ICfQodGC0LjRgNC+0LsnLCBtb2xhck1hc3M6IDEwNC4xNSB9LAogICAgICAgICAgICAnZXRoeWxlbmUnOiB7IG5hbWU6ICfQrdGC0LjQu9C10L0nLCBtb2xhck1hc3M6IDI4LjA1IH0sCiAgICAgICAgICAgICdtZXRoeWwtbWV0aGFjcnlsYXRlJzogeyBuYW1lOiAn0JzQtdGC0LjQu9C80LXRgtCw0LrRgNC40LvQsNGCJywgbW9sYXJNYXNzOiAxMDAuMTIgfSwKICAgICAgICAgICAgJ3ZpbnlsLWNobG9yaWRlJzogeyBuYW1lOiAn0JLQuNC90LjQu9GF0LvQvtGA0LjQtCcsIG1vbGFyTWFzczogNjIuNTAgfSwKICAgICAgICAgICAgJ2Fjcnlsb25pdHJpbGUnOiB7IG5hbWU6ICfQkNC60YDQuNC70L7QvdC40YLRgNC40LsnLCBtb2xhck1hc3M6IDUzLjA2IH0sCiAgICAgICAgICAgICd2aW55bC1hY2V0YXRlJzogeyBuYW1lOiAn0JLQuNC90LjQu9Cw0YbQtdGC0LDRgicsIG1vbGFyTWFzczogODYuMDkgfSwKICAgICAgICAgICAgJ3RldHJhZmx1b3JvZXRoeWxlbmUnOiB7IG5hbWU6ICfQotC10YLRgNCw0YTRgtC+0YDRjdGC0LjQu9C10L0nLCBtb2xhck1hc3M6IDEwMC4wMiB9LAogICAgICAgICAgICAnaXNvcHJlbmUnOiB7IG5hbWU6ICfQmNC30L7Qv9GA0LXQvScsIG1vbGFyTWFzczogNjguMTIgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNsZWFyRXJyb3JzKCkgewogICAgICAgICAgICBlcnJvck1vbm9tZXJNYXNzLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIGVycm9yTW9sYXJNYXNzTW9ub21lci50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICBlcnJvck1vbGFyTWFzc1VuaXQudGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgZXJyb3JQcmFjdGljYWxNYXNzLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIGlmIChyZXN1bHROb3RlKSB7CiAgICAgICAgICAgICAgICByZXN1bHROb3RlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICByZXN1bHROb3RlLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlc2V0UmVzdWx0cygpIHsKICAgICAgICAgICAgcmVzdWx0WWllbGQudGV4dENvbnRlbnQgPSAn4oCUJzsKICAgICAgICAgICAgcmVzdWx0VGhlb3JldGljYWxNYXNzLnRleHRDb250ZW50ID0gJ+KAlCc7CiAgICAgICAgICAgIHJlc3VsdE1vbm9tZXJNb2xlcy50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICByZXN1bHRNYXNzRGlmZi50ZXh0Q29udGVudCA9ICfigJQnOwogICAgICAgICAgICBpZiAocmVzdWx0Tm90ZSkgewogICAgICAgICAgICAgICAgcmVzdWx0Tm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgcmVzdWx0Tm90ZS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBmb3JtYXROdW1iZXIodmFsdWUsIGRlY2ltYWxzKSB7CiAgICAgICAgICAgIGlmIChkZWNpbWFscyA9PT0gdW5kZWZpbmVkKSBkZWNpbWFscyA9IDI7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFpc0Zpbml0ZSh2YWx1ZSkpIHJldHVybiAn4oCUJzsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlKSA8IDFlLTEwICYmIHZhbHVlICE9PSAwKSByZXR1cm4gJzAuMDAnOwogICAgICAgICAgICBpZiAoTWF0aC5hYnModmFsdWUpID49IDFlNikgcmV0dXJuIHZhbHVlLnRvRXhwb25lbnRpYWwoZGVjaW1hbHMpOwogICAgICAgICAgICBpZiAoTWF0aC5hYnModmFsdWUpIDwgMC4wMSAmJiB2YWx1ZSAhPT0gMCkgcmV0dXJuIHZhbHVlLnRvRXhwb25lbnRpYWwoZGVjaW1hbHMpOwogICAgICAgICAgICByZXR1cm4gdmFsdWUudG9GaXhlZChkZWNpbWFscyk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0cygpIHsKICAgICAgICAgICAgdmFyIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIG1vbm9tZXJNYXNzID0gcGFyc2VGbG9hdChtb25vbWVyTWFzc0lucHV0LnZhbHVlKTsKICAgICAgICAgICAgdmFyIG1vbGFyTWFzc00gPSBwYXJzZUZsb2F0KG1vbGFyTWFzc01vbm9tZXJJbnB1dC52YWx1ZSk7CiAgICAgICAgICAgIHZhciBtb2xhck1hc3NVID0gcGFyc2VGbG9hdChtb2xhck1hc3NVbml0SW5wdXQudmFsdWUpOwogICAgICAgICAgICB2YXIgcHJhY3RpY2FsTWFzcyA9IHBhcnNlRmxvYXQocHJhY3RpY2FsTWFzc0lucHV0LnZhbHVlKTsKCiAgICAgICAgICAgIGlmIChpc05hTihtb25vbWVyTWFzcykgfHwgbW9ub21lck1hc3NJbnB1dC52YWx1ZS50cmltKCkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICBlcnJvck1vbm9tZXJNYXNzLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INC80LDRgdGB0YMg0LzQvtC90L7QvNC10YDQsC4nOwogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChtb25vbWVyTWFzcyA8PSAwKSB7CiAgICAgICAgICAgICAgICBlcnJvck1vbm9tZXJNYXNzLnRleHRDb250ZW50ID0gJ9Cc0LDRgdGB0LAg0LzQvtC90L7QvNC10YDQsCDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LkuJzsKICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc05hTihtb2xhck1hc3NNKSB8fCBtb2xhck1hc3NNb25vbWVySW5wdXQudmFsdWUudHJpbSgpID09PSAnJykgewogICAgICAgICAgICAgICAgZXJyb3JNb2xhck1hc3NNb25vbWVyLnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INC80L7Qu9GP0YDQvdGD0Y4g0LzQsNGB0YHRgyDQvNC+0L3QvtC80LXRgNCwLic7CiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1vbGFyTWFzc00gPD0gMCkgewogICAgICAgICAgICAgICAgZXJyb3JNb2xhck1hc3NNb25vbWVyLnRleHRDb250ZW50ID0gJ9Cc0L7Qu9GP0YDQvdCw0Y8g0LzQsNGB0YHQsCDQtNC+0LvQttC90LAg0LHRi9GC0Ywg0L/QvtC70L7QttC40YLQtdC70YzQvdC+0LkuJzsKICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc05hTihtb2xhck1hc3NVKSB8fCBtb2xhck1hc3NVbml0SW5wdXQudmFsdWUudHJpbSgpID09PSAnJykgewogICAgICAgICAgICAgICAgZXJyb3JNb2xhck1hc3NVbml0LnRleHRDb250ZW50ID0gJ9CS0LLQtdC00LjRgtC1INC80L7Qu9GP0YDQvdGD0Y4g0LzQsNGB0YHRgyDQt9Cy0LXQvdCwLic7CiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1vbGFyTWFzc1UgPD0gMCkgewogICAgICAgICAgICAgICAgZXJyb3JNb2xhck1hc3NVbml0LnRleHRDb250ZW50ID0gJ9Cc0L7Qu9GP0YDQvdCw0Y8g0LzQsNGB0YHQsCDQt9Cy0LXQvdCwINC00L7Qu9C20L3QsCDQsdGL0YLRjCDQv9C+0LvQvtC20LjRgtC10LvRjNC90L7QuS4nOwogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGlzTmFOKHByYWN0aWNhbE1hc3MpIHx8IHByYWN0aWNhbE1hc3NJbnB1dC52YWx1ZS50cmltKCkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICBlcnJvclByYWN0aWNhbE1hc3MudGV4dENvbnRlbnQgPSAn0JLQstC10LTQuNGC0LUg0L/RgNCw0LrRgtC40YfQtdGB0LrRg9GOINC80LDRgdGB0YMg0L/QvtC70LjQvNC10YDQsC4nOwogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChwcmFjdGljYWxNYXNzIDwgMCkgewogICAgICAgICAgICAgICAgZXJyb3JQcmFjdGljYWxNYXNzLnRleHRDb250ZW50ID0gJ9Cc0LDRgdGB0LAg0L3QtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC5Lic7CiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7CiAgICAgICAgICAgIGNsZWFyRXJyb3JzKCk7CiAgICAgICAgICAgIGlmICghdmFsaWRhdGVJbnB1dHMoKSkgewogICAgICAgICAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBtb25vbWVyTWFzcyA9IHBhcnNlRmxvYXQobW9ub21lck1hc3NJbnB1dC52YWx1ZSk7CiAgICAgICAgICAgIHZhciBtb2xhck1hc3NNID0gcGFyc2VGbG9hdChtb2xhck1hc3NNb25vbWVySW5wdXQudmFsdWUpOwogICAgICAgICAgICB2YXIgbW9sYXJNYXNzVSA9IHBhcnNlRmxvYXQobW9sYXJNYXNzVW5pdElucHV0LnZhbHVlKTsKICAgICAgICAgICAgdmFyIHByYWN0aWNhbE1hc3MgPSBwYXJzZUZsb2F0KHByYWN0aWNhbE1hc3NJbnB1dC52YWx1ZSk7CgogICAgICAgICAgICB2YXIgbW9ub21lck1vbGVzID0gbW9ub21lck1hc3MgLyBtb2xhck1hc3NNOwogICAgICAgICAgICB2YXIgdGhlb3JldGljYWxNYXNzID0gbW9ub21lck1vbGVzICogbW9sYXJNYXNzVTsKICAgICAgICAgICAgdmFyIHlpZWxkUGVyY2VudCA9IChwcmFjdGljYWxNYXNzIC8gdGhlb3JldGljYWxNYXNzKSAqIDEwMDsKICAgICAgICAgICAgdmFyIG1hc3NEaWZmID0gcHJhY3RpY2FsTWFzcyAtIHRoZW9yZXRpY2FsTWFzczsKCiAgICAgICAgICAgIHJlc3VsdE1vbm9tZXJNb2xlcy50ZXh0Q29udGVudCA9IGZvcm1hdE51bWJlcihtb25vbWVyTW9sZXMsIDQpOwogICAgICAgICAgICByZXN1bHRUaGVvcmV0aWNhbE1hc3MudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIodGhlb3JldGljYWxNYXNzLCAyKTsKICAgICAgICAgICAgcmVzdWx0WWllbGQudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIoeWllbGRQZXJjZW50LCAyKTsKICAgICAgICAgICAgcmVzdWx0TWFzc0RpZmYudGV4dENvbnRlbnQgPSBmb3JtYXROdW1iZXIobWFzc0RpZmYsIDIpOwoKICAgICAgICAgICAgaWYgKHJlc3VsdE5vdGUpIHsKICAgICAgICAgICAgICAgIGlmICh5aWVsZFBlcmNlbnQgPiAxMDAuNSkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vdGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm90ZS50ZXh0Q29udGVudCA9ICfimqDvuI8g0JLRi9GF0L7QtCDQv9GA0LXQstGL0YjQsNC10YIgMTAwJSAoJyArIGZvcm1hdE51bWJlcih5aWVsZFBlcmNlbnQsIDIpICsgJyUpLiDQktC10YDQvtGP0YLQvdGL0LUg0L/RgNC40YfQuNC90Ys6INC90LXQv9C+0LvQvdCw0Y8g0YHRg9GI0LrQsCDQv9GA0L7QtNGD0LrRgtCwLCDQvdCw0LvQuNGH0LjQtSDQv9GA0LjQvNC10YHQtdC5INC40LvQuCDRgNCw0YHRgtCy0L7RgNC40YLQtdC70Y8sINC+0YjQuNCx0LrQsCDQstC30LLQtdGI0LjQstCw0L3QuNGPLCDQvdC10LLQtdGA0L3QsNGPINC80L7Qu9GP0YDQvdCw0Y8g0LzQsNGB0YHQsCDQt9Cy0LXQvdCwLiDQn9GA0L7QstC10YDRjNGC0LUg0LjRgdGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUuJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeWllbGRQZXJjZW50ID4gMTAwICYmIHlpZWxkUGVyY2VudCA8PSAxMDAuNSkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vdGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm90ZS50ZXh0Q29udGVudCA9ICfimqDvuI8g0JLRi9GF0L7QtCDQvdC10LfQvdCw0YfQuNGC0LXQu9GM0L3QviDQv9GA0LXQstGL0YjQsNC10YIgMTAwJSAoJyArIGZvcm1hdE51bWJlcih5aWVsZFBlcmNlbnQsIDIpICsgJyUpLiDQktC+0LfQvNC+0LbQvdC+LCDQv9GA0L7QtNGD0LrRgiDRgdC+0LTQtdGA0LbQuNGCINC+0YHRgtCw0YLQvtGH0L3Rg9GOINCy0LvQsNCz0YMg0LjQu9C4INC/0L7Qs9GA0LXRiNC90L7RgdGC0Ywg0L7QutGA0YPQs9C70LXQvdC40Y8uJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJhY3RpY2FsTWFzcyA9PT0gMCAmJiB0aGVvcmV0aWNhbE1hc3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm90ZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgICAgICAgICAgICAgICAgICByZXN1bHROb3RlLnRleHRDb250ZW50ID0gJ+KEue+4jyDQn9GA0LDQutGC0LjRh9C10YHQutCw0Y8g0LzQsNGB0YHQsCDRgNCw0LLQvdCwINC90YPQu9GOLiDQldGB0LvQuCDRgNC10LDQutGG0LjRjyDQv9GA0L7QstC+0LTQuNC70LDRgdGMLCDQv9GA0L7QstC10YDRjNGC0LUg0LrQvtGA0YDQtdC60YLQvdC+0YHRgtGMINCy0LfQstC10YjQuNCy0LDQvdC40Y8uJzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0Tm90ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZXNldEZvcm0oKSB7CiAgICAgICAgICAgIG1vbm9tZXJTZWxlY3QudmFsdWUgPSAnJzsKICAgICAgICAgICAgbW9ub21lck1hc3NJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICBtb2xhck1hc3NNb25vbWVySW5wdXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgbW9sYXJNYXNzVW5pdElucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgIHByYWN0aWNhbE1hc3NJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICBjbGVhckVycm9ycygpOwogICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICB9CgogICAgICAgIG1vbm9tZXJTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IG1vbm9tZXJTZWxlY3QudmFsdWU7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiBtb25vbWVyRGF0YVtzZWxlY3RlZF0pIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gbW9ub21lckRhdGFbc2VsZWN0ZWRdOwogICAgICAgICAgICAgICAgbW9sYXJNYXNzTW9ub21lcklucHV0LnZhbHVlID0gZGF0YS5tb2xhck1hc3M7CiAgICAgICAgICAgICAgICBtb2xhck1hc3NVbml0SW5wdXQudmFsdWUgPSBkYXRhLm1vbGFyTWFzczsKICAgICAgICAgICAgICAgIGNsZWFyRXJyb3JzKCk7CiAgICAgICAgICAgICAgICByZXNldFJlc3VsdHMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIG1vbGFyTWFzc01vbm9tZXJJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgbW9sYXJNYXNzVW5pdElucHV0LnZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBjbGVhckVycm9ycygpOwogICAgICAgICAgICAgICAgcmVzZXRSZXN1bHRzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgY2FsY3VsYXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICAgIH0pOwoKICAgICAgICByZXNldEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXNldEZvcm0oKTsKICAgICAgICB9KTsKCiAgICAgICAgdmFyIGlucHV0RmllbGRzID0gW21vbm9tZXJNYXNzSW5wdXQsIG1vbGFyTWFzc01vbm9tZXJJbnB1dCwgbW9sYXJNYXNzVW5pdElucHV0LCBwcmFjdGljYWxNYXNzSW5wdXRdOwogICAgICAgIGlucHV0RmllbGRzLmZvckVhY2goZnVuY3Rpb24oZmllbGQpIHsKICAgICAgICAgICAgZmllbGQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGNsZWFyRXJyb3JzKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmaWVsZC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgbW9ub21lclNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGNhbGN1bGF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KSgpOwo=