Want to know more about our gum disease treatments? Or why maintaining healthy gums is so important? Download our FREE guide here!
Your Guide to Gum Disease

PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgovKiA8IVtDREFUQVsgKi8KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLy0tLS0tLSBKQVZBU0NSSVBUIEhPT0sgRlVOQ1RJT05TIEZPUiBHUkFWSVRZIEZPUk1TIC0tLS0tLS0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiAoICEgZ2Zvcm0gKSB7Cglkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5zY3JpcHRzTG9hZGVkID0gdHJ1ZTsgfSApOwoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgZnVuY3Rpb24oKSB7IGdmb3JtLnRoZW1lU2NyaXB0c0xvYWRlZCA9IHRydWU7IH0gKTsKCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgeyBnZm9ybS5kb21Mb2FkZWQgPSB0cnVlOyB9ICk7CgoJdmFyIGdmb3JtID0gewoJCWRvbUxvYWRlZDogZmFsc2UsCgkJc2NyaXB0c0xvYWRlZDogZmFsc2UsCgkJdGhlbWVTY3JpcHRzTG9hZGVkOiBmYWxzZSwKCQlpc0Zvcm1FZGl0b3I6ICgpID0+IHR5cGVvZiBJbml0aWFsaXplRWRpdG9yID09PSAnZnVuY3Rpb24nLAoKCQkvKioKCQkgKiBAZGVwcmVjYXRlZCAyLjkgdGhlIHVzZSBvZiBpbml0aWFsaXplT25Mb2FkZWQgaW4gdGhlIGZvcm0gZWRpdG9yIGNvbnRleHQgaXMgZGVwcmVjYXRlZC4KCQkgKiBAcmVtb3ZlLWluIDMuMSB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoZWNrIGZvciBnZm9ybS5pc0Zvcm1FZGl0b3IoKS4KCQkgKi8KCQljYWxsSWZMb2FkZWQ6IGZ1bmN0aW9uICggZm4gKSB7CgkJCWlmICggZ2Zvcm0uZG9tTG9hZGVkICYmIGdmb3JtLnNjcmlwdHNMb2FkZWQgJiYgKCBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgfHwgZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSApIHsKCQkJCWlmICggZ2Zvcm0uaXNGb3JtRWRpdG9yKCkgKSB7CgkJCQkJY29uc29sZS53YXJuKCAnVGhlIHVzZSBvZiBnZm9ybS5pbml0aWFsaXplT25Mb2FkZWQoKSBpcyBkZXByZWNhdGVkIGluIHRoZSBmb3JtIGVkaXRvciBjb250ZXh0IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3Jhdml0eSBGb3JtcyAzLjEuJyApOwoJCQkJfQoJCQkJZm4oKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCXJldHVybiBmYWxzZTsKCQl9LAoKCQkvKioKCQkgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcGFyYW0gZnVuY3Rpb24gZm4gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhbGwgc2NyaXB0cyBhcmUgbG9hZGVkCgkJICoKCQkgKiBAcmV0dXJucyB2b2lkCgkJICovCgkJaW5pdGlhbGl6ZU9uTG9hZGVkOiBmdW5jdGlvbiggZm4gKSB7CgkJCWlmICggISBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICkgKSB7CgkJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAnZ2Zvcm1fbWFpbl9zY3JpcHRzX2xvYWRlZCcsICgpID0+IHsgZ2Zvcm0uc2NyaXB0c0xvYWRlZCA9IHRydWU7IGdmb3JtLmNhbGxJZkxvYWRlZCggZm4gKTsgfSApOwoJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2dmb3JtL3RoZW1lL3NjcmlwdHNfbG9hZGVkJywgKCkgPT4geyBnZm9ybS50aGVtZVNjcmlwdHNMb2FkZWQgPSB0cnVlOyBnZm9ybS5jYWxsSWZMb2FkZWQoIGZuICk7IH0gKTsKCQkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAnRE9NQ29udGVudExvYWRlZCcsICgpID0+IHsgZ2Zvcm0uZG9tTG9hZGVkID0gdHJ1ZTsgZ2Zvcm0uY2FsbElmTG9hZGVkKCBmbiApOyB9ICk7CgkJCX0KCQl9LAoKCQlob29rczogeyBhY3Rpb246IHt9LCBmaWx0ZXI6IHt9IH0sCgkJYWRkQWN0aW9uOiBmdW5jdGlvbiggYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJZ2Zvcm0uYWRkSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEZpbHRlcjogZnVuY3Rpb24oIGFjdGlvbiwgY2FsbGFibGUsIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLmFkZEhvb2soICdmaWx0ZXInLCBhY3Rpb24sIGNhbGxhYmxlLCBwcmlvcml0eSwgdGFnICk7CgkJfSwKCQlkb0FjdGlvbjogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJZ2Zvcm0uZG9Ib29rKCAnYWN0aW9uJywgYWN0aW9uLCBhcmd1bWVudHMgKTsKCQl9LAoJCWFwcGx5RmlsdGVyczogZnVuY3Rpb24oIGFjdGlvbiApIHsKCQkJcmV0dXJuIGdmb3JtLmRvSG9vayggJ2ZpbHRlcicsIGFjdGlvbiwgYXJndW1lbnRzICk7CgkJfSwKCQlyZW1vdmVBY3Rpb246IGZ1bmN0aW9uKCBhY3Rpb24sIHRhZyApIHsKCQkJZ2Zvcm0ucmVtb3ZlSG9vayggJ2FjdGlvbicsIGFjdGlvbiwgdGFnICk7CgkJfSwKCQlyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uKCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKSB7CgkJCWdmb3JtLnJlbW92ZUhvb2soICdmaWx0ZXInLCBhY3Rpb24sIHByaW9yaXR5LCB0YWcgKTsKCQl9LAoJCWFkZEhvb2s6IGZ1bmN0aW9uKCBob29rVHlwZSwgYWN0aW9uLCBjYWxsYWJsZSwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgPT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQlnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXSA9IFtdOwoJCQl9CgkJCXZhciBob29rcyA9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dOwoJCQlpZiAoIHVuZGVmaW5lZCA9PSB0YWcgKSB7CgkJCQl0YWcgPSBhY3Rpb24gKyAnXycgKyBob29rcy5sZW5ndGg7CgkJCX0KCQkJaWYoIHByaW9yaXR5ID09IHVuZGVmaW5lZCApewoJCQkJcHJpb3JpdHkgPSAxMDsKCQkJfQoKCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0ucHVzaCggeyB0YWc6dGFnLCBjYWxsYWJsZTpjYWxsYWJsZSwgcHJpb3JpdHk6cHJpb3JpdHkgfSApOwoJCX0sCgkJZG9Ib29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgYXJncyApIHsKCgkJCS8vIHNwbGljZSBhcmdzIGZyb20gb2JqZWN0IGludG8gYXJyYXkgYW5kIHJlbW92ZSBmaXJzdCBpbmRleCB3aGljaCBpcyB0aGUgaG9vayBuYW1lCgkJCWFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKTsKCgkJCWlmICggdW5kZWZpbmVkICE9IGdmb3JtLmhvb2tzW2hvb2tUeXBlXVthY3Rpb25dICkgewoJCQkJdmFyIGhvb2tzID0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0sIGhvb2s7CgkJCQkvL3NvcnQgYnkgcHJpb3JpdHkKCQkJCWhvb2tzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsicHJpb3JpdHkiXS1iWyJwcmlvcml0eSJdfSk7CgoJCQkJaG9va3MuZm9yRWFjaCggZnVuY3Rpb24oIGhvb2tJdGVtICkgewoJCQkJCWhvb2sgPSBob29rSXRlbS5jYWxsYWJsZTsKCgkJCQkJaWYodHlwZW9mIGhvb2sgIT0gJ2Z1bmN0aW9uJykKCQkJCQkJaG9vayA9IHdpbmRvd1tob29rXTsKCQkJCQlpZiAoICdhY3Rpb24nID09IGhvb2tUeXBlICkgewoJCQkJCQlob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0gZWxzZSB7CgkJCQkJCWFyZ3NbMF0gPSBob29rLmFwcGx5KG51bGwsIGFyZ3MpOwoJCQkJCX0KCQkJCX0gKTsKCQkJfQoJCQlpZiAoICdmaWx0ZXInPT1ob29rVHlwZSApIHsKCQkJCXJldHVybiBhcmdzWzBdOwoJCQl9CgkJfSwKCQlyZW1vdmVIb29rOiBmdW5jdGlvbiggaG9va1R5cGUsIGFjdGlvbiwgcHJpb3JpdHksIHRhZyApIHsKCQkJaWYgKCB1bmRlZmluZWQgIT0gZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gKSB7CgkJCQl2YXIgaG9va3MgPSBnZm9ybS5ob29rc1tob29rVHlwZV1bYWN0aW9uXTsKCQkJCWhvb2tzID0gaG9va3MuZmlsdGVyKCBmdW5jdGlvbihob29rLCBpbmRleCwgYXJyKSB7CgkJCQkJdmFyIHJlbW92ZUhvb2sgPSAodW5kZWZpbmVkPT10YWd8fHRhZz09aG9vay50YWcpICYmICh1bmRlZmluZWQ9PXByaW9yaXR5fHxwcmlvcml0eT09aG9vay5wcmlvcml0eSk7CgkJCQkJcmV0dXJuICFyZW1vdmVIb29rOwoJCQkJfSApOwoJCQkJZ2Zvcm0uaG9va3NbaG9va1R5cGVdW2FjdGlvbl0gPSBob29rczsKCQkJfQoJCX0KCX07Cn0KCi8qIF1dPiAqLwo8L3NjcmlwdD4KCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdnZl9icm93c2VyX2dlY2tvIGdmb3JtX3dyYXBwZXIgZ2Zvcm1fbGVnYWN5X21hcmt1cF93cmFwcGVyIGdmb3JtLXRoZW1lLS1uby1mcmFtZXdvcmsgY29udGFjdC1mb3Jtc193cmFwcGVyIGdwbGFjZWhvbGRlcl93cmFwcGVyJyBkYXRhLWZvcm0tdGhlbWU9J2xlZ2FjeScgZGF0YS1mb3JtLWluZGV4PScwJyBpZD0nZ2Zvcm1fd3JhcHBlcl8xMScgPjxkaXYgaWQ9J2dmXzExJyBjbGFzcz0nZ2Zvcm1fYW5jaG9yJyB0YWJpbmRleD0nLTEnPjwvZGl2Pjxmb3JtIG1ldGhvZD0ncG9zdCcgZW5jdHlwZT0nbXVsdGlwYXJ0L2Zvcm0tZGF0YScgdGFyZ2V0PSdnZm9ybV9hamF4X2ZyYW1lXzExJyBpZD0nZ2Zvcm1fMTEnIGNsYXNzPSdjb250YWN0LWZvcm1zIGdwbGFjZWhvbGRlcicgYWN0aW9uPScvcGF0aWVudC1jZW50cmUvI2dmXzExJyBkYXRhLWZvcm1pZD0nMTEnIG5vdmFsaWRhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2dmb3JtLWJvZHkgZ2Zvcm1fYm9keSc+PHVsIGlkPSdnZm9ybV9maWVsZHNfMTEnIGNsYXNzPSdnZm9ybV9maWVsZHMgdG9wX2xhYmVsIGZvcm1fc3VibGFiZWxfYmVsb3cgZGVzY3JpcHRpb25fYmVsb3cgdmFsaWRhdGlvbl9iZWxvdyc+PGxpIGlkPSJmaWVsZF8xMV8xMCIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtdGV4dCBnZmllbGRfY29udGFpbnNfcmVxdWlyZWQgZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBoaWRkZW5fbGFiZWwgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzEwIiA+PGxhYmVsIGNsYXNzPSdnZmllbGRfbGFiZWwgZ2Zvcm0tZmllbGQtbGFiZWwnIGZvcj0naW5wdXRfMTFfMTAnPllvdXIgTmFtZTxzcGFuIGNsYXNzPSJnZmllbGRfcmVxdWlyZWQiPjxzcGFuIGNsYXNzPSJnZmllbGRfcmVxdWlyZWQgZ2ZpZWxkX3JlcXVpcmVkX2FzdGVyaXNrIj4qPC9zcGFuPjwvc3Bhbj48L2xhYmVsPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMTAnIGlkPSdpbnB1dF8xMV8xMCcgdHlwZT0ndGV4dCcgdmFsdWU9JycgY2xhc3M9J2xhcmdlJyAgIHRhYmluZGV4PSc1MCcgcGxhY2Vob2xkZXI9J1lvdXIgTmFtZSAqJyBhcmlhLXJlcXVpcmVkPSJ0cnVlIiBhcmlhLWludmFsaWQ9ImZhbHNlIiAgIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzMiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWVtYWlsIGdmaWVsZF9jb250YWluc19yZXF1aXJlZCBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGhpZGRlbl9sYWJlbCBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMyIgPjxsYWJlbCBjbGFzcz0nZ2ZpZWxkX2xhYmVsIGdmb3JtLWZpZWxkLWxhYmVsJyBmb3I9J2lucHV0XzExXzMnPllvdXIgRW1haWw8c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIj48c3BhbiBjbGFzcz0iZ2ZpZWxkX3JlcXVpcmVkIGdmaWVsZF9yZXF1aXJlZF9hc3RlcmlzayI+Kjwvc3Bhbj48L3NwYW4+PC9sYWJlbD48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfZW1haWwnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9J2lucHV0XzMnIGlkPSdpbnB1dF8xMV8zJyB0eXBlPSdlbWFpbCcgdmFsdWU9JycgY2xhc3M9J2xhcmdlJyB0YWJpbmRleD0nNTEnICBwbGFjZWhvbGRlcj0nWW91ciBFbWFpbCAqJyBhcmlhLXJlcXVpcmVkPSJ0cnVlIiBhcmlhLWludmFsaWQ9ImZhbHNlIiAgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE3IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzE3IiA+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8xNycgaWQ9J2lucHV0XzExXzE3JyB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nICBhcmlhLWludmFsaWQ9ImZhbHNlIiB2YWx1ZT0nMTI0NScgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMTUiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhpZGRlbiBnZm9ybV9oaWRkZW4gZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMTUiID48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzE1JyBpZD0naW5wdXRfMTFfMTUnIHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgIGFyaWEtaW52YWxpZD0iZmFsc2UiIHZhbHVlPSdHdW0gRGlzZWFzZSBHdWlkZScgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMTYiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhpZGRlbiBnZm9ybV9oaWRkZW4gZmllbGRfc3VibGFiZWxfYmVsb3cgZ2ZpZWxkLS1uby1kZXNjcmlwdGlvbiBmaWVsZF9kZXNjcmlwdGlvbl9iZWxvdyBmaWVsZF92YWxpZGF0aW9uX2JlbG93IGdmaWVsZF92aXNpYmlsaXR5X3Zpc2libGUiICBkYXRhLWpzLXJlbG9hZD0iZmllbGRfMTFfMTYiID48ZGl2IGNsYXNzPSdnaW5wdXRfY29udGFpbmVyIGdpbnB1dF9jb250YWluZXJfdGV4dCc+PGlucHV0IG5hbWU9J2lucHV0XzE2JyBpZD0naW5wdXRfMTFfMTYnIHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgIGFyaWEtaW52YWxpZD0iZmFsc2UiIHZhbHVlPScnIC8+PC9kaXY+PC9saT48bGkgaWQ9ImZpZWxkXzExXzE4IiBjbGFzcz0iZ2ZpZWxkIGdmaWVsZC0tdHlwZS1oaWRkZW4gZ2Zvcm1faGlkZGVuIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0tbm8tZGVzY3JpcHRpb24gZmllbGRfZGVzY3JpcHRpb25fYmVsb3cgZmllbGRfdmFsaWRhdGlvbl9iZWxvdyBnZmllbGRfdmlzaWJpbGl0eV92aXNpYmxlIiAgZGF0YS1qcy1yZWxvYWQ9ImZpZWxkXzExXzE4IiA+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lciBnaW5wdXRfY29udGFpbmVyX3RleHQnPjxpbnB1dCBuYW1lPSdpbnB1dF8xOCcgaWQ9J2lucHV0XzExXzE4JyB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nICBhcmlhLWludmFsaWQ9ImZhbHNlIiB2YWx1ZT0nJyAvPjwvZGl2PjwvbGk+PGxpIGlkPSJmaWVsZF8xMV8yMCIgY2xhc3M9ImdmaWVsZCBnZmllbGQtLXR5cGUtaGlkZGVuIGdmb3JtX2hpZGRlbiBmaWVsZF9zdWJsYWJlbF9iZWxvdyBnZmllbGQtLW5vLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8yMCIgPjxkaXYgY2xhc3M9J2dpbnB1dF9jb250YWluZXIgZ2lucHV0X2NvbnRhaW5lcl90ZXh0Jz48aW5wdXQgbmFtZT0naW5wdXRfMjAnIGlkPSdpbnB1dF8xMV8yMCcgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyAgYXJpYS1pbnZhbGlkPSJmYWxzZSIgdmFsdWU9JycgLz48L2Rpdj48L2xpPjxsaSBpZD0iZmllbGRfMTFfMjEiIGNsYXNzPSJnZmllbGQgZ2ZpZWxkLS10eXBlLWhvbmV5cG90IGdmb3JtX3ZhbGlkYXRpb25fY29udGFpbmVyIGZpZWxkX3N1YmxhYmVsX2JlbG93IGdmaWVsZC0taGFzLWRlc2NyaXB0aW9uIGZpZWxkX2Rlc2NyaXB0aW9uX2JlbG93IGZpZWxkX3ZhbGlkYXRpb25fYmVsb3cgZ2ZpZWxkX3Zpc2liaWxpdHlfdmlzaWJsZSIgIGRhdGEtanMtcmVsb2FkPSJmaWVsZF8xMV8yMSIgPjxsYWJlbCBjbGFzcz0nZ2ZpZWxkX2xhYmVsIGdmb3JtLWZpZWxkLWxhYmVsJyBmb3I9J2lucHV0XzExXzIxJz5FbWFpbDwvbGFiZWw+PGRpdiBjbGFzcz0nZ2lucHV0X2NvbnRhaW5lcic+PGlucHV0IG5hbWU9J2lucHV0XzIxJyBpZD0naW5wdXRfMTFfMjEnIHR5cGU9J3RleHQnIHZhbHVlPScnIGF1dG9jb21wbGV0ZT0nbmV3LXBhc3N3b3JkJy8+PC9kaXY+PGRpdiBjbGFzcz0nZ2ZpZWxkX2Rlc2NyaXB0aW9uJyBpZD0nZ2ZpZWxkX2Rlc2NyaXB0aW9uXzExXzIxJz5UaGlzIGZpZWxkIGlzIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzIGFuZCBzaG91bGQgYmUgbGVmdCB1bmNoYW5nZWQuPC9kaXY+PC9saT48L3VsPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9J2dmb3JtLWZvb3RlciBnZm9ybV9mb290ZXIgdG9wX2xhYmVsJz4gCgkJPGRpdiBjbGFzcz0ic2VjdGlvbi1idXR0b24iPgoJICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgaWQ9Imdmb3JtX3N1Ym1pdF9idXR0b25fMTEiIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPgoJCSAgICAgICAgRG93bmxvYWQgbm93CgkJCTwvYnV0dG9uPgoJCTwvZGl2PgogICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J2dmb3JtX2FqYXgnIHZhbHVlPSdmb3JtX2lkPTExJmFtcDt0aXRsZT0mYW1wO2Rlc2NyaXB0aW9uPSZhbXA7dGFiaW5kZXg9NTAmYW1wO3RoZW1lPWxlZ2FjeSZhbXA7c3R5bGVzPVtdJmFtcDtoYXNoPWUyODJkNmMzZjk2MDYzNWRjNjc4YjY3ODYxN2Q0NDcwJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV9zdWJtaXNzaW9uX21ldGhvZCcgZGF0YS1qcz0nZ2Zvcm1fc3VibWlzc2lvbl9tZXRob2RfMTEnIHZhbHVlPSdpZnJhbWUnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3RoZW1lJyBkYXRhLWpzPSdnZm9ybV90aGVtZV8xMScgaWQ9J2dmb3JtX3RoZW1lXzExJyB2YWx1ZT0nbGVnYWN5JyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV9zdHlsZV9zZXR0aW5ncycgZGF0YS1qcz0nZ2Zvcm1fc3R5bGVfc2V0dGluZ3NfMTEnIGlkPSdnZm9ybV9zdHlsZV9zZXR0aW5nc18xMScgdmFsdWU9J1tdJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdpc19zdWJtaXRfMTEnIHZhbHVlPScxJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV9zdWJtaXQnIHZhbHVlPScxMScgLz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3VuaXF1ZV9pZCcgdmFsdWU9JycgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgY2xhc3M9J2dmb3JtX2hpZGRlbicgbmFtZT0nc3RhdGVfMTEnIHZhbHVlPSdXeUpiWFNJc0ltVTBNV0ZtTTJSbU5ESXdNbVEyTm1ZeE9XRTRaRE0yT1RReU5tWTRaR1kwSWwwPScgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9J2hpZGRlbicgYXV0b2NvbXBsZXRlPSdvZmYnIGNsYXNzPSdnZm9ybV9oaWRkZW4nIG5hbWU9J2dmb3JtX3RhcmdldF9wYWdlX251bWJlcl8xMScgaWQ9J2dmb3JtX3RhcmdldF9wYWdlX251bWJlcl8xMScgdmFsdWU9JzAnIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdoaWRkZW4nIGF1dG9jb21wbGV0ZT0nb2ZmJyBjbGFzcz0nZ2Zvcm1faGlkZGVuJyBuYW1lPSdnZm9ybV9zb3VyY2VfcGFnZV9udW1iZXJfMTEnIGlkPSdnZm9ybV9zb3VyY2VfcGFnZV9udW1iZXJfMTEnIHZhbHVlPScxJyAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdnZm9ybV9maWVsZF92YWx1ZXMnIHZhbHVlPSdlYm9va19pZD0xMjQ1JmFtcDtlYm9va19hY3RpdmVfY2FtcGFpZ25fdGFnPUd1bStEaXNlYXNlK0d1aWRlJyAvPgogICAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCQkgICAgICAgICAgICAgICAgPGlmcmFtZSBzdHlsZT0nZGlzcGxheTpub25lO3dpZHRoOjBweDtoZWlnaHQ6MHB4Oycgc3JjPSdhYm91dDpibGFuaycgbmFtZT0nZ2Zvcm1fYWpheF9mcmFtZV8xMScgaWQ9J2dmb3JtX2FqYXhfZnJhbWVfMTEnIHRpdGxlPSdUaGlzIGlmcmFtZSBjb250YWlucyB0aGUgbG9naWMgcmVxdWlyZWQgdG8gaGFuZGxlIEFqYXggcG93ZXJlZCBHcmF2aXR5IEZvcm1zLic+PC9pZnJhbWU+CgkJICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLyogPCFbQ0RBVEFbICovCiBnZm9ybS5pbml0aWFsaXplT25Mb2FkZWQoIGZ1bmN0aW9uKCkge2dmb3JtSW5pdFNwaW5uZXIoIDExLCAnaHR0cHM6Ly9wYWNpZmljcGVyaW8uY29tLmF1L3dwLWNvbnRlbnQvcGx1Z2lucy9ncmF2aXR5Zm9ybXMvaW1hZ2VzL3NwaW5uZXIuc3ZnJywgdHJ1ZSApO2pRdWVyeSgnI2dmb3JtX2FqYXhfZnJhbWVfMTEnKS5vbignbG9hZCcsZnVuY3Rpb24oKXt2YXIgY29udGVudHMgPSBqUXVlcnkodGhpcykuY29udGVudHMoKS5maW5kKCcqJykuaHRtbCgpO3ZhciBpc19wb3N0YmFjayA9IGNvbnRlbnRzLmluZGV4T2YoJ0dGX0FKQVhfUE9TVEJBQ0snKSA+PSAwO2lmKCFpc19wb3N0YmFjayl7cmV0dXJuO312YXIgZm9ybV9jb250ZW50ID0galF1ZXJ5KHRoaXMpLmNvbnRlbnRzKCkuZmluZCgnI2dmb3JtX3dyYXBwZXJfMTEnKTt2YXIgaXNfY29uZmlybWF0aW9uID0galF1ZXJ5KHRoaXMpLmNvbnRlbnRzKCkuZmluZCgnI2dmb3JtX2NvbmZpcm1hdGlvbl93cmFwcGVyXzExJykubGVuZ3RoID4gMDt2YXIgaXNfcmVkaXJlY3QgPSBjb250ZW50cy5pbmRleE9mKCdnZm9ybVJlZGlyZWN0KCl7JykgPj0gMDt2YXIgaXNfZm9ybSA9IGZvcm1fY29udGVudC5sZW5ndGggPiAwICYmICEgaXNfcmVkaXJlY3QgJiYgISBpc19jb25maXJtYXRpb247dmFyIG10ID0gcGFyc2VJbnQoalF1ZXJ5KCdodG1sJykuY3NzKCdtYXJnaW4tdG9wJyksIDEwKSArIHBhcnNlSW50KGpRdWVyeSgnYm9keScpLmNzcygnbWFyZ2luLXRvcCcpLCAxMCkgKyAxMDA7aWYoaXNfZm9ybSl7alF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLmh0bWwoZm9ybV9jb250ZW50Lmh0bWwoKSk7aWYoZm9ybV9jb250ZW50Lmhhc0NsYXNzKCdnZm9ybV92YWxpZGF0aW9uX2Vycm9yJykpe2pRdWVyeSgnI2dmb3JtX3dyYXBwZXJfMTEnKS5hZGRDbGFzcygnZ2Zvcm1fdmFsaWRhdGlvbl9lcnJvcicpO30gZWxzZSB7alF1ZXJ5KCcjZ2Zvcm1fd3JhcHBlcl8xMScpLnJlbW92ZUNsYXNzKCdnZm9ybV92YWxpZGF0aW9uX2Vycm9yJyk7fXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgeyAvKiBkZWxheSB0aGUgc2Nyb2xsIGJ5IDUwIG1pbGxpc2Vjb25kcyB0byBmaXggYSBidWcgaW4gY2hyb21lICovIGpRdWVyeShkb2N1bWVudCkuc2Nyb2xsVG9wKGpRdWVyeSgnI2dmb3JtX3dyYXBwZXJfMTEnKS5vZmZzZXQoKS50b3AgLSBtdCk7IH0sIDUwICk7aWYod2luZG93WydnZm9ybUluaXREYXRlcGlja2VyJ10pIHtnZm9ybUluaXREYXRlcGlja2VyKCk7fWlmKHdpbmRvd1snZ2Zvcm1Jbml0UHJpY2VGaWVsZHMnXSkge2dmb3JtSW5pdFByaWNlRmllbGRzKCk7fXZhciBjdXJyZW50X3BhZ2UgPSBqUXVlcnkoJyNnZm9ybV9zb3VyY2VfcGFnZV9udW1iZXJfMTEnKS52YWwoKTtnZm9ybUluaXRTcGlubmVyKCAxMSwgJ2h0dHBzOi8vcGFjaWZpY3BlcmlvLmNvbS5hdS93cC1jb250ZW50L3BsdWdpbnMvZ3Jhdml0eWZvcm1zL2ltYWdlcy9zcGlubmVyLnN2ZycsIHRydWUgKTtqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXIoJ2dmb3JtX3BhZ2VfbG9hZGVkJywgWzExLCBjdXJyZW50X3BhZ2VdKTt3aW5kb3dbJ2dmX3N1Ym1pdHRpbmdfMTEnXSA9IGZhbHNlO31lbHNlIGlmKCFpc19yZWRpcmVjdCl7dmFyIGNvbmZpcm1hdGlvbl9jb250ZW50ID0galF1ZXJ5KHRoaXMpLmNvbnRlbnRzKCkuZmluZCgnLkdGX0FKQVhfUE9TVEJBQ0snKS5odG1sKCk7aWYoIWNvbmZpcm1hdGlvbl9jb250ZW50KXtjb25maXJtYXRpb25fY29udGVudCA9IGNvbnRlbnRzO31qUXVlcnkoJyNnZm9ybV93cmFwcGVyXzExJykucmVwbGFjZVdpdGgoY29uZmlybWF0aW9uX2NvbnRlbnQpO2pRdWVyeShkb2N1bWVudCkuc2Nyb2xsVG9wKGpRdWVyeSgnI2dmXzExJykub2Zmc2V0KCkudG9wIC0gbXQpO2pRdWVyeShkb2N1bWVudCkudHJpZ2dlcignZ2Zvcm1fY29uZmlybWF0aW9uX2xvYWRlZCcsIFsxMV0pO3dpbmRvd1snZ2Zfc3VibWl0dGluZ18xMSddID0gZmFsc2U7d3AuYTExeS5zcGVhayhqUXVlcnkoJyNnZm9ybV9jb25maXJtYXRpb25fbWVzc2FnZV8xMScpLnRleHQoKSk7fWVsc2V7alF1ZXJ5KCcjZ2Zvcm1fMTEnKS5hcHBlbmQoY29udGVudHMpO2lmKHdpbmRvd1snZ2Zvcm1SZWRpcmVjdCddKSB7Z2Zvcm1SZWRpcmVjdCgpO319alF1ZXJ5KGRvY3VtZW50KS50cmlnZ2VyKCJnZm9ybV9wcmVfcG9zdF9yZW5kZXIiLCBbeyBmb3JtSWQ6ICIxMSIsIGN1cnJlbnRQYWdlOiAiY3VycmVudF9wYWdlIiwgYWJvcnQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnByZXZlbnREZWZhdWx0KCk7IH0gfV0pOyAgICAgICAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgeyAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgfSAgICAgICAgY29uc3QgZ2Zvcm1XcmFwcGVyRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoICJnZm9ybV93cmFwcGVyXzExIiApOyAgICAgICAgaWYgKCBnZm9ybVdyYXBwZXJEaXYgKSB7ICAgICAgICAgICAgY29uc3QgdmlzaWJpbGl0eVNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAic3BhbiIgKTsgICAgICAgICAgICB2aXNpYmlsaXR5U3Bhbi5pZCA9ICJnZm9ybV92aXNpYmlsaXR5X3Rlc3RfMTEiOyAgICAgICAgICAgIGdmb3JtV3JhcHBlckRpdi5pbnNlcnRBZGphY2VudEVsZW1lbnQoICJhZnRlcmVuZCIsIHZpc2liaWxpdHlTcGFuICk7ICAgICAgICB9ICAgICAgICBjb25zdCB2aXNpYmlsaXR5VGVzdERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAiZ2Zvcm1fdmlzaWJpbGl0eV90ZXN0XzExIiApOyAgICAgICAgbGV0IHBvc3RSZW5kZXJGaXJlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICBmdW5jdGlvbiB0cmlnZ2VyUG9zdFJlbmRlcigpIHsgICAgICAgICAgICBpZiAoIHBvc3RSZW5kZXJGaXJlZCApIHsgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgIH0gICAgICAgICAgICBwb3N0UmVuZGVyRmlyZWQgPSB0cnVlOyAgICAgICAgICAgIGdmb3JtLmNvcmUudHJpZ2dlclBvc3RSZW5kZXJFdmVudHMoIDExLCBjdXJyZW50X3BhZ2UgKTsgICAgICAgICAgICBpZiAoIHZpc2liaWxpdHlUZXN0RGl2ICkgeyAgICAgICAgICAgICAgICB2aXNpYmlsaXR5VGVzdERpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB2aXNpYmlsaXR5VGVzdERpdiApOyAgICAgICAgICAgIH0gICAgICAgIH0gICAgICAgIGZ1bmN0aW9uIGRlYm91bmNlKCBmdW5jLCB3YWl0LCBpbW1lZGlhdGUgKSB7ICAgICAgICAgICAgdmFyIHRpbWVvdXQ7ICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyAgICAgICAgICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7ICAgICAgICAgICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkgeyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICBpZiAoICFpbW1lZGlhdGUgKSBmdW5jLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7ICAgICAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0OyAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoIHRpbWVvdXQgKTsgICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoIGxhdGVyLCB3YWl0ICk7ICAgICAgICAgICAgICAgIGlmICggY2FsbE5vdyApIGZ1bmMuYXBwbHkoIGNvbnRleHQsIGFyZ3MgKTsgICAgICAgICAgICB9OyAgICAgICAgfSAgICAgICAgY29uc3QgZGVib3VuY2VkVHJpZ2dlclBvc3RSZW5kZXIgPSBkZWJvdW5jZSggZnVuY3Rpb24oKSB7ICAgICAgICAgICAgdHJpZ2dlclBvc3RSZW5kZXIoKTsgICAgICAgIH0sIDIwMCApOyAgICAgICAgaWYgKCB2aXNpYmlsaXR5VGVzdERpdiAmJiB2aXNpYmlsaXR5VGVzdERpdi5vZmZzZXRQYXJlbnQgPT09IG51bGwgKSB7ICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlciggKCBtdXRhdGlvbnMgKSA9PiB7ICAgICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKCAoIG11dGF0aW9uICkgPT4geyAgICAgICAgICAgICAgICAgICAgaWYgKCBtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgdmlzaWJpbGl0eVRlc3REaXYub2Zmc2V0UGFyZW50ICE9PSBudWxsICkgeyAgICAgICAgICAgICAgICAgICAgICAgIGRlYm91bmNlZFRyaWdnZXJQb3N0UmVuZGVyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICB9KTsgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKCBkb2N1bWVudC5ib2R5LCB7ICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogZmFsc2UsICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWyAnc3R5bGUnLCAnY2xhc3MnIF0sICAgICAgICAgICAgfSk7ICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIHRyaWdnZXJQb3N0UmVuZGVyKCk7ICAgICAgICB9ICAgIH0gKTt9ICk7IAovKiBdXT4gKi8KPC9zY3JpcHQ+Cg==