<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def drag_and_drop(self, source_selector, destination_selector, **kwargs):
 """Drag and drop Args: source_selector: (str) destination_selector: (str) Kwargs: use_javascript_dnd: bool; default: config proxy_driver:use_javascript_dnd """

        self.info_log(
            "Drag and drop: source (%s); destination (%s)" %
            (source_selector, destination_selector)
        )

        use_javascript_dnd = kwargs.get(
            "use_javascript_dnd",
            "proxy_driver:use_javascript_dnd"
        )

        source_el = self.find(source_selector)
        destination_el = self.find(destination_selector)

        if use_javascript_dnd:
            try:
                dnd_script = [
                    "function simulate(f,c,d,e){var b,a=null;for(b in eventMatchers)if(eventMatchers[b].test(c)){a=b;break}if(!a)return!1;document.createEvent?(b=document.createEvent(a),a=='HTMLEvents'?b.initEvent(c,!0,!0):b.initMouseEvent(c,!0,!0,document.defaultView,0,d,e,d,e,!1,!1,!1,!1,0,null),f.dispatchEvent(b)):(a=document.createEventObject(),a.detail=0,a.screenX=d,a.screenY=e,a.clientX=d,a.clientY=e,a.ctrlKey=!1,a.altKey=!1,a.shiftKey=!1,a.metaKey=!1,a.button=1,f.fireEvent('on'+c,a));return!0} var eventMatchers={HTMLEvents:/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,MouseEvents:/^(?:click|dblclick|mouse(?:down|up|over|move|out))$/};",  # noqa
                    "var source = arguments[0],destination = arguments[1];",
                    "simulate(source, 'mousedown', 0, 0);",
                    "simulate(source, 'mousemove', destination.offsetLeft, destination.offsetTop);",  # noqa
                    "simulate(source, 'mouseup', destination.offsetLeft, destination.offsetTop);"  # noqa
                ]
                self._driver.execute_script(
                    '\n'.join(dnd_script),
                    source_el._element,
                    destination_el._element
                )

            except Exception as e:
                self.error_log(u'drag_and_drop exception: %s' % str(e))
                raise
        else:
            try:
                ActionChains(self._driver).drag_and_drop(
                    source_el,
                    destination_el
                ).perform()
            except Exception as e:
                self.error_log(u'drag_and_drop exception: %s' % str(e))
                raise