package org.eclipse.jubula.examples.api.hanoi.javafx;


import org.eclipse.jubula.client.MakeR;
import org.eclipse.jubula.toolkit.javafx.components.Button;
import org.eclipse.jubula.toolkit.javafx.components.ImageView;
import org.eclipse.jubula.tools.ComponentIdentifier;

/** 
 * Exported Object Mapping 
 * @Generated
 */
public class OM {
    /** The component identifier for "ResetButton"*/
    public static final ComponentIdentifier<Button> ResetButton = MakeR.createCI("rO0ABXNyAD1vcmcuZWNsaXBzZS5qdWJ1bGEudG9vbHMuaW50ZXJuYWwub2JqZWN0cy5Db21wb25lbnRJZGVudGlmaWVyAAAAAAAABAcCAAlaABRtX2VxdWFsT3JpZ2luYWxGb3VuZEQAEW1fbWF0Y2hQZXJjZW50YWdlSQAhbV9udW1iZXJPZk90aGVyTWF0Y2hpbmdDb21wb25lbnRzTAAYbV9hbHRlcm5hdGl2ZURpc3BsYXlOYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAAUbV9jb21wb25lbnRDbGFzc05hbWVxAH4AAUwAFW1fY29tcG9uZW50UHJvcGVydGllc3QAD0xqYXZhL3V0aWwvTWFwO0wAEG1faGllcmFyY2h5TmFtZXN0ABBMamF2YS91dGlsL0xpc3Q7TAAMbV9uZWlnaGJvdXJzcQB+AANMABRtX3N1cHBvcnRlZENsYXNzTmFtZXEAfgABeHAAv/AAAAAAAAD/////cHQAG2phdmFmeC5zY2VuZS5jb250cm9sLkJ1dHRvbnBzcgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAABHcEAAAABHQAFGphdmFmeC5zdGFnZS5TdGFnZV8xdAAUamF2YWZ4LnNjZW5lLlNjZW5lXzF0ABpqYXZhZnguc2NlbmUubGF5b3V0LlZCb3hfMXQAHWphdmFmeC5zY2VuZS5jb250cm9sLkJ1dHRvbl8xeHNxAH4ABgAAAAF3BAAAAAF0ABpqYXZhZnguc2NlbmUubGF5b3V0LkhCb3hfMXhxAH4ABQ=="); //$NON-NLS-1$
    /** The component identifier for "Area1"*/
    public static final ComponentIdentifier<ImageView> Area1 = MakeR.createCI("rO0ABXNyAD1vcmcuZWNsaXBzZS5qdWJ1bGEudG9vbHMuaW50ZXJuYWwub2JqZWN0cy5Db21wb25lbnRJZGVudGlmaWVyAAAAAAAABAcCAAlaABRtX2VxdWFsT3JpZ2luYWxGb3VuZEQAEW1fbWF0Y2hQZXJjZW50YWdlSQAhbV9udW1iZXJPZk90aGVyTWF0Y2hpbmdDb21wb25lbnRzTAAYbV9hbHRlcm5hdGl2ZURpc3BsYXlOYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAAUbV9jb21wb25lbnRDbGFzc05hbWVxAH4AAUwAFW1fY29tcG9uZW50UHJvcGVydGllc3QAD0xqYXZhL3V0aWwvTWFwO0wAEG1faGllcmFyY2h5TmFtZXN0ABBMamF2YS91dGlsL0xpc3Q7TAAMbV9uZWlnaGJvdXJzcQB+AANMABRtX3N1cHBvcnRlZENsYXNzTmFtZXEAfgABeHAAv/AAAAAAAAD/////cHQAHGphdmFmeC5zY2VuZS5pbWFnZS5JbWFnZVZpZXdwc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAZ3BAAAAAZ0ABRqYXZhZnguc3RhZ2UuU3RhZ2VfMXQAFGphdmFmeC5zY2VuZS5TY2VuZV8xdAAaamF2YWZ4LnNjZW5lLmxheW91dC5WQm94XzF0ABpqYXZhZnguc2NlbmUubGF5b3V0LkhCb3hfMXQAH2phdmFmeC5zY2VuZS5sYXlvdXQuU3RhY2tQYW5lXzF0AB5qYXZhZnguc2NlbmUuaW1hZ2UuSW1hZ2VWaWV3XzF4c3EAfgAGAAAAAXcEAAAAAXEAfgAKeHEAfgAF"); //$NON-NLS-1$
    /** The component identifier for "Area2"*/
    public static final ComponentIdentifier<ImageView> Area2 = MakeR.createCI("rO0ABXNyAD1vcmcuZWNsaXBzZS5qdWJ1bGEudG9vbHMuaW50ZXJuYWwub2JqZWN0cy5Db21wb25lbnRJZGVudGlmaWVyAAAAAAAABAcCAAlaABRtX2VxdWFsT3JpZ2luYWxGb3VuZEQAEW1fbWF0Y2hQZXJjZW50YWdlSQAhbV9udW1iZXJPZk90aGVyTWF0Y2hpbmdDb21wb25lbnRzTAAYbV9hbHRlcm5hdGl2ZURpc3BsYXlOYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAAUbV9jb21wb25lbnRDbGFzc05hbWVxAH4AAUwAFW1fY29tcG9uZW50UHJvcGVydGllc3QAD0xqYXZhL3V0aWwvTWFwO0wAEG1faGllcmFyY2h5TmFtZXN0ABBMamF2YS91dGlsL0xpc3Q7TAAMbV9uZWlnaGJvdXJzcQB+AANMABRtX3N1cHBvcnRlZENsYXNzTmFtZXEAfgABeHAAv/AAAAAAAAD/////cHQAHGphdmFmeC5zY2VuZS5pbWFnZS5JbWFnZVZpZXdwc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAZ3BAAAAAZ0ABRqYXZhZnguc3RhZ2UuU3RhZ2VfMXQAFGphdmFmeC5zY2VuZS5TY2VuZV8xdAAaamF2YWZ4LnNjZW5lLmxheW91dC5WQm94XzF0ABpqYXZhZnguc2NlbmUubGF5b3V0LkhCb3hfMXQAH2phdmFmeC5zY2VuZS5sYXlvdXQuU3RhY2tQYW5lXzJ0AB5qYXZhZnguc2NlbmUuaW1hZ2UuSW1hZ2VWaWV3XzF4c3EAfgAGAAAAAXcEAAAAAXEAfgAKeHEAfgAF"); //$NON-NLS-1$
    /** The component identifier for "Area3"*/
    public static final ComponentIdentifier<ImageView> Area3 = MakeR.createCI("rO0ABXNyAD1vcmcuZWNsaXBzZS5qdWJ1bGEudG9vbHMuaW50ZXJuYWwub2JqZWN0cy5Db21wb25lbnRJZGVudGlmaWVyAAAAAAAABAcCAAlaABRtX2VxdWFsT3JpZ2luYWxGb3VuZEQAEW1fbWF0Y2hQZXJjZW50YWdlSQAhbV9udW1iZXJPZk90aGVyTWF0Y2hpbmdDb21wb25lbnRzTAAYbV9hbHRlcm5hdGl2ZURpc3BsYXlOYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAAUbV9jb21wb25lbnRDbGFzc05hbWVxAH4AAUwAFW1fY29tcG9uZW50UHJvcGVydGllc3QAD0xqYXZhL3V0aWwvTWFwO0wAEG1faGllcmFyY2h5TmFtZXN0ABBMamF2YS91dGlsL0xpc3Q7TAAMbV9uZWlnaGJvdXJzcQB+AANMABRtX3N1cHBvcnRlZENsYXNzTmFtZXEAfgABeHAAv/AAAAAAAAD/////cHQAHGphdmFmeC5zY2VuZS5pbWFnZS5JbWFnZVZpZXdwc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAZ3BAAAAAZ0ABRqYXZhZnguc3RhZ2UuU3RhZ2VfMXQAFGphdmFmeC5zY2VuZS5TY2VuZV8xdAAaamF2YWZ4LnNjZW5lLmxheW91dC5WQm94XzF0ABpqYXZhZnguc2NlbmUubGF5b3V0LkhCb3hfMXQAH2phdmFmeC5zY2VuZS5sYXlvdXQuU3RhY2tQYW5lXzN0AB5qYXZhZnguc2NlbmUuaW1hZ2UuSW1hZ2VWaWV3XzF4c3EAfgAGAAAAAXcEAAAAAXEAfgAKeHEAfgAF"); //$NON-NLS-1$
    
    /** Constructor */
    private OM() {
        // private
    }
}
