)]}'
{"searchlight/listener.py":[{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"b171a0e961faf66ef2f3c8d7e8b8f071cb8a6ca8","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        self._process_event(ctxt, publisher_id, event_type, payload, metadata)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def debug(self, ctxt, publisher_id, event_type, payload, metadata):"},{"line_number":122,"context_line":"        self._process_event(ctxt, publisher_id, event_type, payload, metadata)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"class ListenerService(os_service.Service):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa7ab95a_8fdf3a39","line":122,"updated":"2016-09-01 19:22:10.000000000","message":"I\u0027m assuming these messages are supposed to be logged as error and debug messages (e.g. LOG.error() and LOG.debug()).\n\nThis isn\u0027t happening now. We are calling _process_event(), which calls _log_finished(). _log_finished() calls only LOG.info(). So all of these messages will be turned into INFO messages in the log file.","commit_id":"eb1af50a55a81bc17b7e0e74129781c238ef1088"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"d12cd17af7059fce0819282da39d1b3136b5eec1","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               help\u003d\u0027Use an oslo.messaging pool, which can be an alternative \u0027"},{"line_number":40,"context_line":"               \u0027to multiple topics. \u0027),"},{"line_number":41,"context_line":"    cfg.ListOpt(\u0027additional_priorities\u0027,"},{"line_number":42,"context_line":"                help\u003d\u0027List of additional notifications priorities for \u0027"},{"line_number":43,"context_line":"                     \u0027processing. Can be required for some plugins, please \u0027"},{"line_number":44,"context_line":"                     \u0027read plugin documentation. Possible values are \"audit\", \u0027"},{"line_number":45,"context_line":"                     \u0027\"debug\", \"warn\", \"error\", \"critical\", \"sample\".\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_06164055","line":42,"range":{"start_line":42,"start_character":41,"end_line":42,"end_character":54},"updated":"2016-09-27 19:44:18.000000000","message":"Nit: Should by \"notification\"","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"2898ce2246d85f6626fb2df0bb7a1160afd35e08","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               help\u003d\u0027Use an oslo.messaging pool, which can be an alternative \u0027"},{"line_number":40,"context_line":"               \u0027to multiple topics. \u0027),"},{"line_number":41,"context_line":"    cfg.ListOpt(\u0027additional_priorities\u0027,"},{"line_number":42,"context_line":"                help\u003d\u0027List of additional notifications priorities for \u0027"},{"line_number":43,"context_line":"                     \u0027processing. Can be required for some plugins, please \u0027"},{"line_number":44,"context_line":"                     \u0027read plugin documentation. Possible values are \"audit\", \u0027"},{"line_number":45,"context_line":"                     \u0027\"debug\", \"warn\", \"error\", \"critical\", \"sample\".\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_0a4b835a","line":42,"range":{"start_line":42,"start_character":41,"end_line":42,"end_character":54},"in_reply_to":"5a8bc5a2_06164055","updated":"2016-09-28 09:59:17.000000000","message":"Done","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"d12cd17af7059fce0819282da39d1b3136b5eec1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    @classmethod"},{"line_number":125,"context_line":"    def _validate_and_set_dispatchers(cls):"},{"line_number":126,"context_line":"        valid_values \u003d set([\u0027audit\u0027, \u0027debug\u0027, \u0027info\u0027, \u0027warn\u0027, \u0027error\u0027,"},{"line_number":127,"context_line":"                            \u0027critical\u0027, \u0027sample\u0027])"},{"line_number":128,"context_line":"        if CONF.listener.additional_priorities is not None:"},{"line_number":129,"context_line":"            priorities \u003d {p.lower() for p in"},{"line_number":130,"context_line":"                          CONF.listener.additional_priorities}"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_917d2cb4","line":127,"updated":"2016-09-27 19:44:18.000000000","message":"Since we are tying these hard-coded values to oslo messaging, maybe we should make the connection more explicit. This way future generations of code maintainers will have a better chance of keeping them up to date. Either a comment explaining where these values came from\n\nhttps://github.com/openstack/oslo.messaging/blob/master/oslo_messaging/notify/dispatcher.py#L29\n\nOr if we think it\u0027s not too intrusive (and the location will not be changing), we can reference it directly like we do with other parts of oslo:\n\n    import PRIORITIES from oslo_messaging.notify.dispatcher\n    ...\n    valid_values \u003d set(PRIORITIES)","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"2898ce2246d85f6626fb2df0bb7a1160afd35e08","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    @classmethod"},{"line_number":125,"context_line":"    def _validate_and_set_dispatchers(cls):"},{"line_number":126,"context_line":"        valid_values \u003d set([\u0027audit\u0027, \u0027debug\u0027, \u0027info\u0027, \u0027warn\u0027, \u0027error\u0027,"},{"line_number":127,"context_line":"                            \u0027critical\u0027, \u0027sample\u0027])"},{"line_number":128,"context_line":"        if CONF.listener.additional_priorities is not None:"},{"line_number":129,"context_line":"            priorities \u003d {p.lower() for p in"},{"line_number":130,"context_line":"                          CONF.listener.additional_priorities}"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_6a788790","line":127,"in_reply_to":"5a8bc5a2_917d2cb4","updated":"2016-09-28 09:59:17.000000000","message":"Good point, done.","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"d12cd17af7059fce0819282da39d1b3136b5eec1","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            unknown \u003d priorities - valid_values"},{"line_number":132,"context_line":"            if unknown:"},{"line_number":133,"context_line":"                LOG.warning(_LW(\u0027Ignoring invalid notifications priorities: \u0027"},{"line_number":134,"context_line":"                                \u0027%s\u0027), \u0027, \u0027.join(unknown))"},{"line_number":135,"context_line":"                priorities -\u003d unknown"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            priorities \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_91e1ac9d","line":134,"updated":"2016-09-27 19:44:18.000000000","message":"Usually if there is an error in the config file we try not to ignore it. A lot of users/deployers may not see a warning in all of the noise. This is especially true if there is a typo in the priority types in the config file. Maybe we should print an error and raise an exception here. This will force the user to address the problem with the config file.\n\nIt would also be helpful if we add the config file option that cause the problem (e.g. listener:additional_priorities) since it may not be immediately obvious to the person troubleshooting the problem.","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"2898ce2246d85f6626fb2df0bb7a1160afd35e08","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            unknown \u003d priorities - valid_values"},{"line_number":132,"context_line":"            if unknown:"},{"line_number":133,"context_line":"                LOG.warning(_LW(\u0027Ignoring invalid notifications priorities: \u0027"},{"line_number":134,"context_line":"                                \u0027%s\u0027), \u0027, \u0027.join(unknown))"},{"line_number":135,"context_line":"                priorities -\u003d unknown"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            priorities \u003d set()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_f53d5cbc","line":134,"in_reply_to":"5a8bc5a2_91e1ac9d","updated":"2016-09-28 09:59:17.000000000","message":"Changed to LOG.error(). But I\u0027m not sure about exception (currently at least). This will affect only one plugin (ironic), but we do not break init procedure and continue to start service for example in the code l170-178.","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":14680,"name":"Rick Aulino","email":"rick.aulino@hpe.com","username":"ricka"},"change_message_id":"d12cd17af7059fce0819282da39d1b3136b5eec1","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for priority in priorities:"},{"line_number":152,"context_line":"            setattr(cls, priority, _make_dispatcher(priority))"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class ListenerService(os_service.Service):"},{"line_number":156,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_8ce34f33","line":153,"updated":"2016-09-27 19:44:18.000000000","message":"Forgive me, as I haven\u0027t thoroughly read all of the Ironic notification docs yet :). Is this dynamic creation of oslo notification handlers needed for Ironic? Currently, all of the notifications that Searchlight receives are \"info\". Do we not know ahead of time all of the different notification priorities coming from Ironic?\n\nIf we don\u0027t know or it is somehow configurable in Ironic, then this dynamic creation makes sense. If it is known, then we should probably just hard-code those handlers in Searchlight like we have for all the previous notifications. I usually think that the less moving parts the better :)","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"2898ce2246d85f6626fb2df0bb7a1160afd35e08","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for priority in priorities:"},{"line_number":152,"context_line":"            setattr(cls, priority, _make_dispatcher(priority))"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class ListenerService(os_service.Service):"},{"line_number":156,"context_line":"    def __init__(self, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a8bc5a2_15580856","line":153,"in_reply_to":"5a8bc5a2_8ce34f33","updated":"2016-09-28 09:59:17.000000000","message":"Ironic can use “debug”, “info”, “warning”, “error”, or “critical” (http://docs.openstack.org/developer/ironic/dev/notifications.html). But there is an option that set minimum notification level http://docs.openstack.org/developer/ironic/dev/notifications.html, therefore there is no static level. “warning”  and \"critical\" are not currently used, so we should have a way to skip them.","commit_id":"71ee9144938bbaa0c83f877b849e2373691e93c2"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"9e2f43f0e0582ca6015d50d773df62a5f00a9754","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               default\u003d\u0027searchlight-listener\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027Use an oslo.messaging pool, which can be an alternative \u0027"},{"line_number":41,"context_line":"               \u0027to multiple topics. \u0027),"},{"line_number":42,"context_line":"    cfg.ListOpt(\u0027additional_priorities\u0027,"},{"line_number":43,"context_line":"                help\u003d\u0027List of additional notification priorities for \u0027"},{"line_number":44,"context_line":"                     \u0027processing. Can be required for some plugins, please \u0027"},{"line_number":45,"context_line":"                     \u0027read plugin documentation. Possible values are \"audit\", \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_3d50d60a","line":42,"range":{"start_line":42,"start_character":8,"end_line":42,"end_character":15},"updated":"2016-10-03 15:14:31.000000000","message":"If this is specific to individual plugins it should be implemented in the per-plugin options rather than globally. It\u0027s not clear to me what effect adding \u0027debug\u0027 here would have across the whole system, for instance. Although currently all supported plugins only send notifications at INFO level I can see the possibility of having to listen at other levels where services use them, but I would think it would be something specific to a plugin. Furthermore, I\u0027m not convinced configuration options are the best way to do this. If a service is known to use other levels, that should be part of the plugin, not something left to a deployer. My preference would be a base function on each plugin returning [\u0027info\u0027] to be overridden where necessary.","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d36c42e88c9892f3655fdde5a501a7ff0fe75581","unresolved":false,"context_lines":[{"line_number":39,"context_line":"               default\u003d\u0027searchlight-listener\u0027,"},{"line_number":40,"context_line":"               help\u003d\u0027Use an oslo.messaging pool, which can be an alternative \u0027"},{"line_number":41,"context_line":"               \u0027to multiple topics. \u0027),"},{"line_number":42,"context_line":"    cfg.ListOpt(\u0027additional_priorities\u0027,"},{"line_number":43,"context_line":"                help\u003d\u0027List of additional notification priorities for \u0027"},{"line_number":44,"context_line":"                     \u0027processing. Can be required for some plugins, please \u0027"},{"line_number":45,"context_line":"                     \u0027read plugin documentation. Possible values are \"audit\", \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_416596df","line":42,"range":{"start_line":42,"start_character":8,"end_line":42,"end_character":15},"in_reply_to":"3a98d1f4_3d50d60a","updated":"2016-10-04 14:32:01.000000000","message":"1) \"should be implemented in the per-plugin options\" it\u0027s a best way IMO but not sure that it\u0027s needed 2) \"base function on each plugin returning [\u0027info\u0027]\" this is not suitable for ironic, we can change levels set by config option https://github.com/openstack/ironic/blob/master/ironic/conf/default.py#L158","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"9e2f43f0e0582ca6015d50d773df62a5f00a9754","unresolved":false,"context_lines":[{"line_number":40,"context_line":"               help\u003d\u0027Use an oslo.messaging pool, which can be an alternative \u0027"},{"line_number":41,"context_line":"               \u0027to multiple topics. \u0027),"},{"line_number":42,"context_line":"    cfg.ListOpt(\u0027additional_priorities\u0027,"},{"line_number":43,"context_line":"                help\u003d\u0027List of additional notification priorities for \u0027"},{"line_number":44,"context_line":"                     \u0027processing. Can be required for some plugins, please \u0027"},{"line_number":45,"context_line":"                     \u0027read plugin documentation. Possible values are \"audit\", \u0027"},{"line_number":46,"context_line":"                     \u0027\"debug\", \"warn\", \"error\", \"critical\", \"sample\".\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_9dad6a9d","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":40},"updated":"2016-10-03 15:14:31.000000000","message":"There\u0027s a parameter \u0027choices\u0027 htat can be used to validate options which will remove the need to do it yourself in _validate_and_set_dispatchers","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d36c42e88c9892f3655fdde5a501a7ff0fe75581","unresolved":false,"context_lines":[{"line_number":40,"context_line":"               help\u003d\u0027Use an oslo.messaging pool, which can be an alternative \u0027"},{"line_number":41,"context_line":"               \u0027to multiple topics. \u0027),"},{"line_number":42,"context_line":"    cfg.ListOpt(\u0027additional_priorities\u0027,"},{"line_number":43,"context_line":"                help\u003d\u0027List of additional notification priorities for \u0027"},{"line_number":44,"context_line":"                     \u0027processing. Can be required for some plugins, please \u0027"},{"line_number":45,"context_line":"                     \u0027read plugin documentation. Possible values are \"audit\", \u0027"},{"line_number":46,"context_line":"                     \u0027\"debug\", \"warn\", \"error\", \"critical\", \"sample\".\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_4bacd135","line":43,"range":{"start_line":43,"start_character":30,"end_line":43,"end_character":40},"in_reply_to":"3a98d1f4_9dad6a9d","updated":"2016-10-04 14:32:01.000000000","message":"There is no \u0027choices\u0027 parameter for ListOpt.","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"9e2f43f0e0582ca6015d50d773df62a5f00a9754","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            self._log_finished(log_context)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @classmethod"},{"line_number":126,"context_line":"    def _validate_and_set_dispatchers(cls):"},{"line_number":127,"context_line":"        valid_values \u003d set(PRIORITIES)"},{"line_number":128,"context_line":"        if CONF.listener.additional_priorities is not None:"},{"line_number":129,"context_line":"            priorities \u003d {p.lower() for p in"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_3dbd36d8","line":126,"range":{"start_line":126,"start_character":8,"end_line":126,"end_character":37},"updated":"2016-10-03 15:14:31.000000000","message":"See comment on the option definition, and on L151; i don\u0027t think this is necessary","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"9e2f43f0e0582ca6015d50d773df62a5f00a9754","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                          CONF.listener.additional_priorities}"},{"line_number":131,"context_line":"            unknown \u003d priorities - valid_values"},{"line_number":132,"context_line":"            if unknown:"},{"line_number":133,"context_line":"                LOG.error(_LE(\u0027Ignoring invalid notifications priorities: %s\u0027),"},{"line_number":134,"context_line":"                          \u0027, \u0027.join(unknown))"},{"line_number":135,"context_line":"                priorities -\u003d unknown"},{"line_number":136,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_dd94528c","line":133,"range":{"start_line":133,"start_character":29,"end_line":133,"end_character":31},"updated":"2016-10-03 15:14:31.000000000","message":"Agree this should exit out; it would potentially cause data loss to ignore it (if I misspell \"reror\")","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d36c42e88c9892f3655fdde5a501a7ff0fe75581","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                          CONF.listener.additional_priorities}"},{"line_number":131,"context_line":"            unknown \u003d priorities - valid_values"},{"line_number":132,"context_line":"            if unknown:"},{"line_number":133,"context_line":"                LOG.error(_LE(\u0027Ignoring invalid notifications priorities: %s\u0027),"},{"line_number":134,"context_line":"                          \u0027, \u0027.join(unknown))"},{"line_number":135,"context_line":"                priorities -\u003d unknown"},{"line_number":136,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_cb3461fd","line":133,"range":{"start_line":133,"start_character":29,"end_line":133,"end_character":31},"in_reply_to":"3a98d1f4_dd94528c","updated":"2016-10-04 14:32:01.000000000","message":"Agree.","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":10063,"name":"Steve McLellan","email":"steven.j.mclellan@gmail.com","username":"sjmc7"},"change_message_id":"9e2f43f0e0582ca6015d50d773df62a5f00a9754","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            _dispatcher.__name__ \u003d priority_name"},{"line_number":149,"context_line":"            return _dispatcher"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for priority in priorities:"},{"line_number":152,"context_line":"            setattr(cls, priority, _make_dispatcher(priority))"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a98d1f4_3d2ff63f","line":151,"range":{"start_line":151,"start_character":24,"end_line":151,"end_character":34},"updated":"2016-10-03 15:14:31.000000000","message":"I don\u0027t see a reason not to define these statically, even if they happen not to be used by a given plugin. The only benefit doing it dynamically is saving a small amount of memory with functions that will rarely or never be called.","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d36c42e88c9892f3655fdde5a501a7ff0fe75581","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            _dispatcher.__name__ \u003d priority_name"},{"line_number":149,"context_line":"            return _dispatcher"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        for priority in priorities:"},{"line_number":152,"context_line":"            setattr(cls, priority, _make_dispatcher(priority))"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a95cdbc_c12fe6f4","line":151,"range":{"start_line":151,"start_character":24,"end_line":151,"end_character":34},"in_reply_to":"3a98d1f4_3d2ff63f","updated":"2016-10-04 14:32:01.000000000","message":"This is an easy way to enable/disable some levels on Searchlight side. Because currently only ironic can use different levels, first implementation adds global option. There is a high probability in ironic now that we reduce levels set to INFO and ERROR. Maybe add static handlers for these levels at first time, what you think?","commit_id":"59ed9c9182c22a298a684acd6f240f815942f520"}]}
